fix: 接入用户与权限后端接口

This commit is contained in:
xy
2026-09-03 12:18:57 +08:00
parent e43a118dee
commit 48e5293509
19 changed files with 1982 additions and 375 deletions
@@ -10,25 +10,30 @@ import {
getTemplatePermissions,
isPermissionMockEnabled,
} from '@/api/management/document-permissions'
import { getRoles } from '@/api/management/roles'
import { getUsers } from '@/api/management/users'
import { getRoleSummaries } from '@/api/management/roles'
import type {
DepartmentRecord,
DocumentRecord,
RoleRecord,
TemplatePermissionRecord,
UserRecord,
} from '@/api/management/types'
import DepartmentPermissionTable from './components/DepartmentPermissionTable.vue'
import RolePermissionMatrix from './components/RolePermissionMatrix.vue'
import TemplatePermissionPanel from './components/TemplatePermissionPanel.vue'
import { departmentPermissionRows, permissionColumns, rolePermissionRows } from './mock'
import type {
DepartmentPermissionRow,
PermissionCellState,
PermissionKey,
PermissionSubjectOption,
RolePermissionRow,
TemplatePermissionForm,
} from './types'
type PermissionSubjectType = 'ROLE' | 'DEPARTMENT'
type PermissionSubjectType = 'ROLE' | 'DEPARTMENT' | 'USER'
interface PermissionResolution {
enabled: boolean
@@ -40,6 +45,7 @@ const permissionKeys: PermissionKey[] = ['VIEW', 'USE', 'MAINTAIN']
const loading = ref(true)
const roleRecords = ref<RoleRecord[]>([])
const departmentRecords = ref<DepartmentRecord[]>([])
const userRecords = ref<UserRecord[]>([])
const roleRows = ref<RolePermissionRow[]>([])
const departmentRows = ref<DepartmentPermissionRow[]>([])
const templates = ref<DocumentRecord[]>([])
@@ -54,6 +60,24 @@ const selectedTemplate = computed(() =>
templates.value.find((template) => template.id === selectedTemplateId.value),
)
const templateSubjects = computed<PermissionSubjectOption[]>(() => [
...roleRecords.value.map((role) => ({
id: role.id,
type: 'ROLE' as const,
label: `${role.name}(${role.code})`,
})),
...departmentRecords.value.map((department) => ({
id: department.id,
type: 'DEPARTMENT' as const,
label: department.name,
})),
...userRecords.value.map((user) => ({
id: user.id,
type: 'USER' as const,
label: `${user.name}(${user.account})`,
})),
])
function resolvePermission(
subjectType: PermissionSubjectType,
subjectId: string,
@@ -119,6 +143,23 @@ function syncPermissionRows() {
}))
}
async function getAllUsersForPermission() {
const firstPage = await getUsers({ page: 1, pageSize: 200, status: 'all' })
const pageCount = Math.ceil(firstPage.total / firstPage.pageSize)
if (pageCount <= 1) {
return firstPage.records
}
const remainingPages = await Promise.all(
Array.from({ length: pageCount - 1 }, (_, index) =>
getUsers({ page: index + 2, pageSize: 200, status: 'all' }),
),
)
return [firstPage, ...remainingPages].flatMap((page) => page.records)
}
async function loadPermissions() {
loading.value = true
@@ -135,11 +176,14 @@ async function loadPermissions() {
return
}
const [templatesResult, rolesResult, departmentsResult] = await Promise.allSettled([
getDocuments({ page: 1, pageSize: 200, status: 'all' }),
getRoles({ page: 1, pageSize: 200 }),
getDepartments(),
])
const [templatesResult, rolesResult, departmentsResult, usersResult] = await Promise.allSettled(
[
getDocuments({ page: 1, pageSize: 200, status: 'all' }),
getRoleSummaries(),
getDepartments(),
getAllUsersForPermission(),
],
)
if (templatesResult.status === 'rejected') {
throw templatesResult.reason
@@ -149,10 +193,15 @@ async function loadPermissions() {
roleRecords.value = rolesResult.status === 'fulfilled' ? rolesResult.value : []
departmentRecords.value =
departmentsResult.status === 'fulfilled' ? departmentsResult.value : []
userRecords.value = usersResult.status === 'fulfilled' ? usersResult.value : []
syncPermissionRows()
if (rolesResult.status === 'rejected' || departmentsResult.status === 'rejected') {
ElMessage.warning('角色或科室列表加载不完整,部分授权对象暂不可配置')
if (
rolesResult.status === 'rejected' ||
departmentsResult.status === 'rejected' ||
usersResult.status === 'rejected'
) {
ElMessage.warning('角色、科室或用户列表加载不完整,部分授权对象暂不可配置')
}
selectedTemplateId.value = templates.value[0]?.id ?? ''
@@ -160,6 +209,7 @@ async function loadPermissions() {
} catch {
roleRecords.value = []
departmentRecords.value = []
userRecords.value = []
roleRows.value = []
departmentRows.value = []
templates.value = []
@@ -330,11 +380,52 @@ async function setSubjectPermission(
}
}
async function addTemplatePermission(form: TemplatePermissionForm) {
if (!selectedTemplateId.value || permissionSaving.value) {
return
}
permissionSaving.value = true
try {
await createTemplatePermission(selectedTemplateId.value, form)
await loadTemplatePermissions()
ElMessage.success('模板权限已添加')
} catch (error) {
ElMessage.error(error instanceof Error ? error.message : '模板权限添加失败,请稍后重试')
} finally {
permissionSaving.value = false
}
}
async function removeTemplatePermission(permissionId: string) {
if (!selectedTemplateId.value || permissionSaving.value) {
return
}
permissionSaving.value = true
try {
await deleteTemplatePermission(selectedTemplateId.value, permissionId)
await loadTemplatePermissions()
ElMessage.success('模板权限已删除')
} catch (error) {
ElMessage.error(error instanceof Error ? error.message : '模板权限删除失败,请稍后重试')
} finally {
permissionSaving.value = false
}
}
function handleTemplateChange(event: Event) {
selectedTemplateId.value = (event.target as HTMLSelectElement).value
void loadTemplatePermissions()
}
function handlePanelTemplateChange(templateId: string) {
selectedTemplateId.value = templateId
void loadTemplatePermissions()
}
function retryTemplatePermissions() {
void loadTemplatePermissions()
}
@@ -435,6 +526,26 @@ onMounted(loadPermissions)
@toggle="toggleDepartmentPermission"
/>
</section>
<section v-if="!isPermissionMockEnabled" class="page-card direct-permission-card">
<div class="card-heading section-heading">
<div class="heading-copy">
<h2>模板权限明细与直接授权</h2>
<p>可对角色、科室或单个用户新增和删除模板权限;继承权限不能直接删除。</p>
</div>
</div>
<TemplatePermissionPanel
:templates="templates"
:selected-template-id="selectedTemplateId"
:permissions="templatePermissions"
:subjects="templateSubjects"
:loading="permissionLoading"
:saving="permissionSaving"
@update:selected-template-id="handlePanelTemplateChange"
@add="addTemplatePermission"
@delete="removeTemplatePermission"
/>
</section>
</template>
</section>
</template>