diff --git a/apps/admin/src/api/dto.ts b/apps/admin/src/api/dto.ts
new file mode 100644
index 0000000..fb27447
--- /dev/null
+++ b/apps/admin/src/api/dto.ts
@@ -0,0 +1,9 @@
+export interface IgetVodRequest {
+ offset: number;
+ limit: number;
+}
+
+export interface IGetVodeResponse {
+ MediaInfoSet: any[];
+ TotalCount: number;
+}
diff --git a/apps/admin/src/api/index.ts b/apps/admin/src/api/index.ts
index 59db4c1..870baff 100644
--- a/apps/admin/src/api/index.ts
+++ b/apps/admin/src/api/index.ts
@@ -1,3 +1,9 @@
-import axios from "axios";
+import R from "./request";
+import P from "./process";
+import { IgetVodRequest } from "./dto";
-export const getVod = () => axios.post("/api/vod", { offset: 0, limit: 5000 });
+/**
+ * 腾讯vod媒资
+ */
+export const getVod = (p: IgetVodRequest) =>
+ R.post("/api/vod", { ...p }).then((d: any) => P.getVod(d.data));
diff --git a/apps/admin/src/api/process.ts b/apps/admin/src/api/process.ts
new file mode 100644
index 0000000..b1edb55
--- /dev/null
+++ b/apps/admin/src/api/process.ts
@@ -0,0 +1,23 @@
+import { IGetVodeResponse } from "./dto";
+
+/**
+ * 清洗数据
+ */
+export default {
+ /**
+ * 腾讯vod媒资
+ */
+ getVod: (p: IGetVodeResponse) => {
+ const { TotalCount: total, MediaInfoSet } = p;
+ const mediaList = MediaInfoSet.map((item) => {
+ return {
+ FileId: item.FileId,
+ AdaptStream:
+ item.AdaptiveDynamicStreamingInfo.AdaptiveDynamicStreamingSet[0],
+ BasicInfo: item.BasicInfo,
+ MetaData: item.MetaData,
+ };
+ });
+ return { total, mediaList };
+ },
+};
diff --git a/apps/admin/src/api/request.ts b/apps/admin/src/api/request.ts
new file mode 100644
index 0000000..d44662b
--- /dev/null
+++ b/apps/admin/src/api/request.ts
@@ -0,0 +1,34 @@
+import { message } from "antd";
+import axios from "axios";
+
+const config = {
+ baseURL: "",
+ timeout: 1000 * 15,
+ headers: {},
+};
+
+const instance = axios.create(config);
+
+instance.interceptors.request.use(
+ (config) => {
+ return config;
+ },
+ (error) => {
+ return Promise.reject(error);
+ }
+);
+
+// Add a response interceptor
+instance.interceptors.response.use(
+ (response) => {
+ if (response.data.code === 10000)
+ message.success(`接口: ${response.config.url}, 请求成功`);
+ return response?.data;
+ },
+ (error) => {
+ message.error(error);
+ return Promise.reject(error);
+ }
+);
+
+export default instance;
diff --git a/apps/admin/src/view/Course/Create/Appendix.tsx b/apps/admin/src/view/Course/Create/Appendix.tsx
new file mode 100644
index 0000000..3dc89ff
--- /dev/null
+++ b/apps/admin/src/view/Course/Create/Appendix.tsx
@@ -0,0 +1,5 @@
+const Appendix = () => {
+ return
附件
;
+};
+
+export default Appendix;
diff --git a/apps/admin/src/view/Course/Create/BasicForm/index.less b/apps/admin/src/view/Course/Create/BasicForm/index.less
new file mode 100644
index 0000000..45b7cb2
--- /dev/null
+++ b/apps/admin/src/view/Course/Create/BasicForm/index.less
@@ -0,0 +1,30 @@
+.preview-course {
+ position: relative;
+ background-size: cover;
+ background-position: center;
+ border-radius: 6px;
+ height: 100%;
+ .mask {
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ width: 60%;
+ transform: translate(-50%, -50%);
+ p {
+ color: #fff;
+ text-align: center;
+ margin: 0;
+ &.title {
+ background: rgba(0, 0, 0, 0.7);
+ font-size: 22px;
+ padding: 10px;
+ line-height: 1.5;
+ }
+ &.summary {
+ background: rgba(0, 0, 0, 0.3);
+ padding: 6px;
+ line-height: 1.4;
+ }
+ }
+ }
+}
diff --git a/apps/admin/src/view/Course/Create/BasicForm/index.tsx b/apps/admin/src/view/Course/Create/BasicForm/index.tsx
new file mode 100644
index 0000000..2d0c298
--- /dev/null
+++ b/apps/admin/src/view/Course/Create/BasicForm/index.tsx
@@ -0,0 +1,112 @@
+import { InboxOutlined } from "@ant-design/icons";
+import {
+ Card,
+ Col,
+ Form,
+ Input,
+ message,
+ Row,
+ Upload,
+ UploadProps,
+} from "antd";
+import { useState } from "react";
+import "./index.less";
+const { Dragger } = Upload;
+const { Meta } = Card;
+
+interface IProps {
+ onChange: Function;
+}
+
+const BasicForm = (props: IProps) => {
+ const [preview, setPreivew] = useState({
+ coverUrl: "",
+ title: "标题",
+ summary: "摘要",
+ });
+ const [form] = Form.useForm();
+
+ const onValuesChange = (_: any, all: any) => {
+ setPreivew((p) => ({ ...p, ...all }));
+ };
+
+ const coverDragger: UploadProps = {
+ name: "file",
+ multiple: true,
+ action: "/api/upload",
+ onChange(info) {
+ const { status } = info.file;
+ if (status !== "uploading") console.log(info.file, info.fileList);
+ if (status === "done") {
+ const { code, data } = info.file.response;
+ if (code === 10000) {
+ message.success(`${info.file.name} 文件上传成功`);
+ const { MediaUrl } = data;
+ setPreivew((p) => ({ ...p, coverUrl: MediaUrl }));
+ }
+ } else if (status === "error") {
+ message.error(`${info.file.name} 文件上传失败`);
+ }
+ },
+ onDrop(e) {
+ console.log("Dropped files", e.dataTransfer.files);
+ },
+ };
+
+ return (
+
+
+
+
+
+
+
+
+ 点击或拖拽文件到此区域上传
+ 支持单个或批量上传
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{preview.title}
+
{preview.summary}
+
+
+
+
+
+ );
+};
+
+export default BasicForm;
diff --git a/apps/admin/src/view/Course/Create/MediaBind.tsx b/apps/admin/src/view/Course/Create/MediaBind.tsx
new file mode 100644
index 0000000..570af27
--- /dev/null
+++ b/apps/admin/src/view/Course/Create/MediaBind.tsx
@@ -0,0 +1,5 @@
+const MediaBind = () => {
+ return 123
;
+};
+
+export default MediaBind;
diff --git a/apps/admin/src/view/Course/Create/index.less b/apps/admin/src/view/Course/Create/index.less
new file mode 100644
index 0000000..8b3790a
--- /dev/null
+++ b/apps/admin/src/view/Course/Create/index.less
@@ -0,0 +1,8 @@
+.create-course {
+ display: flex;
+ flex-direction: column;
+ .content {
+ padding: 20px 0;
+ flex: 1;
+ }
+}
diff --git a/apps/admin/src/view/Course/Create/index.tsx b/apps/admin/src/view/Course/Create/index.tsx
index 13e0a98..e4628fc 100644
--- a/apps/admin/src/view/Course/Create/index.tsx
+++ b/apps/admin/src/view/Course/Create/index.tsx
@@ -1,9 +1,67 @@
-import { Button, Form, Input, InputNumber, Row, Space } from "antd";
+import {
+ Button,
+ Form,
+ Input,
+ InputNumber,
+ message,
+ Row,
+ Space,
+ Steps,
+} from "antd";
+import { useState } from "react";
+import Appendix from "./Appendix";
+import BasicForm from "./BasicForm";
+import "./index.less";
+import MediaBind from "./MediaBind";
const CourseCreate = () => {
+ const [current, setCurrent] = useState(0);
+ const steps = [
+ {
+ title: "基本信息",
+ content: ,
+ },
+ {
+ title: "媒体资源",
+ content: ,
+ },
+ {
+ title: "附件",
+ content: ,
+ },
+ ];
+
+ const items = steps.map((item) => ({ key: item.title, title: item.title }));
+
return (
-