mrr.sj.front/pages/shop/photoAlbum/videoList.vue

506 lines
13 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="container">
<custom-navbar :title="pagestitle" :leftImg="'/static/images/back.png'" :showUser="true" backgroundColor="#fff"
titleColor="#000" borderBottom="none">
<template #right>
<text class="custom-right" @click="toggleManage">{{ isManage ? '取消' : '管理' }}</text>
</template>
</custom-navbar>
<view class="review">
<view class="review-title">
<text class="review-title-text">添加{{pagestitle}}吸引更多顾客到店消费</text>
</view>
</view>
<view class="container-card">
<view class="card-content flex-row-center" v-if="type==1">
<view class="card-content-page" v-if="class_type!=1 ">{{ imgVideoList.length }}/20张</view>
<view class="content-default" @click="goAdd(class_type)"
v-if="!(class_type == 1 && imgVideoList && imgVideoList.length)">
<image class="content-default-img" src="/static/images/icons/addPhoto.png"></image>
<text class="content-default-text">添加照片</text>
</view>
<view class="content-photo" v-for="(item2,index2) in imgVideoList" :key="index2" v-if="imgVideoList"
@click="isManage ? toggleSelect(index2) : goAdd(class_type,item2)">
<!-- 选择框 -->
<image class="content-photo-select" v-if="isManage"
:src="selectedItems.includes(index2) ? '/static/images/icons/yes_icon.png' : '/static/images/icons/no_icon2.png'">
</image>
<image class="content-photo-img" mode="aspectFill" :src="getItem(item2).url"></image>
<view class="content-photo-title">
{{ getItem(item2).name }}
</view>
<view class="content-photo-mask" v-if="item2.apply_state==1">
<image class="photo-mask-img" mode="aspectFill" src="/static/images/icons/time.png"></image>
<text class="photo-mask-text">审核中…</text>
</view>
</view>
</view>
<view class="card-content flex-row-center" v-else>
<view class="card-content-page" v-if="class_type!=1">{{ imgVideoList.length }}/10张</view>
<view class="content-default content-default2" @click="goAdd(class_type)"
v-if="!(class_type == 1 && imgVideoList && imgVideoList.length)">
<image class="content-default-img" src="/static/images/icons/addPhoto.png"></image>
<text class="content-default-text">添加视频</text>
</view>
<view class="content-photo content-video" v-for="(item2,index2) in imgVideoList" :key="index2"
v-if="imgVideoList" @click="isManage ? toggleSelect(index2) : goAdd(class_type,item2)">
<!-- 选择框 -->
<image class="content-photo-select" v-if="isManage"
:src="selectedItems.includes(index2) ? '/static/images/icons/yes_icon.png' : '/static/images/icons/no_icon2.png'">
</image>
<image class="content-photo-video" mode="aspectFill" :src="getItem(item2).url"></image>
<view class="content-photo-title">
{{ getItem(item2).name }}
</view>
<view class="content-photo-play">
<image class="content-photo-play-img" mode="aspectFill" src="/static/images/icons/play.png">
</image>
</view>
<view class="content-photo-mask" v-if="item2.apply_state==1">
<image class="photo-mask-img" mode="aspectFill" src="/static/images/icons/time.png"></image>
<view class="photo-mask-text">审核中…</view>
</view>
<view class="content-photo-mask" v-if="item2.apply_state==3">
<image class="photo-mask-img" mode="aspectFill" src="/static/images/icons/close2.png"></image>
<view class="photo-mask-text">已驳回</view>
</view>
</view>
</view>
</view>
<view class="container-buttons flex-row-center-center" v-if="isManage">
<view class="container-buttons-sure2 flex-row-center-center" @click="handleDelete">删除</view>
</view>
</view>
</template>
<script>
import request from "@/utils/request";
export default {
data() {
return {
imgVideoList: [],
type: 2, //1图片 2视频
class_type: 4, //1主(图片/视频) 2环境(图片/视频) 3作品(图片/视频) 4其它(图片/视频)
isManage: false, // 管理模式状态
selectedItems: [], // 选中的项索引数组
pagestitle: "店铺图片"
}
},
async onShow() {
await this.getList()
},
async onLoad(options) {
console.log(options, '查看option');
if (options.type) {
this.type = options.type
}
if (options.id) {
this.class_type = options.id
}
if (this.type == 2) {
if (this.class_type == 1) {
this.pagestitle = "店铺主视频"
} else if (this.class_type == 4) {
this.pagestitle = "其它视频"
}
console.log('123123123');
} else if (this.type == 1) {
if (this.class_type == 2) {
this.pagestitle = "环境图片"
} else if (this.class_type == 3) {
this.pagestitle = "作品图片"
} else if (this.class_type == 4) {
this.pagestitle = "其它图片"
} else {
this.pagestitle = "店铺图片"
}
}
},
methods: {
// 切换管理/取消模式
toggleManage() {
this.isManage = !this.isManage;
if (!this.isManage) {
this.selectedItems = []; // 退出管理模式时清空选中项
}
},
// 切换选中状态
toggleSelect(index) {
console.log(1111, index)
if (this.selectedItems.includes(index)) {
// 已选中,移除
this.selectedItems = this.selectedItems.filter(i => i !== index);
} else {
// 未选中,添加
this.selectedItems.push(index);
}
},
// 批量删除
async handleDelete() {
// 收集选中项的ID
let deleteIds = this.selectedItems.map(index => this.imgVideoList[index].id);
let auth_ids = this.selectedItems.map(index => this.imgVideoList[index].auth_id).filter(item =>
item !== 0);
console.log(1111, deleteIds, auth_ids, [1, 6])
try {
const res = await request.post("/sj/imgVideo/del", {
ids: deleteIds,
auth_ids: auth_ids
});
if (res.code == 200) {
// 重新获取列表
await this.getList();
// 退出管理模式
this.isManage = false;
this.selectedItems = [];
} else {
uni.showToast({
title: '删除失败',
icon: 'none'
});
}
} catch (err) {
uni.showToast({
title: '删除失败',
icon: 'none'
});
}
},
goAdd(id, item) {
if (this.isManage) return; // 管理模式下禁止跳转
if (this.type == 1) {
if (this.imgVideoList.length >= 20) {
uni.showToast({
title: '最多上传20张图片',
icon: 'none',
duration: 2000
});
return
}
} else if (this.type == 2) {
if (this.imgVideoList.length >= 10) {
uni.showToast({
title: '最多上10个视频',
icon: 'none',
duration: 2000
});
return
}
}
if (!id) {
uni.showToast({
title: '参数异常,无法上传',
icon: 'none',
duration: 2000
});
return;
}
let url = `/pages/shop/photoAlbum/addPhoto?id=${id}&type=${this.type}`;
if (item) {
url += `&item=${encodeURIComponent(JSON.stringify(item))}`;
}
uni.navigateTo({
url: url
});
},
getItem(item) {
let obj = {
name: "",
url: ""
}
if (item.apply_state == 1) {
obj.url = item.auth_url
obj.name = item.auth_name
} else {
obj.url = item.url || item.auth_url
obj.name = item.name || item.auth_name
}
if (item.type == 2) {
obj.url = obj.url + `?x-oss-process=video/snapshot,t_1000,m_fast,f_jpg,w_600,ar_auto`
}
return obj
},
async getList() {
try {
const res = await request.post("/sj/imgVideo/list", {
type: this.type,
class_type: this.class_type
});
// 核心修复:逐层可选链保护 + 兜底空数组,彻底避免属性访问错误
this.imgVideoList = res.code === 200 ?
res.data?.list?.[this.type]?.[this.class_type] || [] : [];
} catch (err) {
// 网络错误、接口报错等所有异常的兜底处理
console.error("获取媒体列表失败:", err);
this.imgVideoList = [];
}
}
}
}
</script>
<style lang="less">
.container {
.custom-right {
font-weight: 500;
font-size: 26rpx;
color: #333333;
line-height: 37rpx;
text-align: left;
font-style: normal;
white-space: nowrap;
}
.review {
background: rgba(255, 250, 218, 1);
border-radius: 20rpx 20rpx 0rpx 0rpx;
margin: 20rpx;
padding: 20rpx 20rpx 20rpx 20rpx;
.review-title {
margin-bottom: 6rpx;
.review-title-text {
font-weight: 400;
font-size: 24rpx;
color: #835225;
line-height: 33rpx;
text-align: left;
font-style: normal;
}
}
}
.container-card {
border-radius: 20rpx;
margin: 20rpx;
padding: 20rpx 20rpx 30rpx 20rpx;
background: #fff;
transform: translateY(-30rpx);
.card-header {
margin-bottom: 20rpx;
.card-title {
font-weight: 500;
font-size: 28rpx;
color: #1D2129;
line-height: 48rpx;
text-align: left;
font-style: normal;
}
.card-header-right {
.card-header-right-text {
font-weight: 400;
font-size: 22rpx;
color: #999999;
line-height: 30rpx;
text-align: left;
font-style: normal;
}
.card-header-right-img {
width: 8rpx;
height: 16rpx;
margin-left: 7rpx;
}
}
}
.card-content {
gap: 14rpx;
flex-wrap: wrap;
.card-content-page {
font-weight: 400;
font-size: 24rpx;
color: #999999;
line-height: 33rpx;
text-align: left;
font-style: normal;
width: 100%;
}
.content-default {
width: 214rpx;
height: 214rpx;
background: #F5F5F5;
border-radius: 20rpx;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
.content-default-img {
width: 42rpx;
height: 35rpx;
margin-bottom: 8rpx;
}
.content-default-text {
font-weight: 400;
font-size: 22rpx;
color: #666666;
line-height: 30rpx;
text-align: left;
font-style: normal;
display: block;
}
}
.content-default2 {
width: 328rpx;
height: 186rpx;
background: #F5F5F5;
border-radius: 17rpx;
}
.content-photo {
box-sizing: border-box;
width: 214rpx;
height: 214rpx;
border-radius: 20rpx;
position: relative;
overflow: hidden;
// 选择框样式
.content-photo-select {
position: absolute;
top: 12rpx;
right: 14rpx;
width: 36rpx;
height: 36rpx;
z-index: 999;
}
.content-photo-img {
width: 214rpx;
height: 214rpx;
border-radius: 20rpx;
}
.content-photo-video {
width: 328rpx;
height: 186rpx;
border-radius: 20rpx;
}
.content-photo-title {
background: rgba(51, 51, 51, 0.6);
padding: 6rpx 0 4rpx 0;
position: absolute;
left: 0;
right: 0;
bottom: 0;
font-weight: 400;
font-size: 15rpx;
color: #CACACA;
line-height: 21rpx;
text-align: center;
font-style: normal;
}
.content-photo-play {
width: 25rpx;
height: 25rpx;
position: absolute;
right: 10rpx;
top: 6rpx;
.content-photo-play-img {
width: 25rpx;
height: 25rpx;
}
}
.content-photo-mask {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.3);
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
border-radius: 20rpx;
.photo-mask-img {
width: 36rpx;
height: 36rpx;
margin-bottom: 8rpx;
}
.photo-mask-text {
font-weight: 400;
font-size: 24rpx;
color: #FFFFFF;
line-height: 33rpx;
text-align: left;
font-style: normal;
}
}
}
.content-video {
width: 328rpx;
height: 186rpx;
}
}
}
}
.container-buttons {
position: fixed;
left: 0;
right: 0;
bottom: 0;
padding: 30rpx 0;
background: #FFFFFF;
gap: 60rpx;
.container-buttons-cancel {
width: 278rpx;
height: 98rpx;
border-radius: 49rpx;
border: 1rpx solid #E8101E;
font-weight: 400;
font-size: 32rpx;
color: #E8101E;
text-align: center;
font-style: normal;
}
.container-buttons-sure {
width: 278rpx;
height: 98rpx;
background: #E8101E;
border-radius: 49rpx;
font-weight: 400;
font-size: 32rpx;
color: #FFFFFF;
text-align: center;
font-style: normal;
}
.container-buttons-sure2 {
width: 710rpx;
height: 98rpx;
background: #E8101E;
border-radius: 49rpx;
font-weight: 400;
font-size: 38rpx;
color: #FFFFFF;
text-align: left;
font-style: normal;
}
}
</style>