From 7eba4246616890ffe9c06b8f4089f18e5a89d855 Mon Sep 17 00:00:00 2001 From: callmeyan Date: Mon, 21 Nov 2022 14:13:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E7=94=A8=E6=88=B7=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/pom.xml | 12 ++ .../point/api/config/ApplicationConfig.java | 22 ++++ .../point/api/config/MybatisPlusConfig.java | 1 + .../xiaoyan/point/api/config/RedisConfig.java | 104 ++++++++++++++++++ .../api/config/SwaggerConfiguration.java | 2 +- .../point/api/controller/PointController.java | 23 ++++ .../point/api/controller/SignController.java | 18 +++ .../api/controller/UserinfoController.java | 45 ++++++++ .../api/controller/WechatController.java | 29 ----- .../java/me/xiaoyan/point/api/pojo/Point.java | 9 +- .../xiaoyan/point/api/pojo/PointRecord.java | 4 + .../me/xiaoyan/point/api/pojo/SignRecord.java | 4 + .../me/xiaoyan/point/api/pojo/UserInfo.java | 7 ++ .../xiaoyan/point/api/pojo/vo/PageParam.java | 22 ++++ .../xiaoyan/point/api/pojo/vo/SignResult.java | 11 ++ .../point/api/pojo/vo/UserLoginData.java | 5 + .../point/api/service/PointRecordService.java | 8 ++ .../point/api/service/UserInfoService.java | 2 + .../service/impl/PointRecordServiceImpl.java | 20 ++++ .../api/service/impl/UserInfoServiceImpl.java | 26 ++++- api/src/main/resources/application.yml | 21 +++- .../me/xiaoyan/point/api/WechatTests.java | 19 ++-- 22 files changed, 372 insertions(+), 42 deletions(-) create mode 100644 api/src/main/java/me/xiaoyan/point/api/config/ApplicationConfig.java create mode 100644 api/src/main/java/me/xiaoyan/point/api/config/RedisConfig.java create mode 100644 api/src/main/java/me/xiaoyan/point/api/controller/PointController.java create mode 100644 api/src/main/java/me/xiaoyan/point/api/controller/SignController.java create mode 100644 api/src/main/java/me/xiaoyan/point/api/controller/UserinfoController.java delete mode 100644 api/src/main/java/me/xiaoyan/point/api/controller/WechatController.java create mode 100644 api/src/main/java/me/xiaoyan/point/api/pojo/vo/PageParam.java create mode 100644 api/src/main/java/me/xiaoyan/point/api/pojo/vo/SignResult.java diff --git a/api/pom.xml b/api/pom.xml index abcbebe..bb08630 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -82,6 +82,18 @@ bcprov-jdk15on 1.57 + + cn.dev33 + sa-token-spring-boot-starter + 1.33.0 + + + + cn.dev33 + sa-token-dao-redis-jackson + 1.33.0 + + diff --git a/api/src/main/java/me/xiaoyan/point/api/config/ApplicationConfig.java b/api/src/main/java/me/xiaoyan/point/api/config/ApplicationConfig.java new file mode 100644 index 0000000..890d5aa --- /dev/null +++ b/api/src/main/java/me/xiaoyan/point/api/config/ApplicationConfig.java @@ -0,0 +1,22 @@ +package me.xiaoyan.point.api.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class ApplicationConfig implements WebMvcConfigurer { + + // 跨域 目前小程序不需要,暂时不用考虑 +// @Override +// public void addCorsMappings(CorsRegistry registry) { +// registry.addMapping("/**").allowedOrigins("*"); +// } + + + @Override + public void addInterceptors(InterceptorRegistry registry) { + + } +} diff --git a/api/src/main/java/me/xiaoyan/point/api/config/MybatisPlusConfig.java b/api/src/main/java/me/xiaoyan/point/api/config/MybatisPlusConfig.java index a057b41..82412ff 100644 --- a/api/src/main/java/me/xiaoyan/point/api/config/MybatisPlusConfig.java +++ b/api/src/main/java/me/xiaoyan/point/api/config/MybatisPlusConfig.java @@ -10,6 +10,7 @@ public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor paginationInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + // 添加分页插件 interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor; } diff --git a/api/src/main/java/me/xiaoyan/point/api/config/RedisConfig.java b/api/src/main/java/me/xiaoyan/point/api/config/RedisConfig.java new file mode 100644 index 0000000..a029158 --- /dev/null +++ b/api/src/main/java/me/xiaoyan/point/api/config/RedisConfig.java @@ -0,0 +1,104 @@ +package me.xiaoyan.point.api.config; + + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.*; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +//redis配置类 +@Configuration +public class RedisConfig { + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory factory) { + + RedisTemplate template = new RedisTemplate<>(); + // 配置连接工厂 + template.setConnectionFactory(factory); + + //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式) + Jackson2JsonRedisSerializer jackson = new Jackson2JsonRedisSerializer(Object.class); + + ObjectMapper om = new ObjectMapper(); + // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public + om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常 + //om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL); + jackson.setObjectMapper(om); + + // 值采用json序列化 + template.setValueSerializer(jackson); + //使用StringRedisSerializer来序列化和反序列化redis的key值 + template.setKeySerializer(new StringRedisSerializer()); + + // 设置hash key 和value序列化模式 + template.setHashKeySerializer(new StringRedisSerializer()); + template.setHashValueSerializer(jackson); + template.afterPropertiesSet(); + + return template; + } + + /** + * 对hash类型的数据操作 + * + * @param redisTemplate + * @return + */ + @Bean + public HashOperations hashOperations(RedisTemplate redisTemplate) { + return redisTemplate.opsForHash(); + } + + /** + * 对redis字符串类型数据操作 + * + * @param redisTemplate + * @return + */ + @Bean + public ValueOperations valueOperations(RedisTemplate redisTemplate) { + return redisTemplate.opsForValue(); + } + + /** + * 对链表类型的数据操作 + * + * @param redisTemplate + * @return + */ + @Bean + public ListOperations listOperations(RedisTemplate redisTemplate) { + return redisTemplate.opsForList(); + } + + /** + * 对无序集合类型的数据操作 + * + * @param redisTemplate + * @return + */ + @Bean + public SetOperations setOperations(RedisTemplate redisTemplate) { + return redisTemplate.opsForSet(); + } + + /** + * 对有序集合类型的数据操作 + * + * @param redisTemplate + * @return + */ + @Bean + public ZSetOperations zSetOperations(RedisTemplate redisTemplate) { + return redisTemplate.opsForZSet(); + } + +} \ No newline at end of file diff --git a/api/src/main/java/me/xiaoyan/point/api/config/SwaggerConfiguration.java b/api/src/main/java/me/xiaoyan/point/api/config/SwaggerConfiguration.java index 861bf8b..b9e4b9a 100644 --- a/api/src/main/java/me/xiaoyan/point/api/config/SwaggerConfiguration.java +++ b/api/src/main/java/me/xiaoyan/point/api/config/SwaggerConfiguration.java @@ -27,7 +27,7 @@ public class SwaggerConfiguration { // 创建api文档信息 @Bean public Docket createRestApi() { - return new Docket(DocumentationType.SWAGGER_2) + return new Docket(DocumentationType.OAS_30) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("me.xiaoyan.point.api.controller")) diff --git a/api/src/main/java/me/xiaoyan/point/api/controller/PointController.java b/api/src/main/java/me/xiaoyan/point/api/controller/PointController.java new file mode 100644 index 0000000..85e1f6e --- /dev/null +++ b/api/src/main/java/me/xiaoyan/point/api/controller/PointController.java @@ -0,0 +1,23 @@ +package me.xiaoyan.point.api.controller; + +import cn.dev33.satoken.stp.StpUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import me.xiaoyan.point.api.pojo.PointRecord; +import me.xiaoyan.point.api.pojo.vo.PageParam; +import me.xiaoyan.point.api.service.PointRecordService; +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 java.util.List; + +@RestController +@RequestMapping("point") +public class PointController { + @Resource + private PointRecordService pointRecordService; + public IPage list(@RequestBody PageParam param){ + return pointRecordService.histories(StpUtil.getLoginIdAsInt(),param); + } +} diff --git a/api/src/main/java/me/xiaoyan/point/api/controller/SignController.java b/api/src/main/java/me/xiaoyan/point/api/controller/SignController.java new file mode 100644 index 0000000..ad8e9e7 --- /dev/null +++ b/api/src/main/java/me/xiaoyan/point/api/controller/SignController.java @@ -0,0 +1,18 @@ +package me.xiaoyan.point.api.controller; + +import io.swagger.annotations.ApiOperation; +import me.xiaoyan.point.api.pojo.vo.SignResult; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("sign") +public class SignController { + + + @ApiOperation("今日签到") + @RequestMapping("today") + public SignResult signToday() { + return null; + } +} diff --git a/api/src/main/java/me/xiaoyan/point/api/controller/UserinfoController.java b/api/src/main/java/me/xiaoyan/point/api/controller/UserinfoController.java new file mode 100644 index 0000000..c352aa0 --- /dev/null +++ b/api/src/main/java/me/xiaoyan/point/api/controller/UserinfoController.java @@ -0,0 +1,45 @@ +package me.xiaoyan.point.api.controller; + +import cn.dev33.satoken.stp.StpUtil; +import io.swagger.annotations.ApiOperation; +import lombok.SneakyThrows; +import me.xiaoyan.point.api.pojo.UserInfo; +import me.xiaoyan.point.api.pojo.vo.SignResult; +import me.xiaoyan.point.api.pojo.vo.UserLoginData; +import me.xiaoyan.point.api.service.UserInfoService; +import org.springframework.validation.annotation.Validated; +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; + +@RestController +@RequestMapping("user") +public class UserinfoController { + @Resource + private UserInfoService userInfoService; + + // code => openid等信息 + // 使用wx.login获取到的code进行登录,完成登录后下发用户登录凭证 + @ApiOperation("登录") + @PostMapping("login") + @SneakyThrows + public String login(@Validated @RequestBody UserLoginData data) { + //@NotNull(message = "登录code不能为空") + UserInfo info = userInfoService.login(data); + // 完成登录 + StpUtil.login(info.getId()); + // 可以考虑将用户信息保存到sa-token +// StpUtil.getSession().set("userinfo",info); + return StpUtil.getTokenInfo().getTokenValue(); + } + + @ApiOperation("获取登录用户的基本信息") + @RequestMapping("info") + public UserInfo getInfo() { + int uid = StpUtil.getLoginIdAsInt(); + return userInfoService.getInfoById(uid); + } +} diff --git a/api/src/main/java/me/xiaoyan/point/api/controller/WechatController.java b/api/src/main/java/me/xiaoyan/point/api/controller/WechatController.java deleted file mode 100644 index 92e5a0c..0000000 --- a/api/src/main/java/me/xiaoyan/point/api/controller/WechatController.java +++ /dev/null @@ -1,29 +0,0 @@ -package me.xiaoyan.point.api.controller; - -import lombok.SneakyThrows; -import me.xiaoyan.point.api.pojo.UserInfo; -import me.xiaoyan.point.api.pojo.vo.UserLoginData; -import me.xiaoyan.point.api.service.UserInfoService; -import org.springframework.validation.annotation.Validated; -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.constraints.NotNull; - -@RestController -public class WechatController { - @Resource - private UserInfoService userInfoService; - - // code => openid等信息 - // 使用wx.login获取到的code进行登录,完成登录后下发用户登录凭证 - @RequestMapping("/wechat/login") - @SneakyThrows - public UserInfo login(@Validated @RequestBody UserLoginData data) { - //@NotNull(message = "登录code不能为空") - - return userInfoService.login(data); - } -} 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 34cd5a8..9f46d7a 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 @@ -2,21 +2,26 @@ package me.xiaoyan.point.api.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import java.io.Serializable; +import java.util.Date; @Data @Accessors(chain = true) @Builder +@NoArgsConstructor +@AllArgsConstructor public class Point implements Serializable { @TableId(type = IdType.NONE) private Integer uid; private Integer totalPoint; private Integer validPoint; private Integer expirePoint; - private Integer expireTime; - private Integer updateTime; + private Date expireTime; + private Date updateTime; } diff --git a/api/src/main/java/me/xiaoyan/point/api/pojo/PointRecord.java b/api/src/main/java/me/xiaoyan/point/api/pojo/PointRecord.java index ad088e9..4a61345 100644 --- a/api/src/main/java/me/xiaoyan/point/api/pojo/PointRecord.java +++ b/api/src/main/java/me/xiaoyan/point/api/pojo/PointRecord.java @@ -3,8 +3,10 @@ package me.xiaoyan.point.api.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import java.io.Serializable; @@ -13,6 +15,8 @@ import java.util.Date; @Data @Accessors(chain = true) @Builder +@NoArgsConstructor +@AllArgsConstructor @TableName("point_record") public class PointRecord implements Serializable { @TableId(type = IdType.AUTO) 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 f27058c..a0685ad 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 @@ -2,8 +2,10 @@ package me.xiaoyan.point.api.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import java.io.Serializable; @@ -12,6 +14,8 @@ import java.util.Date; @Data @Accessors(chain = true) @Builder +@NoArgsConstructor +@AllArgsConstructor public class SignRecord implements Serializable { @TableId(type = IdType.AUTO) private Integer id; diff --git a/api/src/main/java/me/xiaoyan/point/api/pojo/UserInfo.java b/api/src/main/java/me/xiaoyan/point/api/pojo/UserInfo.java index c64ca57..f15899f 100644 --- a/api/src/main/java/me/xiaoyan/point/api/pojo/UserInfo.java +++ b/api/src/main/java/me/xiaoyan/point/api/pojo/UserInfo.java @@ -1,10 +1,13 @@ package me.xiaoyan.point.api.pojo; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import java.io.Serializable; @@ -13,6 +16,8 @@ import java.util.Date; @Data @Accessors(chain = true) @Builder +@NoArgsConstructor +@AllArgsConstructor @TableName("userinfo") public class UserInfo implements Serializable { /** @@ -57,4 +62,6 @@ public class UserInfo implements Serializable { * 状态 */ private Integer status; + @TableField(exist = false) + private Point pointInfo; } diff --git a/api/src/main/java/me/xiaoyan/point/api/pojo/vo/PageParam.java b/api/src/main/java/me/xiaoyan/point/api/pojo/vo/PageParam.java new file mode 100644 index 0000000..54ce5ce --- /dev/null +++ b/api/src/main/java/me/xiaoyan/point/api/pojo/vo/PageParam.java @@ -0,0 +1,22 @@ +package me.xiaoyan.point.api.pojo.vo; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +@Builder +public class PageParam { + private Integer page; + private Integer pageSize = 20; + + public Page getPage(){ + return new Page().setCurrent(page).setSize(pageSize); + } +} diff --git a/api/src/main/java/me/xiaoyan/point/api/pojo/vo/SignResult.java b/api/src/main/java/me/xiaoyan/point/api/pojo/vo/SignResult.java new file mode 100644 index 0000000..ccc35c3 --- /dev/null +++ b/api/src/main/java/me/xiaoyan/point/api/pojo/vo/SignResult.java @@ -0,0 +1,11 @@ +package me.xiaoyan.point.api.pojo.vo; + +import lombok.Builder; +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Builder +@Accessors(chain = true) +public class SignResult { +} diff --git a/api/src/main/java/me/xiaoyan/point/api/pojo/vo/UserLoginData.java b/api/src/main/java/me/xiaoyan/point/api/pojo/vo/UserLoginData.java index 0faf4e4..f5f44b3 100644 --- a/api/src/main/java/me/xiaoyan/point/api/pojo/vo/UserLoginData.java +++ b/api/src/main/java/me/xiaoyan/point/api/pojo/vo/UserLoginData.java @@ -3,6 +3,7 @@ package me.xiaoyan.point.api.pojo.vo; import lombok.Data; import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; import java.io.Serializable; @Data @@ -13,4 +14,8 @@ public class UserLoginData implements Serializable { private String iv; @NotEmpty(message = "code参数不能为空") private String code; + /** + * 推荐用户id + */ + private int recommend; } 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 3d504a6..c6365b9 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 @@ -1,8 +1,12 @@ package me.xiaoyan.point.api.service; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import me.xiaoyan.point.api.pojo.PointRecord; import me.xiaoyan.point.api.pojo.UserInfo; +import me.xiaoyan.point.api.pojo.vo.PageParam; + +import java.util.List; public interface PointRecordService extends IService { /** @@ -13,4 +17,8 @@ public interface PointRecordService extends IService { * @return */ public PointRecord record(Integer uid,Integer point,String reason); + + IPage histories(Integer uid, PageParam param); + IPage exchangeHistories(Integer uid, PageParam param); + } diff --git a/api/src/main/java/me/xiaoyan/point/api/service/UserInfoService.java b/api/src/main/java/me/xiaoyan/point/api/service/UserInfoService.java index 6348036..079973c 100644 --- a/api/src/main/java/me/xiaoyan/point/api/service/UserInfoService.java +++ b/api/src/main/java/me/xiaoyan/point/api/service/UserInfoService.java @@ -12,4 +12,6 @@ public interface UserInfoService extends IService { * @return */ public UserInfo login(UserLoginData data); + + UserInfo getInfoById(Integer uid); } 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 f90a108..2dc246e 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,16 +1,20 @@ package me.xiaoyan.point.api.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; 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.pojo.vo.PageParam; import me.xiaoyan.point.api.service.PointRecordService; import me.xiaoyan.point.api.service.PointService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.util.List; @Service public class PointRecordServiceImpl extends ServiceImpl @@ -43,4 +47,20 @@ public class PointRecordServiceImpl extends ServiceImpl histories(Integer uid, PageParam param) { + QueryWrapper q = new QueryWrapper(); + q.eq("uid",uid); + this.getBaseMapper().selectPage(param.getPage(), q); + return null; + } + + public IPage exchangeHistories(Integer uid, PageParam param) { + QueryWrapper q = new QueryWrapper(); + q.eq("uid",uid); + q.lt("point",0); + this.getBaseMapper().selectPage(param.getPage(), q); + return null; + } } 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 4c9141c..8192dad 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 @@ -27,6 +27,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import javax.annotation.Resource; +import java.io.Serializable; @Service @Slf4j @@ -53,7 +54,20 @@ public class UserInfoServiceImpl extends ServiceImpl @Resource private PointRecordService pointRecordService; - public void firstLogin(UserInfo info) { + public void firstLogin(UserInfo info, int recommendUid) { + if (recommendUid > 0) { + // 判断推荐者是否存在 + if (this.getById(recommendUid) != null) { + // 存在则设置后续操作 + info.setParentId(recommendUid); + // 增加推荐积分 + pointRecordService.record( + recommendUid, + recommendPoint, + "推荐新用户" + ); + } + } // 先新增用户基本信息 save(info); // 新增积分信息 @@ -90,7 +104,7 @@ public class UserInfoServiceImpl extends ServiceImpl userInfo = wechatUserInfo.getUserinfo().setOpenId(sessionData.getOpenid()); // // 不存在走 第一次登录流程 - firstLogin(userInfo); + firstLogin(userInfo, data.getRecommend()); } // 首先 return userInfo; @@ -126,4 +140,12 @@ public class UserInfoServiceImpl extends ServiceImpl return data; } } + + public UserInfo getInfoById(Integer id) { + final UserInfo userinfo = getById(id); + if (userinfo != null) { + userinfo.setPointInfo(pointService.getById(userinfo.getId())); + } + return userinfo; + } } diff --git a/api/src/main/resources/application.yml b/api/src/main/resources/application.yml index 9b51a5e..c4d70ba 100644 --- a/api/src/main/resources/application.yml +++ b/api/src/main/resources/application.yml @@ -8,6 +8,8 @@ application: first_login: 200 recommend: 100 spring: + profiles: + active: dev application: name: point_api datasource: @@ -51,4 +53,21 @@ mybatis-plus: configuration: # 日志接口 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl - cache-enabled: true \ No newline at end of file + cache-enabled: true + +############## Sa-Token 配置 (文档: https://sa-token.cc) ############## +sa-token: + # token名称 (同时也是cookie名称) + token-name: token + # token有效期,单位s 默认30天, -1代表永不过期 + timeout: -1 + # token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒 + activity-timeout: -1 + # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) + is-concurrent: true + # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) + is-share: false + # token风格 + token-style: uuid + # 是否输出操作日志 + is-log: true \ No newline at end of file diff --git a/api/src/test/java/me/xiaoyan/point/api/WechatTests.java b/api/src/test/java/me/xiaoyan/point/api/WechatTests.java index 554899e..c7107ad 100644 --- a/api/src/test/java/me/xiaoyan/point/api/WechatTests.java +++ b/api/src/test/java/me/xiaoyan/point/api/WechatTests.java @@ -11,16 +11,21 @@ public class WechatTests { @DisplayName("解密用户信息") @Test void testDecode(){ - String encryptedData = "Ezl1S3BHjBeg/HP0Nim/c9eLLYP5L1kgvqSpR+RQYFG6c3Qx0K5U6btEY5IByCw1OsnZ0hKDccNJn3VA/ZgpkxjDODt+XLcph3KqEL6LDU9BLDRFxCI7u+eHBorz5HWYzGITXiuyPb9NWmGAPXwwp0abFqqaycb5u4oii7I/tnh7NIRIcMxAft1YfbVdzQDjraRHFH5hg6Eh4RGSjy6rg1bG/sMecw4+XWM1psTjKBYNwtsG5oxBWja6DniPhmWU6ZwjVMfgJX5Z7wcw2vtmuDPOMCEE1SEcwmTcQ5YKLlPsPBAJhrF3Lxg9oTD1/IlZ"; - String iv = "ckSRPBLA61WONzUDINIWMg=="; - +// String encryptedData = "Ezl1S3BHjBeg/HP0Nim/c9eLLYP5L1kgvqSpR+RQYFG6c3Qx0K5U6btEY5IByCw1OsnZ0hKDccNJn3VA/ZgpkxjDODt+XLcph3KqEL6LDU9BLDRFxCI7u+eHBorz5HWYzGITXiuyPb9NWmGAPXwwp0abFqqaycb5u4oii7I/tnh7NIRIcMxAft1YfbVdzQDjraRHFH5hg6Eh4RGSjy6rg1bG/sMecw4+XWM1psTjKBYNwtsG5oxBWja6DniPhmWU6ZwjVMfgJX5Z7wcw2vtmuDPOMCEE1SEcwmTcQ5YKLlPsPBAJhrF3Lxg9oTD1/IlZ"; +// String iv = "ckSRPBLA61WONzUDINIWMg=="; + String sessionKey= "091WPNkl23zoha4xbpnl2cev9l4WPNk7"; + String encryptedData = "3mmRZjsqy3Tpgw78jm7HNB3n6/pb8nX9jS1GgngV4tHGSe+yhKIXy7u7kxXz7nKS5lwNqt+UQCXF3EHHd1PQJowtpYWNhLBjNZcGjEdIi6a5pxntmwmFsjTX+SjPNmq5Th4iKSwSyMjLIByZqJt7N3hB5OyT5YAo54lsJrln8DJoPE1m6kddHcLqnJy+g12QQTP1u3tFvCEostrCpb109Bhe889wAxm55ekPHTQ+JWYCsPy0TsjmyvqZCQZyB+RNtlW/ohCpLe4oCOF0Nz9Id6N+Kj6bXvgDcEMBf3vwMXSnbWHuqJAuLUWwbsspB/2T"; + String iv = "qfrpHwHjjqPQVlzzxE9D1A=="; +// sessionKey= "PKX9EeH6y+pzz8qYrga2jQ=="; +// encryptedData = "SCK0Ik7THl+USkwTRqTQ9BYGe6rWlXosQ8fWA3I3AsFHTCuPnjbsjFooIEZVcS6mq911XeP5BJJBpPU6A1O3aNuC9L7ebXqTMQX83bVBtaDQySvCIlyyq26xhm8AbWWexl5994NJDpKkNml9ilbYia99bF8bXzXvLCksQQkz82EpZTqztzmCrTdFBZOIrJ+lDnl7rSBWJvVVtoagzgSq2Ux59LcJtxCukIUoZ8fz54//Hm4GhrLucO4zPKTi087f77Pd9K9Rz3LLJ79NMQHHQLtZ38Ws79IKoHBZ7xHXbl3O8xPeTBrrWeHbNfNs1CbOyoe0RwXVjs/fMR9451PeLVM5jg4fj3IDyTFjpx5aUzQRaIrSY/BjVFJoxU/viwQC6LsCBOyXl5uV5h+qIPC5suFbmhl5Q56eU07wbOjNxktEIJsIgbrT+GWRZVPba3dUo+6RoZySxCMA16TRKfuTwjXceV3oNueFdTNyw05s9N43OkrLeKcz1dFeNnpA9DHEVngB1J7MY4RkazdKaWzrld1DjxW6+rk01GgtAr3+H88="; +// iv = "Ql/m+Ksll5ziCCZj+07J6g=="; WechatUserInfo wechatUserInfo = WechatDecryptDataUtil.decryptData( - "SCK0Ik7THl+USkwTRqTQ9BYGe6rWlXosQ8fWA3I3AsFHTCuPnjbsjFooIEZVcS6mq911XeP5BJJBpPU6A1O3aNuC9L7ebXqTMQX83bVBtaDQySvCIlyyq26xhm8AbWWexl5994NJDpKkNml9ilbYia99bF8bXzXvLCksQQkz82EpZTqztzmCrTdFBZOIrJ+lDnl7rSBWJvVVtoagzgSq2Ux59LcJtxCukIUoZ8fz54//Hm4GhrLucO4zPKTi087f77Pd9K9Rz3LLJ79NMQHHQLtZ38Ws79IKoHBZ7xHXbl3O8xPeTBrrWeHbNfNs1CbOyoe0RwXVjs/fMR9451PeLVM5jg4fj3IDyTFjpx5aUzQRaIrSY/BjVFJoxU/viwQC6LsCBOyXl5uV5h+qIPC5suFbmhl5Q56eU07wbOjNxktEIJsIgbrT+GWRZVPba3dUo+6RoZySxCMA16TRKfuTwjXceV3oNueFdTNyw05s9N43OkrLeKcz1dFeNnpA9DHEVngB1J7MY4RkazdKaWzrld1DjxW6+rk01GgtAr3+H88=", - "PKX9EeH6y+pzz8qYrga2jQ==", - "Ql/m+Ksll5ziCCZj+07J6g==" + encryptedData, + sessionKey, + iv ); - System.out.println(wechatUserInfo); +// System.out.println(wechatUserInfo); } }