From ccf1aeb7afae10b86eca4b014ef3823ed19f7ccd Mon Sep 17 00:00:00 2001 From: xuxin <840198532@qq.com> Date: Tue, 18 Nov 2025 15:31:50 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8B=8D=E7=A9=B9=E5=A4=96=E5=8D=96--=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E7=99=BB=E5=BD=95=E5=8A=9F=E8=83=BD=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?&=E7=94=A8=E6=88=B7=E7=AB=AF=E7=99=BB=E5=BD=95=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sky/config/WebMvcConfiguration.java | 7 ++ .../sky/controller/user/UserController.java | 47 +++++++++++++ .../interceptor/JwtTokenAdminInterceptor.java | 2 +- .../interceptor/JwtTokenUserInterceptor.java | 66 +++++++++++++++++++ .../main/java/com/sky/mapper/UserMapper.java | 21 ++++++ .../java/com/sky/service/UserService.java | 13 ++++ .../com/sky/service/impl/UserServiceImpl.java | 64 ++++++++++++++++++ .../src/main/resources/application-dev.yml | 5 +- sky-server/src/main/resources/application.yml | 7 +- 9 files changed, 229 insertions(+), 3 deletions(-) create mode 100644 sky-server/src/main/java/com/sky/controller/user/UserController.java create mode 100644 sky-server/src/main/java/com/sky/interceptor/JwtTokenUserInterceptor.java create mode 100644 sky-server/src/main/java/com/sky/mapper/UserMapper.java create mode 100644 sky-server/src/main/java/com/sky/service/UserService.java create mode 100644 sky-server/src/main/java/com/sky/service/impl/UserServiceImpl.java diff --git a/sky-server/src/main/java/com/sky/config/WebMvcConfiguration.java b/sky-server/src/main/java/com/sky/config/WebMvcConfiguration.java index 6c64dee..5ae6be0 100644 --- a/sky-server/src/main/java/com/sky/config/WebMvcConfiguration.java +++ b/sky-server/src/main/java/com/sky/config/WebMvcConfiguration.java @@ -1,6 +1,7 @@ package com.sky.config; import com.sky.interceptor.JwtTokenAdminInterceptor; +import com.sky.interceptor.JwtTokenUserInterceptor; import com.sky.json.JacksonObjectMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -30,6 +31,8 @@ public class WebMvcConfiguration extends WebMvcConfigurationSupport { @Autowired private JwtTokenAdminInterceptor jwtTokenAdminInterceptor; + @Autowired + private JwtTokenUserInterceptor jwtTokenUserInterceptor; /** * 注册自定义拦截器 @@ -41,6 +44,10 @@ public class WebMvcConfiguration extends WebMvcConfigurationSupport { registry.addInterceptor(jwtTokenAdminInterceptor) .addPathPatterns("/admin/**") .excludePathPatterns("/admin/employee/login"); + registry.addInterceptor(jwtTokenUserInterceptor) + .addPathPatterns("/user/**") + .excludePathPatterns("/user/user/login") + .excludePathPatterns("/user/shop/status"); } /** diff --git a/sky-server/src/main/java/com/sky/controller/user/UserController.java b/sky-server/src/main/java/com/sky/controller/user/UserController.java new file mode 100644 index 0000000..af65ab2 --- /dev/null +++ b/sky-server/src/main/java/com/sky/controller/user/UserController.java @@ -0,0 +1,47 @@ +package com.sky.controller.user; + +import com.sky.constant.JwtClaimsConstant; +import com.sky.dto.UserLoginDTO; +import com.sky.entity.User; +import com.sky.properties.JwtProperties; +import com.sky.result.Result; +import com.sky.service.UserService; +import com.sky.utils.JwtUtil; +import com.sky.vo.UserLoginVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; + +@RestController +@Slf4j +@RequestMapping("/user/user") +@Api(tags = "C端用户相关接口") +public class UserController { + + @Autowired + private UserService userService; + @Autowired + private JwtProperties jwtProperties; + + @PostMapping("/login") + @ApiOperation("微信用户登录") + public Result wxLogin(@RequestBody UserLoginDTO userLoginDTO){ + log.info("微信用户登录:{}",userLoginDTO); + //调用业务层微信登录:调用官方的接口获取openID + User user = userService.wxLogin(userLoginDTO); + //生成jwt令牌的VO对象 + HashMap claims = new HashMap<>(); + claims.put(JwtClaimsConstant.USER_ID, user.getId()); + String jwtToken = JwtUtil.createJWT(jwtProperties.getUserSecretKey(), jwtProperties.getUserTtl(), claims); + + UserLoginVO userLoginVO = UserLoginVO.builder().id(user.getId()).openid(user.getOpenid()).token(jwtToken).build(); + return Result.success(userLoginVO); + } +} diff --git a/sky-server/src/main/java/com/sky/interceptor/JwtTokenAdminInterceptor.java b/sky-server/src/main/java/com/sky/interceptor/JwtTokenAdminInterceptor.java index c112df7..c1f76de 100644 --- a/sky-server/src/main/java/com/sky/interceptor/JwtTokenAdminInterceptor.java +++ b/sky-server/src/main/java/com/sky/interceptor/JwtTokenAdminInterceptor.java @@ -14,7 +14,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** - * jwt令牌校验的拦截器 + * jwt令牌校验的拦截器--管理端 */ @Component @Slf4j diff --git a/sky-server/src/main/java/com/sky/interceptor/JwtTokenUserInterceptor.java b/sky-server/src/main/java/com/sky/interceptor/JwtTokenUserInterceptor.java new file mode 100644 index 0000000..046be49 --- /dev/null +++ b/sky-server/src/main/java/com/sky/interceptor/JwtTokenUserInterceptor.java @@ -0,0 +1,66 @@ +package com.sky.interceptor; + +import com.sky.constant.JwtClaimsConstant; +import com.sky.context.BaseContext; +import com.sky.properties.JwtProperties; +import com.sky.utils.JwtUtil; +import io.jsonwebtoken.Claims; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * jwt令牌校验的拦截器--用户端 + */ +@Component +@Slf4j +public class JwtTokenUserInterceptor implements HandlerInterceptor { + + @Autowired + private JwtProperties jwtProperties; + + /** + * 校验jwt + * + * @param request + * @param response + * @param handler + * @return + * @throws Exception + */ + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + //判断当前拦截到的是Controller的方法还是其他资源 + if (!(handler instanceof HandlerMethod)) { + //当前拦截到的不是动态方法,直接放行 + return true; + } + + //1、从请求头中获取令牌 + String token = request.getHeader(jwtProperties.getUserTokenName()); + + //2、校验令牌 + try { + log.info("jwt校验:{}", token); + Claims claims = JwtUtil.parseJWT(jwtProperties.getUserSecretKey(), token); + Long userId = Long.valueOf(claims.get(JwtClaimsConstant.USER_ID).toString()); + log.info("当前用户id:", userId); + + log.info("登录校验拦截器所处的线程id:{}",Thread.currentThread().getId()); + + //往ThreadLocal中保存当前登录的员工ID + BaseContext.setCurrentId(userId); + + //3、通过,放行 + return true; + } catch (Exception ex) { + //4、不通过,响应401状态码 + response.setStatus(401); + return false; + } + } +} diff --git a/sky-server/src/main/java/com/sky/mapper/UserMapper.java b/sky-server/src/main/java/com/sky/mapper/UserMapper.java new file mode 100644 index 0000000..99b5c93 --- /dev/null +++ b/sky-server/src/main/java/com/sky/mapper/UserMapper.java @@ -0,0 +1,21 @@ +package com.sky.mapper; + +import com.sky.entity.User; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Options; +import org.apache.ibatis.annotations.Select; + +/* +操作User表 + */ +@Mapper +public interface UserMapper { + @Select("select * from user where openid = #{openId}") + User getByOpenId(String openId); + + @Insert("insert into user (openid, name, phone, sex, id_number, avatar, create_time)" + + "values (#{openid},#{name},#{phone},#{sex},#{idNumber},#{avatar},#{createTime})") + @Options(useGeneratedKeys = true,keyProperty = "id")//主键回显,得到新用户的主键id + void insert(User user); +} diff --git a/sky-server/src/main/java/com/sky/service/UserService.java b/sky-server/src/main/java/com/sky/service/UserService.java new file mode 100644 index 0000000..0c3f22d --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/UserService.java @@ -0,0 +1,13 @@ +package com.sky.service; + +import com.sky.dto.UserLoginDTO; +import com.sky.entity.User; + +public interface UserService { + /** + * 微信登录功能 + * @param userLoginDTO + * @return + */ + User wxLogin(UserLoginDTO userLoginDTO); +} diff --git a/sky-server/src/main/java/com/sky/service/impl/UserServiceImpl.java b/sky-server/src/main/java/com/sky/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..aae3294 --- /dev/null +++ b/sky-server/src/main/java/com/sky/service/impl/UserServiceImpl.java @@ -0,0 +1,64 @@ +package com.sky.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.sky.constant.MessageConstant; +import com.sky.dto.UserLoginDTO; +import com.sky.entity.User; +import com.sky.exception.LoginFailedException; +import com.sky.mapper.UserMapper; +import com.sky.properties.WeChatProperties; +import com.sky.service.UserService; +import com.sky.utils.HttpClientUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.Map; + +@Service +public class UserServiceImpl implements UserService { + + @Autowired + private WeChatProperties weChatProperties; + + @Autowired + private UserMapper userMapper; + /** + * 微信登录功能 + * @param userLoginDTO + * @return + */ + @Override + public User wxLogin(UserLoginDTO userLoginDTO) { + //1.调用微信接口服务,获取微信用户唯一标识openID + String openId = getOpenId(userLoginDTO); + //2.判断openID是否为空 + if (openId == null) { + throw new LoginFailedException(MessageConstant.LOGIN_FAILED); + } + //3.判断当前用户是否是新用户 + User user = userMapper.getByOpenId(openId); + //4.如果是新用户(数据库中查询不到数据),自动完成注册 + if (user == null) { + user = User.builder().openid(openId).createTime(LocalDateTime.now()).build(); + userMapper.insert(user); + } + //5.返回登录对象User + return user; + } + + //使用httpclient调用微信接口服务 + private String getOpenId(UserLoginDTO userLoginDTO) { + Map map = new HashMap<>(); + map.put("appid",weChatProperties.getAppid()); + map.put("secret",weChatProperties.getSecret()); + map.put("js_code", userLoginDTO.getCode()); + map.put("grant_type"," authorization_code"); + String json = HttpClientUtil.doGet("https://api.weixin.qq.com/sns/jscode2session", map); + JSONObject jsonObject = JSON.parseObject(json); + String openid = jsonObject.getString("openid"); + return openid; + } +} diff --git a/sky-server/src/main/resources/application-dev.yml b/sky-server/src/main/resources/application-dev.yml index 495ea01..03bbafd 100644 --- a/sky-server/src/main/resources/application-dev.yml +++ b/sky-server/src/main/resources/application-dev.yml @@ -14,4 +14,7 @@ sky: host: localhost port: 6379 password: 123456 - database: 10 #不配置的话,默认是0号数据库(redis一共有0~15,16个数据库) \ No newline at end of file + database: 10 #不配置的话,默认是0号数据库(redis一共有0~15,16个数据库) + wechat: + appid: wx3a8ed8d8e9c9552a + secret: 8ada060abc5326be3a446a75df4c77b3 \ No newline at end of file diff --git a/sky-server/src/main/resources/application.yml b/sky-server/src/main/resources/application.yml index dcfae8a..599f332 100644 --- a/sky-server/src/main/resources/application.yml +++ b/sky-server/src/main/resources/application.yml @@ -42,8 +42,13 @@ sky: admin-ttl: 72000000 # 设置前端传递过来的令牌名称 admin-token-name: token + user-secret-key: inmind + user-ttl: 72000000 + user-token-name: authentication alioss: endpoint: ${sky.alioss.endpoint} bucket-name: ${sky.alioss.bucket-name} region: ${sky.alioss.region} - + wechat: + appid: ${sky.wechat.appid} + secret: ${sky.wechat.secret}