This commit is contained in:
owenchen committed 2026-10-20 21:51:06 +08:00
1 parent 6417562c4f
commit f1e6e116c3
31 files changed
+2065 -309

No files matched your search

@@ -37,6 +37,7 @@ import familyPersonService from "@/service/master/familyPersonService";
import familyTreeService from "@/service/master/familyTreeService";
import dmsFileService from "@/service/master/dmsFileService";
import { useLoginProfileStore } from "@/stores";
import { chooseFiles } from "@/utils/chooseFiles";
/** ready:组件挂载完成通知(时序口径见文件底部 onMounted 注释) */
const emit = defineEmits<{ (e: "ready"): void }>();
@@ -1334,22 +1335,50 @@ function clearLocalFile(): void {
localFileName.value = "";
}
/** uni.chooseFile 选本地 .fm 并读文本(H5 原生 File.text / App FileSystemManager),与服务器列表通道互斥 */
// #ifdef APP-PLUS
// 项目 types 未含 plus 声明,App 运行时真实存在,本地宽松兜底
// eslint-disable-next-line ts/no-explicit-any
declare const plus: any;
/** App 侧读文本:plus.io FileReader(uni.getFileSystemManager 仅小程序可用,App 上调会 undefined) */
function readLocalText(filePath: string): Promise<string> {
return new Promise((resolve, reject) => {
plus.io.resolveLocalFileSystemURL(
filePath,
(entry: any) => {
entry.file(
(file: any) => {
const reader = new plus.io.FileReader();
reader.onloadend = (event: any) => resolve(String(event.target.result ?? ""));
reader.onerror = (error: any) => reject(error);
reader.readAsText(file, "utf-8");
},
reject,
);
},
reject,
);
});
}
// #endif
/** 选本地 .fm 并读文本(H5 File.text / 小程序 FileSystemManager / App plus.io FileReader),与服务器列表通道互斥 */
async function pickLocalFile(): Promise<void> {
try {
const picked: any = await new Promise((resolve, reject) => {
uni.chooseFile({ count: 1, extension: [".fm"], success: resolve, fail: reject });
});
const file = picked.tempFiles?.[0];
const name = String(file?.name || picked.tempFilePaths?.[0]?.split("/").pop() || "exchange.fm");
// 选文件统一走 chooseFiles:uni.chooseFile 在 App 端不存在(官方仅 H5/小程序支持)
const picked = await chooseFiles(1, { extension: [".fm"] });
const file = picked[0];
if (!file) {
return;
}
let text = "";
// #ifdef H5
text = await file.text();
text = await (file.raw as File).text();
// #endif
// #ifndef H5
// #ifdef MP
const res: any = await new Promise((resolve, reject) => {
uni.getFileSystemManager().readFile({
filePath: picked.tempFilePaths[0],
filePath: file.filePath,
encoding: "utf8",
success: resolve,
fail: reject,
@@ -1357,17 +1386,20 @@ async function pickLocalFile(): Promise<void> {
});
text = String(res.data ?? "");
// #endif
// #ifdef APP-PLUS
text = await readLocalText(file.filePath);
// #endif
if (!text.trim()) {
toast(t("FamilyTreePage.exchangeLocalBad"));
return;
}
localFileText.value = text;
localFileName.value = name;
localFileName.value = file.name;
pickedFileName.value = "";
}
catch (e: any) {
// 用户取消不算错(errMsg 含 cancel),其余给统一读失败提示
if (!String(e?.errMsg ?? e ?? "").includes("cancel")) {
if (!String(e?.errMsg ?? e?.message ?? e ?? "").includes("cancel")) {
toast(t("FamilyTreePage.exchangeLocalBad"));
console.warn("[familyTreeExchange] choose local file failed:", e);
}
@@ -2702,7 +2734,8 @@ defineExpose({
.tree-page__body--list {
display: block;
box-sizing: border-box;
padding: 20rpx;
/* 顶部让出系统状态栏(App 端 navigationStyle:custom 会顶到状态栏;H5 下变量为 0) */
padding: calc(20rpx + var(--status-bar-height, 0px)) 20rpx 20rpx;
}
/* ===== 顶部两张卡片:用户身份 + 网盘用量(白底圆角,与下方族谱面板同宽同调) ===== */