From ebe3507d1382bb124c1fb895a5e27f7063fdffdc Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期二, 13 一月 2026 16:19:14 +0800
Subject: [PATCH] fix: 规章制度加一个附件功能
---
src/components/Dialog/FileListDialog.vue | 152 +++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 149 insertions(+), 3 deletions(-)
diff --git a/src/components/Dialog/FileListDialog.vue b/src/components/Dialog/FileListDialog.vue
index ea269d7..ebe81dd 100644
--- a/src/components/Dialog/FileListDialog.vue
+++ b/src/components/Dialog/FileListDialog.vue
@@ -5,6 +5,37 @@
:width="width"
:before-close="handleClose"
>
+ <div class="file-list-toolbar" v-if="showToolbar">
+ <template v-if="useBuiltInUpload">
+ <el-upload
+ v-model:file-list="uploadFileList"
+ class="upload-demo"
+ :action="uploadAction"
+ :headers="uploadHeaders"
+ :show-file-list="false"
+ :on-success="handleDefaultUploadSuccess"
+ :on-error="handleDefaultUploadError"
+ >
+ <el-button
+ v-if="showUploadButton"
+ type="primary"
+ size="small"
+ >
+ 涓婁紶闄勪欢
+ </el-button>
+ </el-upload>
+ </template>
+ <template v-else>
+ <el-button
+ v-if="showUploadButton"
+ type="primary"
+ size="small"
+ @click="handleUpload"
+ >
+ 鏂板闄勪欢
+ </el-button>
+ </template>
+ </div>
<el-table :data="tableData" border :height="tableHeight">
<el-table-column
:label="nameColumnLabel"
@@ -38,6 +69,15 @@
>
棰勮
</el-button>
+ <el-button
+ v-if="showDeleteButton"
+ link
+ type="danger"
+ size="small"
+ @click="handleDelete(scope.row, scope.$index)"
+ >
+ 鍒犻櫎
+ </el-button>
<slot name="actions" :row="scope.row"></slot>
</template>
</el-table-column>
@@ -49,7 +89,9 @@
<script setup>
import { ref, computed, getCurrentInstance } from 'vue'
+import { ElMessage } from 'element-plus'
import filePreview from '@/components/filePreview/index.vue'
+import { getToken } from '@/utils/auth'
const props = defineProps({
modelValue: {
@@ -82,7 +124,7 @@
},
actionColumnWidth: {
type: [String, Number],
- default: 100
+ default: 160
},
showActions: {
type: Boolean,
@@ -96,6 +138,14 @@
type: Boolean,
default: true
},
+ showUploadButton: {
+ type: Boolean,
+ default: false
+ },
+ showDeleteButton: {
+ type: Boolean,
+ default: false
+ },
urlField: {
type: String,
default: 'url'
@@ -107,13 +157,30 @@
previewMethod: {
type: Function,
default: null
+ },
+ uploadMethod: {
+ type: Function,
+ default: null
+ },
+ deleteMethod: {
+ type: Function,
+ default: null
+ },
+ rulesRegulationsManagementId: {
+ type: [String, Number],
+ default: ''
+ },
+ uploadUrl: {
+ type: String,
+ default: `${import.meta.env.VITE_APP_BASE_API}/file/upload`
}
})
-const emit = defineEmits(['update:modelValue', 'close', 'download', 'preview'])
+const emit = defineEmits(['update:modelValue', 'close', 'download', 'preview', 'upload', 'delete'])
const { proxy } = getCurrentInstance()
const filePreviewRef = ref(null)
+const uploadFileList = ref([])
const dialogVisible = computed({
get: () => props.modelValue,
@@ -121,6 +188,12 @@
})
const tableData = ref([])
+const showToolbar = computed(() => props.showUploadButton)
+const useBuiltInUpload = computed(() => !props.uploadMethod)
+const uploadAction = computed(() => props.uploadUrl)
+const uploadHeaders = computed(() => ({
+ Authorization: `Bearer ${getToken()}`
+}))
const handleClose = () => {
emit('close')
@@ -154,11 +227,84 @@
tableData.value = list || []
}
+const handleUpload = async () => {
+ if (props.uploadMethod) {
+ const newItem = await props.uploadMethod()
+ if (newItem) {
+ addAttachment(newItem)
+ }
+ }
+ emit('upload')
+}
+
+const handleDelete = async (row, index) => {
+ if (props.deleteMethod) {
+ const result = await props.deleteMethod(row, index)
+ if (result === false) {
+ return
+ }
+ // 濡傛灉鎻愪緵浜� deleteMethod锛岀敱鐖剁粍浠惰礋璐e埛鏂板垪琛紝涓嶅湪杩欓噷鍒犻櫎
+ } else {
+ // 濡傛灉娌℃湁鎻愪緵 deleteMethod锛屾墠鍦ㄧ粍浠跺唴閮ㄥ垹闄�
+ removeAttachment(index)
+ }
+ emit('delete', row)
+}
+
+const addAttachment = (item) => {
+ tableData.value = [...tableData.value, item]
+}
+
+const handleDefaultUploadSuccess = async (res, file) => {
+ if (res?.code !== 200) {
+ ElMessage.error(res?.msg || '鏂囦欢涓婁紶澶辫触')
+ return
+ }
+ if (!props.rulesRegulationsManagementId) {
+ ElMessage.error('缂哄皯瑙勭珷鍒跺害ID锛屾棤娉曚繚瀛橀檮浠�')
+ return
+ }
+ const fileName = res?.data?.originalName || file?.name
+ const fileUrl = res?.data?.tempPath || res?.data?.url
+ const payload = {
+ fileName,
+ fileUrl,
+ rulesRegulationsManagementId: props.rulesRegulationsManagementId,
+ raw: res?.data || {}
+ }
+ emit('upload', payload)
+}
+
+const handleDefaultUploadError = () => {
+ ElMessage.error('鏂囦欢涓婁紶澶辫触')
+}
+
+const removeAttachment = (index) => {
+ if (index > -1 && index < tableData.value.length) {
+ const newList = [...tableData.value]
+ newList.splice(index, 1)
+ tableData.value = newList
+ }
+}
+
+const setList = (list) => {
+ tableData.value = list || []
+}
+
defineExpose({
- open
+ open,
+ addAttachment,
+ removeAttachment,
+ setList,
+ handleUpload,
+ handleDelete
})
</script>
<style scoped>
+.file-list-toolbar {
+ margin-bottom: 8px;
+ text-align: right;
+}
</style>
--
Gitblit v1.9.3