Explorar o código

菜单管理大体雏形已出,差后续添加菜单时,需要同步到对应的admin角色绑定的菜单项

Huanyi hai 2 meses
pai
achega
58cf4a6da4
Modificáronse 18 ficheiros con 142 adicións e 58 borrados
  1. 1 0
      ruoyi-auth/src/main/resources/application.yml
  2. 2 2
      ruoyi-common/ruoyi-common-dubbo/src/main/resources/common-dubbo.yml
  3. 9 0
      ruoyi-common/yingpaipay-common-platform/src/main/java/org/dromara/common/platform/Platform.java
  4. 1 1
      ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/serviceImpl.java.vm
  5. 2 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysMenu.java
  6. 6 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java
  7. 16 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenant.java
  8. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenantCategories.java
  9. 2 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java
  10. 5 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantBo.java
  11. 3 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantCategoriesBo.java
  12. 3 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantCategoriesVo.java
  13. 17 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java
  14. 1 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java
  15. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantCategoriesServiceImpl.java
  16. 65 50
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java
  17. 3 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java
  18. 4 0
      script/sql/business/update.sql

+ 1 - 0
ruoyi-auth/src/main/resources/application.yml

@@ -20,6 +20,7 @@ spring:
       username: @nacos.username@
       password: @nacos.password@
       discovery:
+        ip: 192.168.1.118
         # 注册组
         group: @nacos.discovery.group@
         namespace: ${spring.profiles.active}

+ 2 - 2
ruoyi-common/ruoyi-common-dubbo/src/main/resources/common-dubbo.yml

@@ -22,8 +22,8 @@ dubbo:
   metadata-report:
     address: redis://${spring.data.redis.host:localhost}:${spring.data.redis.port:6379}
     group: DUBBO_GROUP
-    username: ${spring.data.redis.username:default}
-    password: ${spring.data.redis.password}
+    username: ${spring.data.redis.username:ithuanyi}
+    password: ${spring.data.redis.password:123456}
     parameters:
       namespace: ${spring.profiles.active}
       database: ${spring.data.redis.database}

+ 9 - 0
ruoyi-common/yingpaipay-common-platform/src/main/java/org/dromara/common/platform/Platform.java

@@ -29,4 +29,13 @@ public enum Platform {
     public static boolean isAdmin(String header) {
         return header.equals(ADMIN.code);
     }
+
+    public static Integer getIdByCode(String code) {
+        for (Platform value : values()) {
+            if (value.code.equals(code)) {
+                return value.id;
+            }
+        }
+        throw new IllegalArgumentException("未知平台");
+    }
 }

+ 1 - 1
ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/serviceImpl.java.vm

@@ -99,7 +99,7 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service {
 #end
 #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
 #if($column.isPk==1)
-        lqw.orderByAsc(${ClassName}::get$AttrName);
+        lqw.orderByDesc(${ClassName}::get$AttrName);
 #end
 #end
         return lqw;

+ 2 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysMenu.java

@@ -106,6 +106,8 @@ public class SysMenu extends BaseEntity {
     @TableField(exist = false)
     private String parentName;
 
+    private Integer platformId;
+
     /**
      * 子菜单
      */

+ 6 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java

@@ -72,6 +72,12 @@ public class SysRole extends TenantEntity {
      */
     private String remark;
 
+    /**
+     * 平台ID
+     * @Author Huanyi
+     */
+    private Integer platformId;
+
     public SysRole(Long roleId) {
         this.roleId = roleId;
     }

+ 16 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenant.java

@@ -15,6 +15,12 @@ import java.util.Date;
  *
  * @author Michelle.Chung
  */
+
+/**
+ * 改为 连锁品牌
+ *
+ * @Author Huanyi
+ */
 @Data
 @EqualsAndHashCode(callSuper = true)
 @TableName("sys_tenant")
@@ -100,4 +106,14 @@ public class SysTenant extends BaseEntity {
     @TableLogic
     private String delFlag;
 
+    /**
+     * 品牌 LOGO
+     */
+    private Long logo;
+
+    /**
+     * 对应管理员
+     */
+    private Long admin;
+
 }

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenantCategories.java

@@ -47,7 +47,7 @@ public class SysTenantCategories extends BaseEntity {
     /**
      * 状态
      */
-    private Integer status;
+    private Boolean status;
 
     /**
      * 删除标志(0代表存在 1代表删除)

+ 2 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java

@@ -110,5 +110,7 @@ public class SysMenuBo extends BaseEntity {
      */
     private String remark;
 
+    @NotNull(message = "未知平台")
+    private Integer platformId;
 
 }

+ 5 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantBo.java

@@ -93,7 +93,7 @@ public class SysTenantBo extends BaseEntity {
     /**
      * 租户套餐编号
      */
-    @NotNull(message = "租户套餐不能为空", groups = { AddGroup.class })
+//    @NotNull(message = "租户套餐不能为空", groups = { AddGroup.class })
     private Long packageId;
 
     /**
@@ -111,5 +111,9 @@ public class SysTenantBo extends BaseEntity {
      */
     private String status;
 
+    /**
+     * 品牌 LOGO
+     */
+    private Long logo;
 
 }

+ 3 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantCategoriesBo.java

@@ -36,7 +36,9 @@ public class SysTenantCategoriesBo extends BaseEntity {
 
     /**
      * 排序
+     * 这里必填是因为不填的话,根据这字段排序时就可能会抛 {@code SQL} 异常
      */
+    @NotNull(message = "必须指定其排序", groups = { AddGroup.class, EditGroup.class })
     private Long sort;
 
     /**
@@ -48,7 +50,7 @@ public class SysTenantCategoriesBo extends BaseEntity {
      * 状态
      */
     @NotNull(message = "状态不能为空", groups = { AddGroup.class, EditGroup.class })
-    private Integer status;
+    private Boolean status;
 
 
 }

+ 3 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantCategoriesVo.java

@@ -63,12 +63,13 @@ public class SysTenantCategoriesVo implements Serializable {
      * 状态
      */
     @ExcelProperty(value = "状态")
-    private Integer status;
+    private Boolean status;
 
     /**
      * 创建者
      */
     @ExcelProperty(value = "创建者")
+    @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "createBy")
     private Long createBy;
 
     /**
@@ -81,6 +82,7 @@ public class SysTenantCategoriesVo implements Serializable {
      * 更新者
      */
     @ExcelProperty(value = "更新者")
+    @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "createBy")
     private Long updateBy;
 
     /**

+ 17 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java

@@ -6,6 +6,8 @@ import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 import org.dromara.common.excel.annotation.ExcelDictFormat;
 import org.dromara.common.excel.convert.ExcelDictConvert;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
 import org.dromara.system.domain.SysTenant;
 
 import java.io.Serial;
@@ -18,6 +20,12 @@ import java.util.Date;
  *
  * @author Michelle.Chung
  */
+
+/**
+ * 改成 连锁品牌
+ *
+ */
+
 @Data
 @ExcelIgnoreUnannotated
 @AutoMapper(target = SysTenant.class)
@@ -111,5 +119,14 @@ public class SysTenantVo implements Serializable {
     @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
     private String status;
 
+    private Long admin;
+
+    @Translation(type = TransConstant.USER_ID_TO_NAME, mapper = "admin")
+    private String username;
+
+    private Long logo;
+
+    @Translation(type = TransConstant.OSS_ID_TO_URL, mapper = "logo")
+    private String logoUrl;
 
 }

+ 1 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java

@@ -75,6 +75,7 @@ public class SysMenuServiceImpl implements ISysMenuService {
         }
         menuList = baseMapper.selectVoList(
             wrapper.like(StringUtils.isNotBlank(menu.getMenuName()), SysMenu::getMenuName, menu.getMenuName())
+                .eq(SysMenu::getPlatformId, menu.getPlatformId())
                 .eq(StringUtils.isNotBlank(menu.getVisible()), SysMenu::getVisible, menu.getVisible())
                 .eq(StringUtils.isNotBlank(menu.getStatus()), SysMenu::getStatus, menu.getStatus())
                 .eq(StringUtils.isNotBlank(menu.getMenuType()), SysMenu::getMenuType, menu.getMenuType())

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantCategoriesServiceImpl.java

@@ -73,7 +73,7 @@ public class SysTenantCategoriesServiceImpl implements ISysTenantCategoriesServi
     private LambdaQueryWrapper<SysTenantCategories> buildQueryWrapper(SysTenantCategoriesBo bo) {
         Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<SysTenantCategories> lqw = Wrappers.lambdaQuery();
-        lqw.orderByAsc(SysTenantCategories::getId);
+        lqw.orderByAsc(SysTenantCategories::getSort);
         lqw.like(StringUtils.isNotBlank(bo.getName()), SysTenantCategories::getName, bo.getName());
         lqw.eq(bo.getStatus() != null, SysTenantCategories::getStatus, bo.getStatus());
         lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null,

+ 65 - 50
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java

@@ -3,6 +3,7 @@ package org.dromara.system.service.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.convert.Convert;
+import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.RandomUtil;
 import cn.hutool.crypto.digest.BCrypt;
@@ -22,6 +23,7 @@ import org.dromara.common.core.utils.StreamUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.platform.Platform;
 import org.dromara.common.redis.utils.CacheUtils;
 import org.dromara.common.tenant.core.TenantEntity;
 import org.dromara.common.tenant.helper.TenantHelper;
@@ -58,6 +60,7 @@ public class SysTenantServiceImpl implements ISysTenantService {
     private final SysDictTypeMapper dictTypeMapper;
     private final SysDictDataMapper dictDataMapper;
     private final SysConfigMapper configMapper;
+    private final SysMenuMapper menuMapper;
 
     @DubboReference(mock = "true")
     private RemoteWorkflowService remoteWorkflowService;
@@ -124,14 +127,18 @@ public class SysTenantServiceImpl implements ISysTenantService {
     public Boolean insertByBo(SysTenantBo bo) {
         SysTenant add = MapstructUtils.convert(bo, SysTenant.class);
 
+        // 直接先将用户ID创建好, 这样就可以避免插入完反过来又要更新管理员ID
+        long userId = IdUtil.getSnowflakeNextId();
+
         // 获取所有租户编号
         List<String> tenantIds = baseMapper.selectObjs(
             new LambdaQueryWrapper<SysTenant>().select(SysTenant::getTenantId), x -> {return Convert.toStr(x);});
         String tenantId = generateTenantId(tenantIds);
         add.setTenantId(tenantId);
+        add.setAdmin(userId);
         boolean flag = baseMapper.insert(add) > 0;
         if (!flag) {
-            throw new ServiceException("创建租户失败");
+            throw new ServiceException("创建品牌失败");
         }
         bo.setId(add.getId());
 
@@ -153,13 +160,16 @@ public class SysTenantServiceImpl implements ISysTenantService {
         roleDept.setDeptId(deptId);
         roleDeptMapper.insert(roleDept);
 
-        // 创建系统用户
+        // 创建系统用户(品牌商户的管理员)
         SysUser user = new SysUser();
+        user.setUserId(userId);
         user.setTenantId(tenantId);
         user.setUserName(bo.getUsername());
         user.setNickName(bo.getUsername());
+        user.setPhonenumber(bo.getContactPhone());
         user.setPassword(BCrypt.hashpw(bo.getPassword()));
         user.setDeptId(deptId);
+        user.setPlatformId(Platform.MERCHANT.getId());
         userMapper.insert(user);
         //新增系统用户后,默认当前用户为部门的负责人
         SysDept sd = new SysDept();
@@ -173,47 +183,48 @@ public class SysTenantServiceImpl implements ISysTenantService {
         userRole.setRoleId(roleId);
         userRoleMapper.insert(userRole);
 
-        String defaultTenantId = TenantConstants.DEFAULT_TENANT_ID;
-        List<SysDictType> dictTypeList = dictTypeMapper.selectList(
-            new LambdaQueryWrapper<SysDictType>().eq(SysDictType::getTenantId, defaultTenantId));
-        List<SysDictData> dictDataList = dictDataMapper.selectList(
-            new LambdaQueryWrapper<SysDictData>().eq(SysDictData::getTenantId, defaultTenantId));
-        for (SysDictType dictType : dictTypeList) {
-            dictType.setDictId(null);
-            dictType.setTenantId(tenantId);
-            dictType.setCreateDept(null);
-            dictType.setCreateBy(null);
-            dictType.setCreateTime(null);
-            dictType.setUpdateBy(null);
-            dictType.setUpdateTime(null);
-        }
-        for (SysDictData dictData : dictDataList) {
-            dictData.setDictCode(null);
-            dictData.setTenantId(tenantId);
-            dictData.setCreateDept(null);
-            dictData.setCreateBy(null);
-            dictData.setCreateTime(null);
-            dictData.setUpdateBy(null);
-            dictData.setUpdateTime(null);
-        }
-        dictTypeMapper.insertBatch(dictTypeList);
-        dictDataMapper.insertBatch(dictDataList);
-
-        List<SysConfig> sysConfigList = configMapper.selectList(
-            new LambdaQueryWrapper<SysConfig>().eq(SysConfig::getTenantId, defaultTenantId));
-        for (SysConfig config : sysConfigList) {
-            config.setConfigId(null);
-            config.setTenantId(tenantId);
-            config.setCreateDept(null);
-            config.setCreateBy(null);
-            config.setCreateTime(null);
-            config.setUpdateBy(null);
-            config.setUpdateTime(null);
-        }
-        configMapper.insertBatch(sysConfigList);
-
-        // 新增租户流程定义
-        remoteWorkflowService.syncDef(tenantId);
+        // FIXME 系统内字典和配置不进行租户隔离
+//        String defaultTenantId = TenantConstants.DEFAULT_TENANT_ID;
+//        List<SysDictType> dictTypeList = dictTypeMapper.selectList(
+//            new LambdaQueryWrapper<SysDictType>().eq(SysDictType::getTenantId, defaultTenantId));
+//        List<SysDictData> dictDataList = dictDataMapper.selectList(
+//            new LambdaQueryWrapper<SysDictData>().eq(SysDictData::getTenantId, defaultTenantId));
+//        for (SysDictType dictType : dictTypeList) {
+//            dictType.setDictId(null);
+//            dictType.setTenantId(tenantId);
+//            dictType.setCreateDept(null);
+//            dictType.setCreateBy(null);
+//            dictType.setCreateTime(null);
+//            dictType.setUpdateBy(null);
+//            dictType.setUpdateTime(null);
+//        }
+//        for (SysDictData dictData : dictDataList) {
+//            dictData.setDictCode(null);
+//            dictData.setTenantId(tenantId);
+//            dictData.setCreateDept(null);
+//            dictData.setCreateBy(null);
+//            dictData.setCreateTime(null);
+//            dictData.setUpdateBy(null);
+//            dictData.setUpdateTime(null);
+//        }
+//        dictTypeMapper.insertBatch(dictTypeList);
+//        dictDataMapper.insertBatch(dictDataList);
+//
+//        List<SysConfig> sysConfigList = configMapper.selectList(
+//            new LambdaQueryWrapper<SysConfig>().eq(SysConfig::getTenantId, defaultTenantId));
+//        for (SysConfig config : sysConfigList) {
+//            config.setConfigId(null);
+//            config.setTenantId(tenantId);
+//            config.setCreateDept(null);
+//            config.setCreateBy(null);
+//            config.setCreateTime(null);
+//            config.setUpdateBy(null);
+//            config.setUpdateTime(null);
+//        }
+//        configMapper.insertBatch(sysConfigList);
+//
+//        // 新增租户流程定义
+//        remoteWorkflowService.syncDef(tenantId);
         return true;
     }
 
@@ -242,12 +253,15 @@ public class SysTenantServiceImpl implements ISysTenantService {
      */
     private Long createTenantRole(String tenantId, Long packageId) {
         // 获取租户套餐
-        SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId);
-        if (ObjectUtil.isNull(tenantPackage)) {
-            throw new ServiceException("套餐不存在");
-        }
+//        SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId);
+//        if (ObjectUtil.isNull(tenantPackage)) {
+//            throw new ServiceException("套餐不存在");
+//        }
         // 获取套餐菜单id
-        List<Long> menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong);
+//        List<Long> menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong);
+        List<Long> menuIds = menuMapper.selectList(
+            Wrappers.lambdaQuery(SysMenu.class).eq(SysMenu::getPlatformId, Platform.MERCHANT.getId())
+        ).stream().map(SysMenu::getMenuId).toList();
 
         // 创建角色
         SysRole role = new SysRole();
@@ -256,6 +270,7 @@ public class SysTenantServiceImpl implements ISysTenantService {
         role.setRoleKey(TenantConstants.TENANT_ADMIN_ROLE_KEY);
         role.setRoleSort(1);
         role.setStatus(SystemConstants.NORMAL);
+        role.setPlatformId(Platform.MERCHANT.getId());
         roleMapper.insert(role);
         Long roleId = role.getRoleId();
 
@@ -307,7 +322,7 @@ public class SysTenantServiceImpl implements ISysTenantService {
     @Override
     public void checkTenantAllowed(String tenantId) {
         if (ObjectUtil.isNotNull(tenantId) && TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) {
-            throw new ServiceException("不允许操作管理户");
+            throw new ServiceException("不允许操作管理户");
         }
     }
 
@@ -320,7 +335,7 @@ public class SysTenantServiceImpl implements ISysTenantService {
         if (isValid) {
             // 做一些业务上的校验,判断是否需要校验
             if (ids.contains(TenantConstants.SUPER_ADMIN_ID)) {
-                throw new ServiceException("超管户不能删除");
+                throw new ServiceException("超管户不能删除");
             }
         }
         return baseMapper.deleteByIds(ids) > 0;

+ 3 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java

@@ -1,5 +1,6 @@
 package org.dromara.system.service.impl;
 
+import cn.dev33.satoken.context.SaHolder;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.ArrayUtil;
@@ -18,6 +19,7 @@ import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.*;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.platform.Platform;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.system.domain.SysUser;
 import org.dromara.system.domain.SysUserPost;
@@ -90,6 +92,7 @@ public class SysUserServiceImpl implements ISysUserService {
         Map<String, Object> params = user.getParams();
         LambdaQueryWrapper<SysUser> wrapper = Wrappers.lambdaQuery();
         wrapper.eq(SysUser::getDelFlag, SystemConstants.NORMAL)
+            .eq(SysUser::getPlatformId, Platform.getIdByCode(SaHolder.getRequest().getHeader("X-Platform-Code")))
             .eq(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId())
             .in(StringUtils.isNotBlank(user.getUserIds()), SysUser::getUserId, StringUtils.splitTo(user.getUserIds(), Convert::toLong))
             .like(StringUtils.isNotBlank(user.getUserName()), SysUser::getUserName, user.getUserName())

+ 4 - 0
script/sql/business/update.sql

@@ -23,3 +23,7 @@ values(2021464069248733189, '商户分类删除', 2021464069248733185, '4',  '#'
 insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark, platform_id)
 values(2021464069248733190, '商户分类导出', 2021464069248733185, '5',  '#', '', 1, 0, 'F', '0', '0', 'system:tenantCategories:export',       '#', 103, 1, sysdate(), null, null, '', 0);
 
+ALTER TABLE `pet_system`.`sys_tenant` ADD COLUMN `logo` bigint COMMENT '品牌LOGO';
+
+ALTER TABLE `pet_system`.`sys_tenant` ADD COLUMN `admin` bigint NOT NULL COMMENT '管理员';
+ALTER TABLE `pet_system`.`sys_role` ADD COLUMN `platform_id` tinyint NOT NULL COMMENT '平台ID';