smart-admin-web 10.22.0 → 10.23.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.
@@ -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 { createReusableTemplate, useElementSize, useStorage } from '@vueuse/core'\nimport { useRoute } from 'vue-router'\nimport {\n NButton,\n NTree,\n NSpace,\n NTag,\n NAvatar,\n type DataTableSortState,\n NPopconfirm,\n NDropdown,\n NInput,\n NSpin,\n NTooltip,\n NDrawer,\n NDrawerContent,\n useMessage,\n type DropdownOption,\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 UserGrantMenuSheet from './components/UserGrantMenuSheet.vue'\nimport UserGrantOverviewDrawer from './components/UserGrantOverviewDrawer.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 { useUserStore } from '#/stores/user'\nimport { translateError } from '#/utils/error'\nimport {\n SEARCH_ACTIONS,\n flatSearchOf,\n presetEqualFilter,\n deriveHeaderFilters,\n} from '#/utils/tableFilter'\nimport { TABLE_MIN_ROW_HEIGHT, TABLE_TOOLBAR } from '#/utils/tableToolbar'\nimport TableTotal from '#/components/TableTotal/index.vue'\nimport { triggerBlobDownload } from '#/utils/download'\nimport { buildTree, expandableIds, rootExpandableIds } 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 { checkedKeys, run: batchDelete } = 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 grantSheetRef = ref<InstanceType<typeof UserGrantMenuSheet> | null>(null)\nconst userStore = useUserStore()\nconst myId = computed(() => userStore.userInfo?.userId)\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 约定:搜索走 NTree 自带 pattern/filter;\n// 展开受控,进页面只展开一级,选中节点自动展开其祖先链;整栏可向左收起。\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<{ orgId?: number }>(() =>\n selectedOrgId.value == null ? {} : { orgId: selectedOrgId.value },\n)\nfunction onOrgSelect(keys: (string | number)[]) {\n // 再点选中项 → 取消选中 → 恢复全部\n pickOrg(keys.length ? Number(keys[0]) : null)\n}\n\n// ── 内容区较窄时,机构树收进左侧抽屉 ──\n// 判据是页面内容区宽度(不是视口):侧栏展开 / 收起都会改变它。面板占掉的宽度本来就会让右侧表格变窄,\n// 收进抽屉后表格得到整行宽度;表格自己的窄档(卡片列表)由库按表格卡片宽度另行判定,页面不管。\nconst COMPACT_WIDTH = 1000\nconst layoutRef = ref<HTMLElement>()\nconst { width: layoutWidth } = useElementSize(layoutRef)\n// 量到宽度前(0)按宽屏渲染,避免首帧闪一下抽屉模式\nconst compact = computed(() => layoutWidth.value > 0 && layoutWidth.value < COMPACT_WIDTH)\nconst orgDrawer = ref(false)\n// 宽屏下机构栏可向左收起,收起后表格占满整行;状态记在本浏览器里,下次进页面保持。窄屏走抽屉,不受它影响。\nconst orgPanelHidden = useStorage('sa-user-org-panel-hidden', false)\nfunction pickOrg(id: number | null) {\n selectedOrgId.value = id\n orgDrawer.value = false\n}\n// 工具栏最左的机构按钮:窄屏打开抽屉,宽屏收起时把机构栏请回来\nfunction openOrgPanel() {\n if (compact.value) orgDrawer.value = true\n else orgPanelHidden.value = false\n}\n// 机构面板的内容(分组头 / 搜索 / 「全部」/ 树)只写一份:宽屏放在 aside 里,窄屏放进抽屉。\n// drawer = 放在抽屉里:标题栏已写了「机构」,头部不再重复分组名,也没有「向左收起」。\nconst [DefineOrgPanel, ReuseOrgPanel] = createReusableTemplate<{ drawer?: boolean }>()\nconst selectedOrgName = computed(\n () => orgFlat.value.find(o => o.id === selectedOrgId.value)?.name ?? t('user.orgFilter'),\n)\n\n// 机构不多时一眼能看完,搜索框只是平白占一行;超过这个数才出现。\nconst ORG_SEARCH_MIN = 15\nconst orgSearchable = computed(() => orgFlat.value.length > ORG_SEARCH_MIN)\nconst orgPattern = ref('')\n// 展开箭头:小号 chevron,展开时 naive 把它所在的容器转 90°;没有连接线,层级靠缩进。\nconst renderOrgSwitcher = () => h(AppIcon, { icon: 'ph:caret-right', size: 12 })\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 firstLevelOrgKeys = computed(() => rootExpandableIds(orgTree.value))\nconst allOrgExpanded = computed(\n () =>\n expandableOrgKeys.value.length > 0 &&\n orgExpandedKeys.value.length >= expandableOrgKeys.value.length,\n)\n// 没有比第一层更深的层级时,「全部展开」与「只展开一级」是同一个状态,切换按钮没有意义,不出现。\nconst canToggleOrgDepth = computed(\n () => expandableOrgKeys.value.length > firstLevelOrgKeys.value.length,\n)\nconst orgToggleLabel = computed(() =>\n allOrgExpanded.value ? t('user.collapseToFirstLevel') : t('common.expandAll'),\n)\n// 全部展开 ↔ 回到默认的只展开一级(而不是把根也收起:只有一个根的机构树会缩成一行)\nfunction toggleExpandAllOrg() {\n orgExpandedKeys.value = allOrgExpanded.value\n ? [...firstLevelOrgKeys.value]\n : [...expandableOrgKeys.value]\n}\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 // 受控展开:一旦传了 expanded-keys,naive 就以它为准,不会自己默认展开——数据到位时自己播种「只展开一级」。\n // 只在这一次播种,之后用户手动展开 / 收起的状态不会被覆盖。\n orgExpandedKeys.value = [...firstLevelOrgKeys.value]\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 // route 是全局的:页面被 keep-alive 着,切到别的页面时 query.roleId 变 undefined,本页的 watcher 照样会响。\n // 不守卫就等于「离开本页 = 清掉角色条件并在后台发一次没人看的请求」,切回来条件还没了(任务日志页同理)。\n if (route.path !== '/system/user') return\n // 条件构造器下搜索值在过滤态里而不是 params;presetEqualFilter 内部比较当前条件,\n // 值没变就不写 —— 实例就绪与 query 变化可能各触发一次,第二次不该再发请求。\n // 远程模式下 setFilter 自己会回第 1 页重查,不用再 search()。\n presetEqualFilter(inst, 'roleId', roleId == null ? undefined : Number(roleId))\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// 单独授权一览抽屉(全系统的授权例外在一张表里复核)\nconst grantOverviewShow = ref(false)\nconst grantOverviewRef = ref<InstanceType<typeof UserGrantOverviewDrawer> | null>(null)\n\n// 授权菜单弹窗保存成功:用户表刷新;一览抽屉开着时也刷新,「去调整」改过的记录马上反映在列表里。\n// 抽屉没开就不拉:下次打开本来就会重新取数。\nfunction onGrantSaved() {\n tableRef.value?.refresh()\n if (grantOverviewShow.value) grantOverviewRef.value?.refresh()\n}\n\n// 导入 / 导出、单独授权一览收进表格内置的「更多」菜单(统一标准:业务按钮只留高频动作)。\n// 没有任何权限时 more 为空数组,按钮不出现,不会露出一个空菜单;导入 / 导出的权限码与原按钮的 v-auth 一字不差。\nconst toolbarMore = computed(() =>\n [\n authStore.hasPerm('POST:/api/v1/sys/user/import/preview')\n ? { label: t('import.button'), key: 'import' }\n : null,\n authStore.hasPerm('GET:/api/v1/sys/user/export')\n ? { label: t('export.button'), key: 'export' }\n : null,\n authStore.hasPerm('GET:/api/v1/sys/user/menu-grants/page')\n ? { label: t('userGrant.overview'), key: 'grantOverview' }\n : null,\n ].filter((o): o is { label: string; key: string } => o !== null),\n)\n// 引用稳定的 toolbar 配置:不要把 `{ ...TABLE_TOOLBAR, more }` 直接写进模板,那样每次重渲染都会新建一个对象\nconst toolbar = computed(() => ({ ...TABLE_TOOLBAR, more: toolbarMore.value }))\nfunction onMoreSelect(key: string | number) {\n if (key === 'import') importShow.value = true\n else if (key === 'export') exportShow.value = true\n else if (key === 'grantOverview') grantOverviewShow.value = true\n}\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// 当前排序:库把排序当作额外请求参数直接拼进列表请求,不会放进 inst.params,导出要「与列表排序一致」就得自己接住。\nconst sorter = ref<{ field: string; order: 'asc' | 'desc' } | null>(null)\nfunction onSorter(state: DataTableSortState | DataTableSortState[] | null) {\n const s = Array.isArray(state) ? state[0] : state\n sorter.value =\n s && s.order\n ? { field: String(s.columnKey), order: s.order === 'ascend' ? 'asc' : 'desc' }\n : null\n}\n\n/** 导出:带当前 SmartTable 筛选(含左侧机构树 orgId)+ 当前排序 + 选中列。 */\nasync function onExport(keys: string[]) {\n // 搜索值在过滤态里,flatSearchOf 序列化回扁平键;orgId 来自左侧机构树的联动参数(:params),不在过滤态里,\n // 排序也不在 inst.params 里,所以这两项都取页面自己持有的状态。\n const p = flatSearchOf(tableRef.value)\n exporting.value = true\n try {\n const blob = await userApi.export({\n account: p.account || undefined,\n name: p.name || undefined,\n orgId: tableParams.value.orgId,\n roleId: p.roleId != null ? Number(p.roleId) : undefined,\n sortField: sorter.value?.field,\n sortOrder: sorter.value?.order,\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\n/** 空值占位:「—」用 faint 弱化 */\nconst dash = () => h('span', { class: 'faint' }, '—')\n/** 下拉菜单项的线条图标 */\nconst menuIcon = (name: string) => () => h(AppIcon, { icon: name, size: 16 })\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 card: 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 {\n key: 'account',\n ellipsis: { tooltip: true },\n title: () => t('user.account'),\n search: { actions: SEARCH_ACTIONS.fuzzy },\n sorter: true,\n },\n {\n key: 'name',\n ellipsis: { tooltip: true },\n title: () => t('user.name'),\n card: 'title',\n search: { actions: SEARCH_ACTIONS.fuzzy },\n sorter: true,\n },\n {\n key: 'phone',\n width: 130,\n ellipsis: { tooltip: true },\n title: () => t('user.phone'),\n sorter: true,\n render: r => (r.phone ? h('span', { class: 'num' }, r.phone) : dash()),\n },\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 }) : dash()),\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: { actions: SEARCH_ACTIONS.exact, props: { clearable: true } },\n },\n {\n key: 'orgName',\n ellipsis: { tooltip: true },\n title: () => t('user.org'),\n render: r => r.orgName || dash(),\n },\n {\n key: 'positionName',\n title: () => t('user.position'),\n hideInTable: true,\n render: r => r.positionName || dash(),\n },\n {\n key: 'enabled',\n title: () => t('user.status'),\n width: 90,\n sorter: true,\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 : dash(),\n },\n {\n key: 'createTime',\n width: 170,\n title: () => t('user.createTime'),\n format: 'datetime',\n sorter: true,\n },\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 rawMoreOptions: (DropdownOption | null)[] = [\n authStore.hasPerm('PUT:/api/v1/sys/user/menu') && !r.isSuperAdmin && r.id !== myId.value\n ? { key: 'grantMenus', label: t('userGrant.action'), icon: menuIcon('ph:list-checks') }\n : null,\n authStore.hasPerm('PUT:/api/v1/sys/user/{id}/password')\n ? { key: 'resetPassword', label: t('user.resetPassword'), icon: menuIcon('ph:key') }\n : null,\n r.totpEnabled && authStore.hasPerm('POST:/api/v1/sys/mfa/clear')\n ? {\n key: 'clearMfa',\n label: t('user.clearMfa'),\n icon: menuIcon('ph:link-break'),\n disabled: clearMfaLoading.value,\n }\n : null,\n ]\n const moreOptions = rawMoreOptions.filter((o): o is DropdownOption => o !== null)\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 else if (key === 'grantMenus')\n grantSheetRef.value?.open({ id: r.id, name: r.name })\n },\n },\n () =>\n h(\n NButton,\n {\n size: 'small',\n quaternary: true,\n type: 'primary',\n iconPlacement: 'right',\n loading: clearMfaLoading.value,\n },\n {\n default: () => t('common.more'),\n icon: () => h(AppIcon, { icon: 'ph:caret-down', size: 12 }),\n },\n ),\n )\n : null,\n ])\n },\n },\n]\nderiveHeaderFilters(columns)\n</script>\n\n<template>\n <!-- 机构面板内容(分组头 / 搜索 / 「全部」/ 树),只写一份:宽屏放进 aside,内容区 < 1000 时放进抽屉。 -->\n <DefineOrgPanel v-slot=\"{ drawer }\">\n <div class=\"side-filter__head\">\n <span v-if=\"!drawer\" class=\"side-filter__title\">{{ t('user.orgFilter') }}</span>\n <div class=\"side-filter__actions\">\n <n-tooltip v-if=\"canToggleOrgDepth\">\n <template #trigger>\n <button\n type=\"button\"\n class=\"side-filter__btn side-filter__toggle\"\n :class=\"{ 'is-flipped': allOrgExpanded }\"\n :aria-label=\"orgToggleLabel\"\n @click=\"toggleExpandAllOrg\"\n >\n <AppIcon icon=\"ph:caret-double-down\" :size=\"14\" />\n </button>\n </template>\n {{ orgToggleLabel }}\n </n-tooltip>\n <n-tooltip v-if=\"!drawer\">\n <template #trigger>\n <button\n type=\"button\"\n class=\"side-filter__btn side-filter__hide\"\n :aria-label=\"t('user.hideOrgPanel')\"\n @click=\"orgPanelHidden = true\"\n >\n <AppIcon icon=\"ph:sidebar-simple\" :size=\"16\" />\n </button>\n </template>\n {{ t('user.hideOrgPanel') }}\n </n-tooltip>\n </div>\n </div>\n\n <n-input\n v-if=\"orgSearchable\"\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=\"pickOrg(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 :indent=\"16\"\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 :render-switcher-icon=\"renderOrgSwitcher\"\n @update:selected-keys=\"onOrgSelect\"\n @update:expanded-keys=\"keys => (orgExpandedKeys = keys as unknown as number[])\"\n />\n </n-spin>\n </DefineOrgPanel>\n\n <!-- 「左分组栏 + 右列表」= styles/layout.css 里的形状 3:.side-page 负责 display/gap/拉伸/整屏高度。\n 窄内容区不画 aside,表格独占整行,SmartTable 照样是 .side-page 的直接子元素,高度链不变。 -->\n <div ref=\"layoutRef\" class=\"user-layout side-page\">\n <!-- 左侧机构树筛选:面板外观对齐内核 .side-filter 约定。收起时留在 DOM 里(宽度过渡到 0 再淡出),\n inert 让它退出 Tab 顺序与读屏。 -->\n <aside\n v-if=\"!compact\"\n class=\"side-filter\"\n :class=\"{ 'is-hidden': orgPanelHidden }\"\n :inert=\"orgPanelHidden || undefined\"\n >\n <ReuseOrgPanel />\n </aside>\n\n <SmartTable\n ref=\"tableRef\"\n :columns=\"columns\"\n :fetcher=\"userApi.page\"\n :params=\"tableParams\"\n :search=\"{ container: 'table' }\"\n :toolbar=\"toolbar\"\n fill-height\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n card-on-narrow\n storage-key=\"sys-user\"\n :checked-row-keys=\"checkedKeys\"\n @update:sorter=\"onSorter\"\n @update:checked-row-keys=\"(keys: (string | number)[]) => (checkedKeys = keys)\"\n @more-select=\"onMoreSelect\"\n @error=\"e => message.error(translateError(e))\"\n >\n <template #pagination-prefix=\"{ itemCount }\">\n <TableTotal :count=\"itemCount\" />\n </template>\n <!-- 内容区 < 1000 机构树收进抽屉,或宽屏下机构栏被收起:工具栏最左出「机构」按钮,显示当前筛选的机构名,\n 点它打开抽屉 / 请回机构栏(限定数据范围的控件,不是业务按钮,所以放在 #toolbar 左半) -->\n <template v-if=\"compact || orgPanelHidden\" #toolbar>\n <n-button\n class=\"org-trigger\"\n secondary\n :title=\"compact ? undefined : t('user.showOrgPanel')\"\n @click=\"openOrgPanel\"\n >\n <template #icon>\n <AppIcon :icon=\"compact ? 'ph:tree-structure' : 'ph:sidebar-simple'\" :size=\"16\" />\n </template>\n {{ selectedOrgName }}\n </n-button>\n </template>\n <!-- #toolbar-right = 工具栏右半(内置图标之前) -->\n <template #toolbar-right>\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 </template>\n <!-- 勾选后工具栏换成批量栏(本页全选 + 已选 N 项 + 这里的按钮 + 取消选择),按钮出现即代表有勾选 -->\n <template #batch>\n <n-button\n v-auth=\"'POST:/api/v1/sys/user/batch-delete'\"\n secondary\n type=\"error\"\n @click=\"batchDelete\"\n >\n <template #icon><AppIcon icon=\"ph:trash\" :size=\"16\" /></template>\n {{ t('common.batchDelete') }}\n </n-button>\n </template>\n </SmartTable>\n </div>\n\n <!-- 内容区 < 1000:机构树的左侧抽屉,选中后自动收起 -->\n <n-drawer v-model:show=\"orgDrawer\" placement=\"left\" width=\"min(300px, 88vw)\">\n <n-drawer-content :title=\"t('user.orgFilter')\" closable>\n <div class=\"org-drawer-body\">\n <ReuseOrgPanel :drawer=\"true\" />\n </div>\n </n-drawer-content>\n </n-drawer>\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 <UserGrantMenuSheet ref=\"grantSheetRef\" @saved=\"onGrantSaved\" />\n\n <UserGrantOverviewDrawer\n ref=\"grantOverviewRef\"\n v-model:show=\"grantOverviewShow\"\n @adjust=\"u => grantSheetRef?.open(u)\"\n />\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\n/* 抽屉里的机构面板:与 aside 里同样的纵向堆叠与间距 */\n.org-drawer-body {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n/* 抽屉在触屏上用:头部图标按钮放大到可点的尺寸 */\n.org-drawer-body .side-filter__btn {\n width: 32px;\n height: 32px;\n}\n</style>\n"],"names":["COMPACT_WIDTH","ORG_SEARCH_MIN","t","useI18n","message","useMessage","run","confirm","useConfirm","authStore","useAuthStore","tableRef","ref","checkedKeys","batchDelete","useBatchDelete","userApi","_a","userFormRef","resetModalRef","grantSheetRef","userStore","useUserStore","myId","computed","clearMfaLoading","clearUserMfa","user","mfaApi","positionOptions","roleOptions","directorOptions","orgFlat","orgLoading","orgTree","buildTree","selectedOrgId","tableParams","onOrgSelect","keys","pickOrg","layoutRef","layoutWidth","useElementSize","compact","orgDrawer","orgPanelHidden","useStorage","id","openOrgPanel","DefineOrgPanel","ReuseOrgPanel","createReusableTemplate","selectedOrgName","o","orgSearchable","orgPattern","renderOrgSwitcher","h","AppIcon","filterOrg","input","node","kw","org","orgExpandedKeys","expandableOrgKeys","expandableIds","firstLevelOrgKeys","rootExpandableIds","allOrgExpanded","canToggleOrgDepth","orgToggleLabel","toggleExpandAllOrg","watch","byId","next","cursor","onMounted","items","positionApi","p","roleApi","r","u","orgApi","route","useRoute","inst","roleId","presetEqualFilter","initial","name","importShow","exportShow","exporting","grantOverviewShow","grantOverviewRef","onGrantSaved","_b","toolbarMore","toolbar","TABLE_TOOLBAR","onMoreSelect","key","userExportColumns","userImportApi","file","mapping","rows","strategy","sorter","onSorter","state","s","onExport","flatSearchOf","blob","triggerBlobDownload","e","translateError","dash","menuIcon","columns","NAvatar","SEARCH_ACTIONS","DictTag","StatusSwitch","v","NTag","moreOptions","NSpace","NButton","NPopconfirm","ok","NDropdown","deriveHeaderFilters","_createVNode","_unref","_withCtx","drawer","_createElementVNode","_hoisted_1","_createElementBlock","_hoisted_2","_toDisplayString","_hoisted_3","_createBlock","NTooltip","_normalizeClass","_createTextVNode","NInput","$event","_hoisted_6","NSpin","NTree","_cache","SmartTable","TABLE_MIN_ROW_HEIGHT","itemCount","TableTotal","NDrawer","NDrawerContent","_hoisted_8","UserFormModal","ResetPasswordModal","UserGrantMenuSheet","UserGrantOverviewDrawer","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 { createReusableTemplate, useStorage } from '@vueuse/core'\nimport { useRoute } from 'vue-router'\nimport {\n NButton,\n NTree,\n NSpace,\n NTag,\n NAvatar,\n type DataTableSortState,\n NPopconfirm,\n NDropdown,\n NInput,\n NSpin,\n NTooltip,\n useMessage,\n type DropdownOption,\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 SidePanelDrawer from '#/components/SidePanelDrawer/index.vue'\nimport UserFormModal from './components/UserFormModal.vue'\nimport ResetPasswordModal from './components/ResetPasswordModal.vue'\nimport UserGrantMenuSheet from './components/UserGrantMenuSheet.vue'\nimport UserGrantOverviewDrawer from './components/UserGrantOverviewDrawer.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { useBatchDelete } from '#/composables/useBatchDelete'\nimport { useSidePanel } from '#/composables/useSidePanel'\nimport { mfaApi, userApi, positionApi, roleApi, orgApi } from '#/api'\nimport { useAuthStore } from '#/stores/auth'\nimport { useUserStore } from '#/stores/user'\nimport { translateError } from '#/utils/error'\nimport {\n SEARCH_ACTIONS,\n flatSearchOf,\n presetEqualFilter,\n deriveHeaderFilters,\n} from '#/utils/tableFilter'\nimport { TABLE_MIN_ROW_HEIGHT, TABLE_TOOLBAR } from '#/utils/tableToolbar'\nimport TableTotal from '#/components/TableTotal/index.vue'\nimport { triggerBlobDownload } from '#/utils/download'\nimport { buildTree, expandableIds, rootExpandableIds } 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 { checkedKeys, run: batchDelete } = 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 grantSheetRef = ref<InstanceType<typeof UserGrantMenuSheet> | null>(null)\nconst userStore = useUserStore()\nconst myId = computed(() => userStore.userInfo?.userId)\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 约定:搜索走 NTree 自带 pattern/filter;\n// 展开受控,进页面只展开一级,选中节点自动展开其祖先链;整栏可向左收起。\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<{ orgId?: number }>(() =>\n selectedOrgId.value == null ? {} : { orgId: selectedOrgId.value },\n)\nfunction onOrgSelect(keys: (string | number)[]) {\n // 再点选中项 → 取消选中 → 恢复全部\n pickOrg(keys.length ? Number(keys[0]) : null)\n}\n\n// ── 内容区较窄时,机构树收进左侧抽屉 ──\n// 判据与抽屉本体都是内核的:useSidePanel(壳层内容区宽度 < 1000,量到宽度前按宽屏渲染,首帧不闪)+ SidePanelDrawer。\n// 表格自己的窄档(卡片列表)由库按表格卡片宽度另行判定,页面不管。\nconst { compact, drawerOpen: orgDrawer } = useSidePanel()\n// 宽屏下机构栏可向左收起,收起后表格占满整行;状态记在本浏览器里,下次进页面保持。窄屏走抽屉,不受它影响。\nconst orgPanelHidden = useStorage('sa-user-org-panel-hidden', false)\nfunction pickOrg(id: number | null) {\n selectedOrgId.value = id\n orgDrawer.value = false\n}\n// 工具栏最左的机构按钮:窄屏打开抽屉,宽屏收起时把机构栏请回来\nfunction openOrgPanel() {\n if (compact.value) orgDrawer.value = true\n else orgPanelHidden.value = false\n}\n// 机构面板的内容(分组头 / 搜索 / 「全部」/ 树)只写一份:宽屏放在 aside 里,窄屏放进抽屉。\n// drawer = 放在抽屉里:标题栏已写了「机构」,头部不再重复分组名,也没有「向左收起」。\nconst [DefineOrgPanel, ReuseOrgPanel] = createReusableTemplate<{ drawer?: boolean }>()\nconst selectedOrgName = computed(\n () => orgFlat.value.find(o => o.id === selectedOrgId.value)?.name ?? t('user.orgFilter'),\n)\n\n// 机构不多时一眼能看完,搜索框只是平白占一行;超过这个数才出现。\nconst ORG_SEARCH_MIN = 15\nconst orgSearchable = computed(() => orgFlat.value.length > ORG_SEARCH_MIN)\nconst orgPattern = ref('')\n// 展开箭头:小号 chevron,展开时 naive 把它所在的容器转 90°;没有连接线,层级靠缩进。\nconst renderOrgSwitcher = () => h(AppIcon, { icon: 'ph:caret-right', size: 12 })\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 firstLevelOrgKeys = computed(() => rootExpandableIds(orgTree.value))\nconst allOrgExpanded = computed(\n () =>\n expandableOrgKeys.value.length > 0 &&\n orgExpandedKeys.value.length >= expandableOrgKeys.value.length,\n)\n// 没有比第一层更深的层级时,「全部展开」与「只展开一级」是同一个状态,切换按钮没有意义,不出现。\nconst canToggleOrgDepth = computed(\n () => expandableOrgKeys.value.length > firstLevelOrgKeys.value.length,\n)\nconst orgToggleLabel = computed(() =>\n allOrgExpanded.value ? t('user.collapseToFirstLevel') : t('common.expandAll'),\n)\n// 全部展开 ↔ 回到默认的只展开一级(而不是把根也收起:只有一个根的机构树会缩成一行)\nfunction toggleExpandAllOrg() {\n orgExpandedKeys.value = allOrgExpanded.value\n ? [...firstLevelOrgKeys.value]\n : [...expandableOrgKeys.value]\n}\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 // 受控展开:一旦传了 expanded-keys,naive 就以它为准,不会自己默认展开——数据到位时自己播种「只展开一级」。\n // 只在这一次播种,之后用户手动展开 / 收起的状态不会被覆盖。\n orgExpandedKeys.value = [...firstLevelOrgKeys.value]\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 // route 是全局的:页面被 keep-alive 着,切到别的页面时 query.roleId 变 undefined,本页的 watcher 照样会响。\n // 不守卫就等于「离开本页 = 清掉角色条件并在后台发一次没人看的请求」,切回来条件还没了(任务日志页同理)。\n if (route.path !== '/system/user') return\n // 条件构造器下搜索值在过滤态里而不是 params;presetEqualFilter 内部比较当前条件,\n // 值没变就不写 —— 实例就绪与 query 变化可能各触发一次,第二次不该再发请求。\n // 远程模式下 setFilter 自己会回第 1 页重查,不用再 search()。\n presetEqualFilter(inst, 'roleId', roleId == null ? undefined : Number(roleId))\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// 单独授权一览抽屉(全系统的授权例外在一张表里复核)\nconst grantOverviewShow = ref(false)\nconst grantOverviewRef = ref<InstanceType<typeof UserGrantOverviewDrawer> | null>(null)\n\n// 授权菜单弹窗保存成功:用户表刷新;一览抽屉开着时也刷新,「去调整」改过的记录马上反映在列表里。\n// 抽屉没开就不拉:下次打开本来就会重新取数。\nfunction onGrantSaved() {\n tableRef.value?.refresh()\n if (grantOverviewShow.value) grantOverviewRef.value?.refresh()\n}\n\n// 导入 / 导出、单独授权一览收进表格内置的「更多」菜单(统一标准:业务按钮只留高频动作)。\n// 没有任何权限时 more 为空数组,按钮不出现,不会露出一个空菜单;导入 / 导出的权限码与原按钮的 v-auth 一字不差。\nconst toolbarMore = computed(() =>\n [\n authStore.hasPerm('POST:/api/v1/sys/user/import/preview')\n ? { label: t('import.button'), key: 'import' }\n : null,\n authStore.hasPerm('GET:/api/v1/sys/user/export')\n ? { label: t('export.button'), key: 'export' }\n : null,\n authStore.hasPerm('GET:/api/v1/sys/user/menu-grants/page')\n ? { label: t('userGrant.overview'), key: 'grantOverview' }\n : null,\n ].filter((o): o is { label: string; key: string } => o !== null),\n)\n// 引用稳定的 toolbar 配置:不要把 `{ ...TABLE_TOOLBAR, more }` 直接写进模板,那样每次重渲染都会新建一个对象\nconst toolbar = computed(() => ({ ...TABLE_TOOLBAR, more: toolbarMore.value }))\nfunction onMoreSelect(key: string | number) {\n if (key === 'import') importShow.value = true\n else if (key === 'export') exportShow.value = true\n else if (key === 'grantOverview') grantOverviewShow.value = true\n}\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// 当前排序:库把排序当作额外请求参数直接拼进列表请求,不会放进 inst.params,导出要「与列表排序一致」就得自己接住。\nconst sorter = ref<{ field: string; order: 'asc' | 'desc' } | null>(null)\nfunction onSorter(state: DataTableSortState | DataTableSortState[] | null) {\n const s = Array.isArray(state) ? state[0] : state\n sorter.value =\n s && s.order\n ? { field: String(s.columnKey), order: s.order === 'ascend' ? 'asc' : 'desc' }\n : null\n}\n\n/** 导出:带当前 SmartTable 筛选(含左侧机构树 orgId)+ 当前排序 + 选中列。 */\nasync function onExport(keys: string[]) {\n // 搜索值在过滤态里,flatSearchOf 序列化回扁平键;orgId 来自左侧机构树的联动参数(:params),不在过滤态里,\n // 排序也不在 inst.params 里,所以这两项都取页面自己持有的状态。\n const p = flatSearchOf(tableRef.value)\n exporting.value = true\n try {\n const blob = await userApi.export({\n account: p.account || undefined,\n name: p.name || undefined,\n orgId: tableParams.value.orgId,\n roleId: p.roleId != null ? Number(p.roleId) : undefined,\n sortField: sorter.value?.field,\n sortOrder: sorter.value?.order,\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\n/** 空值占位:「—」用 faint 弱化 */\nconst dash = () => h('span', { class: 'faint' }, '—')\n/** 下拉菜单项的线条图标 */\nconst menuIcon = (name: string) => () => h(AppIcon, { icon: name, size: 16 })\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 card: 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 {\n key: 'account',\n ellipsis: { tooltip: true },\n title: () => t('user.account'),\n search: { actions: SEARCH_ACTIONS.fuzzy },\n sorter: true,\n },\n {\n key: 'name',\n ellipsis: { tooltip: true },\n title: () => t('user.name'),\n card: 'title',\n search: { actions: SEARCH_ACTIONS.fuzzy },\n sorter: true,\n },\n {\n key: 'phone',\n width: 130,\n ellipsis: { tooltip: true },\n title: () => t('user.phone'),\n sorter: true,\n render: r => (r.phone ? h('span', { class: 'num' }, r.phone) : dash()),\n },\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 }) : dash()),\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: { actions: SEARCH_ACTIONS.exact, props: { clearable: true } },\n },\n {\n key: 'orgName',\n ellipsis: { tooltip: true },\n title: () => t('user.org'),\n render: r => r.orgName || dash(),\n },\n {\n key: 'positionName',\n title: () => t('user.position'),\n hideInTable: true,\n render: r => r.positionName || dash(),\n },\n {\n key: 'enabled',\n title: () => t('user.status'),\n width: 90,\n sorter: true,\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 : dash(),\n },\n {\n key: 'createTime',\n width: 170,\n title: () => t('user.createTime'),\n format: 'datetime',\n sorter: true,\n },\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 rawMoreOptions: (DropdownOption | null)[] = [\n authStore.hasPerm('PUT:/api/v1/sys/user/menu') && !r.isSuperAdmin && r.id !== myId.value\n ? { key: 'grantMenus', label: t('userGrant.action'), icon: menuIcon('ph:list-checks') }\n : null,\n authStore.hasPerm('PUT:/api/v1/sys/user/{id}/password')\n ? { key: 'resetPassword', label: t('user.resetPassword'), icon: menuIcon('ph:key') }\n : null,\n r.totpEnabled && authStore.hasPerm('POST:/api/v1/sys/mfa/clear')\n ? {\n key: 'clearMfa',\n label: t('user.clearMfa'),\n icon: menuIcon('ph:link-break'),\n disabled: clearMfaLoading.value,\n }\n : null,\n ]\n const moreOptions = rawMoreOptions.filter((o): o is DropdownOption => o !== null)\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 else if (key === 'grantMenus')\n grantSheetRef.value?.open({ id: r.id, name: r.name })\n },\n },\n () =>\n h(\n NButton,\n {\n size: 'small',\n quaternary: true,\n type: 'primary',\n iconPlacement: 'right',\n loading: clearMfaLoading.value,\n },\n {\n default: () => t('common.more'),\n icon: () => h(AppIcon, { icon: 'ph:caret-down', size: 12 }),\n },\n ),\n )\n : null,\n ])\n },\n },\n]\nderiveHeaderFilters(columns)\n</script>\n\n<template>\n <!-- 机构面板内容(分组头 / 搜索 / 「全部」/ 树),只写一份:宽屏放进 aside,内容区 < 1000 时放进抽屉。 -->\n <DefineOrgPanel v-slot=\"{ drawer }\">\n <div class=\"side-filter__head\">\n <span v-if=\"!drawer\" class=\"side-filter__title\">{{ t('user.orgFilter') }}</span>\n <div class=\"side-filter__actions\">\n <n-tooltip v-if=\"canToggleOrgDepth\">\n <template #trigger>\n <button\n type=\"button\"\n class=\"side-filter__btn side-filter__toggle\"\n :class=\"{ 'is-flipped': allOrgExpanded }\"\n :aria-label=\"orgToggleLabel\"\n @click=\"toggleExpandAllOrg\"\n >\n <AppIcon icon=\"ph:caret-double-down\" :size=\"14\" />\n </button>\n </template>\n {{ orgToggleLabel }}\n </n-tooltip>\n <n-tooltip v-if=\"!drawer\">\n <template #trigger>\n <button\n type=\"button\"\n class=\"side-filter__btn side-filter__hide\"\n :aria-label=\"t('user.hideOrgPanel')\"\n @click=\"orgPanelHidden = true\"\n >\n <AppIcon icon=\"ph:sidebar-simple\" :size=\"16\" />\n </button>\n </template>\n {{ t('user.hideOrgPanel') }}\n </n-tooltip>\n </div>\n </div>\n\n <n-input\n v-if=\"orgSearchable\"\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=\"pickOrg(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 :indent=\"16\"\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 :render-switcher-icon=\"renderOrgSwitcher\"\n @update:selected-keys=\"onOrgSelect\"\n @update:expanded-keys=\"keys => (orgExpandedKeys = keys as unknown as number[])\"\n />\n </n-spin>\n </DefineOrgPanel>\n\n <!-- 「左分组栏 + 右列表」= styles/layout.css 里的形状 3:.side-page 负责 display/gap/拉伸/整屏高度。\n 窄内容区不画 aside,表格独占整行,SmartTable 照样是 .side-page 的直接子元素,高度链不变。 -->\n <div class=\"user-layout side-page\">\n <!-- 左侧机构树筛选:面板外观对齐内核 .side-filter 约定。收起时留在 DOM 里(宽度过渡到 0 再淡出),\n inert 让它退出 Tab 顺序与读屏。 -->\n <aside\n v-if=\"!compact\"\n class=\"side-filter\"\n :class=\"{ 'is-hidden': orgPanelHidden }\"\n :inert=\"orgPanelHidden || undefined\"\n >\n <ReuseOrgPanel />\n </aside>\n\n <SmartTable\n ref=\"tableRef\"\n :columns=\"columns\"\n :fetcher=\"userApi.page\"\n :params=\"tableParams\"\n :search=\"{ container: 'table' }\"\n :toolbar=\"toolbar\"\n fill-height\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n card-on-narrow\n storage-key=\"sys-user\"\n :checked-row-keys=\"checkedKeys\"\n @update:sorter=\"onSorter\"\n @update:checked-row-keys=\"(keys: (string | number)[]) => (checkedKeys = keys)\"\n @more-select=\"onMoreSelect\"\n @error=\"e => message.error(translateError(e))\"\n >\n <template #pagination-prefix=\"{ itemCount }\">\n <TableTotal :count=\"itemCount\" />\n </template>\n <!-- 内容区 < 1000 机构树收进抽屉,或宽屏下机构栏被收起:工具栏最左出「机构」按钮,显示当前筛选的机构名,\n 点它打开抽屉 / 请回机构栏(限定数据范围的控件,不是业务按钮,所以放在 #toolbar 左半) -->\n <template v-if=\"compact || orgPanelHidden\" #toolbar>\n <n-button\n class=\"org-trigger\"\n secondary\n :title=\"compact ? undefined : t('user.showOrgPanel')\"\n @click=\"openOrgPanel\"\n >\n <template #icon>\n <AppIcon :icon=\"compact ? 'ph:tree-structure' : 'ph:sidebar-simple'\" :size=\"16\" />\n </template>\n {{ selectedOrgName }}\n </n-button>\n </template>\n <!-- #toolbar-right = 工具栏右半(内置图标之前) -->\n <template #toolbar-right>\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 </template>\n <!-- 勾选后工具栏换成批量栏(本页全选 + 已选 N 项 + 这里的按钮 + 取消选择),按钮出现即代表有勾选 -->\n <template #batch>\n <n-button\n v-auth=\"'POST:/api/v1/sys/user/batch-delete'\"\n secondary\n type=\"error\"\n @click=\"batchDelete\"\n >\n <template #icon><AppIcon icon=\"ph:trash\" :size=\"16\" /></template>\n {{ t('common.batchDelete') }}\n </n-button>\n </template>\n </SmartTable>\n </div>\n\n <!-- 内容区 < 1000:机构树的左侧抽屉,选中后自动收起 -->\n <SidePanelDrawer v-model:show=\"orgDrawer\" :title=\"t('user.orgFilter')\">\n <ReuseOrgPanel :drawer=\"true\" />\n </SidePanelDrawer>\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 <UserGrantMenuSheet ref=\"grantSheetRef\" @saved=\"onGrantSaved\" />\n\n <UserGrantOverviewDrawer\n ref=\"grantOverviewRef\"\n v-model:show=\"grantOverviewShow\"\n @adjust=\"u => grantSheetRef?.open(u)\"\n />\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":["ORG_SEARCH_MIN","useI18n","message","useMessage","run","confirm","useConfirm","authStore","useAuthStore","tableRef","ref","checkedKeys","batchDelete","useBatchDelete","userApi","_a","userFormRef","resetModalRef","grantSheetRef","userStore","useUserStore","myId","computed","clearMfaLoading","clearUserMfa","user","mfaApi","positionOptions","roleOptions","directorOptions","orgFlat","orgLoading","orgTree","buildTree","selectedOrgId","tableParams","onOrgSelect","keys","pickOrg","compact","orgDrawer","useSidePanel","orgPanelHidden","useStorage","id","openOrgPanel","DefineOrgPanel","ReuseOrgPanel","createReusableTemplate","selectedOrgName","o","orgSearchable","orgPattern","renderOrgSwitcher","h","AppIcon","filterOrg","input","node","kw","org","orgExpandedKeys","expandableOrgKeys","expandableIds","firstLevelOrgKeys","rootExpandableIds","allOrgExpanded","canToggleOrgDepth","orgToggleLabel","toggleExpandAllOrg","watch","byId","next","cursor","onMounted","items","positionApi","p","roleApi","u","orgApi","route","useRoute","inst","roleId","presetEqualFilter","initial","name","importShow","exportShow","exporting","grantOverviewShow","grantOverviewRef","onGrantSaved","_b","toolbarMore","toolbar","TABLE_TOOLBAR","onMoreSelect","key","userExportColumns","userImportApi","file","mapping","rows","strategy","sorter","onSorter","state","s","onExport","flatSearchOf","blob","triggerBlobDownload","e","translateError","dash","menuIcon","columns","r","NAvatar","SEARCH_ACTIONS","DictTag","StatusSwitch","v","NTag","moreOptions","NSpace","NButton","NPopconfirm","ok","NDropdown","deriveHeaderFilters","_createVNode","_unref","_withCtx","drawer","_createElementVNode","_hoisted_1","_createElementBlock","_hoisted_2","_toDisplayString","_hoisted_3","_createBlock","NTooltip","_normalizeClass","_createTextVNode","NInput","$event","_hoisted_6","NSpin","NTree","_cache","_hoisted_7","SmartTable","TABLE_MIN_ROW_HEIGHT","itemCount","TableTotal","SidePanelDrawer","UserFormModal","ResetPasswordModal","UserGrantMenuSheet","UserGrantOverviewDrawer","ImportWizard","ExportColumnsModal"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "smart-admin-web",
3
- "version": "10.22.0",
3
+ "version": "10.23.0",
4
4
  "description": "SmartAdmin 前端内核:布局、路由、鉴权、内置系统页与共享组件,配合 SmartAdmin NuGet 包使用",
5
5
  "keywords": [
6
6
  "smartadmin",