| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 | <template>    <z-paging ref="pageRef" v-model="dataList" @query="getDataList">        <template #top>            <view class="hc-paging-top-bar mb-1">                <hc-nav-back-bar ui="top" title="声像文件">                    <text class="text-26" :class="isDelete?'':'text-red-4'" @click="deleteTap" v-if="dataList.length > 0">                        {{isDelete? '取消' : '删除'}}                    </text>                </hc-nav-back-bar>                <view class="cu-bar bg-white search py-2" un-border-t="1 solid gray-2" v-if="pageNode.type === 1">                    <view class="search-form radius">                        <text class="cuIcon-search"/>                        <input v-model="searchForm.queryStr" :adjust-position="false" type="text" placeholder="根据题名,名称或拍摄者搜索" confirm-type="search"/>                    </view>                    <view class="action">                        <button class="cu-btn bg-blue-5 text-white" hover-class="none" @click="searchClick">搜索</button>                    </view>                </view>                <view class="cu-bar bg-white search py-2" un-border-t="1 solid gray-2" v-if="pageNode.type === 2">                    <view class="search-form radius">                        <uni-datetime-picker type="datetime" v-model="searchForm.queryDate"/>                    </view>                    <view class="action">                        <button class="cu-btn bg-blue-5 text-white" hover-class="none" @click="searchClick">搜索</button>                    </view>                </view>            </view>        </template>        <!-- 数据列表 -->        <template v-for="(item, index) in dataList" :key="index">            <view class="bg-white hc-p hc-flex" un-border-b="1 solid gray-2" @click="itemClick(item)">                <view class="hc-flex mr-2" v-if="isDelete" @click.stop="checkClick(item)">                    <uni-icons type="checkbox-filled" size="26" color="#ee5b20" v-if="item.check"/>                    <uni-icons type="checkbox" size="26" color="#9a9a9a" v-else/>                </view>                <view class="hc-flex">                    <video class="h-100 w-100 b-rounded" :src="item.imageUrl" :controls="false" :show-center-play-btn="false" v-if="item.type === 1"/>                    <hc-img class="b-rounded" :src="item.imageUrl?.toString()?.split(',')[0]" width="50" height="50" v-if="item.type === 2"/>                </view>                <view class="relative flex-1 ml-3">                    <view class="text-30 text-black clip-2">{{item.title}}</view>                    <view class="text-24 mt-1 text-cut">{{item.textContent}}</view>                </view>            </view>        </template>        <template #bottom>            <hc-tabbars class="hc-paging-bottom-bar">                <view class="hc-flex" v-if="isDelete">                    <view class="hc-flex" @click="allCheckClick">                        <uni-icons type="checkbox-filled" size="24" color="#ee5b20" v-if="checkList.length === dataList.length"/>                        <uni-icons type="checkbox" size="24" color="#9a9a9a" v-else/>                        <text class="ml-1">全选</text>                    </view>                    <view class="flex-1 ml-4 text-gray-5 text-24">                        <text class="mr-1">已勾选</text>                        <text class="text-red-5">{{checkList.length}}</text>                        <text class="ml-1">条数据</text>                    </view>                    <button hover-class="none" class="cu-btn bg-red-5 text-white" @click="delCheckList">删除选中</button>                </view>                <button hover-class="none" class="cu-btn block bg-purple-8 text-white" @click="addFileData" v-else>新增声像文件</button>            </hc-tabbars>        </template>    </z-paging></template><script setup>import {ref} from "vue";import {onLoad} from '@dcloudio/uni-app'import {useAppStore} from "@/store";import mainApi from '~api/image/index';import {arrIndex, deepClone, getArrValue} from "js-fast-way";import {errorToast, showModal, successToast} from "@/utils/tools";//初始变量const store = useAppStore()const contractInfo = ref(store.contractInfo);const projectId = ref(store.projectId);const contractId = ref(store.contractId);//基础变量const pageRef = ref(null)const pageNode = ref({});const dataList = ref([])//页面启动onLoad(({node}) => {    pageNode.value = node ? JSON.parse(decodeURIComponent(node)) : {};})//条件搜索const searchClick = () => {    pageRef.value?.reload()}//获取数据const searchForm = ref({queryStr: ''})const getDataList = async (pageNo, pageSize) => {    const {id, fileType, type, treeId} = pageNode.value    if (!type || !id || !type || !fileType) {        errorToast('参数异常,请退出重试')        pageRef.value?.complete([]);        return false;    }    //树类型    const form = searchForm.value    if (type === 1 && treeId) {        delete form.queryDate        form.wbsIdsStr = treeId    }    if (type === 2) {        delete form.wbsIdsStr        delete form.queryStr    }    //获取数据    uni.showLoading({title: '获取数据中...', mask: true});    const { data } = await mainApi.getPageList({        ...form,        projectId: projectId.value,        contractId: contractId.value,        classifyId: id,        current: pageNo,        size: pageSize,        isApp: 1,    })    //处理数据    const res = getArrValue(data?.records)    pageRef.value?.complete(res);    uni.hideLoading();}//批量删除const isDelete = ref(false)const deleteTap = () => {    isDelete.value = !isDelete.value}//点击选中const checkList = ref([])const checkClick = (item) => {    const list = checkList.value    const index = arrIndex(list, 'id', item.id)    if (item.check) {        list.splice(index, 1)        item.check = false    } else {        item.check = true        list.push(item)    }    checkList.value = list}//全选const allCheckClick = () => {    const check = checkList.value, list = dataList.value    if (check.length === list.length) {        list.forEach(item => {            item.check = false        })        checkList.value = []    } else {        list.forEach(item => {            item.check = true        })        checkList.value = deepClone(list)    }}//列表项被点击const itemClick = (item) => {    if(isDelete.value) {        checkClick(item)    } else {        uni.navigateTo({            url: `/pages/image/info?id=${item.id}`        })    }}//删除选中数据const delCheckList = async () => {    if (checkList.value.length <= 0) {        errorToast('请选择要删除的数据')        return false    }    const res = await showModal({        title: '批量删除提醒',        content: '确定要删除选中的数据吗?',    })    if (!res) return false;    uni.showLoading({title: '批量删除中...', mask: true});    const ids = checkList.value.map(item => item.id)    const { error, code, msg } = await mainApi.removeImageclassifyFile({        ids: ids.join(',')    })    uni.hideLoading();    if (!error && code === 200) {        successToast('删除成功')        searchClick()    } else {        errorToast('删除失败: ' + msg)    }}//新增文件数据const addFileData = () => {    //准备跳转路由    const node = encodeURIComponent(JSON.stringify({        ...pageNode.value    }));    uni.navigateTo({        url: `/pages/image/form?node=${node}`    })}</script>
 |