如何在uniapp中实现登录功能

在当前移动端APP开发的背景下,登录功能是一个极其基础的常见功能。很多uniapp的开发者都会碰到如何在uniapp中实现登录功能的问题。本篇文章将分享如何使用uniapp实现一般性的登录功能。具体来说,将涉及到uniapp中使用模态框进行用户输入,以及使用vuex进行状态管理。在文章的最后还将简单介绍如何在uniapp中实现sessionStorage和setStorageSync功能。最后附上代码实例供读者参考。

1.初始化uniapp项目

在开始实现登录功能之前,我们需要初始化一个uniapp项目。下面是命令行中初始化uniapp项目的代码:

npm install -g @vue/cli-service-global

vue create -p dcloudio/uni-preset-vue my-project

2.创建登录页面

首先,我们需要新建一个登录页面,页面中包括两个输入框和一个登录按钮。在此基础上,我们使用uni-app的模态框组件对输入框进行封装,这样可以方便地获取用户的输入信息。代码如下:

//login.vue

<template>

<view class="container">

<view class="login-form">

<input-box :placeholder="'请输入用户名'" :value.sync="username" @click.native="showInput('username')" />

<input-box :placeholder="'请输入密码'" :value.sync="password" :password="true" @click.native="showInput('password')" />

</view>

<uni-button class="login-btn" @click="doLogin">登 录</uni-button>

<uni-input :placeholder="inputTitle" v-model="inputContent" :focus="focus" @confirm="confirmInput"></uni-input>

</view>

</template>

<script>

import InputBox from '@/components/input-box.vue';

import { mapActions } from 'vuex';

export default {

data() {

return {

username: '',

password: '',

inputTitle: '请输入用户名',

inputContent: '',

focus: false

}

},

components: {

InputBox

},

methods: {

...mapActions(['login']),

showInput(type) {

if (type === 'username') {

this.inputTitle = '请输入用户名';

this.inputContent = this.username;

} else if (type === 'password') {

this.inputTitle = '请输入密码';

this.inputContent = this.password;

}

this.focus = true;

},

confirmInput() {

if (this.inputTitle == '请输入用户名') {

this.username = this.inputContent;

} else if (this.inputTitle === '请输入密码') {

this.password = this.inputContent;

}

},

async doLogin() {

if (!this.username) {

uni.showToast({

title: '请输入用户名',

icon: 'none'

});

return;

}

if (!this.password) {

uni.showToast({

title: '请输入密码',

icon: 'none'

});

return;

}

try {

const res = await this.login({

username: this.username,

password: this.password

});

if (res) {

uni.setStorageSync('userInfo', res);

uni.reLaunch({

url: '/pages/index/index'

});

} else {

uni.showToast({

title: '登录失败,请重试!',

icon: 'none'

});

}

} catch (error) {

console.log(error);

uni.showToast({

title: '登录失败,请重试!',

icon: 'none'

});

}

}

}

}

</script>

3.使用VUEX管理登录状态

在uniapp中尽量使用vuex对状态进行管理,将数据分离出来,减少对HTML中的数据操作和改变数据的副作用。这里我们使用vuex管理登录状态。如果登录成功,我们使用vuex存储登录态,这样就可以在其他页面中共享用户信息。在实际开发中,我们可以在vuex的store中管理登录状态。代码如下:

//store/index.js

import Vue from 'vue';

import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({

state: {

userInfo: {}

},

mutations: {

setUserInfo(state, payload) {

state.userInfo = payload;

}

},

actions: {

async login({ commit }, req) {

// 登录逻辑

}

},

modules: {}

});

4.使用sessionStorage以及setStorageSync存储用户信息

在uniapp中,我们使用uni-app的内置api进行存储。在本例中,我们使用sessionStorage实现对用户信息的添加删除和修改。我们在登录成功的时候,调用uni.setStorageSync('userInfo', res);保存用户信息。代码如下:

async doLogin() {

if (!this.username) {

uni.showToast({

title: '请输入用户名',

icon: 'none'

});

return;

}

if (!this.password) {

uni.showToast({

title: '请输入密码',

icon: 'none'

});

return;

}

try {

const res = await this.login({

username: this.username,

password: this.password

});

if (res) {

uni.setStorageSync('userInfo', res);

uni.reLaunch({

url: '/pages/index/index'

});

} else {

uni.showToast({

title: '登录失败,请重试!',

icon: 'none'

});

}

} catch (error) {

console.log(error);

uni.showToast({

title: '登录失败,请重试!',

icon: 'none'

});

}

}

将用户信息存储在sessionStorage中的好处是用户刷新页面后登录态依然有效,在整个会话中保证用户信息的持续性。另外,我们还可以使用setStorageSync记录用户操作,如下代码:

//logout.js

export function logout() {

uni.setStorageSync('isLogin', false);

uni.setStorageSync('userInfo', {});

uni.reLaunch({

url: '/pages/index/index'

});

}

我们可以使用uni.getStorageSync('key')来获取本地内存中的数据。同样的,我们可以使用uni.removeStorage删除本地内存中的某条信息,如下:

uni.removeStorage({

key: 'userInfo',

success: function (res) {

console.log(res.data);

}

});

结语

在本文中,我们简单介绍了如何使用uniapp实现登录功能,以及使用vuex管理登录状态,使用sessionStorage和setStorageSync存储用户信息。 在实际开发中,还需要根据业务做相应的修改,增加对用户信息的合法性、完整性、唯一性等校验,实现更为完整的功能。下面的代码可以作为本文的最终完整代码供读者参考,需要读者仔细考察本文的思路,然后运用到自己的业务中。

//store/index.js

import Vue from 'vue';

import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({

state: {

userInfo: {}

},

mutations: {

setUserInfo(state, payload) {

state.userInfo = payload;

}

},

actions: {

async login({ commit }, req) {

//此处省略登录逻辑

}

},

modules: {}

});

//login.vue

<template>

<view class="container">

<view class="login-form">

<input-box :placeholder="'请输入用户名'" :value.sync="username" @click.native="showInput('username')" />

<input-box :placeholder="'请输入密码'" :value.sync="password" :password="true" @click.native="showInput('password')" />

</view>

<uni-button class="login-btn" @click="doLogin">登 录</uni-button>

<uni-input :placeholder="inputTitle" v-model="inputContent" :focus="focus" @confirm="confirmInput"></uni-input>

</view>

</template>

<script>

import InputBox from '@/components/input-box.vue';

import { mapActions } from 'vuex';

export default {

data() {

return {

username: '',

password: '',

inputTitle: '请输入用户名',

inputContent: '',

focus: false

}

},

components: {

InputBox

},

methods: {

...mapActions(['login']),

showInput(type) {

if (type === 'username') {

this.inputTitle = '请输入用户名';

this.inputContent = this.username;

} else if (type === 'password') {

this.inputTitle = '请输入密码';

this.inputContent = this.password;

}

this.focus = true;

},

confirmInput() {

if (this.inputTitle == '请输入用户名') {

this.username = this.inputContent;

} else if (this.inputTitle === '请输入密码') {

this.password = this.inputContent;

}

},

async doLogin() {

if (!this.username) {

uni.showToast({

title: '请输入用户名',

icon: 'none'

});

return;

}

if (!this.password) {

uni.showToast({

title: '请输入密码',

icon: 'none'

});

return;

}

try {

const res = await this.login({

username: this.username,

password: this.password

});

if (res) {

uni.setStorageSync('userInfo', res);

uni.reLaunch({

url: '/pages/index/index'

});

} else {

uni.showToast({

title: '登录失败,请重试!',

icon: 'none'

});

}

} catch (error) {

console.log(error);

uni.showToast({

title: '登录失败,请重试!',

icon: 'none'

});

}

}

}

}

</script>

//logout.js

export function logout() {

uni.setStorageSync('isLogin', false);

uni.setStorageSync('userInfo', {});

uni.reLaunch({

url: '/pages/index/index'

});

}