Эх сурвалжийг харах

feat: 租户关联菜单和用户

yang kai 2 жил өмнө
parent
commit
4aea285fb6

+ 1 - 1
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysTenantController.java

@@ -16,7 +16,7 @@ import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.enums.BusinessType;
-import com.ruoyi.system.domain.SysTenant;
+import com.ruoyi.common.core.domain.entity.SysTenant;
 import com.ruoyi.system.service.ISysTenantService;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.common.core.page.TableDataInfo;

+ 1 - 1
ruoyi-admin/src/main/resources/application-druid.yml

@@ -6,7 +6,7 @@ spring:
         druid:
             # 主库数据源
             master:
-                url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                url: jdbc:mysql://localhost:13306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                 username: root
                 password: root
             # 从库数据源

+ 1 - 1
ruoyi-admin/src/main/resources/logback.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration>
     <!-- 日志存放路径 -->
-	<property name="log.path" value="/home/ruoyi/logs" />
+	<property name="log.path" value="./logs" />
     <!-- 日志输出格式 -->
 	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
 

+ 44 - 45
ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTenant.java → ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysTenant.java

@@ -1,15 +1,17 @@
-package com.ruoyi.system.domain;
+package com.ruoyi.common.core.domain.entity;
 
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
 import com.ruoyi.common.annotation.Excel;
 import com.ruoyi.common.core.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
 
 /**
- * 租户信息对象 sys_tenant
+ * 部门表 sys_tenant
  * 
  * @author ruoyi
- * @date 2023-06-03
  */
 public class SysTenant extends BaseEntity
 {
@@ -23,7 +25,7 @@ public class SysTenant extends BaseEntity
     private String tenantName;
 
     /** 租户编号(公司统一信用代码) */
-    @Excel(name = "租户编号", readConverterExp = "公=司统一信用代码")
+    @Excel(name = "租户编号", readConverterExp = "公司统一信用代码")
     private String tenantCode;
 
     /** 负责人 */
@@ -38,74 +40,69 @@ public class SysTenant extends BaseEntity
     @Excel(name = "地址")
     private String address;
 
-    /** 是否删除(0:未删除,1已删除) */
+    /** 删除标志(0代表存在 1代表删除) */
     @Excel(name = "是否删除(0:未删除,1已删除)")
     private String isDel;
 
-    public void setTenantId(Long tenantId) 
-    {
-        this.tenantId = tenantId;
-    }
-
-    public Long getTenantId() 
-    {
+    public Long getTenantId() {
         return tenantId;
     }
-    public void setTenantName(String tenantName) 
-    {
-        this.tenantName = tenantName;
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
     }
 
-    public String getTenantName() 
-    {
+    @NotBlank(message = "租户名称不能为空")
+    @Size(min = 0, max = 100, message = "租户名称长度不能超过100个字符")
+    public String getTenantName() {
         return tenantName;
     }
-    public void setTenantCode(String tenantCode) 
-    {
-        this.tenantCode = tenantCode;
+    public void setTenantName(String tenantName) {
+        this.tenantName = tenantName;
     }
 
-    public String getTenantCode() 
-    {
+    @NotBlank(message = "租户编号不能为空")
+    @Size(min = 18, max = 18, message = "租户编号18个字符(公司统一信用代码)")
+    public String getTenantCode() {
         return tenantCode;
     }
-    public void setOwner(String owner) 
-    {
-        this.owner = owner;
+
+    public void setTenantCode(String tenantCode) {
+        this.tenantCode = tenantCode;
     }
 
-    public String getOwner() 
-    {
+    public String getOwner() {
         return owner;
     }
-    public void setContactInfo(String contactInfo) 
-    {
-        this.contactInfo = contactInfo;
+
+    public void setOwner(String owner) {
+        this.owner = owner;
     }
 
-    public String getContactInfo() 
-    {
+    public String getContactInfo() {
         return contactInfo;
     }
-    public void setAddress(String address) 
-    {
-        this.address = address;
+
+    public void setContactInfo(String contactInfo) {
+        this.contactInfo = contactInfo;
     }
 
-    public String getAddress() 
-    {
+    public String getAddress() {
         return address;
     }
-    public void setIsDel(String isDel) 
-    {
-        this.isDel = isDel;
+
+    public void setAddress(String address) {
+        this.address = address;
     }
 
-    public String getIsDel() 
-    {
+    public String getIsDel() {
         return isDel;
     }
 
+    public void setIsDel(String isDel) {
+        this.isDel = isDel;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
@@ -115,9 +112,11 @@ public class SysTenant extends BaseEntity
             .append("owner", getOwner())
             .append("contactInfo", getContactInfo())
             .append("address", getAddress())
+            .append("isDel", getIsDel())
             .append("createBy", getCreateBy())
             .append("createTime", getCreateTime())
-            .append("isDel", getIsDel())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
             .toString();
     }
 }

+ 38 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java

@@ -29,6 +29,9 @@ public class SysUser extends BaseEntity
     @Excel(name = "部门编号", type = Type.IMPORT)
     private Long deptId;
 
+    /** 租户ID */
+    private Long tenantId;
+
     /** 用户账号 */
     @Excel(name = "登录名称")
     private String userName;
@@ -37,6 +40,9 @@ public class SysUser extends BaseEntity
     @Excel(name = "用户名称")
     private String nickName;
 
+    /**用户类型 (00系统用户 01 租户管理员)*/
+    private String userType;
+
     /** 用户邮箱 */
     @Excel(name = "用户邮箱")
     private String email;
@@ -77,6 +83,9 @@ public class SysUser extends BaseEntity
     })
     private SysDept dept;
 
+
+    private SysTenant tenant;
+
     /** 角色对象 */
     private List<SysRole> roles;
 
@@ -89,6 +98,8 @@ public class SysUser extends BaseEntity
     /** 角色ID */
     private Long roleId;
 
+
+
     public SysUser()
     {
 
@@ -119,6 +130,10 @@ public class SysUser extends BaseEntity
         return userId != null && 1L == userId;
     }
 
+    public boolean isTenantAdmin() {
+        return "01".equals(this.userType);
+    }
+
     public Long getDeptId()
     {
         return deptId;
@@ -129,6 +144,13 @@ public class SysUser extends BaseEntity
         this.deptId = deptId;
     }
 
+
+    public Long getTenantId() { return tenantId; }
+
+    public void setTenantId(Long tenantId) {
+        this.tenantId = tenantId;
+    }
+
     @Xss(message = "用户昵称不能包含脚本字符")
     @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符")
     public String getNickName()
@@ -154,6 +176,14 @@ public class SysUser extends BaseEntity
         this.userName = userName;
     }
 
+    public String getUserType() {
+        return userType;
+    }
+
+    public void setUserType(String userType) {
+        this.userType = userType;
+    }
+
     @Email(message = "邮箱格式不正确")
     @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
     public String getEmail()
@@ -257,6 +287,12 @@ public class SysUser extends BaseEntity
         this.dept = dept;
     }
 
+    public SysTenant getTenant() {
+        return tenant;
+    }
+
+    public void setTenant(SysTenant tenant) { this.tenant = tenant; }
+
     public List<SysRole> getRoles()
     {
         return roles;
@@ -302,6 +338,7 @@ public class SysUser extends BaseEntity
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
             .append("userId", getUserId())
             .append("deptId", getDeptId())
+                .append("tenantId", getTenantId())
             .append("userName", getUserName())
             .append("nickName", getNickName())
             .append("email", getEmail())
@@ -319,6 +356,7 @@ public class SysUser extends BaseEntity
             .append("updateTime", getUpdateTime())
             .append("remark", getRemark())
             .append("dept", getDept())
+                .append("tenant", getTenant())
             .toString();
     }
 }

+ 16 - 1
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java

@@ -26,6 +26,13 @@ public class LoginUser implements UserDetails
      */
     private Long deptId;
 
+
+    /**
+     * 租户ID
+     */
+    private Long tenantId;
+
+
     /**
      * 用户唯一标识
      */
@@ -91,6 +98,11 @@ public class LoginUser implements UserDetails
         this.deptId = deptId;
     }
 
+    public Long getTenantId() { return tenantId; }
+
+    public void setTenantId(Long tenantId) { this.tenantId = tenantId; }
+
+
     public String getToken()
     {
         return token;
@@ -111,10 +123,11 @@ public class LoginUser implements UserDetails
         this.permissions = permissions;
     }
 
-    public LoginUser(Long userId, Long deptId, SysUser user, Set<String> permissions)
+    public LoginUser(Long userId, Long deptId, Long tenantId, SysUser user, Set<String> permissions)
     {
         this.userId = userId;
         this.deptId = deptId;
+        this.tenantId = tenantId;
         this.user = user;
         this.permissions = permissions;
     }
@@ -132,6 +145,8 @@ public class LoginUser implements UserDetails
         return user.getUserName();
     }
 
+    public String getUserType() { return user.getUserType(); }
+
     /**
      * 账户是否未过期,过期无法验证
      */

+ 26 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java

@@ -59,6 +59,28 @@ public class SecurityUtils
         }
     }
 
+    public static String getUserType() {
+        try
+        {
+            return getLoginUser().getUserType();
+        }
+        catch (Exception e)
+        {
+            throw new ServiceException("获取用户账户异常", HttpStatus.UNAUTHORIZED);
+        }
+    }
+
+    public static Long getTenantId() {
+        try
+        {
+            return getLoginUser().getTenantId();
+        }
+        catch (Exception e)
+        {
+            throw new ServiceException("获取租户ID异常", HttpStatus.UNAUTHORIZED);
+        }
+    }
+
     /**
      * 获取用户
      **/
@@ -117,4 +139,8 @@ public class SecurityUtils
     {
         return userId != null && 1L == userId;
     }
+
+    public static boolean isTenantAdmin(String userType, Long tenantId) {
+        return tenantId != null && "01".equals(userType);
+    }
 }

+ 1 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java

@@ -69,6 +69,7 @@ public class DataScopeAspect
         if (StringUtils.isNotNull(loginUser))
         {
             SysUser currentUser = loginUser.getUser();
+            System.out.println("currentUser: " + currentUser.isTenantAdmin());
             // 如果是超级管理员,则不过滤数据
             if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin())
             {

+ 1 - 1
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java

@@ -60,6 +60,6 @@ public class UserDetailsServiceImpl implements UserDetailsService
 
     public UserDetails createLoginUser(SysUser user)
     {
-        return new LoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user));
+        return new LoginUser(user.getUserId(), user.getDeptId(), user.getTenantId(), user, permissionService.getMenuPermission(user));
     }
 }

+ 8 - 1
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java

@@ -51,12 +51,19 @@ public interface SysMenuMapper
     public List<String> selectMenuPermsByUserId(Long userId);
 
     /**
-     * 根据用户ID查询菜单
+     * 超级管理员获取所有菜单
      *
      * @return 菜单列表
      */
     public List<SysMenu> selectMenuTreeAll();
 
+    /**
+     * 租户管理员获取租户所有菜单
+     *
+     * @return 菜单列表
+     */
+    public List<SysMenu> selectTenantMenuTreeAll(Long tenantId);
+
     /**
      * 根据用户ID查询菜单
      *

+ 1 - 1
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTenantMapper.java

@@ -1,7 +1,7 @@
 package com.ruoyi.system.mapper;
 
 import java.util.List;
-import com.ruoyi.system.domain.SysTenant;
+import com.ruoyi.common.core.domain.entity.SysTenant;
 
 /**
  * 租户信息Mapper接口

+ 1 - 1
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysTenantService.java

@@ -1,7 +1,7 @@
 package com.ruoyi.system.service;
 
 import java.util.List;
-import com.ruoyi.system.domain.SysTenant;
+import com.ruoyi.common.core.domain.entity.SysTenant;
 
 /**
  * 租户信息Service接口

+ 5 - 3
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java

@@ -131,12 +131,14 @@ public class SysMenuServiceImpl implements ISysMenuService
     public List<SysMenu> selectMenuTreeByUserId(Long userId)
     {
         List<SysMenu> menus = null;
+        String userType = SecurityUtils.getUserType();
+        Long tenantId = SecurityUtils.getTenantId();
         if (SecurityUtils.isAdmin(userId))
         {
             menus = menuMapper.selectMenuTreeAll();
-        }
-        else
-        {
+        } else if (SecurityUtils.isTenantAdmin(userType, tenantId)) {
+            menus = menuMapper.selectTenantMenuTreeAll(tenantId);
+        } else {
             menus = menuMapper.selectMenuTreeByUserId(userId);
         }
         return getChildPerms(menus, 0);

+ 1 - 1
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTenantServiceImpl.java

@@ -5,7 +5,7 @@ import com.ruoyi.common.utils.DateUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.ruoyi.system.mapper.SysTenantMapper;
-import com.ruoyi.system.domain.SysTenant;
+import com.ruoyi.common.core.domain.entity.SysTenant;
 import com.ruoyi.system.service.ISysTenantService;
 
 /**

+ 8 - 0
ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml

@@ -53,6 +53,14 @@
 		from sys_menu m where m.menu_type in ('M', 'C') and m.status = 0
 		order by m.parent_id, m.order_num
 	</select>
+
+	<select id="selectTenantMenuTreeAll" parameterType="Long" resultMap="SysMenuResult">
+		select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.`query`, m.visible, m.status, ifnull(m.perms,'') as perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time
+		from sys_tenant_menu tm
+		left join sys_menu m on tm.menu_id = m.menu_id
+		where m.menu_type in ('M', 'C') and m.status = 0 and tm.tenant_id = #{tenantId}
+		order by m.parent_id, m.order_num
+	</select>
 	
 	<select id="selectMenuListByUserId" parameterType="SysMenu" resultMap="SysMenuResult">
 		select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.`query`, m.visible, m.status, ifnull(m.perms,'') as perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time

+ 13 - 1
ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -7,8 +7,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <resultMap type="SysUser" id="SysUserResult">
         <id     property="userId"       column="user_id"      />
         <result property="deptId"       column="dept_id"      />
+		<result property="tenantId"     column="tenant_id"    />
         <result property="userName"     column="user_name"    />
         <result property="nickName"     column="nick_name"    />
+		<result property="userType"     column="user_type"    />
         <result property="email"        column="email"        />
         <result property="phonenumber"  column="phonenumber"  />
         <result property="sex"          column="sex"          />
@@ -24,6 +26,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="updateTime"   column="update_time"  />
         <result property="remark"       column="remark"       />
         <association property="dept"    column="dept_id" javaType="SysDept" resultMap="deptResult" />
+		<association property="tenant"  column="tenant_id" javaType="SysTenant" resultMap="tenantResult" />
         <collection  property="roles"   javaType="java.util.List"           resultMap="RoleResult" />
     </resultMap>
 	
@@ -36,6 +39,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="leader"    column="leader"      />
         <result property="status"    column="dept_status" />
     </resultMap>
+
+	<resultMap id="tenantResult" type="SysTenant">
+		<id     property="tenantId"    column="tenant_id"     />
+		<result property="tenantName"  column="tenant_name"   />
+		<result property="tenantCode" column="tenant_code"   />
+		<result property="owner"  column="owner"   />
+	</resultMap>
 	
     <resultMap id="RoleResult" type="SysRole">
         <id     property="roleId"       column="role_id"        />
@@ -47,11 +57,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </resultMap>
 	
 	<sql id="selectUserVo">
-        select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, 
+        select u.user_id, u.dept_id, u.user_name, u.nick_name, u.user_type, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
         d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status,
+		te.tenant_id, te.tenant_name, te.tenant_code, te.owner,
         r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status
         from sys_user u
 		    left join sys_dept d on u.dept_id = d.dept_id
+		    left join sys_tenant te on u.tenant_id = te.tenant_id
 		    left join sys_user_role ur on u.user_id = ur.user_id
 		    left join sys_role r on r.role_id = ur.role_id
     </sql>