uni-app 中保持用户登录状态

简介: 在应用中保持登录状态是一个应用常见的需求,本文简单介绍下在 uni-app 中如何保存用户登录状态。简介uni-app 中不支持读写 cookie,所以不能如传统的应用那样通过读取 cookie 来判断是否是登录状态。

在应用中保持登录状态是一个应用常见的需求,本文简单介绍下在 uni-app 中如何保存用户登录状态。

简介

uni-app 中不支持读写 cookie,所以不能如传统的应用那样通过读取 cookie 来判断是否是登录状态。

在 uni-app 进行登录操作时,可以将需要校验的数据放在 uni.request 的 data 中,也可以在 header 里设置 token,使用 token 进行登录状态校验。

流程:首页为未登录状态 => 进行登录 => 首页状态改变 => 退出应用再次进入仍然是已登录状态。

login

vuex

使用 vuex 进行管理登陆状态和保存用户信息,下面是部分代码。

const store = new Vuex.Store({
    state: {
        uerInfo: {},
        hasLogin: false
    },
    mutations: {
        login(state, provider) {//改变登录状态
            state.hasLogin = true
            state.uerInfo.token = provider.token
            state.uerInfo.userName = provider.user_name
            uni.setStorage({//将用户信息保存在本地
                key: 'uerInfo',
                data: provider
            })
        },
        logout(state) {//退出登录
            state.hasLogin = false
            state.uerInfo = {}
            uni.removeStorage({
                key: 'uerInfo'
            })
        }
    }
})

登录

在 login.vue(登录页面)输入用户名密码后,调用 uni.request 进行登录,登录成功后调用 vuex 的方法改变应用的登陆状态。

<script>
    import {
        mapMutations
    } from 'vuex';
    export default {
        methods: {
            bindLogin(e) {
                let name = e.detail.value.nameValue,
                    password = e.detail.value.passwordValue;
                uni.request({
                    url: `${this.$serverUrl}/login.php`,
                    header: {
                        "Content-Type": "application/x-www-form-urlencoded"
                    },
                    data: {
                        "username": name,
                        "password": password
                    },
                    method: "POST",
                    success: (e) => {
                        if (e.data.code === 0) {//登录成功后改变vuex的状态,并退出登录页面
                            this.login(e.data)
                            uni.navigateBack()
                        }
                    }
                })
            },
            ...mapMutations(['login'])
        }
    }
</script>

改变首页状态

通过 vuex 中保存的 hasLogin 判断是否是登录状态,从而显示不同的内容。

<template>
    <view class="page">
        <view v-if="!hasLogin">现在是未登录状态,点击按钮进行登录</view>
        <view v-else>现在是登录状态,您的用户id是:{{uerInfo.userName}}</view>
        <button type="primary" @click="bindLogin">{{hasLogin ? '退出登录' : '登录'}}</button>
    </view>
</template>
<script>
    import {
        mapState,
        mapMutations
    } from 'vuex';
    export default {
        computed: mapState(['hasLogin','uerInfo']),
        methods: {
            ...mapMutations(['logout']),
            bindLogin() {
                if (this.hasLogin) {
                    this.logout()
                } else {
                    uni.navigateTo({
                        url: '/pages/login/login'
                    })
                }
            }
        }
    }
</script>

再次进入应用

在 App.vue 中判断用户是否保存用户信息 "uerInfo",如果保存则认为是登录状态,未保存则为未登录状态。

App.vue 中得到用户信息后需要同步改变 vuex 的状态,使所有页面都能共享登陆状态与用户信息。

<script>
    import {
        mapMutations
    } from 'vuex';
    export default {
        onLaunch: function () {
            uni.getStorage({//获得保存在本地的用户信息
                key: 'uerInfo',
                success:(res) => {
                    this.login(res.data);
                    uni.request({// 再次校验并刷新token的有效时间
                        url: `${this.$serverUrl}/auth.php`,
                        header: {
                            "Content-Type": "application/x-www-form-urlencoded",
                            "Token":res.data.token
                        },
                        data: {
                            "username":res.data.user_name
                        },
                        method: "POST",
                        success: (e) => {
                            if (e.statusCode === 200 && e.data.code === 0) {
                                this.login(e.data);
                            }
                        }
                    })
                }
            });
        },
        methods: {
            ...mapMutations(['login'])
        }
    }
</script>

附件为demo,可直接在 HBuilderX 中运行体验整个登录流程。
附件下载

相关文章
|
JavaScript 数据库
uni-app的多环境部署配置
分享下如何对uni-app项目进行多环境打包部署改造
1882 0
|
6月前
|
消息中间件 存储 移动开发
【消息中间件】原生PHP对接Uni H5、APP、微信小程序实时通讯消息服务
【消息中间件】原生PHP对接Uni H5、APP、微信小程序实时通讯消息服务
|
开发工具 数据安全/隐私保护 开发者
Uni开发的app,使用Windows S10,放在ios上,全程跟着一个马平川。
其实在我写这篇文章的时候,很多版本的app都已经更新了,但是突然有一天我觉得如果我不把它们记录下来,它们就会被遗忘,现在越来越多的人在用uniapp开发app。
Uni开发的app,使用Windows  S10,放在ios上,全程跟着一个马平川。
|
关系型数据库 MySQL API
Uni-App - 实战《悦读》之创建用户数据表,完成App端用户登录功能
Uni-App - 实战《悦读》之创建用户数据表,完成App端用户登录功能
187 0
|
JSON 小程序 数据格式
Uni-App基本使用方法
Uni-App基本使用方法
203 0
Uni-App基本使用方法
|
存储 缓存 API
uni-app 的 storage 数据缓存
uni-app中使用storage进行 数据缓存
|
JSON 前端开发 API
使用uni-app封装request
封装request请求
423 0
|
移动开发 开发框架 JavaScript
uni-app 与 Vue H5 项目通讯
uni-app 与 Vue H5 混合开发app的通讯方法
3246 0
uni-app 与 Vue H5 项目通讯
uni-app导航栏自定义配置|仿App原生导航条
uniapp自带的原生导航条能满足一般项目需求,但是对于一些复杂导航栏,如:京东、淘宝、微信顶部导航,这时就需要进行自定义配置了。基于uniapp实现的自定义仿微信导航栏uni_headerBar,支持背景渐变、标题居左/居中、搜索条、按钮支持文字/字体图标/图片 uniApp原生导航栏 uni-app原生导航栏也能实现一些顶部自定义按钮+搜索框,只需在page.json里面做一些配置即可。
4660 0
|
移动开发 开发工具 Android开发
uni-app总体介绍
uni-app 是一个使用 [Vue.js](https://vuejs.org/) 开发**跨平台**应用的前端框架,开发者编写一套代码,可编译到iOS、Android、H5、小程序等多个平台。
2776 0