yn_img_tools_app/src/pages/comprehensiveQuery/components/photo-recent.vue

329 lines
8.6 KiB
Vue

<template>
<!-- 最近上传 -->
<view class="photo-class">
<view class="title">
<view @tap="onHandleLastUpload">最近上传</view>
<view @tap="onHandleMyCollect">我的收藏</view>
</view>
<view>
<up-grid :border="false" col="2">
<up-grid-item v-for="(icon, index) in props?.imgList" :key="index">
<!-- <up-image width="40" height="40" :src="icon.iconUrl" />
<text class="grid-text">{{ icon.title }}</text>
<text class="count">5100</text> -->
<view class="grid-item-box">
<up-image
width="100%"
height="120"
:src="icon.imgUrl"
mode="aspectFit"
@tap="onHandleImage(icon)"
>
<template #error>
<!-- <view style="font-size: 24rpx; height: 120px">加载失败</view> -->
</template>
</up-image>
<view class="collect">
<view>{{ icon.uploadTime }}</view>
<view @tap="onHandleCollect(icon)">
<up-icon
size="18"
:color="icon.collectStatus == 1 ? '#f56c6c' : '#999'"
:name="icon.collectStatus == 1 ? 'heart-fill' : 'heart'"
/>
</view>
</view>
<view class="photo-type" :style="setBackgroundColor(icon.uploadType)">
{{ imgType[icon.uploadType] }}
</view>
</view>
</up-grid-item>
</up-grid>
</view>
</view>
<!-- 展示图片 -->
<up-popup :show="showImg" mode="center" @close="showImg = !showImg" bgColor="transparent">
<view class="img-show-box">
<up-image width="100%" height="100%" :src="showImgUrl" mode="scaleToFill" style="" />
<view class="upload-btn">
<view @tap="onHandleYtUpload"> 原图下载 </view>
<view @tap="onHandleSyUpload"> 水印下载 </view>
</view>
</view>
</up-popup>
<!-- 退出提示弹框 -->
<up-modal
title="温馨提示"
:show="showModalCollect"
:showCancelButton="true"
@cancel="onCancelCollect"
@confirm="onConfirmCollect"
:content="collectContent"
/>
</template>
<script setup>
import { computed, ref, reactive } from 'vue'
import { useMemberStore } from '@/stores'
import { editCollectTypeApi, getGenerateWatermarkImgApi } from '@/services/comprehensiveQuery.js'
const memberStore = useMemberStore()
const token = memberStore?.token
const baseURL = import.meta.env.VITE_API_BASE_URL // 获取当前的url地址
const showModalCollect = ref(false)
const collectContent = ref('')
// 水印图查询参数
const watermarkQueryParams = reactive({
uploadTime: '',
proName: '',
uploadTypeName: '',
sourceType: '',
sourceTypeName: '',
})
const collectEditParams = ref({
id: '',
collectType: '',
})
const props = defineProps({
imgList: {
type: Array,
default: () => [],
},
})
const imgType = reactive({
1: '安全违章',
2: '质量检查',
3: '安全措施',
4: '协调照片',
5: '重要事项',
})
const emits = defineEmits(['handleMyCollect', 'handleLastUpload', 'handleGetImgList'])
const showImg = ref(false)
const showImgUrl = ref('')
// 收藏与取消收藏
const onHandleCollect = (icon) => {
if (icon.collectStatus == 0) {
collectContent.value = '是否确认把该图片加入我的收藏?'
collectEditParams.value.collectType = 1
} else {
collectContent.value = '是否确认取消收藏?'
collectEditParams.value.collectType = 2
}
collectEditParams.value.id = icon.id
showModalCollect.value = true
}
// 取消按钮
const onCancelCollect = () => {
showModalCollect.value = false
}
// 确定按钮
const onConfirmCollect = async () => {
const res = await editCollectTypeApi(collectEditParams.value)
if (res.code === 200) {
uni.$u.toast('操作成功')
emits('handleGetImgList')
showModalCollect.value = false
} else {
uni.$u.toast(res.msg)
}
}
// 点击图片
const onHandleImage = (icon) => {
const {
uploadTime,
proName,
uploadTypeName,
sourceType,
sourceTypeName,
id,
originalFilePath,
} = icon
Object.assign(watermarkQueryParams, {
uploadTime,
proName,
uploadTypeName,
sourceType,
sourceTypeName,
id,
originalFilePath,
})
showImgUrl.value = icon.imgUrl
showImg.value = true
}
// 定义样式
const setBackgroundColor = (type) => {
if (type == 1) return { backgroundColor: '#f56c6c' }
if (type == 2) return { backgroundColor: '#19be6b' }
if (type == 3) return { backgroundColor: '#ff9900' }
if (type == 4) return { backgroundColor: '#f56ccf' }
if (type == 5) return { backgroundColor: '#00bfbf' }
}
// 原图下载
const onHandleYtUpload = () => {
downloadImage(showImgUrl.value)
}
const downloadImage = async (imageUrl) => {
try {
// 显示加载中
uni.showLoading({
title: '下载中...',
})
// 第一步:下载文件到本地
const { tempFilePath } = await uni.downloadFile({
url: imageUrl,
})
// 第二步:保存到相册
await uni.saveImageToPhotosAlbum({
filePath: tempFilePath,
})
uni.hideLoading()
uni.showToast({
title: '保存成功',
icon: 'none',
})
showImg.value = false
} catch (error) {
uni.hideLoading()
uni.showToast({
title: '保存失败',
icon: 'none',
})
showImg.value = false
// console.error('下载失败:', error)
}
}
// 水印下载
const onHandleSyUpload = async () => {
const res = await getGenerateWatermarkImgApi(watermarkQueryParams)
if (res.code === 200) {
downloadImage(`${baseURL}/imgTool/files${res.data}?token=${token}`)
} else {
uni.showToast({
title: '水印图片获取失败',
icon: 'none',
})
}
// showImg.value = false
}
// 点击我的收藏
const onHandleMyCollect = () => {
emits('handleMyCollect')
}
// 点击最近上传
const onHandleLastUpload = () => {
emits('handleLastUpload')
}
</script>
<style lang="scss" scoped>
.photo-class {
width: 100%;
margin-top: 24rpx;
& .title {
display: flex;
justify-content: space-between;
align-items: center;
padding: 36rpx 0;
& view:first-child {
font-size: 17px;
font-weight: bold;
}
& view:last-child {
margin-right: 16rpx;
color: #4a6fff;
font-size: 14px;
letter-spacing: 1rpx;
}
}
.grid-item-box {
position: relative;
width: 95%;
// height: 100rpx;
margin-bottom: 10rpx;
display: flex;
flex-direction: column;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
border-bottom-right-radius: 16rpx;
border-bottom-left-radius: 16rpx;
.photo-type {
position: absolute;
padding: 0 10rpx;
right: 20rpx;
top: 10rpx;
height: 48rpx;
line-height: 48rpx;
font-size: 12px;
border-radius: 24rpx;
color: #fff;
}
}
.collect {
padding: 16rpx 18rpx;
display: flex;
align-items: center;
justify-content: space-between;
font-size: 12px;
}
}
.img-show-box {
width: 100vw;
height: 50vh;
position: relative;
.upload-btn {
width: 100%;
position: absolute;
bottom: 0;
left: 0;
display: flex;
align-items: center;
& view {
padding: 30rpx 0;
width: 50%;
color: #fff;
text-align: center;
letter-spacing: 2px;
background-color: rgba(0, 0, 0, 0.3);
}
& view:first-child {
margin-right: 1px;
}
}
}
::v-deep .grid-item-box .u-fade-enter-active,
.u-fade-leave-active {
height: 120px;
}
</style>