fix: 接入用户与权限后端接口
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user