|
|
@@ -1,16 +1,441 @@
|
|
|
<template>
|
|
|
- <div class="page-container">
|
|
|
- <!-- 页面内容将放在这里 -->
|
|
|
- <span>我的资源</span>
|
|
|
- </div>
|
|
|
+ <a-card>
|
|
|
+ <!-- 标签页 -->
|
|
|
+ <a-tabs v-model:activeKey="activeKey" @change="tabChange">
|
|
|
+ <a-tab-pane key="unpublished" tab="未发布"></a-tab-pane>
|
|
|
+ <a-tab-pane key="pending" tab="待审核"></a-tab-pane>
|
|
|
+ <a-tab-pane key="published" tab="已发布"></a-tab-pane>
|
|
|
+ <a-tab-pane key="recycle" tab="回收站"></a-tab-pane>
|
|
|
+ </a-tabs>
|
|
|
+
|
|
|
+ <!-- 搜索和操作区域 -->
|
|
|
+ <a-row :gutter="16" style="margin-bottom: 16px">
|
|
|
+ <a-col :span="8">
|
|
|
+ <a-input v-model:value="searchValue" placeholder="请输入资源名称" style="width: 200px" />
|
|
|
+ <a-button type="primary" style="margin-left: 8px" @click="handleSearch">查询</a-button>
|
|
|
+ <a-button style="margin-left: 8px" @click="handleReset">重置</a-button>
|
|
|
+ </a-col>
|
|
|
+ <a-col :span="16" style="text-align: right">
|
|
|
+ <a-button type="primary" @click="showUploadModal">+ 上传资源</a-button>
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+
|
|
|
+ <!-- 表格 -->
|
|
|
+ <a-table
|
|
|
+ :columns="currentColumns"
|
|
|
+ :data-source="currentDataSource"
|
|
|
+ :pagination="false"
|
|
|
+ :row-key="(record) => record.id"
|
|
|
+ >
|
|
|
+ <template #bodyCell="{ column, record }">
|
|
|
+ <!-- 状态列 -->
|
|
|
+ <template v-if="column.key === 'status'">
|
|
|
+ <span v-if="record.status === 'processing'">
|
|
|
+ <a-badge status="processing" text="处理中" />
|
|
|
+ </span>
|
|
|
+ <span v-else-if="record.status === 'uploaded'">
|
|
|
+ <a-badge status="success" text="已上传" />
|
|
|
+ </span>
|
|
|
+ <span v-else-if="record.status === 'pending'">
|
|
|
+ <a-badge status="default" text="待审核" />
|
|
|
+ </span>
|
|
|
+ <span v-else-if="record.status === 'published'">
|
|
|
+ <a-badge status="success" text="已发布" />
|
|
|
+ </span>
|
|
|
+ <span v-else-if="record.status === 'deleted'">
|
|
|
+ <a-badge status="error" text="已删除" />
|
|
|
+ </span>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <!-- 操作列 -->
|
|
|
+ <template v-else-if="column.key === 'action'">
|
|
|
+ <div class="editable-cell">
|
|
|
+ <template v-if="activeKey === 'unpublished'">
|
|
|
+ <a @click="handlePublish(record)">发布</a>
|
|
|
+ <a-divider type="vertical" />
|
|
|
+ <a-dropdown>
|
|
|
+ <a class="ant-dropdown-link"> 更多 <DownOutlined /> </a>
|
|
|
+ <template #overlay>
|
|
|
+ <a-menu>
|
|
|
+ <a-menu-item>
|
|
|
+ <a href="javascript:;">播放</a>
|
|
|
+ </a-menu-item>
|
|
|
+ <a-menu-item>
|
|
|
+ <a href="javascript:;">下载</a>
|
|
|
+ </a-menu-item>
|
|
|
+ <a-menu-item>
|
|
|
+ <a href="javascript:;">编辑</a>
|
|
|
+ </a-menu-item>
|
|
|
+ <a-menu-item>
|
|
|
+ <a href="javascript:;">删除</a>
|
|
|
+ </a-menu-item>
|
|
|
+ </a-menu>
|
|
|
+ </template>
|
|
|
+ </a-dropdown>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template v-else-if="activeKey === 'pending'">
|
|
|
+ <a @click="handleAudit(record)">审核</a>
|
|
|
+ <a-divider type="vertical" />
|
|
|
+ <a-dropdown>
|
|
|
+ <a class="ant-dropdown-link"> 更多 <DownOutlined /> </a>
|
|
|
+ <template #overlay>
|
|
|
+ <a-menu>
|
|
|
+ <a-menu-item>
|
|
|
+ <a href="javascript:;">查看</a>
|
|
|
+ </a-menu-item>
|
|
|
+ </a-menu>
|
|
|
+ </template>
|
|
|
+ </a-dropdown>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template v-else-if="activeKey === 'published'">
|
|
|
+ <a @click="handlePermission(record)">权限</a>
|
|
|
+ <a-divider type="vertical" />
|
|
|
+ <a-dropdown>
|
|
|
+ <a class="ant-dropdown-link"> 更多 <DownOutlined /> </a>
|
|
|
+ <template #overlay>
|
|
|
+ <a-menu>
|
|
|
+ <a-menu-item>
|
|
|
+ <a href="javascript:;">查看</a>
|
|
|
+ </a-menu-item>
|
|
|
+ <a-menu-item>
|
|
|
+ <a href="javascript:;">编辑</a>
|
|
|
+ </a-menu-item>
|
|
|
+ <a-menu-item>
|
|
|
+ <a href="javascript:;">删除</a>
|
|
|
+ </a-menu-item>
|
|
|
+ </a-menu>
|
|
|
+ </template>
|
|
|
+ </a-dropdown>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template v-else-if="activeKey === 'recycle'">
|
|
|
+ <a @click="handleRestore(record)">恢复</a>
|
|
|
+ <a-divider type="vertical" />
|
|
|
+ <a-dropdown>
|
|
|
+ <a class="ant-dropdown-link"> 更多 <DownOutlined /> </a>
|
|
|
+ <template #overlay>
|
|
|
+ <a-menu>
|
|
|
+ <a-menu-item>
|
|
|
+ <a href="javascript:;">彻底删除</a>
|
|
|
+ </a-menu-item>
|
|
|
+ </a-menu>
|
|
|
+ </template>
|
|
|
+ </a-dropdown>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </template>
|
|
|
+ </a-table>
|
|
|
+
|
|
|
+ <!-- 上传资源模态框 -->
|
|
|
+ <a-modal v-model:visible="uploadModalVisible" title="上传资源" @ok="handleUploadOk" @cancel="handleUploadCancel">
|
|
|
+ <a-upload
|
|
|
+ :multiple="true"
|
|
|
+ :before-upload="beforeUpload"
|
|
|
+ :file-list="fileList"
|
|
|
+ :remove="handleRemove"
|
|
|
+ :on-change="handleChange"
|
|
|
+ >
|
|
|
+ <div class="upload-area">
|
|
|
+ <a-icon type="cloud-upload" style="font-size: 60px; color: #3ca9f5"></a-icon>
|
|
|
+ <p>将文件拖到此处或点击上传</p>
|
|
|
+ <p>按住Ctrl可同时多选,支持上传PPT/word/excel/pdf/mp4/zip/rar,单个文件不能超过2G</p>
|
|
|
+ </div>
|
|
|
+ </a-upload>
|
|
|
+
|
|
|
+ <!-- 文件上传状态展示 -->
|
|
|
+ <ul v-if="fileList.length">
|
|
|
+ <li v-for="(file, index) in fileList" :key="index" class="file-item">
|
|
|
+ <span>{{ file.name }}</span>
|
|
|
+ <a-progress :percent="file.percent || 0" />
|
|
|
+ <span v-if="file.status === 'done'">已完成</span>
|
|
|
+ <span v-else-if="file.status === 'error'">上传失败</span>
|
|
|
+ <span v-else-if="file.status === 'uploading'">上传中...</span>
|
|
|
+ </li>
|
|
|
+ </ul>
|
|
|
+ </a-modal>
|
|
|
+ <releaseModal v-if="releaseVisible" @close="releaseVisible = false"></releaseModal>
|
|
|
+ </a-card>
|
|
|
</template>
|
|
|
|
|
|
-<script setup>
|
|
|
- // 这里可以引入所需的逻辑和组件
|
|
|
-</script>
|
|
|
+ <script setup>
|
|
|
+import { ref } from 'vue'
|
|
|
+import { DownOutlined } from '@ant-design/icons-vue'
|
|
|
+import { Modal, Upload } from 'ant-design-vue'
|
|
|
+import releaseModal from './releaseModal.vue'
|
|
|
+// 数据源
|
|
|
+const dataSource = ref([
|
|
|
+ {
|
|
|
+ id: 1,
|
|
|
+ name: '资源名称资源名称',
|
|
|
+ format: 'mp4',
|
|
|
+ uploadTime: '2020-11-25 23:26:08',
|
|
|
+ status: 'processing', // processing, uploaded, pending, published, deleted
|
|
|
+ department: '航空理论系',
|
|
|
+ major: '商务服务',
|
|
|
+ courseType: '选修'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 2,
|
|
|
+ name: '资源名称资源名称',
|
|
|
+ format: 'mp4',
|
|
|
+ uploadTime: '2020-11-25 23:26:08',
|
|
|
+ status: 'pending', // processing, uploaded, pending, published, deleted
|
|
|
+ department: '航空理论系1',
|
|
|
+ major: '商务服务',
|
|
|
+ courseType: '选修'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 3,
|
|
|
+ name: '资源名称资源名称',
|
|
|
+ format: 'mp4',
|
|
|
+ uploadTime: '2020-11-25 23:26:08',
|
|
|
+ status: 'published', // processing, uploaded, pending, published, deleted
|
|
|
+ department: '航空理论系2',
|
|
|
+ major: '商务服务',
|
|
|
+ courseType: '选修'
|
|
|
+ }
|
|
|
+])
|
|
|
+
|
|
|
+// 当前激活的标签页
|
|
|
+const activeKey = ref('unpublished')
|
|
|
+//发布按钮状态
|
|
|
+const releaseVisible = ref(false)
|
|
|
+
|
|
|
+// 搜索值
|
|
|
+const searchValue = ref('')
|
|
|
|
|
|
-<style scoped>
|
|
|
- .page-container {
|
|
|
- padding: 20px;
|
|
|
+// 列定义
|
|
|
+const columnsUnpublished = [
|
|
|
+ {
|
|
|
+ title: '编号',
|
|
|
+ dataIndex: 'id',
|
|
|
+ key: 'id'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '资源名称',
|
|
|
+ dataIndex: 'name',
|
|
|
+ key: 'name'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '课件格式',
|
|
|
+ dataIndex: 'format',
|
|
|
+ key: 'format'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '上传时间',
|
|
|
+ dataIndex: 'uploadTime',
|
|
|
+ key: 'uploadTime'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '状态',
|
|
|
+ key: 'status'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '操作',
|
|
|
+ key: 'action'
|
|
|
}
|
|
|
+]
|
|
|
+
|
|
|
+const columnsPending = [
|
|
|
+ {
|
|
|
+ title: '编号',
|
|
|
+ dataIndex: 'id',
|
|
|
+ key: 'id'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '资源名称',
|
|
|
+ dataIndex: 'name',
|
|
|
+ key: 'name'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '所属院系',
|
|
|
+ dataIndex: 'department',
|
|
|
+ key: 'department'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '所属专业',
|
|
|
+ dataIndex: 'major',
|
|
|
+ key: 'major'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '课程类型',
|
|
|
+ dataIndex: 'courseType',
|
|
|
+ key: 'courseType'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '课件格式',
|
|
|
+ dataIndex: 'format',
|
|
|
+ key: 'format'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '上传时间',
|
|
|
+ dataIndex: 'uploadTime',
|
|
|
+ key: 'uploadTime'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '状态',
|
|
|
+ key: 'status'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '操作',
|
|
|
+ key: 'action'
|
|
|
+ }
|
|
|
+]
|
|
|
+
|
|
|
+const columnsPublished = [...columnsPending]
|
|
|
+const columnsRecycle = [...columnsPending]
|
|
|
+
|
|
|
+const currentColumns = computed(() => {
|
|
|
+ switch (activeKey.value) {
|
|
|
+ case 'unpublished':
|
|
|
+ return columnsUnpublished
|
|
|
+ case 'pending':
|
|
|
+ return columnsPending
|
|
|
+ case 'published':
|
|
|
+ return columnsPublished
|
|
|
+ case 'recycle':
|
|
|
+ return columnsRecycle
|
|
|
+ default:
|
|
|
+ return []
|
|
|
+ }
|
|
|
+})
|
|
|
+
|
|
|
+const currentDataSource = computed(() => {
|
|
|
+ return dataSource.value.filter((item) => {
|
|
|
+ if (activeKey.value === 'unpublished') {
|
|
|
+ return ['processing', 'uploaded'].includes(item.status)
|
|
|
+ } else if (activeKey.value === 'pending') {
|
|
|
+ return item.status === 'pending'
|
|
|
+ } else if (activeKey.value === 'published') {
|
|
|
+ return item.status === 'published'
|
|
|
+ } else if (activeKey.value === 'recycle') {
|
|
|
+ return item.status === 'deleted'
|
|
|
+ }
|
|
|
+ return false
|
|
|
+ })
|
|
|
+})
|
|
|
+
|
|
|
+// 方法
|
|
|
+const handleSearch = () => {
|
|
|
+ console.log('Search:', searchValue.value)
|
|
|
+}
|
|
|
+
|
|
|
+const handleReset = () => {
|
|
|
+ searchValue.value = ''
|
|
|
+}
|
|
|
+const tabChange = () => {
|
|
|
+ // dataSource.value = []
|
|
|
+}
|
|
|
+
|
|
|
+const handleUpload = () => {
|
|
|
+ console.log('Upload Resource')
|
|
|
+}
|
|
|
+
|
|
|
+const handlePublish = (record) => {
|
|
|
+ console.log('Publish:', record)
|
|
|
+ releaseVisible.value = true
|
|
|
+}
|
|
|
+
|
|
|
+const handleAudit = (record) => {
|
|
|
+ console.log('Audit:', record)
|
|
|
+}
|
|
|
+
|
|
|
+const handlePermission = (record) => {
|
|
|
+ console.log('Permission:', record)
|
|
|
+}
|
|
|
+
|
|
|
+const handleRestore = (record) => {
|
|
|
+ console.log('Restore:', record)
|
|
|
+}
|
|
|
+
|
|
|
+// 上传资源模态框
|
|
|
+const uploadModalVisible = ref(false)
|
|
|
+
|
|
|
+// 文件列表
|
|
|
+const fileList = ref([])
|
|
|
+
|
|
|
+// 显示上传模态框
|
|
|
+const showUploadModal = () => {
|
|
|
+ uploadModalVisible.value = true
|
|
|
+}
|
|
|
+
|
|
|
+// 关闭模态框
|
|
|
+const handleUploadCancel = () => {
|
|
|
+ uploadModalVisible.value = false
|
|
|
+ fileList.value = []
|
|
|
+}
|
|
|
+
|
|
|
+// 确认上传
|
|
|
+const handleUploadOk = () => {
|
|
|
+ // 这里可以添加实际的上传逻辑
|
|
|
+ console.log('Upload confirmed:', fileList.value)
|
|
|
+ uploadModalVisible.value = false
|
|
|
+ fileList.value = []
|
|
|
+}
|
|
|
+
|
|
|
+// 上传前的钩子函数
|
|
|
+const beforeUpload = (file) => {
|
|
|
+ const isLt2G = file.size / 1024 / 1024 / 1024 < 2
|
|
|
+ if (!isLt2G) {
|
|
|
+ Modal.error({ content: '文件大小不能超过 2GB!' })
|
|
|
+ }
|
|
|
+ return isLt2G
|
|
|
+}
|
|
|
+
|
|
|
+// 移除文件
|
|
|
+const handleRemove = (file) => {
|
|
|
+ const index = fileList.value.indexOf(file)
|
|
|
+ const newFileList = fileList.value.slice()
|
|
|
+ newFileList.splice(index, 1)
|
|
|
+ fileList.value = newFileList
|
|
|
+}
|
|
|
+
|
|
|
+// 文件状态改变时的处理函数
|
|
|
+const handleChange = ({ file, fileList: newFileList }) => {
|
|
|
+ fileList.value = newFileList
|
|
|
+
|
|
|
+ if (file.status === 'uploading') {
|
|
|
+ file.percent = 0
|
|
|
+ }
|
|
|
+
|
|
|
+ if (file.status === 'done') {
|
|
|
+ Modal.success({ content: '文件上传成功' })
|
|
|
+ } else if (file.status === 'error') {
|
|
|
+ Modal.error({ content: '文件上传失败' })
|
|
|
+ }
|
|
|
+}
|
|
|
+</script>
|
|
|
+
|
|
|
+ <style scoped>
|
|
|
+.editable-cell {
|
|
|
+ position: relative;
|
|
|
+}
|
|
|
+
|
|
|
+.ant-dropdown-link {
|
|
|
+ margin-left: 8px;
|
|
|
+}
|
|
|
+
|
|
|
+.upload-area {
|
|
|
+ border: 2px dashed #3ca9f5;
|
|
|
+ padding: 40px;
|
|
|
+ text-align: center;
|
|
|
+}
|
|
|
+
|
|
|
+.upload-area p {
|
|
|
+ margin: 10px 0;
|
|
|
+}
|
|
|
+
|
|
|
+.file-item {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ margin: 10px 0;
|
|
|
+}
|
|
|
+
|
|
|
+.file-item .ant-progress {
|
|
|
+ flex: 1;
|
|
|
+ margin: 0 10px;
|
|
|
+}
|
|
|
</style>
|