Files
WXProgram/miniprogram/services/userService.ts

355 lines
9.2 KiB
TypeScript
Raw Normal View History

2025-10-16 21:32:16 +08:00
// 用户服务文件
// 用户服务 - 处理用户认证、会话管理、权限验证等
2025-10-16 21:32:16 +08:00
import { UserInfo, EmployeeInfo } from '../types';
import { Role } from '../utils/roleUtils';
2025-10-16 21:32:16 +08:00
import apiService from './apiService';
/**
*
*
*/
class UserService {
/**
*
2025-10-16 21:32:16 +08:00
*/
constructor() {
// 不再使用模拟数据
2025-10-16 21:32:16 +08:00
}
/**
*
* @returns
*/
async getUserInfo(): Promise<UserInfo> {
return apiService.getUserInfo();
}
/**
* 退
*/
async logout(): Promise<void> {
return apiService.logout();
}
/**
*
* @returns
*/
isLoggedIn(): boolean {
const app = getApp<any>();
return app.globalData.isLoggedIn && !!app.globalData.userInfo;
}
/**
*
* @returns null
*/
getUserRole(): string | null {
const app = getApp<any>();
return app.globalData.userInfo && app.globalData.userInfo.role || null;
}
/**
*
* @returns
*/
isAdmin(): boolean {
return this.getUserRole() === Role.ADMIN;
2025-10-16 21:32:16 +08:00
}
/**
*
* @returns
*/
isDeliveryPerson(): boolean {
return this.getUserRole() === Role.DELIVERY_PERSON;
2025-10-16 21:32:16 +08:00
}
/**
*
* @returns
*/
checkLocationPermission(): Promise<boolean> {
return new Promise((resolve) => {
wx.getSetting({
success: (res) => {
const hasPermission = res.authSetting && res.authSetting['scope.userLocation'];
resolve(!!hasPermission);
},
fail: () => {
resolve(false);
}
});
});
}
/**
*
* @returns
*/
requestLocationPermission(): Promise<boolean> {
return new Promise((resolve) => {
wx.authorize({
scope: 'scope.userLocation',
success: () => {
resolve(true);
},
fail: () => {
resolve(false);
}
});
});
}
/**
*
* @returns null
*/
getGlobalUserInfo(): UserInfo | null {
const app = getApp<any>();
return app.globalData.userInfo as UserInfo | null;
}
/**
* 执行静默登录流程:微信登录->->->/
* @returns
*/
async wxLogin(): Promise<{
success: boolean;
userInfo?: UserInfo;
openid?: string;
session_key?: string;
token?: string;
}> {
try {
// 获取微信登录code
console.log('步骤1: 获取微信登录code');
const code = await this.getWxLoginCode();
if (!code) {
console.error('步骤1失败: 获取微信登录code失败');
throw new Error('获取微信登录code失败');
}
console.log('步骤1成功: 获取到微信登录code');
// 调用微信登录API
console.log('步骤2: 调用微信登录API');
const wxLoginResult = await this.ServerLogin(code);
if (wxLoginResult.success) {
console.log('步骤2成功: 微信登录API调用成功');
// 静默登录模式下,不主动获取用户信息
let userInfo = wxLoginResult.userInfo;
return {
success: true,
userInfo,
openid: wxLoginResult.openid,
session_key: wx.getStorageSync('session_key'), //TODO:服务器已经下发
token: wxLoginResult.token
};
} else {
console.error('步骤2失败: 微信登录API返回失败');
return {
success: false,
openid: wxLoginResult.openid
};
}
} catch (error) {
console.error('登录流程异常:', error);
return { success: false };
}
}
/**
*
* @param code
* @returns
*/
async ServerLogin(code: string): Promise<{ success: boolean; openid?: string; token?: string; userInfo?: UserInfo }> {
try {
// 真实API模式
//TODO: 登录成功的基础数据:服务器下发的公共游客可看的数据
const result = await apiService.ServerLogin(code);
// 保存到本地存储
wx.setStorageSync('userInfo', result.user);
wx.setStorageSync('token', result.token);
wx.setStorageSync('openid', result.openid);
wx.setStorageSync('session_key', result.session_key);
// 同时保存到全局数据确保后续API调用能正确获取token
const app = getApp<any>();
app.globalData.token = result.token;
return {
success: true,
openid: result.openid,
token: result.token,
userInfo: result.user
};
} catch (error) {
console.error('微信登录失败:', error);
return { success: false };
}
}
/**
* code
*/
private async getWxLoginCode(): Promise<string | null> {
return new Promise((resolve) => {
wx.login({
success: (res) => {
if (res.code) {
console.log('成功获取到登录code');
resolve(res.code);
} else {
console.error('获取登录code失败返回值为空');
resolve(null);
}
},
fail: (error) => {
console.error('wx.login调用失败:', error);
resolve(null);
}
});
});
}
/**
*
* @param userInfo
* @returns
*/
async updateUserInfo(userInfo: Partial<UserInfo>): Promise<UserInfo> {
return apiService.updateUserInfo(userInfo);
}
/**
*
* @returns
*/
async getUserStatus(): Promise<{ status: 'signed_in' | 'signed_out' | 'registered' | 'unregistered'; lastSignInTime?: string; lastSignOutTime?: string }> {
try {
// 调用服务器接口获取用户状态
const response = await apiService.getUserStatus();
return response;
} catch (error: any) {
console.error('获取用户状态失败:', error);
// 如果是404错误接口不存在返回null让前端使用本地逻辑
if (error.message && error.message.includes('404')) {
console.log('服务器状态接口不存在,使用本地逻辑');
return null as any; // 返回null表示服务器接口不可用
}
// 其他网络错误时返回默认状态
return {
status: 'registered'
};
}
}
/**
*
* @returns
*/
async signIn(): Promise<{ success: boolean; employeeInfo: EmployeeInfo; message?: string }> {
const userInfo = this.getGlobalUserInfo();
if (!userInfo || !userInfo.id) {
throw new Error('用户未登录,无法签到');
}
// 检查是否有有效的token防止后端空指针异常
const app = getApp<any>();
if (!app.globalData.token) {
throw new Error('用户认证信息缺失,请重新登录');
}
return apiService.userSignIn(userInfo.id);
}
/**
* 退
* @returns 退
*/
async signOut(): Promise<{ success: boolean; message?: string }> {
const userInfo = this.getGlobalUserInfo();
if (!userInfo || !userInfo.id) {
throw new Error('用户未登录,无法签退');
}
// 检查是否有有效的token防止后端空指针异常
const app = getApp<any>();
if (!app.globalData.token) {
throw new Error('用户认证信息缺失,请重新登录');
2025-10-16 21:32:16 +08:00
}
return apiService.userSignOut(userInfo.id);
2025-10-16 21:32:16 +08:00
}
/**
*
* @param registerInfo
* @returns
*/
async register(registerInfo: { name: string; phone: string }): Promise<{ success: boolean; employeeInfo: EmployeeInfo; message?: string }> {
return apiService.userRegister(registerInfo);
}
/**
*
* @returns
*/
async getUserPermissions(): Promise<string[]> {
return apiService.getUserPermissions();
}
/**
* 线
* @returns 线
*/
async checkUserOnline(): Promise<boolean> {
return apiService.checkUserOnline();
}
/**
*
* @returns
*/
async getSessionInfo(): Promise<{
userId: number;
sessionId: string;
expiresAt: number;
permissions: string[];
}> {
return apiService.getSessionInfo();
}
/**
*
* @param oldToken
* @returns
*/
async refreshToken(oldToken: string): Promise<{ token: string; expiresAt: number }> {
return apiService.refreshToken(oldToken);
}
/**
*
* @param permission
* @returns
*/
async verifyPermission(permission: string): Promise<boolean> {
return apiService.verifyPermission(permission);
}
}
/**
*
* 使
*/
export default new UserService();