create-bubbles 0.1.24 → 0.1.26

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 (204) hide show
  1. package/dist/index.js +15 -0
  2. package/package.json +1 -2
  3. package/template-nextjs-vinext-eslint/Dockerfile +4 -4
  4. package/template-nextjs-vinext-eslint/README.md +6 -2
  5. package/template-nextjs-vinext-eslint/docker-compose.yaml +4 -4
  6. package/template-nextjs-vinext-eslint/eslint.config.js +2 -0
  7. package/template-nextjs-vinext-eslint/package.json +28 -26
  8. package/template-nextjs-vinext-eslint/pnpm-workspace.yaml +13 -1
  9. package/template-nextjs-vinext-eslint/src/utils/request/core/index.ts +63 -45
  10. package/template-nextjs-vinext-eslint/src/utils/request/core/utils.ts +12 -6
  11. package/template-nextjs-vinext-eslint/vite.config.ts +1 -1
  12. package/template-react-rsbuild-biome/.agents/rules/SVG/344/275/277/347/224/250.md +8 -0
  13. package/template-react-rsbuild-biome/AGENTS.md +11 -0
  14. package/template-react-rsbuild-biome/index.html +2 -2
  15. package/template-react-rsbuild-biome/package.json +25 -24
  16. package/template-react-rsbuild-biome/pnpm-workspace.yaml +5 -0
  17. package/template-react-rsbuild-biome/rsbuild.config.ts +1 -1
  18. package/template-react-rsbuild-biome/src/assets/icon/logo.svg +1 -1
  19. package/template-react-rsbuild-biome/src/assets/svg/draft.svg +4 -0
  20. package/template-react-rsbuild-biome/src/components/Icon/svg-icon/README.md +37 -0
  21. package/template-react-rsbuild-biome/src/components/Icon/svg-icon/SvgIcon.tsx +27 -0
  22. package/template-react-rsbuild-biome/src/env.d.ts +7 -0
  23. package/template-react-rsbuild-biome/src/utils/request/index.ts +3 -4
  24. package/template-react-rsbuild-biome/tsconfig.json +1 -2
  25. package/template-taro-react-oxc/.oxlintrc.json +0 -1
  26. package/template-taro-react-oxc/package.json +53 -52
  27. package/template-taro-react-oxc/pnpm-workspace.yaml +46 -0
  28. package/template-taro-vue-eslint/package.json +56 -56
  29. package/template-vp-monorepo-react-hono/apps/web/.agents/rules/SVG/344/275/277/347/224/250.md +8 -0
  30. package/template-vp-monorepo-react-hono/apps/web/AGENTS.md +11 -0
  31. package/template-vp-monorepo-react-hono/apps/web/package.json +1 -0
  32. package/template-vp-monorepo-react-hono/apps/web/src/assets/svg/draft.svg +4 -0
  33. package/template-vp-monorepo-react-hono/apps/web/src/components/Icon/svg-icon/README.md +37 -0
  34. package/template-vp-monorepo-react-hono/apps/web/src/components/Icon/svg-icon/SvgIcon.tsx +27 -0
  35. package/template-vp-monorepo-react-hono/apps/web/tsconfig.json +1 -1
  36. package/template-vp-monorepo-react-hono/apps/web/vite.config.ts +2 -0
  37. package/template-vp-monorepo-react-hono/pnpm-workspace.yaml +1 -0
  38. package/template-vp-monorepo-react-nestjs/.agents/rules//344/273/243/347/240/201/350/256/276/350/256/241.md +4 -0
  39. package/template-vp-monorepo-react-nestjs/.agents/rules//345/205/261/344/272/253/344/273/243/347/240/201.md +4 -0
  40. package/template-vp-monorepo-react-nestjs/.spaces/01./344/274/201/344/270/232/347/272/247/351/241/271/347/233/256/347/272/247//351/234/200/346/261/202/346/226/207/346/241/243.md +177 -0
  41. package/template-vp-monorepo-react-nestjs/.spaces/server/04.upload.md +4504 -0
  42. package/template-vp-monorepo-react-nestjs/.spaces/server/05./344/270/212/344/274/240/346/224/271/351/200/240/346/226/271/346/241/210/README.md +858 -0
  43. package/template-vp-monorepo-react-nestjs/.spaces/server/06./345/205/254/345/205/261/351/230/237/345/210/227/346/216/245/345/205/245/346/226/271/346/241/210/README.md +1890 -0
  44. package/template-vp-monorepo-react-nestjs/.spaces/server/06./345/205/254/345/205/261/351/230/237/345/210/227/346/216/245/345/205/245/346/226/271/346/241/210//344/270/212/344/274/240/346/270/205/347/220/206.md +1465 -0
  45. package/template-vp-monorepo-react-nestjs/AGENTS.md +8 -12
  46. package/template-vp-monorepo-react-nestjs/apps/server/.agents/rules/error-handling.md +84 -0
  47. package/template-vp-monorepo-react-nestjs/apps/server/.env.development +60 -0
  48. package/template-vp-monorepo-react-nestjs/apps/server/.env.production +16 -0
  49. package/template-vp-monorepo-react-nestjs/apps/server/AGENTS.md +9 -0
  50. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/0000_military_colonel_america.sql +11 -0
  51. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/0001_loud_siren.sql +27 -0
  52. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/meta/0000_snapshot.json +97 -0
  53. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/meta/0001_snapshot.json +354 -0
  54. package/template-vp-monorepo-react-nestjs/apps/server/drizzle/meta/_journal.json +20 -0
  55. package/template-vp-monorepo-react-nestjs/apps/server/package.json +4 -0
  56. package/template-vp-monorepo-react-nestjs/apps/server/src/app.module.ts +14 -2
  57. package/template-vp-monorepo-react-nestjs/apps/server/src/common/adapters/fastify.adapter.ts +6 -0
  58. package/template-vp-monorepo-react-nestjs/apps/server/src/config/index.ts +2 -0
  59. package/template-vp-monorepo-react-nestjs/apps/server/src/config/queue.config.ts +105 -0
  60. package/template-vp-monorepo-react-nestjs/apps/server/src/config/storage.config.ts +33 -0
  61. package/template-vp-monorepo-react-nestjs/apps/server/src/database/schema.ts +57 -1
  62. package/template-vp-monorepo-react-nestjs/apps/server/src/main.ts +1 -0
  63. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/auth.service.ts +1 -3
  64. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/auth/dto/auth-repsponse.dto.ts +2 -2
  65. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/queue-worker.bootstrap.ts +24 -0
  66. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/task-queue.constants.ts +24 -0
  67. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/task-queue.contracts.ts +35 -0
  68. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/task-queue.module.ts +56 -0
  69. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/task-queue.processor.ts +62 -0
  70. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/task-queue/task-queue.service.ts +58 -0
  71. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/test/error-catelog.spec.ts +34 -0
  72. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/dto/initiate-mutipart-upload.dto.ts +26 -0
  73. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/dto/upload-params.dto.ts +15 -0
  74. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/storage/exact-size.transform.ts +66 -0
  75. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/storage/minio-storage.adapter.ts +239 -0
  76. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/storage/storage.port.ts +61 -0
  77. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/upload.constants.ts +23 -0
  78. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/upload.controller.ts +109 -0
  79. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/upload.errors.ts +80 -0
  80. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/upload.module.ts +20 -0
  81. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/upload.reponsitory.ts +166 -0
  82. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/upload.service.ts +696 -0
  83. package/template-vp-monorepo-react-nestjs/apps/server/src/modules/upload/utils/object-key.ts +10 -0
  84. package/template-vp-monorepo-react-nestjs/apps/server/test/task-queue.integration.spec.ts +120 -0
  85. package/template-vp-monorepo-react-nestjs/apps/server/test/task-queue.processor.spec.ts +63 -0
  86. package/template-vp-monorepo-react-nestjs/apps/server/test/task-queue.service.spec.ts +106 -0
  87. package/template-vp-monorepo-react-nestjs/apps/web/.agents/rules/SVG/344/275/277/347/224/250.md +8 -0
  88. package/template-vp-monorepo-react-nestjs/apps/web/.agents/rules//345/274/271/347/252/227/347/273/204/344/273/266.md +4 -0
  89. package/template-vp-monorepo-react-nestjs/apps/web/.agents/rules//346/226/207/344/273/266/346/213/206/345/210/206.md +4 -0
  90. package/template-vp-monorepo-react-nestjs/apps/web/.agents/rules//347/273/204/344/273/266/345/221/275/345/220/215.md +3 -0
  91. package/template-vp-monorepo-react-nestjs/apps/web/.agents/rules//350/241/250/346/240/274/351/241/265/351/235/242.md +11 -0
  92. package/template-vp-monorepo-react-nestjs/apps/web/.agents/rules//351/241/265/351/235/242/346/216/245/345/217/243.md +3 -0
  93. package/template-vp-monorepo-react-nestjs/apps/web/.env.dev +1 -1
  94. package/template-vp-monorepo-react-nestjs/apps/web/AGENTS.md +16 -0
  95. package/template-vp-monorepo-react-nestjs/apps/web/README.MD +153 -0
  96. package/template-vp-monorepo-react-nestjs/apps/web/index.html +3 -2
  97. package/template-vp-monorepo-react-nestjs/apps/web/package.json +6 -1
  98. package/template-vp-monorepo-react-nestjs/apps/web/public/favicon.svg +9 -1
  99. package/template-vp-monorepo-react-nestjs/apps/web/src/App.module.css +5 -0
  100. package/template-vp-monorepo-react-nestjs/apps/web/src/App.tsx +16 -9
  101. package/template-vp-monorepo-react-nestjs/apps/web/src/api/auth.ts +9 -0
  102. package/template-vp-monorepo-react-nestjs/apps/web/src/assets/svg/draft.svg +4 -0
  103. package/template-vp-monorepo-react-nestjs/apps/web/src/components/DraftProTable/DraftProTable.module.css +78 -0
  104. package/template-vp-monorepo-react-nestjs/apps/web/src/components/DraftProTable/DraftProTable.tsx +99 -0
  105. package/template-vp-monorepo-react-nestjs/apps/web/src/components/DraftProTable/README.md +34 -0
  106. package/template-vp-monorepo-react-nestjs/apps/web/src/components/FullHeightProTable/FullHeightProTable.module.css +54 -0
  107. package/template-vp-monorepo-react-nestjs/apps/web/src/components/FullHeightProTable/FullHeightProTable.tsx +41 -0
  108. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Icon/svg-icon/README.md +37 -0
  109. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Icon/svg-icon/SvgIcon.tsx +27 -0
  110. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Loading/PageLoading.module.css +7 -0
  111. package/template-vp-monorepo-react-nestjs/apps/web/src/components/Loading/PageLoading.tsx +2 -1
  112. package/template-vp-monorepo-react-nestjs/apps/web/src/config/theme.ts +20 -0
  113. package/template-vp-monorepo-react-nestjs/apps/web/src/layouts/BasicLayout.module.css +17 -0
  114. package/template-vp-monorepo-react-nestjs/apps/web/src/layouts/BasicLayout.tsx +106 -0
  115. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/i18n/index.module.css +23 -0
  116. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/i18n/index.tsx +53 -0
  117. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/components/ProjectFormDialog.tsx +132 -0
  118. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/config/columns.tsx +121 -0
  119. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/config/index.ts +77 -0
  120. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/draft/components/DraftProjectFormDialog.tsx +140 -0
  121. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/draft/config/columns.tsx +127 -0
  122. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/draft/config/index.ts +39 -0
  123. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/draft/config/projects.ts +48 -0
  124. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/draft/index.module.css +49 -0
  125. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/draft/index.tsx +163 -0
  126. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/index.module.css +53 -0
  127. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/examples/pro-table/index.tsx +135 -0
  128. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/home/index.module.css +23 -0
  129. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/home/index.tsx +26 -43
  130. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/login/api.ts +11 -0
  131. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/login/index.tsx +183 -0
  132. package/template-vp-monorepo-react-nestjs/apps/web/src/pages/login/login.css +164 -0
  133. package/template-vp-monorepo-react-nestjs/apps/web/src/router/index.tsx +36 -12
  134. package/template-vp-monorepo-react-nestjs/apps/web/src/styles/index.css +11 -4
  135. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/request/core/index.ts +55 -47
  136. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/request/index.ts +10 -5
  137. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/storage/cookie.ts +50 -0
  138. package/template-vp-monorepo-react-nestjs/apps/web/src/utils/storage/session.ts +33 -0
  139. package/template-vp-monorepo-react-nestjs/apps/web/test/draft-projects.spec.ts +89 -0
  140. package/template-vp-monorepo-react-nestjs/apps/web/test/request.spec.ts +145 -0
  141. package/template-vp-monorepo-react-nestjs/apps/web/test/storage.spec.ts +108 -0
  142. package/template-vp-monorepo-react-nestjs/apps/web/test/tsconfig.json +7 -0
  143. package/template-vp-monorepo-react-nestjs/apps/web/tsconfig.json +1 -1
  144. package/template-vp-monorepo-react-nestjs/apps/web/vite.config.ts +7 -0
  145. package/template-vp-monorepo-react-nestjs/apps/web-vue/tsconfig.tsbuildinfo +1 -0
  146. package/template-vp-monorepo-react-nestjs/docker-compose.yml +19 -0
  147. package/template-vp-monorepo-react-nestjs/mise.toml +1 -1
  148. package/template-vp-monorepo-react-nestjs/package.json +1 -6
  149. package/template-vp-monorepo-react-nestjs/pnpm-workspace.yaml +9 -1
  150. package/template-vp-react/.agents/rules/SVG/344/275/277/347/224/250.md +8 -0
  151. package/template-vp-react/AGENTS.md +11 -0
  152. package/template-vp-react/commitlint.config.js +0 -0
  153. package/template-vp-react/package.json +21 -26
  154. package/template-vp-react/pnpm-workspace.yaml +6 -0
  155. package/template-vp-react/src/assets/svg/draft.svg +4 -0
  156. package/template-vp-react/src/components/Icon/svg-icon/README.md +37 -0
  157. package/template-vp-react/src/components/Icon/svg-icon/SvgIcon.tsx +27 -0
  158. package/template-vp-react/src/utils/request/index.ts +18 -5
  159. package/template-vp-react/tsconfig.json +2 -3
  160. package/template-vp-react/vite.config.ts +2 -0
  161. package/template-vp-react-shadcn/.agents/rules/SVG/344/275/277/347/224/250.md +8 -0
  162. package/template-vp-react-shadcn/.vscode/settings.json +2 -2
  163. package/template-vp-react-shadcn/{agents.md → AGENTS.md} +12 -2
  164. package/template-vp-react-shadcn/README.md +41 -0
  165. package/template-vp-react-shadcn/commitlint.config.js +1 -1
  166. package/template-vp-react-shadcn/components.json +1 -1
  167. package/template-vp-react-shadcn/package.json +25 -32
  168. package/template-vp-react-shadcn/pnpm-workspace.yaml +10 -0
  169. package/template-vp-react-shadcn/src/App.tsx +10 -10
  170. package/template-vp-react-shadcn/src/assets/svg/draft.svg +4 -0
  171. package/template-vp-react-shadcn/src/components/Icon/svg-icon/README.md +37 -0
  172. package/template-vp-react-shadcn/src/components/Icon/svg-icon/SvgIcon.tsx +27 -0
  173. package/template-vp-react-shadcn/src/components/Loading/PageLoading.tsx +4 -4
  174. package/template-vp-react-shadcn/src/components/Player/VideoJS/index.tsx +94 -78
  175. package/template-vp-react-shadcn/src/components/Player/index.ts +1 -1
  176. package/template-vp-react-shadcn/src/components/ui/button.tsx +25 -32
  177. package/template-vp-react-shadcn/src/components/ui/spinner.tsx +8 -7
  178. package/template-vp-react-shadcn/src/components/ui/toast.tsx +229 -0
  179. package/template-vp-react-shadcn/src/lib/utils.ts +3 -3
  180. package/template-vp-react-shadcn/src/main.tsx +5 -4
  181. package/template-vp-react-shadcn/src/pages/home/index.tsx +43 -35
  182. package/template-vp-react-shadcn/src/router/index.tsx +15 -15
  183. package/template-vp-react-shadcn/src/styles/index.css +4 -4
  184. package/template-vp-react-shadcn/src/styles/shadcn.css +2 -2
  185. package/template-vp-react-shadcn/src/utils/env/index.tsx +2 -2
  186. package/template-vp-react-shadcn/src/utils/request/alova-core/index.ts +102 -30
  187. package/template-vp-react-shadcn/src/utils/request/alova-core/utils.ts +5 -2
  188. package/template-vp-react-shadcn/src/utils/request/index.ts +32 -19
  189. package/template-vp-react-shadcn/src/utils/request/readme.md +41 -38
  190. package/template-vp-react-shadcn/tsconfig.json +2 -3
  191. package/template-vp-react-shadcn/vite.config.ts +29 -15
  192. package/template-vp-vue-eslint-vapor/package.json +26 -33
  193. package/template-vp-vue-eslint-vapor/pnpm-workspace.yaml +29 -1
  194. package/template-vue-vp-eslint/README.md +3 -10
  195. package/template-vue-vp-eslint/package.json +27 -34
  196. package/template-vue-vp-eslint/pnpm-workspace.yaml +27 -2
  197. package/template-vue-vp-eslint/src/layout/default/index.vue +4 -3
  198. package/dist/index.mjs +0 -422
  199. package/template-vp-monorepo-react-nestjs/.agents/auth.config.ts +0 -0
  200. package/template-vp-monorepo-react-nestjs/.spaces/server/todo.md +0 -991
  201. package/template-vp-monorepo-react-nestjs/apps/server/README.md +0 -3
  202. package/template-vp-react-shadcn/.oxfmtrc.jsonc +0 -8
  203. package/template-vp-react-shadcn/.oxlintrc.jsonc +0 -3
  204. package/template-vp-react-shadcn/src/components/ui/sonner.tsx +0 -43
@@ -0,0 +1,177 @@
1
+ # 企业、项目与菜单权限管理实施计划
2
+
3
+ ## 一、目标与业务边界
4
+
5
+ 在现有 React、NestJS、Drizzle、PostgreSQL 和 Redis 基础上,完成**企业管理 → 项目管理 → 成员与角色 → 菜单授权 → 页面、按钮与接口鉴权 → 操作审计**的完整闭环。
6
+
7
+ 采用已确认的业务规则:
8
+
9
+ | 身份 | 默认管理范围 | 权限边界 |
10
+ | --- | --- | --- |
11
+ | 平台管理员 | 企业开通与启停、全局账号、平台角色、全局菜单、平台审计 | 进入企业内部仍需企业成员身份和相应授权 |
12
+ | 企业管理员 | 企业资料、成员、角色、本企业全部项目及审计 | 自动拥有本企业所有项目的管理权限 |
13
+ | 项目管理员 | 当前项目资料、成员、角色及审计 | 不获得企业管理权限或其他项目权限 |
14
+ | 普通成员 | 当前企业、项目角色授予的功能 | 多个企业、项目之间分别授权 |
15
+
16
+ - 一个账号可以加入多个企业、多个项目;项目成员必须先是所属企业成员。
17
+ - 平台创建企业时指定首位企业管理员;企业管理员创建项目时指定项目管理员。
18
+ - 保留公开注册,补齐注册页面。企业管理员通过**完整账号**添加已注册用户;新账号不会自动加入企业。
19
+ - 企业、项目首期提供创建、编辑、启用和停用,不提供物理删除;项目不支持跨企业迁移。
20
+ - 保留现有 Cookie token+Bearer 请求方式。Cookie 工具负责 Cookie,Local/Session 工具负责浏览器存储。
21
+ - 本期覆盖管理权限和基础审计;上传的企业、项目归属改造单列后续阶段。
22
+
23
+ ## 二、管理功能与菜单设计
24
+
25
+ ### 管理页面
26
+
27
+ | 工作空间 | 首期页面与操作 |
28
+ | --- | --- |
29
+ | 平台 | 企业列表与开通、企业启停、账号查询与启停、平台角色及人员授权、菜单管理、平台操作日志 |
30
+ | 企业 | 企业工作台、企业资料、成员管理、角色管理、项目列表与创建、项目启停、企业操作日志 |
31
+ | 项目 | 项目工作台、项目资料、成员管理、角色管理、项目操作日志 |
32
+
33
+ 列表提供搜索、筛选和分页;成员支持添加、停用、启用、移除与分配角色。企业只能查询自己的成员,添加账号不开放全平台用户列表。
34
+
35
+ 企业、项目角色支持自定义。内置管理员角色负责完整管理,内置普通成员角色默认只提供工作台和必要的工作空间入口,其他操作通过角色授权。
36
+
37
+ ### 菜单管理
38
+
39
+ 平台统一维护适用于平台、企业、项目的三套菜单树,企业和项目不保存独立菜单副本。
40
+
41
+ 菜单节点分为:
42
+
43
+ - **目录**:组织导航层级,不直接产生操作权限。
44
+ - **页面**:绑定前端已注册的 `routeKey` 和页面访问权限。
45
+ - **按钮/操作**:挂在页面下,绑定已实现的操作权限,例如添加成员、修改角色。
46
+
47
+ 支持新增、编辑、调整父级、排序、隐藏、启停及受约束的删除。名称、图标和排序可配置;组件、路径模板和权限标识来自代码中的功能目录。
48
+
49
+ 菜单编辑器只能选择已注册的页面和操作。新增业务页面仍需开发并发布对应代码,数据库不保存可执行组件路径。
50
+
51
+ 明确以下行为:
52
+
53
+ | 设置 | 导航表现 | 页面、按钮与接口 |
54
+ | --- | --- | --- |
55
+ | 隐藏 | 不显示导航入口 | 已授权用户仍可访问 |
56
+ | 停用 | 不显示入口 | 对应功能及下级功能均不可访问 |
57
+ | 未授权 | 不显示入口或操作 | 页面拒绝访问,接口拒绝执行 |
58
+
59
+ - 目录按可见子节点自动显示;按钮不进入导航。
60
+ - 校验循环父子关系、跨层级移动、重复页面绑定和未知权限标识。
61
+ - 有子节点或仍被角色授权引用的节点不能直接删除。
62
+ - 平台菜单、平台角色等恢复管理所需的入口受到保护,不能通过自身或祖先节点的操作使其失效。
63
+ - 角色授权树支持全选、半选;授予按钮权限时必须包含所属页面访问权限,取消页面权限时同步取消下级操作授权。
64
+
65
+ ## 三、数据、接口与权限实现
66
+
67
+ ### 数据模型
68
+
69
+ 新增以下数据组:
70
+
71
+ | 数据组 | 主要实体与约束 |
72
+ | --- | --- |
73
+ | 企业与项目 | `companies`、`projects`;项目必须属于企业,项目编码在企业内唯一 |
74
+ | 成员关系 | `company_members`、`project_members`;成员关系唯一,项目成员必须满足企业成员关系 |
75
+ | 角色授权 | `roles`、`user_roles`、`role_permissions`;角色绑定明确的平台、企业或项目作用域 |
76
+ | 功能与菜单 | `permissions`、`menus`;权限标识稳定且唯一,菜单和权限适用层级一致 |
77
+ | 操作审计 | `audit_logs`;记录操作者、作用域、操作、对象、变更摘要、时间和 requestId |
78
+
79
+ 角色使用 `scopeType`、`companyId`、`projectId` 表示归属,通过数据库约束限制合法组合。不同企业、项目可以创建同名角色。
80
+
81
+ 授权规则统一为:
82
+
83
+ - 同一作用域内,多角色权限取并集;首期不引入角色继承和显式拒绝规则。
84
+ - 企业管理员跨本企业项目的管理能力由统一授权逻辑计算,不批量复制项目角色。
85
+ - 普通角色不能授予操作者自身无权授予的权限;内置管理员身份只能由对应作用域的管理员委派。
86
+ - 移除企业成员时,事务内清理其企业角色、下属项目成员关系和项目角色。
87
+ - 不允许通过移除成员、停用账号或撤销角色,使仍启用的管理范围失去最后一名有效管理员;并发操作使用事务和锁保证这一点。
88
+ - 角色授权和菜单结构更新使用版本校验,过期提交返回冲突,避免覆盖其他管理员的修改。
89
+
90
+ ### 共享契约与接口
91
+
92
+ 接口请求、返回类型通过 `shared/types` 共享,通用方法通过 `shared/utils` 共享。核心作用域采用明确的联合类型:
93
+
94
+ ```ts
95
+ type AccessScope =
96
+ | { type: 'platform' }
97
+ | { type: 'company'; companyId: string }
98
+ | { type: 'project'; companyId: string; projectId: string }
99
+ ```
100
+
101
+ 新增 `AccessContext`,返回当前用户、已验证作用域、有效菜单树和权限标识集合。分页列表统一返回 `items、total、page、pageSize`,默认每页 20 条、最大 100 条。
102
+
103
+ 接口按作用域组织:
104
+
105
+ | 接口范围 | 用途 |
106
+ | --- | --- |
107
+ | `GET /workspaces` | 当前用户和可进入的工作空间;仅返回本人可见内容 |
108
+ | `/platform/*` | 平台企业管理、账号、角色、菜单、审计 |
109
+ | `/companies/:companyId/*` | 企业资料、成员、角色、可见项目与审计 |
110
+ | `/companies/:companyId/projects/:projectId/*` | 项目资料、成员、角色与审计 |
111
+ | 各作用域下的 `/access` | 获取当前作用域的菜单和权限上下文 |
112
+
113
+ 普通企业成员只能看到自己加入的项目;企业管理员可以看到本企业全部项目。
114
+
115
+ 沿用当前成功响应和统一异常模型,不新增一套响应包装。新增业务错误加入错误目录校验。
116
+
117
+ ### 后端鉴权
118
+
119
+ 请求依次完成:
120
+
121
+ **登录态校验 → 用户状态校验 → 作用域及成员校验 → 功能权限校验 → 资源归属校验。**
122
+
123
+ - URL 中的企业、项目 ID 只是查询目标,后端必须验证归属,不能作为授权依据。
124
+ - 管理接口声明作用域和所需权限;未声明访问策略的新接口默认拒绝。
125
+ - Repository 查询同时约束资源 ID 与企业、项目归属,更新和删除也遵循这一规则。
126
+ - 未登录或账号失效返回 401;作用域内权限不足返回 403;跨企业、跨项目资源与不存在资源统一返回 404。
127
+ - 首期不缓存后端授权结果,后续请求读取当前成员、角色和功能状态;撤权无需等待重新登录。
128
+ - 账号禁用同时接入已有的会话撤销能力。
129
+ - 当前数据库、Redis 测试接口移出默认应用入口,避免通过测试接口绕过管理权限。
130
+
131
+ 管理变更与成功审计记录在同一数据库事务中提交。平台查看平台事件;企业查看本企业及下属项目事件;项目查看当前项目事件。日志不记录密码、token 或完整敏感请求。
132
+
133
+ ### 前端接入
134
+
135
+ - 登录后进入工作空间入口,选择企业、项目或平台管理空间;没有企业的账号显示等待管理员添加的状态。
136
+ - 企业、项目 ID 放在路由中,刷新后能够恢复当前工作空间。
137
+ - 使用 React Router 的 loader 获取管理页面上下文,布局消费菜单,页面和按钮消费权限;不恢复已删除的 auth Provider/Guard 目录。
138
+ - 前端保留静态页面注册表,将服务端菜单映射到已注册页面,并提供 403、404 和无权限空状态。
139
+ - 页面 API 随页面存放,继续使用现有 alova 封装;弹窗遵循 `show/hide` 规范。
140
+ - 权限上下文不持久化、不使用请求缓存。业务缓存区分用户、企业和项目;切换工作空间取消旧请求并阻止迟到结果覆盖新页面。
141
+ - 路由切换、窗口重新激活、授权修改及收到 403 后刷新权限。退出、401 时清理 Cookie 和用户相关缓存。
142
+ - Local/Session 只保存最近选择、筛选条件等界面状态,不能用于判定权限。
143
+
144
+ ## 四、实施阶段与数据兼容
145
+
146
+ | 阶段 | 交付内容 | 阶段完成标准 |
147
+ | --- | --- | --- |
148
+ | 1. 契约与数据库 | 共享类型、权限目录、数据模型、迁移、内置角色和菜单种子 | 空库与现有数据库均可迁移,约束和重复初始化验证通过 |
149
+ | 2. 后端权限闭环 | 企业、项目、成员、角色、菜单接口,统一鉴权和审计 | 不依赖前端隐藏,也能阻止越权与跨作用域访问 |
150
+ | 3. 前端管理闭环 | 注册、工作空间切换、三级管理页面、菜单和角色授权 | 可完成“注册→加入企业→加入项目→角色授权→访问功能” |
151
+ | 4. 联调与交付 | 浏览器验收、数据库集成测试、迁移说明、接口文档和权限说明 | 正常流程及撤权、切换、并发等异常场景通过 |
152
+
153
+ 初始化与兼容规则:
154
+
155
+ - 首位平台管理员通过初始化命令指定一个已注册、有效的账号,不提供固定默认密码,也不自动提升第一个注册用户。
156
+ - 初始化命令可重复执行,但不能借重复执行给其他账号提权;种子更新不覆盖管理员已经调整的菜单和授权。
157
+ - 现有用户保持原账号和登录方式,不自动分配企业或项目。
158
+ - 现有上传数据继续按 `ownerId` 授权,本期不猜测归属、不迁移到默认企业,也不宣称上传已完成租户隔离。
159
+ - 使用可审阅的 Drizzle migration;上线顺序为备份、迁移、服务端、前端,并提供迁移失败处理说明。
160
+ - 保留工作区已有修改,实施时只调整本计划涉及的代码。
161
+
162
+ ## 五、验收标准与后续范围
163
+
164
+ 必须覆盖以下场景:
165
+
166
+ 1. **完整业务流程**:平台开通企业,用户注册并加入企业,管理员创建项目、添加成员和分配角色。
167
+ 2. **权限隔离**:同一用户在不同企业、项目拥有不同权限;平台管理员未经成员授权不能进入企业内部。
168
+ 3. **菜单一致性**:导航、直达页面、按钮和接口权限一致;隐藏与停用表现符合定义。
169
+ 4. **即时撤权**:角色撤销、成员停用或移除、企业或项目停用后,后续请求立即失去相应访问权。
170
+ 5. **切换与缓存**:快速切换企业、项目以及退出后换号,不出现旧数据、旧权限或旧请求覆盖。
171
+ 6. **管理约束**:重复成员、越权授予角色、删除引用中的菜单、循环菜单、并发移除最后管理员均被拒绝。
172
+ 7. **数据与审计**:跨作用域查询返回一致结果,成功变更有对应审计,日志中不存在密码和 token。
173
+ 8. **回归与迁移**:保留 Cookie/Storage 和请求层回归测试,验证旧用户登录、上传兼容及迁移重复执行。
174
+
175
+ 验证采用权限规则测试、真实 PostgreSQL/Redis 接口集成测试及 Playwright 关键流程测试;完成 `vp check`、相关测试和 shared、Web、Server 构建。跳过的集成测试不能计为通过。
176
+
177
+ 首期默认采用应用层作用域隔离和 RBAC,不引入部门组织树、字段级权限、审批流、SSO、外部协作者或企业独立菜单。上传归属改造放在下一阶段,沿用本期确定的企业、项目与权限契约。