feat: 平台治理与权限体系完善,存储进度/GPU预留/审批中心与日志整合

- 平台治理: 租户用户权限层次、资源ACL、审批中心与审批模板、访问申请
- 存储: MinIO 存储进度迁移、对象存储安全加固与测试
- 计算: GPU 资源预留、compute 轮询与同步增强
- 权限: permission v2 迁移、权限安全验收测试
- 日志: 后端运行日志中文说明、操作日志整合
- 数据处理/评测: 数据转换与模型评测优化

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
wuyongtao
2026-08-21 09:49:48 +08:00
parent 080ef6ab00
commit 6f0e82f351
94 changed files with 9547 additions and 1045 deletions

View File

@@ -1,23 +1,60 @@
<script setup lang="ts">
import { reactive, ref } from 'vue'
import { onMounted, reactive, ref } from 'vue'
import { useRouter } from 'vue-router'
import { ElMessage } from 'element-plus'
import { createUser } from '@/api/modules/system'
import type { CreateUserPayload } from '@/types'
import { getTenants, type Tenant } from '@/api/modules/tenant'
import type { CreateUserPayload, PermissionCode } from '@/types'
const router = useRouter()
const submitting = ref(false)
const tenants = ref<Tenant[]>([])
const permissionOptions: Array<{ value: PermissionCode; label: string }> = [
{ value: 'dashboard', label: '服务看板' },
{ value: 'fine-tune', label: '模型训练' },
{ value: 'model-eval', label: '模型评测' },
{ value: 'model-inference', label: '模型推理' },
{ value: 'model-manage', label: '模型管理' },
{ value: 'dataset', label: '数据集管理' },
{ value: 'data-process', label: '数据处理' },
{ value: 'data-convert', label: '数据类型转换' },
{ value: 'compute', label: '算力节点' },
{ value: 'hardware', label: '平台性能' },
{ value: 'logs', label: '运行日志' },
{ value: 'user-settings', label: '组织与权限' },
]
const form = reactive<CreateUserPayload>({
username: '',
display_name: '',
password: 'platform123',
password: '123456',
role: 'operator',
status: 'active',
permissions: [],
permissions: permissionOptions.filter((item) => !['compute', 'user-settings'].includes(item.value)).map((item) => item.value),
tenant_id: 'admin',
tenant_role: 'member',
})
onMounted(async () => {
tenants.value = await getTenants().catch(() => [])
})
function handleRoleChange() {
form.permissions = form.role === 'admin'
? permissionOptions.map((item) => item.value)
: permissionOptions.filter((item) => !['compute', 'user-settings'].includes(item.value)).map((item) => item.value)
}
async function submit() {
if (!form.username.trim() || !form.display_name.trim()) {
ElMessage.warning('请填写账号和显示名称')
return
}
if (!form.password.trim()) {
ElMessage.warning('请输入初始密码')
return
}
submitting.value = true
try {
await createUser(form)
@@ -43,9 +80,24 @@ async function submit() {
<el-input v-model="form.password" type="password" show-password />
</el-form-item>
<el-form-item label="角色">
<el-select v-model="form.role" style="width: 100%">
<el-select v-model="form.role" style="width: 100%" @change="handleRoleChange">
<el-option label="管理员" value="admin" />
<el-option label="普通用户" value="operator" />
<el-option label="操作员" value="operator" />
<el-option label="观察员" value="viewer" />
<el-option label="普通用户" value="user" />
</el-select>
</el-form-item>
<el-form-item label="所属租户">
<el-select v-model="form.tenant_id" filterable style="width: 100%" placeholder="选择用户所属租户">
<el-option v-for="tenant in tenants" :key="tenant.id" :label="tenant.name + '' + tenant.id + ''" :value="tenant.id" />
</el-select>
</el-form-item>
<el-form-item label="租户角色">
<el-select v-model="form.tenant_role" style="width: 100%">
<el-option label="成员" value="member" />
<el-option label="管理员" value="admin" />
<el-option label="只读" value="viewer" />
<el-option v-if="form.role === 'admin'" label="所有者" value="owner" />
</el-select>
</el-form-item>
<el-form-item label="状态">
@@ -54,11 +106,16 @@ async function submit() {
<el-radio value="disabled">禁用</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="页面权限">
<el-checkbox-group v-model="form.permissions" :disabled="form.role === 'admin'">
<el-checkbox v-for="item in permissionOptions" :key="item.value" :value="item.value">{{ item.label }}</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="权限说明">
<el-alert type="info" :closable="false" show-icon>
<template #title>
<span v-if="form.role === 'admin'">管理员拥有全部权限包括用户管理平台治理算力节点</span>
<span v-else>普通用户可见服务看板模型服务数据治理其他工具平台性能查看日志数据集和微调模型仅创建者和被授权用户可见</span>
<span v-else>非管理员页面权限控制功能入口数据训练模型等资源仍由创建者ACL 和审批结果决定算力节点与组织权限需要管理员单独授予</span>
</template>
</el-alert>
</el-form-item>