2024-05-26 20:47:29 +08:00
|
|
|
|
<template>
|
|
|
|
|
<el-card class="dr-task" body-class="task-card" shadow="never">
|
|
|
|
|
<template #header>绘画任务</template>
|
2024-05-28 10:37:44 +08:00
|
|
|
|
<ImageTaskCard
|
|
|
|
|
v-for="image in imageList"
|
|
|
|
|
:key="image"
|
|
|
|
|
:image-detail="image"
|
|
|
|
|
@on-btn-click="handlerImageBtnClick" />
|
2024-05-26 20:47:29 +08:00
|
|
|
|
</el-card>
|
2024-05-26 20:59:42 +08:00
|
|
|
|
<!-- 图片 detail 抽屉 -->
|
|
|
|
|
<ImageDetailDrawer
|
2024-05-28 14:29:46 +08:00
|
|
|
|
:show="isShowImageDetail"
|
|
|
|
|
:id="showImageDetailId"
|
2024-05-26 20:59:42 +08:00
|
|
|
|
@handler-drawer-close="handlerDrawerClose"
|
|
|
|
|
/>
|
2024-05-26 20:47:29 +08:00
|
|
|
|
</template>
|
|
|
|
|
<script setup lang="ts">
|
2024-05-26 21:51:42 +08:00
|
|
|
|
import {ImageApi, ImageDetailVO} from '@/api/ai/image';
|
2024-05-26 20:59:42 +08:00
|
|
|
|
import ImageDetailDrawer from './ImageDetailDrawer.vue'
|
2024-05-26 21:51:42 +08:00
|
|
|
|
import ImageTaskCard from './ImageTaskCard.vue'
|
2024-05-26 20:59:42 +08:00
|
|
|
|
|
2024-05-28 10:37:44 +08:00
|
|
|
|
const message = useMessage() // 消息弹窗
|
|
|
|
|
|
2024-05-26 21:51:42 +08:00
|
|
|
|
const imageList = ref<ImageDetailVO[]>([]) // image 列表
|
2024-05-28 09:51:58 +08:00
|
|
|
|
const imageListInterval = ref<any>() // image 列表定时器,刷新列表
|
2024-06-01 16:49:42 +08:00
|
|
|
|
const isShowImageDetail = ref<boolean>(false) // 是否显示 task 详情
|
2024-05-28 14:29:46 +08:00
|
|
|
|
const showImageDetailId = ref<number>(0) // 是否显示 task 详情
|
2024-05-26 20:59:42 +08:00
|
|
|
|
|
2024-06-01 16:49:42 +08:00
|
|
|
|
// TODO @fan:如果是简单注释,建议用 /** */,主要是现在项目里是这种风格哈,保持一致好点~
|
|
|
|
|
|
2024-05-26 20:59:42 +08:00
|
|
|
|
/**
|
2024-05-26 21:51:42 +08:00
|
|
|
|
* 抽屉 - close
|
2024-05-26 20:59:42 +08:00
|
|
|
|
*/
|
|
|
|
|
const handlerDrawerClose = async () => {
|
2024-05-28 14:29:46 +08:00
|
|
|
|
isShowImageDetail.value = false
|
2024-05-26 20:59:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-05-26 21:51:42 +08:00
|
|
|
|
/**
|
|
|
|
|
* 任务 - detail
|
|
|
|
|
*/
|
|
|
|
|
const handlerDrawerOpen = async () => {
|
2024-05-28 14:29:46 +08:00
|
|
|
|
isShowImageDetail.value = true
|
2024-05-26 21:51:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取 - image 列表
|
|
|
|
|
*/
|
|
|
|
|
const getImageList = async () => {
|
2024-05-27 17:14:03 +08:00
|
|
|
|
const { list } = await ImageApi.getImageList({pageNo: 1, pageSize: 20})
|
|
|
|
|
imageList.value = list
|
2024-05-26 21:51:42 +08:00
|
|
|
|
}
|
2024-05-26 20:59:42 +08:00
|
|
|
|
|
2024-05-26 21:56:10 +08:00
|
|
|
|
/**
|
|
|
|
|
* 图片 - btn click
|
|
|
|
|
*/
|
|
|
|
|
const handlerImageBtnClick = async (type, imageDetail: ImageDetailVO) => {
|
2024-05-28 14:29:46 +08:00
|
|
|
|
// 获取 image detail id
|
|
|
|
|
showImageDetailId.value = imageDetail.id
|
|
|
|
|
// 处理不用 btn
|
2024-05-26 21:56:10 +08:00
|
|
|
|
if (type === 'more') {
|
|
|
|
|
await handlerDrawerOpen()
|
2024-05-28 10:37:44 +08:00
|
|
|
|
} else if (type === 'delete') {
|
|
|
|
|
await message.confirm(`是否删除照片?`)
|
|
|
|
|
await ImageApi.deleteImage(imageDetail.id)
|
|
|
|
|
await getImageList()
|
|
|
|
|
await message.success("删除成功!")
|
2024-05-28 11:35:02 +08:00
|
|
|
|
} else if (type === 'download') {
|
2024-05-28 14:29:46 +08:00
|
|
|
|
await downloadImage(imageDetail.picUrl)
|
2024-05-26 21:56:10 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2024-05-28 11:35:02 +08:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 下载 - image
|
|
|
|
|
*/
|
2024-06-01 16:49:42 +08:00
|
|
|
|
// TODO @fan:貌似可以考虑抽到 download 里面,作为一个方法
|
2024-05-28 11:35:02 +08:00
|
|
|
|
const downloadImage = async (imageUrl) => {
|
|
|
|
|
const image = new Image()
|
|
|
|
|
image.setAttribute('crossOrigin', 'anonymous')
|
|
|
|
|
image.src = imageUrl
|
|
|
|
|
image.onload = () => {
|
|
|
|
|
const canvas = document.createElement('canvas')
|
|
|
|
|
canvas.width = image.width
|
|
|
|
|
canvas.height = image.height
|
|
|
|
|
const ctx = canvas.getContext('2d')
|
|
|
|
|
ctx.drawImage(image, 0, 0, image.width, image.height)
|
|
|
|
|
const url = canvas.toDataURL('image/png')
|
|
|
|
|
const a = document.createElement('a')
|
|
|
|
|
a.href = url
|
|
|
|
|
a.download = 'image.png'
|
|
|
|
|
a.click()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-27 17:35:18 +08:00
|
|
|
|
//
|
|
|
|
|
defineExpose({getImageList})
|
2024-05-26 21:51:42 +08:00
|
|
|
|
//
|
|
|
|
|
onMounted(async () => {
|
2024-05-28 09:51:58 +08:00
|
|
|
|
// 获取 image 列表
|
2024-05-26 21:51:42 +08:00
|
|
|
|
await getImageList()
|
2024-05-28 09:51:58 +08:00
|
|
|
|
// 自动刷新 image 列表
|
|
|
|
|
imageListInterval.value = setInterval(async () => {
|
|
|
|
|
await getImageList()
|
2024-05-30 16:12:42 +08:00
|
|
|
|
}, 1000 * 20)
|
2024-05-28 09:51:58 +08:00
|
|
|
|
})
|
|
|
|
|
//
|
|
|
|
|
onUnmounted(async () => {
|
|
|
|
|
|
2024-05-26 21:51:42 +08:00
|
|
|
|
})
|
2024-05-26 20:47:29 +08:00
|
|
|
|
</script>
|
|
|
|
|
|
2024-05-27 17:20:03 +08:00
|
|
|
|
<style lang="scss">
|
|
|
|
|
.task-card {
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: row;
|
|
|
|
|
flex-wrap: wrap;
|
2024-05-28 14:40:43 +08:00
|
|
|
|
align-content: flex-start;
|
2024-05-27 17:43:03 +08:00
|
|
|
|
height: 100%;
|
|
|
|
|
overflow: auto;
|
2024-05-27 17:20:03 +08:00
|
|
|
|
|
|
|
|
|
>div {
|
|
|
|
|
margin-right: 20px;
|
2024-05-27 17:35:18 +08:00
|
|
|
|
margin-bottom: 20px;
|
2024-05-27 17:20:03 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
</style>
|
2024-05-26 20:47:29 +08:00
|
|
|
|
|
2024-05-27 17:20:03 +08:00
|
|
|
|
<style scoped lang="scss">
|
2024-05-26 20:47:29 +08:00
|
|
|
|
.dr-task {
|
|
|
|
|
width: 100%;
|
|
|
|
|
height: 100%;
|
|
|
|
|
}
|
|
|
|
|
</style>
|