uniapp 用户登录

文章目录

          • 一、登录基础
            • 1. 登录组件
            • 2. 页面引用组件
            • 3. 明确登录的实现思路
            • 4. 封装 action 调用登录接口
            • 5. 保存用户登录状态
            • 6. 成已登录的用户视图
            • 6. 现退出登录功能

一、登录基础
1. 登录组件

对于 登录 功能来说提供了两个登录的入口。

那么大家想一下,现在我们已经在 我的 这个 tab页 中实现了 登录的 UI,难道我还需要在另外一个页面中再去实现一遍吗?

这个肯定是不需要的对不对。所以我们希望可以复用登录的 UI,而复用的方式则可以把 登录的 UI 封装称为一个 组件

创建登录组件 my-login
在这里插入图片描述
在这里插入图片描述

登录页面基本样式

<template><view class="my-container"><!-- 用户未登录 --><block><image class="avatar avatar-img" src="/static/images/default-avatar.png" mode="scaleToFill" /><view class="login-desc">登录后可同步数据</view><button class="login-btn" type="primary" @click="getUserInfo">微信用户一键登录</button></block></view>
</template><script>
export default {name: 'my-login',data() {return {};}
};
</script><style lang="scss" scoped>
.my-container {display: flex;flex-direction: column;align-items: center;padding-top: 25%;.avatar-img {width: 78px;height: 78px;}.login-desc {color: $uni-text-color-grey;font-size: $uni-font-size-base;margin-top: $uni-spacing-col-big;}.login-btn {margin-top: $uni-spacing-col-big;width: 85%;}
}
</style>
2. 页面引用组件

me.vue

<template><my-login />
</template><script>
export default {name: 'login'
};
</script>
3. 明确登录的实现思路

微信小程序:

  1. 想要实现登录功能,那么我们需要调用登录接口来进行实现,而登录接口所需要的参数,我们可以直接通过 getUserProfile 方法进行获取。
  2. 调用登录接口成功,服务端会返回用户的 token,这个 token 为当前的用户身份令牌。(拥有 token) 则表示用户已经登录了。
  3. 而此处的 token,我们需要在多个组件中进行使用,所以 token 需要被保存到 全局状态管理工具 - vuex 中,同时需要保存的还有通过 getUserProfile 获取到的用户基本信息。
  4. 而当前的用户登录状态,我们希望可以一直保存(PS:不需要每次都进行登录)。所以在登录完成后,我们需要把 token && userinfo 保存到 本地存储中
  5. 最后,为了实现 数据与组件的分离,我们需要把与 与登录相关的逻辑 都封装在 vuex 中进行。

这些业务是 前端用户登录的标准逻辑,大家在以后的前端登录业务处理中,也可以按照此逻辑进行。

4. 封装 action 调用登录接口

首先我们需要先获取到用户的信息,用作登录时的请求参数:
my-login

<script>
import { mapActions } from 'vuex';
export default {methods: {...mapActions('user', ['login']),/*** 获取用户信息*/getUserInfo() {// 展示加载框uni.showLoading({title: '加载中'});uni.getUserProfile({desc: '登录后可同步数据',success: async (obj) => {// 调用 action ,请求登录接口await this.login(obj);},fail: () => {uni.showToast({title: '授权已取消',icon: 'error',mask: true});},complete: () => {// 隐藏loadinguni.hideLoading();}});}}
};
</script>

api/user.js

import request from '../utils/request';/*** 获取用户基本信息*/
export function login(data) {return request({url: '/sys/login',method: 'POST',data,});
}/*** 微信用户授权登录,携带appid和code参数,调用后端接口获取Openid*/
export function loginAuth(data) {return request({url: '/wx/user/' + data.appid + '/login/',data: {code: data.code,},});
}

store/user.js

import { login } from 'api/user';
export default {namespaced: true,state: () => {return {};},actions: {/*** 完成登录*/async login(context, userProfile) {console.log(userProfile);// 用户数据const rawData = userProfile.userInfo;// 调用登录接口const { data: res } = await login({signature: userProfile.signature,iv: userProfile.iv,nickName: rawData.nickName,gender: rawData.gender,city: rawData.city,province: rawData.province,avatarUrl: rawData.avatarUrl});// TODO: 登录逻辑console.log(res);}}
};

store/index.js

import user from './modules/user';const store = new Vuex.Store({modules: {user}
});
5. 保存用户登录状态

用户的登录状态需要被保存到 vuex 中,同时需要进行 本地存储

store/user.js

import { login } from 'api/user';
const STORAGE_KEY = 'user-info';
const TOKEN_KEY = 'token';
export default {namespaced: true,state: () => {return {// 用户 tokentoken: uni.getStorageSync(TOKEN_KEY) || '',// 用户信息userInfo: uni.getStorageSync(STORAGE_KEY) || {}};},mutations: {/*** 保存 token 到 vuex*/setToken(state, token) {state.token = token;this.commit('user/saveToken');},/*** 保存 token 到 本地存储*/saveToken(state) {uni.setStorage({key: TOKEN_KEY,data: state.token});},/*** 保存 用户信息 到 vuex*/setUserInfo(state, userInfo) {state.userInfo = userInfo;this.commit('user/saveUserInfo');},/*** 保存 用户信息 到 本地存储*/saveUserInfo(state) {uni.setStorage({key: STORAGE_KEY,data: state.userInfo});}},actions: {/*** 完成登录*/async login(context, userProfile) {...// 登录逻辑this.commit('user/setToken', res.token);this.commit('user/setUserInfo', JSON.parse(userProfile.rawData));}}
};
6. 成已登录的用户视图

token 存在时,表示用户已经登录了,此时需要 展示用户登录完成的视图:

my-login

<template><view class="my-container"><!-- 用户未登录 --><block v-if="!token">...</block><!-- 已登录 --><block v-else><image class="avatar avatar-img" :src="userInfo.avatarUrl" mode="scaleToFill" /><view class="login-desc">{{ userInfo.nickName }}</view><button class="login-btn" type="default" @click="onLogoutClick">退出登录</button></block></view>
</template><script>
import { mapState, mapActions } from 'vuex';
export default {name: 'my-login',data() {return {};},computed: {...mapState('user', ['token', 'userInfo'])},
};
</script>
6. 现退出登录功能

store/user

export default {...mutations: {.../*** 删除 token*/removeToken(state) {state.token = '';this.commit('user/saveToken');},.../*** 删除用户信息*/removeUserInfo(state) {state.userInfo = {};this.commit('user/saveUserInfo');}},actions: {.../*** 退出登录*/logout(context) {this.commit('user/removeToken');this.commit('user/removeUserInfo');}}
};

my-login

<template><view class="my-container">...<!-- 已登录 --><block v-else>...<button class="login-btn" type="default" @click="onLogoutClick">退出登录</button></block></view>
</template><script>
export default {...methods: {...mapActions('user', ['login', 'logout']),.../*** 退出登录*/onLogoutClick() {uni.showModal({title: '提示',content: '退出登录将无法同步数据哦~',success: ({ confirm, cancel }) => {if (confirm) {this.logout();}}});}}
};
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/516246.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue 组件开发 - 数据输入框组件

目录 设计通用组件的一般思路组件效果1. HTML结构2. index.js3. input-number.js3.1 input-number.js代码注解设计通用组件的一般思路 明确需求; 设计API(组件的API:只来自props、events 和 slots); 2.1 确定命名、规则 2.2 编写业务逻辑 即使逻辑的第一版没做好,后续还可…

活动预告 | 2020移动云客户高端峰会即将揭幕,邀您一起携手云端!

一直以来&#xff0c;移动云致力于不断丰富自身产品体系&#xff0c;延伸服务深度和广度&#xff0c;提供“云网一体、贴身服务、随心定制、安全可控”的云服务&#xff0c;致力成为5G时代你身边的智慧云。依托中国移动网络资源与本地化服务团队&#xff0c;移动云为政府、互联…

如何在CDN边缘节点执行你的JavaScript?

Serverless和边缘计算都是目前云计算领域备受瞩目的研究和应用方向。做为拥有超过130Tbps带宽分发能力的阿里云CDN&#xff0c;巨大的边缘网络有超过2800个节点遍布全球&#xff0c;如何将中心源站的计算能力下沉到边缘节点&#xff0c;进一步降低客户端访问延时进而提升用户体…

微信小程序+腾讯地图 获取定位与地图选点插件

文章目录一、思路二、逆地址解析2.1. app.json2.2. 页面加入2.3. 后台代码三、地图插件调用3.1. app.json加入3.2. js页面加入3.3. wxml页面成功截图:腾讯位置服务官网&#xff1a; https://lbs.qq.com一、思路 通过 wx.getLocation 返回经纬度传到后台&#xff0c;后台调用腾…

前端工具安装和运行相关

目录1. nodemon 运行出错&#xff1a;无法运行脚本2. XXX~待续1. nodemon 运行出错&#xff1a;无法运行脚本 无法加载文件 C:\Users\xxx\AppData\Roaming\npm\nodemon.ps1&#xff0c;因为在此系统上禁止运行脚本。 解决办法&#xff1a; 管理员身份打开powerShell&#xf…

友盟+联合EB级云数据 实现友盟域和企业私域数据全面融合

友盟联合EB级云数据 实现友盟域和企业私域数据全面融合 2020-04-28 互联网大数据计算 国内领先的第三方全域数据智能服务商友盟&#xff0c;联合阿里云EB级云数据仓库MaxCompute为企业提供面向分析的&#xff0c;实现友盟域数据与企业私域数据全面融合的自助分析服务“U-DOP…

微信小程序之实现地图定位(使用腾讯位置服务插件)

文章目录一. 腾讯位置服务插件简介1. 完整的地图能力2. 地图插件的优势二. 开通腾讯位置服务三、接入插件四、 开发者密钥配置五、插件的使用一. 腾讯位置服务插件简介 1. 完整的地图能力 腾讯位置服务基于微信提供的小程序插件能力&#xff0c;专注于&#xff08;围绕&#…

分享16个经典的免费UI素材网站

免费字体 www.fontspace.com 一键AI抠图 www.remove.bg/zh 在线PS工具/可以转换Sketch文件

单人开发场景下的测试环境实践

在软件研发过程中&#xff0c;“测试环境”是部署最频繁、也是开发者使用最频繁的一种运行环境&#xff0c;稳定而易用的测试环境能够极大提高开发者的工作效率和幸福感。为更好的将阿里巴巴在测试环境管理方面的实践和经验跟广大开发者分享&#xff0c;《云效说码》策划了《阿…

函数计算如何访问 PostgreSQL 数据库

函数计算&#xff08;Function Compute&#xff09;&#xff1a;函数计算 是事件驱动的全托管计算服务。使用函数计算&#xff0c;您无需采购与管理服务器等基础设施&#xff0c;只需编写并上传代码。函数计算为您准备好计算资源&#xff0c;弹性地可靠地运行任务&#xff0c;并…

智能可穿戴迎来长续航焕新活力 出门问问TicWatch Pro 3即将国内上市

人工智能独角兽公司出门问问将于10月21日面向国内市场正式发布全新一代旗舰级全智能手表TicWatch Pro 3&#xff08;4G版&#xff09;。出门问问携手新浪科技举行新品线上发布会&#xff0c;出门问问创始人兼CEO李志飞以及出门问问研发高级总监张博将以直播形式与消费者见证Tic…

uniapp 微信小程序打包发布

文章目录一、打包小程序1. HBuilder X打包2. 小程序发行3. 点击上传4. 扫码体验5. 正式版本一、打包小程序 1. HBuilder X打包 选中项目-点击发行&#xff08;U&#xff09;- 小程序-(微信仅适用于uniapp)&#xff08;W&#xff09; 2. 小程序发行 填写微信小程序名称和微…

祝贺!两位 Apache Flink PMC 喜提 Apache Member

摘要&#xff1a;近期 Apache 软件基金会&#xff08;以下简称 ASF &#xff09;举行了一年一度的董事会选举会议&#xff0c;两位 Apache Flink PMC 当选为 2020 年 ASF 新成员&#xff0c;即 Apache Member。目前&#xff0c;国内&#xff08;华人&#xff09;近 30 位 Apach…

Iceberg 在基于 Flink 的流式数据入库场景中的应用

本文以流式数据入库的场景为基础&#xff0c;介绍引入 Iceberg 作为落地格式和嵌入 Flink sink 的收益&#xff0c;并分析了当前可实现的框架及要点。 应用场景 流式数据入库&#xff0c;是大数据和数据湖的典型应用场景。上游的流式数据&#xff0c;如日志&#xff0c;或增量…

uniapp H5页面打包发布

文章目录1. 打开 HBuilder2. 打开项目3. 点击发行4. 等待项目编译5. 查看路径6. 安装7. 启动1. 打开 HBuilder 2. 打开项目 打开当前要打包的项目 3. 点击发行 &#xff0c;找到【网站 - PC web 或手机 H5 】 确认【网站标题】&#xff0c;无需【网站域名】&#xff0c;直…

Python 让我再次在女同学面前长脸了!(真实案例)

事情是经过这样的&#xff1a;晚上在家王者的时候&#xff0c;微信突然弹出了一条好友添加提醒&#xff0c;一看昵称&#xff0c;居然是我们大学的班花&#xff01;&#xff01;&#xff01;这真是奇怪了&#xff0c;我之前连班花的微信都没加上&#xff0c;这次却突然主动加我…

【CDN】最近,你的APP崩了吗?

过去几个月里&#xff0c;#xxx崩了#这个话题频繁出现在热搜榜上&#xff0c;让不少程序员小哥哥瑟瑟发抖。 从疫情宅家时期著名的视频APP“三连崩”&#xff0c;到全面复工开课后的在线教育平台与办公软件频繁宕机&#xff0c;再到报复性消费引发的点餐系统接连“爆炸”&#x…

1024程序员节重要议程曝光,开源技术英雄会聊开源“真心话”

10 月 23-25 日&#xff0c;由 CSDN 等多家单位精心筹划的“长沙 中国 1024 程序员节”将盛大举行。程序员节活动以开源为主议题&#xff0c;包括&#xff1a;2场岳麓尖峰对话&#xff1b;2020 开源技术英雄大会&#xff1b;10 场热门技术分论坛/峰会&#xff1b;创意集市&…

绿网天下:上云解决系统安全和安全合规

公司简介 绿网天下&#xff08;福建&#xff09;网络科技股份有限公司&#xff08;以下简称绿网天下&#xff09;成立于2006年&#xff0c;总部设于中国厦门软件园生产基地。绿网天下是基于网络安全为基础的 K12 在线教育服务提供商&#xff0c;累计活跃用户数超千万。公司专注…

一键快速生成 Vue 的 HTML页面结构代码

目录 1. 创建配置文件2. 使用3. 配置说明4. 注意VS Code除了使用 !+Tab 在html文件中快速创建html结构代码之外,还可以自己定义代码段,这里分享如下在 Vue 环境下快速通过成 html 结构。 1. 创建配置文件 第一步 文件 ==> 首选项 ==>用户代码片段 第二步 搜索框中输…