地址路径修改

This commit is contained in:
2025-10-26 13:15:04 +08:00
parent be2323074b
commit 271b88232c
77 changed files with 13254 additions and 228 deletions

View File

@@ -3,6 +3,7 @@
// 引入服务和工具函数
import userService from '../../services/userService';
import { avatarCache } from '../../utils/avatarCache';
// 引入主页面模块
import { MainPageModule } from './modules/mainPageModule';
@@ -41,7 +42,7 @@ Component<IndexPageComponent['data'], any, any, any, false>({
showSignOutButton: false,
showSignInButton: false,
showRegisterButton: false,
showAuthButton: true,
showAuthButton: true
// mainPageModule: null as MainPageModule | null
},
@@ -78,6 +79,20 @@ Component<IndexPageComponent['data'], any, any, any, false>({
methods: {
// 获取完整的头像URL用于wxml显示
getFullAvatarUrl(avatarPath: string | undefined): string {
if (!avatarPath) {
return '/images/truck.png';
}
// 如果已经是完整URL直接返回
if (avatarPath.startsWith('http')) {
return avatarPath;
}
// 将相对路径转换为完整URL
return `${API_BASE_URL}${avatarPath}`;
},
// 处理货运人员底部弹窗关闭
@@ -169,9 +184,9 @@ Component<IndexPageComponent['data'], any, any, any, false>({
// 本地已有登录状态此时可以安全获取用户状态因为有token
const userStatus = await loginModule.determineUserStatus(app.globalData.userInfo);
// 更新页面状态
// 更新页面状态,使用头像缓存方法
await this.updateUserInfoWithAvatarCache(app.globalData.userInfo);
this.setData({
userInfo: app.globalData.userInfo,
'authStatus.hasWxCode': true,
'authStatus.userStatus': userStatus
});
@@ -191,15 +206,15 @@ Component<IndexPageComponent['data'], any, any, any, false>({
const app = getApp<any>();
// 登录成功,更新全局用户信息
app.globalData.userInfo = loginResult.userInfo;
app.globalData.isLoggedIn = true;
app.globalData.userInfo = loginResult.userInfo;
app.globalData.isLoggedIn = true;
// 登录成功后此时已经有token可以安全获取用户状态
const userStatus = await loginModule.determineUserStatus(loginResult.userInfo);
// 更新页面状态
// 更新页面状态,使用头像缓存方法
await this.updateUserInfoWithAvatarCache(loginResult.userInfo);
this.setData({
userInfo: loginResult.userInfo,
'authStatus.hasWxCode': true,
'authStatus.userStatus': userStatus
});
@@ -250,6 +265,62 @@ Component<IndexPageComponent['data'], any, any, any, false>({
console.log('✅ 按钮状态已更新到页面');
},
// 处理用户信息更新包含头像URL预处理
async updateUserInfoWithAvatarCache(userInfo: any) {
if (!userInfo) {
this.setData({ userInfo: null });
return;
}
// 预处理头像URL
const processedUserInfo = { ...userInfo };
if (userInfo.avatarPath) {
try {
// 使用头像缓存获取本地文件路径
const fullAvatarUrl = this.getFullAvatarUrl(userInfo.avatarPath);
const localAvatarPath = await avatarCache.getAvatarPath(fullAvatarUrl);
processedUserInfo.fullAvatarUrl = localAvatarPath;
} catch (error) {
console.error('获取用户头像缓存失败:', error);
// 如果缓存失败,使用默认头像
processedUserInfo.fullAvatarUrl = '/images/truck.png';
}
} else {
// 如果没有头像路径,使用默认头像
processedUserInfo.fullAvatarUrl = '/images/truck.png';
}
this.setData({ userInfo: processedUserInfo });
},
// 处理货运人员信息更新包含头像URL预处理
async updateDeliveryPersonWithAvatarCache(deliveryPerson: any) {
if (!deliveryPerson) {
this.setData({ currentDeliveryPerson: null });
return;
}
// 预处理头像URL
const processedDeliveryPerson = { ...deliveryPerson };
if (deliveryPerson.avatarPath) {
try {
// 使用头像缓存获取本地文件路径而不是远程URL
const fullAvatarUrl = this.getFullAvatarUrl(deliveryPerson.avatarPath);
const localAvatarPath = await avatarCache.getAvatarPath(fullAvatarUrl);
processedDeliveryPerson.fullAvatarUrl = localAvatarPath;
} catch (error) {
console.error('获取货运人员头像缓存失败:', error);
// 如果缓存失败回退到远程URL
processedDeliveryPerson.fullAvatarUrl = this.getFullAvatarUrl(deliveryPerson.avatarPath);
}
} else {
// 如果没有头像路径,使用默认头像
processedDeliveryPerson.fullAvatarUrl = '/images/truck.png';
}
this.setData({ currentDeliveryPerson: processedDeliveryPerson });
},
// 登录成功后统一刷新页面
async refreshPageAfterLogin() {
@@ -331,9 +402,11 @@ Component<IndexPageComponent['data'], any, any, any, false>({
if (success) {
const app = getApp<any>();
const userStatus = loginModule.determineUserStatus(app.globalData.userInfo);
const userStatus = await loginModule.determineUserStatus(app.globalData.userInfo);
// 更新页面状态,使用头像缓存方法
await this.updateUserInfoWithAvatarCache(app.globalData.userInfo);
this.setData({
userInfo: app.globalData.userInfo,
'authStatus.hasWxCode': true,
'authStatus.userStatus': userStatus
});

View File

@@ -85,7 +85,7 @@
<view class="user-panel-content" bindtap="stopPropagation">
<view class="user-avatar">
<image
src="/images/truck.png"
src="{{userInfo.fullAvatarUrl}}"
mode="aspectFill"
class="avatar-image"
></image>
@@ -236,7 +236,7 @@
<view class="modal-header">
<view class="delivery-person-header">
<view class="delivery-person-avatar">
<image src="{{currentDeliveryPerson.avatarUrl || '/images/truck.png'}}" mode="aspectFill"></image>
<image src="{{currentDeliveryPerson.fullAvatarUrl}}" mode="aspectFill"></image>
</view>
<view class="person-info-header">
<view class="modal-title">{{currentDeliveryPerson.name}}</view>

View File

@@ -1,13 +1,12 @@
// 管理员模块 - 专门处理管理员相关功能
import { showToast } from '../../utils/helpers';
import { DataModule } from './dataModule';
export class AdminModule {
private pageContext: any;
private dataModule: DataModule;
constructor(pageContext: any, dataModule: DataModule) {
this.pageContext = pageContext;
constructor(_pageContext: any, dataModule: DataModule) {
this.dataModule = dataModule;
}
@@ -24,7 +23,7 @@ export class AdminModule {
/**
* 显示管理员详情面板
*/
private showAdminPanel(admin: any, position: { x: number, y: number }): void {
private showAdminPanel(admin: any, _position: { x: number, y: number }): void {
console.log('显示管理员详情面板:', admin);
// 设置当前管理员

View File

@@ -1,4 +1,5 @@
import { UserInfo, Marker } from '../../../types';
import { avatarCache } from '../../../utils/avatarCache';
/**
* 页面数据管理模块
@@ -80,16 +81,48 @@ export class DataModule {
/**
* 更新用户信息
*/
public updateUserInfo(userInfo: UserInfo | null): void {
public async updateUserInfo(userInfo: UserInfo | null): Promise<void> {
if (!userInfo) {
this.pageContext.setData({
userInfo: null,
isLoggedIn: false
});
// 更新按钮显示状态
if (this.pageContext.updateButtonDisplayStatus) {
this.pageContext.updateButtonDisplayStatus();
}
return;
}
// 处理头像缓存
const processedUserInfo = { ...userInfo };
if (userInfo.avatarPath) {
try {
// 只有在用户已签到的情况下才使用头像缓存
const app = getApp<any>();
const isSignedIn = app.globalData.userInfo && app.globalData.userInfo.status === 'signed_in';
if (isSignedIn) {
processedUserInfo.avatarPath = await avatarCache.getAvatarPath(userInfo.avatarPath);
} else {
// 未签到状态,直接使用原始路径
processedUserInfo.avatarPath = userInfo.avatarPath;
}
} catch (error) {
console.error('处理用户头像缓存失败:', error);
}
}
this.pageContext.setData({
userInfo,
isLoggedIn: !!userInfo
userInfo: processedUserInfo,
isLoggedIn: true
});
// 更新按钮显示状态
if (this.pageContext.updateButtonDisplayStatus) {
this.pageContext.updateButtonDisplayStatus();
}
if (this.pageContext.updateButtonDisplayStatus) {
this.pageContext.updateButtonDisplayStatus();
}
}
/**
@@ -160,8 +193,32 @@ export class DataModule {
/**
* 设置当前选中货运人员
*/
public setCurrentDeliveryPerson(person: any): void {
this.pageContext.setData({ currentDeliveryPerson: person });
public async setCurrentDeliveryPerson(person: any): Promise<void> {
if (!person) {
this.pageContext.setData({ currentDeliveryPerson: null });
return;
}
// 处理头像缓存
const processedPerson = { ...person };
if (person.avatarPath) {
try {
// 只有在用户已签到的情况下才使用头像缓存
const app = getApp<any>();
const isSignedIn = app.globalData.userInfo && app.globalData.userInfo.status === 'signed_in';
if (isSignedIn) {
processedPerson.avatarPath = await avatarCache.getAvatarPath(person.avatarPath);
} else {
// 未签到状态,直接使用原始路径
processedPerson.avatarPath = person.avatarPath;
}
} catch (error) {
console.error('处理货运人员头像缓存失败:', error);
}
}
this.pageContext.setData({ currentDeliveryPerson: processedPerson });
}
/**

View File

@@ -1,13 +1,12 @@
// 货运人员模块 - 专门处理货运人员相关功能
import { showToast } from '../../utils/helpers';
import { DataModule } from './dataModule';
export class DeliveryPersonModule {
private pageContext: any;
private dataModule: DataModule;
constructor(pageContext: any, dataModule: DataModule) {
this.pageContext = pageContext;
constructor(_pageContext: any, dataModule: DataModule) {
this.dataModule = dataModule;
}
@@ -24,7 +23,7 @@ export class DeliveryPersonModule {
/**
* 显示货运人员详情面板
*/
private showDeliveryPersonPanel(deliveryPerson: any, position: { x: number, y: number }): void {
private showDeliveryPersonPanel(deliveryPerson: any, _position: { x: number, y: number }): void {
console.log('显示货运人员详情面板:', deliveryPerson);
// 设置当前货运人员

View File

@@ -1,21 +1,20 @@
// 员工模块 - 处理所有员工(管理员和货运人员)的通用功能
import { showToast } from '../../../utils/helpers';
import { DataModule } from './dataModule';
import employeeService from '../../../services/employeeService';
import { API_BASE_URL } from '../../../services/apiService';
export class EmployeeModule {
private pageContext: any;
private dataModule: DataModule;
constructor(pageContext: any, dataModule: DataModule) {
this.pageContext = pageContext;
constructor(_pageContext: any, dataModule: DataModule) {
this.dataModule = dataModule;
}
/**
* 处理员工标记点点击 - 通用处理逻辑
*/
onEmployeeMarkerClick(employee: any, position: { x: number, y: number }): void {
onEmployeeMarkerClick(employee: any, _position: { x: number, y: number }): void {
console.log('员工被点击:', employee);
// 设置当前员工
@@ -73,7 +72,31 @@ export class EmployeeModule {
try {
console.log('开始加载所有员工数据');
const employees = await employeeService.getEmployees();
console.log('员工数据加载完成:', employees);
console.log('员工数据加载完成,共', employees.length, '名员工');
// 打印每个员工的基本信息
console.log('=== 员工列表详细信息 ===');
employees.forEach((employee, index) => {
console.log(`员工 ${index + 1}:`);
console.log(` - ID: ${employee.id}`);
console.log(` - 姓名: ${employee.name || '未设置'}`);
console.log(` - 电话: ${employee.phone || '未设置'}`);
console.log(` - 角色: ${employee.role || '未设置'}`);
// 处理头像路径使用avatarPath转换为完整URL
let avatarFullUrl = '未设置';
if (employee.avatarPath) {
avatarFullUrl = `${API_BASE_URL}${employee.avatarPath}`;
console.log(` - 头像路径: ${employee.avatarPath}`);
console.log(` - 完整头像URL: ${avatarFullUrl}`);
} else {
console.log(` - 头像URL: 未设置`);
}
console.log(` - 头像缩略图: ${employee.avatarThumbnail || '未设置'}`);
console.log('---');
});
console.log('=== 员工列表打印完成 ===');
// 这里可以添加员工数据处理逻辑比如更新到dataModule
// this.dataModule.updateEmployees(employees);

View File

@@ -2,6 +2,8 @@
import { showToast } from '../../../utils/helpers';
import { DataModule } from './dataModule';
import locationTrackingService from '../../../services/locationTrackingService';
import { avatarCache } from '../../../utils/avatarCache';
import { API_BASE_URL } from '../../../services/apiService';
// 位置模块接口定义
export interface LocationModule {
@@ -39,12 +41,16 @@ export class LocationModule {
console.log('📝 [LocationModule] 设置位置更新回调');
// 注册位置更新回调
locationTrackingService.subscribeToLocationUpdates((onlineUsers) => {
locationTrackingService.subscribeToLocationUpdates(async (onlineUsers) => {
console.log('🔔 [LocationModule] 收到位置更新通知');
console.log('👥 [LocationModule] 在线用户数量:', onlineUsers.length);
// 调用updateEmployeeMarkers方法更新地图标记
this.updateEmployeeMarkers(onlineUsers);
try {
await this.updateEmployeeMarkers(onlineUsers);
} catch (error) {
console.error('更新员工标记点失败:', error);
}
});
console.log('✅ [LocationModule] 位置更新回调设置完成');
@@ -118,7 +124,7 @@ export class LocationModule {
/**
* 更新员工标记点
*/
public updateEmployeeMarkers(onlineUsers: any[]): void {
public async updateEmployeeMarkers(onlineUsers: any[]): Promise<void> {
console.log('📍 [LocationModule] 开始更新员工标记点');
console.log('👥 [LocationModule] 传入用户数量:', onlineUsers.length);
@@ -135,7 +141,7 @@ export class LocationModule {
console.log('🗺️ [LocationModule] 当前地图上员工标记点数量:', currentEmployeeMarkers.length);
// 为每个在线用户创建标记点
const newEmployeeMarkers = onlineUsers.map((user, index) => {
const newEmployeeMarkers = await Promise.all(onlineUsers.map(async (user, index) => {
console.log(`🔍 [LocationModule] 处理第 ${index + 1} 个用户:`, user.userId || '未知ID');
// 获取用户角色信息
@@ -149,25 +155,33 @@ export class LocationModule {
console.log(`📡 [LocationModule] 用户 ${index + 1} 位置: ${latitude}, ${longitude}`);
console.log(`👤 [LocationModule] 用户 ${index + 1} 信息: ${user.userName || '未知用户'} (${userRole})`);
// 获取员工图标
const iconPath = await this.getEmployeeIcon(user.userId, userRole, user);
const employeeMarker = {
id: 10000 + user.userId, // 避免ID冲突
type: 'employee',
title: user.userName || `员工${user.userId}`,
longitude: longitude,
latitude: latitude,
iconPath: this.getEmployeeIcon(user.userId, userRole),
iconPath: iconPath,
width: 32,
height: 32,
zIndex: 30,
data: {
userId: user.userId,
role: userRole,
lastUpdateTime: lastUpdateTime
lastUpdateTime: lastUpdateTime,
currentLocation: {
address: user.address || '位置信息获取中...',
longitude: longitude,
latitude: latitude
}
}
};
return employeeMarker;
});
}));
console.log('📍 [LocationModule] 新生成标记点数量:', newEmployeeMarkers.length);
@@ -274,14 +288,59 @@ export class LocationModule {
/**
* 获取员工图标
*/
private getEmployeeIcon(_userId: number, userRole: string): string {
// 根据用户角色返回不同的图标
private async getEmployeeIcon(userId: number, userRole: string, userData?: any): Promise<string> {
console.log(`🔍 [LocationModule] 获取用户 ${userId} (${userRole}) 的图标`);
// 优先使用传入的用户数据中的头像信息
if (userData) {
// 尝试使用avatarPath相对路径
if (userData.avatarPath) {
console.log(`📸 [LocationModule] 使用用户数据中的avatarPath: ${userData.avatarPath}`);
const fullAvatarUrl = `${API_BASE_URL}${userData.avatarPath}`;
return await avatarCache.getAvatarPath(fullAvatarUrl);
}
// 尝试使用avatarUrl完整URL
if (userData.avatarUrl) {
console.log(`📸 [LocationModule] 使用用户数据中的avatarUrl: ${userData.avatarUrl}`);
return await avatarCache.getAvatarPath(userData.avatarUrl);
}
// 尝试使用avatar兼容字段
if (userData.avatar) {
console.log(`📸 [LocationModule] 使用用户数据中的avatar: ${userData.avatar}`);
return await avatarCache.getAvatarPath(userData.avatar);
}
}
// 其次尝试从全局数据获取当前用户的头像
const app = getApp<any>();
if (app.globalData.userInfo && app.globalData.userInfo.id === userId) {
if (app.globalData.userInfo.avatarUrl) {
console.log(`📸 [LocationModule] 使用全局数据中的avatarPath: ${app.globalData.userInfo.avatarPath}`);
const fullAvatarUrl = `${API_BASE_URL}${app.globalData.userInfo.avatarPath}`;
return await avatarCache.getAvatarPath(fullAvatarUrl);
}
}
// 最后尝试从页面数据获取用户信息
const userInfo = this.dataModule.getData().userInfo;
if (userInfo && userInfo.id === userId) {
if (userInfo.avatarPath) {
console.log(`📸 [LocationModule] 使用页面数据中的avatarPath: ${userInfo.avatarPath}`);
const fullAvatarUrl = `${API_BASE_URL}${userInfo.avatarPath}`;
return await avatarCache.getAvatarPath(fullAvatarUrl);
}
}
// 如果所有头像获取都失败,使用默认图标
console.log(`⚠️ [LocationModule] 用户 ${userId} 没有头像数据,使用默认图标`);
if (userRole === 'ADMIN') {
return '/images/crown.png'; // 管理员图标
return '/images/crown.png'; // 使用现有的皇冠图标作为管理员图标
} else if (userRole === 'DRIVER') {
return '/images/truck.png'; // 司机图标
return '/images/truck.png'; // 使用现有的卡车图标作为司机图标
} else {
return '/images/truck.png'; // 普通员工也使用货运图标
return '/images/user-avatar.png'; // 使用现有的用户头像作为普通员工图标
}
}
}

View File

@@ -3,7 +3,10 @@ import { showToast } from '../../../utils/helpers';
import { UserInfo } from '../../../types';
import userService from '../../../services/userService';
import locationTrackingService from '../../../services/locationTrackingService';
import employeeService from '../../../services/employeeService';
import { avatarCache } from '../../../utils/avatarCache';
import { DataModule } from './dataModule';
import { API_BASE_URL } from '../../../services/apiService';
export class LoginModule {
private dataModule: DataModule;
@@ -25,8 +28,8 @@ export class LoginModule {
/**
* 登录成功后更新页面状态
*/
public updatePageAfterLogin(userInfo: UserInfo): void {
this.dataModule.updateUserInfo(userInfo);
public async updatePageAfterLogin(userInfo: UserInfo): Promise<void> {
await this.dataModule.updateUserInfo(userInfo);
}
/**
@@ -107,7 +110,7 @@ export class LoginModule {
const result = await userService.wxLogin();
if (result.success && result.userInfo) {
// 登录成功,更新页面状态
this.updatePageAfterLogin(result.userInfo);
await this.updatePageAfterLogin(result.userInfo);
console.log('手动登录成功');
return true;
}
@@ -297,7 +300,7 @@ export class LoginModule {
name: signInResult.employeeInfo.name,
phone: signInResult.employeeInfo.phone
};
this.updatePageAfterLogin(app.globalData.userInfo);
await this.updatePageAfterLogin(app.globalData.userInfo);
}
}
@@ -313,15 +316,6 @@ export class LoginModule {
}
}
// 启动位置追踪服务WebSocket连接
try {
// 启动位置追踪服务建立WebSocket连接
await locationTrackingService.startTracking();
console.log('位置追踪服务已启动');
} catch (trackingError) {
console.warn('启动位置追踪失败,但不影响签到:', trackingError);
}
// 加载业务数据(所有登录用户)
try {
console.log('用户签到成功,开始加载业务数据');
@@ -350,6 +344,25 @@ export class LoginModule {
}
}
// 预加载所有必要的头像并等待完成
try {
console.log('开始预加载所有必要的头像');
await this.preloadAllAvatars();
console.log('所有头像预加载完成');
} catch (avatarError) {
console.warn('头像预加载失败,但不影响签到:', avatarError);
}
// 启动位置追踪服务WebSocket连接- 在所有必要数据加载和头像预加载完成后启动
try {
console.log('所有必要数据加载和头像预加载完成,开始启动位置追踪服务');
// 启动位置追踪服务建立WebSocket连接
await locationTrackingService.startTracking();
console.log('位置追踪服务已启动');
} catch (trackingError) {
console.warn('启动位置追踪失败,但不影响签到:', trackingError);
}
return true;
} else {
console.warn('签到失败:', signInResult.message);
@@ -510,4 +523,59 @@ export class LoginModule {
return null;
}
}
/**
* 预加载所有必要的头像
*/
private async preloadAllAvatars(): Promise<void> {
console.log('🔄 [LoginModule] 开始收集需要预加载的头像URL');
const avatarUrls: string[] = [];
// 1. 当前用户的头像
const app = getApp<any>();
if (app.globalData.userInfo && app.globalData.userInfo.avatarPath) {
const fullAvatarUrl = `${API_BASE_URL}${app.globalData.userInfo.avatarPath}`;
avatarUrls.push(fullAvatarUrl);
console.log(`👤 [LoginModule] 添加当前用户头像: ${fullAvatarUrl}`);
}
// 2. 员工列表中的头像(如果是管理员)
if (app.globalData.userInfo && app.globalData.userInfo.role === 'ADMIN') {
try {
// 获取员工数据
const mainPageModule = this.pageContext.data.mainPageModule;
if (mainPageModule && mainPageModule.getEmployeeModule) {
// 直接调用员工服务获取员工数据
const employees = await employeeService.getEmployees();
console.log(`📋 [LoginModule] 获取到 ${employees.length} 名员工数据`);
// 处理员工头像路径
employees.forEach((employee, index) => {
if (employee.avatarPath) {
// 将相对路径转换为完整URL
const fullAvatarUrl = `${API_BASE_URL}${employee.avatarPath}`;
avatarUrls.push(fullAvatarUrl);
console.log(`👥 [LoginModule] 添加员工 ${index + 1} 头像: ${fullAvatarUrl}`);
} else {
console.log(` [LoginModule] 员工 ${index + 1} 没有设置头像`);
}
});
}
} catch (error) {
console.warn('获取员工数据失败,跳过员工头像预加载:', error);
}
}
console.log(`📊 [LoginModule] 总共需要预加载 ${avatarUrls.length} 个头像`);
if (avatarUrls.length > 0) {
// 等待所有头像预加载完成
await avatarCache.preloadAvatarsAndWait(avatarUrls);
console.log('✅ [LoginModule] 所有头像预加载完成');
} else {
console.log(' [LoginModule] 没有需要预加载的头像');
}
}
}