jiuyiUniapp/jiuyi2/pages/index/report.vue

365 lines
7.3 KiB
Vue
Raw Normal View History

2024-12-18 15:46:27 +08:00
<script setup>
/**
* 视频举报
*/
import {
ref,
reactive,
computed,
getCurrentInstance
} from 'vue'
import {
onLoad,
} from '@dcloudio/uni-app'
// 工具库
import util from '@/common/js/util';
// api
import api from '@/api/index.js'
// 视频菜单
import videoMenu from '@/components/index/videoMenu.vue';
const {
proxy
} = getCurrentInstance()
// 举报列表
const reportList = reactive([{
name: '发布不正当的内容或信息',
},
{
name: '传播涩情资源',
},
{
name: '冒充他人',
},
{
name: '涉嫌诈骗',
},
{
name: '侵犯权益',
},
{
name: '其他',
}
])
// 举报下标
const reportIndex = ref('')
// 表单
const form = reactive({
userId: '',
videoId: [],
reason: '',
context: '',
pic: [],
})
// 列表数据
const list = reactive({
data: [],
pageSize: 10,
pageNum: 1,
total: 0,
})
// 已选择的视频列表
const videos = computed(() => {
let result = form.videoId.map(item => {
return list.data.find(node => node.videoId == item) || {}
})
return result
})
onLoad((option) => {
// 被举报的用户id
if (option.userId) form.userId = option.userId
// 获取列表
getList()
})
/**
* 选择举报列表
* @param {Object} ev 携带参数
*/
function handleReportList(ev) {
const index = ev.detail.value
if (reportIndex.value === index) return
reportIndex.value = index
}
// 刷新列表
function refreshList() {
list.pageNum = 1
list.total = 0
getList()
}
// 获取更多列表
function getMoreList() {
if (list.data.length >= list.rows) return
list.pageNum++
getList()
}
// 获取列表
function getList() {
//
api.video.myVideoList({
query: {
isDraft: 0,
userId: form.userId,
pageSize: list.pageSize,
pageNum: list.pageNum,
}
}).then(rs => {
if (rs.code == 200) {
if (list.pageNum == 1) list.data.length = []
list.data.push(...rs.rows.map(item => {
item.format_videoUrl = util.format_url(item.videoUrl, 'video')
item.format_imageUrl = util.format_url(item.imageUrl, 'img')
return item
}))
list.total = rs.total
return
}
util.alert({
content: rs.msg,
showCancel: false,
})
})
}
// 上传图片
function uploadImg() {
util.upload_image({
value: form.pic,
})
}
/**
* 删除多媒体
* @param {Number} index 列表下标
* @param {String} key 操作的键
*/
function removeMedia(index, key) {
util.alert({
content: '确认要删除吗?',
}).then(rs => {
if (rs.confirm) form[key].splice(index, 1)
})
}
// 视频举报
function handleSubmit() {
//
const data = {
...form
}
// 验证必填项
if (reportIndex == '') {
util.alert('请选择举报理由')
return
}
if (!data.context) {
util.alert('详细描述不能为空')
return
}
if (data.context.length > 100) {
util.alert('详细描述自述超过100')
return
}
if (!data.pic[0]) {
util.alert('请上传举报图片')
return
}
if (!data.videoId[0]) {
util.alert('请选择举报视频')
return
}
//
data.reason = reportList[reportIndex.value].name
data.pic = data.pic.map(node => {
node = util.replace_url('node')
return node
}).join(',')
data.videoId = data.videoId.join(',')
api.video.reportVideo({
data: data,
}).then(rs => {
if (rs.code == 200) {
util.alert('举报成功,请等待后台审核')
setTimeout(() => {
uni.navigateBack()
}, 500)
return
}
util.alert({
content: rs.msg,
showCancel: false,
})
})
}
</script>
<template>
<view class="appbw">
<!-- 表单 -->
<view class="form plr50 c333 f28">
<view class="line df aic mtb20">
<view class="key mr20">举报理由</view>
<picker class="f1" :range="reportList" rangeKey="name" @change="handleReportList">
<view class="inputBox ptb10 plr10">
<text v-if="reportList[reportIndex]">{{reportList[reportIndex].name}}</text>
<text v-else class="placeholderStyle">请选择举报理由</text>
</view>
</picker>
</view>
<view class="line mtb50">
<view class="key">详细描述</view>
<view class="inputBox mt20 ptb15 plr15">
<textarea v-model="form.context" placeholder="请详细填写,以提高举报成功率。" />
</view>
<view class="hint mt10 tar f20">{{form.context.length}}/100</view>
</view>
<view class="line mtb50 uploadBox">
<view class="key">上传照片</view>
<view class="uploads pr">
<view class="cartoon pa">
<image src="/static/uploadCartoon.png" mode="aspectFit" />
</view>
<view class="imgList images mt20">
<view class="item upload fmid pr mr20 br10" @click="uploadImg">
<uni-icons type="plusempty" color="#D8D8D8" size="100rpx" />
</view>
<view class="imgs item mr20 br10" v-for="(item,index) in form.pic" :key="index">
<image class="br10" :src="item" mode="aspectFill" />
<view class="close">
<uni-icons type="clear" size="30rpx" color="red" @click="removeMedia(index,'pic')" />
</view>
</view>
</view>
</view>
</view>
<view class="line mtb50 uploadBox">
<view class="key">选择视频</view>
<view class="list pr mt20">
<view class="item fmid oh br10" @click="$refs.select.open()">
<uni-icons type="plusempty" color="#D8D8D8" size="100rpx" />
</view>
<view class="item pr br10" v-for="(item,index) in videos" :key="index">
<image :src="item.format_imageUrl" mode="aspectFill" />
<view class="close">
<uni-icons type="clear" size="30rpx" color="red" @click="removeMedia(index,'videoId')" />
</view>
</view>
</view>
</view>
</view>
<view class="fill" style="height: 180rpx;"></view>
<view class="footer plr30 bfff shadow">
<view class="btn lg focus" @click="handleSubmit">举报</view>
</view>
<!-- 选择 -->
<uni-popup ref="select" type="bottom">
<view class="selectAlt popBot">
<view class="product mt30 bfff">
<view class="header rows ptb20 plr20">
<view class="title plr30 c333 f34">
<text>作品</text>
<text class="ml10">{{list.total}}</text>
</view>
<view class="fmid c999 f28" @click="refreshList">
<uni-icons type="refreshempty" color="" />
<text>刷新</text>
</view>
</view>
<!-- 视频菜单 -->
<scroll-view scroll-y="true" class="scroll">
<videoMenu :list="list.data" v-model:ids="form.videoId" mode="checkbox" />
</scroll-view>
</view>
</view>
</uni-popup>
</view>
</template>
<style lang="scss">
image {
width: 100%;
height: 100%;
}
// 表单
.form {
.hint {
color: #a7a7a7;
}
}
// 上传图片
.uploadBox {
//
.uploads {
.cartoon {
top: 0;
right: -100rpx;
width: 530rpx;
height: 249rpx;
}
}
// 上传图片
.images .item {
width: 150rpx;
height: 150rpx;
background-color: #F3F3F5;
}
// 列表
.list {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-gap: 20rpx;
// 列表
.item {
height: 290rpx;
background-color: #F1F1F1;
// 关闭
.close {
position: absolute;
top: 0;
right: 0;
transform: translate(50%, -50%);
z-index: 1;
}
}
}
}
// 作品数量
.product {
.scroll {
height: 80vh;
}
}
</style>