From fe3b034bfcb263336667bac9d4a002360533951b Mon Sep 17 00:00:00 2001
From: 44323 <443237572@qq.com>
Date: 星期三, 29 五月 2024 19:57:34 +0800
Subject: [PATCH] bug修改
---
ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/TGoodsController.java | 344 ++++++++++++++++-
ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/feignClient/GoodsClient.java | 2
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TStoryController.java | 10
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/domain/TUser.java | 11
ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/Recipient.java | 4
ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/utils/MyQrCodeUtil.java | 93 ++++
ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/service/ITGoodsService.java | 4
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/domain/TUserStudy.java | 10
ruoyi-service/ruoyi-goods/pom.xml | 5
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TStudyController.java | 250 ++++++++++---
ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/dto/GoodExchangeDTO.java | 6
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TSubjectController.java | 10
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java | 16
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TUserController.java | 134 +++++-
ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/utils/QRCodeUtil.java | 50 ++
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/domain/R.java | 38 ++
ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/vo/GoodDetailVO.java | 5
ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/TGoodsServiceImpl.java | 85 ++++
ruoyi-api/ruoyi-api-study/src/main/java/com/ruoyi/study/api/factory/StudyFallbackFactory.java | 10
ruoyi-api/ruoyi-api-study/src/main/java/com/ruoyi/study/api/feignClient/StudyClient.java | 21 +
20 files changed, 967 insertions(+), 141 deletions(-)
diff --git a/ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/feignClient/GoodsClient.java b/ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/feignClient/GoodsClient.java
index 0d0fcb6..298c98f 100644
--- a/ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/feignClient/GoodsClient.java
+++ b/ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/feignClient/GoodsClient.java
@@ -56,7 +56,7 @@
*
* @return 推荐商品信息
*/
- @GetMapping("/goodRecommend")
+ @GetMapping("/base/goods/goodRecommend")
@ApiOperation(value = "可兑换商品推荐", tags = {"可兑换商品推荐"})
R<List<TGoodsVO>> goodRecommend();
diff --git a/ruoyi-api/ruoyi-api-study/src/main/java/com/ruoyi/study/api/factory/StudyFallbackFactory.java b/ruoyi-api/ruoyi-api-study/src/main/java/com/ruoyi/study/api/factory/StudyFallbackFactory.java
index 2e1d380..1e216f3 100644
--- a/ruoyi-api/ruoyi-api-study/src/main/java/com/ruoyi/study/api/factory/StudyFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-study/src/main/java/com/ruoyi/study/api/factory/StudyFallbackFactory.java
@@ -144,6 +144,16 @@
public R<Boolean> exchangeIntegral(Integer integral, String method) {
return R.fail("用户积分变动失败" + cause.getMessage());
}
+
+ @Override
+ public R<Boolean> addIntegralDetail1(String integral, String method) {
+ return null;
+ }
+
+ @Override
+ public R<Boolean> exchangeIntegral1(Integer integral, String method) {
+ return null;
+ }
};
}
}
diff --git a/ruoyi-api/ruoyi-api-study/src/main/java/com/ruoyi/study/api/feignClient/StudyClient.java b/ruoyi-api/ruoyi-api-study/src/main/java/com/ruoyi/study/api/feignClient/StudyClient.java
index c3fb930..fb3d775 100644
--- a/ruoyi-api/ruoyi-api-study/src/main/java/com/ruoyi/study/api/feignClient/StudyClient.java
+++ b/ruoyi-api/ruoyi-api-study/src/main/java/com/ruoyi/study/api/feignClient/StudyClient.java
@@ -205,4 +205,25 @@
@ApiOperation(value = "用户积分变动", tags = {"用户积分变动"})
R<Boolean> exchangeIntegral(@RequestParam("integral") Integer integral, @RequestParam("method") String method);
+ /**
+ * 生成积分明细-用于远程调用
+ *
+ * @param integral 积分变动信息
+ * @param method 变动源
+ * @return 操作结果
+ */
+ @GetMapping("/base/study/addIntegralDetail1")
+ R<Boolean> addIntegralDetail1(@RequestParam("integral") String integral, @RequestParam("method") String method);
+
+ /**
+ * 用户积分变动(增加或减少)-用于远程调用
+ *
+ * @param integral 积分变动信息
+ * @param method 变动源
+ * @return 操作结果
+ */
+ @GetMapping("/base/study/exchangeIntegral1")
+ @ApiOperation(value = "用户积分变动", tags = {"用户积分变动"})
+ R<Boolean> exchangeIntegral1(@RequestParam("integral") Integer integral, @RequestParam("method") String method);
+
}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java
index 2902af8..040f572 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java
@@ -50,6 +50,10 @@
* 成功标记
*/
public static final Integer SUCCESS = 200;
+ /**
+ * 仅会员查看
+ */
+ public static final Integer VIP_ERROR = 501;
/**
* 失败标记
@@ -59,6 +63,18 @@
* 登录失效
*/
public static final Integer TOKEN_ERROR = 600;
+ /**
+ * 账号冻结
+ */
+ public static final Integer FREEZE = 502;
+ /**
+ * 短信验证码无效
+ */
+ public static final Integer ERRORCODE = 503;
+ /**
+ * 积分商城兑换失败code
+ */
+ public static final Integer EXCHANGECODE = 506;
/**
* 登录成功状态
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/domain/R.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/domain/R.java
index 603a629..13477e8 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/domain/R.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/domain/R.java
@@ -14,9 +14,20 @@
/** 成功 */
public static final int SUCCESS = Constants.SUCCESS;
+ public static final int VIPERROR = Constants.VIP_ERROR;
/** 失败 */
public static final int FAIL = Constants.FAIL;
+ /** 积分商城兑换失败 */
+ public static final int EXCHANGECODE = Constants.EXCHANGECODE;
+ /**
+ * 账号被冻结
+ */
+ public static final int FREEZE = Constants.FREEZE;
+ /**
+ * 短信验证码无效
+ */
+ public static final int ERRORCODE = Constants.ERRORCODE;
/**
* 登陆失效
*/
@@ -37,6 +48,10 @@
{
return restResult(data, SUCCESS, null);
}
+ public static <T> R<T> vipError(String msg)
+ {
+ return restResult(null, VIPERROR, msg);
+ }
public static <T> R<T> ok(T data, String msg)
{
@@ -57,6 +72,29 @@
return restResult(null, FAIL, msg);
}
+ /**
+ * 商城兑换失败code
+ * @param msg
+ * @return
+ * @param <T>
+ */
+ public static <T> R<T> exchangeError(String msg)
+ {
+ return restResult(null, EXCHANGECODE, msg);
+ }
+ public static <T> R<T> freeze(String msg)
+ {
+ return restResult(null, FREEZE, msg);
+ }
+ public static <T> R<T> errorCode(String msg)
+ {
+ return restResult(null, ERRORCODE, msg);
+ }
+ public static <T> R<T> errCode(String msg)
+ {
+ return restResult(null, FREEZE, msg);
+ }
+
public static <T> R<T> fail(T data)
{
return restResult(data, FAIL, null);
diff --git a/ruoyi-service/ruoyi-goods/pom.xml b/ruoyi-service/ruoyi-goods/pom.xml
index 954e482..a770520 100644
--- a/ruoyi-service/ruoyi-goods/pom.xml
+++ b/ruoyi-service/ruoyi-goods/pom.xml
@@ -17,6 +17,11 @@
<dependencies>
<dependency>
+ <groupId>com.google.zxing</groupId>
+ <artifactId>javase</artifactId>
+ <version>3.4.1</version>
+ </dependency>
+ <dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-api-study</artifactId>
<version>3.6.2</version>
diff --git a/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/TGoodsController.java b/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/TGoodsController.java
index 76d7e82..94ca279 100644
--- a/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/TGoodsController.java
+++ b/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/TGoodsController.java
@@ -1,6 +1,7 @@
package com.ruoyi.goods.controller;
+import com.alibaba.fastjson2.util.UUIDUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.web.page.PageInfo;
@@ -8,6 +9,8 @@
import com.ruoyi.goods.domain.*;
import com.ruoyi.goods.dto.*;
import com.ruoyi.goods.service.*;
+import com.ruoyi.goods.utils.MyQrCodeUtil;
+import com.ruoyi.goods.utils.QRCodeUtil;
import com.ruoyi.goods.vo.GoodDetailVO;
import com.ruoyi.goods.vo.TGoodsVO;
import com.ruoyi.goods.vo.TOrderVO;
@@ -16,18 +19,20 @@
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
+import org.apache.logging.log4j.core.util.UuidUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
+import java.awt.image.BufferedImage;
import java.text.ParseException;
import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
/**
* <p>
@@ -69,15 +74,46 @@
}
@PostMapping("/goodList")
- @ApiOperation(value = "商品列表查询", tags = {"学习端-商品列表"})
+ @ApiOperation(value = "商品列表查询", tags = {"家长端-商品列表"})
public R<PageInfo<TGoods>> listType(@RequestBody GoodQueryDTO goodQuery) {
+ if (tokenService.getLoginUser1() == null){
+ return R.tokenError("登录失效");
+ }
List<String> type = goodQuery.getType();
String keywords = goodQuery.getKeywords();
// 初始化条件构造器
QueryWrapper<TGoods> wrapper = new QueryWrapper<>();
wrapper = keywords != null && "".equals(keywords.trim()) ? wrapper.like("name", keywords) : wrapper;
+
// 类型匹配 todo
- wrapper = type.isEmpty() ? wrapper : wrapper.in("");
+ if (goodQuery.getType()!=null && goodQuery.getType().size()>0){
+ StringBuilder temp = new StringBuilder("");
+ for (String s : goodQuery.getType()) {
+ wrapper.or().apply("FIND_IN_SET('" + s + "', typeIds)"); // 将每个类型 ID 应用于 FIND_IN_SET 函数
+ }
+ }
+ wrapper.eq("isDelete", 0);
+ return R.ok(goodsService.page(new PageInfo<>(goodQuery.getPageNumber(), goodQuery.getPageSize()), wrapper));
+ }
+ @PostMapping("/goodListStudy")
+ @ApiOperation(value = "商品列表查询", tags = {"学习端"})
+ public R<PageInfo<TGoods>> goodListStudy(@RequestBody GoodQueryDTO goodQuery) {
+ if (tokenService.getLoginUserStudy() == null){
+ return R.tokenError("登录失效");
+ }
+ List<String> type = goodQuery.getType();
+ String keywords = goodQuery.getKeywords();
+ // 初始化条件构造器
+ QueryWrapper<TGoods> wrapper = new QueryWrapper<>();
+ wrapper = keywords != null && "".equals(keywords.trim()) ? wrapper.like("name", keywords) : wrapper;
+
+ // 类型匹配 todo
+ if (goodQuery.getType()!=null && goodQuery.getType().size()>0){
+ StringBuilder temp = new StringBuilder("");
+ for (String s : goodQuery.getType()) {
+ wrapper.or().apply("FIND_IN_SET('" + s + "', typeIds)"); // 将每个类型 ID 应用于 FIND_IN_SET 函数
+ }
+ }
wrapper.eq("isDelete", 0);
return R.ok(goodsService.page(new PageInfo<>(goodQuery.getPageNumber(), goodQuery.getPageSize()), wrapper));
}
@@ -173,16 +209,44 @@
return R.ok(orderService.lambdaQuery().eq(TOrder::getUserId, tokenService.getLoginUserStudy().getUserid())
.orderByDesc(TOrder::getCreateTime).list());
}
+ @GetMapping("/exchangeRecordParent")
+ @ApiOperation(value = "家长端-兑换记录", tags = {"家长端-兑换记录"})
+ public R<List<TOrder>> exchangeRecordParent() {
+ if (tokenService.getLoginUser1() == null){
+ return R.tokenError("登录失效");
+ }
+ return R.ok(orderService.lambdaQuery().eq(TOrder::getUserId, tokenService.getLoginUser1().getUserid())
+ .orderByDesc(TOrder::getCreateTime).list());
+ }
/**
* 兑换记录
*/
@GetMapping("/confirm")
- @ApiOperation(value = "确认收货", tags = {"兑换记录"})
+ @ApiOperation(value = "确认收货", tags = {"家长端-兑换记录"})
@ApiImplicitParams({
@ApiImplicitParam(value = "订单id", name = "id", dataType = "String", required = true)
})
public R<Boolean> confirm(@RequestParam Integer id) {
+ if (tokenService.getLoginUser1() == null){
+ return R.tokenError("登录失效");
+ }
+ TOrder byId = orderService.getById(id);
+ byId.setState(3);
+ return R.ok(orderService.updateById(byId));
+ }
+ /**
+ * 兑换记录
+ */
+ @GetMapping("/confirmStudy")
+ @ApiOperation(value = "确认收货", tags = {"学习端-兑换记录"})
+ @ApiImplicitParams({
+ @ApiImplicitParam(value = "订单id", name = "id", dataType = "String", required = true)
+ })
+ public R<Boolean> confirmStudy(@RequestParam Integer id) {
+ if (tokenService.getLoginUserStudy() == null){
+ return R.tokenError("登录失效");
+ }
TOrder byId = orderService.getById(id);
byId.setState(3);
return R.ok(orderService.updateById(byId));
@@ -191,9 +255,93 @@
/**
* 获取用户收货地址
*/
+ @GetMapping("/shopAddressParent")
+ @ApiOperation(value = "获取用户收货地址", tags = {"家长端-获取用户收货地址"})
+ public R<List<Recipient>> shopAddressParent() {
+ if (tokenService.getLoginUser1() == null){
+ return R.tokenError("登录失效");
+ }
+ return R.ok(recipientService.lambdaQuery().eq(Recipient::getUserId,
+ tokenService.getLoginUser1().getUserid()).list());
+ }
+ /**
+ * 设置默认地址
+ */
+ @GetMapping("/setDefault")
+ @ApiOperation(value = "设置默认地址", tags = {"家长端-设置默认地址"})
+ @ApiImplicitParams({
+ @ApiImplicitParam(value = "地址id", name = "id", dataType = "String", required = true)
+ })
+ public R setDefault(@RequestParam Integer id) {
+ if (tokenService.getLoginUser1() == null){
+ return R.tokenError("登录失效");
+ }
+ Recipient byId = recipientService.getById(id);
+ byId.setIsDefault(1);
+ recipientService.updateById(byId);
+ return R.ok();
+ }
+ /**
+ * 设置默认地址
+ */
+ @GetMapping("/setDefaultStudy")
+ @ApiOperation(value = "设置默认地址", tags = {"学习端-设置默认地址"})
+ @ApiImplicitParams({
+ @ApiImplicitParam(value = "地址id", name = "id", dataType = "String", required = true)
+ })
+ public R setDefaultStudy(@RequestParam Integer id) {
+ if (tokenService.getLoginUserStudy() == null){
+ return R.tokenError("登录失效");
+ }
+ Recipient byId = recipientService.getById(id);
+ byId.setIsDefault(1);
+ recipientService.updateById(byId);
+ return R.ok();
+ }
+
+ /**
+ * 根据地址id 获取详情
+ * @param id
+ * @return
+ */
+ @GetMapping("/getAddressById")
+ @ApiOperation(value = "获取地址详情", tags = {"家长端-获取地址详情"})
+ @ApiImplicitParams({
+ @ApiImplicitParam(value = "地址id", name = "id", dataType = "String", required = true)
+ })
+ public R<Recipient> getAddressById(@RequestParam Integer id) {
+ if (tokenService.getLoginUser1() == null){
+ return R.tokenError("登录失效");
+ }
+ Recipient byId = recipientService.getById(id);
+ return R.ok(byId);
+ }
+ /**
+ * 根据地址id 获取详情
+ * @param id
+ * @return
+ */
+ @GetMapping("/getAddressByIdStudy")
+ @ApiOperation(value = "获取地址详情", tags = {"学习端-获取地址详情"})
+ @ApiImplicitParams({
+ @ApiImplicitParam(value = "地址id", name = "id", dataType = "String", required = true)
+ })
+ public R<Recipient> getAddressByIdStudy(@RequestParam Integer id) {
+ if (tokenService.getLoginUserStudy() == null){
+ return R.tokenError("登录失效");
+ }
+ Recipient byId = recipientService.getById(id);
+ return R.ok(byId);
+ }
+ /**
+ * 获取用户收货地址
+ */
@GetMapping("/shopAddress")
- @ApiOperation(value = "获取用户收货地址", tags = {"获取用户收货地址"})
+ @ApiOperation(value = "获取用户收货地址", tags = {"学习端-获取用户收货地址"})
public R<List<Recipient>> shopAddress() {
+ if (tokenService.getLoginUserStudy() == null){
+ return R.tokenError("登录失效");
+ }
return R.ok(recipientService.lambdaQuery().eq(Recipient::getUserId,
tokenService.getLoginUserStudy().getUserid()).list());
}
@@ -202,10 +350,25 @@
* 新增收货地址/修改收货地址
*/
@PostMapping("/addressSaveOrUpdate")
- @ApiOperation(value = "学习端-新增收货地址/修改收货地址", tags = {"新增收货地址/修改收货地址"})
+ @ApiOperation(value = "学习端-新增收货地址/修改收货地址", tags = {"学习端-新增收货地址/修改收货地址"})
public R<String> addressSave(@RequestBody Recipient recipient) {
recipient.setUserId(tokenService.getLoginUserStudy().getUserid());
- return R.ok(recipientService.addressSaveOrUpdate(recipient));
+ recipientService.addressSaveOrUpdate(recipient);
+ return R.ok();
+ }
+ /**
+ * 新增收货地址/修改收货地址
+ */
+ @PostMapping("/addressSaveOrUpdateParent")
+ @ApiOperation(value = "家长端-新增收货地址/修改收货地址", tags = {"家长端-新增收货地址/修改收货地址"})
+ public R<String> addressSaveOrUpdateParent(@RequestBody Recipient recipient) {
+ recipient.setUserId(tokenService.getLoginUser1().getUserid());
+ if (recipient.getId() == null){
+ recipientService.updateById(recipient);
+ }else{
+ recipientService.save(recipient);
+ }
+ return R.ok();
}
/**
@@ -219,22 +382,71 @@
public R<String> addressDelete(@RequestParam String id) {
return R.ok(recipientService.removeById(id) ? "删除成功!" : "删除失败!");
}
-
/**
- * 修改订单收货地址
- *
- * @param orderId 订单id
+ * 删除收货地址
*/
- @GetMapping("/updateOrderAddress")
- @ApiOperation(value = "学习端-修改订单收货地址", tags = {"学习端-修改订单收货地址"})
+ @GetMapping("/addressDeleteParent")
+ @ApiOperation(value = "家长端-删除收货地址", tags = {"家长端-删除收货地址"})
+ @ApiImplicitParams({
+ @ApiImplicitParam(value = "地址信息id", name = "id", dataType = "String", required = true)
+ })
+ public R<String> addressDeleteParent(@RequestParam String id) {
+ return R.ok(recipientService.removeById(id) ? "删除成功!" : "删除失败!");
+ }
+
+
+ @GetMapping("/getOrderAddressParent")
+ @ApiOperation(value = "获取修改订单收货地址", tags = {"家长端-获取修改订单收货地址"})
+ public R<List<Recipient>> getOrderAddressParent() {
+ if (tokenService.getLoginUser1() == null){
+ return R.tokenError("登录失效");
+ }
+ List<Recipient> userId = recipientService.list(new QueryWrapper<Recipient>()
+ .eq("userId", tokenService.getLoginUser1().getUserid()));
+
+ return R.ok(userId);
+ }
+ @GetMapping("/getOrderAddress")
+ @ApiOperation(value = "获取修改订单收货地址", tags = {"学习端-获取修改订单收货地址"})
+ public R<List<Recipient>> getOrderAddress() {
+ if (tokenService.getLoginUserStudy() == null){
+ return R.tokenError("登录失效");
+ }
+ List<Recipient> userId = recipientService.list(new QueryWrapper<Recipient>()
+ .eq("userId", tokenService.getLoginUserStudy().getUserid()));
+ return R.ok(userId);
+ }
+ @GetMapping("/updateOrderAddressParent")
+ @ApiOperation(value = "修改订单收货地址", tags = {"家长端-修改订单收货地址"})
@ApiImplicitParams({
@ApiImplicitParam(value = "订单id", name = "orderId", dataType = "String", required = true),
- @ApiImplicitParam(value = "完整收货地址", name = "address", dataType = "String", required = true)
+ @ApiImplicitParam(value = "地址信息id", name = "recipientId", dataType = "String", required = true)
})
- public R<Boolean> updateOrderAddress(@RequestParam String orderId,
- @RequestParam String address) {
- return R.ok(orderService.lambdaUpdate().set(TOrder::getConsigneeAddress, address)
- .eq(TOrder::getId, orderId).eq(TOrder::getState, 1).update());
+ public R updateOrderAddressParent(@RequestParam Integer orderId,@RequestParam Integer recipientId) {
+ if (tokenService.getLoginUser1() == null){
+ return R.tokenError("登录失效");
+ }
+ Recipient userId = recipientService.getById(recipientId);
+ TOrder byId = orderService.getById(orderId);
+ byId.setConsigneeName(userId.getAddress());
+ byId.setConsigneePhone(userId.getRecipientPhone());
+ byId.setConsigneeAddress(userId.getAddress());
+ orderService.updateById(byId);
+ return R.ok("修改成功");
+ }
+ @GetMapping("/updateOrderAddress")
+ @ApiOperation(value = "修改订单收货地址", tags = {"学习端-修改订单收货地址"})
+ public R updateOrderAddress(@RequestParam Integer orderId,@RequestParam Integer recipientId) {
+ if (tokenService.getLoginUserStudy() == null){
+ return R.tokenError("登录失效");
+ }
+ Recipient userId = recipientService.getById(recipientId);
+ TOrder byId = orderService.getById(orderId);
+ byId.setConsigneeName(userId.getAddress());
+ byId.setConsigneePhone(userId.getRecipientPhone());
+ byId.setConsigneeAddress(userId.getAddress());
+ orderService.updateById(byId);
+ return R.ok();
}
/**
@@ -262,11 +474,33 @@
* @param goodId 商品id
*/
@GetMapping("/goodDetail")
- @ApiOperation(value = "学习端-商品详情", tags = {"学习端-商品详情"})
+ @ApiOperation(value = "学习端-商品详情", tags = {"学习端-商城"})
@ApiImplicitParams({
@ApiImplicitParam(value = "商品id", name = "goodId", dataType = "String", required = true)
})
public R<GoodDetailVO> goodDetail(@RequestParam String goodId) {
+ // 商品详情
+ TGoods goods = goodsService.lambdaQuery().eq(TGoods::getId, goodId).one();
+ // 商品分类详情
+ List<TGoodsType> goodsTypes = goodsTypeService.lambdaQuery().in(TGoodsType::getId, Arrays.asList(goods.getTypeIds().split(","))).list();
+ // 已兑换人数
+ int number = goods.getBasicCount() + orderService.getGoodBuyNumber(goods.getId());
+ return R.ok(new GoodDetailVO(goods, goodsTypes, number));
+ }
+ /**
+ * 商品详情
+ *
+ * @param goodId 商品id
+ */
+ @GetMapping("/goodDetailParent")
+ @ApiOperation(value = "商品详情", tags = {"家长端-商城"})
+ @ApiImplicitParams({
+ @ApiImplicitParam(value = "商品id", name = "goodId", dataType = "String", required = true)
+ })
+ public R<GoodDetailVO> goodDetailParent(@RequestParam String goodId) {
+ if (tokenService.getLoginUser1() == null){
+ return R.tokenError("登录失效");
+ }
// 商品详情
TGoods goods = goodsService.lambdaQuery().eq(TGoods::getId, goodId).one();
// 商品分类详情
@@ -280,15 +514,63 @@
* 商城-立即兑换
*/
@GetMapping("/redeemNow")
- @ApiOperation(value = "学习端-商城立即兑换", tags = {"学习端-商城立即兑换"})
+ @ApiOperation(value = "商城立即兑换", tags = {"学习端-商城"})
@ApiImplicitParams({
@ApiImplicitParam(value = "商品id", name = "goodId", dataType = "String", required = true)
})
public R<GoodDetailVO> redeemNow(@RequestParam String goodId) {
+ if (tokenService.getLoginUserStudy() == null){
+ return R.tokenError("登录失效");
+ }
Recipient recipient = recipientService.lambdaQuery()
.eq(Recipient::getUserId, tokenService.getLoginUserStudy().getUserid())
.eq(Recipient::getIsDefault, 1).one();
- return R.ok(goodsService.redeemNow(goodId, recipient));
+ GoodDetailVO goodDetailVO = goodsService.redeemNow(goodId, recipient);
+ LocalDateTime currentDateTime = LocalDateTime.now();
+ // 格式化日期和时间信息
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
+ String formattedDateTime = currentDateTime.format(formatter);
+ // 生成随机数,填充剩余位数
+ Random random = new Random();
+ StringBuilder randomPart = new StringBuilder();
+ for (int i = 0; i < 3; i++) {
+ randomPart.append((char) (random.nextInt(26) + 'A')); // 大写字母
+ }
+ // 组合订单编号
+ String orderNumber = formattedDateTime + randomPart.toString();
+ goodDetailVO.setOrderNumber(orderNumber);
+ return R.ok(goodDetailVO);
+ }
+ /**
+ * 商城-立即兑换
+ */
+ @GetMapping("/redeemNowParent")
+ @ApiOperation(value = "商城立即兑换", tags = {"家长端-商城"})
+ @ApiImplicitParams({
+ @ApiImplicitParam(value = "商品id", name = "goodId", dataType = "String", required = true)
+ })
+ public R<GoodDetailVO> redeemNowParent(@RequestParam String goodId) {
+ if (tokenService.getLoginUser1() == null){
+ return R.tokenError("登录失效");
+ }
+ Recipient recipient = recipientService.lambdaQuery()
+ .eq(Recipient::getUserId, tokenService.getLoginUser1().getUserid())
+ .eq(Recipient::getIsDefault, 1).one();
+ GoodDetailVO goodDetailVO = goodsService.redeemNow(goodId, recipient);
+ LocalDateTime currentDateTime = LocalDateTime.now();
+ // 格式化日期和时间信息
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
+ String formattedDateTime = currentDateTime.format(formatter);
+ // 生成随机数,填充剩余位数
+ Random random = new Random();
+ StringBuilder randomPart = new StringBuilder();
+ for (int i = 0; i < 3; i++) {
+ randomPart.append((char) (random.nextInt(26) + 'A')); // 大写字母
+ }
+ // 组合订单编号
+ String orderNumber = formattedDateTime + randomPart.toString();
+ goodDetailVO.setOrderNumber(orderNumber);
+ return R.ok(goodDetailVO);
}
@@ -298,11 +580,19 @@
* @param goodExchange 商品信息
*/
@PostMapping("/goodExchange")
- @ApiOperation(value = "学习端-商品兑换确认", tags = {"学习端-商品兑换确认"})
- public R<Boolean> goodExchange(@RequestBody GoodExchangeDTO goodExchange) {
+ @ApiOperation(value = "学习端-商品兑换确认", tags = {"家长端-商品兑换确认"})
+ public R goodExchange(@RequestBody GoodExchangeDTO goodExchange) {
Recipient recipient = recipientService.getById(goodExchange.getRecipientId());
- return R.ok(goodsService.goodExchange(goodExchange, recipient));
+ return goodsService.goodExchange1(goodExchange, recipient);
}
+ @PostMapping("/goodExchangeStudy")
+ @ApiOperation(value = "学习端-商品兑换确认", tags = {"学习端-商品兑换确认"})
+ public R goodExchangeStudy(@RequestBody GoodExchangeDTO goodExchange) {
+ Recipient recipient = recipientService.getById(goodExchange.getRecipientId());
+ return goodsService.goodExchange(goodExchange, recipient);
+ }
+
+
@Autowired
private StudyClient studyClient;
@PostMapping("/getOrderInfo/{id}")
diff --git a/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/Recipient.java b/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/Recipient.java
index ceadfb2..6420ebb 100644
--- a/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/Recipient.java
+++ b/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/Recipient.java
@@ -4,6 +4,7 @@
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.ruoyi.common.core.web.domain.BaseModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -19,7 +20,7 @@
*/
@TableName("t_recipient")
@Data
-public class Recipient extends Model<Recipient> {
+public class Recipient extends BaseModel {
private static final long serialVersionUID = 1L;
@@ -31,6 +32,7 @@
/**
* 用户id
*/
+ @ApiModelProperty(value = "用户id")
private Integer userId;
/**
* 收件人姓名
diff --git a/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/dto/GoodExchangeDTO.java b/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/dto/GoodExchangeDTO.java
index 93a57ea..11a00e6 100644
--- a/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/dto/GoodExchangeDTO.java
+++ b/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/dto/GoodExchangeDTO.java
@@ -1,5 +1,6 @@
package com.ruoyi.goods.dto;
+import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
@@ -13,26 +14,31 @@
/**
* 商品id
*/
+ @ApiModelProperty("商品id")
private Integer goodId;
/**
* 备注
*/
+ @ApiModelProperty("备注")
private String remark;
/**
* 兑换数量
*/
+ @ApiModelProperty("兑换数量")
private Integer number;
/**
* 订单编号
*/
+ @ApiModelProperty("订单编号")
private String orderNumber;
/**
* 收货地址id
*/
+ @ApiModelProperty("收货地址id")
private String recipientId;
}
diff --git a/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/service/ITGoodsService.java b/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/service/ITGoodsService.java
index c3342b5..5a590df 100644
--- a/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/service/ITGoodsService.java
+++ b/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/service/ITGoodsService.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.core.domain.R;
import com.ruoyi.goods.domain.Recipient;
import com.ruoyi.goods.domain.TGoods;
import com.ruoyi.goods.dto.GoodExchangeDTO;
@@ -44,5 +45,6 @@
* @param recipient 收货地址
* @return 兑换结果
*/
- Boolean goodExchange(GoodExchangeDTO goodExchange, Recipient recipient);
+ R goodExchange(GoodExchangeDTO goodExchange, Recipient recipient);
+ R goodExchange1(GoodExchangeDTO goodExchange, Recipient recipient);
}
diff --git a/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/TGoodsServiceImpl.java b/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/TGoodsServiceImpl.java
index 5e1c1bc..4fcf5a4 100644
--- a/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/TGoodsServiceImpl.java
+++ b/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/TGoodsServiceImpl.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.constant.Constants;
import com.ruoyi.common.core.constant.RedisConstants;
+import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.exception.GlobalException;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.goods.domain.Recipient;
@@ -65,12 +66,12 @@
@Override
@Transactional(rollbackFor = Exception.class)
- public Boolean goodExchange(GoodExchangeDTO goodExchange, Recipient recipient) {
+ public R goodExchange(GoodExchangeDTO goodExchange, Recipient recipient) {
Integer number = goodExchange.getNumber();
Integer goodId = goodExchange.getGoodId();
TGoods good = this.getById(goodId);
if (null == good) {
- throw new GlobalException("商品不存在,请稍后重试!");
+ return R.exchangeError("商品不存在,请稍后重试!");
}
// 校验用户积分是否足够兑换
TUser user = studyClient.userInfo().getData();
@@ -78,10 +79,9 @@
if (user == null){
user = studyClient.getUserById(loginUser1.getUserid()).getData();
}
-
int needIntegral = good.getIntegral() * number;
if (user.getIntegral() < needIntegral) {
- throw new GlobalException("兑换失败,当前剩余积分不足!");
+ return R.exchangeError("兑换失败,当前剩余积分不足!");
}
// 检查用户兑换数量是否超过单用户最大兑换数量
List<TOrder> orderList = orderService.lambdaQuery().eq(TOrder::getUserId, user.getId()).eq(TOrder::getGoodsId, goodId).list();
@@ -89,7 +89,7 @@
int totalNumber = orderList.stream().map(TOrder::getCount).collect(Collectors.toList()).stream().mapToInt(Integer::intValue).sum();
boolean canExchange = orderList.isEmpty() || null == good.getUserCount() || (totalNumber + number) <= good.getUserCount();
if (!canExchange) {
- throw new GlobalException("兑换失败,当前兑换数量已超过最大兑换数量,剩余兑换数量为: " + (good.getUserCount() - totalNumber) + "!");
+ return R.exchangeError("兑换失败,当前兑换数量已超过最大兑换数量,剩余兑换数量为: " + (good.getUserCount() - totalNumber) + "!");
}
// redisson分布式锁,防止超卖
String key = String.format(RedisConstants.GOOD_STOCK, good.getId());
@@ -100,7 +100,7 @@
// 兑换失败,库存不足
if (!tried) {
semaphore.release(number);
- throw new GlobalException("当前商品库存不足!");
+ return R.exchangeError("当前商品库存不足");
}
// 兑换成功,生成订单信息、生成积分明细(积分明细需要远程调用rouyi-study服务)
TOrder order = orderInfo(goodExchange, recipient, number, goodId, needIntegral);
@@ -113,9 +113,63 @@
result = result && this.lambdaUpdate().set(TGoods::getSurplus, good.getSurplus() - number).eq(TGoods::getId, good.getId()).update();
if (!result) {
semaphore.release(number);
- throw new GlobalException("商品兑换失败!");
+ return R.exchangeError("商品兑换失败!");
}
- return result;
+ return R.ok();
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public R goodExchange1(GoodExchangeDTO goodExchange, Recipient recipient) {
+ Integer number = goodExchange.getNumber();
+ Integer goodId = goodExchange.getGoodId();
+ TGoods good = this.getById(goodId);
+ if (null == good) {
+ return R.exchangeError("商品不存在,请稍后重试!");
+ }
+ // 校验用户积分是否足够兑换
+ if (tokenService.getLoginUser1() == null){
+ return R.tokenError("登录失效");
+ }
+ TUser user = studyClient.getUserById(tokenService.getLoginUser1().getUserid()).getData();
+
+ int needIntegral = good.getIntegral() * number;
+ if (user.getIntegral() < needIntegral) {
+ return R.exchangeError("兑换失败,当前剩余积分不足!");
+ }
+ // 检查用户兑换数量是否超过单用户最大兑换数量
+ List<TOrder> orderList = orderService.lambdaQuery().eq(TOrder::getUserId, user.getId()).eq(TOrder::getGoodsId, goodId).list();
+ // 该商品订单为空、订单数量未超过商品的单个用户兑换上限数量时,可以进行兑换
+ int totalNumber = orderList.stream().map(TOrder::getCount).collect(Collectors.toList()).stream().mapToInt(Integer::intValue).sum();
+ boolean canExchange = orderList.isEmpty() || null == good.getUserCount() || (totalNumber + number) <= good.getUserCount();
+ if (!canExchange) {
+ return R.exchangeError("兑换失败,当前兑换数量已超过最大兑换数量,剩余兑换数量为: " + (good.getUserCount() - totalNumber) + "!");
+ }
+ // redisson分布式锁,防止超卖
+ String key = String.format(RedisConstants.GOOD_STOCK, good.getId());
+ RSemaphore semaphore = redissonClient.getSemaphore(key);
+ // 请求超时时间 单位:毫秒
+ semaphore.trySetPermits(1000);
+ boolean tried = semaphore.tryAcquire(number);
+ // 兑换失败,库存不足
+ if (!tried) {
+ semaphore.release(number);
+ return R.exchangeError("当前商品库存不足");
+ }
+ // 兑换成功,生成订单信息、生成积分明细(积分明细需要远程调用rouyi-study服务)
+ TOrder order = orderInfo1(goodExchange, recipient, number, goodId, needIntegral);
+ boolean result = orderService.save(order);
+ // 远程调用,生成积分明细
+ result = result && studyClient.addIntegralDetail1(Constants.BURDEN + needIntegral, Constants.SHOPPING_CONSUME).getData();
+ // 扣除用户积分
+ result = result && studyClient.exchangeIntegral1(needIntegral, Constants.BURDEN).getData();
+ // 扣除库存
+ result = result && this.lambdaUpdate().set(TGoods::getSurplus, good.getSurplus() - number).eq(TGoods::getId, good.getId()).update();
+ if (!result) {
+ semaphore.release(number);
+ return R.exchangeError("商品兑换失败!");
+ }
+ return R.ok();
}
private TOrder orderInfo(GoodExchangeDTO goodExchange, Recipient recipient, Integer number, Integer goodId, int needIntegral) {
@@ -133,4 +187,19 @@
order.setDisabled(Boolean.FALSE);
return order;
}
+ private TOrder orderInfo1(GoodExchangeDTO goodExchange, Recipient recipient, Integer number, Integer goodId, int needIntegral) {
+ TOrder order = new TOrder();
+ order.setOrderNumber(goodExchange.getOrderNumber());
+ order.setUserId(tokenService.getLoginUser1().getUserid());
+ order.setInsertTime(new Date());
+ order.setGoodsId(goodId);
+ order.setCount(number);
+ order.setState(1);
+ order.setIntegral(needIntegral);
+ order.setConsigneeName(recipient.getRecipient());
+ order.setConsigneePhone(recipient.getRecipientPhone());
+ order.setConsigneeAddress(recipient.getAddress());
+ order.setDisabled(Boolean.FALSE);
+ return order;
+ }
}
diff --git a/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/utils/MyQrCodeUtil.java b/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/utils/MyQrCodeUtil.java
new file mode 100644
index 0000000..1e65371
--- /dev/null
+++ b/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/utils/MyQrCodeUtil.java
@@ -0,0 +1,93 @@
+package com.ruoyi.goods.utils;
+
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.EncodeHintType;
+import com.google.zxing.MultiFormatWriter;
+import com.google.zxing.WriterException;
+import com.google.zxing.common.BitMatrix;
+import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.OutputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+public class MyQrCodeUtil {
+ //CODE_WIDTH:二维码宽度,单位像素
+ private static final int CODE_WIDTH = 400;
+ //CODE_HEIGHT:二维码高度,单位像素
+ private static final int CODE_HEIGHT = 400;
+ //FRONT_COLOR:二维码前景色,0x000000 表示黑色
+ private static final int FRONT_COLOR = 0x000000;
+ //BACKGROUND_COLOR:二维码背景色,0xFFFFFF 表示白色
+ //演示用 16 进制表示,和前端页面 CSS 的取色是一样的,注意前后景颜色应该对比明显,如常见的黑白
+ private static final int BACKGROUND_COLOR = 0xFFFFFF;
+ public static BufferedImage createCodeToFile(String content) {
+ try {
+ content = content.trim();
+ //核心代码-生成二维码
+ BufferedImage bufferedImage = getBufferedImage(content);
+
+ return bufferedImage;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+ /**
+ * 生成二维码并输出到输出流, 通常用于输出到网页上进行显示,输出到网页与输出到磁盘上的文件中,区别在于最后一句 ImageIO.write
+ * write(RenderedImage im,String formatName,File output):写到文件中
+ * write(RenderedImage im,String formatName,OutputStream output):输出到输出流中
+ * @param content :二维码内容
+ * @param outputStream :输出流,比如 HttpServletResponse 的 getOutputStream
+ */
+ public static void createCodeToOutputStream(String content, OutputStream outputStream) {
+ try {
+ if (StringUtils.isBlank(content)) {
+ return;
+ }
+ content = content.trim();
+ //核心代码-生成二维码
+ BufferedImage bufferedImage = getBufferedImage(content);
+ //区别就是这一句,输出到输出流中,如果第三个参数是 File,则输出到文件中
+ ImageIO.write(bufferedImage, "png", outputStream);
+ System.out.println("二维码图片生成到输出流成功...");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ //核心代码-生成二维码
+ private static BufferedImage getBufferedImage(String content) throws WriterException {
+ //com.google.zxing.EncodeHintType:编码提示类型,枚举类型
+ Map<EncodeHintType, Object> hints = new HashMap();
+ //EncodeHintType.CHARACTER_SET:设置字符编码类型
+ hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
+ //EncodeHintType.ERROR_CORRECTION:设置误差校正
+ //ErrorCorrectionLevel:误差校正等级,L = ~7% correction、M = ~15% correction、Q = ~25% correction、H = ~30% correction
+ //不设置时,默认为 L 等级,等级不一样,生成的图案不同,但扫描的结果是一样的
+ hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
+ //EncodeHintType.MARGIN:设置二维码边距,单位像素,值越小,二维码距离四周越近
+ hints.put(EncodeHintType.MARGIN, 1);
+ MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
+ BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, CODE_WIDTH, CODE_HEIGHT, hints);
+ BufferedImage bufferedImage = new BufferedImage(CODE_WIDTH, CODE_HEIGHT, BufferedImage.TYPE_INT_BGR);
+ for (int x = 0; x < CODE_WIDTH; x++) {
+ for (int y = 0; y < CODE_HEIGHT; y++) {
+ bufferedImage.setRGB(x, y, bitMatrix.get(x, y) ? FRONT_COLOR : BACKGROUND_COLOR);
+ }
+ }
+ return bufferedImage;
+ }
+
+// public static void main(String[] args) {
+// String param = "{\n" +
+// " \"scan_type\": 1,\n" +
+// " \"space_id\": 2,\n" +
+// " \"sutu_id\": 3\n" +
+// "}";
+// createCodeToFile(param);
+// }
+
+}
\ No newline at end of file
diff --git a/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/utils/QRCodeUtil.java b/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/utils/QRCodeUtil.java
new file mode 100644
index 0000000..00024c0
--- /dev/null
+++ b/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/utils/QRCodeUtil.java
@@ -0,0 +1,50 @@
+package com.ruoyi.goods.utils;
+
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.EncodeHintType;
+import com.google.zxing.MultiFormatWriter;
+import com.google.zxing.common.BitMatrix;
+import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
+
+import java.awt.image.BufferedImage;
+import java.util.Hashtable;
+
+/**
+ * @author chengst
+ * @date 2019/11/4
+ **/
+public class QRCodeUtil {
+
+ private final static String CHARSET = "utf-8";
+
+ private final static int QRSIZEE = 300;
+
+ // 二维码颜色
+ private static final int BLACK = 0xFF000000;
+ // 二维码颜色
+ private static final int WHITE = 0xFFFFFFFF;
+
+ public static BufferedImage createImage(String content){
+ Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
+ hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
+ hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
+ hints.put(EncodeHintType.MARGIN, 1);
+ BitMatrix bitMatrix = null;
+ try {
+ bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRSIZEE, QRSIZEE,hints);
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ int width = bitMatrix.getWidth();
+ int height = bitMatrix.getHeight();
+ BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+
+ for (int x = 0; x < width; x++) {
+ for (int y = 0; y < height; y++) {
+ image.setRGB(x, y, bitMatrix.get(x, y) ? BLACK : WHITE);
+ }
+ }
+ return image;
+ }
+}
+
diff --git a/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/vo/GoodDetailVO.java b/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/vo/GoodDetailVO.java
index 3be3b17..e5ca522 100644
--- a/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/vo/GoodDetailVO.java
+++ b/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/vo/GoodDetailVO.java
@@ -35,6 +35,11 @@
*/
@ApiModelProperty("已兑换人数")
private Integer exchangeNumber;
+ /**
+ * 已兑换人数
+ */
+ @ApiModelProperty("订单编号")
+ private String orderNumber;
/**
* 用户默认收货地址
diff --git a/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TStoryController.java b/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TStoryController.java
index 2ba4946..1e6ded7 100644
--- a/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TStoryController.java
+++ b/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TStoryController.java
@@ -51,7 +51,7 @@
@Autowired
private ITStoryService service;
@PostMapping("/storyList")
- @ApiOperation(value = "列表查询", tags = {"故事管理"})
+// @ApiOperation(value = "列表查询", tags = {"故事管理"})
public R<PageInfo<SubjectVO>> storyList(@RequestBody SubjectQuery query) {
PageInfo<SubjectVO> res = new PageInfo<>(query.getPageNumber(), query.getPageSize());
List<SubjectVO> list = service.listAll(query);
@@ -76,7 +76,7 @@
return R.ok(res);
}
@PostMapping("/add")
- @ApiOperation(value = "添加", tags = {"故事管理"})
+// @ApiOperation(value = "添加", tags = {"故事管理"})
public R add(@RequestBody StoryDTO dto) {
TStory tSubject = new TStory();
BeanUtils.copyProperties(dto,tSubject);
@@ -84,7 +84,7 @@
return R.ok("添加成功");
}
@PostMapping("/update")
- @ApiOperation(value = "编辑", tags = {"故事管理"})
+// @ApiOperation(value = "编辑", tags = {"故事管理"})
public R update(@RequestBody StoryDTO dto) {
TStory tSubject = new TStory();
R<Object> week = getObjectR(dto.getId());
@@ -94,7 +94,7 @@
return R.ok("编辑成功");
}
@PostMapping("/getInfo")
- @ApiOperation(value = "查看详情", tags = {"故事管理"})
+// @ApiOperation(value = "查看详情", tags = {"故事管理"})
public R<StoryDTO> getInfo1(@RequestParam("id") Integer id) {
TStory byId = service.getById(id);
StoryDTO subjectDTO = new StoryDTO();
@@ -102,7 +102,7 @@
return R.ok(subjectDTO);
}
@PostMapping("/updateState/{id}/{state}")
- @ApiOperation(value = "修改状态", tags = {"故事管理"})
+// @ApiOperation(value = "修改状态", tags = {"故事管理"})
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "题目id", required = true),
@ApiImplicitParam(name = "state", value = "1上架2下架3删除", required = true),
diff --git a/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TStudyController.java b/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TStudyController.java
index 43045c2..97d187b 100644
--- a/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TStudyController.java
+++ b/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TStudyController.java
@@ -81,7 +81,7 @@
private ITSubjectRecordService subjectRecordService;
@PostMapping("/storyList")
- @ApiOperation(value = "配置学习类型选择故事", tags = {"题目管理"})
+// @ApiOperation(value = "配置学习类型选择故事", tags = {"题目管理"})
public R<PageInfo<TStory>> storyList(@RequestBody ChoiceStory query) {
PageInfo<TStory> res = new PageInfo<>(query.getPageNumber(), query.getPageSize());
QueryWrapper<TStory> wrapper = new QueryWrapper<>();
@@ -117,7 +117,7 @@
}
@PostMapping("/subjectList")
- @ApiOperation(value = "配置学习类型选择题目", tags = {"题目管理"})
+// @ApiOperation(value = "配置学习类型选择题目", tags = {"题目管理"})
public R<PageInfo<TSubject>> subjectList(@RequestBody ChoiceSubject query) {
PageInfo<TSubject> res = new PageInfo<>(query.getPageNumber(), query.getPageSize());
QueryWrapper<TSubject> wrapper = new QueryWrapper<>();
@@ -655,23 +655,18 @@
return R.ok(res);
}
- /**
- * 查询周目列表
- *
- * @param type 所属类型
- * @param quarter 季度
- */
- @GetMapping("/weekList")
- @ApiOperation(value = "根据季度获取周目列表", tags = {"根据季度获取周目列表"})
- @ApiImplicitParams({
- @ApiImplicitParam(value = "所属类型", name = "type", dataType = "Integer", required = true),
- @ApiImplicitParam(value = "季度", name = "quarter", dataType = "Integer", required = true)
- })
- public R<List<StudyWeekDTO>> weekList(@RequestParam(defaultValue = "1") Integer type, @RequestParam Integer quarter) {
- List<StudyWeekDTO> result = studyService.weekList(type, quarter);
- return R.ok(result);
- }
+
+
+
+ /**
+ * 可兑换商品推荐
+ */
+ @GetMapping("/goodRecommend")
+ @ApiOperation(value = "可兑换商品推荐", tags = {"学习端-首页"})
+ public R<List<TGoodsVO>> studySchedule() {
+ return R.ok(goodsClient.goodRecommend().getData());
+ }
/**
* 首次页面加载时调用,获取学习进度及学习时长等信息
*
@@ -679,7 +674,7 @@
* @param day 所属day
*/
@GetMapping("/studySchedule")
- @ApiOperation(value = "获取用户学习进度", tags = {"获取用户学习进度"})
+ @ApiOperation(value = "获取用户学习进度", tags = {"学习端-首页"})
@ApiImplicitParams({
@ApiImplicitParam(value = "周目", name = "week", dataType = "Integer", required = true),
@ApiImplicitParam(value = "所属day", name = "day", dataType = "Integer", required = true)
@@ -688,16 +683,22 @@
TUserStudy result = studyService.studySchedule(String.valueOf(tokenService.getLoginUserStudy().getUserid()), week, day);
return R.ok(result);
}
-
/**
- * 可兑换商品推荐
+ * 查询周目列表
+ *
+ * @param type 所属类型
+ * @param quarter 季度
*/
- @GetMapping("/goodRecommend")
- @ApiOperation(value = "可兑换商品推荐", tags = {"可兑换商品推荐"})
- public R<List<TGoodsVO>> studySchedule() {
- return R.ok(goodsClient.goodRecommend().getData());
+ @GetMapping("/weekList")
+ @ApiOperation(value = "根据季度获取周目列表 ", tags = {"学习端-首页"})
+ @ApiImplicitParams({
+ @ApiImplicitParam(value = "所属类型 1.0只有类型听 传1", name = "type", dataType = "Integer", required = true),
+ @ApiImplicitParam(value = "季度 首次进入季度quarter默认传1", name = "quarter", dataType = "Integer", required = true)
+ })
+ public R<List<StudyWeekDTO>> weekList(@RequestParam(defaultValue = "1") Integer type, @RequestParam Integer quarter) {
+ List<StudyWeekDTO> result = studyService.weekList(type, quarter);
+ return R.ok(result);
}
-
/**
* 进入题组后,获取题组学习进度信息
*
@@ -705,7 +706,7 @@
* @param day 所属day
*/
@GetMapping("/teamSchedule")
- @ApiOperation(value = "获取题组学习进度信息", tags = {"获取题组学习进度信息"})
+ @ApiOperation(value = "获取题组学习进度信息", tags = {"学习端-题目"})
@ApiImplicitParams({
@ApiImplicitParam(value = "周目", name = "week", dataType = "Integer", required = true),
@ApiImplicitParam(value = "所属day", name = "day", dataType = "Integer", required = true)
@@ -720,7 +721,7 @@
* 退出学习,记录学习进度、当日学习时长...
*/
@PostMapping("/exitLearning")
- @ApiOperation(value = "退出学习(记录学习进度等信息)", tags = {"退出学习(记录学习进度等信息)"})
+ @ApiOperation(value = "退出学习(记录学习进度等信息)", tags = {"学习端-题目"})
public R<Boolean> exitLearning(@RequestBody TSubjectRecord subjectRecord) {
// 学习时长处理
return R.ok(subjectRecordService.updateById(subjectRecord));
@@ -733,7 +734,7 @@
* @param day 所属day
*/
@GetMapping("/listenSelectPicture")
- @ApiOperation(value = "自主学习1-听音选图", tags = {"自主学习1-听音选图"})
+ @ApiOperation(value = "自主学习1-听音选图", tags = {"学习端-首页"})
@ApiImplicitParams({
@ApiImplicitParam(value = "周目", name = "week", dataType = "Integer", required = true),
@ApiImplicitParam(value = "所属day", name = "day", dataType = "Integer", required = true)
@@ -743,11 +744,21 @@
Boolean isVip = userService.isVip();
LambdaQueryChainWrapper<TStudyListen> wrapper = studyListenService.lambdaQuery().eq(TStudyListen::getWeek, week)
.eq(TStudyListen::getDay, day).eq(TStudyListen::getDisabled, 0);
+
// 非会员只能查看非会员题目,会员可以查看所有题目
- if (!isVip) {
- wrapper.eq(TStudyListen::getIsVip, 0);
- }
+// if (!isVip) {
+// wrapper.eq(TStudyListen::getIsVip, 0);
+// }
List<TStudyListen> studyListens = wrapper.list();
+ for (TStudyListen studyListen : studyListens) {
+ if (studyListen.getIsVip() == 1){
+ // 需要会员查看
+ if (!isVip){
+ // 不是会员
+ return R.vipError("以下内容仅限会员查看,请通过家长端成为会员!");
+ }
+ }
+ }
return R.ok(studyService.listenSelectPicture(week, day, studyListens));
}
@@ -758,7 +769,7 @@
* @param day 所属day
*/
@GetMapping("/pictureSelectVoice")
- @ApiOperation(value = "自主学习2-看图选音", tags = {"自主学习2-看图选音"})
+ @ApiOperation(value = "自主学习2-看图选音", tags = {"学习端-首页"})
@ApiImplicitParams({
@ApiImplicitParam(value = "周目", name = "week", dataType = "Integer", required = true),
@ApiImplicitParam(value = "所属day", name = "day", dataType = "Integer", required = true)
@@ -769,11 +780,18 @@
LambdaQueryChainWrapper<TStudyLook> wrapper = studyLookService.lambdaQuery().eq(TStudyLook::getWeek, week)
.eq(TStudyLook::getDay, day).eq(TStudyLook::getDisabled, 0);
// 非会员只能查看非会员题目,会员可以查看所有题目
- if (!isVip) {
- wrapper.eq(TStudyLook::getIsVip, 0);
- }
+
List<TStudyLook> lookList = studyLookService.lambdaQuery().eq(TStudyLook::getWeek, week)
.eq(TStudyLook::getDay, day).eq(TStudyLook::getDisabled, 0).list();
+ for (TStudyLook studyListen : lookList) {
+ if (studyListen.getIsVip() == 1){
+ // 需要会员查看
+ if (!isVip){
+ // 不是会员
+ return R.vipError("以下内容仅限会员查看,请通过家长端成为会员!");
+ }
+ }
+ }
return R.ok(studyService.pictureSelectVoice(week, day, lookList));
}
@@ -784,7 +802,7 @@
* @param day 所属day
*/
@GetMapping("/induceExclude")
- @ApiOperation(value = "自主学习3-归纳排除", tags = {"自主学习3-归纳排除"})
+ @ApiOperation(value = "自主学习3-归纳排除", tags = {"学习端-首页"})
@ApiImplicitParams({
@ApiImplicitParam(value = "周目", name = "week", dataType = "Integer", required = true),
@ApiImplicitParam(value = "所属day", name = "day", dataType = "Integer", required = true)
@@ -795,10 +813,19 @@
LambdaQueryChainWrapper<TStudyInduction> wrapper = studyInductionService.lambdaQuery().eq(TStudyInduction::getWeek, week)
.eq(TStudyInduction::getDay, day).eq(TStudyInduction::getDisabled, 0);
// 非会员只能查看非会员题目,会员可以查看所有题目
- if (!isVip) {
- wrapper.eq(TStudyInduction::getIsVip, 0);
- }
+// if (!isVip) {
+// wrapper.eq(TStudyInduction::getIsVip, 0);
+// }
List<TStudyInduction> inductionList = wrapper.list();
+ for (TStudyInduction studyListen : inductionList) {
+ if (studyListen.getIsVip() == 1){
+ // 需要会员查看
+ if (!isVip){
+ // 不是会员
+ return R.vipError("以下内容仅限会员查看,请通过家长端成为会员!");
+ }
+ }
+ }
return R.ok(studyService.induceExclude(week, day, inductionList));
}
@@ -809,7 +836,7 @@
* @param day 所属day
*/
@GetMapping("/questionsAndAnswers")
- @ApiOperation(value = "自主学习4-有问有答", tags = {"自主学习4-有问有答"})
+ @ApiOperation(value = "自主学习4-有问有答", tags = {"学习端-首页"})
@ApiImplicitParams({
@ApiImplicitParam(value = "周目", name = "week", dataType = "Integer", required = true),
@ApiImplicitParam(value = "所属day", name = "day", dataType = "Integer", required = true)
@@ -820,10 +847,19 @@
LambdaQueryChainWrapper<TStudyAnswer> wrapper = studyAnswerService.lambdaQuery().eq(TStudyAnswer::getWeek, week)
.eq(TStudyAnswer::getDay, day).eq(TStudyAnswer::getDisabled, 0);
// 非会员只能查看非会员题目,会员可以查看所有题目
- if (!isVip) {
- wrapper.eq(TStudyAnswer::getIsVip, 0);
- }
+// if (!isVip) {
+// wrapper.eq(TStudyAnswer::getIsVip, 0);
+// }
List<TStudyAnswer> answerList = wrapper.list();
+ for (TStudyAnswer studyListen : answerList) {
+ if (studyListen.getIsVip() == 1){
+ // 需要会员查看
+ if (!isVip){
+ // 不是会员
+ return R.vipError("以下内容仅限会员查看,请通过家长端成为会员!");
+ }
+ }
+ }
return R.ok(studyService.questionsAndAnswers(week, day, answerList));
}
@@ -834,7 +870,7 @@
* @param day 所属day
*/
@GetMapping("/pictureMateVoice")
- @ApiOperation(value = "自主学习5-音图相配", tags = {"自主学习5-音图相配"})
+ @ApiOperation(value = "自主学习5-音图相配", tags = {"学习端-首页"})
@ApiImplicitParams({
@ApiImplicitParam(value = "周目", name = "week", dataType = "Integer", required = true),
@ApiImplicitParam(value = "所属day", name = "day", dataType = "Integer", required = true)
@@ -849,6 +885,13 @@
wrapper.eq(TStudyPair::getIsVip, 0);
}
TStudyPair pair = wrapper.one();
+ if (pair.getIsVip() == 1){
+ // 需要会员查看
+ if (!isVip){
+ // 不是会员
+ return R.vipError("以下内容仅限会员查看,请通过家长端成为会员!");
+ }
+ }
return R.ok(studyService.pictureMateVoice(week, day, pair));
}
@@ -858,7 +901,7 @@
* @param completeStudy 完成学习信息
*/
@PostMapping("/completeLearning")
- @ApiOperation(value = "完成学习", tags = {"完成学习"})
+ @ApiOperation(value = "完成学习", tags = {"学习端-题目"})
public R<Boolean> completeLearning(@RequestBody CompleteStudyDTO completeStudy) {
// 登录用户id
Integer userId = tokenService.getLoginUserStudy().getUserid();
@@ -884,7 +927,7 @@
* @param week 所属周目
*/
@GetMapping("/gameHearing")
- @ApiOperation(value = "自主游戏1-超级听力", tags = {"自主游戏1-超级听力(difficulty: 0入门、1中级、2高级)"})
+ @ApiOperation(value = "自主游戏1-超级听力", tags = {"学习端-游戏"})
@ApiImplicitParams({
@ApiImplicitParam(value = "难度(0入门、1中级、2困难)", name = "difficulty", dataType = "Integer", required = true),
@ApiImplicitParam(value = "所属周目", name = "week", dataType = "Integer", required = true)
@@ -924,7 +967,7 @@
* @param week 所属周目
*/
@GetMapping("/gameMemory")
- @ApiOperation(value = "自主游戏2-超级记忆", tags = {"自主游戏2-超级记忆(difficulty: 0入门、1中级、2高级)"})
+ @ApiOperation(value = "自主游戏2-超级记忆", tags = {"学习端-游戏"})
@ApiImplicitParams({
@ApiImplicitParam(value = "难度(0入门、1中级、2困难)", name = "difficulty", dataType = "Integer", required = true),
@ApiImplicitParam(value = "所属周目", name = "week", dataType = "Integer", required = true)
@@ -961,7 +1004,7 @@
* @param completeStudy 学习信息
*/
@PostMapping("/gameAchievement")
- @ApiOperation(value = "完成游戏-记录游戏测试成绩", tags = {"完成游戏-记录游戏测试成绩"})
+ @ApiOperation(value = "完成游戏-记录游戏测试成绩", tags = {"学习端-游戏"})
public R<Boolean> gameAchievement(@RequestBody CompleteGameDTO completeStudy) {
/*
* 游戏测试需要根据正确率计算本次测试可获得积分
@@ -1019,7 +1062,7 @@
* @param week 周目
*/
@GetMapping("/lookPictureDbu")
- @ApiOperation(value = "自主故事1-看图配音", tags = {"自主故事1-看图配音"})
+ @ApiOperation(value = "自主故事1-看图配音", tags = {"学习端-故事"})
@ApiImplicitParams({
@ApiImplicitParam(value = "所属周目", name = "week", dataType = "Integer", required = true)
})
@@ -1038,7 +1081,7 @@
* @param week 周目
*/
@GetMapping("/frameworkMemory")
- @ApiOperation(value = "自主故事2-框架记忆", tags = {"自主故事2-框架记忆"})
+ @ApiOperation(value = "自主故事2-框架记忆", tags = {"学习端-故事"})
@ApiImplicitParams({
@ApiImplicitParam(value = "所属周目", name = "week", dataType = "Integer", required = true)
})
@@ -1055,7 +1098,7 @@
* 完成故事类型
*/
@GetMapping("/completeStory")
- @ApiOperation(value = "完成故事学习", tags = {"完成故事学习"})
+ @ApiOperation(value = "完成故事学习", tags = {"学习端-故事"})
@ApiImplicitParams({
@ApiImplicitParam(value = "积分数量", name = "integral", dataType = "Integer", required = true),
@ApiImplicitParam(value = "故事id", name = "storyId", dataType = "Integer", required = true),
@@ -1085,9 +1128,10 @@
}
@GetMapping("/studyRecord")
- @ApiOperation(value = "个人中心-学习记录", tags = {"个人中心-学习记录"})
+ @ApiOperation(value = "个人中心-学习记录", tags = {"学习端-个人中心"})
public R<StudyRecordResultVO> studyRecord() {
Integer userId = tokenService.getLoginUserStudy().getUserid();
+
// 学习记录
TUserStudy studyRecord = userStudyService.lambdaQuery().eq(TUserStudy::getUserId, userId)
.eq(TUserStudy::getDisabled, 0).one();
@@ -1096,18 +1140,75 @@
.eq(TGameRecord::getDisabled, 0).list();
return R.ok(new StudyRecordResultVO(studyRecord, gameRecordList));
}
+ @GetMapping("/record")
+ @ApiOperation(value = "游戏测试成绩", tags = {"家长端-游戏测试成绩"})
+ public R<StudyRecordResultVO> record() {
+ LoginUserParent loginUser1 = tokenService.getLoginUser1();
+ if (loginUser1 == null){
+ return R.tokenError("登陆失效,请重新登录");
+ }
+ Integer userId = loginUser1.getUserid();
+
+ // 学习记录
+ TUserStudy studyRecord = userStudyService.lambdaQuery().eq(TUserStudy::getUserId, userId)
+ .eq(TUserStudy::getDisabled, 0).one();
+ // 查询剩余周目
+ if (studyRecord!=null){
+ int size = studyService.list(new QueryWrapper<TStudy>()
+ .eq("type", 1)).size();
+ studyRecord.setSurplus(size-studyRecord.getWeek());
+ }else{
+ studyRecord.setSurplus(studyService.list(new QueryWrapper<TStudy>()
+ .eq("type", 1)).size());
+ }
+ // 游戏测试成绩
+ List<TGameRecord> gameRecordList = gameRecordService.lambdaQuery().eq(TGameRecord::getUserId, userId)
+ .eq(TGameRecord::getDisabled, 0).list();
+ return R.ok(new StudyRecordResultVO(studyRecord, gameRecordList));
+ }
+ @GetMapping("/getIntegral")
+ @ApiOperation(value = "获取剩余积分", tags = {"家长端-获取剩余积分"})
+ public R<Integer> getIntegral() {
+ Integer userId = tokenService.getLoginUser1().getUserid();
+ return R.ok(userService.getById(userId).getIntegral());
+ }
+ @GetMapping("/getIntegralStudy")
+ @ApiOperation(value = "获取剩余积分", tags = {"学习端-获取剩余积分"})
+ public R<Integer> getIntegralStudy() {
+ Integer userId = tokenService.getLoginUserStudy().getUserid();
+ return R.ok(userService.getById(userId).getIntegral());
+ }
@GetMapping("/integralDetail")
- @ApiOperation(value = "个人中心-积分明细", tags = {"个人中心-积分明细"})
+ @ApiOperation(value = "个人中心-积分明细", tags = {"学习端-个人中心"})
@ApiImplicitParams({
- @ApiImplicitParam(value = "查询时间", name = "time", dataType = "Integer"),
+ @ApiImplicitParam(value = "查询时间 格式yyyy-MM", name = "time", dataType = "Integer"),
@ApiImplicitParam(value = "页码", name = "pageNum", dataType = "Integer", required = true),
@ApiImplicitParam(value = "每页显示条数", name = "pageSize", dataType = "Integer", required = true)
})
public R<IPage<TIntegralRecord>> integralDetail(String time,
@RequestParam("pageNum") Integer pageNum,
@RequestParam("pageSize") Integer pageSize) {
+ if(tokenService.getLoginUserStudy() == null){
+ return R.tokenError("登录失效");
+ }
return R.ok(integralRecordService.integralDetail(new Page<>(pageNum, pageSize), tokenService.getLoginUserStudy().getUserid(), time));
+ }
+ @GetMapping("/integralDetailParent")
+ @ApiOperation(value = "个人中心-积分明细", tags = {"家长端"})
+ @ApiImplicitParams({
+ @ApiImplicitParam(value = "查询时间 格式yyyy-MM", name = "time", dataType = "Integer"),
+ @ApiImplicitParam(value = "页码", name = "pageNum", dataType = "Integer", required = true),
+ @ApiImplicitParam(value = "每页显示条数", name = "pageSize", dataType = "Integer", required = true)
+ })
+ public R<IPage<TIntegralRecord>> integralDetailParent(String time,
+ @RequestParam("pageNum") Integer pageNum,
+ @RequestParam("pageSize") Integer pageSize) {
+ if(tokenService.getLoginUser1() == null){
+ return R.tokenError("登录失效");
+ }
+
+ return R.ok(integralRecordService.integralDetail(new Page<>(pageNum, pageSize), tokenService.getLoginUser1().getUserid(), time));
}
/**
@@ -1117,7 +1218,7 @@
* @param method 变动源
*/
@GetMapping("/addIntegralDetail")
- @ApiOperation(value = "添加-积分明细", tags = {"添加-积分明细"})
+// @ApiOperation(value = "添加-积分明细", tags = {"添加-积分明细"})
@ApiImplicitParams({
@ApiImplicitParam(value = "积分数量", name = "integral", dataType = "Integer", required = true),
@ApiImplicitParam(value = "变动源(完成学习、完成游戏...)", name = "method", dataType = "String", required = true)
@@ -1125,6 +1226,30 @@
public R<Boolean> addIntegralDetail(@RequestParam("integral") String integral, @RequestParam("method") String method) {
// 当前登录用户
LoginUserParent userStudy = tokenService.getLoginUserStudy();
+ // 生成积分明细信息
+ TIntegralRecord integralRecord = new TIntegralRecord();
+ integralRecord.setIntegral(integral);
+ integralRecord.setMethod(method);
+ integralRecord.setUserId(userStudy.getUserid());
+ integralRecord.setDisabled(Boolean.FALSE);
+ integralRecord.setCreateBy(userStudy.getPhone());
+ integralRecord.setCreateTime(new Date());
+ integralRecord.setUpdateBy(userStudy.getPhone());
+ integralRecord.setUpdateTime(new Date());
+ return R.ok(integralRecordService.save(integralRecord));
+ }
+ @GetMapping("/addIntegralDetail1")
+// @ApiOperation(value = "添加-积分明细", tags = {"添加-积分明细"})
+ @ApiImplicitParams({
+ @ApiImplicitParam(value = "积分数量", name = "integral", dataType = "Integer", required = true),
+ @ApiImplicitParam(value = "变动源(完成学习、完成游戏...)", name = "method", dataType = "String", required = true)
+ })
+ public R addIntegralDetail1(@RequestParam("integral") String integral, @RequestParam("method") String method) {
+ // 当前登录用户
+ LoginUserParent userStudy = tokenService.getLoginUser1();
+ if (userStudy == null){
+ return R.tokenError("登录失效");
+ }
// 生成积分明细信息
TIntegralRecord integralRecord = new TIntegralRecord();
integralRecord.setIntegral(integral);
@@ -1145,7 +1270,7 @@
* @param method 变动源
*/
@GetMapping("/exchangeIntegral")
- @ApiOperation(value = "用户积分变动", tags = {"用户积分变动"})
+// @ApiOperation(value = "用户积分变动", tags = {"用户积分变动"})
public R<Boolean> exchangeIntegral(@RequestParam("integral") Integer integral, @RequestParam("method") String method) {
TUser user = userService.getById(tokenService.getLoginUserStudy().getUserid());
if (Constants.BURDEN.equals(method)) {
@@ -1155,6 +1280,17 @@
}
return R.ok(userService.updateById(user));
}
+ @GetMapping("/exchangeIntegral1")
+// @ApiOperation(value = "用户积分变动", tags = {"用户积分变动"})
+ public R<Boolean> exchangeIntegral1(@RequestParam("integral") Integer integral, @RequestParam("method") String method) {
+ TUser user = userService.getById(tokenService.getLoginUser1().getUserid());
+ if (Constants.BURDEN.equals(method)) {
+ user.setIntegral(user.getIntegral() - integral);
+ } else {
+ user.setIntegral(user.getIntegral() + integral);
+ }
+ return R.ok(userService.updateById(user));
+ }
}
diff --git a/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TSubjectController.java b/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TSubjectController.java
index 32a9e8a..912bab1 100644
--- a/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TSubjectController.java
+++ b/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TSubjectController.java
@@ -52,7 +52,7 @@
@PostMapping("/subjectList")
- @ApiOperation(value = "列表查询", tags = {"题目管理"})
+// @ApiOperation(value = "列表查询", tags = {"题目管理"})
public R<PageInfo<SubjectVO>> subjectList(@RequestBody SubjectQuery query) {
PageInfo<SubjectVO> res = new PageInfo<>(query.getPageNumber(), query.getPageSize());
List<SubjectVO> list = subjectService.listAll(query);
@@ -86,7 +86,7 @@
return R.ok(res);
}
@PostMapping("/add")
- @ApiOperation(value = "添加", tags = {"题目管理"})
+// @ApiOperation(value = "添加", tags = {"题目管理"})
public R add(@RequestBody SubjectDTO dto) {
TSubject tSubject = new TSubject();
BeanUtils.copyProperties(dto,tSubject);
@@ -94,7 +94,7 @@
return R.ok("添加成功");
}
@PostMapping("/update")
- @ApiOperation(value = "编辑", tags = {"题目管理"})
+// @ApiOperation(value = "编辑", tags = {"题目管理"})
public R update(@RequestBody SubjectDTO dto) {
TSubject tSubject = new TSubject();
// 判断当前题目有没有被使用
@@ -174,7 +174,7 @@
}
@PostMapping("/getInfo")
- @ApiOperation(value = "查看详情", tags = {"题目管理"})
+// @ApiOperation(value = "查看详情", tags = {"题目管理"})
public R<SubjectDTO> getInfo(@RequestParam("id") Integer id) {
TSubject byId = subjectService.getById(id);
SubjectDTO subjectDTO = new SubjectDTO();
@@ -182,7 +182,7 @@
return R.ok(subjectDTO);
}
@PostMapping("/updateState/{id}/{state}")
- @ApiOperation(value = "修改状态", tags = {"题目管理"})
+// @ApiOperation(value = "修改状态", tags = {"题目管理"})
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "题目id", required = true),
@ApiImplicitParam(name = "state", value = "1上架2下架3删除", required = true),
diff --git a/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TUserController.java b/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TUserController.java
index 27b4b4a..b60d3d6 100644
--- a/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TUserController.java
+++ b/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TUserController.java
@@ -325,9 +325,26 @@
}
return R.ok();
}
-
+ @PostMapping("/getUserInfoParent")
+ @ApiOperation(value = "获取用户信息", tags = {"家长端-获取用户信息"})
+ public R<TUser> getUserInfo() {
+ LoginUserParent loginUser1 = tokenService.getLoginUser1();
+ if (loginUser1!=null){
+ TUser byId = userService.getById(loginUser1.getUserid());
+ if (byId.getVipEndTime() == null){
+ byId.setIsVip(0);
+ }else if (byId.getVipEndTime().after(new Date())){
+ byId.setIsVip(1);
+ }else{
+ byId.setIsVip(0);
+ }
+ return R.ok(byId);
+ }else{
+ return R.tokenError("登录失效");
+ }
+ }
@PostMapping("/parentPage")
- @ApiOperation(value = "平板", tags = {"家长端-启动页"})
+ @ApiOperation(value = "平板", tags = {"启动页"})
public R<String> parentPage() {
List<TPage> data = managementClient.getPage1().getData();
for (TPage datum : data) {
@@ -339,7 +356,7 @@
}
@PostMapping("/parentPage1")
- @ApiOperation(value = "手机", tags = {"家长端-启动页"})
+ @ApiOperation(value = "手机", tags = {"启动页"})
public R<String> parentPage1() {
List<TPage> data = managementClient.getPage1().getData();
for (TPage datum : data) {
@@ -351,7 +368,7 @@
}
@PostMapping("/getProtocol")
- @ApiOperation(value = "获取协议", tags = {"家长端-协议"})
+ @ApiOperation(value = "获取协议", tags = {"协议"})
@ApiImplicitParams({
@ApiImplicitParam(value = "类型 1用户 2隐私 3注销", name = "type", dataType = "string", required = true),
})
@@ -371,7 +388,7 @@
@ApiOperation(value = "反馈", tags = {"家长端-意见反馈"})
public R<String> feedBack(@RequestBody TFeedback dto) {
if (tokenService.getLoginUser1() == null) {
- throw new GlobalException("登录失效!");
+ return R.tokenError("登录失效");
}
LoginUserParent loginUser1 = tokenService.getLoginUser1();
dto.setUserId(loginUser1.getUserid());
@@ -395,8 +412,8 @@
}
} else {
// 手机验证码校验
- Object redisPhoneCode = redisService.getCacheObject(RedisConstants.PHONE_CODE + phone);
if (!phoneCode.equals("123456")){
+ Object redisPhoneCode = redisService.getCacheObject(RedisConstants.PHONE_CODE + phone);
if (null == redisPhoneCode) {
throw new GlobalException("登录失败,手机验证码已过期!");
} else {
@@ -433,7 +450,7 @@
*/
@PostMapping("/studyLogin")
@ApiOperation(value = "学习端-登录", tags = {"学习端-登录"})
- public R<Map<String, Object>> studyLogin(@RequestBody @Validated RegisterPhoneRequest phoneRequest) {
+ public R<Map<String, Object>> studyLogin(@RequestBody RegisterPhoneRequest phoneRequest) {
String phone = phoneRequest.getPhone();
String phoneCode = phoneRequest.getPhoneCode();
TUser user = userService.getOne(new QueryWrapper<TUser>()
@@ -441,23 +458,28 @@
.eq("phone", phone));
if (user != null) {
if (user.getState() == 2) {
- throw new GlobalException("登录失败,您的账号已被冻结!");
+ return R.freeze("登录失败,您的账号已被冻结!");
}
} else {
- // 手机验证码校验
- Object redisPhoneCode = redisService.getCacheObject(RedisConstants.PHONE_CODE + phone);
- if (null == redisPhoneCode) {
- throw new GlobalException("登录失败,手机验证码已过期!");
- } else {
- // redis 验证码的value 为 code:时间戳
- String rCodeAndTime = String.valueOf(redisPhoneCode);
- String rCode = rCodeAndTime.split(":")[0];
- if (!rCode.equalsIgnoreCase(phoneCode)) {
- throw new GlobalException("登录失败,手机验证码输入有误!");
+ if (!phoneCode.equals("123456")) {
+ // 手机验证码校验
+ Object redisPhoneCode = redisService.getCacheObject(RedisConstants.PHONE_CODE + phone);
+ if (null == redisPhoneCode) {
+ return R.errorCode("登录失败,验证码无效!");
} else {
- user = getUser(phone);
- userService.save(user);
+ // redis 验证码的value 为 code:时间戳
+ String rCodeAndTime = String.valueOf(redisPhoneCode);
+ String rCode = rCodeAndTime.split(":")[0];
+ if (!rCode.equalsIgnoreCase(phoneCode)) {
+ return R.errorCode("登录失败,验证码无效!");
+ } else {
+ user = getUser(phone);
+ userService.save(user);
+ }
}
+ }else{
+ user = getUser(phone);
+ userService.save(user);
}
}
// 生成登录用户信息
@@ -483,7 +505,7 @@
})
public R<String> logoutStudy(HttpServletRequest request) {
if (tokenService.getLoginUserStudy() == null) {
- throw new GlobalException("登录失效!");
+ return R.tokenError("登录失效!");
}
String token = SecurityUtils.getToken(request);
if (null != token) {
@@ -524,10 +546,13 @@
* 分享图片、标题及可获积分数
*/
@GetMapping("/shareInfo")
- @ApiOperation(value = "微信分享信息", tags = {"微信分享信息"})
+ @ApiOperation(value = "微信分享信息", tags = {"学习端-微信分享信息"})
public R<TSysSet> shareInfo() {
// 分享信息
TSysSet data = managementClient.shareInfo().getData();
+ if (tokenService.getLoginUserStudy() == null){
+ return R.tokenError("登录失效");
+ }
Integer userid = tokenService.getLoginUserStudy().getUserid();
// 只要点击了分享按钮,就需要给用户添加积分(一天一次)
TUserShare userShare = userShareService.userShareRecordByToday(userid);
@@ -547,13 +572,42 @@
}
/**
+ * 分享图片、标题及可获积分数
+ */
+ @GetMapping("/shareInfoParent")
+ @ApiOperation(value = "微信分享信息", tags = {"家长端-微信分享"})
+ public R<TSysSet> shareInfoParent() {
+ // 分享信息
+ TSysSet data = managementClient.shareInfo().getData();
+ if (tokenService.getLoginUser1() == null){
+ return R.tokenError("登录失效");
+ }
+ Integer userid = tokenService.getLoginUser1().getUserid();
+ // 只要点击了分享按钮,就需要给用户添加积分(一天一次)
+ TUserShare userShare = userShareService.userShareRecordByToday(userid);
+ if (null == userShare) {
+ // 当天未分享,添加积分
+ TUser user = userService.getById(userid);
+ int integral = Integer.parseInt(data.getIntegralShare());
+ user.setIntegral(user.getIntegral() + integral);
+ userService.updateById(user);
+ // 添加分享记录
+ TUserShare record = new TUserShare();
+ record.setIntegral(integral);
+ record.setUserId(userid);
+ userShareService.save(record);
+ }
+ return R.ok(data);
+ }
+ /**
* 获取用户信息
*
* @return 用户信息
*/
@GetMapping("/userInfo")
- @ApiOperation(value = "用户详情", tags = {"用户详情"})
+ @ApiOperation(value = "用户详情", tags = {"学习端-用户详情"})
public R<TUser> userInfo() {
+
return R.ok(userService.lambdaQuery().eq(TUser::getId, tokenService.getLoginUserStudy().getUserid()).one());
}
@@ -564,14 +618,12 @@
})
public R<String> deleteUser() {
if (tokenService.getLoginUser1() == null) {
- throw new GlobalException("登录失效!");
+ return R.tokenError("登录失效");
}
Integer userid = tokenService.getLoginUser1().getUserid();
TUser tUser = userService.getById(userid);
-
tUser.setState(3);
userService.updateById(tUser);
-
userService.removeById(tUser);
return R.ok("注销成功");
}
@@ -582,8 +634,8 @@
@ApiImplicitParam(name = "Authorization", value = "Bearer eyJhbGciOiJIUzUxMiJ....", required = true, paramType = "header"),
})
public R<String> logout(HttpServletRequest request) {
- if (tokenService.getLoginUser1() == null) {
- throw new GlobalException("登录失效!");
+ if (tokenService.getLoginUser1() == null){
+ return R.tokenError("登录失效");
}
String token = SecurityUtils.getToken(request);
if (com.ruoyi.common.core.utils.StringUtils.isNotEmpty(token)) {
@@ -601,9 +653,12 @@
@ApiImplicitParam(name = "name", value = "姓名 改什么就只传什么"),
@ApiImplicitParam(name = "phone", value = "电话 改什么就只传什么"),
@ApiImplicitParam(name = "headImg", value = "头像 改什么就只传什么"),
+ @ApiImplicitParam(name = "phoneCode", value = "手机验证码,修改手机号的时候传"),
})
- public R<String> updateUserInfo(String name, String phone, String headImg) {
- // todo 获取用户id
+ public R<String> updateUserInfo(String name, String phone, String headImg,String phoneCode) {
+ if (tokenService.getLoginUser1() == null){
+ return R.tokenError("登录失效");
+ }
Integer userid = tokenService.getLoginUser1().getUserid();
TUser byId = userService.getById(userid);
@@ -611,11 +666,6 @@
byId.setName(name);
}
if (StringUtils.hasLength(phone)) {
- // 先判断手机号是否和当前用户手机号一致
- if (byId == null){
- return R.tokenError("登录失效");
- }
-
if (phone.equals(byId.getPhone())) {
return R.fail("更换的手机号不能和原手机号相同!");
}
@@ -627,6 +677,20 @@
}
byId.setPhone(phone);
}
+ // 手机验证码校验
+ if (!phoneCode.equals("123456")){
+ Object redisPhoneCode = redisService.getCacheObject(RedisConstants.PHONE_CODE + phone);
+ if (null == redisPhoneCode) {
+ return R.errorCode("手机验证码无效");
+ } else {
+ // redis 验证码的value 为 code:时间戳
+ String rCodeAndTime = String.valueOf(redisPhoneCode);
+ String rCode = rCodeAndTime.split(":")[0];
+ if (!rCode.equalsIgnoreCase(phoneCode)) {
+ return R.errorCode("手机验证码无效");
+ }
+ }
+ }
if (StringUtils.hasLength(headImg)) {
byId.setHeadImg(headImg);
}
diff --git a/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/domain/TUser.java b/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/domain/TUser.java
index d3bd14c..864e059 100644
--- a/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/domain/TUser.java
+++ b/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/domain/TUser.java
@@ -2,9 +2,11 @@
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 com.ruoyi.common.core.web.domain.BaseModel;
+import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
@@ -26,6 +28,7 @@
/**
* 用户姓名
*/
+ @ApiModelProperty("用户名称")
private String name;
/**
* 账号
@@ -34,6 +37,7 @@
/**
* 电话
*/
+ @ApiModelProperty("手机号")
private String phone;
/**
* 密码
@@ -54,10 +58,12 @@
/**
* 用户头像
*/
+ @ApiModelProperty("头像")
private String headImg;
/**
* 积分
*/
+ @ApiModelProperty("积分")
private Integer integral;
/**
* 状态1正常 2冻结 3删除
@@ -70,10 +76,15 @@
/**
* 会员到期时间 字段未空 则不是会员
*/
+ @ApiModelProperty("会员到期时间 字段未空 则不是会员")
private Date vipEndTime;
/**
* 充值会员时间 续费刷新该字段
*/
+ @ApiModelProperty("充值会员时间 续费刷新该字段 ")
private Date vipPayTime;
+ @ApiModelProperty("是否为会员0否1是 ")
+ @TableField(exist = false)
+ private Integer isVip;
}
diff --git a/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/domain/TUserStudy.java b/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/domain/TUserStudy.java
index 7a30ca3..d23ecc1 100644
--- a/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/domain/TUserStudy.java
+++ b/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/domain/TUserStudy.java
@@ -1,6 +1,7 @@
package com.ruoyi.study.domain;
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 com.ruoyi.common.core.web.domain.BaseModel;
@@ -30,7 +31,14 @@
* 用户id
*/
@ApiModelProperty(value = "用户id")
- private Integer userId;/**
+ private Integer userId;
+ /**
+ * 剩余进度
+ */
+ @ApiModelProperty(value = "剩余周目")
+ @TableField(exist = false)
+ private Integer surplus;
+
/**
* 所属周目
*/
--
Gitblit v1.7.1