fix(产品需求、项目需求): 修复权限码的语义问题。

This commit is contained in:
dk
2026-06-17 20:49:18 +08:00
parent 31344f1d58
commit cd64cf42cc
6 changed files with 3646 additions and 28 deletions

View File

@@ -44,9 +44,12 @@
"@sa/hooks": "workspace:*", "@sa/hooks": "workspace:*",
"@sa/materials": "workspace:*", "@sa/materials": "workspace:*",
"@sa/utils": "workspace:*", "@sa/utils": "workspace:*",
"@univerjs/preset-sheets-core": "^0.25.0",
"@univerjs/presets": "^0.25.0",
"@vueuse/core": "13.9.0", "@vueuse/core": "13.9.0",
"@wangeditor/editor": "^5.1.23", "@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^5.1.12", "@wangeditor/editor-for-vue": "^5.1.12",
"@zwight/luckyexcel": "^1.1.6",
"clipboard": "2.0.11", "clipboard": "2.0.11",
"dayjs": "1.11.18", "dayjs": "1.11.18",
"defu": "^6.1.4", "defu": "^6.1.4",

3607
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -462,7 +462,7 @@ const columns = computed(() => [
onClick: () => void; onClick: () => void;
}[] = []; }[] = [];
if (hasObjectAuth('project:product:query') && canViewReviewRecord(row)) { if (hasObjectAuth('project:product:requirement:query') && canViewReviewRecord(row)) {
actions.push({ actions.push({
key: 'reviewRecord', key: 'reviewRecord',
label: '查看评审记录', label: '查看评审记录',
@@ -472,7 +472,7 @@ const columns = computed(() => [
}); });
} }
if (hasObjectAuth('project:product:split') && canSplitRequirement(row)) { if (hasObjectAuth('project:product:requirement:split') && canSplitRequirement(row)) {
actions.push({ actions.push({
key: 'split', key: 'split',
label: '拆分', label: '拆分',
@@ -482,7 +482,7 @@ const columns = computed(() => [
}); });
} }
if (hasObjectAuth('project:product:update') && canEditRequirement(row)) { if (hasObjectAuth('project:product:requirement:update') && canEditRequirement(row)) {
actions.push({ actions.push({
key: 'edit', key: 'edit',
label: '编辑', label: '编辑',
@@ -503,8 +503,8 @@ const columns = computed(() => [
} }
const lifecycleActions = getRowActions(row); const lifecycleActions = getRowActions(row);
const hasReviewAuth = hasObjectAuth('project:product:review'); const hasReviewAuth = hasObjectAuth('project:product:requirement:review');
const hasStatusAuth = hasObjectAuth('project:product:status'); const hasStatusAuth = hasObjectAuth('project:product:requirement:status');
if (hasReviewAuth && lifecycleActions.some(action => isReviewAction(row, action))) { if (hasReviewAuth && lifecycleActions.some(action => isReviewAction(row, action))) {
actions.push({ actions.push({
@@ -540,7 +540,7 @@ const columns = computed(() => [
} }
} }
if (canDeleteRequirement(row) && hasObjectAuth('project:product:delete')) { if (canDeleteRequirement(row) && hasObjectAuth('project:product:requirement:delete')) {
actions.push({ actions.push({
key: 'delete', key: 'delete',
label: '删除', label: '删除',
@@ -922,7 +922,7 @@ onMounted(async () => {
<TableHeaderOperation v-model:columns="columnChecks" :loading="loading" @refresh="reloadTable"> <TableHeaderOperation v-model:columns="columnChecks" :loading="loading" @refresh="reloadTable">
<template #default> <template #default>
<ElButton <ElButton
v-auth="{ code: 'project:product:create', source: 'object' }" v-auth="{ code: 'project:product:requirement:create', source: 'object' }"
plain plain
type="primary" type="primary"
@click="openCreate" @click="openCreate"

View File

@@ -45,12 +45,12 @@ const isRootModule = computed(() => props.module.id === props.rootModuleId);
const hasAnyActionPermission = computed(() => { const hasAnyActionPermission = computed(() => {
if (isRootModule.value) { if (isRootModule.value) {
return hasObjectAuth('project:product:create'); return hasObjectAuth('project:product:requirement:create');
} }
return ( return (
hasObjectAuth('project:product:create') || hasObjectAuth('project:product:requirement:create') ||
hasObjectAuth('project:product:update') || hasObjectAuth('project:product:requirement:update') ||
hasObjectAuth('project:product:delete') hasObjectAuth('project:product:requirement:delete')
); );
}); });
@@ -163,18 +163,22 @@ function handleToggle() {
</div> </div>
<div v-if="!isEditing && hasAnyActionPermission" class="module-tree-item__actions" @click.stop> <div v-if="!isEditing && hasAnyActionPermission" class="module-tree-item__actions" @click.stop>
<ElTooltip v-if="hasObjectAuth('project:product:create')" content="新增子模块" placement="top"> <ElTooltip v-if="hasObjectAuth('project:product:requirement:create')" content="新增子模块" placement="top">
<ElButton link type="primary" class="module-tree-item__action-btn" @click="handleStartAddChild"> <ElButton link type="primary" class="module-tree-item__action-btn" @click="handleStartAddChild">
<icon-mdi-plus class="text-14px" /> <icon-mdi-plus class="text-14px" />
</ElButton> </ElButton>
</ElTooltip> </ElTooltip>
<ElTooltip v-if="!isRootModule && hasObjectAuth('project:product:update')" content="编辑" placement="top"> <ElTooltip
v-if="!isRootModule && hasObjectAuth('project:product:requirement:update')"
content="编辑"
placement="top"
>
<ElButton link type="primary" class="module-tree-item__action-btn" @click="handleStartEdit"> <ElButton link type="primary" class="module-tree-item__action-btn" @click="handleStartEdit">
<icon-mdi-pencil-outline class="text-14px" /> <icon-mdi-pencil-outline class="text-14px" />
</ElButton> </ElButton>
</ElTooltip> </ElTooltip>
<ElPopconfirm <ElPopconfirm
v-if="!isRootModule && canDeleteModule && hasObjectAuth('project:product:delete')" v-if="!isRootModule && canDeleteModule && hasObjectAuth('project:product:requirement:delete')"
title="确定删除该模块吗?" title="确定删除该模块吗?"
@confirm="handleDelete" @confirm="handleDelete"
> >

View File

@@ -234,12 +234,12 @@ function buildRequirementActions(row: Api.Project.ProjectRequirement) {
onClick: () => void; onClick: () => void;
}> = []; }> = [];
const hasUpdateAuth = hasObjectAuth('project:project:update'); const hasUpdateAuth = hasObjectAuth('project:project:requirement:update');
const hasDeleteAuth = hasObjectAuth('project:project:delete'); const hasDeleteAuth = hasObjectAuth('project:project:requirement:delete');
const hasStatusAuth = hasObjectAuth('project:project:status'); const hasStatusAuth = hasObjectAuth('project:project:requirement:status');
const hasSplitAuth = hasObjectAuth('project:project:split'); const hasSplitAuth = hasObjectAuth('project:project:requirement:split');
const hasQueryAuth = hasObjectAuth('project:project:query'); const hasQueryAuth = hasObjectAuth('project:project:requirement:query');
const hasReviewAuth = hasObjectAuth('project:project:review'); const hasReviewAuth = hasObjectAuth('project:project:requirement:review');
const lifecycleActions = getRowActions(row); const lifecycleActions = getRowActions(row);
if (hasQueryAuth && canViewReviewRecord(row)) { if (hasQueryAuth && canViewReviewRecord(row)) {
@@ -892,7 +892,7 @@ Promise.all([loadStatusOptions()]);
<TableHeaderOperation v-model:columns="columnChecks" :loading="loading" @refresh="reloadTable"> <TableHeaderOperation v-model:columns="columnChecks" :loading="loading" @refresh="reloadTable">
<template #default> <template #default>
<ElButton <ElButton
v-auth="{ code: 'project:project:create', source: 'object' }" v-auth="{ code: 'project:project:requirement:create', source: 'object' }"
plain plain
type="primary" type="primary"
@click="openCreate" @click="openCreate"

View File

@@ -45,12 +45,12 @@ const isRootModule = computed(() => props.module.id === props.rootModuleId);
const hasAnyActionPermission = computed(() => { const hasAnyActionPermission = computed(() => {
if (isRootModule.value) { if (isRootModule.value) {
return hasObjectAuth('project:project:create'); return hasObjectAuth('project:project:requirement:create');
} }
return ( return (
hasObjectAuth('project:project:create') || hasObjectAuth('project:project:requirement:create') ||
hasObjectAuth('project:project:update') || hasObjectAuth('project:project:requirement:update') ||
hasObjectAuth('project:project:delete') hasObjectAuth('project:project:requirement:delete')
); );
}); });
@@ -146,18 +146,22 @@ function handleToggle() {
</div> </div>
<div v-if="!isEditing && hasAnyActionPermission" class="module-tree-item__actions" @click.stop> <div v-if="!isEditing && hasAnyActionPermission" class="module-tree-item__actions" @click.stop>
<ElTooltip v-if="hasObjectAuth('project:project:create')" content="新增子模块" placement="top"> <ElTooltip v-if="hasObjectAuth('project:project:requirement:create')" content="新增子模块" placement="top">
<ElButton link type="primary" class="module-tree-item__action-btn" @click="emit('addChild', module)"> <ElButton link type="primary" class="module-tree-item__action-btn" @click="emit('addChild', module)">
<icon-mdi-plus class="text-14px" /> <icon-mdi-plus class="text-14px" />
</ElButton> </ElButton>
</ElTooltip> </ElTooltip>
<ElTooltip v-if="!isRootModule && hasObjectAuth('project:project:update')" content="编辑" placement="top"> <ElTooltip
v-if="!isRootModule && hasObjectAuth('project:project:requirement:update')"
content="编辑"
placement="top"
>
<ElButton link type="primary" class="module-tree-item__action-btn" @click="emit('edit', module)"> <ElButton link type="primary" class="module-tree-item__action-btn" @click="emit('edit', module)">
<icon-mdi-pencil-outline class="text-14px" /> <icon-mdi-pencil-outline class="text-14px" />
</ElButton> </ElButton>
</ElTooltip> </ElTooltip>
<ElPopconfirm <ElPopconfirm
v-if="!isRootModule && canDeleteModule && hasObjectAuth('project:project:delete')" v-if="!isRootModule && canDeleteModule && hasObjectAuth('project:project:requirement:delete')"
title="确定删除该模块吗?" title="确定删除该模块吗?"
@confirm="emit('delete', module)" @confirm="emit('delete', module)"
> >