| <!-- | 
|  * @Author: 秦少卫 | 
|  * @Date: 2022-09-03 19:16:55 | 
|  * @LastEditors: June 1601745371@qq.com | 
|  * @LastEditTime: 2024-06-12 14:20:11 | 
|  * @Description: 导入模板 | 
| --> | 
|   | 
| <template> | 
|   <div> | 
|     <!-- 搜索组件 --> | 
|     <div class="search-box"> | 
|       <Dropdown @on-click="createType" placement="bottom-start" style="margin-right: 10px" transfer> | 
|         <Button type="primary" icon="md-add"></Button> | 
|         <template #list> | 
|           <DropdownMenu> | 
|             <DropdownItem name="file">新建设计</DropdownItem> | 
|             <DropdownItem name="fileType">新建文件夹</DropdownItem> | 
|           </DropdownMenu> | 
|         </template> | 
|       </Dropdown> | 
|   | 
|       <Input | 
|         class="input" | 
|         placeholder="请输入关键词" | 
|         v-model="filters.name.$contains" | 
|         search | 
|         :disabled="pageLoading" | 
|         @on-search="startGetList" | 
|       /> | 
|     </div> | 
|   | 
|     <!-- 面包屑导航 --> | 
|     <Breadcrumb> | 
|       <BreadcrumbItem | 
|         @click="toFile(item.parentId, i)" | 
|         :key="item.id" | 
|         v-for="(item, i) in filePath" | 
|       > | 
|         {{ item.name }} | 
|       </BreadcrumbItem> | 
|     </Breadcrumb> | 
|   | 
|     <!-- 列表 --> | 
|     <div style="height: calc(100vh - 160px)" id="myFileTemplBox"> | 
|       <Scroll | 
|         key="myFileTemplBox" | 
|         v-if="showScroll" | 
|         :on-reach-bottom="nextPage" | 
|         :height="scrollHeight" | 
|         :distance-to-edge="[-1, -1]" | 
|       > | 
|         <!-- 列表 --> | 
|         <div v-for="info in pageData" :key="info.name" class="item"> | 
|           <!-- 文件夹样式 --> | 
|           <fileType | 
|             v-if="info.type === 'fileType'" | 
|             :itemId="info.id" | 
|             :name="info.name" | 
|             @select="() => joinFileTyper(info.id, info.name)" | 
|             @change="startGetList" | 
|           ></fileType> | 
|   | 
|           <file | 
|             v-else | 
|             :src="info.src" | 
|             :json="info.json" | 
|             :previewSrc="info.previewSrc" | 
|             :itemId="info.id" | 
|             :name="info.name" | 
|             @change="startGetList" | 
|           ></file> | 
|         </div> | 
|         <Spin size="large" fix :show="pageLoading"></Spin> | 
|         <Divider plain v-if="isDownBottom">已经到底了</Divider> | 
|       </Scroll> | 
|     </div> | 
|   | 
|     <!-- 创建设计 --> | 
|     <modalSzie | 
|       :title="$t('importFiles.createDesign.title')" | 
|       ref="modalSizeRef" | 
|       @set="customSizeCreate" | 
|     ></modalSzie> | 
|   </div> | 
| </template> | 
|   | 
| <script setup name="ImportTmpl"> | 
| import { Input } from 'view-ui-plus'; | 
| import { Spin, Modal, Message } from 'view-ui-plus'; | 
|   | 
| // 组件 | 
| import fileType from './components/fileType.vue'; | 
| import file from './components/file.vue'; | 
| import modalSzie from '@/components/common/modalSzie'; | 
|   | 
| // API | 
| import { getTmplList, getFileTypeTree } from '@/api/user'; | 
| // 素材与分页 | 
| import useMaterial from '@/hooks/useMaterial'; | 
| import usePageList, { getMaterialInfoUrl, getMaterialPreviewUrl } from '@/hooks/usePageList'; | 
| // 路由 | 
| import { useRoute } from 'vue-router'; | 
| const route = useRoute(); | 
|   | 
| // 用户素材API操作 | 
| const { createdFileType, createTmpl } = useMaterial(); | 
|   | 
| // 检索条件 | 
| const filters = reactive({ | 
|   name: { | 
|     $contains: '', | 
|   }, | 
|   parentId: { | 
|     $eq: '', | 
|     filterEmpty: false, | 
|   }, | 
| }); | 
|   | 
| const sort = ['type:desc']; | 
|   | 
| // 分页格式化 | 
| const formatData = (data) => { | 
|   return data.map((item) => { | 
|     return { | 
|       id: item.id, | 
|       name: item.attributes.name, | 
|       type: item.attributes.type || 'file', | 
|       desc: item.attributes.desc, | 
|       json: item.attributes.json, | 
|       src: getMaterialInfoUrl(item.attributes.img), | 
|       previewSrc: getMaterialPreviewUrl(item.attributes.img), | 
|     }; | 
|   }); | 
| }; | 
| // 通用分页 | 
| const { | 
|   pageData, | 
|   showScroll, | 
|   scrollHeight, | 
|   isDownBottom, | 
|   pageLoading, | 
|   startPage, | 
|   startGetList, | 
|   nextPage, | 
| } = usePageList({ | 
|   el: '#myFileTemplBox', | 
|   apiClient: getTmplList, | 
|   filters, | 
|   sort, | 
|   fields: ['name', 'parentId', 'type', 'externalId'], | 
|   formatData, | 
| }); | 
|   | 
| onMounted(async () => { | 
|   await getFileTypeTreeData(); | 
|   startPage(); | 
| }); | 
|   | 
| const fileTypeName = ref(''); | 
| const modalSizeRef = ref(null); | 
| // 新建文件 | 
| const createType = (type) => { | 
|   if (type === 'fileType') { | 
|     fileTypeName.value = ''; | 
|     Modal.confirm({ | 
|       title: '新建文件夹', | 
|       render: (h) => { | 
|         return h(Input, { | 
|           size: 'large', | 
|           modelValue: fileTypeName, | 
|           autofocus: true, | 
|           placeholder: '请输入文件夹名称', | 
|         }); | 
|       }, | 
|       onOk: async () => { | 
|         if (fileTypeName.value === '') { | 
|           Message.warning('文件夹名称不能为空'); | 
|           return; | 
|         } | 
|         await createdFileType(fileTypeName.value, filters.parentId.$eq); | 
|         startGetList(); | 
|       }, | 
|     }); | 
|   } else { | 
|     modalSizeRef.value.showSetSize(); | 
|   } | 
| }; | 
| const customSizeCreate = async (w, h) => { | 
|   await createTmpl(w, h, filters.parentId.$eq); | 
|   startGetList(); | 
| }; | 
|   | 
| const filePath = ref([ | 
|   { | 
|     name: '全部', | 
|     parentId: '', | 
|   }, | 
| ]); | 
|   | 
| const getFileTypeTreeData = async () => { | 
|   if (route?.query?.id) { | 
|     const res = await getFileTypeTree({ | 
|       id: route.query.id, | 
|     }); | 
|     filePath.value = res.data.data; | 
|     const last = res.data.data[res.data.data.length - 1]; | 
|     filters.parentId.$eq = last.parentId; | 
|   } | 
| }; | 
| // 进入文件夹 | 
| const joinFileTyper = (id, name) => { | 
|   filters.parentId.$eq = String(id); | 
|   filePath.value.push({ | 
|     name: name, | 
|     parentId: id, | 
|   }); | 
|   startGetList(); | 
| }; | 
|   | 
| // 面包屑跳转文件夹 | 
| const toFile = (id, i) => { | 
|   const isLast = i === filePath.value.length - 1; | 
|   if (!isLast) { | 
|     filters.parentId.$eq = id; | 
|     filePath.value = filePath.value.slice(0, i + 1); | 
|     startGetList(); | 
|   } | 
| }; | 
| </script> | 
|   | 
| <style scoped lang="less"> | 
| .search-box { | 
|   padding-bottom: 10px; | 
|   display: flex; | 
| } | 
|   | 
| :deep(.ivu-scroll-content) { | 
|   display: flex; | 
|   flex-wrap: wrap; | 
|   justify-content: space-between; | 
|   padding-right: 10px; | 
| } | 
| .item { | 
|   margin-bottom: 10px; | 
| } | 
| :deep(.ivu-breadcrumb-item-link) { | 
|   cursor: pointer; | 
|   &:hover { | 
|     color: #57a3f3; | 
|   } | 
| } | 
| </style> |