ai-engineering-init 1.3.4 → 1.4.1

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 (227) hide show
  1. package/.claude/hooks/skill-forced-eval.js +2 -0
  2. package/.claude/settings.json +3 -3
  3. package/.claude/skills/add-skill/SKILL.md +79 -32
  4. package/.claude/skills/api-development/SKILL.md +83 -377
  5. package/.claude/skills/architecture-design/SKILL.md +138 -632
  6. package/.claude/skills/backend-annotations/SKILL.md +134 -506
  7. package/.claude/skills/banana-image/SKILL.md +10 -3
  8. package/.claude/skills/brainstorm/SKILL.md +103 -535
  9. package/.claude/skills/bug-detective/SKILL.md +147 -1097
  10. package/.claude/skills/bug-detective/references/error-patterns.md +242 -0
  11. package/.claude/skills/code-patterns/SKILL.md +116 -426
  12. package/.claude/skills/code-patterns/references/leniu-code-patterns.md +87 -0
  13. package/.claude/skills/crud-development/SKILL.md +64 -304
  14. package/.claude/skills/data-permission/SKILL.md +105 -412
  15. package/.claude/skills/data-permission/references/custom-data-scope.md +90 -0
  16. package/.claude/skills/file-oss-management/SKILL.md +106 -714
  17. package/.claude/skills/file-oss-management/references/entities.md +105 -0
  18. package/.claude/skills/file-oss-management/references/service-impl.md +104 -0
  19. package/.claude/skills/leniu-api-development/SKILL.md +142 -626
  20. package/.claude/skills/leniu-api-development/references/real-examples.md +273 -0
  21. package/.claude/skills/leniu-architecture-design/SKILL.md +176 -391
  22. package/.claude/skills/leniu-backend-annotations/SKILL.md +132 -519
  23. package/.claude/skills/leniu-brainstorm/SKILL.md +132 -541
  24. package/.claude/skills/leniu-brainstorm/references/business-scenarios.md +162 -0
  25. package/.claude/skills/leniu-crud-development/SKILL.md +232 -938
  26. package/.claude/skills/leniu-crud-development/references/templates.md +597 -0
  27. package/.claude/skills/leniu-customization-location/SKILL.md +410 -0
  28. package/.claude/skills/leniu-data-permission/SKILL.md +70 -0
  29. package/.claude/skills/leniu-java-entity/SKILL.md +76 -590
  30. package/.claude/skills/leniu-java-entity/references/templates.md +237 -0
  31. package/.claude/skills/leniu-java-export/SKILL.md +94 -379
  32. package/.claude/skills/leniu-java-logging/SKILL.md +106 -709
  33. package/.claude/skills/leniu-java-logging/references/data-mask.md +46 -0
  34. package/.claude/skills/leniu-java-logging/references/logging-scenarios.md +113 -0
  35. package/.claude/skills/leniu-java-mybatis/SKILL.md +73 -446
  36. package/.claude/skills/leniu-java-mybatis/references/report-mapper.md +88 -0
  37. package/.claude/skills/leniu-report-customization/SKILL.md +111 -365
  38. package/.claude/skills/leniu-report-customization/references/table-fields.md +93 -0
  39. package/.claude/skills/leniu-report-standard-customization/SKILL.md +111 -334
  40. package/.claude/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
  41. package/.claude/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
  42. package/.claude/skills/leniu-security-guard/SKILL.md +133 -347
  43. package/.claude/skills/mysql-debug/SKILL.md +364 -0
  44. package/.claude/skills/openspec-apply-change/SKILL.md +10 -1
  45. package/.claude/skills/openspec-archive-change/SKILL.md +9 -1
  46. package/.claude/skills/openspec-bulk-archive-change/SKILL.md +9 -1
  47. package/.claude/skills/openspec-continue-change/SKILL.md +9 -1
  48. package/.claude/skills/openspec-explore/SKILL.md +10 -1
  49. package/.claude/skills/openspec-ff-change/SKILL.md +9 -1
  50. package/.claude/skills/openspec-new-change/SKILL.md +9 -1
  51. package/.claude/skills/openspec-onboard/SKILL.md +15 -130
  52. package/.claude/skills/openspec-sync-specs/SKILL.md +9 -1
  53. package/.claude/skills/openspec-verify-change/SKILL.md +9 -1
  54. package/.claude/skills/performance-doctor/SKILL.md +110 -434
  55. package/.claude/skills/redis-cache/SKILL.md +89 -595
  56. package/.claude/skills/redis-cache/references/listeners.md +23 -0
  57. package/.claude/skills/scheduled-jobs/SKILL.md +88 -407
  58. package/.claude/skills/security-guard/SKILL.md +137 -532
  59. package/.claude/skills/security-guard/references/encrypt-config.md +103 -0
  60. package/.claude/skills/security-guard/references/sensitive-strategies.md +42 -0
  61. package/.claude/skills/sms-mail/SKILL.md +116 -574
  62. package/.claude/skills/sms-mail/references/mail-config.md +88 -0
  63. package/.claude/skills/sms-mail/references/sms-config.md +74 -0
  64. package/.claude/skills/social-login/SKILL.md +112 -514
  65. package/.claude/skills/social-login/references/provider-configs.md +118 -0
  66. package/.claude/skills/tenant-management/SKILL.md +129 -444
  67. package/.claude/skills/tenant-management/references/tenant-scenarios.md +91 -0
  68. package/.claude/skills/test-development/SKILL.md +86 -540
  69. package/.claude/skills/test-development/references/parameterized-examples.md +119 -0
  70. package/.claude/skills/utils-toolkit/SKILL.md +52 -305
  71. package/.claude/skills/utils-toolkit/references/redis-utils-api.md +56 -0
  72. package/.claude/skills/websocket-sse/SKILL.md +105 -550
  73. package/.claude/skills/workflow-engine/SKILL.md +147 -502
  74. package/.codex/skills/add-skill/SKILL.md +79 -32
  75. package/.codex/skills/api-development/SKILL.md +172 -599
  76. package/.codex/skills/architecture-design/SKILL.md +138 -504
  77. package/.codex/skills/backend-annotations/SKILL.md +134 -496
  78. package/.codex/skills/banana-image/SKILL.md +10 -3
  79. package/.codex/skills/brainstorm/SKILL.md +103 -535
  80. package/.codex/skills/bug-detective/SKILL.md +147 -1097
  81. package/.codex/skills/bug-detective/references/error-patterns.md +242 -0
  82. package/.codex/skills/code-patterns/SKILL.md +120 -282
  83. package/.codex/skills/code-patterns/references/leniu-code-patterns.md +87 -0
  84. package/.codex/skills/crud-development/SKILL.md +64 -292
  85. package/.codex/skills/data-permission/SKILL.md +108 -407
  86. package/.codex/skills/data-permission/references/custom-data-scope.md +90 -0
  87. package/.codex/skills/database-ops/SKILL.md +8 -154
  88. package/.codex/skills/error-handler/SKILL.md +10 -0
  89. package/.codex/skills/file-oss-management/SKILL.md +106 -714
  90. package/.codex/skills/file-oss-management/references/entities.md +105 -0
  91. package/.codex/skills/file-oss-management/references/service-impl.md +104 -0
  92. package/.codex/skills/git-workflow/SKILL.md +27 -5
  93. package/.codex/skills/leniu-api-development/SKILL.md +142 -626
  94. package/.codex/skills/leniu-api-development/references/real-examples.md +273 -0
  95. package/.codex/skills/leniu-architecture-design/SKILL.md +176 -391
  96. package/.codex/skills/leniu-backend-annotations/SKILL.md +132 -519
  97. package/.codex/skills/leniu-brainstorm/SKILL.md +132 -541
  98. package/.codex/skills/leniu-brainstorm/references/business-scenarios.md +162 -0
  99. package/.codex/skills/leniu-crud-development/SKILL.md +232 -938
  100. package/.codex/skills/leniu-crud-development/references/templates.md +597 -0
  101. package/.codex/skills/leniu-customization-location/SKILL.md +410 -0
  102. package/.codex/skills/leniu-data-permission/SKILL.md +70 -0
  103. package/.codex/skills/leniu-java-code-style/SKILL.md +510 -0
  104. package/.codex/skills/leniu-java-entity/SKILL.md +76 -590
  105. package/.codex/skills/leniu-java-entity/references/templates.md +237 -0
  106. package/.codex/skills/leniu-java-export/SKILL.md +94 -379
  107. package/.codex/skills/leniu-java-logging/SKILL.md +106 -709
  108. package/.codex/skills/leniu-java-logging/references/data-mask.md +46 -0
  109. package/.codex/skills/leniu-java-logging/references/logging-scenarios.md +113 -0
  110. package/.codex/skills/leniu-java-mybatis/SKILL.md +73 -446
  111. package/.codex/skills/leniu-java-mybatis/references/report-mapper.md +88 -0
  112. package/.codex/skills/leniu-report-customization/SKILL.md +111 -365
  113. package/.codex/skills/leniu-report-customization/references/table-fields.md +93 -0
  114. package/.codex/skills/leniu-report-standard-customization/SKILL.md +111 -334
  115. package/.codex/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
  116. package/.codex/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
  117. package/.codex/skills/leniu-security-guard/SKILL.md +133 -347
  118. package/.codex/skills/mysql-debug/SKILL.md +364 -0
  119. package/.codex/skills/openspec-apply-change/SKILL.md +10 -1
  120. package/.codex/skills/openspec-archive-change/SKILL.md +9 -1
  121. package/.codex/skills/openspec-bulk-archive-change/SKILL.md +9 -1
  122. package/.codex/skills/openspec-continue-change/SKILL.md +9 -1
  123. package/.codex/skills/openspec-explore/SKILL.md +10 -1
  124. package/.codex/skills/openspec-ff-change/SKILL.md +9 -1
  125. package/.codex/skills/openspec-new-change/SKILL.md +9 -1
  126. package/.codex/skills/openspec-onboard/SKILL.md +15 -130
  127. package/.codex/skills/openspec-sync-specs/SKILL.md +9 -1
  128. package/.codex/skills/openspec-verify-change/SKILL.md +9 -1
  129. package/.codex/skills/performance-doctor/SKILL.md +110 -434
  130. package/.codex/skills/project-navigator/SKILL.md +20 -1
  131. package/.codex/skills/redis-cache/SKILL.md +93 -589
  132. package/.codex/skills/redis-cache/references/listeners.md +23 -0
  133. package/.codex/skills/scheduled-jobs/SKILL.md +88 -407
  134. package/.codex/skills/security-guard/SKILL.md +141 -527
  135. package/.codex/skills/security-guard/references/encrypt-config.md +103 -0
  136. package/.codex/skills/security-guard/references/sensitive-strategies.md +42 -0
  137. package/.codex/skills/sms-mail/SKILL.md +116 -574
  138. package/.codex/skills/sms-mail/references/mail-config.md +88 -0
  139. package/.codex/skills/sms-mail/references/sms-config.md +74 -0
  140. package/.codex/skills/social-login/SKILL.md +112 -514
  141. package/.codex/skills/social-login/references/provider-configs.md +118 -0
  142. package/.codex/skills/store-pc/SKILL.md +258 -383
  143. package/.codex/skills/tenant-management/SKILL.md +129 -444
  144. package/.codex/skills/tenant-management/references/tenant-scenarios.md +91 -0
  145. package/.codex/skills/test-development/SKILL.md +86 -540
  146. package/.codex/skills/test-development/references/parameterized-examples.md +119 -0
  147. package/.codex/skills/ui-pc/SKILL.md +350 -387
  148. package/.codex/skills/utils-toolkit/SKILL.md +52 -283
  149. package/.codex/skills/utils-toolkit/references/redis-utils-api.md +56 -0
  150. package/.codex/skills/websocket-sse/SKILL.md +105 -550
  151. package/.codex/skills/workflow-engine/SKILL.md +147 -502
  152. package/.cursor/hooks/cursor-skill-eval.js +53 -1
  153. package/.cursor/hooks.json +3 -3
  154. package/.cursor/skills/add-skill/SKILL.md +79 -32
  155. package/.cursor/skills/api-development/SKILL.md +83 -377
  156. package/.cursor/skills/architecture-design/SKILL.md +138 -632
  157. package/.cursor/skills/backend-annotations/SKILL.md +134 -506
  158. package/.cursor/skills/banana-image/SKILL.md +10 -3
  159. package/.cursor/skills/brainstorm/SKILL.md +103 -535
  160. package/.cursor/skills/bug-detective/SKILL.md +147 -1097
  161. package/.cursor/skills/bug-detective/references/error-patterns.md +242 -0
  162. package/.cursor/skills/code-patterns/SKILL.md +116 -426
  163. package/.cursor/skills/code-patterns/references/leniu-code-patterns.md +87 -0
  164. package/.cursor/skills/crud-development/SKILL.md +64 -304
  165. package/.cursor/skills/data-permission/SKILL.md +105 -412
  166. package/.cursor/skills/data-permission/references/custom-data-scope.md +90 -0
  167. package/.cursor/skills/file-oss-management/SKILL.md +106 -714
  168. package/.cursor/skills/file-oss-management/references/entities.md +105 -0
  169. package/.cursor/skills/file-oss-management/references/service-impl.md +104 -0
  170. package/.cursor/skills/git-workflow/SKILL.md +27 -5
  171. package/.cursor/skills/leniu-api-development/SKILL.md +142 -626
  172. package/.cursor/skills/leniu-api-development/references/real-examples.md +273 -0
  173. package/.cursor/skills/leniu-architecture-design/SKILL.md +176 -391
  174. package/.cursor/skills/leniu-backend-annotations/SKILL.md +132 -519
  175. package/.cursor/skills/leniu-brainstorm/SKILL.md +132 -541
  176. package/.cursor/skills/leniu-brainstorm/references/business-scenarios.md +162 -0
  177. package/.cursor/skills/leniu-crud-development/SKILL.md +232 -938
  178. package/.cursor/skills/leniu-crud-development/references/templates.md +597 -0
  179. package/.cursor/skills/leniu-customization-location/SKILL.md +410 -0
  180. package/.cursor/skills/leniu-data-permission/SKILL.md +70 -0
  181. package/.cursor/skills/leniu-java-code-style/SKILL.md +510 -0
  182. package/.cursor/skills/leniu-java-entity/SKILL.md +76 -590
  183. package/.cursor/skills/leniu-java-entity/references/templates.md +237 -0
  184. package/.cursor/skills/leniu-java-export/SKILL.md +94 -379
  185. package/.cursor/skills/leniu-java-logging/SKILL.md +106 -709
  186. package/.cursor/skills/leniu-java-logging/references/data-mask.md +46 -0
  187. package/.cursor/skills/leniu-java-logging/references/logging-scenarios.md +113 -0
  188. package/.cursor/skills/leniu-java-mybatis/SKILL.md +73 -446
  189. package/.cursor/skills/leniu-java-mybatis/references/report-mapper.md +88 -0
  190. package/.cursor/skills/leniu-report-customization/SKILL.md +111 -365
  191. package/.cursor/skills/leniu-report-customization/references/table-fields.md +93 -0
  192. package/.cursor/skills/leniu-report-standard-customization/SKILL.md +111 -334
  193. package/.cursor/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
  194. package/.cursor/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
  195. package/.cursor/skills/leniu-security-guard/SKILL.md +133 -347
  196. package/.cursor/skills/mysql-debug/SKILL.md +364 -0
  197. package/.cursor/skills/openspec-apply-change/SKILL.md +10 -1
  198. package/.cursor/skills/openspec-archive-change/SKILL.md +9 -1
  199. package/.cursor/skills/openspec-bulk-archive-change/SKILL.md +9 -1
  200. package/.cursor/skills/openspec-continue-change/SKILL.md +9 -1
  201. package/.cursor/skills/openspec-explore/SKILL.md +10 -1
  202. package/.cursor/skills/openspec-ff-change/SKILL.md +9 -1
  203. package/.cursor/skills/openspec-new-change/SKILL.md +9 -1
  204. package/.cursor/skills/openspec-onboard/SKILL.md +15 -130
  205. package/.cursor/skills/openspec-sync-specs/SKILL.md +9 -1
  206. package/.cursor/skills/openspec-verify-change/SKILL.md +9 -1
  207. package/.cursor/skills/performance-doctor/SKILL.md +110 -434
  208. package/.cursor/skills/redis-cache/SKILL.md +89 -595
  209. package/.cursor/skills/redis-cache/references/listeners.md +23 -0
  210. package/.cursor/skills/scheduled-jobs/SKILL.md +88 -407
  211. package/.cursor/skills/security-guard/SKILL.md +137 -532
  212. package/.cursor/skills/security-guard/references/encrypt-config.md +103 -0
  213. package/.cursor/skills/security-guard/references/sensitive-strategies.md +42 -0
  214. package/.cursor/skills/sms-mail/SKILL.md +116 -574
  215. package/.cursor/skills/sms-mail/references/mail-config.md +88 -0
  216. package/.cursor/skills/sms-mail/references/sms-config.md +74 -0
  217. package/.cursor/skills/social-login/SKILL.md +112 -514
  218. package/.cursor/skills/social-login/references/provider-configs.md +118 -0
  219. package/.cursor/skills/tenant-management/SKILL.md +129 -444
  220. package/.cursor/skills/tenant-management/references/tenant-scenarios.md +91 -0
  221. package/.cursor/skills/test-development/SKILL.md +86 -540
  222. package/.cursor/skills/test-development/references/parameterized-examples.md +119 -0
  223. package/.cursor/skills/utils-toolkit/SKILL.md +52 -305
  224. package/.cursor/skills/utils-toolkit/references/redis-utils-api.md +56 -0
  225. package/.cursor/skills/websocket-sse/SKILL.md +105 -550
  226. package/.cursor/skills/workflow-engine/SKILL.md +147 -502
  227. package/package.json +1 -1
@@ -1,462 +1,424 @@
1
1
  ---
2
2
  name: ui-pc
3
3
  description: |
4
- 前端(plus-ui)组件库指南。包含 21 个自定义组件、7 个 Store 模块、19 个工具模块。
4
+ 前端组件库指南。包含公共组件、业务组件、Element UI 组件使用。
5
5
 
6
6
  触发场景:
7
7
  - 开发前端后台管理页面
8
- - 使用 Element Plus 组件
8
+ - 使用 Element UI 组件
9
9
  - 表格、表单、弹窗、图表等前端 UI
10
- - 使用 useDict、useDictStore
11
- - 使用 Utils 工具函数
10
+ - 使用 leniu-components 业务组件
11
+ - 前端权限控制、国际化
12
12
 
13
- 触发词:el-、DictTagPaginationRightToolbarImagePreview、前端组件、后台页面、管理端、useDictuseDictStore、i18n
13
+ 触发词:el-、el-tableel-formel-dialogleniu-pageleniu-table、前端组件、后台页面、v-hasPerm
14
14
 
15
- 适用目录:plus-ui/**
15
+ 适用目录:/Users/xujiajun/Developer/frontProj/web/src/**
16
16
  ---
17
17
 
18
18
  # 前端组件库指南
19
19
 
20
- > **适用于**: `plus-ui/` 目录下的前端后台管理页面开发
20
+ > **适用于**: 腾云智慧食堂管理系统前端项目(Vue 2.7.16 + Element UI 2.15.9)
21
+ >
22
+ > **前端项目路径**: `/Users/xujiajun/Developer/frontProj/web`
21
23
 
22
24
  ---
23
25
 
24
26
  ## 目录结构
25
27
 
26
28
  ```
27
- plus-ui/src/
28
- ├── api/ # API 接口定义
29
- ├── assets/ # 静态资源
30
- ├── components/ # 自定义组件(21个)
31
- ├── directive/ # 自定义指令
32
- ├── enums/ # 枚举定义
33
- ├── hooks/ # Hooks(1个)
34
- ├── lang/ # 国际化
35
- ├── layout/ # 布局组件
36
- ├── plugins/ # 插件
37
- ├── router/ # 路由配置
38
- ├── store/ # Pinia Store(7个模块)
39
- ├── types/ # 类型定义
40
- ├── utils/ # 工具函数(19个)
41
- └── views/ # 页面视图
29
+ src/
30
+ ├── components/ # 公共组件(~87个)
31
+ ├── leniu-components/ # 业务组件(10个核心组件)
32
+ ├── layout/ # 布局组件(Navbar/Sidebar/AppMain)
33
+ ├── directive/ # 自定义指令(11个)
34
+ └── mixins/ # 全局混入(5个)
42
35
  ```
43
36
 
44
37
  ---
45
38
 
46
- ## 组件总览(21 个)
47
-
48
- | 组件 | 用途 | 使用场景 |
49
- |------|------|----------|
50
- | `Breadcrumb` | 面包屑导航 | 页面顶部路径导航 |
51
- | `DictTag` | 字典标签 | 显示字典值对应的标签 |
52
- | `Editor` | 富文本编辑器 | 内容编辑 |
53
- | `FileUpload` | 文件上传 | 附件上传 |
54
- | `Hamburger` | 汉堡菜单按钮 | 侧边栏折叠切换 |
55
- | `IconSelect` | 图标选择器 | 选择系统图标 |
56
- | `iFrame` | 内嵌页面 | 嵌入外部页面 |
57
- | `ImagePreview` | 图片预览 | 表格中图片缩略图 |
58
- | `ImageUpload` | 图片上传 | 头像/图片上传 |
59
- | `LangSelect` | 语言选择 | 切换系统语言 |
60
- | `Pagination` | 分页组件 | 列表分页 |
61
- | `ParentView` | 父级视图 | 路由嵌套容器 |
62
- | `Process` | 流程组件 | 流程展示 |
63
- | `RightToolbar` | 右侧工具栏 | 表格工具栏(搜索/刷新/列设置) |
64
- | `RoleSelect` | 角色选择器 | 选择角色 |
65
- | `RuoYiDoc` | 文档链接 | 跳转官方文档 |
66
- | `RuoYiGit` | Git链接 | 跳转仓库 |
67
- | `Screenfull` | 全屏切换 | 页面全屏 |
68
- | `SizeSelect` | 尺寸选择 | 切换组件尺寸 |
69
- | `SvgIcon` | SVG图标 | 显示 SVG 图标 |
70
- | `TopNav` | 顶部导航 | 顶部菜单导航 |
71
- | `UserSelect` | 用户选择器 | 选择用户 |
72
-
73
- ### 常用组件示例
74
-
75
- #### DictTag - 字典标签
39
+ ## 业务组件(leniu-components)
76
40
 
77
- ```vue
78
- <template>
79
- <dict-tag :options="sys_normal_disable" :value="row.status" />
80
- </template>
81
-
82
- <script setup lang="ts">
83
- const { sys_normal_disable } = useDict('sys_normal_disable')
84
- </script>
85
- ```
86
-
87
- #### Pagination - 分页
88
-
89
- ```vue
90
- <pagination
91
- v-show="total > 0"
92
- :total="total"
93
- v-model:page="queryParams.pageNum"
94
- v-model:limit="queryParams.pageSize"
95
- @pagination="getList"
96
- />
97
- ```
98
-
99
- #### RightToolbar - 工具栏
100
-
101
- ```vue
102
- <right-toolbar
103
- v-model:showSearch="showSearch"
104
- @queryTable="getList"
105
- />
106
- ```
107
-
108
- #### ImagePreview - 图片预览
109
-
110
- ```vue
111
- <image-preview :src="row.avatar" :width="50" :height="50" />
112
- ```
41
+ | 组件 | 路径 | 用途 |
42
+ |------|------|------|
43
+ | `leniu-page` | `leniu-components/leniu-page` | 页面布局容器(所有业务页面必用) |
44
+ | `leniu-search` | `leniu-components/leniu-search` | 搜索组件(列表页搜索) |
45
+ | `leniu-table` | `leniu-components/leniu-table` | 增强表格组件 |
46
+ | `leniu-form` | `leniu-components/leniu-form` | 表单组件 |
47
+ | `leniu-form-item` | `leniu-components/leniu-form-item` | 表单项组件 |
48
+ | `leniu-form-dialog` | `leniu-components/leniu-form-dialog` | 弹窗表单(新增/编辑) |
49
+ | `leniu-form-panel` | `leniu-components/leniu-form-panel` | 面板表单(详情展示) |
50
+ | `leniu-button-list` | `leniu-components/leniu-button-list` | 按钮组 |
51
+ | `leniu-table-toolbar` | `leniu-components/leniu-table-toolbar` | 表格工具栏 |
113
52
 
114
53
  ---
115
54
 
116
- ## Store 模块(7 个)
117
-
118
- | Store | 文件 | 职责 |
119
- |-------|------|------|
120
- | `useUserStore` | `store/modules/user.ts` | 用户信息、登录状态、角色权限 |
121
- | `useAppStore` | `store/modules/app.ts` | 应用状态(侧边栏、设备类型) |
122
- | `useDictStore` | `store/modules/dict.ts` | 字典数据缓存 |
123
- | `useNoticeStore` | `store/modules/notice.ts` | 通知消息 |
124
- | `usePermissionStore` | `store/modules/permission.ts` | 权限路由管理 |
125
- | `useSettingsStore` | `store/modules/settings.ts` | 系统设置 |
126
- | `useTagsViewStore` | `store/modules/tagsView.ts` | 标签页管理 |
127
-
128
- ### useUserStore 用法
129
-
130
- ```typescript
131
- import { useUserStore } from '@/store/modules/user'
132
-
133
- const userStore = useUserStore()
134
-
135
- // 属性
136
- userStore.userId // 用户ID
137
- userStore.tenantId // 租户ID
138
- userStore.token // 登录令牌
139
- userStore.nickname // 昵称
140
- userStore.avatar // 头像
141
- userStore.roles // 角色列表
142
- userStore.permissions // 权限列表
143
-
144
- // 方法
145
- await userStore.login(userInfo) // 登录
146
- await userStore.getInfo() // 获取用户信息
147
- await userStore.logout() // 登出
148
- userStore.setAvatar(url) // 设置头像
149
- ```
150
-
151
- ### useDictStore 用法
152
-
153
- ```typescript
154
- import { useDictStore } from '@/store/modules/dict'
55
+ ## 常用公共组件(components)
155
56
 
156
- const dictStore = useDictStore()
157
- const dicts = dictStore.getDict('sys_normal_disable')
158
- dictStore.setDict('sys_normal_disable', dictData)
159
- ```
57
+ | 组件 | 用途 |
58
+ |------|------|
59
+ | `Pagination` | 分页组件 |
60
+ | `CollapseSearch` | 折叠搜索区域 |
61
+ | `Breadcrumb` | 面包屑导航 |
62
+ | `Dropzone` | 文件拖拽上传 |
63
+ | `ImageCropper` | 图片裁剪 |
64
+ | `Tinymce` | 富文本编辑器 |
65
+ | `UploadImageList` | 图片上传列表 |
160
66
 
161
67
  ---
162
68
 
163
- ## Hooks(1 个)
69
+ ## 全局原型方法(main.js 挂载)
164
70
 
165
- ### useDialog
71
+ 在任意组件中可直接使用:
166
72
 
167
- ```typescript
168
- import useDialog from '@/hooks/useDialog'
169
-
170
- const { dialogVisible, openDialog, closeDialog } = useDialog()
171
- ```
73
+ | 方法/属性 | 说明 | 示例 |
74
+ |----------|------|------|
75
+ | `this.money(fen)` | 分转元(保留2位小数) | `this.money(100)` → `'1.00'` |
76
+ | `this.accMul(val, 100)` | 精确乘法(元转分) | `this.accMul(1.5, 100)` → `150` |
77
+ | `this.parseTime(time, fmt)` | 格式化时间 | `this.parseTime(new Date(), '{y}-{m}-{d}')` |
78
+ | `this.$echarts` | ECharts 实例 | `this.$echarts.init(el)` |
79
+ | `this.$hasPerm(['xxx:add'])` | 权限判断(JS中) | 返回 true/false |
80
+ | `this.isDevEnv` | 是否纯本地开发环境 | true/false |
81
+ | `this.isDevTestEnv` | 是否开发测试环境 | 含 dev/test 域名 |
82
+ | `this._` | Lodash 工具库 | `this._.debounce(fn, 300)` |
83
+ | `this.validators` | 表单校验规则集 | `this.validators.required()` |
84
+ | `this.inputRules` | 输入过滤规则 | `this.inputRules.number(val)` |
85
+ | `this.CNEN` | 中英文拼接工具 | 根据 i18n 拼接 |
172
86
 
173
87
  ---
174
88
 
175
- ## Utils 工具函数(19 个模块)
176
-
177
- ### dict.ts - 字典工具(高频使用)
178
-
179
- ```typescript
180
- import { useDict } from '@/utils/dict'
181
-
182
- // 获取字典数据
183
- const { sys_normal_disable, sys_user_sex } = useDict(
184
- 'sys_normal_disable',
185
- 'sys_user_sex'
186
- )
89
+ ## 自定义指令(directive)
187
90
 
188
- // 返回格式:
189
- // { label: '正常', value: '0', elTagType: 'primary', elTagClass: '' }
190
- ```
191
-
192
- ### request.ts - HTTP 请求
193
-
194
- ```typescript
195
- import request from '@/utils/request'
196
-
197
- // GET 请求
198
- export function listUser(query) {
199
- return request({
200
- url: '/system/user/list',
201
- method: 'get',
202
- params: query
203
- })
204
- }
91
+ ```vue
92
+ <!-- 按钮权限(最常用)-->
93
+ <el-button v-hasPerm="['xxx:add']">新增</el-button>
94
+ <el-button v-hasPerm="['xxx:edit']">修改</el-button>
95
+ <el-button v-hasPerm="['xxx:remove']">删除</el-button>
205
96
 
206
- // POST 请求
207
- export function addUser(data) {
208
- return request({
209
- url: '/system/user',
210
- method: 'post',
211
- data: data
212
- })
213
- }
97
+ <!-- 角色权限 -->
98
+ <el-button v-hasRole="['admin']">管理员按钮</el-button>
214
99
  ```
215
100
 
216
- ### auth.ts - 认证工具
101
+ ---
217
102
 
218
- ```typescript
219
- import { getToken, setToken, removeToken } from '@/utils/auth'
103
+ ## 国际化(i18n)
220
104
 
221
- const token = getToken()
222
- setToken('new-token')
223
- removeToken()
105
+ ```vue
106
+ <template>
107
+ <!-- 使用翻译 -->
108
+ <span>{{ $t('规则名称') }}</span>
109
+ <el-button>{{ $t('action.query') }}</el-button>
110
+ <el-button>{{ $t('新增') }}</el-button>
111
+ </template>
224
112
  ```
225
113
 
226
- ### ruoyi.ts - 通用工具
114
+ > **注意**:语言文件在 `src/lang/` 目录,支持中文(zh)和英文(en)
227
115
 
228
- ```typescript
229
- import {
230
- parseTime, // 时间格式化
231
- resetForm, // 重置表单
232
- addDateRange, // 添加日期范围参数
233
- selectDictLabel, // 获取字典标签
234
- handleTree, // 构造树形结构
235
- blobValidate // Blob 验证
236
- } from '@/utils/ruoyi'
116
+ ---
237
117
 
238
- // 日期范围查询
239
- addDateRange(queryParams, dateRange, 'createTime')
118
+ ## 全局 Mixin(mixins/index.js)
240
119
 
241
- // 构造树形结构
242
- const treeData = handleTree(data, 'id', 'parentId')
243
- ```
120
+ 所有组件自动混入,提供以下方法:
244
121
 
245
- ### validate.ts - 验证工具
246
-
247
- ```typescript
248
- import {
249
- isURL,
250
- isLowerCase,
251
- isUpperCase,
252
- isAlphabets,
253
- isEmail,
254
- isMobile,
255
- isPhone,
256
- isIdCard,
257
- isNumber,
258
- isIntegerGreaterThanZero
259
- } from '@/utils/validate'
260
-
261
- if (isEmail(value)) { ... }
262
- if (isMobile(value)) { ... }
263
- ```
122
+ ```javascript
123
+ // 金额输入过滤(只允许数字和小数点)
124
+ this.oninput(value, decimalLimit, maxLength, maxValue)
264
125
 
265
- ### index.ts - 通用工具函数
266
-
267
- ```typescript
268
- import {
269
- formatDate, // 日期格式化
270
- formatTime, // 时间格式化(相对时间)
271
- debounce, // 防抖
272
- deepClone, // 深拷贝
273
- uniqueArr, // 数组去重
274
- hasClass, // 判断类名
275
- addClass, // 添加类名
276
- removeClass, // 移除类名
277
- isExternal // 是否外部链接
278
- } from '@/utils'
279
- ```
126
+ // 只允许字母和数字
127
+ this.LetterAndNum(value, maxLength)
280
128
 
281
- ### crypto.ts - 加密工具
129
+ // 只允许数字
130
+ this.Num(value, maxLength)
282
131
 
283
- ```typescript
284
- import { encrypt, decrypt } from '@/utils/crypto'
132
+ // 获取当前时间戳字符串
133
+ this.getTimestamp()
285
134
 
286
- const encrypted = encrypt(data)
287
- const decrypted = decrypt(encrypted)
135
+ // 获取图片完整URL
136
+ this.getUrl1(path) // 自动拼接 baseUrl
288
137
  ```
289
138
 
290
- ### jsencrypt.ts - RSA 加密
291
-
292
- ```typescript
293
- import { encrypt, decrypt } from '@/utils/jsencrypt'
294
-
295
- const encrypted = encrypt(password)
296
- ```
139
+ ---
297
140
 
298
- ### permission.ts - 权限工具
141
+ ## 标准列表页结构
299
142
 
300
- ```typescript
301
- import { checkPermi, checkRole } from '@/utils/permission'
143
+ ```vue
144
+ <template>
145
+ <page-slot>
146
+ <!-- 搜索区域 -->
147
+ <collapse-search slot="search">
148
+ <template v-slot:outerCol>
149
+ <el-col :span="6">
150
+ <el-form-item :label="$t('名称')">
151
+ <el-input v-model="listQuery.name" clearable />
152
+ </el-form-item>
153
+ </el-col>
154
+ <el-col :span="6">
155
+ <el-form-item :label="$t('状态')">
156
+ <el-select v-model="listQuery.status" clearable>
157
+ <el-option label="正常" value="1" />
158
+ <el-option label="停用" value="0" />
159
+ </el-select>
160
+ </el-form-item>
161
+ </el-col>
162
+ </template>
163
+ <el-button
164
+ slot="operate"
165
+ type="primary"
166
+ icon="el-icon-search"
167
+ @click="() => (page.current = 1) && getData()"
168
+ >
169
+ {{ $t('action.query') }}
170
+ </el-button>
171
+ </collapse-search>
172
+
173
+ <!-- 操作按钮 -->
174
+ <el-button
175
+ slot="tableTopLeft"
176
+ type="primary"
177
+ plain
178
+ icon="el-icon-plus"
179
+ v-hasPerm="['xxx:add']"
180
+ @click="handleAdd"
181
+ >
182
+ {{ $t('新增') }}
183
+ </el-button>
302
184
 
303
- // 检查权限
304
- if (checkPermi(['system:user:add'])) { ... }
185
+ <!-- 表格 -->
186
+ <el-table
187
+ slot="table"
188
+ height="100%"
189
+ stripe
190
+ :data="tableData"
191
+ v-loading="loading"
192
+ >
193
+ <el-table-column prop="name" :label="$t('名称')" min-width="150" />
194
+ <el-table-column prop="status" :label="$t('状态')">
195
+ <template slot-scope="{ row }">
196
+ <el-tag :type="row.status === '1' ? 'success' : 'danger'">
197
+ {{ row.status === '1' ? '正常' : '停用' }}
198
+ </el-tag>
199
+ </template>
200
+ </el-table-column>
201
+ <el-table-column :label="$t('操作')" width="180" align="center">
202
+ <template slot-scope="{ row }">
203
+ <el-button type="text" @click="handleEdit(row)" v-hasPerm="['xxx:edit']">
204
+ {{ $t('修改') }}
205
+ </el-button>
206
+ <el-button type="text" @click="handleDelete(row)" v-hasPerm="['xxx:remove']">
207
+ {{ $t('删除') }}
208
+ </el-button>
209
+ </template>
210
+ </el-table-column>
211
+ </el-table>
212
+ </page-slot>
213
+ </template>
305
214
 
306
- // 检查角色
307
- if (checkRole(['admin'])) { ... }
215
+ <script>
216
+ import { getList, del } from '@/api/xxx'
217
+
218
+ export default {
219
+ name: 'XxxList',
220
+ data() {
221
+ return {
222
+ loading: false,
223
+ tableData: [],
224
+ total: 0,
225
+ page: { current: 1, size: 20 },
226
+ listQuery: {
227
+ name: '',
228
+ status: ''
229
+ }
230
+ }
231
+ },
232
+ mounted() {
233
+ this.getData()
234
+ },
235
+ methods: {
236
+ async getData() {
237
+ this.loading = true
238
+ try {
239
+ const res = await getList({
240
+ page: this.page,
241
+ object: this.listQuery
242
+ })
243
+ this.tableData = res.records || []
244
+ this.total = res.total || 0
245
+ } finally {
246
+ this.loading = false
247
+ }
248
+ },
249
+ handleAdd() {
250
+ this.visible = true
251
+ this.form = {}
252
+ },
253
+ handleEdit(row) {
254
+ this.visible = true
255
+ this.form = { ...row }
256
+ },
257
+ handleDelete(row) {
258
+ this.$confirm('确定删除?', '提示', {
259
+ type: 'warning'
260
+ }).then(async () => {
261
+ await del(row.id)
262
+ this.$message.success('删除成功')
263
+ this.getData()
264
+ })
265
+ }
266
+ }
267
+ }
268
+ </script>
308
269
  ```
309
270
 
310
- ### websocket.ts - WebSocket
311
-
312
- ```typescript
313
- import { initWebSocket, closeWebSocket, sendMessage } from '@/utils/websocket'
314
-
315
- initWebSocket(url, onMessage, onError)
316
- sendMessage(data)
317
- closeWebSocket()
318
- ```
271
+ ---
319
272
 
320
- ### sse.ts - Server-Sent Events
273
+ ## 标准表单弹窗
321
274
 
322
- ```typescript
323
- import { createSSE, closeSSE } from '@/utils/sse'
275
+ ```vue
276
+ <template>
277
+ <el-dialog
278
+ :title="form.id ? '编辑' : '新增'"
279
+ :visible.sync="visible"
280
+ width="600px"
281
+ @close="handleClose"
282
+ >
283
+ <el-form ref="form" :model="form" :rules="rules" label-width="100px">
284
+ <el-form-item label="名称" prop="name">
285
+ <el-input v-model="form.name" placeholder="请输入名称" />
286
+ </el-form-item>
287
+ <el-form-item label="状态" prop="status">
288
+ <el-radio-group v-model="form.status">
289
+ <el-radio label="1">正常</el-radio>
290
+ <el-radio label="0">停用</el-radio>
291
+ </el-radio-group>
292
+ </el-form-item>
293
+ </el-form>
294
+ <div slot="footer">
295
+ <el-button @click="visible = false">取消</el-button>
296
+ <el-button type="primary" :loading="submitting" @click="handleSubmit">
297
+ 确定
298
+ </el-button>
299
+ </div>
300
+ </el-dialog>
301
+ </template>
324
302
 
325
- const sse = createSSE(url, onMessage)
326
- closeSSE(sse)
303
+ <script>
304
+ import { add, update } from '@/api/xxx'
305
+
306
+ export default {
307
+ name: 'XxxForm',
308
+ props: {
309
+ visible: Boolean,
310
+ data: Object
311
+ },
312
+ data() {
313
+ return {
314
+ form: {},
315
+ rules: {
316
+ name: [{ required: true, message: '请输入名称', trigger: 'blur' }]
317
+ },
318
+ submitting: false
319
+ }
320
+ },
321
+ watch: {
322
+ data: {
323
+ immediate: true,
324
+ handler(val) {
325
+ this.form = val ? { ...val } : {}
326
+ }
327
+ }
328
+ },
329
+ methods: {
330
+ handleClose() {
331
+ this.$refs.form.resetFields()
332
+ this.$emit('update:visible', false)
333
+ },
334
+ async handleSubmit() {
335
+ this.$refs.form.validate(async (valid) => {
336
+ if (!valid) return
337
+ this.submitting = true
338
+ try {
339
+ const api = this.form.id ? update : add
340
+ await api(this.form)
341
+ this.$message.success('保存成功')
342
+ this.$emit('success')
343
+ this.handleClose()
344
+ } finally {
345
+ this.submitting = false
346
+ }
347
+ })
348
+ }
349
+ }
350
+ }
351
+ </script>
327
352
  ```
328
353
 
329
354
  ---
330
355
 
331
- ## 标准列表页结构
356
+ ## API 接口定义规范
332
357
 
333
- ### 1. 搜索区域
358
+ 所有 API 调用通过 `src/utils/request.js` 封装,请求格式有两种:
334
359
 
335
- ```vue
336
- <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
337
- <el-form-item label="用户名称" prop="userName">
338
- <el-input
339
- v-model="queryParams.userName"
340
- placeholder="请输入用户名称"
341
- clearable
342
- @keyup.enter="handleQuery"
343
- />
344
- </el-form-item>
345
- <el-form-item label="状态" prop="status">
346
- <el-select v-model="queryParams.status" placeholder="用户状态" clearable>
347
- <el-option
348
- v-for="dict in sys_normal_disable"
349
- :key="dict.value"
350
- :label="dict.label"
351
- :value="dict.value"
352
- />
353
- </el-select>
354
- </el-form-item>
355
- <el-form-item>
356
- <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
357
- <el-button icon="Refresh" @click="resetQuery">重置</el-button>
358
- </el-form-item>
359
- </el-form>
360
- ```
360
+ ### 标准请求格式(带 content 包裹)
361
361
 
362
- ### 2. 工具栏区域
362
+ ```javascript
363
+ // src/api/xxx.js
364
+ import request from '@/utils/request'
363
365
 
364
- ```vue
365
- <el-row :gutter="10" class="mb8">
366
- <el-col :span="1.5">
367
- <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:user:add']">
368
- 新增
369
- </el-button>
370
- </el-col>
371
- <el-col :span="1.5">
372
- <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate" v-hasPermi="['system:user:edit']">
373
- 修改
374
- </el-button>
375
- </el-col>
376
- <el-col :span="1.5">
377
- <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete" v-hasPermi="['system:user:remove']">
378
- 删除
379
- </el-button>
380
- </el-col>
381
- <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" />
382
- </el-row>
383
- ```
366
+ // 分页查询
367
+ export function getList(data) {
368
+ return request({
369
+ url: '/api/v1/xxx/list',
370
+ method: 'post',
371
+ data: {
372
+ version: '1.0',
373
+ nonceStr: '1212fsadf',
374
+ timestamp: '2020-4-21',
375
+ signType: 'md5',
376
+ content: data, // 业务数据放在 content 中
377
+ sign: 'xxx'
378
+ }
379
+ })
380
+ }
384
381
 
385
- ### 3. 表格区域
382
+ // GET 请求
383
+ export function getDetail(id) {
384
+ return request({
385
+ url: `/api/v1/xxx/detail/${id}`,
386
+ method: 'get',
387
+ params: { version: '1.0', content: { id } }
388
+ })
389
+ }
386
390
 
387
- ```vue
388
- <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
389
- <el-table-column type="selection" width="50" align="center" />
390
- <el-table-column label="用户编号" align="center" prop="userId" />
391
- <el-table-column label="用户名称" align="center" prop="userName" />
392
- <el-table-column label="头像" align="center" prop="avatar" width="80">
393
- <template #default="scope">
394
- <image-preview :src="scope.row.avatar" :width="50" :height="50" />
395
- </template>
396
- </el-table-column>
397
- <el-table-column label="状态" align="center" prop="status">
398
- <template #default="scope">
399
- <dict-tag :options="sys_normal_disable" :value="scope.row.status" />
400
- </template>
401
- </el-table-column>
402
- <el-table-column label="操作" align="center" width="180">
403
- <template #default="scope">
404
- <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:user:edit']">
405
- 修改
406
- </el-button>
407
- <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:user:remove']">
408
- 删除
409
- </el-button>
410
- </template>
411
- </el-table-column>
412
- </el-table>
413
-
414
- <pagination
415
- v-show="total > 0"
416
- :total="total"
417
- v-model:page="queryParams.pageNum"
418
- v-model:limit="queryParams.pageSize"
419
- @pagination="getList"
420
- />
391
+ // 删除
392
+ export function del(id) {
393
+ return request({
394
+ url: `/api/v1/xxx/delete`,
395
+ method: 'post',
396
+ data: { version: '1.0', content: { id } }
397
+ })
398
+ }
421
399
  ```
422
400
 
423
- ### 4. 弹窗表单
424
-
425
- ```vue
426
- <el-dialog :title="title" v-model="open" width="500px" append-to-body>
427
- <el-form ref="formRef" :model="form" :rules="rules" label-width="80px">
428
- <el-form-item label="用户名称" prop="userName">
429
- <el-input v-model="form.userName" placeholder="请输入用户名称" />
430
- </el-form-item>
431
- <el-form-item label="状态" prop="status">
432
- <el-radio-group v-model="form.status">
433
- <el-radio
434
- v-for="dict in sys_normal_disable"
435
- :key="dict.value"
436
- :value="dict.value"
437
- >{{ dict.label }}</el-radio>
438
- </el-radio-group>
439
- </el-form-item>
440
- </el-form>
441
- <template #footer>
442
- <div class="dialog-footer">
443
- <el-button type="primary" @click="submitForm">确 定</el-button>
444
- <el-button @click="cancel">取 消</el-button>
445
- </div>
446
- </template>
447
- </el-dialog>
448
- ```
401
+ > **注意**:
402
+ > - 请求拦截器会自动添加签名(MD5)
403
+ > - 所有接口都走 SM4 国密加密(`/security/` 前缀)
404
+ > - 响应 `code == 10000` 为成功,返回 `res.data`
405
+ > - 响应 `code == 20001` 为登录失效,自动跳转登录
449
406
 
450
407
  ---
451
408
 
452
- ## 权限指令
409
+ ## 金额处理规范
453
410
 
454
- ```vue
455
- <!-- 按钮权限 -->
456
- <el-button v-hasPermi="['system:user:add']">新增</el-button>
411
+ ```javascript
412
+ // 前端展示:分转元(使用全局 money 方法)
413
+ this.money(10000) // '100.00'
414
+ this.money(null) // → ''
457
415
 
458
- <!-- 角色权限 -->
459
- <el-button v-hasRole="['admin']">管理员按钮</el-button>
416
+ // 后端传参:元转分(使用全局 accMul 方法)
417
+ this.accMul(100, 100) // → 10000
418
+
419
+ // ❌ 禁止直接 / 100 或 * 100(精度问题)
420
+ amount / 100 // 禁止
421
+ amount * 100 // 禁止
460
422
  ```
461
423
 
462
424
  ---
@@ -465,11 +427,12 @@ closeSSE(sse)
465
427
 
466
428
  | 用途 | 路径 |
467
429
  |------|------|
468
- | 标准 CRUD 页面 | `plus-ui/src/views/system/user/index.vue` |
469
- | API 定义规范 | `plus-ui/src/api/system/user/index.ts` |
470
- | 字典标签组件 | `plus-ui/src/components/DictTag/index.vue` |
471
- | 分页组件 | `plus-ui/src/components/Pagination/index.vue` |
472
- | 工具栏组件 | `plus-ui/src/components/RightToolbar/index.vue` |
473
- | 字典工具 | `plus-ui/src/utils/dict.ts` |
474
- | 通用工具 | `plus-ui/src/utils/ruoyi.ts` |
475
- | 用户 Store | `plus-ui/src/store/modules/user.ts` |
430
+ | 业务组件 | `/Users/xujiajun/Developer/frontProj/web/src/leniu-components/` |
431
+ | 公共组件 | `/Users/xujiajun/Developer/frontProj/web/src/components/` |
432
+ | 标准列表页 | `/Users/xujiajun/Developer/frontProj/web/src/leniuview/marketing/` |
433
+ | API 定义示例 | `/Users/xujiajun/Developer/frontProj/web/src/api/marketing.js` |
434
+ | 请求封装 | `/Users/xujiajun/Developer/frontProj/web/src/utils/request.js` |
435
+ | Token/租户工具 | `/Users/xujiajun/Developer/frontProj/web/src/utils/auth.js` |
436
+ | 全局工具函数 | `/Users/xujiajun/Developer/frontProj/web/src/utils/index.js` |
437
+ | 权限守卫 | `/Users/xujiajun/Developer/frontProj/web/src/permission.js` |
438
+ | 主入口 | `/Users/xujiajun/Developer/frontProj/web/src/main.js` |