smart-admin-web 10.15.0 → 10.20.0

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 +1 -1
  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 +405 -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,20 +1,35 @@
1
- import { defineComponent as P, ref as m, resolveDirective as R, openBlock as d, createElementBlock as w, Fragment as V, createVNode as r, unref as t, withCtx as l, withDirectives as x, createBlock as g, createTextVNode as p, toDisplayString as i, createElementVNode as $, createCommentVNode as C, h as N } from "vue";
2
- import { useMessage as A, NButton as k, NDrawer as U, NDrawerContent as L, NDescriptions as q, NDescriptionsItem as u, NTag as F } from "naive-ui";
3
- import { useI18n as G } from "vue-i18n";
4
- import { SmartTable as H } from "smart-naive-table";
5
- import T from "../../../../components/AppIcon.vue.js";
6
- import j from "../../../../components/CodeBlock/index.vue.js";
7
- import K from "../../../../components/UserSelect/index.vue.js";
8
- import Q from "../../../../components/ExportColumnsModal/index.vue.js";
9
- import { useConfirm as W } from "../../../../composables/useConfirm.js";
10
- import { logApi as _ } from "../../../../api/index.js";
11
- import { translateError as E } from "../../../../utils/error.js";
12
- import { operatorText as M } from "../../../../utils/format.js";
13
- import { triggerBlobDownload as X } from "../../../../utils/download.js";
14
- const Y = { class: "exception" }, Z = { key: 1 }, ge = /* @__PURE__ */ P({
1
+ import { defineComponent as j, ref as m, computed as b, h as d, resolveDirective as K, openBlock as f, createElementBlock as z, Fragment as Q, createVNode as r, unref as t, withCtx as a, withDirectives as X, createBlock as _, createTextVNode as k, toDisplayString as i, normalizeStyle as Y, normalizeClass as Z, createElementVNode as c, createCommentVNode as O } from "vue";
2
+ import { useElementSize as ee } from "@vueuse/core";
3
+ import { useMessage as te, NButton as D, NDrawer as le, NDrawerContent as oe, NDescriptions as ae, NDescriptionsItem as n, NTag as re } from "naive-ui";
4
+ import { useI18n as se } from "vue-i18n";
5
+ import { SmartTable as ie } from "smart-naive-table";
6
+ import ne from "../../../../components/AppIcon.vue.js";
7
+ import ce from "../../../../components/CodeBlock/index.vue.js";
8
+ import ue from "../../../../components/ExportColumnsModal/index.vue.js";
9
+ import { useConfirm as pe } from "../../../../composables/useConfirm.js";
10
+ import { logApi as C, userApi as me } from "../../../../api/index.js";
11
+ import { useAuthStore as de } from "../../../../stores/auth.js";
12
+ import { translateError as I } from "../../../../utils/error.js";
13
+ import { createFlatFilterSerializer as fe, SEARCH_ACTIONS as g, deriveHeaderFilters as he, flatSearchOf as ge, loadWithinServerMax as ve } from "../../../../utils/tableFilter.js";
14
+ import { TABLE_TOOLBAR as ye, TABLE_MIN_ROW_HEIGHT as be } from "../../../../utils/tableToolbar.js";
15
+ import _e from "../../../../components/TableTotal/index.vue.js";
16
+ import { operatorText as A, fmtDateTime as B } from "../../../../utils/format.js";
17
+ import { triggerBlobDownload as ke } from "../../../../utils/download.js";
18
+ const we = { class: "break" }, xe = { class: "mono break" }, Te = { class: "num" }, Ce = { class: "exception" }, Ne = { class: "num" }, Ee = { class: "mono" }, Se = { class: "muted break" }, Me = { class: "num" }, ze = { key: 1 }, Ke = /* @__PURE__ */ j({
15
19
  __name: "index",
16
- setup(ee) {
17
- const { t: e } = G(), h = A(), { confirm: D } = W(), y = m(), f = m(!1), v = m(!1), I = [
20
+ setup(Oe) {
21
+ const { t: e } = se(), w = te(), { confirm: R } = pe(), H = de(), v = m(), y = m(!1), x = m(!1), L = b(
22
+ () => {
23
+ var l;
24
+ return (l = v.value) == null ? void 0 : l.$el;
25
+ }
26
+ ), { width: N } = ee(L), p = b(() => N.value > 0 && N.value < 600), $ = b(
27
+ () => H.hasPerm("GET:/api/v1/sys/log/op/export") ? [{ label: e("export.button"), key: "export" }] : []
28
+ ), F = b(() => ({ ...ye, more: $.value }));
29
+ function J(l) {
30
+ l === "export" && (y.value = !0);
31
+ }
32
+ const P = [
18
33
  { key: "Title", title: e("log.opName") },
19
34
  { key: "HttpMethod", title: e("log.method") },
20
35
  { key: "Path", title: e("log.path") },
@@ -26,70 +41,95 @@ const Y = { class: "exception" }, Z = { key: 1 }, ge = /* @__PURE__ */ P({
26
41
  { key: "CreateTime", title: e("common.createTime") },
27
42
  { key: "ExceptionMessage", title: e("log.exceptionMessage"), defaultSelected: !1 }
28
43
  ];
29
- async function S(a) {
30
- var c;
31
- const o = ((c = y.value) == null ? void 0 : c.params) ?? {};
32
- v.value = !0;
44
+ async function V(l) {
45
+ const o = ge(v.value, E);
46
+ x.value = !0;
33
47
  try {
34
- const n = await _.opExport({
48
+ const h = await C.opExport({
35
49
  title: o.title || void 0,
36
50
  success: o.success,
37
51
  operatorId: o.operatorId != null ? Number(o.operatorId) : void 0,
38
52
  path: o.path || void 0,
39
53
  createTime: o.createTime ?? null,
40
- columns: a.join(",")
54
+ columns: l.join(",")
41
55
  });
42
- X(n, e("logOp.fileName")), f.value = !1, h.success(e("export.done"));
43
- } catch (n) {
44
- h.error(E(n));
56
+ ke(h, e("logOp.fileName")), y.value = !1, w.success(e("export.done"));
57
+ } catch (h) {
58
+ w.error(I(h));
45
59
  } finally {
46
- v.value = !1;
60
+ x.value = !1;
47
61
  }
48
62
  }
49
- const z = [
63
+ const E = fe({ ranges: ["createTime"] }), S = m([]);
64
+ async function W() {
65
+ try {
66
+ const { items: l } = await ve(me.page, 1e3);
67
+ S.value = l.map((o) => ({ label: `${o.name}(${o.account})`, value: o.id }));
68
+ } catch {
69
+ }
70
+ }
71
+ W();
72
+ const M = [
50
73
  { type: "index", title: () => e("common.rowNo"), width: 64, align: "center" },
51
- { key: "title", title: () => e("log.opName"), search: !0 },
74
+ { key: "title", title: () => e("log.opName"), search: { actions: g.fuzzy } },
52
75
  { key: "httpMethod", title: () => e("log.method"), width: 90 },
53
- { key: "path", title: () => e("log.path"), ellipsis: { tooltip: !0 }, search: !0 },
76
+ {
77
+ key: "path",
78
+ title: () => e("log.path"),
79
+ ellipsis: { tooltip: !0 },
80
+ search: { actions: g.fuzzy },
81
+ render: (l) => d("span", { class: "mono muted" }, l.path)
82
+ },
54
83
  {
55
84
  key: "success",
56
85
  title: () => e("log.result"),
57
86
  tag: !0,
58
- search: !0,
87
+ search: { actions: g.exact },
59
88
  options: [
60
89
  { label: () => e("log.success"), value: !0, tagType: "success" },
61
90
  { label: () => e("log.failed"), value: !1, tagType: "error" }
62
91
  ]
63
92
  },
64
- { key: "resultCode", title: () => e("log.resultCode"), width: 100 },
93
+ {
94
+ key: "resultCode",
95
+ title: () => e("log.resultCode"),
96
+ width: 100,
97
+ render: (l) => d("span", { class: "num" }, String(l.resultCode))
98
+ },
65
99
  {
66
100
  key: "operator",
67
101
  title: () => e("log.operator"),
68
102
  width: 120,
69
- render: (a) => M(a),
70
- // 日志只存 OperatorId(姓名是读取时回填的),故按人筛必须是精确 Id → 复用现成的人员选择器,搜索键用 operatorId。
71
- search: {
72
- key: "operatorId",
73
- label: () => e("log.operator"),
74
- render: ({ value: a, setValue: o, search: c }) => N(K, {
75
- value: a,
76
- clearable: !0,
77
- placeholder: e("log.operatorPlaceholder"),
78
- "onUpdate:value": (n) => {
79
- o(n), c();
80
- }
81
- })
82
- }
103
+ ellipsis: { tooltip: !0 },
104
+ render: (l) => A(l)
105
+ },
106
+ // 操作人搜索项:日志只存 OperatorId(姓名是读取时回填的),按人筛必须是精确 Id(后端 OperatorId ==)。
107
+ // 只作搜索项,不进表格也不进列设置;展示列是上面的 operator。
108
+ {
109
+ key: "operatorId",
110
+ title: () => e("log.operator"),
111
+ hideInTable: !0,
112
+ options: S,
113
+ search: { actions: g.exact, props: { clearable: !0, filterable: !0 } }
114
+ },
115
+ {
116
+ key: "elapsedMs",
117
+ title: () => e("log.elapsed"),
118
+ width: 100,
119
+ render: (l) => d("span", { class: "num" }, `${l.elapsedMs} ms`)
120
+ },
121
+ {
122
+ key: "ip",
123
+ title: () => e("log.ip"),
124
+ render: (l) => d("span", { class: "mono muted" }, l.ip || "—")
83
125
  },
84
- { key: "elapsedMs", title: () => e("log.elapsed"), width: 100, render: (a) => `${a.elapsedMs} ms` },
85
- { key: "ip", title: () => e("log.ip"), render: (a) => a.ip || "—" },
86
126
  // 时间范围是审计最常用的一刀("上周三下午谁删了那批数据");daterange 回传 ['YYYY-MM-DD','YYYY-MM-DD'],
87
127
  // api 层拆成 StartTime/EndTime 并把结束日补到 23:59:59。
88
128
  {
89
129
  key: "createTime",
90
130
  title: () => e("common.createTime"),
91
- format: "datetime",
92
- search: { type: "daterange" }
131
+ render: (l) => d("span", { class: "num muted", style: "white-space: nowrap" }, B(l.createTime)),
132
+ search: { type: "daterange", actions: g.dayRange }
93
133
  },
94
134
  {
95
135
  key: "op",
@@ -97,236 +137,234 @@ const Y = { class: "exception" }, Z = { key: 1 }, ge = /* @__PURE__ */ P({
97
137
  width: 90,
98
138
  fixed: "right",
99
139
  hideInSetting: !0,
100
- render: (a) => N(
101
- k,
102
- { size: "small", quaternary: !0, type: "primary", onClick: () => B(a) },
140
+ render: (l) => d(
141
+ D,
142
+ { size: "small", quaternary: !0, type: "primary", onClick: () => G(l) },
103
143
  () => e("log.detail")
104
144
  )
105
145
  }
106
- ], b = m(!1), s = m(null);
107
- function B(a) {
108
- s.value = a, b.value = !0;
146
+ ];
147
+ he(M);
148
+ const T = m(!1), s = m(null);
149
+ function G(l) {
150
+ s.value = l, T.value = !0;
109
151
  }
110
- function O(a) {
152
+ function U(l) {
111
153
  try {
112
- return JSON.stringify(JSON.parse(a), null, 2);
154
+ return JSON.stringify(JSON.parse(l), null, 2);
113
155
  } catch {
114
- return a;
156
+ return l;
115
157
  }
116
158
  }
117
- function J() {
118
- D({
159
+ function q() {
160
+ R({
119
161
  type: "error",
120
162
  content: e("log.clearOpConfirm"),
121
- action: () => _.opClear(),
163
+ action: () => C.opClear(),
122
164
  successMsg: e("log.cleared")
123
- }).then((a) => {
165
+ }).then((l) => {
124
166
  var o;
125
- a && ((o = y.value) == null || o.refresh());
167
+ l && ((o = v.value) == null || o.refresh());
126
168
  });
127
169
  }
128
- return (a, o) => {
129
- const c = R("auth");
130
- return d(), w(V, null, [
131
- r(t(H), {
132
- "default-page-size": 100,
170
+ return (l, o) => {
171
+ const h = K("auth");
172
+ return f(), z(Q, null, [
173
+ r(t(ie), {
133
174
  ref_key: "tableRef",
134
- ref: y,
135
- columns: z,
136
- fetcher: t(_).opPage,
137
- "flex-height": "",
138
- "virtual-scroll": "",
175
+ ref: v,
176
+ columns: M,
177
+ fetcher: t(C).opPage,
178
+ search: { container: "table" },
179
+ "filter-serializer": t(E),
180
+ toolbar: F.value,
181
+ "fill-height": "",
182
+ "min-row-height": t(be),
183
+ "card-on-narrow": "",
139
184
  "storage-key": "sys-log-op",
140
- onError: o[1] || (o[1] = (n) => t(h).error(t(E)(n)))
185
+ onMoreSelect: J,
186
+ onError: o[0] || (o[0] = (u) => t(w).error(t(I)(u)))
141
187
  }, {
142
- toolbar: l(() => [
143
- x((d(), g(t(k), {
188
+ "pagination-prefix": a(({ itemCount: u }) => [
189
+ r(_e, { count: u }, null, 8, ["count"])
190
+ ]),
191
+ "toolbar-right": a(() => [
192
+ X((f(), _(t(D), {
144
193
  type: "error",
145
194
  secondary: "",
146
- onClick: J
195
+ onClick: q
147
196
  }, {
148
- icon: l(() => [
149
- r(T, {
197
+ icon: a(() => [
198
+ r(ne, {
150
199
  icon: "ph:trash",
151
200
  size: 16
152
201
  })
153
202
  ]),
154
- default: l(() => [
155
- p(" " + i(t(e)("log.clear")), 1)
156
- ]),
157
- _: 1
158
- })), [
159
- [c, "DELETE:/api/v1/sys/log/op"]
160
- ]),
161
- x((d(), g(t(k), {
162
- onClick: o[0] || (o[0] = (n) => f.value = !0)
163
- }, {
164
- icon: l(() => [
165
- r(T, {
166
- icon: "ph:download-simple",
167
- size: 16
168
- })
169
- ]),
170
- default: l(() => [
171
- p(" " + i(t(e)("export.button")), 1)
203
+ default: a(() => [
204
+ k(" " + i(t(e)("log.clear")), 1)
172
205
  ]),
173
206
  _: 1
174
207
  })), [
175
- [c, "GET:/api/v1/sys/log/op/export"]
208
+ [h, "DELETE:/api/v1/sys/log/op"]
176
209
  ])
177
210
  ]),
178
211
  _: 1
179
- }, 8, ["fetcher"]),
180
- r(Q, {
181
- show: f.value,
182
- "onUpdate:show": o[2] || (o[2] = (n) => f.value = n),
183
- columns: I,
184
- loading: v.value,
185
- onConfirm: S
212
+ }, 8, ["fetcher", "filter-serializer", "toolbar", "min-row-height"]),
213
+ r(ue, {
214
+ show: y.value,
215
+ "onUpdate:show": o[1] || (o[1] = (u) => y.value = u),
216
+ columns: P,
217
+ loading: x.value,
218
+ onConfirm: V
186
219
  }, null, 8, ["show", "loading"]),
187
- r(t(U), {
188
- show: b.value,
189
- "onUpdate:show": o[3] || (o[3] = (n) => b.value = n),
190
- width: 560,
191
- placement: "right"
220
+ r(t(le), {
221
+ show: T.value,
222
+ "onUpdate:show": o[2] || (o[2] = (u) => T.value = u),
223
+ placement: p.value ? "bottom" : "right",
224
+ width: p.value ? void 0 : "min(560px, 100vw)",
225
+ height: p.value ? "auto" : void 0,
226
+ class: Z(p.value ? "st-sheet" : ""),
227
+ style: Y(p.value ? "max-height: 85vh" : "")
192
228
  }, {
193
- default: l(() => [
194
- r(t(L), {
229
+ default: a(() => [
230
+ r(t(oe), {
195
231
  title: t(e)("log.detail"),
196
- closable: ""
232
+ closable: "",
233
+ "native-scrollbar": p.value
197
234
  }, {
198
- default: l(() => [
199
- s.value ? (d(), g(t(q), {
235
+ default: a(() => [
236
+ s.value ? (f(), _(t(ae), {
200
237
  key: 0,
201
238
  "label-placement": "left",
202
239
  column: 1,
203
240
  bordered: "",
204
- size: "small"
241
+ size: "small",
242
+ "label-style": "width: 96px"
205
243
  }, {
206
- default: l(() => [
207
- r(t(u), {
244
+ default: a(() => [
245
+ r(t(n), {
208
246
  label: t(e)("log.opName")
209
247
  }, {
210
- default: l(() => [
211
- p(i(s.value.title), 1)
248
+ default: a(() => [
249
+ c("span", we, i(s.value.title), 1)
212
250
  ]),
213
251
  _: 1
214
252
  }, 8, ["label"]),
215
- r(t(u), {
253
+ r(t(n), {
216
254
  label: t(e)("log.method")
217
255
  }, {
218
- default: l(() => [
219
- p(i(s.value.httpMethod), 1)
256
+ default: a(() => [
257
+ k(i(s.value.httpMethod), 1)
220
258
  ]),
221
259
  _: 1
222
260
  }, 8, ["label"]),
223
- r(t(u), {
261
+ r(t(n), {
224
262
  label: t(e)("log.path")
225
263
  }, {
226
- default: l(() => [
227
- p(i(s.value.path), 1)
264
+ default: a(() => [
265
+ c("span", xe, i(s.value.path), 1)
228
266
  ]),
229
267
  _: 1
230
268
  }, 8, ["label"]),
231
- r(t(u), {
269
+ r(t(n), {
232
270
  label: t(e)("log.result")
233
271
  }, {
234
- default: l(() => [
235
- r(t(F), {
272
+ default: a(() => [
273
+ r(t(re), {
236
274
  type: s.value.success ? "success" : "error",
237
275
  size: "small",
238
276
  bordered: !1
239
277
  }, {
240
- default: l(() => [
241
- p(i(s.value.success ? t(e)("log.success") : t(e)("log.failed")), 1)
278
+ default: a(() => [
279
+ k(i(s.value.success ? t(e)("log.success") : t(e)("log.failed")), 1)
242
280
  ]),
243
281
  _: 1
244
282
  }, 8, ["type"])
245
283
  ]),
246
284
  _: 1
247
285
  }, 8, ["label"]),
248
- r(t(u), {
286
+ r(t(n), {
249
287
  label: t(e)("log.resultCode")
250
288
  }, {
251
- default: l(() => [
252
- p(i(s.value.resultCode), 1)
289
+ default: a(() => [
290
+ c("span", Te, i(s.value.resultCode), 1)
253
291
  ]),
254
292
  _: 1
255
293
  }, 8, ["label"]),
256
- s.value.exceptionMessage ? (d(), g(t(u), {
294
+ s.value.exceptionMessage ? (f(), _(t(n), {
257
295
  key: 0,
258
296
  label: t(e)("log.exception")
259
297
  }, {
260
- default: l(() => [
261
- $("pre", Y, i(s.value.exceptionMessage), 1)
298
+ default: a(() => [
299
+ c("pre", Ce, i(s.value.exceptionMessage), 1)
262
300
  ]),
263
301
  _: 1
264
- }, 8, ["label"])) : C("", !0),
265
- r(t(u), {
302
+ }, 8, ["label"])) : O("", !0),
303
+ r(t(n), {
266
304
  label: t(e)("log.elapsed")
267
305
  }, {
268
- default: l(() => [
269
- p(i(s.value.elapsedMs) + " ms ", 1)
306
+ default: a(() => [
307
+ c("span", Ne, i(s.value.elapsedMs) + " ms", 1)
270
308
  ]),
271
309
  _: 1
272
310
  }, 8, ["label"]),
273
- r(t(u), {
311
+ r(t(n), {
274
312
  label: t(e)("log.operator")
275
313
  }, {
276
- default: l(() => [
277
- p(i(t(M)(s.value)), 1)
314
+ default: a(() => [
315
+ k(i(t(A)(s.value)), 1)
278
316
  ]),
279
317
  _: 1
280
318
  }, 8, ["label"]),
281
- r(t(u), {
319
+ r(t(n), {
282
320
  label: t(e)("log.ip")
283
321
  }, {
284
- default: l(() => [
285
- p(i(s.value.ip || "—"), 1)
322
+ default: a(() => [
323
+ c("span", Ee, i(s.value.ip || "—"), 1)
286
324
  ]),
287
325
  _: 1
288
326
  }, 8, ["label"]),
289
- r(t(u), {
327
+ r(t(n), {
290
328
  label: t(e)("log.userAgent")
291
329
  }, {
292
- default: l(() => [
293
- p(i(s.value.userAgent || "—"), 1)
330
+ default: a(() => [
331
+ c("span", Se, i(s.value.userAgent || "—"), 1)
294
332
  ]),
295
333
  _: 1
296
334
  }, 8, ["label"]),
297
- r(t(u), {
335
+ r(t(n), {
298
336
  label: t(e)("common.createTime")
299
337
  }, {
300
- default: l(() => [
301
- p(i(s.value.createTime), 1)
338
+ default: a(() => [
339
+ c("span", Me, i(t(B)(s.value.createTime)), 1)
302
340
  ]),
303
341
  _: 1
304
342
  }, 8, ["label"]),
305
- r(t(u), {
343
+ r(t(n), {
306
344
  label: t(e)("log.param")
307
345
  }, {
308
- default: l(() => [
309
- s.value.paramJson ? (d(), g(j, {
346
+ default: a(() => [
347
+ s.value.paramJson ? (f(), _(ce, {
310
348
  key: 0,
311
- code: O(s.value.paramJson)
312
- }, null, 8, ["code"])) : (d(), w("span", Z, "—"))
349
+ code: U(s.value.paramJson)
350
+ }, null, 8, ["code"])) : (f(), z("span", ze, "—"))
313
351
  ]),
314
352
  _: 1
315
353
  }, 8, ["label"])
316
354
  ]),
317
355
  _: 1
318
- })) : C("", !0)
356
+ })) : O("", !0)
319
357
  ]),
320
358
  _: 1
321
- }, 8, ["title"])
359
+ }, 8, ["title", "native-scrollbar"])
322
360
  ]),
323
361
  _: 1
324
- }, 8, ["show"])
362
+ }, 8, ["show", "placement", "width", "height", "class", "style"])
325
363
  ], 64);
326
364
  };
327
365
  }
328
366
  });
329
367
  export {
330
- ge as default
368
+ Ke as default
331
369
  };
332
370
  //# sourceMappingURL=index2.vue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index2.vue.js","sources":["../../../../../src/views/system/log/op/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 操作日志 = 只读 SmartTable + 详情抽屉。后端无 op/{id},分页项已含全字段 → 抽屉直接用行数据。\n// 搜索区要能答审计的三个问题:谁(操作人)、什么时候(时间范围)、干了什么(操作名/路径/成败)。\n// paramJson 走 CodeBlock(json 高亮 + 复制;美化是 parse→stringify,失败原样);异常堆栈保持危险色 <pre>——堆栈非代码,高亮无意义。\n// 导出:ExportColumnsModal 选列 + 当前筛选条件。\nimport { h, ref } from 'vue'\nimport {\n NButton,\n NTag,\n NDrawer,\n NDrawerContent,\n NDescriptions,\n NDescriptionsItem,\n useMessage,\n} from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { SmartTable, type SmartTableColumn, type SmartTableInst } from 'smart-naive-table'\nimport AppIcon from '#/components/AppIcon.vue'\nimport CodeBlock from '#/components/CodeBlock/index.vue'\nimport UserSelect from '#/components/UserSelect/index.vue'\nimport ExportColumnsModal from '#/components/ExportColumnsModal/index.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { logApi } from '#/api'\nimport { translateError } from '#/utils/error'\nimport { operatorText } from '#/utils/format'\nimport { triggerBlobDownload } from '#/utils/download'\nimport type { ExportColumnDef, SysOpLog } from '#/types/api'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { confirm } = useConfirm()\nconst tableRef = ref<SmartTableInst<SysOpLog>>()\n\nconst exportShow = ref(false)\nconst exporting = ref(false)\n\n/** 与后端 OpLogExportProfile.Columns 对齐。 */\nconst opExportColumns: ExportColumnDef[] = [\n { key: 'Title', title: t('log.opName') },\n { key: 'HttpMethod', title: t('log.method') },\n { key: 'Path', title: t('log.path') },\n { key: 'ResultCode', title: t('log.resultCode') },\n { key: 'Success', title: t('log.success') },\n { key: 'OperatorName', title: t('log.operator') },\n { key: 'Ip', title: t('log.ip') },\n { key: 'ElapsedMs', title: t('log.elapsed') },\n { key: 'CreateTime', title: t('common.createTime') },\n { key: 'ExceptionMessage', title: t('log.exceptionMessage'), defaultSelected: false },\n]\n\nasync function onExport(keys: string[]) {\n const p = tableRef.value?.params ?? {}\n exporting.value = true\n try {\n const blob = await logApi.opExport({\n title: p.title || undefined,\n success: p.success,\n operatorId: p.operatorId != null ? Number(p.operatorId) : undefined,\n path: p.path || undefined,\n createTime: p.createTime ?? null,\n columns: keys.join(','),\n })\n triggerBlobDownload(blob, t('logOp.fileName'))\n exportShow.value = false\n message.success(t('export.done'))\n } catch (e) {\n message.error(translateError(e))\n } finally {\n exporting.value = false\n }\n}\n\nconst columns: SmartTableColumn<SysOpLog>[] = [\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n { key: 'title', title: () => t('log.opName'), search: true },\n { key: 'httpMethod', title: () => t('log.method'), width: 90 },\n { key: 'path', title: () => t('log.path'), ellipsis: { tooltip: true }, search: true },\n {\n key: 'success',\n title: () => t('log.result'),\n tag: true,\n search: true,\n options: [\n { label: () => t('log.success'), value: true, tagType: 'success' },\n { label: () => t('log.failed'), value: false, tagType: 'error' },\n ],\n },\n { key: 'resultCode', title: () => t('log.resultCode'), width: 100 },\n {\n key: 'operator',\n title: () => t('log.operator'),\n width: 120,\n render: r => operatorText(r),\n // 日志只存 OperatorId(姓名是读取时回填的),故按人筛必须是精确 Id → 复用现成的人员选择器,搜索键用 operatorId。\n search: {\n key: 'operatorId',\n label: () => t('log.operator'),\n render: ({ value, setValue, search }) =>\n h(UserSelect, {\n value: value as number | null,\n clearable: true,\n placeholder: t('log.operatorPlaceholder'),\n 'onUpdate:value': (v: number | null) => {\n setValue(v)\n search()\n },\n }),\n },\n },\n { key: 'elapsedMs', title: () => t('log.elapsed'), width: 100, render: r => `${r.elapsedMs} ms` },\n { key: 'ip', title: () => t('log.ip'), render: r => r.ip || '—' },\n // 时间范围是审计最常用的一刀(\"上周三下午谁删了那批数据\");daterange 回传 ['YYYY-MM-DD','YYYY-MM-DD'],\n // api 层拆成 StartTime/EndTime 并把结束日补到 23:59:59。\n {\n key: 'createTime',\n title: () => t('common.createTime'),\n format: 'datetime',\n search: { type: 'daterange' },\n },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 90,\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(\n NButton,\n { size: 'small', quaternary: true, type: 'primary', onClick: () => openDetail(r) },\n () => t('log.detail'),\n ),\n },\n]\n\n// ── 详情抽屉(只读,行数据直填)──\nconst showDetail = ref(false)\nconst detailRow = ref<SysOpLog | null>(null)\nfunction openDetail(r: SysOpLog) {\n detailRow.value = r\n showDetail.value = true\n}\n/** paramJson 美化:parse→stringify(2);非法 JSON 原样返回。空值占位由模板判空。 */\nfunction prettyParam(json: string) {\n try {\n return JSON.stringify(JSON.parse(json), null, 2)\n } catch {\n return json\n }\n}\n\nfunction clearLogs() {\n confirm({\n type: 'error',\n content: t('log.clearOpConfirm'),\n action: () => logApi.opClear(),\n successMsg: t('log.cleared'),\n }).then(ok => {\n if (ok) tableRef.value?.refresh()\n })\n}\n</script>\n\n<template>\n <SmartTable\n :default-page-size=\"100\"\n ref=\"tableRef\"\n :columns=\"columns\"\n :fetcher=\"logApi.opPage\"\n flex-height\n virtual-scroll\n storage-key=\"sys-log-op\"\n @error=\"e => message.error(translateError(e))\"\n >\n <template #toolbar>\n <n-button v-auth=\"'DELETE:/api/v1/sys/log/op'\" type=\"error\" secondary @click=\"clearLogs\">\n <template #icon><AppIcon icon=\"ph:trash\" :size=\"16\" /></template>\n {{ t('log.clear') }}\n </n-button>\n <n-button v-auth=\"'GET:/api/v1/sys/log/op/export'\" @click=\"exportShow = true\">\n <template #icon><AppIcon icon=\"ph:download-simple\" :size=\"16\" /></template>\n {{ t('export.button') }}\n </n-button>\n </template>\n </SmartTable>\n\n <ExportColumnsModal\n v-model:show=\"exportShow\"\n :columns=\"opExportColumns\"\n :loading=\"exporting\"\n @confirm=\"onExport\"\n />\n\n <n-drawer v-model:show=\"showDetail\" :width=\"560\" placement=\"right\">\n <n-drawer-content :title=\"t('log.detail')\" closable>\n <n-descriptions v-if=\"detailRow\" label-placement=\"left\" :column=\"1\" bordered size=\"small\">\n <n-descriptions-item :label=\"t('log.opName')\">{{ detailRow.title }}</n-descriptions-item>\n <n-descriptions-item :label=\"t('log.method')\">\n {{ detailRow.httpMethod }}\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('log.path')\">{{ detailRow.path }}</n-descriptions-item>\n <n-descriptions-item :label=\"t('log.result')\">\n <n-tag :type=\"detailRow.success ? 'success' : 'error'\" size=\"small\" :bordered=\"false\">\n {{ detailRow.success ? t('log.success') : t('log.failed') }}\n </n-tag>\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('log.resultCode')\">\n {{ detailRow.resultCode }}\n </n-descriptions-item>\n <n-descriptions-item v-if=\"detailRow.exceptionMessage\" :label=\"t('log.exception')\">\n <pre class=\"exception\">{{ detailRow.exceptionMessage }}</pre>\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('log.elapsed')\">\n {{ detailRow.elapsedMs }} ms\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('log.operator')\">\n {{ operatorText(detailRow) }}\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('log.ip')\">{{ detailRow.ip || '—' }}</n-descriptions-item>\n <n-descriptions-item :label=\"t('log.userAgent')\">\n {{ detailRow.userAgent || '—' }}\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('common.createTime')\">\n {{ detailRow.createTime }}\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('log.param')\">\n <CodeBlock v-if=\"detailRow.paramJson\" :code=\"prettyParam(detailRow.paramJson)\" />\n <span v-else>—</span>\n </n-descriptions-item>\n </n-descriptions>\n </n-drawer-content>\n </n-drawer>\n</template>\n\n<style scoped>\n.exception {\n margin: 0;\n white-space: pre-wrap;\n word-break: break-all;\n font-family: var(--font-mono, ui-monospace, monospace);\n font-size: 12px;\n line-height: 1.5;\n color: var(--color-danger);\n}\n</style>\n"],"names":["t","useI18n","message","useMessage","confirm","useConfirm","tableRef","ref","exportShow","exporting","opExportColumns","onExport","keys","p","_a","blob","logApi","triggerBlobDownload","e","translateError","columns","r","operatorText","value","setValue","search","h","UserSelect","v","NButton","openDetail","showDetail","detailRow","prettyParam","json","clearLogs","ok","_createVNode","_unref","SmartTable","_cache","_createBlock","AppIcon","_createTextVNode","ExportColumnsModal","$event","NDrawer","NDrawerContent","NDescriptions","NDescriptionsItem","_toDisplayString","NTag","_createElementVNode","_hoisted_1","CodeBlock","_openBlock","_createElementBlock"],"mappings":"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"}
1
+ {"version":3,"file":"index2.vue.js","sources":["../../../../../src/views/system/log/op/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 操作日志 = 只读 SmartTable + 详情抽屉。后端无 op/{id},分页项已含全字段 → 抽屉直接用行数据。\n// 搜索区要能答审计的三个问题:谁(操作人)、什么时候(时间范围)、干了什么(操作名/路径/成败)。\n// paramJson 走 CodeBlock(json 高亮 + 复制;美化是 parse→stringify,失败原样);异常堆栈保持危险色 <pre>——堆栈非代码,高亮无意义。\n// 导出:ExportColumnsModal 选列 + 当前筛选条件。\nimport { computed, h, ref } from 'vue'\nimport { useElementSize } from '@vueuse/core'\nimport {\n NButton,\n NTag,\n NDrawer,\n NDrawerContent,\n NDescriptions,\n NDescriptionsItem,\n useMessage,\n} from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { SmartTable, type SmartTableColumn, type SmartTableInst } from 'smart-naive-table'\nimport AppIcon from '#/components/AppIcon.vue'\nimport CodeBlock from '#/components/CodeBlock/index.vue'\nimport ExportColumnsModal from '#/components/ExportColumnsModal/index.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { logApi, userApi } from '#/api'\nimport { useAuthStore } from '#/stores/auth'\nimport { translateError } from '#/utils/error'\nimport {\n SEARCH_ACTIONS,\n createFlatFilterSerializer,\n flatSearchOf,\n loadWithinServerMax,\n deriveHeaderFilters,\n} from '#/utils/tableFilter'\nimport { TABLE_MIN_ROW_HEIGHT, TABLE_TOOLBAR } from '#/utils/tableToolbar'\nimport TableTotal from '#/components/TableTotal/index.vue'\nimport { fmtDateTime, operatorText } from '#/utils/format'\nimport { triggerBlobDownload } from '#/utils/download'\nimport type { ExportColumnDef, SysOpLog } from '#/types/api'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { confirm } = useConfirm()\nconst authStore = useAuthStore()\nconst tableRef = ref<SmartTableInst<SysOpLog>>()\n\nconst exportShow = ref(false)\nconst exporting = ref(false)\n\n// 详情抽屉的窄档判据:直接读表格根节点的宽度,与库的窄档(容器 < 600,卡片列表)同源同值,\n// 不用视口近似。窄档详情从底部抽屉弹出(宽档右侧抽屉)。未量到宽度(0)时按宽档处理。\nconst tableEl = computed(\n () => (tableRef.value as unknown as { $el?: HTMLElement } | undefined)?.$el,\n)\nconst { width: tableWidth } = useElementSize(tableEl)\nconst isNarrow = computed(() => tableWidth.value > 0 && tableWidth.value < 600)\n\n// 导出收进表格内置的「更多」菜单;没有导出权限时 more 为空数组,按钮不出现。\nconst toolbarMore = computed(() =>\n authStore.hasPerm('GET:/api/v1/sys/log/op/export')\n ? [{ label: t('export.button'), key: 'export' }]\n : [],\n)\n// 引用稳定的 toolbar 配置:不要把 `{ ...TABLE_TOOLBAR, more }` 直接写进模板,那样每次重渲染都会新建一个对象\nconst toolbar = computed(() => ({ ...TABLE_TOOLBAR, more: toolbarMore.value }))\nfunction onMoreSelect(key: string | number) {\n if (key === 'export') exportShow.value = true\n}\n\n/** 与后端 OpLogExportProfile.Columns 对齐。 */\nconst opExportColumns: ExportColumnDef[] = [\n { key: 'Title', title: t('log.opName') },\n { key: 'HttpMethod', title: t('log.method') },\n { key: 'Path', title: t('log.path') },\n { key: 'ResultCode', title: t('log.resultCode') },\n { key: 'Success', title: t('log.success') },\n { key: 'OperatorName', title: t('log.operator') },\n { key: 'Ip', title: t('log.ip') },\n { key: 'ElapsedMs', title: t('log.elapsed') },\n { key: 'CreateTime', title: t('common.createTime') },\n { key: 'ExceptionMessage', title: t('log.exceptionMessage'), defaultSelected: false },\n]\n\nasync function onExport(keys: string[]) {\n // 搜索值在过滤态里,flatSearchOf 用同一个序列化器还原成与列表请求一致的扁平键\n const p = flatSearchOf(tableRef.value, filterSerializer)\n exporting.value = true\n try {\n const blob = await logApi.opExport({\n title: p.title || undefined,\n success: p.success,\n operatorId: p.operatorId != null ? Number(p.operatorId) : undefined,\n path: p.path || undefined,\n createTime: p.createTime ?? null,\n columns: keys.join(','),\n })\n triggerBlobDownload(blob, t('logOp.fileName'))\n exportShow.value = false\n message.success(t('export.done'))\n } catch (e) {\n message.error(translateError(e))\n } finally {\n exporting.value = false\n }\n}\n\n// 日期区间:条件构造器里是同一字段的两行(大于等于 + 小于等于),序列化器合并成 [起, 止],\n// api 层 splitRange 再拆成 StartTime/EndTime 并给结束日补 23:59:59。\nconst filterSerializer = createFlatFilterSerializer({ ranges: ['createTime'] })\n\n// 操作人下拉的选项源:取前 1000 个用户。\n// 用选项列而不是 UserSelect(远程搜索):条件构造器放不下自定义控件。\n// 当前限制:用户超过 1000 时,排在后面的人在这里选不到。\nconst operatorOptions = ref<{ label: string; value: number }[]>([])\nasync function loadOperatorOptions() {\n try {\n // 应用把 MaxPageSize 调到 1000 以下时,loadWithinServerMax 按后端回的上限重取一次\n const { items } = await loadWithinServerMax(userApi.page, 1000)\n operatorOptions.value = items.map(u => ({ label: `${u.name}(${u.account})`, value: u.id }))\n } catch {\n // 静默:人员下拉是筛选辅助,拉取失败不打断列表\n }\n}\nvoid loadOperatorOptions()\n\nconst columns: SmartTableColumn<SysOpLog>[] = [\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n { key: 'title', title: () => t('log.opName'), search: { actions: SEARCH_ACTIONS.fuzzy } },\n { key: 'httpMethod', title: () => t('log.method'), width: 90 },\n {\n key: 'path',\n title: () => t('log.path'),\n ellipsis: { tooltip: true },\n search: { actions: SEARCH_ACTIONS.fuzzy },\n render: r => h('span', { class: 'mono muted' }, r.path),\n },\n {\n key: 'success',\n title: () => t('log.result'),\n tag: true,\n search: { actions: SEARCH_ACTIONS.exact },\n options: [\n { label: () => t('log.success'), value: true, tagType: 'success' },\n { label: () => t('log.failed'), value: false, tagType: 'error' },\n ],\n },\n {\n key: 'resultCode',\n title: () => t('log.resultCode'),\n width: 100,\n render: r => h('span', { class: 'num' }, String(r.resultCode)),\n },\n {\n key: 'operator',\n title: () => t('log.operator'),\n width: 120,\n ellipsis: { tooltip: true },\n render: r => operatorText(r),\n },\n // 操作人搜索项:日志只存 OperatorId(姓名是读取时回填的),按人筛必须是精确 Id(后端 OperatorId ==)。\n // 只作搜索项,不进表格也不进列设置;展示列是上面的 operator。\n {\n key: 'operatorId',\n title: () => t('log.operator'),\n hideInTable: true,\n options: operatorOptions,\n search: { actions: SEARCH_ACTIONS.exact, props: { clearable: true, filterable: true } },\n },\n {\n key: 'elapsedMs',\n title: () => t('log.elapsed'),\n width: 100,\n render: r => h('span', { class: 'num' }, `${r.elapsedMs} ms`),\n },\n {\n key: 'ip',\n title: () => t('log.ip'),\n render: r => h('span', { class: 'mono muted' }, r.ip || '—'),\n },\n // 时间范围是审计最常用的一刀(\"上周三下午谁删了那批数据\");daterange 回传 ['YYYY-MM-DD','YYYY-MM-DD'],\n // api 层拆成 StartTime/EndTime 并把结束日补到 23:59:59。\n {\n key: 'createTime',\n title: () => t('common.createTime'),\n render: r =>\n h('span', { class: 'num muted', style: 'white-space: nowrap' }, fmtDateTime(r.createTime)),\n search: { type: 'daterange', actions: SEARCH_ACTIONS.dayRange },\n },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 90,\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(\n NButton,\n { size: 'small', quaternary: true, type: 'primary', onClick: () => openDetail(r) },\n () => t('log.detail'),\n ),\n },\n]\nderiveHeaderFilters(columns)\n\n// ── 详情抽屉(只读,行数据直填)──\nconst showDetail = ref(false)\nconst detailRow = ref<SysOpLog | null>(null)\nfunction openDetail(r: SysOpLog) {\n detailRow.value = r\n showDetail.value = true\n}\n/** paramJson 美化:parse→stringify(2);非法 JSON 原样返回。空值占位由模板判空。 */\nfunction prettyParam(json: string) {\n try {\n return JSON.stringify(JSON.parse(json), null, 2)\n } catch {\n return json\n }\n}\n\nfunction clearLogs() {\n confirm({\n type: 'error',\n content: t('log.clearOpConfirm'),\n action: () => logApi.opClear(),\n successMsg: t('log.cleared'),\n }).then(ok => {\n if (ok) tableRef.value?.refresh()\n })\n}\n</script>\n\n<template>\n <SmartTable\n ref=\"tableRef\"\n :columns=\"columns\"\n :fetcher=\"logApi.opPage\"\n :search=\"{ container: 'table' }\"\n :filter-serializer=\"filterSerializer\"\n :toolbar=\"toolbar\"\n fill-height\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n card-on-narrow\n storage-key=\"sys-log-op\"\n @more-select=\"onMoreSelect\"\n @error=\"e => message.error(translateError(e))\"\n >\n <template #pagination-prefix=\"{ itemCount }\">\n <TableTotal :count=\"itemCount\" />\n </template>\n <template #toolbar-right>\n <n-button v-auth=\"'DELETE:/api/v1/sys/log/op'\" type=\"error\" secondary @click=\"clearLogs\">\n <template #icon><AppIcon icon=\"ph:trash\" :size=\"16\" /></template>\n {{ t('log.clear') }}\n </n-button>\n </template>\n </SmartTable>\n\n <ExportColumnsModal\n v-model:show=\"exportShow\"\n :columns=\"opExportColumns\"\n :loading=\"exporting\"\n @confirm=\"onExport\"\n />\n\n <!-- 详情抽屉:宽档右侧 560,窄档底部抽屉(.st-sheet 由全局样式补圆角与滚动链);没有响应体,只有脱敏后的入参 -->\n <n-drawer\n v-model:show=\"showDetail\"\n :placement=\"isNarrow ? 'bottom' : 'right'\"\n :width=\"isNarrow ? undefined : 'min(560px, 100vw)'\"\n :height=\"isNarrow ? 'auto' : undefined\"\n :class=\"isNarrow ? 'st-sheet' : ''\"\n :style=\"isNarrow ? 'max-height: 85vh' : ''\"\n >\n <n-drawer-content :title=\"t('log.detail')\" closable :native-scrollbar=\"isNarrow\">\n <n-descriptions\n v-if=\"detailRow\"\n label-placement=\"left\"\n :column=\"1\"\n bordered\n size=\"small\"\n label-style=\"width: 96px\"\n >\n <n-descriptions-item :label=\"t('log.opName')\">\n <span class=\"break\">{{ detailRow.title }}</span>\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('log.method')\">\n {{ detailRow.httpMethod }}\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('log.path')\">\n <span class=\"mono break\">{{ detailRow.path }}</span>\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('log.result')\">\n <n-tag :type=\"detailRow.success ? 'success' : 'error'\" size=\"small\" :bordered=\"false\">\n {{ detailRow.success ? t('log.success') : t('log.failed') }}\n </n-tag>\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('log.resultCode')\">\n <span class=\"num\">{{ detailRow.resultCode }}</span>\n </n-descriptions-item>\n <n-descriptions-item v-if=\"detailRow.exceptionMessage\" :label=\"t('log.exception')\">\n <pre class=\"exception\">{{ detailRow.exceptionMessage }}</pre>\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('log.elapsed')\">\n <span class=\"num\">{{ detailRow.elapsedMs }} ms</span>\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('log.operator')\">\n {{ operatorText(detailRow) }}\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('log.ip')\">\n <span class=\"mono\">{{ detailRow.ip || '—' }}</span>\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('log.userAgent')\">\n <span class=\"muted break\">{{ detailRow.userAgent || '—' }}</span>\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('common.createTime')\">\n <span class=\"num\">{{ fmtDateTime(detailRow.createTime) }}</span>\n </n-descriptions-item>\n <n-descriptions-item :label=\"t('log.param')\">\n <CodeBlock v-if=\"detailRow.paramJson\" :code=\"prettyParam(detailRow.paramJson)\" />\n <span v-else>—</span>\n </n-descriptions-item>\n </n-descriptions>\n </n-drawer-content>\n </n-drawer>\n</template>\n\n<style scoped>\n.break {\n word-break: break-all;\n}\n.exception {\n margin: 0;\n white-space: pre-wrap;\n word-break: break-all;\n font-family: var(--font-mono, ui-monospace, monospace);\n font-size: 13px;\n line-height: 1.5;\n color: var(--err, var(--color-danger));\n}\n</style>\n"],"names":["t","useI18n","message","useMessage","confirm","useConfirm","authStore","useAuthStore","tableRef","ref","exportShow","exporting","tableEl","computed","_a","tableWidth","useElementSize","isNarrow","toolbarMore","toolbar","TABLE_TOOLBAR","onMoreSelect","key","opExportColumns","onExport","keys","p","flatSearchOf","filterSerializer","blob","logApi","triggerBlobDownload","e","translateError","createFlatFilterSerializer","operatorOptions","loadOperatorOptions","items","loadWithinServerMax","userApi","u","columns","SEARCH_ACTIONS","h","r","operatorText","fmtDateTime","NButton","openDetail","deriveHeaderFilters","showDetail","detailRow","prettyParam","json","clearLogs","ok","_createVNode","_unref","SmartTable","TABLE_MIN_ROW_HEIGHT","_cache","_withCtx","itemCount","TableTotal","_createBlock","AppIcon","_createTextVNode","ExportColumnsModal","$event","NDrawer","NDrawerContent","NDescriptions","NDescriptionsItem","_createElementVNode","_hoisted_1","_toDisplayString","_hoisted_2","NTag","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","CodeBlock","_openBlock","_createElementBlock"],"mappings":"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"}