diff --git a/src/compenents/tree-category/index.tsx b/src/compenents/tree-category/index.tsx index d92a09b..d912b37 100644 --- a/src/compenents/tree-category/index.tsx +++ b/src/compenents/tree-category/index.tsx @@ -9,9 +9,11 @@ interface Option { } interface PropInterface { + type: string; text: string; categoryCount: any; resourceTotal: number; + onUpdate: (keys: any, title: any) => void; } @@ -25,15 +27,20 @@ export const TreeCategory = (props: PropInterface) => { const categories = res.data.categories; if (JSON.stringify(categories) !== "{}") { const new_arr: Option[] = checkArr(categories, 0); - new_arr.unshift({ - key: 0, - title: ( -
- 未分类 - ({props.categoryCount[0] || 0}) -
- ), - }); + if (props.type === "no-cate") { + new_arr.unshift({ + key: 0, + title: ( +
+ 未分类 + + ({props.categoryCount[0] || 0}) + +
+ ), + }); + } + setTreeData(new_arr); } }); diff --git a/src/compenents/upload-image-button/index.tsx b/src/compenents/upload-image-button/index.tsx index ad6a883..2967e9a 100644 --- a/src/compenents/upload-image-button/index.tsx +++ b/src/compenents/upload-image-button/index.tsx @@ -98,6 +98,7 @@ export const UploadImageButton = (props: PropsInterface) => { { = ({ open, onCancel }) => { }; const delChapterHour = (index: number, id: number) => { - console.log(index, id); const keys = [...chapterHours]; const data = [...chapters]; const current = data[index].hours.findIndex((i: any) => i.rid === id); - console.log(current); - if (current >= 0) { data[index].hours.splice(current, 1); } diff --git a/src/pages/course/compenents/hours.tsx b/src/pages/course/compenents/hours.tsx index 79e6eaf..c8e7c34 100644 --- a/src/pages/course/compenents/hours.tsx +++ b/src/pages/course/compenents/hours.tsx @@ -38,9 +38,7 @@ export const TreeHours = (props: PropInterface) => { color: "rgba(0,0,0,0.3)", }} /> -
- {hours[i].name} {hours[i].rid} -
+
{hours[i].name}
void; +} + +interface Option { + value: string | number; + label: string; + children?: Option[]; +} + +export const CourseUpdate: React.FC = ({ + id, + open, + onCancel, +}) => { + const [form] = Form.useForm(); + const defaultThumb1 = getHost() + "thumb/thumb1.png"; + const defaultThumb2 = getHost() + "thumb/thumb2.png"; + const defaultThumb3 = getHost() + "thumb/thumb3.png"; + const [loading, setLoading] = useState(true); + const [departments, setDepartments] = useState([]); + const [categories, setCategories] = useState([]); + const [thumb, setThumb] = useState(""); + const [type, setType] = useState("open"); + const [chapterType, setChapterType] = useState(0); + const [chapters, setChapters] = useState([]); + const [hours, setHours] = useState([]); + const [chapterHours, setChapterHours] = useState([]); + const [videoVisible, setVideoVisible] = useState(false); + const [treeData, setTreeData] = useState([]); + const [addvideoCurrent, setAddvideoCurrent] = useState(0); + + useEffect(() => { + if (id === 0) { + return; + } + getCategory(); + }, [id]); + + const getCategory = () => { + course.createCourse().then((res: any) => { + const categories = res.data.categories; + if (JSON.stringify(categories) !== "{}") { + const new_arr: Option[] = checkArr(categories, 0); + setCategories(new_arr); + } + + getParams(categories); + }); + }; + const getParams = (cats: any) => { + department.departmentList().then((res: any) => { + const departments = res.data.departments; + if (JSON.stringify(departments) !== "{}") { + const new_arr: Option[] = checkArr(departments, 0); + setDepartments(new_arr); + } + getDetail(departments, cats); + }); + }; + + const getDetail = (deps: any, cats: any) => { + course.course(id).then((res: any) => { + let box = res.data.dep_ids; + let depIds: any[] = []; + if (box.length > 1) { + for (let i = 0; i < box.length; i++) { + let item = checkChild(deps, box[i]); + let arr: any[] = []; + if (item === undefined) { + arr.push(box[i]); + } else if (item.parent_chain === "") { + arr.push(box[i]); + } else { + let new_arr = item.parent_chain.split(","); + new_arr.map((num: any) => { + arr.push(Number(num)); + }); + arr.push(box[i]); + } + depIds.push(arr); + } + } else { + depIds = res.data.dep_ids; + } + let box2 = res.data.category_ids; + let categoryIds: any[] = []; + if (box2.length > 1) { + for (let i = 0; i < box2.length; i++) { + let item = checkChild(cats, box2[i]); + let arr: any[] = []; + if (item === undefined) { + arr.push(box2[i]); + } else if (item.parent_chain === "") { + arr.push(box2[i]); + } else { + let new_arr = item.parent_chain.split(","); + new_arr.map((num: any) => { + arr.push(Number(num)); + }); + arr.push(box2[i]); + } + categoryIds.push(arr); + } + } else { + categoryIds = res.data.category_ids; + } + let chapterType = res.data.chapters.length > 0 ? 1 : 0; + form.setFieldsValue({ + title: res.data.course.title, + thumb: res.data.course.thumb, + dep_ids: depIds, + category_ids: categoryIds, + type: "open", + desc: "", + hasChapter: chapterType, + }); + setThumb(res.data.course.thumb); + setChapterType(chapterType); + if (chapterType === 1) { + setTreeData([]); + setHours([]); + let hours = res.data.hours; + let chapters = res.data.chapters; + const arr: any = []; + const keys: any = []; + for (let i = 0; i < chapters.length; i++) { + arr.push({ + name: chapters[i].name, + hours: resetHours(hours[chapters[i].id]).arr, + }); + keys.push(resetHours(hours[chapters[i].id]).keys); + } + setChapters(arr); + setChapterHours(keys); + } else { + setChapters([]); + setChapterHours([]); + let hours = res.data.hours; + const arr: any = resetHours(hours[0]).arr; + const keys: any = resetHours(hours[0]).keys; + setTreeData(arr); + setHours(keys); + } + }); + }; + + const resetHours = (data: any) => { + const arr: any = []; + const keys: any = []; + for (let i = 0; i < data.length; i++) { + arr.push({ + duration: data[i].duration, + type: data[i].type, + name: data[i].title, + rid: data[i].rid, + }); + keys.push(data[i].rid); + } + return { arr, keys }; + }; + + const checkChild = (departments: any[], id: number) => { + for (let key in departments) { + for (let i = 0; i < departments[key].length; i++) { + if (departments[key][i].id === id) { + return departments[key][i]; + } + } + } + }; + + const checkArr = (departments: any[], id: number) => { + const arr = []; + for (let i = 0; i < departments[id].length; i++) { + if (!departments[departments[id][i].id]) { + arr.push({ + label: departments[id][i].name, + value: departments[id][i].id, + }); + } else { + const new_arr: Option[] = checkArr(departments, departments[id][i].id); + arr.push({ + label: departments[id][i].name, + value: departments[id][i].id, + children: new_arr, + }); + } + } + return arr; + }; + + const onFinish = (values: any) => { + let dep_ids: any[] = []; + if (type === "elective") { + for (let i = 0; i < values.dep_ids.length; i++) { + dep_ids.push(values.dep_ids[i][values.dep_ids[i].length - 1]); + } + } + let category_ids: any[] = []; + for (let j = 0; j < values.category_ids.length; j++) { + category_ids.push( + values.category_ids[j][values.category_ids[j].length - 1] + ); + } + course + .storeCourse( + values.title, + values.thumb, + 1, + dep_ids, + category_ids, + chapters, + treeData + ) + .then((res: any) => { + message.success("保存成功!"); + onCancel(); + }); + }; + + const onFinishFailed = (errorInfo: any) => { + console.log("Failed:", errorInfo); + }; + + const getType = (e: any) => { + setType(e.target.value); + }; + + const selectData = (arr: any, videos: any) => { + setHours(arr); + setTreeData(videos); + setVideoVisible(false); + }; + + const selectChapterData = (arr: any, videos: any) => { + const data = [...chapters]; + const keys = [...chapterHours]; + keys[addvideoCurrent] = arr; + data[addvideoCurrent].hours = videos; + setChapters(data); + setChapterHours(keys); + setVideoVisible(false); + }; + + const getChapterType = (e: any) => { + confirm({ + title: "操作确认", + icon: , + content: "切换列表选项会清空已添加课时,确认切换?", + centered: true, + okText: "确认", + cancelText: "取消", + onOk() { + setChapterType(e.target.value); + setChapters([]); + setHours([]); + setChapterHours([]); + setTreeData([]); + }, + onCancel() { + form.setFieldsValue({ + hasChapter: chapterType, + }); + }, + }); + }; + + const delHour = (id: number) => { + const data = [...treeData]; + const index = data.findIndex((i: any) => i.rid === id); + if (index >= 0) { + data.splice(index, 1); + } + if (data.length > 0) { + setTreeData(data); + const keys = data.map((item: any) => item.rid); + setHours(keys); + } else { + setTreeData([]); + setHours([]); + } + }; + + const transHour = (arr: any) => { + setHours(arr); + const data = [...treeData]; + const newArr: any = []; + for (let i = 0; i < arr.length; i++) { + data.map((item: any) => { + if (item.rid === arr[i]) { + newArr.push(item); + } + }); + } + setTreeData(newArr); + }; + + const addNewChapter = () => { + const arr = [...chapters]; + const keys = [...chapterHours]; + arr.push({ + name: "", + hours: [], + }); + keys.push([]); + setChapters(arr); + setChapterHours(keys); + }; + + const setChapterName = (index: number, value: string) => { + const arr = [...chapters]; + arr[index].name = value; + setChapters(arr); + }; + + const delChapter = (index: number) => { + const arr = [...chapters]; + const keys = [...chapterHours]; + confirm({ + title: "操作确认", + icon: , + content: "删除章节会清空已添加课时,确认删除?", + centered: true, + okText: "确认", + cancelText: "取消", + onOk() { + arr.splice(index, 1); + keys.splice(index, 1); + setChapters(arr); + setChapterHours(keys); + }, + onCancel() {}, + }); + }; + + const delChapterHour = (index: number, id: number) => { + const keys = [...chapterHours]; + const data = [...chapters]; + const current = data[index].hours.findIndex((i: any) => i.rid === id); + if (current >= 0) { + data[index].hours.splice(current, 1); + } + if (data[index].hours.length > 0) { + setChapters(data); + keys[index] = data[index].hours.map((item: any) => item.rid); + setChapterHours(keys); + } else { + keys[index] = []; + data[index].hours = []; + setChapters(data); + setChapterHours(keys); + } + }; + + const transChapterHour = (index: number, arr: any) => { + const keys = [...chapterHours]; + keys[index] = arr; + setChapterHours(keys); + + const data = [...chapters]; + const newArr: any = []; + for (let i = 0; i < arr.length; i++) { + data[index].hours.map((item: any) => { + if (item.rid === arr[i]) { + newArr.push(item); + } + }); + } + data[index].hours = newArr; + setChapters(data); + }; + + return ( + <> + + + + + } + width={634} + > +
+ { + setVideoVisible(false); + }} + onSelected={(arr: any, videos: any) => { + if (chapterType == 0) { + selectData(arr, videos); + } else { + selectChapterData(arr, videos); + } + }} + /> +
+ + + + + + + + + 公开课 + 部门课 + + + + {type === "elective" && ( + + + + )} + + +
+ +
+
+
{ + setThumb(defaultThumb1); + form.setFieldsValue({ + thumb: defaultThumb1, + }); + }} + > + +
+
{ + setThumb(defaultThumb2); + form.setFieldsValue({ + thumb: defaultThumb2, + }); + }} + > + +
+
{ + setThumb(defaultThumb3); + form.setFieldsValue({ + thumb: defaultThumb3, + }); + }} + > + +
+
+
+ { + setThumb(url); + form.setFieldsValue({ thumb: url }); + }} + > + + (推荐尺寸:400x300px) + +
+
+
+
+ + + + + + 无章节 + 有章节 + + + {chapterType === 0 && ( +
+ +
+ +
+
+
+ {treeData.length === 0 && ( + 请添加课时内容 + )} + {treeData.length > 0 && ( + { + delHour(id); + }} + onUpdate={(arr: any[]) => { + transHour(arr); + }} + /> + )} +
+
+ )} + {chapterType === 1 && ( +
+ {chapters.length > 0 && + chapters.map((item: any, index: number) => { + return ( +
+
+
+ 章节{index + 1}: +
+ { + setChapterName(index, e.target.value); + }} + placeholder="请在此处输入章节名称" + /> + + +
+
+ {item.hours.length === 0 && ( + + 请添加课时内容 + + )} + {item.hours.length > 0 && ( + { + delChapterHour(index, id); + }} + onUpdate={(arr: any[]) => { + transChapterHour(index, arr); + }} + /> + )} +
+
+ ); + })} + +
+ +
+
+
+ )} +
+
+
+ + ); +}; diff --git a/src/pages/course/index.tsx b/src/pages/course/index.tsx index 381f147..83c7480 100644 --- a/src/pages/course/index.tsx +++ b/src/pages/course/index.tsx @@ -19,6 +19,7 @@ import { Link, useNavigate } from "react-router-dom"; import { TreeDepartment, TreeCategory, PerButton } from "../../compenents"; import type { TabsProps } from "antd"; import { CourseCreate } from "./compenents/create"; +import { CourseUpdate } from "./compenents/update"; const { confirm } = Modal; @@ -58,6 +59,7 @@ export const CoursePage = () => { children: (
{ class="b-link c-red" icon={null} p="course" - onClick={() => navigate(`/course/update/${record.id}`)} + onClick={() => { + setCid(Number(record.id)); + setUpdateVisible(true); + }} disabled={null} />
@@ -292,6 +297,14 @@ export const CoursePage = () => { setRefresh(!refresh); }} /> + { + setUpdateVisible(false); + setRefresh(!refresh); + }} + />
diff --git a/src/pages/resource/images/index.tsx b/src/pages/resource/images/index.tsx index 47b5668..ae97a05 100644 --- a/src/pages/resource/images/index.tsx +++ b/src/pages/resource/images/index.tsx @@ -154,6 +154,7 @@ export const ResourceImagesPage = () => {
{