From 4d1dfebacd373afabae2c1385ff2282a915dd0ae Mon Sep 17 00:00:00 2001 From: zhenghao <1321288662@qq.com> Date: Thu, 10 Feb 2022 20:05:00 +0800 Subject: [PATCH 01/10] =?UTF-8?q?=E5=BA=97=E5=91=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../passport/MemberBuyerController.java | 21 +- config/application.yml | 2 +- .../main/java/cn/lili/cache/CachePrefix.java | 8 + .../java/cn/lili/common/enums/ResultCode.java | 15 +- .../GlobalControllerExceptionHandler.java | 12 +- .../cn/lili/common/security/AuthUser.java | 15 + .../lili/common/security/token/TokenUtil.java | 8 +- .../lili/modules/member/entity/dos/Clerk.java | 68 ++++ .../member/entity/dos/StoreClerkRole.java | 34 ++ .../member/entity/dos/StoreDepartment.java | 37 ++ .../entity/dos/StoreDepartmentRole.java | 34 ++ .../modules/member/entity/dos/StoreMenu.java | 48 +++ .../member/entity/dos/StoreMenuRole.java | 35 ++ .../modules/member/entity/dos/StoreRole.java | 36 ++ .../member/entity/dto/ClerkAddDTO.java | 64 ++++ .../member/entity/dto/ClerkEditDTO.java | 46 +++ .../member/entity/dto/ClerkOperationDTO.java | 48 +++ .../member/entity/dto/ClerkQueryDTO.java | 41 +++ .../modules/member/entity/vo/ClerkVO.java | 40 +++ .../member/entity/vo/StoreDepartmentVO.java | 28 ++ .../modules/member/entity/vo/StoreMenuVO.java | 45 +++ .../member/entity/vo/StoreUserMenuVO.java | 29 ++ .../modules/member/mapper/ClerkMapper.java | 34 ++ .../member/mapper/StoreClerkRoleMapper.java | 13 + .../member/mapper/StoreDepartmentMapper.java | 14 + .../mapper/StoreDepartmentRoleMapper.java | 14 + .../member/mapper/StoreMenuMapper.java | 44 +++ .../member/mapper/StoreMenuRoleMapper.java | 14 + .../member/mapper/StoreRoleMapper.java | 15 + .../modules/member/service/ClerkService.java | 99 ++++++ .../modules/member/service/MemberService.java | 25 +- .../member/service/StoreClerkRoleService.java | 41 +++ .../service/StoreDepartmentRoleService.java | 38 +++ .../service/StoreDepartmentService.java | 40 +++ .../member/service/StoreMenuRoleService.java | 57 ++++ .../member/service/StoreMenuService.java | 74 ++++ .../member/service/StoreRoleService.java | 56 +++ .../member/serviceimpl/ClerkServiceImpl.java | 320 ++++++++++++++++++ .../member/serviceimpl/MemberServiceImpl.java | 45 ++- .../StoreClerkRoleServiceImpl.java | 52 +++ .../StoreDepartmentRoleServiceImpl.java | 49 +++ .../StoreDepartmentServiceImpl.java | 112 ++++++ .../serviceimpl/StoreMenuRoleServiceImpl.java | 104 ++++++ .../serviceimpl/StoreMenuServiceImpl.java | 166 +++++++++ .../serviceimpl/StoreRoleServiceImpl.java | 106 ++++++ .../member/token/StoreTokenGenerate.java | 104 +++++- .../store/serviceimpl/StoreServiceImpl.java | 15 + .../system/token/ManagerTokenGenerate.java | 1 - .../passport/StorePassportController.java | 11 +- .../permission/ClerkStoreController.java | 155 +++++++++ .../permission/StoreDepartmentController.java | 70 ++++ .../StoreDepartmentRoleController.java | 42 +++ .../permission/StoreMenuController.java | 49 +++ .../permission/StoreMenuRoleController.java | 43 +++ .../permission/StoreRoleController.java | 65 ++++ .../security/StoreAuthenticationFilter.java | 78 ++++- 56 files changed, 2836 insertions(+), 43 deletions(-) create mode 100644 framework/src/main/java/cn/lili/modules/member/entity/dos/Clerk.java create mode 100644 framework/src/main/java/cn/lili/modules/member/entity/dos/StoreClerkRole.java create mode 100644 framework/src/main/java/cn/lili/modules/member/entity/dos/StoreDepartment.java create mode 100644 framework/src/main/java/cn/lili/modules/member/entity/dos/StoreDepartmentRole.java create mode 100644 framework/src/main/java/cn/lili/modules/member/entity/dos/StoreMenu.java create mode 100644 framework/src/main/java/cn/lili/modules/member/entity/dos/StoreMenuRole.java create mode 100644 framework/src/main/java/cn/lili/modules/member/entity/dos/StoreRole.java create mode 100644 framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkAddDTO.java create mode 100644 framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkEditDTO.java create mode 100644 framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkOperationDTO.java create mode 100644 framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkQueryDTO.java create mode 100644 framework/src/main/java/cn/lili/modules/member/entity/vo/ClerkVO.java create mode 100644 framework/src/main/java/cn/lili/modules/member/entity/vo/StoreDepartmentVO.java create mode 100644 framework/src/main/java/cn/lili/modules/member/entity/vo/StoreMenuVO.java create mode 100644 framework/src/main/java/cn/lili/modules/member/entity/vo/StoreUserMenuVO.java create mode 100644 framework/src/main/java/cn/lili/modules/member/mapper/ClerkMapper.java create mode 100644 framework/src/main/java/cn/lili/modules/member/mapper/StoreClerkRoleMapper.java create mode 100644 framework/src/main/java/cn/lili/modules/member/mapper/StoreDepartmentMapper.java create mode 100644 framework/src/main/java/cn/lili/modules/member/mapper/StoreDepartmentRoleMapper.java create mode 100644 framework/src/main/java/cn/lili/modules/member/mapper/StoreMenuMapper.java create mode 100644 framework/src/main/java/cn/lili/modules/member/mapper/StoreMenuRoleMapper.java create mode 100644 framework/src/main/java/cn/lili/modules/member/mapper/StoreRoleMapper.java create mode 100644 framework/src/main/java/cn/lili/modules/member/service/ClerkService.java create mode 100644 framework/src/main/java/cn/lili/modules/member/service/StoreClerkRoleService.java create mode 100644 framework/src/main/java/cn/lili/modules/member/service/StoreDepartmentRoleService.java create mode 100644 framework/src/main/java/cn/lili/modules/member/service/StoreDepartmentService.java create mode 100644 framework/src/main/java/cn/lili/modules/member/service/StoreMenuRoleService.java create mode 100644 framework/src/main/java/cn/lili/modules/member/service/StoreMenuService.java create mode 100644 framework/src/main/java/cn/lili/modules/member/service/StoreRoleService.java create mode 100644 framework/src/main/java/cn/lili/modules/member/serviceimpl/ClerkServiceImpl.java create mode 100644 framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreClerkRoleServiceImpl.java create mode 100644 framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreDepartmentRoleServiceImpl.java create mode 100644 framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreDepartmentServiceImpl.java create mode 100644 framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreMenuRoleServiceImpl.java create mode 100644 framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreMenuServiceImpl.java create mode 100644 framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreRoleServiceImpl.java create mode 100644 seller-api/src/main/java/cn/lili/controller/permission/ClerkStoreController.java create mode 100644 seller-api/src/main/java/cn/lili/controller/permission/StoreDepartmentController.java create mode 100644 seller-api/src/main/java/cn/lili/controller/permission/StoreDepartmentRoleController.java create mode 100644 seller-api/src/main/java/cn/lili/controller/permission/StoreMenuController.java create mode 100644 seller-api/src/main/java/cn/lili/controller/permission/StoreMenuRoleController.java create mode 100644 seller-api/src/main/java/cn/lili/controller/permission/StoreRoleController.java diff --git a/buyer-api/src/main/java/cn/lili/controller/passport/MemberBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/passport/MemberBuyerController.java index 7f3b3789..8ffb5a5f 100644 --- a/buyer-api/src/main/java/cn/lili/controller/passport/MemberBuyerController.java +++ b/buyer-api/src/main/java/cn/lili/controller/passport/MemberBuyerController.java @@ -1,6 +1,12 @@ package cn.lili.controller.passport; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.AuthUser; +import cn.lili.common.security.context.UserContext; import cn.lili.common.security.enums.UserEnums; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.member.entity.dos.Member; @@ -35,6 +41,8 @@ public class MemberBuyerController { private SmsUtil smsUtil; @Autowired private VerificationService verificationService; + @Autowired + private Cache cache; @ApiOperation(value = "登录接口") @@ -108,8 +116,11 @@ public class MemberBuyerController { //校验短信验证码是否正确 smsUtil.verifyCode(mobile, VerificationEnums.FIND_USER, uuid, code); //校验是否通过手机号可获取会员,存在则将会员信息存入缓存,有效时间3分钟 - memberService.findByMobile(uuid, mobile); - + Member member = memberService.findByMobile(mobile); + if (member == null) { + throw new ServiceException(ResultCode.USER_NOT_PHONE); + } + cache.put(CachePrefix.FIND_MOBILE + uuid, mobile, 300L); return ResultUtil.success(); } @@ -139,7 +150,11 @@ public class MemberBuyerController { @PutMapping("/modifyPass") public ResultMessage modifyPass(@NotNull(message = "旧密码不能为空") @RequestParam String password, @NotNull(message = "新密码不能为空") @RequestParam String newPassword) { - return ResultUtil.data(memberService.modifyPass(password, newPassword)); + AuthUser tokenUser = UserContext.getCurrentUser(); + if (tokenUser == null) { + throw new ServiceException(ResultCode.USER_NOT_LOGIN); + } + return ResultUtil.data(memberService.modifyPass(tokenUser.getId(), password, newPassword)); } diff --git a/config/application.yml b/config/application.yml index 796fb0ee..5211d997 100644 --- a/config/application.yml +++ b/config/application.yml @@ -69,7 +69,7 @@ spring: default-datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://192.168.0.116:3306/lilishop?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai + url: jdbc:mysql://192.168.0.116:3306/clerk?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai username: root password: lilishop maxActive: 20 diff --git a/framework/src/main/java/cn/lili/cache/CachePrefix.java b/framework/src/main/java/cn/lili/cache/CachePrefix.java index 27740abe..b7eb68bd 100644 --- a/framework/src/main/java/cn/lili/cache/CachePrefix.java +++ b/framework/src/main/java/cn/lili/cache/CachePrefix.java @@ -473,10 +473,18 @@ public enum CachePrefix { * 用户菜单 */ MENU_USER_ID, + /** + * 用户菜单 + */ + STORE_MENU_USER_ID, /** * 用户菜单 */ USER_MENU, + /** + * 用户菜单 + */ + STORE_USER_MENU, /** * 订单暂时缓存 */ diff --git a/framework/src/main/java/cn/lili/common/enums/ResultCode.java b/framework/src/main/java/cn/lili/common/enums/ResultCode.java index 6b621a35..84203990 100644 --- a/framework/src/main/java/cn/lili/common/enums/ResultCode.java +++ b/framework/src/main/java/cn/lili/common/enums/ResultCode.java @@ -133,7 +133,14 @@ public enum ResultCode { USER_CONNECT_BANDING_ERROR(20023, "当前联合登陆方式,已绑定其他账号,需进行解绑操作"), USER_CONNECT_NOT_EXIST_ERROR(20024, "暂无联合登陆信息,无法实现一键注册功能,请点击第三方登录进行授权"), USER_POINTS_ERROR(20024, "用户积分不足"), - + CLERK_SUPPER(20025, "店主无法操作"), + CLERK_SAVE_ERROR(20026, "店员保存失败"), + CLERK_NOT_FOUND_ERROR(20027, "店员不存在"), + USER_STATUS_ERROR(20028, "用户已禁用"), + CLERK_USER_ERROR(20029, "此账户已经绑定其他店铺"), + CLERK_ALREADY_EXIT_ERROR(20030, "店员已经存在"), + CLERK_DISABLED_ERROR(20031, "店员已禁用"), + CLERK_CURRENT_SUPPER(20032, "无法删除当前登录店员"), /** * 权限 */ @@ -142,6 +149,10 @@ public enum ResultCode { PERMISSION_MENU_ROLE_ERROR(21003, "菜单已绑定角色,请先删除或编辑角色"), PERMISSION_DEPARTMENT_DELETE_ERROR(21004, "部门已经绑定管理员,请先删除或编辑管理员"), PERMISSION_BEYOND_TEN(21005, "最多可以设置10个角色"), + PERMISSION_NOT_FOUND_ERROR(21006, "部门不存在"), + PERMISSION_ROLE_NOT_FOUND_ERROR(21007, "角色不存在"), + PERMISSION_CLERK_BAND_ERROR(21008, "此手机号码已绑定其他店铺 "), + /** * 分销 @@ -378,7 +389,7 @@ public enum ResultCode { STORE_NOT_EXIST(50001, "此店铺不存在"), STORE_NAME_EXIST_ERROR(50002, "店铺名称已存在!"), - STORE_APPLY_DOUBLE_ERROR(50003, "已有店铺,无需重复申请!"), + STORE_APPLY_DOUBLE_ERROR(50003, "已经拥有店铺!"), STORE_NOT_OPEN(50004, "该会员未开通店铺"), STORE_NOT_LOGIN_ERROR(50005, "未登录店铺"), STORE_CLOSE_ERROR(50006, "店铺关闭,请联系管理员"), diff --git a/framework/src/main/java/cn/lili/common/exception/GlobalControllerExceptionHandler.java b/framework/src/main/java/cn/lili/common/exception/GlobalControllerExceptionHandler.java index c7ad4bc8..a9715228 100644 --- a/framework/src/main/java/cn/lili/common/exception/GlobalControllerExceptionHandler.java +++ b/framework/src/main/java/cn/lili/common/exception/GlobalControllerExceptionHandler.java @@ -14,10 +14,11 @@ import org.springframework.web.bind.annotation.RestControllerAdvice; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import javax.validation.ConstraintViolationException; import java.util.List; /** - * 全局异常异常处理 + * 异常处理 * * @author Chopper */ @@ -74,6 +75,15 @@ public class GlobalControllerExceptionHandler { return ResultUtil.error(ResultCode.ERROR.code(), errorMsg); } + @ExceptionHandler(ConstraintViolationException.class) + @ResponseStatus(value = HttpStatus.BAD_REQUEST) + public ResultMessage constraintExceptionHandler(HttpServletRequest request, final Exception e, HttpServletResponse response) { + + log.error("全局异常[RuntimeException]:", e); + + return ResultUtil.error(001, e.getMessage()); + } + @ExceptionHandler(RuntimeException.class) @ResponseStatus(value = HttpStatus.BAD_REQUEST) public ResultMessage runtimeExceptionHandler(HttpServletRequest request, final Exception e, HttpServletResponse response) { diff --git a/framework/src/main/java/cn/lili/common/security/AuthUser.java b/framework/src/main/java/cn/lili/common/security/AuthUser.java index 7364421f..b7bc78cb 100644 --- a/framework/src/main/java/cn/lili/common/security/AuthUser.java +++ b/framework/src/main/java/cn/lili/common/security/AuthUser.java @@ -46,6 +46,11 @@ public class AuthUser implements Serializable { * storeId */ private String storeId; + /** + * 如果角色是商家,则存在此店铺id字段 + * clerkId + */ + private String clerkId; /** * 如果角色是商家,则存在此店铺名称字段 @@ -71,5 +76,15 @@ public class AuthUser implements Serializable { this.role = manager; this.isSuper = isSuper; this.nickName = nickName; + this.clerkId = clerkId; + } + + public AuthUser(String username, String id, UserEnums manager, String nickName, Boolean isSuper, String clerkId) { + this.username = username; + this.id = id; + this.role = manager; + this.isSuper = isSuper; + this.nickName = nickName; + this.clerkId = clerkId; } } diff --git a/framework/src/main/java/cn/lili/common/security/token/TokenUtil.java b/framework/src/main/java/cn/lili/common/security/token/TokenUtil.java index 47bd0585..0f92dc6e 100644 --- a/framework/src/main/java/cn/lili/common/security/token/TokenUtil.java +++ b/framework/src/main/java/cn/lili/common/security/token/TokenUtil.java @@ -34,9 +34,9 @@ public class TokenUtil { /** * 构建token * - * @param username 主体 - * @param claim 私有声明 - * @param longTerm 长时间特殊token 如:移动端,微信小程序等 + * @param username 主体 + * @param claim 私有声明 + * @param longTerm 长时间特殊token 如:移动端,微信小程序等 * @param userEnums 用户枚举 * @return TOKEN */ @@ -62,7 +62,7 @@ public class TokenUtil { * 刷新token * * @param oldRefreshToken 刷新token - * @param userEnums 用户枚举 + * @param userEnums 用户枚举 * @return token */ public Token refreshToken(String oldRefreshToken, UserEnums userEnums) { diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/Clerk.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/Clerk.java new file mode 100644 index 00000000..4f900f96 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/Clerk.java @@ -0,0 +1,68 @@ +package cn.lili.modules.member.entity.dos; + +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.modules.member.entity.dto.ClerkAddDTO; +import cn.lili.mybatis.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 店员Model + * + * @author wget + * @title: Clerk + * @projectName lilishop + * @date 2021/12/28 7:39 下午 + */ +@Data +@TableName("li_clerk") +@ApiModel(value = "店员") +@NoArgsConstructor +public class Clerk extends BaseEntity { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "店员名称") + private String clerkName; + + @ApiModelProperty(value = "会员ID") + private String memberId; + + @ApiModelProperty(value = "店铺ID") + private String storeId; + + @ApiModelProperty(value = "所属部门id") + private String departmentId; + + @ApiModelProperty(value = "角色id集合") + private String roleIds; + + @ApiModelProperty(value = "是否是店主", hidden = true) + private Boolean shopkeeper = false; + + @ApiModelProperty(value = "是否是超级管理员 超级管理员/普通管理员") + private Boolean isSuper = false; + + @ApiModelProperty(value = "状态 默认true正常 false禁用") + private Boolean status = true; + + + /** + * 构建店员 + * + * @param clerkAddDTO + */ + public Clerk(ClerkAddDTO clerkAddDTO) { + if (!clerkAddDTO.getRoles().isEmpty()) { + this.roleIds = CharSequenceUtil.join(",", clerkAddDTO.getRoles()); + } + this.memberId = clerkAddDTO.getMemberId(); + this.departmentId = clerkAddDTO.getDepartmentId(); + this.storeId = clerkAddDTO.getStoreId(); + this.clerkName = clerkAddDTO.getUsername(); + + } +} diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreClerkRole.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreClerkRole.java new file mode 100644 index 00000000..4f658d5d --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreClerkRole.java @@ -0,0 +1,34 @@ +package cn.lili.modules.member.entity.dos; + +import cn.lili.mybatis.BaseIdEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 用户角色 + * + * @author Chopper + * @since 2020/11/19 12:18 + */ +@Data +@TableName("li_clerk_role") +@ApiModel(value = "用户角色") +public class StoreClerkRole extends BaseIdEntity { + + @ApiModelProperty(value = "店员唯一id") + private String clerkId; + + @ApiModelProperty(value = "角色唯一id") + private String roleId; + + public StoreClerkRole(String clerkId, String roleId) { + this.clerkId = clerkId; + this.roleId = roleId; + } + + public StoreClerkRole() { + + } +} diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreDepartment.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreDepartment.java new file mode 100644 index 00000000..e2921bbc --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreDepartment.java @@ -0,0 +1,37 @@ +package cn.lili.modules.member.entity.dos; + +import cn.lili.mybatis.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; + + +/** + * 部门 + * + * @author Chopper + * @since 2020/11/19 11:57 + */ +@Data +@TableName("li_store_department") +@ApiModel(value = "店铺部门") +public class StoreDepartment extends BaseEntity { + + private static final long serialVersionUID = 1L; + @ApiModelProperty(value = "店铺id", hidden = true) + private String storeId; + + @ApiModelProperty(value = "部门名称") + @NotEmpty(message = "部门名称不能为空") + private String title; + + @ApiModelProperty(value = "父id") + @NotEmpty(message = "父id不能为空") + private String parentId; + + @ApiModelProperty(value = "排序值") + private Double sortOrder; +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreDepartmentRole.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreDepartmentRole.java new file mode 100644 index 00000000..04fb6de6 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreDepartmentRole.java @@ -0,0 +1,34 @@ +package cn.lili.modules.member.entity.dos; + +import cn.lili.mybatis.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + + +/** + * 角色部门绑定关系 + * + * @author Chopper + * @since 2020/11/19 12:18 + */ +@Data +@TableName("li_store_department_role") +@ApiModel(value = "店铺角色部门") +@NoArgsConstructor +@AllArgsConstructor +public class StoreDepartmentRole extends BaseEntity { + + + private static final long serialVersionUID = 2342812932116647050L; + + @ApiModelProperty(value = "角色id") + private String roleId; + + @ApiModelProperty(value = "部门id") + private String departmentId; + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreMenu.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreMenu.java new file mode 100644 index 00000000..64522888 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreMenu.java @@ -0,0 +1,48 @@ +package cn.lili.modules.member.entity.dos; + +import cn.lili.mybatis.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 菜单权限 + * + * @author Chopper + * @since 2020/11/19 12:12 + */ +@Data +@TableName("li_store_menu") +@ApiModel(value = "店铺菜单权限") +public class StoreMenu extends BaseEntity { + + private static final long serialVersionUID = 7050744476203495207L; + + + @ApiModelProperty(value = "菜单标题") + private String title; + + @ApiModelProperty(value = "路由名称") + private String name; + + @ApiModelProperty(value = "路径") + private String path; + + @ApiModelProperty(value = "菜单层级") + private Integer level; + + @ApiModelProperty(value = "前端目录文件") + private String frontRoute; + + @ApiModelProperty(value = "父id") + private String parentId = "0"; + + @ApiModelProperty(value = "排序值") + private Double sortOrder; + + @ApiModelProperty(value = "权限URL,*号模糊匹配,逗号分割") + private String permission; + + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreMenuRole.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreMenuRole.java new file mode 100644 index 00000000..0992997f --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreMenuRole.java @@ -0,0 +1,35 @@ +package cn.lili.modules.member.entity.dos; + +import cn.lili.mybatis.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 角色权限绑定关系 + * + * @author Chopper + * @since 2020/11/19 12:18 + */ +@Data +@TableName("li_store_menu_role") +@ApiModel(value = "店铺角色权限") +public class StoreMenuRole extends BaseEntity { + + private static final long serialVersionUID = -4680260092546996026L; + + @ApiModelProperty(value = "角色id") + private String roleId; + + @ApiModelProperty(value = "菜单") + private String menuId; + + @ApiModelProperty(value = "店铺id") + private String storeId; + + @ApiModelProperty(value = "是否拥有操作数据权限,为否则只有查看权限") + private Boolean isSuper; + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreRole.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreRole.java new file mode 100644 index 00000000..8057b682 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreRole.java @@ -0,0 +1,36 @@ +package cn.lili.modules.member.entity.dos; + +import cn.lili.mybatis.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + + +/** + * 部门 + * + * @author Chopper + * @since 2020/11/19 11:57 + */ +@Data +@TableName("li_store_role") +@ApiModel(value = "店铺角色") +public class StoreRole extends BaseEntity { + + @ApiModelProperty(value = "角色名") + @NotEmpty(message = "角色名称必填") + private String name; + + @ApiModelProperty(value = "店铺id", hidden = true) + private String storeId; + + @ApiModelProperty(value = "是否为注册默认角色") + private Boolean defaultRole = false; + + @ApiModelProperty(value = "备注") + private String description; +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkAddDTO.java b/framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkAddDTO.java new file mode 100644 index 00000000..6b8207b5 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkAddDTO.java @@ -0,0 +1,64 @@ +package cn.lili.modules.member.entity.dto; + +import cn.lili.common.security.sensitive.Sensitive; +import cn.lili.common.security.sensitive.enums.SensitiveStrategy; +import cn.lili.mybatis.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.Size; +import java.util.List; + +/** + * 店员dto + * + * @author wget + * @title: Clerk + * @projectName lilishop + * @date 2021/12/28 7:39 下午 + */ +@Data +@NoArgsConstructor +public class ClerkAddDTO { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "会员用户名") + @NotEmpty(message = "会员用户名不能为空") + @Length(max = 30, message = "会员用户名不能超过20个字符") + private String username; + + @ApiModelProperty(value = "会员密码") + @NotEmpty(message = "会员密码不能为空") + private String password; + + @NotEmpty(message = "手机号码不能为空") + @ApiModelProperty(value = "手机号码", required = true) + @Sensitive(strategy = SensitiveStrategy.PHONE) + private String mobile; + + @ApiModelProperty(value = "所属部门id") + private String departmentId; + + @ApiModelProperty(value = "是否是超级管理员 超级管理员/普通管理员") + private Boolean isSuper = false; + + @ApiModelProperty(value = "角色") + private List roles; + + @ApiModelProperty(value = "会员id", required = true) + private String memberId; + + @ApiModelProperty(value = "是否是店主", hidden = true) + private Boolean shopkeeper = false; + + @ApiModelProperty(value = "店铺id", hidden = true) + private String storeId; + + +} diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkEditDTO.java b/framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkEditDTO.java new file mode 100644 index 00000000..d535103d --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkEditDTO.java @@ -0,0 +1,46 @@ +package cn.lili.modules.member.entity.dto; + +import cn.lili.common.security.sensitive.Sensitive; +import cn.lili.common.security.sensitive.enums.SensitiveStrategy; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; +import java.util.List; + +/** + * 店员dto + * + * @author wget + * @title: Clerk + * @projectName lilishop + * @date 2021/12/28 7:39 下午 + */ +@Data +@NoArgsConstructor +public class ClerkEditDTO { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "店员id", hidden = true) + private String id; + + @ApiModelProperty(value = "会员密码") + private String password; + + @ApiModelProperty(value = "状态") + private Boolean status; + + @ApiModelProperty(value = "所属部门id") + private String departmentId; + + @ApiModelProperty(value = "是否是超级管理员 超级管理员/普通管理员") + private Boolean isSuper = false; + + @ApiModelProperty(value = "角色") + private List roles; + + +} diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkOperationDTO.java b/framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkOperationDTO.java new file mode 100644 index 00000000..aa9959e9 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkOperationDTO.java @@ -0,0 +1,48 @@ +package cn.lili.modules.member.entity.dto; + +import cn.lili.mybatis.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +/** + * 管理员入库dto + * + * @author Chopper + * @since 2020/11/16 19:55 + */ +@Data +@ApiModel(value = "店员操作dto") +public class ClerkOperationDTO extends BaseEntity { + + private static final long serialVersionUID = 1L; + + + @ApiModelProperty(value = "用户名") + @Length(max = 20,message = "用户名长度不能超过20个字符") + private String username; + + @ApiModelProperty(value = "密码") + private String password; + + @ApiModelProperty(value = "昵称") + @Length(max = 10,message = "昵称长度不能超过10个字符") + private String nickName; + + @ApiModelProperty(value = "手机") + @Length(max = 11,message = "手机号长度不能超过11") + private String mobile; + + @ApiModelProperty(value = "头像") + private String avatar; + + @ApiModelProperty(value = "描述/详情/备注") + private String description; + + @ApiModelProperty(value = "所属部门id") + private String departmentId; + + @ApiModelProperty(value = "是否为超级管理员") + private Boolean isSuper; +} diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkQueryDTO.java b/framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkQueryDTO.java new file mode 100644 index 00000000..956b48f7 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/dto/ClerkQueryDTO.java @@ -0,0 +1,41 @@ +package cn.lili.modules.member.entity.dto; + +import cn.lili.mybatis.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +/** + * 店员查询 + * + * @author Chopper + * @since 2020/11/16 19:55 + */ +@Data +@ApiModel(value = "店员查询") +public class ClerkQueryDTO extends BaseEntity { + + private static final long serialVersionUID = 1L; + + + @ApiModelProperty(value = "店员名称") + @Length(max = 20, message = "用户名长度不能超过20个字符") + private String clerkName; + + @ApiModelProperty(value = "手机") + @Length(max = 11, message = "手机号长度不能超过11") + private String mobile; + + @ApiModelProperty(value = "所属部门id") + private String departmentId; + + @ApiModelProperty(value = "是否为超级管理员") + private Boolean isSuper; + + @ApiModelProperty(value = "状态") + private Boolean status; + + @ApiModelProperty(value = "店铺id", hidden = true) + private String storeId; +} diff --git a/framework/src/main/java/cn/lili/modules/member/entity/vo/ClerkVO.java b/framework/src/main/java/cn/lili/modules/member/entity/vo/ClerkVO.java new file mode 100644 index 00000000..ebd6e957 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/vo/ClerkVO.java @@ -0,0 +1,40 @@ +package cn.lili.modules.member.entity.vo; + +import cn.lili.common.utils.BeanUtil; +import cn.lili.modules.member.entity.dos.Clerk; +import cn.lili.modules.member.entity.dos.StoreMenu; +import cn.lili.modules.member.entity.dos.StoreRole; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * 管理员VO + * + * @author Chopper + * @since 2020-11-22 09:17 + */ +@Data +public class ClerkVO extends Clerk { + + private static final long serialVersionUID = -2378384199695839312L; + + @ApiModelProperty(value = "手机号") + private String mobile; + + @ApiModelProperty(value = "所属部门名称") + private String departmentTitle; + + @ApiModelProperty(value = "用户拥有角色") + private List roles; + + @ApiModelProperty(value = "用户拥有的权限") + private List menus; + + + public ClerkVO(Clerk clerk) { + BeanUtil.copyProperties(clerk, this); + } + +} diff --git a/framework/src/main/java/cn/lili/modules/member/entity/vo/StoreDepartmentVO.java b/framework/src/main/java/cn/lili/modules/member/entity/vo/StoreDepartmentVO.java new file mode 100644 index 00000000..a40ae6a3 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/vo/StoreDepartmentVO.java @@ -0,0 +1,28 @@ +package cn.lili.modules.member.entity.vo; + +import cn.lili.common.utils.BeanUtil; +import cn.lili.modules.member.entity.dos.StoreDepartment; +import cn.lili.modules.permission.entity.dos.Department; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +/** + * 部门VO + * + * @author Chopper + * @since 2020-11-23 18:48 + */ +@Data +public class StoreDepartmentVO extends StoreDepartment { + + private List children = new ArrayList<>(); + + public StoreDepartmentVO() { + } + + public StoreDepartmentVO(StoreDepartment storeDepartment) { + BeanUtil.copyProperties(storeDepartment, this); + } +} diff --git a/framework/src/main/java/cn/lili/modules/member/entity/vo/StoreMenuVO.java b/framework/src/main/java/cn/lili/modules/member/entity/vo/StoreMenuVO.java new file mode 100644 index 00000000..ae661967 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/vo/StoreMenuVO.java @@ -0,0 +1,45 @@ +package cn.lili.modules.member.entity.vo; + +import cn.lili.common.utils.BeanUtil; +import cn.lili.modules.member.entity.dos.StoreMenu; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +/** + * 菜单VO 展示模型 + * + * @author Chopper + * @since 2020/11/20 15:38 + */ + +@Data +public class StoreMenuVO extends StoreMenu { + + @ApiModelProperty(value = "子菜单") + private List children = new ArrayList<>(); + + public StoreMenuVO() { + + } + + public StoreMenuVO(StoreMenu storeMenu) { + BeanUtil.copyProperties(storeMenu, this); + } + + public List getChildren() { + if (children != null) { + children.sort(new Comparator() { + @Override + public int compare(StoreMenuVO o1, StoreMenuVO o2) { + return o1.getSortOrder().compareTo(o2.getSortOrder()); + } + }); + return children; + } + return null; + } +} diff --git a/framework/src/main/java/cn/lili/modules/member/entity/vo/StoreUserMenuVO.java b/framework/src/main/java/cn/lili/modules/member/entity/vo/StoreUserMenuVO.java new file mode 100644 index 00000000..8a6318f2 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/entity/vo/StoreUserMenuVO.java @@ -0,0 +1,29 @@ +package cn.lili.modules.member.entity.vo; + +import cn.lili.modules.member.entity.dos.StoreMenu; +import cn.lili.modules.permission.entity.dos.Menu; +import lombok.Data; + +/** + * RoleMenuVO + * + * @author Chopper + * @since 2020-11-24 11:45 + */ +@Data +public class StoreUserMenuVO extends StoreMenu { + + private static final long serialVersionUID = -7478870595109016162L; + + /** + * 是否是超级管理员 + */ + private Boolean isSuper; + + public Boolean getSuper() { + if (this.isSuper == null) { + return false; + } + return isSuper; + } +} diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/ClerkMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/ClerkMapper.java new file mode 100644 index 00000000..ca51b1e6 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/mapper/ClerkMapper.java @@ -0,0 +1,34 @@ +package cn.lili.modules.member.mapper; + + +import cn.lili.modules.member.entity.dos.Clerk; +import cn.lili.modules.member.entity.vo.ClerkVO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** + * 店员数据处理层 + * + * @author wget + * @title: ClerkMapper + * @projectName lilishop + * @date 2021/12/28 7:39 下午 + */ +public interface ClerkMapper extends BaseMapper { + + /** + * 查询店员分页数据 + * @param page 分页信息 + * @param ew 店铺ID + * @return + */ + @Select("select li_clerk.*,m.id from li_clerk inner join li_member as m on li_clerk.member_id = m.id ${ew.customSqlSegment}") + IPage selectClerkPage(Page page, @Param(Constants.WRAPPER) QueryWrapper ew); + + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/StoreClerkRoleMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/StoreClerkRoleMapper.java new file mode 100644 index 00000000..2b219edc --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/mapper/StoreClerkRoleMapper.java @@ -0,0 +1,13 @@ +package cn.lili.modules.member.mapper; + +import cn.lili.modules.member.entity.dos.StoreClerkRole; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 角色权限数据处理层 + * @author Chopper + * @since 2020-11-22 09:17 + */ +public interface StoreClerkRoleMapper extends BaseMapper { + +} diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/StoreDepartmentMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/StoreDepartmentMapper.java new file mode 100644 index 00000000..252801bf --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/mapper/StoreDepartmentMapper.java @@ -0,0 +1,14 @@ +package cn.lili.modules.member.mapper; + +import cn.lili.modules.member.entity.dos.StoreDepartment; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 部门数据处理层 + * + * @author Chopper + * @since 2020-11-22 09:17 + */ +public interface StoreDepartmentMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/StoreDepartmentRoleMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/StoreDepartmentRoleMapper.java new file mode 100644 index 00000000..4171a437 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/mapper/StoreDepartmentRoleMapper.java @@ -0,0 +1,14 @@ +package cn.lili.modules.member.mapper; + +import cn.lili.modules.member.entity.dos.StoreDepartmentRole; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 店铺部门角色数据处理层 + * + * @author Chopper + * @since 2020-11-22 09:17 + */ +public interface StoreDepartmentRoleMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/StoreMenuMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/StoreMenuMapper.java new file mode 100644 index 00000000..3b644df3 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/mapper/StoreMenuMapper.java @@ -0,0 +1,44 @@ +package cn.lili.modules.member.mapper; + +import cn.lili.modules.member.entity.dos.StoreMenu; +import cn.lili.modules.member.entity.vo.StoreUserMenuVO; +import cn.lili.modules.permission.entity.dos.Menu; +import cn.lili.modules.permission.entity.vo.UserMenuVO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 菜单数据处理层 + * + * @author Chopper + * @since 2020-11-22 09:17 + */ +public interface StoreMenuMapper extends BaseMapper { + + /** + * 根据用户获取菜单列表 + * + * @param userId 用户ID + * @return 菜单列表 + */ + @Select("SELECT menu.* FROM li_store_menu AS menu WHERE menu.id IN (" + + "SELECT rm.menu_id FROM li_store_menu_role AS rm WHERE rm.role_id IN (" + + "SELECT ur.role_id FROM li_clerk_role AS ur WHERE ur.user_id=#{userId}) OR rm.role_id IN (" + + "SELECT dr.role_id FROM li_store_department_role AS dr WHERE dr.id=(" + + "SELECT department_id FROM li_clerk AS au WHERE au.id = #{userId})))") + List findByUserId(String userId); + + /** + * 根据用户获取菜单权限 + * + * @param userId 用户ID + * @return 用户菜单VO列表 + */ + @Select("SELECT rm.is_super as is_super,m.*FROM li_store_menu AS m INNER JOIN li_store_menu_role AS rm ON rm.menu_id=m.id WHERE rm.role_id IN (" + + "SELECT ur.role_id FROM li_clerk_role AS ur WHERE ur.clerk_id=#{userId}) OR rm.role_id IN (" + + "SELECT dr.role_id FROM li_store_department_role AS dr INNER JOIN li_clerk AS au ON au.department_id=dr.department_id " + + "WHERE au.id=#{userId}) GROUP BY m.id,rm.is_super ORDER BY rm.is_super desc") + List getUserRoleMenu(String userId); +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/StoreMenuRoleMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/StoreMenuRoleMapper.java new file mode 100644 index 00000000..be9530b6 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/mapper/StoreMenuRoleMapper.java @@ -0,0 +1,14 @@ +package cn.lili.modules.member.mapper; + +import cn.lili.modules.member.entity.dos.StoreMenuRole; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 角色菜单数据处理层 + * + * @author Chopper + * @since 2020-11-22 09:17 + */ +public interface StoreMenuRoleMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/StoreRoleMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/StoreRoleMapper.java new file mode 100644 index 00000000..8f8eb867 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/mapper/StoreRoleMapper.java @@ -0,0 +1,15 @@ +package cn.lili.modules.member.mapper; + +import cn.lili.modules.member.entity.dos.StoreRole; +import cn.lili.modules.permission.entity.dos.Role; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 店铺角色数据处理层 + * + * @author Chopper + * @since 2020-11-22 09:17 + */ +public interface StoreRoleMapper extends BaseMapper { + +} diff --git a/framework/src/main/java/cn/lili/modules/member/service/ClerkService.java b/framework/src/main/java/cn/lili/modules/member/service/ClerkService.java new file mode 100644 index 00000000..17bf036b --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/service/ClerkService.java @@ -0,0 +1,99 @@ +package cn.lili.modules.member.service; + +import cn.lili.common.vo.PageVO; +import cn.lili.modules.member.entity.dos.Clerk; +import cn.lili.modules.member.entity.dos.Member; +import cn.lili.modules.member.entity.dto.ClerkAddDTO; +import cn.lili.modules.member.entity.dto.ClerkEditDTO; +import cn.lili.modules.member.entity.dto.ClerkQueryDTO; +import cn.lili.modules.member.entity.vo.ClerkVO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 店员业务层 + * + * @author wget + * @title: ClerkService + * @projectName lilishop + * @date 2021/12/28 7:42 下午 + */ +public interface ClerkService extends IService { + + /** + * 店员查询 + * + * @param page + * @param clerkQueryDTO + * @return + */ + IPage clerkForPage(PageVO page, ClerkQueryDTO clerkQueryDTO); + + /** + * 查询店员详细 + * + * @param id 店员id + * @return + */ + ClerkVO get(String id); + + /** + * 修改店员信息 + * + * @param clerkEditDTO 店员 + * @return + */ + Clerk updateClerk(ClerkEditDTO clerkEditDTO); + + /** + * 保存店员 + * + * @param clerkAddDTO 店员 + * @return + */ + Clerk saveClerk(ClerkAddDTO clerkAddDTO); + + /** + * 根据会员id获取店员信息 + * + * @param memberId 会员id + * @return + */ + Clerk getClerkByMemberId(String memberId); + + /** + * 重置店员密码 + * + * @param ids 店员ids + */ + void resetPassword(List ids); + + /** + * 删除店员 + * + * @param ids 店员ids + */ + void deleteClerk(List ids); + + /** + * 检测会员有效性 + * + * @param mobile 手机号码 + * @return + */ + Member checkClerk(String mobile); + + /** + * 店员状态操作 + * + * @param id 店员id + * @param status 状态 + */ + void disable(String id, Boolean status); + + +} diff --git a/framework/src/main/java/cn/lili/modules/member/service/MemberService.java b/framework/src/main/java/cn/lili/modules/member/service/MemberService.java index a4256c17..0fa448a9 100644 --- a/framework/src/main/java/cn/lili/modules/member/service/MemberService.java +++ b/framework/src/main/java/cn/lili/modules/member/service/MemberService.java @@ -35,11 +35,10 @@ public interface MemberService extends IService { /** * 是否可以通过手机获取用户 * - * @param uuid UUID * @param mobile 手机号 * @return 操作状态 */ - boolean findByMobile(String uuid, String mobile); + Member findByMobile(String mobile); /** * 通过用户名获取用户 @@ -86,11 +85,12 @@ public interface MemberService extends IService { /** * 修改用户密码 * + * @param memberId 会员id * @param oldPassword 旧密码 * @param newPassword 新密码 * @return 操作结果 */ - Member modifyPass(String oldPassword, String newPassword); + Member modifyPass(String memberId, String oldPassword, String newPassword); /** * 注册会员 @@ -208,7 +208,7 @@ public interface MemberService extends IService { /** * 获取指定会员数据 * - * @param columns 指定获取的列 + * @param columns 指定获取的列 * @param memberIds 会员ids * @return 指定会员数据 */ @@ -220,4 +220,21 @@ public interface MemberService extends IService { * @param userEnums token角色类型 */ void logout(UserEnums userEnums); + + /** + * 修改会员是否拥有店铺 + * + * @param haveStore 是否拥有店铺 + * @param storeId 店铺id + * @param memberIds 会员id + * @return + */ + void updateHaveShop(Boolean haveStore, String storeId, List memberIds); + + /** + * 重置会员密码为123456 + * + * @param ids 会员id + */ + void resetPassword(List ids); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/service/StoreClerkRoleService.java b/framework/src/main/java/cn/lili/modules/member/service/StoreClerkRoleService.java new file mode 100644 index 00000000..58dee8db --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/service/StoreClerkRoleService.java @@ -0,0 +1,41 @@ +package cn.lili.modules.member.service; + +import cn.lili.modules.member.entity.dos.StoreClerkRole; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 店铺店员角色业务层 + * + * @author Chopper + * @since 2020/11/17 3:46 下午 + */ +public interface StoreClerkRoleService extends IService { + + /** + * 根据用户查看拥有的角色 + * + * @param clerkId 店员id + * @return + */ + List listByUserId(String clerkId); + + /** + * 根据店员id查看角色 + * + * @param clerkId 店员id + * @return + */ + List listId(String clerkId); + + /** + * 更新用户拥有的角色 + * + * @param clerkId 店员id + * @param storeClerkRoles 角色权限 + */ + void updateClerkRole(String clerkId, List storeClerkRoles); + + +} diff --git a/framework/src/main/java/cn/lili/modules/member/service/StoreDepartmentRoleService.java b/framework/src/main/java/cn/lili/modules/member/service/StoreDepartmentRoleService.java new file mode 100644 index 00000000..4ffc9a19 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/service/StoreDepartmentRoleService.java @@ -0,0 +1,38 @@ +package cn.lili.modules.member.service; + +import cn.lili.modules.member.entity.dos.StoreDepartmentRole; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 部门角色业务层 + * + * @author Chopper + * @since 2020/11/22 12:08 + */ +public interface StoreDepartmentRoleService extends IService { + + /** + * 根据部门获取角色集合 + * + * @param storeDepartmentId 店铺部门id + * @return + */ + List listByDepartmentId(String storeDepartmentId); + + /** + * 更新部门角色关联 + * + * @param storeDepartmentId 店铺部门id + * @param storeDepartmentRoles 店铺部门角色 + */ + void updateByDepartmentId(String storeDepartmentId, List storeDepartmentRoles); + + /** + * 根据部门id删除部门与角色关联 + * + * @param ids id集合 + */ + void deleteByDepartment(List ids); +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/service/StoreDepartmentService.java b/framework/src/main/java/cn/lili/modules/member/service/StoreDepartmentService.java new file mode 100644 index 00000000..43fdd74d --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/service/StoreDepartmentService.java @@ -0,0 +1,40 @@ +package cn.lili.modules.member.service; + +import cn.lili.modules.member.entity.dos.StoreDepartment; +import cn.lili.modules.member.entity.vo.StoreDepartmentVO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 店铺部门业务层 + * + * @author Chopper + * @since 2020/11/17 3:43 下午 + */ +public interface StoreDepartmentService extends IService { + + /** + * 获取部门树 + * + * @param initWrapper + * @return + */ + List tree(QueryWrapper initWrapper); + + /** + * 删除部门 + * + * @param ids + */ + void deleteByIds(List ids); + + /** + * 更新店铺部门 + * + * @param storeDepartment 店铺部门 + * @return + */ + Boolean update(StoreDepartment storeDepartment); +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/service/StoreMenuRoleService.java b/framework/src/main/java/cn/lili/modules/member/service/StoreMenuRoleService.java new file mode 100644 index 00000000..d179a5b6 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/service/StoreMenuRoleService.java @@ -0,0 +1,57 @@ +package cn.lili.modules.member.service; + +import cn.lili.modules.member.entity.dos.StoreMenuRole; +import cn.lili.modules.member.entity.vo.StoreUserMenuVO; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 角色菜单接口 + * + * @author Chopper + * @since 2020/11/22 11:43 + */ +public interface StoreMenuRoleService extends IService { + + /** + * 通过角色获取菜单权限列表 + * + * @param roleId + * @return + */ + List findByRoleId(String roleId); + + + /** + * 根据角色集合获取拥有的菜单具体权限 + * + * @param userId + * @return + */ + List findAllMenu(String userId); + + + /** + * 更新某角色拥有到菜单 + * + * @param roleId 角色id + * @param roleMenus + */ + void updateRoleMenu(String roleId, List roleMenus); + + /** + * 根据角色id 删除数据 + * + * @param roleId + */ + void delete(String roleId); + + /** + * 根据角色id 删除数据 + * + * @param roleId + */ + void delete(List roleId); + +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/service/StoreMenuService.java b/framework/src/main/java/cn/lili/modules/member/service/StoreMenuService.java new file mode 100644 index 00000000..934e5600 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/service/StoreMenuService.java @@ -0,0 +1,74 @@ +package cn.lili.modules.member.service; + +import cn.lili.modules.member.entity.dos.StoreMenu; +import cn.lili.modules.member.entity.vo.StoreMenuVO; +import cn.lili.modules.permission.entity.dto.MenuSearchParams; +import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.cache.annotation.CacheConfig; + +import java.util.List; + +/** + * 店铺菜单权限业务层 + * + * @author Chopper + * @since 2020/11/17 3:45 下午 + */ +@CacheConfig(cacheNames = "{store_menu}") +public interface StoreMenuService extends IService { + + /** + * 通过用户的菜单权限 + * + * @return + */ + List findUserTree(); + + /** + * 通过用户id获取 + * + * @param userId + * @return + */ + List findUserList(String userId); + + + /** + * 根据角色id获取菜单集合 + * + * @param roleIds + * @return + */ + List findByRoleIds(String roleIds); + + /** + * 树形结构 + * + * @return + */ + List tree(); + + /** + * 查询列表 + * + * @param menuSearchParams + * @return + */ + List searchList(MenuSearchParams menuSearchParams); + + /** + * 批量删除 + * + * @param ids + */ + void deleteIds(List ids); + + /** + * 添加更新菜单 + * + * @param storeMenu 菜单数据 + * @return 是否成功 + */ + boolean saveOrUpdateMenu(StoreMenu storeMenu); + +} diff --git a/framework/src/main/java/cn/lili/modules/member/service/StoreRoleService.java b/framework/src/main/java/cn/lili/modules/member/service/StoreRoleService.java new file mode 100644 index 00000000..74c9804a --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/service/StoreRoleService.java @@ -0,0 +1,56 @@ +package cn.lili.modules.member.service; + + +import cn.lili.modules.member.entity.dos.StoreRole; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 角色业务层 + * + * @author Chopper + * @since 2020/11/17 3:45 下午 + */ +public interface StoreRoleService extends IService { + + /** + * 获取默认角色 + * + * @param defaultRole + * @return + */ + List findByDefaultRole(Boolean defaultRole); + + + /** + * 批量删除角色 + * + * @param roleIds + */ + void deleteRoles(List roleIds); + + /** + * 修改角色 + * + * @param storeRole 店铺角色 + * @return + */ + Boolean update(StoreRole storeRole); + + /** + * 保存店铺角色 + * + * @param storeRole 店铺角色 + * @return + */ + Boolean saveStoreRole(StoreRole storeRole); + + /** + * 当前店铺 根据角色id查询角色 + * + * @param ids 角色id + * @return + */ + List list(List ids); +} diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/ClerkServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/ClerkServiceImpl.java new file mode 100644 index 00000000..9edc97fd --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/ClerkServiceImpl.java @@ -0,0 +1,320 @@ +package cn.lili.modules.member.serviceimpl; + +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.utils.BeanUtil; +import cn.lili.common.utils.StringUtils; +import cn.lili.common.vo.PageVO; +import cn.lili.modules.member.entity.dos.Clerk; +import cn.lili.modules.member.entity.dos.Member; +import cn.lili.modules.member.entity.dos.StoreRole; +import cn.lili.modules.member.entity.dto.ClerkAddDTO; +import cn.lili.modules.member.entity.dto.ClerkEditDTO; +import cn.lili.modules.member.entity.dto.ClerkQueryDTO; +import cn.lili.modules.member.entity.vo.ClerkVO; +import cn.lili.modules.member.mapper.ClerkMapper; +import cn.lili.modules.member.service.ClerkService; +import cn.lili.modules.member.service.MemberService; +import cn.lili.modules.member.service.StoreDepartmentService; +import cn.lili.modules.member.service.StoreRoleService; +import cn.lili.mybatis.util.PageUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 店员业务实现 + * + * @author wget + * @title: ClerkServiceImpl + * @projectName lilishop + * @date 2021/12/28 8:13 下午 + */ +@Service +@Transactional(rollbackFor = Exception.class) +public class ClerkServiceImpl extends ServiceImpl implements ClerkService { + + @Autowired + private StoreRoleService storeRoleService; + @Autowired + private StoreDepartmentService storeDepartmentService; + @Autowired + private MemberService memberService; + @Autowired + private ClerkMapper clerkMapper; + + @Override + public IPage clerkForPage(PageVO page, ClerkQueryDTO clerkQueryDTO) { + + QueryWrapper clerkVOQueryWrapper = new QueryWrapper<>(); + clerkVOQueryWrapper.eq("li_clerk.store_id", UserContext.getCurrentUser().getStoreId()); + clerkVOQueryWrapper.eq(StringUtils.isNotEmpty(clerkQueryDTO.getDepartmentId()), "li_clerk.department_id", clerkQueryDTO.getDepartmentId()); + clerkVOQueryWrapper.like(StringUtils.isNotEmpty(clerkQueryDTO.getClerkName()), "li_clerk.clerk_name", clerkQueryDTO.getClerkName()); + clerkVOQueryWrapper.like(StringUtils.isNotEmpty(clerkQueryDTO.getMobile()), "m.mobile", clerkQueryDTO.getMobile()); + IPage clerkPage = this.clerkMapper.selectClerkPage(PageUtil.initPage(page), clerkVOQueryWrapper); + + List result = new ArrayList<>(); + clerkPage.getRecords().forEach(clerk -> { + ClerkVO clerkVO = new ClerkVO(clerk); + result.add(clerkVO); + }); + + Page pageResult = new Page(clerkPage.getCurrent(), clerkPage.getSize(), clerkPage.getTotal()); + pageResult.setRecords(result); + return pageResult; + + + /*Page clerkPage = page(initPage, initWrapper); + + if (clerkPage.getRecords().size() > 0) { + List roles = storeRoleService.list(new QueryWrapper() + .eq("store_id", UserContext.getCurrentUser().getStoreId())); + + List departments = storeDepartmentService.list(new QueryWrapper() + .eq("store_id", UserContext.getCurrentUser().getStoreId())); + + List memberIds = new ArrayList<>(); + clerkPage.getRecords().forEach(clerk -> { + memberIds.add(clerk.getMemberId()); + }); + List members = memberService.list(new QueryWrapper().in("id", memberIds)); + + List result = new ArrayList<>(); + + clerkPage.getRecords().forEach(clerk -> { + ClerkVO clerkVO = new ClerkVO(clerk); + if (!CharSequenceUtil.isEmpty(clerk.getDepartmentId())) { + try { + clerkVO.setDepartmentTitle( + departments.stream().filter + (department -> department.getId().equals(clerk.getDepartmentId())) + .collect(Collectors.toList()) + .get(0) + .getTitle() + ); + } catch (Exception e) { + log.error("填充部门信息异常", e); + } + } + clerkVO.setMobile( + members.stream().filter + (member -> member.getId().equals(clerk.getMemberId())) + .collect(Collectors.toList()) + .get(0) + .getMobile() + ); + if (!StringUtils.isEmpty(clerk.getRoleIds())) { + try { + List memberRoles = Arrays.asList(clerk.getRoleIds().split(",")); + clerkVO.setRoles( + roles.stream().filter + (role -> memberRoles.contains(role.getId())) + .collect(Collectors.toList()) + ); + } catch (Exception e) { + log.error("填充部门信息异常", e); + } + } + result.add(clerkVO); + }); + Page pageResult = new Page(clerkPage.getCurrent(), clerkPage.getSize(), clerkPage.getTotal()); + pageResult.setRecords(result); + return pageResult; + } + return new Page();*/ + } + + + @Override + public ClerkVO get(String id) { + Clerk clerk = this.getById(id); + ClerkVO clerkVO = new ClerkVO(clerk); + //手机号码 + clerkVO.setMobile(memberService.getById(clerk.getMemberId()).getMobile()); + if (!CharSequenceUtil.isEmpty(clerk.getDepartmentId())) { + clerkVO.setDepartmentTitle(storeDepartmentService.getById(clerk.getDepartmentId()).getTitle()); + } + if (!StringUtils.isEmpty(clerk.getRoleIds())) { + List memberRoles = Arrays.asList(clerk.getRoleIds().split(",")); + List roles = storeRoleService.list(new QueryWrapper() + .eq("store_id", UserContext.getCurrentUser().getStoreId())); + clerkVO.setRoles( + roles.stream().filter + (role -> memberRoles.contains(role.getId())) + .collect(Collectors.toList()) + ); + } + return clerkVO; + } + + @Override + public Clerk updateClerk(ClerkEditDTO clerkEditDTO) { + Clerk clerk = this.getById(clerkEditDTO.getId()); + if (clerk != null) { + //校验当前店员是否是当前店铺的 + if (!clerk.getStoreId().equals(UserContext.getCurrentUser().getStoreId())) { + throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); + } + if(clerkEditDTO.getIsSuper()){ + clerk.setRoleIds(""); + }else{ + //角色赋值 + if (!clerkEditDTO.getRoles().isEmpty()) { + clerk.setRoleIds(CharSequenceUtil.join(",", clerkEditDTO.getRoles())); + } + } + + //部门校验 + if (StringUtils.isNotEmpty(clerkEditDTO.getDepartmentId())) { + if (storeDepartmentService.getById(clerkEditDTO.getDepartmentId()) != null) { + clerk.setDepartmentId(clerkEditDTO.getDepartmentId()); + } else { + throw new ServiceException(ResultCode.PERMISSION_NOT_FOUND_ERROR); + } + } + clerk.setIsSuper(clerkEditDTO.getIsSuper()); + this.updateById(clerk); + return clerk; + } + throw new ServiceException(ResultCode.CLERK_NOT_FOUND_ERROR); + } + + @Override + public Clerk saveClerk(ClerkAddDTO clerkAddDTO) { + Clerk clerk = new Clerk(clerkAddDTO); + clerk.setShopkeeper(clerkAddDTO.getShopkeeper()); + clerk.setIsSuper(clerkAddDTO.getIsSuper()); + //校验此会员是否已经是店员 + Clerk temp = this.getClerkByMemberId(clerkAddDTO.getMemberId()); + if (temp != null && !temp.getStoreId().equals(UserContext.getCurrentUser().getStoreId())) { + throw new ServiceException(ResultCode.CLERK_USER_ERROR); + } + if (temp != null && temp.getStoreId().equals(UserContext.getCurrentUser().getStoreId())) { + throw new ServiceException(ResultCode.CLERK_ALREADY_EXIT_ERROR); + } + //部门校验 + if (StringUtils.isNotEmpty(clerkAddDTO.getDepartmentId())) { + if (storeDepartmentService.getById(clerkAddDTO.getDepartmentId()) == null) { + throw new ServiceException(ResultCode.PERMISSION_NOT_FOUND_ERROR); + } + } + //角色校验 + if (clerkAddDTO.getRoles() != null && clerkAddDTO.getRoles().size() > 0) { + List storeRoles = storeRoleService.list(clerkAddDTO.getRoles()); + if (storeRoles.size() != clerkAddDTO.getRoles().size()) { + throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); + } + } + this.save(clerk); + return clerk; + } + + @Override + public Clerk getClerkByMemberId(String memberId) { + return this.getOne(new QueryWrapper().eq("member_id", memberId)); + } + + @Override + public void resetPassword(List ids) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("store_id", UserContext.getCurrentUser().getStoreId()); + queryWrapper.in("id", ids); + List clerks = this.clerkMapper.selectList(queryWrapper); + //校验要重置的店员是否是当前店铺的店员 + if (clerks.size() != ids.size()) { + throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); + } + //店员密码就是会员密码所以要组织会员修改密码参数信息 + List memberIds = new ArrayList<>(); + clerks.forEach(clerk -> { + //如果是店主无法重置密码 + if (clerk.getShopkeeper()) { + throw new ServiceException(ResultCode.CLERK_SUPPER); + } + memberIds.add(clerk.getMemberId()); + }); + memberService.resetPassword(memberIds); + } + + + @Override + public void deleteClerk(List ids) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("store_id", UserContext.getCurrentUser().getStoreId()); + queryWrapper.in("id", ids); + List clerks = this.clerkMapper.selectList(queryWrapper); + if (clerks.size() > 0) { + //校验要重置的店员是否是当前店铺的店员 + if (clerks.size() != ids.size()) { + throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); + } + //删除店员 + this.removeByIds(ids); + //更改会员为为拥有店铺 + List memberIds = new ArrayList<>(); + clerks.forEach(clerk -> { + //无法删除当前登录的店员 + if (UserContext.getCurrentUser().getClerkId().equals(clerk.getId())) { + throw new ServiceException(ResultCode.CLERK_CURRENT_SUPPER); + } + //无法删除店主 + if (clerk.getShopkeeper()) { + throw new ServiceException(ResultCode.CLERK_SUPPER); + } + memberIds.add(clerk.getMemberId()); + }); + memberService.updateHaveShop(false, null, memberIds); + } + } + + @Override + public Member checkClerk(String mobile) { + //校验是否已经是会员 + Member member = memberService.findByMobile(mobile); + if (member != null) { + //校验要添加的会员是否已经是店主 + if (member.getHaveStore()) { + throw new ServiceException(ResultCode.STORE_APPLY_DOUBLE_ERROR); + } + //校验会员的有效性 + if (!member.getDisabled()) { + throw new ServiceException(ResultCode.USER_STATUS_ERROR); + } + //校验此会员是否已经是店员 + Clerk clerk = this.getClerkByMemberId(member.getId()); + if (clerk != null && !clerk.getStoreId().equals(UserContext.getCurrentUser().getStoreId())) { + throw new ServiceException(ResultCode.CLERK_USER_ERROR); + } + if (clerk != null && clerk.getStoreId().equals(UserContext.getCurrentUser().getStoreId())) { + throw new ServiceException(ResultCode.CLERK_ALREADY_EXIT_ERROR); + } + return member; + } + return new Member(); + } + + @Override + public void disable(String id, Boolean status) { + Clerk clerk = this.getById(id); + if (clerk == null) { + throw new ServiceException(ResultCode.USER_NOT_EXIST); + } + //店主无法禁用 + if (clerk.getShopkeeper() && clerk.getStatus()) { + throw new ServiceException(ResultCode.CLERK_SUPPER); + } + clerk.setStatus(status); + this.updateById(clerk); + } +} diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java index 1695271e..ccf6908f 100644 --- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java @@ -17,6 +17,7 @@ import cn.lili.common.security.token.Token; import cn.lili.common.sensitive.SensitiveWordsFilter; import cn.lili.common.utils.BeanUtil; import cn.lili.common.utils.CookieUtil; +import cn.lili.common.utils.StringUtils; import cn.lili.common.utils.UuidUtils; import cn.lili.common.vo.PageVO; import cn.lili.modules.connect.config.ConnectAuthEnum; @@ -119,16 +120,10 @@ public class MemberServiceImpl extends ServiceImpl impleme } @Override - public boolean findByMobile(String uuid, String mobile) { + public Member findByMobile(String mobile) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("mobile", mobile); - Member member = this.baseMapper.selectOne(queryWrapper); - if (member == null) { - throw new ServiceException(ResultCode.USER_NOT_PHONE); - } - cache.put(CachePrefix.FIND_MOBILE + uuid, mobile, 300L); - - return true; + return this.baseMapper.selectOne(queryWrapper); } @Override @@ -256,12 +251,8 @@ public class MemberServiceImpl extends ServiceImpl impleme } @Override - public Member modifyPass(String oldPassword, String newPassword) { - AuthUser tokenUser = UserContext.getCurrentUser(); - if (tokenUser == null) { - throw new ServiceException(ResultCode.USER_NOT_LOGIN); - } - Member member = this.getById(tokenUser.getId()); + public Member modifyPass(String memberId, String oldPassword, String newPassword) { + Member member = this.getById(memberId); //判断旧密码输入是否正确 if (!new BCryptPasswordEncoder().matches(oldPassword, member.getPassword())) { throw new ServiceException(ResultCode.USER_OLD_PASSWORD_ERROR); @@ -581,6 +572,31 @@ public class MemberServiceImpl extends ServiceImpl impleme } } + @Override + public void updateHaveShop(Boolean haveStore, String storeId, List memberIds) { + List members = this.baseMapper.selectBatchIds(memberIds); + if (members.size() > 0) { + members.forEach(member -> { + member.setHaveStore(haveStore); + if (haveStore) { + member.setStoreId(storeId); + } else { + member.setStoreId(null); + } + }); + this.updateBatchById(members); + } + } + + @Override + public void resetPassword(List ids) { + String password = new BCryptPasswordEncoder().encode(StringUtils.md5("123456")); + LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); + lambdaUpdateWrapper.in(Member::getId, ids); + lambdaUpdateWrapper.set(Member::getPassword, password); + this.update(lambdaUpdateWrapper); + } + /** * 检测会员 * @@ -597,4 +613,5 @@ public class MemberServiceImpl extends ServiceImpl impleme throw new ServiceException(ResultCode.USER_PHONE_EXIST); } } + } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreClerkRoleServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreClerkRoleServiceImpl.java new file mode 100644 index 00000000..a37b6f7a --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreClerkRoleServiceImpl.java @@ -0,0 +1,52 @@ +package cn.lili.modules.member.serviceimpl; + +import cn.lili.modules.member.entity.dos.StoreClerkRole; +import cn.lili.modules.member.mapper.StoreClerkRoleMapper; +import cn.lili.modules.member.service.StoreClerkRoleService; +import cn.lili.modules.permission.entity.dos.UserRole; +import cn.lili.modules.permission.mapper.UserRoleMapper; +import cn.lili.modules.permission.service.UserRoleService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用户权限业务层实现 + * + * @author Chopper + * @since 2020/11/17 3:52 下午 + */ +@Service +@Transactional(rollbackFor = Exception.class) +public class StoreClerkRoleServiceImpl extends ServiceImpl implements StoreClerkRoleService { + + @Override + public List listByUserId(String clerkId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("clerk_id", clerkId); + return this.baseMapper.selectList(queryWrapper); + } + + @Override + public List listId(String clerkId) { + List userRoleList = this.listByUserId(clerkId); + List strings = new ArrayList<>(); + userRoleList.forEach(item -> strings.add(item.getRoleId())); + return strings; + } + + @Override + public void updateClerkRole(String clerkId, List storeClerkRoles) { + //删除 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("clerk_id", clerkId); + this.remove(queryWrapper); + //保存 + this.saveBatch(storeClerkRoles); + } + +} diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreDepartmentRoleServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreDepartmentRoleServiceImpl.java new file mode 100644 index 00000000..17dc7de0 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreDepartmentRoleServiceImpl.java @@ -0,0 +1,49 @@ +package cn.lili.modules.member.serviceimpl; + +import cn.lili.common.security.context.UserContext; +import cn.lili.modules.member.entity.dos.StoreDepartmentRole; +import cn.lili.modules.member.mapper.StoreDepartmentRoleMapper; +import cn.lili.modules.member.service.StoreDepartmentRoleService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * 部门角色业务层实现 + * + * @author Chopper + * @since 2020/11/22 12:08 + */ +@Service +@Transactional(rollbackFor = Exception.class) +public class StoreDepartmentRoleServiceImpl extends ServiceImpl implements StoreDepartmentRoleService { + + + @Override + public List listByDepartmentId(String storeDepartmentId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("department_id", storeDepartmentId); + return this.baseMapper.selectList(queryWrapper); + } + + @Override + public void updateByDepartmentId(String storeDepartmentId, List storeDepartmentRoles) { + if (storeDepartmentRoles.size() > 0) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("department_id", storeDepartmentId); + this.remove(queryWrapper); + this.saveBatch(storeDepartmentRoles); + } + } + + @Override + public void deleteByDepartment(List ids) { + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("department_id", ids); + this.remove(queryWrapper); + } +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreDepartmentServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreDepartmentServiceImpl.java new file mode 100644 index 00000000..f9a2c1df --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreDepartmentServiceImpl.java @@ -0,0 +1,112 @@ +package cn.lili.modules.member.serviceimpl; + +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.context.UserContext; +import cn.lili.modules.member.entity.dos.Clerk; +import cn.lili.modules.member.entity.dos.StoreDepartment; +import cn.lili.modules.member.entity.vo.StoreDepartmentVO; +import cn.lili.modules.member.mapper.StoreDepartmentMapper; +import cn.lili.modules.member.service.ClerkService; +import cn.lili.modules.member.service.StoreDepartmentRoleService; +import cn.lili.modules.member.service.StoreDepartmentService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +/** + * 店铺部门业务层实现 + * + * @author Chopper + * @since 2020/11/17 3:47 下午 + */ +@Slf4j +@Service +@Transactional(rollbackFor = Exception.class) +public class StoreDepartmentServiceImpl extends ServiceImpl implements StoreDepartmentService { + + @Autowired + private StoreDepartmentRoleService storeDepartmentRoleService; + + @Autowired + private ClerkService clerkService; + + @Override + public void deleteByIds(List ids) { + //校验是否有操作店铺部门权限 + List storeDepartments = this.list(new QueryWrapper() + .in("id", ids) + .eq("store_id", UserContext.getCurrentUser().getStoreId())); + if (storeDepartments.size() != ids.size()) { + throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); + } + //校验店员是否绑定部门 + if (clerkService.count(new QueryWrapper().in("department_id", ids)) > 0) { + throw new ServiceException(ResultCode.PERMISSION_DEPARTMENT_DELETE_ERROR); + } + //删除店铺部门 + this.removeByIds(ids); + //删除店铺部门角色 + storeDepartmentRoleService.deleteByDepartment(ids); + } + + @Override + public List tree(QueryWrapper initWrapper) { + try { + List departments = this.list(initWrapper); + + List all = new ArrayList<>(); + departments.forEach(item -> all.add(new StoreDepartmentVO(item))); + + List tree = new ArrayList<>(); + all.forEach(item -> { + if ("0".equals(item.getParentId())) { + initChild(item, all); + tree.add(item); + } + }); + + return tree; + } catch (Exception e) { + log.error("部门业务错误", e); + return null; + } + } + + + /** + * 递归初始化子树 + * + * @param tree 树结构 + * @param departmentVOS 数据库对象集合 + */ + private void initChild(StoreDepartmentVO tree, List departmentVOS) { + departmentVOS.stream() + .filter(item -> (item.getParentId().equals(tree.getId()))) + .forEach(child -> { + StoreDepartmentVO childTree = new StoreDepartmentVO(child); + initChild(childTree, departmentVOS); + tree.getChildren().add(childTree); + }); + } + + @Override + public Boolean update(StoreDepartment storeDepartment) { + StoreDepartment temp = this.getById(storeDepartment); + //校验部门是否存在 + if (temp == null) { + throw new ServiceException(ResultCode.PERMISSION_NOT_FOUND_ERROR); + } + //校验店铺权限 + if (!temp.getStoreId().equals(UserContext.getCurrentUser().getStoreId())) { + throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); + } + return this.updateById(storeDepartment); + } +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreMenuRoleServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreMenuRoleServiceImpl.java new file mode 100644 index 00000000..5b876517 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreMenuRoleServiceImpl.java @@ -0,0 +1,104 @@ +package cn.lili.modules.member.serviceimpl; + +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.common.security.context.UserContext; +import cn.lili.modules.member.entity.dos.StoreMenuRole; +import cn.lili.modules.member.entity.vo.StoreUserMenuVO; +import cn.lili.modules.member.mapper.StoreMenuMapper; +import cn.lili.modules.member.mapper.StoreMenuRoleMapper; +import cn.lili.modules.member.service.StoreMenuRoleService; +import cn.lili.modules.permission.entity.dos.RoleMenu; +import cn.lili.modules.permission.entity.vo.UserMenuVO; +import cn.lili.modules.permission.mapper.MenuMapper; +import cn.lili.modules.permission.mapper.RoleMenuMapper; +import cn.lili.modules.permission.service.RoleMenuService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import groovy.util.logging.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 角色菜单业务层实现 + * + * @author Chopper + * @since 2020/11/22 11:43 + */ +@Slf4j +@Service +@Transactional(rollbackFor = Exception.class) +public class StoreMenuRoleServiceImpl extends ServiceImpl implements StoreMenuRoleService { + + /** + * 菜单 + */ + @Resource + private StoreMenuMapper storeMenuMapper; + + + @Autowired + private Cache cache; + + @Override + public List findByRoleId(String roleId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(StoreMenuRole::getRoleId, roleId); + return this.baseMapper.selectList(queryWrapper); + } + + @Override + public List findAllMenu(String userId) { + String cacheKey = CachePrefix.STORE_USER_MENU.getPrefix() + userId; + List menuList = (List) cache.get(cacheKey); + if (menuList == null) { + menuList = storeMenuMapper.getUserRoleMenu(userId); + cache.put(cacheKey, menuList); + } + return menuList; + } + + + @Override + public void updateRoleMenu(String roleId, List roleMenus) { + try { + roleMenus.forEach(role -> { + role.setStoreId(UserContext.getCurrentUser().getStoreId()); + }); + //删除角色已经绑定的菜单 + this.delete(roleId); + //重新保存角色菜单关系 + this.saveBatch(roleMenus); + + cache.vagueDel(CachePrefix.MENU_USER_ID.getPrefix()); + cache.vagueDel(CachePrefix.USER_MENU.getPrefix()); + } catch (Exception e) { + log.error("修改用户权限错误", e); + } + } + + @Override + public void delete(String roleId) { + //删除 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("role_id", roleId); + this.remove(queryWrapper); + cache.vagueDel(CachePrefix.STORE_MENU_USER_ID.getPrefix()); + cache.vagueDel(CachePrefix.STORE_USER_MENU.getPrefix()); + } + + @Override + public void delete(List roleId) { + //删除 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("role_id", roleId); + this.remove(queryWrapper); + cache.vagueDel(CachePrefix.STORE_MENU_USER_ID.getPrefix()); + cache.vagueDel(CachePrefix.STORE_USER_MENU.getPrefix()); + } +} \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreMenuServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreMenuServiceImpl.java new file mode 100644 index 00000000..ef757344 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreMenuServiceImpl.java @@ -0,0 +1,166 @@ +package cn.lili.modules.member.serviceimpl; + +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.AuthUser; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.vo.SearchVO; +import cn.lili.modules.member.entity.dos.StoreMenu; +import cn.lili.modules.member.entity.dos.StoreMenuRole; +import cn.lili.modules.member.entity.vo.StoreMenuVO; +import cn.lili.modules.member.mapper.StoreMenuMapper; +import cn.lili.modules.member.service.StoreMenuRoleService; +import cn.lili.modules.member.service.StoreMenuService; +import cn.lili.modules.permission.entity.dto.MenuSearchParams; +import cn.lili.mybatis.util.PageUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * 权限业务层实现 + * + * @author Chopper + * @since 2020/11/17 3:49 下午 + */ +@Slf4j +@Service +public class StoreMenuServiceImpl extends ServiceImpl implements StoreMenuService { + /** + * 菜单角色 + */ + @Autowired + private StoreMenuRoleService storeMenuRoleService; + + @Autowired + private Cache> cache; + + @Override + public void deleteIds(List ids) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("menu_id", ids); + //如果已有角色绑定菜单,则不能直接删除 + if (storeMenuRoleService.count(queryWrapper) > 0) { + throw new ServiceException(ResultCode.PERMISSION_MENU_ROLE_ERROR); + } + this.removeByIds(ids); + } + + + @Override + public List findUserTree() { + AuthUser authUser = Objects.requireNonNull(UserContext.getCurrentUser()); + if (Boolean.TRUE.equals(authUser.getIsSuper())) { + return this.tree(); + } + List userMenus = this.baseMapper.findByUserId(authUser.getId()); + return this.tree(userMenus); + } + + @Override + public List findUserList(String userId) { + String cacheKey = CachePrefix.STORE_MENU_USER_ID.getPrefix() + userId; + List menuList = cache.get(cacheKey); + if (menuList == null) { + menuList = this.baseMapper.findByUserId(userId); + cache.put(cacheKey, menuList); + } + return menuList; + } + + /** + * 添加更新菜单 + * + * @param storeMenu 菜单数据 + * @return 是否成功 + */ + @Override + public boolean saveOrUpdateMenu(StoreMenu storeMenu) { + if (CharSequenceUtil.isNotEmpty(storeMenu.getId())) { + cache.vagueDel(CachePrefix.STORE_MENU_USER_ID.getPrefix()); + } + return this.saveOrUpdate(storeMenu); + } + + @Override + public List findByRoleIds(String roleId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("role_id", roleId); + return this.list(queryWrapper); + } + + @Override + public List searchList(MenuSearchParams menuSearchParams) { + //title 需要特殊处理 + String title = null; + if (CharSequenceUtil.isNotEmpty(menuSearchParams.getTitle())) { + title = menuSearchParams.getTitle(); + menuSearchParams.setTitle(null); + } + QueryWrapper queryWrapper = PageUtil.initWrapper(menuSearchParams, new SearchVO()); + if (CharSequenceUtil.isNotEmpty(title)) { + queryWrapper.like("title", title); + } + queryWrapper.orderByDesc("sort_order"); + return this.baseMapper.selectList(queryWrapper); + } + + + @Override + public List tree() { + try { + List menus = this.list(); + return tree(menus); + } catch (Exception e) { + log.error("菜单树错误", e); + } + return Collections.emptyList(); + } + + /** + * 传入自定义菜单集合 + * + * @param menus 自定义菜单集合 + * @return 修改后的自定义菜单集合 + */ + private List tree(List menus) { + List tree = new ArrayList<>(); + menus.forEach(item -> { + if (item.getLevel() == 0) { + StoreMenuVO treeItem = new StoreMenuVO(item); + initChild(treeItem, menus); + tree.add(treeItem); + } + }); + //对一级菜单排序 + tree.sort(Comparator.comparing(StoreMenu::getSortOrder)); + return tree; + } + + /** + * 递归初始化子树 + * + * @param tree 树结构 + * @param menus 数据库对象集合 + */ + private void initChild(StoreMenuVO tree, List menus) { + if (menus == null) { + return; + } + menus.stream() + .filter(item -> (item.getParentId().equals(tree.getId()))) + .forEach(child -> { + StoreMenuVO childTree = new StoreMenuVO(child); + initChild(childTree, menus); + tree.getChildren().add(childTree); + }); + } + +} diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreRoleServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreRoleServiceImpl.java new file mode 100644 index 00000000..af2e7a47 --- /dev/null +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreRoleServiceImpl.java @@ -0,0 +1,106 @@ +package cn.lili.modules.member.serviceimpl; + +import cn.lili.common.enums.ResultCode; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.context.UserContext; +import cn.lili.modules.member.entity.dos.StoreRole; +import cn.lili.modules.member.mapper.StoreRoleMapper; +import cn.lili.modules.member.service.StoreClerkRoleService; +import cn.lili.modules.member.service.StoreDepartmentRoleService; +import cn.lili.modules.member.service.StoreMenuRoleService; +import cn.lili.modules.member.service.StoreRoleService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * 角色业务层实现 + * + * @author Chopper + * @since 2020/11/17 3:50 下午 + */ +@Service +@Transactional(rollbackFor = Exception.class) +public class StoreRoleServiceImpl extends ServiceImpl implements StoreRoleService { + + /** + * 部门角色 + */ + @Autowired + private StoreDepartmentRoleService storeDepartmentRoleService; + /** + * 用户权限 + */ + @Autowired + private StoreClerkRoleService storeClerkRoleService; + + @Autowired + private StoreMenuRoleService storeMenuRoleService; + + @Override + public List findByDefaultRole(Boolean defaultRole) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("default_role", true); + return baseMapper.selectList(queryWrapper); + } + + @Override + public void deleteRoles(List roleIds) { + //校验是否为当前店铺 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("id", roleIds); + List roles = this.baseMapper.selectList(queryWrapper); + roles.forEach(role -> { + if (!role.getStoreId().equals(UserContext.getCurrentUser().getStoreId())) { + throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); + } + }); + queryWrapper = new QueryWrapper<>(); + queryWrapper.in("role_id", roleIds); + //校验是否绑定店铺部门 + if (storeDepartmentRoleService.count(queryWrapper) > 0) { + throw new ServiceException(ResultCode.PERMISSION_DEPARTMENT_ROLE_ERROR); + } + //校验是否绑定店员 + if (storeClerkRoleService.count(queryWrapper) > 0) { + throw new ServiceException(ResultCode.PERMISSION_USER_ROLE_ERROR); + } + //删除角色 + this.removeByIds(roleIds); + //删除角色与菜单关联 + storeMenuRoleService.remove(queryWrapper); + } + + @Override + public Boolean update(StoreRole storeRole) { + StoreRole storeRoleTemp = this.getById(storeRole.getId()); + //校验店铺角色是否存在 + if (storeRoleTemp == null) { + throw new ServiceException(ResultCode.PERMISSION_ROLE_NOT_FOUND_ERROR); + } + //校验店铺角色是否属于当前店铺 + if (!storeRoleTemp.getStoreId().equals(UserContext.getCurrentUser().getStoreId())) { + throw new ServiceException(ResultCode.PERMISSION_ROLE_NOT_FOUND_ERROR); + } + return updateById(storeRole); + } + + + @Override + public Boolean saveStoreRole(StoreRole storeRole) { + storeRole.setStoreId(UserContext.getCurrentUser().getStoreId()); + return save(storeRole); + } + + @Override + public List list(List ids) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("store_id", UserContext.getCurrentUser().getStoreId()); + queryWrapper.in("id", ids); + return this.baseMapper.selectList(queryWrapper); + } +} diff --git a/framework/src/main/java/cn/lili/modules/member/token/StoreTokenGenerate.java b/framework/src/main/java/cn/lili/modules/member/token/StoreTokenGenerate.java index 9d10db60..a6040a51 100644 --- a/framework/src/main/java/cn/lili/modules/member/token/StoreTokenGenerate.java +++ b/framework/src/main/java/cn/lili/modules/member/token/StoreTokenGenerate.java @@ -1,20 +1,34 @@ package cn.lili.modules.member.token; +import cn.hutool.core.text.CharSequenceUtil; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.common.security.AuthUser; +import cn.lili.common.security.enums.PermissionEnum; import cn.lili.common.security.enums.UserEnums; import cn.lili.common.security.token.Token; import cn.lili.common.security.token.TokenUtil; import cn.lili.common.security.token.base.AbstractTokenGenerate; +import cn.lili.modules.member.entity.dos.Clerk; import cn.lili.modules.member.entity.dos.Member; +import cn.lili.modules.member.entity.vo.StoreUserMenuVO; +import cn.lili.modules.member.service.ClerkService; import cn.lili.modules.member.service.MemberService; +import cn.lili.modules.member.service.StoreMenuRoleService; +import cn.lili.modules.permission.entity.vo.UserMenuVO; import cn.lili.modules.store.entity.dos.Store; import cn.lili.modules.store.service.StoreService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + /** * 商家token生成 * @@ -30,6 +44,12 @@ public class StoreTokenGenerate extends AbstractTokenGenerate { private StoreService storeService; @Autowired private TokenUtil tokenUtil; + @Autowired + private StoreMenuRoleService storeMenuRoleService; + @Autowired + private Cache cache; + @Autowired + private ClerkService clerkService; @Override public Token createToken(String username, Boolean longTerm) { @@ -38,10 +58,25 @@ public class StoreTokenGenerate extends AbstractTokenGenerate { if (!member.getHaveStore()) { throw new ServiceException(ResultCode.STORE_NOT_OPEN); } - AuthUser user = new AuthUser(member.getUsername(), member.getId(), member.getNickName(), UserEnums.STORE); - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Store::getMemberId, member.getId()); - Store store = storeService.getOne(queryWrapper); + //根据会员id查询店员信息 + Clerk clerk = clerkService.getClerkByMemberId(member.getId()); + + AuthUser user = new AuthUser(member.getUsername(), member.getId(), UserEnums.STORE, member.getNickName(), clerk.getIsSuper(), clerk.getId()); + + if (clerk == null) { + throw new ServiceException(ResultCode.CLERK_NOT_FOUND_ERROR); + } + if (!clerk.getStatus()) { + throw new ServiceException(ResultCode.CLERK_DISABLED_ERROR); + } + List storeUserMenuVOS = storeMenuRoleService.findAllMenu(clerk.getId()); + //缓存权限列表 + cache.put(CachePrefix.PERMISSION_LIST.getPrefix(UserEnums.STORE) + clerk.getId(), this.permissionList(storeUserMenuVOS)); + //查询店铺信息 + Store store = storeService.getById(clerk.getStoreId()); + if (store == null) { + throw new ServiceException(ResultCode.STORE_NOT_OPEN); + } user.setStoreId(store.getId()); user.setStoreName(store.getStoreName()); return tokenUtil.createToken(username, user, longTerm, UserEnums.STORE); @@ -52,4 +87,65 @@ public class StoreTokenGenerate extends AbstractTokenGenerate { return tokenUtil.refreshToken(refreshToken, UserEnums.STORE); } + /** + * 获取用户权限 + * + * @param userMenuVOList + * @return + */ + private Map> permissionList(List userMenuVOList) { + Map> permission = new HashMap<>(2); + + List superPermissions = new ArrayList<>(); + List queryPermissions = new ArrayList<>(); + initPermission(superPermissions, queryPermissions); + + //循环权限菜单 + if (userMenuVOList != null && !userMenuVOList.isEmpty()) { + userMenuVOList.forEach(menu -> { + //循环菜单,赋予用户权限 + if (CharSequenceUtil.isNotEmpty(menu.getPermission())) { + //获取路径集合 + String[] permissionUrl = menu.getPermission().split(","); + //for循环路径集合 + for (String url : permissionUrl) { + //如果是超级权限 则计入超级权限 + if (Boolean.TRUE.equals(menu.getSuper())) { + //如果已有超级权限,则这里就不做权限的累加 + if (!superPermissions.contains(url)) { + superPermissions.add(url); + } + } + //否则计入浏览权限 + else { + //没有权限,则累加。 + if (!queryPermissions.contains(url)) { + queryPermissions.add(url); + } + } + } + } + //去除重复的权限 + queryPermissions.removeAll(superPermissions); + }); + } + permission.put(PermissionEnum.SUPER.name(), superPermissions); + permission.put(PermissionEnum.QUERY.name(), queryPermissions); + return permission; + } + + + /** + * 初始赋予的权限,查看权限包含首页流量统计权限, + * 超级权限包含个人信息维护,密码修改权限 + * + * @param superPermissions 超级权限 + * @param queryPermissions 查询权限 + */ + void initPermission(List superPermissions, List queryPermissions) { + + + } + + } diff --git a/framework/src/main/java/cn/lili/modules/store/serviceimpl/StoreServiceImpl.java b/framework/src/main/java/cn/lili/modules/store/serviceimpl/StoreServiceImpl.java index 0cc64d26..ba32a8a6 100644 --- a/framework/src/main/java/cn/lili/modules/store/serviceimpl/StoreServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/store/serviceimpl/StoreServiceImpl.java @@ -10,7 +10,9 @@ import cn.lili.common.utils.BeanUtil; import cn.lili.common.vo.PageVO; import cn.lili.modules.goods.service.GoodsService; import cn.lili.modules.member.entity.dos.Member; +import cn.lili.modules.member.entity.dto.ClerkAddDTO; import cn.lili.modules.member.entity.dto.CollectionDTO; +import cn.lili.modules.member.service.ClerkService; import cn.lili.modules.member.service.MemberService; import cn.lili.modules.store.entity.dos.Store; import cn.lili.modules.store.entity.dos.StoreDetail; @@ -50,6 +52,12 @@ public class StoreServiceImpl extends ServiceImpl implements */ @Autowired private MemberService memberService; + + /** + * 店员 + */ + @Autowired + private ClerkService clerkService; /** * 商品 */ @@ -171,6 +179,13 @@ public class StoreServiceImpl extends ServiceImpl implements member.setHaveStore(true); member.setStoreId(id); memberService.updateById(member); + //创建店员 + ClerkAddDTO clerkAddDTO = new ClerkAddDTO(); + clerkAddDTO.setMemberId(member.getId()); + clerkAddDTO.setIsSuper(true); + clerkAddDTO.setShopkeeper(true); + clerkAddDTO.setStoreId(id); + clerkService.saveClerk(clerkAddDTO); //设定商家的结算日 storeDetailService.update(new LambdaUpdateWrapper() .eq(StoreDetail::getStoreId, id) diff --git a/framework/src/main/java/cn/lili/modules/system/token/ManagerTokenGenerate.java b/framework/src/main/java/cn/lili/modules/system/token/ManagerTokenGenerate.java index a8d96caa..32464c77 100644 --- a/framework/src/main/java/cn/lili/modules/system/token/ManagerTokenGenerate.java +++ b/framework/src/main/java/cn/lili/modules/system/token/ManagerTokenGenerate.java @@ -47,7 +47,6 @@ public class ManagerTokenGenerate extends AbstractTokenGenerate { AdminUser adminUser = adminUserService.findByUsername(username); AuthUser user = new AuthUser(adminUser.getUsername(), adminUser.getId(), UserEnums.MANAGER, adminUser.getNickName(), adminUser.getIsSuper()); - List userMenuVOList = roleMenuService.findAllMenu(user.getId()); //缓存权限列表 cache.put(CachePrefix.PERMISSION_LIST.getPrefix(UserEnums.MANAGER) + user.getId(), this.permissionList(userMenuVOList)); diff --git a/seller-api/src/main/java/cn/lili/controller/passport/StorePassportController.java b/seller-api/src/main/java/cn/lili/controller/passport/StorePassportController.java index a4cc3a96..b496271b 100644 --- a/seller-api/src/main/java/cn/lili/controller/passport/StorePassportController.java +++ b/seller-api/src/main/java/cn/lili/controller/passport/StorePassportController.java @@ -1,9 +1,12 @@ package cn.lili.controller.passport; +import cn.lili.common.aop.annotation.DemoSite; import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultUtil; import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.AuthUser; +import cn.lili.common.security.context.UserContext; import cn.lili.common.security.enums.UserEnums; import cn.lili.common.vo.ResultMessage; import cn.lili.modules.member.entity.dos.Member; @@ -15,6 +18,7 @@ import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.web.bind.annotation.*; import javax.validation.constraints.NotNull; @@ -70,7 +74,11 @@ public class StorePassportController { @PostMapping("/modifyPass") public ResultMessage modifyPass(@NotNull(message = "旧密码不能为空") @RequestParam String password, @NotNull(message = "新密码不能为空") @RequestParam String newPassword) { - return ResultUtil.data(memberService.modifyPass(password, newPassword)); + AuthUser tokenUser = UserContext.getCurrentUser(); + if (tokenUser == null) { + throw new ServiceException(ResultCode.USER_NOT_LOGIN); + } + return ResultUtil.data(memberService.modifyPass(tokenUser.getId(), password, newPassword)); } @ApiOperation(value = "刷新token") @@ -80,4 +88,5 @@ public class StorePassportController { } + } diff --git a/seller-api/src/main/java/cn/lili/controller/permission/ClerkStoreController.java b/seller-api/src/main/java/cn/lili/controller/permission/ClerkStoreController.java new file mode 100644 index 00000000..74afd5fc --- /dev/null +++ b/seller-api/src/main/java/cn/lili/controller/permission/ClerkStoreController.java @@ -0,0 +1,155 @@ +package cn.lili.controller.permission; + +import cn.lili.common.aop.annotation.DemoSite; +import cn.lili.common.enums.ResultCode; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.exception.ServiceException; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.validation.Phone; +import cn.lili.common.vo.PageVO; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.member.entity.dos.Clerk; +import cn.lili.modules.member.entity.dos.Member; +import cn.lili.modules.member.entity.dto.*; +import cn.lili.modules.member.entity.vo.ClerkVO; +import cn.lili.modules.member.service.ClerkService; +import cn.lili.modules.member.service.MemberService; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.annotations.Delete; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.ArrayList; +import java.util.List; + + +/** + * 店员接口 + * + * @author Chopper + * @since 2020/11/16 10:57 + */ +@Slf4j +@RestController +@Api(tags = "店员") +@RequestMapping("/store/clerk") +@Transactional(rollbackFor = Exception.class) +@Validated +public class ClerkStoreController { + @Autowired + private ClerkService clerkService; + + @Autowired + private MemberService memberService; + + + @GetMapping + @ApiOperation(value = "分页获取店员列表") + public ResultMessage> page(ClerkQueryDTO clerkQueryDTO, + PageVO pageVo) { + + IPage page = clerkService.clerkForPage(pageVo, clerkQueryDTO); + return ResultUtil.data(page); + } + + @GetMapping("/{id}") + @ApiOperation(value = "获取店员详细") + public ResultMessage get(@PathVariable String id) { + + return ResultUtil.data(clerkService.get(id)); + } + + + @PostMapping("/{mobile}/check") + @ApiOperation(value = "检测手机号码有效性") + public ResultMessage check(@PathVariable @Phone(message = "手机号码格式不正确") String mobile) { + return ResultUtil.data(clerkService.checkClerk(mobile)); + } + + + @PostMapping + @ApiOperation(value = "添加店员") + public ResultMessage add(@Valid ClerkAddDTO clerkAddDTO) { + int rolesMaxSize = 10; + try { + if (clerkAddDTO.getRoles() != null && clerkAddDTO.getRoles().size() >= rolesMaxSize) { + throw new ServiceException(ResultCode.PERMISSION_BEYOND_TEN); + } + //校验是否已经是会员 + Member member = memberService.findByMobile(clerkAddDTO.getMobile()); + if (member == null) { + //添加会员 + MemberAddDTO memberAddDTO = new MemberAddDTO(); + memberAddDTO.setMobile(clerkAddDTO.getMobile()); + memberAddDTO.setPassword(clerkAddDTO.getPassword()); + memberAddDTO.setUsername(clerkAddDTO.getUsername()); + member = memberService.addMember(memberAddDTO); + } else { + //校验要添加的会员是否已经是店主 + if (member.getHaveStore()) { + throw new ServiceException(ResultCode.STORE_APPLY_DOUBLE_ERROR); + } + //校验会员的有效性 + if (!member.getDisabled()) { + throw new ServiceException(ResultCode.USER_STATUS_ERROR); + } + } + //添加店员 + clerkAddDTO.setMemberId(member.getId()); + clerkAddDTO.setShopkeeper(false); + clerkAddDTO.setStoreId(UserContext.getCurrentUser().getStoreId()); + clerkService.saveClerk(clerkAddDTO); + //修改此会员拥有店铺 + List ids = new ArrayList<>(); + ids.add(member.getId()); + memberService.updateHaveShop(true, UserContext.getCurrentUser().getStoreId(), ids); + } catch (Exception e) { + log.error("添加店员出错", e); + } + return ResultUtil.success(); + } + + + @PutMapping("/{id}") + @ApiImplicitParam(name = "id", value = "店员id", required = true, paramType = "path") + @ApiOperation(value = "修改店员") + public ResultMessage edit(@PathVariable String id, @Valid ClerkEditDTO clerkEditDTO) { + clerkEditDTO.setId(id); + return ResultUtil.data(clerkService.updateClerk(clerkEditDTO)); + } + + @PutMapping(value = "/enable/{clerkId}") + @ApiOperation(value = "禁/启 用 店员") + @DemoSite + public ResultMessage disable(@ApiParam("用户唯一id标识") @PathVariable String clerkId, Boolean status) { + clerkService.disable(clerkId, status); + return ResultUtil.success(); + } + + + @DeleteMapping(value = "/delByIds/{ids}") + @ApiOperation(value = "删除店员") + public ResultMessage deleteClerk(@PathVariable List ids) { + clerkService.deleteClerk(ids); + return ResultUtil.success(); + } + + + @PostMapping(value = "/resetPassword/{ids}") + @ApiOperation(value = "重置密码") + @DemoSite + public ResultMessage resetPassword(@PathVariable List ids) { + clerkService.resetPassword(ids); + return ResultUtil.success(ResultCode.USER_EDIT_SUCCESS); + } + + +} diff --git a/seller-api/src/main/java/cn/lili/controller/permission/StoreDepartmentController.java b/seller-api/src/main/java/cn/lili/controller/permission/StoreDepartmentController.java new file mode 100644 index 00000000..a5f21f6d --- /dev/null +++ b/seller-api/src/main/java/cn/lili/controller/permission/StoreDepartmentController.java @@ -0,0 +1,70 @@ +package cn.lili.controller.permission; + +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.vo.ResultMessage; +import cn.lili.common.vo.SearchVO; +import cn.lili.modules.member.entity.dos.StoreDepartment; +import cn.lili.modules.member.entity.vo.StoreDepartmentVO; +import cn.lili.modules.member.service.StoreDepartmentService; +import cn.lili.mybatis.util.PageUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +/** + * 管理端,部门管理接口 + * + * @author Chopper + * @since 2020/11/22 12:06 + */ +@RestController +@Api(tags = "店铺端,部门管理接口") +@RequestMapping("/store/department") +public class StoreDepartmentController { + @Autowired + private StoreDepartmentService storeDepartmentService; + + @GetMapping(value = "/{id}") + @ApiOperation(value = "查看部门详情") + public ResultMessage get(@PathVariable String id) { + StoreDepartment storeDepartment = storeDepartmentService.getById(id); + return ResultUtil.data(storeDepartment); + } + + @GetMapping + @ApiOperation(value = "获取树状结构") + public ResultMessage> getByPage(StoreDepartment entity, + SearchVO searchVo) { + entity.setStoreId(UserContext.getCurrentUser().getStoreId()); + return ResultUtil.data(storeDepartmentService.tree(PageUtil.initWrapper(entity, searchVo))); + + } + + @PostMapping + @ApiOperation(value = "新增部门") + public ResultMessage save(StoreDepartment storeDepartment) { + storeDepartment.setStoreId(UserContext.getCurrentUser().getStoreId()); + storeDepartmentService.save(storeDepartment); + return ResultUtil.data(storeDepartment); + } + + @PutMapping("/{id}") + @ApiOperation(value = "更新部门") + public ResultMessage update(@PathVariable String id, StoreDepartment storeDepartment) { + storeDepartment.setId(id); + storeDepartmentService.update(storeDepartment); + return ResultUtil.data(storeDepartment); + } + + @DeleteMapping(value = "/{ids}") + @ApiOperation(value = "删除部门") + public ResultMessage delAllByIds(@PathVariable List ids) { + storeDepartmentService.deleteByIds(ids); + return ResultUtil.success(); + } +} diff --git a/seller-api/src/main/java/cn/lili/controller/permission/StoreDepartmentRoleController.java b/seller-api/src/main/java/cn/lili/controller/permission/StoreDepartmentRoleController.java new file mode 100644 index 00000000..d395abaf --- /dev/null +++ b/seller-api/src/main/java/cn/lili/controller/permission/StoreDepartmentRoleController.java @@ -0,0 +1,42 @@ +package cn.lili.controller.permission; + +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.member.entity.dos.StoreDepartmentRole; +import cn.lili.modules.member.service.StoreDepartmentRoleService; +import cn.lili.modules.permission.entity.dos.DepartmentRole; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +/** + * 店铺端,部门角色接口 + * + * @author Chopper + * @since 2020/11/22 14:05 + */ +@RestController +@Api(tags = "店铺端,部门角色接口") +@RequestMapping("/store/departmentRole") +public class StoreDepartmentRoleController { + @Autowired + private StoreDepartmentRoleService storeDepartmentRoleService; + + @GetMapping(value = "/{departmentId}") + @ApiOperation(value = "查看部门拥有的角色") + public ResultMessage> get(@PathVariable String departmentId) { + return ResultUtil.data(storeDepartmentRoleService.listByDepartmentId(departmentId)); + } + + @PutMapping("/{departmentId}") + @ApiOperation(value = "更新部门角色") + public ResultMessage update(@PathVariable String departmentId, @RequestBody List storeDepartmentRoles) { + storeDepartmentRoleService.updateByDepartmentId(departmentId, storeDepartmentRoles); + return ResultUtil.success(); + } + +} diff --git a/seller-api/src/main/java/cn/lili/controller/permission/StoreMenuController.java b/seller-api/src/main/java/cn/lili/controller/permission/StoreMenuController.java new file mode 100644 index 00000000..bc4ee683 --- /dev/null +++ b/seller-api/src/main/java/cn/lili/controller/permission/StoreMenuController.java @@ -0,0 +1,49 @@ +package cn.lili.controller.permission; + +import cn.lili.common.aop.annotation.DemoSite; +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.member.entity.vo.StoreMenuVO; +import cn.lili.modules.member.service.StoreMenuService; +import cn.lili.modules.permission.entity.dos.Menu; +import cn.lili.modules.permission.entity.dto.MenuSearchParams; +import cn.lili.modules.permission.entity.vo.MenuVO; +import cn.lili.modules.permission.service.MenuService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +/** + * 管理端,菜单管理接口 + * + * @author Chopper + * @since 2020/11/20 12:07 + */ +@Slf4j +@RestController +@Api(tags = "店铺端,菜单管理接口") +@RequestMapping("/store/menu") +public class StoreMenuController { + + @Autowired + private StoreMenuService storeMenuService; + + + @ApiOperation(value = "获取所有菜单") + @GetMapping("/tree") + public ResultMessage> getAllMenuList() { + return ResultUtil.data(storeMenuService.tree()); + } + + @ApiOperation(value = "获取所有菜单") + @GetMapping("/memberMenu") + public ResultMessage> memberMenu() { + return ResultUtil.data(storeMenuService.findUserTree()); + } +} diff --git a/seller-api/src/main/java/cn/lili/controller/permission/StoreMenuRoleController.java b/seller-api/src/main/java/cn/lili/controller/permission/StoreMenuRoleController.java new file mode 100644 index 00000000..ae4f99f7 --- /dev/null +++ b/seller-api/src/main/java/cn/lili/controller/permission/StoreMenuRoleController.java @@ -0,0 +1,43 @@ +package cn.lili.controller.permission; + +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.member.entity.dos.StoreMenuRole; +import cn.lili.modules.member.service.StoreMenuRoleService; +import cn.lili.modules.permission.entity.dos.RoleMenu; +import cn.lili.modules.permission.service.RoleMenuService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +/** + * 店铺端,角色菜单接口 + * + * @author Chopper + * @since 2020/11/22 11:40 + */ +@RestController +@Api(tags = "店铺端,角色菜单接口") +@RequestMapping("/store/roleMenu") +public class StoreMenuRoleController { + @Autowired + private StoreMenuRoleService storeMenuRoleService; + + @GetMapping(value = "/{roleId}") + @ApiOperation(value = "查看某角色拥有到菜单") + public ResultMessage> get(@PathVariable String roleId) { + return ResultUtil.data(storeMenuRoleService.findByRoleId(roleId)); + } + + @PostMapping(value = "/{roleId}") + @ApiOperation(value = "保存角色菜单") + public ResultMessage save(@PathVariable String roleId, @RequestBody List roleMenus) { + storeMenuRoleService.updateRoleMenu(roleId, roleMenus); + return ResultUtil.success(); + } + +} diff --git a/seller-api/src/main/java/cn/lili/controller/permission/StoreRoleController.java b/seller-api/src/main/java/cn/lili/controller/permission/StoreRoleController.java new file mode 100644 index 00000000..83e5761e --- /dev/null +++ b/seller-api/src/main/java/cn/lili/controller/permission/StoreRoleController.java @@ -0,0 +1,65 @@ +package cn.lili.controller.permission; + +import cn.lili.common.enums.ResultUtil; +import cn.lili.common.security.context.UserContext; +import cn.lili.common.vo.PageVO; +import cn.lili.common.vo.ResultMessage; +import cn.lili.modules.member.entity.dos.StoreRole; +import cn.lili.modules.member.service.StoreRoleService; +import cn.lili.modules.permission.entity.dos.Role; +import cn.lili.modules.permission.service.RoleService; +import cn.lili.mybatis.util.PageUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +/** + * 店铺端,角色管理接口 + * + * @author Chopper + * @since 2020/11/20 18:50 + */ +@RestController +@Api(tags = "店铺端,店铺角色管理接口") +@RequestMapping("/store/role") +public class StoreRoleController { + @Autowired + private StoreRoleService storeRoleService; + + @PostMapping + @ApiOperation(value = "添加角色") + public ResultMessage add(StoreRole storeRole) { + storeRoleService.saveStoreRole(storeRole); + return ResultUtil.data(storeRole); + } + + @GetMapping + @ApiOperation(value = "查询店铺角色") + public ResultMessage page(PageVO pageVo, StoreRole storeRole) { + storeRole.setStoreId(UserContext.getCurrentUser().getStoreId()); + Page page = storeRoleService.page(PageUtil.initPage(pageVo), PageUtil.initWrapper(storeRole)); + return ResultUtil.data(page); + } + + @PutMapping("/{roleId}") + @ApiOperation(value = "编辑店铺角色") + public ResultMessage edit(@PathVariable String roleId, StoreRole storeRole) { + storeRole.setId(roleId); + storeRoleService.update(storeRole); + return ResultUtil.data(storeRole); + } + + @DeleteMapping(value = "/{ids}") + @ApiOperation(value = "批量删除店铺角色") + public ResultMessage delByIds(@PathVariable List ids) { + storeRoleService.deleteRoles(ids); + return ResultUtil.success(); + } + + +} diff --git a/seller-api/src/main/java/cn/lili/security/StoreAuthenticationFilter.java b/seller-api/src/main/java/cn/lili/security/StoreAuthenticationFilter.java index 7b20ea1f..5444a4fc 100755 --- a/seller-api/src/main/java/cn/lili/security/StoreAuthenticationFilter.java +++ b/seller-api/src/main/java/cn/lili/security/StoreAuthenticationFilter.java @@ -1,9 +1,11 @@ package cn.lili.security; import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; import cn.lili.cache.Cache; import cn.lili.cache.CachePrefix; import cn.lili.common.security.AuthUser; +import cn.lili.common.security.enums.PermissionEnum; import cn.lili.common.security.enums.SecurityEnum; import cn.lili.common.security.enums.UserEnums; import cn.lili.common.security.token.SecretKeyUtil; @@ -20,7 +22,10 @@ import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; +import org.springframework.util.PatternMatchUtils; +import org.springframework.web.bind.annotation.RequestMethod; +import javax.naming.NoPermissionException; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -28,6 +33,7 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Map; /** * @author Chopper @@ -46,19 +52,20 @@ public class StoreAuthenticationFilter extends BasicAuthenticationFilter { @SneakyThrows @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { - - String accessToken = request.getHeader(SecurityEnum.HEADER_TOKEN.getValue()); - if (StrUtil.isBlank(accessToken)) { + //从header中获取jwt + String jwt = request.getHeader(SecurityEnum.HEADER_TOKEN.getValue()); + //如果没有token 则return + if (StrUtil.isBlank(jwt)) { chain.doFilter(request, response); return; } - try { - UsernamePasswordAuthenticationToken authentication = getAuthentication(accessToken, response); + //获取用户信息,存入context + UsernamePasswordAuthenticationToken authentication = getAuthentication(jwt, response); + //自定义权限过滤 + if (authentication != null) { + customAuthentication(request, response, authentication); SecurityContextHolder.getContext().setAuthentication(authentication); - } catch (Exception e) { - log.error(e.getMessage()); } - chain.doFilter(request, response); } @@ -100,5 +107,60 @@ public class StoreAuthenticationFilter extends BasicAuthenticationFilter { } return null; } + + + /** + * 自定义权限过滤 + * + * @param request 请求 + * @param response 响应 + * @param authentication 用户信息 + */ + private void customAuthentication(HttpServletRequest request, HttpServletResponse response, UsernamePasswordAuthenticationToken authentication) throws NoPermissionException { + AuthUser authUser = (AuthUser) authentication.getDetails(); + String requestUrl = request.getRequestURI(); + + + //如果不是超级管理员, 则鉴权 + if (!authUser.getIsSuper()) { + //获取缓存中的权限 + Map> permission = (Map>) cache.get(CachePrefix.PERMISSION_LIST.getPrefix(UserEnums.STORE) + authUser.getId()); + + //获取数据(GET 请求)权限 + if (request.getMethod().equals(RequestMethod.GET.name())) { + //如果用户的超级权限和查阅权限都不包含当前请求的api + if (match(permission.get(PermissionEnum.SUPER.name()), requestUrl) || + match(permission.get(PermissionEnum.QUERY.name()), requestUrl)) { + } else { + ResponseUtil.output(response, ResponseUtil.resultMap(false, 400, "权限不足")); + log.error("当前请求路径:{},所拥有权限:{}", requestUrl, JSONUtil.toJsonStr(permission)); + throw new NoPermissionException("权限不足"); + } + } + //非get请求(数据操作) 判定鉴权 + else { + if (!match(permission.get(PermissionEnum.SUPER.name()), requestUrl)) { + ResponseUtil.output(response, ResponseUtil.resultMap(false, 400, "权限不足")); + log.error("当前请求路径:{},所拥有权限:{}", requestUrl, JSONUtil.toJsonStr(permission)); + throw new NoPermissionException("权限不足"); + } + } + } + } + + /** + * 校验权限 + * + * @param permissions 权限集合 + * @param url 请求地址 + * @return 是否拥有权限 + */ + boolean match(List permissions, String url) { + if (permissions == null || permissions.isEmpty()) { + return false; + } + return PatternMatchUtils.simpleMatch(permissions.toArray(new String[0]), url); + } + } From d5091bf65988444666048895ea95b5536df00f21 Mon Sep 17 00:00:00 2001 From: zhenghao <1321288662@qq.com> Date: Thu, 10 Feb 2022 20:29:53 +0800 Subject: [PATCH 02/10] =?UTF-8?q?=E5=BA=97=E5=91=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/lili/common/security/AuthUser.java | 4 ++-- .../cn/lili/modules/member/token/StoreTokenGenerate.java | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/framework/src/main/java/cn/lili/common/security/AuthUser.java b/framework/src/main/java/cn/lili/common/security/AuthUser.java index 74717bfa..f49f2051 100644 --- a/framework/src/main/java/cn/lili/common/security/AuthUser.java +++ b/framework/src/main/java/cn/lili/common/security/AuthUser.java @@ -83,15 +83,15 @@ public class AuthUser implements Serializable { this.role = manager; this.isSuper = isSuper; this.nickName = nickName; - this.clerkId = clerkId; } - public AuthUser(String username, String id, UserEnums manager, String nickName, Boolean isSuper, String clerkId) { + public AuthUser(String username, String id, UserEnums manager, String nickName, Boolean isSuper, String clerkId,String face) { this.username = username; this.id = id; this.role = manager; this.isSuper = isSuper; this.nickName = nickName; this.clerkId = clerkId; + this.face = face; } } diff --git a/framework/src/main/java/cn/lili/modules/member/token/StoreTokenGenerate.java b/framework/src/main/java/cn/lili/modules/member/token/StoreTokenGenerate.java index 92561584..edc8e82c 100644 --- a/framework/src/main/java/cn/lili/modules/member/token/StoreTokenGenerate.java +++ b/framework/src/main/java/cn/lili/modules/member/token/StoreTokenGenerate.java @@ -54,8 +54,6 @@ public class StoreTokenGenerate extends AbstractTokenGenerate { //根据会员id查询店员信息 Clerk clerk = clerkService.getClerkByMemberId(member.getId()); - AuthUser user = new AuthUser(member.getUsername(), member.getId(), UserEnums.STORE, member.getNickName(), clerk.getIsSuper(), clerk.getId()); - if (clerk == null) { throw new ServiceException(ResultCode.CLERK_NOT_FOUND_ERROR); } @@ -70,7 +68,8 @@ public class StoreTokenGenerate extends AbstractTokenGenerate { if (store == null) { throw new ServiceException(ResultCode.STORE_NOT_OPEN); } - AuthUser authUser = new AuthUser(member.getUsername(), member.getId(), member.getNickName(), store.getStoreLogo(), UserEnums.STORE); + AuthUser authUser = new AuthUser(member.getUsername(), member.getId(), UserEnums.STORE, member.getNickName(), clerk.getIsSuper(), clerk.getId(),store.getStoreLogo()); + authUser.setStoreId(store.getId()); authUser.setStoreName(store.getStoreName()); return tokenUtil.createToken(member.getUsername(), authUser, longTerm, UserEnums.STORE); From 7358fd0c23d0db092366385bcdb4fb49e6d8a337 Mon Sep 17 00:00:00 2001 From: paulGao Date: Fri, 25 Feb 2022 16:23:35 +0800 Subject: [PATCH 03/10] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E5=95=86=E5=93=81=E6=97=B6=EF=BC=8C=E6=97=A0=E5=95=86=E5=93=81?= =?UTF-8?q?=E7=B4=A2=E5=BC=95=E6=97=B6=E5=88=9D=E5=A7=8B=E5=8C=96=E7=B4=A2?= =?UTF-8?q?=E5=BC=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../search/serviceimpl/EsGoodsSearchServiceImpl.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsSearchServiceImpl.java b/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsSearchServiceImpl.java index 29e58226..afbab567 100644 --- a/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsSearchServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsSearchServiceImpl.java @@ -14,6 +14,7 @@ import cn.lili.modules.search.entity.dto.EsGoodsSearchDTO; import cn.lili.modules.search.entity.dto.HotWordsDTO; import cn.lili.modules.search.entity.dto.ParamOptions; import cn.lili.modules.search.entity.dto.SelectorOptions; +import cn.lili.modules.search.service.EsGoodsIndexService; import cn.lili.modules.search.service.EsGoodsSearchService; import com.alibaba.druid.util.StringUtils; import lombok.extern.slf4j.Slf4j; @@ -74,6 +75,9 @@ public class EsGoodsSearchServiceImpl implements EsGoodsSearchService { @Autowired @Qualifier("elasticsearchRestTemplate") private ElasticsearchRestTemplate restTemplate; + + @Autowired + private EsGoodsIndexService esGoodsIndexService; /** * 缓存 */ @@ -82,6 +86,10 @@ public class EsGoodsSearchServiceImpl implements EsGoodsSearchService { @Override public SearchPage searchGoods(EsGoodsSearchDTO searchDTO, PageVO pageVo) { + boolean exists = restTemplate.indexOps(EsGoodsIndex.class).exists(); + if (!exists) { + esGoodsIndexService.init(); + } if (CharSequenceUtil.isNotEmpty(searchDTO.getKeyword())) { cache.incrementScore(CachePrefix.HOT_WORD.getPrefix(), searchDTO.getKeyword()); } From e27185d424ee14e0390b67d975e54dba68bc76dd Mon Sep 17 00:00:00 2001 From: paulGao Date: Tue, 1 Mar 2022 11:49:35 +0800 Subject: [PATCH 04/10] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=9C=AA=E5=BC=80?= =?UTF-8?q?=E5=A7=8B=E7=9A=84=E7=A7=92=E6=9D=80=E6=B4=BB=E5=8A=A8=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=97=B6=EF=BC=8C=E5=85=88=E6=B7=BB=E5=8A=A0=E7=A7=92?= =?UTF-8?q?=E6=9D=80=E5=95=86=E5=93=81=E5=90=8E=E4=BF=AE=E6=94=B9=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E6=97=B6=EF=BC=8C=E7=A7=92=E6=9D=80=E6=B4=BB=E5=8A=A8?= =?UTF-8?q?=E5=95=86=E5=93=81=E6=97=B6=E9=97=B4=E6=B2=A1=E6=9C=89=E6=94=B9?= =?UTF-8?q?=E5=8F=98=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/SeckillApplyService.java | 9 +++++ .../serviceimpl/SeckillApplyServiceImpl.java | 37 +++++++++++++++++++ .../serviceimpl/SeckillServiceImpl.java | 19 ++++++++++ 3 files changed, 65 insertions(+) diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/SeckillApplyService.java b/framework/src/main/java/cn/lili/modules/promotion/service/SeckillApplyService.java index 99b60133..8d67dd74 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/service/SeckillApplyService.java +++ b/framework/src/main/java/cn/lili/modules/promotion/service/SeckillApplyService.java @@ -1,6 +1,7 @@ package cn.lili.modules.promotion.service; import cn.lili.common.vo.PageVO; +import cn.lili.modules.promotion.entity.dos.Seckill; import cn.lili.modules.promotion.entity.dos.SeckillApply; import cn.lili.modules.promotion.entity.dto.search.SeckillSearchParams; import cn.lili.modules.promotion.entity.vos.SeckillApplyVO; @@ -97,4 +98,12 @@ public interface SeckillApplyService extends IService { */ void updateSeckillApplyQuantity(String seckillId, String skuId, Integer quantity); + /** + * 更新秒杀活动时间 + * + * @param seckill 秒杀活动 + * @return 是否更新成功 + */ + boolean updateSeckillApplyTime(Seckill seckill); + } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillApplyServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillApplyServiceImpl.java index a421e9e6..66071234 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillApplyServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillApplyServiceImpl.java @@ -185,6 +185,7 @@ public class SeckillApplyServiceImpl extends ServiceImpl promotionGoodsList = new ArrayList<>(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SeckillApply::getSeckillId, seckill.getId()); + List list = this.list(queryWrapper); + for (SeckillApply seckillApply : list) { + //获取参与活动的商品信息 + GoodsSku goodsSku = goodsSkuService.getGoodsSkuByIdFromCache(seckillApply.getSkuId()); + //获取促销商品 + PromotionGoods promotionGoods = this.setSeckillGoods(goodsSku, seckillApply, seckill); + promotionGoodsList.add(promotionGoods); + } + //保存促销活动商品信息 + if (!promotionGoodsList.isEmpty()) { + PromotionGoodsSearchParams searchParams = new PromotionGoodsSearchParams(); + searchParams.setPromotionType(PromotionTypeEnum.SECKILL.name()); + searchParams.setSkuIds(promotionGoodsList.stream().map(PromotionGoods::getSkuId).collect(Collectors.toList())); + promotionGoodsService.deletePromotionGoods(searchParams); + //初始化促销商品 + PromotionTools.promotionGoodsInit(promotionGoodsList, seckill, PromotionTypeEnum.SECKILL); + result = promotionGoodsService.saveBatch(promotionGoodsList); + this.seckillService.updateEsGoodsSeckill(seckill, list); + } + return result; + } + /** * 检查秒杀活动申请列表参数信息 * diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillServiceImpl.java index 7d9619db..8b092527 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillServiceImpl.java @@ -131,12 +131,31 @@ public class SeckillServiceImpl extends AbstractPromotionsServiceImpl seckillApplies) { if (seckillApplies != null && !seckillApplies.isEmpty()) { // 更新促销范围 From c4307aa82197f37febf1be03e6f546d1742106d9 Mon Sep 17 00:00:00 2001 From: paulGao Date: Wed, 2 Mar 2022 11:49:41 +0800 Subject: [PATCH 05/10] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=A7=92=E6=9D=80?= =?UTF-8?q?=E5=95=86=E5=93=81=E4=B8=8B=E5=8D=95=E6=97=B6=EF=BC=8C=E4=B8=8D?= =?UTF-8?q?=E4=BC=9A=E6=9B=B4=E6=96=B0=E7=A7=92=E6=9D=80=E5=95=86=E5=93=81?= =?UTF-8?q?=E7=9A=84=E5=87=BA=E5=94=AE=E6=95=B0=E9=87=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lili/event/impl/StockUpdateExecute.java | 2 +- .../order/cart/entity/dto/TradeDTO.java | 1 - .../cart/render/impl/CheckDataRender.java | 2 +- .../order/order/entity/vo/ReceiptVO.java | 6 ++- .../service/PromotionGoodsService.java | 7 +--- .../service/SeckillApplyService.java | 6 +-- .../PromotionGoodsServiceImpl.java | 40 +++++++++---------- .../serviceimpl/SeckillApplyServiceImpl.java | 8 ++-- 8 files changed, 36 insertions(+), 36 deletions(-) diff --git a/consumer/src/main/java/cn/lili/event/impl/StockUpdateExecute.java b/consumer/src/main/java/cn/lili/event/impl/StockUpdateExecute.java index ab9f5d63..77806014 100644 --- a/consumer/src/main/java/cn/lili/event/impl/StockUpdateExecute.java +++ b/consumer/src/main/java/cn/lili/event/impl/StockUpdateExecute.java @@ -332,7 +332,7 @@ public class StockUpdateExecute implements OrderStatusChangeEvent { Integer num = promotionGoods.get(i).getNum(); promotionGoods.get(i).setNum((num != null ? num : 0) + order.getOrder().getGoodsNum()); } - promotionGoodsService.updateBatchById(promotionGoods); + promotionGoodsService.updatePromotionGoodsStock(promotionGoods); } //商品库存,包含sku库存集合,批量更新商品库存相关 goodsSkuService.updateGoodsStuck(goodsSkus); diff --git a/framework/src/main/java/cn/lili/modules/order/cart/entity/dto/TradeDTO.java b/framework/src/main/java/cn/lili/modules/order/cart/entity/dto/TradeDTO.java index 36f84b7f..e05113b1 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/entity/dto/TradeDTO.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/entity/dto/TradeDTO.java @@ -139,7 +139,6 @@ public class TradeDTO implements Serializable { this.cartList = new ArrayList<>(); this.skuPromotionDetail = new HashMap<>(); this.storeCoupons = new HashMap<>(); - this.storeCoupons = new HashMap<>(); this.priceDetailDTO = new PriceDetailDTO(); this.cantUseCoupons = new ArrayList<>(); this.canUseCoupons = new ArrayList<>(); diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CheckDataRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CheckDataRender.java index 8012158f..58ca809d 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CheckDataRender.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CheckDataRender.java @@ -193,7 +193,7 @@ public class CheckDataRender implements CartRenderStep { } } //积分商品,判断用户积分是否满足 - } else if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.POINTS) && tradeDTO.getSkuList().get(0).getPromotionMap() != null && !tradeDTO.getSkuList().get(0).getPromotionMap().isEmpty()) { + } else if (tradeDTO.getCartTypeEnum().equals(CartTypeEnum.POINTS) && tradeDTO.getSkuList().get(0).getPromotionMap() != null && !tradeDTO.getSkuList().get(0).getPromotionMap().isEmpty()) { //获取积分商品VO Optional> pointsPromotions = tradeDTO.getSkuList().get(0).getPromotionMap().entrySet().stream().filter(i -> i.getKey().contains(PromotionTypeEnum.POINTS_GOODS.name())).findFirst(); if (pointsPromotions.isPresent()) { diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/ReceiptVO.java b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/ReceiptVO.java index ad7b73ce..6047ea88 100644 --- a/framework/src/main/java/cn/lili/modules/order/order/entity/vo/ReceiptVO.java +++ b/framework/src/main/java/cn/lili/modules/order/order/entity/vo/ReceiptVO.java @@ -4,6 +4,8 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.io.Serializable; + /** * 发票 * @@ -12,8 +14,10 @@ import lombok.Data; */ @Data @ApiModel(value = "发票") -public class ReceiptVO { +public class ReceiptVO implements Serializable { + private static final long serialVersionUID = -8402457457074092957L; + @ApiModelProperty(value = "发票抬头") private String receiptTitle; diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/PromotionGoodsService.java b/framework/src/main/java/cn/lili/modules/promotion/service/PromotionGoodsService.java index f019298b..58a80e00 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/service/PromotionGoodsService.java +++ b/framework/src/main/java/cn/lili/modules/promotion/service/PromotionGoodsService.java @@ -121,12 +121,9 @@ public interface PromotionGoodsService extends IService { /** * 更新促销活动商品库存 * - * @param typeEnum 促销商品类型 - * @param promotionId 促销活动id - * @param skuId 商品skuId - * @param quantity 更新后的库存数量 + * @param promotionGoodsList 更新促销活动商品信息 */ - void updatePromotionGoodsStock(PromotionTypeEnum typeEnum, String promotionId, String skuId, Integer quantity); + void updatePromotionGoodsStock(List promotionGoodsList); /** * 更新促销活动商品索引 diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/SeckillApplyService.java b/framework/src/main/java/cn/lili/modules/promotion/service/SeckillApplyService.java index 8d67dd74..f674b489 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/service/SeckillApplyService.java +++ b/framework/src/main/java/cn/lili/modules/promotion/service/SeckillApplyService.java @@ -90,13 +90,13 @@ public interface SeckillApplyService extends IService { void removeSeckillApply(String seckillId, String id); /** - * 更新秒杀商品库存 + * 更新秒杀商品出售数量 * * @param seckillId 秒杀活动id * @param skuId 商品skuId - * @param quantity 库存 + * @param saleNum 出售数量 */ - void updateSeckillApplyQuantity(String seckillId, String skuId, Integer quantity); + void updateSeckillApplySaleNum(String seckillId, String skuId, Integer saleNum); /** * 更新秒杀活动时间 diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionGoodsServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionGoodsServiceImpl.java index e3846103..21917405 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionGoodsServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionGoodsServiceImpl.java @@ -3,8 +3,6 @@ package cn.lili.modules.promotion.serviceimpl; import cn.hutool.core.convert.Convert; import cn.hutool.core.text.CharSequenceUtil; import cn.lili.common.enums.PromotionTypeEnum; -import cn.lili.common.enums.ResultCode; -import cn.lili.common.exception.ServiceException; import cn.lili.common.vo.PageVO; import cn.lili.modules.goods.entity.dos.GoodsSku; import cn.lili.modules.goods.service.GoodsSkuService; @@ -27,6 +25,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Arrays; @@ -209,31 +208,32 @@ public class PromotionGoodsServiceImpl extends ServiceImpl promotionGoodsList) { + for (PromotionGoods promotionGoods : promotionGoodsList) { + String promotionStockKey = PromotionGoodsService.getPromotionGoodsStockCacheKey(PromotionTypeEnum.valueOf(promotionGoods.getPromotionType()), promotionGoods.getPromotionId(), promotionGoods.getSkuId()); + if (promotionGoods.getPromotionType().equals(PromotionTypeEnum.SECKILL.name())) { + SeckillSearchParams searchParams = new SeckillSearchParams(); + searchParams.setSeckillId(promotionGoods.getPromotionId()); + searchParams.setSkuId(promotionGoods.getSkuId()); + SeckillApply seckillApply = this.seckillApplyService.getSeckillApply(searchParams); + if (seckillApply != null) { + seckillApplyService.updateSeckillApplySaleNum(promotionGoods.getPromotionId(), promotionGoods.getSkuId(), promotionGoods.getNum()); + } } - seckillApplyService.updateSeckillApplyQuantity(promotionId, skuId, quantity); - } else { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.eq(PromotionGoods::getPromotionType, typeEnum.name()).eq(PromotionGoods::getPromotionId, promotionId).eq(PromotionGoods::getSkuId, skuId); - updateWrapper.set(PromotionGoods::getQuantity, quantity); + updateWrapper.eq(PromotionGoods::getPromotionType, promotionGoods.getPromotionType()).eq(PromotionGoods::getPromotionId, promotionGoods.getPromotionId()).eq(PromotionGoods::getSkuId, promotionGoods.getSkuId()); + updateWrapper.set(PromotionGoods::getQuantity, promotionGoods.getQuantity()).set(PromotionGoods::getNum, promotionGoods.getNum()); + this.update(updateWrapper); + stringRedisTemplate.opsForValue().set(promotionStockKey, promotionGoods.getQuantity().toString()); } - stringRedisTemplate.opsForValue().set(promotionStockKey, quantity.toString()); + } /** diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillApplyServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillApplyServiceImpl.java index 66071234..633e453f 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillApplyServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillApplyServiceImpl.java @@ -231,17 +231,17 @@ public class SeckillApplyServiceImpl extends ServiceImpl updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.eq(SeckillApply::getSeckillId, seckillId).eq(SeckillApply::getSkuId, skuId); - updateWrapper.set(SeckillApply::getQuantity, quantity); + updateWrapper.set(SeckillApply::getSalesNum, saleNum); this.update(updateWrapper); } From 3506e1c73822b5b31a5057e37d73e73536fdbbf8 Mon Sep 17 00:00:00 2001 From: paulGao Date: Wed, 2 Mar 2022 20:26:50 +0800 Subject: [PATCH 06/10] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=A3=80=E6=B5=8B?= =?UTF-8?q?=E4=BF=83=E9=94=80=E5=95=86=E5=93=81=E5=BA=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/lili/common/enums/ResultCode.java | 1 + .../cart/render/impl/SkuPromotionRender.java | 69 +++++++++++++++++++ .../order/cart/service/CartServiceImpl.java | 1 + .../modules/promotion/entity/dos/Seckill.java | 2 + .../serviceimpl/PromotionServiceImpl.java | 15 ++-- .../serviceimpl/SeckillApplyServiceImpl.java | 6 +- 6 files changed, 82 insertions(+), 12 deletions(-) diff --git a/framework/src/main/java/cn/lili/common/enums/ResultCode.java b/framework/src/main/java/cn/lili/common/enums/ResultCode.java index b335862d..7b61c34f 100644 --- a/framework/src/main/java/cn/lili/common/enums/ResultCode.java +++ b/framework/src/main/java/cn/lili/common/enums/ResultCode.java @@ -246,6 +246,7 @@ public enum ResultCode { * 活动 */ PROMOTION_GOODS_NOT_EXIT(40000, "当前促销商品不存在!"), + PROMOTION_GOODS_QUANTITY_NOT_EXIT(40020, "当前促销商品库存不足!"), PROMOTION_SAME_ACTIVE_EXIST(40001, "活动时间内已存在同类活动,请选择关闭、删除当前时段的活动"), PROMOTION_START_TIME_ERROR(40002, "活动起始时间不能小于当前时间"), PROMOTION_END_TIME_ERROR(40003, "活动结束时间不能小于当前时间"), diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuPromotionRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuPromotionRender.java index cfcfe37b..3350fda6 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuPromotionRender.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuPromotionRender.java @@ -2,6 +2,7 @@ package cn.lili.modules.order.cart.render.impl; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; +import cn.lili.cache.Cache; import cn.lili.common.enums.PromotionTypeEnum; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; @@ -19,10 +20,14 @@ import cn.lili.modules.promotion.entity.dto.search.KanjiaActivitySearchParams; import cn.lili.modules.promotion.entity.enums.KanJiaStatusEnum; import cn.lili.modules.promotion.entity.vos.PromotionSkuVO; import cn.lili.modules.promotion.entity.vos.kanjia.KanjiaActivityVO; +import cn.lili.modules.promotion.service.KanjiaActivityGoodsService; import cn.lili.modules.promotion.service.KanjiaActivityService; +import cn.lili.modules.promotion.service.PointsGoodsService; +import cn.lili.modules.promotion.service.PromotionGoodsService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; import java.util.Map; import java.util.Objects; @@ -39,9 +44,24 @@ public class SkuPromotionRender implements CartRenderStep { @Autowired private KanjiaActivityService kanjiaActivityService; + @Autowired + private KanjiaActivityGoodsService kanjiaActivityGoodsService; + + @Autowired + private PointsGoodsService pointsGoodsService; + + /** + * 促销商品 + */ + @Autowired + private PromotionGoodsService promotionGoodsService; + @Autowired private MemberService memberService; + @Autowired + private Cache cache; + @Override public RenderStepEnums step() { return RenderStepEnums.SKU_PROMOTION; @@ -54,6 +74,10 @@ public class SkuPromotionRender implements CartRenderStep { renderBasePrice(tradeDTO); //渲染单品促销 renderSkuPromotion(tradeDTO); + + checkPromotionQuantity(tradeDTO); + + } /** @@ -155,6 +179,51 @@ public class SkuPromotionRender implements CartRenderStep { } } + /** + * 检查促销库存 + * + * @param tradeDTO 购物车视图 + */ + private void checkPromotionQuantity(TradeDTO tradeDTO) { + for (CartSkuVO cartSkuVO : tradeDTO.getCheckedSkuList()) { + cartSkuVO.getPromotionMap(); + List joinPromotion = cartSkuVO.getPriceDetailDTO().getJoinPromotion(); + if (!joinPromotion.isEmpty()) { + for (PromotionSkuVO promotionSkuVO : joinPromotion) { + + String promotionGoodsStockCacheKey = PromotionGoodsService.getPromotionGoodsStockCacheKey(PromotionTypeEnum.valueOf(promotionSkuVO.getPromotionType()), promotionSkuVO.getActivityId(), cartSkuVO.getGoodsSku().getId()); + Object quantity = cache.get(promotionGoodsStockCacheKey); + + if (quantity == null) { + //如果促销有库存信息 + PromotionTypeEnum promotionTypeEnum = PromotionTypeEnum.valueOf(promotionSkuVO.getPromotionType()); + switch (promotionTypeEnum) { + case KANJIA: + quantity = kanjiaActivityGoodsService.getKanjiaGoodsBySkuId(cartSkuVO.getGoodsSku().getId()).getStock(); + break; + case POINTS_GOODS: + quantity = pointsGoodsService.getPointsGoodsDetailBySkuId(cartSkuVO.getGoodsSku().getId()).getActiveStock(); + break; + case SECKILL: + case PINTUAN: + quantity = promotionGoodsService.getPromotionGoodsStock(PromotionTypeEnum.valueOf(promotionSkuVO.getPromotionType()), promotionSkuVO.getActivityId(), cartSkuVO.getGoodsSku().getId()); + break; + default: + break; + } + } + + + if (cartSkuVO.getNum() > (Integer) quantity) {//设置购物车未选中 + cartSkuVO.setChecked(false); + //设置失效消息 + cartSkuVO.setErrorMessage("促销商品库存不足,现有库存数量[" + quantity + "]"); + } + } + } + } + } + /** * 购物车促销类型 */ diff --git a/framework/src/main/java/cn/lili/modules/order/cart/service/CartServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/cart/service/CartServiceImpl.java index ccf3e7d8..1e8367ce 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/service/CartServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/service/CartServiceImpl.java @@ -185,6 +185,7 @@ public class CartServiceImpl implements CartService { //购物车中不存在此商品,则新建立一个 CartSkuVO cartSkuVO = new CartSkuVO(dataSku, promotionMap); + this.checkSetGoodsQuantity(cartSkuVO, skuId, num); cartSkuVO.setCartType(cartTypeEnum); //检测购物车数据 checkCart(cartTypeEnum, cartSkuVO, skuId, num); diff --git a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/Seckill.java b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/Seckill.java index f80c4b77..e5d22caf 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/entity/dos/Seckill.java +++ b/framework/src/main/java/cn/lili/modules/promotion/entity/dos/Seckill.java @@ -11,6 +11,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; +import lombok.ToString; import org.springframework.beans.BeanUtils; import org.springframework.data.elasticsearch.annotations.DateFormat; import org.springframework.data.elasticsearch.annotations.Field; @@ -30,6 +31,7 @@ import java.util.Date; @TableName("li_seckill") @ApiModel(value = "秒杀活动活动") @NoArgsConstructor +@ToString(callSuper = true) public class Seckill extends BasePromotions { private static final long serialVersionUID = -9116425737163730836L; diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionServiceImpl.java index 2d8bda06..cd0df5e8 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/PromotionServiceImpl.java @@ -105,7 +105,7 @@ public class PromotionServiceImpl implements PromotionService { /** * 根据商品索引获取当前商品索引的所有促销活动信息 * - * @param storeId 店铺id + * @param storeId 店铺id * @param goodsSkuId 商品skuId * @return 当前促销活动集合 */ @@ -129,7 +129,7 @@ public class PromotionServiceImpl implements PromotionService { promotionMap.put(esPromotionKey, fullDiscount); break; case SECKILL: - this.getGoodsCurrentSeckill(promotionGoods, promotionMap); + this.getGoodsCurrentSeckill(esPromotionKey, promotionGoods, promotionMap); break; case POINTS_GOODS: PointsGoods pointsGoods = pointsGoodsService.getById(promotionGoods.getPromotionId()); @@ -143,7 +143,7 @@ public class PromotionServiceImpl implements PromotionService { } - private void getGoodsCurrentSeckill(PromotionGoods promotionGoods, Map promotionMap) { + private void getGoodsCurrentSeckill(String esPromotionKey, PromotionGoods promotionGoods, Map promotionMap) { Seckill seckill = seckillService.getById(promotionGoods.getPromotionId()); SeckillSearchParams searchParams = new SeckillSearchParams(); searchParams.setSeckillId(promotionGoods.getPromotionId()); @@ -151,19 +151,12 @@ public class PromotionServiceImpl implements PromotionService { List seckillApplyList = seckillApplyService.getSeckillApplyList(searchParams); if (seckillApplyList != null && !seckillApplyList.isEmpty()) { SeckillApply seckillApply = seckillApplyList.get(0); - int nextHour = 23; String[] split = seckill.getHours().split(","); int[] hoursSored = Arrays.stream(split).mapToInt(Integer::parseInt).toArray(); Arrays.sort(hoursSored); - for (int i : hoursSored) { - if (seckillApply.getTimeLine() < i) { - nextHour = i; - } - } - String seckillKey = promotionGoods.getPromotionType() + "-" + nextHour; seckill.setStartTime(promotionGoods.getStartTime()); seckill.setEndTime(promotionGoods.getEndTime()); - promotionMap.put(seckillKey, seckill); + promotionMap.put(esPromotionKey, seckill); } } diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillApplyServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillApplyServiceImpl.java index 633e453f..32163415 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillApplyServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillApplyServiceImpl.java @@ -424,7 +424,11 @@ public class SeckillApplyServiceImpl extends ServiceImpl Date: Wed, 2 Mar 2022 20:33:45 +0800 Subject: [PATCH 07/10] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=A7=92=E6=9D=80?= =?UTF-8?q?=E6=B4=BB=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/order/cart/render/impl/SkuPromotionRender.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuPromotionRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuPromotionRender.java index 3350fda6..cdb2acfe 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuPromotionRender.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuPromotionRender.java @@ -209,12 +209,12 @@ public class SkuPromotionRender implements CartRenderStep { quantity = promotionGoodsService.getPromotionGoodsStock(PromotionTypeEnum.valueOf(promotionSkuVO.getPromotionType()), promotionSkuVO.getActivityId(), cartSkuVO.getGoodsSku().getId()); break; default: - break; + return; } } - if (cartSkuVO.getNum() > (Integer) quantity) {//设置购物车未选中 + if (quantity != null && cartSkuVO.getNum() > (Integer) quantity) {//设置购物车未选中 cartSkuVO.setChecked(false); //设置失效消息 cartSkuVO.setErrorMessage("促销商品库存不足,现有库存数量[" + quantity + "]"); From 0d5f871da712ef5ff3007732c26c931ec1921d11 Mon Sep 17 00:00:00 2001 From: paulGao Date: Wed, 2 Mar 2022 20:39:17 +0800 Subject: [PATCH 08/10] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=A3=80=E6=B5=8B?= =?UTF-8?q?=E4=BF=83=E9=94=80=E5=95=86=E5=93=81=E5=BA=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cart/render/impl/SkuPromotionRender.java | 61 ++++++++++--------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuPromotionRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuPromotionRender.java index cdb2acfe..82f3cde9 100644 --- a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuPromotionRender.java +++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/SkuPromotionRender.java @@ -190,40 +190,43 @@ public class SkuPromotionRender implements CartRenderStep { List joinPromotion = cartSkuVO.getPriceDetailDTO().getJoinPromotion(); if (!joinPromotion.isEmpty()) { for (PromotionSkuVO promotionSkuVO : joinPromotion) { - - String promotionGoodsStockCacheKey = PromotionGoodsService.getPromotionGoodsStockCacheKey(PromotionTypeEnum.valueOf(promotionSkuVO.getPromotionType()), promotionSkuVO.getActivityId(), cartSkuVO.getGoodsSku().getId()); - Object quantity = cache.get(promotionGoodsStockCacheKey); - - if (quantity == null) { - //如果促销有库存信息 - PromotionTypeEnum promotionTypeEnum = PromotionTypeEnum.valueOf(promotionSkuVO.getPromotionType()); - switch (promotionTypeEnum) { - case KANJIA: - quantity = kanjiaActivityGoodsService.getKanjiaGoodsBySkuId(cartSkuVO.getGoodsSku().getId()).getStock(); - break; - case POINTS_GOODS: - quantity = pointsGoodsService.getPointsGoodsDetailBySkuId(cartSkuVO.getGoodsSku().getId()).getActiveStock(); - break; - case SECKILL: - case PINTUAN: - quantity = promotionGoodsService.getPromotionGoodsStock(PromotionTypeEnum.valueOf(promotionSkuVO.getPromotionType()), promotionSkuVO.getActivityId(), cartSkuVO.getGoodsSku().getId()); - break; - default: - return; - } - } - - - if (quantity != null && cartSkuVO.getNum() > (Integer) quantity) {//设置购物车未选中 - cartSkuVO.setChecked(false); - //设置失效消息 - cartSkuVO.setErrorMessage("促销商品库存不足,现有库存数量[" + quantity + "]"); - } + this.checkPromotionGoodsQuantity(cartSkuVO, promotionSkuVO); } } } } + private void checkPromotionGoodsQuantity(CartSkuVO cartSkuVO, PromotionSkuVO promotionSkuVO) { + String promotionGoodsStockCacheKey = PromotionGoodsService.getPromotionGoodsStockCacheKey(PromotionTypeEnum.valueOf(promotionSkuVO.getPromotionType()), promotionSkuVO.getActivityId(), cartSkuVO.getGoodsSku().getId()); + Object quantity = cache.get(promotionGoodsStockCacheKey); + + if (quantity == null) { + //如果促销有库存信息 + PromotionTypeEnum promotionTypeEnum = PromotionTypeEnum.valueOf(promotionSkuVO.getPromotionType()); + switch (promotionTypeEnum) { + case KANJIA: + quantity = kanjiaActivityGoodsService.getKanjiaGoodsBySkuId(cartSkuVO.getGoodsSku().getId()).getStock(); + break; + case POINTS_GOODS: + quantity = pointsGoodsService.getPointsGoodsDetailBySkuId(cartSkuVO.getGoodsSku().getId()).getActiveStock(); + break; + case SECKILL: + case PINTUAN: + quantity = promotionGoodsService.getPromotionGoodsStock(PromotionTypeEnum.valueOf(promotionSkuVO.getPromotionType()), promotionSkuVO.getActivityId(), cartSkuVO.getGoodsSku().getId()); + break; + default: + return; + } + } + + + if (quantity != null && cartSkuVO.getNum() > (Integer) quantity) {//设置购物车未选中 + cartSkuVO.setChecked(false); + //设置失效消息 + cartSkuVO.setErrorMessage("促销商品库存不足,现有库存数量[" + quantity + "]"); + } + } + /** * 购物车促销类型 */ From 66b2f1f55d87b24524c33f2d54f355e674acf306 Mon Sep 17 00:00:00 2001 From: paulGao Date: Thu, 3 Mar 2022 11:22:20 +0800 Subject: [PATCH 09/10] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=A7=92=E6=9D=80=E6=B4=BB=E5=8A=A8=E6=97=B6=E9=97=B4=EF=BC=8C?= =?UTF-8?q?=E7=A7=92=E6=9D=80=E6=B4=BB=E5=8A=A8=E5=95=86=E5=93=81=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E6=95=B0=E6=8D=AE=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../serviceimpl/SeckillApplyServiceImpl.java | 17 ++++++++++++----- .../serviceimpl/SeckillServiceImpl.java | 3 ++- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillApplyServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillApplyServiceImpl.java index 32163415..9e757376 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillApplyServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillApplyServiceImpl.java @@ -235,7 +235,7 @@ public class SeckillApplyServiceImpl extends ServiceImpl promotionGoodsList = new ArrayList<>(); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SeckillApply::getSeckillId, seckill.getId()); - List list = this.list(queryWrapper); + List list = this.list(queryWrapper).stream().filter(i -> i.getTimeLine() != null && seckill.getHours().contains(i.getTimeLine().toString())).collect(Collectors.toList()); for (SeckillApply seckillApply : list) { //获取参与活动的商品信息 GoodsSku goodsSku = goodsSkuService.getGoodsSkuByIdFromCache(seckillApply.getSkuId()); @@ -270,13 +270,20 @@ public class SeckillApplyServiceImpl extends ServiceImpl promotionGoods = PromotionTools.promotionGoodsInit(promotionGoodsList, seckill, PromotionTypeEnum.SECKILL); + result = promotionGoodsService.saveBatch(promotionGoods); this.seckillService.updateEsGoodsSeckill(seckill, list); } + + LambdaQueryWrapper deleteWrapper = new LambdaQueryWrapper<>(); + deleteWrapper.eq(SeckillApply::getSeckillId, seckill.getId()); + deleteWrapper.notIn(SeckillApply::getSkuId, promotionGoodsList.stream().map(PromotionGoods::getSkuId).collect(Collectors.toList())); + this.remove(deleteWrapper); + seckillService.updateSeckillGoodsNum(seckill.getId()); + return result; } diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillServiceImpl.java index 8b092527..4341caaf 100644 --- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/SeckillServiceImpl.java @@ -144,9 +144,10 @@ public class SeckillServiceImpl extends AbstractPromotionsServiceImpl Date: Thu, 3 Mar 2022 18:03:04 +0800 Subject: [PATCH 10/10] =?UTF-8?q?'=E5=BA=97=E5=91=98=E6=9D=83=E9=99=90bug?= =?UTF-8?q?=E5=A4=84=E7=90=86=E5=90=88=E5=B9=B6'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lili/modules/member/entity/dos/Clerk.java | 4 +- .../member/entity/dos/StoreClerkRole.java | 6 +++ .../modules/member/mapper/ClerkMapper.java | 4 +- .../member/mapper/StoreMenuMapper.java | 2 +- .../member/service/StoreMenuRoleService.java | 4 +- .../member/serviceimpl/ClerkServiceImpl.java | 41 ++++++++++--------- .../member/serviceimpl/MemberServiceImpl.java | 4 +- .../serviceimpl/StoreMenuRoleServiceImpl.java | 8 ++-- .../serviceimpl/StoreMenuServiceImpl.java | 14 ++++++- .../member/token/StoreTokenGenerate.java | 20 ++++++++- .../system/token/ManagerTokenGenerate.java | 17 +++++--- .../permission/MenuManagerController.java | 2 +- .../permission/StoreMenuController.java | 2 +- .../security/StoreAuthenticationFilter.java | 4 +- 14 files changed, 88 insertions(+), 44 deletions(-) diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/Clerk.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/Clerk.java index 4f900f96..4e12e56b 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/dos/Clerk.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/Clerk.java @@ -6,6 +6,7 @@ import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -21,6 +22,7 @@ import lombok.NoArgsConstructor; @TableName("li_clerk") @ApiModel(value = "店员") @NoArgsConstructor +@AllArgsConstructor public class Clerk extends BaseEntity { private static final long serialVersionUID = 1L; @@ -56,7 +58,7 @@ public class Clerk extends BaseEntity { * @param clerkAddDTO */ public Clerk(ClerkAddDTO clerkAddDTO) { - if (!clerkAddDTO.getRoles().isEmpty()) { + if (clerkAddDTO.getRoles()!=null && !clerkAddDTO.getRoles().isEmpty()) { this.roleIds = CharSequenceUtil.join(",", clerkAddDTO.getRoles()); } this.memberId = clerkAddDTO.getMemberId(); diff --git a/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreClerkRole.java b/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreClerkRole.java index 4f658d5d..c268ae88 100644 --- a/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreClerkRole.java +++ b/framework/src/main/java/cn/lili/modules/member/entity/dos/StoreClerkRole.java @@ -4,7 +4,10 @@ import cn.lili.mybatis.BaseIdEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; /** * 用户角色 @@ -15,6 +18,8 @@ import lombok.Data; @Data @TableName("li_clerk_role") @ApiModel(value = "用户角色") +@Builder +@NoArgsConstructor public class StoreClerkRole extends BaseIdEntity { @ApiModelProperty(value = "店员唯一id") @@ -32,3 +37,4 @@ public class StoreClerkRole extends BaseIdEntity { } } + diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/ClerkMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/ClerkMapper.java index ca51b1e6..4ea0539d 100644 --- a/framework/src/main/java/cn/lili/modules/member/mapper/ClerkMapper.java +++ b/framework/src/main/java/cn/lili/modules/member/mapper/ClerkMapper.java @@ -27,8 +27,8 @@ public interface ClerkMapper extends BaseMapper { * @param ew 店铺ID * @return */ - @Select("select li_clerk.*,m.id from li_clerk inner join li_member as m on li_clerk.member_id = m.id ${ew.customSqlSegment}") - IPage selectClerkPage(Page page, @Param(Constants.WRAPPER) QueryWrapper ew); + @Select("select li_clerk.*,m.id,m.mobile as mobile from li_clerk inner join li_member as m on li_clerk.member_id = m.id ${ew.customSqlSegment}") + IPage selectClerkPage(Page page, @Param(Constants.WRAPPER) QueryWrapper ew); } \ No newline at end of file diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/StoreMenuMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/StoreMenuMapper.java index 3b644df3..10417ad2 100644 --- a/framework/src/main/java/cn/lili/modules/member/mapper/StoreMenuMapper.java +++ b/framework/src/main/java/cn/lili/modules/member/mapper/StoreMenuMapper.java @@ -25,7 +25,7 @@ public interface StoreMenuMapper extends BaseMapper { */ @Select("SELECT menu.* FROM li_store_menu AS menu WHERE menu.id IN (" + "SELECT rm.menu_id FROM li_store_menu_role AS rm WHERE rm.role_id IN (" + - "SELECT ur.role_id FROM li_clerk_role AS ur WHERE ur.user_id=#{userId}) OR rm.role_id IN (" + + "SELECT ur.role_id FROM li_clerk_role AS ur WHERE ur.clerk_id=#{userId}) OR rm.role_id IN (" + "SELECT dr.role_id FROM li_store_department_role AS dr WHERE dr.id=(" + "SELECT department_id FROM li_clerk AS au WHERE au.id = #{userId})))") List findByUserId(String userId); diff --git a/framework/src/main/java/cn/lili/modules/member/service/StoreMenuRoleService.java b/framework/src/main/java/cn/lili/modules/member/service/StoreMenuRoleService.java index d179a5b6..98aa9e6f 100644 --- a/framework/src/main/java/cn/lili/modules/member/service/StoreMenuRoleService.java +++ b/framework/src/main/java/cn/lili/modules/member/service/StoreMenuRoleService.java @@ -26,10 +26,10 @@ public interface StoreMenuRoleService extends IService { /** * 根据角色集合获取拥有的菜单具体权限 * - * @param userId + * @param clerkId * @return */ - List findAllMenu(String userId); + List findAllMenu(String clerkId,String memberId); /** diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/ClerkServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/ClerkServiceImpl.java index 9edc97fd..609654f4 100644 --- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/ClerkServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/ClerkServiceImpl.java @@ -9,16 +9,14 @@ import cn.lili.common.utils.StringUtils; import cn.lili.common.vo.PageVO; import cn.lili.modules.member.entity.dos.Clerk; import cn.lili.modules.member.entity.dos.Member; +import cn.lili.modules.member.entity.dos.StoreClerkRole; import cn.lili.modules.member.entity.dos.StoreRole; import cn.lili.modules.member.entity.dto.ClerkAddDTO; import cn.lili.modules.member.entity.dto.ClerkEditDTO; import cn.lili.modules.member.entity.dto.ClerkQueryDTO; import cn.lili.modules.member.entity.vo.ClerkVO; import cn.lili.modules.member.mapper.ClerkMapper; -import cn.lili.modules.member.service.ClerkService; -import cn.lili.modules.member.service.MemberService; -import cn.lili.modules.member.service.StoreDepartmentService; -import cn.lili.modules.member.service.StoreRoleService; +import cn.lili.modules.member.service.*; import cn.lili.mybatis.util.PageUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -52,7 +50,7 @@ public class ClerkServiceImpl extends ServiceImpl implements @Autowired private MemberService memberService; @Autowired - private ClerkMapper clerkMapper; + private StoreClerkRoleService storeClerkRoleService; @Override public IPage clerkForPage(PageVO page, ClerkQueryDTO clerkQueryDTO) { @@ -62,17 +60,9 @@ public class ClerkServiceImpl extends ServiceImpl implements clerkVOQueryWrapper.eq(StringUtils.isNotEmpty(clerkQueryDTO.getDepartmentId()), "li_clerk.department_id", clerkQueryDTO.getDepartmentId()); clerkVOQueryWrapper.like(StringUtils.isNotEmpty(clerkQueryDTO.getClerkName()), "li_clerk.clerk_name", clerkQueryDTO.getClerkName()); clerkVOQueryWrapper.like(StringUtils.isNotEmpty(clerkQueryDTO.getMobile()), "m.mobile", clerkQueryDTO.getMobile()); - IPage clerkPage = this.clerkMapper.selectClerkPage(PageUtil.initPage(page), clerkVOQueryWrapper); + IPage clerkPage = this.baseMapper.selectClerkPage(PageUtil.initPage(page), clerkVOQueryWrapper); - List result = new ArrayList<>(); - clerkPage.getRecords().forEach(clerk -> { - ClerkVO clerkVO = new ClerkVO(clerk); - result.add(clerkVO); - }); - - Page pageResult = new Page(clerkPage.getCurrent(), clerkPage.getSize(), clerkPage.getTotal()); - pageResult.setRecords(result); - return pageResult; + return clerkPage; /*Page clerkPage = page(initPage, initWrapper); @@ -166,9 +156,9 @@ public class ClerkServiceImpl extends ServiceImpl implements if (!clerk.getStoreId().equals(UserContext.getCurrentUser().getStoreId())) { throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); } - if(clerkEditDTO.getIsSuper()){ + if (clerkEditDTO.getIsSuper()) { clerk.setRoleIds(""); - }else{ + } else { //角色赋值 if (!clerkEditDTO.getRoles().isEmpty()) { clerk.setRoleIds(CharSequenceUtil.join(",", clerkEditDTO.getRoles())); @@ -216,7 +206,20 @@ public class ClerkServiceImpl extends ServiceImpl implements throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); } } + this.save(clerk); + + //判断用户角色权限不为超级会员且权限路径不为空 + if(clerkAddDTO.getIsSuper()==false && clerkAddDTO.getRoles()!=null){ + //添加店员用户角色 + List storeClerkRoleList = new ArrayList<>(); + + clerkAddDTO.getRoles().stream().forEach(a -> { + storeClerkRoleList.add(StoreClerkRole.builder().clerkId(clerk.getId()).roleId(a).build()); + }); + storeClerkRoleService.saveBatch(storeClerkRoleList); + } + return clerk; } @@ -230,7 +233,7 @@ public class ClerkServiceImpl extends ServiceImpl implements QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("store_id", UserContext.getCurrentUser().getStoreId()); queryWrapper.in("id", ids); - List clerks = this.clerkMapper.selectList(queryWrapper); + List clerks = this.baseMapper.selectList(queryWrapper); //校验要重置的店员是否是当前店铺的店员 if (clerks.size() != ids.size()) { throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); @@ -253,7 +256,7 @@ public class ClerkServiceImpl extends ServiceImpl implements QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("store_id", UserContext.getCurrentUser().getStoreId()); queryWrapper.in("id", ids); - List clerks = this.clerkMapper.selectList(queryWrapper); + List clerks = this.baseMapper.selectList(queryWrapper); if (clerks.size() > 0) { //校验要重置的店员是否是当前店铺的店员 if (clerks.size() != ids.size()) { diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java index 6be96ee3..1b69a118 100644 --- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java @@ -426,10 +426,10 @@ public class MemberServiceImpl extends ServiceImpl impleme * @param mobilePhone 手机号 * @return 会员 */ - private Long findMember(String mobilePhone, String userName) { + private Long findMember(String userName,String mobilePhone) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("mobile", mobilePhone) - .or().eq("username", userName); + .eq("username", userName); return this.baseMapper.selectCount(queryWrapper); } diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreMenuRoleServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreMenuRoleServiceImpl.java index 5b876517..28e7debd 100644 --- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreMenuRoleServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreMenuRoleServiceImpl.java @@ -53,11 +53,11 @@ public class StoreMenuRoleServiceImpl extends ServiceImpl findAllMenu(String userId) { - String cacheKey = CachePrefix.STORE_USER_MENU.getPrefix() + userId; + public List findAllMenu(String clerkId,String memberId) { + String cacheKey = CachePrefix.STORE_USER_MENU.getPrefix() + memberId; List menuList = (List) cache.get(cacheKey); - if (menuList == null) { - menuList = storeMenuMapper.getUserRoleMenu(userId); + if (menuList == null || menuList.isEmpty()) { + menuList = storeMenuMapper.getUserRoleMenu(clerkId); cache.put(cacheKey, menuList); } return menuList; diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreMenuServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreMenuServiceImpl.java index ef757344..c5e0fafc 100644 --- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreMenuServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/StoreMenuServiceImpl.java @@ -8,14 +8,17 @@ import cn.lili.common.exception.ServiceException; import cn.lili.common.security.AuthUser; import cn.lili.common.security.context.UserContext; import cn.lili.common.vo.SearchVO; +import cn.lili.modules.member.entity.dos.Clerk; import cn.lili.modules.member.entity.dos.StoreMenu; import cn.lili.modules.member.entity.dos.StoreMenuRole; import cn.lili.modules.member.entity.vo.StoreMenuVO; import cn.lili.modules.member.mapper.StoreMenuMapper; +import cn.lili.modules.member.service.ClerkService; import cn.lili.modules.member.service.StoreMenuRoleService; import cn.lili.modules.member.service.StoreMenuService; import cn.lili.modules.permission.entity.dto.MenuSearchParams; import cn.lili.mybatis.util.PageUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; @@ -42,6 +45,12 @@ public class StoreMenuServiceImpl extends ServiceImpl> cache; + /** + * 店员 + */ + @Autowired + private ClerkService clerkService; + @Override public void deleteIds(List ids) { QueryWrapper queryWrapper = new QueryWrapper<>(); @@ -60,7 +69,10 @@ public class StoreMenuServiceImpl extends ServiceImpl userMenus = this.baseMapper.findByUserId(authUser.getId()); + //获取当前登录用户的店员信息 + Clerk clerk = clerkService.getOne(new LambdaQueryWrapper().eq(Clerk::getMemberId, authUser.getId())); + //获取当前店员角色的菜单列表 + List userMenus = this.baseMapper.findByUserId(clerk.getId()); return this.tree(userMenus); } diff --git a/framework/src/main/java/cn/lili/modules/member/token/StoreTokenGenerate.java b/framework/src/main/java/cn/lili/modules/member/token/StoreTokenGenerate.java index edc8e82c..93096021 100644 --- a/framework/src/main/java/cn/lili/modules/member/token/StoreTokenGenerate.java +++ b/framework/src/main/java/cn/lili/modules/member/token/StoreTokenGenerate.java @@ -60,9 +60,10 @@ public class StoreTokenGenerate extends AbstractTokenGenerate { if (!clerk.getStatus()) { throw new ServiceException(ResultCode.CLERK_DISABLED_ERROR); } - List storeUserMenuVOS = storeMenuRoleService.findAllMenu(clerk.getId()); + //获取当前用户权限 + List storeUserMenuVOS = storeMenuRoleService.findAllMenu(clerk.getId(),member.getId()); //缓存权限列表 - cache.put(CachePrefix.PERMISSION_LIST.getPrefix(UserEnums.STORE) + clerk.getId(), this.permissionList(storeUserMenuVOS)); + cache.put(CachePrefix.PERMISSION_LIST.getPrefix(UserEnums.STORE) + member.getId(), this.permissionList(storeUserMenuVOS)); //查询店铺信息 Store store = storeService.getById(clerk.getStoreId()); if (store == null) { @@ -136,6 +137,21 @@ public class StoreTokenGenerate extends AbstractTokenGenerate { * @param queryPermissions 查询权限 */ void initPermission(List superPermissions, List queryPermissions) { + //菜单管理 + superPermissions.add("/store/menu*"); + //退出权限 + superPermissions.add("/store/passport/login/logout*"); + + + + + //店铺设置 + queryPermissions.add("/store/settings/storeSettings*"); + //文章接口 + queryPermissions.add("/store/other/article*"); + //首页统计 + queryPermissions.add("/store/statistics/index*"); + } diff --git a/framework/src/main/java/cn/lili/modules/system/token/ManagerTokenGenerate.java b/framework/src/main/java/cn/lili/modules/system/token/ManagerTokenGenerate.java index 7acb4d51..484b38a5 100644 --- a/framework/src/main/java/cn/lili/modules/system/token/ManagerTokenGenerate.java +++ b/framework/src/main/java/cn/lili/modules/system/token/ManagerTokenGenerate.java @@ -109,19 +109,24 @@ public class ManagerTokenGenerate extends AbstractTokenGenerate { * @param queryPermissions 查询权限 */ void initPermission(List superPermissions, List queryPermissions) { - //用户信息维护 - superPermissions.add("/manager/user/info*"); - superPermissions.add("/manager/user/edit*"); - superPermissions.add("/manager/user/editPassword*"); + //TODO 用户信息维护--操作权限 + //获取当前登录用户 + superPermissions.add("/manager/passport/user/info*"); + //修改用户资料 + superPermissions.add("/manager/passport/user/edit*"); + //修改密码 + superPermissions.add("/manager/passport/user/editPassword*"); + //退出 + superPermissions.add("/manager/passport/user/logout*"); //统计查看权限 queryPermissions.add("/manager/statistics*"); //菜单查看权限 - queryPermissions.add("/manager/menu*"); + queryPermissions.add("/manager/permission/menu*"); //商品分类查看权限 queryPermissions.add("/manager/goods/category*"); //查看地区接口 - queryPermissions.add("/manager/region*"); + queryPermissions.add("/manager/setting/region*"); } diff --git a/manager-api/src/main/java/cn/lili/controller/permission/MenuManagerController.java b/manager-api/src/main/java/cn/lili/controller/permission/MenuManagerController.java index 6c7c478b..e848ad80 100644 --- a/manager-api/src/main/java/cn/lili/controller/permission/MenuManagerController.java +++ b/manager-api/src/main/java/cn/lili/controller/permission/MenuManagerController.java @@ -75,7 +75,7 @@ public class MenuManagerController { return ResultUtil.data(menuService.tree()); } - @ApiOperation(value = "获取所有菜单") + @ApiOperation(value = "获取所有菜单--根据当前用户角色") @GetMapping("/memberMenu") public ResultMessage> memberMenu() { return ResultUtil.data(menuService.findUserTree()); diff --git a/seller-api/src/main/java/cn/lili/controller/permission/StoreMenuController.java b/seller-api/src/main/java/cn/lili/controller/permission/StoreMenuController.java index bc4ee683..859ea92d 100644 --- a/seller-api/src/main/java/cn/lili/controller/permission/StoreMenuController.java +++ b/seller-api/src/main/java/cn/lili/controller/permission/StoreMenuController.java @@ -41,7 +41,7 @@ public class StoreMenuController { return ResultUtil.data(storeMenuService.tree()); } - @ApiOperation(value = "获取所有菜单") + @ApiOperation(value = "获取所有菜单---根据当前用户角色") @GetMapping("/memberMenu") public ResultMessage> memberMenu() { return ResultUtil.data(storeMenuService.findUserTree()); diff --git a/seller-api/src/main/java/cn/lili/security/StoreAuthenticationFilter.java b/seller-api/src/main/java/cn/lili/security/StoreAuthenticationFilter.java index 5444a4fc..d4459ed1 100755 --- a/seller-api/src/main/java/cn/lili/security/StoreAuthenticationFilter.java +++ b/seller-api/src/main/java/cn/lili/security/StoreAuthenticationFilter.java @@ -129,8 +129,8 @@ public class StoreAuthenticationFilter extends BasicAuthenticationFilter { //获取数据(GET 请求)权限 if (request.getMethod().equals(RequestMethod.GET.name())) { //如果用户的超级权限和查阅权限都不包含当前请求的api - if (match(permission.get(PermissionEnum.SUPER.name()), requestUrl) || - match(permission.get(PermissionEnum.QUERY.name()), requestUrl)) { + if (match(permission.get(PermissionEnum.SUPER.name()), requestUrl) + ||match(permission.get(PermissionEnum.QUERY.name()), requestUrl)) { } else { ResponseUtil.output(response, ResponseUtil.resultMap(false, 400, "权限不足")); log.error("当前请求路径:{},所拥有权限:{}", requestUrl, JSONUtil.toJsonStr(permission));