diff --git a/package.json b/package.json
index c89999d..83edae1 100644
--- a/package.json
+++ b/package.json
@@ -10,6 +10,7 @@
},
"dependencies": {
"@reduxjs/toolkit": "^1.9.3",
+ "ahooks": "^3.7.6",
"antd": "^5.3.2",
"axios": "^1.3.4",
"echarts": "^5.4.2",
diff --git a/public/template/学员批量导入模板.xlsx b/public/template/学员批量导入模板.xlsx
index 99483ad..c64a6a5 100644
Binary files a/public/template/学员批量导入模板.xlsx and b/public/template/学员批量导入模板.xlsx differ
diff --git a/src/api/user.ts b/src/api/user.ts
index c1165e1..66d4fcd 100644
--- a/src/api/user.ts
+++ b/src/api/user.ts
@@ -109,6 +109,10 @@ export function learnCourses(
});
}
+export function learnAllCourses(id: number) {
+ return client.get(`/backend/v1/user/${id}/all-courses`, {});
+}
+
export function departmentProgress(
id: number,
page: number,
@@ -121,3 +125,25 @@ export function departmentProgress(
...params,
});
}
+
+export function learnCoursesProgress(
+ id: number,
+ courseId: number,
+ params: any
+) {
+ return client.get(`/backend/v1/user/${id}/learn-course/${courseId} `, params);
+}
+
+export function destroyAllUserLearned(id: number, courseId: number) {
+ return client.destroy(`/backend/v1/user/${id}/learn-course/${courseId}`);
+}
+
+export function destroyUserLearned(
+ id: number,
+ courseId: number,
+ hourId: number
+) {
+ return client.destroy(
+ `/backend/v1/user/${id}/learn-course/${courseId}/hour/${hourId}`
+ );
+}
diff --git a/src/compenents/create-rs-category/index.tsx b/src/compenents/create-rs-category/index.tsx
index 4899a15..e1c8449 100644
--- a/src/compenents/create-rs-category/index.tsx
+++ b/src/compenents/create-rs-category/index.tsx
@@ -54,6 +54,7 @@ export const CreateResourceCategory = (props: PropInterface) => {
onChange={(e) => {
setName(e.target.value);
}}
+ allowClear
/>
>
diff --git a/src/compenents/footer/index.tsx b/src/compenents/footer/index.tsx
index 4dbc669..aa52911 100644
--- a/src/compenents/footer/index.tsx
+++ b/src/compenents/footer/index.tsx
@@ -8,7 +8,7 @@ export const Footer: React.FC = () => {
style={{
width: "100%",
backgroundColor: "#F6F6F6",
- height: 232,
+ height: 166,
paddingTop: 80,
textAlign: "center",
}}
diff --git a/src/compenents/keep-alive/index.tsx b/src/compenents/keep-alive/index.tsx
new file mode 100644
index 0000000..94a10f4
--- /dev/null
+++ b/src/compenents/keep-alive/index.tsx
@@ -0,0 +1,29 @@
+import { useUpdate } from "ahooks";
+import { useEffect, useRef } from "react";
+import { useLocation, useOutlet } from "react-router-dom";
+
+function KeepAlive() {
+ const componentList = useRef(new Map());
+ const outLet = useOutlet();
+ const { pathname } = useLocation();
+ const forceUpdate = useUpdate();
+
+ useEffect(() => {
+ if (!componentList.current.has(pathname)) {
+ componentList.current.set(pathname, outLet);
+ }
+ forceUpdate();
+ }, [pathname]);
+
+ return (
+
+ {Array.from(componentList.current).map(([key, component]) => (
+
+ {component}
+
+ ))}
+
+ );
+}
+
+export default KeepAlive;
diff --git a/src/compenents/left-menu/index.tsx b/src/compenents/left-menu/index.tsx
index c3ce869..07d4b24 100644
--- a/src/compenents/left-menu/index.tsx
+++ b/src/compenents/left-menu/index.tsx
@@ -50,7 +50,7 @@ const items = [
"user",
,
[
- getItem("学员", "/member", null, null, null),
+ getItem("学员", "/member/index", null, null, null),
getItem("部门", "/department", null, null, null),
],
null
diff --git a/src/compenents/tree-category/index.tsx b/src/compenents/tree-category/index.tsx
index 7e4cb67..aedc7ea 100644
--- a/src/compenents/tree-category/index.tsx
+++ b/src/compenents/tree-category/index.tsx
@@ -5,6 +5,7 @@ import { resourceCategory } from "../../api/index";
interface Option {
key: string | number;
title: any;
+
children?: Option[];
}
diff --git a/src/compenents/upload-image-button/index.module.less b/src/compenents/upload-image-button/index.module.less
index 8874736..4084585 100644
--- a/src/compenents/upload-image-button/index.module.less
+++ b/src/compenents/upload-image-button/index.module.less
@@ -18,3 +18,20 @@
line-height: 30px;
display: flex;
}
+
+.checked {
+ width: 16px;
+ height: 16px;
+ background: #ff4d4f;
+ border-radius: 3px;
+ border: 2px solid #ff4d4f;
+ position: absolute;
+ left: 5px;
+ top: 5px;
+ z-index: 100;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: #ffffff;
+ cursor: pointer;
+}
diff --git a/src/compenents/upload-image-button/index.tsx b/src/compenents/upload-image-button/index.tsx
index 8c6cdb8..89fc6bb 100644
--- a/src/compenents/upload-image-button/index.tsx
+++ b/src/compenents/upload-image-button/index.tsx
@@ -12,7 +12,7 @@ import {
import { resource, resourceCategory } from "../../api";
import styles from "./index.module.less";
import { CreateResourceCategory } from "../create-rs-category";
-import { CloseOutlined } from "@ant-design/icons";
+import { CloseOutlined, CheckOutlined } from "@ant-design/icons";
import { UploadImageSub } from "./upload-image-sub";
import { TreeCategory } from "../../compenents";
@@ -49,6 +49,7 @@ export const UploadImageButton = (props: PropsInterface) => {
const [page, setPage] = useState(1);
const [size, setSize] = useState(15);
const [total, setTotal] = useState(0);
+ const [selected, setSelected] = useState("");
// 获取图片列表
const getImageList = () => {
@@ -97,13 +98,24 @@ export const UploadImageButton = (props: PropsInterface) => {
open={true}
width={820}
maskClosable={false}
+ onOk={() => {
+ if (!selected) {
+ message.error("请选择图片后确定");
+ return;
+ }
+ props.onSelected(selected);
+ setShowModal(false);
+ }}
>
setCategoryIds(keys)}
+ onUpdate={(keys: any) => {
+ setSelected("");
+ setCategoryIds(keys);
+ }}
/>
@@ -129,10 +141,21 @@ export const UploadImageButton = (props: PropsInterface) => {
className="image-item"
style={{ backgroundImage: `url(${item.url})` }}
onClick={() => {
- props.onSelected(item.url);
- setShowModal(false);
+ setSelected(item.url);
}}
- >
+ >
+ {selected.indexOf(item.url) !== -1 && (
+ {
+ e.stopPropagation();
+ setSelected("");
+ }}
+ >
+
+
+ )}
+
))}
{imageList.length > 0 && (
diff --git a/src/index.less b/src/index.less
index 019888e..5b5c90e 100644
--- a/src/index.less
+++ b/src/index.less
@@ -614,6 +614,8 @@ textarea.ant-input {
background-size: contain;
background-position: center center;
background-color: #f6f6f6;
+ position: relative;
+ cursor: pointer;
}
}
diff --git a/src/pages/change-password/index.tsx b/src/pages/change-password/index.tsx
index 11aced1..b23e718 100644
--- a/src/pages/change-password/index.tsx
+++ b/src/pages/change-password/index.tsx
@@ -45,14 +45,14 @@ const ChangePasswordPage = () => {
name="old_password"
rules={[{ required: true, message: "请输入原密码!" }]}
>
-
+
-
+
= ({
onChange={(e) => {
setChapterName(index, e.target.value);
}}
+ allowClear
placeholder="请在此处输入章节名称"
/>