From b76de9a566e4435146a970aa22333a58f87b485b Mon Sep 17 00:00:00 2001
From: WXL <wl_5969728@163.com>
Date: 星期四, 11 六月 2026 09:52:54 +0800
Subject: [PATCH] 青岛维护
---
unpackage/dist/dev/mp-weixin/components/attachment/index.js | 369 ++++++++++++++++++++--------------------------------
1 files changed, 141 insertions(+), 228 deletions(-)
diff --git a/unpackage/dist/dev/mp-weixin/components/attachment/index.js b/unpackage/dist/dev/mp-weixin/components/attachment/index.js
index 189470f..47c3e6d 100644
--- a/unpackage/dist/dev/mp-weixin/components/attachment/index.js
+++ b/unpackage/dist/dev/mp-weixin/components/attachment/index.js
@@ -4,87 +4,44 @@
if (!Array) {
const _easycom_uni_icons2 = common_vendor.resolveComponent("uni-icons");
const _easycom_uni_popup2 = common_vendor.resolveComponent("uni-popup");
- const _easycom_uni_file_picker2 = common_vendor.resolveComponent("uni-file-picker");
- (_easycom_uni_icons2 + _easycom_uni_popup2 + _easycom_uni_file_picker2)();
+ (_easycom_uni_icons2 + _easycom_uni_popup2)();
}
const _easycom_uni_icons = () => "../../node-modules/@dcloudio/uni-ui/lib/uni-icons/uni-icons.js";
const _easycom_uni_popup = () => "../../node-modules/@dcloudio/uni-ui/lib/uni-popup/uni-popup.js";
-const _easycom_uni_file_picker = () => "../../node-modules/@dcloudio/uni-ui/lib/uni-file-picker/uni-file-picker.js";
if (!Math) {
- (_easycom_uni_icons + _easycom_uni_popup + _easycom_uni_file_picker)();
+ (_easycom_uni_icons + _easycom_uni_popup)();
}
const _sfc_main = {
__name: "index",
props: {
- files: {
- type: Array,
- default: () => []
- },
- gradesFiles: {
- // 鏂板灞炴�э細鎴愮哗鍗曢檮浠跺垪琛�
- type: Array,
- default: () => []
- },
- readonly: {
- type: Boolean,
- default: false
- },
- position: {
- type: Object,
- default: () => ({
- right: "30rpx",
- bottom: "200rpx"
- })
- },
- bgColor: {
- type: String,
- default: "#67AFAB"
- },
- maxCount: {
- type: Number,
- default: 9
- },
- showGradeSlip: {
- type: Boolean,
- default: false
- },
- isGradeRequired: {
- type: Boolean,
- default: false
- }
+ files: { type: Array, default: () => [] },
+ gradesFiles: { type: Array, default: () => [] },
+ readonly: { type: Boolean, default: false },
+ position: { type: Object, default: () => ({ right: "30rpx", bottom: "200rpx" }) },
+ bgColor: { type: String, default: "#67AFAB" },
+ maxCount: { type: Number, default: 9 },
+ showGradeSlip: { type: Boolean, default: false },
+ isGradeRequired: { type: Boolean, default: false }
},
- emits: [
- "update:files",
- "update:gradesFiles",
- // 鏂板浜嬩欢锛氭洿鏂版垚缁╁崟闄勪欢
- "upload",
- "preview",
- "upload-grade",
- // 鏂板浜嬩欢锛氫笂浼犳垚缁╁崟闄勪欢
- "upload-base"
- // 鏂板浜嬩欢锛氫笂浼犲熀纭�闄勪欢
- ],
+ emits: ["update:files", "update:gradesFiles", "upload", "preview", "upload-grade", "upload-base"],
setup(__props, { expose: __expose, emit: __emit }) {
const userStore = stores_user.useUserStore();
const props = __props;
const emit = __emit;
const popup = common_vendor.ref(null);
- const filePicker = common_vendor.ref(null);
const baseFiles = common_vendor.ref([]);
const gradeFiles = common_vendor.ref([]);
const showButton = common_vendor.ref(true);
const mainColor = common_vendor.ref("#67AFAB");
const baseUrlHt = userStore.baseUrlHt;
const currentTab = common_vendor.ref("base");
+ const blobUrls = common_vendor.ref([]);
const currentFileList = common_vendor.computed(() => {
- if (!props.showGradeSlip) {
+ if (!props.showGradeSlip)
return baseFiles.value;
- }
return currentTab.value === "base" ? baseFiles.value : gradeFiles.value;
});
- const totalFileCount = common_vendor.computed(() => {
- return baseFiles.value.length + gradeFiles.value.length;
- });
+ const totalFileCount = common_vendor.computed(() => baseFiles.value.length + gradeFiles.value.length);
common_vendor.watch(() => props.files, (newFiles) => {
baseFiles.value = [...newFiles];
}, { immediate: true });
@@ -95,23 +52,16 @@
if (!path)
return "";
if (path.startsWith("http://") || path.startsWith("https://")) {
- return path;
+ try {
+ const url = new URL(path);
+ return `${baseUrlHt}${url.pathname}${url.search}${url.hash}`;
+ } catch {
+ return path;
+ }
}
return `${baseUrlHt}${path.startsWith("/") ? "" : "/"}${path}`;
};
- const imageStyles = {
- width: 120,
- height: 120,
- border: false
- };
- const supportedImageTypes = [
- "image/jpeg",
- "image/png",
- "image/gif",
- "image/webp",
- "image/bmp",
- "image/svg+xml"
- ];
+ const supportedImageTypes = ["image/jpeg", "image/png", "image/gif", "image/webp", "image/bmp", "image/svg+xml"];
const onPopupChange = (e) => {
showButton.value = !e.show;
};
@@ -151,57 +101,21 @@
return `${(size / (1024 * 1024)).toFixed(1)}MB`;
};
const togglePopup = () => {
- if (popup.value) {
- popup.value.open();
- }
+ var _a;
+ (_a = popup.value) == null ? void 0 : _a.open();
};
const closePopup = () => {
- if (popup.value) {
- popup.value.close();
- }
- };
- const chooseFile = () => {
var _a;
- (_a = filePicker.value) == null ? void 0 : _a.choose();
+ (_a = popup.value) == null ? void 0 : _a.close();
};
- const getFileTypeFromName = (filename) => {
- if (!filename)
- return "application/octet-stream";
- const ext = filename.split(".").pop().toLowerCase();
- const typeMap = {
- jpg: "image/jpeg",
- jpeg: "image/jpeg",
- png: "image/png",
- gif: "image/gif",
- webp: "image/webp",
- bmp: "image/bmp",
- SVG: "image/svg+xml",
- pdf: "application/pdf"
- };
- return typeMap[ext] || "application/octet-stream";
- };
- const onFileSelect = (e) => {
+ const addFilesToCurrentTab = (newFiles) => {
const isGradeTab = props.showGradeSlip && currentTab.value === "grade";
const targetFiles = isGradeTab ? gradeFiles.value : baseFiles.value;
- const newFiles = e.tempFiles.filter((file) => {
- const fileExt = file.name ? file.name.split(".").pop().toLowerCase() : "";
- const isImage = supportedImageTypes.includes(file.type) || ["jpg", "jpeg", "png", "gif", "webp", "bmp", "svg"].includes(fileExt);
- const isPDF = file.type && file.type.includes("pdf") || fileExt === "pdf";
- return isImage || isPDF;
- }).map((file) => ({
- name: file.name,
- url: file.path || file.url,
- type: file.type || getFileTypeFromName(file.name),
- size: file.size,
- file,
- status: "pending",
- // 鏄庣‘鏍囪闄勪欢绫诲瀷
- attachmentType: isGradeTab ? "grade" : "base"
- }));
if (targetFiles.length + newFiles.length > props.maxCount) {
- common_vendor.index.showToast({
- title: `鏈�澶氬彧鑳戒笂浼�${props.maxCount}涓枃浠禶,
- icon: "none"
+ common_vendor.index.showToast({ title: `鏈�澶氬彧鑳戒笂浼�${props.maxCount}涓枃浠禶, icon: "none" });
+ newFiles.forEach((f) => {
+ if (f.url && f.url.startsWith("blob:"))
+ URL.revokeObjectURL(f.url);
});
return;
}
@@ -213,12 +127,66 @@
emit("update:files", baseFiles.value);
}
};
- const getAllFiles = () => {
- return [...baseFiles.value, ...gradeFiles.value];
+ const chooseFile = () => {
+ common_vendor.index.showActionSheet({
+ itemList: ["鎷嶇収/鐩稿唽", "浠庤亰澶╄褰曢�夋嫨鏂囦欢"],
+ success: (res) => {
+ const remain = props.maxCount - currentFileList.value.length;
+ if (remain <= 0) {
+ common_vendor.index.showToast({ title: `鏈�澶氫笂浼�${props.maxCount}涓枃浠禶, icon: "none" });
+ return;
+ }
+ if (res.tapIndex === 0) {
+ common_vendor.index.chooseImage({
+ count: remain,
+ sizeType: ["original", "compressed"],
+ sourceType: ["album", "camera"],
+ success: (chooseRes) => {
+ const files = chooseRes.tempFiles.map((file) => ({
+ name: file.name || "image.jpg",
+ path: file.path,
+ url: file.path,
+ uploadPath: file.path,
+ // 灏忕▼搴忎复鏃舵枃浠惰矾寰�
+ type: file.type || "image/jpeg",
+ size: file.size,
+ raw: file,
+ status: "pending"
+ }));
+ addFilesToCurrentTab(files);
+ }
+ });
+ } else if (res.tapIndex === 1) {
+ common_vendor.index.chooseMessageFile({
+ count: remain,
+ type: "all",
+ success: (chooseRes) => {
+ const files = chooseRes.tempFiles.map((file) => ({
+ name: file.name,
+ path: file.path,
+ url: file.path,
+ uploadPath: file.path,
+ type: file.type,
+ size: file.size,
+ raw: file,
+ status: "pending"
+ }));
+ addFilesToCurrentTab(files);
+ }
+ });
+ }
+ }
+ });
};
const removeFile = (type, index, event) => {
- if (event) {
+ if (event)
event.stopPropagation();
+ const file = type === "grade" ? gradeFiles.value[index] : baseFiles.value[index];
+ if (file.url && file.url.startsWith("blob:")) {
+ URL.revokeObjectURL(file.url);
+ const idx = blobUrls.value.indexOf(file.url);
+ if (idx !== -1)
+ blobUrls.value.splice(idx, 1);
}
if (type === "grade") {
gradeFiles.value.splice(index, 1);
@@ -229,38 +197,21 @@
}
};
const previewFile = (file) => {
- const fullUrl = getFullUrl(file.url);
+ let previewUrl = file.url;
+ if (previewUrl && !previewUrl.startsWith("blob:") && !previewUrl.startsWith("file://") && !previewUrl.startsWith("/")) {
+ previewUrl = getFullUrl(previewUrl);
+ }
if (file.type && supportedImageTypes.includes(file.type)) {
- const allFiles = getAllFiles();
- common_vendor.index.previewImage({
- urls: allFiles.filter((f) => f.type && supportedImageTypes.includes(f.type)).map((f) => getFullUrl(f.url)),
- current: fullUrl
- });
+ const allFiles = [...baseFiles.value, ...gradeFiles.value];
+ const imageUrls = allFiles.filter((f) => f.type && supportedImageTypes.includes(f.type)).map((f) => f.url.startsWith("blob:") || f.url.startsWith("file://") || f.url.startsWith("/") ? f.url : getFullUrl(f.url));
+ common_vendor.index.previewImage({ urls: imageUrls, current: previewUrl });
} else if (file.type && file.type.includes("pdf")) {
common_vendor.index.downloadFile({
- url: fullUrl,
+ url: previewUrl,
success: (res) => {
- const filePath = res.tempFilePath;
- common_vendor.index.openDocument({
- filePath,
- fileType: "pdf",
- success: () => common_vendor.index.__f__("log", "at components/attachment/index.vue:358", "鎵撳紑PDF鎴愬姛"),
- fail: (err) => {
- common_vendor.index.__f__("error", "at components/attachment/index.vue:360", "鎵撳紑PDF澶辫触", err);
- common_vendor.index.showToast({
- title: "鎵撳紑PDF澶辫触",
- icon: "none"
- });
- }
- });
+ common_vendor.index.openDocument({ filePath: res.tempFilePath, fileType: "pdf" });
},
- fail: (err) => {
- common_vendor.index.__f__("error", "at components/attachment/index.vue:369", "涓嬭浇PDF澶辫触", err);
- common_vendor.index.showToast({
- title: "涓嬭浇PDF澶辫触",
- icon: "none"
- });
- }
+ fail: () => common_vendor.index.showToast({ title: "鎵撳紑PDF澶辫触", icon: "none" })
});
} else {
emit("preview", file);
@@ -269,63 +220,55 @@
const uploadFile = (file, type) => {
return new Promise((resolve, reject) => {
const token = common_vendor.index.getStorageSync("token");
+ let filePath = file.uploadPath || file.url || file.path;
+ if (!filePath || typeof filePath !== "string") {
+ reject(new Error("鏃犳晥鐨勬枃浠惰矾寰�"));
+ return;
+ }
+ let uploadUrl = "/api/common/upload";
+ uploadUrl = "https://opo.qduh.cn/common/upload";
common_vendor.index.uploadFile({
- url: "/api/common/upload",
- filePath: file.path || file.url,
+ url: uploadUrl,
+ filePath,
name: "file",
- header: {
- "Authorization": `Bearer ${token}`
- },
+ header: { "Authorization": `Bearer ${token}` },
success: (res) => {
if (res.statusCode === 200) {
- const data = JSON.parse(res.data);
- common_vendor.index.__f__("log", "at components/attachment/index.vue:397", data, "鏂囦欢");
- if (data.code === 200) {
- resolve({
- ...data,
- fileName: data.fileName
- });
- } else {
- reject(new Error(data.msg || "涓婁紶澶辫触"));
+ try {
+ const data = JSON.parse(res.data);
+ if (data.code === 200)
+ resolve({ ...data, fileName: data.fileName });
+ else
+ reject(new Error(data.msg || "涓婁紶澶辫触"));
+ } catch {
+ reject(new Error("瑙f瀽鍝嶅簲澶辫触"));
}
- } else {
+ } else
reject(new Error(`涓婁紶澶辫触锛岀姸鎬佺爜: ${res.statusCode}`));
- }
},
- fail: (err) => {
- reject(err);
- }
+ fail: reject
});
});
};
const confirmUpload = async () => {
if (props.showGradeSlip && props.isGradeRequired && gradeFiles.value.length === 0) {
- common_vendor.index.showToast({
- title: "璇蜂笂浼犳垚缁╁崟闄勪欢",
- icon: "none"
- });
+ common_vendor.index.showToast({ title: "璇蜂笂浼犳垚缁╁崟闄勪欢", icon: "none" });
currentTab.value = "grade";
return;
}
- const allFiles = getAllFiles();
- if (allFiles.length === 0) {
- common_vendor.index.showToast({
- title: "璇峰厛娣诲姞闄勪欢",
- icon: "none"
- });
+ const totalPending = [...baseFiles.value, ...gradeFiles.value].filter((f) => !f.url || f.status === "pending").length;
+ if (totalPending === 0) {
+ common_vendor.index.showToast({ title: "娌℃湁寰呬笂浼犵殑鏂囦欢", icon: "none" });
return;
}
- common_vendor.index.showLoading({
- title: "涓婁紶涓�",
- mask: true
- });
+ common_vendor.index.showLoading({ title: "涓婁紶涓�", mask: true });
try {
- const pendingBaseFiles = baseFiles.value.filter((file) => !file.url || file.status === "pending");
- const pendingGradeFiles = gradeFiles.value.filter((file) => !file.url || file.status === "pending");
- for (const file of pendingBaseFiles) {
+ const pendingBase = baseFiles.value.filter((f) => !f.url || f.status === "pending");
+ const pendingGrade = gradeFiles.value.filter((f) => !f.url || f.status === "pending");
+ for (const file of pendingBase) {
try {
file.status = "uploading";
- const res = await uploadFile(file.file, "base");
+ const res = await uploadFile(file, "base");
Object.assign(file, {
url: res.url,
fileName: res.name,
@@ -335,19 +278,15 @@
size: res.size
});
emit("upload-base", file);
- } catch (error) {
- common_vendor.index.__f__("error", "at components/attachment/index.vue:466", "涓婁紶澶辫触:", error);
+ } catch (err) {
file.status = "error";
- common_vendor.index.showToast({
- title: `鏂囦欢 ${file.name} 涓婁紶澶辫触`,
- icon: "none"
- });
+ common_vendor.index.showToast({ title: `鏂囦欢 ${file.name} 涓婁紶澶辫触`, icon: "none" });
}
}
- for (const file of pendingGradeFiles) {
+ for (const file of pendingGrade) {
try {
file.status = "uploading";
- const res = await uploadFile(file.file, "grade");
+ const res = await uploadFile(file, "grade");
Object.assign(file, {
url: res.fileName,
fileName: res.fileName,
@@ -356,41 +295,29 @@
status: "success"
});
emit("upload-grade", file);
- } catch (error) {
- common_vendor.index.__f__("error", "at components/attachment/index.vue:489", "鎴愮哗鍗曢檮浠朵笂浼犲け璐�:", error);
+ } catch (err) {
file.status = "error";
- common_vendor.index.showToast({
- title: `鏂囦欢 ${file.name} 涓婁紶澶辫触`,
- icon: "none"
- });
+ common_vendor.index.showToast({ title: `鏂囦欢 ${file.name} 涓婁紶澶辫触`, icon: "none" });
}
}
- common_vendor.index.__f__("log", "at components/attachment/index.vue:497", baseFiles.value, "1");
- common_vendor.index.__f__("log", "at components/attachment/index.vue:498", gradeFiles.value, "2");
emit("update:files", baseFiles.value);
emit("update:gradesFiles", gradeFiles.value);
- common_vendor.index.showToast({
- title: "涓婁紶瀹屾垚",
- icon: "success"
- });
+ common_vendor.index.showToast({ title: "涓婁紶瀹屾垚", icon: "success" });
closePopup();
} catch (error) {
- common_vendor.index.__f__("error", "at components/attachment/index.vue:511", "涓婁紶鍑洪敊:", error);
- common_vendor.index.showToast({
- title: "涓婁紶鍑洪敊",
- icon: "none"
- });
+ common_vendor.index.__f__("error", "at components/attachment/index.vue:398", "涓婁紶鍑洪敊:", error);
+ common_vendor.index.showToast({ title: "涓婁紶鍑洪敊", icon: "none" });
} finally {
common_vendor.index.hideLoading();
}
};
- const getFilesByType = (type) => {
- return type === "grade" ? gradeFiles.value : baseFiles.value;
- };
- __expose({
- getFilesByType,
- getAllFiles
+ const getFilesByType = (type) => type === "grade" ? gradeFiles.value : baseFiles.value;
+ const getAllFiles = () => [...baseFiles.value, ...gradeFiles.value];
+ common_vendor.onBeforeUnmount(() => {
+ blobUrls.value.forEach((url) => URL.revokeObjectURL(url));
+ blobUrls.value = [];
});
+ __expose({ getFilesByType, getAllFiles });
return (_ctx, _cache) => {
return common_vendor.e({
a: totalFileCount.value > 0
@@ -512,21 +439,7 @@
type: "bottom",
["safe-area"]: false
}),
- J: !__props.readonly
- }, !__props.readonly ? {
- K: common_vendor.sr(filePicker, "2d320176-8", {
- "k": "filePicker"
- }),
- L: common_vendor.o(onFileSelect),
- M: common_vendor.o(_ctx.onFileDelete),
- N: common_vendor.p({
- ["auto-upload"]: false,
- ["file-mediatype"]: "all",
- limit: __props.maxCount - currentFileList.value.length,
- ["image-styles"]: imageStyles
- })
- } : {}, {
- O: common_vendor.gei(_ctx, "")
+ J: common_vendor.gei(_ctx, "")
});
};
}
--
Gitblit v1.9.3