【Uniapp-Vue3】开发userStore用户所需的相关操作

在项目根路径下创建的stores文件夹中创建user.js文件

并将以下内容复制到user.js中

复制代码
import {ref} from "vue"
import { defineStore } from 'pinia';
const uniIdCo = uniCloud.importObject("uni-id-co")
const db = uniCloud.database();
const usersTable = db.collection('uni-id-users')

export const useUserStore = defineStore("user",()=>{
	let hostUserInfo = uni.getStorageSync('uni-id-pages-userInfo')||{}
	const userInfo = ref(hostUserInfo);
	const hasLogin= ref(Object.keys(hostUserInfo).length != 0);
	
	
	// data不为空,表示传递要更新的值(注意不是覆盖是合并),什么也不传时,直接查库获取更新
	async function updateUserInfo(data = false) {
		if (data) {
			usersTable.where('_id==$env.uid').update(data).then(e => {
				// console.log(e);
				if (e.result.updated) {
					uni.showToast({
						title: "更新成功",
						icon: 'none',
						duration: 3000
					});
					setUserInfo(data)
				} else {
					uni.showToast({
						title: "没有改变",
						icon: 'none',
						duration: 3000
					});
				}
			})
	
		} else {
			const uniIdCo = uniCloud.importObject("uni-id-co", {
				customUI: true
			})
			try {
				let res = await usersTable.where("'_id' == $cloudEnv_uid")
					.field('mobile,nickname,username,email,avatar_file')
					.get()
	
				const realNameRes = await uniIdCo.getRealNameInfo()
	
				// console.log('fromDbData',res.result.data);
				setUserInfo({
					...res.result.data[0],
					realNameAuth: realNameRes
				})
			} catch (e) {
				setUserInfo({},{cover:true})
				console.error(e.message, e.errCode);
			}
		}
	}
	
	
	async function setUserInfo(data, {cover}={cover:false}) {
		// console.log('set-userInfo', data);
		let _userInfo = cover?data:Object.assign(userInfo.value,data)
		userInfo.value = Object.assign({},_userInfo)
		hasLogin.value = Object.keys(userInfo.value).length != 0
		// console.log('store.userInfo', store.userInfo);
		uni.setStorageSync('uni-id-pages-userInfo', userInfo.value)
		return data
	}
	
	
	async function logout() {
		// 1. 已经过期就不需要调用服务端的注销接口	2.即使调用注销接口失败,不能阻塞客户端
		if(uniCloud.getCurrentUserInfo().tokenExpired > Date.now()){
			try{
				await uniIdCo.logout()
			}catch(e){
				console.error(e);
			}
		}
		uni.removeStorageSync('uni_id_token');
		uni.setStorageSync('uni_id_token_expired', 0)		
		uni.$emit('uni-id-pages-logout')
		setUserInfo({},{cover:true})
	}
	
	//登录后的操作
	function loginSuccess(e = {}){
		const {
			showToast = true, toastText = '登录成功', autoBack = true, uniIdRedirectUrl = '', passwordConfirmed
		} = e
		// console.log({toastText,autoBack});
		if (showToast) {
			uni.showToast({
				title: toastText,
				icon: 'none',
				duration: 3000
			});
		}
		updateUserInfo()	
		uni.$emit('uni-id-pages-login-success')	
	}
			
	return {userInfo,hasLogin,loginSuccess,updateUserInfo}
})

在updateUserInfo函数中修改需要的字段

具体字段可以在database文件下的uni-id-users.schema数据表中查看

我们在获取的时候可以通过如下方式对字段取别名:

字段 as 别名

相关推荐
大数据魔法师1 小时前
Bootstrap项目 - 个人作品与成就展示网站
前端·bootstrap·html
LaughingZhu4 小时前
PH热榜 | 2025-05-29
前端·人工智能·经验分享·搜索引擎·产品运营
汪子熙7 小时前
Angular i18n 资源加载利器解析: i18n-http-backend
前端·javascript·面试
天天扭码7 小时前
在React项目中实现富文本编辑文章并发布
前端·react.js·github
Yehong7 小时前
nuxt实现50个前端小创意(1)——前端基础学习
前端·vue.js
拉不动的猪7 小时前
回顾vue3组件在运行过程中的编译提升
前端·vue.js·trae
天天扭码7 小时前
前端必备 | 一文掌握React的Token管理
前端·javascript·react.js
烛阴7 小时前
用Joi守住数据防线!Node.js/前端必备校验神器入门与进阶
前端·javascript
神秘敲码人8 小时前
前端面试题-HTML篇
前端·面试·html
杏仁海棠花饼8 小时前
杏仁海棠花饼的学习日记第十四天CSS
前端·css·学习