GD6i+5a?NuulxRyV
zEfC%T8Hb#NjN!(ja^tf+-Ntd_ZdD7zUb#Cd3H5gKU);)_j?RvV*Kh202<>AG0XgG#
z&JTFI)?QCgIl1F~J$$dOXDA-N4RUW_vOba(284wr6>l6;A|v%1_Hx{MEzWJ
z81vW7L_6!cXNc7Qs+Rx>MO#r0BXZ07Tk9=yU7P3E^}D~Bb`u-O#{_O-kQpmC=x=bt
zeQtgCVo|wg;3A64_y2!%`ww?I=FRDO?|7~xAn)Y<1bx=Lh{fHDlBi4SozNSR8DeVE
zqK}vQ^a%}iE5V>MIsN$14LR@Laiq%O6!E6}SD-lqFO1_1r}iZYBqfmmsAcHWmroa!
zYTZnoT6uBwhuJ9hTUsuVIGo9wX&JnDPAy2ksgPYxPB|hI7rEXi$F$8VQ5;UXDP0b1
zfqCXs*XV}ln!sO3z!y?q>`xvaFBZJAlCjeX@DW4D?rz
zMmJ1+NSRMw>bpF7K~>Oe&MEGI4f_WSR|#;gU1aC96xoEYT?>L&dTfEU|!8nioE
zp0@=^zIY|l$00Ck?4>V}wv=b?PbpTun>VY%pBsCENmeW`p
z5G>X{FDi{g?blaN@6D2@+P$rR%ifUm^_LihplYhq{65
z>x)*~GM=I0&%oWG2#!GKJaW}!6b?lU#o>Q4I-=@LBDm&7HT&VVrsa<_A&?d2h>0>C
zCXvQ;VZUZdj5AXvJ(y}63uD(P-N#{31&n*rV^H*-VZ1-Y57~b}0`?!7L@lEf_Lq$I
z8Q_yM=HY(x#?S(*Zi5OYCnvQez5Rx7q3fS6=N^*I(mi?poD;gmbf!g%NyZjG=g+c_0xk5Mx4>X7{kx@ecVQ5|Wo%Q*^D*IJ?)~xD;id
Gn~X-C@!f?0
literal 4328
zcmV3X9t2Q8x0wwqK1-IaAbc`U>nl|F9I=|
z^rU>AMl62)%fv%(6kQAxCsp)QN8c0pr
zNrOULa+{ULe;1c2&>)OvC4M?+|7$F%J8A9j+e6b|3)^
z?1_cy;zxbyi(ns^*{Z0155@4P6vAR8czYUcc_=6JXOpxt>OVX-Dg2;7Y_67+ViMoXBY)AqHUXs&QR8l4TswEtwXJw
zgjv)w%CV`|jui&7W9XLhjq!pQ4s~POEf_Io03RL5vSB6`>k<;fhp?2Zxp6r^m#D?L
zno{_EF4l2I%aU{rqoz9RwGj$vH`XwWPsH4=nT~e*s(Qc*5Qk8%}~U58qehNyC;F!2x>vg3L_pBudW8ZH#*rdqMM2IiyrizF41+woff
z5*iv0%nzMw1pu6q5qVGbyaQN4c*|#5hSB*HJ-}BoC(d5HdlQk%>Ei;U>j1jrum&QE
z&Y(mFu&1vu9L7$iE&&b#&g3}WO0rzAm}1HXfyF-(QIZAWiFoR{tLiII>u1IT(6PBvt(
zBI3^{eGZ*^d_{LhpenrhQSSS%o
z;H{Xoxh#-U305NEs=`(CYXP*FsvwePWu&%~Qpxo?htX}uzV-;9!cGA!8b3=;xIwUM
zAvs8*C8LV@R9Ivs5n9mQ=0ii6&q#5gD40%J1z3<27eJPfDtD#p+|a+F!Z}UQQ?O|7
z@R$L+Qll_Z%`JR~)_7H#N~dNX5%mzs=P6`7CksLco!U66h!*UdRgb5yqp*Lo;pF}~
zpwM_9Z?a1QlJTwLjI++;>Qxq>I3un!o7~J2%;=qkTE=D#A0fgg6H&8gS2tJ$_y7@I
z>u#6Wlz7C6)D1B@albI*5`30)F?#eM)ye9cy{uS*rnTsaX#G%A41mP&&(2Zv{s1a>
zrMGvFIzc7K%?7PrY$y(*yj#?KPd?J=V)W&F53iOpEv-EeFBB9y`H
zVZs^)^$OA{!4^`3PYf9>2I7sbZq%(>MGQ(@$L1;)uq4gIdb)x^EP9cFP?t>B?_xya
zogAABVNS$&lZ@Q0*jIp5{_`BH}x7iwm1
zuD{1lVk^Uu2;yAM&4?yF)(GaN1U-Th$HA220gG2Sw@~KNMuOPMi^H;u5b+Jxh?E|4
z)L4W$k*s4v3@!-MPZxKJL=FzhiFS9aZW&M*T0M|BW_2Wb4Db9cSMsxL2!wK
zF`QXQ2S;7sGGXG36S2goah)((y!|3tQH}$%YBcG<^z#8G)}m*B}JdE+nox@9L6x>$ZTc5zm6
z(AAyN8Yi2I4ue+L2NBwUuL&XS*>T6`!_EP0#}L`28368$wdKBG`Xb~LPAVaLSBP%O
z`bwCYCfTKrQut87xpz4VfI}nWHVTuwb1HCWew+!JA
zW}fA8d2&jzz*N&!NV>J1!Wn&vY(?W`6AH_Um6+JOiA;4%;WMNd)0_TBmDtb(xYp##5X%d
z0cpC2@FC-y(j#@cX#GlqF6!N&L3Y-JfQxMZ?xg^9O9!;ixEJ#BEUs{gbuq-{ndJYv
z`$oMQS^+0#jY~|93#HW?rBb(@dbj!R#yv<>>}KDv%={~PHH)9nCG!t-jmx1w6oA>8
zCEf(#Zo+8LXXBD9REBT2pD;U2&nNrb5A{hYGO+YVv`mT{Cc)&vj7;x5;!;P(9oggU
z5W4)E1MzUzK#?n9^5^NF);x)OF;yL)%)QuG;Drxak;m@`dv`m+*i|@vH2!onkMI{n
z!BLfthY$J{T@4z@R*0Z*dp?ItncQ1oP60iVKirS`*>|)#RuIs5!Vc|PG)u?aA3_~m
zwn7Lwo@s4MgI|o{lH&@nJI2U;FrxWFdeN&2EGS~?)+@Z&B;1~AK2ymiVfJ*NB{D~W
zl8s97J-vy_4M~{F<=_7)*Dz+A=o3IPzUz7qHQqAEIQsP(6N66is(5%=YqS(W9KX
zh{gVuhHqkeo}S-;@a>>Vpx3bOmr{Ze<)<#|5=+5O#Vs~RC87^9ip!-#L^q;{S^?2Z
zXkje=!8!dq*5g+RRU9IXta*v#3nSEz6WE*-W{Hk#SCe7+QFubOV8V<5cka=k5-4|%
zP;K7J9Ja8A>uhSi{3QE`8vmx{G-CXWf|-=mwG44QZH!a{tu!52Q^t;@<$tVnU#WK+
z?`|riLcgz_ggeh|DO@YX;~ln1Y4LjY6d}bsG|!2=uvky{W*e-)zwCL
z+qGCv%fQrpJP1WYq}(0A-gpSO}M|SgNDp2f!t
zW#A#PVwEG=jH`$p|Gl@;VfIdsowMC%r+Wmu%t&5M6|0IOi&Ub2v(;g6)ZqgjlivWr=a>>XsyVMVLGh4Om4^KJwz8CZYCmp&=
z#S2MG!sStm40Qe@V~g<-pKe$bCHJSyB;JLCaEH0$RlB={N4U$}C1fS7PdOMbVUNA{
zr(@fCG!{*L{kQF!zDLKS74{r7)IJ@Xiwa&dSI!gSA@#e;znrOJzsYolze(*%R!h
zqv|tt5p1eT^r2dE5Io7A#^+5cV0;deynv=(Zba|IN-A^Yb
z?QwUh!{4Zgn4a0_xjW&K+c2;w#4GOTgtz20Sb_h0%Wuy_F~$zOlW$G%DOji|?3(;;
zU~JUsbIb!1mO>xUtLNvO`tRdqUEzSyHTle`YCFd*OCPC1O)i^^n&q7qF!71!xaw1P
zM!EwN2Y{pzQMXRzT)67K6$_P)X
zGO2(`kcEbHmPDV6f|6>OeNdEB4G5is(jERR7)rPjf??%-Gohq8uWSs8^uci~x3NzC*|dPKc=Tp6
z^=}kO8q}kweRSc3wU3Esmcb7$?myCAjbv!l8=wOY6Kb^B3Ua+J+61c`t%R)%2eMWw
zL@ciAhelxS^O7y;jIOVBQhH!j?o;q^->yx_xk3`|_qAC&XXnqU3Hqoqz|uR`O4-L+
zr|1_9?qA^H{=GJ#=@*i4|67~&nF(h(%cv7V$*4uE6i)fvIDmt}-k~j0NoDCzNYNox
zG^+J{?gi#ZeF$RLHkpkumniz6`|`i`f;D9F2@vOMEOyT
zK@w*Oy@zB?(#qMW9gh`h!zjklKdrr9ySnW&oB%aavh`HTF~+40Qz93-giX%JQ4E<~
WZab|AGREg5Js~SbrPNzrFaQ9uw?PyD
diff --git a/src/compenents/index.ts b/src/compenents/index.ts
index 8143d58..6fb5c12 100644
--- a/src/compenents/index.ts
+++ b/src/compenents/index.ts
@@ -11,3 +11,5 @@ export * from "./duration-text";
export * from "./upload-video-sub";
export * from "./select-resource";
export * from "./upload-courseware-button";
+export * from "./upload-courseware-sub";
+export * from "./select-attachment";
diff --git a/src/compenents/select-attachment/index.tsx b/src/compenents/select-attachment/index.tsx
new file mode 100644
index 0000000..2129965
--- /dev/null
+++ b/src/compenents/select-attachment/index.tsx
@@ -0,0 +1,77 @@
+import { useEffect, useState } from "react";
+import { Button, Row, Modal, message, Tabs } from "antd";
+import styles from "./index.module.less";
+import { UploadCoursewareSub } from "../../compenents";
+import type { TabsProps } from "antd";
+
+interface VideoItem {
+ id: number;
+ category_id: number;
+ name: string;
+ duration: number;
+}
+
+interface PropsInterface {
+ defaultKeys: any[];
+ open: boolean;
+ onSelected: (arr: any[], videos: any[]) => void;
+ onCancel: () => void;
+}
+
+export const SelectAttachment = (props: PropsInterface) => {
+ const [refresh, setRefresh] = useState(true);
+ const [tabKey, setTabKey] = useState(1);
+ const [selectKeys, setSelectKeys] = useState([]);
+ const [selectVideos, setSelectVideos] = useState([]);
+
+ const items: TabsProps["items"] = [
+ {
+ key: "1",
+ label: `课件`,
+ children: (
+
+ {
+ setSelectKeys(arr);
+ setSelectVideos(videos);
+ }}
+ />
+
+ ),
+ },
+ ];
+
+ const onChange = (key: string) => {
+ setTabKey(Number(key));
+ };
+
+ return (
+ <>
+ {
+ setSelectKeys([]);
+ setSelectVideos([]);
+ props.onCancel();
+ }}
+ open={props.open}
+ width={800}
+ maskClosable={false}
+ onOk={() => {
+ props.onSelected(selectKeys, selectVideos);
+ setSelectKeys([]);
+ setSelectVideos([]);
+ }}
+ >
+
+
+
+
+ >
+ );
+};
diff --git a/src/compenents/upload-courseware-sub/index.module.less b/src/compenents/upload-courseware-sub/index.module.less
new file mode 100644
index 0000000..e69de29
diff --git a/src/compenents/upload-courseware-sub/index.tsx b/src/compenents/upload-courseware-sub/index.tsx
new file mode 100644
index 0000000..23d7985
--- /dev/null
+++ b/src/compenents/upload-courseware-sub/index.tsx
@@ -0,0 +1,242 @@
+import { useEffect, useState } from "react";
+import { Checkbox, Row, Col, Empty, message, Pagination } from "antd";
+import { resource } from "../../api";
+import styles from "./index.module.less";
+import { TreeCategory, UploadCoursewareButton } from "../../compenents";
+import type { CheckboxChangeEvent } from "antd/es/checkbox";
+import type { CheckboxValueType } from "antd/es/checkbox/Group";
+
+const CheckboxGroup = Checkbox.Group;
+
+interface VideoItem {
+ id: number;
+ category_id: number;
+ name: string;
+}
+
+interface PropsInterface {
+ defaultCheckedList: any[];
+ label: string;
+ open: boolean;
+ onSelected: (arr: any[], videos: []) => void;
+}
+
+export const UploadCoursewareSub = (props: PropsInterface) => {
+ const [category_ids, setCategoryIds] = useState([]);
+ const [loading, setLoading] = useState(false);
+ const [videoList, setVideoList] = useState([]);
+ const [existingTypes, setExistingTypes] = useState([]);
+ const [refresh, setRefresh] = useState(false);
+ const [page, setPage] = useState(1);
+ const [size, setSize] = useState(10);
+ const [total, setTotal] = useState(0);
+
+ const [plainOptions, setPlainOptions] = useState([]);
+ const [checkedList, setCheckedList] = useState([]);
+ const [indeterminate, setIndeterminate] = useState(false);
+ const [checkAll, setCheckAll] = useState(false);
+
+ // 获取列表
+ const getvideoList = (defaultKeys: any[]) => {
+ let categoryIds = category_ids.join(",");
+ resource
+ .resourceList(
+ page,
+ size,
+ "",
+ "",
+ "",
+ "WORD,EXCEL,PPT,PDF,TXT,RAR,ZIP",
+ categoryIds
+ )
+ .then((res: any) => {
+ setTotal(res.data.result.total);
+ setExistingTypes(res.data.existing_types);
+ setVideoList(res.data.result.data);
+ let data = res.data.result.data;
+ const arr = [];
+ for (let i = 0; i < data.length; i++) {
+ arr.push({
+ label: (
+
+
+
{data[i].name}
+
{data[i].type}
+
+ ),
+ value: data[i].id,
+ disabled: false,
+ });
+ }
+ if (defaultKeys.length > 0 && arr.length > 0) {
+ for (let i = 0; i < defaultKeys.length; i++) {
+ for (let j = 0; j < arr.length; j++) {
+ if (arr[j].value === defaultKeys[i]) {
+ arr[j].disabled = true;
+ }
+ }
+ }
+ }
+ setPlainOptions(arr);
+ })
+ .catch((err) => {
+ console.log("错误,", err);
+ });
+ };
+ // 重置列表
+ const resetVideoList = () => {
+ setPage(1);
+ setVideoList([]);
+ setRefresh(!refresh);
+ };
+
+ // 加载列表
+ useEffect(() => {
+ const arr = [...props.defaultCheckedList];
+ setCheckedList(arr);
+ if (arr.length === 0) {
+ setIndeterminate(false);
+ setCheckAll(false);
+ }
+ getvideoList(arr);
+ }, [props.open, props.defaultCheckedList, category_ids, refresh, page, size]);
+
+ const onChange = (list: CheckboxValueType[]) => {
+ setCheckedList(list);
+ setIndeterminate(!!list.length && list.length < plainOptions.length);
+ setCheckAll(list.length === plainOptions.length);
+ const defalut = [...props.defaultCheckedList];
+ let localKeys: any = [];
+ list.map((item: any) => {
+ if (defalut.indexOf(item) === -1) {
+ localKeys.push(item);
+ }
+ });
+
+ let arrVideos: any = [];
+
+ for (let i = 0; i < localKeys.length; i++) {
+ videoList.map((item: any, index: number) => {
+ if (item.id === localKeys[i]) {
+ arrVideos.push({
+ name: item.name,
+ type: item.type,
+ rid: item.id,
+ disabled: plainOptions[index].disabled,
+ });
+ }
+ });
+ }
+ props.onSelected(localKeys, arrVideos);
+ };
+
+ const onCheckAllChange = (e: CheckboxChangeEvent) => {
+ const arr = plainOptions.map((item: any) => item.value);
+ setCheckedList(e.target.checked ? arr : []);
+ setIndeterminate(false);
+ setCheckAll(e.target.checked);
+ const defalut = [...props.defaultCheckedList];
+ let localKeys: any = [];
+ arr.map((item: any) => {
+ if (defalut.indexOf(item) === -1) {
+ localKeys.push(item);
+ }
+ });
+ let arrVideos: any = [];
+ for (let i = 0; i < localKeys.length; i++) {
+ videoList.map((item: any, index: number) => {
+ if (item.id === localKeys[i]) {
+ arrVideos.push({
+ name: item.name,
+ type: item.type,
+ rid: item.id,
+ disabled: plainOptions[index].disabled,
+ });
+ }
+ });
+ }
+ if (e.target.checked) {
+ props.onSelected(localKeys, arrVideos);
+ } else {
+ props.onSelected([], []);
+ }
+ };
+
+ return (
+ <>
+
+
+ setCategoryIds(keys)}
+ />
+
+
+
+
+ {
+ resetVideoList();
+ }}
+ >
+
+
+
+ {videoList.length === 0 && (
+
+
+
+ )}
+ {videoList.length > 0 && (
+
+
+ 全选
+
+
+
+ )}
+
+
+ {videoList.length > 0 && total > 10 && (
+
+ {
+ setPage(currentPage);
+ setSize(currentSize);
+ }}
+ defaultCurrent={page}
+ total={total}
+ />
+
+ )}
+
+
+
+ >
+ );
+};
diff --git a/src/index.less b/src/index.less
index 2931939..5858831 100644
--- a/src/index.less
+++ b/src/index.less
@@ -596,6 +596,7 @@ textarea.ant-input {
.ant-checkbox-wrapper {
margin-inline-start: 0px;
height: 38px;
+ align-items: center !important;
}
.video-title {
@@ -660,3 +661,26 @@ textarea.ant-input {
transform: rotate(90deg);
}
}
+
+.drop-item {
+ width: 140px;
+ height: 32px;
+ display: flex;
+ align-items: center;
+ cursor: pointer;
+ &.active {
+ i {
+ transform: rotate(180deg);
+ }
+ }
+ i {
+ margin-right: 12px;
+ }
+ span {
+ font-size: 12px;
+ font-weight: 400;
+ color: rgba(0, 0, 0, 0.45);
+ line-height: 32px;
+ }
+}
+
diff --git a/src/pages/course/compenents/attachments.tsx b/src/pages/course/compenents/attachments.tsx
new file mode 100644
index 0000000..5a0aa58
--- /dev/null
+++ b/src/pages/course/compenents/attachments.tsx
@@ -0,0 +1,157 @@
+import { message, Tree, Tooltip } from "antd";
+import { useState, useEffect } from "react";
+import type { DataNode, TreeProps } from "antd/es/tree";
+
+interface Option {
+ id: number;
+ name: string;
+}
+
+interface PropInterface {
+ data: Option[];
+ onRemoveItem: (id: number) => void;
+ onUpdate: (arr: any[]) => void;
+}
+
+export const TreeAttachments = (props: PropInterface) => {
+ const [treeData, setTreeData] = useState([]);
+ const [loading, setLoading] = useState(true);
+ useEffect(() => {
+ const hours = props.data;
+ if (hours.length === 0) {
+ return;
+ }
+ checkTree(hours);
+ }, [props.data]);
+
+ const checkTree = (hours: any) => {
+ const arr = [];
+ for (let i = 0; i < hours.length; i++) {
+ arr.push({
+ title: (
+
+
+
+
+
+
removeItem(hours[i].rid)}
+ />
+
+ ),
+ key: hours[i].rid,
+ });
+ }
+ setTreeData(arr);
+ };
+
+ const removeItem = (id: number) => {
+ if (id === 0) {
+ return;
+ }
+ props.onRemoveItem(id);
+ };
+ const onDrop: TreeProps["onDrop"] = (info) => {
+ const dropKey = info.node.key;
+ const dragKey = info.dragNode.key;
+ const dropPos = info.node.pos.split("-");
+ const dropPosition =
+ info.dropPosition - Number(dropPos[dropPos.length - 1]);
+ const loop = (
+ data: DataNode[],
+ key: React.Key,
+ callback: (node: DataNode, i: number, data: DataNode[]) => void
+ ) => {
+ for (let i = 0; i < data.length; i++) {
+ if (data[i].key === key) {
+ return callback(data[i], i, data);
+ }
+ if (data[i].children) {
+ loop(data[i].children!, key, callback);
+ }
+ }
+ };
+ const data = [...treeData];
+ let isTop = false;
+
+ for (let i = 0; i < data.length; i++) {
+ if (data[i].key === dragKey) {
+ isTop = true;
+ }
+ }
+
+ // Find dragObject
+ let dragObj: DataNode;
+ loop(data, dragKey, (item, index, arr) => {
+ arr.splice(index, 1);
+ dragObj = item;
+ });
+
+ if (!info.dropToGap) {
+ // Drop on the content
+ loop(data, dropKey, (item) => {
+ item.children = item.children || [];
+ // where to insert 示例添加到头部,可以是随意位置
+ item.children.unshift(dragObj);
+ });
+ } else if (
+ ((info.node as any).props.children || []).length > 0 && // Has children
+ (info.node as any).props.expanded && // Is expanded
+ dropPosition === 1 // On the bottom gap
+ ) {
+ loop(data, dropKey, (item) => {
+ item.children = item.children || [];
+ // where to insert 示例添加到头部,可以是随意位置
+ item.children.unshift(dragObj);
+ // in previous version, we use item.children.push(dragObj) to insert the
+ // item to the tail of the children
+ });
+ } else {
+ let ar: DataNode[] = [];
+ let i: number;
+ loop(data, dropKey, (_item, index, arr) => {
+ ar = arr;
+ i = index;
+ });
+ if (dropPosition === -1) {
+ ar.splice(i!, 0, dragObj!);
+ } else {
+ ar.splice(i! + 1, 0, dragObj!);
+ }
+ }
+ setTreeData(data);
+ const keys = data.map((item: any) => item.key);
+ props.onUpdate(keys);
+ };
+
+ const onDragEnter: TreeProps["onDragEnter"] = (info) => {
+ console.log(info);
+ };
+
+ return (
+
+
+
+ );
+};
diff --git a/src/pages/course/compenents/create.tsx b/src/pages/course/compenents/create.tsx
index 1d82990..79989cd 100644
--- a/src/pages/course/compenents/create.tsx
+++ b/src/pages/course/compenents/create.tsx
@@ -14,9 +14,14 @@ import {
import styles from "./create.module.less";
import { useSelector } from "react-redux";
import { course, department } from "../../../api/index";
-import { UploadImageButton, SelectResource } from "../../../compenents";
+import {
+ UploadImageButton,
+ SelectResource,
+ SelectAttachment,
+} from "../../../compenents";
import { ExclamationCircleFilled } from "@ant-design/icons";
import { TreeHours } from "./hours";
+import { TreeAttachments } from "./attachments";
const { confirm } = Modal;
@@ -58,6 +63,10 @@ export const CourseCreate: React.FC = ({
const [videoVisible, setVideoVisible] = useState(false);
const [treeData, setTreeData] = useState([]);
const [addvideoCurrent, setAddvideoCurrent] = useState(0);
+ const [showDrop, setShowDrop] = useState(false);
+ const [attachmentVisible, setAttachmentVisible] = useState(false);
+ const [attachmentData, setAttachmentData] = useState([]);
+ const [attachments, setAttachments] = useState([]);
useEffect(() => {
if (open) {
@@ -80,6 +89,7 @@ export const CourseCreate: React.FC = ({
setChapterHours([]);
setHours([]);
setTreeData([]);
+ setAttachmentData([]);
}, [form, open]);
const getParams = () => {
@@ -225,7 +235,7 @@ export const CourseCreate: React.FC = ({
values.category_ids,
chapters,
treeData,
- []
+ attachmentData
)
.then((res: any) => {
message.success("保存成功!");
@@ -269,6 +279,20 @@ export const CourseCreate: React.FC = ({
setVideoVisible(false);
};
+ const selectAttachmentData = (arr: any, videos: any) => {
+ if (arr.length === 0) {
+ message.error("请选择课件");
+ return;
+ }
+ let keys = [...attachments];
+ let data = [...attachmentData];
+ keys = keys.concat(arr);
+ data = data.concat(videos);
+ setAttachments(keys);
+ setAttachmentData(data);
+ setAttachmentVisible(false);
+ };
+
const getChapterType = (e: any) => {
const arr = [...chapters];
if (arr.length > 0) {
@@ -327,6 +351,36 @@ export const CourseCreate: React.FC = ({
setTreeData(newArr);
};
+ const delAttachments = (id: number) => {
+ const data = [...attachmentData];
+ const index = data.findIndex((i: any) => i.rid === id);
+ if (index >= 0) {
+ data.splice(index, 1);
+ }
+ if (data.length > 0) {
+ setAttachmentData(data);
+ const keys = data.map((item: any) => item.rid);
+ setAttachments(keys);
+ } else {
+ setAttachmentData([]);
+ setAttachments([]);
+ }
+ };
+
+ const transAttachments = (arr: any) => {
+ setAttachments(arr);
+ const data = [...attachmentData];
+ const newArr: any = [];
+ for (let i = 0; i < arr.length; i++) {
+ data.map((item: any) => {
+ if (item.rid === arr[i]) {
+ newArr.push(item);
+ }
+ });
+ }
+ setAttachmentData(newArr);
+ };
+
const addNewChapter = () => {
const arr = [...chapters];
const keys = [...chapterHours];
@@ -446,6 +500,16 @@ export const CourseCreate: React.FC = ({
}
}}
/>
+ {
+ setAttachmentVisible(false);
+ }}
+ onSelected={(arr: any, videos: any) => {
+ selectAttachmentData(arr, videos);
+ }}
+ >
-
-
= ({
{chapterType === 0 && (
-
+
)}
{chapterType === 1 && (
-
+
{chapters.length > 0 &&
chapters.map((item: any, index: number) => {
return (
@@ -738,6 +794,54 @@ export const CourseCreate: React.FC
= ({
)}
+
+ setShowDrop(!showDrop)}
+ >
+
+ (课程简介、课件)
+
+
+
+
+
+
+
+
+
+
+ {attachmentData.length === 0 && (
+
+ 请点击上方按钮添加课件
+
+ )}
+ {attachmentData.length > 0 && (
+ {
+ delAttachments(id);
+ }}
+ onUpdate={(arr: any[]) => {
+ transAttachments(arr);
+ }}
+ />
+ )}
+
+
From c0994dc29bb13198e9befd43ae68e52143ef18d5 Mon Sep 17 00:00:00 2001
From: unknown <18119604035@163.com>
Date: Sat, 29 Jul 2023 15:33:14 +0800
Subject: [PATCH 22/40] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E8=AF=BE=E7=A8=8B?=
=?UTF-8?q?=E8=AF=BE=E4=BB=B6=E7=BC=96=E8=BE=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/api/course-attachment.ts | 22 +-
src/api/internal/httpClient.ts | 2 +-
.../compenents/attachment-update.module.scss | 43 ++++
.../course/compenents/attachment-update.tsx | 219 ++++++++++++++++++
src/pages/course/compenents/create.tsx | 6 -
src/pages/course/compenents/hour-update.tsx | 8 +-
src/pages/course/compenents/update.tsx | 8 -
src/pages/course/index.tsx | 28 +++
8 files changed, 302 insertions(+), 34 deletions(-)
create mode 100644 src/pages/course/compenents/attachment-update.module.scss
create mode 100644 src/pages/course/compenents/attachment-update.tsx
diff --git a/src/api/course-attachment.ts b/src/api/course-attachment.ts
index dae980a..8629805 100644
--- a/src/api/course-attachment.ts
+++ b/src/api/course-attachment.ts
@@ -1,22 +1,20 @@
import client from "./internal/httpClient";
-export function updateCourseAttachment(
+export function storeCourseAttachmentMulti(
courseId: number,
- id: number,
- chapterId: number,
- name: string,
- type: string,
- rid: number
+ attachments: number[]
) {
- return client.put(`/backend/v1/course/${courseId}/attachment/create-batch`, {
- chapter_id: chapterId,
- name,
- type,
- sort: 0,
- rid,
+ return client.post(`/backend/v1/course/${courseId}/attachment/create-batch`, {
+ attachments: attachments,
});
}
export function destroyAttachment(courseId: number, id: number) {
return client.destroy(`/backend/v1/course/${courseId}/attachment/${id}`);
}
+
+export function transCourseAttachment(courseId: number, ids: number[]) {
+ return client.put(`/backend/v1/course/${courseId}/attachment/update/sort`, {
+ ids: ids,
+ });
+}
diff --git a/src/api/internal/httpClient.ts b/src/api/internal/httpClient.ts
index 8c75dee..a029412 100644
--- a/src/api/internal/httpClient.ts
+++ b/src/api/internal/httpClient.ts
@@ -8,7 +8,7 @@ const GoLogin = () => {
};
const GoError = () => {
- window.location.href = "/error";
+ // window.location.href = "/error";
};
export class HttpClient {
diff --git a/src/pages/course/compenents/attachment-update.module.scss b/src/pages/course/compenents/attachment-update.module.scss
new file mode 100644
index 0000000..cc25058
--- /dev/null
+++ b/src/pages/course/compenents/attachment-update.module.scss
@@ -0,0 +1,43 @@
+.hous-box {
+ width: 500.53px;
+ min-height: 56px;
+ background: #ffffff;
+ border-radius: 6px;
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ /* Firefox */
+ -webkit-box-sizing: border-box;
+ /* Safari */
+ padding: 8px 8px 0px 8px;
+ margin-left: 42px;
+ display: flex;
+ flex-direction: column;
+ .no-hours {
+ height: 24px;
+ font-size: 14px;
+ font-weight: 400;
+ color: rgba(0, 0, 0, 0.25);
+ line-height: 24px;
+ margin-top: 8px;
+ }
+}
+.top-content {
+ width: 502px;
+ height: auto;
+ background: rgba(255, 77, 79, 0.1);
+ border-radius: 6px;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ box-sizing: border-box;
+ padding: 8px 16px;
+ margin: 0 auto;
+ p {
+ font-size: 14px;
+ font-weight: 400;
+ color: #ff4d4f;
+ line-height: 24px;
+ margin: 0;
+ }
+}
diff --git a/src/pages/course/compenents/attachment-update.tsx b/src/pages/course/compenents/attachment-update.tsx
new file mode 100644
index 0000000..a21cde4
--- /dev/null
+++ b/src/pages/course/compenents/attachment-update.tsx
@@ -0,0 +1,219 @@
+import React, { useState, useEffect } from "react";
+import { Button, Drawer, Form, Modal, message } from "antd";
+import styles from "./hour-update.module.less";
+import { course, courseAttachment } from "../../../api/index";
+import { SelectAttachment } from "../../../compenents";
+import { ExclamationCircleFilled } from "@ant-design/icons";
+import { TreeAttachments } from "./attachments";
+
+const { confirm } = Modal;
+
+interface PropInterface {
+ id: number;
+ open: boolean;
+ onCancel: () => void;
+}
+
+export const CourseAttachmentUpdate: React.FC = ({
+ id,
+ open,
+ onCancel,
+}) => {
+ const [form] = Form.useForm();
+ const [attachmentVisible, setAttachmentVisible] = useState(false);
+ const [attachmentData, setAttachmentData] = useState([]);
+ const [attachments, setAttachments] = useState([]);
+
+ useEffect(() => {
+ if (id === 0) {
+ return;
+ }
+ getDetail();
+ }, [id, open]);
+
+ const getDetail = () => {
+ course.course(id).then((res: any) => {
+ let treeData = res.data.attachments;
+ if (treeData.length > 0) {
+ const arr: any = resetAttachments(treeData).arr;
+ const keys: any = resetAttachments(treeData).keys;
+ setAttachmentData(arr);
+ setAttachments(keys);
+ }
+ });
+ };
+
+ const resetAttachments = (data: any) => {
+ const arr: any = [];
+ const keys: any = [];
+ if (data) {
+ for (let i = 0; i < data.length; i++) {
+ arr.push({
+ type: data[i].type,
+ name: data[i].title,
+ rid: data[i].rid,
+ id: data[i].id,
+ });
+ keys.push(data[i].rid);
+ }
+ }
+ return { arr, keys };
+ };
+
+ const onFinish = (values: any) => {};
+
+ const onFinishFailed = (errorInfo: any) => {
+ console.log("Failed:", errorInfo);
+ };
+
+ const selectAttachmentData = (arr: any, videos: any) => {
+ const hours: any = [];
+ for (let i = 0; i < videos.length; i++) {
+ if (videos[i].disabled === false) {
+ hours.push({
+ sort: attachmentData.length + i,
+ title: videos[i].name,
+ type: videos[i].type,
+ rid: videos[i].rid,
+ });
+ }
+ }
+ if (hours.length === 0) {
+ message.error("请选择视频");
+ return;
+ }
+ courseAttachment
+ .storeCourseAttachmentMulti(id, hours)
+ .then((res: any) => {
+ console.log("ok");
+ setAttachmentVisible(false);
+ getDetail();
+ })
+ .catch((err) => {
+ message.error(err.message);
+ });
+ };
+
+ const delAttachments = (hid: number) => {
+ const data = [...attachmentData];
+ confirm({
+ title: "操作确认",
+ icon: ,
+ content: "确认删除此课件?",
+ centered: true,
+ okText: "确认",
+ cancelText: "取消",
+ onOk() {
+ const index = data.findIndex((i: any) => i.rid === hid);
+ let delId = data[index].id;
+ if (index >= 0) {
+ data.splice(index, 1);
+ }
+ if (data.length > 0) {
+ setAttachmentData(data);
+ const keys = data.map((item: any) => item.rid);
+ setAttachments(keys);
+ } else {
+ setAttachmentData([]);
+ setAttachments([]);
+ }
+ if (delId) {
+ courseAttachment.destroyAttachment(id, delId).then((res: any) => {
+ console.log("ok");
+ });
+ }
+ },
+ onCancel() {
+ console.log("Cancel");
+ },
+ });
+ };
+
+ const transAttachments = (arr: any) => {
+ setAttachments(arr);
+ const data = [...attachmentData];
+ const newArr: any = [];
+ const hourIds: any = [];
+ for (let i = 0; i < arr.length; i++) {
+ data.map((item: any) => {
+ if (item.rid === arr[i]) {
+ newArr.push(item);
+ hourIds.push(item.id);
+ }
+ });
+ }
+ setAttachmentData(newArr);
+ courseAttachment.transCourseAttachment(id, hourIds).then((res: any) => {
+ console.log("ok");
+ });
+ };
+
+ return (
+ <>
+
+
+
1.线上课课件调整及时生效,操作不可逆,请谨慎操作。
+
+
+
{
+ setAttachmentVisible(false);
+ }}
+ onSelected={(arr: any, videos: any) => {
+ selectAttachmentData(arr, videos);
+ }}
+ >
+
+
+
+ >
+ );
+};
diff --git a/src/pages/course/compenents/create.tsx b/src/pages/course/compenents/create.tsx
index 79989cd..c67d186 100644
--- a/src/pages/course/compenents/create.tsx
+++ b/src/pages/course/compenents/create.tsx
@@ -32,12 +32,6 @@ interface PropInterface {
onCancel: () => void;
}
-interface Option {
- value: string | number;
- title: string;
- children?: Option[];
-}
-
export const CourseCreate: React.FC = ({
cateIds,
depIds,
diff --git a/src/pages/course/compenents/hour-update.tsx b/src/pages/course/compenents/hour-update.tsx
index 14d5f33..2c91660 100644
--- a/src/pages/course/compenents/hour-update.tsx
+++ b/src/pages/course/compenents/hour-update.tsx
@@ -1,5 +1,5 @@
import React, { useState, useEffect } from "react";
-import { Space, Button, Drawer, Form, Input, Modal, message } from "antd";
+import { Button, Drawer, Form, Input, Modal, message } from "antd";
import styles from "./hour-update.module.less";
import { course, courseHour, courseChapter } from "../../../api/index";
import { SelectResource } from "../../../compenents";
@@ -14,12 +14,6 @@ interface PropInterface {
onCancel: () => void;
}
-interface Option {
- value: string | number;
- label: string;
- children?: Option[];
-}
-
export const CourseHourUpdate: React.FC = ({
id,
open,
diff --git a/src/pages/course/compenents/update.tsx b/src/pages/course/compenents/update.tsx
index 41d6cb4..c36b3ae 100644
--- a/src/pages/course/compenents/update.tsx
+++ b/src/pages/course/compenents/update.tsx
@@ -16,20 +16,12 @@ import { useSelector } from "react-redux";
import { course, department } from "../../../api/index";
import { UploadImageButton } from "../../../compenents";
-const { confirm } = Modal;
-
interface PropInterface {
id: number;
open: boolean;
onCancel: () => void;
}
-interface Option {
- value: string | number;
- title: string;
- children?: Option[];
-}
-
export const CourseUpdate: React.FC = ({
id,
open,
diff --git a/src/pages/course/index.tsx b/src/pages/course/index.tsx
index a4643c1..5374f6b 100644
--- a/src/pages/course/index.tsx
+++ b/src/pages/course/index.tsx
@@ -27,6 +27,7 @@ import type { TabsProps } from "antd";
import { CourseCreate } from "./compenents/create";
import { CourseUpdate } from "./compenents/update";
import { CourseHourUpdate } from "./compenents/hour-update";
+import { CourseAttachmentUpdate } from "./compenents/attachment-update";
const { confirm } = Modal;
@@ -66,6 +67,8 @@ const CoursePage = () => {
const [createVisible, setCreateVisible] = useState(false);
const [updateVisible, setUpdateVisible] = useState(false);
const [updateHourVisible, setHourUpdateVisible] = useState(false);
+ const [updateAttachmentVisible, setUpdateAttachmentVisible] =
+ useState(false);
const [cid, setCid] = useState(0);
const [cateId, setCateId] = useState(Number(result.get("cid")));
const [did, setDid] = useState(Number(result.get("did")));
@@ -241,6 +244,23 @@ const CoursePage = () => {
},
{
key: "3",
+ label: (
+
+ ),
+ },
+ {
+ key: "4",
label: (
From 540d1e01e733cc75256a581571dabf079595a0da Mon Sep 17 00:00:00 2001
From: unknown <18119604035@163.com>
Date: Sat, 29 Jul 2023 15:37:18 +0800
Subject: [PATCH 23/40] =?UTF-8?q?http=E5=A4=87=E6=B3=A8=E8=BF=98=E5=8E=9F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/api/internal/httpClient.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/api/internal/httpClient.ts b/src/api/internal/httpClient.ts
index a029412..8c75dee 100644
--- a/src/api/internal/httpClient.ts
+++ b/src/api/internal/httpClient.ts
@@ -8,7 +8,7 @@ const GoLogin = () => {
};
const GoError = () => {
- // window.location.href = "/error";
+ window.location.href = "/error";
};
export class HttpClient {
From a6923632d1645d6ac0fe516cc4e7576d44d3a9d6 Mon Sep 17 00:00:00 2001
From: unknown <18119604035@163.com>
Date: Sat, 29 Jul 2023 17:27:21 +0800
Subject: [PATCH 24/40] =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=91=98=E6=97=A5?=
=?UTF-8?q?=E5=BF=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/api/admin-log.ts | 21 ++
src/api/index.ts | 1 +
src/compenents/left-menu/index.tsx | 1 +
src/main.tsx | 1 +
src/pages/system/adminlog/index.module.less | 0
src/pages/system/adminlog/index.tsx | 180 ++++++++++++++++++
.../system/adminroles/compenents/create.tsx | 5 +
.../system/adminroles/compenents/update.tsx | 5 +
src/routes/index.tsx | 5 +
src/utils/index.ts | 7 +
10 files changed, 226 insertions(+)
create mode 100644 src/api/admin-log.ts
create mode 100644 src/pages/system/adminlog/index.module.less
create mode 100644 src/pages/system/adminlog/index.tsx
diff --git a/src/api/admin-log.ts b/src/api/admin-log.ts
new file mode 100644
index 0000000..f7e68f2
--- /dev/null
+++ b/src/api/admin-log.ts
@@ -0,0 +1,21 @@
+import client from "./internal/httpClient";
+
+export function adminLogList(
+ page: number,
+ size: number,
+ admin_id: number | null,
+ title: string,
+ opt: string,
+ start_time: string,
+ end_time: string
+) {
+ return client.get("/backend/v1/admin/log/index", {
+ page: page,
+ size: size,
+ admin_id: admin_id,
+ title: title,
+ opt: opt,
+ start_time: start_time,
+ end_time: end_time,
+ });
+}
diff --git a/src/api/index.ts b/src/api/index.ts
index 733df58..927f052 100644
--- a/src/api/index.ts
+++ b/src/api/index.ts
@@ -14,3 +14,4 @@ export * as upload from "./upload";
export * as user from "./user";
export * as appConfig from "./app-config";
export * as dashboard from "./dashboard";
+export * as adminLog from "./admin-log";
diff --git a/src/compenents/left-menu/index.tsx b/src/compenents/left-menu/index.tsx
index 40b26c6..85f7715 100644
--- a/src/compenents/left-menu/index.tsx
+++ b/src/compenents/left-menu/index.tsx
@@ -91,6 +91,7 @@ const items = [
null,
"admin-user-index"
),
+ getItem("管理日志", "/system/adminlog", null, null, null, "admin-log"),
// getItem("角色配置", "/system/adminroles", null, null, null, null),
],
null,
diff --git a/src/main.tsx b/src/main.tsx
index 98bf043..b20c456 100644
--- a/src/main.tsx
+++ b/src/main.tsx
@@ -7,6 +7,7 @@ import { Provider } from "react-redux";
import store from "./store";
import { ConfigProvider } from "antd";
import zhCN from "antd/locale/zh_CN";
+import "dayjs/locale/zh-cn";
import AutoScorllTop from "./AutoTop";
ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
diff --git a/src/pages/system/adminlog/index.module.less b/src/pages/system/adminlog/index.module.less
new file mode 100644
index 0000000..e69de29
diff --git a/src/pages/system/adminlog/index.tsx b/src/pages/system/adminlog/index.tsx
new file mode 100644
index 0000000..d66cd84
--- /dev/null
+++ b/src/pages/system/adminlog/index.tsx
@@ -0,0 +1,180 @@
+import { useEffect, useState } from "react";
+import { Table, Typography, Input, Select, Button, DatePicker } from "antd";
+import { adminLog } from "../../../api";
+// import styles from "./index.module.less";
+import type { ColumnsType } from "antd/es/table";
+import { dateWholeFormat } from "../../../utils/index";
+const { RangePicker } = DatePicker;
+import moment from "moment";
+
+interface DataType {
+ id: React.Key;
+ admin_id: number;
+ ip: string;
+ opt: string;
+ adminName: string;
+ module: string;
+ created_at: string;
+ title: string;
+}
+
+const SystemLogPage = () => {
+ const [loading, setLoading] = useState(true);
+ const [page, setPage] = useState(1);
+ const [size, setSize] = useState(10);
+ const [list, setList] = useState([]);
+ const [total, setTotal] = useState(0);
+ const [refresh, setRefresh] = useState(false);
+ const [title, setTitle] = useState("");
+ const [adminId, setAdminId] = useState(0);
+ const [created_at, setCreatedAt] = useState([]);
+ const [createdAts, setCreatedAts] = useState([]);
+
+ useEffect(() => {
+ getData();
+ }, [refresh, page, size]);
+
+ const getData = () => {
+ setLoading(true);
+ adminLog
+ .adminLogList(
+ page,
+ size,
+ adminId > 0 ? adminId : null,
+ title,
+ "",
+ created_at[0],
+ created_at[1]
+ )
+ .then((res: any) => {
+ setList(res.data.data);
+ setTotal(res.data.total);
+ setLoading(false);
+ })
+ .catch((e) => {
+ setLoading(false);
+ });
+ };
+
+ const resetData = () => {
+ setTitle("");
+ setAdminId(0);
+ setPage(1);
+ setSize(10);
+ setList([]);
+ setCreatedAts([]);
+ setCreatedAt([]);
+ setRefresh(!refresh);
+ };
+
+ const paginationProps = {
+ current: page, //当前页码
+ pageSize: size,
+ total: total, // 总条数
+ onChange: (page: number, pageSize: number) =>
+ handlePageChange(page, pageSize), //改变页码的函数
+ showSizeChanger: true,
+ };
+
+ const handlePageChange = (page: number, pageSize: number) => {
+ setPage(page);
+ setSize(pageSize);
+ };
+
+ const disabledDate = (current: any) => {
+ return current && current >= moment().add(0, "days"); // 选择时间要大于等于当前天。若今天不能被选择,去掉等号即可。
+ };
+
+ const columns: ColumnsType = [
+ {
+ title: "管理员ID",
+ width: 100,
+ render: (_, record: any) => {record.admin_id},
+ },
+ {
+ title: "管理员",
+ width: 150,
+ render: (_, record: any) => {record.adminName},
+ },
+ {
+ title: "标题",
+ render: (_, record: any) => {record.title},
+ },
+ {
+ title: "操作模块",
+ width: 100,
+ dataIndex: "module",
+ render: (module: string) => {module},
+ },
+ {
+ title: "操作指令",
+ width: 100,
+ dataIndex: "opt",
+ render: (opt: string) => {opt},
+ },
+ {
+ title: "IP",
+ width: 200,
+ dataIndex: "ip",
+ render: (ip: string) => {ip},
+ },
+ {
+ title: "时间",
+ width: 200,
+ dataIndex: "created_at",
+ render: (created_at: string) => (
+ {dateWholeFormat(created_at)}
+ ),
+ },
+ ];
+
+ return (
+
+
+
+
+
+ {
+ dateString[0] += " 00:00:00";
+ dateString[1] += " 23:59:59";
+ setCreatedAt(dateString);
+ setCreatedAts(date);
+ }}
+ placeholder={["时间-开始", "时间-结束"]}
+ />
+
+
+
+
+
+
+
+
+
record.id}
+ pagination={paginationProps}
+ />
+
+
+ );
+};
+
+export default SystemLogPage;
diff --git a/src/pages/system/adminroles/compenents/create.tsx b/src/pages/system/adminroles/compenents/create.tsx
index f6ca78a..cf5d0ba 100644
--- a/src/pages/system/adminroles/compenents/create.tsx
+++ b/src/pages/system/adminroles/compenents/create.tsx
@@ -62,6 +62,11 @@ export const SystemAdminrolesCreate: React.FC = ({
value: "管理员-n",
children: [],
},
+ {
+ title: "管理员日志",
+ value: "管理员日志-n",
+ children: [],
+ },
{
title: "管理员角色",
value: "管理员角色-n",
diff --git a/src/pages/system/adminroles/compenents/update.tsx b/src/pages/system/adminroles/compenents/update.tsx
index 0638e2e..d2b2639 100644
--- a/src/pages/system/adminroles/compenents/update.tsx
+++ b/src/pages/system/adminroles/compenents/update.tsx
@@ -65,6 +65,11 @@ export const SystemAdminrolesUpdate: React.FC = ({
value: "管理员-n",
children: [],
},
+ {
+ title: "管理员日志",
+ value: "管理员日志-n",
+ children: [],
+ },
{
title: "管理员角色",
value: "管理员角色-n",
diff --git a/src/routes/index.tsx b/src/routes/index.tsx
index de42930..b137f33 100644
--- a/src/routes/index.tsx
+++ b/src/routes/index.tsx
@@ -39,6 +39,7 @@ const SystemAdministratorPage = lazy(
() => import("../pages/system/administrator")
);
const SystemAdminrolesPage = lazy(() => import("../pages/system/adminroles"));
+const SystemLogPage = lazy(() => import("../pages/system/adminlog"));
//部门页面
const DepartmentPage = lazy(() => import("../pages/department"));
//测试
@@ -152,6 +153,10 @@ const routes: RouteObject[] = [
path: "/system/adminroles",
element: } />,
},
+ {
+ path: "/system/adminlog",
+ element: } />,
+ },
{
path: "/department",
element: } />,
diff --git a/src/utils/index.ts b/src/utils/index.ts
index 05c0a0c..9bc1079 100644
--- a/src/utils/index.ts
+++ b/src/utils/index.ts
@@ -133,3 +133,10 @@ export function checkUrl(value: any) {
}
return url;
}
+
+export function dateWholeFormat(dateStr: string) {
+ if (!dateStr) {
+ return "";
+ }
+ return moment(dateStr).format("YYYY-MM-DD HH:mm:ss");
+}
From ede944217a0d5f0bd08ae2dc5d9d7dd29873044d Mon Sep 17 00:00:00 2001
From: unknown <18119604035@163.com>
Date: Sat, 29 Jul 2023 17:30:02 +0800
Subject: [PATCH 25/40] =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=91=98=E6=97=A5?=
=?UTF-8?q?=E5=BF=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/pages/system/adminlog/index.tsx | 29 +++++++++--------------------
1 file changed, 9 insertions(+), 20 deletions(-)
diff --git a/src/pages/system/adminlog/index.tsx b/src/pages/system/adminlog/index.tsx
index d66cd84..aa18091 100644
--- a/src/pages/system/adminlog/index.tsx
+++ b/src/pages/system/adminlog/index.tsx
@@ -12,10 +12,11 @@ interface DataType {
admin_id: number;
ip: string;
opt: string;
- adminName: string;
+ admin_name: string;
module: string;
created_at: string;
title: string;
+ ip_area: string;
}
const SystemLogPage = () => {
@@ -87,36 +88,24 @@ const SystemLogPage = () => {
const columns: ColumnsType = [
{
- title: "管理员ID",
+ title: "ID",
width: 100,
- render: (_, record: any) => {record.admin_id},
+ render: (_, record: any) => {record.id},
},
{
title: "管理员",
width: 150,
- render: (_, record: any) => {record.adminName},
+ render: (_, record: any) => {record.admin_name},
},
{
title: "标题",
render: (_, record: any) => {record.title},
},
{
- title: "操作模块",
- width: 100,
- dataIndex: "module",
- render: (module: string) => {module},
- },
- {
- title: "操作指令",
- width: 100,
- dataIndex: "opt",
- render: (opt: string) => {opt},
- },
- {
- title: "IP",
- width: 200,
- dataIndex: "ip",
- render: (ip: string) => {ip},
+ title: "IP地区",
+ width: 250,
+ dataIndex: "ip_area",
+ render: (ip_area: string) => {ip_area},
},
{
title: "时间",
From 23d0e6265c08c3c4947ef3c87e5702fe6a708331 Mon Sep 17 00:00:00 2001
From: unknown <18119604035@163.com>
Date: Sat, 29 Jul 2023 17:43:49 +0800
Subject: [PATCH 26/40] =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=91=98=E6=97=A5?=
=?UTF-8?q?=E5=BF=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../adminlog/compenents/detail-dialog.tsx | 57 +++++++++++++++++++
src/pages/system/adminlog/index.tsx | 41 ++++++++++++-
2 files changed, 97 insertions(+), 1 deletion(-)
create mode 100644 src/pages/system/adminlog/compenents/detail-dialog.tsx
diff --git a/src/pages/system/adminlog/compenents/detail-dialog.tsx b/src/pages/system/adminlog/compenents/detail-dialog.tsx
new file mode 100644
index 0000000..1c62d52
--- /dev/null
+++ b/src/pages/system/adminlog/compenents/detail-dialog.tsx
@@ -0,0 +1,57 @@
+import React, { useState, useEffect } from "react";
+import { Modal, Form } from "antd";
+
+interface PropInterface {
+ param: string;
+ result: string;
+ open: boolean;
+ onCancel: () => void;
+}
+
+export const AdminLogDetailDialog: React.FC = ({
+ param,
+ open,
+ onCancel,
+ result,
+}) => {
+ const [form] = Form.useForm();
+ const [loading, setLoading] = useState(true);
+
+ const onFinish = (values: any) => {};
+
+ const onFinishFailed = (errorInfo: any) => {
+ console.log("Failed:", errorInfo);
+ };
+
+ return (
+ <>
+ onCancel()}
+ onCancel={() => onCancel()}
+ footer={null}
+ maskClosable={false}
+ >
+
+
{param}
+ {result}
+
+
+
+ >
+ );
+};
diff --git a/src/pages/system/adminlog/index.tsx b/src/pages/system/adminlog/index.tsx
index aa18091..b60640d 100644
--- a/src/pages/system/adminlog/index.tsx
+++ b/src/pages/system/adminlog/index.tsx
@@ -1,9 +1,18 @@
import { useEffect, useState } from "react";
-import { Table, Typography, Input, Select, Button, DatePicker } from "antd";
+import {
+ Table,
+ Typography,
+ Input,
+ Select,
+ Space,
+ Button,
+ DatePicker,
+} from "antd";
import { adminLog } from "../../../api";
// import styles from "./index.module.less";
import type { ColumnsType } from "antd/es/table";
import { dateWholeFormat } from "../../../utils/index";
+import { AdminLogDetailDialog } from "./compenents/detail-dialog";
const { RangePicker } = DatePicker;
import moment from "moment";
@@ -17,6 +26,8 @@ interface DataType {
created_at: string;
title: string;
ip_area: string;
+ param: string;
+ result: string;
}
const SystemLogPage = () => {
@@ -30,6 +41,9 @@ const SystemLogPage = () => {
const [adminId, setAdminId] = useState(0);
const [created_at, setCreatedAt] = useState([]);
const [createdAts, setCreatedAts] = useState([]);
+ const [param, setParam] = useState("");
+ const [result, setResult] = useState("");
+ const [visiable, setVisiable] = useState(false);
useEffect(() => {
getData();
@@ -115,6 +129,25 @@ const SystemLogPage = () => {
{dateWholeFormat(created_at)}
),
},
+ {
+ title: "操作",
+ key: "action",
+ fixed: "right",
+ width: 160,
+ render: (_, record) => (
+
+ ),
+ },
];
return (
@@ -162,6 +195,12 @@ const SystemLogPage = () => {
pagination={paginationProps}
/>
+ setVisiable(false)}
+ >
);
};
From 5f959f37196ac6484c9fcb5777d8ea2996b0533a Mon Sep 17 00:00:00 2001
From: unknown <18119604035@163.com>
Date: Sat, 29 Jul 2023 17:58:39 +0800
Subject: [PATCH 27/40] =?UTF-8?q?=E9=94=99=E8=AF=AF=E9=A1=B5=E9=9D=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/api/admin-log.ts | 2 +-
src/api/internal/httpClient.ts | 13 +++++----
src/pages/error/index.tsx | 26 +++++++++++++++--
src/pages/system/adminlog/index.tsx | 43 ++++++++++++++++++++---------
4 files changed, 62 insertions(+), 22 deletions(-)
diff --git a/src/api/admin-log.ts b/src/api/admin-log.ts
index f7e68f2..2fd0502 100644
--- a/src/api/admin-log.ts
+++ b/src/api/admin-log.ts
@@ -3,7 +3,7 @@ import client from "./internal/httpClient";
export function adminLogList(
page: number,
size: number,
- admin_id: number | null,
+ admin_id: string,
title: string,
opt: string,
start_time: string,
diff --git a/src/api/internal/httpClient.ts b/src/api/internal/httpClient.ts
index 8c75dee..97ca635 100644
--- a/src/api/internal/httpClient.ts
+++ b/src/api/internal/httpClient.ts
@@ -7,8 +7,8 @@ const GoLogin = () => {
window.location.href = "/login";
};
-const GoError = () => {
- window.location.href = "/error";
+const GoError = (code: number) => {
+ window.location.href = "/error?code=" + code;
};
export class HttpClient {
@@ -56,13 +56,16 @@ export class HttpClient {
GoLogin();
} else if (status === 404) {
// 跳转到404页面
- GoError();
+ GoError(404);
} else if (status === 403) {
// 跳转到无权限页面
- GoError();
+ GoError(403);
+ } else if (status === 429) {
+ // 跳转到429页面
+ GoError(429);
} else if (status === 500) {
// 跳转到500异常页面
- GoError();
+ GoError(500);
}
return Promise.reject(error.response);
}
diff --git a/src/pages/error/index.tsx b/src/pages/error/index.tsx
index 9a1a37d..e71298f 100644
--- a/src/pages/error/index.tsx
+++ b/src/pages/error/index.tsx
@@ -1,15 +1,35 @@
+import { useEffect, useState } from "react";
import { Button, Result } from "antd";
-import { useNavigate } from "react-router-dom";
+import { useParams, useNavigate, useLocation } from "react-router-dom";
import styles from "./index.module.less";
const ErrorPage = () => {
const navigate = useNavigate();
+ const result = new URLSearchParams(useLocation().search);
+ const [code, setCode] = useState(Number(result.get("code")));
+ const [error, setError] = useState("");
+
+ useEffect(() => {
+ setCode(Number(result.get("code")));
+ }, [result.get("code")]);
+
+ useEffect(() => {
+ if (code === 403) {
+ setError("无权限操作");
+ } else if (code === 404) {
+ setError("URL或资源不存在");
+ } else if (code === 429) {
+ setError("请求次数过多,请稍后再试");
+ } else {
+ setError("系统错误");
+ }
+ }, [code]);
return (
{
const [total, setTotal] = useState(0);
const [refresh, setRefresh] = useState(false);
const [title, setTitle] = useState("");
- const [adminId, setAdminId] = useState(0);
+ const [adminId, setAdminId] = useState("");
const [created_at, setCreatedAt] = useState([]);
const [createdAts, setCreatedAts] = useState([]);
const [param, setParam] = useState("");
@@ -55,7 +47,7 @@ const SystemLogPage = () => {
.adminLogList(
page,
size,
- adminId > 0 ? adminId : null,
+ adminId,
title,
"",
created_at[0],
@@ -73,7 +65,7 @@ const SystemLogPage = () => {
const resetData = () => {
setTitle("");
- setAdminId(0);
+ setAdminId("");
setPage(1);
setSize(10);
setList([]);
@@ -107,7 +99,7 @@ const SystemLogPage = () => {
render: (_, record: any) => {record.id},
},
{
- title: "管理员",
+ title: "管理员名称",
width: 150,
render: (_, record: any) => {record.admin_name},
},
@@ -156,6 +148,31 @@ const SystemLogPage = () => {
+ 标题:
+ {
+ setTitle(e.target.value);
+ }}
+ allowClear
+ style={{ width: 160 }}
+ placeholder="请输入标题"
+ />
+
+
+ 管理员ID:
+ {
+ setAdminId(e.target.value);
+ }}
+ allowClear
+ style={{ width: 160 }}
+ placeholder="请输入管理员ID"
+ />
+
+
+
时间:
Date: Sat, 29 Jul 2023 18:14:47 +0800
Subject: [PATCH 28/40] =?UTF-8?q?=E8=B7=B3=E8=BD=AC=E9=94=99=E8=AF=AF?=
=?UTF-8?q?=E9=A1=B5=E9=9D=A2=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/api/internal/httpClient.ts | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/src/api/internal/httpClient.ts b/src/api/internal/httpClient.ts
index 97ca635..db55e9d 100644
--- a/src/api/internal/httpClient.ts
+++ b/src/api/internal/httpClient.ts
@@ -43,7 +43,24 @@ export class HttpClient {
if (code === 0) {
return Promise.resolve(response);
+ } else if (code === 404) {
+ message.error(msg);
+ // 跳转到404页面
+ GoError(404);
+ } else if (code === 403) {
+ message.error(msg);
+ // 跳转到无权限页面
+ GoError(403);
+ } else if (code === 429) {
+ message.error(msg);
+ // 跳转到429页面
+ GoError(429);
+ } else if (code === 500) {
+ message.error(msg);
+ // 跳转到500异常页面
+ GoError(500);
} else {
+ GoError(code);
message.error(msg);
}
return Promise.reject(response);
@@ -66,6 +83,8 @@ export class HttpClient {
} else if (status === 500) {
// 跳转到500异常页面
GoError(500);
+ } else {
+ GoError(status);
}
return Promise.reject(error.response);
}
From 4e3d6b09696e7d4c261c7a8e110928a896836144 Mon Sep 17 00:00:00 2001
From: unknown <18119604035@163.com>
Date: Sun, 30 Jul 2023 12:51:58 +0800
Subject: [PATCH 29/40] =?UTF-8?q?=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/compenents/upload-courseware-button/index.tsx | 5 ++++-
src/pages/course/compenents/create.tsx | 7 ++++++-
src/pages/system/adminlog/index.tsx | 11 +++--------
3 files changed, 13 insertions(+), 10 deletions(-)
diff --git a/src/compenents/upload-courseware-button/index.tsx b/src/compenents/upload-courseware-button/index.tsx
index d4dd9cb..64435c0 100644
--- a/src/compenents/upload-courseware-button/index.tsx
+++ b/src/compenents/upload-courseware-button/index.tsx
@@ -71,6 +71,7 @@ export const UploadCoursewareButton = (props: PropsInterface) => {
file.type === "application/x-zip-compressed" ||
file.type === "application/octet-stream" ||
file.type === "application/zip" ||
+ file.type === "application/x-rar" ||
file.type ===
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ||
file.type === "application/vnd.ms-excel" ||
@@ -188,7 +189,9 @@ export const UploadCoursewareButton = (props: PropsInterface) => {
- 请将文件拖拽到此处上传
+
+ 支持word、excel、ppt、pdf、zip、txt格式文件
+
支持一次上传多个文件
diff --git a/src/pages/course/compenents/create.tsx b/src/pages/course/compenents/create.tsx
index c67d186..cba360e 100644
--- a/src/pages/course/compenents/create.tsx
+++ b/src/pages/course/compenents/create.tsx
@@ -84,6 +84,8 @@ export const CourseCreate: React.FC = ({
setHours([]);
setTreeData([]);
setAttachmentData([]);
+ setAttachments([]);
+ setShowDrop(false);
}, [form, open]);
const getParams = () => {
@@ -793,7 +795,10 @@ export const CourseCreate: React.FC = ({
className={showDrop ? "drop-item active" : "drop-item"}
onClick={() => setShowDrop(!showDrop)}
>
-
+
(课程简介、课件)
diff --git a/src/pages/system/adminlog/index.tsx b/src/pages/system/adminlog/index.tsx
index b05c597..36c24d4 100644
--- a/src/pages/system/adminlog/index.tsx
+++ b/src/pages/system/adminlog/index.tsx
@@ -93,18 +93,13 @@ const SystemLogPage = () => {
};
const columns: ColumnsType
= [
- {
- title: "ID",
- width: 100,
- render: (_, record: any) => {record.id},
- },
{
title: "管理员名称",
width: 150,
render: (_, record: any) => {record.admin_name},
},
{
- title: "标题",
+ title: "操作",
render: (_, record: any) => {record.title},
},
{
@@ -148,7 +143,7 @@ const SystemLogPage = () => {
- 标题:
+ 操作:
{
@@ -156,7 +151,7 @@ const SystemLogPage = () => {
}}
allowClear
style={{ width: 160 }}
- placeholder="请输入标题"
+ placeholder="请输入操作"
/>
From 7af7fccc3a06465a0bc9e98bb2518bd1811db59b Mon Sep 17 00:00:00 2001
From: unknown <18119604035@163.com>
Date: Sun, 30 Jul 2023 12:57:01 +0800
Subject: [PATCH 30/40] =?UTF-8?q?=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/index.less | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/index.less b/src/index.less
index 5858831..090e205 100644
--- a/src/index.less
+++ b/src/index.less
@@ -594,8 +594,7 @@ textarea.ant-input {
.list-select-column-box {
.ant-checkbox-wrapper {
- margin-inline-start: 0px;
- height: 38px;
+ height: 38px !important;
align-items: center !important;
}
@@ -604,10 +603,12 @@ textarea.ant-input {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
+ line-height: 38px;
}
.video-time {
width: 80px;
display: flex;
+ line-height: 38px;
flex-direction: row-reverse;
}
}
@@ -683,4 +684,3 @@ textarea.ant-input {
line-height: 32px;
}
}
-
From 761b8cdf023a9c5121e356e221de85eab5d37990 Mon Sep 17 00:00:00 2001
From: unknown <18119604035@163.com>
Date: Sun, 30 Jul 2023 13:01:48 +0800
Subject: [PATCH 31/40] =?UTF-8?q?=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/api/admin-log.ts | 2 ++
src/pages/system/adminlog/index.tsx | 27 +++++++++++++++------------
2 files changed, 17 insertions(+), 12 deletions(-)
diff --git a/src/api/admin-log.ts b/src/api/admin-log.ts
index 2fd0502..05cfc6f 100644
--- a/src/api/admin-log.ts
+++ b/src/api/admin-log.ts
@@ -4,6 +4,7 @@ export function adminLogList(
page: number,
size: number,
admin_id: string,
+ admin_name: string,
title: string,
opt: string,
start_time: string,
@@ -13,6 +14,7 @@ export function adminLogList(
page: page,
size: size,
admin_id: admin_id,
+ admin_name: admin_name,
title: title,
opt: opt,
start_time: start_time,
diff --git a/src/pages/system/adminlog/index.tsx b/src/pages/system/adminlog/index.tsx
index 36c24d4..e37bc66 100644
--- a/src/pages/system/adminlog/index.tsx
+++ b/src/pages/system/adminlog/index.tsx
@@ -31,6 +31,7 @@ const SystemLogPage = () => {
const [refresh, setRefresh] = useState(false);
const [title, setTitle] = useState("");
const [adminId, setAdminId] = useState("");
+ const [adminName, setAdminName] = useState("");
const [created_at, setCreatedAt] = useState
([]);
const [createdAts, setCreatedAts] = useState([]);
const [param, setParam] = useState("");
@@ -48,6 +49,7 @@ const SystemLogPage = () => {
page,
size,
adminId,
+ adminName,
title,
"",
created_at[0],
@@ -66,6 +68,7 @@ const SystemLogPage = () => {
const resetData = () => {
setTitle("");
setAdminId("");
+ setAdminName("");
setPage(1);
setSize(10);
setList([]);
@@ -142,6 +145,18 @@ const SystemLogPage = () => {
+
+ 管理员名称:
+ {
+ setAdminName(e.target.value);
+ }}
+ allowClear
+ style={{ width: 160 }}
+ placeholder="请输入管理员名称"
+ />
+
操作:
{
placeholder="请输入操作"
/>
-
- 管理员ID:
- {
- setAdminId(e.target.value);
- }}
- allowClear
- style={{ width: 160 }}
- placeholder="请输入管理员ID"
- />
-
时间:
Date: Sun, 30 Jul 2023 13:04:54 +0800
Subject: [PATCH 32/40] =?UTF-8?q?=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/api/admin-log.ts | 2 --
src/pages/system/adminlog/index.tsx | 1 -
2 files changed, 3 deletions(-)
diff --git a/src/api/admin-log.ts b/src/api/admin-log.ts
index 05cfc6f..806c607 100644
--- a/src/api/admin-log.ts
+++ b/src/api/admin-log.ts
@@ -3,7 +3,6 @@ import client from "./internal/httpClient";
export function adminLogList(
page: number,
size: number,
- admin_id: string,
admin_name: string,
title: string,
opt: string,
@@ -13,7 +12,6 @@ export function adminLogList(
return client.get("/backend/v1/admin/log/index", {
page: page,
size: size,
- admin_id: admin_id,
admin_name: admin_name,
title: title,
opt: opt,
diff --git a/src/pages/system/adminlog/index.tsx b/src/pages/system/adminlog/index.tsx
index e37bc66..4c63253 100644
--- a/src/pages/system/adminlog/index.tsx
+++ b/src/pages/system/adminlog/index.tsx
@@ -48,7 +48,6 @@ const SystemLogPage = () => {
.adminLogList(
page,
size,
- adminId,
adminName,
title,
"",
From dc616d482923339da259061242faaf6b5fc0d783 Mon Sep 17 00:00:00 2001
From: unknown <18119604035@163.com>
Date: Sun, 30 Jul 2023 15:27:06 +0800
Subject: [PATCH 33/40] =?UTF-8?q?=E7=BA=BF=E4=B8=8A=E8=AF=BE=E9=80=89?=
=?UTF-8?q?=E6=8B=A9=E8=A7=86=E9=A2=91=E3=80=81=E8=AF=BE=E4=BB=B6=E8=B5=84?=
=?UTF-8?q?=E6=BA=90=E5=BC=B9=E7=AA=97=E6=A0=B7=E5=BC=8F=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/compenents/upload-courseware-button/index.tsx | 7 ++++---
src/index.less | 5 ++---
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/src/compenents/upload-courseware-button/index.tsx b/src/compenents/upload-courseware-button/index.tsx
index 64435c0..741b1ae 100644
--- a/src/compenents/upload-courseware-button/index.tsx
+++ b/src/compenents/upload-courseware-button/index.tsx
@@ -189,10 +189,11 @@ export const UploadCoursewareButton = (props: PropsInterface) => {
-
- 支持word、excel、ppt、pdf、zip、txt格式文件
+
请将文件拖拽到此处上传
+
+ 支持一次上传多个 /
+ 支持word、excel、ppt、pdf、zip、rar、txt格式文件
- 支持一次上传多个文件
diff --git a/src/index.less b/src/index.less
index 090e205..e9f6e6d 100644
--- a/src/index.less
+++ b/src/index.less
@@ -594,8 +594,9 @@ textarea.ant-input {
.list-select-column-box {
.ant-checkbox-wrapper {
+ display: flex;
height: 38px !important;
- align-items: center !important;
+ align-items: center;
}
.video-title {
@@ -603,12 +604,10 @@ textarea.ant-input {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
- line-height: 38px;
}
.video-time {
width: 80px;
display: flex;
- line-height: 38px;
flex-direction: row-reverse;
}
}
From 862ee4e5ae70a4cd73d5adae30c4d237d80170ca Mon Sep 17 00:00:00 2001
From: unknown <18119604035@163.com>
Date: Sun, 30 Jul 2023 16:20:27 +0800
Subject: [PATCH 34/40] =?UTF-8?q?=E5=8F=AF=E8=A7=81=E5=88=97=E8=A1=A8?=
=?UTF-8?q?=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/pages/resource/courseware/index.tsx | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/src/pages/resource/courseware/index.tsx b/src/pages/resource/courseware/index.tsx
index a889b38..fe49a49 100644
--- a/src/pages/resource/courseware/index.tsx
+++ b/src/pages/resource/courseware/index.tsx
@@ -95,8 +95,7 @@ const ResourceCoursewarePage = () => {
const columns: ColumnsType = [
{
title: "课件名称",
- dataIndex: "name",
- render: (name: string) => (
+ render: (_, record: any) => (
{
color: "rgba(0,0,0,0.3)",
}}
/>
- {name}
+
+ {record.name}.{record.extension}
+
),
},
From 5ca6c18513abc0a9ad8e7efc66db23e034927ded Mon Sep 17 00:00:00 2001
From: unknown <18119604035@163.com>
Date: Sun, 30 Jul 2023 16:40:25 +0800
Subject: [PATCH 35/40] =?UTF-8?q?=E7=AE=A1=E7=90=86=E6=97=A5=E5=BF=97?=
=?UTF-8?q?=E6=97=B6=E5=8C=BA=E7=AD=9B=E9=80=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/pages/system/adminlog/index.tsx | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/pages/system/adminlog/index.tsx b/src/pages/system/adminlog/index.tsx
index 4c63253..05cbb5a 100644
--- a/src/pages/system/adminlog/index.tsx
+++ b/src/pages/system/adminlog/index.tsx
@@ -176,8 +176,8 @@ const SystemLogPage = () => {
value={createdAts}
style={{ marginLeft: 10 }}
onChange={(date, dateString) => {
- dateString[0] += " 00:00:00";
- dateString[1] += " 23:59:59";
+ dateString[0] += "T00:00:00.000+00:00";
+ dateString[1] += "T23:59:59.000+00:00";
setCreatedAt(dateString);
setCreatedAts(date);
}}
From 8e5c07263472dc61083570c647fb17087ac9d254 Mon Sep 17 00:00:00 2001
From: unknown <18119604035@163.com>
Date: Sun, 30 Jul 2023 16:58:44 +0800
Subject: [PATCH 36/40] =?UTF-8?q?=E7=AE=A1=E7=90=86=E6=97=A5=E5=BF=97?=
=?UTF-8?q?=E6=97=B6=E5=8C=BA=E7=AD=9B=E9=80=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/pages/system/adminlog/index.tsx | 8 +++++---
src/utils/index.ts | 10 ++++++++++
2 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/src/pages/system/adminlog/index.tsx b/src/pages/system/adminlog/index.tsx
index 05cbb5a..754d2d1 100644
--- a/src/pages/system/adminlog/index.tsx
+++ b/src/pages/system/adminlog/index.tsx
@@ -3,7 +3,7 @@ import { Table, Typography, Input, Button, DatePicker } from "antd";
import { adminLog } from "../../../api";
// import styles from "./index.module.less";
import type { ColumnsType } from "antd/es/table";
-import { dateWholeFormat } from "../../../utils/index";
+import { dateWholeFormat, transUtcTime } from "../../../utils/index";
import { AdminLogDetailDialog } from "./compenents/detail-dialog";
const { RangePicker } = DatePicker;
import moment from "moment";
@@ -176,8 +176,10 @@ const SystemLogPage = () => {
value={createdAts}
style={{ marginLeft: 10 }}
onChange={(date, dateString) => {
- dateString[0] += "T00:00:00.000+00:00";
- dateString[1] += "T23:59:59.000+00:00";
+ let date1 = dateString[0] + " 00:00:00";
+ let date2 = dateString[1] + " 23:59:59";
+ dateString[0] = transUtcTime(date1);
+ dateString[1] = transUtcTime(date2);
setCreatedAt(dateString);
setCreatedAts(date);
}}
diff --git a/src/utils/index.ts b/src/utils/index.ts
index 9bc1079..b37888b 100644
--- a/src/utils/index.ts
+++ b/src/utils/index.ts
@@ -140,3 +140,13 @@ export function dateWholeFormat(dateStr: string) {
}
return moment(dateStr).format("YYYY-MM-DD HH:mm:ss");
}
+
+export function transUtcTime(value: string) {
+ const specifiedTime = value;
+ // 创建一个新的Date对象,传入指定时间
+ const specifiedDate = new Date(specifiedTime);
+ //将指定时间转换为UTC+0时间
+ const utcTime = specifiedDate.toISOString();
+
+ return utcTime;
+}
From 2ce6292f446a6c29ec319cf5f2f15c97aac8377a Mon Sep 17 00:00:00 2001
From: unknown <18119604035@163.com>
Date: Mon, 31 Jul 2023 10:44:32 +0800
Subject: [PATCH 37/40] =?UTF-8?q?=E9=80=89=E6=8B=A9=E8=A7=86=E9=A2=91?=
=?UTF-8?q?=E3=80=81=E8=AF=BE=E4=BB=B6=E7=BB=84=E4=BB=B6=E9=87=8D=E6=9E=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/api/internal/httpClient.ts | 2 +-
src/compenents/select-attachment/index.tsx | 13 +-
src/compenents/select-resource/index.tsx | 13 +-
.../upload-courseware-sub/index.tsx | 220 ++++++++--------
src/compenents/upload-video-sub/index.tsx | 234 ++++++++----------
src/index.less | 17 +-
.../course/compenents/attachment-update.tsx | 18 +-
src/pages/course/compenents/hour-update.tsx | 36 ++-
8 files changed, 247 insertions(+), 306 deletions(-)
diff --git a/src/api/internal/httpClient.ts b/src/api/internal/httpClient.ts
index db55e9d..b3856ef 100644
--- a/src/api/internal/httpClient.ts
+++ b/src/api/internal/httpClient.ts
@@ -8,7 +8,7 @@ const GoLogin = () => {
};
const GoError = (code: number) => {
- window.location.href = "/error?code=" + code;
+ // window.location.href = "/error?code=" + code;
};
export class HttpClient {
diff --git a/src/compenents/select-attachment/index.tsx b/src/compenents/select-attachment/index.tsx
index 2129965..8739670 100644
--- a/src/compenents/select-attachment/index.tsx
+++ b/src/compenents/select-attachment/index.tsx
@@ -1,16 +1,9 @@
import { useEffect, useState } from "react";
-import { Button, Row, Modal, message, Tabs } from "antd";
+import { Row, Modal, Tabs } from "antd";
import styles from "./index.module.less";
import { UploadCoursewareSub } from "../../compenents";
import type { TabsProps } from "antd";
-interface VideoItem {
- id: number;
- category_id: number;
- name: string;
- duration: number;
-}
-
interface PropsInterface {
defaultKeys: any[];
open: boolean;
@@ -24,6 +17,10 @@ export const SelectAttachment = (props: PropsInterface) => {
const [selectKeys, setSelectKeys] = useState([]);
const [selectVideos, setSelectVideos] = useState([]);
+ useEffect(() => {
+ setRefresh(!refresh);
+ }, [props.open]);
+
const items: TabsProps["items"] = [
{
key: "1",
diff --git a/src/compenents/select-resource/index.tsx b/src/compenents/select-resource/index.tsx
index e7f9525..017cf30 100644
--- a/src/compenents/select-resource/index.tsx
+++ b/src/compenents/select-resource/index.tsx
@@ -1,16 +1,9 @@
import { useEffect, useState } from "react";
-import { Button, Row, Modal, message, Tabs } from "antd";
+import { Row, Modal, Tabs } from "antd";
import styles from "./index.module.less";
import { UploadVideoSub } from "../../compenents";
import type { TabsProps } from "antd";
-interface VideoItem {
- id: number;
- category_id: number;
- name: string;
- duration: number;
-}
-
interface PropsInterface {
defaultKeys: any[];
open: boolean;
@@ -24,6 +17,10 @@ export const SelectResource = (props: PropsInterface) => {
const [selectKeys, setSelectKeys] = useState([]);
const [selectVideos, setSelectVideos] = useState([]);
+ useEffect(() => {
+ setRefresh(!refresh);
+ }, [props.open]);
+
const items: TabsProps["items"] = [
{
key: "1",
diff --git a/src/compenents/upload-courseware-sub/index.tsx b/src/compenents/upload-courseware-sub/index.tsx
index 23d7985..0222640 100644
--- a/src/compenents/upload-courseware-sub/index.tsx
+++ b/src/compenents/upload-courseware-sub/index.tsx
@@ -1,17 +1,32 @@
import { useEffect, useState } from "react";
-import { Checkbox, Row, Col, Empty, message, Pagination } from "antd";
+import { Row, Col, Empty, Table, Pagination } from "antd";
+import type { ColumnsType } from "antd/es/table";
import { resource } from "../../api";
import styles from "./index.module.less";
import { TreeCategory, UploadCoursewareButton } from "../../compenents";
-import type { CheckboxChangeEvent } from "antd/es/checkbox";
-import type { CheckboxValueType } from "antd/es/checkbox/Group";
-
-const CheckboxGroup = Checkbox.Group;
interface VideoItem {
id: number;
- category_id: number;
name: string;
+ created_at: string;
+ type: string;
+ url: string;
+ path: string;
+ size: number;
+ extension: string;
+ admin_id: number;
+}
+
+interface DataType {
+ id: React.Key;
+ name: string;
+ created_at: string;
+ type: string;
+ url: string;
+ path: string;
+ size: number;
+ extension: string;
+ admin_id: number;
}
interface PropsInterface {
@@ -30,14 +45,21 @@ export const UploadCoursewareSub = (props: PropsInterface) => {
const [page, setPage] = useState(1);
const [size, setSize] = useState(10);
const [total, setTotal] = useState(0);
+ const [selectedRowKeys, setSelectedRowKeys] = useState([]);
- const [plainOptions, setPlainOptions] = useState([]);
- const [checkedList, setCheckedList] = useState([]);
- const [indeterminate, setIndeterminate] = useState(false);
- const [checkAll, setCheckAll] = useState(false);
+ // 加载列表
+ useEffect(() => {
+ getvideoList();
+ }, [props.open, category_ids, refresh, page, size]);
+
+ useEffect(() => {
+ if (props.defaultCheckedList.length > 0) {
+ setSelectedRowKeys(props.defaultCheckedList);
+ }
+ }, [props.defaultCheckedList]);
// 获取列表
- const getvideoList = (defaultKeys: any[]) => {
+ const getvideoList = () => {
let categoryIds = category_ids.join(",");
resource
.resourceList(
@@ -53,42 +75,12 @@ export const UploadCoursewareSub = (props: PropsInterface) => {
setTotal(res.data.result.total);
setExistingTypes(res.data.existing_types);
setVideoList(res.data.result.data);
- let data = res.data.result.data;
- const arr = [];
- for (let i = 0; i < data.length; i++) {
- arr.push({
- label: (
-
-
-
{data[i].name}
-
{data[i].type}
-
- ),
- value: data[i].id,
- disabled: false,
- });
- }
- if (defaultKeys.length > 0 && arr.length > 0) {
- for (let i = 0; i < defaultKeys.length; i++) {
- for (let j = 0; j < arr.length; j++) {
- if (arr[j].value === defaultKeys[i]) {
- arr[j].disabled = true;
- }
- }
- }
- }
- setPlainOptions(arr);
})
.catch((err) => {
console.log("错误,", err);
});
};
+
// 重置列表
const resetVideoList = () => {
setPage(1);
@@ -96,76 +88,64 @@ export const UploadCoursewareSub = (props: PropsInterface) => {
setRefresh(!refresh);
};
- // 加载列表
- useEffect(() => {
- const arr = [...props.defaultCheckedList];
- setCheckedList(arr);
- if (arr.length === 0) {
- setIndeterminate(false);
- setCheckAll(false);
- }
- getvideoList(arr);
- }, [props.open, props.defaultCheckedList, category_ids, refresh, page, size]);
-
- const onChange = (list: CheckboxValueType[]) => {
- setCheckedList(list);
- setIndeterminate(!!list.length && list.length < plainOptions.length);
- setCheckAll(list.length === plainOptions.length);
- const defalut = [...props.defaultCheckedList];
- let localKeys: any = [];
- list.map((item: any) => {
- if (defalut.indexOf(item) === -1) {
- localKeys.push(item);
- }
- });
-
- let arrVideos: any = [];
-
- for (let i = 0; i < localKeys.length; i++) {
- videoList.map((item: any, index: number) => {
- if (item.id === localKeys[i]) {
- arrVideos.push({
- name: item.name,
- type: item.type,
- rid: item.id,
- disabled: plainOptions[index].disabled,
- });
- }
- });
- }
- props.onSelected(localKeys, arrVideos);
+ const paginationProps = {
+ current: page, //当前页码
+ pageSize: size,
+ total: total, // 总条数
+ onChange: (page: number, pageSize: number) =>
+ handlePageChange(page, pageSize), //改变页码的函数
+ showSizeChanger: true,
};
- const onCheckAllChange = (e: CheckboxChangeEvent) => {
- const arr = plainOptions.map((item: any) => item.value);
- setCheckedList(e.target.checked ? arr : []);
- setIndeterminate(false);
- setCheckAll(e.target.checked);
- const defalut = [...props.defaultCheckedList];
- let localKeys: any = [];
- arr.map((item: any) => {
- if (defalut.indexOf(item) === -1) {
- localKeys.push(item);
- }
- });
- let arrVideos: any = [];
- for (let i = 0; i < localKeys.length; i++) {
- videoList.map((item: any, index: number) => {
- if (item.id === localKeys[i]) {
- arrVideos.push({
- name: item.name,
- type: item.type,
- rid: item.id,
- disabled: plainOptions[index].disabled,
- });
+ const handlePageChange = (page: number, pageSize: number) => {
+ setPage(page);
+ setSize(pageSize);
+ };
+
+ const columns: ColumnsType = [
+ {
+ title: "课件",
+ render: (_, record: any) => (
+
+ ),
+ },
+ {
+ title: "类型",
+ render: (_, record: any) => {record.type},
+ },
+ ];
+
+ const rowSelection = {
+ selectedRowKeys: selectedRowKeys,
+ onChange: (selectedRowKeys: React.Key[], selectedRows: DataType[]) => {
+ let row: any = selectedRows;
+ let arrVideos: any = [];
+ if (row) {
+ for (var i = 0; i < row.length; i++) {
+ if (props.defaultCheckedList.indexOf(row[i].id) === -1) {
+ arrVideos.push({
+ name: row[i].name,
+ type: row[i].type,
+ rid: row[i].id,
+ });
+ }
}
- });
- }
- if (e.target.checked) {
- props.onSelected(localKeys, arrVideos);
- } else {
- props.onSelected([], []);
- }
+ props.onSelected(selectedRowKeys, arrVideos);
+ }
+ setSelectedRowKeys(selectedRowKeys);
+ },
+ getCheckboxProps: (record: any) => ({
+ disabled: props.defaultCheckedList.indexOf(record.id) !== -1, //禁用的条件
+ }),
};
return (
@@ -198,18 +178,16 @@ export const UploadCoursewareSub = (props: PropsInterface) => {
)}
{videoList.length > 0 && (
-
- 全选
-
- record.id}
/>
)}
diff --git a/src/compenents/upload-video-sub/index.tsx b/src/compenents/upload-video-sub/index.tsx
index 530e63c..547b9a9 100644
--- a/src/compenents/upload-video-sub/index.tsx
+++ b/src/compenents/upload-video-sub/index.tsx
@@ -1,19 +1,33 @@
import { useEffect, useState } from "react";
-import { Checkbox, Row, Col, Empty, message, Pagination } from "antd";
+import { Row, Col, Empty, Table, Pagination } from "antd";
+import type { ColumnsType } from "antd/es/table";
import { resource } from "../../api";
import styles from "./index.module.less";
import { UploadVideoButton } from "../upload-video-button";
import { DurationText, TreeCategory } from "../../compenents";
-import type { CheckboxChangeEvent } from "antd/es/checkbox";
-import type { CheckboxValueType } from "antd/es/checkbox/Group";
-
-const CheckboxGroup = Checkbox.Group;
interface VideoItem {
id: number;
- category_id: number;
name: string;
- duration: number;
+ created_at: string;
+ type: string;
+ url: string;
+ path: string;
+ size: number;
+ extension: string;
+ admin_id: number;
+}
+
+interface DataType {
+ id: React.Key;
+ name: string;
+ created_at: string;
+ type: string;
+ url: string;
+ path: string;
+ size: number;
+ extension: string;
+ admin_id: number;
}
interface PropsInterface {
@@ -32,14 +46,21 @@ export const UploadVideoSub = (props: PropsInterface) => {
const [page, setPage] = useState(1);
const [size, setSize] = useState(10);
const [total, setTotal] = useState(0);
+ const [selectedRowKeys, setSelectedRowKeys] = useState([]);
- const [plainOptions, setPlainOptions] = useState([]);
- const [checkedList, setCheckedList] = useState([]);
- const [indeterminate, setIndeterminate] = useState(false);
- const [checkAll, setCheckAll] = useState(false);
+ // 加载列表
+ useEffect(() => {
+ getvideoList();
+ }, [props.open, category_ids, refresh, page, size]);
+
+ useEffect(() => {
+ if (props.defaultCheckedList.length > 0) {
+ setSelectedRowKeys(props.defaultCheckedList);
+ }
+ }, [props.defaultCheckedList]);
// 获取列表
- const getvideoList = (defaultKeys: any[]) => {
+ const getvideoList = () => {
let categoryIds = category_ids.join(",");
resource
.resourceList(page, size, "", "", "", "VIDEO", categoryIds)
@@ -47,46 +68,12 @@ export const UploadVideoSub = (props: PropsInterface) => {
setTotal(res.data.result.total);
setVideoExtra(res.data.videos_extra);
setVideoList(res.data.result.data);
- let data = res.data.result.data;
- const arr = [];
- for (let i = 0; i < data.length; i++) {
- arr.push({
- label: (
-
-
-
{data[i].name}
-
-
-
-
- ),
- value: data[i].id,
- disabled: false,
- });
- }
- if (defaultKeys.length > 0 && arr.length > 0) {
- for (let i = 0; i < defaultKeys.length; i++) {
- for (let j = 0; j < arr.length; j++) {
- if (arr[j].value === defaultKeys[i]) {
- arr[j].disabled = true;
- }
- }
- }
- }
- setPlainOptions(arr);
})
.catch((err) => {
console.log("错误,", err);
});
};
+
// 重置列表
const resetVideoList = () => {
setPage(1);
@@ -94,78 +81,71 @@ export const UploadVideoSub = (props: PropsInterface) => {
setRefresh(!refresh);
};
- // 加载列表
- useEffect(() => {
- const arr = [...props.defaultCheckedList];
- setCheckedList(arr);
- if (arr.length === 0) {
- setIndeterminate(false);
- setCheckAll(false);
- }
- getvideoList(arr);
- }, [props.open, props.defaultCheckedList, category_ids, refresh, page, size]);
-
- const onChange = (list: CheckboxValueType[]) => {
- setCheckedList(list);
- setIndeterminate(!!list.length && list.length < plainOptions.length);
- setCheckAll(list.length === plainOptions.length);
- const defalut = [...props.defaultCheckedList];
- let localKeys: any = [];
- list.map((item: any) => {
- if (defalut.indexOf(item) === -1) {
- localKeys.push(item);
- }
- });
-
- let arrVideos: any = [];
-
- for (let i = 0; i < localKeys.length; i++) {
- videoList.map((item: any, index: number) => {
- if (item.id === localKeys[i]) {
- arrVideos.push({
- name: item.name,
- type: item.type,
- rid: item.id,
- duration: videosExtra[item.id].duration,
- disabled: plainOptions[index].disabled,
- });
- }
- });
- }
- props.onSelected(localKeys, arrVideos);
+ const paginationProps = {
+ current: page, //当前页码
+ pageSize: size,
+ total: total, // 总条数
+ onChange: (page: number, pageSize: number) =>
+ handlePageChange(page, pageSize), //改变页码的函数
+ showSizeChanger: true,
};
- const onCheckAllChange = (e: CheckboxChangeEvent) => {
- const arr = plainOptions.map((item: any) => item.value);
- setCheckedList(e.target.checked ? arr : []);
- setIndeterminate(false);
- setCheckAll(e.target.checked);
- const defalut = [...props.defaultCheckedList];
- let localKeys: any = [];
- arr.map((item: any) => {
- if (defalut.indexOf(item) === -1) {
- localKeys.push(item);
- }
- });
- let arrVideos: any = [];
- for (let i = 0; i < localKeys.length; i++) {
- videoList.map((item: any, index: number) => {
- if (item.id === localKeys[i]) {
- arrVideos.push({
- name: item.name,
- type: item.type,
- rid: item.id,
- duration: videosExtra[item.id].duration,
- disabled: plainOptions[index].disabled,
- });
+ const handlePageChange = (page: number, pageSize: number) => {
+ setPage(page);
+ setSize(pageSize);
+ };
+
+ const columns: ColumnsType = [
+ {
+ title: "视频",
+ render: (_, record: any) => (
+
+ ),
+ },
+ {
+ title: "时长",
+ render: (_, record: any) => (
+
+
+
+ ),
+ },
+ ];
+
+ const rowSelection = {
+ selectedRowKeys: selectedRowKeys,
+ onChange: (selectedRowKeys: React.Key[], selectedRows: DataType[]) => {
+ let row: any = selectedRows;
+ let arrVideos: any = [];
+ if (row) {
+ for (var i = 0; i < row.length; i++) {
+ if (props.defaultCheckedList.indexOf(row[i].id) === -1) {
+ arrVideos.push({
+ name: row[i].name,
+ type: row[i].type,
+ rid: row[i].id,
+ duration: videosExtra[row[i].id].duration,
+ });
+ }
}
- });
- }
- if (e.target.checked) {
- props.onSelected(localKeys, arrVideos);
- } else {
- props.onSelected([], []);
- }
+ props.onSelected(selectedRowKeys, arrVideos);
+ }
+ setSelectedRowKeys(selectedRowKeys);
+ },
+ getCheckboxProps: (record: any) => ({
+ disabled: props.defaultCheckedList.indexOf(record.id) !== -1, //禁用的条件
+ }),
};
return (
@@ -198,18 +178,16 @@ export const UploadVideoSub = (props: PropsInterface) => {
)}
{videoList.length > 0 && (
-
- 全选
-
- record.id}
/>
)}
diff --git a/src/index.less b/src/index.less
index e9f6e6d..5251d39 100644
--- a/src/index.less
+++ b/src/index.less
@@ -593,23 +593,18 @@ textarea.ant-input {
}
.list-select-column-box {
- .ant-checkbox-wrapper {
- display: flex;
- height: 38px !important;
- align-items: center;
+ width: 100%;
+ height: auto;
+ float: left;
+ .ant-table-cell {
+ padding: 0px 0px;
}
-
.video-title {
- width: 390px;
+ width: 360px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
- .video-time {
- width: 80px;
- display: flex;
- flex-direction: row-reverse;
- }
}
.image-list-box {
diff --git a/src/pages/course/compenents/attachment-update.tsx b/src/pages/course/compenents/attachment-update.tsx
index a21cde4..8b1ccb1 100644
--- a/src/pages/course/compenents/attachment-update.tsx
+++ b/src/pages/course/compenents/attachment-update.tsx
@@ -69,19 +69,19 @@ export const CourseAttachmentUpdate: React.FC = ({
const selectAttachmentData = (arr: any, videos: any) => {
const hours: any = [];
for (let i = 0; i < videos.length; i++) {
- if (videos[i].disabled === false) {
- hours.push({
- sort: attachmentData.length + i,
- title: videos[i].name,
- type: videos[i].type,
- rid: videos[i].rid,
- });
- }
+ hours.push({
+ sort: attachmentData.length + i,
+ title: videos[i].name,
+ type: videos[i].type,
+ rid: videos[i].rid,
+ });
}
if (hours.length === 0) {
- message.error("请选择视频");
+ message.error("请选择课件");
return;
}
+ console.log(hours);
+
courseAttachment
.storeCourseAttachmentMulti(id, hours)
.then((res: any) => {
diff --git a/src/pages/course/compenents/hour-update.tsx b/src/pages/course/compenents/hour-update.tsx
index 2c91660..d4b8b9f 100644
--- a/src/pages/course/compenents/hour-update.tsx
+++ b/src/pages/course/compenents/hour-update.tsx
@@ -100,16 +100,14 @@ export const CourseHourUpdate: React.FC = ({
const selectData = (arr: any, videos: any) => {
const hours: any = [];
for (let i = 0; i < videos.length; i++) {
- if (videos[i].disabled === false) {
- hours.push({
- chapter_id: 0,
- sort: treeData.length + i,
- title: videos[i].name,
- type: videos[i].type,
- duration: videos[i].duration,
- rid: videos[i].rid,
- });
- }
+ hours.push({
+ chapter_id: 0,
+ sort: treeData.length + i,
+ title: videos[i].name,
+ type: videos[i].type,
+ duration: videos[i].duration,
+ rid: videos[i].rid,
+ });
}
if (hours.length === 0) {
message.error("请选择视频");
@@ -135,16 +133,14 @@ export const CourseHourUpdate: React.FC = ({
}
const hours: any = [];
for (let i = 0; i < videos.length; i++) {
- if (videos[i].disabled === false) {
- hours.push({
- chapter_id: data[addvideoCurrent].id,
- sort: data[addvideoCurrent].hours.length + i,
- title: videos[i].name,
- type: videos[i].type,
- duration: videos[i].duration,
- rid: videos[i].rid,
- });
- }
+ hours.push({
+ chapter_id: data[addvideoCurrent].id,
+ sort: data[addvideoCurrent].hours.length + i,
+ title: videos[i].name,
+ type: videos[i].type,
+ duration: videos[i].duration,
+ rid: videos[i].rid,
+ });
}
if (hours.length === 0) {
message.error("请选择视频");
From 242d29bf5e6f4620097a7efda8e14503cadcd12b Mon Sep 17 00:00:00 2001
From: unknown <18119604035@163.com>
Date: Mon, 31 Jul 2023 10:48:43 +0800
Subject: [PATCH 38/40] =?UTF-8?q?=E8=A7=86=E9=A2=91=E3=80=81=E5=9B=BE?=
=?UTF-8?q?=E7=89=87=E5=88=97=E8=A1=A8=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../course/compenents/attachment-update.tsx | 1 -
src/pages/resource/images/index.tsx | 18 ++++++++++--------
src/pages/resource/videos/index.tsx | 6 +++---
3 files changed, 13 insertions(+), 12 deletions(-)
diff --git a/src/pages/course/compenents/attachment-update.tsx b/src/pages/course/compenents/attachment-update.tsx
index 8b1ccb1..233d5fe 100644
--- a/src/pages/course/compenents/attachment-update.tsx
+++ b/src/pages/course/compenents/attachment-update.tsx
@@ -80,7 +80,6 @@ export const CourseAttachmentUpdate: React.FC = ({
message.error("请选择课件");
return;
}
- console.log(hours);
courseAttachment
.storeCourseAttachmentMulti(id, hours)
diff --git a/src/pages/resource/images/index.tsx b/src/pages/resource/images/index.tsx
index f6c9d8f..99d94dc 100644
--- a/src/pages/resource/images/index.tsx
+++ b/src/pages/resource/images/index.tsx
@@ -183,24 +183,25 @@ const ResourceImagesPage = () => {
-
{
- resetImageList();
- }}
- >
+ {
+ resetImageList();
+ }}
+ >
{selectKey.length > 0 && (
-
+
diff --git a/src/pages/resource/videos/index.tsx b/src/pages/resource/videos/index.tsx
index 4d83e71..4376509 100644
--- a/src/pages/resource/videos/index.tsx
+++ b/src/pages/resource/videos/index.tsx
@@ -286,11 +286,9 @@ const ResourceVideosPage = () => {
resetVideoList();
}}
>
-
-
{
setSelectedRowKeys([]);
setMultiConfig(!multiConfig);
@@ -299,6 +297,7 @@ const ResourceVideosPage = () => {
{multiConfig ? "取消操作" : "批量操作"}
removeResourceMulti()}
disabled={selectedRowKeys.length === 0}
@@ -306,6 +305,7 @@ const ResourceVideosPage = () => {
删除
+
{multiConfig ? (
From 2fa7a1dd4e8258f27d27e28d0cf9047407f1ad8f Mon Sep 17 00:00:00 2001
From: unknown <18119604035@163.com>
Date: Mon, 31 Jul 2023 11:03:51 +0800
Subject: [PATCH 39/40] =?UTF-8?q?=E5=9B=BE=E7=89=87=E5=88=97=E8=A1=A8?=
=?UTF-8?q?=E5=85=A8=E9=80=89=E6=8C=89=E9=92=AE=E9=80=BB=E8=BE=91=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/resource/images/index.tsx | 28 ++++++++++++++--------------
1 file changed, 14 insertions(+), 14 deletions(-)
diff --git a/src/pages/resource/images/index.tsx b/src/pages/resource/images/index.tsx
index 99d94dc..bc4f09f 100644
--- a/src/pages/resource/images/index.tsx
+++ b/src/pages/resource/images/index.tsx
@@ -192,23 +192,23 @@ const ResourceImagesPage = () => {
>
{selectKey.length > 0 && (
cancelAll()}>
- 取消选择
+ 取消操作
+
+ )}
+ {selectKey.length === 0 && (
+ selectAll()}>
+ 批量操作
)}
{imageList.length !== 0 && (
- <>
- selectAll()}>
- 全选
-
- removeResource()}
- >
- 删除
-
- >
+ removeResource()}
+ >
+ 删除
+
)}
From e95343fe0ab7df6a17d724f59ac8852b0e7f5498 Mon Sep 17 00:00:00 2001
From: unknown <18119604035@163.com>
Date: Mon, 31 Jul 2023 11:06:45 +0800
Subject: [PATCH 40/40] =?UTF-8?q?=E9=80=89=E6=8B=A9=E8=A7=86=E9=A2=91?=
=?UTF-8?q?=E3=80=81=E8=AF=BE=E4=BB=B6=E7=BB=84=E4=BB=B6=E9=87=8D=E6=9E=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../upload-courseware-sub/index.tsx | 23 +------------------
src/compenents/upload-video-sub/index.tsx | 23 +------------------
2 files changed, 2 insertions(+), 44 deletions(-)
diff --git a/src/compenents/upload-courseware-sub/index.tsx b/src/compenents/upload-courseware-sub/index.tsx
index 0222640..d2d4689 100644
--- a/src/compenents/upload-courseware-sub/index.tsx
+++ b/src/compenents/upload-courseware-sub/index.tsx
@@ -1,5 +1,5 @@
import { useEffect, useState } from "react";
-import { Row, Col, Empty, Table, Pagination } from "antd";
+import { Row, Col, Empty, Table } from "antd";
import type { ColumnsType } from "antd/es/table";
import { resource } from "../../api";
import styles from "./index.module.less";
@@ -192,27 +192,6 @@ export const UploadCoursewareSub = (props: PropsInterface) => {
)}
-
- {videoList.length > 0 && total > 10 && (
-
- {
- setPage(currentPage);
- setSize(currentSize);
- }}
- defaultCurrent={page}
- total={total}
- />
-
- )}
-
>
diff --git a/src/compenents/upload-video-sub/index.tsx b/src/compenents/upload-video-sub/index.tsx
index 547b9a9..b9fe6db 100644
--- a/src/compenents/upload-video-sub/index.tsx
+++ b/src/compenents/upload-video-sub/index.tsx
@@ -1,5 +1,5 @@
import { useEffect, useState } from "react";
-import { Row, Col, Empty, Table, Pagination } from "antd";
+import { Row, Col, Empty, Table } from "antd";
import type { ColumnsType } from "antd/es/table";
import { resource } from "../../api";
import styles from "./index.module.less";
@@ -192,27 +192,6 @@ export const UploadVideoSub = (props: PropsInterface) => {
)}
-
- {videoList.length > 0 && total > 10 && (
-
- {
- setPage(currentPage);
- setSize(currentSize);
- }}
- defaultCurrent={page}
- total={total}
- />
-
- )}
-
>