Browse Source

feat 权限部分接口

classic_blue 1 month ago
parent
commit
820230c2cf
24 changed files with 782 additions and 46 deletions
  1. 24 0
      edu-travel-common/edu-travel-common-core/pom.xml
  2. 57 0
      edu-travel-common/edu-travel-common-core/src/main/java/edu/travel/emun/ResponseCode.java
  3. 21 0
      edu-travel-common/edu-travel-common-core/src/main/java/edu/travel/emun/StatusCode.java
  4. 59 0
      edu-travel-common/edu-travel-common-core/src/main/java/edu/travel/exception/BaseException.java
  5. 31 0
      edu-travel-common/edu-travel-common-core/src/main/java/edu/travel/model/PageDto.java
  6. 1 0
      edu-travel-common/edu-travel-common-resp/src/main/java/edu/travel/resp/BaseResponse.java
  7. 1 0
      edu-travel-common/edu-travel-common-resp/src/main/java/edu/travel/resp/PageResponse.java
  8. 0 1
      edu-travel-oauth/src/main/java/edu/travel/service/impl/SysRoleServiceImpl.java
  9. 1 1
      edu-travel-oauth/src/main/java/edu/travel/service/impl/UserServiceImpl.java
  10. 6 0
      edu-travel-service/edu-travel-service-tenement/pom.xml
  11. 27 0
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/dto/AssignRolesOrMenus.java
  12. 84 0
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/dto/EduTenantPageDto.java
  13. 57 0
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/dto/SysMenuPageDto.java
  14. 2 2
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/dto/SysRolePageDto.java
  15. 39 0
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/exception/GlobalExceptionHandler.java
  16. 8 0
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/service/ISysMenuService.java
  17. 3 0
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/service/ISysRoleService.java
  18. 11 4
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/service/ITenantService.java
  19. 45 1
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/service/impl/ISysMenuServiceImpl.java
  20. 33 0
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/service/impl/ISysRoleServiceImpl.java
  21. 85 10
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/service/impl/ITenantServiceImpl.java
  22. 70 2
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/web/SysMenuController.java
  23. 27 2
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/web/SysRoleController.java
  24. 90 23
      edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/web/TenantController.java

+ 24 - 0
edu-travel-common/edu-travel-common-core/pom.xml

@@ -35,5 +35,29 @@
             <artifactId>edu-travel-common-resp</artifactId>
             <version>1.0-SNAPSHOT</version>
         </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>jakarta.validation</groupId>
+            <artifactId>jakarta.validation-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.jaxb</groupId>
+            <artifactId>jaxb-runtime</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid</artifactId>
+            <version>1.2.6</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid</artifactId>
+            <version>1.2.6</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 </project>

+ 57 - 0
edu-travel-common/edu-travel-common-core/src/main/java/edu/travel/emun/ResponseCode.java

@@ -0,0 +1,57 @@
+package edu.travel.emun;
+
+/**
+ * ResponseCode 类。
+ * <p>
+ * 描述:
+ *
+ * @author huangwenwen
+ * @date 2025/2/11
+ */
+public enum ResponseCode implements StatusCode {
+    /**
+     * 成功
+     */
+    SUCCESS(200, "操作成功"),
+    /**
+     * 失败
+     */
+    ERROR(500, "服务端错误。"),
+    /**
+     * 业务逻辑错误
+     */
+    LOGIC_ERROR(400, "业务逻辑错误"),
+    /**
+     * 需要登录
+     */
+    LOGIN_ERROR(401, "账号登录过期,请重新登录!"),
+
+    /**
+     * 需要登录
+     */
+    NO_PERMISSION(400, "没有接口访问权限");
+
+
+    private final Integer code;
+    private String message;
+
+    ResponseCode(Integer code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    @Override
+    public Integer getCode() {
+        return code;
+    }
+
+    @Override
+    public String getMessage() {
+        return message;
+    }
+
+    public ResponseCode setMessage(String message) {
+        this.message = message;
+        return this;
+    }
+}

+ 21 - 0
edu-travel-common/edu-travel-common-core/src/main/java/edu/travel/emun/StatusCode.java

@@ -0,0 +1,21 @@
+package edu.travel.emun;
+
+/**
+ * StatusCode 类。
+ * <p>
+ * 描述:
+ *
+ * @author huangwenwen
+ * @date 2025/2/11
+ */
+public interface StatusCode {
+    /**
+     * 获取code
+     */
+    Integer getCode();
+
+    /**
+     * 获取信息
+     */
+    String getMessage();
+}

+ 59 - 0
edu-travel-common/edu-travel-common-core/src/main/java/edu/travel/exception/BaseException.java

@@ -0,0 +1,59 @@
+package edu.travel.exception;
+
+import edu.travel.emun.ResponseCode;
+
+/**
+ * BaseException 类。
+ * <p>
+ * 描述:
+ *
+ * @author huangwenwen
+ * @date 2025/2/11
+ */
+
+
+public class BaseException extends RuntimeException {
+
+    private static final long serialVersionUID = -8458116729669426482L;
+
+    private Integer code;
+
+
+    public BaseException() {
+        super();
+    }
+
+    public BaseException(String message) {
+        super(message);
+    }
+
+    public BaseException(Integer code, String message, Throwable cause,
+                         boolean enableSuppression, boolean writableStackTrace) {
+        super(message, cause, enableSuppression, writableStackTrace);
+        this.code = code;
+    }
+
+    public BaseException(Integer code, String message, Throwable cause) {
+        super(message, cause);
+        this.code = code;
+    }
+
+    public BaseException(ResponseCode responseCode) {
+        super(responseCode.getMessage());
+        this.code = responseCode.getCode();
+    }
+
+    public BaseException(Integer code, String message) {
+        super(message);
+        this.code = code;
+    }
+
+    public BaseException(Throwable cause) {
+        super(cause);
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+}

+ 31 - 0
edu-travel-common/edu-travel-common-core/src/main/java/edu/travel/model/PageDto.java

@@ -0,0 +1,31 @@
+package edu.travel.model;
+
+import com.alibaba.druid.sql.repository.Schema;
+import com.sun.istack.internal.NotNull;
+import lombok.Data;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import java.io.Serializable;
+
+/**
+ * PageDto 类。
+ * <p>
+ * 描述:分页参数
+ *
+ * @author huangwenwen
+ * @date 2025/2/10
+ */
+
+@Data
+public class PageDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+//    @NotNull(message = "当前页码不能为空")
+    @Min(value = 1, message = "最小值为1")
+    private Integer pageNum = 1;
+//    @NotNull(message = "每页显示条数不能为空")
+    @Min(value = 1, message = "最小值为1")
+    @Max(value = 100, message = "最大值为100")
+    private Integer pageSize = 10;
+}

+ 1 - 0
edu-travel-common/edu-travel-common-resp/src/main/java/edu/travel/resp/BaseResponse.java

@@ -16,4 +16,5 @@ public class BaseResponse<T> implements Serializable {
     private String msg;
 
     private T data;
+
 }

+ 1 - 0
edu-travel-common/edu-travel-common-resp/src/main/java/edu/travel/resp/PageResponse.java

@@ -20,6 +20,7 @@ public class PageResponse extends BaseResponse {
         this.total = total;
         this.size = size;
     }
+
     public static <R> BaseResponse<R> out(Integer code,String msg,R data,int total, int size){
         return new PageResponse(code,msg,data,total,size);
     }

+ 0 - 1
edu-travel-oauth/src/main/java/edu/travel/service/impl/SysRoleServiceImpl.java

@@ -28,7 +28,6 @@ import java.util.stream.Collectors;
 
 @Service
 public class SysRoleServiceImpl extends SysServiceImpl<SysRoleMapper, SysRole> implements SysRoleService {
-//public class SysRoleServiceImpl extends SysServiceImpl<SysRoleMapper, SysRole> implements GrantedAuthority {
 
 
     @Autowired

+ 1 - 1
edu-travel-oauth/src/main/java/edu/travel/service/impl/UserServiceImpl.java

@@ -46,7 +46,7 @@ public class UserServiceImpl implements UserDetailsService {
             if (StringUtils.isBlank(code)) {
                 throw new UsernameNotFoundException("验证码为空");
             }
-            Object object = "1234";//redisTemplate.opsForValue().get("code_" + username);
+            Object object = "1234";//redisTemplate.opsForValue().get(username+"_user_sms");
             if (object == null) {
                 throw new UsernameNotFoundException("验证码为空");
             }

+ 6 - 0
edu-travel-service/edu-travel-service-tenement/pom.xml

@@ -125,6 +125,12 @@
             <artifactId>edu-travel-common-cache</artifactId>
             <version>1.0-SNAPSHOT</version>
         </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid</artifactId>
+            <version>1.2.6</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
     <profiles>
         <profile>

+ 27 - 0
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/dto/AssignRolesOrMenus.java

@@ -0,0 +1,27 @@
+package edu.travel.tenant.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * AssignRoles 类。
+ * <p>
+ * 描述:为管理用户分配角色
+ *
+ * @author huangwenwen
+ * @date 2025/2/10
+ */
+
+
+@Data
+public class AssignRolesOrMenus {
+    /**
+     * 角色ids/菜单ids
+     */
+    private List<Long> ids;
+    /**
+     * 用户id/角色id
+     */
+    private Long id;
+}

+ 84 - 0
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/dto/EduTenantPageDto.java

@@ -0,0 +1,84 @@
+package edu.travel.tenant.dto;
+
+import edu.travel.model.PageDto;
+
+import java.util.Date;
+
+/**
+ * EduTenantDto 类。
+ * <p>
+ * 描述:
+ *
+ * @author huangwenwen
+ * @date 2025/2/10
+ */
+
+
+public class EduTenantPageDto extends PageDto {
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 姓
+     */
+    private String tenantSurname;
+
+    /**
+     * 名
+     */
+    private String tenantName;
+
+    /**
+     * 性别 01
+     */
+    private Integer tenantSex;
+
+    /**
+     * 头像
+     */
+    private String tenantAvatar;
+
+    /**
+     * 手机号
+     */
+    private String tenantPhone;
+
+    /**
+     * 密码
+     */
+    private String password;
+
+    /**
+     * 地区区号
+     */
+    private String tenantArea;
+
+    /**
+     * 生日日期
+     */
+    private Date tenantBirthday;
+
+    /**
+     * 微信小程序openid
+     */
+    private String tenantOpenId;
+
+    /**
+     * 微信小程序unionid
+     */
+    private String tenantUnionid;
+
+    /**
+     * 现实名
+     */
+    private String showName;
+
+    /**
+     * 用户状态
+     */
+    private Integer userStatus;
+
+}

+ 57 - 0
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/dto/SysMenuPageDto.java

@@ -0,0 +1,57 @@
+package edu.travel.tenant.dto;
+import edu.travel.model.PageDto;
+
+/**
+ * SysRolePageDto 类。
+ * <p>
+ * 描述:
+ *
+ * @author huangwenwen
+ * @date 2025/2/11
+ */
+
+
+public class SysMenuPageDto extends PageDto {
+
+
+
+    /**
+     * 主键id
+     */
+    private Long id;
+
+    /**
+     * 父菜单id,目录菜单的父菜单为null
+     */
+    private Long parentId;
+
+    /**
+     * 前端表单路由名称,仅用于menu_type为1的菜单类型
+     */
+    private String title;
+
+    /**
+     * (0: 目录 1: 菜单 2: 按钮 )
+     */
+    private Integer type;
+
+    /**
+     * 组件路径
+     */
+    private String component;
+
+    /**
+     * 页面路由
+     */
+    private String path;
+
+    /**
+     * 组件名称
+     */
+    private String name;
+
+    /**
+     * 菜单状态 0禁用1启用
+     */
+    private Byte status;
+}

+ 2 - 2
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/dto/SysRoleDto.java → edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/dto/SysRolePageDto.java

@@ -3,7 +3,7 @@ package edu.travel.tenant.dto;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
-import edu.travel.entity.BaseEntity;
+import edu.travel.model.PageDto;
 import lombok.Data;
 
 /**
@@ -16,7 +16,7 @@ import lombok.Data;
  */
 
 @Data
-public class SysRoleDto extends BaseEntity {
+public class SysRolePageDto extends PageDto {
     /**
      * 主键id
      */

+ 39 - 0
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/exception/GlobalExceptionHandler.java

@@ -0,0 +1,39 @@
+package edu.travel.tenant.exception;
+
+import edu.travel.emun.ResponseCode;
+import edu.travel.exception.BaseException;
+import edu.travel.resp.BaseResponse;
+import edu.travel.resp.PageResponse;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+
+/**
+ * GlobalExceptionHandler 类。
+ * <p>
+ * 描述:
+ *
+ * @author huangwenwen
+ * @date 2025/2/11
+ */
+
+
+public class GlobalExceptionHandler {
+
+    @ExceptionHandler(BaseException.class)
+    public BaseResponse<Object> handleUserInfoException(BaseException e){
+        e.printStackTrace();
+        return  PageResponse.out(e.getCode(),e.getMessage(),null);
+    }
+
+    @ExceptionHandler(IllegalAccessException.class)
+    public BaseResponse<Object> handleException(IllegalAccessException e){
+        e.printStackTrace();
+        return PageResponse.out(ResponseCode.LOGIC_ERROR.getCode(), e.getMessage(),null);
+    }
+
+    @ExceptionHandler(Throwable.class)
+    public BaseResponse<Object> handleException(Exception e){
+                e.printStackTrace();
+        return PageResponse.out(ResponseCode.ERROR.getCode(),e.getMessage(),null);
+    }
+
+}

+ 8 - 0
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/service/ISysMenuService.java

@@ -1,8 +1,16 @@
 package edu.travel.tenant.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import edu.travel.tenant.dto.AssignRolesOrMenus;
 import edu.travel.tenant.entity.SysMenu;
 
+import java.util.List;
+
 public interface ISysMenuService extends IService<SysMenu> {
 
+    void addMenu(SysMenu sysMenu);
+
+    void deleteMenuByIds(List<Long> ids);
+
+
 }

+ 3 - 0
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/service/ISysRoleService.java

@@ -2,6 +2,7 @@ package edu.travel.tenant.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import edu.travel.resp.BaseResponse;
+import edu.travel.tenant.dto.AssignRolesOrMenus;
 import edu.travel.tenant.entity.EduTenant;
 import edu.travel.tenant.entity.SysRole;
 
@@ -20,4 +21,6 @@ public interface ISysRoleService extends IService<SysRole> {
     void deleteById(Long id);
 
     List<SysRole> getRoleByUserId(Long userId);
+
+    void assignMenusToRole(AssignRolesOrMenus dto);
 }

+ 11 - 4
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/service/ITenantService.java

@@ -1,21 +1,28 @@
 package edu.travel.tenant.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import edu.travel.tenant.dto.AssignRolesOrMenus;
 import edu.travel.tenant.entity.EduTenant;
-import edu.travel.tenant.vo.EduTenantVo;
+import edu.travel.tenant.entity.SysMenu;
+import edu.travel.tenant.entity.SysRole;
 
 import java.util.List;
-import java.util.Set;
 
 public interface ITenantService extends IService<EduTenant> {
-    public EduTenant getTenantByID(String tenantID);
+    public EduTenant getTenantByPhoneNumber(String tenantID);
 
     void addTenant(EduTenant tenant);
 
-    void deleteByIds(Set<Long> ids);
+    void deleteByIds(List<Long> ids);
 
     void updateTenant(EduTenant tenant);
 
 
     EduTenant getTenantById(Long id);
+
+    List<SysMenu> getMenuList(EduTenant principal);
+
+    List<SysRole> getRoleListByUserId(EduTenant principal);
+
+    void assignRolesToUser(AssignRolesOrMenus assignRolesOrMenus);
 }

+ 45 - 1
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/service/impl/ISysMenuServiceImpl.java

@@ -1,11 +1,20 @@
 package edu.travel.tenant.service.impl;
 
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.ObjectUtil;
 import edu.travel.service.SysServiceImpl;
+import edu.travel.tenant.dto.AssignRolesOrMenus;
+import edu.travel.tenant.entity.EduTenant;
 import edu.travel.tenant.entity.SysMenu;
 import edu.travel.tenant.mapper.SysMenuMapper;
-import edu.travel.tenant.service.ISysMenuService;
+import edu.travel.tenant.service.*;
+import org.checkerframework.checker.units.qual.A;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.HashSet;
+import java.util.List;
+
 /**
  * ISysRoleServiceImpl 类。
  * <p>
@@ -18,4 +27,39 @@ import org.springframework.stereotype.Service;
 @Service
 public class ISysMenuServiceImpl extends SysServiceImpl<SysMenuMapper, SysMenu> implements ISysMenuService {
 
+    @Autowired
+    private ISysUserRoleService sysUserRoleService;
+    @Autowired
+    private ISysRoleMenuService sysRoleMenuService;
+    @Autowired
+    private ISysMenuService sysMenuService;
+    @Autowired
+    private ISysRoleService sysRoleService;
+    @Autowired
+    private ITenantService tenantService;
+
+    @Override
+    public void addMenu(SysMenu sysMenu) {
+        //参数校验
+        Assert.isTrue(ObjectUtil.isNotEmpty(sysMenu),"参数不能为空");
+        Assert.isTrue(ObjectUtil.isNotEmpty(sysMenu.getPath()),"页面路由不能为空");
+        Assert.isTrue(ObjectUtil.isNotEmpty(sysMenu.getComponent()),"组件路径不能为空");
+        //保存菜单
+        super.save(sysMenu);
+    }
+
+    @Override
+    public void deleteMenuByIds(List<Long> ids) {
+        //参数校验
+        Assert.isTrue(ObjectUtil.isNotEmpty(ids),"请选择想要删除的菜单");
+        List<SysMenu> sysMenus = super.listByIds(ids);
+        Assert.isTrue(ObjectUtil.isNotEmpty(sysMenus),"选择的菜单不存在或已删除");
+        Assert.isTrue(sysMenus.size() == ids.size(),"包含重复的菜单或已删除菜单");
+        sysMenus.forEach(sysMenu -> {
+            sysMenu.setDeleteFlag(1);
+        });
+        this.updateBatchById(sysMenus);
+    }
+
+
 }

+ 33 - 0
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/service/impl/ISysRoleServiceImpl.java

@@ -1,6 +1,12 @@
 package edu.travel.tenant.service.impl;
 
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import edu.travel.tenant.dto.AssignRolesOrMenus;
+import edu.travel.tenant.entity.SysMenu;
+import edu.travel.tenant.entity.SysRoleMenu;
+import edu.travel.tenant.service.ISysRoleMenuService;
 import edu.travel.tenant.service.ITenantService;
 import org.apache.commons.lang3.StringUtils;
 import edu.travel.tenant.entity.EduTenant;
@@ -13,6 +19,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * ISysRoleServiceImpl 类。
@@ -28,6 +35,10 @@ public class ISysRoleServiceImpl extends SysServiceImpl<SysRoleMapper, SysRole>
 
     @Autowired
     private ITenantService tenantService;
+    @Autowired
+    private ISysRoleMenuService iSysRoleMenuService;
+    @Autowired
+    private ISysRoleServiceImpl sysRoleService;
 
     @Override
     @Transactional
@@ -88,4 +99,26 @@ public class ISysRoleServiceImpl extends SysServiceImpl<SysRoleMapper, SysRole>
 
         return null;
     }
+
+    @Override
+    public void assignMenusToRole(AssignRolesOrMenus dto) {
+        Assert.isTrue(ObjectUtil.isNotEmpty(dto),"参数不能为空");
+        Assert.isTrue(ObjectUtil.isNotEmpty(dto.getId()),"请选择需分配菜单的角色");
+        Assert.isTrue(ObjectUtil.isNotEmpty(dto.getIds()),"请选择菜单");
+        HashSet<Long> longs = new HashSet<>(dto.getIds());
+        Assert.isTrue(longs.size()== dto.getIds().size(),"包含重复的菜单");
+        //查询角色
+        SysRole sysRole = sysRoleService.getById(dto.getId());
+        Assert.isTrue(ObjectUtil.isNotEmpty(sysRole),"所选角色不存在");
+        //查询菜单列表
+        List<SysRole> sysMenuList = super.listByIds(dto.getIds());
+        Assert.isTrue(sysMenuList!=null&&sysMenuList.size()== dto.getIds().size(),"包含重复的菜单或菜单不存在");
+        //给用户分配菜单
+        iSysRoleMenuService.saveOrUpdateBatch(dto.getIds().stream().map(menuId -> {
+            SysRoleMenu sysRoleMenu = new SysRoleMenu();
+            sysRoleMenu.setRoleId(dto.getId());
+            sysRoleMenu.setMenuId(menuId);
+            return sysRoleMenu;
+        }).collect(Collectors.toList()));
+    }
 }

+ 85 - 10
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/service/impl/ITenantServiceImpl.java

@@ -1,27 +1,37 @@
 package edu.travel.tenant.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import edu.travel.tenant.entity.EduTenant;
+import edu.travel.tenant.dto.AssignRolesOrMenus;
+import edu.travel.tenant.entity.*;
 import edu.travel.tenant.enums.UserStatus;
-import edu.travel.tenant.service.ITenantService;
+import edu.travel.tenant.service.*;
 import edu.travel.service.SysServiceImpl;
 import edu.travel.tenant.mapper.EduTenantMapper;
 import edu.travel.tenant.vo.EduTenantVo;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Service
 public class ITenantServiceImpl extends SysServiceImpl<EduTenantMapper, EduTenant> implements ITenantService {
+
+    @Autowired
+    private ISysUserRoleService sysUserRoleService;
+    @Autowired
+    private ISysRoleMenuService sysRoleMenuService;
+    @Autowired
+    private ISysMenuService sysMenuService;
+    @Autowired
+    private ISysRoleService sysRoleService;
     @Override
-    public EduTenant getTenantByID(String tenantID) {
+    public EduTenant getTenantByPhoneNumber(String tenantID) {
         return super.getOneLink(new QueryWrapper<EduTenant>().eq("tenant_phone",tenantID));
     }
 
@@ -48,11 +58,12 @@ public class ITenantServiceImpl extends SysServiceImpl<EduTenantMapper, EduTenan
 
     @Override
     @Transactional
-    public void deleteByIds(Set<Long> ids) {
-        if (ids==null || ids.isEmpty()) {
+    public void deleteByIds(List<Long> ids) {
+        HashSet<Long> set = new HashSet<>(ids);
+        if (set==null || set.isEmpty()) {
             throw new RuntimeException("参数为空");
         }
-        List<EduTenant> tenants = this.listByIds(ids);
+        List<EduTenant> tenants = this.listByIds(set);
         if (tenants == null || tenants.isEmpty()) {
             throw new RuntimeException("用户不存在或已注销");
         }
@@ -93,6 +104,70 @@ public class ITenantServiceImpl extends SysServiceImpl<EduTenantMapper, EduTenan
                 .eq(EduTenant::getUserStatus,1));
     }
 
+    @Override
+    public List<SysMenu> getMenuList(EduTenant principal) {
+
+        if (principal ==null) throw new RuntimeException("用户未登录");
+        EduTenant tenant = this.getTenantById(principal.getId());
+        if (tenant == null) throw new RuntimeException("用户不存在");
+        if (tenant.getUserStatus() == 0) throw new RuntimeException("用户已禁用");
+        if (tenant.getDeleteFlag() == 1) throw new RuntimeException("用户已注销");
+        if (tenant.getId() != null) {
+            //用户角色列表
+            List<Long> roleIdList = sysUserRoleService.getBaseMapper().selectList(new LambdaQueryWrapper<SysUserRole>()
+                            .eq(SysUserRole::getId, tenant.getId())).stream()
+                    .map(SysUserRole::getRoleId)
+                    .collect(Collectors.toList());
+            if (roleIdList.isEmpty()) return null;
+            //菜单列表
+            Set<Long> menuIdList = sysRoleMenuService.getBaseMapper().selectList(new LambdaQueryWrapper<SysRoleMenu>()
+                            .in(SysRoleMenu::getRoleId, roleIdList)).stream()
+                    .map(SysRoleMenu::getMenuId)
+                    .collect(Collectors.toSet());
+            //菜单列表内容
+            List<SysMenu> list = sysMenuService.list(new LambdaQueryWrapper<SysMenu>()
+                    .eq(SysMenu::getDeleteFlag, 0)
+                    .eq(SysMenu::getStatus, 1)
+                    .in(SysMenu::getId, menuIdList));
+            return list;
+        }
+        return null;
+    }
+
+    @Override
+    public List<SysRole> getRoleListByUserId(EduTenant principal) {
+        if (principal ==null) throw new RuntimeException("用户未登录");
+        if (principal.getId() == null)  throw new RuntimeException("用户不存在");
+        //用户角色列表id
+        List<Long> roleIdList = sysUserRoleService.getBaseMapper().selectList(new LambdaQueryWrapper<SysUserRole>()
+                        .eq(SysUserRole::getId, principal.getId())).stream()
+                .map(SysUserRole::getRoleId)
+                .collect(Collectors.toList());
+        if (roleIdList.isEmpty()) return null;
+        //角色列表内容
+        List<SysRole> list = sysRoleService.list(new LambdaQueryWrapper<SysRole>()
+                .in(SysRole::getId, roleIdList)
+                .eq(SysRole::getDeleteFlag, 0));
+        return list;
+    }
+
+    @Override
+    public void assignRolesToUser(AssignRolesOrMenus assignRolesOrMenus) {
+        Assert.isTrue(ObjectUtil.isNotEmpty(assignRolesOrMenus),"请登录");
+        Assert.isTrue(ObjectUtil.isNotEmpty(assignRolesOrMenus.getId()),"请选择需分配角色的用户");
+        Assert.isTrue(ObjectUtil.isNotEmpty(assignRolesOrMenus.getIds()),"请选择角色");
+        List<SysRole> roleList = sysRoleService.listByIds(assignRolesOrMenus.getIds());
+        Assert.isTrue(ObjectUtil.isNotEmpty(roleList),"选择的角色不存在");
+        Assert.isTrue(roleList.size() == assignRolesOrMenus.getIds().size(),"包含重复的角色或不存在的角色");
+        //分配角色
+        sysUserRoleService.saveOrUpdateBatch(assignRolesOrMenus.getIds().stream().map(roleId -> {
+            SysUserRole sysUserRole = new SysUserRole();
+            sysUserRole.setUserId(assignRolesOrMenus.getId());
+            sysUserRole.setRoleId(roleId);
+            return sysUserRole;
+        }).collect(Collectors.toList()));
+    }
+
     /**
      *
      * 填充用户状态

+ 70 - 2
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/web/SysMenuController.java

@@ -1,11 +1,23 @@
 package edu.travel.tenant.web;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import edu.travel.resp.BaseResponse;
+import edu.travel.resp.PageResponse;
+import edu.travel.tenant.dto.AssignRolesOrMenus;
+import edu.travel.tenant.dto.SysMenuPageDto;
+import edu.travel.tenant.entity.EduTenant;
 import edu.travel.tenant.entity.SysMenu;
+import edu.travel.tenant.service.ISysMenuService;
+import edu.travel.tenant.service.ISysRoleService;
 import edu.travel.web.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.Errors;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * SysMenuController 类。
@@ -19,6 +31,62 @@ import org.springframework.web.bind.annotation.RestController;
 @RestController
 @RequestMapping("/sysMenu")
 public class SysMenuController extends BaseController<SysMenu> {
+    @Autowired
+    private ISysMenuService sysMenuService;
+
+    /**
+     * 新增菜单
+     * @param sysMenu
+     * @return
+     */
+    @PostMapping("/addMenu")
+//    @PreAuthorize("hasRole('超级管理员')")
+    public BaseResponse<Boolean> addMenu(@RequestBody SysMenu sysMenu) {
+        sysMenuService.addMenu(sysMenu);
+        return new BaseResponse<>(200,"sucess",true);
+    }
+
+    /**
+     * 删除菜单单个
+     * @param id
+     * @return
+     */
+
+    @PostMapping("/deleteMenuById")
+    //    @PreAuthorize("hasRole('超级管理员')")
+    public BaseResponse<Boolean> deleteMenuById(Long id) {
+        List<Long> longs = new ArrayList<>();
+        longs.add(id);
+        sysMenuService.deleteMenuByIds(longs);
+        return new BaseResponse<>(200,"sucess",true);
+    }
+
+    /**
+     * 删除菜单多个
+     * @param ids
+     * @return
+     */
+    @PostMapping("/deleteMenuByIds")
+    //    @PreAuthorize("hasRole('超级管理员')")
+    public BaseResponse<Boolean> deleteMenuByIds(@RequestBody List<Long> ids) {
+        sysMenuService.deleteMenuByIds(ids);
+        return new BaseResponse<>(200,"sucess",true);
+    }
+
+    /**
+     * 获取菜单分页列表
+     * @param sysMenuPageDto
+     * @return
+     */
+
+    @GetMapping("/getMenuList")
+//    @PreAuthorize("hasRole('超级管理员')")
+    public BaseResponse<List<SysMenu>> getMenuList(SysMenuPageDto sysMenuPageDto) {
+        IPage<SysMenu> page = new Page<>(sysMenuPageDto.getPageNum(), sysMenuPageDto.getPageSize());
+        IPage<SysMenu> tenantIPage = sysMenuService.page(page, new LambdaQueryWrapper<SysMenu>().eq(SysMenu::getDeleteFlag, 0));
+        return PageResponse.out(200,"success",tenantIPage.getRecords(),(int)tenantIPage.getTotal(),(int)tenantIPage.getSize());
+    }
+
 
 
 }

+ 27 - 2
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/web/SysRoleController.java

@@ -1,6 +1,13 @@
 package edu.travel.tenant.web;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import edu.travel.interfaces.InsertGroups;
 import edu.travel.resp.BaseResponse;
+import edu.travel.resp.PageResponse;
+import edu.travel.tenant.dto.AssignRolesOrMenus;
+import edu.travel.tenant.dto.EduTenantPageDto;
+import edu.travel.tenant.dto.SysRolePageDto;
 import edu.travel.tenant.entity.EduTenant;
 import edu.travel.tenant.entity.SysRole;
 import edu.travel.tenant.service.ISysRoleService;
@@ -37,7 +44,7 @@ public class SysRoleController extends BaseController<SysRole> {
      */
     @PostMapping("/addRole")
 //    @PreAuthorize("hasRole('超级管理员')")
-    public BaseResponse<Boolean> addRole(@Validated(InsertGroups.class) @RequestBody SysRole sysRole) {
+    public BaseResponse<Boolean> addRole( @RequestBody SysRole sysRole) {
         EduTenant principal = (EduTenant) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
         sysRoleService.add(sysRole,principal);
         return new BaseResponse<>(200,"success",true) ;
@@ -74,7 +81,7 @@ public class SysRoleController extends BaseController<SysRole> {
     }
 
     /**
-     * 查询用户角色
+     * 根据用户id查询用户角色
      */
     @GetMapping("/getRoleByUserId")
     public BaseResponse<List<SysRole>> getRoleByUserId(Long userId) {
@@ -82,5 +89,23 @@ public class SysRoleController extends BaseController<SysRole> {
         return new BaseResponse<>(200,"success",sysRoles) ;
     }
 
+    /**
+     * 为角色分配菜单
+     * @param dto
+     * @return
+     */
+    @PostMapping("/assignMenusToRole")
+//    @PreAuthorize("hasRole('超级管理员')")
+    public BaseResponse<Boolean> assignMenusToRole(@RequestBody AssignRolesOrMenus dto) {
+        sysRoleService.assignMenusToRole(dto);
+        return new BaseResponse<>(200,"sucess",true);
+    }
 
+    @GetMapping("/getRolePageList")
+//    @PreAuthorize("hasRole('超级管理员')")
+    public BaseResponse<List<SysRole>> getRolePageList(SysRolePageDto sysRolePageDto) {
+            IPage<SysRole> page = new Page<>(sysRolePageDto.getPageNum(), sysRolePageDto.getPageSize());
+            IPage<SysRole> tenantIPage = sysRoleService.page(page, new LambdaQueryWrapper<SysRole>().eq(SysRole::getDeleteFlag, 0));
+            return PageResponse.out(200, "success", tenantIPage.getRecords(), (int) tenantIPage.getTotal(), (int) tenantIPage.getSize());
+        }
 }

+ 90 - 23
edu-travel-service/edu-travel-service-tenement/src/main/java/edu/travel/tenant/web/TenantController.java

@@ -1,23 +1,22 @@
 package edu.travel.tenant.web;
 
-import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import edu.travel.resp.BaseResponse;
 import edu.travel.resp.PageResponse;
+import edu.travel.tenant.dto.AssignRolesOrMenus;
+import edu.travel.tenant.dto.EduTenantPageDto;
 import edu.travel.tenant.entity.EduTenant;
+import edu.travel.tenant.entity.SysMenu;
 import edu.travel.tenant.entity.SysRole;
 import edu.travel.tenant.service.ITenantService;
-import edu.travel.tenant.vo.EduTenantVo;
 import edu.travel.web.BaseController;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
-import java.util.Set;
 
 @RestController
 @RequestMapping("/tenant")
@@ -25,43 +24,111 @@ public class TenantController  extends BaseController<EduTenant> {
     @Autowired
     private ITenantService tenantService;
 
-    @GetMapping("/getTenant")
-    public BaseResponse getTenant() {
+    @GetMapping("/getTenantByPhoneNumber")
+//    @PreAuthorize("hasRole('超级管理员')")
+    public BaseResponse<EduTenant> getTenantByPhoneNumber() {
         EduTenant principal = (EduTenant)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
-        EduTenant list = tenantService.getTenantByID(principal.getTenantPhone());
+        EduTenant list = tenantService.getTenantByPhoneNumber(principal.getTenantPhone());
         return PageResponse.out(200,"success",list);
     }
 
+    /**
+     * 新增用户
+     * @param tenant
+     * @return
+     */
     @PostMapping("/addTenant")
 //    @PreAuthorize("hasRole('超级管理员')")
-    public BaseResponse addTenant(EduTenant tenant) {
+    public BaseResponse<Boolean> addTenant(EduTenant tenant) {
         tenantService.addTenant(tenant);
-        return PageResponse.out(200,"success",tenant);
+        return PageResponse.out(200,"success",true);
     }
 
+    /**
+     * 通过ids删除用户
+     * @param ids
+     * @return
+     */
     @PostMapping("/deleteTenantByIds")
 //    @PreAuthorize("hasRole('超级管理员')")
-    public BaseResponse deleteTenant(Set<Long> ids) {
+    public BaseResponse<Boolean> deleteTenant(List<Long> ids) {
         tenantService.deleteByIds(ids);
-        return PageResponse.out(200,"success",ids);
+        return PageResponse.out(200,"success",true);
     }
 
+    /**
+     * 修改用户信息
+     * @param tenant
+     * @return
+     */
     @PostMapping("/updateTenantById")
 //    @PreAuthorize("hasRole('超级管理员')")
-    public BaseResponse updateTenant(EduTenant tenant) {
+    public BaseResponse<Boolean> updateTenant(EduTenant tenant) {
         tenantService.updateTenant(tenant);
-        return PageResponse.out(200,"success",tenant);
+        return PageResponse.out(200,"success",true);
     }
 
+    /**
+     * 通过id查询用户信息
+     * @param id
+     * @return
+     */
     @GetMapping("/getTenantById")
-    public BaseResponse getTenantById(Long id) {
+//    @PreAuthorize("hasRole('超级管理员')")
+    public BaseResponse<EduTenant> getTenantById(Long id) {
         EduTenant tenant = tenantService.getTenantById(id);
         return PageResponse.out(200,"success",tenant);
     }
 
-//    @GetMapping("/getMenuList")
-//    public BaseResponse getMenuList() {
-//        List<SysRole> menuList = tenantService.getMenuList();
-//        return PageResponse.out(200,"success",menuList);
-//    }
+    /**
+     * 获取用户分页列表
+     * @param tenantDto
+     * @return
+     */
+    @GetMapping("/getTenantPageList")
+//    @PreAuthorize("hasRole('超级管理员')")
+    public BaseResponse<List<EduTenant>> getTenantList(EduTenantPageDto tenantDto) {
+    IPage<EduTenant> page = new Page<>(tenantDto.getPageNum(), tenantDto.getPageSize());
+    IPage<EduTenant> tenantIPage = tenantService.page(page, new LambdaQueryWrapper<EduTenant>().eq(EduTenant::getDeleteFlag, 0));
+    return PageResponse.out(200,"success",tenantIPage.getRecords(),(int)tenantIPage.getTotal(),(int)tenantIPage.getSize()) ;
+    }
+
+    /**
+     * 根据用户id获取用户角色列表(未分页)
+     * @return
+     */
+    @GetMapping("/getRoleListByUserId")
+//    @PreAuthorize("hasRole('超级管理员')")
+    public BaseResponse<List<SysRole>> getRoleListByUserId() {
+        EduTenant principal = (EduTenant) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+        List<SysRole> roleList = tenantService.getRoleListByUserId(principal);
+        return PageResponse.out(200,"success",roleList);
+    }
+
+    /**
+     * 根据用户id获取用户菜单列表(未分页)
+     * @return
+     */
+    @GetMapping("/getMenuListByUserId")
+//    @PreAuthorize("hasRole('超级管理员')")
+    public BaseResponse<List<SysMenu>> getMenuList() {
+        EduTenant principal = (EduTenant) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+        List<SysMenu> menuList = tenantService.getMenuList(principal);
+        return PageResponse.out(200,"success",menuList);
+    }
+
+    /**
+     * 根据用户id给用户分配角色(可以多个角色)
+     * @param assignRolesOrMenus
+     * @return
+     */
+    @PostMapping("/assignRolesToUser")
+//    @PreAuthorize("hasRole('超级管理员')")
+    public BaseResponse<Boolean> assignRolesToUser(@RequestBody AssignRolesOrMenus assignRolesOrMenus) {
+        EduTenant principal = (EduTenant) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+        tenantService.assignRolesToUser(assignRolesOrMenus);
+        return PageResponse.out(200,"success",true);
+    }
+
+
 }