|
|
@@ -1,348 +1,535 @@
|
|
|
<template>
|
|
|
- <el-container>
|
|
|
- <el-header height="220">
|
|
|
- <el-row style="margin-top: 10px">
|
|
|
- <el-select
|
|
|
- v-model="queryInfo.scope"
|
|
|
- clearable
|
|
|
- placeholder="查询条件"
|
|
|
- style="margin-left: 5px"
|
|
|
- @change="onSelectChange"
|
|
|
- />
|
|
|
- <el-button type="plain" icon="el-icon-refresh" style="margin-left: 5px" @click="onRefresh">刷新</el-button>
|
|
|
- </el-row>
|
|
|
+ <el-container class="admin-video-container">
|
|
|
+ <el-header height="auto" class="search-header">
|
|
|
+ <el-form :inline="true" :model="queryParams" size="small" class="search-form" @submit.native.prevent>
|
|
|
+ <el-form-item label="视频标题">
|
|
|
+ <el-input
|
|
|
+ v-model="queryParams.title"
|
|
|
+ clearable
|
|
|
+ placeholder="请输入视频标题模糊搜索"
|
|
|
+ prefix-icon="el-icon-video-camera"
|
|
|
+ class="search-input-long"
|
|
|
+ @keyup.enter.native="handleSearch"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+
|
|
|
+ <el-form-item label="审核状态">
|
|
|
+ <el-select
|
|
|
+ v-model="queryParams.status"
|
|
|
+ clearable
|
|
|
+ placeholder="全部状态"
|
|
|
+ class="select-input"
|
|
|
+ @change="handleSearch"
|
|
|
+ >
|
|
|
+ <el-option label="审核中" :value="1" />
|
|
|
+ <el-option label="审核通过" :value="2" />
|
|
|
+ <el-option label="审核未通过" :value="3" />
|
|
|
+ <el-option label="已下架" :value="4" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+
|
|
|
+ <el-form-item label="可见范围">
|
|
|
+ <el-select
|
|
|
+ v-model="queryParams.scope"
|
|
|
+ clearable
|
|
|
+ placeholder="全部范围"
|
|
|
+ class="select-input"
|
|
|
+ @change="handleSearch"
|
|
|
+ >
|
|
|
+ <el-option label="本人可见" :value="1" />
|
|
|
+ <el-option label="所有人可见" :value="2" />
|
|
|
+ <el-option label="VIP 可见" :value="3" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+
|
|
|
+ <el-form-item class="search-actions">
|
|
|
+ <el-button type="primary" icon="el-icon-search" @click="handleSearch">查询</el-button>
|
|
|
+ <el-button icon="el-icon-refresh" class="btn-reset" @click="onRefresh">重置</el-button>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
</el-header>
|
|
|
- <el-main>
|
|
|
+
|
|
|
+ <el-main class="table-main">
|
|
|
<el-table
|
|
|
+ v-loading="loading"
|
|
|
:data="dataList"
|
|
|
border
|
|
|
- height="480"
|
|
|
+ stripe
|
|
|
+ height="500"
|
|
|
style="width: 100%"
|
|
|
+ class="custom-table"
|
|
|
>
|
|
|
<el-table-column
|
|
|
fixed="left"
|
|
|
label="No"
|
|
|
type="index"
|
|
|
+ width="60"
|
|
|
+ align="center"
|
|
|
/>
|
|
|
<el-table-column
|
|
|
prop="pubDate"
|
|
|
label="发布时间"
|
|
|
- width="150"
|
|
|
+ width="160"
|
|
|
+ align="center"
|
|
|
/>
|
|
|
<el-table-column
|
|
|
prop="coverUrl"
|
|
|
- label="封面"
|
|
|
- width="90"
|
|
|
+ label="视频封面"
|
|
|
+ width="110"
|
|
|
+ align="center"
|
|
|
>
|
|
|
<template slot-scope="scope">
|
|
|
- <el-image :src="scope.row.coverUrl" min-width="30" height="20" />
|
|
|
+ <el-image
|
|
|
+ :src="scope.row.coverUrl"
|
|
|
+ fit="cover"
|
|
|
+ class="table-cover"
|
|
|
+ :preview-src-list="[scope.row.coverUrl]"
|
|
|
+ >
|
|
|
+ <div slot="error" class="image-error-slot">
|
|
|
+ <i class="el-icon-picture-outline" />
|
|
|
+ </div>
|
|
|
+ </el-image>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
+
|
|
|
<el-table-column
|
|
|
prop="videoId"
|
|
|
label="视频 ID"
|
|
|
width="120"
|
|
|
+ align="center"
|
|
|
>
|
|
|
<template slot-scope="scope">
|
|
|
- <router-link target="_blank" :to="`/video/${scope.row.videoId}`">
|
|
|
+ <router-link :to="`/video/${scope.row.videoId}`" target="_blank" class="video-id-link">
|
|
|
<span>{{ scope.row.videoId }}</span>
|
|
|
+ <i class="el-icon-link" />
|
|
|
</router-link>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
+
|
|
|
<el-table-column
|
|
|
prop="title"
|
|
|
- label="标题"
|
|
|
- :show-overflow-tooltip="true"
|
|
|
+ label="视频标题"
|
|
|
+ min-width="160"
|
|
|
>
|
|
|
<template slot-scope="scope">
|
|
|
- <el-tooltip
|
|
|
- v-if="scope.row.title"
|
|
|
- :content="scope.row.title"
|
|
|
- raw-content
|
|
|
- placement="top-start"
|
|
|
- >
|
|
|
- <span v-if="scope.row.title.length <= 15">
|
|
|
- {{ scope.row.title }}
|
|
|
- </span>
|
|
|
- <span v-else>
|
|
|
- {{ scope.row.title.substr(0, 15) + "..." }}
|
|
|
- </span>
|
|
|
+ <el-tooltip v-if="scope.row.title" :content="scope.row.title" placement="top" :open-delay="400">
|
|
|
+ <span class="ellipsis-text text-main-title">{{ scope.row.title }}</span>
|
|
|
</el-tooltip>
|
|
|
+ <span v-else class="text-muted">-</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
+
|
|
|
<el-table-column
|
|
|
- prop="description"
|
|
|
- label="描述"
|
|
|
- :show-overflow-tooltip="true"
|
|
|
+ prop="duration"
|
|
|
+ label="时长"
|
|
|
+ width="90"
|
|
|
+ align="center"
|
|
|
>
|
|
|
<template slot-scope="scope">
|
|
|
- <el-tooltip
|
|
|
- v-if="scope.row.description"
|
|
|
- :content="scope.row.description"
|
|
|
- raw-content
|
|
|
- placement="top-start"
|
|
|
- >
|
|
|
- <span v-if="scope.row.description && scope.row.description.length <= 15">
|
|
|
- {{ scope.row.description }}
|
|
|
- </span>
|
|
|
- <span v-if="scope.row.description && scope.row.description.length > 15">
|
|
|
- {{ scope.row.description.substr(0, 15) + "..." }}
|
|
|
- </span>
|
|
|
- </el-tooltip>
|
|
|
- <span v-else-if="scope.row.description === null">-</span>
|
|
|
+ <span class="duration-badge">{{ scope.row.duration || '00:00' }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column
|
|
|
- prop="duration"
|
|
|
- label="时长"
|
|
|
- />
|
|
|
+
|
|
|
<el-table-column
|
|
|
prop="horizontal"
|
|
|
- label="方向"
|
|
|
+ label="画幅方向"
|
|
|
+ width="95"
|
|
|
+ align="center"
|
|
|
>
|
|
|
<template slot-scope="scope">
|
|
|
- <el-tag v-if="scope.row.horizontal" :type="'warning'" disable-transitions>
|
|
|
- <span icon="el-icon-monitor">横屏</span>
|
|
|
+ <el-tag v-if="scope.row.horizontal" type="info" size="mini" effect="plain" class="tag-screen">
|
|
|
+ <i class="el-icon-monitor" /> 横屏
|
|
|
</el-tag>
|
|
|
- <el-tag v-else :type="'success'" disable-transitions>
|
|
|
- <span icon="el-icon-mobile-phone">竖屏</span>
|
|
|
+ <el-tag v-else type="primary" size="mini" effect="plain" class="tag-screen">
|
|
|
+ <i class="el-icon-mobile-phone" /> 竖屏
|
|
|
</el-tag>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
+
|
|
|
<el-table-column
|
|
|
prop="scope"
|
|
|
label="可见范围"
|
|
|
- width="120"
|
|
|
+ width="110"
|
|
|
+ align="center"
|
|
|
>
|
|
|
<template slot-scope="scope">
|
|
|
- <el-tag v-if="scope.row.scope === 1" :type="'warning'" disable-transitions>
|
|
|
- 本人可见
|
|
|
- </el-tag>
|
|
|
- <el-tag v-if="scope.row.scope === 2" :type="'success'" disable-transitions>
|
|
|
- 所有人可见
|
|
|
- </el-tag>
|
|
|
- <el-tag v-if="scope.row.scope === 3" :type="'danger'" disable-transitions>
|
|
|
- VIP 可见
|
|
|
- </el-tag>
|
|
|
+ <el-tag v-if="scope.row.scope === 1" type="info" size="mini" effect="light">本人可见</el-tag>
|
|
|
+ <el-tag v-else-if="scope.row.scope === 2" type="success" size="mini" effect="light">所有人可见</el-tag>
|
|
|
+ <el-tag v-else-if="scope.row.scope === 3" v-slot-scope="scope" type="warning" size="mini" effect="light">VIP 可见</el-tag>
|
|
|
+ <el-tag v-else type="info" size="mini">未知: {{ scope.row.scope }}</el-tag>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
+
|
|
|
<el-table-column
|
|
|
- prop="scope"
|
|
|
+ prop="status"
|
|
|
label="审核状态"
|
|
|
- width="120"
|
|
|
+ width="110"
|
|
|
+ align="center"
|
|
|
>
|
|
|
<template slot-scope="scope">
|
|
|
- <el-tag v-if="scope.row.status === 1" :type="'warning'" disable-transitions>
|
|
|
- 审核中
|
|
|
- </el-tag>
|
|
|
- <el-tag v-else-if="scope.row.status === 2" :type="'success'" disable-transitions>
|
|
|
- 审核通过
|
|
|
- </el-tag>
|
|
|
- <el-tag v-else-if="scope.row.status === 3" :type="'danger'" disable-transitions>
|
|
|
- 审核未通过
|
|
|
- </el-tag>
|
|
|
- <el-tag v-else-if="scope.row.status === 4" :type="'danger'" disable-transitions>
|
|
|
- 下架
|
|
|
- </el-tag>
|
|
|
- <el-tag v-else :type="'danger'" disable-transitions>
|
|
|
- 状态值: {{ scope.row.status }}
|
|
|
- </el-tag>
|
|
|
+ <el-badge v-if="scope.row.status === 1" is-dot type="warning" class="status-dot-badge">
|
|
|
+ <el-tag type="warning" size="mini">审核中</el-tag>
|
|
|
+ </el-badge>
|
|
|
+ <el-tag v-else-if="scope.row.status === 2" type="success" size="mini">审核通过</el-tag>
|
|
|
+ <el-tag v-else-if="scope.row.status === 3" type="danger" size="mini">审核未通过</el-tag>
|
|
|
+ <el-tag v-else-if="scope.row.status === 4" type="info" size="mini">已下架</el-tag>
|
|
|
+ <el-tag v-else type="info" size="mini">未知: {{ scope.row.status }}</el-tag>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
+
|
|
|
<el-table-column
|
|
|
- prop="videoId"
|
|
|
+ prop="userId"
|
|
|
label="创作者"
|
|
|
width="120"
|
|
|
+ align="center"
|
|
|
>
|
|
|
<template slot-scope="scope">
|
|
|
- <router-link target="_blank" :to="`/video/${scope.row.videoId}`">
|
|
|
- <span>{{ scope.row.videoId }}</span>
|
|
|
- </router-link>
|
|
|
+ <span v-if="!scope.row.userId" class="text-muted">系统</span>
|
|
|
+
|
|
|
+ <div
|
|
|
+ v-else
|
|
|
+ class="user-creator-click-link"
|
|
|
+ title="点击快捷筛选该创作者的视频"
|
|
|
+ @click="handleCreatorClick(scope.row.userId)"
|
|
|
+ >
|
|
|
+ <i class="el-icon-user" />
|
|
|
+ <span>{{ scope.row.userId }}</span>
|
|
|
+ </div>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
+
|
|
|
<el-table-column
|
|
|
fixed="right"
|
|
|
- label="操作"
|
|
|
- width="280"
|
|
|
+ label="操作快捷键"
|
|
|
+ width="180"
|
|
|
+ align="center"
|
|
|
>
|
|
|
<template slot-scope="scope">
|
|
|
- <el-button
|
|
|
- size="mini"
|
|
|
- @click="handlePreview(scope.$index, scope.row)"
|
|
|
- >预览</el-button>
|
|
|
- <el-button
|
|
|
- size="mini"
|
|
|
- @click="handleEdit(scope.$index, scope.row)"
|
|
|
- >编辑</el-button>
|
|
|
+ <router-link
|
|
|
+ :to="`/vod_audit/${scope.row.videoId}`"
|
|
|
+ target="_blank"
|
|
|
+ style="text-decoration: none; margin-right: 10px;"
|
|
|
+ >
|
|
|
+ <el-button
|
|
|
+ size="mini"
|
|
|
+ type="text"
|
|
|
+ icon="el-icon-finished"
|
|
|
+ class="btn-table-action btn-audit"
|
|
|
+ >
|
|
|
+ 去审核
|
|
|
+ </el-button>
|
|
|
+ </router-link>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
</el-table>
|
|
|
- <el-pagination
|
|
|
- background
|
|
|
- :small="screenWidth <= 768"
|
|
|
- layout="prev, pager, next"
|
|
|
- :page-size="pageSize"
|
|
|
- :current-page="currentPage"
|
|
|
- :total="totalSize"
|
|
|
- @current-change="handleCurrentChange"
|
|
|
- @prev-click="handleCurrentChange"
|
|
|
- @next-click="handleCurrentChange"
|
|
|
- />
|
|
|
- </el-main>
|
|
|
|
|
|
- <!-- 修改视频可见范围对话框 -->
|
|
|
- <el-dialog
|
|
|
- append-to-body
|
|
|
- :visible.sync="showEditScopeDialog"
|
|
|
- width="30%"
|
|
|
- center
|
|
|
- >
|
|
|
- <el-card class="box-card">
|
|
|
- <div slot="header" class="clearfix">
|
|
|
- <span>修改视频可见范围</span>
|
|
|
- <el-button style="float: right; padding: 3px 0" type="text" @click="onUpdateScope">更新</el-button>
|
|
|
- </div>
|
|
|
- <div class="text item">
|
|
|
- <el-select v-model="form.scope" placeholder="选择可见范围">
|
|
|
- <el-option label="本人可见" value="1" />
|
|
|
- <el-option label="所有人可见" value="2" />
|
|
|
- <el-option label="VIP 可见" value="3" />
|
|
|
- </el-select>
|
|
|
- </div>
|
|
|
- </el-card>
|
|
|
- </el-dialog>
|
|
|
- <!-- 视频预览对话框 -->
|
|
|
- <el-dialog
|
|
|
- title="预览视频"
|
|
|
- append-to-body
|
|
|
- :visible.sync="showPreviewDialog"
|
|
|
- :before-close="handleDialogClose"
|
|
|
- width="70%"
|
|
|
- center
|
|
|
- >
|
|
|
- <template>
|
|
|
- <video-preview-player :video-prop.sync="videoProp" />
|
|
|
- </template>
|
|
|
- </el-dialog>
|
|
|
+ <div class="pagination-container">
|
|
|
+ <el-pagination
|
|
|
+ background
|
|
|
+ :small="screenWidth <= 768"
|
|
|
+ layout="total, sizes, prev, pager, next, jumper"
|
|
|
+ :page-sizes="[10, 12, 25, 50]"
|
|
|
+ :page-size="pageSize"
|
|
|
+ :current-page="currentPage"
|
|
|
+ :total="totalSize"
|
|
|
+ @current-change="handleCurrentChange"
|
|
|
+ @size-change="handleSizeChange"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </el-main>
|
|
|
</el-container>
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
-import VideoPreviewPlayer from 'components/VideoPreviewPlayer'
|
|
|
-import { updateVideoScope, videoInfo } from '@/api/video'
|
|
|
import { getVideoList } from '@/api/admin'
|
|
|
|
|
|
export default {
|
|
|
name: 'VideoPost',
|
|
|
- components: { VideoPreviewPlayer },
|
|
|
data() {
|
|
|
return {
|
|
|
- queryInfo: {
|
|
|
- scope: null,
|
|
|
+ queryParams: {
|
|
|
+ title: '',
|
|
|
+ userId: '',
|
|
|
+ status: '', // 初始化空串,唤醒 clearable 清除特性
|
|
|
+ scope: '',
|
|
|
pn: 1
|
|
|
},
|
|
|
- // 屏幕宽度, 为了控制分页条的大小
|
|
|
screenWidth: document.body.clientWidth,
|
|
|
currentPage: 1,
|
|
|
pageSize: 12,
|
|
|
totalSize: 0,
|
|
|
dataList: [],
|
|
|
- nextId: 0,
|
|
|
- // **********************************************************************
|
|
|
- videoProp: null,
|
|
|
- showVideoResourceDialog: false,
|
|
|
- showEditScopeDialog: false,
|
|
|
- showPreviewDialog: false,
|
|
|
- form: {
|
|
|
- videoId: null,
|
|
|
- scope: 1
|
|
|
- },
|
|
|
- videoResources: [],
|
|
|
- publishVideoDiaglog: false
|
|
|
+ loading: false
|
|
|
}
|
|
|
},
|
|
|
created() {
|
|
|
- document.title = 'AdminVideoList'
|
|
|
this.getData()
|
|
|
+ window.addEventListener('resize', this.handleWindowResize)
|
|
|
+ },
|
|
|
+ destroyed() {
|
|
|
+ window.removeEventListener('resize', this.handleWindowResize)
|
|
|
},
|
|
|
methods: {
|
|
|
- handleCurrentChange(pageNumber) {
|
|
|
- this.currentPage = pageNumber
|
|
|
- this.getData()
|
|
|
- // 回到顶部
|
|
|
- scrollTo(0, 0)
|
|
|
- },
|
|
|
getData() {
|
|
|
- this.dataList = []
|
|
|
- getVideoList(0).then(resp => {
|
|
|
+ this.loading = true
|
|
|
+ // 分页器参数规整同步到 queryParams
|
|
|
+ this.queryParams.pn = this.currentPage
|
|
|
+
|
|
|
+ // 构建干净的请求载荷负载对象
|
|
|
+ const requestPayload = { ...this.queryParams }
|
|
|
+ if (!requestPayload.title.trim()) delete requestPayload.title
|
|
|
+ if (!requestPayload.userId.trim()) delete requestPayload.userId
|
|
|
+ if (requestPayload.status === '') delete requestPayload.status
|
|
|
+ if (requestPayload.scope === '') delete requestPayload.scope
|
|
|
+
|
|
|
+ // 这里传入过滤干净的多条件负载对象(原本写死的写为了动态对象)
|
|
|
+ getVideoList(requestPayload).then(resp => {
|
|
|
if (resp.code === 0) {
|
|
|
- const respData = resp.data
|
|
|
- this.dataList = respData.list
|
|
|
- this.totalSize = respData.totalSize
|
|
|
+ this.dataList = resp.data.list || []
|
|
|
+ this.totalSize = resp.data.totalSize || 0
|
|
|
} else {
|
|
|
this.$message.error(resp.msg)
|
|
|
}
|
|
|
+ }).catch(err => {
|
|
|
+ this.$message.error(err.message || '获取视频库清单故障')
|
|
|
+ }).finally(() => {
|
|
|
+ this.loading = false
|
|
|
})
|
|
|
},
|
|
|
- onRefresh() {
|
|
|
+ handleSearch() {
|
|
|
+ this.currentPage = 1 // 每次新搜索将分页强制回溯到第一页
|
|
|
this.getData()
|
|
|
},
|
|
|
- handleScope(index, row) {
|
|
|
- this.form.videoId = row.videoId
|
|
|
- this.form.scope = '' + row.scope
|
|
|
- this.showEditScopeDialog = true
|
|
|
+ onRefresh() {
|
|
|
+ // 全域初始化重置
|
|
|
+ this.queryParams.title = ''
|
|
|
+ this.queryParams.userId = ''
|
|
|
+ this.queryParams.status = ''
|
|
|
+ this.queryParams.scope = ''
|
|
|
+ this.currentPage = 1
|
|
|
+ this.getData()
|
|
|
+ this.$message.success('条件过滤器已重置')
|
|
|
},
|
|
|
- handleDialogClose(done) {
|
|
|
- this.showPreviewDialog = false
|
|
|
- this.videoProp = {
|
|
|
- videoId: null,
|
|
|
- play: false
|
|
|
- }
|
|
|
- done()
|
|
|
+ handleCurrentChange(pageNumber) {
|
|
|
+ this.currentPage = pageNumber
|
|
|
+ this.getData()
|
|
|
+ // 行内优雅置顶表格
|
|
|
+ const tableWrapper = this.$el.querySelector('.el-table__body-wrapper')
|
|
|
+ if (tableWrapper) tableWrapper.scrollTop = 0
|
|
|
},
|
|
|
- handlePreview(index, row) {
|
|
|
- videoInfo(row.videoId).then(res => {
|
|
|
- if (res.code === 0) {
|
|
|
- this.showPreviewDialog = true
|
|
|
- this.videoProp = {
|
|
|
- videoId: res.data.videoId,
|
|
|
- play: true
|
|
|
- }
|
|
|
- }
|
|
|
- })
|
|
|
+ handleSizeChange(newSize) {
|
|
|
+ this.pageSize = newSize
|
|
|
+ this.currentPage = 1
|
|
|
+ this.getData()
|
|
|
},
|
|
|
- handleEdit(index, row) {
|
|
|
- const path = '/post/video/edit/' + row.videoId
|
|
|
- this.$router.push(path)
|
|
|
+ handleWindowResize() {
|
|
|
+ this.screenWidth = document.body.clientWidth
|
|
|
},
|
|
|
- onUpdateScope() {
|
|
|
- this.showEditScopeDialog = false
|
|
|
- updateVideoScope(this.form).then(res => {
|
|
|
- if (res.code === 0) {
|
|
|
- this.$notify({
|
|
|
- title: '提示',
|
|
|
- message: '视频可见范围已更新',
|
|
|
- type: 'warning',
|
|
|
- duration: 3000
|
|
|
- })
|
|
|
- }
|
|
|
- }).catch(error => {
|
|
|
- this.$notify({
|
|
|
- title: '提示',
|
|
|
- message: error.message,
|
|
|
- type: 'warning',
|
|
|
- duration: 3000
|
|
|
- })
|
|
|
+ handleCreatorClick(userId) {
|
|
|
+ if (!userId) return
|
|
|
+
|
|
|
+ // 1. 将点击的 ID 赋给顶部的搜索框绑定变量
|
|
|
+ this.queryParams.userId = String(userId)
|
|
|
+
|
|
|
+ // 2. 将页码切回第一页(防止原本在第5页,过滤后总页数不够导致报错)
|
|
|
+ this.currentPage = 1
|
|
|
+
|
|
|
+ // 3. 触发核心请求方法,向后台请求该用户发布的视频
|
|
|
+ this.getData()
|
|
|
+
|
|
|
+ // 4. 可选:加一个优雅的提示
|
|
|
+ this.$message({
|
|
|
+ message: `已为您筛选出创作者 [${userId}] 的视频`,
|
|
|
+ type: 'success',
|
|
|
+ duration: 2000
|
|
|
})
|
|
|
- },
|
|
|
- onSelectChange() {
|
|
|
- this.$message.info(this.queryInfo)
|
|
|
- },
|
|
|
- handleClose() {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
</script>
|
|
|
|
|
|
-<style>
|
|
|
+<style scoped>
|
|
|
+/* 核心容器 */
|
|
|
+.admin-video-container {
|
|
|
+ background: #ffffff;
|
|
|
+ border-radius: 8px;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+}
|
|
|
+
|
|
|
+/* 顶部紧凑型过滤组件 */
|
|
|
+.search-header {
|
|
|
+ padding: 16px 4px 4px 4px;
|
|
|
+ border-bottom: 1px solid #f1f5f9;
|
|
|
+}
|
|
|
+.search-form {
|
|
|
+ display: flex;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ gap: 4px 12px;
|
|
|
+}
|
|
|
+::v-deep .el-form-item {
|
|
|
+ margin-bottom: 12px;
|
|
|
+}
|
|
|
+::v-deep .el-form-item__label {
|
|
|
+ color: #64748b;
|
|
|
+ font-weight: 500;
|
|
|
+ padding-right: 6px;
|
|
|
+}
|
|
|
+.search-input-long { width: 220px; }
|
|
|
+.search-input { width: 150px; }
|
|
|
+.select-input { width: 130px; }
|
|
|
+.btn-reset { background: #f8fafc; border-color: #cbd5e1; color: #64748b; }
|
|
|
+.btn-reset:hover { color: #1890ff; border-color: #1890ff; background: #fff; }
|
|
|
+
|
|
|
+/* 主表格区 */
|
|
|
+.table-main {
|
|
|
+ padding: 16px 0 0 0;
|
|
|
+}
|
|
|
+.custom-table {
|
|
|
+ border-radius: 6px;
|
|
|
+ overflow: hidden;
|
|
|
+}
|
|
|
+
|
|
|
+/* 视频封面图优化 */
|
|
|
+.table-cover {
|
|
|
+ width: 80px;
|
|
|
+ height: 48px;
|
|
|
+ border-radius: 4px;
|
|
|
+ border: 1px solid #e2e8f0;
|
|
|
+ box-shadow: 0 2px 6px rgba(0,0,0,0.04);
|
|
|
+ cursor: zoom-in;
|
|
|
+}
|
|
|
+.image-error-slot {
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ background: #f1f5f9;
|
|
|
+ color: #94a3b8;
|
|
|
+ font-size: 16px;
|
|
|
+}
|
|
|
+
|
|
|
+/* 超链接文本美化 */
|
|
|
+.video-id-link, .user-creator-link {
|
|
|
+ color: #1890ff;
|
|
|
+ text-decoration: none;
|
|
|
+ display: inline-flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 4px;
|
|
|
+ font-weight: 500;
|
|
|
+}
|
|
|
+.video-id-link:hover, .user-creator-link:hover {
|
|
|
+ color: #40a9ff;
|
|
|
+ text-decoration: underline;
|
|
|
+}
|
|
|
+.user-creator-link {
|
|
|
+ color: #475569;
|
|
|
+}
|
|
|
+.user-creator-link i {
|
|
|
+ color: #94a3b8;
|
|
|
+}
|
|
|
+
|
|
|
+/* 文本单行溢出优雅裁切 */
|
|
|
+.ellipsis-text {
|
|
|
+ display: block;
|
|
|
+ white-space: nowrap;
|
|
|
+ overflow: hidden;
|
|
|
+ text-overflow: ellipsis;
|
|
|
+}
|
|
|
+.text-main-title {
|
|
|
+ color: #1e293b;
|
|
|
+ font-weight: 500;
|
|
|
+}
|
|
|
+.text-muted {
|
|
|
+ color: #64748b;
|
|
|
+ font-size: 13px;
|
|
|
+}
|
|
|
+
|
|
|
+/* 视频时长胶囊 */
|
|
|
+.duration-badge {
|
|
|
+ background-color: #0f172a;
|
|
|
+ color: #ffffff;
|
|
|
+ padding: 2px 6px;
|
|
|
+ border-radius: 4px;
|
|
|
+ font-family: monospace;
|
|
|
+ font-size: 12px;
|
|
|
+}
|
|
|
+
|
|
|
+/* 屏幕类型 Tag 特效调整 */
|
|
|
+.tag-screen {
|
|
|
+ border-radius: 4px;
|
|
|
+ font-weight: 500;
|
|
|
+}
|
|
|
+
|
|
|
+/* 审核中黄色小微标呼吸动态衬托 */
|
|
|
+.status-dot-badge ::v-deep .el-badge__content.is-fixed.is-dot {
|
|
|
+ right: 4px;
|
|
|
+ top: 2px;
|
|
|
+}
|
|
|
+
|
|
|
+/* 操作项去按钮化 */
|
|
|
+.btn-table-action {
|
|
|
+ font-weight: 500;
|
|
|
+ padding: 0 4px;
|
|
|
+}
|
|
|
+.btn-edit {
|
|
|
+ color: #e6a23c;
|
|
|
+}
|
|
|
+.btn-edit:hover {
|
|
|
+ color: #ebb563;
|
|
|
+}
|
|
|
+
|
|
|
+/* 分页器对齐 */
|
|
|
+.pagination-container {
|
|
|
+ margin-top: 20px;
|
|
|
+ display: flex;
|
|
|
+ justify-content: flex-end;
|
|
|
+}
|
|
|
+
|
|
|
+/* 统一高级 Dialog 弧度 */
|
|
|
+::v-deep .custom-dialog {
|
|
|
+ border-radius: 12px;
|
|
|
+ overflow: hidden;
|
|
|
+}
|
|
|
+.player-wrapper {
|
|
|
+ background-color: #000;
|
|
|
+ border-radius: 6px;
|
|
|
+ overflow: hidden;
|
|
|
+ line-height: 0;
|
|
|
+}
|
|
|
+
|
|
|
+/* 创作者快捷点击样式 */
|
|
|
+.user-creator-click-link {
|
|
|
+ color: #1890ff;
|
|
|
+ cursor: pointer;
|
|
|
+ display: inline-flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 4px;
|
|
|
+ font-weight: 500;
|
|
|
+ padding: 2px 6px;
|
|
|
+ border-radius: 4px;
|
|
|
+ transition: all 0.2s ease;
|
|
|
+}
|
|
|
+
|
|
|
+/* 悬浮时的现代 SaaS 视觉反馈:背景微显、颜色加深 */
|
|
|
+.user-creator-click-link:hover {
|
|
|
+ color: #40a9ff;
|
|
|
+ background-color: rgba(24, 144, 255, 0.1);
|
|
|
+}
|
|
|
+
|
|
|
+.user-creator-click-link i {
|
|
|
+ color: #94a3b8;
|
|
|
+ transition: color 0.2s;
|
|
|
+}
|
|
|
+
|
|
|
+.user-creator-click-link:hover i {
|
|
|
+ color: #40a9ff;
|
|
|
+}
|
|
|
+
|
|
|
+/* 系统文本样式 */
|
|
|
+.text-muted {
|
|
|
+ color: #94a3b8;
|
|
|
+ font-size: 13px;
|
|
|
+}
|
|
|
</style>
|