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

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 (441) hide show
  1. package/dist/cli.js +2 -0
  2. package/dist/commands/add-api.js +9 -3
  3. package/dist/commands/add-app.js +0 -2
  4. package/dist/commands/env.d.ts +8 -0
  5. package/dist/commands/env.js +55 -0
  6. package/dist/commands/init.js +7 -9
  7. package/dist/core/project-config.d.ts +1 -0
  8. package/dist/core/prompts.d.ts +2 -0
  9. package/dist/core/prompts.js +33 -32
  10. package/dist/core/workspace.js +30 -9
  11. package/dist/scaffold.js +1 -1
  12. package/dist/usecases/add-api.usecase.d.ts +5 -2
  13. package/dist/usecases/add-api.usecase.js +83 -21
  14. package/dist/usecases/add-app.usecase.d.ts +0 -1
  15. package/dist/usecases/add-app.usecase.js +20 -10
  16. package/dist/usecases/add-feature.usecase.js +26 -23
  17. package/dist/usecases/env.usecase.d.ts +23 -0
  18. package/dist/usecases/env.usecase.js +284 -0
  19. package/dist/usecases/init-scaffold.usecase.d.ts +3 -4
  20. package/dist/usecases/init-scaffold.usecase.js +36 -49
  21. package/package.json +8 -3
  22. package/templates/api-clean/.env.example +3 -0
  23. package/templates/api-clean/app.config.ts +19 -0
  24. package/templates/{scaffold-default/packages/api → api-clean}/examples/security/README.md +2 -2
  25. package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/README.md +1 -1
  26. package/templates/{scaffold-default/packages/api → api-clean}/package.json +4 -16
  27. package/templates/api-clean/src/scripts/init-db.ts +50 -0
  28. package/templates/{scaffold-default/packages/api → api-clean}/src/server.ts +15 -11
  29. package/templates/api-clean/src/types/aiko-boot-starter-web.d.ts +8 -0
  30. package/templates/api-system/.env.example +11 -0
  31. package/templates/api-system/.eslintrc.json +6 -0
  32. package/templates/api-system/.swcrc +17 -0
  33. package/templates/api-system/app.config.ts +87 -0
  34. package/templates/api-system/docs/api-document.md +497 -0
  35. package/templates/api-system/docs/final-completion-report.md +565 -0
  36. package/templates/api-system/docs/permission-integration-summary.md +432 -0
  37. package/templates/api-system/examples/security/README.md +664 -0
  38. package/templates/api-system/examples/security/complete/.env.example +26 -0
  39. package/templates/api-system/examples/security/complete/PROJECT_STRUCTURE.md +220 -0
  40. package/templates/api-system/examples/security/complete/README.md +847 -0
  41. package/templates/api-system/examples/security/complete/app.config.ts +69 -0
  42. package/templates/api-system/examples/security/complete/app.ts +63 -0
  43. package/templates/api-system/examples/security/complete/controller/auth.controller.ts +131 -0
  44. package/templates/api-system/examples/security/complete/controller/index.ts +4 -0
  45. package/templates/api-system/examples/security/complete/controller/permission.controller.ts +41 -0
  46. package/templates/api-system/examples/security/complete/controller/role.controller.ts +53 -0
  47. package/templates/api-system/examples/security/complete/controller/user.controller.ts +53 -0
  48. package/templates/api-system/examples/security/complete/dto/change-password.dto.ts +10 -0
  49. package/templates/api-system/examples/security/complete/dto/create-permission.dto.ts +14 -0
  50. package/templates/api-system/examples/security/complete/dto/create-role.dto.ts +11 -0
  51. package/templates/api-system/examples/security/complete/dto/create-user.dto.ts +15 -0
  52. package/templates/api-system/examples/security/complete/dto/index.ts +7 -0
  53. package/templates/api-system/examples/security/complete/dto/login.dto.ts +10 -0
  54. package/templates/api-system/examples/security/complete/dto/oauth-profile.dto.ts +7 -0
  55. package/templates/api-system/examples/security/complete/dto/register.dto.ts +17 -0
  56. package/templates/api-system/examples/security/complete/entity/index.ts +6 -0
  57. package/templates/api-system/examples/security/complete/entity/oauth-account.entity.ts +39 -0
  58. package/templates/api-system/examples/security/complete/entity/permission.entity.ts +31 -0
  59. package/templates/api-system/examples/security/complete/entity/role-permission.entity.ts +19 -0
  60. package/templates/api-system/examples/security/complete/entity/role.entity.ts +25 -0
  61. package/templates/api-system/examples/security/complete/entity/user-role.entity.ts +19 -0
  62. package/templates/api-system/examples/security/complete/entity/user.entity.ts +46 -0
  63. package/templates/api-system/examples/security/complete/init.sql +81 -0
  64. package/templates/api-system/examples/security/complete/middleware/auth.interceptor.ts +39 -0
  65. package/templates/api-system/examples/security/complete/middleware/index.ts +2 -0
  66. package/templates/api-system/examples/security/complete/middleware/permission.interceptor.ts +61 -0
  67. package/templates/api-system/examples/security/complete/package.json +54 -0
  68. package/templates/api-system/examples/security/complete/seed.sql +42 -0
  69. package/templates/api-system/examples/security/complete/service/auth.service.ts +41 -0
  70. package/templates/api-system/examples/security/complete/service/index.ts +5 -0
  71. package/templates/api-system/examples/security/complete/service/oauth.service.ts +82 -0
  72. package/templates/api-system/examples/security/complete/service/permission.service.ts +113 -0
  73. package/templates/api-system/examples/security/complete/service/role.service.ts +85 -0
  74. package/templates/api-system/examples/security/complete/service/user.service.ts +132 -0
  75. package/templates/api-system/examples/security/complete/tests/TEST_REPORT.md +318 -0
  76. package/templates/api-system/examples/security/complete/tests/generate-report.js +335 -0
  77. package/templates/api-system/examples/security/complete/tests/helpers/api-helpers.ts +116 -0
  78. package/templates/api-system/examples/security/complete/tests/helpers/index.ts +2 -0
  79. package/templates/api-system/examples/security/complete/tests/helpers/test-helpers.ts +129 -0
  80. package/templates/api-system/examples/security/complete/tests/integration/auth.api.test.ts +429 -0
  81. package/templates/api-system/examples/security/complete/tests/integration/role.api.test.ts +400 -0
  82. package/templates/api-system/examples/security/complete/tests/integration/user.api.test.ts +459 -0
  83. package/templates/api-system/examples/security/complete/tests/jest.config.js +40 -0
  84. package/templates/api-system/examples/security/complete/tests/run-all-tests.js +135 -0
  85. package/templates/api-system/examples/security/complete/tests/run-tests.js +109 -0
  86. package/templates/api-system/examples/security/complete/tests/setup.ts +19 -0
  87. package/templates/api-system/examples/security/complete/tests/unit/auth.service.test.ts +199 -0
  88. package/templates/api-system/examples/security/complete/tests/unit/permission.service.test.ts +377 -0
  89. package/templates/api-system/examples/security/complete/tests/unit/user.service.test.ts +288 -0
  90. package/templates/api-system/examples/security/complete/tsconfig.json +35 -0
  91. package/templates/api-system/examples/security/jwt/README.md +424 -0
  92. package/templates/api-system/examples/security/local/README.md +499 -0
  93. package/templates/api-system/examples/security/oauth2/README.md +637 -0
  94. package/templates/api-system/examples/security/permission/README.md +943 -0
  95. package/templates/api-system/examples/security/session/README.md +753 -0
  96. package/templates/{api-base → api-system}/package.json +6 -5
  97. package/templates/{api-base → api-system}/scripts/codegen.cjs +0 -1
  98. package/templates/{api-base → api-system}/scripts/codegen.ts +0 -1
  99. package/templates/{scaffold-default/packages/api → api-system}/src/config/security-auto-configuration.ts +5 -2
  100. package/templates/api-system/src/scripts/simple-reset-admin.mjs +39 -0
  101. package/templates/api-system/src/server.ts +42 -0
  102. package/templates/api-system/src/types/aiko-boot-starter-web.d.ts +8 -0
  103. package/templates/api-system/src/types/sqljs.d.ts +18 -0
  104. package/templates/{api-base → api-system}/tsconfig.json +0 -1
  105. package/templates/api-system/tsup.config.ts +14 -0
  106. package/templates/api-system/uploads/.gitkeep +0 -0
  107. package/templates/app-admin/.env.example +18 -0
  108. package/templates/{scaffold-default/packages/admin → app-admin}/package.json +9 -3
  109. package/templates/{scaffold-default/packages/admin → app-admin}/tsconfig.json +1 -1
  110. package/templates/app-admin/vite.config.ts +31 -0
  111. package/templates/app-mobile/.env.example +5 -0
  112. package/templates/{scaffold-default/packages/mobile → app-mobile}/package.json +8 -2
  113. package/templates/{scaffold-default/packages/mobile → app-mobile}/src/main.tsx +2 -1
  114. package/templates/api-base/app.config.ts +0 -155
  115. package/templates/api-base/src/controller/auth.controller.ts +0 -160
  116. package/templates/api-base/src/controller/menu.controller.ts +0 -56
  117. package/templates/api-base/src/controller/role.controller.ts +0 -62
  118. package/templates/api-base/src/controller/user.controller.ts +0 -75
  119. package/templates/api-base/src/dto/auth.dto.ts +0 -31
  120. package/templates/api-base/src/dto/menu.dto.ts +0 -38
  121. package/templates/api-base/src/dto/role.dto.ts +0 -18
  122. package/templates/api-base/src/dto/user.dto.ts +0 -36
  123. package/templates/api-base/src/entity/menu.entity.ts +0 -35
  124. package/templates/api-base/src/entity/role-menu.entity.ts +0 -14
  125. package/templates/api-base/src/entity/role.entity.ts +0 -23
  126. package/templates/api-base/src/entity/user-role.entity.ts +0 -14
  127. package/templates/api-base/src/entity/user.entity.ts +0 -32
  128. package/templates/api-base/src/mapper/menu.mapper.ts +0 -7
  129. package/templates/api-base/src/mapper/role-menu.mapper.ts +0 -7
  130. package/templates/api-base/src/mapper/role.mapper.ts +0 -7
  131. package/templates/api-base/src/mapper/user-role.mapper.ts +0 -7
  132. package/templates/api-base/src/mapper/user.mapper.ts +0 -12
  133. package/templates/api-base/src/scripts/init-db.ts +0 -204
  134. package/templates/api-base/src/server.ts +0 -69
  135. package/templates/api-base/src/service/auth.service.ts +0 -144
  136. package/templates/api-base/src/service/log.request.service.ts +0 -72
  137. package/templates/api-base/src/service/menu.service.ts +0 -94
  138. package/templates/api-base/src/service/role.service.ts +0 -88
  139. package/templates/api-base/src/service/user.service.ts +0 -175
  140. package/templates/api-base/src/utils/jwt.util.ts +0 -39
  141. package/templates/scaffold-default/README.md +0 -114
  142. package/templates/scaffold-default/package.json +0 -26
  143. package/templates/scaffold-default/packages/admin/.env.dev +0 -1
  144. package/templates/scaffold-default/packages/admin/.env.prod +0 -4
  145. package/templates/scaffold-default/packages/admin/.env.stage +0 -4
  146. package/templates/scaffold-default/packages/admin/vite.config.ts +0 -26
  147. package/templates/scaffold-default/packages/api/app.config.ts +0 -163
  148. package/templates/scaffold-default/packages/api/src/controller/cache.controller.ts +0 -106
  149. package/templates/scaffold-default/packages/api/src/controller/mq.controller.ts +0 -35
  150. package/templates/scaffold-default/packages/api/src/controller/upload.controller.ts +0 -83
  151. package/templates/scaffold-default/packages/api/src/dto/cache.dto.ts +0 -24
  152. package/templates/scaffold-default/packages/api/src/dto/mq.dto.ts +0 -16
  153. package/templates/scaffold-default/packages/api/src/service/cache.service.ts +0 -80
  154. package/templates/scaffold-default/packages/api/src/service/log.request.service.ts +0 -158
  155. package/templates/scaffold-default/packages/api/src/service/log.service.ts +0 -123
  156. package/templates/scaffold-default/packages/api/src/service/mq.consumer.service.ts +0 -26
  157. package/templates/scaffold-default/pnpm-workspace.yaml +0 -2
  158. package/templates/scaffold-default/scripts/postinstall.cjs +0 -42
  159. package/templates/scaffold-default/scripts/rebuild-sqlite.cjs +0 -23
  160. /package/templates/{scaffold-default/packages/api → api-clean}/.eslintrc.json +0 -0
  161. /package/templates/{scaffold-default/packages/api → api-clean}/.swcrc +0 -0
  162. /package/templates/{scaffold-default/packages/api → api-clean}/docs/api-document.md +0 -0
  163. /package/templates/{scaffold-default/packages/api → api-clean}/docs/final-completion-report.md +0 -0
  164. /package/templates/{scaffold-default/packages/api → api-clean}/docs/permission-integration-summary.md +0 -0
  165. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/.env.example +0 -0
  166. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/PROJECT_STRUCTURE.md +0 -0
  167. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/app.config.ts +0 -0
  168. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/app.ts +0 -0
  169. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/controller/auth.controller.ts +0 -0
  170. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/controller/index.ts +0 -0
  171. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/controller/permission.controller.ts +0 -0
  172. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/controller/role.controller.ts +0 -0
  173. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/controller/user.controller.ts +0 -0
  174. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/dto/change-password.dto.ts +0 -0
  175. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/dto/create-permission.dto.ts +0 -0
  176. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/dto/create-role.dto.ts +0 -0
  177. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/dto/create-user.dto.ts +0 -0
  178. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/dto/index.ts +0 -0
  179. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/dto/login.dto.ts +0 -0
  180. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/dto/oauth-profile.dto.ts +0 -0
  181. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/dto/register.dto.ts +0 -0
  182. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/entity/index.ts +0 -0
  183. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/entity/oauth-account.entity.ts +0 -0
  184. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/entity/permission.entity.ts +0 -0
  185. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/entity/role-permission.entity.ts +0 -0
  186. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/entity/role.entity.ts +0 -0
  187. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/entity/user-role.entity.ts +0 -0
  188. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/entity/user.entity.ts +0 -0
  189. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/init.sql +0 -0
  190. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/middleware/auth.interceptor.ts +0 -0
  191. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/middleware/index.ts +0 -0
  192. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/middleware/permission.interceptor.ts +0 -0
  193. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/package.json +0 -0
  194. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/seed.sql +0 -0
  195. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/service/auth.service.ts +0 -0
  196. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/service/index.ts +0 -0
  197. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/service/oauth.service.ts +0 -0
  198. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/service/permission.service.ts +0 -0
  199. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/service/role.service.ts +0 -0
  200. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/service/user.service.ts +0 -0
  201. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tests/TEST_REPORT.md +0 -0
  202. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tests/generate-report.js +0 -0
  203. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tests/helpers/api-helpers.ts +0 -0
  204. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tests/helpers/index.ts +0 -0
  205. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tests/helpers/test-helpers.ts +0 -0
  206. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tests/integration/auth.api.test.ts +0 -0
  207. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tests/integration/role.api.test.ts +0 -0
  208. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tests/integration/user.api.test.ts +0 -0
  209. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tests/jest.config.js +0 -0
  210. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tests/run-all-tests.js +0 -0
  211. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tests/run-tests.js +0 -0
  212. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tests/setup.ts +0 -0
  213. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tests/unit/auth.service.test.ts +0 -0
  214. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tests/unit/permission.service.test.ts +0 -0
  215. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tests/unit/user.service.test.ts +0 -0
  216. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/complete/tsconfig.json +0 -0
  217. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/jwt/README.md +0 -0
  218. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/local/README.md +0 -0
  219. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/oauth2/README.md +0 -0
  220. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/permission/README.md +0 -0
  221. /package/templates/{scaffold-default/packages/api → api-clean}/examples/security/session/README.md +0 -0
  222. /package/templates/{scaffold-default/packages/api → api-clean}/scripts/codegen.cjs +0 -0
  223. /package/templates/{scaffold-default/packages/api → api-clean}/scripts/codegen.ts +0 -0
  224. /package/templates/{scaffold-default/packages/api → api-clean}/src/scripts/simple-reset-admin.mjs +0 -0
  225. /package/templates/{scaffold-default/packages/api → api-clean}/src/types/sqljs.d.ts +0 -0
  226. /package/templates/{scaffold-default/packages/api → api-clean}/tsconfig.json +0 -0
  227. /package/templates/{scaffold-default/packages/api → api-clean}/tsup.config.ts +0 -0
  228. /package/templates/{scaffold-default/packages/api → api-clean}/uploads/.gitkeep +0 -0
  229. /package/templates/{scaffold-default/packages/api → api-system}/src/controller/auth.controller.ts +0 -0
  230. /package/templates/{scaffold-default/packages/api → api-system}/src/controller/menu.controller.ts +0 -0
  231. /package/templates/{scaffold-default/packages/api → api-system}/src/controller/role.controller.ts +0 -0
  232. /package/templates/{scaffold-default/packages/api → api-system}/src/controller/user.controller.ts +0 -0
  233. /package/templates/{scaffold-default/packages/api → api-system}/src/dto/auth.dto.ts +0 -0
  234. /package/templates/{scaffold-default/packages/api → api-system}/src/dto/menu.dto.ts +0 -0
  235. /package/templates/{scaffold-default/packages/api → api-system}/src/dto/role.dto.ts +0 -0
  236. /package/templates/{scaffold-default/packages/api → api-system}/src/dto/user.dto.ts +0 -0
  237. /package/templates/{scaffold-default/packages/api → api-system}/src/entity/menu.entity.ts +0 -0
  238. /package/templates/{scaffold-default/packages/api → api-system}/src/entity/role-menu.entity.ts +0 -0
  239. /package/templates/{scaffold-default/packages/api → api-system}/src/entity/role.entity.ts +0 -0
  240. /package/templates/{scaffold-default/packages/api → api-system}/src/entity/user-role.entity.ts +0 -0
  241. /package/templates/{scaffold-default/packages/api → api-system}/src/entity/user.entity.ts +0 -0
  242. /package/templates/{scaffold-default/packages/api → api-system}/src/mapper/menu.mapper.ts +0 -0
  243. /package/templates/{scaffold-default/packages/api → api-system}/src/mapper/role-menu.mapper.ts +0 -0
  244. /package/templates/{scaffold-default/packages/api → api-system}/src/mapper/role.mapper.ts +0 -0
  245. /package/templates/{scaffold-default/packages/api → api-system}/src/mapper/user-role.mapper.ts +0 -0
  246. /package/templates/{scaffold-default/packages/api → api-system}/src/mapper/user.mapper.ts +0 -0
  247. /package/templates/{scaffold-default/packages/api → api-system}/src/scripts/assign-role.ts +0 -0
  248. /package/templates/{scaffold-default/packages/api → api-system}/src/scripts/check-user-role.ts +0 -0
  249. /package/templates/{scaffold-default/packages/api → api-system}/src/scripts/check-users.mjs +0 -0
  250. /package/templates/{scaffold-default/packages/api → api-system}/src/scripts/demo-permissions.mjs +0 -0
  251. /package/templates/{scaffold-default/packages/api → api-system}/src/scripts/init-db.ts +0 -0
  252. /package/templates/{scaffold-default/packages/api → api-system}/src/scripts/reset-admin-password.mjs +0 -0
  253. /package/templates/{scaffold-default/packages/api → api-system}/src/scripts/reset-password.ts +0 -0
  254. /package/templates/{scaffold-default/packages/api → api-system}/src/scripts/test-db.ts +0 -0
  255. /package/templates/{scaffold-default/packages/api → api-system}/src/scripts/test-di.ts +0 -0
  256. /package/templates/{scaffold-default/packages/api → api-system}/src/scripts/test-permissions.mjs +0 -0
  257. /package/templates/{scaffold-default/packages/api → api-system}/src/scripts/update-admin-password.mjs +0 -0
  258. /package/templates/{scaffold-default/packages/api → api-system}/src/scripts/user-roles.ts +0 -0
  259. /package/templates/{scaffold-default/packages/api → api-system}/src/service/auth.service.ts +0 -0
  260. /package/templates/{scaffold-default/packages/api → api-system}/src/service/menu.service.ts +0 -0
  261. /package/templates/{scaffold-default/packages/api → api-system}/src/service/role.service.ts +0 -0
  262. /package/templates/{scaffold-default/packages/api → api-system}/src/service/user.service.ts +0 -0
  263. /package/templates/{scaffold-default/packages/api → api-system}/src/utils/auth.utils.js +0 -0
  264. /package/templates/{scaffold-default/packages/api → api-system}/src/utils/jwt.util.ts +0 -0
  265. /package/templates/{scaffold-default/packages/admin → app-admin}/Dockerfile +0 -0
  266. /package/templates/{scaffold-default/packages/admin → app-admin}/README.MD +0 -0
  267. /package/templates/{scaffold-default/packages/admin → app-admin}/components.json +0 -0
  268. /package/templates/{scaffold-default/packages/admin → app-admin}/eslint.config.js +0 -0
  269. /package/templates/{scaffold-default/packages/admin → app-admin}/index.html +0 -0
  270. /package/templates/{scaffold-default/packages/admin → app-admin}/public/vite.svg +0 -0
  271. /package/templates/{scaffold-default/packages/admin → app-admin}/src/App.css +0 -0
  272. /package/templates/{scaffold-default/packages/admin → app-admin}/src/App.tsx +0 -0
  273. /package/templates/{scaffold-default/packages/admin → app-admin}/src/app.config.ts +0 -0
  274. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/data-table/data-table-pagination.tsx +0 -0
  275. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/data-table/data-table-sorter.tsx +0 -0
  276. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/data-table/index.tsx +0 -0
  277. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/editable-table.tsx +0 -0
  278. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/form/input-password.tsx +0 -0
  279. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/form/sign-in-form.tsx +0 -0
  280. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/layout/error-component.tsx +0 -0
  281. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/layout/header.tsx +0 -0
  282. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/layout/language-switcher.tsx +0 -0
  283. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/layout/layout.tsx +0 -0
  284. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/layout/loading-overlay.tsx +0 -0
  285. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/layout/shell-bar.tsx +0 -0
  286. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/layout/sidebar.tsx +0 -0
  287. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/layout/user-avatar.tsx +0 -0
  288. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/list-report.tsx +0 -0
  289. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/master-detail.tsx +0 -0
  290. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/notification/toaster.tsx +0 -0
  291. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/notification/undoable-notification.tsx +0 -0
  292. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/object-page.tsx +0 -0
  293. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/theme/theme-provider.tsx +0 -0
  294. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/theme/theme-select.tsx +0 -0
  295. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/admin-ui/theme/theme-toggle.tsx +0 -0
  296. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/accordion.tsx +0 -0
  297. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/alert-dialog.tsx +0 -0
  298. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/alert.tsx +0 -0
  299. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/aspect-ratio.tsx +0 -0
  300. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/avatar.tsx +0 -0
  301. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/badge.tsx +0 -0
  302. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/breadcrumb.tsx +0 -0
  303. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/button.tsx +0 -0
  304. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/calendar.tsx +0 -0
  305. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/card.tsx +0 -0
  306. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/carousel.tsx +0 -0
  307. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/chart.tsx +0 -0
  308. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/checkbox.tsx +0 -0
  309. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/collapsible.tsx +0 -0
  310. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/command.tsx +0 -0
  311. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/context-menu.tsx +0 -0
  312. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/dialog.tsx +0 -0
  313. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/drawer.tsx +0 -0
  314. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/dropdown-menu.tsx +0 -0
  315. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/form.tsx +0 -0
  316. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/hover-card.tsx +0 -0
  317. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/input-otp.tsx +0 -0
  318. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/input.tsx +0 -0
  319. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/label.tsx +0 -0
  320. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/menubar.tsx +0 -0
  321. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/navigation-menu.tsx +0 -0
  322. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/pagination.tsx +0 -0
  323. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/popover.tsx +0 -0
  324. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/progress.tsx +0 -0
  325. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/radio-group.tsx +0 -0
  326. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/resizable.tsx +0 -0
  327. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/scroll-area.tsx +0 -0
  328. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/select.tsx +0 -0
  329. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/separator.tsx +0 -0
  330. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/sheet.tsx +0 -0
  331. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/sidebar.tsx +0 -0
  332. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/skeleton.tsx +0 -0
  333. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/slider.tsx +0 -0
  334. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/sonner.tsx +0 -0
  335. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/switch.tsx +0 -0
  336. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/table.tsx +0 -0
  337. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/tabs.tsx +0 -0
  338. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/textarea.tsx +0 -0
  339. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/toggle-group.tsx +0 -0
  340. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/toggle.tsx +0 -0
  341. /package/templates/{scaffold-default/packages/admin → app-admin}/src/components/ui/tooltip.tsx +0 -0
  342. /package/templates/{scaffold-default/packages/admin → app-admin}/src/hooks/use-mobile.ts +0 -0
  343. /package/templates/{scaffold-default/packages/admin → app-admin}/src/i18n.ts +0 -0
  344. /package/templates/{scaffold-default/packages/admin → app-admin}/src/index.tsx +0 -0
  345. /package/templates/{scaffold-default/packages/admin → app-admin}/src/layouts/menu-layout.tsx +0 -0
  346. /package/templates/{scaffold-default/packages/admin → app-admin}/src/layouts/tile-layout.tsx +0 -0
  347. /package/templates/{scaffold-default/packages/admin → app-admin}/src/lib/utils.ts +0 -0
  348. /package/templates/{scaffold-default/packages/admin → app-admin}/src/locales/en.json +0 -0
  349. /package/templates/{scaffold-default/packages/admin → app-admin}/src/locales/zh.json +0 -0
  350. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/dashboard.tsx +0 -0
  351. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/goods-receipt/CreatePage.tsx +0 -0
  352. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/goods-receipt/EditPage.tsx +0 -0
  353. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/goods-receipt/ListPage.tsx +0 -0
  354. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/goods-receipt/ViewPage.tsx +0 -0
  355. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/goods-receipt/index.ts +0 -0
  356. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/home-page.tsx +0 -0
  357. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/master-data/cost-centers/index.tsx +0 -0
  358. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/master-data/currencies/index.tsx +0 -0
  359. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/master-data/materials/ListPage.tsx +0 -0
  360. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/master-data/materials/ViewPage.tsx +0 -0
  361. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/master-data/materials/index.ts +0 -0
  362. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/master-data/plants/ListPage.tsx +0 -0
  363. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/master-data/plants/ViewPage.tsx +0 -0
  364. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/master-data/plants/index.ts +0 -0
  365. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/master-data/purchase-organizations/index.tsx +0 -0
  366. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/master-data/units-of-measure/index.tsx +0 -0
  367. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/master-data/vendors/ListPage.tsx +0 -0
  368. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/master-data/vendors/ViewPage.tsx +0 -0
  369. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/master-data/vendors/index.ts +0 -0
  370. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/placeholder-page.tsx +0 -0
  371. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/purchase-orders/ListPage.tsx +0 -0
  372. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/purchase-orders/ViewPage.tsx +0 -0
  373. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/purchase-orders/index.ts +0 -0
  374. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/purchase-requisitions/CreatePage.tsx +0 -0
  375. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/purchase-requisitions/EditPage.tsx +0 -0
  376. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/purchase-requisitions/ListPage.tsx +0 -0
  377. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/purchase-requisitions/ViewPage.tsx +0 -0
  378. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/purchase-requisitions/constants.ts +0 -0
  379. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/purchase-requisitions/index.ts +0 -0
  380. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/reports/PurchaseOrderReport.tsx +0 -0
  381. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/reports/PurchaseRequisitionReport.tsx +0 -0
  382. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/reports/index.ts +0 -0
  383. /package/templates/{scaffold-default/packages/admin → app-admin}/src/pages/settings-page.tsx +0 -0
  384. /package/templates/{scaffold-default/packages/admin → app-admin}/src/providers/app-config.tsx +0 -0
  385. /package/templates/{scaffold-default/packages/admin → app-admin}/src/providers/auth-provider.ts +0 -0
  386. /package/templates/{scaffold-default/packages/admin → app-admin}/src/routes/auth.ts +0 -0
  387. /package/templates/{scaffold-default/packages/admin → app-admin}/src/routes/index.ts +0 -0
  388. /package/templates/{scaffold-default/packages/admin → app-admin}/src/routes/menu.ts +0 -0
  389. /package/templates/{scaffold-default/packages/admin → app-admin}/src/routes/modules/goods-receipt.ts +0 -0
  390. /package/templates/{scaffold-default/packages/admin → app-admin}/src/routes/modules/master-data.ts +0 -0
  391. /package/templates/{scaffold-default/packages/admin → app-admin}/src/routes/modules/purchase-orders.ts +0 -0
  392. /package/templates/{scaffold-default/packages/admin → app-admin}/src/routes/modules/purchase-requisitions.ts +0 -0
  393. /package/templates/{scaffold-default/packages/admin → app-admin}/src/routes/modules/reports.ts +0 -0
  394. /package/templates/{scaffold-default/packages/admin → app-admin}/src/routes/modules/settings.ts +0 -0
  395. /package/templates/{scaffold-default/packages/admin → app-admin}/src/routes/withSuspense.tsx +0 -0
  396. /package/templates/{scaffold-default/packages/admin → app-admin}/src/theme/amber.css +0 -0
  397. /package/templates/{scaffold-default/packages/admin → app-admin}/src/theme/blue.css +0 -0
  398. /package/templates/{scaffold-default/packages/admin → app-admin}/src/theme/default.css +0 -0
  399. /package/templates/{scaffold-default/packages/admin → app-admin}/src/theme/fiori.css +0 -0
  400. /package/templates/{scaffold-default/packages/admin → app-admin}/src/theme/green.css +0 -0
  401. /package/templates/{scaffold-default/packages/admin → app-admin}/src/theme/index.css +0 -0
  402. /package/templates/{scaffold-default/packages/admin → app-admin}/src/theme/rose.css +0 -0
  403. /package/templates/{scaffold-default/packages/admin → app-admin}/src/theme/violet.css +0 -0
  404. /package/templates/{scaffold-default/packages/admin → app-admin}/src/vite-env.d.ts +0 -0
  405. /package/templates/{scaffold-default/packages/admin → app-admin}/tsconfig.node.json +0 -0
  406. /package/templates/{scaffold-default/packages/core → app-core}/package.json +0 -0
  407. /package/templates/{scaffold-default/packages/core → app-core}/src/auth/auth-client-middleware.ts +0 -0
  408. /package/templates/{scaffold-default/packages/core → app-core}/src/auth/auth-constants.ts +0 -0
  409. /package/templates/{scaffold-default/packages/core → app-core}/src/auth/auth-service.ts +0 -0
  410. /package/templates/{scaffold-default/packages/core → app-core}/src/auth/backend-auth-provider.ts +0 -0
  411. /package/templates/{scaffold-default/packages/core → app-core}/src/auth/default-auth-provider.ts +0 -0
  412. /package/templates/{scaffold-default/packages/core → app-core}/src/auth/index.ts +0 -0
  413. /package/templates/{scaffold-default/packages/core → app-core}/src/auth/types.ts +0 -0
  414. /package/templates/{scaffold-default/packages/core → app-core}/src/authorization/authorization-client-middleware.ts +0 -0
  415. /package/templates/{scaffold-default/packages/core → app-core}/src/authorization/authorization-config.ts +0 -0
  416. /package/templates/{scaffold-default/packages/core → app-core}/src/authorization/authorization-provider.tsx +0 -0
  417. /package/templates/{scaffold-default/packages/core → app-core}/src/authorization/default-authorization-provider.ts +0 -0
  418. /package/templates/{scaffold-default/packages/core → app-core}/src/authorization/index.ts +0 -0
  419. /package/templates/{scaffold-default/packages/core → app-core}/src/authorization/types.ts +0 -0
  420. /package/templates/{scaffold-default/packages/core → app-core}/src/index.ts +0 -0
  421. /package/templates/{scaffold-default/packages/core → app-core}/src/utils/promise-result-cache.ts +0 -0
  422. /package/templates/{scaffold-default/packages/core → app-core}/tsconfig.json +0 -0
  423. /package/templates/{scaffold-default/packages/mobile → app-mobile}/README.md +0 -0
  424. /package/templates/{scaffold-default/packages/mobile → app-mobile}/index.html +0 -0
  425. /package/templates/{scaffold-default/packages/mobile → app-mobile}/postcss.config.mjs +0 -0
  426. /package/templates/{scaffold-default/packages/mobile → app-mobile}/src/App.tsx +0 -0
  427. /package/templates/{scaffold-default/packages/mobile → app-mobile}/src/app/globals.css +0 -0
  428. /package/templates/{scaffold-default/packages/mobile → app-mobile}/src/components/LoginForm.tsx +0 -0
  429. /package/templates/{scaffold-default/packages/mobile → app-mobile}/src/hooks/index.ts +0 -0
  430. /package/templates/{scaffold-default/packages/mobile → app-mobile}/src/lib/utils.ts +0 -0
  431. /package/templates/{scaffold-default/packages/mobile → app-mobile}/src/pages/HomePage.tsx +0 -0
  432. /package/templates/{scaffold-default/packages/mobile → app-mobile}/src/pages/LoginPage.tsx +0 -0
  433. /package/templates/{scaffold-default/packages/mobile → app-mobile}/src/pages/index.ts +0 -0
  434. /package/templates/{scaffold-default/packages/mobile → app-mobile}/src/routes/ProtectedRoute.tsx +0 -0
  435. /package/templates/{scaffold-default/packages/mobile → app-mobile}/src/routes/index.tsx +0 -0
  436. /package/templates/{scaffold-default/packages/mobile → app-mobile}/src/routes/routes.ts +0 -0
  437. /package/templates/{scaffold-default/packages/mobile → app-mobile}/src/types/index.ts +0 -0
  438. /package/templates/{scaffold-default/packages/mobile → app-mobile}/src/vite-env.d.ts +0 -0
  439. /package/templates/{scaffold-default/packages/mobile → app-mobile}/tsconfig.json +0 -0
  440. /package/templates/{scaffold-default/packages/mobile → app-mobile}/tsconfig.node.json +0 -0
  441. /package/templates/{scaffold-default/packages/mobile → app-mobile}/vite.config.ts +0 -0
@@ -0,0 +1,753 @@
1
+ # Session 认证策略示例
2
+
3
+ 本示例展示如何使用 Session 策略实现传统的基于会话的认证。
4
+
5
+ ## 概述
6
+
7
+ Session 策略是传统的 Web 应用认证方式,使用服务端存储的会话状态来跟踪用户登录状态。
8
+
9
+ ## 特点
10
+
11
+ - ✅ 服务端控制,可主动撤销
12
+ - ✅ 适用于传统 Web 应用
13
+ - ✅ 实现简单,易于理解
14
+ - ⚠️ 有状态,扩展性差
15
+ - ⚠️ 不适合微服务架构
16
+
17
+ ## 配置
18
+
19
+ ```typescript
20
+ import type { AppConfig } from '@ai-partner-x/aiko-boot';
21
+ import session from 'express-session';
22
+
23
+ export default {
24
+ server: {
25
+ port: Number(process.env.PORT) || 3001,
26
+ servlet: {
27
+ contextPath: '/api',
28
+ },
29
+ },
30
+ security: {
31
+ enabled: true,
32
+ session: {
33
+ secret: process.env.SESSION_SECRET || 'your-session-secret',
34
+ maxAge: 86400000, // 24 小时
35
+ resave: false,
36
+ saveUninitialized: false,
37
+ cookie: {
38
+ secure: process.env.NODE_ENV === 'production', // 生产环境使用 HTTPS
39
+ httpOnly: true, // 防止 XSS 攻击
40
+ maxAge: 86400000,
41
+ },
42
+ },
43
+ publicPaths: ['/api/auth/login', '/api/auth/register'],
44
+ },
45
+ database: {
46
+ type: 'sqlite',
47
+ filename: './data/app.db',
48
+ },
49
+ } satisfies AppConfig;
50
+ ```
51
+
52
+ ## Session 中间件配置
53
+
54
+ ```typescript
55
+ import session from 'express-session';
56
+ import { createApp } from '@ai-partner-x/aiko-boot';
57
+
58
+ const app = await createApp({ srcDir: __dirname });
59
+
60
+ app.use(session({
61
+ secret: process.env.SESSION_SECRET || 'your-session-secret',
62
+ resave: false,
63
+ saveUninitialized: false,
64
+ cookie: {
65
+ secure: process.env.NODE_ENV === 'production',
66
+ httpOnly: true,
67
+ maxAge: 86400000,
68
+ },
69
+ }));
70
+
71
+ app.run();
72
+ ```
73
+
74
+ ## 实体定义
75
+
76
+ ### User 实体
77
+
78
+ ```typescript
79
+ import { Entity, TableId, TableField, Column } from '@ai-partner-x/aiko-boot-starter-orm';
80
+
81
+ @Entity({ tableName: 'users' })
82
+ export class User {
83
+ @TableId()
84
+ id!: number;
85
+
86
+ @TableField()
87
+ @Column()
88
+ username!: string;
89
+
90
+ @TableField()
91
+ @Column()
92
+ email!: string;
93
+
94
+ @TableField()
95
+ @Column()
96
+ password!: string;
97
+
98
+ @TableField()
99
+ @Column()
100
+ enabled!: boolean;
101
+
102
+ @TableField()
103
+ @Column()
104
+ createdAt!: Date;
105
+
106
+ @TableField()
107
+ @Column()
108
+ updatedAt!: Date;
109
+ }
110
+ ```
111
+
112
+ ### Session 实体(可选)
113
+
114
+ 如果需要将 Session 存储到数据库:
115
+
116
+ ```typescript
117
+ import { Entity, TableId, TableField, Column } from '@ai-partner-x/aiko-boot-starter-orm';
118
+
119
+ @Entity({ tableName: 'sessions' })
120
+ export class Session {
121
+ @TableId()
122
+ id!: string;
123
+
124
+ @TableField()
125
+ @Column()
126
+ userId!: number;
127
+
128
+ @TableField()
129
+ @Column()
130
+ data!: string;
131
+
132
+ @TableField()
133
+ @Column()
134
+ expiresAt!: Date;
135
+
136
+ @TableField()
137
+ @Column()
138
+ createdAt!: Date;
139
+ }
140
+ ```
141
+
142
+ ## DTO 定义
143
+
144
+ ### LoginDto
145
+
146
+ ```typescript
147
+ import { IsNotEmpty, MinLength } from '@ai-partner-x/aiko-boot-starter-validation';
148
+
149
+ export class LoginDto {
150
+ @IsNotEmpty({ message: '用户名不能为空' })
151
+ username!: string;
152
+
153
+ @IsNotEmpty({ message: '密码不能为空' })
154
+ @MinLength(6, { message: '密码长度至少 6 位' })
155
+ password!: string;
156
+ }
157
+ ```
158
+
159
+ ### RegisterDto
160
+
161
+ ```typescript
162
+ import { IsEmail, IsNotEmpty, MinLength, Matches } from '@ai-partner-x/aiko-boot-starter-validation';
163
+
164
+ export class RegisterDto {
165
+ @IsNotEmpty({ message: '用户名不能为空' })
166
+ @MinLength(3, { message: '用户名长度至少 3 位' })
167
+ username!: string;
168
+
169
+ @IsEmail({}, { message: '邮箱格式不正确' })
170
+ email!: string;
171
+
172
+ @IsNotEmpty({ message: '密码不能为空' })
173
+ @MinLength(8, { message: '密码长度至少 8 位' })
174
+ @Matches(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]/, {
175
+ message: '密码必须包含大小写字母、数字和特殊字符'
176
+ })
177
+ password!: string;
178
+ }
179
+ ```
180
+
181
+ ## 服务层
182
+
183
+ ### UserService
184
+
185
+ ```typescript
186
+ import { Service, Autowired } from '@ai-partner-x/aiko-boot';
187
+ import { Mapper, BaseMapper } from '@ai-partner-x/aiko-boot-starter-orm';
188
+ import { User } from '../entity/user.entity.js';
189
+ import bcrypt from 'bcrypt';
190
+
191
+ @Service()
192
+ export class UserService {
193
+ @Autowired()
194
+ private userMapper!: BaseMapper<User>;
195
+
196
+ async findByUsername(username: string): Promise<User | null> {
197
+ const users = await this.userMapper.selectList({
198
+ where: { username }
199
+ });
200
+ return users[0] || null;
201
+ }
202
+
203
+ async findByEmail(email: string): Promise<User | null> {
204
+ const users = await this.userMapper.selectList({
205
+ where: { email }
206
+ });
207
+ return users[0] || null;
208
+ }
209
+
210
+ async findById(id: number): Promise<User | null> {
211
+ return this.userMapper.selectById(id);
212
+ }
213
+
214
+ async create(userData: Partial<User>): Promise<User> {
215
+ const hashedPassword = await bcrypt.hash(userData.password || '', 10);
216
+ const user = {
217
+ ...userData,
218
+ password: hashedPassword,
219
+ enabled: true,
220
+ createdAt: new Date(),
221
+ updatedAt: new Date(),
222
+ };
223
+ const id = await this.userMapper.insert(user);
224
+ return this.userMapper.selectById(id) as Promise<User>;
225
+ }
226
+
227
+ async update(id: number, userData: Partial<User>): Promise<User> {
228
+ await this.userMapper.updateById(id, {
229
+ ...userData,
230
+ updatedAt: new Date(),
231
+ });
232
+ return this.userMapper.selectById(id) as Promise<User>;
233
+ }
234
+
235
+ async delete(id: number): Promise<boolean> {
236
+ return this.userMapper.deleteById(id) > 0;
237
+ }
238
+ }
239
+ ```
240
+
241
+ ### AuthService
242
+
243
+ ```typescript
244
+ import { Service, Autowired } from '@ai-partner-x/aiko-boot';
245
+ import { SessionStrategy } from '@ai-partner-x/aiko-boot-starter-security';
246
+ import { UserService } from './user.service.js';
247
+ import type { RegisterDto } from '../dto/register.dto.js';
248
+
249
+ @Service()
250
+ export class AuthService {
251
+ @Autowired()
252
+ private sessionStrategy!: SessionStrategy;
253
+
254
+ @Autowired()
255
+ private userService!: UserService;
256
+
257
+ async login(request: any, username: string, password: string) {
258
+ const user = await this.userService.findByUsername(username);
259
+
260
+ if (!user) {
261
+ throw new Error('用户名或密码错误');
262
+ }
263
+
264
+ if (!user.enabled) {
265
+ throw new Error('账户已被禁用');
266
+ }
267
+
268
+ const isValid = await bcrypt.compare(password, user.password || '');
269
+
270
+ if (!isValid) {
271
+ throw new Error('用户名或密码错误');
272
+ }
273
+
274
+ await this.sessionStrategy.login(request, user);
275
+
276
+ return {
277
+ user: this.sanitizeUser(user),
278
+ message: '登录成功',
279
+ };
280
+ }
281
+
282
+ async register(userData: RegisterDto) {
283
+ const existingUser = await this.userService.findByUsername(userData.username);
284
+ if (existingUser) {
285
+ throw new Error('用户名已存在');
286
+ }
287
+
288
+ const existingEmail = await this.userService.findByEmail(userData.email);
289
+ if (existingEmail) {
290
+ throw new Error('邮箱已存在');
291
+ }
292
+
293
+ const user = await this.userService.create(userData);
294
+ return this.sanitizeUser(user);
295
+ }
296
+
297
+ async logout(request: any) {
298
+ await this.sessionStrategy.logout(request);
299
+ return { message: '登出成功' };
300
+ }
301
+
302
+ async getCurrentUser(request: any) {
303
+ const user = await this.sessionStrategy.authenticate(request);
304
+ if (!user) {
305
+ throw new Error('未登录');
306
+ }
307
+ return this.sanitizeUser(user);
308
+ }
309
+
310
+ private sanitizeUser(user: User): Partial<User> {
311
+ const { password, ...sanitized } = user;
312
+ return sanitized;
313
+ }
314
+ }
315
+ ```
316
+
317
+ ## 控制器层
318
+
319
+ ### AuthController
320
+
321
+ ```typescript
322
+ import { RestController, PostMapping, GetMapping, RequestBody } from '@ai-partner-x/aiko-boot-starter-web';
323
+ import { Public } from '@ai-partner-x/aiko-boot-starter-security';
324
+ import { AuthService } from '../service/auth.service.js';
325
+ import { LoginDto } from '../dto/login.dto.js';
326
+ import { RegisterDto } from '../dto/register.dto.js';
327
+
328
+ @RestController({ path: '/auth' })
329
+ export class AuthController {
330
+ @Autowired()
331
+ private authService!: AuthService;
332
+
333
+ @PostMapping('/login')
334
+ @Public()
335
+ async login(@RequestBody() dto: LoginDto, request: any) {
336
+ return this.authService.login(request, dto.username, dto.password);
337
+ }
338
+
339
+ @PostMapping('/register')
340
+ @Public()
341
+ async register(@RequestBody() dto: RegisterDto) {
342
+ return this.authService.register(dto);
343
+ }
344
+
345
+ @PostMapping('/logout')
346
+ async logout(request: any) {
347
+ return this.authService.logout(request);
348
+ }
349
+
350
+ @GetMapping('/me')
351
+ async getCurrentUser(request: any) {
352
+ return this.authService.getCurrentUser(request);
353
+ }
354
+ }
355
+ ```
356
+
357
+ ### UserController
358
+
359
+ ```typescript
360
+ import { RestController, GetMapping, PostMapping, RequestBody } from '@ai-partner-x/aiko-boot-starter-web';
361
+ import { Public, PreAuthorize, RolesAllowed } from '@ai-partner-x/aiko-boot-starter-security';
362
+ import { UserService } from '../service/user.service.js';
363
+
364
+ @RestController({ path: '/users' })
365
+ export class UserController {
366
+ @Autowired()
367
+ private userService!: UserService;
368
+
369
+ @GetMapping()
370
+ @PreAuthorize("hasRole('ADMIN')")
371
+ async list(): Promise<any[]> {
372
+ return this.userService.findAll();
373
+ }
374
+
375
+ @GetMapping('/profile')
376
+ async profile(request: any): Promise<any> {
377
+ const authService = Container.get(AuthService);
378
+ return authService.getCurrentUser(request);
379
+ }
380
+
381
+ @GetMapping('/public')
382
+ @Public()
383
+ async publicInfo(): Promise<any> {
384
+ return { message: '公开 API', timestamp: new Date() };
385
+ }
386
+
387
+ @PostMapping('/admin-only')
388
+ @RolesAllowed('ADMIN')
389
+ async adminAction(): Promise<any> {
390
+ return { message: '仅管理员可访问', action: 'admin-operation' };
391
+ }
392
+ }
393
+ ```
394
+
395
+ ## 使用示例
396
+
397
+ ### 1. 用户注册
398
+
399
+ ```bash
400
+ curl -X POST http://localhost:3001/api/auth/register \
401
+ -H "Content-Type: application/json" \
402
+ -c cookies.txt \
403
+ -d '{
404
+ "username": "testuser",
405
+ "email": "test@example.com",
406
+ "password": "Test@123"
407
+ }'
408
+ ```
409
+
410
+ 响应:
411
+ ```json
412
+ {
413
+ "id": 1,
414
+ "username": "testuser",
415
+ "email": "test@example.com",
416
+ "enabled": true,
417
+ "createdAt": "2024-01-01T00:00:00.000Z",
418
+ "updatedAt": "2024-01-01T00:00:00.000Z"
419
+ }
420
+ ```
421
+
422
+ ### 2. 用户登录
423
+
424
+ ```bash
425
+ curl -X POST http://localhost:3001/api/auth/login \
426
+ -H "Content-Type: application/json" \
427
+ -c cookies.txt \
428
+ -d '{
429
+ "username": "testuser",
430
+ "password": "Test@123"
431
+ }'
432
+ ```
433
+
434
+ 响应:
435
+ ```json
436
+ {
437
+ "user": {
438
+ "id": 1,
439
+ "username": "testuser",
440
+ "email": "test@example.com",
441
+ "enabled": true
442
+ },
443
+ "message": "登录成功"
444
+ }
445
+ ```
446
+
447
+ ### 3. 访问受保护的 API
448
+
449
+ ```bash
450
+ curl -X GET http://localhost:3001/api/auth/me \
451
+ -b cookies.txt
452
+ ```
453
+
454
+ 响应:
455
+ ```json
456
+ {
457
+ "id": 1,
458
+ "username": "testuser",
459
+ "email": "test@example.com",
460
+ "enabled": true
461
+ }
462
+ ```
463
+
464
+ ### 4. 用户登出
465
+
466
+ ```bash
467
+ curl -X POST http://localhost:3001/api/auth/logout \
468
+ -b cookies.txt \
469
+ -c cookies.txt
470
+ ```
471
+
472
+ 响应:
473
+ ```json
474
+ {
475
+ "message": "登出成功"
476
+ }
477
+ ```
478
+
479
+ ## Session 存储
480
+
481
+ ### 内存存储(默认)
482
+
483
+ ```typescript
484
+ app.use(session({
485
+ secret: 'your-session-secret',
486
+ resave: false,
487
+ saveUninitialized: false,
488
+ }));
489
+ ```
490
+
491
+ ### Redis 存储(推荐生产环境)
492
+
493
+ ```typescript
494
+ import RedisStore from 'connect-redis';
495
+ import { createClient } from 'redis';
496
+
497
+ const redisClient = createClient({
498
+ url: process.env.REDIS_URL || 'redis://localhost:6379',
499
+ });
500
+
501
+ await redisClient.connect();
502
+
503
+ app.use(session({
504
+ store: new RedisStore({ client: redisClient }),
505
+ secret: process.env.SESSION_SECRET,
506
+ resave: false,
507
+ saveUninitialized: false,
508
+ cookie: {
509
+ secure: process.env.NODE_ENV === 'production',
510
+ httpOnly: true,
511
+ maxAge: 86400000,
512
+ },
513
+ }));
514
+ ```
515
+
516
+ ### 数据库存储
517
+
518
+ ```typescript
519
+ import session from 'express-session';
520
+ import { SessionMapper } from './mapper/session.mapper.js';
521
+
522
+ const DatabaseStore = session.Store;
523
+
524
+ class CustomDatabaseStore extends DatabaseStore {
525
+ async get(sid: string, callback: Function) {
526
+ try {
527
+ const session = await SessionMapper.selectById(sid);
528
+ callback(null, session ? JSON.parse(session.data) : null);
529
+ } catch (error) {
530
+ callback(error);
531
+ }
532
+ }
533
+
534
+ async set(sid: string, session: any, callback: Function) {
535
+ try {
536
+ await SessionMapper.insert({
537
+ id: sid,
538
+ userId: session.userId,
539
+ data: JSON.stringify(session),
540
+ expiresAt: new Date(Date.now() + 86400000),
541
+ createdAt: new Date(),
542
+ });
543
+ callback(null);
544
+ } catch (error) {
545
+ callback(error);
546
+ }
547
+ }
548
+
549
+ async destroy(sid: string, callback: Function) {
550
+ try {
551
+ await SessionMapper.deleteById(sid);
552
+ callback(null);
553
+ } catch (error) {
554
+ callback(error);
555
+ }
556
+ }
557
+
558
+ async all(callback: Function) {
559
+ try {
560
+ const sessions = await SessionMapper.selectList({});
561
+ const result: Record<string, any> = {};
562
+ for (const session of sessions) {
563
+ result[session.id] = JSON.parse(session.data);
564
+ }
565
+ callback(null, result);
566
+ } catch (error) {
567
+ callback(error);
568
+ }
569
+ }
570
+ }
571
+
572
+ app.use(session({
573
+ store: new CustomDatabaseStore(),
574
+ secret: process.env.SESSION_SECRET,
575
+ resave: false,
576
+ saveUninitialized: false,
577
+ }));
578
+ ```
579
+
580
+ ## 安全建议
581
+
582
+ ### 1. Cookie 安全
583
+
584
+ ```typescript
585
+ cookie: {
586
+ secure: process.env.NODE_ENV === 'production', // 仅 HTTPS
587
+ httpOnly: true, // 防止 XSS 攻击
588
+ sameSite: 'strict', // 防止 CSRF 攻击
589
+ maxAge: 86400000,
590
+ }
591
+ ```
592
+
593
+ ### 2. Session Secret
594
+
595
+ ⚠️ **重要**:生产环境必须使用强密钥!
596
+
597
+ ```bash
598
+ # 生成安全的 Session 密钥
599
+ node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
600
+ ```
601
+
602
+ ```typescript
603
+ secret: process.env.SESSION_SECRET, // 必须设置!
604
+ ```
605
+
606
+ ### 3. Session 过期
607
+
608
+ ```typescript
609
+ maxAge: 3600000, // 1 小时(生产环境建议更短)
610
+ ```
611
+
612
+ ### 4. Session 固定攻击防护
613
+
614
+ ```typescript
615
+ app.use(session({
616
+ secret: process.env.SESSION_SECRET,
617
+ resave: false,
618
+ saveUninitialized: false,
619
+ cookie: {
620
+ secure: process.env.NODE_ENV === 'production',
621
+ httpOnly: true,
622
+ sameSite: 'strict',
623
+ maxAge: 86400000,
624
+ },
625
+ rolling: true, // 每次请求都刷新 session
626
+ }));
627
+ ```
628
+
629
+ ### 5. CSRF 保护
630
+
631
+ ```typescript
632
+ import csrf from 'csurf';
633
+
634
+ const csrfProtection = csrf({ cookie: true });
635
+
636
+ app.use(csrfProtection);
637
+
638
+ app.get('/api/csrf-token', (req, res) => {
639
+ res.json({ csrfToken: req.csrfToken() });
640
+ });
641
+ ```
642
+
643
+ ## 常见问题
644
+
645
+ ### Q: Session 和 JWT 有什么区别?
646
+
647
+ A: Session 是有状态的,服务端存储会话信息;JWT 是无状态的,信息存储在 token 中。
648
+
649
+ ### Q: 什么时候使用 Session?
650
+
651
+ A: 传统 Web 应用、需要服务端控制、需要主动撤销会话的场景。
652
+
653
+ ### Q: 什么时候使用 JWT?
654
+
655
+ A: RESTful API、微服务架构、移动端应用、需要跨域的场景。
656
+
657
+ ### Q: 如何实现 Session 轮换?
658
+
659
+ A: 使用 `rolling: true` 选项,每次请求都刷新 session。
660
+
661
+ ### Q: 如何实现多设备登录控制?
662
+
663
+ A: 在数据库中存储所有 session,限制每个用户的最大 session 数量。
664
+
665
+ ## 扩展功能
666
+
667
+ ### 1. 记住我功能
668
+
669
+ ```typescript
670
+ async login(request: any, username: string, password: string, rememberMe: boolean = false) {
671
+ const user = await this.userService.findByUsername(username);
672
+
673
+ if (!user || !await bcrypt.compare(password, user.password || '')) {
674
+ throw new Error('用户名或密码错误');
675
+ }
676
+
677
+ await this.sessionStrategy.login(request, user);
678
+
679
+ if (rememberMe) {
680
+ request.session.cookie.maxAge = 30 * 24 * 60 * 60 * 1000; // 30 天
681
+ }
682
+
683
+ return {
684
+ user: this.sanitizeUser(user),
685
+ message: '登录成功',
686
+ };
687
+ }
688
+ ```
689
+
690
+ ### 2. Session 黑名单
691
+
692
+ ```typescript
693
+ const sessionBlacklist = new Set<string>();
694
+
695
+ async logout(request: any) {
696
+ const sessionId = request.sessionID;
697
+ sessionBlacklist.add(sessionId);
698
+ await this.sessionStrategy.logout(request);
699
+ return { message: '登出成功' };
700
+ }
701
+
702
+ async checkSession(request: any) {
703
+ const sessionId = request.sessionID;
704
+ if (sessionBlacklist.has(sessionId)) {
705
+ throw new Error('Session 已失效');
706
+ }
707
+ }
708
+ ```
709
+
710
+ ### 3. 并发登录控制
711
+
712
+ ```typescript
713
+ async login(request: any, username: string, password: string) {
714
+ const user = await this.userService.findByUsername(username);
715
+
716
+ if (!user || !await bcrypt.compare(password, user.password || '')) {
717
+ throw new Error('用户名或密码错误');
718
+ }
719
+
720
+ const existingSessions = await this.getUserSessions(user.id);
721
+ if (existingSessions.length >= 3) {
722
+ await this.destroyOldestSession(user.id);
723
+ }
724
+
725
+ await this.sessionStrategy.login(request, user);
726
+
727
+ return {
728
+ user: this.sanitizeUser(user),
729
+ message: '登录成功',
730
+ };
731
+ }
732
+ ```
733
+
734
+ ## 性能优化
735
+
736
+ ### 1. 使用 Redis 存储
737
+
738
+ Redis 提供快速的 Session 存储,适合高并发场景。
739
+
740
+ ### 2. 减少 Session 大小
741
+
742
+ 只存储必要的信息,避免在 Session 中存储大量数据。
743
+
744
+ ### 3. 使用 CDN
745
+
746
+ 静态资源使用 CDN,减少服务器负载。
747
+
748
+ ## 更多信息
749
+
750
+ - [Express Session 文档](https://github.com/expressjs/session)
751
+ - [Redis Session 存储](https://github.com/tj/connect-redis)
752
+ - [CSRF 保护](https://github.com/expressjs/csurf)
753
+ - [Aiko Boot Security 文档](../../../../../packages/aiko-boot-starter-security/README.md)