Переглянути джерело

[CODE]: 仓储小程序登录

maxianghua 4 роки тому
батько
коміт
adc9d535df

+ 9 - 0
ruoyi-admin/src/main/resources/application.yml

@@ -112,6 +112,15 @@ wechatProgram:
     # 获取用户信息
     sessionUrl: https://api.weixin.qq.com/sns/jscode2session
 
+  # 微信小程序相关配置
+warehouseWechatProgram:
+  # 微信小程序应用id
+  appId: wx114cb497cc0fb8de
+  # 微信小程序密钥
+  secret: b85591e050a7f38e71e4becbc79e0386
+  # 获取用户信息
+  sessionUrl: https://api.weixin.qq.com/sns/jscode2session
+
 # token配置
 token:
     # 令牌自定义标识

+ 5 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java

@@ -43,4 +43,9 @@ public class LoginBody {
      * 唯一标识
      */
     private String uuid = "";
+
+    /**
+     *  区分仓储(00)、车队
+     */
+    private String usertype;
 }

+ 95 - 43
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/WechatService.java

@@ -1,7 +1,7 @@
 package com.ruoyi.framework.web.service;
 
-import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONException;
+import com.alibaba.fastjson.JSONObject;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.core.domain.model.LoginBody;
@@ -11,7 +11,6 @@ import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.wechat.AESUtils;
 import com.ruoyi.common.utils.wechat.AccessTokenUtils;
 import com.ruoyi.system.service.impl.SysUserServiceImpl;
-import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import okhttp3.*;
 import org.apache.commons.codec.binary.Base64;
@@ -23,7 +22,6 @@ import org.springframework.stereotype.Component;
 import javax.annotation.Resource;
 import java.io.UnsupportedEncodingException;
 import java.security.InvalidAlgorithmParameterException;
-import java.util.Collection;
 import java.util.Objects;
 
 /**
@@ -61,57 +59,111 @@ public class WechatService {
      * @return 结果
      */
     public AjaxResult login(LoginBody loginBody) {
-        if (StringUtils.isNotEmpty(loginBody.getToken())) {
-            // 仅仅获取token
-            SysUser sysUser = sysUserService.selectUserByPhone(loginBody);
-            if (StringUtils.isNull(sysUser)) {
-                return AjaxResult.error("未找到用户信息,请确认");
+        if(loginBody.getUsertype().equals("00")){
+            if (StringUtils.isNotEmpty(loginBody.getToken())) {
+                // 仅仅获取token
+                SysUser sysUser = sysUserService.selectUserByPhone(loginBody,"00");
+                if (StringUtils.isNull(sysUser)) {
+                    return AjaxResult.error("未找到用户信息,请确认");
+                }
+                // 生成token
+                LoginUser loginUser = new LoginUser();
+                loginUser.setUser(sysUser);
+                String token = tokenService.wechatCreateToken(loginUser);
+                if (StringUtils.isEmpty(token)) {
+                    return AjaxResult.error("生成token失败");
+                }
+                LoginBody body = new LoginBody();
+                body.setToken(token);
+                body.setPhonenumber(sysUser.getPhonenumber());
+                return AjaxResult.success(body);
+            }
+            // 获取openId、sessionKey
+            SysUser user = sysUserService.weChatProgramLogin(loginBody,"00");
+            if (StringUtils.isNull(user)) {
+                return AjaxResult.error("获取OpenId失败");
+            }
+            // 解密获取手机号
+            try {
+                AjaxResult ajaxResult = decodeUserInfo(loginBody.getPhonenumber(), loginBody.getIv(), user.getSessionKey());
+                String code = ajaxResult.get("code").toString();
+                if ("500".equals(code)) {
+                    return ajaxResult;
+                }
+                user.setPhonenumber(ajaxResult.get("data").toString());
+            } catch (UnsupportedEncodingException e) {
+                log.info("解析手机号UnsupportedEncodingException异常:" + e);
+                e.printStackTrace();
+            } catch (InvalidAlgorithmParameterException e) {
+                log.info("解析手机号InvalidAlgorithmParameterException异常:" + e);
+                e.printStackTrace();
+            }
+            LoginUser loginUser = sysUserService.warehouseCreateOrUpdateUser(user);
+            if (StringUtils.isNull(loginUser)) {
+                return AjaxResult.error("未找到用户信息");
             }
             // 生成token
-            LoginUser loginUser = new LoginUser();
-            loginUser.setUser(sysUser);
             String token = tokenService.wechatCreateToken(loginUser);
             if (StringUtils.isEmpty(token)) {
                 return AjaxResult.error("生成token失败");
             }
             LoginBody body = new LoginBody();
             body.setToken(token);
-            body.setPhonenumber(sysUser.getPhonenumber());
+            body.setPhonenumber(user.getPhonenumber());
             return AjaxResult.success(body);
-        }
-        // 获取openId、sessionKey
-        SysUser user = sysUserService.weChatProgramLogin(loginBody);
-        if (StringUtils.isNull(user)) {
-            return AjaxResult.error("获取OpenId失败");
-        }
-        // 解密获取手机号
-        try {
-            AjaxResult ajaxResult = decodeUserInfo(loginBody.getPhonenumber(), loginBody.getIv(), user.getSessionKey());
-            String code = ajaxResult.get("code").toString();
-            if ("500".equals(code)) {
-                return ajaxResult;
+        }else{
+            if (StringUtils.isNotEmpty(loginBody.getToken())) {
+                // 仅仅获取token
+                SysUser sysUser = sysUserService.selectUserByPhone(loginBody,"11");
+                if (StringUtils.isNull(sysUser)) {
+                    return AjaxResult.error("未找到用户信息,请确认");
+                }
+                // 生成token
+                LoginUser loginUser = new LoginUser();
+                loginUser.setUser(sysUser);
+                String token = tokenService.wechatCreateToken(loginUser);
+                if (StringUtils.isEmpty(token)) {
+                    return AjaxResult.error("生成token失败");
+                }
+                LoginBody body = new LoginBody();
+                body.setToken(token);
+                body.setPhonenumber(sysUser.getPhonenumber());
+                return AjaxResult.success(body);
             }
-            user.setPhonenumber(ajaxResult.get("data").toString());
-        } catch (UnsupportedEncodingException e) {
-            log.info("解析手机号UnsupportedEncodingException异常:" + e);
-            e.printStackTrace();
-        } catch (InvalidAlgorithmParameterException e) {
-            log.info("解析手机号InvalidAlgorithmParameterException异常:" + e);
-            e.printStackTrace();
-        }
-        LoginUser loginUser = sysUserService.createOrUpdateUser(user);
-        if (StringUtils.isNull(loginUser)) {
-            return AjaxResult.error("未找到用户信息");
-        }
-        // 生成token
-        String token = tokenService.wechatCreateToken(loginUser);
-        if (StringUtils.isEmpty(token)) {
-            return AjaxResult.error("生成token失败");
+            // 获取openId、sessionKey
+            SysUser user = sysUserService.weChatProgramLogin(loginBody,"11");
+            if (StringUtils.isNull(user)) {
+                return AjaxResult.error("获取OpenId失败");
+            }
+            // 解密获取手机号
+            try {
+                AjaxResult ajaxResult = decodeUserInfo(loginBody.getPhonenumber(), loginBody.getIv(), user.getSessionKey());
+                String code = ajaxResult.get("code").toString();
+                if ("500".equals(code)) {
+                    return ajaxResult;
+                }
+                user.setPhonenumber(ajaxResult.get("data").toString());
+            } catch (UnsupportedEncodingException e) {
+                log.info("解析手机号UnsupportedEncodingException异常:" + e);
+                e.printStackTrace();
+            } catch (InvalidAlgorithmParameterException e) {
+                log.info("解析手机号InvalidAlgorithmParameterException异常:" + e);
+                e.printStackTrace();
+            }
+            LoginUser loginUser = sysUserService.createOrUpdateUser(user);
+            if (StringUtils.isNull(loginUser)) {
+                return AjaxResult.error("未找到用户信息");
+            }
+            // 生成token
+            String token = tokenService.wechatCreateToken(loginUser);
+            if (StringUtils.isEmpty(token)) {
+                return AjaxResult.error("生成token失败");
+            }
+            LoginBody body = new LoginBody();
+            body.setToken(token);
+            body.setPhonenumber(user.getPhonenumber());
+            return AjaxResult.success(body);
         }
-        LoginBody body = new LoginBody();
-        body.setToken(token);
-        body.setPhonenumber(user.getPhonenumber());
-        return AjaxResult.success(body);
     }
 
 

+ 10 - 3
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java

@@ -1,9 +1,9 @@
 package com.ruoyi.system.mapper;
 
-import java.util.List;
-
-import org.apache.ibatis.annotations.Param;
 import com.ruoyi.common.core.domain.entity.SysUser;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * 用户表 数据层
@@ -143,4 +143,11 @@ public interface SysUserMapper {
      * @return  结果
      */
     public int updateCarsDriverNamePhone(Long userId);
+
+    /**
+     *  微信小程序根据手机号查询手机号是否存在
+     * @param phonenumber   手机号
+     * @return  结果
+     */
+    SysUser warehouseSelectUserByTel(String phonenumber);
 }

+ 124 - 44
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java

@@ -1,40 +1,36 @@
 package com.ruoyi.system.service.impl;
 
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
-import com.ruoyi.common.core.domain.model.LoginBody;
-import com.ruoyi.common.core.domain.model.LoginUser;
-import okhttp3.OkHttpClient;
-import okhttp3.Request;
-import okhttp3.Response;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 import com.ruoyi.common.annotation.DataScope;
 import com.ruoyi.common.constant.UserConstants;
 import com.ruoyi.common.core.domain.entity.SysRole;
 import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.model.LoginBody;
+import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.exception.CustomException;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.system.domain.SysPost;
 import com.ruoyi.system.domain.SysUserPost;
 import com.ruoyi.system.domain.SysUserRole;
-import com.ruoyi.system.mapper.SysPostMapper;
-import com.ruoyi.system.mapper.SysRoleMapper;
-import com.ruoyi.system.mapper.SysUserMapper;
-import com.ruoyi.system.mapper.SysUserPostMapper;
-import com.ruoyi.system.mapper.SysUserRoleMapper;
+import com.ruoyi.system.mapper.*;
 import com.ruoyi.system.service.ISysConfigService;
 import com.ruoyi.system.service.ISysUserService;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
 
 /**
  * 用户 业务层处理
@@ -76,6 +72,19 @@ public class SysUserServiceImpl implements ISysUserService {
     @Value("${wechatProgram.sessionUrl}")
     private String sessionUrl;
 
+
+    // 仓储微信小程序应用id
+    @Value("${warehouseWechatProgram.appId}")
+    private String warehouseAppId;
+
+    // 仓储微信小程序应用密钥
+    @Value("${warehouseWechatProgram.secret}")
+    private String warehouseSecret;
+
+    // 仓储微信小程序获取用户session路径
+    @Value("${warehouseWechatProgram.sessionUrl}")
+    private String warehouseSessionUrl;
+
     /**
      * 根据条件分页查询用户列表
      *
@@ -437,32 +446,58 @@ public class SysUserServiceImpl implements ISysUserService {
      * @return 结果
      */
     @Transactional
-    public SysUser weChatProgramLogin(LoginBody loginBody) {
+    public SysUser weChatProgramLogin(LoginBody loginBody,String usertype) {
         //声明客户端
         OkHttpClient client = new OkHttpClient();
         //构建Request
-        Request request = new Request.Builder().url(sessionUrl + "?appid=" + appId + "&secret=" + secret +
-                "&js_code=" + loginBody.getCode() + "&grant_type=authorization_code").build();
-        try {
-            Response response = client.newCall(request).execute();
-            //如果请求成功,解析数据
-            if (response.isSuccessful()) {
-                String body = response.body().string();
-                //得到一个JSON对象
-                JSONObject object = JSON.parseObject(body);
-                String openid = object.getString("openid");
-                String sessionKey = object.getString("session_key");
-                if (StringUtils.isNotEmpty(openid)) {
-                    log.info("通过code获取用户openId异常:" + object.toJSONString());
-                    SysUser sysUser = new SysUser();
-                    sysUser.setOpenId(openid);
-                    sysUser.setSessionKey(sessionKey);
-                    return sysUser;
+        if(usertype.equals("00")){
+            Request request = new Request.Builder().url(warehouseSessionUrl + "?appid=" + warehouseAppId + "&secret=" + warehouseSecret +
+                    "&js_code=" + loginBody.getCode() + "&grant_type=authorization_code").build();
+            try {
+                Response response = client.newCall(request).execute();
+                //如果请求成功,解析数据
+                if (response.isSuccessful()) {
+                    String body = response.body().string();
+                    //得到一个JSON对象
+                    JSONObject object = JSON.parseObject(body);
+                    String openid = object.getString("openid");
+                    String sessionKey = object.getString("session_key");
+                    if (StringUtils.isNotEmpty(openid)) {
+                        log.info("通过code获取用户openId异常:" + object.toJSONString());
+                        SysUser sysUser = new SysUser();
+                        sysUser.setOpenId(openid);
+                        sysUser.setSessionKey(sessionKey);
+                        return sysUser;
+                    }
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+                log.info("用户获取openId异常:" + e);
+            }
+        }else{
+            Request request = new Request.Builder().url(sessionUrl + "?appid=" + appId + "&secret=" + secret +
+                    "&js_code=" + loginBody.getCode() + "&grant_type=authorization_code").build();
+            try {
+                Response response = client.newCall(request).execute();
+                //如果请求成功,解析数据
+                if (response.isSuccessful()) {
+                    String body = response.body().string();
+                    //得到一个JSON对象
+                    JSONObject object = JSON.parseObject(body);
+                    String openid = object.getString("openid");
+                    String sessionKey = object.getString("session_key");
+                    if (StringUtils.isNotEmpty(openid)) {
+                        log.info("通过code获取用户openId异常:" + object.toJSONString());
+                        SysUser sysUser = new SysUser();
+                        sysUser.setOpenId(openid);
+                        sysUser.setSessionKey(sessionKey);
+                        return sysUser;
+                    }
                 }
+            } catch (IOException e) {
+                e.printStackTrace();
+                log.info("用户获取openId异常:" + e);
             }
-        } catch (IOException e) {
-            e.printStackTrace();
-            log.info("用户获取openId异常:" + e);
         }
         return null;
     }
@@ -547,7 +582,52 @@ public class SysUserServiceImpl implements ISysUserService {
      * @param loginBody 参数
      * @return  结果
      */
-    public SysUser selectUserByPhone(LoginBody loginBody) {
-        return userMapper.selectUserByTel(loginBody.getPhonenumber());
+    public SysUser selectUserByPhone(LoginBody loginBody ,String usertype) {
+        if(usertype.equals("00")){
+            return userMapper.warehouseSelectUserByTel(loginBody.getPhonenumber());
+        }else {
+            return userMapper.selectUserByTel(loginBody.getPhonenumber());
+        }
+
+    }
+
+    // 获取用户手机号更新对应信息
+    @Transactional
+    public LoginUser warehouseCreateOrUpdateUser(SysUser user) {
+        LoginUser loginUser = new LoginUser();
+        // 判断是否提前存储过
+        SysUser sysUser = userMapper.selectUserByopenId(user.getOpenId());
+        boolean related = false;
+        if (StringUtils.isNotNull(sysUser)) {
+            if ("1".equals(user.getStatus()) && "2".equals(user.getDelFlag())) {
+                // 提前关注公众号的信息
+                userMapper.deleteUserById(user.getUserId());
+                related = true;
+            }
+        }
+        // 判断是否创建了驾驶员
+        SysUser pUser = userMapper.warehouseSelectUserByTel(user.getPhonenumber());
+        if (StringUtils.isNotNull(pUser)) {
+            // 创建过
+            pUser.setOpenId(user.getOpenId());
+            if (related) {
+                pUser.setRelatedNo("T");
+            }
+            pUser.setSessionKey(user.getSessionKey());
+            userMapper.updateUser(pUser);
+            loginUser.setUser(pUser);
+        } else {
+            // 没有创建 则创建临时性用户数据
+            user.setNickName(" ");
+            user.setUserName(user.getPhonenumber());
+            user.setStatus("1");
+            user.setStatus("1");
+            user.setDelFlag("2");
+            user.setUserType("00");
+            user.setCreateTime(new Date());
+            userMapper.insertUser(user);
+            loginUser.setUser(user);
+        }
+        return loginUser;
     }
 }

+ 3 - 0
ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -128,6 +128,9 @@
 	<select id="checkEmailUnique" parameterType="String" resultMap="SysUserResult">
 		select user_id, email from sys_user where email = #{email} limit 1
 	</select>
+	<select id="warehouseSelectUserByTel" resultType="com.ruoyi.common.core.domain.entity.SysUser">
+		SELECT user_id, user_name, nick_name, user_type, phonenumber, open_id, session_key, del_flag FROM sys_user WHERE phonenumber = #{phonenumber} and user_type = '00'
+	</select>
 
 	<insert id="insertUser" parameterType="SysUser" useGeneratedKeys="true" keyProperty="userId">
 		insert into sys_user(