From fc98702deb60b627b585672ca230c09f4bcbaa1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BA=E7=8B=A8?= <18119604035@163.com> Date: Mon, 8 May 2023 10:57:03 +0800 Subject: [PATCH 1/9] =?UTF-8?q?=E7=99=BB=E5=BD=95=E8=B7=AF=E7=94=B1?= =?UTF-8?q?=E5=AE=88=E5=8D=AB=E7=BB=84=E4=BB=B6=E4=B8=80=E7=BA=A7=E5=AD=A6?= =?UTF-8?q?=E4=B9=A0=E8=BF=9B=E5=BA=A6=E6=95=B4=E6=95=B0=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/compenents/private-route/index.tsx | 12 ++++++++ src/pages/course/user.tsx | 2 +- src/routes/index.tsx | 38 +++++++++++++++----------- 3 files changed, 35 insertions(+), 17 deletions(-) create mode 100644 src/compenents/private-route/index.tsx diff --git a/src/compenents/private-route/index.tsx b/src/compenents/private-route/index.tsx new file mode 100644 index 0000000..75af9ac --- /dev/null +++ b/src/compenents/private-route/index.tsx @@ -0,0 +1,12 @@ +import React from "react"; +import { getToken } from "../../utils/index"; +import { Navigate } from "react-router-dom"; + +interface PropInterface { + Component: any; +} + +const PrivateRoute: React.FC = ({ Component }) => { + return getToken() ? Component : ; +}; +export default PrivateRoute; diff --git a/src/pages/course/user.tsx b/src/pages/course/user.tsx index 2b9fb42..696a37e 100644 --- a/src/pages/course/user.tsx +++ b/src/pages/course/user.tsx @@ -87,7 +87,7 @@ const CourseUserPage = () => { dataIndex: "progress", render: (progress: number) => ( = 10000 ? "c-green" : "c-red"}> - {progress / 100}% + {Math.floor(progress / 100)}% ), }, diff --git a/src/routes/index.tsx b/src/routes/index.tsx index 1e0c7af..fd4c4c0 100644 --- a/src/routes/index.tsx +++ b/src/routes/index.tsx @@ -25,6 +25,7 @@ import SystemAdminrolesPage from "../pages/system/adminroles"; import DepartmentPage from "../pages/department"; import TestPage from "../pages/test"; import ErrorPage from "../pages/error"; +import PrivateRoute from "../compenents/private-route"; // const LoginPage = lazy(() => import("../pages/login")); @@ -63,70 +64,75 @@ const routes: RouteObject[] = [ children: [ { path: "/", - element: , + element: } />, children: [ { path: "/", - element: , + element: } />, }, { path: "/change-password", - element: , + element: } />, }, { path: "/resource-category", - element: , + element: } />, }, { path: "/images", - element: , + element: } />, }, { path: "/videos", - element: , + element: } />, }, { path: "/course", - element: , + element: } />, }, { path: "/course/user/:courseId", - element: , + element: } />, }, { path: "/member", element: , children: [ - { path: "/member/index", element: }, + { + path: "/member/index", + element: } />, + }, { path: "/member/import", - element: , + element: } />, }, { path: "/member/learn", - element: , + element: } />, }, { path: "/member/departmentUser", - element: , + element: ( + } /> + ), }, ], }, { path: "/system/config/index", - element: , + element: } />, }, { path: "/system/administrator", - element: , + element: } />, }, { path: "/system/adminroles", - element: , + element: } />, }, { path: "/department", - element: , + element: } />, }, ], }, From a34a2ccae835065ab3a466209cdb873c70dca45e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BA=E7=8B=A8?= <18119604035@163.com> Date: Mon, 8 May 2023 13:56:26 +0800 Subject: [PATCH 2/9] =?UTF-8?q?=E7=BA=BF=E4=B8=8A=E8=AF=BE=E5=AD=A6?= =?UTF-8?q?=E5=91=98=E3=80=81=E5=AD=A6=E5=91=98=E5=AD=A6=E4=B9=A0=E5=AD=A6?= =?UTF-8?q?=E4=B9=A0=E8=BF=9B=E5=BA=A6=E5=B1=95=E7=A4=BA=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/course/user.tsx | 102 ++++++++++++++++++++++++++----------- src/pages/member/learn.tsx | 4 ++ 2 files changed, 77 insertions(+), 29 deletions(-) diff --git a/src/pages/course/user.tsx b/src/pages/course/user.tsx index 696a37e..d8f9d47 100644 --- a/src/pages/course/user.tsx +++ b/src/pages/course/user.tsx @@ -10,7 +10,7 @@ import { message, Image, } from "antd"; -import { course } from "../../api"; +import { course as Course } from "../../api"; import { useParams, useLocation } from "react-router-dom"; import type { ColumnsType } from "antd/es/table"; import { BackBartment } from "../../compenents"; @@ -33,7 +33,9 @@ const CourseUserPage = () => { const params = useParams(); const result = new URLSearchParams(useLocation().search); const [list, setList] = useState([]); - const [users, setUsers] = useState([]); + const [course, setCourse] = useState({}); + const [records, setRecords] = useState({}); + const [hourCount, setHourCount] = useState({}); const [refresh, setRefresh] = useState(false); const [page, setPage] = useState(1); const [size, setSize] = useState(10); @@ -55,11 +57,9 @@ const CourseUserPage = () => { preview={false} width={40} height={40} - src={users.find((i: any) => i.id === record.user_id).avatar} + src={record.avatar} > - - {users.find((i: any) => i.id === record.user_id).name} - + {record.name} ), }, @@ -68,27 +68,70 @@ const CourseUserPage = () => { dataIndex: "progress", render: (_, record: any) => ( - 已完成课时:{record.finished_count} / {record.hour_count} + 已完成课时: + {(records[record.id] && records[record.id].finished_count) || + 0} /{" "} + {(records[record.id] && records[record.id].hour_count) || + course.class_hour} ), }, { title: "第一次学习时间", dataIndex: "created_at", - render: (text: string) => {dateFormat(text)}, + render: (_, record: any) => ( + <> + {records[record.id] ? ( + {dateFormat(records[record.id].created_at)} + ) : ( + - + )} + + ), }, { title: "学习完成时间", dataIndex: "finished_at", - render: (text: string) => {dateFormat(text)}, + render: (_, record: any) => ( + <> + {records[record.id] ? ( + {dateFormat(records[record.id].finished_at)} + ) : ( + - + )} + + ), }, { title: "学习进度", dataIndex: "progress", - render: (progress: number) => ( - = 10000 ? "c-green" : "c-red"}> - {Math.floor(progress / 100)}% - + render: (_, record: any) => ( + <> + {records[record.id] ? ( + = 100 + ? "c-green" + : "c-red" + } + > + {Math.floor( + (records[record.id].finished_count / + records[record.id].hour_count) * + 100 + )} + % + + ) : hourCount[record.id] && hourCount[record.id] > 0 ? ( + 1% + ) : ( + 0% + )} + ), }, ]; @@ -99,21 +142,22 @@ const CourseUserPage = () => { const getList = () => { setLoading(true); - course - .courseUser( - Number(params.courseId), - page, - size, - "", - "", - name, - email, - idCard - ) + Course.courseUser( + Number(params.courseId), + page, + size, + "", + "", + name, + email, + idCard + ) .then((res: any) => { setTotal(res.data.total); setList(res.data.data); - setUsers(res.data.users); + setHourCount(res.data.user_course_hour_user_count); + setRecords(res.data.user_course_records); + setCourse(res.data.course); setLoading(false); }) .catch((err: any) => { @@ -160,12 +204,12 @@ const CourseUserPage = () => { okText: "确认", cancelText: "取消", onOk() { - course - .destroyCourseUser(Number(params.courseId), selectedRowKeys) - .then(() => { + Course.destroyCourseUser(Number(params.courseId), selectedRowKeys).then( + () => { message.success("清除成功"); resetList(); - }); + } + ); }, onCancel() { console.log("Cancel"); diff --git a/src/pages/member/learn.tsx b/src/pages/member/learn.tsx index ce75818..7627da9 100644 --- a/src/pages/member/learn.tsx +++ b/src/pages/member/learn.tsx @@ -31,6 +31,7 @@ const MemberLearnPage = () => { const [currentCourses, setCurrentCourses] = useState([]); const [openCourses, setOpenCourses] = useState([]); const [records, setRecords] = useState({}); + const [hourCount, setHourCount] = useState({}); const [total2, setTotal2] = useState(0); const [refresh2, setRefresh2] = useState(false); const [uid, setUid] = useState(Number(result.get("id"))); @@ -153,6 +154,7 @@ const MemberLearnPage = () => { setList2(res.data.departments); setCourses(res.data.dep_courses); setOpenCourses(res.data.open_courses); + setHourCount(res.data.user_course_hour_count); setRecords(res.data.user_course_records); if (res.data.departments.length > 0) { let box: any = []; @@ -252,6 +254,8 @@ const MemberLearnPage = () => { )} % + ) : hourCount[record.id] && hourCount[record.id] > 0 ? ( + 1% ) : ( 0% )} From 71c0f03be4a825aaac1565cb92540791433c8939 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BA=E7=8B=A8?= <18119604035@163.com> Date: Mon, 8 May 2023 14:09:18 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=E7=BA=BF=E4=B8=8A=E8=AF=BE=E5=AD=A6?= =?UTF-8?q?=E5=91=98=E3=80=81=E5=AD=A6=E5=91=98=E5=AD=A6=E4=B9=A0=E5=AD=A6?= =?UTF-8?q?=E4=B9=A0=E8=BF=9B=E5=BA=A6=E5=B7=A6=E4=BE=A7=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E9=AB=98=E4=BA=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/compenents/left-menu/index.tsx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/compenents/left-menu/index.tsx b/src/compenents/left-menu/index.tsx index 07d4b24..ccfe912 100644 --- a/src/compenents/left-menu/index.tsx +++ b/src/compenents/left-menu/index.tsx @@ -119,8 +119,16 @@ export const LeftMenu: React.FC = () => { }; useEffect(() => { - setSelectedKeys([location.pathname]); - setOpenKeys(openKeyMerge(location.pathname)); + if (location.pathname.indexOf("/course/user") !== -1) { + setSelectedKeys(["/course"]); + setOpenKeys(openKeyMerge("/course")); + } else if (location.pathname.indexOf("/member/learn") !== -1) { + setSelectedKeys(["/member/index"]); + setOpenKeys(openKeyMerge("/member/index")); + } else { + setSelectedKeys([location.pathname]); + setOpenKeys(openKeyMerge(location.pathname)); + } }, [location.pathname]); return ( From 9519e7c07f20fc01703fdd5a85259f2e016ab4b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BA=E7=8B=A8?= <18119604035@163.com> Date: Mon, 8 May 2023 15:01:56 +0800 Subject: [PATCH 4/9] =?UTF-8?q?=E7=BA=BF=E4=B8=8A=E8=AF=BE=E5=AD=A6?= =?UTF-8?q?=E5=91=98=E3=80=81=E5=AD=A6=E5=91=98=E5=AD=A6=E4=B9=A0=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/course/user.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/pages/course/user.tsx b/src/pages/course/user.tsx index d8f9d47..6403e6b 100644 --- a/src/pages/course/user.tsx +++ b/src/pages/course/user.tsx @@ -83,6 +83,8 @@ const CourseUserPage = () => { <> {records[record.id] ? ( {dateFormat(records[record.id].created_at)} + ) : hourCount[record.id] ? ( + {dateFormat(hourCount[record.id])} ) : ( - )} @@ -126,7 +128,7 @@ const CourseUserPage = () => { )} % - ) : hourCount[record.id] && hourCount[record.id] > 0 ? ( + ) : hourCount[record.id] ? ( 1% ) : ( 0% @@ -155,7 +157,7 @@ const CourseUserPage = () => { .then((res: any) => { setTotal(res.data.total); setList(res.data.data); - setHourCount(res.data.user_course_hour_user_count); + setHourCount(res.data.user_course_hour_user_first_at); setRecords(res.data.user_course_records); setCourse(res.data.course); setLoading(false); From dfcd1fbaecd72eb62c19bf6dd2f73479841929dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BA=E7=8B=A8?= <18119604035@163.com> Date: Tue, 9 May 2023 09:08:32 +0800 Subject: [PATCH 5/9] =?UTF-8?q?=E5=88=86=E7=B1=BB=E5=88=97=E8=A1=A8overflo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.less b/src/index.less index 5b5c90e..0bcee1a 100644 --- a/src/index.less +++ b/src/index.less @@ -23,7 +23,7 @@ code { } .w-174px { - max-width: 174px; + max-width: 134px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; From 0b83fb69ffa18c12700368b365e4929e1835629e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BA=E7=8B=A8?= <18119604035@163.com> Date: Tue, 9 May 2023 09:19:21 +0800 Subject: [PATCH 6/9] =?UTF-8?q?tree=E7=BB=84=E4=BB=B6overflow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/compenents/tree-department/index.tsx | 16 +++++++++++----- src/index.less | 5 ++++- src/pages/department/index.tsx | 4 ++-- src/pages/resource/resource-category/index.tsx | 4 ++-- 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/compenents/tree-department/index.tsx b/src/compenents/tree-department/index.tsx index 3da48c5..238c996 100644 --- a/src/compenents/tree-department/index.tsx +++ b/src/compenents/tree-department/index.tsx @@ -87,13 +87,17 @@ export const TreeDepartment = (props: PropInterface) => { for (let i = 0; i < departments[id].length; i++) { if (!departments[departments[id][i].id]) { arr.push({ - title: departments[id][i].name, + title: ( + {departments[id][i].name} + ), key: departments[id][i].id, }); } else { - const new_arr: Option[] = checkArr(departments, departments[id][i].id); + const new_arr: any[] = checkArr(departments, departments[id][i].id); arr.push({ - title: departments[id][i].name, + title: ( + {departments[id][i].name} + ), key: departments[id][i].id, children: new_arr, }); @@ -105,9 +109,11 @@ export const TreeDepartment = (props: PropInterface) => { const getNewTitle = (title: any, id: number, counts: any) => { if (counts) { let value = counts[id] || 0; - return title + "(" + value + ")"; + return ( + {title + "(" + value + ")"} + ); } else { - return title; + return {title}; } }; diff --git a/src/index.less b/src/index.less index 0bcee1a..532d11b 100644 --- a/src/index.less +++ b/src/index.less @@ -457,6 +457,7 @@ textarea.ant-input { margin-bottom: 8px !important; display: flex; align-items: center !important; + &.ant-tree-treenode-selected { background-color: #fff2f0 !important; border-radius: 6px !important; @@ -559,9 +560,11 @@ textarea.ant-input { .tree-title-elli { width: 100%; + display: -webkit-box; overflow: hidden; - white-space: nowrap; text-overflow: ellipsis; + -webkit-box-orient: vertical; + -webkit-line-clamp: 1; } .ant-tabs { diff --git a/src/pages/department/index.tsx b/src/pages/department/index.tsx index 3c885e5..f81f17b 100644 --- a/src/pages/department/index.tsx +++ b/src/pages/department/index.tsx @@ -68,7 +68,7 @@ const DepartmentPage = () => { arr.push({ title: ( <> -
{departments[id][i].name}
+
{departments[id][i].name}
{ arr.push({ title: ( <> -
{departments[id][i].name}
+
{departments[id][i].name}
{ arr.push({ title: ( <> -
{categories[id][i].name}
+
{categories[id][i].name}
{ arr.push({ title: ( <> -
{categories[id][i].name}
+
{categories[id][i].name}
Date: Tue, 9 May 2023 09:36:15 +0800 Subject: [PATCH 7/9] =?UTF-8?q?tree=E7=BB=84=E4=BB=B6overflow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/compenents/tree-department/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compenents/tree-department/index.tsx b/src/compenents/tree-department/index.tsx index 238c996..09c7361 100644 --- a/src/compenents/tree-department/index.tsx +++ b/src/compenents/tree-department/index.tsx @@ -30,10 +30,10 @@ export const TreeDepartment = (props: PropInterface) => { setUserTotal(res.data.user_total); if (JSON.stringify(departments) !== "{}") { if (props.showNum) { - const new_arr: any = checkNewArr(departments, 0, departCount); + const new_arr: any[] = checkNewArr(departments, 0, departCount); setTreeData(new_arr); } else { - const new_arr: Option[] = checkArr(departments, 0); + const new_arr: any[] = checkArr(departments, 0); setTreeData(new_arr); } } else { From f4aa89746b1dffdcf17a26a6d9c753d500adac65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BA=E7=8B=A8?= <18119604035@163.com> Date: Tue, 9 May 2023 10:02:42 +0800 Subject: [PATCH 8/9] =?UTF-8?q?tree=E7=BB=84=E4=BB=B6=E7=82=B9=E5=87=BB?= =?UTF-8?q?=E5=90=8E=E5=88=86=E7=B1=BB=E5=90=8D=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/compenents/tree-department/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compenents/tree-department/index.tsx b/src/compenents/tree-department/index.tsx index 09c7361..1da5c94 100644 --- a/src/compenents/tree-department/index.tsx +++ b/src/compenents/tree-department/index.tsx @@ -120,7 +120,7 @@ export const TreeDepartment = (props: PropInterface) => { const onSelect = (selectedKeys: any, info: any) => { let label = "全部" + props.text; if (info) { - label = info.node.title; + label = info.node.title.props.children; } props.onUpdate(selectedKeys, label); setSelectKey(selectedKeys); @@ -129,7 +129,7 @@ export const TreeDepartment = (props: PropInterface) => { const onExpand = (selectedKeys: any, info: any) => { let label = "全部" + props.text; if (info) { - label = info.node.title; + label = info.node.title.props.children; } props.onUpdate(selectedKeys, label); setSelectKey(selectedKeys); From f323985fed47638f66277bdb021321be96bc3901 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BA=E7=8B=A8?= <18119604035@163.com> Date: Wed, 10 May 2023 10:51:18 +0800 Subject: [PATCH 9/9] =?UTF-8?q?=E7=BA=BF=E4=B8=8A=E8=AF=BE=E5=AD=A6?= =?UTF-8?q?=E5=91=98=E5=88=97=E8=A1=A8=E5=A2=9E=E5=8A=A0=E9=83=A8=E9=97=A8?= =?UTF-8?q?=E3=80=81=E9=82=AE=E7=AE=B1=E5=88=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/course/user.tsx | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/pages/course/user.tsx b/src/pages/course/user.tsx index 6403e6b..b175032 100644 --- a/src/pages/course/user.tsx +++ b/src/pages/course/user.tsx @@ -36,6 +36,8 @@ const CourseUserPage = () => { const [course, setCourse] = useState({}); const [records, setRecords] = useState({}); const [hourCount, setHourCount] = useState({}); + const [userDepIds, setUserDepIds] = useState({}); + const [departments, setDepartments] = useState({}); const [refresh, setRefresh] = useState(false); const [page, setPage] = useState(1); const [size, setSize] = useState(10); @@ -63,6 +65,27 @@ const CourseUserPage = () => {
), }, + { + title: "邮箱", + render: (_, record: any) => {record.email}, + }, + { + title: "部门", + render: (_, record: any) => ( +
+ {userDepIds[record.id] && + userDepIds[record.id].map((item: any, index: number) => { + return ( + + {index === userDepIds[record.id].length - 1 + ? departments[item] + : departments[item] + "、"} + + ); + })} +
+ ), + }, { title: "课程进度", dataIndex: "progress", @@ -160,6 +183,8 @@ const CourseUserPage = () => { setHourCount(res.data.user_course_hour_user_first_at); setRecords(res.data.user_course_records); setCourse(res.data.course); + setDepartments(res.data.departments); + setUserDepIds(res.data.user_dep_ids); setLoading(false); }) .catch((err: any) => {