smart-admin-web 10.20.1 → 10.22.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 (165) hide show
  1. package/dist/api/index.d.ts +19 -1
  2. package/dist/api/index.js +85 -66
  3. package/dist/api/index.js.map +1 -1
  4. package/dist/api/schema.d.ts +448 -1
  5. package/dist/assets/icons/ph-subset.json.js +1 -1
  6. package/dist/components/FormContainer/index.vue.js +87 -75
  7. package/dist/components/FormContainer/index.vue.js.map +1 -1
  8. package/dist/components/UserPicker/UserAvatar.vue.d.ts +8 -0
  9. package/dist/components/UserPicker/UserAvatar.vue.js +8 -0
  10. package/dist/components/UserPicker/UserAvatar.vue.js.map +1 -0
  11. package/dist/components/UserPicker/UserAvatar2.vue.js +38 -0
  12. package/dist/components/UserPicker/UserAvatar2.vue.js.map +1 -0
  13. package/dist/components/UserPicker/index.vue.js +1 -1
  14. package/dist/components/UserPicker/index2.vue.js +328 -186
  15. package/dist/components/UserPicker/index2.vue.js.map +1 -1
  16. package/dist/composables/authMenuRoute.d.ts +10 -0
  17. package/dist/composables/authMenuRoute.js +39 -23
  18. package/dist/composables/authMenuRoute.js.map +1 -1
  19. package/dist/composables/useModule.d.ts +3 -1
  20. package/dist/composables/useModule.js +44 -32
  21. package/dist/composables/useModule.js.map +1 -1
  22. package/dist/index.js +246 -242
  23. package/dist/layouts/components/SideNav.vue.js +2 -2
  24. package/dist/layouts/components/SideNav2.vue.js.map +1 -1
  25. package/dist/lib/runtime.js +1 -1
  26. package/dist/lib/watermark.d.ts +1 -1
  27. package/dist/locales/en-US.d.ts +68 -3
  28. package/dist/locales/en-US.js +74 -8
  29. package/dist/locales/en-US.js.map +1 -1
  30. package/dist/locales/kernelMenuTitles.js +1 -0
  31. package/dist/locales/kernelMenuTitles.js.map +1 -1
  32. package/dist/locales/zh-CN.d.ts +68 -3
  33. package/dist/locales/zh-CN.js +74 -8
  34. package/dist/locales/zh-CN.js.map +1 -1
  35. package/dist/router/viewRegistry.js +6 -6
  36. package/dist/router/viewRegistry.js.map +1 -1
  37. package/dist/style.css +1 -1
  38. package/dist/theme/naive-theme.js +80 -77
  39. package/dist/theme/naive-theme.js.map +1 -1
  40. package/dist/types/api.d.ts +91 -0
  41. package/dist/types/api.js +17 -15
  42. package/dist/types/api.js.map +1 -1
  43. package/dist/utils/shake.d.ts +1 -0
  44. package/dist/utils/shake.js +30 -0
  45. package/dist/utils/shake.js.map +1 -0
  46. package/dist/utils/tree.d.ts +15 -0
  47. package/dist/utils/tree.js +43 -29
  48. package/dist/utils/tree.js.map +1 -1
  49. package/dist/utils/treeCard.d.ts +6 -0
  50. package/dist/utils/treeCard.js +9 -0
  51. package/dist/utils/treeCard.js.map +1 -0
  52. package/dist/views/error/404.vue.js +2 -2
  53. package/dist/views/error/4042.vue.js +81 -24
  54. package/dist/views/error/4042.vue.js.map +1 -1
  55. package/dist/views/login/LoginForm.vue.js +2 -2
  56. package/dist/views/login/LoginForm2.vue.js +135 -135
  57. package/dist/views/login/LoginForm2.vue.js.map +1 -1
  58. package/dist/views/login/components/LoginDesk.vue.js +2 -2
  59. package/dist/views/login/components/LoginDesk2.vue.js +59 -47
  60. package/dist/views/login/components/LoginDesk2.vue.js.map +1 -1
  61. package/dist/views/login/components/LoginHeroPanel.vue.js +2 -2
  62. package/dist/views/login/components/LoginHeroPanel2.vue.js.map +1 -1
  63. package/dist/views/personal/notice2.vue.js +1 -1
  64. package/dist/views/personal/notice2.vue.js.map +1 -1
  65. package/dist/views/personal/sessions.vue.js +2 -2
  66. package/dist/views/personal/sessions2.vue.js +41 -40
  67. package/dist/views/personal/sessions2.vue.js.map +1 -1
  68. package/dist/views/system/ai-usage/index.vue.js +3 -3
  69. package/dist/views/system/ai-usage/index2.vue.js +13 -12
  70. package/dist/views/system/ai-usage/index2.vue.js.map +1 -1
  71. package/dist/views/system/config/components/AdvancedSection.vue.js +3 -3
  72. package/dist/views/system/config/components/AdvancedSection2.vue.js +2 -1
  73. package/dist/views/system/config/components/AdvancedSection2.vue.js.map +1 -1
  74. package/dist/views/system/dict/index.vue.js +2 -2
  75. package/dist/views/system/dict/index2.vue.js +12 -1
  76. package/dist/views/system/dict/index2.vue.js.map +1 -1
  77. package/dist/views/system/file/index2.vue.js +1 -0
  78. package/dist/views/system/file/index2.vue.js.map +1 -1
  79. package/dist/views/system/job/index.vue.js +3 -3
  80. package/dist/views/system/job/index2.vue.js +182 -181
  81. package/dist/views/system/job/index2.vue.js.map +1 -1
  82. package/dist/views/system/job-log/components/AttemptTable2.vue.js +8 -3
  83. package/dist/views/system/job-log/components/AttemptTable2.vue.js.map +1 -1
  84. package/dist/views/system/job-log/index.vue.js +1 -1
  85. package/dist/views/system/job-log/index2.vue.js +5 -5
  86. package/dist/views/system/job-log/index2.vue.js.map +1 -1
  87. package/dist/views/system/job-monitor/index.vue.js +2 -2
  88. package/dist/views/system/job-monitor/index2.vue.js +46 -46
  89. package/dist/views/system/job-monitor/index2.vue.js.map +1 -1
  90. package/dist/views/system/log/exception/index.vue.js +2 -2
  91. package/dist/views/system/log/exception/index2.vue.js +8 -5
  92. package/dist/views/system/log/exception/index2.vue.js.map +1 -1
  93. package/dist/views/system/log/login/index2.vue.js +21 -12
  94. package/dist/views/system/log/login/index2.vue.js.map +1 -1
  95. package/dist/views/system/log/op/index.vue.js +2 -2
  96. package/dist/views/system/log/op/index2.vue.js +50 -40
  97. package/dist/views/system/log/op/index2.vue.js.map +1 -1
  98. package/dist/views/system/menu/components/ButtonManager.vue.js +2 -2
  99. package/dist/views/system/menu/components/ButtonManager2.vue.js +45 -36
  100. package/dist/views/system/menu/components/ButtonManager2.vue.js.map +1 -1
  101. package/dist/views/system/menu/index.vue.js +1 -1
  102. package/dist/views/system/menu/index2.vue.js +162 -151
  103. package/dist/views/system/menu/index2.vue.js.map +1 -1
  104. package/dist/views/system/module/index.vue.js +1 -1
  105. package/dist/views/system/module/index2.vue.js +171 -117
  106. package/dist/views/system/module/index2.vue.js.map +1 -1
  107. package/dist/views/system/notice/index.vue.js +3 -3
  108. package/dist/views/system/notice/index2.vue.js +1 -0
  109. package/dist/views/system/notice/index2.vue.js.map +1 -1
  110. package/dist/views/system/org/index.vue.js +2 -2
  111. package/dist/views/system/org/index2.vue.js +204 -195
  112. package/dist/views/system/org/index2.vue.js.map +1 -1
  113. package/dist/views/system/position/index.vue.js +2 -2
  114. package/dist/views/system/position/index2.vue.js +57 -48
  115. package/dist/views/system/position/index2.vue.js.map +1 -1
  116. package/dist/views/system/recycle/index.vue.js +1 -1
  117. package/dist/views/system/recycle/index2.vue.js +3 -1
  118. package/dist/views/system/recycle/index2.vue.js.map +1 -1
  119. package/dist/views/system/role/components/GrantMenuSheet.vue.d.ts +2 -0
  120. package/dist/views/system/role/components/GrantMenuSheet.vue.js +2 -2
  121. package/dist/views/system/role/components/GrantMenuSheet2.vue.js +54 -49
  122. package/dist/views/system/role/components/GrantMenuSheet2.vue.js.map +1 -1
  123. package/dist/views/system/role/components/GrantMenuTable.vue.js +1 -1
  124. package/dist/views/system/role/components/GrantMenuTable2.vue.js +159 -195
  125. package/dist/views/system/role/components/GrantMenuTable2.vue.js.map +1 -1
  126. package/dist/views/system/role/components/grantMenuGroups.d.ts +54 -0
  127. package/dist/views/system/role/components/grantMenuGroups.js +116 -76
  128. package/dist/views/system/role/components/grantMenuGroups.js.map +1 -1
  129. package/dist/views/system/role/index.vue.js +2 -2
  130. package/dist/views/system/role/index2.vue.js +152 -145
  131. package/dist/views/system/role/index2.vue.js.map +1 -1
  132. package/dist/views/system/session/index2.vue.js +39 -35
  133. package/dist/views/system/session/index2.vue.js.map +1 -1
  134. package/dist/views/system/user/components/UserGrantEffectiveTable.vue.d.ts +10 -0
  135. package/dist/views/system/user/components/UserGrantEffectiveTable.vue.js +5 -0
  136. package/dist/views/system/user/components/UserGrantEffectiveTable.vue.js.map +1 -0
  137. package/dist/views/system/user/components/UserGrantEffectiveTable2.vue.js +96 -0
  138. package/dist/views/system/user/components/UserGrantEffectiveTable2.vue.js.map +1 -0
  139. package/dist/views/system/user/components/UserGrantMenuSheet.vue.d.ts +13 -0
  140. package/dist/views/system/user/components/UserGrantMenuSheet.vue.js +8 -0
  141. package/dist/views/system/user/components/UserGrantMenuSheet.vue.js.map +1 -0
  142. package/dist/views/system/user/components/UserGrantMenuSheet2.vue.js +216 -0
  143. package/dist/views/system/user/components/UserGrantMenuSheet2.vue.js.map +1 -0
  144. package/dist/views/system/user/components/UserGrantMenuTable.vue.d.ts +13 -0
  145. package/dist/views/system/user/components/UserGrantMenuTable.vue.js +8 -0
  146. package/dist/views/system/user/components/UserGrantMenuTable.vue.js.map +1 -0
  147. package/dist/views/system/user/components/UserGrantMenuTable2.vue.js +186 -0
  148. package/dist/views/system/user/components/UserGrantMenuTable2.vue.js.map +1 -0
  149. package/dist/views/system/user/components/UserGrantNodeRow.vue.d.ts +31 -0
  150. package/dist/views/system/user/components/UserGrantNodeRow.vue.js +8 -0
  151. package/dist/views/system/user/components/UserGrantNodeRow.vue.js.map +1 -0
  152. package/dist/views/system/user/components/UserGrantNodeRow2.vue.js +171 -0
  153. package/dist/views/system/user/components/UserGrantNodeRow2.vue.js.map +1 -0
  154. package/dist/views/system/user/components/UserGrantOverviewDrawer.vue.d.ts +21 -0
  155. package/dist/views/system/user/components/UserGrantOverviewDrawer.vue.js +5 -0
  156. package/dist/views/system/user/components/UserGrantOverviewDrawer.vue.js.map +1 -0
  157. package/dist/views/system/user/components/UserGrantOverviewDrawer2.vue.js +178 -0
  158. package/dist/views/system/user/components/UserGrantOverviewDrawer2.vue.js.map +1 -0
  159. package/dist/views/system/user/components/userGrantState.d.ts +64 -0
  160. package/dist/views/system/user/components/userGrantState.js +117 -0
  161. package/dist/views/system/user/components/userGrantState.js.map +1 -0
  162. package/dist/views/system/user/index.vue.js +2 -2
  163. package/dist/views/system/user/index2.vue.js +369 -295
  164. package/dist/views/system/user/index2.vue.js.map +1 -1
  165. package/package.json +3 -3
@@ -1,8 +1,8 @@
1
1
  import o from "./index2.vue.js";
2
2
  /* empty css */
3
- import t from "../../../_virtual/_plugin-vue_export-helper.js";
4
- const m = /* @__PURE__ */ t(o, [["__scopeId", "data-v-0e60f33e"]]);
3
+ import c from "../../../_virtual/_plugin-vue_export-helper.js";
4
+ const a = /* @__PURE__ */ c(o, [["__scopeId", "data-v-c7cceaec"]]);
5
5
  export {
6
- m as default
6
+ a as default
7
7
  };
8
8
  //# sourceMappingURL=index.vue.js.map
@@ -27,6 +27,7 @@ const $e = { class: "fill-page" }, Be = { class: "notice-actions-editor" }, De =
27
27
  { type: "index", title: () => t("common.rowNo"), width: 64, align: "center" },
28
28
  {
29
29
  key: "title",
30
+ ellipsis: { tooltip: !0 },
30
31
  title: () => t("notice.noticeTitle"),
31
32
  search: { actions: Ce.fuzzy },
32
33
  render: (o) => s("span", { style: "font-weight: 500" }, o.title)
@@ -1 +1 @@
1
- {"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/notice/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 消息通知管理(NoticeController 管理端):发布广播通知 + 分页列表 + 删除。\n// 用户侧(未读角标/我的通知/标记已读)在顶栏铃铛(AppHeader.vue),不在本页。\nimport { computed, h, onMounted, reactive, ref } from 'vue'\nimport {\n NButton,\n NCheckbox,\n NDynamicInput,\n NInput,\n NModal,\n NPopconfirm,\n NForm,\n NFormItem,\n NSelect,\n NTag,\n NSpace,\n NText,\n useMessage,\n type FormInst,\n type FormRules,\n} from 'naive-ui'\nimport { useMediaQuery } from '@vueuse/core'\nimport { useI18n } from 'vue-i18n'\nimport { SmartTable, type SmartTableColumn, type SmartTableInst } from 'smart-naive-table'\nimport AppIcon from '#/components/AppIcon.vue'\nimport FormContainer from '#/components/FormContainer/index.vue'\nimport MarkdownEditor from '#/components/MarkdownEditor/index.vue'\nimport MarkdownView from '#/components/MarkdownEditor/MarkdownView.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { useAuthStore } from '#/stores/auth'\nimport { noticeApi, roleApi, userApi } from '#/api'\nimport {\n NoticeType,\n ReceiverType,\n type NoticeAction,\n type NoticePublishInput,\n type SysNotice,\n} from '#/types/api'\nimport { isSiteRelativeUrl } from '#/lib/noticeActions'\nimport { translateError } from '#/utils/error'\nimport { SEARCH_ACTIONS, deriveHeaderFilters } from '#/utils/tableFilter'\nimport { TABLE_MIN_ROW_HEIGHT, TABLE_TOOLBAR } from '#/utils/tableToolbar'\nimport TableTotal from '#/components/TableTotal/index.vue'\nimport { fmtDateTime } from '#/utils/format'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run } = useConfirm()\nconst authStore = useAuthStore()\nconst tableRef = ref<SmartTableInst<SysNotice>>()\n\nconst typeLabel = (ty: NoticeType) =>\n ty === NoticeType.Announcement\n ? t('notice.typeAnnouncement')\n : ty === NoticeType.Message\n ? t('notice.typeMessage')\n : t('notice.typeNotice')\n// 窄屏:表单标签放上方、选择框通栏(底部抽屉里横排标签太挤);宽 / 中档沿用左标签\nconst narrowForm = useMediaQuery('(max-width: 640px)')\nconst formLayout = computed(() =>\n narrowForm.value\n ? { labelPlacement: 'top' as const, labelWidth: undefined }\n : { labelPlacement: 'left' as const, labelWidth: 80 },\n)\nconst selectStyle = computed(() => (narrowForm.value ? undefined : 'width: 160px'))\n\n/** 列表里的正文摘要:去掉 Markdown 标记,压成一行(只影响展示,存的仍是 Markdown 原文)。 */\nconst brief = (s?: string | null) =>\n (s ?? '')\n .replace(/```/g, '')\n .replace(/[#>*`]/g, '')\n .replace(/!?\\[([^\\]]*)\\]\\([^)]*\\)/g, '$1')\n .replace(/\\s+/g, ' ')\n .trim()\n\nconst tagType = (ty: NoticeType) =>\n ty === NoticeType.Announcement ? 'warning' : ty === NoticeType.Message ? 'success' : 'info'\n\nconst columns: SmartTableColumn<SysNotice>[] = [\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n {\n key: 'title',\n title: () => t('notice.noticeTitle'),\n search: { actions: SEARCH_ACTIONS.fuzzy },\n render: r => h('span', { style: 'font-weight: 500' }, r.title),\n },\n {\n key: 'type',\n title: () => t('notice.type'),\n width: 90,\n render: r =>\n h(NTag, { size: 'small', type: tagType(r.type), bordered: false }, () => typeLabel(r.type)),\n },\n {\n key: 'content',\n title: () => t('notice.content'),\n ellipsis: { tooltip: true },\n render: r => h('span', { class: 'muted' }, brief(r.content)),\n },\n {\n key: 'actionsJson',\n title: () => t('notice.actions'),\n width: 100,\n render: r => {\n const n = actionCount(r.actionsJson)\n return n\n ? h('span', { class: 'muted' }, t('notice.actionCount', { count: n }))\n : h('span', { class: 'faint' }, '—')\n },\n },\n {\n key: 'createTime',\n title: () => t('notice.publishTime'),\n width: 170,\n render: r =>\n h('span', { class: 'num muted', style: 'white-space: nowrap' }, fmtDateTime(r.createTime)),\n },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 140,\n align: 'right',\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(NSpace, { size: 2, justify: 'end', wrapItem: false }, () => [\n h(\n NButton,\n { size: 'small', quaternary: true, type: 'primary', onClick: () => openView(r) },\n () => t('notice.view'),\n ),\n authStore.hasPerm('DELETE:/api/v1/sys/notice/{id}')\n ? h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => noticeApi.remove(r.id), t('notice.deleted')).then(ok => {\n if (ok) tableRef.value?.refresh()\n }),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'error' }, () =>\n t('common.delete'),\n ),\n default: () => t('notice.deleteConfirm', { title: r.title }),\n },\n )\n : null,\n ]),\n },\n]\nderiveHeaderFilters(columns)\n\n// ── 发布弹窗 ──\nconst show = ref(false)\nconst formRef = ref<FormInst | null>(null)\nconst rules: FormRules = {\n title: {\n required: true,\n whitespace: true,\n message: () => t('notice.titleRequired'),\n trigger: ['input', 'blur'],\n },\n receiverIds: {\n // 定向发送必须选接收对象;全体广播无需(validator 读实时 form.receiverType)\n validator: () => form.receiverType === ReceiverType.All || (form.receiverIds?.length ?? 0) > 0,\n message: () => t('notice.receiverRequired'),\n trigger: ['change', 'blur'],\n },\n actions: {\n // 与后端同一条规则:文案非空、站内路径单个 / 开头;服务端仍会再校验一遍(45004)\n validator: () => form.actions.every(a => a.label.trim() && isSiteRelativeUrl(a.url.trim())),\n message: () => t('error.notice.actionInvalid'),\n trigger: ['input', 'blur'],\n },\n}\n// 表单里 actions 恒为数组(n-dynamic-input 不吃 null);提交时空数组不传\ntype PublishForm = Omit<NoticePublishInput, 'actions'> & { actions: NoticeAction[] }\nconst blank = (): PublishForm => ({\n title: '',\n content: '',\n type: NoticeType.Notice,\n receiverType: ReceiverType.All,\n receiverIds: [],\n actions: [],\n})\nconst form = reactive<PublishForm>(blank())\n\n// ── 动作按钮编辑(最多 5 条) ──\nconst MAX_ACTIONS = 5\nconst newAction = (): NoticeAction => ({\n label: '',\n method: 'GET',\n url: '',\n style: 'default',\n confirm: false,\n comment: false,\n})\nconst methodOptions = [\n { label: 'GET', value: 'GET' },\n { label: 'POST', value: 'POST' },\n]\nconst styleOptions = [\n { label: () => t('notice.actionStyleDefault'), value: 'default' },\n { label: () => t('notice.actionStylePrimary'), value: 'primary' },\n { label: () => t('notice.actionStyleError'), value: 'error' },\n]\n/** 管理端列表只展示条数;JSON 坏了按 0 算,不让一行脏数据拖垮整页。 */\nfunction actionCount(json?: string | null): number {\n if (!json) return 0\n try {\n const v: unknown = JSON.parse(json)\n return Array.isArray(v) ? v.length : 0\n } catch {\n return 0\n }\n}\nconst typeOptions = [\n { label: () => t('notice.typeNotice'), value: NoticeType.Notice },\n { label: () => t('notice.typeAnnouncement'), value: NoticeType.Announcement },\n { label: () => t('notice.typeMessage'), value: NoticeType.Message },\n]\nconst receiverTypeOptions = [\n { label: () => t('notice.receiverAll'), value: ReceiverType.All },\n { label: () => t('notice.receiverRole'), value: ReceiverType.Role },\n { label: () => t('notice.receiverUser'), value: ReceiverType.User },\n]\nconst roleOptions = ref<{ label: string; value: number }[]>([])\nconst userOptions = ref<{ label: string; value: number }[]>([])\nconst receiverOptions = computed(() =>\n form.receiverType === ReceiverType.Role\n ? roleOptions.value\n : form.receiverType === ReceiverType.User\n ? userOptions.value\n : [],\n)\n// 接收对象下拉源:各拉一页足量(与用户页同款)。发布弹窗低频,进页面时预取。\nonMounted(async () => {\n try {\n const { items } = await roleApi.page({ page: 1, pageSize: 200 })\n roleOptions.value = items.map(r => ({ label: r.name, value: r.id }))\n } catch {\n /* 静默:角色下拉是配角 */\n }\n try {\n const { items } = await userApi.page({ page: 1, pageSize: 200 })\n userOptions.value = items.map(u => ({ label: `${u.name}(${u.account})`, value: u.id }))\n } catch {\n /* 静默:用户下拉是配角 */\n }\n})\n\nfunction openPublish() {\n Object.assign(form, blank())\n show.value = true\n}\n\n// ── 查看(只读渲染 Markdown 正文)──\nconst showView = ref(false)\nconst viewRow = ref<SysNotice | null>(null)\nfunction openView(r: SysNotice) {\n viewRow.value = r\n showView.value = true\n}\nasync function savePublish() {\n await formRef.value?.validate()\n try {\n // 空列表不传:后端 null 与 [] 同义,但 schema 契约里它是可选字段,别把 [] 当成\"有动作\"\n const actions = form.actions.length ? form.actions : undefined\n await noticeApi.publish({ ...form, actions })\n message.success(t('notice.published'))\n await tableRef.value?.refresh()\n } catch (e) {\n message.error(translateError(e))\n return false\n }\n}\n</script>\n\n<template>\n <!-- .fill-page:高度链在 styles/layout.css,卡片吃满内容区,滚动只发生在表体里。 -->\n <div class=\"fill-page\">\n <SmartTable\n :toolbar=\"TABLE_TOOLBAR\"\n ref=\"tableRef\"\n :columns=\"columns\"\n :fetcher=\"noticeApi.page\"\n :search=\"{ container: 'table' }\"\n fill-height\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n card-on-narrow\n storage-key=\"sys-notice\"\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=\"'POST:/api/v1/sys/notice'\" type=\"primary\" @click=\"openPublish\">\n <template #icon><AppIcon icon=\"ph:megaphone\" :size=\"16\" /></template>\n {{ t('notice.publish') }}\n </n-button>\n </template>\n </SmartTable>\n\n <FormContainer\n v-model:show=\"show\"\n :title=\"t('notice.publishTitle')\"\n :width=\"820\"\n :on-confirm=\"savePublish\"\n :confirm-text=\"t('notice.publish')\"\n >\n <n-form\n ref=\"formRef\"\n :model=\"form\"\n :rules=\"rules\"\n require-mark-placement=\"left\"\n v-bind=\"formLayout\"\n >\n <n-form-item :label=\"t('notice.type')\" required>\n <n-select v-model:value=\"form.type\" :options=\"typeOptions\" :style=\"selectStyle\" />\n </n-form-item>\n <n-form-item :label=\"t('notice.receiver')\" required>\n <n-select\n v-model:value=\"form.receiverType\"\n :options=\"receiverTypeOptions\"\n :style=\"selectStyle\"\n @update:value=\"form.receiverIds = []\"\n />\n </n-form-item>\n <n-form-item\n v-if=\"form.receiverType !== ReceiverType.All\"\n path=\"receiverIds\"\n required\n :label=\"\n form.receiverType === ReceiverType.Role\n ? t('notice.receiverRole')\n : t('notice.receiverUser')\n \"\n >\n <n-select\n v-model:value=\"form.receiverIds\"\n :options=\"receiverOptions\"\n multiple\n filterable\n clearable\n :placeholder=\"t('notice.receiverPlaceholder')\"\n />\n </n-form-item>\n <n-form-item :label=\"t('notice.noticeTitle')\" path=\"title\">\n <n-input v-model:value=\"form.title\" :placeholder=\"t('notice.noticeTitle')\" />\n </n-form-item>\n <n-form-item :label=\"t('notice.content')\">\n <MarkdownEditor v-model:value=\"form.content\" />\n </n-form-item>\n <n-form-item :label=\"t('notice.actions')\" path=\"actions\">\n <div class=\"notice-actions-editor\">\n <n-dynamic-input\n v-model:value=\"form.actions\"\n :max=\"MAX_ACTIONS\"\n :on-create=\"newAction\"\n item-style=\"margin-bottom: 8px\"\n >\n <template #default=\"{ value }\">\n <div class=\"notice-action-row\">\n <n-input\n v-model:value=\"value.label\"\n :placeholder=\"t('notice.actionLabel')\"\n class=\"act-label\"\n />\n <n-select\n v-model:value=\"value.method\"\n :options=\"methodOptions\"\n style=\"width: 96px\"\n />\n <n-input\n v-model:value=\"value.url\"\n :placeholder=\"t('notice.actionUrl')\"\n class=\"act-url mono\"\n />\n <n-select\n v-model:value=\"value.style\"\n :options=\"styleOptions\"\n style=\"width: 96px\"\n />\n <n-checkbox v-model:checked=\"value.confirm\">\n {{ t('notice.actionNeedConfirm') }}\n </n-checkbox>\n <n-checkbox v-model:checked=\"value.comment\">\n {{ t('notice.actionNeedComment') }}\n </n-checkbox>\n </div>\n </template>\n <template #create-button-default>{{ t('notice.actionAdd') }}</template>\n </n-dynamic-input>\n <n-text depth=\"3\" class=\"notice-actions-hint\">{{ t('notice.actionsHint') }}</n-text>\n </div>\n </n-form-item>\n </n-form>\n </FormContainer>\n\n <n-modal\n v-model:show=\"showView\"\n preset=\"card\"\n :title=\"viewRow?.title || t('notice.detailTitle')\"\n :bordered=\"false\"\n :segmented=\"{ content: true }\"\n style=\"width: 720px; max-width: 92vw\"\n >\n <MarkdownView :value=\"viewRow?.content\" />\n </n-modal>\n </div>\n</template>\n\n<style scoped>\n.notice-actions-editor {\n width: 100%;\n}\n.notice-action-row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n width: 100%;\n}\n.notice-actions-hint {\n display: block;\n margin-top: 8px;\n font-size: 13px;\n line-height: 1.6;\n}\n.act-label {\n width: 150px;\n}\n.act-url {\n flex: 1;\n min-width: 180px;\n}\n/* 窄屏:文案与地址各占一整行,其余控件折到下面 */\n@media (max-width: 640px) {\n .act-label,\n .act-url {\n flex: 1 1 100%;\n width: auto;\n }\n}\n\n/* 辅助字样(表格单元格由库渲染,用 :deep;表单里的输入框是自己的元素,直接命中) */\n.mono,\n:deep(.mono) {\n font-family: var(--font-mono);\n font-size: 13.5px;\n letter-spacing: 0;\n}\n:deep(.muted) {\n color: var(--text-2);\n}\n:deep(.faint) {\n color: var(--text-3);\n}\n:deep(.num) {\n font-variant-numeric: tabular-nums;\n}\n</style>\n"],"names":["MAX_ACTIONS","useI18n","message","useMessage","run","useConfirm","authStore","useAuthStore","tableRef","ref","typeLabel","ty","NoticeType","narrowForm","useMediaQuery","formLayout","computed","selectStyle","brief","s","tagType","columns","SEARCH_ACTIONS","h","r","NTag","n","actionCount","fmtDateTime","NSpace","NButton","openView","NPopconfirm","noticeApi","ok","_a","deriveHeaderFilters","show","formRef","rules","form","ReceiverType","a","isSiteRelativeUrl","blank","reactive","newAction","methodOptions","styleOptions","json","v","typeOptions","receiverTypeOptions","roleOptions","userOptions","receiverOptions","onMounted","items","roleApi","userApi","u","openPublish","showView","viewRow","savePublish","actions","_b","e","translateError","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","SmartTable","TABLE_TOOLBAR","TABLE_MIN_ROW_HEIGHT","_cache","_withCtx","itemCount","TableTotal","_createBlock","AppIcon","_createTextVNode","FormContainer","$event","_mergeProps","NFormItem","NSelect","NInput","MarkdownEditor","_createElementVNode","_hoisted_2","NDynamicInput","value","_hoisted_3","NCheckbox","NText","NModal","MarkdownView"],"mappings":"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"}
1
+ {"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/notice/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 消息通知管理(NoticeController 管理端):发布广播通知 + 分页列表 + 删除。\n// 用户侧(未读角标/我的通知/标记已读)在顶栏铃铛(AppHeader.vue),不在本页。\nimport { computed, h, onMounted, reactive, ref } from 'vue'\nimport {\n NButton,\n NCheckbox,\n NDynamicInput,\n NInput,\n NModal,\n NPopconfirm,\n NForm,\n NFormItem,\n NSelect,\n NTag,\n NSpace,\n NText,\n useMessage,\n type FormInst,\n type FormRules,\n} from 'naive-ui'\nimport { useMediaQuery } from '@vueuse/core'\nimport { useI18n } from 'vue-i18n'\nimport { SmartTable, type SmartTableColumn, type SmartTableInst } from 'smart-naive-table'\nimport AppIcon from '#/components/AppIcon.vue'\nimport FormContainer from '#/components/FormContainer/index.vue'\nimport MarkdownEditor from '#/components/MarkdownEditor/index.vue'\nimport MarkdownView from '#/components/MarkdownEditor/MarkdownView.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { useAuthStore } from '#/stores/auth'\nimport { noticeApi, roleApi, userApi } from '#/api'\nimport {\n NoticeType,\n ReceiverType,\n type NoticeAction,\n type NoticePublishInput,\n type SysNotice,\n} from '#/types/api'\nimport { isSiteRelativeUrl } from '#/lib/noticeActions'\nimport { translateError } from '#/utils/error'\nimport { SEARCH_ACTIONS, deriveHeaderFilters } from '#/utils/tableFilter'\nimport { TABLE_MIN_ROW_HEIGHT, TABLE_TOOLBAR } from '#/utils/tableToolbar'\nimport TableTotal from '#/components/TableTotal/index.vue'\nimport { fmtDateTime } from '#/utils/format'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run } = useConfirm()\nconst authStore = useAuthStore()\nconst tableRef = ref<SmartTableInst<SysNotice>>()\n\nconst typeLabel = (ty: NoticeType) =>\n ty === NoticeType.Announcement\n ? t('notice.typeAnnouncement')\n : ty === NoticeType.Message\n ? t('notice.typeMessage')\n : t('notice.typeNotice')\n// 窄屏:表单标签放上方、选择框通栏(底部抽屉里横排标签太挤);宽 / 中档沿用左标签\nconst narrowForm = useMediaQuery('(max-width: 640px)')\nconst formLayout = computed(() =>\n narrowForm.value\n ? { labelPlacement: 'top' as const, labelWidth: undefined }\n : { labelPlacement: 'left' as const, labelWidth: 80 },\n)\nconst selectStyle = computed(() => (narrowForm.value ? undefined : 'width: 160px'))\n\n/** 列表里的正文摘要:去掉 Markdown 标记,压成一行(只影响展示,存的仍是 Markdown 原文)。 */\nconst brief = (s?: string | null) =>\n (s ?? '')\n .replace(/```/g, '')\n .replace(/[#>*`]/g, '')\n .replace(/!?\\[([^\\]]*)\\]\\([^)]*\\)/g, '$1')\n .replace(/\\s+/g, ' ')\n .trim()\n\nconst tagType = (ty: NoticeType) =>\n ty === NoticeType.Announcement ? 'warning' : ty === NoticeType.Message ? 'success' : 'info'\n\nconst columns: SmartTableColumn<SysNotice>[] = [\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n {\n key: 'title',\n ellipsis: { tooltip: true },\n title: () => t('notice.noticeTitle'),\n search: { actions: SEARCH_ACTIONS.fuzzy },\n render: r => h('span', { style: 'font-weight: 500' }, r.title),\n },\n {\n key: 'type',\n title: () => t('notice.type'),\n width: 90,\n render: r =>\n h(NTag, { size: 'small', type: tagType(r.type), bordered: false }, () => typeLabel(r.type)),\n },\n {\n key: 'content',\n title: () => t('notice.content'),\n ellipsis: { tooltip: true },\n render: r => h('span', { class: 'muted' }, brief(r.content)),\n },\n {\n key: 'actionsJson',\n title: () => t('notice.actions'),\n width: 100,\n render: r => {\n const n = actionCount(r.actionsJson)\n return n\n ? h('span', { class: 'muted' }, t('notice.actionCount', { count: n }))\n : h('span', { class: 'faint' }, '—')\n },\n },\n {\n key: 'createTime',\n title: () => t('notice.publishTime'),\n width: 170,\n render: r =>\n h('span', { class: 'num muted', style: 'white-space: nowrap' }, fmtDateTime(r.createTime)),\n },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 140,\n align: 'right',\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(NSpace, { size: 2, justify: 'end', wrapItem: false }, () => [\n h(\n NButton,\n { size: 'small', quaternary: true, type: 'primary', onClick: () => openView(r) },\n () => t('notice.view'),\n ),\n authStore.hasPerm('DELETE:/api/v1/sys/notice/{id}')\n ? h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => noticeApi.remove(r.id), t('notice.deleted')).then(ok => {\n if (ok) tableRef.value?.refresh()\n }),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'error' }, () =>\n t('common.delete'),\n ),\n default: () => t('notice.deleteConfirm', { title: r.title }),\n },\n )\n : null,\n ]),\n },\n]\nderiveHeaderFilters(columns)\n\n// ── 发布弹窗 ──\nconst show = ref(false)\nconst formRef = ref<FormInst | null>(null)\nconst rules: FormRules = {\n title: {\n required: true,\n whitespace: true,\n message: () => t('notice.titleRequired'),\n trigger: ['input', 'blur'],\n },\n receiverIds: {\n // 定向发送必须选接收对象;全体广播无需(validator 读实时 form.receiverType)\n validator: () => form.receiverType === ReceiverType.All || (form.receiverIds?.length ?? 0) > 0,\n message: () => t('notice.receiverRequired'),\n trigger: ['change', 'blur'],\n },\n actions: {\n // 与后端同一条规则:文案非空、站内路径单个 / 开头;服务端仍会再校验一遍(45004)\n validator: () => form.actions.every(a => a.label.trim() && isSiteRelativeUrl(a.url.trim())),\n message: () => t('error.notice.actionInvalid'),\n trigger: ['input', 'blur'],\n },\n}\n// 表单里 actions 恒为数组(n-dynamic-input 不吃 null);提交时空数组不传\ntype PublishForm = Omit<NoticePublishInput, 'actions'> & { actions: NoticeAction[] }\nconst blank = (): PublishForm => ({\n title: '',\n content: '',\n type: NoticeType.Notice,\n receiverType: ReceiverType.All,\n receiverIds: [],\n actions: [],\n})\nconst form = reactive<PublishForm>(blank())\n\n// ── 动作按钮编辑(最多 5 条) ──\nconst MAX_ACTIONS = 5\nconst newAction = (): NoticeAction => ({\n label: '',\n method: 'GET',\n url: '',\n style: 'default',\n confirm: false,\n comment: false,\n})\nconst methodOptions = [\n { label: 'GET', value: 'GET' },\n { label: 'POST', value: 'POST' },\n]\nconst styleOptions = [\n { label: () => t('notice.actionStyleDefault'), value: 'default' },\n { label: () => t('notice.actionStylePrimary'), value: 'primary' },\n { label: () => t('notice.actionStyleError'), value: 'error' },\n]\n/** 管理端列表只展示条数;JSON 坏了按 0 算,不让一行脏数据拖垮整页。 */\nfunction actionCount(json?: string | null): number {\n if (!json) return 0\n try {\n const v: unknown = JSON.parse(json)\n return Array.isArray(v) ? v.length : 0\n } catch {\n return 0\n }\n}\nconst typeOptions = [\n { label: () => t('notice.typeNotice'), value: NoticeType.Notice },\n { label: () => t('notice.typeAnnouncement'), value: NoticeType.Announcement },\n { label: () => t('notice.typeMessage'), value: NoticeType.Message },\n]\nconst receiverTypeOptions = [\n { label: () => t('notice.receiverAll'), value: ReceiverType.All },\n { label: () => t('notice.receiverRole'), value: ReceiverType.Role },\n { label: () => t('notice.receiverUser'), value: ReceiverType.User },\n]\nconst roleOptions = ref<{ label: string; value: number }[]>([])\nconst userOptions = ref<{ label: string; value: number }[]>([])\nconst receiverOptions = computed(() =>\n form.receiverType === ReceiverType.Role\n ? roleOptions.value\n : form.receiverType === ReceiverType.User\n ? userOptions.value\n : [],\n)\n// 接收对象下拉源:各拉一页足量(与用户页同款)。发布弹窗低频,进页面时预取。\nonMounted(async () => {\n try {\n const { items } = await roleApi.page({ page: 1, pageSize: 200 })\n roleOptions.value = items.map(r => ({ label: r.name, value: r.id }))\n } catch {\n /* 静默:角色下拉是配角 */\n }\n try {\n const { items } = await userApi.page({ page: 1, pageSize: 200 })\n userOptions.value = items.map(u => ({ label: `${u.name}(${u.account})`, value: u.id }))\n } catch {\n /* 静默:用户下拉是配角 */\n }\n})\n\nfunction openPublish() {\n Object.assign(form, blank())\n show.value = true\n}\n\n// ── 查看(只读渲染 Markdown 正文)──\nconst showView = ref(false)\nconst viewRow = ref<SysNotice | null>(null)\nfunction openView(r: SysNotice) {\n viewRow.value = r\n showView.value = true\n}\nasync function savePublish() {\n await formRef.value?.validate()\n try {\n // 空列表不传:后端 null 与 [] 同义,但 schema 契约里它是可选字段,别把 [] 当成\"有动作\"\n const actions = form.actions.length ? form.actions : undefined\n await noticeApi.publish({ ...form, actions })\n message.success(t('notice.published'))\n await tableRef.value?.refresh()\n } catch (e) {\n message.error(translateError(e))\n return false\n }\n}\n</script>\n\n<template>\n <!-- .fill-page:高度链在 styles/layout.css,卡片吃满内容区,滚动只发生在表体里。 -->\n <div class=\"fill-page\">\n <SmartTable\n :toolbar=\"TABLE_TOOLBAR\"\n ref=\"tableRef\"\n :columns=\"columns\"\n :fetcher=\"noticeApi.page\"\n :search=\"{ container: 'table' }\"\n fill-height\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n card-on-narrow\n storage-key=\"sys-notice\"\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=\"'POST:/api/v1/sys/notice'\" type=\"primary\" @click=\"openPublish\">\n <template #icon><AppIcon icon=\"ph:megaphone\" :size=\"16\" /></template>\n {{ t('notice.publish') }}\n </n-button>\n </template>\n </SmartTable>\n\n <FormContainer\n v-model:show=\"show\"\n :title=\"t('notice.publishTitle')\"\n :width=\"820\"\n :on-confirm=\"savePublish\"\n :confirm-text=\"t('notice.publish')\"\n >\n <n-form\n ref=\"formRef\"\n :model=\"form\"\n :rules=\"rules\"\n require-mark-placement=\"left\"\n v-bind=\"formLayout\"\n >\n <n-form-item :label=\"t('notice.type')\" required>\n <n-select v-model:value=\"form.type\" :options=\"typeOptions\" :style=\"selectStyle\" />\n </n-form-item>\n <n-form-item :label=\"t('notice.receiver')\" required>\n <n-select\n v-model:value=\"form.receiverType\"\n :options=\"receiverTypeOptions\"\n :style=\"selectStyle\"\n @update:value=\"form.receiverIds = []\"\n />\n </n-form-item>\n <n-form-item\n v-if=\"form.receiverType !== ReceiverType.All\"\n path=\"receiverIds\"\n required\n :label=\"\n form.receiverType === ReceiverType.Role\n ? t('notice.receiverRole')\n : t('notice.receiverUser')\n \"\n >\n <n-select\n v-model:value=\"form.receiverIds\"\n :options=\"receiverOptions\"\n multiple\n filterable\n clearable\n :placeholder=\"t('notice.receiverPlaceholder')\"\n />\n </n-form-item>\n <n-form-item :label=\"t('notice.noticeTitle')\" path=\"title\">\n <n-input v-model:value=\"form.title\" :placeholder=\"t('notice.noticeTitle')\" />\n </n-form-item>\n <n-form-item :label=\"t('notice.content')\">\n <MarkdownEditor v-model:value=\"form.content\" />\n </n-form-item>\n <n-form-item :label=\"t('notice.actions')\" path=\"actions\">\n <div class=\"notice-actions-editor\">\n <n-dynamic-input\n v-model:value=\"form.actions\"\n :max=\"MAX_ACTIONS\"\n :on-create=\"newAction\"\n item-style=\"margin-bottom: 8px\"\n >\n <template #default=\"{ value }\">\n <div class=\"notice-action-row\">\n <n-input\n v-model:value=\"value.label\"\n :placeholder=\"t('notice.actionLabel')\"\n class=\"act-label\"\n />\n <n-select\n v-model:value=\"value.method\"\n :options=\"methodOptions\"\n style=\"width: 96px\"\n />\n <n-input\n v-model:value=\"value.url\"\n :placeholder=\"t('notice.actionUrl')\"\n class=\"act-url mono\"\n />\n <n-select\n v-model:value=\"value.style\"\n :options=\"styleOptions\"\n style=\"width: 96px\"\n />\n <n-checkbox v-model:checked=\"value.confirm\">\n {{ t('notice.actionNeedConfirm') }}\n </n-checkbox>\n <n-checkbox v-model:checked=\"value.comment\">\n {{ t('notice.actionNeedComment') }}\n </n-checkbox>\n </div>\n </template>\n <template #create-button-default>{{ t('notice.actionAdd') }}</template>\n </n-dynamic-input>\n <n-text depth=\"3\" class=\"notice-actions-hint\">{{ t('notice.actionsHint') }}</n-text>\n </div>\n </n-form-item>\n </n-form>\n </FormContainer>\n\n <n-modal\n v-model:show=\"showView\"\n preset=\"card\"\n :title=\"viewRow?.title || t('notice.detailTitle')\"\n :bordered=\"false\"\n :segmented=\"{ content: true }\"\n style=\"width: 720px; max-width: 92vw\"\n >\n <MarkdownView :value=\"viewRow?.content\" />\n </n-modal>\n </div>\n</template>\n\n<style scoped>\n.notice-actions-editor {\n width: 100%;\n}\n.notice-action-row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n width: 100%;\n}\n.notice-actions-hint {\n display: block;\n margin-top: 8px;\n font-size: 13px;\n line-height: 1.6;\n}\n.act-label {\n width: 150px;\n}\n.act-url {\n flex: 1;\n min-width: 180px;\n}\n/* 窄屏:文案与地址各占一整行,其余控件折到下面 */\n@media (max-width: 640px) {\n .act-label,\n .act-url {\n flex: 1 1 100%;\n width: auto;\n }\n}\n\n/* 辅助字样(表格单元格由库渲染,用 :deep;表单里的输入框是自己的元素,直接命中) */\n.mono,\n:deep(.mono) {\n font-family: var(--font-mono);\n font-size: 13.5px;\n letter-spacing: 0;\n}\n:deep(.muted) {\n color: var(--text-2);\n}\n:deep(.faint) {\n color: var(--text-3);\n}\n:deep(.num) {\n font-variant-numeric: tabular-nums;\n}\n</style>\n"],"names":["MAX_ACTIONS","useI18n","message","useMessage","run","useConfirm","authStore","useAuthStore","tableRef","ref","typeLabel","ty","NoticeType","narrowForm","useMediaQuery","formLayout","computed","selectStyle","brief","s","tagType","columns","SEARCH_ACTIONS","h","r","NTag","n","actionCount","fmtDateTime","NSpace","NButton","openView","NPopconfirm","noticeApi","ok","_a","deriveHeaderFilters","show","formRef","rules","form","ReceiverType","a","isSiteRelativeUrl","blank","reactive","newAction","methodOptions","styleOptions","json","v","typeOptions","receiverTypeOptions","roleOptions","userOptions","receiverOptions","onMounted","items","roleApi","userApi","u","openPublish","showView","viewRow","savePublish","actions","_b","e","translateError","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","SmartTable","TABLE_TOOLBAR","TABLE_MIN_ROW_HEIGHT","_cache","_withCtx","itemCount","TableTotal","_createBlock","AppIcon","_createTextVNode","FormContainer","$event","_mergeProps","NFormItem","NSelect","NInput","MarkdownEditor","_createElementVNode","_hoisted_2","NDynamicInput","value","_hoisted_3","NCheckbox","NText","NModal","MarkdownView"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import o from "./index2.vue.js";
2
2
  /* empty css */
3
3
  import t from "../../../_virtual/_plugin-vue_export-helper.js";
4
- const m = /* @__PURE__ */ t(o, [["__scopeId", "data-v-9e192f12"]]);
4
+ const _ = /* @__PURE__ */ t(o, [["__scopeId", "data-v-23065335"]]);
5
5
  export {
6
- m as default
6
+ _ as default
7
7
  };
8
8
  //# sourceMappingURL=index.vue.js.map