ruoyi-api/ruoyi-api-management/src/main/java/com/ruoyi/management/api/factory/TManagementFallbackFactory.java
@@ -4,6 +4,7 @@ import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.management.api.feignClient.ManagementClient; import com.ruoyi.management.api.model.TFeedback; import com.ruoyi.management.api.model.TSysSet; import com.ruoyi.management.api.model.TUseGuide; import com.ruoyi.management.api.model.TVipSet; import com.ruoyi.management.api.query.UseGuideQuery; @@ -54,6 +55,11 @@ } @Override public R<TSysSet> shareInfo() { return R.fail("获取分享信息失败"+cause.getMessage()); } }; } } ruoyi-api/ruoyi-api-management/src/main/java/com/ruoyi/management/api/feignClient/ManagementClient.java
@@ -4,13 +4,11 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.management.api.factory.TManagementFallbackFactory; import com.ruoyi.management.api.model.TFeedback; import com.ruoyi.management.api.model.TPage; import com.ruoyi.management.api.model.TUseGuide; import com.ruoyi.management.api.model.TVipSet; import com.ruoyi.management.api.model.*; import com.ruoyi.management.api.query.UseGuideQuery; import io.swagger.annotations.ApiOperation; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -35,4 +33,13 @@ @PostMapping("/tSysSet/agreement1/{type}") R<String> agreement1(@PathVariable("type") Integer type); /** * 获取分享图片、标题及可获积分数 * * @return 获取分享图片、标题及可获积分数 */ @GetMapping("/tSysSet/shareInfo") @ApiOperation(value = "获取分享图片、标题及可获积分数", tags = {"获取分享图片、标题及可获积分数"}) R<TSysSet> shareInfo(); } ruoyi-api/ruoyi-api-management/src/main/java/com/ruoyi/management/api/model/TSysSet.java
New file @@ -0,0 +1,60 @@ package com.ruoyi.management.api.model; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.ruoyi.common.core.web.domain.BaseModel; import lombok.Data; /** * <p> * 系统设置 * </p> * * @author 无关风月 * @since 2024-04-26 */ @TableName("t_sys_set") @Data public class TSysSet extends BaseModel { private static final long serialVersionUID = 1L; /** * 主键 */ @TableId(value = "id", type = IdType.AUTO) private Integer id; /** * 客服电话 多个逗号隔开 */ private String phone; /** * 分享设置 标题 */ private String title; /** * 分享设置 图片 */ private String img; /** * 音效设置 正确 */ private String correct; /** * 音效设置 错误 */ private String error; /** * 积分设置 每在线x分钟 */ private String time; /** * 积分设置 可获积分 */ private String integral; /** * 分享可获得积分 */ private String integralShare; } ruoyi-service/ruoyi-management/src/main/java/com/ruoyi/management/controller/TSysSetController.java
@@ -177,5 +177,12 @@ useGuideService.removeById(id); return AjaxResult.success("删除成功"); } @GetMapping("/shareInfo") @ApiOperation(value = "获取分享图片、标题及可获积分数", tags = {"获取分享图片、标题及可获积分数"}) public R<TSysSet> shareInfo() { return R.ok(sysSetService.lambdaQuery().one()); } } ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TStudyController.java
@@ -943,7 +943,7 @@ * @param completeStudy 完成学习信息 */ @PostMapping("/completeLearning") @ApiOperation(value = "完成学习", tags = {"完成学习"}) @ApiOperation(value = "完成学习", tags = {"完成学习/其他积分来源(分享...)"}) public AjaxResult<Boolean> completeLearning(@RequestBody CompleteStudyDTO completeStudy) { // 登录用户id Integer userId = tokenService.getLoginUserStudy().getUserid(); ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TUserController.java
@@ -12,17 +12,16 @@ import com.ruoyi.common.security.service.TokenService; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.management.api.feignClient.ManagementClient; import com.ruoyi.management.api.model.TFeedback; import com.ruoyi.management.api.model.TPage; import com.ruoyi.management.api.model.TUseGuide; import com.ruoyi.management.api.model.TVipSet; import com.ruoyi.management.api.model.*; import com.ruoyi.management.api.query.UseGuideQuery; import com.ruoyi.study.domain.TUser; import com.ruoyi.study.domain.TUserShare; import com.ruoyi.study.domain.TVipOrder; import com.ruoyi.study.dto.AppUserQuery; import com.ruoyi.study.dto.UserInfoQuery; import com.ruoyi.study.request.RegisterPhoneRequest; import com.ruoyi.study.service.ITUserService; import com.ruoyi.study.service.ITUserShareService; import com.ruoyi.study.service.IVipOrderService; import com.ruoyi.study.utils.PayMoneyUtil; import com.ruoyi.study.utils.UUIDUtil; @@ -65,6 +64,8 @@ private TokenService tokenService; @Resource private RedisService redisService; @Resource private ITUserShareService userShareService; @PostMapping("/vipInfo") @ApiOperation(value = "会员中心-获取会员说明、当前登录用户是否为会员、会员购买规格", tags = {"家长端-个人中心"}) @@ -301,6 +302,7 @@ } return AjaxResult.success(); } @PostMapping("/parentPage") @ApiOperation(value = "平板", tags = {"家长端-启动页"}) public AjaxResult<String> parentPage() { @@ -312,6 +314,7 @@ } return AjaxResult.success(); } @PostMapping("/parentPage1") @ApiOperation(value = "手机", tags = {"家长端-启动页"}) public AjaxResult<String> parentPage1() { @@ -323,6 +326,7 @@ } return AjaxResult.success(); } @PostMapping("/getProtocol") @ApiOperation(value = "获取协议", tags = {"家长端-协议"}) @ApiImplicitParams({ @@ -367,9 +371,21 @@ return AjaxResult.error("登录失败,您的账号已被冻结!"); } } else { // todo 验证码校验 // 手机验证码校验 Object redisPhoneCode = redisService.getCacheObject(RedisConstants.PHONE_CODE + phone); if (null == redisPhoneCode) { return AjaxResult.error("登录失败,手机验证码已过期!"); } else { // redis 验证码的value 为 code:时间戳 String rCodeAndTime = String.valueOf(redisPhoneCode); String rCode = rCodeAndTime.split(":")[0]; if (!rCode.equalsIgnoreCase(phoneCode)) { return AjaxResult.error("登录失败,手机验证码输入有误!"); } else { tUser1 = getUser(phone); userService.save(tUser1); } } } LoginUserParent loginUserParent = new LoginUserParent(); loginUserParent.setName(tUser1.getName()); @@ -455,17 +471,29 @@ } /** * 家长端 学习端都可用 * * @param url app网页链接 * 分享图片、标题及可获积分数 */ @GetMapping("/weiXinShare") @ApiOperation(value = "微信分享", tags = {"微信分享"}) @ApiImplicitParams({ @ApiImplicitParam(value = "应用分享url地址", name = "url", dataType = "string", required = true), }) public AjaxResult weiXinShare(@RequestParam String url) { return AjaxResult.success(userService.weiXinShare(url)); @GetMapping("/shareInfo") @ApiOperation(value = "微信分享信息", tags = {"微信分享信息"}) public AjaxResult shareInfo() { // 分享信息 TSysSet data = managementClient.shareInfo().getData(); Integer userid = tokenService.getLoginUserStudy().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 AjaxResult.success(); } @PostMapping("/deleteUser") @@ -544,6 +572,7 @@ userService.saveOrUpdate(byId); return AjaxResult.success("修改成功"); } @ResponseBody @PostMapping("/base/wxRefund") public void cancelMySiteCallback(HttpServletRequest request, HttpServletResponse response) { @@ -588,6 +617,7 @@ e.printStackTrace(); } } @PostMapping("/vipBack/{id}") @ApiOperation(value = "会员退款", tags = {"管理后台-会员退款"}) public R vipBack(@PathVariable("id") Integer id) throws AlipayApiException { ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/dto/CompleteStudyDTO.java
@@ -20,7 +20,7 @@ /** * 完成听故事、完成游戏、完成答题、完成每日学习、商城消费 */ @ApiModelProperty("完成听故事、完成游戏、完成答题、完成每日学习、商城消费") @ApiModelProperty("完成听故事、完成游戏、完成答题、完成每日学习、商城消费、分享") private String method; } ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/mapper/TUserShareMapper.java
@@ -1,7 +1,6 @@ package com.ruoyi.study.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.study.domain.TGame; import com.ruoyi.study.domain.TUserShare; /** @@ -14,4 +13,11 @@ */ public interface TUserShareMapper extends BaseMapper<TUserShare> { /** * 根据用户id和当日 * * @param userid 用户id * @return 用户分享记录 */ TUserShare userShareRecordByToday(Integer userid); } ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/ITUserService.java
@@ -7,7 +7,6 @@ import com.ruoyi.study.vo.AppUserVO; import java.util.List; import java.util.Map; /** * <p> @@ -36,11 +35,4 @@ */ Boolean isVip(); /** * 微信分享app * * @param url app网页链接 * @return 返回信息 */ Map<String, Object> weiXinShare(String url); } ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/ITUserShareService.java
@@ -1,7 +1,6 @@ package com.ruoyi.study.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.study.domain.TGame; import com.ruoyi.study.domain.TUserShare; /** @@ -14,4 +13,11 @@ */ public interface ITUserShareService extends IService<TUserShare> { /** * 根据用户id和当日 * * @param userid 用户id * @return 用户分享记录 */ TUserShare userShareRecordByToday(Integer userid); } ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/impl/TStudyServiceImpl.java
@@ -112,8 +112,12 @@ TStudyAnswer data = answerList.get(rand.nextInt(answerList.size())); // 获取问题题目 和 回答题目 Map<String, Object> result = new HashMap<>(8); List<String> ids = new ArrayList<>(); ids.add(String.valueOf(data.getSubject())); ids.add(String.valueOf(data.getAnswerSubject())); result.put("data", data); // todo 有问有答 // 有问有答 result.put("subject", getSubjects(ids.toArray(ids.toArray(new String[0])))); return result; } ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/impl/TUserServiceImpl.java
@@ -1,37 +1,22 @@ package com.ruoyi.study.service.impl; import cn.hutool.core.util.RandomUtil; import com.alibaba.fastjson2.JSONObject; 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.constant.TokenConstants; import com.ruoyi.common.core.exception.GlobalException; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.study.domain.TUser; import com.ruoyi.study.dto.AppUserQuery; import com.ruoyi.study.mapper.TUserMapper; import com.ruoyi.study.service.ITUserService; import com.ruoyi.study.utils.RandomVxUtil; import com.ruoyi.study.utils.SignatureUtil; import com.ruoyi.study.vo.AppUserVO; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.io.IOException; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; /** @@ -49,18 +34,6 @@ private RedisTemplate<String, Object> redisTemplate; @Resource private TokenService tokenService; /** * 微信公众号的appid */ @Value("wx.appId") private String appId; /** * 微信公众号的appSecret */ @Value("wx.secret") private String secret; @Override public List<AppUserVO> listAll(AppUserQuery query) { @@ -103,7 +76,7 @@ @Override public Boolean isVip() { TUser user = lambdaQuery().eq(TUser::getId, tokenService.getLoginUserStudy().getUserid()) .eq(TUser::getDisabled, 0).one(); .eq(TUser::getDisabled, 0).eq(TUser::getState,1).one(); // 是否为vip 逻辑 if (null == user) { return false; @@ -111,83 +84,6 @@ // vip过期时间,字段为空也表示 当前用户不是vip Date vipEndTime = user.getVipEndTime(); return null != vipEndTime && System.currentTimeMillis() <= vipEndTime.getTime(); } @Override public Map<String, Object> weiXinShare(String url) { // 初始化微信API,并注册AppID long timestamp = System.currentTimeMillis() / 1000; String noncestr = RandomVxUtil.createRandomString(16); String ticket = getTicket(getToken(appId, secret)); String str = "jsapi_ticket=" + ticket + "&noncestr=" + noncestr + "×tamp=" + timestamp + "&url=" + url; // 获取加密后的签名 String signature = SignatureUtil.getSignature(str); Map<String, Object> map = new HashMap<>(); map.put("appId", appId); map.put("timestamp", timestamp); map.put("nonceStr", noncestr); map.put("signature", signature); return map; } public String getToken(String appid, String secret) { //拼接访问地址 String apiUrl = String.format(TokenConstants.VX_TOKEN_API_PREFIX, appid, secret); HttpClient client = HttpClients.createDefault(); //get请求 HttpGet get = new HttpGet(apiUrl); // 初始化解析json格式的对象 String result = null; try { HttpResponse res = client.execute(get); // 初始化响应内容 String responseContent; HttpEntity entity = res.getEntity(); //设置编码格式 responseContent = EntityUtils.toString(entity, "UTF-8"); // 将json字符串转换为json对象 JSONObject json = JSONObject.parseObject(responseContent); if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { if (json.get(Constants.ERR_CODE) != null) { // 错误时微信会返回错误码等信息,{"errcode":40013,"errmsg":"invalid appid"} throw new GlobalException("微信授权失败!"); } else { // 正常情况下{"access_token":"ACCESS_TOKEN","expires_in":7200} result = String.valueOf(json.get("access_token")); } } return result; } catch (IOException e) { throw new GlobalException("微信授权失败!"); } } public static String getTicket(String accessToken) { String turl = String.format(TokenConstants.VX_TICKET_API_PREFIX, accessToken); HttpClient client = HttpClients.createDefault(); HttpGet get = new HttpGet(turl); String result = null; try { HttpResponse res = client.execute(get); // 响应内容 String responseContent; HttpEntity entity = res.getEntity(); responseContent = EntityUtils.toString(entity, "UTF-8"); JSONObject jsonObject = JSONObject.parseObject(responseContent); // 将json字符串转换为json对象 if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { if (jsonObject.get(Constants.ERR_CODE) == null) { // 错误时微信会返回错误码等信息,{"errcode":40013,"errmsg":"invalid appid"} throw new GlobalException("微信授权失败!"); } else { // 正常情况下{"access_token":"ACCESS_TOKEN","expires_in":7200} result = String.valueOf(jsonObject.get("ticket")); } } return result; } catch (IOException e) { throw new GlobalException("微信授权失败!"); } } } ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/impl/TUserShareServiceImpl.java
@@ -1,11 +1,8 @@ package com.ruoyi.study.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.study.domain.TGame; import com.ruoyi.study.domain.TUserShare; import com.ruoyi.study.mapper.TGameMapper; import com.ruoyi.study.mapper.TUserShareMapper; import com.ruoyi.study.service.ITGameService; import com.ruoyi.study.service.ITUserShareService; import org.springframework.stereotype.Service; @@ -20,4 +17,8 @@ @Service public class TUserShareServiceImpl extends ServiceImpl<TUserShareMapper, TUserShare> implements ITUserShareService { @Override public TUserShare userShareRecordByToday(Integer userid) { return baseMapper.userShareRecordByToday(userid); } } ruoyi-service/ruoyi-study/src/main/resources/mapper/sutdy/TUserShareMapper.xml
@@ -2,6 +2,9 @@ <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.study.mapper.TUserShareMapper"> <select id="userShareRecordByToday" resultType="com.ruoyi.study.domain.TUserShare"> SELECT integral, createTime FROM t_user_share WHERE DATE(createTime) = CURDATE() </select> </mapper>