|
@@ -1,13 +1,706 @@
|
|
|
<template>
|
|
|
- <div>advertise config index</div>
|
|
|
+ <div class="app-container">
|
|
|
+ <div class="filter-container">
|
|
|
+ <el-input
|
|
|
+ v-model="advertise.query.desc"
|
|
|
+ placeholder="请输入关键字"
|
|
|
+ style="width: 300px;"
|
|
|
+ class="filter-item"
|
|
|
+ />
|
|
|
+ <el-select
|
|
|
+ v-model="advertise.query.type"
|
|
|
+ class="filter-item"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ label="全部"
|
|
|
+ :value="-1"
|
|
|
+ />
|
|
|
+ <el-option
|
|
|
+ label="视频"
|
|
|
+ :value="0"
|
|
|
+ />
|
|
|
+ <el-option
|
|
|
+ label="图片"
|
|
|
+ :value="1"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ <el-button
|
|
|
+ class="filter-item"
|
|
|
+ style="margin-left: 10px;"
|
|
|
+ type="primary"
|
|
|
+ icon="el-icon-search"
|
|
|
+ @click="handleQuery"
|
|
|
+ >
|
|
|
+ 查询
|
|
|
+ </el-button>
|
|
|
+ <el-button
|
|
|
+ class="filter-item"
|
|
|
+ @click="reset"
|
|
|
+ >
|
|
|
+ 重置
|
|
|
+ </el-button>
|
|
|
+ <el-button
|
|
|
+ plain
|
|
|
+ class="filter-item"
|
|
|
+ style="margin-left: 10px;"
|
|
|
+ type="success"
|
|
|
+ icon="el-icon-plus"
|
|
|
+ @click="handleShowCreate"
|
|
|
+ >
|
|
|
+ 添加
|
|
|
+ </el-button>
|
|
|
+ <el-button
|
|
|
+ plain
|
|
|
+ class="filter-item"
|
|
|
+ style="margin-left: 10px;"
|
|
|
+ icon="el-icon-delete"
|
|
|
+ type="danger"
|
|
|
+ @click="handleBatchDelete"
|
|
|
+ >
|
|
|
+ 删除
|
|
|
+ </el-button>
|
|
|
+ </div>
|
|
|
+ <el-table
|
|
|
+ :key="tableKey"
|
|
|
+ v-loading="advertise.loading"
|
|
|
+ :data="advertise.list"
|
|
|
+ border
|
|
|
+ fit
|
|
|
+ highlight-current-row
|
|
|
+ style="width: 100%;"
|
|
|
+ @sort-change="sortChange"
|
|
|
+ @selection-change="selectionChange"
|
|
|
+ >
|
|
|
+ <el-table-column
|
|
|
+ type="selection"
|
|
|
+ width="80"
|
|
|
+ fixed
|
|
|
+ align="center"
|
|
|
+ :selectable="selectableList"
|
|
|
+ />
|
|
|
+ <el-table-column
|
|
|
+ type="index"
|
|
|
+ label="序号"
|
|
|
+ width="80"
|
|
|
+ align="center"
|
|
|
+ />
|
|
|
+ <el-table-column
|
|
|
+ label="ID"
|
|
|
+ prop="id"
|
|
|
+ align="center"
|
|
|
+ width="250"
|
|
|
+ />
|
|
|
+ <el-table-column
|
|
|
+ label="广告类型"
|
|
|
+ align="center"
|
|
|
+ width="200"
|
|
|
+ >
|
|
|
+ <template slot-scope="{ row }">
|
|
|
+ <el-tag
|
|
|
+ v-if="row.type"
|
|
|
+ type="primary"
|
|
|
+ >
|
|
|
+ 图片
|
|
|
+ </el-tag>
|
|
|
+ <el-tag
|
|
|
+ v-else
|
|
|
+ type="success"
|
|
|
+ >
|
|
|
+ 视频
|
|
|
+ </el-tag>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column
|
|
|
+ label="播放顺序"
|
|
|
+ prop="order"
|
|
|
+ align="center"
|
|
|
+ width="100"
|
|
|
+ sortable="custom"
|
|
|
+ :class-name="advertise.sort.order"
|
|
|
+ />
|
|
|
+ <el-table-column
|
|
|
+ label="资源下载地址"
|
|
|
+ prop="src"
|
|
|
+ align="center"
|
|
|
+ width="400"
|
|
|
+ />
|
|
|
+ <el-table-column
|
|
|
+ label="播放时长(s)"
|
|
|
+ align="center"
|
|
|
+ width="200"
|
|
|
+ sortable="custom"
|
|
|
+ :class-name="advertise.sort.duration"
|
|
|
+ >
|
|
|
+ <template slot-scope="{ row }">
|
|
|
+ <span>{{ row.duration / 1000 }}s</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column
|
|
|
+ label="备注"
|
|
|
+ prop="describe"
|
|
|
+ align="center"
|
|
|
+ width="180"
|
|
|
+ />
|
|
|
+ <el-table-column
|
|
|
+ label="操作"
|
|
|
+ fixed="right"
|
|
|
+ align="center"
|
|
|
+ width="240"
|
|
|
+ class-name="small-padding fixed-width"
|
|
|
+ >
|
|
|
+ <template slot-scope="{row}">
|
|
|
+ <el-button
|
|
|
+ plain
|
|
|
+ type="primary"
|
|
|
+ size="mini"
|
|
|
+ icon="el-icon-edit"
|
|
|
+ @click="handleShowDetail(row)"
|
|
|
+ >
|
|
|
+ 编辑
|
|
|
+ </el-button>
|
|
|
+ <el-button
|
|
|
+ v-if="canDelete(row.id)"
|
|
|
+ plain
|
|
|
+ type="danger"
|
|
|
+ size="mini"
|
|
|
+ icon="el-icon-delete"
|
|
|
+ @click="handleDeleteOne(row.id)"
|
|
|
+ >
|
|
|
+ 删除
|
|
|
+ </el-button>
|
|
|
+ <el-button
|
|
|
+ type="text"
|
|
|
+ @click="open(row)"
|
|
|
+ >
|
|
|
+ 查看
|
|
|
+ </el-button>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+
|
|
|
+ <pagination
|
|
|
+ hide-on-single-page
|
|
|
+ :total="advertise.total"
|
|
|
+ :page.sync="advertise.query.page"
|
|
|
+ :limit.sync="advertise.query.limit"
|
|
|
+ @pagination="getList"
|
|
|
+ />
|
|
|
+ <el-dialog
|
|
|
+ width="30%"
|
|
|
+ :visible.sync="detailVisible"
|
|
|
+ :title="detail.title"
|
|
|
+ :close-on-click-modal="false"
|
|
|
+ center
|
|
|
+ @close="resetDetail"
|
|
|
+ >
|
|
|
+ <el-form
|
|
|
+ ref="myForm"
|
|
|
+ label-width="120px"
|
|
|
+ :rules="rules"
|
|
|
+ :model="detail"
|
|
|
+ >
|
|
|
+ <el-form-item
|
|
|
+ label="播放顺序"
|
|
|
+ prop="order"
|
|
|
+ >
|
|
|
+ <el-input
|
|
|
+ v-model="detail.order"
|
|
|
+ type="number"
|
|
|
+ placeholder="请输入播放顺序"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item
|
|
|
+ label="广告类型"
|
|
|
+ prop="type"
|
|
|
+ >
|
|
|
+ <el-select
|
|
|
+ v-model="detail.type"
|
|
|
+ placeholder="请选择广告类型"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ label="图片"
|
|
|
+ :value="true"
|
|
|
+ />
|
|
|
+ <el-option
|
|
|
+ label="视频"
|
|
|
+ :value="false"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item
|
|
|
+ v-if="detail.type === true"
|
|
|
+ label="图片"
|
|
|
+ prop="base64"
|
|
|
+ >
|
|
|
+ <template v-if="detail.title === '新增广告'">
|
|
|
+ <XImgUpload @onImgChange="onImgChange" />
|
|
|
+ </template>
|
|
|
+ <template v-else>
|
|
|
+ <div
|
|
|
+ v-if="detailImgShow"
|
|
|
+ class="upload-img"
|
|
|
+ >
|
|
|
+ <img
|
|
|
+ :src="detail.picture"
|
|
|
+ alt=""
|
|
|
+ >
|
|
|
+ <div class="mask">
|
|
|
+ <i
|
|
|
+ class="el-icon-delete"
|
|
|
+ @click="detailImgShow = false"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <XImgUpload
|
|
|
+ v-else
|
|
|
+ @onImgChange="onImgChange"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item
|
|
|
+ v-if="detail.type === false"
|
|
|
+ label="视频"
|
|
|
+ prop="base64"
|
|
|
+ >
|
|
|
+ <template v-if="detail.title === '新增广告'">
|
|
|
+ <XVideoUpload @onImgChange="onVideoChange" />
|
|
|
+ </template>
|
|
|
+ <template v-else>
|
|
|
+ <div
|
|
|
+ v-if="videoShow"
|
|
|
+ class="video_box"
|
|
|
+ >
|
|
|
+ <video
|
|
|
+ :src="detail.src"
|
|
|
+ controls
|
|
|
+ />
|
|
|
+ <div class="mask_video">
|
|
|
+ <i
|
|
|
+ class="el-icon-delete"
|
|
|
+ @click="videoShow = false"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <XVideoUpload
|
|
|
+ v-else
|
|
|
+ @onImgChange="onVideoChange"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item
|
|
|
+ label="持续时间(s)"
|
|
|
+ prop="duration"
|
|
|
+ >
|
|
|
+ <el-input
|
|
|
+ v-model="detail.duration"
|
|
|
+ type="number"
|
|
|
+ placeholder="请输入持续时间"
|
|
|
+ >
|
|
|
+ <template #append>
|
|
|
+ <span>s</span>
|
|
|
+ </template>
|
|
|
+ </el-input>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="备注">
|
|
|
+ <el-input
|
|
|
+ v-model="detail.describe"
|
|
|
+ placeholder="请输入备注"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <span
|
|
|
+ slot="footer"
|
|
|
+ class="dialog-footer"
|
|
|
+ >
|
|
|
+ <el-button @click="resetDetail">取 消</el-button>
|
|
|
+ <el-button
|
|
|
+ type="primary"
|
|
|
+ @click="onSubmit"
|
|
|
+ >确 定</el-button>
|
|
|
+ </span>
|
|
|
+ </el-dialog>
|
|
|
+ <el-dialog
|
|
|
+ :visible.sync="showModal"
|
|
|
+ width="30%"
|
|
|
+ :close-on-click-modal="false"
|
|
|
+ :title="showType ? '查看图片' : '查看视频'"
|
|
|
+ >
|
|
|
+ <div
|
|
|
+ v-if="showType"
|
|
|
+ class="box_img"
|
|
|
+ >
|
|
|
+ <img
|
|
|
+ :src="showUrl"
|
|
|
+ alt=""
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+ <div
|
|
|
+ v-else
|
|
|
+ class="box_video"
|
|
|
+ >
|
|
|
+ <video
|
|
|
+ :src="showUrl"
|
|
|
+ controls
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </el-dialog>
|
|
|
+ </div>
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
+import api from '@/api/super/config/advertise'
|
|
|
+import Pagination from '@/components/Pagination'
|
|
|
+import XImgUpload from '@/components/Upload/XImgUpload'
|
|
|
+import XVideoUpload from '@/components/Upload/XVideoUpload'
|
|
|
+import { uploadImgToBase64, videoToBase64 } from '@/utils'
|
|
|
+const InitWineId = 10100
|
|
|
export default {
|
|
|
- name: 'AdvertiseConfig'
|
|
|
+ name: 'AdvertiseConfig',
|
|
|
+ components: { Pagination, XImgUpload, XVideoUpload },
|
|
|
+ data() {
|
|
|
+ var checkAge = (rule, value, callback) => {
|
|
|
+ value = Number(value)
|
|
|
+ if (!value) {
|
|
|
+ return callback(new Error('不能为空'))
|
|
|
+ }
|
|
|
+ setTimeout(() => {
|
|
|
+ if (value <= 0) {
|
|
|
+ callback(new Error('不能小于等于0'))
|
|
|
+ } else if (value > 65535) {
|
|
|
+ callback(new Error('不能大于65535'))
|
|
|
+ } else {
|
|
|
+ callback()
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ tableKey: 0,
|
|
|
+ advertise: {
|
|
|
+ list: [],
|
|
|
+ total: 0,
|
|
|
+ loading: true,
|
|
|
+ sort: {
|
|
|
+ duration: 'ascending',
|
|
|
+ order: 'ascending',
|
|
|
+ degree: 'ascending',
|
|
|
+ density: 'ascending'
|
|
|
+ },
|
|
|
+ query: {
|
|
|
+ page: 1,
|
|
|
+ limit: 10,
|
|
|
+ desc: '',
|
|
|
+ type: -1
|
|
|
+ }
|
|
|
+ },
|
|
|
+ batch: [],
|
|
|
+ detailVisible: false,
|
|
|
+ detail: {
|
|
|
+ title: '',
|
|
|
+ id: 0,
|
|
|
+ order: '',
|
|
|
+ time: new Date(),
|
|
|
+ base64: '',
|
|
|
+ type: '',
|
|
|
+ duration: '',
|
|
|
+ describe: ''
|
|
|
+ },
|
|
|
+ rules: {
|
|
|
+ order: [{ required: true, message: '请填写播放顺序', trigger: 'blur' }],
|
|
|
+ type: [{ required: true, message: '请选择广告类型', trigger: 'change' }],
|
|
|
+ base64: [{ required: true, message: '请上传', trigger: 'blur' }],
|
|
|
+ duration: [{ required: true, message: '请填写播放时间', trigger: 'blur' }, { validator: checkAge, trigger: 'blur' }]
|
|
|
+ },
|
|
|
+ detailImgShow: true,
|
|
|
+ videoShow: true,
|
|
|
+ showModal: false,
|
|
|
+ showType: false,
|
|
|
+ showUrl: ''
|
|
|
+ }
|
|
|
+ },
|
|
|
+ created() {
|
|
|
+ this.getList()
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ reset() {
|
|
|
+ this.advertise.query = {
|
|
|
+ page: 1,
|
|
|
+ limit: 10,
|
|
|
+ desc: '',
|
|
|
+ type: -1
|
|
|
+ }
|
|
|
+ },
|
|
|
+ getList() {
|
|
|
+ this.advertise.loading = true
|
|
|
+ api.Query(this.advertise.query).then(res => {
|
|
|
+ for (let i = 0; i < res.ads.length; ++i) {
|
|
|
+ res.ads[i].time = new Date(res.ads[i].time)
|
|
|
+ }
|
|
|
+ this.advertise.list = res.ads
|
|
|
+ this.advertise.total = res.total
|
|
|
+ this.advertise.loading = false
|
|
|
+ })
|
|
|
+ },
|
|
|
+ sortChange(data) {
|
|
|
+ const { prop, order } = data
|
|
|
+ this.advertise.sort[prop] = order
|
|
|
+ const cmp = order === 'ascending' ? (a, b) => a[prop] - b[prop] : (a, b) => b[prop] - a[prop]
|
|
|
+ this.advertise.list.sort(cmp)
|
|
|
+ },
|
|
|
+ selectionChange(val) {
|
|
|
+ this.batch = val.map(e => e.id)
|
|
|
+ },
|
|
|
+ handleQuery() {
|
|
|
+ this.advertise.query.page = 1
|
|
|
+ this.getList()
|
|
|
+ },
|
|
|
+ selectableList(row) {
|
|
|
+ return row.id !== InitWineId
|
|
|
+ },
|
|
|
+ canDelete(id) {
|
|
|
+ return id !== InitWineId
|
|
|
+ },
|
|
|
+ handleDeleteOne(id) {
|
|
|
+ this.$confirm('此操作将删除该酒品, 是否继续?', '提示', {
|
|
|
+ confirmButtonText: '确定',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ type: 'warning'
|
|
|
+ }).then(() => {
|
|
|
+ api.Delete([id]).then(() => {
|
|
|
+ this.$notify({
|
|
|
+ title: '成功',
|
|
|
+ message: '删除酒品信息成功',
|
|
|
+ type: 'success',
|
|
|
+ duration: 2000
|
|
|
+ })
|
|
|
+ this.getList()
|
|
|
+ }).catch(msg => {
|
|
|
+ this.$notify({
|
|
|
+ title: '失败',
|
|
|
+ message: msg,
|
|
|
+ type: 'error',
|
|
|
+ duration: 0
|
|
|
+ })
|
|
|
+ })
|
|
|
+ })
|
|
|
+ },
|
|
|
+ handleBatchDelete() {
|
|
|
+ if (this.batch.length === 0) return this.$message.info('请勾选需要删除的酒品')
|
|
|
+ this.$confirm('此操作将删除选中的酒品, 是否继续?', '提示', {
|
|
|
+ confirmButtonText: '确定',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ type: 'warning'
|
|
|
+ }).then(() => {
|
|
|
+ api.Delete(this.batch).then(() => {
|
|
|
+ this.$notify({
|
|
|
+ title: '成功',
|
|
|
+ message: '删除酒品信息成功',
|
|
|
+ type: 'success',
|
|
|
+ duration: 2000
|
|
|
+ })
|
|
|
+ this.getList()
|
|
|
+ }).catch(msg => {
|
|
|
+ this.$notify({
|
|
|
+ title: '失败',
|
|
|
+ message: msg,
|
|
|
+ type: 'error',
|
|
|
+ duration: 0
|
|
|
+ })
|
|
|
+ })
|
|
|
+ })
|
|
|
+ },
|
|
|
+ handleShowCreate() {
|
|
|
+ this.resetDetail()
|
|
|
+ this.detail.title = '新增广告'
|
|
|
+ this.detailVisible = true
|
|
|
+ },
|
|
|
+ handleShowDetail(row) {
|
|
|
+ this.detail = Object.assign({}, row)
|
|
|
+ this.detail.title = '编辑广告'
|
|
|
+ this.detailVisible = true
|
|
|
+ },
|
|
|
+ resetDetail() {
|
|
|
+ var _file = document.getElementById('upload-file')
|
|
|
+ _file.value = ''
|
|
|
+ this.detailVisible = false
|
|
|
+ this.detailImgShow = true
|
|
|
+ this.videoShow = true
|
|
|
+ this.detail = {
|
|
|
+ title: '',
|
|
|
+ id: 0,
|
|
|
+ order: '',
|
|
|
+ time: new Date(),
|
|
|
+ base64: '',
|
|
|
+ type: '',
|
|
|
+ duration: '',
|
|
|
+ describe: ''
|
|
|
+ }
|
|
|
+ },
|
|
|
+ // 拿到图片的文件流
|
|
|
+ onImgChange(imgSrc) {
|
|
|
+ uploadImgToBase64(imgSrc[0]).then(res => {
|
|
|
+ if (res.result) {
|
|
|
+ this.detail.base64 = res.result
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+ onVideoChange(imgSrc) {
|
|
|
+ videoToBase64(imgSrc[0]).then(res => {
|
|
|
+ console.log(res)
|
|
|
+ if (res) {
|
|
|
+ this.detail.base64 = res
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+ onSubmit() {
|
|
|
+ this.$refs['myForm'].validate((valid) => {
|
|
|
+ if (valid) {
|
|
|
+ if (this.detail.title === '新增广告') {
|
|
|
+ const params = {
|
|
|
+ order: Number(this.detail.order),
|
|
|
+ base64: this.detail.base64,
|
|
|
+ type: this.detail.type,
|
|
|
+ duration: Number(this.detail.duration) * 1000,
|
|
|
+ describe: this.detail.describe
|
|
|
+ }
|
|
|
+ api.Add(params).then(() => {
|
|
|
+ this.$notify({
|
|
|
+ title: '成功',
|
|
|
+ message: '新增广告成功!',
|
|
|
+ type: 'success',
|
|
|
+ duration: 2000
|
|
|
+ })
|
|
|
+ this.resetDetail()
|
|
|
+ this.getList()
|
|
|
+ }).catch(msg => {
|
|
|
+ this.$notify({
|
|
|
+ title: '失败',
|
|
|
+ message: msg,
|
|
|
+ type: 'error',
|
|
|
+ duration: 0
|
|
|
+ })
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ const params = {
|
|
|
+ id: this.detail.id,
|
|
|
+ order: Number(this.detail.order),
|
|
|
+ base64: this.detail.base64,
|
|
|
+ type: this.detail.type,
|
|
|
+ duration: Number(this.detail.duration) * 1000,
|
|
|
+ describe: this.detail.describe
|
|
|
+ }
|
|
|
+ api.Update(params).then(() => {
|
|
|
+ this.$notify({
|
|
|
+ title: '成功',
|
|
|
+ message: '编辑广告成功!',
|
|
|
+ type: 'success',
|
|
|
+ duration: 2000
|
|
|
+ })
|
|
|
+ this.resetDetail()
|
|
|
+ this.getList()
|
|
|
+ }).catch(msg => {
|
|
|
+ this.$notify({
|
|
|
+ title: '失败',
|
|
|
+ message: msg,
|
|
|
+ type: 'error',
|
|
|
+ duration: 0
|
|
|
+ })
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+ open(row) {
|
|
|
+ this.showModal = true
|
|
|
+ this.showType = row.type
|
|
|
+ this.showUrl = row.src
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
</script>
|
|
|
|
|
|
<style scoped>
|
|
|
+.upload-img {
|
|
|
+ width: 100px;
|
|
|
+ height: 100px;
|
|
|
+ position: relative;
|
|
|
+ overflow: hidden;
|
|
|
+ border: 1px dashed;
|
|
|
+ border-radius: 5px;
|
|
|
+ color: #999;
|
|
|
+ cursor: pointer;
|
|
|
+ z-index: 1;
|
|
|
+}
|
|
|
+.upload-img img {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ object-fit: cover;
|
|
|
+}
|
|
|
+
|
|
|
+.mask {
|
|
|
+ position: absolute;
|
|
|
+ top: 0;
|
|
|
+ left: 0;
|
|
|
+ right: 0;
|
|
|
+ bottom: 0;
|
|
|
+ background-color: rgba(0, 0, 0, 0.4);
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ color: #fff;
|
|
|
+ opacity: 0;
|
|
|
+ transition: opacity 0.3s ease-out;
|
|
|
+ cursor: pointer;
|
|
|
+}
|
|
|
+.mask:hover {
|
|
|
+ opacity: 1;
|
|
|
+}
|
|
|
+.mask_video {
|
|
|
+ width: 50px;
|
|
|
+ height: 50px;
|
|
|
+ position: absolute;
|
|
|
+ top: 0;
|
|
|
+ left: 0;
|
|
|
+ right: 0;
|
|
|
+ bottom: 0;
|
|
|
+ background-color: rgba(0, 0, 0, 0.4);
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ color: #fff;
|
|
|
+ opacity: 0;
|
|
|
+ transition: opacity 0.3s ease-out;
|
|
|
+ cursor: pointer;
|
|
|
+}
|
|
|
+.mask_video:hover {
|
|
|
+ opacity: 1;
|
|
|
+}
|
|
|
+.video_box {
|
|
|
+ width: 200px;
|
|
|
+ height: 200px;
|
|
|
+ position: relative;
|
|
|
+}
|
|
|
+.video_box video {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+}
|
|
|
+
|
|
|
+.box_img {
|
|
|
+ width: 400px;
|
|
|
+ height: 400px;
|
|
|
+}
|
|
|
+.box_img img {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ object-fit: cover;
|
|
|
+}
|
|
|
+
|
|
|
+.box_video {
|
|
|
+ width: 400px;
|
|
|
+ height: 400px;
|
|
|
+}
|
|
|
|
|
|
+.box_video video {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+}
|
|
|
</style>
|