smart-admin-web 10.15.0 → 10.20.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (432) hide show
  1. package/README.md +1 -1
  2. package/dist/api/index.d.ts +4 -2
  3. package/dist/api/index.js +1 -1
  4. package/dist/api/index.js.map +1 -1
  5. package/dist/api/schema.d.ts +39 -5
  6. package/dist/assets/icons/ph-subset.json.js +5 -5
  7. package/dist/components/AppIcon.vue.js +9 -9
  8. package/dist/components/AppIcon.vue.js.map +1 -1
  9. package/dist/components/AppWatermark.vue.d.ts +14 -0
  10. package/dist/components/AppWatermark.vue.js +38 -0
  11. package/dist/components/AppWatermark.vue.js.map +1 -0
  12. package/dist/components/AppWatermark2.vue.js +5 -0
  13. package/dist/components/AppWatermark2.vue.js.map +1 -0
  14. package/dist/components/Chart/PieChart.vue.d.ts +1 -1
  15. package/dist/components/Chart/echarts.js +15 -20
  16. package/dist/components/Chart/echarts.js.map +1 -1
  17. package/dist/components/CronEditor/index.vue.js +1 -1
  18. package/dist/components/CronEditor/index2.vue.js +2 -1
  19. package/dist/components/CronEditor/index2.vue.js.map +1 -1
  20. package/dist/components/DetailPage/index.vue.js +2 -2
  21. package/dist/components/DetailPage/index2.vue.js.map +1 -1
  22. package/dist/components/DictTag/index.vue.js.map +1 -1
  23. package/dist/components/ErrorBoundary/index.vue.js +2 -2
  24. package/dist/components/ErrorBoundary/index2.vue.js +1 -1
  25. package/dist/components/ErrorBoundary/index2.vue.js.map +1 -1
  26. package/dist/components/FormContainer/index.vue.js +91 -56
  27. package/dist/components/FormContainer/index.vue.js.map +1 -1
  28. package/dist/components/ImportWizard/index.vue.js +1 -1
  29. package/dist/components/ImportWizard/index2.vue.js +44 -41
  30. package/dist/components/ImportWizard/index2.vue.js.map +1 -1
  31. package/dist/components/MenuSearch.vue.js +2 -2
  32. package/dist/components/MenuSearch2.vue.js +19 -18
  33. package/dist/components/MenuSearch2.vue.js.map +1 -1
  34. package/dist/components/PasswordStrength/index.vue.js +2 -2
  35. package/dist/components/PasswordStrength/index2.vue.js +20 -18
  36. package/dist/components/PasswordStrength/index2.vue.js.map +1 -1
  37. package/dist/components/TableTotal/index.vue.d.ts +6 -0
  38. package/dist/components/{SelectTable → TableTotal}/index.vue.js +1 -1
  39. package/dist/components/TableTotal/index2.vue.js +16 -0
  40. package/dist/components/TableTotal/index2.vue.js.map +1 -0
  41. package/dist/components/TableZoomButton/index.vue.js.map +1 -1
  42. package/dist/components/UserPicker/index.vue.js +2 -2
  43. package/dist/components/UserPicker/index2.vue.js +176 -117
  44. package/dist/components/UserPicker/index2.vue.js.map +1 -1
  45. package/dist/composables/useBatchDelete.js.map +1 -1
  46. package/dist/composables/useLayoutMenu.js +17 -16
  47. package/dist/composables/useLayoutMenu.js.map +1 -1
  48. package/dist/composables/useModule.js +39 -29
  49. package/dist/composables/useModule.js.map +1 -1
  50. package/dist/composables/useShellBreakpoint.d.ts +19 -0
  51. package/dist/composables/useShellBreakpoint.js +37 -0
  52. package/dist/composables/useShellBreakpoint.js.map +1 -0
  53. package/dist/composables/useSite.d.ts +15 -0
  54. package/dist/composables/useSite.js +16 -14
  55. package/dist/composables/useSite.js.map +1 -1
  56. package/dist/composables/useTabTitle.js.map +1 -1
  57. package/dist/composables/useTableTitle.d.ts +6 -0
  58. package/dist/composables/useTableTitle.js +11 -0
  59. package/dist/composables/useTableTitle.js.map +1 -0
  60. package/dist/composables/useTableZoom.d.ts +5 -0
  61. package/dist/composables/useTableZoom.js.map +1 -1
  62. package/dist/composables/useTheme.d.ts +2 -2
  63. package/dist/composables/useTheme.js +23 -20
  64. package/dist/composables/useTheme.js.map +1 -1
  65. package/dist/createSmartAdmin.d.ts +12 -2
  66. package/dist/createSmartAdmin.js +72 -60
  67. package/dist/createSmartAdmin.js.map +1 -1
  68. package/dist/index.d.ts +5 -2
  69. package/dist/index.js +219 -205
  70. package/dist/index.js.map +1 -1
  71. package/dist/layouts/AccentPicker.vue.js +8 -0
  72. package/dist/layouts/AccentPicker.vue.js.map +1 -0
  73. package/dist/layouts/AccentPicker2.vue.js +131 -0
  74. package/dist/layouts/AccentPicker2.vue.js.map +1 -0
  75. package/dist/layouts/AppHeader.vue.d.ts +8 -1
  76. package/dist/layouts/AppHeader.vue.js +2 -2
  77. package/dist/layouts/AppHeader2.vue.js +317 -235
  78. package/dist/layouts/AppHeader2.vue.js.map +1 -1
  79. package/dist/layouts/NoticeBell.vue.js +2 -2
  80. package/dist/layouts/NoticeBell2.vue.js +19 -18
  81. package/dist/layouts/NoticeBell2.vue.js.map +1 -1
  82. package/dist/layouts/PersonalLayout.vue.js +2 -2
  83. package/dist/layouts/PersonalLayout2.vue.js +69 -47
  84. package/dist/layouts/PersonalLayout2.vue.js.map +1 -1
  85. package/dist/layouts/SettingsDrawer.vue.js +3 -3
  86. package/dist/layouts/SettingsDrawer2.vue.js +261 -325
  87. package/dist/layouts/SettingsDrawer2.vue.js.map +1 -1
  88. package/dist/layouts/TabsBar.vue.js +2 -2
  89. package/dist/layouts/TabsBar2.vue.js +97 -69
  90. package/dist/layouts/TabsBar2.vue.js.map +1 -1
  91. package/dist/layouts/components/SideNav.vue.d.ts +3 -0
  92. package/dist/layouts/components/SideNav.vue.js +1 -1
  93. package/dist/layouts/components/SideNav2.vue.js +54 -26
  94. package/dist/layouts/components/SideNav2.vue.js.map +1 -1
  95. package/dist/layouts/default.vue.js +1 -1
  96. package/dist/layouts/default2.vue.js +170 -140
  97. package/dist/layouts/default2.vue.js.map +1 -1
  98. package/dist/lib/loginHero.d.ts +2 -2
  99. package/dist/lib/loginHero.js.map +1 -1
  100. package/dist/lib/runtime.js +1 -1
  101. package/dist/lib/watermark.d.ts +110 -0
  102. package/dist/lib/watermark.js +151 -0
  103. package/dist/lib/watermark.js.map +1 -0
  104. package/dist/locales/en-US.d.ts +221 -15
  105. package/dist/locales/en-US.js +230 -21
  106. package/dist/locales/en-US.js.map +1 -1
  107. package/dist/locales/kernelMenuTitles.d.ts +1 -0
  108. package/dist/locales/kernelMenuTitles.js +128 -0
  109. package/dist/locales/kernelMenuTitles.js.map +1 -0
  110. package/dist/locales/menuTitle.d.ts +3 -0
  111. package/dist/locales/menuTitle.js +14 -12
  112. package/dist/locales/menuTitle.js.map +1 -1
  113. package/dist/locales/zh-CN.d.ts +221 -15
  114. package/dist/locales/zh-CN.js +238 -28
  115. package/dist/locales/zh-CN.js.map +1 -1
  116. package/dist/router/index.js +41 -32
  117. package/dist/router/index.js.map +1 -1
  118. package/dist/router/namedPage.d.ts +4 -0
  119. package/dist/router/namedPage.js +7 -7
  120. package/dist/router/namedPage.js.map +1 -1
  121. package/dist/router/viewRegistry.js +8 -8
  122. package/dist/router/viewRegistry.js.map +1 -1
  123. package/dist/stores/app.d.ts +0 -12
  124. package/dist/stores/app.js +11 -12
  125. package/dist/stores/app.js.map +1 -1
  126. package/dist/stores/tabs.js.map +1 -1
  127. package/dist/stores/user.d.ts +10 -0
  128. package/dist/stores/user.js.map +1 -1
  129. package/dist/style.css +1 -1
  130. package/dist/theme/accentTokens.d.ts +27 -0
  131. package/dist/theme/accentTokens.js +54 -0
  132. package/dist/theme/accentTokens.js.map +1 -0
  133. package/dist/theme/accents.d.ts +21 -1
  134. package/dist/theme/accents.js +11 -2
  135. package/dist/theme/accents.js.map +1 -1
  136. package/dist/theme/mix.d.ts +58 -7
  137. package/dist/theme/mix.js +115 -30
  138. package/dist/theme/mix.js.map +1 -1
  139. package/dist/theme/naive-theme.d.ts +5 -2
  140. package/dist/theme/naive-theme.js +407 -75
  141. package/dist/theme/naive-theme.js.map +1 -1
  142. package/dist/utils/jwt.d.ts +8 -0
  143. package/dist/utils/jwt.js +14 -0
  144. package/dist/utils/jwt.js.map +1 -0
  145. package/dist/utils/menuIcon.d.ts +2 -0
  146. package/dist/utils/menuIcon.js +8 -0
  147. package/dist/utils/menuIcon.js.map +1 -0
  148. package/dist/utils/oauthBrand.js.map +1 -1
  149. package/dist/utils/tableFilter.d.ts +88 -0
  150. package/dist/utils/tableFilter.js +116 -0
  151. package/dist/utils/tableFilter.js.map +1 -0
  152. package/dist/utils/tableToolbar.d.ts +18 -0
  153. package/dist/utils/tableToolbar.js +11 -0
  154. package/dist/utils/tableToolbar.js.map +1 -0
  155. package/dist/utils/treeFilter.d.ts +20 -0
  156. package/dist/utils/treeFilter.js +24 -0
  157. package/dist/utils/treeFilter.js.map +1 -0
  158. package/dist/views/dashboard/ShortcutPicker.vue.js +1 -1
  159. package/dist/views/dashboard/ShortcutPicker2.vue.js +73 -48
  160. package/dist/views/dashboard/ShortcutPicker2.vue.js.map +1 -1
  161. package/dist/views/dashboard/biz.vue.js +1 -1
  162. package/dist/views/dashboard/biz2.vue.js +310 -257
  163. package/dist/views/dashboard/biz2.vue.js.map +1 -1
  164. package/dist/views/dashboard/workbench.vue.js +2 -2
  165. package/dist/views/dashboard/workbench2.vue.js +141 -155
  166. package/dist/views/dashboard/workbench2.vue.js.map +1 -1
  167. package/dist/views/embed/iframe.vue.js +2 -2
  168. package/dist/views/embed/iframe2.vue.js +22 -15
  169. package/dist/views/embed/iframe2.vue.js.map +1 -1
  170. package/dist/views/error/404.vue.js +2 -2
  171. package/dist/views/error/4042.vue.js +33 -24
  172. package/dist/views/error/4042.vue.js.map +1 -1
  173. package/dist/views/error/BootError.vue.js +1 -1
  174. package/dist/views/error/BootError2.vue.js +59 -48
  175. package/dist/views/error/BootError2.vue.js.map +1 -1
  176. package/dist/views/error/MissingRoute.vue.js +2 -2
  177. package/dist/views/error/MissingRoute2.vue.js +34 -15
  178. package/dist/views/error/MissingRoute2.vue.js.map +1 -1
  179. package/dist/views/login/LoginForm.vue.d.ts +7 -1
  180. package/dist/views/login/LoginForm.vue.js +2 -2
  181. package/dist/views/login/LoginForm2.vue.js +580 -488
  182. package/dist/views/login/LoginForm2.vue.js.map +1 -1
  183. package/dist/views/login/components/LoginDesk.vue.d.ts +36 -0
  184. package/dist/views/login/components/LoginDesk.vue.js +9 -0
  185. package/dist/views/login/components/LoginDesk.vue.js.map +1 -0
  186. package/dist/views/login/components/LoginDesk2.vue.js +100 -0
  187. package/dist/views/login/components/LoginDesk2.vue.js.map +1 -0
  188. package/dist/views/login/components/LoginHeroPanel.vue.js +3 -3
  189. package/dist/views/login/components/LoginHeroPanel2.vue.js +34 -39
  190. package/dist/views/login/components/LoginHeroPanel2.vue.js.map +1 -1
  191. package/dist/views/login/index.vue.js +1 -1
  192. package/dist/views/login/index2.vue.js +141 -71
  193. package/dist/views/login/index2.vue.js.map +1 -1
  194. package/dist/views/login/layout.d.ts +11 -0
  195. package/dist/views/login/layout.js +27 -0
  196. package/dist/views/login/layout.js.map +1 -0
  197. package/dist/views/mfa/index.vue.js +2 -2
  198. package/dist/views/mfa/index2.vue.js +367 -321
  199. package/dist/views/mfa/index2.vue.js.map +1 -1
  200. package/dist/views/module/index.vue.js +2 -2
  201. package/dist/views/module/index2.vue.js +132 -99
  202. package/dist/views/module/index2.vue.js.map +1 -1
  203. package/dist/views/oauth/callback.vue.js +2 -2
  204. package/dist/views/oauth/callback2.vue.js +65 -51
  205. package/dist/views/oauth/callback2.vue.js.map +1 -1
  206. package/dist/views/personal/bindings.vue.js +2 -2
  207. package/dist/views/personal/bindings2.vue.js +98 -94
  208. package/dist/views/personal/bindings2.vue.js.map +1 -1
  209. package/dist/views/personal/notice2.vue.js +103 -76
  210. package/dist/views/personal/notice2.vue.js.map +1 -1
  211. package/dist/views/personal/password2.vue.js +47 -40
  212. package/dist/views/personal/password2.vue.js.map +1 -1
  213. package/dist/views/personal/profile.vue.js +3 -3
  214. package/dist/views/personal/profile2.vue.js +24 -18
  215. package/dist/views/personal/profile2.vue.js.map +1 -1
  216. package/dist/views/personal/security.vue.js +2 -2
  217. package/dist/views/personal/security2.vue.js +65 -53
  218. package/dist/views/personal/security2.vue.js.map +1 -1
  219. package/dist/views/personal/sessions.vue.js +2 -2
  220. package/dist/views/personal/sessions2.vue.js +67 -62
  221. package/dist/views/personal/sessions2.vue.js.map +1 -1
  222. package/dist/views/system/ai-model/components/ProviderCard.vue.js +2 -2
  223. package/dist/views/system/ai-model/components/ProviderCard2.vue.js +142 -130
  224. package/dist/views/system/ai-model/components/ProviderCard2.vue.js.map +1 -1
  225. package/dist/views/system/ai-model/components/ProviderForm.vue.js +2 -2
  226. package/dist/views/system/ai-model/components/ProviderForm2.vue.js +71 -70
  227. package/dist/views/system/ai-model/components/ProviderForm2.vue.js.map +1 -1
  228. package/dist/views/system/ai-model/index.vue.js +2 -2
  229. package/dist/views/system/ai-model/index2.vue.js +99 -99
  230. package/dist/views/system/ai-model/index2.vue.js.map +1 -1
  231. package/dist/views/system/ai-model/presets.d.ts +1 -1
  232. package/dist/views/system/ai-model/presets.js +18 -18
  233. package/dist/views/system/ai-model/presets.js.map +1 -1
  234. package/dist/views/system/ai-usage/index.vue.js +2 -2
  235. package/dist/views/system/ai-usage/index2.vue.js +356 -258
  236. package/dist/views/system/ai-usage/index2.vue.js.map +1 -1
  237. package/dist/views/system/api-docs/index.vue.js +5 -2
  238. package/dist/views/system/api-docs/index.vue.js.map +1 -1
  239. package/dist/views/system/api-docs/index2.vue.js +92 -42
  240. package/dist/views/system/api-docs/index2.vue.js.map +1 -1
  241. package/dist/views/system/cache/index.vue.js +2 -2
  242. package/dist/views/system/cache/index2.vue.js +74 -80
  243. package/dist/views/system/cache/index2.vue.js.map +1 -1
  244. package/dist/views/system/config/components/AdminMock.vue.js +2 -2
  245. package/dist/views/system/config/components/AdminMock2.vue.js +60 -43
  246. package/dist/views/system/config/components/AdminMock2.vue.js.map +1 -1
  247. package/dist/views/system/config/components/AdvancedSection.vue.js +5 -2
  248. package/dist/views/system/config/components/AdvancedSection.vue.js.map +1 -1
  249. package/dist/views/system/config/components/AdvancedSection2.vue.js +98 -70
  250. package/dist/views/system/config/components/AdvancedSection2.vue.js.map +1 -1
  251. package/dist/views/system/config/components/BrandSection.vue.js +2 -2
  252. package/dist/views/system/config/components/BrandSection2.vue.js +121 -119
  253. package/dist/views/system/config/components/BrandSection2.vue.js.map +1 -1
  254. package/dist/views/system/config/components/CfgGroup.vue.js +3 -3
  255. package/dist/views/system/config/components/CfgGroup2.vue.js.map +1 -1
  256. package/dist/views/system/config/components/CfgRow.vue.js +1 -1
  257. package/dist/views/system/config/components/CfgRow2.vue.js +24 -23
  258. package/dist/views/system/config/components/CfgRow2.vue.js.map +1 -1
  259. package/dist/views/system/config/components/CfgSegment.vue.js +1 -1
  260. package/dist/views/system/config/components/CfgSegment2.vue.js +16 -15
  261. package/dist/views/system/config/components/CfgSegment2.vue.js.map +1 -1
  262. package/dist/views/system/config/components/ConfigFormModal.vue.js +2 -2
  263. package/dist/views/system/config/components/ConfigFormModal2.vue.js +35 -33
  264. package/dist/views/system/config/components/ConfigFormModal2.vue.js.map +1 -1
  265. package/dist/views/system/config/components/JobSection.vue.js +2 -2
  266. package/dist/views/system/config/components/JobSection2.vue.js +46 -44
  267. package/dist/views/system/config/components/JobSection2.vue.js.map +1 -1
  268. package/dist/views/system/config/components/LoginMock.vue.js +3 -3
  269. package/dist/views/system/config/components/LoginMock2.vue.js +83 -72
  270. package/dist/views/system/config/components/LoginMock2.vue.js.map +1 -1
  271. package/dist/views/system/config/components/LogoCropper.vue.js +1 -1
  272. package/dist/views/system/config/components/LogoCropper2.vue.js.map +1 -1
  273. package/dist/views/system/config/components/LogoEditor.vue.js +2 -2
  274. package/dist/views/system/config/components/LogoEditor2.vue.js +11 -13
  275. package/dist/views/system/config/components/LogoEditor2.vue.js.map +1 -1
  276. package/dist/views/system/config/components/ProviderSheet.vue.js +3 -3
  277. package/dist/views/system/config/components/ProviderSheet2.vue.js.map +1 -1
  278. package/dist/views/system/config/components/SectionLayout.vue.d.ts +4 -2
  279. package/dist/views/system/config/components/SectionLayout.vue.js +2 -2
  280. package/dist/views/system/config/components/SectionLayout2.vue.js +51 -27
  281. package/dist/views/system/config/components/SectionLayout2.vue.js.map +1 -1
  282. package/dist/views/system/config/components/SecuritySection.vue.js +2 -2
  283. package/dist/views/system/config/components/SecuritySection2.vue.js +207 -206
  284. package/dist/views/system/config/components/SecuritySection2.vue.js.map +1 -1
  285. package/dist/views/system/config/components/SensitiveSection.vue.js +2 -2
  286. package/dist/views/system/config/components/SensitiveSection2.vue.js +107 -102
  287. package/dist/views/system/config/components/SensitiveSection2.vue.js.map +1 -1
  288. package/dist/views/system/config/components/UploadSection.vue.js +2 -2
  289. package/dist/views/system/config/components/UploadSection2.vue.js +86 -77
  290. package/dist/views/system/config/components/UploadSection2.vue.js.map +1 -1
  291. package/dist/views/system/config/components/WatermarkSection.vue.js +8 -0
  292. package/dist/views/system/config/components/WatermarkSection.vue.js.map +1 -0
  293. package/dist/views/system/config/components/WatermarkSection2.vue.js +284 -0
  294. package/dist/views/system/config/components/WatermarkSection2.vue.js.map +1 -0
  295. package/dist/views/system/config/draft.d.ts +2 -2
  296. package/dist/views/system/config/draft.js.map +1 -1
  297. package/dist/views/system/config/groups.d.ts +4 -1
  298. package/dist/views/system/config/groups.js +54 -49
  299. package/dist/views/system/config/groups.js.map +1 -1
  300. package/dist/views/system/config/index.vue.js +3 -2
  301. package/dist/views/system/config/index.vue.js.map +1 -1
  302. package/dist/views/system/config/index2.vue.js +173 -148
  303. package/dist/views/system/config/index2.vue.js.map +1 -1
  304. package/dist/views/system/config/layoutMode.d.ts +23 -0
  305. package/dist/views/system/config/layoutMode.js +28 -0
  306. package/dist/views/system/config/layoutMode.js.map +1 -0
  307. package/dist/views/system/dict/index.vue.js +2 -2
  308. package/dist/views/system/dict/index2.vue.js +471 -366
  309. package/dist/views/system/dict/index2.vue.js.map +1 -1
  310. package/dist/views/system/file/index2.vue.js +91 -76
  311. package/dist/views/system/file/index2.vue.js.map +1 -1
  312. package/dist/views/system/job/index.vue.js +3 -3
  313. package/dist/views/system/job/index2.vue.js +897 -828
  314. package/dist/views/system/job/index2.vue.js.map +1 -1
  315. package/dist/views/system/job-log/components/AttemptTable.vue.d.ts +8 -0
  316. package/dist/views/system/job-log/components/AttemptTable.vue.js +5 -0
  317. package/dist/views/system/job-log/components/AttemptTable.vue.js.map +1 -0
  318. package/dist/views/system/job-log/components/AttemptTable2.vue.js +54 -0
  319. package/dist/views/system/job-log/components/AttemptTable2.vue.js.map +1 -0
  320. package/dist/views/system/job-log/index.vue.js +2 -2
  321. package/dist/views/system/job-log/index2.vue.js +193 -207
  322. package/dist/views/system/job-log/index2.vue.js.map +1 -1
  323. package/dist/views/system/job-log/runStatus.d.ts +13 -0
  324. package/dist/views/system/job-log/runStatus.js +26 -0
  325. package/dist/views/system/job-log/runStatus.js.map +1 -0
  326. package/dist/views/system/job-monitor/index.vue.js +2 -2
  327. package/dist/views/system/job-monitor/index2.vue.js +172 -180
  328. package/dist/views/system/job-monitor/index2.vue.js.map +1 -1
  329. package/dist/views/system/log/exception/index.vue.js +2 -2
  330. package/dist/views/system/log/exception/index2.vue.js +135 -96
  331. package/dist/views/system/log/exception/index2.vue.js.map +1 -1
  332. package/dist/views/system/log/login/index2.vue.js +62 -41
  333. package/dist/views/system/log/login/index2.vue.js.map +1 -1
  334. package/dist/views/system/log/op/index.vue.js +2 -2
  335. package/dist/views/system/log/op/index2.vue.js +200 -162
  336. package/dist/views/system/log/op/index2.vue.js.map +1 -1
  337. package/dist/views/system/menu/components/ButtonManager.vue.js +2 -2
  338. package/dist/views/system/menu/components/ButtonManager2.vue.js +206 -190
  339. package/dist/views/system/menu/components/ButtonManager2.vue.js.map +1 -1
  340. package/dist/views/system/menu/components/MenuFormModal.vue.js +2 -2
  341. package/dist/views/system/menu/components/MenuFormModal2.vue.js +127 -118
  342. package/dist/views/system/menu/components/MenuFormModal2.vue.js.map +1 -1
  343. package/dist/views/system/menu/index.vue.js +1 -1
  344. package/dist/views/system/menu/index2.vue.js +216 -183
  345. package/dist/views/system/menu/index2.vue.js.map +1 -1
  346. package/dist/views/system/module/index.vue.js +1 -1
  347. package/dist/views/system/module/index2.vue.js +177 -144
  348. package/dist/views/system/module/index2.vue.js.map +1 -1
  349. package/dist/views/system/monitor/index.vue.js +2 -2
  350. package/dist/views/system/monitor/index2.vue.js +134 -149
  351. package/dist/views/system/monitor/index2.vue.js.map +1 -1
  352. package/dist/views/system/notice/index.vue.js +1 -1
  353. package/dist/views/system/notice/index2.vue.js +209 -181
  354. package/dist/views/system/notice/index2.vue.js.map +1 -1
  355. package/dist/views/system/org/index.vue.js +1 -1
  356. package/dist/views/system/org/index2.vue.js +278 -248
  357. package/dist/views/system/org/index2.vue.js.map +1 -1
  358. package/dist/views/system/position/index.vue.js +5 -2
  359. package/dist/views/system/position/index.vue.js.map +1 -1
  360. package/dist/views/system/position/index2.vue.js +128 -92
  361. package/dist/views/system/position/index2.vue.js.map +1 -1
  362. package/dist/views/system/recycle/index.vue.js +2 -2
  363. package/dist/views/system/recycle/index2.vue.js +90 -67
  364. package/dist/views/system/recycle/index2.vue.js.map +1 -1
  365. package/dist/views/system/role/components/GrantMenuSheet.vue.d.ts +20 -0
  366. package/dist/views/system/role/components/GrantMenuSheet.vue.js +8 -0
  367. package/dist/views/system/role/components/GrantMenuSheet.vue.js.map +1 -0
  368. package/dist/views/system/role/components/GrantMenuSheet2.vue.js +117 -0
  369. package/dist/views/system/role/components/GrantMenuSheet2.vue.js.map +1 -0
  370. package/dist/views/system/role/components/GrantMenuTable.vue.d.ts +6 -4
  371. package/dist/views/system/role/components/GrantMenuTable.vue.js +2 -2
  372. package/dist/views/system/role/components/GrantMenuTable2.vue.js +279 -177
  373. package/dist/views/system/role/components/GrantMenuTable2.vue.js.map +1 -1
  374. package/dist/views/system/role/components/MatchText.vue.d.ts +7 -0
  375. package/dist/views/system/role/components/MatchText.vue.js +8 -0
  376. package/dist/views/system/role/components/MatchText.vue.js.map +1 -0
  377. package/dist/views/system/role/components/MatchText2.vue.js +29 -0
  378. package/dist/views/system/role/components/MatchText2.vue.js.map +1 -0
  379. package/dist/views/system/role/components/grantMenuGroups.d.ts +36 -0
  380. package/dist/views/system/role/components/grantMenuGroups.js +110 -48
  381. package/dist/views/system/role/components/grantMenuGroups.js.map +1 -1
  382. package/dist/views/system/role/index.vue.js +5 -2
  383. package/dist/views/system/role/index.vue.js.map +1 -1
  384. package/dist/views/system/role/index2.vue.js +181 -165
  385. package/dist/views/system/role/index2.vue.js.map +1 -1
  386. package/dist/views/system/session/index2.vue.js +75 -49
  387. package/dist/views/system/session/index2.vue.js.map +1 -1
  388. package/dist/views/system/user/components/ResetPasswordModal.vue.js +2 -2
  389. package/dist/views/system/user/components/ResetPasswordModal2.vue.js +2 -0
  390. package/dist/views/system/user/components/ResetPasswordModal2.vue.js.map +1 -1
  391. package/dist/views/system/user/components/UserFormModal.vue.js +2 -2
  392. package/dist/views/system/user/components/UserFormModal2.vue.js +77 -76
  393. package/dist/views/system/user/components/UserFormModal2.vue.js.map +1 -1
  394. package/dist/views/system/user/index.vue.js +2 -2
  395. package/dist/views/system/user/index2.vue.js +362 -275
  396. package/dist/views/system/user/index2.vue.js.map +1 -1
  397. package/package.json +3 -5
  398. package/dist/components/SelectTable/index.vue.d.ts +0 -76
  399. package/dist/components/SelectTable/index2.vue.js +0 -256
  400. package/dist/components/SelectTable/index2.vue.js.map +0 -1
  401. package/dist/composables/useTableRowSort.d.ts +0 -20
  402. package/dist/composables/useTableRowSort.js +0 -59
  403. package/dist/composables/useTableRowSort.js.map +0 -1
  404. package/dist/layouts/LayoutModeCards.vue.js +0 -8
  405. package/dist/layouts/LayoutModeCards.vue.js.map +0 -1
  406. package/dist/layouts/LayoutModeCards2.vue.js +0 -67
  407. package/dist/layouts/LayoutModeCards2.vue.js.map +0 -1
  408. package/dist/layouts/SettingRow.vue.d.ts +0 -16
  409. package/dist/layouts/SettingRow.vue.js +0 -8
  410. package/dist/layouts/SettingRow.vue.js.map +0 -1
  411. package/dist/layouts/SettingRow2.vue.js +0 -23
  412. package/dist/layouts/SettingRow2.vue.js.map +0 -1
  413. package/dist/views/login/skins/AuroraGlass.vue.js +0 -8
  414. package/dist/views/login/skins/AuroraGlass.vue.js.map +0 -1
  415. package/dist/views/login/skins/AuroraGlass2.vue.js +0 -80
  416. package/dist/views/login/skins/AuroraGlass2.vue.js.map +0 -1
  417. package/dist/views/login/skins/SplitPanel.vue.d.ts +0 -3
  418. package/dist/views/login/skins/SplitPanel.vue.js +0 -8
  419. package/dist/views/login/skins/SplitPanel.vue.js.map +0 -1
  420. package/dist/views/login/skins/SplitPanel2.vue.js +0 -65
  421. package/dist/views/login/skins/SplitPanel2.vue.js.map +0 -1
  422. package/dist/views/login/skins/Spotlight.vue.d.ts +0 -3
  423. package/dist/views/login/skins/Spotlight.vue.js +0 -8
  424. package/dist/views/login/skins/Spotlight.vue.js.map +0 -1
  425. package/dist/views/login/skins/Spotlight2.vue.js +0 -36
  426. package/dist/views/login/skins/Spotlight2.vue.js.map +0 -1
  427. package/dist/views/login/skins.d.ts +0 -8
  428. package/dist/views/login/skins.js +0 -13
  429. package/dist/views/login/skins.js.map +0 -1
  430. /package/dist/components/{SelectTable → TableTotal}/index.vue.js.map +0 -0
  431. /package/dist/layouts/{LayoutModeCards.vue.d.ts → AccentPicker.vue.d.ts} +0 -0
  432. /package/dist/views/{login/skins/AuroraGlass.vue.d.ts → system/config/components/WatermarkSection.vue.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"SecuritySection2.vue.js","sources":["../../../../../src/views/system/config/components/SecuritySection.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 安全策略:登录保护、会话、密码、请求限流。后端经 ISecurityPolicyProvider 读这些键强制执行,保存即生效。\n// 设置项多,按 3:2 分:左边两列分组列表,右边把草稿翻成\"用户会遇到的规则\",再给一个密码试填框,\n// 当场看出新规则下什么样的密码能过。\nimport { computed, ref } from 'vue'\nimport { NInputNumber, NSwitch, NTooltip } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport AppIcon from '#/components/AppIcon.vue'\nimport { humanizeMinutes, securityRules } from '#/lib/securityRules'\nimport { CAPTCHA_TYPE_KEY, SECURITY_NUMBERS } from '../groups'\nimport { useConfigDraft, useDraftFields } from '../draft'\nimport { vFlash } from '../flash'\nimport SectionLayout from './SectionLayout.vue'\nimport CfgGroup from './CfgGroup.vue'\nimport CfgRow from './CfgRow.vue'\nimport CfgSegment from './CfgSegment.vue'\n\nconst { t } = useI18n()\nconst { values } = useConfigDraft()\nconst { num, bool, str } = useDraftFields()\n\nconst s = (k: string) => `sys.security.${k}`\n/** 'loginLock.maxFailCount' → 数值绑定 + 下限 + 单位 */\nconst numField = (k: string, unit: string) => ({\n key: s(k),\n label: t(`config.security.${k}`),\n unit: t(`config.security.unit.${unit}`),\n min: SECURITY_NUMBERS[s(k)],\n model: num(s(k), SECURITY_NUMBERS[s(k)]),\n})\n\nconst lockCount = numField('loginLock.maxFailCount', 'times')\nconst lockMinutes = numField('loginLock.lockMinutes', 'minutes')\nconst captchaOn = bool(s('captcha.enabled'))\nconst captchaType = str(CAPTCHA_TYPE_KEY)\nconst captchaOptions = computed(() =>\n (['char', 'path', 'math'] as const).map(v => ({\n value: v,\n label: t(`config.security.captcha.types.${v}`),\n })),\n)\nconst captchaTypeModel = computed({\n get: () => (captchaType.value || 'char') as 'char' | 'path' | 'math',\n set: v => (captchaType.value = v),\n})\nconst totp = bool(s('totp.enabled'))\nconst totpSuper = bool(s('totp.requireForSuperAdmin'))\nconst mfa = bool(s('mfa.enabled'))\n\nconst access = numField('session.accessMinutes', 'minutes')\nconst refresh = numField('session.refreshMinutes', 'minutes')\n\nconst minLength = numField('password.minLength', 'chars')\nconst REQS = ['Upper', 'Lower', 'Digit', 'Special'] as const\nconst reqs = REQS.map(r => ({\n key: s(`password.require${r}`),\n label: t(`config.security.password.chip${r}`),\n name: t(`config.security.password.require${r}`),\n model: bool(s(`password.require${r}`)),\n}))\nconst expireDays = numField('password.expireDays', 'days')\nconst history = numField('password.historyCount', 'times')\nconst FIRST_CHANGE_KEY = s('password.forceChangeOnFirstLogin')\nconst firstChange = bool(FIRST_CHANGE_KEY)\n\nconst rateOn = bool(s('rateLimit.enabled'))\nconst rate = [\n numField('rateLimit.windowSeconds', 'seconds'),\n numField('rateLimit.permitPerWindow', 'times'),\n numField('rateLimit.authPermitPerWindow', 'times'),\n]\n\nconst duration = (minutes: number) => {\n const d = humanizeMinutes(minutes)\n return t(d.key, { n: d.n })\n}\nconst rules = computed(() =>\n securityRules(values, {\n duration: d => t(d.key, { n: d.n }),\n requirement: code => t(`config.preview.req.${code}`),\n captchaType: code => t(`config.security.captcha.types.${code}`),\n join: items => items.join(t('config.preview.sep')),\n }),\n)\n\n// 密码试填:只在本页做规则比对,不提交\nconst tryPassword = ref('Admin123')\nconst checks = computed(() => {\n const pw = tryPassword.value\n const list = [\n {\n label: t('config.security.tryMin', { n: minLength.model.value }),\n ok: pw.length >= minLength.model.value,\n },\n ]\n const test: Record<(typeof REQS)[number], RegExp> = {\n Upper: /[A-Z]/,\n Lower: /[a-z]/,\n Digit: /\\d/,\n Special: /[^A-Za-z0-9]/,\n }\n REQS.forEach((r, i) => {\n if (reqs[i].model.value)\n list.push({ label: t(`config.preview.req.${r.toLowerCase()}`), ok: test[r].test(pw) })\n })\n return list\n})\nconst passes = computed(() => checks.value.every(c => c.ok))\n</script>\n\n<template>\n <SectionLayout\n :title=\"t('config.tab.security')\"\n :desc=\"t('config.security.desc')\"\n :preview-title=\"t('config.security.preview')\"\n layout=\"wide\"\n preview-align=\"start\"\n >\n <div class=\"cols\">\n <div class=\"col\">\n <CfgGroup :title=\"t('config.security.groupLogin')\">\n <CfgRow\n v-for=\"f in [lockCount, lockMinutes]\"\n :key=\"f.key\"\n :label=\"f.label\"\n :hint=\"f === lockCount ? t('config.security.zeroNoLock') : undefined\"\n :keys=\"[f.key]\"\n >\n <n-input-number\n v-model:value=\"f.model.value\"\n class=\"num\"\n size=\"small\"\n :min=\"f.min\"\n :show-button=\"false\"\n :input-props=\"{ 'aria-label': f.label }\"\n />\n <span class=\"unit\">{{ f.unit }}</span>\n </CfgRow>\n <CfgRow :label=\"t('config.security.captcha.enabled')\" :keys=\"[s('captcha.enabled')]\">\n <n-switch\n v-model:value=\"captchaOn\"\n :aria-label=\"t('config.security.captcha.enabled')\"\n />\n </CfgRow>\n <CfgRow\n :label=\"t('config.security.captcha.type')\"\n :keys=\"[CAPTCHA_TYPE_KEY]\"\n :disabled=\"!captchaOn\"\n sub\n >\n <CfgSegment\n v-model=\"captchaTypeModel\"\n :options=\"captchaOptions\"\n :label=\"t('config.security.captcha.type')\"\n />\n </CfgRow>\n <CfgRow :keys=\"[s('totp.enabled')]\">\n <template #label>\n {{ t('config.security.totp.enabled') }}\n <n-tooltip :style=\"{ maxWidth: '320px' }\">\n <template #trigger>\n <button type=\"button\" class=\"tip\" :aria-label=\"t('config.security.totp.hint')\">\n <AppIcon icon=\"ph:question\" :size=\"12\" />\n </button>\n </template>\n {{ t('config.security.totp.hint') }}\n </n-tooltip>\n </template>\n <n-switch v-model:value=\"totp\" :aria-label=\"t('config.security.totp.enabled')\" />\n </CfgRow>\n <CfgRow\n :label=\"t('config.security.totp.requireForSuperAdmin')\"\n :keys=\"[s('totp.requireForSuperAdmin')]\"\n :disabled=\"!totp\"\n sub\n >\n <n-switch\n v-model:value=\"totpSuper\"\n :aria-label=\"t('config.security.totp.requireForSuperAdmin')\"\n />\n </CfgRow>\n <CfgRow :keys=\"[s('mfa.enabled')]\">\n <template #label>\n {{ t('config.security.mfa.enabled') }}\n <n-tooltip :style=\"{ maxWidth: '320px' }\">\n <template #trigger>\n <button type=\"button\" class=\"tip\" :aria-label=\"t('config.security.sms.hint')\">\n <AppIcon icon=\"ph:question\" :size=\"12\" />\n </button>\n </template>\n {{ t('config.security.sms.hint') }}\n </n-tooltip>\n </template>\n <n-switch v-model:value=\"mfa\" :aria-label=\"t('config.security.mfa.enabled')\" />\n </CfgRow>\n </CfgGroup>\n\n <CfgGroup :title=\"t('config.security.groupSession')\">\n <CfgRow\n v-for=\"f in [access, refresh]\"\n :key=\"f.key\"\n :label=\"f.label\"\n :hint=\"`= ${duration(f.model.value)}`\"\n :keys=\"[f.key]\"\n >\n <n-input-number\n v-model:value=\"f.model.value\"\n class=\"num\"\n size=\"small\"\n :min=\"f.min\"\n :show-button=\"false\"\n :input-props=\"{ 'aria-label': f.label }\"\n />\n <span class=\"unit\">{{ f.unit }}</span>\n </CfgRow>\n </CfgGroup>\n </div>\n\n <div class=\"col\">\n <CfgGroup :title=\"t('config.security.password.title')\">\n <CfgRow :label=\"minLength.label\" :keys=\"[minLength.key]\">\n <n-input-number\n v-model:value=\"minLength.model.value\"\n class=\"num\"\n size=\"small\"\n :min=\"minLength.min\"\n :show-button=\"false\"\n :input-props=\"{ 'aria-label': minLength.label }\"\n />\n <span class=\"unit\">{{ minLength.unit }}</span>\n </CfgRow>\n <CfgRow :label=\"t('config.security.password.mustContain')\" :keys=\"reqs.map(r => r.key)\">\n <span class=\"chips\">\n <button\n v-for=\"r in reqs\"\n :key=\"r.key\"\n type=\"button\"\n class=\"chip\"\n :aria-pressed=\"r.model.value\"\n :aria-label=\"r.name\"\n :title=\"r.name\"\n @click=\"r.model.value = !r.model.value\"\n >\n {{ r.label }}\n </button>\n </span>\n </CfgRow>\n <CfgRow\n v-for=\"f in [expireDays, history]\"\n :key=\"f.key\"\n :label=\"f.label\"\n :hint=\"t(f === expireDays ? 'config.security.zeroNever' : 'config.security.zeroOff')\"\n :keys=\"[f.key]\"\n >\n <n-input-number\n v-model:value=\"f.model.value\"\n class=\"num\"\n size=\"small\"\n :min=\"f.min\"\n :show-button=\"false\"\n :input-props=\"{ 'aria-label': f.label }\"\n />\n <span class=\"unit\">{{ f.unit }}</span>\n </CfgRow>\n <CfgRow\n :label=\"t('config.security.password.forceChangeOnFirstLogin')\"\n :hint=\"t('config.security.password.forceChangeOnFirstLoginHint')\"\n :keys=\"[FIRST_CHANGE_KEY]\"\n >\n <n-switch\n v-model:value=\"firstChange\"\n :aria-label=\"t('config.security.password.forceChangeOnFirstLogin')\"\n />\n </CfgRow>\n </CfgGroup>\n\n <CfgGroup :title=\"t('config.security.groupRate')\">\n <CfgRow :label=\"t('config.security.rateLimit.enabled')\" :keys=\"[s('rateLimit.enabled')]\">\n <n-switch v-model:value=\"rateOn\" :aria-label=\"t('config.security.rateLimit.enabled')\" />\n </CfgRow>\n <CfgRow\n v-for=\"f in rate\"\n :key=\"f.key\"\n :label=\"f.label\"\n :keys=\"[f.key]\"\n :disabled=\"!rateOn\"\n sub\n >\n <n-input-number\n v-model:value=\"f.model.value\"\n class=\"num\"\n size=\"small\"\n :min=\"f.min\"\n :show-button=\"false\"\n :input-props=\"{ 'aria-label': f.label }\"\n />\n <span class=\"unit\">{{ f.unit }}</span>\n </CfgRow>\n </CfgGroup>\n </div>\n </div>\n\n <template #preview>\n <ul class=\"rules\" data-testid=\"security-rules\">\n <li\n v-for=\"r in rules\"\n :key=\"r.icon\"\n v-flash=\"`${r.on}|${t(r.key, r.params ?? {})}`\"\n :class=\"{ off: !r.on }\"\n >\n <span class=\"ic\"><AppIcon :icon=\"r.icon\" :size=\"14\" /></span>\n <span class=\"txt\">{{ t(r.key, r.params ?? {}) }}</span>\n <span v-if=\"!r.on\" class=\"sr-only\">{{ t('config.preview.off') }}</span>\n </li>\n </ul>\n <div class=\"try\">\n <label>\n <span>{{ t('config.security.tryLabel') }}</span>\n <input v-model=\"tryPassword\" autocomplete=\"off\" spellcheck=\"false\" />\n </label>\n <ul>\n <li v-for=\"c in checks\" :key=\"c.label\" :class=\"{ ok: c.ok }\">{{ c.label }}</li>\n <li :class=\"['verdict', { ok: passes }]\">\n {{ passes ? t('config.security.tryPass') : t('config.security.tryFail') }}\n </li>\n </ul>\n </div>\n </template>\n </SectionLayout>\n</template>\n\n<style scoped>\n.cols {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 14px;\n align-items: start;\n}\n.col {\n display: flex;\n flex-direction: column;\n gap: 14px;\n min-width: 0;\n}\n.num {\n width: 96px;\n}\n.num :deep(input) {\n text-align: right;\n}\n.unit {\n flex: none;\n width: 32px;\n font-size: var(--font-size-sm);\n color: var(--color-text-secondary);\n}\n.tip {\n display: inline-grid;\n place-items: center;\n width: 16px;\n height: 16px;\n padding: 0;\n border: 0;\n border-radius: 50%;\n background: var(--color-fill);\n color: var(--color-text-secondary);\n cursor: help;\n}\n.tip:focus-visible {\n outline: 2px solid var(--color-primary);\n}\n.chips {\n display: inline-flex;\n flex: none;\n gap: 5px;\n}\n.chip {\n padding: 2px 8px;\n border: 0;\n border-radius: 6px;\n background: var(--color-fill);\n font:\n var(--font-size-sm) ui-monospace,\n SFMono-Regular,\n Menlo,\n Consolas,\n monospace;\n line-height: 20px;\n color: var(--color-text-secondary);\n white-space: nowrap;\n cursor: pointer;\n}\n.chip[aria-pressed='true'] {\n background: var(--color-primary);\n color: #fff;\n}\n.chip:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: 1px;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n.rules {\n margin: 0;\n padding: 2px 0;\n list-style: none;\n border-radius: 12px;\n background: var(--color-bg-container);\n}\n.rules li {\n position: relative;\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 7px 14px;\n border-radius: 8px;\n font-size: var(--font-size-base);\n line-height: 1.5;\n}\n.rules li + li::before {\n content: '';\n position: absolute;\n top: 0;\n left: 46px;\n right: 0;\n border-top: 0.5px solid var(--color-border);\n}\n.ic {\n display: grid;\n flex: none;\n place-items: center;\n width: 22px;\n height: 22px;\n border-radius: 6px;\n color: #fff;\n background: var(--color-primary);\n}\n.rules li.off .ic {\n color: var(--color-text-tertiary);\n background: var(--color-fill);\n}\n.rules li.off .txt {\n color: var(--color-text-tertiary);\n}\n.try {\n flex: none;\n padding: 10px 14px;\n border-radius: 12px;\n background: var(--color-bg-container);\n}\n.try label {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: var(--font-size-base);\n color: var(--color-text-secondary);\n}\n.try input {\n flex: 1;\n min-width: 0;\n height: 28px;\n padding: 0 10px;\n border: 0;\n border-radius: 7px;\n outline: none;\n background: var(--color-fill);\n color: var(--color-text-primary);\n font: inherit;\n}\n.try input:focus-visible {\n box-shadow: 0 0 0 2px var(--color-primary);\n}\n.try ul {\n display: flex;\n flex-wrap: wrap;\n gap: 4px 14px;\n margin: 8px 0 0;\n padding: 0;\n list-style: none;\n font-size: var(--font-size-sm);\n color: var(--color-text-tertiary);\n}\n.try li::before {\n content: '○ ';\n}\n.try li.ok {\n color: var(--color-success);\n}\n.try li.ok::before {\n content: '● ';\n}\n.try li.verdict {\n margin-left: auto;\n color: var(--color-danger);\n}\n.try li.verdict::before,\n.try li.verdict.ok::before {\n content: '';\n}\n.try li.verdict.ok {\n color: var(--color-success);\n}\n@media (max-width: 1280px) {\n .cols {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n</style>\n"],"names":["useI18n","values","useConfigDraft","num","bool","str","useDraftFields","s","k","numField","unit","SECURITY_NUMBERS","lockCount","lockMinutes","captchaOn","captchaType","CAPTCHA_TYPE_KEY","captchaOptions","computed","v","captchaTypeModel","totp","totpSuper","mfa","access","refresh","minLength","REQS","reqs","r","expireDays","history","FIRST_CHANGE_KEY","firstChange","rateOn","rate","duration","minutes","d","humanizeMinutes","rules","securityRules","code","items","tryPassword","ref","checks","pw","list","test","i","passes","c","_createBlock","SectionLayout","_unref","_createElementVNode","_hoisted_13","_createElementBlock","_Fragment","_renderList","_normalizeClass","_hoisted_14","_createVNode","AppIcon","_hoisted_15","_toDisplayString","_hoisted_16","_hoisted_17","$event","_hoisted_1","_hoisted_2","CfgGroup","_openBlock","f","CfgRow","NInputNumber","_hoisted_3","NSwitch","CfgSegment","_createTextVNode","NTooltip","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12"],"mappings":"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"}
1
+ {"version":3,"file":"SecuritySection2.vue.js","sources":["../../../../../src/views/system/config/components/SecuritySection.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 安全策略:登录保护、会话、密码、请求限流。后端经 ISecurityPolicyProvider 读这些键强制执行,保存即生效。\n// 设置项多,按 3:2 分:左边两列分组列表,右边把草稿翻成\"用户会遇到的规则\",再给一个密码试填框,\n// 当场看出新规则下什么样的密码能过。\nimport { computed, ref } from 'vue'\nimport { NInputNumber, NSwitch, NTooltip } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport AppIcon from '#/components/AppIcon.vue'\nimport { humanizeMinutes, securityRules } from '#/lib/securityRules'\nimport { CAPTCHA_TYPE_KEY, SECURITY_NUMBERS } from '../groups'\nimport { useConfigDraft, useDraftFields } from '../draft'\nimport { useConfigLayout } from '../layoutMode'\nimport { vFlash } from '../flash'\nimport SectionLayout from './SectionLayout.vue'\nimport CfgGroup from './CfgGroup.vue'\nimport CfgRow from './CfgRow.vue'\nimport CfgSegment from './CfgSegment.vue'\n\nconst { t } = useI18n()\nconst { values } = useConfigDraft()\nconst { num, bool, str } = useDraftFields()\nconst { ctl, nar } = useConfigLayout()\n\nconst s = (k: string) => `sys.security.${k}`\n/** 'loginLock.maxFailCount' → 数值绑定 + 下限 + 单位 */\nconst numField = (k: string, unit: string) => ({\n key: s(k),\n label: t(`config.security.${k}`),\n unit: t(`config.security.unit.${unit}`),\n min: SECURITY_NUMBERS[s(k)],\n model: num(s(k), SECURITY_NUMBERS[s(k)]),\n})\n\nconst lockCount = numField('loginLock.maxFailCount', 'times')\nconst lockMinutes = numField('loginLock.lockMinutes', 'minutes')\nconst captchaOn = bool(s('captcha.enabled'))\nconst captchaType = str(CAPTCHA_TYPE_KEY)\nconst captchaOptions = computed(() =>\n (['char', 'path', 'math'] as const).map(v => ({\n value: v,\n label: t(`config.security.captcha.types.${v}`),\n })),\n)\nconst captchaTypeModel = computed({\n get: () => (captchaType.value || 'char') as 'char' | 'path' | 'math',\n set: v => (captchaType.value = v),\n})\nconst totp = bool(s('totp.enabled'))\nconst totpSuper = bool(s('totp.requireForSuperAdmin'))\nconst mfa = bool(s('mfa.enabled'))\n\nconst access = numField('session.accessMinutes', 'minutes')\nconst refresh = numField('session.refreshMinutes', 'minutes')\n\nconst minLength = numField('password.minLength', 'chars')\nconst REQS = ['Upper', 'Lower', 'Digit', 'Special'] as const\nconst reqs = REQS.map(r => ({\n key: s(`password.require${r}`),\n label: t(`config.security.password.chip${r}`),\n name: t(`config.security.password.require${r}`),\n model: bool(s(`password.require${r}`)),\n}))\nconst expireDays = numField('password.expireDays', 'days')\nconst history = numField('password.historyCount', 'times')\nconst FIRST_CHANGE_KEY = s('password.forceChangeOnFirstLogin')\nconst firstChange = bool(FIRST_CHANGE_KEY)\n\nconst rateOn = bool(s('rateLimit.enabled'))\nconst rate = [\n numField('rateLimit.windowSeconds', 'seconds'),\n numField('rateLimit.permitPerWindow', 'times'),\n numField('rateLimit.authPermitPerWindow', 'times'),\n]\n\nconst duration = (minutes: number) => {\n const d = humanizeMinutes(minutes)\n return t(d.key, { n: d.n })\n}\nconst rules = computed(() =>\n securityRules(values, {\n duration: d => t(d.key, { n: d.n }),\n requirement: code => t(`config.preview.req.${code}`),\n captchaType: code => t(`config.security.captcha.types.${code}`),\n join: items => items.join(t('config.preview.sep')),\n }),\n)\n\n// 密码试填:只在本页做规则比对,不提交\nconst tryPassword = ref('Admin123')\nconst checks = computed(() => {\n const pw = tryPassword.value\n const list = [\n {\n label: t('config.security.tryMin', { n: minLength.model.value }),\n ok: pw.length >= minLength.model.value,\n },\n ]\n const test: Record<(typeof REQS)[number], RegExp> = {\n Upper: /[A-Z]/,\n Lower: /[a-z]/,\n Digit: /\\d/,\n Special: /[^A-Za-z0-9]/,\n }\n REQS.forEach((r, i) => {\n if (reqs[i].model.value)\n list.push({ label: t(`config.preview.req.${r.toLowerCase()}`), ok: test[r].test(pw) })\n })\n return list\n})\nconst passes = computed(() => checks.value.every(c => c.ok))\n</script>\n\n<template>\n <SectionLayout\n :title=\"t('config.tab.security')\"\n :desc=\"t('config.security.desc')\"\n :preview-title=\"t('config.security.preview')\"\n layout=\"wide\"\n preview-align=\"start\"\n >\n <div class=\"cols\">\n <div class=\"col\">\n <CfgGroup :title=\"t('config.security.groupLogin')\">\n <CfgRow\n v-for=\"f in [lockCount, lockMinutes]\"\n :key=\"f.key\"\n :label=\"f.label\"\n :hint=\"f === lockCount ? t('config.security.zeroNoLock') : undefined\"\n :keys=\"[f.key]\"\n >\n <n-input-number\n v-model:value=\"f.model.value\"\n class=\"num\"\n :size=\"ctl\"\n :min=\"f.min\"\n :show-button=\"false\"\n :input-props=\"{ 'aria-label': f.label }\"\n />\n <span class=\"unit\">{{ f.unit }}</span>\n </CfgRow>\n <CfgRow :label=\"t('config.security.captcha.enabled')\" :keys=\"[s('captcha.enabled')]\">\n <n-switch\n v-model:value=\"captchaOn\"\n :aria-label=\"t('config.security.captcha.enabled')\"\n />\n </CfgRow>\n <CfgRow\n :label=\"t('config.security.captcha.type')\"\n :keys=\"[CAPTCHA_TYPE_KEY]\"\n :disabled=\"!captchaOn\"\n sub\n >\n <CfgSegment\n v-model=\"captchaTypeModel\"\n :options=\"captchaOptions\"\n :label=\"t('config.security.captcha.type')\"\n />\n </CfgRow>\n <CfgRow :keys=\"[s('totp.enabled')]\">\n <template #label>\n {{ t('config.security.totp.enabled') }}\n <n-tooltip :style=\"{ maxWidth: '320px' }\">\n <template #trigger>\n <button type=\"button\" class=\"tip\" :aria-label=\"t('config.security.totp.hint')\">\n <AppIcon icon=\"ph:question\" :size=\"12\" />\n </button>\n </template>\n {{ t('config.security.totp.hint') }}\n </n-tooltip>\n </template>\n <n-switch v-model:value=\"totp\" :aria-label=\"t('config.security.totp.enabled')\" />\n </CfgRow>\n <CfgRow\n :label=\"t('config.security.totp.requireForSuperAdmin')\"\n :keys=\"[s('totp.requireForSuperAdmin')]\"\n :disabled=\"!totp\"\n sub\n >\n <n-switch\n v-model:value=\"totpSuper\"\n :aria-label=\"t('config.security.totp.requireForSuperAdmin')\"\n />\n </CfgRow>\n <CfgRow :keys=\"[s('mfa.enabled')]\">\n <template #label>\n {{ t('config.security.mfa.enabled') }}\n <n-tooltip :style=\"{ maxWidth: '320px' }\">\n <template #trigger>\n <button type=\"button\" class=\"tip\" :aria-label=\"t('config.security.sms.hint')\">\n <AppIcon icon=\"ph:question\" :size=\"12\" />\n </button>\n </template>\n {{ t('config.security.sms.hint') }}\n </n-tooltip>\n </template>\n <n-switch v-model:value=\"mfa\" :aria-label=\"t('config.security.mfa.enabled')\" />\n </CfgRow>\n </CfgGroup>\n\n <CfgGroup :title=\"t('config.security.groupSession')\">\n <CfgRow\n v-for=\"f in [access, refresh]\"\n :key=\"f.key\"\n :label=\"f.label\"\n :hint=\"`= ${duration(f.model.value)}`\"\n :keys=\"[f.key]\"\n >\n <n-input-number\n v-model:value=\"f.model.value\"\n class=\"num\"\n :size=\"ctl\"\n :min=\"f.min\"\n :show-button=\"false\"\n :input-props=\"{ 'aria-label': f.label }\"\n />\n <span class=\"unit\">{{ f.unit }}</span>\n </CfgRow>\n </CfgGroup>\n </div>\n\n <div class=\"col\">\n <CfgGroup :title=\"t('config.security.password.title')\">\n <CfgRow :label=\"minLength.label\" :keys=\"[minLength.key]\">\n <n-input-number\n v-model:value=\"minLength.model.value\"\n class=\"num\"\n :size=\"ctl\"\n :min=\"minLength.min\"\n :show-button=\"false\"\n :input-props=\"{ 'aria-label': minLength.label }\"\n />\n <span class=\"unit\">{{ minLength.unit }}</span>\n </CfgRow>\n <CfgRow :label=\"t('config.security.password.mustContain')\" :keys=\"reqs.map(r => r.key)\">\n <span class=\"chips\">\n <button\n v-for=\"r in reqs\"\n :key=\"r.key\"\n type=\"button\"\n :class=\"['chip', { lg: nar }]\"\n :aria-pressed=\"r.model.value\"\n :aria-label=\"r.name\"\n :title=\"r.name\"\n @click=\"r.model.value = !r.model.value\"\n >\n {{ r.label }}\n </button>\n </span>\n </CfgRow>\n <CfgRow\n v-for=\"f in [expireDays, history]\"\n :key=\"f.key\"\n :label=\"f.label\"\n :hint=\"t(f === expireDays ? 'config.security.zeroNever' : 'config.security.zeroOff')\"\n :keys=\"[f.key]\"\n >\n <n-input-number\n v-model:value=\"f.model.value\"\n class=\"num\"\n :size=\"ctl\"\n :min=\"f.min\"\n :show-button=\"false\"\n :input-props=\"{ 'aria-label': f.label }\"\n />\n <span class=\"unit\">{{ f.unit }}</span>\n </CfgRow>\n <CfgRow\n :label=\"t('config.security.password.forceChangeOnFirstLogin')\"\n :hint=\"t('config.security.password.forceChangeOnFirstLoginHint')\"\n :keys=\"[FIRST_CHANGE_KEY]\"\n >\n <n-switch\n v-model:value=\"firstChange\"\n :aria-label=\"t('config.security.password.forceChangeOnFirstLogin')\"\n />\n </CfgRow>\n </CfgGroup>\n\n <CfgGroup :title=\"t('config.security.groupRate')\">\n <CfgRow :label=\"t('config.security.rateLimit.enabled')\" :keys=\"[s('rateLimit.enabled')]\">\n <n-switch v-model:value=\"rateOn\" :aria-label=\"t('config.security.rateLimit.enabled')\" />\n </CfgRow>\n <CfgRow\n v-for=\"f in rate\"\n :key=\"f.key\"\n :label=\"f.label\"\n :keys=\"[f.key]\"\n :disabled=\"!rateOn\"\n sub\n >\n <n-input-number\n v-model:value=\"f.model.value\"\n class=\"num\"\n :size=\"ctl\"\n :min=\"f.min\"\n :show-button=\"false\"\n :input-props=\"{ 'aria-label': f.label }\"\n />\n <span class=\"unit\">{{ f.unit }}</span>\n </CfgRow>\n </CfgGroup>\n </div>\n </div>\n\n <template #preview>\n <ul class=\"rules\" data-testid=\"security-rules\">\n <li\n v-for=\"r in rules\"\n :key=\"r.icon\"\n v-flash=\"`${r.on}|${t(r.key, r.params ?? {})}`\"\n :class=\"{ off: !r.on }\"\n >\n <span class=\"ic\"><AppIcon :icon=\"r.icon\" :size=\"14\" /></span>\n <span class=\"txt\">{{ t(r.key, r.params ?? {}) }}</span>\n <span v-if=\"!r.on\" class=\"sr-only\">{{ t('config.preview.off') }}</span>\n </li>\n </ul>\n <div class=\"try\">\n <label>\n <span>{{ t('config.security.tryLabel') }}</span>\n <input v-model=\"tryPassword\" autocomplete=\"off\" spellcheck=\"false\" />\n </label>\n <ul>\n <li v-for=\"c in checks\" :key=\"c.label\" :class=\"{ ok: c.ok }\">{{ c.label }}</li>\n <li :class=\"['verdict', { ok: passes }]\">\n {{ passes ? t('config.security.tryPass') : t('config.security.tryFail') }}\n </li>\n </ul>\n </div>\n </template>\n </SectionLayout>\n</template>\n\n<style scoped>\n.cols {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 14px;\n align-items: start;\n}\n/* 设置列不够宽(窄屏、或中档单栏)时两列分组收成一列;量的是设置列自己的宽度(SectionLayout 的容器) */\n@container (max-width: 560px) {\n .cols {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n.col {\n display: flex;\n flex-direction: column;\n gap: 14px;\n min-width: 0;\n}\n.num {\n width: 96px;\n}\n.num :deep(input) {\n text-align: right;\n}\n.unit {\n flex: none;\n min-width: 32px;\n font-size: 13px;\n color: var(--text-2);\n}\n.tip {\n display: inline-grid;\n place-items: center;\n width: 16px;\n height: 16px;\n margin-left: 4px;\n padding: 0;\n border: 0;\n border-radius: 50%;\n background: var(--glass-strong);\n color: var(--text-2);\n cursor: help;\n}\n.tip:focus-visible {\n outline: 2px solid var(--signal);\n}\n.chips {\n display: inline-flex;\n flex: none;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: 5px;\n}\n/* 「必须包含」的开关小标签:外观是可勾选 Tag(未选玻璃底、选中强调色实底) */\n.chip {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 34px;\n height: 24px;\n padding: 0 10px;\n border: 0;\n border-radius: 6px;\n background: var(--glass-strong);\n font-family: var(--font-mono);\n font-size: 14px;\n color: var(--text-2);\n white-space: nowrap;\n cursor: pointer;\n}\n.chip.lg {\n min-height: 32px;\n}\n.chip[aria-pressed='true'] {\n background: var(--acc-solid);\n color: var(--on-acc);\n}\n.chip:focus-visible {\n outline: 2px solid var(--signal);\n outline-offset: 1px;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n.rules {\n margin: 0;\n padding: 2px 0;\n list-style: none;\n border-radius: var(--radius-lg);\n background: var(--cfg-card);\n}\n.rules li {\n position: relative;\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 7px 14px;\n border-radius: var(--radius-md);\n font-size: 14px;\n line-height: 1.5;\n}\n.rules li + li::before {\n content: '';\n position: absolute;\n top: 0;\n left: 46px;\n right: 0;\n border-top: 1px solid var(--separator);\n}\n.ic {\n display: grid;\n flex: none;\n place-items: center;\n width: 22px;\n height: 22px;\n border-radius: 6px;\n color: var(--on-acc);\n background: var(--acc-solid);\n}\n.rules li.off .ic {\n color: var(--text-3);\n background: var(--glass-strong);\n}\n.rules li.off .txt {\n color: var(--text-3);\n text-decoration: line-through;\n}\n.try {\n flex: none;\n padding: 10px 14px;\n border-radius: var(--radius-lg);\n background: var(--cfg-card);\n}\n.try label {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 14px;\n}\n.try label span {\n flex: none;\n color: var(--text-2);\n}\n.try input {\n flex: 1;\n min-width: 0;\n height: 28px;\n padding: 0 10px;\n border: 1px solid var(--border);\n border-radius: var(--radius-md);\n background: var(--fill);\n color: var(--text-1);\n font: inherit;\n}\n.try input:focus-visible {\n outline: 2px solid var(--signal);\n outline-offset: -1px;\n}\n.try ul {\n display: flex;\n flex-wrap: wrap;\n gap: 6px 14px;\n margin: 8px 0 0;\n padding: 0;\n list-style: none;\n font-size: 13px;\n color: var(--err);\n}\n.try li::before {\n content: '\\2715 ';\n}\n.try li.ok {\n color: var(--ok);\n}\n.try li.ok::before {\n content: '\\2713 ';\n}\n.try li.verdict {\n margin-left: auto;\n font-weight: 600;\n}\n.try li.verdict::before {\n content: '';\n}\n</style>\n"],"names":["t","useI18n","values","useConfigDraft","num","bool","str","useDraftFields","ctl","nar","useConfigLayout","s","k","numField","unit","SECURITY_NUMBERS","lockCount","lockMinutes","captchaOn","captchaType","CAPTCHA_TYPE_KEY","captchaOptions","computed","v","captchaTypeModel","totp","totpSuper","mfa","access","refresh","minLength","REQS","reqs","r","expireDays","history","FIRST_CHANGE_KEY","firstChange","rateOn","rate","duration","minutes","d","humanizeMinutes","rules","securityRules","code","items","tryPassword","ref","checks","pw","list","test","i","passes","c","_createBlock","SectionLayout","_unref","_createElementVNode","_hoisted_13","_createElementBlock","_Fragment","_renderList","_normalizeClass","_hoisted_14","_createVNode","AppIcon","_hoisted_15","_toDisplayString","_hoisted_16","_hoisted_17","$event","_hoisted_1","_hoisted_2","CfgGroup","_openBlock","f","CfgRow","NInputNumber","_hoisted_3","NSwitch","CfgSegment","_createTextVNode","NTooltip","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import o from "./SensitiveSection2.vue.js";
2
2
  /* empty css */
3
3
  import t from "../../../../_virtual/_plugin-vue_export-helper.js";
4
- const c = /* @__PURE__ */ t(o, [["__scopeId", "data-v-d6672f0c"]]);
4
+ const a = /* @__PURE__ */ t(o, [["__scopeId", "data-v-fcae2919"]]);
5
5
  export {
6
- c as default
6
+ a as default
7
7
  };
8
8
  //# sourceMappingURL=SensitiveSection.vue.js.map
@@ -1,209 +1,214 @@
1
- import { defineComponent as I, ref as c, computed as K, onMounted as R, openBlock as p, createBlock as P, unref as e, withCtx as r, createElementVNode as a, toDisplayString as o, createVNode as v, createElementBlock as _, Fragment as T, renderList as U, withKeys as q, withModifiers as S, normalizeClass as B, createTextVNode as y, withDirectives as F, createCommentVNode as L } from "vue";
2
- import { useMessage as A, NSpin as H, NPopconfirm as O, NButton as V, NInput as $ } from "naive-ui";
3
- import { useI18n as j } from "vue-i18n";
4
- import G from "../../../../components/AppIcon.vue.js";
5
- import { highSensApi as x } from "../../../../api/index.js";
6
- import { translateError as N } from "../../../../utils/error.js";
7
- import { vFlash as J } from "../flash.js";
8
- import Q from "./SectionLayout.vue.js";
9
- const W = {
10
- class: "tbl",
11
- "data-testid": "sensitive-table"
12
- }, X = {
1
+ import { defineComponent as R, ref as c, computed as T, onMounted as U, openBlock as p, createBlock as V, unref as e, withCtx as r, createElementVNode as i, normalizeClass as x, toDisplayString as n, createVNode as v, createElementBlock as _, Fragment as q, renderList as F, withKeys as A, withModifiers as z, createTextVNode as y, withDirectives as H, createCommentVNode as O } from "vue";
2
+ import { useMessage as j, NSpin as G, NPopconfirm as J, NButton as $, NInput as D } from "naive-ui";
3
+ import { useI18n as Q } from "vue-i18n";
4
+ import W from "../../../../components/AppIcon.vue.js";
5
+ import { highSensApi as N } from "../../../../api/index.js";
6
+ import { translateError as M } from "../../../../utils/error.js";
7
+ import { vFlash as X } from "../flash.js";
8
+ import { useConfigLayout as Y } from "../layoutMode.js";
9
+ import Z from "./SectionLayout.vue.js";
10
+ const ee = {
13
11
  class: "th",
14
12
  "aria-hidden": "true"
15
- }, Y = ["aria-label"], Z = ["aria-selected", "onClick", "onKeydown"], ee = ["title"], te = { class: "remark" }, ie = {
13
+ }, te = { class: "rm" }, se = ["aria-label"], ie = ["aria-selected", "onClick", "onKeydown"], ae = { class: "pt" }, ne = ["title"], oe = { class: "narsub" }, le = { class: "remark rm" }, re = {
16
14
  key: 0,
17
15
  class: "badge"
18
- }, se = {
16
+ }, ce = {
19
17
  key: 0,
20
18
  class: "dlg",
21
19
  "aria-hidden": "true"
22
- }, ae = { class: "lock" }, ne = { class: "hint" }, oe = { class: "in" }, le = { class: "acts" }, re = { class: "p" }, _e = /* @__PURE__ */ I({
20
+ }, ue = { class: "lock" }, de = { class: "hint" }, pe = { class: "in" }, ve = { class: "acts" }, me = { class: "p" }, xe = /* @__PURE__ */ R({
23
21
  __name: "SensitiveSection",
24
- setup(ce) {
25
- const { t } = j(), u = A(), w = c(!1), d = c(!1), m = c([]), l = c(0), f = c(""), h = c(""), k = c(null);
26
- function z(n, i = {}) {
27
- const s = n.indexOf(":");
28
- return s > 0 ? { code: n, method: n.slice(0, s).toUpperCase(), path: n.slice(s + 1), ...i } : { code: n, method: "", path: n, ...i };
22
+ setup(fe) {
23
+ const { t } = Q(), u = j(), { ctl: k, nar: E, side: I } = Y(), w = c(!1), d = c(!1), m = c([]), l = c(0), f = c(""), h = c(""), b = c(null);
24
+ function P(o, s = {}) {
25
+ const a = o.indexOf(":");
26
+ return a > 0 ? { code: o, method: o.slice(0, a).toUpperCase(), path: o.slice(a + 1), ...s } : { code: o, method: "", path: o, ...s };
29
27
  }
30
- async function b() {
28
+ async function C() {
31
29
  w.value = !0;
32
30
  try {
33
- const n = await x.list();
31
+ const o = await N.list();
34
32
  m.value = [
35
- ...(n.defaults ?? []).map((i) => z(i)),
36
- ...(n.customs ?? []).flatMap(
37
- (i) => i.id == null ? [] : [z(i.permissionCode ?? "", { id: Number(i.id), remark: i.remark })]
33
+ ...(o.defaults ?? []).map((s) => P(s)),
34
+ ...(o.customs ?? []).flatMap(
35
+ (s) => s.id == null ? [] : [P(s.permissionCode ?? "", { id: Number(s.id), remark: s.remark })]
38
36
  )
39
37
  ], l.value = Math.min(l.value, Math.max(m.value.length - 1, 0));
40
- } catch (n) {
41
- u.error(N(n));
38
+ } catch (o) {
39
+ u.error(M(o));
42
40
  } finally {
43
41
  w.value = !1;
44
42
  }
45
43
  }
46
- async function D() {
47
- var i;
48
- const n = f.value.trim();
49
- if (!n) {
44
+ async function K() {
45
+ var s;
46
+ const o = f.value.trim();
47
+ if (!o) {
50
48
  u.warning(t("config.security.highSens.codeRequired"));
51
49
  return;
52
50
  }
53
51
  d.value = !0;
54
52
  try {
55
- await x.add({ permissionCode: n, remark: h.value.trim() || void 0 }), u.success(t("config.sensitive.added")), f.value = "", h.value = "", await b(), l.value = m.value.findIndex((s) => s.code === n), (i = k.value) == null || i.scrollTo({ top: k.value.scrollHeight });
56
- } catch (s) {
57
- u.error(N(s));
53
+ await N.add({ permissionCode: o, remark: h.value.trim() || void 0 }), u.success(t("config.sensitive.added")), f.value = "", h.value = "", await C(), l.value = m.value.findIndex((a) => a.code === o), (s = b.value) == null || s.scrollTo({ top: b.value.scrollHeight });
54
+ } catch (a) {
55
+ u.error(M(a));
58
56
  } finally {
59
57
  d.value = !1;
60
58
  }
61
59
  }
62
- async function E(n) {
60
+ async function L(o) {
63
61
  d.value = !0;
64
62
  try {
65
- await x.remove(n), u.success(t("config.sensitive.removed")), await b();
66
- } catch (i) {
67
- u.error(N(i));
63
+ await N.remove(o), u.success(t("config.sensitive.removed")), await C();
64
+ } catch (s) {
65
+ u.error(M(s));
68
66
  } finally {
69
67
  d.value = !1;
70
68
  }
71
69
  }
72
- const C = K(() => m.value[l.value]);
73
- return R(() => void b()), (n, i) => (p(), P(Q, {
70
+ const S = T(() => m.value[l.value]);
71
+ return U(() => void C()), (o, s) => (p(), V(Z, {
74
72
  title: e(t)("config.tab.sensitive"),
75
73
  desc: e(t)("config.sensitive.desc"),
76
- "preview-title": e(t)("config.sensitive.preview")
74
+ "preview-title": e(t)("config.sensitive.preview"),
75
+ "fixed-form": ""
77
76
  }, {
78
77
  "preview-extra": r(() => [
79
- a("span", null, o(e(t)("config.sensitive.previewTip")), 1)
78
+ i("span", null, n(e(t)("config.sensitive.previewTip")), 1)
80
79
  ]),
81
80
  preview: r(() => [
82
- C.value ? F((p(), _("div", se, [
83
- a("div", ae, [
84
- v(G, {
81
+ S.value ? H((p(), _("div", ce, [
82
+ i("div", ue, [
83
+ v(W, {
85
84
  icon: "ph:lock-key",
86
85
  size: 24
87
86
  })
88
87
  ]),
89
- a("b", null, o(e(t)("reauth.title")), 1),
90
- a("p", null, [
91
- y(o(e(t)("config.sensitive.previewDoing")) + " ", 1),
92
- a("code", null, o(C.value.code), 1)
88
+ i("b", null, n(e(t)("reauth.title")), 1),
89
+ i("p", null, [
90
+ y(n(e(t)("config.sensitive.previewDoing")) + " ", 1),
91
+ i("code", null, n(S.value.code), 1)
93
92
  ]),
94
- a("p", ne, o(e(t)("reauth.hint")), 1),
95
- a("i", oe, o(e(t)("reauth.passwordPlaceholder")), 1),
96
- a("div", le, [
97
- a("span", null, o(e(t)("common.cancel")), 1),
98
- a("span", re, o(e(t)("reauth.confirm")), 1)
93
+ i("p", de, n(e(t)("reauth.hint")), 1),
94
+ i("i", pe, n(e(t)("reauth.passwordPlaceholder")), 1),
95
+ i("div", ve, [
96
+ i("span", null, n(e(t)("common.cancel")), 1),
97
+ i("span", me, n(e(t)("reauth.confirm")), 1)
99
98
  ])
100
99
  ])), [
101
- [e(J), C.value.code]
102
- ]) : L("", !0)
100
+ [e(X), S.value.code]
101
+ ]) : O("", !0)
103
102
  ]),
104
103
  default: r(() => [
105
- a("div", W, [
106
- a("div", X, [
107
- a("span", null, o(e(t)("config.sensitive.method")), 1),
108
- a("span", null, o(e(t)("config.sensitive.path")), 1),
109
- a("span", null, o(e(t)("config.security.highSens.remark")), 1),
110
- i[3] || (i[3] = a("span", null, null, -1))
104
+ i("div", {
105
+ class: x(["tbl", { nar: e(E), side: e(I) }]),
106
+ "data-testid": "sensitive-table"
107
+ }, [
108
+ i("div", ee, [
109
+ i("span", null, n(e(t)("config.sensitive.method")), 1),
110
+ i("span", null, n(e(t)("config.sensitive.path")), 1),
111
+ i("span", te, n(e(t)("config.security.highSens.remark")), 1),
112
+ s[3] || (s[3] = i("span", null, null, -1))
111
113
  ]),
112
- v(e(H), {
114
+ v(e(G), {
113
115
  show: w.value,
114
116
  class: "spin"
115
117
  }, {
116
118
  default: r(() => [
117
- a("ul", {
119
+ i("ul", {
118
120
  ref_key: "list",
119
- ref: k,
121
+ ref: b,
120
122
  class: "tb",
121
123
  role: "listbox",
122
124
  "aria-label": e(t)("config.tab.sensitive")
123
125
  }, [
124
- (p(!0), _(T, null, U(m.value, (s, g) => (p(), _("li", {
125
- key: s.code,
126
+ (p(!0), _(q, null, F(m.value, (a, g) => (p(), _("li", {
127
+ key: a.code,
126
128
  role: "option",
127
129
  "aria-selected": g === l.value,
128
- class: B(["tr", { sel: g === l.value }]),
130
+ class: x(["tr", { sel: g === l.value }]),
129
131
  tabindex: "0",
130
- onClick: (M) => l.value = g,
131
- onKeydown: q(S((M) => l.value = g, ["prevent"]), ["enter", "space"])
132
+ onClick: (B) => l.value = g,
133
+ onKeydown: A(z((B) => l.value = g, ["prevent"]), ["enter", "space"])
132
134
  }, [
133
- a("span", {
134
- class: B(["m", s.method])
135
- }, o(s.method || "—"), 3),
136
- a("code", {
137
- title: s.path
138
- }, o(s.path), 9, ee),
139
- a("span", te, o(s.remark || "—"), 1),
140
- s.id == null ? (p(), _("span", ie, o(e(t)("config.sensitive.builtin")), 1)) : (p(), P(e(O), {
135
+ i("span", {
136
+ class: x(["m", a.method])
137
+ }, n(a.method || "—"), 3),
138
+ i("span", ae, [
139
+ i("code", {
140
+ title: a.path
141
+ }, n(a.path), 9, ne),
142
+ i("small", oe, n(a.remark || ""), 1)
143
+ ]),
144
+ i("span", le, n(a.remark || "—"), 1),
145
+ a.id == null ? (p(), _("span", re, n(e(t)("config.sensitive.builtin")), 1)) : (p(), V(e(J), {
141
146
  key: 1,
142
- onPositiveClick: (M) => E(s.id)
147
+ onPositiveClick: (B) => L(a.id)
143
148
  }, {
144
149
  trigger: r(() => [
145
- v(e(V), {
150
+ v(e($), {
146
151
  size: "tiny",
147
152
  quaternary: "",
148
153
  type: "error",
149
154
  disabled: d.value,
150
- onClick: i[0] || (i[0] = S(() => {
155
+ onClick: s[0] || (s[0] = z(() => {
151
156
  }, ["stop"]))
152
157
  }, {
153
158
  default: r(() => [
154
- y(o(e(t)("common.delete")), 1)
159
+ y(n(e(t)("common.delete")), 1)
155
160
  ]),
156
161
  _: 1
157
162
  }, 8, ["disabled"])
158
163
  ]),
159
164
  default: r(() => [
160
- y(" " + o(e(t)("config.sensitive.removeConfirm", { code: s.code })), 1)
165
+ y(" " + n(e(t)("config.sensitive.removeConfirm", { code: a.code })), 1)
161
166
  ]),
162
167
  _: 2
163
168
  }, 1032, ["onPositiveClick"]))
164
- ], 42, Z))), 128))
165
- ], 8, Y)
169
+ ], 42, ie))), 128))
170
+ ], 8, se)
166
171
  ]),
167
172
  _: 1
168
173
  }, 8, ["show"]),
169
- a("form", {
174
+ i("form", {
170
175
  class: "add",
171
- onSubmit: S(D, ["prevent"])
176
+ onSubmit: z(K, ["prevent"])
172
177
  }, [
173
- v(e($), {
178
+ v(e(D), {
174
179
  value: f.value,
175
- "onUpdate:value": i[1] || (i[1] = (s) => f.value = s),
176
- size: "small",
180
+ "onUpdate:value": s[1] || (s[1] = (a) => f.value = a),
181
+ size: e(k),
177
182
  placeholder: e(t)("config.security.highSens.codePh"),
178
183
  "input-props": { "aria-label": e(t)("config.security.highSens.code") }
179
- }, null, 8, ["value", "placeholder", "input-props"]),
180
- v(e($), {
184
+ }, null, 8, ["value", "size", "placeholder", "input-props"]),
185
+ v(e(D), {
181
186
  value: h.value,
182
- "onUpdate:value": i[2] || (i[2] = (s) => h.value = s),
183
- size: "small",
184
- class: "rm",
187
+ "onUpdate:value": s[2] || (s[2] = (a) => h.value = a),
188
+ size: e(k),
189
+ class: "rmi",
185
190
  placeholder: e(t)("config.security.highSens.remarkPh"),
186
191
  "input-props": { "aria-label": e(t)("config.security.highSens.remark") }
187
- }, null, 8, ["value", "placeholder", "input-props"]),
188
- v(e(V), {
192
+ }, null, 8, ["value", "size", "placeholder", "input-props"]),
193
+ v(e($), {
189
194
  type: "primary",
190
- size: "small",
195
+ size: e(k),
191
196
  "attr-type": "submit",
192
197
  loading: d.value
193
198
  }, {
194
199
  default: r(() => [
195
- y(o(e(t)("common.add")), 1)
200
+ y(n(e(t)("common.add")), 1)
196
201
  ]),
197
202
  _: 1
198
- }, 8, ["loading"])
203
+ }, 8, ["size", "loading"])
199
204
  ], 32)
200
- ])
205
+ ], 2)
201
206
  ]),
202
207
  _: 1
203
208
  }, 8, ["title", "desc", "preview-title"]));
204
209
  }
205
210
  });
206
211
  export {
207
- _e as default
212
+ xe as default
208
213
  };
209
214
  //# sourceMappingURL=SensitiveSection2.vue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SensitiveSection2.vue.js","sources":["../../../../../src/views/system/config/components/SensitiveSection.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 敏感操作:执行这些接口前要求用户再次验证身份(高敏感权限)。内核内置的只读列出,不能删;\n// 消费者可以追加自己的业务接口。增删直接调 highSensApi 即时生效,不走底部保存条\n// (写路径本身要求近期再认证,由后端强制)。\n// 预览是用户执行选中那一行时弹出的验证框,文案与 ReauthModal 一致。\nimport { computed, onMounted, ref } from 'vue'\nimport { NButton, NInput, NPopconfirm, NSpin, useMessage } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport AppIcon from '#/components/AppIcon.vue'\nimport { highSensApi } from '#/api'\nimport { translateError } from '#/utils/error'\nimport { vFlash } from '../flash'\nimport SectionLayout from './SectionLayout.vue'\n\ninterface Row {\n code: string\n method: string\n path: string\n remark?: string | null\n /** 自定义项才有 id,可删除 */\n id?: number\n}\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst loading = ref(false)\nconst saving = ref(false)\nconst rows = ref<Row[]>([])\nconst selected = ref(0)\nconst newCode = ref('')\nconst newRemark = ref('')\nconst list = ref<HTMLElement | null>(null)\n\n/** 权限码是规范化路由 {METHOD}:/{route},拆成方法与路径分开显示 */\nfunction toRow(code: string, extra: Partial<Row> = {}): Row {\n const i = code.indexOf(':')\n return i > 0\n ? { code, method: code.slice(0, i).toUpperCase(), path: code.slice(i + 1), ...extra }\n : { code, method: '', path: code, ...extra }\n}\n\nasync function load() {\n loading.value = true\n try {\n const data = await highSensApi.list()\n rows.value = [\n ...(data.defaults ?? []).map(code => toRow(code)),\n ...(data.customs ?? []).flatMap(item =>\n item.id == null\n ? []\n : [toRow(item.permissionCode ?? '', { id: Number(item.id), remark: item.remark })],\n ),\n ]\n selected.value = Math.min(selected.value, Math.max(rows.value.length - 1, 0))\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n}\n\nasync function add() {\n const code = newCode.value.trim()\n if (!code) {\n message.warning(t('config.security.highSens.codeRequired'))\n return\n }\n saving.value = true\n try {\n await highSensApi.add({ permissionCode: code, remark: newRemark.value.trim() || undefined })\n message.success(t('config.sensitive.added'))\n newCode.value = ''\n newRemark.value = ''\n await load()\n selected.value = rows.value.findIndex(r => r.code === code)\n list.value?.scrollTo({ top: list.value.scrollHeight })\n } catch (e) {\n message.error(translateError(e))\n } finally {\n saving.value = false\n }\n}\n\nasync function remove(id: number) {\n saving.value = true\n try {\n await highSensApi.remove(id)\n message.success(t('config.sensitive.removed'))\n await load()\n } catch (e) {\n message.error(translateError(e))\n } finally {\n saving.value = false\n }\n}\n\nconst current = computed(() => rows.value[selected.value])\n\nonMounted(() => void load())\n</script>\n\n<template>\n <SectionLayout\n :title=\"t('config.tab.sensitive')\"\n :desc=\"t('config.sensitive.desc')\"\n :preview-title=\"t('config.sensitive.preview')\"\n >\n <div class=\"tbl\" data-testid=\"sensitive-table\">\n <div class=\"th\" aria-hidden=\"true\">\n <span>{{ t('config.sensitive.method') }}</span>\n <span>{{ t('config.sensitive.path') }}</span>\n <span>{{ t('config.security.highSens.remark') }}</span>\n <span />\n </div>\n <n-spin :show=\"loading\" class=\"spin\">\n <ul ref=\"list\" class=\"tb\" role=\"listbox\" :aria-label=\"t('config.tab.sensitive')\">\n <li\n v-for=\"(r, i) in rows\"\n :key=\"r.code\"\n role=\"option\"\n :aria-selected=\"i === selected\"\n :class=\"['tr', { sel: i === selected }]\"\n tabindex=\"0\"\n @click=\"selected = i\"\n @keydown.enter.space.prevent=\"selected = i\"\n >\n <span :class=\"['m', r.method]\">{{ r.method || '—' }}</span>\n <code :title=\"r.path\">{{ r.path }}</code>\n <span class=\"remark\">{{ r.remark || '—' }}</span>\n <span v-if=\"r.id == null\" class=\"badge\">{{ t('config.sensitive.builtin') }}</span>\n <n-popconfirm v-else @positive-click=\"remove(r.id)\">\n <template #trigger>\n <n-button size=\"tiny\" quaternary type=\"error\" :disabled=\"saving\" @click.stop>\n {{ t('common.delete') }}\n </n-button>\n </template>\n {{ t('config.sensitive.removeConfirm', { code: r.code }) }}\n </n-popconfirm>\n </li>\n </ul>\n </n-spin>\n <form class=\"add\" @submit.prevent=\"add\">\n <n-input\n v-model:value=\"newCode\"\n size=\"small\"\n :placeholder=\"t('config.security.highSens.codePh')\"\n :input-props=\"{ 'aria-label': t('config.security.highSens.code') }\"\n />\n <n-input\n v-model:value=\"newRemark\"\n size=\"small\"\n class=\"rm\"\n :placeholder=\"t('config.security.highSens.remarkPh')\"\n :input-props=\"{ 'aria-label': t('config.security.highSens.remark') }\"\n />\n <n-button type=\"primary\" size=\"small\" attr-type=\"submit\" :loading=\"saving\">\n {{ t('common.add') }}\n </n-button>\n </form>\n </div>\n\n <template #preview-extra>\n <span>{{ t('config.sensitive.previewTip') }}</span>\n </template>\n <template #preview>\n <div v-if=\"current\" v-flash=\"current.code\" class=\"dlg\" aria-hidden=\"true\">\n <div class=\"lock\"><AppIcon icon=\"ph:lock-key\" :size=\"24\" /></div>\n <b>{{ t('reauth.title') }}</b>\n <p>\n {{ t('config.sensitive.previewDoing') }}\n <code>{{ current.code }}</code>\n </p>\n <p class=\"hint\">{{ t('reauth.hint') }}</p>\n <i class=\"in\">{{ t('reauth.passwordPlaceholder') }}</i>\n <div class=\"acts\">\n <span>{{ t('common.cancel') }}</span>\n <span class=\"p\">{{ t('reauth.confirm') }}</span>\n </div>\n </div>\n </template>\n </SectionLayout>\n</template>\n\n<style scoped>\n.tbl {\n display: flex;\n flex: 1;\n flex-direction: column;\n min-height: 0;\n overflow: hidden;\n border-radius: 12px;\n background: var(--color-bg-container);\n border: 1px solid var(--color-border);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);\n}\n.th,\n.tr {\n display: grid;\n grid-template-columns: 70px minmax(0, 1fr) 120px 64px;\n gap: 10px;\n align-items: center;\n min-height: 38px;\n padding: 0 14px;\n}\n.th {\n flex: none;\n font-size: var(--font-size-sm);\n color: var(--color-text-secondary);\n border-bottom: 0.5px solid var(--color-border);\n}\n.spin {\n flex: 1;\n min-height: 0;\n}\n.spin :deep(.n-spin-content) {\n height: 100%;\n}\n.tb {\n height: 100%;\n margin: 0;\n padding: 0;\n overflow: auto;\n list-style: none;\n}\n.tr {\n border-bottom: 0.5px solid var(--color-border);\n font-size: var(--font-size-base);\n cursor: pointer;\n}\n.tr:hover {\n background: var(--color-fill-hover);\n}\n.tr.sel {\n background: color-mix(in srgb, var(--color-primary) 12%, transparent);\n}\n.tr:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: -2px;\n}\ncode {\n overflow: hidden;\n font:\n var(--font-size-sm) ui-monospace,\n SFMono-Regular,\n Menlo,\n Consolas,\n monospace;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.remark {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n color: var(--color-text-secondary);\n}\n.m {\n justify-self: start;\n padding: 1px 6px;\n border-radius: 5px;\n font:\n 600 11px ui-monospace,\n SFMono-Regular,\n Menlo,\n Consolas,\n monospace;\n background: var(--color-fill);\n color: var(--color-text-secondary);\n}\n.m.POST {\n background: var(--color-success-bg);\n color: var(--color-success);\n}\n.m.PUT {\n background: var(--color-warning-bg);\n color: var(--color-warning);\n}\n.m.DELETE {\n background: var(--color-danger-bg);\n color: var(--color-danger);\n}\n.badge {\n justify-self: start;\n padding: 1px 6px;\n border-radius: 5px;\n font-size: var(--font-size-xs);\n background: var(--color-fill);\n color: var(--color-text-secondary);\n}\n.add {\n display: flex;\n flex: none;\n gap: 8px;\n padding: 8px 10px;\n border-top: 0.5px solid var(--color-border);\n}\n.add .rm {\n flex: 0 0 150px;\n}\n/* 预览:ReauthModal 的样子 */\n.dlg {\n width: min(380px, 100%);\n margin: 0 auto;\n padding: 22px 22px 18px;\n border-radius: 14px;\n background: var(--color-bg-container);\n box-shadow: 0 12px 40px rgba(0, 0, 0, 0.14);\n text-align: center;\n font-size: var(--font-size-base);\n}\n.lock {\n display: grid;\n place-items: center;\n width: 44px;\n height: 44px;\n margin: 0 auto 10px;\n border-radius: 12px;\n color: var(--color-primary);\n background: color-mix(in srgb, var(--color-primary) 12%, transparent);\n}\n.dlg b {\n font-size: 16px;\n}\n.dlg p {\n margin: 6px 0 0;\n color: var(--color-text-secondary);\n}\n.dlg p code {\n display: block;\n margin-top: 4px;\n white-space: normal;\n word-break: break-all;\n color: var(--color-text-primary);\n}\n.dlg .hint {\n font-size: var(--font-size-sm);\n color: var(--color-text-tertiary);\n}\n.in {\n display: block;\n height: 34px;\n margin: 14px 0 12px;\n padding: 0 10px;\n border-radius: 8px;\n background: var(--color-fill);\n font-style: normal;\n line-height: 34px;\n text-align: left;\n color: var(--color-text-tertiary);\n}\n.acts {\n display: flex;\n gap: 8px;\n}\n.acts span {\n flex: 1;\n height: 32px;\n border-radius: 8px;\n line-height: 32px;\n background: var(--color-fill);\n}\n.acts .p {\n color: #fff;\n background: var(--color-primary);\n}\n</style>\n"],"names":["useI18n","message","useMessage","loading","ref","saving","rows","selected","newCode","newRemark","list","toRow","code","extra","i","load","data","highSensApi","item","e","translateError","add","r","_a","remove","id","current","computed","onMounted","_createBlock","SectionLayout","_unref","_createElementVNode","_withDirectives","_openBlock","_createElementBlock","_hoisted_8","_hoisted_9","_createVNode","AppIcon","_createTextVNode","_toDisplayString","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","vFlash","_hoisted_1","_hoisted_2","NSpin","_Fragment","_renderList","_normalizeClass","$event","_withKeys","_withModifiers","_hoisted_5","_hoisted_6","_hoisted_7","NPopconfirm","NButton","NInput"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAuBA,UAAM,EAAE,EAAA,IAAMA,EAAA,GACRC,IAAUC,EAAA,GACVC,IAAUC,EAAI,EAAK,GACnBC,IAASD,EAAI,EAAK,GAClBE,IAAOF,EAAW,EAAE,GACpBG,IAAWH,EAAI,CAAC,GAChBI,IAAUJ,EAAI,EAAE,GAChBK,IAAYL,EAAI,EAAE,GAClBM,IAAON,EAAwB,IAAI;AAGzC,aAASO,EAAMC,GAAcC,IAAsB,IAAS;AAC1D,YAAMC,IAAIF,EAAK,QAAQ,GAAG;AAC1B,aAAOE,IAAI,IACP,EAAE,MAAAF,GAAM,QAAQA,EAAK,MAAM,GAAGE,CAAC,EAAE,YAAA,GAAe,MAAMF,EAAK,MAAME,IAAI,CAAC,GAAG,GAAGD,EAAA,IAC5E,EAAE,MAAAD,GAAM,QAAQ,IAAI,MAAMA,GAAM,GAAGC,EAAA;AAAA,IACzC;AAEA,mBAAeE,IAAO;AACpB,MAAAZ,EAAQ,QAAQ;AAChB,UAAI;AACF,cAAMa,IAAO,MAAMC,EAAY,KAAA;AAC/B,QAAAX,EAAK,QAAQ;AAAA,UACX,IAAIU,EAAK,YAAY,CAAA,GAAI,IAAI,CAAAJ,MAAQD,EAAMC,CAAI,CAAC;AAAA,UAChD,IAAII,EAAK,WAAW,CAAA,GAAI;AAAA,YAAQ,CAAAE,MAC9BA,EAAK,MAAM,OACP,CAAA,IACA,CAACP,EAAMO,EAAK,kBAAkB,IAAI,EAAE,IAAI,OAAOA,EAAK,EAAE,GAAG,QAAQA,EAAK,QAAQ,CAAC;AAAA,UAAA;AAAA,QACrF,GAEFX,EAAS,QAAQ,KAAK,IAAIA,EAAS,OAAO,KAAK,IAAID,EAAK,MAAM,SAAS,GAAG,CAAC,CAAC;AAAA,MAC9E,SAASa,GAAG;AACV,QAAAlB,EAAQ,MAAMmB,EAAeD,CAAC,CAAC;AAAA,MACjC,UAAA;AACE,QAAAhB,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AAEA,mBAAekB,IAAM;;AACnB,YAAMT,IAAOJ,EAAQ,MAAM,KAAA;AAC3B,UAAI,CAACI,GAAM;AACT,QAAAX,EAAQ,QAAQ,EAAE,uCAAuC,CAAC;AAC1D;AAAA,MACF;AACA,MAAAI,EAAO,QAAQ;AACf,UAAI;AACF,cAAMY,EAAY,IAAI,EAAE,gBAAgBL,GAAM,QAAQH,EAAU,MAAM,UAAU,OAAA,CAAW,GAC3FR,EAAQ,QAAQ,EAAE,wBAAwB,CAAC,GAC3CO,EAAQ,QAAQ,IAChBC,EAAU,QAAQ,IAClB,MAAMM,EAAA,GACNR,EAAS,QAAQD,EAAK,MAAM,UAAU,CAAAgB,MAAKA,EAAE,SAASV,CAAI,IAC1DW,IAAAb,EAAK,UAAL,QAAAa,EAAY,SAAS,EAAE,KAAKb,EAAK,MAAM;MACzC,SAASS,GAAG;AACV,QAAAlB,EAAQ,MAAMmB,EAAeD,CAAC,CAAC;AAAA,MACjC,UAAA;AACE,QAAAd,EAAO,QAAQ;AAAA,MACjB;AAAA,IACF;AAEA,mBAAemB,EAAOC,GAAY;AAChC,MAAApB,EAAO,QAAQ;AACf,UAAI;AACF,cAAMY,EAAY,OAAOQ,CAAE,GAC3BxB,EAAQ,QAAQ,EAAE,0BAA0B,CAAC,GAC7C,MAAMc,EAAA;AAAA,MACR,SAASI,GAAG;AACV,QAAAlB,EAAQ,MAAMmB,EAAeD,CAAC,CAAC;AAAA,MACjC,UAAA;AACE,QAAAd,EAAO,QAAQ;AAAA,MACjB;AAAA,IACF;AAEA,UAAMqB,IAAUC,EAAS,MAAMrB,EAAK,MAAMC,EAAS,KAAK,CAAC;AAEzD,WAAAqB,EAAU,MAAM,KAAKb,GAAM,mBAIzBc,EA8EgBC,GAAA;AAAA,MA7Eb,OAAOC,EAAA,CAAA,EAAC,sBAAA;AAAA,MACR,MAAMA,EAAA,CAAA,EAAC,uBAAA;AAAA,MACP,iBAAeA,EAAA,CAAA,EAAC,0BAAA;AAAA,IAAA;MAwDN,mBACT,MAAmD;AAAA,QAAnDC,EAAmD,gBAA1CD,EAAA,CAAA,EAAC,6BAAA,CAAA,GAAA,CAAA;AAAA,MAAA;MAED,WACT,MAaM;AAAA,QAbKL,EAAA,QAAXO,GAAAC,KAAAC,EAaM,OAbNC,IAaM;AAAA,UAZJJ,EAAiE,OAAjEK,IAAiE;AAAA,YAA/CC,EAAyCC,GAAA;AAAA,cAAhC,MAAK;AAAA,cAAe,MAAM;AAAA,YAAA;;UACrDP,EAA8B,aAAxBD,EAAA,CAAA,EAAC,cAAA,CAAA,GAAA,CAAA;AAAA,UACPC,EAGI,KAAA,MAAA;AAAA,YAFCQ,EAAAC,EAAAV,EAAA,CAAA,sCAAqC,KACxC,CAAA;AAAA,YAAAC,EAA+B,QAAA,MAAAS,EAAtBf,EAAA,MAAQ,IAAI,GAAA,CAAA;AAAA,UAAA;UAEvBM,EAA0C,KAA1CU,IAA0CD,EAAvBV,EAAA,CAAA,EAAC,aAAA,CAAA,GAAA,CAAA;AAAA,UACpBC,EAAuD,KAAvDW,IAAuDF,EAAtCV,EAAA,CAAA,EAAC,4BAAA,CAAA,GAAA,CAAA;AAAA,UAClBC,EAGM,OAHNY,IAGM;AAAA,YAFJZ,EAAqC,gBAA5BD,EAAA,CAAA,EAAC,eAAA,CAAA,GAAA,CAAA;AAAA,YACVC,EAAgD,QAAhDa,IAAgDJ,EAA7BV,EAAA,CAAA,EAAC,gBAAA,CAAA,GAAA,CAAA;AAAA,UAAA;;UAXK,CAAAA,EAAAe,CAAA,GAAApB,EAAA,MAAQ,IAAI;AAAA,QAAA;;iBA1D3C,MAoDM;AAAA,QApDNM,EAoDM,OApDNe,GAoDM;AAAA,UAnDJf,EAKM,OALNgB,GAKM;AAAA,YAJJhB,EAA+C,gBAAtCD,EAAA,CAAA,EAAC,yBAAA,CAAA,GAAA,CAAA;AAAA,YACVC,EAA6C,gBAApCD,EAAA,CAAA,EAAC,uBAAA,CAAA,GAAA,CAAA;AAAA,YACVC,EAAuD,gBAA9CD,EAAA,CAAA,EAAC,iCAAA,CAAA,GAAA,CAAA;AAAA,4BACVC,EAAQ,QAAA,MAAA,MAAA,EAAA;AAAA,UAAA;UAEVM,EA0BSP,EAAAkB,CAAA,GAAA;AAAA,YA1BA,MAAM9C,EAAA;AAAA,YAAS,OAAM;AAAA,UAAA;uBAC5B,MAwBK;AAAA,cAxBL6B,EAwBK,MAAA;AAAA,yBAxBG;AAAA,gBAAJ,KAAItB;AAAA,gBAAO,OAAM;AAAA,gBAAK,MAAK;AAAA,gBAAW,cAAYqB,EAAA,CAAA,EAAC,sBAAA;AAAA,cAAA;iBACrDG,EAAA,EAAA,GAAAC,EAsBKe,GAAA,MAAAC,EArBc7C,EAAA,OAAI,CAAbgB,GAAGR,YADbqB,EAsBK,MAAA;AAAA,kBApBF,KAAKb,EAAE;AAAA,kBACR,MAAK;AAAA,kBACJ,iBAAeR,MAAMP,EAAA;AAAA,kBACrB,OAAK6C,EAAA,CAAA,MAAA,EAAA,KAAgBtC,MAAMP,EAAA,MAAA,CAAQ,CAAA;AAAA,kBACpC,UAAS;AAAA,kBACR,SAAK,CAAA8C,MAAE9C,EAAA,QAAWO;AAAA,kBAClB,WAAOwC,EAAAC,EAAA,CAAAF,MAAsB9C,EAAA,QAAWO,GAAC,CAAA,SAAA,CAAA,GAAA,CAAA,SAAA,OAAA,CAAA;AAAA,gBAAA;kBAE1CkB,EAA2D,QAAA;AAAA,oBAApD,OAAKoB,EAAA,CAAA,KAAQ9B,EAAE,MAAM,CAAA;AAAA,kBAAA,GAAMmB,EAAAnB,EAAE,UAAM,GAAA,GAAA,CAAA;AAAA,kBAC1CU,EAAyC,QAAA;AAAA,oBAAlC,OAAOV,EAAE;AAAA,kBAAA,GAASmB,EAAAnB,EAAE,IAAI,GAAA,GAAAkC,EAAA;AAAA,kBAC/BxB,EAAiD,QAAjDyB,IAAiDhB,EAAzBnB,EAAE,UAAM,GAAA,GAAA,CAAA;AAAA,kBACpBA,EAAE,MAAE,aAAhBa,EAAkF,QAAlFuB,IAAkFjB,EAAvCV,EAAA,CAAA,EAAC,0BAAA,CAAA,GAAA,CAAA,WAC5CF,EAOeE,EAAA4B,CAAA,GAAA;AAAA;oBAPO,iBAAc,CAAAN,MAAE7B,EAAOF,EAAE,EAAE;AAAA,kBAAA;oBACpC,WACT,MAEW;AAAA,sBAFXgB,EAEWP,EAAA6B,CAAA,GAAA;AAAA,wBAFD,MAAK;AAAA,wBAAO,YAAA;AAAA,wBAAW,MAAK;AAAA,wBAAS,UAAUvD,EAAA;AAAA,wBAAS,2BAAD,MAAA;AAAA,wBAAA,GAAW,CAAA,MAAA,CAAA;AAAA,sBAAA;mCAC1E,MAAwB;AAAA,8BAArB0B,EAAA,CAAA,EAAC,eAAA,CAAA,GAAA,CAAA;AAAA,wBAAA;;;;+BAEG,MACX;AAAA,sBADWS,EAAA,MACXC,EAAGV,EAAA,CAAA,EAAC,kCAAA,EAAA,MAA2CT,EAAE,KAAA,CAAI,CAAA,GAAA,CAAA;AAAA,oBAAA;;;;;;;;UAK7DU,EAiBO,QAAA;AAAA,YAjBD,OAAM;AAAA,YAAO,YAAgBX,GAAG,CAAA,SAAA,CAAA;AAAA,UAAA;YACpCiB,EAKEP,EAAA8B,CAAA,GAAA;AAAA,cAJQ,OAAOrD,EAAA;AAAA,uDAAAA,EAAO,QAAA6C;AAAA,cACtB,MAAK;AAAA,cACJ,aAAatB,EAAA,CAAA,EAAC,iCAAA;AAAA,cACd,+BAA6BA,EAAA,CAAA,EAAC,+BAAA,EAAA;AAAA,YAAA;YAEjCO,EAMEP,EAAA8B,CAAA,GAAA;AAAA,cALQ,OAAOpD,EAAA;AAAA,uDAAAA,EAAS,QAAA4C;AAAA,cACxB,MAAK;AAAA,cACL,OAAM;AAAA,cACL,aAAatB,EAAA,CAAA,EAAC,mCAAA;AAAA,cACd,+BAA6BA,EAAA,CAAA,EAAC,iCAAA,EAAA;AAAA,YAAA;YAEjCO,EAEWP,EAAA6B,CAAA,GAAA;AAAA,cAFD,MAAK;AAAA,cAAU,MAAK;AAAA,cAAQ,aAAU;AAAA,cAAU,SAASvD,EAAA;AAAA,YAAA;yBACjE,MAAqB;AAAA,oBAAlB0B,EAAA,CAAA,EAAC,YAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;;;;;;;;"}
1
+ {"version":3,"file":"SensitiveSection2.vue.js","sources":["../../../../../src/views/system/config/components/SensitiveSection.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 敏感操作:执行这些接口前要求用户再次验证身份(高敏感权限)。内核内置的只读列出,不能删;\n// 消费者可以追加自己的业务接口。增删直接调 highSensApi 即时生效,不走底部保存条\n// (写路径本身要求近期再认证,由后端强制)。\n// 预览是用户执行选中那一行时弹出的验证框,文案与 ReauthModal 一致。\nimport { computed, onMounted, ref } from 'vue'\nimport { NButton, NInput, NPopconfirm, NSpin, useMessage } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport AppIcon from '#/components/AppIcon.vue'\nimport { highSensApi } from '#/api'\nimport { translateError } from '#/utils/error'\nimport { vFlash } from '../flash'\nimport { useConfigLayout } from '../layoutMode'\nimport SectionLayout from './SectionLayout.vue'\n\ninterface Row {\n code: string\n method: string\n path: string\n remark?: string | null\n /** 自定义项才有 id,可删除 */\n id?: number\n}\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { ctl, nar, side } = useConfigLayout()\nconst loading = ref(false)\nconst saving = ref(false)\nconst rows = ref<Row[]>([])\nconst selected = ref(0)\nconst newCode = ref('')\nconst newRemark = ref('')\nconst list = ref<HTMLElement | null>(null)\n\n/** 权限码是规范化路由 {METHOD}:/{route},拆成方法与路径分开显示 */\nfunction toRow(code: string, extra: Partial<Row> = {}): Row {\n const i = code.indexOf(':')\n return i > 0\n ? { code, method: code.slice(0, i).toUpperCase(), path: code.slice(i + 1), ...extra }\n : { code, method: '', path: code, ...extra }\n}\n\nasync function load() {\n loading.value = true\n try {\n const data = await highSensApi.list()\n rows.value = [\n ...(data.defaults ?? []).map(code => toRow(code)),\n ...(data.customs ?? []).flatMap(item =>\n item.id == null\n ? []\n : [toRow(item.permissionCode ?? '', { id: Number(item.id), remark: item.remark })],\n ),\n ]\n selected.value = Math.min(selected.value, Math.max(rows.value.length - 1, 0))\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n}\n\nasync function add() {\n const code = newCode.value.trim()\n if (!code) {\n message.warning(t('config.security.highSens.codeRequired'))\n return\n }\n saving.value = true\n try {\n await highSensApi.add({ permissionCode: code, remark: newRemark.value.trim() || undefined })\n message.success(t('config.sensitive.added'))\n newCode.value = ''\n newRemark.value = ''\n await load()\n selected.value = rows.value.findIndex(r => r.code === code)\n list.value?.scrollTo({ top: list.value.scrollHeight })\n } catch (e) {\n message.error(translateError(e))\n } finally {\n saving.value = false\n }\n}\n\nasync function remove(id: number) {\n saving.value = true\n try {\n await highSensApi.remove(id)\n message.success(t('config.sensitive.removed'))\n await load()\n } catch (e) {\n message.error(translateError(e))\n } finally {\n saving.value = false\n }\n}\n\nconst current = computed(() => rows.value[selected.value])\n\nonMounted(() => void load())\n</script>\n\n<template>\n <SectionLayout\n :title=\"t('config.tab.sensitive')\"\n :desc=\"t('config.sensitive.desc')\"\n :preview-title=\"t('config.sensitive.preview')\"\n fixed-form\n >\n <div :class=\"['tbl', { nar, side }]\" data-testid=\"sensitive-table\">\n <div class=\"th\" aria-hidden=\"true\">\n <span>{{ t('config.sensitive.method') }}</span>\n <span>{{ t('config.sensitive.path') }}</span>\n <span class=\"rm\">{{ t('config.security.highSens.remark') }}</span>\n <span />\n </div>\n <n-spin :show=\"loading\" class=\"spin\">\n <ul ref=\"list\" class=\"tb\" role=\"listbox\" :aria-label=\"t('config.tab.sensitive')\">\n <li\n v-for=\"(r, i) in rows\"\n :key=\"r.code\"\n role=\"option\"\n :aria-selected=\"i === selected\"\n :class=\"['tr', { sel: i === selected }]\"\n tabindex=\"0\"\n @click=\"selected = i\"\n @keydown.enter.space.prevent=\"selected = i\"\n >\n <span :class=\"['m', r.method]\">{{ r.method || '—' }}</span>\n <span class=\"pt\">\n <code :title=\"r.path\">{{ r.path }}</code>\n <small class=\"narsub\">{{ r.remark || '' }}</small>\n </span>\n <span class=\"remark rm\">{{ r.remark || '—' }}</span>\n <span v-if=\"r.id == null\" class=\"badge\">{{ t('config.sensitive.builtin') }}</span>\n <n-popconfirm v-else @positive-click=\"remove(r.id)\">\n <template #trigger>\n <n-button size=\"tiny\" quaternary type=\"error\" :disabled=\"saving\" @click.stop>\n {{ t('common.delete') }}\n </n-button>\n </template>\n {{ t('config.sensitive.removeConfirm', { code: r.code }) }}\n </n-popconfirm>\n </li>\n </ul>\n </n-spin>\n <form class=\"add\" @submit.prevent=\"add\">\n <n-input\n v-model:value=\"newCode\"\n :size=\"ctl\"\n :placeholder=\"t('config.security.highSens.codePh')\"\n :input-props=\"{ 'aria-label': t('config.security.highSens.code') }\"\n />\n <n-input\n v-model:value=\"newRemark\"\n :size=\"ctl\"\n class=\"rmi\"\n :placeholder=\"t('config.security.highSens.remarkPh')\"\n :input-props=\"{ 'aria-label': t('config.security.highSens.remark') }\"\n />\n <n-button type=\"primary\" :size=\"ctl\" attr-type=\"submit\" :loading=\"saving\">\n {{ t('common.add') }}\n </n-button>\n </form>\n </div>\n\n <template #preview-extra>\n <span>{{ t('config.sensitive.previewTip') }}</span>\n </template>\n <template #preview>\n <div v-if=\"current\" v-flash=\"current.code\" class=\"dlg\" aria-hidden=\"true\">\n <div class=\"lock\"><AppIcon icon=\"ph:lock-key\" :size=\"24\" /></div>\n <b>{{ t('reauth.title') }}</b>\n <p>\n {{ t('config.sensitive.previewDoing') }}\n <code>{{ current.code }}</code>\n </p>\n <p class=\"hint\">{{ t('reauth.hint') }}</p>\n <i class=\"in\">{{ t('reauth.passwordPlaceholder') }}</i>\n <div class=\"acts\">\n <span>{{ t('common.cancel') }}</span>\n <span class=\"p\">{{ t('reauth.confirm') }}</span>\n </div>\n </div>\n </template>\n </SectionLayout>\n</template>\n\n<style scoped>\n.tbl {\n display: flex;\n flex: 1 1 0;\n flex-direction: column;\n min-height: 0;\n overflow: hidden;\n border-radius: var(--radius-lg);\n background: var(--fill);\n}\n/* 中档 / 窄档设置列不定高,列表卡片给一个固定高度,行多了在卡片里滚 */\n.tbl:not(.side) {\n flex: none;\n height: 440px;\n}\n.th,\n.tr {\n display: grid;\n grid-template-columns: 70px minmax(0, 1fr) 120px 64px;\n gap: 10px;\n align-items: center;\n min-height: 38px;\n padding: 0 14px;\n}\n.th {\n flex: none;\n font-size: 13px;\n color: var(--text-2);\n border-bottom: 1px solid var(--separator);\n}\n.spin {\n flex: 1 1 0;\n min-height: 0;\n}\n.spin :deep(.n-spin-content) {\n height: 100%;\n}\n.tb {\n height: 100%;\n margin: 0;\n padding: 0;\n overflow: auto;\n list-style: none;\n}\n.tr {\n position: relative;\n font-size: 14px;\n cursor: pointer;\n}\n.tr + .tr::before {\n content: '';\n position: absolute;\n top: 0;\n left: 14px;\n right: 0;\n border-top: 1px solid var(--separator);\n}\n.tr:hover {\n background: var(--hover);\n}\n.tr.sel {\n background: var(--sel-bg);\n box-shadow: inset 0 0 0 1px var(--sel-ring);\n}\n.tr:focus-visible {\n outline: 2px solid var(--signal);\n outline-offset: -2px;\n}\n.m {\n font-family: var(--font-mono);\n font-size: 12.5px;\n font-weight: 600;\n color: var(--text-2);\n}\n.m.DELETE {\n color: var(--err);\n}\n.m.POST {\n color: var(--ok);\n}\n.m.PUT {\n color: var(--warn);\n}\n.pt {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\ncode {\n overflow: hidden;\n font-family: var(--font-mono);\n font-size: 13px;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.narsub {\n display: none;\n font-size: 13px;\n color: var(--text-3);\n}\n.remark {\n overflow: hidden;\n font-size: 13px;\n white-space: nowrap;\n text-overflow: ellipsis;\n color: var(--text-3);\n}\n.badge {\n padding: 1px 8px;\n border-radius: 999px;\n background: var(--glass-strong);\n font-size: 12px;\n color: var(--text-2);\n text-align: center;\n}\n/* 窄档:去掉备注列,备注挪到路径下面一行 */\n.tbl.nar .th,\n.tbl.nar .tr {\n grid-template-columns: 56px minmax(0, 1fr) auto;\n gap: 8px;\n padding: 0 10px;\n}\n.tbl.nar .rm {\n display: none;\n}\n.tbl.nar .tr {\n min-height: 44px;\n}\n.tbl.nar .narsub {\n display: block;\n}\n.add {\n display: flex;\n flex: none;\n gap: 8px;\n padding: 10px 14px;\n border-top: 1px solid var(--separator);\n}\n.add :deep(.n-input) {\n flex: 1;\n min-width: 0;\n}\n.add :deep(.n-input.rmi) {\n flex: 0 1 150px;\n}\n.tbl.nar .add {\n flex-wrap: wrap;\n}\n.tbl.nar .add :deep(.n-input),\n.tbl.nar .add :deep(.n-input.rmi) {\n flex: 1 1 100%;\n}\n/* 预览:ReauthModal 的样子 */\n.dlg {\n display: flex;\n flex-direction: column;\n gap: 8px;\n width: min(100%, 360px);\n margin: 0 auto;\n padding: 22px 24px 18px;\n border-radius: var(--radius-lg);\n background: var(--color-bg-elevated);\n box-shadow: var(--shadow-2);\n text-align: left;\n font-size: 14px;\n}\n.lock {\n display: grid;\n place-items: center;\n width: 44px;\n height: 44px;\n border-radius: var(--radius-lg);\n color: var(--sel-fg);\n background: var(--sel-bg);\n}\n.dlg b {\n font-size: 16px;\n font-weight: 600;\n}\n.dlg p {\n margin: 0;\n line-height: 1.5;\n}\n.dlg p code {\n display: block;\n margin-top: 2px;\n font-size: 13px;\n white-space: normal;\n word-break: break-all;\n color: var(--text-1);\n}\n.dlg .hint {\n font-size: 13px;\n color: var(--text-3);\n}\n.in {\n display: block;\n height: 34px;\n padding: 0 12px;\n border: 1px solid var(--border);\n border-radius: 9px;\n background: var(--fill);\n font-style: normal;\n font-size: 13px;\n line-height: 32px;\n color: var(--text-3);\n}\n.acts {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n margin-top: 6px;\n}\n.acts span {\n padding: 4px 14px;\n border-radius: 9px;\n background: var(--fill);\n font-size: 13px;\n}\n.acts .p {\n color: var(--on-acc);\n background: var(--acc-solid);\n}\n</style>\n"],"names":["useI18n","message","useMessage","ctl","nar","side","useConfigLayout","loading","ref","saving","rows","selected","newCode","newRemark","list","toRow","code","extra","i","load","data","highSensApi","item","e","translateError","add","r","_a","remove","id","current","computed","onMounted","_createBlock","SectionLayout","_unref","_createElementVNode","_withDirectives","_openBlock","_createElementBlock","_hoisted_10","_hoisted_11","_createVNode","AppIcon","_createTextVNode","_toDisplayString","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","vFlash","_normalizeClass","_hoisted_1","_hoisted_2","NSpin","_Fragment","_renderList","$event","_withKeys","_withModifiers","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","NPopconfirm","NButton","NInput"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import o from "./UploadSection2.vue.js";
2
2
  /* empty css */
3
3
  import t from "../../../../_virtual/_plugin-vue_export-helper.js";
4
- const c = /* @__PURE__ */ t(o, [["__scopeId", "data-v-18bf86bc"]]);
4
+ const p = /* @__PURE__ */ t(o, [["__scopeId", "data-v-ce45acde"]]);
5
5
  export {
6
- c as default
6
+ p as default
7
7
  };
8
8
  //# sourceMappingURL=UploadSection.vue.js.map