【三】鸡汤来咯开发学习笔记-43

前端 · 2024-07-31

1.把\chiken\uni_modules\uni-id-pages\common\store.js拷贝一份到我们创建的stores目录下并改名为user.js,然后改造成pinia使用的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)  //是否登录
    
    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}
})

然后再self.vue中引入我们改造后的js

import { useUserStore } from "../../stores/user";
const UserStore = useUserStore();

Theme Jasmine by Kent Liao