|
@@ -0,0 +1,377 @@
|
|
|
+<template>
|
|
|
+ <div class="app-container">
|
|
|
+ <div class="filter-container">
|
|
|
+ <div class="filter-container-lt">
|
|
|
+ <el-input placeholder="视频标题" class="filter-item" style="width: 200px;" clearable
|
|
|
+ v-model="listQuery.videoTitle" />
|
|
|
+ <!-- <el-input placeholder="SKU" class="filter-item" style="width: 200px;" clearable v-model="listQuery.sku" /> -->
|
|
|
+ <el-button v-waves class="filter-btn" type="primary" icon="el-icon-search" @click="handleFilter">搜索</el-button>
|
|
|
+ </div>
|
|
|
+ <!-- <div class="filter-container-rt">
|
|
|
+ <excel-import :upload-url="'/api/upload-excel'" :headers="{ token: 'your-token' }"
|
|
|
+ :upload-data="{ type: 'import' }" @on-success="handleImportSuccess">
|
|
|
+ <template slot="upload-text">
|
|
|
+ 导入话题
|
|
|
+ </template>
|
|
|
+ </excel-import>
|
|
|
+ </div> -->
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="table-container">
|
|
|
+ <el-table style="width: 100%" v-loading="listLoading" :key="tableKey" :data="list" row-key="id" stripe border fit
|
|
|
+ highlight-current-row>
|
|
|
+ <el-table-column label="序号" type="index" width="60" align="center" />
|
|
|
+ <el-table-column label="视频ID" min-width="100" align="center" prop="id" />
|
|
|
+
|
|
|
+ <el-table-column label="视频标题" min-width="150" align="center" prop="videoTitle" />
|
|
|
+ <el-table-column label="视频封面" min-width="110" align="center" prop="videoCoverImageUrl">
|
|
|
+ <template slot-scope="scope">
|
|
|
+ <div v-if="scope.row.videoCoverImageUrl" class="video" @click="handlePlay(scope.row)">
|
|
|
+ <img :src="scope.row.videoCoverImageUrl" class="video-img" />
|
|
|
+ <i class="el-icon-video-play" />
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="视频描述" min-width="150" align="center" prop="videoDesc">
|
|
|
+ <template slot-scope="scope">
|
|
|
+ <el-popover placement="top-start" width="200" trigger="hover" :content="scope.row.videoDesc">
|
|
|
+ <span class="desc"
|
|
|
+ slot="reference">{{ scope.row.videoDesc }}</span>
|
|
|
+ </el-popover>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="SKU" min-width="100" align="center" prop="sku" />
|
|
|
+
|
|
|
+ <el-table-column label="SKUID" min-width="100" align="center" prop="skuId" />
|
|
|
+ <el-table-column label="审核状态" min-width="100" align="center" prop="reviewStatus">
|
|
|
+ <template slot-scope="scope">
|
|
|
+ <span class="status-tag" :class="{
|
|
|
+ 'status-pending': scope.row.reviewStatus === 0,
|
|
|
+ 'status-success': scope.row.reviewStatus === 1,
|
|
|
+ 'status-error': scope.row.reviewStatus === 2
|
|
|
+ }"></span>
|
|
|
+ {{ getValueByKey(scope.row.reviewStatus, auditStatus) }}
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+
|
|
|
+ <el-table-column label="审核时间" min-width="100" align="center" prop="reviewTime" />
|
|
|
+ <el-table-column label="审核人" min-width="100" align="center" prop="reviewer" />
|
|
|
+ <el-table-column label="发布状态" min-width="100" align="center" prop="publishStatus">
|
|
|
+ <template slot-scope="scope">
|
|
|
+ <span class="status-tag" :class="{
|
|
|
+ 'status-pending': scope.row.publishStatus === 0,
|
|
|
+ 'status-success': scope.row.publishStatus === 1,
|
|
|
+ 'status-error': scope.row.publishStatus === 2
|
|
|
+ }"></span>
|
|
|
+ {{ getValueByKey(scope.row.publishStatus, auditStatus) }}
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="发布时间" min-width="100" align="center" prop="publishTime" />
|
|
|
+ <el-table-column label="发布人" min-width="100" align="center" prop="publisher" />
|
|
|
+ <el-table-column label="关联话题" min-width="100" align="center" prop="hotWords" />
|
|
|
+
|
|
|
+ <el-table-column label="直播时间" min-width="100" align="center" prop="liveTime" />
|
|
|
+ <!-- <el-table-column
|
|
|
+ label="直播场次"
|
|
|
+ min-width="100"
|
|
|
+ align="center"
|
|
|
+ prop="liveSession"
|
|
|
+ /> -->
|
|
|
+ <el-table-column label="直播中控" min-width="120" align="center" prop="liveController">
|
|
|
+ </el-table-column>
|
|
|
+
|
|
|
+ <el-table-column label="直播间号" min-width="100" align="center" prop="liveRoomId" />
|
|
|
+ <el-table-column label="操作人" min-width="100" align="center" prop="creator" />
|
|
|
+
|
|
|
+ <el-table-column label="创建时间" min-width="100" align="center" prop="createTime" />
|
|
|
+ <el-table-column label="操作" align="center" min-width="160"
|
|
|
+ v-bind="device !== 'mobile' ? { fixed: 'right' } : {}">
|
|
|
+ <template slot-scope="scope">
|
|
|
+ <el-tooltip class="item" effect="dark" content="下载" placement="top">
|
|
|
+ <el-button type="primary" :loading="scope.row && scope.row.id
|
|
|
+ ? downloadingRows[scope.row.id]
|
|
|
+ : false
|
|
|
+ " size="mini" icon="el-icon-download" circle @click="handleDownload(scope.row)" />
|
|
|
+ </el-tooltip>
|
|
|
+ <el-tooltip class="item" effect="dark" content="播放" placement="top">
|
|
|
+ <el-button type="success" size="mini" icon="el-icon-caret-right" circle @click="handlePlay(scope.row)" />
|
|
|
+ </el-tooltip>
|
|
|
+ <el-tooltip
|
|
|
+ class="more"
|
|
|
+ effect="dark"
|
|
|
+ content="删除"
|
|
|
+ placement="top"
|
|
|
+ >
|
|
|
+ <el-button
|
|
|
+ type="danger"
|
|
|
+ size="mini"
|
|
|
+ icon="el-icon-delete-solid"
|
|
|
+ circle
|
|
|
+ @click="handleDelete(scope.row)"
|
|
|
+ />
|
|
|
+ </el-tooltip>
|
|
|
+ <!-- <el-tooltip class="more" effect="dark" content="更多操作" placement="top">
|
|
|
+ <el-dropdown trigger="click" @command="command => handleMore(command, scope.row)">
|
|
|
+ <el-button size="mini" type="primary" icon="el-icon-more" circle title="更多操作" />
|
|
|
+ <el-dropdown-menu class="dropdown-menu" slot="dropdown">
|
|
|
+ <el-dropdown-item command="changeTopic">修改话题</el-dropdown-item>
|
|
|
+ <el-dropdown-item command="delete">删除</el-dropdown-item>
|
|
|
+ </el-dropdown-menu>
|
|
|
+ </el-dropdown>
|
|
|
+ </el-tooltip> -->
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 分页 -->
|
|
|
+ <swPage v-if="total > 0" key="2" :listQuery="listQuery" :total="total" pos="btmRight" @retPage="retPage" />
|
|
|
+ <!-- 视频播放 -->
|
|
|
+ <video-player ref="videoPlayer" :video-url="currentVideoUrl" :video-title="currentVideoTitle"
|
|
|
+ @close="handlePlayerClose" />
|
|
|
+ <!-- 修改话题-->
|
|
|
+ <change-topic ref="changeTopicRef" :rows="currentVideo" @confirm="handleTopicChange" />
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+import waves from "@/directive/waves";
|
|
|
+import swPage from "@/views/common/swPage";
|
|
|
+import { auditStatus } from "@/constants/index";
|
|
|
+import { getValueByKey } from "@/utils/index";
|
|
|
+import ExcelImport from "@/components/ExcelImport";
|
|
|
+import changeTopic from "@/views/oral-video/component/changeTopic";
|
|
|
+
|
|
|
+import { fetchOralVideoList, deleteOralVideoList } from "@/api/video";
|
|
|
+import downloadUtil from "@/utils/downloadUtil";
|
|
|
+import VideoPlayer from "@/components/VideoPlayer";
|
|
|
+import { mapGetters } from "vuex";
|
|
|
+
|
|
|
+
|
|
|
+export default {
|
|
|
+ name: "oralVideoIndex",
|
|
|
+ directives: {
|
|
|
+ waves
|
|
|
+ },
|
|
|
+ components: {
|
|
|
+ swPage,
|
|
|
+ VideoPlayer,
|
|
|
+ ExcelImport,
|
|
|
+ changeTopic
|
|
|
+ },
|
|
|
+ computed: {
|
|
|
+ ...mapGetters(["device"]) // 从 vuex 中获取设备类型
|
|
|
+ },
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ auditStatus,
|
|
|
+ tableKey: 0,
|
|
|
+ list: [],
|
|
|
+ total: 0,
|
|
|
+ listLoading: false,
|
|
|
+ downloadingRows: {},
|
|
|
+ listQuery: {
|
|
|
+ currentPage: 1,
|
|
|
+ pageSize: 10,
|
|
|
+ videoTitle: null,
|
|
|
+ // sku:null
|
|
|
+ },
|
|
|
+ currentVideoUrl: null,
|
|
|
+ currentVideoTitle: null,
|
|
|
+ currentVideo:{},
|
|
|
+ };
|
|
|
+ },
|
|
|
+ //页面创建的时候执行
|
|
|
+ created() {
|
|
|
+ this.getList();
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ getValueByKey,
|
|
|
+ getList() {
|
|
|
+ this.listLoading = true;
|
|
|
+ fetchOralVideoList(this.listQuery).then(res => {
|
|
|
+ if (200 == res.code) {
|
|
|
+ this.total = res.data.total;
|
|
|
+ this.list = res.data.rows;
|
|
|
+ }
|
|
|
+ this.listLoading = false;
|
|
|
+ });
|
|
|
+ },
|
|
|
+ retPage() {
|
|
|
+ //分页
|
|
|
+ this.getList();
|
|
|
+ },
|
|
|
+ handleFilter() {
|
|
|
+ this.listQuery.page = 1;
|
|
|
+ this.getList();
|
|
|
+ },
|
|
|
+ // 视频下载
|
|
|
+ async handleDownload(row) {
|
|
|
+ const { videoUrl, videoTitle, id, sku } = row;
|
|
|
+ this.$set(this.downloadingRows, id, true);
|
|
|
+ try {
|
|
|
+ const title = sku ? videoTitle + "_" + sku : videoTitle;
|
|
|
+ const res = await downloadUtil.videoDownload(videoUrl, title);
|
|
|
+ if (res) {
|
|
|
+ this.$message.success("下载成功");
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ this.$message.error(error.message);
|
|
|
+ } finally {
|
|
|
+ this.$set(this.downloadingRows, id, false);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ // 视频播放
|
|
|
+ handlePlay(row) {
|
|
|
+ const { videoUrl, videoTitle } = row;
|
|
|
+ ``;
|
|
|
+ if (!videoUrl) {
|
|
|
+ this.$message.error("视频地址不存在");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ this.currentVideoUrl = videoUrl;
|
|
|
+ this.currentVideoTitle = videoTitle;
|
|
|
+ this.$refs.videoPlayer.show();
|
|
|
+ },
|
|
|
+ handlePlayerClose() {
|
|
|
+ this.currentVideoUrl = "";
|
|
|
+ this.currentVideoTitle = "";
|
|
|
+ },
|
|
|
+ handleDelete(row) {
|
|
|
+ //删除
|
|
|
+ this.$confirm("是否删除该视频?", "提示", {
|
|
|
+ confirmButtonText: "确定",
|
|
|
+ cancelButtonText: "取消",
|
|
|
+ type: "warning"
|
|
|
+ }).then(() => {
|
|
|
+ const { id } = row;
|
|
|
+ deleteOralVideoList([id]).then(() => {
|
|
|
+ this.$notify({
|
|
|
+ title: "成功",
|
|
|
+ message: "删除成功",
|
|
|
+ type: "success",
|
|
|
+ duration: 3000
|
|
|
+ });
|
|
|
+ const index = this.list.indexOf(row);
|
|
|
+ this.list.splice(index, 1);
|
|
|
+ });
|
|
|
+ });
|
|
|
+ },
|
|
|
+ // 导入话题回调
|
|
|
+ handleImportSuccess({ data, header, file }) {
|
|
|
+ console.log("导入的数据:", data);
|
|
|
+ console.log("表头:", header);
|
|
|
+ console.log("原始文件:", file);
|
|
|
+ // 处理导入的数据
|
|
|
+ },
|
|
|
+ //更多
|
|
|
+ handleMore(command, row) {
|
|
|
+ if (command === "delete") {
|
|
|
+ this.handleDelete(row); // 删除
|
|
|
+ } else if (command === "changeTopic") {
|
|
|
+ this.changeTopic(row); // 修改话题
|
|
|
+ }
|
|
|
+ },
|
|
|
+ // 修改话题
|
|
|
+ changeTopic(row) {
|
|
|
+ this.currentVideo = row;
|
|
|
+ this.$refs.changeTopicRef.show();
|
|
|
+ },
|
|
|
+ handleTopicChange() {
|
|
|
+ this.$refs.changeTopicRef.show();
|
|
|
+ this.retPage()
|
|
|
+ }
|
|
|
+ }
|
|
|
+};
|
|
|
+</script>
|
|
|
+
|
|
|
+<style rel="stylesheet/scss" lang="scss" scoped>
|
|
|
+@import "@/styles/layout.scss";
|
|
|
+
|
|
|
+.button {
|
|
|
+ .el-button {
|
|
|
+ margin-bottom: 10px;
|
|
|
+
|
|
|
+ &:last-child {
|
|
|
+ margin-bottom: 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.video {
|
|
|
+ position: relative;
|
|
|
+ display: flex;
|
|
|
+ align-content: center;
|
|
|
+ justify-content: center;
|
|
|
+
|
|
|
+ &:hover {
|
|
|
+ i {
|
|
|
+ opacity: 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ .video-img {
|
|
|
+ opacity: 0.6;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ &-img {
|
|
|
+ width: 60px;
|
|
|
+ height: 60px;
|
|
|
+ border: 1px solid #eee;
|
|
|
+ object-fit: cover;
|
|
|
+ cursor: pointer;
|
|
|
+ }
|
|
|
+
|
|
|
+ i {
|
|
|
+ width: 60px;
|
|
|
+ height: 60px;
|
|
|
+ position: absolute;
|
|
|
+ top: 85%;
|
|
|
+ left: 50%;
|
|
|
+ transform: translate(-50%, -50%);
|
|
|
+ font-size: 20px;
|
|
|
+ font-weight: bold;
|
|
|
+ color: #fff;
|
|
|
+ opacity: 0;
|
|
|
+ cursor: pointer;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.status-tag {
|
|
|
+ display: inline-block;
|
|
|
+ width: 8px;
|
|
|
+ height: 8px;
|
|
|
+ border-radius: 50%;
|
|
|
+ margin-right: 6px;
|
|
|
+}
|
|
|
+
|
|
|
+.status-pending {
|
|
|
+ background-color: #e6a23c;
|
|
|
+}
|
|
|
+
|
|
|
+.status-success {
|
|
|
+ background-color: #67c23a;
|
|
|
+}
|
|
|
+
|
|
|
+.status-error {
|
|
|
+ background-color: #f56c6c;
|
|
|
+}
|
|
|
+
|
|
|
+.filter-btn {
|
|
|
+ height: 40px;
|
|
|
+}
|
|
|
+
|
|
|
+.desc {
|
|
|
+ overflow: hidden;
|
|
|
+ text-overflow: ellipsis;
|
|
|
+ display: -webkit-box;
|
|
|
+ -webkit-line-clamp: 2;
|
|
|
+ -webkit-box-orient: vertical;
|
|
|
+ line-height: 1.5;
|
|
|
+ max-height: 3em;
|
|
|
+}
|
|
|
+
|
|
|
+.more {
|
|
|
+ margin-left: 10px;
|
|
|
+}
|
|
|
+</style>
|