pdd-skills 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) hide show
  1. package/README.md +1478 -0
  2. package/bin/pdd.js +354 -0
  3. package/config/bpmn-rules.yaml +166 -0
  4. package/config/checkstyle.xml +105 -0
  5. package/config/eslint.config.js +48 -0
  6. package/config/pmd.xml +91 -0
  7. package/config/prd-rules.yaml +113 -0
  8. package/config/ruff.toml +45 -0
  9. package/config/sqlfluff.cfg +82 -0
  10. package/hooks/hook-executor.js +332 -0
  11. package/index.js +43 -0
  12. package/lib/api-routes.js +750 -0
  13. package/lib/api-server.js +408 -0
  14. package/lib/cache/cache-config.js +209 -0
  15. package/lib/cache/system-cache.js +852 -0
  16. package/lib/config-manager.js +373 -0
  17. package/lib/generate.js +528 -0
  18. package/lib/grpc/grpc-routes.js +1134 -0
  19. package/lib/grpc/grpc-server.js +912 -0
  20. package/lib/grpc/proto-definitions.js +1033 -0
  21. package/lib/init.js +172 -0
  22. package/lib/iteration/auto-fixer.js +1025 -0
  23. package/lib/iteration/auto-reviewer.js +923 -0
  24. package/lib/iteration/controller.js +577 -0
  25. package/lib/list.js +130 -0
  26. package/lib/mcp-server.js +548 -0
  27. package/lib/openclaw/api-integration.js +535 -0
  28. package/lib/openclaw/cli-integration.js +567 -0
  29. package/lib/openclaw/data-sync.js +845 -0
  30. package/lib/openclaw/openclaw-adapter.js +783 -0
  31. package/lib/plugin/example-plugins/code-stats/index.js +332 -0
  32. package/lib/plugin/example-plugins/code-stats/plugin.json +1 -0
  33. package/lib/plugin/example-plugins/custom-linter/index.js +472 -0
  34. package/lib/plugin/example-plugins/custom-linter/plugin.json +1 -0
  35. package/lib/plugin/example-plugins/hello-world/index.js +86 -0
  36. package/lib/plugin/example-plugins/hello-world/plugin.json +1 -0
  37. package/lib/plugin/plugin-manager.js +655 -0
  38. package/lib/plugin/plugin-sdk.js +565 -0
  39. package/lib/plugin/sandbox.js +627 -0
  40. package/lib/quality/rules/maintainability.js +418 -0
  41. package/lib/quality/rules/performance.js +498 -0
  42. package/lib/quality/rules/readability.js +441 -0
  43. package/lib/quality/rules/robustness.js +504 -0
  44. package/lib/quality/rules/security.js +444 -0
  45. package/lib/quality/scorer.js +576 -0
  46. package/lib/report.js +669 -0
  47. package/lib/sdk-base.js +301 -0
  48. package/lib/sdk-js.js +446 -0
  49. package/lib/sdk-python/README.md +546 -0
  50. package/lib/sdk-python/examples/basic_usage.py +450 -0
  51. package/lib/sdk-python/pdd_sdk/__init__.py +180 -0
  52. package/lib/sdk-python/pdd_sdk/client.py +1170 -0
  53. package/lib/sdk-python/pdd_sdk/events.py +423 -0
  54. package/lib/sdk-python/pdd_sdk/exceptions.py +158 -0
  55. package/lib/sdk-python/pdd_sdk/models.py +518 -0
  56. package/lib/sdk-python/pdd_sdk/utils.py +759 -0
  57. package/lib/token/budget-alert.js +367 -0
  58. package/lib/token/budget-manager.js +485 -0
  59. package/lib/update.js +54 -0
  60. package/lib/utils/logger.js +88 -0
  61. package/lib/verify.js +741 -0
  62. package/lib/version.js +52 -0
  63. package/lib/vm/README.md +102 -0
  64. package/lib/vm/dashboard/api-routes.js +669 -0
  65. package/lib/vm/dashboard/server.js +391 -0
  66. package/lib/vm/dashboard/sse.js +358 -0
  67. package/lib/vm/dashboard/static/css/dashboard.css +1378 -0
  68. package/lib/vm/dashboard/static/index.html +118 -0
  69. package/lib/vm/dashboard/static/js/app.js +949 -0
  70. package/lib/vm/dashboard/static/js/charts.js +913 -0
  71. package/lib/vm/dashboard/static/js/kanban-view.js +1053 -0
  72. package/lib/vm/dashboard/static/js/pipeline-view.js +463 -0
  73. package/lib/vm/dashboard/static/js/quality-view.js +598 -0
  74. package/lib/vm/dashboard/static/js/system-view.js +1021 -0
  75. package/lib/vm/data-provider.js +1191 -0
  76. package/lib/vm/event-bus.js +402 -0
  77. package/lib/vm/hooks/extract-hook.js +307 -0
  78. package/lib/vm/hooks/generate-hook.js +374 -0
  79. package/lib/vm/hooks/hook-interface.js +458 -0
  80. package/lib/vm/hooks/report-hook.js +331 -0
  81. package/lib/vm/hooks/verify-hook.js +454 -0
  82. package/lib/vm/models.js +1003 -0
  83. package/lib/vm/reconciler.js +855 -0
  84. package/lib/vm/scanner.js +988 -0
  85. package/lib/vm/state-schema.js +955 -0
  86. package/lib/vm/state-store.js +733 -0
  87. package/lib/vm/tui/components/card.js +339 -0
  88. package/lib/vm/tui/components/progress-bar.js +368 -0
  89. package/lib/vm/tui/components/sparkline.js +327 -0
  90. package/lib/vm/tui/components/status-light.js +294 -0
  91. package/lib/vm/tui/components/table.js +370 -0
  92. package/lib/vm/tui/input.js +335 -0
  93. package/lib/vm/tui/renderer.js +548 -0
  94. package/lib/vm/tui/screens/kanban-screen.js +397 -0
  95. package/lib/vm/tui/screens/overview-screen.js +357 -0
  96. package/lib/vm/tui/screens/quality-screen.js +336 -0
  97. package/lib/vm/tui/screens/system-screen.js +379 -0
  98. package/lib/vm/tui/tui.js +805 -0
  99. package/package.json +1 -0
  100. package/scripts/cso-analyzer.js +198 -0
  101. package/scripts/eval-runner.js +359 -0
  102. package/scripts/i18n-checker.js +109 -0
  103. package/scripts/linter/activiti-linter.js +272 -0
  104. package/scripts/linter/prd-linter.js +162 -0
  105. package/scripts/linter/report-generator.js +207 -0
  106. package/scripts/linter/run-linters.js +285 -0
  107. package/scripts/linter/sql-linter.js +166 -0
  108. package/scripts/token-analyzer.js +162 -0
  109. package/scripts/vm-test.js +180 -0
  110. package/skills/core/official-doc-writer/LICENSE +21 -0
  111. package/skills/core/official-doc-writer/README.md +232 -0
  112. package/skills/core/official-doc-writer/SKILL.md +475 -0
  113. package/skills/core/official-doc-writer/_meta.json +1 -0
  114. package/skills/core/official-doc-writer/document_generator.py +580 -0
  115. package/skills/core/official-doc-writer/evals/default-evals.json +1 -0
  116. package/skills/core/official-doc-writer/examples.md +150 -0
  117. package/skills/core/official-doc-writer/fonts/FONTS_LIST.md +45 -0
  118. package/skills/core/official-doc-writer/fonts/README.md +141 -0
  119. package/skills/core/official-doc-writer/fonts/SIMFANG.TTF +0 -0
  120. package/skills/core/official-doc-writer/fonts/SIMHEI.TTF +0 -0
  121. package/skills/core/official-doc-writer/fonts/SIMKAI.TTF +0 -0
  122. package/skills/core/official-doc-writer/fonts/SIMSUN.TTC +0 -0
  123. package/skills/core/official-doc-writer/fonts//346/226/271/346/255/243/345/260/217/346/240/207/345/256/213GBK.TTF +0 -0
  124. package/skills/core/official-doc-writer/references/GBT_9704-2012_/345/205/232/346/224/277/346/234/272/345/205/263/345/205/254/346/226/207/346/240/274/345/274/217.md +422 -0
  125. package/skills/core/official-doc-writer/scripts/__pycache__/generate_official_doc.cpython-313.pyc +0 -0
  126. package/skills/core/official-doc-writer/scripts/dialog_manager.py +564 -0
  127. package/skills/core/official-doc-writer/scripts/generate_official_doc.py +252 -0
  128. package/skills/core/official-doc-writer/scripts/install_fonts.py +390 -0
  129. package/skills/core/official-doc-writer/scripts/smart_prompts.py +363 -0
  130. package/skills/core/pdd-ba/SKILL.md +305 -0
  131. package/skills/core/pdd-ba/_meta.json +1 -0
  132. package/skills/core/pdd-ba/evals/default-evals.json +1 -0
  133. package/skills/core/pdd-code-reviewer/SKILL.md +378 -0
  134. package/skills/core/pdd-code-reviewer/_meta.json +1 -0
  135. package/skills/core/pdd-code-reviewer/evals/default-evals.json +1 -0
  136. package/skills/core/pdd-doc-change/SKILL.md +350 -0
  137. package/skills/core/pdd-doc-change/_meta.json +1 -0
  138. package/skills/core/pdd-doc-change/evals/default-evals.json +1 -0
  139. package/skills/core/pdd-doc-gardener/SKILL.md +248 -0
  140. package/skills/core/pdd-doc-gardener/_meta.json +1 -0
  141. package/skills/core/pdd-doc-gardener/evals/default-evals.json +1 -0
  142. package/skills/core/pdd-entropy-reduction/SKILL.md +360 -0
  143. package/skills/core/pdd-entropy-reduction/_meta.json +1 -0
  144. package/skills/core/pdd-entropy-reduction/evals/default-evals.json +1 -0
  145. package/skills/core/pdd-entropy-reduction/references/entropy-report-template.md +287 -0
  146. package/skills/core/pdd-entropy-reduction/references/golden-principles.md +573 -0
  147. package/skills/core/pdd-entropy-reduction/scripts/entropy_scan.py +712 -0
  148. package/skills/core/pdd-extract-features/SKILL.md +320 -0
  149. package/skills/core/pdd-extract-features/_meta.json +1 -0
  150. package/skills/core/pdd-extract-features/evals/default-evals.json +1 -0
  151. package/skills/core/pdd-generate-spec/SKILL.md +418 -0
  152. package/skills/core/pdd-generate-spec/_meta.json +1 -0
  153. package/skills/core/pdd-generate-spec/evals/default-evals.json +1 -0
  154. package/skills/core/pdd-implement-feature/SKILL.md +332 -0
  155. package/skills/core/pdd-implement-feature/_meta.json +1 -0
  156. package/skills/core/pdd-implement-feature/evals/default-evals.json +1 -0
  157. package/skills/core/pdd-main/SKILL.md +540 -0
  158. package/skills/core/pdd-main/_meta.json +1 -0
  159. package/skills/core/pdd-main/evals/default-evals.json +1 -0
  160. package/skills/core/pdd-main/evals/evals.json +215 -0
  161. package/skills/core/pdd-verify-feature/SKILL.md +474 -0
  162. package/skills/core/pdd-verify-feature/_meta.json +1 -0
  163. package/skills/core/pdd-verify-feature/evals/default-evals.json +1 -0
  164. package/skills/core/pdd-vm/evals/default-evals.json +1 -0
  165. package/skills/core/traffic-accident-assessor/LICENSE +29 -0
  166. package/skills/core/traffic-accident-assessor/SKILL.md +439 -0
  167. package/skills/core/traffic-accident-assessor/evals/evals.json +1 -0
  168. package/skills/core/traffic-accident-assessor/references/accident-types.md +369 -0
  169. package/skills/core/traffic-accident-assessor/references/liability-rules.md +287 -0
  170. package/skills/core/traffic-accident-assessor/references/traffic-laws.md +226 -0
  171. package/skills/core/traffic-accident-assessor/references//351/253/230/345/260/224/345/244/253/350/257/264/346/230/216/344/271/246.pdf +32576 -106
  172. package/skills/core/traffic-accident-assessor/scripts/generate_official_statement.py +588 -0
  173. package/skills/core/traffic-accident-assessor/scripts/generate_report.py +495 -0
  174. package/skills/core/traffic-accident-assessor/scripts/generate_statement.py +528 -0
  175. package/skills/core/traffic-accident-assessor.zip +0 -0
  176. package/skills/entropy/expert-arch-enforcer/SKILL.md +292 -0
  177. package/skills/entropy/expert-arch-enforcer/_meta.json +1 -0
  178. package/skills/entropy/expert-arch-enforcer/evals/default-evals.json +1 -0
  179. package/skills/entropy/expert-auto-refactor/SKILL.md +327 -0
  180. package/skills/entropy/expert-auto-refactor/_meta.json +1 -0
  181. package/skills/entropy/expert-auto-refactor/evals/default-evals.json +1 -0
  182. package/skills/entropy/expert-code-quality/SKILL.md +468 -0
  183. package/skills/entropy/expert-code-quality/_meta.json +1 -0
  184. package/skills/entropy/expert-code-quality/evals/default-evals.json +1 -0
  185. package/skills/entropy/expert-code-quality/evals/evals.json +109 -0
  186. package/skills/entropy/expert-code-quality/references/code-smells.md +605 -0
  187. package/skills/entropy/expert-code-quality/references/design-patterns.md +1111 -0
  188. package/skills/entropy/expert-code-quality/references/refactoring-catalog.md +1281 -0
  189. package/skills/entropy/expert-code-quality/references/solid-principles.md +524 -0
  190. package/skills/entropy/expert-entropy-auditor/SKILL.md +276 -0
  191. package/skills/entropy/expert-entropy-auditor/_meta.json +1 -0
  192. package/skills/entropy/expert-entropy-auditor/evals/default-evals.json +1 -0
  193. package/skills/expert/expert-activiti/SKILL.md +497 -0
  194. package/skills/expert/expert-activiti/_meta.json +1 -0
  195. package/skills/expert/expert-mysql/SKILL.md +832 -0
  196. package/skills/expert/expert-mysql/_meta.json +1 -0
  197. package/skills/expert/expert-performance/SKILL.md +379 -0
  198. package/skills/expert/expert-performance/_meta.json +1 -0
  199. package/skills/expert/expert-performance/evals/default-evals.json +1 -0
  200. package/skills/expert/expert-ruoyi/SKILL.md +472 -0
  201. package/skills/expert/expert-ruoyi/_meta.json +1 -0
  202. package/skills/expert/expert-security/SKILL.md +1341 -0
  203. package/skills/expert/expert-security/_meta.json +1 -0
  204. package/skills/expert/expert-security/evals/default-evals.json +1 -0
  205. package/skills/expert/software-architect/SKILL.md +350 -0
  206. package/skills/expert/software-architect/_meta.json +1 -0
  207. package/skills/expert/software-engineer/SKILL.md +437 -0
  208. package/skills/expert/software-engineer/_meta.json +1 -0
  209. package/skills/expert/software-engineer/architecture.md +130 -0
  210. package/skills/expert/software-engineer/patterns.md +151 -0
  211. package/skills/expert/software-engineer/testing.md +135 -0
  212. package/skills/expert/system-architect/SKILL.md +628 -0
  213. package/skills/expert/system-architect/_meta.json +1 -0
  214. package/skills/expert/system-architect/assets/templates/ARCHITECTURE.md +25 -0
  215. package/skills/expert/system-architect/assets/templates/README.md +44 -0
  216. package/skills/expert/system-architect/references/js-ts-standards.md +18 -0
  217. package/skills/expert/system-architect/references/python-standards.md +19 -0
  218. package/skills/expert/system-architect/references/scaffolding.md +61 -0
  219. package/skills/expert/system-architect/references/security-checklist.md +21 -0
  220. package/skills/openspec/openspec-apply-change/SKILL.md +156 -0
  221. package/skills/openspec/openspec-apply-change/_meta.json +1 -0
  222. package/skills/openspec/openspec-archive-change/SKILL.md +114 -0
  223. package/skills/openspec/openspec-archive-change/_meta.json +1 -0
  224. package/skills/openspec/openspec-bulk-archive-change/SKILL.md +246 -0
  225. package/skills/openspec/openspec-bulk-archive-change/_meta.json +1 -0
  226. package/skills/openspec/openspec-continue-change/SKILL.md +118 -0
  227. package/skills/openspec/openspec-continue-change/_meta.json +1 -0
  228. package/skills/openspec/openspec-explore/SKILL.md +288 -0
  229. package/skills/openspec/openspec-explore/_meta.json +1 -0
  230. package/skills/openspec/openspec-ff-change/SKILL.md +101 -0
  231. package/skills/openspec/openspec-ff-change/_meta.json +1 -0
  232. package/skills/openspec/openspec-new-change/SKILL.md +74 -0
  233. package/skills/openspec/openspec-new-change/_meta.json +1 -0
  234. package/skills/openspec/openspec-onboard/SKILL.md +554 -0
  235. package/skills/openspec/openspec-onboard/_meta.json +1 -0
  236. package/skills/openspec/openspec-sync-specs/SKILL.md +138 -0
  237. package/skills/openspec/openspec-sync-specs/_meta.json +1 -0
  238. package/skills/openspec/openspec-verify-change/SKILL.md +168 -0
  239. package/skills/openspec/openspec-verify-change/_meta.json +1 -0
  240. package/skills/pr/pdd-multi-review/SKILL.md +534 -0
  241. package/skills/pr/pdd-multi-review/_meta.json +1 -0
  242. package/skills/pr/pdd-pr-batch/SKILL.md +303 -0
  243. package/skills/pr/pdd-pr-batch/_meta.json +1 -0
  244. package/skills/pr/pdd-pr-create/SKILL.md +344 -0
  245. package/skills/pr/pdd-pr-create/_meta.json +1 -0
  246. package/skills/pr/pdd-pr-merge/SKILL.md +286 -0
  247. package/skills/pr/pdd-pr-merge/_meta.json +1 -0
  248. package/skills/pr/pdd-pr-review/SKILL.md +217 -0
  249. package/skills/pr/pdd-pr-review/_meta.json +1 -0
  250. package/skills/pr/pdd-task-manager/SKILL.md +636 -0
  251. package/skills/pr/pdd-task-manager/_meta.json +1 -0
  252. package/skills/pr/pdd-template-engine/SKILL.md +306 -0
  253. package/skills/pr/pdd-template-engine/_meta.json +1 -0
  254. package/templates/behavior-shaping/iron-law-template.md +87 -0
  255. package/templates/behavior-shaping/rationalization-template.md +62 -0
  256. package/templates/behavior-shaping/red-flags-template.md +70 -0
  257. package/templates/bilingual-template.md +139 -0
  258. package/templates/config/default.yaml +47 -0
  259. package/templates/project/default/README.md +31 -0
  260. package/templates/project/frontend/README.md +46 -0
  261. package/templates/project/java/README.md +48 -0
@@ -0,0 +1,472 @@
1
+ ---
2
+ name: expert-ruoyi
3
+ description: 若依(RuoYi)框架开发专家,精通项目搭建、代码生成和架构优化。当用户涉及若依框架开发、权限配置或菜单路由配置时自动触发。支持中文触发:若依框架、RuoYi、SpringBoot后台、权限配置。
4
+ license: MIT
5
+ compatibility: 若依框架项目
6
+ metadata:
7
+ author: "neuqik@hotmail.com"
8
+ version: "3.0"
9
+ triggers:
10
+ - "/ruoyi" | "/若依"
11
+ - "若依框架" | "RuoYi" | "权限配置" | "菜单路由"
12
+ - "@PreAuthorize" | "@DataScope" | "sys_menu"
13
+ - "代码生成器" | "代码生成" | "权限校验"
14
+ ---
15
+
16
+ # 若依框架开发专家
17
+
18
+ ## 1. 技能概述
19
+
20
+ ### 1.1 核心能力
21
+
22
+ ```yaml
23
+ 核心能力:
24
+ - 项目搭建: SpringBoot + MyBatis + Shiro/Security
25
+ - 代码生成: CRUD代码自动生成
26
+ - 权限管理: 菜单权限、按钮权限、数据权限
27
+ - 动态路由: 基于sys_menu表的动态路由
28
+ - 最佳实践: 若依框架开发规范
29
+
30
+ 适用场景:
31
+ - 新功能开发遇到权限问题
32
+ - 菜单配置后页面404
33
+ - 代码生成器使用
34
+ - 权限注解不生效
35
+ - 数据范围过滤异常
36
+ ```
37
+
38
+ ### 1.2 与其他技能协作
39
+
40
+ | 协作技能 | 协作方式 | 传入数据 | 期望输出 |
41
+ |---------|---------|---------|---------|
42
+ | **pdd-implement-feature** | Consultation | 若依技术问题 | 解决方案 |
43
+ | **pdd-code-reviewer** | Reference | 发现若依问题 | 框架最佳实践 |
44
+ | **software-engineer** | Delegation | 代码实现任务 | 符合规范的代码 |
45
+
46
+ ## 2. 快速诊断模式
47
+
48
+ ### 2.1 问题分类索引
49
+
50
+ ```yaml
51
+ 问题类型:
52
+ 路由问题:
53
+ - 页面404
54
+ - 菜单不显示
55
+ - 路由404
56
+
57
+ 权限问题:
58
+ - 权限注解不生效
59
+ - 按钮不显示
60
+ - 数据范围错误
61
+
62
+ 代码生成问题:
63
+ - 生成代码报错
64
+ - 生成后需要调整
65
+
66
+ 配置问题:
67
+ - 数据库配置
68
+ - Redis缓存
69
+ - 会话管理
70
+ ```
71
+
72
+ ### 2.2 路由问题诊断
73
+
74
+ ```
75
+ 问题: 点击菜单后页面404
76
+
77
+ 诊断流程:
78
+ 1. 检查 sys_menu 表配置
79
+ SELECT * FROM sys_menu WHERE menu_name = 'XXX';
80
+
81
+ 2. 检查 component 路径
82
+ - 路径相对于 src/views
83
+ - 文件必须存在
84
+
85
+ 3. 检查 visible 字段
86
+ - '0' = 显示菜单
87
+ - '1' = 隐藏菜单
88
+
89
+ 4. 检查父菜单是否存在
90
+ SELECT * FROM sys_menu WHERE menu_id = parent_id;
91
+
92
+ 5. 检查角色权限分配
93
+ SELECT * FROM sys_role_menu WHERE menu_id = menu_id;
94
+ ```
95
+
96
+ ### 2.3 权限问题诊断
97
+
98
+ ```
99
+ 问题: @PreAuthorize 注解不生效
100
+
101
+ 诊断流程:
102
+ 1. 检查注解是否正确
103
+ @PreAuthorize("@ss.hasPermi('xxx:xxx:xxx')")
104
+
105
+ 2. 检查 sys_menu 表中权限标识符
106
+ - perms 字段必须与注解中一致
107
+
108
+ 3. 检查角色菜单分配
109
+ SELECT * FROM sys_role_menu WHERE menu_id IN
110
+ (SELECT menu_id FROM sys_menu WHERE perms = 'xxx:xxx:xxx');
111
+
112
+ 4. 检查用户角色
113
+ SELECT * FROM sys_user_role WHERE user_id = user_id;
114
+
115
+ 5. 清除Redis缓存
116
+ FLUSHDB
117
+ ```
118
+
119
+ ## 3. 核心配置规范
120
+
121
+ ### 3.1 菜单配置规范
122
+
123
+ ```sql
124
+ -- 目录类型 (M)
125
+ INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, menu_type, visible, perms, icon)
126
+ VALUES ('资产管理', 0, 1, 'asset', NULL, 'M', '0', NULL, 'asset');
127
+
128
+ -- 菜单类型 (C) - 列表页
129
+ INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, menu_type, visible, perms, icon)
130
+ VALUES ('资产列表', parent_id, 1, 'list', 'asset/index', 'C', '0', 'asset:list:list', 'list');
131
+
132
+ -- 菜单类型 (C) - 隐藏页面 (新增/编辑/详情)
133
+ INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, menu_type, visible, perms)
134
+ VALUES ('资产新增', parent_id, 10, 'add', 'asset/form', 'C', '1', 'asset:list:add');
135
+
136
+ -- 按钮类型 (F) - 权限控制
137
+ INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, menu_type, visible, perms)
138
+ VALUES ('资产新增按钮', menu_id, 1, '', '', 'F', '0', 'asset:list:add');
139
+ ```
140
+
141
+ ### 3.2 权限注解规范
142
+
143
+ ```java
144
+ // Controller 层
145
+ @RestController
146
+ @RequestMapping("/asset/list")
147
+ public class AssetListController {
148
+
149
+ // 列表查询 - 需要 list 权限
150
+ @PreAuthorize("@ss.hasPermi('asset:list:list')")
151
+ @GetMapping
152
+ public AjaxResult list() { }
153
+
154
+ // 新增 - 需要 add 权限
155
+ @PreAuthorize("@ss.hasPermi('asset:list:add')")
156
+ @PostMapping
157
+ public AjaxResult add() { }
158
+
159
+ // 修改 - 需要 edit 权限
160
+ @PreAuthorize("@ss.hasPermi('asset:list:edit')")
161
+ @PutMapping
162
+ public AjaxResult edit() { }
163
+
164
+ // 删除 - 需要 remove 权限
165
+ @PreAuthorize("@ss.hasPermi('asset:list:remove')")
166
+ @DeleteMapping
167
+ public AjaxResult remove() { }
168
+
169
+ // 导出 - 需要 export 权限
170
+ @PreAuthorize("@ss.hasPermi('asset:list:export')")
171
+ @GetMapping("/export")
172
+ public void export() { }
173
+ }
174
+ ```
175
+
176
+ ### 3.3 数据权限规范
177
+
178
+ ```java
179
+ // Service 层
180
+ public interface IAssetService {
181
+
182
+ // 添加 @DataScope 注解
183
+ @DataScope(deptAlias = "d", userAlias = "u")
184
+ List<Asset> selectAssetList(Asset asset);
185
+ }
186
+
187
+ // Mapper XML
188
+ <select id="selectAssetList" resultMap="AssetResult">
189
+ SELECT a.*, d.dept_name
190
+ FROM asset a
191
+ LEFT JOIN sys_dept d ON a.dept_id = d.dept_id
192
+ LEFT JOIN sys_user u ON a.create_by = u.user_name
193
+ WHERE a.del_flag = '0'
194
+ ${params.dataScope}
195
+ </select>
196
+ ```
197
+
198
+ ## 4. 代码生成器使用
199
+
200
+ ### 4.1 生成后必须调整项
201
+
202
+ | 调整项 | 原因 | 优先级 |
203
+ |--------|------|--------|
204
+ | 添加 @Validated 注解 | 参数校验 | P0 |
205
+ | 添加 @DataScope 注解 | 数据权限 | P0 |
206
+ | 添加 @Xss 注解 | XSS防护 | P0 |
207
+ | 配置 sys_menu 表 | 菜单路由 | P0 |
208
+ | 分配角色菜单权限 | 权限生效 | P0 |
209
+ | 清除Redis缓存 | 刷新权限缓存 | P0 |
210
+
211
+ ### 4.2 代码调整示例
212
+
213
+ ```java
214
+ // 调整前 (生成器默认)
215
+ @PostMapping
216
+ public AjaxResult add(Asset asset) {
217
+ return AjaxResult.success(assetService.insertAsset(asset));
218
+ }
219
+
220
+ // 调整后 (添加参数校验)
221
+ @PreAuthorize("@ss.hasPermi('asset:list:add')")
222
+ @Log(title = "资产管理", businessType = BusinessType.INSERT)
223
+ @PostMapping
224
+ public AjaxResult add(@Validated @RequestBody Asset asset) {
225
+ return AjaxResult.success(assetService.insertAsset(asset));
226
+ }
227
+
228
+ // 实体类添加 XSS 防护
229
+ @Excel(name = "资产名称")
230
+ @Xss
231
+ private String assetName;
232
+
233
+ // 列表查询添加数据权限
234
+ @DataScope(deptAlias = "d", userAlias = "u")
235
+ List<Asset> selectAssetList(Asset asset);
236
+ ```
237
+
238
+ ## 5. 常见问题解决方案
239
+
240
+ ### 5.1 页面404问题
241
+
242
+ **问题**: 点击菜单后页面404
243
+
244
+ **排查步骤**:
245
+ ```sql
246
+ -- Step 1: 检查菜单是否存在
247
+ SELECT * FROM sys_menu WHERE menu_name LIKE '%XXX%';
248
+
249
+ -- Step 2: 检查 component 路径是否正确
250
+ -- 路径格式: module/path (相对于 src/views)
251
+ -- 例如: equity-transfer/apply/index
252
+
253
+ -- Step 3: 检查文件是否存在
254
+ -- src/views/equity-transfer/apply/index.vue
255
+
256
+ -- Step 4: 检查父菜单
257
+ SELECT * FROM sys_menu WHERE menu_id = parent_id;
258
+
259
+ -- Step 5: 检查角色权限
260
+ SELECT * FROM sys_role_menu WHERE menu_id = menu_id;
261
+ ```
262
+
263
+ **解决方案**:
264
+ 1. 确认 sys_menu 表中 component 路径正确
265
+ 2. 确认 Vue 文件存在于正确位置
266
+ 3. 确认菜单已分配给用户角色
267
+ 4. 清除Redis缓存
268
+ 5. 重新登录
269
+
270
+ ### 5.2 权限注解不生效
271
+
272
+ **问题**: @PreAuthorize 注解不生效,所有用户都能访问
273
+
274
+ **排查步骤**:
275
+ ```sql
276
+ -- Step 1: 检查权限标识符是否匹配
277
+ SELECT perms FROM sys_menu WHERE menu_name = 'XXX';
278
+
279
+ -- Step 2: 检查角色菜单分配
280
+ SELECT r.role_name, m.menu_name
281
+ FROM sys_role_menu rm
282
+ JOIN sys_menu m ON rm.menu_id = m.menu_id
283
+ WHERE m.perms = 'xxx:xxx:xxx';
284
+
285
+ -- Step 3: 检查用户角色
286
+ SELECT u.user_name, r.role_name
287
+ FROM sys_user_role ur
288
+ JOIN sys_role r ON ur.role_id = r.role_id
289
+ WHERE ur.user_id = user_id;
290
+ ```
291
+
292
+ **解决方案**:
293
+ 1. 确认注解中的权限标识符与 sys_menu.perms 一致
294
+ 2. 确认角色已分配对应菜单权限
295
+ 3. 确认用户已分配对应角色
296
+ 4. 清除Redis缓存
297
+ 5. 重新登录获取最新权限
298
+
299
+ ### 5.3 数据范围过滤不生效
300
+
301
+ **问题**: 用户能看到不属于自己部门的数据
302
+
303
+ **排查步骤**:
304
+ ```sql
305
+ -- Step 1: 检查用户所属部门
306
+ SELECT u.user_name, d.dept_name, d.dept_id
307
+ FROM sys_user u
308
+ JOIN sys_dept d ON u.dept_id = d.dept_id
309
+ WHERE u.user_id = user_id;
310
+
311
+ -- Step 2: 检查数据权限配置
312
+ -- 查看 Mapper XML 是否正确配置了 ${params.dataScope}
313
+
314
+ -- Step 3: 检查 @DataScope 注解
315
+ -- 确认 deptAlias 和 userAlias 与 SQL 别名一致
316
+ ```
317
+
318
+ **解决方案**:
319
+ 1. 确认 @DataScope 注解配置正确
320
+ 2. 确认 Mapper XML 中表别名正确
321
+ 3. 确认 sys_user 表中 dept_id 正确
322
+ 4. 重新登录获取新的会话信息
323
+
324
+ ### 5.4 按钮权限不显示
325
+
326
+ **问题**: 用户有权限但按钮不显示
327
+
328
+ **排查步骤**:
329
+ ```javascript
330
+ // 检查前端是否有 v-hasPermi 指令
331
+ <el-button v-hasPermi="['asset:list:add']">
332
+ 新增
333
+ </el-button>
334
+
335
+ // 检查权限标识符是否一致
336
+ // 前端: asset:list:add
337
+ // 后端: @PreAuthorize("@ss.hasPermi('asset:list:add')")
338
+ // 数据库: sys_menu.perms = 'asset:list:add'
339
+ ```
340
+
341
+ **解决方案**:
342
+ 1. 确认前端按钮使用了 v-hasPermi 指令
343
+ 2. 确认权限标识符完全一致
344
+ 3. 确认按钮对应的菜单权限已分配
345
+ 4. 清除浏览器缓存
346
+ 5. 重新登录
347
+
348
+ ## 6. 最佳实践清单
349
+
350
+ ### 6.1 开发检查清单
351
+
352
+ ```yaml
353
+ 新增功能检查项:
354
+ - [ ] sys_menu 表配置完整 (目录/菜单/按钮)
355
+ - [ ] component 路径正确
356
+ - [ ] 权限标识符唯一且规范
357
+ - [ ] 角色菜单权限已分配
358
+ - [ ] @PreAuthorize 注解配置正确
359
+ - [ ] @DataScope 注解配置正确 (如需要)
360
+ - [ ] @Validated 参数校验添加
361
+ - [ ] @Xss 文本字段防护添加
362
+ - [ ] @Log 操作日志添加
363
+ - [ ] Redis缓存已清除
364
+ - [ ] 用户重新登录
365
+ ```
366
+
367
+ ### 6.2 API命名规范
368
+
369
+ ```javascript
370
+ // 标准API命名
371
+ export function listAsset(query) {
372
+ return request({ url: '/asset/list', method: 'get', params: query });
373
+ }
374
+
375
+ export function getAsset(assetId) {
376
+ return request({ url: '/asset/' + assetId, method: 'get' });
377
+ }
378
+
379
+ export function addAsset(data) {
380
+ return request({ url: '/asset', method: 'post', data });
381
+ }
382
+
383
+ export function updateAsset(data) {
384
+ return request({ url: '/asset', method: 'put', data });
385
+ }
386
+
387
+ export function delAsset(assetId) {
388
+ return request({ url: '/asset/' + assetId, method: 'delete' });
389
+ }
390
+
391
+ export function exportAsset(query) {
392
+ return request({ url: '/asset/export', method: 'get', params: query });
393
+ }
394
+ ```
395
+
396
+ ## 7. Guardrails
397
+
398
+ ### 7.1 必须遵守
399
+
400
+ - [ ] 所有页面(包括隐藏页)都必须在 sys_menu 表配置
401
+ - [ ] 权限标识符必须与 sys_menu.perms 完全一致
402
+ - [ ] 数据权限必须配置 ${params.dataScope}
403
+ - [ ] @RequestBody 参数必须添加 @Validated 注解
404
+ - [ ] 文本字段建议添加 @Xss 注解
405
+
406
+ ### 7.2 避免事项
407
+
408
+ - ❌ 硬编码权限标识符
409
+ - ❌ 跳过菜单配置直接访问页面
410
+ - ❌ 前端验证替代后端验证
411
+ - ❌ 忘记清除Redis缓存
412
+
413
+ ## 8. 本地开发指南
414
+
415
+ 本项目有特定的开发规范和历史经验,请在提供建议时优先参考:
416
+
417
+ ### 8.1 项目规则文件
418
+
419
+ | 文件 | 路径 | 内容 |
420
+ |------|------|------|
421
+ | **项目规则** | `.trae/rules/project_rules.md` | 目录结构、命名规范、开发规范、API命名规范 |
422
+ | **经验教训** | `.trae/rules/lessons.md` | 历史问题和解决方案,包含若依框架特定问题 |
423
+
424
+ ### 8.2 本地开发文档
425
+
426
+ | 文档 | 路径 | 内容 |
427
+ |------|------|------|
428
+ | **若依框架样式修改方案** | `docs/plans/若依框架样式修改方案.md` | 样式调整、主题配置、品牌一致性 |
429
+
430
+ ### 8.3 历史问题参考
431
+
432
+ 在 `.trae/rules/lessons.md` 中记录了以下若依框架相关问题:
433
+
434
+ 1. **菜单路由配置问题** (2026-03-08)
435
+ - 问题:新增页面404
436
+ - 原因:未在 sys_menu 表配置路由
437
+ - 解决:所有页面(包括隐藏页)都需要配置
438
+
439
+ 2. **API方法命名规范问题** (2026-03-08)
440
+ - 问题:前后端命名不一致
441
+ - 原因:未先定义规范
442
+ - 解决:设计文档先行,代码实现跟随
443
+
444
+ 3. **FP-ZCCZ1-001 Code Review实践** (2026-03-08)
445
+ - 问题:缺少参数校验、XSS防护、数据权限
446
+ - 解决:添加 @Validated、@Xss、@DataScope 注解
447
+
448
+ ### 8.4 项目特定检查项
449
+
450
+ ```yaml
451
+ 项目特定检查项:
452
+ - [ ] 检查 lessons.md 中是否有相关问题的解决方案
453
+ - [ ] 遵循 project_rules.md 中的命名规范
454
+ - [ ] 参考现有代码的实现模式
455
+ - [ ] 确认数据库配置:mysql6.sqlpub.com:3311/asset_ruoyi
456
+ ```
457
+
458
+ ## 9. 外部参考文档
459
+
460
+ - [若依官网](http://ruoyi.vip/)
461
+ - [若依文档](http://doc.ruoyi.vip/)
462
+ - [RuoYi-Vue GitHub](https://github.com/yangzongzhuan/RuoYi-Vue)
463
+ - [RuoYi-Vue Gitee](https://gitee.com/y_project/RuoYi-Vue)
464
+
465
+ ## 10. 版本历史
466
+
467
+ | 版本 | 日期 | 变更内容 |
468
+ |-----|------|---------|
469
+ | 3.1 | 2026-03-22 | 添加本地开发指南和文档引用 |
470
+ | 3.0 | 2026-03-21 | 标准化结构,添加诊断模式,增强协作指导 |
471
+ | 2.0 | 早期 | 完善问题解决方案 |
472
+ | 1.0 | 早期 | 初始版本 |
@@ -0,0 +1 @@
1
+ {"name": "expert-ruoyi", "version": "1.0.0", "category": "expert", "description": "RuoYi framework development expert proficient in project scaffolding, code generation, issue diagnosis, and architecture optimization. Call this Skill when users work on RuoYi framework, SpringBoot admin panels, permission systems, code generators, or menu routing configuration. 支持中文触发:若依框架、RuoYi、SpringBoot后台、权限配置、若依菜单、代码生成器。", "triggers": ["若依框架", "RuoYi", "SpringBoot后台", "权限配置", "若依菜单"]}