Преглед на файлове

Add 添加短信发送功能,根据手机号重置密码

Yue преди 2 години
родител
ревизия
0bd795c0fe
променени са 18 файла, в които са добавени 513 реда и са изтрити 36 реда
  1. 21 0
      SERVER/YanZhongXYH/xyh-admin/src/main/java/cn/xyh/web/controller/common/CaptchaController.java
  2. 7 1
      SERVER/YanZhongXYH/xyh-admin/src/main/resources/application.yml
  3. 36 0
      SERVER/YanZhongXYH/xyh-common/src/main/java/cn/xyh/common/config/SmsProperties.java
  4. 1 1
      SERVER/YanZhongXYH/xyh-common/src/main/java/cn/xyh/common/config/WxAppConfig.java
  5. 1 1
      SERVER/YanZhongXYH/xyh-common/src/main/java/cn/xyh/common/constant/Constants.java
  6. 17 0
      SERVER/YanZhongXYH/xyh-common/src/main/java/cn/xyh/common/core/domain/model/SmsResetPwdBody.java
  7. 24 0
      SERVER/YanZhongXYH/xyh-common/src/main/java/cn/xyh/common/sms/SmsCodeBo.java
  8. 32 0
      SERVER/YanZhongXYH/xyh-common/src/main/java/cn/xyh/common/sms/SmsMessageBo.java
  9. 22 0
      SERVER/YanZhongXYH/xyh-common/src/main/java/cn/xyh/common/sms/SmsMessageCodeEnum.java
  10. 9 0
      SERVER/YanZhongXYH/xyh-common/src/main/java/cn/xyh/common/sms/SmsResult.java
  11. 40 0
      SERVER/YanZhongXYH/xyh-common/src/main/java/cn/xyh/common/sms/SmsUtils.java
  12. 73 0
      SERVER/YanZhongXYH/xyh-common/src/main/java/cn/xyh/common/utils/http/HttpHelper.java
  13. 53 4
      SERVER/YanZhongXYH/xyh-system/src/main/java/cn/xyh/system/controller/system/SysLoginController.java
  14. 32 8
      SERVER/YanZhongXYH/xyh-system/src/main/java/cn/xyh/system/service/SysLoginService.java
  15. 13 1
      UI/XYH.APP/src/api/_login.ts
  16. 2 2
      UI/XYH.APP/src/core/services/RequestService.ts
  17. 118 2
      UI/XYH.APP/src/pages/account/forgetPwd.vue
  18. 12 16
      UI/XYH.APP/src/pages/account/register.vue

+ 21 - 0
SERVER/YanZhongXYH/xyh-admin/src/main/java/cn/xyh/web/controller/common/CaptchaController.java

@@ -5,10 +5,12 @@ import cn.hutool.captcha.AbstractCaptcha;
 import cn.hutool.captcha.generator.CodeGenerator;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.RandomUtil;
+import cn.xyh.common.config.SmsProperties;
 import cn.xyh.common.constant.CacheConstants;
 import cn.xyh.common.constant.Constants;
 import cn.xyh.common.core.domain.R;
 import cn.xyh.common.enums.CaptchaType;
+import cn.xyh.common.sms.SmsUtils;
 import cn.xyh.common.utils.StringUtils;
 import cn.xyh.common.utils.email.MailUtils;
 import cn.xyh.common.utils.redis.RedisUtils;
@@ -24,6 +26,7 @@ import org.springframework.expression.ExpressionParser;
 import org.springframework.expression.spel.standard.SpelExpressionParser;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.constraints.NotBlank;
@@ -46,6 +49,7 @@ public class CaptchaController {
     private final CaptchaProperties captchaProperties;
     private final ISysConfigService configService;
     private final MailProperties mailProperties;
+    private final SmsProperties smsProperties;
 
     ///**
     // * 短信验证码
@@ -92,6 +96,23 @@ public class CaptchaController {
         return R.ok();
     }
 
+    @GetMapping("/phoneCode/{phone}")
+    public R<Map<String, Object>> getPhoneCode(@PathVariable String phone) {
+        if (!smsProperties.getEnabled()) {
+            return R.fail("当前系统没有开启短信功能!");
+        }
+        String key = CacheConstants.CAPTCHA_CODE_KEY + phone;
+        String code = RandomUtil.randomNumbers(6);
+        RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
+        try {
+            SmsUtils.sendSmsCode(phone, code);
+        } catch (Exception e) {
+            log.error("验证码短信发送异常 => {}", e.getMessage());
+            return R.fail(e.getMessage());
+        }
+        return R.ok();
+    }
+
     /**
      * 生成验证码
      */

+ 7 - 1
SERVER/YanZhongXYH/xyh-admin/src/main/resources/application.yml

@@ -12,6 +12,7 @@ vber:
   demoEnabled: false
   # 获取ip地址开关
   addressEnabled: true
+
   # 缓存懒加载
   cacheLazy: false
   shardingSphere:
@@ -19,7 +20,12 @@ vber:
 wx:
   app-id: wxf78f89c00da43b16
   app-secret: 02663dcc6c44fcba76dc04d7de7c8c4d
-
+sms:
+  enabled: true
+  #发送验证码短信的地址
+  code-url: http://www.shvber.com:5081/AliyunMsg/Code
+  #发送消息短信的地址
+  msg-url: http://www.shvber.com:5081/AliyunMsg/Msg
 captcha:
   # 页面 <参数设置> 可开启关闭 验证码校验
   # 验证码类型 math 数组计算 char 字符验证

+ 36 - 0
SERVER/YanZhongXYH/xyh-common/src/main/java/cn/xyh/common/config/SmsProperties.java

@@ -0,0 +1,36 @@
+package cn.xyh.common.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "sms")
+public class SmsProperties {
+    /**
+     * codeUrl 发送验证码短信的地址
+     */
+    private static String codeUrl;
+    /**
+     * msgUrl 发送消息短信的地址
+     */
+    private static String msgUrl;
+    private Boolean enabled;
+
+    public static String getCodeUrl() {
+        return SmsProperties.codeUrl;
+    }
+
+    public void setCodeUrl(String url) {
+        SmsProperties.codeUrl = url;
+    }
+
+    public static String getMsgUrl() {
+        return SmsProperties.msgUrl;
+    }
+
+    public void setMsgUrl(String url) {
+        SmsProperties.msgUrl = url;
+    }
+}

+ 1 - 1
SERVER/YanZhongXYH/xyh-common/src/main/java/cn/xyh/common/config/WxAppConfig.java

@@ -23,5 +23,5 @@ public class WxAppConfig {
      * AppSecret
      */
     private String appSecret;
-
 }
+

+ 1 - 1
SERVER/YanZhongXYH/xyh-common/src/main/java/cn/xyh/common/constant/Constants.java

@@ -65,7 +65,7 @@ public interface Constants {
     /**
      * 验证码有效期(分钟)
      */
-    Integer CAPTCHA_EXPIRATION = 2;
+    Integer CAPTCHA_EXPIRATION = 30;
 
     /**
      * 令牌

+ 17 - 0
SERVER/YanZhongXYH/xyh-common/src/main/java/cn/xyh/common/core/domain/model/SmsResetPwdBody.java

@@ -0,0 +1,17 @@
+package cn.xyh.common.core.domain.model;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+public class SmsResetPwdBody extends SmsLoginBody {
+
+    /**
+     * 新密码
+     */
+    @NotBlank(message = "{user.password.not.blank}")
+    private String password;
+
+
+}

+ 24 - 0
SERVER/YanZhongXYH/xyh-common/src/main/java/cn/xyh/common/sms/SmsCodeBo.java

@@ -0,0 +1,24 @@
+package cn.xyh.common.sms;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class SmsCodeBo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String phoneNumbers;
+    private String code;
+
+    public SmsCodeBo() {
+
+    }
+
+    public SmsCodeBo(String phoneNumbers, String code) {
+        this.phoneNumbers = phoneNumbers;
+        this.code = code;
+    }
+
+
+}

+ 32 - 0
SERVER/YanZhongXYH/xyh-common/src/main/java/cn/xyh/common/sms/SmsMessageBo.java

@@ -0,0 +1,32 @@
+package cn.xyh.common.sms;
+
+import cn.xyh.common.utils.StringUtils;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class SmsMessageBo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String phoneNumbers;
+    private String signName;
+    private String templateCode;
+    private String templateParam;
+
+
+    public SmsMessageBo() {
+    }
+
+    public SmsMessageBo(String phoneNumbers, String signName, SmsMessageCodeEnum templateEnum, String[]... params) {
+        this.phoneNumbers = phoneNumbers;
+        this.signName = signName;
+        this.templateCode = templateEnum.getCode();
+        String paramStr = templateEnum.getParams();
+        if (params.length > 0) {
+            paramStr = StringUtils.format(paramStr, (Object) params);
+        }
+        this.templateParam = paramStr;
+    }
+}
+

+ 22 - 0
SERVER/YanZhongXYH/xyh-common/src/main/java/cn/xyh/common/sms/SmsMessageCodeEnum.java

@@ -0,0 +1,22 @@
+package cn.xyh.common.sms;
+
+import lombok.Getter;
+
+@Getter
+public enum SmsMessageCodeEnum {
+
+    AM_REGISTER("SMS_90925064", "{\"xyname\":\"%s\",\"city\":\"盐中\"}"),
+    APPLY_SUCCESS("SMS_90880088", "{\"xyname\":\"%s\",\"hdname\":\"%s\"}"),
+    AUDIT_SUCCESS("SMS_90875081", "{\"xyname\":\"%s\",\"city\":\"盐中\"}"),
+    COST_SUCCESS("SMS_90970068", "{\"xyname\":\"%s\",\"city\":\"盐中\",\"huodong\":\"%s\"}"),
+    Notice("SMS_80055057", "{\"xyname\":\"盐中校友\",\"city\":\"盐中\",\"time\":\"{time}\",\"activity\":\"{content}\",\"address\":\"{address}\"}");
+    private final String code;
+
+    private final String params;
+
+    SmsMessageCodeEnum(String code, String params) {
+        this.code = code;
+        this.params = params;
+    }
+
+}

+ 9 - 0
SERVER/YanZhongXYH/xyh-common/src/main/java/cn/xyh/common/sms/SmsResult.java

@@ -0,0 +1,9 @@
+package cn.xyh.common.sms;
+
+import lombok.Data;
+
+@Data
+public class SmsResult {
+    private Boolean success;
+    private String message;
+}

+ 40 - 0
SERVER/YanZhongXYH/xyh-common/src/main/java/cn/xyh/common/sms/SmsUtils.java

@@ -0,0 +1,40 @@
+package cn.xyh.common.sms;
+
+
+import cn.xyh.common.config.SmsProperties;
+import cn.xyh.common.utils.http.HttpHelper;
+
+public class SmsUtils {
+
+    /**
+     * 发送短信
+     *
+     * @param phone 手机号
+     * @param code  验证码
+     */
+    public static void sendSmsCode(String phone, String code) {
+        // 调用短信发送接口
+        SmsCodeBo bo = new SmsCodeBo(phone, code);
+        String url = SmsProperties.getCodeUrl();
+        SmsResult result = HttpHelper.Post(url, bo, SmsResult.class);
+        // 发送成功
+        if (result != null && result.getSuccess()) {
+            System.out.println("发送短信给:" + phone + ",验证码是:" + code);
+        } else {
+            System.out.println("发送短信给:" + phone + ",验证码是:" + code + "【失败】");
+        }
+    }
+
+    public static void sendSmsMsg(String phone, SmsMessageCodeEnum templateCode, String[]... params) {
+        // 调用短信发送接口
+        SmsMessageBo bo = new SmsMessageBo(phone, "盐中校友会", templateCode, params);
+        String url = SmsProperties.getCodeUrl();
+        SmsResult result = HttpHelper.Post(url, bo, SmsResult.class);
+        // 发送成功
+        if (result != null && result.getSuccess()) {
+            System.out.println("发送短信给:" + phone + ",模板是:" + templateCode.getCode());
+        } else {
+            System.out.println("发送短信给:" + phone + ",模板是:" + templateCode.getCode() + "【失败】");
+        }
+    }
+}

+ 73 - 0
SERVER/YanZhongXYH/xyh-common/src/main/java/cn/xyh/common/utils/http/HttpHelper.java

@@ -0,0 +1,73 @@
+package cn.xyh.common.utils.http;
+
+import cn.hutool.json.JSONUtil;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+public class HttpHelper {
+
+    public static String sendGetRequest(String url) {
+        StringBuilder response = new StringBuilder();
+        try {
+            URL obj = new URL(url);
+            HttpURLConnection con = (HttpURLConnection) obj.openConnection();
+            con.setRequestMethod("GET");
+
+            BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
+            String inputLine;
+            while ((inputLine = in.readLine()) != null) {
+                response.append(inputLine);
+            }
+            in.close();
+            con.disconnect();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return response.toString();
+    }
+
+    public static String sendPostRequest(String url, String data) {
+        StringBuilder response = new StringBuilder();
+        try {
+            URL obj = new URL(url);
+            HttpURLConnection con = (HttpURLConnection) obj.openConnection();
+            con.setRequestMethod("POST");
+            con.setDoOutput(true);
+            con.setRequestProperty("Content-Type", "application/json");
+            OutputStream os = con.getOutputStream();
+            OutputStreamWriter osw = new OutputStreamWriter(os);
+            osw.write(data);
+            osw.flush();
+            osw.close();
+
+            BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
+            String inputLine;
+            while ((inputLine = in.readLine()) != null) {
+                response.append(inputLine);
+            }
+            in.close();
+            os.close();
+            con.disconnect();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return response.toString();
+    }
+
+    public static <T> T Post(String url, Object data, Class<T> clazz) {
+        String dataStr = JSONUtil.toJsonStr(data);
+        String response = sendPostRequest(url, dataStr);
+        try {
+            return JSONUtil.toBean(response, clazz);
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+
+}

+ 53 - 4
SERVER/YanZhongXYH/xyh-system/src/main/java/cn/xyh/system/controller/system/SysLoginController.java

@@ -1,26 +1,31 @@
 package cn.xyh.system.controller.system;
 
 import cn.dev33.satoken.annotation.SaIgnore;
+import cn.hutool.core.util.RandomUtil;
 import cn.xyh.amActivity.service.IAmAlumnusService;
+import cn.xyh.common.config.SmsProperties;
+import cn.xyh.common.constant.CacheConstants;
 import cn.xyh.common.constant.Constants;
 import cn.xyh.common.core.domain.R;
 import cn.xyh.common.core.domain.entity.SysMenu;
-import cn.xyh.common.core.domain.model.EmailLoginBody;
-import cn.xyh.common.core.domain.model.LoginBody;
-import cn.xyh.common.core.domain.model.LoginUser;
-import cn.xyh.common.core.domain.model.SmsLoginBody;
+import cn.xyh.common.core.domain.entity.SysUser;
+import cn.xyh.common.core.domain.model.*;
 import cn.xyh.common.enums.UserType;
 import cn.xyh.common.exception.ServiceException;
 import cn.xyh.common.helper.LoginHelper;
+import cn.xyh.common.sms.SmsUtils;
+import cn.xyh.common.utils.redis.RedisUtils;
 import cn.xyh.system.domain.vo.RouterVo;
 import cn.xyh.system.service.ISysMenuService;
 import cn.xyh.system.service.ISysUserService;
 import cn.xyh.system.service.SysLoginService;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.constraints.NotBlank;
+import java.time.Duration;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -31,10 +36,12 @@ import java.util.Map;
  * @author Yue
  */
 @Validated
+@Slf4j
 @RequiredArgsConstructor
 @RestController
 public class SysLoginController {
 
+    private final SmsProperties smsProperties;
     private final SysLoginService loginService;
     private final IAmAlumnusService alumnusService;
     private final ISysMenuService menuService;
@@ -115,6 +122,48 @@ public class SysLoginController {
         return R.ok(ajax);
     }
 
+
+    @SaIgnore
+    @GetMapping("/getResetPwdCode/{name}/{phone}")
+    public R<Map<String, Object>> getPhoneCode(@PathVariable String phone, @PathVariable String name) {
+        if (!smsProperties.getEnabled()) {
+            return R.fail("当前系统没有开启短信功能!");
+        }
+        SysUser sysUser = userService.selectUserByPhonenumber(phone);
+        if (sysUser == null) {
+            return R.fail("未查询到用户,请确认用户是否存在!");
+        }
+        if (!sysUser.getNickName().equals(name)) {
+            return R.fail("姓名和手机号不匹配,请确认用户是否存在!");
+        }
+        String key = CacheConstants.CAPTCHA_CODE_KEY + phone;
+        String code = RandomUtil.randomNumbers(6);
+        RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
+        try {
+            SmsUtils.sendSmsCode(phone, code);
+        } catch (Exception e) {
+            log.error("验证码短信发送异常 => {}", e.getMessage());
+            return R.fail(e.getMessage());
+        }
+        return R.ok();
+    }
+
+    /**
+     * 忘记密码重置密码
+     *
+     * @param body 登录信息
+     * @return 结果
+     */
+    @SaIgnore
+    @PostMapping("/resetPwdBySms")
+    public R<Void> resetPwdBySms(@RequestBody SmsResetPwdBody body) {
+        if (loginService.resetPwdBySms(body.getPhonenumber(), body.getSmsCode(), body.getPassword())) {
+            return R.ok();
+        }
+        return R.fail();
+    }
+
+
     /**
      * 退出登录
      */

+ 32 - 8
SERVER/YanZhongXYH/xyh-system/src/main/java/cn/xyh/system/service/SysLoginService.java

@@ -22,6 +22,7 @@ import cn.xyh.common.core.domain.model.XcxLoginUser;
 import cn.xyh.common.enums.DeviceType;
 import cn.xyh.common.enums.LoginType;
 import cn.xyh.common.enums.UserStatus;
+import cn.xyh.common.enums.UserType;
 import cn.xyh.common.exception.ServiceException;
 import cn.xyh.common.exception.user.CaptchaException;
 import cn.xyh.common.exception.user.CaptchaExpireException;
@@ -105,8 +106,6 @@ public class SysLoginService {
             LoginHelper.loginByDevice(loginUser, DeviceType.PC);
         } else {
             XcxLoginUser loginUser = buildXcxLoginUser(user);
-            AmAlumnusVo amAlumnusVo = amAlumnusService.queryByUserId(user.getUserId());
-            loginUser.setAmId(amAlumnusVo.getAmId());
             loginUser.setOpenid(openId);
             LoginHelper.loginByDevice(loginUser, DeviceType.XCX);
         }
@@ -121,11 +120,18 @@ public class SysLoginService {
         SysUser user = loadUserByPhoneNumber(phoneNumber);
 
         checkLogin(LoginType.SMS, user.getUserName(), () -> !validateSmsCode(phoneNumber, smsCode));
-        // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
-        LoginUser loginUser = buildLoginUser(user);
-        // 生成token
-        LoginHelper.loginByDevice(loginUser, DeviceType.APP);
 
+        // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
+        UserType userType = UserType.getUserType(user.getUserType());
+        if (userType == UserType.SYS_USER) {
+            LoginUser loginUser = buildLoginUser(user);
+            // 生成token
+            LoginHelper.loginByDevice(loginUser, DeviceType.PC);
+        } else if (userType == UserType.AM_USER) {
+            XcxLoginUser loginUser = buildXcxLoginUser(user);
+            // 生成token
+            LoginHelper.loginByDevice(loginUser, DeviceType.APP);
+        }
         recordLogininfor(user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
         recordLoginInfo(user.getUserId(), user.getUserName());
         return StpUtil.getTokenValue();
@@ -159,8 +165,6 @@ public class SysLoginService {
         }
         // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
         XcxLoginUser loginUser = buildXcxLoginUser(user);
-        AmAlumnusVo amAlumnusVo = amAlumnusService.queryByUserId(user.getUserId());
-        loginUser.setAmId(amAlumnusVo.getAmId());
         loginUser.setOpenid(xcxLoginDto.getOpenid());
         loginUser.setUnionId(xcxLoginDto.getUnionid());
         // 生成token
@@ -171,6 +175,21 @@ public class SysLoginService {
         return StpUtil.getTokenValue();
     }
 
+
+    /**
+     * 重置密码
+     *
+     * @param phonenumber
+     * @param smsCode
+     * @param password
+     * @return
+     */
+    public Boolean resetPwdBySms(String phonenumber, String smsCode, String password) {
+        SysUser user = loadUserByPhoneNumber(phonenumber);
+        checkLogin(LoginType.SMS, user.getUserName(), () -> !validateSmsCode(phonenumber, smsCode));
+        return userService.resetUserPwd(user.getUserName(), BCrypt.hashpw(password)) > 0;
+    }
+
     /**
      * 退出登录
      */
@@ -349,6 +368,9 @@ public class SysLoginService {
         loginUser.setMenuPermission(permissionService.getMenuPermission(user));
         loginUser.setRolePermission(permissionService.getRolePermission(user));
         loginUser.setOrgName(ObjectUtil.isNull(user.getOrg()) ? "" : user.getOrg().getOrgName());
+        AmAlumnusVo amAlumnusVo = amAlumnusService.queryByUserId(user.getUserId());
+        loginUser.setAmId(amAlumnusVo.getAmId());
+
         List<RoleDTO> roles = BeanUtil.copyToList(user.getRoles(), RoleDTO.class);
         loginUser.setRoles(roles);
         return loginUser;
@@ -436,4 +458,6 @@ public class SysLoginService {
         }
         logout();
     }
+
+
 }

+ 13 - 1
UI/XYH.APP/src/api/_login.ts

@@ -26,6 +26,18 @@ class loginApi {
       successAlert: false,
     })
   }
+  getPhoneCode = (phone: string, name: string) => {
+    return Rs.get({
+      url: `/getResetPwdCode/${name}/${phone}`,
+    })
+  }
+  resetPwd = (data: any) => {
+    return Rs.post({
+      url: "/resetPwdBySms",
+      isToken: false,
+      data,
+    })
+  }
 
   getInfo = () => {
     return Rs.get({
@@ -53,7 +65,7 @@ class loginApi {
     return Rs.post({
       url: "/register",
       isToken: false,
-      method: "post",
+      needProcess: false,
       data,
     })
   }

+ 2 - 2
UI/XYH.APP/src/core/services/RequestService.ts

@@ -99,7 +99,7 @@ function handleResponse(result: any, config: any, resolve: (v: any) => void, rej
       return
     }
     if (config.errorAlert) {
-      msgUtil.msgError(msg)
+      msg.length > 7 ? msgUtil.alert(msg) : msgUtil.msgError(msg)
     }
     if (code === 500) {
       reject("500")
@@ -121,7 +121,7 @@ function handleException(error: any, config: any, reject: (v: any) => void) {
       message = "接口异常:" + message.substr(message.length - 3) + ""
     }
     if (config.errorAlert) {
-      message.length > 7 ? msgUtil.msg(message) : msgUtil.msgError(message)
+      message.length > 7 ? msgUtil.alert(message) : msgUtil.msgError(message)
     }
   }
 

+ 118 - 2
UI/XYH.APP/src/pages/account/forgetPwd.vue

@@ -1,7 +1,123 @@
 <template>
-  <div class="forgetPwd">forgetPwd</div>
+  <view class="page-container">
+    <vb-cell-group outset>
+      <uni-forms ref="formRef" :modelValue="form" :label-width="75" border validate-trigger="blur">
+        <uni-forms-item
+          required
+          label="手机号码"
+          name="phonenumber"
+          :rules="[
+            { required: true, errorMessage: '请填写手机号码' },
+            { pattern: /^1[3-9]\d{9}$/, errorMessage: '请填写正确的手机号码' },
+          ]"
+        >
+          <uni-easyinput type="text" v-model="form.phonenumber" :inputBorder="false" placeholder="请输入手机号码" />
+        </uni-forms-item>
+        <uni-forms-item
+          required
+          label="用户姓名"
+          name="name"
+          :rules="[{ required: true, errorMessage: '请填写用户姓名' }]"
+        >
+          <uni-easyinput type="text" v-model="form.name" :inputBorder="false" placeholder="请填写真实姓名" />
+        </uni-forms-item>
+        <uni-forms-item
+          label="验证码"
+          required
+          name="smsCode"
+          :rules="[{ required: true, errorMessage: '请填写验证码' }]"
+        >
+          <uni-easyinput type="text" v-model="form.smsCode" :inputBorder="false" placeholder="请填写验证码">
+            <template #right>
+              <view class="d-fc w-100px h-35px" :class="codeClass" @click="getCode">{{ codeText }}</view>
+            </template>
+          </uni-easyinput>
+        </uni-forms-item>
+        <uni-forms-item
+          required
+          label="用户密码"
+          name="password"
+          :rules="[{ required: true, errorMessage: '请填写用户密码' }]"
+        >
+          <uni-easyinput type="password" v-model="form.password" :inputBorder="false" placeholder="请填写用户密码" />
+        </uni-forms-item>
+      </uni-forms>
+    </vb-cell-group>
+
+    <vb-cell-group>
+      <vb-button round block custom-class="mb-15" @click="onSubmit">重置密码</vb-button>
+      <vb-button round block plain class="mt" @click="onBack">返回登录</vb-button>
+    </vb-cell-group>
+  </view>
 </template>
 
-<script lang="ts" setup></script>
+<script lang="ts" setup>
+import apis from "@/api"
+import route from "@/route"
+
+const formRef = ref()
+const form = ref({
+  phonenumber: "",
+  name: "",
+  smsCode: "",
+  password: "",
+  username: "000",
+})
+const codeText = ref("获取验证码")
+const canGetCode = computed(() => {
+  return codeText.value == "获取验证码"
+})
+const codeClass = computed(() => {
+  return canGetCode.value ? "bg-vb text-white" : "bg-gray-2 text-gray-6"
+})
+let timer: any
+function disabledGetCode() {
+  let second = 60
+  clearTimeout(Number(timer))
+  function changeText() {
+    second--
+    if (second == 0) {
+      codeText.value = "获取验证码"
+      second = 60
+      return
+    }
+    codeText.value = `${second}s 后获取`
+    timer = setTimeout(changeText, 1000)
+  }
+  changeText()
+}
+function onSubmit() {
+  formRef.value.validate().then(() => {
+    // 提交注册表单
+    apis.loginApi.resetPwd(form.value).then(() => {
+      message.msgSuccess("重置成功")
+      setTimeout(() => {
+        route.navigate("login")
+      }, 1500)
+    })
+  })
+}
+function onBack() {
+  route.navigate("login")
+}
+
+function getCode() {
+  // if (!canGetCode.value) {
+  //   return
+  // }
+  if (form.value.phonenumber == "") {
+    message.msgError("请填写手机号")
+    return
+  }
+  if (form.value.name == "") {
+    message.msgError("请填写用户名")
+    return
+  }
+  disabledGetCode()
+  apis.loginApi.getPhoneCode(form.value.phonenumber, form.value.name).then((res: any) => {
+    message.msgSuccess("发送成功")
+  })
+}
+</script>
 
 <style scoped></style>

+ 12 - 16
UI/XYH.APP/src/pages/account/register.vue

@@ -8,7 +8,7 @@ const formRef = ref()
 
 const codeUrl = ref("")
 const password = ref("")
-const formData = ref({
+const form = ref({
   openId: appStore.authStore.getOpenId(),
   userType: "am",
   phoneNumber: "",
@@ -23,14 +23,14 @@ const confirmPassword = (rule: any, value: any, data: any, callback: any) => {
   if (!value) {
     return true
   }
-  if (password.value && formData.value.password && password.value !== formData.value.password) {
+  if (password.value && form.value.password && password.value !== form.value.password) {
     callback("两次密码输入不一致")
   }
 }
 function onSubmit() {
   formRef.value.validate().then(() => {
     // 提交注册表单
-    apis.loginApi.register(formData.value).then((res) => {
+    apis.loginApi.register(form.value).then((res) => {
       console.log(res)
       if (res.code == 200) {
         message.msgSuccess("注册成功")
@@ -51,7 +51,7 @@ function getCode() {
   apis.loginApi.getCodeImg().then((res: any) => {
     captchaEnabled.value = res.captchaEnabled
     codeUrl.value = "data:image/gif;base64," + res.img
-    formData.value.uuid = res.uuid
+    form.value.uuid = res.uuid
   })
 }
 getCode()
@@ -59,7 +59,7 @@ getCode()
 
 <template>
   <view class="page-container">
-    <uni-forms ref="formRef" :modelValue="formData" :label-width="75" border validate-trigger="blur">
+    <uni-forms ref="formRef" :modelValue="form" :label-width="75" border validate-trigger="blur">
       <vb-cell-group outset>
         <uni-forms-item
           required
@@ -70,23 +70,23 @@ getCode()
             { pattern: /^1[3-9]\d{9}$/, errorMessage: '请填写正确的手机号码' },
           ]"
         >
-          <uni-easyinput type="text" v-model="formData.phoneNumber" :inputBorder="false" placeholder="请输入手机号码" />
+          <uni-easyinput type="text" v-model="form.phoneNumber" :inputBorder="false" placeholder="请输入手机号码" />
         </uni-forms-item>
-        <uni-forms-item
+        <!-- <uni-forms-item
           required
           label="用户账号"
           name="username"
           :rules="[{ required: true, errorMessage: '请填写用户账号' }]"
         >
           <uni-easyinput type="text" v-model="formData.username" :inputBorder="false" placeholder="请输入用户账号" />
-        </uni-forms-item>
+        </uni-forms-item> -->
         <uni-forms-item
           required
           label="用户姓名"
           name="name"
           :rules="[{ required: true, errorMessage: '请填写用户姓名' }]"
         >
-          <uni-easyinput type="text" v-model="formData.name" :inputBorder="false" placeholder="请填写真实姓名" />
+          <uni-easyinput type="text" v-model="form.name" :inputBorder="false" placeholder="请填写真实姓名" />
         </uni-forms-item>
         <uni-forms-item
           required
@@ -94,12 +94,7 @@ getCode()
           name="password"
           :rules="[{ required: true, errorMessage: '请填写用户密码' }, { validateFunction: confirmPassword }]"
         >
-          <uni-easyinput
-            type="password"
-            v-model="formData.password"
-            :inputBorder="false"
-            placeholder="请填写用户密码"
-          />
+          <uni-easyinput type="password" v-model="form.password" :inputBorder="false" placeholder="请填写用户密码" />
         </uni-forms-item>
         <uni-forms-item required label="确认密码" name="password2" :rules="[{ validateFunction: confirmPassword }]">
           <uni-easyinput type="password" v-model="password" :inputBorder="false" placeholder="请填写用户密码" />
@@ -107,10 +102,11 @@ getCode()
         <uni-forms-item
           v-if="captchaEnabled"
           label="验证码"
+          required
           name="code"
           :rules="[{ required: true, errorMessage: '请填写验证码' }]"
         >
-          <uni-easyinput type="text" v-model="formData.code" :inputBorder="false" placeholder="请填写验证码">
+          <uni-easyinput type="text" v-model="form.code" :inputBorder="false" placeholder="请填写验证码">
             <template #right>
               <image
                 :src="codeUrl"