Browse Source

1、处理菜单展示

yys 1 week ago
parent
commit
3b51d19a96

+ 1 - 1
fs-admin-saas/src/main/java/com/fs/web/controller/common/CaptchaController.java

@@ -25,7 +25,7 @@ import org.springframework.context.annotation.Profile;
  *
 
  */
-//@Profile("admin")
+@Profile("admin")
 @RestController
 public class CaptchaController
 {

+ 1 - 1
fs-admin-saas/src/main/java/com/fs/web/controller/system/SysLoginController.java

@@ -42,7 +42,7 @@ import com.fs.system.service.IAdminMenuService;
  *
 
  */
-//@Profile("admin")
+@Profile("admin")
 @RestController
 public class SysLoginController
 {

+ 13 - 0
fs-common/src/main/java/com/fs/common/core/domain/TreeSelect.java

@@ -31,6 +31,9 @@ public class TreeSelect implements Serializable
     /** 菜单状态(0显示 1停用) */
     private String status;
 
+    /** 菜单类型(M目录 C菜单 F按钮) */
+    private String menuType;
+
     /** 子节点 */
     @JsonInclude(JsonInclude.Include.NON_EMPTY)
     private List<TreeSelect> children;
@@ -51,6 +54,7 @@ public class TreeSelect implements Serializable
     {
         this.id = menu.getMenuId();
         this.label = menu.getMenuName();
+        this.menuType = menu.getMenuType();
         this.children = menu.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
         this.visible = menu.getVisible();
         this.status = menu.getStatus();
@@ -60,6 +64,7 @@ public class TreeSelect implements Serializable
     {
         this.id = menu.getMenuId();
         this.label = menu.getMenuName();
+        this.menuType = menu.getMenuType();
         this.children = menu.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
         this.visible = menu.getVisible();
         this.status = menu.getStatus();
@@ -105,6 +110,14 @@ public class TreeSelect implements Serializable
         this.status = status;
     }
 
+    public String getMenuType() {
+        return menuType;
+    }
+
+    public void setMenuType(String menuType) {
+        this.menuType = menuType;
+    }
+
     public void setLabel(String label)
     {
         this.label = label;

+ 35 - 73
fs-service/src/main/java/com/fs/tenant/service/impl/TenantInfoServiceImpl.java

@@ -277,77 +277,62 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoMapper, TenantI
         if ("sys".equals(flag)) {
             List<SysMenu> menuList = baseMapper.selectTenantMenu();
             List<SysMenu> result = mergeSysMenu(sysMenus, menuList);
-            List<TreeSelect> treeSelects = menuService.buildMenuTreeSelect(result);
-            return R.ok().put("menus", treeSelects);
+            // 返回与模板维护页一致的扁平列表,由前端 handleTree(menuId) 建树
+            return R.ok().put("menus", result);
         }
         List<TenantCompanyMenu> menuList = baseMapper.selectTenantComMenu();
         List<TenantCompanyMenu> result = mergeComMenu(companyMenus, menuList);
-        List<TreeSelect> treeSelects = menuService.buildComMenuTreeSelect(result);
-        return R.ok().put("menus", treeSelects);
+        return R.ok().put("menus", result);
     }
 
     /**
-     * 合并菜单
-     * @param standardList 标准菜单
-     * @param tenantList 租户菜单
-     * @return
+     * 合并模板菜单与租户库菜单:结构以模板(tenant_sys_menu)为准,visible 以租户库为准
      */
     private List<SysMenu> mergeSysMenu(List<SysMenu> standardList, List<SysMenu> tenantList) {
-        // 租户菜单转成 map:key = menuId
         Map<Long, SysMenu> tenantMap = tenantList.stream()
-                .collect(Collectors.toMap(SysMenu::getMenuId, item -> item));
-
-        List<SysMenu> result = new ArrayList<>();
+                .collect(Collectors.toMap(SysMenu::getMenuId, item -> item, (a, b) -> a));
+        List<SysMenu> result = new ArrayList<>(standardList.size());
         for (SysMenu standard : standardList) {
-            // 过滤:只显示模板中 visible=0(显示状态)的菜单,隐藏状态的不展示
-            if (!"0".equals(standard.getVisible())) {
-                continue;
-            }
-            Long menuId = standard.getMenuId();
-            // 租户有这个 menuId → 用租户的覆盖
-            if (tenantMap.containsKey(menuId)) {
-                result.add(tenantMap.get(menuId));
-            }
-            // 租户没有 → 用标准菜单,标记为隐藏(未分配)
-            else {
-                standard.setVisible("1");
-                result.add(standard);
-            }
+            result.add(mergeOneSysMenu(standard, tenantMap));
         }
         return result;
     }
 
+    private SysMenu mergeOneSysMenu(SysMenu standard, Map<Long, SysMenu> tenantMap) {
+        SysMenu tenant = tenantMap.get(standard.getMenuId());
+        if (tenant != null) {
+            return tenant;
+        }
+        SysMenu unassigned = new SysMenu();
+        BeanUtil.copyProperties(standard, unassigned);
+        unassigned.setVisible("1");
+        return unassigned;
+    }
+
     /**
-     * 合并销售菜单
-     * @param standardList 标准菜单
-     * @param tenantList 租户菜单
-     * @return
+     * 合并模板销售菜单与租户库 company_menu
      */
     private List<TenantCompanyMenu> mergeComMenu(List<TenantCompanyMenu> standardList, List<TenantCompanyMenu> tenantList) {
-        // 租户菜单转成 map:key = menuId
         Map<Long, TenantCompanyMenu> tenantMap = tenantList.stream()
-                .collect(Collectors.toMap(TenantCompanyMenu::getMenuId, item -> item));
-
-        List<TenantCompanyMenu> result = new ArrayList<>();
+                .collect(Collectors.toMap(TenantCompanyMenu::getMenuId, item -> item, (a, b) -> a));
+        List<TenantCompanyMenu> result = new ArrayList<>(standardList.size());
         for (TenantCompanyMenu standard : standardList) {
-            // 过滤:只显示模板中 visible=0(显示状态)的菜单,隐藏状态的不展示
-            if (!"0".equals(standard.getVisible())) {
-                continue;
-            }
-            Long menuId = standard.getMenuId();
-            // 租户有 → 覆盖
-            if (tenantMap.containsKey(menuId)) {
-                result.add(tenantMap.get(menuId));
-            }
-            // 租户没有 → 标准
-            else {
-                standard.setVisible("1");
-                result.add(standard);
-            }
+            result.add(mergeOneComMenu(standard, tenantMap));
         }
         return result;
     }
 
+    private TenantCompanyMenu mergeOneComMenu(TenantCompanyMenu standard, Map<Long, TenantCompanyMenu> tenantMap) {
+        TenantCompanyMenu tenant = tenantMap.get(standard.getMenuId());
+        if (tenant != null) {
+            return tenant;
+        }
+        TenantCompanyMenu unassigned = new TenantCompanyMenu();
+        BeanUtil.copyProperties(standard, unassigned);
+        unassigned.setVisible("1");
+        return unassigned;
+    }
+
     @Override
     public R menuEdit(List<Long> selected, List<Long> unSelected,String flag,List<SysMenu> addSysMenu,List<TenantCompanyMenu> addCompanyMenu) {
         if ("sys".equals(flag)){
@@ -383,19 +368,7 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoMapper, TenantI
 
     @Override
     public List<SysMenu> selectMenuList(SysMenu menu, Long userId) {
-        List<SysMenu> menuList = baseMapper.selectMenuList(menu);
-
-//        // 管理员显示所有菜单信息
-//        if (SysUser.isAdmin(userId))
-//        {
-//
-//        }
-//        else
-//        {
-//            menu.getParams().put("userId", userId);
-//            menuList = baseMapper.selectMenuListByUserId(menu);
-//        }
-        return menuList;
+        return baseMapper.selectMenuList(menu);
     }
 
     @Override
@@ -443,18 +416,7 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoMapper, TenantI
 
     @Override
     public List<TenantCompanyMenu> selectCompanyMenuList(TenantCompanyMenu menu, Long userId) {
-        List<TenantCompanyMenu> menuList = baseMapper.selectCompanyMenuList(menu);
-        // 管理员显示所有菜单信息
-//        if (SysUser.isAdmin(userId))
-//        {
-//            menuList = baseMapper.selectCompanyMenuList(menu);
-//        }
-//        else
-//        {
-//            menu.getParams().put("userId", userId);
-//            menuList = baseMapper.selectCompanyMenuList(menu);
-//        }
-        return menuList;
+        return baseMapper.selectCompanyMenuList(menu);
     }
 
     @Override

+ 21 - 19
sql/admin_menu_init.sql

@@ -1,43 +1,45 @@
 -- =====================================================
--- adminUI 总后台菜单初始化 SQL (fs_menu)
+-- adminUI 总后台菜单初始化 SQL (sys_menu,非 fs_menu)
 -- 将前端硬编码菜单迁移到数据库,支持角色-菜单权限分配
 -- =====================================================
 
 -- 1. 清理旧数据(谨慎执行,确保备份)
-DELETE FROM fs_role_menu WHERE menu_id IN (
-    SELECT menu_id FROM (SELECT menu_id FROM fs_menu WHERE menu_id >= 2000) t
+DELETE FROM sys_role_menu WHERE menu_id IN (
+    SELECT menu_id FROM (SELECT menu_id FROM sys_menu WHERE menu_id >= 2000) t
 );
-DELETE FROM fs_menu WHERE menu_id >= 2000;
+DELETE FROM sys_menu WHERE menu_id >= 2000;
 
 -- 2. 根节点:/admin
-INSERT INTO fs_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
+INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
 VALUES (2000, '总后台', 0, 1, 'admin', 'AdminLayout', 'M', 'el-icon-s-platform', '0', '0', 0, 0, 'admin', NOW(), 'adminUI根路由');
 
 -- 3. 数据看板(作为 /admin 的默认重定向页面)
-INSERT INTO fs_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
+INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
 VALUES (2001, '数据看板', 2000, 0, 'dashboard', 'admin/dashboard/index', 'C', 'el-icon-s-data', '0', '0', 0, 0, 'admin', NOW(), '默认首页');
 
 -- ============================================================================
 -- 4. 分组 1:租户代理
 -- ============================================================================
-INSERT INTO fs_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
+INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
 VALUES (2100, '租户代理', 2000, 1, '', '', 'M', 'el-icon-office-building', '0', '0', 0, 0, 'admin', NOW(), '顶部导航分组');
 
-INSERT INTO fs_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
+INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
 VALUES
 (2101, '代理管理', 2100, 1, 'proxy', 'admin/proxy/index', 'C', 'el-icon-user', '0', '0', 0, 0, 'admin', NOW(), NULL),
 (2102, '收费配置', 2100, 2, 'serviceCost', 'admin/serviceCost/index', 'C', 'el-icon-price-tag', '0', '0', 0, 0, 'admin', NOW(), NULL),
 (2103, '收益报表', 2100, 3, 'agentReport', 'admin/agentReport/index', 'C', 'el-icon-data-analysis', '0', '0', 0, 0, 'admin', NOW(), NULL),
 (2104, '租户列表', 2100, 4, 'company', 'admin/sysCompany/index', 'C', 'el-icon-notebook-2', '0', '0', 0, 0, 'admin', NOW(), NULL),
-(2105, '租户模块使用统计', 2100, 5, 'moduleUsage', 'admin/moduleUsage/index', 'C', 'el-icon-pie-chart', '0', '0', 0, 0, 'admin', NOW(), NULL);
+(2105, '租户模块使用统计', 2100, 5, 'moduleUsage', 'admin/moduleUsage/index', 'C', 'el-icon-pie-chart', '0', '0', 0, 0, 'admin', NOW(), NULL),
+(2106, '租户管理端菜单', 2100, 6, 'tenantMenu', 'admin/tenantMenu/index', 'C', 'el-icon-menu', '0', '0', 0, 0, 'admin', NOW(), '租户管理端菜单模板 CRUD'),
+(2107, '租户销售端菜单', 2100, 7, 'tenantCompany', 'admin/tenantCompany/index', 'C', 'el-icon-s-grid', '0', '0', 0, 0, 'admin', NOW(), '租户销售端菜单模板 CRUD');
 
 -- ============================================================================
 -- 5. 分组 2:内容审计
 -- ============================================================================
-INSERT INTO fs_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
+INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
 VALUES (2200, '内容审计', 2000, 2, '', '', 'M', 'el-icon-view', '0', '0', 0, 0, 'admin', NOW(), '顶部导航分组');
 
-INSERT INTO fs_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
+INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
 VALUES
 (2201, '视频资源', 2200, 1, 'videoResource', 'admin/videoResource/index', 'C', 'el-icon-video-camera', '0', '0', 0, 0, 'admin', NOW(), NULL),
 (2202, '公域课程管理', 2200, 2, 'course', 'admin/course/index', 'C', 'el-icon-reading', '0', '0', 0, 0, 'admin', NOW(), NULL),
@@ -52,10 +54,10 @@ VALUES
 -- ============================================================================
 -- 6. 分组 3:财务管理
 -- ============================================================================
-INSERT INTO fs_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
+INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
 VALUES (2300, '财务管理', 2000, 3, '', '', 'M', 'el-icon-money', '0', '0', 0, 0, 'admin', NOW(), '顶部导航分组');
 
-INSERT INTO fs_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
+INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
 VALUES
 (2301, '消费扣款记录', 2300, 1, 'consumeRecord', 'admin/consumeRecord/index', 'C', 'el-icon-wallet', '0', '0', 0, 0, 'admin', NOW(), NULL),
 (2302, '模块消费统计', 2300, 2, 'consumeReport', 'admin/consumeReport/index', 'C', 'el-icon-pie-chart', '0', '0', 0, 0, 'admin', NOW(), NULL),
@@ -66,10 +68,10 @@ VALUES
 -- ============================================================================
 -- 7. 分组 4:通信管理
 -- ============================================================================
-INSERT INTO fs_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
+INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
 VALUES (2400, '通信管理', 2000, 4, '', '', 'M', 'el-icon-phone-outline', '0', '0', 0, 0, 'admin', NOW(), '顶部导航分组');
 
-INSERT INTO fs_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
+INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
 VALUES
 (2401, '外呼管理', 2400, 1, 'voice', 'admin/voice/index', 'C', 'el-icon-phone', '0', '0', 0, 0, 'admin', NOW(), NULL),
 (2402, '通话接口管理', 2400, 2, 'voiceApi', 'admin/voiceApi/index', 'C', 'el-icon-connection', '0', '0', 0, 0, 'admin', NOW(), NULL),
@@ -85,10 +87,10 @@ VALUES
 -- ============================================================================
 -- 8. 分组 5:系统管理
 -- ============================================================================
-INSERT INTO fs_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
+INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
 VALUES (2500, '系统管理', 2000, 5, '', '', 'M', 'el-icon-setting', '0', '0', 0, 0, 'admin', NOW(), '顶部导航分组');
 
-INSERT INTO fs_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
+INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
 VALUES
 (2501, '员工管理', 2500, 1, 'sysUser', 'admin/sysUser/index', 'C', 'el-icon-user', '0', '0', 0, 0, 'admin', NOW(), NULL),
 (2502, '角色管理', 2500, 2, 'role', 'system/role/index', 'C', 'el-icon-s-check', '0', '0', 0, 0, 'admin', NOW(), NULL),
@@ -103,10 +105,10 @@ VALUES
 -- ============================================================================
 -- 9. 分组 6:系统配置
 -- ============================================================================
-INSERT INTO fs_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
+INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
 VALUES (2600, '系统配置', 2000, 6, '', '', 'M', 'el-icon-s-tools', '0', '0', 0, 0, 'admin', NOW(), '顶部导航分组');
 
-INSERT INTO fs_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
+INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, create_by, create_time, remark)
 VALUES
 (2601, '字典管理', 2600, 1, 'dict', 'system/dict/index', 'C', 'el-icon-collection', '0', '0', 0, 0, 'admin', NOW(), NULL),
 (2602, '参数管理', 2600, 2, 'config', 'system/config/index', 'C', 'el-icon-edit-outline', '0', '0', 0, 0, 'admin', NOW(), NULL),