view.vue 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. <template>
  2. <z-paging ref="pageRef" v-model="dataList" @query="getDataList">
  3. <template #top>
  4. <view class="hc-paging-top-bar mb-1">
  5. <hc-nav-back-bar ui="top" title="声像文件">
  6. <text class="text-26" :class="isDelete?'':'text-red-4'" @click="deleteTap" v-if="dataList.length > 0">
  7. {{isDelete? '取消' : '删除'}}
  8. </text>
  9. </hc-nav-back-bar>
  10. <view class="cu-bar bg-white search py-2" un-border-t="1 solid gray-2" v-if="pageNode.type === 1">
  11. <view class="search-form radius">
  12. <text class="cuIcon-search"/>
  13. <input v-model="searchForm.queryStr" :adjust-position="false" type="text" placeholder="根据题名,名称或拍摄者搜索" confirm-type="search"/>
  14. </view>
  15. <view class="action">
  16. <button class="cu-btn bg-blue-5 text-white" hover-class="none" @click="searchClick">搜索</button>
  17. </view>
  18. </view>
  19. <view class="cu-bar bg-white search py-2" un-border-t="1 solid gray-2" v-if="pageNode.type === 2">
  20. <view class="search-form radius">
  21. <uni-datetime-picker type="datetime" v-model="searchForm.queryDate"/>
  22. </view>
  23. <view class="action">
  24. <button class="cu-btn bg-blue-5 text-white" hover-class="none" @click="searchClick">搜索</button>
  25. </view>
  26. </view>
  27. </view>
  28. </template>
  29. <!-- 数据列表 -->
  30. <template v-for="(item, index) in dataList" :key="index">
  31. <view class="bg-white hc-p hc-flex" un-border-b="1 solid gray-2" @click="itemClick(item)">
  32. <view class="hc-flex mr-2" v-if="isDelete" @click.stop="checkClick(item)">
  33. <uni-icons type="checkbox-filled" size="26" color="#ee5b20" v-if="item.check"/>
  34. <uni-icons type="checkbox" size="26" color="#9a9a9a" v-else/>
  35. </view>
  36. <view class="hc-flex">
  37. <video class="h-100 w-100 b-rounded" :src="item.imageUrl" :controls="false" :show-center-play-btn="false" v-if="item.type === 1"/>
  38. <hc-img class="b-rounded" :src="item.imageUrl?.toString()?.split(',')[0]" width="50" height="50" v-if="item.type === 2"/>
  39. </view>
  40. <view class="relative flex-1 ml-3">
  41. <view class="text-30 text-black clip-2">{{item.title}}</view>
  42. <view class="text-24 mt-1 text-cut">{{item.textContent}}</view>
  43. </view>
  44. </view>
  45. </template>
  46. <template #bottom>
  47. <hc-tabbars class="hc-paging-bottom-bar">
  48. <view class="hc-flex" v-if="isDelete">
  49. <view class="hc-flex" @click="allCheckClick">
  50. <uni-icons type="checkbox-filled" size="24" color="#ee5b20" v-if="checkList.length === dataList.length"/>
  51. <uni-icons type="checkbox" size="24" color="#9a9a9a" v-else/>
  52. <text class="ml-1">全选</text>
  53. </view>
  54. <view class="flex-1 ml-4 text-gray-5 text-24">
  55. <text class="mr-1">已勾选</text>
  56. <text class="text-red-5">{{checkList.length}}</text>
  57. <text class="ml-1">条数据</text>
  58. </view>
  59. <button hover-class="none" class="cu-btn bg-red-5 text-white" @click="delCheckList">删除选中</button>
  60. </view>
  61. <button hover-class="none" class="cu-btn block bg-purple-8 text-white" @click="addFileData" v-else>新增声像文件</button>
  62. </hc-tabbars>
  63. </template>
  64. </z-paging>
  65. </template>
  66. <script setup>
  67. import {ref} from "vue";
  68. import {onLoad} from '@dcloudio/uni-app'
  69. import {useAppStore} from "@/store";
  70. import mainApi from '~api/image/index';
  71. import {arrIndex, deepClone, getArrValue} from "js-fast-way";
  72. import {errorToast, showModal, successToast} from "@/utils/tools";
  73. //初始变量
  74. const store = useAppStore()
  75. const contractInfo = ref(store.contractInfo);
  76. const projectId = ref(store.projectId);
  77. const contractId = ref(store.contractId);
  78. //基础变量
  79. const pageRef = ref(null)
  80. const pageNode = ref({});
  81. const dataList = ref([])
  82. //页面启动
  83. onLoad(({node}) => {
  84. pageNode.value = node ? JSON.parse(decodeURIComponent(node)) : {};
  85. })
  86. //条件搜索
  87. const searchClick = () => {
  88. pageRef.value?.reload()
  89. }
  90. //获取数据
  91. const searchForm = ref({queryStr: ''})
  92. const getDataList = async (pageNo, pageSize) => {
  93. const {id, fileType, type, treeId} = pageNode.value
  94. if (!type || !id || !type || !fileType) {
  95. errorToast('参数异常,请退出重试')
  96. pageRef.value?.complete([]);
  97. return false;
  98. }
  99. //树类型
  100. const form = searchForm.value
  101. if (type === 1 && treeId) {
  102. delete form.queryDate
  103. form.wbsIdsStr = treeId
  104. }
  105. if (type === 2) {
  106. delete form.wbsIdsStr
  107. delete form.queryStr
  108. }
  109. //获取数据
  110. uni.showLoading({title: '获取数据中...', mask: true});
  111. const { data } = await mainApi.getPageList({
  112. ...form,
  113. projectId: projectId.value,
  114. contractId: contractId.value,
  115. classifyId: id,
  116. current: pageNo,
  117. size: pageSize,
  118. isApp: 1,
  119. })
  120. //处理数据
  121. const res = getArrValue(data?.records)
  122. pageRef.value?.complete(res);
  123. uni.hideLoading();
  124. }
  125. //批量删除
  126. const isDelete = ref(false)
  127. const deleteTap = () => {
  128. isDelete.value = !isDelete.value
  129. }
  130. //点击选中
  131. const checkList = ref([])
  132. const checkClick = (item) => {
  133. const list = checkList.value
  134. const index = arrIndex(list, 'id', item.id)
  135. if (item.check) {
  136. list.splice(index, 1)
  137. item.check = false
  138. } else {
  139. item.check = true
  140. list.push(item)
  141. }
  142. checkList.value = list
  143. }
  144. //全选
  145. const allCheckClick = () => {
  146. const check = checkList.value, list = dataList.value
  147. if (check.length === list.length) {
  148. list.forEach(item => {
  149. item.check = false
  150. })
  151. checkList.value = []
  152. } else {
  153. list.forEach(item => {
  154. item.check = true
  155. })
  156. checkList.value = deepClone(list)
  157. }
  158. }
  159. //列表项被点击
  160. const itemClick = (item) => {
  161. if(isDelete.value) {
  162. checkClick(item)
  163. } else {
  164. uni.navigateTo({
  165. url: `/pages/image/info?id=${item.id}`
  166. })
  167. }
  168. }
  169. //删除选中数据
  170. const delCheckList = async () => {
  171. if (checkList.value.length <= 0) {
  172. errorToast('请选择要删除的数据')
  173. return false
  174. }
  175. const res = await showModal({
  176. title: '批量删除提醒',
  177. content: '确定要删除选中的数据吗?',
  178. })
  179. if (!res) return false;
  180. uni.showLoading({title: '批量删除中...', mask: true});
  181. const ids = checkList.value.map(item => item.id)
  182. const { error, code, msg } = await mainApi.removeImageclassifyFile({
  183. ids: ids.join(',')
  184. })
  185. uni.hideLoading();
  186. if (!error && code === 200) {
  187. successToast('删除成功')
  188. searchClick()
  189. } else {
  190. errorToast('删除失败: ' + msg)
  191. }
  192. }
  193. //新增文件数据
  194. const addFileData = () => {
  195. //准备跳转路由
  196. const node = encodeURIComponent(JSON.stringify({
  197. ...pageNode.value
  198. }));
  199. uni.navigateTo({
  200. url: `/pages/image/form?node=${node}`
  201. })
  202. }
  203. </script>