190 lines
4.6 KiB
TypeScript
190 lines
4.6 KiB
TypeScript
// pages/main/journal-date/index.ts
|
|
import config from "../../../config/index";
|
|
import Time from "../../../utils/Time";
|
|
import { Journal, JournalPageType } from "../../../types/Journal";
|
|
import { MediaAttachType } from "../../../types/Attachment";
|
|
|
|
interface JournalInfo {
|
|
id: number;
|
|
date: string;
|
|
time: string;
|
|
location?: string;
|
|
idea?: string;
|
|
items: Array<{
|
|
type: number;
|
|
thumbURL: string;
|
|
sourceURL: string;
|
|
mongoId: string;
|
|
}>;
|
|
}
|
|
|
|
interface SelectedDateInfo {
|
|
displayDate: string;
|
|
journals: JournalInfo[];
|
|
}
|
|
|
|
interface JournalDateData {
|
|
journalMap: Record<string, number[]>; // 存储每个日期的日记 id 列表
|
|
selectedDate: SelectedDateInfo | null;
|
|
isLoading: boolean;
|
|
popupVisible: boolean; // popup 显示状态
|
|
}
|
|
|
|
Page({
|
|
data: <JournalDateData>{
|
|
journalMap: {},
|
|
selectedDate: null,
|
|
isLoading: true,
|
|
popupVisible: false
|
|
},
|
|
|
|
async onLoad() {
|
|
await this.loadJournals();
|
|
},
|
|
|
|
/** 加载所有日记 */
|
|
async loadJournals() {
|
|
this.setData({ isLoading: true });
|
|
try {
|
|
const list: Journal[] = await new Promise((resolve, reject) => {
|
|
wx.request({
|
|
url: `${config.url}/journal/list`,
|
|
method: "POST",
|
|
header: {
|
|
Key: wx.getStorageSync("key")
|
|
},
|
|
data: {
|
|
page: 0,
|
|
size: 9007199254740992,
|
|
type: JournalPageType.PREVIEW
|
|
},
|
|
success: (resp: any) => {
|
|
if (resp.data.code === 20000) {
|
|
resolve(resp.data.data.list);
|
|
} else {
|
|
reject(new Error(resp.data.message || "加载失败"));
|
|
}
|
|
},
|
|
fail: reject
|
|
});
|
|
}) || [];
|
|
|
|
// 按日期分组,只存储 id
|
|
const journalMap: Record<string, number[]> = {};
|
|
list.forEach((journal: any) => {
|
|
const date = new Date(journal.createdAt);
|
|
const dateKey = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;
|
|
|
|
if (!journalMap[dateKey]) {
|
|
journalMap[dateKey] = [];
|
|
}
|
|
journalMap[dateKey].push(journal.id);
|
|
});
|
|
|
|
// 按 id 倒序排序每天的日记
|
|
Object.keys(journalMap).forEach(dateKey => {
|
|
journalMap[dateKey].sort((a, b) => b - a);
|
|
});
|
|
|
|
this.setData({
|
|
journalMap,
|
|
isLoading: false
|
|
});
|
|
} catch (err: any) {
|
|
wx.showToast({
|
|
title: err.message || "加载失败",
|
|
icon: "error"
|
|
});
|
|
this.setData({ isLoading: false });
|
|
}
|
|
},
|
|
|
|
/** 日期选择事件(来自 calendar 组件) */
|
|
onDateSelect(e: WechatMiniprogram.CustomEvent) {
|
|
const { date, year, month, day } = e.detail;
|
|
const journalIds = this.data.journalMap[date];
|
|
|
|
if (!journalIds || journalIds.length === 0) {
|
|
wx.showToast({
|
|
title: "该日期无日记",
|
|
icon: "none"
|
|
});
|
|
return;
|
|
}
|
|
|
|
// 调用接口获取详情
|
|
this.loadJournalsByIds(journalIds, `${year} 年 ${month} 月 ${day} 日`);
|
|
},
|
|
/** 根据 id 列表加载日记详情 */
|
|
async loadJournalsByIds(ids: number[], displayDate: string) {
|
|
wx.showLoading({ title: "加载中...", mask: true });
|
|
try {
|
|
const list: Journal[] = await new Promise((resolve, reject) => {
|
|
wx.request({
|
|
url: `${config.url}/journal/list/ids`,
|
|
method: "POST",
|
|
header: {
|
|
Key: wx.getStorageSync("key")
|
|
},
|
|
data: ids,
|
|
success: (resp: any) => {
|
|
if (resp.data.code === 20000) {
|
|
resolve(resp.data.data);
|
|
} else {
|
|
reject(new Error(resp.data.message || "加载失败"));
|
|
}
|
|
},
|
|
fail: reject
|
|
});
|
|
}) || [];
|
|
|
|
// 转换为 JournalInfo 格式
|
|
const journals: JournalInfo[] = list.sort((a, b) => a.createdAt! - b.createdAt!).map((journal: any) => {
|
|
const date = new Date(journal.createdAt);
|
|
return {
|
|
id: journal.id,
|
|
date: Time.toPassedDateTime(journal.createdAt),
|
|
time: `${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}`,
|
|
location: journal.location,
|
|
idea: journal.idea,
|
|
items: journal.items
|
|
.filter((item: any) => item.attachType === MediaAttachType.THUMB)
|
|
.map((item: any) => {
|
|
const ext = JSON.parse(item.ext);
|
|
return {
|
|
type: ext.isVideo ? 1 : 0,
|
|
thumbURL: `${config.url}/attachment/read/${item.mongoId}`,
|
|
sourceURL: `${config.url}/attachment/read/${ext.sourceMongoId}`,
|
|
mongoId: item.mongoId,
|
|
};
|
|
})
|
|
};
|
|
});
|
|
|
|
this.setData({
|
|
selectedDate: {
|
|
displayDate,
|
|
journals
|
|
},
|
|
popupVisible: true // 显示 popup
|
|
});
|
|
|
|
wx.hideLoading();
|
|
} catch (err: any) {
|
|
wx.hideLoading();
|
|
wx.showToast({
|
|
title: err.message || "加载失败",
|
|
icon: "error"
|
|
});
|
|
}
|
|
},
|
|
|
|
/** 关闭详情 */
|
|
closeDetail() {
|
|
this.setData({
|
|
popupVisible: false,
|
|
selectedDate: null
|
|
});
|
|
}
|
|
});
|