diff --git a/src/compenents/left-menu/index.tsx b/src/compenents/left-menu/index.tsx index 4b3a579..0903301 100644 --- a/src/compenents/left-menu/index.tsx +++ b/src/compenents/left-menu/index.tsx @@ -46,6 +46,7 @@ const items = [ [ getItem("视频", "/videos", null, null, null, null), getItem("图片", "/images", null, null, null, null), + getItem("课件", "/courseware", null, null, null, null), ], null, null diff --git a/src/pages/resource/courseware/index.module.less b/src/pages/resource/courseware/index.module.less new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/resource/courseware/index.tsx b/src/pages/resource/courseware/index.tsx new file mode 100644 index 0000000..7ea4ac2 --- /dev/null +++ b/src/pages/resource/courseware/index.tsx @@ -0,0 +1,370 @@ +import { useEffect, useState } from "react"; +import { + Modal, + Table, + message, + Space, + Typography, + Input, + Select, + Button, +} from "antd"; +import type { MenuProps } from "antd"; +import { resource } from "../../../api"; +// import styles from "./index.module.less"; +import { useLocation } from "react-router-dom"; +import { DownOutlined, ExclamationCircleFilled } from "@ant-design/icons"; +import type { ColumnsType } from "antd/es/table"; +import { dateFormat } from "../../../utils/index"; +import { TreeCategory, DurationText, PerButton } from "../../../compenents"; + +const { confirm } = Modal; + +interface DataType { + id: React.Key; + name: string; + created_at: string; + disk: string; + number: number; +} + +const ResourceCoursewarePage = () => { + const result = new URLSearchParams(useLocation().search); + const [list, setList] = useState([]); + const [adminUsers, setAdminUsers] = useState({}); + const [existingTypes, setExistingTypes] = useState([]); + const [refresh, setRefresh] = useState(false); + const [page, setPage] = useState(1); + const [size, setSize] = useState(10); + const [total, setTotal] = useState(0); + const [loading, setLoading] = useState(true); + const [category_ids, setCategoryIds] = useState([]); + const [selectedRowKeys, setSelectedRowKeys] = useState([]); + const [type, setType] = useState("WORD,EXCE,PPT,PDF,TXT,RAR,ZIP"); + const [title, setTitle] = useState(""); + const [multiConfig, setMultiConfig] = useState(false); + const [selLabel, setLabel] = useState( + result.get("label") ? String(result.get("label")) : "全部课件" + ); + const [cateId, setCateId] = useState(Number(result.get("cid"))); + const [updateId, setUpdateId] = useState(0); + const [updateVisible, setUpdateVisible] = useState(false); + const types = [ + { label: "全部", value: "WORD,EXCE,PPT,PDF,TXT,RAR,ZIP" }, + { label: "WORD", value: "WORD" }, + { label: "EXCEL", value: "EXCE" }, + { label: "PPT", value: "PPT" }, + { label: "PDF", value: "PDF" }, + { label: "TXT", value: "TXT" }, + { label: "RAR", value: "RAR" }, + { label: "ZIP", value: "ZIP" }, + ]; + + useEffect(() => { + setCateId(Number(result.get("cid"))); + if (Number(result.get("cid"))) { + let arr = []; + arr.push(Number(result.get("cid"))); + setCategoryIds(arr); + } + }, [result.get("cid")]); + + // 加载课件列表 + useEffect(() => { + getList(); + }, [category_ids, refresh, page, size]); + + const getList = () => { + setLoading(true); + let categoryIds = category_ids.join(","); + resource + .resourceList(page, size, "", "", title, type, categoryIds) + .then((res: any) => { + setTotal(res.data.result.total); + setList(res.data.result.data); + setExistingTypes(res.data.existing_types); + setAdminUsers(res.data.admin_users); + setLoading(false); + }) + .catch((err: any) => { + console.log("错误,", err); + }); + }; + + const columns: ColumnsType = [ + { + title: "课件名称", + dataIndex: "name", + render: (text: string) => ( +
+ + {text} +
+ ), + }, + { + title: "课件格式", + dataIndex: "id", + width: 204, + render: (id: string) => {id}, + }, + { + title: "课件大小", + dataIndex: "size", + width: 204, + render: (size: number) => {(size / 1024 / 1024).toFixed(2)}M, + }, + { + title: "创建人", + dataIndex: "admin_id", + width: 204, + render: (text: number) => + JSON.stringify(adminUsers) !== "{}" && {adminUsers[text]}, + }, + { + title: "创建时间", + dataIndex: "created_at", + width: 204, + render: (text: string) => {dateFormat(text)}, + }, + { + title: "操作", + key: "action", + fixed: "right", + width: 180, + render: (_, record: any) => { + return ( + + +
+ +
+ +
+ ); + }, + }, + ]; + + const paginationProps = { + current: page, //当前页码 + pageSize: size, + total: total, // 总条数 + onChange: (page: number, pageSize: number) => + handlePageChange(page, pageSize), //改变页码的函数 + showSizeChanger: true, + }; + + const handlePageChange = (page: number, pageSize: number) => { + setPage(page); + setSize(pageSize); + }; + + const rowSelection = { + onChange: (selectedRowKeys: React.Key[], selectedRows: DataType[]) => { + setSelectedRowKeys(selectedRowKeys); + }, + }; + + // 重置列表 + const resetList = () => { + setPage(1); + setSize(10); + setList([]); + setSelectedRowKeys([]); + setType("WORD,EXCE,PPT,PDF,TXT,RAR,ZIP"); + setRefresh(!refresh); + }; + + // 删除课件 + const removeResource = (id: number) => { + if (id === 0) { + return; + } + confirm({ + title: "操作确认", + icon: , + content: "删除前请检查选中课件文件无关联课程,确认删除?", + centered: true, + okText: "确认", + cancelText: "取消", + onOk() { + resource.destroyResource(id).then(() => { + message.success("删除成功"); + resetList(); + }); + }, + onCancel() { + console.log("Cancel"); + }, + }); + }; + + // 批量删除课件 + const removeResourceMulti = () => { + if (selectedRowKeys.length === 0) { + return; + } + confirm({ + title: "操作确认", + icon: , + content: "删除前请检查选中课件文件无关联课程,确认删除?", + centered: true, + okText: "确认", + cancelText: "取消", + onOk() { + resource.destroyResourceMulti(selectedRowKeys).then(() => { + message.success("删除成功"); + resetList(); + }); + }, + onCancel() { + console.log("Cancel"); + }, + }); + }; + + const downLoadFile = (id: number) => {}; + + return ( + <> +
+
+ { + setPage(1); + setCategoryIds(keys); + if (typeof title === "string") { + setLabel(title); + } else { + setLabel(title.props.children[0]); + } + }} + /> +
+
+
+ 课件 | {selLabel} +
+
+
+ + +
+
+
+
+ 名称: + { + setTitle(e.target.value); + }} + allowClear + style={{ width: 160 }} + placeholder="请输入名称关键字" + /> +
+
+ 格式: +