浏览代码

实现手机密码登录

Zhangbw 2 月之前
父节点
当前提交
5ca731236f

+ 27 - 25
src/main/java/com/yingpai/gupiao/controller/H5AuthController.java

@@ -70,11 +70,36 @@ public class H5AuthController {
         }
     }
 
+    /**
+     * 检查用户是否已注册
+     * 根据openid判断用户是否已经注册
+     *
+     * @param openid 微信openid
+     * @return 是否已注册
+     */
+    @GetMapping("/check-user")
+    public Result<Boolean> checkUser(@RequestParam("openid") String openid) {
+        log.info("检查用户状态,openid: {}", openid);
+
+        if (StrUtil.isBlank(openid)) {
+            return Result.error("openid不能为空");
+        }
+
+        try {
+            boolean isRegistered = h5AuthService.checkUserRegistered(openid);
+            return Result.success(isRegistered);
+        } catch (Exception e) {
+            log.error("检查用户状态失败", e);
+            return Result.error("检查失败:" + e.getMessage());
+        }
+    }
+
     /**
      * 手机号登录/注册
-     * 用户输入手机号和验证码完成登录或注册
+     * 登录:验证openid、手机号、密码
+     * 注册:保存openid、手机号、密码、用户信息
      *
-     * @param dto 包含 openid、手机号、验证码、昵称、头像
+     * @param dto 包含 openid、手机号、码、昵称、头像
      * @return token
      */
     @PostMapping("/phone-login")
@@ -97,27 +122,4 @@ public class H5AuthController {
             return Result.error("登录失败:" + e.getMessage());
         }
     }
-
-    /**
-     * 发送短信验证码
-     *
-     * @param phone 手机号
-     * @return 成功/失败
-     */
-    @PostMapping("/send-sms")
-    public Result<Void> sendSms(@RequestParam("phone") String phone) {
-        log.info("发送短信验证码,phone: {}", phone);
-
-        if (StrUtil.isBlank(phone)) {
-            return Result.error("手机号不能为空");
-        }
-
-        try {
-            h5AuthService.sendSmsCode(phone);
-            return Result.success(null);
-        } catch (Exception e) {
-            log.error("发送短信验证码失败", e);
-            return Result.error("发送失败:" + e.getMessage());
-        }
-    }
 }

+ 5 - 0
src/main/java/com/yingpai/gupiao/domain/dto/H5PhoneLoginDTO.java

@@ -17,6 +17,11 @@ public class H5PhoneLoginDTO {
      */
     private String phone;
 
+    /**
+     * 登录密码
+     */
+    private String password;
+
     /**
      * 昵称(新用户注册时需要)
      */

+ 6 - 1
src/main/java/com/yingpai/gupiao/domain/po/User.java

@@ -39,7 +39,12 @@ public class User {
      * 手机号
      */
     private String phone;
-    
+
+    /**
+     * 登录密码(明文存储)
+     */
+    private String password;
+
     /**
      * 用户昵称
      */

+ 7 - 6
src/main/java/com/yingpai/gupiao/service/H5AuthService.java

@@ -23,16 +23,17 @@ public interface H5AuthService {
      */
     WxH5UserInfoVO getUserInfoByCode(String code) throws Exception;
 
+    /**
+     * 检查用户是否已注册
+     * @param openid 微信openid
+     * @return 是否已注册
+     */
+    boolean checkUserRegistered(String openid);
+
     /**
      * 手机号登录/注册
      * @param dto 登录信息
      * @return token
      */
     LoginVO phoneLogin(H5PhoneLoginDTO dto) throws Exception;
-
-    /**
-     * 发送短信验证码
-     * @param phone 手机号
-     */
-    void sendSmsCode(String phone) throws Exception;
 }

+ 27 - 44
src/main/java/com/yingpai/gupiao/service/impl/H5AuthServiceImpl.java

@@ -130,20 +130,7 @@ public class H5AuthServiceImpl implements H5AuthService {
 
             log.info("获取用户信息成功,nickname: {}, openid: {}", nickname, openid);
 
-            // 3. 检查用户是否已注册
-            LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
-            wrapper.eq(User::getOpenid, openid);
-            User user = userMapper.selectOne(wrapper);
-
-            boolean isRegistered = user != null;
-            String token = null;
-
-            if (isRegistered) {
-                // 老用户,直接生成token
-                token = jwtUtil.generateToken(user.getId());
-                log.info("老用户登录,userId: {}, token已生成", user.getId());
-            }
-
+            // 只返回微信用户信息,不做注册检查
             return WxH5UserInfoVO.builder()
                     .openid(openid)
                     .unionid(unionid)
@@ -153,8 +140,6 @@ public class H5AuthServiceImpl implements H5AuthService {
                     .country(country)
                     .province(province)
                     .city(city)
-                    .isRegistered(isRegistered)
-                    .token(token)
                     .build();
 
         } catch (Exception e) {
@@ -163,33 +148,46 @@ public class H5AuthServiceImpl implements H5AuthService {
         }
     }
 
+    @Override
+    public boolean checkUserRegistered(String openid) {
+        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(User::getOpenid, openid);
+        User user = userMapper.selectOne(wrapper);
+        return user != null;
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public LoginVO phoneLogin(H5PhoneLoginDTO dto) throws Exception {
         try {
-            log.info("手机号登录,openid: {}, phone: {}", dto.getOpenid(), dto.getPhone());
+            log.info("手机号登录/注册,openid: {}, phone: {}", dto.getOpenid(), dto.getPhone());
 
-            // 直接使用用户输入的手机号,不需要验证码验证
+            // 验证手机号
             String phone = dto.getPhone();
 
             if (StrUtil.isBlank(phone)) {
                 throw new RuntimeException("手机号不能为空");
             }
 
-            // 简单的手机号格式验证
+            // 手机号格式验证
             if (!phone.matches("^1[3-9]\\d{9}$")) {
                 throw new RuntimeException("手机号格式不正确");
             }
 
             log.info("使用手机号: {}", phone);
 
-            // 2. 查询用户是否存在
+            // 验证密码不能为空
+            if (StrUtil.isBlank(dto.getPassword())) {
+                throw new RuntimeException("密码不能为空");
+            }
+
+            // 根据openid查询用户
             LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
-            wrapper.eq(User::getPhone, phone);
+            wrapper.eq(User::getOpenid, dto.getOpenid());
             User user = userMapper.selectOne(wrapper);
 
             if (user == null) {
-                // 新用户,创建账号
+                // 新用户注册
                 if (StrUtil.isBlank(dto.getNickname())) {
                     throw new RuntimeException("昵称不能为空");
                 }
@@ -198,6 +196,7 @@ public class H5AuthServiceImpl implements H5AuthService {
                         .openid(dto.getOpenid())
                         .unionid(dto.getUnionid())
                         .phone(phone)
+                        .password(dto.getPassword())
                         .nickname(dto.getNickname())
                         .avatar(dto.getAvatarUrl())
                         .status(0)
@@ -208,26 +207,16 @@ public class H5AuthServiceImpl implements H5AuthService {
                 userMapper.insert(user);
                 log.info("创建新用户成功,userId: {}, phone: {}", user.getId(), phone);
             } else {
-                // 老用户,更新openid和unionid
-                boolean needUpdate = false;
-
-                if (StrUtil.isBlank(user.getOpenid())) {
-                    user.setOpenid(dto.getOpenid());
-                    needUpdate = true;
+                // 老用户登录,验证手机号和密码
+                if (!phone.equals(user.getPhone())) {
+                    throw new RuntimeException("手机号不正确");
                 }
 
-                if (StrUtil.isNotBlank(dto.getUnionid()) && StrUtil.isBlank(user.getUnionid())) {
-                    user.setUnionid(dto.getUnionid());
-                    needUpdate = true;
+                if (!dto.getPassword().equals(user.getPassword())) {
+                    throw new RuntimeException("密码不正确");
                 }
 
-                if (needUpdate) {
-                    user.setUpdateTime(LocalDateTime.now());
-                    userMapper.updateById(user);
-                    log.info("更新用户微信信息,userId: {}", user.getId());
-                }
-
-                log.info("老用户登录,userId: {}", user.getId());
+                log.info("老用户登录成功,userId: {}", user.getId());
             }
 
             // 3. 生成token
@@ -242,10 +231,4 @@ public class H5AuthServiceImpl implements H5AuthService {
             throw new Exception("登录失败: " + e.getMessage());
         }
     }
-
-    @Override
-    public void sendSmsCode(String phone) throws Exception {
-        // 不再需要短信验证码功能,使用微信手机号快速验证
-        throw new UnsupportedOperationException("请使用微信手机号快速验证");
-    }
 }

+ 3 - 2
src/main/resources/ry_vue_5.x.sql

@@ -11,7 +11,7 @@
  Target Server Version : 80042 (8.0.42)
  File Encoding         : 65001
 
- Date: 10/02/2026 16:34:06
+ Date: 11/02/2026 14:09:30
 */
 
 SET NAMES utf8mb4;
@@ -6595,6 +6595,7 @@ CREATE TABLE `user`  (
   `openid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '微信openid',
   `unionid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '微信unionid',
   `phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '手机号',
+  `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '登录密码',
   `nickname` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '用户昵称',
   `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '用户头像URL',
   `status` tinyint NULL DEFAULT 0 COMMENT '用户状态:0-正常,1-禁用,2-管理员',
@@ -6609,7 +6610,7 @@ CREATE TABLE `user`  (
 -- ----------------------------
 -- Records of user
 -- ----------------------------
-INSERT INTO `user` VALUES (24, 'oONNV1-H7vUTHM0m1B3hIG4TBqAY', NULL, '18871601502', 'Gin.', '/uploads/2026/02/02/332d0cc5-8ac0-41d9-90c7-cec94f4f781a.jpeg', 2, '2026-02-02 09:23:06', '2026-02-02 19:38:50');
+INSERT INTO `user` VALUES (24, 'oONNV1-H7vUTHM0m1B3hIG4TBqAY', NULL, '18871601502', NULL, 'Gin.', '/uploads/2026/02/02/332d0cc5-8ac0-41d9-90c7-cec94f4f781a.jpeg', 2, '2026-02-02 09:23:06', '2026-02-02 19:38:50');
 
 -- ----------------------------
 -- Table structure for user_feedback