20260623212917

This commit is contained in:
oneao committed 2026-06-23 21:29:18 +08:00
1 parent e9e3371be7
commit 056cd4970f
30 files changed
+2093 -636

No files matched your search

+86
View File
@@ -0,0 +1,86 @@
import { loadDataApi, saveDataApi, getUniqueIdApi } from "@/request/api";
export type FeedType = "join" | "rename" | "bill" | "fav";
export interface FeedRecord {
id: number;
family_id: number;
user_id: number;
type: FeedType;
content: string;
meta: string | null;
create_time: string;
}
/** 获取用户在家庭中的昵称(来自 b_family_member,非 b_user) */
export async function getFamilyMemberNickname(
familyId: number,
userId: number,
): Promise<string> {
const res = await loadDataApi({
view_name: "b_family_member",
search_condition: "family_id = ? AND user_id = ?",
search_columns: ["nickname"],
order_by: "",
args: [familyId, userId],
});
if (res.isSuccess && res.data?.length > 0) {
return res.data[0].nickname || "成员";
}
return "成员";
}
/** 写入一条动态 — content 直接包含所有展示信息,用 {nickname} 占位 */
export async function recordFeed(
familyId: number,
userId: number,
type: FeedType,
content: string,
) {
const idRes = await getUniqueIdApi(1);
const feedId = idRes.data?.[0];
if (!feedId) return;
await saveDataApi([
{
table_name: "b_family_feed",
key_field: "id",
inserts: [
{
id: feedId,
family_id: familyId,
user_id: userId,
type,
content,
},
],
updates: [],
deletes: [],
},
]);
}
/** 加载家庭动态列表 — 自动替换 {nickname} 占位符 */
export async function loadFeeds(familyId: number): Promise<FeedRecord[]> {
const res = await loadDataApi({
view_name: "b_family_feed",
search_condition: "family_id = ?",
order_by: "create_time DESC",
search_columns: ["id", "family_id", "user_id", "type", "content", "meta", "create_time"],
args: [familyId],
});
const feeds = (res.data || []) as FeedRecord[];
// 批量加载昵称:收集唯一 user_id,逐个查 b_family_member
const uniqueUserIds = [...new Set(feeds.map((f) => f.user_id))];
const nickMap = new Map<number, string>();
for (const uid of uniqueUserIds) {
nickMap.set(uid, await getFamilyMemberNickname(familyId, uid));
}
// 替换 {nickname} 占位符,保证每次展示都是最新昵称
return feeds.map((f) => ({
...f,
content: f.content.replace(/\{nickname\}/g, nickMap.get(f.user_id) || "成员"),
}));
}