Bootstrap

弹框 上传 预览

<!-- 大轮播图 -->
<template>
	<el-upload
					:action="constant.uploadUrl"
					:headers="{ Authorization: cache.getToken() }"
					:before-upload="beforeUpload"
					:on-success="handleSuccess"
					:show-file-list="false"
                    accept="video/*, image/*"
                    style="margin-bottom: 10px;"
				>
					<el-button v-auth="'sys:attachment:save'" icon="Plus" type="primary">上传</el-button>
                 
				</el-upload>
  
 <el-table :data="data.tableData" row-key="id" table-layout="auto" style="width: 100%"  @selection-change="handleSelectionChange">
    <!-- <el-table-column type="selection" header-align="center" align="center" width="50"></el-table-column> -->
			<el-table-column prop="name" label="附件名称" header-align="center" align="center" width="300"></el-table-column>
			<el-table-column label="附件地址" header-align="center" align="center" width="300">
				<template #default="scope">
				<el-button type="text" @click="showAttachment(scope.row.url)">查看</el-button>
				</template>
			</el-table-column> 
			<!-- <el-table-column prop="url" label="附件地址" header-align="center" align="center" width="300"></el-table-column> -->
			<el-table-column prop="createdByName" label="创建人名字	" header-align="center" align="center" width="200"></el-table-column>
            <el-table-column prop="creator" label="创建者" header-align="center" align="center" width="200"></el-table-column>
			<el-table-column prop="size" label="附件大小" header-align="center" align="center" width="200"></el-table-column>
		    <el-table-column label="操作" fixed="right" header-align="center" align="center" width="200">
     <template #default="scope">
       <el-button type="danger" @click="deleteBatchHandle(scope.row.id)">删除</el-button>
     </template>
   </el-table-column>
 </el-table>

	<el-dialog
    v-model="dialogVisible"
    title="附件预览"
    width="900"
    :before-close="handleClose"
  >

    <div v-if="attachmentType === 'image'">
        <img :src="currentAttachmentUrl" alt="附件预览" style="    width: 700px;    margin: 0 6rem; height: auto;" />
      </div>
      <div v-else-if="attachmentType === 'video'">
        <video :src="currentAttachmentUrl" controls style="max-width: 100%; height: auto;"></video>
      </div>
      <div v-else>
        <p>不支持的文件类型。</p>
      </div>

  </el-dialog>

 <el-pagination v-model:current-page="pageNum" v-model:page-size="pageSize" :page-sizes="[10, 20, 30, 50]" layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="getList" @current-change="getList" style="margin-top: 20px;display:flex;justify-content: flex-end;" />
 <CarouselFrom ref="dialogFormRef" @resetList="getList"></CarouselFrom>
</template>

<script setup lang="ts">
import { ref, reactive, onMounted, nextTick } from 'vue'
import { listLink, editLink, deleteLink ,carouselList,carouseldelete} from '@/api/allApi'
import CarouselFrom  from './CarouselFrom.vue'
import { ElMessage, ElMessageBox } from 'element-plus/es'
import constant from '@/utils/constant'
import { IHooksOptions } from '@/hooks/interface'
import cache from '@/utils/cache'
import { convertSizeFormat } from '@/utils/tool'
import type { UploadProps } from 'element-plus'
import { carouselLunBigs } from '@/api/sys/attachment'
import { useCrud } from '@/hooks'
import service from '@/utils/request'
import { el } from 'element-plus/es/locale'


// let tableData = reactive([])
const pageNum = ref(1) //第几页
const pageSize = ref(10) //每页多少条
const total = ref(0) //总条数



const dialogVisible = ref(false)
const currentAttachmentUrl = ref('')
const attachmentType = ref('')

    // 复选框
    const selectedRows = ref([]);
    // 选中行
        const addnum = ref(0); 

	//   获取页面有多少条数据
	const addpagenum = ref("")
	const data = reactive({
	tableData: []
	})

	onMounted(() => {
	getList()
	})

    // 处理选中行的变化
        const handleSelectionChange = (val: { map: (arg0: (item: any) => any) => never[] }) => {
          selectedRows.value = val.map((item: { id: any }) => item.id); // 存储选中的行的id
          console.log( selectedRows.value,'存储选中的行的id')
        };

		
	 const showAttachment = (url: string) => {

      attachmentType.value = getFileTypeFromUrl(url);
      currentAttachmentUrl.value = url;
      dialogVisible.value = true;

	  console.log(  currentAttachmentUrl.value)
    };
 
    const getFileTypeFromUrl = (url: string): string => {
      const ext = url.split('.').pop()?.toLowerCase() ?? '';
      if (['jpg', 'jpeg', 'png', 'gif', 'bmp'].includes(ext)) {
        return 'image';
      } else if (['mp4', 'webm', 'ogg'].includes(ext)) {
        return 'video';
      } else {
        return 'unsupported';
      }
    };
 
    const handleClose = () => {
      dialogVisible.value = false;
      currentAttachmentUrl.value = '';
      attachmentType.value = '';
    };

// 初始化  获取数据
const getList = () => {
 carouselList({
       websiteId: Number(localStorage.getItem('WebsiteId')), //网站id 1:鞍钢官网 2:博物馆
       page: pageNum.value,
       size: pageSize.value
   }).then((res: any) => {
     data.tableData = res.data.list   
   
   })
}

const dialogFormRef = ref()

const state: IHooksOptions = reactive({
	deleteUrl: '/carousel/delete',
})


const queryRef = ref()
const dataForm = reactive({
	name: '',
	size: '',
	url: '',
    tenantId: '',
    websiteId: 1
})

const handleSuccess: UploadProps['onSuccess'] = (res, file) => {
    
  console.log(  dataForm.tenantId,'  dataForm.tenantId')
	if (res.code !== 0) {
		ElMessage.error('上传失败:' + res.msg)
		return false
	}

	Object.assign(dataForm, res.data)
  dataForm.tenantId= JSON.parse(localStorage.getItem('userInfo')).id, //租户id
  dataForm.websiteId= Number(localStorage.getItem('WebsiteId')), //网站id

  console.log(  dataForm.tenantId,'  dataForm.tenantId')

  carouselLunBigs(dataForm).then(() => {
		ElMessage.success({
			message: '上传成功',
			duration: 500,
			onClose: () => {
				getList()
			}
		})
	})
}

const beforeUpload: UploadProps['beforeUpload'] = file => {
	if (file.size / 1024 / 1024 / 100 > 1) {
		ElMessage.error('文件大小不能超过100M')
		return false
	}
	return true
}

const { deleteBatchHandle} = useCrud(state)

</script>

<style lang="scss" scoped>
//搭配el-table里的table-layout="auto"属性,再让每一列里的width为空即可展现出适应表格内容的列宽
:deep(.el-table .cell) {
   width: max-content;
   display: inline-block;
}
</style>

 

;