Ver Fonte

Merge branch 'tz'

785834757 há 1 ano atrás
pai
commit
e3ff9038f4

+ 47 - 11
authentication/src/main/java/com/jzg/config/JzgAuthenticationProvider.java

@@ -1,10 +1,13 @@
 package com.jzg.config;
 
+import cn.hutool.core.date.DateTime;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.jzg.commons.constants.RedisKeyConstants;
 import com.jzg.commons.constants.SystemConstants;
 import com.jzg.commons.entity.po.SysRoleDataScope;
 import com.jzg.commons.entity.po.SysRoleDataScopeLink;
 import com.jzg.commons.entity.po.SysSystem;
+import com.jzg.commons.entity.po.SysUserJzgApp;
 import com.jzg.commons.entity.vo.SysRoleDataScopeVo;
 import com.jzg.commons.util.MinioUtils;
 import com.jzg.commons.util.StringUtils;
@@ -14,6 +17,7 @@ import com.jzg.entity.vo.SysUserJzgVo;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.mapper.SysRoleDataScopeLinkMapper;
 import com.jzg.mapper.SysRoleDataScopeMapper;
+import com.jzg.mapper.SysUserJzgAppMapper;
 import com.jzg.service.SysSystemService;
 import com.jzg.service.SysUserRoleService;
 import com.jzg.service.SysUserService;
@@ -26,6 +30,7 @@ import org.springframework.security.core.AuthenticationException;
 import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.util.CollectionUtils;
 
+import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
@@ -47,7 +52,11 @@ public class JzgAuthenticationProvider implements AuthenticationProvider {
 
     private SysRoleDataScopeLinkMapper sysRoleDataScopeLinkMapper;
 
-    public JzgAuthenticationProvider(UserDetailsService userDetailsService, SysUserService sysUserService, SysUserRoleService sysUserRoleService, RedissonClient redissonClient, SysRoleDataScopeMapper sysRoleDataScopeMapper, SysRoleDataScopeLinkMapper sysRoleDataScopeLinkMapper, SysSystemService sysSystemService) {
+    private SysUserJzgAppMapper sysUserJzgAppMapper;
+
+    public JzgAuthenticationProvider(UserDetailsService userDetailsService, SysUserService sysUserService, SysUserRoleService sysUserRoleService,
+                                     RedissonClient redissonClient, SysRoleDataScopeMapper sysRoleDataScopeMapper, SysRoleDataScopeLinkMapper sysRoleDataScopeLinkMapper,
+                                     SysSystemService sysSystemService, SysUserJzgAppMapper sysUserJzgAppMapper) {
         this.userDetailsService = userDetailsService;
         this.sysUserService = sysUserService;
         this.sysUserRoleService = sysUserRoleService;
@@ -55,6 +64,7 @@ public class JzgAuthenticationProvider implements AuthenticationProvider {
         this.sysRoleDataScopeMapper = sysRoleDataScopeMapper;
         this.sysRoleDataScopeLinkMapper = sysRoleDataScopeLinkMapper;
         this.sysSystemService = sysSystemService;
+        this.sysUserJzgAppMapper = sysUserJzgAppMapper;
     }
 
 
@@ -67,15 +77,27 @@ public class JzgAuthenticationProvider implements AuthenticationProvider {
         String system = ((JzgUsernamePasswordAuthenticationToken)authentication).getSystem();
         String captchaId = ((JzgUsernamePasswordAuthenticationToken)authentication).getCaptchaId();
         String captcha = ((JzgUsernamePasswordAuthenticationToken)authentication).getCaptcha();
-
+        String smsCode = ((JzgUsernamePasswordAuthenticationToken)authentication).getSmsCode();
+        boolean isFirst = false;
         //调试时注销验证码
-//        if(Objects.isNull(redissonClient.getBucket(RedisKeyConstants.VERIFICATION_CODE + captchaId).get())){
-//            throw new SystemException("验证码已过期");
-//        }
-//        String systemCaptcha = redissonClient.getBucket(RedisKeyConstants.VERIFICATION_CODE + captchaId).get().toString();
-//        if(!captcha.toLowerCase().equals(systemCaptcha.toLowerCase())){
-//            throw new SystemException("验证码错误,请重新输入");
-//        }
+        //验证码校验
+        if(Objects.nonNull(captchaId)) {
+            if(Objects.isNull(redissonClient.getBucket(RedisKeyConstants.VERIFICATION_CODE + captchaId).get())){
+                throw new SystemException("验证码已过期");
+            }
+            String systemCaptcha = redissonClient.getBucket(RedisKeyConstants.VERIFICATION_CODE + captchaId).get().toString();
+            if(!captcha.toLowerCase().equals(systemCaptcha.toLowerCase())){
+                throw new SystemException("验证码错误,请重新输入");
+            }
+        }
+
+        //检验短信验证码
+        if(Objects.nonNull(smsCode)){
+            String systemSmsCode = redissonClient.getBucket(RedisKeyConstants.SMS_CODE + system + username).get().toString();
+            if(!smsCode.equals(systemSmsCode)){
+                throw new SystemException("短信验证码错误,请重新输入");
+            }
+        }
 
         SysSystem sysSystem = sysSystemService.getBySystemCode(system);
         if(StringUtils.isNull(sysSystem)){
@@ -99,7 +121,15 @@ public class JzgAuthenticationProvider implements AuthenticationProvider {
         }
 
         String name = "",workNumber = "",headSculpture = "";
-        if(!system.equals(SystemConstants.SYSTEM_PLATFORM.getCode())){
+        if(system.equals(SystemConstants.SYSTEM_JZG_APP.getCode())){
+            SysUserJzgApp jzgUserApp = sysUserJzgAppMapper.selectOne(new LambdaQueryWrapper<SysUserJzgApp>().eq(SysUserJzgApp::getUserId, byId.getId()));
+            if(Objects.isNull(jzgUserApp.getLastLoginTime())){
+                isFirst = true;
+            }
+            //更新用户登录时间
+            jzgUserApp.setLastLoginTime(LocalDateTime.now());
+            sysUserJzgAppMapper.updateById(jzgUserApp);
+        }else if(!system.equals(SystemConstants.SYSTEM_PLATFORM.getCode())){
             SysUserJzgVo jzgUserInfo = sysUserService.getJzgUserInfo(byId.getId(),system);
             name = jzgUserInfo.getName();
             workNumber = jzgUserInfo.getWorkNumber();
@@ -120,7 +150,12 @@ public class JzgAuthenticationProvider implements AuthenticationProvider {
         }
         SysUserJzgVo jzgUserInfo = new SysUserJzgVo();
         //获取用户头像
-        if(SystemConstants.SYSTEM_PLATFORM.getCode().equals(system)){
+        if(SystemConstants.SYSTEM_JZG_APP.getCode().equals(system)){
+            SysUser user = sysUserService.getById(byId.getId());
+            if(!Objects.isNull(user.getHeadSculpture()) && !user.getHeadSculpture().isEmpty()) {
+                jzgUserInfo.setHeadSculpture(MinioUtils.getPresignedObjectUrl("jzg", user.getHeadSculpture()));
+            }
+        }else if(SystemConstants.SYSTEM_PLATFORM.getCode().equals(system)){
             SysUser user = sysUserService.getById(byId.getId());
             if(!Objects.isNull(user.getHeadSculpture()) && !user.getHeadSculpture().isEmpty()) {
                 jzgUserInfo.setHeadSculpture(MinioUtils.getPresignedObjectUrl("jzg", user.getHeadSculpture()));
@@ -176,6 +211,7 @@ public class JzgAuthenticationProvider implements AuthenticationProvider {
         detailMap.put("id",byId.getId());
         detailMap.put("username",byId.getUsername());
         detailMap.put("headSculpture",jzgUserInfo.getHeadSculpture());
+        detailMap.put("isFirst",isFirst);
         details = detailMap;
 
         Object finalDetails = details;

+ 10 - 1
authentication/src/main/java/com/jzg/config/JzgUsernamePasswordAuthenticationToken.java

@@ -21,11 +21,17 @@ public class JzgUsernamePasswordAuthenticationToken extends UsernamePasswordAuth
      */
     private String captcha;
 
-    public JzgUsernamePasswordAuthenticationToken(Object principal, Object credentials,String system,String captchaId,String captcha) {
+    /**
+     * 短信code
+     */
+    private String smsCode;
+
+    public JzgUsernamePasswordAuthenticationToken(Object principal, Object credentials,String system,String captchaId,String captcha,String smsCode) {
         super(principal, credentials);
         this.system = system;
         this.captchaId = captchaId;
         this.captcha = captcha;
+        this.smsCode = smsCode;
     }
 
 
@@ -56,5 +62,8 @@ public class JzgUsernamePasswordAuthenticationToken extends UsernamePasswordAuth
         return this.captcha;
     }
 
+    public String getSmsCode(){
+        return this.smsCode;
+    }
 
 }

+ 8 - 2
authentication/src/main/java/com/jzg/config/SecurityConfig.java

@@ -4,6 +4,7 @@ import com.jzg.filter.TokenAuthenticationFilter;
 import com.jzg.handler.JzgAuthenticationSuccessHandler;
 import com.jzg.mapper.SysRoleDataScopeLinkMapper;
 import com.jzg.mapper.SysRoleDataScopeMapper;
+import com.jzg.mapper.SysUserJzgAppMapper;
 import com.jzg.service.SysSystemService;
 import com.jzg.service.SysUserRoleService;
 import com.jzg.service.SysUserService;
@@ -49,6 +50,9 @@ public class SecurityConfig {
     @Autowired
     SysRoleDataScopeMapper sysRoleDataScopeMapper;
 
+    @Autowired
+    SysUserJzgAppMapper sysUserJzgAppMapper;
+
     @Bean
     public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {
         return authenticationConfiguration.getAuthenticationManager();
@@ -56,7 +60,8 @@ public class SecurityConfig {
 
     @Bean
     public AuthenticationProvider authenticationProvider(UserDetailsService userDetailsService) {
-        return new JzgAuthenticationProvider(userDetailsService,sysUserService,sysRoleService,redissonClient,sysRoleDataScopeMapper,sysRoleDataScopeLinkMapper,sysSystemService);
+        return new JzgAuthenticationProvider(userDetailsService,sysUserService,sysRoleService,redissonClient,sysRoleDataScopeMapper,
+                sysRoleDataScopeLinkMapper,sysSystemService,sysUserJzgAppMapper);
     }
 
     @Bean
@@ -77,7 +82,8 @@ public class SecurityConfig {
         http.csrf().disable();
         http.authorizeHttpRequests(auth -> auth
                         .requestMatchers("/swagger-ui/**", "/v3/api-docs/**", "/swagger-resources/**", "/webjars/**", "/favicon.ico",
-                                "/auth/login","/auth/captchaById","/auth/register","/sendSmsCode","/appLogin","/smsCodeLogin","/auth/publicKeyExchange","/appAuth/smsCodeLogin","/send/sendSmsCode").permitAll()
+                                "/auth/login","/auth/captchaById","/auth/register","/sendSmsCode","/appLogin","/smsCodeLogin","/auth/publicKeyExchange","/appAuth/smsCodeLogin","/send/sendSmsCode",
+                                "/appAuth/appLogin","/auth/sendSmsCode").permitAll()
                         .anyRequest().authenticated()  // 其他接口需认证
                 )
 //                .formLogin((form) -> form

+ 59 - 3
authentication/src/main/java/com/jzg/controller/AuthController.java

@@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jzg.commons.annotation.IgnoreTenant;
 import com.jzg.commons.constants.EncryptionConstants;
 import com.jzg.commons.request.RequestSingleParam;
+import com.jzg.commons.util.AssertionUtils;
 import com.jzg.commons.util.MinioUtils;
 import com.jzg.commons.util.PasswordUtils;
 import com.jzg.commons.util.sm.Sm2Util;
@@ -22,6 +23,8 @@ import com.jzg.commons.core.page.HttpResult;
 import com.jzg.entity.RedisToken;
 import com.jzg.entity.SysUploadFiles;
 import com.jzg.entity.SysUser;
+import com.jzg.entity.vo.AppRegisterFormVo;
+import com.jzg.entity.vo.ForgotPasswordFormVo;
 import com.jzg.entity.vo.LoginFormVo;
 import com.jzg.entity.vo.ModifyPassWordFormVo;
 import com.jzg.commons.exception.SystemException;
@@ -47,6 +50,7 @@ import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.web.bind.annotation.*;
@@ -59,6 +63,7 @@ import java.io.IOException;
 import java.security.*;
 import java.util.List;
 import java.util.Objects;
+import java.util.Random;
 import java.util.concurrent.TimeUnit;
 import java.util.regex.Pattern;
 
@@ -111,6 +116,19 @@ public class AuthController extends BaseController {
     public void login(@RequestBody LoginFormVo loginFormVo) throws ServletException, IOException {
         HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
         HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
+        if(loginFormVo.getSystem().equals("APP")){
+            SysUser userById = sysUserService.getOne(new LambdaQueryWrapper<SysUser>()
+                    .eq(SysUser::getMobile, loginFormVo.getUserName()));
+            if(Objects.isNull(userById)) {
+                //如果不存在用户则自动注册
+                AppRegisterFormVo appRegisterFormVo = new AppRegisterFormVo();
+                appRegisterFormVo.setMobile(loginFormVo.getUserName());
+                appRegisterFormVo.setCaptcha(loginFormVo.getCaptcha());
+                appRegisterFormVo.setCaptchaId(loginFormVo.getCaptchaId());
+                appRegisterFormVo.setSmsCode(loginFormVo.getSmsCode());
+                register(appRegisterFormVo);
+            }
+        }
         JzgUsernamePasswordAuthenticationToken authentication = new JzgUsernamePasswordAuthenticationToken(loginFormVo);
         Authentication authenticate = authenticationManager.authenticate(authentication);
         SecurityContextHolder.getContext().setAuthentication(authenticate);
@@ -153,6 +171,21 @@ public class AuthController extends BaseController {
         IOUtils.closeQuietly(out);
     }
 
+    @GetMapping("sendSmsCode")
+    @Operation(summary = "发送短信验证码")
+    public HttpResult sendSmsCode(String mobile){
+        if(mobile.isEmpty() && mobile.length() != 11){
+            throw new SystemException("手机号格式错误");
+        }
+        //存储短信验证码
+//        String code = String.format("%06d", new Random().nextInt(1000000));
+        String code = "123456";
+        redissonClient.getBucket(RedisKeyConstants.SMS_CODE + mobile).set(code, 120, TimeUnit.SECONDS);
+        //调取三方发送短信接口
+
+        return HttpResult.ok("验证码发送成功");
+    }
+
     @PostMapping("modifyPass")
     @Operation(summary = "修改密码")
     public HttpResult modifyPass(@RequestBody ModifyPassWordFormVo modifyPassWordFormVo){
@@ -181,9 +214,32 @@ public class AuthController extends BaseController {
 
     @PostMapping("register")
     @Operation(summary = "用户注册")
-    public HttpResult register(@RequestBody SysUser sysUser){
-        boolean register = sysUserService.register(sysUser);
-        return HttpResult.ok("");
+    public HttpResult register(@RequestBody AppRegisterFormVo appRegisterFormVo){
+        SysUser userById = sysUserService.getOne(new LambdaQueryWrapper<SysUser>()
+                .eq(SysUser::getMobile, appRegisterFormVo.getMobile()));
+        AssertionUtils.isFail(Objects.nonNull(userById),"用户已注册,请直接登录");
+        sysUserService.validateCode(appRegisterFormVo.getCaptchaId(), appRegisterFormVo.getCaptcha());
+        sysUserService.validateSmsCode(appRegisterFormVo.getMobile(), appRegisterFormVo.getSmsCode());
+        boolean register = sysUserService.register(appRegisterFormVo);
+
+        return register ? HttpResult.ok("注册成功") : HttpResult.error("注册失败");
+    }
+
+    @PostMapping("forgotPassword")
+    @Operation(summary = "忘记密码")
+    public HttpResult forgotPassword(@RequestBody ForgotPasswordFormVo forgotPasswordFormVo){
+        if(forgotPasswordFormVo.getMobile().isEmpty() && forgotPasswordFormVo.getMobile().length()!= 11){
+            throw new SystemException("手机号格式错误");
+        }
+
+        SysUser userById = sysUserService.getOne(new LambdaQueryWrapper<SysUser>()
+                .eq(SysUser::getMobile, forgotPasswordFormVo.getMobile()));
+        AssertionUtils.isFail(Objects.isNull(userById),"用户名不存在");
+
+        //校验短信验证码
+        sysUserService.validateSmsCode(forgotPasswordFormVo.getMobile(), forgotPasswordFormVo.getSmsCode());
+        boolean result = sysUserService.forgotPassword(forgotPasswordFormVo);
+        return result ? HttpResult.ok("修改密码成功") : HttpResult.error("修改密码失败");
     }
 
     @PostMapping("logout")

+ 5 - 0
authentication/src/main/java/com/jzg/entity/vo/AppLoginFormVo.java

@@ -24,5 +24,10 @@ public class AppLoginFormVo {
     @Schema(description = "验证码id")
     private String captchaId;
 
+    @Schema(description = "验证码")
+    private String captcha;
+
+    @Schema(description = "短信验证码")
+    private String smsCode;
 
 }

+ 25 - 0
authentication/src/main/java/com/jzg/entity/vo/AppRegisterFormVo.java

@@ -0,0 +1,25 @@
+package com.jzg.entity.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+@Data
+public class AppRegisterFormVo {
+
+    @Schema(description = "账号")
+    @NotBlank(message = "请输入手机号")
+    private String mobile;
+
+    @Schema(description = "密码")
+    private String password;
+
+    @Schema(description = "短信验证码")
+    private String smsCode;
+
+    @Schema(description = "验证码id")
+    private String captchaId;
+
+    @Schema(description = "验证码")
+    private String captcha;
+}

+ 26 - 0
authentication/src/main/java/com/jzg/entity/vo/ForgotPasswordFormVo.java

@@ -0,0 +1,26 @@
+package com.jzg.entity.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+@Data
+public class ForgotPasswordFormVo {
+
+    @Schema(description = "账号")
+    @NotBlank(message = "请输入手机号")
+    private String mobile;
+
+    @Schema(description = "密码")
+    private String password;
+
+    @Schema(description = "短信验证码")
+    private String smsCode;
+
+//    @Schema(description = "验证码id")
+//    private String captchaId;
+//
+//    @Schema(description = "验证码")
+//    private String captcha;
+
+}

+ 3 - 0
authentication/src/main/java/com/jzg/entity/vo/LoginFormVo.java

@@ -22,4 +22,7 @@ public class LoginFormVo {
     @Schema(description = "验证码")
     private String captcha;
 
+    @Schema(description = "短信验证码")
+    private String smsCode;
+
 }

+ 2 - 0
authentication/src/main/java/com/jzg/filter/TokenAuthenticationFilter.java

@@ -46,6 +46,8 @@ public class TokenAuthenticationFilter extends OncePerRequestFilter {
         doList.add("/smsCodeLogin");
         doList.add("/auth/publicKeyExchange");
         doList.add("/appAuth/smsCodeLogin");
+        doList.add("/appAuth/appLogin");
+        doList.add("/auth/sendSmsCode");
         String path = request.getRequestURI();
         for (String pattern : doList) {
             // 使用正则表达式匹配  .* 匹配所有以 pattern 开头的路径

+ 5 - 1
authentication/src/main/java/com/jzg/handler/JzgAuthenticationSuccessHandler.java

@@ -40,6 +40,7 @@ public class JzgAuthenticationSuccessHandler implements AuthenticationSuccessHan
         String workNumber = ((HashMap<String, String>) authentication.getDetails()).get("workNumber");
         String name = ((HashMap<String, String>) authentication.getDetails()).get("name");
         String headSculpture = ((HashMap<String, String>) authentication.getDetails()).get("headSculpture");
+        boolean isFirst = ((HashMap<String, Boolean>) authentication.getDetails()).get("isFirst");
         RedisToken redisToken = new RedisToken();
         Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
         redisToken.setUsername(username);
@@ -67,9 +68,12 @@ public class JzgAuthenticationSuccessHandler implements AuthenticationSuccessHan
         // 设置响应内容类型为 JSON
         response.setContentType("application/json");
         JSONObject json = new JSONObject();
+        JSONObject data = new JSONObject();
+        data.put("token",token);
+        data.put("isFirst",isFirst);
         json.put("code",200);
         json.put("msg","login success");
-        json.put("data",token);
+        json.put("data",data);
         // 将 Token 返回给前端
         response.getWriter().write(json.toJSONString());
 

+ 10 - 0
authentication/src/main/java/com/jzg/mapper/SysUserJzgAppMapper.java

@@ -0,0 +1,10 @@
+package com.jzg.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jzg.commons.entity.po.SysUserJzgApp;
+import com.jzg.entity.SysUploadFiles;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface SysUserJzgAppMapper extends BaseMapper<SysUserJzgApp> {
+}

+ 28 - 2
authentication/src/main/java/com/jzg/service/SysUserService.java

@@ -2,6 +2,8 @@ package com.jzg.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.jzg.entity.SysUser;
+import com.jzg.entity.vo.AppRegisterFormVo;
+import com.jzg.entity.vo.ForgotPasswordFormVo;
 import com.jzg.entity.vo.SysUserJzgVo;
 import org.springframework.stereotype.Service;
 
@@ -10,10 +12,10 @@ public interface SysUserService extends IService<SysUser> {
 
     /**
      * 用户注册
-     * @param sysUser
+     * @param appRegisterFormVo
      * @return
      */
-    public boolean register(SysUser sysUser);
+    public boolean register(AppRegisterFormVo  appRegisterFormVo);
 
 
     /**
@@ -32,4 +34,28 @@ public interface SysUserService extends IService<SysUser> {
      * @return
      */
     SysUser getByUserName(String username);
+
+
+    /**
+     * 忘记密码
+     * @param forgotPasswordFormVo
+     * @return
+     */
+    boolean forgotPassword(ForgotPasswordFormVo forgotPasswordFormVo);
+
+    /**
+     * 校验验证码
+     * @param captchaId
+     * @param captcha
+     * @return
+     */
+    boolean validateCode(String captchaId,String captcha);
+
+    /**
+     * 校验短信验证码
+     * @param mobile
+     * @param smsCode
+     * @return
+     */
+    boolean validateSmsCode(String mobile,String smsCode);
 }

+ 72 - 4
authentication/src/main/java/com/jzg/service/impl/SysUserServiceImpl.java

@@ -2,20 +2,54 @@ package com.jzg.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jzg.commons.constants.RedisKeyConstants;
+import com.jzg.commons.entity.po.SysUserJzgApp;
+import com.jzg.commons.exception.SystemException;
+import com.jzg.commons.util.PasswordUtils;
+import com.jzg.commons.util.idgen.IdGenerate;
 import com.jzg.entity.SysUser;
+import com.jzg.entity.vo.AppRegisterFormVo;
+import com.jzg.entity.vo.ForgotPasswordFormVo;
 import com.jzg.entity.vo.ModifyPassWordFormVo;
 import com.jzg.entity.vo.SysUserJzgVo;
+import com.jzg.mapper.SysUserJzgAppMapper;
 import com.jzg.mapper.SysUserMapper;
 import com.jzg.service.SysUserService;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Objects;
 
 @Service
 public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements SysUserService {
+
+    @Autowired
+    SysUserJzgAppMapper sysUserJzgAppMapper;
+
+    @Autowired
+    RedissonClient redissonClient;
+
     @Override
-    public boolean register(SysUser sysUser) {
-        sysUser.setId("1");
-        boolean save = this.save(sysUser);
-        return save;
+    @Transactional
+    public boolean register(AppRegisterFormVo appRegisterFormVo) {
+        SysUser sysUser = new SysUser();
+        sysUser.setId(IdGenerate.nextId());
+        sysUser.setUsername(appRegisterFormVo.getMobile());
+        sysUser.setPassword(appRegisterFormVo.getPassword());
+        sysUser.setMobile(appRegisterFormVo.getMobile());
+        sysUser.setSalt(PasswordUtils.getSalt());
+        sysUser.setAccountStatus(1);
+        this.save(sysUser);
+
+        SysUserJzgApp sysUserJzgApp = new SysUserJzgApp();
+        sysUserJzgApp.setId(IdGenerate.nextId());
+        sysUserJzgApp.setUserId(sysUser.getId());
+        sysUserJzgApp.setIsEnable(0);
+        sysUserJzgApp.setStatus(0);
+        sysUserJzgAppMapper.insert(sysUserJzgApp);
+        return true;
     }
 
     @Override
@@ -29,5 +63,39 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         return baseMapper.selectByUserName(username);
     }
 
+    @Override
+    public boolean forgotPassword(ForgotPasswordFormVo forgotPasswordFormVo) {
+        SysUser sysUser = baseMapper.selectByUserName(forgotPasswordFormVo.getMobile());
+        sysUser.setPassword(PasswordUtils.encode(forgotPasswordFormVo.getPassword(),sysUser.getSalt()));
+        this.save(sysUser);
+        return true;
+    }
+
+    @Override
+    public boolean validateCode(String captchaId, String captcha) {
+        if(Objects.isNull(redissonClient.getBucket(RedisKeyConstants.VERIFICATION_CODE + captchaId).get())){
+            throw new SystemException("验证码已过期");
+        }
+        String systemCaptcha = redissonClient.getBucket(RedisKeyConstants.VERIFICATION_CODE + captchaId).get().toString();
+        if(!captcha.equalsIgnoreCase(systemCaptcha)){
+            throw new SystemException("验证码错误,请重新输入");
+        }
+
+        return true;
+    }
+
+    @Override
+    public boolean validateSmsCode(String mobile, String smsCode) {
+        //校验短信验证码
+        if(Objects.isNull(redissonClient.getBucket(RedisKeyConstants.SMS_CODE + mobile).get())){
+            throw new SystemException("短信验证码已过期");
+        }
+        String systemSmsCode = redissonClient.getBucket(RedisKeyConstants.SMS_CODE + mobile).get().toString();
+        if(!smsCode.equals(systemSmsCode)){
+            throw new SystemException("短信验证码错误,请重新输入");
+        }
+        return true;
+    }
+
 
 }

+ 3 - 0
commons/src/main/java/com/jzg/commons/constants/RedisKeyConstants.java

@@ -8,6 +8,9 @@ public class RedisKeyConstants {
     //验证码Key
     public static final String VERIFICATION_CODE = "VERIFICATION_CODE:";
 
+    //短信验证码key
+    public static final String SMS_CODE = "SMS_CODE:";
+
     public static final String DICT_REDIS_KEY = "DICT:";
 
     /**

+ 2 - 1
commons/src/main/java/com/jzg/commons/constants/SystemConstants.java

@@ -11,7 +11,8 @@ import lombok.Getter;
 public enum SystemConstants {
 
     SYSTEM_PLATFORM("PLATFORM","平台"),
-    SYSTEM_JZG("JZG","晋掌柜");
+    SYSTEM_JZG("JZG","晋掌柜"),
+    SYSTEM_JZG_APP("APP","晋掌柜APP");
 
     private String code;
     private String desc;

+ 140 - 0
commons/src/main/java/com/jzg/commons/entity/po/SysUserJzgApp.java

@@ -0,0 +1,140 @@
+package com.jzg.commons.entity.po;
+
+import cn.hutool.core.date.DateTime;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jzg.commons.core.base.BaseModel;
+import com.jzg.commons.entity.dto.SysUserJzgInfoBankCardDto;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * @author quchen
+ * @date 2025/1/16 9:05
+ */
+
+@Data
+@TableName("sys_user_jzg_app")
+@Schema(description = "晋掌柜app信息表")
+@NoArgsConstructor
+@AllArgsConstructor
+public class SysUserJzgApp extends BaseModel implements Serializable {
+    @TableId(value = "id")
+    @Schema(description = "主键")
+    private String id;
+
+    @TableField(value = "user_id")
+    @Schema(description = "用户")
+    private String userId;
+
+    @TableField(value = "name")
+    @Schema(description = "姓名")
+    private String name;
+
+    @TableField(value = "work_number")
+    @Schema(description = "工号")
+    private String workNumber;
+
+    @TableField(value = "status")
+    @Schema(description = "状态 0:未认证 1:实名认证失败 2:待入职 3:入职待审核 4:审核不通过 5:已入职")
+    private Integer status;
+
+    @TableField(value = "is_enable")
+    @Schema(description = "是否启用 0:启用 1:禁用")
+    private Integer isEnable;
+
+    @TableField(value = "system_code")
+    @Schema(description = "系统code")
+    private String systemCode;
+
+    /** 机构ID */
+    @TableField(value = "dept_id")
+    @Schema(description = "机构id")
+    private String deptId;
+
+    @TableField(value = "open_id")
+    @Schema(description = "微信id")
+    private String openId;
+
+    @TableField(value = "alipay")
+    @Schema(description = "支付宝id")
+    private String alipay;
+
+    @TableField(value = "approval_opinion")
+    @Schema(description = "审批意见")
+    private String approvalOpinion;
+
+    @TableField(value = "logout_time")
+    @Schema(description = "离职时间")
+    private String logoutTime;
+
+    @TableField(value = "head_sculpture")
+    @Schema(description = "头像")
+    private String headSculpture;
+
+    @TableField(value = "leader_id")
+    @Schema(description = "领导人id")
+    private String leaderId;
+
+    @TableField(value = "referrer_id")
+    @Schema(description = "推荐人id")
+    private String referrerId;
+
+
+    @TableField(value = "factor_verify")
+    @Schema(description = "是否实名认证 0 未验证 1 已验证")
+    private String factorVerify;
+
+    @TableField(value = "address")
+    @Schema(description = "地址")
+    private String address;
+
+    @TableField(value = "remark")
+    @Schema(description = "备注")
+    private String remark;
+
+    @TableField(value = "sex")
+    @Schema(description = "性别")
+    private String sex;
+
+    @TableField(value = "live_address")
+    @Schema(description = "居住地址")
+    private String liveAddress;
+
+    @TableField(value = "province")
+    @Schema(description = "省")
+    private String province;
+
+    @TableField(value = "city")
+    @Schema(description = "市")
+    private String city;
+
+    @TableField(value = "district")
+    @Schema(description = "区")
+    private String district;
+
+    @TableField(value = "last_login_time")
+    @Schema(description = "上一次登录时间")
+    private LocalDateTime lastLoginTime;
+
+    @TableField(value = "is_delete")
+    @Schema(description = "是否删除 0未删除 1 删除")
+    private Integer isDelete;
+
+    public SysUserJzgApp(String userName, SysUser user, String systemCode, String deptId){
+        this.userId = user.getId();
+        //默认添加管理员账户
+        this.name = userName;
+        this.status = 0;
+        this.isEnable = 0;
+        this.deptId = deptId;
+        this.systemCode = systemCode;
+    }
+}

+ 0 - 2
commons/src/main/java/com/jzg/commons/entity/po/SysUserJzgInfo.java

@@ -7,8 +7,6 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import com.jzg.commons.core.base.BaseModel;
 import com.jzg.commons.entity.dto.SysUserJzgInfoBankCardDto;
 import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotNull;
-import jakarta.validation.constraints.Size;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;