2 Commits 3a4d771db9 ... 32fa927f68

Author SHA1 Message Date
  HuRongxin 32fa927f68 修改用户管理 6 days ago
  HuRongxin f9e7150050 修改菜单 角色等加平台标识显示 1 week ago

+ 1 - 1
.env.development

@@ -1,5 +1,5 @@
 # 页面标题
-VITE_APP_TITLE = 优易达-OMS订单管理系统
+VITE_APP_TITLE = 优易达-总控平台
 VITE_APP_LOGO_TITLE = RuoYi-Vue-Plus
 
 # 开发环境配置

+ 2 - 0
src/api/system/dept/types.ts

@@ -26,6 +26,7 @@ export interface DeptVO extends BaseEntity {
   delFlag: string;
   ancestors: string;
   menuId: string | number;
+  platformCode: string;
 }
 
 /**
@@ -57,4 +58,5 @@ export interface DeptForm {
   status?: string;
   delFlag?: string;
   ancestors?: string;
+  platformCode?: string;
 }

+ 9 - 6
src/api/system/menu/index.ts

@@ -20,26 +20,29 @@ export const getMenu = (menuId: string | number): AxiosPromise<MenuVO> => {
 };
 
 // 查询菜单下拉树结构
-export const treeselect = (): AxiosPromise<MenuTreeOption[]> => {
+export const treeselect = (query?: MenuQuery): AxiosPromise<MenuTreeOption[]> => {
   return request({
     url: '/system/menu/treeselect',
-    method: 'get'
+    method: 'get',
+    params: query
   });
 };
 
 // 根据角色ID查询菜单下拉树结构
-export const roleMenuTreeselect = (roleId: string | number): AxiosPromise<RoleMenuTree> => {
+export const roleMenuTreeselect = (roleId: string | number, platformCode?: string): AxiosPromise<RoleMenuTree> => {
   return request({
     url: '/system/menu/roleMenuTreeselect/' + roleId,
-    method: 'get'
+    method: 'get',
+    params: platformCode ? { platformCode } : undefined
   });
 };
 
 // 根据角色ID查询菜单下拉树结构
-export const tenantPackageMenuTreeselect = (packageId: string | number): AxiosPromise<RoleMenuTree> => {
+export const tenantPackageMenuTreeselect = (packageId: string | number, platformCode?: string): AxiosPromise<RoleMenuTree> => {
   return request({
     url: '/system/menu/tenantPackageMenuTreeselect/' + packageId,
-    method: 'get'
+    method: 'get',
+    params: platformCode ? { platformCode } : undefined
   });
 };
 

+ 2 - 0
src/api/system/menu/types.ts

@@ -23,6 +23,7 @@ export interface MenuQuery {
   keywords?: string;
   menuName?: string;
   status?: string;
+  platformCode?: string;
 }
 
 /**
@@ -66,4 +67,5 @@ export interface MenuForm {
   remark?: string;
   query?: string;
   perms?: string;
+  platformCode?: string;
 }

+ 2 - 0
src/api/system/role/types.ts

@@ -29,6 +29,7 @@ export interface RoleVO extends BaseEntity {
   menuIds?: Array<string | number>;
   deptIds?: Array<string | number>;
   admin: boolean;
+  platformCode: '';
 }
 
 export interface RoleQuery extends PageQuery {
@@ -49,4 +50,5 @@ export interface RoleForm {
   roleId: string | undefined;
   menuIds: Array<string | number>;
   deptIds: Array<string | number>;
+  platformCode: '';
 }

+ 4 - 1
src/api/system/user/types.ts

@@ -20,7 +20,8 @@ export interface UserQuery extends PageQuery {
   status?: string;
   deptId?: string | number;
   roleId?: string | number;
-  userIds?:  string | number | (string | number)[] | undefined;
+  platformCode?: string;
+  userIds?: string | number | (string | number)[] | undefined;
 }
 
 /**
@@ -67,6 +68,8 @@ export interface UserForm {
   remark?: string;
   postIds: string[];
   roleIds: string[];
+  // 新增:所属平台(仅总控平台显示)
+  platformCode: string;
 }
 
 export interface UserInfoVO {

+ 21 - 2
src/views/system/dept/index.vue

@@ -130,6 +130,16 @@
             </el-form-item>
           </el-col>
         </el-row>
+        <el-row>
+          <el-col :span="24">
+            <!-- 仅当是总控平台时显示 -->
+            <el-form-item v-if="isMainPlatform" label="所属平台" prop="platformCode">
+              <el-select v-model="form.platformCode" placeholder="请选择平台">
+                <el-option v-for="dict in sys_platform_code" :key="dict.value" :label="dict.label" :value="dict.value" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
       </el-form>
       <template #footer>
         <div class="dialog-footer">
@@ -146,6 +156,7 @@ import { listDept, getDept, delDept, addDept, updateDept, listDeptExcludeChild }
 import { DeptForm, DeptQuery, DeptVO } from '@/api/system/dept/types';
 import { UserVO } from '@/api/system/user/types';
 import { listUserByDeptId } from '@/api/system/user';
+import { getPlatformCode } from '@/utils/platform';
 
 interface DeptOptionsType {
   deptId: number | string;
@@ -154,7 +165,7 @@ interface DeptOptionsType {
 }
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
-const { sys_normal_disable } = toRefs<any>(proxy?.useDict('sys_normal_disable'));
+const { sys_normal_disable, sys_platform_code } = toRefs<any>(proxy?.useDict('sys_normal_disable', 'sys_platform_code'));
 
 const deptList = ref<DeptVO[]>([]);
 const loading = ref(true);
@@ -162,6 +173,8 @@ const showSearch = ref(true);
 const deptOptions = ref<DeptOptionsType[]>([]);
 const isExpandAll = ref(true);
 const deptUserList = ref<UserVO[]>([]);
+const currentPlatform = getPlatformCode();
+const isMainPlatform = computed(() => currentPlatform === 'main');
 
 const dialog = reactive<DialogOption>({
   visible: false,
@@ -181,7 +194,8 @@ const initFormData: DeptForm = {
   leader: undefined,
   phone: undefined,
   email: undefined,
-  status: '0'
+  status: '0',
+  platformCode: ''
 };
 const initData: PageData<DeptForm, DeptQuery> = {
   form: { ...initFormData },
@@ -196,6 +210,7 @@ const initData: PageData<DeptForm, DeptQuery> = {
     parentId: [{ required: true, message: '上级部门不能为空', trigger: 'blur' }],
     deptName: [{ required: true, message: '部门名称不能为空', trigger: 'blur' }],
     orderNum: [{ required: true, message: '显示排序不能为空', trigger: 'blur' }],
+    platformCode: [{ required: true, message: '所属平台不能为空', trigger: 'blur' }],
     email: [{ type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }],
     phone: [{ pattern: /^1[3456789][0-9]\d{8}$/, message: '请输入正确的手机号码', trigger: 'blur' }]
   }
@@ -267,6 +282,10 @@ const handleAdd = async (row?: DeptVO) => {
     if (row && row.deptId) {
       form.value.parentId = row?.deptId;
     }
+    if (row && row.platformCode) {
+      form.value.platformCode = row?.platformCode;
+    }
+    console.log(row);
     dialog.visible = true;
     dialog.title = '添加部门';
   }

+ 1 - 1
src/views/system/dict/data.vue

@@ -169,7 +169,7 @@ const initFormData: DictDataForm = {
   dictLabel: '',
   dictValue: '',
   cssClass: '',
-  listClass: 'primary',
+  listClass: 'default',
   dictSort: 0,
   remark: ''
 };

+ 107 - 79
src/views/system/menu/index.vue

@@ -1,85 +1,99 @@
 <template>
   <div class="p-2">
-    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
-      <div v-show="showSearch" class="mb-[10px]">
+    <el-row :gutter="20">
+      <!-- 平台选择 -->
+      <el-col :lg="4" :xs="24" style="">
         <el-card shadow="hover">
-          <el-form ref="queryFormRef" :model="queryParams" :inline="true">
-            <el-form-item label="菜单名称" prop="menuName">
-              <el-input v-model="queryParams.menuName" placeholder="请输入菜单名称" clearable @keyup.enter="handleQuery" />
-            </el-form-item>
-            <el-form-item label="状态" prop="status">
-              <el-select v-model="queryParams.status" placeholder="菜单状态" clearable>
-                <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
-              </el-select>
-            </el-form-item>
-            <el-form-item>
-              <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
-              <el-button icon="Refresh" @click="resetQuery">重置</el-button>
-            </el-form-item>
-          </el-form>
+          <el-select v-model="selectedPlatform" placeholder="请选择平台" @change="handlePlatformChange" style="width: 100%">
+            <el-option v-for="dict in sys_platform_code" :key="dict.value" :label="dict.label" :value="dict.value" />
+          </el-select>
         </el-card>
-      </div>
-    </transition>
-
-    <el-card shadow="hover">
-      <template #header>
-        <el-row :gutter="10">
-          <el-col :span="1.5">
-            <el-button v-hasPermi="['system:menu:add']" type="primary" plain icon="Plus" @click="handleAdd()">新增</el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button v-hasPermi="['system:menu:remove']" type="danger" plain icon="Delete" @click="handleCascadeDelete" :loading="deleteLoading">级联删除</el-button>
-          </el-col>
-          <right-toolbar v-model:show-search="showSearch" @query-table="getList"></right-toolbar>
-        </el-row>
-      </template>
+      </el-col>
+      <el-col :lg="20" :xs="24">
+        <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+          <div v-show="showSearch" class="mb-[10px]">
+            <el-card shadow="hover">
+              <el-form ref="queryFormRef" :model="queryParams" :inline="true">
+                <el-form-item label="菜单名称" prop="menuName">
+                  <el-input v-model="queryParams.menuName" placeholder="请输入菜单名称" clearable @keyup.enter="handleQuery" />
+                </el-form-item>
+                <el-form-item label="状态" prop="status">
+                  <el-select v-model="queryParams.status" placeholder="菜单状态" clearable>
+                    <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
+                  </el-select>
+                </el-form-item>
+                <el-form-item>
+                  <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+                  <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+                </el-form-item>
+              </el-form>
+            </el-card>
+          </div>
+        </transition>
 
-      <el-table
-        ref="menuTableRef"
-        v-loading="loading"
-        :data="menuList"
-        row-key="menuId"
-        border
-        :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
-        :default-expand-all="false"
-        lazy
-        :load="getChildrenList"
-        :expand-change="expandMenuHandle"
-      >
-        <el-table-column prop="menuName" label="菜单名称" :show-overflow-tooltip="true" width="160"></el-table-column>
-        <el-table-column prop="icon" label="图标" align="center" width="100">
-          <template #default="scope">
-            <svg-icon :icon-class="scope.row.icon" />
-          </template>
-        </el-table-column>
-        <el-table-column prop="orderNum" label="排序" width="60"></el-table-column>
-        <el-table-column prop="perms" label="权限标识" :show-overflow-tooltip="true"></el-table-column>
-        <el-table-column prop="component" label="组件路径" :show-overflow-tooltip="true"></el-table-column>
-        <el-table-column prop="status" label="状态" width="80">
-          <template #default="scope">
-            <dict-tag :options="sys_normal_disable" :value="scope.row.status" />
-          </template>
-        </el-table-column>
-        <el-table-column label="创建时间" align="center" prop="createTime">
-          <template #default="scope">
-            <span>{{ scope.row.createTime }}</span>
-          </template>
-        </el-table-column>
-        <el-table-column fixed="right" label="操作" width="180">
-          <template #default="scope">
-            <el-tooltip content="修改" placement="top">
-              <el-button v-hasPermi="['system:menu:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)" />
-            </el-tooltip>
-            <el-tooltip content="新增" placement="top">
-              <el-button v-hasPermi="['system:menu:add']" link type="primary" icon="Plus" @click="handleAdd(scope.row)" />
-            </el-tooltip>
-            <el-tooltip content="删除" placement="top">
-              <el-button v-hasPermi="['system:menu:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)" />
-            </el-tooltip>
+        <el-card shadow="hover">
+          <template #header>
+            <el-row :gutter="10">
+              <el-col :span="1.5">
+                <el-button v-hasPermi="['system:menu:add']" type="primary" plain icon="Plus" @click="handleAdd()">新增</el-button>
+              </el-col>
+              <el-col :span="1.5">
+                <el-button v-hasPermi="['system:menu:remove']" type="danger" plain icon="Delete" @click="handleCascadeDelete" :loading="deleteLoading"
+                  >级联删除</el-button
+                >
+              </el-col>
+              <right-toolbar v-model:show-search="showSearch" @query-table="getList"></right-toolbar>
+            </el-row>
           </template>
-        </el-table-column>
-      </el-table>
-    </el-card>
+
+          <el-table
+            ref="menuTableRef"
+            v-loading="loading"
+            :data="menuList"
+            row-key="menuId"
+            border
+            :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
+            :default-expand-all="false"
+            lazy
+            :load="getChildrenList"
+            :expand-change="expandMenuHandle"
+          >
+            <el-table-column prop="menuName" label="菜单名称" :show-overflow-tooltip="true" width="160"></el-table-column>
+            <el-table-column prop="icon" label="图标" align="center" width="100">
+              <template #default="scope">
+                <svg-icon :icon-class="scope.row.icon" />
+              </template>
+            </el-table-column>
+            <el-table-column prop="orderNum" label="排序" width="60"></el-table-column>
+            <el-table-column prop="perms" label="权限标识" :show-overflow-tooltip="true"></el-table-column>
+            <el-table-column prop="component" label="组件路径" :show-overflow-tooltip="true"></el-table-column>
+            <el-table-column prop="status" label="状态" width="80">
+              <template #default="scope">
+                <dict-tag :options="sys_normal_disable" :value="scope.row.status" />
+              </template>
+            </el-table-column>
+            <el-table-column label="创建时间" align="center" prop="createTime">
+              <template #default="scope">
+                <span>{{ scope.row.createTime }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column fixed="right" label="操作" width="180">
+              <template #default="scope">
+                <el-tooltip content="修改" placement="top">
+                  <el-button v-hasPermi="['system:menu:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)" />
+                </el-tooltip>
+                <el-tooltip content="新增" placement="top">
+                  <el-button v-hasPermi="['system:menu:add']" link type="primary" icon="Plus" @click="handleAdd(scope.row)" />
+                </el-tooltip>
+                <el-tooltip content="删除" placement="top">
+                  <el-button v-hasPermi="['system:menu:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)" />
+                </el-tooltip>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-card>
+      </el-col>
+    </el-row>
 
     <el-dialog v-model="dialog.visible" :title="dialog.title" destroy-on-close append-to-bod width="750px">
       <el-form ref="menuFormRef" :model="form" :rules="rules" label-width="100px">
@@ -288,6 +302,7 @@
 import { addMenu, cascadeDelMenu, delMenu, getMenu, listMenu, updateMenu } from '@/api/system/menu';
 import { MenuForm, MenuQuery, MenuVO } from '@/api/system/menu/types';
 import { MenuTypeEnum } from '@/enums/MenuTypeEnum';
+import { getPlatformCode } from '@/utils/platform';
 
 interface MenuOptionsType {
   menuId: number;
@@ -296,7 +311,9 @@ interface MenuOptionsType {
 }
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
-const { sys_show_hide, sys_normal_disable } = toRefs<any>(proxy?.useDict('sys_show_hide', 'sys_normal_disable'));
+const { sys_show_hide, sys_normal_disable, sys_platform_code } = toRefs<any>(
+  proxy?.useDict('sys_show_hide', 'sys_normal_disable', 'sys_platform_code')
+);
 
 const menuList = ref<MenuVO[]>([]);
 const menuChildrenListMap = ref({});
@@ -323,13 +340,23 @@ const initFormData = {
   isFrame: '1',
   isCache: '0',
   visible: '0',
-  status: '0'
+  status: '0',
+  platformCode: ''
 };
+const selectedPlatform = ref<string>(getPlatformCode());
+/** 平台选择变化处理 */
+const handlePlatformChange = (value: string) => {
+  queryParams.value.platformCode = value;
+  selectedPlatform.value = value;
+  handleQuery();
+};
+
 const data = reactive<PageData<MenuForm, MenuQuery>>({
   form: { ...initFormData },
   queryParams: {
     menuName: undefined,
-    status: undefined
+    status: undefined,
+    platformCode: selectedPlatform.value
   },
   rules: {
     menuName: [{ required: true, message: '菜单名称不能为空', trigger: 'blur' }],
@@ -461,6 +488,7 @@ const handleUpdate = async (row: MenuVO) => {
 const submitForm = () => {
   menuFormRef.value?.validate(async (valid: boolean) => {
     if (valid) {
+      form.value.platformCode = selectedPlatform.value;
       form.value.menuId ? await updateMenu(form.value) : await addMenu(form.value);
       proxy?.$modal.msgSuccess('操作成功');
       dialog.visible = false;

+ 29 - 7
src/views/system/role/index.vue

@@ -99,7 +99,7 @@
       />
     </el-card>
 
-    <el-dialog v-model="dialog.visible" :title="dialog.title" width="500px" append-to-body>
+    <el-dialog v-model="dialog.visible" :title="dialog.title" width="600px" append-to-body>
       <el-form ref="roleFormRef" :model="form" :rules="rules" label-width="100px">
         <el-form-item label="角色名称" prop="roleName">
           <el-input v-model="form.roleName" placeholder="请输入角色名称" />
@@ -127,6 +127,9 @@
           <el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event, 'menu')">展开/折叠</el-checkbox>
           <el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">全选/全不选</el-checkbox>
           <el-checkbox v-model="form.menuCheckStrictly" @change="handleCheckedTreeConnect($event, 'menu')">父子联动</el-checkbox>
+          <el-select v-model="currentPlatform" placeholder="请选择平台" @change="handlePlatformChange" style="width: 100%">
+            <el-option v-for="dict in sys_platform_code" :key="dict.value" :label="dict.label" :value="dict.value" />
+          </el-select>
           <el-tree
             ref="menuRef"
             class="tree-border"
@@ -199,7 +202,8 @@ import { MenuTreeOption, RoleMenuTree } from '@/api/system/menu/types';
 
 const router = useRouter();
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
-const { sys_normal_disable } = toRefs<any>(proxy?.useDict('sys_normal_disable'));
+const { sys_normal_disable, sys_platform_code } = toRefs<any>(proxy?.useDict('sys_normal_disable', 'sys_platform_code'));
+import { getPlatformCode } from '@/utils/platform';
 
 const roleList = ref<RoleVO[]>();
 const loading = ref(true);
@@ -216,6 +220,7 @@ const deptExpand = ref(true);
 const deptNodeAll = ref(false);
 const deptOptions = ref<DeptTreeOption[]>([]);
 const openDataScope = ref(false);
+const currentPlatform = ref<string>(getPlatformCode());
 
 /** 数据范围选项*/
 const dataScopeOptions = ref([
@@ -244,7 +249,8 @@ const initForm: RoleForm = {
   remark: '',
   dataScope: '1',
   menuIds: [],
-  deptIds: []
+  deptIds: [],
+  platformCode: ''
 };
 
 const data = reactive<PageData<RoleForm, RoleQuery>>({
@@ -288,6 +294,16 @@ const handleQuery = () => {
   queryParams.value.pageNum = 1;
   getList();
 };
+/** 平台选择变化处理 */
+const handlePlatformChange = async (value: string) => {
+  currentPlatform.value = value;
+  // 如果在新增/编辑角色对话框中,重新加载菜单树
+  if (dialog.visible) {
+    await getMenuTreeselect();
+    // 清空之前选中的菜单
+    menuRef.value?.setCheckedKeys([]);
+  }
+};
 
 /** 重置 */
 const resetQuery = () => {
@@ -340,7 +356,7 @@ const handleAuthUser = (row: RoleVO) => {
 
 /** 查询菜单树结构 */
 const getMenuTreeselect = async () => {
-  const res = await menuTreeselect();
+  const res = await menuTreeselect({ platformCode: currentPlatform.value });
   menuOptions.value = res.data;
 };
 /** 所有部门节点数据 */
@@ -374,12 +390,17 @@ const handleAdd = () => {
 };
 /** 修改角色 */
 const handleUpdate = async (row?: RoleVO) => {
+  console.log(row);
   reset();
   const roleId = row?.roleId || ids.value[0];
   const { data } = await getRole(roleId);
   Object.assign(form.value, data);
   form.value.roleSort = Number(form.value.roleSort);
-  const res = await getRoleMenuTreeselect(roleId);
+  // 使用角色数据中的平台代码
+  if (row.platformCode) {
+    currentPlatform.value = row.platformCode;
+  }
+  const res = await getRoleMenuTreeselect(roleId, currentPlatform.value);
   dialog.title = '修改角色';
   dialog.visible = true;
   res.checkedKeys.forEach((v) => {
@@ -389,8 +410,8 @@ const handleUpdate = async (row?: RoleVO) => {
   });
 };
 /** 根据角色ID查询菜单树结构 */
-const getRoleMenuTreeselect = (roleId: string | number) => {
-  return roleMenuTreeselect(roleId).then((res): RoleMenuTree => {
+const getRoleMenuTreeselect = (roleId: string | number, platformCode?: string) => {
+  return roleMenuTreeselect(roleId, platformCode).then((res): RoleMenuTree => {
     menuOptions.value = res.data.menus;
     return res.data;
   });
@@ -450,6 +471,7 @@ const getMenuAllCheckedKeys = (): any => {
 const submitForm = () => {
   roleFormRef.value?.validate(async (valid: boolean) => {
     if (valid) {
+      form.value.platformCode = currentPlatform.value;
       form.value.menuIds = getMenuAllCheckedKeys();
       form.value.roleId ? await updateRole(form.value) : await addRole(form.value);
       proxy?.$modal.msgSuccess('操作成功');

+ 3 - 2
src/views/system/tenantPackage/index.vue

@@ -112,7 +112,7 @@ import { tenantPackageMenuTreeselect } from '@/api/system/menu';
 import { TenantPkgForm, TenantPkgQuery, TenantPkgVO } from '@/api/system/tenantPackage/types';
 import { MenuTreeOption } from '@/api/system/menu/types';
 import to from 'await-to-js';
-
+import { getPlatformCode } from '@/utils/platform';
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 
 const tenantPackageList = ref<TenantPkgVO[]>([]);
@@ -126,6 +126,7 @@ const total = ref(0);
 const menuExpand = ref(false);
 const menuNodeAll = ref(false);
 const menuOptions = ref<MenuTreeOption[]>([]);
+const currentPlatform = ref<string>(getPlatformCode());
 
 const menuTreeRef = ref<ElTreeInstance>();
 const queryFormRef = ref<ElFormInstance>();
@@ -172,7 +173,7 @@ const getMenuAllCheckedKeys = (): any => {
 
 /** 根据租户套餐ID查询菜单树结构 */
 const getPackageMenuTreeselect = async (packageId: string | number) => {
-  const res = await tenantPackageMenuTreeselect(packageId);
+  const res = await tenantPackageMenuTreeselect(packageId, currentPlatform.value);
   menuOptions.value = res.data.menus;
   return Promise.resolve(res);
 };

+ 25 - 7
src/views/system/user/index.vue

@@ -79,8 +79,10 @@
                 <el-dropdown class="mt-[1px]">
                   <el-button plain type="info">
                     更多
-                    <el-icon class="el-icon--right"><arrow-down /></el-icon
-                  ></el-button>
+                    <el-icon class="el-icon--right">
+                      <arrow-down />
+                    </el-icon>
+                  </el-button>
                   <template #dropdown>
                     <el-dropdown-menu>
                       <el-dropdown-item icon="Download" @click="importTemplate">下载模板</el-dropdown-item>
@@ -236,6 +238,16 @@
             </el-form-item>
           </el-col>
         </el-row>
+        <el-row>
+          <el-col :span="24">
+            <!-- 仅当是总控平台时显示 -->
+            <el-form-item v-if="isMainPlatform" label="所属平台" prop="platformCode">
+              <el-select v-model="form.platformCode" placeholder="请选择平台">
+                <el-option v-for="dict in sys_platform_code" :key="dict.value" :label="dict.label" :value="dict.value" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
         <el-row>
           <el-col :span="24">
             <el-form-item label="备注">
@@ -299,10 +311,13 @@ import { to } from 'await-to-js';
 import { optionselect } from '@/api/system/post';
 import { checkPermi } from '@/utils/permission';
 import { useUserStore } from '@/store/modules/user';
+import { getPlatformCode } from '@/utils/platform';
 
 const router = useRouter();
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
-const { sys_normal_disable, sys_user_sex } = toRefs<any>(proxy?.useDict('sys_normal_disable', 'sys_user_sex'));
+const { sys_normal_disable, sys_user_sex, sys_platform_code } = toRefs<any>(
+  proxy?.useDict('sys_normal_disable', 'sys_user_sex', 'sys_platform_code')
+);
 const userList = ref<UserVO[]>();
 const loading = ref(true);
 const showSearch = ref(true);
@@ -349,6 +364,9 @@ const userFormRef = ref<ElFormInstance>();
 const uploadRef = ref<ElUploadInstance>();
 const formDialogRef = ref<ElDialogInstance>();
 
+const currentPlatform = getPlatformCode(); //当前平台
+const isMainPlatform = computed(() => currentPlatform === 'main');
+
 const dialog = reactive<DialogOption>({
   visible: false,
   title: ''
@@ -366,7 +384,8 @@ const initFormData: UserForm = {
   status: '0',
   remark: '',
   postIds: [],
-  roleIds: []
+  roleIds: [],
+  platformCode: ''
 };
 
 const initData: PageData<UserForm, UserQuery> = {
@@ -391,6 +410,7 @@ const initData: PageData<UserForm, UserQuery> = {
       }
     ],
     nickName: [{ required: true, message: '用户昵称不能为空', trigger: 'blur' }],
+    platformCode: [{ required: true, message: '所属平台不能为空', trigger: 'blur' }],
     password: [
       { required: true, message: '用户密码不能为空', trigger: 'blur' },
       {
@@ -615,9 +635,7 @@ const handleUpdate = async (row?: UserForm) => {
   dialog.title = '修改用户';
   Object.assign(form.value, data.user);
   postOptions.value = data.posts;
-  roleOptions.value = Array.from(
-    new Map([...data.roles, ...data.user.roles].map(role => [role.roleId, role])).values()
-  );
+  roleOptions.value = Array.from(new Map([...data.roles, ...data.user.roles].map((role) => [role.roleId, role])).values());
   form.value.postIds = data.postIds;
   form.value.roleIds = data.roleIds;
   form.value.password = '';