结合ruoyi-cloud和ruoyi-app实现微信小程序的授权登录

这篇具有很好参考价值的文章主要介绍了结合ruoyi-cloud和ruoyi-app实现微信小程序的授权登录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原视频链接

https://www.bilibili.com/video/BV1mg4y1s75r/?spm_id_from=333.337.search-card.all.click&vd_source=c15794e732e28886fefab201ec9c6253

1 前言

结合RuoYi-CloudRuoYi-App实现微信小程序的授权登录。
之前讲过前后端分离版的授权登录,逻辑大致一致,不同点有:

  • 微信头像和昵称的获取方式。由于最新的本地库通过getUserProfilegetUserInfo获取不到用户头像和昵称。采用头像昵称填写功能。(备注:https://developers.weixin.qq.com/community/develop/doc/00022c683e8a80b29bed2142b56c01)
  • 微服务端采用OpenFeign进行远程调用,不会远程调用的粉丝,可以学习一下。Feign的底层是Spring3.0RestTemplate,若依的RestTemplate又借助于OkHttp。相对于Feign本身来讲,OpenFeign是支持Spring MVC的注解的,用起来非常方便

1.1 环境准备

  • 下载RuoYi-Cloud代码
    添加链接描述https://gitee.com/y_project/RuoYi-Cloud
  • 下载RuoYi-App代码
    https://gitee.com/y_project/RuoYi-App

1.2 登录流程图

结合ruoyi-cloud和ruoyi-app实现微信小程序的授权登录

2 小程序代码

  • 微信开发者工具基础库用的2.30.*
  • app模块配置微信登录
    结合ruoyi-cloud和ruoyi-app实现微信小程序的授权登录
  • 使用自己的appid
    结合ruoyi-cloud和ruoyi-app实现微信小程序的授权登录

2.1 RuoYi-App编辑api/login.js

  • 登录、退出接口路径加/auth
  • 获取用户信息接口路径加/system
  • 获取验证码接口路径换成/code
import request from '@/utils/request'

// 登录方法
export function login(username, password, code, uuid) {
  const data = {
    username,
    password,
    code,
    uuid
  }
  return request({
    'url': '/auth/login',
    headers: {
      isToken: false
    },
    'method': 'post',
    'data': data
  })
}

// 获取用户详细信息
export function getInfo() {
  return request({
    'url': '/system/user/getInfo',
    'method': 'get'
  })
}

// 退出方法
export function logout() {
  return request({
    'url': '/auth/logout',
    'method': 'delete'
  })
}

// 获取验证码
export function getCodeImg() {
  return request({
    'url': '/code',
    headers: {
      isToken: false
    },
    method: 'get',
    timeout: 20000
  })
}

2.4 新增按钮微信授权登录

  • 在登录按钮下,新增微信授权登录按钮
<button @click="wxHandleLogin" class="login-btn cu-btn block bg-green lg round">微信授权登录</button>

2.6 新增wxHandleLogin方法获取code

// 微信登录
	async wxHandleLogin() {
			uni.getProvider({
				service:'Oauth',
				success: (res) => {
					console.log(res);
					if(res.provider.indexOf("WeiXin")){
						//登录
						uni.login({
							provider:'WeiXin',
							success: (loginRes) => {
							}
						})
					}
				}
			})
	}

2.9 创建sendWxLoginFormToLocalService方法

//向本地服务发起请求
	sendWxLoginFormToLocalService(){
				console.log("向后端发起请求" + this.wxLoginForm);
				this.$store.dispatch('wxLogin', this.wxLoginForm).then(() => {
				  this.$modal.closeLoading()
				}).catch(() => {

				})  
	}

3 微服务代码

3.5 auth服务TokenController添加接口wxLogin

    public R<?> wxLogin(@RequestBody WxLoginBody wxLoginBody){
        String code = wxLoginBody.getCode();

        //想微信服务器发送请求获取用户信息
        String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + wxAppConfig.getAppId() + "&secret=" + wxAppConfig.getAppSecret() + "&js_code=" + code + "&grant_type=authorizatinon_code";
        String res = restTemplate.getForObject(url, String.class);
        JSONObject jsonObject = JSONObject.parseObject(res);

        //获取session_key和openid
        String sessionKey = jsonObject.getString("session_key");
        String openid = jsonObject.getString("openid");

        if (StringUtils.hasText(openid)){
            // 如果解析成功,获取token
            LoginUser userInfo = sysLoginService.wxLogin(openid);
            // 获取登录token
            return R.ok(tokenService.createToken(userInfo));
        }else{
            return R.fail("微信登录失败!");
        }
    }

3.7 ruoyi-api模块新增远程调用

/**
     * 通过openid查询用户信息
     *
     * @param openid openid 用户唯一标识
     * @param source 请求来源
     * @return 结果
     */
    @GetMapping("/user/getInfoByOpenid/{openid}")
    public R<LoginUser> getInfoByOpenid(@PathVariable("openid") String openid, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

3.9 system服务SysUserController新增内部接口getInfoByOpenid和addWxUser

  • 数据库添加unionIdopenId
  • domain (SysUser)
/** unionId */
    private String unionId;

    /** openId */
    private String openId;
    
     public String getUnionId() {
        return unionId;
    }

    public void setUnionId(String unionId) {
        this.unionId = unionId;
    }

    public String getOpenId() {
        return openId;
    }

    public void setOpenId(String openId) {
        this.openId = openId;
    }
  • controller 层(SysUserController)
	/**
     * 根据openid获取当前用户信息
     */
    public R<LoginUser> getInfoByOpenid(@PathVariable("openid") String openid)
    {
        SysUser sysUser = userService.selectUserByOpenid(openid);
        LoginUser sysUserVo = new LoginUser();
        if (StringUtils.isNull(sysUser))
        {
            sysUserVo.setSysUser(null);
            return R.ok(sysUserVo);
        }
        return R.ok(sysUserVo);
    }
    
	/**
     * 新增微信用户信息
     */
    public R<SysUser> addWxUser(@RequestBody SysUser sysUser)
    {
        String username = sysUser.getUserName();
        userService.insertWxUser(sysUser);
        return R.ok(sysUser);
    }
  • service 层(SysUserServiceImpl)
    接口:
	/**
     * 通过openid查询用户
     *
     * @param openid 用户唯一标识
     * @return 用户对象信息
     */
    public SysUser selectUserByOpenid(String openid);

	/**
     * 新增微信用户信息
     *
     * @param user 用户信息
     * @return 结果
     */
    public int insertWxUser(SysUser user);

实现类:

	/**
     * 通过openid查询用户
     *
     * @param openid 用户唯一标识
     * @return 用户对象信息
     */
    @Override
    public SysUser selectUserByOpenid(String openid)
    {
        return userMapper.selectUserByOpenid(openid);
    }

	/**
     * 新增微信用户信息
     *
     * @param user 用户信息
     * @return 结果
     */
    @Override
    public int insertWxUser(SysUser user)
    {
        // 新增用户信息
        return userMapper.insertUser(user);
    }

mapper 层 (SysUserMapper)

/**
     * 通过openid查询用户
     *
     * @param openid 用户唯一标识
     * @return 用户对象信息
     */
    public SysUser selectUserByOpenid(String openid);

mybatis.xml (SysUserMapper.xml)文章来源地址https://www.toymoban.com/news/detail-491201.html

u.union_id, u.open_id,

....
<select id="selectUserByOpenid" parameterType="String" resultMap="SysUserResult">
		<include refid="selectUserVo"/>
		where u.open_id = #{openId} and u.del_flag = '0'
	</select>
....
<insert id="insertUser" parameterType="SysUser" useGeneratedKeys="true" keyProperty="userId">
 		insert into sys_user(
 			<if test="userId != null and userId != 0">user_id,</if>
 			<if test="deptId != null and deptId != 0">dept_id,</if>
 			<if test="userName != null and userName != ''">user_name,</if>
 			<if test="nickName != null and nickName != ''">nick_name,</if>
 			<if test="email != null and email != ''">email,</if>
 			<if test="avatar != null and avatar != ''">avatar,</if>
 			<if test="phonenumber != null and phonenumber != ''">phonenumber,</if>
 			<if test="sex != null and sex != ''">sex,</if>
 			<if test="password != null and password != ''">password,</if>
 			<if test="status != null and status != ''">status,</if>
 			<if test="createBy != null and createBy != ''">create_by,</if>
 			<if test="remark != null and remark != ''">remark,</if>
			<if test="openId != null and openId != ''">open_id,</if>
			<if test="unionId != null and unionId != ''">union_id,</if>
 			create_time
 		)values(
 			<if test="userId != null and userId != ''">#{userId},</if>
 			<if test="deptId != null and deptId != ''">#{deptId},</if>
 			<if test="userName != null and userName != ''">#{userName},</if>
 			<if test="nickName != null and nickName != ''">#{nickName},</if>
 			<if test="email != null and email != ''">#{email},</if>
 			<if test="avatar != null and avatar != ''">#{avatar},</if>
 			<if test="phonenumber != null and phonenumber != ''">#{phonenumber},</if>
 			<if test="sex != null and sex != ''">#{sex},</if>
 			<if test="password != null and password != ''">#{password},</if>
 			<if test="status != null and status != ''">#{status},</if>
 			<if test="createBy != null and createBy != ''">#{createBy},</if>
 			<if test="remark != null and remark != ''">#{remark},</if>
			<if test="openId != null and openId != ''">#{openId},</if>
			<if test="unionId != null and unionId != ''">#{unionId},</if>
 			sysdate()
 		)
	</insert>

到了这里,关于结合ruoyi-cloud和ruoyi-app实现微信小程序的授权登录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 若依微服务版启动(RuoYi-Cloud)教程

    之前一直有小伙伴咨询若依微服务版如何在本地启动,今天简单的给大家介绍一下。 首先,学习Java的小伙伴应该对若依框架都应该有所了解,RuoYi-Cloud 是一个 Java EE 分布式 微服务架构平台,基于经典技术组合(Spring Boot、Spring Cloud Alibaba、Vue、Element),内置模块如:部门管

    2024年01月18日
    浏览(30)
  • 【云原生】3.5 RuoYi-Cloud部署实战(下)

     哈喽~大家好呀,这篇呢我们接着上篇来讲。  🥇个人主页:个人主页​​​​​              🥈 系列专栏:【云原生系列】 🥉与这篇相关的文章:             【云原生】3.2 Kubernetes 实战之多租户系统实战 【云原生】3.2 Kubernetes 实战之多租户系统实战_程序猿追的博

    2024年02月03日
    浏览(32)
  • RuoYi-Cloud 若依微服务版启动教程(保姆级)

    RuoYi-Cloud 是一个 Java EE 企业级快速开发平台,基于经典技术组合(Spring Boot、Spring Cloud Alibaba、Vue、Element),内置模块如:部门管理、角色用户、菜单及按钮授权、数据权限、系统参数、日志管理、代码生成等。在线定时任务配置;支持集群,支持多数据源。 1、系统环境 J

    2023年04月09日
    浏览(45)
  • Docker容器化部署若依微服务ruoyi-cloud项目

    接下来的内容以 Ubuntu 22.04.1 操作系统为例。 验证版本信息 Note: 在 CentOS7 上使用上述 yum 方式安装的 Docker ,默认自带了Docker Compose Plugin,不过命令是 docker compose 。 docker pull docker run docker images docker ps docker logs docker start docker stop docker restart docker rmi docker rm docker exec docker netwo

    2024年02月04日
    浏览(30)
  • 若依移动端Ruoyi-App 项目的后端项目入门

    后端项目运行 运行报错  Error creating bean with name \\\'sysConfigServiceImpl\\\': Invocation of init method failed 数据库创建了。  代码连接数据库地方了也匹配上了。但是还是报错。  分析 : 想起来我电脑从来没有安装过redis  下载安装redis到windows 链接:https://pan.baidu.com/s/1GjNhTPFfW5aMEYoy0QDZ3g?

    2024年02月11日
    浏览(26)
  • 若依cloud(RuoYi-Cloud)新增业务模块和功能模块增删改查演示

    前言 看了几篇文章感觉都不太满意,索性自己来写一篇。 一、后端 后端新建业务模块流程大致如下: 看一下目录结构, business 就是我们自己的业务模块: 1.0 新建业务模块 就是在 ruoyi-module模块 下新建一个 springboot 工程模块,大家既然都学到cloud了,我相信这一步也不用多

    2024年02月17日
    浏览(36)
  • 若依框架(RuoYi-Cloud 微服务版本)134节视频教程

    RuoYi-Cloud 是一个 Java EE 分布式微服务架构平台,基于经典技术组合(Spring Boot、Spring Cloud Alibaba、Vue、Element),内置模块如:部门管理、角色用户、菜单及按钮授权、数据权限、系统参数、日志管理、代码生成等。在线定时任务配置;支持集群,支持多数据源。 在线体验 若依

    2024年02月13日
    浏览(33)
  • 若依开源框架-微服务版本(ruoyi-Cloud)使用说明-超详细

    JDK 1.8 Mysql 5.7以上 Nacos 2.0.3 Node 14 版本以上 打开网站: RuoYi 若依官方网站 |后台管理系统|权限管理系统|快速开发框架|企业管理系统|开源框架|微服务框架|前后端分离框架|开源后台系统|RuoYi|RuoYi-Vue|RuoYi-Cloud|RuoYi框架|RuoYi开源|RuoYi视频|若依视频|RuoYi开发文档|若依开发文档|J

    2024年02月04日
    浏览(86)
  • 【docker快速部署微服务若依管理系统(RuoYi-Cloud)】

    工作原因,需要一个比较完整的开源项目测试本公司产品。偶然发现RuoYi-Cloud非常适合,它有足够多的中间件,而且官方提供docker安装,但我本人在安装过程中遇到了很多坑,在这里记录一下防止下次会再次遇到。 https://gitee.com/y_project/RuoYi-Cloud 内存至少16G,处理器至少4核 内

    2024年02月09日
    浏览(43)
  • 【RuoYi-Cloud项目研究】【ruoyi-gateway模块】网关的AuthFilter完成“认证”,注意是认证而不是权限

    过滤器的功能是检验经过网关的每一个请求,检查 token 中的信息是否有效。 注意是“认证检查”,而不是“权限” ,权限是在每个服务的Controller上贴权限注解 1、在用户完成登录后,程序会把用户相关的用户、角色、权限等信息临时存储在 redis 中,并把token返回给终端用户

    2024年02月07日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包