<template>
|
<div>
|
<Card>
|
<Form
|
ref="searchForm"
|
@keydown.enter.native="handleSearch"
|
:model="searchForm"
|
inline
|
:label-width="70"
|
class="search-form"
|
>
|
<Form-item label="标题" prop="title">
|
<Input
|
type="text"
|
v-model="searchForm.title"
|
clearable
|
@on-clear="handleSearch"
|
@on-change="handleSearch"
|
style="width: 160px"
|
/>
|
</Form-item>
|
<Form-item label="分类" prop="typeList">
|
<Select
|
v-model="searchForm.typeList"
|
clearable
|
filterable
|
multiple
|
@on-clear="handleSearch"
|
@on-change="handleSearch"
|
style="width: 160px"
|
>
|
<Option v-for="type in typeList" :key="type.id" :value="type.id">{{ type.typeName }}</Option>
|
</Select>
|
</Form-item>
|
<Form-item label="视频状态" prop="status">
|
<Select
|
v-model="searchForm.status"
|
clearable
|
@on-clear="handleSearch"
|
@on-change="handleSearch"
|
style="width: 160px"
|
>
|
<Option value="99">待审核</Option>
|
<Option value="1">已发布</Option>
|
<Option value="0">已下架</Option>
|
<Option value="-1">审核未通过</Option>
|
</Select>
|
</Form-item>
|
<Button
|
@click="handleSearch"
|
type="primary"
|
icon="ios-search"
|
class="search-btn"
|
>搜索
|
</Button
|
>
|
<Button
|
@click="handleVideoUpLoad"
|
type="primary"
|
icon="md-arrow-up"
|
class="search-btn"
|
>上传视频
|
</Button
|
>
|
</Form>
|
<!-- 厨神视频上传-->
|
<Modal
|
v-model="upLoadVideoShow"
|
:title="uploadVideoForm.id?'编辑厨神视频':'上传厨神视频'"
|
width="800"
|
:mask-closable="false"
|
>
|
|
<Form
|
:model="uploadVideoForm"
|
ref="uploadVideoForm"
|
:rules="uploadVideoFileRule"
|
>
|
<Row :gutter="24">
|
<Col span="24">
|
<Spin size="large" fix v-if="upLoadVideoLoading"> 文件上传中...</Spin>
|
</Col>
|
<Col span="12">
|
<FormItem label="标题" prop="title">
|
<Input placeholder="请输入标题" v-model="uploadVideoForm.title"
|
style="width: 200px"
|
/>
|
</FormItem>
|
</Col>
|
<!-- 刷新dom使用-->
|
<Col span="24">
|
<FormItem label="刷新dom使用" prop="title" v-show="false">
|
<Input placeholder="请输入标题" v-model="uploadVideoForm.temp"
|
style="width: 200px"
|
/>
|
</FormItem>
|
</Col>
|
<Col span="12" v-if="!uploadVideoForm.videoFileKey">
|
<FormItem label="上传视频" prop="videoFileKey">
|
<Upload
|
:multiple="true"
|
:before-upload="upLoadVideo"
|
accept="video/*"
|
action=""
|
>
|
<Button icon="ios-cloud-upload-outline">选择视频</Button>
|
</Upload>
|
</FormItem>
|
</Col>
|
|
<Col span="24" v-else>
|
<FormItem label="视频">
|
<video style="width: 150px;height: 150px"
|
controls
|
:poster="uploadVideoForm.showCoverUrl"
|
:autoplay="false"
|
id="remoteVideo" :src="uploadVideoForm.showVideoUrl"
|
ref="healthVideoInfo"
|
></video>
|
</FormItem>
|
</Col>
|
|
<Col span="12" v-show="uploadVideoForm.videoFileKey && !uploadVideoForm.coverUrl">
|
<FormItem label="上传封面" prop="coverUrl">
|
<Upload
|
:multiple="true"
|
:before-upload="upLoadImg"
|
accept="image/*"
|
action=""
|
>
|
<Button icon="ios-cloud-upload-outline">选择封面</Button>
|
</Upload>
|
</FormItem>
|
</Col>
|
<Col span="24" style="padding-right:10px">
|
<FormItem label="厨神标签" prop="checkKitchenType">
|
<Select filterable multiple
|
style="width: 600px"
|
v-model="uploadVideoForm.checkKitchenType"
|
>
|
<Option v-for="item in kitchenType" :value="item.id" :key="item.id">{{ item.typeName }}</Option>
|
</Select>
|
</FormItem>
|
</Col>
|
<Col span="24">
|
<div>
|
<Button type="primary" @click="clearCoverImage" v-show="uploadVideoForm.coverUrl">重新上传封面</Button>
|
<Button type="primary" @click="clearVideo" style="margin-left: 20px"
|
v-show="uploadVideoForm.videoFileKey">重新上传视频
|
</Button>
|
</div>
|
</Col>
|
</Row>
|
|
</Form>
|
<div slot="footer">
|
<Button type="text" @click="closeHealthVideo">关闭</Button>
|
<Button type="primary" @click="submitHealthVideo">确认</Button>
|
</div>
|
</Modal>
|
<Modal
|
v-model="playVideoShow"
|
:title="playVideoTitle"
|
width="800"
|
:mask-closable="false"
|
>
|
<div class="video-warp">
|
<video :src="playVideoUrl" autoplay controls style="width: 768px;height: 432px"/>
|
</div>
|
<div slot="footer">
|
<Button type="text" @click="playVideoClose">关闭</Button>
|
</div>
|
</Modal>
|
|
<Modal
|
v-model="auditingShow"
|
title="视频审核"
|
width="800"
|
:loading="auditingLoading"
|
:mask-closable="false"
|
>
|
|
<Form
|
ref="auditingForm"
|
:model="auditingForm"
|
:label-width="70"
|
:rules="auditingRule"
|
>
|
<Form-item label="标题:">
|
<div>{{ detail.title }}</div>
|
</Form-item>
|
<Form-item label="标签:">
|
<div style="display: flex;flex-wrap: wrap">
|
<div v-for="(tag, index) in detail.typeList" :key="'tag' + index" style="margin-right: 5px">
|
<Tag color="red">{{ tag.tagName }}</Tag>
|
</div>
|
</div>
|
</Form-item>
|
<Form-item label="视频时长:" :label-width="72">
|
<div>{{ formatSeconds(detail.videoDuration) }}</div>
|
</Form-item>
|
<Form-item class="video-warp" :label-width="0">
|
<video :src="detail.videoUrl" autoplay controls style="width: 768px;height: 432px"/>
|
</Form-item>
|
<Form-item label="审核结果:" :label-width="100" prop="result">
|
<RadioGroup v-model="auditingForm.result">
|
<Radio :label="1">通过</Radio>
|
<Radio :label="0">不通过</Radio>
|
</RadioGroup>
|
</Form-item>
|
<Form-item v-show="auditingForm.result === 0" label="不通过原因:" :label-width="100" prop="reason">
|
<Input
|
type="textarea"
|
v-model="auditingForm.reason"
|
clearable
|
style="width: 100%"
|
/>
|
</Form-item>
|
</Form>
|
<div slot="footer">
|
<Button type="text" @click="closeAuditing">关闭</Button>
|
<Button type="primary" @click="submitAuditing">确认</Button>
|
</div>
|
</Modal>
|
|
<Modal
|
v-model="videoDownShow"
|
title="视频下架"
|
width="800"
|
:mask-closable="false"
|
>
|
<Form :model="videoDownForm" :rules="videoDownRule" ref="videoDownForm">
|
<FormItem label="下架原因:" :labelWidth="100" prop="reason">
|
<editor ref="editor" @input="getReason"/>
|
</FormItem>
|
</Form>
|
<div slot="footer">
|
<Button type="text" @click="closeVideoDown">关闭</Button>
|
<Button type="primary" @click="videoDown">确认</Button>
|
</div>
|
</Modal>
|
|
<Table
|
:loading="loading"
|
border
|
:columns="columns"
|
:data="data"
|
ref="table"
|
sortable="custom"
|
@on-sort-change="changeSort"
|
@on-selection-change="showSelect"
|
>
|
<template slot-scope="{ row, index }" slot="typeList">
|
<div v-for="(tag, index) in row.typeList" :key="'tag' + index" style="margin-top: 5px">
|
<Tag color="red">{{ tag.typeName }}</Tag>
|
</div>
|
</template>
|
<template slot-scope="{ row, index }" slot="videoFileKey">
|
<div class="play-text" @click="playVideo(row.videoFileKey, row.title)">点击播放</div>
|
</template>
|
<template slot-scope="{ row, index }" slot="videoDuration">
|
<div>{{ formatSeconds(row.videoDuration) }}</div>
|
</template>
|
<template slot-scope="{ row, index }" slot="recommend">
|
<i-switch v-model="row.recommend" :before-change="() => handleBeforeChange(row)" true-color="#13ce66"/>
|
</template>
|
<template slot-scope="{ row, index }" slot="status">
|
{{ transStatus(row.status) }}
|
</template>
|
<template slot-scope="{ row, index }" slot="action">
|
<Button type="primary" size="small" style="margin-right: 5px" v-if="row.status === '99'"
|
@click="openAuditing(row)">审核
|
</Button>
|
<Button type="error" size="small" style="margin-right: 5px" v-if="row.status === '1'"
|
@click="openVideoDown(row)">下架
|
</Button>
|
<Button type="success" size="small" style="margin-right: 5px" v-else-if="row.status === '0'"
|
@click="videoUp(row)">上架
|
</Button>
|
<Button type="success" size="small" style="margin-right: 5px"
|
@click="handleVideoUpLoad(row)">编辑
|
</Button>
|
<Button type="success" size="small" style="margin-right: 5px"
|
@click="deleteHealthVideo(row)">删除
|
</Button>
|
</template>
|
</Table>
|
|
<Row type="flex" justify="end" class="mt_10">
|
<Page
|
:current="searchForm.pageNumber"
|
:total="total"
|
:page-size="searchForm.pageSize"
|
@on-change="changePage"
|
@on-page-size-change="changePageSize"
|
:page-size-opts="[10, 20, 50]"
|
size="small"
|
show-total
|
show-elevator
|
show-sizer
|
></Page>
|
</Row>
|
</Card>
|
</div>
|
</template>
|
|
<script>
|
import {recommendSet, getVideoById, auditingVideo, up, down} from "@/api/video";
|
import {addKitchenVideo, delKitchen, getKitchenVideos, updateKitchenVideo} from "@/api/kitchen-video";
|
import {getFilePreview, getSts} from "@/api/file";
|
import Editor from '@/components/editor/index.vue'
|
import COS from 'cos-js-sdk-v5';
|
import {getFileKey} from "@/utils/file.js";
|
import {getKitchenTypeAllList} from "@/api/kitchen";
|
|
export default {
|
name: "VideoList",
|
components: {Editor},
|
data() {
|
return {
|
videoDownForm: {
|
id: '',
|
reason: ''
|
},
|
videoDownRule: {
|
reason: [
|
{
|
require: true,
|
message: '请输入下架原因',
|
trigger: 'blur',
|
validator: (rule, value, callback) => {
|
if (value === null || value === '') {
|
callback(new Error('请输入下架原因'));
|
} else {
|
callback();
|
}
|
}
|
}
|
]
|
},
|
videoDownShow: false, // 视频下架
|
videoDownMsg: '', // 下架提示信息
|
auditingForm: { // 审核表单
|
id: null,
|
result: null,
|
reason: ''
|
},
|
auditingRule: {
|
result: [
|
{
|
required: true,
|
message: '请选择视频审核结果',
|
trigger: 'change',
|
validator: (rule, value, callback) => {
|
if (value === null || value === undefined) {
|
callback(new Error('请选择视频审核结果'));
|
} else {
|
callback();
|
}
|
}
|
}
|
],
|
},
|
uploadVideoFileRule: {
|
coverUrl: [
|
{
|
required: true,
|
message: '请上传封面',
|
trigger: 'blur',
|
validator: (rule, value, callback) => {
|
if (value === null || value === undefined || value === '') {
|
callback(new Error('请上传封面'));
|
} else {
|
callback();
|
}
|
}
|
}
|
],
|
videoFileKey: [
|
{
|
required: true,
|
message: '请上传封面',
|
trigger: 'blur',
|
validator: (rule, value, callback) => {
|
if (value === null || value === undefined || value === '') {
|
callback(new Error('请上传封面'));
|
} else {
|
callback();
|
}
|
}
|
}
|
],
|
checkKitchenType: [
|
{
|
required: true,
|
message: '请选择厨神标签',
|
trigger: 'blur',
|
validator: (rule, value, callback) => {
|
console.log('验证值:-------------->', value, '类型:', typeof value);
|
if (value === null || value === undefined||value.length >5) {
|
callback(new Error('请选择厨神标签且不能超过5个'));
|
} else {
|
callback();
|
}
|
}
|
}
|
],
|
title: [
|
{
|
required: true,
|
message: '请输入标题',
|
trigger: 'blur',
|
validator: (rule, value, callback) => {
|
if (value === null || value === undefined) {
|
callback(new Error('请输入标题'));
|
} else {
|
callback();
|
}
|
}
|
}
|
],
|
},
|
detail: {}, // 视频详情信息
|
auditingShow: false, // 审核弹窗
|
upLoadVideoShow: false,//文件上传弹窗
|
auditingLoading: false, // 审核弹窗
|
upLoadVideoLoading: false,//上传视频
|
playVideoShow: false, // 视频播放弹窗
|
playVideoTitle: '', // 视频播放标题
|
playVideoUrl: '', // 当前正在播放的视频地址
|
modelShow: false, // 弹窗显隐
|
modelTitle: '', // 弹窗title
|
loading: false, // 表单加载状态
|
searchForm: {
|
// 搜索框初始化对象
|
pageNumber: 1, // 当前页数
|
pageSize: 10, // 页面大小
|
title: '', // 标题
|
typeList: [], // 标签
|
status: '99'
|
},
|
typeList: [], // 标签列表
|
columns: [
|
{
|
type: 'selection',
|
width: 60,
|
align: 'center'
|
},
|
{
|
title: "标题",
|
key: "title",
|
minWidth: 240,
|
tooltip: true,
|
},
|
{
|
title: "作者",
|
key: "authorName",
|
width: 130,
|
tooltip: true,
|
},
|
{
|
title: "视频分类",
|
key: "typeList",
|
width: 180,
|
slot: "typeList",
|
},
|
{
|
title: "视频内容",
|
key: "videoFileKey",
|
width: 170,
|
slot: "videoFileKey"
|
},
|
{
|
title: "时长",
|
key: "videoDuration",
|
width: 80,
|
align: 'center',
|
slot: "videoDuration",
|
},
|
{
|
title: "播放量",
|
key: "playNum",
|
width: 80,
|
align: 'center'
|
},
|
{
|
title: "收藏数",
|
key: "collectNum",
|
width: 80,
|
align: 'center'
|
},
|
{
|
title: "评论数",
|
key: "commentNum",
|
width: 80,
|
align: 'center'
|
},
|
{
|
title: "首页推荐",
|
key: "recommend",
|
slot: "recommend",
|
width: 100,
|
align: 'center'
|
},
|
{
|
title: "权重",
|
key: "weight",
|
width: 170,
|
},
|
{
|
title: "状态",
|
key: "status",
|
slot: "status",
|
width: 120,
|
align: 'center'
|
},
|
{
|
title: "操作",
|
key: "action",
|
slot: "action",
|
align: "center",
|
width: 200,
|
},
|
],
|
data: [], // 表单数据
|
kitchenType: [], // 厨神分类
|
total: 0, // 表单数据总数
|
selectCount: 0, // 已选数量
|
selectList: [], // 已选数据列表
|
uploadVideoForm: {
|
id: null,
|
checkKitchenType:[],
|
coverUrl: null,
|
videoFileKey: null,
|
videoFit: null,
|
videoDuration: null,
|
title: null,
|
videoContentType: null,
|
videoType: null,
|
showCoverUrl: null,
|
showVideoUrl: null,
|
temp: null
|
|
},
|
}
|
},
|
created() {
|
this.getDataList();
|
this.getTypes('')
|
},
|
methods: {
|
// 秒转x分x秒
|
formatSeconds(seconds) {
|
if (isNaN(seconds) || seconds < 0) return '0秒';
|
|
const mins = Math.floor(seconds / 60);
|
const secs = seconds % 60;
|
|
if (mins === 0) return `${secs}秒`;
|
if (secs === 0) return `${mins}分`;
|
|
return `${mins}分${secs}秒`;
|
},
|
// 获取分类列表
|
getTypes(typeName) {
|
let params = {
|
'typeName': typeName
|
}
|
getKitchenTypeAllList(params).then(res => {
|
this.typeList = res.data
|
})
|
},
|
// 获取富文本编辑器的内容
|
getReason(content) {
|
this.videoDownForm.reason = content
|
},
|
//重新上传封面
|
clearCoverImage() {
|
this.$set(this.uploadVideoForm, 'coverUrl', '');
|
this.$set(this.uploadVideoForm, 'showCoverUrl', '');
|
this.$set(this.uploadVideoForm, 'temp', new Date().getTime());
|
},
|
//重新上传视频
|
clearVideo() {
|
this.clearCoverImage();
|
this.$set(this.uploadVideoForm, 'videoFileKey', '');
|
this.$set(this.uploadVideoForm, 'showVideoUrl', '');
|
this.$set(this.uploadVideoForm, 'temp', new Date().getTime());
|
console.log(this.uploadVideoForm)
|
},
|
// 视频上架
|
videoUp(row) {
|
this.$Modal.confirm({
|
title: "操作确认",
|
content: "您确认要上架视频【 " + row.title + "】吗?",
|
loading: true,
|
onOk: () => {
|
up(row.id).then(res => {
|
this.$Modal.remove();
|
if (res.code == 200) {
|
this.$Message.success("视频上架成功");
|
this.getDataList();
|
}
|
});
|
}
|
});
|
},
|
// 视频下架
|
videoDown() {
|
this.$refs.videoDownForm.validate((valid) => {
|
if (valid) {
|
down(this.videoDownForm).then(res => {
|
this.$Message.success("下架成功")
|
this.closeVideoDown()
|
this.getDataList()
|
})
|
}
|
})
|
},
|
// 关闭视频下架
|
closeVideoDown() {
|
this.videoDownShow = false
|
this.videoDownForm = {
|
id: '',
|
reason: ''
|
}
|
this.$refs.editor.setContent('')
|
},
|
// 视频下架
|
openVideoDown(row) {
|
this.videoDownForm.id = row.id
|
this.videoDownShow = true
|
},
|
// 视频发布/修改
|
//todo 1
|
submitHealthVideo() {
|
console.log(this.uploadVideoForm)
|
try {
|
this.upLoadVideoLoading = true
|
this.$refs.uploadVideoForm.validate((valid) => {
|
if (valid) {
|
// 修改
|
if (this.uploadVideoForm.id) {
|
console.log(this.uploadVideoForm)
|
updateKitchenVideo(this.uploadVideoForm).then(res => {
|
this.$Message.success("修改完成")
|
this.closeHealthVideo()
|
this.getDataList()
|
})
|
} else {
|
addKitchenVideo(this.uploadVideoForm).then(res => {
|
this.$Message.success("添加完成")
|
this.closeHealthVideo()
|
this.getDataList()
|
})
|
}
|
}
|
})
|
} finally {
|
this.upLoadVideoLoading = false
|
}
|
},
|
//获取标签
|
getKitchenTypeList(e){
|
const typeParam = {typeName:e}
|
getKitchenTypeAllList(typeParam).then(res => {
|
this.kitchenType = res.data
|
})
|
|
},
|
|
// 关闭窗口
|
closeHealthVideo() {
|
//
|
this.uploadVideoForm = {};
|
this.upLoadVideoShow = false;
|
},
|
// 提交审核结果
|
submitAuditing() {
|
console.log(this.auditingForm, "sb")
|
this.$refs.auditingForm.validate((valid) => {
|
if (valid) {
|
auditingVideo(this.auditingForm).then(res => {
|
this.$Message.success("审核完成")
|
this.closeAuditing()
|
this.getDataList()
|
})
|
}
|
})
|
},
|
// 审核结果变化
|
resultChange(selected) {
|
this.auditingForm.result = selected === '通过' ? 1 : 0
|
console.log(this.auditingForm.result)
|
},
|
closeAuditing() {
|
this.auditingForm = {
|
id: null,
|
result: null,
|
reason: ''
|
}
|
this.detail = {}
|
this.auditingShow = false
|
},
|
// 打开审核弹窗
|
openAuditing(row) {
|
this.auditingShow = true
|
this.auditingLoading = true
|
this.auditingForm.id = row.id
|
getVideoById(row.id).then(res => {
|
this.detail = res.data
|
this.auditingLoading = false
|
})
|
},
|
// 打开编辑弹窗
|
deleteHealthVideo(row) {
|
console.log('删除测试', row)
|
this.$Modal.confirm({
|
title: "操作确认",
|
content: "您确认要删除视频【 " + row.title + "】吗?",
|
loading: true,
|
onOk: () => {
|
delKitchen(row.id).then(res => {
|
this.$Modal.remove();
|
if (res.code === 200) {
|
this.$Message.success("视频删除成功");
|
this.getDataList();
|
}
|
});
|
}
|
});
|
},
|
// 翻译状态
|
transStatus(status) {
|
switch (status) {
|
case '99':
|
return '待审核'
|
case '1':
|
return '已发布'
|
case '0':
|
return '已下架'
|
case '-1':
|
return '审核未通过'
|
default:
|
return '未知'
|
}
|
},
|
// 开启或关闭推荐的方法
|
handleBeforeChange(row) {
|
let content = ""
|
if (row.recommend) {
|
content = '确认要关闭首页推荐吗?'
|
} else {
|
content = '确认要开启首页推荐吗?'
|
}
|
return new Promise((resolve) => {
|
this.$Modal.confirm({
|
title: '操作提醒',
|
content: content,
|
onOk: () => {
|
recommendSet({id: row.id, recommend: !row.recommend}).then(res => {
|
this.$Message.success(res.msg);
|
resolve();
|
})
|
}
|
});
|
});
|
},
|
// 关闭视频播放
|
playVideoClose() {
|
this.playVideoTitle = '';
|
this.playVideoUrl = '';
|
this.playVideoShow = false
|
},
|
// 点击播放视频
|
playVideo(fileKey, title) {
|
this.playVideoTitle = title;
|
|
getFilePreview(fileKey).then(res => {
|
this.playVideoUrl = res.data
|
this.playVideoShow = true
|
})
|
},
|
// 搜索
|
handleSearch() {
|
this.searchForm.pageNumber = 1;
|
this.searchForm.pageSize = 10;
|
this.getDataList();
|
},
|
// 获取列表数据
|
getDataList() {
|
this.loading = true;
|
getKitchenVideos(this.searchForm).then((res) => {
|
console.log(res)
|
this.loading = false;
|
if (res.code === 200) {
|
this.data = res.data;
|
this.total = res.total;
|
}
|
});
|
this.total = this.data.length;
|
this.loading = false;
|
},
|
showSelect(e) {
|
this.selectList = e.map(d => d.id);
|
this.selectCount = e.length;
|
},
|
// 排序
|
changeSort(e) {
|
this.searchForm.sort = e.key;
|
this.searchForm.order = e.order;
|
if (e.order == "normal") {
|
this.searchForm.order = "";
|
}
|
this.getDataList();
|
},
|
// 分页 改变页码
|
changePage(v) {
|
this.searchForm.pageNumber = v;
|
this.getDataList();
|
},
|
|
// 分页 改变页数
|
changePageSize(v) {
|
this.searchForm.pageNumber = 1;
|
this.searchForm.pageSize = v;
|
this.getDataList();
|
},
|
|
handleVideoUpLoad(row) {
|
this.uploadVideoForm = {};
|
this.upLoadVideoShow = true;
|
console.log(row)
|
if (row.id) {
|
this.uploadVideoForm.id = row.id;
|
this.uploadVideoForm.showVideoUrl = row.videoUrl
|
this.uploadVideoForm.videoFileKey = row.videoFileKey;
|
this.uploadVideoForm.coverUrl = row.coverUrl;
|
this.uploadVideoForm.showCoverUrl = row.coverShowUrl;
|
this.uploadVideoForm.title = row.title;
|
this.uploadVideoForm.checkKitchenType = row.typeList.map(item => {return item.id});
|
}
|
this.getKitchenTypeList();
|
},
|
async upLoadVideo(file) {
|
try {
|
this.$nextTick(() => {
|
this.upLoadVideoLoading = true;
|
})
|
// 获取文件上传临时密钥
|
const sts = await getSts();
|
const cos = new COS({
|
getAuthorization: async function (options, callback) {
|
callback({
|
TmpSecretId: sts.data.tmpSecretId,
|
TmpSecretKey: sts.data.tmpSecretKey,
|
SecurityToken: sts.data.sessionToken,
|
// 建议返回服务器时间作为签名的开始时间,避免客户端本地时间偏差过大导致签名错误
|
StartTime: sts.data.stsStartTime, // 时间戳,单位秒,如:1580000000
|
ExpiredTime: sts.data.stsEndTime,// 时间戳,单位秒,如:1580000000
|
ScopeLimit: true, // 细粒度控制权限需要设为 true,会限制密钥只在相同请求时重复使用
|
});
|
}
|
})
|
const fileKey = getFileKey(file.name)
|
const upData = await cos.uploadFile({
|
Bucket: sts.data.bucket,
|
Region: sts.data.region,
|
Key: fileKey,
|
Body: file, // 要上传的文件对象。
|
SliceSize: 1024 * 1024 * 5,
|
onProgress: function (progressData) {
|
console.log('上传进度:', progressData);
|
},
|
});
|
|
console.log(this.uploadVideoForm)
|
this.$nextTick(() => {
|
this.uploadVideoForm.videoFileKey = fileKey;
|
this.uploadVideoForm.showVideoUrl = sts.data.endpoint + "/" + fileKey;
|
})
|
console.log("上传成功", upData)
|
const duration = this.$refs.healthVideoInfo.duration;
|
console.log('-测试获取时间信息---------------->', duration);
|
} catch (e) {
|
console.log("上传失败", upData)
|
} finally {
|
this.$nextTick(() => {
|
this.upLoadVideoLoading = false;
|
})
|
}
|
return false;
|
},
|
async upLoadImg(file) {
|
try {
|
this.upLoadVideoLoading = true;
|
// 获取文件上传临时密钥
|
const sts = await getSts();
|
const cos = new COS({
|
getAuthorization: async function (options, callback) {
|
callback({
|
TmpSecretId: sts.data.tmpSecretId,
|
TmpSecretKey: sts.data.tmpSecretKey,
|
SecurityToken: sts.data.sessionToken,
|
// 建议返回服务器时间作为签名的开始时间,避免客户端本地时间偏差过大导致签名错误
|
StartTime: sts.data.stsStartTime, // 时间戳,单位秒,如:1580000000
|
ExpiredTime: sts.data.stsEndTime,// 时间戳,单位秒,如:1580000000
|
ScopeLimit: true, // 细粒度控制权限需要设为 true,会限制密钥只在相同请求时重复使用
|
});
|
}
|
})
|
const fileKey = getFileKey(file.name)
|
const upData = await cos.uploadFile({
|
Bucket: sts.data.bucket,
|
Region: sts.data.region,
|
Key: fileKey,
|
Body: file, // 要上传的文件对象。
|
SliceSize: 1024 * 1024 * 5,
|
onProgress: function (progressData) {
|
console.log('上传进度:', progressData);
|
},
|
});
|
console.log("上传成功", upData)
|
this.$nextTick(() => {
|
this.uploadVideoForm.coverUrl = fileKey;
|
this.uploadVideoForm.showCoverUrl = sts.data.endpoint + "/" + fileKey;
|
})
|
|
} catch (e) {
|
console.log("上传失败", upData)
|
} finally {
|
this.upLoadVideoLoading = false;
|
}
|
return false;
|
}
|
}
|
}
|
</script>
|
|
<style scoped>
|
.play-text {
|
width: 100%;
|
text-align: center;
|
color: #2d8cf0;
|
}
|
|
.play-text:hover {
|
cursor: pointer;
|
}
|
|
.video-warp {
|
width: 786px;
|
height: 432px;
|
}
|
|
.data-item {
|
display: flex;
|
align-items: center;
|
}
|
|
.showCoverImg {
|
position: relative;
|
}
|
|
.coverImgRemove {
|
position: absolute;
|
top: 15px;
|
right: -15px;
|
}
|
</style>
|