فهرست منبع

fix:(批量)新增用户手机号可以为空、用户登录修改

caozixuan 3 سال پیش
والد
کامیت
ff97834ca0
30فایلهای تغییر یافته به همراه347 افزوده شده و 73 حذف شده
  1. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/approvalForm/ApprovalInfo.java
  2. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/approvalForm/BasicInfo.java
  3. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/approvalForm/ExamPackageDetail.java
  4. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/approvalForm/ExamRoomInfo.java
  5. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/approvalForm/ExamTaskApprovalFormDto.java
  6. 2 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/examObject/ExamObjectDto.java
  7. 11 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/LoginParam.java
  8. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamTaskMapper.java
  9. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamTaskReviewLogMapper.java
  10. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamTaskReviewLogService.java
  11. 2 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamTaskService.java
  12. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskReviewLogServiceImpl.java
  13. 2 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java
  14. 7 6
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/TaskLogicServiceImpl.java
  15. 1 1
      distributed-print-business/src/main/resources/mapper/ExamTaskMapper.xml
  16. 1 1
      distributed-print-business/src/main/resources/mapper/ExamTaskReviewLogMapper.xml
  17. 12 26
      distributed-print/src/main/java/com/qmth/distributed/print/api/SysController.java
  18. 3 0
      distributed-print/src/main/java/com/qmth/distributed/print/api/SysUserController.java
  19. 1 3
      distributed-print/src/test/java/com/qmth/distributed/print/ServiceTest.java
  20. 93 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/VerifyCodeCheckDto.java
  21. 0 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/excel/SysUserImportDto.java
  22. 11 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/result/LoginResult.java
  23. 55 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/result/UserLoginCheckResult.java
  24. 13 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/SysUser.java
  25. 9 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/mapper/SysUserMapper.java
  26. 8 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/SysUserService.java
  27. 76 15
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysUserServiceImpl.java
  28. 2 4
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/TeachcloudCommonServiceImpl.java
  29. 27 0
      teachcloud-common/src/main/resources/mapper/SysUserMapper.xml
  30. 2 0
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/SysController.java

+ 1 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ApprovalForm/ApprovalInfo.java → distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/approvalForm/ApprovalInfo.java

@@ -1,4 +1,4 @@
-package com.qmth.distributed.print.business.bean.dto.ApprovalForm;
+package com.qmth.distributed.print.business.bean.dto.approvalForm;
 
 import io.swagger.annotations.ApiModelProperty;
 

+ 1 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ApprovalForm/BasicInfo.java → distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/approvalForm/BasicInfo.java

@@ -1,4 +1,4 @@
-package com.qmth.distributed.print.business.bean.dto.ApprovalForm;
+package com.qmth.distributed.print.business.bean.dto.approvalForm;
 
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;

+ 1 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ApprovalForm/ExamPackageDetail.java → distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/approvalForm/ExamPackageDetail.java

@@ -1,4 +1,4 @@
-package com.qmth.distributed.print.business.bean.dto.ApprovalForm;
+package com.qmth.distributed.print.business.bean.dto.approvalForm;
 
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;

+ 1 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ApprovalForm/ExamRoomInfo.java → distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/approvalForm/ExamRoomInfo.java

@@ -1,4 +1,4 @@
-package com.qmth.distributed.print.business.bean.dto.ApprovalForm;
+package com.qmth.distributed.print.business.bean.dto.approvalForm;
 
 import io.swagger.annotations.ApiModelProperty;
 

+ 1 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ApprovalForm/ExamTaskApprovalFormDto.java → distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/approvalForm/ExamTaskApprovalFormDto.java

@@ -1,4 +1,4 @@
-package com.qmth.distributed.print.business.bean.dto.ApprovalForm;
+package com.qmth.distributed.print.business.bean.dto.approvalForm;
 
 import io.swagger.annotations.ApiModelProperty;
 

+ 2 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamObject/ExamObjectDto.java → distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/examObject/ExamObjectDto.java

@@ -1,6 +1,6 @@
-package com.qmth.distributed.print.business.bean.dto.ExamObject;
+package com.qmth.distributed.print.business.bean.dto.examObject;
 
-import com.qmth.distributed.print.business.bean.dto.ApprovalForm.ExamRoomInfo;
+import com.qmth.distributed.print.business.bean.dto.approvalForm.ExamRoomInfo;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.util.List;

+ 11 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/LoginParam.java

@@ -20,6 +20,9 @@ public class LoginParam extends ClientLoginParam {
     @NotBlank(message = "学校代码不能为空")
     private String schoolCode;
 
+    @ApiModelProperty(value = "用户手机号(优先给用户填的手机号发短信)")
+    private String mobileNumber;
+
     public String getSchoolCode() {
         return schoolCode;
     }
@@ -35,4 +38,12 @@ public class LoginParam extends ClientLoginParam {
     public void setCode(String code) {
         this.code = code;
     }
+
+    public String getMobileNumber() {
+        return mobileNumber;
+    }
+
+    public void setMobileNumber(String mobileNumber) {
+        this.mobileNumber = mobileNumber;
+    }
 }

+ 1 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamTaskMapper.java

@@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qmth.distributed.print.business.bean.dto.*;
-import com.qmth.distributed.print.business.bean.dto.ApprovalForm.ExamPackageDetail;
+import com.qmth.distributed.print.business.bean.dto.approvalForm.ExamPackageDetail;
 import com.qmth.distributed.print.business.bean.result.WorkResult;
 import com.qmth.distributed.print.business.entity.ExamTask;
 import com.qmth.distributed.print.business.enums.MakeMethodEnum;

+ 1 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamTaskReviewLogMapper.java

@@ -1,7 +1,7 @@
 package com.qmth.distributed.print.business.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.qmth.distributed.print.business.bean.dto.ApprovalForm.ApprovalInfo;
+import com.qmth.distributed.print.business.bean.dto.approvalForm.ApprovalInfo;
 import com.qmth.distributed.print.business.bean.dto.ReviewLogDto;
 import com.qmth.distributed.print.business.entity.ExamTaskReviewLog;
 import org.apache.ibatis.annotations.Param;

+ 1 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamTaskReviewLogService.java

@@ -1,7 +1,7 @@
 package com.qmth.distributed.print.business.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.qmth.distributed.print.business.bean.dto.ApprovalForm.ApprovalInfo;
+import com.qmth.distributed.print.business.bean.dto.approvalForm.ApprovalInfo;
 import com.qmth.distributed.print.business.bean.dto.ReviewLogDto;
 import com.qmth.distributed.print.business.entity.ExamTaskReviewLog;
 

+ 2 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamTaskService.java

@@ -3,8 +3,8 @@ package com.qmth.distributed.print.business.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.distributed.print.business.bean.dto.*;
-import com.qmth.distributed.print.business.bean.dto.ApprovalForm.ExamTaskApprovalFormDto;
-import com.qmth.distributed.print.business.bean.dto.ExamObject.ExamObjectDto;
+import com.qmth.distributed.print.business.bean.dto.approvalForm.ExamTaskApprovalFormDto;
+import com.qmth.distributed.print.business.bean.dto.examObject.ExamObjectDto;
 import com.qmth.distributed.print.business.bean.params.ExamTaskApplyParam;
 import com.qmth.distributed.print.business.bean.result.WorkResult;
 import com.qmth.distributed.print.business.entity.ExamTask;

+ 1 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskReviewLogServiceImpl.java

@@ -1,7 +1,7 @@
 package com.qmth.distributed.print.business.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.qmth.distributed.print.business.bean.dto.ApprovalForm.ApprovalInfo;
+import com.qmth.distributed.print.business.bean.dto.approvalForm.ApprovalInfo;
 import com.qmth.distributed.print.business.bean.dto.ReviewLogDto;
 import com.qmth.distributed.print.business.entity.ExamTaskReviewLog;
 import com.qmth.distributed.print.business.mapper.ExamTaskReviewLogMapper;

+ 2 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java

@@ -8,9 +8,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
 import com.google.gson.Gson;
-import com.qmth.distributed.print.business.bean.dto.ApprovalForm.*;
+import com.qmth.distributed.print.business.bean.dto.approvalForm.*;
 import com.qmth.distributed.print.business.bean.dto.*;
-import com.qmth.distributed.print.business.bean.dto.ExamObject.ExamObjectDto;
+import com.qmth.distributed.print.business.bean.dto.examObject.ExamObjectDto;
 import com.qmth.distributed.print.business.bean.params.ExamDetailList;
 import com.qmth.distributed.print.business.bean.params.ExamDetailParams;
 import com.qmth.distributed.print.business.bean.params.ExamTaskApplyParam;

+ 7 - 6
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/TaskLogicServiceImpl.java

@@ -1248,13 +1248,14 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                         checkCode.put(code, name);
                     }
                     // 如果电话有值则检验电话excel中唯一性
-                    if (checkPhoneMap.containsKey(phoneNumber)) {
-                        throw ExceptionResultEnum.ERROR.exception("导入的excel中包含在重复的【电话号码】:" + phoneNumber);
-                    } else {
-                        checkPhoneMap.put(phoneNumber, code);
+                    if (SystemConstant.strNotNull(phoneNumber)){
+                        if (checkPhoneMap.containsKey(phoneNumber)) {
+                            throw ExceptionResultEnum.ERROR.exception("导入的excel中包含在重复的【电话号码】:" + phoneNumber);
+                        } else {
+                            checkPhoneMap.put(phoneNumber, code);
+                        }
                     }
 
-
                     excelErrorTemp.addAll(ExcelUtil.checkExcelField(sysUserImportDto, y, i));
                     if (Objects.isNull(code) || code.length() > 30 || !code.matches(SystemConstant.REGULAR_EXPRESSION_OF_CODE)) {
                         excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[课程编号]不符合输入规范"));
@@ -1262,7 +1263,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                     if (Objects.isNull(name) || name.length() > 30) {
                         excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[课程名称]不符合输入规范"));
                     }
-                    if (Objects.isNull(phoneNumber) || !phoneNumber.matches(SystemConstant.REGULAR_EXPRESSION_OF_PHONE)) {
+                    if (Objects.nonNull(phoneNumber) && !phoneNumber.matches(SystemConstant.REGULAR_EXPRESSION_OF_PHONE)) {
                         excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[电话号码]不符合输入规范"));
                     }
                 }

+ 1 - 1
distributed-print-business/src/main/resources/mapper/ExamTaskMapper.xml

@@ -1041,7 +1041,7 @@
         order by et.paper_number asc
     </select>
     <select id="findExamPackageDetailByPaperNumber"
-            resultType="com.qmth.distributed.print.business.bean.dto.ApprovalForm.ExamPackageDetail">
+            resultType="com.qmth.distributed.print.business.bean.dto.approvalForm.ExamPackageDetail">
         SELECT
             ed.id AS examDetailId,
             ed.exam_start_time AS examStartTime,

+ 1 - 1
distributed-print-business/src/main/resources/mapper/ExamTaskReviewLogMapper.xml

@@ -35,7 +35,7 @@
     </select>
 
     <select id="findOnePassBySetUp"
-            resultType="com.qmth.distributed.print.business.bean.dto.ApprovalForm.ApprovalInfo">
+            resultType="com.qmth.distributed.print.business.bean.dto.approvalForm.ApprovalInfo">
         SELECT
             tffl.approve_remark AS remark,
             tffl.approve_setup AS level,

+ 12 - 26
distributed-print/src/main/java/com/qmth/distributed/print/api/SysController.java

@@ -8,6 +8,7 @@ import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.boot.api.exception.ApiException;
 import com.qmth.distributed.print.business.bean.params.LoginParam;
 import com.qmth.distributed.print.business.bean.result.EditResult;
+import com.qmth.teachcloud.common.bean.result.UserLoginCheckResult;
 import com.qmth.distributed.print.business.entity.BasicVerifyCode;
 import com.qmth.distributed.print.business.enums.SystemCodeEnum;
 import com.qmth.distributed.print.business.service.BasicVerifyCodeService;
@@ -138,26 +139,8 @@ public class SysController {
         if (Objects.nonNull(sysUser.getSchoolId()) && sysUser.getSchoolId().longValue() != basicSchool.getId().longValue()) {
             throw ExceptionResultEnum.ERROR.exception("用户学校不匹配");
         }
-//        校验验证码
-        SysConfig value = sysConfigService.getByKey("sys.code.enable");
-        if (Objects.nonNull(value) && value.getConfigValue().equals("true")) {
-            String code = login.getCode();
-            if (Objects.isNull(code)) {
-                throw ExceptionResultEnum.ERROR.exception("验证码为空");
-            }
-            if (!dictionaryConfig.smsDomain().getSmsNormalCode().equals(code)) {
-                QueryWrapper<BasicVerifyCode> codeWrapper = new QueryWrapper<>();
-                codeWrapper.lambda().eq(BasicVerifyCode::getMobileNumber, sysUser.getMobileNumber()).eq(BasicVerifyCode::getUserId, sysUser.getId());
-                BasicVerifyCode accessControl = basicVerifyCodeService.getOne(codeWrapper);
-                if (accessControl == null || (accessControl != null && !accessControl.getVerifyCode().equals(code))) {
-                    throw ExceptionResultEnum.ERROR.exception("短信验证码错误,请仔细核对后再次输入");
-                }
-
-                if (new Date(accessControl.getExpireTime()).before(new Date())) {
-                    throw ExceptionResultEnum.ERROR.exception("短信验证码已过期");
-                }
-            }
-        }
+        // 校验验证码
+        sysUserService.checkSmsCode(sysUser.getId(), sysUser.getMobileNumber(), login.getCode());
         return ResultUtil.ok(teachcloudCommonService.login(login.getPassword(), sysUser, AppSourceEnum.SYSTEM));
     }
 
@@ -184,7 +167,7 @@ public class SysController {
     @ApiOperation(value = "发送验证码")
     @RequestMapping(value = "/get_verify_code", method = RequestMethod.POST)
     @Aac(auth = BOOL.FALSE)
-    public Object getverifyCode(@RequestBody LoginParam loginParam) {
+    public Result getVerifyCode(@RequestBody LoginParam loginParam) {
         String loginName = loginParam.getLoginName();
         String password = loginParam.getPassword();
         QueryWrapper<SysUser> wrapper = new QueryWrapper<>();
@@ -201,12 +184,15 @@ public class SysController {
         if (!password.equals(user.getPassword())) {
             throw ExceptionResultEnum.ERROR.exception("密码错误");
         }
-        String mobileNumber = user.getMobileNumber();
-        if (Objects.isNull(mobileNumber)) {
-            throw ExceptionResultEnum.ERROR.exception("用户未绑定手机号码");
+        String mobileNumber = loginParam.getMobileNumber();
+        if (!SystemConstant.strNotNull(mobileNumber)){
+            mobileNumber = user.getMobileNumber();
+        }
+        if (SystemConstant.strNotNull(mobileNumber)) {
+            basicVerifyCodeService.sendVeirfyCode(mobileNumber, user.getId());
         }
-        basicVerifyCodeService.sendVeirfyCode(mobileNumber, user.getId());
-        return ResultUtil.ok(mobileNumber, "");
+        UserLoginCheckResult userLoginCheckResult = new UserLoginCheckResult(user.getId(),mobileNumber,user.getPwdCount());
+        return ResultUtil.ok(userLoginCheckResult, "");
     }
 
     @ApiOperation(value = "根据机构代码查询机构信息接口")

+ 3 - 0
distributed-print/src/main/java/com/qmth/distributed/print/api/SysUserController.java

@@ -1,5 +1,7 @@
 package com.qmth.distributed.print.api;
 
+import com.qmth.boot.api.annotation.Aac;
+import com.qmth.boot.api.annotation.BOOL;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.distributed.print.business.bean.result.EditResult;
 import com.qmth.distributed.print.business.service.PrintCommonService;
@@ -163,6 +165,7 @@ public class SysUserController {
      */
     @ApiOperation(value = "修改密码")
     @RequestMapping(value = "/update_password", method = RequestMethod.POST)
+    @Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
     public Result updatePassword(@RequestBody SysUser user) throws NoSuchAlgorithmException {
         return ResultUtil.ok(sysUserService.updatePassword(user));
     }

+ 1 - 3
distributed-print/src/test/java/com/qmth/distributed/print/ServiceTest.java

@@ -2,11 +2,10 @@ package com.qmth.distributed.print;
 
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.qmth.distributed.print.business.bean.dto.ExamObject.ExamObjectDto;
+import com.qmth.distributed.print.business.bean.dto.examObject.ExamObjectDto;
 import com.qmth.distributed.print.business.bean.result.TemplatePrintInfoResult;
 import com.qmth.distributed.print.business.entity.ExamCardDetail;
 import com.qmth.distributed.print.business.entity.ExamPrintPlan;
-import com.qmth.distributed.print.business.entity.ExamTask;
 import com.qmth.distributed.print.business.enums.MessageEnum;
 import com.qmth.distributed.print.business.service.*;
 import com.qmth.teachcloud.common.contant.SystemConstant;
@@ -14,7 +13,6 @@ import com.qmth.teachcloud.common.entity.BasicAttachment;
 import com.qmth.teachcloud.common.entity.BasicCourse;
 import com.qmth.teachcloud.common.service.BasicCourseService;
 import com.qmth.teachcloud.common.util.ConvertUtil;
-import org.activiti.engine.task.Attachment;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.boot.test.context.SpringBootTest;

+ 93 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/VerifyCodeCheckDto.java

@@ -0,0 +1,93 @@
+package com.qmth.teachcloud.common.bean.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.teachcloud.common.base.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 短信验证码校验dto
+ * @Author: CaoZixuan
+ * @Date: 2021-10-09
+ */
+public class VerifyCodeCheckDto extends BaseEntity {
+    @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long schoolId;
+
+    @ApiModelProperty(value = "机构id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long orgId;
+
+    @ApiModelProperty(value = "发送用户id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long userId;
+
+    @ApiModelProperty(value = "发送用户手机号")
+    private String mobilePhone;
+
+    @ApiModelProperty(value = "到期时间")
+    private Long expireTime;
+
+    @ApiModelProperty(value = "延期时间(分钟)")
+    private Integer validPeriod;
+
+    @ApiModelProperty(value = "四位验证码")
+    private String verifyCode;
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public Long getOrgId() {
+        return orgId;
+    }
+
+    public void setOrgId(Long orgId) {
+        this.orgId = orgId;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public String getMobilePhone() {
+        return mobilePhone;
+    }
+
+    public void setMobilePhone(String mobilePhone) {
+        this.mobilePhone = mobilePhone;
+    }
+
+    public Long getExpireTime() {
+        return expireTime;
+    }
+
+    public void setExpireTime(Long expireTime) {
+        this.expireTime = expireTime;
+    }
+
+    public Integer getValidPeriod() {
+        return validPeriod;
+    }
+
+    public void setValidPeriod(Integer validPeriod) {
+        this.validPeriod = validPeriod;
+    }
+
+    public String getVerifyCode() {
+        return verifyCode;
+    }
+
+    public void setVerifyCode(String verifyCode) {
+        this.verifyCode = verifyCode;
+    }
+}

+ 0 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/excel/SysUserImportDto.java

@@ -21,7 +21,6 @@ public class SysUserImportDto implements Serializable {
     private String code;
 
     @ExcelNote(value = "手机号")
-    @NotNull
     private String phoneNumber;
 
     @ExcelNote(value = "组织架构")

+ 11 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/result/LoginResult.java

@@ -57,6 +57,9 @@ public class LoginResult implements Serializable {
     @ApiModelProperty(value = "密码修改次数")
     Integer pwdCount;
 
+    @ApiModelProperty(value = "用户登录验证拦截信息")
+    private UserLoginCheckResult userLoginCheckResult;
+
     public LoginResult() {
 
     }
@@ -171,6 +174,14 @@ public class LoginResult implements Serializable {
         this.pwdCount = pwdCount;
     }
 
+    public UserLoginCheckResult getUserLoginCheckResult() {
+        return userLoginCheckResult;
+    }
+
+    public void setUserLoginCheckResult(UserLoginCheckResult userLoginCheckResult) {
+        this.userLoginCheckResult = userLoginCheckResult;
+    }
+
     public class SchoolNativeBean implements Serializable {
 
         @ApiModelProperty(value = "id")

+ 55 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/result/UserLoginCheckResult.java

@@ -0,0 +1,55 @@
+package com.qmth.teachcloud.common.bean.result;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 用户登录检验返回值
+ * @Author: CaoZixuan
+ * @Date: 2021-10-08
+ */
+public class UserLoginCheckResult {
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "用户id")
+    private Long userId;
+
+    @ApiModelProperty(value = "电话号码")
+    private String mobileNumber;
+
+    @ApiModelProperty(value = "密码重置次数")
+    private Integer pwdCount;
+
+    public UserLoginCheckResult() {
+    }
+
+    public UserLoginCheckResult(Long userId, String mobileNumber, Integer pwdCount) {
+        this.userId = userId;
+        this.mobileNumber = mobileNumber;
+        this.pwdCount = pwdCount;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public String getMobileNumber() {
+        return mobileNumber;
+    }
+
+    public void setMobileNumber(String mobileNumber) {
+        this.mobileNumber = mobileNumber;
+    }
+
+    public Integer getPwdCount() {
+        return pwdCount;
+    }
+
+    public void setPwdCount(Integer pwdCount) {
+        this.pwdCount = pwdCount;
+    }
+}

+ 13 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/SysUser.java

@@ -64,7 +64,7 @@ public class SysUser extends BaseEntity implements Serializable {
      * 手机号
      */
     @TableField("mobile_number")
-    @NotBlank(message = "请输入手机号码")
+//    @NotBlank(message = "请输入手机号码")
     @Length(message = "手机号码不能超过{max}个字符", max = 25)
     private String mobileNumber;
 
@@ -95,6 +95,10 @@ public class SysUser extends BaseEntity implements Serializable {
     @TableField(exist = false)
     private String oldPassword;
 
+    @TableField(exist = false)
+    @ApiModelProperty(value = "前端传的修改手机号码时的验证码")
+    private String verifyCode;
+
     @JsonSerialize(using = ToStringSerializer.class)
     @TableField(exist = false)
     @NotNull(message = "请选择角色")
@@ -223,4 +227,12 @@ public class SysUser extends BaseEntity implements Serializable {
     public void setCode(String code) {
         this.code = code;
     }
+
+    public String getVerifyCode() {
+        return verifyCode;
+    }
+
+    public void setVerifyCode(String verifyCode) {
+        this.verifyCode = verifyCode;
+    }
 }

+ 9 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/mapper/SysUserMapper.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qmth.teachcloud.common.bean.dto.BlurryUserDto;
 import com.qmth.teachcloud.common.bean.dto.UserDto;
+import com.qmth.teachcloud.common.bean.dto.VerifyCodeCheckDto;
 import com.qmth.teachcloud.common.bean.params.ApproveUserResult;
 import com.qmth.teachcloud.common.entity.SysUser;
 import org.apache.ibatis.annotations.Param;
@@ -47,4 +48,12 @@ public interface SysUserMapper extends BaseMapper<SysUser> {
      * @return
      */
     public List<ApproveUserResult> findById(@Param("id") Long id);
+
+    /**
+     * 根据用户(id和手机号)查询验证码发送几率
+     * @param userId 用户id
+     * @param mobileNumber 用户手机号
+     * @return 验证码记录结果
+     */
+    List<VerifyCodeCheckDto> findVerifyCodeByUser(@Param("userId") Long userId,@Param("mobileNumber") String mobileNumber);
 }

+ 8 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/SysUserService.java

@@ -120,4 +120,12 @@ public interface SysUserService extends IService<SysUser> {
      * @return
      */
     public List<ApproveUserResult> findById(Long id);
+
+    /**
+     * 校验短信验证码
+     * @param userId 用户id
+     * @param mobileNumber 用户手机号
+     * @param code 验证码
+     */
+    void checkSmsCode(Long userId,String mobileNumber, String code);
 }

+ 76 - 15
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysUserServiceImpl.java

@@ -10,11 +10,13 @@ import com.qmth.boot.api.exception.ApiException;
 import com.qmth.teachcloud.common.bean.dto.BlurryUserDto;
 import com.qmth.teachcloud.common.bean.dto.LoginDto;
 import com.qmth.teachcloud.common.bean.dto.UserDto;
+import com.qmth.teachcloud.common.bean.dto.VerifyCodeCheckDto;
 import com.qmth.teachcloud.common.bean.dto.excel.DescribeImportDto;
 import com.qmth.teachcloud.common.bean.dto.excel.SysUserImportDto;
 import com.qmth.teachcloud.common.bean.params.ApproveUserResult;
 import com.qmth.teachcloud.common.bean.params.UserSaveParams;
 import com.qmth.teachcloud.common.bean.result.UserBatchDisposeResult;
+import com.qmth.teachcloud.common.config.DictionaryConfig;
 import com.qmth.teachcloud.common.contant.SpringContextHolder;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.*;
@@ -80,6 +82,10 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     @Resource
     SysUserService sysUserService;
 
+    @Resource
+    DictionaryConfig dictionaryConfig;
+
+
     @Override
     public IPage<UserDto> list(String loginName, String roleId, Boolean enable, String realName, Integer pageNumber, Integer pageSize) {
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
@@ -135,6 +141,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         return this.updateById(user);
     }
 
+    @Transactional
     @Override
     public boolean updatePassword(SysUser user) throws NoSuchAlgorithmException {
         SysUser sysUser = this.getById(user.getId());
@@ -144,13 +151,37 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         if (!StringUtils.equals(sysUser.getPassword(), user.getOldPassword())) {
             throw ExceptionResultEnum.ERROR.exception("原密码不正确");
         }
-        sysUser.setPwdCount(sysUser.getPwdCount() == null ? 1 : sysUser.getPwdCount() + 1);
-        sysUser.setPwdUpdateTime(System.currentTimeMillis());
-        sysUser.setPassword(user.getPassword());
+        String newPwd = user.getPassword();
+        String mobilePhone = user.getMobileNumber();
+        String verifyCode = user.getVerifyCode();
+        if (SystemConstant.strNotNull(newPwd)) {
+            // 参数中存在密码 -》 更新密码
+            sysUser.setPwdCount(sysUser.getPwdCount() == null ? 1 : sysUser.getPwdCount() + 1);
+            sysUser.setPwdUpdateTime(System.currentTimeMillis());
+            sysUser.setPassword(newPwd);
+        }
+        if (SystemConstant.strNotNull(mobilePhone)) {
+            // 参数中存在手机号 -》 更新手机号
+            if (!SystemConstant.strNotNull(verifyCode)) {
+                throw ExceptionResultEnum.ERROR.exception("验证码不存在");
+            }
+            this.checkSmsCode(user.getId(), mobilePhone, verifyCode);
+            // 更新电话
+            sysUser.setMobileNumber(mobilePhone);
+        }
         boolean success = this.updateById(sysUser);
-        //如果原密码和旧密码不一致,需要重新登录
-        if (!Objects.equals(user.getOldPassword(), sysUser.getPassword())) {
-            commonService.removeUserInfo(sysUser.getId(), false);
+        //如果原密码和旧密码不一致,且用户已经登陆,需要重新登录
+        Object object = ServletUtil.getRequest().getAttribute(SystemConstant.SESSION);
+        if (Objects.nonNull(object)){
+            if (SystemConstant.strNotNull(newPwd)){
+                if (!Objects.equals(user.getOldPassword(), sysUser.getPassword())){
+                    commonService.removeUserInfo(sysUser.getId(), false);
+                }
+            } else if (SystemConstant.strNotNull(mobilePhone)) {
+                if (!Objects.equals(mobilePhone, sysUser.getMobileNumber())){
+                    commonService.removeUserInfo(sysUser.getId(), false);
+                }
+            }
         }
         return success;
     }
@@ -306,10 +337,12 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
                 }
             }
             // 手机号检验
-            SysUser checkMobileNumber = this.getOne(new QueryWrapper<SysUser>().lambda().eq(SysUser::getSchoolId, schoolId).eq(SysUser::getEnable, true).eq(SysUser::getMobileNumber, mobileNumber));
-            if (Objects.nonNull(checkMobileNumber)) {
-                if (!checkMobileNumber.getId().equals(userSaveParams.getId())) {
-                    throw ExceptionResultEnum.ERROR.exception("用户手机号【" + mobileNumber + "】重复");
+            if (SystemConstant.strNotNull(mobileNumber)){
+                SysUser checkMobileNumber = this.getOne(new QueryWrapper<SysUser>().lambda().eq(SysUser::getSchoolId, schoolId).eq(SysUser::getEnable, true).eq(SysUser::getMobileNumber, mobileNumber));
+                if (Objects.nonNull(checkMobileNumber)) {
+                    if (!checkMobileNumber.getId().equals(userSaveParams.getId())) {
+                        throw ExceptionResultEnum.ERROR.exception("用户手机号【" + mobileNumber + "】重复");
+                    }
                 }
             }
 
@@ -535,7 +568,9 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
                 userSaveParams.setOrgId(orgId);
                 userSaveParams.setRealName(name);
                 userSaveParams.setRoleIds(roleIdList.toArray(new Long[0]));
-                userSaveParams.setMobileNumber(phoneNumber);
+                if (SystemConstant.strNotNull(phoneNumber)){
+                    userSaveParams.setMobileNumber(phoneNumber);
+                }
                 userSaveParams.setCode(code);
                 userSaveParamsList.add(userSaveParams);
             }
@@ -655,6 +690,30 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         return sysUserMapper.findById(id);
     }
 
+    @Override
+    public void checkSmsCode(Long userId,String mobileNumber, String code) {
+        SysConfig value = sysConfigService.getByKey("sys.code.enable");
+        if (Objects.nonNull(value) && value.getConfigValue().equals("true")) {
+            if (Objects.isNull(code)) {
+                throw ExceptionResultEnum.ERROR.exception("验证码为空");
+            }
+            if (!dictionaryConfig.smsDomain().getSmsNormalCode().equals(code)) {
+                List<VerifyCodeCheckDto> verifyCodeCheckDtoList = this.baseMapper.findVerifyCodeByUser(userId,mobileNumber);
+                if (verifyCodeCheckDtoList.size() < 1){
+                    throw ExceptionResultEnum.ERROR.exception("请确认已经发送了验证码");
+                }
+                VerifyCodeCheckDto accessControl = verifyCodeCheckDtoList.get(0);
+                if (accessControl == null || !accessControl.getVerifyCode().equals(code)) {
+                    throw ExceptionResultEnum.ERROR.exception("短信验证码错误,请仔细核对后再次输入");
+                }
+
+                if (new Date(accessControl.getExpireTime()).before(new Date())) {
+                    throw ExceptionResultEnum.ERROR.exception("短信验证码已过期");
+                }
+            }
+        }
+    }
+
     /**
      * 批量处理用户信息帮助类
      *
@@ -681,10 +740,12 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
                 }
             }
             // 手机号检验
-            SysUser checkMobileNumber = this.getOne(new QueryWrapper<SysUser>().lambda().eq(SysUser::getSchoolId, schoolId).eq(SysUser::getEnable, true).eq(SysUser::getMobileNumber, mobileNumber));
-            if (Objects.nonNull(checkMobileNumber)) {
-                if (!checkMobileNumber.getId().equals(userSaveParams.getId())) {
-                    throw ExceptionResultEnum.ERROR.exception("用户手机号【" + mobileNumber + "】重复");
+            if (SystemConstant.strNotNull(mobileNumber)){
+                SysUser checkMobileNumber = this.getOne(new QueryWrapper<SysUser>().lambda().eq(SysUser::getSchoolId, schoolId).eq(SysUser::getEnable, true).eq(SysUser::getMobileNumber, mobileNumber));
+                if (Objects.nonNull(checkMobileNumber)) {
+                    if (!checkMobileNumber.getId().equals(userSaveParams.getId())) {
+                        throw ExceptionResultEnum.ERROR.exception("用户手机号【" + mobileNumber + "】重复");
+                    }
                 }
             }
 

+ 2 - 4
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/TeachcloudCommonServiceImpl.java

@@ -17,10 +17,7 @@ import com.qmth.teachcloud.common.bean.dto.MenuDto;
 import com.qmth.teachcloud.common.bean.dto.MenuPrivilegeDto;
 import com.qmth.teachcloud.common.bean.dto.OrgDto;
 import com.qmth.teachcloud.common.bean.dto.PrivilegeCacheDto;
-import com.qmth.teachcloud.common.bean.result.LoginResult;
-import com.qmth.teachcloud.common.bean.result.MenuResult;
-import com.qmth.teachcloud.common.bean.result.PrivilegeResult;
-import com.qmth.teachcloud.common.bean.result.RolePrivilegeResult;
+import com.qmth.teachcloud.common.bean.result.*;
 import com.qmth.teachcloud.common.config.DictionaryConfig;
 import com.qmth.teachcloud.common.contant.SpringContextHolder;
 import com.qmth.teachcloud.common.contant.SystemConstant;
@@ -868,6 +865,7 @@ public class TeachcloudCommonServiceImpl implements TeachcloudCommonService {
 
 //        LoginResult loginResult = new LoginResult(sysUser, sessionId, test, Objects.nonNull(roleTypes) && roleTypes.size() > 0 ? roleTypes : roleNames, appSource);
         LoginResult loginResult = new LoginResult(sysUser, sessionId, token, Objects.nonNull(roleTypes) && roleTypes.size() > 0 ? roleTypes : roleNames, appSource);
+        loginResult.setUserLoginCheckResult(new UserLoginCheckResult(sysUser.getId(),sysUser.getMobileNumber(),sysUser.getPwdCount()));
         loginResult.setSchoolInfo(Objects.nonNull(authBean.getSchool()) ? loginResult.new SchoolNativeBean(authBean.getSchool()) : null);
         loginResult.setOrgInfo(Objects.nonNull(authBean.getOrg()) ? loginResult.new OrgNativeBean(authBean.getOrg()) : null);
         loginResult.setTime(System.currentTimeMillis());

+ 27 - 0
teachcloud-common/src/main/resources/mapper/SysUserMapper.xml

@@ -170,4 +170,31 @@
             </if>
         </where>
     </select>
+
+    <select id="findVerifyCodeByUser" resultType="com.qmth.teachcloud.common.bean.dto.VerifyCodeCheckDto">
+        SELECT
+            id,
+            school_id AS schoolId,
+            org_id AS orgId,
+            user_id AS userId,
+            mobile_number AS mobileNumber,
+            expire_time AS expireTime,
+            valid_period AS validPeriod,
+            verify_code AS verifyCode,
+            create_id AS createId,
+            create_time AS createTime,
+            update_id AS updateId,
+            update_time AS updateTime
+        FROM
+            basic_verify_code
+        <where>
+            <if test="userId != null and userId != ''">
+                AND user_id = #{userId}
+            </if>
+            <if test="mobileNumber != null and mobileNumber != ''">
+                AND mobile_number = #{mobileNumber}
+            </if>
+        </where>
+        ORDER BY update_time DESC
+    </select>
 </mapper>

+ 2 - 0
teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/SysController.java

@@ -208,6 +208,8 @@ public class SysController {
         }
         String mobileNumber = user.getMobileNumber();
         if (Objects.isNull(mobileNumber)) {
+            // 手机号不存在
+
             throw ExceptionResultEnum.ERROR.exception("用户未绑定手机号码");
         }
         basicVerifyCodeService.sendVeirfyCode(mobileNumber, user.getId());