This commit is contained in:
zpc 2025-09-11 14:34:54 +08:00
parent fd13ee60b1
commit d893c2a467
4 changed files with 160 additions and 18 deletions

View File

@ -27,6 +27,18 @@ export const ueWxPhoneNumberLogin = async (code, sessionAuthId) => {
return null;
}
/**
* 匿名登录
* @returns
*/
export const anonymousLogin = async () => {
const res = await request.post("user/AnonymousLogin");
if (res.code == 0) {
return res.data;
}
return null;
}
/**
* 微信小程序匿名授权登录手机号已授权过
* @param {*} code

View File

@ -1,25 +1,153 @@
import { getUserInfo, editUserInfo } from '@/common/server/interface/user'
// 导入用户相关的接口函数
import { getUserInfo, editUserInfo, anonymousLogin as anonymousLoginInterface } from '@/common/server/interface/user'
import { ref } from 'vue'
import throttle from 'lodash/throttle';
export var userInfo = ref(null);
// 用户信息响应式数据
export const userInfo = ref(null);
// 创建节流函数防止频繁调用用户信息加载接口2秒内只执行一次
const throttledLoadUserInfo = throttle(_loadUserInfo, 2000, { leading: true, trailing: false });
/**
* 清除用户相关存储
*/
const clearUserStorage = () => {
userInfo.value = null;
uni.removeStorageSync('tokenInfo');
uni.removeStorageSync('userInfo');
};
/**
* 检查token是否有效
* @param {string} token - token字符串
* @returns {boolean} token是否有效
*/
const isValidToken = (token) => {
return token && token !== null && token !== '';
};
/**
* 加载用户信息外部调用接口
* 使用节流函数防止频繁调用
*/
export const loadUserInfo = async () => {
const res = await getUserInfo();
if (res == null) {
console.log('loadUserInfo');
throttledLoadUserInfo();
};
userInfo.value = null;
uni.removeStorageSync('tokenInfo');
uni.removeStorageSync('userInfo');
return;
/**
* 内部用户信息加载函数
* 从服务器获取用户信息并更新本地状态
*/
async function _loadUserInfo() {
console.log("_loadUserInfo");
try {
// 调用接口获取用户信息
const res = await getUserInfo();
// 如果获取失败,清空用户信息和本地存储
if (res == null) {
clearUserStorage();
return;
}
// 更新用户信息
userInfo.value = res;
} catch (error) {
console.error('加载用户信息失败:', error);
clearUserStorage();
}
userInfo.value = res;
uni.setStorageSync('userInfo', res);
}
/**
* 更新用户信息
* @param {string} nickName - 昵称
* @param {string} avatar - 头像
* @param {string} sex - 性别
* @param {string} birthday - 生日
*/
export const updateUserInfo = async (nickName, avatar, sex, birthday) => {
const res = await editUserInfo(nickName, avatar, sex, birthday);
if (!res) {
try {
// 调用接口更新用户信息
const res = await editUserInfo(nickName, avatar, sex, birthday);
// 如果更新失败,直接返回
if (!res) {
return;
}
// 更新成功后重新加载用户信息
loadUserInfo();
} catch (error) {
console.error('更新用户信息失败:', error);
}
};
/**
* 检查用户是否已登录
* @returns {Promise<boolean>} 是否已登录
*/
export const isLogin = async () => {
// 如果用户信息已存在直接返回true
if (userInfo.value !== null) {
return true;
}
// 检查本地token
const tokenInfo = uni.getStorageSync('tokenInfo');
if (!isValidToken(tokenInfo)) {
return false;
}
try {
// 尝试加载用户信息
await _loadUserInfo();
// 如果加载后用户信息仍为空清除存储并返回false
if (userInfo.value === null) {
clearUserStorage();
return false;
}
return true;
} catch (error) {
console.error('检查登录状态失败:', error);
clearUserStorage();
return false;
}
};
/**
* 匿名登录
* 检查本地是否有token如果有则进行匿名登录
*/
export const anonymousLogin = async () => {
// 从本地存储获取token信息
const tokenInfo = uni.getStorageSync('tokenInfo');
// 如果没有token直接返回
if (!isValidToken(tokenInfo)) {
return;
}
loadUserInfo();
}
try {
// 调用匿名登录接口
const res = await anonymousLoginInterface();
if (res) {
// 登录成功保存新的token并加载用户信息
uni.setStorageSync("tokenInfo", res);
console.log("匿名登录成功", res);
loadUserInfo();
} else {
// 登录失败清除本地存储的token和用户信息
clearUserStorage();
}
} catch (error) {
console.error('匿名登录失败:', error);
clearUserStorage();
}
};

View File

@ -1,6 +1,7 @@
// import { getAdvertList } from "@/common/server/interface/advert";
import { preloadHomeData } from '@/common/server/index'
import { preloadConfigData } from '@/common/server/config'
import { anonymousLogin } from '@/common/server/user'
/**
* 应用初始化函数带有超时控制
* @param {number} timeoutMs - 超时时间毫秒
@ -11,6 +12,7 @@ export const appInit = async (timeoutMs = 5000) => {
//获取首页关键数据
const homeTask = preloadHomeData();
const configTask = preloadConfigData();
const anonymousTask = anonymousLogin();
// 2. 创建一个会在指定时间后拒绝的Promise用于超时控制
const timeoutPromise = new Promise((_, reject) =>
setTimeout(() =>
@ -23,7 +25,7 @@ export const appInit = async (timeoutMs = 5000) => {
// 哪个先完成(成功或失败)就采用哪个的结果
await Promise.race([
// 使用Promise.all包装是为了保持一致性
Promise.all([homeTask,configTask]),
Promise.all([homeTask, configTask, anonymousTask]),
timeoutPromise
]);
// 4. 如果没有超时全部获取成功返回true

View File

@ -1,14 +1,14 @@
{
"dependencies": {
"uview-plus": "^3.5.22",
"crypto-js": "^4.2.0",
"js-md5": "^0.8.3",
"lodash": "^4.17.21",
"qs": "^6.14.0"
"qs": "^6.14.0",
"uview-plus": "^3.5.22"
},
"devDependencies": {
"sass": "^1.63.2",
"unplugin-auto-import": "^19.3.0",
"unplugin-vue-components": "^28.7.0"
}
}
}