@liujitcn/kratos-admin-system 0.0.31 → 0.0.33

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 (341) hide show
  1. package/README.md +34 -20
  2. package/dist/package/declarations/src/api/base/{notification.d.ts → v1/notification.d.ts} +3 -1
  3. package/dist/package/declarations/src/api/system/admin/v1/base_api_log.d.ts +10 -0
  4. package/dist/package/declarations/src/api/system/{base_area.d.ts → admin/v1/base_area.d.ts} +1 -1
  5. package/dist/package/declarations/src/api/system/{base_config.d.ts → admin/v1/base_config.d.ts} +5 -1
  6. package/dist/package/declarations/src/api/system/admin/v1/base_data_access_log.d.ts +10 -0
  7. package/dist/package/declarations/src/api/system/admin/v1/base_dict.d.ts +20 -0
  8. package/dist/package/declarations/src/api/system/admin/v1/base_dict_item.d.ts +18 -0
  9. package/dist/package/declarations/src/api/system/{base_job.d.ts → admin/v1/base_job.d.ts} +4 -5
  10. package/dist/package/declarations/src/api/system/admin/v1/base_job_log.d.ts +9 -0
  11. package/dist/package/declarations/src/api/system/{base_language.d.ts → admin/v1/base_language.d.ts} +3 -3
  12. package/dist/package/declarations/src/api/system/admin/v1/base_log.d.ts +8 -0
  13. package/dist/package/declarations/src/api/system/admin/v1/base_login_log.d.ts +10 -0
  14. package/dist/package/declarations/src/api/system/admin/v1/base_login_policy.d.ts +19 -0
  15. package/dist/package/declarations/src/api/system/admin/v1/base_operation_log.d.ts +10 -0
  16. package/dist/package/declarations/src/api/system/admin/v1/base_permission_log.d.ts +10 -0
  17. package/dist/package/declarations/src/api/system/admin/v1/base_policy_evaluation_log.d.ts +10 -0
  18. package/dist/package/declarations/src/api/system/admin/v1/base_redact_output_policy.d.ts +19 -0
  19. package/dist/package/declarations/src/api/system/admin/v1/base_redact_rule.d.ts +22 -0
  20. package/dist/package/declarations/src/api/system/admin/v1/base_redact_storage_policy.d.ts +19 -0
  21. package/dist/package/declarations/src/api/system/admin/v1/base_table_archive.d.ts +20 -0
  22. package/dist/package/declarations/src/api/system/admin/v1/base_table_archive_record.d.ts +11 -0
  23. package/dist/package/declarations/src/api/system/admin/v1/base_table_archive_restore.d.ts +14 -0
  24. package/dist/package/declarations/src/api/system/admin/v1/base_table_backup.d.ts +20 -0
  25. package/dist/package/declarations/src/api/system/admin/v1/base_table_backup_record.d.ts +11 -0
  26. package/dist/package/declarations/src/api/system/admin/v1/base_table_backup_restore.d.ts +14 -0
  27. package/dist/package/declarations/src/api/system/admin/v1/base_table_source.d.ts +11 -0
  28. package/dist/package/declarations/src/api/system/admin/v1/cache.d.ts +7 -0
  29. package/dist/package/declarations/src/components/ChangePasswordForm.vue.d.ts +3 -0
  30. package/dist/package/declarations/src/components/DynamicI18nCell.vue.d.ts +5 -1
  31. package/dist/package/declarations/src/components/ForcedPasswordDialog.vue.d.ts +3 -0
  32. package/dist/package/declarations/src/components/{AuditLogTable.vue.d.ts → LogTable.vue.d.ts} +14 -7
  33. package/dist/package/declarations/src/components/dynamicI18n.d.ts +4 -7
  34. package/dist/package/declarations/src/components/log.d.ts +20 -0
  35. package/dist/package/declarations/src/config/base-log-fallback.d.ts +7 -0
  36. package/dist/package/declarations/src/config/database-backup.d.ts +12 -0
  37. package/dist/package/declarations/src/config/index.d.ts +7 -0
  38. package/dist/package/declarations/src/config/types.d.ts +56 -0
  39. package/dist/package/declarations/src/locales/generated.d.ts +1376 -500
  40. package/dist/package/declarations/src/rpc/base/v1/login.d.ts +5 -3
  41. package/dist/package/declarations/src/rpc/base/v1/notification.d.ts +25 -0
  42. package/dist/package/declarations/src/rpc/system/admin/v1/auth.d.ts +13 -0
  43. package/dist/package/declarations/src/rpc/system/admin/v1/base_api.d.ts +2 -0
  44. package/dist/package/declarations/src/rpc/system/admin/v1/base_api_log.d.ts +84 -0
  45. package/dist/package/declarations/src/rpc/system/admin/v1/base_config.d.ts +38 -0
  46. package/dist/package/declarations/src/rpc/system/admin/v1/base_data_access_log.d.ts +112 -0
  47. package/dist/package/declarations/src/rpc/system/admin/v1/base_dict.d.ts +0 -101
  48. package/dist/package/declarations/src/rpc/system/admin/v1/base_dict_item.d.ts +107 -0
  49. package/dist/package/declarations/src/rpc/system/admin/v1/base_job.d.ts +5 -56
  50. package/dist/package/declarations/src/rpc/system/admin/v1/base_job_log.d.ts +60 -0
  51. package/dist/package/declarations/src/rpc/system/admin/v1/base_log.d.ts +77 -0
  52. package/dist/package/declarations/src/rpc/system/admin/v1/base_login_log.d.ts +92 -0
  53. package/dist/package/declarations/src/rpc/system/admin/v1/base_login_policy.d.ts +169 -41
  54. package/dist/package/declarations/src/rpc/system/admin/v1/base_operation_log.d.ts +106 -0
  55. package/dist/package/declarations/src/rpc/system/admin/v1/base_permission_log.d.ts +118 -0
  56. package/dist/package/declarations/src/rpc/system/admin/v1/base_policy_evaluation_log.d.ts +119 -0
  57. package/dist/package/declarations/src/rpc/system/admin/v1/base_redact_common.d.ts +9 -0
  58. package/dist/package/declarations/src/rpc/system/admin/v1/base_redact_output_policy.d.ts +135 -0
  59. package/dist/package/declarations/src/rpc/system/admin/v1/base_redact_rule.d.ts +107 -0
  60. package/dist/package/declarations/src/rpc/system/admin/v1/base_redact_storage_policy.d.ts +114 -0
  61. package/dist/package/declarations/src/rpc/system/admin/v1/base_table_archive.d.ts +90 -0
  62. package/dist/package/declarations/src/rpc/system/admin/v1/base_table_archive_record.d.ts +82 -0
  63. package/dist/package/declarations/src/rpc/system/admin/v1/base_table_archive_restore.d.ts +76 -0
  64. package/dist/package/declarations/src/rpc/system/admin/v1/base_table_backup.d.ts +74 -0
  65. package/dist/package/declarations/src/rpc/system/admin/v1/base_table_backup_record.d.ts +69 -0
  66. package/dist/package/declarations/src/rpc/system/admin/v1/base_table_backup_restore.d.ts +76 -0
  67. package/dist/package/declarations/src/rpc/system/admin/v1/base_table_source.d.ts +16 -0
  68. package/dist/package/declarations/src/rpc/system/admin/v1/base_user.d.ts +15 -0
  69. package/dist/package/declarations/src/rpc/system/admin/v1/cache.d.ts +47 -0
  70. package/dist/package/declarations/src/rpc/system/admin/v1/code_gen_column.d.ts +2 -0
  71. package/dist/package/declarations/src/rpc/system/admin/v1/code_gen_table.d.ts +8 -0
  72. package/dist/package/declarations/src/rpc/system/common/v1/common.d.ts +26 -0
  73. package/dist/package/declarations/src/rpc/system/config/v1/system_config.d.ts +8 -0
  74. package/dist/package/declarations/src/{api/system → utils}/code_gen_i18n.d.ts +1 -2
  75. package/dist/package/declarations/src/{api/system → utils}/code_gen_sse.d.ts +1 -1
  76. package/dist/package/declarations/src/utils/notification-response.d.ts +5 -0
  77. package/dist/package/declarations/src/{api/system → utils}/ops_monitoring_sse.d.ts +1 -1
  78. package/dist/package/declarations/src/{api/system → utils}/runtime_log_sse.d.ts +1 -1
  79. package/dist/package/declarations/src/views/base/backup-management/archive-config/index.vue.d.ts +3 -0
  80. package/dist/package/declarations/src/views/base/backup-management/archive-record/index.vue.d.ts +3 -0
  81. package/dist/package/declarations/src/views/base/backup-management/archive-restore/index.vue.d.ts +3 -0
  82. package/dist/package/declarations/src/views/base/backup-management/backup-config/index.vue.d.ts +3 -0
  83. package/dist/package/declarations/src/views/base/backup-management/backup-record/index.vue.d.ts +3 -0
  84. package/dist/package/declarations/src/views/base/backup-management/backup-restore/index.vue.d.ts +3 -0
  85. package/dist/package/declarations/src/views/base/login-policy/format.d.ts +2 -0
  86. package/dist/package/declarations/src/views/base/redact-output-policy/index.vue.d.ts +3 -0
  87. package/dist/package/declarations/src/views/base/redact-rule/index.vue.d.ts +3 -0
  88. package/dist/package/declarations/src/views/base/redact-storage-policy/index.vue.d.ts +3 -0
  89. package/dist/package/declarations/src/views/base/runtime-config/index.vue.d.ts +3 -0
  90. package/dist/package/declarations/src/views/tool/cache/index.vue.d.ts +3 -0
  91. package/dist/package/src/api/base/v1/notification.ts +99 -0
  92. package/dist/package/src/api/system/admin/v1/base_api_log.ts +33 -0
  93. package/dist/package/src/api/system/{base_area.ts → admin/v1/base_area.ts} +1 -1
  94. package/dist/package/src/api/system/{base_config.ts → admin/v1/base_config.ts} +20 -0
  95. package/dist/package/src/api/system/admin/v1/base_data_access_log.ts +33 -0
  96. package/dist/package/src/api/system/{base_dict.ts → admin/v1/base_dict.ts} +0 -60
  97. package/dist/package/src/api/system/admin/v1/base_dict_item.ts +72 -0
  98. package/dist/package/src/api/system/{base_job.ts → admin/v1/base_job.ts} +11 -22
  99. package/dist/package/src/api/system/admin/v1/base_job_log.ts +32 -0
  100. package/dist/package/src/api/system/{base_language.ts → admin/v1/base_language.ts} +3 -3
  101. package/dist/package/src/api/system/admin/v1/base_log.ts +23 -0
  102. package/dist/package/src/api/system/admin/v1/base_login_log.ts +33 -0
  103. package/dist/package/src/api/system/admin/v1/base_login_policy.ts +67 -0
  104. package/dist/package/src/api/system/{base_message.ts → admin/v1/base_message.ts} +29 -9
  105. package/dist/package/src/api/system/{base_message_category.ts → admin/v1/base_message_category.ts} +30 -7
  106. package/dist/package/src/api/system/admin/v1/base_operation_log.ts +33 -0
  107. package/dist/package/src/api/system/admin/v1/base_permission_log.ts +33 -0
  108. package/dist/package/src/api/system/admin/v1/base_policy_evaluation_log.ts +33 -0
  109. package/dist/package/src/api/system/admin/v1/base_redact_output_policy.ts +51 -0
  110. package/dist/package/src/api/system/admin/v1/base_redact_rule.ts +27 -0
  111. package/dist/package/src/api/system/admin/v1/base_redact_storage_policy.ts +51 -0
  112. package/dist/package/src/api/system/admin/v1/base_table_archive.ts +70 -0
  113. package/dist/package/src/api/system/admin/v1/base_table_archive_record.ts +33 -0
  114. package/dist/package/src/api/system/admin/v1/base_table_archive_restore.ts +44 -0
  115. package/dist/package/src/api/system/admin/v1/base_table_backup.ts +70 -0
  116. package/dist/package/src/api/system/admin/v1/base_table_backup_record.ts +33 -0
  117. package/dist/package/src/api/system/admin/v1/base_table_backup_restore.ts +44 -0
  118. package/dist/package/src/api/system/admin/v1/base_table_source.ts +33 -0
  119. package/dist/package/src/api/system/admin/v1/cache.ts +22 -0
  120. package/dist/package/src/api/system/{code_gen_column.ts → admin/v1/code_gen_column.ts} +19 -3
  121. package/dist/package/src/api/system/{code_gen_table.ts → admin/v1/code_gen_table.ts} +13 -4
  122. package/dist/package/src/components/Ai.vue +1 -1
  123. package/dist/package/src/components/ChangePasswordForm.vue +143 -0
  124. package/dist/package/src/components/DynamicI18nCell.vue +28 -8
  125. package/dist/package/src/components/DynamicI18nEditor.vue +1 -1
  126. package/dist/package/src/components/ForcedPasswordDialog.vue +40 -0
  127. package/dist/package/src/components/LogTable.vue +190 -0
  128. package/dist/package/src/components/Notification.vue +112 -7
  129. package/dist/package/src/components/dynamicI18n.ts +5 -9
  130. package/dist/package/src/components/log.ts +87 -0
  131. package/dist/package/src/config/base-log-fallback.ts +26 -0
  132. package/dist/package/src/config/database-backup.ts +57 -0
  133. package/dist/package/src/config/index.ts +26 -0
  134. package/dist/package/src/config/types.ts +59 -0
  135. package/dist/package/src/locales/README.md +2 -1
  136. package/dist/package/src/locales/en-US.json +358 -127
  137. package/dist/package/src/locales/ja-JP.json +358 -127
  138. package/dist/package/src/locales/zh-CN.json +358 -127
  139. package/dist/package/src/locales/zh-TW.json +358 -127
  140. package/dist/package/src/module.ts +3 -1
  141. package/dist/package/src/rpc/base/v1/ai_message.ts +1 -1
  142. package/dist/package/src/rpc/base/v1/ai_session.ts +1 -1
  143. package/dist/package/src/rpc/base/v1/ai_tool.ts +1 -1
  144. package/dist/package/src/rpc/base/v1/config.ts +1 -1
  145. package/dist/package/src/rpc/base/v1/login.ts +5 -3
  146. package/dist/package/src/rpc/base/v1/notification.ts +29 -1
  147. package/dist/package/src/rpc/base/v1/oauth.ts +1 -1
  148. package/dist/package/src/rpc/base/v1/oauth_client.ts +1 -1
  149. package/dist/package/src/rpc/base/v1/sse.ts +1 -1
  150. package/dist/package/src/rpc/common/v1/analytics.ts +1 -1
  151. package/dist/package/src/rpc/common/v1/common.ts +1 -1
  152. package/dist/package/src/rpc/common/v1/enum.ts +1 -1
  153. package/dist/package/src/rpc/common/v1/types.ts +1 -1
  154. package/dist/package/src/rpc/google/protobuf/empty.ts +1 -1
  155. package/dist/package/src/rpc/google/protobuf/timestamp.ts +1 -1
  156. package/dist/package/src/rpc/system/admin/v1/auth.ts +14 -1
  157. package/dist/package/src/rpc/system/admin/v1/base_api.ts +3 -1
  158. package/dist/package/src/rpc/system/admin/v1/base_api_log.ts +102 -0
  159. package/dist/package/src/rpc/system/admin/v1/base_area.ts +1 -1
  160. package/dist/package/src/rpc/system/admin/v1/base_config.ts +43 -1
  161. package/dist/package/src/rpc/system/admin/v1/base_dashboard.ts +1 -1
  162. package/dist/package/src/rpc/system/admin/v1/base_data_access_log.ts +135 -0
  163. package/dist/package/src/rpc/system/admin/v1/base_dept.ts +1 -1
  164. package/dist/package/src/rpc/system/admin/v1/base_dict.ts +1 -113
  165. package/dist/package/src/rpc/system/admin/v1/base_dict_item.ts +126 -0
  166. package/dist/package/src/rpc/system/admin/v1/base_file.ts +1 -1
  167. package/dist/package/src/rpc/system/admin/v1/base_i18n.ts +1 -1
  168. package/dist/package/src/rpc/system/admin/v1/base_job.ts +6 -63
  169. package/dist/package/src/rpc/system/admin/v1/base_job_log.ts +75 -0
  170. package/dist/package/src/rpc/system/admin/v1/base_language.ts +1 -1
  171. package/dist/package/src/rpc/system/admin/v1/base_log.ts +90 -0
  172. package/dist/package/src/rpc/system/admin/v1/base_login_log.ts +113 -0
  173. package/dist/package/src/rpc/system/admin/v1/base_login_policy.ts +192 -43
  174. package/dist/package/src/rpc/system/admin/v1/base_menu.ts +1 -1
  175. package/dist/package/src/rpc/system/admin/v1/base_message.ts +1 -1
  176. package/dist/package/src/rpc/system/admin/v1/base_message_category.ts +1 -1
  177. package/dist/package/src/rpc/system/admin/v1/base_migration.ts +1 -1
  178. package/dist/package/src/rpc/system/admin/v1/base_operation_log.ts +127 -0
  179. package/dist/package/src/rpc/system/admin/v1/base_permission_log.ts +142 -0
  180. package/dist/package/src/rpc/system/admin/v1/base_policy_evaluation_log.ts +143 -0
  181. package/dist/package/src/rpc/system/admin/v1/base_post.ts +1 -1
  182. package/dist/package/src/rpc/system/admin/v1/base_redact_common.ts +17 -0
  183. package/dist/package/src/rpc/system/admin/v1/base_redact_output_policy.ts +157 -0
  184. package/dist/package/src/rpc/system/admin/v1/base_redact_rule.ts +127 -0
  185. package/dist/package/src/rpc/system/admin/v1/base_redact_storage_policy.ts +137 -0
  186. package/dist/package/src/rpc/system/admin/v1/base_role.ts +1 -1
  187. package/dist/package/src/rpc/system/admin/v1/base_session.ts +1 -1
  188. package/dist/package/src/rpc/system/admin/v1/base_table_archive.ts +109 -0
  189. package/dist/package/src/rpc/system/admin/v1/base_table_archive_record.ts +95 -0
  190. package/dist/package/src/rpc/system/admin/v1/base_table_archive_restore.ts +93 -0
  191. package/dist/package/src/rpc/system/admin/v1/base_table_backup.ts +91 -0
  192. package/dist/package/src/rpc/system/admin/v1/base_table_backup_record.ts +82 -0
  193. package/dist/package/src/rpc/system/admin/v1/base_table_backup_restore.ts +91 -0
  194. package/dist/package/src/rpc/system/admin/v1/base_table_source.ts +26 -0
  195. package/dist/package/src/rpc/system/admin/v1/base_tenant.ts +1 -1
  196. package/dist/package/src/rpc/system/admin/v1/base_third_account.ts +1 -1
  197. package/dist/package/src/rpc/system/admin/v1/base_user.ts +16 -1
  198. package/dist/package/src/rpc/system/admin/v1/cache.ts +59 -0
  199. package/dist/package/src/rpc/system/admin/v1/code_gen.ts +1 -1
  200. package/dist/package/src/rpc/system/admin/v1/code_gen_column.ts +3 -1
  201. package/dist/package/src/rpc/system/admin/v1/code_gen_proto.ts +1 -1
  202. package/dist/package/src/rpc/system/admin/v1/code_gen_table.ts +9 -1
  203. package/dist/package/src/rpc/system/admin/v1/common.ts +1 -1
  204. package/dist/package/src/rpc/system/admin/v1/oauth_client.ts +1 -1
  205. package/dist/package/src/rpc/system/admin/v1/ops_monitoring.ts +1 -1
  206. package/dist/package/src/rpc/system/admin/v1/project_document.ts +1 -1
  207. package/dist/package/src/rpc/system/admin/v1/runtime_log.ts +1 -1
  208. package/dist/package/src/rpc/system/common/v1/common.ts +35 -0
  209. package/dist/package/src/rpc/system/config/v1/system_config.ts +16 -0
  210. package/dist/package/src/{api/system → utils}/code_gen_i18n.ts +1 -1
  211. package/dist/package/src/{api/system → utils}/code_gen_sse.ts +1 -1
  212. package/dist/package/src/utils/notification-response.ts +22 -0
  213. package/dist/package/src/{api/system → utils}/ops_monitoring_sse.ts +1 -1
  214. package/dist/package/src/{api/system → utils}/runtime_log_sse.ts +1 -1
  215. package/dist/package/src/views/ai/chat/components/AiMarkdown.vue +1 -1
  216. package/dist/package/src/views/ai/chat/components/ChatPanel.vue +2 -4
  217. package/dist/package/src/views/ai/chat/components/XSender.vue +1 -1
  218. package/dist/package/src/views/ai/chat/index.vue +3 -3
  219. package/dist/package/src/views/ai/chat/message.ts +3 -8
  220. package/dist/package/src/views/base/api/index.vue +4 -4
  221. package/dist/package/src/views/base/api-log/index.vue +56 -45
  222. package/dist/package/src/views/base/area/index.vue +1 -1
  223. package/dist/package/src/views/base/backup-management/archive-config/index.vue +151 -0
  224. package/dist/package/src/views/base/backup-management/archive-record/index.vue +44 -0
  225. package/dist/package/src/views/base/backup-management/archive-restore/index.vue +59 -0
  226. package/dist/package/src/views/base/backup-management/backup-config/index.vue +119 -0
  227. package/dist/package/src/views/base/backup-management/backup-record/index.vue +41 -0
  228. package/dist/package/src/views/base/backup-management/backup-restore/index.vue +66 -0
  229. package/dist/package/src/views/base/config/index.vue +16 -25
  230. package/dist/package/src/views/base/dashboard/index.vue +68 -66
  231. package/dist/package/src/views/base/data-access-log/index.vue +64 -52
  232. package/dist/package/src/views/base/dept/index.vue +11 -11
  233. package/dist/package/src/views/base/dict/index.vue +5 -5
  234. package/dist/package/src/views/base/dict/item.vue +12 -12
  235. package/dist/package/src/views/base/file/index.vue +220 -16
  236. package/dist/package/src/views/base/job/index.vue +5 -5
  237. package/dist/package/src/views/base/job/log.vue +38 -11
  238. package/dist/package/src/views/base/language/index.vue +1 -1
  239. package/dist/package/src/views/base/login-log/index.vue +49 -45
  240. package/dist/package/src/views/base/login-policy/format.ts +4 -0
  241. package/dist/package/src/views/base/login-policy/index.vue +496 -185
  242. package/dist/package/src/views/base/menu/index.vue +17 -17
  243. package/dist/package/src/views/base/message/index.vue +149 -19
  244. package/dist/package/src/views/base/message-category/index.vue +41 -10
  245. package/dist/package/src/views/base/migration/index.vue +2 -2
  246. package/dist/package/src/views/base/oauth-client/index.vue +19 -9
  247. package/dist/package/src/views/base/operation-log/index.vue +54 -50
  248. package/dist/package/src/views/base/permission-log/index.vue +57 -52
  249. package/dist/package/src/views/base/policy-evaluation-log/index.vue +61 -50
  250. package/dist/package/src/views/base/post/index.vue +11 -11
  251. package/dist/package/src/views/base/redact-output-policy/index.vue +324 -0
  252. package/dist/package/src/views/base/redact-rule/index.vue +361 -0
  253. package/dist/package/src/views/base/redact-storage-policy/index.vue +276 -0
  254. package/dist/package/src/views/base/role/index.vue +9 -9
  255. package/dist/package/src/views/base/runtime-config/index.vue +479 -0
  256. package/dist/package/src/views/base/tenant/index.vue +9 -9
  257. package/dist/package/src/views/base/user/components/dept-tree.vue +1 -1
  258. package/dist/package/src/views/base/user/index.vue +86 -47
  259. package/dist/package/src/views/message/inbox/index.vue +38 -11
  260. package/dist/package/src/views/profile/components/base.vue +84 -8
  261. package/dist/package/src/views/profile/components/password.vue +2 -228
  262. package/dist/package/src/views/profile/components/security.vue +3 -3
  263. package/dist/package/src/views/profile/components/session.vue +10 -2
  264. package/dist/package/src/views/profile/index.vue +10 -9
  265. package/dist/package/src/views/tool/api-doc/index.vue +3 -3
  266. package/dist/package/src/views/tool/cache/index.vue +352 -0
  267. package/dist/package/src/views/tool/code-gen/code-preview/index.vue +4 -4
  268. package/dist/package/src/views/tool/code-gen/columns/index.vue +16 -16
  269. package/dist/package/src/views/tool/code-gen/components/CodeGenLocaleEditor.vue +2 -2
  270. package/dist/package/src/views/tool/code-gen/components/CodeGenProgressDialog.vue +2 -2
  271. package/dist/package/src/views/tool/code-gen/config.ts +2 -0
  272. package/dist/package/src/views/tool/code-gen/preview/index.vue +9 -9
  273. package/dist/package/src/views/tool/code-gen/proto/index.vue +10 -12
  274. package/dist/package/src/views/tool/code-gen/table/index.vue +71 -15
  275. package/dist/package/src/views/tool/ops-monitoring/index.vue +31 -96
  276. package/dist/package/src/views/tool/project-doc/index.vue +2 -2
  277. package/dist/package/src/views/tool/runtime-log/index.vue +6 -6
  278. package/package.json +7 -2
  279. package/dist/package/declarations/src/api/system/base_audit_log.d.ts +0 -55
  280. package/dist/package/declarations/src/api/system/base_dict.d.ts +0 -32
  281. package/dist/package/declarations/src/api/system/base_login_policy.d.ts +0 -10
  282. package/dist/package/declarations/src/components/auditLog.d.ts +0 -9
  283. package/dist/package/declarations/src/rpc/system/admin/v1/base_audit_log.d.ts +0 -640
  284. package/dist/package/src/api/base/notification.ts +0 -69
  285. package/dist/package/src/api/system/base_audit_log.ts +0 -168
  286. package/dist/package/src/api/system/base_login_policy.ts +0 -32
  287. package/dist/package/src/components/AuditLogTable.vue +0 -105
  288. package/dist/package/src/components/auditLog.ts +0 -46
  289. package/dist/package/src/rpc/system/admin/v1/base_audit_log.ts +0 -737
  290. /package/dist/package/declarations/src/api/base/{ai_message.d.ts → v1/ai_message.d.ts} +0 -0
  291. /package/dist/package/declarations/src/api/base/{ai_session.d.ts → v1/ai_session.d.ts} +0 -0
  292. /package/dist/package/declarations/src/api/base/{ai_tool.d.ts → v1/ai_tool.d.ts} +0 -0
  293. /package/dist/package/declarations/src/api/base/{oauth.d.ts → v1/oauth.d.ts} +0 -0
  294. /package/dist/package/declarations/src/api/base/{sse.d.ts → v1/sse.d.ts} +0 -0
  295. /package/dist/package/declarations/src/api/system/{auth.d.ts → admin/v1/auth.d.ts} +0 -0
  296. /package/dist/package/declarations/src/api/system/{base_api.d.ts → admin/v1/base_api.d.ts} +0 -0
  297. /package/dist/package/declarations/src/api/system/{base_dashboard.d.ts → admin/v1/base_dashboard.d.ts} +0 -0
  298. /package/dist/package/declarations/src/api/system/{base_dept.d.ts → admin/v1/base_dept.d.ts} +0 -0
  299. /package/dist/package/declarations/src/api/system/{base_file.d.ts → admin/v1/base_file.d.ts} +0 -0
  300. /package/dist/package/declarations/src/api/system/{base_i18n.d.ts → admin/v1/base_i18n.d.ts} +0 -0
  301. /package/dist/package/declarations/src/api/system/{base_menu.d.ts → admin/v1/base_menu.d.ts} +0 -0
  302. /package/dist/package/declarations/src/api/system/{base_message.d.ts → admin/v1/base_message.d.ts} +0 -0
  303. /package/dist/package/declarations/src/api/system/{base_message_category.d.ts → admin/v1/base_message_category.d.ts} +0 -0
  304. /package/dist/package/declarations/src/api/system/{base_migration.d.ts → admin/v1/base_migration.d.ts} +0 -0
  305. /package/dist/package/declarations/src/api/system/{base_post.d.ts → admin/v1/base_post.d.ts} +0 -0
  306. /package/dist/package/declarations/src/api/system/{base_role.d.ts → admin/v1/base_role.d.ts} +0 -0
  307. /package/dist/package/declarations/src/api/system/{base_session.d.ts → admin/v1/base_session.d.ts} +0 -0
  308. /package/dist/package/declarations/src/api/system/{base_tenant.d.ts → admin/v1/base_tenant.d.ts} +0 -0
  309. /package/dist/package/declarations/src/api/system/{base_user.d.ts → admin/v1/base_user.d.ts} +0 -0
  310. /package/dist/package/declarations/src/api/system/{code_gen.d.ts → admin/v1/code_gen.d.ts} +0 -0
  311. /package/dist/package/declarations/src/api/system/{code_gen_column.d.ts → admin/v1/code_gen_column.d.ts} +0 -0
  312. /package/dist/package/declarations/src/api/system/{code_gen_proto.d.ts → admin/v1/code_gen_proto.d.ts} +0 -0
  313. /package/dist/package/declarations/src/api/system/{code_gen_table.d.ts → admin/v1/code_gen_table.d.ts} +0 -0
  314. /package/dist/package/declarations/src/api/system/{oauth_client.d.ts → admin/v1/oauth_client.d.ts} +0 -0
  315. /package/dist/package/declarations/src/api/system/{ops_monitoring.d.ts → admin/v1/ops_monitoring.d.ts} +0 -0
  316. /package/dist/package/declarations/src/api/system/{project_document.d.ts → admin/v1/project_document.d.ts} +0 -0
  317. /package/dist/package/declarations/src/api/system/{runtime_log.d.ts → admin/v1/runtime_log.d.ts} +0 -0
  318. /package/dist/package/src/api/base/{ai_message.ts → v1/ai_message.ts} +0 -0
  319. /package/dist/package/src/api/base/{ai_session.ts → v1/ai_session.ts} +0 -0
  320. /package/dist/package/src/api/base/{ai_tool.ts → v1/ai_tool.ts} +0 -0
  321. /package/dist/package/src/api/base/{oauth.ts → v1/oauth.ts} +0 -0
  322. /package/dist/package/src/api/base/{sse.ts → v1/sse.ts} +0 -0
  323. /package/dist/package/src/api/system/{auth.ts → admin/v1/auth.ts} +0 -0
  324. /package/dist/package/src/api/system/{base_api.ts → admin/v1/base_api.ts} +0 -0
  325. /package/dist/package/src/api/system/{base_dashboard.ts → admin/v1/base_dashboard.ts} +0 -0
  326. /package/dist/package/src/api/system/{base_dept.ts → admin/v1/base_dept.ts} +0 -0
  327. /package/dist/package/src/api/system/{base_file.ts → admin/v1/base_file.ts} +0 -0
  328. /package/dist/package/src/api/system/{base_i18n.ts → admin/v1/base_i18n.ts} +0 -0
  329. /package/dist/package/src/api/system/{base_menu.ts → admin/v1/base_menu.ts} +0 -0
  330. /package/dist/package/src/api/system/{base_migration.ts → admin/v1/base_migration.ts} +0 -0
  331. /package/dist/package/src/api/system/{base_post.ts → admin/v1/base_post.ts} +0 -0
  332. /package/dist/package/src/api/system/{base_role.ts → admin/v1/base_role.ts} +0 -0
  333. /package/dist/package/src/api/system/{base_session.ts → admin/v1/base_session.ts} +0 -0
  334. /package/dist/package/src/api/system/{base_tenant.ts → admin/v1/base_tenant.ts} +0 -0
  335. /package/dist/package/src/api/system/{base_user.ts → admin/v1/base_user.ts} +0 -0
  336. /package/dist/package/src/api/system/{code_gen.ts → admin/v1/code_gen.ts} +0 -0
  337. /package/dist/package/src/api/system/{code_gen_proto.ts → admin/v1/code_gen_proto.ts} +0 -0
  338. /package/dist/package/src/api/system/{oauth_client.ts → admin/v1/oauth_client.ts} +0 -0
  339. /package/dist/package/src/api/system/{ops_monitoring.ts → admin/v1/ops_monitoring.ts} +0 -0
  340. /package/dist/package/src/api/system/{project_document.ts → admin/v1/project_document.ts} +0 -0
  341. /package/dist/package/src/api/system/{runtime_log.ts → admin/v1/runtime_log.ts} +0 -0
@@ -1,219 +1,530 @@
1
1
  <template>
2
2
  <div class="login-policy-page">
3
- <el-card shadow="never">
4
- <template #header>
5
- <div class="policy-header">
6
- <div>
7
- <h3>{{ t("system.base.login_policy.title") }}</h3>
8
- <p>{{ t("system.base.login_policy.description") }}</p>
9
- </div>
10
- <el-switch v-model="form.enabled" :active-text="t('system.base.login_policy.enabled')" />
11
- </div>
12
- </template>
3
+ <el-card class="admin-page-card">
4
+ <ProTable ref="proTable" row-key="id" :columns="columns" :header-actions="headerActions" :request-api="requestTable" />
5
+ </el-card>
13
6
 
14
- <el-alert :title="t('system.base.login_policy.hint')" type="info" :closable="false" show-icon />
15
- <el-form label-position="top" class="policy-form" @submit.prevent="save">
16
- <el-form-item :label="t('system.base.login_policy.field.ip_blacklist')">
17
- <el-input v-model="form.ip_blacklist" type="textarea" :rows="3" :placeholder="t('system.base.login_policy.placeholder.ip')" />
18
- </el-form-item>
19
- <el-form-item :label="t('system.base.login_policy.field.ip_whitelist')">
20
- <el-input v-model="form.ip_whitelist" type="textarea" :rows="3" :placeholder="t('system.base.login_policy.placeholder.ip')" />
21
- </el-form-item>
22
- <el-form-item :label="t('system.base.login_policy.field.time_windows')">
23
- <el-input v-model="form.time_windows" type="textarea" :rows="2" :placeholder="t('system.base.login_policy.placeholder.time')" />
24
- </el-form-item>
25
- <el-form-item :label="t('system.base.login_policy.field.device_blacklist')">
26
- <el-input v-model="form.device_blacklist" type="textarea" :rows="2" :placeholder="t('system.base.login_policy.placeholder.device')" />
27
- </el-form-item>
28
- <el-form-item :label="t('system.base.login_policy.field.device_whitelist')">
29
- <el-input v-model="form.device_whitelist" type="textarea" :rows="2" :placeholder="t('system.base.login_policy.placeholder.device')" />
30
- </el-form-item>
31
- <el-divider />
32
- <div class="rules-header">
33
- <div>
34
- <h4>{{ t("system.base.login_policy.rules.title") }}</h4>
35
- <p>{{ t("system.base.login_policy.rules.description") }}</p>
7
+ <FormDialog
8
+ ref="formDialogRef"
9
+ v-model="dialog.visible"
10
+ :title="t(dialog.titleKey)"
11
+ width="980px"
12
+ :model="formData"
13
+ :fields="formFields"
14
+ :rules="formRules"
15
+ @confirm="handleSubmit"
16
+ @close="handleClose"
17
+ >
18
+ <template #rules>
19
+ <div class="rules-editor">
20
+ <div v-for="(rule, index) in formData.rules" :key="rule.id || index" class="rule-row">
21
+ <el-select v-model="rule.restriction_type" class="rule-type">
22
+ <el-option v-for="option in restrictionTypeOptions" :key="String(option.value)" :label="option.label" :value="option.value" />
23
+ </el-select>
24
+ <el-select v-model="rule.restriction_method" class="rule-method">
25
+ <el-option v-for="option in restrictionMethodOptions" :key="String(option.value)" :label="option.label" :value="option.value" />
26
+ </el-select>
27
+ <el-input v-model="rule.restriction_value" class="rule-value" :placeholder="rulePlaceholder(rule.restriction_method)" />
28
+ <el-input v-model="rule.reason" class="rule-reason" :placeholder="t('system.base.login_policy.placeholder.reason')" />
29
+ <el-select v-model="rule.status" class="rule-status">
30
+ <el-option v-for="option in statusOptions" :key="String(option.value)" :label="option.label" :value="option.value" />
31
+ </el-select>
32
+ <el-button link type="danger" :icon="Delete" @click="removeRule(index)" />
36
33
  </div>
37
- <el-button type="primary" plain @click="addRule">{{ t("system.base.login_policy.rules.add") }}</el-button>
38
- </div>
39
- <el-table v-if="form.rules.length" :data="form.rules" border class="rules-table">
40
- <el-table-column :label="t('system.base.login_policy.rules.target_type')" width="130">
41
- <template #default="{ row }">
42
- <el-select v-model="row.target_type" class="rule-control">
43
- <el-option label="TENANT" value="TENANT" />
44
- <el-option label="USER" value="USER" />
45
- </el-select>
46
- </template>
47
- </el-table-column>
48
- <el-table-column :label="t('system.base.login_policy.rules.target_value')" min-width="160">
49
- <template #default="{ row }"><el-input v-model="row.target_value" class="rule-control" /></template>
50
- </el-table-column>
51
- <el-table-column :label="t('system.base.login_policy.field.ip_blacklist')" min-width="180">
52
- <template #default="{ row }"><el-input v-model="row.ip_blacklist" :placeholder="t('system.base.login_policy.placeholder.ip')" class="rule-control" /></template>
53
- </el-table-column>
54
- <el-table-column :label="t('system.base.login_policy.field.ip_whitelist')" min-width="180">
55
- <template #default="{ row }"><el-input v-model="row.ip_whitelist" :placeholder="t('system.base.login_policy.placeholder.ip')" class="rule-control" /></template>
56
- </el-table-column>
57
- <el-table-column :label="t('system.base.login_policy.field.time_windows')" min-width="160">
58
- <template #default="{ row }"><el-input v-model="row.time_windows" :placeholder="t('system.base.login_policy.placeholder.time')" class="rule-control" /></template>
59
- </el-table-column>
60
- <el-table-column :label="t('system.base.login_policy.rules.enabled')" width="90">
61
- <template #default="{ row }"><el-switch v-model="row.enabled" /></template>
62
- </el-table-column>
63
- <el-table-column :label="t('common.field.operation')" width="90" fixed="right">
64
- <template #default="{ $index }"><el-button link type="danger" @click="removeRule($index)">{{ t("common.action.delete") }}</el-button></template>
65
- </el-table-column>
66
- </el-table>
67
- <div class="policy-actions">
68
- <el-button type="primary" :loading="saving" @click="save">{{ t("common.action.save") }}</el-button>
34
+ <el-button link type="primary" :icon="CirclePlus" @click="addRule">
35
+ {{ t("system.base.login_policy.rules.add") }}
36
+ </el-button>
69
37
  </div>
70
- </el-form>
71
- </el-card>
38
+ </template>
39
+ </FormDialog>
72
40
  </div>
73
41
  </template>
74
42
 
75
43
  <script setup lang="ts">
76
- import { onMounted, reactive, ref } from "vue";
44
+ import { computed, h, reactive, ref, watch } from "vue";
45
+ import { CirclePlus, Delete, EditPen } from "@element-plus/icons-vue";
46
+ import { ElButton, ElMessage, ElMessageBox, ElTag } from "element-plus";
47
+ import ProTable from "@liujitcn/kratos-admin-core/components/ProTable";
48
+ import FormDialog from "@liujitcn/kratos-admin-core/components/Dialog/FormDialog.vue";
49
+ import type { ColumnProps, HeaderActionProps, ProTableInstance } from "@liujitcn/kratos-admin-core/components/ProTable/interface";
50
+ import type { ProFormField, ProFormOption } from "@liujitcn/kratos-admin-core/components/ProForm/interface";
51
+ import { useAuthButtons } from "@liujitcn/kratos-admin-core/auth";
52
+ import { buildPageRequest, normalizeSelectedIds } from "@liujitcn/kratos-admin-core/table";
53
+ import { PASSWORD_CRYPTO_SCENE, encryptPassword } from "@liujitcn/kratos-admin-core/security";
77
54
  import { t } from "@liujitcn/kratos-admin-core";
78
- import { defBaseLoginPolicyService } from "@liujitcn/kratos-admin-system/api/system/base_login_policy";
79
- import type { BaseLoginPolicy, BaseLoginPolicyRule } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/base_login_policy";
80
-
81
- const saving = ref(false);
82
- /** 登录来源定向规则表单。 */
83
- type RuleForm = { target_type: string; target_value: string; enabled: boolean; ip_blacklist: string; ip_whitelist: string; time_windows: string; device_blacklist: string; device_whitelist: string };
84
- const form = reactive({
85
- enabled: false,
86
- ip_blacklist: "",
87
- ip_whitelist: "",
88
- time_windows: "",
89
- device_blacklist: "",
90
- device_whitelist: "",
91
- rules: [] as RuleForm[]
92
- });
93
-
94
- /** 将接口数组转换为逐行编辑文本。 */
95
- function assignForm(policy: BaseLoginPolicy) {
96
- form.enabled = policy.enabled;
97
- form.ip_blacklist = policy.ip_blacklist.join("\n");
98
- form.ip_whitelist = policy.ip_whitelist.join("\n");
99
- form.time_windows = policy.time_windows.join("\n");
100
- form.device_blacklist = policy.device_blacklist.join("\n");
101
- form.device_whitelist = policy.device_whitelist.join("\n");
102
- form.rules = (policy.rules ?? []).map(rule => ({
103
- target_type: rule.target_type,
104
- target_value: rule.target_value,
105
- enabled: rule.enabled,
106
- ip_blacklist: rule.ip_blacklist.join(","),
107
- ip_whitelist: rule.ip_whitelist.join(","),
108
- time_windows: rule.time_windows.join(","),
109
- device_blacklist: rule.device_blacklist.join(","),
110
- device_whitelist: rule.device_whitelist.join(",")
111
- }));
112
- }
113
-
114
- /** 将逐行编辑文本转换为接口数组。 */
115
- function splitLines(value: string) {
116
- return value.split(/[\n,]/).map(item => item.trim()).filter(Boolean);
117
- }
118
-
119
- /** 加载登录来源策略。 */
120
- async function load() {
121
- assignForm(await defBaseLoginPolicyService.GetBaseLoginPolicy({}));
122
- }
123
-
124
- /** 保存登录来源策略。 */
125
- async function save() {
126
- saving.value = true;
127
- try {
128
- const policy = await defBaseLoginPolicyService.UpdateBaseLoginPolicy({
129
- policy: {
130
- enabled: form.enabled,
131
- ip_blacklist: splitLines(form.ip_blacklist),
132
- ip_whitelist: splitLines(form.ip_whitelist),
133
- time_windows: splitLines(form.time_windows),
134
- device_blacklist: splitLines(form.device_blacklist),
135
- device_whitelist: splitLines(form.device_whitelist),
136
- rules: form.rules.map(rule => ({
137
- target_type: rule.target_type,
138
- target_value: rule.target_value,
139
- enabled: rule.enabled,
140
- ip_blacklist: splitLines(rule.ip_blacklist),
141
- ip_whitelist: splitLines(rule.ip_whitelist),
142
- time_windows: splitLines(rule.time_windows),
143
- device_blacklist: splitLines(rule.device_blacklist),
144
- device_whitelist: splitLines(rule.device_whitelist)
145
- } as BaseLoginPolicyRule))
55
+ import { defBaseLoginPolicyService } from "@liujitcn/kratos-admin-system/api/system/admin/v1/base_login_policy";
56
+ import { defBaseTenantService } from "@liujitcn/kratos-admin-system/api/system/admin/v1/base_tenant";
57
+ import { defBaseUserService } from "@liujitcn/kratos-admin-system/api/system/admin/v1/base_user";
58
+ import type { SelectOptionResponse_Option } from "@liujitcn/kratos-admin-system/rpc/common/v1/common";
59
+ import { Status } from "@liujitcn/kratos-admin-system/rpc/common/v1/enum";
60
+ import type {
61
+ BaseLoginPolicy,
62
+ BaseLoginPolicyForm,
63
+ BaseLoginPolicyRule,
64
+ PageBaseLoginPolicyRequest
65
+ } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/base_login_policy";
66
+ import {
67
+ BaseLoginPolicyRestrictionMethod,
68
+ BaseLoginPolicyRestrictionType,
69
+ BaseLoginPolicyScopeType
70
+ } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/base_login_policy";
71
+
72
+ /** 登录策略表单状态,初始化密码仅在提交时转换为一次性密码密文。 */
73
+ interface BaseLoginPolicyFormState extends Omit<BaseLoginPolicyForm, "initial_password"> {
74
+ /** 初始化密码明文只保留在当前表单,留空表示不修改已有值。 */
75
+ initial_password: string;
76
+ }
77
+
78
+ defineOptions({ name: "BaseLoginPolicy", inheritAttrs: false });
79
+
80
+ const { BUTTONS } = useAuthButtons();
81
+ const proTable = ref<ProTableInstance>();
82
+ const formDialogRef = ref<InstanceType<typeof FormDialog>>();
83
+ const dialog = reactive({ visible: false, titleKey: "common.action.create" });
84
+ const tenantOptions = ref<SelectOptionResponse_Option[]>([]);
85
+ const userOptions = ref<SelectOptionResponse_Option[]>([]);
86
+ const formData = reactive<BaseLoginPolicyFormState>(defaultForm());
87
+
88
+ const scopeTypeOptions = computed<ProFormOption[]>(() => [
89
+ { label: t("system.base.login_policy.scope.global"), value: BaseLoginPolicyScopeType.BASE_LOGIN_POLICY_SCOPE_TYPE_GLOBAL },
90
+ { label: t("common.field.tenant"), value: BaseLoginPolicyScopeType.BASE_LOGIN_POLICY_SCOPE_TYPE_TENANT },
91
+ { label: t("common.field.user"), value: BaseLoginPolicyScopeType.BASE_LOGIN_POLICY_SCOPE_TYPE_USER }
92
+ ]);
93
+ const restrictionTypeOptions = computed<ProFormOption[]>(() => [
94
+ { label: t("system.base.login_policy.restriction.blacklist"), value: BaseLoginPolicyRestrictionType.BASE_LOGIN_POLICY_RESTRICTION_TYPE_BLACKLIST },
95
+ { label: t("system.base.login_policy.restriction.whitelist"), value: BaseLoginPolicyRestrictionType.BASE_LOGIN_POLICY_RESTRICTION_TYPE_WHITELIST }
96
+ ]);
97
+ const restrictionMethodOptions = computed<ProFormOption[]>(() => [
98
+ { label: t("system.base.login_policy.method.ip"), value: BaseLoginPolicyRestrictionMethod.BASE_LOGIN_POLICY_RESTRICTION_METHOD_IP },
99
+ { label: t("system.base.login_policy.method.mac"), value: BaseLoginPolicyRestrictionMethod.BASE_LOGIN_POLICY_RESTRICTION_METHOD_MAC },
100
+ { label: t("system.base.login_policy.method.region"), value: BaseLoginPolicyRestrictionMethod.BASE_LOGIN_POLICY_RESTRICTION_METHOD_REGION },
101
+ { label: t("system.base.login_policy.method.time"), value: BaseLoginPolicyRestrictionMethod.BASE_LOGIN_POLICY_RESTRICTION_METHOD_TIME },
102
+ { label: t("system.base.login_policy.method.device"), value: BaseLoginPolicyRestrictionMethod.BASE_LOGIN_POLICY_RESTRICTION_METHOD_DEVICE }
103
+ ]);
104
+ const statusOptions = computed<ProFormOption[]>(() => [
105
+ { label: t("common.status.enabled"), value: Status.STATUS_ENABLE },
106
+ { label: t("common.status.disabled"), value: Status.STATUS_DISABLE }
107
+ ]);
108
+
109
+ const formFields = computed<ProFormField[]>(() => [
110
+ { prop: "scope_type", label: t("system.base.login_policy.field.scope_type"), component: "select", options: scopeTypeOptions.value },
111
+ {
112
+ prop: "tenant_id",
113
+ label: t("common.field.tenant"),
114
+ component: "select",
115
+ options: tenantOptions.value,
116
+ visible: model => model.scope_type !== BaseLoginPolicyScopeType.BASE_LOGIN_POLICY_SCOPE_TYPE_GLOBAL,
117
+ props: { filterable: true, clearable: true }
118
+ },
119
+ {
120
+ prop: "user_id",
121
+ label: t("common.field.user"),
122
+ component: "select",
123
+ options: userOptions.value,
124
+ visible: model => model.scope_type === BaseLoginPolicyScopeType.BASE_LOGIN_POLICY_SCOPE_TYPE_USER,
125
+ props: { filterable: true, clearable: true }
126
+ },
127
+ {
128
+ prop: "max_failed_attempts",
129
+ label: t("system.base.login_policy.field.max_failed_attempts"),
130
+ component: "input-number",
131
+ props: { min: 1, max: 1000, precision: 0 }
132
+ },
133
+ {
134
+ prop: "lock_duration_minutes",
135
+ label: t("system.base.login_policy.field.lock_duration_minutes"),
136
+ component: "input-number",
137
+ props: { min: 1, max: 1440, precision: 0 }
138
+ },
139
+ {
140
+ prop: "password_min_length",
141
+ label: t("system.base.login_policy.field.password_min_length"),
142
+ component: "input-number",
143
+ props: { min: 1, max: 128, precision: 0 }
144
+ },
145
+ {
146
+ prop: "password_history_count",
147
+ label: t("system.base.login_policy.field.password_history_count"),
148
+ component: "input-number",
149
+ props: { min: 0, max: 100, precision: 0 }
150
+ },
151
+ {
152
+ prop: "password_min_complexity_classes",
153
+ label: t("system.base.login_policy.field.password_min_complexity_classes"),
154
+ component: "input-number",
155
+ props: { min: 1, max: 4, precision: 0 }
156
+ },
157
+ {
158
+ prop: "password_max_age_days",
159
+ label: t("system.base.login_policy.field.password_max_age_days"),
160
+ component: "input-number",
161
+ props: { min: 0, max: 3650, precision: 0 }
162
+ },
163
+ {
164
+ prop: "initial_password",
165
+ label: t("system.base.login_policy.field.initial_password"),
166
+ component: "password",
167
+ props: { placeholder: t("system.base.login_policy.placeholder.initial_password"), showPassword: true }
168
+ },
169
+ { prop: "status", label: t("common.field.status"), component: "radio-group", options: statusOptions.value },
170
+ { prop: "rules", label: t("system.base.login_policy.field.rules"), component: "slot", slotName: "rules", colSpan: 24 }
171
+ ]);
172
+
173
+ const formRules = computed(() => ({
174
+ scope_type: [{ required: true, message: t("system.base.login_policy.validation.scope_type"), trigger: "change" }],
175
+ tenant_id: [{ validator: validateTenant, trigger: "change" }],
176
+ user_id: [{ validator: validateUser, trigger: "change" }],
177
+ max_failed_attempts: [{ required: true, message: t("system.base.login_policy.validation.max_failed_attempts"), trigger: "change" }],
178
+ lock_duration_minutes: [{ required: true, message: t("system.base.login_policy.validation.lock_duration_minutes"), trigger: "change" }],
179
+ password_min_length: [{ required: true, message: t("system.base.login_policy.validation.password_min_length"), trigger: "change" }],
180
+ password_history_count: [{ required: true, message: t("system.base.login_policy.validation.password_history_count"), trigger: "change" }],
181
+ password_min_complexity_classes: [
182
+ { required: true, message: t("system.base.login_policy.validation.password_min_complexity_classes"), trigger: "change" }
183
+ ],
184
+ password_max_age_days: [{ required: true, message: t("system.base.login_policy.validation.password_max_age_days"), trigger: "change" }]
185
+ }));
186
+
187
+ const columns = computed<ColumnProps[]>(() => [
188
+ { type: "selection", width: 55 },
189
+ {
190
+ prop: "scope_type",
191
+ label: t("system.base.login_policy.field.scope_type"),
192
+ width: 110,
193
+ search: { el: "select", enum: scopeTypeOptions.value },
194
+ render: scope => scopeTypeLabel((scope.row as BaseLoginPolicy).scope_type)
195
+ },
196
+ {
197
+ prop: "target",
198
+ label: t("system.base.login_policy.field.target"),
199
+ minWidth: 160,
200
+ render: scope => targetLabel(scope.row as BaseLoginPolicy)
201
+ },
202
+ {
203
+ prop: "rules",
204
+ label: t("system.base.login_policy.field.rules"),
205
+ minWidth: 320,
206
+ render: scope => renderRules(scope.row as BaseLoginPolicy)
207
+ },
208
+ { prop: "max_failed_attempts", label: t("system.base.login_policy.field.max_failed_attempts"), width: 110, align: "right" },
209
+ { prop: "lock_duration_minutes", label: t("system.base.login_policy.field.lock_duration_minutes"), width: 110, align: "right" },
210
+ { prop: "password_min_length", label: t("system.base.login_policy.field.password_min_length"), width: 110, align: "right" },
211
+ { prop: "password_history_count", label: t("system.base.login_policy.field.password_history_count"), width: 110, align: "right" },
212
+ {
213
+ prop: "password_min_complexity_classes",
214
+ label: t("system.base.login_policy.field.password_min_complexity_classes"),
215
+ width: 130,
216
+ align: "right"
217
+ },
218
+ { prop: "password_max_age_days", label: t("system.base.login_policy.field.password_max_age_days"), width: 110, align: "right" },
219
+ {
220
+ prop: "status",
221
+ label: t("common.field.status"),
222
+ width: 110,
223
+ search: { el: "select", enum: statusOptions.value },
224
+ cellType: "status",
225
+ statusProps: {
226
+ activeValue: Status.STATUS_ENABLE,
227
+ inactiveValue: Status.STATUS_DISABLE,
228
+ activeText: t("common.status.enabled"),
229
+ inactiveText: t("common.status.disabled"),
230
+ disabled: () => !BUTTONS.value["base:login-policy:status"],
231
+ beforeChange: scope => handleSetStatus(scope.row as BaseLoginPolicy)
232
+ }
233
+ },
234
+ {
235
+ prop: "operation",
236
+ label: t("common.field.operation"),
237
+ width: 150,
238
+ fixed: "right",
239
+ cellType: "actions",
240
+ actions: [
241
+ {
242
+ label: t("common.action.edit"),
243
+ link: true,
244
+ icon: EditPen,
245
+ hidden: () => !BUTTONS.value["base:login-policy:update"],
246
+ onClick: scope => openDialog((scope.row as BaseLoginPolicy).id)
247
+ },
248
+ {
249
+ label: t("common.action.delete"),
250
+ type: "danger",
251
+ link: true,
252
+ icon: Delete,
253
+ hidden: () => !BUTTONS.value["base:login-policy:delete"],
254
+ onClick: scope => handleDelete(scope.row as BaseLoginPolicy)
146
255
  }
147
- });
148
- assignForm(policy);
149
- ElMessage.success(t("common.message.update_success", { resource: t("system.base.login_policy.title") }));
150
- } finally {
151
- saving.value = false;
256
+ ]
257
+ }
258
+ ]);
259
+
260
+ const headerActions = computed<HeaderActionProps[]>(() => [
261
+ {
262
+ label: t("common.action.create"),
263
+ type: "primary",
264
+ icon: CirclePlus,
265
+ hidden: !BUTTONS.value["base:login-policy:create"],
266
+ onClick: () => openDialog()
267
+ },
268
+ {
269
+ label: t("common.action.delete"),
270
+ type: "danger",
271
+ icon: Delete,
272
+ hidden: !BUTTONS.value["base:login-policy:delete"],
273
+ disabled: scope => !scope.isSelected,
274
+ onClick: scope => handleDelete(scope.selectedListIds as number[])
275
+ }
276
+ ]);
277
+
278
+ watch(
279
+ () => formData.scope_type,
280
+ value => {
281
+ if (value === BaseLoginPolicyScopeType.BASE_LOGIN_POLICY_SCOPE_TYPE_GLOBAL) {
282
+ formData.tenant_id = 0;
283
+ formData.user_id = 0;
284
+ userOptions.value = [];
285
+ return;
286
+ }
287
+ if (value === BaseLoginPolicyScopeType.BASE_LOGIN_POLICY_SCOPE_TYPE_TENANT) {
288
+ formData.user_id = 0;
289
+ userOptions.value = [];
290
+ }
152
291
  }
292
+ );
293
+
294
+ watch(
295
+ () => formData.tenant_id,
296
+ async tenantId => {
297
+ if (formData.scope_type !== BaseLoginPolicyScopeType.BASE_LOGIN_POLICY_SCOPE_TYPE_USER || !tenantId) {
298
+ userOptions.value = [];
299
+ return;
300
+ }
301
+ const response = await defBaseUserService.OptionBaseUser({ keyword: "", tenant_id: tenantId });
302
+ userOptions.value = response.list ?? [];
303
+ }
304
+ );
305
+
306
+ /** 创建默认登录策略表单。 */
307
+ function defaultForm(): BaseLoginPolicyFormState {
308
+ return {
309
+ id: 0,
310
+ scope_type: BaseLoginPolicyScopeType.BASE_LOGIN_POLICY_SCOPE_TYPE_GLOBAL,
311
+ tenant_id: 0,
312
+ user_id: 0,
313
+ max_failed_attempts: 5,
314
+ lock_duration_minutes: 15,
315
+ password_min_length: 8,
316
+ password_history_count: 3,
317
+ password_min_complexity_classes: 3,
318
+ password_max_age_days: 90,
319
+ initial_password: "",
320
+ status: Status.STATUS_ENABLE,
321
+ rules: []
322
+ };
323
+ }
324
+
325
+ /** 创建默认限制规则。 */
326
+ function defaultRule(): BaseLoginPolicyRule {
327
+ return {
328
+ id: 0,
329
+ policy_id: 0,
330
+ restriction_type: BaseLoginPolicyRestrictionType.BASE_LOGIN_POLICY_RESTRICTION_TYPE_BLACKLIST,
331
+ restriction_method: BaseLoginPolicyRestrictionMethod.BASE_LOGIN_POLICY_RESTRICTION_METHOD_IP,
332
+ restriction_value: "",
333
+ reason: "",
334
+ status: Status.STATUS_ENABLE
335
+ };
336
+ }
337
+
338
+ /** 请求登录策略表格数据。 */
339
+ async function requestTable(params: Record<string, unknown>) {
340
+ const data = await defBaseLoginPolicyService.PageBaseLoginPolicy(
341
+ buildPageRequest<PageBaseLoginPolicyRequest>(params as unknown as PageBaseLoginPolicyRequest)
342
+ );
343
+ return { data: { list: data.base_login_policies ?? [], total: data.total } };
344
+ }
345
+
346
+ /** 打开登录策略表单。 */
347
+ async function openDialog(id?: number) {
348
+ Object.assign(formData, defaultForm());
349
+ dialog.titleKey = id ? "common.action.edit" : "common.action.create";
350
+ await loadTenantOptions();
351
+ if (id) {
352
+ const detail = await defBaseLoginPolicyService.GetBaseLoginPolicy({ id });
353
+ Object.assign(formData, detail, { initial_password: "", rules: detail.rules ?? [] });
354
+ if (formData.scope_type === BaseLoginPolicyScopeType.BASE_LOGIN_POLICY_SCOPE_TYPE_USER && formData.tenant_id) {
355
+ await loadUserOptions(formData.tenant_id);
356
+ }
357
+ }
358
+ dialog.visible = true;
359
+ }
360
+
361
+ /** 加载租户选项。 */
362
+ async function loadTenantOptions() {
363
+ const response = await defBaseTenantService.OptionBaseTenant({ keyword: "" });
364
+ tenantOptions.value = response.list ?? [];
365
+ }
366
+
367
+ /** 加载指定租户的用户选项。 */
368
+ async function loadUserOptions(tenantId: number) {
369
+ const response = await defBaseUserService.OptionBaseUser({ keyword: "", tenant_id: tenantId });
370
+ userOptions.value = response.list ?? [];
371
+ }
372
+
373
+ /** 提交登录策略表单。 */
374
+ async function handleSubmit() {
375
+ const valid = await formDialogRef.value?.validate();
376
+ if (!valid) return;
377
+
378
+ const baseLoginPolicy: BaseLoginPolicyForm = {
379
+ ...formData,
380
+ initial_password: formData.initial_password
381
+ ? await encryptPassword(formData.initial_password, PASSWORD_CRYPTO_SCENE.PASSWORD_CRYPTO_SCENE_CONFIGURE_PASSWORD_POLICY)
382
+ : undefined
383
+ };
384
+ if (formData.id) await defBaseLoginPolicyService.UpdateBaseLoginPolicy({ base_login_policy: baseLoginPolicy });
385
+ else await defBaseLoginPolicyService.CreateBaseLoginPolicy({ base_login_policy: baseLoginPolicy });
386
+ ElMessage.success(t("common.message.operation_success"));
387
+ dialog.visible = false;
388
+ proTable.value?.getTableList();
389
+ }
390
+
391
+ /** 删除登录策略。 */
392
+ async function handleDelete(value: BaseLoginPolicy | BaseLoginPolicy[] | number | number[]) {
393
+ const ids = normalizeSelectedIds(value as Parameters<typeof normalizeSelectedIds>[0]);
394
+ await ElMessageBox.confirm(t("common.confirm.delete"), t("common.title.warning"), { type: "warning" });
395
+ await defBaseLoginPolicyService.DeleteBaseLoginPolicy({ id: ids.join(",") });
396
+ ElMessage.success(t("common.message.operation_success"));
397
+ proTable.value?.getTableList();
153
398
  }
154
399
 
155
- /** 新增一条定向登录策略。 */
400
+ /** 设置登录策略状态。 */
401
+ async function handleSetStatus(row: BaseLoginPolicy) {
402
+ const status = row.status === Status.STATUS_ENABLE ? Status.STATUS_DISABLE : Status.STATUS_ENABLE;
403
+ await defBaseLoginPolicyService.SetBaseLoginPolicyStatus({ id: row.id, status });
404
+ return true;
405
+ }
406
+
407
+ /** 关闭登录策略表单。 */
408
+ function handleClose() {
409
+ Object.assign(formData, defaultForm());
410
+ userOptions.value = [];
411
+ formDialogRef.value?.resetFields();
412
+ }
413
+
414
+ /** 新增限制规则。 */
156
415
  function addRule() {
157
- form.rules.push({ target_type: "TENANT", target_value: "", enabled: true, ip_blacklist: "", ip_whitelist: "", time_windows: "", device_blacklist: "", device_whitelist: "" });
416
+ formData.rules.push(defaultRule());
158
417
  }
159
418
 
160
- /** 删除一条定向登录策略。 */
419
+ /** 删除限制规则。 */
161
420
  function removeRule(index: number) {
162
- form.rules.splice(index, 1);
421
+ formData.rules.splice(index, 1);
163
422
  }
164
423
 
165
- onMounted(load);
166
- </script>
424
+ /** 校验租户作用域目标。 */
425
+ function validateTenant(_rule: unknown, value: number, callback: (error?: Error) => void) {
426
+ if (formData.scope_type !== BaseLoginPolicyScopeType.BASE_LOGIN_POLICY_SCOPE_TYPE_GLOBAL && !value) {
427
+ callback(new Error(t("common.validation.required_select", { field: t("common.field.tenant") })));
428
+ return;
429
+ }
430
+ callback();
431
+ }
167
432
 
168
- <style scoped lang="scss">
169
- .login-policy-page {
170
- padding: 20px;
433
+ /** 校验用户作用域目标。 */
434
+ function validateUser(_rule: unknown, value: number, callback: (error?: Error) => void) {
435
+ if (formData.scope_type === BaseLoginPolicyScopeType.BASE_LOGIN_POLICY_SCOPE_TYPE_USER && !value) {
436
+ callback(new Error(t("common.validation.required_select", { field: t("common.field.user") })));
437
+ return;
438
+ }
439
+ callback();
171
440
  }
172
- .policy-header {
173
- display: flex;
174
- align-items: center;
175
- justify-content: space-between;
176
- gap: 16px;
441
+
442
+ /** 输出作用域名称。 */
443
+ function scopeTypeLabel(value: BaseLoginPolicyScopeType) {
444
+ return scopeTypeOptions.value.find(option => option.value === value)?.label ?? String(value);
177
445
  }
178
- .policy-header h3 {
179
- margin: 0;
180
- color: var(--el-text-color-primary);
181
- font-size: 18px;
446
+
447
+ /** 输出策略目标名称。 */
448
+ function targetLabel(row: BaseLoginPolicy) {
449
+ if (row.scope_type === BaseLoginPolicyScopeType.BASE_LOGIN_POLICY_SCOPE_TYPE_GLOBAL) return t("system.base.login_policy.scope.global");
450
+ if (row.scope_type === BaseLoginPolicyScopeType.BASE_LOGIN_POLICY_SCOPE_TYPE_USER) return row.user_name || String(row.user_id);
451
+ return row.tenant_name || String(row.tenant_id);
182
452
  }
183
- .policy-header p {
184
- margin: 6px 0 0;
185
- color: var(--el-text-color-secondary);
186
- font-size: 13px;
453
+
454
+ /** 输出限制规则摘要。 */
455
+ function renderRules(row: BaseLoginPolicy) {
456
+ const rules = row.rules ?? [];
457
+ if (!rules.length) return h("span", { class: "muted" }, t("system.base.login_policy.rules.empty"));
458
+ return h(
459
+ "div",
460
+ { class: "rule-summary" },
461
+ rules.map((rule, index) =>
462
+ h(
463
+ ElTag,
464
+ { key: `${rule.id || index}`, size: "small", class: "rule-tag" },
465
+ () => `${restrictionTypeLabel(rule.restriction_type)}/${restrictionMethodLabel(rule.restriction_method)}: ${rule.restriction_value}`
466
+ )
467
+ )
468
+ );
187
469
  }
188
- .policy-form {
189
- max-width: 920px;
190
- margin-top: 20px;
470
+
471
+ /** 输出限制类型名称。 */
472
+ function restrictionTypeLabel(value: BaseLoginPolicyRestrictionType) {
473
+ return restrictionTypeOptions.value.find(option => option.value === value)?.label ?? String(value);
191
474
  }
192
- .policy-actions {
193
- display: flex;
194
- justify-content: flex-end;
475
+
476
+ /** 输出限制方式名称。 */
477
+ function restrictionMethodLabel(value: BaseLoginPolicyRestrictionMethod) {
478
+ return restrictionMethodOptions.value.find(option => option.value === value)?.label ?? String(value);
195
479
  }
196
- .rules-header {
197
- display: flex;
480
+
481
+ /** 根据限制方式输出输入提示。 */
482
+ function rulePlaceholder(method: BaseLoginPolicyRestrictionMethod) {
483
+ switch (method) {
484
+ case BaseLoginPolicyRestrictionMethod.BASE_LOGIN_POLICY_RESTRICTION_METHOD_IP:
485
+ return t("system.base.login_policy.placeholder.ip");
486
+ case BaseLoginPolicyRestrictionMethod.BASE_LOGIN_POLICY_RESTRICTION_METHOD_TIME:
487
+ return t("system.base.login_policy.placeholder.time");
488
+ case BaseLoginPolicyRestrictionMethod.BASE_LOGIN_POLICY_RESTRICTION_METHOD_REGION:
489
+ return t("system.base.login_policy.placeholder.region");
490
+ default:
491
+ return t("system.base.login_policy.placeholder.value");
492
+ }
493
+ }
494
+ </script>
495
+
496
+ <style scoped lang="scss">
497
+ .login-policy-page {
498
+ min-width: 0;
499
+ }
500
+ .rules-editor {
501
+ width: 100%;
502
+ }
503
+ .rule-row {
504
+ display: grid;
505
+ grid-template-columns: 120px 140px minmax(180px, 1fr) minmax(160px, 1fr) 110px 32px;
506
+ gap: 8px;
198
507
  align-items: center;
199
- justify-content: space-between;
200
- gap: 16px;
201
- margin: 20px 0 12px;
508
+ margin-bottom: 10px;
202
509
  }
203
- .rules-header h4 {
204
- margin: 0;
205
- color: var(--el-text-color-primary);
206
- font-size: 15px;
510
+ .rule-summary {
511
+ display: flex;
512
+ flex-wrap: wrap;
513
+ gap: 4px;
207
514
  }
208
- .rules-header p {
209
- margin: 4px 0 0;
210
- color: var(--el-text-color-secondary);
211
- font-size: 12px;
515
+ .rule-tag {
516
+ max-width: 100%;
212
517
  }
213
- .rules-table {
214
- width: 100%;
518
+ .muted {
519
+ color: var(--el-text-color-secondary);
215
520
  }
216
- .rule-control {
217
- width: 100%;
521
+ @media (max-width: 960px) {
522
+ .rule-row {
523
+ grid-template-columns: 1fr 1fr;
524
+ }
525
+ .rule-value,
526
+ .rule-reason {
527
+ grid-column: span 2;
528
+ }
218
529
  }
219
530
  </style>