添加登陆页
This commit is contained in:
220
src/services/loginService.ts
Normal file
220
src/services/loginService.ts
Normal file
@@ -0,0 +1,220 @@
|
||||
import Taro from '@tarojs/taro';
|
||||
|
||||
// 微信用户信息接口
|
||||
export interface WechatUserInfo {
|
||||
user_id: string;
|
||||
username: string;
|
||||
avatar: string;
|
||||
gender: number;
|
||||
city: string;
|
||||
province: string;
|
||||
country: string;
|
||||
}
|
||||
|
||||
// 登录响应接口
|
||||
export interface LoginResponse {
|
||||
success: boolean;
|
||||
message: string;
|
||||
token?: string;
|
||||
user_info?: WechatUserInfo;
|
||||
}
|
||||
|
||||
// 微信授权登录
|
||||
export const wechat_auth_login = async (): Promise<LoginResponse> => {
|
||||
try {
|
||||
// 先进行微信登录获取code
|
||||
const login_result = await Taro.login();
|
||||
|
||||
if (!login_result.code) {
|
||||
return {
|
||||
success: false,
|
||||
message: '微信登录失败'
|
||||
};
|
||||
}
|
||||
|
||||
// 获取用户信息
|
||||
const user_profile = await get_user_profile();
|
||||
|
||||
// 模拟发送到后端换取登录状态
|
||||
// const response = await Taro.request({
|
||||
// url: '/api/wechat/login',
|
||||
// method: 'POST',
|
||||
// data: {
|
||||
// code: login_result.code,
|
||||
// user_info: user_profile
|
||||
// }
|
||||
// });
|
||||
|
||||
// 模拟成功响应
|
||||
return {
|
||||
success: true,
|
||||
message: '微信登录成功',
|
||||
token: 'wx_token_' + Date.now(),
|
||||
user_info: user_profile
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
success: false,
|
||||
message: '微信授权失败,请重试'
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
// 手机号验证码登录接口参数
|
||||
export interface PhoneLoginParams {
|
||||
phone: string;
|
||||
verification_code: string;
|
||||
}
|
||||
|
||||
// 手机号验证码登录
|
||||
export const phone_auth_login = async (params: PhoneLoginParams): Promise<LoginResponse> => {
|
||||
try {
|
||||
// 模拟网络请求延迟
|
||||
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||
|
||||
// 模拟验证码验证
|
||||
if (params.verification_code === '123456') {
|
||||
const user_info: WechatUserInfo = {
|
||||
user_id: 'phone_' + Date.now(),
|
||||
username: `用户${params.phone.slice(-4)}`,
|
||||
avatar: '',
|
||||
gender: 0,
|
||||
city: '',
|
||||
province: '',
|
||||
country: ''
|
||||
};
|
||||
|
||||
return {
|
||||
success: true,
|
||||
message: '登录成功',
|
||||
token: 'phone_token_' + Date.now(),
|
||||
user_info
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
success: false,
|
||||
message: '验证码错误'
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
return {
|
||||
success: false,
|
||||
message: '网络错误,请稍后重试'
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
// 获取用户信息
|
||||
export const get_user_profile = (): Promise<WechatUserInfo> => {
|
||||
return new Promise((resolve, reject) => {
|
||||
Taro.getUserProfile({
|
||||
desc: '用于完善用户资料',
|
||||
success: (res) => {
|
||||
const profile = res.userInfo;
|
||||
const user_data: WechatUserInfo = {
|
||||
user_id: 'wx_' + Date.now(),
|
||||
username: profile.nickName || '微信用户',
|
||||
avatar: profile.avatarUrl || '',
|
||||
gender: profile.gender || 0,
|
||||
city: profile.city || '',
|
||||
province: profile.province || '',
|
||||
country: profile.country || ''
|
||||
};
|
||||
resolve(user_data);
|
||||
},
|
||||
fail: reject
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
// 保存用户登录状态
|
||||
export const save_login_state = (token: string, user_info: WechatUserInfo) => {
|
||||
try {
|
||||
Taro.setStorageSync('user_token', token);
|
||||
Taro.setStorageSync('user_info', user_info);
|
||||
Taro.setStorageSync('is_logged_in', true);
|
||||
Taro.setStorageSync('login_time', Date.now());
|
||||
} catch (error) {
|
||||
console.error('保存登录状态失败:', error);
|
||||
}
|
||||
};
|
||||
|
||||
// 清除登录状态
|
||||
export const clear_login_state = () => {
|
||||
try {
|
||||
Taro.removeStorageSync('user_token');
|
||||
Taro.removeStorageSync('user_info');
|
||||
Taro.removeStorageSync('is_logged_in');
|
||||
Taro.removeStorageSync('login_time');
|
||||
} catch (error) {
|
||||
console.error('清除登录状态失败:', error);
|
||||
}
|
||||
};
|
||||
|
||||
// 检查是否已登录
|
||||
export const check_login_status = (): boolean => {
|
||||
try {
|
||||
const is_logged_in = Taro.getStorageSync('is_logged_in');
|
||||
const token = Taro.getStorageSync('user_token');
|
||||
const login_time = Taro.getStorageSync('login_time');
|
||||
|
||||
// 检查登录是否过期(7天)
|
||||
if (login_time && Date.now() - login_time > 7 * 24 * 60 * 60 * 1000) {
|
||||
clear_login_state();
|
||||
return false;
|
||||
}
|
||||
|
||||
return !!(is_logged_in && token);
|
||||
} catch (error) {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
// 获取用户信息
|
||||
export const get_user_info = (): WechatUserInfo | null => {
|
||||
try {
|
||||
return Taro.getStorageSync('user_info') || null;
|
||||
} catch (error) {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
// 获取用户token
|
||||
export const get_user_token = (): string | null => {
|
||||
try {
|
||||
return Taro.getStorageSync('user_token') || null;
|
||||
} catch (error) {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
// 检查微信登录状态
|
||||
export const check_wechat_login = async (): Promise<boolean> => {
|
||||
try {
|
||||
const check_result = await Taro.checkSession();
|
||||
// Taro.checkSession 返回的是 { errMsg: string }
|
||||
return check_result.errMsg === 'checkSession:ok';
|
||||
} catch (error) {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
// 刷新登录状态
|
||||
export const refresh_login_status = async (): Promise<boolean> => {
|
||||
try {
|
||||
// 检查微信登录状态
|
||||
const is_valid = await check_wechat_login();
|
||||
|
||||
if (!is_valid) {
|
||||
// 微信登录已过期,需要重新登录
|
||||
clear_login_state();
|
||||
return false;
|
||||
}
|
||||
|
||||
// 检查本地存储的登录状态
|
||||
return check_login_status();
|
||||
} catch (error) {
|
||||
console.error('刷新登录状态失败:', error);
|
||||
return false;
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user