Ver Fonte

金牛:app登录接口选择登录账号

dengweize há 1 semana atrás
pai
commit
3911942859

+ 25 - 0
fs-service/src/main/java/com/fs/common/VerifyCodeUtil.java

@@ -0,0 +1,25 @@
+package com.fs.common;
+
+import java.security.SecureRandom;
+
+public class VerifyCodeUtil {
+
+    // 使用 SecureRandom 保证安全性
+    private static final SecureRandom random = new SecureRandom();
+
+    /**
+     * 生成随机 6 位数字验证码
+     * @return 六位验证码字符串
+     */
+    public static String generateCode() {
+        int code = 100000 + random.nextInt(900000); // 保证是六位数,范围 100000-999999
+        return String.valueOf(code);
+    }
+
+    public static void main(String[] args) {
+        // 测试
+        for (int i = 0; i < 5; i++) {
+            System.out.println(VerifyCodeUtil.generateCode());
+        }
+    }
+}

+ 2 - 0
fs-service/src/main/java/com/fs/common/service/ISmsService.java

@@ -21,4 +21,6 @@ public interface ISmsService
     R sendOrderMsg(SmsSendUserParam param);
 
     R sendPackageOrderMsg(SmsSendUserParam param);
+
+    R sendCaptcha(String phone, String captcha, String code);
 }

+ 82 - 0
fs-service/src/main/java/com/fs/common/service/impl/SmsServiceImpl.java

@@ -36,6 +36,7 @@ import com.fs.system.domain.SysConfig;
 import com.fs.system.mapper.SysConfigMapper;
 import com.google.gson.Gson;
 import lombok.Synchronized;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
@@ -48,6 +49,7 @@ import java.util.Date;
 import java.util.List;
 
 @Service
+@Slf4j
 public class SmsServiceImpl implements ISmsService
 {
     @Autowired
@@ -527,6 +529,86 @@ public class SmsServiceImpl implements ISmsService
         }
     }
 
+    @Override
+    public R sendCaptcha(String phone, String captcha, String code) {
+        log.info(captcha);
+        CompanySmsTemp temp = smsTempService.selectCompanySmsTempByCode(code);
+        if (temp == null) {
+            return R.error("没有模板");
+        }
+        String content = temp.getContent();
+        if (StringUtils.isNotEmpty(captcha)) {
+            content = content.replace("${sms.captcha}", captcha);
+        }
+        String urls = null;
+        SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey("his.sms");
+        FsSmsConfig sms = JSON.parseObject(sysConfig.getConfigValue(), FsSmsConfig.class);
+        if (sms.getType().equals("rf")) {
+            try {
+                content = content.replace("${sms.sign}",sms.getRfSign());
+                urls = sms.getRfUrl1() + "sms?action=send&account=" + sms.getRfAccount1() + "&password=" + sms.getRfPassword1() + "&mobile=" + phone + "&content=" + URLEncoder.encode(content, "UTF-8") + "&extno=" + sms.getRfCode1() + "&rt=json";
+            } catch (UnsupportedEncodingException e) {
+                e.printStackTrace();
+            }
+            String post = HttpRequest.get(urls)
+                    .execute().body();
+            SmsSendVO vo = JSONUtil.toBean(post, SmsSendVO.class);
+            if (vo.getStatus().equals(0)) {
+                for (SmsSendItemVO itemVO : vo.getList()) {
+                    if (itemVO.getResult().equals("0")) {
+                        CompanySmsLogs logs = new CompanySmsLogs();
+                        logs.setContent(content);
+                        logs.setTempCode(temp.getTempCode());
+                        logs.setTempId(temp.getTempId());
+                        logs.setPhone(phone);
+                        logs.setSendTime(new Date());
+                        logs.setStatus(0);
+                        logs.setType(sms.getType());
+                        logs.setMid(itemVO.getMid());
+                        Integer counts = logs.getContent().length() / 67;
+                        if (logs.getContent().length() % 67 > 0) {
+                            counts = counts + 1;
+                        }
+                        if (counts == 0) {
+                            counts = 1;
+                        }
+                        logs.setNumber(counts);
+                        smsLogsService.insertCompanySmsLogs(logs);
+                    }
+                }
+            }
+        } else if (sms.getType().equals("dh")) {
+            SendSmsReturn sendSmsReturn = null;
+            content = content.replace("${sms.sign}",sms.getDhSign());
+            sendSmsReturn = smsTService.sendSms(sms.getDhAccount1(), sms.getDhPassword1(), content, phone);
+            if (sendSmsReturn != null) {
+                if (sendSmsReturn.getResult() != null && sendSmsReturn.getResult().equals("0")) {
+                    CompanySmsLogs logs = new CompanySmsLogs();
+                    logs.setContent(content);
+                    logs.setTempCode(temp.getTempCode());
+                    logs.setTempId(temp.getTempId());
+                    logs.setPhone(phone);
+                    logs.setSendTime(new Date());
+                    logs.setStatus(0);
+                    logs.setType(sms.getType());
+                    logs.setMid(sendSmsReturn.getMsgid());
+                    Integer counts = logs.getContent().length() / 67;
+                    if (logs.getContent().length() % 67 > 0) {
+                        counts = counts + 1;
+                    }
+                    if (counts == 0) {
+                        counts = 1;
+                    }
+                    logs.setNumber(counts);
+                    smsLogsService.insertCompanySmsLogs(logs);
+                }
+            }
+        }
+
+
+        return R.ok();
+    }
+
 
     @Override
     @Synchronized

+ 4 - 0
fs-service/src/main/java/com/fs/his/mapper/FsUserMapper.java

@@ -33,6 +33,8 @@ import org.apache.ibatis.annotations.*;
  */
 public interface FsUserMapper
 {
+    @Select("select * from fs_user where phone=#{phone}")
+    List<FsUser> selectFsUsersByPhoneLimitOne(String phone);
     /**
      * 查询用户
      *
@@ -465,4 +467,6 @@ public interface FsUserMapper
      */
     @Update("update fs_user set order_count = order_count + 1, total_amount = IFNULL(total_amount, 0) + #{amount} where user_id = #{userId}")
     void updateUserOrderCountAndAmount(@Param("userId") Long userId, @Param("amount") BigDecimal amount);
+
+    List<FsUser> selectFsUserListByPhone(String phone);
 }

+ 2 - 0
fs-service/src/main/java/com/fs/his/service/IFsUserService.java

@@ -228,4 +228,6 @@ public interface IFsUserService
     void increaseIntegral(List<Long> longs, Long integral);
 
     HisFsUserVO getHisUserIntegralWithLogs(FsUser fsUser);
+
+    List<FsUser> selectFsUserListByPhone(String phone);
 }

+ 5 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java

@@ -1561,4 +1561,9 @@ public class FsUserServiceImpl implements IFsUserService {
         return new HisFsUserVO();
     }
 
+    @Override
+    public List<FsUser> selectFsUserListByPhone(String phone) {
+        return fsUserMapper.selectFsUserListByPhone(phone);
+    }
+
 }

+ 20 - 0
fs-service/src/main/java/com/fs/his/utils/PhoneUtil.java

@@ -77,4 +77,24 @@ public class PhoneUtil {
 
         return text;
     }
+    /**
+     * 用于查询 使用老的数据加密
+     * @param text
+     * @return
+     */
+    private static String OLD_KEY = "2c8d1a7f4e9b3c6ae6d5c4b3a291f8c9";
+    public static String encryptPhoneOldKey(String text) {
+        String encryptedText=null;
+        try {
+            SecretKeySpec secretKey = new SecretKeySpec(OLD_KEY.getBytes(), "AES");
+            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
+            // Encryption
+            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
+            byte[] encryptedBytes = cipher.doFinal(text.getBytes());
+            encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return encryptedText;
+    }
 }

+ 3 - 0
fs-service/src/main/resources/mapper/his/FsUserMapper.xml

@@ -2409,6 +2409,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             AND log.create_time &lt;= #{endTime}
         </if>
     </select>
+    <select id="selectFsUserListByPhone" resultType="com.fs.his.domain.FsUser">
+        select * from fs_user where phone=#{phone}
+    </select>
 
 
 </mapper>

+ 144 - 22
fs-user-app/src/main/java/com/fs/app/controller/AppLoginController.java

@@ -1,13 +1,16 @@
 package com.fs.app.controller;
 
 
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateTime;
 import com.fs.app.annotation.Login;
 import com.fs.app.param.*;
 import com.fs.app.utils.WxUtil;
+import com.fs.common.VerifyCodeUtil;
 import com.fs.common.annotation.RepeatSubmit;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.common.service.ISmsService;
 import com.fs.common.utils.sign.Md5Utils;
 import com.fs.core.config.WxOpenProperties;
 import com.fs.his.config.FsSysConfig;
@@ -35,13 +38,11 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import java.time.LocalDateTime;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 
 import static com.fs.his.utils.PhoneUtil.encryptPhone;
+import static com.fs.his.utils.PhoneUtil.encryptPhoneOldKey;
 
 @Api("app登录接口")
 @RestController
@@ -60,6 +61,9 @@ public class AppLoginController extends AppBaseController{
 
     @Autowired
     private RedisCache redisCache;
+
+    @Autowired
+    private ISmsService smsService;
     @ApiOperation("注册app用户")
     @PostMapping("/register")
     @RepeatSubmit
@@ -293,44 +297,142 @@ public class AppLoginController extends AppBaseController{
         return R.ok(map);
     }
 
+//    private R handleLoginType1(FsUserLoginParam param) {
+//        if (StringUtils.isEmpty(param.getPhone()) || StringUtils.isEmpty(param.getPassword())) {
+//            return R.error("账号或密码不能为空");
+//        }
+//
+//        FsUser user = findUserByPhone(param.getPhone());
+//
+//        // 校验用户是否存在及账号状态
+//        if (user == null) {
+//            return R.error("账号不存在,请先注册账号");
+//        } else if (user.getStatus() == 0) {
+//            return R.error("账号已停用");
+//        } else if (StringUtils.isEmpty(user.getPassword())) {
+//            return R.error("账号不存在,请先注册账号");
+//        }
+//
+//        if (StringUtils.isNotEmpty(param.getJpushId())) {
+//            updateExistingUserJpushId(user, param.getJpushId());
+//        }
+//
+//        if (!Md5Utils.hash(param.getPassword()).equals(user.getPassword())) {
+//            return R.error("密码不正确");
+//        }
+//
+//        return generateTokenAndReturn(user);
+//
+//    }
+
     private R handleLoginType1(FsUserLoginParam param) {
         if (StringUtils.isEmpty(param.getPhone()) || StringUtils.isEmpty(param.getPassword())) {
             return R.error("账号或密码不能为空");
         }
 
-        FsUser user = findUserByPhone(param.getPhone());
-
-        // 校验用户是否存在及账号状态
-        if (user == null) {
-            return R.error("账号不存在,请先注册账号");
-        } else if (user.getStatus() == 0) {
-            return R.error("账号已停用");
-        } else if (StringUtils.isEmpty(user.getPassword())) {
+        FsUser user = null;
+        List<FsUser> usersByPhone = findUsersByPhone(param.getPhone());
+        if (CollectionUtil.isEmpty(usersByPhone)){
             return R.error("账号不存在,请先注册账号");
         }
+        //当前手机号只绑定了单个微信,直接登录
+        if (usersByPhone.size()==1){
+            user = usersByPhone.get(0);
+            // 校验用户是否存在及账号状态
+            if (user == null) {
+                return R.error("账号不存在,请先注册账号");
+            } else if (user.getStatus() == 0&&StringUtils.isNotEmpty(param.getSource())&&!param.getSource().equals("iOS")) {
+                return R.error("账号已停用");
+            } else if (StringUtils.isEmpty(user.getPassword())) {
+                return R.error("账号不存在,请先注册账号");
+            }
 
-        if (StringUtils.isNotEmpty(param.getJpushId())) {
-            updateExistingUserJpushId(user, param.getJpushId());
-        }
+            if (StringUtils.isNotEmpty(param.getJpushId())) {
+                updateExistingUserJpushId(user, param.getJpushId());
+//                try {
+//                    //发送注册优惠券
+//                    fsUserCouponService.sendRegisterCoupon(user);
+//                } catch (Exception e) {
+//                    logger.error("发送注册优惠券失败:{}",e.getMessage());
+//                }
+            }
 
-        if (!Md5Utils.hash(param.getPassword()).equals(user.getPassword())) {
-            return R.error("密码不正确");
+            if (!Md5Utils.hash(param.getPassword()).equals(user.getPassword())) {
+                return R.error("密码不正确");
+            }
+            //登录成功以后写入达人表
+            //fsUserTalentService.addFsUserTalent(fsUser.getUserId());
+            return generateTokenAndReturn(user);
+        }else {
+            return R.ok().put("users",usersByPhone);
         }
 
-        return generateTokenAndReturn(user);
 
     }
 
+    private List<FsUser> findUsersByPhone(String phone) {
+        // 先根据加密手机号查询用户
+        String jiami = (encryptPhone(phone));
+        List<FsUser> fsUsers = userMapper.selectFsUsersByPhoneLimitOne(jiami);
+        if (CollectionUtil.isEmpty(fsUsers)) {
+            fsUsers = userMapper.selectFsUsersByPhoneLimitOne(encryptPhoneOldKey(phone));
+        }
+        // 如果没有找到用户,再根据手机号查询
+        if (CollectionUtil.isEmpty(fsUsers)) {
+            fsUsers = userMapper.selectFsUsersByPhoneLimitOne(phone);
+
+        }
+        return fsUsers;
+    }
+
+//    private R handleLoginType3(FsUserLoginParam param) {
+//        if (StringUtils.isEmpty(param.getPhone())) {
+//            return R.error("获取手机号失败");
+//        }
+//        // 根据手机号查询用户
+//        FsUser user = findUserByPhone(param.getPhone());
+//        if (user == null) {
+//            createNewUser(param);
+//            return R.ok().put("isNew",true).put("phone",encryptPhone(param.getPhone()));
+//        } else {
+//            if (user.getUnionId()==null){
+//                if (user.getPhone().length()<=11){
+//                    FsUser fsUser = new FsUser();
+//                    fsUser.setUserId(user.getUserId());
+//                    fsUser.setPhone(encryptPhone(param.getPhone()));
+//                    userMapper.updateFsUser(fsUser);
+//                    logger.info("zyp \n【手机加密】:{}",encryptPhone(param.getPhone()));
+//                }
+//                return R.ok().put("isNew",true).put("phone",encryptPhone(param.getPhone()));
+//            }
+//            if (StringUtils.isNotEmpty(param.getJpushId())) {
+//                updateExistingUserJpushId(user, param.getJpushId());
+//            }
+//        }
+//        return generateTokenAndReturn(user);
+//    }
+
     private R handleLoginType3(FsUserLoginParam param) {
         if (StringUtils.isEmpty(param.getPhone())) {
             return R.error("获取手机号失败");
         }
         // 根据手机号查询用户
-        FsUser user = findUserByPhone(param.getPhone());
-        if (user == null) {
-            createNewUser(param);
+        FsUser user = null;
+        List<FsUser> usersByPhone = findUsersByPhone(param.getPhone());
+        if (CollectionUtil.isEmpty(usersByPhone)){
+            FsUser newUser = createNewUser(param);
+            if (StringUtils.isNotEmpty(newUser.getJpushId())) {
+//                try {
+//                    //发送注册优惠券
+//                    fsUserCouponService.sendRegisterCoupon(newUser);
+//                } catch (Exception e) {
+//                    logger.error("发送注册优惠券失败:{}",e.getMessage());
+//                }
+            }
             return R.ok().put("isNew",true).put("phone",encryptPhone(param.getPhone()));
-        } else {
+        }
+        if (usersByPhone.size()==1){
+            user = usersByPhone.get(0);
             if (user.getUnionId()==null){
                 if (user.getPhone().length()<=11){
                     FsUser fsUser = new FsUser();
@@ -343,7 +445,27 @@ public class AppLoginController extends AppBaseController{
             }
             if (StringUtils.isNotEmpty(param.getJpushId())) {
                 updateExistingUserJpushId(user, param.getJpushId());
+//                try {
+//                    //发送注册优惠券
+//                    fsUserCouponService.sendRegisterCoupon(user);
+//                } catch (Exception e) {
+//                    logger.error("发送注册优惠券失败:{}",e.getMessage());
+//                }
             }
+        }else {
+            return R.ok().put("users",usersByPhone);
+        }
+        return generateTokenAndReturn(user);
+    }
+
+    @PostMapping("/loginByUserId")
+    public R loginByUserId(@RequestBody FsUserLoginByWeChatParam param){
+        FsUser user = userService.selectFsUserByUserId(param.getUserId());
+        if (user == null){
+            return R.error("用户不存在");
+        }
+        if (StringUtils.isNotEmpty(param.getJpushId())){
+            updateExistingUserJpushId(user, param.getJpushId());
         }
         return generateTokenAndReturn(user);
     }

+ 2 - 2
fs-user-app/src/main/java/com/fs/app/controller/UserController.java

@@ -201,7 +201,7 @@ public class UserController extends  AppBaseController {
     public R editUser(@RequestBody @Valid FsUserEditParam param, HttpServletRequest request){
         param.setUserId(Long.parseLong(getUserId()));
         log.info("【修改用户头像昵称】:{}",param);
-        if (param.getNickname().length()>50){
+        if (param.getNickName().length()>50){
             return R.error("请授权正确的昵称!");
         }
         if (StringUtils.isEmpty(param.getAvatar())){
@@ -211,7 +211,7 @@ public class UserController extends  AppBaseController {
         user.setUserId(Long.parseLong(getUserId()));
         user.setAvatar(param.getAvatar());
         // 前端传了nickname 和 nickName 但是只有nickName是正确的
-        user.setNickName(StringUtils.isNotEmpty(param.getNickName())?param.getNickName():param.getNickname());
+        user.setNickName(StringUtils.isNotEmpty(param.getNickName())?param.getNickName():param.getNickName());
         if (ObjectUtils.isNotEmpty(param.getIsWeixinAuth())){
             user.setIsWeixinAuth(param.getIsWeixinAuth());
         }

+ 21 - 21
fs-user-app/src/main/java/com/fs/app/param/FsUserEditParam.java

@@ -12,13 +12,13 @@ import java.io.Serializable;
 
 @JsonIgnoreProperties(ignoreUnknown = true)
 public class FsUserEditParam implements Serializable {
-    @NotNull(message = "用户昵称不能为空!")
-    @JsonAlias("nickname")
-    private String nickname;
+//    @NotNull(message = "用户昵称不能为空!")
+//    @JsonAlias("nickname")
+//    private String nickname;
 
     //    @NotBlank(message = "用户头像不能为空!")
     private String avatar;
-
+    @NotNull(message = "用户昵称不能为空!")
     @JsonAlias("nickName")
     private String nickName;
 
@@ -26,13 +26,13 @@ public class FsUserEditParam implements Serializable {
     private Integer isWeixinAuth;
 
 
-    public @NotNull(message = "用户昵称不能为空!") String getNickname() {
-        return nickname;
-    }
-
-    public void setNickname(@NotNull(message = "用户昵称不能为空!") String nickname) {
-        this.nickname = nickname;
-    }
+//    public @NotNull(message = "用户昵称不能为空!") String getNickname() {
+//        return nickname;
+//    }
+//
+//    public void setNickname(@NotNull(message = "用户昵称不能为空!") String nickname) {
+//        this.nickname = nickname;
+//    }
 
     public String getAvatar() {
         return avatar;
@@ -66,14 +66,14 @@ public class FsUserEditParam implements Serializable {
         this.isWeixinAuth = isWeixinAuth;
     }
 
-    @Override
-    public String toString() {
-        return "FsUserEditParam{" +
-                "nickname='" + nickname + '\'' +
-                ", avatar='" + avatar + '\'' +
-                ", nickName='" + nickName + '\'' +
-                ", userId=" + userId +
-                ", isWeixinAuth=" + isWeixinAuth +
-                '}';
-    }
+//    @Override
+//    public String toString() {
+//        return "FsUserEditParam{" +
+//                "nickname='" + nickname + '\'' +
+//                ", avatar='" + avatar + '\'' +
+//                ", nickName='" + nickName + '\'' +
+//                ", userId=" + userId +
+//                ", isWeixinAuth=" + isWeixinAuth +
+//                '}';
+//    }
 }

+ 1 - 0
fs-user-app/src/main/java/com/fs/app/param/FsUserLoginByWeChatParam.java

@@ -16,4 +16,5 @@ public class FsUserLoginByWeChatParam implements Serializable {
 
     private String source; //app来源
 
+    private Long userId;
 }