diff --git a/apps/admin/src/api/dto.ts b/apps/admin/src/api/dto.ts
index fb27447..cfce04e 100644
--- a/apps/admin/src/api/dto.ts
+++ b/apps/admin/src/api/dto.ts
@@ -7,3 +7,14 @@ export interface IGetVodeResponse {
MediaInfoSet: any[];
TotalCount: number;
}
+
+export interface ICourseBasic {
+ course_title: string;
+ course_cover_url: string;
+ course_summary: string;
+}
+
+export interface ICreateCourseRequest extends ICourseBasic {
+ course_chapterList: [];
+ course_guide: {};
+}
diff --git a/apps/admin/src/api/index.ts b/apps/admin/src/api/index.ts
index 26c45eb..b8983fc 100644
--- a/apps/admin/src/api/index.ts
+++ b/apps/admin/src/api/index.ts
@@ -1,9 +1,12 @@
import R from "./request";
import P from "./process";
-import { IgetVodRequest } from "./dto";
+import { ICreateCourseRequest, IgetVodRequest } from "./dto";
/**
* 腾讯vod媒资
*/
export const getVod = (p: IgetVodRequest) =>
R.post("/api/vod/media/select", { ...p }).then((d: any) => P.getVod(d.data));
+
+export const createCourse = (p: ICreateCourseRequest) =>
+ R.post("/api/course/create", { ...p });
diff --git a/apps/admin/src/api/request.ts b/apps/admin/src/api/request.ts
index 94f30af..bb6638b 100644
--- a/apps/admin/src/api/request.ts
+++ b/apps/admin/src/api/request.ts
@@ -11,7 +11,7 @@ const instance = axios.create(config);
instance.interceptors.request.use(
(config) => {
- console.log(config)
+ console.log(config);
return config;
},
(error) => {
@@ -24,10 +24,11 @@ instance.interceptors.response.use(
(response) => {
if (response.data.code === 10000)
message.success(`接口: ${response.config.url}, 请求成功`);
+ if (response.data.code === 20000)
+ message.error(`接口: ${response.config.url}, 遇到错误`);
return response?.data;
},
(error) => {
- message.error(error);
return Promise.reject(error);
}
);
diff --git a/apps/admin/src/store/media.tsx b/apps/admin/src/store/media.tsx
index e5fe691..a4fc738 100644
--- a/apps/admin/src/store/media.tsx
+++ b/apps/admin/src/store/media.tsx
@@ -4,16 +4,9 @@ import { getVod } from "../api";
export const useMediaStore = create((set) => ({
list: [],
listFilter: [],
- getListFilter: (state: any) => {
- return state.list.length === 0
- ? getVod({ offset: 0, limit: 5000 }).then((res: any) =>
- set({ list: res.mediaList, listFilter: res.mediaList })
- )
- : state.list;
- },
setList: (newState: any) =>
set(() => ({ list: newState, listFilter: newState })),
- filterList: (keyword: string) =>
+ useFilter: (keyword: string) =>
set((state: any) => ({
listFilter: !keyword
? state.list
diff --git a/apps/admin/src/view/Course/Create/BasicForm/index.tsx b/apps/admin/src/view/Course/Create/BasicForm/index.tsx
index 492c276..0cbf145 100644
--- a/apps/admin/src/view/Course/Create/BasicForm/index.tsx
+++ b/apps/admin/src/view/Course/Create/BasicForm/index.tsx
@@ -11,9 +11,9 @@ interface IProps {
const BasicForm = (props: IProps) => {
const [preview, setPreivew] = useState({
- coverUrl: "",
- title: "",
- summary: "",
+ course_cover_url: "",
+ course_title: "",
+ course_summary: "",
});
const [form] = Form.useForm();
@@ -32,7 +32,7 @@ const BasicForm = (props: IProps) => {
if (code === 10000) {
message.success(`${info.file.name} 文件上传成功`);
const { MediaUrl } = data;
- setPreivew((p) => ({ ...p, coverUrl: MediaUrl }));
+ setPreivew((p) => ({ ...p, course_cover_url: MediaUrl }));
}
} else if (status === "error") {
message.error(`${info.file.name} 文件上传失败`);
@@ -52,7 +52,7 @@ const BasicForm = (props: IProps) => {
{
#976bc4,
#5678ce
)`
- : `url(${preview.coverUrl})`,
+ : `url(${preview.course_cover_url})`,
}}
>
-
{!preview.title ? "标题" : preview.title}
+
+ {!preview.course_title ? "标题" : preview.course_title}
+
- {!preview.summary ? "摘要" : preview.summary}{" "}
+ {!preview.course_summary ? "摘要" : preview.course_summary}{" "}
@@ -85,11 +87,11 @@ const BasicForm = (props: IProps) => {
+
diff --git a/apps/admin/src/view/Course/Create/Chatpter/index.tsx b/apps/admin/src/view/Course/Create/Chatpter/index.tsx
index 33f90c2..17bedc4 100644
--- a/apps/admin/src/view/Course/Create/Chatpter/index.tsx
+++ b/apps/admin/src/view/Course/Create/Chatpter/index.tsx
@@ -21,9 +21,9 @@ interface IProps {
}
interface IChapter {
- level: string;
- title: string;
- fileId?: string;
+ chapter_level: string;
+ chapter_title: string;
+ chapter_file_id?: string;
}
const Chatpter = (props: IProps) => {
@@ -32,10 +32,15 @@ const Chatpter = (props: IProps) => {
const onTocChange = () => {
const { toc } = form.getFieldsValue();
- const process = toc.split("\n").map((row: string) => {
- const [level, title, fileId] = row.split("|");
- return !fileId ? { level, title } : { level, title, fileId };
- });
+ const process = toc
+ .split("\n")
+ .filter((i: string) => i.replace(/\s/, "").length > 0)
+ .map((row: string, index: number) => {
+ const [chapter_level, chapter_title, chapter_file_id] = row.split("|");
+ return !chapter_file_id
+ ? { order: index, chapter_level, chapter_title }
+ : { order: index, chapter_level, chapter_title, chapter_file_id };
+ });
setChapterList(process);
};
@@ -50,7 +55,7 @@ const Chatpter = (props: IProps) => {
@@ -58,17 +63,17 @@ const Chatpter = (props: IProps) => {
- {chapterList.map((chapter, index) => (
+ {chapterList.map((c, index) => (
-
-
- {chapter.title}
+
+ {c.chapter_title}
- {chapter.fileId && (
- {chapter.fileId}
+ {c.chapter_file_id && (
+ {c.chapter_file_id}
)}
))}
diff --git a/apps/admin/src/view/Course/Create/Guide/index.tsx b/apps/admin/src/view/Course/Create/Guide/index.tsx
index e4f0029..0a3a256 100644
--- a/apps/admin/src/view/Course/Create/Guide/index.tsx
+++ b/apps/admin/src/view/Course/Create/Guide/index.tsx
@@ -86,11 +86,10 @@ const Guide = (props: IProps) => {
vditorRef.current = new Vditor("vditor", {
height: 600,
toolbar: [...toolbar, "|", submitTool],
- hint: {
- delay: 200,
- emoji,
- },
+ hint: { delay: 200, emoji },
+ counter: { enable: true },
preview: { actions: ["desktop", "mobile"] },
+ after: () => console.log("[info] vditor init success..."),
upload: {
accept: "image/*",
url: "/api/vod/oss/image/upload",
@@ -107,23 +106,9 @@ const Guide = (props: IProps) => {
}
},
},
- counter: {
- enable: true,
- },
- after: () => {
- console.log("[info] vditor init success...");
- },
});
}, []);
- // useEffect(() => {
- // if (props.onChange)
- // props.onChange({
- // value: vditorRef.current?.getValue(),
- // html: vditorRef.current?.getHTML(),
- // });
- // }, [vditorRef.current?.getValue()]);
-
return (
diff --git a/apps/admin/src/view/Course/Create/index.less b/apps/admin/src/view/Course/Create/index.less
index df07870..f84c7c7 100644
--- a/apps/admin/src/view/Course/Create/index.less
+++ b/apps/admin/src/view/Course/Create/index.less
@@ -7,8 +7,7 @@
}
.drawer-media-item {
- border: 1px solid rgba(5, 5, 5, 0.06);
- border-radius: 6px;
+ border-bottom: 1px solid rgba(5, 5, 5, 0.06);
padding: 8px;
margin-bottom: 8px;
}
diff --git a/apps/admin/src/view/Course/Create/index.tsx b/apps/admin/src/view/Course/Create/index.tsx
index 11d8ca6..a4977b2 100644
--- a/apps/admin/src/view/Course/Create/index.tsx
+++ b/apps/admin/src/view/Course/Create/index.tsx
@@ -5,14 +5,32 @@ import BasicForm from "./BasicForm";
import Chatpter from "./Chatpter";
import "./index.less";
import { useMediaStore } from "../../../store/media";
+import { createCourse } from "../../../api";
+import { ICourseBasic } from "../../../api/dto";
const { Text } = Typography;
+interface ICourse {
+ basicInfo: ICourseBasic;
+ course_chapterList: [];
+ course_guide: {
+ guide_value: string;
+ guide_html: string;
+ };
+}
+
const CourseCreate = () => {
const [current, setCurrent] = useState(0);
- const [course, setCourse] = useState({
- basicInfo: {},
- chapters: [],
- guide: {},
+ const [course, setCourse] = useState
({
+ basicInfo: {
+ course_cover_url: "",
+ course_title: "",
+ course_summary: "",
+ },
+ course_chapterList: [],
+ course_guide: {
+ guide_value: "",
+ guide_html: "",
+ },
});
const onBasicFormChange = (form: any) =>
@@ -30,32 +48,31 @@ const CourseCreate = () => {
},
];
- const [createBtnValid, setCreateBtnValid] = useState(true);
-
const items = steps.map((item) => ({ key: item.title, title: item.title }));
const onChapterChange = (chapters: any) =>
- setCourse((p) => ({ ...p, chapters }));
+ setCourse((p) => ({ ...p, course_chapterList: chapters }));
const onGuideChange = ({ value, html }: { value: string; html: string }) => {
- setCourse((p) => ({ ...p, guide: { value, html } }));
+ setCourse((p) => ({
+ ...p,
+ course_guide: { guide_value: value, guide_html: html },
+ }));
};
+ /**
+ * 创建课程
+ */
const onClickCreate = () => {
- console.log(course);
- message.info("撒打算");
+ const { basicInfo, ...rest } = course;
+ createCourse({ ...basicInfo, ...rest }).then((res) => {
+ console.log(res);
+ });
};
- useEffect(() => {
- const basicValid = !Object.values(course.basicInfo).includes("");
- const chaptersValid = course.chapters.length !== 0;
- const guideValid = !Object.values(course.guide).includes("");
- setCreateBtnValid(basicValid && chaptersValid && guideValid);
- }, [course]);
-
const mediaList = useMediaStore((s: any) => s.listFilter);
- const mediaListFilter = useMediaStore((s: any) => s.filterList);
+ const useFilter = useMediaStore((s: any) => s.useFilter);
const [open, setOpen] = useState(false);
@@ -68,7 +85,7 @@ const CourseCreate = () => {
};
const onSearchChange = (e: any) => {
- mediaListFilter(e.target.value);
+ useFilter(e.target.value);
};
return (
@@ -113,11 +130,7 @@ const CourseCreate = () => {
)}
{current === steps.length - 1 && (
-