diff --git a/.gitignore b/.gitignore index d4cb9f30..f266fe95 100755 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,6 @@ devops/nginx/fastapp/dist devops/nginx/fastdocs/dist devops/nginx/frontend/dist devops/nginx/ssl +fastapp/components.d.ts +frontend/src/types/auto-imports.d.ts +frontend/src/types/components.d.ts diff --git a/backend/README.md b/backend/README.md index 4660cea8..b4a88694 100644 --- a/backend/README.md +++ b/backend/README.md @@ -1,105 +1,396 @@ -# backend +# FastAPI Vue3 Admin - Backend -## 项目结构 +一个基于 FastAPI 的现代化后端管理系统,为前端 Vue3 管理系统提供完整的 API 服务支持。 -```sh -fastapi_project/backend -├─ app # 项目核心代码 -│ ├─ almbic # 数据库迁移文件 -│ ├─ api # 接口模块 -│ │ └─ v1 # 接口版本模块 -│ │ ├─ controllers # 控制器模块 -│ │ ├─ crud # 数据库操作模块 -│ │ ├─ models # orm模型模块 -│ │ ├─ params # 参数模块 -│ │ ├─ schemas # pydantic模型模块 -│ │ ├─ services # 业务模块 -│ │ └─ urls # 路由模块 -│ ├─ common # 公共模块 -│ ├─ config # 项目配置文件 -│ ├─ core # 项目核心模块 -│ ├─ module_task # 项目任务模块 -│ ├─ plugin # 项目插件模块 -│ ├─ scripts # 项目初始化模块 -│ └─ utils # 工具模块 -├─ env # 项目环境配置文件 -├─ logs # 项目日志文件 -├─ sql # 项目数据库文件 -├─ static # 项目静态文件 -├─ main.py # 项目启动文件 -├─ alembic.ini # alembic配置文件 -├─ requirements.txt # 项目依赖文件 -├─ mkdocs.yml # mkdocs配置文件 -├─ dev_sql.db # 项目数据库文件 -└─ README.md # 项目说明文档 +## 🚀 项目特性 +- **现代技术栈**: FastAPI + SQLAlchemy 2.0 + Pydantic 2.x +- **多数据库支持**: MySQL、PostgreSQL、SQLite +- **异步架构**: 支持高并发异步数据库操作 +- **权限管理**: 完整的 RBAC 权限控制体系 +- **任务调度**: 基于 APScheduler 的定时任务系统 +- **日志监控**: 完整的操作日志和系统监控 +- **代码生成**: 智能化代码生成工具 +- **AI 集成**: 支持 OpenAI 大模型调用 +- **云存储**: 支持阿里云 OSS 对象存储 + +## 🏗️ 系统架构 + +### 技术栈 + +| 技术 | 版本 | 说明 | +|------|------|------| +| FastAPI | 0.115.2 | 现代 Web 框架 | +| SQLAlchemy | 2.0.36 | ORM 框架 | +| Alembic | 1.15.1 | 数据库迁移工具 | +| Pydantic | 2.x | 数据验证与序列化 | +| APScheduler | 3.11.0 | 定时任务调度 | +| Redis | 5.2.1 | 缓存与会话存储 | +| Uvicorn | 0.30.6 | ASGI 服务器 | +| Python | 3.10+ | 运行环境 | + +### 架构设计 + +```txt +📦 分层架构 (MVC) +├── 🎯 Controller # 控制器层 - 处理HTTP请求 +├── 🏢 Service # 业务层 - 核心业务逻辑 +├── 💾 CRUD # 数据访问层 - 数据库操作 +└── 📊 Model # 模型层 - 数据模型定义 ``` -## 快速开始 +## 📁 项目结构 + +```txt +fastapi_vue3_admin/backend/ +├── 📁 app/ # 项目核心代码 +│ ├── 💾 alembic/ # 数据库迁移管理 +│ ├── 🌐 api/ # API 接口模块 +│ │ └── v1/ # API v1 版本 +│ │ ├── module_system/ # 系统管理模块 +│ │ ├── module_monitor/ # 系统监控模块 +│ │ ├── module_ai/ # AI 功能模块 +│ │ └── module_*/ # 其他业务模块 +│ ├── 📄 common/ # 公共组件(常量、枚举、响应封装) +│ ├── ⚙️ config/ # 项目配置文件 +│ ├── 💖 core/ # 核心模块(数据库、中间件、安全) +│ ├── ⏰ module_task/ # 定时任务模块 +│ ├── 🔌 plugin/ # 插件模块 +│ ├── 📜 scripts/ # 初始化脚本和数据 +│ └── 🛠️ utils/ # 工具类(验证码、文件上传等) +├── 🌍 env/ # 环境配置文件 +├── 📄 logs/ # 日志输出目录 +├── 📊 sql/ # SQL 初始化脚本 +├── 📷 static/ # 静态资源文件 +├── 🚀 main.py # 项目启动入口 +├── 📄 alembic.ini # Alembic 迁移配置 +├── 📎 requirements.txt # Python 依赖包 +└── 📝 README.md # 项目说明文档 +``` + +### 模块设计 + +每个业务模块采用统一的分层结构: + +```txt +module_*/ +├── controller.py # 控制器 - HTTP 请求处理 +├── service.py # 服务层 - 业务逻辑处理 +├── crud.py # 数据层 - 数据库操作 +├── model.py # ORM 模型 - 数据库表定义 +├── schema.py # Pydantic 模型 - 数据验证 +└── param.py # 参数模型 - 请求参数 +``` + +## 🚀 快速开始 + +### 环境要求 + +- **Python**: 3.10+ +- **数据库**: MySQL 8.0+ / PostgreSQL 13+ / SQLite 3.x +- **Redis**: 6.0+ (可选) + +### 安装与运行 + +#### 1. 项目初始化 + +```bash +# 克隆项目 +git clone +cd fastapi_vue3_admin/backend + +# 创建虚拟环境(推荐) +python3 -m venv venv +source venv/bin/activate # Windows: venv\Scripts\activate -```sh -# 进入后端工程目录 -cd backend # 安装依赖 pip3 install -r requirements.txt -# 启动后端服务 -python3 main.py run -或 -python3 main.py run--env=dev -# 生成迁移文件 -python3 main.py revision "初始化迁移" --env=dev(不加默认为dev) -# 应用迁移 -python3 main.py upgrade --env=dev(不加默认为dev) ``` -## Markdown转静态网站(mkdocs-material使用)介绍 +#### 2. 环境配置 -- 名称:mkdocs-material -- 官网: -- 完整文档信息清访问 [mkdocs官网](https://www.mkdocs.org). +复制并编辑环境配置文件: -## 工具安装 - -```sh -pip install mkdocs-material +```bash +cp env/dev.env.example env/dev.env +# 编辑 env/dev.env 文件,配置数据库连接和其他参数 ``` -## 工具使用 +主要配置项: -### 创建项目 +- `DATABASE_URL`: 数据库连接地址 +- `SECRET_KEY`: JWT 加密密钥 +- `REDIS_URL`: Redis 连接地址(可选) -```sh -mkdocs new 项目名称 +#### 3. 数据库初始化 + +```bash +# 生成迁移文件(仅首次或模型变更时) +python3 main.py revision "初始化迁移" --env=dev + +# 应用数据库迁移 +python3 main.py upgrade --env=dev + +# 初始化数据(可选,系统会自动初始化) +python3 main.py init-data --env=dev ``` -### 编辑构建文档 +#### 4. 启动服务 -```yaml -theme: - name: material +```bash +# 开发环境启动 +python3 main.py run --env=dev + +# 生产环境启动 +python3 main.py run --env=prod + +# 或使用 uvicorn 直接启动 +uvicorn main:app --host 0.0.0.0 --port 8000 --reload ``` -### 启动服务 +服务成功启动后,您可以访问: -```sh -mkdocs serve +- **API 文档**: [http://localhost:8000/docs](http://localhost:8000/docs) (Swagger UI) +- **替代文档**: [http://localhost:8000/redoc](http://localhost:8000/redoc) (ReDoc) +- **健康检查**: [http://localhost:8000/health](http://localhost:8000/health) + +## 📚 API 文档 + +### 主要接口模块 + +| 模块 | 路径 | 说明 | +|------|------|------| +| 用户管理 | `/api/v1/system/user` | 用户增删改查、角色分配 | +| 角色管理 | `/api/v1/system/role` | 角色管理、权限分配 | +| 菜单管理 | `/api/v1/system/menu` | 系统菜单、权限节点 | +| 部门管理 | `/api/v1/system/dept` | 组织架构管理 | +| 岗位管理 | `/api/v1/system/position` | 岗位信息管理 | +| 系统监控 | `/api/v1/monitor/*` | 系统性能、日志监控 | +| 任务调度 | `/api/v1/monitor/job` | 定时任务管理 | +| 文件管理 | `/api/v1/common/file` | 文件上传下载 | +| 代码生成 | `/api/v1/generator/*` | 代码生成工具 | + +### 认证授权 + +系统使用 JWT Bearer Token 进行身份验证: + +```bash +# 登录获取 Token +curl -X POST "http://localhost:8000/api/v1/auth/login" \ + -H "Content-Type: application/json" \ + -d '{"username": "admin", "password": "123456"}' + +# 使用 Token 访问受保护的资源 +curl -X GET "http://localhost:8000/api/v1/system/user/list" \ + -H "Authorization: Bearer YOUR_TOKEN_HERE" ``` -### 构建静态站点 +## 🛠️ 开发指南 -```sh -mkdocs build +### 项目配置 + +主要配置文件位于 `app/config/setting.py`,支持通过环境变量进行覆盖。 + +### 数据库迁移 + +```bash +# 查看当前迁移状态 +python3 main.py current --env=dev + +# 查看迁移历史 +python3 main.py history --env=dev + +# 回滚到上一个版本 +python3 main.py downgrade -1 --env=dev ``` -### 获取帮助 +### 添加新模块 -```sh -mkdocs -h +1. 在 `app/api/v1/` 下创建新的模块目录 +2. 按照现有模块结构创建文件: + - `model.py` - SQLAlchemy ORM 模型 + - `schema.py` - Pydantic 数据模型 + - `crud.py` - 数据库操作层 + - `service.py` - 业务逻辑层 + - `controller.py` - API 控制器 + - `param.py` - 请求参数模型 +3. 在主路由中注册新模块 + +### 测试 + +```bash +# 运行单元测试 +pytest tests/ + +# 运行指定测试文件 +pytest tests/test_user.py -v + +# 生成测试覆盖率报告 +pytest --cov=app tests/ ``` -### 生成所有依赖 +## 📊 监控与日志 -```sh -pip freeze > requirements.txt +### 日志级别 + +- **DEBUG**: 详细的调试信息 +- **INFO**: 一般信息(默认级别) +- **WARNING**: 警告信息 +- **ERROR**: 错误信息 +- **CRITICAL**: 严重错误 + +### 性能监控 + +系统内置了完整的性能监控功能: + +- API 响应时间监控 +- 数据库连接池监控 +- 内存与 CPU 使用率监控 +- 自定义业务指标监控 + +## 🚀 部署指南 + +### Docker 部署 + +```bash +# 构建镜像 +docker build -t fastapi-admin . + +# 运行容器 +docker run -d \ + --name fastapi-admin \ + -p 8000:8000 \ + -e DATABASE_URL="postgresql://user:pass@host:5432/db" \ + fastapi-admin ``` +### 传统部署 + +```bash +# 使用 Gunicorn 作为 WSGI 服务器 +gunicorn main:app \ + --workers 4 \ + --worker-class uvicorn.workers.UvicornWorker \ + --bind 0.0.0.0:8000 \ + --access-logfile - \ + --error-logfile - +``` + +### Nginx 配置 + +```nginx +server { + listen 80; + server_name your-domain.com; + + location / { + proxy_pass http://127.0.0.1:8000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +} +``` + +## 🤝 贡献指南 + +欢迎提交 Issue 和 Pull Request! + +### 开发流程 + +1. Fork 项目 +2. 创建特性分支 (`git checkout -b feature/amazing-feature`) +3. 提交更改 (`git commit -m 'Add some amazing feature'`) +4. 推送到分支 (`git push origin feature/amazing-feature`) +5. 发起 Pull Request + +### 代码规范 + +- 遵循 PEP 8 Python 编码规范 +- 使用类型注解 (Type Hints) +- 编写单元测试 +- 添加必要的注释和文档 + +## 📝 更新日志 + +### v1.0.0 (2024-09-06) + +- ✨ 初始版本发布 +- ✨ 完整的用户权限管理系统 +- ✨ 支持多数据库类型 +- ✨ 定时任务调度功能 +- ✨ 代码生成工具 +- ✨ AI 集成功能 + +## 📜 相关链接 + +- **FastAPI 官方文档**: [https://fastapi.tiangolo.com/](https://fastapi.tiangolo.com/) +- **SQLAlchemy 文档**: [https://docs.sqlalchemy.org/](https://docs.sqlalchemy.org/) +- **Pydantic 文档**: [https://pydantic-docs.helpmanual.io/](https://pydantic-docs.helpmanual.io/) + +## 💬 支持与反馈 + +如果您在使用过程中遇到问题或有任何建议,请通过以下方式联系我们: + +- 🐛 **Bug 报告**: 请在 GitHub Issues 中提交 +- 💡 **功能建议**: 请在 GitHub Discussions 中讨论 +- 💬 **技术交流**: 欢迎参与项目讨论 + +--- + +❤️ **感谢您的关注和支持!** 如果这个项目对您有帮助,请给我们一个 ⭐️ Star! + + +# MCP 模块 + +## 概述 + +MCP (Model Context Protocol) 模块为系统提供与AI模型交互的能力,基于FastAPI-MCP实现。 + +## 功能特性 + +- 智能对话接口 +- 流式和非流式响应支持 +- WebSocket聊天支持 +- MCP服务器状态监控 + +## API接口 + +### 智能对话 + +``` +POST /api/v1/mcp/chat +``` + +请求参数: +- `message` (string, required): 聊天消息 +- `stream` (boolean, optional): 是否流式返回,默认为false + +### 获取服务器状态 + +``` +GET /api/v1/mcp/status +``` + +### WebSocket聊天 + +``` +GET /api/v1/mcp/ws/chat +``` + +## MCP集成 + +系统已集成FastAPI-MCP,可通过以下URL访问MCP服务器: + +``` +http://localhost:8000/mcp +``` + +## 配置 + +在系统配置中设置以下参数: + +- `QWEN_API_KEY`: Qwen API密钥 +- `QWEN_BASE_URL`: Qwen API基础URL +- `QWEN_MODEL`: Qwen模型名称 \ No newline at end of file diff --git a/backend/app/api/v1/__init__.py b/backend/app/api/v1/__init__.py index 5c297f6c..3ba9f25e 100644 --- a/backend/app/api/v1/__init__.py +++ b/backend/app/api/v1/__init__.py @@ -26,6 +26,8 @@ from .module_example.demo.controller import DemoRouter from .module_application.myapp.controller import MyAppRouter +from .module_ai.mcp.controller import MCPRouter + from .module_resource.resource.controller import ResourceRouter @@ -58,6 +60,8 @@ EXAMPLE_MODULES = [{"router": DemoRouter}] APPLICATION_MODULES = [{"router": MyAppRouter}] +AI_MODULES = [{"router": MCPRouter}] + router = APIRouter() for module in SYSTEM_MODULES: @@ -88,4 +92,9 @@ for module in APPLICATION_MODULES: for module in RESOURCE_MODULES: router.include_router( router=module["router"], prefix="/resource" + ) + +for module in AI_MODULES: + router.include_router( + router=module["router"], prefix="/ai" ) \ No newline at end of file diff --git a/backend/app/api/v1/module_ai/__init__.py b/backend/app/api/v1/module_ai/__init__.py index e69de29b..f35e66c2 100644 --- a/backend/app/api/v1/module_ai/__init__.py +++ b/backend/app/api/v1/module_ai/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +""" +AI模块初始化文件 +""" diff --git a/backend/app/api/v1/module_ai/mcp/__init__.py b/backend/app/api/v1/module_ai/mcp/__init__.py new file mode 100644 index 00000000..772e858a --- /dev/null +++ b/backend/app/api/v1/module_ai/mcp/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +""" +AI模块初始化文件 +""" + +from .controller import MCPRouter \ No newline at end of file diff --git a/backend/app/api/v1/module_ai/mcp/controller.py b/backend/app/api/v1/module_ai/mcp/controller.py new file mode 100644 index 00000000..7116744a --- /dev/null +++ b/backend/app/api/v1/module_ai/mcp/controller.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- + +from fastapi import APIRouter, Depends, WebSocket +from fastapi.responses import JSONResponse, StreamingResponse + +from app.common.response import StreamResponse, SuccessResponse +from app.core.dependencies import AuthPermission +from app.core.router_class import OperationLogRoute +from app.core.logger import logger +from app.api.v1.module_system.auth.schema import AuthSchema +from .service import MCPService +from .schema import ChatQuerySchema + + +MCPRouter = APIRouter(route_class=OperationLogRoute, prefix="/mcp", tags=["MCP智能助手"]) + + +@MCPRouter.post("/chat", summary="智能对话", description="与MCP智能助手进行对话") +async def chat_controller( + query: ChatQuerySchema, + auth: AuthSchema = Depends(AuthPermission(permissions=["ai:mcp:chat"])) +) -> StreamingResponse: + """智能对话接口""" + logger.info(f"用户 {auth.user.name} 发起智能对话: {query.message[:50]}...") + + async def generate_response(): + async for chunk in MCPService.chat_query(query.message): + yield chunk + + return StreamingResponse(generate_response(), media_type="text/plain") + + +@MCPRouter.websocket("/ws/chat", name="WebSocket聊天") +async def websocket_chat_controller( + websocket: WebSocket, +): + """WebSocket聊天接口 + + ws://127.0.0.1:8001/api/v1/ai/mcp/ws/chat + """ + await websocket.accept() + try: + while True: + data = await websocket.receive_text() + # 流式发送响应 + async for chunk in MCPService.chat_query(data): + await websocket.send_text(chunk) + except Exception as e: + logger.error(f"WebSocket聊天出错: {str(e)}") + await websocket.close() diff --git a/backend/app/api/v1/module_ai/mcp/schema.py b/backend/app/api/v1/module_ai/mcp/schema.py new file mode 100644 index 00000000..4e7627b5 --- /dev/null +++ b/backend/app/api/v1/module_ai/mcp/schema.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- + +from pydantic import BaseModel, Field +from typing import Optional + + +class ChatQuerySchema(BaseModel): + """聊天查询模型""" + message: str = Field(..., min_length=1, max_length=4000, description="聊天消息") \ No newline at end of file diff --git a/backend/app/api/v1/module_ai/mcp/service.py b/backend/app/api/v1/module_ai/mcp/service.py new file mode 100644 index 00000000..b5db23ee --- /dev/null +++ b/backend/app/api/v1/module_ai/mcp/service.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- + +from app.utils.ai_util import AIClient + + +class MCPService: + """MCP服务层 - 适配FastAPI-MCP""" + + @classmethod + async def chat_query(cls, message: str): + """处理聊天查询""" + # 创建MCP客户端实例 + mcp_client = AIClient() + # 处理消息 + async for response in mcp_client.process(message): + yield response \ No newline at end of file diff --git a/backend/app/api/v1/module_ai/mcp_server/ai_websocket.py b/backend/app/api/v1/module_ai/mcp_server/ai_websocket.py deleted file mode 100644 index f12446dc..00000000 --- a/backend/app/api/v1/module_ai/mcp_server/ai_websocket.py +++ /dev/null @@ -1,37 +0,0 @@ -from fastapi import FastAPI -from starlette.websockets import WebSocket, WebSocketDisconnect - -from mcp_server.mcp_client import MCPClient - - -async def init_ai_websocket(app: FastAPI): - - @app.websocket("/ws/chat") - async def websocket_endpoint(websocket: WebSocket): - await websocket.accept() - user_id = id(websocket) - user_contexts = {} - user_contexts[user_id] = [{"role": "system", "content": "你是一个有帮助的助手。"}] - - client = MCPClient() - await client.connect_to_server('mcp_server/mcp_server.py') - try: - while True: - user_msg = await websocket.receive_text() - user_contexts[user_id].append({"role": "user", "content": user_msg}) - await websocket.send_json({"role": "user", "content": user_msg}) - - assistant_reply = "" - response = client.put_query(user_msg) - await websocket.send_json({"start": True}) - async for content_piece in response: - assistant_reply += content_piece - await websocket.send_json({"role": "assistant", "content": content_piece}) - - await websocket.send_json({"done": True}) - - except WebSocketDisconnect: - print("WebSocket 断开连接") - # 清理上下文 - user_contexts.pop(user_id, None) - await client.cleanup() \ No newline at end of file diff --git a/backend/app/api/v1/module_ai/mcp_server/mcp_client.py b/backend/app/api/v1/module_ai/mcp_server/mcp_client.py deleted file mode 100644 index 930dcda8..00000000 --- a/backend/app/api/v1/module_ai/mcp_server/mcp_client.py +++ /dev/null @@ -1,215 +0,0 @@ -import argparse -import asyncio -import os -import json -from typing import Optional -from contextlib import AsyncExitStack - -from click import argument -from openai import AsyncOpenAI -from dotenv import load_dotenv -from mcp import ClientSession, StdioServerParameters -from mcp.client.stdio import stdio_client - - - - -class MCPClient: - def __init__(self): - """初始化 MCP 客户端""" - self.exit_stack = AsyncExitStack() - self.openai_api_key = os.getenv("OPENAI_API_KEY") # 读取 OpenAI API Key - self.base_url = os.getenv("OPENAI_API_URL") # 读取 BASE YRL - self.model = os.getenv("OPENAI_API_MODEL") # 读取 model - if not self.openai_api_key: - raise ValueError("❌ 未找到 OpenAI API Key,请在 .env 文件中设置 OPENAI_API_KEY") - self.client = AsyncOpenAI(api_key=self.openai_api_key, base_url=self.base_url) # 创建OpenAI client - self.session: Optional[ClientSession] = None - self.exit_stack = AsyncExitStack() - self.messages = [] - - async def connect_to_server(self, server_script_path: str): - """连接到 MCP 服务器并列出可用工具""" - is_python = server_script_path.endswith('.py') - is_js = server_script_path.endswith('.js') - if not (is_python or is_js): - raise ValueError("服务器脚本必须是 .py 或 .js 文件") - - # 必须设置项目根目录,否则无法获取到其他引用代码文件 - project_root = os.path.abspath(os.getcwd()) - python_cmd_path = os.getenv("PYTHON_PATH") - command = python_cmd_path if is_python else "node" - - parser = argparse.ArgumentParser(description='命令行参数') - parser.add_argument('--env', type=str, default='', help='运行环境') - args, unknown = parser.parse_known_args() - - server_params = StdioServerParameters( - command=command, - args=[server_script_path, f'--env={args.env}'], - env={"PYTHONPATH": project_root} - ) - - # 启动 MCP 服务器并建立通信 - stdio_transport = await self.exit_stack.enter_async_context(stdio_client(server_params)) - self.stdio, self.write = stdio_transport - self.session = await self.exit_stack.enter_async_context(ClientSession(self.stdio, self.write)) - - await self.session.initialize() - - # 列出 MCP 服务器上的工具 - response = await self.session.list_tools() - tools = response.tools - print("\n已连接到服务器,支持以下工具:", [tool.name for tool in tools]) - - - - async def process_query(self, query: str): - """ - 使用大模型处理查询并调用可用的 MCP 工具 (Function Calling) - """ - self.messages.append({"role": "user", "content": query}) - - response = await self.session.list_tools() - - available_tools = [{ - "type": "function", - "function": { - "name": tool.name, - "description": tool.description, - "input_schema": tool.inputSchema - } - } for tool in response.tools] - # print(available_tools) - - response = await self.client.chat.completions.create( - model=self.model, - messages=self.messages, - stream=True, - tools=available_tools - ) - is_tool_call = False - tool_name = None - tool_args = '' - tool_call_id = None - content = '' - yield f'🤖AI:' - async for chunk in response: - print(chunk) - if chunk.choices and chunk.choices[0].delta.tool_calls: - #调用工具 - tool_call = chunk.choices[0].delta.tool_calls[0] - if tool_call.id: - is_tool_call = True - tool_name = tool_call.function.name - tool_call_id = tool_call.id - yield f'开始调用工具【{tool_call.function.name}】,参数为' - if tool_call.function: - tool_args += tool_call.function.arguments - print(f'tool_args==={tool_args}') - yield tool_call.function.arguments - elif tool_call.function: - tool_args += tool_call.function.arguments - print(f'tool_args==={tool_args}') - yield tool_call.function.arguments - elif chunk.choices and chunk.choices[0].delta.content: - # 大模型解答 - content += chunk.choices[0].delta.content - yield chunk.choices[0].delta.content - elif chunk.choices and chunk.choices[0].finish_reason == 'tool_calls': - # 参数处理完毕 - pass - elif chunk.choices and chunk.choices[0].finish_reason == 'stop': - self.messages.append({ - "role": "assistant", - "content": content - }) - pass - # 处理返回的内容 - if is_tool_call: - # 如何是需要使用工具,就解析工具 - # 执行工具 - print(f"\n\n[Calling tool {tool_name} with args {tool_args}]\n\n") - result = await self.session.call_tool(tool_name, json.loads(tool_args)) - print(result) - # 将模型返回的调用哪个工具数据和工具执行完成后的数据都存入messages中 - self.messages.append({ - "role": "assistant", - "content": "", - "index": 0, - "tool_calls": [{ - "id": tool_call_id, - "type": "function", - "function": { - "name": tool_name, - "arguments": tool_args - } - }] - }) - self.messages.append({ - "role": "tool", - "content": result.content[0].text, - "tool_call_id": tool_call_id, - }) - - # 将上面的结果再返回给大模型用于生产最终的结果 - result_response = await self.client.chat.completions.create( - model=self.model, - messages=self.messages, - stream=True, - ) - result_content = '' - async for chunk in result_response: - if chunk.choices and chunk.choices[0].delta.content: - result_content += chunk.choices[0].delta.content - yield chunk.choices[0].delta.content - self.messages.append({ - "role": "assistant", - 'content': result_content, - }) - return - - async def put_query(self, query: str): - print(f"\n🤖 OpenAI: ", end="", flush=True) - response = self.process_query(query) # 发送用户输入到 OpenAI API - async for value in response: - print(value, end="", flush=True) - yield value - - async def chat_loop(self): - """运行交互式聊天循环""" - print("\n🤖 MCP 客户端已启动!输入 'quit' 退出") - - while True: - try: - query = input("\n你: ").strip() - if query.lower() == 'quit': - break - - - print(f"\n🤖 OpenAI: ", end="", flush=True) - response = self.process_query(query) # 发送用户输入到 OpenAI API - async for value in response: - print(value, end="", flush=True) - - except Exception as e: - print(f"\n⚠️ 发生错误: {str(e)}") - - async def cleanup(self): - """清理资源""" - await self.exit_stack.aclose() - - -async def main(server_script_path: str): - - client = MCPClient() - try: - await client.connect_to_server(server_script_path) - await client.chat_loop() - finally: - await client.cleanup() - - -if __name__ == "__main__": - - asyncio.run(main('mcp_server.py')) \ No newline at end of file diff --git a/backend/app/api/v1/module_ai/mcp_server/mcp_database.py b/backend/app/api/v1/module_ai/mcp_server/mcp_database.py deleted file mode 100644 index e69de29b..00000000 diff --git a/backend/app/api/v1/module_ai/mcp_server/mcp_server.py b/backend/app/api/v1/module_ai/mcp_server/mcp_server.py deleted file mode 100644 index 5fb434f9..00000000 --- a/backend/app/api/v1/module_ai/mcp_server/mcp_server.py +++ /dev/null @@ -1,39 +0,0 @@ - -from typing import Literal - -from mcp.server.fastmcp import FastMCP - -from tool_table import TableTool -from tool_weather import WeatherTool - -# 初始化 MCP 服务器 -mcp = FastMCP("FluxMcpServer") - - -@mcp.tool() -async def query_weather(city: str) -> str: - """ - 输入指定城市的英文名称,返回今日天气查询结果。 - :param city: 城市名称(需使用英文) - :return: 格式化后的天气信息 - """ - data = await WeatherTool.fetch_weather(city) - return WeatherTool.format_weather(data) - -@mcp.tool() -async def query_table(table_name: Literal["car_driver", "student_info"]) -> str: - """ - 输入指定表名,获取表内的数据。 - Args: - table_name: 表名选项: - - car_driver: 司机信息 - - student_info: 学生信息表 - return: 数据表内容 - """ - data = await TableTool.fetch_table_data(table_name) - return data - - -if __name__ == "__main__": - # 以标准 I/O 方式运行 MCP 服务器 - mcp.run(transport='stdio') \ No newline at end of file diff --git a/backend/app/api/v1/module_ai/mcp_server/tool_table.py b/backend/app/api/v1/module_ai/mcp_server/tool_table.py deleted file mode 100644 index 8171c240..00000000 --- a/backend/app/api/v1/module_ai/mcp_server/tool_table.py +++ /dev/null @@ -1,30 +0,0 @@ -import json - -from fastapi.encoders import jsonable_encoder -from sqlalchemy import select -from config.database import Base -from config.get_db import get_db -import logging - -from module_admin.entity.do.car_driver_do import CarDriver -from module_admin.entity.do.student_info_do import StudentInfo - -class TableTool: - - logger = logging.getLogger(__name__) - # 因为mcp服务是在另外进程里面,需要导入模型,否则Base.registry.mappers是空的 - support_modules = [CarDriver, StudentInfo] - - @classmethod - async def fetch_table_data(cls, table_name: str) -> str: - async for query_db in get_db(): - for mapper in Base.registry.mappers: - table_cls = mapper.class_ - if hasattr(table_cls, '__tablename__') and table_cls.__tablename__ == table_name: - result = await query_db.execute(select(table_cls)) - data = result.scalars().all() - json_str = json.dumps(jsonable_encoder(data), ensure_ascii=False) - return json_str - raise ValueError(f"No model found for table name: {table_name},to check if you have imported it") - - diff --git a/backend/app/api/v1/module_ai/mcp_server/tool_weather.py b/backend/app/api/v1/module_ai/mcp_server/tool_weather.py deleted file mode 100644 index 7e9acbe5..00000000 --- a/backend/app/api/v1/module_ai/mcp_server/tool_weather.py +++ /dev/null @@ -1,72 +0,0 @@ -import json -from typing import Any - -import httpx - - -class WeatherTool: - # OpenWeather API 配置 - OPENWEATHER_API_BASE = "https://api.openweathermap.org/data/2.5/weather" - API_KEY = "146d600baa0f4f7a7687bdb573fb9138" # 请替换为你自己的 OpenWeather API Key - USER_AGENT = "weather-app/1.0" - - @classmethod - async def fetch_weather(cls, city: str) -> dict[str, Any] | None: - """ - 从 OpenWeather API 获取天气信息。 - :param city: 城市名称(需使用英文,如 Beijing) - :return: 天气数据字典;若出错返回包含 error 信息的字典 - """ - params = { - "q": city, - "appid": cls.API_KEY, - "units": "metric", - "lang": "zh_cn" - } - headers = {"User-Agent": cls.USER_AGENT} - - async with httpx.AsyncClient() as client: - try: - response = await client.get(cls.OPENWEATHER_API_BASE, params=params, headers=headers, timeout=30.0) - response.raise_for_status() - return response.json() # 返回字典类型 - except httpx.HTTPStatusError as e: - return {"error": f"HTTP 错误: {e.response.status_code}"} - except Exception as e: - return {"error": f"请求失败: {str(e)}"} - - @classmethod - def format_weather(cls, data: dict[str, Any] | str) -> str: - """ - 将天气数据格式化为易读文本。 - :param data: 天气数据(可以是字典或 JSON 字符串) - :return: 格式化后的天气信息字符串 - """ - # 如果传入的是字符串,则先转换为字典 - if isinstance(data, str): - try: - data = json.loads(data) - except Exception as e: - return f"无法解析天气数据: {e}" - - # 如果数据中包含错误信息,直接返回错误提示 - if "error" in data: - return f"⚠️ {data['error']}" - - # 提取数据时做容错处理 - city = data.get("name", "未知") - country = data.get("sys", {}).get("country", "未知") - temp = data.get("main", {}).get("temp", "N/A") - humidity = data.get("main", {}).get("humidity", "N/A") - wind_speed = data.get("wind", {}).get("speed", "N/A") - # weather 可能为空列表,因此用 [0] 前先提供默认字典 - weather_list = data.get("weather", [{}]) - description = weather_list[0].get("description", "未知") - - return ( - f"🌍 {city}, {country}\n" - f"🌡 温度: {temp}°C\n" - f"💧 湿度: {humidity}%\n" - f"🌬 风速: {wind_speed} m/s\n" - f"🌤 天气: {description}\n" - ) diff --git a/backend/app/api/v1/module_resource/resource/schema.py b/backend/app/api/v1/module_resource/resource/schema.py index 3d153ad9..4fddc52c 100644 --- a/backend/app/api/v1/module_resource/resource/schema.py +++ b/backend/app/api/v1/module_resource/resource/schema.py @@ -19,6 +19,8 @@ class ResourceType(Enum): class ResourceItemSchema(BaseModel): """资源项目模型""" + model_config = ConfigDict(from_attributes=True, use_enum_values=True) + name: str = Field(..., description="文件名") path: str = Field(..., description="文件路径") relative_path: str = Field(..., description="相对路径") @@ -37,6 +39,8 @@ class ResourceItemSchema(BaseModel): class ResourceDirectorySchema(BaseModel): """资源目录模型""" + model_config = ConfigDict(from_attributes=True, use_enum_values=True) + path: str = Field(..., description="目录路径") name: str = Field(..., description="目录名称") items: List[ResourceItemSchema] = Field(default_factory=list, description="目录项") @@ -47,6 +51,8 @@ class ResourceDirectorySchema(BaseModel): class ResourceStatsSchema(BaseModel): """资源统计模型""" + model_config = ConfigDict(from_attributes=True, use_enum_values=True) + mount_point: str = Field(..., description="挂载点") total_files: int = Field(0, description="文件总数") total_dirs: int = Field(0, description="目录总数") @@ -60,6 +66,8 @@ class ResourceStatsSchema(BaseModel): class ResourceSearchSchema(BaseModel): """资源搜索模型""" + model_config = ConfigDict(from_attributes=True, use_enum_values=True) + keyword: Optional[str] = Field(None, description="关键词") file_type: Optional[str] = Field(None, description="文件类型") resource_type: Optional[ResourceType] = Field(None, description="资源类型") @@ -74,6 +82,8 @@ class ResourceSearchSchema(BaseModel): class ResourceUploadSchema(BaseModel): """资源上传响应模型""" + model_config = ConfigDict(from_attributes=True, use_enum_values=True) + filename: str = Field(..., description="文件名") file_path: str = Field(..., description="文件路径") file_url: str = Field(..., description="访问URL") diff --git a/backend/app/api/v1/module_resource/resource/service.py b/backend/app/api/v1/module_resource/resource/service.py index c47020b6..780052b4 100644 --- a/backend/app/api/v1/module_resource/resource/service.py +++ b/backend/app/api/v1/module_resource/resource/service.py @@ -10,6 +10,8 @@ from pathlib import Path from fastapi import UploadFile from PIL import Image + +# 尝试导入 magic 库,如果失败则标记为不可用 try: import magic MAGIC_AVAILABLE = True @@ -18,6 +20,10 @@ except ImportError: from app.core.exceptions import CustomException from app.core.logger import logger + +# 如果 magic 不可用,记录日志 +if not MAGIC_AVAILABLE: + logger.info("没有找到 python-magic 库,将使用基于扩展名的文件类型检测") from app.utils.excel_util import ExcelUtil from app.config.setting import settings from ...module_system.auth.schema import AuthSchema @@ -38,32 +44,48 @@ from .schema import ( class ResourceService: """ - 资源管理模块服务层 - 直接操作文件系统 + 资源管理模块服务层 - 管理系统静态文件目录 """ - # 默认挂载点配置 - DEFAULT_MOUNT_POINT = getattr(settings, 'RESOURCE_MOUNT_POINT', '/Users/tao/workspace/fastapi_vue3_admin/backend/static/upload') - ALLOWED_MOUNT_POINTS = getattr(settings, 'ALLOWED_MOUNT_POINTS', ['/Users/tao/workspace/fastapi_vue3_admin/backend/static', '/Users/tao/workspace/fastapi_vue3_admin/backend/static/upload']) + # 配置常量 + MAX_UPLOAD_SIZE = 100 * 1024 * 1024 # 100MB + MAX_SEARCH_RESULTS = 1000 # 最大搜索结果数 + MAX_PATH_DEPTH = 20 # 最大路径深度 @classmethod - def _get_safe_path(cls, path: str) -> str: + def _get_resource_root(cls) -> str: + """获取资源管理根目录""" + if not settings.STATIC_ENABLE: + raise CustomException(msg='静态文件服务未启用') + return str(settings.STATIC_ROOT) + + @classmethod + def _get_safe_path(cls, path: str = None) -> str: """获取安全的文件路径""" - if not path: - return cls.DEFAULT_MOUNT_POINT - - # 规范化路径 - safe_path = os.path.normpath(os.path.abspath(path)) + resource_root = cls._get_resource_root() - # 检查路径是否在允许的挂载点内 - allowed = False - for mount_point in cls.ALLOWED_MOUNT_POINTS: - mount_abs = os.path.normpath(os.path.abspath(mount_point)) - if safe_path.startswith(mount_abs): - allowed = True - break - - if not allowed: + if not path: + return resource_root + + # 清理路径,移除危险字符 + path = path.strip().replace('..', '').replace('//', '/') + + # 规范化路径 + if os.path.isabs(path): + safe_path = os.path.normpath(path) + else: + safe_path = os.path.normpath(os.path.join(resource_root, path)) + + # 检查路径是否在允许的范围内 + resource_root_abs = os.path.normpath(os.path.abspath(resource_root)) + safe_path_abs = os.path.normpath(os.path.abspath(safe_path)) + + if not safe_path_abs.startswith(resource_root_abs): raise CustomException(msg=f'访问路径不在允许范围内: {path}') + + # 防止路径遍历攻击 + if '..' in safe_path or safe_path.count('/') > cls.MAX_PATH_DEPTH: # 限制最大目录深度 + raise CustomException(msg=f'不安全的路径格式: {path}') return safe_path @@ -86,16 +108,45 @@ class ResourceService: stat = os.stat(safe_path) path_obj = Path(safe_path) + resource_root = cls._get_resource_root() # 获取文件扩展名和类型 file_extension = path_obj.suffix.lower() if path_obj.suffix else None - file_type = cls._get_mime_type_from_extension(file_extension) if file_extension else None + + # 优先使用 magic 库检测 MIME 类型 + file_type = None + if MAGIC_AVAILABLE and os.path.isfile(safe_path): + try: + file_type = magic.from_file(safe_path, mime=True) + except Exception as e: + logger.debug(f"magic 库检测文件类型失败: {e}") + + # 如果 magic 检测失败或不可用,使用扩展名检测 + if not file_type and file_extension: + file_type = cls._get_mime_type_from_extension(file_extension) + + # 如果仍然没有类型,使用默认值 + if not file_type: + file_type = 'application/octet-stream' if os.path.isfile(safe_path) else None + resource_type = cls._determine_resource_type(file_type, file_extension) + # 计算相对路径 + try: + relative_path = os.path.relpath(safe_path, resource_root) + except ValueError: + relative_path = os.path.basename(safe_path) + + # 计算深度 + try: + depth = len(Path(safe_path).relative_to(resource_root).parts) + except ValueError: + depth = 0 + return { 'name': path_obj.name, 'path': safe_path, - 'relative_path': os.path.relpath(safe_path, cls.DEFAULT_MOUNT_POINT), + 'relative_path': relative_path, 'is_file': os.path.isfile(safe_path), 'is_dir': os.path.isdir(safe_path), 'size': stat.st_size if os.path.isfile(safe_path) else None, @@ -106,7 +157,7 @@ class ResourceService: 'modified_time': datetime.fromtimestamp(stat.st_mtime), 'accessed_time': datetime.fromtimestamp(stat.st_atime), 'parent_path': str(path_obj.parent), - 'depth': len(path_obj.relative_to(cls.DEFAULT_MOUNT_POINT).parts) if cls.DEFAULT_MOUNT_POINT in safe_path else 0 + 'depth': depth } except Exception as e: logger.error(f'获取文件信息失败: {str(e)}') @@ -122,8 +173,11 @@ class ResourceService: ) -> Dict: """获取目录列表""" try: - target_path = path or cls.DEFAULT_MOUNT_POINT - safe_path = cls._get_safe_path(target_path) + # 如果没有指定路径,使用静态文件根目录 + if path is None: + safe_path = cls._get_resource_root() + else: + safe_path = cls._get_safe_path(path) if not os.path.exists(safe_path): raise CustomException(msg='目录不存在') @@ -171,7 +225,7 @@ class ResourceService: total_files=total_files, total_dirs=total_dirs, total_size=total_size - ).model_dump() + ).model_dump(mode='json') except CustomException: raise @@ -214,27 +268,52 @@ class ResourceService: ) -> List[Dict]: """搜索资源""" try: - mount_point = cls.DEFAULT_MOUNT_POINT + # 使用静态文件根目录作为搜索起点 + search_root = cls._get_resource_root() results = [] - for root, dirs, files in os.walk(mount_point): + for root, dirs, files in os.walk(search_root): # 控制搜索深度 - depth = len(Path(root).relative_to(mount_point).parts) + try: + depth = len(Path(root).relative_to(search_root).parts) + except ValueError: + depth = 0 + if depth > search.max_depth: + dirs.clear() # 阻止进一步深入 continue - # 过滤隐藏文件夹 + # 过滤隐藏文件夹(性能优化) if not search.include_hidden: dirs[:] = [d for d in dirs if not d.startswith('.')] files = [f for f in files if not f.startswith('.')] + # 优化:先过滤文件名,再进行详细检查 + if search.keyword: + files = [f for f in files if search.keyword.lower() in f.lower()] + # 搜索文件 for file in files: file_path = os.path.join(root, file) + + # 优化:先进行快速检查 + if search.extensions: + file_ext = os.path.splitext(file)[1].lower() + if file_ext not in search.extensions: + continue + file_info = cls._get_file_info(file_path) if cls._match_search_criteria(file_info, search): results.append(file_info) + + # 限制结果数量防止内存溢出 + if len(results) >= cls.MAX_SEARCH_RESULTS: + logger.warning(f"搜索结果过多,已截断到前{cls.MAX_SEARCH_RESULTS}个") + break + + if len(results) >= cls.MAX_SEARCH_RESULTS: + break # 排序结果 return cls._sort_results(results, search) @@ -314,10 +393,21 @@ class ResourceService: if not file or not file.filename: raise CustomException(msg="请选择要上传的文件") + # 文件名安全检查 + if '..' in file.filename or '/' in file.filename or '\\' in file.filename: + raise CustomException(msg="文件名包含不安全字符") + try: - # 确定上传目录 - upload_dir = target_path or cls.DEFAULT_MOUNT_POINT - safe_dir = cls._get_safe_path(upload_dir) + # 检查文件大小 + content = await file.read() + if len(content) > cls.MAX_UPLOAD_SIZE: + raise CustomException(msg=f"文件太大,最大支持{cls.MAX_UPLOAD_SIZE // (1024*1024)}MB") + + # 确定上传目录,如果没有指定目标路径,使用静态文件根目录 + if target_path is None: + safe_dir = cls._get_resource_root() + else: + safe_dir = cls._get_safe_path(target_path) # 创建目录(如果不存在) os.makedirs(safe_dir, exist_ok=True) @@ -337,24 +427,34 @@ class ResourceService: counter += 1 filename = os.path.basename(file_path) - # 保存文件 - content = await file.read() + # 保存文件(使用已读取的内容) with open(file_path, 'wb') as f: f.write(content) # 获取文件信息 file_info = cls._get_file_info(file_path) + # 生成相对于资源根目录的URL路径 + resource_root = cls._get_resource_root() + try: + relative_path = os.path.relpath(file_path, resource_root) + # 确保路径使用正斜杠(URL格式) + file_url_path = relative_path.replace(os.sep, '/') + file_url = f"/resource/download?path={file_url_path}" + except ValueError: + # 如果无法计算相对路径,使用文件名 + file_url = f"/resource/download?path={filename}" + logger.info(f"文件上传成功: {filename}") return ResourceUploadSchema( filename=filename, file_path=file_path, - file_url=f"/resource/download?path={file_path}", + file_url=file_url, file_size=file_info.get('size', 0), resource_type=file_info.get('resource_type', ResourceType.OTHER), upload_time=datetime.now() - ).model_dump() + ).model_dump(mode='json') except Exception as e: logger.error(f"文件上传失败: {str(e)}") @@ -531,10 +631,11 @@ class ResourceService: async def get_stats_service(cls, auth: AuthSchema) -> Dict: """获取资源统计信息""" try: - mount_point = cls.DEFAULT_MOUNT_POINT + # 使用静态文件根目录 + stats_root = cls._get_resource_root() # 获取磁盘空间信息 - statvfs = os.statvfs(mount_point) + statvfs = os.statvfs(stats_root) total_space = statvfs.f_frsize * statvfs.f_blocks free_space = statvfs.f_frsize * statvfs.f_bavail used_space = total_space - free_space @@ -546,7 +647,7 @@ class ResourceService: type_stats = {} extension_stats = {} - for root, dirs, files in os.walk(mount_point): + for root, dirs, files in os.walk(stats_root): total_dirs += len(dirs) for file in files: @@ -572,7 +673,7 @@ class ResourceService: continue return ResourceStatsSchema( - mount_point=mount_point, + mount_point=stats_root, total_files=total_files, total_dirs=total_dirs, total_size=total_size, @@ -581,7 +682,7 @@ class ResourceService: total_space=total_space, type_stats=type_stats, extension_stats=extension_stats - ).model_dump() + ).model_dump(mode='json') except Exception as e: logger.error(f"获取统计信息失败: {str(e)}") @@ -658,36 +759,39 @@ class ResourceService: if not file_extension: return 'application/octet-stream' + # 扩展更全面的MIME类型映射 mime_types = { - '.jpg': 'image/jpeg', - '.jpeg': 'image/jpeg', - '.png': 'image/png', - '.gif': 'image/gif', - '.bmp': 'image/bmp', - '.webp': 'image/webp', - '.svg': 'image/svg+xml', - '.mp4': 'video/mp4', - '.avi': 'video/x-msvideo', - '.mov': 'video/quicktime', - '.wmv': 'video/x-ms-wmv', - '.flv': 'video/x-flv', - '.mp3': 'audio/mpeg', - '.wav': 'audio/wav', - '.aac': 'audio/aac', - '.ogg': 'audio/ogg', - '.pdf': 'application/pdf', - '.doc': 'application/msword', + # 图片类型 + '.jpg': 'image/jpeg', '.jpeg': 'image/jpeg', '.png': 'image/png', + '.gif': 'image/gif', '.bmp': 'image/bmp', '.webp': 'image/webp', + '.svg': 'image/svg+xml', '.ico': 'image/x-icon', '.tiff': 'image/tiff', + + # 视频类型 + '.mp4': 'video/mp4', '.avi': 'video/x-msvideo', '.mov': 'video/quicktime', + '.wmv': 'video/x-ms-wmv', '.flv': 'video/x-flv', '.webm': 'video/webm', + '.mkv': 'video/x-matroska', '.m4v': 'video/x-m4v', + + # 音频类型 + '.mp3': 'audio/mpeg', '.wav': 'audio/wav', '.aac': 'audio/aac', + '.ogg': 'audio/ogg', '.flac': 'audio/flac', '.m4a': 'audio/mp4', + + # 文档类型 + '.pdf': 'application/pdf', '.doc': 'application/msword', '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', '.xls': 'application/vnd.ms-excel', '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', '.ppt': 'application/vnd.ms-powerpoint', '.pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation', - '.txt': 'text/plain', - '.csv': 'text/csv', - '.zip': 'application/zip', - '.rar': 'application/x-rar-compressed', - '.7z': 'application/x-7z-compressed', - '.tar': 'application/x-tar', - '.gz': 'application/gzip' + '.txt': 'text/plain', '.csv': 'text/csv', '.rtf': 'application/rtf', + + # 代码文件 + '.html': 'text/html', '.css': 'text/css', '.js': 'application/javascript', + '.json': 'application/json', '.xml': 'application/xml', + '.py': 'text/x-python', '.java': 'text/x-java-source', + + # 压缩文件 + '.zip': 'application/zip', '.rar': 'application/x-rar-compressed', + '.7z': 'application/x-7z-compressed', '.tar': 'application/x-tar', + '.gz': 'application/gzip', '.bz2': 'application/x-bzip2' } return mime_types.get(file_extension.lower(), 'application/octet-stream') \ No newline at end of file diff --git a/backend/app/api/v1/module_system/auth/schema.py b/backend/app/api/v1/module_system/auth/schema.py index 9f96d84b..ceccde0f 100644 --- a/backend/app/api/v1/module_system/auth/schema.py +++ b/backend/app/api/v1/module_system/auth/schema.py @@ -2,7 +2,7 @@ from typing import Optional, Union from datetime import datetime -from pydantic import ConfigDict, Field, BaseModel, field_validator, model_validator +from pydantic import ConfigDict, Field, BaseModel, model_validator from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import Session @@ -25,10 +25,10 @@ class JWTPayloadSchema(BaseModel): exp: Union[datetime, int] = Field(..., description='过期时间') @model_validator(mode='after') - def validate_fields(cls, data): - if not data.sub or len(data.sub.strip()) == 0: + def validate_fields(self): + if not self.sub or len(self.sub.strip()) == 0: raise ValueError("会话编号不能为空") - return data + return self class JWTOutSchema(BaseModel): diff --git a/backend/app/api/v1/module_system/menu/schema.py b/backend/app/api/v1/module_system/menu/schema.py index fbd3c176..2b9a019f 100644 --- a/backend/app/api/v1/module_system/menu/schema.py +++ b/backend/app/api/v1/module_system/menu/schema.py @@ -28,10 +28,9 @@ class MenuCreateSchema(BaseModel): parent_id: Optional[int] = Field(default=None, ge=1, description="父菜单ID") description: Optional[str] = Field(default=None, max_length=500, description="备注说明") - @classmethod @model_validator(mode='after') - def validate_fields(cls, data): - return menu_request_validator(data) + def validate_fields(self): + return menu_request_validator(self) class MenuUpdateSchema(MenuCreateSchema): diff --git a/backend/app/api/v1/module_system/role/schema.py b/backend/app/api/v1/module_system/role/schema.py index 8f0c9c53..828d0362 100644 --- a/backend/app/api/v1/module_system/role/schema.py +++ b/backend/app/api/v1/module_system/role/schema.py @@ -26,11 +26,10 @@ class RolePermissionSettingSchema(BaseModel): menu_ids: List[int] = Field(default_factory=list, description='菜单ID列表') dept_ids: List[int] = Field(default_factory=list, description='部门ID列表') - @classmethod @model_validator(mode='after') - def validate_fields(cls, data): + def validate_fields(self): """验证权限配置字段""" - return role_permission_request_validator(data) + return role_permission_request_validator(self) class RoleUpdateSchema(RoleCreateSchema): diff --git a/backend/app/api/v1/module_system/user/schema.py b/backend/app/api/v1/module_system/user/schema.py index f477eea2..5eb17b09 100644 --- a/backend/app/api/v1/module_system/user/schema.py +++ b/backend/app/api/v1/module_system/user/schema.py @@ -78,7 +78,9 @@ class UserCreateSchema(CurrentUserUpdateSchema): class UserUpdateSchema(UserCreateSchema): """更新""" - model_config = ConfigDict(from_attributes=True, exclude={"password"}) + model_config = ConfigDict(from_attributes=True) + + password: Optional[str] = Field(default=None, max_length=128, description="密码哈希值") class UserOutSchema(UserCreateSchema, BaseSchema): diff --git a/backend/app/config/setting.py b/backend/app/config/setting.py index aea6677a..3d46e632 100755 --- a/backend/app/config/setting.py +++ b/backend/app/config/setting.py @@ -190,10 +190,8 @@ class Settings(BaseSettings): "/auth/login" ] DEMO_IP_WHITE_LIST: List[str] = [ # 演示白名单IP - "127.0.0.1" - ] - DEMO_USER_WHITE_LIST: List[str] = [ # 演示白名单用户 - "superadmin", + "127.0.0.1", + "117.10.167.220" ] # ================================================= # @@ -260,6 +258,14 @@ class Settings(BaseSettings): # if not os.path.exists(self.GEN_PATH): # os.makedirs(self.GEN_PATH) + # ================================================= # + # ******************* AI大模型配置 ****************** # + # ================================================= # + # https://bailian.console.aliyun.com/?spm=5176.29619931.J_AHgvE-XDhTWrtotIBlDQQ.13.74cd521clrmQ7o&tab=api#/api/?type=model&url=https%3A%2F%2Fhelp.aliyun.com%2Fdocument_detail%2F2712576.html&renderType=iframe + QWEN_BASE_URL: str + QWEN_API_KEY: str + QWEN_MODEL: str + # ================================================= # # ******************* 其他配置 ******************* # # ================================================= # diff --git a/backend/app/core/ap_scheduler.py b/backend/app/core/ap_scheduler.py index b6201bc5..92880606 100644 --- a/backend/app/core/ap_scheduler.py +++ b/backend/app/core/ap_scheduler.py @@ -24,7 +24,7 @@ from apscheduler.triggers.interval import IntervalTrigger from pymongo import MongoClient from app.config.setting import settings -from app.core.database import engine, session_connect, SessionLocal, async_session +from app.core.database import engine, session_connect, SessionLocal, AsyncSessionLocal from app.core.exceptions import CustomException from app.core.logger import logger @@ -41,7 +41,10 @@ job_stores = { )), } # 配置执行器 -executors = {'default': AsyncIOExecutor(), 'processpool': ProcessPoolExecutor(5)} +executors = { + 'default': AsyncIOExecutor(), + 'processpool': ProcessPoolExecutor(max_workers=1) # 减少进程数量以减少资源消耗 +} # 配置默认参数 job_defaults = { 'coalesce': False, # 是否合并执行 @@ -110,7 +113,7 @@ class SchedulerUtil: exception_info=exception_info, create_time=datetime.now(), ) - session = async_session() + session = SessionLocal() JobLogCRUD(AuthSchema(db=session)).create_obj_log_crud(data=job_log) session.close() diff --git a/backend/app/core/base_model.py b/backend/app/core/base_model.py index 9f2e0c9c..278c3e64 100644 --- a/backend/app/core/base_model.py +++ b/backend/app/core/base_model.py @@ -42,7 +42,7 @@ class ModelMixin(MappedBase): """ __abstract__ = True - id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement='auto', comment='主键ID') + id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True, comment='主键ID') status: Mapped[bool] = mapped_column(Boolean(), default=True, nullable=False, comment="是否启用(True:启用 False:禁用)") description: Mapped[Optional[str]] = mapped_column(Text, nullable=True, comment="备注说明") created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.now, comment='创建时间') diff --git a/backend/app/core/database.py b/backend/app/core/database.py index 28d31153..dc66ecf5 100644 --- a/backend/app/core/database.py +++ b/backend/app/core/database.py @@ -3,7 +3,7 @@ from redis import asyncio as aioredis from motor.motor_asyncio import AsyncIOMotorClient from fastapi import FastAPI -from sqlalchemy import create_engine, inspect, text +from sqlalchemy import create_engine, text from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.asyncio import ( create_async_engine, @@ -37,26 +37,21 @@ engine = create_engine( SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) # 异步数据库引擎 -def async_db_engine() -> AsyncEngine: - """创建异步数据库引擎""" - # 创建数据库引擎 - async_engine = create_async_engine( - url=settings.ASYNC_DB_URI, - echo=settings.DATABASE_ECHO, - echo_pool=settings.ECHO_POOL, - pool_pre_ping=settings.POOL_PRE_PING, - future=settings.FUTURE, - pool_recycle=settings.POOL_RECYCLE, - # pool_size=settings.POOL_SIZE, # sqlite 不支持 - # max_overflow=settings.MAX_OVERFLOW, # sqlite 不支持 - # pool_timeout=settings.POOL_TIMEOUT, # sqlite 不支持 - ) +async_engine: AsyncEngine = create_async_engine( + url=settings.ASYNC_DB_URI, + echo=settings.DATABASE_ECHO, + echo_pool=settings.ECHO_POOL, + pool_pre_ping=settings.POOL_PRE_PING, + future=settings.FUTURE, + pool_recycle=settings.POOL_RECYCLE, + # pool_size=settings.POOL_SIZE, # sqlite 不支持 + # max_overflow=settings.MAX_OVERFLOW, # sqlite 不支持 + # pool_timeout=settings.POOL_TIMEOUT, # sqlite 不支持 +) - return async_engine - # 异步数据库会话工厂 -async_session = async_sessionmaker( - bind=async_db_engine(), +AsyncSessionLocal = async_sessionmaker( + bind=async_engine, autocommit=settings.AUTOCOMMIT, autoflush=settings.AUTOFETCH, expire_on_commit=settings.EXPIRE_ON_COMMIT, @@ -68,7 +63,7 @@ def session_connect() -> AsyncSession: try: if not settings.SQL_DB_ENABLE: raise CustomException(msg="请先开启数据库连接", data="请启用 app/config/setting.py: SQL_DB_ENABLE") - return async_session() + return AsyncSessionLocal() except Exception as e: raise CustomException(msg=f"数据库连接失败: {e}") diff --git a/backend/app/core/middlewares.py b/backend/app/core/middlewares.py index 22010823..9dd0ce9a 100644 --- a/backend/app/core/middlewares.py +++ b/backend/app/core/middlewares.py @@ -75,29 +75,26 @@ class DemoEnvMiddleware(BaseHTTPMiddleware): if settings.DEMO_ENABLE and request.method != "GET": path = request.scope.get("path") - client_ip = request.client.host + + request_ip = None + x_forwarded_for = request.headers.get('X-Forwarded-For') + if x_forwarded_for: + # 取第一个 IP 地址,通常为客户端真实 IP + request_ip = x_forwarded_for.split(',')[0].strip() + else: + # 若没有 X-Forwarded-For 头,则使用 request.client.host + request_ip = request.client.host + user_username = request.scope.get("user_username") + logger.error(f"用户名称: {user_username}") # 检查IP是否在白名单,或路径是否在白名单,或用户是否在白名单 - if (client_ip in settings.DEMO_IP_WHITE_LIST or - path in settings.DEMO_WHITE_LIST_PATH or - (user_username and user_username in settings.DEMO_USER_WHITE_LIST)): + if (request_ip in settings.DEMO_IP_WHITE_LIST) or (path in settings.DEMO_WHITE_LIST_PATH): return await call_next(request) else: - try: - response = await call_next(request) - - # 现在检查用户是否有权限执行操作 - user_username = request.scope.get("user_username") - if user_username and user_username not in settings.DEMO_USER_WHITE_LIST: - # 如果用户没有权限,返回错误响应 - return ErrorResponse(msg="演示环境,禁止操作") - - return response - except Exception as e: - # 处理可能的异常 - raise e + # 非白名单用户,禁止操作 + return ErrorResponse(msg="演示环境,禁止操作") return await call_next(request) diff --git a/backend/app/core/router_class.py b/backend/app/core/router_class.py index 982d7243..94ca320d 100644 --- a/backend/app/core/router_class.py +++ b/backend/app/core/router_class.py @@ -53,10 +53,18 @@ class OperationLogRoute(APIRoute): payload = await request.body() path_params = request.path_params oper_param = {} + + # 处理请求体数据 if payload: - oper_param.update(json.loads(payload.decode())) + try: + oper_param['body'] = json.loads(payload.decode()) + except (json.JSONDecodeError, UnicodeDecodeError): + oper_param['body'] = payload.decode('utf-8', errors='ignore') + + # 处理路径参数 if path_params: - oper_param.update(path_params) + oper_param['path_params'] = dict(path_params) + payload = json.dumps(oper_param, ensure_ascii=False) # payload = str(oper_param) diff --git a/backend/app/plugin/init_app.py b/backend/app/plugin/init_app.py index d310bf72..6899b0d2 100644 --- a/backend/app/plugin/init_app.py +++ b/backend/app/plugin/init_app.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- -import asyncio from typing import Any, AsyncGenerator +from fastapi_mcp import FastApiMCP from fastapi import FastAPI from fastapi.staticfiles import StaticFiles from fastapi.concurrency import asynccontextmanager @@ -10,7 +10,6 @@ from fastapi.openapi.docs import ( get_swagger_ui_html, get_swagger_ui_oauth2_redirect_html ) -from sqlalchemy import text from app.config.setting import settings from app.core.ap_scheduler import SchedulerUtil @@ -47,22 +46,30 @@ async def lifespan(app: FastAPI) -> AsyncGenerator[Any, Any]: logger.info(settings.BANNER + '\n' + f'{settings.TITLE} 服务开始启动...') try: + # 在单独的会话中完成其他初始化操作 async with session_connect() as session: - async with session.begin(): - # 测试数据库连接 - await test_db_connection(session) - logger.info("数据库连接成功...") - await InitializeData().init_db(db=session) - logger.info("初始化数据完成...") - - # 在同一个事务中完成所有初始化操作 - await import_modules_async(modules=settings.EVENT_LIST, desc="全局事件", app=app, status=True) - await ConfigService().init_config_service(redis=app.state.redis, db=session) - logger.info("初始化系统配置完成...") - await DictDataService().init_dict_service(redis=app.state.redis, db=session) - logger.info('初始化数据字典完成...') - await SchedulerUtil.init_system_scheduler(db=session) - logger.info('初始化定时任务完成...') + # 测试数据库连接 + await test_db_connection(session) + logger.info("数据库连接成功...") + + # 初始化数据库 + await InitializeData().init_db(db=session) + logger.info("初始化数据完成...") + + # 初始化全局事件 + await import_modules_async(modules=settings.EVENT_LIST, desc="全局事件", app=app, status=True) + + # 初始化系统配置 + await ConfigService().init_config_service(redis=app.state.redis, db=session) + logger.info("初始化系统配置完成...") + + # 初始化数据字典 + await DictDataService().init_dict_service(redis=app.state.redis, db=session) + logger.info('初始化数据字典完成...') + + # 初始化定时任务 + await SchedulerUtil.init_system_scheduler(db=session) + logger.info('初始化定时任务完成...') logger.info(f'{settings.TITLE} 服务成功启动...') except Exception as e: @@ -103,6 +110,20 @@ def register_routers(app: FastAPI) -> None: """ app.include_router(router=router) +def register_fastapi_mcp(app: FastAPI) -> None: + """ + 注册FastAPI-MCP路由 + """ + mcp = FastApiMCP( + app, + name="FastAPI Vue3 Admin MCP", + description="MCP server for the FastAPI Vue3 Admin system", + describe_full_response_schema=True, + describe_all_responses=True, + ) + mcp.mount() + # mcp.mount_http() + def register_files(app: FastAPI) -> None: """ 注册文件相关配置 @@ -140,4 +161,4 @@ def reset_api_docs(app: FastAPI) -> None: title=app.title + " - ReDoc", redoc_js_url=settings.REDOC_JS_URL, redoc_favicon_url=settings.FAVICON_URL, - ) + ) \ No newline at end of file diff --git a/backend/app/scripts/data/monitor_job.json b/backend/app/scripts/data/monitor_job.json index 0ea21c41..547ba9dc 100644 --- a/backend/app/scripts/data/monitor_job.json +++ b/backend/app/scripts/data/monitor_job.json @@ -1,6 +1,5 @@ [ { - "id": 1, "name": "系统默认(无参)", "func": "scheduler_test.job", "trigger": "cron", @@ -18,7 +17,6 @@ "creator_id": 1 }, { - "id": 2, "name": "系统默认(有参)", "func": "scheduler_test.job", "trigger": "cron", @@ -36,7 +34,6 @@ "creator_id": 1 }, { - "id": 3, "name": "系统默认(多参)", "func": "scheduler_test.job", "trigger": "cron", diff --git a/backend/app/scripts/data/system_config.json b/backend/app/scripts/data/system_config.json index 2b4d3747..88661667 100644 --- a/backend/app/scripts/data/system_config.json +++ b/backend/app/scripts/data/system_config.json @@ -1,6 +1,5 @@ [ { - "id": 1, "config_name": "网站名称", "config_key": "sys_web_title", "config_value": "FastAPI Vue3 Admin", @@ -9,7 +8,6 @@ "creator_id": 1 }, { - "id": 2, "config_name": "网站描述", "config_key": "sys_web_description", "config_value": "FastAPI Vue3 Admin 是完全开源的权限管理系统", @@ -18,7 +16,6 @@ "creator_id": 1 }, { - "id": 3, "config_name": "网页图标", "config_key": "sys_web_favicon", "config_value": "https://service.fastapiadmin.com/api/v1/static/image/favicon.png", @@ -27,7 +24,6 @@ "creator_id": 1 }, { - "id": 4, "config_name": "网站Logo", "config_key": "sys_web_logo", "config_value": "https://service.fastapiadmin.com/api/v1/static/image/logo.png", @@ -36,7 +32,6 @@ "creator_id": 1 }, { - "id": 5, "config_name": "登录背景", "config_key": "sys_login_background", "config_value": "https://service.fastapiadmin.com/api/v1/static/image/background.svg", @@ -45,7 +40,6 @@ "creator_id": 1 }, { - "id": 6, "config_name": "版权信息", "config_key": "sys_web_copyright", "config_value": "Copyright © 2025-2026 service.fastapiadmin.com 版权所有", @@ -54,7 +48,6 @@ "creator_id": 1 }, { - "id": 7, "config_name": "备案信息", "config_key": "sys_keep_record", "config_value": "陕ICP备2025069493号-1", @@ -63,7 +56,6 @@ "creator_id": 1 }, { - "id": 8, "config_name": "帮助文档", "config_key": "sys_help_doc", "config_value": "https://service.fastapiadmin.com", @@ -72,7 +64,6 @@ "creator_id": 1 }, { - "id": 9, "config_name": "隐私政策", "config_key": "sys_web_privacy", "config_value": "https://github.com/1014TaoTao/fastapi_vue3_admin/blob/master/LICENSE", @@ -81,7 +72,6 @@ "creator_id": 1 }, { - "id": 10, "config_name": "用户协议", "config_key": "sys_web_clause", "config_value": "https://github.com/1014TaoTao/fastapi_vue3_admin/blob/master/LICENSE", @@ -90,7 +80,6 @@ "creator_id": 1 }, { - "id": 11, "config_name": "源码代码", "config_key": "sys_git_code", "config_value": "https://github.com/1014TaoTao/fastapi_vue3_admin.git", @@ -99,7 +88,6 @@ "creator_id": 1 }, { - "id": 12, "config_name": "项目版本", "config_key": "sys_web_version", "config_value": "2.0.0", diff --git a/backend/app/scripts/data/system_menu.json b/backend/app/scripts/data/system_menu.json index 2a1aee67..783f0b92 100644 --- a/backend/app/scripts/data/system_menu.json +++ b/backend/app/scripts/data/system_menu.json @@ -2118,5 +2118,68 @@ "affix": false, "redirect": null, "description": "初始化数据" - } + }, + { + "id": 102, + "name": "AI大模型", + "type": 1, + "icon": "el-icon-DataLine", + "order": 8, + "permission": null, + "route_name": "AI", + "route_path": "/ai", + "component_path": null, + "parent_id": null, + "status": true, + "keep_alive": false, + "hidden": false, + "always_show": false, + "title": "AI大模型", + "params": null, + "affix": false, + "redirect": "/ai/mcp", + "description": "AI大模型管理" + }, + { + "id": 103, + "name": "MCP智能助手", + "type": 2, + "icon": "el-icon-DataLine", + "order": 1, + "permission": "ai:mcp:chat", + "route_name": "MCP", + "route_path": "/ai/mcp", + "component_path": "ai/mcp/index", + "parent_id": 102, + "status": true, + "keep_alive": true, + "hidden": false, + "always_show": false, + "title": "MCP智能助手", + "params": null, + "affix": false, + "redirect": null, + "description": "MCP智能助手" + }, + { + "id": 104, + "name": "智能对话", + "type": 3, + "icon": null, + "order": 1, + "permission": "ai:mcp:chat", + "route_name": null, + "route_path": null, + "component_path": null, + "parent_id": 103, + "status": true, + "keep_alive": true, + "hidden": false, + "always_show": false, + "title": "智能对话", + "params": null, + "affix": false, + "redirect": null, + "description": "智能对话" + } ] \ No newline at end of file diff --git a/backend/app/scripts/data/system_position.json b/backend/app/scripts/data/system_position.json index c300711c..e9b6f2cc 100644 --- a/backend/app/scripts/data/system_position.json +++ b/backend/app/scripts/data/system_position.json @@ -1,6 +1,5 @@ [ { - "id": 1, "name": "董事长岗", "status": true, "order": 1, @@ -8,7 +7,6 @@ "creator_id": 1 }, { - "id": 2, "name": "运营岗", "status": true, "order": 2, @@ -16,7 +14,6 @@ "creator_id": 1 }, { - "id": 3, "name": "销售岗", "status": true, "order": 3, @@ -24,7 +21,6 @@ "creator_id": 1 }, { - "id": 4, "name": "人事行政岗", "status": true, "order": 4, @@ -32,7 +28,6 @@ "creator_id": 1 }, { - "id": 5, "name": "开发岗", "status": true, "order": 5, @@ -40,7 +35,6 @@ "creator_id": 1 }, { - "id": 6, "name": "测试岗", "status": true, "order": 6, @@ -48,7 +42,6 @@ "creator_id": 1 }, { - "id": 7, "name": "演示岗", "status": true, "order": 7, diff --git a/backend/app/scripts/data/system_role_menus.json b/backend/app/scripts/data/system_role_menus.json index 605e75d5..0e6e9f17 100644 --- a/backend/app/scripts/data/system_role_menus.json +++ b/backend/app/scripts/data/system_role_menus.json @@ -403,6 +403,18 @@ "role_id": 1, "menu_id": 101 }, + { + "role_id": 1, + "menu_id": 102 + }, + { + "role_id": 1, + "menu_id": 103 + }, + { + "role_id": 1, + "menu_id": 104 + }, { "role_id": 2, "menu_id": 1 diff --git a/backend/app/scripts/initialize.py b/backend/app/scripts/initialize.py index c1f0d8f4..571ed973 100644 --- a/backend/app/scripts/initialize.py +++ b/backend/app/scripts/initialize.py @@ -4,7 +4,7 @@ import uuid import json from pathlib import Path from typing import Dict, List -from sqlalchemy import inspect, select, func +from sqlalchemy import inspect, select, func, text from sqlalchemy.ext.asyncio import AsyncSession from app.core.base_model import MappedBase @@ -59,7 +59,25 @@ class InitializeData: RoleDeptsModel, RoleMenusModel, ] + # 需要更新序列的模型(排除关联表模型,因为它们没有id字段) + self.models_with_id = [ + DeptModel, + MenuModel, + UserModel, + RoleModel, + PositionModel, + ConfigModel, + DictTypeModel, + NoticeModel, + OperationLogModel, + DictDataModel, + JobModel, + JobLogModel, + DemoModel, + ApplicationModel, + ] self.created_tables = set() + async def __get_existing_tables(self, db: AsyncSession) -> List[str]: return await db.run_sync( lambda sync_db: inspect(sync_db.get_bind()).get_table_names() @@ -111,6 +129,41 @@ class InitializeData: except Exception as e: logger.error(f"初始化 {table_name} 表数据失败: {str(e)}") raise + + # 更新 PostgreSQL 序列值,确保自增 ID 正确 + if settings.DATABASE_TYPE == "postgresql": + await self.__update_postgresql_sequences(db) + + async def __update_postgresql_sequences(self, db: AsyncSession) -> None: + """更新 PostgreSQL 序列值,确保自增 ID 正确""" + try: + # 为每个有初始化数据的表更新序列值(只处理有id字段的模型) + for model in self.models_with_id: + table_name = model.__tablename__ + + # 检查表中是否有数据 + count_result = await db.execute(select(func.count()).select_from(model)) + existing_count = count_result.scalar() + + if existing_count > 0: + # 检查模型是否有id属性 + if not hasattr(model, 'id'): + continue + + # 获取表中最大的 ID 值 + max_id_result = await db.execute(select(func.max(model.id)).select_from(model)) + max_id = max_id_result.scalar() + + if max_id is not None: + # 更新序列值 + sequence_name = f"{table_name}_id_seq" + await db.execute(text(f"SELECT setval('{sequence_name}', {max_id}, true)")) + logger.info(f"已更新 {table_name} 表的序列 {sequence_name} 值为 {max_id}") + + await db.commit() + except Exception as e: + logger.error(f"更新 PostgreSQL 序列值失败: {str(e)}") + raise async def __get_data(self, filename: str) -> List[Dict]: """读取初始化数据文件""" @@ -132,5 +185,4 @@ class InitializeData: """ 执行完整初始化流程 """ - await self.__init_model(db) - + await self.__init_model(db) \ No newline at end of file diff --git a/backend/app/utils/ai_util.py b/backend/app/utils/ai_util.py new file mode 100644 index 00000000..64fa17fb --- /dev/null +++ b/backend/app/utils/ai_util.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- + +from openai import AsyncOpenAI, OpenAI +from openai.types.chat.chat_completion import ChatCompletion + +from app.config.setting import settings +from app.core.logger import logger + + +class AIClient: + + def __init__(self): + self.model = settings.QWEN_MODEL + # 使用默认的http客户端,避免资源管理问题 + self.client = AsyncOpenAI( + api_key=settings.QWEN_API_KEY, + base_url=settings.QWEN_BASE_URL, + ) + + async def process(self, query: str): + """处理查询并返回流式响应""" + system_prompt = """你是一个有用的AI助手,可以帮助用户回答问题和提供帮助。请用中文回答用户的问题。""" + + try: + # 使用 await 调用异步客户端 + response = await self.client.chat.completions.create( + model=self.model, + messages=[ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": query} + ], + stream=True + ) + + # 流式返回响应 + async for chunk in response: + if chunk.choices[0].delta.content is not None: + yield chunk.choices[0].delta.content + + except Exception as e: + logger.error(f"AI处理查询失败: {str(e)}") + yield f"抱歉,处理您的请求时出现了错误: {str(e)}" diff --git a/backend/app/utils/ip_local_util.py b/backend/app/utils/ip_local_util.py index e94b8ae1..6dde6aac 100644 --- a/backend/app/utils/ip_local_util.py +++ b/backend/app/utils/ip_local_util.py @@ -86,7 +86,7 @@ class IpLocalUtil: try: # 使用ip-api.com API获取IP归属地信息 - async with httpx.AsyncClient() as client: + async with httpx.AsyncClient(timeout=10.0) as client: # 尝试使用 ip9.com.cn API url = f'https://ip9.com.cn/get?ip={ip}' response = await cls._make_api_request(client, url) diff --git a/backend/env/.env.dev b/backend/env/.env.dev index a72cd026..228b5f45 100644 --- a/backend/env/.env.dev +++ b/backend/env/.env.dev @@ -36,17 +36,11 @@ SQLITE_DB_NAME = "dev_sql.db" # 数据库配置 DATABASE_HOST = "localhost" -DATABASE_PORT = 3306 # MySQL默认端口3006 PostgreSQL默认端口5432 -DATABASE_USER = "root" # postgresql默认用户名tao +DATABASE_PORT = 3306 # MySQL默认端口3006 PostgreSQL默认端口 5432 +DATABASE_USER = "root" # postgresql默认用户名 tao DATABASE_PASSWORD = "ServBay.dev" DATABASE_NAME = "fastapiadmin" -# DATABASE_HOST = "localhost" -# DATABASE_PORT = 5432 # MySQL默认端口3006 PostgreSQL默认端口5432 -# DATABASE_USER = "tao" # postgresql默认用户名tao -# DATABASE_PASSWORD = "ServBay.dev" -# DATABASE_NAME = "fastapiadmin" - # Redis配置 REDIS_ENABLE = True REDIS_HOST = "localhost" @@ -65,3 +59,8 @@ MONGO_DB_NAME = "admin" # 日志配置 LOGGER_LEVEL = 'DEBUG' # 日志级别 + +# https://bailian.console.aliyun.com/?spm=5176.29619931.J_AHgvE-XDhTWrtotIBlDQQ.13.74cd521clrmQ7o&tab=api#/api/?type=model&url=https%3A%2F%2Fhelp.aliyun.com%2Fdocument_detail%2F2712576.html&renderType=iframe +QWEN_BASE_URL = https://dashscope.aliyuncs.com/compatible-mode/v1 +QWEN_API_KEY = sk-e688534f2d984e7fa2eb46add409422f +QWEN_MODEL = qwen-plus \ No newline at end of file diff --git a/backend/env/.env.prod b/backend/env/.env.prod index bdf56d35..81aae2c8 100644 --- a/backend/env/.env.prod +++ b/backend/env/.env.prod @@ -35,7 +35,7 @@ DATABASE_TYPE = "mysql" # sqlite、mysql、postgresql SQLITE_DB_NAME = "prod_sql.db" # 数据库配置 -DATABASE_HOST = "localhost" +DATABASE_HOST = "172.18.52.77" DATABASE_PORT = 3306 # MySQL默认端口3006 PostgreSQL默认端口5432 DATABASE_USER = "root" # PostgreSQL 用户是 postgres DATABASE_PASSWORD = "FastApi123abc" @@ -59,3 +59,9 @@ MONGO_DB_NAME = "fastapiadmin" # 日志配置 LOGGER_LEVEL = 'INFO' # 日志级别 + + +# https://bailian.console.aliyun.com/?spm=5176.29619931.J_AHgvE-XDhTWrtotIBlDQQ.13.74cd521clrmQ7o&tab=api#/api/?type=model&url=https%3A%2F%2Fhelp.aliyun.com%2Fdocument_detail%2F2712576.html&renderType=iframe +QWEN_BASE_URL = https://dashscope.aliyuncs.com/compatible-mode/v1 +QWEN_API_KEY = sk-e688534f2d984e7fa2eb46add409422f +QWEN_MODEL = qwen-plus \ No newline at end of file diff --git a/backend/main.py b/backend/main.py index 7401f337..2962e64e 100755 --- a/backend/main.py +++ b/backend/main.py @@ -21,6 +21,7 @@ def create_app() -> FastAPI: register_middlewares, register_exceptions, register_routers, + register_fastapi_mcp, register_files, reset_api_docs, lifespan @@ -38,6 +39,8 @@ def create_app() -> FastAPI: register_files(app) # 重设API文档 reset_api_docs(app) + # 注册FastAPI-MCP + register_fastapi_mcp(app) return app diff --git a/backend/requirements.txt b/backend/requirements.txt index 2e773e64..419ba59d 100755 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -1,7 +1,8 @@ alembic==1.15.1 # 数据库迁移 APScheduler==3.11.0 # 定时任务 fastapi==0.115.2 -typer==0.7.0 +fastapi-mcp==0.4.0 +typer==0.9.0 click==8.1.7 uvicorn==0.30.6 # uvicorn web 框架 websockets==14.2 # websocket 框架 @@ -17,14 +18,13 @@ pydantic_validation_decorator==0.1.4 passlib==1.7.4 # 密码加密 user-agents==2.2.0 # 获取用户UA PyJWT==2.9.0 # OAuth2 -pydantic-settings==2.4.0 # 配置设置 +pydantic-settings==2.5.2 # 配置设置 psutil==6.1.0 # 系统信息 python-multipart==0.0.9 # request.form() 对表单进行「解析」时安装 greenlet==3.1.1 # 协程框架 bcrypt==4.0.1 # 密码加密解析 aiofiles==24.1.0 # 文件操作 -redis==5.2.1 # redis 同步操作数据库(用户celery配套使用) -# aioredis==2.0.1 # redis 异步操作数据库 redis已经完全具备了aioredis的功能,无需重复安全,且aioredis已经不再维护也不兼容3.10+的版本 +redis==5.2.1 # redis 同步操作数据库(用户celery配套使用)redis 异步操作数据库 redis已经完全具备了aioredis的功能,无需重复安全,且aioredis已经不再维护也不兼容3.10+的版本 aiosqlite==0.17.0 # sqlite 异步操作数据库 asyncmy==0.2.9 # mysql 异步操作数据库:基于 mysqlclient:asyncmy 是 mysqlclient 的异步版本,mysqlclient 是一个 C 语言编写的 MySQL 客户端,性能较高。性能:asyncmy 通常在性能上优于 aiomysql,特别是在高并发和大数据量的场景下。 motor==3.6.0 # mongodb 驱动 @@ -34,3 +34,4 @@ PyMySQL==1.1.2 # mysql 异步操作数据库基于 pymysql:aiomys cryptography==45.0.2 # mysql8 密码加密 openai==1.55.2 # ai 大模型 oss2==2.18.4 # 阿里云对象存储 +python-magic==0.4.27 # 文件类型识别 diff --git a/backend/sql/mysql/fastapi_vue_admin_2025-09-05_005325.sql b/backend/sql/mysql/fastapi_vue_admin_2025-09-05_005325.sql deleted file mode 100644 index 56ea56b3..00000000 --- a/backend/sql/mysql/fastapi_vue_admin_2025-09-05_005325.sql +++ /dev/null @@ -1,607 +0,0 @@ --- MySQL dump 10.13 Distrib 8.4.3, for macos14.5 (arm64) --- --- Host: 127.0.0.1 Database: fastapi_vue_admin --- ------------------------------------------------------ --- Server version 8.4.3 - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!50503 SET NAMES utf8mb4 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - --- --- Table structure for table `application_myapp` --- - -DROP TABLE IF EXISTS `application_myapp`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `application_myapp` ( - `name` varchar(64) NOT NULL COMMENT '应用名称', - `access_url` varchar(500) NOT NULL COMMENT '访问地址', - `icon_url` varchar(300) DEFAULT NULL COMMENT '应用图标URL', - `creator_id` int DEFAULT NULL COMMENT '创建人ID', - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `status` tinyint(1) NOT NULL COMMENT '是否启用(True:启用 False:禁用)', - `description` text COMMENT '备注说明', - `created_at` datetime NOT NULL COMMENT '创建时间', - `updated_at` datetime NOT NULL COMMENT '更新时间', - PRIMARY KEY (`id`), - UNIQUE KEY `name` (`name`), - KEY `ix_application_myapp_creator_id` (`creator_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='应用系统表'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `application_myapp` --- - -/*!40000 ALTER TABLE `application_myapp` DISABLE KEYS */; -/*!40000 ALTER TABLE `application_myapp` ENABLE KEYS */; - --- --- Table structure for table `example_demo` --- - -DROP TABLE IF EXISTS `example_demo`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `example_demo` ( - `name` varchar(64) DEFAULT NULL COMMENT '名称', - `creator_id` int DEFAULT NULL COMMENT '创建人ID', - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `status` tinyint(1) NOT NULL COMMENT '是否启用(True:启用 False:禁用)', - `description` text COMMENT '备注说明', - `created_at` datetime NOT NULL COMMENT '创建时间', - `updated_at` datetime NOT NULL COMMENT '更新时间', - PRIMARY KEY (`id`), - KEY `ix_example_demo_creator_id` (`creator_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='示例表'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `example_demo` --- - -/*!40000 ALTER TABLE `example_demo` DISABLE KEYS */; -/*!40000 ALTER TABLE `example_demo` ENABLE KEYS */; - --- --- Table structure for table `monitor_job` --- - -DROP TABLE IF EXISTS `monitor_job`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `monitor_job` ( - `name` varchar(64) DEFAULT NULL COMMENT '任务名称', - `jobstore` varchar(64) DEFAULT NULL COMMENT '存储器', - `executor` varchar(64) DEFAULT NULL COMMENT '执行器:将运行此作业的执行程序的名称', - `trigger` varchar(64) NOT NULL COMMENT '触发器:控制此作业计划的 trigger 对象', - `trigger_args` text COMMENT '触发器参数', - `func` text NOT NULL COMMENT '任务函数', - `args` text COMMENT '位置参数', - `kwargs` text COMMENT '关键字参数', - `coalesce` tinyint(1) DEFAULT NULL COMMENT '是否合并运行:是否在多个运行时间到期时仅运行作业一次', - `max_instances` int DEFAULT NULL COMMENT '最大实例数:允许的最大并发执行实例数 工作', - `start_date` varchar(64) DEFAULT NULL COMMENT '开始时间', - `end_date` varchar(64) DEFAULT NULL COMMENT '结束时间', - `creator_id` int DEFAULT NULL COMMENT '创建人ID', - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `status` tinyint(1) NOT NULL COMMENT '是否启用(True:启用 False:禁用)', - `description` text COMMENT '备注说明', - `created_at` datetime NOT NULL COMMENT '创建时间', - `updated_at` datetime NOT NULL COMMENT '更新时间', - PRIMARY KEY (`id`), - KEY `ix_monitor_job_creator_id` (`creator_id`) -) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='定时任务调度表'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `monitor_job` --- - -/*!40000 ALTER TABLE `monitor_job` DISABLE KEYS */; -INSERT INTO `monitor_job` VALUES ('系统默认(无参)','default','default','cron','0 0 12 * * ?','scheduler_test.job',NULL,NULL,0,1,NULL,NULL,1,1,0,NULL,'2025-09-05 00:53:14','2025-09-05 00:53:14'),('系统默认(有参)','default','default','cron','0 0 12 * * ?','scheduler_test.job','test',NULL,0,1,NULL,NULL,1,2,0,NULL,'2025-09-05 00:53:14','2025-09-05 00:53:14'),('系统默认(多参)','default','default','cron','0 0 12 * * ?','scheduler_test.job','new','{\"test\": 111}',0,1,NULL,NULL,1,3,0,NULL,'2025-09-05 00:53:14','2025-09-05 00:53:14'); -/*!40000 ALTER TABLE `monitor_job` ENABLE KEYS */; - --- --- Table structure for table `monitor_job_log` --- - -DROP TABLE IF EXISTS `monitor_job_log`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `monitor_job_log` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `job_name` varchar(64) NOT NULL COMMENT '任务名称', - `job_group` varchar(64) NOT NULL COMMENT '任务组名', - `job_executor` varchar(64) NOT NULL COMMENT '任务执行器', - `invoke_target` varchar(500) NOT NULL COMMENT '调用目标字符串', - `job_args` varchar(255) DEFAULT NULL COMMENT '位置参数', - `job_kwargs` varchar(255) DEFAULT NULL COMMENT '关键字参数', - `job_trigger` varchar(255) DEFAULT NULL COMMENT '任务触发器', - `job_message` varchar(500) DEFAULT NULL COMMENT '日志信息', - `exception_info` varchar(2000) DEFAULT NULL COMMENT '异常信息', - `job_id` int DEFAULT NULL COMMENT '任务ID', - PRIMARY KEY (`id`), - KEY `job_id` (`job_id`), - CONSTRAINT `monitor_job_log_ibfk_1` FOREIGN KEY (`job_id`) REFERENCES `monitor_job` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='定时任务调度日志表'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `monitor_job_log` --- - -/*!40000 ALTER TABLE `monitor_job_log` DISABLE KEYS */; -/*!40000 ALTER TABLE `monitor_job_log` ENABLE KEYS */; - --- --- Table structure for table `system_config` --- - -DROP TABLE IF EXISTS `system_config`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `system_config` ( - `config_name` varchar(500) NOT NULL COMMENT '参数名称', - `config_key` varchar(500) NOT NULL COMMENT '参数键名', - `config_value` varchar(500) DEFAULT NULL COMMENT '参数键值', - `config_type` tinyint(1) DEFAULT NULL COMMENT '系统内置(True:是 False:否)', - `creator_id` int DEFAULT NULL COMMENT '创建人ID', - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `status` tinyint(1) NOT NULL COMMENT '是否启用(True:启用 False:禁用)', - `description` text COMMENT '备注说明', - `created_at` datetime NOT NULL COMMENT '创建时间', - `updated_at` datetime NOT NULL COMMENT '更新时间', - PRIMARY KEY (`id`), - UNIQUE KEY `config_name` (`config_name`), - UNIQUE KEY `config_key` (`config_key`), - KEY `ix_system_config_creator_id` (`creator_id`) -) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='系统配置表'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `system_config` --- - -/*!40000 ALTER TABLE `system_config` DISABLE KEYS */; -INSERT INTO `system_config` VALUES ('网站名称','sys_web_title','FastAPI Vue3 Admin',1,1,1,1,'网站名称','2025-09-05 00:53:14','2025-09-05 00:53:14'),('网站描述','sys_web_description','FastAPI Vue3 Admin 是完全开源的权限管理系统',1,1,2,1,'网站描述','2025-09-05 00:53:14','2025-09-05 00:53:14'),('网页图标','sys_web_favicon','https://service.fastapiadmin.com/api/v1/static/image/favicon.png',1,1,3,1,'网页图标','2025-09-05 00:53:14','2025-09-05 00:53:14'),('网站Logo','sys_web_logo','https://service.fastapiadmin.com/api/v1/static/image/logo.png',1,1,4,1,'网站Logo','2025-09-05 00:53:14','2025-09-05 00:53:14'),('登录背景','sys_login_background','https://service.fastapiadmin.com/api/v1/static/image/background.svg',1,1,5,1,'登录背景','2025-09-05 00:53:14','2025-09-05 00:53:14'),('版权信息','sys_web_copyright','Copyright © 2025-2026 service.fastapiadmin.com 版权所有',1,1,6,1,'版权信息','2025-09-05 00:53:14','2025-09-05 00:53:14'),('备案信息','sys_keep_record','陕ICP备2025069493号-1',1,1,7,1,'备案信息','2025-09-05 00:53:14','2025-09-05 00:53:14'),('帮助文档','sys_help_doc','https://service.fastapiadmin.com',1,1,8,1,'帮助文档','2025-09-05 00:53:14','2025-09-05 00:53:14'),('隐私政策','sys_web_privacy','https://github.com/1014TaoTao/fastapi_vue3_admin/blob/master/LICENSE',1,1,9,1,'隐私政策','2025-09-05 00:53:14','2025-09-05 00:53:14'),('用户协议','sys_web_clause','https://github.com/1014TaoTao/fastapi_vue3_admin/blob/master/LICENSE',1,1,10,1,'用户协议','2025-09-05 00:53:14','2025-09-05 00:53:14'),('源码代码','sys_git_code','https://github.com/1014TaoTao/fastapi_vue3_admin.git',1,1,11,1,'源码代码','2025-09-05 00:53:14','2025-09-05 00:53:14'),('项目版本','sys_web_version','2.0.0',1,1,12,1,'项目版本','2025-09-05 00:53:14','2025-09-05 00:53:14'); -/*!40000 ALTER TABLE `system_config` ENABLE KEYS */; - --- --- Table structure for table `system_dept` --- - -DROP TABLE IF EXISTS `system_dept`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `system_dept` ( - `name` varchar(40) NOT NULL COMMENT '部门名称', - `order` int NOT NULL COMMENT '显示排序', - `parent_id` int DEFAULT NULL COMMENT '父级部门ID', - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `status` tinyint(1) NOT NULL COMMENT '是否启用(True:启用 False:禁用)', - `description` text COMMENT '备注说明', - `created_at` datetime NOT NULL COMMENT '创建时间', - `updated_at` datetime NOT NULL COMMENT '更新时间', - PRIMARY KEY (`id`), - UNIQUE KEY `name` (`name`), - KEY `ix_system_dept_parent_id` (`parent_id`), - CONSTRAINT `system_dept_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `system_dept` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='部门表'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `system_dept` --- - -/*!40000 ALTER TABLE `system_dept` DISABLE KEYS */; -INSERT INTO `system_dept` VALUES ('集团总公司',1,NULL,1,1,'集团总公司','2025-09-05 00:53:14','2025-09-05 00:53:14'),('西安分公司',1,1,2,1,'西安分公司','2025-09-05 00:53:14','2025-09-05 00:53:14'),('深圳分公司',2,1,3,1,'深圳分公司','2025-09-05 00:53:14','2025-09-05 00:53:14'),('开发组',1,2,4,1,'开发组','2025-09-05 00:53:14','2025-09-05 00:53:14'),('测试组',2,2,5,1,'测试组','2025-09-05 00:53:14','2025-09-05 00:53:14'),('演示组',3,2,6,1,'演示组','2025-09-05 00:53:14','2025-09-05 00:53:14'),('销售部',1,3,7,1,'销售部','2025-09-05 00:53:14','2025-09-05 00:53:14'),('市场部',2,3,8,1,'市场部','2025-09-05 00:53:14','2025-09-05 00:53:14'),('财务部',3,3,9,1,'财务部','2025-09-05 00:53:14','2025-09-05 00:53:14'),('研发部',4,3,10,1,'研发部','2025-09-05 00:53:14','2025-09-05 00:53:14'),('运维部',5,3,11,1,'研发部','2025-09-05 00:53:14','2025-09-05 00:53:14'); -/*!40000 ALTER TABLE `system_dept` ENABLE KEYS */; - --- --- Table structure for table `system_dict_data` --- - -DROP TABLE IF EXISTS `system_dict_data`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `system_dict_data` ( - `dict_sort` int NOT NULL COMMENT '字典排序', - `dict_label` varchar(100) NOT NULL COMMENT '字典标签', - `dict_value` varchar(100) NOT NULL COMMENT '字典键值', - `dict_type` varchar(100) NOT NULL COMMENT '字典类型', - `css_class` varchar(100) DEFAULT NULL COMMENT '样式属性(其他样式扩展)', - `list_class` varchar(100) DEFAULT NULL COMMENT '表格回显样式', - `is_default` tinyint(1) NOT NULL COMMENT '是否默认(True是 False否)', - `dict_type_id` int DEFAULT NULL COMMENT '字典类型ID', - `creator_id` int DEFAULT NULL COMMENT '创建人ID', - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `status` tinyint(1) NOT NULL COMMENT '是否启用(True:启用 False:禁用)', - `description` text COMMENT '备注说明', - `created_at` datetime NOT NULL COMMENT '创建时间', - `updated_at` datetime NOT NULL COMMENT '更新时间', - PRIMARY KEY (`id`), - KEY `dict_type_id` (`dict_type_id`), - KEY `ix_system_dict_data_creator_id` (`creator_id`), - CONSTRAINT `system_dict_data_ibfk_1` FOREIGN KEY (`dict_type_id`) REFERENCES `system_dict_type` (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='字典数据表'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `system_dict_data` --- - -/*!40000 ALTER TABLE `system_dict_data` DISABLE KEYS */; -INSERT INTO `system_dict_data` VALUES (1,'男','0','sys_user_sex','blue',NULL,1,NULL,1,1,1,'性别男','2025-09-05 00:53:14','2025-09-05 00:53:14'),(2,'女','1','sys_user_sex','pink',NULL,0,NULL,1,2,1,'性别女','2025-09-05 00:53:14','2025-09-05 00:53:14'),(3,'未知','2','sys_user_sex','red',NULL,0,NULL,1,3,1,'性别未知','2025-09-05 00:53:14','2025-09-05 00:53:14'),(1,'启用','1','sys_common_status','','primary',0,NULL,1,4,1,'启用状态','2025-09-05 00:53:14','2025-09-05 00:53:14'),(2,'停用','0','sys_common_status','','danger',0,NULL,1,5,1,'停用状态','2025-09-05 00:53:14','2025-09-05 00:53:14'),(1,'是','1','sys_yes_no','','primary',1,NULL,1,6,1,'是','2025-09-05 00:53:14','2025-09-05 00:53:14'),(2,'否','0','sys_yes_no','','danger',0,NULL,1,7,1,'否','2025-09-05 00:53:14','2025-09-05 00:53:14'),(99,'其他','0','sys_oper_type','','info',0,NULL,1,8,1,'其他操作','2025-09-05 00:53:14','2025-09-05 00:53:14'),(1,'新增','1','sys_oper_type','','info',0,NULL,1,9,1,'新增操作','2025-09-05 00:53:14','2025-09-05 00:53:14'),(2,'修改','2','sys_oper_type','','info',0,NULL,1,10,1,'修改操作','2025-09-05 00:53:14','2025-09-05 00:53:14'),(3,'删除','3','sys_oper_type','','danger',0,NULL,1,11,1,'删除操作','2025-09-05 00:53:14','2025-09-05 00:53:14'),(4,'分配权限','4','sys_oper_type','','primary',0,NULL,1,12,1,'授权操作','2025-09-05 00:53:14','2025-09-05 00:53:14'),(5,'导出','5','sys_oper_type','','warning',0,NULL,1,13,1,'导出操作','2025-09-05 00:53:14','2025-09-05 00:53:14'),(6,'导入','6','sys_oper_type','','warning',0,NULL,1,14,1,'导入操作','2025-09-05 00:53:14','2025-09-05 00:53:14'),(7,'强退','7','sys_oper_type','','danger',0,NULL,1,15,1,'强退操作','2025-09-05 00:53:14','2025-09-05 00:53:14'),(8,'生成代码','8','sys_oper_type','','warning',0,NULL,1,16,1,'生成操作','2025-09-05 00:53:14','2025-09-05 00:53:14'),(9,'清空数据','9','sys_oper_type','','danger',0,NULL,1,17,1,'清空操作','2025-09-05 00:53:14','2025-09-05 00:53:14'),(1,'通知','1','sys_notice_type','blue','warning',1,NULL,1,18,1,'通知','2025-09-05 00:53:14','2025-09-05 00:53:14'),(2,'公告','2','sys_notice_type','orange','success',0,NULL,1,19,1,'公告','2025-09-05 00:53:14','2025-09-05 00:53:14'),(1,'默认(Memory)','default','sys_job_store','',NULL,1,NULL,1,20,1,'默认分组','2025-09-05 00:53:14','2025-09-05 00:53:14'),(2,'数据库(Sqlalchemy)','sqlalchemy','sys_job_store','',NULL,0,NULL,1,21,1,'数据库分组','2025-09-05 00:53:14','2025-09-05 00:53:14'),(3,'数据库(Redis)','redis','sys_job_store','',NULL,0,NULL,1,22,1,'reids分组','2025-09-05 00:53:14','2025-09-05 00:53:14'),(1,'线程池','default','sys_job_executor','',NULL,0,NULL,1,23,1,'线程池','2025-09-05 00:53:14','2025-09-05 00:53:14'),(2,'进程池','processpool','sys_job_executor','',NULL,0,NULL,1,24,1,'进程池','2025-09-05 00:53:14','2025-09-05 00:53:14'),(1,'演示函数','scheduler_test.job','sys_job_function','',NULL,1,NULL,1,25,1,'演示函数','2025-09-05 00:53:14','2025-09-05 00:53:14'),(1,'指定日期(date)','date','sys_job_trigger','',NULL,1,NULL,1,26,1,'指定日期任务触发器','2025-09-05 00:53:14','2025-09-05 00:53:14'),(2,'间隔触发器(interval)','interval','sys_job_trigger','',NULL,0,NULL,1,27,1,'间隔触发器任务触发器','2025-09-05 00:53:14','2025-09-05 00:53:14'),(3,'cron表达式','cron','sys_job_trigger','',NULL,0,NULL,1,28,1,'间隔触发器任务触发器','2025-09-05 00:53:14','2025-09-05 00:53:14'),(1,'默认(default)','default','sys_list_class','',NULL,1,NULL,1,29,1,'默认表格回显样式','2025-09-05 00:53:14','2025-09-05 00:53:14'),(2,'主要(primary)','primary','sys_list_class','',NULL,0,NULL,1,30,1,'主要表格回显样式','2025-09-05 00:53:14','2025-09-05 00:53:14'),(3,'成功(success)','success','sys_list_class','',NULL,0,NULL,1,31,1,'成功表格回显样式','2025-09-05 00:53:14','2025-09-05 00:53:14'),(4,'信息(info)','info','sys_list_class','',NULL,0,NULL,1,32,1,'信息表格回显样式','2025-09-05 00:53:14','2025-09-05 00:53:14'),(5,'警告(warning)','warning','sys_list_class','',NULL,0,NULL,1,33,1,'警告表格回显样式','2025-09-05 00:53:14','2025-09-05 00:53:14'),(6,'危险(danger)','danger','sys_list_class','',NULL,0,NULL,1,34,1,'危险表格回显样式','2025-09-05 00:53:14','2025-09-05 00:53:14'); -/*!40000 ALTER TABLE `system_dict_data` ENABLE KEYS */; - --- --- Table structure for table `system_dict_type` --- - -DROP TABLE IF EXISTS `system_dict_type`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `system_dict_type` ( - `dict_name` varchar(100) NOT NULL COMMENT '字典名称', - `dict_type` varchar(100) NOT NULL COMMENT '字典类型', - `creator_id` int DEFAULT NULL COMMENT '创建人ID', - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `status` tinyint(1) NOT NULL COMMENT '是否启用(True:启用 False:禁用)', - `description` text COMMENT '备注说明', - `created_at` datetime NOT NULL COMMENT '创建时间', - `updated_at` datetime NOT NULL COMMENT '更新时间', - PRIMARY KEY (`id`), - UNIQUE KEY `dict_name` (`dict_name`), - UNIQUE KEY `dict_type` (`dict_type`), - KEY `ix_system_dict_type_creator_id` (`creator_id`) -) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='字典类型表'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `system_dict_type` --- - -/*!40000 ALTER TABLE `system_dict_type` DISABLE KEYS */; -INSERT INTO `system_dict_type` VALUES ('用户性别','sys_user_sex',1,1,1,'用户性别列表','2025-09-05 00:53:14','2025-09-05 00:53:14'),('系统是否','sys_yes_no',1,2,1,'系统是否列表','2025-09-05 00:53:14','2025-09-05 00:53:14'),('系统状态','sys_common_status',1,3,1,'系统状态','2025-09-05 00:53:14','2025-09-05 00:53:14'),('通知类型','sys_notice_type',1,4,1,'通知类型列表','2025-09-05 00:53:14','2025-09-05 00:53:14'),('操作类型','sys_oper_type',1,5,1,'操作类型列表','2025-09-05 00:53:14','2025-09-05 00:53:14'),('任务存储器','sys_job_store',1,6,1,'任务分组列表','2025-09-05 00:53:14','2025-09-05 00:53:14'),('任务执行器','sys_job_executor',1,7,1,'任务执行器列表','2025-09-05 00:53:14','2025-09-05 00:53:14'),('任务函数','sys_job_function',1,8,1,'任务函数列表','2025-09-05 00:53:14','2025-09-05 00:53:14'),('任务触发器','sys_job_trigger',1,9,1,'任务触发器列表','2025-09-05 00:53:14','2025-09-05 00:53:14'),('表格回显样式','sys_list_class',1,10,1,'表格回显样式列表','2025-09-05 00:53:14','2025-09-05 00:53:14'); -/*!40000 ALTER TABLE `system_dict_type` ENABLE KEYS */; - --- --- Table structure for table `system_log` --- - -DROP TABLE IF EXISTS `system_log`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `system_log` ( - `type` int NOT NULL COMMENT '日志类型(1登录日志 2操作日志)', - `request_path` varchar(255) NOT NULL COMMENT '请求路径', - `request_method` varchar(10) NOT NULL COMMENT '请求方式', - `request_payload` text COMMENT '请求体', - `request_ip` varchar(50) DEFAULT NULL COMMENT '请求IP地址', - `login_location` varchar(255) DEFAULT NULL COMMENT '登录位置', - `request_os` varchar(64) DEFAULT NULL COMMENT '操作系统', - `request_browser` varchar(64) DEFAULT NULL COMMENT '浏览器', - `response_code` int NOT NULL COMMENT '响应状态码', - `response_json` text COMMENT '响应体', - `process_time` varchar(20) DEFAULT NULL COMMENT '处理时间', - `creator_id` int DEFAULT NULL COMMENT '创建人ID', - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `status` tinyint(1) NOT NULL COMMENT '是否启用(True:启用 False:禁用)', - `description` text COMMENT '备注说明', - `created_at` datetime NOT NULL COMMENT '创建时间', - `updated_at` datetime NOT NULL COMMENT '更新时间', - PRIMARY KEY (`id`), - KEY `ix_system_log_creator_id` (`creator_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='系统日志表'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `system_log` --- - -/*!40000 ALTER TABLE `system_log` DISABLE KEYS */; -/*!40000 ALTER TABLE `system_log` ENABLE KEYS */; - --- --- Table structure for table `system_menu` --- - -DROP TABLE IF EXISTS `system_menu`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `system_menu` ( - `name` varchar(50) NOT NULL COMMENT '菜单名称', - `type` int NOT NULL COMMENT '菜单类型(1:目录 2:菜单 3:按钮/权限 4:链接)', - `order` int NOT NULL COMMENT '显示排序', - `permission` varchar(100) DEFAULT NULL COMMENT '权限标识(如:system:user:list)', - `icon` varchar(50) DEFAULT NULL COMMENT '菜单图标', - `route_name` varchar(100) DEFAULT NULL COMMENT '路由名称', - `route_path` varchar(200) DEFAULT NULL COMMENT '路由路径', - `component_path` varchar(200) DEFAULT NULL COMMENT '组件路径', - `redirect` varchar(200) DEFAULT NULL COMMENT '重定向地址', - `hidden` tinyint(1) NOT NULL COMMENT '是否隐藏(True:隐藏 False:显示)', - `keep_alive` tinyint(1) NOT NULL COMMENT '是否缓存(True:是 False:否)', - `always_show` tinyint(1) NOT NULL COMMENT '是否始终显示(True:是 False:否)', - `title` varchar(50) DEFAULT NULL COMMENT '菜单标题', - `params` json DEFAULT NULL COMMENT '路由参数(JSON对象)', - `affix` tinyint(1) NOT NULL COMMENT '是否固定标签页(True:是 False:否)', - `parent_id` int DEFAULT NULL COMMENT '父菜单ID', - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `status` tinyint(1) NOT NULL COMMENT '是否启用(True:启用 False:禁用)', - `description` text COMMENT '备注说明', - `created_at` datetime NOT NULL COMMENT '创建时间', - `updated_at` datetime NOT NULL COMMENT '更新时间', - PRIMARY KEY (`id`), - UNIQUE KEY `name` (`name`), - KEY `ix_system_menu_parent_id` (`parent_id`), - CONSTRAINT `system_menu_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `system_menu` (`id`) ON DELETE SET NULL -) ENGINE=InnoDB AUTO_INCREMENT=102 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='菜单表'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `system_menu` --- - -/*!40000 ALTER TABLE `system_menu` DISABLE KEYS */; -INSERT INTO `system_menu` VALUES ('仪表盘',1,1,'','client','Dashboard','/dashboard',NULL,'/dashboard/workplace',0,1,1,'仪表盘','null',0,NULL,1,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('工作台',2,1,'dashboard:workplace:query','homepage','Workplace','/dashboard/workplace','dashboard/workplace',NULL,0,1,0,'工作台','null',1,1,2,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('分析页',2,2,'dashboard:analysis:query','el-icon-PieChart','Analysis','/dashboard/analysis','dashboard/analysis',NULL,0,1,0,'分析页','null',0,1,3,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('系统管理',1,2,NULL,'system','System','/system',NULL,'/system/menu',0,1,0,'系统管理','null',0,NULL,4,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('菜单管理',2,1,'system:menu:query','menu','Menu','/system/menu','system/menu/index',NULL,0,1,0,'菜单管理','null',0,4,5,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('部门管理',2,2,'system:dept:query','tree','Dept','/system/dept','system/dept/index',NULL,0,1,0,'部门管理','null',0,4,6,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('岗位管理',2,3,'system:position:query','el-icon-Coordinate','Position','/system/position','system/position/index',NULL,0,1,0,'岗位管理','null',0,4,7,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('角色管理',2,4,'system:role:query','role','Role','/system/role','system/role/index',NULL,0,1,0,'角色管理','null',0,4,8,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('用户管理',2,5,'system:user:query','el-icon-User','User','/system/user','system/user/index',NULL,0,1,0,'用户管理','null',0,4,9,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('日志管理',2,6,'system:log:query','el-icon-Aim','Log','/system/log','system/log/index',NULL,0,1,0,'日志管理','null',0,4,10,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('公告管理',2,7,'system:notice:query','bell','Notice','/system/notice','system/notice/index',NULL,0,1,0,'公告管理','null',0,4,11,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('配置管理',2,8,'system:config:query','setting','Config','/system/config','system/config/index',NULL,0,1,0,'配置管理','null',0,4,12,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('字典管理',2,9,'system:dict_type:query','dict','Dict','/system/dict','system/dict/index',NULL,0,1,0,'字典管理','null',0,4,13,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('创建菜单',3,1,'system:menu:create',NULL,NULL,NULL,NULL,NULL,0,1,0,'创建菜单','null',0,5,14,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('修改菜单',3,2,'system:menu:update',NULL,NULL,NULL,NULL,NULL,0,1,0,'修改菜单','null',0,5,15,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('删除菜单',3,3,'system:menu:delete',NULL,NULL,NULL,NULL,NULL,0,1,0,'删除菜单','null',0,5,16,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('批量修改菜单状态',3,4,'system:menu:patch',NULL,NULL,NULL,NULL,NULL,0,1,0,'批量修改菜单状态','null',0,5,17,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('创建部门',3,1,'system:dept:create',NULL,NULL,NULL,NULL,NULL,0,1,0,'创建部门','null',0,6,18,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('修改部门',3,2,'system:dept:update',NULL,NULL,NULL,NULL,NULL,0,1,0,'修改部门','null',0,6,19,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('删除部门',3,3,'system:dept:delete',NULL,NULL,NULL,NULL,NULL,0,1,0,'删除部门','null',0,6,20,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('批量修改部门状态',3,4,'system:dept:patch',NULL,NULL,NULL,NULL,NULL,0,1,0,'批量修改部门状态','null',0,6,21,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('创建岗位',3,1,'system:position:create',NULL,NULL,NULL,NULL,NULL,0,1,0,'创建岗位','null',0,7,22,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('修改岗位',3,2,'system:position:update',NULL,NULL,NULL,NULL,NULL,0,1,0,'修改岗位','null',0,7,23,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('删除岗位',3,3,'system:position:delete',NULL,NULL,NULL,NULL,NULL,0,1,0,'修改岗位','null',0,7,24,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('批量修改岗位状态',3,4,'system:position:patch',NULL,NULL,NULL,NULL,NULL,0,1,0,'批量修改岗位状态','null',0,7,25,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('岗位导出',3,5,'system:position:export',NULL,NULL,NULL,NULL,NULL,0,1,0,'岗位导出','null',0,7,26,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('创建角色',3,1,'system:role:create',NULL,NULL,NULL,NULL,NULL,0,1,0,'创建角色','null',0,8,27,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('修改角色',3,2,'system:role:update',NULL,NULL,NULL,NULL,NULL,0,1,0,'修改角色','null',0,8,28,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('删除角色',3,3,'system:role:delete',NULL,NULL,NULL,NULL,NULL,0,1,0,'删除角色','null',0,8,29,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('批量修改角色状态',3,4,'system:role:patch',NULL,NULL,NULL,NULL,NULL,0,1,0,'批量修改角色状态','null',0,8,30,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('设置角色权限',3,8,'system:role:permission',NULL,NULL,NULL,NULL,NULL,0,1,0,'设置角色权限','null',0,7,31,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('角色导出',3,6,'system:role:export',NULL,NULL,NULL,NULL,NULL,0,1,0,'角色导出','null',0,8,32,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('创建用户',3,1,'system:user:create',NULL,NULL,NULL,NULL,NULL,0,1,0,'创建用户','null',0,9,33,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('修改用户',3,2,'system:user:update',NULL,NULL,NULL,NULL,NULL,0,1,0,'修改用户','null',0,9,34,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('删除用户',3,3,'system:user:delete',NULL,NULL,NULL,NULL,NULL,0,1,0,'删除用户','null',0,9,35,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('批量修改用户状态',3,4,'system:user:patch',NULL,NULL,NULL,NULL,NULL,0,1,0,'批量修改用户状态','null',0,9,36,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('导出用户',3,5,'system:user:export',NULL,NULL,NULL,NULL,NULL,0,1,0,'导出用户','null',0,9,37,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('导入用户',3,6,'system:user:import',NULL,NULL,NULL,NULL,NULL,0,1,0,'导入用户','null',0,9,38,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('日志删除',3,1,'system:operation_log:delete',NULL,NULL,NULL,NULL,NULL,0,1,0,'日志删除','null',0,10,39,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('日志导出',3,2,'system:operation_log:export',NULL,NULL,NULL,NULL,NULL,0,1,0,'日志导出','null',0,10,40,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('公告创建',3,1,'system:notice:create',NULL,NULL,NULL,NULL,NULL,0,1,0,'公告创建','null',0,11,41,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('公告修改',3,2,'system:notice:update',NULL,NULL,NULL,NULL,NULL,0,1,0,'修改用户','null',0,11,42,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('公告删除',3,3,'system:notice:delete',NULL,NULL,NULL,NULL,NULL,0,1,0,'公告删除','null',0,11,43,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('公告导出',3,4,'system:notice:export',NULL,NULL,NULL,NULL,NULL,0,1,0,'公告导出','null',0,11,44,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('公告批量修改状态',3,5,'system:notice:patch',NULL,NULL,NULL,NULL,NULL,0,1,0,'公告批量修改状态','null',0,11,45,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('创建配置',3,1,'system:config:create',NULL,NULL,NULL,NULL,NULL,0,1,0,'创建配置','null',0,12,46,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('修改配置',3,2,'system:config:update',NULL,NULL,NULL,NULL,NULL,0,1,0,'修改配置','null',0,12,47,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('删除配置',3,3,'system:config:delete',NULL,NULL,NULL,NULL,NULL,0,1,0,'删除配置','null',0,12,48,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('导出配置',3,4,'system:config:export',NULL,NULL,NULL,NULL,NULL,0,1,0,'导出配置','null',0,12,49,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('配置上传',3,5,'system:config:upload',NULL,NULL,NULL,NULL,NULL,0,1,0,'配置上传','null',0,12,50,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('创建字典类型',3,1,'system:dict_type:create',NULL,NULL,NULL,NULL,NULL,0,1,0,'创建字典类型','null',0,13,51,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('修改字典类型',3,2,'system:dict_type:update',NULL,NULL,NULL,NULL,NULL,0,1,0,'修改字典类型','null',0,13,52,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('删除字典类型',3,3,'system:dict_type:delete',NULL,NULL,NULL,NULL,NULL,0,1,0,'删除字典类型','null',0,13,53,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('导出字典类型',3,4,'system:dict_type:export',NULL,NULL,NULL,NULL,NULL,0,1,0,'导出字典类型','null',0,13,54,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('批量修改字典状态',3,5,'system:dict_type:patch',NULL,NULL,NULL,NULL,NULL,0,1,0,'导出字典类型','null',0,13,55,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('字典数据查询',3,6,'system:dict_data:query',NULL,NULL,NULL,NULL,NULL,0,1,0,'字典数据查询','null',0,13,56,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('创建字典数据',3,7,'system:dict_data:create',NULL,NULL,NULL,NULL,NULL,0,1,0,'创建字典数据','null',0,13,57,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('修改字典数据',3,8,'system:dict_data:update',NULL,NULL,NULL,NULL,NULL,0,1,0,'修改字典数据','null',0,13,58,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('删除字典数据',3,9,'system:dict_data:delete',NULL,NULL,NULL,NULL,NULL,0,1,0,'删除字典数据','null',0,13,59,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('导出字典数据',3,10,'system:dict_data:export',NULL,NULL,NULL,NULL,NULL,0,1,0,'导出字典数据','null',0,13,60,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('批量修改字典数据状态',3,11,'system:dict_data:patch',NULL,NULL,NULL,NULL,NULL,0,1,0,'批量修改字典数据状态','null',0,13,61,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('监控管理',1,3,NULL,'monitor','Monitor','/monitor',NULL,'/monitor/online',0,0,0,'监控管理','null',0,NULL,62,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('任务管理',2,1,'monitor:job:query','el-icon-DataLine','Job','/monitor/job','monitor/job/index',NULL,0,1,0,'任务管理','null',0,62,63,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('创建任务',3,1,'monitor:job:create',NULL,NULL,NULL,NULL,NULL,0,1,0,'创建任务','null',0,63,64,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('修改和操作任务',3,2,'monitor:job:update',NULL,NULL,NULL,NULL,NULL,0,1,0,'修改和操作任务','null',0,63,65,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('删除和清除任务',3,3,'monitor:job:delete',NULL,NULL,NULL,NULL,NULL,0,1,0,'删除和清除任务','null',0,63,66,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('导出定时任务',3,4,'monitor:job:export',NULL,NULL,NULL,NULL,NULL,0,1,0,'导出定时任务','null',0,63,67,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('在线用户',2,2,'monitor:online:query','el-icon-Headset','MonitorOnline','/monitor/online','monitor/online/index',NULL,0,0,0,'在线用户','null',0,62,68,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('在线用户强制下线',3,1,'monitor:online:delete',NULL,NULL,NULL,NULL,NULL,0,0,0,'在线用户强制下线','null',0,68,69,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('服务器监控',2,3,'monitor:server:query','el-icon-Odometer','MonitorServer','/monitor/server','monitor/server/index',NULL,0,0,0,'服务器监控','null',0,62,70,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('缓存监控',2,4,'monitor:cache:query','el-icon-Stopwatch','MonitorCache','/monitor/cache','monitor/cache/index',NULL,0,0,0,'缓存监控','null',0,62,71,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('清除缓存',3,1,'monitor:cache:delete',NULL,NULL,NULL,NULL,NULL,0,0,0,'清除缓存','null',0,71,72,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('公共模块',1,4,NULL,'document','Common','/common',NULL,'/common/docs',0,0,0,'公共模块','null',0,NULL,73,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('接口管理',4,1,'common:docs:query','api','Docs','/common/docs','common/docs/index',NULL,0,0,0,'接口管理','null',0,73,74,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('文档管理',4,2,'common:redoc:query','el-icon-Document','Redoc','/common/redoc','common/redoc/index',NULL,0,0,0,'文档管理','null',0,73,75,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('演示模块',1,5,NULL,'el-icon-Document','Demo','/demo',NULL,'/demo/example',0,0,0,'演示模块','null',0,NULL,76,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('示例管理',2,1,'demo:example:query','el-icon-DataLine','Example','/demo/example','demo/example/index',NULL,0,1,0,'示例管理','null',0,76,77,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('创建示例',3,1,'demo:example:create',NULL,NULL,NULL,NULL,NULL,0,1,0,'创建示例','null',0,77,78,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('更新示例',3,2,'demo:example:update',NULL,NULL,NULL,NULL,NULL,0,1,0,'更新示例','null',0,77,79,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('删除示例',3,3,'demo:example:delete',NULL,NULL,NULL,NULL,NULL,0,1,0,'删除示例','null',0,77,80,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('批量修改示例状态',3,4,'demo:example:patch',NULL,NULL,NULL,NULL,NULL,0,1,0,'批量修改示例状态','null',0,77,81,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('导出示例',3,5,'demo:example:export',NULL,NULL,NULL,NULL,NULL,0,1,0,'导出示例','null',0,77,82,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('导入示例',3,6,'demo:example:import',NULL,NULL,NULL,NULL,NULL,0,1,0,'导入示例','null',0,77,83,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('下载导入示例模版',3,7,'demo:example:download',NULL,NULL,NULL,NULL,NULL,0,1,0,'下载导入示例模版','null',0,77,84,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('应用管理',1,6,NULL,'applications','Application','/application',NULL,'/application/myapp',0,0,0,'应用管理','null',0,NULL,85,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('我的应用',2,1,'application:myapp:query','system-application','ApplicationSystem','/application/myapp','application/myapp/index',NULL,0,1,0,'应用系统管理','null',0,85,86,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('创建应用',3,1,'application:myapp:create',NULL,NULL,NULL,NULL,NULL,0,1,0,'创建应用','null',0,86,87,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('修改应用',3,2,'application:myapp:update',NULL,NULL,NULL,NULL,NULL,0,1,0,'修改应用','null',0,86,88,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('删除应用',3,3,'application:myapp:delete',NULL,NULL,NULL,NULL,NULL,0,1,0,'删除应用','null',0,86,89,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('批量修改应用状态',3,4,'application:myapp:patch',NULL,NULL,NULL,NULL,NULL,0,1,0,'批量修改应用状态','null',0,86,90,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('资源管理',1,7,NULL,'folder','Resource','/resource',NULL,'/resource/file',0,0,0,'资源管理','null',0,NULL,91,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('文件管理',2,1,'resource:file:query','el-icon-FolderOpened','ResourceFile','/resource/file','resource/file/index',NULL,0,1,0,'文件管理','null',0,91,92,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('文件上传',3,1,'resource:file:upload',NULL,NULL,NULL,NULL,NULL,0,1,0,'文件上传','null',0,92,93,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('文件下载',3,2,'resource:file:download',NULL,NULL,NULL,NULL,NULL,0,1,0,'文件下载','null',0,92,94,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('文件删除',3,3,'resource:file:delete',NULL,NULL,NULL,NULL,NULL,0,1,0,'文件删除','null',0,92,95,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('文件移动',3,4,'resource:file:move',NULL,NULL,NULL,NULL,NULL,0,1,0,'文件移动','null',0,92,96,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('文件复制',3,5,'resource:file:copy',NULL,NULL,NULL,NULL,NULL,0,1,0,'文件复制','null',0,92,97,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('文件重命名',3,6,'resource:file:rename',NULL,NULL,NULL,NULL,NULL,0,1,0,'文件重命名','null',0,92,98,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('创建目录',3,7,'resource:file:create_dir',NULL,NULL,NULL,NULL,NULL,0,1,0,'创建目录','null',0,92,99,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('文件搜索',3,8,'resource:file:search',NULL,NULL,NULL,NULL,NULL,0,1,0,'文件搜索','null',0,92,100,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'),('导出文件列表',3,9,'resource:file:export',NULL,NULL,NULL,NULL,NULL,0,1,0,'导出文件列表','null',0,92,101,1,'初始化数据','2025-09-05 00:53:14','2025-09-05 00:53:14'); -/*!40000 ALTER TABLE `system_menu` ENABLE KEYS */; - --- --- Table structure for table `system_notice` --- - -DROP TABLE IF EXISTS `system_notice`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `system_notice` ( - `notice_title` varchar(50) NOT NULL COMMENT '公告标题', - `notice_type` varchar(50) NOT NULL COMMENT '公告类型(1通知 2公告)', - `notice_content` text COMMENT '公告内容', - `creator_id` int DEFAULT NULL COMMENT '创建人ID', - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `status` tinyint(1) NOT NULL COMMENT '是否启用(True:启用 False:禁用)', - `description` text COMMENT '备注说明', - `created_at` datetime NOT NULL COMMENT '创建时间', - `updated_at` datetime NOT NULL COMMENT '更新时间', - PRIMARY KEY (`id`), - KEY `ix_system_notice_creator_id` (`creator_id`) -) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='通知公告表'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `system_notice` --- - -/*!40000 ALTER TABLE `system_notice` DISABLE KEYS */; -INSERT INTO `system_notice` VALUES ('系统更新','1','2099年9月9日,晚上12:00,系统更新',1,1,1,'系统更新','2025-09-05 00:53:14','2025-09-05 00:53:14'),('系统维护','2','2099年9月9日,晚上12:00,系统维护',1,2,1,'系统维护','2025-09-05 00:53:14','2025-09-05 00:53:14'),('系统更新完成','1','2099年9月9日,晚上12:00,系统更新完成',1,3,0,'系统更新完成','2025-09-05 00:53:14','2025-09-05 00:53:14'),('系统维护完成','2','2099年9月9日,晚上12:00,系统维护完成',1,4,0,'系统维护完成','2025-09-05 00:53:14','2025-09-05 00:53:14'); -/*!40000 ALTER TABLE `system_notice` ENABLE KEYS */; - --- --- Table structure for table `system_position` --- - -DROP TABLE IF EXISTS `system_position`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `system_position` ( - `name` varchar(40) NOT NULL COMMENT '岗位名称', - `order` int NOT NULL COMMENT '显示排序', - `creator_id` int DEFAULT NULL COMMENT '创建人ID', - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `status` tinyint(1) NOT NULL COMMENT '是否启用(True:启用 False:禁用)', - `description` text COMMENT '备注说明', - `created_at` datetime NOT NULL COMMENT '创建时间', - `updated_at` datetime NOT NULL COMMENT '更新时间', - PRIMARY KEY (`id`), - UNIQUE KEY `name` (`name`), - KEY `ix_system_position_creator_id` (`creator_id`) -) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='岗位表'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `system_position` --- - -/*!40000 ALTER TABLE `system_position` DISABLE KEYS */; -INSERT INTO `system_position` VALUES ('董事长岗',1,1,1,1,'董事长岗位','2025-09-05 00:53:14','2025-09-05 00:53:14'),('运营岗',2,1,2,1,'运营岗位','2025-09-05 00:53:14','2025-09-05 00:53:14'),('销售岗',3,1,3,1,'销售岗','2025-09-05 00:53:14','2025-09-05 00:53:14'),('人事行政岗',4,1,4,1,'人事行政岗','2025-09-05 00:53:14','2025-09-05 00:53:14'),('开发岗',5,1,5,1,'开发岗','2025-09-05 00:53:14','2025-09-05 00:53:14'),('测试岗',6,1,6,1,'测试岗','2025-09-05 00:53:14','2025-09-05 00:53:14'),('演示岗',7,1,7,1,'演示岗','2025-09-05 00:53:14','2025-09-05 00:53:14'); -/*!40000 ALTER TABLE `system_position` ENABLE KEYS */; - --- --- Table structure for table `system_role` --- - -DROP TABLE IF EXISTS `system_role`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `system_role` ( - `name` varchar(40) NOT NULL COMMENT '角色名称', - `code` varchar(20) DEFAULT NULL COMMENT '角色编码', - `order` int NOT NULL COMMENT '显示排序', - `data_scope` int NOT NULL COMMENT '数据权限范围', - `creator_id` int DEFAULT NULL COMMENT '创建人ID', - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `status` tinyint(1) NOT NULL COMMENT '是否启用(True:启用 False:禁用)', - `description` text COMMENT '备注说明', - `created_at` datetime NOT NULL COMMENT '创建时间', - `updated_at` datetime NOT NULL COMMENT '更新时间', - PRIMARY KEY (`id`), - UNIQUE KEY `name` (`name`), - UNIQUE KEY `code` (`code`), - KEY `ix_system_role_creator_id` (`creator_id`) -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='角色表'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `system_role` --- - -/*!40000 ALTER TABLE `system_role` DISABLE KEYS */; -INSERT INTO `system_role` VALUES ('管理员角色',NULL,1,4,1,1,1,'管理员','2025-09-05 00:53:14','2025-09-05 00:53:14'),('普通角色',NULL,2,1,1,2,1,'普通角色','2025-09-05 00:53:14','2025-09-05 00:53:14'); -/*!40000 ALTER TABLE `system_role` ENABLE KEYS */; - --- --- Table structure for table `system_role_depts` --- - -DROP TABLE IF EXISTS `system_role_depts`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `system_role_depts` ( - `role_id` int NOT NULL COMMENT '角色ID', - `dept_id` int NOT NULL COMMENT '部门ID', - PRIMARY KEY (`role_id`,`dept_id`), - KEY `dept_id` (`dept_id`), - CONSTRAINT `system_role_depts_ibfk_1` FOREIGN KEY (`role_id`) REFERENCES `system_role` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `system_role_depts_ibfk_2` FOREIGN KEY (`dept_id`) REFERENCES `system_dept` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='角色部门关联表'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `system_role_depts` --- - -/*!40000 ALTER TABLE `system_role_depts` DISABLE KEYS */; -INSERT INTO `system_role_depts` VALUES (1,1),(2,1),(2,6); -/*!40000 ALTER TABLE `system_role_depts` ENABLE KEYS */; - --- --- Table structure for table `system_role_menus` --- - -DROP TABLE IF EXISTS `system_role_menus`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `system_role_menus` ( - `role_id` int NOT NULL COMMENT '角色ID', - `menu_id` int NOT NULL COMMENT '菜单ID', - PRIMARY KEY (`role_id`,`menu_id`), - KEY `menu_id` (`menu_id`), - CONSTRAINT `system_role_menus_ibfk_1` FOREIGN KEY (`role_id`) REFERENCES `system_role` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `system_role_menus_ibfk_2` FOREIGN KEY (`menu_id`) REFERENCES `system_menu` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='角色菜单关联表'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `system_role_menus` --- - -/*!40000 ALTER TABLE `system_role_menus` DISABLE KEYS */; -INSERT INTO `system_role_menus` VALUES (1,1),(2,1),(1,2),(2,2),(1,3),(1,4),(1,5),(1,6),(1,7),(1,8),(1,9),(1,10),(1,11),(1,12),(1,13),(1,14),(1,15),(1,16),(1,17),(1,18),(1,19),(1,20),(1,21),(1,22),(1,23),(1,24),(1,25),(1,26),(1,27),(1,28),(1,29),(1,30),(1,31),(1,32),(1,33),(1,34),(1,35),(1,36),(1,37),(1,38),(1,39),(1,40),(1,41),(1,42),(1,43),(1,44),(1,45),(1,46),(1,47),(1,48),(1,49),(1,50),(1,51),(1,52),(1,53),(1,54),(1,55),(1,56),(1,57),(1,58),(1,59),(1,60),(1,61),(1,62),(1,63),(1,64),(1,65),(1,66),(1,67),(1,68),(1,69),(1,70),(1,71),(1,72),(1,73),(1,74),(1,75),(1,76),(1,77),(1,78),(1,79),(1,80),(1,81),(1,82),(1,83),(1,84),(1,85),(1,86),(1,87),(1,88),(1,89),(1,90); -/*!40000 ALTER TABLE `system_role_menus` ENABLE KEYS */; - --- --- Table structure for table `system_user_positions` --- - -DROP TABLE IF EXISTS `system_user_positions`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `system_user_positions` ( - `user_id` int NOT NULL COMMENT '用户ID', - `position_id` int NOT NULL COMMENT '岗位ID', - PRIMARY KEY (`user_id`,`position_id`), - KEY `position_id` (`position_id`), - CONSTRAINT `system_user_positions_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `system_users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `system_user_positions_ibfk_2` FOREIGN KEY (`position_id`) REFERENCES `system_position` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户岗位关联表'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `system_user_positions` --- - -/*!40000 ALTER TABLE `system_user_positions` DISABLE KEYS */; -INSERT INTO `system_user_positions` VALUES (3,1),(1,5),(2,7); -/*!40000 ALTER TABLE `system_user_positions` ENABLE KEYS */; - --- --- Table structure for table `system_user_roles` --- - -DROP TABLE IF EXISTS `system_user_roles`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `system_user_roles` ( - `user_id` int NOT NULL COMMENT '用户ID', - `role_id` int NOT NULL COMMENT '角色ID', - PRIMARY KEY (`user_id`,`role_id`), - KEY `role_id` (`role_id`), - CONSTRAINT `system_user_roles_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `system_users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `system_user_roles_ibfk_2` FOREIGN KEY (`role_id`) REFERENCES `system_role` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户角色关联表'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `system_user_roles` --- - -/*!40000 ALTER TABLE `system_user_roles` DISABLE KEYS */; -INSERT INTO `system_user_roles` VALUES (1,1),(2,1),(3,1); -/*!40000 ALTER TABLE `system_user_roles` ENABLE KEYS */; - --- --- Table structure for table `system_users` --- - -DROP TABLE IF EXISTS `system_users`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `system_users` ( - `username` varchar(32) NOT NULL COMMENT '用户名/登录账号', - `password` varchar(255) NOT NULL COMMENT '密码哈希', - `name` varchar(32) NOT NULL COMMENT '昵称', - `mobile` varchar(20) DEFAULT NULL COMMENT '手机号', - `email` varchar(64) DEFAULT NULL COMMENT '邮箱', - `gender` varchar(1) DEFAULT NULL COMMENT '性别(0:男 1:女 2:未知)', - `avatar` varchar(500) DEFAULT NULL COMMENT '头像URL地址', - `is_superuser` tinyint(1) NOT NULL COMMENT '是否超管', - `last_login` datetime DEFAULT NULL COMMENT '最后登录时间', - `dept_id` int DEFAULT NULL COMMENT '部门ID', - `creator_id` int DEFAULT NULL COMMENT '创建人ID', - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `status` tinyint(1) NOT NULL COMMENT '是否启用(True:启用 False:禁用)', - `description` text COMMENT '备注说明', - `created_at` datetime NOT NULL COMMENT '创建时间', - `updated_at` datetime NOT NULL COMMENT '更新时间', - PRIMARY KEY (`id`), - UNIQUE KEY `username` (`username`), - UNIQUE KEY `mobile` (`mobile`), - UNIQUE KEY `email` (`email`), - KEY `ix_system_users_dept_id` (`dept_id`), - KEY `ix_system_users_creator_id` (`creator_id`), - CONSTRAINT `system_users_ibfk_1` FOREIGN KEY (`dept_id`) REFERENCES `system_dept` (`id`) ON DELETE SET NULL ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户表'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `system_users` --- - -/*!40000 ALTER TABLE `system_users` DISABLE KEYS */; -INSERT INTO `system_users` VALUES ('superadmin','$2b$12$/Df5YczDGF41zCh2F8Xbu.yHTJXGm3tONgsXz1KLUdG0mtpKUOLD2','超级管理员','15382112620','948080782@qq.com','1','https://service.fastapiadmin.com/api/v1/static/image/avatar.png',1,NULL,1,NULL,1,1,'超级管理员','2025-09-05 00:53:14','2025-09-05 00:53:14'),('admin','$2b$12$e2IJgS/cvHgJ0H3G7Xa08OXoXnk6N/NX3IZRtubBDElA0VLZhkNOa','管理员','15382112222','admin@qq.com','0','https://service.fastapiadmin.com/api/v1/static/image/avatar.png',0,NULL,1,1,2,1,'管理员','2025-09-05 00:53:14','2025-09-05 00:53:14'),('demo','$2b$12$e2IJgS/cvHgJ0H3G7Xa08OXoXnk6N/NX3IZRtubBDElA0VLZhkNOa','演示用户','15382112121','demo@qq.com','1','https://service.fastapiadmin.com/api/v1/static/image/avatar.png',0,NULL,6,1,3,1,'演示用户','2025-09-05 00:53:14','2025-09-05 00:53:14'); -/*!40000 ALTER TABLE `system_users` ENABLE KEYS */; - --- --- Dumping routines for database 'fastapi_vue_admin' --- -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; - -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; - --- Dump completed on 2025-09-05 0:53:35 diff --git a/backend/sql/mysql/fastapiadmin_2025-09-08_220134.sql b/backend/sql/mysql/fastapiadmin_2025-09-08_220134.sql new file mode 100644 index 00000000..bda9bc83 --- /dev/null +++ b/backend/sql/mysql/fastapiadmin_2025-09-08_220134.sql @@ -0,0 +1,593 @@ +-- MySQL dump 10.13 Distrib 8.4.3, for macos14.5 (arm64) +-- +-- Host: 127.0.0.1 Database: fastapiadmin +-- ------------------------------------------------------ +-- Server version 8.4.3 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `application_myapp` +-- + +DROP TABLE IF EXISTS `application_myapp`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `application_myapp` ( + `name` varchar(64) NOT NULL COMMENT '应用名称', + `access_url` varchar(500) NOT NULL COMMENT '访问地址', + `icon_url` varchar(300) DEFAULT NULL COMMENT '应用图标URL', + `creator_id` int DEFAULT NULL COMMENT '创建人ID', + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `status` tinyint(1) NOT NULL COMMENT '是否启用(True:启用 False:禁用)', + `description` text COMMENT '备注说明', + `created_at` datetime NOT NULL COMMENT '创建时间', + `updated_at` datetime NOT NULL COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`), + KEY `ix_application_myapp_creator_id` (`creator_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='应用系统表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `application_myapp` +-- + +/*!40000 ALTER TABLE `application_myapp` DISABLE KEYS */; +/*!40000 ALTER TABLE `application_myapp` ENABLE KEYS */; + +-- +-- Table structure for table `example_demo` +-- + +DROP TABLE IF EXISTS `example_demo`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `example_demo` ( + `name` varchar(64) DEFAULT NULL COMMENT '名称', + `creator_id` int DEFAULT NULL COMMENT '创建人ID', + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `status` tinyint(1) NOT NULL COMMENT '是否启用(True:启用 False:禁用)', + `description` text COMMENT '备注说明', + `created_at` datetime NOT NULL COMMENT '创建时间', + `updated_at` datetime NOT NULL COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `ix_example_demo_creator_id` (`creator_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='示例表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `example_demo` +-- + +/*!40000 ALTER TABLE `example_demo` DISABLE KEYS */; +/*!40000 ALTER TABLE `example_demo` ENABLE KEYS */; + +-- +-- Table structure for table `monitor_job` +-- + +DROP TABLE IF EXISTS `monitor_job`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `monitor_job` ( + `name` varchar(64) DEFAULT NULL COMMENT '任务名称', + `jobstore` varchar(64) DEFAULT NULL COMMENT '存储器', + `executor` varchar(64) DEFAULT NULL COMMENT '执行器:将运行此作业的执行程序的名称', + `trigger` varchar(64) NOT NULL COMMENT '触发器:控制此作业计划的 trigger 对象', + `trigger_args` text COMMENT '触发器参数', + `func` text NOT NULL COMMENT '任务函数', + `args` text COMMENT '位置参数', + `kwargs` text COMMENT '关键字参数', + `coalesce` tinyint(1) DEFAULT NULL COMMENT '是否合并运行:是否在多个运行时间到期时仅运行作业一次', + `max_instances` int DEFAULT NULL COMMENT '最大实例数:允许的最大并发执行实例数 工作', + `start_date` varchar(64) DEFAULT NULL COMMENT '开始时间', + `end_date` varchar(64) DEFAULT NULL COMMENT '结束时间', + `creator_id` int DEFAULT NULL COMMENT '创建人ID', + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `status` tinyint(1) NOT NULL COMMENT '是否启用(True:启用 False:禁用)', + `description` text COMMENT '备注说明', + `created_at` datetime NOT NULL COMMENT '创建时间', + `updated_at` datetime NOT NULL COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `ix_monitor_job_creator_id` (`creator_id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='定时任务调度表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `monitor_job` +-- + +/*!40000 ALTER TABLE `monitor_job` DISABLE KEYS */; +/*!40000 ALTER TABLE `monitor_job` ENABLE KEYS */; + +-- +-- Table structure for table `monitor_job_log` +-- + +DROP TABLE IF EXISTS `monitor_job_log`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `monitor_job_log` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `job_name` varchar(64) NOT NULL COMMENT '任务名称', + `job_group` varchar(64) NOT NULL COMMENT '任务组名', + `job_executor` varchar(64) NOT NULL COMMENT '任务执行器', + `invoke_target` varchar(500) NOT NULL COMMENT '调用目标字符串', + `job_args` varchar(255) DEFAULT NULL COMMENT '位置参数', + `job_kwargs` varchar(255) DEFAULT NULL COMMENT '关键字参数', + `job_trigger` varchar(255) DEFAULT NULL COMMENT '任务触发器', + `job_message` varchar(500) DEFAULT NULL COMMENT '日志信息', + `exception_info` varchar(2000) DEFAULT NULL COMMENT '异常信息', + `job_id` int DEFAULT NULL COMMENT '任务ID', + PRIMARY KEY (`id`), + KEY `job_id` (`job_id`), + CONSTRAINT `monitor_job_log_ibfk_1` FOREIGN KEY (`job_id`) REFERENCES `monitor_job` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='定时任务调度日志表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `monitor_job_log` +-- + +/*!40000 ALTER TABLE `monitor_job_log` DISABLE KEYS */; +/*!40000 ALTER TABLE `monitor_job_log` ENABLE KEYS */; + +-- +-- Table structure for table `system_config` +-- + +DROP TABLE IF EXISTS `system_config`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `system_config` ( + `config_name` varchar(500) NOT NULL COMMENT '参数名称', + `config_key` varchar(500) NOT NULL COMMENT '参数键名', + `config_value` varchar(500) DEFAULT NULL COMMENT '参数键值', + `config_type` tinyint(1) DEFAULT NULL COMMENT '系统内置(True:是 False:否)', + `creator_id` int DEFAULT NULL COMMENT '创建人ID', + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `status` tinyint(1) NOT NULL COMMENT '是否启用(True:启用 False:禁用)', + `description` text COMMENT '备注说明', + `created_at` datetime NOT NULL COMMENT '创建时间', + `updated_at` datetime NOT NULL COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `config_name` (`config_name`), + UNIQUE KEY `config_key` (`config_key`), + KEY `ix_system_config_creator_id` (`creator_id`) +) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='系统配置表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `system_config` +-- + +/*!40000 ALTER TABLE `system_config` DISABLE KEYS */; +/*!40000 ALTER TABLE `system_config` ENABLE KEYS */; + +-- +-- Table structure for table `system_dept` +-- + +DROP TABLE IF EXISTS `system_dept`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `system_dept` ( + `name` varchar(40) NOT NULL COMMENT '部门名称', + `order` int NOT NULL COMMENT '显示排序', + `parent_id` int DEFAULT NULL COMMENT '父级部门ID', + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `status` tinyint(1) NOT NULL COMMENT '是否启用(True:启用 False:禁用)', + `description` text COMMENT '备注说明', + `created_at` datetime NOT NULL COMMENT '创建时间', + `updated_at` datetime NOT NULL COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`), + KEY `ix_system_dept_parent_id` (`parent_id`), + CONSTRAINT `system_dept_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `system_dept` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='部门表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `system_dept` +-- + +/*!40000 ALTER TABLE `system_dept` DISABLE KEYS */; +/*!40000 ALTER TABLE `system_dept` ENABLE KEYS */; + +-- +-- Table structure for table `system_dict_data` +-- + +DROP TABLE IF EXISTS `system_dict_data`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `system_dict_data` ( + `dict_sort` int NOT NULL COMMENT '字典排序', + `dict_label` varchar(100) NOT NULL COMMENT '字典标签', + `dict_value` varchar(100) NOT NULL COMMENT '字典键值', + `dict_type` varchar(100) NOT NULL COMMENT '字典类型', + `css_class` varchar(100) DEFAULT NULL COMMENT '样式属性(其他样式扩展)', + `list_class` varchar(100) DEFAULT NULL COMMENT '表格回显样式', + `is_default` tinyint(1) NOT NULL COMMENT '是否默认(True是 False否)', + `dict_type_id` int DEFAULT NULL COMMENT '字典类型ID', + `creator_id` int DEFAULT NULL COMMENT '创建人ID', + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `status` tinyint(1) NOT NULL COMMENT '是否启用(True:启用 False:禁用)', + `description` text COMMENT '备注说明', + `created_at` datetime NOT NULL COMMENT '创建时间', + `updated_at` datetime NOT NULL COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `dict_type_id` (`dict_type_id`), + KEY `ix_system_dict_data_creator_id` (`creator_id`), + CONSTRAINT `system_dict_data_ibfk_1` FOREIGN KEY (`dict_type_id`) REFERENCES `system_dict_type` (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='字典数据表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `system_dict_data` +-- + +/*!40000 ALTER TABLE `system_dict_data` DISABLE KEYS */; +/*!40000 ALTER TABLE `system_dict_data` ENABLE KEYS */; + +-- +-- Table structure for table `system_dict_type` +-- + +DROP TABLE IF EXISTS `system_dict_type`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `system_dict_type` ( + `dict_name` varchar(100) NOT NULL COMMENT '字典名称', + `dict_type` varchar(100) NOT NULL COMMENT '字典类型', + `creator_id` int DEFAULT NULL COMMENT '创建人ID', + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `status` tinyint(1) NOT NULL COMMENT '是否启用(True:启用 False:禁用)', + `description` text COMMENT '备注说明', + `created_at` datetime NOT NULL COMMENT '创建时间', + `updated_at` datetime NOT NULL COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `dict_name` (`dict_name`), + UNIQUE KEY `dict_type` (`dict_type`), + KEY `ix_system_dict_type_creator_id` (`creator_id`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='字典类型表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `system_dict_type` +-- + +/*!40000 ALTER TABLE `system_dict_type` DISABLE KEYS */; +/*!40000 ALTER TABLE `system_dict_type` ENABLE KEYS */; + +-- +-- Table structure for table `system_log` +-- + +DROP TABLE IF EXISTS `system_log`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `system_log` ( + `type` int NOT NULL COMMENT '日志类型(1登录日志 2操作日志)', + `request_path` varchar(255) NOT NULL COMMENT '请求路径', + `request_method` varchar(10) NOT NULL COMMENT '请求方式', + `request_payload` text COMMENT '请求体', + `request_ip` varchar(50) DEFAULT NULL COMMENT '请求IP地址', + `login_location` varchar(255) DEFAULT NULL COMMENT '登录位置', + `request_os` varchar(64) DEFAULT NULL COMMENT '操作系统', + `request_browser` varchar(64) DEFAULT NULL COMMENT '浏览器', + `response_code` int NOT NULL COMMENT '响应状态码', + `response_json` text COMMENT '响应体', + `process_time` varchar(20) DEFAULT NULL COMMENT '处理时间', + `creator_id` int DEFAULT NULL COMMENT '创建人ID', + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `status` tinyint(1) NOT NULL COMMENT '是否启用(True:启用 False:禁用)', + `description` text COMMENT '备注说明', + `created_at` datetime NOT NULL COMMENT '创建时间', + `updated_at` datetime NOT NULL COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `ix_system_log_creator_id` (`creator_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='系统日志表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `system_log` +-- + +/*!40000 ALTER TABLE `system_log` DISABLE KEYS */; +/*!40000 ALTER TABLE `system_log` ENABLE KEYS */; + +-- +-- Table structure for table `system_menu` +-- + +DROP TABLE IF EXISTS `system_menu`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `system_menu` ( + `name` varchar(50) NOT NULL COMMENT '菜单名称', + `type` int NOT NULL COMMENT '菜单类型(1:目录 2:菜单 3:按钮/权限 4:链接)', + `order` int NOT NULL COMMENT '显示排序', + `permission` varchar(100) DEFAULT NULL COMMENT '权限标识(如:system:user:list)', + `icon` varchar(50) DEFAULT NULL COMMENT '菜单图标', + `route_name` varchar(100) DEFAULT NULL COMMENT '路由名称', + `route_path` varchar(200) DEFAULT NULL COMMENT '路由路径', + `component_path` varchar(200) DEFAULT NULL COMMENT '组件路径', + `redirect` varchar(200) DEFAULT NULL COMMENT '重定向地址', + `hidden` tinyint(1) NOT NULL COMMENT '是否隐藏(True:隐藏 False:显示)', + `keep_alive` tinyint(1) NOT NULL COMMENT '是否缓存(True:是 False:否)', + `always_show` tinyint(1) NOT NULL COMMENT '是否始终显示(True:是 False:否)', + `title` varchar(50) DEFAULT NULL COMMENT '菜单标题', + `params` json DEFAULT NULL COMMENT '路由参数(JSON对象)', + `affix` tinyint(1) NOT NULL COMMENT '是否固定标签页(True:是 False:否)', + `parent_id` int DEFAULT NULL COMMENT '父菜单ID', + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `status` tinyint(1) NOT NULL COMMENT '是否启用(True:启用 False:禁用)', + `description` text COMMENT '备注说明', + `created_at` datetime NOT NULL COMMENT '创建时间', + `updated_at` datetime NOT NULL COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`), + KEY `ix_system_menu_parent_id` (`parent_id`), + CONSTRAINT `system_menu_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `system_menu` (`id`) ON DELETE SET NULL +) ENGINE=InnoDB AUTO_INCREMENT=105 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='菜单表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `system_menu` +-- + +/*!40000 ALTER TABLE `system_menu` DISABLE KEYS */; +/*!40000 ALTER TABLE `system_menu` ENABLE KEYS */; + +-- +-- Table structure for table `system_notice` +-- + +DROP TABLE IF EXISTS `system_notice`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `system_notice` ( + `notice_title` varchar(50) NOT NULL COMMENT '公告标题', + `notice_type` varchar(50) NOT NULL COMMENT '公告类型(1通知 2公告)', + `notice_content` text COMMENT '公告内容', + `creator_id` int DEFAULT NULL COMMENT '创建人ID', + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `status` tinyint(1) NOT NULL COMMENT '是否启用(True:启用 False:禁用)', + `description` text COMMENT '备注说明', + `created_at` datetime NOT NULL COMMENT '创建时间', + `updated_at` datetime NOT NULL COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `ix_system_notice_creator_id` (`creator_id`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='通知公告表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `system_notice` +-- + +/*!40000 ALTER TABLE `system_notice` DISABLE KEYS */; +/*!40000 ALTER TABLE `system_notice` ENABLE KEYS */; + +-- +-- Table structure for table `system_position` +-- + +DROP TABLE IF EXISTS `system_position`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `system_position` ( + `name` varchar(40) NOT NULL COMMENT '岗位名称', + `order` int NOT NULL COMMENT '显示排序', + `creator_id` int DEFAULT NULL COMMENT '创建人ID', + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `status` tinyint(1) NOT NULL COMMENT '是否启用(True:启用 False:禁用)', + `description` text COMMENT '备注说明', + `created_at` datetime NOT NULL COMMENT '创建时间', + `updated_at` datetime NOT NULL COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`), + KEY `ix_system_position_creator_id` (`creator_id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='岗位表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `system_position` +-- + +/*!40000 ALTER TABLE `system_position` DISABLE KEYS */; +/*!40000 ALTER TABLE `system_position` ENABLE KEYS */; + +-- +-- Table structure for table `system_role` +-- + +DROP TABLE IF EXISTS `system_role`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `system_role` ( + `name` varchar(40) NOT NULL COMMENT '角色名称', + `code` varchar(20) DEFAULT NULL COMMENT '角色编码', + `order` int NOT NULL COMMENT '显示排序', + `data_scope` int NOT NULL COMMENT '数据权限范围', + `creator_id` int DEFAULT NULL COMMENT '创建人ID', + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `status` tinyint(1) NOT NULL COMMENT '是否启用(True:启用 False:禁用)', + `description` text COMMENT '备注说明', + `created_at` datetime NOT NULL COMMENT '创建时间', + `updated_at` datetime NOT NULL COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`), + UNIQUE KEY `code` (`code`), + KEY `ix_system_role_creator_id` (`creator_id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='角色表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `system_role` +-- + +/*!40000 ALTER TABLE `system_role` DISABLE KEYS */; +/*!40000 ALTER TABLE `system_role` ENABLE KEYS */; + +-- +-- Table structure for table `system_role_depts` +-- + +DROP TABLE IF EXISTS `system_role_depts`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `system_role_depts` ( + `role_id` int NOT NULL COMMENT '角色ID', + `dept_id` int NOT NULL COMMENT '部门ID', + PRIMARY KEY (`role_id`,`dept_id`), + KEY `dept_id` (`dept_id`), + CONSTRAINT `system_role_depts_ibfk_1` FOREIGN KEY (`role_id`) REFERENCES `system_role` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `system_role_depts_ibfk_2` FOREIGN KEY (`dept_id`) REFERENCES `system_dept` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='角色部门关联表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `system_role_depts` +-- + +/*!40000 ALTER TABLE `system_role_depts` DISABLE KEYS */; +/*!40000 ALTER TABLE `system_role_depts` ENABLE KEYS */; + +-- +-- Table structure for table `system_role_menus` +-- + +DROP TABLE IF EXISTS `system_role_menus`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `system_role_menus` ( + `role_id` int NOT NULL COMMENT '角色ID', + `menu_id` int NOT NULL COMMENT '菜单ID', + PRIMARY KEY (`role_id`,`menu_id`), + KEY `menu_id` (`menu_id`), + CONSTRAINT `system_role_menus_ibfk_1` FOREIGN KEY (`role_id`) REFERENCES `system_role` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `system_role_menus_ibfk_2` FOREIGN KEY (`menu_id`) REFERENCES `system_menu` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='角色菜单关联表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `system_role_menus` +-- + +/*!40000 ALTER TABLE `system_role_menus` DISABLE KEYS */; +/*!40000 ALTER TABLE `system_role_menus` ENABLE KEYS */; + +-- +-- Table structure for table `system_user_positions` +-- + +DROP TABLE IF EXISTS `system_user_positions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `system_user_positions` ( + `user_id` int NOT NULL COMMENT '用户ID', + `position_id` int NOT NULL COMMENT '岗位ID', + PRIMARY KEY (`user_id`,`position_id`), + KEY `position_id` (`position_id`), + CONSTRAINT `system_user_positions_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `system_users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `system_user_positions_ibfk_2` FOREIGN KEY (`position_id`) REFERENCES `system_position` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户岗位关联表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `system_user_positions` +-- + +/*!40000 ALTER TABLE `system_user_positions` DISABLE KEYS */; +/*!40000 ALTER TABLE `system_user_positions` ENABLE KEYS */; + +-- +-- Table structure for table `system_user_roles` +-- + +DROP TABLE IF EXISTS `system_user_roles`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `system_user_roles` ( + `user_id` int NOT NULL COMMENT '用户ID', + `role_id` int NOT NULL COMMENT '角色ID', + PRIMARY KEY (`user_id`,`role_id`), + KEY `role_id` (`role_id`), + CONSTRAINT `system_user_roles_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `system_users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `system_user_roles_ibfk_2` FOREIGN KEY (`role_id`) REFERENCES `system_role` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户角色关联表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `system_user_roles` +-- + +/*!40000 ALTER TABLE `system_user_roles` DISABLE KEYS */; +/*!40000 ALTER TABLE `system_user_roles` ENABLE KEYS */; + +-- +-- Table structure for table `system_users` +-- + +DROP TABLE IF EXISTS `system_users`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `system_users` ( + `username` varchar(32) NOT NULL COMMENT '用户名/登录账号', + `password` varchar(255) NOT NULL COMMENT '密码哈希', + `name` varchar(32) NOT NULL COMMENT '昵称', + `mobile` varchar(20) DEFAULT NULL COMMENT '手机号', + `email` varchar(64) DEFAULT NULL COMMENT '邮箱', + `gender` varchar(1) DEFAULT NULL COMMENT '性别(0:男 1:女 2:未知)', + `avatar` varchar(500) DEFAULT NULL COMMENT '头像URL地址', + `is_superuser` tinyint(1) NOT NULL COMMENT '是否超管', + `last_login` datetime DEFAULT NULL COMMENT '最后登录时间', + `dept_id` int DEFAULT NULL COMMENT '部门ID', + `creator_id` int DEFAULT NULL COMMENT '创建人ID', + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `status` tinyint(1) NOT NULL COMMENT '是否启用(True:启用 False:禁用)', + `description` text COMMENT '备注说明', + `created_at` datetime NOT NULL COMMENT '创建时间', + `updated_at` datetime NOT NULL COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `username` (`username`), + UNIQUE KEY `mobile` (`mobile`), + UNIQUE KEY `email` (`email`), + KEY `ix_system_users_creator_id` (`creator_id`), + KEY `ix_system_users_dept_id` (`dept_id`), + CONSTRAINT `system_users_ibfk_1` FOREIGN KEY (`dept_id`) REFERENCES `system_dept` (`id`) ON DELETE SET NULL ON UPDATE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户表'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `system_users` +-- + +/*!40000 ALTER TABLE `system_users` DISABLE KEYS */; +/*!40000 ALTER TABLE `system_users` ENABLE KEYS */; + +-- +-- Dumping routines for database 'fastapiadmin' +-- +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2025-09-08 22:01:38 diff --git a/backend/sql/postgresql/fastapi_vue_admin_2025-09-05_004952.sql b/backend/sql/postgresql/fastapiadmin_2025-09-08_213443.sql similarity index 79% rename from backend/sql/postgresql/fastapi_vue_admin_2025-09-05_004952.sql rename to backend/sql/postgresql/fastapiadmin_2025-09-08_213443.sql index fbbfad52..deff94d0 100644 --- a/backend/sql/postgresql/fastapi_vue_admin_2025-09-05_004952.sql +++ b/backend/sql/postgresql/fastapiadmin_2025-09-08_213443.sql @@ -2146,9 +2146,9 @@ COPY public.example_demo (name, creator_id, id, status, description, created_at, -- COPY public.monitor_job (name, jobstore, executor, trigger, trigger_args, func, args, kwargs, "coalesce", max_instances, start_date, end_date, creator_id, id, status, description, created_at, updated_at) FROM stdin; -系统默认(无参) default default cron 0 0 12 * * ? scheduler_test.job \N \N f 1 \N \N 1 1 f \N 2025-09-05 00:49:41.690554 2025-09-05 00:49:41.690555 -系统默认(有参) default default cron 0 0 12 * * ? scheduler_test.job test \N f 1 \N \N 1 2 f \N 2025-09-05 00:49:41.690556 2025-09-05 00:49:41.690556 -系统默认(多参) default default cron 0 0 12 * * ? scheduler_test.job new {"test": 111} f 1 \N \N 1 3 f \N 2025-09-05 00:49:41.690556 2025-09-05 00:49:41.690557 +系统默认(无参) default default cron 0 0 12 * * ? scheduler_test.job \N \N f 1 \N \N 1 1 f \N 2025-09-08 21:32:24.32889 2025-09-08 21:32:24.328891 +系统默认(有参) default default cron 0 0 12 * * ? scheduler_test.job test \N f 1 \N \N 1 2 f \N 2025-09-08 21:32:24.328892 2025-09-08 21:32:24.328892 +系统默认(多参) default default cron 0 0 12 * * ? scheduler_test.job new {"test": 111} f 1 \N \N 1 3 f \N 2025-09-08 21:32:24.328893 2025-09-08 21:32:24.328893 \. @@ -2165,18 +2165,18 @@ COPY public.monitor_job_log (id, job_name, job_group, job_executor, invoke_targe -- COPY public.system_config (config_name, config_key, config_value, config_type, creator_id, id, status, description, created_at, updated_at) FROM stdin; -网站名称 sys_web_title FastAPI Vue3 Admin t 1 1 t 网站名称 2025-09-05 00:49:41.679135 2025-09-05 00:49:41.679136 -网站描述 sys_web_description FastAPI Vue3 Admin 是完全开源的权限管理系统 t 1 2 t 网站描述 2025-09-05 00:49:41.679137 2025-09-05 00:49:41.679138 -网页图标 sys_web_favicon https://service.fastapiadmin.com/api/v1/static/image/favicon.png t 1 3 t 网页图标 2025-09-05 00:49:41.679138 2025-09-05 00:49:41.679138 -网站Logo sys_web_logo https://service.fastapiadmin.com/api/v1/static/image/logo.png t 1 4 t 网站Logo 2025-09-05 00:49:41.679139 2025-09-05 00:49:41.679139 -登录背景 sys_login_background https://service.fastapiadmin.com/api/v1/static/image/background.svg t 1 5 t 登录背景 2025-09-05 00:49:41.67914 2025-09-05 00:49:41.67914 -版权信息 sys_web_copyright Copyright © 2025-2026 service.fastapiadmin.com 版权所有 t 1 6 t 版权信息 2025-09-05 00:49:41.67914 2025-09-05 00:49:41.679141 -备案信息 sys_keep_record 陕ICP备2025069493号-1 t 1 7 t 备案信息 2025-09-05 00:49:41.679141 2025-09-05 00:49:41.679142 -帮助文档 sys_help_doc https://service.fastapiadmin.com t 1 8 t 帮助文档 2025-09-05 00:49:41.679142 2025-09-05 00:49:41.679142 -隐私政策 sys_web_privacy https://github.com/1014TaoTao/fastapi_vue3_admin/blob/master/LICENSE t 1 9 t 隐私政策 2025-09-05 00:49:41.679143 2025-09-05 00:49:41.679143 -用户协议 sys_web_clause https://github.com/1014TaoTao/fastapi_vue3_admin/blob/master/LICENSE t 1 10 t 用户协议 2025-09-05 00:49:41.679143 2025-09-05 00:49:41.679144 -源码代码 sys_git_code https://github.com/1014TaoTao/fastapi_vue3_admin.git t 1 11 t 源码代码 2025-09-05 00:49:41.679144 2025-09-05 00:49:41.679145 -项目版本 sys_web_version 2.0.0 t 1 12 t 项目版本 2025-09-05 00:49:41.679145 2025-09-05 00:49:41.679145 +网站名称 sys_web_title FastAPI Vue3 Admin t 1 1 t 网站名称 2025-09-08 21:32:24.319675 2025-09-08 21:32:24.319676 +网站描述 sys_web_description FastAPI Vue3 Admin 是完全开源的权限管理系统 t 1 2 t 网站描述 2025-09-08 21:32:24.319677 2025-09-08 21:32:24.319677 +网页图标 sys_web_favicon https://service.fastapiadmin.com/api/v1/static/image/favicon.png t 1 3 t 网页图标 2025-09-08 21:32:24.319678 2025-09-08 21:32:24.319678 +网站Logo sys_web_logo https://service.fastapiadmin.com/api/v1/static/image/logo.png t 1 4 t 网站Logo 2025-09-08 21:32:24.319679 2025-09-08 21:32:24.319679 +登录背景 sys_login_background https://service.fastapiadmin.com/api/v1/static/image/background.svg t 1 5 t 登录背景 2025-09-08 21:32:24.319679 2025-09-08 21:32:24.31968 +版权信息 sys_web_copyright Copyright © 2025-2026 service.fastapiadmin.com 版权所有 t 1 6 t 版权信息 2025-09-08 21:32:24.31968 2025-09-08 21:32:24.319681 +备案信息 sys_keep_record 陕ICP备2025069493号-1 t 1 7 t 备案信息 2025-09-08 21:32:24.319681 2025-09-08 21:32:24.319681 +帮助文档 sys_help_doc https://service.fastapiadmin.com t 1 8 t 帮助文档 2025-09-08 21:32:24.319682 2025-09-08 21:32:24.319682 +隐私政策 sys_web_privacy https://github.com/1014TaoTao/fastapi_vue3_admin/blob/master/LICENSE t 1 9 t 隐私政策 2025-09-08 21:32:24.319682 2025-09-08 21:32:24.319683 +用户协议 sys_web_clause https://github.com/1014TaoTao/fastapi_vue3_admin/blob/master/LICENSE t 1 10 t 用户协议 2025-09-08 21:32:24.319683 2025-09-08 21:32:24.319683 +源码代码 sys_git_code https://github.com/1014TaoTao/fastapi_vue3_admin.git t 1 11 t 源码代码 2025-09-08 21:32:24.319684 2025-09-08 21:32:24.319684 +项目版本 sys_web_version 2.0.0 t 1 12 t 项目版本 2025-09-08 21:32:24.319685 2025-09-08 21:32:24.319685 \. @@ -2185,17 +2185,17 @@ COPY public.system_config (config_name, config_key, config_value, config_type, c -- COPY public.system_dept (name, "order", parent_id, id, status, description, created_at, updated_at) FROM stdin; -集团总公司 1 \N 1 t 集团总公司 2025-09-05 00:49:41.656756 2025-09-05 00:49:41.656759 -西安分公司 1 1 2 t 西安分公司 2025-09-05 00:49:41.65676 2025-09-05 00:49:41.65676 -深圳分公司 2 1 3 t 深圳分公司 2025-09-05 00:49:41.656761 2025-09-05 00:49:41.656761 -开发组 1 2 4 t 开发组 2025-09-05 00:49:41.656761 2025-09-05 00:49:41.656762 -测试组 2 2 5 t 测试组 2025-09-05 00:49:41.656762 2025-09-05 00:49:41.656762 -演示组 3 2 6 t 演示组 2025-09-05 00:49:41.656763 2025-09-05 00:49:41.656763 -销售部 1 3 7 t 销售部 2025-09-05 00:49:41.656764 2025-09-05 00:49:41.656764 -市场部 2 3 8 t 市场部 2025-09-05 00:49:41.656764 2025-09-05 00:49:41.656765 -财务部 3 3 9 t 财务部 2025-09-05 00:49:41.656765 2025-09-05 00:49:41.656765 -研发部 4 3 10 t 研发部 2025-09-05 00:49:41.656766 2025-09-05 00:49:41.656766 -运维部 5 3 11 t 研发部 2025-09-05 00:49:41.656767 2025-09-05 00:49:41.656767 +集团总公司 1 \N 1 t 集团总公司 2025-09-08 21:32:24.300179 2025-09-08 21:32:24.300183 +西安分公司 1 1 2 t 西安分公司 2025-09-08 21:32:24.300184 2025-09-08 21:32:24.300185 +深圳分公司 2 1 3 t 深圳分公司 2025-09-08 21:32:24.300185 2025-09-08 21:32:24.300185 +开发组 1 2 4 t 开发组 2025-09-08 21:32:24.300186 2025-09-08 21:32:24.300186 +测试组 2 2 5 t 测试组 2025-09-08 21:32:24.300187 2025-09-08 21:32:24.300187 +演示组 3 2 6 t 演示组 2025-09-08 21:32:24.300187 2025-09-08 21:32:24.300188 +销售部 1 3 7 t 销售部 2025-09-08 21:32:24.300188 2025-09-08 21:32:24.300188 +市场部 2 3 8 t 市场部 2025-09-08 21:32:24.300189 2025-09-08 21:32:24.300189 +财务部 3 3 9 t 财务部 2025-09-08 21:32:24.300189 2025-09-08 21:32:24.30019 +研发部 4 3 10 t 研发部 2025-09-08 21:32:24.30019 2025-09-08 21:32:24.30019 +运维部 5 3 11 t 研发部 2025-09-08 21:32:24.300191 2025-09-08 21:32:24.300191 \. @@ -2204,40 +2204,40 @@ COPY public.system_dept (name, "order", parent_id, id, status, description, crea -- COPY public.system_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, dict_type_id, creator_id, id, status, description, created_at, updated_at) FROM stdin; -1 男 0 sys_user_sex blue \N t \N 1 1 t 性别男 2025-09-05 00:49:41.688008 2025-09-05 00:49:41.68801 -2 女 1 sys_user_sex pink \N f \N 1 2 t 性别女 2025-09-05 00:49:41.688011 2025-09-05 00:49:41.688011 -3 未知 2 sys_user_sex red \N f \N 1 3 t 性别未知 2025-09-05 00:49:41.688012 2025-09-05 00:49:41.688012 -1 启用 1 sys_common_status primary f \N 1 4 t 启用状态 2025-09-05 00:49:41.688012 2025-09-05 00:49:41.688013 -2 停用 0 sys_common_status danger f \N 1 5 t 停用状态 2025-09-05 00:49:41.688013 2025-09-05 00:49:41.688013 -1 是 1 sys_yes_no primary t \N 1 6 t 是 2025-09-05 00:49:41.688014 2025-09-05 00:49:41.688014 -2 否 0 sys_yes_no danger f \N 1 7 t 否 2025-09-05 00:49:41.688015 2025-09-05 00:49:41.688015 -99 其他 0 sys_oper_type info f \N 1 8 t 其他操作 2025-09-05 00:49:41.688015 2025-09-05 00:49:41.688016 -1 新增 1 sys_oper_type info f \N 1 9 t 新增操作 2025-09-05 00:49:41.688016 2025-09-05 00:49:41.688016 -2 修改 2 sys_oper_type info f \N 1 10 t 修改操作 2025-09-05 00:49:41.688017 2025-09-05 00:49:41.688017 -3 删除 3 sys_oper_type danger f \N 1 11 t 删除操作 2025-09-05 00:49:41.688017 2025-09-05 00:49:41.688018 -4 分配权限 4 sys_oper_type primary f \N 1 12 t 授权操作 2025-09-05 00:49:41.688018 2025-09-05 00:49:41.688018 -5 导出 5 sys_oper_type warning f \N 1 13 t 导出操作 2025-09-05 00:49:41.688019 2025-09-05 00:49:41.688019 -6 导入 6 sys_oper_type warning f \N 1 14 t 导入操作 2025-09-05 00:49:41.68802 2025-09-05 00:49:41.68802 -7 强退 7 sys_oper_type danger f \N 1 15 t 强退操作 2025-09-05 00:49:41.68802 2025-09-05 00:49:41.688021 -8 生成代码 8 sys_oper_type warning f \N 1 16 t 生成操作 2025-09-05 00:49:41.688021 2025-09-05 00:49:41.688021 -9 清空数据 9 sys_oper_type danger f \N 1 17 t 清空操作 2025-09-05 00:49:41.688022 2025-09-05 00:49:41.688022 -1 通知 1 sys_notice_type blue warning t \N 1 18 t 通知 2025-09-05 00:49:41.688022 2025-09-05 00:49:41.688023 -2 公告 2 sys_notice_type orange success f \N 1 19 t 公告 2025-09-05 00:49:41.688023 2025-09-05 00:49:41.688023 -1 默认(Memory) default sys_job_store \N t \N 1 20 t 默认分组 2025-09-05 00:49:41.688024 2025-09-05 00:49:41.688024 -2 数据库(Sqlalchemy) sqlalchemy sys_job_store \N f \N 1 21 t 数据库分组 2025-09-05 00:49:41.688025 2025-09-05 00:49:41.688025 -3 数据库(Redis) redis sys_job_store \N f \N 1 22 t reids分组 2025-09-05 00:49:41.688025 2025-09-05 00:49:41.688026 -1 线程池 default sys_job_executor \N f \N 1 23 t 线程池 2025-09-05 00:49:41.688026 2025-09-05 00:49:41.688026 -2 进程池 processpool sys_job_executor \N f \N 1 24 t 进程池 2025-09-05 00:49:41.688027 2025-09-05 00:49:41.688027 -1 演示函数 scheduler_test.job sys_job_function \N t \N 1 25 t 演示函数 2025-09-05 00:49:41.688027 2025-09-05 00:49:41.688028 -1 指定日期(date) date sys_job_trigger \N t \N 1 26 t 指定日期任务触发器 2025-09-05 00:49:41.688028 2025-09-05 00:49:41.688028 -2 间隔触发器(interval) interval sys_job_trigger \N f \N 1 27 t 间隔触发器任务触发器 2025-09-05 00:49:41.688029 2025-09-05 00:49:41.688029 -3 cron表达式 cron sys_job_trigger \N f \N 1 28 t 间隔触发器任务触发器 2025-09-05 00:49:41.688029 2025-09-05 00:49:41.68803 -1 默认(default) default sys_list_class \N t \N 1 29 t 默认表格回显样式 2025-09-05 00:49:41.68803 2025-09-05 00:49:41.68803 -2 主要(primary) primary sys_list_class \N f \N 1 30 t 主要表格回显样式 2025-09-05 00:49:41.688031 2025-09-05 00:49:41.688031 -3 成功(success) success sys_list_class \N f \N 1 31 t 成功表格回显样式 2025-09-05 00:49:41.688032 2025-09-05 00:49:41.688032 -4 信息(info) info sys_list_class \N f \N 1 32 t 信息表格回显样式 2025-09-05 00:49:41.688032 2025-09-05 00:49:41.688033 -5 警告(warning) warning sys_list_class \N f \N 1 33 t 警告表格回显样式 2025-09-05 00:49:41.688033 2025-09-05 00:49:41.688033 -6 危险(danger) danger sys_list_class \N f \N 1 34 t 危险表格回显样式 2025-09-05 00:49:41.688034 2025-09-05 00:49:41.688034 +1 男 0 sys_user_sex blue \N t \N 1 1 t 性别男 2025-09-08 21:32:24.326678 2025-09-08 21:32:24.326678 +2 女 1 sys_user_sex pink \N f \N 1 2 t 性别女 2025-09-08 21:32:24.326679 2025-09-08 21:32:24.32668 +3 未知 2 sys_user_sex red \N f \N 1 3 t 性别未知 2025-09-08 21:32:24.32668 2025-09-08 21:32:24.32668 +1 启用 1 sys_common_status primary f \N 1 4 t 启用状态 2025-09-08 21:32:24.326681 2025-09-08 21:32:24.326681 +2 停用 0 sys_common_status danger f \N 1 5 t 停用状态 2025-09-08 21:32:24.326681 2025-09-08 21:32:24.326682 +1 是 1 sys_yes_no primary t \N 1 6 t 是 2025-09-08 21:32:24.326682 2025-09-08 21:32:24.326682 +2 否 0 sys_yes_no danger f \N 1 7 t 否 2025-09-08 21:32:24.326683 2025-09-08 21:32:24.326683 +99 其他 0 sys_oper_type info f \N 1 8 t 其他操作 2025-09-08 21:32:24.326683 2025-09-08 21:32:24.326684 +1 新增 1 sys_oper_type info f \N 1 9 t 新增操作 2025-09-08 21:32:24.326684 2025-09-08 21:32:24.326684 +2 修改 2 sys_oper_type info f \N 1 10 t 修改操作 2025-09-08 21:32:24.326685 2025-09-08 21:32:24.326685 +3 删除 3 sys_oper_type danger f \N 1 11 t 删除操作 2025-09-08 21:32:24.326685 2025-09-08 21:32:24.326686 +4 分配权限 4 sys_oper_type primary f \N 1 12 t 授权操作 2025-09-08 21:32:24.326686 2025-09-08 21:32:24.326686 +5 导出 5 sys_oper_type warning f \N 1 13 t 导出操作 2025-09-08 21:32:24.326687 2025-09-08 21:32:24.326687 +6 导入 6 sys_oper_type warning f \N 1 14 t 导入操作 2025-09-08 21:32:24.326687 2025-09-08 21:32:24.326688 +7 强退 7 sys_oper_type danger f \N 1 15 t 强退操作 2025-09-08 21:32:24.326688 2025-09-08 21:32:24.326688 +8 生成代码 8 sys_oper_type warning f \N 1 16 t 生成操作 2025-09-08 21:32:24.326689 2025-09-08 21:32:24.326689 +9 清空数据 9 sys_oper_type danger f \N 1 17 t 清空操作 2025-09-08 21:32:24.326689 2025-09-08 21:32:24.32669 +1 通知 1 sys_notice_type blue warning t \N 1 18 t 通知 2025-09-08 21:32:24.32669 2025-09-08 21:32:24.32669 +2 公告 2 sys_notice_type orange success f \N 1 19 t 公告 2025-09-08 21:32:24.326691 2025-09-08 21:32:24.326691 +1 默认(Memory) default sys_job_store \N t \N 1 20 t 默认分组 2025-09-08 21:32:24.326691 2025-09-08 21:32:24.326692 +2 数据库(Sqlalchemy) sqlalchemy sys_job_store \N f \N 1 21 t 数据库分组 2025-09-08 21:32:24.326692 2025-09-08 21:32:24.326692 +3 数据库(Redis) redis sys_job_store \N f \N 1 22 t reids分组 2025-09-08 21:32:24.326693 2025-09-08 21:32:24.326693 +1 线程池 default sys_job_executor \N f \N 1 23 t 线程池 2025-09-08 21:32:24.326693 2025-09-08 21:32:24.326694 +2 进程池 processpool sys_job_executor \N f \N 1 24 t 进程池 2025-09-08 21:32:24.326694 2025-09-08 21:32:24.326694 +1 演示函数 scheduler_test.job sys_job_function \N t \N 1 25 t 演示函数 2025-09-08 21:32:24.326695 2025-09-08 21:32:24.326695 +1 指定日期(date) date sys_job_trigger \N t \N 1 26 t 指定日期任务触发器 2025-09-08 21:32:24.326695 2025-09-08 21:32:24.326696 +2 间隔触发器(interval) interval sys_job_trigger \N f \N 1 27 t 间隔触发器任务触发器 2025-09-08 21:32:24.326696 2025-09-08 21:32:24.326696 +3 cron表达式 cron sys_job_trigger \N f \N 1 28 t 间隔触发器任务触发器 2025-09-08 21:32:24.326697 2025-09-08 21:32:24.326697 +1 默认(default) default sys_list_class \N t \N 1 29 t 默认表格回显样式 2025-09-08 21:32:24.326697 2025-09-08 21:32:24.326698 +2 主要(primary) primary sys_list_class \N f \N 1 30 t 主要表格回显样式 2025-09-08 21:32:24.326698 2025-09-08 21:32:24.326698 +3 成功(success) success sys_list_class \N f \N 1 31 t 成功表格回显样式 2025-09-08 21:32:24.326699 2025-09-08 21:32:24.326699 +4 信息(info) info sys_list_class \N f \N 1 32 t 信息表格回显样式 2025-09-08 21:32:24.326699 2025-09-08 21:32:24.3267 +5 警告(warning) warning sys_list_class \N f \N 1 33 t 警告表格回显样式 2025-09-08 21:32:24.3267 2025-09-08 21:32:24.3267 +6 危险(danger) danger sys_list_class \N f \N 1 34 t 危险表格回显样式 2025-09-08 21:32:24.326701 2025-09-08 21:32:24.326701 \. @@ -2246,16 +2246,16 @@ COPY public.system_dict_data (dict_sort, dict_label, dict_value, dict_type, css_ -- COPY public.system_dict_type (dict_name, dict_type, creator_id, id, status, description, created_at, updated_at) FROM stdin; -用户性别 sys_user_sex 1 1 t 用户性别列表 2025-09-05 00:49:41.681183 2025-09-05 00:49:41.681184 -系统是否 sys_yes_no 1 2 t 系统是否列表 2025-09-05 00:49:41.681185 2025-09-05 00:49:41.681185 -系统状态 sys_common_status 1 3 t 系统状态 2025-09-05 00:49:41.681186 2025-09-05 00:49:41.681186 -通知类型 sys_notice_type 1 4 t 通知类型列表 2025-09-05 00:49:41.681186 2025-09-05 00:49:41.681187 -操作类型 sys_oper_type 1 5 t 操作类型列表 2025-09-05 00:49:41.681187 2025-09-05 00:49:41.681187 -任务存储器 sys_job_store 1 6 t 任务分组列表 2025-09-05 00:49:41.681188 2025-09-05 00:49:41.681188 -任务执行器 sys_job_executor 1 7 t 任务执行器列表 2025-09-05 00:49:41.681189 2025-09-05 00:49:41.681189 -任务函数 sys_job_function 1 8 t 任务函数列表 2025-09-05 00:49:41.681189 2025-09-05 00:49:41.68119 -任务触发器 sys_job_trigger 1 9 t 任务触发器列表 2025-09-05 00:49:41.68119 2025-09-05 00:49:41.68119 -表格回显样式 sys_list_class 1 10 t 表格回显样式列表 2025-09-05 00:49:41.681191 2025-09-05 00:49:41.681191 +用户性别 sys_user_sex 1 1 t 用户性别列表 2025-09-08 21:32:24.321778 2025-09-08 21:32:24.321778 +系统是否 sys_yes_no 1 2 t 系统是否列表 2025-09-08 21:32:24.321779 2025-09-08 21:32:24.321779 +系统状态 sys_common_status 1 3 t 系统状态 2025-09-08 21:32:24.32178 2025-09-08 21:32:24.32178 +通知类型 sys_notice_type 1 4 t 通知类型列表 2025-09-08 21:32:24.321781 2025-09-08 21:32:24.321781 +操作类型 sys_oper_type 1 5 t 操作类型列表 2025-09-08 21:32:24.321781 2025-09-08 21:32:24.321782 +任务存储器 sys_job_store 1 6 t 任务分组列表 2025-09-08 21:32:24.321782 2025-09-08 21:32:24.321782 +任务执行器 sys_job_executor 1 7 t 任务执行器列表 2025-09-08 21:32:24.321783 2025-09-08 21:32:24.321783 +任务函数 sys_job_function 1 8 t 任务函数列表 2025-09-08 21:32:24.321783 2025-09-08 21:32:24.321784 +任务触发器 sys_job_trigger 1 9 t 任务触发器列表 2025-09-08 21:32:24.321784 2025-09-08 21:32:24.321784 +表格回显样式 sys_list_class 1 10 t 表格回显样式列表 2025-09-08 21:32:24.321785 2025-09-08 21:32:24.321785 \. @@ -2264,6 +2264,9 @@ COPY public.system_dict_type (dict_name, dict_type, creator_id, id, status, desc -- COPY public.system_log (type, request_path, request_method, request_payload, request_ip, login_location, request_os, request_browser, response_code, response_json, process_time, creator_id, id, status, description, created_at, updated_at) FROM stdin; +1 /api/v1/system/auth/login POST username: admin\npassword: 123456\ncaptcha: 2\ncaptcha_key: f37fe63ce95c43149d269ba4a73d4c0e\nremember: true\nlogin_type: PC端 127.0.0.1 内网IP Mac OS X Edge 200 {"code":0,"msg":"登录成功","data":{"access_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ7XCJuYW1lXCI6XCJcdTdiYTFcdTc0MDZcdTU0NThcIixcInNlc3Npb25faWRcIjpcImZlNGUxZDg0LTUyZDctNGVjOC05OWNiLWZkYzY5ODA0OGM3MlwiLFwidXNlcl9pZFwiOjIsXCJ1c2VyX25hbWVcIjpcImFkbWluXCIsXCJpcGFkZHJcIjpcIjEyNy4wLjAuMVwiLFwibG9naW5fbG9jYXRpb25cIjpcIlx1NTE4NVx1N2Y1MUlQXCIsXCJvc1wiOlwiTWFjIE9TIFhcIixcImJyb3dzZXJcIjpcIkVkZ2VcIixcImxvZ2luX3RpbWVcIjpcIjIwMjUtMDktMDggMTM6MzM6NDdcIixcImxvZ2luX3R5cGVcIjpcIlBDXHU3YWVmXCJ9IiwiaXNfcmVmcmVzaCI6ZmFsc2UsImV4cCI6MTc2MjU1MTIyN30.GAQgUupfabFEoDh2z0_AHKK9mQ-3F_KxbLfjzQ2bja0","refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ7XCJuYW1lXCI6XCJcdTdiYTFcdTc0MDZcdTU0NThcIixcInNlc3Npb25faWRcIjpcImZlNGUxZDg0LTUyZDctNGVjOC05OWNiLWZkYzY5ODA0OGM3MlwiLFwidXNlcl9pZFwiOjIsXCJ1c2VyX25hbWVcIjpcImFkbWluXCIsXCJpcGFkZHJcIjpcIjEyNy4wLjAuMVwiLFwibG9naW5fbG9jYXRpb25cIjpcIlx1NTE4NVx1N2Y1MUlQXCIsXCJvc1wiOlwiTWFjIE9TIFhcIixcImJyb3dzZXJcIjpcIkVkZ2VcIixcImxvZ2luX3RpbWVcIjpcIjIwMjUtMDktMDggMTM6MzM6NDdcIixcImxvZ2luX3R5cGVcIjpcIlBDXHU3YWVmXCJ9IiwiaXNfcmVmcmVzaCI6dHJ1ZSwiZXhwIjoxNzkzNjU1MjI3fQ.QuxQBc7YJMhlb-qeZoFHdmTJ2t87f70GWbQen4aca5E","token_type":"bearer","expires_in":5184000},"status_code":200,"success":true} 0.3625s \N 1 t 登录 2025-09-08 21:33:47.676346 2025-09-08 21:33:47.676348 +2 /api/v1/system/auth/logout POST {"body": {"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ7XCJuYW1lXCI6XCJcdTdiYTFcdTc0MDZcdTU0NThcIixcInNlc3Npb25faWRcIjpcImZlNGUxZDg0LTUyZDctNGVjOC05OWNiLWZkYzY5ODA0OGM3MlwiLFwidXNlcl9pZFwiOjIsXCJ1c2VyX25hbWVcIjpcImFkbWluXCIsXCJpcGFkZHJcIjpcIjEyNy4wLjAuMVwiLFwibG9naW5fbG9jYXRpb25cIjpcIlx1NTE4NVx1N2Y1MUlQXCIsXCJvc1wiOlwiTWFjIE9TIFhcIixcImJyb3dzZXJcIjpcIkVkZ2VcIixcImxvZ2luX3RpbWVcIjpcIjIwMjUtMDktMDggMTM6MzM6NDdcIixcImxvZ2luX3R5cGVcIjpcIlBDXHU3YWVmXCJ9IiwiaXNfcmVmcmVzaCI6ZmFsc2UsImV4cCI6MTc2MjU1MTIyN30.GAQgUupfabFEoDh2z0_AHKK9mQ-3F_KxbLfjzQ2bja0"}} 127.0.0.1 内网IP Mac OS X Edge 200 {"code":0,"msg":"退出成功","data":null,"status_code":200,"success":true} 0.0375s 2 2 t 退出登录 2025-09-08 21:34:03.492645 2025-09-08 21:34:03.492648 +1 /api/v1/system/auth/login POST username: superadmin\npassword: super@admin123\ncaptcha: 8\ncaptcha_key: dd7b4041b865436a894430ba0ff94299\nremember: true\nlogin_type: PC端 127.0.0.1 内网IP Mac OS X Edge 200 {"code":0,"msg":"登录成功","data":{"access_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ7XCJuYW1lXCI6XCJcdThkODVcdTdlYTdcdTdiYTFcdTc0MDZcdTU0NThcIixcInNlc3Npb25faWRcIjpcImI1NGUyM2FhLWQ3YWEtNGMxOC04YmQ5LWQyMTQzMDBlMjkzOFwiLFwidXNlcl9pZFwiOjEsXCJ1c2VyX25hbWVcIjpcInN1cGVyYWRtaW5cIixcImlwYWRkclwiOlwiMTI3LjAuMC4xXCIsXCJsb2dpbl9sb2NhdGlvblwiOlwiXHU1MTg1XHU3ZjUxSVBcIixcIm9zXCI6XCJNYWMgT1MgWFwiLFwiYnJvd3NlclwiOlwiRWRnZVwiLFwibG9naW5fdGltZVwiOlwiMjAyNS0wOS0wOCAxMzozNDoyM1wiLFwibG9naW5fdHlwZVwiOlwiUENcdTdhZWZcIn0iLCJpc19yZWZyZXNoIjpmYWxzZSwiZXhwIjoxNzYyNTUxMjYzfQ.XiqBKxv3923zKyaXFWy8jwrOhmqWJJ-nJc2Wma5BxvA","refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ7XCJuYW1lXCI6XCJcdThkODVcdTdlYTdcdTdiYTFcdTc0MDZcdTU0NThcIixcInNlc3Npb25faWRcIjpcImI1NGUyM2FhLWQ3YWEtNGMxOC04YmQ5LWQyMTQzMDBlMjkzOFwiLFwidXNlcl9pZFwiOjEsXCJ1c2VyX25hbWVcIjpcInN1cGVyYWRtaW5cIixcImlwYWRkclwiOlwiMTI3LjAuMC4xXCIsXCJsb2dpbl9sb2NhdGlvblwiOlwiXHU1MTg1XHU3ZjUxSVBcIixcIm9zXCI6XCJNYWMgT1MgWFwiLFwiYnJvd3NlclwiOlwiRWRnZVwiLFwibG9naW5fdGltZVwiOlwiMjAyNS0wOS0wOCAxMzozNDoyM1wiLFwibG9naW5fdHlwZVwiOlwiUENcdTdhZWZcIn0iLCJpc19yZWZyZXNoIjp0cnVlLCJleHAiOjE3OTM2NTUyNjN9.fGjr-yg9OkNGOC3R1XWObyXGy9ZyJqlJ4sA57sGM5Q8","token_type":"bearer","expires_in":5184000},"status_code":200,"success":true} 0.3519s \N 3 t 登录 2025-09-08 21:34:23.399114 2025-09-08 21:34:23.399116 \. @@ -2272,107 +2275,110 @@ COPY public.system_log (type, request_path, request_method, request_payload, req -- COPY public.system_menu (name, type, "order", permission, icon, route_name, route_path, component_path, redirect, hidden, keep_alive, always_show, title, params, affix, parent_id, id, status, description, created_at, updated_at) FROM stdin; -仪表盘 1 1 client Dashboard /dashboard \N /dashboard/workplace f t t 仪表盘 null f \N 1 t 初始化数据 2025-09-05 00:49:41.666398 2025-09-05 00:49:41.666402 -工作台 2 1 dashboard:workplace:query homepage Workplace /dashboard/workplace dashboard/workplace \N f t f 工作台 null t 1 2 t 初始化数据 2025-09-05 00:49:41.666409 2025-09-05 00:49:41.666418 -分析页 2 2 dashboard:analysis:query el-icon-PieChart Analysis /dashboard/analysis dashboard/analysis \N f t f 分析页 null f 1 3 t 初始化数据 2025-09-05 00:49:41.666419 2025-09-05 00:49:41.666425 -系统管理 1 2 \N system System /system \N /system/menu f t f 系统管理 null f \N 4 t 初始化数据 2025-09-05 00:49:41.666426 2025-09-05 00:49:41.666427 -菜单管理 2 1 system:menu:query menu Menu /system/menu system/menu/index \N f t f 菜单管理 null f 4 5 t 初始化数据 2025-09-05 00:49:41.666427 2025-09-05 00:49:41.666428 -部门管理 2 2 system:dept:query tree Dept /system/dept system/dept/index \N f t f 部门管理 null f 4 6 t 初始化数据 2025-09-05 00:49:41.666428 2025-09-05 00:49:41.666428 -岗位管理 2 3 system:position:query el-icon-Coordinate Position /system/position system/position/index \N f t f 岗位管理 null f 4 7 t 初始化数据 2025-09-05 00:49:41.666435 2025-09-05 00:49:41.666436 -角色管理 2 4 system:role:query role Role /system/role system/role/index \N f t f 角色管理 null f 4 8 t 初始化数据 2025-09-05 00:49:41.666437 2025-09-05 00:49:41.666437 -用户管理 2 5 system:user:query el-icon-User User /system/user system/user/index \N f t f 用户管理 null f 4 9 t 初始化数据 2025-09-05 00:49:41.666438 2025-09-05 00:49:41.666438 -日志管理 2 6 system:log:query el-icon-Aim Log /system/log system/log/index \N f t f 日志管理 null f 4 10 t 初始化数据 2025-09-05 00:49:41.666438 2025-09-05 00:49:41.666439 -公告管理 2 7 system:notice:query bell Notice /system/notice system/notice/index \N f t f 公告管理 null f 4 11 t 初始化数据 2025-09-05 00:49:41.666439 2025-09-05 00:49:41.66644 -配置管理 2 8 system:config:query setting Config /system/config system/config/index \N f t f 配置管理 null f 4 12 t 初始化数据 2025-09-05 00:49:41.66644 2025-09-05 00:49:41.666441 -字典管理 2 9 system:dict_type:query dict Dict /system/dict system/dict/index \N f t f 字典管理 null f 4 13 t 初始化数据 2025-09-05 00:49:41.666441 2025-09-05 00:49:41.666441 -创建菜单 3 1 system:menu:create \N \N \N \N \N f t f 创建菜单 null f 5 14 t 初始化数据 2025-09-05 00:49:41.666442 2025-09-05 00:49:41.666442 -修改菜单 3 2 system:menu:update \N \N \N \N \N f t f 修改菜单 null f 5 15 t 初始化数据 2025-09-05 00:49:41.666443 2025-09-05 00:49:41.666443 -删除菜单 3 3 system:menu:delete \N \N \N \N \N f t f 删除菜单 null f 5 16 t 初始化数据 2025-09-05 00:49:41.666443 2025-09-05 00:49:41.666444 -批量修改菜单状态 3 4 system:menu:patch \N \N \N \N \N f t f 批量修改菜单状态 null f 5 17 t 初始化数据 2025-09-05 00:49:41.666444 2025-09-05 00:49:41.666445 -创建部门 3 1 system:dept:create \N \N \N \N \N f t f 创建部门 null f 6 18 t 初始化数据 2025-09-05 00:49:41.666445 2025-09-05 00:49:41.666445 -修改部门 3 2 system:dept:update \N \N \N \N \N f t f 修改部门 null f 6 19 t 初始化数据 2025-09-05 00:49:41.666446 2025-09-05 00:49:41.666446 -删除部门 3 3 system:dept:delete \N \N \N \N \N f t f 删除部门 null f 6 20 t 初始化数据 2025-09-05 00:49:41.666447 2025-09-05 00:49:41.666447 -批量修改部门状态 3 4 system:dept:patch \N \N \N \N \N f t f 批量修改部门状态 null f 6 21 t 初始化数据 2025-09-05 00:49:41.666447 2025-09-05 00:49:41.666448 -创建岗位 3 1 system:position:create \N \N \N \N \N f t f 创建岗位 null f 7 22 t 初始化数据 2025-09-05 00:49:41.666448 2025-09-05 00:49:41.666448 -修改岗位 3 2 system:position:update \N \N \N \N \N f t f 修改岗位 null f 7 23 t 初始化数据 2025-09-05 00:49:41.666449 2025-09-05 00:49:41.666449 -删除岗位 3 3 system:position:delete \N \N \N \N \N f t f 修改岗位 null f 7 24 t 初始化数据 2025-09-05 00:49:41.66645 2025-09-05 00:49:41.66645 -批量修改岗位状态 3 4 system:position:patch \N \N \N \N \N f t f 批量修改岗位状态 null f 7 25 t 初始化数据 2025-09-05 00:49:41.66645 2025-09-05 00:49:41.666451 -岗位导出 3 5 system:position:export \N \N \N \N \N f t f 岗位导出 null f 7 26 t 初始化数据 2025-09-05 00:49:41.666451 2025-09-05 00:49:41.666452 -创建角色 3 1 system:role:create \N \N \N \N \N f t f 创建角色 null f 8 27 t 初始化数据 2025-09-05 00:49:41.666452 2025-09-05 00:49:41.666452 -修改角色 3 2 system:role:update \N \N \N \N \N f t f 修改角色 null f 8 28 t 初始化数据 2025-09-05 00:49:41.666453 2025-09-05 00:49:41.666453 -删除角色 3 3 system:role:delete \N \N \N \N \N f t f 删除角色 null f 8 29 t 初始化数据 2025-09-05 00:49:41.666454 2025-09-05 00:49:41.666454 -批量修改角色状态 3 4 system:role:patch \N \N \N \N \N f t f 批量修改角色状态 null f 8 30 t 初始化数据 2025-09-05 00:49:41.666455 2025-09-05 00:49:41.666455 -设置角色权限 3 8 system:role:permission \N \N \N \N \N f t f 设置角色权限 null f 7 31 t 初始化数据 2025-09-05 00:49:41.666455 2025-09-05 00:49:41.666456 -角色导出 3 6 system:role:export \N \N \N \N \N f t f 角色导出 null f 8 32 t 初始化数据 2025-09-05 00:49:41.666456 2025-09-05 00:49:41.666457 -创建用户 3 1 system:user:create \N \N \N \N \N f t f 创建用户 null f 9 33 t 初始化数据 2025-09-05 00:49:41.666457 2025-09-05 00:49:41.666458 -修改用户 3 2 system:user:update \N \N \N \N \N f t f 修改用户 null f 9 34 t 初始化数据 2025-09-05 00:49:41.666458 2025-09-05 00:49:41.666458 -删除用户 3 3 system:user:delete \N \N \N \N \N f t f 删除用户 null f 9 35 t 初始化数据 2025-09-05 00:49:41.666459 2025-09-05 00:49:41.666459 -批量修改用户状态 3 4 system:user:patch \N \N \N \N \N f t f 批量修改用户状态 null f 9 36 t 初始化数据 2025-09-05 00:49:41.66646 2025-09-05 00:49:41.66646 -导出用户 3 5 system:user:export \N \N \N \N \N f t f 导出用户 null f 9 37 t 初始化数据 2025-09-05 00:49:41.666461 2025-09-05 00:49:41.666461 -导入用户 3 6 system:user:import \N \N \N \N \N f t f 导入用户 null f 9 38 t 初始化数据 2025-09-05 00:49:41.666461 2025-09-05 00:49:41.666462 -日志删除 3 1 system:operation_log:delete \N \N \N \N \N f t f 日志删除 null f 10 39 t 初始化数据 2025-09-05 00:49:41.666462 2025-09-05 00:49:41.666462 -日志导出 3 2 system:operation_log:export \N \N \N \N \N f t f 日志导出 null f 10 40 t 初始化数据 2025-09-05 00:49:41.666463 2025-09-05 00:49:41.666463 -公告创建 3 1 system:notice:create \N \N \N \N \N f t f 公告创建 null f 11 41 t 初始化数据 2025-09-05 00:49:41.666464 2025-09-05 00:49:41.666464 -公告修改 3 2 system:notice:update \N \N \N \N \N f t f 修改用户 null f 11 42 t 初始化数据 2025-09-05 00:49:41.666464 2025-09-05 00:49:41.666465 -公告删除 3 3 system:notice:delete \N \N \N \N \N f t f 公告删除 null f 11 43 t 初始化数据 2025-09-05 00:49:41.666465 2025-09-05 00:49:41.666466 -公告导出 3 4 system:notice:export \N \N \N \N \N f t f 公告导出 null f 11 44 t 初始化数据 2025-09-05 00:49:41.666466 2025-09-05 00:49:41.666466 -公告批量修改状态 3 5 system:notice:patch \N \N \N \N \N f t f 公告批量修改状态 null f 11 45 t 初始化数据 2025-09-05 00:49:41.666467 2025-09-05 00:49:41.666467 -创建配置 3 1 system:config:create \N \N \N \N \N f t f 创建配置 null f 12 46 t 初始化数据 2025-09-05 00:49:41.666467 2025-09-05 00:49:41.666468 -修改配置 3 2 system:config:update \N \N \N \N \N f t f 修改配置 null f 12 47 t 初始化数据 2025-09-05 00:49:41.666497 2025-09-05 00:49:41.666498 -删除配置 3 3 system:config:delete \N \N \N \N \N f t f 删除配置 null f 12 48 t 初始化数据 2025-09-05 00:49:41.666499 2025-09-05 00:49:41.666499 -导出配置 3 4 system:config:export \N \N \N \N \N f t f 导出配置 null f 12 49 t 初始化数据 2025-09-05 00:49:41.6665 2025-09-05 00:49:41.6665 -配置上传 3 5 system:config:upload \N \N \N \N \N f t f 配置上传 null f 12 50 t 初始化数据 2025-09-05 00:49:41.666501 2025-09-05 00:49:41.666501 -创建字典类型 3 1 system:dict_type:create \N \N \N \N \N f t f 创建字典类型 null f 13 51 t 初始化数据 2025-09-05 00:49:41.666501 2025-09-05 00:49:41.666502 -修改字典类型 3 2 system:dict_type:update \N \N \N \N \N f t f 修改字典类型 null f 13 52 t 初始化数据 2025-09-05 00:49:41.666502 2025-09-05 00:49:41.666502 -删除字典类型 3 3 system:dict_type:delete \N \N \N \N \N f t f 删除字典类型 null f 13 53 t 初始化数据 2025-09-05 00:49:41.666503 2025-09-05 00:49:41.666503 -导出字典类型 3 4 system:dict_type:export \N \N \N \N \N f t f 导出字典类型 null f 13 54 t 初始化数据 2025-09-05 00:49:41.666504 2025-09-05 00:49:41.666504 -批量修改字典状态 3 5 system:dict_type:patch \N \N \N \N \N f t f 导出字典类型 null f 13 55 t 初始化数据 2025-09-05 00:49:41.666504 2025-09-05 00:49:41.666505 -字典数据查询 3 6 system:dict_data:query \N \N \N \N \N f t f 字典数据查询 null f 13 56 t 初始化数据 2025-09-05 00:49:41.666505 2025-09-05 00:49:41.666505 -创建字典数据 3 7 system:dict_data:create \N \N \N \N \N f t f 创建字典数据 null f 13 57 t 初始化数据 2025-09-05 00:49:41.666506 2025-09-05 00:49:41.666506 -修改字典数据 3 8 system:dict_data:update \N \N \N \N \N f t f 修改字典数据 null f 13 58 t 初始化数据 2025-09-05 00:49:41.666506 2025-09-05 00:49:41.666507 -删除字典数据 3 9 system:dict_data:delete \N \N \N \N \N f t f 删除字典数据 null f 13 59 t 初始化数据 2025-09-05 00:49:41.666507 2025-09-05 00:49:41.666507 -导出字典数据 3 10 system:dict_data:export \N \N \N \N \N f t f 导出字典数据 null f 13 60 t 初始化数据 2025-09-05 00:49:41.666508 2025-09-05 00:49:41.666508 -批量修改字典数据状态 3 11 system:dict_data:patch \N \N \N \N \N f t f 批量修改字典数据状态 null f 13 61 t 初始化数据 2025-09-05 00:49:41.666508 2025-09-05 00:49:41.666509 -监控管理 1 3 \N monitor Monitor /monitor \N /monitor/online f f f 监控管理 null f \N 62 t 初始化数据 2025-09-05 00:49:41.666509 2025-09-05 00:49:41.66651 -任务管理 2 1 monitor:job:query el-icon-DataLine Job /monitor/job monitor/job/index \N f t f 任务管理 null f 62 63 t 初始化数据 2025-09-05 00:49:41.66651 2025-09-05 00:49:41.66651 -创建任务 3 1 monitor:job:create \N \N \N \N \N f t f 创建任务 null f 63 64 t 初始化数据 2025-09-05 00:49:41.666511 2025-09-05 00:49:41.666511 -修改和操作任务 3 2 monitor:job:update \N \N \N \N \N f t f 修改和操作任务 null f 63 65 t 初始化数据 2025-09-05 00:49:41.666512 2025-09-05 00:49:41.666512 -删除和清除任务 3 3 monitor:job:delete \N \N \N \N \N f t f 删除和清除任务 null f 63 66 t 初始化数据 2025-09-05 00:49:41.666512 2025-09-05 00:49:41.666513 -导出定时任务 3 4 monitor:job:export \N \N \N \N \N f t f 导出定时任务 null f 63 67 t 初始化数据 2025-09-05 00:49:41.666552 2025-09-05 00:49:41.666553 -在线用户 2 2 monitor:online:query el-icon-Headset MonitorOnline /monitor/online monitor/online/index \N f f f 在线用户 null f 62 68 t 初始化数据 2025-09-05 00:49:41.666554 2025-09-05 00:49:41.666555 -在线用户强制下线 3 1 monitor:online:delete \N \N \N \N \N f f f 在线用户强制下线 null f 68 69 t 初始化数据 2025-09-05 00:49:41.666555 2025-09-05 00:49:41.666555 -服务器监控 2 3 monitor:server:query el-icon-Odometer MonitorServer /monitor/server monitor/server/index \N f f f 服务器监控 null f 62 70 t 初始化数据 2025-09-05 00:49:41.666556 2025-09-05 00:49:41.666556 -缓存监控 2 4 monitor:cache:query el-icon-Stopwatch MonitorCache /monitor/cache monitor/cache/index \N f f f 缓存监控 null f 62 71 t 初始化数据 2025-09-05 00:49:41.666557 2025-09-05 00:49:41.666557 -清除缓存 3 1 monitor:cache:delete \N \N \N \N \N f f f 清除缓存 null f 71 72 t 初始化数据 2025-09-05 00:49:41.666557 2025-09-05 00:49:41.666558 -公共模块 1 4 \N document Common /common \N /common/docs f f f 公共模块 null f \N 73 t 初始化数据 2025-09-05 00:49:41.666558 2025-09-05 00:49:41.666558 -接口管理 4 1 common:docs:query api Docs /common/docs common/docs/index \N f f f 接口管理 null f 73 74 t 初始化数据 2025-09-05 00:49:41.666559 2025-09-05 00:49:41.666559 -文档管理 4 2 common:redoc:query el-icon-Document Redoc /common/redoc common/redoc/index \N f f f 文档管理 null f 73 75 t 初始化数据 2025-09-05 00:49:41.666559 2025-09-05 00:49:41.66656 -演示模块 1 5 \N el-icon-Document Demo /demo \N /demo/example f f f 演示模块 null f \N 76 t 初始化数据 2025-09-05 00:49:41.66656 2025-09-05 00:49:41.666561 -示例管理 2 1 demo:example:query el-icon-DataLine Example /demo/example demo/example/index \N f t f 示例管理 null f 76 77 t 初始化数据 2025-09-05 00:49:41.666561 2025-09-05 00:49:41.666561 -创建示例 3 1 demo:example:create \N \N \N \N \N f t f 创建示例 null f 77 78 t 初始化数据 2025-09-05 00:49:41.666562 2025-09-05 00:49:41.666562 -更新示例 3 2 demo:example:update \N \N \N \N \N f t f 更新示例 null f 77 79 t 初始化数据 2025-09-05 00:49:41.666563 2025-09-05 00:49:41.666563 -删除示例 3 3 demo:example:delete \N \N \N \N \N f t f 删除示例 null f 77 80 t 初始化数据 2025-09-05 00:49:41.666563 2025-09-05 00:49:41.666564 -批量修改示例状态 3 4 demo:example:patch \N \N \N \N \N f t f 批量修改示例状态 null f 77 81 t 初始化数据 2025-09-05 00:49:41.666564 2025-09-05 00:49:41.666564 -导出示例 3 5 demo:example:export \N \N \N \N \N f t f 导出示例 null f 77 82 t 初始化数据 2025-09-05 00:49:41.666565 2025-09-05 00:49:41.666565 -导入示例 3 6 demo:example:import \N \N \N \N \N f t f 导入示例 null f 77 83 t 初始化数据 2025-09-05 00:49:41.666566 2025-09-05 00:49:41.666566 -下载导入示例模版 3 7 demo:example:download \N \N \N \N \N f t f 下载导入示例模版 null f 77 84 t 初始化数据 2025-09-05 00:49:41.666566 2025-09-05 00:49:41.666567 -应用管理 1 6 \N applications Application /application \N /application/myapp f f f 应用管理 null f \N 85 t 初始化数据 2025-09-05 00:49:41.666567 2025-09-05 00:49:41.666568 -我的应用 2 1 application:myapp:query system-application ApplicationSystem /application/myapp application/myapp/index \N f t f 应用系统管理 null f 85 86 t 初始化数据 2025-09-05 00:49:41.666568 2025-09-05 00:49:41.666568 -创建应用 3 1 application:myapp:create \N \N \N \N \N f t f 创建应用 null f 86 87 t 初始化数据 2025-09-05 00:49:41.666569 2025-09-05 00:49:41.666569 -修改应用 3 2 application:myapp:update \N \N \N \N \N f t f 修改应用 null f 86 88 t 初始化数据 2025-09-05 00:49:41.666569 2025-09-05 00:49:41.66657 -删除应用 3 3 application:myapp:delete \N \N \N \N \N f t f 删除应用 null f 86 89 t 初始化数据 2025-09-05 00:49:41.66657 2025-09-05 00:49:41.666571 -批量修改应用状态 3 4 application:myapp:patch \N \N \N \N \N f t f 批量修改应用状态 null f 86 90 t 初始化数据 2025-09-05 00:49:41.666571 2025-09-05 00:49:41.666571 -资源管理 1 7 \N folder Resource /resource \N /resource/file f f f 资源管理 null f \N 91 t 初始化数据 2025-09-05 00:49:41.666572 2025-09-05 00:49:41.666572 -文件管理 2 1 resource:file:query el-icon-FolderOpened ResourceFile /resource/file resource/file/index \N f t f 文件管理 null f 91 92 t 初始化数据 2025-09-05 00:49:41.666573 2025-09-05 00:49:41.666573 -文件上传 3 1 resource:file:upload \N \N \N \N \N f t f 文件上传 null f 92 93 t 初始化数据 2025-09-05 00:49:41.666573 2025-09-05 00:49:41.666574 -文件下载 3 2 resource:file:download \N \N \N \N \N f t f 文件下载 null f 92 94 t 初始化数据 2025-09-05 00:49:41.666574 2025-09-05 00:49:41.666575 -文件删除 3 3 resource:file:delete \N \N \N \N \N f t f 文件删除 null f 92 95 t 初始化数据 2025-09-05 00:49:41.666575 2025-09-05 00:49:41.666575 -文件移动 3 4 resource:file:move \N \N \N \N \N f t f 文件移动 null f 92 96 t 初始化数据 2025-09-05 00:49:41.666576 2025-09-05 00:49:41.666576 -文件复制 3 5 resource:file:copy \N \N \N \N \N f t f 文件复制 null f 92 97 t 初始化数据 2025-09-05 00:49:41.666576 2025-09-05 00:49:41.666577 -文件重命名 3 6 resource:file:rename \N \N \N \N \N f t f 文件重命名 null f 92 98 t 初始化数据 2025-09-05 00:49:41.666577 2025-09-05 00:49:41.666578 -创建目录 3 7 resource:file:create_dir \N \N \N \N \N f t f 创建目录 null f 92 99 t 初始化数据 2025-09-05 00:49:41.666578 2025-09-05 00:49:41.666578 -文件搜索 3 8 resource:file:search \N \N \N \N \N f t f 文件搜索 null f 92 100 t 初始化数据 2025-09-05 00:49:41.666579 2025-09-05 00:49:41.666579 -导出文件列表 3 9 resource:file:export \N \N \N \N \N f t f 导出文件列表 null f 92 101 t 初始化数据 2025-09-05 00:49:41.666579 2025-09-05 00:49:41.66658 +仪表盘 1 1 client Dashboard /dashboard \N /dashboard/workplace f t t 仪表盘 null f \N 1 t 初始化数据 2025-09-08 21:32:24.307881 2025-09-08 21:32:24.307883 +工作台 2 1 dashboard:workplace:query homepage Workplace /dashboard/workplace dashboard/workplace \N f t f 工作台 null t 1 2 t 初始化数据 2025-09-08 21:32:24.307884 2025-09-08 21:32:24.307884 +分析页 2 2 dashboard:analysis:query el-icon-PieChart Analysis /dashboard/analysis dashboard/analysis \N f t f 分析页 null f 1 3 t 初始化数据 2025-09-08 21:32:24.307885 2025-09-08 21:32:24.307885 +系统管理 1 2 \N system System /system \N /system/menu f t f 系统管理 null f \N 4 t 初始化数据 2025-09-08 21:32:24.307885 2025-09-08 21:32:24.307886 +菜单管理 2 1 system:menu:query menu Menu /system/menu system/menu/index \N f t f 菜单管理 null f 4 5 t 初始化数据 2025-09-08 21:32:24.307886 2025-09-08 21:32:24.307886 +部门管理 2 2 system:dept:query tree Dept /system/dept system/dept/index \N f t f 部门管理 null f 4 6 t 初始化数据 2025-09-08 21:32:24.307887 2025-09-08 21:32:24.307887 +岗位管理 2 3 system:position:query el-icon-Coordinate Position /system/position system/position/index \N f t f 岗位管理 null f 4 7 t 初始化数据 2025-09-08 21:32:24.307887 2025-09-08 21:32:24.307888 +角色管理 2 4 system:role:query role Role /system/role system/role/index \N f t f 角色管理 null f 4 8 t 初始化数据 2025-09-08 21:32:24.307888 2025-09-08 21:32:24.307889 +用户管理 2 5 system:user:query el-icon-User User /system/user system/user/index \N f t f 用户管理 null f 4 9 t 初始化数据 2025-09-08 21:32:24.307889 2025-09-08 21:32:24.307889 +日志管理 2 6 system:log:query el-icon-Aim Log /system/log system/log/index \N f t f 日志管理 null f 4 10 t 初始化数据 2025-09-08 21:32:24.30789 2025-09-08 21:32:24.30789 +公告管理 2 7 system:notice:query bell Notice /system/notice system/notice/index \N f t f 公告管理 null f 4 11 t 初始化数据 2025-09-08 21:32:24.30789 2025-09-08 21:32:24.307891 +配置管理 2 8 system:config:query setting Config /system/config system/config/index \N f t f 配置管理 null f 4 12 t 初始化数据 2025-09-08 21:32:24.307891 2025-09-08 21:32:24.307891 +字典管理 2 9 system:dict_type:query dict Dict /system/dict system/dict/index \N f t f 字典管理 null f 4 13 t 初始化数据 2025-09-08 21:32:24.307892 2025-09-08 21:32:24.307892 +创建菜单 3 1 system:menu:create \N \N \N \N \N f t f 创建菜单 null f 5 14 t 初始化数据 2025-09-08 21:32:24.307893 2025-09-08 21:32:24.307893 +修改菜单 3 2 system:menu:update \N \N \N \N \N f t f 修改菜单 null f 5 15 t 初始化数据 2025-09-08 21:32:24.307893 2025-09-08 21:32:24.307894 +删除菜单 3 3 system:menu:delete \N \N \N \N \N f t f 删除菜单 null f 5 16 t 初始化数据 2025-09-08 21:32:24.307894 2025-09-08 21:32:24.307894 +批量修改菜单状态 3 4 system:menu:patch \N \N \N \N \N f t f 批量修改菜单状态 null f 5 17 t 初始化数据 2025-09-08 21:32:24.307895 2025-09-08 21:32:24.307895 +创建部门 3 1 system:dept:create \N \N \N \N \N f t f 创建部门 null f 6 18 t 初始化数据 2025-09-08 21:32:24.307896 2025-09-08 21:32:24.307896 +修改部门 3 2 system:dept:update \N \N \N \N \N f t f 修改部门 null f 6 19 t 初始化数据 2025-09-08 21:32:24.307896 2025-09-08 21:32:24.307896 +删除部门 3 3 system:dept:delete \N \N \N \N \N f t f 删除部门 null f 6 20 t 初始化数据 2025-09-08 21:32:24.307897 2025-09-08 21:32:24.307897 +批量修改部门状态 3 4 system:dept:patch \N \N \N \N \N f t f 批量修改部门状态 null f 6 21 t 初始化数据 2025-09-08 21:32:24.307897 2025-09-08 21:32:24.307898 +创建岗位 3 1 system:position:create \N \N \N \N \N f t f 创建岗位 null f 7 22 t 初始化数据 2025-09-08 21:32:24.307898 2025-09-08 21:32:24.307898 +修改岗位 3 2 system:position:update \N \N \N \N \N f t f 修改岗位 null f 7 23 t 初始化数据 2025-09-08 21:32:24.307899 2025-09-08 21:32:24.307899 +删除岗位 3 3 system:position:delete \N \N \N \N \N f t f 修改岗位 null f 7 24 t 初始化数据 2025-09-08 21:32:24.307899 2025-09-08 21:32:24.3079 +批量修改岗位状态 3 4 system:position:patch \N \N \N \N \N f t f 批量修改岗位状态 null f 7 25 t 初始化数据 2025-09-08 21:32:24.3079 2025-09-08 21:32:24.3079 +岗位导出 3 5 system:position:export \N \N \N \N \N f t f 岗位导出 null f 7 26 t 初始化数据 2025-09-08 21:32:24.307901 2025-09-08 21:32:24.307901 +创建角色 3 1 system:role:create \N \N \N \N \N f t f 创建角色 null f 8 27 t 初始化数据 2025-09-08 21:32:24.307901 2025-09-08 21:32:24.307902 +修改角色 3 2 system:role:update \N \N \N \N \N f t f 修改角色 null f 8 28 t 初始化数据 2025-09-08 21:32:24.307902 2025-09-08 21:32:24.307902 +删除角色 3 3 system:role:delete \N \N \N \N \N f t f 删除角色 null f 8 29 t 初始化数据 2025-09-08 21:32:24.307903 2025-09-08 21:32:24.307903 +批量修改角色状态 3 4 system:role:patch \N \N \N \N \N f t f 批量修改角色状态 null f 8 30 t 初始化数据 2025-09-08 21:32:24.307903 2025-09-08 21:32:24.307904 +设置角色权限 3 8 system:role:permission \N \N \N \N \N f t f 设置角色权限 null f 7 31 t 初始化数据 2025-09-08 21:32:24.307904 2025-09-08 21:32:24.307904 +角色导出 3 6 system:role:export \N \N \N \N \N f t f 角色导出 null f 8 32 t 初始化数据 2025-09-08 21:32:24.307905 2025-09-08 21:32:24.307905 +创建用户 3 1 system:user:create \N \N \N \N \N f t f 创建用户 null f 9 33 t 初始化数据 2025-09-08 21:32:24.307905 2025-09-08 21:32:24.307906 +修改用户 3 2 system:user:update \N \N \N \N \N f t f 修改用户 null f 9 34 t 初始化数据 2025-09-08 21:32:24.307906 2025-09-08 21:32:24.307906 +删除用户 3 3 system:user:delete \N \N \N \N \N f t f 删除用户 null f 9 35 t 初始化数据 2025-09-08 21:32:24.307907 2025-09-08 21:32:24.307907 +批量修改用户状态 3 4 system:user:patch \N \N \N \N \N f t f 批量修改用户状态 null f 9 36 t 初始化数据 2025-09-08 21:32:24.307907 2025-09-08 21:32:24.307908 +导出用户 3 5 system:user:export \N \N \N \N \N f t f 导出用户 null f 9 37 t 初始化数据 2025-09-08 21:32:24.307908 2025-09-08 21:32:24.307908 +导入用户 3 6 system:user:import \N \N \N \N \N f t f 导入用户 null f 9 38 t 初始化数据 2025-09-08 21:32:24.307909 2025-09-08 21:32:24.307909 +日志删除 3 1 system:operation_log:delete \N \N \N \N \N f t f 日志删除 null f 10 39 t 初始化数据 2025-09-08 21:32:24.307909 2025-09-08 21:32:24.30791 +日志导出 3 2 system:operation_log:export \N \N \N \N \N f t f 日志导出 null f 10 40 t 初始化数据 2025-09-08 21:32:24.30791 2025-09-08 21:32:24.30791 +公告创建 3 1 system:notice:create \N \N \N \N \N f t f 公告创建 null f 11 41 t 初始化数据 2025-09-08 21:32:24.307911 2025-09-08 21:32:24.307911 +公告修改 3 2 system:notice:update \N \N \N \N \N f t f 修改用户 null f 11 42 t 初始化数据 2025-09-08 21:32:24.307911 2025-09-08 21:32:24.307912 +公告删除 3 3 system:notice:delete \N \N \N \N \N f t f 公告删除 null f 11 43 t 初始化数据 2025-09-08 21:32:24.307912 2025-09-08 21:32:24.307912 +公告导出 3 4 system:notice:export \N \N \N \N \N f t f 公告导出 null f 11 44 t 初始化数据 2025-09-08 21:32:24.307913 2025-09-08 21:32:24.307913 +公告批量修改状态 3 5 system:notice:patch \N \N \N \N \N f t f 公告批量修改状态 null f 11 45 t 初始化数据 2025-09-08 21:32:24.307913 2025-09-08 21:32:24.307914 +创建配置 3 1 system:config:create \N \N \N \N \N f t f 创建配置 null f 12 46 t 初始化数据 2025-09-08 21:32:24.307914 2025-09-08 21:32:24.307914 +修改配置 3 2 system:config:update \N \N \N \N \N f t f 修改配置 null f 12 47 t 初始化数据 2025-09-08 21:32:24.307915 2025-09-08 21:32:24.307915 +删除配置 3 3 system:config:delete \N \N \N \N \N f t f 删除配置 null f 12 48 t 初始化数据 2025-09-08 21:32:24.307915 2025-09-08 21:32:24.307915 +导出配置 3 4 system:config:export \N \N \N \N \N f t f 导出配置 null f 12 49 t 初始化数据 2025-09-08 21:32:24.307916 2025-09-08 21:32:24.307916 +配置上传 3 5 system:config:upload \N \N \N \N \N f t f 配置上传 null f 12 50 t 初始化数据 2025-09-08 21:32:24.307916 2025-09-08 21:32:24.307917 +创建字典类型 3 1 system:dict_type:create \N \N \N \N \N f t f 创建字典类型 null f 13 51 t 初始化数据 2025-09-08 21:32:24.307917 2025-09-08 21:32:24.307917 +修改字典类型 3 2 system:dict_type:update \N \N \N \N \N f t f 修改字典类型 null f 13 52 t 初始化数据 2025-09-08 21:32:24.307918 2025-09-08 21:32:24.307918 +删除字典类型 3 3 system:dict_type:delete \N \N \N \N \N f t f 删除字典类型 null f 13 53 t 初始化数据 2025-09-08 21:32:24.307918 2025-09-08 21:32:24.307919 +导出字典类型 3 4 system:dict_type:export \N \N \N \N \N f t f 导出字典类型 null f 13 54 t 初始化数据 2025-09-08 21:32:24.307919 2025-09-08 21:32:24.307919 +批量修改字典状态 3 5 system:dict_type:patch \N \N \N \N \N f t f 导出字典类型 null f 13 55 t 初始化数据 2025-09-08 21:32:24.30792 2025-09-08 21:32:24.30792 +字典数据查询 3 6 system:dict_data:query \N \N \N \N \N f t f 字典数据查询 null f 13 56 t 初始化数据 2025-09-08 21:32:24.307921 2025-09-08 21:32:24.307921 +创建字典数据 3 7 system:dict_data:create \N \N \N \N \N f t f 创建字典数据 null f 13 57 t 初始化数据 2025-09-08 21:32:24.307921 2025-09-08 21:32:24.307922 +修改字典数据 3 8 system:dict_data:update \N \N \N \N \N f t f 修改字典数据 null f 13 58 t 初始化数据 2025-09-08 21:32:24.307922 2025-09-08 21:32:24.307922 +删除字典数据 3 9 system:dict_data:delete \N \N \N \N \N f t f 删除字典数据 null f 13 59 t 初始化数据 2025-09-08 21:32:24.307923 2025-09-08 21:32:24.307923 +导出字典数据 3 10 system:dict_data:export \N \N \N \N \N f t f 导出字典数据 null f 13 60 t 初始化数据 2025-09-08 21:32:24.307923 2025-09-08 21:32:24.307924 +批量修改字典数据状态 3 11 system:dict_data:patch \N \N \N \N \N f t f 批量修改字典数据状态 null f 13 61 t 初始化数据 2025-09-08 21:32:24.307924 2025-09-08 21:32:24.307924 +监控管理 1 3 \N monitor Monitor /monitor \N /monitor/online f f f 监控管理 null f \N 62 t 初始化数据 2025-09-08 21:32:24.307925 2025-09-08 21:32:24.307925 +任务管理 2 1 monitor:job:query el-icon-DataLine Job /monitor/job monitor/job/index \N f t f 任务管理 null f 62 63 t 初始化数据 2025-09-08 21:32:24.307925 2025-09-08 21:32:24.307926 +创建任务 3 1 monitor:job:create \N \N \N \N \N f t f 创建任务 null f 63 64 t 初始化数据 2025-09-08 21:32:24.307926 2025-09-08 21:32:24.307926 +修改和操作任务 3 2 monitor:job:update \N \N \N \N \N f t f 修改和操作任务 null f 63 65 t 初始化数据 2025-09-08 21:32:24.307927 2025-09-08 21:32:24.307927 +删除和清除任务 3 3 monitor:job:delete \N \N \N \N \N f t f 删除和清除任务 null f 63 66 t 初始化数据 2025-09-08 21:32:24.307927 2025-09-08 21:32:24.307927 +导出定时任务 3 4 monitor:job:export \N \N \N \N \N f t f 导出定时任务 null f 63 67 t 初始化数据 2025-09-08 21:32:24.307928 2025-09-08 21:32:24.307928 +在线用户 2 2 monitor:online:query el-icon-Headset MonitorOnline /monitor/online monitor/online/index \N f f f 在线用户 null f 62 68 t 初始化数据 2025-09-08 21:32:24.307929 2025-09-08 21:32:24.307929 +在线用户强制下线 3 1 monitor:online:delete \N \N \N \N \N f f f 在线用户强制下线 null f 68 69 t 初始化数据 2025-09-08 21:32:24.307929 2025-09-08 21:32:24.307929 +服务器监控 2 3 monitor:server:query el-icon-Odometer MonitorServer /monitor/server monitor/server/index \N f f f 服务器监控 null f 62 70 t 初始化数据 2025-09-08 21:32:24.30793 2025-09-08 21:32:24.30793 +缓存监控 2 4 monitor:cache:query el-icon-Stopwatch MonitorCache /monitor/cache monitor/cache/index \N f f f 缓存监控 null f 62 71 t 初始化数据 2025-09-08 21:32:24.30793 2025-09-08 21:32:24.307931 +清除缓存 3 1 monitor:cache:delete \N \N \N \N \N f f f 清除缓存 null f 71 72 t 初始化数据 2025-09-08 21:32:24.307931 2025-09-08 21:32:24.307931 +公共模块 1 4 \N document Common /common \N /common/docs f f f 公共模块 null f \N 73 t 初始化数据 2025-09-08 21:32:24.307932 2025-09-08 21:32:24.307932 +接口管理 4 1 common:docs:query api Docs /common/docs common/docs/index \N f f f 接口管理 null f 73 74 t 初始化数据 2025-09-08 21:32:24.307932 2025-09-08 21:32:24.307933 +文档管理 4 2 common:redoc:query el-icon-Document Redoc /common/redoc common/redoc/index \N f f f 文档管理 null f 73 75 t 初始化数据 2025-09-08 21:32:24.307933 2025-09-08 21:32:24.307933 +演示模块 1 5 \N el-icon-Document Demo /demo \N /demo/example f f f 演示模块 null f \N 76 t 初始化数据 2025-09-08 21:32:24.307934 2025-09-08 21:32:24.307934 +示例管理 2 1 demo:example:query el-icon-DataLine Example /demo/example demo/example/index \N f t f 示例管理 null f 76 77 t 初始化数据 2025-09-08 21:32:24.307934 2025-09-08 21:32:24.307935 +创建示例 3 1 demo:example:create \N \N \N \N \N f t f 创建示例 null f 77 78 t 初始化数据 2025-09-08 21:32:24.307935 2025-09-08 21:32:24.307935 +更新示例 3 2 demo:example:update \N \N \N \N \N f t f 更新示例 null f 77 79 t 初始化数据 2025-09-08 21:32:24.307936 2025-09-08 21:32:24.307936 +删除示例 3 3 demo:example:delete \N \N \N \N \N f t f 删除示例 null f 77 80 t 初始化数据 2025-09-08 21:32:24.307936 2025-09-08 21:32:24.307937 +批量修改示例状态 3 4 demo:example:patch \N \N \N \N \N f t f 批量修改示例状态 null f 77 81 t 初始化数据 2025-09-08 21:32:24.307937 2025-09-08 21:32:24.307937 +导出示例 3 5 demo:example:export \N \N \N \N \N f t f 导出示例 null f 77 82 t 初始化数据 2025-09-08 21:32:24.307938 2025-09-08 21:32:24.307938 +导入示例 3 6 demo:example:import \N \N \N \N \N f t f 导入示例 null f 77 83 t 初始化数据 2025-09-08 21:32:24.307938 2025-09-08 21:32:24.307939 +下载导入示例模版 3 7 demo:example:download \N \N \N \N \N f t f 下载导入示例模版 null f 77 84 t 初始化数据 2025-09-08 21:32:24.307939 2025-09-08 21:32:24.307939 +应用管理 1 6 \N captcha Application /application \N /application/myapp f f f 应用管理 null f \N 85 t 初始化数据 2025-09-08 21:32:24.30794 2025-09-08 21:32:24.30794 +我的应用 2 1 application:myapp:query el-icon-DataLine ApplicationSystem /application/myapp application/myapp/index \N f t f 应用系统管理 null f 85 86 t 初始化数据 2025-09-08 21:32:24.30794 2025-09-08 21:32:24.307941 +创建应用 3 1 application:myapp:create \N \N \N \N \N f t f 创建应用 null f 86 87 t 初始化数据 2025-09-08 21:32:24.307941 2025-09-08 21:32:24.307941 +修改应用 3 2 application:myapp:update \N \N \N \N \N f t f 修改应用 null f 86 88 t 初始化数据 2025-09-08 21:32:24.307942 2025-09-08 21:32:24.307942 +删除应用 3 3 application:myapp:delete \N \N \N \N \N f t f 删除应用 null f 86 89 t 初始化数据 2025-09-08 21:32:24.307942 2025-09-08 21:32:24.307942 +批量修改应用状态 3 4 application:myapp:patch \N \N \N \N \N f t f 批量修改应用状态 null f 86 90 t 初始化数据 2025-09-08 21:32:24.307943 2025-09-08 21:32:24.307943 +资源管理 1 7 \N document Resource /resource \N /resource/file f f f 资源管理 null f \N 91 t 初始化数据 2025-09-08 21:32:24.307943 2025-09-08 21:32:24.307944 +文件管理 2 1 resource:file:query el-icon-Files ResourceFile /resource/file resource/file/index \N f t f 文件管理 null f 91 92 t 初始化数据 2025-09-08 21:32:24.307944 2025-09-08 21:32:24.307944 +文件上传 3 1 resource:file:upload \N \N \N \N \N f t f 文件上传 null f 92 93 t 初始化数据 2025-09-08 21:32:24.307945 2025-09-08 21:32:24.307945 +文件下载 3 2 resource:file:download \N \N \N \N \N f t f 文件下载 null f 92 94 t 初始化数据 2025-09-08 21:32:24.307945 2025-09-08 21:32:24.307946 +文件删除 3 3 resource:file:delete \N \N \N \N \N f t f 文件删除 null f 92 95 t 初始化数据 2025-09-08 21:32:24.307946 2025-09-08 21:32:24.307946 +文件移动 3 4 resource:file:move \N \N \N \N \N f t f 文件移动 null f 92 96 t 初始化数据 2025-09-08 21:32:24.307947 2025-09-08 21:32:24.307947 +文件复制 3 5 resource:file:copy \N \N \N \N \N f t f 文件复制 null f 92 97 t 初始化数据 2025-09-08 21:32:24.307947 2025-09-08 21:32:24.307948 +文件重命名 3 6 resource:file:rename \N \N \N \N \N f t f 文件重命名 null f 92 98 t 初始化数据 2025-09-08 21:32:24.307948 2025-09-08 21:32:24.307948 +创建目录 3 7 resource:file:create_dir \N \N \N \N \N f t f 创建目录 null f 92 99 t 初始化数据 2025-09-08 21:32:24.307949 2025-09-08 21:32:24.307949 +文件搜索 3 8 resource:file:search \N \N \N \N \N f t f 文件搜索 null f 92 100 t 初始化数据 2025-09-08 21:32:24.307949 2025-09-08 21:32:24.30795 +导出文件列表 3 9 resource:file:export \N \N \N \N \N f t f 导出文件列表 null f 92 101 t 初始化数据 2025-09-08 21:32:24.30795 2025-09-08 21:32:24.30795 +AI大模型 1 8 \N el-icon-DataLine AI /ai \N /ai/mcp f f f AI大模型 null f \N 102 t AI大模型管理 2025-09-08 21:32:24.307951 2025-09-08 21:32:24.307951 +MCP智能助手 2 1 ai:mcp:chat el-icon-DataLine MCP /ai/mcp ai/mcp/index \N f t f MCP智能助手 null f 102 103 t MCP智能助手 2025-09-08 21:32:24.307951 2025-09-08 21:32:24.307952 +智能对话 3 1 ai:mcp:chat \N \N \N \N \N f t f 智能对话 null f 103 104 t 智能对话 2025-09-08 21:32:24.307952 2025-09-08 21:32:24.307952 \. @@ -2381,10 +2387,10 @@ COPY public.system_menu (name, type, "order", permission, icon, route_name, rout -- COPY public.system_notice (notice_title, notice_type, notice_content, creator_id, id, status, description, created_at, updated_at) FROM stdin; -系统更新 1 2099年9月9日,晚上12:00,系统更新 1 1 t 系统更新 2025-09-05 00:49:41.683079 2025-09-05 00:49:41.68308 -系统维护 2 2099年9月9日,晚上12:00,系统维护 1 2 t 系统维护 2025-09-05 00:49:41.683081 2025-09-05 00:49:41.683081 -系统更新完成 1 2099年9月9日,晚上12:00,系统更新完成 1 3 f 系统更新完成 2025-09-05 00:49:41.683081 2025-09-05 00:49:41.683082 -系统维护完成 2 2099年9月9日,晚上12:00,系统维护完成 1 4 f 系统维护完成 2025-09-05 00:49:41.683082 2025-09-05 00:49:41.683083 +系统更新 1 2099年9月9日,晚上12:00,系统更新 1 1 t 系统更新 2025-09-08 21:32:24.32348 2025-09-08 21:32:24.323481 +系统维护 2 2099年9月9日,晚上12:00,系统维护 1 2 t 系统维护 2025-09-08 21:32:24.323482 2025-09-08 21:32:24.323482 +系统更新完成 1 2099年9月9日,晚上12:00,系统更新完成 1 3 f 系统更新完成 2025-09-08 21:32:24.323482 2025-09-08 21:32:24.323483 +系统维护完成 2 2099年9月9日,晚上12:00,系统维护完成 1 4 f 系统维护完成 2025-09-08 21:32:24.323483 2025-09-08 21:32:24.323483 \. @@ -2393,13 +2399,13 @@ COPY public.system_notice (notice_title, notice_type, notice_content, creator_id -- COPY public.system_position (name, "order", creator_id, id, status, description, created_at, updated_at) FROM stdin; -董事长岗 1 1 1 t 董事长岗位 2025-09-05 00:49:41.676741 2025-09-05 00:49:41.676742 -运营岗 2 1 2 t 运营岗位 2025-09-05 00:49:41.676743 2025-09-05 00:49:41.676744 -销售岗 3 1 3 t 销售岗 2025-09-05 00:49:41.676744 2025-09-05 00:49:41.676744 -人事行政岗 4 1 4 t 人事行政岗 2025-09-05 00:49:41.676745 2025-09-05 00:49:41.676745 -开发岗 5 1 5 t 开发岗 2025-09-05 00:49:41.676746 2025-09-05 00:49:41.676746 -测试岗 6 1 6 t 测试岗 2025-09-05 00:49:41.676746 2025-09-05 00:49:41.676747 -演示岗 7 1 7 t 演示岗 2025-09-05 00:49:41.676747 2025-09-05 00:49:41.676748 +董事长岗 1 1 1 t 董事长岗位 2025-09-08 21:32:24.316837 2025-09-08 21:32:24.316838 +运营岗 2 1 2 t 运营岗位 2025-09-08 21:32:24.316839 2025-09-08 21:32:24.316839 +销售岗 3 1 3 t 销售岗 2025-09-08 21:32:24.316839 2025-09-08 21:32:24.31684 +人事行政岗 4 1 4 t 人事行政岗 2025-09-08 21:32:24.31684 2025-09-08 21:32:24.316841 +开发岗 5 1 5 t 开发岗 2025-09-08 21:32:24.316841 2025-09-08 21:32:24.316841 +测试岗 6 1 6 t 测试岗 2025-09-08 21:32:24.316842 2025-09-08 21:32:24.316842 +演示岗 7 1 7 t 演示岗 2025-09-08 21:32:24.316842 2025-09-08 21:32:24.316843 \. @@ -2408,8 +2414,8 @@ COPY public.system_position (name, "order", creator_id, id, status, description, -- COPY public.system_role (name, code, "order", data_scope, creator_id, id, status, description, created_at, updated_at) FROM stdin; -管理员角色 \N 1 4 1 1 t 管理员 2025-09-05 00:49:41.674899 2025-09-05 00:49:41.6749 -普通角色 \N 2 1 1 2 t 普通角色 2025-09-05 00:49:41.674901 2025-09-05 00:49:41.674901 +管理员角色 \N 1 4 1 1 t 管理员 2025-09-08 21:32:24.31507 2025-09-08 21:32:24.315071 +普通角色 \N 2 1 1 2 t 普通角色 2025-09-08 21:32:24.315072 2025-09-08 21:32:24.315072 \. @@ -2519,6 +2525,20 @@ COPY public.system_role_menus (role_id, menu_id) FROM stdin; 1 88 1 89 1 90 +1 91 +1 92 +1 93 +1 94 +1 95 +1 96 +1 97 +1 98 +1 99 +1 100 +1 101 +1 102 +1 103 +1 104 2 1 2 2 \. @@ -2551,9 +2571,9 @@ COPY public.system_user_roles (user_id, role_id) FROM stdin; -- COPY public.system_users (username, password, name, mobile, email, gender, avatar, is_superuser, last_login, dept_id, creator_id, id, status, description, created_at, updated_at) FROM stdin; -superadmin $2b$12$/Df5YczDGF41zCh2F8Xbu.yHTJXGm3tONgsXz1KLUdG0mtpKUOLD2 超级管理员 15382112620 948080782@qq.com 1 https://service.fastapiadmin.com/api/v1/static/image/avatar.png t \N 1 \N 1 t 超级管理员 2025-09-05 00:49:41.672459 2025-09-05 00:49:41.672461 -admin $2b$12$e2IJgS/cvHgJ0H3G7Xa08OXoXnk6N/NX3IZRtubBDElA0VLZhkNOa 管理员 15382112222 admin@qq.com 0 https://service.fastapiadmin.com/api/v1/static/image/avatar.png f \N 1 1 2 t 管理员 2025-09-05 00:49:41.672462 2025-09-05 00:49:41.672462 -demo $2b$12$e2IJgS/cvHgJ0H3G7Xa08OXoXnk6N/NX3IZRtubBDElA0VLZhkNOa 演示用户 15382112121 demo@qq.com 1 https://service.fastapiadmin.com/api/v1/static/image/avatar.png f \N 6 1 3 t 演示用户 2025-09-05 00:49:41.672463 2025-09-05 00:49:41.672463 +demo $2b$12$e2IJgS/cvHgJ0H3G7Xa08OXoXnk6N/NX3IZRtubBDElA0VLZhkNOa 演示用户 15382112121 demo@qq.com 1 https://service.fastapiadmin.com/api/v1/static/image/avatar.png f \N 6 1 3 t 演示用户 2025-09-08 21:32:24.31318 2025-09-08 21:32:24.31318 +admin $2b$12$e2IJgS/cvHgJ0H3G7Xa08OXoXnk6N/NX3IZRtubBDElA0VLZhkNOa 管理员 15382112222 admin@qq.com 0 https://service.fastapiadmin.com/api/v1/static/image/avatar.png f 2025-09-08 13:33:47.640825+00 1 1 2 t 管理员 2025-09-08 21:32:24.313179 2025-09-08 21:33:47.65267 +superadmin $2b$12$/Df5YczDGF41zCh2F8Xbu.yHTJXGm3tONgsXz1KLUdG0mtpKUOLD2 超级管理员 15382112620 948080782@qq.com 1 https://service.fastapiadmin.com/api/v1/static/image/avatar.png t 2025-09-08 13:34:23.3699+00 1 \N 1 t 超级管理员 2025-09-08 21:32:24.313177 2025-09-08 21:34:23.382389 \. @@ -2575,7 +2595,7 @@ SELECT pg_catalog.setval('public.example_demo_id_seq', 1, false); -- Name: monitor_job_id_seq; Type: SEQUENCE SET; Schema: public; Owner: tao -- -SELECT pg_catalog.setval('public.monitor_job_id_seq', 1, false); +SELECT pg_catalog.setval('public.monitor_job_id_seq', 3, true); -- @@ -2589,70 +2609,70 @@ SELECT pg_catalog.setval('public.monitor_job_log_id_seq', 1, false); -- Name: system_config_id_seq; Type: SEQUENCE SET; Schema: public; Owner: tao -- -SELECT pg_catalog.setval('public.system_config_id_seq', 1, false); +SELECT pg_catalog.setval('public.system_config_id_seq', 12, true); -- -- Name: system_dept_id_seq; Type: SEQUENCE SET; Schema: public; Owner: tao -- -SELECT pg_catalog.setval('public.system_dept_id_seq', 1, false); +SELECT pg_catalog.setval('public.system_dept_id_seq', 11, true); -- -- Name: system_dict_data_id_seq; Type: SEQUENCE SET; Schema: public; Owner: tao -- -SELECT pg_catalog.setval('public.system_dict_data_id_seq', 1, false); +SELECT pg_catalog.setval('public.system_dict_data_id_seq', 34, true); -- -- Name: system_dict_type_id_seq; Type: SEQUENCE SET; Schema: public; Owner: tao -- -SELECT pg_catalog.setval('public.system_dict_type_id_seq', 1, false); +SELECT pg_catalog.setval('public.system_dict_type_id_seq', 10, true); -- -- Name: system_log_id_seq; Type: SEQUENCE SET; Schema: public; Owner: tao -- -SELECT pg_catalog.setval('public.system_log_id_seq', 1, false); +SELECT pg_catalog.setval('public.system_log_id_seq', 3, true); -- -- Name: system_menu_id_seq; Type: SEQUENCE SET; Schema: public; Owner: tao -- -SELECT pg_catalog.setval('public.system_menu_id_seq', 1, false); +SELECT pg_catalog.setval('public.system_menu_id_seq', 104, true); -- -- Name: system_notice_id_seq; Type: SEQUENCE SET; Schema: public; Owner: tao -- -SELECT pg_catalog.setval('public.system_notice_id_seq', 1, false); +SELECT pg_catalog.setval('public.system_notice_id_seq', 4, true); -- -- Name: system_position_id_seq; Type: SEQUENCE SET; Schema: public; Owner: tao -- -SELECT pg_catalog.setval('public.system_position_id_seq', 1, false); +SELECT pg_catalog.setval('public.system_position_id_seq', 7, true); -- -- Name: system_role_id_seq; Type: SEQUENCE SET; Schema: public; Owner: tao -- -SELECT pg_catalog.setval('public.system_role_id_seq', 1, false); +SELECT pg_catalog.setval('public.system_role_id_seq', 2, true); -- -- Name: system_users_id_seq; Type: SEQUENCE SET; Schema: public; Owner: tao -- -SELECT pg_catalog.setval('public.system_users_id_seq', 1, false); +SELECT pg_catalog.setval('public.system_users_id_seq', 3, true); -- diff --git a/fastapp/.prettierrc.yaml b/fastapp/.prettierrc.yaml index d9cf0c72..7301a90e 100644 --- a/fastapp/.prettierrc.yaml +++ b/fastapp/.prettierrc.yaml @@ -4,6 +4,8 @@ arrowParens: "always" bracketSameLine: false # 对象字面量中的括号之间添加空格 bracketSpacing: true +# 在对象字面量中,如果属性名需要引号,则使用单引号 +singleAttributePerLine: false # 自动格式化嵌入的代码(如 Markdown 和 HTML 内的代码) embeddedLanguageFormatting: "auto" # 忽略 HTML 空白敏感度,将空白视为非重要内容 @@ -12,8 +14,8 @@ htmlWhitespaceSensitivity: "ignore" insertPragma: false # 在 JSX 中使用双引号 jsxSingleQuote: false -# 每行代码的最大长度限制为 100 字符 -printWidth: 100 +# 每行代码的最大长度限制为 200 字符 +printWidth: 200 # 在 Markdown 中保留原有的换行格式 proseWrap: "preserve" # 仅在必要时添加对象属性的引号 @@ -34,8 +36,15 @@ useTabs: false vueIndentScriptAndStyle: false # 根据系统自动检测换行符 endOfLine: "auto" -# 对 HTML 文件应用特定格式化规则 +# 对特定文件类型应用更宽松的格式化规则 overrides: - files: "*.html" options: parser: "html" + - files: "*.vue" + options: + printWidth: 300 + singleAttributePerLine: false + - files: "*.{js,ts}" + options: + printWidth: 250 diff --git a/fastapp/README.md b/fastapp/README.md index c8febeed..413237cd 100644 --- a/fastapp/README.md +++ b/fastapp/README.md @@ -1,6 +1,6 @@ # 项目介绍 -基于 uni-app + Vue 3 + TypeScript 移动端跨平台开发模板,集成了 ESLint、Prettier、Stylelint、Husky 和 Commitlint 等工具,确保代码规范与质量。 +基于 uni-app + wot-design-uni + Vue 3 + TypeScript 移动端跨平台开发模板,集成了 ESLint、Prettier、Stylelint、Husky 和 Commitlint 等工具,确保代码规范与质量。 ## 项目截图 diff --git a/fastapp/components.d.ts b/fastapp/components.d.ts index 11d65601..7b2eaebb 100644 --- a/fastapp/components.d.ts +++ b/fastapp/components.d.ts @@ -23,6 +23,8 @@ declare module 'vue' { WdCell: typeof import('wot-design-uni/components/wd-cell/wd-cell.vue')['default'] WdCellGroup: typeof import('wot-design-uni/components/wd-cell-group/wd-cell-group.vue')['default'] WdCheckbox: typeof import('wot-design-uni/components/wd-checkbox/wd-checkbox.vue')['default'] + WdCollapse: typeof import('wot-design-uni/components/wd-collapse/wd-collapse.vue')['default'] + WdCollapseItem: typeof import('wot-design-uni/components/wd-collapse-item/wd-collapse-item.vue')['default'] WdConfigProvider: typeof import('wot-design-uni/components/wd-config-provider/wd-config-provider.vue')['default'] WdDivider: typeof import('wot-design-uni/components/wd-divider/wd-divider.vue')['default'] WdForm: typeof import('wot-design-uni/components/wd-form/wd-form.vue')['default'] @@ -37,6 +39,7 @@ declare module 'vue' { WdNoticeBar: typeof import('wot-design-uni/components/wd-notice-bar/wd-notice-bar.vue')['default'] WdNotify: typeof import('wot-design-uni/components/wd-notify/wd-notify.vue')['default'] WdPopup: typeof import('wot-design-uni/components/wd-popup/wd-popup.vue')['default'] + WdProgress: typeof import('wot-design-uni/components/wd-progress/wd-progress.vue')['default'] WdRadio: typeof import('wot-design-uni/components/wd-radio/wd-radio.vue')['default'] WdRadioGroup: typeof import('wot-design-uni/components/wd-radio-group/wd-radio-group.vue')['default'] WdSwiper: typeof import('wot-design-uni/components/wd-swiper/wd-swiper.vue')['default'] @@ -45,6 +48,8 @@ declare module 'vue' { WdTabbarItem: typeof import('wot-design-uni/components/wd-tabbar-item/wd-tabbar-item.vue')['default'] WdTag: typeof import('wot-design-uni/components/wd-tag/wd-tag.vue')['default'] WdText: typeof import('wot-design-uni/components/wd-text/wd-text.vue')['default'] + WdTextarea: typeof import('wot-design-uni/components/wd-textarea/wd-textarea.vue')['default'] WdToast: typeof import('wot-design-uni/components/wd-toast/wd-toast.vue')['default'] + WdUpload: typeof import('wot-design-uni/components/wd-upload/wd-upload.vue')['default'] } } diff --git a/fastapp/docs/theme-system-guide.md b/fastapp/docs/theme-system-guide.md deleted file mode 100644 index 4ab07cdf..00000000 --- a/fastapp/docs/theme-system-guide.md +++ /dev/null @@ -1,301 +0,0 @@ -# 主题系统使用指南 - -## 概述 - -本项目基于 Wot Design Uni 的 ConfigProvider 组件实现了完整的主题系统,支持: - -- 🌙 暗黑/浅色模式切换 -- 🎨 12种预设主题色 -- 🎯 自定义主题色 -- 💾 主题设置持久化存储 -- 📱 多平台兼容(H5、小程序) - -## 核心文件 - -### 1. useTheme Composable (`src/composables/useTheme.ts`) - -主题管理的核心逻辑,提供: - -```typescript -const { - theme, // 当前主题模式 'light' | 'dark' - themeVars, // ConfigProviderThemeVars 主题变量 - toggleTheme, // 切换主题模式 - setThemeColor, // 设置主题色 - resetTheme, // 重置主题 - initTheme, // 初始化主题 - colorColumns, // 预设主题色列表 -} = useTheme(); -``` - -### 2. 布局文件 - -#### Tabbar 布局 (`src/layouts/tabbar.vue`) - -```vue - -``` - -#### Default 布局 (`src/layouts/default.vue`) - -```vue - -``` - -### 3. 主题设置页面 (`src/pages/mine/settings/theme/index.vue`) - -提供用户界面来: - -- 切换暗黑/浅色模式 -- 选择预设主题色 -- 输入自定义主题色 -- 预览主题效果 -- 重置主题设置 - -## 主题变量 - -### 支持的 ConfigProviderThemeVars - -根据 Wot Design Uni 文档,主要使用: - -```typescript -interface ConfigProviderThemeVars { - colorTheme?: string; // 主题色 - buttonPrimaryBgColor?: string; // 主按钮背景色 - buttonPrimaryColor?: string; // 主按钮文字色 - // ... 更多变量 -} -``` - -### 预设主题色 - -```typescript -const colorColumns = [ - { value: "#165DFF", label: "蓝色" }, - { value: "#0FC6C2", label: "青绿色" }, - { value: "#722ED1", label: "紫色" }, - { value: "#F5222D", label: "红色" }, - { value: "#FA8C16", label: "橙色" }, - { value: "#FADB14", label: "黄色" }, - { value: "#52C41A", label: "绿色" }, - { value: "#EB2F96", label: "粉色" }, - { value: "#13C2C2", label: "青色" }, - { value: "#1890FF", label: "天蓝色" }, - { value: "#CD5C5C", label: "经典红" }, - { value: "#228B22", label: "自然绿" }, -]; -``` - -## 暗黑模式实现 - -### 1. ConfigProvider 主题切换 - -```vue - - - -``` - -### 2. 全局样式适配 - -在 `src/uni.scss` 中定义: - -```scss -.wot-theme-dark { - background-color: #1a1a1a !important; - color: #f5f5f5 !important; - - /* H5 环境 body 样式 */ - body { - background-color: #1a1a1a !important; - color: #f5f5f5 !important; - } - - /* 其他组件暗黑模式适配 */ -} -``` - -### 3. 动态 Body 样式 - -在 `useTheme` 中自动处理: - -```typescript -const applyDarkModeBodyStyle = (isDark: boolean) => { - // #ifdef H5 - if (typeof document !== "undefined") { - const body = document.body; - if (isDark) { - body.style.backgroundColor = "#1a1a1a"; - body.style.color = "#f5f5f5"; - body.classList.add("wot-theme-dark"); - } else { - body.style.backgroundColor = "#f8f8f8"; - body.style.color = "#333"; - body.classList.remove("wot-theme-dark"); - } - } - // #endif -}; -``` - -## 持久化存储 - -主题设置自动保存到本地存储,无需手动调用: - -```typescript -// 存储键名 -const THEME_STORAGE_KEY = "app_theme_mode"; -const THEME_COLOR_STORAGE_KEY = "app_theme_color"; - -// 主题设置自动持久化,在 useTheme 中已处理 -// 包含主题模式、主题色、是否跟随系统、用户设置状态 -``` - -主题设置会在以下情况自动保存: - -- 切换主题模式时 -- 设置主题色时 -- 重置主题时 -- 跟随系统设置改变时 - -## 使用示例 - -### 在页面中使用主题 - -```vue - - - -``` - -### 在组件中响应主题变化 - -```vue - - - - - -``` - -## 最佳实践 - -### 1. 组件开发 - -- 使用 Wot Design Uni 组件时,主题色会自动应用 -- 自定义组件需要手动适配暗黑模式 -- 使用 `:class="{ 'wot-theme-dark': theme === 'dark' }"` 来应用暗黑模式样式 - -### 2. 样式编写 - -```scss -.my-component { - background-color: #fff; - color: #333; - - // 暗黑模式适配 - .wot-theme-dark & { - background-color: #2a2a2a; - color: #f5f5f5; - } -} -``` - -### 3. 主题色使用 - -```vue - -``` - -## 注意事项 - -1. **ConfigProvider 包裹**:确保页面被 ConfigProvider 包裹才能应用主题 -2. **样式优先级**:暗黑模式样式需要足够的优先级,必要时使用 `!important` -3. **平台兼容**:小程序和 H5 的样式处理略有不同,使用条件编译处理 -4. **性能考虑**:主题切换时避免频繁的 DOM 操作 - -## 扩展功能 - -### 添加新的主题色 - -在 `colorColumns` 中添加新的颜色: - -```typescript -export const colorColumns = [ - // ... 现有颜色 - { value: "#FF6B6B", label: "珊瑚红" }, - { value: "#4ECDC4", label: "薄荷绿" }, -]; -``` - -### 添加更多主题变量 - -```typescript -const themeVars = ref({ - colorTheme: getStoredThemeColor(), - buttonPrimaryBgColor: getStoredThemeColor(), - // 添加更多变量 -}); -``` - -### 自定义暗黑模式样式 - -在 `uni.scss` 中添加更多组件的暗黑模式适配: - -```scss -.wot-theme-dark { - // 新组件的暗黑模式样式 - .my-custom-component { - background-color: #2a2a2a; - color: #f5f5f5; - } -} -``` diff --git a/fastapp/docs/uniapp整合mini-router.md b/fastapp/docs/uniapp整合mini-router.md deleted file mode 100644 index 51492094..00000000 --- a/fastapp/docs/uniapp整合mini-router.md +++ /dev/null @@ -1,427 +0,0 @@ -# uni-mini-router 在UniApp中的整合教程 - -## 一、uni-mini-router简介 - -uni-mini-router是一个轻量级的路由管理库,专为uni-app设计,解决了uni-app原生路由系统中没有路由拦截等关键功能的问题。它提供了类似Vue Router的API体验,使得在uni-app项目中实现更加灵活和强大的路由管理成为可能。 - -### 主要特点 - -1. **Vue Router风格API**:提供与Vue Router相似的API,降低学习成本 -2. **路由拦截功能**:支持全局导航守卫,可以在路由跳转前后执行逻辑 -3. **优雅的参数传递**:支持params和query方式传参 -4. **命名路由**:支持通过路由名称进行导航 -5. **类型支持**:完整的TypeScript类型定义 -6. **轻量级**:体积小,性能高效 - -## 二、安装与基本配置 - -### 1. 安装uni-mini-router - -使用npm或yarn安装uni-mini-router: - -```bash -pnpm add - uni-mini-router -``` - -### 2. 初始化路由 - -在项目中创建router目录并初始化路由配置: - -```typescript -// src/router/index.ts -import { createRouter } from "uni-mini-router"; -import { pages, subPackages } from "virtual:uni-pages"; - -// 生成路由配置 -function generateRoutes() { - const routes = pages.map((page) => { - const newPath = `/${page.path}`; - return { ...page, path: newPath }; - }); - - // 处理分包路由 - if (subPackages && subPackages.length > 0) { - subPackages.forEach((subPackage) => { - const subRoutes = subPackage.pages.map((page: any) => { - const newPath = `/${subPackage.root}/${page.path}`; - return { ...page, path: newPath }; - }); - routes.push(...subRoutes); - }); - } - - return routes; -} - -// 创建路由实例 -const router = createRouter({ - routes: generateRoutes(), -}); - -export default router; -``` - -### 3. 在main.ts中挂载路由 - -```typescript -// src/main.ts -import { createSSRApp } from "vue"; -import App from "./App.vue"; -import router from "./router"; - -export function createApp() { - const app = createSSRApp(App); - - // 使用路由 - app.use(router); - - return { - app, - }; -} -``` - -### 4. 配置自动导入(可选,推荐) - -使用unplugin-auto-import插件可以自动导入路由相关hooks,无需每次手动导入: - -```typescript -// vite.config.ts -import AutoImport from "unplugin-auto-import/vite"; - -export default defineConfig({ - plugins: [ - AutoImport({ - imports: [ - "vue", - { - from: "uni-mini-router", - imports: ["createRouter", "useRouter", "useRoute"], - }, - ], - dts: "src/auto-imports.d.ts", - }), - ], -}); -``` - -## 三、路由基本用法 - -### 1. 编程式导航 - -uni-mini-router提供了多种导航方法: - -```typescript -const router = useRouter(); - -// 字符串路径导航 -router.push("/pages/index/index"); - -// 对象导航(通过路径) -router.push({ path: "/pages/index/index" }); - -// 对象导航(通过名称) -router.push({ name: "index" }); - -// 携带参数 -router.push({ - path: "/pages/detail/index", - query: { id: 10 }, -}); - -// 通过名称 + 参数 -router.push({ - name: "detail", - params: { id: 10 }, -}); - -// Tab页面导航 -router.pushTab("/pages/home/index"); - -// 关闭当前页面并跳转 -router.replace("/pages/index/index"); - -// 关闭所有页面并跳转 -router.replaceAll("/pages/index/index"); - -// 返回上一级 -router.back(); - -// 返回多级 -router.back(2); -``` - -### 2. 获取和使用路由信息 - -```typescript -const route = useRoute(); - -// 访问当前路由信息 -console.log(route.path); // 当前路由路径 -console.log(route.name); // 当前路由名称 -console.log(route.query); // 查询参数 -console.log(route.params); // 路由参数 -``` - -### 3. 接收页面参数 - -在页面组件中接收传递的参数: - -```typescript - -``` - -> ⚠️ **重要说明**:在uni-mini-router中,params和query参数都会转换为查询字符串放在URL中,两者在实际效果上没有区别。这种设计是为了与Vue Router保持API一致性。 - -## 四、导航守卫 - -uni-mini-router提供了全局导航守卫功能,可以在路由跳转前后执行自定义逻辑。 - -### 1. 全局前置守卫 - -```typescript -// src/router/index.ts -router.beforeEach((to, from, next) => { - console.log("路由跳转:", from.path, "->", to.path); - - // 检查是否需要登录 - if (to.meta && to.meta.requireAuth) { - // 检查登录状态 - const isLoggedIn = uni.getStorageSync("token"); - - if (!isLoggedIn) { - // 未登录,跳转到登录页 - uni.showToast({ title: "请先登录", icon: "none" }); - next("/pages/login/index"); - return; - } - } - - // 继续导航 - next(); -}); -``` - -### 2. 全局后置守卫 - -```typescript -// src/router/index.ts -router.afterEach((to, from) => { - console.log("路由跳转完成:", to.path); - - // 可以在这里做一些统计或记录 -}); -``` - -### 3. 路由元数据配置 - -可以在页面文件中使用``自定义块来定义路由元数据: - -```vue - - - - - -{ - "name": "protected-page", - "meta": { - "requireAuth": true, - "title": "需要登录的页面" - } -} - -``` - -## 五、实战示例:登录权限控制 - -### 1. 定义带有权限控制的路由 - -```typescript -// src/router/index.ts -import { createRouter } from "uni-mini-router"; - -const router = createRouter({ - routes: generateRoutes(), -}); - -// 全局前置守卫 -router.beforeEach((to, from, next) => { - // 检查页面是否需要登录 - if (to.meta && to.meta.requireAuth) { - const token = uni.getStorageSync("token"); - - if (!token) { - // 显示登录提示 - uni.showModal({ - title: "提示", - content: "该功能需要登录后使用", - confirmText: "去登录", - cancelText: "返回", - success: (res) => { - if (res.confirm) { - // 记住原来要去的页面 - uni.setStorageSync("redirect", to.fullPath); - next("/pages/login/index"); - } else { - // 取消则返回首页 - next("/pages/index/index"); - } - }, - }); - return; - } - } - - // 继续导航 - next(); -}); - -export default router; -``` - -### 2. 登录成功后跳转回原页面 - -```vue - - -``` - -## 六、最佳实践与性能优化 - -### 1. 合理使用跳转方式 - -- **router.push**:需要保留当前页面、可返回时使用 -- **router.replace**:不需要返回当前页面时使用 -- **router.replaceAll**:需要清除所有页面栈时使用(如登录后) -- **router.pushTab**:跳转到tabBar页面时使用 - -### 2. 参数传递最佳实践 - -- 对于简单数据,直接使用参数传递 -- 对于复杂数据或对象,可使用以下方法: - -```typescript -// 传递复杂对象 -const complexData = { name: "product", details: { id: 1, features: ["a", "b"] } }; - -// 方法1: JSON序列化 + URL编码 -router.push({ - path: "/pages/detail/index", - query: { data: encodeURIComponent(JSON.stringify(complexData)) }, -}); - -// 接收页面 -onLoad((option) => { - if (option.data) { - try { - const data = JSON.parse(decodeURIComponent(option.data)); - console.log(data); - } catch (e) { - console.error("参数解析错误", e); - } - } -}); - -// 方法2: 对于非常大的数据,考虑使用全局状态管理或本地存储 -``` - -### 3. 路由懒加载 - -uni-mini-router自动支持小程序的分包加载特性,可以在pages.json中配置分包: - -```json -{ - "pages": [ - // 主包页面 - ], - "subPackages": [ - { - "root": "pages/module", - "pages": [ - { - "path": "detail/index", - "style": { - "navigationBarTitleText": "详情页" - } - } - ] - } - ] -} -``` - -## 七、路由调试与测试 - -### 1. 路由日志记录 - -```typescript -// src/router/index.ts -router.beforeEach((to, from, next) => { - console.log(`[Router] ${from.path || "初始页面"} -> ${to.path}`, { - params: to.params, - query: to.query, - }); - next(); -}); -``` - -### 2. 常见问题解决 - -1. **路由参数获取不到**: - - 检查传参方式是否正确 - - 使用`console.log`打印完整的option对象 - - 尝试同时检查route.query和route.params - -2. **页面未注册**: - - 确保页面已在pages.json中正确注册 - - 检查路径大小写是否正确 - -3. **导航守卫不生效**: - - 确保在路由配置后调用守卫 - - 检查是否正确调用next()函数 - -## 总结 - -uni-mini-router为uni-app提供了Vue Router风格的路由解决方案,特别是增加了路由拦截功能,解决了uni-app原生路由的限制。通过简单配置,就能在uni-app中实现更加灵活的路由管理,包括权限控制、参数传递和路由拦截等高级功能。 - -使用uni-mini-router可以让你的uni-app项目路由管理更加规范化和工程化,提升开发效率和代码质量。 - -参考资料: - -- [uni-mini-router GitHub仓库](https://github.com/Moonofweisheng/uni-mini-router) -- [uni-mini-router官方文档](https://moonofweisheng.github.io/uni-mini-router/) -- [uni-app官方路由文档](https://uniapp.dcloud.net.cn/tutorial/page.html) diff --git a/fastapp/eslint.config.mjs b/fastapp/eslint.config.mjs index 1bd36600..9dc1368d 100644 --- a/fastapp/eslint.config.mjs +++ b/fastapp/eslint.config.mjs @@ -19,17 +19,7 @@ const autoImportConfig = JSON.parse(fs.readFileSync(".eslintrc-auto-import.json" export default [ // 忽略指定文件 { - ignores: [ - "node_modules/**", - "dist/**", - "auto-imports.d.ts", - "unpackage/**", - "public/**", - "static/**", - "**/u-charts/**", - "**/qiun-**/**", - "**/auto-imports.d.ts", - ], + ignores: ["node_modules/**", "dist/**", "auto-imports.d.ts", "unpackage/**", "public/**", "static/**", "**/u-charts/**", "**/qiun-**/**", "**/auto-imports.d.ts"], }, // 检查文件的配置 { @@ -58,7 +48,7 @@ export default [ rules: { ...configPrettier.rules, // 关闭与 Prettier 冲突的规则 ...pluginPrettier.configs.recommended.rules, // 启用 Prettier 规则 - "prettier/prettier": "error", // 强制 Prettier 格式化 + "prettier/prettier": "off", // 完全关闭 Prettier 格式化检查 "no-unused-vars": [ "error", { @@ -121,9 +111,7 @@ export default [ }, rules: { // 禁用所有规则 - ...Object.fromEntries( - Object.keys(pluginVue.configs["vue3-recommended"].rules || {}).map((key) => [key, "off"]) - ), + ...Object.fromEntries(Object.keys(pluginVue.configs["vue3-recommended"].rules || {}).map((key) => [key, "off"])), "no-unused-vars": "off", "no-prototype-builtins": "off", "@typescript-eslint/no-explicit-any": "off", diff --git a/fastapp/package.json b/fastapp/package.json index 3c80b88b..d5cf83fe 100644 --- a/fastapp/package.json +++ b/fastapp/package.json @@ -100,44 +100,43 @@ "commit": "git-cz" }, "dependencies": { - "@dcloudio/uni-app": "3.0.0-4070520250711001", - "@dcloudio/uni-app-harmony": "3.0.0-4070520250711001", - "@dcloudio/uni-app-plus": "3.0.0-4070520250711001", - "@dcloudio/uni-components": "3.0.0-4070520250711001", - "@dcloudio/uni-h5": "3.0.0-4070520250711001", - "@dcloudio/uni-mp-alipay": "3.0.0-4070520250711001", - "@dcloudio/uni-mp-baidu": "3.0.0-4070520250711001", - "@dcloudio/uni-mp-harmony": "3.0.0-4070520250711001", - "@dcloudio/uni-mp-jd": "3.0.0-4070520250711001", - "@dcloudio/uni-mp-kuaishou": "3.0.0-4070520250711001", - "@dcloudio/uni-mp-lark": "3.0.0-4070520250711001", - "@dcloudio/uni-mp-qq": "3.0.0-4070520250711001", - "@dcloudio/uni-mp-toutiao": "3.0.0-4070520250711001", - "@dcloudio/uni-mp-weixin": "3.0.0-4070520250711001", - "@dcloudio/uni-mp-xhs": "3.0.0-4070520250711001", - "@dcloudio/uni-quickapp-webview": "3.0.0-4070520250711001", + "@dcloudio/uni-app": "3.0.0-4070620250821001", + "@dcloudio/uni-app-harmony": "3.0.0-4070620250821001", + "@dcloudio/uni-app-plus": "3.0.0-4070620250821001", + "@dcloudio/uni-components": "3.0.0-4070620250821001", + "@dcloudio/uni-h5": "3.0.0-4070620250821001", + "@dcloudio/uni-mp-alipay": "3.0.0-4070620250821001", + "@dcloudio/uni-mp-baidu": "3.0.0-4070620250821001", + "@dcloudio/uni-mp-harmony": "3.0.0-4070620250821001", + "@dcloudio/uni-mp-jd": "3.0.0-4070620250821001", + "@dcloudio/uni-mp-kuaishou": "3.0.0-4070620250821001", + "@dcloudio/uni-mp-lark": "3.0.0-4070620250821001", + "@dcloudio/uni-mp-qq": "3.0.0-4070620250821001", + "@dcloudio/uni-mp-toutiao": "3.0.0-4070620250821001", + "@dcloudio/uni-mp-weixin": "3.0.0-4070620250821001", + "@dcloudio/uni-mp-xhs": "3.0.0-4070620250821001", + "@dcloudio/uni-quickapp-webview": "3.0.0-4070620250821001", "@stomp/stompjs": "^7.1.1", "@uni-helper/uni-use": "^0.19.14", "@vueuse/core": "9.13.0", "pinia": "^2.2.2", - "vue": "^3.5.13", - "vue-i18n": "^9.1.9", - "wot-design-uni": "^1.9.1" + "vue": "^3.5.18", + "vue-i18n": "^9.14.5" }, "devDependencies": { "@commitlint/cli": "^19.5.0", "@commitlint/config-conventional": "^19.5.0", - "@dcloudio/types": "^3.4.8", - "@dcloudio/uni-automator": "3.0.0-4070520250711001", - "@dcloudio/uni-cli-shared": "3.0.0-4070520250711001", - "@dcloudio/uni-stacktracey": "3.0.0-4070520250711001", - "@dcloudio/vite-plugin-uni": "3.0.0-4070520250711001", + "@dcloudio/types": "^3.4.19", + "@dcloudio/uni-automator": "3.0.0-4070620250821001", + "@dcloudio/uni-cli-shared": "3.0.0-4070620250821001", + "@dcloudio/uni-stacktracey": "3.0.0-4070620250821001", + "@dcloudio/vite-plugin-uni": "3.0.0-4070620250821001", "@eslint/js": "^9.10.0", "@uni-helper/uni-types": "1.0.0-alpha.6", "@uni-helper/vite-plugin-uni-components": "^0.2.0", "@uni-helper/vite-plugin-uni-layouts": "^0.1.10", "@uni-helper/vite-plugin-uni-pages": "^0.2.28", - "@vue/runtime-core": "^3.4.21", + "@vue/runtime-core": "^3.5.18", "commitizen": "^4.3.0", "cz-git": "^1.9.4", "eslint": "^9.10.0", @@ -168,6 +167,7 @@ "unplugin-auto-import": "^0.18.3", "vite": "5.2.8", "vue-eslint-parser": "^9.4.3", - "vue-tsc": "^1.0.24" + "vue-tsc": "^1.0.24", + "wot-design-uni": "^1.9.1" } } diff --git a/fastapp/src/components/cu-date-query/index.vue b/fastapp/src/components/cu-date-query/index.vue index 8f945619..309c6ba0 100644 --- a/fastapp/src/components/cu-date-query/index.vue +++ b/fastapp/src/components/cu-date-query/index.vue @@ -1,11 +1,5 @@ - - + \ No newline at end of file diff --git a/fastapp/src/layouts/tabbar.vue b/fastapp/src/layouts/tabbar.vue index ecb721c8..d5f7911b 100644 --- a/fastapp/src/layouts/tabbar.vue +++ b/fastapp/src/layouts/tabbar.vue @@ -1,22 +1,10 @@