Browse Source

用户,菜单

lyhzzz 2 years ago
parent
commit
980f0f329e
67 changed files with 2965 additions and 27 deletions
  1. 25 0
      pom.xml
  2. 50 0
      src/main/java/com/fdkankan/sale/common/PageInfo.java
  3. 6 0
      src/main/java/com/fdkankan/sale/common/RedisKey.java
  4. 13 0
      src/main/java/com/fdkankan/sale/common/RedisKeyUtil.java
  5. 23 0
      src/main/java/com/fdkankan/sale/common/RequestBase.java
  6. 97 0
      src/main/java/com/fdkankan/sale/common/Result.java
  7. 44 0
      src/main/java/com/fdkankan/sale/common/ResultCode.java
  8. 64 0
      src/main/java/com/fdkankan/sale/common/ResultData.java
  9. 22 0
      src/main/java/com/fdkankan/sale/config/MybatisPlusPageConfig.java
  10. 34 0
      src/main/java/com/fdkankan/sale/config/WebAppConfig.java
  11. 35 0
      src/main/java/com/fdkankan/sale/controller/BaseController.java
  12. 0 21
      src/main/java/com/fdkankan/sale/controller/FaultController.java
  13. 76 0
      src/main/java/com/fdkankan/sale/controller/PartController.java
  14. 94 0
      src/main/java/com/fdkankan/sale/controller/SysMenuController.java
  15. 71 0
      src/main/java/com/fdkankan/sale/controller/SysRoleController.java
  16. 99 0
      src/main/java/com/fdkankan/sale/controller/SysUserController.java
  17. 33 0
      src/main/java/com/fdkankan/sale/controller/TestController.java
  18. 4 2
      src/main/java/com/fdkankan/sale/entity/Fault.java
  19. 82 0
      src/main/java/com/fdkankan/sale/entity/Part.java
  20. 78 0
      src/main/java/com/fdkankan/sale/entity/PartLog.java
  21. 105 0
      src/main/java/com/fdkankan/sale/entity/SysMenu.java
  22. 75 0
      src/main/java/com/fdkankan/sale/entity/SysRole.java
  23. 39 0
      src/main/java/com/fdkankan/sale/entity/SysRoleMenu.java
  24. 81 0
      src/main/java/com/fdkankan/sale/entity/SysUser.java
  25. 23 0
      src/main/java/com/fdkankan/sale/exception/BusinessException.java
  26. 49 0
      src/main/java/com/fdkankan/sale/exception/GlobalExceptionHandler.java
  27. 3 3
      src/main/java/com/fdkankan/sale/generate/AutoGenerate.java
  28. 31 0
      src/main/java/com/fdkankan/sale/httpClient/client/WxClient.java
  29. 108 0
      src/main/java/com/fdkankan/sale/interceptor/ControllerAopInterceptor.java
  30. 67 0
      src/main/java/com/fdkankan/sale/interceptor/TokenInterceptor.java
  31. 18 0
      src/main/java/com/fdkankan/sale/mapper/IPartLogMapper.java
  32. 18 0
      src/main/java/com/fdkankan/sale/mapper/IPartMapper.java
  33. 22 0
      src/main/java/com/fdkankan/sale/mapper/ISysMenuMapper.java
  34. 22 0
      src/main/java/com/fdkankan/sale/mapper/ISysRoleMapper.java
  35. 18 0
      src/main/java/com/fdkankan/sale/mapper/ISysRoleMenuMapper.java
  36. 27 0
      src/main/java/com/fdkankan/sale/mapper/ISysUserMapper.java
  37. 175 0
      src/main/java/com/fdkankan/sale/pay/wx/RSAUtil.java
  38. 14 0
      src/main/java/com/fdkankan/sale/pay/wx/WXPayDefaultConfig.java
  39. 57 0
      src/main/java/com/fdkankan/sale/pay/wx/WXUtil.java
  40. 22 0
      src/main/java/com/fdkankan/sale/service/IPartLogService.java
  41. 22 0
      src/main/java/com/fdkankan/sale/service/IPartService.java
  42. 40 0
      src/main/java/com/fdkankan/sale/service/ISysMenuService.java
  43. 27 0
      src/main/java/com/fdkankan/sale/service/ISysRoleMenuService.java
  44. 26 0
      src/main/java/com/fdkankan/sale/service/ISysRoleService.java
  45. 35 0
      src/main/java/com/fdkankan/sale/service/ISysUserService.java
  46. 44 0
      src/main/java/com/fdkankan/sale/service/impl/PartLogServiceImpl.java
  47. 75 0
      src/main/java/com/fdkankan/sale/service/impl/PartServiceImpl.java
  48. 237 0
      src/main/java/com/fdkankan/sale/service/impl/SysMenuServiceImpl.java
  49. 101 0
      src/main/java/com/fdkankan/sale/service/impl/SysRoleMenuServiceImpl.java
  50. 86 0
      src/main/java/com/fdkankan/sale/service/impl/SysRoleServiceImpl.java
  51. 152 0
      src/main/java/com/fdkankan/sale/service/impl/SysUserServiceImpl.java
  52. 11 0
      src/main/java/com/fdkankan/sale/vo/request/PartParam.java
  53. 11 0
      src/main/java/com/fdkankan/sale/vo/request/SysRoleMenuParam.java
  54. 14 0
      src/main/java/com/fdkankan/sale/vo/request/SysRoleParam.java
  55. 18 0
      src/main/java/com/fdkankan/sale/vo/request/SysUserParam.java
  56. 18 0
      src/main/java/com/fdkankan/sale/vo/response/ManageLoginResponse.java
  57. 14 0
      src/main/java/com/fdkankan/sale/vo/response/Meta.java
  58. 13 0
      src/main/java/com/fdkankan/sale/vo/response/SysMenuVo.java
  59. 10 0
      src/main/java/com/fdkankan/sale/vo/response/SysRoleVo.java
  60. 16 0
      src/main/java/com/fdkankan/sale/vo/response/SysUserVo.java
  61. 0 1
      src/main/resources/bootstrap-dev.yml
  62. 5 0
      src/main/resources/mapper/sale/PartLogMapper.xml
  63. 5 0
      src/main/resources/mapper/sale/PartMapper.xml
  64. 12 0
      src/main/resources/mapper/sale/SysMenuMapper.xml
  65. 16 0
      src/main/resources/mapper/sale/SysRoleMapper.xml
  66. 5 0
      src/main/resources/mapper/sale/SysRoleMenuMapper.xml
  67. 28 0
      src/main/resources/mapper/sale/SysUserMapper.xml

+ 25 - 0
pom.xml

@@ -21,6 +21,12 @@
 
         <dependency>
             <groupId>com.fdkankan</groupId>
+            <artifactId>4dkankan-common-utils</artifactId>
+            <version>3.0.0-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fdkankan</groupId>
             <artifactId>4dkankan-utils-redis</artifactId>
             <version>3.0.0-SNAPSHOT</version>
         </dependency>
@@ -87,6 +93,25 @@
             <artifactId>lombok</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>com.dtflys.forest</groupId>
+            <artifactId>forest-spring-boot-starter</artifactId>
+            <version>1.5.24</version>
+        </dependency>
+
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+            <version>0.9.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.auth0</groupId>
+            <artifactId>java-jwt</artifactId>
+            <version>3.10.3</version>
+        </dependency>
+
+
     </dependencies>
 
 

+ 50 - 0
src/main/java/com/fdkankan/sale/common/PageInfo.java

@@ -0,0 +1,50 @@
+package com.fdkankan.sale.common;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class PageInfo<T> {
+
+    private long pageNum;
+
+    private long pageSize;
+
+    private long total;
+
+    private T list;
+
+    public static PageInfo PageInfo(Page page){
+        return PageInfo.builder()
+            .pageNum(page.getCurrent())
+            .pageSize(page.getSize())
+            .total(page.getTotal())
+            .list(page.getRecords())
+            .build();
+    }
+    public static PageInfo PageInfo(Long currentPage, Long pageSize, Long total, List<?> list){
+        return PageInfo.builder()
+            .pageNum(currentPage)
+            .pageSize(pageSize)
+            .total(total)
+            .list(list)
+            .build();
+    }
+
+
+    public static PageInfo PageInfoEmpty(Integer pageNum,Integer pageSize) {
+        Page<Object> voPage = new Page<>(pageNum,pageSize);
+        voPage.setRecords(new ArrayList<>());
+        voPage.setTotal(0);
+        return PageInfo.PageInfo(voPage);
+    }
+}

+ 6 - 0
src/main/java/com/fdkankan/sale/common/RedisKey.java

@@ -0,0 +1,6 @@
+package com.fdkankan.sale.common;
+
+public class RedisKey {
+    public static final String manage_login_token= "manage:login:token:%s";
+
+}

+ 13 - 0
src/main/java/com/fdkankan/sale/common/RedisKeyUtil.java

@@ -0,0 +1,13 @@
+package com.fdkankan.sale.common;
+
+public class RedisKeyUtil {
+
+
+    public static final String SCENE_UNUSED_NUMS = "4dkankan:scene:nums";
+    public static final String SCENE_NUMS_LOADING = "4dkankan:scene:nums:loading";
+    public static final String loginNum= "manage:login:userName:%s:ip:%s";
+
+    public static final String loginToken= "manage:login:token:%s";
+
+
+}

+ 23 - 0
src/main/java/com/fdkankan/sale/common/RequestBase.java

@@ -0,0 +1,23 @@
+package com.fdkankan.sale.common;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class RequestBase implements Serializable {
+
+    private int pageNum = 1;
+
+    private int pageSize = 10;
+
+    private int start;
+
+    private String orderBy = "id";
+
+    /**
+     * DESC-降序
+     * ASC-升序
+     */
+    private String sortBy = "DESC";
+}

+ 97 - 0
src/main/java/com/fdkankan/sale/common/Result.java

@@ -0,0 +1,97 @@
+package com.fdkankan.sale.common;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 通用返回类
+ *
+ * @author
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class Result<T> implements Serializable {
+    private static final long serialVersionUID = -1491499610244557029L;
+    public static final String SUCCESS_MSG = "操作成功";
+    public static int CODE_SUCCESS = 0;
+    public static int CODE_FAILURE = -1;
+    public static String[] NOOP = new String[]{};
+
+    /**
+     * 处理状态:0: 成功, 1: 失败
+     */
+    private int code;
+    /**
+     * 消息
+     */
+    private String msg;
+    /**
+     * 返回数据
+     */
+    private T data;
+    /**
+     * 处理成功,并返回数据
+     *
+     * @param data 数据对象
+     * @return data
+     */
+    public static Result success(Object data) {
+        return new Result(CODE_SUCCESS, SUCCESS_MSG, data);
+    }
+    /**
+     * 处理成功
+     *
+     * @return data
+     */
+    public static Result success() {
+        return new Result(CODE_SUCCESS, SUCCESS_MSG, NOOP);
+    }
+    /**
+     * 处理成功
+     *
+     * @param msg 消息
+     * @return data
+     */
+    public static Result success(String msg) {
+        return new Result(CODE_SUCCESS, msg, NOOP);
+    }
+    /**
+     * 处理成功
+     *
+     * @param msg  消息
+     * @param data 数据对象
+     * @return data
+     */
+    public static Result success(String msg, Object data) {
+        return new Result(CODE_SUCCESS, msg, data);
+    }
+    /**
+     * 处理失败,并返回数据(一般为错误信息)
+     *
+     * @param code 错误代码
+     * @param msg  消息
+     * @return data
+     */
+    public static Result failure(int code, String msg) {
+        return new Result(code, msg, NOOP);
+    }
+    /**
+     * 处理失败
+     *
+     * @param msg 消息
+     * @return data
+     */
+    public static Result failure(String msg) {
+        return failure(CODE_FAILURE, msg);
+    }
+
+    @Override
+    public String toString() {
+        return "JsonResult [code=" + code + ", msg=" + msg + ", data="
+                + data + "]";
+    }
+}

+ 44 - 0
src/main/java/com/fdkankan/sale/common/ResultCode.java

@@ -0,0 +1,44 @@
+package com.fdkankan.sale.common;
+
+
+public enum ResultCode  {
+    SYSTEM_ERROR(500, "系统异常"),
+
+    NOT_ROLE(4001, "无此角色"),
+    NOT_PERMISSION(4002, "无此权限"),
+    USER_NOT_EXIST(4003, "用户不存在"),
+    USER_EXIST(4004, "用户已存在"),
+    PASSWORD_ERROR(4005, "账号密码错误,请重新登录!"),
+    USERNAME_ERROR(4006, "该账号已停止使用"),
+    MISSING_REQUIRED_PARAMETERS(4007, "必填项不能为空"),
+    USER_NOT_LOGIN(4008, "用户未登录"),
+    DATA_TOO_LONG(4009, "长度超出限制!"),
+
+    DEL_ROLE_ERROR(50035, "该角色已关联用户,不可删除。请先修改相关用户的角色!"),
+    UPDATE_MYSELF_PASSWORD(50039, "只能修改自己的密码!"),
+    OLD_PASSWORD_ERROR(50037, "原密码错误"),
+
+
+
+    ;
+
+    private Integer code;
+    private String message;
+
+   private ResultCode(Integer code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public Integer code() {
+        return this.code;
+    }
+
+    public String message() {
+        return this.message;
+    }
+
+    public String formatMessage(Object... args) {
+        return String.format(this.message, args);
+    }
+}

+ 64 - 0
src/main/java/com/fdkankan/sale/common/ResultData.java

@@ -0,0 +1,64 @@
+package com.fdkankan.sale.common;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.Calendar;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class ResultData<T> implements Serializable {
+    /**
+     * 状态码
+     */
+    private int code;
+    /**
+     * 响应信息
+     */
+    private String message;
+    /**
+     * 后端返回结果
+     */
+    private T data;
+    /**
+     * 后端返回结果
+     */
+    private Boolean success;
+    /**
+     * 响应时间戳
+     */
+    private long timestamp = Calendar.getInstance().getTimeInMillis();
+
+    public static ResultData ok() {
+        return ok(null);
+    }
+    public static ResultData ok(Object data) {
+        return ok("成功", data);
+    }
+    public static ResultData ok(String msg, Object data) {
+        return base(200, msg, data,true);
+    }
+
+    public static ResultData error(int code, String msg) {
+        return error(code, msg, null); }
+    public static ResultData error(int code, String msg, Object data) {
+        return base(code, msg, data,false);
+    }
+
+    public static ResultData error(ResultCode errorCode) {
+        return error(errorCode.code(), errorCode.message());
+    }
+
+    private static ResultData  base(int code, String msg, Object data,Boolean success) {
+        ResultData rd = new ResultData();
+        rd.setCode(code);
+        rd.setMessage(msg);
+        rd.setData(data);
+        rd.setSuccess(success);
+        return rd;
+    }
+
+}

+ 22 - 0
src/main/java/com/fdkankan/sale/config/MybatisPlusPageConfig.java

@@ -0,0 +1,22 @@
+package com.fdkankan.sale.config;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+
+@Configuration
+public class MybatisPlusPageConfig {
+
+    /**
+     * mybatisPlus配置分页插件
+     */
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
+        return interceptor;
+    }
+}

+ 34 - 0
src/main/java/com/fdkankan/sale/config/WebAppConfig.java

@@ -0,0 +1,34 @@
+package com.fdkankan.sale.config;
+
+import com.fdkankan.sale.interceptor.TokenInterceptor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+
+@Configuration
+public class WebAppConfig implements WebMvcConfigurer {
+
+	@Autowired
+	TokenInterceptor tokenInterceptor;
+
+	@Override
+	public void addInterceptors(InterceptorRegistry registry) {
+
+		registry.addInterceptor(tokenInterceptor).addPathPatterns("/**")
+				.excludePathPatterns(
+						"/**/test/**"
+				);
+
+		WebMvcConfigurer.super.addInterceptors(registry);
+	}
+
+	@Override
+	public void addResourceHandlers(ResourceHandlerRegistry registry) {
+		WebMvcConfigurer.super.addResourceHandlers(registry);
+	}
+
+}
+

+ 35 - 0
src/main/java/com/fdkankan/sale/controller/BaseController.java

@@ -0,0 +1,35 @@
+package com.fdkankan.sale.controller;
+
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.interfaces.DecodedJWT;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@Component
+public class BaseController {
+    @Autowired
+    protected HttpServletRequest request;
+
+    @Autowired
+    protected HttpServletResponse response;
+
+    protected String getToken(){
+        return request.getHeader("token");
+    }
+
+    protected Long getUserId(){
+        String token = request.getHeader("token");
+        DecodedJWT jwt = JWT.decode(token);
+        return jwt.getClaim("userId").asLong();
+    }
+    protected String getNickName(){
+        String token = request.getHeader("token");
+        DecodedJWT jwt = JWT.decode(token);
+        return jwt.getClaim("nickName").asString();
+    }
+
+
+}

+ 0 - 21
src/main/java/com/fdkankan/sale/controller/FaultController.java

@@ -1,21 +0,0 @@
-package com.fdkankan.sale.controller;
-
-
-import org.springframework.web.bind.annotation.RequestMapping;
-
-import org.springframework.web.bind.annotation.RestController;
-
-/**
- * <p>
- *  前端控制器
- * </p>
- *
- * @author 
- * @since 2022-12-07
- */
-@RestController
-@RequestMapping("/sale/fault")
-public class FaultController {
-
-}
-

+ 76 - 0
src/main/java/com/fdkankan/sale/controller/PartController.java

@@ -0,0 +1,76 @@
+package com.fdkankan.sale.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.fdkankan.sale.common.RequestBase;
+import com.fdkankan.sale.common.ResultCode;
+import com.fdkankan.sale.common.ResultData;
+import com.fdkankan.sale.entity.Part;
+import com.fdkankan.sale.exception.BusinessException;
+import com.fdkankan.sale.service.IPartLogService;
+import com.fdkankan.sale.service.IPartService;
+import com.fdkankan.sale.vo.request.PartParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-07
+ */
+@RestController
+@RequestMapping("/sale/part")
+public class PartController extends BaseController {
+
+    @Autowired
+    IPartService partService;
+    @Autowired
+    IPartLogService partLogService;
+
+    @PostMapping("/list")
+    public ResultData list(@RequestBody PartParam param){
+        return ResultData.ok(partService.pageList(param));
+    }
+
+    @PostMapping("/allList")
+    public ResultData allList(@RequestBody PartParam param){
+        return ResultData.ok(partService.allList(param));
+    }
+
+    @PostMapping("/addOrUpdate")
+    public ResultData update(@RequestBody Part part){
+        part.setUpdateTime(null);
+        part.setCreateTime(null);
+        partService.saveOrUpdate(part);
+        return ResultData.ok();
+    }
+
+    @PostMapping("/delete")
+    public ResultData delete(@RequestBody Part part){
+        if(part.getPartId() == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        partService.removeById(part.getPartId());
+        return ResultData.ok();
+    }
+
+    @PostMapping("/in")
+    public ResultData in(@RequestBody Part part){
+       partService.inStock(part,getUserId(),getNickName());
+        return ResultData.ok();
+    }
+
+    @PostMapping("/inLog")
+    public ResultData inLog(@RequestBody RequestBase param){
+        return ResultData.ok(partLogService.pageList(param));
+    }
+
+}
+

+ 94 - 0
src/main/java/com/fdkankan/sale/controller/SysMenuController.java

@@ -0,0 +1,94 @@
+package com.fdkankan.sale.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.sale.common.RequestBase;
+import com.fdkankan.sale.common.ResultCode;
+import com.fdkankan.sale.common.ResultData;
+import com.fdkankan.sale.entity.SysMenu;
+import com.fdkankan.sale.exception.BusinessException;
+import com.fdkankan.sale.service.ISysMenuService;
+import com.fdkankan.sale.service.ISysRoleMenuService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-09
+ */
+@RestController
+@RequestMapping("/sale/sysMenu")
+public class SysMenuController extends BaseController {
+
+    @Autowired
+    ISysMenuService menuService;
+    @Autowired
+    ISysRoleMenuService roleMenuService;
+
+    @PostMapping("/add")
+    public ResultData add(@RequestBody SysMenu param){
+        menuService.save(param);
+        roleMenuService.addByMenuId(param.getId(),1L);  //添加菜单,自动为超管添加权限
+        return ResultData.ok();
+    }
+
+    @PostMapping("/update")
+    public ResultData update(@RequestBody SysMenu param){
+        if(StringUtils.isEmpty(param.getId())){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        param.setUpdateTime(null);
+        menuService.updateById(param);
+        return ResultData.ok();
+    }
+
+    @PostMapping("/delete")
+    public ResultData delete(@RequestBody SysMenu param){
+        if(param.getId() == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        LambdaQueryWrapper<SysMenu> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(SysMenu::getParentId,param.getId());
+        menuService.remove(wrapper);
+        menuService.removeById(param.getId());
+        roleMenuService.deleteByMenuId(param.getId());
+        return ResultData.ok();
+    }
+
+    @PostMapping("/list")
+    public ResultData list(@RequestBody RequestBase param){
+        return ResultData.ok(menuService.pageList(param));
+    }
+
+    @PostMapping("/allShowList")
+    public ResultData allShowList(){
+        return ResultData.ok(menuService.allShowList());
+    }
+
+    @GetMapping("/getByUserId")
+    public ResultData getByUserId(){
+        return ResultData.ok(menuService.getByUserId(getUserId()));
+    }
+
+    @GetMapping("/getButtonByUserId")
+    public ResultData getButtonByUserId(){
+        return ResultData.ok(menuService.getButtonByUserId(getUserId()));
+    }
+
+    @GetMapping("/getByRoleId")
+    public ResultData getByRoleId(@RequestParam(required = false) Long roleId){
+        return ResultData.ok(menuService.getByRoleId(null,roleId));
+    }
+
+    @GetMapping("/getMenuIdsByRoleId")
+    public ResultData getMenuIdsByRoleId(@RequestParam(required = false) Long roleId){
+        return ResultData.ok(menuService.getMenuIdsByRoleId(roleId));
+    }
+
+}
+

+ 71 - 0
src/main/java/com/fdkankan/sale/controller/SysRoleController.java

@@ -0,0 +1,71 @@
+package com.fdkankan.sale.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.sale.common.ResultCode;
+import com.fdkankan.sale.common.ResultData;
+import com.fdkankan.sale.entity.SysRole;
+import com.fdkankan.sale.exception.BusinessException;
+import com.fdkankan.sale.service.ISysRoleService;
+import com.fdkankan.sale.vo.request.SysRoleMenuParam;
+import com.fdkankan.sale.vo.request.SysRoleParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-09
+ */
+@RestController
+@RequestMapping("/sale/sysRole")
+public class SysRoleController extends BaseController{
+
+    @Autowired
+    ISysRoleService roleService;
+
+    @PostMapping("/add")
+    public ResultData add(@RequestBody SysRoleParam param){
+        param.setCreateUserId(getUserId());
+        roleService.addOrUpdate(param);
+        return ResultData.ok();
+    }
+
+    @PostMapping("/update")
+    public ResultData update(@RequestBody SysRoleParam param){
+        if(StringUtils.isEmpty(param.getId())){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        roleService.addOrUpdate(param);
+        return ResultData.ok();
+    }
+
+    @PostMapping("/delete")
+    public ResultData delete(@RequestBody SysRoleParam param){
+        roleService.delete(param.getId());
+        return ResultData.ok();
+    }
+
+    @PostMapping("/list")
+    public ResultData list(@RequestBody SysRoleParam param){
+        return ResultData.ok(roleService.pageList(param));
+    }
+
+    @GetMapping("/allList")
+    public ResultData allList(){
+        LambdaQueryWrapper<SysRole> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(SysRole::getStatus,1);
+        return ResultData.ok(roleService.list(wrapper));
+    }
+
+    @PostMapping("/giveMenu")
+    public ResultData giveMenu(@RequestBody SysRoleMenuParam param){
+        roleService.giveMenu(param);
+        return ResultData.ok();
+    }
+}
+

+ 99 - 0
src/main/java/com/fdkankan/sale/controller/SysUserController.java

@@ -0,0 +1,99 @@
+package com.fdkankan.sale.controller;
+
+
+import com.fdkankan.sale.common.ResultCode;
+import com.fdkankan.sale.common.ResultData;
+import com.fdkankan.sale.entity.SysRole;
+import com.fdkankan.sale.entity.SysUser;
+import com.fdkankan.sale.exception.BusinessException;
+import com.fdkankan.sale.service.ISysRoleService;
+import com.fdkankan.sale.service.ISysUserService;
+import com.fdkankan.sale.vo.request.SysUserParam;
+import com.fdkankan.sale.vo.response.SysUserVo;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-09
+ */
+@RestController
+@RequestMapping("/sale/sysUser")
+public class SysUserController extends BaseController{
+    @Autowired
+    ISysUserService sysUserService;
+    @Autowired
+    ISysRoleService sysRoleService;
+
+    @GetMapping("/getInfo")
+    public ResultData getInfo(){
+        SysUser sysUser = sysUserService.getById(getUserId());
+        SysUserVo userVo = new SysUserVo();
+        SysRole role = sysRoleService.getById(sysUser.getRoleId());
+        userVo.setRoleId(role.getId());
+        userVo.setRoleName(role.getRoleName());
+        BeanUtils.copyProperties(sysUser,userVo);
+        return ResultData.ok(userVo);
+    }
+
+    @PostMapping("/add")
+    public ResultData add(@RequestBody SysUserParam param){
+        if(StringUtils.isEmpty(param.getUserName()) || StringUtils.isEmpty(param.getPassword())
+                || StringUtils.isEmpty(param.getNickName()) || param.getRoleId() == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        param.setCreateUserId(getUserId());
+        sysUserService.addOrUpdate(param);
+        return ResultData.ok();
+    }
+
+    @PostMapping("/update")
+    public ResultData update(@RequestBody SysUserParam param){
+        if(param.getId() == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        sysUserService.addOrUpdate(param);
+        return ResultData.ok();
+    }
+
+    @PostMapping("/delete")
+    public ResultData delete(@RequestBody SysUserParam param){
+        if(param.getId() == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        sysUserService.removeById(param.getId());
+        return ResultData.ok();
+    }
+
+    @PostMapping("/rePassword")
+    public ResultData rePassword(@RequestBody SysUserParam param){
+        if(param.getId() == null || StringUtils.isEmpty(param.getNewPassword())){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        sysUserService.addOrUpdate(param);
+        return ResultData.ok();
+    }
+    @PostMapping("/reMyselfPassword")
+    public ResultData reMyselfPassword(@RequestBody SysUserParam param){
+        if(param.getId() == null || StringUtils.isEmpty(param.getNewPassword())){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        if(!getUserId().equals(param.getId())){
+            throw new BusinessException(ResultCode.UPDATE_MYSELF_PASSWORD);
+        }
+        sysUserService.addOrUpdate(param);
+        return ResultData.ok();
+    }
+
+    @PostMapping("/list")
+    public ResultData list(@RequestBody SysUserParam param){
+        return ResultData.ok(sysUserService.pageList(param));
+    }
+}
+

+ 33 - 0
src/main/java/com/fdkankan/sale/controller/TestController.java

@@ -0,0 +1,33 @@
+package com.fdkankan.sale.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.sale.common.ResultData;
+import com.fdkankan.sale.entity.SysUser;
+import com.fdkankan.sale.httpClient.client.WxClient;
+import com.fdkankan.sale.pay.wx.WXUtil;
+import com.fdkankan.sale.service.ISysUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.sound.midi.Soundbank;
+
+@RestController
+@RequestMapping("/test")
+public class TestController {
+
+    @Autowired
+    ISysUserService sysUserService;
+
+
+    @GetMapping("/test1")
+    public ResultData test1() throws Exception {
+        SysUser sysUser = new SysUser();
+        sysUser.setId(12L);
+        sysUser.setUserName("121323");
+        sysUserService.saveOrUpdate(sysUser);
+        return ResultData.ok();
+    }
+
+}

+ 4 - 2
src/main/java/com/fdkankan/sale/entity/Fault.java

@@ -3,6 +3,7 @@ package com.fdkankan.sale.entity;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import java.io.Serializable;
 import java.util.Date;
@@ -42,8 +43,9 @@ public class Fault implements Serializable {
     @TableField("fault_msg")
     private String faultMsg;
 
-    @TableField("rec_stauts")
-    private String recStauts;
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
 
     @TableField("create_time")
     private Date createTime;

+ 82 - 0
src/main/java/com/fdkankan/sale/entity/Part.java

@@ -0,0 +1,82 @@
+package com.fdkankan.sale.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-07
+ */
+@Getter
+@Setter
+@TableName("t_part")
+public class Part implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 备件
+     */
+    @TableId(value = "part_id", type = IdType.AUTO)
+    private Integer partId;
+
+    /**
+     * 备件名称
+     */
+    @TableField("part_name")
+    private String partName;
+
+    /**
+     * 备件单位
+     */
+    @TableField("part_unit")
+    private String partUnit;
+
+    /**
+     * 备件价格
+     */
+    @TableField("part_price")
+    private BigDecimal partPrice;
+
+    /**
+     * 备件库存
+     */
+    @TableField("part_stock")
+    private Integer partStock;
+
+    /**
+     * 相机类型
+     */
+    @TableField("camera_type")
+    private Integer cameraType;
+
+    /**
+     * 0启用,1禁用
+     */
+    @TableField("status")
+    private Integer status;
+
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+
+}

+ 78 - 0
src/main/java/com/fdkankan/sale/entity/PartLog.java

@@ -0,0 +1,78 @@
+package com.fdkankan.sale.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-07
+ */
+@Getter
+@Setter
+@TableName("t_part_log")
+public class PartLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 备件入库日志
+     */
+    @TableId(value = "part_log_id", type = IdType.AUTO)
+    private Integer partLogId;
+
+    /**
+     * 相机类型
+     */
+    @TableField("camera_type")
+    private Integer cameraType;
+
+    /**
+     * 备件id
+     */
+    @TableField("part_id")
+    private Integer partId;
+
+    /**
+     * 备件名称
+     */
+    @TableField("part_name")
+    private String partName;
+
+    /**
+     * 入库数量
+     */
+    @TableField("in_count")
+    private Integer inCount;
+
+    /**
+     * 操作人id
+     */
+    @TableField("sys_user_id")
+    private Long sysUserId;
+
+    @TableField("sys_user_name")
+    private String sysUserName;
+
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+
+}

+ 105 - 0
src/main/java/com/fdkankan/sale/entity/SysMenu.java

@@ -0,0 +1,105 @@
+package com.fdkankan.sale.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-09
+ */
+@Getter
+@Setter
+@TableName("sys_menu")
+public class SysMenu implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 系统菜单表
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 菜单名称
+     */
+    @TableField("name")
+    private String name;
+
+    /**
+     * 权限表达式
+     */
+    @TableField("perms")
+    private String perms;
+
+    /**
+     * 菜单路由
+     */
+    @TableField("url")
+    private String url;
+
+    /**
+     * 菜单图标
+     */
+    @TableField("icon")
+    private String icon;
+
+    /**
+     * 父id
+     */
+    @TableField("parent_id")
+    private Long parentId;
+
+    /**
+     * 类型0菜单,1按钮
+     */
+    @TableField("type")
+    private Integer type;
+
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    /**
+     * 排序字段
+     */
+    @TableField("sort")
+    private Integer sort;
+
+    /**
+     * 是否显示 0 不显示,1显示
+     */
+    @TableField("is_show")
+    private Integer isShow;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+    @TableField("path")
+    private String path;
+
+    @TableField("hide_menu")
+    private Integer hideMenu;
+
+    @TableField("is_ext")
+    private Integer isExt;
+
+    @TableField("component")
+    private String component;
+
+
+}

+ 75 - 0
src/main/java/com/fdkankan/sale/entity/SysRole.java

@@ -0,0 +1,75 @@
+package com.fdkankan.sale.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-09
+ */
+@Getter
+@Setter
+@TableName("sys_role")
+public class SysRole implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 角色表
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 角色名称
+     */
+    @TableField("role_name")
+    private String roleName;
+
+    /**
+     * 角色类型
+     */
+    @TableField("role_type")
+    private String roleType;
+
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    /**
+     * 创建者id
+     */
+    @TableField("create_user_id")
+    private Integer createUserId;
+
+    /**
+     * 是否禁用 0禁用 1启用
+     */
+    @TableField("status")
+    private Integer status;
+
+    /**
+     * 角色说明
+     */
+    @TableField("description")
+    private String description;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+
+}

+ 39 - 0
src/main/java/com/fdkankan/sale/entity/SysRoleMenu.java

@@ -0,0 +1,39 @@
+package com.fdkankan.sale.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-09
+ */
+@Getter
+@Setter
+@TableName("sys_role_menu")
+public class SysRoleMenu implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 菜单角色关系表
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("role_id")
+    private Long roleId;
+
+    @TableField("menu_id")
+    private Long menuId;
+
+
+}

+ 81 - 0
src/main/java/com/fdkankan/sale/entity/SysUser.java

@@ -0,0 +1,81 @@
+package com.fdkankan.sale.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-09
+ */
+@Getter
+@Setter
+@TableName("sys_user")
+public class SysUser implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 系统用户表
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 账号
+     */
+    @TableField("user_name")
+    private String userName;
+
+    /**
+     * 密码
+     */
+    @TableField("password")
+    private String password;
+
+    /**
+     * 昵称
+     */
+    @TableField("nick_name")
+    private String nickName;
+
+    /**
+     * 角色id
+     */
+    @TableField("role_id")
+    private Long roleId;
+
+    /**
+     * 创建者id
+     */
+    @TableField("create_user_id")
+    private Integer createUserId;
+
+    /**
+     * 是否禁用 0禁用,1启用
+     */
+    @TableField("status")
+    private Integer status;
+
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+
+}

+ 23 - 0
src/main/java/com/fdkankan/sale/exception/BusinessException.java

@@ -0,0 +1,23 @@
+package com.fdkankan.sale.exception;
+
+import com.fdkankan.sale.common.ResultCode;
+import lombok.Data;
+
+/**
+ * 自定义业务异常类
+ */
+@Data
+public class BusinessException extends RuntimeException {
+    private int code;
+    private String message;
+
+    public BusinessException(Integer code,String msg){
+        this.code = code;
+        this.message = msg;
+    }
+
+    public BusinessException(ResultCode errorCode) {
+        this.code = errorCode.code();
+        this.message = errorCode.message();
+    }
+}

+ 49 - 0
src/main/java/com/fdkankan/sale/exception/GlobalExceptionHandler.java

@@ -0,0 +1,49 @@
+package com.fdkankan.sale.exception;
+
+import com.fdkankan.sale.common.ResultCode;
+import com.fdkankan.sale.common.ResultData;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.dao.DataIntegrityViolationException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+/**
+ * 全局异常处理器
+ */
+@RestControllerAdvice
+@Slf4j
+public class GlobalExceptionHandler {
+
+    /**
+     * 处理未知异常
+     */
+    @ResponseBody
+    @ExceptionHandler(value = Exception.class)
+    public ResultData exceptionHandler(Exception e) throws Exception {
+        log.error("服务错误:", e);
+        return ResultData.error( 500, e.getCause().getMessage());
+    }
+
+    /**
+     * 处理业务异常
+     */
+    @ResponseBody
+    @ExceptionHandler(value = BusinessException.class)
+    public ResultData businessExceptionHandler(BusinessException e) {
+        log.info("业务异常code:{},message:{}", e.getCode(), e.getMessage());
+        return ResultData.error(e.getCode(), e.getMessage());
+    }
+    /**
+     * 处理业务异常
+     */
+    @ResponseBody
+    @ExceptionHandler(value = DataIntegrityViolationException.class)
+    public ResultData DataIntegrityViolationExceptionHandler(DataIntegrityViolationException e) {
+        log.error("mysql服务错误:", e);
+        if(e.getCause().getMessage().contains("Data too long")){
+            return ResultData.error(ResultCode.DATA_TOO_LONG);
+        }
+        return ResultData.error( 500, e.getCause().getMessage());
+    }
+}

+ 3 - 3
src/main/java/com/fdkankan/sale/generate/AutoGenerate.java

@@ -18,7 +18,7 @@ public class AutoGenerate {
         String path =System.getProperty("user.dir");
 
         generate(path,"sale", getTables(new String[]{
-                "t_fault",
+                "sys_menu","sys_role","sys_role_menu","sys_user"
         }));
 
 //        generate(path,"goods", getTables(new String[]{
@@ -46,8 +46,8 @@ public class AutoGenerate {
 
 
     public static void  generate(String path,String moduleName,  List<String> tables){
-        FastAutoGenerator.create("jdbc:mysql://127.0.0.1:3306/4dkankan_v4_sale",
-                "root","123456")
+        FastAutoGenerator.create("jdbc:mysql://120.24.144.164:3306/4dkankan_v4_sale",
+                "root","4Dage@4Dage#@168")
                 .globalConfig(builder -> {
                     builder.author("")               //作者
                             .outputDir(path+"\\src\\main\\java")    //输出路径(写到java目录)

+ 31 - 0
src/main/java/com/fdkankan/sale/httpClient/client/WxClient.java

@@ -0,0 +1,31 @@
+package com.fdkankan.sale.httpClient.client;
+
+import com.alibaba.fastjson.JSONObject;
+import com.dtflys.forest.annotation.*;
+import org.springframework.web.bind.annotation.RequestHeader;
+
+/**
+ * 获取,调用4dkk服务
+ */
+@BaseRequest(sslProtocol = "TLS")
+public interface WxClient {
+
+    /**
+     * 获取 access_token
+     */
+    @Get("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential")
+    JSONObject getToken(@Query("appid") String app_id, @Query("secret") String app_secret);
+
+    /**
+     * 申请账单
+     */
+    @Get(value = "https://api.mch.weixin.qq.com/v3/bill/fundflowbill",headers = {
+            "Accept:application/json",
+            "Content-Type: application/json"
+    })
+    JSONObject tradeBill(@Query("bill_date") String bill_date,
+                         @Query("bill_type") String bill_type,
+                         @Query("tar_type") String tar_type,
+                         @Header("Authorization") String authorization);
+
+}

+ 108 - 0
src/main/java/com/fdkankan/sale/interceptor/ControllerAopInterceptor.java

@@ -0,0 +1,108 @@
+package com.fdkankan.sale.interceptor;
+
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 
+ * @ClassName: ControllerAopInterceptor
+ * @Description: 访问接口的参数以及返回结果的日志
+ * @author B450-R5
+ * @date 2018年11月23日
+ *
+ */
+@Component // 将对象交由spring进行管理
+@Aspect // 代表此类为一个切面类
+public class ControllerAopInterceptor {
+	/** 初始化日志打印 */
+	public static final Logger log = LoggerFactory.getLogger("visitLog");
+
+	// 切入点表达式
+	@Pointcut("execution(public * com.fdkankan.ucenter.controller..*Controller.*(..))")
+	public void privilege() {
+	}
+
+	@Around("privilege()")
+	public Object around(ProceedingJoinPoint pjp) throws Throwable {
+
+		// 获取类名
+		String className = pjp.getTarget().getClass().getName();// pjp.getTarget().getClass().getSimpleName();
+		// 获取执行的方法名称
+		String methodName = pjp.getSignature().getName();
+		// 获取参数名称
+		String[] parameterNamesArgs = ((MethodSignature) pjp.getSignature()).getParameterNames();
+		// 定义返回参数
+		Object result = null;
+		// 获取方法参数
+		Object[] args = pjp.getArgs();
+		HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+		// 请求的URL
+		String requestURL = request.getRequestURL().toString();
+		String ip = getIpAddr(request);
+
+		StringBuilder paramsBuf = new StringBuilder();
+		// 获取请求参数集合并进行遍历拼接
+		for (int i = 0; i < args.length; i++) {
+			if (paramsBuf.length() > 0) {
+				paramsBuf.append("|");
+			}
+			paramsBuf.append(parameterNamesArgs[i]).append(" = ").append(args[i]);
+		}
+
+		// 打印请求参数参数
+		// 记录开始时间
+		long start = System.currentTimeMillis();
+
+		log.info("请求| ip:{} , 请求接口:{} ,请求时间:{}, 参数:{} , 请求token:{} ",
+				ip, requestURL, start,paramsBuf.toString(), request.getHeader("token"));
+		// 执行目标方法
+		result = pjp.proceed();
+		// 获取执行完的时间 打印返回报文
+		log.info("返回| 请求接口:{} , 请求时间:{} , 处理时间:{} 毫秒 , 返回结果 :{}",
+				requestURL, start, (System.currentTimeMillis() - start), result);
+		return result;
+	}
+
+	/**
+	 * @Title: getIpAddr
+	 * @Description: 获取ip
+	 * @param request
+	 * @return
+	 * @return String 返回类型
+	 */
+	public String getIpAddr(HttpServletRequest request) {
+		String ipAddress = null;
+		ipAddress = request.getHeader("x-forwarded-for");
+		if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+			ipAddress = request.getHeader("Proxy-Client-IP");
+		}
+		if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+			ipAddress = request.getHeader("WL-Proxy-Client-IP");
+		}
+		if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+			ipAddress = request.getRemoteAddr();
+		}
+
+// 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
+		if (ipAddress != null && ipAddress.length() > 15) { // "***.***.***.***".length()
+			// = 15
+			if (ipAddress.indexOf(",") > 0) {
+				ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
+			}
+		}
+		// 或者这样也行,对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
+//return ipAddress!=null&&!"".equals(ipAddress)?ipAddress.split(",")[0]:null;
+		return ipAddress;
+	}
+}
+

+ 67 - 0
src/main/java/com/fdkankan/sale/interceptor/TokenInterceptor.java

@@ -0,0 +1,67 @@
+package com.fdkankan.sale.interceptor;
+
+
+import cn.hutool.http.ContentType;
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.redis.util.RedisUtil;
+import com.fdkankan.sale.common.RedisKey;
+import com.fdkankan.sale.common.ResultCode;
+import com.fdkankan.sale.common.ResultData;
+import com.fdkankan.sale.service.ISysUserService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpHeaders;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+
+@Component
+@Slf4j
+public class TokenInterceptor implements HandlerInterceptor {
+
+	@Autowired
+	private RedisUtil redisUtil;
+	@Autowired
+	private ISysUserService sysUserService;
+
+
+	@Override
+	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+		response.setHeader(HttpHeaders.CONTENT_TYPE, ContentType.JSON.getValue());
+		response.setCharacterEncoding(StandardCharsets.UTF_8.name());
+		String token = request.getHeader("token");
+		if(StringUtils.isEmpty(token)){
+			this.needLogin(request,response);
+			return false;
+		}
+		try {
+			String redisKey = String.format(RedisKey.manage_login_token,token);
+			if(redisUtil.hasKey(redisKey)){
+				sysUserService.saveByRedisKey(redisKey);
+				redisUtil.expire(redisKey,2 * 60 * 60);
+				return true;
+			}
+		}catch (Exception e){
+			e.printStackTrace();
+		}
+		this.needLogin(request,response);
+		return false;
+	}
+
+	private void needLogin(HttpServletRequest request, HttpServletResponse response) {
+		try {
+			String result = JSONObject.toJSONString(ResultData.error(ResultCode.USER_NOT_LOGIN));
+			response.getWriter().append(result);
+		} catch (IOException e) {
+			log.info("LoginInterceptor|needLogin|IOException|" + e);
+			e.printStackTrace();
+		}
+	}
+
+}
+

+ 18 - 0
src/main/java/com/fdkankan/sale/mapper/IPartLogMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.sale.mapper;
+
+import com.fdkankan.sale.entity.PartLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-07
+ */
+@Mapper
+public interface IPartLogMapper extends BaseMapper<PartLog> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/sale/mapper/IPartMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.sale.mapper;
+
+import com.fdkankan.sale.entity.Part;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-07
+ */
+@Mapper
+public interface IPartMapper extends BaseMapper<Part> {
+
+}

+ 22 - 0
src/main/java/com/fdkankan/sale/mapper/ISysMenuMapper.java

@@ -0,0 +1,22 @@
+package com.fdkankan.sale.mapper;
+
+import com.fdkankan.sale.entity.SysMenu;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-09
+ */
+@Mapper
+public interface ISysMenuMapper extends BaseMapper<SysMenu> {
+
+    List<SysMenu> getListByUserId(@Param("userId") Object userId);
+}

+ 22 - 0
src/main/java/com/fdkankan/sale/mapper/ISysRoleMapper.java

@@ -0,0 +1,22 @@
+package com.fdkankan.sale.mapper;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.sale.entity.SysRole;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fdkankan.sale.vo.request.SysRoleParam;
+import com.fdkankan.sale.vo.response.SysRoleVo;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-09
+ */
+@Mapper
+public interface ISysRoleMapper extends BaseMapper<SysRole> {
+
+    Page<SysRoleVo> pageList(Page<SysRoleVo> page, SysRoleParam param);
+}

+ 18 - 0
src/main/java/com/fdkankan/sale/mapper/ISysRoleMenuMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.sale.mapper;
+
+import com.fdkankan.sale.entity.SysRoleMenu;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-09
+ */
+@Mapper
+public interface ISysRoleMenuMapper extends BaseMapper<SysRoleMenu> {
+
+}

+ 27 - 0
src/main/java/com/fdkankan/sale/mapper/ISysUserMapper.java

@@ -0,0 +1,27 @@
+package com.fdkankan.sale.mapper;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.sale.entity.SysUser;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fdkankan.sale.vo.request.SysUserParam;
+import com.fdkankan.sale.vo.response.SysRoleVo;
+import com.fdkankan.sale.vo.response.SysUserVo;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-09
+ */
+@Mapper
+public interface ISysUserMapper extends BaseMapper<SysUser> {
+
+    Page<SysUserVo> pageList(Page<SysUserVo> page, SysUserParam param);
+
+    List<SysRoleVo> groupByRoleId();
+}

+ 175 - 0
src/main/java/com/fdkankan/sale/pay/wx/RSAUtil.java

@@ -0,0 +1,175 @@
+package com.fdkankan.sale.pay.wx;
+
+import org.springframework.core.io.ClassPathResource;
+import sun.misc.BASE64Decoder;
+import sun.misc.BASE64Encoder;
+
+import javax.crypto.Cipher;
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.nio.charset.StandardCharsets;
+import java.security.*;
+import java.security.cert.X509Certificate;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+
+public class RSAUtil {
+    public static final String PRIVATE_KEY_PEM = "D:\\cert\\pkcs8.pem";
+    public static final String PUBLIC_KEY_PEM = "D:/rsa_public_key.pem";
+
+    public static final String KEY_SHA = "SHA";
+    public static final String KEY_MD5 = "MD5";
+    public static final String KEY_ALGORITHM = "RSA";
+    public static final String SIGNATURE_ALGORITHM = "MD5withRSA";
+
+
+
+
+
+
+    /**
+     * 用私钥对信息生成数字签名
+     * @param data       加密数据
+     * @param privateKey 私钥
+     * @return
+     * @throws Exception
+     */
+    public static String sign(byte[] data, PrivateKey privateKey) throws Exception {
+        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
+        signature.initSign(privateKey);
+        signature.update(data);
+        return encryptBASE64(signature.sign());
+    }
+
+    /**
+     * 校验数字签名
+     * @param data      加密数据
+     * @param publicKey 公钥
+     * @param sign      数字签名
+     * @return 校验成功返回true 失败返回false
+     * @throws Exception
+     */
+    public static boolean verify(byte[] data, PublicKey publicKey, String sign) throws Exception {
+        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
+        signature.initVerify(publicKey);
+        signature.update(data);
+        return signature.verify(decryptBASE64(sign));
+    }
+
+    /**
+     * 私钥解密
+     * @param data       密文
+     * @param privateKey 私钥
+     * @return
+     * @throws Exception
+     */
+    public static byte[] decryptByPrivateKey(byte[] data, PrivateKey privateKey) throws Exception {
+        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
+        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
+        cipher.init(Cipher.DECRYPT_MODE, privateKey);
+        return cipher.doFinal(data);
+    }
+
+    /**
+     * 用公钥解密
+     * @param data      密文
+     * @param publicKey 公钥
+     * @return
+     * @throws Exception
+     */
+    public static byte[] decryptByPublicKey(byte[] data, PublicKey publicKey) throws Exception {
+        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
+        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
+        cipher.init(Cipher.DECRYPT_MODE, publicKey);
+        return cipher.doFinal(data);
+    }
+
+    /**
+     * 用公钥加密
+     * @param data      明文
+     * @param publicKey 公钥
+     * @return
+     * @throws Exception
+     */
+    public static byte[] encryptByPublicKey(byte[] data, PublicKey publicKey) throws Exception {
+        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
+        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
+        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
+        return cipher.doFinal(data);
+    }
+
+    /**
+     * 用私钥加密
+     * @param data       明文
+     * @param privateKey 私钥
+     * @return
+     * @throws Exception
+     */
+    public static byte[] encryptByPrivateKey(byte[] data, PrivateKey privateKey) throws Exception {
+        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
+        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
+        cipher.init(Cipher.ENCRYPT_MODE, privateKey);
+        return cipher.doFinal(data);
+    }
+
+    // 获取私匙
+    public static PrivateKey getPrivateKeyFromPem() throws Exception {
+        BufferedReader br = new BufferedReader(new FileReader(PRIVATE_KEY_PEM));
+        String s = br.readLine();
+        StringBuilder str = new StringBuilder();
+        s = br.readLine();
+        while (s.charAt(0) != '-') {
+            str.append(s).append("\r");
+            s = br.readLine();
+        }
+        BASE64Decoder base64decoder = new BASE64Decoder();
+        byte[] b = base64decoder.decodeBuffer(str.toString());
+
+        // 生成私匙
+        KeyFactory kf = KeyFactory.getInstance("RSA");
+        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(b);
+        PrivateKey privateKey = kf.generatePrivate(keySpec);
+        return privateKey;
+    }
+
+    // 获取公钥
+    public static PublicKey getPublicKeyFromPem() throws Exception {
+        BufferedReader br = new BufferedReader(new FileReader(PUBLIC_KEY_PEM));
+        String s = br.readLine();
+        String str = "";
+        s = br.readLine();
+        while (s.charAt(0) != '-') {
+            str += s + "\r";
+            s = br.readLine();
+        }
+        BASE64Decoder base64decoder = new BASE64Decoder();
+        byte[] b = base64decoder.decodeBuffer(str);
+        KeyFactory kf = KeyFactory.getInstance("RSA");
+        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(b);
+        PublicKey pubKey = kf.generatePublic(keySpec);
+        return pubKey;
+    }
+
+    public static byte[] decryptBASE64(String key) throws Exception {
+        return (new BASE64Decoder()).decodeBuffer(key);
+    }
+
+    public static String encryptBASE64(byte[] key) throws Exception {
+        return (new BASE64Encoder()).encodeBuffer(key);
+    }
+
+    public static byte[] encryptMD5(byte[] data) throws Exception {
+        MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);
+        md5.update(data);
+        return md5.digest();
+    }
+
+    public static byte[] encryptSHA(byte[] data) throws Exception {
+        MessageDigest sha = MessageDigest.getInstance(KEY_SHA);
+        sha.update(data);
+        return sha.digest();
+    }
+
+
+
+}

+ 14 - 0
src/main/java/com/fdkankan/sale/pay/wx/WXPayDefaultConfig.java

@@ -0,0 +1,14 @@
+package com.fdkankan.sale.pay.wx;
+
+public class WXPayDefaultConfig  {
+
+    public static String appId = "wx779dbafb46bab697";
+    public static String mchId = "1627275258";
+    public static String key = "4DAGE1684DAGE1684DAGE1684DAGE168";
+    public static String secret = "306d0d03b372232e03dca1107525f4fc";
+    public static String createIp = "47.104.99.106";
+    public static String serialNo = "214540155950926";
+
+
+
+}

+ 57 - 0
src/main/java/com/fdkankan/sale/pay/wx/WXUtil.java

@@ -0,0 +1,57 @@
+package com.fdkankan.sale.pay.wx;
+import cn.hutool.core.util.RandomUtil;
+import cn.hutool.http.HttpUtil;
+import okhttp3.HttpUrl;
+
+import java.nio.charset.StandardCharsets;
+import java.security.NoSuchAlgorithmException;
+import java.security.PrivateKey;
+import java.security.Signature;
+import java.util.Base64;
+import java.util.Random;
+
+public class WXUtil {
+
+    public static String schema = "WECHATPAY2-SHA256-RSA2048";
+
+    // Authorization: <schema> <token>
+// GET - getToken("GET", httpurl, "")
+// POST - getToken("POST", httpurl, json)
+    //String schema = "WECHATPAY2-SHA256-RSA2048";
+   // HttpUrl httpurl = HttpUrl.parse(url);
+
+    public static  String getToken(String method, String url, String body) throws Exception{
+        String nonceStr = RandomUtil.randomString(10);
+        long timestamp = System.currentTimeMillis() / 1000;
+        String message = buildMessage(method, HttpUrl.parse(url), timestamp, nonceStr, body);
+        String signature = sign(message.getBytes(StandardCharsets.UTF_8));
+
+        return  schema +"  "+
+                "mchid=\"" + WXPayDefaultConfig.mchId + "\","
+                + "nonce_str=\"" + nonceStr + "\","
+                + "timestamp=\"" + timestamp + "\","
+                + "serial_no=\"" + WXPayDefaultConfig.serialNo + "\","
+                + "signature=\"" + signature + "\"";
+    }
+
+    public static String sign(byte[] message) throws Exception {
+        Signature sign = Signature.getInstance("SHA256withRSA");
+        sign.initSign(RSAUtil.getPrivateKeyFromPem());
+        sign.update(message);
+        return Base64.getEncoder().encodeToString(sign.sign());
+    }
+
+    public static String buildMessage(String method, HttpUrl url, long timestamp, String nonceStr, String body) {
+        String canonicalUrl = url.encodedPath();
+        if (url.encodedQuery() != null) {
+            canonicalUrl += "?" + url.encodedQuery();
+        }
+
+        return method + "\n"
+                + canonicalUrl + "\n"
+                + timestamp + "\n"
+                + nonceStr + "\n"
+                + body + "\n";
+    }
+
+}

+ 22 - 0
src/main/java/com/fdkankan/sale/service/IPartLogService.java

@@ -0,0 +1,22 @@
+package com.fdkankan.sale.service;
+
+import com.fdkankan.sale.common.PageInfo;
+import com.fdkankan.sale.common.RequestBase;
+import com.fdkankan.sale.entity.Part;
+import com.fdkankan.sale.entity.PartLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-07
+ */
+public interface IPartLogService extends IService<PartLog> {
+
+    void saveByInStock(Part part, Long userId,String nickName);
+
+    PageInfo pageList(RequestBase param);
+}

+ 22 - 0
src/main/java/com/fdkankan/sale/service/IPartService.java

@@ -0,0 +1,22 @@
+package com.fdkankan.sale.service;
+
+import com.fdkankan.sale.entity.Part;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.sale.vo.request.PartParam;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-07
+ */
+public interface IPartService extends IService<Part> {
+
+    Object pageList(PartParam param);
+
+    Object allList(PartParam param);
+
+    void inStock(Part part,Long userId,String nickName);
+}

+ 40 - 0
src/main/java/com/fdkankan/sale/service/ISysMenuService.java

@@ -0,0 +1,40 @@
+package com.fdkankan.sale.service;
+
+import com.fdkankan.sale.common.PageInfo;
+import com.fdkankan.sale.common.RequestBase;
+import com.fdkankan.sale.entity.SysMenu;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.sale.entity.SysRole;
+import com.fdkankan.sale.entity.SysUser;
+import com.fdkankan.sale.vo.response.SysMenuVo;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-09
+ */
+public interface ISysMenuService extends IService<SysMenu> {
+    List<SysMenu> getListByUserId(Object loginId);
+
+    PageInfo pageList(RequestBase param);
+
+    List<SysMenuVo> allShowList();
+
+    List<SysMenuVo>  getByUserId(Long userId);
+
+    List<SysMenuVo>  getByRoleId(List<Long> menuIds,Long roleId);
+
+    List<SysMenu> getButtonByUserId(Long userId);
+
+    HashMap<Long, SysMenu> getByIds(List<Long> menuIds);
+
+    List<Long> getMenuIdsByRoleId(Long roleId);
+
+    void setRoleAndMenuCache(SysRole role, SysUser sysUser);
+}

+ 27 - 0
src/main/java/com/fdkankan/sale/service/ISysRoleMenuService.java

@@ -0,0 +1,27 @@
+package com.fdkankan.sale.service;
+
+import com.fdkankan.sale.entity.SysRoleMenu;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-09
+ */
+public interface ISysRoleMenuService extends IService<SysRoleMenu> {
+
+    void deleteByRoleId(Long roleId);
+
+    void saveBatchByRoleId(Long roleId, List<Long> menuIds);
+
+    List<SysRoleMenu> getByRoleId(Long roleId);
+
+    void deleteByMenuId(Long menuId);
+
+    void addByMenuId(Long menuId, Long  roleId);
+}

+ 26 - 0
src/main/java/com/fdkankan/sale/service/ISysRoleService.java

@@ -0,0 +1,26 @@
+package com.fdkankan.sale.service;
+
+import com.fdkankan.sale.common.PageInfo;
+import com.fdkankan.sale.entity.SysRole;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.sale.vo.request.SysRoleMenuParam;
+import com.fdkankan.sale.vo.request.SysRoleParam;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-09
+ */
+public interface ISysRoleService extends IService<SysRole> {
+
+    void addOrUpdate(SysRoleParam param);
+
+    PageInfo pageList(SysRoleParam param);
+
+    void delete(Long id);
+
+    void giveMenu(SysRoleMenuParam param);
+}

+ 35 - 0
src/main/java/com/fdkankan/sale/service/ISysUserService.java

@@ -0,0 +1,35 @@
+package com.fdkankan.sale.service;
+
+import com.fdkankan.sale.common.PageInfo;
+import com.fdkankan.sale.entity.SysUser;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.sale.vo.request.SysUserParam;
+import com.fdkankan.sale.vo.response.ManageLoginResponse;
+
+import java.util.HashMap;
+import java.util.Set;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-09
+ */
+public interface ISysUserService extends IService<SysUser> {
+
+    SysUser getByUserName(String userName);
+
+    ManageLoginResponse getUserByUserNameAndPassword(String userName, String password);
+
+    void addOrUpdate(SysUserParam param);
+
+    PageInfo pageList(SysUserParam param);
+
+    HashMap<Long, Long> groupByRoleId();
+
+    HashMap<Long, SysUser> getByIds(Set<Long> sysUserIds);
+
+    void saveByRedisKey(String redisKey);
+}

+ 44 - 0
src/main/java/com/fdkankan/sale/service/impl/PartLogServiceImpl.java

@@ -0,0 +1,44 @@
+package com.fdkankan.sale.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.sale.common.PageInfo;
+import com.fdkankan.sale.common.RequestBase;
+import com.fdkankan.sale.entity.Part;
+import com.fdkankan.sale.entity.PartLog;
+import com.fdkankan.sale.mapper.IPartLogMapper;
+import com.fdkankan.sale.service.IPartLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-07
+ */
+@Service
+public class PartLogServiceImpl extends ServiceImpl<IPartLogMapper, PartLog> implements IPartLogService {
+
+    @Override
+    public void saveByInStock(Part part, Long userId,String nickName) {
+        PartLog partLog = new PartLog();
+        partLog.setCameraType(part.getCameraType());
+        partLog.setPartId(part.getPartId());
+        partLog.setPartName(part.getPartName());
+        partLog.setInCount(part.getPartStock());
+        partLog.setSysUserId(userId);
+        partLog.setSysUserName(nickName);
+        this.save(partLog);
+    }
+
+    @Override
+    public PageInfo pageList(RequestBase param) {
+        LambdaQueryWrapper<PartLog> wrapper = new LambdaQueryWrapper<>();
+        wrapper.orderByDesc(PartLog::getCreateTime);
+        Page<PartLog> page = this.page(new Page<>(param.getPageNum(), param.getPageSize()), wrapper);
+        return PageInfo.PageInfo(page);
+    }
+}

+ 75 - 0
src/main/java/com/fdkankan/sale/service/impl/PartServiceImpl.java

@@ -0,0 +1,75 @@
+package com.fdkankan.sale.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.sale.common.PageInfo;
+import com.fdkankan.sale.common.ResultCode;
+import com.fdkankan.sale.entity.Part;
+import com.fdkankan.sale.exception.BusinessException;
+import com.fdkankan.sale.mapper.IPartMapper;
+import com.fdkankan.sale.service.IPartLogService;
+import com.fdkankan.sale.service.IPartService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.sale.vo.request.PartParam;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-07
+ */
+@Service
+public class PartServiceImpl extends ServiceImpl<IPartMapper, Part> implements IPartService {
+
+    @Autowired
+    IPartLogService partLogService;
+
+
+    @Override
+    public Object pageList(PartParam param) {
+        LambdaQueryWrapper<Part> wrapper = getWrapper(param);
+        Page<Part> page = this.page(new Page<>(param.getPageNum(), param.getPageSize()), wrapper);
+
+        return PageInfo.PageInfo(page);
+    }
+
+    @Override
+    public Object allList(PartParam param) {
+        if(param.getCameraType() == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        LambdaQueryWrapper<Part> wrapper = getWrapper(param);
+        return this.list(wrapper);
+    }
+
+    private LambdaQueryWrapper<Part> getWrapper(PartParam param) {
+        LambdaQueryWrapper<Part> wrapper = new LambdaQueryWrapper<>();
+        if(StringUtils.isNotBlank(param.getPartName())){
+            wrapper.like(Part::getPartName,param.getPartName());
+        }
+        if(param.getCameraType() != null){
+            wrapper.eq(Part::getCameraType,param.getCameraType());
+        }
+        wrapper.orderByDesc(Part::getCreateTime);
+        return  wrapper;
+    }
+
+    @Override
+    public void inStock(Part part,Long userId,String nickName) {
+        if(part.getPartId() == null || part.getPartStock() == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        LambdaUpdateWrapper<Part> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.eq(Part::getPartId,part.getPartId());
+        wrapper.set(Part::getPartStock,part.getPartStock());
+        this.update(wrapper);
+        partLogService.saveByInStock(part,userId,nickName);
+
+    }
+}

+ 237 - 0
src/main/java/com/fdkankan/sale/service/impl/SysMenuServiceImpl.java

@@ -0,0 +1,237 @@
+package com.fdkankan.sale.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.redis.constant.RedisKey;
+import com.fdkankan.redis.util.RedisUtil;
+import com.fdkankan.sale.common.PageInfo;
+import com.fdkankan.sale.common.RequestBase;
+import com.fdkankan.sale.entity.SysMenu;
+import com.fdkankan.sale.entity.SysRole;
+import com.fdkankan.sale.entity.SysRoleMenu;
+import com.fdkankan.sale.entity.SysUser;
+import com.fdkankan.sale.mapper.ISysMenuMapper;
+import com.fdkankan.sale.service.ISysMenuService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.sale.service.ISysRoleMenuService;
+import com.fdkankan.sale.service.ISysUserService;
+import com.fdkankan.sale.vo.response.Meta;
+import com.fdkankan.sale.vo.response.SysMenuVo;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-09
+ */
+@Service
+public class SysMenuServiceImpl extends ServiceImpl<ISysMenuMapper, SysMenu> implements ISysMenuService {
+    @Autowired
+    ISysRoleMenuService roleMenuService;
+    @Autowired
+    ISysUserService userService;
+    @Autowired
+    RedisUtil redisUtil;
+
+
+    @Override
+    public List<SysMenu> getListByUserId(Object loginId) {
+        return getBaseMapper().getListByUserId(loginId);
+    }
+
+    @Override
+    public PageInfo pageList(RequestBase param) {
+        LambdaQueryWrapper<SysMenu> wrapper = new LambdaQueryWrapper<>();
+        wrapper.isNull(SysMenu::getParentId);
+        wrapper.orderByAsc(SysMenu::getSort);
+        Page<SysMenu> page = this.page(new Page<>(param.getPageNum(),param.getPageSize()), wrapper);
+        List<SysMenuVo> voList = getByParentId(null,page.getRecords(),false,null,null);
+
+//        List<SysMenuVo> allVos = setTreeMenuVo(false,null,null);
+//        List<Long> ids  = page.getRecords().parallelStream().map(SysMenu::getId).collect(Collectors.toList());
+//        List<SysMenuVo> voList = allVos.parallelStream().filter(vo -> ids.contains(vo.getId())).collect(Collectors.toList());
+
+        Page<SysMenuVo> resultPage = new Page<>(page.getCurrent(),page.getSize());
+        resultPage.setRecords(voList);
+        resultPage.setTotal(page.getTotal());
+        return PageInfo.PageInfo(resultPage);
+    }
+
+    @Override
+    public List<SysMenuVo> allShowList() {
+        return getByParentId(null,null,true,null,null);
+    }
+
+    @Override
+    public List<SysMenuVo> getByUserId(Long userId) {
+        SysUser user = userService.getById(userId);
+        List<SysRoleMenu> roleMenus  = roleMenuService.getByRoleId(user.getRoleId());
+        if(roleMenus == null || roleMenus.size() <=0){
+            return new ArrayList<>();
+        }
+        List<SysMenu> menuList  = this.getListByUserId(userId);
+        List<Long> menuIds = menuList.parallelStream().map(SysMenu::getId).collect(Collectors.toList());
+        //menuList.forEach(sysMenu -> setMenuIds(menuIds,sysMenu));
+        return  getByRoleId(menuIds, user.getRoleId());
+    }
+
+
+//    private void setMenuIds( List<Long> menuIds ,SysMenu sysMenu){
+//        if(sysMenu.getParentId()!= null && !menuIds.contains(sysMenu.getParentId())) {
+//            menuIds.add(sysMenu.getParentId());
+//            SysMenu menu = this.getById(sysMenu.getParentId());
+//            this.setMenuIds(menuIds,menu);
+//        }
+//    }
+
+    @Override
+    public List<SysMenuVo> getByRoleId(List<Long> menuIds ,Long roleId) {
+        if(menuIds == null){
+            List<SysRoleMenu> roleMenus  = roleMenuService.getByRoleId(roleId);
+            if(roleMenus == null || roleMenus.size() <=0){
+                return new ArrayList<>();
+            }
+            menuIds = roleMenus.parallelStream().map(SysRoleMenu::getMenuId).collect(Collectors.toList());
+        }
+        return getByParentId(null,null,true,menuIds,2);
+    }
+
+    //递归设置menuTree
+    private List<SysMenuVo> getByParentId(Long parentId, List<SysMenu> list, boolean show ,List<Long> menuIds,Integer notType){
+        if(list == null){
+            LambdaQueryWrapper<SysMenu> wrapper = new LambdaQueryWrapper<>();
+            if(show){
+                wrapper.eq(SysMenu::getIsShow,1);
+            }
+            if(parentId == null){
+                wrapper.isNull(SysMenu::getParentId);
+            }else {
+                wrapper.eq(SysMenu::getParentId,parentId);
+            }
+            if(menuIds != null){
+                wrapper.in(SysMenu::getId,menuIds);
+            }
+            if(notType!=null){
+                wrapper.notIn(SysMenu::getType, Arrays.asList(notType));
+            }
+            wrapper.orderByAsc(SysMenu::getSort);
+            list = this.list(wrapper);
+        }
+        List<SysMenuVo> sysMenuVos = new ArrayList<>();
+        if(list.size() <=0){
+            return sysMenuVos;
+        }
+        for (SysMenu record : list) {
+            SysMenuVo vo = new SysMenuVo();
+            BeanUtils.copyProperties(record,vo);
+            Meta meta = new Meta();
+            meta.setIcon(record.getIcon());
+            meta.setTitle(record.getName());
+            meta.setHideMenu(record.getHideMenu() == 1);
+            meta.setFrameSrc(null);
+            vo.setMeta(meta);
+
+            sysMenuVos.add(vo);
+            List<SysMenuVo> children = getByParentId(record.getId(),null,show,menuIds,notType);
+            vo.setChildren(children);
+        }
+        return sysMenuVos;
+    }
+
+
+    @Override
+    public List<SysMenu> getButtonByUserId(Long userId) {
+        SysUser user = userService.getById(userId);
+        List<SysRoleMenu> roleMenus  = roleMenuService.getByRoleId(user.getRoleId());
+        if(roleMenus == null || roleMenus.size() <=0){
+            return new ArrayList<>();
+        }
+        List<Long> menuId = roleMenus.parallelStream().map(SysRoleMenu::getMenuId).collect(Collectors.toList());
+        LambdaQueryWrapper<SysMenu> wrapper = new LambdaQueryWrapper<>();
+        wrapper.in(SysMenu::getId,menuId);
+        wrapper.eq(SysMenu::getType,2);
+        return this.list(wrapper);
+    }
+
+    @Override
+    public HashMap<Long, SysMenu> getByIds(List<Long> menuIds) {
+        HashMap<Long, SysMenu> map = new HashMap<>();
+        if(menuIds.size() >0){
+            LambdaQueryWrapper<SysMenu> wrapper = new LambdaQueryWrapper<>();
+            wrapper.in(SysMenu::getId,menuIds);
+            List<SysMenu> list = this.list(wrapper);
+            list.forEach(entity-> map.put(entity.getId(),entity) );
+        }
+
+        return map;
+    }
+
+    @Override
+    public List<Long> getMenuIdsByRoleId(Long roleId) {
+        List<SysRoleMenu> roleMenus = roleMenuService.getByRoleId(roleId);
+        if(roleMenus.size() <=0){
+            return new ArrayList<>();
+        }
+        Set<Long> menuIds = roleMenus.stream().map(SysRoleMenu::getMenuId).collect(Collectors.toSet());
+        HashMap<Long, SysMenu> menuMap = this.getByIds(new ArrayList<>(menuIds));
+
+        Set<Long> setParentIds = new HashSet<>();
+        List<Long> returnMenuIds = new ArrayList<>();
+        List<Long> delMenuIds = new ArrayList<>();
+        List<Long> delParentIds = new ArrayList<>();
+        //如果父菜单不包含全部子菜单,将父菜单移除,不返回前端
+        for (Long menuId : menuMap.keySet()) {
+            Long parentId = menuMap.get(menuId).getParentId();
+            if(parentId != null && menuMap.containsKey(parentId) && !setParentIds.contains(parentId)){
+                setParentIds.add(parentId);
+                List<SysMenu> menuList = this.getBySonById(parentId);
+                for (SysMenu sysMenu : menuList) {
+                    if(!menuMap.containsKey(sysMenu.getId()) ){
+                        delMenuIds.add(parentId);
+                    }
+                }
+            }
+        }
+        for (Long delMenuId : delMenuIds) {
+            Long parentId = menuMap.get(delMenuId).getParentId();
+            if(parentId!= null && !delMenuIds.contains(parentId)){
+                delParentIds.add(parentId);
+            }
+        }
+
+        for (Long menuId : menuIds) {
+            if(!delMenuIds.contains(menuId) && !delParentIds.contains(menuId)){
+                returnMenuIds.add(menuId);
+            }
+        }
+
+        return returnMenuIds;
+    }
+
+    private List<SysMenu> getBySonById(Long parentId) {
+        LambdaQueryWrapper<SysMenu> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(SysMenu::getParentId,parentId);
+        return  this.list(wrapper);
+    }
+
+    @Override
+    public void setRoleAndMenuCache(SysRole role, SysUser sysUser) {
+        //设置redis role
+        String roleType = role.getRoleType();
+        List<String> roleList = Collections.singletonList(roleType);
+        redisUtil.set(String.format(RedisKey.MANAGE_ROLE_USER,sysUser.getId()), JSONObject.toJSONString(roleList));
+        //设置redis perm
+        List<SysMenu> menus = this.getListByUserId(sysUser.getId());
+        List<String> menuList = menus.parallelStream().map(SysMenu::getPerms).collect(Collectors.toList());
+        redisUtil.set(String.format(RedisKey.MANAGE_PERM_USER,sysUser.getId()), JSONObject.toJSONString(menuList));
+    }
+}

+ 101 - 0
src/main/java/com/fdkankan/sale/service/impl/SysRoleMenuServiceImpl.java

@@ -0,0 +1,101 @@
+package com.fdkankan.sale.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.sale.entity.SysMenu;
+import com.fdkankan.sale.entity.SysRole;
+import com.fdkankan.sale.entity.SysRoleMenu;
+import com.fdkankan.sale.mapper.ISysRoleMenuMapper;
+import com.fdkankan.sale.service.ISysMenuService;
+import com.fdkankan.sale.service.ISysRoleMenuService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.sale.service.ISysRoleService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-09
+ */
+@Service
+public class SysRoleMenuServiceImpl extends ServiceImpl<ISysRoleMenuMapper, SysRoleMenu> implements ISysRoleMenuService {
+    @Autowired
+    ISysMenuService sysMenuService;
+    @Autowired
+    ISysRoleService sysRoleService;
+
+    @Override
+    public void deleteByRoleId(Long roleId) {
+        LambdaQueryWrapper<SysRoleMenu> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(SysRoleMenu::getRoleId,roleId);
+        this.remove(wrapper);
+    }
+
+    @Override
+    public void saveBatchByRoleId(Long roleId, List<Long> menuIds) {
+        List<SysRoleMenu> sysMenus = new ArrayList<>();
+        HashMap<Long, SysMenu> menuMap = new HashMap<>();
+        List<SysMenu> list = sysMenuService.list();
+        list.forEach(entity -> menuMap.put(entity.getId(),entity));
+
+        HashSet<Long> menuIdsSet = new HashSet<>();
+        this.getAllMenuIds(menuMap,menuIdsSet,menuIds);
+        menuIdsSet.addAll(menuIds);
+        for (Long menuId : menuIdsSet) {
+            SysRoleMenu roleMenu = new SysRoleMenu();
+            roleMenu.setRoleId(roleId);
+            roleMenu.setMenuId(menuId);
+            sysMenus.add(roleMenu);
+        }
+        this.saveBatch(sysMenus);
+    }
+
+    private void getAllMenuIds(HashMap<Long, SysMenu> menuMap, HashSet<Long> menuIdsSet, List<Long> menuIds ) {
+        List<Long> parentIds = new ArrayList<>();
+        for (Long menuId : menuIds) {
+            Long parentId = menuMap.get(menuId).getParentId();
+            if(parentId != null && ! menuIds.contains(parentId) ){
+                menuIdsSet.add(parentId);
+                parentIds.add(parentId);
+            }
+        }
+        if(parentIds.size() >0){
+            getAllMenuIds(menuMap,menuIdsSet,parentIds);
+        }
+    }
+
+
+    @Override
+    public List<SysRoleMenu> getByRoleId(Long roleId) {
+        SysRole role = sysRoleService.getById(roleId);
+        if(role == null || role.getStatus() == 0){
+            return new ArrayList<>();
+        }
+        LambdaQueryWrapper<SysRoleMenu> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(SysRoleMenu::getRoleId,roleId);
+        return this.list(wrapper);
+    }
+
+    @Override
+    public void deleteByMenuId(Long menuId) {
+        LambdaQueryWrapper<SysRoleMenu> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(SysRoleMenu::getMenuId,menuId);
+        this.remove(wrapper);
+    }
+
+    @Override
+    public void addByMenuId(Long menuId, Long roleId) {
+        SysRoleMenu roleMenu = new SysRoleMenu();
+        roleMenu.setRoleId(roleId);
+        roleMenu.setMenuId(menuId);
+        this.save(roleMenu);
+    }
+}

+ 86 - 0
src/main/java/com/fdkankan/sale/service/impl/SysRoleServiceImpl.java

@@ -0,0 +1,86 @@
+package com.fdkankan.sale.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.sale.common.PageInfo;
+import com.fdkankan.sale.common.ResultCode;
+import com.fdkankan.sale.entity.SysRole;
+import com.fdkankan.sale.entity.SysUser;
+import com.fdkankan.sale.exception.BusinessException;
+import com.fdkankan.sale.mapper.ISysRoleMapper;
+import com.fdkankan.sale.service.ISysMenuService;
+import com.fdkankan.sale.service.ISysRoleMenuService;
+import com.fdkankan.sale.service.ISysRoleService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.sale.service.ISysUserService;
+import com.fdkankan.sale.vo.request.SysRoleMenuParam;
+import com.fdkankan.sale.vo.request.SysRoleParam;
+import com.fdkankan.sale.vo.response.SysRoleVo;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.util.Date;
+import java.util.HashMap;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-09
+ */
+@Service
+public class SysRoleServiceImpl extends ServiceImpl<ISysRoleMapper, SysRole> implements ISysRoleService {
+
+    @Autowired
+    ISysUserService sysUserService;
+    @Autowired
+    ISysRoleMenuService roleMenuService;
+    @Autowired
+    ISysMenuService sysMenuService;
+
+    @Override
+    public void addOrUpdate(SysRoleParam param) {
+        SysRole sysRole = new SysRole();
+        BeanUtils.copyProperties(param,sysRole);
+        sysRole.setUpdateTime(null);
+        this.saveOrUpdate(sysRole);
+    }
+
+    @Override
+    public PageInfo pageList(SysRoleParam param) {
+        HashMap<Long,Long> countMap = sysUserService.groupByRoleId();
+        Page<SysRoleVo> page = this.getBaseMapper().pageList(new Page<>(param.getPageNum(),param.getPageSize()),param);
+        for (SysRoleVo record : page.getRecords()) {
+            record.setAdminCount(countMap.get(record.getId()) == null ? 0 : countMap.get(record.getId()));
+        }
+        return PageInfo.PageInfo(page);
+    }
+
+    @Override
+    public void delete(Long id) {
+        if(StringUtils.isEmpty(id)){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        LambdaQueryWrapper<SysUser> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(SysUser::getRoleId,id);
+        long count = sysUserService.count(wrapper);
+        if(count >0){
+            throw new BusinessException(ResultCode.DEL_ROLE_ERROR);
+        }
+        roleMenuService.deleteByRoleId(id);
+        this.removeById(id);
+    }
+
+    @Override
+    public void giveMenu(SysRoleMenuParam param) {
+        if(param.getRoleId() == null){
+            throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
+        }
+        roleMenuService.deleteByRoleId(param.getRoleId());
+        roleMenuService.saveBatchByRoleId(param.getRoleId(),param.getMenuIds());
+    }
+}

+ 152 - 0
src/main/java/com/fdkankan/sale/service/impl/SysUserServiceImpl.java

@@ -0,0 +1,152 @@
+package com.fdkankan.sale.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.common.util.Base64Converter;
+import com.fdkankan.common.util.SecurityUtil;
+import com.fdkankan.redis.util.RedisUtil;
+import com.fdkankan.sale.common.PageInfo;
+import com.fdkankan.sale.common.ResultCode;
+import com.fdkankan.sale.entity.SysRole;
+import com.fdkankan.sale.entity.SysUser;
+import com.fdkankan.sale.exception.BusinessException;
+import com.fdkankan.sale.mapper.ISysUserMapper;
+import com.fdkankan.sale.service.ISysMenuService;
+import com.fdkankan.sale.service.ISysRoleService;
+import com.fdkankan.sale.service.ISysUserService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.sale.vo.request.SysUserParam;
+import com.fdkankan.sale.vo.response.ManageLoginResponse;
+import com.fdkankan.sale.vo.response.SysRoleVo;
+import com.fdkankan.sale.vo.response.SysUserVo;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-09
+ */
+@Service
+public class SysUserServiceImpl extends ServiceImpl<ISysUserMapper, SysUser> implements ISysUserService {
+
+    @Autowired
+    private ISysRoleService roleService;
+    @Autowired
+    private ISysMenuService sysMenuService;
+    @Autowired
+    private RedisUtil redisUtil;
+
+
+    @Override
+    public SysUser getByUserName(String userName) {
+        LambdaQueryWrapper<SysUser> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(SysUser::getUserName,userName);
+        List<SysUser> list = this.list(wrapper);
+        if(list == null || list.size() <=0){
+            return null;
+        }
+        return list.get(0);
+    }
+
+
+    @Override
+    public ManageLoginResponse getUserByUserNameAndPassword(String userName, String password) {
+        LambdaQueryWrapper<SysUser> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(SysUser::getUserName,userName)
+                .eq(SysUser::getPassword,password);
+        List<SysUser> list = this.list(wrapper);
+        if(list == null || list.size() <=0){
+            return null;
+        }
+        SysUser sysUser = list.get(0);
+        SysRole role = roleService.getById(sysUser.getRoleId());
+        ManageLoginResponse loginVO = new ManageLoginResponse();
+        BeanUtils.copyProperties(sysUser,loginVO);
+        loginVO.setRoleId(role.getId());
+        loginVO.setRoleName(role.getRoleName());
+
+        sysMenuService.setRoleAndMenuCache(role,sysUser);
+
+        return loginVO;
+    }
+
+    @Override
+    public void addOrUpdate(SysUserParam param) {
+        if(param.getId() == null){
+            SysUser user = this.getByUserName(param.getUserName());
+            if(user !=null){
+                throw new BusinessException(ResultCode.USER_EXIST);
+            }
+        }
+        SysUser sysUser = new SysUser();
+        BeanUtils.copyProperties(param,sysUser);
+        if(!StringUtils.isEmpty(param.getPassword())){
+            String passwordMd5 = SecurityUtil.MD52(Base64Converter.decode(Base64Converter.subText(param.getPassword())));
+            sysUser.setPassword(passwordMd5);
+        }
+        if(!StringUtils.isEmpty(param.getNewPassword())){
+            String passwordMd5 = SecurityUtil.MD52(Base64Converter.decode(Base64Converter.subText(param.getNewPassword())));
+            sysUser.setPassword(passwordMd5);
+        }
+        if(!StringUtils.isEmpty(param.getOldPassword()) && param.getId() != null){
+            String passwordMd5 = SecurityUtil.MD52(Base64Converter.decode(Base64Converter.subText(param.getOldPassword())));
+            SysUser byId = this.getById(param.getId());
+            if(!byId.getPassword().equals(passwordMd5)){
+                throw new BusinessException(ResultCode.OLD_PASSWORD_ERROR);
+            }
+        }
+        this.saveOrUpdate(sysUser);
+    }
+
+    @Override
+    public PageInfo pageList(SysUserParam param) {
+        Page<SysUserVo> page = this.getBaseMapper().pageList(new Page<>(param.getPageNum(),param.getPageSize()),param);
+        return PageInfo.PageInfo(page);
+    }
+
+    @Override
+    public HashMap<Long, Long> groupByRoleId() {
+        HashMap<Long, Long>  map = new HashMap<>();
+        List<SysRoleVo> roleVos = this.getBaseMapper().groupByRoleId();
+        for (SysRoleVo roleVo : roleVos) {
+            map.put(roleVo.getId(),roleVo.getAdminCount());
+        }
+        return map;
+    }
+
+    @Override
+    public HashMap<Long, SysUser> getByIds(Set<Long> sysUserIds) {
+        HashMap<Long, SysUser> map = new HashMap<>();
+        if(sysUserIds.size() >0){
+            List<SysUser> sysUsers = this.listByIds(sysUserIds);
+            sysUsers.forEach(entity-> map.put(entity.getId(),entity));
+        }
+        return map;
+    }
+
+    @Override
+    public void saveByRedisKey(String redisKey) {
+        String value = redisUtil.get(redisKey);
+        if(StringUtils.isBlank(value)){
+            return;
+        }
+        ManageLoginResponse manageLoginResponse = JSONObject.parseObject(value, ManageLoginResponse.class);
+
+        SysUser user = new SysUser();
+        BeanUtils.copyProperties(manageLoginResponse,user);
+        user.setRoleId(null);
+        this.saveOrUpdate(user);
+
+    }
+}

+ 11 - 0
src/main/java/com/fdkankan/sale/vo/request/PartParam.java

@@ -0,0 +1,11 @@
+package com.fdkankan.sale.vo.request;
+
+import com.fdkankan.sale.common.RequestBase;
+import lombok.Data;
+
+@Data
+public class PartParam extends RequestBase {
+
+    private Integer cameraType;
+    private String partName;
+}

+ 11 - 0
src/main/java/com/fdkankan/sale/vo/request/SysRoleMenuParam.java

@@ -0,0 +1,11 @@
+package com.fdkankan.sale.vo.request;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SysRoleMenuParam {
+    private Long roleId;
+    private List<Long> menuIds;
+}

+ 14 - 0
src/main/java/com/fdkankan/sale/vo/request/SysRoleParam.java

@@ -0,0 +1,14 @@
+package com.fdkankan.sale.vo.request;
+
+import com.fdkankan.sale.common.RequestBase;
+import lombok.Data;
+
+@Data
+public class SysRoleParam extends RequestBase {
+    private Long id;
+    private String roleName;
+    private String roleType ="manage";
+    private String description;
+    private Long createUserId;
+    private Integer status;
+}

+ 18 - 0
src/main/java/com/fdkankan/sale/vo/request/SysUserParam.java

@@ -0,0 +1,18 @@
+package com.fdkankan.sale.vo.request;
+
+import com.fdkankan.sale.common.RequestBase;
+import lombok.Data;
+
+@Data
+public class SysUserParam extends RequestBase {
+    private Long id;
+    private String userName;
+    private String password;
+    private String nickName;
+    private Long roleId;
+    private Long createUserId;
+    private Integer status;
+    private String newPassword;
+    private String oldPassword;
+
+}

+ 18 - 0
src/main/java/com/fdkankan/sale/vo/response/ManageLoginResponse.java

@@ -0,0 +1,18 @@
+package com.fdkankan.sale.vo.response;
+
+import lombok.Data;
+
+@Data
+public class ManageLoginResponse {
+    private Long id;
+    private String userName;
+    private String nickName;
+    private String token;
+    private Long roleId;
+    private String roleName;
+    /**
+     * 是否禁用 0禁用,1启用
+     */
+    private Integer status;
+
+}

+ 14 - 0
src/main/java/com/fdkankan/sale/vo/response/Meta.java

@@ -0,0 +1,14 @@
+package com.fdkankan.sale.vo.response;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class Meta implements Serializable {
+    private Boolean affix = false;
+    private String icon;
+    private String title;
+    private Boolean hideMenu;
+    private String frameSrc;
+}

+ 13 - 0
src/main/java/com/fdkankan/sale/vo/response/SysMenuVo.java

@@ -0,0 +1,13 @@
+package com.fdkankan.sale.vo.response;
+
+import com.fdkankan.sale.entity.SysMenu;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class SysMenuVo extends SysMenu {
+    private Meta meta;
+    private List<SysMenuVo> children = new ArrayList<>();
+}

+ 10 - 0
src/main/java/com/fdkankan/sale/vo/response/SysRoleVo.java

@@ -0,0 +1,10 @@
+package com.fdkankan.sale.vo.response;
+
+import com.fdkankan.sale.entity.SysRole;
+import lombok.Data;
+
+@Data
+public class SysRoleVo extends SysRole {
+    private String createUserName;
+    private Long adminCount = 0L;
+}

+ 16 - 0
src/main/java/com/fdkankan/sale/vo/response/SysUserVo.java

@@ -0,0 +1,16 @@
+package com.fdkankan.sale.vo.response;
+
+import lombok.Data;
+
+@Data
+public class SysUserVo {
+    private Long id;
+    private String userName;
+    private String nickName;
+    private Long roleId;
+    private String roleName;
+    private String createUserId;
+    private String createUserName;
+    private String createTime;
+    private Integer status;
+}

+ 0 - 1
src/main/resources/bootstrap-dev.yml

@@ -17,7 +17,6 @@ spring:
             group: DEFAULT_GROUP
             refresh: true
 
-
       discovery:
         server-addr: ${spring.cloud.nacos.config.server-addr}
         namespace: ${spring.cloud.nacos.config.namespace}

+ 5 - 0
src/main/resources/mapper/sale/PartLogMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.sale.mapper.IPartLogMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/sale/PartMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.sale.mapper.IPartMapper">
+
+</mapper>

+ 12 - 0
src/main/resources/mapper/sale/SysMenuMapper.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.sale.mapper.ISysMenuMapper">
+
+    <select id="getListByUserId" resultType="com.fdkankan.sale.entity.SysMenu" >
+        select  * from  sys_menu m
+                            left join sys_role_menu rm on m.id = rm.menu_id
+                            left join sys_role r on rm.role_id = r.id
+                            left join sys_user u on r.id = u.role_id
+        where u.id = #{userId}
+    </select>
+</mapper>

+ 16 - 0
src/main/resources/mapper/sale/SysRoleMapper.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.sale.mapper.ISysRoleMapper">
+
+    <select id="pageList" resultType="com.fdkankan.sale.vo.response.SysRoleVo" parameterType="com.fdkankan.sale.vo.request.SysRoleParam">
+        select  r.* ,u.nick_name as createUserName  from sys_role r
+        left join sys_user u on r.create_user_id = u.id
+        <where>
+            and r.rec_status = 'A'
+            <if test="param.roleName != null and param.roleName!=''">
+                and r.role_name like concat('%',#{param.roleName},'%')
+            </if>
+        </where>
+        order by ${param.orderBy} ${param.sortBy}
+    </select>
+</mapper>

+ 5 - 0
src/main/resources/mapper/sale/SysRoleMenuMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.sale.mapper.ISysRoleMenuMapper">
+
+</mapper>

+ 28 - 0
src/main/resources/mapper/sale/SysUserMapper.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.sale.mapper.ISysUserMapper">
+
+    <select id="pageList" resultType="com.fdkankan.sale.vo.response.SysUserVo" parameterType="com.fdkankan.sale.vo.request.SysUserParam">
+        select  u.*,r.id as roleId,r.role_name as roleName ,u2.id as createUserId,u2.nick_name as createUserName
+        from sys_user u
+        left join sys_role r on u.role_id = r.id
+        left join sys_user u2 on u.create_user_id = u2.id
+        <where>
+            and u.rec_status = 'A'
+            <if test="param.userName != null and param.userName!=''">
+                and u.user_name like concat('%',#{param.userName},'%')
+            </if>
+            <if test="param.nickName != null and param.nickName!=''">
+                and u.nick_name like concat('%',#{param.nickName},'%')
+            </if>
+            <if test="param.roleId != null ">
+                and u.role_id  = #{param.roleId}
+            </if>
+        </where>
+        order by ${param.orderBy} ${param.sortBy}
+    </select>
+
+    <select id="groupByRoleId" resultType="com.fdkankan.sale.vo.response.SysRoleVo">
+        select role_id as id , count(id) as adminCount from sys_user where rec_status = 'A' group by role_id
+    </select>
+</mapper>