.cursorrules.backup-20250701-122609 77 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358
  1. # Cursor Rules - 项目开发规范
  2. ## 项目结构说明
  3. - **前端工程**:`web/` (基于Vue 3 + TypeScript + Element Plus)
  4. - **后端工程**:`backend/` (基于RuoYi-Vue-Plus + Spring Boot 3.4.6)
  5. - **移动端工程**:`mobile/` (基于uniapp + uView UI构建的校园管理移动端应用)
  6. - **文档管理**:`docs/` (项目的需求、设计、开发、测试、部署文档)
  7. ---
  8. # 第一部分:项目文档管理规范
  9. ## 1. 文档结构管理 (docs/)
  10. ### 🔴 文档目录组织(中文化架构)
  11. ```
  12. docs/
  13. ├── 项目总览/ # 项目基本信息和架构概览
  14. │ ├── README.md # 项目总览主文档
  15. │ └── 项目总览模板.md # 项目总览标准模板
  16. ├── 业务模块/ # 业务模块文档(为AI提供业务上下文)
  17. │ ├── README.md # 业务模块管理总览
  18. │ ├── 业务模块开发模板.md # 业务模块标准开发模板
  19. │ ├── hq-satisfaction-survey/ # 后勤满意度调查模块
  20. │ ├── hall-reservation/ # 报告厅预约模块
  21. │ ├── system-management/ # 系统管理模块
  22. │ └── user-management/ # 用户管理模块
  23. ├── 变更管理/ # 变更管理中心
  24. │ ├── README.md # 变更管理流程和规范
  25. │ └── code-adjust-record.md # 代码调整记录
  26. ├── 开发文档/ # 开发指南和技术规范
  27. │ ├── README.md # 开发文档总览
  28. │ ├── API.md # API接口完整文档
  29. │ └── API文档模板.md # API文档标准模板
  30. ├── 设计文档/ # 设计文档
  31. │ ├── README.md # 设计文档说明
  32. │ └── database/ # 数据库设计
  33. │ ├── hzdyjs_xg.sql # 完整数据库模型
  34. │ ├── 01-workflow-module.sql # 工作流模块SQL
  35. │ ├── 02-code-generator-module.sql # 代码生成模块SQL
  36. │ ├── 03-logistics-module.sql # 后勤管理模块SQL
  37. │ ├── 04-job-scheduler-module.sql # 任务调度模块SQL
  38. │ ├── 05-system-management-module.sql # 系统管理模块SQL
  39. │ ├── 06-test-module.sql # 测试模块SQL
  40. │ ├── SQL文件说明.md # SQL文件拆分说明
  41. │ ├── mysql-database-standard.md # MySQL数据库建设规范
  42. │ ├── database_msg.md # 环境配置信息
  43. │ └── README.md # 数据库设计说明
  44. ├── 需求文档/ # 需求文档
  45. │ ├── README.md # 需求管理说明
  46. │ ├── 后勤报告厅预约需求/ # 报告厅预约系统需求
  47. │ └── 后勤满意度调查需求/ # 满意度调查系统需求
  48. ├── 测试文档/ # 测试文档(按需求维度组织)
  49. │ ├── README.md # 测试文档管理总览
  50. │ ├── 后勤管理/ # 后勤管理相关测试文档
  51. │ │ ├── 物业报修/ # 物业报修系统测试文档
  52. │ │ ├── 满意度调查/ # 满意度调查系统测试文档
  53. │ │ └── 报告厅预约/ # 报告厅预约系统测试文档
  54. │ ├── 系统管理/ # 系统管理相关测试文档
  55. │ ├── 用户管理/ # 用户管理相关测试文档
  56. │ └── 工作流管理/ # 工作流管理相关测试文档
  57. ├── 部署文档/ # 部署文档
  58. │ └── README.md # 部署指南
  59. ├── 中间件配置/ # 中间件配置文档
  60. │ ├── README.md # 中间件配置说明
  61. │ └── mysql-config.md # MySQL配置文档
  62. ├── 知识库/ # 知识库
  63. ├── 报告文档/ # 报告文档
  64. ├── structure-optimization-plan.md # 文档结构优化方案
  65. └── README.md # 文档体系总说明
  66. ```
  67. ### 🔴 重要文档说明
  68. - **工程本地启动指导.md** (项目根目录):包含完整的环境配置和启动指南
  69. - **技术要求更新**:Node.js 20.15.x+, npm 10.7.x+
  70. - **数据库环境**:支持本地安装或使用阿里云测试环境
  71. - **前端访问地址**:http://localhost (非3000端口)
  72. ## 2. 🚨 强制性文档同步更新规则
  73. ### 📋 核心原则:代码与文档必须同步更新
  74. **⚠️ 超级重要:每次使用Cursor AI进行代码调整后,必须立即同步更新相应的项目文档!**
  75. ### 🔴 强制更新触发条件
  76. 每次代码调整必须检查并更新以下文档:
  77. #### 后端代码调整时的强制文档更新:
  78. - **✅ API接口变更**:
  79. - 必须立即更新 `docs/开发文档/API.md`
  80. - 新增接口:添加完整接口文档(地址、参数、响应、权限、示例)
  81. - 修改接口:更新参数说明、响应格式、错误码
  82. - 删除接口:标记为已废弃,说明替代方案
  83. - 权限变更:更新权限要求说明
  84. - **✅ 数据库变更**:
  85. - 更新 `docs/设计文档/database/` 下的相关文档
  86. - 新增表:添加表结构说明和字段注释
  87. - 修改表:更新字段变更和索引调整
  88. - 数据迁移:记录迁移脚本和注意事项
  89. - **✅ 业务逻辑变更**:
  90. - 更新对应 `docs/业务模块/[模块名称]/` 下的业务文档
  91. - 更新业务流程图和业务规则说明
  92. - 修改用户故事和功能需求
  93. - **✅ 配置变更**:
  94. - 更新 `docs/中间件配置/` 下的配置文档
  95. - 更新 `docs/部署文档/` 下的部署说明
  96. #### 前端代码调整时的强制文档更新:
  97. - **✅ 页面功能变更**:
  98. - 更新对应业务模块的用户操作文档
  99. - 更新UI设计规范文档
  100. - **✅ API调用变更**:
  101. - 检查前端API调用是否与后端API文档一致
  102. - 更新API对接说明文档
  103. - **✅ 组件变更**:
  104. - 更新组件使用说明和属性文档
  105. #### 移动端代码调整时的强制文档更新:
  106. - **✅ 功能变更**:更新移动端功能说明文档
  107. - **✅ API对接变更**:更新移动端API调用文档
  108. - **✅ 用户流程变更**:更新用户操作指南
  109. #### 📚 docs文档变更时的强制同步更新规则:
  110. **⚠️ 超级重要:每当docs/目录下的文档结构或重要内容发生变更时,必须立即同步更新.cursorrules文件!**
  111. - **🔴 文档结构变更**:
  112. - 新增/删除目录:同步更新.cursorrules中的"文档目录组织"章节
  113. - 重命名目录:更新所有相关路径引用
  114. - 调整文档层级:更新文档结构说明
  115. - **🔴 重要文档变更**:
  116. - 新增标准模板:在"文档模板体系"中添加说明
  117. - 更新开发规范:同步调整.cursorrules中对应的规范要求
  118. - 修改工作流程:更新"文档更新标准工作流程"
  119. - **🔴 技术环境变更**:
  120. - 环境要求调整:更新.cursorrules中的技术栈规范
  121. - 配置信息变更:同步更新相关配置说明
  122. - 启动流程调整:更新开发指导相关内容
  123. - **🔴 业务模块变更**:
  124. - 新增业务模块:在.cursorrules中添加模块说明
  125. - 模块架构调整:更新业务模块文档管理规范
  126. - API接口变更:确保.cursorrules中的API规范同步
  127. **强制检查清单**:
  128. - [ ] .cursorrules中的文档目录结构是否与实际一致
  129. - [ ] 重要文档路径引用是否全部更新
  130. - [ ] 新增的开发规范是否已同步到.cursorrules
  131. - [ ] 技术要求和环境配置是否保持一致
  132. ### ⏰ 时间填写强制性规范
  133. **🚨 重要:每次记录变更必须填写真实的当前时间!**
  134. #### 强制性时间填写要求:
  135. 1. **变更时间**:必须填写变更发生的实际时间,不得使用错误或虚假时间
  136. 2. **时间格式**:严格按照 `YYYY-MM-DD HH:mm:ss` 格式填写
  137. 3. **时区规范**:使用北京时间(UTC+8)
  138. 4. **获取方法**:
  139. - 在macOS/Linux系统中使用 `date "+%Y-%m-%d %H:%M:%S"` 命令
  140. - 在Windows系统中使用 `Get-Date -Format "yyyy-MM-dd HH:mm:ss"` 命令
  141. - 或使用当前系统显示的时间
  142. 5. **验证要求**:变更时间必须与实际代码修改时间相符
  143. #### 错误示例:
  144. - ❌ 使用1月份时间但实际是6月份
  145. - ❌ 使用固定模板时间不修改
  146. - ❌ 时间格式不正确
  147. #### 正确示例:
  148. - ✅ 2025-06-30 15:43:20 (实际是6月30日下午3点43分)
  149. - ✅ 2025-06-30 18:30:00 (实际是6月30日晚上6点30分)
  150. ### 📝 变更记录排序规范
  151. **🚨 重要:变更记录必须按照倒序排列,最新记录在最上面!**
  152. #### 记录排序要求:
  153. 1. **排序原则**:按时间倒序排列,最新的变更记录放在文件最上面
  154. 2. **新增记录**:每次新增变更记录都必须插入到文件开头(标题下方)
  155. 3. **时间顺序**:确保后面的记录时间早于前面的记录时间
  156. 4. **便于查看**:这样安排便于快速查看最近的变更情况
  157. #### 正确的排序示例:
  158. ```markdown
  159. # 代码调整记录
  160. ## 调整记录 - 2025-06-30 18:30:00 ← 最新记录
  161. ## 调整记录 - 2025-06-30 15:43:20 ← 次新记录
  162. ## 调整记录 - 2025-06-29 10:20:00 ← 更早记录
  163. ## 调整记录 - 2025-06-28 14:15:00 ← 最早记录
  164. ```
  165. #### 错误示例:
  166. - ❌ 新记录添加到文件末尾
  167. - ❌ 时间顺序混乱
  168. - ❌ 按正序排列(最早在上面)
  169. ### 🔄 文档更新标准工作流程
  170. #### Cursor AI 辅助开发的文档更新流程:
  171. ```
  172. 1. **AI代码生成/修改完成**
  173. ↓
  174. 2. **立即检查文档更新需求**
  175. - 是否涉及API变更?
  176. - 是否涉及数据库变更?
  177. - 是否涉及业务逻辑变更?
  178. - 是否涉及配置变更?
  179. - 是否涉及docs文档结构变更?
  180. ↓
  181. 3. **立即更新相关文档**(不得延后!)
  182. - 使用标准模板格式
  183. - 确保信息准确完整
  184. - 添加真实示例
  185. - ⚠️ 填写真实的当前时间,不得使用模板时间
  186. ↓
  187. 4. **检查并更新.cursorrules文件**(重要!)
  188. - 如有docs文档结构变更,同步更新.cursorrules
  189. - 如有技术要求变更,同步更新技术栈规范
  190. - 如有开发流程变更,同步更新工作流程
  191. ↓
  192. 5. **记录变更日志**(按倒序插入到当日文件开头!)
  193. - 检查并创建当日变更记录文件:`code-adjust-record-YYYY-MM-DD-{username}.md`
  194. - 在当日文件开头添加新记录(倒序排列)
  195. - 无需维护索引文件,专注于自己的变更记录
  196. - 标注已同步更新的文档列表
  197. - 标注是否已更新.cursorrules文件
  198. ↓
  199. 6. **验证文档准确性**
  200. - 确保文档与实际代码一致
  201. - 验证示例可以正常运行
  202. - 验证.cursorrules与实际项目状态一致
  203. - 确认记录时间排序正确
  204. ↓
  205. 7. **提交代码和文档变更**
  206. ```
  207. ### 📝 变更记录文件管理规范
  208. **🚨 重要:从2025-06-30开始,变更记录按日期和用户分文件管理!**
  209. #### 📁 文件命名规范
  210. - **文件格式**: `code-adjust-record-YYYY-MM-DD-{username}.md`
  211. - **存放位置**: `docs/变更管理/` 目录
  212. - **命名示例**: `code-adjust-record-2025-06-30-zlwu.md`
  213. - **获取用户名**: 使用 `git config --get user.name` 命令获取
  214. - **获取日期**: 使用 `date "+%Y-%m-%d"` 命令获取
  215. #### 🔄 文件创建和使用流程
  216. 1. **检查当日文件是否存在**:
  217. ```bash
  218. USERNAME=$(git config --get user.name)
  219. TODAY=$(date "+%Y-%m-%d")
  220. FILENAME="docs/变更管理/code-adjust-record-${TODAY}-${USERNAME}.md"
  221. ```
  222. 2. **文件不存在时创建新文件**:
  223. - 使用标准模板创建当日变更记录文件
  224. - 文件头包含日期、用户名、排序说明
  225. 3. **记录变更时**:
  226. - 在当日文件开头插入新记录(倒序排列)
  227. - 无需维护索引文件,每人管理自己的变更记录
  228. #### 👥 多用户协作规范
  229. - **独立管理**: 每个用户有独立的日变更文件,完全避免多人同时编辑冲突
  230. - **无需协调**: 不需要维护共享索引文件,每人管理自己的变更记录
  231. - **用户名一致性**: 确保git用户名配置正确,保持文件命名的一致性
  232. - **文件归档**: 历史文件保留,便于追溯和审计
  233. - **查找便利**: 通过文件名快速定位特定日期和用户的变更记录
  234. #### 📋 每日变更文件标准格式
  235. ```markdown
  236. # 代码调整记录 - YYYY-MM-DD - {username}
  237. > 📅 **记录日期**: YYYY-MM-DD
  238. > 👤 **记录人员**: {username}
  239. > 📌 **排序说明**: 本文件按照时间倒序排列,最新的变更记录在最上面
  240. ## 调整记录 - YYYY-MM-DD HH:mm:ss
  241. **变更ID**: CHG-YYYYMMDD-001
  242. **变更时间**: YYYY-MM-DD HH:mm:ss (⚠️必须填写真实的当前时间!)
  243. **变更人员**: [开发者姓名/Cursor AI辅助]
  244. **变更类型**: 🆕新功能/🐛Bug修复/🔧重构优化/📚文档更新/⚙️配置调整
  245. **影响级别**: 🔴重大变更/🟡中等变更/🟢小变更
  246. ### 📋 变更概述
  247. **变更目的**: [简述变更原因和目标,1-2句话]
  248. **影响范围**: [列出受影响的模块、功能或文件]
  249. ### 📁 涉及文件
  250. **后端文件**:
  251. - backend/[具体文件路径1]
  252. - backend/[具体文件路径2]
  253. **前端文件**:
  254. - web/[具体文件路径1]
  255. - web/[具体文件路径2]
  256. **配置文件**:
  257. - [配置文件路径]
  258. ### 🔧 变更内容详述
  259. **业务逻辑变更**:
  260. 1. [具体业务逻辑的变更说明]
  261. 2. [新增或修改的业务规则]
  262. **技术实现变更**:
  263. 1. [技术方案的调整说明]
  264. 2. [代码结构的优化内容]
  265. **接口变更**:
  266. - **新增接口**: [新增接口列表]
  267. - **修改接口**: [修改的接口及变更内容]
  268. - **废弃接口**: [废弃的接口及替代方案]
  269. **数据库变更**:
  270. - **新增表**: [新增表及字段说明]
  271. - **修改表**: [表结构变更内容]
  272. - **数据迁移**: [数据迁移脚本或说明]
  273. ### 📖 文档同步更新记录
  274. **API文档**:
  275. - [ ] ✅ 已更新 docs/开发文档/API.md
  276. - [ ] ✅ 已更新模块API接口设计文档
  277. **业务文档**:
  278. - [ ] ✅ 已更新业务模块文档
  279. - [ ] ✅ 已更新用户操作手册
  280. **技术文档**:
  281. - [ ] ✅ 已更新数据库设计文档
  282. - [ ] ✅ 已更新架构设计文档
  283. **其他文档**:
  284. - [ ] ✅ 已更新部署文档
  285. - [ ] ✅ 已更新配置文档
  286. **规范文件**:
  287. - [ ] ✅ 已检查并同步更新.cursorrules文件
  288. - [ ] ✅ 已确认文档结构与.cursorrules一致
  289. ### 🧪 测试验证
  290. **功能测试**:
  291. - [ ] 单元测试通过
  292. - [ ] 集成测试通过
  293. - [ ] 功能验收测试通过
  294. **文档验证**:
  295. - [ ] 文档内容与代码实现一致
  296. - [ ] 示例代码可以正常运行
  297. - [ ] 接口文档已验证准确性
  298. ### 📝 备注
  299. **已知问题**: [如有已知问题需要说明]
  300. **后续计划**: [后续的改进或扩展计划]
  301. **相关链接**: [相关的Issue、PR或文档链接]
  302. ---
  303. ```
  304. ## 3. 🔧 业务模块文档管理(为Cursor AI提供完整上下文)
  305. ### 业务模块文档标准结构
  306. 每个业务模块都必须包含以下完整文档:
  307. ```
  308. 业务模块/[模块名称]/
  309. ├── README.md # 模块总览
  310. ├── 需求分析/
  311. │ ├── 业务需求说明.md # 详细业务需求
  312. │ ├── 功能需求清单.md # 功能点清单
  313. │ ├── 非功能需求.md # 性能、安全要求
  314. │ └── 用户故事.md # 用户使用场景
  315. ├── 技术设计/
  316. │ ├── 数据库设计.md # 表结构设计
  317. │ ├── API接口设计.md # 接口定义
  318. │ ├── 架构设计.md # 模块架构
  319. │ └── 技术选型.md # 技术决策说明
  320. ├── 实现文档/
  321. │ ├── 后端实现说明.md # 后端代码结构
  322. │ ├── 前端实现说明.md # 前端代码结构
  323. │ ├── 关键业务逻辑.md # 核心算法逻辑
  324. │ └── 代码规范.md # 编码规范
  325. ├── 测试文档/
  326. │ ├── 测试计划.md # 测试策略
  327. │ ├── 测试用例.md # 具体测试用例
  328. │ └── 测试报告.md # 测试结果
  329. └── 运维文档/
  330. ├── 部署指南.md # 部署步骤
  331. ├── 监控配置.md # 监控指标
  332. └── 故障处理.md # 常见问题
  333. ```
  334. ### 🤖 Cursor AI 开发提示词模板
  335. #### 新功能开发提示词:
  336. ```
  337. 基于以下业务模块文档为 [功能名称] 开发代码:
  338. 业务上下文:docs/业务模块/[模块名称]/需求分析/
  339. 技术规范:docs/业务模块/[模块名称]/技术设计/
  340. 代码结构:docs/业务模块/[模块名称]/实现文档/
  341. API规范:docs/开发文档/API.md
  342. 请确保:
  343. 1. 遵循项目编码规范
  344. 2. 使用标准的代码结构
  345. 3. 添加完整的注释
  346. 4. 生成单元测试代码
  347. 5. 立即更新相关文档
  348. 开发完成后请同步更新:
  349. - docs/开发文档/API.md(如涉及API)
  350. - docs/业务模块/[模块名称]/相关文档
  351. - docs/变更管理/code-adjust-record.md
  352. ```
  353. #### 文档更新提示词:
  354. ```
  355. 根据刚才的代码变更,请更新以下文档:
  356. 变更内容:[具体变更说明]
  357. 影响模块:[模块名称]
  358. 需要更新的文档:
  359. 1. docs/开发文档/API.md - [具体更新内容]
  360. 2. docs/业务模块/[模块名称]/[具体文档] - [具体更新内容]
  361. 3. docs/设计文档/database/ - [如涉及数据库变更]
  362. 请使用标准的文档模板格式,确保信息准确完整。
  363. ```
  364. ## 4. 📚 API文档管理规范
  365. ### 🔴 强制性API文档更新规则
  366. **⚠️ 超级重要:任何API接口的新增、修改、删除都必须立即同步更新 `docs/开发文档/API.md` 文档!**
  367. ### API文档标准格式
  368. 使用 `docs/开发文档/API文档模板.md` 中的标准格式:
  369. ```markdown
  370. #### 接口名称
  371. **接口地址**: `HTTP方法 /api/路径`
  372. **接口描述**: 接口功能的详细描述
  373. **权限要求**: 权限代码或"需要登录"
  374. **请求参数**:
  375. | 参数名 | 类型 | 必填 | 说明 | 示例值 |
  376. |--------|------|------|------|--------|
  377. | param1 | String | Y | 参数说明 | "example" |
  378. **响应示例**:
  379. ```json
  380. {
  381. "code": 200,
  382. "msg": "操作成功",
  383. "data": {}
  384. }
  385. ```
  386. **错误码**:
  387. | 错误码 | 说明 | 解决方案 |
  388. |--------|------|----------|
  389. | 400001 | 参数错误 | 检查请求参数 |
  390. ```
  391. ### 🚨 API变更强制检查清单
  392. 当进行以下操作时,必须更新 `docs/开发文档/API.md`:
  393. **Controller层变更**:
  394. - [ ] 新增Controller类 → 在API.md中添加新的模块章节
  395. - [ ] 新增@RequestMapping方法 → 添加完整的接口文档
  396. - [ ] 修改@RequestMapping路径 → 更新接口地址
  397. - [ ] 修改HTTP方法 → 更新接口方法
  398. - [ ] 删除接口方法 → 标记为已废弃并说明替代方案
  399. **参数和响应变更**:
  400. - [ ] 新增请求参数 → 更新请求参数表格
  401. - [ ] 修改参数类型或必填属性 → 更新参数说明
  402. - [ ] 修改响应数据结构 → 更新响应示例
  403. - [ ] 新增错误码 → 更新错误码说明表
  404. **权限和安全变更**:
  405. - [ ] 新增@SaCheckPermission注解 → 更新权限要求
  406. - [ ] 修改权限代码 → 更新权限说明
  407. - [ ] 修改接口访问级别 → 更新权限要求说明
  408. ## 5. 📊 文档模板体系
  409. ### 已创建的标准模板:
  410. - **`docs/项目总览/项目总览模板.md`** - 项目基本信息模板
  411. - **`docs/业务模块/业务模块开发模板.md`** - 业务模块开发标准模板
  412. - **`docs/开发文档/API文档模板.md`** - API接口文档标准模板
  413. ### 模板使用规范:
  414. 1. **新项目或模块开发时**:复制对应模板,替换占位符
  415. 2. **文档更新时**:参考模板格式,保持结构一致
  416. 3. **Cursor AI生成文档时**:使用模板作为格式参考
  417. ## 6. 🔍 文档质量控制
  418. ### 文档完整性检查清单:
  419. - [ ] 文档结构符合标准模板
  420. - [ ] 内容与实际代码实现一致
  421. - [ ] API文档包含完整示例
  422. - [ ] 业务逻辑描述清晰准确
  423. - [ ] 技术实现说明详细
  424. - [ ] 变更历史有完整记录
  425. - [ ] 所有占位符已替换为真实内容
  426. ### 文档准确性验证:
  427. - [ ] API接口示例可以正常调用
  428. - [ ] 数据库脚本可以成功执行
  429. - [ ] 配置文档与实际配置一致
  430. - [ ] 部署文档可以成功部署
  431. ## 7. 🧪 测试文档管理规范
  432. ### 🔴 测试文档组织原则
  433. - **按需求维度分类**:测试文档必须按照业务需求模块进行组织,不得混合存放
  434. - **结论性文档独立存放**:测试结论性文档必须存放在 `docs/测试文档/` 目录下
  435. - **测试代码独立存放**:测试相关代码必须只存放在 `test/` 目录下
  436. - **日期标识规范**:每次创建的测试文档必须以日期结尾来区分版本
  437. ### 🔴 测试文档目录结构规范
  438. ```
  439. docs/测试文档/
  440. ├── README.md # 测试文档管理总览
  441. ├── [业务模块]/ # 按业务模块分类
  442. │ ├── [具体功能]/ # 具体功能测试
  443. │ │ ├── [功能]接口测试报告-YYYY-MM-DD.md # 接口测试报告
  444. │ │ ├── [功能]功能测试报告-YYYY-MM-DD.md # 功能测试报告
  445. │ │ ├── [功能]性能测试报告-YYYY-MM-DD.md # 性能测试报告
  446. │ │ └── [功能]集成测试报告-YYYY-MM-DD.md # 集成测试报告
  447. │ └── ...
  448. └── ...
  449. test/
  450. ├── package.json # 测试依赖配置
  451. ├── [功能]-api-test.js # API接口测试脚本
  452. ├── [功能]-detailed-test.js # 详细测试分析脚本
  453. ├── [功能]-performance-test.js # 性能测试脚本
  454. └── ...
  455. ```
  456. ### 🔴 测试文档强制要求
  457. #### 1. 测试结论性文档放置规则
  458. - **强制位置**:必须放置在 `docs/测试文档/` 目录下
  459. - **分类方式**:按照需求维度创建子文件夹存放
  460. - **命名规范**:文档名称必须以日期结尾(格式:YYYY-MM-DD)
  461. - **示例路径**:
  462. ```
  463. docs/测试文档/后勤管理/物业报修/物业报修接口测试报告-2025-01-26.md
  464. docs/测试文档/系统管理/用户管理/用户管理功能测试报告-2025-01-26.md
  465. ```
  466. #### 2. 测试代码存放规则
  467. - **强制位置**:只能存放在 `test/` 目录下
  468. - **禁止混合**:test目录下不得存放测试结论性文档
  469. - **代码分类**:按功能模块组织测试脚本
  470. - **示例文件**:
  471. ```
  472. test/pm-repair-api-test.js # 物业报修API测试
  473. test/user-management-test.js # 用户管理测试
  474. test/custom-login-script.js # 登录认证工具
  475. ```
  476. #### 3. 测试文档必含信息
  477. 每个测试结论性文档必须包含以下信息:
  478. - **📁 测试代码路径**:明确标注对应的测试脚本位置
  479. - **🔧 使用方法**:详细说明如何运行测试脚本
  480. - **📊 测试结果**:完整的测试结果和数据分析
  481. - **🎯 结论建议**:明确的测试结论和改进建议
  482. - **⚠️ 问题记录**:发现的问题和解决方案
  483. #### 测试文档标准模板格式:
  484. ```markdown
  485. # [功能模块]测试报告
  486. ## 🎯 测试概览
  487. **测试时间**: YYYY-MM-DD HH:mm:ss (⚠️必须填写真实的当前时间!)
  488. **测试范围**: [具体测试范围]
  489. **需求模块**: [所属业务模块]
  490. ## 📁 测试代码路径
  491. **测试脚本位置**:
  492. - **主要测试脚本**: `test/[功能]-api-test.js`
  493. - **详细分析脚本**: `test/[功能]-detailed-test.js`
  494. - **辅助工具脚本**: `test/[工具名].js`
  495. **使用方法**:
  496. ```bash
  497. cd test
  498. npm install
  499. node [功能]-api-test.js
  500. ```
  501. ## ✅ 测试结果总结
  502. [测试结果详细内容]
  503. ## 🎯 结论
  504. [测试结论和建议]
  505. ---
  506. **测试执行**: 基于 `test/` 目录下的测试脚本
  507. **文档路径**: `docs/测试文档/[模块]/[功能]/[报告名称]-YYYY-MM-DD.md`
  508. ```
  509. ### 🔴 强制工作流程
  510. #### 测试执行流程:
  511. ```
  512. 1. **编写测试代码**
  513. - 在 test/ 目录下创建测试脚本
  514. - 确保代码可独立运行
  515. ↓
  516. 2. **执行测试**
  517. - 运行测试脚本获取结果
  518. - 记录详细的测试数据
  519. ↓
  520. 3. **创建测试报告**
  521. - 在 docs/测试文档/ 按需求维度创建报告
  522. - 文档名称必须包含日期后缀
  523. - 必须包含测试代码路径信息
  524. ↓
  525. 4. **清理test目录**
  526. - 删除test目录下的结论性文档
  527. - 只保留测试代码和配置文件
  528. ↓
  529. 5. **更新文档索引**
  530. - 更新相关README.md文件
  531. - 在变更记录中记录测试活动
  532. ```
  533. ### 🔴 违规检查和纠正
  534. - **检查要点**:
  535. - [ ] test/目录下是否只有代码文件
  536. - [ ] docs/测试文档/下是否按需求维度组织
  537. - [ ] 测试报告是否包含代码路径信息
  538. - [ ] 文档命名是否包含日期后缀
  539. - **纠正措施**:
  540. - 立即移动错误放置的文档到正确位置
  541. - 补充缺失的测试代码路径信息
  542. - 按规范重新组织文档结构
  543. ---
  544. # 第二部分:Web前端开发规范 (web/)
  545. ## 1. 技术栈规范
  546. ### 核心技术
  547. - **框架**: Vue 3.5.13 + TypeScript 5.8.3
  548. - **UI组件库**: Element Plus 2.9.8
  549. - **构建工具**: Vite 7.0.9
  550. - **状态管理**: Pinia
  551. - **路由管理**: Vue Router 4
  552. - **HTTP客户端**: Axios
  553. - **代码风格**: ESLint + Prettier
  554. - **Node.js**: 20.15.x+ (推荐 20.15.0)
  555. - **npm**: 10.7.x+
  556. ### 环境要求
  557. - **开发环境**: 支持本地环境或阿里云测试环境
  558. - **数据库**: MySQL/Redis 支持本机安装或使用阿里云环境
  559. - **前端访问**: http://localhost (默认80端口)
  560. - **后端服务**: http://localhost:8080
  561. ## 2. Art Design Pro UI 规范
  562. ### 设计理念
  563. 基于 Art Design Pro 的设计语言,追求现代化、精致、用户友好的界面体验。注重细节、动效和用户交互的流畅性。
  564. ### 颜色系统
  565. #### 主色调 (Primary Colors)
  566. ```css
  567. --art-primary: 93, 135, 255; /* 主品牌色 - 蓝色 */
  568. --art-secondary: 73, 190, 255; /* 辅助色 - 天蓝色 */
  569. --art-success: 19, 222, 185; /* 成功色 - 绿色 */
  570. --art-warning: 255, 174, 31; /* 警告色 - 橙色 */
  571. --art-error: 250, 137, 107; /* 错误色 - 红色 */
  572. --art-info: 83, 155, 255; /* 信息色 - 蓝色 */
  573. --art-danger: 255, 77, 79; /* 危险色 - 红色 */
  574. ```
  575. #### 背景色系统
  576. ```css
  577. /* 浅色主题 */
  578. --art-bg-color: #fafbfc; /* 页面底色 */
  579. --art-main-bg-color: #ffffff; /* 主要内容背景 */
  580. --art-bg-primary: 236, 242, 255; /* 主色背景 */
  581. --art-bg-secondary: 232, 247, 255; /* 辅助背景 */
  582. --art-bg-success: 230, 255, 250; /* 成功背景 */
  583. --art-bg-warning: 254, 245, 229; /* 警告背景 */
  584. --art-bg-error: 253, 237, 232; /* 错误背景 */
  585. /* 暗色主题 */
  586. html.dark {
  587. --art-bg-color: #070707; /* 页面底色 */
  588. --art-main-bg-color: #161618; /* 主要内容背景 */
  589. }
  590. ```
  591. ### 轮廓式按钮设计系统
  592. #### 🎨 设计理念
  593. 全面采用轮廓式(Outline)按钮设计,提供更加优雅、现代和一致的用户界面体验。
  594. #### 核心规范
  595. - **Primary按钮**: 轮廓式主色设计,主色边框和文字,5%透明度主色背景
  596. - **Success按钮**: 轮廓式成功色设计,成功色边框和文字,5%透明度成功色背景
  597. - **Warning按钮**: 轮廓式警告色设计,警告色边框和文字,5%透明度警告色背景
  598. - **Danger按钮**: 轮廓式危险色设计,危险色边框和文字,5%透明度危险色背景
  599. - **Info按钮**: 轮廓式信息色设计,信息色边框和文字,5%透明度信息色背景
  600. - **Default按钮**: 白色背景,灰色边框,灰色文字
  601. #### 交互效果
  602. - **悬浮状态**: 上移1px + 背景透明度变为10% + 边框透明度变为80% + 彩色阴影
  603. - **点击状态**: 98%缩放 + 0.1s快速过渡 + 背景透明度变为15%
  604. - **禁用状态**: 50%透明度,禁用所有交互和变换
  605. ## 3. 组件开发规范
  606. ### Vue组件结构标准
  607. ```vue
  608. <template>
  609. <div class="component-container">
  610. <!-- 组件内容 -->
  611. </div>
  612. </template>
  613. <script setup lang="ts" name="ComponentName">
  614. // 1. 引入依赖
  615. import { ref, reactive, computed, onMounted } from 'vue';
  616. import type { ComponentProps, ComponentEmits } from './types';
  617. // 2. 定义Props和Emits
  618. const props = defineProps<ComponentProps>();
  619. const emits = defineEmits<ComponentEmits>();
  620. // 3. 响应式数据
  621. const loading = ref(false);
  622. const formData = reactive({});
  623. // 4. 计算属性
  624. const computedValue = computed(() => {
  625. return /* 计算逻辑 */;
  626. });
  627. // 5. 方法定义
  628. const handleClick = () => {
  629. // 方法实现
  630. };
  631. // 6. 生命周期
  632. onMounted(() => {
  633. // 组件挂载后的逻辑
  634. });
  635. </script>
  636. <style lang="scss" scoped>
  637. .component-container {
  638. // 样式实现
  639. }
  640. </style>
  641. ```
  642. ### 页面开发规范
  643. #### 列表页面标准模板
  644. ```vue
  645. <template>
  646. <div class="p-2 page-container">
  647. <!-- 搜索区域 -->
  648. <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
  649. :leave-active-class="proxy?.animate.searchAnimate.leave">
  650. <div v-show="showSearch" class="mb-[10px]">
  651. <el-card shadow="hover">
  652. <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="100px">
  653. <!-- 搜索表单项 -->
  654. <el-form-item>
  655. <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
  656. <el-button icon="Refresh" @click="resetQuery">重置</el-button>
  657. </el-form-item>
  658. </el-form>
  659. </el-card>
  660. </div>
  661. </transition>
  662. <!-- 表格区域 -->
  663. <el-card shadow="never" class="button-card table-card">
  664. <template #header>
  665. <el-row :gutter="10" class="mb8">
  666. <el-col :span="1.5">
  667. <el-button type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
  668. </el-col>
  669. <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
  670. </el-row>
  671. </template>
  672. <!-- 数据表格 -->
  673. <el-table v-loading="loading" border :data="dataList" :height="tableHeight">
  674. <el-table-column type="selection" width="55" align="center" />
  675. <!-- 数据列 -->
  676. <el-table-column label="操作" align="center" width="160">
  677. <template #default="scope">
  678. <!-- 操作按钮 -->
  679. </template>
  680. </el-table-column>
  681. </el-table>
  682. <!-- 分页组件 -->
  683. <pagination v-show="total > 0" :total="total"
  684. v-model:page="queryParams.pageNum"
  685. v-model:limit="queryParams.pageSize"
  686. @pagination="getList" />
  687. </el-card>
  688. </div>
  689. </template>
  690. ```
  691. ## 4. API开发规范
  692. ### API接口定义标准
  693. ```typescript
  694. // api/[module]/index.ts
  695. import request from '@/utils/request';
  696. import type { AxiosPromise } from 'axios';
  697. import type { DataVO, DataForm, DataQuery } from './types';
  698. /**
  699. * 查询数据列表
  700. * @param query 查询参数
  701. */
  702. export const listData = (query?: DataQuery): AxiosPromise<DataVO[]> => {
  703. return request({
  704. url: '/api/data/list',
  705. method: 'get',
  706. params: query
  707. });
  708. };
  709. ```
  710. ## 5. 项目架构规范
  711. ### 目录结构标准
  712. ```
  713. web/src/
  714. ├── api/ # API接口定义
  715. ├── assets/ # 静态资源
  716. ├── components/ # 通用组件
  717. ├── views/ # 页面视图
  718. ├── layout/ # 布局组件
  719. ├── router/ # 路由配置
  720. ├── store/ # 状态管理
  721. ├── utils/ # 工具函数
  722. ├── plugins/ # 插件配置
  723. ├── types/ # 全局类型定义
  724. └── main.ts # 应用入口
  725. ```
  726. ---
  727. # 第三部分:后端开发规范 (backend/)
  728. ## 1. 技术栈规范
  729. ### 核心技术
  730. - **框架**: Spring Boot 3.4.6
  731. - **Java版本**: JDK 17/21
  732. - **Web容器**: Undertow
  733. - **ORM框架**: MyBatis-Plus 3.5.12
  734. - **数据库**: MySQL/Oracle/PostgreSQL/SQLServer (多数据库支持)
  735. - **缓存**: Redis 5-7 + Redisson 3.45.1
  736. - **权限认证**: Sa-Token 1.42.0 + JWT
  737. - **任务调度**: SnailJob 1.5.0
  738. - **工作流**: Warm-Flow 1.7.3
  739. ## 2. 项目结构规范
  740. ### 后端模块结构
  741. ```
  742. backend/
  743. ├── ruoyi-admin/ # 管理后台启动模块
  744. ├── ruoyi-common/ # 公共模块组
  745. │ ├── ruoyi-common-core/ # 核心模块
  746. │ ├── ruoyi-common-mybatis/ # MyBatis配置
  747. │ ├── ruoyi-common-redis/ # Redis配置
  748. │ ├── ruoyi-common-satoken/ # Sa-Token配置
  749. │ └── ... (其他公共模块)
  750. ├── ruoyi-modules/ # 业务模块组
  751. │ ├── ruoyi-system/ # 系统管理模块
  752. │ ├── ruoyi-demo/ # 示例模块
  753. │ └── ... (其他业务模块)
  754. ├── ruoyi-extend/ # 扩展模块组
  755. └── script/ # 脚本和SQL
  756. ```
  757. ## 3. 开发规范
  758. ### 代码规范
  759. - **严格遵守**: Alibaba Java开发手册
  760. - **命名规范**:
  761. - 类名: PascalCase (如: UserController)
  762. - 方法名: camelCase (如: getUserList)
  763. - 常量: UPPER_SNAKE_CASE (如: MAX_RETRY_COUNT)
  764. - 包名: 全小写 (如: org.dromara.system)
  765. ### 🔴 数据库规范(强制性)
  766. - **⚠️ 超级重要**: 所有数据库操作必须严格遵循 `docs/设计文档/database/mysql-database-standard.md` 规范
  767. - **现有数据库模型**: 参考 `docs/设计文档/database/hzdyjs_xg.sql` 中的完整表结构
  768. - **环境配置**: 开发环境数据库信息见 `docs/设计文档/database/database_msg.md`
  769. #### 🚨 强制性核心规范
  770. 1. **所有业务表必须包含标准基础字段**
  771. 2. **统一使用雪花ID (bigint(20)) 作为主键**
  772. 3. **强制使用逻辑删除,禁止物理删除**
  773. 4. **所有表必须支持多租户**
  774. 5. **完整的中文注释是必须的**
  775. 6. **禁止使用数据库外键约束**,关联关系通过应用层维护
  776. #### 🔴 强制性基础字段模板
  777. ```sql
  778. -- 所有业务表必须包含以下字段(顺序和类型必须完全一致)
  779. `id` bigint(20) NOT NULL COMMENT '主键ID',
  780. `tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号',
  781. `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
  782. `create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
  783. `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  784. `update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
  785. `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  786. `deleted` tinyint(1) DEFAULT 0 COMMENT '删除标志(0代表存在 1代表删除)',
  787. -- 业务字段在此处添加
  788. PRIMARY KEY (`id`) USING BTREE,
  789. KEY `idx_tenant_id` (`tenant_id`),
  790. KEY `idx_deleted` (`deleted`),
  791. KEY `idx_create_time` (`create_time`)
  792. ```
  793. #### 🔴 AI开发强制要求
  794. 当使用AI进行数据库开发时:
  795. 1. **必须先阅读** `docs/设计文档/database/mysql-database-standard.md` 规范
  796. 2. **必须使用标准模板**,不得随意修改基础字段
  797. 3. **必须保持与现有表结构的一致性**
  798. 4. **建表后必须立即更新** `hzdyjs_xg.sql` 文件
  799. 5. **必须在变更记录中记录** 数据库变更
  800. ### 🔴 API接口规范(强制性)
  801. **⚠️ 超级重要:所有API接口必须严格遵循以下统一规范!**
  802. #### 🔐 请求头规范(强制性)
  803. **所有需要认证的接口必须在请求头中包含Token,格式如下:**
  804. ```json
  805. {
  806. "Content-Type": "application/json;charset=utf-8",
  807. "Authorization": "Bearer {access_token}",
  808. "clientid": "e5cd7e4891bf95d1d19206ce24a7b32e",
  809. "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
  810. "referer": "http://localhost/login?redirect=%252Findex"
  811. }
  812. ```
  813. **请求头字段说明**:
  814. - **Authorization**: `Bearer ` + Token值(⚠️注意Bearer后面有一个空格)
  815. - **clientid**: 客户端ID,用于权限验证
  816. - **Content-Type**: 请求内容类型,必须为application/json;charset=utf-8
  817. - **Accept-Language**: 语言设置,用于国际化
  818. - **referer**: 来源页面,用于安全验证
  819. **Token格式强制要求**:
  820. - ✅ 正确:`"Authorization": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."`
  821. - ❌ 错误:`"Authorization": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."`(缺少Bearer前缀)
  822. - ❌ 错误:`"Authorization": "Bearer eyJ0eXAi..."`(Bearer后面没有空格)
  823. #### 📊 统一响应格式(必须遵循)
  824. **基础响应格式(分页列表)**:
  825. ```json
  826. {
  827. "total": 7,
  828. "rows": [],
  829. "code": 200,
  830. "msg": "查询成功"
  831. }
  832. ```
  833. #### 🎯 响应格式详细说明
  834. **1. 分页列表响应**
  835. ```json
  836. {
  837. "total": 100,
  838. "rows": [
  839. {
  840. "id": 1,
  841. "name": "示例数据1",
  842. "createTime": "2025-06-30 12:00:00"
  843. },
  844. {
  845. "id": 2,
  846. "name": "示例数据2",
  847. "createTime": "2025-06-30 12:01:00"
  848. }
  849. ],
  850. "code": 200,
  851. "msg": "查询成功"
  852. }
  853. ```
  854. **2. 非分页列表响应**
  855. ```json
  856. {
  857. "code": 200,
  858. "msg": "查询成功",
  859. "data": [
  860. {
  861. "id": 1,
  862. "name": "示例数据1"
  863. },
  864. {
  865. "id": 2,
  866. "name": "示例数据2"
  867. }
  868. ]
  869. }
  870. ```
  871. **3. 单条数据响应**
  872. ```json
  873. {
  874. "code": 200,
  875. "msg": "操作成功",
  876. "data": {
  877. "id": 1,
  878. "name": "示例数据",
  879. "createTime": "2025-06-30 12:00:00"
  880. }
  881. }
  882. ```
  883. **4. 操作成功响应(无数据)**
  884. ```json
  885. {
  886. "code": 200,
  887. "msg": "操作成功",
  888. "data": null
  889. }
  890. ```
  891. **5. 错误响应**
  892. ```json
  893. {
  894. "code": 400,
  895. "msg": "参数错误:用户名不能为空",
  896. "data": null
  897. }
  898. ```
  899. #### 📋 状态码规范
  900. **成功状态码**:
  901. - `200` - 操作成功
  902. - `201` - 创建成功
  903. **客户端错误(4xx)**:
  904. - `400` - 请求参数错误
  905. - `401` - 未认证/认证失败
  906. - `403` - 无权限访问
  907. - `404` - 资源不存在
  908. - `409` - 数据冲突
  909. **服务端错误(5xx)**:
  910. - `500` - 服务器内部错误
  911. - `502` - 网关错误
  912. - `503` - 服务不可用
  913. #### 🚨 接口开发强制要求
  914. **1. Controller返回格式**
  915. ```java
  916. // ✅ 正确 - 分页接口直接返回TableDataInfo
  917. @GetMapping("/list")
  918. public TableDataInfo<UserVo> list(UserBo bo, PageQuery pageQuery) {
  919. TableDataInfo<UserVo> result = userService.queryPageList(bo, pageQuery);
  920. return result;
  921. }
  922. // ✅ 正确 - 非分页接口使用R类型包装
  923. @GetMapping("/options")
  924. public R<List<UserVo>> options() {
  925. List<UserVo> list = userService.selectUserOptions();
  926. return R.ok(list);
  927. }
  928. // ❌ 错误 - 分页接口使用R类型包装
  929. @GetMapping("/list")
  930. public R<TableDataInfo<UserVo>> list(UserBo bo, PageQuery pageQuery) {
  931. TableDataInfo<UserVo> result = userService.queryPageList(bo, pageQuery);
  932. return R.ok(result); // 这会产生多层嵌套
  933. }
  934. ```
  935. **2. 分页接口规范**
  936. ```java
  937. // 分页查询直接返回 TableDataInfo 数据
  938. @GetMapping("/list")
  939. public TableDataInfo<UserVo> list(UserBo bo, PageQuery pageQuery) {
  940. TableDataInfo<UserVo> result = userService.queryPageList(bo, pageQuery);
  941. return result;
  942. }
  943. // 返回格式:
  944. // {
  945. // "total": 100,
  946. // "rows": [...],
  947. // "code": 200,
  948. // "msg": "查询成功"
  949. // }
  950. ```
  951. **3. 非分页列表接口**
  952. ```java
  953. // 非分页列表查询(下拉选项等)
  954. @GetMapping("/options")
  955. public R<List<UserVo>> options() {
  956. List<UserVo> list = userService.selectUserOptions();
  957. return R.ok(list);
  958. }
  959. // 返回格式:
  960. // {
  961. // "code": 200,
  962. // "msg": "查询成功",
  963. // "data": [...]
  964. // }
  965. ```
  966. **4. 单条数据接口**
  967. ```java
  968. // 单条数据查询
  969. @GetMapping("/{id}")
  970. public R<UserVo> getInfo(@PathVariable Long id) {
  971. UserVo user = userService.queryById(id);
  972. return R.ok(user);
  973. }
  974. // 返回格式:
  975. // {
  976. // "code": 200,
  977. // "msg": "操作成功",
  978. // "data": {...}
  979. // }
  980. ```
  981. **5. 操作类接口**
  982. ```java
  983. // 新增/修改/删除操作
  984. @PostMapping
  985. public R<Void> add(@RequestBody UserBo bo) {
  986. boolean result = userService.insertByBo(bo);
  987. return result ? R.ok() : R.fail("操作失败");
  988. }
  989. // 成功返回格式:
  990. // {
  991. // "code": 200,
  992. // "msg": "操作成功",
  993. // "data": null
  994. // }
  995. // 失败返回格式:
  996. // {
  997. // "code": 500,
  998. // "msg": "操作失败",
  999. // "data": null
  1000. // }
  1001. ```
  1002. #### 🔍 接口命名规范
  1003. **RESTful风格**:
  1004. - `GET /api/users` - 查询用户列表
  1005. - `GET /api/users/{id}` - 查询单个用户
  1006. - `POST /api/users` - 新增用户
  1007. - `PUT /api/users` - 修改用户(传完整对象)
  1008. - `PATCH /api/users/{id}` - 部分更新用户
  1009. - `DELETE /api/users/{id}` - 删除用户
  1010. **特殊功能接口**:
  1011. - `GET /api/users/options` - 获取用户下拉选项
  1012. - `GET /api/users/statistics` - 获取用户统计数据
  1013. - `POST /api/users/batch` - 批量操作用户
  1014. - `POST /api/users/{id}/enable` - 启用用户
  1015. - `POST /api/users/{id}/disable` - 禁用用户
  1016. #### 🛡️ 权限控制规范
  1017. ```java
  1018. // 每个接口必须添加权限注解
  1019. @SaCheckPermission("system:user:list")
  1020. @GetMapping("/list")
  1021. public R<TableDataInfo<UserVo>> list(UserBo bo, PageQuery pageQuery) {
  1022. // 接口实现
  1023. }
  1024. ```
  1025. #### 📝 参数验证规范
  1026. ```java
  1027. // 使用Bean Validation进行参数校验
  1028. @PostMapping
  1029. public R<Void> add(@Validated(AddGroup.class) @RequestBody UserBo bo) {
  1030. // 接口实现
  1031. }
  1032. // VO类中的验证注解
  1033. public class UserBo {
  1034. @NotBlank(message = "用户名不能为空", groups = {AddGroup.class, EditGroup.class})
  1035. @Size(max = 30, message = "用户名长度不能超过30个字符")
  1036. private String userName;
  1037. @NotBlank(message = "手机号不能为空", groups = {AddGroup.class, EditGroup.class})
  1038. @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
  1039. private String phone;
  1040. }
  1041. ```
  1042. #### 🚨 接口开发检查清单
  1043. **每个新接口必须检查**:
  1044. - [ ] 是否在请求头中正确使用了Bearer Token格式?
  1045. - [ ] 分页接口是否直接返回TableDataInfo格式?
  1046. - [ ] 非分页接口是否使用R类型包装返回结果?
  1047. - [ ] 是否遵循了统一的响应格式规范?
  1048. - [ ] 是否添加了@SaCheckPermission权限注解?
  1049. - [ ] 是否添加了@Operation接口描述?
  1050. - [ ] 是否进行了参数校验?
  1051. - [ ] 是否符合RESTful命名规范?
  1052. - [ ] 是否包含了必要的请求头(clientid、Content-Type等)?
  1053. - [ ] 是否在API文档中记录了接口信息?
  1054. #### 💥 违规后果
  1055. **如果发现接口不符合统一规范,必须立即修改!不符合规范的接口不允许合并到主分支。**
  1056. ### 🔴 API开发强制性工作流程
  1057. #### 步骤1:编写后端代码
  1058. - 创建Controller、Service、Mapper等
  1059. - 实现业务逻辑和数据处理
  1060. - 添加权限控制和参数验证
  1061. #### 步骤2:立即更新API文档(强制性)
  1062. **⚠️ 代码写完后立即执行,不得延后!**
  1063. - 打开 `docs/开发文档/API.md` 文件
  1064. - 按照 `docs/开发文档/API文档模板.md` 的标准格式添加或更新接口文档
  1065. - 包含完整的接口信息(地址、参数、响应、权限等)
  1066. - 添加真实的请求和响应示例
  1067. #### 步骤3:记录代码调整日志
  1068. - 在 `docs/变更管理/code-adjust-record.md` 中记录本次变更
  1069. - 特别说明API接口的变更内容
  1070. - 标注文档已同步更新
  1071. #### 步骤4:验证和测试
  1072. - 测试API接口功能是否正常
  1073. - 验证API文档的准确性
  1074. - 确保文档示例与实际响应一致
  1075. #### 🚨 违规后果
  1076. **如果发现API变更未同步更新文档,该代码变更将被视为不完整,必须立即补齐文档。**
  1077. ## 4. 🔐 菜单界面和接口权限配置规范
  1078. ### 🚨 权限配置核心原理
  1079. **⚠️ 超级重要:每个菜单界面和相关接口都必须在`sys_menu`表中配置对应的权限数据!**
  1080. #### 权限配置核心概念
  1081. 1. **菜单权限**:控制用户是否能看到某个菜单项
  1082. 2. **按钮权限**:控制用户是否能看到和使用某个功能按钮
  1083. 3. **接口权限**:通过Sa-Token注解控制用户是否能调用某个API接口
  1084. 4. **角色权限**:通过`sys_role_menu`表关联,控制哪个角色拥有哪些权限
  1085. #### 权限验证机制
  1086. ```
  1087. 用户登录 → 获取用户角色 → 查询角色权限(sys_role_menu) → 验证接口权限(@SaCheckPermission) → 允许/拒绝访问
  1088. ```
  1089. ### 🔴 sys_menu表结构和权限配置
  1090. #### sys_menu表核心字段说明
  1091. ```sql
  1092. -- sys_menu表核心字段
  1093. `menu_id` bigint(20) 菜单ID(主键)
  1094. `menu_name` varchar(50) 菜单名称
  1095. `parent_id` bigint(20) 父菜单ID(0表示一级菜单)
  1096. `order_num` int(4) 显示顺序
  1097. `path` varchar(200) 路由地址
  1098. `component` varchar(255) 组件路径
  1099. `menu_type` char(1) 菜单类型(M目录 C菜单 F按钮)
  1100. `visible` char(1) 菜单状态(0显示 1隐藏)
  1101. `status` char(1) 菜单状态(0正常 1停用)
  1102. `perms` varchar(100) 权限标识(如:system:user:list)
  1103. `icon` varchar(100) 菜单图标
  1104. ```
  1105. #### 权限标识(perms)命名规范
  1106. ```
  1107. 格式:[模块名]:[功能名]:[操作名]
  1108. 示例:
  1109. - pm:repairOrder:list # 报修工单列表查询
  1110. - pm:repairOrder:add # 报修工单新增
  1111. - pm:repairOrder:edit # 报修工单修改
  1112. - pm:repairOrder:remove # 报修工单删除
  1113. - pm:repairOrder:statistics # 报修统计数据
  1114. - pm:category:list # 维修分类列表
  1115. - pm:category:options # 维修分类下拉选项
  1116. ```
  1117. ### 🔧 权限配置标准工作流程
  1118. #### 📋 新增功能权限配置流程
  1119. **步骤1:分析权限需求**
  1120. ```
  1121. 1. 确定主菜单名称和路径
  1122. 2. 列出所有功能按钮(新增、修改、删除、查询等)
  1123. 3. 列出所有API接口及对应权限
  1124. 4. 确定权限标识命名
  1125. ```
  1126. **步骤2:权限配置SQL编写**
  1127. 使用UPSERT逻辑(先判断后操作):
  1128. ```sql
  1129. -- 权限配置标准模板(UPSERT逻辑)
  1130. -- ==========================================
  1131. -- [模块名]权限配置脚本
  1132. -- 功能:为[模块名]添加完整权限配置
  1133. -- 时间:YYYY-MM-DD HH:mm:ss
  1134. -- 说明:使用UPSERT逻辑,避免重复插入
  1135. -- ==========================================
  1136. -- 第一步:检查并插入主菜单
  1137. INSERT INTO sys_menu (
  1138. menu_id, menu_name, parent_id, order_num, path, component,
  1139. query_param, is_frame, is_cache, menu_type, visible, status,
  1140. perms, icon, create_by, create_time, update_by, update_time, remark
  1141. )
  1142. SELECT
  1143. 2100, '物业管理', 0, 6, 'pm', NULL,
  1144. '', 1, 0, 'M', '0', '0',
  1145. '', 'tool', 1, now(), 1, now(), '物业管理模块'
  1146. WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2100);
  1147. -- 第二步:检查并插入子菜单
  1148. INSERT INTO sys_menu (
  1149. menu_id, menu_name, parent_id, order_num, path, component,
  1150. query_param, is_frame, is_cache, menu_type, visible, status,
  1151. perms, icon, create_by, create_time, update_by, update_time, remark
  1152. )
  1153. SELECT
  1154. 2110, '报修管理', 2100, 1, 'repairOrder', 'pm/repairOrder/index',
  1155. '', 1, 0, 'C', '0', '0',
  1156. 'pm:repairOrder:list', 'form', 1, now(), 1, now(), '报修工单管理'
  1157. WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2110);
  1158. -- 第三步:批量插入功能权限(如果不存在)
  1159. INSERT INTO sys_menu (
  1160. menu_id, menu_name, parent_id, order_num, path, component,
  1161. query_param, is_frame, is_cache, menu_type, visible, status,
  1162. perms, icon, create_by, create_time, update_by, update_time, remark
  1163. )
  1164. SELECT * FROM (
  1165. SELECT 2111, '查询', 2110, 1, '', '', '', 1, 0, 'F', '0', '0', 'pm:repairOrder:query', '#', 1, now(), 1, now(), '查询权限' UNION ALL
  1166. SELECT 2112, '新增', 2110, 2, '', '', '', 1, 0, 'F', '0', '0', 'pm:repairOrder:add', '#', 1, now(), 1, now(), '新增权限' UNION ALL
  1167. SELECT 2113, '修改', 2110, 3, '', '', '', 1, 0, 'F', '0', '0', 'pm:repairOrder:edit', '#', 1, now(), 1, now(), '修改权限'
  1168. ) AS temp
  1169. WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = temp.menu_id);
  1170. -- 第四步:为admin角色分配权限(如果未分配)
  1171. INSERT IGNORE INTO sys_role_menu (role_id, menu_id)
  1172. SELECT 1, menu_id FROM sys_menu WHERE menu_id BETWEEN 2100 AND 2199;
  1173. ```
  1174. **步骤3:更新现有权限**
  1175. ```sql
  1176. -- 更新现有权限信息(如果需要修改)
  1177. UPDATE sys_menu
  1178. SET
  1179. menu_name = '新的菜单名称',
  1180. path = '新的路径',
  1181. perms = '新的权限标识',
  1182. update_time = now(),
  1183. update_by = 1,
  1184. remark = '权限更新说明'
  1185. WHERE menu_id = 2110 AND EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2110);
  1186. ```
  1187. ### 🔄 权限配置操作规范
  1188. #### 🚨 强制性检查清单
  1189. **每次新增功能时必须检查**:
  1190. - [ ] 是否需要新增主菜单?
  1191. - [ ] 是否需要新增子菜单?
  1192. - [ ] 列出所有需要的功能权限(CRUD等)
  1193. - [ ] 列出所有API接口及权限标识
  1194. - [ ] 确认权限标识命名符合规范
  1195. - [ ] 权限配置是否使用UPSERT逻辑?
  1196. - [ ] 是否为相关角色分配了权限?
  1197. #### 🔍 权限配置验证方法
  1198. **验证SQL模板**:
  1199. ```sql
  1200. -- 1. 验证权限是否已正确配置
  1201. SELECT menu_id, menu_name, perms, menu_type
  1202. FROM sys_menu
  1203. WHERE perms LIKE 'pm:%'
  1204. ORDER BY menu_id;
  1205. -- 2. 验证角色权限分配
  1206. SELECT rm.role_id, r.role_name, m.menu_name, m.perms
  1207. FROM sys_role_menu rm
  1208. JOIN sys_role r ON rm.role_id = r.role_id
  1209. JOIN sys_menu m ON rm.menu_id = m.menu_id
  1210. WHERE m.perms LIKE 'pm:%'
  1211. ORDER BY rm.role_id, m.menu_id;
  1212. -- 3. 验证用户权限(通过角色)
  1213. SELECT u.user_name, r.role_name, m.menu_name, m.perms
  1214. FROM sys_user u
  1215. JOIN sys_user_role ur ON u.user_id = ur.user_id
  1216. JOIN sys_role r ON ur.role_id = r.role_id
  1217. JOIN sys_role_menu rm ON r.role_id = rm.role_id
  1218. JOIN sys_menu m ON rm.menu_id = m.menu_id
  1219. WHERE u.user_name = 'admin' AND m.perms LIKE 'pm:%'
  1220. ORDER BY m.menu_id;
  1221. ```
  1222. ### 🎯 Controller权限注解规范
  1223. #### 标准权限注解使用
  1224. ```java
  1225. @RestController
  1226. @RequestMapping("/pm/repairOrder")
  1227. @Api(tags = "报修工单管理")
  1228. public class PmRepairOrderController extends BaseController {
  1229. // 列表查询 - 对应菜单权限
  1230. @SaCheckPermission("pm:repairOrder:list")
  1231. @GetMapping("/list")
  1232. @Operation(summary = "查询报修工单列表")
  1233. public TableDataInfo<PmRepairOrderVo> list(PmRepairOrderBo bo, PageQuery pageQuery) {
  1234. return repairOrderService.queryPageList(bo, pageQuery);
  1235. }
  1236. // 详情查询 - 对应按钮权限
  1237. @SaCheckPermission("pm:repairOrder:query")
  1238. @GetMapping("/{id}")
  1239. @Operation(summary = "获取报修工单详细信息")
  1240. public R<PmRepairOrderVo> getInfo(@PathVariable Long id) {
  1241. return R.ok(repairOrderService.queryById(id));
  1242. }
  1243. // 新增功能 - 对应按钮权限
  1244. @SaCheckPermission("pm:repairOrder:add")
  1245. @PostMapping
  1246. @Operation(summary = "新增报修工单")
  1247. public R<Void> add(@RequestBody PmRepairOrderBo bo) {
  1248. return toAjax(repairOrderService.insertByBo(bo));
  1249. }
  1250. // 修改功能 - 对应按钮权限
  1251. @SaCheckPermission("pm:repairOrder:edit")
  1252. @PutMapping
  1253. @Operation(summary = "修改报修工单")
  1254. public R<Void> edit(@RequestBody PmRepairOrderBo bo) {
  1255. return toAjax(repairOrderService.updateByBo(bo));
  1256. }
  1257. // 删除功能 - 对应按钮权限
  1258. @SaCheckPermission("pm:repairOrder:remove")
  1259. @DeleteMapping("/{ids}")
  1260. @Operation(summary = "删除报修工单")
  1261. public R<Void> remove(@PathVariable Long[] ids) {
  1262. return toAjax(repairOrderService.deleteWithValidByIds(List.of(ids)));
  1263. }
  1264. // 统计数据 - 对应功能权限
  1265. @SaCheckPermission("pm:repairOrder:statistics")
  1266. @GetMapping("/statistics")
  1267. @Operation(summary = "获取报修统计数据")
  1268. public R<Map<String, Object>> statistics() {
  1269. return R.ok(repairOrderService.getStatistics());
  1270. }
  1271. // 下拉选项 - 对应功能权限
  1272. @SaCheckPermission("pm:repairOrder:generateOrderNo")
  1273. @PostMapping("/generateOrderNo")
  1274. @Operation(summary = "生成工单编号")
  1275. public R<String> generateOrderNo() {
  1276. return R.ok(repairOrderService.generateOrderNo());
  1277. }
  1278. }
  1279. ```
  1280. #### 权限注解检查清单
  1281. - [ ] 每个Controller方法都有@SaCheckPermission注解
  1282. - [ ] 权限标识与sys_menu表中的perms字段一致
  1283. - [ ] 权限标识命名符合[模块]:[功能]:[操作]规范
  1284. - [ ] 所有权限标识都已在sys_menu表中配置
  1285. ### 🖥️ 前端权限控制规范
  1286. #### Vue页面权限控制
  1287. ```vue
  1288. <template>
  1289. <div class="app-container">
  1290. <!-- 功能按钮权限控制 -->
  1291. <el-row :gutter="10" class="mb8">
  1292. <el-col :span="1.5">
  1293. <el-button
  1294. v-hasPermi="['pm:repairOrder:add']"
  1295. type="primary"
  1296. plain
  1297. icon="Plus"
  1298. @click="handleAdd">
  1299. 新增
  1300. </el-button>
  1301. </el-col>
  1302. <el-col :span="1.5">
  1303. <el-button
  1304. v-hasPermi="['pm:repairOrder:edit']"
  1305. type="success"
  1306. plain
  1307. icon="Edit"
  1308. :disabled="single"
  1309. @click="handleUpdate">
  1310. 修改
  1311. </el-button>
  1312. </el-col>
  1313. <el-col :span="1.5">
  1314. <el-button
  1315. v-hasPermi="['pm:repairOrder:remove']"
  1316. type="danger"
  1317. plain
  1318. icon="Delete"
  1319. :disabled="multiple"
  1320. @click="handleDelete">
  1321. 删除
  1322. </el-button>
  1323. </el-col>
  1324. </el-row>
  1325. <!-- 表格操作列权限控制 -->
  1326. <el-table-column label="操作" align="center" width="160">
  1327. <template #default="scope">
  1328. <el-tooltip content="修改" placement="top">
  1329. <el-button
  1330. v-hasPermi="['pm:repairOrder:edit']"
  1331. link
  1332. type="primary"
  1333. icon="Edit"
  1334. @click="handleUpdate(scope.row)">
  1335. </el-button>
  1336. </el-tooltip>
  1337. <el-tooltip content="删除" placement="top">
  1338. <el-button
  1339. v-hasPermi="['pm:repairOrder:remove']"
  1340. link
  1341. type="danger"
  1342. icon="Delete"
  1343. @click="handleDelete(scope.row)">
  1344. </el-button>
  1345. </el-tooltip>
  1346. </template>
  1347. </el-table-column>
  1348. </div>
  1349. </template>
  1350. ```
  1351. #### API调用权限检查
  1352. ```typescript
  1353. // api调用前的权限检查(可选)
  1354. import { checkPermi } from '@/utils/permission';
  1355. // 在调用API前检查权限
  1356. const handleAdd = () => {
  1357. if (!checkPermi(['pm:repairOrder:add'])) {
  1358. ElMessage.error('您没有新增权限');
  1359. return;
  1360. }
  1361. // 执行新增操作
  1362. router.push('/pm/repairOrder/add');
  1363. };
  1364. const handleEdit = (row: any) => {
  1365. if (!checkPermi(['pm:repairOrder:edit'])) {
  1366. ElMessage.error('您没有修改权限');
  1367. return;
  1368. }
  1369. // 执行修改操作
  1370. router.push(`/pm/repairOrder/edit/${row.id}`);
  1371. };
  1372. ```
  1373. ### 📋 权限配置标准模板
  1374. #### 完整权限配置脚本模板
  1375. ```sql
  1376. -- ==========================================
  1377. -- [模块名称]权限配置脚本
  1378. -- 功能:为[模块名称]添加完整权限配置
  1379. -- 时间:YYYY-MM-DD HH:mm:ss (⚠️必须填写真实时间!)
  1380. -- 说明:使用UPSERT逻辑,支持重复执行
  1381. -- ==========================================
  1382. -- 清理旧数据(谨慎使用,仅在测试环境)
  1383. -- DELETE FROM sys_role_menu WHERE menu_id BETWEEN [起始ID] AND [结束ID];
  1384. -- DELETE FROM sys_menu WHERE menu_id BETWEEN [起始ID] AND [结束ID];
  1385. -- 第一部分:主菜单配置
  1386. INSERT INTO sys_menu (
  1387. menu_id, menu_name, parent_id, order_num, path, component,
  1388. query_param, is_frame, is_cache, menu_type, visible, status,
  1389. perms, icon, create_by, create_time, update_by, update_time, remark
  1390. )
  1391. SELECT
  1392. [主菜单ID], '[主菜单名称]', 0, [排序号], '[路径]', NULL,
  1393. '', 1, 0, 'M', '0', '0',
  1394. '', '[图标]', 1, now(), 1, now(), '[模块描述]'
  1395. WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = [主菜单ID]);
  1396. -- 第二部分:子菜单配置
  1397. INSERT INTO sys_menu (
  1398. menu_id, menu_name, parent_id, order_num, path, component,
  1399. query_param, is_frame, is_cache, menu_type, visible, status,
  1400. perms, icon, create_by, create_time, update_by, update_time, remark
  1401. )
  1402. SELECT
  1403. [子菜单ID], '[子菜单名称]', [主菜单ID], [排序号], '[路径]', '[组件路径]',
  1404. '', 1, 0, 'C', '0', '0',
  1405. '[模块]:[功能]:list', '[图标]', 1, now(), 1, now(), '[功能描述]'
  1406. WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = [子菜单ID]);
  1407. -- 第三部分:功能权限配置(批量插入)
  1408. INSERT INTO sys_menu (
  1409. menu_id, menu_name, parent_id, order_num, path, component,
  1410. query_param, is_frame, is_cache, menu_type, visible, status,
  1411. perms, icon, create_by, create_time, update_by, update_time, remark
  1412. )
  1413. SELECT * FROM (
  1414. -- 基础CRUD权限
  1415. SELECT [权限ID1], '[功能名称]查询', [子菜单ID], 1, '', '', '', 1, 0, 'F', '0', '0', '[模块]:[功能]:query', '#', 1, now(), 1, now(), '查询权限' UNION ALL
  1416. SELECT [权限ID2], '[功能名称]新增', [子菜单ID], 2, '', '', '', 1, 0, 'F', '0', '0', '[模块]:[功能]:add', '#', 1, now(), 1, now(), '新增权限' UNION ALL
  1417. SELECT [权限ID3], '[功能名称]修改', [子菜单ID], 3, '', '', '', 1, 0, 'F', '0', '0', '[模块]:[功能]:edit', '#', 1, now(), 1, now(), '修改权限' UNION ALL
  1418. SELECT [权限ID4], '[功能名称]删除', [子菜单ID], 4, '', '', '', 1, 0, 'F', '0', '0', '[模块]:[功能]:remove', '#', 1, now(), 1, now(), '删除权限' UNION ALL
  1419. -- 特殊功能权限
  1420. SELECT [权限ID5], '[特殊功能名称]', [子菜单ID], 5, '', '', '', 1, 0, 'F', '0', '0', '[模块]:[功能]:[特殊操作]', '#', 1, now(), 1, now(), '[特殊功能描述]'
  1421. ) AS temp
  1422. WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = temp.menu_id);
  1423. -- 第四部分:权限分配(为admin角色分配权限)
  1424. INSERT IGNORE INTO sys_role_menu (role_id, menu_id)
  1425. SELECT 1, menu_id FROM sys_menu WHERE menu_id BETWEEN [起始ID] AND [结束ID];
  1426. -- 第五部分:验证配置结果
  1427. SELECT '权限配置验证' as message,
  1428. COUNT(*) as menu_count,
  1429. (SELECT COUNT(*) FROM sys_role_menu WHERE role_id = 1 AND menu_id BETWEEN [起始ID] AND [结束ID]) as role_permission_count
  1430. FROM sys_menu
  1431. WHERE menu_id BETWEEN [起始ID] AND [结束ID];
  1432. ```
  1433. ### 🧪 权限配置测试和验证
  1434. #### 权限测试标准流程
  1435. ```
  1436. 1. **权限配置验证**
  1437. - 检查sys_menu表中权限记录
  1438. - 检查sys_role_menu表中角色权限分配
  1439. - 验证权限标识命名规范
  1440. ↓
  1441. 2. **后端接口测试**
  1442. - 使用Token调用接口
  1443. - 验证权限认证是否正常
  1444. - 测试无权限用户访问是否被拒绝
  1445. ↓
  1446. 3. **前端界面测试**
  1447. - 登录系统查看菜单是否显示
  1448. - 检查功能按钮是否根据权限显示/隐藏
  1449. - 验证无权限用户的界面表现
  1450. ↓
  1451. 4. **权限缓存测试**
  1452. - 重启服务后权限是否正常
  1453. - 重新登录后权限是否正确加载
  1454. - 权限变更后是否需要重新登录
  1455. ```
  1456. #### 权限测试脚本模板
  1457. ```javascript
  1458. // 权限验证测试脚本
  1459. async function testPermissions(token, permissions) {
  1460. const results = [];
  1461. for (const perm of permissions) {
  1462. try {
  1463. const response = await callAPIWithToken(token, perm.endpoint, perm.data, perm.method);
  1464. results.push({
  1465. permission: perm.name,
  1466. endpoint: perm.endpoint,
  1467. success: response.success,
  1468. status: response.status,
  1469. message: response.success ? '权限验证通过' : '权限验证失败'
  1470. });
  1471. } catch (error) {
  1472. results.push({
  1473. permission: perm.name,
  1474. endpoint: perm.endpoint,
  1475. success: false,
  1476. status: 'ERROR',
  1477. message: error.message
  1478. });
  1479. }
  1480. }
  1481. return results;
  1482. }
  1483. // 使用示例
  1484. const permissionTests = [
  1485. { name: 'pm:repairOrder:list', endpoint: '/pm/repairOrder/list', method: 'GET', data: null },
  1486. { name: 'pm:repairOrder:add', endpoint: '/pm/repairOrder', method: 'POST', data: {} },
  1487. { name: 'pm:repairOrder:statistics', endpoint: '/pm/repairOrder/statistics', method: 'GET', data: null }
  1488. ];
  1489. // 执行权限测试
  1490. testPermissions(token, permissionTests).then(results => {
  1491. console.log('权限测试结果:', results);
  1492. });
  1493. ```
  1494. ### 🚨 权限配置强制要求总结
  1495. #### 必须遵循的规范
  1496. 1. **⚠️ 每个新功能都必须配置权限**:菜单权限 + 按钮权限 + 接口权限
  1497. 2. **⚠️ 使用UPSERT逻辑**:权限配置脚本必须支持重复执行
  1498. 3. **⚠️ 权限标识规范**:严格按照[模块]:[功能]:[操作]格式命名
  1499. 4. **⚠️ Controller注解必须**:每个接口方法都要有@SaCheckPermission注解
  1500. 5. **⚠️ 前端权限控制**:功能按钮必须使用v-hasPermi指令控制
  1501. 6. **⚠️ 权限测试验证**:配置完成后必须进行完整的权限测试
  1502. 7. **⚠️ 文档同步更新**:权限配置必须在API文档中说明
  1503. #### 违规检查清单
  1504. - [ ] 新功能是否缺少权限配置?
  1505. - [ ] Controller方法是否缺少权限注解?
  1506. - [ ] 权限标识命名是否符合规范?
  1507. - [ ] 前端按钮是否有权限控制?
  1508. - [ ] 权限配置是否支持重复执行?
  1509. - [ ] 是否进行了权限功能测试?
  1510. - [ ] API文档是否更新了权限信息?
  1511. ## 5. 标准代码模板
  1512. ### Controller模板
  1513. ```java
  1514. @RestController
  1515. @RequestMapping("/system/user")
  1516. @Api(tags = "用户管理")
  1517. public class SysUserController extends BaseController {
  1518. @Autowired
  1519. private ISysUserService userService;
  1520. @SaCheckPermission("system:user:list")
  1521. @GetMapping("/list")
  1522. @Operation(summary = "查询用户列表")
  1523. public TableDataInfo<SysUserVo> list(SysUserBo user, PageQuery pageQuery) {
  1524. return userService.queryPageList(user, pageQuery);
  1525. }
  1526. }
  1527. ```
  1528. ### Service模板
  1529. ```java
  1530. @Service
  1531. public class SysUserServiceImpl implements ISysUserService {
  1532. @Autowired
  1533. private SysUserMapper userMapper;
  1534. @Override
  1535. public TableDataInfo<SysUserVo> queryPageList(SysUserBo bo, PageQuery pageQuery) {
  1536. LambdaQueryWrapper<SysUser> lqw = buildQueryWrapper(bo);
  1537. Page<SysUserVo> result = userMapper.selectVoPage(pageQuery.build(), lqw);
  1538. return TableDataInfo.build(result);
  1539. }
  1540. }
  1541. ```
  1542. ---
  1543. # 第四部分:移动端开发规范 (mobile/)
  1544. ## 1. 技术栈规范
  1545. ### 核心技术
  1546. - **框架**: uni-app
  1547. - **UI组件库**: uView UI
  1548. - **开发语言**: JavaScript/TypeScript
  1549. - **状态管理**: Vuex
  1550. - **HTTP客户端**: uni.request 封装
  1551. ## 2. 项目结构规范
  1552. ### 移动端目录结构
  1553. ```
  1554. mobile/
  1555. ├── src/
  1556. │ ├── api/ # API接口定义
  1557. │ ├── components/ # 通用组件
  1558. │ ├── pages/ # 页面文件
  1559. │ │ ├── index/ # 首页
  1560. │ │ ├── login/ # 登录页
  1561. │ │ ├── mine/ # 个人中心
  1562. │ │ └── workbench/ # 工作台
  1563. │ ├── static/ # 静态资源
  1564. │ ├── utils/ # 工具函数
  1565. │ ├── App.vue # 应用入口
  1566. │ ├── config.js # 配置文件
  1567. │ └── main.js # 主入口文件
  1568. ├── pages.json # 页面配置
  1569. ├── manifest.json # 应用配置
  1570. └── uni.scss # 全局样式
  1571. ```
  1572. ## 3. 开发规范
  1573. ### 页面开发规范
  1574. - **页面命名**: 使用小写字母和连字符 (如: user-list)
  1575. - **组件命名**: 使用PascalCase (如: UserCard)
  1576. - **API调用**: 统一使用封装的request工具
  1577. - **样式规范**: 使用uView UI组件和样式变量
  1578. ### 页面模板
  1579. ```vue
  1580. <template>
  1581. <view class="page-container">
  1582. <u-navbar title="页面标题" @leftClick="handleBack"></u-navbar>
  1583. <!-- 页面内容 -->
  1584. </view>
  1585. </template>
  1586. <script>
  1587. export default {
  1588. data() {
  1589. return {
  1590. // 页面数据
  1591. }
  1592. },
  1593. onLoad() {
  1594. // 页面加载逻辑
  1595. },
  1596. methods: {
  1597. handleBack() {
  1598. uni.navigateBack();
  1599. }
  1600. }
  1601. }
  1602. </script>
  1603. <style lang="scss" scoped>
  1604. .page-container {
  1605. // 页面样式
  1606. }
  1607. </style>
  1608. ```
  1609. ## 4. 与后端API对接规范
  1610. ### 请求封装
  1611. ```javascript
  1612. // utils/request.js
  1613. const request = (options) => {
  1614. return new Promise((resolve, reject) => {
  1615. uni.request({
  1616. url: getApp().globalData.baseUrl + options.url,
  1617. method: options.method || 'GET',
  1618. data: options.data || {},
  1619. header: {
  1620. 'Authorization': uni.getStorageSync('token'),
  1621. 'Content-Type': 'application/json'
  1622. },
  1623. success: (res) => {
  1624. if (res.data.code === 200) {
  1625. resolve(res.data);
  1626. } else {
  1627. reject(res.data);
  1628. }
  1629. },
  1630. fail: (err) => {
  1631. reject(err);
  1632. }
  1633. });
  1634. });
  1635. };
  1636. ```
  1637. ---
  1638. # 通用开发原则
  1639. ## 1. 代码质量保证
  1640. ### 编码规范
  1641. - 遵循各技术栈的官方编码规范
  1642. - 使用统一的代码格式化工具
  1643. - 添加适当的注释和文档
  1644. - 进行代码审查
  1645. ### 测试要求
  1646. - 单元测试覆盖核心业务逻辑
  1647. - 集成测试验证API接口
  1648. - UI测试确保界面交互正常
  1649. - 性能测试保证系统响应速度
  1650. ## 2. 安全规范
  1651. ### 数据安全
  1652. - 敏感数据脱敏处理
  1653. - API接口权限控制
  1654. - 输入参数严格校验
  1655. - SQL注入防护
  1656. ### 系统安全
  1657. - HTTPS协议传输
  1658. - JWT token认证
  1659. - 密码加密存储
  1660. - 定期安全检查
  1661. ## 3. 性能优化
  1662. ### 前端优化
  1663. - 代码分割和懒加载
  1664. - 图片压缩和CDN
  1665. - 缓存策略优化
  1666. - 首屏加载优化
  1667. ### 后端优化
  1668. - 数据库查询优化
  1669. - Redis缓存策略
  1670. - 异步处理耗时操作
  1671. - JVM参数调优
  1672. ## 4. 文档维护
  1673. ### 同步更新
  1674. - 代码变更必须同步更新文档
  1675. - API文档自动生成和维护
  1676. - 数据库变更记录追踪
  1677. - 部署文档及时更新
  1678. ### 版本管理
  1679. - 文档版本与代码版本保持一致
  1680. - 重要变更记录详细说明
  1681. - 保持向后兼容性考虑
  1682. - 定期文档审查和整理
  1683. ---
  1684. ## 🚨 重要提醒和强制要求
  1685. 1. **📝 文档同步更新**:每次代码调整都必须同步更新相关文档,这是强制性要求
  1686. 2. **🔴 API文档管理**:API接口变更必须立即更新 `docs/开发文档/API.md` 文档
  1687. 3. **📋 变更记录**:每次调整都必须在 `docs/变更管理/code-adjust-record.md` 中记录
  1688. 4. **🎯 业务上下文**:充分利用 `docs/业务模块/` 下的文档为AI提供完整业务上下文
  1689. 5. **📚 模板使用**:使用标准文档模板,确保格式一致性
  1690. 6. **🔍 质量控制**:确保文档内容与代码实现完全一致
  1691. 7. **⚡ 实时性**:文档更新不得延后,必须与代码变更同步进行
  1692. ## 参考资源
  1693. - **项目文档体系**:`docs/` 目录下的完整文档
  1694. - **业务模块文档**:`docs/业务模块/` 各模块的详细文档
  1695. - **开发文档**:`docs/开发文档/` 技术规范和API文档
  1696. - **变更记录**:`docs/变更管理/code-adjust-record.md`
  1697. - **标准模板**:各目录下的模板文件
  1698. **🎯 目标**:通过完善的文档管理体系,为Cursor AI提供准确的开发上下文,确保高质量的代码生成和文档同步更新!
  1699. ---
  1700. # 第五部分:API测试和登录方法
  1701. ## 1. 🔐 登录方法配置
  1702. ### 系统登录接口分析
  1703. **接口地址**: `POST http://localhost/dev-api/auth/login`
  1704. **当前状态**:
  1705. - ✅ **接口技术实现**: 登录接口正常工作,能够正确处理请求
  1706. - ✅ **接口地址确认**: 接口地址 http://localhost/dev-api/auth/login 可正常访问
  1707. - ✅ **权限配置问题**: 已解决,admin用户可以正常登录获取Token
  1708. - ✅ **加密登录问题**: 已解决,AES+RSA双重加密登录正常工作
  1709. - ✅ **Token验证**: Token有效期7天,可正常用于API调用
  1710. - ✅ **用户权限**: admin用户具有超级管理员权限 (*:*:*)
  1711. ### 🔧 可用的登录方法
  1712. #### 方法1:AES+RSA加密登录(推荐)
  1713. ```javascript
  1714. // 完整的AES+RSA双重加密登录方法
  1715. async function encryptedLogin() {
  1716. const axios = require('axios');
  1717. const CryptoJS = require('crypto-js');
  1718. const NodeRSA = require('node-rsa');
  1719. // 配置信息
  1720. const CONFIG = {
  1721. url: 'http://localhost/dev-api/auth/login',
  1722. clientId: 'e5cd7e4891bf95d1d19206ce24a7b32e',
  1723. tenantId: '000000',
  1724. referer: 'http://localhost/login?redirect=%252Findex',
  1725. rsaKey: 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ=='
  1726. };
  1727. // 生成32位随机AES密钥
  1728. function generateAESKey() {
  1729. const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  1730. let result = '';
  1731. for (let i = 0; i < 32; i++) {
  1732. result += chars.charAt(Math.floor(Math.random() * chars.length));
  1733. }
  1734. return result;
  1735. }
  1736. // AES加密
  1737. function aesEncrypt(data, key) {
  1738. const keyUtf8 = CryptoJS.enc.Utf8.parse(key);
  1739. return CryptoJS.AES.encrypt(data, keyUtf8, {
  1740. mode: CryptoJS.mode.ECB,
  1741. padding: CryptoJS.pad.Pkcs7
  1742. }).toString();
  1743. }
  1744. // RSA加密AES密钥
  1745. function rsaEncrypt(aesKey) {
  1746. const pemKey = `-----BEGIN PUBLIC KEY-----\n${CONFIG.rsaKey}\n-----END PUBLIC KEY-----`;
  1747. const rsaKey = new NodeRSA(pemKey);
  1748. rsaKey.setOptions({ encryptionScheme: 'pkcs1' });
  1749. const aesKeyBase64 = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(aesKey));
  1750. return rsaKey.encrypt(aesKeyBase64, 'base64');
  1751. }
  1752. // 生成AES密钥并加密登录数据
  1753. const aesKey = generateAESKey();
  1754. const loginData = {
  1755. tenantId: CONFIG.tenantId,
  1756. username: 'admin',
  1757. password: 'admin123',
  1758. clientId: CONFIG.clientId,
  1759. grantType: 'password'
  1760. };
  1761. const encryptedData = aesEncrypt(JSON.stringify(loginData), aesKey);
  1762. const encryptedKey = rsaEncrypt(aesKey);
  1763. // 设置请求头(按照系统要求的格式)
  1764. const headers = {
  1765. 'Content-Type': 'application/json;charset=utf-8',
  1766. 'clientid': CONFIG.clientId, // 必需:客户端ID
  1767. 'encrypt-key': encryptedKey, // 必需:RSA加密的AES密钥
  1768. 'referer': CONFIG.referer, // 必需:来源页面
  1769. 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
  1770. 'isToken': 'false',
  1771. 'isEncrypt': 'true',
  1772. 'repeatSubmit': 'false'
  1773. };
  1774. // 发送登录请求
  1775. const response = await axios.post(CONFIG.url, encryptedData, {
  1776. headers: headers,
  1777. timeout: 10000
  1778. });
  1779. // 返回Token
  1780. if (response.data.code === 200 && response.data.data?.access_token) {
  1781. return response.data.data.access_token;
  1782. } else {
  1783. throw new Error(response.data.msg || 'Login failed');
  1784. }
  1785. }
  1786. ```
  1787. #### 方法2:快速Token获取(简化版)
  1788. ```javascript
  1789. // 快速获取Token的简化版本
  1790. async function getToken(username = 'admin', password = 'admin123') {
  1791. const { getToken } = require('./test/quick-token-getter');
  1792. return await getToken(username, password);
  1793. }
  1794. ```
  1795. ### 🔧 快速测试工具
  1796. #### 使用test目录下的测试脚本
  1797. ```bash
  1798. # 在test目录下运行测试
  1799. cd test
  1800. npm install # 安装依赖(axios, crypto-js, node-rsa, colors)
  1801. # 完整功能版登录测试(推荐)
  1802. node custom-login-script.js
  1803. # 快速Token获取测试
  1804. node quick-token-getter.js
  1805. ```
  1806. #### 可用的登录脚本
  1807. - **`custom-login-script.js`** - 完整功能版,支持AES+RSA双重加密
  1808. - **`quick-token-getter.js`** - 快速获取版,代码简洁易懂
  1809. #### 依赖安装
  1810. ```json
  1811. {
  1812. "dependencies": {
  1813. "axios": "^1.7.2",
  1814. "crypto-js": "^4.2.0",
  1815. "node-rsa": "^1.1.1",
  1816. "colors": "^1.4.0"
  1817. }
  1818. }
  1819. ```
  1820. #### 🎯 成功获取的Token示例
  1821. ```
  1822. eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOiJzeXNfdXNlcjoxIiwicm5TdHIiOiJ5MlhvbHRnd1Y2YjUzRnRMVzF4SFR1anRSUERjeGdmYyIsImNsaWVudGlkIjoiZTVjZDdlNDg5MWJmOTVkMWQxOTIwNmNlMjRhN2IzMmUiLCJ0ZW5hbnRJZCI6IjAwMDAwMCIsInVzZXJJZCI6MSwidXNlck5hbWUiOiJhZG1pbiIsImRlcHRJZCI6MTAzLCJkZXB0TmFtZSI6IuaZuuiDveaOp-WItuWtpumZoiIsImRlcHRDYXRlZ29yeSI6IiIsIm5pY2tOYW1lIjoi55av54uC55qE54uu5a2QTGkifQ.WI6iY3AgwPz7ceI8WDsVy-GaTXZnU-JKUYUTjhQdoKM
  1823. ```
  1824. **Token解析信息**:
  1825. - **用户ID**: 1
  1826. - **用户名**: admin
  1827. - **昵称**: 疯狂狮子Li
  1828. - **部门**: 智胜技术开发团队
  1829. - **权限**: *:*:* (超级管理员)
  1830. - **有效期**: 7天
  1831. - **租户**: 000000
  1832. ## 2. ✅ 已解决的问题和解决方案
  1833. ### 已解决问题1:国际化语言头格式问题
  1834. - **原问题**: ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
  1835. - **原因**: 服务器端国际化解析器无法正确处理 `'Content-Language': 'zh-cn'` 格式
  1836. - **解决方案**:
  1837. - 使用 `'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8'` 格式
  1838. - 或使用标准的 `'Content-Language': 'zh-CN'` 格式
  1839. - **状态**: ✅ 已完全解决
  1840. ### 已解决问题2:加密登录技术问题
  1841. - **原问题**: AES+RSA双重加密登录存在技术错误
  1842. - **原因**: 加密密钥生成和请求头格式不正确
  1843. - **解决方案**:
  1844. - 使用正确的32位随机AES密钥生成
  1845. - 按照系统要求设置三个关键Header:clientid、encrypt-key、referer
  1846. - 使用正确的RSA-PKCS1加密方案
  1847. - **状态**: ✅ 已完全解决
  1848. ### 核心成功要素
  1849. 1. **必需的Header格式**:
  1850. ```javascript
  1851. {
  1852. 'clientid': 'e5cd7e4891bf95d1d19206ce24a7b32e',
  1853. 'encrypt-key': '[RSA加密的AES密钥]',
  1854. 'referer': 'http://localhost/login?redirect=%252Findex'
  1855. }
  1856. ```
  1857. 2. **正确的加密流程**:
  1858. - 生成32位随机AES密钥
  1859. - 使用AES-ECB模式加密登录数据
  1860. - 使用RSA-PKCS1加密AES密钥
  1861. - 设置正确的请求头格式
  1862. ## 3. 🔍 API测试最佳实践
  1863. ### 测试环境配置
  1864. ```javascript
  1865. const config = {
  1866. baseURL: 'http://localhost/dev-api',
  1867. timeout: 10000,
  1868. headers: {
  1869. 'Content-Type': 'application/json;charset=utf-8',
  1870. 'clientid': 'e5cd7e4891bf95d1d19206ce24a7b32e',
  1871. 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
  1872. 'referer': 'http://localhost/login?redirect=%252Findex'
  1873. }
  1874. };
  1875. ```
  1876. ### 通用API测试方法
  1877. ```javascript
  1878. // 通用API测试方法
  1879. async function testAPI(endpoint, data, options = {}) {
  1880. const axios = require('axios');
  1881. try {
  1882. const response = await axios({
  1883. method: options.method || 'POST',
  1884. url: `http://localhost/dev-api${endpoint}`,
  1885. data: data,
  1886. headers: {
  1887. 'Content-Type': 'application/json;charset=utf-8',
  1888. 'clientid': 'e5cd7e4891bf95d1d19206ce24a7b32e',
  1889. 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
  1890. 'referer': 'http://localhost/login?redirect=%252Findex',
  1891. 'Authorization': options.token ? `Bearer ${options.token}` : undefined,
  1892. ...options.headers
  1893. },
  1894. timeout: 10000
  1895. });
  1896. return {
  1897. success: true,
  1898. data: response.data,
  1899. status: response.status
  1900. };
  1901. } catch (error) {
  1902. return {
  1903. success: false,
  1904. error: error.response?.data || error.message,
  1905. status: error.response?.status
  1906. };
  1907. }
  1908. }
  1909. ```
  1910. ### 带Token的API调用
  1911. ```javascript
  1912. // 带Token的API调用示例
  1913. async function callAPIWithToken(token, endpoint, data, method = 'GET') {
  1914. return await testAPI(endpoint, data, {
  1915. method: method,
  1916. token: token,
  1917. headers: {
  1918. 'clientid': 'e5cd7e4891bf95d1d19206ce24a7b32e',
  1919. 'referer': 'http://localhost/login?redirect=%252Findex'
  1920. }
  1921. });
  1922. }
  1923. // 使用示例
  1924. async function getUserInfo(token) {
  1925. const result = await callAPIWithToken(token, '/system/user/getInfo', null, 'GET');
  1926. return result;
  1927. }
  1928. // 调用带参数的API
  1929. async function getUserList(token, params) {
  1930. const result = await callAPIWithToken(token, '/system/user/list', params, 'GET');
  1931. return result;
  1932. }
  1933. ```
  1934. ## 4. 📝 API测试记录模板
  1935. ### 测试结果记录格式
  1936. ```markdown
  1937. ## API测试记录 - YYYY-MM-DD
  1938. **测试环境**: http://localhost/dev-api
  1939. **测试时间**: YYYY-MM-DD HH:mm:ss
  1940. **测试人员**: [测试人员]
  1941. ### 登录测试
  1942. - **方法**: AES+RSA双重加密登录
  1943. - **结果**: ✅ 登录成功
  1944. - **Token**: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...
  1945. - **用户信息**: admin / 疯狂狮子Li / 超级管理员
  1946. - **权限**: *:*:* (完全权限)
  1947. - **有效期**: 7天
  1948. ### 业务API测试
  1949. - **接口**: [接口地址]
  1950. - **方法**: [HTTP方法]
  1951. - **权限**: [需要的权限]
  1952. - **结果**: [测试结果]
  1953. - **响应时间**: [响应时间ms]
  1954. - **状态码**: [HTTP状态码]
  1955. ### 成功要素记录
  1956. 1. **Header配置**: 正确设置clientid、encrypt-key、referer
  1957. 2. **加密机制**: AES+RSA双重加密正常工作
  1958. 3. **语言头格式**: 使用Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
  1959. ### 验证结果
  1960. - ✅ 登录接口正常工作
  1961. - ✅ Token有效可用于API调用
  1962. - ✅ 用户权限验证通过
  1963. - ✅ 加密解密机制正常
  1964. ```
  1965. ## 5. 🎯 开发和测试建议
  1966. ### ✅ 已完成的核心功能
  1967. 1. **登录认证**: AES+RSA双重加密登录机制完全正常
  1968. 2. **Token获取**: 可稳定获取7天有效期的JWT Token
  1969. 3. **权限验证**: admin用户具有完全权限 (*:*:*)
  1970. 4. **API调用**: Token可正常用于所有业务API调用
  1971. ### 🔧 开发最佳实践
  1972. 1. **使用标准脚本**: 优先使用 `test/custom-login-script.js` 获取Token
  1973. 2. **Header规范**: 始终包含 clientid、encrypt-key、referer 三个关键Header
  1974. 3. **语言头格式**: 使用 `Accept-Language: zh-CN,zh;q=0.9,en;q=0.8`
  1975. 4. **错误处理**: 实现Token过期自动重新获取机制
  1976. ### 🚀 后续优化建议
  1977. 1. **Token管理**: 实现Token自动刷新和缓存机制
  1978. 2. **环境配置**: 支持开发、测试、生产环境的灵活切换
  1979. 3. **自动化测试**: 建立基于Token的自动化API测试流程
  1980. 4. **性能监控**: 添加API响应时间和成功率监控
  1981. ### 📚 相关文档和工具
  1982. - **成功的登录脚本**: `test/custom-login-script.js` 和 `test/quick-token-getter.js`
  1983. - **使用指南**: `test/登录脚本使用说明.md`
  1984. - **API文档**: `docs/开发文档/API.md`
  1985. - **变更记录**: `docs/变更管理/code-adjust-record.md`
  1986. ### 🎯 使用建议
  1987. 1. **开发阶段**: 使用 `quick-token-getter.js` 快速获取Token进行测试
  1988. 2. **集成测试**: 使用 `custom-login-script.js` 进行完整的登录流程测试
  1989. 3. **生产环境**: 将加密登录逻辑集成到实际应用中,实现自动Token管理
  1990. ---
  1991. **🎉 成功状态**: 登录获取Token功能已完全实现并正常工作,可以稳定用于API开发和测试。