From d4dce97afedee91c246c2851661069e558289c6a Mon Sep 17 00:00:00 2001 From: callmeyan Date: Mon, 21 Nov 2022 10:05:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=99=BB=E5=BD=95=E6=93=8D?= =?UTF-8?q?=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/me/xiaoyan/point/api/pojo/Point.java | 12 +++---- .../me/xiaoyan/point/api/pojo/SignRecord.java | 2 +- .../xiaoyan/point/api/pojo/dto/ApiResult.java | 9 +++++ .../point/api/service/PointRecordService.java | 8 +++++ .../point/api/service/PointService.java | 1 + .../service/impl/PointRecordServiceImpl.java | 34 +++++++++++++++++++ .../api/service/impl/PointServiceImpl.java | 1 + .../api/service/impl/UserInfoServiceImpl.java | 24 +++++++++---- .../point/api/util/WechatDecryptDataUtil.java | 7 ++++ api/src/main/resources/docs/process/login.svg | 2 +- 10 files changed, 84 insertions(+), 16 deletions(-) diff --git a/api/src/main/java/me/xiaoyan/point/api/pojo/Point.java b/api/src/main/java/me/xiaoyan/point/api/pojo/Point.java index deb6759..b3f4ddd 100644 --- a/api/src/main/java/me/xiaoyan/point/api/pojo/Point.java +++ b/api/src/main/java/me/xiaoyan/point/api/pojo/Point.java @@ -1,7 +1,5 @@ package me.xiaoyan.point.api.pojo; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; import lombok.Builder; import lombok.Data; import lombok.experimental.Accessors; @@ -13,9 +11,9 @@ import java.io.Serializable; @Builder public class Point implements Serializable { private Integer uid; - private Integer total_point; - private Integer valid_point; - private Integer expire_point; - private Integer expire_time; - private Integer update_time; + private Integer totalPoint; + private Integer validPoint; + private Integer expirePoint; + private Integer expireTime; + private Integer updateTime; } diff --git a/api/src/main/java/me/xiaoyan/point/api/pojo/SignRecord.java b/api/src/main/java/me/xiaoyan/point/api/pojo/SignRecord.java index a93284c..f27058c 100644 --- a/api/src/main/java/me/xiaoyan/point/api/pojo/SignRecord.java +++ b/api/src/main/java/me/xiaoyan/point/api/pojo/SignRecord.java @@ -18,5 +18,5 @@ public class SignRecord implements Serializable { private Integer uid; private Integer point; private String ip; - private Date create_time; + private Date createTime; } diff --git a/api/src/main/java/me/xiaoyan/point/api/pojo/dto/ApiResult.java b/api/src/main/java/me/xiaoyan/point/api/pojo/dto/ApiResult.java index 3454be6..9799450 100644 --- a/api/src/main/java/me/xiaoyan/point/api/pojo/dto/ApiResult.java +++ b/api/src/main/java/me/xiaoyan/point/api/pojo/dto/ApiResult.java @@ -15,8 +15,17 @@ import java.io.Serializable; @AllArgsConstructor @NoArgsConstructor public class ApiResult implements Serializable { + /** + * 响应码,0为正常,其他均不正确 + */ private int code; + /** + * 响应消息,code不为0时的具体错误消息 + */ private String message; + /** + * 具体的响应数据 + */ private Object data; private long traceId; diff --git a/api/src/main/java/me/xiaoyan/point/api/service/PointRecordService.java b/api/src/main/java/me/xiaoyan/point/api/service/PointRecordService.java index 16c25ee..3d504a6 100644 --- a/api/src/main/java/me/xiaoyan/point/api/service/PointRecordService.java +++ b/api/src/main/java/me/xiaoyan/point/api/service/PointRecordService.java @@ -5,4 +5,12 @@ import me.xiaoyan.point.api.pojo.PointRecord; import me.xiaoyan.point.api.pojo.UserInfo; public interface PointRecordService extends IService { + /** + * 记录积分的变化 + * @param uid + * @param point 积分变化值,正数为增加积分,负数为减少积分 + * @param reason + * @return + */ + public PointRecord record(Integer uid,Integer point,String reason); } diff --git a/api/src/main/java/me/xiaoyan/point/api/service/PointService.java b/api/src/main/java/me/xiaoyan/point/api/service/PointService.java index 7128169..f5f0a8d 100644 --- a/api/src/main/java/me/xiaoyan/point/api/service/PointService.java +++ b/api/src/main/java/me/xiaoyan/point/api/service/PointService.java @@ -2,6 +2,7 @@ package me.xiaoyan.point.api.service; import com.baomidou.mybatisplus.extension.service.IService; import me.xiaoyan.point.api.pojo.Point; +import me.xiaoyan.point.api.pojo.PointRecord; import me.xiaoyan.point.api.pojo.UserInfo; public interface PointService extends IService { diff --git a/api/src/main/java/me/xiaoyan/point/api/service/impl/PointRecordServiceImpl.java b/api/src/main/java/me/xiaoyan/point/api/service/impl/PointRecordServiceImpl.java index 0d4009b..ef07714 100644 --- a/api/src/main/java/me/xiaoyan/point/api/service/impl/PointRecordServiceImpl.java +++ b/api/src/main/java/me/xiaoyan/point/api/service/impl/PointRecordServiceImpl.java @@ -1,10 +1,44 @@ package me.xiaoyan.point.api.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import me.xiaoyan.point.api.error.BizException; import me.xiaoyan.point.api.mapper.PointRecordMapper; +import me.xiaoyan.point.api.pojo.Point; import me.xiaoyan.point.api.pojo.PointRecord; import me.xiaoyan.point.api.service.PointRecordService; +import me.xiaoyan.point.api.service.PointService; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; public class PointRecordServiceImpl extends ServiceImpl implements PointRecordService { + @Resource + private PointService pointService; + @Transactional + @Override + public PointRecord record(Integer uid, Integer point, String reason) { + if(point == 0 ){ + throw BizException.create("积分值没有变化"); + } + // 查询用户的积分信息 + final Point pointInfo = pointService.getById(uid); + if(point < 0 && pointInfo.getTotalPoint() < Math.abs(point)){ + throw BizException.create("积分不足"); + } + + final PointRecord record = PointRecord.builder() + .uid(uid) + .point(point) + .reason(reason) + .currentTotalPoint(pointInfo.getTotalPoint()) + .build(); + pointInfo.setTotalPoint( + pointInfo.getTotalPoint() + point + ); + // 更新 + pointService.updateById(pointInfo); + this.save(record); + return record; + } } diff --git a/api/src/main/java/me/xiaoyan/point/api/service/impl/PointServiceImpl.java b/api/src/main/java/me/xiaoyan/point/api/service/impl/PointServiceImpl.java index 59874db..acfaf41 100644 --- a/api/src/main/java/me/xiaoyan/point/api/service/impl/PointServiceImpl.java +++ b/api/src/main/java/me/xiaoyan/point/api/service/impl/PointServiceImpl.java @@ -7,4 +7,5 @@ import me.xiaoyan.point.api.service.PointService; public class PointServiceImpl extends ServiceImpl implements PointService { + } diff --git a/api/src/main/java/me/xiaoyan/point/api/service/impl/UserInfoServiceImpl.java b/api/src/main/java/me/xiaoyan/point/api/service/impl/UserInfoServiceImpl.java index fe59b0e..8a54dab 100644 --- a/api/src/main/java/me/xiaoyan/point/api/service/impl/UserInfoServiceImpl.java +++ b/api/src/main/java/me/xiaoyan/point/api/service/impl/UserInfoServiceImpl.java @@ -2,6 +2,7 @@ package me.xiaoyan.point.api.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.gson.Gson; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import me.xiaoyan.point.api.util.WechatDecryptDataUtil; @@ -53,12 +54,17 @@ public class UserInfoServiceImpl extends ServiceImpl // 新增积分信息 Point point = Point.builder() .uid(info.getId()) - .expire_point(0) - .total_point(firstLoginPoint) - .valid_point(firstLoginPoint) + .expirePoint(0) + .totalPoint(firstLoginPoint) + .validPoint(firstLoginPoint) .build(); pointService.save(point); // 新增积分记录 + pointRecordService.record( + info.getId(), + firstLoginPoint, + "第一次登录赠送" + ); } @Transactional @@ -91,7 +97,10 @@ public class UserInfoServiceImpl extends ServiceImpl } } - // 使用code换取openId + /** + * https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html + * 使用code换取openId + */ @SneakyThrows private CodeSessionData getOpenIdByCode(String code) { String url = CODE2SESSION + "?appid=" + app_id + "&secret=" + app_secret @@ -99,11 +108,12 @@ public class UserInfoServiceImpl extends ServiceImpl try (CloseableHttpClient client = HttpClients.createDefault()) { HttpGet get = new HttpGet(url); final CloseableHttpResponse response = (CloseableHttpResponse) client.execute(get); + // 获取到session的json数据 final String content = EntityUtils.toString(response.getEntity()); - ObjectMapper mapper = new ObjectMapper(); - final CodeSessionData data = mapper.convertValue(content, CodeSessionData.class); + Gson gson = new Gson(); + final CodeSessionData data = gson.fromJson(content, CodeSessionData.class); if (data.getErrcode() != 0) { - throw BizException.create(1101, "换取code失败(" + data.getErrmsg() + ")"); + throw BizException.create(1101, "换取session失败(" + data.getErrmsg() + ")"); } return data; } diff --git a/api/src/main/java/me/xiaoyan/point/api/util/WechatDecryptDataUtil.java b/api/src/main/java/me/xiaoyan/point/api/util/WechatDecryptDataUtil.java index 0614844..080d53f 100644 --- a/api/src/main/java/me/xiaoyan/point/api/util/WechatDecryptDataUtil.java +++ b/api/src/main/java/me/xiaoyan/point/api/util/WechatDecryptDataUtil.java @@ -18,6 +18,13 @@ import java.util.Base64; */ public class WechatDecryptDataUtil { + /** + * + * @param encryptDataB64 加密的数据 从wx.getUserProfile而来 + * @param sessionKeyB64 解密密钥,从code2Session而来 + * @param ivB64 + * @return + */ public static WechatUserInfo decryptData(String encryptDataB64, String sessionKeyB64, String ivB64) { String result = new String( decryptOfDiyIV( diff --git a/api/src/main/resources/docs/process/login.svg b/api/src/main/resources/docs/process/login.svg index 9162b18..3733c33 100644 --- a/api/src/main/resources/docs/process/login.svg +++ b/api/src/main/resources/docs/process/login.svg @@ -1,4 +1,4 @@ -
登录
登录
登录流程说明
登录流程说明
小程序执行wx.login()
小程序执行wx.login()
授权失败
授权失败
授权成功,
获取code
授权成功, 获取code
是否授权
是否授权
获取用户信息失败
获取用户信息失败
获取用户信息成功
获取用户信息成功
1、使用code到微信服务器获取用户的基本信息(openid/unionid)
1、使用code到微信服务器获取用户的基本信息(openid/unionid)
不存在
不存在
已经存在用户
已经存在用户
2、判断用户信息是否已经存在
2、判断用户信息是否已经存在
失败
失败
成功
成功
3、新增用户信息
新增积分信息
新增积分记录信息
3、新增用户信息...
完成登录
完成登录
Viewer does not support full SVG 1.1
\ No newline at end of file +
登录
登录
登录流程说明
登录流程说明
小程序执行wx.login获取code.
然后执行wx.getUserProfile
小程序执行wx.login获取code....
授权失败
授权失败
授权成功,
获取code
授权成功, 获取code
是否授权
是否授权
获取用户信息失败
获取用户信息失败
获取用户信息成功
获取用户信息成功
1、使用code到微信服务器获取用户的基本信息(openid/unionid),并解密用户数据
1、使用code到微信服务器获取用户的基本信息(openid/unionid),并解密用户数据
不存在
不存在
已经存在用户
已经存在用户
2、判断用户信息是否已经存在
2、判断用户信息是否已经存在
失败
失败
成功
成功
3、新增用户信息
新增积分信息
新增积分记录信息
3、新增用户信息...
完成登录
完成登录
Viewer does not support full SVG 1.1
\ No newline at end of file