From e4032a01837872273a70e718e13d096d7d8031f1 Mon Sep 17 00:00:00 2001 From: starrySky <1752476835@qq.com> Date: Wed, 10 Apr 2024 17:02:54 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E4=B8=8D=E5=90=8C=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E4=B9=8B=E5=90=8E=EF=BC=8C=E7=A7=9F=E6=88=B7?= =?UTF-8?q?ID=E7=9A=84=E5=A4=84=E7=90=86=EF=BC=8C2=E3=80=81=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E7=BB=91=E5=AE=9A=E7=9F=AD=E4=BF=A1=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy.sh | 11 -- .../common/aspect/ClerkUserLoginAspect.java | 11 +- .../common/aspect/CustomUserLoginAspect.java | 9 +- .../common/exception/ServiceException.java | 12 +- .../handler/GlobalExceptionHandler.java | 7 + .../mybatis/handler/MyMetaObjectHandler.java | 55 +++++-- .../admin/common/security/CustomFilter.java | 32 ---- .../security/config/SpringSecurityConfig.java | 25 +--- .../filter/JwtAuthenticationTokenFilter.java | 52 +++++-- .../PlayClerkUserInfoController.java | 2 +- .../service/IPlayClerkUserInfoService.java | 13 +- .../impl/PlayClerkUserInfoServiceImpl.java | 12 +- .../PlayCustomUserInfoController.java | 2 +- .../service/IPlayCustomUserInfoService.java | 12 +- .../impl/PlayCustomUserInfoServiceImpl.java | 11 +- .../AdministrativeAreaDictInfoController.java | 47 +----- .../SysAdministrativeAreaDictInfoEntity.java | 12 ++ ...ISysAdministrativeAreaDictInfoService.java | 12 ++ ...AdministrativeAreaDictInfoServiceImpl.java | 42 +++++- .../weichat/controller/WxClerkController.java | 78 ++++++++++ .../controller/WxCommonController.java | 29 ++++ .../weichat/controller/WxOauthController.java | 39 +++-- .../weichat/entity/PlayClerkUserAddVo.java | 92 ++++++++++++ .../entity/PlayClerkUserBindCodeVo.java | 34 +++++ .../entity/PlayClerkUserSendCodeVo.java | 27 ++++ .../weichat/mapper/PlayWxUserInfoMapper.java | 16 -- .../modules/weichat/service/Constants.java | 2 +- .../weichat/service/WxOauthService.java | 13 +- .../weichat/service/WxTokenService.java | 139 ++++++++---------- .../src/main/resources/application-test.yml | 4 +- .../com/starry/common/config/RedisConfig.java | 9 +- .../com/starry/common/redis/RedisCache.java | 6 +- .../common/utils/VerificationCodeUtils.java | 16 ++ 33 files changed, 604 insertions(+), 279 deletions(-) delete mode 100644 deploy.sh delete mode 100644 play-admin/src/main/java/com/starry/admin/common/security/CustomFilter.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxClerkController.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxCommonController.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayClerkUserAddVo.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayClerkUserBindCodeVo.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayClerkUserSendCodeVo.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/mapper/PlayWxUserInfoMapper.java create mode 100644 play-common/src/main/java/com/starry/common/utils/VerificationCodeUtils.java diff --git a/deploy.sh b/deploy.sh deleted file mode 100644 index 18e97ba..0000000 --- a/deploy.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh -# 发包脚本 -set -e -echo "发布开始,当前时间是:$current_time" -#mvn clean install -scp ./play-admin/target/play-admin-1.0.jar root@122.51.20.105:/www/wwwroot/july.hucs.top -ssh root@122.51.20.105 "source /etc/profile;cd /www/wwwroot/july.hucs.top;sh start.sh restart" -# 获取当前时间并格式化为指定格式 -current_time=$(date +"%Y-%m-%d %H:%M:%S") - -echo "发布完成,当前时间是:$current_time" \ No newline at end of file diff --git a/play-admin/src/main/java/com/starry/admin/common/aspect/ClerkUserLoginAspect.java b/play-admin/src/main/java/com/starry/admin/common/aspect/ClerkUserLoginAspect.java index 174623f..9cad6b2 100644 --- a/play-admin/src/main/java/com/starry/admin/common/aspect/ClerkUserLoginAspect.java +++ b/play-admin/src/main/java/com/starry/admin/common/aspect/ClerkUserLoginAspect.java @@ -2,8 +2,8 @@ package com.starry.admin.common.aspect; import com.starry.admin.common.conf.ThreadLocalRequestDetail; import com.starry.admin.common.exception.ServiceException; -import com.starry.admin.modules.clear.mapper.PlayClerkUserInfoMapper; import com.starry.admin.modules.clear.module.entity.PlayClerkUserInfoEntity; +import com.starry.admin.modules.clear.service.impl.PlayClerkUserInfoServiceImpl; import com.starry.admin.modules.weichat.service.WxTokenService; import com.starry.common.constant.Constants; import com.starry.common.constant.HttpStatus; @@ -28,8 +28,11 @@ import java.util.Objects; @Component public class ClerkUserLoginAspect { + + @Resource - private PlayClerkUserInfoMapper userMapper; + private PlayClerkUserInfoServiceImpl clerkUserInfoService; + @Resource private WxTokenService tokenService; @Resource @@ -46,12 +49,12 @@ public class ClerkUserLoginAspect { // 解析token String userId; try { - userId = tokenService.getMiniUserIdByToken(userToken); + userId = tokenService.getWxUserIdByToken(userToken); } catch (Exception e) { log.error(e.getMessage(), e); throw new ServiceException("获取用户信息异常", HttpStatus.UNAUTHORIZED); } - PlayClerkUserInfoEntity entity = userMapper.selectById(userId); + PlayClerkUserInfoEntity entity = clerkUserInfoService.selectById(userId); if (Objects.isNull(entity)) { throw new ServiceException("未查询到有效用户", HttpStatus.UNAUTHORIZED); } diff --git a/play-admin/src/main/java/com/starry/admin/common/aspect/CustomUserLoginAspect.java b/play-admin/src/main/java/com/starry/admin/common/aspect/CustomUserLoginAspect.java index c377b7e..764cbe6 100644 --- a/play-admin/src/main/java/com/starry/admin/common/aspect/CustomUserLoginAspect.java +++ b/play-admin/src/main/java/com/starry/admin/common/aspect/CustomUserLoginAspect.java @@ -2,8 +2,8 @@ package com.starry.admin.common.aspect; import com.starry.admin.common.conf.ThreadLocalRequestDetail; import com.starry.admin.common.exception.ServiceException; -import com.starry.admin.modules.custom.mapper.PlayCustomUserInfoMapper; import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity; +import com.starry.admin.modules.custom.service.impl.PlayCustomUserInfoServiceImpl; import com.starry.admin.modules.weichat.service.WxTokenService; import com.starry.common.constant.Constants; import com.starry.common.constant.HttpStatus; @@ -29,7 +29,8 @@ import java.util.Objects; public class CustomUserLoginAspect { @Resource - private PlayCustomUserInfoMapper userMapper; + private PlayCustomUserInfoServiceImpl customUserInfoService; + @Resource private WxTokenService tokenService; @Resource @@ -46,12 +47,12 @@ public class CustomUserLoginAspect { // 解析token String userId; try { - userId = tokenService.getMiniUserIdByToken(userToken); + userId = tokenService.getWxUserIdByToken(userToken); } catch (Exception e) { log.error(e.getMessage(), e); throw new ServiceException("获取用户信息异常", HttpStatus.UNAUTHORIZED); } - PlayCustomUserInfoEntity entity = userMapper.selectById(userId); + PlayCustomUserInfoEntity entity = customUserInfoService.selectById(userId); if (Objects.isNull(entity)) { throw new ServiceException("未查询到有效用户", HttpStatus.UNAUTHORIZED); } diff --git a/play-admin/src/main/java/com/starry/admin/common/exception/ServiceException.java b/play-admin/src/main/java/com/starry/admin/common/exception/ServiceException.java index 7c34a52..5095708 100644 --- a/play-admin/src/main/java/com/starry/admin/common/exception/ServiceException.java +++ b/play-admin/src/main/java/com/starry/admin/common/exception/ServiceException.java @@ -1,9 +1,14 @@ package com.starry.admin.common.exception; +import lombok.Data; +import lombok.EqualsAndHashCode; + /** * @author 业务异常 * @since 2023/3/9 */ +@EqualsAndHashCode(callSuper = true) +@Data public class ServiceException extends RuntimeException { private static final long serialVersionUID = 1L; @@ -38,9 +43,6 @@ public class ServiceException extends RuntimeException { this.code = code; } - public String getDetailMessage() { - return detailMessage; - } public ServiceException setDetailMessage(String detailMessage) { this.detailMessage = detailMessage; @@ -56,8 +58,4 @@ public class ServiceException extends RuntimeException { this.message = message; return this; } - - public Integer getCode() { - return code; - } } diff --git a/play-admin/src/main/java/com/starry/admin/common/exception/handler/GlobalExceptionHandler.java b/play-admin/src/main/java/com/starry/admin/common/exception/handler/GlobalExceptionHandler.java index 6911264..d58a4e7 100644 --- a/play-admin/src/main/java/com/starry/admin/common/exception/handler/GlobalExceptionHandler.java +++ b/play-admin/src/main/java/com/starry/admin/common/exception/handler/GlobalExceptionHandler.java @@ -88,4 +88,11 @@ public class GlobalExceptionHandler { public R customException(CustomException e) { return R.error(e.getMessage()); } + + // @ExceptionHandler(ServiceException.class) + // public R serviceException(ServiceException e) { + // return R.error(e.getMessage()); + // } + + } diff --git a/play-admin/src/main/java/com/starry/admin/common/mybatis/handler/MyMetaObjectHandler.java b/play-admin/src/main/java/com/starry/admin/common/mybatis/handler/MyMetaObjectHandler.java index 0a9b141..f4cd821 100644 --- a/play-admin/src/main/java/com/starry/admin/common/mybatis/handler/MyMetaObjectHandler.java +++ b/play-admin/src/main/java/com/starry/admin/common/mybatis/handler/MyMetaObjectHandler.java @@ -1,10 +1,15 @@ package com.starry.admin.common.mybatis.handler; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import com.starry.admin.modules.weichat.service.WxTokenService; +import com.starry.admin.utils.SecurityUtils; +import com.starry.common.constant.Constants; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; import java.util.Date; /** @@ -16,29 +21,53 @@ import java.util.Date; @Component public class MyMetaObjectHandler implements MetaObjectHandler { + + @Resource + private HttpServletRequest request; + + @Resource + private WxTokenService tokenService; + @Override public void insertFill(MetaObject metaObject) { log.info("start insert fill ...."); this.setFieldValByName("createdTime", new Date(), metaObject); this.setFieldValByName("deleted", false, metaObject); this.setFieldValByName("version", 1L, metaObject); -// Object createUser = this.getFieldValByName("createdBy", metaObject); -// if (createUser == null) { -// if (SecurityUtils.isLogin()) { -// this.setFieldValByName("createdBy", SecurityUtils.getUserId(), metaObject); -// } -// } + Object createUser = this.getFieldValByName("createdBy", metaObject); + if (createUser == null) { + if (SecurityUtils.isLogin()) { + this.setFieldValByName("createdBy", getOperatorId(), metaObject); + } + } } @Override public void updateFill(MetaObject metaObject) { log.info("start update fill ...."); this.setFieldValByName("updatedTime", new Date(), metaObject); -// Object createUser = this.getFieldValByName("updatedBy", metaObject); -// if (createUser == null) { -// if (SecurityUtils.isLogin()) { -// this.setFieldValByName("updatedBy", SecurityUtils.getUserId(), metaObject); -// } -// } + Object createUser = this.getFieldValByName("updatedBy", metaObject); + if (createUser == null) { + this.setFieldValByName("createdBy", getOperatorId(), metaObject); + } + } + + public String getOperatorId() { + if (request.getServletPath().startsWith("/wx/")) { + String clerkToken = request.getHeader(Constants.CLERK_USER_LOGIN_TOKEN); + String customToken = request.getHeader(Constants.CUSTOM_USER_LOGIN_TOKEN); + if (clerkToken != null) { + return tokenService.getWxUserIdByToken(clerkToken); + } + if (customToken != null) { + return tokenService.getWxUserIdByToken(customToken); + } + return ""; + } else { + if (SecurityUtils.isLogin()) { + return SecurityUtils.getUserId(); + } + } + return ""; + } } -} diff --git a/play-admin/src/main/java/com/starry/admin/common/security/CustomFilter.java b/play-admin/src/main/java/com/starry/admin/common/security/CustomFilter.java deleted file mode 100644 index 5a99786..0000000 --- a/play-admin/src/main/java/com/starry/admin/common/security/CustomFilter.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.starry.admin.common.security; - -import javax.servlet.*; -import java.io.IOException; - -/** - * @author admin - * @since 2024/4/7 17:17 - **/ -public class CustomFilter implements Filter { - @Override - public void init(FilterConfig filterConfig) { - // 初始化代码 - } - - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { - // 在请求处理之前可以进行一些操作 - // 例如,可以记录请求开始时间 - System.out.println("--------------------"); - // 继续调用下一个Filter或servlet - chain.doFilter(request, response); - - // 在请求处理之后可以进行一些操作 - // 例如,可以记录请求结束时间并计算耗时 - } - - @Override - public void destroy() { - // 销毁代码 - } -} diff --git a/play-admin/src/main/java/com/starry/admin/common/security/config/SpringSecurityConfig.java b/play-admin/src/main/java/com/starry/admin/common/security/config/SpringSecurityConfig.java index e835c75..b58708c 100644 --- a/play-admin/src/main/java/com/starry/admin/common/security/config/SpringSecurityConfig.java +++ b/play-admin/src/main/java/com/starry/admin/common/security/config/SpringSecurityConfig.java @@ -50,25 +50,13 @@ public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { protected void configure(HttpSecurity httpSecurity) throws Exception { httpSecurity.csrf().disable()// 由于使用的是JWT,我们这里不需要csrf .sessionManagement()// 基于token,所以不需要session - .sessionCreationPolicy(SessionCreationPolicy.STATELESS) - .and() - .authorizeRequests() + .sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().authorizeRequests() // 允许对于网站静态资源的无授权访问 - .antMatchers(HttpMethod.GET, - "/", - "/*.html", - "/favicon.ico", - "/**/*.html", - "/**/*.css", - "/**/*.js", - "/swagger-resources/**", - "/v2/api-docs/**" - ).permitAll() + .antMatchers(HttpMethod.GET, "/", "/*.html", "/favicon.ico", "/**/*.html", "/**/*.css", "/**/*.js", "/swagger-resources/**", "/v2/api-docs/**").permitAll() // 对登录注册要允许匿名访问 .antMatchers("/login", "/captcha/get-captcha", "/wx/**").permitAll() // 跨域请求会先进行一次options请求 - .antMatchers(HttpMethod.OPTIONS).permitAll() - .anyRequest()// 除上面外的所有请求全部需要鉴权认证 + .antMatchers(HttpMethod.OPTIONS).permitAll().anyRequest()// 除上面外的所有请求全部需要鉴权认证 .authenticated(); // 禁用缓存 httpSecurity.headers().cacheControl(); @@ -77,15 +65,12 @@ public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { // 添加JWT filter httpSecurity.addFilterBefore(jwtAuthenticationTokenFilter(), UsernamePasswordAuthenticationFilter.class); // 添加自定义未授权和未登录结果返回 - httpSecurity.exceptionHandling() - .accessDeniedHandler(customAccessDeniedHandler) - .authenticationEntryPoint(customAuthenticationEntryPoint); + httpSecurity.exceptionHandling().accessDeniedHandler(customAccessDeniedHandler).authenticationEntryPoint(customAuthenticationEntryPoint); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth.userDetailsService(userDetailsService()) - .passwordEncoder(passwordEncoder()); + auth.userDetailsService(userDetailsService()).passwordEncoder(passwordEncoder()); } @Bean diff --git a/play-admin/src/main/java/com/starry/admin/common/security/filter/JwtAuthenticationTokenFilter.java b/play-admin/src/main/java/com/starry/admin/common/security/filter/JwtAuthenticationTokenFilter.java index 32096c0..6625177 100644 --- a/play-admin/src/main/java/com/starry/admin/common/security/filter/JwtAuthenticationTokenFilter.java +++ b/play-admin/src/main/java/com/starry/admin/common/security/filter/JwtAuthenticationTokenFilter.java @@ -3,8 +3,13 @@ package com.starry.admin.common.security.filter; import com.starry.admin.common.component.JwtToken; import com.starry.admin.common.domain.LoginUser; +import com.starry.admin.modules.clear.service.impl.PlayClerkUserInfoServiceImpl; +import com.starry.admin.modules.custom.service.impl.PlayCustomUserInfoServiceImpl; +import com.starry.admin.modules.weichat.service.WxTokenService; +import com.starry.admin.utils.SecurityUtils; +import com.starry.common.constant.Constants; +import com.starry.common.utils.StringUtils; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; @@ -26,23 +31,48 @@ import java.io.IOException; @Slf4j public class JwtAuthenticationTokenFilter extends OncePerRequestFilter { + @Resource + WxTokenService tokenService; - @Value("${jwt.tokenHeader}") - private String tokenHeader; - @Value("${jwt.tokenHead}") - private String tokenHead; @Resource private JwtToken jwtToken; + @Resource + private PlayCustomUserInfoServiceImpl customUserInfoService; + + @Resource + private PlayClerkUserInfoServiceImpl clerkUserInfoService; + @Override protected void doFilterInternal(@NotNull HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException { - LoginUser jwtUser = jwtToken.getNewLoginUser(httpServletRequest); - if (null != jwtUser && null == SecurityContextHolder.getContext().getAuthentication()) { - jwtToken.verifyToken(jwtUser); - UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(jwtUser, null, jwtUser.getAuthorities()); - authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(httpServletRequest)); - SecurityContextHolder.getContext().setAuthentication(authentication); + // 微信公众号的请求 + if (httpServletRequest.getServletPath().startsWith("/wx/")) { + String clerkToken = httpServletRequest.getHeader(Constants.CLERK_USER_LOGIN_TOKEN); + String customToken = httpServletRequest.getHeader(Constants.CUSTOM_USER_LOGIN_TOKEN); + if (StringUtils.isNotEmpty(clerkToken) || StringUtils.isNotEmpty(customToken)) { + String userId = tokenService.getWxUserIdByToken(StringUtils.isNotEmpty(clerkToken) ? clerkToken : customToken); + if (clerkToken != null) { + SecurityUtils.setTenantId(clerkUserInfoService.selectById(userId).getTenantId()); + } else { + SecurityUtils.setTenantId(customUserInfoService.selectById(userId).getTenantId()); + } + } else { + // 如果是微信端接口,并且未登录的话,从head中获取token + String header = httpServletRequest.getHeader("tenantkey"); + // 根据租户表信息,查询租户ID(暂时先写死) + String tenantId = "9999"; + SecurityUtils.setTenantId(header); + } + } else { + // 管理端的请求 + LoginUser jwtUser = jwtToken.getNewLoginUser(httpServletRequest); + if (null != jwtUser && null == SecurityContextHolder.getContext().getAuthentication()) { + jwtToken.verifyToken(jwtUser); + UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(jwtUser, null, jwtUser.getAuthorities()); + authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(httpServletRequest)); + SecurityContextHolder.getContext().setAuthentication(authentication); + } } filterChain.doFilter(httpServletRequest, httpServletResponse); } diff --git a/play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkUserInfoController.java b/play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkUserInfoController.java index 7fee439..79fc75c 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkUserInfoController.java +++ b/play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkUserInfoController.java @@ -80,7 +80,7 @@ public class PlayClerkUserInfoController { @PreAuthorize("@customSs.hasPermission('play:info:query')") @GetMapping(value = "/{id}") public R getInfo(@PathVariable("id") String id) { - return R.ok(playClerkUserInfoService.selectPlayClerkUserInfoById(id)); + return R.ok(playClerkUserInfoService.selectById(id)); } diff --git a/play-admin/src/main/java/com/starry/admin/modules/clear/service/IPlayClerkUserInfoService.java b/play-admin/src/main/java/com/starry/admin/modules/clear/service/IPlayClerkUserInfoService.java index 8dcf9bd..ec349cd 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/clear/service/IPlayClerkUserInfoService.java +++ b/play-admin/src/main/java/com/starry/admin/modules/clear/service/IPlayClerkUserInfoService.java @@ -36,7 +36,18 @@ public interface IPlayClerkUserInfoService extends IService result = new ArrayList<>(); - List list = playAdministrativeAreaDictInfoService.selectAll(); - Map> collect = list.stream().filter(a -> a != null && a.getPCode() != null).collect(Collectors.groupingBy(SysAdministrativeAreaDictInfoEntity::getPCode)); - if (collect.containsKey("00")) { - result = ConvertUtil.entityToVoList(collect.get("00"), AdministrativeAreaQueryReturnVo.class); - } - for (AdministrativeAreaQueryReturnVo vo : result) { - vo.setChild(ConvertUtil.entityToVoList(collect.get(vo.getCode()), AdministrativeAreaQueryReturnVo.class)); - } - return R.ok(result); - } - - @GetMapping("/add") - public R add(@RequestParam("index") String index) { - String fileName = "D:\\" + index + ".txt"; - JSONArray array = JSONArray.parse(FileUtil.readString(new File(fileName), "UTF-8")); - List list = new ArrayList<>(); - for (int i = 0; i < array.size(); i++) { - JSONObject jsonObject = array.getJSONObject(i); - SysAdministrativeAreaDictInfoEntity entity = new SysAdministrativeAreaDictInfoEntity(); - entity.setCode(jsonObject.getString("code")); - entity.setName(jsonObject.getString("name")); - if (index.equals("1")) { - entity.setPCode("00"); - } else { - entity.setPCode(jsonObject.getString("provinceCode")); - } - entity.setLevel(index); - list.add(entity); - } - playAdministrativeAreaDictInfoService.saveBatch(list); - return R.ok(""); + public R list() throws Exception { + return R.ok(playAdministrativeAreaDictInfoService.selectTree("2")); } } diff --git a/play-admin/src/main/java/com/starry/admin/modules/system/entity/SysAdministrativeAreaDictInfoEntity.java b/play-admin/src/main/java/com/starry/admin/modules/system/entity/SysAdministrativeAreaDictInfoEntity.java index 69a2fa5..789bc50 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/system/entity/SysAdministrativeAreaDictInfoEntity.java +++ b/play-admin/src/main/java/com/starry/admin/modules/system/entity/SysAdministrativeAreaDictInfoEntity.java @@ -1,10 +1,13 @@ package com.starry.admin.modules.system.entity; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.starry.common.domain.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; +import java.util.List; + /** * 行政区域字典信息对象 play_administrative_area_dict_info * @@ -43,4 +46,13 @@ public class SysAdministrativeAreaDictInfoEntity extends BaseEntity child; + + } diff --git a/play-admin/src/main/java/com/starry/admin/modules/system/service/ISysAdministrativeAreaDictInfoService.java b/play-admin/src/main/java/com/starry/admin/modules/system/service/ISysAdministrativeAreaDictInfoService.java index f7f5959..432e90a 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/system/service/ISysAdministrativeAreaDictInfoService.java +++ b/play-admin/src/main/java/com/starry/admin/modules/system/service/ISysAdministrativeAreaDictInfoService.java @@ -3,6 +3,7 @@ package com.starry.admin.modules.system.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.starry.admin.modules.system.entity.SysAdministrativeAreaDictInfoEntity; +import com.starry.admin.modules.system.vo.AdministrativeAreaQueryReturnVo; import java.util.List; @@ -23,6 +24,16 @@ public interface ISysAdministrativeAreaDictInfoService extends IService + * @author 杭州世平信息科技有限公司-xuhq + * @since 2024/4/10 14:47 + **/ + List selectTree(String level); + /** * 查询所有行政区域字典信息列表 * @@ -45,6 +56,7 @@ public interface ISysAdministrativeAreaDictInfoService extends IService list); /** diff --git a/play-admin/src/main/java/com/starry/admin/modules/system/service/impl/SysAdministrativeAreaDictInfoServiceImpl.java b/play-admin/src/main/java/com/starry/admin/modules/system/service/impl/SysAdministrativeAreaDictInfoServiceImpl.java index 8629be2..a9269a5 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/system/service/impl/SysAdministrativeAreaDictInfoServiceImpl.java +++ b/play-admin/src/main/java/com/starry/admin/modules/system/service/impl/SysAdministrativeAreaDictInfoServiceImpl.java @@ -6,14 +6,19 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.starry.admin.modules.system.mapper.SysAdministrativeAreaDictInfoMapper; import com.starry.admin.modules.system.entity.SysAdministrativeAreaDictInfoEntity; +import com.starry.admin.modules.system.mapper.SysAdministrativeAreaDictInfoMapper; import com.starry.admin.modules.system.service.ISysAdministrativeAreaDictInfoService; +import com.starry.admin.modules.system.vo.AdministrativeAreaQueryReturnVo; +import com.starry.common.utils.ConvertUtil; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * 行政区域字典信息Service业务层处理 @@ -37,12 +42,39 @@ public class SysAdministrativeAreaDictInfoServiceImpl extends ServiceImpl selectTree(String level) { + List result = new ArrayList<>(); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.le(SysAdministrativeAreaDictInfoEntity::getLevel, level); + List list = this.baseMapper.selectList(lambdaQueryWrapper); + Map> collect = list.stream().filter(a -> a != null && a.getPCode() != null).collect(Collectors.groupingBy(SysAdministrativeAreaDictInfoEntity::getPCode)); + return this.assembleTree(collect, collect.get("00")); + } + + /** + * 组装数据 + * + * @param data 数据,key=区域编码,value=区域列表 + * @param list 区域略表 + * @return List + * @author 杭州世平信息科技有限公司-xuhq + * @since 2024/4/10 15:14 + **/ + public List assembleTree(Map> data, List list) { + if (list == null) { + return new ArrayList<>(); + } + List result = ConvertUtil.entityToVoList(list, AdministrativeAreaQueryReturnVo.class); + for (AdministrativeAreaQueryReturnVo entity : result) { + entity.setChild(assembleTree(data, data.get(entity.getCode()))); + } + return result; + } @Override public List selectAll() { - LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper(); - lambdaQueryWrapper.eq(SysAdministrativeAreaDictInfoEntity::getLevel, "1").or().eq(SysAdministrativeAreaDictInfoEntity::getLevel, "2"); - return this.baseMapper.selectList(lambdaQueryWrapper); + return this.baseMapper.selectList(new LambdaQueryWrapper<>()); } /** @@ -54,7 +86,7 @@ public class SysAdministrativeAreaDictInfoServiceImpl extends ServiceImpl selectPlayAdministrativeAreaDictInfoByPage(SysAdministrativeAreaDictInfoEntity playAdministrativeAreaDictInfo) { Page page = new Page<>(1, 10); - return this.baseMapper.selectPage(page, new LambdaQueryWrapper()); + return this.baseMapper.selectPage(page, new LambdaQueryWrapper<>()); } /** diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxClerkController.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxClerkController.java new file mode 100644 index 0000000..2c26a9c --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxClerkController.java @@ -0,0 +1,78 @@ +package com.starry.admin.modules.weichat.controller; + + +import cn.hutool.crypto.SecureUtil; +import com.google.common.annotations.VisibleForTesting; +import com.starry.admin.common.aspect.ClerkUserLogin; +import com.starry.admin.common.conf.ThreadLocalRequestDetail; +import com.starry.admin.common.exception.CustomException; +import com.starry.admin.modules.clear.module.entity.PlayClerkUserInfoEntity; +import com.starry.admin.modules.clear.service.impl.PlayClerkUserInfoServiceImpl; +import com.starry.admin.modules.weichat.entity.PlayClerkUserAddVo; +import com.starry.admin.modules.weichat.entity.PlayClerkUserBindCodeVo; +import com.starry.admin.modules.weichat.entity.PlayClerkUserSendCodeVo; +import com.starry.admin.utils.SecurityUtils; +import com.starry.common.redis.RedisCache; +import com.starry.common.result.R; +import com.starry.common.utils.VerificationCodeUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.concurrent.TimeUnit; + +/** + * @author admin + */ +@Slf4j +@RestController +@RequestMapping("/wx/clerk/") +public class WxClerkController { + + + @Resource + RedisCache redisCache; + + @Resource + private PlayClerkUserInfoServiceImpl playClerkUserInfoService; + + @ClerkUserLogin + @PostMapping("/user/sendCode") + public R sendCode(@VisibleForTesting @RequestBody PlayClerkUserSendCodeVo vo) { + String codeKey = "login_codes:" + SecurityUtils.getTenantId() + "_" + SecureUtil.md5(vo.getAreaCode() + vo.getPhone()); + String code = VerificationCodeUtils.getVerificationCode(4); + redisCache.setCacheObject(codeKey, code, 5L, TimeUnit.MINUTES); + // 发送验证码, + return R.ok(code); + } + + @ClerkUserLogin + @PostMapping("/user/bindCode") + public R bindCode(@VisibleForTesting @RequestBody PlayClerkUserBindCodeVo vo) { + String codeKey = "login_codes:" + SecurityUtils.getTenantId() + "_" + SecureUtil.md5(vo.getAreaCode() + vo.getPhone()); + String code = redisCache.getCacheObject(codeKey); + if (code == null || !code.equals(vo.getCode())) { + throw new CustomException("验证码错误"); + } + redisCache.deleteObject(codeKey); + // 账号绑定操作 + return R.ok("成功"); + } + + @ClerkUserLogin + @PostMapping("/user/add") + public R userAdd(@Valid @RequestBody PlayClerkUserAddVo vo) { + PlayClerkUserInfoEntity entity = ThreadLocalRequestDetail.getClerkUserInfo(); + BeanUtils.copyProperties(vo, entity); + entity.setPlayUserId("0001"); + playClerkUserInfoService.update(entity); + return R.ok("申请成功"); + } + + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxCommonController.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxCommonController.java new file mode 100644 index 0000000..2720ab1 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxCommonController.java @@ -0,0 +1,29 @@ +package com.starry.admin.modules.weichat.controller; + +import com.starry.admin.modules.system.service.ISysAdministrativeAreaDictInfoService; +import com.starry.common.result.R; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +/** + * @author 杭州世平信息科技有限公司-xuhq + * @since 2024/4/10 16:18 + **/ +@Slf4j +@RestController +@RequestMapping("/wx/common/") +public class WxCommonController { + + @Resource + private ISysAdministrativeAreaDictInfoService areaDictInfoService; + + + @GetMapping("area/tree") + public R list() { + return R.ok(areaDictInfoService.selectTree("2")); + } +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxOauthController.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxOauthController.java index 2f43e86..07f1849 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxOauthController.java +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxOauthController.java @@ -1,5 +1,6 @@ package com.starry.admin.modules.weichat.controller; +import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson2.JSONObject; @@ -14,6 +15,7 @@ import com.starry.admin.modules.weichat.entity.WxUserLoginVo; import com.starry.admin.modules.weichat.entity.WxUserQueryAddressVo; import com.starry.admin.modules.weichat.service.WxOauthService; import com.starry.admin.modules.weichat.service.WxTokenService; +import com.starry.admin.utils.SecurityUtils; import com.starry.common.result.R; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.mp.api.WxMpService; @@ -53,7 +55,7 @@ public class WxOauthController { private WxOauthService wxOauthService; - @GetMapping("/getClerkLoginAddress") + @PostMapping("/getClerkLoginAddress") public R getClerkLoginAddress(@RequestBody WxUserQueryAddressVo vo) { // 默认回调地址 String defaultAddress = "http://july.hucs.top/api/wx/oauth2/clerkLoginCallback"; @@ -70,19 +72,32 @@ public class WxOauthController { } - @GetMapping("/clark/login") + @PostMapping("/clark/login") public R clerkLogin(@Valid @RequestBody WxUserLoginVo vo) { String userId = wxOauthService.clarkUserLogin(vo.getCode()); - PlayClerkUserInfoEntity entity = clerkUserInfoService.selectPlayClerkUserInfoById(userId); + PlayClerkUserInfoEntity entity = clerkUserInfoService.selectById(userId); + // 线程塞入租户ID + SecurityUtils.setTenantId(Convert.toStr(entity.getTenantId())); JSONObject jsonObject = JSONObject.from(entity); - String tokenForMiniUser = tokenService.createMiniUserToken(entity.getId()); + String tokenForMiniUser = tokenService.createWxUserToken(entity.getId()); jsonObject.put("tokenValue", TOKEN_PREFIX + tokenForMiniUser); jsonObject.put("tokenName", CLERK_USER_LOGIN_TOKEN); - jsonObject.put("accountRole", "user"); jsonObject.put("loginDate", DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")); return R.ok(jsonObject); } + @PostMapping("/clark/loginById") + public R loginById(@Valid @RequestBody WxUserLoginVo vo) { + PlayClerkUserInfoEntity entity = clerkUserInfoService.selectById(vo.getCode()); + JSONObject jsonObject = JSONObject.from(entity); + String tokenValue = tokenService.createWxUserToken(entity.getId()); + jsonObject.put("tokenValue", tokenValue); + jsonObject.put("tokenName", TOKEN_PREFIX + CLERK_USER_LOGIN_TOKEN); + jsonObject.put("loginDate", DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")); + clerkUserInfoService.updateTokenById(entity.getId(), tokenValue); + return R.ok(jsonObject); + } + @ClerkUserLogin @GetMapping("/clark/logout") public R clerkLogout() { @@ -91,7 +106,7 @@ public class WxOauthController { } - @GetMapping("/getCustomLoginAddress") + @PostMapping("/getCustomLoginAddress") public R getCustomLoginAddress(@RequestBody WxUserQueryAddressVo vo) { // 默认回调地址 String defaultAddress = "http://july.hucs.top/api/wx/oauth2/customLoginCallback"; @@ -108,23 +123,23 @@ public class WxOauthController { } - @GetMapping("/custom/login") + @PostMapping("/custom/login") public R customLogin(@Valid @RequestBody WxUserLoginVo vo) { String userId = wxOauthService.customUserLogin(vo.getCode()); - PlayCustomUserInfoEntity entity = customUserInfoService.selectPlayCustomUserInfoById(userId); + PlayCustomUserInfoEntity entity = customUserInfoService.selectById(userId); JSONObject jsonObject = JSONObject.from(entity); - String tokenForMiniUser = tokenService.createMiniUserToken(entity.getId()); - jsonObject.put("tokenValue", TOKEN_PREFIX + tokenForMiniUser); + String tokenValue = tokenService.createWxUserToken(entity.getId()); + jsonObject.put("tokenValue", TOKEN_PREFIX + tokenValue); jsonObject.put("tokenName", CUSTOM_USER_LOGIN_TOKEN); - jsonObject.put("accountRole", "user"); jsonObject.put("loginDate", DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")); + customUserInfoService.updateTokenById(entity.getId(), tokenValue); return R.ok(jsonObject); } @GetMapping("/custom/logout") @CustomUserLogin - public R customLogout(@Valid @RequestBody WxUserLoginVo vo) { + public R customLogout() { wxOauthService.customUserLogout(ThreadLocalRequestDetail.getCustomUserInfo()); return R.ok("登出成功"); } diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayClerkUserAddVo.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayClerkUserAddVo.java new file mode 100644 index 0000000..c456ead --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayClerkUserAddVo.java @@ -0,0 +1,92 @@ +package com.starry.admin.modules.weichat.entity; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + + +/** + * @author admin + */ +@Data +public class PlayClerkUserAddVo { + + + /** + * 店员昵称 + */ + @NotBlank(message = "昵称不能为空") + private String nickname; + + /** + * 店员等级 + */ + @NotBlank(message = "等级不能为空") + private String levelId; + + /** + * 店员性别(1:男:0:女) + */ + @NotNull(message = "性别不能为空") + private Integer sex; + + /** + * 头像 + */ + @NotBlank(message = "头像不能为空") + private String avatar; + + /** + * 音频 + */ + @NotBlank(message = "音频不能为空") + private String audioFrequency; + + /** + * 星座 + */ + @NotBlank(message = "星座不能为空") + private String constellation; + + /** + * 标签 + */ + private String label; + + /** + * 个性签名 + */ + @NotBlank(message = "签名不能为空") + private String signature; + + /** + * 年龄 + */ + @NotNull(message = "年龄不能为空") + private Long age; + + /** + * 所在国家 + */ + @NotBlank(message = "国家不能为空") + private String country; + + /** + * 所在省份 + */ + @NotBlank(message = "省份不能为空") + private String province; + + /** + * 所在城市 + */ + @NotBlank(message = "城市不能为空") + private String city; + + /** + * 备注 + */ + private String remark; + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayClerkUserBindCodeVo.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayClerkUserBindCodeVo.java new file mode 100644 index 0000000..83767e0 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayClerkUserBindCodeVo.java @@ -0,0 +1,34 @@ +package com.starry.admin.modules.weichat.entity; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; + + +/** + * @author admin + */ +@Data +public class PlayClerkUserBindCodeVo { + + + /** + * 手机号码区号 + */ + @NotBlank(message = "手机号码区号不能为空") + private String areaCode; + + /** + * 手机号码 + */ + @NotBlank(message = "手机号码不能为空") + private String phone; + + /** + * 手机号码 + */ + @NotBlank(message = "验证码不能为空") + private String code; + + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayClerkUserSendCodeVo.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayClerkUserSendCodeVo.java new file mode 100644 index 0000000..d171583 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayClerkUserSendCodeVo.java @@ -0,0 +1,27 @@ +package com.starry.admin.modules.weichat.entity; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; + + +/** + * @author admin + */ +@Data +public class PlayClerkUserSendCodeVo { + + + /** + * 手机号码区号 + */ + @NotBlank(message = "手机号码区号不能为空") + private String areaCode; + + /** + * 手机号码 + */ + @NotBlank(message = "手机号码不能为空") + private String phone; + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/mapper/PlayWxUserInfoMapper.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/mapper/PlayWxUserInfoMapper.java deleted file mode 100644 index e37b74c..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/mapper/PlayWxUserInfoMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.starry.admin.modules.weichat.mapper; - - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.starry.admin.modules.weichat.entity.PlayWxUserInfoEntity; - -/** - * 微信用户Mapper接口 - * - * @author admin - * @since 2024-04-07 - */ -public interface PlayWxUserInfoMapper extends BaseMapper { - - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/Constants.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/service/Constants.java index b70107f..8677df6 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/Constants.java +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/service/Constants.java @@ -88,7 +88,7 @@ public class Constants * 令牌前缀 */ public static final String LOGIN_USER_KEY = "login_user_key"; - public static final String LOGIN_USER_KEY_MINI = "login_user_key_mini"; + public static final String LOGIN_USER_KEY_WX = "login_user_key_wx"; public static final String LOGIN_USER_KEY_COSER = "login_user_key_coser"; /** diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxOauthService.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxOauthService.java index d1faf11..8e61fda 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxOauthService.java +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxOauthService.java @@ -3,7 +3,7 @@ package com.starry.admin.modules.weichat.service; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; -import com.starry.admin.common.exception.CustomException; +import com.starry.admin.common.exception.ServiceException; import com.starry.admin.modules.clear.module.entity.PlayClerkUserInfoEntity; import com.starry.admin.modules.clear.service.IPlayClerkUserInfoService; import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity; @@ -72,8 +72,7 @@ public class WxOauthService { WxOAuth2AccessToken token = getWxOAuth2AccessToken(code); String openId = getOpenId(token); WxOAuth2UserInfo userInfo = getWxOAuth2UserInfo(token); - PlayCustomUserInfoEntity entity = new PlayCustomUserInfoEntity(); - ConvertUtil.entityToVo(userInfo, PlayClerkUserInfoEntity.class); + PlayCustomUserInfoEntity entity = ConvertUtil.entityToVo(userInfo, PlayCustomUserInfoEntity.class); entity.setAvatar(userInfo.getHeadImgUrl()); PlayCustomUserInfoEntity item = customUserInfoService.selectByOpenid(openId); entity.setId(item != null ? item.getId() : IdUtil.fastSimpleUUID()); @@ -92,7 +91,7 @@ public class WxOauthService { **/ public WxOAuth2AccessToken getWxOAuth2AccessToken(String code) { if (StrUtil.isBlankIfStr(code)) { - throw new CustomException("不能为空"); + throw new ServiceException("不能为空"); } synchronized (code.intern()) { try { @@ -113,11 +112,11 @@ public class WxOauthService { **/ public String getOpenId(WxOAuth2AccessToken token) { if (token == null) { - throw new CustomException("获取微信授权异常,WxOAuth2AccessToken不能为空"); + throw new ServiceException("获取微信授权异常,WxOAuth2AccessToken不能为空"); } String openId = token.getOpenId(); if (StrUtil.isBlankIfStr(openId)) { - throw new CustomException("获取微信授权异常,openId不能为空"); + throw new ServiceException("获取微信授权异常,openId不能为空"); } return openId; } @@ -132,7 +131,7 @@ public class WxOauthService { **/ public WxOAuth2UserInfo getWxOAuth2UserInfo(WxOAuth2AccessToken token) { if (token == null) { - throw new CustomException("获取微信授权异常,WxOAuth2AccessToken不能为空"); + throw new ServiceException("获取微信授权异常,WxOAuth2AccessToken不能为空"); } try { return wxMpService.getOAuth2Service().getUserInfo(token, null); diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxTokenService.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxTokenService.java index b23bca0..9b9b72a 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxTokenService.java +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxTokenService.java @@ -22,104 +22,95 @@ import java.util.Objects; @Slf4j @Service public class WxTokenService { - // 令牌自定义标识 + /** + * 令牌自定义标识 + * + * @since 2024/4/10 11:20 + **/ @Value("${token.header}") private String header; - // 令牌秘钥 + /** + * 令牌秘钥 + * + * @since 2024/4/10 11:20 + **/ @Value("${token.secret}") private String secret; - // 令牌有效期(默认30分钟) + /** + * 令牌有效期(默认30分钟) + * + * @since 2024/4/10 11:20 + **/ @Value("${token.expireTime}") private int expireTime; protected static final long MILLIS_SECOND = 1000; - protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND; - private static final Long MILLIS_MINUTE_TEN = 20 * 60 * 1000L; -// -// @Autowired -// private RedisCache redisCache; -// /** -// * 获取用户身份信息 -// * -// * @return 用户信息 -// */ -// public LoginUser getLoginUser(HttpServletRequest request) { -// // 获取请求携带的令牌 -// String token = getToken(request); -// if (StringUtils.isNotEmpty(token)) { -// try { -// Claims claims = parseToken(token); -// // 解析对应的权限以及用户信息 -// String uuid = (String) claims.get(Constants.LOGIN_USER_KEY); -// String userKey = getTokenKey(uuid); -// LoginUser user = redisCache.getCacheObject(userKey); -// return user; -// } catch (Exception e) { -// } -// } -// return null; -// } -// -// -// /** -// * 设置用户身份信息 -// */ -// public void setLoginUser(LoginUser loginUser) { -// if (StringUtils.isNotNull(loginUser) && StringUtils.isNotEmpty(loginUser.getToken())) { -// refreshToken(loginUser); -// } -// } -// -// /** -// * 删除用户身份信息 -// */ -// public void delLoginUser(String token) { -// if (StringUtils.isNotEmpty(token)) { -// String userKey = getTokenKey(token); -// redisCache.deleteObject(userKey); -// } -// } -// -// /** -// * 创建令牌 -// * -// * @param loginUser 用户信息 -// * @return 令牌 -// */ -// public String createToken(LoginUser loginUser) { -// String token = IdUtils.fastUUID(); -// loginUser.setToken(token); -// setUserAgent(loginUser); -// refreshToken(loginUser); -// -// Map claims = new HashMap<>(); -// claims.put(Constants.LOGIN_USER_KEY, token); -// return createToken(claims); -// } - // 小程序端-委托人 - public String createMiniUserToken(String miniUserId) { - if (Objects.isNull(miniUserId)) { + /** + * 根据微信用户id创建token + * + * @param userId 微信用户ID + * @return String token + * @author 杭州世平信息科技有限公司-xuhq + * @since 2024/4/10 11:21 + **/ + public String createWxUserToken(String userId) { + if (Objects.isNull(userId)) { throw new RuntimeException("用户id不能为空"); } - Map claims = new HashMap<>(); - claims.put(Constants.LOGIN_USER_KEY_MINI, miniUserId); + Map claims = new HashMap<>(16); + claims.put(Constants.LOGIN_USER_KEY_WX, userId); return Jwts.builder().setClaims(claims).setExpiration(DateUtil.offsetMinute(new Date(), expireTime)).signWith(SignatureAlgorithm.HS512, secret).compact(); } - // 小程序端-委托人 - public String getMiniUserIdByToken(String token) { + + /** + * 根据token获取微信用户ID + * + * @param token token + * @return String 微信用户ID + * @author 杭州世平信息科技有限公司-xuhq + * @since 2024/4/10 11:24 + **/ + public String getWxUserIdByToken(String token) { if (StringUtils.isEmpty(token)) { throw new RuntimeException("token不能为空"); } Claims claims = parseToken(token); - return claims.get(Constants.LOGIN_USER_KEY_MINI).toString(); + return claims.get(Constants.LOGIN_USER_KEY_WX).toString(); } + + /** + * 根据token获取微信用户TenantId + * + * @param token token + * @param identity 用户身份(0:租户,1:顾客) + * @return String 微信用户租户ID + * @author 杭州世平信息科技有限公司-xuhq + * @since 2024/4/10 11:24 + **/ + public String getWxUserTenantIdByToken(String token, String identity) { + if (StringUtils.isEmpty(token)) { + throw new RuntimeException("token不能为空"); + } + Claims claims = parseToken(token); + return claims.get(Constants.LOGIN_USER_KEY_WX).toString(); + } + + + // public String getTenantId(String token) { + // if (StringUtils.isEmpty(token)) { + // throw new RuntimeException("token不能为空"); + // } + // Map claims = new HashMap<>(); + // claims.put(Constants.LOGIN_USER_KEY_MINI, miniUserId); + // return Jwts.builder().setClaims(claims).setExpiration(DateUtil.offsetMinute(new Date(), expireTime)).signWith(SignatureAlgorithm.HS512, secret).compact(); + // } // // // 小程序端-coser // public String createMiniCoserToken(Long miniCoserId) { diff --git a/play-admin/src/main/resources/application-test.yml b/play-admin/src/main/resources/application-test.yml index 31bf317..ce27f18 100644 --- a/play-admin/src/main/resources/application-test.yml +++ b/play-admin/src/main/resources/application-test.yml @@ -92,8 +92,8 @@ token: header: Authorization # 令牌密钥 secret: abcdefghijklmnopqrstuvwxyz - # 令牌有效期(默认30分钟) - expireTime: 43200 + # 令牌有效期,单位分钟(默认30分钟) + expireTime: 129600 # xl自定义配置 xl: diff --git a/play-common/src/main/java/com/starry/common/config/RedisConfig.java b/play-common/src/main/java/com/starry/common/config/RedisConfig.java index ad33157..dbd534f 100644 --- a/play-common/src/main/java/com/starry/common/config/RedisConfig.java +++ b/play-common/src/main/java/com/starry/common/config/RedisConfig.java @@ -16,16 +16,13 @@ import org.springframework.data.redis.serializer.StringRedisSerializer; public class RedisConfig { @Bean - public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) { - RedisTemplate template = new RedisTemplate<>(); + public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) { + RedisTemplate template = new RedisTemplate<>(); template.setConnectionFactory(connectionFactory); - - FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class); - + FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer<>(Object.class); // 使用StringRedisSerializer来序列化和反序列化redis的key值 template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(serializer); - // Hash的key也采用StringRedisSerializer的序列化方式 template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(serializer); diff --git a/play-common/src/main/java/com/starry/common/redis/RedisCache.java b/play-common/src/main/java/com/starry/common/redis/RedisCache.java index 955f76a..bbddcf6 100644 --- a/play-common/src/main/java/com/starry/common/redis/RedisCache.java +++ b/play-common/src/main/java/com/starry/common/redis/RedisCache.java @@ -16,7 +16,7 @@ import java.util.concurrent.TimeUnit; public class RedisCache { @Resource - public RedisTemplate redisTemplate; + public RedisTemplate redisTemplate; /** * 获得缓存的基本对象。 @@ -25,8 +25,8 @@ public class RedisCache { * @return 缓存键值对应的数据 */ public T getCacheObject(final String key) { - ValueOperations operations = redisTemplate.opsForValue(); - return operations.get(key); + ValueOperations operations = redisTemplate.opsForValue(); + return (T) operations.get(key); } /** diff --git a/play-common/src/main/java/com/starry/common/utils/VerificationCodeUtils.java b/play-common/src/main/java/com/starry/common/utils/VerificationCodeUtils.java new file mode 100644 index 0000000..9a54ba4 --- /dev/null +++ b/play-common/src/main/java/com/starry/common/utils/VerificationCodeUtils.java @@ -0,0 +1,16 @@ +package com.starry.common.utils; + +/** + * @author 杭州世平信息科技有限公司-xuhq + * @since 2024/4/9 13:53 + **/ +public class VerificationCodeUtils { + + public static String getVerificationCode(int codeLength) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < codeLength; i++) { + sb.append((int) (Math.random() * 10)); + } + return sb.toString(); + } +}