44323
2024-05-21 781b5fea46cd55220b5ffca17aa6bb1b83551410
代码提交
28个文件已修改
13个文件已添加
1150 ■■■■ 已修改文件
ruoyi-api/ruoyi-api-management/src/main/java/com/ruoyi/management/api/factory/TManagementFallbackFactory.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-management/src/main/java/com/ruoyi/management/api/feignClient/ManagementClient.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-management/src/main/java/com/ruoyi/management/api/model/TFeedback.java 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-management/src/main/java/com/ruoyi/management/api/model/TUseGuide.java 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-management/src/main/java/com/ruoyi/management/api/query/UseGuideQuery.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-study/src/main/java/com/ruoyi/study/api/domain/TUserShare.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-study/src/main/java/com/ruoyi/study/api/dto/StoryDTO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-study/src/main/java/com/ruoyi/study/api/dto/SubjectDTO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-study/src/main/java/com/ruoyi/study/api/vo/SubjectVO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/LoginUserParent.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/SecurityConstants.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/JwtUtils.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthLogic.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthUtil.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-management/src/main/java/com/ruoyi/management/controller/OssController.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-management/src/main/java/com/ruoyi/management/controller/TFeedbackController.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-management/src/main/java/com/ruoyi/management/controller/TStudyController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-management/src/main/java/com/ruoyi/management/controller/TSysSetController.java 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-management/src/main/java/com/ruoyi/management/controller/TUserController.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-management/src/main/java/com/ruoyi/management/domain/TFeedback.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-management/src/main/java/com/ruoyi/management/domain/TUseGuide.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-management/src/main/java/com/ruoyi/management/mapper/TUseGuideMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-management/src/main/java/com/ruoyi/management/query/UseGuideQuery.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-management/src/main/java/com/ruoyi/management/service/ITUseGuideService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-management/src/main/java/com/ruoyi/management/utils/ObsUploadUtil.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-management/src/main/java/com/ruoyi/management/vo/VipSetVO.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-management/src/main/resources/mapper/management/src/main/resources/mapper/TUseGuideMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/config/DataUpdateHandlerConfig.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TStoryController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TSubjectController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TUserController.java 273 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/domain/TStory.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/domain/TUserShare.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/dto/StoryDTO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/dto/SubjectDTO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/mapper/TUserShareMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/ITUserShareService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/impl/TUserShareServiceImpl.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/resources/mapper/sutdy/TStoryMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-study/src/main/resources/mapper/sutdy/TUserShareMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-management/src/main/java/com/ruoyi/management/api/factory/TManagementFallbackFactory.java
@@ -1,10 +1,12 @@
package com.ruoyi.management.api.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.web.domain.AjaxResult;
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.TUseGuide;
import com.ruoyi.management.api.model.TVipSet;
import com.ruoyi.management.api.query.UseGuideQuery;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
@@ -28,12 +30,22 @@
        return new ManagementClient() {
            @Override
            public R getPage1() {
                return R.fail("获取注意事项失败"+cause.getMessage());
                return R.fail("家长端获取注意事项失败"+cause.getMessage());
            }
            @Override
            public R<List<TVipSet>> getVipSet1() {
                return R.fail("获取会员规格配置和说明失败"+cause.getMessage());
                return R.fail("家长端获取会员规格配置和说明失败"+cause.getMessage());
            }
            @Override
            public R<PageInfo<TUseGuide>> useGuide1(UseGuideQuery query) {
                return R.fail("家长端获取使用指南失败"+cause.getMessage());
            }
            @Override
            public R addFeedBack(TFeedback dto) {
                return R.fail("家长端发布意见反馈失败"+cause.getMessage());
            }
        };
    }
ruoyi-api/ruoyi-api-management/src/main/java/com/ruoyi/management/api/feignClient/ManagementClient.java
@@ -2,14 +2,17 @@
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.web.domain.AjaxResult;
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.query.UseGuideQuery;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
@@ -21,4 +24,10 @@
    @PostMapping("/tUser/getVipSet1")
    R<List<TVipSet>> getVipSet1();
    @PostMapping("/tSysSet/useGuide1")
    R<PageInfo<TUseGuide>> useGuide1(@RequestBody UseGuideQuery query);
    @PostMapping("/tFeedback/addFeedBack")
    R addFeedBack(@RequestBody TFeedback dto);
}
ruoyi-api/ruoyi-api-management/src/main/java/com/ruoyi/management/api/model/TFeedback.java
New file
@@ -0,0 +1,118 @@
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 io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * <p>
 * 用户反馈
 * </p>
 *
 * @author 无关风月
 * @since 2024-04-26
 */
@Data
@TableName("t_feedback")
public class TFeedback extends BaseModel {
    private static final long serialVersionUID = 1L;
    /**
     * 主键
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    /**
     * 用户id
     */
    @ApiModelProperty(value = "用户id")
    private Integer userId;
    /**
     * 图片
     */
    @ApiModelProperty(value = "图片 多张逗号隔开")
    private String img;
    /**
     * 内容
     */
    @ApiModelProperty(value = "内容")
    private String content;
    /**
     * 状态1未处理 2已处理
     */
    @ApiModelProperty(value = "状态1未处理2已处理")
    private Integer state;
    /**
     * 添加时间
     */
    @ApiModelProperty(value = "插入时间")
    private Date insertTime;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public Integer getUserId() {
        return userId;
    }
    public void setUserId(Integer userId) {
        this.userId = userId;
    }
    public String getImg() {
        return img;
    }
    public void setImg(String img) {
        this.img = img;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public Integer getState() {
        return state;
    }
    public void setState(Integer state) {
        this.state = state;
    }
    public Date getInsertTime() {
        return insertTime;
    }
    public void setInsertTime(Date insertTime) {
        this.insertTime = insertTime;
    }
    @Override
    public String toString() {
        return "TFeedback{" +
        ", id=" + id +
        ", userId=" + userId +
        ", img=" + img +
        ", content=" + content +
        ", state=" + state +
        ", insertTime=" + insertTime +
        "}";
    }
}
ruoyi-api/ruoyi-api-management/src/main/java/com/ruoyi/management/api/model/TUseGuide.java
New file
@@ -0,0 +1,108 @@
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 io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * <p>
 * 使用指南
 * </p>
 *
 * @author 无关风月
 * @since 2024-04-26
 */
@Data
@TableName("t_use_guide")
public class TUseGuide extends BaseModel {
    private static final long serialVersionUID = 1L;
    /**
     * 主键
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    /**
     * 标题
     */
    @ApiModelProperty(value = "标题")
    private String title;
    /**
     * 排序 数字越大权重越大
     */
    @ApiModelProperty(value = "排序")
    private String sort;
    /**
     * 答案
     */
    @ApiModelProperty(value = "答案--查看详情使用该字段")
    private String answer;
    /**
     * 插入时间
     */
    @ApiModelProperty(value = "插入时间")
    private Date insertTime;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getSort() {
        return sort;
    }
    public void setSort(String sort) {
        this.sort = sort;
    }
    public String getAnswer() {
        return answer;
    }
    public void setAnswer(String answer) {
        this.answer = answer;
    }
    public Date getInsertTime() {
        return insertTime;
    }
    public void setInsertTime(Date insertTime) {
        this.insertTime = insertTime;
    }
    @Override
    public String toString() {
        return "TUseGuide{" +
        ", id=" + id +
        ", title=" + title +
        ", sort=" + sort +
        ", answer=" + answer +
        ", insertTime=" + insertTime +
        "}";
    }
}
ruoyi-api/ruoyi-api-management/src/main/java/com/ruoyi/management/api/query/UseGuideQuery.java
New file
@@ -0,0 +1,17 @@
package com.ruoyi.management.api.query;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ApiModel
@Data
public class UseGuideQuery {
    @ApiModelProperty(value = "标题")
    private String title;
    @ApiModelProperty(value = "页码,首页1", required = true)
    private Integer pageNumber;
    @ApiModelProperty(value = "页条数", required = true)
    private Integer pageSize;
}
ruoyi-api/ruoyi-api-study/src/main/java/com/ruoyi/study/api/domain/TUserShare.java
New file
@@ -0,0 +1,36 @@
package com.ruoyi.study.api.domain;
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;
import java.util.Date;
/**
 * <p>
 * 用户表
 * </p>
 *
 * @author 无关风月
 * @since 2024-04-26
 */
@Data
@TableName("t_user_share")
public class TUserShare extends BaseModel {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    /**
     * 用户id
     */
    private Integer userId;
    /**
     * 分享时 获得积分
     */
    private Integer integral;
}
ruoyi-api/ruoyi-api-study/src/main/java/com/ruoyi/study/api/dto/StoryDTO.java
@@ -19,7 +19,7 @@
    @ApiModelProperty(value = "图片",required = true)
    private String img;
    @ApiModelProperty(value = "正确语音",required = true)
    private String right;
    private String correct;
    @ApiModelProperty(value = "错误语音 多个逗号拼接")
    private String error;
ruoyi-api/ruoyi-api-study/src/main/java/com/ruoyi/study/api/dto/SubjectDTO.java
@@ -19,7 +19,7 @@
    @ApiModelProperty(value = "图片",required = true)
    private String img;
    @ApiModelProperty(value = "正确语音",required = true)
    private String right;
    private String correct;
    @ApiModelProperty(value = "错误语音 多个逗号拼接")
    private String error;
ruoyi-api/ruoyi-api-study/src/main/java/com/ruoyi/study/api/vo/SubjectVO.java
@@ -7,6 +7,8 @@
@Data
@ApiModel("故事/题目管理列表查询返回VO")
public class SubjectVO {
    @ApiModelProperty(value = "id")
    private Integer id;
    @ApiModelProperty(value = "题目名称")
    private String name;
    @ApiModelProperty(value = "英文释义")
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/LoginUserParent.java
New file
@@ -0,0 +1,52 @@
package com.ruoyi.system.api.model;
import com.ruoyi.system.api.domain.SysUser;
import lombok.Data;
import java.io.Serializable;
import java.util.Set;
/**
 * 用户信息 家长端 学习端使用
 *
 * @author ruoyi
 */
@Data
public class LoginUserParent implements Serializable
{
    private static final long serialVersionUID = 1L;
    /**
     * 用户唯一标识
     */
    private String token;
    /**
     * 用户姓名
     */
    private String name;
    /**
     * 用户名id
     */
    private Integer userid;
    /**
     * 用户名
     */
    private String phone;
    /**
     * 登录时间
     */
    private Long loginTime;
    /**
     * 过期时间
     */
    private Long expireTime;
    /**
     * 登录IP地址
     */
    private String ipaddr;
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/SecurityConstants.java
@@ -36,6 +36,14 @@
     * 用户标识
     */
    public static final String USER_KEY = "user_key";
    /**
     * 家长端登录用户标识
     */
    public static final String USER_PARENT_KEY = "user_parent_key";
    /**
     * 学习端登录用户标识 -- 做单点登录
     */
    public static final String USER_STUDY_KEY = "user_study_key";
    /**
     * 登录用户
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/JwtUtils.java
@@ -51,6 +51,17 @@
        Claims claims = parseToken(token);
        return getValue(claims, SecurityConstants.USER_KEY);
    }
    /**
     * 家长端 学习端根据令牌获取用户标识
     *
     * @param token 令牌
     * @return 用户ID
     */
    public static String getUserKey1(String token)
    {
        Claims claims = parseToken(token);
        return getValue(claims, SecurityConstants.USER_PARENT_KEY);
    }
    /**
     * 根据令牌获取用户标识
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthLogic.java
@@ -53,6 +53,13 @@
    {
        tokenService.delLoginUser(token);
    }
    /**
     * 家长端会话注销,根据指定Token
     */
    public void logoutByToken1(String token)
    {
        tokenService.delLoginUser1(token);
    }
    /**
     * 检验用户是否已经登录,如未登录,则抛出异常
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthUtil.java
@@ -33,6 +33,15 @@
    {
        authLogic.logoutByToken(token);
    }
    /**
     * 家长端会话注销,根据指定Token
     *
     * @param token 指定token
     */
    public static void logoutByToken1(String token)
    {
        authLogic.logoutByToken1(token);
    }
    /**
     * 检验当前会话是否已经登录,如未登录,则抛出异常
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java
@@ -4,6 +4,8 @@
import java.util.Map;
import java.util.concurrent.TimeUnit;
import javax.servlet.http.HttpServletRequest;
import com.ruoyi.system.api.model.LoginUserParent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.ruoyi.common.core.constant.CacheConstants;
@@ -64,7 +66,25 @@
        rspMap.put("expires_in", expireTime);
        return rspMap;
    }
    public Map<String, Object> createToken1(LoginUserParent loginUser)
    {
        String token = IdUtils.fastUUID();
        Integer userId = loginUser.getUserid();
        String name = loginUser.getName();
        loginUser.setToken(token);
        loginUser.setIpaddr(IpUtils.getIpAddr());
        refreshToken1(loginUser);
        // Jwt存储信息
        Map<String, Object> claimsMap = new HashMap<String, Object>();
        claimsMap.put(SecurityConstants.USER_PARENT_KEY, token);
        claimsMap.put(SecurityConstants.DETAILS_USER_ID, userId);
        claimsMap.put(SecurityConstants.DETAILS_USERNAME, name);
        // 接口返回信息
        Map<String, Object> rspMap = new HashMap<String, Object>();
        rspMap.put("access_token", JwtUtils.createToken(claimsMap));
        rspMap.put("expires_in", expireTime);
        return rspMap;
    }
    /**
     * 获取用户身份信息
     *
@@ -85,6 +105,27 @@
        // 获取请求携带的令牌
        String token = SecurityUtils.getToken(request);
        return getLoginUser(token);
    }
    /**
     * 家长端/学习端获取用户身份信息
     *
     * @return 用户信息
     */
    public LoginUserParent getLoginUser1()
    {
        return getLoginUser1(ServletUtils.getRequest());
    }
    /**
     * 获取用户身份信息
     *
     * @return 用户信息
     */
    public LoginUserParent getLoginUser1(HttpServletRequest request)
    {
        // 获取请求携带的令牌
        String token = SecurityUtils.getToken(request);
        return getLoginUser1(token);
    }
    /**
@@ -109,6 +150,29 @@
        }
        return user;
    }
    /**
     * 家长端 学习端 获取用户身份信息
     *
     * @return 用户信息
     */
    public LoginUserParent getLoginUser1(String token)
    {
        LoginUserParent user = null;
        try
        {
            if (StringUtils.isNotEmpty(token))
            {
                String userkey = JwtUtils.getUserKey1(token);
                user = redisService.getCacheObject(getTokenKey(userkey));
                return user;
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return user;
    }
    /**
     * 设置用户身份信息
@@ -129,6 +193,17 @@
        if (StringUtils.isNotEmpty(token))
        {
            String userkey = JwtUtils.getUserKey(token);
            redisService.deleteObject(getTokenKey(userkey));
        }
    }
    /**
     * 家长端删除用户缓存信息
     */
    public void delLoginUser1(String token)
    {
        if (StringUtils.isNotEmpty(token))
        {
            String userkey = JwtUtils.getUserKey1(token);
            redisService.deleteObject(getTokenKey(userkey));
        }
    }
@@ -162,6 +237,18 @@
        redisService.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
    }
    /**
     * 家长端用户登录
     */
    public void refreshToken1(LoginUserParent dto)
    {
        dto.setLoginTime(System.currentTimeMillis());
        dto.setExpireTime(dto.getLoginTime() + expireTime * MILLIS_MINUTE);
        // 根据uuid将loginUser缓存
        String userKey = getTokenKey(dto.getToken());
        redisService.setCacheObject(userKey, dto, expireTime, TimeUnit.MINUTES);
    }
    private String getTokenKey(String token)
    {
        return ACCESS_TOKEN + token;
ruoyi-service/ruoyi-management/src/main/java/com/ruoyi/management/controller/OssController.java
New file
@@ -0,0 +1,78 @@
package com.ruoyi.management.controller;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.management.utils.ObsUploadUtil;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
@RestController
@RequestMapping("/base/oss")
public class OssController {
    private static final String endpoint = "obs.cn-north-4.myhuaweicloud.com";
    private static final String accessKeyId = "DRJFJRVQ9KVLQUSJUROI";
    private static final String accessKeySecret = "3zpPkULh0a8CTTYjKL4f7szQZECkvVol4SwNab0f";
    private static final String bucketName = "jkjianshen";
    @PostMapping("/upload")
    @ApiOperation(value = "文件上传",tags = "文件上传")
    public String upload(@RequestParam("file") MultipartFile file) throws IOException {
        String s = ObsUploadUtil.obsUpload(file);
        return s;
    }
//    @PostMapping("/uploadVideo")
//    @ApiOperation(value = "视频上传",tags = "文件上传")
//    public String uploadVideo(@RequestParam("file") MultipartFile file) throws Exception {
//        // 获取文件名
//        String fileName = file.getOriginalFilename();
//        // 构建目标文件路径
//        String filePath = "/usr/local/temp" + fileName;
////        String filePath = "C:/temp/" + fileName;
//        // 创建目标文件对象
//        File targetFile = new File(filePath);
//        // 将 MultipartFile 内容写入目标文件
//        try (FileOutputStream fos = new FileOutputStream(targetFile)) {
//            fos.write(file.getBytes());
//        }
//        String s = UploadVideoUtil.endUpload(targetFile.toString(), UUIDUtil.getRandomCode(5)+fileName);
//        // 创建要删除的文件对象
//        File fileToDelete = new File(targetFile.toString());
//        // 检查文件是否存在,并删除文件
//        if (fileToDelete.exists()) {
//            fileToDelete.delete();
//        }
//        return s;
//    }
//    @PostMapping("/upload")
//    @ApiOperation(value = "文件上传",tags = "文件上传")
//    public ResponseEntity<String> upload(@RequestParam("file") MultipartFile file) throws IOException {
//        // 创建 OSSClient 实例
//        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
//
//
//        // 创建 PutObjectRequest 对象
//        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, file.getOriginalFilename(), file.getInputStream());
//
//        ObjectMetadata metadata = new ObjectMetadata();
//        // 取消文件缓存,文件每次都会从OSS服务器获取
//        metadata.setHeader("Cache-Control", "no-cache");
//        metadata.setHeader("Expires", "0");
//
//
//        // 上传文件
//        PutObjectResult putObjectResult = ossClient.putObject(putObjectRequest);
//
//        // 关闭 OSSClient 实例
//        ossClient.shutdown();
//
//        String fileUrl = "https://" + bucketName + "." + endpoint + "/" + file.getOriginalFilename();
//        return ResponseEntity.ok(fileUrl);
//    }
}
ruoyi-service/ruoyi-management/src/main/java/com/ruoyi/management/controller/TFeedbackController.java
@@ -1,21 +1,24 @@
package com.ruoyi.management.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.management.domain.TFeedback;
import com.ruoyi.management.domain.TUseGuide;
import com.ruoyi.management.dto.FeedbackQuery;
import com.ruoyi.management.query.UseGuideQuery;
import com.ruoyi.management.service.ITFeedbackService;
import com.ruoyi.management.vo.FeedbackVO;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
/**
@@ -32,6 +35,12 @@
    @Autowired
    private ITFeedbackService feedbackService;
    @PostMapping("/addFeedBack")
    @ApiOperation(value = "反馈", tags = {"家长端-意见反馈"})
    public R addFeedBack(@RequestBody TFeedback dto) {
        feedbackService.save(dto);
        return R.ok();
    }
    @ResponseBody
    @PostMapping("/listAll")
ruoyi-service/ruoyi-management/src/main/java/com/ruoyi/management/controller/TStudyController.java
@@ -30,7 +30,7 @@
 * @since 2024-04-26
 */
@Controller
@RequestMapping("/management/tStudy")
@RequestMapping("/tStudy")
public class TStudyController {
    @Autowired
    private StudyClient studyClient;
@@ -43,9 +43,9 @@
        return AjaxResult.success(data);
    }
    @ApiOperation(value = "选择故事列表查询", tags = {"后台-学习"})
    @PostMapping(value = "/storyist1")
    @PostMapping(value = "/storyList1")
    @ResponseBody
    public AjaxResult<PageInfo<TStory>> storyist(ChoiceStory dto) {
    public AjaxResult<PageInfo<TStory>> storyList(ChoiceStory dto) {
        R<PageInfo<TStory>> pageInfoR = studyClient.storyList(dto);
        PageInfo<TStory> data = pageInfoR.getData();
        return AjaxResult.success(data);
ruoyi-service/ruoyi-management/src/main/java/com/ruoyi/management/controller/TSysSetController.java
@@ -11,6 +11,7 @@
import com.ruoyi.management.domain.TUseGuide;
import com.ruoyi.management.dto.AggrementDTO;
import com.ruoyi.management.dto.UseGuidDTO;
import com.ruoyi.management.query.UseGuideQuery;
import com.ruoyi.management.service.ITPageService;
import com.ruoyi.management.service.ITProtocolService;
import com.ruoyi.management.service.ITSysSetService;
@@ -20,7 +21,6 @@
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
@@ -118,6 +118,23 @@
        res.setTotal(useGuides.size());
        return AjaxResult.success(res);
    }
    @PostMapping("/useGuide1")
    @ApiOperation(value = "列表查询", tags = {"家长端-使用指南"})
    public R<PageInfo<TUseGuide>> useGuide1(@RequestBody UseGuideQuery query) {
        QueryWrapper<TUseGuide> wrapper = new QueryWrapper<>();
        if (StringUtils.hasLength(query.getTitle())){
            wrapper.like("title",query.getTitle());
        }
        List<String> strings = new ArrayList<>();
        strings.add("insertTime");
        wrapper.orderByDesc(strings);
        PageInfo<TUseGuide> res = new PageInfo<>(query.getPageNumber(), query.getPageSize());
        List<TUseGuide> useGuides = useGuideService.list(wrapper);
        res.setRecords(useGuides);
        res.setTotal(useGuides.size());
        return R.ok(res);
    }
    @PostMapping("/updateUseGuide")
    @ApiOperation(value = "使用指南-添加/编辑/查看详情", tags = {"使用指南"})
    public AjaxResult<TUseGuide> updateUseGuide(@RequestBody UseGuidDTO dto) {
@@ -126,7 +143,6 @@
                TUseGuide useGuide = new TUseGuide();
                useGuide.setTitle(dto.getTitle());
                useGuide.setSort(dto.getSort());
                useGuide.setIsDelete(0);
                useGuide.setAnswer(dto.getAnswer());
                useGuide.setInsertTime(new Date());
                useGuideService.save(useGuide);
@@ -148,10 +164,8 @@
    @DeleteMapping("/delete{id}")
    @ApiOperation(value = "使用指南-删除", tags = {"使用指南"})
    public AjaxResult updateUseGuide(@PathVariable Integer id) {
        TUseGuide useGuide2 = useGuideService.getById(id);
        useGuide2.setIsDelete(1);
        useGuideService.updateById(useGuide2);
//        TUseGuide useGuide2 = useGuideService.getById(id);
        useGuideService.removeById(id);
        return AjaxResult.success("删除成功");
    }
}
ruoyi-service/ruoyi-management/src/main/java/com/ruoyi/management/controller/TUserController.java
@@ -136,14 +136,12 @@
        return R.ok(list);
    }
    @PostMapping("/setVipSet")
    @ApiOperation(value = "获取会员设置", tags = {"用户管理"})
    @ApiOperation(value = "保存会员设置", tags = {"用户管理"})
    public AjaxResult setVipSet(@RequestBody VipSetVO vo) {
        String info = vo.getInfo();
        List<TVipSet> list = vo.getList();
        // 删除原有数据 重新保存
        vipSetService.remove(new QueryWrapper<TVipSet>());
        for (TVipSet tVipSet : list) {
            tVipSet.setInfo(info);
            vipSetService.save(tVipSet);
        }
        return AjaxResult.success("保存成功");
ruoyi-service/ruoyi-management/src/main/java/com/ruoyi/management/domain/TFeedback.java
@@ -8,6 +8,7 @@
import com.baomidou.mybatisplus.annotation.TableId;
import com.ruoyi.common.core.web.domain.BaseModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@@ -19,6 +20,7 @@
 * @author 无关风月
 * @since 2024-04-26
 */
@Data
@TableName("t_feedback")
public class TFeedback extends BaseModel {
ruoyi-service/ruoyi-management/src/main/java/com/ruoyi/management/domain/TUseGuide.java
@@ -39,11 +39,7 @@
     */
    @ApiModelProperty(value = "排序")
    private String sort;
    /**
     * 是否删除0否1是
     */
    @ApiModelProperty(value = "是否删除 0否1是")
    private Integer isDelete;
    /**
     * 答案
     */
@@ -80,13 +76,6 @@
        this.sort = sort;
    }
    public Integer getIsDelete() {
        return isDelete;
    }
    public void setIsDelete(Integer isDelete) {
        this.isDelete = isDelete;
    }
    public String getAnswer() {
        return answer;
@@ -110,7 +99,7 @@
        ", id=" + id +
        ", title=" + title +
        ", sort=" + sort +
        ", isDelete=" + isDelete +
        ", answer=" + answer +
        ", insertTime=" + insertTime +
        "}";
ruoyi-service/ruoyi-management/src/main/java/com/ruoyi/management/mapper/TUseGuideMapper.java
@@ -1,7 +1,7 @@
package com.ruoyi.management.mapper;
import com.ruoyi.management.domain.TUseGuide;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.management.domain.TUseGuide;
/**
 * <p>
ruoyi-service/ruoyi-management/src/main/java/com/ruoyi/management/query/UseGuideQuery.java
New file
@@ -0,0 +1,17 @@
package com.ruoyi.management.query;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ApiModel
@Data
public class UseGuideQuery {
    @ApiModelProperty(value = "标题")
    private String title;
    @ApiModelProperty(value = "页码,首页1", required = true)
    private Integer pageNumber;
    @ApiModelProperty(value = "页条数", required = true)
    private Integer pageSize;
}
ruoyi-service/ruoyi-management/src/main/java/com/ruoyi/management/service/ITUseGuideService.java
@@ -1,7 +1,7 @@
package com.ruoyi.management.service;
import com.ruoyi.management.domain.TUseGuide;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.management.domain.TUseGuide;
/**
 * <p>
ruoyi-service/ruoyi-management/src/main/java/com/ruoyi/management/utils/ObsUploadUtil.java
New file
@@ -0,0 +1,78 @@
package com.ruoyi.management.utils;
import com.obs.services.ObsClient;
import com.obs.services.model.ObjectMetadata;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;
public class ObsUploadUtil {
    public static String endPoint = "obs.cn-north-4.myhuaweicloud.com";
    public static String accessKeyId = "X3V6GPYUK1VQ03K0JG4G";
    public static String accessKeySecret = "CustHR4B9XKdT7hGcEYEpV9UVUoc4pmUhnHckU9h";
    public static String bucketName = "jkjianshen";
    public static String oss_domain = "https://jkjianshen.obs.cn-north-4.myhuaweicloud.com/";
    // 创建ObsClient实例
    public static ObsClient obsClient = new ObsClient(accessKeyId, accessKeySecret, endPoint);
    public static String obsUpload(MultipartFile file) throws IOException{
        //CommonsMultipartFile file = (CommonsMultipartFile)multipartFile;
        String fileName = "";
        if(file!=null && !"".equals(file.getOriginalFilename()) && file.getOriginalFilename()!=null){
            InputStream content = file.getInputStream();//获得指定文件的输入流
            ObjectMetadata meta = new ObjectMetadata();// 创建上传Object的Metadata
            meta.setContentLength(file.getSize());  // 必须设置ContentLength
            String originalFilename = file.getOriginalFilename();
            if (originalFilename.contains("apk")){
                fileName = "bf2fe5c5499341e5bc0d56c0c7d5fb2e.apk";
                System.err.println("apk");
            }else{
                fileName =  UUID.randomUUID().toString().replaceAll("-","") + originalFilename.subSequence(originalFilename.lastIndexOf("."), originalFilename.length());
            }
            obsClient.putObject(bucketName,"admin/"+fileName,content,meta);// 上传Object.
            if(fileName != null && !"".equals(fileName)){
                System.out.println(fileName);
                fileName = oss_domain+"admin/"+fileName;
            }
        }
        return fileName;
    }
    /**
     * 删除某个Object
     *
     * @param bucketUrl
     * @return
     */
    public static boolean deleteObject(String bucketUrl) {
        try {
            bucketUrl=bucketUrl.replace(oss_domain+"web","");
            // 删除Object.
            obsClient.deleteObject(bucketName, bucketUrl);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            //ossClient.shutdown();
        }
        return true;
    }
//     public static void createBucket(String bucketName)
//     {
//         //初始化 OSSClient
////          ossClient = new OssClient(endPoint, accessKeyId, accessKeySecret);
//
//         // 新建一个Bucket
//         Bucket bucket = ossClient.createBucket(bucketName);
//         System.out.println(bucket.getName());
//         System.out.println(bucket.getCreationDate());
//     }
//
//     public static void main(String[] args) {
//         OssUploadUtil.createBucket("ssfdfsd");
//    }
}
ruoyi-service/ruoyi-management/src/main/java/com/ruoyi/management/vo/VipSetVO.java
@@ -17,11 +17,7 @@
 */
@Data
public class VipSetVO {
    /**
     * 会员说明
     */
    @ApiModelProperty(value = "会员说明")
    private String info;
    @ApiModelProperty(value = "会员价格设置")
    private List<TVipSet> list;
ruoyi-service/ruoyi-management/src/main/resources/mapper/management/src/main/resources/mapper/TUseGuideMapper.xml
@@ -7,14 +7,13 @@
        <id column="id" property="id" />
        <result column="title" property="title" />
        <result column="sort" property="sort" />
        <result column="isDelete" property="isDelete" />
        <result column="answer" property="answer" />
        <result column="insertTime" property="insertTime" />
    </resultMap>
    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
        id, title, sort, isDelete, answer, insertTime
        id, title, sort, isDelete, answer
    </sql>
</mapper>
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/config/DataUpdateHandlerConfig.java
@@ -8,6 +8,8 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import java.util.Date;
/**
 * @author xiaochen
 * @ClassName DataUpdateInterceptor
@@ -34,7 +36,9 @@
    public void insertFill(MetaObject metaObject) {
        //  获取登录信息
        LoginUser loginUser = tokenService.getLoginUser();
        String userName = loginUser.getUsername();
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
//        String userName = loginUser.getUsername();
//        if (StringUtils.hasLength(userName)) {
//            this.setFieldValByName("createBy", userName, metaObject);
//            this.setFieldValByName("createTime", new Date(), metaObject);
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TStoryController.java
@@ -121,6 +121,9 @@
        TStory byId = service.getById(id);
        byId.setState(state);
        service.updateById(byId);
        if (state == 3){
            service.removeById(byId);
        }
        return R.ok("成功");
    }
    private R<Object> getObjectR(Integer id) {
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TSubjectController.java
@@ -199,6 +199,9 @@
        TSubject byId = subjectService.getById(id);
        byId.setState(state);
        subjectService.updateById(byId);
        if (state == 3){
            subjectService.removeById(byId);
        }
        return R.ok("编辑成功");
    }
}
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TUserController.java
@@ -4,12 +4,19 @@
import com.alipay.api.AlipayApiException;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.JwtUtils;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.common.security.auth.AuthUtil;
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.query.UseGuideQuery;
import com.ruoyi.study.domain.TUser;
import com.ruoyi.study.domain.TVipOrder;
import com.ruoyi.study.dto.AppUserQuery;
@@ -19,10 +26,17 @@
import com.ruoyi.study.utils.PayMoneyUtil;
import com.ruoyi.study.utils.UUIDUtil;
import com.ruoyi.study.vo.*;
import com.ruoyi.system.api.domain.SysRole;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.model.LoginUser;
import com.ruoyi.system.api.model.LoginUserParent;
import io.jsonwebtoken.Claims;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
@@ -50,16 +64,34 @@
    private IVipOrderService vipOrderService;
    @Autowired
    private ManagementClient managementClient;
    @Autowired
    private TokenService tokenService;
    @PostMapping("/vipInfo")
    @ApiOperation(value = "会员中心-获取会员说明、当前登录用户是否为会员、会员购买规格", tags = {"家长端-个人中心"})
    public AjaxResult<List<VipInfoVO>> vipInfo() {
        if (tokenService.getLoginUser1() == null){
            return AjaxResult.tokenError("登录失效",new Object());
        }
        List<VipInfoVO> vipInfoVOS = new ArrayList<>();
        List<TVipSet> data = managementClient.getVipSet1().getData();
        for (TVipSet datum : data) {
            VipInfoVO vipInfoVO = new VipInfoVO();
            vipInfoVO.setInfo(datum.getInfo());
            vipInfoVO.setId(datum.getId());
//            vipInfoVO.setIsVip();
            Integer userid = tokenService.getLoginUser1().getUserid();
            TUser byId = userService.getById(userid);
            // 先判断vipEndTime
            if (byId.getVipEndTime() == null){
                vipInfoVO.setIsVip(0);
            }else{
                // 判断会员到期时间是否大于当前时间
                if (byId.getVipEndTime().getTime() > new Date().getTime()){
                    vipInfoVO.setIsVip(1);
                }else{
                    vipInfoVO.setIsVip(0);
                }
            }
            vipInfoVO.setTime(datum.getTime());
            vipInfoVO.setAmount(datum.getAmount());
        }
@@ -76,6 +108,10 @@
            @ApiImplicitParam(name = "id", value = "会员规格id", required = true),
    })
    public AjaxResult order(Integer payType,Integer id) throws Exception {
        if (tokenService.getLoginUser1() == null){
            return AjaxResult.tokenError("登录失效",new Object());
        }
        Integer userid = tokenService.getLoginUser1().getUserid();
        TVipOrder tVipOrder = new TVipOrder();
        List<TVipSet> data = managementClient.getVipSet1().getData();
        Integer time = 0;
@@ -86,10 +122,7 @@
            }
        }
        tVipOrder.setPayState(1);
//        tVipOrder.setUserId();
//        tVipOrder.setPayTime();
//        tVipOrder.setBackTime();
//        tVipOrder.setTime();
        tVipOrder.setUserId(userid);
        tVipOrder.setPayType(payType);
        tVipOrder.setCount(time);
        switch (payType){
@@ -137,19 +170,40 @@
                byId.setTransactionId(trade_no);
                byId.setOutTradeNo(out_trade_no);
                byId.setPayTime(new Date());
                Calendar calendar = Calendar.getInstance();
                calendar.setTime(new Date());
                calendar.add(Calendar.MONTH, time);
                Date dateAfterOneMonth = calendar.getTime();
                byId.setTime(dateAfterOneMonth);
                // 修改订单状态
                vipOrderService.updateById(byId);
                TUser byId1 = userService.getById(byId.getUserId());
                if (byId1.getVipPayTime() == null){
                    // 是否是首次充值会员
                    byId1.setVipPayTime(new Date());
                    Calendar calendar = Calendar.getInstance();
                    calendar.setTime(new Date());
                    calendar.add(Calendar.MONTH, time);
                    Date dateAfterOneMonth = calendar.getTime();
                    byId.setTime(dateAfterOneMonth);
                    byId1.setVipEndTime(dateAfterOneMonth);
                }else{
                    // 不是首次 判断vipEndTime 是否到期 如果没有 加指定月份时间 如果到期了 将会员到期时间从当前增加指定月份
                    if (byId1.getVipEndTime().getTime() < new Date().getTime()){
                        Calendar calendar = Calendar.getInstance();
                        calendar.setTime(new Date());
                        calendar.add(Calendar.MONTH, time);
                        Date dateAfterOneMonth = calendar.getTime();
                        byId.setTime(dateAfterOneMonth);
                        byId1.setVipEndTime(dateAfterOneMonth);
                    }else{
                        Calendar calendar = Calendar.getInstance();
                        calendar.setTime(byId1.getVipEndTime());
                        calendar.add(Calendar.MONTH, time);
                        Date dateAfterOneMonth = calendar.getTime();
                        byId.setTime(dateAfterOneMonth);
                        byId1.setVipEndTime(dateAfterOneMonth);
                    }
                }
                byId1.setVipEndTime(dateAfterOneMonth);
                // 修改订单状态
                vipOrderService.updateById(byId);
                // 修改用户会员续期信息
                userService.updateById(byId1);
                PrintWriter out = response.getWriter();
@@ -189,19 +243,38 @@
                byId.setTransactionId(transaction_id);
                byId.setOutTradeNo(out_trade_no);
                byId.setPayTime(new Date());
                Calendar calendar = Calendar.getInstance();
                calendar.setTime(new Date());
                calendar.add(Calendar.MONTH, time);
                Date dateAfterOneMonth = calendar.getTime();
                byId.setTime(dateAfterOneMonth);
                // 修改订单状态
                vipOrderService.updateById(byId);
                TUser byId1 = userService.getById(byId.getUserId());
                if (byId1.getVipPayTime() == null){
                    // 是否是首次充值会员
                    byId1.setVipPayTime(new Date());
                    Calendar calendar = Calendar.getInstance();
                    calendar.setTime(new Date());
                    calendar.add(Calendar.MONTH, time);
                    Date dateAfterOneMonth = calendar.getTime();
                    byId.setTime(dateAfterOneMonth);
                    byId1.setVipEndTime(dateAfterOneMonth);
                }else{
                    // 不是首次 判断vipEndTime 是否到期 如果没有 加指定月份时间 如果到期了 将会员到期时间从当前增加指定月份
                    if (byId1.getVipEndTime().getTime() < new Date().getTime()){
                        Calendar calendar = Calendar.getInstance();
                        calendar.setTime(new Date());
                        calendar.add(Calendar.MONTH, time);
                        Date dateAfterOneMonth = calendar.getTime();
                        byId.setTime(dateAfterOneMonth);
                        byId1.setVipEndTime(dateAfterOneMonth);
                    }else{
                        Calendar calendar = Calendar.getInstance();
                        calendar.setTime(byId1.getVipEndTime());
                        calendar.add(Calendar.MONTH, time);
                        Date dateAfterOneMonth = calendar.getTime();
                        byId.setTime(dateAfterOneMonth);
                        byId1.setVipEndTime(dateAfterOneMonth);
                    }
                }
                byId1.setVipEndTime(dateAfterOneMonth);
                // 修改订单状态
                vipOrderService.updateById(byId);
                // 修改用户会员续期信息
                userService.updateById(byId1);
                PrintWriter out = response.getWriter();
@@ -215,66 +288,107 @@
    }
    @PostMapping("/getPage")
    @ApiOperation(value = "获取注意事项", tags = {"家长端-注意事项"})
    public AjaxResult<TPage> getPage() {
    public AjaxResult<String> getPage() {
        List<TPage> data = managementClient.getPage1().getData();
        for (TPage datum : data) {
            if (datum.getType() == 4){
                return AjaxResult.success(datum);
                return AjaxResult.success(datum.getImg());
            }
        }
        return AjaxResult.success();
    }
    @Autowired
    private TokenService tokenService;
//    @Autowired
//    private HWSendSms hwSendSms;
//    @ResponseBody
//    @PostMapping("/getSMSCode")
//    @ApiOperation(value = "获取短信验证码", tags = {"家长端-登录注册"})
//    @ApiImplicitParams({
//            @ApiImplicitParam(value = "类型(1:登录,2:注册,3:修改密码,4:忘记密码,5:修改绑定手机号)", name = "type", dataType = "int", required = true),
//            @ApiImplicitParam(value = "电话号码", name = "phone", dataType = "string", required = true)
//    })
//    public AjaxResult getSMSCode(Integer type, String phone) {
//        if (ToolUtil.isEmpty(phone)) {
//            return AjaxResult.paranErr("phone");
//        }
//        if (ToolUtil.isEmpty(type)) {
//            return AjaxResult.paranErr("type");
//        }
//        try {
//            if (type == 2) {
//                AppUser tAppUser = appUserService.selectOne(new EntityWrapper<AppUser>()
//                        .eq("phone", phone).ne("state", 3));
//                if (null != tAppUser) {
//                    return AjaxResult.error("账号已存在");
//                }
//            }
//            if (type == 5) {
//                AppUser tAppUser = appUserService.selectOne(new EntityWrapper<AppUser>()
//                        .eq("phone", phone).ne("state", 3));
//                if (null != tAppUser) {
//                    return AjaxResult.error("账号已存在");
//                }
//            }
//            String numberRandom = UUIDUtil.getNumberRandom(6);
//            String templateCode = "";
//            if (type == 1 || type == 2) {
//                templateCode = "SMS_161275250";
//            }
//            if (type == 3 || type == 4) {
//                templateCode = "SMS_160960014";
//            }
////            aLiSendSms.sendSms(phone, templateCode, "{\"code\":\"" + numberRandom + "\"}");
//            hwSendSms.sendSms(numberRandom,phone);
//            redisUtil.setStrValue(phone, numberRandom, 300);
//            return AjaxResult.success();
//        } catch (Exception e) {
//            e.printStackTrace();
//            return ResultUtil.runErr();
//        }
//    }
    @PostMapping("/useGuide")
    @ApiOperation(value = "使用指南", tags = {"家长端-使用指南"})
    public AjaxResult<PageInfo<TUseGuide>> useGuide(@RequestBody UseGuideQuery query) {
        PageInfo<TUseGuide> data = managementClient.useGuide1(query).getData();
        return AjaxResult.success(data);
    }
    @PostMapping("/feedBack")
    @ApiOperation(value = "反馈", tags = {"家长端-意见反馈"})
    public AjaxResult feedBack(@RequestBody TFeedback dto) {
        if (tokenService.getLoginUser1() == null){
            return AjaxResult.tokenError("登录失效",new Object());
        }
        LoginUserParent loginUser1 = tokenService.getLoginUser1();
        dto.setUserId(loginUser1.getUserid());
        managementClient.addFeedBack(dto);
        return AjaxResult.success("反馈成功");
    }
    @PostMapping("/parentLogin")
    @ApiOperation(value = "登录", tags = {"家长端-登录"})
    @ApiImplicitParams({
            @ApiImplicitParam(value = "手机号", name = "phone", dataType = "string", required = true),
            @ApiImplicitParam(value = "验证码", name = "phoneCode", dataType = "string", required = true)
    })
    public AjaxResult login(String phone, String phoneCode)
    {
        TUser tUser1 = userService.getOne(new QueryWrapper<TUser>()
                .ne("state", 3)
                .eq("phone",phone));
        if (tUser1 != null){
            if (tUser1.getState() == 2){
                return AjaxResult.error("登录失败,您的账号已被冻结!");
            }
        }else{
            // todo 验证码校验
            tUser1 = new TUser();
            // 注册
            tUser1.setName(phone);
            tUser1.setAccount(phone);
            tUser1.setState(1);
            tUser1.setInsertTime(new Date());
            tUser1.setCreateTime(new Date());
            tUser1.setPhone(phone);
            userService.save(tUser1);
        }
        LoginUserParent loginUserParent = new LoginUserParent();
        loginUserParent.setName(tUser1.getName());
        loginUserParent.setUserid(tUser1.getId());
        loginUserParent.setPhone(tUser1.getPhone());
        loginUserParent.setLoginTime(new Date().getTime());
        HashMap<String, Object> map = new HashMap<>();
        map.put("token",tokenService.createToken1(loginUserParent));
        // 获取登录token
        return AjaxResult.success(map);
    }
    @PostMapping("/deleteUser")
    @ApiOperation(value = "注销当前帐号", tags = {"家长端-个人中心"})
    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "Bearer eyJhbGciOiJIUzUxMiJ....", required = true, paramType = "header"),
    })
    public AjaxResult deleteUser() {
        if (tokenService.getLoginUser1() == null){
           return AjaxResult.tokenError("登录失效");
        }
        Integer userid = tokenService.getLoginUser1().getUserid();
        TUser tUser = userService.getById(userid);
        tUser.setState(3);
        userService.updateById(tUser);
        userService.removeById(tUser);
        return AjaxResult.success("注销成功");
    }
    @PostMapping("/logout")
    @ApiOperation(value = "退出登录", tags = {"家长端-个人中心"})
    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "Bearer eyJhbGciOiJIUzUxMiJ....", required = true, paramType = "header"),
    })
    public AjaxResult logout(HttpServletRequest request) {
        if (tokenService.getLoginUser1() == null){
            return AjaxResult.tokenError("登录失效");
        }
        String token = SecurityUtils.getToken(request);
        if (com.ruoyi.common.core.utils.StringUtils.isNotEmpty(token))
        {
            // 删除用户缓存记录
            AuthUtil.logoutByToken1(token);
        }
        // todo 清除token
        return AjaxResult.success("退出登录成功");
    }
    @PostMapping("/updateUserInfo")
    @ApiOperation(value = "修改个人资料", tags = {"家长端-个人中心"})
    @ApiImplicitParams({
@@ -284,9 +398,13 @@
            @ApiImplicitParam(name = "headImg", value = "头像 改什么就只传什么"),
    })
    public AjaxResult updateUserInfo(String name, String phone,String headImg) {
        if (tokenService.getLoginUser1() == null){
            return AjaxResult.tokenError("登录失效",new Object());
        }
        // todo 获取用户id
        Long userid = tokenService.getLoginUser().getUserid();
        Integer userid = tokenService.getLoginUser1().getUserid();
        TUser byId = userService.getById(userid);
        if (StringUtils.hasLength(name)){
            byId.setName(name);
        }
@@ -295,9 +413,16 @@
//            if (byId == null){
//                return AjaxResult.tokenError("登录失效");
//            }
            if (phone.equals(byId.getPhone())){
                return AjaxResult.error("更换的手机号不能和原手机号相同");
            }
            List<TUser> list = userService.list(new QueryWrapper<TUser>()
                    .eq("phone", phone)
                    .ne("state", 3));
            if (list.size() > 0){
                return AjaxResult.error("更换的手机号已被使用",new Object());
            }
            byId.setPhone(phone);
        }
        if (StringUtils.hasLength(headImg)){
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/domain/TStory.java
@@ -4,6 +4,7 @@
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.web.domain.BaseModel;
import lombok.Data;
/**
 * <p>
@@ -13,6 +14,7 @@
 * @author 无关风月
 * @since 2024-04-26
 */
@Data
@TableName("t_story")
public class TStory extends BaseModel {
@@ -46,7 +48,7 @@
    /**
     * 正确语音
     */
    private String right;
    private String correct;
    /**
     * 错误语音 要么没有 要么两个逗号隔开
     */
@@ -101,13 +103,6 @@
        this.img = img;
    }
    public String getRight() {
        return right;
    }
    public void setRight(String right) {
        this.right = right;
    }
    public String getError() {
        return error;
@@ -126,7 +121,7 @@
        ", type=" + type +
        ", state=" + state +
        ", img=" + img +
        ", right=" + right +
        ", correct=" + correct +
        ", error=" + error +
        "}";
    }
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/domain/TUserShare.java
New file
@@ -0,0 +1,34 @@
package com.ruoyi.study.domain;
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
 */
@Data
@TableName("t_user_share")
public class TUserShare extends BaseModel {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    /**
     * 用户id
     */
    private Integer userId;
    /**
     * 分享时 获得积分
     */
    private Integer integral;
}
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/dto/StoryDTO.java
@@ -19,7 +19,7 @@
    @ApiModelProperty(value = "图片",required = true)
    private String img;
    @ApiModelProperty(value = "正确语音",required = true)
    private String right;
    private String correct;
    @ApiModelProperty(value = "错误语音 多个逗号拼接")
    private String error;
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/dto/SubjectDTO.java
@@ -19,7 +19,7 @@
    @ApiModelProperty(value = "图片",required = true)
    private String img;
    @ApiModelProperty(value = "正确语音",required = true)
    private String right;
    private String correct;
    @ApiModelProperty(value = "错误语音 多个逗号拼接")
    private String error;
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/mapper/TUserShareMapper.java
New file
@@ -0,0 +1,17 @@
package com.ruoyi.study.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.study.domain.TGame;
import com.ruoyi.study.domain.TUserShare;
/**
 * <p>
 * 自主游戏 Mapper 接口
 * </p>
 *
 * @author 无关风月
 * @since 2024-04-26
 */
public interface TUserShareMapper extends BaseMapper<TUserShare> {
}
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/ITUserShareService.java
New file
@@ -0,0 +1,17 @@
package com.ruoyi.study.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.study.domain.TGame;
import com.ruoyi.study.domain.TUserShare;
/**
 * <p>
 * 自主游戏 服务类
 * </p>
 *
 * @author 无关风月
 * @since 2024-04-26
 */
public interface ITUserShareService extends IService<TUserShare> {
}
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/service/impl/TUserShareServiceImpl.java
New file
@@ -0,0 +1,23 @@
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;
/**
 * <p>
 * 自主游戏 服务实现类
 * </p>
 *
 * @author 无关风月
 * @since 2024-04-26
 */
@Service
public class TUserShareServiceImpl extends ServiceImpl<TUserShareMapper, TUserShare> implements ITUserShareService {
}
ruoyi-service/ruoyi-study/src/main/resources/mapper/sutdy/TStoryMapper.xml
@@ -23,7 +23,7 @@
        from t_story
        where 1=1 and `state`!=3
        <if test="req.name != null and req.name != ''">
            and name like concat('%',#{req.name},'%')
            and `name` like concat('%',#{req.name},'%')
        </if>
        <if test="req.english != null and req.english != ''">
            and english like concat('%',#{req.english},'%')
ruoyi-service/ruoyi-study/src/main/resources/mapper/sutdy/TUserShareMapper.xml
New file
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!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">
</mapper>