169 lines
4.8 KiB
Vue
Raw Normal View History

<template>
2023-04-09 09:56:42 +08:00
<doc-alert title="公众号素材" url="https://doc.iocoder.cn/mp/material/" />
<!-- 搜索工作栏 -->
<ContentWrap>
<el-form class="-mb-15px" :inline="true" label-width="68px">
<el-form-item label="公众号" prop="accountId">
2023-04-14 15:22:23 +08:00
<WxAccountSelect @change="onAccountChanged" />
</el-form-item>
</el-form>
2023-04-09 09:56:42 +08:00
</ContentWrap>
2023-04-08 23:40:21 +08:00
2023-04-09 09:56:42 +08:00
<ContentWrap>
2023-04-12 13:29:24 +08:00
<el-tabs v-model="type" @tab-change="onTabChange">
2023-04-08 23:40:21 +08:00
<!-- tab 1图片 -->
2023-04-15 15:59:33 +08:00
<el-tab-pane :name="MaterialType.Image">
2023-04-08 23:40:21 +08:00
<template #label>
<span> <Icon icon="ep:picture" />图片 </span>
2023-04-08 23:40:21 +08:00
</template>
2023-04-15 15:59:33 +08:00
<Upload
v-hasPermi="['mp:material:upload-permanent']"
:type="MaterialType.Image"
@uploaded="getList"
>
支持 bmp/png/jpeg/jpg/gif 格式大小不超过 2M
</Upload>
<Waterfall :loading="loading" :list="list" @delete="handleDelete" />
2023-04-08 23:40:21 +08:00
<!-- 分页组件 -->
2023-04-09 09:56:42 +08:00
<Pagination
2023-04-08 23:40:21 +08:00
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</el-tab-pane>
<!-- tab 2语音 -->
2023-04-15 15:59:33 +08:00
<el-tab-pane :name="MaterialType.Voice">
2023-04-08 23:40:21 +08:00
<template #label>
<span> <Icon icon="ep:microphone" />语音 </span>
2023-04-08 23:40:21 +08:00
</template>
2023-04-15 15:59:33 +08:00
<Upload
v-hasPermi="['mp:material:upload-permanent']"
:type="MaterialType.Voice"
@uploaded="getList"
>
格式支持 mp3/wma/wav/amr文件大小不超过 2M播放长度不超过 60s
</Upload>
<!-- 列表 -->
2023-04-15 15:59:33 +08:00
<VoiceTable :list="list" :loading="loading" @delete="handleDelete" />
2023-04-08 23:40:21 +08:00
<!-- 分页组件 -->
2023-04-09 09:56:42 +08:00
<Pagination
2023-04-08 23:40:21 +08:00
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</el-tab-pane>
<!-- tab 3视频 -->
2023-04-15 15:59:33 +08:00
<el-tab-pane :name="MaterialType.Video">
2023-04-08 23:40:21 +08:00
<template #label>
<span> <Icon icon="ep:video-play" /> 视频 </span>
2023-04-08 23:40:21 +08:00
</template>
2023-04-15 15:59:33 +08:00
<el-button
v-hasPermi="['mp:material:upload-permanent']"
type="primary"
plain
@click="showCreateVideo = true"
>新建视频</el-button
2023-04-08 23:40:21 +08:00
>
2023-04-15 15:59:33 +08:00
<!-- 新建视频的弹窗 -->
<UploadVideo v-model="showCreateVideo" />
2023-04-08 23:40:21 +08:00
<!-- 列表 -->
2023-04-15 15:59:33 +08:00
<VideoTable :list="list" :loading="loading" @delete="handleDelete" />
2023-04-08 23:40:21 +08:00
<!-- 分页组件 -->
2023-04-09 09:56:42 +08:00
<Pagination
2023-04-08 23:40:21 +08:00
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</el-tab-pane>
</el-tabs>
2023-04-09 09:56:42 +08:00
</ContentWrap>
</template>
<script lang="ts" setup name="MpMaterial">
2023-04-14 15:22:23 +08:00
import WxAccountSelect from '@/views/mp/components/wx-account-select/main.vue'
2023-04-15 15:59:33 +08:00
import Waterfall from './components/Waterfall.vue'
import VoiceTable from './components/VoiceTable.vue'
import VideoTable from './components/VideoTable.vue'
import Upload from './components/Upload.vue'
import UploadVideo from './components/UploadVideo.vue'
import { MaterialType } from './components/upload'
import * as MpMaterialApi from '@/api/mp/material'
const message = useMessage()
// 素材类型
2023-04-15 15:59:33 +08:00
const type = ref<MaterialType>(MaterialType.Image)
2023-04-13 22:25:35 +08:00
const loading = ref(false) // 遮罩层
const list = ref<any[]>([]) // 总条数
const total = ref(0) // 数据列表
2023-04-08 23:40:21 +08:00
// 查询参数
interface QueryParams {
pageNo: number
pageSize: number
accountId?: number
permanent: boolean
}
const queryParams: QueryParams = reactive({
2023-04-08 23:40:21 +08:00
pageNo: 1,
pageSize: 10,
accountId: undefined,
permanent: true
})
// === 视频上传,独有变量 ===
2023-04-15 15:59:33 +08:00
const showCreateVideo = ref(false)
2023-04-08 23:40:21 +08:00
/** 侦听公众号变化 **/
2023-04-12 13:29:24 +08:00
const onAccountChanged = (id?: number) => {
queryParams.accountId = id
getList()
}
2023-04-08 23:40:21 +08:00
// ======================== 列表查询 ========================
/** 查询列表 */
const getList = async () => {
2023-04-08 23:40:21 +08:00
loading.value = true
try {
const data = await MpMaterialApi.getMaterialPage({
...queryParams,
type: type.value
2023-04-08 23:40:21 +08:00
})
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
2023-04-08 23:40:21 +08:00
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
2023-04-15 15:59:33 +08:00
const onTabChange = () => {
// 提前情况数据避免tab切换后显示垃圾数据
list.value = []
total.value = 0
2023-04-08 23:40:21 +08:00
// 从第一页开始查询
handleQuery()
}
// ======================== 其它操作 ========================
2023-04-15 15:59:33 +08:00
const handleDelete = async (id: number) => {
2023-04-08 23:40:21 +08:00
await message.confirm('此操作将永久删除该文件, 是否继续?')
2023-04-15 15:59:33 +08:00
await MpMaterialApi.deletePermanentMaterial(id)
2023-04-08 23:40:21 +08:00
message.alertSuccess('删除成功')
}
</script>
2023-04-15 15:59:33 +08:00
<style lang="scss" scoped></style>