@ai-partner-x/aiko-boot-cli 0.1.4

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 (389) hide show
  1. package/README.md +187 -0
  2. package/dist/cli.d.ts +2 -0
  3. package/dist/cli.js +30 -0
  4. package/dist/commands/add-api.d.ts +5 -0
  5. package/dist/commands/add-api.js +34 -0
  6. package/dist/commands/add-app.d.ts +5 -0
  7. package/dist/commands/add-app.js +34 -0
  8. package/dist/commands/add-feature.d.ts +5 -0
  9. package/dist/commands/add-feature.js +32 -0
  10. package/dist/commands/init.d.ts +7 -0
  11. package/dist/commands/init.js +42 -0
  12. package/dist/commands/list.d.ts +6 -0
  13. package/dist/commands/list.js +36 -0
  14. package/dist/core/framework-version.d.ts +8 -0
  15. package/dist/core/framework-version.js +40 -0
  16. package/dist/core/logger.d.ts +6 -0
  17. package/dist/core/logger.js +16 -0
  18. package/dist/core/project-config.d.ts +21 -0
  19. package/dist/core/project-config.js +17 -0
  20. package/dist/core/prompts.d.ts +5 -0
  21. package/dist/core/prompts.js +43 -0
  22. package/dist/core/template-utils.d.ts +1 -0
  23. package/dist/core/template-utils.js +42 -0
  24. package/dist/core/workspace.d.ts +10 -0
  25. package/dist/core/workspace.js +141 -0
  26. package/dist/index.d.ts +2 -0
  27. package/dist/index.js +2 -0
  28. package/dist/scaffold.d.ts +7 -0
  29. package/dist/scaffold.js +272 -0
  30. package/dist/usecases/add-api.usecase.d.ts +16 -0
  31. package/dist/usecases/add-api.usecase.js +87 -0
  32. package/dist/usecases/add-app.usecase.d.ts +16 -0
  33. package/dist/usecases/add-app.usecase.js +101 -0
  34. package/dist/usecases/add-feature.usecase.d.ts +15 -0
  35. package/dist/usecases/add-feature.usecase.js +566 -0
  36. package/dist/usecases/init-scaffold.usecase.d.ts +19 -0
  37. package/dist/usecases/init-scaffold.usecase.js +131 -0
  38. package/package.json +43 -0
  39. package/templates/api-base/app.config.ts +155 -0
  40. package/templates/api-base/package.json +55 -0
  41. package/templates/api-base/scripts/codegen.cjs +30 -0
  42. package/templates/api-base/scripts/codegen.ts +10 -0
  43. package/templates/api-base/src/controller/auth.controller.ts +160 -0
  44. package/templates/api-base/src/controller/menu.controller.ts +56 -0
  45. package/templates/api-base/src/controller/role.controller.ts +62 -0
  46. package/templates/api-base/src/controller/user.controller.ts +75 -0
  47. package/templates/api-base/src/dto/auth.dto.ts +31 -0
  48. package/templates/api-base/src/dto/menu.dto.ts +38 -0
  49. package/templates/api-base/src/dto/role.dto.ts +18 -0
  50. package/templates/api-base/src/dto/user.dto.ts +36 -0
  51. package/templates/api-base/src/entity/menu.entity.ts +35 -0
  52. package/templates/api-base/src/entity/role-menu.entity.ts +14 -0
  53. package/templates/api-base/src/entity/role.entity.ts +23 -0
  54. package/templates/api-base/src/entity/user-role.entity.ts +14 -0
  55. package/templates/api-base/src/entity/user.entity.ts +32 -0
  56. package/templates/api-base/src/mapper/menu.mapper.ts +7 -0
  57. package/templates/api-base/src/mapper/role-menu.mapper.ts +7 -0
  58. package/templates/api-base/src/mapper/role.mapper.ts +7 -0
  59. package/templates/api-base/src/mapper/user-role.mapper.ts +7 -0
  60. package/templates/api-base/src/mapper/user.mapper.ts +12 -0
  61. package/templates/api-base/src/scripts/init-db.ts +204 -0
  62. package/templates/api-base/src/server.ts +69 -0
  63. package/templates/api-base/src/service/auth.service.ts +144 -0
  64. package/templates/api-base/src/service/log.request.service.ts +72 -0
  65. package/templates/api-base/src/service/menu.service.ts +94 -0
  66. package/templates/api-base/src/service/role.service.ts +88 -0
  67. package/templates/api-base/src/service/user.service.ts +175 -0
  68. package/templates/api-base/src/utils/jwt.util.ts +39 -0
  69. package/templates/api-base/tsconfig.json +18 -0
  70. package/templates/feature-file/api/upload.controller.ts +97 -0
  71. package/templates/feature-log/api/docs/log-integration-guide.md +54 -0
  72. package/templates/feature-log/api/src/service/log.request.service.ts +112 -0
  73. package/templates/feature-log/api/src/service/log.service.ts +124 -0
  74. package/templates/feature-mq/api/src/controller/mq.controller.ts +35 -0
  75. package/templates/feature-mq/api/src/dto/mq.dto.ts +16 -0
  76. package/templates/feature-mq/api/src/service/mq.consumer.service.ts +26 -0
  77. package/templates/feature-redis/api/src/controller/cache.controller.ts +107 -0
  78. package/templates/feature-redis/api/src/dto/cache.dto.ts +24 -0
  79. package/templates/feature-redis/api/src/service/cache.service.ts +80 -0
  80. package/templates/scaffold-default/README.md +114 -0
  81. package/templates/scaffold-default/package.json +26 -0
  82. package/templates/scaffold-default/packages/admin/.env.dev +1 -0
  83. package/templates/scaffold-default/packages/admin/.env.prod +4 -0
  84. package/templates/scaffold-default/packages/admin/.env.stage +4 -0
  85. package/templates/scaffold-default/packages/admin/Dockerfile +37 -0
  86. package/templates/scaffold-default/packages/admin/README.MD +27 -0
  87. package/templates/scaffold-default/packages/admin/components.json +21 -0
  88. package/templates/scaffold-default/packages/admin/eslint.config.js +28 -0
  89. package/templates/scaffold-default/packages/admin/index.html +50 -0
  90. package/templates/scaffold-default/packages/admin/package.json +100 -0
  91. package/templates/scaffold-default/packages/admin/public/vite.svg +1 -0
  92. package/templates/scaffold-default/packages/admin/src/App.css +82 -0
  93. package/templates/scaffold-default/packages/admin/src/App.tsx +128 -0
  94. package/templates/scaffold-default/packages/admin/src/app.config.ts +3 -0
  95. package/templates/scaffold-default/packages/admin/src/components/admin-ui/data-table/data-table-pagination.tsx +148 -0
  96. package/templates/scaffold-default/packages/admin/src/components/admin-ui/data-table/data-table-sorter.tsx +50 -0
  97. package/templates/scaffold-default/packages/admin/src/components/admin-ui/data-table/index.tsx +266 -0
  98. package/templates/scaffold-default/packages/admin/src/components/admin-ui/editable-table.tsx +292 -0
  99. package/templates/scaffold-default/packages/admin/src/components/admin-ui/form/input-password.tsx +38 -0
  100. package/templates/scaffold-default/packages/admin/src/components/admin-ui/form/sign-in-form.tsx +118 -0
  101. package/templates/scaffold-default/packages/admin/src/components/admin-ui/layout/error-component.tsx +71 -0
  102. package/templates/scaffold-default/packages/admin/src/components/admin-ui/layout/header.tsx +162 -0
  103. package/templates/scaffold-default/packages/admin/src/components/admin-ui/layout/language-switcher.tsx +47 -0
  104. package/templates/scaffold-default/packages/admin/src/components/admin-ui/layout/layout.tsx +42 -0
  105. package/templates/scaffold-default/packages/admin/src/components/admin-ui/layout/loading-overlay.tsx +36 -0
  106. package/templates/scaffold-default/packages/admin/src/components/admin-ui/layout/shell-bar.tsx +232 -0
  107. package/templates/scaffold-default/packages/admin/src/components/admin-ui/layout/sidebar.tsx +193 -0
  108. package/templates/scaffold-default/packages/admin/src/components/admin-ui/layout/user-avatar.tsx +31 -0
  109. package/templates/scaffold-default/packages/admin/src/components/admin-ui/list-report.tsx +306 -0
  110. package/templates/scaffold-default/packages/admin/src/components/admin-ui/master-detail.tsx +382 -0
  111. package/templates/scaffold-default/packages/admin/src/components/admin-ui/notification/toaster.tsx +23 -0
  112. package/templates/scaffold-default/packages/admin/src/components/admin-ui/notification/undoable-notification.tsx +84 -0
  113. package/templates/scaffold-default/packages/admin/src/components/admin-ui/object-page.tsx +539 -0
  114. package/templates/scaffold-default/packages/admin/src/components/admin-ui/theme/theme-provider.tsx +160 -0
  115. package/templates/scaffold-default/packages/admin/src/components/admin-ui/theme/theme-select.tsx +129 -0
  116. package/templates/scaffold-default/packages/admin/src/components/admin-ui/theme/theme-toggle.tsx +90 -0
  117. package/templates/scaffold-default/packages/admin/src/components/ui/accordion.tsx +64 -0
  118. package/templates/scaffold-default/packages/admin/src/components/ui/alert-dialog.tsx +157 -0
  119. package/templates/scaffold-default/packages/admin/src/components/ui/alert.tsx +66 -0
  120. package/templates/scaffold-default/packages/admin/src/components/ui/aspect-ratio.tsx +9 -0
  121. package/templates/scaffold-default/packages/admin/src/components/ui/avatar.tsx +53 -0
  122. package/templates/scaffold-default/packages/admin/src/components/ui/badge.tsx +47 -0
  123. package/templates/scaffold-default/packages/admin/src/components/ui/breadcrumb.tsx +111 -0
  124. package/templates/scaffold-default/packages/admin/src/components/ui/button.tsx +59 -0
  125. package/templates/scaffold-default/packages/admin/src/components/ui/calendar.tsx +74 -0
  126. package/templates/scaffold-default/packages/admin/src/components/ui/card.tsx +92 -0
  127. package/templates/scaffold-default/packages/admin/src/components/ui/carousel.tsx +237 -0
  128. package/templates/scaffold-default/packages/admin/src/components/ui/chart.tsx +351 -0
  129. package/templates/scaffold-default/packages/admin/src/components/ui/checkbox.tsx +32 -0
  130. package/templates/scaffold-default/packages/admin/src/components/ui/collapsible.tsx +33 -0
  131. package/templates/scaffold-default/packages/admin/src/components/ui/command.tsx +182 -0
  132. package/templates/scaffold-default/packages/admin/src/components/ui/context-menu.tsx +252 -0
  133. package/templates/scaffold-default/packages/admin/src/components/ui/dialog.tsx +141 -0
  134. package/templates/scaffold-default/packages/admin/src/components/ui/drawer.tsx +130 -0
  135. package/templates/scaffold-default/packages/admin/src/components/ui/dropdown-menu.tsx +255 -0
  136. package/templates/scaffold-default/packages/admin/src/components/ui/form.tsx +166 -0
  137. package/templates/scaffold-default/packages/admin/src/components/ui/hover-card.tsx +42 -0
  138. package/templates/scaffold-default/packages/admin/src/components/ui/input-otp.tsx +77 -0
  139. package/templates/scaffold-default/packages/admin/src/components/ui/input.tsx +21 -0
  140. package/templates/scaffold-default/packages/admin/src/components/ui/label.tsx +22 -0
  141. package/templates/scaffold-default/packages/admin/src/components/ui/menubar.tsx +274 -0
  142. package/templates/scaffold-default/packages/admin/src/components/ui/navigation-menu.tsx +168 -0
  143. package/templates/scaffold-default/packages/admin/src/components/ui/pagination.tsx +127 -0
  144. package/templates/scaffold-default/packages/admin/src/components/ui/popover.tsx +48 -0
  145. package/templates/scaffold-default/packages/admin/src/components/ui/progress.tsx +29 -0
  146. package/templates/scaffold-default/packages/admin/src/components/ui/radio-group.tsx +45 -0
  147. package/templates/scaffold-default/packages/admin/src/components/ui/resizable.tsx +54 -0
  148. package/templates/scaffold-default/packages/admin/src/components/ui/scroll-area.tsx +58 -0
  149. package/templates/scaffold-default/packages/admin/src/components/ui/select.tsx +183 -0
  150. package/templates/scaffold-default/packages/admin/src/components/ui/separator.tsx +26 -0
  151. package/templates/scaffold-default/packages/admin/src/components/ui/sheet.tsx +139 -0
  152. package/templates/scaffold-default/packages/admin/src/components/ui/sidebar.tsx +740 -0
  153. package/templates/scaffold-default/packages/admin/src/components/ui/skeleton.tsx +13 -0
  154. package/templates/scaffold-default/packages/admin/src/components/ui/slider.tsx +63 -0
  155. package/templates/scaffold-default/packages/admin/src/components/ui/sonner.tsx +23 -0
  156. package/templates/scaffold-default/packages/admin/src/components/ui/switch.tsx +31 -0
  157. package/templates/scaffold-default/packages/admin/src/components/ui/table.tsx +114 -0
  158. package/templates/scaffold-default/packages/admin/src/components/ui/tabs.tsx +66 -0
  159. package/templates/scaffold-default/packages/admin/src/components/ui/textarea.tsx +18 -0
  160. package/templates/scaffold-default/packages/admin/src/components/ui/toggle-group.tsx +73 -0
  161. package/templates/scaffold-default/packages/admin/src/components/ui/toggle.tsx +45 -0
  162. package/templates/scaffold-default/packages/admin/src/components/ui/tooltip.tsx +59 -0
  163. package/templates/scaffold-default/packages/admin/src/hooks/use-mobile.ts +21 -0
  164. package/templates/scaffold-default/packages/admin/src/i18n.ts +20 -0
  165. package/templates/scaffold-default/packages/admin/src/index.tsx +19 -0
  166. package/templates/scaffold-default/packages/admin/src/layouts/menu-layout.tsx +211 -0
  167. package/templates/scaffold-default/packages/admin/src/layouts/tile-layout.tsx +355 -0
  168. package/templates/scaffold-default/packages/admin/src/lib/utils.ts +6 -0
  169. package/templates/scaffold-default/packages/admin/src/locales/en.json +68 -0
  170. package/templates/scaffold-default/packages/admin/src/locales/zh.json +68 -0
  171. package/templates/scaffold-default/packages/admin/src/pages/dashboard.tsx +12 -0
  172. package/templates/scaffold-default/packages/admin/src/pages/goods-receipt/CreatePage.tsx +302 -0
  173. package/templates/scaffold-default/packages/admin/src/pages/goods-receipt/EditPage.tsx +221 -0
  174. package/templates/scaffold-default/packages/admin/src/pages/goods-receipt/ListPage.tsx +283 -0
  175. package/templates/scaffold-default/packages/admin/src/pages/goods-receipt/ViewPage.tsx +280 -0
  176. package/templates/scaffold-default/packages/admin/src/pages/goods-receipt/index.ts +4 -0
  177. package/templates/scaffold-default/packages/admin/src/pages/home-page.tsx +244 -0
  178. package/templates/scaffold-default/packages/admin/src/pages/master-data/cost-centers/index.tsx +461 -0
  179. package/templates/scaffold-default/packages/admin/src/pages/master-data/currencies/index.tsx +255 -0
  180. package/templates/scaffold-default/packages/admin/src/pages/master-data/materials/ListPage.tsx +271 -0
  181. package/templates/scaffold-default/packages/admin/src/pages/master-data/materials/ViewPage.tsx +240 -0
  182. package/templates/scaffold-default/packages/admin/src/pages/master-data/materials/index.ts +2 -0
  183. package/templates/scaffold-default/packages/admin/src/pages/master-data/plants/ListPage.tsx +279 -0
  184. package/templates/scaffold-default/packages/admin/src/pages/master-data/plants/ViewPage.tsx +380 -0
  185. package/templates/scaffold-default/packages/admin/src/pages/master-data/plants/index.ts +2 -0
  186. package/templates/scaffold-default/packages/admin/src/pages/master-data/purchase-organizations/index.tsx +341 -0
  187. package/templates/scaffold-default/packages/admin/src/pages/master-data/units-of-measure/index.tsx +295 -0
  188. package/templates/scaffold-default/packages/admin/src/pages/master-data/vendors/ListPage.tsx +266 -0
  189. package/templates/scaffold-default/packages/admin/src/pages/master-data/vendors/ViewPage.tsx +274 -0
  190. package/templates/scaffold-default/packages/admin/src/pages/master-data/vendors/index.ts +2 -0
  191. package/templates/scaffold-default/packages/admin/src/pages/placeholder-page.tsx +13 -0
  192. package/templates/scaffold-default/packages/admin/src/pages/purchase-orders/ListPage.tsx +289 -0
  193. package/templates/scaffold-default/packages/admin/src/pages/purchase-orders/ViewPage.tsx +343 -0
  194. package/templates/scaffold-default/packages/admin/src/pages/purchase-orders/index.ts +2 -0
  195. package/templates/scaffold-default/packages/admin/src/pages/purchase-requisitions/CreatePage.tsx +398 -0
  196. package/templates/scaffold-default/packages/admin/src/pages/purchase-requisitions/EditPage.tsx +473 -0
  197. package/templates/scaffold-default/packages/admin/src/pages/purchase-requisitions/ListPage.tsx +307 -0
  198. package/templates/scaffold-default/packages/admin/src/pages/purchase-requisitions/ViewPage.tsx +304 -0
  199. package/templates/scaffold-default/packages/admin/src/pages/purchase-requisitions/constants.ts +51 -0
  200. package/templates/scaffold-default/packages/admin/src/pages/purchase-requisitions/index.ts +4 -0
  201. package/templates/scaffold-default/packages/admin/src/pages/reports/PurchaseOrderReport.tsx +312 -0
  202. package/templates/scaffold-default/packages/admin/src/pages/reports/PurchaseRequisitionReport.tsx +303 -0
  203. package/templates/scaffold-default/packages/admin/src/pages/reports/index.ts +2 -0
  204. package/templates/scaffold-default/packages/admin/src/pages/settings-page.tsx +335 -0
  205. package/templates/scaffold-default/packages/admin/src/providers/app-config.tsx +50 -0
  206. package/templates/scaffold-default/packages/admin/src/providers/auth-provider.ts +2 -0
  207. package/templates/scaffold-default/packages/admin/src/routes/auth.ts +9 -0
  208. package/templates/scaffold-default/packages/admin/src/routes/index.ts +85 -0
  209. package/templates/scaffold-default/packages/admin/src/routes/menu.ts +176 -0
  210. package/templates/scaffold-default/packages/admin/src/routes/modules/goods-receipt.ts +31 -0
  211. package/templates/scaffold-default/packages/admin/src/routes/modules/master-data.ts +41 -0
  212. package/templates/scaffold-default/packages/admin/src/routes/modules/purchase-orders.ts +27 -0
  213. package/templates/scaffold-default/packages/admin/src/routes/modules/purchase-requisitions.ts +39 -0
  214. package/templates/scaffold-default/packages/admin/src/routes/modules/reports.ts +33 -0
  215. package/templates/scaffold-default/packages/admin/src/routes/modules/settings.ts +19 -0
  216. package/templates/scaffold-default/packages/admin/src/routes/withSuspense.tsx +21 -0
  217. package/templates/scaffold-default/packages/admin/src/theme/amber.css +27 -0
  218. package/templates/scaffold-default/packages/admin/src/theme/blue.css +27 -0
  219. package/templates/scaffold-default/packages/admin/src/theme/default.css +75 -0
  220. package/templates/scaffold-default/packages/admin/src/theme/fiori.css +180 -0
  221. package/templates/scaffold-default/packages/admin/src/theme/green.css +27 -0
  222. package/templates/scaffold-default/packages/admin/src/theme/index.css +12 -0
  223. package/templates/scaffold-default/packages/admin/src/theme/rose.css +27 -0
  224. package/templates/scaffold-default/packages/admin/src/theme/violet.css +27 -0
  225. package/templates/scaffold-default/packages/admin/src/vite-env.d.ts +1 -0
  226. package/templates/scaffold-default/packages/admin/tsconfig.json +28 -0
  227. package/templates/scaffold-default/packages/admin/tsconfig.node.json +21 -0
  228. package/templates/scaffold-default/packages/admin/vite.config.ts +26 -0
  229. package/templates/scaffold-default/packages/api/.eslintrc.json +6 -0
  230. package/templates/scaffold-default/packages/api/.swcrc +17 -0
  231. package/templates/scaffold-default/packages/api/app.config.ts +163 -0
  232. package/templates/scaffold-default/packages/api/docs/api-document.md +497 -0
  233. package/templates/scaffold-default/packages/api/docs/final-completion-report.md +565 -0
  234. package/templates/scaffold-default/packages/api/docs/permission-integration-summary.md +432 -0
  235. package/templates/scaffold-default/packages/api/examples/security/README.md +664 -0
  236. package/templates/scaffold-default/packages/api/examples/security/complete/.env.example +26 -0
  237. package/templates/scaffold-default/packages/api/examples/security/complete/PROJECT_STRUCTURE.md +220 -0
  238. package/templates/scaffold-default/packages/api/examples/security/complete/README.md +847 -0
  239. package/templates/scaffold-default/packages/api/examples/security/complete/app.config.ts +69 -0
  240. package/templates/scaffold-default/packages/api/examples/security/complete/app.ts +63 -0
  241. package/templates/scaffold-default/packages/api/examples/security/complete/controller/auth.controller.ts +131 -0
  242. package/templates/scaffold-default/packages/api/examples/security/complete/controller/index.ts +4 -0
  243. package/templates/scaffold-default/packages/api/examples/security/complete/controller/permission.controller.ts +41 -0
  244. package/templates/scaffold-default/packages/api/examples/security/complete/controller/role.controller.ts +53 -0
  245. package/templates/scaffold-default/packages/api/examples/security/complete/controller/user.controller.ts +53 -0
  246. package/templates/scaffold-default/packages/api/examples/security/complete/dto/change-password.dto.ts +10 -0
  247. package/templates/scaffold-default/packages/api/examples/security/complete/dto/create-permission.dto.ts +14 -0
  248. package/templates/scaffold-default/packages/api/examples/security/complete/dto/create-role.dto.ts +11 -0
  249. package/templates/scaffold-default/packages/api/examples/security/complete/dto/create-user.dto.ts +15 -0
  250. package/templates/scaffold-default/packages/api/examples/security/complete/dto/index.ts +7 -0
  251. package/templates/scaffold-default/packages/api/examples/security/complete/dto/login.dto.ts +10 -0
  252. package/templates/scaffold-default/packages/api/examples/security/complete/dto/oauth-profile.dto.ts +7 -0
  253. package/templates/scaffold-default/packages/api/examples/security/complete/dto/register.dto.ts +17 -0
  254. package/templates/scaffold-default/packages/api/examples/security/complete/entity/index.ts +6 -0
  255. package/templates/scaffold-default/packages/api/examples/security/complete/entity/oauth-account.entity.ts +39 -0
  256. package/templates/scaffold-default/packages/api/examples/security/complete/entity/permission.entity.ts +31 -0
  257. package/templates/scaffold-default/packages/api/examples/security/complete/entity/role-permission.entity.ts +19 -0
  258. package/templates/scaffold-default/packages/api/examples/security/complete/entity/role.entity.ts +25 -0
  259. package/templates/scaffold-default/packages/api/examples/security/complete/entity/user-role.entity.ts +19 -0
  260. package/templates/scaffold-default/packages/api/examples/security/complete/entity/user.entity.ts +46 -0
  261. package/templates/scaffold-default/packages/api/examples/security/complete/init.sql +81 -0
  262. package/templates/scaffold-default/packages/api/examples/security/complete/middleware/auth.interceptor.ts +39 -0
  263. package/templates/scaffold-default/packages/api/examples/security/complete/middleware/index.ts +2 -0
  264. package/templates/scaffold-default/packages/api/examples/security/complete/middleware/permission.interceptor.ts +61 -0
  265. package/templates/scaffold-default/packages/api/examples/security/complete/package.json +54 -0
  266. package/templates/scaffold-default/packages/api/examples/security/complete/seed.sql +42 -0
  267. package/templates/scaffold-default/packages/api/examples/security/complete/service/auth.service.ts +41 -0
  268. package/templates/scaffold-default/packages/api/examples/security/complete/service/index.ts +5 -0
  269. package/templates/scaffold-default/packages/api/examples/security/complete/service/oauth.service.ts +82 -0
  270. package/templates/scaffold-default/packages/api/examples/security/complete/service/permission.service.ts +113 -0
  271. package/templates/scaffold-default/packages/api/examples/security/complete/service/role.service.ts +85 -0
  272. package/templates/scaffold-default/packages/api/examples/security/complete/service/user.service.ts +132 -0
  273. package/templates/scaffold-default/packages/api/examples/security/complete/tests/TEST_REPORT.md +318 -0
  274. package/templates/scaffold-default/packages/api/examples/security/complete/tests/generate-report.js +335 -0
  275. package/templates/scaffold-default/packages/api/examples/security/complete/tests/helpers/api-helpers.ts +116 -0
  276. package/templates/scaffold-default/packages/api/examples/security/complete/tests/helpers/index.ts +2 -0
  277. package/templates/scaffold-default/packages/api/examples/security/complete/tests/helpers/test-helpers.ts +129 -0
  278. package/templates/scaffold-default/packages/api/examples/security/complete/tests/integration/auth.api.test.ts +429 -0
  279. package/templates/scaffold-default/packages/api/examples/security/complete/tests/integration/role.api.test.ts +400 -0
  280. package/templates/scaffold-default/packages/api/examples/security/complete/tests/integration/user.api.test.ts +459 -0
  281. package/templates/scaffold-default/packages/api/examples/security/complete/tests/jest.config.js +40 -0
  282. package/templates/scaffold-default/packages/api/examples/security/complete/tests/run-all-tests.js +135 -0
  283. package/templates/scaffold-default/packages/api/examples/security/complete/tests/run-tests.js +109 -0
  284. package/templates/scaffold-default/packages/api/examples/security/complete/tests/setup.ts +19 -0
  285. package/templates/scaffold-default/packages/api/examples/security/complete/tests/unit/auth.service.test.ts +199 -0
  286. package/templates/scaffold-default/packages/api/examples/security/complete/tests/unit/permission.service.test.ts +377 -0
  287. package/templates/scaffold-default/packages/api/examples/security/complete/tests/unit/user.service.test.ts +288 -0
  288. package/templates/scaffold-default/packages/api/examples/security/complete/tsconfig.json +35 -0
  289. package/templates/scaffold-default/packages/api/examples/security/jwt/README.md +424 -0
  290. package/templates/scaffold-default/packages/api/examples/security/local/README.md +499 -0
  291. package/templates/scaffold-default/packages/api/examples/security/oauth2/README.md +637 -0
  292. package/templates/scaffold-default/packages/api/examples/security/permission/README.md +943 -0
  293. package/templates/scaffold-default/packages/api/examples/security/session/README.md +753 -0
  294. package/templates/scaffold-default/packages/api/package.json +63 -0
  295. package/templates/scaffold-default/packages/api/scripts/codegen.cjs +29 -0
  296. package/templates/scaffold-default/packages/api/scripts/codegen.ts +9 -0
  297. package/templates/scaffold-default/packages/api/src/config/security-auto-configuration.ts +75 -0
  298. package/templates/scaffold-default/packages/api/src/controller/auth.controller.ts +109 -0
  299. package/templates/scaffold-default/packages/api/src/controller/cache.controller.ts +106 -0
  300. package/templates/scaffold-default/packages/api/src/controller/menu.controller.ts +86 -0
  301. package/templates/scaffold-default/packages/api/src/controller/mq.controller.ts +35 -0
  302. package/templates/scaffold-default/packages/api/src/controller/role.controller.ts +100 -0
  303. package/templates/scaffold-default/packages/api/src/controller/upload.controller.ts +83 -0
  304. package/templates/scaffold-default/packages/api/src/controller/user.controller.ts +102 -0
  305. package/templates/scaffold-default/packages/api/src/dto/auth.dto.ts +30 -0
  306. package/templates/scaffold-default/packages/api/src/dto/cache.dto.ts +24 -0
  307. package/templates/scaffold-default/packages/api/src/dto/menu.dto.ts +37 -0
  308. package/templates/scaffold-default/packages/api/src/dto/mq.dto.ts +16 -0
  309. package/templates/scaffold-default/packages/api/src/dto/role.dto.ts +16 -0
  310. package/templates/scaffold-default/packages/api/src/dto/user.dto.ts +35 -0
  311. package/templates/scaffold-default/packages/api/src/entity/menu.entity.ts +34 -0
  312. package/templates/scaffold-default/packages/api/src/entity/role-menu.entity.ts +13 -0
  313. package/templates/scaffold-default/packages/api/src/entity/role.entity.ts +22 -0
  314. package/templates/scaffold-default/packages/api/src/entity/user-role.entity.ts +13 -0
  315. package/templates/scaffold-default/packages/api/src/entity/user.entity.ts +31 -0
  316. package/templates/scaffold-default/packages/api/src/mapper/menu.mapper.ts +6 -0
  317. package/templates/scaffold-default/packages/api/src/mapper/role-menu.mapper.ts +6 -0
  318. package/templates/scaffold-default/packages/api/src/mapper/role.mapper.ts +6 -0
  319. package/templates/scaffold-default/packages/api/src/mapper/user-role.mapper.ts +6 -0
  320. package/templates/scaffold-default/packages/api/src/mapper/user.mapper.ts +11 -0
  321. package/templates/scaffold-default/packages/api/src/scripts/assign-role.ts +41 -0
  322. package/templates/scaffold-default/packages/api/src/scripts/check-user-role.ts +28 -0
  323. package/templates/scaffold-default/packages/api/src/scripts/check-users.mjs +44 -0
  324. package/templates/scaffold-default/packages/api/src/scripts/demo-permissions.mjs +418 -0
  325. package/templates/scaffold-default/packages/api/src/scripts/init-db.ts +166 -0
  326. package/templates/scaffold-default/packages/api/src/scripts/reset-admin-password.mjs +70 -0
  327. package/templates/scaffold-default/packages/api/src/scripts/reset-password.ts +31 -0
  328. package/templates/scaffold-default/packages/api/src/scripts/simple-reset-admin.mjs +39 -0
  329. package/templates/scaffold-default/packages/api/src/scripts/test-db.ts +36 -0
  330. package/templates/scaffold-default/packages/api/src/scripts/test-di.ts +45 -0
  331. package/templates/scaffold-default/packages/api/src/scripts/test-permissions.mjs +551 -0
  332. package/templates/scaffold-default/packages/api/src/scripts/update-admin-password.mjs +56 -0
  333. package/templates/scaffold-default/packages/api/src/scripts/user-roles.ts +28 -0
  334. package/templates/scaffold-default/packages/api/src/server.ts +38 -0
  335. package/templates/scaffold-default/packages/api/src/service/auth.service.ts +165 -0
  336. package/templates/scaffold-default/packages/api/src/service/cache.service.ts +80 -0
  337. package/templates/scaffold-default/packages/api/src/service/log.request.service.ts +158 -0
  338. package/templates/scaffold-default/packages/api/src/service/log.service.ts +123 -0
  339. package/templates/scaffold-default/packages/api/src/service/menu.service.ts +94 -0
  340. package/templates/scaffold-default/packages/api/src/service/mq.consumer.service.ts +26 -0
  341. package/templates/scaffold-default/packages/api/src/service/role.service.ts +88 -0
  342. package/templates/scaffold-default/packages/api/src/service/user.service.ts +195 -0
  343. package/templates/scaffold-default/packages/api/src/types/sqljs.d.ts +18 -0
  344. package/templates/scaffold-default/packages/api/src/utils/auth.utils.js +0 -0
  345. package/templates/scaffold-default/packages/api/src/utils/jwt.util.ts +29 -0
  346. package/templates/scaffold-default/packages/api/tsconfig.json +17 -0
  347. package/templates/scaffold-default/packages/api/tsup.config.ts +14 -0
  348. package/templates/scaffold-default/packages/api/uploads/.gitkeep +0 -0
  349. package/templates/scaffold-default/packages/core/package.json +28 -0
  350. package/templates/scaffold-default/packages/core/src/auth/auth-client-middleware.ts +22 -0
  351. package/templates/scaffold-default/packages/core/src/auth/auth-constants.ts +6 -0
  352. package/templates/scaffold-default/packages/core/src/auth/auth-service.ts +65 -0
  353. package/templates/scaffold-default/packages/core/src/auth/backend-auth-provider.ts +149 -0
  354. package/templates/scaffold-default/packages/core/src/auth/default-auth-provider.ts +38 -0
  355. package/templates/scaffold-default/packages/core/src/auth/index.ts +12 -0
  356. package/templates/scaffold-default/packages/core/src/auth/types.ts +38 -0
  357. package/templates/scaffold-default/packages/core/src/authorization/authorization-client-middleware.ts +38 -0
  358. package/templates/scaffold-default/packages/core/src/authorization/authorization-config.ts +13 -0
  359. package/templates/scaffold-default/packages/core/src/authorization/authorization-provider.tsx +116 -0
  360. package/templates/scaffold-default/packages/core/src/authorization/default-authorization-provider.ts +26 -0
  361. package/templates/scaffold-default/packages/core/src/authorization/index.ts +15 -0
  362. package/templates/scaffold-default/packages/core/src/authorization/types.ts +42 -0
  363. package/templates/scaffold-default/packages/core/src/index.ts +3 -0
  364. package/templates/scaffold-default/packages/core/src/utils/promise-result-cache.ts +18 -0
  365. package/templates/scaffold-default/packages/core/tsconfig.json +19 -0
  366. package/templates/scaffold-default/packages/mobile/README.md +56 -0
  367. package/templates/scaffold-default/packages/mobile/index.html +13 -0
  368. package/templates/scaffold-default/packages/mobile/package.json +28 -0
  369. package/templates/scaffold-default/packages/mobile/postcss.config.mjs +7 -0
  370. package/templates/scaffold-default/packages/mobile/src/App.tsx +5 -0
  371. package/templates/scaffold-default/packages/mobile/src/app/globals.css +1 -0
  372. package/templates/scaffold-default/packages/mobile/src/components/LoginForm.tsx +83 -0
  373. package/templates/scaffold-default/packages/mobile/src/hooks/index.ts +5 -0
  374. package/templates/scaffold-default/packages/mobile/src/lib/utils.ts +7 -0
  375. package/templates/scaffold-default/packages/mobile/src/main.tsx +19 -0
  376. package/templates/scaffold-default/packages/mobile/src/pages/HomePage.tsx +41 -0
  377. package/templates/scaffold-default/packages/mobile/src/pages/LoginPage.tsx +24 -0
  378. package/templates/scaffold-default/packages/mobile/src/pages/index.ts +2 -0
  379. package/templates/scaffold-default/packages/mobile/src/routes/ProtectedRoute.tsx +35 -0
  380. package/templates/scaffold-default/packages/mobile/src/routes/index.tsx +24 -0
  381. package/templates/scaffold-default/packages/mobile/src/routes/routes.ts +11 -0
  382. package/templates/scaffold-default/packages/mobile/src/types/index.ts +5 -0
  383. package/templates/scaffold-default/packages/mobile/src/vite-env.d.ts +1 -0
  384. package/templates/scaffold-default/packages/mobile/tsconfig.json +23 -0
  385. package/templates/scaffold-default/packages/mobile/tsconfig.node.json +11 -0
  386. package/templates/scaffold-default/packages/mobile/vite.config.ts +20 -0
  387. package/templates/scaffold-default/pnpm-workspace.yaml +2 -0
  388. package/templates/scaffold-default/scripts/postinstall.cjs +42 -0
  389. package/templates/scaffold-default/scripts/rebuild-sqlite.cjs +23 -0
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * 简单脚本:重新初始化数据库以设置admin123密码
5
+ */
6
+
7
+ const { execSync } = await import('child_process');
8
+
9
+ async function simpleReset() {
10
+ try {
11
+ console.log('🔄 Re-initializing database with admin123 password...');
12
+ console.log('⏰ This will take about 10-15 seconds...');
13
+
14
+ const result = execSync('node --import @swc-node/register/esm-register src/scripts/init-db.ts', {
15
+ cwd: process.cwd(),
16
+ stdio: 'inherit',
17
+ timeout: 30000
18
+ });
19
+
20
+ if (result.status === 0) {
21
+ console.log('');
22
+ console.log('🎉 Database initialization completed successfully!');
23
+ console.log('🎉 Admin password has been set to: admin123');
24
+ console.log('🎉 You can now login with: admin / admin123');
25
+ console.log('');
26
+ console.log('🔐 Please restart the server for changes to take effect.');
27
+ console.log('');
28
+ } else {
29
+ console.error('❌ Database initialization failed with code:', result.status);
30
+ console.error('Error output:', result.stderr);
31
+ process.exit(1);
32
+ }
33
+ } catch (error) {
34
+ console.error('❌ Error during reset:', error);
35
+ process.exit(1);
36
+ }
37
+ }
38
+
39
+ simpleReset();
@@ -0,0 +1,36 @@
1
+ import 'reflect-metadata';
2
+ import { fileURLToPath } from 'url';
3
+ import { dirname, join } from 'path';
4
+ import bcrypt from 'bcryptjs';
5
+
6
+ const __dirname = dirname(fileURLToPath(import.meta.url));
7
+ const dbPath = join(__dirname, '../../data/app.db');
8
+
9
+ import { createKyselyDatabase, getKyselyDatabase } from '@ai-partner-x/aiko-boot-starter-orm';
10
+
11
+ async function test() {
12
+ console.log('Testing database connection...');
13
+
14
+ await createKyselyDatabase({
15
+ type: 'sqlite',
16
+ filename: dbPath,
17
+ });
18
+
19
+ const db = getKyselyDatabase();
20
+
21
+ const user = await db.selectFrom('sys_user').where('user_name', '=', 'admin').selectAll().executeTakeFirst();
22
+
23
+ if (user) {
24
+ console.log('User found:', user.user_name);
25
+ console.log('Password hash:', user.password_hash?.substring(0, 20) + '...');
26
+
27
+ const isValid = await bcrypt.compare('admin123', user.password_hash || '');
28
+ console.log('Password valid:', isValid);
29
+ } else {
30
+ console.log('User not found');
31
+ }
32
+
33
+ process.exit(0);
34
+ }
35
+
36
+ test().catch(console.error);
@@ -0,0 +1,45 @@
1
+ import 'reflect-metadata';
2
+ import { fileURLToPath } from 'url';
3
+ import { dirname, join } from 'path';
4
+ import { createApp, Container, injectAutowiredProperties, getAutowiredProperties } from '@ai-partner-x/aiko-boot';
5
+ import { AuthService } from '../service/auth.service.js';
6
+ import { UserMapper } from '../mapper/user.mapper.js';
7
+
8
+ const __dirname = dirname(fileURLToPath(import.meta.url));
9
+
10
+ async function test() {
11
+ console.log('Creating app context...');
12
+ const app = await createApp({ srcDir: __dirname });
13
+ await app.run();
14
+
15
+ console.log('Testing AuthService dependency injection...');
16
+
17
+ try {
18
+ const authService = Container.resolve(AuthService);
19
+ console.log('AuthService resolved:', authService);
20
+ console.log('AuthService constructor:', authService.constructor);
21
+ console.log('AuthService constructor name:', authService.constructor.name);
22
+
23
+ const autowiredProps = getAutowiredProperties(authService.constructor);
24
+ console.log('Autowired properties:', autowiredProps);
25
+
26
+ console.log('AuthService.userMapper:', authService.userMapper);
27
+ console.log('AuthService.userRoleMapper:', authService.userRoleMapper);
28
+ console.log('AuthService.roleMapper:', authService.roleMapper);
29
+ console.log('AuthService.roleMenuMapper:', authService.roleMenuMapper);
30
+ console.log('AuthService.menuMapper:', authService.menuMapper);
31
+
32
+ if (authService.login) {
33
+ console.log('AuthService.login method exists');
34
+ } else {
35
+ console.log('AuthService.login method does NOT exist');
36
+ }
37
+ } catch (e: any) {
38
+ console.error('Failed to resolve AuthService:', e.message);
39
+ console.error(e.stack);
40
+ }
41
+
42
+ process.exit(0);
43
+ }
44
+
45
+ test().catch(console.error);
@@ -0,0 +1,551 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * 权限控制自动化测试脚本
5
+ *
6
+ * 测试API、方法、按钮级别的权限控制功能
7
+ */
8
+
9
+ import http from 'http';
10
+
11
+ // 配置
12
+ const BASE_URL = 'http://localhost:3001/api';
13
+ const TEST_TIMEOUT = 5000;
14
+
15
+ // 颜色输出
16
+ const colors = {
17
+ reset: '\x1b[0m',
18
+ bright: '\x1b[1m',
19
+ red: '\x1b[31m',
20
+ green: '\x1b[32m',
21
+ yellow: '\x1b[33m',
22
+ blue: '\x1b[34m',
23
+ magenta: '\x1b[35m',
24
+ cyan: '\x1b[36m',
25
+ };
26
+
27
+ // 测试结果统计
28
+ const testResults = {
29
+ total: 0,
30
+ passed: 0,
31
+ failed: 0,
32
+ skipped: 0,
33
+ };
34
+
35
+ /**
36
+ * HTTP请求工具函数
37
+ */
38
+ function makeRequest(options) {
39
+ return new Promise((resolve, reject) => {
40
+ const url = new URL(options.url || `${BASE_URL}${options.path}`);
41
+
42
+ const requestOptions = {
43
+ hostname: url.hostname,
44
+ port: url.port,
45
+ path: url.pathname + url.search,
46
+ method: options.method || 'GET',
47
+ headers: {
48
+ 'Content-Type': 'application/json',
49
+ ...(options.headers || {}),
50
+ },
51
+ };
52
+
53
+ const req = http.request(requestOptions, (res) => {
54
+ let data = '';
55
+ res.on('data', (chunk) => {
56
+ data += chunk;
57
+ });
58
+ res.on('end', () => {
59
+ try {
60
+ const result = {
61
+ statusCode: res.statusCode,
62
+ headers: res.headers,
63
+ data: JSON.parse(data),
64
+ };
65
+ resolve(result);
66
+ } catch (error) {
67
+ resolve({
68
+ statusCode: res.statusCode,
69
+ headers: res.headers,
70
+ data: data,
71
+ });
72
+ }
73
+ });
74
+ });
75
+
76
+ req.on('error', (error) => {
77
+ reject(error);
78
+ });
79
+
80
+ req.setTimeout(TEST_TIMEOUT, () => {
81
+ req.destroy();
82
+ reject(new Error('Request timeout'));
83
+ });
84
+
85
+ if (options.body) {
86
+ req.write(JSON.stringify(options.body));
87
+ }
88
+
89
+ req.end();
90
+ });
91
+ }
92
+
93
+ /**
94
+ * 打印带颜色的消息
95
+ */
96
+ function printMessage(message, color = colors.reset) {
97
+ console.log(`${color}${message}${colors.reset}`);
98
+ }
99
+
100
+ /**
101
+ * 打印测试结果
102
+ */
103
+ function printTestResult(testName, passed, message, data = null) {
104
+ testResults.total++;
105
+ if (passed) {
106
+ testResults.passed++;
107
+ printMessage(`✓ ${testName}`, colors.green);
108
+ if (message) {
109
+ console.log(` ${message}`);
110
+ }
111
+ if (data && process.env.DEBUG) {
112
+ console.log(` 数据:`, data);
113
+ }
114
+ } else {
115
+ testResults.failed++;
116
+ printMessage(`✗ ${testName}`, colors.red);
117
+ if (message) {
118
+ console.log(` ${colors.red}${message}${colors.reset}`);
119
+ }
120
+ if (data && process.env.DEBUG) {
121
+ console.log(` 错误数据:`, data);
122
+ }
123
+ }
124
+ }
125
+
126
+ /**
127
+ * 打印测试标题
128
+ */
129
+ function printTestSection(title) {
130
+ console.log('\n' + '='.repeat(60));
131
+ printMessage(title, colors.bright + colors.cyan);
132
+ console.log('='.repeat(60));
133
+ }
134
+
135
+ /**
136
+ * 检查服务是否运行
137
+ */
138
+ async function checkServiceHealth() {
139
+ printTestSection('1. 服务健康检查');
140
+
141
+ try {
142
+ const response = await makeRequest({
143
+ path: '/test/permissions/public',
144
+ method: 'GET',
145
+ });
146
+
147
+ if (response.statusCode === 200) {
148
+ printTestResult('服务健康检查', true, '服务运行正常');
149
+ return true;
150
+ } else {
151
+ printTestResult('服务健康检查', false, `服务响应异常: ${response.statusCode}`);
152
+ return false;
153
+ }
154
+ } catch (error) {
155
+ printTestResult('服务健康检查', false, `服务连接失败: ${error.message}`);
156
+ return false;
157
+ }
158
+ }
159
+
160
+ /**
161
+ * 测试公开接口
162
+ */
163
+ async function testPublicEndpoints() {
164
+ printTestSection('2. 公开接口测试');
165
+
166
+ const publicTests = [
167
+ {
168
+ name: '公开权限接口',
169
+ path: '/test/permissions/public',
170
+ method: 'GET',
171
+ description: '不需要任何权限的公开接口',
172
+ },
173
+ ];
174
+
175
+ for (const test of publicTests) {
176
+ try {
177
+ const response = await makeRequest({
178
+ path: test.path,
179
+ method: test.method,
180
+ });
181
+
182
+ const passed = response.statusCode === 200;
183
+ printTestResult(
184
+ test.name,
185
+ passed,
186
+ passed ? `${test.description}` : `返回状态码: ${response.statusCode}`,
187
+ response.data
188
+ );
189
+ } catch (error) {
190
+ printTestResult(test.name, false, `请求失败: ${error.message}`);
191
+ }
192
+ }
193
+ }
194
+
195
+ /**
196
+ * 测试API权限
197
+ */
198
+ async function testApiPermissions() {
199
+ printTestSection('3. API权限测试');
200
+
201
+ const apiTests = [
202
+ {
203
+ name: 'API读取权限',
204
+ path: '/test/permissions/api-read',
205
+ method: 'GET',
206
+ permission: 'api:test:api-read',
207
+ },
208
+ {
209
+ name: 'API创建权限',
210
+ path: '/test/permissions/api-create',
211
+ method: 'POST',
212
+ body: { testData: 'test' },
213
+ permission: 'api:test:api-create',
214
+ },
215
+ {
216
+ name: 'API混合权限',
217
+ path: '/test/permissions/mixed',
218
+ method: 'PUT',
219
+ body: { test: 'data' },
220
+ permission: 'api:test:mixed',
221
+ },
222
+ ];
223
+
224
+ for (const test of apiTests) {
225
+ try {
226
+ const response = await makeRequest({
227
+ path: test.path,
228
+ method: test.method,
229
+ body: test.body,
230
+ });
231
+
232
+ const passed = response.statusCode === 200 || response.statusCode === 403;
233
+ const message = passed
234
+ ? (response.statusCode === 200 ? '权限验证成功' : '权限拦截正常')
235
+ : `返回状态码: ${response.statusCode}`;
236
+
237
+ printTestResult(test.name, passed, message, response.data);
238
+ } catch (error) {
239
+ printTestResult(test.name, false, `请求失败: ${error.message}`);
240
+ }
241
+ }
242
+ }
243
+
244
+ /**
245
+ * 测试按钮权限
246
+ */
247
+ async function testButtonPermissions() {
248
+ printTestSection('4. 按钮权限测试');
249
+
250
+ const buttonTests = [
251
+ {
252
+ name: '创建按钮权限',
253
+ path: '/test/permissions/api-create',
254
+ method: 'POST',
255
+ body: { test: 'data' },
256
+ buttonId: 'btn-api-create',
257
+ permission: 'button:test:api-create',
258
+ },
259
+ {
260
+ name: '多个按钮权限',
261
+ path: '/test/permissions/mixed',
262
+ method: 'PUT',
263
+ body: { test: 'data' },
264
+ buttonIds: ['btn-approve', 'btn-reject', 'btn-export'],
265
+ },
266
+ {
267
+ name: '删除按钮权限',
268
+ path: '/test/permissions/123',
269
+ method: 'DELETE',
270
+ buttonId: 'btn-delete',
271
+ },
272
+ ];
273
+
274
+ for (const test of buttonTests) {
275
+ try {
276
+ const response = await makeRequest({
277
+ path: test.path,
278
+ method: test.method,
279
+ body: test.body,
280
+ });
281
+
282
+ const passed = response.statusCode === 200 || response.statusCode === 403;
283
+ const message = passed
284
+ ? (response.statusCode === 200 ? '按钮权限验证成功' : '按钮权限拦截正常')
285
+ : `返回状态码: ${response.statusCode}`;
286
+
287
+ printTestResult(test.name, passed, message, response.data);
288
+ } catch (error) {
289
+ printTestResult(test.name, false, `请求失败: ${error.message}`);
290
+ }
291
+ }
292
+ }
293
+
294
+ /**
295
+ * 测试传统权限控制
296
+ */
297
+ async function testTraditionalPermissions() {
298
+ printTestSection('5. 传统权限控制测试');
299
+
300
+ const traditionalTests = [
301
+ {
302
+ name: '管理员专用接口',
303
+ path: '/test/permissions/admin-only',
304
+ method: 'GET',
305
+ expression: "hasRole('ADMIN')",
306
+ },
307
+ {
308
+ name: '管理员或经理接口',
309
+ path: '/test/permissions/manager-admin',
310
+ method: 'GET',
311
+ roles: ['MANAGER', 'ADMIN'],
312
+ },
313
+ {
314
+ name: '复杂权限接口',
315
+ path: '/test/permissions/complex',
316
+ method: 'GET',
317
+ expression: "hasRole('ADMIN') or hasRole('MANAGER')",
318
+ },
319
+ ];
320
+
321
+ for (const test of traditionalTests) {
322
+ try {
323
+ const response = await makeRequest({
324
+ path: test.path,
325
+ method: test.method,
326
+ });
327
+
328
+ const passed = response.statusCode === 200 || response.statusCode === 403;
329
+ const message = passed
330
+ ? (response.statusCode === 200 ? '传统权限验证成功' : '传统权限拦截正常')
331
+ : `返回状态码: ${response.statusCode}`;
332
+
333
+ printTestResult(test.name, passed, message, response.data);
334
+ } catch (error) {
335
+ printTestResult(test.name, false, `请求失败: ${error.message}`);
336
+ }
337
+ }
338
+ }
339
+
340
+ /**
341
+ * 测试业务操作权限
342
+ */
343
+ async function testBusinessOperationPermissions() {
344
+ printTestSection('6. 业务操作权限测试');
345
+
346
+ const businessTests = [
347
+ {
348
+ name: '资源删除操作',
349
+ path: '/test/permissions/123',
350
+ method: 'DELETE',
351
+ description: '删除资源的权限检查',
352
+ },
353
+ {
354
+ name: '资源审批操作',
355
+ path: '/test/permissions/456/approve',
356
+ method: 'PUT',
357
+ body: { action: 'approve', reason: '测试审批' },
358
+ description: '审批资源的权限检查',
359
+ },
360
+ {
361
+ name: '数据导出操作',
362
+ path: '/test/permissions/export',
363
+ method: 'POST',
364
+ body: { format: 'excel' },
365
+ description: '导出数据的权限检查',
366
+ },
367
+ {
368
+ name: '批量操作',
369
+ path: '/test/permissions/batch',
370
+ method: 'POST',
371
+ body: { ids: [1, 2, 3], operation: 'delete' },
372
+ description: '批量操作的权限检查',
373
+ },
374
+ ];
375
+
376
+ for (const test of businessTests) {
377
+ try {
378
+ const response = await makeRequest({
379
+ path: test.path,
380
+ method: test.method,
381
+ body: test.body,
382
+ });
383
+
384
+ const passed = response.statusCode === 200 || response.statusCode === 403;
385
+ const message = passed
386
+ ? (response.statusCode === 200 ? `${test.description}成功` : `${test.description}被正常拦截`)
387
+ : `返回状态码: ${response.statusCode}`;
388
+
389
+ printTestResult(test.name, passed, message, response.data);
390
+ } catch (error) {
391
+ printTestResult(test.name, false, `请求失败: ${error.message}`);
392
+ }
393
+ }
394
+ }
395
+
396
+ /**
397
+ * 测试权限查询功能
398
+ */
399
+ async function testPermissionQuery() {
400
+ printTestSection('7. 权限查询功能测试');
401
+
402
+ const queryTests = [
403
+ {
404
+ name: '按组查询权限',
405
+ path: '/test/permissions/by-group?group=权限测试',
406
+ method: 'GET',
407
+ description: '按组查询可用权限',
408
+ },
409
+ {
410
+ name: '按类型查询权限',
411
+ path: '/test/permissions/by-type?type=API',
412
+ method: 'GET',
413
+ description: '按类型查询可用权限',
414
+ },
415
+ {
416
+ name: '权限功能总结',
417
+ path: '/test/permissions/summary',
418
+ method: 'GET',
419
+ description: '获取权限功能总结',
420
+ },
421
+ ];
422
+
423
+ for (const test of queryTests) {
424
+ try {
425
+ const response = await makeRequest({
426
+ path: test.path,
427
+ method: test.method,
428
+ });
429
+
430
+ const passed = response.statusCode === 200;
431
+ const message = passed
432
+ ? `${test.description}成功`
433
+ : `返回状态码: ${response.statusCode}`;
434
+
435
+ printTestResult(test.name, passed, message, response.data);
436
+ } catch (error) {
437
+ printTestResult(test.name, false, `请求失败: ${error.message}`);
438
+ }
439
+ }
440
+ }
441
+
442
+ /**
443
+ * 测试现有业务接口权限
444
+ */
445
+ async function testExistingBusinessPermissions() {
446
+ printTestSection('8. 现有业务接口权限测试');
447
+
448
+ const existingTests = [
449
+ {
450
+ name: '用户分页查询',
451
+ path: '/sys/user/page?pageNo=1&pageSize=10',
452
+ method: 'GET',
453
+ permission: 'api:user:page',
454
+ },
455
+ {
456
+ name: '菜单树查询',
457
+ path: '/sys/menu/tree',
458
+ method: 'GET',
459
+ permission: 'api:menu:tree',
460
+ },
461
+ {
462
+ name: '角色列表查询',
463
+ path: '/sys/role/list',
464
+ method: 'GET',
465
+ permission: 'api:role:list',
466
+ },
467
+ ];
468
+
469
+ for (const test of existingTests) {
470
+ try {
471
+ const response = await makeRequest({
472
+ path: test.path,
473
+ method: test.method,
474
+ });
475
+
476
+ const passed = response.statusCode === 200 || response.statusCode === 403;
477
+ const message = passed
478
+ ? (response.statusCode === 200 ? '业务接口权限验证成功' : '业务接口权限拦截正常')
479
+ : `返回状态码: ${response.statusCode}`;
480
+
481
+ printTestResult(test.name, passed, message, response.data);
482
+ } catch (error) {
483
+ printTestResult(test.name, false, `请求失败: ${error.message}`);
484
+ }
485
+ }
486
+ }
487
+
488
+ /**
489
+ * 打印测试总结
490
+ */
491
+ function printSummary() {
492
+ console.log('\n' + '='.repeat(60));
493
+ printMessage('测试总结', colors.bright + colors.magenta);
494
+ console.log('='.repeat(60));
495
+ console.log(`总测试数: ${testResults.total}`);
496
+ printMessage(`通过: ${testResults.passed}`, colors.green);
497
+ printMessage(`失败: ${testResults.failed}`, colors.red);
498
+ printMessage(`跳过: ${testResults.skipped}`, colors.yellow);
499
+
500
+ if (testResults.total > 0) {
501
+ const successRate = ((testResults.passed / testResults.total) * 100).toFixed(2);
502
+ printMessage(`成功率: ${successRate}%`, colors.cyan);
503
+ }
504
+
505
+ console.log('='.repeat(60));
506
+
507
+ if (testResults.failed > 0) {
508
+ console.log('\n' + colors.yellow + '⚠️ 部分测试失败,请检查服务状态和权限配置' + colors.reset);
509
+ } else {
510
+ console.log('\n' + colors.green + '✓ 所有测试通过!权限控制功能运行正常' + colors.reset);
511
+ }
512
+ }
513
+
514
+ /**
515
+ * 主测试函数
516
+ */
517
+ async function runAllTests() {
518
+ printMessage('\n🚀 开始权限控制自动化测试...\n', colors.bright + colors.cyan);
519
+
520
+ try {
521
+ // 检查服务健康状态
522
+ const isServiceRunning = await checkServiceHealth();
523
+ if (!isServiceRunning) {
524
+ printMessage('\n❌ 服务未运行,请先启动API服务\n', colors.red);
525
+ process.exit(1);
526
+ }
527
+
528
+ // 执行所有测试
529
+ await testPublicEndpoints();
530
+ await testApiPermissions();
531
+ await testButtonPermissions();
532
+ await testTraditionalPermissions();
533
+ await testBusinessOperationPermissions();
534
+ await testPermissionQuery();
535
+ await testExistingBusinessPermissions();
536
+
537
+ // 打印总结
538
+ printSummary();
539
+
540
+ } catch (error) {
541
+ printMessage(`\n❌ 测试过程中出现错误: ${error.message}\n`, colors.red);
542
+ console.error(error);
543
+ process.exit(1);
544
+ }
545
+ }
546
+
547
+ // 运行测试
548
+ runAllTests().catch((error) => {
549
+ console.error('Fatal error:', error);
550
+ process.exit(1);
551
+ });