| | |
| | | <div class="card-wrapper w-full h-full flex flex-col px-8 box-border"> |
| | | <div class="card-header flex justify-between items-center shrink-0"> |
| | | <div class="header-search flex items-center"> |
| | | <el-input v-model="searchText" placeholder="请输入搜索内容" :prefix-icon="Search" maxlength="20" /> |
| | | <el-input v-model="searchText" placeholder="请输入搜索内容" class="long-input" :prefix-icon="Search"/> |
| | | <el-select v-model="searchSubject" placeholder="请选择科目" class="ml-4 long-select" clearable> |
| | | <el-option v-for="item in subjectList" :key="item.id" :label="item.name" :value="item.id"/> |
| | | </el-select> |
| | | <el-select v-model="searchContentType" placeholder="请选择文件类型" class="ml-4 long-select" clearable> |
| | | <el-option |
| | | v-for="item in contentTypeList" |
| | | :key="item.value" |
| | | :label="item.name" |
| | | :value="item.value"> |
| | | </el-option> |
| | | </el-select> |
| | | <el-button type="primary" class="ml-4" @click="searchFile">搜索</el-button> |
| | | </div> |
| | | </div> |
| | |
| | | <template #default="scope"> |
| | | <div class="row-info"> |
| | | <div class="icon"> |
| | | <img :src="getIcon(scope.row.contentType)" class="width-img" /> |
| | | <img :src="getIcon(scope.row.contentType)" class="width-img"/> |
| | | </div> |
| | | <div class="label">{{ scope.row.introduction }}</div> |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="className" label="班级" align="center" /> |
| | | <el-table-column prop="typeName" label="科目" align="center" /> |
| | | <el-table-column prop="updateTime" label="上传时间" align="center" /> |
| | | <el-table-column prop="className" label="班级" align="center"/> |
| | | <el-table-column prop="typeName" label="科目" align="center"/> |
| | | <el-table-column prop="updateTime" label="上传时间" align="center"/> |
| | | <el-table-column> |
| | | <template #default="scope"> |
| | | <el-button link type="primary" @click.prevent="checkRow(scope.row)"> |
| | |
| | | |
| | | <div class="card-footer flex justify-center mb-7 shrink-0"> |
| | | <el-pagination background layout="prev, pager, next" :total="fileList.length" |
| | | :default-page-size="20" |
| | | :currentPage="currentIndex" |
| | | :hide-on-single-page="true" |
| | | @current-change="handleCurrentChange" /> |
| | | :default-page-size="20" |
| | | :currentPage="currentIndex" |
| | | :hide-on-single-page="true" |
| | | @current-change="handleCurrentChange"/> |
| | | </div> |
| | | </div> |
| | | </el-card> |
| | |
| | | <el-button type="danger" size="large" circle @click="closeViewer"> |
| | | <template #icon> |
| | | <el-icon :size="18"> |
| | | <Close /> |
| | | <Close/> |
| | | </el-icon> |
| | | </template> |
| | | </el-button> |
| | |
| | | <el-button type="danger" size="large" circle @click="closeViewer"> |
| | | <template #icon> |
| | | <el-icon :size="20"> |
| | | <Close /> |
| | | <Close/> |
| | | </el-icon> |
| | | </template> |
| | | </el-button> |
| | |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, onMounted, onBeforeUnmount } from 'vue'; |
| | | import { storeToRefs } from 'pinia'; |
| | | import { Close } from '@element-plus/icons-vue'; |
| | | import {ref, onMounted, onBeforeUnmount} from 'vue'; |
| | | import {storeToRefs} from 'pinia'; |
| | | import {Close} from '@element-plus/icons-vue'; |
| | | import NormalHeader from '@/components/NormalHeader/index.vue'; |
| | | import { Search } from '@element-plus/icons-vue'; |
| | | import { getFileList } from '@/api/modules/file.js'; |
| | | import {Search} from '@element-plus/icons-vue'; |
| | | import {getFileList} from '@/api/modules/file.js'; |
| | | import {getSubjectList} from '@/api/modules/subject.js'; |
| | | |
| | | import PDFViewer from '@/components/PDFViewer/index.vue'; |
| | | import VideoViewer from '@/components/VideoViewer/index.vue'; |
| | | |
| | | import { useUserStore } from '@/store/index.js'; |
| | | import {useUserStore} from '@/store/index.js'; |
| | | import useWebScoket from '@/hooks/useWebScoket.js'; |
| | | |
| | | const userStore = useUserStore(); |
| | | const { userInfo } = storeToRefs(userStore); |
| | | const { status, message, error, connect, disconnect, sendMessage } = useWebScoket({ |
| | | const {userInfo} = storeToRefs(userStore); |
| | | const {status, message, error, connect, disconnect, sendMessage} = useWebScoket({ |
| | | url: 'wss://42.193.1.25:8000/websocket/' + userInfo.value.id, |
| | | heartBeatData: 'ping' |
| | | }); |
| | |
| | | handle: (item) => { |
| | | console.log(item); |
| | | imageViewer.value = true; |
| | | imageList.value = ['/api/files/'+item.contentUrl.url]; |
| | | imageList.value = ['/api/files/' + item.contentUrl.url]; |
| | | resendMessage(); |
| | | } |
| | | }, |
| | |
| | | handle: (item) => { |
| | | console.log(item); |
| | | videoViewer.value = true; |
| | | videoUrl.value = ['/api/files/'+item.contentUrl.url]; |
| | | videoUrl.value = ['/api/files/' + item.contentUrl.url]; |
| | | resendMessage(); |
| | | } |
| | | }, |
| | |
| | | handle: (item) => { |
| | | console.log(item); |
| | | pdfViewer.value = true; |
| | | pdfFile.value = '/api/files/'+item.contentUrl.url; |
| | | pdfFile.value = '/api/files/' + item.contentUrl.url; |
| | | resendMessage(); |
| | | } |
| | | }, |
| | | }; |
| | | const searchText = ref(''); |
| | | const searchSubject = ref('') |
| | | const searchContentType = ref('') |
| | | |
| | | const loading = ref(false); |
| | | |
| | |
| | | const videoUrl = ref(''); |
| | | |
| | | const fileList = ref([]); |
| | | |
| | | const subjectList = ref([]); |
| | | const contentTypeList = ref([{ name: '视频', value: 'video' }, |
| | | { name: '图片', value: 'img' }, |
| | | { name: '音频', value: 'audio' }, |
| | | { name: 'PDF', value: 'pdf' }, |
| | | { name: 'EXCEL', value: 'excel' }, |
| | | { name: 'WORD', value: 'word' }, |
| | | { name: 'PPT', value: 'ppt' }]); |
| | | const currentIndex = ref(1); |
| | | |
| | | |
| | |
| | | |
| | | const getData = () => { |
| | | loading.value = true; |
| | | getFileList().then(res => { |
| | | getFileList({introduction: searchText.value, subjectId: searchSubject.value, contentType:searchContentType.value}).then(res => { |
| | | loading.value = false; |
| | | fileList.value = res.data; |
| | | }).catch(() => { |
| | |
| | | }; |
| | | getData(); |
| | | |
| | | const getSubject = () => { |
| | | loading.value = true; |
| | | getSubjectList().then(res => { |
| | | loading.value = false; |
| | | subjectList.value = res.data; |
| | | }).catch(() => { |
| | | loading.value = false; |
| | | }); |
| | | }; |
| | | getSubject(); |
| | | const resendMessage = () => { |
| | | if (time.value) { |
| | | clearInterval(time.value); |
| | | } |
| | | sendMessage({ id: userInfo.value.id, command: 'recordStudyTime' }); |
| | | sendMessage({id: userInfo.value.id, command: 'recordStudyTime'}); |
| | | time.value = setInterval(() => { |
| | | sendMessage({ id: userInfo.value.id, command: 'recordStudyTime' }); |
| | | sendMessage({id: userInfo.value.id, command: 'recordStudyTime'}); |
| | | }, 5000); |
| | | }; |
| | | |
| | |
| | | margin-right: 20px; |
| | | } |
| | | } |
| | | .long-input { |
| | | width: 200px; |
| | | } |
| | | |
| | | .long-select { |
| | | width: 200px; |
| | | } |
| | | .pdf-container { |
| | | width: 100%; |
| | | height: 100%; |