Files
smartDriveEEUniApp/common/store.js
2026-02-01 09:49:48 +08:00

227 lines
6.3 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import pagesJson from '@/pages.json'
import { getApiUrl } from '@/common/config.js'
// 由于 store.js 在主包中,无法直接访问子包中的 config.js
// 使用默认配置值
const config = {
setPasswordAfterLogin: false // 默认值,如果需要修改,可以在这里调整
}
// 获取用户信息,避免在模块加载时就执行 uni-app API
let hostUserInfo = null
function getHostUserInfo() {
// 总是从存储中读取最新值,确保登录状态的实时性
// 特别是在微信小程序中,页面跳转可能导致模块重新加载
try {
if (typeof uni !== 'undefined' && uni && typeof uni.getStorageSync === 'function') {
const storedUserInfo = uni.getStorageSync('uni-id-pages-userInfo') || {};
return storedUserInfo;
}
} catch (e) {
// 在模块初始化时uni可能还未完全初始化静默失败
}
return {};
}
// 初始化用户信息(只调用一次)
const initialUserInfo = getHostUserInfo() || {};
const data = {
userInfo: initialUserInfo,
hasLogin: Object.keys(initialUserInfo).length != 0
}
// 定义 mutations, 修改属性
export const mutations = {
// 更新用户信息(简化版,不使用数据库)
async updateUserInfo(data = false) {
if (data) {
// 直接更新本地用户信息
this.setUserInfo(data)
if (typeof uni !== 'undefined' && uni.showToast) {
uni.showToast({
title: "更新成功",
icon: 'none',
duration: 3000
});
}
} else {
// 如果没有传入数据,不做任何操作(不再从数据库获取)
// #ifdef APP-PLUS || H5 || MP-ALIPAY
console.log('updateUserInfo called without data, skipping database operation')
// #endif
}
},
/**
* 从本地存储中重新加载用户信息到store
* 用于解决store初始化时uni未准备好导致的问题
*/
syncUserInfoFromStorage() {
try {
if (typeof uni !== 'undefined' && uni && typeof uni.getStorageSync === 'function') {
const storedUserInfo = uni.getStorageSync('uni-id-pages-userInfo') || {};
if (Object.keys(storedUserInfo).length > 0) {
this.setUserInfo(storedUserInfo, { cover: true });
return true;
}
}
} catch (e) {
// 静默失败
}
return false;
},
setUserInfo(data, {cover}={cover:false}) {
// 确保data是一个对象
const safeData = data && typeof data === 'object' ? data : {};
let userInfo = cover ? safeData : Object.assign({}, store.userInfo || {}, safeData);
store.userInfo = Object.assign({}, userInfo);
store.hasLogin = Object.keys(store.userInfo).length != 0;
if (typeof uni !== 'undefined' && uni && typeof uni.setStorageSync === 'function') {
try {
uni.setStorageSync('uni-id-pages-userInfo', store.userInfo);
} catch (e) {
// 静默失败
}
}
return safeData;
},
async logout() {
// 检查 uni 是否可用
if (typeof uni === 'undefined') {
console.warn('uni API not available for logout')
return
}
// 优先调用后端自定义登出接口(/api/sys/auth/logout失败也不影响本地清理
const backendUserId = uni.getStorageSync('backend-user-id')
if (backendUserId) {
try {
await uni.request({
url: getApiUrl('/api/sys/auth/logout'),
method: 'POST',
header: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: {
userId: backendUserId
}
})
} catch (e) {
console.error('后端登出接口调用失败:', e)
}
}
// 清理本地登录状态(后端 token + 旧 uni-id token + tenantId
uni.removeStorageSync('backend-token')
uni.removeStorageSync('backend-login-response')
uni.removeStorageSync('backend-user-id')
uni.removeStorageSync('backend-tenant-id') // 清除 tenantId
uni.removeStorageSync('uni_id_token');
uni.setStorageSync('uni_id_token_expired', 0)
this.setUserInfo({},{cover:true})
uni.$emit('uni-id-pages-logout')
uni.redirectTo({
url: `/${pagesJson.uniIdRouter && pagesJson.uniIdRouter.loginPage ? pagesJson.uniIdRouter.loginPage: 'uni_modules/uni-id-pages/pages/login/login-withoutpwd'}`,
});
},
loginBack (e = {}) {
// 检查 uni 是否可用
if (typeof uni === 'undefined') {
console.warn('uni API not available for loginBack')
return
}
const {uniIdRedirectUrl = ''} = e
let delta = 0; //判断需要返回几层
let pages = getCurrentPages();
// console.log(pages);
pages.forEach((page, index) => {
if (pages[pages.length - index - 1].route.split('/')[3] == 'login') {
delta++
}
})
// console.log('判断需要返回几层:', delta);
if (uniIdRedirectUrl) {
return uni.redirectTo({
url: uniIdRedirectUrl,
fail: (err1) => {
uni.switchTab({
url:uniIdRedirectUrl,
fail: (err2) => {
console.log(err1,err2)
}
})
}
})
}
// #ifdef H5
if (e.loginType == 'weixin') {
// console.log('window.history', window.history);
return window.history.go(-3)
}
// #endif
if (delta) {
const page = pagesJson.pages[0]
return uni.reLaunch({
url: `/${page.path}`
})
}
uni.navigateBack({
delta
})
},
loginSuccess(e = {}){
const {
showToast = true, toastText = '登录成功', autoBack = true, uniIdRedirectUrl = '', passwordConfirmed
} = e
// console.log({toastText,autoBack});
// 检查 uni 是否可用
if (typeof uni === 'undefined') {
console.warn('uni API not available for loginSuccess')
return
}
if (showToast) {
uni.showToast({
title: toastText,
icon: 'none',
duration: 3000
});
}
// 异步调用(更新用户信息)防止获取头像等操作阻塞页面返回
this.updateUserInfo()
uni.$emit('uni-id-pages-login-success')
if (config.setPasswordAfterLogin && !passwordConfirmed) {
return uni.redirectTo({
url: uniIdRedirectUrl ? `/uni_modules/uni-id-pages/pages/userinfo/set-pwd/set-pwd?uniIdRedirectUrl=${uniIdRedirectUrl}&loginType=${e.loginType}`: `/uni_modules/uni-id-pages/pages/userinfo/set-pwd/set-pwd?loginType=${e.loginType}`,
fail: (err) => {
console.log(err)
}
})
}
if (autoBack) {
this.loginBack({uniIdRedirectUrl})
}
}
}
// #ifdef VUE2
import Vue from 'vue'
// 通过Vue.observable创建一个可响应的对象
export const store = Vue.observable(data)
// #endif
// #ifdef VUE3
// 在小程序环境中,可能 reactive 不可用,使用简单的对象
export const store = data
// #endif