Neil_HL
Neil_HL
  • 发布:2019-03-06 16:53
  • 更新:2023-06-02 13:03
  • 阅读:82801

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

分类:uni-app

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

简介

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

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

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

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 中运行体验整个登录流程。

48 关注 分享
Trust UserX 今天回复我了吗 1***@qq.com Geeker 3***@qq.com a***@iwuye.com 秋天无风 lobtao 珍惜是福 a***@qq.com ppanda 下雨了 x***@qq.com 1***@qq.com 小童 g***@qq.com IT星空 bzliukai w***@nanshan.com.cn 8***@qq.com 5***@qq.com l***@mzsat.cn 1***@163.com 吗咿呀嘿 1***@qq.com axl mylove 黎旭 狂澜科技 4***@qq.com 昨夜悟空 w***@163.com Dlog_帅 uniuk cy3l 8***@qq.com 大表锅 x***@163.com 1***@qq.com 1***@qq.com l***@163.com phpoks w***@126.com 我不是大v 1***@163.com 2***@qq.com hongyan

要回复文章请先登录注册

[已删除]

[已删除]

回复 tingtingzouzou :
wx 13192733603
2020-03-03 18:20
tingtingzouzou

tingtingzouzou

回复 [已删除] :
你好,方便提供一下相关的demo吗
2020-03-03 11:24
3***@qq.com

3***@qq.com

### 奇怪了
```
success: (e) => {
if (e.data.code === 0) { //登录成功后改变vuex的状态,并退出登录页面
this.login(e.data)
uni.navigateBack()
}
}
```
上面的登录调用了 `this.login(e.data) ` 设置了下面的store就不生效,但是App.vue 获得保存在本地的用户信息后的调用,就能设置下面的生效,奇怪了,请问大佬为什么呀?
```
state.uerInfo.token = provider.token
state.uerInfo.userName = provider.user_name
```
2020-02-27 02:14
2***@qq.com

2***@qq.com

let accessToken = uni.getStorageSync('accessToken');
if(accessToken){
uni.switchTab({
url: '/pages/home/home',
success: res => {},
fail: () => {},
complete: () => {}
});
}
这样写在app.vue里面,为什么还是先执行的page里面的启动页,然后才进判断
2019-12-24 18:12
欧系渣渣辉

欧系渣渣辉

可以使用axios拦截器将请求头的设置和token都封装到里面会更好
2019-10-25 09:57
IT星空

IT星空

回复 IT星空 :
知道了
2019-10-25 09:18
IT星空

IT星空

url: `${this.$serverUrl}/login.php`, 这个地址是从哪里来的?
2019-10-24 11:47
2***@qq.com

2***@qq.com

有全局变量,定义 保存cookie的吗?直接 然后直接读取的
2019-09-28 12:26
Neil_HL

Neil_HL (作者)

回复 l***@163.com :
看看是否代码写错,运行附件demo试试
2019-09-16 11:32
l***@163.com

l***@163.com

为什么app用vuex没有效果
2019-09-16 10:13