smart-admin-web 10.12.0 → 10.12.2

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 (37) hide show
  1. package/dist/api/index.d.ts +13 -1
  2. package/dist/api/index.js +25 -13
  3. package/dist/api/index.js.map +1 -1
  4. package/dist/api/schema.d.ts +360 -3
  5. package/dist/assets/icons/ph-subset.json.js +1 -1
  6. package/dist/lib/runtime.js +1 -1
  7. package/dist/locales/en-US.d.ts +13 -1
  8. package/dist/locales/en-US.js +15 -3
  9. package/dist/locales/en-US.js.map +1 -1
  10. package/dist/locales/zh-CN.d.ts +13 -1
  11. package/dist/locales/zh-CN.js +15 -3
  12. package/dist/locales/zh-CN.js.map +1 -1
  13. package/dist/router/index.js +18 -13
  14. package/dist/router/index.js.map +1 -1
  15. package/dist/router/viewRegistry.js +1 -1
  16. package/dist/router/viewRegistry.js.map +1 -1
  17. package/dist/style.css +1 -1
  18. package/dist/types/api.d.ts +26 -0
  19. package/dist/types/api.js.map +1 -1
  20. package/dist/views/dashboard/ShortcutPicker.vue.d.ts +16 -0
  21. package/dist/views/dashboard/ShortcutPicker.vue.js +8 -0
  22. package/dist/views/dashboard/ShortcutPicker.vue.js.map +1 -0
  23. package/dist/views/dashboard/ShortcutPicker2.vue.js +86 -0
  24. package/dist/views/dashboard/ShortcutPicker2.vue.js.map +1 -0
  25. package/dist/views/dashboard/biz.vue.js +2 -2
  26. package/dist/views/dashboard/biz2.vue.js +265 -93
  27. package/dist/views/dashboard/biz2.vue.js.map +1 -1
  28. package/dist/views/dashboard/onlineDuration.d.ts +5 -0
  29. package/dist/views/dashboard/onlineDuration.js +8 -0
  30. package/dist/views/dashboard/onlineDuration.js.map +1 -0
  31. package/dist/views/dashboard/shortcutGroups.d.ts +18 -0
  32. package/dist/views/dashboard/shortcutGroups.js +19 -0
  33. package/dist/views/dashboard/shortcutGroups.js.map +1 -0
  34. package/dist/views/system/user/index.vue.js +2 -2
  35. package/dist/views/system/user/index2.vue.js +281 -211
  36. package/dist/views/system/user/index2.vue.js.map +1 -1
  37. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/user/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 用户管理(写侧)= SmartTable(列表/搜索/分页)+ UserFormModal(新增/编辑)+ ResetPasswordModal(重置/初始口令展示)+ 专用启停端点。\n// 超管行(isSuperAdmin)删除/停用置灰防自锁;启停走专用 setEnabled(非全量 update)。\n// 导入导出:ImportWizard 四步向导 + ExportColumnsModal 选列导出(带当前筛选)。\nimport { computed, h, onMounted, ref, watch } from 'vue'\nimport { useRoute } from 'vue-router'\nimport {\n NButton,\n NCard,\n NTree,\n NSpace,\n NTag,\n NAvatar,\n NPopconfirm,\n NDropdown,\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 StatusSwitch from '#/components/StatusSwitch/index.vue'\nimport DictTag from '#/components/DictTag/index.vue'\nimport ImportWizard, { type ImportWizardApi } from '#/components/ImportWizard/index.vue'\nimport ExportColumnsModal from '#/components/ExportColumnsModal/index.vue'\nimport UserFormModal from './components/UserFormModal.vue'\nimport ResetPasswordModal from './components/ResetPasswordModal.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { useBatchDelete } from '#/composables/useBatchDelete'\nimport { mfaApi, userApi, positionApi, roleApi, orgApi } from '#/api'\nimport { useAuthStore } from '#/stores/auth'\nimport { translateError } from '#/utils/error'\nimport { triggerBlobDownload } from '#/utils/download'\nimport { buildTree, type Tree } from '#/utils/tree'\nimport type { ExportColumnDef, SysOrg, UserItem } from '#/types/api'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run, confirm } = useConfirm()\nconst authStore = useAuthStore()\nconst tableRef = ref<SmartTableInst<UserItem>>()\nconst {\n checkedKeys,\n hasSelection,\n run: batchDelete,\n} = useBatchDelete({\n remove: userApi.batchRemove,\n refresh: () => tableRef.value?.refresh(),\n successMsg: t('user.deleted'),\n})\n\n// 新增/编辑弹窗 + 重置密码弹窗(表单/校验/保存均在各自组件内,父页只传下拉选项 + 收 saved/passwordGenerated)。\nconst userFormRef = ref<InstanceType<typeof UserFormModal> | null>(null)\nconst resetModalRef = ref<InstanceType<typeof ResetPasswordModal> | null>(null)\n\nconst clearMfaLoading = ref(false)\n\nasync function clearUserMfa(user: UserItem) {\n clearMfaLoading.value = true\n try {\n const ok = await confirm({\n content: t('user.clearMfaConfirm', { name: user.name }),\n action: () => mfaApi.clear({ userId: user.id }),\n successMsg: t('user.mfaCleared'),\n })\n if (ok) tableRef.value?.refresh()\n } finally {\n clearMfaLoading.value = false\n }\n}\n\n// 职位/角色/主管下拉:各拉一页足量。ponytail: 200 覆盖绝大多数系统;真超再上分页搜索。\n// roleOptions 一份两用:既喂编辑弹窗,也当列表页「角色」搜索项的选项源(SmartTable 支持 Ref 选项源)。\nconst positionOptions = ref<{ label: string; value: number }[]>([])\nconst roleOptions = ref<{ label: string; value: number }[]>([])\nconst directorOptions = ref<{ label: string; value: number }[]>([])\n// 左侧机构树筛选:选中节点即按其机构过滤用户;params 深监听联动 SmartTable(回第 1 页重查)。\nconst orgTree = ref<Tree<SysOrg>[]>([])\nconst selectedOrgId = ref<number | null>(null)\nconst tableParams = computed(() =>\n selectedOrgId.value == null ? {} : { orgId: selectedOrgId.value },\n)\nfunction onOrgSelect(keys: (string | number)[]) {\n // 再点选中项 → 取消选中 → 恢复全部\n selectedOrgId.value = keys.length ? Number(keys[0]) : null\n}\nonMounted(async () => {\n try {\n const { items } = await positionApi.page({ page: 1, pageSize: 200 })\n positionOptions.value = items.map(p => ({ label: p.name, value: p.id }))\n } catch {\n // 静默:职位是配角,不打断列表\n }\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 // 主管候选就是用户自身;拉一页足量作下拉源(允许把某用户选为自己主管,后台系统无害,不加环检)\n const { items } = await userApi.page({ page: 1, pageSize: 200 })\n directorOptions.value = items.map(u => ({ label: `${u.name}(${u.account})`, value: u.id }))\n } catch {\n // 静默:主管下拉是配角,拉取失败不打断列表\n }\n try {\n orgTree.value = buildTree(await orgApi.list())\n } catch {\n // 静默:机构树是筛选辅助,拉取失败不打断列表\n }\n})\n\n// 角色反查:角色页「查看用户」跳这里并带 ?roleId=。\n// 必须 watch 而非 onMounted:标签页按 path 做主键且页面被 keep-alive,本页标签已开着时再跳一次只换 query,\n// 组件实例被复用、onMounted 不会再触发。\n// 同时把 tableRef 一起纳入监听源:immediate 在 setup 期求值,那时表格实例还没挂上(ref 为空),\n// 只听 query 的话冷启动这一路会静默失效——实例就绪时这条 watch 会再触发一次,把筛选补上。\nconst route = useRoute()\nwatch(\n [tableRef, () => route.query.roleId],\n ([inst, roleId]) => {\n if (!inst) return\n const next = roleId == null ? undefined : Number(roleId)\n if (inst.params.roleId === next) return // 防抖:实例就绪与 query 变化可能各触发一次\n inst.params.roleId = next\n inst.search() // 回第 1 页重查\n },\n { immediate: true },\n)\n\n// 头像首字母兜底。NAvatar 的规矩:default 插槽一有内容就渲染它、彻底无视 src(见 naive Avatar.render)。\n// 所以有头像时 default 必须留空让 <img> 出来,首字母只放 #fallback(图挂了/链过期才兜底);无头像才用 default 当文字头像。\nconst initial = (name?: string | null) => (name || '?').slice(0, 1)\n\n// ── 导入 / 导出 ──\nconst importShow = ref(false)\nconst exportShow = ref(false)\nconst exporting = ref(false)\n\n/** 与后端 UserExportProfile.Columns 对齐(前端无列清单端点,照档案硬编码)。 */\nconst userExportColumns: ExportColumnDef[] = [\n { key: 'Account', title: t('userExport.account') },\n { key: 'Name', title: t('userExport.name') },\n { key: 'Nickname', title: t('userExport.nickname') },\n { key: 'Phone', title: t('userExport.phone') },\n { key: 'Email', title: t('userExport.email') },\n { key: 'Gender', title: t('userExport.gender') },\n { key: 'OrgName', title: t('userExport.orgName') },\n { key: 'PositionName', title: t('userExport.positionName') },\n { key: 'DirectorName', title: t('userExport.directorName') },\n { key: 'Enabled', title: t('userExport.enabled') },\n { key: 'IsSuperAdmin', title: t('userExport.superAdmin'), defaultSelected: false },\n { key: 'CreateTime', title: t('userExport.createTime') },\n]\n\nconst userImportApi: ImportWizardApi = {\n downloadTemplate: () => userApi.importTemplate(),\n preview: (file, mapping) => userApi.importPreview(file, mapping),\n validate: rows => userApi.importValidate(rows),\n commit: (rows, strategy) => userApi.importCommit(rows, strategy),\n errorReport: rows => userApi.importErrorReport(rows),\n}\n\n/** 导出:带当前 SmartTable 筛选(含左侧机构树 orgId)+ 选中列。 */\nasync function onExport(keys: string[]) {\n const p = tableRef.value?.params ?? {}\n exporting.value = true\n try {\n const blob = await userApi.export({\n account: p.account || undefined,\n name: p.name || undefined,\n orgId: p.orgId != null ? Number(p.orgId) : undefined,\n roleId: p.roleId != null ? Number(p.roleId) : undefined,\n sortField: p.sortField || undefined,\n sortOrder: p.sortOrder || undefined,\n columns: keys.join(','),\n })\n triggerBlobDownload(blob, t('userExport.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<UserItem>[] = [\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n // 超管行禁勾:批量删除同样不可含超管(后端也会整体拒绝)\n { type: 'selection', disabled: (r: UserItem) => r.isSuperAdmin },\n {\n key: 'avatar',\n title: () => t('user.avatar'),\n width: 64,\n align: 'center',\n hideInSetting: false,\n render: r =>\n h(\n NAvatar,\n { round: true, size: 'small', src: r.avatar || undefined },\n r.avatar ? { fallback: () => initial(r.name) } : { default: () => initial(r.name) },\n ),\n },\n { key: 'account', title: () => t('user.account'), search: true, sorter: true },\n { key: 'name', title: () => t('user.name'), search: true },\n { key: 'phone', title: () => t('user.phone'), render: r => r.phone || '—' },\n {\n key: 'gender',\n title: () => t('user.gender'),\n width: 80,\n hideInTable: true, // 次要列:默认隐藏收窄整表,列设置抽屉可打开\n render: r => (r.gender ? h(DictTag, { typeCode: 'gender', value: r.gender }) : '—'),\n },\n // 只作搜索项,不进表格也不进列设置。options 直接吃编辑表单已拉好的 roleOptions(SmartTable 支持 Ref 选项源),不额外发请求;\n // 列上有 options,搜索控件自动是 select。\n {\n key: 'roleId',\n title: () => t('user.roles'),\n hideInTable: true,\n options: roleOptions,\n search: { props: { clearable: true } },\n },\n { key: 'orgName', title: () => t('user.org'), render: r => r.orgName || '—' },\n {\n key: 'positionName',\n title: () => t('user.position'),\n hideInTable: true,\n render: r => r.positionName || '—',\n },\n {\n key: 'enabled',\n title: () => t('user.status'),\n width: 90,\n render: r =>\n h(StatusSwitch, {\n value: r.enabled,\n // 超管不可停用(防自锁 —— 停了就没法从 UI 恢复;后端也保护);无启停权限亦置灰。\n disabled: r.isSuperAdmin || !authStore.hasPerm('PUT:/api/v1/sys/user/{id}/enabled'),\n confirm: (next: boolean) => (next ? null : t('user.disableConfirm', { name: r.name })),\n request: (next: boolean) => userApi.setEnabled(r.id, next),\n 'onUpdate:value': (v: boolean) => {\n r.enabled = v\n },\n }),\n },\n {\n key: 'isSuperAdmin',\n title: () => t('user.superAdmin'),\n width: 90,\n render: r =>\n r.isSuperAdmin\n ? h(NTag, { type: 'warning', size: 'small', bordered: false }, () => t('user.superAdmin'))\n : '—',\n },\n { key: 'createTime', title: () => t('user.createTime'), format: 'datetime', sorter: true },\n // 操作:编辑/删除外露;重置密码、解绑验证器进「更多」(放操作列末尾)。\n // width 须够「编辑+删除+更多」单行;wrap:false 禁止 NSpace 默认换行(否则「更多」掉到删除下一行)。\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 200,\n fixed: 'right', // 钉右:横向滚动时操作列始终可见\n hideInSetting: true,\n render: r => {\n const moreOptions = [\n authStore.hasPerm('PUT:/api/v1/sys/user/{id}/password')\n ? { key: 'resetPassword', label: t('user.resetPassword') }\n : null,\n r.totpEnabled && authStore.hasPerm('POST:/api/v1/sys/mfa/clear')\n ? { key: 'clearMfa', label: t('user.clearMfa'), disabled: clearMfaLoading.value }\n : null,\n ].filter(Boolean) as { key: string; label: string; disabled?: boolean }[]\n return h(NSpace, { size: 4, wrap: false, wrapItem: false }, () => [\n authStore.hasPerm('PUT:/api/v1/sys/user/{id}')\n ? h(\n NButton,\n {\n size: 'small',\n quaternary: true,\n type: 'primary',\n onClick: () => userFormRef.value?.openEdit(r),\n },\n () => t('common.edit'),\n )\n : null,\n r.isSuperAdmin || !authStore.hasPerm('DELETE:/api/v1/sys/user/{id}')\n ? null\n : h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => userApi.remove(r.id), t('user.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('user.deleteConfirm', { name: r.name }),\n },\n ),\n moreOptions.length\n ? h(\n NDropdown,\n {\n trigger: 'click',\n options: moreOptions,\n onSelect: (key: string) => {\n if (key === 'resetPassword') resetModalRef.value?.openReset(r)\n else if (key === 'clearMfa') void clearUserMfa(r)\n },\n },\n () =>\n h(\n NButton,\n { size: 'small', quaternary: true, loading: clearMfaLoading.value },\n () => t('common.more'),\n ),\n )\n : null,\n ])\n },\n },\n]\n</script>\n\n<template>\n <!-- 「左分组栏 + 右列表」= styles/layout.css 里的形状 3:.side-page 负责 display/gap/拉伸/整屏高度。 -->\n <div class=\"user-layout side-page\">\n <!-- 左侧机构树筛选 -->\n <n-card class=\"org-filter fill-card\" :bordered=\"false\" size=\"small\">\n <div class=\"org-filter-head\">\n <span class=\"org-filter-title\">{{ t('user.org') }}</span>\n <n-button\n v-if=\"selectedOrgId != null\"\n text\n size=\"tiny\"\n type=\"primary\"\n @click=\"selectedOrgId = null\"\n >\n {{ t('user.allOrgs') }}\n </n-button>\n </div>\n <n-tree\n block-line\n selectable\n :data=\"orgTree\"\n key-field=\"id\"\n label-field=\"name\"\n children-field=\"children\"\n :selected-keys=\"selectedOrgId == null ? [] : [selectedOrgId]\"\n @update:selected-keys=\"onOrgSelect\"\n />\n </n-card>\n\n <SmartTable\n :default-page-size=\"100\"\n ref=\"tableRef\"\n :columns=\"columns\"\n :fetcher=\"userApi.page\"\n :params=\"tableParams\"\n flex-height\n virtual-scroll\n storage-key=\"sys-user\"\n :checked-row-keys=\"checkedKeys\"\n @update:checked-row-keys=\"(keys: (string | number)[]) => (checkedKeys = keys)\"\n @error=\"e => message.error(translateError(e))\"\n >\n <template #toolbar>\n <n-button v-auth=\"'POST:/api/v1/sys/user'\" type=\"primary\" @click=\"userFormRef?.openAdd()\">\n <template #icon><AppIcon icon=\"ph:plus\" :size=\"16\" /></template>\n {{ t('common.add') }}\n </n-button>\n <n-button\n v-auth=\"'POST:/api/v1/sys/user/batch-delete'\"\n type=\"error\"\n :disabled=\"!hasSelection\"\n @click=\"batchDelete\"\n >\n <template #icon><AppIcon icon=\"ph:trash\" :size=\"16\" /></template>\n {{ t('common.batchDelete') }}\n </n-button>\n <!-- 权限码一字不差:导入入口 = preview;导出 = export -->\n <n-button v-auth=\"'POST:/api/v1/sys/user/import/preview'\" @click=\"importShow = true\">\n <template #icon><AppIcon icon=\"ph:upload-simple\" :size=\"16\" /></template>\n {{ t('import.button') }}\n </n-button>\n <n-button v-auth=\"'GET:/api/v1/sys/user/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 </div>\n\n <UserFormModal\n ref=\"userFormRef\"\n :position-options=\"positionOptions\"\n :role-options=\"roleOptions\"\n :director-options=\"directorOptions\"\n @saved=\"() => tableRef?.refresh()\"\n @password-generated=\"p => resetModalRef?.showResult(p, true)\"\n />\n\n <ResetPasswordModal ref=\"resetModalRef\" />\n\n <ImportWizard\n v-model:show=\"importShow\"\n :api=\"userImportApi\"\n :template-file-name=\"t('userExport.importTemplateName')\"\n :error-report-file-name=\"t('userExport.errorReportName')\"\n @done=\"() => tableRef?.refresh()\"\n />\n\n <ExportColumnsModal\n v-model:show=\"exportShow\"\n :columns=\"userExportColumns\"\n :loading=\"exporting\"\n @confirm=\"onExport\"\n />\n</template>\n\n<style scoped>\n/* 左树 + 右表:display / gap / 拉伸 / 整屏高度都在 styles/layout.css 的 .side-page,这里只定侧栏宽度。 */\n.org-filter {\n flex: 0 0 200px;\n}\n/* 整页定高,侧栏不跟着内容长高:树吃满卡片剩余高度,自己竖向滚动。 */\n.org-filter :deep(.n-tree) {\n flex: 1;\n min-height: 0;\n overflow: auto;\n}\n.org-filter-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n}\n.org-filter-title {\n font-weight: 600;\n font-size: var(--font-size-sm, 13px);\n}\n</style>\n"],"names":["useI18n","message","useMessage","run","confirm","useConfirm","authStore","useAuthStore","tableRef","ref","checkedKeys","hasSelection","batchDelete","useBatchDelete","userApi","_a","userFormRef","resetModalRef","clearMfaLoading","clearUserMfa","user","mfaApi","positionOptions","roleOptions","directorOptions","orgTree","selectedOrgId","tableParams","computed","onOrgSelect","keys","onMounted","items","positionApi","p","roleApi","u","buildTree","orgApi","route","useRoute","watch","inst","roleId","next","initial","name","importShow","exportShow","exporting","userExportColumns","userImportApi","file","mapping","rows","strategy","onExport","blob","triggerBlobDownload","e","translateError","columns","r","h","NAvatar","DictTag","StatusSwitch","v","NTag","moreOptions","NSpace","NButton","NPopconfirm","ok","NDropdown","key","_createElementVNode","_hoisted_1","_createVNode","_unref","NCard","_hoisted_2","_hoisted_3","_toDisplayString","_createBlock","NTree","SmartTable","_cache","$event","AppIcon","_createTextVNode","UserFormModal","ResetPasswordModal","ImportWizard","ExportColumnsModal"],"mappings":"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"}
1
+ {"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/user/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 用户管理(写侧)= SmartTable(列表/搜索/分页)+ UserFormModal(新增/编辑)+ ResetPasswordModal(重置/初始口令展示)+ 专用启停端点。\n// 超管行(isSuperAdmin)删除/停用置灰防自锁;启停走专用 setEnabled(非全量 update)。\n// 导入导出:ImportWizard 四步向导 + ExportColumnsModal 选列导出(带当前筛选)。\nimport { computed, h, onMounted, ref, watch } from 'vue'\nimport { useRoute } from 'vue-router'\nimport {\n NButton,\n NTree,\n NSpace,\n NTag,\n NAvatar,\n NPopconfirm,\n NDropdown,\n NInput,\n NSpin,\n NTooltip,\n useMessage,\n type TreeOption,\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 StatusSwitch from '#/components/StatusSwitch/index.vue'\nimport DictTag from '#/components/DictTag/index.vue'\nimport ImportWizard, { type ImportWizardApi } from '#/components/ImportWizard/index.vue'\nimport ExportColumnsModal from '#/components/ExportColumnsModal/index.vue'\nimport UserFormModal from './components/UserFormModal.vue'\nimport ResetPasswordModal from './components/ResetPasswordModal.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { useBatchDelete } from '#/composables/useBatchDelete'\nimport { mfaApi, userApi, positionApi, roleApi, orgApi } from '#/api'\nimport { useAuthStore } from '#/stores/auth'\nimport { translateError } from '#/utils/error'\nimport { triggerBlobDownload } from '#/utils/download'\nimport { buildTree, expandableIds } from '#/utils/tree'\nimport type { ExportColumnDef, SysOrg, UserItem } from '#/types/api'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run, confirm } = useConfirm()\nconst authStore = useAuthStore()\nconst tableRef = ref<SmartTableInst<UserItem>>()\nconst {\n checkedKeys,\n hasSelection,\n run: batchDelete,\n} = useBatchDelete({\n remove: userApi.batchRemove,\n refresh: () => tableRef.value?.refresh(),\n successMsg: t('user.deleted'),\n})\n\n// 新增/编辑弹窗 + 重置密码弹窗(表单/校验/保存均在各自组件内,父页只传下拉选项 + 收 saved/passwordGenerated)。\nconst userFormRef = ref<InstanceType<typeof UserFormModal> | null>(null)\nconst resetModalRef = ref<InstanceType<typeof ResetPasswordModal> | null>(null)\n\nconst clearMfaLoading = ref(false)\n\nasync function clearUserMfa(user: UserItem) {\n clearMfaLoading.value = true\n try {\n const ok = await confirm({\n content: t('user.clearMfaConfirm', { name: user.name }),\n action: () => mfaApi.clear({ userId: user.id }),\n successMsg: t('user.mfaCleared'),\n })\n if (ok) tableRef.value?.refresh()\n } finally {\n clearMfaLoading.value = false\n }\n}\n\n// 职位/角色/主管下拉:各拉一页足量。ponytail: 200 覆盖绝大多数系统;真超再上分页搜索。\n// roleOptions 一份两用:既喂编辑弹窗,也当列表页「角色」搜索项的选项源(SmartTable 支持 Ref 选项源)。\nconst positionOptions = ref<{ label: string; value: number }[]>([])\nconst roleOptions = ref<{ label: string; value: number }[]>([])\nconst directorOptions = ref<{ label: string; value: number }[]>([])\n// 左侧机构树筛选:选中节点即按其机构过滤用户;params 深监听联动 SmartTable(回第 1 页重查)。\n// 面板交互对齐内核 layout.css 的 .side-filter 约定(机构管理页搜索/展开收起用的同一套):\n// 搜索走 NTree 自带 pattern/filter;展开受控,进页面全折叠,选中节点自动展开其祖先链。\nconst orgFlat = ref<SysOrg[]>([])\n// 拉取期间给树位占位(见下方 n-spin),避免树从空白直接跳成展开好的一整棵——那一下比慢半拍更扎眼。\nconst orgLoading = ref(true)\nconst orgTree = computed(() => buildTree(orgFlat.value))\nconst selectedOrgId = ref<number | null>(null)\nconst tableParams = computed(() =>\n selectedOrgId.value == null ? {} : { orgId: selectedOrgId.value },\n)\nfunction onOrgSelect(keys: (string | number)[]) {\n // 再点选中项 → 取消选中 → 恢复全部\n selectedOrgId.value = keys.length ? Number(keys[0]) : null\n}\n\nconst orgPattern = ref('')\nfunction filterOrg(input: string, node: TreeOption) {\n const kw = input.trim().toLowerCase()\n if (!kw) return true\n const org = node as unknown as SysOrg\n return org.name.toLowerCase().includes(kw) || (org.code ?? '').toLowerCase().includes(kw)\n}\n\nconst orgExpandedKeys = ref<number[]>([])\nconst expandableOrgKeys = computed(() => expandableIds(orgTree.value))\nconst allOrgExpanded = computed(\n () =>\n expandableOrgKeys.value.length > 0 &&\n orgExpandedKeys.value.length >= expandableOrgKeys.value.length,\n)\nfunction toggleExpandAllOrg() {\n orgExpandedKeys.value = allOrgExpanded.value ? [] : [...expandableOrgKeys.value]\n}\n// 受控展开:一旦传了 expanded-keys,naive 就以它为准,不会自己默认展开——进页面全展开得自己播种。\nwatch(expandableOrgKeys, keys => (orgExpandedKeys.value = keys), { immediate: true })\n\n// 选中的机构可能藏在收起的父级里(典型:切换搜索结果后选中项被折叠的祖先挡住),把祖先链补进展开集。\nwatch(selectedOrgId, id => {\n if (id == null) return\n const byId = new Map(orgFlat.value.map(o => [o.id, o]))\n const next = new Set(orgExpandedKeys.value)\n let cursor = byId.get(id)?.parentId ?? 0\n while (cursor && byId.has(cursor)) {\n next.add(cursor)\n cursor = byId.get(cursor)!.parentId\n }\n orgExpandedKeys.value = [...next]\n})\nonMounted(async () => {\n try {\n const { items } = await positionApi.page({ page: 1, pageSize: 200 })\n positionOptions.value = items.map(p => ({ label: p.name, value: p.id }))\n } catch {\n // 静默:职位是配角,不打断列表\n }\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 // 主管候选就是用户自身;拉一页足量作下拉源(允许把某用户选为自己主管,后台系统无害,不加环检)\n const { items } = await userApi.page({ page: 1, pageSize: 200 })\n directorOptions.value = items.map(u => ({ label: `${u.name}(${u.account})`, value: u.id }))\n } catch {\n // 静默:主管下拉是配角,拉取失败不打断列表\n }\n try {\n orgFlat.value = await orgApi.list()\n } catch {\n // 静默:机构树是筛选辅助,拉取失败不打断列表\n } finally {\n orgLoading.value = false\n }\n})\n\n// 角色反查:角色页「查看用户」跳这里并带 ?roleId=。\n// 必须 watch 而非 onMounted:标签页按 path 做主键且页面被 keep-alive,本页标签已开着时再跳一次只换 query,\n// 组件实例被复用、onMounted 不会再触发。\n// 同时把 tableRef 一起纳入监听源:immediate 在 setup 期求值,那时表格实例还没挂上(ref 为空),\n// 只听 query 的话冷启动这一路会静默失效——实例就绪时这条 watch 会再触发一次,把筛选补上。\nconst route = useRoute()\nwatch(\n [tableRef, () => route.query.roleId],\n ([inst, roleId]) => {\n if (!inst) return\n const next = roleId == null ? undefined : Number(roleId)\n if (inst.params.roleId === next) return // 防抖:实例就绪与 query 变化可能各触发一次\n inst.params.roleId = next\n inst.search() // 回第 1 页重查\n },\n { immediate: true },\n)\n\n// 头像首字母兜底。NAvatar 的规矩:default 插槽一有内容就渲染它、彻底无视 src(见 naive Avatar.render)。\n// 所以有头像时 default 必须留空让 <img> 出来,首字母只放 #fallback(图挂了/链过期才兜底);无头像才用 default 当文字头像。\nconst initial = (name?: string | null) => (name || '?').slice(0, 1)\n\n// ── 导入 / 导出 ──\nconst importShow = ref(false)\nconst exportShow = ref(false)\nconst exporting = ref(false)\n\n/** 与后端 UserExportProfile.Columns 对齐(前端无列清单端点,照档案硬编码)。 */\nconst userExportColumns: ExportColumnDef[] = [\n { key: 'Account', title: t('userExport.account') },\n { key: 'Name', title: t('userExport.name') },\n { key: 'Nickname', title: t('userExport.nickname') },\n { key: 'Phone', title: t('userExport.phone') },\n { key: 'Email', title: t('userExport.email') },\n { key: 'Gender', title: t('userExport.gender') },\n { key: 'OrgName', title: t('userExport.orgName') },\n { key: 'PositionName', title: t('userExport.positionName') },\n { key: 'DirectorName', title: t('userExport.directorName') },\n { key: 'Enabled', title: t('userExport.enabled') },\n { key: 'IsSuperAdmin', title: t('userExport.superAdmin'), defaultSelected: false },\n { key: 'CreateTime', title: t('userExport.createTime') },\n]\n\nconst userImportApi: ImportWizardApi = {\n downloadTemplate: () => userApi.importTemplate(),\n preview: (file, mapping) => userApi.importPreview(file, mapping),\n validate: rows => userApi.importValidate(rows),\n commit: (rows, strategy) => userApi.importCommit(rows, strategy),\n errorReport: rows => userApi.importErrorReport(rows),\n}\n\n/** 导出:带当前 SmartTable 筛选(含左侧机构树 orgId)+ 选中列。 */\nasync function onExport(keys: string[]) {\n const p = tableRef.value?.params ?? {}\n exporting.value = true\n try {\n const blob = await userApi.export({\n account: p.account || undefined,\n name: p.name || undefined,\n orgId: p.orgId != null ? Number(p.orgId) : undefined,\n roleId: p.roleId != null ? Number(p.roleId) : undefined,\n sortField: p.sortField || undefined,\n sortOrder: p.sortOrder || undefined,\n columns: keys.join(','),\n })\n triggerBlobDownload(blob, t('userExport.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<UserItem>[] = [\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n // 超管行禁勾:批量删除同样不可含超管(后端也会整体拒绝)\n { type: 'selection', disabled: (r: UserItem) => r.isSuperAdmin },\n {\n key: 'avatar',\n title: () => t('user.avatar'),\n width: 64,\n align: 'center',\n hideInSetting: false,\n render: r =>\n h(\n NAvatar,\n { round: true, size: 'small', src: r.avatar || undefined },\n r.avatar ? { fallback: () => initial(r.name) } : { default: () => initial(r.name) },\n ),\n },\n { key: 'account', title: () => t('user.account'), search: true, sorter: true },\n { key: 'name', title: () => t('user.name'), search: true },\n { key: 'phone', title: () => t('user.phone'), render: r => r.phone || '—' },\n {\n key: 'gender',\n title: () => t('user.gender'),\n width: 80,\n hideInTable: true, // 次要列:默认隐藏收窄整表,列设置抽屉可打开\n render: r => (r.gender ? h(DictTag, { typeCode: 'gender', value: r.gender }) : '—'),\n },\n // 只作搜索项,不进表格也不进列设置。options 直接吃编辑表单已拉好的 roleOptions(SmartTable 支持 Ref 选项源),不额外发请求;\n // 列上有 options,搜索控件自动是 select。\n {\n key: 'roleId',\n title: () => t('user.roles'),\n hideInTable: true,\n options: roleOptions,\n search: { props: { clearable: true } },\n },\n { key: 'orgName', title: () => t('user.org'), render: r => r.orgName || '—' },\n {\n key: 'positionName',\n title: () => t('user.position'),\n hideInTable: true,\n render: r => r.positionName || '—',\n },\n {\n key: 'enabled',\n title: () => t('user.status'),\n width: 90,\n render: r =>\n h(StatusSwitch, {\n value: r.enabled,\n // 超管不可停用(防自锁 —— 停了就没法从 UI 恢复;后端也保护);无启停权限亦置灰。\n disabled: r.isSuperAdmin || !authStore.hasPerm('PUT:/api/v1/sys/user/{id}/enabled'),\n confirm: (next: boolean) => (next ? null : t('user.disableConfirm', { name: r.name })),\n request: (next: boolean) => userApi.setEnabled(r.id, next),\n 'onUpdate:value': (v: boolean) => {\n r.enabled = v\n },\n }),\n },\n {\n key: 'isSuperAdmin',\n title: () => t('user.superAdmin'),\n width: 90,\n render: r =>\n r.isSuperAdmin\n ? h(NTag, { type: 'warning', size: 'small', bordered: false }, () => t('user.superAdmin'))\n : '—',\n },\n { key: 'createTime', title: () => t('user.createTime'), format: 'datetime', sorter: true },\n // 操作:编辑/删除外露;重置密码、解绑验证器进「更多」(放操作列末尾)。\n // width 须够「编辑+删除+更多」单行;wrap:false 禁止 NSpace 默认换行(否则「更多」掉到删除下一行)。\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 200,\n fixed: 'right', // 钉右:横向滚动时操作列始终可见\n hideInSetting: true,\n render: r => {\n const moreOptions = [\n authStore.hasPerm('PUT:/api/v1/sys/user/{id}/password')\n ? { key: 'resetPassword', label: t('user.resetPassword') }\n : null,\n r.totpEnabled && authStore.hasPerm('POST:/api/v1/sys/mfa/clear')\n ? { key: 'clearMfa', label: t('user.clearMfa'), disabled: clearMfaLoading.value }\n : null,\n ].filter(Boolean) as { key: string; label: string; disabled?: boolean }[]\n return h(NSpace, { size: 4, wrap: false, wrapItem: false }, () => [\n authStore.hasPerm('PUT:/api/v1/sys/user/{id}')\n ? h(\n NButton,\n {\n size: 'small',\n quaternary: true,\n type: 'primary',\n onClick: () => userFormRef.value?.openEdit(r),\n },\n () => t('common.edit'),\n )\n : null,\n r.isSuperAdmin || !authStore.hasPerm('DELETE:/api/v1/sys/user/{id}')\n ? null\n : h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => userApi.remove(r.id), t('user.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('user.deleteConfirm', { name: r.name }),\n },\n ),\n moreOptions.length\n ? h(\n NDropdown,\n {\n trigger: 'click',\n options: moreOptions,\n onSelect: (key: string) => {\n if (key === 'resetPassword') resetModalRef.value?.openReset(r)\n else if (key === 'clearMfa') void clearUserMfa(r)\n },\n },\n () =>\n h(\n NButton,\n { size: 'small', quaternary: true, loading: clearMfaLoading.value },\n () => t('common.more'),\n ),\n )\n : null,\n ])\n },\n },\n]\n</script>\n\n<template>\n <!-- 「左分组栏 + 右列表」= styles/layout.css 里的形状 3:.side-page 负责 display/gap/拉伸/整屏高度。 -->\n <div class=\"user-layout side-page\">\n <!-- 左侧机构树筛选:面板外观/交互对齐内核 .side-filter 约定(机构管理页搜索、展开收起同款) -->\n <aside class=\"side-filter\">\n <div class=\"side-filter__head\">\n <div class=\"side-filter__actions\">\n <n-tooltip v-if=\"expandableOrgKeys.length\">\n <template #trigger>\n <n-button quaternary circle size=\"small\" @click=\"toggleExpandAllOrg\">\n <template #icon>\n <AppIcon\n :icon=\"\n allOrgExpanded ? 'ph:arrows-in-line-vertical' : 'ph:arrows-out-line-vertical'\n \"\n :size=\"18\"\n />\n </template>\n </n-button>\n </template>\n {{ allOrgExpanded ? t('common.collapseAll') : t('common.expandAll') }}\n </n-tooltip>\n </div>\n </div>\n\n <n-input\n v-model:value=\"orgPattern\"\n size=\"small\"\n clearable\n :placeholder=\"t('org.searchPlaceholder')\"\n >\n <template #prefix><AppIcon icon=\"ph:magnifying-glass\" :size=\"14\" /></template>\n </n-input>\n\n <button\n type=\"button\"\n class=\"side-row\"\n :class=\"{ 'is-active': selectedOrgId === null }\"\n @click=\"selectedOrgId = null\"\n >\n <AppIcon class=\"side-row__icon\" icon=\"ph:squares-four\" :size=\"15\" />\n <span class=\"side-row__label\">{{ t('user.allOrgs') }}</span>\n </button>\n\n <div class=\"side-filter__divider\" />\n\n <n-spin :show=\"orgLoading\" class=\"fill-pass\">\n <n-tree\n class=\"side-tree\"\n block-line\n selectable\n show-line\n key-field=\"id\"\n label-field=\"name\"\n children-field=\"children\"\n :data=\"orgTree\"\n :pattern=\"orgPattern\"\n :filter=\"filterOrg\"\n :show-irrelevant-nodes=\"false\"\n :selected-keys=\"selectedOrgId == null ? [] : [selectedOrgId]\"\n :expanded-keys=\"orgExpandedKeys\"\n @update:selected-keys=\"onOrgSelect\"\n @update:expanded-keys=\"keys => (orgExpandedKeys = keys as unknown as number[])\"\n />\n </n-spin>\n </aside>\n\n <SmartTable\n :default-page-size=\"100\"\n ref=\"tableRef\"\n :columns=\"columns\"\n :fetcher=\"userApi.page\"\n :params=\"tableParams\"\n flex-height\n virtual-scroll\n storage-key=\"sys-user\"\n :checked-row-keys=\"checkedKeys\"\n @update:checked-row-keys=\"(keys: (string | number)[]) => (checkedKeys = keys)\"\n @error=\"e => message.error(translateError(e))\"\n >\n <template #toolbar>\n <n-button v-auth=\"'POST:/api/v1/sys/user'\" type=\"primary\" @click=\"userFormRef?.openAdd()\">\n <template #icon><AppIcon icon=\"ph:plus\" :size=\"16\" /></template>\n {{ t('common.add') }}\n </n-button>\n <n-button\n v-auth=\"'POST:/api/v1/sys/user/batch-delete'\"\n type=\"error\"\n :disabled=\"!hasSelection\"\n @click=\"batchDelete\"\n >\n <template #icon><AppIcon icon=\"ph:trash\" :size=\"16\" /></template>\n {{ t('common.batchDelete') }}\n </n-button>\n <!-- 权限码一字不差:导入入口 = preview;导出 = export -->\n <n-button v-auth=\"'POST:/api/v1/sys/user/import/preview'\" @click=\"importShow = true\">\n <template #icon><AppIcon icon=\"ph:upload-simple\" :size=\"16\" /></template>\n {{ t('import.button') }}\n </n-button>\n <n-button v-auth=\"'GET:/api/v1/sys/user/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 </div>\n\n <UserFormModal\n ref=\"userFormRef\"\n :position-options=\"positionOptions\"\n :role-options=\"roleOptions\"\n :director-options=\"directorOptions\"\n @saved=\"() => tableRef?.refresh()\"\n @password-generated=\"p => resetModalRef?.showResult(p, true)\"\n />\n\n <ResetPasswordModal ref=\"resetModalRef\" />\n\n <ImportWizard\n v-model:show=\"importShow\"\n :api=\"userImportApi\"\n :template-file-name=\"t('userExport.importTemplateName')\"\n :error-report-file-name=\"t('userExport.errorReportName')\"\n @done=\"() => tableRef?.refresh()\"\n />\n\n <ExportColumnsModal\n v-model:show=\"exportShow\"\n :columns=\"userExportColumns\"\n :loading=\"exporting\"\n @confirm=\"onExport\"\n />\n</template>\n\n<style scoped>\n/* 树形比平铺分类宽一点:缩进和展开箭头要留出空间,默认 --side-filter-width(224px)偏窄。 */\n.user-layout {\n --side-filter-width: 248px;\n}\n</style>\n"],"names":["useI18n","message","useMessage","run","confirm","useConfirm","authStore","useAuthStore","tableRef","ref","checkedKeys","hasSelection","batchDelete","useBatchDelete","userApi","_a","userFormRef","resetModalRef","clearMfaLoading","clearUserMfa","user","mfaApi","positionOptions","roleOptions","directorOptions","orgFlat","orgLoading","orgTree","computed","buildTree","selectedOrgId","tableParams","onOrgSelect","keys","orgPattern","filterOrg","input","node","kw","org","orgExpandedKeys","expandableOrgKeys","expandableIds","allOrgExpanded","toggleExpandAllOrg","watch","id","byId","o","next","cursor","onMounted","items","positionApi","p","roleApi","r","u","orgApi","route","useRoute","inst","roleId","initial","name","importShow","exportShow","exporting","userExportColumns","userImportApi","file","mapping","rows","strategy","onExport","blob","triggerBlobDownload","e","translateError","columns","h","NAvatar","DictTag","StatusSwitch","v","NTag","moreOptions","NSpace","NButton","NPopconfirm","ok","NDropdown","key","_createElementVNode","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_createBlock","_unref","NTooltip","_createVNode","AppIcon","_createTextVNode","_toDisplayString","NInput","$event","_normalizeClass","_hoisted_5","NSpin","NTree","_cache","SmartTable","UserFormModal","ResetPasswordModal","ImportWizard","ExportColumnsModal"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAsCA,UAAM,EAAE,EAAA,IAAMA,GAAA,GACRC,IAAUC,GAAA,GACV,EAAE,KAAAC,GAAK,SAAAC,EAAA,IAAYC,GAAA,GACnBC,IAAYC,GAAA,GACZC,IAAWC,EAAA,GACX;AAAA,MACJ,aAAAC;AAAA,MACA,cAAAC;AAAA,MACA,KAAKC;AAAA,IAAA,IACHC,GAAe;AAAA,MACjB,QAAQC,EAAQ;AAAA,MAChB,SAAS,MAAA;;AAAM,gBAAAC,IAAAP,EAAS,UAAT,gBAAAO,EAAgB;AAAA;AAAA,MAC/B,YAAY,EAAE,cAAc;AAAA,IAAA,CAC7B,GAGKC,IAAcP,EAA+C,IAAI,GACjEQ,IAAgBR,EAAoD,IAAI,GAExES,IAAkBT,EAAI,EAAK;AAEjC,mBAAeU,EAAaC,GAAgB;;AAC1C,MAAAF,EAAgB,QAAQ;AACxB,UAAI;AAMF,QALW,MAAMd,EAAQ;AAAA,UACvB,SAAS,EAAE,wBAAwB,EAAE,MAAMgB,EAAK,MAAM;AAAA,UACtD,QAAQ,MAAMC,GAAO,MAAM,EAAE,QAAQD,EAAK,IAAI;AAAA,UAC9C,YAAY,EAAE,iBAAiB;AAAA,QAAA,CAChC,OACOL,IAAAP,EAAS,UAAT,QAAAO,EAAgB;AAAA,MAC1B,UAAA;AACE,QAAAG,EAAgB,QAAQ;AAAA,MAC1B;AAAA,IACF;AAIA,UAAMI,IAAkBb,EAAwC,EAAE,GAC5Dc,IAAcd,EAAwC,EAAE,GACxDe,IAAkBf,EAAwC,EAAE,GAI5DgB,IAAUhB,EAAc,EAAE,GAE1BiB,IAAajB,EAAI,EAAI,GACrBkB,IAAUC,EAAS,MAAMC,GAAUJ,EAAQ,KAAK,CAAC,GACjDK,IAAgBrB,EAAmB,IAAI,GACvCsB,IAAcH;AAAA,MAAS,MAC3BE,EAAc,SAAS,OAAO,CAAA,IAAK,EAAE,OAAOA,EAAc,MAAA;AAAA,IAAM;AAElE,aAASE,EAAYC,GAA2B;AAE9C,MAAAH,EAAc,QAAQG,EAAK,SAAS,OAAOA,EAAK,CAAC,CAAC,IAAI;AAAA,IACxD;AAEA,UAAMC,IAAazB,EAAI,EAAE;AACzB,aAAS0B,EAAUC,GAAeC,GAAkB;AAClD,YAAMC,IAAKF,EAAM,KAAA,EAAO,YAAA;AACxB,UAAI,CAACE,EAAI,QAAO;AAChB,YAAMC,IAAMF;AACZ,aAAOE,EAAI,KAAK,YAAA,EAAc,SAASD,CAAE,MAAMC,EAAI,QAAQ,IAAI,YAAA,EAAc,SAASD,CAAE;AAAA,IAC1F;AAEA,UAAME,IAAkB/B,EAAc,EAAE,GAClCgC,IAAoBb,EAAS,MAAMc,GAAcf,EAAQ,KAAK,CAAC,GAC/DgB,IAAiBf;AAAA,MACrB,MACEa,EAAkB,MAAM,SAAS,KACjCD,EAAgB,MAAM,UAAUC,EAAkB,MAAM;AAAA,IAAA;AAE5D,aAASG,KAAqB;AAC5B,MAAAJ,EAAgB,QAAQG,EAAe,QAAQ,CAAA,IAAK,CAAC,GAAGF,EAAkB,KAAK;AAAA,IACjF;AAEA,IAAAI,EAAMJ,GAAmB,OAASD,EAAgB,QAAQP,GAAO,EAAE,WAAW,IAAM,GAGpFY,EAAMf,GAAe,CAAAgB,MAAM;;AACzB,UAAIA,KAAM,KAAM;AAChB,YAAMC,IAAO,IAAI,IAAItB,EAAQ,MAAM,IAAI,CAAAuB,MAAK,CAACA,EAAE,IAAIA,CAAC,CAAC,CAAC,GAChDC,IAAO,IAAI,IAAIT,EAAgB,KAAK;AAC1C,UAAIU,MAASnC,IAAAgC,EAAK,IAAID,CAAE,MAAX,gBAAA/B,EAAc,aAAY;AACvC,aAAOmC,KAAUH,EAAK,IAAIG,CAAM;AAC9B,QAAAD,EAAK,IAAIC,CAAM,GACfA,IAASH,EAAK,IAAIG,CAAM,EAAG;AAE7B,MAAAV,EAAgB,QAAQ,CAAC,GAAGS,CAAI;AAAA,IAClC,CAAC,GACDE,GAAU,YAAY;AACpB,UAAI;AACF,cAAM,EAAE,OAAAC,MAAU,MAAMC,GAAY,KAAK,EAAE,MAAM,GAAG,UAAU,KAAK;AACnE,QAAA/B,EAAgB,QAAQ8B,EAAM,IAAI,CAAAE,OAAM,EAAE,OAAOA,EAAE,MAAM,OAAOA,EAAE,GAAA,EAAK;AAAA,MACzE,QAAQ;AAAA,MAER;AACA,UAAI;AACF,cAAM,EAAE,OAAAF,MAAU,MAAMG,GAAQ,KAAK,EAAE,MAAM,GAAG,UAAU,KAAK;AAC/D,QAAAhC,EAAY,QAAQ6B,EAAM,IAAI,CAAAI,OAAM,EAAE,OAAOA,EAAE,MAAM,OAAOA,EAAE,GAAA,EAAK;AAAA,MACrE,QAAQ;AAAA,MAER;AACA,UAAI;AAEF,cAAM,EAAE,OAAAJ,MAAU,MAAMtC,EAAQ,KAAK,EAAE,MAAM,GAAG,UAAU,KAAK;AAC/D,QAAAU,EAAgB,QAAQ4B,EAAM,IAAI,CAAAK,OAAM,EAAE,OAAO,GAAGA,EAAE,IAAI,IAAIA,EAAE,OAAO,KAAK,OAAOA,EAAE,KAAK;AAAA,MAC5F,QAAQ;AAAA,MAER;AACA,UAAI;AACF,QAAAhC,EAAQ,QAAQ,MAAMiC,GAAO,KAAA;AAAA,MAC/B,QAAQ;AAAA,MAER,UAAA;AACE,QAAAhC,EAAW,QAAQ;AAAA,MACrB;AAAA,IACF,CAAC;AAOD,UAAMiC,KAAQC,GAAA;AACd,IAAAf;AAAA,MACE,CAACrC,GAAU,MAAMmD,GAAM,MAAM,MAAM;AAAA,MACnC,CAAC,CAACE,GAAMC,CAAM,MAAM;AAClB,YAAI,CAACD,EAAM;AACX,cAAMZ,IAAOa,KAAU,OAAO,SAAY,OAAOA,CAAM;AACvD,QAAID,EAAK,OAAO,WAAWZ,MAC3BY,EAAK,OAAO,SAASZ,GACrBY,EAAK,OAAA;AAAA,MACP;AAAA,MACA,EAAE,WAAW,GAAA;AAAA,IAAK;AAKpB,UAAME,IAAU,CAACC,OAA0BA,KAAQ,KAAK,MAAM,GAAG,CAAC,GAG5DC,IAAaxD,EAAI,EAAK,GACtByD,IAAazD,EAAI,EAAK,GACtB0D,IAAY1D,EAAI,EAAK,GAGrB2D,KAAuC;AAAA,MAC3C,EAAE,KAAK,WAAW,OAAO,EAAE,oBAAoB,EAAA;AAAA,MAC/C,EAAE,KAAK,QAAQ,OAAO,EAAE,iBAAiB,EAAA;AAAA,MACzC,EAAE,KAAK,YAAY,OAAO,EAAE,qBAAqB,EAAA;AAAA,MACjD,EAAE,KAAK,SAAS,OAAO,EAAE,kBAAkB,EAAA;AAAA,MAC3C,EAAE,KAAK,SAAS,OAAO,EAAE,kBAAkB,EAAA;AAAA,MAC3C,EAAE,KAAK,UAAU,OAAO,EAAE,mBAAmB,EAAA;AAAA,MAC7C,EAAE,KAAK,WAAW,OAAO,EAAE,oBAAoB,EAAA;AAAA,MAC/C,EAAE,KAAK,gBAAgB,OAAO,EAAE,yBAAyB,EAAA;AAAA,MACzD,EAAE,KAAK,gBAAgB,OAAO,EAAE,yBAAyB,EAAA;AAAA,MACzD,EAAE,KAAK,WAAW,OAAO,EAAE,oBAAoB,EAAA;AAAA,MAC/C,EAAE,KAAK,gBAAgB,OAAO,EAAE,uBAAuB,GAAG,iBAAiB,GAAA;AAAA,MAC3E,EAAE,KAAK,cAAc,OAAO,EAAE,uBAAuB,EAAA;AAAA,IAAE,GAGnDC,KAAiC;AAAA,MACrC,kBAAkB,MAAMvD,EAAQ,eAAA;AAAA,MAChC,SAAS,CAACwD,GAAMC,MAAYzD,EAAQ,cAAcwD,GAAMC,CAAO;AAAA,MAC/D,UAAU,CAAAC,MAAQ1D,EAAQ,eAAe0D,CAAI;AAAA,MAC7C,QAAQ,CAACA,GAAMC,MAAa3D,EAAQ,aAAa0D,GAAMC,CAAQ;AAAA,MAC/D,aAAa,CAAAD,MAAQ1D,EAAQ,kBAAkB0D,CAAI;AAAA,IAAA;AAIrD,mBAAeE,GAASzC,GAAgB;;AACtC,YAAMqB,MAAIvC,IAAAP,EAAS,UAAT,gBAAAO,EAAgB,WAAU,CAAA;AACpC,MAAAoD,EAAU,QAAQ;AAClB,UAAI;AACF,cAAMQ,IAAO,MAAM7D,EAAQ,OAAO;AAAA,UAChC,SAASwC,EAAE,WAAW;AAAA,UACtB,MAAMA,EAAE,QAAQ;AAAA,UAChB,OAAOA,EAAE,SAAS,OAAO,OAAOA,EAAE,KAAK,IAAI;AAAA,UAC3C,QAAQA,EAAE,UAAU,OAAO,OAAOA,EAAE,MAAM,IAAI;AAAA,UAC9C,WAAWA,EAAE,aAAa;AAAA,UAC1B,WAAWA,EAAE,aAAa;AAAA,UAC1B,SAASrB,EAAK,KAAK,GAAG;AAAA,QAAA,CACvB;AACD,QAAA2C,GAAoBD,GAAM,EAAE,qBAAqB,CAAC,GAClDT,EAAW,QAAQ,IACnBjE,EAAQ,QAAQ,EAAE,aAAa,CAAC;AAAA,MAClC,SAAS4E,GAAG;AACV,QAAA5E,EAAQ,MAAM6E,EAAeD,CAAC,CAAC;AAAA,MACjC,UAAA;AACE,QAAAV,EAAU,QAAQ;AAAA,MACpB;AAAA,IACF;AAEA,UAAMY,KAAwC;AAAA,MAC5C,EAAE,MAAM,SAAS,OAAO,MAAM,EAAE,cAAc,GAAG,OAAO,IAAI,OAAO,SAAA;AAAA;AAAA,MAEnE,EAAE,MAAM,aAAa,UAAU,CAAC,MAAgB,EAAE,aAAA;AAAA,MAClD;AAAA,QACE,KAAK;AAAA,QACL,OAAO,MAAM,EAAE,aAAa;AAAA,QAC5B,OAAO;AAAA,QACP,OAAO;AAAA,QACP,eAAe;AAAA,QACf,QAAQ,CAAA,MACNC;AAAA,UACEC;AAAA,UACA,EAAE,OAAO,IAAM,MAAM,SAAS,KAAK,EAAE,UAAU,OAAA;AAAA,UAC/C,EAAE,SAAS,EAAE,UAAU,MAAMlB,EAAQ,EAAE,IAAI,EAAA,IAAM,EAAE,SAAS,MAAMA,EAAQ,EAAE,IAAI,EAAA;AAAA,QAAE;AAAA,MACpF;AAAA,MAEJ,EAAE,KAAK,WAAW,OAAO,MAAM,EAAE,cAAc,GAAG,QAAQ,IAAM,QAAQ,GAAA;AAAA,MACxE,EAAE,KAAK,QAAQ,OAAO,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAA;AAAA,MACpD,EAAE,KAAK,SAAS,OAAO,MAAM,EAAE,YAAY,GAAG,QAAQ,CAAA,MAAK,EAAE,SAAS,IAAA;AAAA,MACtE;AAAA,QACE,KAAK;AAAA,QACL,OAAO,MAAM,EAAE,aAAa;AAAA,QAC5B,OAAO;AAAA,QACP,aAAa;AAAA;AAAA,QACb,QAAQ,CAAA,MAAM,EAAE,SAASiB,EAAEE,IAAS,EAAE,UAAU,UAAU,OAAO,EAAE,OAAA,CAAQ,IAAI;AAAA,MAAA;AAAA;AAAA;AAAA,MAIjF;AAAA,QACE,KAAK;AAAA,QACL,OAAO,MAAM,EAAE,YAAY;AAAA,QAC3B,aAAa;AAAA,QACb,SAAS3D;AAAA,QACT,QAAQ,EAAE,OAAO,EAAE,WAAW,KAAK;AAAA,MAAE;AAAA,MAEvC,EAAE,KAAK,WAAW,OAAO,MAAM,EAAE,UAAU,GAAG,QAAQ,CAAA,MAAK,EAAE,WAAW,IAAA;AAAA,MACxE;AAAA,QACE,KAAK;AAAA,QACL,OAAO,MAAM,EAAE,eAAe;AAAA,QAC9B,aAAa;AAAA,QACb,QAAQ,CAAA,MAAK,EAAE,gBAAgB;AAAA,MAAA;AAAA,MAEjC;AAAA,QACE,KAAK;AAAA,QACL,OAAO,MAAM,EAAE,aAAa;AAAA,QAC5B,OAAO;AAAA,QACP,QAAQ,CAAA,MACNyD,EAAEG,IAAc;AAAA,UACd,OAAO,EAAE;AAAA;AAAA,UAET,UAAU,EAAE,gBAAgB,CAAC7E,EAAU,QAAQ,mCAAmC;AAAA,UAClF,SAAS,CAAC2C,MAAmBA,IAAO,OAAO,EAAE,uBAAuB,EAAE,MAAM,EAAE,MAAM;AAAA,UACpF,SAAS,CAACA,MAAkBnC,EAAQ,WAAW,EAAE,IAAImC,CAAI;AAAA,UACzD,kBAAkB,CAACmC,MAAe;AAChC,cAAE,UAAUA;AAAA,UACd;AAAA,QAAA,CACD;AAAA,MAAA;AAAA,MAEL;AAAA,QACE,KAAK;AAAA,QACL,OAAO,MAAM,EAAE,iBAAiB;AAAA,QAChC,OAAO;AAAA,QACP,QAAQ,CAAA,MACN,EAAE,eACEJ,EAAEK,IAAM,EAAE,MAAM,WAAW,MAAM,SAAS,UAAU,GAAA,GAAS,MAAM,EAAE,iBAAiB,CAAC,IACvF;AAAA,MAAA;AAAA,MAER,EAAE,KAAK,cAAc,OAAO,MAAM,EAAE,iBAAiB,GAAG,QAAQ,YAAY,QAAQ,GAAA;AAAA;AAAA;AAAA,MAGpF;AAAA,QACE,KAAK;AAAA,QACL,OAAO,MAAM,EAAE,kBAAkB;AAAA,QACjC,OAAO;AAAA,QACP,OAAO;AAAA;AAAA,QACP,eAAe;AAAA,QACf,QAAQ,CAAA,MAAK;AACX,gBAAMC,IAAc;AAAA,YAClBhF,EAAU,QAAQ,oCAAoC,IAClD,EAAE,KAAK,iBAAiB,OAAO,EAAE,oBAAoB,EAAA,IACrD;AAAA,YACJ,EAAE,eAAeA,EAAU,QAAQ,4BAA4B,IAC3D,EAAE,KAAK,YAAY,OAAO,EAAE,eAAe,GAAG,UAAUY,EAAgB,UACxE;AAAA,UAAA,EACJ,OAAO,OAAO;AAChB,iBAAO8D,EAAEO,IAAQ,EAAE,MAAM,GAAG,MAAM,IAAO,UAAU,GAAA,GAAS,MAAM;AAAA,YAChEjF,EAAU,QAAQ,2BAA2B,IACzC0E;AAAA,cACEQ;AAAA,cACA;AAAA,gBACE,MAAM;AAAA,gBACN,YAAY;AAAA,gBACZ,MAAM;AAAA,gBACN,SAAS,MAAA;;AAAM,0BAAAzE,IAAAC,EAAY,UAAZ,gBAAAD,EAAmB,SAAS;AAAA;AAAA,cAAC;AAAA,cAE9C,MAAM,EAAE,aAAa;AAAA,YAAA,IAEvB;AAAA,YACJ,EAAE,gBAAgB,CAACT,EAAU,QAAQ,8BAA8B,IAC/D,OACA0E;AAAA,cACES;AAAA,cACA;AAAA,gBACE,iBAAiB,MACftF,EAAI,MAAMW,EAAQ,OAAO,EAAE,EAAE,GAAG,EAAE,cAAc,CAAC,EAAE,KAAK,CAAA4E,MAAM;;AAC5D,kBAAIA,OAAI3E,IAAAP,EAAS,UAAT,QAAAO,EAAgB;AAAA,gBAC1B,CAAC;AAAA,cAAA;AAAA,cAEL;AAAA,gBACE,SAAS,MACPiE;AAAA,kBAAEQ;AAAA,kBAAS,EAAE,MAAM,SAAS,YAAY,IAAM,MAAM,QAAA;AAAA,kBAAW,MAC7D,EAAE,eAAe;AAAA,gBAAA;AAAA,gBAErB,SAAS,MAAM,EAAE,sBAAsB,EAAE,MAAM,EAAE,MAAM;AAAA,cAAA;AAAA,YACzD;AAAA,YAENF,EAAY,SACRN;AAAA,cACEW;AAAA,cACA;AAAA,gBACE,SAAS;AAAA,gBACT,SAASL;AAAA,gBACT,UAAU,CAACM,MAAgB;;AACzB,kBAAIA,MAAQ,mBAAiB7E,IAAAE,EAAc,UAAd,QAAAF,EAAqB,UAAU,KACnD6E,MAAQ,cAAiBzE,EAAa,CAAC;AAAA,gBAClD;AAAA,cAAA;AAAA,cAEF,MACE6D;AAAA,gBACEQ;AAAA,gBACA,EAAE,MAAM,SAAS,YAAY,IAAM,SAAStE,EAAgB,MAAA;AAAA,gBAC5D,MAAM,EAAE,aAAa;AAAA,cAAA;AAAA,YACvB,IAEJ;AAAA,UAAA,CACL;AAAA,QACH;AAAA,MAAA;AAAA,IACF;;;;QAMA2E,EAuGM,OAvGNC,IAuGM;AAAA,UArGJD,EA6DQ,SA7DRE,IA6DQ;AAAA,YA5DNF,EAkBM,OAlBNG,IAkBM;AAAA,cAjBJH,EAgBM,OAhBNI,IAgBM;AAAA,gBAfaxD,EAAA,MAAkB,eAAnCyD,EAcYC,EAAAC,EAAA,GAAA,EAAA,KAAA,EAAA,GAAA;AAAA,kBAbC,WACT,MASW;AAAA,oBATXC,EASWF,EAAAX,CAAA,GAAA;AAAA,sBATD,YAAA;AAAA,sBAAW,QAAA;AAAA,sBAAO,MAAK;AAAA,sBAAS,SAAO5C;AAAA,oBAAA;sBACpC,QACT,MAKE;AAAA,wBALFyD,EAKEC,GAAA;AAAA,0BAJC,MAA6B3D,EAAA,QAAc,+BAAA;AAAA,0BAG3C,MAAM;AAAA,wBAAA;;;;;6BAIJ,MACX;AAAA,oBADW4D,EAAA,MACXC,EAAG7D,EAAA,QAAiBwD,EAAA,CAAA,0BAA0BA,EAAA,CAAA,EAAC,kBAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;;;;YAKrDE,EAOUF,EAAAM,EAAA,GAAA;AAAA,cANA,OAAOvE,EAAA;AAAA,uDAAAA,EAAU,QAAAwE;AAAA,cACzB,MAAK;AAAA,cACL,WAAA;AAAA,cACC,aAAaP,EAAA,CAAA,EAAC,uBAAA;AAAA,YAAA;cAEJ,UAAO,MAAiD;AAAA,gBAAjDE,EAAiDC,GAAA;AAAA,kBAAxC,MAAK;AAAA,kBAAuB,MAAM;AAAA,gBAAA;;;;YAG/DT,EAQS,UAAA;AAAA,cAPP,MAAK;AAAA,cACL,OAAKc,GAAA,CAAC,YAAU,EAAA,aACO7E,EAAA,UAAa,KAAA,CAAA,CAAA;AAAA,cACnC,gCAAOA,EAAA,QAAa;AAAA,YAAA;cAErBuE,EAAoEC,GAAA;AAAA,gBAA3D,OAAM;AAAA,gBAAiB,MAAK;AAAA,gBAAmB,MAAM;AAAA,cAAA;cAC9DT,EAA4D,QAA5De,IAA4DJ,EAA3BL,EAAA,CAAA,EAAC,cAAA,CAAA,GAAA,CAAA;AAAA,YAAA;8BAGpCN,EAAoC,OAAA,EAA/B,OAAM,uBAAA,GAAsB,MAAA,EAAA;AAAA,YAEjCQ,EAkBSF,EAAAU,EAAA,GAAA;AAAA,cAlBA,MAAMnF,EAAA;AAAA,cAAY,OAAM;AAAA,YAAA;yBAC/B,MAgBE;AAAA,gBAhBF2E,EAgBEF,EAAAW,EAAA,GAAA;AAAA,kBAfA,OAAM;AAAA,kBACN,cAAA;AAAA,kBACA,YAAA;AAAA,kBACA,aAAA;AAAA,kBACA,aAAU;AAAA,kBACV,eAAY;AAAA,kBACZ,kBAAe;AAAA,kBACd,MAAMnF,EAAA;AAAA,kBACN,SAASO,EAAA;AAAA,kBACT,QAAQC;AAAA,kBACR,yBAAuB;AAAA,kBACvB,iBAAeL,EAAA,SAAa,OAAA,CAAA,IAAA,CAAiBA,EAAA,KAAa;AAAA,kBAC1D,iBAAeU,EAAA;AAAA,kBACf,yBAAsBR;AAAA,kBACtB,yBAAoB+E,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAE,CAAA9E,MAASO,EAAA,QAAkBP;AAAA,gBAAA;;;;;UAKxDoE,EAqCaF,EAAAa,EAAA,GAAA;AAAA,YApCV,qBAAmB;AAAA,qBAChB;AAAA,YAAJ,KAAIxG;AAAA,YACH,SAAAuE;AAAA,YACA,SAASoB,EAAArF,CAAA,EAAQ;AAAA,YACjB,QAAQiB,EAAA;AAAA,YACT,eAAA;AAAA,YACA,kBAAA;AAAA,YACA,eAAY;AAAA,YACX,oBAAkBoE,EAAAzF,CAAA;AAAA,YAClB,2BAAuBqG,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAG9E,MAA+BvB,EAAA,QAAcuB;AAAA,YACvE,SAAK8E,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAE,CAAAlC,MAAKsB,EAAAlG,CAAA,EAAQ,MAAMkG,EAAArB,CAAA,EAAeD,CAAC,CAAA;AAAA,UAAA;YAEhC,WACT,MAGW;AAAA,sBAHXqB,EAGWC,EAAAX,CAAA,GAAA;AAAA,gBAHgC,MAAK;AAAA,gBAAW,SAAKuB,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAL,MAAA;;AAAE,0BAAA3F,IAAAC,EAAA,UAAA,gBAAAD,EAAa;AAAA;AAAA,cAAO;gBACzE,QAAK,MAAqC;AAAA,kBAArCsF,EAAqCC,GAAA;AAAA,oBAA5B,MAAK;AAAA,oBAAW,MAAM;AAAA,kBAAA;;2BAAiB,MAChE;AAAA,kBADgEC,EAAA,QAC7DJ,EAAA,CAAA,EAAC,YAAA,CAAA,GAAA,CAAA;AAAA,gBAAA;;;oBAFY,uBAAuB;AAAA,cAAA;sBAIzCD,EAQWC,EAAAX,CAAA,GAAA;AAAA,gBANT,MAAK;AAAA,gBACJ,WAAWW,EAAAxF,CAAA;AAAA,gBACX,SAAOwF,EAAAvF,CAAA;AAAA,cAAA;gBAEG,QAAK,MAAsC;AAAA,kBAAtCyF,EAAsCC,GAAA;AAAA,oBAA7B,MAAK;AAAA,oBAAY,MAAM;AAAA,kBAAA;;2BAAiB,MACjE;AAAA,kBADiEC,EAAA,QAC9DJ,EAAA,CAAA,EAAC,oBAAA,CAAA,GAAA,CAAA;AAAA,gBAAA;;;oBANI,oCAAoC;AAAA,cAAA;sBAS9CD,EAGWC,EAAAX,CAAA,GAAA;AAAA,gBAHgD,gCAAOvB,EAAA,QAAU;AAAA,cAAA;gBAC/D,QAAK,MAA8C;AAAA,kBAA9CoC,EAA8CC,GAAA;AAAA,oBAArC,MAAK;AAAA,oBAAoB,MAAM;AAAA,kBAAA;;2BAAiB,MACzE;AAAA,kBADyEC,EAAA,QACtEJ,EAAA,CAAA,EAAC,eAAA,CAAA,GAAA,CAAA;AAAA,gBAAA;;;oBAFY,sCAAsC;AAAA,cAAA;sBAIxDD,EAGWC,EAAAX,CAAA,GAAA;AAAA,gBAHuC,gCAAOtB,EAAA,QAAU;AAAA,cAAA;gBACtD,QAAK,MAAgD;AAAA,kBAAhDmC,EAAgDC,GAAA;AAAA,oBAAvC,MAAK;AAAA,oBAAsB,MAAM;AAAA,kBAAA;;2BAAiB,MAC3E;AAAA,kBAD2EC,EAAA,QACxEJ,EAAA,CAAA,EAAC,eAAA,CAAA,GAAA,CAAA;AAAA,gBAAA;;;oBAFY,6BAA6B;AAAA,cAAA;;;;;QAQrDE,EAOEY,IAAA;AAAA,mBANI;AAAA,UAAJ,KAAIjG;AAAA,UACH,oBAAkBM,EAAA;AAAA,UAClB,gBAAcC,EAAA;AAAA,UACd,oBAAkBC,EAAA;AAAA,UAClB,SAAKuF,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;;AAAQ,oBAAAhG,IAAAP,EAAA,UAAA,gBAAAO,EAAU;AAAA;AAAA,UACvB,qCAAoB,CAAAuC,MAAA;;AAAK,oBAAAvC,IAAAE,YAAA,gBAAAF,EAAe,WAAWuC,GAAC;AAAA;AAAA,QAAA;QAGvD+C,EAA0Ca,IAAA;AAAA,mBAAlB;AAAA,UAAJ,KAAIjG;AAAA,QAAA;QAExBoF,EAMEc,IAAA;AAAA,UALQ,MAAMlD,EAAA;AAAA,oDAAAA,EAAU,QAAAyC;AAAA,UACvB,KAAKrC;AAAA,UACL,sBAAoB8B,EAAA,CAAA,EAAC,+BAAA;AAAA,UACrB,0BAAwBA,EAAA,CAAA,EAAC,4BAAA;AAAA,UACzB,QAAIY,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA,MAAA;;AAAQ,oBAAAhG,IAAAP,EAAA,UAAA,gBAAAO,EAAU;AAAA;AAAA,QAAO;QAGhCsF,EAKEe,IAAA;AAAA,UAJQ,MAAMlD,EAAA;AAAA,oDAAAA,EAAU,QAAAwC;AAAA,UACvB,SAAStC;AAAA,UACT,SAASD,EAAA;AAAA,UACT,WAASO;AAAA,QAAA;;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "smart-admin-web",
3
- "version": "10.12.0",
3
+ "version": "10.12.2",
4
4
  "description": "SmartAdmin 前端内核:布局、路由、鉴权、内置系统页与共享组件,配合 SmartAdmin NuGet 包使用",
5
5
  "keywords": [
6
6
  "smartadmin",