From 757ed89c1a364c3b67ed0eccc78ae33219a13122 Mon Sep 17 00:00:00 2001 From: bunny <1319900154@qq.com> Date: Sat, 6 Apr 2024 16:35:50 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=96=B0=E5=A2=9E):=20SecKill=E7=AE=A1?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/atguigu/ssyx/common/CodeGet.java | 4 +- .../atguigu/ssyx/vo/user/LeaderAddressVo.java | 61 ++++++++------- .../acl/controller/PermissionController.java | 15 ++++ .../ssyx/acl/mapper/RolePermissionMapper.java | 9 +++ .../ssyx/acl/service/PermissionService.java | 16 ++++ .../acl/service/RolePermissionService.java | 7 ++ .../service/impl/PermissionServiceImpl.java | 54 +++++++++++++ .../impl/RolePermissionServiceImpl.java | 11 +++ service/service-user/pom.xml | 5 ++ .../user/controller/WeiXinApiController.java | 28 +++++++ .../ssyx/user/service/WeiXinApiService.java | 12 +++ .../service/impl/WeiXinApiServiceImpl.java | 78 +++++++++++++++++++ .../module/WeiXinApiServiceModule.java | 26 +++++++ 13 files changed, 295 insertions(+), 31 deletions(-) create mode 100644 service/service-acl/src/main/java/com/atguigu/ssyx/acl/mapper/RolePermissionMapper.java create mode 100644 service/service-acl/src/main/java/com/atguigu/ssyx/acl/service/RolePermissionService.java create mode 100644 service/service-acl/src/main/java/com/atguigu/ssyx/acl/service/impl/RolePermissionServiceImpl.java create mode 100644 service/service-user/src/main/java/com/atguigu/ssyx/user/controller/WeiXinApiController.java create mode 100644 service/service-user/src/main/java/com/atguigu/ssyx/user/service/WeiXinApiService.java create mode 100644 service/service-user/src/main/java/com/atguigu/ssyx/user/service/impl/WeiXinApiServiceImpl.java create mode 100644 service/service-user/src/main/java/com/atguigu/ssyx/user/service/module/WeiXinApiServiceModule.java diff --git a/common/service-util/src/main/java/com/atguigu/ssyx/common/CodeGet.java b/common/service-util/src/main/java/com/atguigu/ssyx/common/CodeGet.java index 4119363..0617902 100644 --- a/common/service-util/src/main/java/com/atguigu/ssyx/common/CodeGet.java +++ b/common/service-util/src/main/java/com/atguigu/ssyx/common/CodeGet.java @@ -58,8 +58,8 @@ public class CodeGet { @NotNull private static StrategyConfig getStrategyConfig() { StrategyConfig strategy = new StrategyConfig(); - - strategy.setInclude("activity_info", "activity_rule", "activity_sku", "coupon_info", "coupon_range", "coupon_use"); + // TODO 要生成的表 + strategy.setInclude("seckill", "seckill_sku", "seckill_sku_notice", "sku_info"); strategy.setNaming(NamingStrategy.underline_to_camel);// 数据库表映射到实体的命名策略 strategy.setColumnNaming(NamingStrategy.underline_to_camel);// 数据库表字段映射到实体的命名策略 strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作 diff --git a/model/src/main/java/com/atguigu/ssyx/vo/user/LeaderAddressVo.java b/model/src/main/java/com/atguigu/ssyx/vo/user/LeaderAddressVo.java index 88697ae..b48ae98 100644 --- a/model/src/main/java/com/atguigu/ssyx/vo/user/LeaderAddressVo.java +++ b/model/src/main/java/com/atguigu/ssyx/vo/user/LeaderAddressVo.java @@ -1,9 +1,11 @@ package com.atguigu.ssyx.vo.user; -import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; /** *

@@ -13,47 +15,48 @@ import lombok.Data; * @author qy */ @Data +@Builder +@AllArgsConstructor +@NoArgsConstructor @ApiModel(description = "用户地址") public class LeaderAddressVo { + @ApiModelProperty(value = "用户id") + private Long userId; - @ApiModelProperty(value = "用户id") - private Long userId; + @ApiModelProperty(value = "团长id") + private Long leaderId; - @ApiModelProperty(value = "团长id") - private Long leaderId; + @ApiModelProperty(value = "团长名称") + private String leaderName; - @ApiModelProperty(value = "团长名称") - private String leaderName; + @ApiModelProperty(value = "团长电话") + private String leaderPhone; - @ApiModelProperty(value = "团长电话") - private String leaderPhone; + @ApiModelProperty(value = "仓库id") + private Long wareId; - @ApiModelProperty(value = "仓库id") - private Long wareId; + @ApiModelProperty(value = "提货点名称") + private String takeName; - @ApiModelProperty(value = "提货点名称") - private String takeName; + @ApiModelProperty(value = "省") + private String province; - @ApiModelProperty(value = "省") - private String province; + @ApiModelProperty(value = "城市") + private String city; - @ApiModelProperty(value = "城市") - private String city; + @ApiModelProperty(value = "区域") + private String district; - @ApiModelProperty(value = "区域") - private String district; + @ApiModelProperty(value = "详细地址") + private String detailAddress; - @ApiModelProperty(value = "详细地址") - private String detailAddress; + @ApiModelProperty(value = "经度") + private String longitude; - @ApiModelProperty(value = "经度") - private String longitude; - - @ApiModelProperty(value = "纬度") - private String latitude; - - @ApiModelProperty(value = "门店照片") - private String storePath; + @ApiModelProperty(value = "纬度") + private String latitude; + @ApiModelProperty(value = "门店照片") + private String storePath; } diff --git a/service/service-acl/src/main/java/com/atguigu/ssyx/acl/controller/PermissionController.java b/service/service-acl/src/main/java/com/atguigu/ssyx/acl/controller/PermissionController.java index 6dde174..c408577 100644 --- a/service/service-acl/src/main/java/com/atguigu/ssyx/acl/controller/PermissionController.java +++ b/service/service-acl/src/main/java/com/atguigu/ssyx/acl/controller/PermissionController.java @@ -46,4 +46,19 @@ public class PermissionController { permissionService.removeChildById(id); return Result.success(); } + + @ApiOperation(value = "查询所有菜单和角色分配菜单") + @GetMapping("toAssign/{roleId}") + public Result> toAssign(@PathVariable Long roleId) { + List permissionList = permissionService.findMenuByRoleId(roleId); + return Result.success(permissionList); + } + + @ApiOperation(value = "查询所有菜单和角色分配菜单") + @PostMapping("doAssign") + public Result doAssign(@RequestParam Long roleId, + @RequestParam List permissions) { + permissionService.doAssign(roleId, permissions); + return Result.success(); + } } diff --git a/service/service-acl/src/main/java/com/atguigu/ssyx/acl/mapper/RolePermissionMapper.java b/service/service-acl/src/main/java/com/atguigu/ssyx/acl/mapper/RolePermissionMapper.java new file mode 100644 index 0000000..b50e764 --- /dev/null +++ b/service/service-acl/src/main/java/com/atguigu/ssyx/acl/mapper/RolePermissionMapper.java @@ -0,0 +1,9 @@ +package com.atguigu.ssyx.acl.mapper; + +import com.atguigu.ssyx.model.acl.RolePermission; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RolePermissionMapper extends BaseMapper { +} diff --git a/service/service-acl/src/main/java/com/atguigu/ssyx/acl/service/PermissionService.java b/service/service-acl/src/main/java/com/atguigu/ssyx/acl/service/PermissionService.java index 7cc67b0..feeefab 100644 --- a/service/service-acl/src/main/java/com/atguigu/ssyx/acl/service/PermissionService.java +++ b/service/service-acl/src/main/java/com/atguigu/ssyx/acl/service/PermissionService.java @@ -20,4 +20,20 @@ public interface PermissionService extends IService { * @param id 删除ID */ void removeChildById(Long id); + + /** + * 查询所有菜单和角色分配菜单 + * + * @param roleId 角色Id + * @return 权限列表 + */ + List findMenuByRoleId(Long roleId); + + /** + * 查询所有菜单和角色分配菜单 + * + * @param roleId 角色Id + * @param permissions 分配权限Id + */ + void doAssign(Long roleId, List permissions); } \ No newline at end of file diff --git a/service/service-acl/src/main/java/com/atguigu/ssyx/acl/service/RolePermissionService.java b/service/service-acl/src/main/java/com/atguigu/ssyx/acl/service/RolePermissionService.java new file mode 100644 index 0000000..64dc7f1 --- /dev/null +++ b/service/service-acl/src/main/java/com/atguigu/ssyx/acl/service/RolePermissionService.java @@ -0,0 +1,7 @@ +package com.atguigu.ssyx.acl.service; + +import com.atguigu.ssyx.model.acl.RolePermission; +import com.baomidou.mybatisplus.extension.service.IService; + +public interface RolePermissionService extends IService { +} diff --git a/service/service-acl/src/main/java/com/atguigu/ssyx/acl/service/impl/PermissionServiceImpl.java b/service/service-acl/src/main/java/com/atguigu/ssyx/acl/service/impl/PermissionServiceImpl.java index 5239d4e..170f822 100644 --- a/service/service-acl/src/main/java/com/atguigu/ssyx/acl/service/impl/PermissionServiceImpl.java +++ b/service/service-acl/src/main/java/com/atguigu/ssyx/acl/service/impl/PermissionServiceImpl.java @@ -3,19 +3,25 @@ package com.atguigu.ssyx.acl.service.impl; import com.atguigu.common.utils.PermissionHelper; import com.atguigu.ssyx.acl.mapper.PermissionMapper; import com.atguigu.ssyx.acl.service.PermissionService; +import com.atguigu.ssyx.acl.service.RolePermissionService; import com.atguigu.ssyx.acl.service.module.PermissionServiceModule; import com.atguigu.ssyx.model.acl.Permission; +import com.atguigu.ssyx.model.acl.RolePermission; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; @Service public class PermissionServiceImpl extends ServiceImpl implements PermissionService { @Autowired private PermissionServiceModule permissionServiceModule; + @Autowired + private RolePermissionService rolePermissionService; /** * 获取所有菜单列表 @@ -43,4 +49,52 @@ public class PermissionServiceImpl extends ServiceImpl findMenuByRoleId(Long roleId) { + List permissionList = list(); + + List rolePermissionList = rolePermissionService.list( + Wrappers.lambdaQuery().eq(RolePermission::getRoleId, roleId) + ); + + List permissionIdList = rolePermissionList.stream().map(RolePermission::getPermissionId).collect(Collectors.toList()); + + permissionList.forEach(permission -> { + if (permissionIdList.contains(permission.getId())) { + permission.setSelect(true); + } + permission.setSelect(false); + }); + + return PermissionHelper.buildPermissions(permissionList); + } + + /** + * 查询所有菜单和角色分配菜单 + * + * @param roleId 角色Id + * @param permissions 分配权限Id + */ + @Override + public void doAssign(Long roleId, List permissions) { + // 先删除之前分配的角色 + rolePermissionService.remove(Wrappers.lambdaQuery().eq(RolePermission::getRoleId, roleId)); + ArrayList list = new ArrayList<>(); + + permissions.forEach(permissionId -> { + RolePermission rolePermission = new RolePermission(); + rolePermission.setPermissionId(permissionId); + rolePermission.setRoleId(roleId); + list.add(rolePermission); + }); + + rolePermissionService.saveBatch(list); + } } diff --git a/service/service-acl/src/main/java/com/atguigu/ssyx/acl/service/impl/RolePermissionServiceImpl.java b/service/service-acl/src/main/java/com/atguigu/ssyx/acl/service/impl/RolePermissionServiceImpl.java new file mode 100644 index 0000000..3b04c95 --- /dev/null +++ b/service/service-acl/src/main/java/com/atguigu/ssyx/acl/service/impl/RolePermissionServiceImpl.java @@ -0,0 +1,11 @@ +package com.atguigu.ssyx.acl.service.impl; + +import com.atguigu.ssyx.acl.mapper.RolePermissionMapper; +import com.atguigu.ssyx.acl.service.RolePermissionService; +import com.atguigu.ssyx.model.acl.RolePermission; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +@Service +public class RolePermissionServiceImpl extends ServiceImpl implements RolePermissionService { +} diff --git a/service/service-user/pom.xml b/service/service-user/pom.xml index 3af923f..f219b14 100644 --- a/service/service-user/pom.xml +++ b/service/service-user/pom.xml @@ -18,6 +18,11 @@ + + com.atguigu + service-util + 1.0-SNAPSHOT + com.atguigu service-product-client diff --git a/service/service-user/src/main/java/com/atguigu/ssyx/user/controller/WeiXinApiController.java b/service/service-user/src/main/java/com/atguigu/ssyx/user/controller/WeiXinApiController.java new file mode 100644 index 0000000..ecd00fe --- /dev/null +++ b/service/service-user/src/main/java/com/atguigu/ssyx/user/controller/WeiXinApiController.java @@ -0,0 +1,28 @@ +package com.atguigu.ssyx.user.controller; + +import com.atguigu.ssyx.common.result.Result; +import com.atguigu.ssyx.user.service.WeiXinApiService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +@Api(tags = "用户微信接口") +@RestController +@RequestMapping("/api/user/weixin") +public class WeiXinApiController { + @Autowired + private WeiXinApiService weChatService; + + @ApiOperation(value = "微信登录获取openid(小程序)") + @GetMapping("/wxLogin/{code}") + public Result> callback(@PathVariable String code) { + Map map = weChatService.callback(code); + return Result.success(map); + } +} \ No newline at end of file diff --git a/service/service-user/src/main/java/com/atguigu/ssyx/user/service/WeiXinApiService.java b/service/service-user/src/main/java/com/atguigu/ssyx/user/service/WeiXinApiService.java new file mode 100644 index 0000000..278bb22 --- /dev/null +++ b/service/service-user/src/main/java/com/atguigu/ssyx/user/service/WeiXinApiService.java @@ -0,0 +1,12 @@ +package com.atguigu.ssyx.user.service; + +import java.util.Map; + +public interface WeiXinApiService { + /** + * * 微信登录获取openid + * + * @param code 登录码 + */ + Map callback(String code); +} diff --git a/service/service-user/src/main/java/com/atguigu/ssyx/user/service/impl/WeiXinApiServiceImpl.java b/service/service-user/src/main/java/com/atguigu/ssyx/user/service/impl/WeiXinApiServiceImpl.java new file mode 100644 index 0000000..b2679cc --- /dev/null +++ b/service/service-user/src/main/java/com/atguigu/ssyx/user/service/impl/WeiXinApiServiceImpl.java @@ -0,0 +1,78 @@ +package com.atguigu.ssyx.user.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.atguigu.common.utils.JwtHelper; +import com.atguigu.ssyx.common.constant.RedisConst; +import com.atguigu.ssyx.common.exception.BunnyException; +import com.atguigu.ssyx.common.result.ResultCodeEnum; +import com.atguigu.ssyx.enums.UserType; +import com.atguigu.ssyx.model.user.User; +import com.atguigu.ssyx.user.service.UserService; +import com.atguigu.ssyx.user.service.WeiXinApiService; +import com.atguigu.ssyx.user.service.module.WeiXinApiServiceModule; +import com.atguigu.ssyx.user.utils.HttpClientUtils; +import com.atguigu.ssyx.vo.user.LeaderAddressVo; +import com.atguigu.ssyx.vo.user.UserLoginVo; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.Map; + +@Service +@Slf4j +public class WeiXinApiServiceImpl implements WeiXinApiService { + @Autowired + private WeiXinApiServiceModule module; + @Autowired + private UserService userService; + @Autowired + private RedisTemplate redisTemplate; + + /** + * * 微信登录获取openid + * + * @param code 登录码 + */ + @Override + public Map callback(String code) { + // 拿到微信返回code临时票据纸 + String accessTokenUrl = module.getAccessTokenUrl(code); + try { + String result = HttpClientUtils.get(accessTokenUrl); + // 请求微信接口服,返回两个值 session_key 和 openId + JSONObject jsonObject = JSONObject.parseObject(result); + String accessToken = jsonObject.getString("session_key"); + String openId = jsonObject.getString("openid"); + // 先根据openid进行数据库查询 + User user = userService.getUserByOpenId(openId); + // 如果没有查到用户信息,那么调用微信个人信息获取的接口 + if (null == user) { + user = new User(); + user.setOpenId(openId); + user.setNickName(openId); + user.setPhotoUrl(""); + user.setUserType(UserType.USER); + user.setIsNew(0); + userService.save(user); + } + // 根据用户Id查询默认团长Id + LeaderAddressVo leaderAddressVo = userService.getLeaderAddressVoByUserId(user.getId()); + Map map = new HashMap<>(); + String name = user.getNickName(); + map.put("user", user); + map.put("leaderAddressVo", leaderAddressVo); + String token = JwtHelper.createToken(user.getId(), name); + map.put("token", token); + + // 获取当前用户登录信息 + UserLoginVo userLoginVo = userService.getUserLoginVo(user.getId()); + redisTemplate.opsForValue().set(RedisConst.USER_LOGIN_KEY_PREFIX + user.getId(), userLoginVo, RedisConst.USERKEY_TIMEOUT, TimeUnit.DAYS); + return map; + } catch (Exception exception) { + throw new BunnyException(ResultCodeEnum.FETCH_ACCESSTOKEN_FAILD); + } + } +} diff --git a/service/service-user/src/main/java/com/atguigu/ssyx/user/service/module/WeiXinApiServiceModule.java b/service/service-user/src/main/java/com/atguigu/ssyx/user/service/module/WeiXinApiServiceModule.java new file mode 100644 index 0000000..a760d11 --- /dev/null +++ b/service/service-user/src/main/java/com/atguigu/ssyx/user/service/module/WeiXinApiServiceModule.java @@ -0,0 +1,26 @@ +package com.atguigu.ssyx.user.service.module; + +import com.atguigu.ssyx.common.properties.WeChatProperties; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class WeiXinApiServiceModule { + @Autowired + private WeChatProperties weChatProperties; + + public String getAccessTokenUrl(String code) { + String appId = weChatProperties.getAppId(); + String appSecret = weChatProperties.getAppSecret(); + + // 使用code和appid以及appscrect换取access_token + String baseAccessTokenUrl = "https://api.weixin.qq.com/sns/jscode2session" + + "?appid=%s" + + "&secret=%s" + + "&js_code=%s" + + "&grant_type=authorization_code"; + + // 拿着code+小程序Id+小程序秘钥 请求微信接口服务 + return String.format(baseAccessTokenUrl, appId, appSecret, code); + } +}