houzhongjian
2024-08-08 820397e43a0b64d35c6d31d2a55475061438593b
提交 | 用户 | 时间
820397 1 <template>
H 2   <!-- 搜索 -->
3   <ContentWrap>
4     <el-form
5       class="-mb-15px"
6       :model="queryParams"
7       ref="queryFormRef"
8       :inline="true"
9       label-width="68px"
10     >
11       <el-form-item label="文件路径" prop="path">
12         <el-input
13           v-model="queryParams.path"
14           placeholder="请输入文件路径"
15           clearable
16           @keyup.enter="handleQuery"
17         />
18       </el-form-item>
19       <el-form-item label="文件类型" prop="type" width="80">
20         <el-input
21           v-model="queryParams.type"
22           placeholder="请输入文件类型"
23           clearable
24           @keyup.enter="handleQuery"
25         />
26       </el-form-item>
27       <el-form-item label="创建时间" prop="createTime">
28         <el-date-picker
29           v-model="queryParams.createTime"
30           value-format="YYYY-MM-DD HH:mm:ss"
31           type="daterange"
32           start-placeholder="开始日期"
33           end-placeholder="结束日期"
34           :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
35         />
36       </el-form-item>
37       <el-form-item>
38         <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
39         <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
40         <el-button type="primary" plain @click="openForm">
41           <Icon icon="ep:upload" class="mr-5px" /> 上传文件
42         </el-button>
43       </el-form-item>
44     </el-form>
45   </ContentWrap>
46
47   <!-- 列表 -->
48   <ContentWrap>
49     <el-table v-loading="loading" :data="list">
50       <el-table-column label="文件名" align="center" prop="name" :show-overflow-tooltip="true" />
51       <el-table-column label="文件路径" align="center" prop="path" :show-overflow-tooltip="true" />
52       <el-table-column label="URL" align="center" prop="url" :show-overflow-tooltip="true" />
53       <el-table-column
54         label="文件大小"
55         align="center"
56         prop="size"
57         width="120"
58         :formatter="fileSizeFormatter"
59       />
60       <el-table-column label="文件类型" align="center" prop="type" width="180px" />
61       <el-table-column label="文件内容" align="center" prop="url" width="110px">
62         <template #default="{ row }">
63           <el-image
64             v-if="row.type.includes('image')"
65             class="h-80px w-80px"
66             lazy
67             :src="row.url"
68             :preview-src-list="[row.url]"
69             preview-teleported
70             fit="cover"
71           />
72           <el-link
73             v-else-if="row.type.includes('pdf')"
74             type="primary"
75             :href="row.url"
76             :underline="false"
77             target="_blank"
78             >预览</el-link
79           >
80           <el-link v-else type="primary" download :href="row.url" :underline="false" target="_blank"
81             >下载</el-link
82           >
83         </template>
84       </el-table-column>
85       <el-table-column
86         label="上传时间"
87         align="center"
88         prop="createTime"
89         width="180"
90         :formatter="dateFormatter"
91       />
92       <el-table-column label="操作" align="center">
93         <template #default="scope">
94           <el-button
95             link
96             type="danger"
97             @click="handleDelete(scope.row.id)"
98             v-hasPermi="['infra:file:delete']"
99           >
100             删除
101           </el-button>
102         </template>
103       </el-table-column>
104     </el-table>
105     <!-- 分页 -->
106     <Pagination
107       :total="total"
108       v-model:page="queryParams.pageNo"
109       v-model:limit="queryParams.pageSize"
110       @pagination="getList"
111     />
112   </ContentWrap>
113
114   <!-- 表单弹窗:添加/修改 -->
115   <FileForm ref="formRef" @success="getList" />
116 </template>
117 <script lang="ts" setup>
118 import { fileSizeFormatter } from '@/utils'
119 import { dateFormatter } from '@/utils/formatTime'
120 import * as FileApi from '@/api/infra/file'
121 import FileForm from './FileForm.vue'
122
123 defineOptions({ name: 'InfraFile' })
124
125 const message = useMessage() // 消息弹窗
126 const { t } = useI18n() // 国际化
127
128 const loading = ref(true) // 列表的加载中
129 const total = ref(0) // 列表的总页数
130 const list = ref([]) // 列表的数据
131 const queryParams = reactive({
132   pageNo: 1,
133   pageSize: 10,
134   name: undefined,
135   type: undefined,
136   path: undefined,
137   createTime: []
138 })
139 const queryFormRef = ref() // 搜索的表单
140
141 /** 查询列表 */
142 const getList = async () => {
143   loading.value = true
144   try {
145     const data = await FileApi.getFilePage(queryParams)
146     list.value = data.list
147     total.value = data.total
148   } finally {
149     loading.value = false
150   }
151 }
152
153 /** 搜索按钮操作 */
154 const handleQuery = () => {
155   queryParams.pageNo = 1
156   getList()
157 }
158
159 /** 重置按钮操作 */
160 const resetQuery = () => {
161   queryFormRef.value.resetFields()
162   handleQuery()
163 }
164
165 /** 添加/修改操作 */
166 const formRef = ref()
167 const openForm = () => {
168   formRef.value.open()
169 }
170
171 /** 删除按钮操作 */
172 const handleDelete = async (id: number) => {
173   try {
174     // 删除的二次确认
175     await message.delConfirm()
176     // 发起删除
177     await FileApi.deleteFile(id)
178     message.success(t('common.delSuccess'))
179     // 刷新列表
180     await getList()
181   } catch {}
182 }
183
184 /** 初始化 **/
185 onMounted(() => {
186   getList()
187 })
188 </script>