首次提交

This commit is contained in:
Your Name
2025-05-29 14:25:13 +08:00
parent 75bbcc04aa
commit 86cfcc5af1
18 changed files with 2960 additions and 34 deletions

214
src/stores/user.js Normal file
View File

@@ -0,0 +1,214 @@
import { defineStore } from 'pinia';
import { ref } from 'vue';
export const useUserStore = defineStore('user', () => {
// 状态
const token = ref('');
const nickName = ref('');
const avatarUrl = ref('');
const openid = ref('');
const isLoggedIn = ref(false);
const hasAgreedToTerms = ref(false);
const hasVisitedMinePage = ref(false);
// 初始化:从本地存储加载用户信息
function init() {
try {
const userInfo = uni.getStorageSync('userInfo');
if (userInfo) {
const parsedInfo = JSON.parse(userInfo);
token.value = parsedInfo.token || '';
nickName.value = parsedInfo.nickName || '';
avatarUrl.value = parsedInfo.avatarUrl || '';
openid.value = parsedInfo.openid || '';
isLoggedIn.value = !!parsedInfo.token;
}
const agreedStatus = uni.getStorageSync('hasAgreedToTerms');
hasAgreedToTerms.value = agreedStatus === 'true';
const visitedMine = uni.getStorageSync('hasVisitedMinePage');
hasVisitedMinePage.value = visitedMine === 'true';
} catch (e) {
console.error('Failed to load user info from storage', e);
}
}
// 登录
async function login() {
try {
// 1. 获取用户信息
const userProfileRes = await getUserProfile();
// 2. 获取微信登录凭证
const loginRes = await getWxLogin();
// 3. 调用后端登录接口
const loginData = await wxLogin(loginRes.code, userProfileRes.userInfo);
// 4. 保存用户信息
setUserInfo({
token: loginData.token,
nickName: userProfileRes.userInfo.nickName,
avatarUrl: userProfileRes.userInfo.avatarUrl,
openid: loginData.openid
});
return Promise.resolve(loginData);
} catch (error) {
console.error('Login failed:', error);
return Promise.reject(error);
}
}
// 获取用户信息
function getUserProfile() {
// H5环境下模拟用户信息
// #ifdef H5
return new Promise((resolve) => {
resolve({
userInfo: {
nickName: 'H5测试用户',
avatarUrl: '/static/default-avatar.png'
}
});
});
// #endif
// 非H5环境下获取真实用户信息
// #ifndef H5
return new Promise((resolve, reject) => {
uni.getUserProfile({
desc: '用于完善用户资料',
success: (res) => {
resolve(res);
},
fail: (err) => {
reject(err);
}
});
});
// #endif
}
// 获取微信登录凭证
function getWxLogin() {
// H5环境下模拟登录凭证
// #ifdef H5
return new Promise((resolve) => {
resolve({ code: 'mock-code-for-h5' });
});
// #endif
// 非H5环境下获取真实登录凭证
// #ifndef H5
return new Promise((resolve, reject) => {
uni.login({
provider: 'weixin',
success: (res) => {
resolve(res);
},
fail: (err) => {
reject(err);
}
});
});
// #endif
}
// 调用后端登录接口
function wxLogin(code, userInfo) {
// H5环境下模拟登录避免API超时
// #ifdef H5
return new Promise((resolve) => {
setTimeout(() => {
resolve({
token: 'mock-token-for-h5',
openid: 'mock-openid-for-h5'
});
}, 300);
});
// #endif
// 非H5环境下调用实际接口
// #ifndef H5
return new Promise((resolve, reject) => {
uni.request({
url: 'https://your-api.com/api/login/wechat',
method: 'POST',
data: {
code,
userInfo
},
success: (res) => {
if (res.statusCode === 200 && res.data.token) {
resolve(res.data);
} else {
reject(new Error('Login failed: ' + JSON.stringify(res.data)));
}
},
fail: (err) => {
reject(err);
},
// 设置超时时间
timeout: 5000
});
});
// #endif
}
// 保存用户信息
function setUserInfo(userInfo) {
token.value = userInfo.token || '';
nickName.value = userInfo.nickName || '';
avatarUrl.value = userInfo.avatarUrl || '';
openid.value = userInfo.openid || '';
isLoggedIn.value = !!userInfo.token;
// 保存到本地存储
uni.setStorageSync('userInfo', JSON.stringify(userInfo));
}
// 退出登录
function logout() {
token.value = '';
nickName.value = '';
avatarUrl.value = '';
openid.value = '';
isLoggedIn.value = false;
// 清除本地存储
uni.removeStorageSync('userInfo');
}
// 新增:设置用户同意须知状态
function setAgreedToTerms(status) {
hasAgreedToTerms.value = status;
uni.setStorageSync('hasAgreedToTerms', status.toString());
}
// 新增:设置用户已访问我的页面
function setVisitedMinePage(status) {
hasVisitedMinePage.value = status;
uni.setStorageSync('hasVisitedMinePage', status.toString());
}
return {
// 状态
token,
nickName,
avatarUrl,
openid,
isLoggedIn,
hasAgreedToTerms,
hasVisitedMinePage,
// 方法
init,
login,
setUserInfo,
logout,
setAgreedToTerms,
setVisitedMinePage
};
});