feat: 增加工作流和知识库三级权限

- 抽取统一资源访问骨架与部门可见范围判断

- 接入工作流和知识库的 READ/MANAGE 权限校验

- 增加可见范围配置与只读态前端交互
This commit is contained in:
2026-03-29 17:25:55 +08:00
parent f49d94e2fe
commit 22ceabff96
58 changed files with 3053 additions and 85 deletions

View File

@@ -1,5 +1,9 @@
<script setup lang="ts">
import type {FormInstance} from 'element-plus';
import type { FormInstance } from 'element-plus';
import { computed, onMounted, ref, watch } from 'vue';
import { InfoFilled } from '@element-plus/icons-vue';
import {
ElButton,
ElForm,
@@ -13,13 +17,9 @@ import {
ElTooltip,
} from 'element-plus';
import {computed, onMounted, ref, watch} from 'vue';
import {InfoFilled} from '@element-plus/icons-vue';
import {api} from '#/api/request';
import { api } from '#/api/request';
import UploadAvatar from '#/components/upload/UploadAvatar.vue';
import {$t} from '#/locales';
import { $t } from '#/locales';
const props = defineProps({
detailData: {
@@ -45,7 +45,10 @@ const props = defineProps({
searchEngineEnable: false,
englishName: '',
}),
required: true,
},
manageable: {
type: Boolean,
default: true,
},
});
@@ -54,7 +57,7 @@ const emit = defineEmits(['reload']);
const normalizeEntity = (raw: any) => {
const options = {
canUpdateEmbeddingModel: true,
...(raw?.options || {}),
...raw?.options,
};
if (options.rerankEnable === undefined || options.rerankEnable === null) {
options.rerankEnable = !!raw?.rerankModelId;
@@ -102,7 +105,7 @@ const vectorStoreConfigPlaceholder = computed(() => {
const getEmbeddingLlmListData = async () => {
try {
const url = `/api/v1/model/list?modelType=embeddingModel`;
const url = `/api/v1/documentCollection/modelList?modelType=embeddingModel`;
const res = await api.get(url, {});
if (res.errorCode === 0) {
embeddingLlmList.value = res.data;
@@ -115,7 +118,9 @@ const getEmbeddingLlmListData = async () => {
const getRerankerLlmListData = async () => {
try {
const res = await api.get('/api/v1/model/list?modelType=rerankModel');
const res = await api.get(
'/api/v1/documentCollection/modelList?modelType=rerankModel',
);
rerankerLlmList.value = res.data;
} catch (error) {
ElMessage.error($t('message.apiError'));
@@ -156,6 +161,10 @@ const rules = ref({
});
async function save() {
if (!props.manageable) {
ElMessage.warning($t('documentCollection.managePermissionHint'));
return;
}
try {
const valid = await saveForm.value?.validate();
if (!valid) return;
@@ -190,9 +199,13 @@ async function save() {
label-width="150px"
ref="saveForm"
:model="entity"
:disabled="!props.manageable"
status-icon
:rules="rules"
>
<div v-if="!props.manageable" class="config-readonly-tip">
{{ $t('documentCollection.managePermissionHint') }}
</div>
<ElFormItem
prop="icon"
:label="$t('documentCollection.icon')"
@@ -371,7 +384,7 @@ async function save() {
type="primary"
@click="save"
:loading="btnLoading"
:disabled="btnLoading"
:disabled="btnLoading || !props.manageable"
>
{{ $t('button.save') }}
</ElButton>
@@ -385,4 +398,11 @@ async function save() {
height: 100%;
overflow: auto;
}
.config-readonly-tip {
margin-bottom: 16px;
font-size: 12px;
line-height: 1.6;
color: var(--el-text-color-secondary);
}
</style>