[feat] 新增通过微信unionId注册的功能

pull/445/head
hsdllcw 1 year ago
parent beb41bb782
commit 21495202ff

@ -1,11 +1,11 @@
<p align="center">
<img alt="logo" src="https://oscimg.oschina.net/oscnet/up-b99b286755aef70355a7084753f89cdb7c9.png">
</p>
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">RuoYi v3.6.5</h1>
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">RuoYi v3.6.5.0.1</h1>
<h4 align="center">基于 Vue/Element UI 和 Spring Boot/Spring Cloud & Alibaba 前后端分离的分布式微服务架构</h4>
<p align="center">
<a href="https://gitee.com/y_project/RuoYi-Cloud/stargazers"><img src="https://gitee.com/y_project/RuoYi-Cloud/badge/star.svg?theme=dark"></a>
<a href="https://gitee.com/y_project/RuoYi-Cloud"><img src="https://img.shields.io/badge/RuoYi-v3.6.5-brightgreen.svg"></a>
<a href="https://gitee.com/y_project/RuoYi-Cloud"><img src="https://img.shields.io/badge/RuoYi-v3.6.5.0.1-brightgreen.svg"></a>
<a href="https://gitee.com/y_project/RuoYi-Cloud/blob/master/LICENSE"><img src="https://img.shields.io/github/license/mashape/apistatus.svg"></a>
</p>

@ -6,14 +6,14 @@
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi</artifactId>
<version>3.6.5</version>
<version>3.6.5.0.1</version>
<name>ruoyi</name>
<url>http://www.ruoyi.vip</url>
<description>若依微服务系统</description>
<properties>
<ruoyi.version>3.6.5</ruoyi.version>
<ruoyi.version>3.6.5.0.1</ruoyi.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>

@ -4,7 +4,7 @@
<parent>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi</artifactId>
<version>3.6.5</version>
<version>3.6.5.0.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>

@ -5,7 +5,7 @@
<parent>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-api</artifactId>
<version>3.6.5</version>
<version>3.6.5.0.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>

@ -11,6 +11,8 @@ import com.ruoyi.system.api.RemoteUserService;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.model.LoginUser;
import java.util.Map;
/**
*
*
@ -29,7 +31,12 @@ public class RemoteUserFallbackFactory implements FallbackFactory<RemoteUserServ
{
@NotNull
@Override
public R<LoginUser> infoById_Inner(Long userId, @NotNull String source) {
public R<LoginUser> getById_Inner(Long userId, @NotNull String source) {
return R.fail("获取用户失败:" + throwable.getMessage());
}
@Override
public R<LoginUser> getByWxUnionId_Inner(String unionid, String source) {
return R.fail("获取用户失败:" + throwable.getMessage());
}
@ -41,7 +48,7 @@ public class RemoteUserFallbackFactory implements FallbackFactory<RemoteUserServ
@NotNull
@Override
public R<LoginUser> getUserInfoByPhoneNumber_Inner(@NotNull String phoneNumber, @NotNull String source) {
public R<LoginUser> getByPhoneNumber_Inner(@NotNull String phoneNumber, @NotNull String source) {
return R.fail("获取用户失败:" + throwable.getMessage());
}
@ -67,6 +74,11 @@ public class RemoteUserFallbackFactory implements FallbackFactory<RemoteUserServ
public R<LoginUser> edit_Inner(@NotNull LoginUser user, @NotNull String source) {
return R.fail("修改用户信息失败:" + throwable.getMessage());
}
@Override
public R<Boolean> registerUserByWxUnionId_Inner(Map<String, String> params, String source) {
return R.fail("注册用户失败:" + throwable.getMessage());
}
};
}
}

@ -7,6 +7,8 @@ import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.model.LoginUser;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
public interface InnerRemoteUserService {
/**
* ID
@ -16,8 +18,17 @@ public interface InnerRemoteUserService {
* @return
*/
@GetMapping("/inner/user/detail/{userId}")
R<LoginUser> infoById_Inner(@PathVariable("userId") Long userId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
R<LoginUser> getById_Inner(@PathVariable("userId") Long userId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
/**
* ID
*
* @param unionid unionid
* @param source
* @return
*/
@GetMapping("/inner/user/detail/wx/unionid/{unionid}")
R<LoginUser> getByWxUnionId_Inner(@PathVariable("unionid") String unionid, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
/**
*
@ -27,7 +38,7 @@ public interface InnerRemoteUserService {
* @return
*/
@GetMapping("/inner/user/info/phoneNumber/{phoneNumber:\\d+}")
R<LoginUser> getUserInfoByPhoneNumber_Inner(@PathVariable("phoneNumber") String phoneNumber, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
R<LoginUser> getByPhoneNumber_Inner(@PathVariable("phoneNumber") String phoneNumber, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
/**
*
@ -41,4 +52,14 @@ public interface InnerRemoteUserService {
@PutMapping("/inner/user")
R<LoginUser> edit_Inner(@RequestBody LoginUser user, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
/**
*
*
* @param params unionIddeptId
* @param source
* @return
*/
@PostMapping("/inner/user/register/wx/unionid")
public R<Boolean> registerUserByWxUnionId_Inner(@RequestBody Map<String, String> params, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
}

@ -4,7 +4,7 @@
<parent>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi</artifactId>
<version>3.6.5</version>
<version>3.6.5.0.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@ -15,45 +15,45 @@
</description>
<dependencies>
<!-- SpringCloud Alibaba Nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringCloud Alibaba Nacos Config -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringCloud Alibaba Sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- SpringBoot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- SpringBoot Actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- RuoYi Common Security-->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common-security</artifactId>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
@ -70,5 +70,5 @@
</plugin>
</plugins>
</build>
</project>

@ -4,7 +4,7 @@
<parent>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi</artifactId>
<version>3.6.5</version>
<version>3.6.5.0.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>

@ -5,7 +5,7 @@
<parent>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common</artifactId>
<version>3.6.5</version>
<version>3.6.5.0.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>

@ -5,7 +5,7 @@
<parent>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common</artifactId>
<version>3.6.5</version>
<version>3.6.5.0.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>

@ -5,7 +5,7 @@
<parent>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common</artifactId>
<version>3.6.5</version>
<version>3.6.5.0.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>

@ -5,7 +5,7 @@
<parent>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common</artifactId>
<version>3.6.5</version>
<version>3.6.5.0.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>

@ -5,7 +5,7 @@
<parent>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common</artifactId>
<version>3.6.5</version>
<version>3.6.5.0.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>

@ -5,7 +5,7 @@
<parent>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common</artifactId>
<version>3.6.5</version>
<version>3.6.5.0.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>

@ -4,7 +4,7 @@
<parent>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common</artifactId>
<version>3.6.5</version>
<version>3.6.5.0.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>

@ -5,7 +5,7 @@
<parent>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common</artifactId>
<version>3.6.5</version>
<version>3.6.5.0.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>

@ -5,7 +5,7 @@
<parent>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common</artifactId>
<version>3.6.5</version>
<version>3.6.5.0.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>

@ -4,7 +4,7 @@
<parent>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi</artifactId>
<version>3.6.5</version>
<version>3.6.5.0.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>

@ -4,7 +4,7 @@
<parent>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi</artifactId>
<version>3.6.5</version>
<version>3.6.5.0.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>

@ -5,7 +5,7 @@
<parent>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-modules</artifactId>
<version>3.6.5</version>
<version>3.6.5.0.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>

@ -5,7 +5,7 @@
<parent>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-modules</artifactId>
<version>3.6.5</version>
<version>3.6.5.0.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>

@ -5,7 +5,7 @@
<parent>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-modules</artifactId>
<version>3.6.5</version>
<version>3.6.5.0.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>

@ -5,7 +5,7 @@
<parent>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-modules</artifactId>
<version>3.6.5</version>
<version>3.6.5.0.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>

@ -11,6 +11,8 @@ import com.ruoyi.common.security.annotation.InnerAuth
import com.ruoyi.common.security.service.TokenService
import com.ruoyi.system.api.domain.SysUser
import com.ruoyi.system.api.model.LoginUser
import com.ruoyi.system.service.IKSysUserService
import com.ruoyi.system.service.ISysConfigService
import com.ruoyi.system.service.ISysPermissionService
import com.ruoyi.system.service.ISysUserService
import org.springframework.beans.factory.annotation.Autowired
@ -29,12 +31,18 @@ open class InnerSysUserController : BaseController() {
@Autowired
open lateinit var userService: ISysUserService
@Autowired
open lateinit var kSysUserService: IKSysUserService
@Autowired
open lateinit var permissionService: ISysPermissionService
@Autowired
open lateinit var tokenService: TokenService
@Autowired
open lateinit var configService: ISysConfigService
/**
* 获取当前用户信息
@ -84,6 +92,27 @@ open class InnerSysUserController : BaseController() {
return R.ok(sysUserVo)
}
/**
* 根据微信unionid获取用户信息
*/
@InnerAuth
@GetMapping("/detail/wx/unionid/{unionid}")
fun infoByWxUnionId(@PathVariable("unionid") unionid: String): R<LoginUser> {
val sysUser = kSysUserService.selectUserByWxUnionId(unionid)
if (StringUtils.isNull(sysUser)) {
return R.fail("wx_unionid错误")
}
// 角色集合
val roles: Set<String> = permissionService.getRolePermission(sysUser)
// 权限集合
val permissions: Set<String> = permissionService.getMenuPermission(sysUser)
val sysUserVo = LoginUser()
sysUserVo.sysUser = sysUser
sysUserVo.roles = roles
sysUserVo.permissions = permissions
return R.ok(sysUserVo)
}
/**
* 修改用户
*/
@ -112,4 +141,22 @@ open class InnerSysUserController : BaseController() {
tokenService.setLoginUser(loginUser)
return success(loginUser)
}
/**
* 注册用户信息
*/
@InnerAuth
@PostMapping("/register/wx/unionid")
fun registerUserByWxUnionId(@RequestBody params: Map<String, String?>): R<Boolean> {
if (!("true" == configService.selectConfigByKey("sys.account.registerUser"))) {
return R.fail("当前系统没有开启注册功能!")
}
val unionid = params.get("unionId")
val deptId = params.get("deptId")?.toLong()
if (unionid == null) return R.fail("微信unionid不存在无法注册")
if (!kSysUserService.checkWxUnionIdUnique(unionid)) {
return R.fail("保存用户'$unionid'失败,注册账号已存在")
}
return R.ok(kSysUserService.registerUserByWxUnionId(unionid, deptId))
}
}

@ -0,0 +1,28 @@
package com.ruoyi.system.mapper
import com.ruoyi.system.api.domain.SysUser
/**
* 用户表 数据层
*
* @author hsdllcw
*/
interface KSysUserMapper {
/**
* 通过用户名查询用户
*
* @param wxUnionId 微信unionid
* @return 用户对象信息
*/
fun selectUserByWxUnionId(wxUnionId: String): SysUser?
/**
* 校验微信unionid是否唯一
*
* @param wxUnionId 微信unionid
* @return 结果
*/
fun checkWxUnionIdUnique(wxUnionId: String): SysUser?
fun insert(params: Map<String, Any>): Int
}

@ -0,0 +1,31 @@
package com.ruoyi.system.service
import com.ruoyi.system.api.domain.SysUser
interface IKSysUserService {
fun getISysUserService(): ISysUserService
/**
* 通过微信unionid查询用户
*
* @param wxUnionId 微信unionid
* @return 用户对象信息
*/
fun selectUserByWxUnionId(wxUnionId: String): SysUser?
/**
* 校验微信unionid是否唯一
*
* @param wxUnionId 微信unionid
* @return 用户对象信息
*/
fun checkWxUnionIdUnique(wxUnionId: String): Boolean
/**
* 注册用户信息
*
* @param wxUnionId 微信unionId
* @return 结果
*/
fun registerUserByWxUnionId(wxUnionId: String, deptId: Long?): Boolean
}

@ -0,0 +1,46 @@
package com.ruoyi.system.service.impl
import com.ruoyi.common.core.constant.UserConstants
import com.ruoyi.common.core.utils.uuid.IdUtils
import com.ruoyi.common.security.utils.SecurityUtils
import com.ruoyi.system.api.domain.SysUser
import com.ruoyi.system.mapper.KSysUserMapper
import com.ruoyi.system.service.IKSysUserService
import com.ruoyi.system.service.ISysUserService
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
@Service
open class KSysUserServiceImpl : IKSysUserService {
@Autowired
lateinit var sysUserService: ISysUserService
@Autowired
lateinit var kSysUserMapper: KSysUserMapper
override fun getISysUserService() = sysUserService
override fun selectUserByWxUnionId(wxUnionId: String) = kSysUserMapper.selectUserByWxUnionId(wxUnionId)
override fun checkWxUnionIdUnique(wxUnionId: String) =
kSysUserMapper.checkWxUnionIdUnique(wxUnionId)?.run { UserConstants.NOT_UNIQUE } ?: UserConstants.UNIQUE
/**
* 注册用户信息
*
* @param wxUnionId 微信unionId
* @return 结果
*/
override fun registerUserByWxUnionId(wxUnionId: String, deptId: Long?): Boolean {
val user = SysUser().apply {
userName = IdUtils.randomUUID().replace("-".toRegex(), "").substring(0, 30)
nickName = "嘉迪微信用户"
password = SecurityUtils.encryptPassword(IdUtils.randomUUID())
this.deptId = deptId
}
return sysUserService.registerUser(user).apply {
sysUserService.selectUserByUserName(user.userName)
kSysUserMapper.insert(mapOf(
"userId" to user.userId,
"wxUnionId" to wxUnionId,
))
}
}
}

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.KSysUserMapper">
<resultMap type="SysUser" id="SysUserResult">
<id property="userId" column="user_id" />
<result property="deptId" column="dept_id" />
<result property="userName" column="user_name" />
<result property="nickName" column="nick_name" />
<result property="email" column="email" />
<result property="phonenumber" column="phonenumber" />
<result property="sex" column="sex" />
<result property="avatar" column="avatar" />
<result property="password" column="password" />
<result property="status" column="status" />
<result property="delFlag" column="del_flag" />
<result property="loginIp" column="login_ip" />
<result property="loginDate" column="login_date" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<result property="remark" column="remark" />
<association property="dept" javaType="SysDept" resultMap="deptResult" />
<collection property="roles" javaType="java.util.List" resultMap="RoleResult" />
</resultMap>
<resultMap id="deptResult" type="SysDept">
<id property="deptId" column="dept_id" />
<result property="parentId" column="parent_id" />
<result property="deptName" column="dept_name" />
<result property="ancestors" column="ancestors" />
<result property="orderNum" column="order_num" />
<result property="leader" column="leader" />
<result property="status" column="dept_status" />
</resultMap>
<resultMap id="RoleResult" type="SysRole">
<id property="roleId" column="role_id" />
<result property="roleName" column="role_name" />
<result property="roleKey" column="role_key" />
<result property="roleSort" column="role_sort" />
<result property="dataScope" column="data_scope" />
<result property="status" column="role_status" />
</resultMap>
<sql id="selectUserVo">
select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status,
r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status
from sys_user u
left join sys_user_account ua on ua.user_id=u.user_id
left join sys_dept d on u.dept_id = d.dept_id
left join sys_user_role ur on u.user_id = ur.user_id
left join sys_role r on r.role_id = ur.role_id
</sql>
<select id="selectUserByWxUnionId" parameterType="String" resultMap="SysUserResult">
<include refid="selectUserVo"/>
where ua.wx_unionid = #{wxUnionId} and u.del_flag = '0'
</select>
<select id="checkWxUnionIdUnique" parameterType="String" resultMap="SysUserResult">
select u.user_id, u.user_name from sys_user u left join sys_user_account ua on ua.user_id=u.user_id where ua.wx_unionid = #{wxUnionId} and u.del_flag = '0' limit 1
</select>
<insert id="insert">
insert into sys_user_account(user_id, wx_unionid) values (#{userId},#{wxUnionId})
</insert>
</mapper>

@ -1,6 +1,6 @@
{
"name": "ruoyi",
"version": "3.6.5",
"version": "3.6.5.0.1",
"description": "若依管理系统",
"author": "若依",
"license": "MIT",

@ -145,7 +145,7 @@
<span>更新日志</span>
</div>
<el-collapse accordion>
<el-collapse-item title="v3.6.5 - 2024-11-13">
<el-collapse-item title="v3.6.5.0.1 - 2024-11-13">
<ol>
<li>使用SpringDoc代替Swagger</li>
<li>菜单管理新增路由名称</li>
@ -946,7 +946,7 @@ export default {
data() {
return {
//
version: "3.6.5",
version: "3.6.5.0.1",
};
},
methods: {

@ -4,7 +4,7 @@
<parent>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi</artifactId>
<version>3.6.5</version>
<version>3.6.5.0.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>

@ -4,7 +4,7 @@
<parent>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-visual</artifactId>
<version>3.6.5</version>
<version>3.6.5.0.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>

Loading…
Cancel
Save