소스 검색

feat: 微信小程序登录;

hanchaolong 1 주 전
부모
커밋
32ea1470c4
16개의 변경된 파일257개의 추가작업 그리고 16개의 파일을 삭제
  1. 34 7
      jd-logistics-api/jd-logistics-api-system/src/main/java/com/ruoyi/system/api/RemoteUserService.java
  2. 12 0
      jd-logistics-api/jd-logistics-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java
  3. 15 0
      jd-logistics-api/jd-logistics-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteUserFallbackFactory.java
  4. 32 0
      jd-logistics-auth/src/main/java/com/ruoyi/auth/controller/WxMiniController.java
  5. 13 0
      jd-logistics-auth/src/main/java/com/ruoyi/auth/form/LoginBody.java
  6. 47 0
      jd-logistics-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java
  7. 1 1
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/config/WxMaConfig.java
  8. 1 1
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/config/WxMaProperties.java
  9. 68 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/front/controller/WxMiniController.java
  10. 1 1
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/enums/EnvVersion.java
  11. 2 2
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/service/IWxService.java
  12. 4 3
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/service/impl/WxMiniAppServiceImpl.java
  13. 8 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
  14. 10 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
  15. 4 0
      jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
  16. 5 1
      jd-logistics-modules/jd-logistics-system/src/main/resources/mapper/system/SysUserMapper.xml

+ 34 - 7
jd-logistics-api/jd-logistics-api-system/src/main/java/com/ruoyi/system/api/RemoteUserService.java

@@ -1,12 +1,7 @@
 package com.ruoyi.system.api;
 
 import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.*;
 import com.ruoyi.common.core.constant.SecurityConstants;
 import com.ruoyi.common.core.constant.ServiceNameConstants;
 import com.ruoyi.common.core.domain.R;
@@ -43,7 +38,7 @@ public interface RemoteUserService
     public R<Boolean> registerUserInfo(@RequestBody SysUser sysUser, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
 
     /**
-     * 记录用户登录IP地址和登录时间
+     * 获取用户
      *
      * @param sysUser 用户信息
      * @param source 请求来源
@@ -51,4 +46,36 @@ public interface RemoteUserService
      */
     @PutMapping("/user/recordlogin")
     public R<Boolean> recordUserLogin(@RequestBody SysUser sysUser, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+    /**
+     * 获取用户
+     *
+     * @param jsCode 用户信息
+     * @param source 请求来源
+     * @return 结果
+     */
+    @GetMapping("/front/wxmini/getOpenId")
+    public R<String> getOpenId(@RequestParam("jsCode") String jsCode, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+    /**
+     * 获取用户
+     *
+     * @param code 用户信息
+     * @param source 请求来源
+     * @return 结果
+     */
+    @GetMapping("/front/wxmini/getPhoneNumber")
+    public R<String> getPhoneNumber(@RequestParam("code") String code, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+
+    /**
+     * 通过用户名和openId查询用户信息
+     *
+     * @param sysUser 用户名 openId
+     * @param source 请求来源
+     * @return 结果
+     */
+    @PostMapping("/front/wxmini/getUserByOpenId")
+    public R<LoginUser> getUserByOpenId(@RequestBody SysUser sysUser, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
 }

+ 12 - 0
jd-logistics-api/jd-logistics-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java

@@ -93,6 +93,9 @@ public class SysUser extends BaseEntity
     /** 角色ID */
     private Long roleId;
 
+    /** 微信openId */
+    private String openId;
+
     public SysUser()
     {
 
@@ -311,6 +314,14 @@ public class SysUser extends BaseEntity
         this.roleId = roleId;
     }
 
+    public String getOpenId() {
+        return openId;
+    }
+
+    public void setOpenId(String openId) {
+        this.openId = openId;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
@@ -334,6 +345,7 @@ public class SysUser extends BaseEntity
             .append("updateTime", getUpdateTime())
             .append("remark", getRemark())
             .append("dept", getDept())
+            .append("openId", getOpenId())
             .toString();
     }
 }

+ 15 - 0
jd-logistics-api/jd-logistics-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteUserFallbackFactory.java

@@ -42,6 +42,21 @@ public class RemoteUserFallbackFactory implements FallbackFactory<RemoteUserServ
             {
                 return R.fail("记录用户登录信息失败:" + throwable.getMessage());
             }
+
+            @Override
+            public R<String> getOpenId(String jsCode, String source) {
+                return R.fail("获取用户OpenId失败:" + throwable.getMessage());
+            }
+
+            @Override
+            public R<String> getPhoneNumber(String code, String source) {
+                return R.fail("获取用户手机号失败:" + throwable.getMessage());
+            }
+
+            @Override
+            public R<LoginUser> getUserByOpenId(SysUser sysUser, String source) {
+                return R.fail("获取用户信息失败:" + throwable.getMessage());
+            }
         };
     }
 }

+ 32 - 0
jd-logistics-auth/src/main/java/com/ruoyi/auth/controller/WxMiniController.java

@@ -0,0 +1,32 @@
+package com.ruoyi.auth.controller;
+
+import com.ruoyi.auth.form.LoginBody;
+import com.ruoyi.auth.service.SysLoginService;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.security.service.TokenService;
+import com.ruoyi.system.api.model.LoginUser;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/wxmini")
+public class WxMiniController {
+
+    @Autowired
+    private SysLoginService sysLoginService;
+
+    @Autowired
+    private TokenService tokenService;
+
+    @PostMapping("login")
+    public R<?> login(@RequestBody LoginBody form) {
+        // 用户登录
+        LoginUser userInfo = sysLoginService.openIdLogin(form.getUsername(), form.getOpenId());
+        // 获取登录token
+        return R.ok(tokenService.createToken(userInfo));
+    }
+
+}

+ 13 - 0
jd-logistics-auth/src/main/java/com/ruoyi/auth/form/LoginBody.java

@@ -17,6 +17,11 @@ public class LoginBody
      */
     private String password;
 
+    /**
+     * 微信小程序openId
+     */
+    private String openId;
+
     public String getUsername()
     {
         return username;
@@ -36,4 +41,12 @@ public class LoginBody
     {
         this.password = password;
     }
+
+    public String getOpenId() {
+        return openId;
+    }
+
+    public void setOpenId(String openId) {
+        this.openId = openId;
+    }
 }

+ 47 - 0
jd-logistics-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java

@@ -153,4 +153,51 @@ public class SysLoginService
         }
         recordLogService.recordLogininfor(username, Constants.REGISTER, "注册成功");
     }
+
+
+    /**
+     * 登录
+     */
+    public LoginUser openIdLogin(String username, String openId)
+    {
+        // 用户名或密码为空 错误
+        if (StringUtils.isAnyBlank(username, openId))
+        {
+            recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "用户/openId必须填写");
+            throw new ServiceException("用户/openId必须填写");
+        }
+        // IP黑名单校验
+        String blackStr = Convert.toStr(redisService.getCacheObject(CacheConstants.SYS_LOGIN_BLACKIPLIST));
+        if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr()))
+        {
+            recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "很遗憾,访问IP已被列入系统黑名单");
+            throw new ServiceException("很遗憾,访问IP已被列入系统黑名单");
+        }
+        // 查询用户信息
+        SysUser sysUser = new SysUser();
+        sysUser.setUserName(username);
+        sysUser.setOpenId(openId);
+        R<LoginUser> userResult = remoteUserService.getUserByOpenId(sysUser, SecurityConstants.INNER);
+
+        if (R.FAIL == userResult.getCode())
+        {
+            throw new ServiceException(userResult.getMsg());
+        }
+
+        LoginUser userInfo = userResult.getData();
+        SysUser user = userResult.getData().getSysUser();
+        if (UserStatus.DELETED.getCode().equals(user.getDelFlag()))
+        {
+            recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "对不起,您的账号已被删除");
+            throw new ServiceException("对不起,您的账号:" + username + " 已被删除");
+        }
+        if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
+        {
+            recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "用户已停用,请联系管理员");
+            throw new ServiceException("对不起,您的账号:" + username + " 已停用");
+        }
+        recordLogService.recordLogininfor(username, Constants.LOGIN_SUCCESS, "登录成功");
+        recordLoginInfo(user.getUserId());
+        return userInfo;
+    }
 }

+ 1 - 1
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/config/WxMaConfig.java

@@ -1,4 +1,4 @@
-package com.ruoyi.system.config;
+package com.ruoyi.front.config;
 
 import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;

+ 1 - 1
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/config/WxMaProperties.java

@@ -1,4 +1,4 @@
-package com.ruoyi.system.config;
+package com.ruoyi.front.config;
 
 
 import lombok.Data;

+ 68 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/front/controller/WxMiniController.java

@@ -0,0 +1,68 @@
+package com.ruoyi.front.controller;
+
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.common.security.annotation.InnerAuth;
+import com.ruoyi.front.service.IWxService;
+import com.ruoyi.system.api.domain.SysUser;
+import com.ruoyi.system.api.model.LoginUser;
+import com.ruoyi.system.service.ISysPermissionService;
+import com.ruoyi.system.service.ISysUserService;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Set;
+
+@RestController
+@RequestMapping("/front/wxmini")
+public class WxMiniController {
+
+    @Autowired
+    private IWxService wxService;
+
+    @Autowired
+    private ISysUserService sysUserService;
+
+    @Autowired
+    private ISysPermissionService permissionService;
+
+    @InnerAuth
+    @GetMapping("/getOpenId")
+    public String getOpenId(@RequestParam("jsCode") String jsCode) {
+        try {
+            return wxService.getOpenId(jsCode);
+        } catch (WxErrorException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @InnerAuth
+    @GetMapping("/getPhoneNumber")
+    public String getPhoneNumber(@RequestParam("code") String code) {
+        try {
+            return wxService.getPhoneNumber(code);
+        } catch (WxErrorException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @InnerAuth
+    @PostMapping("/getUserByOpenId")
+    public R<LoginUser> getUserByOpenId(@RequestBody SysUser sysUser) {
+        SysUser currentUser = sysUserService.selectUserByOpenId(sysUser);
+        if (StringUtils.isNull(sysUser))
+        {
+            return R.fail("用户名或密码错误");
+        }
+        // 角色集合
+        Set<String> roles = permissionService.getRolePermission(currentUser);
+        // 权限集合
+        Set<String> permissions = permissionService.getMenuPermission(currentUser);
+        LoginUser sysUserVo = new LoginUser();
+        sysUserVo.setSysUser(currentUser);
+        sysUserVo.setRoles(roles);
+        sysUserVo.setPermissions(permissions);
+        return R.ok(sysUserVo);
+    }
+}

+ 1 - 1
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/enums/EnvVersion.java

@@ -1,4 +1,4 @@
-package com.ruoyi.system.enums;
+package com.ruoyi.front.enums;
 
 import lombok.Getter;
 

+ 2 - 2
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/service/IWxService.java

@@ -1,6 +1,6 @@
-package com.ruoyi.system.service;
+package com.ruoyi.front.service;
 
-import com.ruoyi.system.enums.EnvVersion;
+import com.ruoyi.front.enums.EnvVersion;
 import me.chanjar.weixin.common.error.WxErrorException;
 
 import java.io.File;

+ 4 - 3
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/service/impl/WxMiniAppServiceImpl.java

@@ -1,9 +1,10 @@
-package com.ruoyi.system.service.impl;
+package com.ruoyi.front.service.impl;
 
 import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
 import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
-import com.ruoyi.system.enums.EnvVersion;
+import com.ruoyi.front.enums.EnvVersion;
+import com.ruoyi.front.service.IWxService;
 import lombok.RequiredArgsConstructor;
 import me.chanjar.weixin.common.error.WxErrorException;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
@@ -18,7 +19,7 @@ import java.io.File;
 @Service
 @RequiredArgsConstructor
 @ConditionalOnBean(WxMaService.class)
-public class WxMiniAppServiceImpl implements com.ruoyi.system.service.IWxService {
+public class WxMiniAppServiceImpl implements IWxService {
 
     private final WxMaService wxMaService;
 

+ 8 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java

@@ -124,4 +124,12 @@ public interface SysUserMapper
      * @return 结果
      */
     public SysUser checkEmailUnique(String email);
+
+    /**
+     * 通过微信openId查询用户
+     *
+     * @param userName 用户名
+     * @return 用户对象信息
+     */
+    public SysUser selectUserByOpenId(@Param("userName") String userName, @Param("openId") String openId);
 }

+ 10 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/service/ISysUserService.java

@@ -203,4 +203,14 @@ public interface ISysUserService
      * @return 结果
      */
     public String importUser(List<SysUser> userList, Boolean isUpdateSupport, String operName);
+
+
+    /**
+     * 通过用户名和OpenId查询用户
+     *
+     * @param userName 用户名
+     * @param openId 用户名
+     * @return 用户对象信息
+     */
+    public SysUser selectUserByOpenId( SysUser sysUser);
 }

+ 4 - 0
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java

@@ -548,4 +548,8 @@ public class SysUserServiceImpl implements ISysUserService
         return successMsg.toString();
     }
 
+    @Override
+    public SysUser selectUserByOpenId(SysUser sysUser) {
+        return userMapper.selectUserByOpenId(sysUser.getUserName(), sysUser.getOpenId());
+    }
 }

+ 5 - 1
jd-logistics-modules/jd-logistics-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -219,5 +219,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  			#{userId}
         </foreach> 
  	</delete>
-	
+
+    <select id="selectUserByOpenId" parameterType="String" resultMap="SysUserResult">
+        <include refid="selectUserVo"/>
+        where u.user_name = #{userName} and u.open_id = #{openId} and u.del_flag = '0'
+    </select>
 </mapper>