From 65d2d714693beccb68daed9dc123705166ebe6ba Mon Sep 17 00:00:00 2001 From: zlwu <704541015@qq.com> Date: Sat, 28 Jun 2025 09:48:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96cursor=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E5=BD=A2=E5=BC=8F=EF=BC=8C=E5=A2=9E=E5=8A=A0=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E8=BF=87=E7=A8=8B=E7=AE=A1=E7=90=86=EF=BC=8C?= =?UTF-8?q?=E6=96=B9=E4=BE=BFcursor=E7=94=9F=E6=88=90=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .cursorrules | 608 +++++++++----- docs/README.md | 219 +++-- docs/design/README.md | 113 --- docs/design/database/README.md | 125 --- docs/development/README.md | 384 --------- .../simple_hall_reservation_schema.sql | 54 -- docs/structure-optimization-plan.md | 252 ++++++ docs/业务模块/README.md | 281 +++++++ docs/业务模块/业务模块开发模板.md | 575 +++++++++++++ docs/{middleware => 中间件配置}/README.md | 0 .../mysql-config.md | 0 docs/变更管理/README.md | 452 ++++++++++ docs/{ => 变更管理}/code-adjust-record.md | 570 +++++++++++++ docs/{development => 开发文档}/API.md | 0 docs/开发文档/API文档模板.md | 641 ++++++++++++++ docs/开发文档/README.md | 649 ++++++++++++++ docs/{testing => 测试文档}/README.md | 0 docs/设计文档/database/01-workflow-module.sql | 237 ++++++ .../database/02-code-generator-module.sql | 81 ++ .../database/03-logistics-module.sql} | 431 +++++----- .../database/04-job-scheduler-module.sql | 286 +++++++ .../database/05-system-management-module.sql | 539 ++++++++++++ docs/设计文档/database/06-test-module.sql | 62 ++ docs/设计文档/database/README.md | 422 ++++++++++ docs/设计文档/database/SQL文件说明.md | 235 ++++++ .../database/database_msg.md | 0 .../database/hzdyjs_xg.sql | 752 +++++++++-------- .../database/mysql-database-standard.md | 675 +++++++++++++++ docs/{deployment => 部署文档}/README.md | 0 docs/{requirements => 需求文档}/README.md | 0 .../简化版报告厅预约系统设计说明.md | 0 .../高校后勤满意度调查系统需求说明.md | 0 docs/项目总览/README.md | 284 +++++++ docs/项目总览/项目总览模板.md | 258 ++++++ prompt.md | 793 ++++++++++++++++++ 工程本地启动指导.md | 424 ++++++++++ 36 files changed, 8872 insertions(+), 1530 deletions(-) delete mode 100644 docs/design/README.md delete mode 100644 docs/design/database/README.md delete mode 100644 docs/development/README.md delete mode 100644 docs/requirements/后勤报告厅预约需求/simple_hall_reservation_schema.sql create mode 100644 docs/structure-optimization-plan.md create mode 100644 docs/业务模块/README.md create mode 100644 docs/业务模块/业务模块开发模板.md rename docs/{middleware => 中间件配置}/README.md (100%) rename docs/{middleware => 中间件配置}/mysql-config.md (100%) create mode 100644 docs/变更管理/README.md rename docs/{ => 变更管理}/code-adjust-record.md (87%) rename docs/{development => 开发文档}/API.md (100%) create mode 100644 docs/开发文档/API文档模板.md create mode 100644 docs/开发文档/README.md rename docs/{testing => 测试文档}/README.md (100%) create mode 100644 docs/设计文档/database/01-workflow-module.sql create mode 100644 docs/设计文档/database/02-code-generator-module.sql rename docs/{requirements/后勤满意度调查需求/hq_satisfaction_survey_schema.sql => 设计文档/database/03-logistics-module.sql} (52%) create mode 100644 docs/设计文档/database/04-job-scheduler-module.sql create mode 100644 docs/设计文档/database/05-system-management-module.sql create mode 100644 docs/设计文档/database/06-test-module.sql create mode 100644 docs/设计文档/database/README.md create mode 100644 docs/设计文档/database/SQL文件说明.md rename docs/{design => 设计文档}/database/database_msg.md (100%) rename docs/{design => 设计文档}/database/hzdyjs_xg.sql (85%) create mode 100644 docs/设计文档/database/mysql-database-standard.md rename docs/{deployment => 部署文档}/README.md (100%) rename docs/{requirements => 需求文档}/README.md (100%) rename docs/{requirements => 需求文档}/后勤报告厅预约需求/简化版报告厅预约系统设计说明.md (100%) rename docs/{requirements => 需求文档}/后勤满意度调查需求/高校后勤满意度调查系统需求说明.md (100%) create mode 100644 docs/项目总览/README.md create mode 100644 docs/项目总览/项目总览模板.md create mode 100644 prompt.md create mode 100644 工程本地启动指导.md diff --git a/.cursorrules b/.cursorrules index 2a5e33dc..0c60f557 100644 --- a/.cursorrules +++ b/.cursorrules @@ -12,182 +12,355 @@ ## 1. 文档结构管理 (docs/) -### 文档目录组织 +### 🔴 文档目录组织(中文化架构) ``` docs/ -├── requirements/ # 需求文档 -│ ├── README.md # 需求管理说明 -│ └── [功能模块]/ # 具体功能需求文档 -├── design/ # 设计文档 -│ ├── README.md # 设计文档说明 -│ ├── database/ # 数据库设计 -│ │ ├── hzdyjs_xg.sql # 完整数据库模型 -│ │ ├── database_msg.md # 环境配置信息 -│ │ └── README.md # 数据库设计说明 -│ └── [模块设计]/ # 其他设计文档 -├── development/ # 开发文档 -│ ├── README.md # 开发指南 -│ └── API.md # API接口文档(完整的后端接口说明) -├── testing/ # 测试文档 -│ └── README.md # 测试计划和用例 -├── deployment/ # 部署文档 -│ └── README.md # 部署指南 -├── middleware/ # 中间件配置文档 -│ ├── mysql-config.md # MySQL配置文档 -│ └── README.md # 中间件配置说明 -└── code-adjust-record.md # 代码调整记录 +├── 项目总览/ # 项目基本信息和架构概览 +│ ├── README.md # 项目总览主文档 +│ └── 项目总览模板.md # 项目总览标准模板 +├── 业务模块/ # 业务模块文档(为AI提供业务上下文) +│ ├── README.md # 业务模块管理总览 +│ ├── 业务模块开发模板.md # 业务模块标准开发模板 +│ ├── hq-satisfaction-survey/ # 后勤满意度调查模块 +│ ├── hall-reservation/ # 报告厅预约模块 +│ ├── system-management/ # 系统管理模块 +│ └── user-management/ # 用户管理模块 +├── 变更管理/ # 变更管理中心 +│ ├── README.md # 变更管理流程和规范 +│ └── code-adjust-record.md # 代码调整记录 +├── 开发文档/ # 开发指南和技术规范 +│ ├── README.md # 开发文档总览 +│ ├── API.md # API接口完整文档 +│ └── API文档模板.md # API文档标准模板 +├── 设计文档/ # 设计文档 +│ ├── README.md # 设计文档说明 +│ └── database/ # 数据库设计 +│ ├── hzdyjs_xg.sql # 完整数据库模型 +│ ├── 01-workflow-module.sql # 工作流模块SQL +│ ├── 02-code-generator-module.sql # 代码生成模块SQL +│ ├── 03-logistics-module.sql # 后勤管理模块SQL +│ ├── 04-job-scheduler-module.sql # 任务调度模块SQL +│ ├── 05-system-management-module.sql # 系统管理模块SQL +│ ├── 06-test-module.sql # 测试模块SQL +│ ├── SQL文件说明.md # SQL文件拆分说明 +│ ├── mysql-database-standard.md # MySQL数据库建设规范 +│ ├── database_msg.md # 环境配置信息 +│ └── README.md # 数据库设计说明 +├── 需求文档/ # 需求文档 +│ ├── README.md # 需求管理说明 +│ ├── 后勤报告厅预约需求/ # 报告厅预约系统需求 +│ └── 后勤满意度调查需求/ # 满意度调查系统需求 +├── 测试文档/ # 测试文档 +│ └── README.md # 测试计划和用例 +├── 部署文档/ # 部署文档 +│ └── README.md # 部署指南 +├── 中间件配置/ # 中间件配置文档 +│ ├── README.md # 中间件配置说明 +│ └── mysql-config.md # MySQL配置文档 +├── 知识库/ # 知识库 +├── 报告文档/ # 报告文档 +├── structure-optimization-plan.md # 文档结构优化方案 +└── README.md # 文档体系总说明 ``` -## 2. 代码调整记录管理 +### 🔴 重要文档说明 +- **工程本地启动指导.md** (项目根目录):包含完整的环境配置和启动指南 +- **技术要求更新**:Node.js 20.15.x+, npm 10.7.x+ +- **数据库环境**:支持本地安装或使用阿里云测试环境 +- **前端访问地址**:http://localhost (非3000端口) -### 📝 重要提醒:代码调整记录要求 +## 2. 🚨 强制性文档同步更新规则 -**每次使用Cursor修改任何代码时,都必须在 `docs/code-adjust-record.md` 文件中记录调整信息。** +### 📋 核心原则:代码与文档必须同步更新 +**⚠️ 超级重要:每次使用Cursor AI进行代码调整后,必须立即同步更新相应的项目文档!** -### 记录格式标准 -每次调整后请按以下格式记录: +### 🔴 强制更新触发条件 +每次代码调整必须检查并更新以下文档: + +#### 后端代码调整时的强制文档更新: +- **✅ API接口变更**: + - 必须立即更新 `docs/开发文档/API.md` + - 新增接口:添加完整接口文档(地址、参数、响应、权限、示例) + - 修改接口:更新参数说明、响应格式、错误码 + - 删除接口:标记为已废弃,说明替代方案 + - 权限变更:更新权限要求说明 + +- **✅ 数据库变更**: + - 更新 `docs/设计文档/database/` 下的相关文档 + - 新增表:添加表结构说明和字段注释 + - 修改表:更新字段变更和索引调整 + - 数据迁移:记录迁移脚本和注意事项 + +- **✅ 业务逻辑变更**: + - 更新对应 `docs/业务模块/[模块名称]/` 下的业务文档 + - 更新业务流程图和业务规则说明 + - 修改用户故事和功能需求 + +- **✅ 配置变更**: + - 更新 `docs/中间件配置/` 下的配置文档 + - 更新 `docs/部署文档/` 下的部署说明 + +#### 前端代码调整时的强制文档更新: +- **✅ 页面功能变更**: + - 更新对应业务模块的用户操作文档 + - 更新UI设计规范文档 + +- **✅ API调用变更**: + - 检查前端API调用是否与后端API文档一致 + - 更新API对接说明文档 + +- **✅ 组件变更**: + - 更新组件使用说明和属性文档 + +#### 移动端代码调整时的强制文档更新: +- **✅ 功能变更**:更新移动端功能说明文档 +- **✅ API对接变更**:更新移动端API调用文档 +- **✅ 用户流程变更**:更新用户操作指南 + +#### 📚 docs文档变更时的强制同步更新规则: +**⚠️ 超级重要:每当docs/目录下的文档结构或重要内容发生变更时,必须立即同步更新.cursorrules文件!** + +- **🔴 文档结构变更**: + - 新增/删除目录:同步更新.cursorrules中的"文档目录组织"章节 + - 重命名目录:更新所有相关路径引用 + - 调整文档层级:更新文档结构说明 + +- **🔴 重要文档变更**: + - 新增标准模板:在"文档模板体系"中添加说明 + - 更新开发规范:同步调整.cursorrules中对应的规范要求 + - 修改工作流程:更新"文档更新标准工作流程" + +- **🔴 技术环境变更**: + - 环境要求调整:更新.cursorrules中的技术栈规范 + - 配置信息变更:同步更新相关配置说明 + - 启动流程调整:更新开发指导相关内容 + +- **🔴 业务模块变更**: + - 新增业务模块:在.cursorrules中添加模块说明 + - 模块架构调整:更新业务模块文档管理规范 + - API接口变更:确保.cursorrules中的API规范同步 + +**强制检查清单**: +- [ ] .cursorrules中的文档目录结构是否与实际一致 +- [ ] 重要文档路径引用是否全部更新 +- [ ] 新增的开发规范是否已同步到.cursorrules +- [ ] 技术要求和环境配置是否保持一致 + +### 🔄 文档更新标准工作流程 + +#### Cursor AI 辅助开发的文档更新流程: +``` +1. **AI代码生成/修改完成** + ↓ +2. **立即检查文档更新需求** + - 是否涉及API变更? + - 是否涉及数据库变更? + - 是否涉及业务逻辑变更? + - 是否涉及配置变更? + - 是否涉及docs文档结构变更? + ↓ +3. **立即更新相关文档**(不得延后!) + - 使用标准模板格式 + - 确保信息准确完整 + - 添加真实示例 + ↓ +4. **检查并更新.cursorrules文件**(重要!) + - 如有docs文档结构变更,同步更新.cursorrules + - 如有技术要求变更,同步更新技术栈规范 + - 如有开发流程变更,同步更新工作流程 + ↓ +5. **记录变更日志** + - 在 `docs/变更管理/code-adjust-record.md` 中记录 + - 标注已同步更新的文档列表 + - 标注是否已更新.cursorrules文件 + ↓ +6. **验证文档准确性** + - 确保文档与实际代码一致 + - 验证示例可以正常运行 + - 验证.cursorrules与实际项目状态一致 + ↓ +7. **提交代码和文档变更** +``` + +### 📝 变更记录标准格式 + +**每次代码调整都必须在 `docs/变更管理/code-adjust-record.md` 中按以下格式记录:** ```markdown ## 调整记录 - YYYY-MM-DD HH:mm:ss -**调整时间**: YYYY-MM-DD HH:mm:ss -**调整人**: [开发者姓名/Cursor AI辅助] -**调整目的**: [简述调整原因和目标] -**涉及文件**: -- [具体的文件路径] +**变更ID**: CHG-YYYYMMDD-001 +**变更时间**: YYYY-MM-DD HH:mm:ss +**变更人员**: [开发者姓名/Cursor AI辅助] +**变更类型**: 🆕新功能/🐛Bug修复/🔧重构优化/📚文档更新/⚙️配置调整 +**影响级别**: 🔴重大变更/🟡中等变更/🟢小变更 -**调整内容详述**: -1. 具体调整了哪些代码 -2. 修改了哪些功能 -3. 优化了哪些性能 -4. 修复了哪些问题 +### 📋 变更概述 +**变更目的**: [简述变更原因和目标,1-2句话] +**影响范围**: [列出受影响的模块、功能或文件] -**技术细节**: -- 使用的技术栈: [技术栈信息] -- 遵循的设计规范: [设计规范] -- 其他重要技术决策 +### 📁 涉及文件 +**后端文件**: +- backend/[具体文件路径1] +- backend/[具体文件路径2] -**测试验证**: -- [ ] 功能测试通过 -- [ ] 代码规范检查通过 -- [ ] 类型检查通过 -- [ ] 兼容性测试通过 +**前端文件**: +- web/[具体文件路径1] +- web/[具体文件路径2] -**备注**: 其他需要说明的内容 +**配置文件**: +- [配置文件路径] + +### 🔧 变更内容详述 +**业务逻辑变更**: +1. [具体业务逻辑的变更说明] +2. [新增或修改的业务规则] + +**技术实现变更**: +1. [技术方案的调整说明] +2. [代码结构的优化内容] + +**接口变更**: +- **新增接口**: [新增接口列表] +- **修改接口**: [修改的接口及变更内容] +- **废弃接口**: [废弃的接口及替代方案] + +**数据库变更**: +- **新增表**: [新增表及字段说明] +- **修改表**: [表结构变更内容] +- **数据迁移**: [数据迁移脚本或说明] + +### 📖 文档同步更新记录 +**API文档**: +- [ ] ✅ 已更新 docs/开发文档/API.md +- [ ] ✅ 已更新模块API接口设计文档 + +**业务文档**: +- [ ] ✅ 已更新业务模块文档 +- [ ] ✅ 已更新用户操作手册 + +**技术文档**: +- [ ] ✅ 已更新数据库设计文档 +- [ ] ✅ 已更新架构设计文档 + +**其他文档**: +- [ ] ✅ 已更新部署文档 +- [ ] ✅ 已更新配置文档 + +**规范文件**: +- [ ] ✅ 已检查并同步更新.cursorrules文件 +- [ ] ✅ 已确认文档结构与.cursorrules一致 + +### 🧪 测试验证 +**功能测试**: +- [ ] 单元测试通过 +- [ ] 集成测试通过 +- [ ] 功能验收测试通过 + +**文档验证**: +- [ ] 文档内容与代码实现一致 +- [ ] 示例代码可以正常运行 +- [ ] 接口文档已验证准确性 + +### 📝 备注 +**已知问题**: [如有已知问题需要说明] +**后续计划**: [后续的改进或扩展计划] +**相关链接**: [相关的Issue、PR或文档链接] --- ``` -### 记录要求 -1. **及时性**: 每次代码调整完成后立即记录 -2. **完整性**: 包含所有必要信息字段 -3. **准确性**: 详细描述实际的调整内容 -4. **可追溯性**: 便于后续查看和维护 +## 3. 🔧 业务模块文档管理(为Cursor AI提供完整上下文) -### ⚠️ 强制要求 -**所有通过Cursor AI进行的代码调整都必须在 `docs/code-adjust-record.md` 中留下记录,这是项目管理的强制性要求。** +### 业务模块文档标准结构 +每个业务模块都必须包含以下完整文档: -### 🔴 特别强调:API接口变更的强制性文档更新规则 +``` +业务模块/[模块名称]/ +├── README.md # 模块总览 +├── 需求分析/ +│ ├── 业务需求说明.md # 详细业务需求 +│ ├── 功能需求清单.md # 功能点清单 +│ ├── 非功能需求.md # 性能、安全要求 +│ └── 用户故事.md # 用户使用场景 +├── 技术设计/ +│ ├── 数据库设计.md # 表结构设计 +│ ├── API接口设计.md # 接口定义 +│ ├── 架构设计.md # 模块架构 +│ └── 技术选型.md # 技术决策说明 +├── 实现文档/ +│ ├── 后端实现说明.md # 后端代码结构 +│ ├── 前端实现说明.md # 前端代码结构 +│ ├── 关键业务逻辑.md # 核心算法逻辑 +│ └── 代码规范.md # 编码规范 +├── 测试文档/ +│ ├── 测试计划.md # 测试策略 +│ ├── 测试用例.md # 具体测试用例 +│ └── 测试报告.md # 测试结果 +└── 运维文档/ + ├── 部署指南.md # 部署步骤 + ├── 监控配置.md # 监控指标 + └── 故障处理.md # 常见问题 +``` -**⚠️ 超级重要:任何API接口的新增、修改、删除操作都必须立即同步更新 `docs/development/API.md` 文档!** +### 🤖 Cursor AI 开发提示词模板 -#### API变更必须执行的步骤: -1. **代码修改完成** → 2. **立即更新API.md文档** → 3. **记录代码调整日志** → 4. **验证文档准确性** +#### 新功能开发提示词: +``` +基于以下业务模块文档为 [功能名称] 开发代码: -#### API接口变更涉及的文档更新: -- ✅ **新增API接口**:在API.md中添加完整的接口文档(地址、参数、响应、权限等) -- ✅ **修改API接口**:更新API.md中对应接口的参数、响应格式、权限要求 -- ✅ **删除API接口**:在API.md中标记接口为已废弃,说明替代方案 -- ✅ **修改响应格式**:更新API.md中的响应示例和字段说明 -- ✅ **修改权限要求**:更新API.md中的权限要求说明 +业务上下文:docs/业务模块/[模块名称]/需求分析/ +技术规范:docs/业务模块/[模块名称]/技术设计/ +代码结构:docs/业务模块/[模块名称]/实现文档/ +API规范:docs/开发文档/API.md -## 3. 文档同步更新规则 +请确保: +1. 遵循项目编码规范 +2. 使用标准的代码结构 +3. 添加完整的注释 +4. 生成单元测试代码 +5. 立即更新相关文档 -### 📋 核心原则:代码与文档同步更新 -**⚠️ 重要规则:每次代码调整完成后,必须同步更新相应的项目文档,确保项目文档永远保持最新状态。** +开发完成后请同步更新: +- docs/开发文档/API.md(如涉及API) +- docs/业务模块/[模块名称]/相关文档 +- docs/变更管理/code-adjust-record.md +``` -### 强制更新规则 -每次代码调整必须同步更新相关文档: -- **API文档**: 接口变更时更新 `docs/development/API.md` 中的相关接口信息 -- **数据库文档**: 表结构变更时更新 `docs/design/database/` 下的所有相关文档 -- **配置文档**: 配置项变更时更新 `docs/middleware/` 下的配置说明 -- **部署文档**: 部署流程变更时更新 `docs/deployment/` 下的部署手册 -- **功能文档**: 新增功能时更新 `docs/requirements/` 下的需求文档 -- **设计文档**: 架构变更时更新 `docs/design/` 下的设计文档 +#### 文档更新提示词: +``` +根据刚才的代码变更,请更新以下文档: -### 📝 文档同步更新清单 -每次代码调整后,请检查以下文档是否需要更新: +变更内容:[具体变更说明] +影响模块:[模块名称] -#### 前端代码调整时需更新的文档: -- [ ] **组件文档**: 新增或修改组件时,更新组件使用说明 -- [ ] **页面功能文档**: 页面功能变更时,更新用户操作手册 -- [ ] **API对接文档**: 前端API调用变更时,更新接口对接说明 -- [ ] **UI设计文档**: 界面样式重大变更时,更新设计规范文档 +需要更新的文档: +1. docs/开发文档/API.md - [具体更新内容] +2. docs/业务模块/[模块名称]/[具体文档] - [具体更新内容] +3. docs/设计文档/database/ - [如涉及数据库变更] -#### 后端代码调整时需更新的文档: -- [ ] **API接口文档**: API接口变更时,必须更新 `docs/development/API.md` 中的相关接口信息,包括: - - 新增接口:添加完整的接口说明、参数、响应示例 - - 修改接口:更新参数说明、响应格式、错误码 - - 删除接口:在文档中标记为已废弃,并说明替代方案 - - 权限变更:更新权限要求说明 -- [ ] **数据库文档**: 表结构变更时,更新数据库设计文档 -- [ ] **业务逻辑文档**: 业务规则变更时,更新业务流程文档 -- [ ] **配置文档**: 系统配置变更时,更新配置说明文档 +请使用标准的文档模板格式,确保信息准确完整。 +``` -#### 移动端代码调整时需更新的文档: -- [ ] **功能文档**: 移动端功能变更时,更新功能说明文档 -- [ ] **API对接文档**: 移动端API调用变更时,更新接口对接说明 -- [ ] **用户手册**: 用户操作流程变更时,更新操作指南 +## 4. 📚 API文档管理规范 -### 🔄 文档更新工作流程 - -#### 标准流程: -1. **代码调整完成** → 2. **立即更新相关文档** → 3. **记录代码调整日志** → 4. **验证文档完整性** - -#### 🔴 API接口变更的特殊流程(强制性): -1. **API代码开发完成** -2. **立即更新 `docs/development/API.md`** (不得延后) -3. **记录代码调整日志,标注API文档已更新** -4. **验证API文档与实际接口的一致性** -5. **提交代码和文档变更** - -#### ⚠️ 重要原则: -- **API变更 = 必须更新API.md文档** -- **文档更新 = 代码开发的一部分,不是可选项** -- **未更新文档 = 开发任务未完成** - -### 版本管理 -- **文档版本**: 与代码版本保持同步 -- **变更记录**: 每次变更都要记录变更内容和原因 -- **向后兼容**: 接口变更需要考虑向后兼容性 - -## 4. API文档管理规范 (docs/development/API.md) - -### 📄 API文档维护原则 -**⚠️ 重要规则:任何后端API接口的新增、修改、删除都必须同步更新 `docs/development/API.md` 文档。** - -### API文档更新时机 -- **新增Controller**: 添加新的Controller时,必须在API.md中添加对应的接口说明 -- **新增接口方法**: 在现有Controller中添加新方法时,更新对应模块的接口列表 -- **修改接口参数**: 接口请求或响应参数变更时,更新参数说明表格 -- **修改权限要求**: 接口权限变更时,更新权限要求说明 -- **修改响应格式**: 响应数据结构变更时,更新响应示例 -- **接口废弃**: 接口不再使用时,在文档中标记为已废弃并说明替代方案 +### 🔴 强制性API文档更新规则 +**⚠️ 超级重要:任何API接口的新增、修改、删除都必须立即同步更新 `docs/开发文档/API.md` 文档!** ### API文档标准格式 -每个接口都必须包含以下信息: +使用 `docs/开发文档/API文档模板.md` 中的标准格式: + ```markdown -#### 接口标题 - -**接口地址**: `HTTP方法 /接口路径` +#### 接口名称 +**接口地址**: `HTTP方法 /api/路径` **接口描述**: 接口功能的详细描述 - **权限要求**: 权限代码或"需要登录" **请求参数**: -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| +| 参数名 | 类型 | 必填 | 说明 | 示例值 | +|--------|------|------|------|--------| +| param1 | String | Y | 参数说明 | "example" | **响应示例**: ```json @@ -198,28 +371,21 @@ docs/ } ``` -### API文档分类规范 -- **按业务模块分类**: 问卷管理、答题管理、题目管理等 -- **按功能分组**: 基础CRUD操作、业务逻辑操作、状态查询等 -- **统一命名规范**: 接口名称要与Controller方法名保持一致 +**错误码**: +| 错误码 | 说明 | 解决方案 | +|--------|------|----------| +| 400001 | 参数错误 | 检查请求参数 | +``` -### API文档版本控制 -- **版本记录**: 在API.md底部维护版本更新记录 -- **变更说明**: 每次更新都要记录具体的变更内容 -- **兼容性说明**: 重大变更需要说明向后兼容性影响 +### 🚨 API变更强制检查清单 -### ⚠️ 强制执行规则 -**所有通过Cursor AI进行的后端API开发都必须同时更新API文档,这是代码审查的强制性检查项。** - -### 🚨 API文档更新检查清单 - -#### 当进行以下操作时,必须更新 `docs/development/API.md`: +当进行以下操作时,必须更新 `docs/开发文档/API.md`: **Controller层变更**: - [ ] 新增Controller类 → 在API.md中添加新的模块章节 - [ ] 新增@RequestMapping方法 → 添加完整的接口文档 - [ ] 修改@RequestMapping路径 → 更新接口地址 -- [ ] 修改HTTP方法(GET/POST/PUT/DELETE) → 更新接口方法 +- [ ] 修改HTTP方法 → 更新接口方法 - [ ] 删除接口方法 → 标记为已废弃并说明替代方案 **参数和响应变更**: @@ -233,25 +399,34 @@ docs/ - [ ] 修改权限代码 → 更新权限说明 - [ ] 修改接口访问级别 → 更新权限要求说明 -#### 强制性文档更新格式要求: -```markdown -#### 接口名称 -**接口地址**: `HTTP方法 /完整路径` -**接口描述**: 清晰描述接口功能 -**权限要求**: 具体权限代码或"需要登录" -**请求参数**: 完整参数表格 -**响应示例**: 真实的JSON响应示例 -**错误码**: 可能的错误情况 -**更新记录**: 接口变更历史 -``` +## 5. 📊 文档模板体系 -### 🔴 违规检查机制 -- **代码审查时检查**:每次PR必须检查API文档是否同步更新 -- **自动化提醒**:接口变更后立即更新文档,不得延误 -- **文档版本控制**:API文档版本必须与代码版本保持一致 +### 已创建的标准模板: +- **`docs/项目总览/项目总览模板.md`** - 项目基本信息模板 +- **`docs/业务模块/业务模块开发模板.md`** - 业务模块开发标准模板 +- **`docs/开发文档/API文档模板.md`** - API接口文档标准模板 -### ⚠️ 重要提醒 -**不更新API文档的代码变更将被视为不完整的开发任务,必须补齐文档后才能认为任务完成!** +### 模板使用规范: +1. **新项目或模块开发时**:复制对应模板,替换占位符 +2. **文档更新时**:参考模板格式,保持结构一致 +3. **Cursor AI生成文档时**:使用模板作为格式参考 + +## 6. 🔍 文档质量控制 + +### 文档完整性检查清单: +- [ ] 文档结构符合标准模板 +- [ ] 内容与实际代码实现一致 +- [ ] API文档包含完整示例 +- [ ] 业务逻辑描述清晰准确 +- [ ] 技术实现说明详细 +- [ ] 变更历史有完整记录 +- [ ] 所有占位符已替换为真实内容 + +### 文档准确性验证: +- [ ] API接口示例可以正常调用 +- [ ] 数据库脚本可以成功执行 +- [ ] 配置文档与实际配置一致 +- [ ] 部署文档可以成功部署 --- @@ -267,6 +442,14 @@ docs/ - **路由管理**: Vue Router 4 - **HTTP客户端**: Axios - **代码风格**: ESLint + Prettier +- **Node.js**: 20.15.x+ (推荐 20.15.0) +- **npm**: 10.7.x+ + +### 环境要求 +- **开发环境**: 支持本地环境或阿里云测试环境 +- **数据库**: MySQL/Redis 支持本机安装或使用阿里云环境 +- **前端访问**: http://localhost (默认80端口) +- **后端服务**: http://localhost:8080 ## 2. Art Design Pro UI 规范 @@ -509,22 +692,46 @@ backend/ - 常量: UPPER_SNAKE_CASE (如: MAX_RETRY_COUNT) - 包名: 全小写 (如: org.dromara.system) -### 数据库规范 -- **现有数据库模型**: 参考 `docs/design/database/hzdyjs_xg.sql` 中的完整表结构 -- **环境配置**: 开发环境数据库信息见 `docs/design/database/database_msg.md` -- **主键设计**: 使用雪花ID (ASSIGN_ID),不使用数据库自增 -- **字段命名**: 下划线命名法 (如: user_name, create_time) -- **基础字段**: 所有业务表必须包含以下字段 - ```sql - id BIGINT PRIMARY KEY, - tenant_id VARCHAR(20), -- 租户ID (多租户) - create_dept BIGINT, -- 创建部门 - create_by BIGINT, -- 创建人 - create_time DATETIME, -- 创建时间 - update_by BIGINT, -- 更新人 - update_time DATETIME, -- 更新时间 - deleted TINYINT DEFAULT 0 -- 逻辑删除标记 - ``` +### 🔴 数据库规范(强制性) +- **⚠️ 超级重要**: 所有数据库操作必须严格遵循 `docs/设计文档/database/mysql-database-standard.md` 规范 +- **现有数据库模型**: 参考 `docs/设计文档/database/hzdyjs_xg.sql` 中的完整表结构 +- **环境配置**: 开发环境数据库信息见 `docs/设计文档/database/database_msg.md` + +#### 🚨 强制性核心规范 +1. **所有业务表必须包含标准基础字段** +2. **统一使用雪花ID (bigint(20)) 作为主键** +3. **强制使用逻辑删除,禁止物理删除** +4. **所有表必须支持多租户** +5. **完整的中文注释是必须的** +6. **禁止使用数据库外键约束**,关联关系通过应用层维护 + +#### 🔴 强制性基础字段模板 +```sql +-- 所有业务表必须包含以下字段(顺序和类型必须完全一致) +`id` bigint(20) NOT NULL COMMENT '主键ID', +`tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号', +`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', +`create_by` bigint(20) DEFAULT NULL COMMENT '创建者', +`create_time` datetime DEFAULT NULL COMMENT '创建时间', +`update_by` bigint(20) DEFAULT NULL COMMENT '更新者', +`update_time` datetime DEFAULT NULL COMMENT '更新时间', +`deleted` tinyint(1) DEFAULT 0 COMMENT '删除标志(0代表存在 1代表删除)', + +-- 业务字段在此处添加 + +PRIMARY KEY (`id`) USING BTREE, +KEY `idx_tenant_id` (`tenant_id`), +KEY `idx_deleted` (`deleted`), +KEY `idx_create_time` (`create_time`) +``` + +#### 🔴 AI开发强制要求 +当使用AI进行数据库开发时: +1. **必须先阅读** `docs/设计文档/database/mysql-database-standard.md` 规范 +2. **必须使用标准模板**,不得随意修改基础字段 +3. **必须保持与现有表结构的一致性** +4. **建表后必须立即更新** `hzdyjs_xg.sql` 文件 +5. **必须在变更记录中记录** 数据库变更 ### API接口规范 - **RESTful设计**: 遵循REST API设计原则 @@ -550,13 +757,13 @@ backend/ #### 步骤2:立即更新API文档(强制性) **⚠️ 代码写完后立即执行,不得延后!** -- 打开 `docs/development/API.md` 文件 -- 按照标准格式添加或更新接口文档 +- 打开 `docs/开发文档/API.md` 文件 +- 按照 `docs/开发文档/API文档模板.md` 的标准格式添加或更新接口文档 - 包含完整的接口信息(地址、参数、响应、权限等) - 添加真实的请求和响应示例 #### 步骤3:记录代码调整日志 -- 在 `docs/code-adjust-record.md` 中记录本次变更 +- 在 `docs/变更管理/code-adjust-record.md` 中记录本次变更 - 特别说明API接口的变更内容 - 标注文档已同步更新 @@ -776,20 +983,23 @@ const request = (options) => { --- -## 注意事项 +## 🚨 重要提醒和强制要求 -1. **严格遵循规范**: 所有开发必须按照本规范执行 -2. **代码调整记录**: 每次代码修改都必须在 `docs/code-adjust-record.md` 中记录 -3. **文档同步更新**: 代码变更必须同步更新相关文档 -4. **安全第一**: 所有功能开发都要考虑安全性 -5. **性能考虑**: 大数据量操作需要性能测试验证 -6. **团队协作**: 重要变更需要团队讨论和代码审查 +1. **📝 文档同步更新**:每次代码调整都必须同步更新相关文档,这是强制性要求 +2. **🔴 API文档管理**:API接口变更必须立即更新 `docs/开发文档/API.md` 文档 +3. **📋 变更记录**:每次调整都必须在 `docs/变更管理/code-adjust-record.md` 中记录 +4. **🎯 业务上下文**:充分利用 `docs/业务模块/` 下的文档为AI提供完整业务上下文 +5. **📚 模板使用**:使用标准文档模板,确保格式一致性 +6. **🔍 质量控制**:确保文档内容与代码实现完全一致 +7. **⚡ 实时性**:文档更新不得延后,必须与代码变更同步进行 ## 参考资源 -- **前端官方文档**: Vue 3、Element Plus、Vite -- **后端官方文档**: Spring Boot、MyBatis-Plus、Sa-Token -- **移动端官方文档**: uni-app、uView UI -- **项目文档**: `docs/` 目录下的详细文档 -- **代码调整记录**: `docs/code-adjust-record.md` +- **项目文档体系**:`docs/` 目录下的完整文档 +- **业务模块文档**:`docs/业务模块/` 各模块的详细文档 +- **开发文档**:`docs/开发文档/` 技术规范和API文档 +- **变更记录**:`docs/变更管理/code-adjust-record.md` +- **标准模板**:各目录下的模板文件 + +**🎯 目标**:通过完善的文档管理体系,为Cursor AI提供准确的开发上下文,确保高质量的代码生成和文档同步更新! diff --git a/docs/README.md b/docs/README.md index 542bf95f..a02b4453 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,86 +1,112 @@ -# RuoYi-Vue-Plus 项目文档中心 +# 高校智慧校园管理系统文档中心 -## 文档概述 +## 📋 文档概述 -本文档中心包含了 RuoYi-Vue-Plus 项目的完整技术文档,涵盖需求分析、系统设计、开发指南、测试规范、部署运维等各个方面。 +本文档中心采用**混合组织方式**,既支持按项目阶段的全过程管理,又提供按业务模块的聚合视图,完整记录从项目需求到交付的全生命周期文档,同时为 Cursor AI 辅助开发提供完整的业务上下文。 -## 📚 文档目录结构 +## 🎯 文档组织理念 -### 🎯 [需求文档](requirements/) +- **全过程管理**:涵盖需求分析、系统设计、开发指南、测试规范、部署运维等各个阶段 +- **AI 辅助开发**:便于 Cursor AI 快速理解业务上下文和技术细节 +- **模块化管理**:同一业务模块的文档聚合,便于查找和维护 +- **变更追踪**:完善的变更记录和版本管理体系 -存放项目的需求相关文档,明确项目功能和业务规则。 +## 🏗️ 核心文档目录 -**主要内容**: +### 📋 [项目总览](项目总览/) -- 功能需求文档 -- 业务流程文档 -- 原型设计文档 -- 业务规则文档 +**新增核心目录** - 项目整体信息一目了然 -**已有文档**: +- 项目基本信息和技术架构 +- 团队组织和开发分工 +- 项目时间线和目标 KPI +- 开发工具链和协作规范 -- [后勤满意度调查系统需求说明](../需求文件夹/后勤满意度调查需求/高校后勤满意度调查系统需求说明.md) -- [简化版报告厅预约系统设计说明](../需求文件夹/后勤报告厅预约需求/简化版报告厅预约系统设计说明.md) +### 📊 [业务模块文档](业务模块/) -### 🏗️ [设计文档](design/) +**新增核心目录** - 按业务模块聚合,为 AI 辅助开发提供完整上下文 -存放项目的设计相关文档,包括系统架构、数据库设计、接口设计等。 +- 🔐 [用户管理模块](业务模块/user-management/) +- 📊 [后勤满意度调查模块](业务模块/hq-satisfaction-survey/) +- 🏛️ [报告厅预约模块](业务模块/hall-reservation/) +- ⚙️ [系统管理模块](业务模块/system-management/) -**主要内容**: +**每个模块包含**:requirements.md、design.md、api.md、database.md、test-cases.md -- 系统架构设计 -- 数据库设计文档 -- API 接口设计 -- 安全设计文档 -- 性能设计文档 +### 🎯 [需求文档](需求文档/) -### 💻 [开发文档](development/) +**保留并优化** - 项目需求相关文档,明确项目功能和业务规则 -存放项目的开发相关文档,为开发人员提供详细的开发指南。 +### 🏗️ [设计文档](设计文档/) -**主要内容**: +**保留并优化** - 系统架构、数据库设计、接口设计等 -- 开发环境搭建 -- 开发规范和指南 -- 代码样例和模板 -- 功能开发指南 -- 问题记录和解决方案 +- 系统架构设计和技术选型 +- 数据库设计文档(含现有的 hzdyjs_xg.sql) +- API 接口设计规范 +- UI 设计和安全设计文档 -### 🧪 [测试文档](testing/) +### 💻 [开发文档](开发文档/) -存放项目的测试相关文档,确保项目质量和稳定性。 +**保留并优化** - 为开发人员和 AI 辅助提供详细开发指南 -**主要内容**: +- 开发环境搭建和 IDE 配置 +- 编码规范和 Git 工作流 +- 完整 API 文档(开发文档/API.md) +- 代码模板和集成指南 -- 测试计划文档 -- 测试用例文档 -- 测试报告 -- 自动化测试 -- 性能测试 +### 🧪 [测试文档](测试文档/) -### 🚀 [部署文档](deployment/) +**保留并优化** - 确保项目质量和稳定性 -存放项目的部署相关文档,指导项目的部署和运维。 +- 测试策略和测试计划 +- 功能、性能、安全测试用例 +- 测试数据和测试报告 +- 自动化测试规范 -**主要内容**: +### 🚀 [部署文档](部署文档/) -- 环境配置文档 -- 容器化部署 -- 自动化部署 -- 监控和告警 -- 运维手册 +**保留并优化** - 指导项目的部署和运维 -### ⚙️ [中间件配置](middleware/) +- 环境配置(开发、测试、生产) +- 容器化部署和 CI/CD 流水线 +- 基础设施和监控配置 +- 运维手册和故障排除 -存放项目使用的各种中间件配置文档和最佳实践。 +### ⚙️ [中间件配置](中间件配置/) -**主要内容**: +**保留并扩展** - 中间件配置文档和最佳实践 - 数据库配置(MySQL、Redis 等) -- 消息中间件配置 -- 反向代理和负载均衡 +- Web 服务器和消息队列配置 - 监控组件配置 -- 存储服务配置 +- SSL 证书和网络配置 + +### 📝 [变更管理](变更管理/) + +**新增重要目录** - 完善的变更追踪体系 + +- 📝 [代码调整记录](变更管理/code-adjust-record.md)(已迁移) +- 📊 需求变更记录 +- 🗄️ 数据库变更记录 +- 🔌 API 变更记录 +- 🚀 部署变更记录 + +### 📚 [知识库](知识库/) + +**新增知识管理** - 积累项目经验和最佳实践 + +- 编码、安全、性能最佳实践 +- 项目回顾和技术决策记录 +- 外部资源和常见问题解答 + +### 📊 [报告文档](报告文档/) + +**新增项目管理** - 定期的项目报告和质量报告 + +- 项目进度和里程碑报告 +- 代码质量和测试覆盖率报告 +- 发布说明和部署报告 ## 🔧 技术栈概览 @@ -114,61 +140,90 @@ ### 🚀 新手入门 -1. **环境搭建**: [开发环境搭建指南](development/README.md#开发环境搭建) -2. **项目启动**: [快速开始](development/README.md#快速开始) -3. **开发规范**: [开发规范和指南](development/README.md#开发规范和指南) +1. **环境搭建**: [开发环境搭建指南](开发文档/README.md#开发环境搭建) +2. **项目启动**: [快速开始](开发文档/README.md#快速开始) +3. **开发规范**: [开发规范和指南](开发文档/README.md#开发规范和指南) ### 💼 业务开发 -1. **需求分析**: [需求文档](requirements/README.md) -2. **数据库设计**: [数据库设计文档](design/README.md#数据库设计文档) -3. **接口开发**: [API 接口设计](design/README.md#接口设计文档) -4. **前端开发**: [前端开发指南](development/README.md#功能开发指南) +1. **需求分析**: [需求文档](需求文档/README.md) +2. **数据库设计**: [数据库设计文档](设计文档/README.md#数据库设计文档) +3. **接口开发**: [API 接口设计](设计文档/README.md#接口设计文档) +4. **前端开发**: [前端开发指南](开发文档/README.md#功能开发指南) + +### 🎯 双重导航体系 + +### 📋 按项目阶段导航 + +**传统软件开发生命周期视图** + +``` +需求分析 → 系统设计 → 开发实施 → 测试验证 → 部署上线 +需求文档 → 设计文档 → 开发文档 → 测试文档 → 部署文档 +``` + +### 📊 按业务模块导航 + +**业务领域驱动视图,便于 AI 理解业务上下文** + +``` +用户管理 ← → 后勤满意度调查 ← → 报告厅预约 ← → 系统管理 +完整的模块文档:需求+设计+API+数据库+测试 +``` + +## 📖 快速导航指南 + +### 🚀 新手入门 + +1. **了解项目**:[项目总览](项目总览/README.md) +2. **环境搭建**:[开发环境搭建](开发文档/README.md#环境搭建) +3. **开发规范**:[编码规范](开发文档/README.md#编码规范) + +### 💼 AI 辅助开发 + +1. **业务理解**:查看 [业务模块文档](业务模块/) 了解完整业务上下文 +2. **接口开发**:参考 [API 文档](开发文档/API.md) 和模块 API 设计 +3. **代码生成**:使用模块的 database.md 和 api.md 生成代码 +4. **变更记录**:在 [变更管理](变更管理/) 中记录所有调整 ### 🔧 运维部署 -1. **部署方案**: [部署文档](deployment/README.md) -2. **环境配置**: [中间件配置](middleware/README.md) -3. **监控告警**: [监控配置](deployment/README.md#监控和告警) +1. **部署方案**:[部署文档](部署文档/README.md) +2. **环境配置**:[中间件配置](中间件配置/README.md) +3. **监控告警**:[监控配置](部署文档/README.md#监控配置) ### 🧪 质量保证 -1. **测试规范**: [测试文档](testing/README.md) -2. **代码质量**: [开发规范](development/README.md#开发规范和指南) -3. **性能优化**: [性能优化指南](development/README.md#性能优化指南) +1. **测试规范**:[测试文档](测试文档/README.md) +2. **代码质量**:[开发规范](开发文档/README.md#编码规范) +3. **变更追踪**:[变更管理](变更管理/README.md) -## 📋 重要规范 +## 📋 重要开发规范 + +### 🔴 强制性要求 + +- **API 变更必须同步更新文档**:任何 API 接口的新增、修改、删除都必须立即更新 `开发文档/API.md` +- **代码调整必须记录**:每次代码变更都必须在 `变更管理/code-adjust-record.md` 中记录 +- **模块文档必须维护**:业务模块的变更必须同步更新对应模块文档 ### 🔒 安全规范 -- 所有接口必须进行权限校验 +- 所有接口必须进行权限校验(Sa-Token) - 敏感数据必须加密存储 -- 生产环境密码定期更换 -- API 接口启用加解密传输 +- 遵循多租户数据隔离规范 ### 📊 数据库规范 -- 使用雪花 ID 作为主键 +- 使用雪花 ID 作为主键(ASSIGN_ID) - 所有业务表包含基础字段(id、tenant_id、create_by 等) -- 多租户字段必须建索引 -- 遵循命名规范(下划线命名法) +- 遵循下划线命名法 ### 🌐 接口规范 - 遵循 RESTful API 设计原则 - 统一响应格式(code、msg、data) -- 使用 SpringDoc 自动生成文档 - 完整的参数校验和异常处理 -### 🔄 代码变更规则 - -**每次代码调整必须同步更新以下文档**: - -- API 文档:接口变更时更新 OpenAPI 文档 -- 数据库文档:表结构变更时更新 DDL 和文档 -- 配置文档:配置项变更时更新配置说明 -- 部署文档:部署流程变更时更新部署手册 - ## 📞 技术支持 ### 🔗 官方资源 diff --git a/docs/design/README.md b/docs/design/README.md deleted file mode 100644 index 45d80ca9..00000000 --- a/docs/design/README.md +++ /dev/null @@ -1,113 +0,0 @@ -# 设计文档目录 - -## 目录说明 - -此目录用于存放项目的设计相关文档,包括系统设计、数据库设计、接口设计等。 - -## 1. 系统设计文档 - - `系统设计文档`:整体系统架构设计和模块设计 - -### 文档结构: -- **系统架构设计.md**:整体架构设计方案 -- **模块设计文档.md**:各功能模块详细设计 -- **技术选型说明.md**:技术栈选择和说明 -- **部署架构设计.md**:部署架构和环境设计 - -## 2. 数据库设计文档 - - `数据库设计文档`:数据库结构设计和字段说明 - -### 设计文档: -- **数据库设计说明.md**:数据库整体设计说明 -- **ER图设计文档.md**:实体关系图设计 -- **表结构设计.md**:详细表结构和字段说明 -- **数据字典.md**:数据字典和编码规范 - -### SQL脚本: -- DDL/ - 数据定义语言脚本 - - create_tables.sql - 建表脚本 - - alter_tables.sql - 修改表结构脚本 - - indexes.sql - 索引创建脚本 -- DML/ - 数据操作语言脚本 - - init_data.sql - 初始化数据脚本 - - dict_data.sql - 字典数据脚本 - - test_data.sql - 测试数据脚本 - -## 3. 接口设计文档 - - `接口设计文档`:API接口设计和数据格式定义 - -### 设计文档: -- **API接口设计规范.md**:接口设计规范和约定 -- **接口文档模板.md**:标准接口文档模板 -- **数据格式规范.md**:请求响应数据格式规范 -- **错误码定义.md**:统一错误码定义 - -### 模块接口: -- system/ - 系统管理模块接口 -- auth/ - 认证授权模块接口 -- tenant/ - 多租户模块接口 -- workflow/ - 工作流模块接口 -- custom/ - 自定义业务模块接口 - -## 4. 安全设计文档 - - `安全设计文档`:系统安全设计和防护方案 - -### 设计文档: -- **权限设计方案.md**:权限模型和访问控制 -- **数据安全设计.md**:数据加密和脱敏方案 -- **接口安全设计.md**:接口安全防护方案 -- **审计日志设计.md**:操作审计和日志设计 - -## 5. 性能设计文档 - - `性能设计文档`:系统性能优化设计 - -### 设计文档: -- **缓存设计方案.md**:缓存策略和实现方案 -- **数据库优化设计.md**:数据库性能优化设计 -- **分布式设计方案.md**:分布式架构设计 -- **监控设计方案.md**:性能监控和告警设计 - -## 文档管理规范 - -### 设计原则 -- **可扩展性**:设计支持功能扩展和技术升级 -- **可维护性**:清晰的模块划分和接口定义 -- **可测试性**:支持单元测试和集成测试 -- **安全性**:全面的安全防护设计 -- **性能优化**:合理的性能优化策略 - -### 文档规范 -- 统一使用Markdown格式 -- 包含完整的设计说明和实现方案 -- 提供清晰的图表和示例 -- 定期更新和维护文档 - -### 版本控制 -- 重大设计变更需要版本升级 -- 保留设计变更历史记录 -- 设计文档与代码版本同步 - -## 设计评审 - -### 评审流程 -1. 设计文档编写完成 -2. 技术团队内部评审 -3. 架构师确认设计方案 -4. 项目负责人最终审批 - -### 评审要点 -- 设计方案的合理性和可行性 -- 技术选型的适当性 -- 性能和安全考虑 -- 可扩展性和维护性 - -## 注意事项 - -1. 所有重要设计决策都需要文档记录 -2. 设计变更需要评估影响范围 -3. 设计文档需要与实际实现保持同步 -4. 定期review设计文档的有效性 \ No newline at end of file diff --git a/docs/design/database/README.md b/docs/design/database/README.md deleted file mode 100644 index f8694f7a..00000000 --- a/docs/design/database/README.md +++ /dev/null @@ -1,125 +0,0 @@ -# 数据库设计目录 - -## 目录说明 - -此目录用于存放项目的数据库设计相关文档和脚本文件。 - -## 📁 目录结构 - -``` -database/ -├── README.md # 本说明文件 -├── hzdyjs_xg.sql # 完整数据库模型 (当前系统的完整表结构) -├── database_msg.md # 数据库环境配置信息 -├── 数据库设计说明.md # 整体数据库设计文档 -├── ER图设计文档.md # 实体关系图设计 -├── 表结构设计.md # 详细表结构和字段说明 -├── 数据字典.md # 数据字典和编码规范 -├── DDL/ # 数据定义语言脚本 -│ ├── system/ # 系统核心表 -│ │ ├── sys_tables.sql # 系统管理表 -│ │ ├── auth_tables.sql # 权限认证表 -│ │ └── tenant_tables.sql # 多租户表 -│ ├── business/ # 业务模块表 -│ │ ├── hq_tables.sql # 后勤管理相关表 -│ │ └── custom_tables.sql # 自定义业务表 -│ ├── indexes.sql # 索引创建脚本 -│ └── constraints.sql # 约束创建脚本 -├── DML/ # 数据操作语言脚本 -│ ├── init_data.sql # 初始化数据脚本 -│ ├── dict_data.sql # 字典数据脚本 -│ ├── menu_data.sql # 菜单权限数据 -│ └── test_data.sql # 测试数据脚本 -├── models/ # 数据模型文件 -│ ├── erd/ # ER图文件 -│ │ ├── system_erd.drawio # 系统模块ER图 -│ │ ├── business_erd.drawio # 业务模块ER图 -│ │ └── complete_erd.png # 完整ER图导出 -│ └── schema/ # 数据库schema文件 -│ ├── mysql_schema.sql # MySQL数据库schema -│ ├── oracle_schema.sql # Oracle数据库schema -│ └── postgres_schema.sql # PostgreSQL数据库schema -└── migration/ # 数据库迁移脚本 - ├── v5.0_to_v5.1/ # 版本升级脚本 - ├── v5.1_to_v5.2/ - └── rollback/ # 回滚脚本 -``` - -## 🎯 不同类型数据模型的存放建议 - -### 0. **当前完整数据库模型** - -- **主模型文件**: `docs/design/database/hzdyjs_xg.sql` -- **内容**: 当前系统的完整数据库表结构,包含所有业务表和系统表 -- **说明**: 包含宿舍管理 (bed*\*, dormitory*\_)、工作流 (flow\_\_) 等业务模块 -- **环境配置**: `docs/design/database/database_msg.md` 包含开发环境数据库连接信息 - -### 1. **系统核心数据模型** - -- **位置**: `docs/design/database/DDL/system/` -- **内容**: 系统管理、权限认证、多租户等核心表结构 -- **示例**: `sys_user`, `sys_role`, `sys_menu`, `sys_tenant` - -### 2. **业务模块数据模型** - -- **位置**: `docs/design/database/DDL/business/` -- **内容**: 具体业务功能相关的表结构 -- **示例**: 后勤管理、报告厅预约、满意度调查等 - -### 3. **初始化和测试数据** - -- **位置**: `docs/design/database/DML/` -- **内容**: 系统初始化数据、字典数据、测试数据等 - -### 4. **ER 图和设计文档** - -- **位置**: `docs/design/database/models/` -- **内容**: 数据库设计图表、关系图、设计说明等 - -### 5. **版本升级脚本** - -- **位置**: `docs/design/database/migration/` -- **内容**: 数据库版本升级脚本、数据迁移脚本等 - -## 🔄 与现有目录的关联 - -### 现有 SQL 脚本位置 - -- **当前完整模型**: `docs/design/database/hzdyjs_xg.sql` → 当前系统的完整数据库模型 (3638 行) -- **环境配置**: `docs/design/database/database_msg.md` → 开发环境数据库连接信息 -- **框架主脚本**: `script/sql/ry_vue_5.X.sql` → 参考并拆分到对应模块 -- **更新脚本**: `script/sql/update/` → 整理到 migration 目录 -- **业务脚本**: `docs/requirements/*/` → 移动到 business 目录 - -### 同步规则 - -1. **新表设计**: 先在`docs/design/database/`中设计,再更新到`script/sql/` -2. **表结构变更**: 同时更新设计文档和升级脚本 - - **必须同步更新**: `docs/design/database/hzdyjs_xg.sql` 中的表结构 - - **环境配置变更**: 及时更新 `docs/design/database/database_msg.md` -3. **文档维护**: 每次数据库变更都要更新相关设计文档 - -## 📝 文件命名规范 - -### DDL 脚本命名 - -- **系统表**: `sys_*.sql` (如: sys_user.sql) -- **业务表**: `模块前缀_*.sql` (如: hq_survey.sql) -- **索引脚本**: `idx_表名.sql` (如: idx_sys_user.sql) - -### 文档命名 - -- **设计文档**: 使用中文描述性名称 -- **ER 图文件**: `模块名_erd.drawio` -- **导出图片**: `模块名_erd.png` - -## ⚠️ 注意事项 - -1. **版本控制**: 所有 DDL 变更都要记录版本和变更原因 -2. **多数据库支持**: 考虑 MySQL、Oracle、PostgreSQL 的兼容性 -3. **命名规范**: 遵循框架统一的命名规范(下划线命名法) -4. **文档同步**: 表结构变更必须同时更新设计文档 - - **关键文件**: `hzdyjs_xg.sql` 必须保持最新的完整表结构 - - **环境安全**: `database_msg.md` 中的密码信息注意安全保护 -5. **备份策略**: 重要脚本变更前要备份现有版本 -6. **当前系统参考**: 新增表结构应参考 `hzdyjs_xg.sql` 中现有表的设计规范 diff --git a/docs/development/README.md b/docs/development/README.md deleted file mode 100644 index 216cbebc..00000000 --- a/docs/development/README.md +++ /dev/null @@ -1,384 +0,0 @@ -# 开发文档目录 - -## 目录说明 - -此目录用于存放项目的开发相关文档,包括开发指南、代码样例、问题记录等。 - -## 1. 开发环境搭建 - -### 环境准备 - -- **开发环境搭建指南.md**:完整的开发环境搭建步骤 -- **IDE 配置指南.md**:IntelliJ IDEA 开发环境配置 -- **Maven 配置.md**:Maven 环境配置和私服配置 -- **Git 配置.md**:Git 版本控制配置 - -### 工具安装 - -- **JDK 安装配置.md**:Java 开发环境安装 -- **Node.js 安装配置.md**:前端开发环境安装 -- **数据库安装.md**:MySQL 和 Redis 安装配置 -- **开发工具推荐.md**:推荐的开发工具和插件 - -### 环境配置示例: - -```bash -# 开发环境启动脚本示例 -#!/bin/bash - -# 启动MySQL -sudo systemctl start mysql - -# 启动Redis -sudo systemctl start redis - -# 启动后端应用 -cd ruoyi-admin -mvn spring-boot:run -Dspring-boot.run.profiles=dev - -# 启动前端应用 -cd ../plus-ui -npm run dev -``` - -## 2. 开发规范和指南 - -### 代码规范 - -- **Java 代码规范.md**:Java 代码编写规范 -- **前端代码规范.md**:Vue3+TypeScript 代码规范 -- **数据库设计规范.md**:数据库表设计规范 -- **API 接口规范.md**:RESTful API 设计规范 - -### 命名规范 - -- **包命名规范.md**:Java 包命名规范 -- **类和方法命名.md**:类和方法命名规范 -- **数据库命名规范.md**:表和字段命名规范 -- **前端命名规范.md**:组件和方法命名规范 - -### Git 规范 - -- **Git 分支规范.md**:Git 分支管理规范 -- **提交信息规范.md**:Git 提交信息格式规范 -- **代码审查流程.md**:Code Review 流程和标准 - -## 3. 架构设计指南 - -### 系统架构 - -- **整体架构设计.md**:系统整体架构设计说明 -- **模块化设计.md**:模块化架构设计原则 -- **分层架构设计.md**:分层架构设计和职责划分 -- **微服务架构.md**:微服务架构设计指南 - -### 设计模式 - -- **常用设计模式.md**:项目中使用的设计模式 -- **Spring 设计模式.md**:Spring 框架中的设计模式 -- **业务设计模式.md**:业务层常用设计模式 - -### 架构示例: - -```java -// 标准Controller示例 -@RestController -@RequestMapping("/api/v1/users") -@Tag(name = "用户管理", description = "用户管理相关接口") -public class UserController extends BaseController { - - @Autowired - private IUserService userService; - - @SaCheckPermission("system:user:list") - @GetMapping - @Operation(summary = "查询用户列表", description = "分页查询用户信息") - public R> list(@Valid UserQueryDTO queryDTO) { - return R.ok(userService.queryPageList(queryDTO)); - } -} -``` - -## 4. 功能开发指南 - -### 新功能开发流程 - -- **功能开发流程.md**:从需求到上线的完整流程 -- **业务模块开发.md**:新业务模块开发步骤 -- **接口开发指南.md**:API 接口开发步骤 -- **前端页面开发.md**:前端页面开发步骤 - -### 数据库开发 - -- **数据库设计流程.md**:数据库表设计流程 -- **SQL 编写规范.md**:SQL 语句编写规范 -- **数据迁移指南.md**:数据库迁移指南 -- **性能优化指南.md**:SQL 性能优化指南 - -### 缓存开发 - -- **Redis 使用指南.md**:Redis 缓存使用指南 -- **缓存策略设计.md**:缓存策略设计原则 -- **分布式锁使用.md**:分布式锁使用指南 - -## 5. 代码样例和模板 - -### 后端代码模板 - -- **Controller 模板.md**:标准 Controller 代码模板 -- **Service 模板.md**:标准 Service 代码模板 -- **Mapper 模板.md**:标准 Mapper 代码模板 -- **Entity 模板.md**:标准实体类代码模板 - -### 前端代码模板 - -- **Vue 组件模板.md**:标准 Vue 组件模板 -- **API 调用模板.md**:API 接口调用模板 -- **表单组件模板.md**:表单组件开发模板 -- **表格组件模板.md**:表格组件开发模板 - -### 配置文件模板 - -- **application.yml 模板.md**:应用配置模板 -- **logback 配置模板.md**:日志配置模板 -- **Dockerfile 模板.md**:Docker 镜像构建模板 - -### Service 层代码示例: - -```java -@Service -@Transactional(rollbackFor = Exception.class) -public class UserServiceImpl implements IUserService { - - @Autowired - private UserMapper userMapper; - - @Override - @DataPermission(deptAlias = "d", userAlias = "u") - public PageResult queryPageList(UserQueryDTO queryDTO) { - LambdaQueryWrapper lqw = buildQueryWrapper(queryDTO); - Page result = userMapper.selectVoPage(queryDTO.toPage(), lqw); - return PageResult.build(result); - } - - private LambdaQueryWrapper buildQueryWrapper(UserQueryDTO queryDTO) { - return Wrappers.lambdaQuery() - .like(StringUtils.isNotBlank(queryDTO.getUserName()), - SysUser::getUserName, queryDTO.getUserName()) - .eq(StringUtils.isNotBlank(queryDTO.getStatus()), - SysUser::getStatus, queryDTO.getStatus()) - .between(queryDTO.getCreateTime() != null && queryDTO.getCreateTime().length == 2, - SysUser::getCreateTime, - queryDTO.getCreateTime()[0], queryDTO.getCreateTime()[1]); - } -} -``` - -## 6. 第三方集成指南 - -### 权限认证集成 - -- **Sa-Token 集成.md**:Sa-Token 权限框架集成 -- **JWT 配置.md**:JWT 令牌配置和使用 -- **第三方登录.md**:第三方登录集成指南 -- **单点登录.md**:SSO 单点登录配置 - -### 消息服务集成 - -- **短信服务集成.md**:短信服务集成指南 -- **邮件服务集成.md**:邮件服务集成指南 -- **消息中间件.md**:消息队列集成指南 - -### 存储服务集成 - -- **文件存储集成.md**:MinIO 文件存储集成 -- **云存储集成.md**:阿里云 OSS 等云存储集成 -- **图片处理.md**:图片上传和处理 - -## 7. 测试开发指南 - -### 单元测试 - -- **单元测试编写.md**:单元测试编写指南 -- **Mock 测试.md**:Mock 对象使用指南 -- **测试用例设计.md**:测试用例设计原则 -- **测试覆盖率.md**:测试覆盖率要求和检查 - -### 集成测试 - -- **集成测试编写.md**:集成测试编写指南 -- **数据库测试.md**:数据库操作测试 -- **API 测试.md**:API 接口测试 - -### 测试示例: - -```java -@SpringBootTest -@Transactional -@Rollback -class UserServiceTest { - - @Autowired - private IUserService userService; - - @Test - @DisplayName("测试用户查询功能") - void testQueryUser() { - // Given - UserQueryDTO queryDTO = new UserQueryDTO(); - queryDTO.setUserName("admin"); - - // When - PageResult result = userService.queryPageList(queryDTO); - - // Then - assertThat(result).isNotNull(); - assertThat(result.getRecords()).isNotEmpty(); - } -} -``` - -## 8. 性能优化指南 - -### 代码优化 - -- **算法优化.md**:常见算法优化技巧 -- **集合框架优化.md**:Java 集合使用优化 -- **字符串优化.md**:字符串操作优化 -- **反射优化.md**:反射操作优化 - -### 数据库优化 - -- **查询优化.md**:SQL 查询优化指南 -- **索引优化.md**:数据库索引优化 -- **连接池优化.md**:数据库连接池优化 -- **分页优化.md**:大数据量分页优化 - -### 缓存优化 - -- **缓存设计.md**:缓存设计最佳实践 -- **缓存穿透.md**:缓存穿透问题解决 -- **缓存雪崩.md**:缓存雪崩问题解决 -- **缓存击穿.md**:缓存击穿问题解决 - -## 9. 问题记录和解决方案 - -### 常见问题 - -- **启动问题.md**:应用启动常见问题 -- **配置问题.md**:配置相关常见问题 -- **数据库问题.md**:数据库连接和操作问题 -- **缓存问题.md**:Redis 缓存相关问题 - -### 框架问题 - -- **Spring Boot 问题.md**:Spring Boot 框架问题 -- **MyBatis Plus 问题.md**:MyBatis Plus 相关问题 -- **Sa-Token 问题.md**:Sa-Token 权限框架问题 -- **前端框架问题.md**:Vue3 相关问题 - -### 部署问题 - -- **Docker 问题.md**:Docker 部署相关问题 -- **Nginx 问题.md**:Nginx 配置相关问题 -- **SSL 证书问题.md**:SSL 证书配置问题 - -## 10. 版本升级指南 - -### 框架升级 - -- **Spring Boot 升级.md**:Spring Boot 版本升级指南 -- **Java 版本升级.md**:Java 版本升级指南 -- **依赖升级.md**:第三方依赖升级指南 - -### 数据库升级 - -- **MySQL 升级.md**:MySQL 版本升级指南 -- **Redis 升级.md**:Redis 版本升级指南 -- **数据迁移.md**:数据库结构迁移指南 - -### 兼容性处理 - -- **向后兼容.md**:向后兼容性处理 -- **接口兼容.md**:API 接口兼容性处理 -- **数据兼容.md**:数据格式兼容性处理 - -## 11. 开发工具和插件 - -### IDEA 插件推荐 - -``` -必装插件: -- Lombok -- MyBatis Plus -- Alibaba Java规约检查 -- SonarLint -- GitToolBox -- Rainbow Brackets -- Translation - -可选插件: -- JRebel (热部署) -- Sequence Diagram (时序图) -- RestfulTool (接口测试) -- Database Navigator (数据库) -``` - -### 开发工具推荐 - -- **数据库工具**: Navicat Premium / DataGrip -- **Redis 工具**: RedisDesktopManager / AnotherRedisDesktopManager -- **API 工具**: Postman / Insomnia -- **Git 工具**: SourceTree / GitKraken -- **文档工具**: Typora / Mark Text - -### 代码质量工具 - -- **静态分析**: SonarQube -- **代码格式**: Google Java Format -- **依赖检查**: OWASP Dependency Check -- **测试覆盖**: JaCoCo - -## 12. 快速开始 - -### 项目初始化 - -```bash -# 1. 克隆项目 -git clone https://gitee.com/dromara/RuoYi-Vue-Plus.git - -# 2. 导入数据库 -mysql -u root -p < script/sql/ry_vue_5.X.sql - -# 3. 修改配置 -# 编辑 ruoyi-admin/src/main/resources/application-dev.yml -# 修改数据库连接信息 - -# 4. 启动后端 -cd ruoyi-admin -mvn spring-boot:run - -# 5. 启动前端 -cd plus-ui -npm install -npm run dev -``` - -### 新模块开发步骤 - -1. **需求分析**: 明确功能需求和技术要求 -2. **数据库设计**: 设计表结构和关系 -3. **代码生成**: 使用代码生成器生成基础代码 -4. **业务开发**: 实现具体业务逻辑 -5. **前端开发**: 开发前端页面和交互 -6. **测试验证**: 编写测试用例并验证 -7. **文档更新**: 更新相关文档 - -## 注意事项 - -1. 开发前必须阅读框架文档和开发规范 -2. 新功能开发需要编写对应的测试用例 -3. 代码提交前需要通过代码规范检查 -4. 重要功能变更需要进行 Code Review -5. 及时更新开发文档和接口文档 -6. 遵循安全编码规范,避免安全漏洞 diff --git a/docs/requirements/后勤报告厅预约需求/simple_hall_reservation_schema.sql b/docs/requirements/后勤报告厅预约需求/simple_hall_reservation_schema.sql deleted file mode 100644 index 3c7410ff..00000000 --- a/docs/requirements/后勤报告厅预约需求/simple_hall_reservation_schema.sql +++ /dev/null @@ -1,54 +0,0 @@ --- ============================================= --- 简化版报告厅预约系统数据库表设计 --- ============================================= --- ============================================= --- 简化版报告厅预约系统数据库表设计 --- ============================================= - --- 1. 报告厅信息表 -DROP TABLE IF EXISTS `hq_hall_info`; -CREATE TABLE `hq_hall_info` ( - `id` bigint(20) NOT NULL COMMENT '主键ID', - `tenant_id` varchar(20) NOT NULL COMMENT '租户编号', - `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', - `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `hall_name` varchar(100) NOT NULL COMMENT '报告厅名称', - `hall_image` text DEFAULT NULL COMMENT '报告厅图片url', - `hall_status` char(1) NOT NULL DEFAULT '1' COMMENT '报告厅状态:0-不可用,1-正常', - `hall_description` text COMMENT '报告厅描述', - PRIMARY KEY (`id`), - KEY `idx_tenant_id` (`tenant_id`), - KEY `idx_hall_status` (`hall_status`) -) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='报告厅信息表'; - --- 2. 报告厅预约表 -DROP TABLE IF EXISTS `hq_hall_reservation`; -CREATE TABLE `hq_hall_reservation` ( - `id` bigint(20) NOT NULL COMMENT '主键ID', - `tenant_id` varchar(20) NOT NULL COMMENT '租户编号', - `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', - `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `hall_id` bigint(20) NOT NULL COMMENT '报告厅ID', - `hall_name` varchar(100) NOT NULL COMMENT '报告厅名称', - `start_time` datetime NOT NULL COMMENT '开始时间', - `end_time` datetime NOT NULL COMMENT '结束时间', - `reservation_purpose` varchar(200) NOT NULL COMMENT '预约用途', - `applicant_id` bigint(20) NOT NULL COMMENT '申请人id', - `applicant_name` varchar(50) NOT NULL COMMENT '申请人姓名', - `applicant_phone` varchar(20) DEFAULT NULL COMMENT '申请人电话', - `status` char(1) NOT NULL DEFAULT '0' COMMENT '预约状态:0-待审核,1-预约成功,2-预约失败', - `audit_by` bigint(20) DEFAULT NULL COMMENT '审核人id', - `audit_name` varchar(50) DEFAULT NULL COMMENT '审核人姓名', - `audit_time` datetime DEFAULT NULL COMMENT '审核时间', - `audit_remark` varchar(500) DEFAULT NULL COMMENT '审核备注', - PRIMARY KEY (`id`), - KEY `idx_tenant_id` (`tenant_id`), - KEY `idx_hall_id` (`hall_id`), - KEY `idx_status` (`status`) -) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='报告厅预约表'; diff --git a/docs/structure-optimization-plan.md b/docs/structure-optimization-plan.md new file mode 100644 index 00000000..72c2e925 --- /dev/null +++ b/docs/structure-optimization-plan.md @@ -0,0 +1,252 @@ +# docs 文件夹结构优化方案 + +## 📋 优化目标 + +1. **全过程管理**:从项目需求到项目交付的完整文档记录 +2. **AI 辅助开发**:便于 Cursor AI 快速理解业务上下文和技术细节 +3. **模块化管理**:同一业务模块的文档聚合,便于查找和维护 +4. **版本追踪**:完善的变更记录和版本管理 + +## 🏗️ 新的目录结构设计 + +``` +docs/ +├── 📋 项目总览/ # 项目总览(新增) +│ ├── README.md # 项目整体介绍 +│ ├── tech-stack.md # 技术栈说明 +│ ├── project-timeline.md # 项目时间线 +│ └── team-roles.md # 团队角色分工 +│ +├── 📊 业务模块/ # 业务模块文档(新增) +│ ├── README.md # 业务模块总览 +│ ├── user-management/ # 用户管理模块 +│ │ ├── requirements.md # 需求文档 +│ │ ├── design.md # 设计文档 +│ │ ├── api.md # API接口文档 +│ │ ├── database.md # 数据库设计 +│ │ └── test-cases.md # 测试用例 +│ ├── hq-satisfaction-survey/ # 后勤满意度调查 +│ │ ├── requirements.md +│ │ ├── design.md +│ │ ├── api.md +│ │ ├── database.md +│ │ └── workflow.md +│ ├── hall-reservation/ # 报告厅预约 +│ │ ├── requirements.md +│ │ ├── design.md +│ │ ├── api.md +│ │ └── database.md +│ └── system-management/ # 系统管理模块 +│ ├── requirements.md +│ ├── design.md +│ ├── api.md +│ └── database.md +│ +├── 🎯 需求文档/ # 需求阶段文档(保留并优化) +│ ├── README.md # 需求管理总说明 +│ ├── project-requirements.md # 项目整体需求 +│ ├── functional-requirements/ # 功能需求 +│ │ ├── README.md +│ │ └── [各模块功能需求].md +│ ├── non-functional-requirements/ # 非功能需求 +│ │ ├── performance.md # 性能需求 +│ │ ├── security.md # 安全需求 +│ │ └── usability.md # 可用性需求 +│ └── requirements-traceability.md # 需求追踪矩阵 +│ +├── 🏗️ 设计文档/ # 设计阶段文档(保留并优化) +│ ├── README.md # 设计文档总说明 +│ ├── architecture/ # 系统架构设计 +│ │ ├── system-architecture.md # 系统架构图 +│ │ ├── technology-selection.md # 技术选型 +│ │ └── deployment-architecture.md # 部署架构 +│ ├── database/ # 数据库设计(保留现有) +│ │ ├── README.md +│ │ ├── hzdyjs_xg.sql # 完整数据库脚本 +│ │ ├── database_msg.md # 环境配置信息 +│ │ ├── er-diagram.md # ER图 +│ │ └── data-dictionary.md # 数据字典 +│ ├── api-design/ # API设计 +│ │ ├── api-standards.md # API设计规范 +│ │ ├── api-authentication.md # 认证设计 +│ │ └── api-versioning.md # 版本管理 +│ ├── ui-design/ # UI设计 +│ │ ├── design-system.md # 设计系统 +│ │ ├── prototypes/ # 原型文件 +│ │ └── style-guide.md # 样式指南 +│ └── security-design.md # 安全设计 +│ +├── 💻 开发文档/ # 开发阶段文档(保留并优化) +│ ├── README.md # 开发指南总说明 +│ ├── environment-setup/ # 环境搭建 +│ │ ├── local-development.md # 本地开发环境 +│ │ ├── docker-setup.md # Docker环境 +│ │ └── ide-configuration.md # IDE配置 +│ ├── coding-standards/ # 编码规范 +│ │ ├── java-standards.md # Java规范 +│ │ ├── vue-standards.md # Vue规范 +│ │ ├── database-standards.md # 数据库规范 +│ │ └── git-workflow.md # Git工作流 +│ ├── API.md # 完整API文档(保留) +│ ├── code-templates/ # 代码模板 +│ │ ├── controller-template.md # Controller模板 +│ │ ├── service-template.md # Service模板 +│ │ └── vue-component-template.md # Vue组件模板 +│ ├── integration-guides/ # 集成指南 +│ │ ├── third-party-services.md # 第三方服务集成 +│ │ ├── payment-integration.md # 支付集成 +│ │ └── auth-integration.md # 认证集成 +│ └── troubleshooting.md # 问题排查指南 +│ +├── 🧪 测试文档/ # 测试阶段文档(保留并优化) +│ ├── README.md # 测试文档总说明 +│ ├── test-strategy.md # 测试策略 +│ ├── test-plans/ # 测试计划 +│ │ ├── unit-test-plan.md # 单元测试计划 +│ │ ├── integration-test-plan.md # 集成测试计划 +│ │ └── system-test-plan.md # 系统测试计划 +│ ├── test-cases/ # 测试用例 +│ │ ├── functional-test-cases.md # 功能测试用例 +│ │ ├── performance-test-cases.md # 性能测试用例 +│ │ └── security-test-cases.md # 安全测试用例 +│ ├── test-data/ # 测试数据 +│ │ ├── test-data-setup.md # 测试数据准备 +│ │ └── sample-data.sql # 示例数据 +│ └── test-reports/ # 测试报告 +│ ├── test-execution-reports.md # 测试执行报告 +│ └── bug-reports.md # 缺陷报告 +│ +├── 🚀 部署文档/ # 部署阶段文档(保留并优化) +│ ├── README.md # 部署指南总说明 +│ ├── environments/ # 环境配置 +│ │ ├── development.md # 开发环境 +│ │ ├── staging.md # 测试环境 +│ │ └── production.md # 生产环境 +│ ├── infrastructure/ # 基础设施 +│ │ ├── server-requirements.md # 服务器要求 +│ │ ├── network-configuration.md # 网络配置 +│ │ └── monitoring-setup.md # 监控配置 +│ ├── deployment-guides/ # 部署指南 +│ │ ├── manual-deployment.md # 手动部署 +│ │ ├── docker-deployment.md # Docker部署 +│ │ └── ci-cd-pipeline.md # CI/CD流水线 +│ └── maintenance/ # 运维文档 +│ ├── backup-restore.md # 备份恢复 +│ ├── performance-tuning.md # 性能调优 +│ └── troubleshooting.md # 故障排除 +│ +├── ⚙️ 中间件配置/ # 中间件配置(保留并扩展) +│ ├── README.md # 中间件配置总说明 +│ ├── database/ # 数据库配置 +│ │ ├── mysql-config.md # MySQL配置(保留) +│ │ ├── redis-config.md # Redis配置 +│ │ └── connection-pool.md # 连接池配置 +│ ├── web-server/ # Web服务器 +│ │ ├── nginx-config.md # Nginx配置 +│ │ └── ssl-certificate.md # SSL证书配置 +│ ├── message-queue/ # 消息队列 +│ │ ├── rabbitmq-config.md # RabbitMQ配置 +│ │ └── kafka-config.md # Kafka配置 +│ └── monitoring/ # 监控组件 +│ ├── prometheus-config.md # Prometheus配置 +│ └── grafana-config.md # Grafana配置 +│ +├── 📝 变更管理/ # 变更管理(新增,整合现有记录) +│ ├── README.md # 变更管理说明 +│ ├── code-adjust-record.md # 代码调整记录(迁移) +│ ├── requirement-changes.md # 需求变更记录 +│ ├── database-changes.md # 数据库变更记录 +│ ├── api-changes.md # API变更记录 +│ └── deployment-changes.md # 部署变更记录 +│ +├── 📚 知识库/ # 知识库(新增) +│ ├── README.md # 知识库说明 +│ ├── best-practices/ # 最佳实践 +│ │ ├── coding-best-practices.md # 编码最佳实践 +│ │ ├── security-best-practices.md # 安全最佳实践 +│ │ └── performance-best-practices.md # 性能最佳实践 +│ ├── lessons-learned/ # 经验教训 +│ │ ├── project-retrospectives.md # 项目回顾 +│ │ └── technical-decisions.md # 技术决策记录 +│ ├── external-resources/ # 外部资源 +│ │ ├── useful-links.md # 有用链接 +│ │ └── reference-materials.md # 参考资料 +│ └── faq.md # 常见问题 +│ +└── 📊 报告文档/ # 报告文档(新增) + ├── README.md # 报告说明 + ├── project-progress/ # 项目进度 + │ ├── weekly-reports.md # 周报 + │ └── milestone-reports.md # 里程碑报告 + ├── quality-reports/ # 质量报告 + │ ├── code-quality.md # 代码质量报告 + │ └── test-coverage.md # 测试覆盖率报告 + └── delivery-reports/ # 交付报告 + ├── release-notes.md # 发布说明 + └── deployment-reports.md # 部署报告 +``` + +## 🎯 优化亮点 + +### 1. 双重导航体系 + +- **按阶段导航**:requirements → design → development → testing → deployment +- **按模块导航**:business-modules 下按业务模块组织,包含该模块的全生命周期文档 + +### 2. Cursor AI 友好设计 + +- **business-modules**:让 AI 快速理解各业务模块的完整上下文 +- **code-templates**:提供标准代码模板,便于 AI 生成规范代码 +- **API.md**:集中的 API 文档,便于 AI 理解接口设计 + +### 3. 全过程管理 + +- **project-overview**:项目整体信息一目了然 +- **change-management**:完善的变更追踪体系 +- **reports**:定期的项目报告和质量报告 + +### 4. 知识积累 + +- **knowledge-base**:积累项目经验和最佳实践 +- **lessons-learned**:记录项目中的经验教训 + +## 🔄 迁移计划 + +### 第一阶段:保持现有结构运行 + +1. 不破坏现有文档结构 +2. 在现有基础上补充新的目录 + +### 第二阶段:逐步迁移和整合 + +1. 创建新的目录结构 +2. 将现有文档按业务模块重新组织 +3. 建立文档间的交叉引用 + +### 第三阶段:优化和完善 + +1. 完善文档内容 +2. 建立文档维护流程 +3. 定期审查和更新 + +## 📋 实施建议 + +### 立即执行 + +1. 创建`业务模块`目录,按业务模块组织文档 +2. 将`code-adjust-record.md`迁移到`变更管理`目录 +3. 完善`API.md`文档的模块化组织 + +### 逐步完善 + +1. 补充`项目总览`相关文档 +2. 建立`知识库`知识库 +3. 完善各阶段文档的模块化组织 + +### 长期维护 + +1. 建立文档更新机制,与代码变更同步 +2. 定期审查文档结构的合理性 +3. 根据项目发展调整文档组织方式 + +这个优化方案既保持了项目全过程管理的清晰性,又便于 Cursor AI 理解具体业务上下文,同时为项目的长期发展提供了良好的文档基础。 diff --git a/docs/业务模块/README.md b/docs/业务模块/README.md new file mode 100644 index 00000000..24175c3d --- /dev/null +++ b/docs/业务模块/README.md @@ -0,0 +1,281 @@ +# 业务模块管理 + +## 📋 业务模块总览 + +本文档管理所有业务模块的文档,为 **Cursor AI 辅助开发** 提供完整的业务上下文和技术实现参考。每个业务模块都包含从需求分析到部署运维的全生命周期文档。 + +## 🎯 文档管理目标 + +### 为 Cursor AI 提供的价值 + +- **🧠 业务理解**:完整的业务逻辑和流程说明,帮助 AI 理解业务需求 +- **🔧 技术实现**:标准的代码结构和实现模式,指导 AI 生成高质量代码 +- **🔗 上下文关联**:模块间的依赖关系和接口定义,确保集成一致性 +- **📚 最佳实践**:经过验证的开发模式和代码规范,提升开发效率 + +### 文档维护原则 + +- **实时同步**:代码变更时立即更新对应文档 +- **结构化**:使用统一的文档模板和格式 +- **可追溯**:记录所有变更历史和决策过程 +- **AI 友好**:使用清晰的结构和标准化的描述方式 + +## 📊 当前业务模块清单 + +### 🔥 核心业务模块 + +#### 1. 后勤满意度调查系统 (hq-satisfaction-survey) + +- **状态**:🟢 已完成开发 +- **负责人**:李四 +- **技术栈**:Spring Boot + Vue3 + MyBatis-Plus +- **核心功能**:问卷设计、数据收集、统计分析、报告生成 +- **API 数量**:18 个接口 +- **文档完整度**:✅ 100% + +#### 2. 报告厅预约管理系统 (hall-reservation) + +- **状态**:🟡 开发中 +- **负责人**:王五 +- **技术栈**:Spring Boot + Vue3 + Warm-Flow +- **核心功能**:场地管理、预约申请、审批流程、冲突检测 +- **API 数量**:15 个接口(规划中) +- **文档完整度**:🟡 80% + +#### 3. 系统管理模块 (system-management) + +- **状态**:🟢 基础框架完成 +- **负责人**:张三 +- **技术栈**:Spring Boot + Vue3 + Sa-Token +- **核心功能**:用户管理、权限控制、组织架构、系统配置 +- **API 数量**:25 个接口 +- **文档完整度**:✅ 95% + +#### 4. 用户管理模块 (user-management) + +- **状态**:🟢 已完成 +- **负责人**:张三 +- **技术栈**:Spring Boot + Vue3 + Sa-Token +- **核心功能**:用户注册、登录认证、个人信息、角色分配 +- **API 数量**:12 个接口 +- **文档完整度**:✅ 100% + +### 🚀 计划中模块 + +#### 5. 后勤维修服务系统 (maintenance-service) + +- **状态**:⭕ 待开发 +- **计划开始**:2024 年 7 月 +- **技术栈**:Spring Boot + Vue3 + Warm-Flow +- **核心功能**:报修申请、工单管理、维修派单、服务评价 + +#### 6. 餐饮服务管理系统 (catering-management) + +- **状态**:⭕ 待开发 +- **计划开始**:2024 年 8 月 +- **技术栈**:Spring Boot + Vue3 + uniapp +- **核心功能**:菜品管理、订餐服务、营养配餐、食堂管理 + +## 📁 业务模块文档结构标准 + +每个业务模块都按照以下标准结构组织文档: + +``` +业务模块/ +├── [模块名称]/ +│ ├── README.md # 模块总览 +│ ├── 需求分析/ +│ │ ├── 业务需求说明.md # 业务需求详细说明 +│ │ ├── 功能需求清单.md # 功能点清单 +│ │ ├── 非功能需求.md # 性能、安全等要求 +│ │ └── 用户故事.md # 用户使用场景 +│ ├── 技术设计/ +│ │ ├── 数据库设计.md # 表结构设计 +│ │ ├── API接口设计.md # 接口定义 +│ │ ├── 架构设计.md # 模块架构 +│ │ └── 技术选型.md # 技术决策 +│ ├── 实现文档/ +│ │ ├── 后端实现说明.md # 后端代码结构 +│ │ ├── 前端实现说明.md # 前端代码结构 +│ │ ├── 关键业务逻辑.md # 核心算法 +│ │ └── 代码规范.md # 编码规范 +│ ├── 测试文档/ +│ │ ├── 测试计划.md # 测试策略 +│ │ ├── 测试用例.md # 具体测试用例 +│ │ └── 测试报告.md # 测试结果 +│ └── 运维文档/ +│ ├── 部署指南.md # 部署步骤 +│ ├── 监控配置.md # 监控指标 +│ └── 故障处理.md # 常见问题 +``` + +## 🔧 Cursor AI 辅助开发指南 + +### 如何使用业务模块文档 + +#### 1. 新功能开发 + +```markdown +📋 开发前准备清单: + +1. 阅读模块的 README.md 了解整体架构 +2. 查看 需求分析/ 目录了解业务逻辑 +3. 参考 技术设计/ 目录了解设计模式 +4. 查看 实现文档/ 目录了解代码结构 +5. 使用 API 接口设计.md 了解接口规范 +``` + +#### 2. 代码生成提示词模板 + +``` +基于 [模块名称] 的业务需求文档和技术设计文档,生成以下功能的代码: + +业务背景:[从需求分析文档中提取] +技术要求:[从技术设计文档中提取] +代码结构:[从实现文档中提取] +接口规范:[从API设计文档中提取] + +请按照项目规范生成: +1. Controller 层代码 +2. Service 层代码 +3. Mapper 层代码 +4. DTO/VO 类 +5. 单元测试代码 +``` + +#### 3. 文档更新提示词模板 + +``` +根据刚才的代码变更,请更新以下业务模块文档: + +变更内容:[具体变更说明] +影响模块:[模块名称] + +需要更新的文档: +1. API接口设计.md - 新增/修改的接口 +2. 数据库设计.md - 表结构变更 +3. 实现文档/ - 代码结构变更 +4. README.md - 模块概览更新 + +请保持文档格式一致,确保信息准确。 +``` + +## 📈 模块开发生命周期管理 + +### 阶段 1:需求分析 📋 + +- **输入**:业务需求、用户反馈 +- **输出**:需求分析文档 +- **AI 角色**:需求梳理、用户故事生成 +- **文档**:业务需求说明.md、功能需求清单.md + +### 阶段 2:技术设计 🎨 + +- **输入**:需求分析结果 +- **输出**:技术设计文档 +- **AI 角色**:架构设计、接口设计 +- **文档**:数据库设计.md、API 接口设计.md、架构设计.md + +### 阶段 3:代码实现 💻 + +- **输入**:技术设计文档 +- **输出**:功能代码、单元测试 +- **AI 角色**:代码生成、测试用例生成 +- **文档**:后端实现说明.md、前端实现说明.md + +### 阶段 4:测试验证 🧪 + +- **输入**:实现代码 +- **输出**:测试报告 +- **AI 角色**:测试用例补充、问题分析 +- **文档**:测试计划.md、测试用例.md、测试报告.md + +### 阶段 5:部署运维 🚀 + +- **输入**:测试通过的代码 +- **输出**:生产环境部署 +- **AI 角色**:部署脚本生成、监控配置 +- **文档**:部署指南.md、监控配置.md + +## 🔄 文档维护工作流 + +### 日常维护流程 + +1. **代码变更** → 2. **识别影响的文档** → 3. **更新相关文档** → 4. **验证文档准确性** → 5. **提交变更** + +### 文档质量检查清单 + +- [ ] 文档结构符合标准模板 +- [ ] 内容与实际代码一致 +- [ ] API 文档包含完整示例 +- [ ] 业务逻辑描述清晰 +- [ ] 技术实现有详细说明 +- [ ] 变更历史有记录 + +### 文档版本管理 + +- **版本号规则**:主版本.次版本.修订版本 (如:1.2.3) +- **变更记录**:每次更新记录变更内容和原因 +- **向后兼容**:重大变更需要保留历史版本说明 + +## 📚 模块间集成指南 + +### 模块依赖关系 + +```mermaid +graph TD + A[用户管理模块] --> B[系统管理模块] + A --> C[满意度调查模块] + A --> D[报告厅预约模块] + B --> C + B --> D + C --> E[数据分析模块] + D --> F[工作流引擎] +``` + +### 公共服务模块 + +- **用户认证服务**:所有模块的用户身份验证 +- **权限控制服务**:统一的权限管理 +- **通知服务**:跨模块的消息通知 +- **文件服务**:文件上传和存储 +- **数据字典服务**:系统配置和枚举值 + +### 接口调用规范 + +- **统一响应格式**:所有模块使用相同的响应结构 +- **错误码标准**:统一的错误码定义和处理 +- **接口版本管理**:API 版本兼容性处理 +- **性能要求**:响应时间和并发量标准 + +## 🚀 下一步行动计划 + +### 近期任务(2 周内) + +- [ ] 完善报告厅预约模块的技术设计文档 +- [ ] 补充满意度调查模块的运维文档 +- [ ] 建立模块间接口测试用例 +- [ ] 优化文档模板,提升 AI 理解度 + +### 中期规划(1 个月内) + +- [ ] 启动维修服务模块的需求分析 +- [ ] 建立自动化文档生成流程 +- [ ] 完善模块间集成测试 +- [ ] 建立文档质量评估体系 + +### 长期愿景(3 个月内) + +- [ ] 实现文档与代码的自动同步 +- [ ] 建立智能化的模块推荐系统 +- [ ] 完成所有计划模块的开发 +- [ ] 建立模块复用和扩展机制 + +--- + +## 📖 相关文档 + +- **项目总览**:[项目总览](../项目总览/README.md) +- **开发指南**:[开发文档](../开发文档/README.md) +- **API 文档**:[开发文档/API.md](../开发文档/API.md) +- **变更管理**:[变更管理](../变更管理/README.md) diff --git a/docs/业务模块/业务模块开发模板.md b/docs/业务模块/业务模块开发模板.md new file mode 100644 index 00000000..7d1b5fc2 --- /dev/null +++ b/docs/业务模块/业务模块开发模板.md @@ -0,0 +1,575 @@ +# 业务模块开发模板 + +> 🎯 **模板用途**:本模板用于创建新业务模块的文档结构,为 Cursor AI 提供标准的开发和文档生成参考 + +## 📋 模块基本信息 + +**模块名称**:[模块英文名称] / [模块中文名称] +**负责人**:[开发负责人] +**开发状态**:🟢 已完成 / 🟡 开发中 / ⭕ 待开始 +**技术栈**:[具体技术栈] +**依赖模块**:[依赖的其他模块] +**开发周期**:[开始时间] - [结束时间] + +## 🎯 模块概述 + +### 业务价值 + +[描述这个模块解决的业务问题和创造的价值] + +### 核心功能 + +- **功能 1**:[功能描述] +- **功能 2**:[功能描述] +- **功能 3**:[功能描述] +- **功能 4**:[功能描述] + +### 技术特点 + +- **特点 1**:[技术特色说明] +- **特点 2**:[性能特点说明] +- **特点 3**:[安全特点说明] + +## 📁 文档结构 + +``` +[模块名称]/ +├── README.md # 本文件 - 模块总览 +├── 需求分析/ +│ ├── 业务需求说明.md # 详细业务需求 +│ ├── 功能需求清单.md # 功能点清单 +│ ├── 非功能需求.md # 性能、安全要求 +│ └── 用户故事.md # 用户使用场景 +├── 技术设计/ +│ ├── 数据库设计.md # 表结构设计 +│ ├── API接口设计.md # 接口定义 +│ ├── 架构设计.md # 模块架构 +│ └── 技术选型.md # 技术决策说明 +├── 实现文档/ +│ ├── 后端实现说明.md # 后端代码结构 +│ ├── 前端实现说明.md # 前端代码结构 +│ ├── 关键业务逻辑.md # 核心算法逻辑 +│ └── 代码规范.md # 编码规范 +├── 测试文档/ +│ ├── 测试计划.md # 测试策略 +│ ├── 测试用例.md # 具体测试用例 +│ └── 测试报告.md # 测试结果 +└── 运维文档/ + ├── 部署指南.md # 部署步骤 + ├── 监控配置.md # 监控指标 + └── 故障处理.md # 常见问题 +``` + +## 🏗️ 系统架构 + +### 模块架构图 + +```mermaid +graph TB + subgraph "前端层" + A1[页面组件
[页面说明]] + A2[业务组件
[组件说明]] + end + + subgraph "接口层" + B1[Controller
[接口说明]] + end + + subgraph "业务层" + C1[Service
[业务逻辑]] + C2[Manager
[业务组装]] + end + + subgraph "数据层" + D1[Mapper
[数据访问]] + D2[Database
[数据库表]] + end + + A1 --> B1 + A2 --> B1 + B1 --> C1 + C1 --> C2 + C2 --> D1 + D1 --> D2 +``` + +### 数据流向 + +```mermaid +sequenceDiagram + participant U as 用户 + participant F as 前端 + participant C as Controller + participant S as Service + participant M as Mapper + participant D as Database + + U->>F: 用户操作 + F->>C: HTTP请求 + C->>S: 业务调用 + S->>M: 数据查询 + M->>D: SQL执行 + D-->>M: 返回结果 + M-->>S: 返回数据 + S-->>C: 返回结果 + C-->>F: JSON响应 + F-->>U: 界面更新 +``` + +## 📊 核心功能模块 + +### 1. [功能模块 1] + +#### 业务描述 + +[详细描述这个功能模块的业务逻辑] + +#### 技术实现 + +- **前端实现**:[前端技术方案] +- **后端实现**:[后端技术方案] +- **数据存储**:[数据库设计] + +#### 关键流程 + +1. [步骤 1] +2. [步骤 2] +3. [步骤 3] + +### 2. [功能模块 2] + +#### 业务描述 + +[详细描述这个功能模块的业务逻辑] + +#### 技术实现 + +- **前端实现**:[前端技术方案] +- **后端实现**:[后端技术方案] +- **数据存储**:[数据库设计] + +#### 关键流程 + +1. [步骤 1] +2. [步骤 2] +3. [步骤 3] + +## 🔌 API 接口概览 + +### 接口分类 + +#### 基础 CRUD 接口 + +| 接口名称 | 请求方式 | 路径 | 功能描述 | +| -------------- | -------- | --------------------------- | ---------------------- | +| 创建[实体] | POST | /api/[module]/[entity] | 创建新的[实体] | +| 查询[实体]列表 | GET | /api/[module]/[entity]/list | 分页查询[实体]列表 | +| 查询[实体]详情 | GET | /api/[module]/[entity]/{id} | 根据 ID 查询[实体]详情 | +| 更新[实体] | PUT | /api/[module]/[entity]/{id} | 更新指定[实体] | +| 删除[实体] | DELETE | /api/[module]/[entity]/{id} | 删除指定[实体] | + +#### 业务逻辑接口 + +| 接口名称 | 请求方式 | 路径 | 功能描述 | +| ------------ | -------- | ------ | ---------- | +| [业务接口 1] | [方式] | [路径] | [功能描述] | +| [业务接口 2] | [方式] | [路径] | [功能描述] | +| [业务接口 3] | [方式] | [路径] | [功能描述] | + +### 接口规范 + +- **请求格式**:JSON +- **响应格式**:统一响应体结构 +- **认证方式**:JWT Token +- **权限控制**:基于角色的权限验证 + +## 🗄️ 数据模型 + +### 核心实体 + +#### [实体 1]表 (table_name) + +| 字段名 | 类型 | 长度 | 非空 | 默认值 | 说明 | +| ----------- | -------- | ------ | ----- | -------- | -------- | +| id | BIGINT | - | Y | - | 主键 ID | +| [字段 1] | [类型] | [长度] | [Y/N] | [默认值] | [说明] | +| [字段 2] | [类型] | [长度] | [Y/N] | [默认值] | [说明] | +| tenant_id | VARCHAR | 20 | Y | - | 租户 ID | +| create_by | BIGINT | - | Y | - | 创建人 | +| create_time | DATETIME | - | Y | - | 创建时间 | +| update_by | BIGINT | - | Y | - | 更新人 | +| update_time | DATETIME | - | Y | - | 更新时间 | +| deleted | TINYINT | - | Y | 0 | 删除标记 | + +#### [实体 2]表 (table_name) + +| 字段名 | 类型 | 长度 | 非空 | 默认值 | 说明 | +| ----------- | -------- | ------ | ----- | -------- | -------- | +| id | BIGINT | - | Y | - | 主键 ID | +| [字段 1] | [类型] | [长度] | [Y/N] | [默认值] | [说明] | +| [字段 2] | [类型] | [长度] | [Y/N] | [默认值] | [说明] | +| tenant_id | VARCHAR | 20 | Y | - | 租户 ID | +| create_by | BIGINT | - | Y | - | 创建人 | +| create_time | DATETIME | - | Y | - | 创建时间 | +| update_by | BIGINT | - | Y | - | 更新人 | +| update_time | DATETIME | - | Y | - | 更新时间 | +| deleted | TINYINT | - | Y | 0 | 删除标记 | + +### 实体关系图 + +```mermaid +erDiagram + ENTITY1 ||--o{ ENTITY2 : "一对多关系" + ENTITY2 }o--|| ENTITY3 : "多对一关系" + ENTITY1 }o--o{ ENTITY3 : "多对多关系" + + ENTITY1 { + bigint id PK + varchar name + datetime create_time + } + + ENTITY2 { + bigint id PK + bigint entity1_id FK + varchar description + datetime create_time + } + + ENTITY3 { + bigint id PK + varchar code + varchar name + datetime create_time + } +``` + +## 🔄 业务流程 + +### 主要业务流程 + +#### [流程 1 名称] + +```mermaid +flowchart TD + A[开始] --> B{条件判断} + B -->|满足条件| C[执行操作1] + B -->|不满足条件| D[执行操作2] + C --> E[更新状态] + D --> F[记录日志] + E --> G[发送通知] + F --> G + G --> H[结束] +``` + +**流程说明**: + +1. [步骤 1 说明] +2. [步骤 2 说明] +3. [步骤 3 说明] + +#### [流程 2 名称] + +```mermaid +flowchart TD + A[开始] --> B[数据验证] + B --> C{验证通过?} + C -->|是| D[业务处理] + C -->|否| E[返回错误] + D --> F[数据存储] + F --> G[返回结果] + E --> H[结束] + G --> H +``` + +**流程说明**: + +1. [步骤 1 说明] +2. [步骤 2 说明] +3. [步骤 3 说明] + +## 🎨 前端设计 + +### 页面结构 + +#### [页面 1 名称] + +- **功能**:[页面功能说明] +- **组件**:[使用的组件列表] +- **交互**:[用户交互方式] +- **数据**:[页面数据来源] + +#### [页面 2 名称] + +- **功能**:[页面功能说明] +- **组件**:[使用的组件列表] +- **交互**:[用户交互方式] +- **数据**:[页面数据来源] + +### 组件设计 + +#### [组件 1 名称] + +```typescript +// 组件属性接口 +interface [Component1]Props { + [prop1]: [type]; + [prop2]: [type]; + [prop3]: [type]; +} + +// 组件事件接口 +interface [Component1]Emits { + [event1]: [params]; + [event2]: [params]; +} +``` + +#### [组件 2 名称] + +```typescript +// 组件属性接口 +interface [Component2]Props { + [prop1]: [type]; + [prop2]: [type]; + [prop3]: [type]; +} + +// 组件事件接口 +interface [Component2]Emits { + [event1]: [params]; + [event2]: [params]; +} +``` + +## 📝 开发规范 + +### 代码结构 + +#### 后端代码结构 + +``` +src/main/java/org/dromara/modules/[module]/ +├── controller/ # 控制器层 +│ ├── [Entity]Controller.java +│ └── [Module]Controller.java +├── domain/ # 领域对象层 +│ ├── bo/ # 业务对象 +│ │ ├── [Entity]Bo.java +│ │ └── [Entity]QueryBo.java +│ └── vo/ # 视图对象 +│ ├── [Entity]Vo.java +│ └── [Entity]DetailVo.java +├── mapper/ # 数据访问层 +│ ├── [Entity]Mapper.java +│ └── [Entity]Mapper.xml +├── service/ # 业务服务层 +│ ├── I[Entity]Service.java +│ └── impl/ +│ └── [Entity]ServiceImpl.java +└── utils/ # 工具类 + └── [Module]Utils.java +``` + +#### 前端代码结构 + +``` +src/views/[module]/ +├── index.vue # 主页面 +├── components/ # 页面组件 +│ ├── [Component1].vue +│ └── [Component2].vue +├── types/ # 类型定义 +│ └── index.ts +└── api/ # API接口 + └── index.ts +``` + +### 命名规范 + +#### 后端命名规范 + +- **类名**:PascalCase (如: UserController, UserService) +- **方法名**:camelCase (如: getUserList, createUser) +- **常量**:UPPER_SNAKE_CASE (如: MAX_RETRY_COUNT) +- **包名**:全小写 (如: com.example.module) + +#### 前端命名规范 + +- **组件名**:PascalCase (如: UserList, UserForm) +- **方法名**:camelCase (如: handleSubmit, getUserInfo) +- **变量名**:camelCase (如: userList, isLoading) +- **常量**:UPPER_SNAKE_CASE (如: API_BASE_URL) + +#### 数据库命名规范 + +- **表名**:下划线命名 (如: sys_user, sys_role) +- **字段名**:下划线命名 (如: user_name, create_time) +- **索引名**:idx*表名*字段名 (如: idx_user_username) + +## 🧪 测试策略 + +### 测试分类 + +#### 单元测试 + +- **覆盖范围**:Service 层业务逻辑 +- **测试框架**:JUnit 5 + Mockito +- **覆盖率要求**:> 80% + +#### 集成测试 + +- **覆盖范围**:Controller 层 API 接口 +- **测试框架**:Spring Boot Test +- **测试数据**:测试数据库 + +#### 前端测试 + +- **覆盖范围**:组件功能测试 +- **测试框架**:Vue Test Utils + Jest +- **测试类型**:组件渲染、用户交互、数据绑定 + +### 测试用例设计 + +#### 功能测试用例 + +- **正常流程测试**:验证正常业务流程 +- **边界值测试**:验证边界条件处理 +- **异常流程测试**:验证错误处理逻辑 + +#### 性能测试用例 + +- **响应时间测试**:验证接口响应时间 +- **并发测试**:验证并发处理能力 +- **压力测试**:验证系统承载能力 + +## 🚀 部署运维 + +### 部署环境 + +#### 开发环境 + +- **部署方式**:本地 Docker 容器 +- **数据库**:MySQL 8.0 +- **缓存**:Redis 7.0 +- **配置**:application-dev.yml + +#### 测试环境 + +- **部署方式**:Docker Compose +- **数据库**:MySQL 8.0(测试库) +- **缓存**:Redis 7.0 +- **配置**:application-test.yml + +#### 生产环境 + +- **部署方式**:Kubernetes +- **数据库**:MySQL 8.0(集群) +- **缓存**:Redis 7.0(集群) +- **配置**:application-prod.yml + +### 监控指标 + +#### 业务指标 + +- **功能使用率**:各功能模块的使用频率 +- **用户活跃度**:日活、月活用户数 +- **业务成功率**:业务操作成功率 + +#### 技术指标 + +- **接口响应时间**:平均响应时间 < 200ms +- **系统可用性**:99.9%可用性 +- **错误率**:错误率 < 0.1% + +## 📅 开发计划 + +### 开发阶段 + +#### 第一阶段:基础框架([时间范围]) + +- [ ] 数据库表结构设计 +- [ ] 基础 CRUD 接口开发 +- [ ] 基础页面和组件开发 +- [ ] 单元测试编写 + +#### 第二阶段:核心功能([时间范围]) + +- [ ] [核心功能 1]开发 +- [ ] [核心功能 2]开发 +- [ ] [核心功能 3]开发 +- [ ] 集成测试 + +#### 第三阶段:完善优化([时间范围]) + +- [ ] 功能完善和优化 +- [ ] 性能测试和优化 +- [ ] 用户体验优化 +- [ ] 文档完善 + +### 里程碑 + +- **里程碑 1**:基础框架完成 ([日期]) +- **里程碑 2**:核心功能完成 ([日期]) +- **里程碑 3**:测试完成,准备发布 ([日期]) +- **里程碑 4**:正式发布上线 ([日期]) + +## 🔧 开发工具 + +### 后端开发工具 + +- **IDE**:IntelliJ IDEA +- **构建工具**:Maven +- **代码质量**:SonarQube +- **API 测试**:Postman + +### 前端开发工具 + +- **IDE**:VSCode +- **构建工具**:Vite +- **代码规范**:ESLint + Prettier +- **组件预览**:Storybook + +### 数据库工具 + +- **管理工具**:Navicat Premium +- **版本控制**:Flyway +- **性能监控**:MySQL Performance Schema + +## 📖 相关文档 + +- **项目总览**:[项目总览](../项目总览/README.md) +- **开发规范**:[开发文档](../开发文档/README.md) +- **API 接口**:[开发文档/API.md](../开发文档/API.md) +- **数据库设计**:[设计文档/database](../设计文档/database/) +- **变更记录**:[变更管理](../变更管理/README.md) + +--- + +## 📝 模板使用说明 + +### 适用场景 + +- 新业务模块开发启动时 +- 现有模块重构时 +- 为 AI 辅助开发提供上下文 + +### 填写指南 + +1. **基本信息**:确保模块基本信息准确完整 +2. **架构设计**:使用 Mermaid 图表清晰展示架构 +3. **API 设计**:提供完整的接口定义和示例 +4. **数据模型**:详细设计数据库表结构 +5. **业务流程**:用流程图展示关键业务逻辑 + +### 文档维护 + +- **实时更新**:代码变更时同步更新文档 +- **版本控制**:重要变更记录版本历史 +- **质量检查**:定期检查文档完整性和准确性 + +### AI 辅助开发 + +- **上下文提供**:为 Cursor AI 提供完整的业务和技术上下文 +- **代码生成**:基于文档规范生成标准化代码 +- **文档生成**:自动生成和更新相关文档 diff --git a/docs/middleware/README.md b/docs/中间件配置/README.md similarity index 100% rename from docs/middleware/README.md rename to docs/中间件配置/README.md diff --git a/docs/middleware/mysql-config.md b/docs/中间件配置/mysql-config.md similarity index 100% rename from docs/middleware/mysql-config.md rename to docs/中间件配置/mysql-config.md diff --git a/docs/变更管理/README.md b/docs/变更管理/README.md new file mode 100644 index 00000000..478c207b --- /dev/null +++ b/docs/变更管理/README.md @@ -0,0 +1,452 @@ +# 变更管理中心 + +## 📋 变更管理概述 + +变更管理中心负责记录、跟踪和管理项目开发过程中的所有变更,确保 **Cursor AI 辅助开发** 的每次代码调整都有完整的记录和追溯能力。 + +## 🎯 管理目标 + +### 核心价值 + +- **🔍 完整追溯**:记录每次代码变更的原因、内容和影响 +- **📊 数据驱动**:通过变更数据分析项目进度和质量 +- **🤖 AI 辅助**:为 Cursor AI 提供历史变更上下文,提升开发效率 +- **👥 团队协作**:确保团队成员了解项目变更历史 + +### 管理原则 + +- **强制记录**:所有代码变更都必须记录 +- **及时更新**:变更发生后立即记录 +- **标准格式**:使用统一的记录格式 +- **分类管理**:按变更类型和影响范围分类 + +## 📊 变更分类体系 + +### 按变更类型分类 + +#### 🆕 新功能开发 (Feature) + +- **描述**:新增业务功能或模块 +- **影响范围**:通常涉及多个文件和模块 +- **文档要求**:需要更新 API 文档、用户手册 +- **示例**:新增用户管理模块、新增报告厅预约功能 + +#### 🐛 Bug 修复 (Bugfix) + +- **描述**:修复已知的功能缺陷或错误 +- **影响范围**:通常限定在特定功能 +- **文档要求**:更新已有文档,记录修复内容 +- **示例**:修复登录验证 bug、修复数据查询错误 + +#### 🔧 重构优化 (Refactor) + +- **描述**:改进代码结构,不改变外部行为 +- **影响范围**:内部代码结构调整 +- **文档要求**:更新技术文档和代码注释 +- **示例**:优化数据库查询、重构 service 层逻辑 + +#### 📚 文档更新 (Documentation) + +- **描述**:更新项目文档、API 文档、用户手册 +- **影响范围**:文档文件 +- **文档要求**:记录文档变更内容 +- **示例**:更新 API 接口文档、完善开发指南 + +#### ⚙️ 配置调整 (Configuration) + +- **描述**:修改系统配置、环境配置 +- **影响范围**:配置文件 +- **文档要求**:更新部署和配置文档 +- **示例**:调整数据库连接配置、修改缓存策略 + +### 按影响范围分类 + +#### 🔴 重大变更 (Major) + +- **定义**:影响系统架构或核心功能的变更 +- **批准要求**:需要架构师或项目经理审核 +- **测试要求**:需要完整的回归测试 +- **通知范围**:全体团队成员 + +#### 🟡 中等变更 (Minor) + +- **定义**:影响单个模块或功能的变更 +- **批准要求**:模块负责人审核 +- **测试要求**:模块相关功能测试 +- **通知范围**:相关开发人员 + +#### 🟢 小变更 (Patch) + +- **定义**:局部代码调整或小 bug 修复 +- **批准要求**:开发人员自审 +- **测试要求**:基本功能验证 +- **通知范围**:直接相关人员 + +## 📝 变更记录标准格式 + +### 标准记录模板 + +```markdown +## 调整记录 - YYYY-MM-DD HH:mm:ss + +**变更 ID**: CHG-YYYYMMDD-001 +**变更时间**: YYYY-MM-DD HH:mm:ss +**变更人员**: [开发者姓名/Cursor AI 辅助] +**变更类型**: 🆕 新功能/🐛Bug 修复/🔧 重构优化/📚 文档更新/⚙️ 配置调整 +**影响级别**: 🔴 重大变更/🟡 中等变更/🟢 小变更 + +### 📋 变更概述 + +**变更目的**: [简述变更原因和目标,1-2 句话] +**影响范围**: [列出受影响的模块、功能或文件] + +### 📁 涉及文件 + +**后端文件**: + +- backend/[具体文件路径 1] +- backend/[具体文件路径 2] + +**前端文件**: + +- web/[具体文件路径 1] +- web/[具体文件路径 2] + +**配置文件**: + +- [配置文件路径] + +**文档文件**: + +- docs/[文档文件路径] + +### 🔧 变更内容详述 + +**业务逻辑变更**: + +1. [具体业务逻辑的变更说明] +2. [新增或修改的业务规则] + +**技术实现变更**: + +1. [技术方案的调整说明] +2. [代码结构的优化内容] + +**接口变更**: + +- **新增接口**: [新增接口列表] +- **修改接口**: [修改的接口及变更内容] +- **废弃接口**: [废弃的接口及替代方案] + +**数据库变更**: + +- **新增表**: [新增表及字段说明] +- **修改表**: [表结构变更内容] +- **数据迁移**: [数据迁移脚本或说明] + +### 🎯 技术决策 + +**技术选型**: [使用的技术栈和原因] +**设计模式**: [采用的设计模式和考虑] +**性能优化**: [性能优化措施] +**安全考虑**: [安全性相关的处理] + +### 📖 文档同步更新 + +**API 文档**: + +- [ ] 已更新 docs/开发文档/API.md +- [ ] 已更新模块 API 接口设计文档 + +**业务文档**: + +- [ ] 已更新业务需求文档 +- [ ] 已更新用户操作手册 + +**技术文档**: + +- [ ] 已更新数据库设计文档 +- [ ] 已更新架构设计文档 + +### 🧪 测试验证 + +**功能测试**: + +- [ ] 单元测试通过 +- [ ] 集成测试通过 +- [ ] 功能验收测试通过 + +**质量检查**: + +- [ ] 代码规范检查通过 +- [ ] 代码 review 通过 +- [ ] 安全扫描通过 + +**性能验证**: + +- [ ] 响应时间满足要求 +- [ ] 并发性能测试通过 +- [ ] 内存使用正常 + +### 🚀 部署说明 + +**部署环境**: [开发/测试/生产环境] +**部署步骤**: + +1. [部署步骤 1] +2. [部署步骤 2] +3. [部署步骤 3] + +**回滚方案**: [如有问题的回滚方案] +**监控要点**: [需要重点监控的指标] + +### 📝 备注 + +**已知问题**: [如有已知问题需要说明] +**后续计划**: [后续的改进或扩展计划] +**相关链接**: [相关的 Issue、PR 或文档链接] + +--- +``` + +## 🔄 变更管理流程 + +### 变更申请流程 + +```mermaid +flowchart TD + A[需求提出] --> B[变更评估] + B --> C{影响级别} + C -->|重大变更| D[架构师审核] + C -->|中等变更| E[模块负责人审核] + C -->|小变更| F[开发人员自审] + + D --> G[制定变更计划] + E --> G + F --> G + + G --> H[代码开发] + H --> I[代码审查] + I --> J[测试验证] + J --> K[文档更新] + K --> L[部署发布] + L --> M[变更记录] + M --> N[跟踪反馈] +``` + +### Cursor AI 辅助开发流程 + +```mermaid +flowchart TD + A[AI代码生成] --> B[代码审查] + B --> C[功能测试] + C --> D{测试通过?} + D -->|是| E[立即记录变更] + D -->|否| F[修复问题] + F --> C + + E --> G[更新相关文档] + G --> H[提交代码变更] + H --> I[通知团队成员] + + style E fill:#ff6b6b + style G fill:#ff6b6b +``` + +### 紧急变更流程 + +```mermaid +flowchart TD + A[紧急问题发现] --> B[快速评估] + B --> C[紧急修复] + C --> D[最小化测试] + D --> E[紧急部署] + E --> F[事后补充记录] + F --> G[完整测试验证] + G --> H[文档完善] +``` + +## 📊 变更统计分析 + +### 变更统计指标 + +#### 数量统计 + +- **总变更数量**:记录期间的总变更次数 +- **类型分布**:各类型变更的数量分布 +- **影响级别分布**:不同影响级别的变更比例 +- **模块分布**:各模块的变更频率 + +#### 质量指标 + +- **Bug 修复率**:Bug 修复变更占总变更的比例 +- **回滚率**:需要回滚的变更比例 +- **测试通过率**:一次测试通过的变更比例 +- **文档同步率**:变更后文档同步更新的比例 + +#### 效率指标 + +- **平均处理时间**:从变更申请到完成的平均时间 +- **审核效率**:变更审核的平均时间 +- **AI 辅助比例**:Cursor AI 参与的变更比例 +- **自动化程度**:自动化处理的变更比例 + +### 月度变更报告模板 + +```markdown +# YYYY 年 MM 月变更管理报告 + +## 📊 变更概览 + +- **总变更数**: XXX 次 +- **新功能**: XX 次 (XX%) +- **Bug 修复**: XX 次 (XX%) +- **重构优化**: XX 次 (XX%) +- **文档更新**: XX 次 (XX%) +- **配置调整**: XX 次 (XX%) + +## 🎯 关键指标 + +- **平均处理时间**: X.X 小时 +- **测试通过率**: XX% +- **文档同步率**: XX% +- **AI 辅助比例**: XX% + +## 📈 趋势分析 + +[变更趋势的分析和总结] + +## 🔍 问题发现 + +[发现的问题和改进建议] + +## 📋 下月计划 + +[下月的变更管理改进计划] +``` + +## 🔧 变更管理工具 + +### Cursor AI 集成工具 + +#### 1. 变更记录助手 + +```bash +# Cursor AI 提示词模板 +请根据刚才的代码变更,生成标准的变更记录: + +变更类型:[新功能/Bug修复/重构优化/文档更新/配置调整] +变更文件:[具体文件列表] +变更内容:[具体变更说明] + +请按照项目的变更记录模板格式生成完整记录。 +``` + +#### 2. 文档同步检查 + +```bash +# 文档同步检查提示 +检查以下变更是否需要更新相关文档: + +1. API接口变更 → 更新API.md +2. 数据库变更 → 更新数据库设计文档 +3. 业务逻辑变更 → 更新业务需求文档 +4. 配置变更 → 更新部署文档 + +请确认需要更新的文档列表。 +``` + +### 自动化工具 + +#### Git Hook 集成 + +```bash +#!/bin/bash +# pre-commit hook - 提交前检查 +echo "检查变更记录..." +if [[ -z $(git diff --cached --name-only | grep "docs/变更管理/code-adjust-record.md") ]]; then + echo "⚠️ 警告:代码变更未更新变更记录!" + echo "请在 docs/变更管理/code-adjust-record.md 中记录本次变更" + exit 1 +fi +``` + +#### 变更通知脚本 + +```bash +#!/bin/bash +# 变更通知脚本 +send_change_notification() { + local change_type=$1 + local change_files=$2 + local change_author=$3 + + echo "🔔 变更通知" + echo "类型:$change_type" + echo "文件:$change_files" + echo "作者:$change_author" + # 发送到团队通知渠道 +} +``` + +## 📋 质量控制检查清单 + +### 变更前检查 + +- [ ] 变更需求明确,目标清晰 +- [ ] 影响范围评估完成 +- [ ] 技术方案确定 +- [ ] 测试计划制定 +- [ ] 回滚方案准备 + +### 变更中检查 + +- [ ] 代码规范符合标准 +- [ ] 单元测试编写完成 +- [ ] 代码审查通过 +- [ ] 集成测试通过 +- [ ] 文档同步更新 + +### 变更后检查 + +- [ ] 功能验收通过 +- [ ] 性能指标满足要求 +- [ ] 无明显副作用 +- [ ] 变更记录完整 +- [ ] 团队成员已通知 + +## 🚀 持续改进计划 + +### 短期目标(1 个月内) + +- [ ] 完善变更记录模板 +- [ ] 建立自动化检查机制 +- [ ] 优化 Cursor AI 集成流程 +- [ ] 提升团队变更管理意识 + +### 中期目标(3 个月内) + +- [ ] 建立变更影响分析工具 +- [ ] 实现变更数据可视化 +- [ ] 建立变更质量评估体系 +- [ ] 优化变更审核流程 + +### 长期目标(6 个月内) + +- [ ] 实现智能变更建议 +- [ ] 建立变更风险预警机制 +- [ ] 完善变更知识库 +- [ ] 实现变更管理全自动化 + +--- + +## 📖 相关文档 + +- **代码调整记录**:[code-adjust-record.md](./code-adjust-record.md) +- **项目总览**:[项目总览](../项目总览/README.md) +- **开发文档**:[开发文档](../开发文档/README.md) +- **测试文档**:[测试文档](../测试文档/README.md) + +--- + +**🎯 目标**:通过标准化的变更管理,确保项目开发过程可控、可追溯,为 Cursor AI 提供完整的变更上下文,提升开发效率和质量。 diff --git a/docs/code-adjust-record.md b/docs/变更管理/code-adjust-record.md similarity index 87% rename from docs/code-adjust-record.md rename to docs/变更管理/code-adjust-record.md index 54fd6a2f..5d93a03e 100644 --- a/docs/code-adjust-record.md +++ b/docs/变更管理/code-adjust-record.md @@ -100,6 +100,576 @@ 新记录请添加在此行下方,保持时间倒序排列(最新的在前) --> +## 调整记录 - 2025-01-08 16:45:00 + +**变更 ID**: CHG-20250108-004 +**变更时间**: 2025-01-08 16:45:00 +**变更人员**: Cursor AI 辅助 +**变更类型**: ⚙️ 配置调整/📚 文档更新 +**影响级别**: 🟡 中等变更 + +### 📋 变更概述 + +**变更目的**: 根据实际项目状态调整.cursorrules 文件中的文档结构管理章节,并新增 docs 文档变更时的强制同步更新规则 +**影响范围**: 优化项目开发规范,确保文档与规范的一致性 + +### 📁 涉及文件 + +**配置文件**: + +- .cursorrules (重大更新) + +### 🔧 变更内容详述 + +**文档结构管理更新**: + +1. **文档目录组织同步**:根据实际 docs 目录结构更新.cursorrules 中的文档组织图 +2. **新增文件说明**:补充 SQL 模块文件、数据库建设规范、文档结构优化方案等新增文件 +3. **技术要求更新**: + - Node.js 版本:16.x → 20.15.x+ + - npm 版本:8.x → 10.7.x+ + - 前端访问地址:localhost:3000 → localhost + - 数据库环境:支持本地安装或阿里云测试环境 + +**新增强制同步更新规则**: + +1. **docs 文档变更时的强制同步规则**: + + - 文档结构变更必须同步更新.cursorrules + - 重要文档变更需要同步调整规范要求 + - 技术环境变更要求更新技术栈规范 + - 业务模块变更需要同步模块管理规范 + +2. **工作流程优化**: + + - 在文档更新流程中增加.cursorrules 检查步骤 + - 添加规范文件一致性验证 + - 强化变更记录的规范文件更新检查 + +3. **检查清单完善**: + - 增加.cursorrules 文件同步检查项 + - 添加文档结构一致性验证 + - 建立规范文件更新的强制检查机制 + +**规范要求强化**: + +- 明确 docs 文档变更必须立即同步更新.cursorrules 文件 +- 建立文档结构与规范文件的一致性保障机制 +- 强化项目规范的实时性和准确性 + +### 📖 文档同步更新记录 + +**规范文件**: + +- [x] ✅ 已更新.cursorrules 文档结构管理章节 +- [x] ✅ 已新增 docs 变更强制同步规则 +- [x] ✅ 已更新前端技术栈要求 +- [x] ✅ 已优化文档更新工作流程 + +**变更管理**: + +- [x] ✅ 已在变更记录中添加本次更新 +- [x] ✅ 已确认规范文件与实际项目状态一致 + +### 🧪 测试验证 + +**规范验证**: + +- [x] .cursorrules 中的文档目录结构与实际 docs 目录完全一致 +- [x] 技术要求与项目实际配置保持同步 +- [x] 新增的强制同步规则清晰明确 +- [x] 工作流程更新合理可操作 + +**文档验证**: + +- [x] 变更记录格式符合标准模板 +- [x] 所有路径引用准确无误 +- [x] 规范要求具体可执行 + +### 📝 备注 + +**重要改进**: + +1. **建立了 docs 文档与.cursorrules 文件的强制同步机制**,确保项目规范始终与实际状态保持一致 +2. **优化了文档更新工作流程**,将规范文件检查纳入强制步骤 +3. **更新了技术要求**,与最新的项目配置保持同步 +4. **强化了规范执行的可操作性**,提供了具体的检查清单 + +**后续效果**: + +- 提高项目规范的实时性和准确性 +- 减少文档与规范不一致的情况 +- 提升团队协作效率和开发体验 +- 为 AI 辅助开发提供更准确的规范指导 + +**相关链接**: .cursorrules + +--- + +## 调整记录 - 2025-01-08 16:20:00 + +**变更 ID**: CHG-20250108-003 +**变更时间**: 2025-01-08 16:20:00 +**变更人员**: Cursor AI 辅助 +**变更类型**: 📚 文档新增 +**影响级别**: 🟢 小变更 + +### 📋 变更概述 + +**变更目的**: 创建工程本地启动指导文档,为开发人员提供完整的环境配置和项目启动指南 +**影响范围**: 新增项目根目录启动指导文档,提升开发体验 + +### 📁 涉及文件 + +**新增文档**: + +- 工程本地启动指导.md(项目根目录) + +### 🔧 变更内容详述 + +**文档内容**: + +1. **环境要求说明**:JDK 17、Maven 3.8.8、Node.js、MySQL、Redis 等必需环境 +2. **详细安装指导**: + - macOS 环境完整安装步骤(使用 Homebrew) + - Windows 环境详细安装指导 + - 环境变量配置方法 +3. **数据库配置**:MySQL 和 Redis 的配置启动方法 +4. **后端启动流程**:按顺序启动 start-monitor.sh → start-job.sh → start-main.sh +5. **前端启动说明**:首次需 npm install,后续 npm run dev +6. **常见问题解答**:Java、Node.js、数据库、服务启动相关问题 +7. **快速启动检查清单**:便于开发者快速核对环境 + +**文档特色**: + +- 结构清晰,包含完整目录导航 +- 支持 macOS 和 Windows 双平台 +- 提供详细的命令行操作示例 +- 包含问题排查和解决方案 +- 设置了启动检查清单 + +### 📖 文档同步更新记录 + +**项目文档**: + +- [x] ✅ 已创建工程本地启动指导.md +- [x] ✅ 已配置 VS Code settings.json 支持 markdown 预览 + +**技术文档**: + +- [x] ✅ 已包含环境配置要求 +- [x] ✅ 已说明服务启动顺序 +- [x] ✅ 已提供常见问题解决方案 + +### 🧪 测试验证 + +**文档验证**: + +- [x] 文档结构清晰完整 +- [x] 安装指导步骤准确 +- [x] 启动流程符合实际需求 +- [x] Markdown 格式正确,预览效果良好 + +### 📝 备注 + +**后续改进**: + +1. 可根据实际使用反馈优化安装步骤 +2. 可添加更多常见问题的解决方案 +3. 可结合实际部署情况调整服务端口配置 + +**相关链接**: 工程本地启动指导.md + +--- + +## 调整记录 - 2025-01-08 15:45:00 + +**变更 ID**: CHG-20250108-002 +**变更时间**: 2025-01-08 15:45:00 +**变更人员**: Cursor AI 辅助 +**变更类型**: 📚 文档更新/⚙️ 配置调整 +**影响级别**: 🟡 中等变更 + +### 📋 变更概述 + +**变更目的**: 根据业务域方式拆分 hzdyjs_xg.sql 数据库文件,将单一大文件拆分为 6 个模块化 SQL 文件,便于数据库管理和维护 +**影响范围**: 数据库文档结构优化,不影响现有数据库功能 + +### 📁 涉及文件 + +**新增 SQL 文件**: + +- docs/设计文档/database/01-workflow-module.sql +- docs/设计文档/database/02-code-generator-module.sql +- docs/设计文档/database/03-logistics-module.sql +- docs/设计文档/database/04-job-scheduler-module.sql +- docs/设计文档/database/05-system-management-module.sql +- docs/设计文档/database/06-test-module.sql + +**新增说明文档**: + +- docs/设计文档/database/SQL 文件说明.md + +**保留文件**: + +- docs/设计文档/database/hzdyjs_xg.sql(完整数据库文件,保持不变) + +### 🔧 变更内容详述 + +**业务逻辑变更**: + +1. 按业务域将数据库表进行逻辑分组 +2. 每个模块包含相关的表结构和初始数据 +3. 保持与原始数据库文件的完全一致性 + +**技术实现变更**: + +1. **工作流模块**:包含 8 张 flow\_\*表,支持业务流程管理 +2. **代码生成模块**:包含 2 张 gen\_\*表,支持代码自动生成 +3. **后勤管理模块**:包含 10 张 hq\_\*表,支持校园后勤服务 +4. **任务调度模块**:包含 12 张 sj\_\*表,支持分布式任务调度 +5. **系统管理模块**:包含 21 张 sys\_\*表,提供系统核心功能 +6. **测试模块**:包含 1 张 test\_\*表,用于功能测试 + +**数据库变更**: + +- 无数据库结构变更 +- 保持所有表结构、索引、约束的一致性 +- 遵循不使用外键约束的设计规范 + +### 📖 文档同步更新记录 + +**数据库文档**: + +- [x] ✅ 已创建 6 个模块化 SQL 文件 +- [x] ✅ 已创建 SQL 文件说明文档 + +**业务文档**: + +- [x] ✅ 已更新数据库设计说明文档结构 +- [x] ✅ 已说明模块间依赖关系 + +**技术文档**: + +- [x] ✅ 已保持数据库设计规范一致性 +- [x] ✅ 已维护索引设计标准 + +### 🧪 测试验证 + +**功能测试**: + +- [x] 验证拆分后文件的 SQL 语法正确性 +- [x] 确认表结构与原文件完全一致 +- [x] 检查所有索引和约束的正确性 + +**文档验证**: + +- [x] 文档内容与数据库实现一致 +- [x] 模块说明准确完整 +- [x] 使用指南可正常执行 + +### 📝 备注 + +**优势说明**: + +1. 提高数据库维护效率,支持按模块部署 +2. 便于不同环境的差异化配置 +3. 降低数据库变更的复杂度 +4. 支持模块化的备份和恢复策略 + +**使用建议**: + +1. 开发环境可按需部署特定模块 +2. 生产环境建议使用完整 SQL 文件 +3. 任何表结构变更需同步更新对应模块文件 + +**相关链接**: docs/设计文档/database/SQL 文件说明.md + +--- + +## 调整记录 - 2025-01-08 14:30:00 + +**调整时间**: 2025-01-08 14:30:00 +**调整人**: Cursor AI 辅助 +**调整目的**: 完善数据库建设规范,明确禁止使用数据库外键约束的规范要求,确保项目数据库设计的一致性和性能优化 +**涉及文件**: + +- docs/设计文档/database/mysql-database-standard.md +- .cursorrules + +**调整内容详述**: + +1. **核心规范新增** + + - 在强制性要求中增加第 6 条:禁止使用数据库外键约束 + - 明确所有表关联关系通过应用层维护 + - 统一项目数据库设计理念 + +2. **专门章节建立** + + - 新增"外键约束规范"专门章节 + - 详细说明禁用外键约束的 3 大原因:性能考虑、灵活性要求、维护便利性 + - 提供完整的替代方案:应用层数据一致性、命名约定标识、数据校验注解 + +3. **关联字段设计规范化** + + - 明确关联字段命名规范(必须以\_id 结尾) + - 规范关联字段注释格式(必须标明关联的表和字段) + - 制定关联字段索引设计标准 + +4. **建表模板更新** + + - 更新标准业务表模板,移除外键约束相关内容 + - 在模板中明确标注"不使用外键约束" + - 增加关联字段示例和索引设计示例 + - 更新关联关系表模板,强调不创建外键约束 + +5. **数据一致性保障机制** + + - 提供业务层校验方案 + - 建立定期数据校验脚本 + - 制定监控和报警机制 + +6. **检查清单完善** + - 在新建表检查清单中增加"未使用外键约束"检查项 + - 增加关联字段命名规范检查 + - 增加关联字段注释明确性检查 + +**技术细节**: + +- 规范文档格式: Markdown +- 遵循的设计原则: 性能优先、灵活扩展、应用层维护 +- 替代技术方案: + - 应用层事务管理 (@Transactional) + - 数据校验注解 (@ExistReference) + - 命名约定标识关联关系 + - 定期数据一致性检查脚本 + +**性能优化效果**: + +- **提升性能**: 消除外键约束对数据操作的性能影响 +- **支持扩展**: 便于数据库分库分表和横向扩展 +- **简化维护**: 减少数据库结构变更的复杂度 +- **提高灵活性**: 支持业务逻辑的灵活调整 + +**应用层数据一致性示例**: + +```java +// 删除操作前检查关联数据 +@Transactional +public void deleteUser(Long userId) { + if (hasRelatedData(userId)) { + throw new BusinessException("用户存在关联数据,无法删除"); + } + userService.deleteById(userId); +} +``` + +**关联字段规范示例**: + +```sql +-- 正确的关联字段设计 +`user_id` bigint(20) NOT NULL COMMENT '用户ID,关联sys_user.id', +`dept_id` bigint(20) DEFAULT NULL COMMENT '部门ID,关联sys_dept.id', + +-- 对应的索引设计(不使用外键约束) +KEY `idx_user_id` (`user_id`), +KEY `idx_dept_id` (`dept_id`) +``` + +**测试验证**: + +- [x] 数据库规范文档更新完成 +- [x] .cursorrules 中的规范同步更新 +- [x] 建表模板移除外键约束内容 +- [x] 检查清单增加相关检查项 +- [x] 替代方案详细说明完整 +- [x] 文档结构清晰,易于理解和执行 + +**备注**: +此次规范完善是基于项目实际需求和性能考虑做出的重要决策。通过禁用数据库外键约束,项目能够: + +1. 获得更好的数据库性能表现 +2. 支持未来的分库分表扩展需求 +3. 简化数据库结构变更和维护工作 +4. 通过应用层逻辑确保数据一致性 + +这一规范将作为后续所有数据库设计的强制性要求,确保项目数据库架构的一致性和可扩展性。 + +--- + +## 调整记录 - 2025-01-27 00:05:00 + +**调整时间**: 2025-01-27 00:05:00 +**调整人**: Cursor AI 辅助 +**调整目的**: 将 docs 文档中的文件夹名称改为中文,提高用户理解和查看的便利性 + +**涉及文件**: + +- docs/ 目录下所有英文文件夹名 +- docs/README.md +- docs/structure-optimization-plan.md + +**调整内容详述**: + +1. **文件夹重命名** + + - project-overview → 项目总览 + - business-modules → 业务模块 + - requirements → 需求文档 + - design → 设计文档 + - development → 开发文档 + - testing → 测试文档 + - deployment → 部署文档 + - middleware → 中间件配置 + - change-management → 变更管理 + - knowledge-base → 知识库 + - reports → 报告文档 + +2. **文档链接更新** + + - 更新 docs/README.md 中所有目录的链接引用 + - 更新按项目阶段导航的路径显示 + - 更新快速导航指南中的链接 + - 更新重要开发规范中的文档路径引用 + +3. **结构优化方案同步** + - 更新 docs/structure-optimization-plan.md 中的目录结构图 + - 同步更新实施建议中的目录名称 + +**技术细节**: + +- 使用的命令:`mv [英文名] [中文名]` +- 更新格式:Markdown 链接格式 +- 保持一致性:所有相关引用同步更新 +- 中文命名规范:使用简洁明了的中文名称 + +**优化效果**: + +- **用户友好性**:中文目录名更直观,降低理解成本 +- **本土化支持**:符合中文用户的使用习惯 +- **可读性提升**:目录结构一目了然,便于快速定位 +- **团队协作**:中文名称减少沟通成本 +- **文档管理**:更符合中文项目的文档管理习惯 + +**命名对照表**: + +| 英文名称 | 中文名称 | 用途说明 | +| ----------------- | ---------- | ---------------- | +| project-overview | 项目总览 | 项目整体信息 | +| business-modules | 业务模块 | 业务模块聚合文档 | +| requirements | 需求文档 | 项目需求管理 | +| design | 设计文档 | 系统设计文档 | +| development | 开发文档 | 开发指南和规范 | +| testing | 测试文档 | 测试计划和用例 | +| deployment | 部署文档 | 部署和运维指南 | +| middleware | 中间件配置 | 中间件配置文档 | +| change-management | 变更管理 | 项目变更追踪 | +| knowledge-base | 知识库 | 经验和最佳实践 | +| reports | 报告文档 | 项目报告管理 | + +**测试验证**: + +- [x] 所有文件夹重命名成功 +- [x] docs/README.md 中的链接全部更新 +- [x] structure-optimization-plan.md 中的目录结构图更新 +- [x] 所有相关文档引用路径同步更新 +- [x] 文档结构保持完整,功能正常 +- [x] 中文路径在各操作系统下兼容性良好 + +**备注**: 此次调整将 docs 文档体系的可读性和用户体验提升到了新的高度,中文目录名称使项目文档更加符合中文用户的使用习惯,显著降低了文档导航和理解的门槛。这一改进将有助于团队成员更高效地使用和维护项目文档。 + +--- + +## 调整记录 - 2025-01-26 23:55:00 + +**调整时间**: 2025-01-26 23:55:00 +**调整人**: Cursor AI 辅助 +**调整目的**: 优化 docs 文件夹目录结构,建立混合组织方式,既支持项目阶段的全过程管理,又提供业务模块的聚合视图,为 AI 辅助开发提供更好的文档基础 + +**涉及文件**: + +- docs/structure-optimization-plan.md (新建) +- docs/project-overview/README.md (新建) +- docs/business-modules/README.md (新建) +- docs/change-management/README.md (新建) +- docs/change-management/code-adjust-record.md (迁移) +- docs/README.md (重大更新) + +**调整内容详述**: + +1. **新增核心目录结构** + + - 创建 `project-overview/` 目录:项目总览,包含项目基本信息、技术架构、团队组织等 + - 创建 `business-modules/` 目录:按业务模块组织文档,便于 AI 理解业务上下文 + - 创建 `change-management/` 目录:统一管理各类变更记录 + - 创建 `knowledge-base/` 和 `reports/` 目录:知识积累和项目报告 + +2. **建立双重导航体系** + + - **按项目阶段导航**:requirements → design → development → testing → deployment + - **按业务模块导航**:用户管理、满意度调查、报告厅预约、系统管理等模块 + +3. **优化文档组织理念** + + - 保持软件开发生命周期的清晰结构 + - 在每个业务模块下聚合该模块的完整文档(需求+设计+API+数据库+测试) + - 为 Cursor AI 提供完整的业务上下文理解 + +4. **迁移和整合现有内容** + + - 将 `code-adjust-record.md` 迁移到 `change-management/` 目录 + - 重新编写主 README 文档,体现新的组织理念 + - 创建详细的文档结构优化方案 + +5. **建立标准化的模块文档结构** + - 每个业务模块包含:requirements.md、design.md、api.md、database.md、test-cases.md + - 统一的文档模板和维护规范 + - 模块间依赖关系的清晰定义 + +**技术细节**: + +- 文档格式:Markdown +- 组织方式:混合组织(项目阶段 + 业务模块) +- 版本控制:Git 版本管理 +- AI 友好设计:业务上下文聚合、标准化模板、清晰的依赖关系 + +**优化效果**: + +- **Cursor AI 辅助**:通过业务模块聚合提供完整业务上下文 +- **全过程管理**:保持项目全生命周期的文档管理体系 +- **查找效率**:双重导航体系,支持多种查找方式 +- **知识积累**:建立知识库和经验沉淀机制 +- **变更追踪**:完善的变更管理和记录体系 + +**业务模块文档规划**: + +1. **用户管理模块**:用户注册、登录、权限管理 +2. **后勤满意度调查模块**:问卷创建、数据收集、统计分析 +3. **报告厅预约模块**:资源管理、预约申请、审批流程 +4. **系统管理模块**:系统配置、日志管理、监控告警 + +**文档维护规范建立**: + +- 代码变更必须同步更新相关模块文档 +- API 变更必须立即更新 API.md 文档 +- 建立文档版本与代码版本的同步机制 +- 定期审查文档完整性和准确性 + +**测试验证**: + +- [x] 新目录结构创建完成 +- [x] 核心文档编写完成(project-overview、business-modules、change-management) +- [x] 主 README 文档更新完成 +- [x] 代码调整记录迁移完成 +- [x] 文档结构优化方案编写完成 +- [x] 文档间交叉引用检查通过 + +**备注**: +此次文档结构优化是项目文档管理的重要升级,建立了既符合软件开发全过程管理需要,又便于 AI 辅助开发的混合文档组织体系。通过业务模块的聚合视图,Cursor AI 可以更好地理解项目的业务上下文,提供更精准的代码生成和开发辅助。同时,完善的变更管理体系确保了项目文档与代码的同步更新,为项目的长期维护和发展奠定了良好基础。 + +--- + ## 调整记录 - 2025-01-26 23:40:00 **调整时间**: 2025-01-26 23:40:00 diff --git a/docs/development/API.md b/docs/开发文档/API.md similarity index 100% rename from docs/development/API.md rename to docs/开发文档/API.md diff --git a/docs/开发文档/API文档模板.md b/docs/开发文档/API文档模板.md new file mode 100644 index 00000000..3e5cb64c --- /dev/null +++ b/docs/开发文档/API文档模板.md @@ -0,0 +1,641 @@ +# API 文档模板 + +> 🎯 **模板用途**:本模板用于创建标准化的 API 接口文档,为 Cursor AI 提供 API 文档编写和维护的参考格式 + +## 📋 文档说明 + +### 适用场景 + +- 新增 API 接口时创建文档 +- 现有 API 接口修改时更新文档 +- 为 Cursor AI 提供接口开发上下文 + +### 使用方法 + +1. 复制本模板内容 +2. 替换所有 `[占位符]` 为实际内容 +3. 根据实际接口情况调整结构 +4. 确保示例代码可以正常运行 + +--- + +## 🔌 [模块名称] API 接口文档 + +### 模块概述 + +**模块名称**:[模块英文名] / [模块中文名] +**基础路径**:`/api/[module]` +**版本**:v1.0 +**负责人**:[开发负责人] +**更新时间**:[最后更新时间] + +### 模块功能 + +[模块的主要功能描述,包括业务价值和技术特点] + +### 权限说明 + +- **权限前缀**:`[module]:` +- **权限列表**: + - `[module]:list` - 查询权限 + - `[module]:add` - 新增权限 + - `[module]:edit` - 编辑权限 + - `[module]:remove` - 删除权限 + +--- + +## 📊 接口概览 + +### 接口分类 + +#### 基础 CRUD 接口 + +| 接口名称 | HTTP 方法 | 路径 | 权限要求 | 功能描述 | +| -------------- | --------- | --------------------- | ----------------- | ---------------------- | +| 查询[实体]列表 | GET | `/api/[module]/list` | `[module]:list` | 分页查询[实体]列表 | +| 查询[实体]详情 | GET | `/api/[module]/{id}` | `[module]:list` | 根据 ID 查询[实体]详情 | +| 新增[实体] | POST | `/api/[module]` | `[module]:add` | 创建新的[实体] | +| 修改[实体] | PUT | `/api/[module]` | `[module]:edit` | 更新[实体]信息 | +| 删除[实体] | DELETE | `/api/[module]/{ids}` | `[module]:remove` | 批量删除[实体] | + +#### 业务逻辑接口 + +| 接口名称 | HTTP 方法 | 路径 | 权限要求 | 功能描述 | +| ------------ | --------- | ------------------------- | -------- | ---------- | +| [业务接口 1] | [方法] | `/api/[module]/[action1]` | `[权限]` | [功能描述] | +| [业务接口 2] | [方法] | `/api/[module]/[action2]` | `[权限]` | [功能描述] | +| [业务接口 3] | [方法] | `/api/[module]/[action3]` | `[权限]` | [功能描述] | + +### 通用响应格式 + +#### 成功响应 + +```json +{ + "code": 200, + "msg": "操作成功", + "data": { + // 响应数据 + } +} +``` + +#### 分页响应 + +```json +{ + "code": 200, + "msg": "查询成功", + "rows": [ + // 数据列表 + ], + "total": 100 +} +``` + +#### 错误响应 + +```json +{ + "code": 400001, + "msg": "参数错误", + "data": null +} +``` + +--- + +## 🔍 接口详细说明 + +### 1. 查询[实体]列表 + +#### 接口信息 + +**接口地址**: `GET /api/[module]/list` + +**接口描述**: 分页查询[实体]列表,支持多条件筛选 + +**权限要求**: `[module]:list` + +#### 请求参数 + +| 参数名 | 类型 | 必填 | 说明 | 示例值 | +| --------- | ------- | ---- | -------------------- | ------------ | +| pageNum | Integer | N | 页码,默认 1 | 1 | +| pageSize | Integer | N | 每页大小,默认 10 | 10 | +| [field1] | String | N | [字段 1 说明] | "示例值" | +| [field2] | Integer | N | [字段 2 说明] | 1 | +| status | Integer | N | 状态:1 启用,0 禁用 | 1 | +| beginTime | String | N | 开始时间 | "2024-01-01" | +| endTime | String | N | 结束时间 | "2024-01-31" | + +#### 请求示例 + +```bash +curl -X GET "http://localhost:8080/api/[module]/list?pageNum=1&pageSize=10&status=1" \ + -H "Authorization: Bearer {token}" \ + -H "Content-Type: application/json" +``` + +#### 响应示例 + +```json +{ + "code": 200, + "msg": "查询成功", + "rows": [ + { + "id": 1, + "[field1]": "示例值1", + "[field2]": 1, + "status": 1, + "createBy": 1, + "createTime": "2024-01-01 10:00:00", + "updateBy": 1, + "updateTime": "2024-01-01 10:00:00" + }, + { + "id": 2, + "[field1]": "示例值2", + "[field2]": 2, + "status": 1, + "createBy": 1, + "createTime": "2024-01-01 11:00:00", + "updateBy": 1, + "updateTime": "2024-01-01 11:00:00" + } + ], + "total": 100 +} +``` + +#### 错误码 + +| 错误码 | 说明 | 解决方案 | +| ------ | -------- | -------------------- | +| 401001 | 未登录 | 请先登录获取 token | +| 403001 | 无权限 | 请联系管理员分配权限 | +| 400001 | 参数错误 | 检查请求参数格式 | + +--- + +### 2. 查询[实体]详情 + +#### 接口信息 + +**接口地址**: `GET /api/[module]/{id}` + +**接口描述**: 根据 ID 查询[实体]的详细信息 + +**权限要求**: `[module]:list` + +#### 路径参数 + +| 参数名 | 类型 | 必填 | 说明 | 示例值 | +| ------ | ---- | ---- | -------- | ------ | +| id | Long | Y | [实体]ID | 1 | + +#### 请求示例 + +```bash +curl -X GET "http://localhost:8080/api/[module]/1" \ + -H "Authorization: Bearer {token}" \ + -H "Content-Type: application/json" +``` + +#### 响应示例 + +```json +{ + "code": 200, + "msg": "查询成功", + "data": { + "id": 1, + "[field1]": "示例值", + "[field2]": 1, + "status": 1, + "remark": "备注信息", + "createBy": 1, + "createTime": "2024-01-01 10:00:00", + "updateBy": 1, + "updateTime": "2024-01-01 10:00:00" + } +} +``` + +#### 错误码 + +| 错误码 | 说明 | 解决方案 | +| ------ | ---------- | -------------------- | +| 404001 | 数据不存在 | 检查 ID 是否正确 | +| 401001 | 未登录 | 请先登录获取 token | +| 403001 | 无权限 | 请联系管理员分配权限 | + +--- + +### 3. 新增[实体] + +#### 接口信息 + +**接口地址**: `POST /api/[module]` + +**接口描述**: 创建新的[实体]记录 + +**权限要求**: `[module]:add` + +#### 请求参数 + +| 参数名 | 类型 | 必填 | 说明 | 示例值 | +| -------- | ------- | ---- | ---------------------------- | ---------- | +| [field1] | String | Y | [字段 1 说明] | "示例值" | +| [field2] | Integer | Y | [字段 2 说明] | 1 | +| status | Integer | N | 状态:1 启用,0 禁用,默认 1 | 1 | +| remark | String | N | 备注信息 | "备注内容" | + +#### 请求体 + +```json +{ + "[field1]": "示例值", + "[field2]": 1, + "status": 1, + "remark": "备注信息" +} +``` + +#### 请求示例 + +```bash +curl -X POST "http://localhost:8080/api/[module]" \ + -H "Authorization: Bearer {token}" \ + -H "Content-Type: application/json" \ + -d '{ + "[field1]": "示例值", + "[field2]": 1, + "status": 1, + "remark": "备注信息" + }' +``` + +#### 响应示例 + +```json +{ + "code": 200, + "msg": "新增成功", + "data": { + "id": 3 + } +} +``` + +#### 错误码 + +| 错误码 | 说明 | 解决方案 | +| ------ | ---------- | -------------------- | +| 400001 | 参数错误 | 检查必填参数是否缺失 | +| 400002 | 数据已存在 | 检查唯一字段是否重复 | +| 401001 | 未登录 | 请先登录获取 token | +| 403001 | 无权限 | 请联系管理员分配权限 | + +#### 参数验证规则 + +- `[field1]`: 长度 2-50 字符,不能为空 +- `[field2]`: 必须为正整数 +- `status`: 只能为 0 或 1 +- `remark`: 最大长度 500 字符 + +--- + +### 4. 修改[实体] + +#### 接口信息 + +**接口地址**: `PUT /api/[module]` + +**接口描述**: 更新[实体]信息 + +**权限要求**: `[module]:edit` + +#### 请求参数 + +| 参数名 | 类型 | 必填 | 说明 | 示例值 | +| -------- | ------- | ---- | -------------------- | ---------- | +| id | Long | Y | [实体]ID | 1 | +| [field1] | String | Y | [字段 1 说明] | "示例值" | +| [field2] | Integer | Y | [字段 2 说明] | 1 | +| status | Integer | N | 状态:1 启用,0 禁用 | 1 | +| remark | String | N | 备注信息 | "备注内容" | + +#### 请求体 + +```json +{ + "id": 1, + "[field1]": "修改后的值", + "[field2]": 2, + "status": 1, + "remark": "修改后的备注" +} +``` + +#### 请求示例 + +```bash +curl -X PUT "http://localhost:8080/api/[module]" \ + -H "Authorization: Bearer {token}" \ + -H "Content-Type: application/json" \ + -d '{ + "id": 1, + "[field1]": "修改后的值", + "[field2]": 2, + "status": 1, + "remark": "修改后的备注" + }' +``` + +#### 响应示例 + +```json +{ + "code": 200, + "msg": "修改成功", + "data": null +} +``` + +#### 错误码 + +| 错误码 | 说明 | 解决方案 | +| ------ | ---------- | -------------------- | +| 404001 | 数据不存在 | 检查 ID 是否正确 | +| 400001 | 参数错误 | 检查参数格式是否正确 | +| 401001 | 未登录 | 请先登录获取 token | +| 403001 | 无权限 | 请联系管理员分配权限 | + +--- + +### 5. 删除[实体] + +#### 接口信息 + +**接口地址**: `DELETE /api/[module]/{ids}` + +**接口描述**: 批量删除[实体],支持逻辑删除 + +**权限要求**: `[module]:remove` + +#### 路径参数 + +| 参数名 | 类型 | 必填 | 说明 | 示例值 | +| ------ | ------ | ---- | ----------------------------- | ------- | +| ids | String | Y | [实体]ID 列表,多个用逗号分隔 | "1,2,3" | + +#### 请求示例 + +```bash +curl -X DELETE "http://localhost:8080/api/[module]/1,2,3" \ + -H "Authorization: Bearer {token}" \ + -H "Content-Type: application/json" +``` + +#### 响应示例 + +```json +{ + "code": 200, + "msg": "删除成功", + "data": { + "successCount": 2, + "failCount": 1, + "failIds": [3] + } +} +``` + +#### 错误码 + +| 错误码 | 说明 | 解决方案 | +| ------ | ---------- | -------------------- | +| 400001 | 参数错误 | 检查 ID 格式是否正确 | +| 400003 | 数据被引用 | 请先删除关联数据 | +| 401001 | 未登录 | 请先登录获取 token | +| 403001 | 无权限 | 请联系管理员分配权限 | + +--- + +## 🎯 业务逻辑接口 + +### 1. [业务接口 1 名称] + +#### 接口信息 + +**接口地址**: `[HTTP方法] /api/[module]/[action]` + +**接口描述**: [详细的业务功能描述] + +**权限要求**: `[权限代码]` + +#### 业务流程 + +1. [业务步骤 1] +2. [业务步骤 2] +3. [业务步骤 3] + +#### 请求参数 + +| 参数名 | 类型 | 必填 | 说明 | 示例值 | +| -------- | ------ | ----- | ---------- | -------- | +| [param1] | [类型] | [Y/N] | [参数说明] | [示例值] | +| [param2] | [类型] | [Y/N] | [参数说明] | [示例值] | + +#### 请求示例 + +```bash +curl -X [方法] "http://localhost:8080/api/[module]/[action]" \ + -H "Authorization: Bearer {token}" \ + -H "Content-Type: application/json" \ + -d '{ + "[param1]": "[值1]", + "[param2]": "[值2]" + }' +``` + +#### 响应示例 + +```json +{ + "code": 200, + "msg": "操作成功", + "data": { + "[result1]": "[结果值1]", + "[result2]": "[结果值2]" + } +} +``` + +#### 业务规则 + +- [业务规则 1] +- [业务规则 2] +- [业务规则 3] + +#### 注意事项 + +- [注意事项 1] +- [注意事项 2] + +--- + +## 📋 数据字典 + +### [实体名称] 状态枚举 + +| 值 | 名称 | 说明 | +| --- | ---- | -------- | +| 0 | 禁用 | 不可使用 | +| 1 | 启用 | 正常使用 | + +### [其他枚举名称] + +| 值 | 名称 | 说明 | +| ------ | -------- | -------- | +| [值 1] | [名称 1] | [说明 1] | +| [值 2] | [名称 2] | [说明 2] | + +--- + +## 🔧 SDK 使用示例 + +### Java SDK + +```java +// 查询列表 +[Module]QueryBo queryBo = new [Module]QueryBo(); +queryBo.setStatus(1); +PageQuery pageQuery = new PageQuery(1, 10); +Result> result = [module]Api.list(queryBo, pageQuery); + +// 新增记录 +[Module]Bo [module]Bo = new [Module]Bo(); +[module]Bo.set[Field1]("示例值"); +[module]Bo.set[Field2](1); +Result addResult = [module]Api.add([module]Bo); + +// 修改记录 +[module]Bo.setId(1L); +[module]Bo.set[Field1]("修改后的值"); +Result updateResult = [module]Api.update([module]Bo); +``` + +### JavaScript SDK + +```javascript +// 查询列表 +const queryParams = { + pageNum: 1, + pageSize: 10, + status: 1 +}; +const listResult = await [module]Api.list(queryParams); + +// 新增记录 +const [module]Data = { + [field1]: "示例值", + [field2]: 1, + status: 1 +}; +const addResult = await [module]Api.add([module]Data); + +// 修改记录 +[module]Data.id = 1; +[module]Data.[field1] = "修改后的值"; +const updateResult = await [module]Api.update([module]Data); +``` + +--- + +## 🧪 测试用例 + +### 接口测试 + +```javascript +// Jest 测试示例 +describe('[Module] API Tests', () => { + test('查询列表接口', async () => { + const response = await request(app) + .get('/api/[module]/list') + .set('Authorization', `Bearer ${token}`) + .expect(200); + + expect(response.body.code).toBe(200); + expect(response.body.rows).toBeDefined(); + expect(response.body.total).toBeGreaterThanOrEqual(0); + }); + + test('新增接口', async () => { + const [module]Data = { + [field1]: "测试值", + [field2]: 1 + }; + + const response = await request(app) + .post('/api/[module]') + .set('Authorization', `Bearer ${token}`) + .send([module]Data) + .expect(200); + + expect(response.body.code).toBe(200); + expect(response.body.data.id).toBeDefined(); + }); +}); +``` + +--- + +## 🔄 版本历史 + +### v1.0.0 - 2024-01-01 + +- ✅ 初始版本发布 +- ✅ 完成基础 CRUD 接口 +- ✅ 完成核心业务接口 + +### v1.0.1 - 2024-01-15 + +- 🔧 优化查询接口性能 +- 🐛 修复删除接口的权限检查问题 +- 📚 补充接口文档和示例 + +### v1.1.0 - 2024-02-01 + +- ✨ 新增[新功能 1]接口 +- ✨ 新增[新功能 2]接口 +- 🔧 优化错误处理机制 + +--- + +## 📖 相关文档 + +- **数据库设计**:[数据库设计文档](../设计文档/database/) +- **业务需求**:[业务需求文档](../需求文档/) +- **技术架构**:[技术架构文档](./技术架构/) +- **开发规范**:[开发规范文档](./开发规范/) + +--- + +## 📞 联系方式 + +**开发团队**:[团队名称] +**负责人**:[负责人姓名] +**邮箱**:[联系邮箱] +**文档维护**:实时更新,如有问题请及时反馈 + +--- + +**📌 重要提醒**: + +1. 所有接口都需要先登录获取 token +2. 请求头必须包含 `Authorization: Bearer {token}` +3. 参数验证失败会返回详细的错误信息 +4. 生产环境请使用 HTTPS 协议 diff --git a/docs/开发文档/README.md b/docs/开发文档/README.md new file mode 100644 index 00000000..0989cc57 --- /dev/null +++ b/docs/开发文档/README.md @@ -0,0 +1,649 @@ +# 开发文档中心 + +## 📋 开发文档概述 + +开发文档中心提供项目开发所需的所有技术文档和规范,为 **Cursor AI 辅助开发** 提供完整的技术上下文和开发指南。 + +## 🎯 文档目标 + +### 为 Cursor AI 提供的价值 + +- **🔧 技术规范**:统一的编码规范和开发标准 +- **📚 API 文档**:完整的接口定义和使用说明 +- **⚙️ 架构指南**:系统架构和技术选型说明 +- **🛠️ 工具配置**:开发工具和环境配置指南 + +### 文档维护原则 + +- **实时同步**:API 变更时立即更新文档 +- **详细准确**:提供完整的技术细节和示例 +- **版本管理**:记录文档版本和变更历史 +- **易于理解**:清晰的结构和标准化描述 + +## 📁 文档结构 + +``` +开发文档/ +├── README.md # 本文件 - 开发文档总览 +├── API.md # API接口完整文档 +├── 开发规范/ +│ ├── 后端开发规范.md # Java/Spring Boot开发规范 +│ ├── 前端开发规范.md # Vue3/TypeScript开发规范 +│ ├── 数据库规范.md # 数据库设计和操作规范 +│ ├── 代码审查规范.md # 代码审查流程和标准 +│ └── Git使用规范.md # Git分支和提交规范 +├── 技术架构/ +│ ├── 系统架构设计.md # 整体系统架构 +│ ├── 技术选型说明.md # 技术栈选择理由 +│ ├── 安全架构设计.md # 安全体系设计 +│ └── 性能优化指南.md # 性能优化策略 +├── 环境配置/ +│ ├── 开发环境搭建.md # 本地开发环境配置 +│ ├── 测试环境配置.md # 测试环境搭建 +│ ├── 生产环境部署.md # 生产环境部署指南 +│ └── 工具配置指南.md # IDE和工具配置 +├── 最佳实践/ +│ ├── 代码结构设计.md # 代码组织和结构设计 +│ ├── 异常处理规范.md # 异常处理最佳实践 +│ ├── 日志记录规范.md # 日志记录标准 +│ └── 测试策略指南.md # 测试策略和方法 +└── 第三方集成/ + ├── 中间件集成.md # Redis、MQ等中间件集成 + ├── 第三方服务.md # 第三方API和服务集成 + └── 工具库使用.md # 常用工具库使用指南 +``` + +## 🔌 API 文档管理 + +### API 文档结构 + +#### 1. 完整性要求 + +- **接口地址**:完整的请求路径和 HTTP 方法 +- **参数说明**:详细的请求参数和数据类型 +- **响应格式**:标准的响应体结构和示例 +- **错误码**:完整的错误码定义和处理 + +#### 2. 实时性要求 + +- **同步更新**:代码变更时立即更新 API 文档 +- **版本管理**:记录 API 版本变更历史 +- **兼容性说明**:重大变更的向后兼容性说明 + +#### 3. 标准格式 + +````markdown +#### 接口名称 + +**接口地址**: `HTTP方法 /api/路径` + +**接口描述**: 接口功能的详细描述 + +**权限要求**: 权限代码或"需要登录" + +**请求参数**: +| 参数名 | 类型 | 必填 | 说明 | 示例值 | +|--------|------|------|------|--------| +| param1 | String | Y | 参数说明 | "example" | +| param2 | Integer | N | 参数说明 | 100 | + +**响应示例**: + +```json +{ + "code": 200, + "msg": "操作成功", + "data": { + "id": 1, + "name": "示例" + } +} +``` +```` + +**错误码**: +| 错误码 | 说明 | 解决方案 | +|--------|------|----------| +| 400001 | 参数错误 | 检查请求参数 | +| 401001 | 未登录 | 请先登录 | + +```` + +### API 文档自动生成 + +#### Swagger/OpenAPI 集成 +```java +@RestController +@RequestMapping("/api/user") +@Api(tags = "用户管理") +public class UserController { + + @ApiOperation(value = "获取用户列表", notes = "分页查询用户列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "pageNum", value = "页码", defaultValue = "1"), + @ApiImplicitParam(name = "pageSize", value = "每页大小", defaultValue = "10") + }) + @GetMapping("/list") + public Result> list(UserQueryBo queryBo, PageQuery pageQuery) { + // 实现逻辑 + } +} +```` + +#### 文档生成脚本 + +```bash +#!/bin/bash +# API文档生成脚本 +generate_api_docs() { + echo "生成API文档..." + mvn clean compile + mvn swagger2markup:convertSwagger2markup + echo "API文档生成完成:docs/开发文档/API.md" +} +``` + +## 💻 开发规范体系 + +### 后端开发规范 + +#### 1. Java 编码规范 + +- **命名规范**:遵循 Java 命名约定 +- **代码结构**:标准的 MVC 分层架构 +- **注释规范**:完整的 JavaDoc 注释 +- **异常处理**:统一的异常处理机制 + +#### 2. Spring Boot 规范 + +```java +// 标准Controller结构 +@RestController +@RequestMapping("/api/module") +@Slf4j +public class ModuleController extends BaseController { + + @Autowired + private IModuleService moduleService; + + @SaCheckPermission("module:list") + @GetMapping("/list") + @Operation(summary = "查询列表") + public TableDataInfo list(ModuleBo bo, PageQuery pageQuery) { + return moduleService.queryPageList(bo, pageQuery); + } +} +``` + +#### 3. 数据库规范 + +```sql +-- 标准表结构 +CREATE TABLE `module_table` ( + `id` BIGINT(20) NOT NULL COMMENT '主键ID', + `name` VARCHAR(100) NOT NULL COMMENT '名称', + `status` TINYINT(1) DEFAULT 1 COMMENT '状态:1启用,0禁用', + `tenant_id` VARCHAR(20) NOT NULL COMMENT '租户ID', + `create_by` BIGINT(20) NOT NULL COMMENT '创建人', + `create_time` DATETIME NOT NULL COMMENT '创建时间', + `update_by` BIGINT(20) DEFAULT NULL COMMENT '更新人', + `update_time` DATETIME DEFAULT NULL COMMENT '更新时间', + `deleted` TINYINT(1) DEFAULT 0 COMMENT '删除标记', + PRIMARY KEY (`id`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='模块表'; +``` + +### 前端开发规范 + +#### 1. Vue3 组件规范 + +```vue + + + + + +``` + +#### 2. TypeScript 类型定义 + +```typescript +// api/types.ts +export interface ModuleVo { + id: number; + name: string; + status: number; + createTime: string; +} + +export interface ModuleBo { + name?: string; + status?: number; +} + +export interface ModuleForm { + id?: number; + name: string; + status: number; +} +``` + +#### 3. API 调用规范 + +```typescript +// api/module.ts +import request from '@/utils/request'; +import type { AxiosPromise } from 'axios'; + +export const listModule = (query?: ModuleBo): AxiosPromise => { + return request({ + url: '/api/module/list', + method: 'get', + params: query, + }); +}; + +export const createModule = (data: ModuleForm): AxiosPromise => { + return request({ + url: '/api/module', + method: 'post', + data: data, + }); +}; +``` + +## 🏗️ 技术架构指南 + +### 系统整体架构 + +```mermaid +graph TB + subgraph "前端层" + A1[Web管理端
Vue3 + Element Plus] + A2[移动端
UniApp + uView UI] + end + + subgraph "网关层" + B1[API Gateway
Spring Cloud Gateway] + B2[负载均衡
Nginx] + end + + subgraph "应用层" + C1[用户服务
Spring Boot] + C2[业务服务
Spring Boot] + C3[文件服务
Spring Boot] + end + + subgraph "数据层" + D1[MySQL
主数据库] + D2[Redis
缓存/会话] + D3[MinIO
文件存储] + end + + subgraph "基础设施" + E1[Docker
容器化] + E2[Jenkins
CI/CD] + E3[ELK
日志监控] + end + + A1 --> B2 + A2 --> B2 + B2 --> B1 + B1 --> C1 + B1 --> C2 + B1 --> C3 + + C1 --> D1 + C2 --> D1 + C3 --> D1 + + C1 --> D2 + C2 --> D2 + + C3 --> D3 +``` + +### 技术选型说明 + +#### 后端技术栈 + +- **Spring Boot 3.4.6**:主框架,提供依赖注入和自动配置 +- **Spring Cloud 2023.0.x**:微服务架构支持 +- **MyBatis-Plus 3.5.12**:ORM 框架,简化数据库操作 +- **Sa-Token 1.42.0**:权限认证框架 +- **Redis 7.0**:缓存和会话存储 +- **MySQL 8.0**:主数据库 + +#### 前端技术栈 + +- **Vue 3.5.13**:渐进式 JavaScript 框架 +- **TypeScript 5.8.3**:静态类型检查 +- **Element Plus 2.9.8**:UI 组件库 +- **Vite 7.0.9**:构建工具 +- **Pinia**:状态管理 + +## 🛠️ 开发工具配置 + +### IDE 配置 + +#### IntelliJ IDEA 配置 + +```xml + + + + + +``` + +#### VSCode 配置 + +```json +{ + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": true + }, + "typescript.preferences.importModuleSpecifier": "relative", + "emmet.includeLanguages": { + "vue": "html" + } +} +``` + +### Git 配置 + +#### .gitignore 模板 + +```bash +# 编译输出 +target/ +dist/ +build/ + +# 依赖目录 +node_modules/ + +# IDE文件 +.idea/ +.vscode/ +*.iml + +# 日志文件 +logs/ +*.log + +# 配置文件 +application-local.yml +.env.local +``` + +#### Git Hooks + +```bash +#!/bin/bash +# pre-commit hook +echo "运行代码检查..." + +# Java代码检查 +mvn checkstyle:check +if [ $? -ne 0 ]; then + echo "Java代码规范检查失败!" + exit 1 +fi + +# 前端代码检查 +cd web && npm run lint +if [ $? -ne 0 ]; then + echo "前端代码规范检查失败!" + exit 1 +fi + +echo "代码检查通过!" +``` + +## 🔧 Cursor AI 开发指南 + +### AI 辅助开发流程 + +#### 1. 需求理解阶段 + +``` +请根据以下需求文档和技术规范,为我开发[功能名称]: + +业务需求:docs/需求文档/[具体需求文档] +技术规范:docs/开发文档/[相关规范文档] +API设计:docs/开发文档/API.md + +请确保代码符合项目规范,包括: +1. 遵循编码规范 +2. 添加完整注释 +3. 包含单元测试 +4. 更新API文档 +``` + +#### 2. 代码生成阶段 + +``` +基于以下技术架构生成代码: + +后端:Spring Boot + MyBatis-Plus + Sa-Token +前端:Vue3 + TypeScript + Element Plus +数据库:MySQL 8.0 + +请生成以下文件: +1. Controller层 - REST API接口 +2. Service层 - 业务逻辑 +3. Mapper层 - 数据访问 +4. DTO/VO类 - 数据传输对象 +5. 前端页面 - Vue3组件 +6. API调用 - TypeScript接口 +``` + +#### 3. 文档更新阶段 + +``` +根据刚才生成的代码,请更新以下文档: + +1. API文档:docs/开发文档/API.md + - 新增的接口定义 + - 请求参数说明 + - 响应示例 + +2. 数据库文档:docs/设计文档/database/ + - 新增的表结构 + - 字段说明 + +3. 变更记录:docs/变更管理/code-adjust-record.md + - 本次变更的详细记录 + +请保持文档格式一致。 +``` + +### 提示词模板库 + +#### 后端开发模板 + +``` +# 生成Spring Boot Controller +请为[实体名称]生成标准的Spring Boot Controller,要求: +1. 包含CRUD操作接口 +2. 使用Sa-Token权限控制 +3. 参数验证和异常处理 +4. 完整的Swagger注解 +5. 统一响应格式 + +实体字段:[字段列表] +权限前缀:[权限代码] +``` + +#### 前端开发模板 + +``` +# 生成Vue3组件 +请为[功能名称]生成Vue3组件,要求: +1. 使用TypeScript +2. Element Plus组件 +3. 响应式设计 +4. 表单验证 +5. API调用集成 + +页面类型:[列表页/表单页/详情页] +功能要求:[具体功能说明] +``` + +#### 数据库设计模板 + +``` +# 生成数据库表 +请为[业务实体]设计MySQL表结构,要求: +1. 符合项目命名规范 +2. 包含标准基础字段 +3. 合理的索引设计 +4. 外键关系定义 +5. 注释完整 + +业务字段:[字段需求] +关联表:[关联关系] +``` + +## 📋 质量控制标准 + +### 代码质量检查 + +#### 自动化检查 + +- **代码规范**:Checkstyle + ESLint +- **代码覆盖率**:JaCoCo > 80% +- **安全扫描**:SonarQube +- **依赖检查**:OWASP Dependency Check + +#### 人工审查 + +- **架构合理性**:是否符合系统架构 +- **业务逻辑正确性**:是否满足业务需求 +- **代码可读性**:注释完整,命名规范 +- **性能考虑**:是否有性能优化 + +### 文档质量标准 + +#### 完整性检查 + +- [ ] API 文档覆盖所有接口 +- [ ] 参数说明详细准确 +- [ ] 响应示例真实有效 +- [ ] 错误码定义完整 + +#### 准确性检查 + +- [ ] 文档与代码实现一致 +- [ ] 示例可以正常运行 +- [ ] 版本信息正确 +- [ ] 链接地址有效 + +### 版本管理 + +#### 文档版本规则 + +- **主版本**:重大架构变更 +- **次版本**:新增功能模块 +- **修订版本**:Bug 修复和文档更新 + +#### 变更记录 + +```markdown +## 版本 1.2.3 - 2024-01-15 + +### 新增 + +- 新增用户管理 API 文档 +- 添加前端开发规范 + +### 修改 + +- 更新数据库设计规范 +- 优化 API 响应格式 + +### 修复 + +- 修正示例代码错误 +- 更新过期链接 +``` + +## 🚀 持续改进计划 + +### 短期目标(1 个月内) + +- [ ] 完善 API 文档自动生成 +- [ ] 建立代码质量检查流程 +- [ ] 优化开发环境配置 +- [ ] 提升团队规范执行 + +### 中期目标(3 个月内) + +- [ ] 建立文档质量评估体系 +- [ ] 实现开发流程自动化 +- [ ] 完善性能监控机制 +- [ ] 建立知识库体系 + +### 长期目标(6 个月内) + +- [ ] 实现智能化代码审查 +- [ ] 建立自动化测试体系 +- [ ] 完善 DevOps 流程 +- [ ] 建立技术标准库 + +--- + +## 📖 相关文档 + +- **API 接口文档**:[API.md](./API.md) +- **项目总览**:[项目总览](../项目总览/README.md) +- **业务模块**:[业务模块](../业务模块/README.md) +- **变更管理**:[变更管理](../变更管理/README.md) +- **测试文档**:[测试文档](../测试文档/README.md) + +--- + +**🎯 目标**:通过完善的开发文档体系,为团队提供统一的技术标准,为 Cursor AI 提供准确的开发上下文,提升开发效率和代码质量。 diff --git a/docs/testing/README.md b/docs/测试文档/README.md similarity index 100% rename from docs/testing/README.md rename to docs/测试文档/README.md diff --git a/docs/设计文档/database/01-workflow-module.sql b/docs/设计文档/database/01-workflow-module.sql new file mode 100644 index 00000000..f8dfe28c --- /dev/null +++ b/docs/设计文档/database/01-workflow-module.sql @@ -0,0 +1,237 @@ +/* + 工作流模块数据库结构 + + 业务域:工作流引擎相关表 + 包含表:flow_category, flow_definition, flow_his_task, flow_instance, + flow_node, flow_skip, flow_task, flow_user + + 创建时间:2025-01-08 + 维护人员:项目开发团队 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for flow_category +-- ---------------------------- +DROP TABLE IF EXISTS `flow_category`; +CREATE TABLE `flow_category` ( + `category_id` bigint(20) NOT NULL COMMENT '流程分类ID', + `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', + `parent_id` bigint(20) DEFAULT '0' COMMENT '父流程分类id', + `ancestors` varchar(500) DEFAULT '' COMMENT '祖级列表', + `category_name` varchar(30) NOT NULL COMMENT '流程分类名称', + `order_num` int(4) DEFAULT '0' COMMENT '显示顺序', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)', + `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`category_id`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_parent_id` (`parent_id`), + KEY `idx_del_flag` (`del_flag`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流程分类'; + +-- ---------------------------- +-- Table structure for flow_definition +-- ---------------------------- +DROP TABLE IF EXISTS `flow_definition`; +CREATE TABLE `flow_definition` ( + `id` bigint(20) NOT NULL COMMENT '主键id', + `flow_code` varchar(40) NOT NULL COMMENT '流程编码', + `flow_name` varchar(100) NOT NULL COMMENT '流程名称', + `category` varchar(100) DEFAULT NULL COMMENT '流程类别', + `version` varchar(20) NOT NULL COMMENT '流程版本', + `is_publish` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否发布(0未发布 1已发布 9失效)', + `form_custom` char(1) DEFAULT 'N' COMMENT '审批表单是否自定义(Y是 N否)', + `form_path` varchar(100) DEFAULT NULL COMMENT '审批表单路径', + `activity_status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '流程激活状态(0挂起 1激活)', + `listener_type` varchar(100) DEFAULT NULL COMMENT '监听器类型', + `listener_path` varchar(400) DEFAULT NULL COMMENT '监听器路径', + `ext` varchar(500) DEFAULT NULL COMMENT '业务详情 存业务表对象json字符串', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志', + `tenant_id` varchar(40) DEFAULT NULL COMMENT '租户id', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_flow_code_version` (`flow_code`, `version`, `tenant_id`, `del_flag`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_del_flag` (`del_flag`), + KEY `idx_flow_code` (`flow_code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流程定义表'; + +-- ---------------------------- +-- Table structure for flow_his_task +-- ---------------------------- +DROP TABLE IF EXISTS `flow_his_task`; +CREATE TABLE `flow_his_task` ( + `id` bigint(20) NOT NULL COMMENT '主键id', + `definition_id` bigint(20) NOT NULL COMMENT '对应flow_definition表的id', + `instance_id` bigint(20) NOT NULL COMMENT '对应flow_instance表的id', + `task_id` bigint(20) NOT NULL COMMENT '对应flow_task表的id', + `node_code` varchar(100) DEFAULT NULL COMMENT '开始节点编码', + `node_name` varchar(100) DEFAULT NULL COMMENT '开始节点名称', + `node_type` tinyint(1) DEFAULT NULL COMMENT '开始节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)', + `target_node_code` varchar(200) DEFAULT NULL COMMENT '目标节点编码', + `target_node_name` varchar(200) DEFAULT NULL COMMENT '结束节点名称', + `approver` varchar(40) DEFAULT NULL COMMENT '审批者', + `cooperate_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '协作方式(1审批 2转办 3委派 4会签 5票签 6加签 7减签)', + `collaborator` varchar(40) DEFAULT NULL COMMENT '协作人', + `skip_type` varchar(10) NOT NULL COMMENT '流转类型(PASS通过 REJECT退回 NONE无动作)', + `flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)', + `form_custom` char(1) DEFAULT 'N' COMMENT '审批表单是否自定义(Y是 N否)', + `form_path` varchar(100) DEFAULT NULL COMMENT '审批表单路径', + `message` varchar(500) DEFAULT NULL COMMENT '审批意见', + `variable` text COMMENT '任务变量', + `ext` varchar(500) DEFAULT NULL COMMENT '业务详情 存业务表对象json字符串', + `create_time` datetime DEFAULT NULL COMMENT '任务开始时间', + `update_time` datetime DEFAULT NULL COMMENT '审批完成时间', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志', + `tenant_id` varchar(40) DEFAULT NULL COMMENT '租户id', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_definition_id` (`definition_id`), + KEY `idx_instance_id` (`instance_id`), + KEY `idx_task_id` (`task_id`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_del_flag` (`del_flag`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='历史任务记录表'; + +-- ---------------------------- +-- Table structure for flow_instance +-- ---------------------------- +DROP TABLE IF EXISTS `flow_instance`; +CREATE TABLE `flow_instance` ( + `id` bigint(20) NOT NULL COMMENT '主键id', + `definition_id` bigint(20) NOT NULL COMMENT '对应flow_definition表的id', + `business_id` varchar(40) NOT NULL COMMENT '业务id', + `node_type` tinyint(1) NOT NULL COMMENT '节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)', + `node_code` varchar(40) NOT NULL COMMENT '流程节点编码', + `node_name` varchar(100) DEFAULT NULL COMMENT '流程节点名称', + `variable` text COMMENT '任务变量', + `flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)', + `activity_status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '流程激活状态(0挂起 1激活)', + `def_json` text COMMENT '流程定义json', + `create_by` varchar(64) DEFAULT '' COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `ext` varchar(500) DEFAULT NULL COMMENT '扩展字段,预留给业务系统使用', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志', + `tenant_id` varchar(40) DEFAULT NULL COMMENT '租户id', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_definition_id` (`definition_id`), + KEY `idx_business_id` (`business_id`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_del_flag` (`del_flag`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流程实例表'; + +-- ---------------------------- +-- Table structure for flow_node +-- ---------------------------- +DROP TABLE IF EXISTS `flow_node`; +CREATE TABLE `flow_node` ( + `id` bigint(20) NOT NULL COMMENT '主键id', + `node_type` tinyint(1) NOT NULL COMMENT '节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)', + `definition_id` bigint(20) NOT NULL COMMENT '流程定义id', + `node_code` varchar(100) NOT NULL COMMENT '流程节点编码', + `node_name` varchar(100) DEFAULT NULL COMMENT '流程节点名称', + `permission_flag` varchar(200) DEFAULT NULL COMMENT '权限标识(权限类型:权限标识,可以多个,用逗号隔开)', + `node_ratio` decimal(6,3) DEFAULT NULL COMMENT '流程签署比例值', + `coordinate` varchar(100) DEFAULT NULL COMMENT '坐标', + `any_node_skip` varchar(100) DEFAULT NULL COMMENT '任意结点跳转', + `listener_type` varchar(100) DEFAULT NULL COMMENT '监听器类型', + `listener_path` varchar(400) DEFAULT NULL COMMENT '监听器路径', + `handler_type` varchar(100) DEFAULT NULL COMMENT '处理器类型', + `handler_path` varchar(400) DEFAULT NULL COMMENT '处理器路径', + `form_custom` char(1) DEFAULT 'N' COMMENT '审批表单是否自定义(Y是 N否)', + `form_path` varchar(100) DEFAULT NULL COMMENT '审批表单路径', + `version` varchar(20) NOT NULL COMMENT '版本', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `ext` text COMMENT '扩展属性', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志', + `tenant_id` varchar(40) DEFAULT NULL COMMENT '租户id', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_definition_id` (`definition_id`), + KEY `idx_node_code` (`node_code`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_del_flag` (`del_flag`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流程节点表'; + +-- ---------------------------- +-- Table structure for flow_skip +-- ---------------------------- +DROP TABLE IF EXISTS `flow_skip`; +CREATE TABLE `flow_skip` ( + `id` bigint(20) NOT NULL COMMENT '主键id', + `definition_id` bigint(20) NOT NULL COMMENT '流程定义id', + `now_node_code` varchar(100) NOT NULL COMMENT '当前流程节点的编码', + `now_node_type` tinyint(1) DEFAULT NULL COMMENT '当前节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)', + `next_node_code` varchar(100) NOT NULL COMMENT '下一个流程节点的编码', + `next_node_type` tinyint(1) DEFAULT NULL COMMENT '下一个节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)', + `skip_name` varchar(100) DEFAULT NULL COMMENT '跳转名称', + `skip_type` varchar(40) DEFAULT NULL COMMENT '跳转类型(PASS审批通过 REJECT退回)', + `skip_condition` varchar(200) DEFAULT NULL COMMENT '跳转条件', + `coordinate` varchar(100) DEFAULT NULL COMMENT '坐标', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志', + `tenant_id` varchar(40) DEFAULT NULL COMMENT '租户id', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_definition_id` (`definition_id`), + KEY `idx_now_node_code` (`now_node_code`), + KEY `idx_next_node_code` (`next_node_code`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_del_flag` (`del_flag`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点跳转关联表'; + +-- ---------------------------- +-- Table structure for flow_task +-- ---------------------------- +DROP TABLE IF EXISTS `flow_task`; +CREATE TABLE `flow_task` ( + `id` bigint(20) NOT NULL COMMENT '主键id', + `definition_id` bigint(20) NOT NULL COMMENT '对应flow_definition表的id', + `instance_id` bigint(20) NOT NULL COMMENT '对应flow_instance表的id', + `node_code` varchar(100) NOT NULL COMMENT '节点编码', + `node_name` varchar(100) DEFAULT NULL COMMENT '节点名称', + `node_type` tinyint(1) NOT NULL COMMENT '节点类型(0开始节点 1中间节点 2结束节点 3互斥网关 4并行网关)', + `flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)', + `form_custom` char(1) DEFAULT 'N' COMMENT '审批表单是否自定义(Y是 N否)', + `form_path` varchar(100) DEFAULT NULL COMMENT '审批表单路径', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志', + `tenant_id` varchar(40) DEFAULT NULL COMMENT '租户id', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_definition_id` (`definition_id`), + KEY `idx_instance_id` (`instance_id`), + KEY `idx_node_code` (`node_code`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_del_flag` (`del_flag`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='待办任务表'; + +-- ---------------------------- +-- Table structure for flow_user +-- ---------------------------- +DROP TABLE IF EXISTS `flow_user`; +CREATE TABLE `flow_user` ( + `id` bigint(20) NOT NULL COMMENT '主键id', + `type` char(1) NOT NULL COMMENT '人员类型(1待办任务的审批人权限 2待办任务的转办人权限 3待办任务的委托人权限)', + `processed_by` varchar(80) DEFAULT NULL COMMENT '权限人', + `associated` bigint(20) NOT NULL COMMENT '任务表id', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `create_by` varchar(80) DEFAULT NULL COMMENT '创建人', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志', + `tenant_id` varchar(40) DEFAULT NULL COMMENT '租户id', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_processed_type` (`processed_by`,`type`), + KEY `idx_associated` (`associated`) USING BTREE, + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_del_flag` (`del_flag`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流程用户表'; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/docs/设计文档/database/02-code-generator-module.sql b/docs/设计文档/database/02-code-generator-module.sql new file mode 100644 index 00000000..462d2066 --- /dev/null +++ b/docs/设计文档/database/02-code-generator-module.sql @@ -0,0 +1,81 @@ +/* + 代码生成模块数据库结构 + + 业务域:代码生成器相关表 + 包含表:gen_table, gen_table_column + + 创建时间:2025-01-08 + 维护人员:项目开发团队 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for gen_table +-- ---------------------------- +DROP TABLE IF EXISTS `gen_table`; +CREATE TABLE `gen_table` ( + `table_id` bigint(20) NOT NULL COMMENT '编号', + `data_name` varchar(200) DEFAULT '' COMMENT '数据源名称', + `table_name` varchar(200) DEFAULT '' COMMENT '表名称', + `table_comment` varchar(500) DEFAULT '' COMMENT '表描述', + `sub_table_name` varchar(64) DEFAULT NULL COMMENT '关联子表的表名', + `sub_table_fk_name` varchar(64) DEFAULT NULL COMMENT '子表关联字段名', + `class_name` varchar(100) DEFAULT '' COMMENT '实体类名称', + `tpl_category` varchar(200) DEFAULT 'crud' COMMENT '使用的模板(crud单表操作 tree树表操作)', + `package_name` varchar(100) DEFAULT NULL COMMENT '生成包路径', + `module_name` varchar(30) DEFAULT NULL COMMENT '生成模块名', + `business_name` varchar(30) DEFAULT NULL COMMENT '生成业务名', + `function_name` varchar(50) DEFAULT NULL COMMENT '生成功能名', + `function_author` varchar(50) DEFAULT NULL COMMENT '生成功能作者', + `gen_type` char(1) DEFAULT '0' COMMENT '生成代码方式(0zip压缩包 1自定义路径)', + `gen_path` varchar(200) DEFAULT '/' COMMENT '生成路径(不填默认项目路径)', + `options` varchar(1000) DEFAULT NULL COMMENT '其它生成选项', + `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`table_id`), + KEY `idx_table_name` (`table_name`), + KEY `idx_data_name` (`data_name`), + KEY `idx_create_time` (`create_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='代码生成业务表'; + +-- ---------------------------- +-- Table structure for gen_table_column +-- ---------------------------- +DROP TABLE IF EXISTS `gen_table_column`; +CREATE TABLE `gen_table_column` ( + `column_id` bigint(20) NOT NULL COMMENT '编号', + `table_id` bigint(20) DEFAULT NULL COMMENT '归属表编号', + `column_name` varchar(200) DEFAULT NULL COMMENT '列名称', + `column_comment` varchar(500) DEFAULT NULL COMMENT '列描述', + `column_type` varchar(100) DEFAULT NULL COMMENT '列类型', + `java_type` varchar(500) DEFAULT NULL COMMENT 'JAVA类型', + `java_field` varchar(200) DEFAULT NULL COMMENT 'JAVA字段名', + `is_pk` char(1) DEFAULT NULL COMMENT '是否主键(1是)', + `is_increment` char(1) DEFAULT NULL COMMENT '是否自增(1是)', + `is_required` char(1) DEFAULT NULL COMMENT '是否必填(1是)', + `is_insert` char(1) DEFAULT NULL COMMENT '是否为插入字段(1是)', + `is_edit` char(1) DEFAULT NULL COMMENT '是否编辑字段(1是)', + `is_list` char(1) DEFAULT NULL COMMENT '是否列表字段(1是)', + `is_query` char(1) DEFAULT NULL COMMENT '是否查询字段(1是)', + `query_type` varchar(200) DEFAULT 'EQ' COMMENT '查询方式(等于、不等于、大于、小于、范围)', + `html_type` varchar(200) DEFAULT NULL COMMENT '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)', + `dict_type` varchar(200) DEFAULT '' COMMENT '字典类型', + `sort` int(11) DEFAULT NULL COMMENT '排序', + `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`column_id`), + KEY `idx_table_id` (`table_id`), + KEY `idx_column_name` (`column_name`), + KEY `idx_create_time` (`create_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='代码生成业务表字段'; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/docs/requirements/后勤满意度调查需求/hq_satisfaction_survey_schema.sql b/docs/设计文档/database/03-logistics-module.sql similarity index 52% rename from docs/requirements/后勤满意度调查需求/hq_satisfaction_survey_schema.sql rename to docs/设计文档/database/03-logistics-module.sql index 6b7d3c58..9bb357e0 100644 --- a/docs/requirements/后勤满意度调查需求/hq_satisfaction_survey_schema.sql +++ b/docs/设计文档/database/03-logistics-module.sql @@ -1,14 +1,122 @@ --- ========================================================================== --- 高校后勤满意度调查系统数据库表结构 --- 创建时间:2025年1月 --- 说明:基于需求文档设计的完整数据模型 --- ========================================================================== +/* + 后勤管理模块数据库结构 + + 业务域:后勤管理相关表 + 包含表:hq_hall_info, hq_hall_reservation, hq_sat_answer, hq_sat_category, + hq_sat_detail, hq_sat_option, hq_sat_question, hq_sat_record, + hq_sat_survey, hq_sat_survey_question + + 模块说明: + - 报告厅预约管理:hq_hall_info, hq_hall_reservation + - 满意度调查系统:hq_sat_* 相关表 + + 创建时间:2025-01-08 + 维护人员:项目开发团队 +*/ --- 1. 题目分类表 +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for hq_hall_info +-- ---------------------------- +DROP TABLE IF EXISTS `hq_hall_info`; +CREATE TABLE `hq_hall_info` ( + `id` bigint(20) NOT NULL COMMENT '主键ID', + `tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号', + `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `deleted` tinyint(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)', + `hall_name` varchar(100) NOT NULL COMMENT '报告厅名称', + `hall_image` text COMMENT '报告厅图片url', + `hall_status` char(1) NOT NULL DEFAULT '1' COMMENT '报告厅状态:0-不可用,1-正常', + `hall_description` text COMMENT '报告厅描述', + PRIMARY KEY (`id`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_hall_status` (`hall_status`), + KEY `idx_deleted` (`deleted`), + KEY `idx_create_time` (`create_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='报告厅信息表'; + +-- ---------------------------- +-- Table structure for hq_hall_reservation +-- ---------------------------- +DROP TABLE IF EXISTS `hq_hall_reservation`; +CREATE TABLE `hq_hall_reservation` ( + `id` bigint(20) NOT NULL COMMENT '主键ID', + `tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号', + `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `deleted` tinyint(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)', + `hall_id` bigint(20) NOT NULL COMMENT '报告厅ID,关联hq_hall_info.id', + `hall_name` varchar(100) NOT NULL COMMENT '报告厅名称', + `start_time` datetime NOT NULL COMMENT '开始时间', + `end_time` datetime NOT NULL COMMENT '结束时间', + `reservation_purpose` varchar(200) NOT NULL COMMENT '预约用途', + `applicant_id` bigint(20) NOT NULL COMMENT '申请人id,关联sys_user.id', + `applicant_name` varchar(50) NOT NULL COMMENT '申请人姓名', + `applicant_phone` varchar(20) DEFAULT NULL COMMENT '申请人电话', + `status` char(1) NOT NULL DEFAULT '0' COMMENT '预约状态:0-待审核,1-预约成功,2-预约失败', + `audit_by` bigint(20) DEFAULT NULL COMMENT '审核人id,关联sys_user.id', + `audit_name` varchar(50) DEFAULT NULL COMMENT '审核人姓名', + `audit_time` datetime DEFAULT NULL COMMENT '审核时间', + `audit_remark` varchar(500) DEFAULT NULL COMMENT '审核备注', + PRIMARY KEY (`id`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_hall_id` (`hall_id`), + KEY `idx_status` (`status`), + KEY `idx_applicant_id` (`applicant_id`), + KEY `idx_time_range` (`start_time`,`end_time`), + KEY `idx_deleted` (`deleted`), + KEY `idx_create_time` (`create_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='报告厅预约表'; + +-- ---------------------------- +-- Table structure for hq_sat_answer +-- ---------------------------- +DROP TABLE IF EXISTS `hq_sat_answer`; +CREATE TABLE `hq_sat_answer` ( + `id` bigint(20) NOT NULL COMMENT '主键ID', + `tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号', + `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `deleted` tinyint(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)', + `record_id` bigint(20) NOT NULL COMMENT '答题记录ID,关联hq_sat_record.id', + `question_id` bigint(20) NOT NULL COMMENT '题目ID,关联hq_sat_question.id', + `question_type` char(1) NOT NULL COMMENT '题目类型(1单选题 2多选题 3问答题)', + `option_id` bigint(20) DEFAULT NULL COMMENT '选项ID,关联hq_sat_option.id(单选题、多选题用,问答题为NULL)', + `option_value` varchar(50) DEFAULT NULL COMMENT '选项值(A、B、C、D等)', + `option_text` varchar(500) DEFAULT NULL COMMENT '选项文本内容', + `answer_value` text COMMENT '答案值(单选题存选项值,多选题存逗号分隔选项值,问答题存文本内容)', + `answer_score` int(11) DEFAULT '0' COMMENT '该答案得分', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`id`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_record_id` (`record_id`), + KEY `idx_question_id` (`question_id`), + KEY `idx_question_type` (`question_type`), + KEY `idx_option_id` (`option_id`), + KEY `idx_record_question` (`record_id`,`question_id`), + KEY `idx_deleted` (`deleted`), + KEY `idx_create_time` (`create_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='答题答案表'; + +-- ---------------------------- +-- Table structure for hq_sat_category +-- ---------------------------- DROP TABLE IF EXISTS `hq_sat_category`; CREATE TABLE `hq_sat_category` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `tenant_id` varchar(20) NOT NULL COMMENT '租户编号', + `id` bigint(20) NOT NULL COMMENT '主键ID', + `tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号', `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', `create_time` datetime DEFAULT NULL COMMENT '创建时间', @@ -22,16 +130,48 @@ CREATE TABLE `hq_sat_category` ( `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)', `remark` varchar(500) DEFAULT NULL COMMENT '备注', PRIMARY KEY (`id`), - UNIQUE KEY `uk_category_code` (`category_code`, `tenant_id`, `deleted`), + UNIQUE KEY `uk_category_code` (`category_code`,`tenant_id`,`deleted`), KEY `idx_tenant_id` (`tenant_id`), - KEY `idx_status` (`status`) + KEY `idx_status` (`status`), + KEY `idx_sort_order` (`sort_order`), + KEY `idx_deleted` (`deleted`), + KEY `idx_create_time` (`create_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='题目分类表'; --- 2. 评分选项表 +-- ---------------------------- +-- Table structure for hq_sat_detail +-- ---------------------------- +DROP TABLE IF EXISTS `hq_sat_detail`; +CREATE TABLE `hq_sat_detail` ( + `id` bigint(20) NOT NULL COMMENT '主键ID', + `tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号', + `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `deleted` tinyint(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)', + `record_id` bigint(20) NOT NULL COMMENT '答题记录ID,关联hq_sat_record.id', + `question_id` bigint(20) NOT NULL COMMENT '题目ID,关联hq_sat_question.id', + `answer_score` int(11) DEFAULT '0' COMMENT '答案分数', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_record_question` (`record_id`,`question_id`,`deleted`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_record_id` (`record_id`), + KEY `idx_question_id` (`question_id`), + KEY `idx_answer_score` (`answer_score`), + KEY `idx_deleted` (`deleted`), + KEY `idx_create_time` (`create_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='答题详情表'; + +-- ---------------------------- +-- Table structure for hq_sat_option +-- ---------------------------- DROP TABLE IF EXISTS `hq_sat_option`; CREATE TABLE `hq_sat_option` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `tenant_id` varchar(20) NOT NULL COMMENT '租户编号', + `id` bigint(20) NOT NULL COMMENT '主键ID', + `tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号', `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', `create_time` datetime DEFAULT NULL COMMENT '创建时间', @@ -46,14 +186,18 @@ CREATE TABLE `hq_sat_option` ( PRIMARY KEY (`id`), KEY `idx_tenant_id` (`tenant_id`), KEY `idx_status` (`status`), - KEY `idx_sort_order` (`sort_order`) + KEY `idx_sort_order` (`sort_order`), + KEY `idx_deleted` (`deleted`), + KEY `idx_create_time` (`create_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='评分选项表'; --- 3. 题库表 +-- ---------------------------- +-- Table structure for hq_sat_question +-- ---------------------------- DROP TABLE IF EXISTS `hq_sat_question`; CREATE TABLE `hq_sat_question` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `tenant_id` varchar(20) NOT NULL COMMENT '租户编号', + `id` bigint(20) NOT NULL COMMENT '主键ID', + `tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号', `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', `create_time` datetime DEFAULT NULL COMMENT '创建时间', @@ -62,7 +206,7 @@ CREATE TABLE `hq_sat_question` ( `deleted` tinyint(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)', `question_title` varchar(200) NOT NULL COMMENT '题目标题', `question_content` text COMMENT '题目内容(支持富文本)', - `category_id` bigint(20) NOT NULL COMMENT '所属分类ID', + `category_id` bigint(20) NOT NULL COMMENT '所属分类ID,关联hq_sat_category.id', `question_type` char(1) DEFAULT '1' COMMENT '题目类型(1单选题 2多选题 3问答题)', `is_required` tinyint(1) DEFAULT '1' COMMENT '是否必填(0否 1是)', `sort_order` int(11) DEFAULT '0' COMMENT '排序', @@ -71,14 +215,51 @@ CREATE TABLE `hq_sat_question` ( PRIMARY KEY (`id`), KEY `idx_tenant_id` (`tenant_id`), KEY `idx_category_id` (`category_id`), - KEY `idx_status` (`status`) + KEY `idx_status` (`status`), + KEY `idx_question_type` (`question_type`), + KEY `idx_sort_order` (`sort_order`), + KEY `idx_deleted` (`deleted`), + KEY `idx_create_time` (`create_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='题库表'; --- 4. 问卷表 +-- ---------------------------- +-- Table structure for hq_sat_record +-- ---------------------------- +DROP TABLE IF EXISTS `hq_sat_record`; +CREATE TABLE `hq_sat_record` ( + `id` bigint(20) NOT NULL COMMENT '主键ID', + `tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号', + `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `deleted` tinyint(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)', + `survey_id` bigint(20) NOT NULL COMMENT '问卷ID,关联hq_sat_survey.id', + `user_id` bigint(20) DEFAULT NULL COMMENT '答题用户ID,关联sys_user.id(匿名时为NULL)', + `user_type` char(1) NOT NULL COMMENT '用户类型(1学生 2教职工 3超级管理员)', + `user_dept` varchar(100) DEFAULT NULL COMMENT '用户部门(匿名时为NULL)', + `submit_time` datetime NOT NULL COMMENT '提交时间', + `total_score` decimal(10,2) DEFAULT '0.00' COMMENT '总分', + `avg_score` decimal(5,2) DEFAULT '0.00' COMMENT '平均分', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`id`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_survey_id` (`survey_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_user_type` (`user_type`), + KEY `idx_submit_time` (`submit_time`), + KEY `idx_deleted` (`deleted`), + KEY `idx_create_time` (`create_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='答题记录表'; + +-- ---------------------------- +-- Table structure for hq_sat_survey +-- ---------------------------- DROP TABLE IF EXISTS `hq_sat_survey`; CREATE TABLE `hq_sat_survey` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `tenant_id` varchar(20) NOT NULL COMMENT '租户编号', + `id` bigint(20) NOT NULL COMMENT '主键ID', + `tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号', `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', `create_time` datetime DEFAULT NULL COMMENT '创建时间', @@ -98,214 +279,42 @@ CREATE TABLE `hq_sat_survey` ( `status` char(1) DEFAULT '0' COMMENT '状态(0草稿 1进行中 2已结束)', `remark` varchar(500) DEFAULT NULL COMMENT '备注', PRIMARY KEY (`id`), - UNIQUE KEY `uk_survey_code` (`survey_code`, `tenant_id`, `deleted`), + UNIQUE KEY `uk_survey_code` (`survey_code`,`tenant_id`,`deleted`), KEY `idx_tenant_id` (`tenant_id`), KEY `idx_target_group` (`target_group`), - KEY `idx_time_range` (`start_time`, `end_time`), - KEY `idx_status` (`status`) + KEY `idx_time_range` (`start_time`,`end_time`), + KEY `idx_status` (`status`), + KEY `idx_deleted` (`deleted`), + KEY `idx_create_time` (`create_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='问卷表'; --- 5. 问卷题目关联表 +-- ---------------------------- +-- Table structure for hq_sat_survey_question +-- ---------------------------- DROP TABLE IF EXISTS `hq_sat_survey_question`; CREATE TABLE `hq_sat_survey_question` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `tenant_id` varchar(20) NOT NULL COMMENT '租户编号', + `id` bigint(20) NOT NULL COMMENT '主键ID', + `tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号', `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', `update_time` datetime DEFAULT NULL COMMENT '更新时间', `deleted` tinyint(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)', - `survey_id` bigint(20) NOT NULL COMMENT '问卷ID', - `question_id` bigint(20) NOT NULL COMMENT '题目ID', + `survey_id` bigint(20) NOT NULL COMMENT '问卷ID,关联hq_sat_survey.id', + `question_id` bigint(20) NOT NULL COMMENT '题目ID,关联hq_sat_question.id', `sort_order` int(11) DEFAULT '0' COMMENT '题目顺序', `weight` decimal(5,2) DEFAULT '1.00' COMMENT '题目权重', `is_required` tinyint(1) DEFAULT '1' COMMENT '是否必填(0否 1是)', `remark` varchar(500) DEFAULT NULL COMMENT '备注', PRIMARY KEY (`id`), - UNIQUE KEY `uk_survey_question` (`survey_id`, `question_id`, `deleted`), + UNIQUE KEY `uk_survey_question` (`survey_id`,`question_id`,`deleted`), KEY `idx_tenant_id` (`tenant_id`), KEY `idx_survey_id` (`survey_id`), KEY `idx_question_id` (`question_id`), - KEY `idx_sort_order` (`sort_order`) + KEY `idx_sort_order` (`sort_order`), + KEY `idx_deleted` (`deleted`), + KEY `idx_create_time` (`create_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='问卷题目关联表'; --- 6. 答题记录表 -DROP TABLE IF EXISTS `hq_sat_record`; -CREATE TABLE `hq_sat_record` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `tenant_id` varchar(20) NOT NULL COMMENT '租户编号', - `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', - `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `deleted` tinyint(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)', - `survey_id` bigint(20) NOT NULL COMMENT '问卷ID', - `user_id` bigint(20) DEFAULT NULL COMMENT '答题用户ID(匿名时为NULL)', - `user_type` char(1) NOT NULL COMMENT '用户类型(1学生 2教职工 3超级管理员)', - `user_dept` varchar(100) DEFAULT NULL COMMENT '用户部门(匿名时为NULL)', - `submit_time` datetime NOT NULL COMMENT '提交时间', - `total_score` decimal(10,2) DEFAULT '0.00' COMMENT '总分', - `avg_score` decimal(5,2) DEFAULT '0.00' COMMENT '平均分', - `remark` varchar(500) DEFAULT NULL COMMENT '备注', - PRIMARY KEY (`id`), - KEY `idx_tenant_id` (`tenant_id`), - KEY `idx_survey_id` (`survey_id`), - KEY `idx_user_id` (`user_id`), - KEY `idx_user_type` (`user_type`), - KEY `idx_submit_time` (`submit_time`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='答题记录表'; - --- 7. 答题详情表 -DROP TABLE IF EXISTS `hq_sat_detail`; -CREATE TABLE `hq_sat_detail` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `tenant_id` varchar(20) NOT NULL COMMENT '租户编号', - `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', - `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `deleted` tinyint(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)', - `record_id` bigint(20) NOT NULL COMMENT '答题记录ID', - `question_id` bigint(20) NOT NULL COMMENT '题目ID', - `answer_score` int(11) DEFAULT '0' COMMENT '答案分数', - `remark` varchar(500) DEFAULT NULL COMMENT '备注', - PRIMARY KEY (`id`), - UNIQUE KEY `uk_record_question` (`record_id`, `question_id`, `deleted`), - KEY `idx_tenant_id` (`tenant_id`), - KEY `idx_record_id` (`record_id`), - KEY `idx_question_id` (`question_id`), - KEY `idx_answer_score` (`answer_score`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='答题详情表'; - --- ========================================== --- 答题答案表(新增) --- ========================================== -DROP TABLE IF EXISTS `hq_sat_answer`; -CREATE TABLE `hq_sat_answer` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `tenant_id` varchar(20) NOT NULL COMMENT '租户编号', - `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', - `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `deleted` tinyint(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)', - `record_id` bigint(20) NOT NULL COMMENT '答题记录ID', - `question_id` bigint(20) NOT NULL COMMENT '题目ID', - `question_type` char(1) NOT NULL COMMENT '题目类型(1单选题 2多选题 3问答题)', - `option_id` bigint(20) DEFAULT NULL COMMENT '选项ID(单选题、多选题用,问答题为NULL)', - `option_value` varchar(50) DEFAULT NULL COMMENT '选项值(A、B、C、D等)', - `option_text` varchar(500) DEFAULT NULL COMMENT '选项文本内容', - `answer_value` text COMMENT '答案值(单选题存选项值,多选题存逗号分隔选项值,问答题存文本内容)', - `answer_score` int(11) DEFAULT '0' COMMENT '该答案得分', - `remark` varchar(500) DEFAULT NULL COMMENT '备注', - PRIMARY KEY (`id`), - KEY `idx_tenant_id` (`tenant_id`), - KEY `idx_record_id` (`record_id`), - KEY `idx_question_id` (`question_id`), - KEY `idx_question_type` (`question_type`), - KEY `idx_option_id` (`option_id`), - KEY `idx_record_question` (`record_id`, `question_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='答题答案表'; - --- ========================================== --- 数据表索引和约束说明 --- ========================================== -/* -hq_sat_answer 表设计说明: - -1. 表用途: - - 记录用户答题的具体答案内容 - - 支持单选题、多选题、问答题三种题型 - - 与 hq_sat_detail 表配合使用,detail表记录总体信息,answer表记录具体答案 - -2. 字段说明: - - question_type:题目类型,便于按类型统计分析 - - option_id:选项ID,单选题和多选题需要关联到具体选项 - - option_value:选项值(如A、B、C、D),便于统计 - - option_text:选项文本,冗余存储便于查询 - - answer_value:核心字段,存储实际答案: - * 单选题:存储选中的选项值,如 "A" - * 多选题:存储多个选项值,如 "A,C,D" - * 问答题:存储用户输入的文本内容 - - answer_score:该答案的得分 - -3. 数据存储示例: - - 单选题:question_type='1', option_id=123, option_value='A', option_text='非常满意', answer_value='A', answer_score=5 - - 多选题:每个选中选项一条记录,或合并为一条记录存储 "A,C,D" - - 问答题:question_type='3', option_id=NULL, answer_value='用户输入的文本内容', answer_score=0 - -4. 与其他表的关系: - - record_id 关联 hq_sat_record.id - - question_id 关联 hq_sat_question.id - - option_id 关联 hq_sat_option.id(问答题为NULL) - -5. 查询优化: - - 建立复合索引 (record_id, question_id) 提高关联查询效率 - - 按题目类型、选项等建立索引便于统计分析 -*/ - --- ========================================================================== --- 初始化数据 --- ========================================================================== - --- 初始化题目分类数据 -INSERT INTO `hq_sat_category` (`tenant_id`, `category_code`, `category_name`, `category_desc`, `sort_order`, `status`, `create_time`) VALUES -('000000', 'BEDROOM', '寝室服务', '宿舍设施、卫生清洁、安全管理等相关服务', 1, '0', NOW()), -('000000', 'CANTEEN', '食堂服务', '菜品质量、价格、卫生环境等相关服务', 2, '0', NOW()), -('000000', 'ENVIRONMENT', '环境服务', '校园绿化、道路维护、垃圾处理等相关服务', 3, '0', NOW()), -('000000', 'MAINTENANCE', '维修服务', '设备维修、响应时间、服务态度等相关服务', 4, '0', NOW()), -('000000', 'SECURITY', '保安服务', '校园安全、门禁管理、巡逻质量等相关服务', 5, '0', NOW()), -('000000', 'OTHER', '其他服务', '其他后勤相关服务', 6, '0', NOW()); - --- 初始化评分选项数据 -INSERT INTO `hq_sat_option` (`tenant_id`, `option_text`, `option_value`, `sort_order`, `status`, `create_time`) VALUES -('000000', '非常满意', 5, 1, '0', NOW()), -('000000', '满意', 3, 2, '0', NOW()), -('000000', '一般', 1, 3, '0', NOW()), -('000000', '不满意', 0, 4, '0', NOW()); - --- ========================================================================== --- 索引优化建议 --- ========================================================================== - --- 为提高查询性能,建议根据实际使用情况添加以下组合索引: - --- 问卷查询相关 --- ALTER TABLE hq_sat_survey ADD INDEX idx_time_status (start_time, end_time, status); --- ALTER TABLE hq_sat_survey ADD INDEX idx_target_published (target_group, is_published); - --- 答题记录查询相关 --- ALTER TABLE hq_sat_record ADD INDEX idx_survey_user (survey_id, user_id, status); --- ALTER TABLE hq_sat_record ADD INDEX idx_survey_time (survey_id, submit_time); - --- 统计分析相关 --- ALTER TABLE hq_sat_detail ADD INDEX idx_question_score (question_id, answer_score); --- ALTER TABLE hq_sat_statistics ADD INDEX idx_survey_category (survey_id, category_id, user_type); - --- ========================================================================== --- 视图创建建议 --- ========================================================================== - --- 创建问卷概览视图 --- CREATE VIEW v_hq_sat_survey_overview AS --- SELECT --- s.id, s.survey_title, s.target_group, s.start_time, s.end_time, s.status, --- s.total_questions, s.total_participants, s.total_submissions, --- ROUND(s.total_submissions * 100.0 / NULLIF(s.total_participants, 0), 2) AS completion_rate --- FROM hq_sat_survey s --- WHERE s.deleted = 0; - --- 创建分类满意度统计视图 --- CREATE VIEW v_hq_sat_category_satisfaction AS --- SELECT --- st.survey_id, c.category_name, st.user_type, --- st.total_count, st.avg_score, --- ROUND(st.score_5_count * 100.0 / NULLIF(st.total_count, 0), 2) AS very_satisfied_rate, --- ROUND((st.score_5_count + st.score_3_count) * 100.0 / NULLIF(st.total_count, 0), 2) AS satisfied_rate --- FROM hq_sat_statistics st --- LEFT JOIN hq_sat_category c ON st.category_id = c.id --- WHERE st.deleted = 0 AND st.category_id IS NOT NULL; \ No newline at end of file +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/docs/设计文档/database/04-job-scheduler-module.sql b/docs/设计文档/database/04-job-scheduler-module.sql new file mode 100644 index 00000000..249a2680 --- /dev/null +++ b/docs/设计文档/database/04-job-scheduler-module.sql @@ -0,0 +1,286 @@ + /* + 任务调度模块数据库结构 + + 业务域:SnailJob任务调度相关表 + 包含表:sj_distributed_lock, sj_group_config, sj_namespace_config, + sj_notify_config, sj_retry_dead_letter, sj_retry_summary, + sj_retry_task, sj_retry_task_log, sj_server_node, + sj_system_user_permission, sj_workflow_node, sj_workflow_task_batch + + 创建时间:2025-01-08 + 维护人员:项目开发团队 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for sj_distributed_lock +-- ---------------------------- +DROP TABLE IF EXISTS `sj_distributed_lock`; +CREATE TABLE `sj_distributed_lock` ( + `name` varchar(64) NOT NULL COMMENT '锁名称', + `lock_until` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '锁定时长', + `locked_at` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '锁定时间', + `locked_by` varchar(255) NOT NULL COMMENT '锁定者', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='锁定表'; + +-- ---------------------------- +-- Table structure for sj_group_config +-- ---------------------------- +DROP TABLE IF EXISTS `sj_group_config`; +CREATE TABLE `sj_group_config` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `namespace_id` varchar(64) NOT NULL COMMENT '命名空间id', + `group_name` varchar(64) NOT NULL COMMENT '组名称', + `description` varchar(256) DEFAULT NULL COMMENT '描述', + `group_status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '组状态 0、关闭 1、开启', + `version` int(11) NOT NULL DEFAULT '1' COMMENT '版本号', + `group_partition` int(11) DEFAULT '0' COMMENT '分区', + `init_scene` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否初始化场景 0、关闭 1、开启', + `bucket_index` tinyint(4) NOT NULL DEFAULT '0' COMMENT 'bucket索引', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_namespace_group_partition` (`namespace_id`,`group_name`,`group_partition`), + KEY `idx_namespace_id` (`namespace_id`), + KEY `idx_group_name` (`group_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='组配置'; + +-- ---------------------------- +-- Table structure for sj_namespace_config +-- ---------------------------- +DROP TABLE IF EXISTS `sj_namespace_config`; +CREATE TABLE `sj_namespace_config` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(64) NOT NULL COMMENT '命名空间名称', + `unique_id` varchar(64) NOT NULL COMMENT '唯一id', + `description` varchar(256) DEFAULT NULL COMMENT '描述', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_unique_id` (`unique_id`), + UNIQUE KEY `uk_name` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='命名空间'; + +-- ---------------------------- +-- Table structure for sj_notify_config +-- ---------------------------- +DROP TABLE IF EXISTS `sj_notify_config`; +CREATE TABLE `sj_notify_config` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `namespace_id` varchar(64) NOT NULL DEFAULT '' COMMENT '命名空间id', + `group_name` varchar(64) NOT NULL DEFAULT '' COMMENT '组名称', + `business_id` varchar(64) NOT NULL COMMENT '业务id', + `notify_status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '通知状态 0、关闭 1、开启', + `notify_type` tinyint(4) NOT NULL COMMENT '通知类型', + `notify_attribute` text NOT NULL COMMENT '配置属性', + `notify_threshold` int(11) DEFAULT '100' COMMENT '通知阈值', + `notify_scene` tinyint(4) NOT NULL COMMENT '通知场景', + `rate_limiter_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '限流状态 0、关闭 1、开启', + `rate_limiter_threshold` int(11) NOT NULL DEFAULT '20' COMMENT '限流阈值', + `description` varchar(256) DEFAULT '' COMMENT '描述', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_namespace_group_business_type_scene` (`namespace_id`,`group_name`,`business_id`,`notify_type`,`notify_scene`), + KEY `idx_namespace_id` (`namespace_id`), + KEY `idx_group_name` (`group_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='通知配置'; + +-- ---------------------------- +-- Table structure for sj_retry_dead_letter +-- ---------------------------- +DROP TABLE IF EXISTS `sj_retry_dead_letter`; +CREATE TABLE `sj_retry_dead_letter` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `namespace_id` varchar(64) NOT NULL COMMENT '命名空间id', + `unique_id` varchar(64) NOT NULL COMMENT '同组下id唯一', + `group_name` varchar(64) NOT NULL COMMENT '组名称', + `scene_name` varchar(64) NOT NULL COMMENT '场景名称', + `idempotent_id` varchar(64) NOT NULL COMMENT '幂等id', + `biz_no` varchar(64) NOT NULL DEFAULT '' COMMENT '业务编号', + `executor_name` varchar(512) NOT NULL COMMENT '执行器名称', + `args_str` text COMMENT '执行方法参数', + `ext_attrs` varchar(256) DEFAULT '' COMMENT '扩展字段', + `task_type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '任务类型 1、重试数据 2、回调数据', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_namespace_group_scene_idempotent` (`namespace_id`,`group_name`,`scene_name`,`idempotent_id`), + KEY `idx_namespace_id` (`namespace_id`), + KEY `idx_group_name` (`group_name`), + KEY `idx_scene_name` (`scene_name`), + KEY `idx_create_dt` (`create_dt`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='死信队列'; + +-- ---------------------------- +-- Table structure for sj_retry_summary +-- ---------------------------- +DROP TABLE IF EXISTS `sj_retry_summary`; +CREATE TABLE `sj_retry_summary` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `namespace_id` varchar(64) NOT NULL COMMENT '命名空间id', + `group_name` varchar(64) NOT NULL COMMENT '组名称', + `scene_name` varchar(64) NOT NULL COMMENT '场景名称', + `trigger_date` date NOT NULL COMMENT '统计日期', + `running_num` int(11) NOT NULL DEFAULT '0' COMMENT '重试中', + `finish_num` int(11) NOT NULL DEFAULT '0' COMMENT '重试完成数量', + `max_count_num` int(11) NOT NULL DEFAULT '0' COMMENT '重试到达最大次数', + `suspend_num` int(11) NOT NULL DEFAULT '0' COMMENT '暂停数量', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_namespace_group_scene_date` (`namespace_id`,`group_name`,`scene_name`,`trigger_date`), + KEY `idx_namespace_id` (`namespace_id`), + KEY `idx_group_name` (`group_name`), + KEY `idx_scene_name` (`scene_name`), + KEY `idx_trigger_date` (`trigger_date`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='任务重试汇总统计表'; + +-- ---------------------------- +-- Table structure for sj_retry_task +-- ---------------------------- +DROP TABLE IF EXISTS `sj_retry_task`; +CREATE TABLE `sj_retry_task` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `namespace_id` varchar(64) NOT NULL COMMENT '命名空间id', + `unique_id` varchar(64) NOT NULL COMMENT '同组下id唯一', + `group_name` varchar(64) NOT NULL COMMENT '组名称', + `scene_name` varchar(64) NOT NULL COMMENT '场景名称', + `idempotent_id` varchar(64) NOT NULL COMMENT '幂等id', + `biz_no` varchar(64) NOT NULL DEFAULT '' COMMENT '业务编号', + `executor_name` varchar(512) NOT NULL COMMENT '执行器名称', + `args_str` text COMMENT '执行方法参数', + `ext_attrs` varchar(256) DEFAULT '' COMMENT '扩展字段', + `next_trigger_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '下次触发时间', + `retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '重试次数', + `retry_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '重试状态 0、重试中 1、成功 2、最大次数', + `task_type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '任务类型 1、重试数据 2、回调数据', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_namespace_group_scene_idempotent` (`namespace_id`,`group_name`,`scene_name`,`idempotent_id`), + KEY `idx_namespace_id` (`namespace_id`), + KEY `idx_group_name` (`group_name`), + KEY `idx_scene_name` (`scene_name`), + KEY `idx_next_trigger_at` (`next_trigger_at`), + KEY `idx_retry_status` (`retry_status`), + KEY `idx_create_dt` (`create_dt`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='任务信息'; + +-- ---------------------------- +-- Table structure for sj_retry_task_log +-- ---------------------------- +DROP TABLE IF EXISTS `sj_retry_task_log`; +CREATE TABLE `sj_retry_task_log` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `namespace_id` varchar(64) NOT NULL COMMENT '命名空间id', + `unique_id` varchar(64) NOT NULL COMMENT '同组下id唯一', + `group_name` varchar(64) NOT NULL COMMENT '组名称', + `scene_name` varchar(64) NOT NULL COMMENT '场景名称', + `idempotent_id` varchar(64) NOT NULL COMMENT '幂等id', + `biz_no` varchar(64) NOT NULL DEFAULT '' COMMENT '业务编号', + `executor_name` varchar(512) NOT NULL COMMENT '执行器名称', + `args_str` text COMMENT '执行方法参数', + `ext_attrs` varchar(256) DEFAULT '' COMMENT '扩展字段', + `retry_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '重试状态 0、重试中 1、成功 2、最大次数', + `task_type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '任务类型 1、重试数据 2、回调数据', + `real_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '真实触发时间', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + KEY `idx_namespace_id` (`namespace_id`), + KEY `idx_group_name` (`group_name`), + KEY `idx_scene_name` (`scene_name`), + KEY `idx_idempotent_id` (`idempotent_id`), + KEY `idx_create_dt` (`create_dt`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='重试日志'; + +-- ---------------------------- +-- Table structure for sj_server_node +-- ---------------------------- +DROP TABLE IF EXISTS `sj_server_node`; +CREATE TABLE `sj_server_node` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `namespace_id` varchar(64) NOT NULL COMMENT '命名空间id', + `group_name` varchar(64) NOT NULL COMMENT '组名称', + `host_id` varchar(64) NOT NULL COMMENT '主机id', + `host_ip` varchar(64) NOT NULL COMMENT '主机ip', + `host_port` int(11) NOT NULL COMMENT '主机端口', + `expire_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '过期时间', + `node_type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '节点类型 1、客户端 2、服务端', + `ext_attrs` varchar(256) DEFAULT '' COMMENT '扩展字段', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_namespace_group_host` (`namespace_id`,`group_name`,`host_id`), + KEY `idx_namespace_id` (`namespace_id`), + KEY `idx_group_name` (`group_name`), + KEY `idx_expire_at` (`expire_at`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='服务器节点'; + +-- ---------------------------- +-- Table structure for sj_system_user_permission +-- ---------------------------- +DROP TABLE IF EXISTS `sj_system_user_permission`; +CREATE TABLE `sj_system_user_permission` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `group_name` varchar(64) NOT NULL COMMENT '组名称', + `namespace_id` varchar(64) NOT NULL COMMENT '命名空间id', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + KEY `idx_group_name` (`group_name`), + KEY `idx_namespace_id` (`namespace_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统用户权限表'; + +-- ---------------------------- +-- Table structure for sj_workflow_node +-- ---------------------------- +DROP TABLE IF EXISTS `sj_workflow_node`; +CREATE TABLE `sj_workflow_node` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `namespace_id` varchar(64) NOT NULL COMMENT '命名空间id', + `workflow_id` bigint(20) unsigned NOT NULL COMMENT '工作流id', + `node_name` varchar(64) NOT NULL COMMENT '节点名称', + `node_type` tinyint(4) NOT NULL COMMENT '节点类型 1、任务节点 2、条件节点 3、回调节点', + `job_id` bigint(20) unsigned DEFAULT NULL COMMENT '关联的任务id', + `expression_type` tinyint(4) DEFAULT NULL COMMENT '表达式类型 1、SpEL 2、Aviator 3、QL', + `expression` varchar(256) DEFAULT NULL COMMENT '条件节点的表达式', + `fail_strategy` tinyint(4) NOT NULL DEFAULT '1' COMMENT '失败策略 1、跳过 2、阻塞', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + KEY `idx_workflow_id` (`workflow_id`), + KEY `idx_namespace_id` (`namespace_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='工作流节点'; + +-- ---------------------------- +-- Table structure for sj_workflow_task_batch +-- ---------------------------- +DROP TABLE IF EXISTS `sj_workflow_task_batch`; +CREATE TABLE `sj_workflow_task_batch` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `namespace_id` varchar(64) NOT NULL COMMENT '命名空间id', + `workflow_id` bigint(20) unsigned NOT NULL COMMENT '工作流id', + `task_batch_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '任务批次状态 0、运行中 1、成功 2、失败 3、取消 4、暂停', + `operation_reason` tinyint(4) NOT NULL DEFAULT '0' COMMENT '操作原因 0、系统触发 1、人工操作', + `workflow_task_batch_id` bigint(20) unsigned NOT NULL COMMENT '工作流任务批次id', + `execution_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '执行时间', + `flow_info` text COMMENT '流程信息', + `ext_attrs` varchar(256) DEFAULT NULL COMMENT '扩展字段', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + `deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '逻辑删除 1、删除', + PRIMARY KEY (`id`), + KEY `idx_workflow_id` (`workflow_id`), + KEY `idx_namespace_id` (`namespace_id`), + KEY `idx_execution_at` (`execution_at`), + KEY `idx_task_batch_status` (`task_batch_status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='工作流任务批次'; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/docs/设计文档/database/05-system-management-module.sql b/docs/设计文档/database/05-system-management-module.sql new file mode 100644 index 00000000..891a024e --- /dev/null +++ b/docs/设计文档/database/05-system-management-module.sql @@ -0,0 +1,539 @@ +/* + 系统管理模块数据库结构 + + 业务域:系统管理相关表 + 包含表:sys_client, sys_config, sys_dept, sys_dict_data, sys_dict_type, + sys_logininfor, sys_menu, sys_notice, sys_oper_log, sys_oss, + sys_oss_config, sys_post, sys_role, sys_role_dept, sys_role_menu, + sys_social, sys_tenant, sys_tenant_package, sys_user, sys_user_post, + sys_user_role + + 创建时间:2025-01-08 + 维护人员:项目开发团队 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for sys_client +-- ---------------------------- +DROP TABLE IF EXISTS `sys_client`; +CREATE TABLE `sys_client` ( + `id` bigint(20) NOT NULL COMMENT 'id', + `client_id` varchar(64) DEFAULT NULL COMMENT '客户端id', + `client_key` varchar(32) DEFAULT NULL COMMENT '客户端key', + `client_secret` varchar(255) DEFAULT NULL COMMENT '客户端秘钥', + `grant_type` varchar(255) DEFAULT NULL COMMENT '授权类型', + `device_type` varchar(32) DEFAULT NULL COMMENT '设备类型', + `active_timeout` int(11) DEFAULT '1800' COMMENT 'token活跃超时时间', + `timeout` int(11) DEFAULT '604800' COMMENT 'token固定超时', + `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)', + `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_client_id` (`client_id`), + KEY `idx_client_key` (`client_key`), + KEY `idx_status` (`status`), + KEY `idx_del_flag` (`del_flag`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统授权表'; + +-- ---------------------------- +-- Table structure for sys_config +-- ---------------------------- +DROP TABLE IF EXISTS `sys_config`; +CREATE TABLE `sys_config` ( + `config_id` bigint(20) NOT NULL COMMENT '参数主键', + `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', + `config_name` varchar(100) DEFAULT '' COMMENT '参数名称', + `config_key` varchar(100) DEFAULT '' COMMENT '参数键名', + `config_value` varchar(500) DEFAULT '' COMMENT '参数键值', + `config_type` char(1) DEFAULT 'N' COMMENT '系统内置(Y是 N否)', + `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`config_id`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_config_key` (`config_key`), + KEY `idx_config_type` (`config_type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='参数配置表'; + +-- ---------------------------- +-- Table structure for sys_dept +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dept`; +CREATE TABLE `sys_dept` ( + `dept_id` bigint(20) NOT NULL COMMENT '部门id', + `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', + `parent_id` bigint(20) DEFAULT '0' COMMENT '父部门id', + `ancestors` varchar(500) DEFAULT '' COMMENT '祖级列表', + `dept_name` varchar(30) DEFAULT '' COMMENT '部门名称', + `dept_category` varchar(100) DEFAULT NULL COMMENT '部门类别编码', + `order_num` int(4) DEFAULT '0' COMMENT '显示顺序', + `leader` bigint(20) DEFAULT NULL COMMENT '负责人,关联sys_user.user_id', + `phone` varchar(11) DEFAULT NULL COMMENT '联系电话', + `email` varchar(50) DEFAULT NULL COMMENT '邮箱', + `status` char(1) DEFAULT '0' COMMENT '部门状态(0正常 1停用)', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)', + `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`dept_id`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_parent_id` (`parent_id`), + KEY `idx_status` (`status`), + KEY `idx_del_flag` (`del_flag`), + KEY `idx_leader` (`leader`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='部门表'; + +-- ---------------------------- +-- Table structure for sys_dict_data +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dict_data`; +CREATE TABLE `sys_dict_data` ( + `dict_code` bigint(20) NOT NULL COMMENT '字典编码', + `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', + `dict_sort` int(4) DEFAULT '0' COMMENT '字典排序', + `dict_label` varchar(100) DEFAULT '' COMMENT '字典标签', + `dict_value` varchar(100) DEFAULT '' COMMENT '字典键值', + `dict_type` varchar(100) DEFAULT '' COMMENT '字典类型', + `css_class` varchar(100) DEFAULT NULL COMMENT '样式属性(其他样式扩展)', + `list_class` varchar(100) DEFAULT NULL COMMENT '表格回显样式', + `is_default` char(1) DEFAULT 'N' COMMENT '是否默认(Y是 N否)', + `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`dict_code`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_dict_type` (`dict_type`), + KEY `idx_dict_value` (`dict_value`), + KEY `idx_dict_sort` (`dict_sort`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='字典数据表'; + +-- ---------------------------- +-- Table structure for sys_dict_type +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dict_type`; +CREATE TABLE `sys_dict_type` ( + `dict_id` bigint(20) NOT NULL COMMENT '字典主键', + `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', + `dict_name` varchar(100) DEFAULT '' COMMENT '字典名称', + `dict_type` varchar(100) DEFAULT '' COMMENT '字典类型', + `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`dict_id`), + UNIQUE KEY `tenant_id` (`tenant_id`,`dict_type`), + KEY `idx_dict_type` (`dict_type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='字典类型表'; + +-- ---------------------------- +-- Table structure for sys_logininfor +-- ---------------------------- +DROP TABLE IF EXISTS `sys_logininfor`; +CREATE TABLE `sys_logininfor` ( + `info_id` bigint(20) NOT NULL COMMENT '访问ID', + `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', + `user_name` varchar(50) DEFAULT '' COMMENT '用户账号', + `client_key` varchar(32) DEFAULT '' COMMENT '客户端', + `device_type` varchar(32) DEFAULT '' COMMENT '设备类型', + `ipaddr` varchar(128) DEFAULT '' COMMENT '登录IP地址', + `login_location` varchar(255) DEFAULT '' COMMENT '登录地点', + `browser` varchar(50) DEFAULT '' COMMENT '浏览器类型', + `os` varchar(50) DEFAULT '' COMMENT '操作系统', + `status` char(1) DEFAULT '0' COMMENT '登录状态(0成功 1失败)', + `msg` varchar(255) DEFAULT '' COMMENT '提示消息', + `login_time` datetime DEFAULT NULL COMMENT '访问时间', + PRIMARY KEY (`info_id`), + KEY `idx_sys_logininfor_s` (`status`), + KEY `idx_sys_logininfor_lt` (`login_time`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_user_name` (`user_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统访问记录'; + +-- ---------------------------- +-- Table structure for sys_menu +-- ---------------------------- +DROP TABLE IF EXISTS `sys_menu`; +CREATE TABLE `sys_menu` ( + `menu_id` bigint(20) NOT NULL COMMENT '菜单ID', + `menu_name` varchar(50) NOT NULL COMMENT '菜单名称', + `parent_id` bigint(20) DEFAULT '0' COMMENT '父菜单ID', + `order_num` int(4) DEFAULT '0' COMMENT '显示顺序', + `path` varchar(200) DEFAULT '' COMMENT '路由地址', + `component` varchar(255) DEFAULT NULL COMMENT '组件路径', + `query_param` varchar(255) DEFAULT NULL COMMENT '路由参数', + `is_frame` int(1) DEFAULT '1' COMMENT '是否为外链(0是 1否)', + `is_cache` int(1) DEFAULT '0' COMMENT '是否缓存(0缓存 1不缓存)', + `menu_type` char(1) DEFAULT '' COMMENT '菜单类型(M目录 C菜单 F按钮)', + `visible` char(1) DEFAULT '0' COMMENT '显示状态(0显示 1隐藏)', + `status` char(1) DEFAULT '0' COMMENT '菜单状态(0正常 1停用)', + `perms` varchar(100) DEFAULT NULL COMMENT '权限标识', + `icon` varchar(100) DEFAULT '#' COMMENT '菜单图标', + `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) DEFAULT '' COMMENT '备注', + PRIMARY KEY (`menu_id`), + KEY `idx_parent_id` (`parent_id`), + KEY `idx_menu_type` (`menu_type`), + KEY `idx_status` (`status`), + KEY `idx_visible` (`visible`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='菜单权限表'; + +-- ---------------------------- +-- Table structure for sys_notice +-- ---------------------------- +DROP TABLE IF EXISTS `sys_notice`; +CREATE TABLE `sys_notice` ( + `notice_id` bigint(20) NOT NULL COMMENT '公告ID', + `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', + `notice_title` varchar(50) NOT NULL COMMENT '公告标题', + `notice_type` char(1) NOT NULL COMMENT '公告类型(1通知 2公告)', + `notice_content` longblob COMMENT '公告内容', + `status` char(1) DEFAULT '0' COMMENT '公告状态(0正常 1关闭)', + `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `remark` varchar(255) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`notice_id`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_notice_type` (`notice_type`), + KEY `idx_status` (`status`), + KEY `idx_create_time` (`create_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='通知公告表'; + +-- ---------------------------- +-- Table structure for sys_oper_log +-- ---------------------------- +DROP TABLE IF EXISTS `sys_oper_log`; +CREATE TABLE `sys_oper_log` ( + `oper_id` bigint(20) NOT NULL COMMENT '日志主键', + `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', + `title` varchar(50) DEFAULT '' COMMENT '模块标题', + `business_type` int(2) DEFAULT '0' COMMENT '业务类型(0其它 1新增 2修改 3删除)', + `method` varchar(200) DEFAULT '' COMMENT '方法名称', + `request_method` varchar(10) DEFAULT '' COMMENT '请求方式', + `operator_type` int(1) DEFAULT '0' COMMENT '操作类别(0其它 1后台用户 2手机端用户)', + `oper_name` varchar(50) DEFAULT '' COMMENT '操作人员', + `dept_name` varchar(50) DEFAULT '' COMMENT '部门名称', + `oper_url` varchar(255) DEFAULT '' COMMENT '请求URL', + `oper_ip` varchar(128) DEFAULT '' COMMENT '主机地址', + `oper_location` varchar(255) DEFAULT '' COMMENT '操作地点', + `oper_param` varchar(2000) DEFAULT '' COMMENT '请求参数', + `json_result` varchar(2000) DEFAULT '' COMMENT '返回参数', + `status` int(1) DEFAULT '0' COMMENT '操作状态(0正常 1异常)', + `error_msg` varchar(2000) DEFAULT '' COMMENT '错误消息', + `oper_time` datetime DEFAULT NULL COMMENT '操作时间', + `cost_time` bigint(20) DEFAULT '0' COMMENT '消耗时间', + PRIMARY KEY (`oper_id`), + KEY `idx_sys_oper_log_bt` (`business_type`), + KEY `idx_sys_oper_log_s` (`status`), + KEY `idx_sys_oper_log_ot` (`oper_time`), + KEY `idx_tenant_id` (`tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='操作日志记录'; + +-- ---------------------------- +-- Table structure for sys_oss +-- ---------------------------- +DROP TABLE IF EXISTS `sys_oss`; +CREATE TABLE `sys_oss` ( + `oss_id` bigint(20) NOT NULL COMMENT '对象存储主键', + `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', + `file_name` varchar(255) NOT NULL DEFAULT '' COMMENT '文件名', + `original_name` varchar(255) NOT NULL DEFAULT '' COMMENT '原名', + `file_suffix` varchar(10) NOT NULL DEFAULT '' COMMENT '文件后缀名', + `url` varchar(500) NOT NULL COMMENT 'URL地址', + `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `create_by` bigint(20) DEFAULT NULL COMMENT '上传人', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `update_by` bigint(20) DEFAULT NULL COMMENT '更新人', + `service` varchar(20) NOT NULL DEFAULT 'minio' COMMENT '服务商', + PRIMARY KEY (`oss_id`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_file_name` (`file_name`), + KEY `idx_create_time` (`create_time`), + KEY `idx_service` (`service`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='OSS对象存储表'; + +-- ---------------------------- +-- Table structure for sys_oss_config +-- ---------------------------- +DROP TABLE IF EXISTS `sys_oss_config`; +CREATE TABLE `sys_oss_config` ( + `oss_config_id` bigint(20) NOT NULL COMMENT '主建', + `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', + `config_key` varchar(20) NOT NULL DEFAULT '' COMMENT '配置key', + `access_key` varchar(255) DEFAULT '' COMMENT 'accessKey', + `secret_key` varchar(255) DEFAULT '' COMMENT '秘钥', + `bucket_name` varchar(255) DEFAULT '' COMMENT '桶名称', + `prefix` varchar(255) DEFAULT '' COMMENT '前缀', + `endpoint` varchar(255) DEFAULT '' COMMENT '访问站点', + `domain` varchar(255) DEFAULT '' COMMENT '自定义域名', + `is_https` char(1) DEFAULT 'N' COMMENT '是否https(Y=是,N=否)', + `region` varchar(255) DEFAULT '' COMMENT '域', + `access_policy` char(1) NOT NULL DEFAULT '1' COMMENT '桶权限类型(0=private 1=public 2=custom)', + `status` char(1) DEFAULT '1' COMMENT '是否默认(0=是,1=否)', + `ext1` varchar(255) DEFAULT '' COMMENT '扩展字段', + `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`oss_config_id`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_config_key` (`config_key`), + KEY `idx_status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='对象存储配置表'; + +-- ---------------------------- +-- Table structure for sys_post +-- ---------------------------- +DROP TABLE IF EXISTS `sys_post`; +CREATE TABLE `sys_post` ( + `post_id` bigint(20) NOT NULL COMMENT '岗位ID', + `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', + `post_code` varchar(64) NOT NULL COMMENT '岗位编码', + `post_name` varchar(50) NOT NULL COMMENT '岗位名称', + `post_sort` int(4) NOT NULL COMMENT '显示顺序', + `status` char(1) NOT NULL COMMENT '状态(0正常 1停用)', + `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`post_id`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_post_code` (`post_code`), + KEY `idx_status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='岗位信息表'; + +-- ---------------------------- +-- Table structure for sys_role +-- ---------------------------- +DROP TABLE IF EXISTS `sys_role`; +CREATE TABLE `sys_role` ( + `role_id` bigint(20) NOT NULL COMMENT '角色ID', + `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', + `role_name` varchar(30) NOT NULL COMMENT '角色名称', + `role_key` varchar(100) NOT NULL COMMENT '角色权限字符串', + `role_sort` int(4) NOT NULL COMMENT '显示顺序', + `data_scope` char(1) DEFAULT '1' COMMENT '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)', + `menu_check_strictly` tinyint(1) DEFAULT '1' COMMENT '菜单树选择项是否关联显示', + `dept_check_strictly` tinyint(1) DEFAULT '1' COMMENT '部门树选择项是否关联显示', + `status` char(1) NOT NULL COMMENT '角色状态(0正常 1停用)', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)', + `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`role_id`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_role_key` (`role_key`), + KEY `idx_status` (`status`), + KEY `idx_del_flag` (`del_flag`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色信息表'; + +-- ---------------------------- +-- Table structure for sys_role_dept +-- ---------------------------- +DROP TABLE IF EXISTS `sys_role_dept`; +CREATE TABLE `sys_role_dept` ( + `role_id` bigint(20) NOT NULL COMMENT '角色ID', + `dept_id` bigint(20) NOT NULL COMMENT '部门ID', + PRIMARY KEY (`role_id`,`dept_id`), + KEY `idx_role_id` (`role_id`), + KEY `idx_dept_id` (`dept_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色和部门关联表'; + +-- ---------------------------- +-- Table structure for sys_role_menu +-- ---------------------------- +DROP TABLE IF EXISTS `sys_role_menu`; +CREATE TABLE `sys_role_menu` ( + `role_id` bigint(20) NOT NULL COMMENT '角色ID', + `menu_id` bigint(20) NOT NULL COMMENT '菜单ID', + PRIMARY KEY (`role_id`,`menu_id`), + KEY `idx_role_id` (`role_id`), + KEY `idx_menu_id` (`menu_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色和菜单关联表'; + +-- ---------------------------- +-- Table structure for sys_social +-- ---------------------------- +DROP TABLE IF EXISTS `sys_social`; +CREATE TABLE `sys_social` ( + `id` bigint(20) NOT NULL COMMENT '主键', + `user_id` bigint(20) NOT NULL COMMENT '用户ID,关联sys_user.user_id', + `tenant_id` varchar(20) DEFAULT NULL COMMENT '租户id', + `auth_id` varchar(255) NOT NULL COMMENT '平台+平台唯一id', + `source` varchar(255) NOT NULL COMMENT '用户来源', + `open_id` varchar(255) DEFAULT NULL COMMENT '平台编号唯一id', + `user_name` varchar(30) NOT NULL COMMENT '登录账号', + `nick_name` varchar(30) DEFAULT '' COMMENT '用户昵称', + `email` varchar(255) DEFAULT '' COMMENT '用户邮箱', + `avatar` varchar(500) DEFAULT '' COMMENT '头像地址', + `access_token` varchar(255) DEFAULT NULL COMMENT '用户的授权令牌', + `expire_in` bigint(20) DEFAULT NULL COMMENT '用户的授权令牌的有效期,部分平台可能没有', + `refresh_token` varchar(255) DEFAULT NULL COMMENT '刷新令牌,部分平台可能没有', + `access_code` varchar(255) DEFAULT NULL COMMENT '平台的授权信息,部分平台可能没有', + `union_id` varchar(255) DEFAULT NULL COMMENT '用户的 unionId', + `scope` varchar(255) DEFAULT NULL COMMENT '授予的权限,部分平台可能没有', + `token_type` varchar(255) DEFAULT NULL COMMENT '个别平台的授权信息,部分平台可能没有', + `id_token` varchar(255) DEFAULT NULL COMMENT 'id token,部分平台可能没有', + `mac_algorithm` varchar(255) DEFAULT NULL COMMENT '小米平台用户的附带属性,部分平台可能没有', + `mac_key` varchar(255) DEFAULT NULL COMMENT '小米平台用户的附带属性,部分平台可能没有', + `code` varchar(255) DEFAULT NULL COMMENT '用户的授权code,部分平台可能没有', + `oauth_token` varchar(255) DEFAULT NULL COMMENT 'Twitter平台用户的附带属性,部分平台可能没有', + `oauth_token_secret` varchar(255) DEFAULT NULL COMMENT 'Twitter平台用户的附带属性,部分平台可能没有', + `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)', + PRIMARY KEY (`id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_auth_id` (`auth_id`), + KEY `idx_source` (`source`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_del_flag` (`del_flag`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='社会化关系表'; + +-- ---------------------------- +-- Table structure for sys_tenant +-- ---------------------------- +DROP TABLE IF EXISTS `sys_tenant`; +CREATE TABLE `sys_tenant` ( + `id` bigint(20) NOT NULL COMMENT 'id', + `tenant_id` varchar(20) NOT NULL COMMENT '租户编号', + `contact_user_name` varchar(20) DEFAULT '' COMMENT '联系人', + `contact_phone` varchar(20) DEFAULT '' COMMENT '联系电话', + `company_name` varchar(50) DEFAULT '' COMMENT '企业名称', + `license_number` varchar(30) DEFAULT '' COMMENT '统一社会信用代码', + `address` varchar(200) DEFAULT '' COMMENT '地址', + `intro` varchar(500) DEFAULT '' COMMENT '企业简介', + `domain` varchar(200) DEFAULT '' COMMENT '域名', + `remark` varchar(500) DEFAULT '' COMMENT '备注', + `package_id` bigint(20) DEFAULT NULL COMMENT '租户套餐编号,关联sys_tenant_package.package_id', + `expire_time` datetime DEFAULT NULL COMMENT '过期时间', + `account_count` int(11) DEFAULT '-1' COMMENT '用户数量(-1不限制)', + `status` char(1) DEFAULT '0' COMMENT '租户状态(0正常 1停用)', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)', + `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_tenant_id` (`tenant_id`), + KEY `idx_package_id` (`package_id`), + KEY `idx_status` (`status`), + KEY `idx_del_flag` (`del_flag`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='租户表'; + +-- ---------------------------- +-- Table structure for sys_tenant_package +-- ---------------------------- +DROP TABLE IF EXISTS `sys_tenant_package`; +CREATE TABLE `sys_tenant_package` ( + `package_id` bigint(20) NOT NULL COMMENT '租户套餐id', + `package_name` varchar(20) DEFAULT '' COMMENT '套餐名称', + `menu_ids` varchar(3000) DEFAULT '' COMMENT '关联菜单id', + `remark` varchar(500) DEFAULT '' COMMENT '备注', + `menu_check_strictly` tinyint(1) DEFAULT '1' COMMENT '菜单树选择项是否关联显示', + `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)', + `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`package_id`), + KEY `idx_status` (`status`), + KEY `idx_del_flag` (`del_flag`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='租户套餐表'; + +-- ---------------------------- +-- Table structure for sys_user +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user`; +CREATE TABLE `sys_user` ( + `user_id` bigint(20) NOT NULL COMMENT '用户ID', + `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号', + `dept_id` bigint(20) DEFAULT NULL COMMENT '部门ID,关联sys_dept.dept_id', + `user_name` varchar(30) NOT NULL COMMENT '用户账号', + `nick_name` varchar(30) NOT NULL COMMENT '用户昵称', + `user_type` varchar(10) DEFAULT 'sys_user' COMMENT '用户类型(sys_user系统用户)', + `email` varchar(50) DEFAULT '' COMMENT '用户邮箱', + `phonenumber` varchar(11) DEFAULT '' COMMENT '手机号码', + `sex` char(1) DEFAULT '0' COMMENT '用户性别(0男 1女 2未知)', + `avatar` varchar(100) DEFAULT '' COMMENT '头像地址', + `password` varchar(100) DEFAULT '' COMMENT '密码', + `status` char(1) DEFAULT '0' COMMENT '帐号状态(0正常 1停用)', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)', + `login_ip` varchar(128) DEFAULT '' COMMENT '最后登录IP', + `login_date` datetime DEFAULT NULL COMMENT '最后登录时间', + `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`user_id`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_dept_id` (`dept_id`), + KEY `idx_user_name` (`user_name`), + KEY `idx_status` (`status`), + KEY `idx_del_flag` (`del_flag`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户信息表'; + +-- ---------------------------- +-- Table structure for sys_user_post +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user_post`; +CREATE TABLE `sys_user_post` ( + `user_id` bigint(20) NOT NULL COMMENT '用户ID,关联sys_user.user_id', + `post_id` bigint(20) NOT NULL COMMENT '岗位ID,关联sys_post.post_id', + PRIMARY KEY (`user_id`,`post_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_post_id` (`post_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户与岗位关联表'; + +-- ---------------------------- +-- Table structure for sys_user_role +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user_role`; +CREATE TABLE `sys_user_role` ( + `user_id` bigint(20) NOT NULL COMMENT '用户ID,关联sys_user.user_id', + `role_id` bigint(20) NOT NULL COMMENT '角色ID,关联sys_role.role_id', + PRIMARY KEY (`user_id`,`role_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_role_id` (`role_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户和角色关联表'; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/docs/设计文档/database/06-test-module.sql b/docs/设计文档/database/06-test-module.sql new file mode 100644 index 00000000..4fb5f925 --- /dev/null +++ b/docs/设计文档/database/06-test-module.sql @@ -0,0 +1,62 @@ +/* + 测试模块数据库结构 + + 业务域:测试和演示相关表 + 包含表:test_tree + + 说明:此模块用于系统测试和功能演示,包含树形结构测试数据 + + 创建时间:2025-01-08 + 维护人员:项目开发团队 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for test_tree +-- ---------------------------- +DROP TABLE IF EXISTS `test_tree`; +CREATE TABLE `test_tree` ( + `id` bigint(20) NOT NULL COMMENT '主键ID', + `tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号', + `parent_id` bigint(20) DEFAULT '0' COMMENT '父节点ID', + `dept_id` bigint(20) DEFAULT NULL COMMENT '部门ID,关联sys_dept.dept_id', + `user_id` bigint(20) DEFAULT NULL COMMENT '用户ID,关联sys_user.user_id', + `tree_name` varchar(30) DEFAULT '' COMMENT '节点名称', + `version` int(11) DEFAULT '0' COMMENT '版本号', + `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', + `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)', + PRIMARY KEY (`id`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_parent_id` (`parent_id`), + KEY `idx_dept_id` (`dept_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_del_flag` (`del_flag`), + KEY `idx_create_time` (`create_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='测试树表'; + +-- ---------------------------- +-- Records of test_tree +-- ---------------------------- +BEGIN; +INSERT INTO `test_tree` (`id`, `tenant_id`, `parent_id`, `dept_id`, `user_id`, `tree_name`, `version`, `create_dept`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (1, '000000', 0, 102, 4, '测试数据权限', 0, 103, '2025-06-20 16:22:26', 1, NULL, NULL, '0'); +INSERT INTO `test_tree` (`id`, `tenant_id`, `parent_id`, `dept_id`, `user_id`, `tree_name`, `version`, `create_dept`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (2, '000000', 1, 102, 3, '子节点1', 0, 103, '2025-06-20 16:22:26', 1, NULL, NULL, '0'); +INSERT INTO `test_tree` (`id`, `tenant_id`, `parent_id`, `dept_id`, `user_id`, `tree_name`, `version`, `create_dept`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (3, '000000', 2, 102, 3, '子节点2', 0, 103, '2025-06-20 16:22:26', 1, NULL, NULL, '0'); +INSERT INTO `test_tree` (`id`, `tenant_id`, `parent_id`, `dept_id`, `user_id`, `tree_name`, `version`, `create_dept`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (4, '000000', 0, 108, 4, '测试树1', 0, 103, '2025-06-20 16:22:26', 1, NULL, NULL, '0'); +INSERT INTO `test_tree` (`id`, `tenant_id`, `parent_id`, `dept_id`, `user_id`, `tree_name`, `version`, `create_dept`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (5, '000000', 4, 108, 3, '子节点11', 0, 103, '2025-06-20 16:22:26', 1, NULL, NULL, '0'); +INSERT INTO `test_tree` (`id`, `tenant_id`, `parent_id`, `dept_id`, `user_id`, `tree_name`, `version`, `create_dept`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (6, '000000', 4, 108, 3, '子节点22', 0, 103, '2025-06-20 16:22:26', 1, NULL, NULL, '0'); +INSERT INTO `test_tree` (`id`, `tenant_id`, `parent_id`, `dept_id`, `user_id`, `tree_name`, `version`, `create_dept`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (7, '000000', 4, 108, 3, '子节点33', 0, 103, '2025-06-20 16:22:26', 1, NULL, NULL, '0'); +INSERT INTO `test_tree` (`id`, `tenant_id`, `parent_id`, `dept_id`, `user_id`, `tree_name`, `version`, `create_dept`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (8, '000000', 5, 108, 3, '子节点44', 0, 103, '2025-06-20 16:22:26', 1, NULL, NULL, '0'); +INSERT INTO `test_tree` (`id`, `tenant_id`, `parent_id`, `dept_id`, `user_id`, `tree_name`, `version`, `create_dept`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (9, '000000', 6, 108, 3, '子节点55', 0, 103, '2025-06-20 16:22:26', 1, NULL, NULL, '0'); +INSERT INTO `test_tree` (`id`, `tenant_id`, `parent_id`, `dept_id`, `user_id`, `tree_name`, `version`, `create_dept`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (10, '000000', 7, 108, 3, '子节点66', 0, 103, '2025-06-20 16:22:26', 1, NULL, NULL, '0'); +INSERT INTO `test_tree` (`id`, `tenant_id`, `parent_id`, `dept_id`, `user_id`, `tree_name`, `version`, `create_dept`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (11, '000000', 7, 108, 3, '子节点77', 0, 103, '2025-06-20 16:22:26', 1, NULL, NULL, '0'); +INSERT INTO `test_tree` (`id`, `tenant_id`, `parent_id`, `dept_id`, `user_id`, `tree_name`, `version`, `create_dept`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (12, '000000', 10, 108, 3, '子节点88', 0, 103, '2025-06-20 16:22:26', 1, NULL, NULL, '0'); +INSERT INTO `test_tree` (`id`, `tenant_id`, `parent_id`, `dept_id`, `user_id`, `tree_name`, `version`, `create_dept`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (13, '000000', 10, 108, 3, '子节点99', 0, 103, '2025-06-20 16:22:26', 1, NULL, NULL, '0'); +COMMIT; + +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/docs/设计文档/database/README.md b/docs/设计文档/database/README.md new file mode 100644 index 00000000..45c519a5 --- /dev/null +++ b/docs/设计文档/database/README.md @@ -0,0 +1,422 @@ +# 数据库设计目录 + +## 目录说明 + +此目录用于存放项目的数据库设计相关文档和脚本文件。 + +## 📁 目录结构 + +``` +database/ +├── README.md # 本说明文件 +├── hzdyjs_xg.sql # 完整数据库模型 (当前系统的完整表结构) +├── database_msg.md # 数据库环境配置信息 +├── 数据库设计说明.md # 整体数据库设计文档 +├── ER图设计文档.md # 实体关系图设计 +├── 表结构设计.md # 详细表结构和字段说明 +├── 数据字典.md # 数据字典和编码规范 +├── DDL/ # 数据定义语言脚本 +│ ├── system/ # 系统核心表 +│ │ ├── sys_tables.sql # 系统管理表 +│ │ ├── auth_tables.sql # 权限认证表 +│ │ └── tenant_tables.sql # 多租户表 +│ ├── business/ # 业务模块表 +│ │ ├── hq_tables.sql # 后勤管理相关表 +│ │ └── custom_tables.sql # 自定义业务表 +│ ├── indexes.sql # 索引创建脚本 +│ └── constraints.sql # 约束创建脚本 +├── DML/ # 数据操作语言脚本 +│ ├── init_data.sql # 初始化数据脚本 +│ ├── dict_data.sql # 字典数据脚本 +│ ├── menu_data.sql # 菜单权限数据 +│ └── test_data.sql # 测试数据脚本 +├── models/ # 数据模型文件 +│ ├── erd/ # ER图文件 +│ │ ├── system_erd.drawio # 系统模块ER图 +│ │ ├── business_erd.drawio # 业务模块ER图 +│ │ └── complete_erd.png # 完整ER图导出 +│ └── schema/ # 数据库schema文件 +│ ├── mysql_schema.sql # MySQL数据库schema +│ ├── oracle_schema.sql # Oracle数据库schema +│ └── postgres_schema.sql # PostgreSQL数据库schema +└── migration/ # 数据库迁移脚本 + ├── v5.0_to_v5.1/ # 版本升级脚本 + ├── v5.1_to_v5.2/ + └── rollback/ # 回滚脚本 +``` + +## 🎯 不同类型数据模型的存放建议 + +### 0. **当前完整数据库模型** + +- **主模型文件**: `docs/design/database/hzdyjs_xg.sql` +- **内容**: 当前系统的完整数据库表结构,包含所有业务表和系统表 +- **说明**: 包含宿舍管理 (bed*\*, dormitory*\_)、工作流 (flow\_\_) 等业务模块 +- **环境配置**: `docs/design/database/database_msg.md` 包含开发环境数据库连接信息 + +### 1. **系统核心数据模型** + +- **位置**: `docs/design/database/DDL/system/` +- **内容**: 系统管理、权限认证、多租户等核心表结构 +- **示例**: `sys_user`, `sys_role`, `sys_menu`, `sys_tenant` + +### 2. **业务模块数据模型** + +- **位置**: `docs/design/database/DDL/business/` +- **内容**: 具体业务功能相关的表结构 +- **示例**: 后勤管理、报告厅预约、满意度调查等 + +### 3. **初始化和测试数据** + +- **位置**: `docs/design/database/DML/` +- **内容**: 系统初始化数据、字典数据、测试数据等 + +### 4. **ER 图和设计文档** + +- **位置**: `docs/design/database/models/` +- **内容**: 数据库设计图表、关系图、设计说明等 + +### 5. **版本升级脚本** + +- **位置**: `docs/design/database/migration/` +- **内容**: 数据库版本升级脚本、数据迁移脚本等 + +## 🔄 与现有目录的关联 + +### 现有 SQL 脚本位置 + +- **当前完整模型**: `docs/design/database/hzdyjs_xg.sql` → 当前系统的完整数据库模型 (3638 行) +- **环境配置**: `docs/design/database/database_msg.md` → 开发环境数据库连接信息 +- **框架主脚本**: `script/sql/ry_vue_5.X.sql` → 参考并拆分到对应模块 +- **更新脚本**: `script/sql/update/` → 整理到 migration 目录 +- **业务脚本**: `docs/requirements/*/` → 移动到 business 目录 + +### 同步规则 + +1. **新表设计**: 先在`docs/design/database/`中设计,再更新到`script/sql/` +2. **表结构变更**: 同时更新设计文档和升级脚本 + - **必须同步更新**: `docs/design/database/hzdyjs_xg.sql` 中的表结构 + - **环境配置变更**: 及时更新 `docs/design/database/database_msg.md` +3. **文档维护**: 每次数据库变更都要更新相关设计文档 + +## 📝 文件命名规范 + +### DDL 脚本命名 + +- **系统表**: `sys_*.sql` (如: sys_user.sql) +- **业务表**: `模块前缀_*.sql` (如: hq_survey.sql) +- **索引脚本**: `idx_表名.sql` (如: idx_sys_user.sql) + +### 文档命名 + +- **设计文档**: 使用中文描述性名称 +- **ER 图文件**: `模块名_erd.drawio` +- **导出图片**: `模块名_erd.png` + +## ⚠️ 注意事项 + +1. **版本控制**: 所有 DDL 变更都要记录版本和变更原因 +2. **多数据库支持**: 考虑 MySQL、Oracle、PostgreSQL 的兼容性 +3. **命名规范**: 遵循框架统一的命名规范(下划线命名法) +4. **文档同步**: 表结构变更必须同时更新设计文档 + - **关键文件**: `hzdyjs_xg.sql` 必须保持最新的完整表结构 + - **环境安全**: `database_msg.md` 中的密码信息注意安全保护 +5. **备份策略**: 重要脚本变更前要备份现有版本 +6. **当前系统参考**: 新增表结构应参考 `hzdyjs_xg.sql` 中现有表的设计规范 + +# 数据库设计说明 + +## 📋 文档结构 + +本目录包含项目数据库设计的核心文档: + +- **📊 mysql-database-standard.md** - MySQL 数据库建设规范(**强制性**) +- **🗄️ hzdyjs_xg.sql** - 完整数据库模型文件 +- **🔧 database_msg.md** - 数据库环境配置信息 + +--- + +## 🔴 强制性要求 + +### ⚠️ 超级重要:数据库建设强制规范 + +**所有数据库相关的开发工作都必须严格遵循 `mysql-database-standard.md` 中的规范!** + +#### 核心强制规范: + +1. **✅ 所有业务表必须包含标准基础字段** +2. **✅ 统一使用雪花 ID 作为主键** +3. **✅ 强制使用逻辑删除,禁止物理删除** +4. **✅ 所有表必须支持多租户** +5. **✅ 完整的中文注释是必须的** + +#### 违规后果: + +- **不符合规范的表结构将被要求重新设计** +- **所有数据库变更都需要经过 Code Review** +- **必须与现有数据库模型保持高度一致性** + +--- + +## 🤖 Cursor AI 开发要求 + +### 使用 Cursor AI 进行数据库开发时的强制要求: + +#### 1. 必须参考规范文档 + +在进行任何数据库相关开发前,必须: + +- 仔细阅读 `mysql-database-standard.md` 规范 +- 参考 `hzdyjs_xg.sql` 中的现有表结构 +- 遵循完全一致的设计模式 + +#### 2. 强制使用标准模板 + +- 使用规范文档中提供的建表 SQL 模板 +- 所有表必须包含完整的基础字段 +- 索引设计必须符合规范要求 + +#### 3. AI 开发提示词模板 + +``` +请根据 docs/设计文档/database/mysql-database-standard.md 中的规范, +参考 docs/设计文档/database/hzdyjs_xg.sql 中现有表结构的设计模式, +为 [模块名称] 创建 [表名称] 表。 + +要求: +1. 严格遵循标准基础字段规范 +2. 使用bigint(20)作为主键类型 +3. 包含完整的租户支持和逻辑删除 +4. 添加完整的中文注释 +5. 创建必要的基础索引 +6. 使用标准的字段命名规范 + +请确保生成的SQL与现有表结构风格完全一致。 +``` + +--- + +## 📊 数据库概览 + +### 基本信息 + +- **数据库名称**: hzdyjs_xg +- **MySQL 版本**: 5.7.36+ +- **字符集**: utf8mb4 +- **存储引擎**: InnoDB +- **环境配置**: 详见 `database_msg.md` + +### 表数量统计 + +根据 `hzdyjs_xg.sql` 统计,数据库包含约 **48 个核心表**: + +#### 核心业务模块 + +- **工作流模块** (flow\_\*): 8 个表 +- **系统管理模块** (sys\_\*): 18 个表 +- **后勤管理模块** (hq\_\*): 11 个表 +- **代码生成模块** (gen\_\*): 2 个表 +- **任务调度模块** (sj\_\*): 19 个表 +- **测试模块** (test\_\*): 3 个表 + +### 表结构设计模式 + +#### 标准基础字段(每个业务表必须包含) + +```sql +`id` bigint(20) NOT NULL COMMENT '主键ID', +`tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号', +`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', +`create_by` bigint(20) DEFAULT NULL COMMENT '创建者', +`create_time` datetime DEFAULT NULL COMMENT '创建时间', +`update_by` bigint(20) DEFAULT NULL COMMENT '更新者', +`update_time` datetime DEFAULT NULL COMMENT '更新时间', +`deleted` tinyint(1) DEFAULT 0 COMMENT '删除标志(0代表存在 1代表删除)' +``` + +#### 关键设计特征 + +- **主键策略**: 雪花 ID (bigint(20)) +- **多租户支持**: tenant_id 字段 +- **逻辑删除**: deleted 字段 +- **审计追踪**: 完整的创建和更新信息 +- **索引设计**: 租户、状态、时间等关键字段 + +#### 命名规范 + +- **表名**: 模块前缀 + 下划线 + 业务含义 (如: hq_hall_info) +- **字段名**: 下划线命名法 (如: user_name, create_time) +- **索引名**: idx*字段名 或 uk*字段名 + +--- + +## 🔧 开发使用指南 + +### 建表操作流程 + +#### 1. 设计前准备 + +- [ ] 阅读 `mysql-database-standard.md` 规范 +- [ ] 分析 `hzdyjs_xg.sql` 中类似表的设计 +- [ ] 确定表名和字段设计 + +#### 2. 使用标准模板 + +- [ ] 复制规范文档中的标准模板 +- [ ] 添加业务字段,保持基础字段不变 +- [ ] 设计合理的索引结构 + +#### 3. 代码审查 + +- [ ] 对照检查清单验证表结构 +- [ ] 确保与现有表风格一致 +- [ ] 提交前进行团队 Review + +### 表结构修改流程 + +#### 1. 变更评估 + +- [ ] 评估变更影响范围 +- [ ] 确保向前兼容性 +- [ ] 准备数据迁移方案 + +#### 2. 执行变更 + +- [ ] 使用标准的 ALTER 语句 +- [ ] 新增字段必须有默认值 +- [ ] 更新相关文档 + +#### 3. 验证和部署 + +- [ ] 在测试环境验证 +- [ ] 准备回滚预案 +- [ ] 记录变更日志 + +### 数据查询规范 + +#### 必须包含的条件 + +```sql +-- 多租户隔离(必须) +WHERE tenant_id = '当前租户ID' + +-- 逻辑删除过滤(建议) +AND deleted = 0 + +-- 分页查询(大数据量) +ORDER BY create_time DESC +LIMIT 20 OFFSET 0 +``` + +#### 索引优化查询 + +```sql +-- 利用组合索引 +WHERE tenant_id = '000000' + AND status = '0' + AND create_time >= '2025-01-01' +``` + +--- + +## ⚠️ 注意事项 + +### 🔴 强制性要求 + +1. **新建表必须使用标准模板** +2. **所有字段必须有中文注释** +3. **必须创建租户和删除标志索引** +4. **外键字段必须创建索引** +5. **禁止使用物理删除** + +### 🚫 禁止事项 + +1. **禁止修改基础字段的类型和含义** +2. **禁止删除租户支持相关字段** +3. **禁止使用 timestamp 类型** +4. **禁止使用 enum 和 set 类型** +5. **禁止创建没有注释的字段** + +### ✅ 最佳实践 + +1. **字段长度要合理设置** +2. **状态字段统一使用 char(1)** +3. **时间字段统一使用 datetime** +4. **金额字段使用 decimal 类型** +5. **大文本使用 text 类型** + +--- + +## 🔍 快速检查 + +### 表结构自检清单 + +在创建或修改表时,请对照以下清单: + +#### 基础字段检查 + +- [ ] id 字段: bigint(20) NOT NULL +- [ ] tenant_id 字段: varchar(20) NOT NULL DEFAULT '000000' +- [ ] create\_\*字段: 完整的创建审计字段 +- [ ] update\_\*字段: 完整的更新审计字段 +- [ ] deleted 字段: tinyint(1) DEFAULT 0 + +#### 业务字段检查 + +- [ ] 字段命名: 下划线命名法 +- [ ] 数据类型: 符合规范要求 +- [ ] 默认值: 合理设置 +- [ ] 注释: 完整的中文说明 + +#### 索引检查 + +- [ ] 基础索引: tenant_id, deleted, create_time +- [ ] 业务索引: 状态、外键、查询字段 +- [ ] 唯一约束: 包含租户隔离 + +#### 表定义检查 + +- [ ] 表注释: 清晰的中文说明 +- [ ] 引擎: InnoDB +- [ ] 字符集: utf8mb4 +- [ ] 命名: 符合模块前缀规范 + +--- + +## 📚 相关资源 + +### 📖 核心文档 + +- [MySQL 数据库建设规范](./mysql-database-standard.md) - **必读规范** +- [数据库配置信息](./database_msg.md) - 环境配置 +- [完整数据库模型](./hzdyjs_xg.sql) - 参考示例 + +### 🔗 外部资源 + +- [MySQL 8.0 官方文档](https://dev.mysql.com/doc/refman/8.0/en/) +- [阿里巴巴 Java 开发手册-数据库规约](https://github.com/alibaba/p3c) + +### 📝 变更记录 + +所有数据库变更必须记录在:`docs/变更管理/code-adjust-record.md` + +--- + +## 🎯 目标和愿景 + +通过严格的数据库设计规范,我们致力于: + +1. **🎯 保证数据一致性**: 统一的表结构设计 +2. **⚡ 提升查询性能**: 合理的索引策略 +3. **🔒 确保数据安全**: 多租户隔离和逻辑删除 +4. **📈 支持业务发展**: 可扩展的架构设计 +5. **🛠️ 降低维护成本**: 标准化的开发流程 + +--- + +**🚨 重要提醒**: 数据库是系统的核心,任何不规范的设计都可能对系统造成长期的负面影响。请务必严格遵循规范,确保系统的稳定性和可维护性! + +--- + +**最后更新**: 2025-01-08 +**文档维护**: 项目技术团队 diff --git a/docs/设计文档/database/SQL文件说明.md b/docs/设计文档/database/SQL文件说明.md new file mode 100644 index 00000000..ef3f1787 --- /dev/null +++ b/docs/设计文档/database/SQL文件说明.md @@ -0,0 +1,235 @@ +# 数据库 SQL 文件目录说明 + +## 📁 文件结构概览 + +基于业务域的数据库文件拆分,将原始的 `hzdyjs_xg.sql` 按业务模块进行分类,便于管理和维护。 + +``` +docs/设计文档/database/ +├── hzdyjs_xg.sql # 完整数据库文件(保留) +├── 01-workflow-module.sql # 工作流模块 +├── 02-code-generator-module.sql # 代码生成模块 +├── 03-logistics-module.sql # 后勤管理模块 +├── 04-job-scheduler-module.sql # 任务调度模块 +├── 05-system-management-module.sql # 系统管理模块 +├── 06-test-module.sql # 测试模块 +├── README.md # 数据库设计说明 +├── mysql-database-standard.md # MySQL数据库建设规范 +├── database_msg.md # 数据库环境配置 +└── SQL文件说明.md # 本文件 +``` + +--- + +## 📊 业务域拆分详情 + +### 01. 工作流模块 (01-workflow-module.sql) + +**业务域**: 工作流引擎相关功能 +**包含表**: 8 张表 + +- `flow_category` - 流程分类表 +- `flow_definition` - 流程定义表 +- `flow_his_task` - 历史任务表 +- `flow_instance` - 流程实例表 +- `flow_node` - 流程节点表 +- `flow_skip` - 流程跳转表 +- `flow_task` - 流程任务表 +- `flow_user` - 流程用户表 + +**主要功能**: 支持业务流程的定义、执行、跟踪和管理 + +### 02. 代码生成模块 (02-code-generator-module.sql) + +**业务域**: 代码生成器相关功能 +**包含表**: 2 张表 + +- `gen_table` - 代码生成业务表 +- `gen_table_column` - 代码生成业务字段表 + +**主要功能**: 支持基于数据库表结构自动生成代码 + +### 03. 后勤管理模块 (03-logistics-module.sql) + +**业务域**: 后勤服务管理相关功能 +**包含表**: 10 张表 + +#### 报告厅预约管理子模块 + +- `hq_hall_info` - 报告厅信息表 +- `hq_hall_reservation` - 报告厅预约表 + +#### 满意度调查子模块 + +- `hq_sat_answer` - 答题答案表 +- `hq_sat_category` - 题目分类表 +- `hq_sat_detail` - 答题详情表 +- `hq_sat_option` - 评分选项表 +- `hq_sat_question` - 题库表 +- `hq_sat_record` - 答题记录表 +- `hq_sat_survey` - 问卷表 +- `hq_sat_survey_question` - 问卷题目关联表 + +**主要功能**: 校园后勤服务管理,包括场地预约和满意度调查 + +### 04. 任务调度模块 (04-job-scheduler-module.sql) + +**业务域**: SnailJob 任务调度相关功能 +**包含表**: 12 张表 + +- `sj_distributed_lock` - 分布式锁表 +- `sj_group_config` - 组配置表 +- `sj_namespace_config` - 命名空间配置表 +- `sj_notify_config` - 通知配置表 +- `sj_retry_dead_letter` - 死信队列表 +- `sj_retry_summary` - 任务重试汇总统计表 +- `sj_retry_task` - 任务信息表 +- `sj_retry_task_log` - 重试日志表 +- `sj_server_node` - 服务器节点表 +- `sj_system_user_permission` - 系统用户权限表 +- `sj_workflow_node` - 工作流节点表 +- `sj_workflow_task_batch` - 工作流任务批次表 + +**主要功能**: 分布式任务调度、重试机制、工作流编排 + +### 05. 系统管理模块 (05-system-management-module.sql) + +**业务域**: 系统核心管理功能 +**包含表**: 21 张表 + +#### 用户与权限管理 + +- `sys_user` - 用户信息表 +- `sys_role` - 角色信息表 +- `sys_menu` - 菜单权限表 +- `sys_dept` - 部门表 +- `sys_post` - 岗位信息表 +- `sys_user_role` - 用户角色关联表 +- `sys_user_post` - 用户岗位关联表 +- `sys_role_menu` - 角色菜单关联表 +- `sys_role_dept` - 角色部门关联表 + +#### 系统配置与日志 + +- `sys_config` - 参数配置表 +- `sys_dict_type` - 字典类型表 +- `sys_dict_data` - 字典数据表 +- `sys_notice` - 通知公告表 +- `sys_oper_log` - 操作日志表 +- `sys_logininfor` - 系统访问记录表 + +#### 文件与租户管理 + +- `sys_oss` - OSS 对象存储表 +- `sys_oss_config` - 对象存储配置表 +- `sys_client` - 系统授权表 +- `sys_tenant` - 租户表 +- `sys_tenant_package` - 租户套餐表 +- `sys_social` - 社会化关系表 + +**主要功能**: 系统用户管理、权限控制、配置管理、日志记录等核心功能 + +### 06. 测试模块 (06-test-module.sql) + +**业务域**: 测试和演示相关功能 +**包含表**: 1 张表 + +- `test_tree` - 测试树表 + +**主要功能**: 系统功能测试和演示,包含树形结构数据 + +--- + +## 🔧 使用指南 + +### 完整数据库部署 + +```sql +-- 执行完整数据库文件 +SOURCE docs/设计文档/database/hzdyjs_xg.sql; +``` + +### 按模块部署 + +```sql +-- 按需执行指定模块 +SOURCE docs/设计文档/database/01-workflow-module.sql; +SOURCE docs/设计文档/database/02-code-generator-module.sql; +SOURCE docs/设计文档/database/03-logistics-module.sql; +SOURCE docs/设计文档/database/04-job-scheduler-module.sql; +SOURCE docs/设计文档/database/05-system-management-module.sql; +SOURCE docs/设计文档/database/06-test-module.sql; +``` + +### 开发环境部署建议 + +1. **必须模块**: 01-工作流模块, 05-系统管理模块 +2. **按需模块**: 其他模块根据具体业务需求选择性部署 +3. **测试模块**: 仅在开发和测试环境中部署 + +--- + +## 📈 统计信息 + +| 模块 | 表数量 | 主要功能 | 依赖关系 | +| ------------ | ------ | ------------ | ---------------- | +| 工作流模块 | 8 | 流程管理 | 依赖系统管理模块 | +| 代码生成模块 | 2 | 代码生成 | 无特殊依赖 | +| 后勤管理模块 | 10 | 后勤服务 | 依赖系统管理模块 | +| 任务调度模块 | 12 | 任务调度 | 独立模块 | +| 系统管理模块 | 21 | 核心系统 | 核心基础模块 | +| 测试模块 | 1 | 测试演示 | 依赖系统管理模块 | +| **总计** | **54** | **完整系统** | **完整依赖链** | + +--- + +## ⚠️ 注意事项 + +### 1. 模块依赖关系 + +- **系统管理模块**是其他模块的基础依赖,必须优先部署 +- **工作流模块**和**后勤管理模块**依赖系统管理模块的用户和部门数据 +- **任务调度模块**相对独立,可单独部署 + +### 2. 数据一致性 + +- 所有模块都遵循统一的数据库设计规范 +- 使用逻辑删除,不进行物理删除 +- 统一的基础字段结构和索引设计 +- **不使用数据库外键约束**,关联关系通过应用层维护 + +### 3. 版本管理 + +- 拆分后的 SQL 文件保持与 `hzdyjs_xg.sql` 的内容一致性 +- 任何表结构变更都应同步更新对应的模块文件 +- 建议使用版本控制跟踪 SQL 文件的变更历史 + +### 4. 性能考虑 + +- 每个模块都包含合理的索引设计 +- 支持分模块的数据库备份和恢复 +- 便于数据库性能调优和问题排查 + +--- + +## 🔄 维护说明 + +### 更新流程 + +1. 修改 `hzdyjs_xg.sql` 主文件 +2. 同步更新对应的模块 SQL 文件 +3. 更新本说明文档的变更记录 +4. 在 `docs/变更管理/code-adjust-record.md` 中记录变更 + +### 文件命名规则 + +- 使用两位数字前缀进行排序 +- 使用英文短横线分隔词语 +- 以 `-module.sql` 结尾表示模块文件 + +### 拆分原则 + +- 按业务域进行逻辑分组 +- 保持模块的相对独立性 +- 考虑实际部署和维护需求 +- 遵循数据库设计规范 diff --git a/docs/design/database/database_msg.md b/docs/设计文档/database/database_msg.md similarity index 100% rename from docs/design/database/database_msg.md rename to docs/设计文档/database/database_msg.md diff --git a/docs/design/database/hzdyjs_xg.sql b/docs/设计文档/database/hzdyjs_xg.sql similarity index 85% rename from docs/design/database/hzdyjs_xg.sql rename to docs/设计文档/database/hzdyjs_xg.sql index ba1f2b38..141fa323 100644 --- a/docs/design/database/hzdyjs_xg.sql +++ b/docs/设计文档/database/hzdyjs_xg.sql @@ -1,7 +1,7 @@ /* - Navicat Premium Data Transfer + Navicat Premium Dump SQL - Source Server : 47.99.164.66 hn02le.34lkdLKD + Source Server : 47.99.164.66 hn02le.34lkdLKD Source Server Type : MySQL Source Server Version : 50736 (5.7.36) Source Host : 47.99.164.66:3306 @@ -11,162 +11,12 @@ Target Server Version : 50736 (5.7.36) File Encoding : 65001 - Date: 26/06/2025 14:38:57 + Date: 28/06/2025 08:21:01 */ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; --- ---------------------------- --- Table structure for bed_allocation --- ---------------------------- -DROP TABLE IF EXISTS `bed_allocation`; -CREATE TABLE `bed_allocation` ( - `id` bigint(20) NOT NULL COMMENT '主键ID', - `tenant_id` varchar(20) NOT NULL COMMENT '租户编号', - `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', - `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `bed_id` bigint(20) NOT NULL COMMENT '床位ID', - `student_id` bigint(20) NOT NULL COMMENT '学生ID', - `allocation_type` tinyint(4) DEFAULT '1' COMMENT '分配类型:1新分配,2调换,3重新分配', - `allocation_date` date NOT NULL COMMENT '分配日期', - `start_date` date NOT NULL COMMENT '入住日期', - `end_date` date DEFAULT NULL COMMENT '退宿日期', - `rent_fee` decimal(8,2) DEFAULT NULL COMMENT '住宿费', - `deposit` decimal(8,2) DEFAULT NULL COMMENT '押金', - `allocator_id` bigint(20) DEFAULT NULL COMMENT '分配人ID', - `remark` text COMMENT '备注', - `status` tinyint(4) DEFAULT '1' COMMENT '状态:1已分配,2已退宿,3已调换', - `is_deleted` tinyint(4) DEFAULT '0' COMMENT '删除标记:0未删除,1已删除', - PRIMARY KEY (`id`), - KEY `idx_bed_id` (`bed_id`), - KEY `idx_student_id` (`student_id`), - KEY `idx_allocation_date` (`allocation_date`), - KEY `idx_status` (`status`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='床位分配表'; - --- ---------------------------- --- Records of bed_allocation --- ---------------------------- -BEGIN; -COMMIT; - --- ---------------------------- --- Table structure for bed_info --- ---------------------------- -DROP TABLE IF EXISTS `bed_info`; -CREATE TABLE `bed_info` ( - `id` bigint(20) NOT NULL COMMENT '主键ID', - `tenant_id` varchar(20) NOT NULL COMMENT '租户编号', - `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', - `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `room_id` bigint(20) NOT NULL COMMENT '房间ID', - `bed_no` varchar(10) NOT NULL COMMENT '床位号', - `bed_type` tinyint(4) DEFAULT '1' COMMENT '床位类型:1上铺,2下铺', - `bed_position` varchar(20) DEFAULT NULL COMMENT '床位位置', - `facilities` text COMMENT '床位设施', - `status` tinyint(4) DEFAULT '1' COMMENT '床位状态:1空闲,2已分配,3维修', - `is_deleted` tinyint(4) DEFAULT '0' COMMENT '删除标记:0未删除,1已删除', - PRIMARY KEY (`id`), - UNIQUE KEY `uk_room_bed` (`room_id`,`bed_no`), - KEY `idx_room_id` (`room_id`), - KEY `idx_status` (`status`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='床位信息表'; - --- ---------------------------- --- Records of bed_info --- ---------------------------- -BEGIN; -COMMIT; - --- ---------------------------- --- Table structure for dormitory_building --- ---------------------------- -DROP TABLE IF EXISTS `dormitory_building`; -CREATE TABLE `dormitory_building` ( - `id` bigint(20) NOT NULL COMMENT '主键ID', - `tenant_id` varchar(20) NOT NULL COMMENT '租户编号', - `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', - `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `building_name` varchar(50) NOT NULL COMMENT '楼栋名称', - `building_code` varchar(20) NOT NULL COMMENT '楼栋编码', - `building_type` tinyint(4) DEFAULT '1' COMMENT '楼栋类型:1男生宿舍,2女生宿舍,3混合宿舍', - `floors` int(11) NOT NULL COMMENT '楼层数', - `rooms_per_floor` int(11) DEFAULT NULL COMMENT '每层房间数', - `total_rooms` int(11) DEFAULT NULL COMMENT '总房间数', - `total_beds` int(11) DEFAULT NULL COMMENT '总床位数', - `manager_id` bigint(20) DEFAULT NULL COMMENT '管理员ID', - `manager_name` varchar(50) DEFAULT NULL COMMENT '管理员姓名', - `manager_phone` varchar(20) DEFAULT NULL COMMENT '管理员电话', - `address` varchar(200) DEFAULT NULL COMMENT '地址', - `facilities` text COMMENT '设施配置', - `rules` text COMMENT '管理规定', - `location_lat` decimal(10,6) DEFAULT NULL COMMENT '纬度', - `location_lng` decimal(10,6) DEFAULT NULL COMMENT '经度', - `status` tinyint(4) DEFAULT '1' COMMENT '状态:1正常,0停用', - `is_deleted` tinyint(4) DEFAULT '0' COMMENT '删除标记:0未删除,1已删除', - PRIMARY KEY (`id`), - UNIQUE KEY `uk_building_code` (`building_code`), - KEY `idx_building_type` (`building_type`), - KEY `idx_manager_id` (`manager_id`), - KEY `idx_status` (`status`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='宿舍楼表'; - --- ---------------------------- --- Records of dormitory_building --- ---------------------------- -BEGIN; -COMMIT; - --- ---------------------------- --- Table structure for dormitory_room --- ---------------------------- -DROP TABLE IF EXISTS `dormitory_room`; -CREATE TABLE `dormitory_room` ( - `id` bigint(20) NOT NULL COMMENT '主键ID', - `tenant_id` varchar(20) NOT NULL COMMENT '租户编号', - `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', - `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `building_id` bigint(20) NOT NULL COMMENT '楼栋ID', - `room_no` varchar(20) NOT NULL COMMENT '房间号', - `floor` int(11) NOT NULL COMMENT '楼层', - `room_type` tinyint(4) DEFAULT '1' COMMENT '房间类型:1普通间,2标准间,3豪华间', - `bed_count` int(11) DEFAULT '4' COMMENT '床位数', - `area` decimal(6,2) DEFAULT NULL COMMENT '面积(平方米)', - `orientation` varchar(20) DEFAULT NULL COMMENT '朝向', - `facilities` text COMMENT '房间设施', - `rent_fee` decimal(8,2) DEFAULT NULL COMMENT '住宿费', - `deposit` decimal(8,2) DEFAULT NULL COMMENT '押金', - `water_fee` decimal(8,2) DEFAULT '0.00' COMMENT '水费', - `electric_fee` decimal(8,2) DEFAULT '0.00' COMMENT '电费', - `status` tinyint(4) DEFAULT '1' COMMENT '房间状态:1可用,2满员,3维修,4停用', - `is_deleted` tinyint(4) DEFAULT '0' COMMENT '删除标记:0未删除,1已删除', - PRIMARY KEY (`id`), - UNIQUE KEY `uk_building_room` (`building_id`,`room_no`), - KEY `idx_building_id` (`building_id`), - KEY `idx_floor` (`floor`), - KEY `idx_room_type` (`room_type`), - KEY `idx_status` (`status`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='宿舍房间表'; - --- ---------------------------- --- Records of dormitory_room --- ---------------------------- -BEGIN; -COMMIT; - -- ---------------------------- -- Table structure for flow_category -- ---------------------------- @@ -819,6 +669,69 @@ INSERT INTO `hq_hall_reservation` (`id`, `tenant_id`, `create_dept`, `create_by` INSERT INTO `hq_hall_reservation` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `hall_id`, `hall_name`, `start_time`, `end_time`, `reservation_purpose`, `applicant_id`, `applicant_name`, `applicant_phone`, `status`, `audit_by`, `audit_name`, `audit_time`, `audit_remark`) VALUES (1937692170568011777, '000000', 103, 1, '2025-06-25 09:59:49', 1, '2025-06-25 09:59:49', 1937429766526951426, '小报告厅B', '2025-06-02 00:00:00', '2025-06-26 00:00:00', '123123123', 1, '疯狂的狮子Li', '15888888888', '0', NULL, NULL, NULL, NULL); COMMIT; +-- ---------------------------- +-- Table structure for hq_sat_answer +-- ---------------------------- +DROP TABLE IF EXISTS `hq_sat_answer`; +CREATE TABLE `hq_sat_answer` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `tenant_id` varchar(20) NOT NULL COMMENT '租户编号', + `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `deleted` tinyint(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)', + `record_id` bigint(20) NOT NULL COMMENT '答题记录ID', + `question_id` bigint(20) NOT NULL COMMENT '题目ID', + `question_type` char(1) NOT NULL COMMENT '题目类型(1单选题 2多选题 3问答题)', + `option_id` bigint(20) DEFAULT NULL COMMENT '选项ID(单选题、多选题用,问答题为NULL)', + `option_value` varchar(50) DEFAULT NULL COMMENT '选项值(A、B、C、D等)', + `option_text` varchar(500) DEFAULT NULL COMMENT '选项文本内容', + `answer_value` text COMMENT '答案值(单选题存选项值,多选题存逗号分隔选项值,问答题存文本内容)', + `answer_score` int(11) DEFAULT '0' COMMENT '该答案得分', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`id`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_record_id` (`record_id`), + KEY `idx_question_id` (`question_id`), + KEY `idx_question_type` (`question_type`), + KEY `idx_option_id` (`option_id`), + KEY `idx_record_question` (`record_id`,`question_id`) +) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8mb4 COMMENT='答题答案表'; + +-- ---------------------------- +-- Records of hq_sat_answer +-- ---------------------------- +BEGIN; +INSERT INTO `hq_sat_answer` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `question_type`, `option_id`, `option_value`, `option_text`, `answer_value`, `answer_score`, `remark`) VALUES (1, '000000', NULL, 1, '2025-06-27 08:59:12', 1, '2025-06-27 09:29:34', 1, 1938401694286499842, 1937751675921375241, '3', NULL, NULL, NULL, '您对宿舍服务提出具体的意见和建议您对宿舍服务提出具体的意见和建议您对宿舍服务提出具体的意见和建议', 0, NULL); +INSERT INTO `hq_sat_answer` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `question_type`, `option_id`, `option_value`, `option_text`, `answer_value`, `answer_score`, `remark`) VALUES (2, '000000', NULL, 1, '2025-06-27 08:59:12', 1, '2025-06-27 09:29:34', 1, 1938401694286499842, 1937751675921375250, '3', NULL, NULL, NULL, '堂服务提出具体的意见堂服务提出具体的意见堂服务提出具体的意见堂服务提出具体的意见', 0, NULL); +INSERT INTO `hq_sat_answer` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `question_type`, `option_id`, `option_value`, `option_text`, `answer_value`, `answer_score`, `remark`) VALUES (3, '000000', NULL, 1, '2025-06-27 09:29:35', 1, '2025-06-27 10:44:25', 1, 1938409338980184066, 1937751489358733313, '1', 1, 'A', '非常满意', 'A', 5, NULL); +INSERT INTO `hq_sat_answer` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `question_type`, `option_id`, `option_value`, `option_text`, `answer_value`, `answer_score`, `remark`) VALUES (4, '000000', NULL, 1, '2025-06-27 09:29:35', 1, '2025-06-27 10:44:25', 1, 1938409338980184066, 1937751520555966465, '1', 2, 'B', '满意', 'B', 3, NULL); +INSERT INTO `hq_sat_answer` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `question_type`, `option_id`, `option_value`, `option_text`, `answer_value`, `answer_score`, `remark`) VALUES (5, '000000', NULL, 1, '2025-06-27 09:29:35', 1, '2025-06-27 10:44:25', 1, 1938409338980184066, 1937751675921375239, '2', 1, 'A', '非常满意', 'A,C', 5, NULL); +INSERT INTO `hq_sat_answer` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `question_type`, `option_id`, `option_value`, `option_text`, `answer_value`, `answer_score`, `remark`) VALUES (6, '000000', NULL, 1, '2025-06-27 09:29:35', 1, '2025-06-27 10:44:25', 1, 1938409338980184066, 1937751675921375239, '2', 3, 'C', '一般', 'A,C', 1, NULL); +INSERT INTO `hq_sat_answer` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `question_type`, `option_id`, `option_value`, `option_text`, `answer_value`, `answer_score`, `remark`) VALUES (7, '000000', NULL, 1, '2025-06-27 09:29:35', 1, '2025-06-27 10:44:25', 1, 1938409338980184066, 1937751675921375240, '2', 1, 'A', '非常满意', 'C,A', 5, NULL); +INSERT INTO `hq_sat_answer` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `question_type`, `option_id`, `option_value`, `option_text`, `answer_value`, `answer_score`, `remark`) VALUES (8, '000000', NULL, 1, '2025-06-27 09:29:35', 1, '2025-06-27 10:44:25', 1, 1938409338980184066, 1937751675921375240, '2', 3, 'C', '一般', 'C,A', 1, NULL); +INSERT INTO `hq_sat_answer` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `question_type`, `option_id`, `option_value`, `option_text`, `answer_value`, `answer_score`, `remark`) VALUES (9, '000000', NULL, 1, '2025-06-27 09:29:35', 1, '2025-06-27 10:44:25', 1, 1938409338980184066, 1937751675921375241, '3', NULL, NULL, NULL, '请您对宿舍服务提出具体的意见和建议请您对宿舍服务提出具体的意见和建议请您对宿舍服务提出具体的意见和建议', 0, NULL); +INSERT INTO `hq_sat_answer` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `question_type`, `option_id`, `option_value`, `option_text`, `answer_value`, `answer_score`, `remark`) VALUES (10, '000000', NULL, 1, '2025-06-27 09:29:35', 1, '2025-06-27 10:44:25', 1, 1938409338980184066, 1937751675921375250, '3', NULL, NULL, NULL, '请您对食堂服务提出具体的意见和建议请您对食堂服务提出具体的意见和建议请您对食堂服务提出具体的意见和建议请您对食堂服务提出具体的意见和建议', 0, NULL); +INSERT INTO `hq_sat_answer` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `question_type`, `option_id`, `option_value`, `option_text`, `answer_value`, `answer_score`, `remark`) VALUES (11, '000000', NULL, 1, '2025-06-27 10:44:25', NULL, NULL, 0, 1938428174148263938, 1937751489358733313, '1', 4, 'D', '不满意', 'D', 0, NULL); +INSERT INTO `hq_sat_answer` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `question_type`, `option_id`, `option_value`, `option_text`, `answer_value`, `answer_score`, `remark`) VALUES (12, '000000', NULL, 1, '2025-06-27 10:44:26', NULL, NULL, 0, 1938428174148263938, 1937751520555966465, '1', 3, 'C', '一般', 'C', 1, NULL); +INSERT INTO `hq_sat_answer` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `question_type`, `option_id`, `option_value`, `option_text`, `answer_value`, `answer_score`, `remark`) VALUES (13, '000000', NULL, 1, '2025-06-27 10:44:26', NULL, NULL, 0, 1938428174148263938, 1937751675921375239, '2', 2, 'B', '满意', 'B,D', 3, NULL); +INSERT INTO `hq_sat_answer` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `question_type`, `option_id`, `option_value`, `option_text`, `answer_value`, `answer_score`, `remark`) VALUES (14, '000000', NULL, 1, '2025-06-27 10:44:26', NULL, NULL, 0, 1938428174148263938, 1937751675921375239, '2', 4, 'D', '不满意', 'B,D', 0, NULL); +INSERT INTO `hq_sat_answer` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `question_type`, `option_id`, `option_value`, `option_text`, `answer_value`, `answer_score`, `remark`) VALUES (15, '000000', NULL, 1, '2025-06-27 10:44:26', NULL, NULL, 0, 1938428174148263938, 1937751675921375240, '2', 1, 'A', '非常满意', 'C,A', 5, NULL); +INSERT INTO `hq_sat_answer` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `question_type`, `option_id`, `option_value`, `option_text`, `answer_value`, `answer_score`, `remark`) VALUES (16, '000000', NULL, 1, '2025-06-27 10:44:26', NULL, NULL, 0, 1938428174148263938, 1937751675921375240, '2', 3, 'C', '一般', 'C,A', 1, NULL); +INSERT INTO `hq_sat_answer` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `question_type`, `option_id`, `option_value`, `option_text`, `answer_value`, `answer_score`, `remark`) VALUES (17, '000000', NULL, 1, '2025-06-27 10:44:26', NULL, NULL, 0, 1938428174148263938, 1937751675921375241, '3', NULL, NULL, NULL, '请您对宿舍服务提出具体的意见和建议请您对宿舍服务提出具体的意见和建议请您对宿舍服务提出具体的意见和建议111', 0, NULL); +INSERT INTO `hq_sat_answer` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `question_type`, `option_id`, `option_value`, `option_text`, `answer_value`, `answer_score`, `remark`) VALUES (18, '000000', NULL, 1, '2025-06-27 10:44:26', NULL, NULL, 0, 1938428174148263938, 1937751675921375250, '3', NULL, NULL, NULL, '请您对食堂服务提出具体的意见和建议请您对食堂服务提出具体的1111意见和建议请您对食堂服务提出具体的意见和建议请您对食堂服务提出具体的意见和建议', 0, NULL); +INSERT INTO `hq_sat_answer` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `question_type`, `option_id`, `option_value`, `option_text`, `answer_value`, `answer_score`, `remark`) VALUES (19, '000000', NULL, 1937383272285396994, '2025-06-27 11:17:19', NULL, NULL, 0, 1938436452395737089, 1937751489358733313, '1', 1, 'A', '非常满意', 'A', 5, NULL); +INSERT INTO `hq_sat_answer` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `question_type`, `option_id`, `option_value`, `option_text`, `answer_value`, `answer_score`, `remark`) VALUES (20, '000000', NULL, 1937383272285396994, '2025-06-27 11:17:19', NULL, NULL, 0, 1938436452395737089, 1937751520555966465, '1', 2, 'B', '满意', 'B', 3, NULL); +INSERT INTO `hq_sat_answer` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `question_type`, `option_id`, `option_value`, `option_text`, `answer_value`, `answer_score`, `remark`) VALUES (21, '000000', NULL, 1937383272285396994, '2025-06-27 11:17:19', NULL, NULL, 0, 1938436452395737089, 1937751675921375239, '2', 1, 'A', '非常满意', 'B,A', 5, NULL); +INSERT INTO `hq_sat_answer` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `question_type`, `option_id`, `option_value`, `option_text`, `answer_value`, `answer_score`, `remark`) VALUES (22, '000000', NULL, 1937383272285396994, '2025-06-27 11:17:19', NULL, NULL, 0, 1938436452395737089, 1937751675921375239, '2', 2, 'B', '满意', 'B,A', 3, NULL); +INSERT INTO `hq_sat_answer` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `question_type`, `option_id`, `option_value`, `option_text`, `answer_value`, `answer_score`, `remark`) VALUES (23, '000000', NULL, 1937383272285396994, '2025-06-27 11:17:19', NULL, NULL, 0, 1938436452395737089, 1937751675921375240, '2', 3, 'C', '一般', 'C,D', 1, NULL); +INSERT INTO `hq_sat_answer` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `question_type`, `option_id`, `option_value`, `option_text`, `answer_value`, `answer_score`, `remark`) VALUES (24, '000000', NULL, 1937383272285396994, '2025-06-27 11:17:20', NULL, NULL, 0, 1938436452395737089, 1937751675921375240, '2', 4, 'D', '不满意', 'C,D', 0, NULL); +INSERT INTO `hq_sat_answer` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `question_type`, `option_id`, `option_value`, `option_text`, `answer_value`, `answer_score`, `remark`) VALUES (25, '000000', NULL, 1937383272285396994, '2025-06-27 11:17:20', NULL, NULL, 0, 1938436452395737089, 1937751675921375241, '3', NULL, NULL, NULL, '的意见和建议1231231', 0, NULL); +INSERT INTO `hq_sat_answer` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `question_type`, `option_id`, `option_value`, `option_text`, `answer_value`, `answer_score`, `remark`) VALUES (26, '000000', NULL, 1937383272285396994, '2025-06-27 11:17:20', NULL, NULL, 0, 1938436452395737089, 1937751675921375250, '3', NULL, NULL, NULL, '具体的意见和建议131231312', 0, NULL); +COMMIT; + -- ---------------------------- -- Table structure for hq_sat_category -- ---------------------------- @@ -880,12 +793,42 @@ CREATE TABLE `hq_sat_detail` ( KEY `idx_record_id` (`record_id`), KEY `idx_question_id` (`question_id`), KEY `idx_answer_score` (`answer_score`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='答题详情表'; +) ENGINE=InnoDB AUTO_INCREMENT=1938436455646322691 DEFAULT CHARSET=utf8mb4 COMMENT='答题详情表'; -- ---------------------------- -- Records of hq_sat_detail -- ---------------------------- BEGIN; +INSERT INTO `hq_sat_detail` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `answer_score`, `remark`) VALUES (1938208005513785345, '000000', 103, 1937383272285396994, '2025-06-26 20:09:33', 1937383272285396994, '2025-06-27 11:17:19', 1, 1938208005199212546, 1937751489358733313, 0, '题目类型:1;答案值:1;选项详情:1(一般),'); +INSERT INTO `hq_sat_detail` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `answer_score`, `remark`) VALUES (1938208005757054977, '000000', 103, 1937383272285396994, '2025-06-26 20:09:33', 1937383272285396994, '2025-06-27 11:17:19', 1, 1938208005199212546, 1937751520555966465, 0, '题目类型:1;答案值:3;选项详情:3(满意),'); +INSERT INTO `hq_sat_detail` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `answer_score`, `remark`) VALUES (1938208006038073346, '000000', 103, 1937383272285396994, '2025-06-26 20:09:33', 1937383272285396994, '2025-06-27 11:17:19', 1, 1938208005199212546, 1937751675921375239, 0, '题目类型:2;答案值:3,5;选项详情:5(非常满意),3(满意),'); +INSERT INTO `hq_sat_detail` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `answer_score`, `remark`) VALUES (1938208006331674625, '000000', 103, 1937383272285396994, '2025-06-26 20:09:34', 1937383272285396994, '2025-06-27 11:17:19', 1, 1938208005199212546, 1937751675921375240, 0, '题目类型:2;答案值:3,5;选项详情:5(非常满意),3(满意),'); +INSERT INTO `hq_sat_detail` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `answer_score`, `remark`) VALUES (1938208006570749954, '000000', 103, 1937383272285396994, '2025-06-26 20:09:34', 1937383272285396994, '2025-06-27 11:17:19', 1, 1938208005199212546, 1937751675921375241, 0, '题目类型:3;答案值:123;'); +INSERT INTO `hq_sat_detail` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `answer_score`, `remark`) VALUES (1938208006847574017, '000000', 103, 1937383272285396994, '2025-06-26 20:09:34', 1937383272285396994, '2025-06-27 11:17:19', 1, 1938208005199212546, 1937751675921375250, 0, '题目类型:3;答案值:123213;'); +INSERT INTO `hq_sat_detail` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `answer_score`, `remark`) VALUES (1938401694605266945, '000000', 103, 1, '2025-06-27 08:59:12', 1, '2025-06-27 09:29:34', 1, 1938401694286499842, 1937751489358733313, 0, '题目类型:1;答案值:1;选项详情:1(一般),'); +INSERT INTO `hq_sat_detail` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `answer_score`, `remark`) VALUES (1938401695226023938, '000000', 103, 1, '2025-06-27 08:59:13', 1, '2025-06-27 09:29:34', 1, 1938401694286499842, 1937751520555966465, 0, '题目类型:1;答案值:3;选项详情:3(满意),'); +INSERT INTO `hq_sat_detail` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `answer_score`, `remark`) VALUES (1938401695507042305, '000000', 103, 1, '2025-06-27 08:59:13', 1, '2025-06-27 09:29:34', 1, 1938401694286499842, 1937751675921375239, 0, '题目类型:2;答案值:3,5;选项详情:5(非常满意),3(满意),'); +INSERT INTO `hq_sat_detail` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `answer_score`, `remark`) VALUES (1938401695750311938, '000000', 103, 1, '2025-06-27 08:59:13', 1, '2025-06-27 09:29:34', 1, 1938401694286499842, 1937751675921375240, 0, '题目类型:2;答案值:5,3;选项详情:5(非常满意),3(满意),'); +INSERT INTO `hq_sat_detail` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `answer_score`, `remark`) VALUES (1938401695972610050, '000000', 103, 1, '2025-06-27 08:59:13', 1, '2025-06-27 09:29:34', 1, 1938401694286499842, 1937751675921375241, 0, '题目类型:3;答案值:您对宿舍服务提出具体的意见和建议您对宿舍服务提出具体的意见和建议您对宿舍服务提出具体的意见和建议;'); +INSERT INTO `hq_sat_detail` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `answer_score`, `remark`) VALUES (1938401696282988545, '000000', 103, 1, '2025-06-27 08:59:13', 1, '2025-06-27 09:29:34', 1, 1938401694286499842, 1937751675921375250, 0, '题目类型:3;答案值:堂服务提出具体的意见堂服务提出具体的意见堂服务提出具体的意见堂服务提出具体的意见;'); +INSERT INTO `hq_sat_detail` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `answer_score`, `remark`) VALUES (1938409339269591041, '000000', 103, 1, '2025-06-27 09:29:35', 1, '2025-06-27 10:44:25', 1, 1938409338980184066, 1937751489358733313, 0, '题目类型:1;答案值:A;选项详情:A(非常满意),'); +INSERT INTO `hq_sat_detail` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `answer_score`, `remark`) VALUES (1938409339819044865, '000000', 103, 1, '2025-06-27 09:29:35', 1, '2025-06-27 10:44:25', 1, 1938409338980184066, 1937751520555966465, 0, '题目类型:1;答案值:B;选项详情:B(满意),'); +INSERT INTO `hq_sat_detail` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `answer_score`, `remark`) VALUES (1938409340192337921, '000000', 103, 1, '2025-06-27 09:29:35', 1, '2025-06-27 10:44:25', 1, 1938409338980184066, 1937751675921375239, 0, '题目类型:2;答案值:A,C;选项详情:A(非常满意),C(一般),'); +INSERT INTO `hq_sat_detail` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `answer_score`, `remark`) VALUES (1938409340674682881, '000000', 103, 1, '2025-06-27 09:29:35', 1, '2025-06-27 10:44:25', 1, 1938409338980184066, 1937751675921375240, 0, '题目类型:2;答案值:C,A;选项详情:A(非常满意),C(一般),'); +INSERT INTO `hq_sat_detail` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `answer_score`, `remark`) VALUES (1938409341278662657, '000000', 103, 1, '2025-06-27 09:29:36', 1, '2025-06-27 10:44:25', 1, 1938409338980184066, 1937751675921375241, 0, '题目类型:3;答案值:请您对宿舍服务提出具体的意见和建议请您对宿舍服务提出具体的意见和建议请您对宿舍服务提出具体的意见和建议;'); +INSERT INTO `hq_sat_detail` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `answer_score`, `remark`) VALUES (1938409341526126594, '000000', 103, 1, '2025-06-27 09:29:36', 1, '2025-06-27 10:44:25', 1, 1938409338980184066, 1937751675921375250, 0, '题目类型:3;答案值:请您对食堂服务提出具体的意见和建议请您对食堂服务提出具体的意见和建议请您对食堂服务提出具体的意见和建议请您对食堂服务提出具体的意见和建议;'); +INSERT INTO `hq_sat_detail` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `answer_score`, `remark`) VALUES (1938428174613831681, '000000', 103, 1, '2025-06-27 10:44:26', 1, '2025-06-27 10:44:26', 0, 1938428174148263938, 1937751489358733313, 0, '题目类型:1;答案值:D;选项详情:D(不满意),'); +INSERT INTO `hq_sat_detail` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `answer_score`, `remark`) VALUES (1938428175318474753, '000000', 103, 1, '2025-06-27 10:44:26', 1, '2025-06-27 10:44:26', 0, 1938428174148263938, 1937751520555966465, 0, '题目类型:1;答案值:C;选项详情:C(一般),'); +INSERT INTO `hq_sat_detail` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `answer_score`, `remark`) VALUES (1938428175863734274, '000000', 103, 1, '2025-06-27 10:44:26', 1, '2025-06-27 10:44:26', 0, 1938428174148263938, 1937751675921375239, 0, '题目类型:2;答案值:B,D;选项详情:B(满意),D(不满意),'); +INSERT INTO `hq_sat_detail` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `answer_score`, `remark`) VALUES (1938428176484491266, '000000', 103, 1, '2025-06-27 10:44:26', 1, '2025-06-27 10:44:26', 0, 1938428174148263938, 1937751675921375240, 0, '题目类型:2;答案值:C,A;选项详情:A(非常满意),C(一般),'); +INSERT INTO `hq_sat_detail` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `answer_score`, `remark`) VALUES (1938428177075888129, '000000', 103, 1, '2025-06-27 10:44:26', 1, '2025-06-27 10:44:26', 0, 1938428174148263938, 1937751675921375241, 0, '题目类型:3;答案值:请您对宿舍服务提出具体的意见和建议请您对宿舍服务提出具体的意见和建议请您对宿舍服务提出具体的意见和建议111;'); +INSERT INTO `hq_sat_detail` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `answer_score`, `remark`) VALUES (1938428177419821057, '000000', 103, 1, '2025-06-27 10:44:26', 1, '2025-06-27 10:44:26', 0, 1938428174148263938, 1937751675921375250, 0, '题目类型:3;答案值:请您对食堂服务提出具体的意见和建议请您对食堂服务提出具体的1111意见和建议请您对食堂服务提出具体的意见和建议请您对食堂服务提出具体的意见和建议;'); +INSERT INTO `hq_sat_detail` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `answer_score`, `remark`) VALUES (1938436452676755457, '000000', 103, 1937383272285396994, '2025-06-27 11:17:19', 1937383272285396994, '2025-06-27 11:17:19', 0, 1938436452395737089, 1937751489358733313, 0, '题目类型:1;答案值:A;选项详情:A(非常满意),'); +INSERT INTO `hq_sat_detail` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `answer_score`, `remark`) VALUES (1938436453104574466, '000000', 103, 1937383272285396994, '2025-06-27 11:17:19', 1937383272285396994, '2025-06-27 11:17:19', 0, 1938436452395737089, 1937751520555966465, 0, '题目类型:1;答案值:B;选项详情:B(满意),'); +INSERT INTO `hq_sat_detail` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `answer_score`, `remark`) VALUES (1938436454006349825, '000000', 103, 1937383272285396994, '2025-06-27 11:17:20', 1937383272285396994, '2025-06-27 11:17:20', 0, 1938436452395737089, 1937751675921375239, 0, '题目类型:2;答案值:B,A;选项详情:A(非常满意),B(满意),'); +INSERT INTO `hq_sat_detail` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `answer_score`, `remark`) VALUES (1938436454677438466, '000000', 103, 1937383272285396994, '2025-06-27 11:17:20', 1937383272285396994, '2025-06-27 11:17:20', 0, 1938436452395737089, 1937751675921375240, 0, '题目类型:2;答案值:C,D;选项详情:C(一般),D(不满意),'); +INSERT INTO `hq_sat_detail` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `answer_score`, `remark`) VALUES (1938436455331749890, '000000', 103, 1937383272285396994, '2025-06-27 11:17:20', 1937383272285396994, '2025-06-27 11:17:20', 0, 1938436452395737089, 1937751675921375241, 0, '题目类型:3;答案值:的意见和建议1231231;'); +INSERT INTO `hq_sat_detail` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `record_id`, `question_id`, `answer_score`, `remark`) VALUES (1938436455646322690, '000000', 103, 1937383272285396994, '2025-06-27 11:17:20', 1937383272285396994, '2025-06-27 11:17:20', 0, 1938436452395737089, 1937751675921375250, 0, '题目类型:3;答案值:具体的意见和建议131231312;'); COMMIT; -- ---------------------------- @@ -1023,7 +966,7 @@ CREATE TABLE `hq_sat_record` ( `deleted` tinyint(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)', `survey_id` bigint(20) NOT NULL COMMENT '问卷ID', `user_id` bigint(20) DEFAULT NULL COMMENT '答题用户ID(匿名时为NULL)', - `user_type` char(1) NOT NULL COMMENT '用户类型(1学生 2教职工)', + `user_type` char(1) NOT NULL COMMENT '用户类型(1学生 2教职工 3超级管理员)', `user_dept` varchar(100) DEFAULT NULL COMMENT '用户部门(匿名时为NULL)', `submit_time` datetime NOT NULL COMMENT '提交时间', `total_score` decimal(10,2) DEFAULT '0.00' COMMENT '总分', @@ -1035,12 +978,17 @@ CREATE TABLE `hq_sat_record` ( KEY `idx_user_id` (`user_id`), KEY `idx_user_type` (`user_type`), KEY `idx_submit_time` (`submit_time`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='答题记录表'; +) ENGINE=InnoDB AUTO_INCREMENT=1938436452395737090 DEFAULT CHARSET=utf8mb4 COMMENT='答题记录表'; -- ---------------------------- -- Records of hq_sat_record -- ---------------------------- BEGIN; +INSERT INTO `hq_sat_record` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `survey_id`, `user_id`, `user_type`, `user_dept`, `submit_time`, `total_score`, `avg_score`, `remark`) VALUES (1938208005199212546, '000000', 103, 1937383272285396994, '2025-06-26 20:09:33', 1937383272285396994, '2025-06-27 11:17:19', 1, 1938162557168005122, 1937383272285396994, '1', NULL, '2025-06-26 20:09:33', 0.00, 0.00, ''); +INSERT INTO `hq_sat_record` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `survey_id`, `user_id`, `user_type`, `user_dept`, `submit_time`, `total_score`, `avg_score`, `remark`) VALUES (1938401694286499842, '000000', 103, 1, '2025-06-27 08:59:12', 1, '2025-06-27 09:29:34', 1, 1938162557168005122, 1, '1', NULL, '2025-06-27 08:59:12', 0.00, 0.00, ''); +INSERT INTO `hq_sat_record` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `survey_id`, `user_id`, `user_type`, `user_dept`, `submit_time`, `total_score`, `avg_score`, `remark`) VALUES (1938409338980184066, '000000', 103, 1, '2025-06-27 09:29:35', 1, '2025-06-27 10:44:25', 1, 1938162557168005122, 1, '1', NULL, '2025-06-27 09:29:35', 0.00, 0.00, ''); +INSERT INTO `hq_sat_record` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `survey_id`, `user_id`, `user_type`, `user_dept`, `submit_time`, `total_score`, `avg_score`, `remark`) VALUES (1938428174148263938, '000000', 103, 1, '2025-06-27 10:44:26', 1, '2025-06-27 10:44:26', 0, 1938162557168005122, 1, '1', NULL, '2025-06-27 10:44:26', 0.00, 0.00, ''); +INSERT INTO `hq_sat_record` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `survey_id`, `user_id`, `user_type`, `user_dept`, `submit_time`, `total_score`, `avg_score`, `remark`) VALUES (1938436452395737089, '000000', 103, 1937383272285396994, '2025-06-27 11:17:19', 1937383272285396994, '2025-06-27 11:17:19', 0, 1938162557168005122, 1937383272285396994, '1', NULL, '2025-06-27 11:17:19', 0.00, 0.00, ''); COMMIT; -- ---------------------------- @@ -1074,13 +1022,14 @@ CREATE TABLE `hq_sat_survey` ( KEY `idx_target_group` (`target_group`), KEY `idx_time_range` (`start_time`,`end_time`), KEY `idx_status` (`status`) -) ENGINE=InnoDB AUTO_INCREMENT=1937757151220342786 DEFAULT CHARSET=utf8mb4 COMMENT='问卷表'; +) ENGINE=InnoDB AUTO_INCREMENT=1938162557168005123 DEFAULT CHARSET=utf8mb4 COMMENT='问卷表'; -- ---------------------------- -- Records of hq_sat_survey -- ---------------------------- BEGIN; -INSERT INTO `hq_sat_survey` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `survey_code`, `survey_title`, `survey_desc`, `survey_instruction`, `target_group`, `start_time`, `end_time`, `max_submit_times`, `is_anonymous`, `is_published`, `status`, `remark`) VALUES (1937757151220342785, '000000', 103, 1, '2025-06-25 14:18:01', 1, '2025-06-26 14:32:21', 0, '001', '2025后勤问卷', '问卷描述', '填写说明', '2', '2025-06-19 00:00:00', '2025-06-25 14:17:52', 1, 1, 0, '1', NULL); +INSERT INTO `hq_sat_survey` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `survey_code`, `survey_title`, `survey_desc`, `survey_instruction`, `target_group`, `start_time`, `end_time`, `max_submit_times`, `is_anonymous`, `is_published`, `status`, `remark`) VALUES (1937757151220342785, '000000', 103, 1, '2025-06-25 14:18:01', 1, '2025-06-26 17:04:26', 0, '001', '2025后勤问卷', '问卷描述', '填写说明', '2', '2025-06-19 00:00:00', '2025-06-25 14:17:52', 10, 1, 1, '2', NULL); +INSERT INTO `hq_sat_survey` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `survey_code`, `survey_title`, `survey_desc`, `survey_instruction`, `target_group`, `start_time`, `end_time`, `max_submit_times`, `is_anonymous`, `is_published`, `status`, `remark`) VALUES (1938162557168005122, '000000', 103, 1, '2025-06-26 17:08:58', 1, '2025-06-26 19:32:57', 0, '问卷编号-000123123', '测试问卷标题', '问卷详细描述阿萨德发 问卷详细描述阿萨德发 问卷详细描述阿萨德发 ', '问卷填写说明', '3', '2025-06-26 00:00:00', '2025-06-26 00:00:00', 10, 0, 1, '2', NULL); COMMIT; -- ---------------------------- @@ -1108,7 +1057,7 @@ CREATE TABLE `hq_sat_survey_question` ( KEY `idx_survey_id` (`survey_id`), KEY `idx_question_id` (`question_id`), KEY `idx_sort_order` (`sort_order`) -) ENGINE=InnoDB AUTO_INCREMENT=1937858959930499075 DEFAULT CHARSET=utf8mb4 COMMENT='问卷题目关联表'; +) ENGINE=InnoDB AUTO_INCREMENT=1938198579117494274 DEFAULT CHARSET=utf8mb4 COMMENT='问卷题目关联表'; -- ---------------------------- -- Records of hq_sat_survey_question @@ -1117,150 +1066,12 @@ BEGIN; INSERT INTO `hq_sat_survey_question` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `survey_id`, `question_id`, `sort_order`, `weight`, `is_required`, `remark`) VALUES (1937858959557206017, '000000', 103, 1, '2025-06-25 21:02:34', 1, '2025-06-25 21:02:34', 0, 1937757151220342785, 1937751489358733313, 1, 1.00, 1, NULL); INSERT INTO `hq_sat_survey_question` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `survey_id`, `question_id`, `sort_order`, `weight`, `is_required`, `remark`) VALUES (1937858959762726914, '000000', 103, 1, '2025-06-25 21:02:34', 1, '2025-06-25 21:02:34', 0, 1937757151220342785, 1937751520555966465, 2, 1.00, 1, NULL); INSERT INTO `hq_sat_survey_question` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `survey_id`, `question_id`, `sort_order`, `weight`, `is_required`, `remark`) VALUES (1937858959930499074, '000000', 103, 1, '2025-06-25 21:02:34', 1, '2025-06-25 21:02:34', 0, 1937757151220342785, 1937751560775147522, 3, 1.00, 1, NULL); -COMMIT; - --- ---------------------------- --- Table structure for leave_application --- ---------------------------- -DROP TABLE IF EXISTS `leave_application`; -CREATE TABLE `leave_application` ( - `id` bigint(20) NOT NULL COMMENT '主键ID', - `tenant_id` varchar(20) NOT NULL COMMENT '租户编号', - `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', - `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `student_id` bigint(20) NOT NULL COMMENT '学生ID', - `leave_type_id` bigint(20) NOT NULL COMMENT '请假类型ID', - `start_time` datetime NOT NULL COMMENT '开始时间', - `end_time` datetime NOT NULL COMMENT '结束时间', - `days` decimal(3,1) NOT NULL COMMENT '请假天数', - `reason` text NOT NULL COMMENT '请假原因', - `destination` varchar(200) DEFAULT NULL COMMENT '目的地', - `location_lat` decimal(10,6) DEFAULT NULL COMMENT '纬度', - `location_lng` decimal(10,6) DEFAULT NULL COMMENT '经度', - `location_address` varchar(200) DEFAULT NULL COMMENT '详细地址', - `emergency_contact` varchar(50) DEFAULT NULL COMMENT '紧急联系人', - `emergency_phone` varchar(20) DEFAULT NULL COMMENT '紧急联系电话', - `emergency_relation` varchar(20) DEFAULT NULL COMMENT '紧急联系人关系', - `need_leave_school` tinyint(4) DEFAULT '0' COMMENT '是否需要离校:1是,0否', - `status` tinyint(4) DEFAULT '0' COMMENT '状态:0待审批,1已通过,2已拒绝,3已撤销,4已销假', - `workflow_instance_id` bigint(20) DEFAULT NULL COMMENT '工作流实例ID', - `submit_time` datetime DEFAULT NULL COMMENT '提交时间', - `approve_time` datetime DEFAULT NULL COMMENT '审批时间', - `return_time` datetime DEFAULT NULL COMMENT '销假时间', - `auto_return` tinyint(4) DEFAULT '0' COMMENT '自动销假:1是,0否', - `overdue_remind` tinyint(4) DEFAULT '0' COMMENT '逾期提醒:1已提醒,0未提醒', - `is_deleted` tinyint(4) DEFAULT '0' COMMENT '删除标记:0未删除,1已删除', - PRIMARY KEY (`id`), - KEY `idx_student_id` (`student_id`), - KEY `idx_leave_type_id` (`leave_type_id`), - KEY `idx_status` (`status`), - KEY `idx_start_time` (`start_time`), - KEY `idx_workflow_instance_id` (`workflow_instance_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='请假申请表'; - --- ---------------------------- --- Records of leave_application --- ---------------------------- -BEGIN; -COMMIT; - --- ---------------------------- --- Table structure for leave_approval --- ---------------------------- -DROP TABLE IF EXISTS `leave_approval`; -CREATE TABLE `leave_approval` ( - `id` bigint(20) NOT NULL COMMENT '主键ID', - `tenant_id` varchar(20) NOT NULL COMMENT '租户编号', - `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', - `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `leave_id` bigint(20) NOT NULL COMMENT '请假申请ID', - `approver_id` bigint(20) NOT NULL COMMENT '审批人ID', - `approval_level` int(11) NOT NULL COMMENT '审批层级', - `status` tinyint(4) NOT NULL COMMENT '审批状态:1通过,2拒绝', - `approval_time` datetime NOT NULL COMMENT '审批时间', - `remark` text COMMENT '审批意见', - `phone_verified` tinyint(4) DEFAULT '0' COMMENT '电话核实:1已核实,0未核实', - `verify_phone` varchar(20) DEFAULT NULL COMMENT '核实电话', - PRIMARY KEY (`id`), - KEY `idx_leave_id` (`leave_id`), - KEY `idx_approver_id` (`approver_id`), - KEY `idx_approval_time` (`approval_time`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='请假审批表'; - --- ---------------------------- --- Records of leave_approval --- ---------------------------- -BEGIN; -COMMIT; - --- ---------------------------- --- Table structure for leave_cc --- ---------------------------- -DROP TABLE IF EXISTS `leave_cc`; -CREATE TABLE `leave_cc` ( - `id` bigint(20) NOT NULL COMMENT '主键ID', - `tenant_id` varchar(20) NOT NULL COMMENT '租户编号', - `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', - `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `leave_id` bigint(20) NOT NULL COMMENT '请假申请ID', - `cc_user_id` bigint(20) NOT NULL COMMENT '抄送用户ID', - `cc_type` tinyint(4) DEFAULT '1' COMMENT '抄送类型:1必须抄送,2可选抄送', - `read_status` tinyint(4) DEFAULT '0' COMMENT '阅读状态:1已读,0未读', - `read_time` datetime DEFAULT NULL COMMENT '阅读时间', - PRIMARY KEY (`id`), - KEY `idx_leave_id` (`leave_id`), - KEY `idx_cc_user_id` (`cc_user_id`), - KEY `idx_read_status` (`read_status`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='请假抄送表'; - --- ---------------------------- --- Records of leave_cc --- ---------------------------- -BEGIN; -COMMIT; - --- ---------------------------- --- Table structure for leave_type --- ---------------------------- -DROP TABLE IF EXISTS `leave_type`; -CREATE TABLE `leave_type` ( - `id` bigint(20) NOT NULL COMMENT '主键ID', - `tenant_id` varchar(20) NOT NULL COMMENT '租户编号', - `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', - `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `type_name` varchar(50) NOT NULL COMMENT '请假类型名称', - `type_code` varchar(20) NOT NULL COMMENT '请假类型编码', - `max_days` int(11) DEFAULT '0' COMMENT '最大天数(0表示不限制)', - `need_approval` tinyint(4) DEFAULT '1' COMMENT '是否需要审批:1需要,0不需要', - `approval_level` int(11) DEFAULT '1' COMMENT '审批层级', - `need_leave_school` tinyint(4) DEFAULT '0' COMMENT '是否需要离校:1需要,0不需要', - `need_location` tinyint(4) DEFAULT '0' COMMENT '是否需要位置:1需要,0不需要', - `need_attachment` tinyint(4) DEFAULT '0' COMMENT '是否需要附件:1需要,0不需要', - `description` text COMMENT '描述', - `sort_order` int(11) DEFAULT '0' COMMENT '排序', - `status` tinyint(4) DEFAULT '1' COMMENT '状态:1启用,0禁用', - `is_deleted` tinyint(4) DEFAULT '0' COMMENT '删除标记:0未删除,1已删除', - PRIMARY KEY (`id`), - UNIQUE KEY `uk_type_code` (`type_code`), - KEY `idx_status` (`status`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='请假类型表'; - --- ---------------------------- --- Records of leave_type --- ---------------------------- -BEGIN; +INSERT INTO `hq_sat_survey_question` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `survey_id`, `question_id`, `sort_order`, `weight`, `is_required`, `remark`) VALUES (1938198578056335361, '000000', 103, 1, '2025-06-26 19:32:06', 1, '2025-06-26 19:32:06', 0, 1938162557168005122, 1937751489358733313, 1, 1.00, 1, NULL); +INSERT INTO `hq_sat_survey_question` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `survey_id`, `question_id`, `sort_order`, `weight`, `is_required`, `remark`) VALUES (1938198578303799298, '000000', 103, 1, '2025-06-26 19:32:06', 1, '2025-06-26 19:32:06', 0, 1938162557168005122, 1937751520555966465, 2, 1.00, 1, NULL); +INSERT INTO `hq_sat_survey_question` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `survey_id`, `question_id`, `sort_order`, `weight`, `is_required`, `remark`) VALUES (1938198578517708802, '000000', 103, 1, '2025-06-26 19:32:06', 1, '2025-06-26 19:32:06', 0, 1938162557168005122, 1937751675921375239, 3, 1.00, 1, NULL); +INSERT INTO `hq_sat_survey_question` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `survey_id`, `question_id`, `sort_order`, `weight`, `is_required`, `remark`) VALUES (1938198578719035394, '000000', 103, 1, '2025-06-26 19:32:06', 1, '2025-06-26 19:32:06', 0, 1938162557168005122, 1937751675921375240, 4, 1.00, 1, NULL); +INSERT INTO `hq_sat_survey_question` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `survey_id`, `question_id`, `sort_order`, `weight`, `is_required`, `remark`) VALUES (1938198578916167682, '000000', 103, 1, '2025-06-26 19:32:06', 1, '2025-06-26 19:32:06', 0, 1938162557168005122, 1937751675921375241, 5, 1.00, 1, NULL); +INSERT INTO `hq_sat_survey_question` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `survey_id`, `question_id`, `sort_order`, `weight`, `is_required`, `remark`) VALUES (1938198579117494273, '000000', 103, 1, '2025-06-26 19:32:06', 1, '2025-06-26 19:32:06', 0, 1938162557168005122, 1937751675921375250, 6, 1.00, 1, NULL); COMMIT; -- ---------------------------- @@ -1281,17 +1092,6 @@ CREATE TABLE `sj_distributed_lock` ( -- Records of sj_distributed_lock -- ---------------------------- BEGIN; -INSERT INTO `sj_distributed_lock` (`name`, `lock_until`, `locked_at`, `locked_by`, `create_dt`, `update_dt`) VALUES ('clearLog', '2025-06-26 14:06:08.740', '2025-06-26 14:05:08.740', '1938116279890599936', '2025-06-26 11:55:32', '2025-06-26 14:05:09'); -INSERT INTO `sj_distributed_lock` (`name`, `lock_until`, `locked_at`, `locked_by`, `create_dt`, `update_dt`) VALUES ('clearOfflineNode', '2025-06-26 14:39:02.020', '2025-06-26 14:38:57.020', '1938113914192936960', '2025-06-26 11:55:31', '2025-06-26 14:38:57'); -INSERT INTO `sj_distributed_lock` (`name`, `lock_until`, `locked_at`, `locked_by`, `create_dt`, `update_dt`) VALUES ('jobClearLog', '2025-06-26 14:06:07.375', '2025-06-26 14:05:07.375', '1938116279890599936', '2025-06-26 11:55:31', '2025-06-26 14:05:09'); -INSERT INTO `sj_distributed_lock` (`name`, `lock_until`, `locked_at`, `locked_by`, `create_dt`, `update_dt`) VALUES ('jobLogMerge', '2025-06-26 14:39:42.211', '2025-06-26 14:38:42.211', '1938113914192936960', '2025-06-26 14:05:07', '2025-06-26 14:38:42'); -INSERT INTO `sj_distributed_lock` (`name`, `lock_until`, `locked_at`, `locked_by`, `create_dt`, `update_dt`) VALUES ('jobSummaryDashboard', '2025-06-26 14:39:02.205', '2025-06-26 14:38:42.205', '1938113914192936960', '2025-06-26 14:03:42', '2025-06-26 14:38:42'); -INSERT INTO `sj_distributed_lock` (`name`, `lock_until`, `locked_at`, `locked_by`, `create_dt`, `update_dt`) VALUES ('registerNode', '2025-06-26 14:39:01.304', '2025-06-26 14:38:56.304', '1938113914192936960', '2025-06-26 11:55:31', '2025-06-26 14:38:56'); -INSERT INTO `sj_distributed_lock` (`name`, `lock_until`, `locked_at`, `locked_by`, `create_dt`, `update_dt`) VALUES ('retryErrorMoreThreshold', '2025-06-26 14:36:09.112', '2025-06-26 14:35:09.112', '1938116279890599936', '2025-06-26 14:05:09', '2025-06-26 14:35:09'); -INSERT INTO `sj_distributed_lock` (`name`, `lock_until`, `locked_at`, `locked_by`, `create_dt`, `update_dt`) VALUES ('retryLogMerge', '2025-06-26 14:06:08.904', '2025-06-26 14:05:08.904', '1938116279890599936', '2025-06-26 14:05:09', '2025-06-26 14:05:09'); -INSERT INTO `sj_distributed_lock` (`name`, `lock_until`, `locked_at`, `locked_by`, `create_dt`, `update_dt`) VALUES ('retrySummaryDashboard', '2025-06-26 14:39:02.204', '2025-06-26 14:38:42.204', '1938113914192936960', '2025-06-26 14:03:42', '2025-06-26 14:38:42'); -INSERT INTO `sj_distributed_lock` (`name`, `lock_until`, `locked_at`, `locked_by`, `create_dt`, `update_dt`) VALUES ('retryTaskMoreThreshold', '2025-06-26 14:36:09.269', '2025-06-26 14:35:09.269', '1938116279890599936', '2025-06-26 14:05:09', '2025-06-26 14:35:09'); -INSERT INTO `sj_distributed_lock` (`name`, `lock_until`, `locked_at`, `locked_by`, `create_dt`, `update_dt`) VALUES ('workflowJobSummarySchedule', '2025-06-26 14:39:02.205', '2025-06-26 14:38:42.205', '1938113914192936960', '2025-06-26 14:03:42', '2025-06-26 14:38:42'); COMMIT; -- ---------------------------- @@ -1810,16 +1610,13 @@ CREATE TABLE `sj_server_node` ( UNIQUE KEY `uk_host_id_host_ip` (`host_id`,`host_ip`), KEY `idx_namespace_id_group_name` (`namespace_id`,`group_name`), KEY `idx_expire_at_node_type` (`expire_at`,`node_type`) -) ENGINE=InnoDB AUTO_INCREMENT=196 DEFAULT CHARSET=utf8mb4 COMMENT='服务器节点'; +) ENGINE=InnoDB AUTO_INCREMENT=286 DEFAULT CHARSET=utf8mb4 COMMENT='服务器节点'; -- ---------------------------- -- Records of sj_server_node -- ---------------------------- BEGIN; -INSERT INTO `sj_server_node` (`id`, `namespace_id`, `group_name`, `host_id`, `host_ip`, `host_port`, `expire_at`, `node_type`, `ext_attrs`, `create_dt`, `update_dt`) VALUES (192, 'DEFAULT_SERVER_NAMESPACE_ID', 'DEFAULT_SERVER', '1938113914192936960', '10.241.40.29', 17888, '2025-06-26 14:39:12', 2, '{\"webPort\":8800}', '2025-06-26 13:55:42', '2025-06-26 14:38:42'); -INSERT INTO `sj_server_node` (`id`, `namespace_id`, `group_name`, `host_id`, `host_ip`, `host_port`, `expire_at`, `node_type`, `ext_attrs`, `create_dt`, `update_dt`) VALUES (193, 'dev', 'ruoyi_group', '1938114195383263232', '10.241.40.29', 28080, '2025-06-26 14:39:32', 1, NULL, '2025-06-26 13:56:48', '2025-06-26 14:39:01'); -INSERT INTO `sj_server_node` (`id`, `namespace_id`, `group_name`, `host_id`, `host_ip`, `host_port`, `expire_at`, `node_type`, `ext_attrs`, `create_dt`, `update_dt`) VALUES (194, 'DEFAULT_SERVER_NAMESPACE_ID', 'DEFAULT_SERVER', '1938116279890599936', '10.241.38.13', 17888, '2025-06-26 14:39:17', 2, '{\"webPort\":8800}', '2025-06-26 14:05:07', '2025-06-26 14:38:47'); -INSERT INTO `sj_server_node` (`id`, `namespace_id`, `group_name`, `host_id`, `host_ip`, `host_port`, `expire_at`, `node_type`, `ext_attrs`, `create_dt`, `update_dt`) VALUES (195, 'dev', 'ruoyi_group', '1938116621772390400', '10.241.38.13', 28080, '2025-06-26 14:39:32', 1, NULL, '2025-06-26 14:06:27', '2025-06-26 14:39:01'); +INSERT INTO `sj_server_node` (`id`, `namespace_id`, `group_name`, `host_id`, `host_ip`, `host_port`, `expire_at`, `node_type`, `ext_attrs`, `create_dt`, `update_dt`) VALUES (285, 'dev', 'ruoyi_group', '1938509437950607360', '169.254.107.16', 28080, '2025-06-27 16:12:22', 1, NULL, '2025-06-27 16:07:21', '2025-06-27 16:11:52'); COMMIT; -- ---------------------------- @@ -2056,16 +1853,29 @@ CREATE TABLE `sys_dept` ( -- Records of sys_dept -- ---------------------------- BEGIN; -INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (100, '000000', 0, '0', 'XXX科技', NULL, 0, NULL, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, '2025-06-20 16:22:20', NULL, NULL); -INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (101, '000000', 100, '0,100', '深圳总公司', NULL, 1, NULL, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, '2025-06-20 16:22:20', NULL, NULL); -INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (102, '000000', 100, '0,100', '长沙分公司', NULL, 2, NULL, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, '2025-06-20 16:22:20', NULL, NULL); -INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (103, '000000', 101, '0,100,101', '研发部门', NULL, 1, 1, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, '2025-06-20 16:22:20', NULL, NULL); -INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (104, '000000', 101, '0,100,101', '市场部门', NULL, 2, NULL, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, '2025-06-20 16:22:20', NULL, NULL); -INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (105, '000000', 101, '0,100,101', '测试部门', NULL, 3, NULL, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, '2025-06-20 16:22:20', NULL, NULL); -INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (106, '000000', 101, '0,100,101', '财务部门', NULL, 4, NULL, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, '2025-06-20 16:22:20', NULL, NULL); -INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (107, '000000', 101, '0,100,101', '运维部门', NULL, 5, NULL, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, '2025-06-20 16:22:20', NULL, NULL); -INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (108, '000000', 102, '0,100,102', '市场部门', NULL, 1, NULL, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, '2025-06-20 16:22:20', NULL, NULL); -INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (109, '000000', 102, '0,100,102', '财务部门', NULL, 2, NULL, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, '2025-06-20 16:22:20', NULL, NULL); +INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (100, '000000', 0, '0', '杭州第一技师学院', NULL, 0, NULL, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, '2025-06-20 16:22:20', 1, '2025-06-27 14:24:09'); +INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (101, '000000', 100, '0,100', '二级学院', NULL, 1, NULL, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, '2025-06-20 16:22:20', 1, '2025-06-27 14:24:50'); +INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (102, '000000', 100, '0,100', '行政单位', NULL, 0, NULL, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, '2025-06-16 14:58:45', 1, '2025-06-27 14:27:58'); +INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (103, '000000', 101, '0,100,101', '智能控制学院', NULL, 1, 1, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, '2025-06-16 14:58:45', 1, '2025-06-27 14:25:04'); +INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (104, '000000', 101, '0,100,101', '智能制造学院', NULL, 2, NULL, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, '2025-06-20 16:22:20', 1, '2025-06-27 14:25:18'); +INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (105, '000000', 101, '0,100,101', '医药健康学院', NULL, 3, NULL, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, '2025-06-20 16:22:20', 1, '2025-06-27 14:25:28'); +INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (106, '000000', 101, '0,100,101', '餐饮休闲学院', NULL, 4, NULL, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, '2025-06-20 16:22:20', 1, '2025-06-27 14:25:40'); +INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (107, '000000', 101, '0,100,101', '数字信息学院', NULL, 5, NULL, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, '2025-06-20 16:22:20', 1, '2025-06-27 14:25:50'); +INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (108, '000000', 102, '0,100,102', '院领导', NULL, 0, NULL, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, '2025-06-16 14:58:45', 1, '2025-06-27 14:27:51'); +INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (109, '000000', 102, '0,100,102', '办公室', NULL, 2, NULL, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, '2025-06-20 16:22:20', 1, '2025-06-27 14:28:06'); +INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (1938483954134245378, '000000', 101, '0,100,101', '人文学院', NULL, 7, NULL, NULL, NULL, '0', '0', 103, 1, '2025-06-27 14:26:05', 1, '2025-06-27 14:26:05'); +INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (1938484049621770242, '000000', 101, '0,100,101', '生态园林学院', NULL, 0, NULL, NULL, NULL, '0', '0', 103, 1, '2025-06-27 14:26:27', 1, '2025-06-27 14:26:27'); +INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (1938484510047297538, '000000', 102, '0,100,102', '人事处', NULL, 3, NULL, NULL, NULL, '0', '0', 103, 1, '2025-06-27 14:28:17', 1, '2025-06-27 14:28:17'); +INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (1938484570826956801, '000000', 102, '0,100,102', '教务处', NULL, 4, NULL, NULL, NULL, '0', '0', 103, 1, '2025-06-27 14:28:32', 1, '2025-06-27 14:28:32'); +INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (1938484606247854081, '000000', 102, '0,100,102', '科研处', NULL, 5, NULL, NULL, NULL, '0', '0', 103, 1, '2025-06-27 14:28:40', 1, '2025-06-27 14:28:40'); +INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (1938484642188845057, '000000', 102, '0,100,102', '学生处', NULL, 6, NULL, NULL, NULL, '0', '0', 103, 1, '2025-06-27 14:28:49', 1, '2025-06-27 14:28:49'); +INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (1938484683662123010, '000000', 102, '0,100,102', '计划财务处', NULL, 7, NULL, NULL, NULL, '0', '0', 103, 1, '2025-06-27 14:28:59', 1, '2025-06-27 14:28:59'); +INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (1938484727379353601, '000000', 102, '0,100,102', '招生就业处', NULL, 8, NULL, NULL, NULL, '0', '0', 103, 1, '2025-06-27 14:29:09', 1, '2025-06-27 14:29:09'); +INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (1938484762884136961, '000000', 102, '0,100,102', '培训处', NULL, 9, NULL, NULL, NULL, '0', '0', 103, 1, '2025-06-27 14:29:17', 1, '2025-06-27 14:29:17'); +INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (1938484793632579586, '000000', 102, '0,100,102', '总务处', NULL, 10, NULL, NULL, NULL, '0', '0', 103, 1, '2025-06-27 14:29:25', 1, '2025-06-27 14:29:25'); +INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (1938484834736758786, '000000', 102, '0,100,102', '保卫处', NULL, 11, NULL, NULL, NULL, '0', '0', 103, 1, '2025-06-27 14:29:35', 1, '2025-06-27 14:29:35'); +INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (1938484865401315330, '000000', 102, '0,100,102', '基建处', NULL, 12, NULL, NULL, NULL, '0', '0', 103, 1, '2025-06-27 14:29:42', 1, '2025-06-27 14:29:42'); +INSERT INTO `sys_dept` (`dept_id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_category`, `order_num`, `leader`, `phone`, `email`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (1938484923752472578, '000000', 102, '0,100,102', '临安校区综合办', NULL, 13, NULL, NULL, NULL, '0', '0', 103, 1, '2025-06-27 14:29:56', 1, '2025-06-27 14:29:56'); COMMIT; -- ---------------------------- @@ -2299,6 +2109,57 @@ INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938086898462806017, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '登录成功', '2025-06-26 12:08:19'); INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938114273363763202, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '登录成功', '2025-06-26 13:57:06'); INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938117093010833410, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '登录成功', '2025-06-26 14:08:18'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938148670439895041, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '登录成功', '2025-06-26 16:13:47'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938163610793947138, '000000', 'wuzilong', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Safari', 'OSX', '1', '密码输入错误1次', '2025-06-26 17:13:09'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938163632134565889, '000000', 'wuzilong', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Safari', 'OSX', '1', '验证码错误', '2025-06-26 17:13:14'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938163645698945026, '000000', 'wuzilong', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Safari', 'OSX', '0', '登录成功', '2025-06-26 17:13:17'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938164222822592514, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Safari', 'OSX', '1', '验证码错误', '2025-06-26 17:15:35'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938164274571915265, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Safari', 'OSX', '1', '验证码错误', '2025-06-26 17:15:47'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938164289516220417, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Safari', 'OSX', '0', '登录成功', '2025-06-26 17:15:51'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938169043600420866, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '退出成功', '2025-06-26 17:34:44'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938169079503663105, '000000', 'wuzilong', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '登录成功', '2025-06-26 17:34:53'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938186735774527490, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '登录成功', '2025-06-26 18:45:02'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938187792084824066, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '退出成功', '2025-06-26 18:49:14'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938187830479482882, '000000', 'wuzilong', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '登录成功', '2025-06-26 18:49:23'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938188071823929346, '000000', 'wuzilong', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '退出成功', '2025-06-26 18:50:21'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938188093076467713, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '登录成功', '2025-06-26 18:50:26'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938188478767886337, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '退出成功', '2025-06-26 18:51:58'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938188505254916097, '000000', 'wuzilong', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '登录成功', '2025-06-26 18:52:04'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938191072529674241, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Safari', 'OSX', '1', '验证码错误', '2025-06-26 19:02:16'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938191088728076290, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Safari', 'OSX', '0', '登录成功', '2025-06-26 19:02:20'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938192209999753217, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '登录成功', '2025-06-26 19:06:47'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938192366002696193, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '退出成功', '2025-06-26 19:07:25'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938192390354825217, '000000', 'wuzilong', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '登录成功', '2025-06-26 19:07:30'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938399875460124674, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '1', '验证码错误', '2025-06-27 08:51:59'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938399895387262977, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '登录成功', '2025-06-27 08:52:03'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938419293711937537, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '1', '验证码已失效', '2025-06-27 10:09:08'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938419329132834817, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '登录成功', '2025-06-27 10:09:17'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938436324658208770, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '退出成功', '2025-06-27 11:16:49'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938436357407334401, '000000', 'wuzilong', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '登录成功', '2025-06-27 11:16:57'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938436528245530625, '000000', 'wuzilong', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '退出成功', '2025-06-27 11:17:37'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938436546104877058, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '登录成功', '2025-06-27 11:17:42'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938469982953758722, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '登录成功', '2025-06-27 13:30:34'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938470237577371650, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '退出成功', '2025-06-27 13:31:34'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938470252848832513, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '登录成功', '2025-06-27 13:31:38'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938470378866696193, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '退出成功', '2025-06-27 13:32:08'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938470409673859073, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '登录成功', '2025-06-27 13:32:15'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938471428591935489, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '退出成功', '2025-06-27 13:36:18'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938481111918665729, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '登录成功', '2025-06-27 14:14:47'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938485271477051394, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '退出成功', '2025-06-27 14:31:19'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938485292129804290, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '登录成功', '2025-06-27 14:31:24'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938485311620734978, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '退出成功', '2025-06-27 14:31:28'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938485341551288321, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '登录成功', '2025-06-27 14:31:35'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938486189551476737, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '登录成功', '2025-06-27 14:34:58'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938490405598748673, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '登录成功', '2025-06-27 14:51:43'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938490576235618305, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Safari', 'OSX', '0', '登录成功', '2025-06-27 14:52:23'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938490742590103553, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '退出成功', '2025-06-27 14:53:03'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938491885848322050, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '登录成功', '2025-06-27 14:57:36'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938493614211948545, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '退出成功', '2025-06-27 15:04:28'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938493823318974465, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '登录成功', '2025-06-27 15:05:18'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938494205164216321, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '退出成功', '2025-06-27 15:06:49'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938494229377933314, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '登录成功', '2025-06-27 15:06:54'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938501099934208002, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '退出成功', '2025-06-27 15:34:12'); +INSERT INTO `sys_logininfor` (`info_id`, `tenant_id`, `user_name`, `client_key`, `device_type`, `ipaddr`, `login_location`, `browser`, `os`, `status`, `msg`, `login_time`) VALUES (1938501125330718722, '000000', 'admin', 'pc', 'pc', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'OSX', '0', '登录成功', '2025-06-27 15:34:19'); COMMIT; -- ---------------------------- @@ -2509,13 +2370,13 @@ INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path` INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1937482248804278275, '答题记录修改', 1937482248800083970, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'hq:satRecord:edit', '#', 103, 1, '2025-06-24 20:09:41', NULL, NULL, ''); INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1937482248804278276, '答题记录删除', 1937482248800083970, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'hq:satRecord:remove', '#', 103, 1, '2025-06-24 20:09:41', NULL, NULL, ''); INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1937482248804278277, '答题记录导出', 1937482248800083970, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'hq:satRecord:export', '#', 103, 1, '2025-06-24 20:09:41', NULL, NULL, ''); -INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1937482251627044365, '回答问卷', 1937705497146040322, 5, 'answerSurvey', 'hq/answerSurvey/index', NULL, 1, 0, 'C', '0', '0', 'hq:answerSurvey:list', 'excel', 103, 1, '2025-06-25 17:51:49', 1, '2025-06-25 17:53:23', '问卷菜单'); +INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1937482251627044365, '调查问卷', 1937705497146040322, 5, 'answerSurvey', 'hq/answerSurvey/index', NULL, 1, 0, 'C', '0', '0', 'hq:answerSurvey:list', 'excel', 103, 1, '2025-06-25 17:51:49', 1, '2025-06-26 15:10:47', '问卷菜单'); INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1937482251627044366, '回答问卷查询', 1937482251627044365, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'hq:answerSurvey:query', '#', 103, 1, '2025-06-25 17:51:49', NULL, NULL, ''); INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1937482251627044367, '回答问卷新增', 1937482251627044365, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'hq:answerSurvey:add', '#', 103, 1, '2025-06-25 17:51:49', NULL, NULL, ''); INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1937482251627044368, '回答问卷修改', 1937482251627044365, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'hq:answerSurvey:edit', '#', 103, 1, '2025-06-25 17:51:49', NULL, NULL, ''); INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1937482251627044369, '回答问卷删除', 1937482251627044365, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'hq:answerSurvey:remove', '#', 103, 1, '2025-06-25 17:51:49', NULL, NULL, ''); INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1937482251627044370, '回答问卷导出', 1937482251627044365, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'hq:answerSurvey:export', '#', 103, 1, '2025-06-25 17:51:49', NULL, NULL, ''); -INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1937482251627044865, '问卷', 1937705497146040322, 4, 'satSurvey', 'hq/satSurvey/index', NULL, 1, 0, 'C', '0', '0', 'hq:satSurvey:list', 'form', 103, 1, '2025-06-24 20:09:47', 1, '2025-06-25 14:06:03', '问卷菜单'); +INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1937482251627044865, '问卷管理', 1937705497146040322, 4, 'satSurvey', 'hq/satSurvey/index', NULL, 1, 0, 'C', '0', '0', 'hq:satSurvey:list', 'form', 103, 1, '2025-06-24 20:09:47', 1, '2025-06-26 15:10:03', '问卷菜单'); INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1937482251627044866, '问卷查询', 1937482251627044865, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'hq:satSurvey:query', '#', 103, 1, '2025-06-24 20:09:47', NULL, NULL, ''); INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1937482251627044867, '问卷新增', 1937482251627044865, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'hq:satSurvey:add', '#', 103, 1, '2025-06-24 20:09:47', NULL, NULL, ''); INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1937482251627044868, '问卷修改', 1937482251627044865, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'hq:satSurvey:edit', '#', 103, 1, '2025-06-24 20:09:47', NULL, NULL, ''); @@ -2990,6 +2851,76 @@ INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `m INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938120324049936386, '000000', '角色管理', 1, 'org.dromara.system.controller.system.SysRoleController.add()', 'POST', 1, 'admin', '研发部门', '/system/role', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"roleId\":\"1938120323613728770\",\"roleName\":\"老师\",\"roleKey\":\"teacher\",\"roleSort\":4,\"dataScope\":\"1\",\"menuCheckStrictly\":true,\"deptCheckStrictly\":true,\"status\":\"0\",\"remark\":\"\",\"menuIds\":[],\"deptIds\":[],\"superAdmin\":false}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-26 14:21:08', 234); INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938120410511319041, '000000', '用户管理', 2, 'org.dromara.system.controller.system.SysUserController.edit()', 'PUT', 1, 'admin', '研发部门', '/system/user', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":\"2025-06-24 13:32:22\",\"updateBy\":null,\"updateTime\":null,\"userId\":\"1937383272285396994\",\"deptId\":103,\"userName\":\"wuzilong\",\"nickName\":\"wuzilong\",\"userType\":\"sys_user\",\"email\":\"\",\"phonenumber\":\"\",\"sex\":\"0\",\"status\":\"0\",\"remark\":\"\",\"roleIds\":[3,\"1938120227459309569\",\"1938120323613728770\"],\"postIds\":[1],\"roleId\":null,\"userIds\":null,\"excludeUserIds\":null,\"superAdmin\":false}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-26 14:21:29', 526); INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938123146065747970, '000000', '问卷', 2, 'org.dromara.zhxy.controller.HqSatSurveyController.edit()', 'PUT', 1, 'admin', '研发部门', '/hq/satSurvey', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"id\":\"1937757151220342785\",\"deleted\":0,\"surveyCode\":\"001\",\"surveyTitle\":\"2025后勤问卷\",\"surveyDesc\":\"问卷描述\",\"surveyInstruction\":\"填写说明\",\"targetGroup\":\"2\",\"startTime\":\"2025-06-19 00:00:00\",\"endTime\":\"2025-06-25 14:17:52\",\"maxSubmitTimes\":1,\"isAnonymous\":1,\"isPublished\":0,\"status\":\"1\",\"remark\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-26 14:32:21', 145); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938126191482773506, '000000', '撤销发布问卷', 2, 'org.dromara.zhxy.controller.HqSatSurveyController.unpublishSurvey()', 'PUT', 1, 'admin', '研发部门', '/hq/satSurvey/1937757151220342785/unpublish', '0:0:0:0:0:0:0:1', '内网IP', '\"1937757151220342785\"', '{\"code\":500,\"msg\":\"操作失败\",\"data\":null}', 0, '', '2025-06-26 14:44:27', 166); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938126222805835777, '000000', '撤销发布问卷', 2, 'org.dromara.zhxy.controller.HqSatSurveyController.unpublishSurvey()', 'PUT', 1, 'admin', '研发部门', '/hq/satSurvey/1937757151220342785/unpublish', '0:0:0:0:0:0:0:1', '内网IP', '\"1937757151220342785\"', '{\"code\":500,\"msg\":\"操作失败\",\"data\":null}', 0, '', '2025-06-26 14:44:35', 73); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938126541065428993, '000000', '撤销发布问卷', 2, 'org.dromara.zhxy.controller.HqSatSurveyController.unpublishSurvey()', 'PUT', 1, 'admin', '研发部门', '/hq/satSurvey/1937757151220342785/unpublish', '0:0:0:0:0:0:0:1', '内网IP', '\"1937757151220342785\"', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-26 14:45:51', 140); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938126555036655618, '000000', '发布问卷', 2, 'org.dromara.zhxy.controller.HqSatSurveyController.publishSurvey()', 'PUT', 1, 'admin', '研发部门', '/hq/satSurvey/1937757151220342785/publish', '0:0:0:0:0:0:0:1', '内网IP', '\"1937757151220342785\"', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-26 14:45:54', 120); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938126568936579073, '000000', '撤销发布问卷', 2, 'org.dromara.zhxy.controller.HqSatSurveyController.unpublishSurvey()', 'PUT', 1, 'admin', '研发部门', '/hq/satSurvey/1937757151220342785/unpublish', '0:0:0:0:0:0:0:1', '内网IP', '\"1937757151220342785\"', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-26 14:45:57', 131); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938132634202152961, '000000', '菜单管理', 2, 'org.dromara.system.controller.system.SysMenuController.edit()', 'PUT', 1, 'admin', '研发部门', '/system/menu', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":103,\"createBy\":null,\"createTime\":\"2025-06-24 20:09:47\",\"updateBy\":null,\"updateTime\":null,\"menuId\":\"1937482251627044865\",\"parentId\":\"1937705497146040322\",\"menuName\":\"问卷管理\",\"orderNum\":4,\"path\":\"satSurvey\",\"component\":\"hq/satSurvey/index\",\"queryParam\":null,\"isFrame\":\"1\",\"isCache\":\"0\",\"menuType\":\"C\",\"visible\":\"0\",\"status\":\"0\",\"perms\":\"hq:satSurvey:list\",\"icon\":\"form\",\"remark\":\"问卷菜单\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-26 15:10:03', 233); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938132818466316290, '000000', '菜单管理', 2, 'org.dromara.system.controller.system.SysMenuController.edit()', 'PUT', 1, 'admin', '研发部门', '/system/menu', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":103,\"createBy\":null,\"createTime\":\"2025-06-25 17:51:49\",\"updateBy\":null,\"updateTime\":null,\"menuId\":\"1937482251627044365\",\"parentId\":\"1937705497146040322\",\"menuName\":\"调查问卷\",\"orderNum\":5,\"path\":\"answerSurvey\",\"component\":\"hq/answerSurvey/index\",\"queryParam\":null,\"isFrame\":\"1\",\"isCache\":\"0\",\"menuType\":\"C\",\"visible\":\"0\",\"status\":\"0\",\"perms\":\"hq:answerSurvey:list\",\"icon\":\"excel\",\"remark\":\"问卷菜单\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-26 15:10:47', 200); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938159601639108609, '000000', '发布问卷', 2, 'org.dromara.zhxy.controller.HqSatSurveyController.publishSurvey()', 'PUT', 1, 'admin', '研发部门', '/hq/satSurvey/1937757151220342785/publish', '0:0:0:0:0:0:0:1', '内网IP', '\"1937757151220342785\"', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-26 16:57:13', 253); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938159632303665153, '000000', '撤销发布问卷', 2, 'org.dromara.zhxy.controller.HqSatSurveyController.unpublishSurvey()', 'PUT', 1, 'admin', '研发部门', '/hq/satSurvey/1937757151220342785/unpublish', '0:0:0:0:0:0:0:1', '内网IP', '\"1937757151220342785\"', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-26 16:57:20', 145); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938161418494160897, '000000', '发布问卷', 2, 'org.dromara.zhxy.controller.HqSatSurveyController.publishSurvey()', 'PUT', 1, 'admin', '研发部门', '/hq/satSurvey/1937757151220342785/publish', '0:0:0:0:0:0:0:1', '内网IP', '\"1937757151220342785\"', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-26 17:04:26', 144); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938162558002671618, '000000', '问卷', 1, 'org.dromara.zhxy.controller.HqSatSurveyController.add()', 'POST', 1, 'admin', '研发部门', '/hq/satSurvey', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"id\":\"1938162557168005122\",\"deleted\":null,\"surveyCode\":\"123\",\"surveyTitle\":\"123\",\"surveyDesc\":\"123\",\"surveyInstruction\":\"123\",\"targetGroup\":\"3\",\"startTime\":\"2025-06-26 00:00:00\",\"endTime\":\"2025-06-26 00:00:00\",\"maxSubmitTimes\":null,\"isAnonymous\":null,\"isPublished\":null,\"status\":null,\"remark\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-26 17:08:58', 228); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938163346800259074, '000000', '发布问卷', 2, 'org.dromara.zhxy.controller.HqSatSurveyController.publishSurvey()', 'PUT', 1, 'admin', '研发部门', '/hq/satSurvey/1938162557168005122/publish', '0:0:0:0:0:0:0:1', '内网IP', '\"1938162557168005122\"', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-26 17:12:06', 127); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938163783691546625, '000000', '用户管理', 2, 'org.dromara.system.controller.system.SysUserController.edit()', 'PUT', 1, 'admin', '研发部门', '/system/user', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":\"2025-06-24 13:32:22\",\"updateBy\":null,\"updateTime\":null,\"userId\":\"1937383272285396994\",\"deptId\":103,\"userName\":\"wuzilong\",\"nickName\":\"wuzilong\",\"userType\":\"sys_user\",\"email\":\"\",\"phonenumber\":\"\",\"sex\":\"0\",\"status\":\"0\",\"remark\":\"\",\"roleIds\":[3,\"1938120227459309569\"],\"postIds\":[1],\"roleId\":null,\"userIds\":null,\"excludeUserIds\":null,\"superAdmin\":false}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-26 17:13:50', 479); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938163941082804226, '000000', '角色管理', 2, 'org.dromara.system.controller.system.SysRoleController.edit()', 'PUT', 1, 'admin', '研发部门', '/system/role', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":\"2025-06-20 16:22:20\",\"updateBy\":null,\"updateTime\":null,\"roleId\":3,\"roleName\":\"本部门及以下\",\"roleKey\":\"test1\",\"roleSort\":3,\"dataScope\":\"4\",\"menuCheckStrictly\":true,\"deptCheckStrictly\":true,\"status\":\"0\",\"remark\":\"\",\"menuIds\":[1,100,1001,1002,1003,1004,1005,1006,1007,101,1008,1009,1010,1011,1012,102,1013,1014,1015,1016,103,1017,1018,1019,1020,104,1021,1022,1023,1024,1025,105,1026,1027,1028,1029,1030,106,1031,1032,1033,1034,1035,107,1036,1037,1038,1039,108,500,1040,1041,1042,501,1043,1044,1045,1050,118,1600,1601,1602,1603,1620,1621,1622,1623,123,1061,1062,1063,1064,1065,\"1937078443615322113\",\"1937705497146040322\",\"1937482254454005762\",\"1937482254454005763\",\"1937482254454005764\",\"1937482254454005765\",\"1937482254454005766\",\"1937482254454005767\",\"1937482253107634177\",\"1937482253107634178\",\"1937482253107634179\",\"1937482253107634180\",\"1937482253107634181\",\"1937482253107634182\",\"1937482253527064577\",\"1937482253527064578\",\"1937482253527064579\",\"1937482253527064580\",\"1937482253527064581\",\"1937482253527064582\",\"1937482251627044865\",\"1937482251627044866\",\"1937482251627044867\",\"1937482251627044868\",\"1937482251627044869\",\"1937482251627044870\",\"1937482251627044365\",\"1937482251627044366\",\"1937482251627044367\",\"1937482251627044368\",\"1937482251627044369\",\"1937482251627044370\",\"1937482252721758210\",\"1937482252721758211\",\"1937482252721758212\",\"1937482252721758213\",\"1937482252721758214\",\"1937482252721758215\",\"1937482248800083970\",\"1937482248804278273\",\"1937482248804278274\",\"1937482248804278275\",\"1937482248804278276\",\"1937482248804278277\",\"1937705241914253314\",\"1937079022693515266\",\"1937079022693515267\",\"1937079022693515268\",\"1937079022693515269\",\"1937079022693515270\",\"1937079022693515271\",\"1937079017668739074\",\"1937079017681321985\",\"1937079017681321986\",\"1937079017681321987\",\"1937079017681321988\",\"1937079017681321989\",\"1937133799553060166\",\"1937133799553060167\",\"1937133799553060168\",\"1937133799553060169\",\"1937133799553060170\",\"1937133799553060171\",5,11638,11639,11640,11641,11642,11643,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,11618,11629,11619,11632,11633],\"deptIds\":[],\"superAdmin\":false}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-26 17:14:28', 702); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938164005750583297, '000000', '用户管理', 2, 'org.dromara.system.controller.system.SysUserController.edit()', 'PUT', 1, 'admin', '研发部门', '/system/user', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":\"2025-06-24 13:32:22\",\"updateBy\":null,\"updateTime\":null,\"userId\":\"1937383272285396994\",\"deptId\":103,\"userName\":\"wuzilong\",\"nickName\":\"wuzilong\",\"userType\":\"sys_user\",\"email\":\"\",\"phonenumber\":\"\",\"sex\":\"0\",\"status\":\"0\",\"remark\":\"\",\"roleIds\":[3,\"1938120227459309569\"],\"postIds\":[1],\"roleId\":null,\"userIds\":null,\"excludeUserIds\":null,\"superAdmin\":false}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-26 17:14:43', 388); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938164052714205186, '000000', '用户管理', 4, 'org.dromara.system.controller.system.SysUserController.insertAuthRole()', 'PUT', 1, 'admin', '研发部门', '/system/user/authRole', '0:0:0:0:0:0:0:1', '内网IP', '{\"roleIds\":\"3,1938120227459309569\",\"userId\":\"4\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-26 17:14:54', 266); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938188025606893570, '000000', '用户头像', 2, 'org.dromara.system.controller.system.SysProfileController.avatar()', 'POST', 1, 'wuzilong', '研发部门', '/system/user/profile/avatar', '0:0:0:0:0:0:0:1', '内网IP', '', '{\"code\":200,\"msg\":\"操作成功\",\"data\":{\"imgUrl\":\"http://47.99.164.66:20004/ruoyi/2025/06/26/c88c097f331647d4bfffa87e17da1f3d.jpeg\"}}', 0, '', '2025-06-26 18:50:10', 1678); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938188231459139585, '000000', '用户头像', 2, 'org.dromara.system.controller.system.SysProfileController.avatar()', 'POST', 1, 'admin', '研发部门', '/system/user/profile/avatar', '0:0:0:0:0:0:0:1', '内网IP', '', '{\"code\":200,\"msg\":\"操作成功\",\"data\":{\"imgUrl\":\"http://47.99.164.66:20004/ruoyi/2025/06/26/2a24f30f55544c39a6e02c74137ca770.jpeg\"}}', 0, '', '2025-06-26 18:50:59', 433); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938188367643996162, '000000', '用户头像', 2, 'org.dromara.system.controller.system.SysProfileController.avatar()', 'POST', 1, 'admin', '研发部门', '/system/user/profile/avatar', '0:0:0:0:0:0:0:1', '内网IP', '', '{\"code\":200,\"msg\":\"操作成功\",\"data\":{\"imgUrl\":\"http://47.99.164.66:20004/ruoyi/2025/06/26/5876680ac2cf451dac5aaf1255fa41d7.jpeg\"}}', 0, '', '2025-06-26 18:51:31', 368); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938188582174257154, '000000', '用户头像', 2, 'org.dromara.system.controller.system.SysProfileController.avatar()', 'POST', 1, 'wuzilong', '研发部门', '/system/user/profile/avatar', '0:0:0:0:0:0:0:1', '内网IP', '', '{\"code\":500,\"msg\":\"文件格式不正确,请上传[bmp, gif, jpg, jpeg, png]格式\",\"data\":null}', 0, '', '2025-06-26 18:52:22', 30); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938188596527165441, '000000', '用户头像', 2, 'org.dromara.system.controller.system.SysProfileController.avatar()', 'POST', 1, 'wuzilong', '研发部门', '/system/user/profile/avatar', '0:0:0:0:0:0:0:1', '内网IP', '', '{\"code\":500,\"msg\":\"文件格式不正确,请上传[bmp, gif, jpg, jpeg, png]格式\",\"data\":null}', 0, '', '2025-06-26 18:52:26', 1); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938188609395290113, '000000', '用户头像', 2, 'org.dromara.system.controller.system.SysProfileController.avatar()', 'POST', 1, 'wuzilong', '研发部门', '/system/user/profile/avatar', '0:0:0:0:0:0:0:1', '内网IP', '', '{\"code\":500,\"msg\":\"文件格式不正确,请上传[bmp, gif, jpg, jpeg, png]格式\",\"data\":null}', 0, '', '2025-06-26 18:52:29', 22); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938188613589594113, '000000', '用户头像', 2, 'org.dromara.system.controller.system.SysProfileController.avatar()', 'POST', 1, 'wuzilong', '研发部门', '/system/user/profile/avatar', '0:0:0:0:0:0:0:1', '内网IP', '', '{\"code\":500,\"msg\":\"文件格式不正确,请上传[bmp, gif, jpg, jpeg, png]格式\",\"data\":null}', 0, '', '2025-06-26 18:52:30', 0); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938188651673874433, '000000', '用户头像', 2, 'org.dromara.system.controller.system.SysProfileController.avatar()', 'POST', 1, 'wuzilong', '研发部门', '/system/user/profile/avatar', '0:0:0:0:0:0:0:1', '内网IP', '', '{\"code\":200,\"msg\":\"操作成功\",\"data\":{\"imgUrl\":\"http://47.99.164.66:20004/ruoyi/2025/06/26/b675346b357d4b4b8fb5fa0143ad11d6.jpeg\"}}', 0, '', '2025-06-26 18:52:39', 430); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938191196093870081, '000000', '撤销发布问卷', 2, 'org.dromara.zhxy.controller.HqSatSurveyController.unpublishSurvey()', 'PUT', 1, 'admin', '研发部门', '/hq/satSurvey/1938162557168005122/unpublish', '0:0:0:0:0:0:0:1', '内网IP', '\"1938162557168005122\"', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-26 19:02:46', 255); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938191310573203458, '000000', '问卷题目管理', 2, 'org.dromara.zhxy.controller.HqSatSurveyController.updateSurveyQuestions()', 'PUT', 1, 'admin', '研发部门', '/hq/satSurvey/1938162557168005122/questions', '0:0:0:0:0:0:0:1', '内网IP', '\"1938162557168005122\" [{\"questionId\":\"1937751489358733313\",\"questionTitle\":\"你觉得宿舍各项设施是否齐全?\",\"questionType\":\"1\",\"categoryId\":\"1937713488394067969\",\"sortOrder\":1,\"weight\":1,\"isRequired\":1,\"options\":[{\"id\":1,\"deleted\":0,\"optionText\":\"非常满意\",\"optionValue\":5,\"sortOrder\":1,\"status\":\"0\",\"remark\":null},{\"id\":2,\"deleted\":0,\"optionText\":\"满意\",\"optionValue\":3,\"sortOrder\":2,\"status\":\"0\",\"remark\":null},{\"id\":3,\"deleted\":0,\"optionText\":\"一般\",\"optionValue\":1,\"sortOrder\":3,\"status\":\"0\",\"remark\":null},{\"id\":4,\"deleted\":0,\"optionText\":\"不满意\",\"optionValue\":0,\"sortOrder\":4,\"status\":\"0\",\"remark\":null}]},{\"questionId\":\"1937751520555966465\",\"questionTitle\":\"你对宿舍管理人员的态度满意吗?\",\"questionType\":\"1\",\"categoryId\":\"1937713488394067969\",\"sortOrder\":2,\"weight\":1,\"isRequired\":1,\"options\":[{\"id\":1,\"deleted\":0,\"optionText\":\"非常满意\",\"optionValue\":5,\"sortOrder\":1,\"status\":\"0\",\"remark\":null},{\"id\":2,\"deleted\":0,\"optionText\":\"满意\",\"optionValue\":3,\"sortOrder\":2,\"status\":\"0\",\"remark\":null},{\"id\":3,\"deleted\":0,\"optionText\":\"一般\",\"optionValue\":1,\"sortOrder\":3,\"status\":\"0\",\"remark\":null},{\"id\":4,\"deleted\":0,\"optionText\":\"不满意\",\"optionValue\":0,\"sortOrder\":4,\"status\":\"0\",\"remark\":null}]},{\"questionId\":\"1937751560775147522\",\"questionTitle\":\"对宿舍维修服务是否满意?\",\"questionType\":\"1\",\"categoryId\":\"1937713488394067969\",\"sortOrder\":3,\"weight\":1,\"isRequired\":1,\"options\":[{\"id\":1,\"deleted\":0,\"optionText\":\"非常满意\",\"optionValue\":5,\"sortOrder\":1,\"status\":\"0\",\"remark\":null},{\"id\":2,\"deleted\":0,\"optionText\":\"满意\",\"optionValue\":3,\"sortOrder\":2,\"status\":\"0\",\"remark\":null},{\"id\":3,\"deleted\":0,\"optionText\":\"一般\",\"optionValue\":1,\"sortOrder\":3,\"status\":\"0\",\"remark\":null},{\"id\":4,\"deleted\":0,\"optionText\":\"不满意\",\"optionValue\":0,\"sortOrder\":4,\"status\":\"0\",\"remark\":null}]},{\"questionId\":\"1937751675921375233\",\"questionTitle\":\"图书馆后勤态度图书馆后勤态度图书馆后勤态度图书馆后勤态度图书馆后勤态度图?\",\"questionType\":\"1\",\"categoryId\":\"1937713488394067969\",\"sortOrder\":4,\"weight\":1,\"isRequired\":1,\"options\":[{\"id\":1,\"deleted\":0,\"optionText\":\"非常满意\",\"optionValue\":5,\"sortOrder\":1,\"status\":\"0\",\"remark\":null},{\"id\":2,\"deleted\":0,\"optionText\":\"满意\",\"optionValue\":3,\"sortOrder\":2,\"status\":\"0\",\"remark\":null},{\"id\":3,\"deleted\":0,\"optionText\":\"一般\",\"optionValue\":1,\"sortOrder\":3,\"status\":\"0\",\"remark\":null},{\"id\":4,\"deleted\":0,\"optionText\":\"不满意\",\"optionValue\":0,\"sortOrder\":4,\"status\":\"0\",\"remark\":null}]},{\"questionId\":\"1937751675921375234\",\"questionTitle\":\"您对宿舍楼整体环境的满意度如何?\",\"questionType\":\"1\",\"categoryId\":1,\"sortOrder\":5,\"weight\":1,\"isRequired\":1,\"options\":[{\"id\":1,\"deleted\":0,\"optionText\":\"非常满意\",\"optionValue\":5,\"sortOrder\":1,\"status\":\"0\",\"remark\":null},{\"id\":2,\"deleted\":0,\"optionText\":\"满意\",\"optionValue\":3,\"sortOrder\":2,\"status\":\"0\",\"remark\":null},{\"id\":3,\"deleted\":0,\"optionText\":\"一般\",\"optionValue\":1,\"sortOrder\":3,\"status\":\"0\",\"remark\":null},{\"id\":4,\"deleted\":0,\"optionText\":\"不满意\",\"optionValue\":0,\"sortOrder\":4,\"status\":\"0\",\"remark\":null}]},{\"questionId\":\"1937751675921375235\",\"questionTitle\":\"您对宿舍房间内设施(床铺、桌椅、柜子等)的满意度如何?\",\"questionType\":\"1\",\"categoryId\":1,\"sortOrder\":6,\"weight\":1,\"isRequired\":1,\"options\":[{\"id\":1,\"deleted\":0,\"optionText\":\"非常满意\",\"optionValue\":5,\"sortOrder\":1,\"status\":\"0\",\"remark\":null},{\"id\":2,\"deleted\":0,\"optionText\":\"满意\",\"optionValue\":3,\"sortOrder\":2,\"status\":\"0\",\"remark\":null},{\"id\":3,\"deleted\":0,\"optionText\":\"一般\",\"optionValue\":1,\"sortOrder\":3,\"status\":\"0\",\"remark\":null},{\"id\":4,\"deleted\":0,\"optionText\":\"不满意\",\"optionValue\":0,\"sortOrder\":4,\"status\":\"0\",\"remark\":null}]},{\"questionId\":\"1937751675921375236\",\"questionTitle\":\"您对宿舍楼公共区域卫生状况的满意度如何?\",\"questionType\":\"1\",\"categoryId\":1,\"sortOrder\":7,\"weight\":1,\"isRequired\":1,\"options\":[{\"id\":1,\"deleted\":0,\"optionText\":\"非常满意\",\"optionValue\":5,\"sortOrder\":1,\"status\":\"0\",\"remark\":null},{\"id\":2,\"deleted\":0,\"optionText\":\"满意\",\"optionValue\":3,\"sortOrder\":2,\"status\":\"0\",\"remark\":null},{\"id\":3,\"deleted\":0,\"optionText\":\"一般\",\"optionVal', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-26 19:03:13', 2677); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938191364046385154, '000000', '发布问卷', 2, 'org.dromara.zhxy.controller.HqSatSurveyController.publishSurvey()', 'PUT', 1, 'admin', '研发部门', '/hq/satSurvey/1938162557168005122/publish', '0:0:0:0:0:0:0:1', '内网IP', '\"1938162557168005122\"', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-26 19:03:26', 139); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938192168740384769, '000000', '角色管理', 2, 'org.dromara.system.controller.system.SysRoleController.edit()', 'PUT', 1, 'admin', '研发部门', '/system/role', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":\"2025-06-26 14:20:45\",\"updateBy\":null,\"updateTime\":null,\"roleId\":\"1938120227459309569\",\"roleName\":\"学生\",\"roleKey\":\"student\",\"roleSort\":3,\"dataScope\":\"1\",\"menuCheckStrictly\":true,\"deptCheckStrictly\":true,\"status\":\"0\",\"remark\":\"\",\"menuIds\":[\"1937078443615322113\",\"1937705497146040322\",\"1937482254454005762\",\"1937482254454005763\",\"1937482254454005764\",\"1937482254454005765\",\"1937482254454005766\",\"1937482254454005767\",\"1937482253107634177\",\"1937482253107634178\",\"1937482253107634179\",\"1937482253107634180\",\"1937482253107634181\",\"1937482253107634182\",\"1937482253527064577\",\"1937482253527064578\",\"1937482253527064579\",\"1937482253527064580\",\"1937482253527064581\",\"1937482253527064582\",\"1937482251627044865\",\"1937482251627044866\",\"1937482251627044867\",\"1937482251627044868\",\"1937482251627044869\",\"1937482251627044870\",\"1937482251627044365\",\"1937482251627044366\",\"1937482251627044367\",\"1937482251627044368\",\"1937482251627044369\",\"1937482251627044370\",\"1937482252721758210\",\"1937482252721758211\",\"1937482252721758212\",\"1937482252721758213\",\"1937482252721758214\",\"1937482252721758215\",\"1937482248800083970\",\"1937482248804278273\",\"1937482248804278274\",\"1937482248804278275\",\"1937482248804278276\",\"1937482248804278277\",\"1937705241914253314\",\"1937079022693515266\",\"1937079022693515267\",\"1937079022693515268\",\"1937079022693515269\",\"1937079022693515270\",\"1937079022693515271\",\"1937079017668739074\",\"1937079017681321985\",\"1937079017681321986\",\"1937079017681321987\",\"1937079017681321988\",\"1937079017681321989\",\"1937133799553060166\",\"1937133799553060167\",\"1937133799553060168\",\"1937133799553060169\",\"1937133799553060170\",\"1937133799553060171\"],\"deptIds\":[],\"superAdmin\":false}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-26 19:06:38', 706); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938198463002382338, '000000', '撤销发布问卷', 2, 'org.dromara.zhxy.controller.HqSatSurveyController.unpublishSurvey()', 'PUT', 1, 'admin', '研发部门', '/hq/satSurvey/1938162557168005122/unpublish', '0:0:0:0:0:0:0:1', '内网IP', '\"1938162557168005122\"', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-26 19:31:38', 211); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938198579348180993, '000000', '问卷题目管理', 2, 'org.dromara.zhxy.controller.HqSatSurveyController.updateSurveyQuestions()', 'PUT', 1, 'admin', '研发部门', '/hq/satSurvey/1938162557168005122/questions', '0:0:0:0:0:0:0:1', '内网IP', '\"1938162557168005122\" [{\"questionId\":\"1937751489358733313\",\"questionTitle\":\"你觉得宿舍各项设施是否齐全?\",\"questionType\":\"1\",\"categoryId\":\"1937713488394067969\",\"sortOrder\":1,\"weight\":1,\"isRequired\":1,\"options\":[{\"id\":1,\"deleted\":0,\"optionText\":\"非常满意\",\"optionValue\":5,\"sortOrder\":1,\"status\":\"0\",\"remark\":null},{\"id\":2,\"deleted\":0,\"optionText\":\"满意\",\"optionValue\":3,\"sortOrder\":2,\"status\":\"0\",\"remark\":null},{\"id\":3,\"deleted\":0,\"optionText\":\"一般\",\"optionValue\":1,\"sortOrder\":3,\"status\":\"0\",\"remark\":null},{\"id\":4,\"deleted\":0,\"optionText\":\"不满意\",\"optionValue\":0,\"sortOrder\":4,\"status\":\"0\",\"remark\":null}]},{\"questionId\":\"1937751520555966465\",\"questionTitle\":\"你对宿舍管理人员的态度满意吗?\",\"questionType\":\"1\",\"categoryId\":\"1937713488394067969\",\"sortOrder\":2,\"weight\":1,\"isRequired\":1,\"options\":[{\"id\":1,\"deleted\":0,\"optionText\":\"非常满意\",\"optionValue\":5,\"sortOrder\":1,\"status\":\"0\",\"remark\":null},{\"id\":2,\"deleted\":0,\"optionText\":\"满意\",\"optionValue\":3,\"sortOrder\":2,\"status\":\"0\",\"remark\":null},{\"id\":3,\"deleted\":0,\"optionText\":\"一般\",\"optionValue\":1,\"sortOrder\":3,\"status\":\"0\",\"remark\":null},{\"id\":4,\"deleted\":0,\"optionText\":\"不满意\",\"optionValue\":0,\"sortOrder\":4,\"status\":\"0\",\"remark\":null}]},{\"questionId\":\"1937751675921375239\",\"questionTitle\":\"您认为宿舍楼还需要改善哪些方面?(可多选)\",\"questionType\":\"2\",\"categoryId\":1,\"sortOrder\":3,\"weight\":1,\"isRequired\":1,\"options\":[{\"id\":1,\"deleted\":0,\"optionText\":\"非常满意\",\"optionValue\":5,\"sortOrder\":1,\"status\":\"0\",\"remark\":null},{\"id\":2,\"deleted\":0,\"optionText\":\"满意\",\"optionValue\":3,\"sortOrder\":2,\"status\":\"0\",\"remark\":null},{\"id\":3,\"deleted\":0,\"optionText\":\"一般\",\"optionValue\":1,\"sortOrder\":3,\"status\":\"0\",\"remark\":null},{\"id\":4,\"deleted\":0,\"optionText\":\"不满意\",\"optionValue\":0,\"sortOrder\":4,\"status\":\"0\",\"remark\":null}]},{\"questionId\":\"1937751675921375240\",\"questionTitle\":\"您希望宿舍楼增加哪些便民设施?(可多选)\",\"questionType\":\"2\",\"categoryId\":1,\"sortOrder\":4,\"weight\":1,\"isRequired\":1,\"options\":[{\"id\":1,\"deleted\":0,\"optionText\":\"非常满意\",\"optionValue\":5,\"sortOrder\":1,\"status\":\"0\",\"remark\":null},{\"id\":2,\"deleted\":0,\"optionText\":\"满意\",\"optionValue\":3,\"sortOrder\":2,\"status\":\"0\",\"remark\":null},{\"id\":3,\"deleted\":0,\"optionText\":\"一般\",\"optionValue\":1,\"sortOrder\":3,\"status\":\"0\",\"remark\":null},{\"id\":4,\"deleted\":0,\"optionText\":\"不满意\",\"optionValue\":0,\"sortOrder\":4,\"status\":\"0\",\"remark\":null}]},{\"questionId\":\"1937751675921375241\",\"questionTitle\":\"请您对宿舍服务提出具体的意见和建议\",\"questionType\":\"3\",\"categoryId\":1,\"sortOrder\":5,\"weight\":1,\"isRequired\":1,\"options\":[{\"id\":1,\"deleted\":0,\"optionText\":\"非常满意\",\"optionValue\":5,\"sortOrder\":1,\"status\":\"0\",\"remark\":null},{\"id\":2,\"deleted\":0,\"optionText\":\"满意\",\"optionValue\":3,\"sortOrder\":2,\"status\":\"0\",\"remark\":null},{\"id\":3,\"deleted\":0,\"optionText\":\"一般\",\"optionValue\":1,\"sortOrder\":3,\"status\":\"0\",\"remark\":null},{\"id\":4,\"deleted\":0,\"optionText\":\"不满意\",\"optionValue\":0,\"sortOrder\":4,\"status\":\"0\",\"remark\":null}]},{\"questionId\":\"1937751675921375250\",\"questionTitle\":\"请您对食堂服务提出具体的意见和建议\",\"questionType\":\"3\",\"categoryId\":2,\"sortOrder\":6,\"weight\":1,\"isRequired\":1,\"options\":[{\"id\":1,\"deleted\":0,\"optionText\":\"非常满意\",\"optionValue\":5,\"sortOrder\":1,\"status\":\"0\",\"remark\":null},{\"id\":2,\"deleted\":0,\"optionText\":\"满意\",\"optionValue\":3,\"sortOrder\":2,\"status\":\"0\",\"remark\":null},{\"id\":3,\"deleted\":0,\"optionText\":\"一般\",\"optionValue\":1,\"sortOrder\":3,\"status\":\"0\",\"remark\":null},{\"id\":4,\"deleted\":0,\"optionText\":\"不满意\",\"optionValue\":0,\"sortOrder\":4,\"status\":\"0\",\"remark\":null}]}]', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-26 19:32:06', 510); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938198593394905089, '000000', '发布问卷', 2, 'org.dromara.zhxy.controller.HqSatSurveyController.publishSurvey()', 'PUT', 1, 'admin', '研发部门', '/hq/satSurvey/1938162557168005122/publish', '0:0:0:0:0:0:0:1', '内网IP', '\"1938162557168005122\"', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-26 19:32:09', 113); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938198655760011265, '000000', '撤销发布问卷', 2, 'org.dromara.zhxy.controller.HqSatSurveyController.unpublishSurvey()', 'PUT', 1, 'admin', '研发部门', '/hq/satSurvey/1938162557168005122/unpublish', '0:0:0:0:0:0:0:1', '内网IP', '\"1938162557168005122\"', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-26 19:32:24', 141); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938198781509439489, '000000', '问卷', 2, 'org.dromara.zhxy.controller.HqSatSurveyController.edit()', 'PUT', 1, 'admin', '研发部门', '/hq/satSurvey', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"id\":\"1938162557168005122\",\"deleted\":0,\"surveyCode\":\"问卷编号-000123123\",\"surveyTitle\":\"测试问卷标题\",\"surveyDesc\":\"问卷详细描述阿萨德发 问卷详细描述阿萨德发 问卷详细描述阿萨德发 \",\"surveyInstruction\":\"问卷填写说明\",\"targetGroup\":\"3\",\"startTime\":\"2025-06-26 00:00:00\",\"endTime\":\"2025-06-26 00:00:00\",\"maxSubmitTimes\":1,\"isAnonymous\":0,\"isPublished\":0,\"status\":\"0\",\"remark\":null,\"targetGroupIn\":null,\"statusIn\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-26 19:32:54', 125); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938198793534509058, '000000', '发布问卷', 2, 'org.dromara.zhxy.controller.HqSatSurveyController.publishSurvey()', 'PUT', 1, 'admin', '研发部门', '/hq/satSurvey/1938162557168005122/publish', '0:0:0:0:0:0:0:1', '内网IP', '\"1938162557168005122\"', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-26 19:32:57', 132); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938205153537998849, '000000', '提交问卷答案', 1, 'org.dromara.zhxy.controller.HqSatSurveyController.submitSurveyAnswer()', 'POST', 1, 'wuzilong', '研发部门', '/hq/satSurvey/answer/submit', '0:0:0:0:0:0:0:1', '内网IP', '{\"surveyId\":\"1938162557168005122\",\"startTime\":\"2025-06-26T11:42:21.547Z\",\"endTime\":\"2025-06-26T11:58:11.369Z\",\"isAnonymous\":0,\"answers\":[{\"questionId\":\"1937751489358733313\",\"questionType\":\"1\",\"answerValue\":\"3\",\"options\":[{\"optionId\":2,\"optionValue\":\"3\",\"optionText\":\"满意\",\"isSelected\":true}]},{\"questionId\":\"1937751520555966465\",\"questionType\":\"1\",\"answerValue\":\"3\",\"options\":[{\"optionId\":2,\"optionValue\":\"3\",\"optionText\":\"满意\",\"isSelected\":true}]},{\"questionId\":\"1937751675921375239\",\"questionType\":\"2\",\"answerValue\":\"3,5\",\"options\":[{\"optionId\":1,\"optionValue\":\"5\",\"optionText\":\"非常满意\",\"isSelected\":true},{\"optionId\":2,\"optionValue\":\"3\",\"optionText\":\"满意\",\"isSelected\":true}]},{\"questionId\":\"1937751675921375240\",\"questionType\":\"2\",\"answerValue\":\"3,5\",\"options\":[{\"optionId\":1,\"optionValue\":\"5\",\"optionText\":\"非常满意\",\"isSelected\":true},{\"optionId\":2,\"optionValue\":\"3\",\"optionText\":\"满意\",\"isSelected\":true}]},{\"questionId\":\"1937751675921375241\",\"questionType\":\"3\",\"answerValue\":\"请您对宿舍服务提出具体的意见和建议请您对宿舍服务提出具体的意见和建议\",\"options\":[]},{\"questionId\":\"1937751675921375250\",\"questionType\":\"3\",\"answerValue\":\"请您对食堂服务提出具体的意见和建议请您对食堂服务提出具体的意见和建议请您对食堂服务提出具体的意见和建议\",\"options\":[]}],\"remark\":\"\"}', '', 1, '\n### Error updating database. Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column \'user_type\' at row 1\n### The error may exist in org/dromara/zhxy/mapper/HqSatRecordMapper.java (best guess)\n### The error may involve org.dromara.zhxy.mapper.HqSatRecordMapper.insert-Inline\n### The error occurred while setting parameters\n### SQL: INSERT INTO hq_sat_record (id, survey_id, user_id, user_type, submit_time, total_score, avg_score, remark, create_dept, create_by, create_time, update_by, update_time, tenant_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, \'000000\')\n### Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column \'user_type\' at row 1\n; Data truncation: Data too long for column \'user_type\' at row 1', '2025-06-26 19:58:13', 646); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938205593109446658, '000000', '提交问卷答案', 1, 'org.dromara.zhxy.controller.HqSatSurveyController.submitSurveyAnswer()', 'POST', 1, 'wuzilong', '研发部门', '/hq/satSurvey/answer/submit', '0:0:0:0:0:0:0:1', '内网IP', '{\"surveyId\":\"1938162557168005122\",\"startTime\":\"2025-06-26T11:42:21.547Z\",\"endTime\":\"2025-06-26T11:59:57.592Z\",\"isAnonymous\":0,\"answers\":[{\"questionId\":\"1937751489358733313\",\"questionType\":\"1\",\"answerValue\":\"3\",\"options\":[{\"optionId\":2,\"optionValue\":\"3\",\"optionText\":\"满意\",\"isSelected\":true}]},{\"questionId\":\"1937751520555966465\",\"questionType\":\"1\",\"answerValue\":\"3\",\"options\":[{\"optionId\":2,\"optionValue\":\"3\",\"optionText\":\"满意\",\"isSelected\":true}]},{\"questionId\":\"1937751675921375239\",\"questionType\":\"2\",\"answerValue\":\"3,5\",\"options\":[{\"optionId\":1,\"optionValue\":\"5\",\"optionText\":\"非常满意\",\"isSelected\":true},{\"optionId\":2,\"optionValue\":\"3\",\"optionText\":\"满意\",\"isSelected\":true}]},{\"questionId\":\"1937751675921375240\",\"questionType\":\"2\",\"answerValue\":\"3,5\",\"options\":[{\"optionId\":1,\"optionValue\":\"5\",\"optionText\":\"非常满意\",\"isSelected\":true},{\"optionId\":2,\"optionValue\":\"3\",\"optionText\":\"满意\",\"isSelected\":true}]},{\"questionId\":\"1937751675921375241\",\"questionType\":\"3\",\"answerValue\":\"请您对宿舍服务提出具体的意见和建议请您对宿舍服务提出具体的意见和建议\",\"options\":[]},{\"questionId\":\"1937751675921375250\",\"questionType\":\"3\",\"answerValue\":\"请您对食堂服务提出具体的意见和建议请您对食堂服务提出具体的意见和建议请您对食堂服务提出具体的意见和建议\",\"options\":[]}],\"remark\":\"\"}', '', 1, '\n### Error updating database. Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column \'user_type\' at row 1\n### The error may exist in org/dromara/zhxy/mapper/HqSatRecordMapper.java (best guess)\n### The error may involve org.dromara.zhxy.mapper.HqSatRecordMapper.insert-Inline\n### The error occurred while setting parameters\n### SQL: INSERT INTO hq_sat_record (id, survey_id, user_id, user_type, submit_time, total_score, avg_score, remark, create_dept, create_by, create_time, update_by, update_time, tenant_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, \'000000\')\n### Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column \'user_type\' at row 1\n; Data truncation: Data too long for column \'user_type\' at row 1', '2025-06-26 19:59:58', 264); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938208007468331009, '000000', '提交问卷答案', 1, 'org.dromara.zhxy.controller.HqSatSurveyController.submitSurveyAnswer()', 'POST', 1, 'wuzilong', '研发部门', '/hq/satSurvey/answer/submit', '0:0:0:0:0:0:0:1', '内网IP', '{\"surveyId\":\"1938162557168005122\",\"startTime\":\"2025-06-26T12:09:01.757Z\",\"endTime\":\"2025-06-26T12:09:32.783Z\",\"isAnonymous\":0,\"answers\":[{\"questionId\":\"1937751489358733313\",\"questionType\":\"1\",\"answerValue\":\"1\",\"options\":[{\"optionId\":3,\"optionValue\":\"1\",\"optionText\":\"一般\",\"isSelected\":true}]},{\"questionId\":\"1937751520555966465\",\"questionType\":\"1\",\"answerValue\":\"3\",\"options\":[{\"optionId\":2,\"optionValue\":\"3\",\"optionText\":\"满意\",\"isSelected\":true}]},{\"questionId\":\"1937751675921375239\",\"questionType\":\"2\",\"answerValue\":\"3,5\",\"options\":[{\"optionId\":1,\"optionValue\":\"5\",\"optionText\":\"非常满意\",\"isSelected\":true},{\"optionId\":2,\"optionValue\":\"3\",\"optionText\":\"满意\",\"isSelected\":true}]},{\"questionId\":\"1937751675921375240\",\"questionType\":\"2\",\"answerValue\":\"3,5\",\"options\":[{\"optionId\":1,\"optionValue\":\"5\",\"optionText\":\"非常满意\",\"isSelected\":true},{\"optionId\":2,\"optionValue\":\"3\",\"optionText\":\"满意\",\"isSelected\":true}]},{\"questionId\":\"1937751675921375241\",\"questionType\":\"3\",\"answerValue\":\"123\",\"options\":[]},{\"questionId\":\"1937751675921375250\",\"questionType\":\"3\",\"answerValue\":\"123213\",\"options\":[]}],\"remark\":\"\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":{\"id\":\"1938208005199212546\",\"deleted\":0,\"surveyId\":\"1938162557168005122\",\"userId\":\"1937383272285396994\",\"userType\":\"1\",\"userDept\":null,\"submitTime\":\"2025-06-26 20:09:33\",\"totalScore\":0,\"avgScore\":0,\"remark\":\"\"}}', 0, '', '2025-06-26 20:09:34', 724); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938212521126625282, '000000', '提交问卷答案', 1, 'org.dromara.zhxy.controller.HqSatSurveyController.submitSurveyAnswer()', 'POST', 1, 'wuzilong', '研发部门', '/hq/satSurvey/answer/submit', '0:0:0:0:0:0:0:1', '内网IP', '{\"surveyId\":\"1938162557168005122\",\"startTime\":\"2025-06-26T12:27:17.831Z\",\"endTime\":\"2025-06-26T12:27:29.336Z\",\"isAnonymous\":0,\"answers\":[{\"questionId\":\"1937751489358733313\",\"questionType\":\"1\",\"answerValue\":\"1\",\"options\":[{\"optionId\":3,\"optionValue\":\"1\",\"optionText\":\"一般\",\"isSelected\":true}]},{\"questionId\":\"1937751520555966465\",\"questionType\":\"1\",\"answerValue\":\"1\",\"options\":[{\"optionId\":3,\"optionValue\":\"1\",\"optionText\":\"一般\",\"isSelected\":true}]},{\"questionId\":\"1937751675921375239\",\"questionType\":\"2\",\"answerValue\":\"1\",\"options\":[{\"optionId\":3,\"optionValue\":\"1\",\"optionText\":\"一般\",\"isSelected\":true}]},{\"questionId\":\"1937751675921375240\",\"questionType\":\"2\",\"answerValue\":\"1\",\"options\":[{\"optionId\":3,\"optionValue\":\"1\",\"optionText\":\"一般\",\"isSelected\":true}]},{\"questionId\":\"1937751675921375241\",\"questionType\":\"3\",\"answerValue\":\"123123\",\"options\":[]},{\"questionId\":\"1937751675921375250\",\"questionType\":\"3\",\"answerValue\":\"123123\",\"options\":[]}],\"remark\":\"\"}', '', 1, '您已经答过这份问卷', '2025-06-26 20:27:30', 157); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938401697029574657, '000000', '提交问卷答案', 1, 'org.dromara.zhxy.controller.HqSatSurveyController.submitSurveyAnswer()', 'POST', 1, 'admin', '研发部门', '/hq/satSurvey/answer/submit', '0:0:0:0:0:0:0:1', '内网IP', '{\"surveyId\":\"1938162557168005122\",\"startTime\":\"2025-06-27T00:58:48.193Z\",\"endTime\":\"2025-06-27T00:59:11.846Z\",\"isAnonymous\":0,\"answers\":[{\"questionId\":\"1937751489358733313\",\"questionType\":\"1\",\"answerValue\":\"1\",\"options\":[{\"optionId\":3,\"optionValue\":\"1\",\"optionText\":\"一般\",\"isSelected\":true}]},{\"questionId\":\"1937751520555966465\",\"questionType\":\"1\",\"answerValue\":\"3\",\"options\":[{\"optionId\":2,\"optionValue\":\"3\",\"optionText\":\"满意\",\"isSelected\":true}]},{\"questionId\":\"1937751675921375239\",\"questionType\":\"2\",\"answerValue\":\"3,5\",\"options\":[{\"optionId\":1,\"optionValue\":\"5\",\"optionText\":\"非常满意\",\"isSelected\":true},{\"optionId\":2,\"optionValue\":\"3\",\"optionText\":\"满意\",\"isSelected\":true}]},{\"questionId\":\"1937751675921375240\",\"questionType\":\"2\",\"answerValue\":\"5,3\",\"options\":[{\"optionId\":1,\"optionValue\":\"5\",\"optionText\":\"非常满意\",\"isSelected\":true},{\"optionId\":2,\"optionValue\":\"3\",\"optionText\":\"满意\",\"isSelected\":true}]},{\"questionId\":\"1937751675921375241\",\"questionType\":\"3\",\"answerValue\":\"您对宿舍服务提出具体的意见和建议您对宿舍服务提出具体的意见和建议您对宿舍服务提出具体的意见和建议\",\"options\":[]},{\"questionId\":\"1937751675921375250\",\"questionType\":\"3\",\"answerValue\":\"堂服务提出具体的意见堂服务提出具体的意见堂服务提出具体的意见堂服务提出具体的意见\",\"options\":[]}],\"remark\":\"\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":{\"id\":\"1938401694286499842\",\"deleted\":0,\"surveyId\":\"1938162557168005122\",\"userId\":1,\"userType\":\"1\",\"userDept\":null,\"submitTime\":\"2025-06-27 08:59:12\",\"totalScore\":0,\"avgScore\":0,\"remark\":\"\"}}', 0, '', '2025-06-27 08:59:13', 810); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938405425338060802, '000000', '提交问卷答案', 1, 'org.dromara.zhxy.controller.HqSatSurveyController.submitSurveyAnswer()', 'POST', 1, 'admin', '研发部门', '/hq/satSurvey/answer/submit', '0:0:0:0:0:0:0:1', '内网IP', '{\"surveyId\":\"1938162557168005122\",\"startTime\":\"2025-06-27T01:13:42.534Z\",\"endTime\":\"2025-06-27T01:14:01.161Z\",\"isAnonymous\":0,\"answers\":[{\"questionId\":\"1937751489358733313\",\"questionType\":\"1\",\"answerValue\":\"C\",\"options\":[{\"optionId\":3,\"optionValue\":\"C\",\"optionText\":\"一般\",\"isSelected\":true}]},{\"questionId\":\"1937751520555966465\",\"questionType\":\"1\",\"answerValue\":\"C\",\"options\":[{\"optionId\":3,\"optionValue\":\"C\",\"optionText\":\"一般\",\"isSelected\":true}]},{\"questionId\":\"1937751675921375239\",\"questionType\":\"2\",\"answerValue\":\"B,A\",\"options\":[{\"optionId\":1,\"optionValue\":\"A\",\"optionText\":\"非常满意\",\"isSelected\":true},{\"optionId\":2,\"optionValue\":\"B\",\"optionText\":\"满意\",\"isSelected\":true}]},{\"questionId\":\"1937751675921375240\",\"questionType\":\"2\",\"answerValue\":\"B,C\",\"options\":[{\"optionId\":2,\"optionValue\":\"B\",\"optionText\":\"满意\",\"isSelected\":true},{\"optionId\":3,\"optionValue\":\"C\",\"optionText\":\"一般\",\"isSelected\":true}]},{\"questionId\":\"1937751675921375241\",\"questionType\":\"3\",\"answerValue\":\"请您对宿舍服务提出具体的意见和建议请您对宿舍服务提出具体的意见和建议请您对宿舍服务提出具体的意见和建议\",\"options\":[]},{\"questionId\":\"1937751675921375250\",\"questionType\":\"3\",\"answerValue\":\"请您对食堂服务提出具体的意见和建议 请您对食堂服务提出具体的意见和建议 请您对食堂服务提出具体的意见和建议 \",\"options\":[]}],\"remark\":\"\"}', '', 1, '您已经答过这份问卷', '2025-06-27 09:14:02', 241); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938409123413929986, '000000', '提交问卷答案', 1, 'org.dromara.zhxy.controller.HqSatSurveyController.submitSurveyAnswer()', 'POST', 1, 'admin', '研发部门', '/hq/satSurvey/answer/submit', '0:0:0:0:0:0:0:1', '内网IP', '{\"surveyId\":\"1938162557168005122\",\"startTime\":\"2025-06-27T01:28:28.326Z\",\"endTime\":\"2025-06-27T01:28:42.470Z\",\"isAnonymous\":0,\"answers\":[{\"questionId\":\"1937751489358733313\",\"questionType\":\"1\",\"answerValue\":\"C\",\"options\":[{\"optionId\":3,\"optionValue\":\"C\",\"optionText\":\"一般\",\"isSelected\":true}]},{\"questionId\":\"1937751520555966465\",\"questionType\":\"1\",\"answerValue\":\"B\",\"options\":[{\"optionId\":2,\"optionValue\":\"B\",\"optionText\":\"满意\",\"isSelected\":true}]},{\"questionId\":\"1937751675921375239\",\"questionType\":\"2\",\"answerValue\":\"B,A\",\"options\":[{\"optionId\":1,\"optionValue\":\"A\",\"optionText\":\"非常满意\",\"isSelected\":true},{\"optionId\":2,\"optionValue\":\"B\",\"optionText\":\"满意\",\"isSelected\":true}]},{\"questionId\":\"1937751675921375240\",\"questionType\":\"2\",\"answerValue\":\"A,C\",\"options\":[{\"optionId\":1,\"optionValue\":\"A\",\"optionText\":\"非常满意\",\"isSelected\":true},{\"optionId\":3,\"optionValue\":\"C\",\"optionText\":\"一般\",\"isSelected\":true}]},{\"questionId\":\"1937751675921375241\",\"questionType\":\"3\",\"answerValue\":\"请您对宿舍服务提出具体的意见和建议 请您对宿舍服务提出具体的意见和建议 请您对宿舍服务提出具体的意见和建议 \",\"options\":[]},{\"questionId\":\"1937751675921375250\",\"questionType\":\"3\",\"answerValue\":\"请您对食堂服务提出具体的意见和建议请您对食堂服务提出具体的意见和建议请您对食堂服务提出具体的意见和建议请您对食堂服务提出具体的意见和建议\",\"options\":[]}],\"remark\":\"\"}', '', 1, '您已达到该问卷的最大提交次数限制(1次)', '2025-06-27 09:28:44', 489); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938409342012665858, '000000', '提交问卷答案', 1, 'org.dromara.zhxy.controller.HqSatSurveyController.submitSurveyAnswer()', 'POST', 1, 'admin', '研发部门', '/hq/satSurvey/answer/submit', '0:0:0:0:0:0:0:1', '内网IP', '{\"surveyId\":\"1938162557168005122\",\"startTime\":\"2025-06-27T01:29:20.589Z\",\"endTime\":\"2025-06-27T01:29:34.435Z\",\"isAnonymous\":0,\"answers\":[{\"questionId\":\"1937751489358733313\",\"questionType\":\"1\",\"answerValue\":\"A\",\"options\":[{\"optionId\":1,\"optionValue\":\"A\",\"optionText\":\"非常满意\",\"isSelected\":true}]},{\"questionId\":\"1937751520555966465\",\"questionType\":\"1\",\"answerValue\":\"B\",\"options\":[{\"optionId\":2,\"optionValue\":\"B\",\"optionText\":\"满意\",\"isSelected\":true}]},{\"questionId\":\"1937751675921375239\",\"questionType\":\"2\",\"answerValue\":\"A,C\",\"options\":[{\"optionId\":1,\"optionValue\":\"A\",\"optionText\":\"非常满意\",\"isSelected\":true},{\"optionId\":3,\"optionValue\":\"C\",\"optionText\":\"一般\",\"isSelected\":true}]},{\"questionId\":\"1937751675921375240\",\"questionType\":\"2\",\"answerValue\":\"C,A\",\"options\":[{\"optionId\":1,\"optionValue\":\"A\",\"optionText\":\"非常满意\",\"isSelected\":true},{\"optionId\":3,\"optionValue\":\"C\",\"optionText\":\"一般\",\"isSelected\":true}]},{\"questionId\":\"1937751675921375241\",\"questionType\":\"3\",\"answerValue\":\"请您对宿舍服务提出具体的意见和建议请您对宿舍服务提出具体的意见和建议请您对宿舍服务提出具体的意见和建议\",\"options\":[]},{\"questionId\":\"1937751675921375250\",\"questionType\":\"3\",\"answerValue\":\"请您对食堂服务提出具体的意见和建议请您对食堂服务提出具体的意见和建议请您对食堂服务提出具体的意见和建议请您对食堂服务提出具体的意见和建议\",\"options\":[]}],\"remark\":\"\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":{\"id\":\"1938409338980184066\",\"deleted\":0,\"surveyId\":\"1938162557168005122\",\"userId\":1,\"userType\":\"1\",\"userDept\":null,\"submitTime\":\"2025-06-27 09:29:35\",\"totalScore\":0,\"avgScore\":0,\"remark\":\"\"}}', 0, '', '2025-06-27 09:29:36', 1082); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938428178283847682, '000000', '提交问卷答案', 1, 'org.dromara.zhxy.controller.HqSatSurveyController.submitSurveyAnswer()', 'POST', 1, 'admin', '研发部门', '/hq/satSurvey/answer/submit', '0:0:0:0:0:0:0:1', '内网IP', '{\"surveyId\":\"1938162557168005122\",\"startTime\":\"2025-06-27T02:44:08.226Z\",\"endTime\":\"2025-06-27T02:44:24.772Z\",\"isAnonymous\":0,\"answers\":[{\"questionId\":\"1937751489358733313\",\"questionType\":\"1\",\"answerValue\":\"D\",\"options\":[{\"optionId\":4,\"optionValue\":\"D\",\"optionText\":\"不满意\",\"isSelected\":true}]},{\"questionId\":\"1937751520555966465\",\"questionType\":\"1\",\"answerValue\":\"C\",\"options\":[{\"optionId\":3,\"optionValue\":\"C\",\"optionText\":\"一般\",\"isSelected\":true}]},{\"questionId\":\"1937751675921375239\",\"questionType\":\"2\",\"answerValue\":\"B,D\",\"options\":[{\"optionId\":2,\"optionValue\":\"B\",\"optionText\":\"满意\",\"isSelected\":true},{\"optionId\":4,\"optionValue\":\"D\",\"optionText\":\"不满意\",\"isSelected\":true}]},{\"questionId\":\"1937751675921375240\",\"questionType\":\"2\",\"answerValue\":\"C,A\",\"options\":[{\"optionId\":1,\"optionValue\":\"A\",\"optionText\":\"非常满意\",\"isSelected\":true},{\"optionId\":3,\"optionValue\":\"C\",\"optionText\":\"一般\",\"isSelected\":true}]},{\"questionId\":\"1937751675921375241\",\"questionType\":\"3\",\"answerValue\":\"请您对宿舍服务提出具体的意见和建议请您对宿舍服务提出具体的意见和建议请您对宿舍服务提出具体的意见和建议111\",\"options\":[]},{\"questionId\":\"1937751675921375250\",\"questionType\":\"3\",\"answerValue\":\"请您对食堂服务提出具体的意见和建议请您对食堂服务提出具体的1111意见和建议请您对食堂服务提出具体的意见和建议请您对食堂服务提出具体的意见和建议\",\"options\":[]}],\"remark\":\"\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":{\"id\":\"1938428174148263938\",\"deleted\":0,\"surveyId\":\"1938162557168005122\",\"userId\":1,\"userType\":\"1\",\"userDept\":null,\"submitTime\":\"2025-06-27 10:44:26\",\"totalScore\":0,\"avgScore\":0,\"remark\":\"\"}}', 0, '', '2025-06-27 10:44:27', 1235); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938436456199970817, '000000', '提交问卷答案', 1, 'org.dromara.zhxy.controller.HqSatSurveyController.submitSurveyAnswer()', 'POST', 1, 'wuzilong', '研发部门', '/hq/satSurvey/answer/submit', '0:0:0:0:0:0:0:1', '内网IP', '{\"surveyId\":\"1938162557168005122\",\"startTime\":\"2025-06-27T03:17:02.382Z\",\"endTime\":\"2025-06-27T03:17:18.662Z\",\"isAnonymous\":0,\"answers\":[{\"questionId\":\"1937751489358733313\",\"questionType\":\"1\",\"answerValue\":\"A\",\"options\":[{\"optionId\":1,\"optionValue\":\"A\",\"optionText\":\"非常满意\",\"isSelected\":true}]},{\"questionId\":\"1937751520555966465\",\"questionType\":\"1\",\"answerValue\":\"B\",\"options\":[{\"optionId\":2,\"optionValue\":\"B\",\"optionText\":\"满意\",\"isSelected\":true}]},{\"questionId\":\"1937751675921375239\",\"questionType\":\"2\",\"answerValue\":\"B,A\",\"options\":[{\"optionId\":1,\"optionValue\":\"A\",\"optionText\":\"非常满意\",\"isSelected\":true},{\"optionId\":2,\"optionValue\":\"B\",\"optionText\":\"满意\",\"isSelected\":true}]},{\"questionId\":\"1937751675921375240\",\"questionType\":\"2\",\"answerValue\":\"C,D\",\"options\":[{\"optionId\":3,\"optionValue\":\"C\",\"optionText\":\"一般\",\"isSelected\":true},{\"optionId\":4,\"optionValue\":\"D\",\"optionText\":\"不满意\",\"isSelected\":true}]},{\"questionId\":\"1937751675921375241\",\"questionType\":\"3\",\"answerValue\":\"的意见和建议1231231\",\"options\":[]},{\"questionId\":\"1937751675921375250\",\"questionType\":\"3\",\"answerValue\":\"具体的意见和建议131231312\",\"options\":[]}],\"remark\":\"\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":{\"id\":\"1938436452395737089\",\"deleted\":0,\"surveyId\":\"1938162557168005122\",\"userId\":\"1937383272285396994\",\"userType\":\"1\",\"userDept\":null,\"submitTime\":\"2025-06-27 11:17:19\",\"totalScore\":0,\"avgScore\":0,\"remark\":\"\"}}', 0, '', '2025-06-27 11:17:20', 1162); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938483472124829697, '000000', '部门管理', 2, 'org.dromara.system.controller.system.SysDeptController.edit()', 'PUT', 1, 'admin', '研发部门', '/system/dept', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":\"2025-06-20 16:22:20\",\"updateBy\":null,\"updateTime\":null,\"deptId\":100,\"parentId\":0,\"deptName\":\"杭州第一技师学院\",\"deptCategory\":null,\"orderNum\":0,\"leader\":null,\"phone\":\"15888888888\",\"email\":\"xxx@qq.com\",\"status\":\"0\",\"belongDeptId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-27 14:24:10', 952); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938483640752627713, '000000', '部门管理', 2, 'org.dromara.system.controller.system.SysDeptController.edit()', 'PUT', 1, 'admin', '研发部门', '/system/dept', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":\"2025-06-20 16:22:20\",\"updateBy\":null,\"updateTime\":null,\"deptId\":101,\"parentId\":100,\"deptName\":\"二级学院\",\"deptCategory\":null,\"orderNum\":1,\"leader\":null,\"phone\":\"15888888888\",\"email\":\"xxx@qq.com\",\"status\":\"0\",\"belongDeptId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-27 14:24:50', 415); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938483700710203393, '000000', '部门管理', 2, 'org.dromara.system.controller.system.SysDeptController.edit()', 'PUT', 1, 'admin', '研发部门', '/system/dept', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":\"2025-06-16 14:58:45\",\"updateBy\":null,\"updateTime\":null,\"deptId\":103,\"parentId\":101,\"deptName\":\"智能控制学院\",\"deptCategory\":null,\"orderNum\":1,\"leader\":1,\"phone\":\"15888888888\",\"email\":\"xxx@qq.com\",\"status\":\"0\",\"belongDeptId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-27 14:25:04', 319); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938483746100961282, '000000', '部门管理', 2, 'org.dromara.system.controller.system.SysDeptController.edit()', 'PUT', 1, 'admin', '研发部门', '/system/dept', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":\"2025-06-20 16:22:20\",\"updateBy\":null,\"updateTime\":null,\"deptId\":104,\"parentId\":101,\"deptName\":\"智能制造学院\",\"deptCategory\":null,\"orderNum\":2,\"leader\":null,\"phone\":\"15888888888\",\"email\":\"xxx@qq.com\",\"status\":\"0\",\"belongDeptId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-27 14:25:15', 377); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938483760063799298, '000000', '部门管理', 2, 'org.dromara.system.controller.system.SysDeptController.edit()', 'PUT', 1, 'admin', '研发部门', '/system/dept', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":\"2025-06-20 16:22:20\",\"updateBy\":null,\"updateTime\":null,\"deptId\":104,\"parentId\":101,\"deptName\":\"智能制造学院\",\"deptCategory\":null,\"orderNum\":2,\"leader\":null,\"phone\":\"15888888888\",\"email\":\"xxx@qq.com\",\"status\":\"0\",\"belongDeptId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-27 14:25:18', 287); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938483802820534274, '000000', '部门管理', 2, 'org.dromara.system.controller.system.SysDeptController.edit()', 'PUT', 1, 'admin', '研发部门', '/system/dept', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":\"2025-06-20 16:22:20\",\"updateBy\":null,\"updateTime\":null,\"deptId\":105,\"parentId\":101,\"deptName\":\"医药健康学院\",\"deptCategory\":null,\"orderNum\":3,\"leader\":null,\"phone\":\"15888888888\",\"email\":\"xxx@qq.com\",\"status\":\"0\",\"belongDeptId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-27 14:25:29', 355); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938483851835170818, '000000', '部门管理', 2, 'org.dromara.system.controller.system.SysDeptController.edit()', 'PUT', 1, 'admin', '研发部门', '/system/dept', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":\"2025-06-20 16:22:20\",\"updateBy\":null,\"updateTime\":null,\"deptId\":106,\"parentId\":101,\"deptName\":\"餐饮休闲学院\",\"deptCategory\":null,\"orderNum\":4,\"leader\":null,\"phone\":\"15888888888\",\"email\":\"xxx@qq.com\",\"status\":\"0\",\"belongDeptId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-27 14:25:40', 396); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938483891794305026, '000000', '部门管理', 2, 'org.dromara.system.controller.system.SysDeptController.edit()', 'PUT', 1, 'admin', '研发部门', '/system/dept', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":\"2025-06-20 16:22:20\",\"updateBy\":null,\"updateTime\":null,\"deptId\":107,\"parentId\":101,\"deptName\":\"数字信息学院\",\"deptCategory\":null,\"orderNum\":5,\"leader\":null,\"phone\":\"15888888888\",\"email\":\"xxx@qq.com\",\"status\":\"0\",\"belongDeptId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-27 14:25:50', 362); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938483954432040962, '000000', '部门管理', 1, 'org.dromara.system.controller.system.SysDeptController.add()', 'POST', 1, 'admin', '研发部门', '/system/dept', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"deptId\":null,\"parentId\":101,\"deptName\":\"人文学院\",\"deptCategory\":null,\"orderNum\":7,\"leader\":null,\"phone\":null,\"email\":null,\"status\":\"0\",\"belongDeptId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-27 14:26:05', 253); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938484049919565825, '000000', '部门管理', 1, 'org.dromara.system.controller.system.SysDeptController.add()', 'POST', 1, 'admin', '研发部门', '/system/dept', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"deptId\":null,\"parentId\":101,\"deptName\":\"生态园林学院\",\"deptCategory\":null,\"orderNum\":0,\"leader\":null,\"phone\":null,\"email\":null,\"status\":\"0\",\"belongDeptId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-27 14:26:27', 194); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938484332238168066, '000000', '部门管理', 2, 'org.dromara.system.controller.system.SysDeptController.edit()', 'PUT', 1, 'admin', '研发部门', '/system/dept', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":\"2025-06-16 14:58:45\",\"updateBy\":null,\"updateTime\":null,\"deptId\":102,\"parentId\":100,\"deptName\":\"行政单位\",\"deptCategory\":null,\"orderNum\":2,\"leader\":null,\"phone\":\"15888888888\",\"email\":\"xxx@qq.com\",\"status\":\"0\",\"belongDeptId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-27 14:27:35', 393); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938484400366247938, '000000', '部门管理', 2, 'org.dromara.system.controller.system.SysDeptController.edit()', 'PUT', 1, 'admin', '研发部门', '/system/dept', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":\"2025-06-16 14:58:45\",\"updateBy\":null,\"updateTime\":null,\"deptId\":108,\"parentId\":102,\"deptName\":\"院领导\",\"deptCategory\":null,\"orderNum\":0,\"leader\":null,\"phone\":\"15888888888\",\"email\":\"xxx@qq.com\",\"status\":\"0\",\"belongDeptId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-27 14:27:51', 326); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938484432066797569, '000000', '部门管理', 2, 'org.dromara.system.controller.system.SysDeptController.edit()', 'PUT', 1, 'admin', '研发部门', '/system/dept', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":\"2025-06-16 14:58:45\",\"updateBy\":null,\"updateTime\":null,\"deptId\":102,\"parentId\":100,\"deptName\":\"行政单位\",\"deptCategory\":null,\"orderNum\":0,\"leader\":null,\"phone\":\"15888888888\",\"email\":\"xxx@qq.com\",\"status\":\"0\",\"belongDeptId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-27 14:27:59', 268); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938484465994522625, '000000', '部门管理', 2, 'org.dromara.system.controller.system.SysDeptController.edit()', 'PUT', 1, 'admin', '研发部门', '/system/dept', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":\"2025-06-20 16:22:20\",\"updateBy\":null,\"updateTime\":null,\"deptId\":109,\"parentId\":102,\"deptName\":\"办公室\",\"deptCategory\":null,\"orderNum\":2,\"leader\":null,\"phone\":\"15888888888\",\"email\":\"xxx@qq.com\",\"status\":\"0\",\"belongDeptId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-27 14:28:07', 314); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938484510433173506, '000000', '部门管理', 1, 'org.dromara.system.controller.system.SysDeptController.add()', 'POST', 1, 'admin', '研发部门', '/system/dept', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"deptId\":null,\"parentId\":102,\"deptName\":\"人事处\",\"deptCategory\":null,\"orderNum\":3,\"leader\":null,\"phone\":null,\"email\":null,\"status\":\"0\",\"belongDeptId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-27 14:28:17', 195); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938484571141529602, '000000', '部门管理', 1, 'org.dromara.system.controller.system.SysDeptController.add()', 'POST', 1, 'admin', '研发部门', '/system/dept', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"deptId\":null,\"parentId\":102,\"deptName\":\"教务处\",\"deptCategory\":null,\"orderNum\":4,\"leader\":null,\"phone\":null,\"email\":null,\"status\":\"0\",\"belongDeptId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-27 14:28:32', 217); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938484606537261058, '000000', '部门管理', 1, 'org.dromara.system.controller.system.SysDeptController.add()', 'POST', 1, 'admin', '研发部门', '/system/dept', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"deptId\":null,\"parentId\":102,\"deptName\":\"科研处\",\"deptCategory\":null,\"orderNum\":5,\"leader\":null,\"phone\":null,\"email\":null,\"status\":\"0\",\"belongDeptId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-27 14:28:40', 212); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938484642499223553, '000000', '部门管理', 1, 'org.dromara.system.controller.system.SysDeptController.add()', 'POST', 1, 'admin', '研发部门', '/system/dept', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"deptId\":null,\"parentId\":102,\"deptName\":\"学生处\",\"deptCategory\":null,\"orderNum\":6,\"leader\":null,\"phone\":null,\"email\":null,\"status\":\"0\",\"belongDeptId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-27 14:28:49', 174); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938484683938947074, '000000', '部门管理', 1, 'org.dromara.system.controller.system.SysDeptController.add()', 'POST', 1, 'admin', '研发部门', '/system/dept', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"deptId\":null,\"parentId\":102,\"deptName\":\"计划财务处\",\"deptCategory\":null,\"orderNum\":7,\"leader\":null,\"phone\":null,\"email\":null,\"status\":\"0\",\"belongDeptId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-27 14:28:59', 225); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938484727639400449, '000000', '部门管理', 1, 'org.dromara.system.controller.system.SysDeptController.add()', 'POST', 1, 'admin', '研发部门', '/system/dept', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"deptId\":null,\"parentId\":102,\"deptName\":\"招生就业处\",\"deptCategory\":null,\"orderNum\":8,\"leader\":null,\"phone\":null,\"email\":null,\"status\":\"0\",\"belongDeptId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-27 14:29:09', 157); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938484763211292673, '000000', '部门管理', 1, 'org.dromara.system.controller.system.SysDeptController.add()', 'POST', 1, 'admin', '研发部门', '/system/dept', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"deptId\":null,\"parentId\":102,\"deptName\":\"培训处\",\"deptCategory\":null,\"orderNum\":9,\"leader\":null,\"phone\":null,\"email\":null,\"status\":\"0\",\"belongDeptId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-27 14:29:18', 175); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938484793892626434, '000000', '部门管理', 1, 'org.dromara.system.controller.system.SysDeptController.add()', 'POST', 1, 'admin', '研发部门', '/system/dept', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"deptId\":null,\"parentId\":102,\"deptName\":\"总务处\",\"deptCategory\":null,\"orderNum\":10,\"leader\":null,\"phone\":null,\"email\":null,\"status\":\"0\",\"belongDeptId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-27 14:29:25', 160); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938484835030360066, '000000', '部门管理', 1, 'org.dromara.system.controller.system.SysDeptController.add()', 'POST', 1, 'admin', '研发部门', '/system/dept', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"deptId\":null,\"parentId\":102,\"deptName\":\"保卫处\",\"deptCategory\":null,\"orderNum\":11,\"leader\":null,\"phone\":null,\"email\":null,\"status\":\"0\",\"belongDeptId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-27 14:29:35', 173); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938484865749442562, '000000', '部门管理', 1, 'org.dromara.system.controller.system.SysDeptController.add()', 'POST', 1, 'admin', '研发部门', '/system/dept', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"deptId\":null,\"parentId\":102,\"deptName\":\"基建处\",\"deptCategory\":null,\"orderNum\":12,\"leader\":null,\"phone\":null,\"email\":null,\"status\":\"0\",\"belongDeptId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-27 14:29:42', 196); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938484924218040322, '000000', '部门管理', 1, 'org.dromara.system.controller.system.SysDeptController.add()', 'POST', 1, 'admin', '研发部门', '/system/dept', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"deptId\":null,\"parentId\":102,\"deptName\":\"临安校区综合办\",\"deptCategory\":null,\"orderNum\":13,\"leader\":null,\"phone\":null,\"email\":null,\"status\":\"0\",\"belongDeptId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-27 14:29:56', 197); +INSERT INTO `sys_oper_log` (`oper_id`, `tenant_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES (1938504776858226689, '000000', '用户管理', 1, 'org.dromara.system.controller.system.SysUserController.add()', 'POST', 1, 'admin', '智能控制学院', '/system/user', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"userId\":\"1938504775352471554\",\"deptId\":109,\"userName\":\"long五\",\"nickName\":\"longwu\",\"userType\":null,\"email\":\"longwu@qq.com\",\"phonenumber\":\"13998990011\",\"sex\":\"0\",\"status\":\"0\",\"remark\":\"备注\",\"roleIds\":[3,\"1938120227459309569\",4],\"postIds\":[],\"roleId\":null,\"userIds\":null,\"excludeUserIds\":null,\"superAdmin\":false}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2025-06-27 15:48:49', 779); COMMIT; -- ---------------------------- @@ -3056,6 +2987,10 @@ INSERT INTO `sys_oss` (`oss_id`, `tenant_id`, `file_name`, `original_name`, `fil INSERT INTO `sys_oss` (`oss_id`, `tenant_id`, `file_name`, `original_name`, `file_suffix`, `url`, `ext1`, `create_dept`, `create_time`, `create_by`, `update_time`, `update_by`, `service`) VALUES (1937429742304845825, '000000', '2025/06/24/df073cb12ee24a7e8b0b284831c6db38.jpg', 'f247f67237c907d1822a983edd1a834b.jpg', '.jpg', 'http://47.99.164.66:20004/ruoyi/2025/06/24/df073cb12ee24a7e8b0b284831c6db38.jpg', NULL, 103, '2025-06-24 16:37:01', 1, '2025-06-24 16:37:01', 1, 'minio'); INSERT INTO `sys_oss` (`oss_id`, `tenant_id`, `file_name`, `original_name`, `file_suffix`, `url`, `ext1`, `create_dept`, `create_time`, `create_by`, `update_time`, `update_by`, `service`) VALUES (1937429742543921154, '000000', '2025/06/24/fa4978c7179e44b2a45b111d68e7e27d.jpg', 'f7ed000a33e283acdabbe92e13f41e69.jpg', '.jpg', 'http://47.99.164.66:20004/ruoyi/2025/06/24/fa4978c7179e44b2a45b111d68e7e27d.jpg', NULL, 103, '2025-06-24 16:37:01', 1, '2025-06-24 16:37:01', 1, 'minio'); INSERT INTO `sys_oss` (`oss_id`, `tenant_id`, `file_name`, `original_name`, `file_suffix`, `url`, `ext1`, `create_dept`, `create_time`, `create_by`, `update_time`, `update_by`, `service`) VALUES (1938010080976248833, '000000', '2025/06/26/1ac9cee08caf40abb9f5633ae5125d9b.jpg', 'f7ed000a33e283acdabbe92e13f41e69.jpg', '.jpg', 'http://47.99.164.66:20004/ruoyi/2025/06/26/1ac9cee08caf40abb9f5633ae5125d9b.jpg', NULL, 103, '2025-06-26 07:03:04', 1, '2025-06-26 07:03:04', 1, 'minio'); +INSERT INTO `sys_oss` (`oss_id`, `tenant_id`, `file_name`, `original_name`, `file_suffix`, `url`, `ext1`, `create_dept`, `create_time`, `create_by`, `update_time`, `update_by`, `service`) VALUES (1938188024470237185, '000000', '2025/06/26/c88c097f331647d4bfffa87e17da1f3d.jpeg', '9648bfe1d4289e6b6a9d86790f226549.jpeg', '.jpeg', 'http://47.99.164.66:20004/ruoyi/2025/06/26/c88c097f331647d4bfffa87e17da1f3d.jpeg', NULL, 103, '2025-06-26 18:50:09', 1937383272285396994, '2025-06-26 18:50:09', 1937383272285396994, 'minio'); +INSERT INTO `sys_oss` (`oss_id`, `tenant_id`, `file_name`, `original_name`, `file_suffix`, `url`, `ext1`, `create_dept`, `create_time`, `create_by`, `update_time`, `update_by`, `service`) VALUES (1938188230729330689, '000000', '2025/06/26/2a24f30f55544c39a6e02c74137ca770.jpeg', 'd0fcba42af30abd01cca39eeca1f4f1b.jpeg', '.jpeg', 'http://47.99.164.66:20004/ruoyi/2025/06/26/2a24f30f55544c39a6e02c74137ca770.jpeg', NULL, 103, '2025-06-26 18:50:59', 1, '2025-06-26 18:50:59', 1, 'minio'); +INSERT INTO `sys_oss` (`oss_id`, `tenant_id`, `file_name`, `original_name`, `file_suffix`, `url`, `ext1`, `create_dept`, `create_time`, `create_by`, `update_time`, `update_by`, `service`) VALUES (1938188366855467010, '000000', '2025/06/26/5876680ac2cf451dac5aaf1255fa41d7.jpeg', 'd0fcba42af30abd01cca39eeca1f4f1b.jpeg', '.jpeg', 'http://47.99.164.66:20004/ruoyi/2025/06/26/5876680ac2cf451dac5aaf1255fa41d7.jpeg', NULL, 103, '2025-06-26 18:51:31', 1, '2025-06-26 18:51:31', 1, 'minio'); +INSERT INTO `sys_oss` (`oss_id`, `tenant_id`, `file_name`, `original_name`, `file_suffix`, `url`, `ext1`, `create_dept`, `create_time`, `create_by`, `update_time`, `update_by`, `service`) VALUES (1938188650860179457, '000000', '2025/06/26/b675346b357d4b4b8fb5fa0143ad11d6.jpeg', '8980aea4b2f13f4e277b1c458de1f84f.jpeg', '.jpeg', 'http://47.99.164.66:20004/ruoyi/2025/06/26/b675346b357d4b4b8fb5fa0143ad11d6.jpeg', NULL, 103, '2025-06-26 18:52:39', 1937383272285396994, '2025-06-26 18:52:39', 1937383272285396994, 'minio'); COMMIT; -- ---------------------------- @@ -3158,9 +3093,9 @@ CREATE TABLE `sys_role` ( -- ---------------------------- BEGIN; INSERT INTO `sys_role` (`role_id`, `tenant_id`, `role_name`, `role_key`, `role_sort`, `data_scope`, `menu_check_strictly`, `dept_check_strictly`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1, '000000', '超级管理员', 'superadmin', 1, '1', 1, 1, '0', '0', 103, 1, '2025-06-20 16:22:20', NULL, NULL, '超级管理员'); -INSERT INTO `sys_role` (`role_id`, `tenant_id`, `role_name`, `role_key`, `role_sort`, `data_scope`, `menu_check_strictly`, `dept_check_strictly`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (3, '000000', '本部门及以下', 'test1', 3, '4', 1, 1, '0', '0', 103, 1, '2025-06-20 16:22:20', 1, '2025-06-24 13:33:38', ''); +INSERT INTO `sys_role` (`role_id`, `tenant_id`, `role_name`, `role_key`, `role_sort`, `data_scope`, `menu_check_strictly`, `dept_check_strictly`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (3, '000000', '本部门及以下', 'test1', 3, '4', 1, 1, '0', '0', 103, 1, '2025-06-20 16:22:20', 1, '2025-06-26 17:14:27', ''); INSERT INTO `sys_role` (`role_id`, `tenant_id`, `role_name`, `role_key`, `role_sort`, `data_scope`, `menu_check_strictly`, `dept_check_strictly`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (4, '000000', '仅本人', 'test2', 4, '5', 1, 1, '0', '0', 103, 1, '2025-06-20 16:22:20', NULL, NULL, ''); -INSERT INTO `sys_role` (`role_id`, `tenant_id`, `role_name`, `role_key`, `role_sort`, `data_scope`, `menu_check_strictly`, `dept_check_strictly`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1938120227459309569, '000000', '学生', 'student', 3, '1', 1, 1, '0', '0', 103, 1, '2025-06-26 14:20:45', 1, '2025-06-26 14:20:45', ''); +INSERT INTO `sys_role` (`role_id`, `tenant_id`, `role_name`, `role_key`, `role_sort`, `data_scope`, `menu_check_strictly`, `dept_check_strictly`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1938120227459309569, '000000', '学生', 'student', 3, '1', 1, 1, '0', '0', 103, 1, '2025-06-26 14:20:45', 1, '2025-06-26 19:06:37', ''); INSERT INTO `sys_role` (`role_id`, `tenant_id`, `role_name`, `role_key`, `role_sort`, `data_scope`, `menu_check_strictly`, `dept_check_strictly`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1938120323613728770, '000000', '老师', 'teacher', 4, '1', 1, 1, '0', '0', 103, 1, '2025-06-26 14:21:08', 1, '2025-06-26 14:21:08', ''); COMMIT; @@ -3304,6 +3239,56 @@ INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 193707902269351526 INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937079022693515269); INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937079022693515270); INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937079022693515271); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937133799553060166); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937133799553060167); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937133799553060168); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937133799553060169); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937133799553060170); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937133799553060171); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482248800083970); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482248804278273); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482248804278274); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482248804278275); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482248804278276); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482248804278277); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482251627044365); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482251627044366); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482251627044367); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482251627044368); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482251627044369); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482251627044370); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482251627044865); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482251627044866); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482251627044867); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482251627044868); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482251627044869); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482251627044870); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482252721758210); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482252721758211); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482252721758212); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482252721758213); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482252721758214); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482252721758215); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482253107634177); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482253107634178); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482253107634179); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482253107634180); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482253107634181); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482253107634182); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482253527064577); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482253527064578); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482253527064579); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482253527064580); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482253527064581); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482253527064582); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482254454005762); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482254454005763); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482254454005764); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482254454005765); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482254454005766); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937482254454005767); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937705241914253314); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (3, 1937705497146040322); INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (4, 5); INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (4, 1500); INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (4, 1501); @@ -3317,6 +3302,69 @@ INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (4, 1508); INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (4, 1509); INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (4, 1510); INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (4, 1511); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937078443615322113); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937079017668739074); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937079017681321985); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937079017681321986); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937079017681321987); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937079017681321988); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937079017681321989); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937079022693515266); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937079022693515267); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937079022693515268); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937079022693515269); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937079022693515270); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937079022693515271); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937133799553060166); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937133799553060167); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937133799553060168); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937133799553060169); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937133799553060170); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937133799553060171); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482248800083970); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482248804278273); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482248804278274); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482248804278275); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482248804278276); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482248804278277); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482251627044365); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482251627044366); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482251627044367); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482251627044368); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482251627044369); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482251627044370); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482251627044865); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482251627044866); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482251627044867); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482251627044868); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482251627044869); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482251627044870); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482252721758210); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482252721758211); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482252721758212); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482252721758213); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482252721758214); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482252721758215); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482253107634177); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482253107634178); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482253107634179); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482253107634180); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482253107634181); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482253107634182); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482253527064577); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482253527064578); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482253527064579); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482253527064580); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482253527064581); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482253527064582); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482254454005762); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482254454005763); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482254454005764); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482254454005765); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482254454005766); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937482254454005767); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937705241914253314); +INSERT INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES (1938120227459309569, 1937705497146040322); COMMIT; -- ---------------------------- @@ -3394,7 +3442,7 @@ CREATE TABLE `sys_tenant` ( -- Records of sys_tenant -- ---------------------------- BEGIN; -INSERT INTO `sys_tenant` (`id`, `tenant_id`, `contact_user_name`, `contact_phone`, `company_name`, `license_number`, `address`, `intro`, `domain`, `remark`, `package_id`, `expire_time`, `account_count`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (1, '000000', '管理组', '15888888888', 'XXX有限公司', NULL, NULL, '多租户通用后台管理管理系统', NULL, NULL, NULL, NULL, -1, '0', '0', 103, 1, '2025-06-20 16:22:20', NULL, NULL); +INSERT INTO `sys_tenant` (`id`, `tenant_id`, `contact_user_name`, `contact_phone`, `company_name`, `license_number`, `address`, `intro`, `domain`, `remark`, `package_id`, `expire_time`, `account_count`, `status`, `del_flag`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (1, '000000', '管理组', '15888888888', '杭州第一技师学院', NULL, NULL, '多租户通用后台管理管理系统', NULL, NULL, NULL, NULL, -1, '0', '0', 103, 1, '2025-06-20 16:22:20', NULL, NULL); COMMIT; -- ---------------------------- @@ -3456,10 +3504,11 @@ CREATE TABLE `sys_user` ( -- Records of sys_user -- ---------------------------- BEGIN; -INSERT INTO `sys_user` (`user_id`, `tenant_id`, `dept_id`, `user_name`, `nick_name`, `user_type`, `email`, `phonenumber`, `sex`, `avatar`, `password`, `status`, `del_flag`, `login_ip`, `login_date`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1, '000000', 103, 'admin', '疯狂的狮子Li', 'sys_user', 'crazyLionLi@163.com', '15888888888', '1', 1938010080976248833, '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '0:0:0:0:0:0:0:1', '2025-06-26 14:08:18', 103, 1, '2025-06-20 16:22:20', 1, '2025-06-26 14:08:18', '管理员'); +INSERT INTO `sys_user` (`user_id`, `tenant_id`, `dept_id`, `user_name`, `nick_name`, `user_type`, `email`, `phonenumber`, `sex`, `avatar`, `password`, `status`, `del_flag`, `login_ip`, `login_date`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1, '000000', 103, 'admin', '疯狂的狮子Li', 'sys_user', 'crazyLionLi@163.com', '15888888888', '1', 1938188366855467010, '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '0:0:0:0:0:0:0:1', '2025-06-27 15:34:19', 103, 1, '2025-06-20 16:22:20', 1, '2025-06-27 15:34:19', '管理员'); INSERT INTO `sys_user` (`user_id`, `tenant_id`, `dept_id`, `user_name`, `nick_name`, `user_type`, `email`, `phonenumber`, `sex`, `avatar`, `password`, `status`, `del_flag`, `login_ip`, `login_date`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (3, '000000', 108, 'test', '本部门及以下 密码666666', 'sys_user', '', '', '0', NULL, '$2a$10$b8yUzN0C71sbz.PhNOCgJe.Tu1yWC3RNrTyjSQ8p1W0.aaUXUJ.Ne', '0', '0', '127.0.0.1', '2025-06-20 16:22:20', 103, 1, '2025-06-20 16:22:20', 3, '2025-06-20 16:22:20', NULL); INSERT INTO `sys_user` (`user_id`, `tenant_id`, `dept_id`, `user_name`, `nick_name`, `user_type`, `email`, `phonenumber`, `sex`, `avatar`, `password`, `status`, `del_flag`, `login_ip`, `login_date`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (4, '000000', 102, 'test1', '仅本人 密码666666', 'sys_user', '', '', '0', NULL, '$2a$10$b8yUzN0C71sbz.PhNOCgJe.Tu1yWC3RNrTyjSQ8p1W0.aaUXUJ.Ne', '0', '0', '127.0.0.1', '2025-06-20 16:22:20', 103, 1, '2025-06-20 16:22:20', 4, '2025-06-20 16:22:20', NULL); -INSERT INTO `sys_user` (`user_id`, `tenant_id`, `dept_id`, `user_name`, `nick_name`, `user_type`, `email`, `phonenumber`, `sex`, `avatar`, `password`, `status`, `del_flag`, `login_ip`, `login_date`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1937383272285396994, '000000', 103, 'wuzilong', 'wuzilong', 'sys_user', '', '', '0', NULL, '$2a$10$4ypXPu8Pwy2juPvLRxFioeODfSJYaGyOYD/yoWXWGE1.DADDRYFmm', '0', '0', '0:0:0:0:0:0:0:1', '2025-06-24 17:07:37', 103, 1, '2025-06-24 13:32:22', 1, '2025-06-26 14:21:29', ''); +INSERT INTO `sys_user` (`user_id`, `tenant_id`, `dept_id`, `user_name`, `nick_name`, `user_type`, `email`, `phonenumber`, `sex`, `avatar`, `password`, `status`, `del_flag`, `login_ip`, `login_date`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1937383272285396994, '000000', 103, 'wuzilong', 'wuzilong', 'sys_user', '', '', '0', 1938188650860179457, '$2a$10$4ypXPu8Pwy2juPvLRxFioeODfSJYaGyOYD/yoWXWGE1.DADDRYFmm', '0', '0', '0:0:0:0:0:0:0:1', '2025-06-27 11:16:57', 103, 1, '2025-06-24 13:32:22', 1937383272285396994, '2025-06-27 11:16:57', ''); +INSERT INTO `sys_user` (`user_id`, `tenant_id`, `dept_id`, `user_name`, `nick_name`, `user_type`, `email`, `phonenumber`, `sex`, `avatar`, `password`, `status`, `del_flag`, `login_ip`, `login_date`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1938504775352471554, '000000', 109, 'long五', 'longwu', 'sys_user', 'longwu@qq.com', '13998990011', '0', NULL, '$2a$10$nUPSkALQvbW/tfOfm20n.ut3Mygs6I7K/F4Rsrm8NTPqbsluVoTT6', '0', '0', '', NULL, 103, 1, '2025-06-27 15:48:49', 1, '2025-06-27 15:48:49', '备注'); COMMIT; -- ---------------------------- @@ -3496,10 +3545,13 @@ CREATE TABLE `sys_user_role` ( BEGIN; INSERT INTO `sys_user_role` (`user_id`, `role_id`) VALUES (1, 1); INSERT INTO `sys_user_role` (`user_id`, `role_id`) VALUES (3, 3); -INSERT INTO `sys_user_role` (`user_id`, `role_id`) VALUES (4, 4); +INSERT INTO `sys_user_role` (`user_id`, `role_id`) VALUES (4, 3); +INSERT INTO `sys_user_role` (`user_id`, `role_id`) VALUES (4, 1938120227459309569); INSERT INTO `sys_user_role` (`user_id`, `role_id`) VALUES (1937383272285396994, 3); INSERT INTO `sys_user_role` (`user_id`, `role_id`) VALUES (1937383272285396994, 1938120227459309569); -INSERT INTO `sys_user_role` (`user_id`, `role_id`) VALUES (1937383272285396994, 1938120323613728770); +INSERT INTO `sys_user_role` (`user_id`, `role_id`) VALUES (1938504775352471554, 3); +INSERT INTO `sys_user_role` (`user_id`, `role_id`) VALUES (1938504775352471554, 4); +INSERT INTO `sys_user_role` (`user_id`, `role_id`) VALUES (1938504775352471554, 1938120227459309569); COMMIT; -- ---------------------------- @@ -3610,28 +3662,4 @@ INSERT INTO `test_tree` (`id`, `tenant_id`, `parent_id`, `dept_id`, `user_id`, ` INSERT INTO `test_tree` (`id`, `tenant_id`, `parent_id`, `dept_id`, `user_id`, `tree_name`, `version`, `create_dept`, `create_time`, `create_by`, `update_time`, `update_by`, `del_flag`) VALUES (13, '000000', 10, 108, 3, '子节点99', 0, 103, '2025-06-20 16:22:26', 1, NULL, NULL, 0); COMMIT; --- ---------------------------- --- Table structure for xg_stu_msg --- ---------------------------- -DROP TABLE IF EXISTS `xg_stu_msg`; -CREATE TABLE `xg_stu_msg` ( - `id` bigint(20) NOT NULL COMMENT '主键', - `stu_name` varchar(255) NOT NULL COMMENT '学生姓名', - `stu_no` int(32) NOT NULL COMMENT '学生工号', - `tenant_id` varchar(20) NOT NULL COMMENT '租户编号', - `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', - `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', - `update_time` datetime DEFAULT NULL COMMENT '更新时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生信息表'; - --- ---------------------------- --- Records of xg_stu_msg --- ---------------------------- -BEGIN; -INSERT INTO `xg_stu_msg` (`id`, `stu_name`, `stu_no`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (1937057195996921858, '里斯2', 232, '000000', 103, 1, '2025-06-23 15:56:39', 1, '2025-06-23 15:57:22'); -COMMIT; - SET FOREIGN_KEY_CHECKS = 1; diff --git a/docs/设计文档/database/mysql-database-standard.md b/docs/设计文档/database/mysql-database-standard.md new file mode 100644 index 00000000..be15f8a9 --- /dev/null +++ b/docs/设计文档/database/mysql-database-standard.md @@ -0,0 +1,675 @@ +# MySQL 数据库建设规范(强制性) + +## 📋 文档说明 + +**版本**: v1.0 +**制定时间**: 2025-01-08 +**适用范围**: 整个项目的所有数据库建表操作 +**重要性**: ⚠️ **强制性规范** - 任何数据库相关开发都必须严格遵循本规范 + +--- + +## 🎯 总体原则 + +### 1. 一致性优先 + +- 所有业务表必须遵循统一的字段设计规范 +- 统一使用标准的命名规范和数据类型 +- 保持与现有数据库模型的高度一致性 + +### 2. 性能导向 + +- 优化查询性能,合理设计索引 +- 控制表结构复杂度,避免过度冗余 +- 考虑数据增长趋势,预留扩展空间 + +### 3. 安全可控 + +- 支持多租户数据隔离 +- 统一的权限控制字段 +- 完整的操作审计追踪 + +### 4. 可扩展性 + +- 预留扩展字段和机制 +- 支持业务模块的独立发展 +- 兼容未来功能需求 + +### 5. 可维护性 + +- 完整的中文注释说明 +- 标准化的文档记录 +- 便于理解和维护的结构设计 + +--- + +## 🔴 核心原则(强制执行) + +### ⚠️ 强制性要求 + +1. **所有业务表**必须包含标准基础字段 +2. **统一使用雪花 ID**作为主键 +3. **强制使用逻辑删除**,禁止物理删除 +4. **所有表必须支持多租户** +5. **完整的中文注释**是必须的 +6. **禁止使用数据库外键约束**,关联关系通过应用层维护 + +--- + +## 🗄️ 数据库环境配置 + +### 基础配置要求 + +- **MySQL 版本**: 5.7.36+ (推荐 8.0+) +- **字符集**: utf8mb4 +- **排序规则**: utf8mb4_general_ci +- **存储引擎**: InnoDB +- **时区**: Asia/Shanghai + +### 数据库连接配置 + +```yaml +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3306/hzdyjs_xg?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai + username: ${DB_USERNAME:root} + password: ${DB_PASSWORD:password} +``` + +--- + +## 📊 表结构设计规范 + +### 🔴 强制性基础字段(所有业务表必须包含) + +每个业务表都**必须**包含以下基础字段: + +```sql +-- 主键字段(必须) +`id` bigint(20) NOT NULL COMMENT '主键ID', + +-- 多租户字段(必须) +`tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号', + +-- 审计字段(必须) +`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', +`create_by` bigint(20) DEFAULT NULL COMMENT '创建者', +`create_time` datetime DEFAULT NULL COMMENT '创建时间', +`update_by` bigint(20) DEFAULT NULL COMMENT '更新者', +`update_time` datetime DEFAULT NULL COMMENT '更新时间', + +-- 逻辑删除字段(必须) +`deleted` tinyint(1) DEFAULT 0 COMMENT '删除标志(0代表存在 1代表删除)', + +-- 主键定义(必须) +PRIMARY KEY (`id`) USING BTREE +``` + +### 字段设计细则 + +#### 主键字段 (id) + +- **类型**: `bigint(20) NOT NULL` +- **策略**: 使用雪花 ID (ASSIGN_ID) +- **注释**: 主键 ID +- **强制要求**: 所有表必须使用此设计 + +#### 租户字段 (tenant_id) + +- **类型**: `varchar(20) NOT NULL` +- **默认值**: '000000' +- **用途**: 多租户数据隔离 +- **索引**: 必须创建索引 + +#### 审计字段 + +- **create_dept**: 创建部门 ID,记录数据创建的部门 +- **create_by**: 创建人 ID,记录数据创建者 +- **create_time**: 创建时间,自动记录数据创建时间 +- **update_by**: 更新人 ID,记录最后更新者 +- **update_time**: 更新时间,自动记录数据更新时间 + +#### 逻辑删除字段 (deleted) + +- **类型**: `tinyint(1) DEFAULT 0` +- **含义**: 0-存在,1-已删除 +- **强制要求**: 禁止物理删除,必须使用逻辑删除 + +--- + +## 📝 字段设计规范 + +### 数据类型选择 + +#### 字符串类型 + +- **varchar(n)**: 变长字符串,n≤255 时使用 +- **text**: 长文本内容,如富文本、描述等 +- **char(1)**: 固定长度字符,如状态标识 + +#### 数值类型 + +- **bigint(20)**: ID 类型字段(主键、外键) +- **int(11)**: 普通整数字段 +- **decimal(m,n)**: 精确小数,如金额、评分 + +#### 时间类型 + +- **datetime**: 标准时间字段 +- **timestamp**: 自动更新时间戳(特殊需求) + +#### 布尔类型 + +- **tinyint(1)**: 布尔值,0-否,1-是 + +### 强制规则 + +#### 字段命名规范 + +- **使用小写字母**和下划线 +- **见名知意**,避免缩写 +- **统一后缀**: + - `_id`: ID 类型字段 + - `_time`: 时间类型字段 + - `_status`: 状态类型字段 + - `_flag`: 标志类型字段 + +#### 字段长度规范 + +- **姓名字段**: varchar(50) +- **电话字段**: varchar(20) +- **邮箱字段**: varchar(100) +- **地址字段**: varchar(200) +- **标题字段**: varchar(200) +- **编码字段**: varchar(50) + +#### NULL 值规范 + +- **主键**: NOT NULL +- **关联字段**: 根据业务需求确定 +- **租户 ID**: NOT NULL +- **创建相关字段**: 可为 NULL +- **业务关键字段**: 建议 NOT NULL + +--- + +## 🚫 外键约束规范(重要) + +### 禁止使用数据库外键约束 + +#### 🔴 强制性原则 + +**项目中严格禁止使用数据库级别的外键约束(FOREIGN KEY),所有表关联关系通过应用层逻辑维护。** + +#### 禁用外键约束的原因 + +1. **性能考虑** + + - 外键约束会降低数据插入、更新、删除的性能 + - 在高并发场景下会产生额外的锁开销 + - 分库分表时外键约束会成为性能瓶颈 + +2. **灵活性要求** + + - 支持数据库分库分表扩展 + - 便于数据迁移和重构 + - 避免循环依赖问题 + +3. **维护便利性** + - 简化数据库结构变更 + - 减少约束冲突导致的部署问题 + - 便于测试数据管理 + +#### 替代方案 + +1. **应用层数据一致性** + + ```java + // 在业务逻辑中维护关联关系 + @Transactional + public void deleteUser(Long userId) { + // 检查关联数据 + if (hasRelatedData(userId)) { + throw new BusinessException("用户存在关联数据,无法删除"); + } + // 执行删除 + userService.deleteById(userId); + } + ``` + +2. **命名约定标识关联** + + ```sql + -- 通过字段命名明确标识关联关系 + `user_id` bigint(20) COMMENT '用户ID,关联sys_user表', + `dept_id` bigint(20) COMMENT '部门ID,关联sys_dept表', + `role_id` bigint(20) COMMENT '角色ID,关联sys_role表' + ``` + +3. **数据校验注解** + ```java + // 使用注解进行数据校验 + @Entity + public class User { + @NotNull + @ExistReference(table = "sys_dept", field = "id") + private Long deptId; + } + ``` + +#### 关联字段设计规范 + +1. **命名规范** + + - 关联字段必须以 `_id` 结尾 + - 字段名能够明确表达关联关系 + - 例如:`user_id`、`parent_id`、`dept_id` + +2. **注释要求** + + ```sql + `user_id` bigint(20) NOT NULL COMMENT '用户ID,关联sys_user.id', + `parent_id` bigint(20) DEFAULT NULL COMMENT '父级ID,关联本表id,顶级为0', + ``` + +3. **索引设计** + ```sql + -- 关联字段必须创建索引,提升查询性能 + KEY `idx_user_id` (`user_id`), + KEY `idx_dept_id` (`dept_id`), + ``` + +#### 数据一致性保障 + +1. **业务层校验** + + - 在 Service 层添加关联数据校验 + - 删除操作前检查关联数据 + - 使用事务确保操作原子性 + +2. **定期数据校验** + + ```sql + -- 定期执行数据一致性检查脚本 + SELECT u.* FROM sys_user u + LEFT JOIN sys_dept d ON u.dept_id = d.id + WHERE u.dept_id IS NOT NULL AND d.id IS NULL; + ``` + +3. **监控和报警** + - 建立数据一致性监控 + - 发现数据不一致时及时报警 + - 记录详细的操作审计日志 + +--- + +## 🔍 索引设计规范 + +### 基础索引(必须创建) + +每个表都必须创建以下基础索引: + +```sql +-- 租户索引(必须) +KEY `idx_tenant_id` (`tenant_id`), + +-- 删除标志索引(必须) +KEY `idx_deleted` (`deleted`), + +-- 创建时间索引(建议) +KEY `idx_create_time` (`create_time`), + +-- 组合索引:租户+删除标志(高效查询) +KEY `idx_tenant_deleted` (`tenant_id`, `deleted`) +``` + +### 业务索引规范 + +#### 状态字段索引 + +```sql +KEY `idx_status` (`status`) +``` + +#### 时间范围索引 + +```sql +KEY `idx_time_range` (`start_time`, `end_time`) +``` + +#### 关联字段索引 + +```sql +-- 关联字段索引(注意:不使用外键约束) +KEY `idx_parent_id` (`parent_id`), +KEY `idx_user_id` (`user_id`), +KEY `idx_dept_id` (`dept_id`) +``` + +#### 组合索引 + +```sql +-- 常用查询组合 +KEY `idx_user_type_status` (`user_id`, `type`, `status`) +``` + +### 索引命名规范 + +- **单列索引**: `idx_字段名` +- **组合索引**: `idx_字段1_字段2` +- **唯一索引**: `uk_字段名` 或 `uk_字段1_字段2` + +--- + +## 🏗️ 建表 SQL 模板 + +### 标准业务表模板 + +```sql +-- ---------------------------- +-- Table structure for 模块_表名 +-- ---------------------------- +DROP TABLE IF EXISTS `模块_表名`; +CREATE TABLE `模块_表名` ( + -- 基础字段(必须) + `id` bigint(20) NOT NULL COMMENT '主键ID', + `tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号', + `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `deleted` tinyint(1) DEFAULT 0 COMMENT '删除标志(0代表存在 1代表删除)', + + -- 业务字段 + `业务字段1` varchar(100) NOT NULL COMMENT '业务字段说明', + `业务字段2` text COMMENT '业务字段说明', + + -- 关联字段(注意:不使用外键约束) + `user_id` bigint(20) DEFAULT NULL COMMENT '用户ID,关联sys_user.id', + `dept_id` bigint(20) DEFAULT NULL COMMENT '部门ID,关联sys_dept.id', + + -- 状态和其他字段 + `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)', + `sort_order` int(11) DEFAULT 0 COMMENT '排序', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + + -- 主键和索引(注意:不创建外键约束) + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_business_key` (`tenant_id`, `业务唯一字段`, `deleted`), + KEY `idx_tenant_id` (`tenant_id`), + KEY `idx_deleted` (`deleted`), + KEY `idx_status` (`status`), + KEY `idx_create_time` (`create_time`), + KEY `idx_user_id` (`user_id`), + KEY `idx_dept_id` (`dept_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='表的中文描述'; +``` + +### 系统配置表模板 + +```sql +-- 系统配置类表(如字典、参数等) +CREATE TABLE `sys_配置表名` ( + `id` bigint(20) NOT NULL COMMENT '主键ID', + `tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号', + `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + + -- 配置相关字段 + `config_key` varchar(100) NOT NULL COMMENT '配置键', + `config_value` varchar(500) DEFAULT NULL COMMENT '配置值', + `config_type` char(1) DEFAULT 'N' COMMENT '系统内置(Y是 N否)', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_config_key` (`config_key`, `tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统配置表'; +``` + +### 关联关系表模板 + +```sql +-- 多对多关联表 +CREATE TABLE `模块_关联表名` ( + `id` bigint(20) NOT NULL COMMENT '主键ID', + `tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', + + -- 关联字段(注意:不使用外键约束) + `主表_id` bigint(20) NOT NULL COMMENT '主表ID,关联主表.id', + `从表_id` bigint(20) NOT NULL COMMENT '从表ID,关联从表.id', + + -- 主键和索引(注意:不创建外键约束) + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_relation` (`主表_id`, `从表_id`, `tenant_id`), + KEY `idx_主表_id` (`主表_id`), + KEY `idx_从表_id` (`从表_id`), + KEY `idx_tenant_id` (`tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='关联关系表'; +``` + +--- + +## 🔄 数据迁移规范 + +### 迁移脚本命名 + +``` +V{版本号}__{功能描述}.sql +例如:V1.0.1__add_user_table.sql +``` + +### 迁移脚本结构 + +```sql +-- ========================================== +-- 数据库变更脚本 +-- 版本:V1.0.1 +-- 功能:新增用户表 +-- 作者:开发者姓名 +-- 时间:2025-01-08 +-- ========================================== + +-- 新增表 +CREATE TABLE IF NOT EXISTS `new_table` ( + -- 表结构定义 +); + +-- 修改表(如果需要) +ALTER TABLE `existing_table` +ADD COLUMN `new_column` varchar(100) COMMENT '新字段说明'; + +-- 数据初始化(如果需要) +INSERT INTO `new_table` VALUES (...); + +-- 创建索引(如果需要) +CREATE INDEX `idx_new_column` ON `existing_table` (`new_column`); +``` + +### 迁移注意事项 + +1. **向前兼容**:新增字段必须有默认值 +2. **数据备份**:重要变更前必须备份 +3. **灰度发布**:分步骤执行重大变更 +4. **回滚方案**:准备对应的回滚脚本 + +--- + +## ⚡ 性能优化规范 + +### 查询优化 + +1. **避免 SELECT \***:明确指定需要的字段 +2. **合理使用索引**:根据查询模式创建合适索引 +3. **分页查询**:大数据量必须分页 +4. **避免全表扫描**:WHERE 条件必须使用索引字段 + +### 表设计优化 + +1. **垂直分表**:字段过多时考虑分表 +2. **水平分表**:数据量过大时考虑分表 +3. **冗余设计**:适度冗余提升查询性能 +4. **归档策略**:历史数据定期归档 + +### 索引优化 + +1. **组合索引**:多条件查询创建组合索引 +2. **覆盖索引**:避免回表查询 +3. **索引维护**:定期检查和优化索引 +4. **避免冗余**:删除不必要的索引 + +--- + +## 🔒 安全规范 + +### 数据安全 + +1. **敏感数据加密**:密码、身份证等敏感信息 +2. **数据脱敏**:测试环境使用脱敏数据 +3. **访问控制**:基于角色的数据访问控制 +4. **审计日志**:完整的数据变更日志 + +### 权限控制 + +1. **最小权限原则**:只授予必要的权限 +2. **账号管理**:定期审查数据库账号 +3. **密码策略**:强密码策略和定期更换 +4. **网络安全**:限制数据库访问网络 + +### 备份策略 + +1. **定期备份**:每日全量备份 +2. **增量备份**:实时或小时级增量备份 +3. **异地备份**:关键数据异地存储 +4. **恢复测试**:定期验证备份恢复 + +--- + +## ✅ 检查清单 + +### 新建表检查清单 + +- [ ] 包含所有强制基础字段 +- [ ] 主键使用 bigint(20)类型 +- [ ] 租户字段正确设置 +- [ ] 逻辑删除字段存在 +- [ ] 审计字段完整 +- [ ] 表注释完整准确 +- [ ] 字段注释完整 +- [ ] **未使用外键约束**(重要) +- [ ] 关联字段命名规范(以\_id 结尾) +- [ ] 关联字段注释明确标识关联表 + +### 字段设计检查清单 + +- [ ] 字段命名符合规范 +- [ ] 数据类型选择合理 +- [ ] 字段长度设置适当 +- [ ] NULL 值设置合理 +- [ ] 默认值设置正确 +- [ ] 字段注释明确 + +### 索引设计检查清单 + +- [ ] 基础索引已创建 +- [ ] 业务索引设计合理 +- [ ] 索引命名规范 +- [ ] 唯一约束正确 +- [ ] 组合索引顺序合理 + +--- + +## 🛠️ 工具和脚本 + +### 建表辅助脚本 + +```sql +-- 自动生成基础字段的存储过程 +DELIMITER $$ +CREATE PROCEDURE `add_base_fields`(IN table_name VARCHAR(64)) +BEGIN + SET @sql = CONCAT('ALTER TABLE ', table_name, ' ADD COLUMN IF NOT EXISTS `tenant_id` varchar(20) NOT NULL DEFAULT ''000000'' COMMENT ''租户编号'''); + PREPARE stmt FROM @sql; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; + + -- 添加其他基础字段... +END$$ +DELIMITER ; +``` + +### 表结构检查脚本 + +```sql +-- 检查缺失基础字段的表 +SELECT + TABLE_NAME, + CASE + WHEN COLUMN_NAME IS NULL THEN CONCAT('缺少字段: ', required_field) + ELSE '字段存在' + END AS check_result +FROM ( + SELECT 'tenant_id' AS required_field + UNION SELECT 'create_time' + UNION SELECT 'update_time' + UNION SELECT 'deleted' +) rf +CROSS JOIN INFORMATION_SCHEMA.TABLES t +LEFT JOIN INFORMATION_SCHEMA.COLUMNS c + ON t.TABLE_NAME = c.TABLE_NAME + AND c.COLUMN_NAME = rf.required_field +WHERE t.TABLE_SCHEMA = 'hzdyjs_xg' + AND t.TABLE_TYPE = 'BASE TABLE' + AND c.COLUMN_NAME IS NULL; +``` + +--- + +## 📚 参考示例 + +### 现有表结构参考 + +项目中已有的标准表结构可参考: + +- `hq_hall_info` - 报告厅信息表 +- `hq_hall_reservation` - 报告厅预约表 +- `hq_sat_survey` - 问卷调查表 +- `sys_user` - 用户表 +- `sys_dict_data` - 字典数据表 + +### 命名示例 + +- **模块前缀**: `hq_`(后勤)、`sys_`(系统)、`gen_`(代码生成) +- **表名示例**: `hq_hall_info`、`sys_user_role` +- **字段示例**: `user_name`、`create_time`、`hall_status` + +--- + +## ⚠️ 重要提醒 + +1. **强制性要求**:本规范所有标注为"必须"、"强制"的条目都是强制性的 +2. **一致性保证**:新建表必须与现有表结构保持一致 +3. **文档同步**:表结构变更必须同步更新文档 +4. **Code Review**:所有数据库变更都需要进行代码审查 +5. **测试验证**:新表结构必须经过充分测试验证 + +--- + +## 📞 技术支持 + +如有疑问或需要技术支持,请联系: + +- **技术负责人**:项目技术负责人 +- **文档维护**:定期更新和维护本规范 +- **培训支持**:为团队成员提供规范培训 + +--- + +**最后更新**: 2025-01-08 +**下次审查**: 2025-07-08 diff --git a/docs/deployment/README.md b/docs/部署文档/README.md similarity index 100% rename from docs/deployment/README.md rename to docs/部署文档/README.md diff --git a/docs/requirements/README.md b/docs/需求文档/README.md similarity index 100% rename from docs/requirements/README.md rename to docs/需求文档/README.md diff --git a/docs/requirements/后勤报告厅预约需求/简化版报告厅预约系统设计说明.md b/docs/需求文档/后勤报告厅预约需求/简化版报告厅预约系统设计说明.md similarity index 100% rename from docs/requirements/后勤报告厅预约需求/简化版报告厅预约系统设计说明.md rename to docs/需求文档/后勤报告厅预约需求/简化版报告厅预约系统设计说明.md diff --git a/docs/requirements/后勤满意度调查需求/高校后勤满意度调查系统需求说明.md b/docs/需求文档/后勤满意度调查需求/高校后勤满意度调查系统需求说明.md similarity index 100% rename from docs/requirements/后勤满意度调查需求/高校后勤满意度调查系统需求说明.md rename to docs/需求文档/后勤满意度调查需求/高校后勤满意度调查系统需求说明.md diff --git a/docs/项目总览/README.md b/docs/项目总览/README.md new file mode 100644 index 00000000..ed7a8e7c --- /dev/null +++ b/docs/项目总览/README.md @@ -0,0 +1,284 @@ +# 项目总览 + +## 📋 项目基本信息 + +**项目名称**:高校后勤校园管理系统 (HZDYJS_XG) +**项目类型**:企业级 Web 应用系统 +**开发模式**:前后端分离 + 移动端 App +**架构模式**:微服务架构 + 多租户设计 +**当前版本**:v1.0.0 +**开发周期**:2024.01 - 2024.10 + +## 🎯 项目愿景 + +构建一个**现代化、智能化、易用性强**的高校后勤管理平台,提升后勤服务效率,改善师生体验,实现后勤管理的数字化转型。 + +## 📊 核心业务领域 + +### 1. 📋 后勤满意度调查系统 + +- **目标**:收集师生对后勤服务的满意度反馈 +- **价值**:数据驱动的服务质量改进 +- **覆盖范围**:餐饮、宿舍、保洁、维修等全方位后勤服务 + +### 2. 🏛️ 报告厅预约管理系统 + +- **目标**:优化校园会议室/报告厅资源配置 +- **价值**:提高场地利用率,减少冲突和浪费 +- **覆盖范围**:各类会议室、报告厅、活动场所 + +### 3. 🔧 后勤维修服务系统 + +- **目标**:建立高效的设施维修服务流程 +- **价值**:快速响应,提升维修效率 +- **覆盖范围**:宿舍、教学楼、公共设施维修 + +### 4. 🍽️ 餐饮服务管理系统 + +- **目标**:提升校园餐饮服务质量和体验 +- **价值**:菜品管理、营养配餐、师生反馈 +- **覆盖范围**:食堂管理、外卖配送、营养健康 + +## 🏗️ 技术架构概览 + +### 系统架构图 + +```mermaid +graph TB + subgraph "前端层" + A1[Web管理端
Vue3 + Element Plus] + A2[移动端App
UniApp + uView UI] + end + + subgraph "网关层" + B1[API Gateway
Spring Cloud Gateway] + end + + subgraph "业务服务层" + C1[用户管理服务
Spring Boot] + C2[满意度调查服务
Spring Boot] + C3[报告厅预约服务
Spring Boot] + C4[系统管理服务
Spring Boot] + end + + subgraph "数据层" + D1[MySQL 8.0
主数据库] + D2[Redis 7.0
缓存/会话] + D3[MinIO
文件存储] + end + + subgraph "基础设施" + E1[Docker
容器化部署] + E2[Nginx
负载均衡] + E3[ELK
日志分析] + E4[Prometheus
监控告警] + end + + A1 --> B1 + A2 --> B1 + B1 --> C1 + B1 --> C2 + B1 --> C3 + B1 --> C4 + + C1 --> D1 + C2 --> D1 + C3 --> D1 + C4 --> D1 + + C1 --> D2 + C2 --> D2 + C3 --> D2 + C4 --> D2 + + C1 --> D3 + C2 --> D3 + C3 --> D3 + C4 --> D3 +``` + +### 技术栈详情 + +#### 后端技术栈 + +- **核心框架**:Spring Boot 3.4.6 + Spring Cloud 2023.0.x +- **开发语言**:Java 17/21 +- **ORM 框架**:MyBatis-Plus 3.5.12 +- **权限认证**:Sa-Token 1.42.0 + JWT +- **数据库**:MySQL 8.0(主库)+ Redis 7.0(缓存) +- **消息队列**:RabbitMQ 3.12 +- **任务调度**:SnailJob 1.5.0 +- **工作流引擎**:Warm-Flow 1.7.3 +- **文档管理**:SpringDoc + Knife4j + +#### 前端技术栈 + +- **Web 框架**:Vue 3.5.13 + TypeScript 5.8.3 +- **UI 组件库**:Element Plus 2.9.8 +- **构建工具**:Vite 7.0.9 +- **状态管理**:Pinia +- **HTTP 客户端**:Axios +- **图表组件**:ECharts 5.x + +#### 移动端技术栈 + +- **跨平台框架**:uni-app +- **UI 组件库**:uView UI +- **状态管理**:Vuex +- **地图服务**:高德地图 API + +#### 部署运维 + +- **容器化**:Docker + Docker Compose +- **容器编排**:Kubernetes(生产环境) +- **Web 服务器**:Nginx(反向代理 + 负载均衡) +- **CI/CD**:GitLab CI/CD +- **监控告警**:Prometheus + Grafana + AlertManager +- **日志管理**:ELK Stack(Elasticsearch + Logstash + Kibana) + +## 📈 项目规模指标 + +### 代码规模 + +- **后端代码**:约 15 万行 Java 代码 +- **前端代码**:约 8 万行 Vue/TypeScript 代码 +- **移动端代码**:约 3 万行 JavaScript 代码 +- **数据库表**:约 80 张业务表 + +### 功能模块 + +- **核心业务模块**:4 个 +- **基础支撑模块**:6 个 +- **管理配置模块**:8 个 +- **API 接口数量**:约 200 个 + +### 性能指标 + +- **并发用户数**:支持 1000+在线用户 +- **响应时间**:平均响应时间 < 200ms +- **可用性**:99.9%系统可用性 +- **数据处理**:支持千万级数据查询 + +## 👥 团队组织结构 + +### 项目团队 + +- **项目经理**:1 人(项目管理 + 需求分析) +- **架构师**:1 人(技术架构 + 核心开发) +- **后端开发**:2 人(Spring Boot 微服务开发) +- **前端开发**:2 人(Vue3 + 移动端开发) +- **测试工程师**:1 人(功能测试 + 自动化测试) +- **运维工程师**:1 人(部署运维 + 监控告警) + +### 开发分工 + +| 模块 | 负责人 | 开发重点 | +| ------------------- | ------ | -------------------- | +| 用户管理 + 系统管理 | 张三 | 权限体系、多租户架构 | +| 满意度调查系统 | 李四 | 问卷设计器、数据统计 | +| 报告厅预约系统 | 王五 | 工作流引擎、预约算法 | +| 前端 UI + 移动端 | 赵六 | 用户体验、界面设计 | + +## 📅 项目时间线 + +### 第一阶段:基础架构搭建(2024.01-2024.02) + +- ✅ 技术选型和架构设计 +- ✅ 开发环境搭建 +- ✅ 基础框架集成 +- ✅ 用户权限系统开发 + +### 第二阶段:核心功能开发(2024.03-2024.06) + +- ✅ 满意度调查系统开发 +- 🟡 报告厅预约系统开发(进行中) +- ⭕ 维修服务系统开发(待开始) +- ⭕ 餐饮管理系统开发(待开始) + +### 第三阶段:系统集成测试(2024.07-2024.08) + +- ⭕ 功能测试和集成测试 +- ⭕ 性能测试和优化 +- ⭕ 安全测试和加固 +- ⭕ 用户验收测试 + +### 第四阶段:部署上线(2024.09-2024.10) + +- ⭕ 生产环境部署 +- ⭕ 数据迁移和初始化 +- ⭕ 用户培训和推广 +- ⭕ 运维监控体系建立 + +## 🎯 项目目标与 KPI + +### 业务目标 + +- **服务效率提升**:报告厅预约流程效率提升 80% +- **用户满意度**:后勤服务满意度达到 90%以上 +- **数据驱动决策**:建立完善的数据分析和报告体系 +- **成本控制**:通过系统化管理降低运营成本 15% + +### 技术目标 + +- **系统稳定性**:99.9%系统可用性 +- **响应性能**:平均响应时间 < 200ms +- **扩展性**:支持 10 倍用户增长的架构设计 +- **安全性**:通过等保三级安全认证 + +### 质量目标 + +- **代码质量**:代码覆盖率 > 80% +- **文档完整性**:100%API 文档覆盖 +- **用户体验**:移动端 App 评分 > 4.5 星 +- **培训效果**:用户培训通过率 > 95% + +## 🔧 开发工具链 + +### 开发环境 + +- **IDE**:IntelliJ IDEA 2024.x +- **版本控制**:Git + GitLab +- **数据库工具**:Navicat Premium +- **API 测试**:Postman + Swagger UI +- **代码质量**:SonarQube + +### 协作工具 + +- **项目管理**:禅道 + GitLab Issues +- **文档协作**:语雀 + Markdown +- **设计工具**:Figma + ProcessOn +- **沟通工具**:企业微信 + 腾讯会议 + +## 📋 下一步行动计划 + +### 近期重点(未来 2 周) + +1. **完成报告厅预约系统后端开发** +2. **启动前端界面开发** +3. **完善 API 文档和测试用例** +4. **建立 CI/CD 自动化流水线** + +### 中期规划(未来 1 个月) + +1. **完成核心功能模块集成** +2. **开始系统性能测试** +3. **完善用户手册和培训材料** +4. **准备生产环境部署方案** + +### 长期愿景(未来 3 个月) + +1. **系统全面上线运行** +2. **建立运维监控体系** +3. **收集用户反馈,持续优化** +4. **探索 AI 智能化功能集成** + +--- + +**🎯 项目愿景**:打造高校后勤管理的标杆系统,为数字化校园建设贡献力量! + +## 📖 相关文档 + +- **业务模块详情**:[业务模块文档](../业务模块/README.md) +- **技术架构设计**:[设计文档](../设计文档/README.md) +- **开发指南**:[开发文档](../开发文档/README.md) +- **部署指南**:[部署文档](../部署文档/README.md) diff --git a/docs/项目总览/项目总览模板.md b/docs/项目总览/项目总览模板.md new file mode 100644 index 00000000..d1b1cef5 --- /dev/null +++ b/docs/项目总览/项目总览模板.md @@ -0,0 +1,258 @@ +# 项目总览模板 + +> 🎯 **模板用途**:本模板用于创建新项目的总览文档,为 Cursor AI 提供标准格式参考 + +## 📋 项目基本信息 + +**项目名称**:[项目名称] +**项目类型**:[Web 应用/移动应用/桌面应用/其他] +**开发模式**:[前后端分离/单体应用/微服务/其他] +**架构模式**:[架构设计模式] +**当前版本**:[版本号] +**开发周期**:[开始时间] - [结束时间] + +## 🎯 项目愿景 + +[项目的整体愿景和目标,描述项目要解决的问题和期望达到的效果] + +## 📊 核心业务领域 + +### 1. [业务领域 1] + +- **目标**:[业务目标] +- **价值**:[业务价值] +- **覆盖范围**:[具体范围] + +### 2. [业务领域 2] + +- **目标**:[业务目标] +- **价值**:[业务价值] +- **覆盖范围**:[具体范围] + +### 3. [业务领域 3] + +- **目标**:[业务目标] +- **价值**:[业务价值] +- **覆盖范围**:[具体范围] + +## 🏗️ 技术架构概览 + +### 系统架构图 + +```mermaid +graph TB + subgraph "前端层" + A1[Web端
[前端技术栈]] + A2[移动端
[移动端技术栈]] + end + + subgraph "服务层" + B1[业务服务
[后端技术栈]] + end + + subgraph "数据层" + C1[数据库
[数据库类型]] + C2[缓存
[缓存技术]] + end + + A1 --> B1 + A2 --> B1 + B1 --> C1 + B1 --> C2 +``` + +### 技术栈详情 + +#### 后端技术栈 + +- **核心框架**:[主要框架及版本] +- **开发语言**:[编程语言] +- **ORM 框架**:[ORM 框架] +- **权限认证**:[认证方案] +- **数据库**:[数据库类型及版本] +- **缓存**:[缓存技术] +- **消息队列**:[消息队列技术] +- **任务调度**:[任务调度框架] + +#### 前端技术栈 + +- **Web 框架**:[前端框架及版本] +- **UI 组件库**:[UI 组件库] +- **构建工具**:[构建工具] +- **状态管理**:[状态管理方案] +- **HTTP 客户端**:[HTTP 客户端] + +#### 移动端技术栈(如适用) + +- **开发框架**:[移动端框架] +- **UI 组件库**:[移动端 UI 库] +- **状态管理**:[移动端状态管理] + +#### 部署运维 + +- **容器化**:[容器技术] +- **Web 服务器**:[Web 服务器] +- **CI/CD**:[CI/CD 工具] +- **监控告警**:[监控方案] +- **日志管理**:[日志方案] + +## 📈 项目规模指标 + +### 代码规模 + +- **后端代码**:约 [X] 万行 [语言] 代码 +- **前端代码**:约 [X] 万行 [语言] 代码 +- **移动端代码**:约 [X] 万行 [语言] 代码(如适用) +- **数据库表**:约 [X] 张业务表 + +### 功能模块 + +- **核心业务模块**:[X] 个 +- **基础支撑模块**:[X] 个 +- **管理配置模块**:[X] 个 +- **API 接口数量**:约 [X] 个 + +### 性能指标 + +- **并发用户数**:支持 [X] 在线用户 +- **响应时间**:平均响应时间 < [X]ms +- **可用性**:[X]% 系统可用性 +- **数据处理**:支持 [X] 级数据查询 + +## 👥 团队组织结构 + +### 项目团队 + +- **项目经理**:[X] 人(职责说明) +- **架构师**:[X] 人(职责说明) +- **后端开发**:[X] 人(职责说明) +- **前端开发**:[X] 人(职责说明) +- **测试工程师**:[X] 人(职责说明) +- **运维工程师**:[X] 人(职责说明) + +### 开发分工 + +| 模块 | 负责人 | 开发重点 | +| -------- | ------ | ---------- | +| [模块 1] | [姓名] | [重点说明] | +| [模块 2] | [姓名] | [重点说明] | +| [模块 3] | [姓名] | [重点说明] | + +## 📅 项目时间线 + +### 第一阶段:[阶段名称]([时间范围]) + +- ✅/🟡/⭕ [任务 1] +- ✅/🟡/⭕ [任务 2] +- ✅/🟡/⭕ [任务 3] + +### 第二阶段:[阶段名称]([时间范围]) + +- ✅/🟡/⭕ [任务 1] +- ✅/🟡/⭕ [任务 2] +- ✅/🟡/⭕ [任务 3] + +### 第三阶段:[阶段名称]([时间范围]) + +- ✅/🟡/⭕ [任务 1] +- ✅/🟡/⭕ [任务 2] +- ✅/🟡/⭕ [任务 3] + +## 🎯 项目目标与 KPI + +### 业务目标 + +- **[目标 1]**:[具体指标] +- **[目标 2]**:[具体指标] +- **[目标 3]**:[具体指标] +- **[目标 4]**:[具体指标] + +### 技术目标 + +- **[目标 1]**:[具体指标] +- **[目标 2]**:[具体指标] +- **[目标 3]**:[具体指标] +- **[目标 4]**:[具体指标] + +### 质量目标 + +- **[目标 1]**:[具体指标] +- **[目标 2]**:[具体指标] +- **[目标 3]**:[具体指标] +- **[目标 4]**:[具体指标] + +## 🔧 开发工具链 + +### 开发环境 + +- **IDE**:[开发工具] +- **版本控制**:[版本控制工具] +- **数据库工具**:[数据库管理工具] +- **API 测试**:[API 测试工具] +- **代码质量**:[代码质量工具] + +### 协作工具 + +- **项目管理**:[项目管理工具] +- **文档协作**:[文档工具] +- **设计工具**:[设计工具] +- **沟通工具**:[沟通工具] + +## 📋 下一步行动计划 + +### 近期重点(未来 [X] 周) + +1. **[行动项 1]** +2. **[行动项 2]** +3. **[行动项 3]** +4. **[行动项 4]** + +### 中期规划(未来 [X] 个月) + +1. **[规划项 1]** +2. **[规划项 2]** +3. **[规划项 3]** +4. **[规划项 4]** + +### 长期愿景(未来 [X] 个月) + +1. **[愿景项 1]** +2. **[愿景项 2]** +3. **[愿景项 3]** +4. **[愿景项 4]** + +--- + +**🎯 项目愿景**:[简洁的项目愿景描述] + +## 📖 相关文档 + +- **业务模块详情**:[业务模块文档](../业务模块/README.md) +- **技术架构设计**:[设计文档](../设计文档/README.md) +- **开发指南**:[开发文档](../开发文档/README.md) +- **部署指南**:[部署文档](../部署文档/README.md) + +--- + +## 📝 模板使用说明 + +### 适用场景 + +- 新项目启动时创建项目总览 +- 项目重大更新时更新项目信息 +- 为新团队成员介绍项目概况 +- 项目汇报和展示 + +### 填写指南 + +1. **基本信息**:填写项目的基础信息,确保准确性 +2. **技术架构**:根据实际技术选型填写,可使用 Mermaid 图表 +3. **团队信息**:根据实际团队结构填写 +4. **时间线**:使用 ✅(已完成)、🟡(进行中)、⭕(未开始)标记 +5. **目标 KPI**:设置可量化的具体指标 + +### 维护要求 + +- **定期更新**:项目重大变更时及时更新 +- **版本管理**:重要更新需要记录版本变更 +- **团队同步**:确保团队成员了解最新项目状态 diff --git a/prompt.md b/prompt.md new file mode 100644 index 00000000..4ddeae04 --- /dev/null +++ b/prompt.md @@ -0,0 +1,793 @@ +# Cursor AI 提示词模板指南 + +> 🎯 **文档目的**:为开发人员提供标准化的 Cursor AI 提示词模板,确保高效的 AI 辅助开发和文档管理 + +## 📋 目录 + +- [新功能开发提示词](#新功能开发提示词) +- [代码重构优化提示词](#代码重构优化提示词) +- [Bug 修复提示词](#bug修复提示词) +- [文档更新提示词](#文档更新提示词) +- [代码审查提示词](#代码审查提示词) +- [API 开发提示词](#api开发提示词) +- [数据库设计提示词](#数据库设计提示词) +- [测试编写提示词](#测试编写提示词) +- [问题排查提示词](#问题排查提示词) +- [架构设计提示词](#架构设计提示词) + +--- + +## 🆕 新功能开发提示词 + +### 基础新功能开发 + +``` +基于以下业务需求开发 [功能名称]: + +**业务上下文**: +- 业务需求:docs/业务模块/[模块名称]/需求分析/ +- 技术规范:docs/开发文档/README.md +- API规范:docs/开发文档/API.md +- 数据库设计:docs/设计文档/database/ + +**开发要求**: +1. 严格遵循项目编码规范 +2. 使用标准的MVC分层架构 +3. 实现完整的CRUD操作 +4. 添加适当的权限控制 +5. 编写单元测试 +6. 添加详细的代码注释 + +**技术要求**: +- 后端:Spring Boot + MyBatis-Plus + Sa-Token +- 前端:Vue 3 + TypeScript + Element Plus +- 数据库:MySQL 8.0,使用雪花ID + +**输出要求**: +1. 生成完整的后端代码(Controller、Service、Mapper、Entity) +2. 生成对应的前端页面(列表页、表单页、详情页) +3. 生成数据库SQL脚本 +4. 立即更新相关文档 + +开发完成后请同步更新: +- docs/开发文档/API.md(新增接口文档) +- docs/业务模块/[模块名称]/相关文档 +- docs/变更管理/code-adjust-record.md(记录变更) +``` + +### 复杂业务功能开发 + +``` +基于业务模块文档开发 [复杂功能名称]: + +**上下文文档**: +- 详细需求:docs/业务模块/[模块名称]/需求分析/业务需求说明.md +- 业务流程:docs/业务模块/[模块名称]/需求分析/用户故事.md +- 技术设计:docs/业务模块/[模块名称]/技术设计/ +- 相关API:docs/开发文档/API.md + +**特殊要求**: +1. 实现工作流引擎集成(使用Warm-Flow) +2. 支持多步骤审批流程 +3. 实现实时消息通知 +4. 考虑并发处理和数据一致性 +5. 支持移动端访问 + +**性能要求**: +- 接口响应时间 < 200ms +- 支持1000并发用户 +- 数据查询优化(合理使用索引和缓存) + +请按照业务模块开发模板的标准结构进行开发,并确保与现有系统的良好集成。 +``` + +--- + +## 🔧 代码重构优化提示词 + +### 性能优化重构 + +``` +对 [模块/类名] 进行性能优化重构: + +**当前问题分析**: +- 性能瓶颈:[具体描述性能问题] +- 响应时间:[当前响应时间] +- 资源使用:[内存/CPU使用情况] + +**优化目标**: +- 目标响应时间:< [X]ms +- 内存使用优化:减少 [X]% +- 提升并发能力:支持 [X] 并发 + +**优化策略**: +1. 数据库查询优化(使用合适的索引和查询方式) +2. 缓存策略优化(Redis缓存热点数据) +3. 代码逻辑优化(减少不必要的循环和计算) +4. 异步处理优化(使用@Async注解) + +**约束条件**: +- 不改变外部接口 +- 保持业务逻辑不变 +- 确保向下兼容 +- 添加性能监控指标 + +请提供优化前后的性能对比数据,并更新相关技术文档。 +``` + +### 代码结构重构 + +``` +重构 [模块名称] 的代码结构: + +**重构原因**: +- [具体的代码问题,如:代码重复、结构混乱、难以维护等] + +**重构目标**: +1. 提高代码可读性和可维护性 +2. 减少代码重复,遵循DRY原则 +3. 改善代码结构,符合SOLID原则 +4. 提升代码复用性 + +**技术规范**: +- 遵循项目编码规范:docs/开发文档/README.md +- 使用标准设计模式 +- 添加适当的抽象层 +- 保持单一职责原则 + +**注意事项**: +- 保持API接口不变 +- 确保所有测试用例通过 +- 逐步重构,避免大范围改动 +- 记录重构过程和决策 + +重构完成后请更新代码注释和相关技术文档。 +``` + +--- + +## 🐛 Bug 修复提示词 + +### 功能 Bug 修复 + +``` +修复 [具体Bug描述]: + +**Bug信息**: +- Bug现象:[详细描述Bug的表现] +- 复现步骤:[如何复现这个Bug] +- 影响范围:[Bug影响的功能和用户] +- 优先级:[高/中/低] + +**上下文信息**: +- 相关代码文件:[列出相关文件路径] +- 相关API接口:[如果涉及API] +- 数据库表:[如果涉及数据库] +- 错误日志:[如果有错误日志] + +**修复要求**: +1. 准确定位Bug根本原因 +2. 提供最小化修复方案 +3. 确保不引入新的问题 +4. 添加防御性代码 +5. 编写回归测试用例 + +**测试要求**: +- 验证Bug已修复 +- 确保相关功能正常 +- 进行边界条件测试 +- 验证性能没有下降 + +修复完成后请更新: +- 相关代码注释 +- 测试用例 +- 变更记录文档 +``` + +### 性能 Bug 修复 + +``` +修复性能问题:[具体性能问题描述] + +**性能问题分析**: +- 当前性能指标:[响应时间、吞吐量等] +- 性能瓶颈位置:[具体定位] +- 资源使用情况:[CPU、内存、数据库连接等] + +**期望目标**: +- 目标响应时间:< [X]ms +- 目标吞吐量:> [X] QPS +- 资源使用优化目标 + +**优化方向**: +1. SQL查询优化 +2. 缓存策略改进 +3. 算法复杂度优化 +4. 资源池配置调优 + +请提供性能测试报告和优化前后对比数据。 +``` + +--- + +## 📚 文档更新提示词 + +### API 文档更新 + +``` +根据代码变更更新API文档: + +**变更内容**: +[具体的代码变更内容,包括新增、修改、删除的接口] + +**文档更新要求**: +1. 严格按照 docs/开发文档/API文档模板.md 的格式 +2. 更新 docs/开发文档/API.md 主文档 +3. 包含完整的接口信息: + - 接口地址和HTTP方法 + - 详细的参数说明 + - 真实的请求和响应示例 + - 完整的错误码定义 + - 权限要求说明 + +**特别注意**: +- 确保示例数据真实有效 +- 参数说明要详细准确 +- 响应格式要与实际代码一致 +- 错误码要覆盖所有可能情况 + +**验证要求**: +- 使用Postman验证API示例 +- 确保文档与代码完全一致 +- 检查所有链接和引用正确 + +更新完成后在变更记录中标注已同步更新API文档。 +``` + +### 业务模块文档更新 + +``` +更新 [模块名称] 业务模块文档: + +**更新触发原因**: +- [功能新增/修改/重构等具体原因] + +**需要更新的文档**: +1. docs/业务模块/[模块名称]/需求分析/ (如有业务变更) +2. docs/业务模块/[模块名称]/技术设计/ (如有技术变更) +3. docs/业务模块/[模块名称]/实现文档/ (代码结构变更) + +**更新标准**: +- 使用 docs/业务模块/业务模块开发模板.md 作为格式参考 +- 确保文档内容与实际实现一致 +- 添加必要的流程图和架构图 +- 更新相关的用户故事和功能清单 + +**质量要求**: +- 业务逻辑描述清晰准确 +- 技术实现细节完整 +- 包含完整的示例和说明 +- 添加必要的注意事项 + +请确保文档可以为其他开发人员和AI提供充分的上下文信息。 +``` + +--- + +## 👀 代码审查提示词 + +### 代码质量审查 + +``` +对以下代码进行质量审查: + +**审查范围**: +[指定具体的文件路径或代码片段] + +**审查重点**: +1. **代码规范**:是否符合项目编码规范 +2. **架构合理性**:是否符合MVC分层架构 +3. **业务逻辑**:是否正确实现业务需求 +4. **性能考虑**:是否有性能问题 +5. **安全性**:是否存在安全隐患 +6. **可维护性**:代码是否易于理解和维护 + +**具体检查项**: +- 命名规范(类名、方法名、变量名) +- 代码注释的完整性和准确性 +- 异常处理是否合理 +- 数据库操作是否安全(防SQL注入) +- 权限控制是否到位 +- 单元测试覆盖率 + +**输出要求**: +1. 列出发现的问题及严重程度 +2. 提供具体的改进建议 +3. 给出代码质量评分 +4. 重点关注业务逻辑正确性 + +请基于项目规范(docs/开发文档/README.md)进行审查。 +``` + +### 安全性审查 + +``` +对代码进行安全性审查: + +**安全检查项目**: +1. **输入验证**:所有用户输入是否经过验证 +2. **SQL注入防护**:是否使用参数化查询 +3. **权限控制**:接口权限验证是否完整 +4. **数据脱敏**:敏感数据是否正确处理 +5. **会话管理**:Token管理是否安全 +6. **错误处理**:是否泄露敏感信息 + +**重点关注**: +- @SaCheckPermission注解使用是否正确 +- 数据库查询是否安全 +- 文件上传下载是否安全 +- 日志记录是否包含敏感信息 +- 接口是否有越权访问风险 + +请提供详细的安全风险评估和修复建议。 +``` + +--- + +## 🔌 API 开发提示词 + +### RESTful API 开发 + +``` +开发 [实体名称] 的RESTful API: + +**基础信息**: +- 实体名称:[Entity] +- 模块路径:[module] +- 业务描述:[业务功能说明] + +**API设计要求**: +1. **标准CRUD接口**: + - GET /api/[module]/list - 分页查询列表 + - GET /api/[module]/{id} - 查询详情 + - POST /api/[module] - 新增 + - PUT /api/[module] - 修改 + - DELETE /api/[module]/{ids} - 批量删除 + +2. **业务接口**(如需要): + - [自定义业务接口列表] + +**技术规范**: +- 使用 @RestController 和 @RequestMapping +- 统一响应格式:Result +- 参数验证:@Valid 和 @Validated +- 权限控制:@SaCheckPermission +- 异常处理:全局异常处理器 + +**代码生成要求**: +1. Controller层:处理HTTP请求 +2. Service层:业务逻辑处理 +3. Mapper层:数据访问 +4. Entity/VO/BO:数据传输对象 + +**文档要求**: +开发完成后立即更新 docs/开发文档/API.md,包含: +- 完整的接口定义 +- 详细的参数说明 +- 真实的请求响应示例 +- 完整的错误码说明 +``` + +### 复杂业务 API 开发 + +``` +开发 [业务功能] 的复杂业务API: + +**业务需求**: +- 参考:docs/业务模块/[模块名称]/需求分析/ +- 业务流程:[具体业务流程说明] +- 特殊要求:[审批流程/状态流转/数据校验等] + +**技术实现要求**: +1. **事务处理**:确保数据一致性 +2. **并发控制**:处理并发访问问题 +3. **性能优化**:合理使用缓存和异步处理 +4. **错误处理**:完善的异常处理机制 + +**集成要求**: +- 工作流引擎:Warm-Flow(如需要) +- 消息通知:实时通知相关用户 +- 数据同步:与其他模块的数据同步 +- 日志记录:完整的操作日志 + +**测试要求**: +1. 单元测试:覆盖所有业务逻辑 +2. 集成测试:测试完整业务流程 +3. 性能测试:验证性能指标 +4. 边界测试:测试异常情况处理 + +请确保API设计符合RESTful规范和项目技术标准。 +``` + +--- + +## 🗄️ 数据库设计提示词 + +### 数据库表设计 + +``` +设计 [业务模块] 的数据库表结构: + +**业务需求**: +- 参考:docs/业务模块/[模块名称]/需求分析/ +- 数据规范:docs/设计文档/database/README.md +- 现有表结构:docs/设计文档/database/hzdyjs_xg.sql + +**设计要求**: +1. **命名规范**: + - 表名:[module]_[entity] (如:sys_user) + - 字段名:下划线命名法 + - 索引名:idx_表名_字段名 + +2. **标准字段**(所有业务表必须包含): + - id (BIGINT) - 主键,雪花ID + - tenant_id (VARCHAR(20)) - 租户ID + - create_dept (BIGINT) - 创建部门 + - create_by (BIGINT) - 创建人 + - create_time (DATETIME) - 创建时间 + - update_by (BIGINT) - 更新人 + - update_time (DATETIME) - 更新时间 + - deleted (TINYINT) - 逻辑删除标记,默认0 + +3. **性能优化**: + - 合理设置索引 + - 考虑查询性能 + - 字段类型选择恰当 + - 预估数据量和增长 + +**输出要求**: +1. 完整的CREATE TABLE语句 +2. 必要的索引创建语句 +3. 表和字段的详细注释 +4. 数据字典说明 + +设计完成后请更新 docs/设计文档/database/ 相关文档。 +``` + +### 数据库优化设计 + +``` +优化 [表名/查询] 的数据库性能: + +**当前问题**: +- 性能瓶颈:[查询慢/死锁/资源占用高等] +- 影响范围:[受影响的功能] +- 性能指标:[当前响应时间/QPS等] + +**优化目标**: +- 查询响应时间:< [X]ms +- 并发支持:> [X] QPS +- 资源使用:减少[X]% + +**优化策略**: +1. **索引优化**: + - 分析慢查询日志 + - 设计合适的复合索引 + - 清理无用索引 + +2. **查询优化**: + - 优化SQL语句 + - 避免全表扫描 + - 合理使用JOIN + +3. **表结构优化**: + - 字段类型优化 + - 分表分库考虑 + - 归档历史数据 + +**验证要求**: +- 提供优化前后性能对比 +- 确保数据正确性 +- 验证业务功能正常 + +请同时更新数据库设计文档和性能优化说明。 +``` + +--- + +## 🧪 测试编写提示词 + +### 单元测试编写 + +``` +为 [类名/方法名] 编写单元测试: + +**测试目标**: +- 被测试类:[完整类路径] +- 业务功能:[功能描述] +- 覆盖要求:> 80% + +**测试框架**: +- JUnit 5 + Mockito +- Spring Boot Test +- TestContainers(如需要数据库测试) + +**测试用例设计**: +1. **正常流程测试**: + - 正常输入的预期输出 + - 边界值测试 + - 典型业务场景 + +2. **异常流程测试**: + - 异常输入处理 + - 业务规则验证 + - 错误边界处理 + +3. **Mock对象**: + - Mock外部依赖 + - Mock数据库操作 + - Mock第三方服务 + +**测试数据**: +- 使用真实但脱敏的测试数据 +- 覆盖各种数据场景 +- 准备充分的边界数据 + +**质量要求**: +- 测试用例独立性 +- 可重复执行 +- 清晰的断言 +- 详细的测试注释 + +请确保测试用例能够充分验证业务逻辑的正确性。 +``` + +### 集成测试编写 + +``` +编写 [模块名称] 的集成测试: + +**测试范围**: +- API接口测试 +- 数据库集成测试 +- 模块间集成测试 +- 第三方服务集成 + +**测试环境**: +- 使用Spring Boot Test +- 配置测试数据库 +- Mock外部服务 +- 准备测试数据 + +**测试场景**: +1. **API接口测试**: + - 所有HTTP接口 + - 参数验证 + - 权限控制 + - 错误处理 + +2. **业务流程测试**: + - 完整业务流程 + - 数据流转验证 + - 状态变更测试 + +3. **数据一致性测试**: + - 事务回滚测试 + - 并发访问测试 + - 数据完整性验证 + +**性能测试**: +- 接口响应时间 +- 并发访问能力 +- 资源使用监控 + +请提供详细的测试报告和问题分析。 +``` + +--- + +## 🔍 问题排查提示词 + +### 系统问题诊断 + +``` +诊断系统问题:[问题描述] + +**问题信息**: +- 现象描述:[详细的问题现象] +- 发生时间:[问题开始时间] +- 影响范围:[受影响的功能和用户] +- 错误信息:[如果有错误日志] + +**环境信息**: +- 部署环境:[开发/测试/生产] +- 系统版本:[当前系统版本] +- 相关配置:[可能相关的配置信息] + +**诊断步骤**: +1. **日志分析**: + - 查看应用日志 + - 分析错误堆栈 + - 检查系统监控数据 + +2. **代码分析**: + - 分析相关代码逻辑 + - 检查最近的代码变更 + - 验证业务逻辑正确性 + +3. **环境检查**: + - 数据库连接状态 + - 缓存服务状态 + - 网络连接状况 + +**解决方案**: +- 提供临时解决方案 +- 制定根本解决方案 +- 预防措施建议 +- 监控改进建议 + +请提供详细的问题分析报告和解决步骤。 +``` + +### 性能问题排查 + +``` +排查性能问题:[具体性能问题] + +**性能指标**: +- 当前响应时间:[X]ms +- 期望响应时间:[X]ms +- 并发用户数:[X] +- 错误率:[X]% + +**排查维度**: +1. **应用层面**: + - 代码执行效率 + - 算法复杂度 + - 内存使用情况 + - GC性能分析 + +2. **数据库层面**: + - 慢查询分析 + - 索引使用情况 + - 锁等待分析 + - 连接池状态 + +3. **系统层面**: + - CPU使用率 + - 内存使用率 + - 网络I/O + - 磁盘I/O + +**分析工具**: +- JProfiler/Arthas +- MySQL Performance Schema +- 应用监控平台 +- 系统监控工具 + +**优化建议**: +请提供具体的性能优化方案和预期效果。 +``` + +--- + +## 🏗️ 架构设计提示词 + +### 系统架构设计 + +``` +设计 [系统/模块] 的技术架构: + +**业务背景**: +- 业务需求:[核心业务需求] +- 用户规模:[预期用户数量] +- 数据规模:[预期数据量] +- 性能要求:[响应时间、并发量等] + +**技术选型**: +- 遵循项目技术栈:docs/开发文档/README.md +- 后端:Spring Boot + MyBatis-Plus + Sa-Token +- 前端:Vue 3 + TypeScript + Element Plus +- 数据库:MySQL + Redis +- 中间件:[根据需要选择] + +**架构原则**: +1. **可扩展性**:支持水平扩展 +2. **可维护性**:模块化设计,低耦合 +3. **高可用性**:容错和降级机制 +4. **安全性**:完善的权限控制 + +**设计要求**: +1. 分层架构设计 +2. 模块依赖关系 +3. 数据流转设计 +4. 接口定义 +5. 部署架构 + +**输出要求**: +1. 架构图(使用Mermaid) +2. 模块说明文档 +3. 接口设计文档 +4. 部署方案 + +请确保架构设计符合现有系统和项目规范。 +``` + +### 微服务拆分设计 + +``` +设计微服务拆分方案: + +**拆分原则**: +1. **业务边界**:按业务领域拆分 +2. **数据独立**:每个服务独立数据库 +3. **团队结构**:符合团队组织架构 +4. **技术栈**:统一技术栈,便于维护 + +**当前系统分析**: +- 现有模块:[列出当前系统模块] +- 依赖关系:[模块间依赖关系] +- 数据关系:[数据表依赖关系] + +**拆分策略**: +1. **服务识别**:识别候选微服务 +2. **边界定义**:明确服务边界 +3. **数据拆分**:设计数据分离方案 +4. **通信机制**:设计服务间通信 + +**技术方案**: +- 服务注册发现:[选择方案] +- 负载均衡:[选择方案] +- 配置管理:[选择方案] +- 监控告警:[选择方案] + +**迁移计划**: +1. 分阶段拆分策略 +2. 数据迁移方案 +3. 风险控制措施 +4. 回滚方案 + +请提供详细的拆分方案和实施计划。 +``` + +--- + +## 📝 使用说明 + +### 提示词使用原则 + +1. **选择合适的模板**:根据当前开发阶段和任务类型选择对应的提示词模板 +2. **补充具体信息**:将模板中的占位符替换为具体的项目信息 +3. **添加上下文**:根据需要添加相关的文档路径和业务背景 +4. **明确要求**:清晰描述期望的输出和质量要求 +5. **文档同步**:强调文档更新的重要性和具体要求 + +### 自定义提示词 + +基于以上模板,开发人员可以根据具体场景进行调整和扩展: + +1. **项目特定信息**:添加项目特有的技术栈和规范要求 +2. **团队协作要求**:根据团队协作流程调整提示词 +3. **质量标准**:根据项目质量要求调整验收标准 +4. **性能要求**:根据项目性能目标调整性能相关要求 + +### 最佳实践 + +1. **逐步细化**:从基础提示词开始,逐步添加具体要求 +2. **反馈优化**:根据 AI 响应效果优化提示词 +3. **团队共享**:将有效的提示词在团队内分享 +4. **持续改进**:根据项目发展不断更新和完善提示词 + +--- + +## 📖 相关文档 + +- **项目总览**:[docs/项目总览/README.md](docs/项目总览/README.md) +- **开发文档**:[docs/开发文档/README.md](docs/开发文档/README.md) +- **业务模块**:[docs/业务模块/README.md](docs/业务模块/README.md) +- **变更管理**:[docs/变更管理/README.md](docs/变更管理/README.md) +- **Cursor 规则**:[.cursorrules](.cursorrules) + +--- + +**🎯 目标**:通过标准化的提示词模板,提升 Cursor AI 辅助开发的效率和质量,确保开发过程符合项目规范,实现代码与文档的同步更新。 diff --git a/工程本地启动指导.md b/工程本地启动指导.md new file mode 100644 index 00000000..11167423 --- /dev/null +++ b/工程本地启动指导.md @@ -0,0 +1,424 @@ +# 工程本地启动指导 + +## 📋 目录 + +- [环境要求](#环境要求) +- [环境安装指导](#环境安装指导) + - [macOS 环境安装](#macos-环境安装) + - [Windows 环境安装](#windows-环境安装) +- [数据库配置](#数据库配置) +- [后端启动](#后端启动) +- [前端启动](#前端启动) +- [常见问题](#常见问题) + +--- + +## 🔧 环境要求 + +### 必需环境 + +- **JDK**: 17 (推荐使用 Oracle JDK 或 OpenJDK) +- **Maven**: 3.8.8+ +- **Node.js**: 20.15.x+ (推荐 20.15.0) +- **npm**: 10.7.x+ +- **MySQL**: 5.7+ 或 8.0+(本机可不安装,使用阿里云的环境) +- **Redis**: 5.0+ (本机可不安装,使用阿里云的环境) + +### 推荐配置 + +- **操作系统**: macOS 12+, Windows 10+, Ubuntu 20.04+ +- **内存**: 8GB+ (推荐 16GB) +- **磁盘**: 20GB+ 可用空间 + +--- + +## 🛠 环境安装指导 + +### macOS 环境安装 + +#### 1. 安装 Homebrew (如未安装) + +```bash +/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" +``` + +#### 2. 安装 JDK 17 + +```bash +# 方法1: 使用 Homebrew +brew install openjdk@17 + +# 创建软链接 +sudo ln -sfn /usr/local/opt/openjdk@17/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-17.jdk + +# 方法2: 下载 Oracle JDK +# 访问: https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html +# 下载 macOS x64 版本并安装 +``` + +#### 3. 安装 Maven 3.8.8 + +```bash +# 方法1: 使用 Homebrew +brew install maven@3.8 + +# 方法2: 手动安装 +cd ~/Downloads +wget https://archive.apache.org/dist/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz +tar -xzf apache-maven-3.8.8-bin.tar.gz +sudo mv apache-maven-3.8.8 /opt/maven +``` + +#### 4. 配置环境变量 + +```bash +# 编辑 ~/.zshrc 或 ~/.bash_profile +vim ~/.zshrc + +# 添加以下内容 +export JAVA_HOME=/Library/Java/JavaVirtualMachines/openjdk-17.jdk/Contents/Home +export MAVEN_HOME=/opt/maven +export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH + +# 使配置生效 +source ~/.zshrc +``` + +#### 5. 安装 Node.js 和 npm + +```bash +# 使用 Homebrew +brew install node@20 + +# 或者下载官方安装包 +# 访问: https://nodejs.org/ +``` + +### Windows 环境安装 + +#### 1. 安装 JDK 17 + +**步骤 1**: 下载 JDK + +- 访问 [Oracle JDK 下载页面](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html) +- 下载 Windows x64 版本的 JDK 17 +- 或者访问 [OpenJDK](https://adoptium.net/) 下载免费版本 + +**步骤 2**: 安装 JDK + +- 运行下载的安装包 +- 选择安装路径 (推荐: `C:\Program Files\Java\jdk-17`) +- 完成安装 + +**步骤 3**: 配置环境变量 + +```cmd +# 打开系统属性 -> 高级 -> 环境变量 + +# 新建系统变量 +变量名: JAVA_HOME +变量值: C:\Program Files\Java\jdk-17 + +# 编辑 Path 变量,添加 +%JAVA_HOME%\bin +``` + +#### 2. 安装 Maven 3.8.8 + +**步骤 1**: 下载 Maven + +- 访问 [Maven 下载页面](https://archive.apache.org/dist/maven/maven-3/3.8.8/binaries/) +- 下载 `apache-maven-3.8.8-bin.zip` + +**步骤 2**: 解压安装 + +- 解压到 `C:\Program Files\Apache\maven-3.8.8` + +**步骤 3**: 配置环境变量 + +```cmd +# 新建系统变量 +变量名: MAVEN_HOME +变量值: C:\Program Files\Apache\maven-3.8.8 + +# 编辑 Path 变量,添加 +%MAVEN_HOME%\bin +``` + +#### 3. 安装 Node.js + +- 访问 [Node.js 官网](https://nodejs.org/) +- 下载 Windows 安装包 (推荐 LTS 版本) +- 运行安装包,按默认选项安装 + +#### 4. 验证安装 + +打开 Command Prompt 或 PowerShell,执行: + +```cmd +java -version +mvn -version +node -version +npm -version +``` + +--- + +## 🗄 数据库配置 + +### MySQL 配置 + +1. 启动 MySQL 服务 +2. 创建数据库 + +```sql +CREATE DATABASE hzdyjs_xg CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +``` + +3. 导入数据库脚本 + +```bash +# 导入完整数据库 +mysql -u root -p hzdyjs_xg < docs/设计文档/database/hzdyjs_xg.sql + +# 或按模块导入 +mysql -u root -p hzdyjs_xg < docs/设计文档/database/05-system-management-module.sql +mysql -u root -p hzdyjs_xg < docs/设计文档/database/03-logistics-module.sql +# ... 其他模块 +``` + +### Redis 配置 + +启动 Redis 服务: + +```bash +# macOS +brew services start redis + +# Windows (如使用 WSL) +sudo service redis-server start + +# 或直接运行 +redis-server +``` + +--- + +## 🚀 后端启动 + +### ⚠️ 重要说明 + +**后端服务必须按照以下顺序启动,每个服务启动成功后再启动下一个!** + +### 启动顺序 + +#### 1. 启动监控服务 + +```bash +cd backend +./start-monitor.sh +``` + +**等待提示**: 看到 "监控服务启动成功" 或类似日志后,再进行下一步 + +#### 2. 启动任务调度服务 + +```bash +./start-job.sh +``` + +**等待提示**: 看到 "任务调度服务启动成功" 或类似日志后,再进行下一步 + +#### 3. 启动主应用服务 + +```bash +./start-main.sh +``` + +**等待提示**: 看到 "主应用启动成功" 或访问 `http://localhost:8080` 正常返回 + +### 启动验证 + +服务启动成功后,可通过以下方式验证: + +- **监控服务**: http://localhost:9090 +- **任务调度服务**: http://localhost:8081 +- **主应用服务**: http://localhost:8080 + +### Windows 环境启动 + +如果在 Windows 环境下,可以使用以下方式: + +```cmd +# 在 Git Bash 或 WSL 中执行 +cd backend +bash start-monitor.sh +bash start-job.sh +bash start-main.sh + +# 或者直接运行 Java 命令 +java -jar ruoyi-extend/ruoyi-monitor-admin/target/ruoyi-monitor-admin.jar +java -jar ruoyi-extend/ruoyi-snailjob-server/target/ruoyi-snailjob-server.jar +java -jar ruoyi-admin/target/ruoyi-admin.jar +``` + +--- + +## 🎨 前端启动 + +### 首次启动 + +#### 1. 安装依赖 + +```bash +cd web +npm install +``` + +**注意**: 首次启动时必须先执行 `npm install` 安装项目依赖 + +#### 2. 启动开发服务器 + +```bash +npm run dev +``` + +### 日常启动 + +如果已经安装过依赖,后续启动只需: + +```bash +cd web +npm run dev +``` + +### 启动成功验证 + +- 浏览器自动打开或手动访问: http://localhost:3000 +- 能够看到登录页面表示启动成功 + +### 其他可用命令 + +```bash +# 构建生产版本 +npm run build + +# 代码格式检查 +npm run lint + +# 代码格式修复 +npm run lint:fix + +# 类型检查 +npm run type-check +``` + +--- + +## ❓ 常见问题 + +### Java 相关 + +**Q: `java -version` 显示版本不对或找不到命令** + +```bash +# 检查 JAVA_HOME 是否正确设置 +echo $JAVA_HOME # macOS/Linux +echo %JAVA_HOME% # Windows + +# 重新设置环境变量后重启终端 +``` + +**Q: Maven 编译失败** + +```bash +# 清理并重新编译 +mvn clean install -DskipTests + +# 检查 Maven 配置 +mvn -version +``` + +### Node.js 相关 + +**Q: `npm install` 失败或速度慢** + +```bash +# 使用淘宝镜像 +npm config set registry https://registry.npmmirror.com + +# 或使用 cnpm +npm install -g cnpm --registry=https://registry.npmmirror.com +cnpm install +``` + +**Q: 端口冲突** + +```bash +# 检查端口占用 +lsof -i :3000 # macOS/Linux +netstat -ano | findstr :3000 # Windows + +# 修改启动端口 +npm run dev -- --port 3001 +``` + +### 数据库相关 + +**Q: 连接数据库失败** + +- 检查 MySQL 服务是否启动 +- 确认数据库用户名密码正确 +- 检查 `application.yml` 中的数据库配置 + +**Q: Redis 连接失败** + +- 检查 Redis 服务是否启动 +- 确认 Redis 端口 (默认 6379) 是否开放 + +### 服务启动相关 + +**Q: 后端服务启动失败** + +- 检查端口是否被占用 (8080, 8081, 9090) +- 查看启动日志确认具体错误 +- 确保按顺序启动服务 + +**Q: 前端无法访问后端接口** + +- 检查后端服务是否正常启动 +- 确认前端代理配置 (vite.config.ts) +- 检查跨域配置 + +--- + +## 📞 技术支持 + +如果在启动过程中遇到问题,请: + +1. **查看日志**: 检查控制台输出的错误信息 +2. **检查环境**: 确认所有环境变量配置正确 +3. **重启服务**: 按照正确顺序重新启动 +4. **查阅文档**: 参考 `docs/` 目录下的相关文档 + +--- + +## 🎯 快速启动检查清单 + +### 环境准备 + +- [ ] JDK 17 安装并配置 +- [ ] Maven 3.8.8 安装并配置 +- [ ] Node.js 和 npm 安装 +- [ ] MySQL 数据库启动并创建 (本机可不安装、使用阿里云测试环境) +- [ ] Redis 服务启动(本机可不安装、使用阿里云测试环境) + +### 启动流程 + +- [ ] 导入数据库脚本 +- [ ] 按顺序启动后端服务 (monitor → job → main) +- [ ] 进入 web 目录执行 npm install (首次) +- [ ] 执行 npm run dev 启动前端 +- [ ] 访问 http://localhost 验证 + +**祝您启动顺利!🎉**