From d392878bf552e1e1ac9e371c70f17fe223061512 Mon Sep 17 00:00:00 2001 From: unknown <18119604035@163.com> Date: Sat, 29 Jul 2023 12:08:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E8=AF=BE=E7=A8=8B=E5=8A=A0?= =?UTF-8?q?=E5=85=A5=E8=AF=BE=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/iconfont/iconfont.css | 54 +++- src/assets/iconfont/iconfont.ttf | Bin 7856 -> 10964 bytes src/assets/iconfont/iconfont.woff | Bin 5068 -> 7156 bytes src/assets/iconfont/iconfont.woff2 | Bin 4328 -> 6132 bytes src/compenents/index.ts | 2 + src/compenents/select-attachment/index.tsx | 77 ++++++ .../upload-courseware-sub/index.module.less | 0 .../upload-courseware-sub/index.tsx | 242 ++++++++++++++++++ src/index.less | 24 ++ src/pages/course/compenents/attachments.tsx | 157 ++++++++++++ src/pages/course/compenents/create.tsx | 128 ++++++++- 11 files changed, 669 insertions(+), 15 deletions(-) create mode 100644 src/compenents/select-attachment/index.tsx create mode 100644 src/compenents/upload-courseware-sub/index.module.less create mode 100644 src/compenents/upload-courseware-sub/index.tsx create mode 100644 src/pages/course/compenents/attachments.tsx diff --git a/src/assets/iconfont/iconfont.css b/src/assets/iconfont/iconfont.css index bfbcd32..a6751c1 100644 --- a/src/assets/iconfont/iconfont.css +++ b/src/assets/iconfont/iconfont.css @@ -1,8 +1,8 @@ @font-face { font-family: "iconfont"; /* Project id 3943555 */ - src: url('iconfont.woff2?t=1679383201256') format('woff2'), - url('iconfont.woff?t=1679383201256') format('woff'), - url('iconfont.ttf?t=1679383201256') format('truetype'); + src: url('iconfont.woff2?t=1690600882833') format('woff2'), + url('iconfont.woff?t=1690600882833') format('woff'), + url('iconfont.ttf?t=1690600882833') format('truetype'); } .iconfont { @@ -13,6 +13,54 @@ -moz-osx-font-smoothing: grayscale; } +.icon-playedu:before { + content: "\e756"; +} + +.icon-icon-xuexi:before { + content: "\e753"; +} + +.icon-icon-wode:before { + content: "\e754"; +} + +.icon-icon-shouye:before { + content: "\e755"; +} + +.icon-icon-xiala:before { + content: "\e752"; +} + +.icon-close:before { + content: "\e751"; +} + +.icon-fullscreen:before { + content: "\e74b"; +} + +.icon-speed:before { + content: "\e74c"; +} + +.icon-mute:before { + content: "\e74d"; +} + +.icon-play:before { + content: "\e74e"; +} + +.icon-pause:before { + content: "\e74f"; +} + +.icon-unmute:before { + content: "\e750"; +} + .icon-icon-tips:before { content: "\e74a"; } diff --git a/src/assets/iconfont/iconfont.ttf b/src/assets/iconfont/iconfont.ttf index ab333cf8a0e87ee4323d1a86cad26bfb96380c6e..80df28fa9a01d06bd69bf88269e9a507d2c56f88 100644 GIT binary patch delta 4472 zcmahs4R93ab>G{)+tvNwX>V`uPp8}4yWP{Bbdv5@Kj?(SNq`U_AO`Fbia-*O2uUue zK@P*BX*%Pfc)*CnahgBdiJfUvDjVmgjZXF6?XO54PxOr23P6JMrnAWdzLJD649 z?n*YDY3jRu-}k=vy}$46_r34!a^H_1x+JMHgun$t$e|-A#^-+c;xFGNgqkCSP8^+H znEK`F$hQfx-XbLat7DVn6Fo04k0b92LirdHn!Xl#7V%dQlE+S*I(>C$RYQIMf#c6j z&mI}SV83!0<*(qlc4GYW9E?)GkMlts$7jY*OnRSFH!Kq({}mcNIyZar)MHlMly+|z(5SJ1#OfObf|%LKGY>fI)wZBp+s z0lgsgUK7wCQr}<#dPeGfCZLa`UNync-;X!~`c3K^RlUIhkNtoNxEN9&Gy#`I>YGf! z1(JHr1Y9bq51D|ACiP(xaQURZ*#ry(sc$g>Lqh6XO~Bxg`iKccbs@6N1dJG|kD7q7 zBlYbjU=&GxhY9*Ss_!%bBTMRICSZ(7eU}LsZBpND0>+)x_n4sXlKLl1z;{9F4-um3 zjs9BedrdGl1Cpo<)J@t+57HC#*DYSle#=XiH?73F+xm)ih1qMnWzX4X9F*g%nojgpAlhfop`6F_byhPOR zl7AxqPVSO-$vt2o1)E?C9D*r04^P4~@E!Ou+=dlGIA6h6Co$Z7Y6(rE1`&PH{XuOA0!j*OK&Z&3l!D7# z)A0WrN87r#LO@uvh8ob-b=_=%VdWH$EyfE2>MN**5z}(Tu$a>2O&uR zrD0f90?}ma!X}s8mQO7%e(8gq<8a}~?%i!OZEZ7La%)D(*0VKvsO|k+DwxSlxFzcM zN~u^VGdP$X8Ofy`QaZ#%Y_BanE{3<)4)aI1Y&;xV$`FLB;mL1_OwPOBo@%dl>I*=A6 zFEAa{Cl?kj!p_g1J^PnG3kNza_Fa{2+uF20EJ;nxVt;?@=%|u)q!J;2)c)Ve_NWwr z?|<

QA-DVQ0&brfz*1=vLmpKf9t0z^e;^VBXT~agX@`!jX#70e)Y&{I`|3^e2&2 zubbr@HR=WJuNUEa_wFrdTU(#WF10qivZ>HEyd{_4P=r^X8LBX)L`sgIYEH%9SnTeE z>Wy@vEq6mZU;2*E*5-Dd&YU`x`2(-L)$aL%K&e?O^yZr{mJ+4X3(7T$Zmc%Pt)F@* z+TK&(0svW>*_j?vma-SK_$=b@&o5pa4D7E(YCHD~M2GkNK>HSaWneRRX|6q~-L5P* zdb4i7ntAlm%#%KQtJAv_rCZ=1GZUFZBc*sM)m>~!CEK@7q$e`__I-a(bwItDec{vT z$F6JV;dj4%K6U!(?B&Z(^5uLu(><0w*iy)}CwoODJs1ndc*Pg?M@NpP4`#=-sc1^> zd>9_ynBJVpY))^~ZnbVo74GZgwFm2-<1ot z{z7{(0}Fa`#1u?aLO(+TULnmSi}zqY2E5OYc}7g+pyVr7p#Wln!GtE}%SBm{bi5aI zoVwGoy8|CBY4)(J9dI@_I^i4G{>|G?pU6O{b) zm2^Wuu%YD#Ck-y`P=sTcPgyL78WRkKc2%r_48y#BVSo?=%)M*t?}K8wAIf>%@_GcQ zlh>0i>nmzWUN4;6r~QL381z97Tk7@`;jz|xg}nuQ?zN7EpOEk0GgphsjhK&8pkKzE zh@oa!P;rHjgDSj54LdoT#iqUGh&!~m5aTG~;su@H0LdoscvG({`7P>4dWpf6^MVZ> z#8BBF1|C3VHem3ov7ye&Yb?h?8qzH1X0=<8W+*F-B<+@V%N}O!kk)Q7Dp;sjS!0@Y zn{$khrCAh2E;fu@DClF2%8Sr1Qoq7i)IzER?{vI5jH?Ro!Gx@oikQ;#0V`g2`dANM zFRT&4Ag;}vQi%?!?(#6pv>c6g2E*Zo7%ZPEVxU-Q8 zHNN5EsJK6B4h^xJhj8HHLXDqC2IMp*UECpk1pkFI=UklE`7$c!xTt>_2deXPhRBDT z@H5oUu((n%(&d1_VPt8y9!rjv%azmvB&uxEs7_DXb%*2bxRjX1`S#mR%B3AyBQ=D= z{swDFH)dS=`CPq+o70M=XbV;^ zge&CxajUGIQMnytJ<@ng%c+2uHT*1N#ZiR-tDl}6RWXLtOS2K~QMa571d_7*Q7$qY zmSyVM;o*ibuUZ>=dK#>J__JHL+QW@ttKi;g3{z9wyt~0Ia`(@0A|msg9EQ=b>^iLd z^swFP4Lf$dzsnK!T8Bq&kLUvS^7Ca~Uf<<-qQ>zkV~Gk@-6lE6pvbrV8su5g~?#< z69RcX{oy-SWSYSgZJhlIgYUixq>^0G^Oat7vN8$?l3b;Pa*SgAEJYqWKDD7*-7t0h zopt1(TZv3TlM?lOG92~sHE_o=jz)j5xiR73s6pVfz0HwQ#t#vCTOSI(dwi<5TJ1HE z4Sn~=-BCFbQQRLy1a~^%aKxK(lG7h);&}?(o|qKt&ITyTD|JM&($cHe9qKju3f+cv zcn9et_?ZD^Ax1UhUUg%1@xsA1l`zCrs90sBVK(FaF(` z15WlrmC8|Y^y#O2#s};U8`rqK!|Bq-I`#y^w8OLT3CLf(xbYFY6QUha6_&lxtl#3a zKk|272P>6>b9&Py^(GR%5+ilRDX9kz2LcVnU7g)+ElSZ!wIoulZg=;VqwZ~fzio48 zH^cHN9_WY?=5}@2qjnw+C<8lm{v87fSvteDU;Cc>?`;oQx)@CE`p6Q?e!Qi@xq*)} zbd3pp&4S-4LD;$J@rB8WdHeArvomd{=O<4ew;AYX zW+x^c26pn;?EJ#y8pHAN>2d3k>DiN$_Nn>l>61r(XL54JdU9@Za>8FTclI9aWw%hGi#1e1Q(gQ;0nB-{;3AX@Kc0V=+>AAg!Rh+jUqhTAu z+WO8(u5A!Ivk@A76t)8ryiTza{YZn&^P4e?TUztveo&zs0?-4!5Cjdnz)O(|xWElE z-9REGfybiz5Jdr7{SO|Dm(2!R|j^+frOGt!&X854&Z{Evu-921;4WtfFaUhq7|kExYxBY(>z`q#$du05`6z zmM166t5<&eXR@SbVzI$E`s>knAc%A5kLP^>#9+9uC#CcX71VN8Uu=9Rh*5ED>c62} zV`}upJ%5Z#_>ZDt|6s`HOU6eGMT;b~Afl=!(g`!Cq0pUvC7L(DzSy(S`bK;pTGad~ zoC4}H_N%BRalC@XQIyA%sHxaLip2^BlR^r^sxXl59~G+f@3BlhOLcamJ3NsdH^*=k zhXgQ}OQq!|H)gt=PM1$}^Q2fWdsJ5-Gm&`lEHRM@xKvNMUOd>}zp!sDcvLB+3t>Ga zsh;yi(L9MKkqamBBy#+rcY3L`5;uo+eb|hzl$NHwMl+f8T`Vu_nT)$b|rEl{5X_Lbcu?uKKntTRw&dKxp^4VjAK=~RH=mvMlbfJ z3*lPjk`lqodBoqTLSAmmsOi1Zx@L<>KEQm(awT3CZX;Pq!G?=ytNnj0dK%^4idXv!r z&EIXqW4Q;4=4<5RH%CLVuV=-<$j_0)w{rQr+1uOeA6Z1mG8t7Ig$0TOa7Ddy&*$~k z2Ht`PfAuI~aw1GqP~d8pU4O(qXsHP@a;?G)@ke^+TwgVuwIIHO!Kjc{`*)Rrl`Kmc zUNycweRe?C=3Y}^x#91{(?4A7oNVynS1I4lkWm^FFW>77u79n?gE|B$C3|cABwR zIHU=`mLA#On^6*xfkD)W^1?mj4!6T*mFcmCq36X8-Z`Z;(0+|&3w zM+lo^*2jqpPd~kyc|4R6KEocckVZon4!Ow$yuGp3kE&t*0$AP&rHkrrKXr16N|XoA%*(=|e!T z0Rg&28=1Ve)5uf_bubmDizkQ=1TXeQ#d*ZzfQhUfqlL=R5s0F~NB%_AVKt|p;|QN7 z<*D}`7;%uL*69f>)8oY1;Gp}>M(kr+qVAw3+RZ5i+09)U2;}-wdO?g((3?SHNHdbb z7jEk2&MLsiy$$I1fIsU^mv?I8&VXmV!l7E{mj(PGEG}r8P=gssylVW?_^m9%?if3T zVJO*b8Q>Yva4+jRf<`Ok@nH7vcUzQH-qqvGA9i+qzc`ee_!Mf_b~V0mL`_B{5s?$S z8UAd&nv&OiQ&WlK51pE1G7+PEQd3#?hZ^|t)7`u{nT;srRg9^ftulk3KETpv*VO5{ z$!xaihSYJBXPe90;Rl1YX&Sx9K9#KDMrBt3mROh_Xc)c(eu0h+ewqzG^bfGQ$g0f?3D+$H!-&#kKgoUQ$rjz zd<{)9<^nixk+I6whxEV!y+6Adv1<7rJN#CqzqL0#z_|f?eR0Y7fb|2b_Kw>nw>>}cdli(%zwc6zWNa|*X<{{sYh3=+M*!`R;4Dep)A5MfH{^rbk+cd3XR1#-<*9Pk@ z#xALLe|LUT<46-1!%+Mi3uEcSNu=aI%ZlY=@t1Et9S=Hn_jcabPA*$dG!j8`fJ^!AEP7AyA00A2tt%;_~jXqpWUvF|A6lQG?^vE&l!R$9?XH=?#r`0|(=i}^- zUPn7ols)`1`m>ThxN7ry%C%WCGFof)=ax^f*~xyix&$~}pRHftC~(zvK50CWA~r@` zS1r`?+H*@kyG+Waul0ai3Omp9W`F^FtSnlkkD z79DEXChoa)B(wT&HV&(;tR9v!#Ea~4-+yau_47Ix(xpt>e?13#aIJk6w>JtPdJJUz zJ}H%!>>xoj(bFnUh{Ll*t&f>9$r_g5Qgunh7>%-jF(2-2zQ>9L)HPR4Yz>C)t zXb+dgxIY~K1cb#>hg@CaO>}Ujgp{wYtv*l`1<}w?2llz){_W!P2E7pJx1!my(0bE{ zEbvq46B614*-E$R5=bD*p3(DYU}5Oc$+=~%uI^AA=)7`xS{kFryZBbqzZMUoC=dth z-W^uprU!U&d<-lewfu7V*=n|%6zvVNs3rRd!1T*zipQrv}e-z>w(Ct1R{Q=Vc0I2|=l_CCQ(B*c!i zD~t>(6NUAVQ5v!UU^$?d6Hm}ly}Uvj(Hgx%iar19r-Nq>%ZUg5MJho}m4P5J(UNw? zfO!1W0T1*@w#t5Twj}^b*I;sHW)UcQ3ORD8uSS@eYvKTrG4i6GJcB2c-#=Ju?3pCh zMpCnpp5M#;+jM)Q>yW;xs=38Ue~Fsk01nF&%KTOS-5^xR;wLfWV{zrYn5WI{-q54D z-02q55KpR%JY-})*>Xl_SX|Z@PxgBWMv)B*fF>HO{ppYxg=})Nket)+(cg|mp6!D$ zqIc3xgLjIV6Tx2jvl9H_b^^4{!*?Jx_t#BeH|$>*{!^y123=#j<7@QBG(9W^T(P6y zY3;q6kDSTfU8D5Wxud<9Um?S|&_XiBLxB$>=w1%bs|v8Zk~DTNLDmhiEcx-8BibAw!Ne zwDyp7g?P^lnstafn^d8{TH``HNt3^G7siB##>8|w^8VXnoHn??&}$(5iTcu)RtSsi zlJ9qA=Lxw&gP?fj880$fod*ik_G$AY5UskNCiLKvvNxPHB*P@cv8wDAUm# zTA>Qo7Ojk1^qIoEMO0-ItOE#bb18yMxv~@on3CsU$@VzxTv?($IDRECYRG0+=RSzA z-QET&tP81~f^h|!P%OJrDD2iLC~{~hWYqEV|EBR?9jmFgEDma=H;t1P&lh#UEJ?U!@4 z@g`;3Z$!7%S8&2hB1W4F(i4UUXBBSeDh~({hX~!+5K`iRDkxOJy-0|y+CpsFVEQV7 zszZ&2AwmP5tekM5BnkqZJH!tT{#ujC$SP_Smt57Tcn0A(5}YYyR9q2|nzbB@;Gz86 zg~>dL>o-~-$i0djk`;xX`BI1n4#$uPbbKVmOrOe z#!kva=T3m9Q$?UXH~?4fUteGrx(g8z3eQ#LB1+E+3eG6NMzVzAgk;W%p@*A*)97YI zX+9hCkyj+hyjN_%Mux^okDcRQ4wt8fA=2>%{i|${h{3R&xX{MVWH1s(Q7715Ya#08 zvd!h^*%zj@v4!&92#U1x3Sme^$*;@lX*1ZF)5B{2sAADt7e_SGan(4(^;&E0hwSv+ z>+JcIy8R=-Sb#kTr!ix<%wODW0v@7G>A@fTeTX1E+}KSuT}QVdcKaI4z#5udZzBq! zFqACH6q^|28DL5Sb9=nN_hikVArXtP>Y(t_?i_ZYcZTG$fkfnYUP|wT3Zg5Sgi0wx zhK6Y0-Qy*sJA)GWWEfT_mz?B?MIwfHh2B_^sRjd|`#?4x;YrPkR#~%XO8w16aB;`| znpUSC6;g8rVJa^HylvTHshslC3Cdw~pDVz1E6ikSKHY);<9D@#9f7>ed0y#GHkRmk zq1?eRX>o;2^ZN>(V7-mOuo$SARVERd(m<5H0ROQsR;(2-zrJTI2m7b!J)>v>855Ij zVnN_Bg@7j?R|agJS$dHw=P5RuI^htaZJt*;vUc*-VOTC(vktZ6_x3^*=evZ%9lSj0 z6yI*RS;;QCe4&t5*)h~x%+`ob?U-yn#3kCWj=&3szFQ&5DA}hXBHLkd+g?;gL8G#$ zf(?_#O`D6po;%t|uj9DhgMBrx6=c3XO)Qnm?|TmS zGkYr`%t@j5A^UK56VT7J-8oKW$}XVx6}cv6^+&$N7hHNv?}ox*Ox2gtSRCR)Hxp^&F7C^H8Eo zR#x+%uY*zNebF0Cewv(@<$AdZ@GECkl@{i%h%y&tReI0)(0z~Hyv&H9=JsD)xJXXh zIP)CnL@Wm&rjKH1xob4Lgs-&x>A8nEt&aAU9MGAPyl;7CFzN%gmf;Nt4VmoRxe~Kp zk!cbtLdcFCNFC|6p@i}~!T?wMn@sGGcF)p6ukY`9H@%prOj%^msF>19dPtU9Y-tDW z=s$jvoHu1QI$C$Tfbl&c+IhyQBEDwp!1XeV(~+`jTtc{m1VR`a_P2B<&6^V1p{Dkt zEOo!4rLV$-cai7gHTPjp6CDSY;{zcF&1sRh+TKtthJ~rNfgpw-lt8h}%ijba2^D_6 zji5ox+QU8uV+oFtnGkHPFm?+^i;t1L6nF_FH#}i1KPe}BzgPQ=Jn^;axVTtFJco}Y zVEXhOdkL9megu94ncxKc!O}#PQ~i^kO;wtTtd)rTaI*YgQdycV!l@Z^A_jq+}-uTkXSpvB{Up3nN4C43Nt&%Ug_w8=j#-m#5XIL zED7oVm@{<^XxP#t!(pbniD+MdVuvf&-;yFEvz!lc<2%Zj#M_GlOQl8zM9e}luLReT(3%O?cpLxR!hGQS#unEHy9hThZv>Z zncP|Cpo(8Z=mFtMkHV#&EcptFw_6e+iMu{YhoR)u4B7ilArofIrD2cPma*xgrLRio zV#l%VObFmieI#GRRTw6xQD^xK#5sGdgY|8dwWMWoRYznqb6=w0qHPU>T%grT-?cJ8 zfxARVSbX2i--8q;;umb;oYYHUZr*XcUwgJN8w!;M2Laj)Yu6)fB5D3n&C$A1tT@P# z#k@QelbBd{w9rLfM<)scoShVFN$>jJO3KJa5r;~qy0W^w`hqsRs=i-Un6py459BdC ztn*I$ewRmPkRx4$pSxPR1LH!>f_Y|yFQnS?Z)M|%%)HGT%^5TZo!eQs>_%?4Itl)# zXyowhFd$2M;ccX0SYu}Tl`3DjxdIb+ncUmdG=cN!W}hUy2hE&{)77=C&Rz+NEBB#X zf~-!K27dwh*~_w4sr>nzBfN8x&jv}dxEnccp`CQT`!CT^u;m@-e7^HhG7^;#fAO{? zV3KEk3V$DSoRlkkx-UN$^X*5uayVF#xPmj@P!6z_i^#YEqpIQ*2okGEXtxkEOz_VT zg(mVe^|KmT#XvCnA?&GIf2(wfeC73sMN8Cc9gN$vKKK8QJQyoYvz{}bebB`%w8kVx z7C{MWIe8fI+G$R+KD>==B^$Q6I+!VcP>Jo2th7JrI5G{LQS;_W6q6p}gPE+VS>jOa zPXaQnvaGsfxb3!0j0IrjJ6hhI=tO3Msh~hS)PiOTnJtu8_A5Cwv8MzpQPnJi;Mv)HG~YBf_R}y6DiTk~7+;1KJbStH z6};!2P0w3f7=4U;t;EfxvSBBkn$nRh1xPl&IAWXRmu^iZ0cXFiQhx54tWLNmI&d|q zWv8o3HT{Ih)ETXKn~_889G%vuQVmHz6Cg#0SX9X_(NbG4r)azcZgm8r7 z;d%#xts8LLZ&!~3qph2?38%3_HyQo*g=2@X`c8PQuX;0(DMm&~h<)OsLWaw6fSfmu zmeY`i^r-|#Wt=zBLiy7|*kp*y74f<2P#q&pOPJ~kpL6Rk-KP9ez11w*rS*b*MK^I* z37^0+nQtx08qPsStgEtbNDdCC^QI%K{)Lr?V2*$dm7vvqUxue>V3SpK?l@SBH)>ps zeRH(A@2;Xx_}4YM^HGhKv{@Zc0J*dr<`~7WCyj2q1}IJ2#}#3mGRXx&#ddWbx-(dU z@mtj)!67z1wC|(KDqOV`c-#)si{oscWR8mZ-ML|YDzmbYjve2u zefi9kZ@#b*$-GU-K8I42xz@OMi(2ig;Gk5LllwR_nd#&DgLq>P-jPl@0q=W0)*Fne zlETv8blJ8V**L$R)WJ?!F|uEbY>VesQTP2I^if$=x2(g}YWs2WFOkzK#WwTE!!bNX zRuW*lLv540hym>fY^_i%oV58wYFmrC1{qDGAV#VDQy+y1$ge`T!wm%X2t&{PXx}XC zq)O&h}P_So> zCTEG#p^fijW6Dr0+})cp9ui&89l~`#C&~BsjN2U8Z;8v$5B*tiJ7@b5V{t;*K~!!b z-TCIqxW4PAgR{LK__3e;Ri&ji7P`$$%gw%tSl$(GF!s9MP57x}vu_eVVS1PJknv94 zto4Z@!>0WowD%}<)~_ITm>a1qVeM#Tum$l>pTM^$Y3`G!U8= zS|{2Tx*pc@3$7O~*vQy{*!?&JIF&d@xK4OXc)9psd>8x;0yYBg{|l`_W?gNqVGVjN zWDby}(IcMB-=KgXeMk#U(}Z$Jz?geK4}t7Y)LnDh`))$_!^D3{Iic7uTNvRy3JT>47QLnzV-{cxW&9)-$hFB?&mj!M+kUll?FJ>B6nIij@6J*a zUbpf_Ch9vgF;RJ_i)HW5G$o8i)SY?HYJ2$qh?c~WXeOVeV}cB7hx(9;$~&+5AM0S| Xc^g%F_E6Zr8Y=#a5{Tr9{0HSt_uW&i*JNB{s1$p8QrG>8+%&uC>~WB>pW6aWAKF#rGnHaF8+KWJ!WVE_OT zNB{r;AOHXWBpehM+GuTbcmMzqXaE2J82|tPRA@#2{%mh!VE_OTga7~lEC2uiEI+PB zl5JslZ~y={5wHLN03QGV03ZQA0)=j2ZDjxe5zqht0YCr%0%s7TJg{(Yb94Xz6A%CZ z0J{JH0V$3Ji1U*O0YQKH&NzXAm4Sh&lj#ft14BQAW_-8r1w!@+r3*|jIR zTNoH6#Bj+2^gBmQGrsr^;+(lS^_v$S56+|{ajuiktA_y7Oi|15?u%;kR}-ynbUjLSsKA%;P9ffsl;@B@EP zjEd1xp5+)Fz1;PXPk3pxtC#&TASHqoenK_P<$K_eUEU=(4&6)^Mg*}GTv?_at5 z?8PgM(|WU9ZdH)B8&*sQ9Y9*8Bbx|0e$9#%8;_COE^6gL?x2v&uU@;9HdZe^qm?NI z?MI=nwLE`Wjw*AB;+CqegOILQ)9R@0B5b7l!cM|~7$Da_kY6Ef#$p%_jnPt;qdwA+ zXSop?p>Lz#H{dt9%bD+%%iVbgomA@0x`Iv`yxR#boetU_4|G_d^B3efQZOnLG7HQ$ zMMy_LV*oV!NEk%O)lt2Vmd415aEyE%H`00^Z=!!OE=EBHco~TIhv{H64;g(Ke~w|CL4YF63y25Vmo1PUHOP=SLNOfpF5g4KaE1^^hJ(>k)pX4FZ6VsKxei!$4DfaHB;4?WIkW1C1CBi_sb?fCIWp$GsUWKx`Pm zs=XrvE`p%|Tolt?904deu+H)MyfF`R@>Zj60B1cE2*YB=%ao7+%Y-S$&UMZl0N|7}GR4~;Wc!6N2*043#;yD&`d`V+PRnSCeE2eE}gvG2?Hp`)C@P#IAjc_! zE!j_WIiv`E4jdRV<*Y&)frvJb0ZEl3h`4dr*JMfHc+B$VhM%|+=i6?n7A12PnP8Q( zBt^l*(L|B=;*PKSpHd~*v0O0&LqOQJ`^0q>OBFD7=u`Y#2is~ZCZ6tde%CKWCL#8g zg%J{UNz*KJ>>3afGom2)jSqi-K(r5maIZ?Lj=PvB21cT0xTSJxW6ZK{)Crs#ugIEG z_B4q_f~g6bZvHR_j>mZp0~}Yff|jhW+XJJ( zO8>dA*E~dQJ=dBC@2a4$4t;GiRV(=+=dk;5o7CLz5@bkUQobU5Rev30-*~q3%GT*q zCvGr;1L<&W|8NW6mly#K*xq&f*OJ7}kWVBfuqx1N8!b+JEr=dRy4?bi4A2b%;FS5=-WODKOpGl?l&bj_9h+BEs?_=!76E4xEEsc37%TMDj$9$Cz+}B#K00wLfbJ zav~`|C+pt}qW>;wreMilqofkdv69A#2qW34K$OyW5y^I0cMN|}QNE;F6;-bE8lg%i zKNeM1;&ek$=)rx{3q;kFz;;zrc}6qQJBHo%JhR*kf9HaxNrs3d<%$27T={KIY4U=p z%7QK`$Z2_{Qnb*p%`e|%sFLP|)rzkY$vA;>&C*mUt+){pi^Y8&DxKm5)sYQ_fAUUF zwE|n?&rRO!BIkdB|8$J=kH!ZpS;FhC?8nB~tDwm8&)I=O?w3r3m40_cR*|omlS`d4 zs&pp*tOw}e_by!6@IG_4`kkkqdK!gpSdz4p%b&Cj7uByhFJ!pp^Nm(L6{SCRjo((a zV*DtCbcW_UUnBoUKFxScmnk5kLlB3&U>3Ni!3+A<67Lcr$bbyu05yQ zu8&dx>H`5U@M!Rb)=ZPK973))9T|+4p}P!u!4*BDebBsR+WN4{fe8N*4Qjo{q5H$6 zQ=WfYnk$!m_i(q87B?43xpT+~D$}=l6rMYjw4=dwEl+y}^IICVdPVv&ZDg#`M{oJ!bd=A3gjU<1>BO zJ6odpH_ecO#RyGpxjv7wx-e@Cka$4-0?;Fk>?sM17;F*ai|*!pbl?lx8&q@Wy`u zZ!KoPjG4~>e+!ElO)^JN766Z)KQ*7(Rli~hd28T<-9YUH<}nf|R?wwt;(!qi-nS#nZfNpG%x z1aqT`q)Ukdo}OoQ!_X%SFhj;XRs?@HmUXF8K)AMj8$DN*bREM_hdo|ecVj!TB!UnG z_Qa0e^{?sj+p?y?O)tSrY1%;-d4#ZBQDUwXBG{3Om5L0E@`_=6OrJNkq5swAS(fop zE-x!zb$L-elBO1*HTH4l{obMq7}m zUmc_qX=_?<%m!iN^yI&J&rW47O2=t5SJ}De#;}>NpizRcGw;=dgH=(rSV)*SvF2!= zep2@|rzUdnhJ}={dN8Pa^E-wB%E~6q5P$2)qE%HjO|4psN0z*3V?H_a(l(uRm`<84 zdcI=-l`5q|30Hxz(Ru#LPJ(}NnC`s&(wSs_BX;+E+CQ=kew$fmAaFWRyPz2cGp(ai z&~E@UZMy~-ib{F~mT5^fLVM`>Jgq18G<{YW33aFwC^BH5GsUO<{vPp}kqrG?UohwYNG-ELi^LYD??KltPMMDP_W;uUV3#*-Mvw!vn%kJ8) z$|9+Aa}Z@dcp8LjB~jBGoUo@~Z-J~gGa++~VOoQ0RbVCFsl~>kR<7R(Y)O3zTAdg-vYW?PSbTuAqcyW{C;M5E!_BP_4?%)fES|)~-_%+!e;?7IMm8Nci}uKYaN7&SdY2UMuCw1fnAH z5NE-n`nZ3t;~M>30YXnd;(^E+afLL42J}7r-sJQ7)=gVE@)9rEICkpTdRk5P?Mu)_ zxL4Up8N9(o7XAH0`Bs)~XI9BK@Z9lnnvRe49_lBPKS=uh1f5CxlU*7&(HWMV@%1kG zB2lI}0|S`~hb9cCrV){)bgJp2aKWvwS)ef{a1ZhHFlSD$S0Y7_~z z`@Znhx%KsPPkrIOnh>7@px>l$qvKYI`5$rQJMjPj0C=2ZU}Rum0AlAJZR>b`o39Mq zEDV1j@W7s15k~+2|G!?soVgLmK)Py_{t0sw?P1s`~vV_{%mU_rtXF8}|tpotNO5&8hTN(89@000000001N0FVIq z1bPI}1rPDv=aFERMYflHBSiIdAZanyE%vKt#QdEGTR?;cjRmFtNX zxXQ#srOW-cwGr3Z3l4)?~ItLkLR%3nve;!cM0DULJ Au>b%7 diff --git a/src/assets/iconfont/iconfont.woff2 b/src/assets/iconfont/iconfont.woff2 index 5dd256c87b254cd4a46b0dae27b9911ebc950d24..53acad625e6778be2061a6acd3a9e98ae9cd0728 100644 GIT binary patch literal 6132 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 Gn~X-C@!f?0 literal 4328 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 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: ( +
+
+ +
{hours[i].name}
+
+ + + + 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); + }} + /> + )} +
+