Forráskód Böngészése

添加图片验证码

qrs 1 hónapja
szülő
commit
1dc3e7d18f

+ 5 - 0
alien-store-platform/pom.xml

@@ -270,6 +270,11 @@
             <artifactId>spring-boot-starter-webflux</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-captcha</artifactId>
+        </dependency>
+
     </dependencies>
 
     <build>

+ 33 - 7
alien-store-platform/src/main/java/shop/alien/storeplatform/controller/StorePlatformLoginController.java

@@ -12,11 +12,13 @@ import shop.alien.entity.store.vo.StoreUserVo;
 import shop.alien.mapper.StoreUserMapper;
 import shop.alien.storeplatform.service.StorePlatformLoginervice;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 import java.util.Objects;
 import java.util.Optional;
 
 @Slf4j
-@Api(tags = {"商户平台-用户管理"})
+@Api(tags = {"商户平台-注册登录"})
 @ApiSort(1)
 @CrossOrigin
 @RestController
@@ -68,8 +70,13 @@ public class StorePlatformLoginController {
             @ApiImplicitParam(name = "code", value = "验证码", dataType = "String", paramType = "query", required = true)
     })
     @GetMapping("/login")
-    public R<StoreUserVo> login(@RequestParam("phone") String phone, @RequestParam("password") String password, @RequestParam("isPassword") Boolean isPassword, @RequestParam("code") String code) {
-        log.info("StorePlatformLoginController.login?phone={}&password={}&isPassword={}&code={}", phone, password, isPassword, code);
+    public R<StoreUserVo> login(
+            @RequestParam("phone") String phone,
+            @RequestParam("password") String password,
+            @RequestParam("isPassword") Boolean isPassword,
+            @RequestParam("code") String code,
+            @RequestParam("captcha") String captcha) {
+        log.info("StorePlatformLoginController.login?phone={}&password={}&isPassword={}&code={}&captcha={}", phone, password, isPassword, code, captcha);
         if (!isPassword) {
             // 2025-11-04 验证码-商户端登录
             String cacheCode = baseRedisService.getString("verification_store_platform_login_" + phone);
@@ -79,7 +86,16 @@ public class StorePlatformLoginController {
             if (!cacheCode.trim().equals(code.trim())) {
                 return R.fail("验证码错误");
             }
+        } else {
+            String cacheCode = baseRedisService.getString("store_platform_captcha_" + phone);
+            if (null == cacheCode) {
+                return R.fail("验证码已过期");
+            }
+            if (!cacheCode.trim().equals(captcha.trim())) {
+                return R.fail("验证码错误");
+            }
         }
+
         StoreUser storeUser = storeUserMapper.selectOne(new LambdaQueryWrapper<StoreUser>()
                 .eq(StoreUser::getPhone, phone));
         if (null == storeUser) {
@@ -88,11 +104,18 @@ public class StorePlatformLoginController {
         if (storeUser.getStatus() == 1) {
             return R.fail("账号被禁用");
         }
+
         return Optional.ofNullable(storeUser).
                 map(user -> isPassword ? checkPassword(user, password) : storePlatformLoginService.createToKen(user)).
                 orElseGet(() -> R.fail("手机号不存在"));
     }
 
+    private R<StoreUserVo> checkPassword(StoreUser user, String password) {
+        return Objects.equals(password, user.getPassword())
+                ? storePlatformLoginService.createToKen(user)
+                : R.fail("密码错误");
+    }
+
     @ApiOperation("忘记密码/修改密码/更换绑定手机号")
     @ApiOperationSupport(order = 4)
     @ApiImplicitParams({
@@ -130,10 +153,13 @@ public class StorePlatformLoginController {
         return storePlatformLoginService.forgetOrModifyPassword(phone, newPhone, oldPassword, newPassword, confirmNewPassword, verificationCode, type);
     }
 
-    private R<StoreUserVo> checkPassword(StoreUser user, String password) {
-        return Objects.equals(password, user.getPassword())
-                ? storePlatformLoginService.createToKen(user)
-                : R.fail("密码错误");
+    @ApiOperation("生成验证码")
+    @ApiOperationSupport(order = 5)
+    @ApiImplicitParams({@ApiImplicitParam(name = "phone", value = "手机号", dataType = "String", paramType = "query", required = true)})
+    @GetMapping("/generateCaptcha")
+    public void generateCaptcha(HttpServletResponse response, String phone) throws IOException {
+        log.info("StorePlatformLoginController.generateCaptcha?phone={}", phone);
+        storePlatformLoginService.generateCaptcha(response, phone);
     }
 
 }

+ 5 - 0
alien-store-platform/src/main/java/shop/alien/storeplatform/service/StorePlatformLoginervice.java

@@ -4,6 +4,9 @@ import shop.alien.entity.result.R;
 import shop.alien.entity.store.StoreUser;
 import shop.alien.entity.store.vo.StoreUserVo;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
 public interface StorePlatformLoginervice {
 
     R<Boolean> register(String phone, String password);
@@ -24,4 +27,6 @@ public interface StorePlatformLoginervice {
      */
     R<String> forgetOrModifyPassword(String phone, String newPhone, String oldPassword, String newPassword,String confirmNewPassword,String verificationCode,  Integer type);
 
+    void generateCaptcha(HttpServletResponse response, String phone) throws IOException;
+
 }

+ 31 - 13
alien-store-platform/src/main/java/shop/alien/storeplatform/service/impl/StorePlatformLoginServiceImpl.java

@@ -1,5 +1,7 @@
 package shop.alien.storeplatform.service.impl;
 
+import cn.hutool.captcha.CaptchaUtil;
+import cn.hutool.captcha.LineCaptcha;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -8,6 +10,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 import shop.alien.config.redis.BaseRedisService;
@@ -21,16 +24,22 @@ import shop.alien.storeplatform.service.StorePlatformLoginervice;
 import shop.alien.util.common.DateUtils;
 import shop.alien.util.common.JwtUtil;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 import java.util.*;
 
 @Slf4j
 @Service
 @RequiredArgsConstructor
+@RefreshScope
 public class StorePlatformLoginServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser> implements StorePlatformLoginervice {
 
     @Value("${jwt.expiration-time}")
     private String effectiveTime;
 
+    @Value("${captcha.register.timeOut}")
+    private Long timeOut;
+
     private final StoreUserMapper storeUserMapper;
     private final StoreInfoMapper storeInfoMapper;
     private final BaseRedisService baseRedisService;
@@ -60,6 +69,20 @@ public class StorePlatformLoginServiceImpl extends ServiceImpl<StoreUserMapper,
         return R.success("操作成功");
     }
 
+    private void saveNewUser(String phone, String password) {
+        StoreUser registerStoreUser = new StoreUser();
+        registerStoreUser.setPhone(phone);
+        registerStoreUser.setPassword(password);
+        registerStoreUser.setMoney(0);
+        registerStoreUser.setDeleteFlag(0);
+        registerStoreUser.setStatus(0);
+        registerStoreUser.setPassType(2);
+        registerStoreUser.setCreatedTime(new Date());
+        registerStoreUser.setLogoutFlag(0);
+        registerStoreUser.setNickName(phone);
+        storeUserMapper.insert(registerStoreUser);
+    }
+
     public boolean checkRegister(String phone) {
         LambdaQueryWrapper<StoreUser> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(StoreUser::getPhone, phone);
@@ -98,7 +121,7 @@ public class StorePlatformLoginServiceImpl extends ServiceImpl<StoreUserMapper,
         tokenMap.put("phone", storeUser.getPhone());
         tokenMap.put("userName", storeUser.getName());
         tokenMap.put("userId", storeUser.getId().toString());
-        tokenMap.put("userType", "store");
+        tokenMap.put("userType", "storePlatform");
         storeUserVo.setToken(JwtUtil.createJWT("store_platform_" + storeUser.getPhone(), storeUser.getName(), JSONObject.toJSONString(tokenMap), effectiveTimeIntLong));
         baseRedisService.setString("store_platform_" + storeUser.getPhone(), storeUserVo.getToken());
         StoreInfo storeInfo = storeInfoMapper.selectById(storeUser.getStoreId());
@@ -149,18 +172,13 @@ public class StorePlatformLoginServiceImpl extends ServiceImpl<StoreUserMapper,
         }
     }
 
-    private void saveNewUser(String phone, String password) {
-        StoreUser registerStoreUser = new StoreUser();
-        registerStoreUser.setPhone(phone);
-        registerStoreUser.setPassword(password);
-        registerStoreUser.setMoney(0);
-        registerStoreUser.setDeleteFlag(0);
-        registerStoreUser.setStatus(0);
-        registerStoreUser.setPassType(2);
-        registerStoreUser.setCreatedTime(new Date());
-        registerStoreUser.setLogoutFlag(0);
-        registerStoreUser.setNickName(phone);
-        storeUserMapper.insert(registerStoreUser);
+    @Override
+    public void generateCaptcha(HttpServletResponse response, String phone) throws IOException {
+        LineCaptcha captcha = CaptchaUtil.createLineCaptcha(200, 100, 4, 100);
+        baseRedisService.setString("store_platform_captcha_" + phone, captcha.getCode(), timeOut);
+        response.setContentType("image/png");
+        response.setHeader("Pragma", "No-cache");
+        captcha.write(response.getOutputStream());
     }
 
     private void passwordVerification(String phone, String password, String newPassword, String confirmNewPassword) {

+ 6 - 0
pom.xml

@@ -367,6 +367,12 @@
                 <version>2.3.3</version>
             </dependency>
 
+            <dependency>
+                <groupId>cn.hutool</groupId>
+                <artifactId>hutool-captcha</artifactId>
+                <version>5.8.18</version>
+            </dependency>
+
             <!--Other End-->
         </dependencies>
     </dependencyManagement>