使用 UniApp 实现登录状态管理与持久化
前言
在移动应用开发中,登录状态的管理与持久化是保障用户体验和数据安全的基础。无论是社交、购物还是工具类App,用户登录后的身份验证、会话保持、自动续签等都离不开合理的状态管理。本文将以 UniApp 为例,详细讲解如何实现登录状态的管理与持久化,并结合鸿蒙(HarmonyOS)平台的适配与优化建议。
一、需求与设计思路
1. 需求分析
- 登录后保存用户身份信息,支持自动登录
- 支持退出登录,清除相关数据
- 登录状态全局可用,便于页面间访问
- 数据持久化,兼容鸿蒙平台的本地存储
- 安全性考虑,防止敏感信息泄露
2. 设计思路
- 使用 Vuex 或全局变量管理登录状态
- 结合
uni.setStorageSync
/uni.getStorageSync
实现本地持久化 - 登录、登出时同步更新内存与本地存储
- 页面加载时自动检测并恢复登录状态
- 结合拦截器或导航守卫,保护需要登录的页面
二、核心代码实现
1. Vuex 状态管理
// store/index.js
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
const store = new Vuex.Store({
state: {
userInfo: null, // 用户信息
token: '', // 登录令牌
},
mutations: {
setUser(state, payload) {
state.userInfo = payload.userInfo;
state.token = payload.token;
},
clearUser(state) {
state.userInfo = null;
state.token = '';
},
},
actions: {
login({ commit }, { userInfo, token }) {
commit('setUser', { userInfo, token });
uni.setStorageSync('userInfo', userInfo);
uni.setStorageSync('token', token);
},
logout({ commit }) {
commit('clearUser');
uni.removeStorageSync('userInfo');
uni.removeStorageSync('token');
},
restore({ commit }) {
const userInfo = uni.getStorageSync('userInfo');
const token = uni.getStorageSync('token');
if (userInfo && token) {
commit('setUser', { userInfo, token });
}
},
},
});
export default store;
2. 登录与登出逻辑
// 登录页面示例
methods: {
async doLogin() {
// 这里以模拟接口为例,实际应调用后端API
const res = await uni.request({
url: 'https://api.example.com/login',
method: 'POST',
data: { username: this.username, password: this.password },
});
if (res.data && res.data.token) {
this.$store.dispatch('login', {
userInfo: res.data.userInfo,
token: res.data.token,
});
uni.showToast({ title: '登录成功', icon: 'success' });
uni.navigateBack();
} else {
uni.showToast({ title: '登录失败', icon: 'none' });
}
},
doLogout() {
this.$store.dispatch('logout');
uni.showToast({ title: '已退出登录', icon: 'none' });
uni.reLaunch({ url: '/pages/login/login' });
},
}
3. 页面自动恢复登录状态
// App.vue
onLaunch() {
this.$store.dispatch('restore');
}
4. 路由守卫保护页面
// main.js
import store from './store';
uni.addInterceptor('navigateTo', {
invoke(e) {
// 需要登录的页面路径
const protectedPages = ['/pages/user/profile', '/pages/order/list'];
if (protectedPages.includes(e.url) && !store.state.token) {
uni.showToast({ title: '请先登录', icon: 'none' });
setTimeout(() => {
uni.navigateTo({ url: '/pages/login/login' });
}, 500);
return false;
}
return true;
},
});
三、鸿蒙平台适配与优化建议
- 本地存储兼容:鸿蒙平台支持 uni-app 的本地存储API,建议优先使用
uni.setStorageSync
,保证数据可靠。 - 安全性提升:敏感信息如 token 建议加密存储,可结合鸿蒙原生 JSAPI 实现更高安全级别。
- 多端同步:如有多设备登录需求,可结合云端同步方案。
- 性能优化:避免频繁读写本地存储,登录状态建议只在必要时同步。
- 生命周期适配:鸿蒙部分设备休眠/唤醒时建议在
onShow
钩子中再次校验登录状态。
四、实际应用案例
- 电商App:用户登录后可自动恢复购物车、订单等信息,退出登录后数据即时清除。
- 社区App:登录后可全局访问个人资料、消息等,未登录时自动跳转登录页。
- 工具类App:登录状态持久化,支持多次启动自动登录。
五、总结与展望
登录状态管理与持久化是移动端开发的基础能力。通过 UniApp 的全局状态管理和本地存储API,我们可以高效实现登录状态的管理与持久化,并针对鸿蒙平台做出优化。未来还可结合原生能力提升安全性和多端体验。希望本文的讲解和代码示例能为你的项目带来帮助,欢迎留言交流更多鸿蒙适配经验!