refactor travel

This commit is contained in:
Timi
2025-12-13 18:44:37 +08:00
parent 880e702288
commit 69659a1746
37 changed files with 4154 additions and 400 deletions

View File

@ -1,106 +1,174 @@
// pages/main/travel/travel.ts
// pages/main/travel/index.ts
import config from "../../../config/index";
import Time from "../../../utils/Time";
import { TravelApi } from "../../../api/TravelApi";
import { Travel, TravelPage, TravelStatus, TravelStatusLabel, TravelStatusIcon, TransportationTypeLabel } from "../../../types/Travel";
import { OrderType } from "../../../types/Model";
export type Luggage = {
gao: LuggageItem[];
yu: LuggageItem[];
}
export type LuggageItem = {
name: string;
isTaken: boolean;
}
type Guide = {
title: string;
images: string[];
}
interface ITravelData {
luggage?: Luggage;
guides: Guide[];
guidesDB: Guide[];
activeCollapse?: number;
interface TravelData {
/** 分页参数 */
page: TravelPage;
/** 旅行列表 */
list: Travel[];
/** 当前筛选状态 */
currentStatus: TravelStatus | "ALL";
/** 是否正在加载 */
isFetching: boolean;
/** 是否已加载完成 */
isFinished: boolean;
/** 是否显示筛选菜单 */
isShowFilterMenu: boolean;
/** 菜单位置 */
menuTop: number;
menuLeft: number;
/** 状态标签映射 */
statusLabels: typeof TravelStatusLabel;
/** 状态图标映射 */
statusIcons: typeof TravelStatusIcon;
/** 交通类型标签映射 */
transportLabels: typeof TransportationTypeLabel;
}
Page({
data: <ITravelData>{
luggage: undefined,
guides: [],
guidesDB: [],
activeCollapse: undefined
data: <TravelData>{
page: {
index: 0,
size: 10,
orderMap: {
travelAt: OrderType.DESC
}
},
list: [],
currentStatus: "ALL",
isFetching: false,
isFinished: false,
isShowFilterMenu: false,
menuTop: 0,
menuLeft: 0,
statusLabels: TravelStatusLabel,
statusIcons: TravelStatusIcon,
transportLabels: TransportationTypeLabel
},
onLoad() {
wx.request({
url: `${config.url}/journal/travel`,
method: "GET",
header: {
Key: wx.getStorageSync("key")
},
success: async (resp: any) => {
this.setData({
luggage: resp.data.data.luggage,
guides: resp.data.data.guides.map((item: any) => {
return {
title: item.title,
images: [] // 留空分批加载
}
}),
guidesDB: resp.data.data.guides
})
}
});
this.resetAndFetch();
},
onShow() {
wx.request({
url: `${config.url}/journal/travel`,
method: "GET",
header: {
Key: wx.getStorageSync("key")
},
success: async (resp: any) => {
this.setData({
luggage: resp.data.data.luggage
});
}
});
},
toLuggageList(e: WechatMiniprogram.BaseEvent) {
const { name } = e.currentTarget.dataset;
wx.setStorageSync("luggage", {
name,
luggage: this.data.luggage
});
wx.navigateTo({
"url": "/pages/main/travel/luggage/index"
})
},
onCollapseChange(e: any) {
const index = e.detail.value;
if (this.data.guides[index].images.length === 0) {
this.data.guides[index].images = this.data.guidesDB[index].images.map((item: any) => {
return `${config.url}/attachment/read/${item}`;
});
this.setData({
guides: this.data.guides
})
}
onHide() {
this.setData({
activeCollapse: index
})
isShowFilterMenu: false
});
},
preview(e: WechatMiniprogram.BaseEvent) {
const { index, imageIndex } = e.currentTarget.dataset;
const images = this.data.guides[index].images;
wx.previewMedia({
current: imageIndex,
sources: images.map((image: any) => {
return {
url: image,
type: "image"
onPullDownRefresh() {
this.resetAndFetch();
wx.stopPullDownRefresh();
},
onReachBottom() {
this.fetch();
},
/** 重置并获取数据 */
resetAndFetch() {
this.setData({
page: {
index: 0,
size: 10,
orderMap: {
travelAt: OrderType.DESC
},
equalsExample: this.data.currentStatus === "ALL" ? undefined : {
status: this.data.currentStatus as TravelStatus
}
})
})
},
list: [],
isFetching: false,
isFinished: false
});
this.fetch();
},
/** 获取旅行列表 */
async fetch() {
if (this.data.isFetching || this.data.isFinished) {
return;
}
this.setData({ isFetching: true });
try {
const pageResult = await TravelApi.getList(this.data.page);
const list = pageResult.list || [];
if (list.length === 0) {
this.setData({ isFinished: true });
return;
}
// 格式化数据
list.forEach(travel => {
if (travel.travelAt) {
travel.travelDate = Time.toDate(travel.travelAt);
travel.travelTime = Time.toTime(travel.travelAt);
}
});
this.setData({
page: {
...this.data.page,
index: this.data.page.index + 1
},
list: this.data.list.concat(list),
isFinished: list.length < this.data.page.size
});
} catch (error) {
console.error("获取旅行列表失败:", error);
} finally {
this.setData({ isFetching: false });
}
},
/** 切换筛选菜单 */
toggleFilterMenu() {
if (!this.data.isShowFilterMenu) {
// 打开菜单时计算位置
const query = wx.createSelectorQuery();
query.select(".filter-btn").boundingClientRect();
query.exec((res) => {
if (res[0]) {
const { top, left, height } = res[0];
this.setData({
isShowFilterMenu: true,
menuTop: top + height + 16,
menuLeft: left
});
}
});
} else {
// 关闭菜单
this.setData({
isShowFilterMenu: false
});
}
},
/** 阻止事件冒泡 */
stopPropagation() {
// 空函数,仅用于阻止事件冒泡
},
/** 筛选状态 */
filterByStatus(e: WechatMiniprogram.BaseEvent) {
const status = e.currentTarget.dataset.status as TravelStatus | "ALL";
this.setData({
currentStatus: status,
isShowFilterMenu: false
});
this.resetAndFetch();
},
/** 新建旅行 */
toCreate() {
wx.navigateTo({
url: "/pages/main/travel-editor/index"
});
},
/** 查看详情 */
toDetail(e: WechatMiniprogram.BaseEvent) {
const { id } = e.currentTarget.dataset;
wx.navigateTo({
url: `/pages/main/travel-detail/index?id=${id}`
});
},
});