Переглянути джерело

1. APP首页看课 2.APP短信登录

wjj 1 місяць тому
батько
коміт
b41742e45c
19 змінених файлів з 418 додано та 4 видалено
  1. 25 0
      fs-service/src/main/java/com/fs/common/VerifyCodeUtil.java
  2. 2 0
      fs-service/src/main/java/com/fs/common/service/ISmsService.java
  3. 82 0
      fs-service/src/main/java/com/fs/common/service/impl/SmsServiceImpl.java
  4. 23 0
      fs-service/src/main/java/com/fs/course/mapper/FsCourseSopAppLinkMapper.java
  5. 7 0
      fs-service/src/main/java/com/fs/course/mapper/FsUserCourseMapper.java
  6. 2 0
      fs-service/src/main/java/com/fs/course/service/IFsCourseSopAppLinkService.java
  7. 2 0
      fs-service/src/main/java/com/fs/course/service/IFsUserCourseService.java
  8. 5 0
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseSopAppLinkServiceImpl.java
  9. 5 0
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseServiceImpl.java
  10. 2 0
      fs-service/src/main/java/com/fs/his/config/FsSmsConfig.java
  11. 3 0
      fs-service/src/main/java/com/fs/his/domain/FsUser.java
  12. 3 0
      fs-service/src/main/java/com/fs/his/mapper/FsUserMapper.java
  13. 4 0
      fs-service/src/main/java/com/fs/his/service/IFsUserService.java
  14. 11 0
      fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java
  15. 21 0
      fs-service/src/main/java/com/fs/his/utils/PhoneUtil.java
  16. 8 0
      fs-service/src/main/resources/mapper/his/FsUserMapper.xml
  17. 176 4
      fs-user-app/src/main/java/com/fs/app/controller/AppLoginController.java
  18. 17 0
      fs-user-app/src/main/java/com/fs/app/controller/CommonController.java
  19. 20 0
      fs-user-app/src/main/java/com/fs/app/controller/CourseController.java

+ 25 - 0
fs-service/src/main/java/com/fs/common/VerifyCodeUtil.java

@@ -0,0 +1,25 @@
+package com.fs.common;
+
+import java.security.SecureRandom;
+
+public class VerifyCodeUtil {
+
+    // 使用 SecureRandom 保证安全性
+    private static final SecureRandom random = new SecureRandom();
+
+    /**
+     * 生成随机 6 位数字验证码
+     * @return 六位验证码字符串
+     */
+    public static String generateCode() {
+        int code = 100000 + random.nextInt(900000); // 保证是六位数,范围 100000-999999
+        return String.valueOf(code);
+    }
+
+    public static void main(String[] args) {
+        // 测试
+        for (int i = 0; i < 5; i++) {
+            System.out.println(VerifyCodeUtil.generateCode());
+        }
+    }
+}

+ 2 - 0
fs-service/src/main/java/com/fs/common/service/ISmsService.java

@@ -21,4 +21,6 @@ public interface ISmsService
     R sendOrderMsg(SmsSendUserParam param);
 
     R sendPackageOrderMsg(SmsSendUserParam param);
+
+    R sendCaptcha(String phone, String captcha, String code);
 }

+ 82 - 0
fs-service/src/main/java/com/fs/common/service/impl/SmsServiceImpl.java

@@ -36,6 +36,7 @@ import com.fs.system.domain.SysConfig;
 import com.fs.system.mapper.SysConfigMapper;
 import com.google.gson.Gson;
 import lombok.Synchronized;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
@@ -48,6 +49,7 @@ import java.util.Date;
 import java.util.List;
 
 @Service
+@Slf4j
 public class SmsServiceImpl implements ISmsService
 {
     @Autowired
@@ -527,6 +529,86 @@ public class SmsServiceImpl implements ISmsService
         }
     }
 
+    @Override
+    public R sendCaptcha(String phone, String captcha, String code) {
+        log.info(captcha);
+        CompanySmsTemp temp = smsTempService.selectCompanySmsTempByCode(code);
+        if (temp == null) {
+            return R.error("没有模板");
+        }
+        String content = temp.getContent();
+        if (StringUtils.isNotEmpty(captcha)) {
+            content = content.replace("${sms.captcha}", captcha);
+        }
+        String urls = null;
+        SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey("his.sms");
+        FsSmsConfig sms = JSON.parseObject(sysConfig.getConfigValue(), FsSmsConfig.class);
+        if (sms.getType().equals("rf")) {
+            try {
+                content = content.replace("${sms.sign}",sms.getRfSign());
+                urls = sms.getRfUrl1() + "sms?action=send&account=" + sms.getRfAccount1() + "&password=" + sms.getRfPassword1() + "&mobile=" + phone + "&content=" + URLEncoder.encode(content, "UTF-8") + "&extno=" + sms.getRfCode1() + "&rt=json";
+            } catch (UnsupportedEncodingException e) {
+                e.printStackTrace();
+            }
+            String post = HttpRequest.get(urls)
+                    .execute().body();
+            SmsSendVO vo = JSONUtil.toBean(post, SmsSendVO.class);
+            if (vo.getStatus().equals(0)) {
+                for (SmsSendItemVO itemVO : vo.getList()) {
+                    if (itemVO.getResult().equals("0")) {
+                        CompanySmsLogs logs = new CompanySmsLogs();
+                        logs.setContent(content);
+                        logs.setTempCode(temp.getTempCode());
+                        logs.setTempId(temp.getTempId());
+                        logs.setPhone(phone);
+                        logs.setSendTime(new Date());
+                        logs.setStatus(0);
+                        logs.setType(sms.getType());
+                        logs.setMid(itemVO.getMid());
+                        Integer counts = logs.getContent().length() / 67;
+                        if (logs.getContent().length() % 67 > 0) {
+                            counts = counts + 1;
+                        }
+                        if (counts == 0) {
+                            counts = 1;
+                        }
+                        logs.setNumber(counts);
+                        smsLogsService.insertCompanySmsLogs(logs);
+                    }
+                }
+            }
+        } else if (sms.getType().equals("dh")) {
+            SendSmsReturn sendSmsReturn = null;
+            content = content.replace("${sms.sign}",sms.getDhSign());
+            sendSmsReturn = smsTService.sendSms(sms.getDhAccount1(), sms.getDhPassword1(), content, phone);
+            if (sendSmsReturn != null) {
+                if (sendSmsReturn.getResult() != null && sendSmsReturn.getResult().equals("0")) {
+                    CompanySmsLogs logs = new CompanySmsLogs();
+                    logs.setContent(content);
+                    logs.setTempCode(temp.getTempCode());
+                    logs.setTempId(temp.getTempId());
+                    logs.setPhone(phone);
+                    logs.setSendTime(new Date());
+                    logs.setStatus(0);
+                    logs.setType(sms.getType());
+                    logs.setMid(sendSmsReturn.getMsgid());
+                    Integer counts = logs.getContent().length() / 67;
+                    if (logs.getContent().length() % 67 > 0) {
+                        counts = counts + 1;
+                    }
+                    if (counts == 0) {
+                        counts = 1;
+                    }
+                    logs.setNumber(counts);
+                    smsLogsService.insertCompanySmsLogs(logs);
+                }
+            }
+        }
+
+
+        return R.ok();
+    }
+
 
     @Override
     @Synchronized

+ 23 - 0
fs-service/src/main/java/com/fs/course/mapper/FsCourseSopAppLinkMapper.java

@@ -87,6 +87,29 @@ public interface FsCourseSopAppLinkMapper extends BaseMapper<FsCourseSopAppLink>
             "ORDER BY al.is_read asc,al.create_time desc ")
     List<FsSopMyCourseLinkVO> getSopCourseStudyList(@Param("userId") Long userId);
 
+    /**
+     * 获取用户今日APP看课
+     */
+    @Select("SELECT\n" +
+            "al.id," +
+            "al.link," +
+            "\tal.create_time," +
+            "\tal.update_time,\n" +
+            "\tal.qw_user_name,\n" +
+            "\tal.course_title AS courseName,\n" +
+            "\tal.course_url,\n" +
+            "\tal.video_title AS title,\n" +
+            "\tal.app_real_Link, \n" +
+            "\tal.is_read \n" +
+            "FROM\n" +
+            "\t`fs_course_sop_app_link` al\n" +
+            "\tLEFT JOIN qw_external_contact ec ON al.qw_external_id = ec.id \n" +
+            "WHERE\n" +
+            "\tec.fs_user_id = #{userId} \n" +
+            "\tAND DATE(al.create_time) = CURDATE() " +
+            "LIMIT 1 ")
+    FsSopMyCourseLinkVO getTodaySopCourseStudy(@Param("userId") Long userId);
+
     @Select("SELECT\n" +
             "\tcount(1) as isNotRead\n" +
             "FROM\n" +

+ 7 - 0
fs-service/src/main/java/com/fs/course/mapper/FsUserCourseMapper.java

@@ -128,6 +128,13 @@ public interface FsUserCourseMapper
             "</script>"})
     List<FsUserCourseListUVO> selectFsUserCourseListUVO(@Param("maps") FsUserCourseListUParam param);
 
+    @Select({"<script> " +
+            "select c.*,t.nick_name as talent_name,t.avatar from fs_user_course  c  " +
+            "left join fs_user_talent t on c.talent_id = t.talent_id " +
+            "where c.is_del = 0 and c.is_show = 1 and c.is_private = 0  LIMIT 1 " +
+            "</script>"})
+    FsUserCourseListUVO selectFsUserCourseUVO();
+
 
     @Select({"<script> " +
             "select c.*,cc.cate_name,ucc.cate_name as sub_cate_name from fs_user_course  c " +

+ 2 - 0
fs-service/src/main/java/com/fs/course/service/IFsCourseSopAppLinkService.java

@@ -65,6 +65,8 @@ public interface IFsCourseSopAppLinkService extends IService<FsCourseSopAppLink>
 
     List<FsSopMyCourseLinkVO>  getSopCourseStudyList(Long userId);
 
+    FsSopMyCourseLinkVO getTodaySopCourseStudy(Long id);
+
     Integer selectSopCountIsNotRead(Long userId);
 
     int updateFsCourseSopAppLinkByLink(String id);

+ 2 - 0
fs-service/src/main/java/com/fs/course/service/IFsUserCourseService.java

@@ -85,6 +85,8 @@ public interface IFsUserCourseService
 
     List<FsUserCourseListUVO> selectFsUserCourseListUVO(FsUserCourseListUParam param);
 
+    FsUserCourseListUVO selectFsUserCourseUVO();
+
     List<OptionsVO> selectFsUserCourseAllList();
 
     List<FsUserCourseListPVO> selectFsUserCourseListPVO(FsUserCourse param);

+ 5 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsCourseSopAppLinkServiceImpl.java

@@ -98,6 +98,11 @@ public class FsCourseSopAppLinkServiceImpl extends ServiceImpl<FsCourseSopAppLin
         return baseMapper.getSopCourseStudyList(userId);
     }
 
+    @Override
+    public FsSopMyCourseLinkVO getTodaySopCourseStudy(Long id) {
+        return baseMapper.getTodaySopCourseStudy(id);
+    }
+
     @Override
     public Integer selectSopCountIsNotRead(Long userId) {
         return baseMapper.selectSopCountIsNotRead(userId);

+ 5 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseServiceImpl.java

@@ -277,6 +277,11 @@ public class FsUserCourseServiceImpl implements IFsUserCourseService
         return fsUserCourseMapper.selectFsUserCourseListUVO(param);
     }
 
+    @Override
+    public FsUserCourseListUVO selectFsUserCourseUVO() {
+        return fsUserCourseMapper.selectFsUserCourseUVO();
+    }
+
     @Override
     public List<FsUserCourseListUVO> selectFsUserCourseCommentListUVO(FsUserCourseListUParam param) {
         return fsUserCourseMapper.selectFsUserCourseCommentListUVO(param);

+ 2 - 0
fs-service/src/main/java/com/fs/his/config/FsSmsConfig.java

@@ -21,4 +21,6 @@ public class FsSmsConfig {
     private String dhPassword2;
     private String dhSign;
 
+    private Integer isSmsVerification; //是否开启短信验证
+
 }

+ 3 - 0
fs-service/src/main/java/com/fs/his/domain/FsUser.java

@@ -153,6 +153,9 @@ public class FsUser extends BaseEntity
      * 企微销售ID
      * **/
     private Long qwUserId;
+
+    /** app登录后不为null(表示是否下载app) */
+    private String historyApp;
     public void setNickName(String nickname)
     {
         if(StringUtils.isNotEmpty(nickname)){

+ 3 - 0
fs-service/src/main/java/com/fs/his/mapper/FsUserMapper.java

@@ -414,4 +414,7 @@ public interface FsUserMapper
     Map<String, Object> countUserStats(
             UserStatisticsCommonParam param);
 
+    void updatePasswordByPhone(@Param("password")String password, @Param("encryptPhone")String encryptPhone);
+
+    List<FsUser> selectFsUserListByPhone(String phone);
 }

+ 4 - 0
fs-service/src/main/java/com/fs/his/service/IFsUserService.java

@@ -224,4 +224,8 @@ public interface IFsUserService
     void handleFsUserWx(FsUser user, LoginMaWxParam param, WxMaJscode2SessionResult session);
 
     R removeUser(Long id);
+
+    List<FsUser> selectFsUserListByPhone(String phone);
+
+    R updatePasswordByPhone(String password, String encryptPhone);
 }

+ 11 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java

@@ -1383,4 +1383,15 @@ public class FsUserServiceImpl implements IFsUserService {
         return R.ok();
     }
 
+    @Override
+    public List<FsUser> selectFsUserListByPhone(String phone) {
+        return fsUserMapper.selectFsUserListByPhone(phone);
+    }
+
+    @Override
+    public R updatePasswordByPhone(String password, String encryptPhone) {
+        fsUserMapper.updatePasswordByPhone(password, encryptPhone);
+        return R.ok();
+    }
+
 }

+ 21 - 0
fs-service/src/main/java/com/fs/his/utils/PhoneUtil.java

@@ -115,4 +115,25 @@ public class PhoneUtil {
         // 这个阈值可以根据实际数据调整
         return entropy > 3.5;
     }
+
+    /**
+     * 用于查询 使用老的数据加密
+     * @param text
+     * @return
+     */
+    private static String OLD_KEY = "2c8d1a7f4e9b3c6ae6d5c4b3a291f8c9";
+    public static String encryptPhoneOldKey(String text) {
+        String encryptedText=null;
+        try {
+            SecretKeySpec secretKey = new SecretKeySpec(OLD_KEY.getBytes(), "AES");
+            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
+            // Encryption
+            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
+            byte[] encryptedBytes = cipher.doFinal(text.getBytes());
+            encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return encryptedText;
+    }
 }

+ 8 - 0
fs-service/src/main/resources/mapper/his/FsUserMapper.xml

@@ -2266,4 +2266,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </if>
     </select>
 
+    <update id="updatePasswordByPhone">
+        update fs_user set password = #{password} where phone = #{encryptPhone}
+    </update>
+
+    <select id="selectFsUserListByPhone" resultType="com.fs.his.domain.FsUser">
+        select * from fs_user where phone=#{phone}
+    </select>
+
 </mapper>

+ 176 - 4
fs-user-app/src/main/java/com/fs/app/controller/AppLoginController.java

@@ -1,13 +1,17 @@
 package com.fs.app.controller;
 
 
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateTime;
 import com.fs.app.annotation.Login;
 import com.fs.app.param.*;
 import com.fs.app.utils.WxUtil;
+import com.fs.common.VerifyCodeUtil;
 import com.fs.common.annotation.RepeatSubmit;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.common.exception.ServiceException;
+import com.fs.common.service.ISmsService;
 import com.fs.common.utils.sign.Md5Utils;
 import com.fs.core.config.WxOpenProperties;
 import com.fs.his.config.FsSysConfig;
@@ -35,13 +39,11 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import java.time.LocalDateTime;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 
 import static com.fs.his.utils.PhoneUtil.encryptPhone;
+import static com.fs.his.utils.PhoneUtil.encryptPhoneOldKey;
 
 @Api("app登录接口")
 @RestController
@@ -58,6 +60,9 @@ public class AppLoginController extends AppBaseController{
     @Autowired
     private WxOpenProperties openProperties;
 
+    @Autowired
+    private ISmsService smsService;
+
     @Autowired
     private RedisCache redisCache;
     @ApiOperation("注册app用户")
@@ -117,6 +122,82 @@ public class AppLoginController extends AppBaseController{
     }
 
 
+    @PostMapping("/registerSendCode")
+    public R registerSendCode(@RequestBody Map<String, String> body){
+        String phone = body.get("phone");
+        String encryptPhone = encryptPhone(phone);
+        List<FsUser> user = userService.selectFsUserListByPhone(encryptPhone);
+        if(CollectionUtil.isEmpty(user)){
+            user = userService.selectFsUserListByPhone(encryptPhoneOldKey(phone));
+        }
+        if (!CollectionUtil.isEmpty(user)){
+            return R.error("此电话号码已注册");
+        }
+
+        // 验证码 key(存验证码,3分钟有效)
+        String smsCodeKey = "sms:code:" + phone;
+        // 发送冷却 key(限制60秒内不能再次发送)
+        String smsCooldownKey = "sms:cooldown:" + phone;
+
+        // 判断是否在60秒冷却时间内
+        if (redisCache.getCacheObject(smsCooldownKey) != null) {
+            return R.error("验证码已发送,请稍后再试");
+        }
+
+        // 生成新的验证码
+        String smsCode = VerifyCodeUtil.generateCode();
+
+        // 发送短信
+        smsService.sendCaptcha(phone, smsCode, "验证码");
+
+        // 缓存验证码(3分钟有效)
+        redisCache.setCacheObject(smsCodeKey, smsCode, 180, TimeUnit.SECONDS);
+        // 设置冷却时间(60秒内不能再发)
+        redisCache.setCacheObject(smsCooldownKey, "1", 60, TimeUnit.SECONDS);
+
+        return R.ok("验证码已发送");
+    }
+
+
+    @PostMapping("/registerByPhone")
+    public R registerByPhone(@RequestBody Map<String,String> map){
+        String phone = map.get("phone");
+        String code = map.get("code");
+        String password = map.get("password");
+        String encryptPhone = encryptPhone(phone);
+        List<FsUser> users = userService.selectFsUserListByPhone(encryptPhone);
+        if (users == null || CollectionUtil.isEmpty(users)){
+            String s = encryptPhoneOldKey(phone);
+            users = userService.selectFsUserListByPhone(s);
+        }
+        if (!CollectionUtil.isEmpty(users)){
+            return R.error("此账号已经注册");
+        }
+        String redisCode = redisCache.getCacheObject("sms:code:" + phone);
+        if (StringUtils.isEmpty(redisCode)){
+            return R.error("验证码已过期,请重新发送");
+        }
+        if (!redisCode.equals(code)) {
+            return R.error("验证码错误");
+        }
+        FsUser user = new FsUser();
+        // 创建新用户
+        user.setPhone(phone);
+        user.setJpushId(map.get("jpushId"));
+        user.setSource(map.get("source"));
+        user.setNickName("app用户" + phone.substring(phone.length() - 4));
+        user.setStatus(1);
+        user.setAvatar("https://cos.his.cdwjyyh.com/fs/20240926/420728ee06e54575ba82665dedb4756b.png");
+        user.setPassword(Md5Utils.hash(password));
+        user.setCreateTime(new Date());
+        if (userService.insertFsUser(user) > 0) {
+            return R.ok("注册成功");
+        } else {
+            return R.error("注册失败");
+        }
+    }
+
+
 
 
 
@@ -210,6 +291,61 @@ public class AppLoginController extends AppBaseController{
 
     }
 
+    @PostMapping("/loginByPhone")
+    public R loginByPhone(@RequestBody Map<String,String> map){
+        String phone = map.get("phone");
+        String code = map.get("code");
+        String encryptPhone = encryptPhone(phone);
+        List<FsUser> user = userService.selectFsUserListByPhone(encryptPhone);
+        if (CollectionUtil.isEmpty(user)){
+            user = userService.selectFsUserListByPhone(encryptPhoneOldKey(phone));
+        }
+        if (CollectionUtil.isEmpty(user)){
+            return R.error("此电话号码未绑定用户");
+        }
+        if (user.size()>1){
+            //如果出现了一个手机号多个用户的情况,找出登陆过app的那个用户
+            user.removeIf(fsUser -> StringUtils.isEmpty(fsUser.getHistoryApp()));
+        }
+        String redisCode = redisCache.getCacheObject("sms:code:" + phone);
+        if (StringUtils.isEmpty(redisCode)){
+            return R.error("验证码已过期,请重新发送");
+        }
+        if (!redisCode.equals(code)) {
+            return R.error("验证码错误");
+        }
+        updateExistingUserJpushId(user.get(0), map.get("jpushId"));
+        return generateTokenAndReturn(user.get(0));
+    }
+
+    @PostMapping("/resetPassword")
+    public R resetPassword(@RequestBody Map<String, String> body){
+        String phone = body.get("phone");
+        String code = body.get("code");
+        String newPassword = body.get("newPassword");
+        String confirmPassword = body.get("confirmPassword");
+        if (!newPassword.equals(confirmPassword)){
+            throw new ServiceException("两次输入密码不一致,请检查");
+        }
+        String encryptPhone = encryptPhone(phone);
+        List<FsUser> user = userService.selectFsUserListByPhone(encryptPhone);
+        if (CollectionUtil.isEmpty(user)){
+            user = userService.selectFsUserListByPhone(encryptPhoneOldKey(phone));
+        }
+        if (CollectionUtil.isEmpty(user)){
+            return R.error("此电话号码未绑定用户");
+        }
+        String redisCode = redisCache.getCacheObject("sms:code:" + phone);
+        if (StringUtils.isEmpty(redisCode)){
+            return R.error("验证码已过期,请重新发送");
+        }
+        if (!redisCode.equals(code)) {
+            return R.error("验证码错误");
+        }
+        String password = Md5Utils.hash(newPassword);
+        return userService.updatePasswordByPhone(password,encryptPhone);
+    }
+
     @ApiOperation("绑定手机号")
     @PostMapping("/setPhone")
     public R setPhone(@Validated @RequestBody FsUserEditPhoneParam param) {
@@ -424,4 +560,40 @@ public class AppLoginController extends AppBaseController{
             return R.error("用户不存在!");
         }
     }
+
+    @PostMapping("/sendCode")
+    public R sendCode(@RequestBody Map<String, String> body){
+        String phone = body.get("phone");
+        String encryptPhone = encryptPhone(phone);
+        List<FsUser> user = userService.selectFsUserListByPhone(encryptPhone);
+        if(CollectionUtil.isEmpty(user)){
+            user = userService.selectFsUserListByPhone(encryptPhoneOldKey(phone));
+        }
+        if (CollectionUtil.isEmpty(user)){
+            return R.error("此电话号码未绑定用户");
+        }
+
+        // 验证码 key(3分钟有效)
+        String smsCodeKey = "sms:code:" + phone;
+        // 冷却 key(60秒内不能重复发送)
+        String smsCooldownKey = "sms:cooldown:" + phone;
+
+        // 判断是否在 60 秒冷却期
+        if (redisCache.getCacheObject(smsCooldownKey) != null) {
+            return R.error("验证码已发送,请稍后再试");
+        }
+
+        // 生成新验证码
+        String smsCode = VerifyCodeUtil.generateCode();
+
+        // 发送短信
+        smsService.sendCaptcha(phone, smsCode, "验证码");
+
+        // 缓存验证码(3分钟有效)
+        redisCache.setCacheObject(smsCodeKey, smsCode, 180, TimeUnit.SECONDS);
+        // 设置冷却时间(60秒内不能再发)
+        redisCache.setCacheObject(smsCooldownKey, "1", 60, TimeUnit.SECONDS);
+
+        return R.ok("验证码已发送");
+    }
 }

+ 17 - 0
fs-user-app/src/main/java/com/fs/app/controller/CommonController.java

@@ -36,6 +36,7 @@ import com.fs.event.TemplateEvent;
 import com.fs.event.TemplateListenEnum;
 import com.fs.event.WeixinTemplateService;
 import com.fs.framework.config.ServerConfig;
+import com.fs.his.config.FsSmsConfig;
 import com.fs.his.config.FsSysConfig;
 import com.fs.his.domain.*;
 import com.fs.his.param.FsInquiryOrderFinishParam;
@@ -612,4 +613,20 @@ public class CommonController {
 		return ResponseResult.ok(config.getIsOpenIM());
 	}
 
+	@GetMapping(value = "/isSmsVerification")
+	@ApiOperation("获取app是否短信验证配置")
+	public R isSmsVerification()
+	{
+		String config=configService.selectConfigByKey("his.sms");
+		if (StringUtils.isBlank(config)){
+			return  R.ok().put("isSmsVerification",0);
+		}
+		FsSmsConfig sms = JSON.parseObject(config, FsSmsConfig.class);
+		if (sms != null && sms.getIsSmsVerification() != null){
+			return R.ok().put("isSmsVerification",sms.getIsSmsVerification());
+		}
+		return  R.ok().put("isSmsVerification",0);
+
+	}
+
 }

+ 20 - 0
fs-user-app/src/main/java/com/fs/app/controller/CourseController.java

@@ -17,6 +17,8 @@ import io.jsonwebtoken.Claims;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.Synchronized;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.transaction.annotation.Transactional;
@@ -29,6 +31,7 @@ import java.util.*;
 @RestController
 @RequestMapping(value="/app/course")
 public class CourseController extends  AppBaseController{
+    Logger logger= LoggerFactory.getLogger(getClass());
     @Autowired
     private IFsUserCourseService courseService;
     @Autowired
@@ -160,6 +163,23 @@ public class CourseController extends  AppBaseController{
         return R.ok().put("data",listPageInfo).put("isNotRead",isNotRead);
     }
 
+    @Login
+    @ApiOperation("获取我的今日课程")
+    @GetMapping("/getTodaySopCourseStudy")
+    public R getTodaySopCourseStudy(){
+        long userId = Long.parseLong(getUserId());
+        logger.info("获取今日课程用户id:{}",userId);
+        int isPrivate = 1;//私有课程
+        //获取今日课程
+        FsSopMyCourseLinkVO vo = courseSopAppLinkService.getTodaySopCourseStudy(userId);
+        if(vo==null){
+            isPrivate = 2;//公开课
+            FsUserCourseListUVO courseListUVO = courseService.selectFsUserCourseUVO();
+            return R.ok().put("data",courseListUVO).put("isPrivate",isPrivate);
+        }
+        return R.ok().put("data",vo).put("isPrivate",isPrivate);
+    }
+
     @Login
     @ApiOperation("修改我的sop课程已读未读状态")
     @GetMapping("/updateSopAppLink/{id}")