From 3a8b5de8f78bd043455ec8f87693860eb96caf6c Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Thu, 26 Feb 2026 00:12:59 +0800 Subject: [PATCH] chore: project permission --- .../plugin/permission/use-crud-permission.ts | 62 +++++++++++++++---- .../certd-client/src/store/project/index.ts | 15 +++++ .../src/views/certd/access/index.vue | 2 +- .../src/views/certd/cert/domain/crud.tsx | 3 + .../src/views/certd/cert/domain/index.vue | 13 +++- .../src/views/certd/monitor/site/crud.tsx | 4 +- .../src/views/certd/monitor/site/index.vue | 7 ++- .../src/views/certd/pipeline/crud.tsx | 7 ++- .../src/views/certd/pipeline/index.vue | 6 +- .../views/certd/pipeline/pipeline/index.vue | 6 +- .../views/certd/pipeline/template/crud.tsx | 1 - .../views/certd/pipeline/template/index.vue | 7 ++- .../src/views/certd/project/crud.tsx | 2 +- .../src/views/sys/enterprise/project/crud.tsx | 14 ++--- 14 files changed, 119 insertions(+), 30 deletions(-) diff --git a/packages/ui/certd-client/src/plugin/permission/use-crud-permission.ts b/packages/ui/certd-client/src/plugin/permission/use-crud-permission.ts index 71618bde0..1aa96707a 100644 --- a/packages/ui/certd-client/src/plugin/permission/use-crud-permission.ts +++ b/packages/ui/certd-client/src/plugin/permission/use-crud-permission.ts @@ -1,12 +1,14 @@ import { usePermission } from "/@/plugin/permission"; import { merge as LodashMerge } from "lodash-es"; +import { useProjectStore } from "/@/store/project"; export type UseCrudPermissionExtraProps = { hasActionPermission: (action: string) => boolean; }; export type UseCrudPermissionExtra = (props: UseCrudPermissionExtraProps) => any; export type UseCrudPermissionCompProps = { - prefix: string; + isProjectPermission?: boolean; + prefix?: string; extra?: UseCrudPermissionExtra; [key: string]: any; }; @@ -20,14 +22,31 @@ export type UseCrudPermissionProps = { export function useCrudPermission({ permission }: UseCrudPermissionProps) { const { hasPermissions } = usePermission(); - const prefix = permission instanceof Object ? permission.prefix : permission; - //根据权限显示按钮 - function hasActionPermission(action: string) { + let hasActionPermission = (action: string) => { if (!prefix) { return true; } return hasPermissions(prefix + ":" + action); + }; + + let per: UseCrudPermissionCompProps = permission as any; + if (per == null) { + per = { prefix: "" }; + } + if (typeof per === "string") { + per = { + prefix: per || "", + }; + } + let prefix = per.prefix || ""; + const isProjectPermission = per.isProjectPermission || false; + if (isProjectPermission) { + const projectStore = useProjectStore(); + prefix = ""; + hasActionPermission = function (value: string) { + return projectStore.hasPermission(value as string); + }; } function buildCrudPermission(): any { @@ -36,25 +55,44 @@ export function useCrudPermission({ permission }: UseCrudPermissionProps) { } let extra = {}; - if (permission instanceof Object) { - extra = permission.extra; - if (permission.extra && permission.extra instanceof Function) { - extra = permission.extra({ hasActionPermission }); + if (per instanceof Object) { + extra = per.extra; + if (per.extra && per.extra instanceof Function) { + extra = per.extra({ hasActionPermission }); } } + let viewPermission = "view"; + if (isProjectPermission) { + viewPermission = "read"; + } + + let addPermission = "add"; + if (isProjectPermission) { + addPermission = "write"; + } + + let editPermission = "edit"; + if (isProjectPermission) { + editPermission = "write"; + } + + let removePermission = "remove"; + if (isProjectPermission) { + removePermission = "write"; + } return LodashMerge( { actionbar: { buttons: { - add: { show: hasActionPermission("add") }, + add: { show: hasActionPermission(addPermission) }, }, }, rowHandle: { buttons: { - edit: { show: hasActionPermission("edit") }, - remove: { show: hasActionPermission("remove") }, - view: { show: hasActionPermission("view") }, + edit: { show: hasActionPermission(editPermission) }, + remove: { show: hasActionPermission(removePermission) }, + view: { show: hasActionPermission(viewPermission) }, }, }, }, diff --git a/packages/ui/certd-client/src/store/project/index.ts b/packages/ui/certd-client/src/store/project/index.ts index 721cdb97d..9160b4178 100644 --- a/packages/ui/certd-client/src/store/project/index.ts +++ b/packages/ui/certd-client/src/store/project/index.ts @@ -98,6 +98,20 @@ export const useProjectStore = defineStore("app.project", () => { return currentProject.value?.permission === "admin"; }); + function hasPermission(value: string) { + if (!isEnterprise.value) { + return true; + } + if (value === "read") { + return isRead.value; + } else if (value === "write") { + return isWrite.value; + } else if (value === "admin") { + return isAdmin.value; + } + return false; + } + function $reset() { myProjects.value = []; currentProjectId.value = ""; @@ -118,5 +132,6 @@ export const useProjectStore = defineStore("app.project", () => { reload, init, $reset, + hasPermission, }; }); diff --git a/packages/ui/certd-client/src/views/certd/access/index.vue b/packages/ui/certd-client/src/views/certd/access/index.vue index 25d312652..2079c4040 100644 --- a/packages/ui/certd-client/src/views/certd/access/index.vue +++ b/packages/ui/certd-client/src/views/certd/access/index.vue @@ -22,7 +22,7 @@ export default defineComponent({ setup() { const { t } = useI18n(); const api = createAccessApi("user"); - const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context: { api } }); + const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context: { api, permission: { isProjectPermission: true } } }); // 页面打开后获取列表数据 onMounted(() => { diff --git a/packages/ui/certd-client/src/views/certd/cert/domain/crud.tsx b/packages/ui/certd-client/src/views/certd/cert/domain/crud.tsx index 6fc3c2db6..1757c8dca 100644 --- a/packages/ui/certd-client/src/views/certd/cert/domain/crud.tsx +++ b/packages/ui/certd-client/src/views/certd/cert/domain/crud.tsx @@ -12,6 +12,7 @@ import { useI18n } from "/src/locales"; export default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet { const router = useRouter(); const { t } = useI18n(); + const { hasActionPermission } = context; const pageRequest = async (query: UserPageQuery): Promise => { return await api.GetList(query); }; @@ -96,6 +97,7 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat icon: "ion:add-circle-outline", }, import: { + show: hasActionPermission("write"), title: "从域名提供商导入域名", type: "primary", text: "从域名提供商导入", @@ -111,6 +113,7 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat }, }, syncExpirationDate: { + show: hasActionPermission("write"), title: "同步域名过期时间", type: "primary", icon: "ion:refresh-outline", diff --git a/packages/ui/certd-client/src/views/certd/cert/domain/index.vue b/packages/ui/certd-client/src/views/certd/cert/domain/index.vue index 2ffd486e4..0a366f8e7 100644 --- a/packages/ui/certd-client/src/views/certd/cert/domain/index.vue +++ b/packages/ui/certd-client/src/views/certd/cert/domain/index.vue @@ -10,7 +10,7 @@ @@ -25,13 +25,22 @@ import createCrudOptions from "./crud"; import { message, Modal } from "ant-design-vue"; import { DeleteBatch } from "./api"; import { useI18n } from "/src/locales"; +import { useCrudPermission } from "/@/plugin/permission"; const { t } = useI18n(); defineOptions({ name: "DomainManager", }); -const { crudBinding, crudRef, crudExpose, context } = useFs({ createCrudOptions }); +const context: any = { + permission: { + isProjectPermission: true, + }, +}; + +const { hasActionPermission } = useCrudPermission({ permission: context.permission }); +context.hasActionPermission = hasActionPermission; +const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context }); const selectedRowKeys = context.selectedRowKeys; const handleBatchDelete = () => { diff --git a/packages/ui/certd-client/src/views/certd/monitor/site/crud.tsx b/packages/ui/certd-client/src/views/certd/monitor/site/crud.tsx index 800f0b75d..5dcc10fa3 100644 --- a/packages/ui/certd-client/src/views/certd/monitor/site/crud.tsx +++ b/packages/ui/certd-client/src/views/certd/monitor/site/crud.tsx @@ -15,6 +15,7 @@ import GroupSelector from "../../basic/group/group-selector.vue"; import { createGroupDictRef } from "../../basic/group/api"; import { useProjectStore } from "/@/store/project"; import { useDicts } from "../../dicts"; +import { useCrudPermission } from "/@/plugin/permission"; export default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet { const { t } = useI18n(); const api = siteInfoApi; @@ -109,6 +110,7 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat } const projectStore = useProjectStore(); + const { hasActionPermission } = useCrudPermission({ permission: context.permission }); return { id: "siteMonitorCrud", crudOptions: { @@ -231,7 +233,7 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat }, //导入按钮 import: { - show: true, + show: hasActionPermission("write"), text: t("monitor.bulkImport"), type: "primary", async click() { diff --git a/packages/ui/certd-client/src/views/certd/monitor/site/index.vue b/packages/ui/certd-client/src/views/certd/monitor/site/index.vue index 55a7221f8..01dfe2a8b 100644 --- a/packages/ui/certd-client/src/views/certd/monitor/site/index.vue +++ b/packages/ui/certd-client/src/views/certd/monitor/site/index.vue @@ -34,7 +34,12 @@ const { t } = useI18n(); defineOptions({ name: "SiteCertMonitor", }); -const { crudBinding, crudRef, crudExpose, context } = useFs({ createCrudOptions }); +const context: any = { + permission: { + isProjectPermission: true, + }, +}; +const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context }); const handleBatchDelete = context.handleBatchDelete; diff --git a/packages/ui/certd-client/src/views/certd/pipeline/crud.tsx b/packages/ui/certd-client/src/views/certd/pipeline/crud.tsx index 7d60a94ea..acea8e2e0 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/crud.tsx +++ b/packages/ui/certd-client/src/views/certd/pipeline/crud.tsx @@ -17,7 +17,7 @@ import { useI18n } from "/src/locales"; import { useDicts } from "../dicts"; import { useProjectStore } from "/@/store/project"; -export default function ({ crudExpose, context: { selectedRowKeys, openCertApplyDialog } }: CreateCrudOptionsProps): CreateCrudOptionsRet { +export default function ({ crudExpose, context: { selectedRowKeys, openCertApplyDialog, hasActionPermission } }: CreateCrudOptionsProps): CreateCrudOptionsRet { const router = useRouter(); const lastResRef = ref(); @@ -124,9 +124,11 @@ export default function ({ crudExpose, context: { selectedRowKeys, openCertApply click() { openCertApplyDialog({ key: "CertApply" }); }, + show: hasActionPermission("add"), }, uploadCert: { order: 2, + show: hasActionPermission("uploadCert"), text: t("certd.commercialCertHosting"), type: "primary", tooltip: { @@ -207,6 +209,7 @@ export default function ({ crudExpose, context: { selectedRowKeys, openCertApply }, }, copy: { + show: hasActionPermission("write"), click: async context => { settingStore.checkPlus(); const { ui } = useUi(); @@ -224,6 +227,7 @@ export default function ({ crudExpose, context: { selectedRowKeys, openCertApply class: "need-plus", }, config: { + show: hasActionPermission("write"), order: 1, title: t("certd.actions.editPipeline"), type: "link", @@ -234,6 +238,7 @@ export default function ({ crudExpose, context: { selectedRowKeys, openCertApply }, }, edit: { + show: hasActionPermission("write"), order: 2, title: t("certd.actions.editConfigGroup"), icon: "ant-design:setting-outlined", diff --git a/packages/ui/certd-client/src/views/certd/pipeline/index.vue b/packages/ui/certd-client/src/views/certd/pipeline/index.vue index c2c7b8fec..0b590f234 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/index.vue +++ b/packages/ui/certd-client/src/views/certd/pipeline/index.vue @@ -13,7 +13,7 @@ -->