From 4d9da000fbe74d344e0e4580b138e79d4ad98ede Mon Sep 17 00:00:00 2001
From: WXL <wl_5969728@163.com>
Date: 星期一, 01 六月 2026 11:07:14 +0800
Subject: [PATCH] 维护
---
components/attachment/index.vue | 156 +++++++++++++++++----------------------------------
1 files changed, 52 insertions(+), 104 deletions(-)
diff --git a/components/attachment/index.vue b/components/attachment/index.vue
index 3a7309d..e1b80d7 100644
--- a/components/attachment/index.vue
+++ b/components/attachment/index.vue
@@ -1,55 +1,32 @@
<template>
<view class="attachment-upload">
<!-- 闄勪欢鎮诞鎸夐挳 -->
- <view
- class="attachment-btn"
- :style="{
- right: position.right,
- bottom: position.bottom,
- backgroundColor: bgColor,
- display: showButton ? 'flex' : 'none',
- }"
- @click="togglePopup"
- >
+ <view class="attachment-btn" :style="{
+ right: position.right,
+ bottom: position.bottom,
+ backgroundColor: bgColor,
+ display: showButton ? 'flex' : 'none',
+ }" @click="togglePopup">
<text>闄勪欢</text>
<text class="badge" v-if="totalFileCount > 0">{{ totalFileCount }}</text>
</view>
<!-- 闄勪欢寮瑰眰 -->
- <uni-popup
- ref="popup"
- type="bottom"
- :safe-area="false"
- @change="onPopupChange"
- >
+ <uni-popup ref="popup" type="bottom" :safe-area="false" @change="onPopupChange">
<view class="attachment-popup">
<!-- 寮瑰眰鏍囬 -->
<view class="popup-header">
<text class="title">闄勪欢绠$悊</text>
- <uni-icons
- v-if="!readonly"
- type="plus"
- size="24"
- :color="mainColor"
- @click="chooseFile"
- />
+ <uni-icons v-if="!readonly" type="plus" size="24" :color="mainColor" @click="chooseFile" />
<uni-icons type="close" size="24" color="#999" @click="closePopup" />
</view>
<!-- 鏍囩椤靛垏鎹� -->
<view v-if="showGradeSlip" class="attachment-tabs">
- <view
- class="tab-item"
- :class="{ active: currentTab === 'base' }"
- @click="currentTab = 'base'"
- >
+ <view class="tab-item" :class="{ active: currentTab === 'base' }" @click="currentTab = 'base'">
<text>鍩虹闄勪欢</text>
</view>
- <view
- class="tab-item"
- :class="{ active: currentTab === 'grade' }"
- @click="currentTab = 'grade'"
- >
+ <view class="tab-item" :class="{ active: currentTab === 'grade' }" @click="currentTab = 'grade'">
<text>鎴愮哗鍗曢檮浠�</text>
<text class="required-mark" v-if="isGradeRequired">*</text>
</view>
@@ -59,17 +36,9 @@
<scroll-view scroll-y class="file-list">
<!-- 鍩虹闄勪欢鍒楄〃 -->
<template v-if="currentTab === 'base' || !showGradeSlip">
- <view
- class="file-item"
- v-for="(file, index) in baseFiles"
- :key="'base-' + index"
- >
+ <view class="file-item" v-for="(file, index) in baseFiles" :key="'base-' + index">
<view class="file-icon" @click="previewFile(file)">
- <uni-icons
- :type="getFileIcon(file.type)"
- size="24"
- :color="getFileColor(file.type)"
- />
+ <uni-icons :type="getFileIcon(file.type)" size="24" :color="getFileColor(file.type)" />
</view>
<view class="file-info" @click="previewFile(file)">
<text class="file-name">{{ file.originalFilename || file.name }}</text>
@@ -77,29 +46,16 @@
<text class="file-status" v-if="file.status === 'uploading'">涓婁紶涓�...</text>
<text class="file-status error" v-else-if="file.status === 'error'">涓婁紶澶辫触</text>
</view>
- <uni-icons
- v-if="!readonly"
- type="trash"
- size="20"
- color="#ff4d4f"
- @click="(e) => removeFile('base', index, e)"
- />
+ <uni-icons v-if="!readonly" type="trash" size="20" color="#ff4d4f"
+ @click="(e) => removeFile('base', index, e)" />
</view>
</template>
<!-- 鎴愮哗鍗曢檮浠跺垪琛� -->
<template v-if="currentTab === 'grade' && showGradeSlip">
- <view
- class="file-item"
- v-for="(file, index) in gradeFiles"
- :key="'grade-' + index"
- >
+ <view class="file-item" v-for="(file, index) in gradeFiles" :key="'grade-' + index">
<view class="file-icon" @click="previewFile(file)">
- <uni-icons
- :type="getFileIcon(file.type)"
- size="24"
- :color="getFileColor(file.type)"
- />
+ <uni-icons :type="getFileIcon(file.type)" size="24" :color="getFileColor(file.type)" />
</view>
<view class="file-info" @click="previewFile(file)">
<text class="file-name">{{ file.originalFilename || file.name }}</text>
@@ -107,44 +63,31 @@
<text class="file-status" v-if="file.status === 'uploading'">涓婁紶涓�...</text>
<text class="file-status error" v-else-if="file.status === 'error'">涓婁紶澶辫触</text>
</view>
- <uni-icons
- v-if="!readonly"
- type="trash"
- size="20"
- color="#ff4d4f"
- @click="(e) => removeFile('grade', index, e)"
- />
+ <uni-icons v-if="!readonly" type="trash" size="20" color="#ff4d4f"
+ @click="(e) => removeFile('grade', index, e)" />
</view>
</template>
<!-- 绌虹姸鎬� -->
<view class="empty" v-if="currentFileList.length === 0">
<uni-icons type="info" size="24" color="#999" />
- <text v-if="currentTab === 'base' || !showGradeSlip">鏆傛棤鍩虹闄勪欢</text>
+ <text v-if="currentTab === 'base' || !showGradeSlip">鏆傛棤闄勪欢</text>
<text v-else-if="currentTab === 'grade'">鏆傛棤鎴愮哗鍗曢檮浠�</text>
</view>
</scroll-view>
<!-- 鎿嶄綔鎸夐挳 -->
<view class="popup-footer" v-if="!readonly">
- <button class="btn" @click="chooseFile">娣诲姞{{ currentTab === 'grade' ? '鎴愮哗鍗�' : '鍩虹' }}闄勪欢</button>
+ <button class="btn" @click="chooseFile">娣诲姞</button>
<button class="btn primary" @click="confirmUpload">纭涓婁紶</button>
</view>
</view>
</uni-popup>
<!-- 鏂囦欢閫夋嫨鍣� -->
- <uni-file-picker
- ref="filePicker"
- v-if="!readonly"
- :auto-upload="false"
- file-mediatype="all"
- :limit="maxCount - currentFileList.length"
- :image-styles="imageStyles"
- @select="onFileSelect"
- @delete="onFileDelete"
- style="display: none"
- />
+ <uni-file-picker ref="filePicker" v-if="!readonly" :auto-upload="false" file-mediatype="all"
+ :limit="maxCount - currentFileList.length" :image-styles="imageStyles" @select="onFileSelect"
+ @delete="onFileDelete" style="display: none" />
</view>
</template>
@@ -192,9 +135,9 @@
});
const emit = defineEmits([
- "update:files",
+ "update:files",
"update:gradesFiles", // 鏂板浜嬩欢锛氭洿鏂版垚缁╁崟闄勪欢
- "upload",
+ "upload",
"preview",
"upload-grade", // 鏂板浜嬩欢锛氫笂浼犳垚缁╁崟闄勪欢
"upload-base" // 鏂板浜嬩欢锛氫笂浼犲熀纭�闄勪欢
@@ -332,7 +275,7 @@
// 鏄庣‘纭畾褰撳墠鏄熀纭�闄勪欢杩樻槸鎴愮哗鍗曢檮浠�
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() : "";
@@ -379,7 +322,7 @@
if (event) {
event.stopPropagation();
}
-
+
// 涓ユ牸鎸夌被鍨嬪垹闄�
if (type === 'grade') {
gradeFiles.value.splice(index, 1);
@@ -393,7 +336,7 @@
// 棰勮鏂囦欢
const previewFile = (file) => {
const fullUrl = getFullUrl(file.url);
-
+
if (file.type && supportedImageTypes.includes(file.type)) {
// 棰勮鍥剧墖
const allFiles = getAllFiles();
@@ -440,7 +383,7 @@
const uploadFile = (file, type) => {
return new Promise((resolve, reject) => {
const token = uni.getStorageSync('token');
-
+
uni.uploadFile({
url: '/api/common/upload',
filePath: file.path || file.url,
@@ -451,6 +394,8 @@
success: (res) => {
if (res.statusCode === 200) {
const data = JSON.parse(res.data);
+ console.log(data, '鏂囦欢');
+
if (data.code === 200) {
resolve({
...data,
@@ -498,26 +443,27 @@
try {
// 鍒嗗埆澶勭悊鍩虹闄勪欢鍜屾垚缁╁崟闄勪欢鐨勪笂浼�
- const pendingBaseFiles = baseFiles.value.filter(file =>
+ const pendingBaseFiles = baseFiles.value.filter(file =>
!file.url || file.status === 'pending');
- const pendingGradeFiles = gradeFiles.value.filter(file =>
+ const pendingGradeFiles = gradeFiles.value.filter(file =>
!file.url || file.status === 'pending');
-
+
// 涓婁紶鍩虹闄勪欢
for (const file of pendingBaseFiles) {
try {
file.status = 'uploading';
const res = await uploadFile(file.file, 'base');
Object.assign(file, {
- url: res.fileName,
- fileName: res.fileName,
+ url: res.url,
+ fileName: res.name,
newFileName: res.newFileName,
originalFilename: res.originalFilename,
- status: 'success'
+ status: 'success',
+ size: res.size
});
emit("upload-base", file);
} catch (error) {
- console.error('鍩虹闄勪欢涓婁紶澶辫触:', error);
+ console.error('涓婁紶澶辫触:', error);
file.status = 'error';
uni.showToast({
title: `鏂囦欢 ${file.name} 涓婁紶澶辫触`,
@@ -525,7 +471,7 @@
});
}
}
-
+
// 涓婁紶鎴愮哗鍗曢檮浠�
for (const file of pendingGradeFiles) {
try {
@@ -548,14 +494,14 @@
});
}
}
- console.log(baseFiles.value,'1');
- console.log(gradeFiles.value,'2');
-
+ console.log(baseFiles.value, '1');
+ console.log(gradeFiles.value, '2');
+
// 鏇存柊鏂囦欢鍒楄〃
emit("update:files", baseFiles.value);
emit("update:gradesFiles", gradeFiles.value);
// emit("upload", allFiles);
-
+
uni.showToast({
title: '涓婁紶瀹屾垚',
icon: 'success'
@@ -590,7 +536,7 @@
display: flex;
border-bottom: 1px solid #eee;
margin-bottom: 20rpx;
-
+
.tab-item {
flex: 1;
text-align: center;
@@ -598,13 +544,13 @@
position: relative;
font-size: 28rpx;
color: #666;
-
+
&.active {
color: #67AFAB;
font-weight: bold;
border-bottom: 4rpx solid #67AFAB;
}
-
+
.required-mark {
color: red;
position: absolute;
@@ -614,7 +560,7 @@
}
}
}
-
+
// 鍏朵粬鏍峰紡淇濇寔涓嶅彉
.attachment-btn {
position: fixed;
@@ -674,6 +620,7 @@
.uni-icons {
padding: 10rpx;
+
&:active {
opacity: 0.7;
}
@@ -718,12 +665,12 @@
color: #999;
display: block;
}
-
+
.file-status {
font-size: 24rpx;
color: #666;
display: block;
-
+
&.error {
color: #ff4d4f;
}
@@ -732,6 +679,7 @@
.uni-icons {
padding: 10rpx;
+
&:active {
opacity: 0.7;
}
--
Gitblit v1.9.3