瀏覽代碼

小程序登录

黄远 5 年之前
父節點
當前提交
13000966fe

+ 1 - 1
lift-common/src/main/java/cn.com.ty.lift.common/constants/ApiConstants.java

@@ -247,7 +247,7 @@ public class ApiConstants {
     }
 
     /**
-     * 常见问题常量
+     * 全局设置常量
      */
     public interface GlobalSetConstants {
         /**

+ 0 - 40
lift-system-service/src/main/java/cn/com/ty/lift/system/user/controller/AppletLoginController.java

@@ -1,40 +0,0 @@
-package cn.com.ty.lift.system.user.controller;
-
-import cn.com.ty.lift.system.user.dao.entity.model.AppletLoginRequest;
-import cn.com.xwy.boot.web.dto.RestResponse;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-/**
- * @author huangyuan
- * @date 2020/2/3
- * @description 小程序登陆
- */
-@RestController
-@RequestMapping("/applet")
-public class AppletLoginController {
-
-    /**
-     * @param
-     * @return
-     * @description 小程序登陆
-     * @date 2020/2/3 9:21 上午
-     */
-    @RequestMapping("/login")
-    public RestResponse login(AppletLoginRequest appletLoginRequest) {
-        return RestResponse.success();
-    }
-
-
-    /**
-     * @param
-     * @return
-     * @description 绑定手机号
-     * @date 2020/2/3 9:28 上午
-     */
-    @RequestMapping("/bindingMobile")
-    public RestResponse bindingMobile(AppletLoginRequest appletLoginRequest) {
-        return RestResponse.success();
-    }
-
-}

+ 35 - 5
lift-system-service/src/main/java/cn/com/ty/lift/system/user/controller/LoginController.java

@@ -6,9 +6,11 @@ import cn.com.ty.lift.common.constants.ApiConstants;
 import cn.com.ty.lift.common.utils.DateUtils;
 import cn.com.ty.lift.system.user.dao.entity.UserAccount;
 import cn.com.ty.lift.system.user.dao.entity.model.UserRequest;
+import cn.com.ty.lift.system.user.dao.entity.model.UserResponse;
 import cn.com.ty.lift.system.user.service.ILoginService;
 import cn.com.ty.lift.system.user.service.IUserAccountService;
 import cn.com.ty.lift.system.utils.RandomValidateCodeUtil;
+import cn.com.ty.lift.system.wechat.constants.WxConstants;
 import cn.com.ty.lift.system.wechat.utils.WxUtil;
 import cn.com.xwy.boot.web.dto.RestResponse;
 import org.apache.commons.lang3.StringUtils;
@@ -63,7 +65,7 @@ public class LoginController {
     @PostMapping("/wxRegister")
     @ResponseBody
     public RestResponse wxRegister(HttpServletRequest request, @RequestBody UserRequest userRequest) {
-        RestResponse restResponse = judgeAuthCode(userRequest);
+        RestResponse restResponse = judgeAuthCode(userRequest, WxConstants.APP_LOGIN);
         if (restResponse == null) {
             //校验通过走正常注册流程
             return loginService.register(request, userRequest);
@@ -105,7 +107,7 @@ public class LoginController {
     @RequestMapping("/wxLogin")
     @ResponseBody
     public RestResponse wxLogin(HttpServletRequest request, @RequestBody UserRequest userRequest) {
-        RestResponse restResponse = judgeAuthCode(userRequest);
+        RestResponse restResponse = judgeAuthCode(userRequest, WxConstants.APP_LOGIN);
         if (restResponse == null) {
             //校验通过 用户微信登录
             return loginService.wxLogin(request, userRequest);
@@ -113,6 +115,30 @@ public class LoginController {
         return restResponse;
     }
 
+    /**
+     * @param request 请求数据
+     * @param userRequest 授权码
+     * @return 登录信息
+     * @description
+     * @date 2020/4/27 10:07 上午
+     */
+    @RequestMapping("/appletLogin")
+    @ResponseBody
+    public RestResponse appletLogin(HttpServletRequest request, @RequestBody UserRequest userRequest) {
+        RestResponse restResponse = judgeAuthCode(userRequest, WxConstants.APPLET_LOGIN);
+        if (restResponse == null) {
+            //校验通过 登录小程序
+            return loginService.appletLogin(request, userRequest);
+        }
+        return restResponse;
+    }
+
+    @RequestMapping("/bindMobile")
+    @ResponseBody
+    public RestResponse bindMobile(HttpServletRequest request, @RequestBody UserRequest userRequest){
+        return loginService.bindMobile(request, userRequest);
+    }
+
     /**
      * @param response http相应类
      * @param request  http请求类
@@ -248,13 +274,17 @@ public class LoginController {
      * @description 微信授权码校验
      * @date 2019-12-30 15:40
      */
-    private RestResponse judgeAuthCode(UserRequest userRequest) {
+    private RestResponse judgeAuthCode(UserRequest userRequest, String loginStyle) {
+        String authCode = userRequest.getAuthCode();
         //判断授权码
-        if (StringUtils.isBlank(userRequest.getAuthCode())) {
+        if (StringUtils.isBlank(authCode)) {
             return RestResponse.fail(ApiConstants.RESULT_ERROR, "授权码为空无法进行操作");
         }
         //通过授权码获取用户openId
-        String openId = WxUtil.getOpenIdByAuthCode(userRequest.getAuthCode());
+        String openId = WxUtil.getAppOpenIdByAuthCode(authCode);
+        if (WxConstants.APPLET_LOGIN.equals(loginStyle)) {
+            openId = WxUtil.getAppletOpenIdByAuthCode(authCode);
+        }
         if (StringUtils.isBlank(openId)) {
             return RestResponse.fail(ApiConstants.RESULT_ERROR, "授权码无效无法进行操作");
         }

+ 2 - 0
lift-system-service/src/main/java/cn/com/ty/lift/system/user/dao/entity/UserAccount.java

@@ -29,6 +29,8 @@ public class UserAccount {
 
 	private String wechatOpenId;
 
+	private String appletOpenId;
+
 	private String email;
 
 	private String otherAccount;

+ 17 - 1
lift-system-service/src/main/java/cn/com/ty/lift/system/user/service/ILoginService.java

@@ -59,9 +59,25 @@ public interface ILoginService {
 
     /**
      * @param mobile 用户手机号
-     * @param token token
+     * @param token  token
      * @description 在redis中置空用户信息
      * @date 2020/4/22 6:46 下午
      */
     void blankingUserInfoIntoRedis(String mobile, String token);
+
+    /**
+     * @param request 请求数据
+     * @return userRequest 请求数据
+     * @description 小程序登录
+     * @date 2020/4/27 11:01 上午
+     */
+    RestResponse appletLogin(HttpServletRequest request, UserRequest userRequest);
+
+    /**
+     * @param request 绑定手机号
+     * @return 返回信息
+     * @description 绑定手机号
+     * @date 2020/4/27 2:39 下午
+     */
+    RestResponse bindMobile(HttpServletRequest request, UserRequest userRequest);
 }

+ 8 - 0
lift-system-service/src/main/java/cn/com/ty/lift/system/user/service/IRoleMenuService.java

@@ -1,8 +1,10 @@
 package cn.com.ty.lift.system.user.service;
 
 import cn.com.ty.lift.system.user.dao.entity.Menu;
+import cn.com.ty.lift.system.user.dao.entity.Role;
 import cn.com.ty.lift.system.user.dao.entity.RoleMenu;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.apache.ibatis.annotations.Select;
 
 import java.util.List;
 
@@ -35,4 +37,10 @@ public interface IRoleMenuService extends IService<RoleMenu> {
      * @date 2019-12-18 17:12
      */
     List<Menu> getMenuTree(Long roleId);
+
+    @Select("select r.id, r.code, r.name from role left join user_role ur " +
+            "on r.id = ur.role_id " +
+            "where ur.user_id = #{userId} " +
+            "and r.code = #{roleCode}")
+    List<Role> getRoleListByUserIdAndRoleCode(Long userId, String roleCode);
 }

+ 12 - 3
lift-system-service/src/main/java/cn/com/ty/lift/system/user/service/IRoleService.java

@@ -89,11 +89,20 @@ public interface IRoleService extends IService<Role> {
     RestResponse companyRoleList(RoleRequest roleRequest);
 
     /**
-     * @param defaultAssign 默认分配标识
-     * @param defaultRoleList 默认角色列表
-     * @param enterpriseAdminRole  企业管理员角色
+     * @param defaultAssign       默认分配标识
+     * @param defaultRoleList     默认角色列表
+     * @param enterpriseAdminRole 企业管理员角色
      * @description
      * @date 2020/4/26 1:26 下午
      */
     boolean assignDefaultMenu(int defaultAssign, List<Role> defaultRoleList, Role enterpriseAdminRole);
+
+    /**
+     * @param userId 用户id
+     *
+     * @return
+     * @description
+     * @date 2020/4/27 11:36 上午
+     */
+    List<Role> getRoleByUserIdAndRoleCode(Long userId, String roleCode);
 }

+ 7 - 0
lift-system-service/src/main/java/cn/com/ty/lift/system/user/service/IUserService.java

@@ -118,4 +118,11 @@ public interface IUserService {
      * @date 2020/4/16 2:50 下午
      */
     RestResponse modifyRemarks(UserRequest userRequest);
+
+    /**
+     * @param userId 用户id
+     * @description 小程序用户登录信息
+     * @date 2020/4/27 11:24 上午
+     */
+    UserResponse getAppletUserInfo(Long userId);
 }

+ 80 - 0
lift-system-service/src/main/java/cn/com/ty/lift/system/user/service/impl/LoginService.java

@@ -22,6 +22,7 @@ import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -204,6 +205,50 @@ public class LoginService implements ILoginService {
         return RestResponse.success(userResponse, ApiConstants.RESULT_SUCCESS, "用户登录成功");
     }
 
+    @Override
+    public RestResponse appletLogin(HttpServletRequest request, UserRequest userRequest) {
+        //通过授权码获取用户openId
+        String openId = userRequest.getAuthCode();
+        UserAccount userAccount = userAccountService.getOne(new QueryWrapper<UserAccount>()
+                .eq("applet_open_id", openId)
+        );
+        if (userAccount == null) {
+            return RestResponse.fail(ApiConstants.RESULT_ERROR, "用户尚未绑定用户信息");
+        }
+        userRequest.setMobile(userAccount.getMobile());
+        UserResponse userResponse = userService.getAppletUserInfo(userAccount.getUserId());
+        if (userResponse == null) {
+            return RestResponse.fail(ApiConstants.RESULT_ERROR, "访问权限不足");
+        }
+        request.getSession().setAttribute("openId", openId);
+        appletLoginHandle(request, userRequest, userAccount, userResponse);
+        return RestResponse.success(userResponse, ApiConstants.RESULT_SUCCESS, "登录成功");
+    }
+
+    @Override
+    public RestResponse bindMobile(HttpServletRequest request, UserRequest userRequest) {
+        if (StringUtils.isBlank(userRequest.getMobile())) {
+            return RestResponse.fail(ApiConstants.RESULT_ERROR, "手机号为空无法绑定");
+        }
+        RestResponse restResponse = verifySmsCode(userRequest.getMobile(), userRequest.getInputSmsCode());
+        if (restResponse != null) {
+            return restResponse;
+        }
+        UserAccount userAccount = userAccountService.getByMobile(userRequest.getMobile());
+        if (userAccount == null) {
+            return RestResponse.fail(ApiConstants.RESULT_ERROR, "用户信息为空无法登录");
+        }
+        //获取openId
+        String openId = (String) request.getSession().getAttribute("openId");
+        userAccount.setAppletOpenId(openId);
+        UserResponse userResponse = userService.getAppletUserInfo(userAccount.getUserId());
+        if (userResponse == null) {
+            return RestResponse.fail(ApiConstants.RESULT_ERROR, "访问权限不足");
+        }
+        appletLoginHandle(request, userRequest, userAccount, userResponse);
+        return RestResponse.success(userResponse, ApiConstants.RESULT_SUCCESS, "绑定成功");
+    }
+
     @Override
     public RestResponse verifySmsCode(String mobile, String inputSmsCode) {
         Object smsCode = redisTemplate.opsForValue().get(mobile + AliConstants.SmsConstants.SMS_CODE_FIELD);
@@ -236,6 +281,7 @@ public class LoginService implements ILoginService {
     private UserResponse initLoginInfo(HttpServletRequest request, UserRequest userRequest) {
         //获取用户信息
         UserResponse userResponse = userService.getLoginUserInfo(userRequest.getUserId());
+        userRequest.setMobile(userResponse.getMobile());
         //将当前用户id放入session中
         request.getSession().setAttribute(ApiConstants.CURRENT_USER_ID, userResponse.getUserId());
         //将当前公司id放入session中
@@ -380,4 +426,38 @@ public class LoginService implements ILoginService {
     private String getUserInfoKeyInRedis(UserRequest userRequest) {
         return userRequest.getMobile() + ApiConstants.UserConstants.USER_INFO_MOBILE + userRequest.getMobileType();
     }
+
+    /**
+     * @description 小程序登录成功后处理
+     * @date 2020/4/27 3:10 下午
+     */
+    private void appletLoginHandle(HttpServletRequest request, UserRequest userRequest,
+                                   UserAccount userAccount, UserResponse userResponse) {
+        //封装登录用户信息
+        Map<String, Object> currentUserInfoMap = getUserInfoMap(userResponse);
+        String mobileUserInfo = getUserInfoKeyInRedis(userRequest);
+        //将用户信息放入redis中
+        putUserInfoToRedis(userRequest, userResponse, currentUserInfoMap, mobileUserInfo);
+        setUserInfoToSession(request, userResponse);
+        //添加登录记录
+        userLoginService.saveLoginInfo(request, userAccount.getUserId());
+    }
+
+    /**
+     * @param request 请求
+     * @description 将用户信息放入session
+     * @date 2020/4/27 3:08 下午
+     */
+    private void setUserInfoToSession(HttpServletRequest request, UserResponse userResponse) {
+        //将用户信息放入session中
+        HttpSession session = request.getSession();
+        session.setAttribute(ApiConstants.CURRENT_USER_ID, userResponse.getUserId());
+        if (userResponse.getMaintenanceCompany() != null) {
+            session.setAttribute(ApiConstants.CURRENT_COMPANY_ID, userResponse.getMaintenanceCompany().getId());
+        }
+        if (userResponse.getRole() != null) {
+            session.setAttribute(ApiConstants.CURRENT_ROLE_ID, userResponse.getRole().getId());
+            session.setAttribute(ApiConstants.CURRENT_ROLE_CODE, userResponse.getRole().getCode());
+        }
+    }
 }

+ 11 - 3
lift-system-service/src/main/java/cn/com/ty/lift/system/user/service/impl/RoleService.java

@@ -13,6 +13,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
@@ -110,9 +111,11 @@ public class RoleService extends ServiceImpl<RoleMapper, Role> implements IRoleS
             }
         }
         //保存角色关联的新的菜单信息
-        if (!roleMenuService.saveRoleMenu(role.getId(), roleRequest.getMenuIds())) {
-            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-            return RestResponse.fail(ApiConstants.RESULT_ERROR, "保存新菜单失败");
+        if (StringUtils.isNotBlank(roleRequest.getMenuIds())) {
+            if (!roleMenuService.saveRoleMenu(role.getId(), roleRequest.getMenuIds())) {
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                return RestResponse.fail(ApiConstants.RESULT_ERROR, "保存新菜单失败");
+            }
         }
         return RestResponse.success(role, ApiConstants.RESULT_SUCCESS, "更新角色信息成功");
     }
@@ -236,4 +239,9 @@ public class RoleService extends ServiceImpl<RoleMapper, Role> implements IRoleS
         return roleMenuService.saveBatch(needSaveRoleMenuList);
     }
 
+    @Override
+    public List<Role> getRoleByUserIdAndRoleCode(Long userId, String roleCode) {
+        return roleMenuService.getRoleListByUserIdAndRoleCode(userId, roleCode);
+    }
+
 }

+ 40 - 13
lift-system-service/src/main/java/cn/com/ty/lift/system/user/service/impl/UserService.java

@@ -1,6 +1,7 @@
 package cn.com.ty.lift.system.user.service.impl;
 
 import cn.com.ty.lift.common.constants.ApiConstants;
+import cn.com.ty.lift.common.constants.CommonEnum;
 import cn.com.ty.lift.common.utils.ProjectUtils;
 import cn.com.ty.lift.system.settings.dao.entity.MaintenanceCompany;
 import cn.com.ty.lift.system.settings.service.IMaintenanceCompanyService;
@@ -185,19 +186,7 @@ public class UserService implements IUserService {
 
     @Override
     public UserResponse getLoginUserInfo(Long userId) {
-        UserResponse userResponse = new UserResponse();
-        userResponse.setUserId(userId);
-        //获取用户的基本信息
-        UserAccount userAccount = userAccountService.getByUserId(userId);
-        UserInfo userInfo = userInfoService.getByUserId(userId);
-        userResponse.setName(userInfo.getName());
-        userResponse.setMobile(userAccount.getMobile());
-        userResponse.setExpertFlag(userAccount.getExpertFlag());
-        userResponse.setBalance(userInfo.getBalance());
-        userResponse.setAvatarUrl(userInfo.getAvatarUrl());
-        userResponse.setType(userAccount.getType());
-        //生成前端的token值
-        userResponse.setToken(IdUtil.fastSimpleUUID());
+        UserResponse userResponse = getBaseUserInfo(userId);
         List<MtCompanyUser> mtCompanyUserList = mtCompanyUserService.list(new QueryWrapper<MtCompanyUser>()
                 .eq("user_id", userId)
                 .eq("status", ApiConstants.ApplicationConstants.APPLY_PASS)
@@ -405,4 +394,42 @@ public class UserService implements IUserService {
         return RestResponse.success(null, ApiConstants.RESULT_SUCCESS, "修改描述成功");
     }
 
+    @Override
+    public UserResponse getAppletUserInfo(Long userId) {
+        List<Role> roleList = roleService.getRoleByUserIdAndRoleCode(userId, CommonEnum.DefaultRole.HIGH_DIRECTOR.getCode());
+        if (roleList != null && roleList.size() > 0) {
+            UserResponse userResponse = getBaseUserInfo(userId);
+            //当前角色
+            Role currentRole = roleList.get(0);
+            userResponse.setRole(currentRole);
+            userResponse.setRoleCode(currentRole.getCode());
+            userResponse.setMaintenanceCompany(maintenanceCompanyService.getById(currentRole.getCompanyId()));
+            return userResponse;
+        }
+        return null;
+    }
+
+    /**
+     * @param userId 获取用户基本信息
+     * @return 用户信息
+     * @description 用户信息
+     * @date 2020/4/27 1:18 下午
+     */
+    private UserResponse getBaseUserInfo(Long userId) {
+        UserResponse userResponse = new UserResponse();
+        userResponse.setUserId(userId);
+        //获取用户的基本信息
+        UserAccount userAccount = userAccountService.getByUserId(userId);
+        UserInfo userInfo = userInfoService.getByUserId(userId);
+        userResponse.setName(userInfo.getName());
+        userResponse.setMobile(userAccount.getMobile());
+        userResponse.setExpertFlag(userAccount.getExpertFlag());
+        userResponse.setBalance(userInfo.getBalance());
+        userResponse.setAvatarUrl(userInfo.getAvatarUrl());
+        userResponse.setType(userAccount.getType());
+        //生成前端的token值
+        userResponse.setToken(IdUtil.fastSimpleUUID());
+        return userResponse;
+    }
+
 }

+ 23 - 7
lift-system-service/src/main/java/cn/com/ty/lift/system/wechat/constants/WxConstants.java

@@ -8,18 +8,34 @@ package cn.com.ty.lift.system.wechat.constants;
 public class WxConstants {
 
     /**
-     * app_id
+     * 小程序登录
      */
-    public static final String APP_ID = "wx0f10e6386fb9969e";
+    public static final String APPLET_LOGIN = "appletLogin";
 
     /**
-     * app密钥
+     * app登录
      */
-    public static final String APP_SECRET = "d4624c36b6795d1d99dcf0547af5443d";
+    public static final String APP_LOGIN = "appLogin";
 
     /**
-     * 获取用户信息access_token路径
+     * app登录配置常量
      */
-    public static final String USER_INFO_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?"
-            + "appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
+    public interface AppConfigConstants {
+        String APP_ID = "wx0f10e6386fb9969e";
+        String APP_SECRET = "d4624c36b6795d1d99dcf0547af5443d";
+        String USER_INFO_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?"
+                + "appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
+
+    }
+
+    /**
+     * 小程序登录配置常量
+     */
+    public interface AppletConfigConstants {
+        String APP_ID = "wxf7cd92f8cb2a2707";//小程序appId
+        String APP_SECRET = "42f5078bf0cc6a8e56755f4ce4993c94";//小程序secret
+        String AUTHORIZED_CODE_STR = "code";
+        String AUTH_URL = "https://api.weixin.qq.comI/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code";
+    }
+
 }

+ 25 - 7
lift-system-service/src/main/java/cn/com/ty/lift/system/wechat/utils/WxUtil.java

@@ -13,17 +13,35 @@ import cn.hutool.json.JSONUtil;
 public class WxUtil {
 
     /**
-     * @description 通过用户授权码获取用户openId
      * @param authCode 用户授权码
-     * @return
+     * @return openId
+     * @description app端通过用户授权码获取用户openId
      */
-    public static String getOpenIdByAuthCode(String authCode){
-        String url = WxConstants.USER_INFO_ACCESS_TOKEN_URL
-                .replace("APPID", WxConstants.APP_ID)
-                .replace("SECRET", WxConstants.APP_SECRET)
+    public static String getAppOpenIdByAuthCode(String authCode) {
+        String url = WxConstants.AppConfigConstants.USER_INFO_ACCESS_TOKEN_URL
+                .replace("APPID", WxConstants.AppConfigConstants.APP_ID)
+                .replace("SECRET", WxConstants.AppConfigConstants.APP_SECRET)
                 .replace("CODE", authCode);
         JSONObject result = JSONUtil.parseObj(HttpUtil.get(url));
-        if(result.containsKey("openid")){
+        if (result.containsKey("openid")) {
+            return result.getStr("openid");
+        }
+        return null;
+    }
+
+    /**
+     * @param authCode 用户授权码
+     * @return openId
+     * @description 小程序端通过用户授权码获取用户openId
+     * @date 2020/4/27 10:36 上午
+     */
+    public static String getAppletOpenIdByAuthCode(String authCode) {
+        String url = WxConstants.AppletConfigConstants.AUTH_URL
+                .replace("APPID", WxConstants.AppletConfigConstants.APP_ID)
+                .replace("SECRET", WxConstants.AppletConfigConstants.APP_SECRET)
+                .replace("CODE", authCode);
+        JSONObject result = JSONUtil.parseObj(HttpUtil.get(url));
+        if (result.containsKey("openid")) {
             return result.getStr("openid");
         }
         return null;