From 3f8393813bcf945ad823c796cbdb6792d30b2758 Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Sun, 25 Jan 2026 11:15:59 +0800 Subject: [PATCH] refactor(tenant): refine menu scope boundaries and document plan/tenant menu design --- .env.development | 19 +- .env.production | 2 - src/api/system/menu.ts | 4 +- src/api/system/tenant-plan.ts | 70 ++++ src/components/TenantSwitcher/index.vue | 6 +- src/constants/index.ts | 8 + src/enums/business.ts | 8 + src/layouts/components/LayoutToolbar.vue | 46 +-- src/router/guards/permission.ts | 5 +- src/store/modules/tenant.ts | 114 +++--- src/types/api/index.ts | 1 + src/types/api/menu.ts | 4 + src/types/api/tenant-plan.ts | 35 ++ src/types/api/tenant.ts | 3 + src/types/api/user.ts | 6 +- src/utils/tenant.ts | 16 + src/views/system/menu/index.vue | 25 +- src/views/system/tenant-plan/index.vue | 454 +++++++++++++++++++++++ src/views/system/tenant/index.vue | 258 ++++++++++++- src/views/system/user/index.vue | 33 -- 20 files changed, 959 insertions(+), 158 deletions(-) create mode 100644 src/api/system/tenant-plan.ts create mode 100644 src/types/api/tenant-plan.ts create mode 100644 src/utils/tenant.ts create mode 100644 src/views/system/tenant-plan/index.vue diff --git a/.env.development b/.env.development index dead00d5..14eb819b 100644 --- a/.env.development +++ b/.env.development @@ -1,6 +1,3 @@ -# ============================================ -# 🌐 网络配置 -# ============================================ # 应用端口 VITE_APP_PORT=3000 # 项目名称 @@ -9,25 +6,19 @@ VITE_APP_TITLE=vue3-element-admin VITE_APP_BASE_API=/dev-api # 接口地址 -VITE_APP_API_URL=https://api.youlai.tech/v2 # 线上 -# VITE_APP_API_URL=http://localhost:8000 # 本地 +# VITE_APP_API_URL=https://api.youlai.tech/v2 # 线上 +VITE_APP_API_URL=http://localhost:8000 # 本地 # WebSocket 端点(不配置则关闭) # 线上: ws://api.youlai.tech/ws # 本地: ws://localhost:8000/ws VITE_APP_WS_ENDPOINT= -# ============================================ -# 🔧 开发工具 -# ============================================ + # 启用 Mock 服务 VITE_MOCK_DEV_SERVER=false -# ============================================ -# 🎛️ 功能开关 -# ============================================ -# 多租户(需与后端 youlai.tenant.enabled 保持一致) + +# 多租户开关(true:开启 false:关闭) VITE_APP_TENANT_ENABLED=false -# AI 助手(系统级开关,用户可在设置中单独控制) -VITE_ENABLE_AI_ASSISTANT=true diff --git a/.env.production b/.env.production index 14473e22..4fd8cfdd 100644 --- a/.env.production +++ b/.env.production @@ -14,5 +14,3 @@ VITE_APP_TITLE=vue3-element-admin # 多租户(需与后端 app.tenant.enabled 保持一致) VITE_APP_TENANT_ENABLED=false -# AI 助手(系统级开关) -VITE_ENABLE_AI_ASSISTANT=true diff --git a/src/api/system/menu.ts b/src/api/system/menu.ts index 87e410ef..e85dbf74 100644 --- a/src/api/system/menu.ts +++ b/src/api/system/menu.ts @@ -17,11 +17,11 @@ const MenuAPI = { }); }, /** 获取菜单下拉数据源 */ - getOptions(onlyParent?: boolean) { + getOptions(onlyParent?: boolean, scope?: number) { return request({ url: `${MENU_BASE_URL}/options`, method: "get", - params: { onlyParent }, + params: { onlyParent, scope }, }); }, /** 获取菜单表单数据 */ diff --git a/src/api/system/tenant-plan.ts b/src/api/system/tenant-plan.ts new file mode 100644 index 00000000..ad059a39 --- /dev/null +++ b/src/api/system/tenant-plan.ts @@ -0,0 +1,70 @@ +import request from "@/utils/request"; +import type { OptionItem, PageResult } from "@/types/api"; +import type { + TenantPlanForm, + TenantPlanItem, + TenantPlanQueryParams, +} from "@/types/api/tenant-plan"; + +const TENANT_PLAN_BASE_URL = "/api/v1/tenant-plans"; + +const TenantPlanAPI = { + /** 获取租户套餐分页数据 */ + getPage(queryParams?: TenantPlanQueryParams) { + return request>({ + url: `${TENANT_PLAN_BASE_URL}`, + method: "get", + params: queryParams, + }); + }, + + /** 获取租户套餐表单数据 */ + getFormData(planId: string) { + return request({ + url: `${TENANT_PLAN_BASE_URL}/${planId}/form`, + method: "get", + }); + }, + + /** 新增租户套餐 */ + create(data: TenantPlanForm) { + return request({ url: `${TENANT_PLAN_BASE_URL}`, method: "post", data }); + }, + + /** 修改租户套餐 */ + update(planId: string, data: TenantPlanForm) { + return request({ url: `${TENANT_PLAN_BASE_URL}/${planId}`, method: "put", data }); + }, + + /** 删除租户套餐 */ + deleteByIds(ids: string) { + return request({ url: `${TENANT_PLAN_BASE_URL}/${ids}`, method: "delete" }); + }, + + /** 获取租户方案下拉选项 */ + getOptions() { + return request({ + url: `${TENANT_PLAN_BASE_URL}/options`, + method: "get", + }); + }, + + /** 获取方案菜单ID集合 */ + getPlanMenuIds(planId: number) { + return request({ + url: `${TENANT_PLAN_BASE_URL}/${planId}/menuIds`, + method: "get", + }); + }, + + /** 更新方案菜单 */ + updatePlanMenus(planId: number, menuIds: number[]) { + return request({ + url: `${TENANT_PLAN_BASE_URL}/${planId}/menus`, + method: "put", + data: menuIds, + }); + }, +}; + +export default TenantPlanAPI; diff --git a/src/components/TenantSwitcher/index.vue b/src/components/TenantSwitcher/index.vue index 8ca9454d..df44a7ab 100644 --- a/src/components/TenantSwitcher/index.vue +++ b/src/components/TenantSwitcher/index.vue @@ -38,7 +38,7 @@ const tenantStore = useTenantStoreHook(); const tenantList = computed(() => tenantStore.tenantList); -const currentTenantIdRef = computed({ +const currentTenantId = computed({ get: () => tenantStore.currentTenantId, set: (val) => { tenantStore.currentTenantId = val; @@ -46,13 +46,13 @@ const currentTenantIdRef = computed({ }); const currentTenantName = computed(() => { - const currentId = currentTenantIdRef.value; + const currentId = currentTenantId.value; const fromList = tenantList.value.find((t) => t.id === currentId)?.name; return fromList || tenantStore.currentTenant?.name || "切换租户"; }); function onCommand(tenantId: number) { - if (tenantId === currentTenantIdRef.value) { + if (tenantId === currentTenantId.value) { return; } emit("change", tenantId); diff --git a/src/constants/index.ts b/src/constants/index.ts index 57f1e1f5..4b287120 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -18,6 +18,14 @@ export const APP_PREFIX = "vea"; */ export const ROLE_ROOT = "ROOT"; +/** + * 平台租户ID + * + * @description + * 用于前端识别平台租户(不参与套餐/菜单配置) + */ +export const PLATFORM_TENANT_ID = 0; + /** * 存储键名常量 * diff --git a/src/enums/business.ts b/src/enums/business.ts index b59fcb14..b97a1a78 100644 --- a/src/enums/business.ts +++ b/src/enums/business.ts @@ -14,6 +14,14 @@ export enum MenuTypeEnum { BUTTON = "B", // 按钮 } +/** + * 菜单范围枚举 + */ +export enum MenuScopeEnum { + PLATFORM = 1, // 平台菜单 + TENANT = 2, // 业务菜单 +} + /** * 用户性别枚举 */ diff --git a/src/layouts/components/LayoutToolbar.vue b/src/layouts/components/LayoutToolbar.vue index 84a499d4..23454c8c 100644 --- a/src/layouts/components/LayoutToolbar.vue +++ b/src/layouts/components/LayoutToolbar.vue @@ -28,7 +28,7 @@ -