feat: 接入用户与文档权限管理

This commit is contained in:
xy
2026-09-03 18:43:42 +08:00
parent 6d56bc0075
commit f45864e817
24 changed files with 2139 additions and 775 deletions
@@ -13,7 +13,11 @@ const props = defineProps<{
loading: boolean
saving: boolean
error: boolean
errorMessage?: string
catalogError?: string
catalogLoading?: boolean
previewUserId: string
canEdit?: boolean
}>()
const emit = defineEmits<{
@@ -107,7 +111,7 @@ watch(
<template>
<section class="permission-panel">
<div class="panel-toolbar">
<label class="template-select">
<label v-if="templates.length" class="template-select">
<span>选择模板</span>
<select :value="selectedTemplateId" @change="handleTemplateChange">
<option value="" disabled>请选择模板</option>
@@ -116,6 +120,7 @@ watch(
</option>
</select>
</label>
<span v-else class="template-empty-label">当前院区暂无可配置模板</span>
<span v-if="selectedTemplate" class="template-meta">
{{ selectedTemplate.code || selectedTemplate.id }} · {{ selectedTemplate.category }}
</span>
@@ -130,10 +135,19 @@ watch(
</label>
</div>
<div v-if="!selectedTemplateId" class="empty-state">暂无模板,请先选择一个模板。</div>
<div v-if="catalogError" class="error-state">
<span>{{ catalogError }}</span>
<button type="button" class="retry-button" @click="emit('retry')">重新加载</button>
</div>
<div v-else-if="catalogLoading" class="loading-state">正在加载模板目录…</div>
<div v-else-if="!templates.length" class="empty-state">
暂无模板例外
<small>当前院区还没有可配置的文档模板。</small>
</div>
<div v-else-if="!selectedTemplateId" class="empty-state">请选择一个模板查看例外权限。</div>
<div v-else-if="loading" class="loading-state">正在加载模板权限…</div>
<div v-else-if="error" class="error-state">
<span>模板权限加载失败</span>
<span>{{ errorMessage || '模板权限加载失败,请稍后重试' }}</span>
<button type="button" class="retry-button" @click="emit('retry')">重新加载</button>
</div>
<template v-else>
@@ -179,8 +193,14 @@ watch(
<button
type="button"
class="delete-button"
:disabled="permission.inherited || saving"
:title="permission.inherited ? '继承权限不可直接删除' : '删除权限'"
:disabled="permission.inherited || saving || props.canEdit === false"
:title="
permission.inherited
? '继承权限不可直接删除'
: props.canEdit === false
? '当前账号无直接权限修改权限'
: '删除权限'
"
@click="deletePermission(permission.id)"
>
删除
@@ -193,7 +213,7 @@ watch(
<p v-else class="empty-state compact">当前模板暂无直接权限配置。</p>
</div>
<form class="add-form" @submit.prevent="submit">
<form v-if="props.canEdit !== false" class="add-form" @submit.prevent="submit">
<div class="list-heading">
<span>新增权限</span>
<span>服务端会再次校验授权范围</span>
@@ -237,6 +257,7 @@ watch(
</button>
</div>
</form>
<p v-else class="readonly-tip">当前账号仅可查看模板例外,新增和删除操作已禁用。</p>
</template>
</section>
</template>
@@ -299,6 +320,12 @@ select:disabled {
font-size: 11.5px;
}
.template-empty-label {
padding-bottom: 8px;
color: var(--mut);
font-size: 12px;
}
.list-heading {
display: flex;
gap: 12px;
@@ -406,6 +433,13 @@ td {
text-align: center;
}
.empty-state small {
display: block;
margin-top: 5px;
color: var(--mut);
font-size: 11px;
}
.error-state {
display: flex;
gap: 10px;
@@ -435,6 +469,15 @@ td {
background: #f8fbfc;
}
.readonly-tip {
padding: 10px 12px;
margin: 0;
color: var(--mut);
font-size: 11.5px;
background: #f8fbfc;
border-radius: 6px;
}
@media (max-width: 960px) {
.form-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));