From 3a7bebc33067a39ca0d30a6ab6f5804f58de5554 Mon Sep 17 00:00:00 2001 From: bunny <1319900154@qq.com> Date: Fri, 18 Oct 2024 13:51:03 +0800 Subject: [PATCH] =?UTF-8?q?page:=20=F0=9F=93=84=20=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E8=B0=83=E5=BA=A6=E6=97=A5=E5=BF=97=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.production | 4 +- ReadMe.md | 6 +- {mock => build}/data.js | 3 + docker/nginx.conf | 3 +- images/{img.png => 1.png} | Bin images/2.png | Bin 0 -> 59421 bytes src/api/v1/menu.ts | 35 +++-- src/api/v1/quartzExecuteLog.ts | 22 +++ src/store/scheduler/quartzExecuteLog.ts | 77 ++++++++++ .../{monitor => scheduler}/schedulers.ts | 0 .../{monitor => scheduler}/schedulersGroup.ts | 0 src/store/system/menu.ts | 8 +- .../scheduler/quartzExecuteLog/index.vue | 138 ++++++++++++++++++ .../quartz-execute-log-dialog.vue | 77 ++++++++++ .../quartzExecuteLog/utils/columns.ts | 61 ++++++++ .../scheduler/quartzExecuteLog/utils/hooks.ts | 99 +++++++++++++ .../scheduler/quartzExecuteLog/utils/types.ts | 24 +++ src/views/scheduler/schedulers/index.vue | 2 +- .../schedulers/schedulers-dialog.vue | 4 +- src/views/scheduler/schedulers/utils/hooks.ts | 2 +- src/views/scheduler/schedulersGroup/index.vue | 2 +- .../scheduler/schedulersGroup/utils/hooks.ts | 2 +- src/views/system/menu/index.vue | 6 +- src/views/system/menu/utils/columns.tsx | 9 +- src/views/system/menu/utils/hooks.tsx | 23 ++- 25 files changed, 574 insertions(+), 33 deletions(-) rename {mock => build}/data.js (98%) rename images/{img.png => 1.png} (100%) create mode 100644 images/2.png create mode 100644 src/api/v1/quartzExecuteLog.ts create mode 100644 src/store/scheduler/quartzExecuteLog.ts rename src/store/{monitor => scheduler}/schedulers.ts (100%) rename src/store/{monitor => scheduler}/schedulersGroup.ts (100%) create mode 100644 src/views/scheduler/quartzExecuteLog/index.vue create mode 100644 src/views/scheduler/quartzExecuteLog/quartz-execute-log-dialog.vue create mode 100644 src/views/scheduler/quartzExecuteLog/utils/columns.ts create mode 100644 src/views/scheduler/quartzExecuteLog/utils/hooks.ts create mode 100644 src/views/scheduler/quartzExecuteLog/utils/types.ts diff --git a/.env.production b/.env.production index 22b39b8..44d6953 100644 --- a/.env.production +++ b/.env.production @@ -1,5 +1,5 @@ # 平台本地运行端口号 -VITE_PORT=7000 +VITE_PORT=80 # 预发布环境路由历史模式(Hash模式传"hash"、HTML5模式传"h5"、Hash模式带base参数传"hash,base参数"、HTML5模式带base参数传"h5,base参数") VITE_ROUTER_HISTORY="hash" @@ -8,7 +8,7 @@ VITE_ROUTER_HISTORY="hash" VITE_BASE_API=/admin # 跨域代理地址 -VITE_APP_URL=http://localhost:7070 +VITE_APP_URL=http://localhost:8000 # mock地址 VITE_MOCK_BASE_API=/mock diff --git a/ReadMe.md b/ReadMe.md index 370752b..99e56c9 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,3 +1,7 @@ # Docker配置详情 -![img.png](images/img.png) \ No newline at end of file +如果想更改端口号,前面的对外访问的端口号,后面是容器也就是服务本身端口号 +![img.png](images/1.png) + +项目本身端口号 +![img.png](images/2.png) \ No newline at end of file diff --git a/mock/data.js b/build/data.js similarity index 98% rename from mock/data.js rename to build/data.js index ec0a5e5..3a172d5 100644 --- a/mock/data.js +++ b/build/data.js @@ -1,3 +1,6 @@ +/** + * * 自动创建权限内容 + */ (async function requestPath() { // 获取基础paths对象 const response = await fetch('http://localhost:7070/v3/api-docs/admin%E7%AE%A1%E7%90%86%E5%91%98%E6%8E%A5%E5%8F%A3%E8%AF%B7%E6%B1%82', { method: 'GET' }); diff --git a/docker/nginx.conf b/docker/nginx.conf index 8f09f63..90008b3 100644 --- a/docker/nginx.conf +++ b/docker/nginx.conf @@ -16,8 +16,7 @@ server { # 后端跨域请求 location ~/admin/ { - #proxy_pass http://z-bunny.cn:7070; - proxy_pass http://172.17.0.1:7070; + proxy_pass http://172.17.0.1:8000; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; diff --git a/images/img.png b/images/1.png similarity index 100% rename from images/img.png rename to images/1.png diff --git a/images/2.png b/images/2.png new file mode 100644 index 0000000000000000000000000000000000000000..b09d3c1bb0ddd961e43000b6c1ef56b3bd160814 GIT binary patch literal 59421 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�$q`%{Ur=?K7+XQ4Ma4tV;Y79mC{*0U zu0h~w08DIu+EKwKp?I9l;DVl-twxMwerZG9-Nt5Ffqn~|E_g??#GpgZdGgIuJn3<_ z*b%;ntin&1F*Mec+fw?Ws=BEkp8T^>%hc3dSnk>F>5>uGc)x0g5uuU1D~`9P*$}L# zY2L4oxE)tjP}5p~(DSAcunUC@Bda4zafO%K1219O3{0oX0Dg#>i1rMtemYR=mlC9u zr1$39^^+n>83bzCp#4T7gLlz5pQVzLX3kx*;|vSH&a|##y#P6HabIc@CR#nTHtf4r{)&U*!NKPyQmvk zH*n38SLXu5atrz z{y3ckxDFqQh8np}8#f9vImEv?hM z(|N-ErmIdPc^s+~Y-4wPf!NXbwgZdNtRtbw7e|n zD|5x6Tw*~zeAxAP|L1d^QjH>JQ+GcFL$H?$ zv>8)hffiOf_~M8S|Jw6L_EFn5_w&V8_VzU02O>UfcM>=O9bEp=w!GkPC-WW8&IK13 zGOv5{tB=QKdq)BJ`X$aTr0$!W(I2c40}0X3J_MZzxZDwCcJ|!C0INAx%jJV`fs=|R_T~d zvsJUUyV3jKNqV!QGV(|Bk*jkT3gLGrkmLWN^7wDf7n`wF+U+~y5)CzfTO}^xC0eM) zID06_**T^m&4Q|&4L)&u*rdo++x98na)%54m_n0Xb}eH&9w%cF(Uq5v!tN{^ijCdC z1PvTiZat38?qim|EMo*e9Hpr=bfWy2^AcNM>xJWGs(ryl)BSeZ?oSm!d zvS9zfj+~Vu5g>eF_8Id1U6{T9xt6xfL=g(d@K9WccTksO!2ElCi%b$T)uKRqUaq~7 z&hDG&3}IApQ+`=KvaF_9w5kneYj7W-260@08f1Itt9VhxR+Rz~JC+sKc^%#nINg`C@jV6+F(k{(DN^%`r@|0y4DQa-F%^{U-6i?rJF*z4$ zm}78opI?KYx7c#D>GRRgWo;+yZcKi)aft~_4@^<@dwv3w|Z2p=zHI2Vm6rmW-G>MY-oRg!VLNLI+>4lO?; zHw!PzcZmT8ugLx!80HMncd2jspc~6A&&KCLn4WO$kZKdIYHl>onJM`lQa0&xjR!MC=z;bffXxc=6>B2KtVqSMfkR@_K0Xd1svci(c*@LaoNbi1~3Z zbitnGL_~$AyucTm{hdN1F5T5BgQu)U)QOcj@1(BYA6c`mfVJq&h)SR!C0DI+dS?Km za7)2-*DgT01JFkrYW~l3oW0mR9`~Z!-OU8xf%i14vTp#rWWQd+ewJ7k0U}q%>UOdm zKqLEjc0?!ySRNSMl+^2|4h(L(tEfs%EExboQdT@^+rNPfi)WB?QwHLIZ*#z^Ko|*d z15=g%w3EF44M0!<;3u5)n*{drdr12=laoUM@Hy!t`FjoE8q5<0b|CG4GO*`v3P3n&aM|KePB_f|>L;(hX|8?TKn1oc9 zA?!Or*fW=vBDiU}JwvPQLB+E5?N&}>zVlrLmq~FQyWfWoZ))f!4eD8Ie&wGC403_0 zD5(2IOZ3z;^k`_S{z8g(B_-HJiwo#<4``wtM&^X>KE4%wX-*SXZ2Z0KvjfSX*>?Tb z`ns-1b6Bos8c*6SEcLMzUVsxcDX^dZpe-U)BmfP7bWR0eKar?-?{B`IGgI`(nVc3; zH=ePUzpzq`61>IKDDRLG7~Q`JTx9CnUM33?e5KqS?n-O(@=v(Kwstn9p=&uU{-v@* znD6OXDLLAcsSW<*v5y{)B;2H~qS%`KC~MQx!M3L8F25;_ryU{DJ9+l5@{NH3PX0@a zXt@+E2Y^>hZhQnw>Gz|?)+N1hf zX@ij5gFDUO;$`i{F1WuQq-?eBHbDbGWzY$aS5Z4YBV_LU$bzD8m?m){_V8;= zM&%nb2liA^SG+o1buiNIdpo{4iOf~W>{|TZf#0Y4B*W@Ps94QiB4~T{A3J5N0f7ip zPrHce;fe~Vpk@75CjzhDzf+e`TC1BDugwcvuoRjkDM&=FkD;5O| z*yaQ{pdjJmv*+$!{4Fiv)!atfFc0EsR0u=SnaNFunYm-ZcLbC#9kJ4-b}md*bXbxHecyYV7+DiVB9bZ8d|*&D@zM0L;E>#Pi%UI z#T%AyPW34&HLC=-adf8LP@p|g$VVsK^!bvbh|6y1gGuDCj`W zq-EB1l0~~bqMl)y@Ni?M0~KyV&d!#9#awf*YcHG=?3W<@K#qFDtweA&n(F;tCMh|lI_9)LkDQm z>RY$ys;0H3T)@8R$*H&q^=n35aVf~f6Ym+W*)zJnG=Th)4BIEb)W`V{GJji^JH(zB(=ZpY>qJiC2fd>tj!b0VL>(` z#71u7Bnx&E<8d-d?G}dX-OFBkpu_s9ce&916B^}_|GE)-ZNiU4VeI}K%GsI#PtH1+ ztvfdhJoJNFuuU=!7})nJnvkgaNWo>fF^GKM_UD^~Y)4cX#3!$=x}iWkGt;g|;9Alw zdoc>-OtYV3{C7P7h0lmW=H~7{!MNX6!{DQ;;lWY;Xw#@|dGhdcWOwnbu-&Y+$c^=0 zmi*6M03xkUUv}%C{x_gZzp@L+_Kah(3F$`-Wr#Wi|Fla==i@76&IU;UosE4`# zyjvoCoHPv)lYZsKalPG!CXy`vzkc{yHfh$eCmX;SS?`x zUYSt;7bHCekR!VZesEzB>_Iz)irm2dKZ5&@l&U$mEU@>vi*|{L%tg> z47g`f1?q&l(8z!2+x^vLBIAp-*LKYYZf5=bPrKZ6p$1$~-L3wU*?7OnE1Uy9@lPWO zlK*1QxheqaSE_^3^Z!Ks|5Kq+tOjK5m(u&pi{~HzLqx6)!p9PTZ_BF}vn)?SY$w7M ze4<&JFK+dh{Sz$Uao~Q|Ilp^k`jf-o{Nc7lVC=~!>krVt z6L0#r5Wb49vEKeP+Pn^)ukaXUHdEX0=;kF{1BT26E#9)VQ?J8~|K?|S*)75`LTh%R;ihsUsS97Yg4+!8W zQ_Ndzv*Yf_HaX7!>^o4=)(Lz`S(%%hu|l4lPq6=n1|dY29BdEJOL?~<+RteFK2}KQ z=}I?z3hwD&KT1us=2P9U@Ql%693&^1! z75<$UxW}1+Z6HtjLYxB%Ac|8}yqoU+Ac6FcU%QiPhPB3jT^Wcg7(VoLwrJwgi5yuS z5-3n({wR05@+wjkXisov;Xl~v3nP}b`QWjEdB(x^X!8-Oqo z5dsER<7J%;m|bj(p_>KGVYA38aW3VB4T%XivEC4wmuqu*gArs`!ky(Z zG!>5R8kXNnahf)aPlmb9cM}}})6p(XaktW~uo)O3Lo^93?&PudJW!NKzJV@G5HHs# z+?QPG5}QG0wQw4EDP~?np30&d>AJUKvWj68B)}kBOO*94PzFf0*0mUFJjf07Zurl% zr_5RgNQm(fDf<&ao0PVj1Np4~j<8`xQ+LHUj~7qdG7!DHE3Jxp(1WNq;nnkn5@IH8 zpG{UlotBwQ+{xVnUa@>SaaV@bBm@gawzH0Z9PZyHf3~l!;f(scCDpkQHP}ZJDQLn> z8}QPpT(e1V@*xLW*Tcu(-}3dvNMDeSP8L|TOVq@PC4~sxG2nRnc{nn;GbfYybRM4> z=Nh-hr_T7ChYz`Y_`Pr1U?c8RJ$&z5eMMs_y3uU}9@7cQmV02eiTEZjjn3!mK{xT# z_q%P&LXWk&W>-}Rn94$tXH7Mw^4`bR8Tvub$zxnbu1#dS#=eyXjm?f$v32X$)y-#V z3&XlAm7Xh%&6zjiZ2xkE8WTOy)G zGZwnKJX4}xaTx@XU7R1Q8OHV$izLoV6h^r_dRW{sUTid}=n&pH!d)+zS@P8f>f$^o4YOLDdH;! z{LT~BQcclwy$AE7qZhUW-X9kXzy1RrD!(|fDgD}WRkg3}w##6$qAXx-uNz2m8E z?&5(bb0hRoM8A!l-QjSf0X9;Rz;zz|sxKSLfVt=WH^tkOOBJ44OdF$RzFMQf_(l^u z%WtGwRWe5Ywf6Tr`>t^cY2X?b&|nQ-C0O!I^zh`2sPjj5fg-bj9_K|JZ z@o^*_)egAc4f5W2|CwLi*S1#cWcqyMi*O^DAg{W-MI!6vTw~>$u3G`4B&ma5247Xa z3F!LVyU0a8N7$qhR;CPcX9>TlD*8gb_;#Itr?9{4##VVFa)^dwf*RIuiSekEQfk;L zBs>Q!#wqrHH(El7(7lUC<^m?`T^70JIN#N^`VP&-*v{(lv-4~X3h6g9#4(g&RrJ9*9H7Jj`0yQ{nU zbuDS-4fJ0*zti`kh^6U}AgmHR{6yV$bPy^;T2g&kn>}29w0|J6rsdh_s>eU(9pt_= zwr;U_BWJ5L0JFK2R&&R3D}gyP#axGBaOD9ID|>bAKkM|~s^f>wi)zd#2O+t8Vrhx$ z6IV602tn?9`;>Qiu-e8_L`0|_^G;6l=G0m+Svd~8IxhKTHCDlT@KdP<313H9*r(7c zXJI$5DAGEvYjtw5YDsoCz2hnJc38=apx~QB>7w>);^gYxmVbUjeSKm?( z9Vp7sDV_B9-t5RHEWLS^PLbFne35UIbDRHG<0aYkI>1A0uw{A*mRQRc(?U6V>tXYO zT$HRZ1~l6jBz3z%3;KOm2m8>z&7}+@kQOOFJ->plt1u|Etkj!qg8348!k`I+J^Ft- zt%r)~W649!J24RHxGdPtPs=M;A&hO*>v`PzS`Lp>6DkubdnzjnTG)E^Tq`*8&kNoO z`N$>QC^|%fb<7zm7^*cm1?f^(x?i4TZ2tUnsYRLYaT>qmV!aYWJM@LKH`A$84nzN8 z`&Ir{rF)2itc=b31E-guO+4G>-wqJ3jyG_?i3-d4m{yB}|M6q0lW+X5{~M|P zM{n-`RVVX*?qv4A*z^70K>ha~tp7Lp{%1oF|Np~O?#Xdg=*;XB?vt<~5SjrRH=pVi zIQjp?ZUQ$G{~J>(Y3G@+y>QJ8jCffc`^Ab^#+vnlbC+R1sYCHJe=<5%rxersEE0bu zkJ|JBIkfX_*4MBHtLe@yc~Ie!>nxqo zwyGtdgSqVD;ZGZ(YR*D!T(;RQ{`0HQW3wk>D9jJe9i>)yIGHuzmz@TXOF30}I&AkQ%b~xwwvCG^S72`DCXu&Pt4HTL^>XH2r`1rc3EIez z8q%+^yRg>2YoOY_xnX!#3TIpiONu6SQE`u%OcdNajr$+Fr zmmLRc^pUmsD^-?zTf*0VmD!m1EBiMQdB=~9zsH?|UpV0>4o2*fIMEmCto0+Gc~sxU z|08L5Z@mbqC&XEHr&M#j7nbXRTWLD5 z-=;J3C}?8IgJyCFS4!$-+xY)0%YzVXWx?u?r(cD1gsiNIn(Y>c%fPsfP!Am7r9jK^iyQ&#r3i`I(@?Q76=Feal%hq$(?h=^Jt9Rj|= zmE=hBd>~b5-o&V6#n5++l#>W?o+Z*}*5We;xTavk;)FoN&SbSQZVdwsA4 z-*#Q0q8@(pMNzc{nbHzshV*IXY^sUf`Srt_L(IifZKB-G2)OrZe}7a}g1yX+f!CJGsD$kiEn^{J=;H2VQd$l zDGxo=7y#+j;*6D^kNiS&Q5lZsyLOHlW%>IJh_Q%1VcfRx^K+UJQ(jJXN9c(-B~?C@)756iTm;MWBH7)Q-uLEPErWZl>td4G8w*ne z4U*)j`dL<6!8OT)l@+V!N!_O!gp_Jl8(?J;qhg>K@VNJUbKbWSsf(}0LTXkwl*MAt z^|>c^QKG|R{N0ZaXPzoWe~)Zyh_MlhMOCPYwHZEYBbd$NGYXqvdPrsw^v6jjgP)W< zI`-8sX9K*HW?9FI)^+O*b4FrM_r;43$uk^>28$J&G$R0_w4Y?;?IJ=&YiElLz|67I zWin|^!p&gxO}LpyQN-Gn0W+?A$kf`0WNSEt`@63jkWhoB==Z}n$(ilBlMd!yM`@{C zw|emh5Y{3~v4=HP?A@tjUUR{+eGIlykpIFj6?oT8&hymqoK9a zLceHyG(T?`djRmxVQCKgE{qj6p79Rq`)FKnOQWBo0-H?PDvq#(fErRIV zifa#g?zs0prZ`CmMY(9TeiBJFNnr2mv(l_idbFb>hd0b%dO$By*5ElXhSBVeS&GHW z$-As;QKk*qd^{`Ky}sz09>**NiZPX?==))!H>0tL<% z-RH zG`Pk|<}Aq}giM0(uPwgk&hdlJY^-j|aY@+my@_NXS};x4fnHScNf53d%gajbnOggC z!`PdhXLcw>dHo&-q0_aTtoY@=#Pq8RsJOXP@RdfX<_SB^kCO+4E`tA}Ir{O%6835^ zt(nrQ>NkF)j7gO~&+lKk$U{i`D}>DN_!2D5F{TI?a|?9k*`woyYFFs+Qq_|1dwOiH z-G1kd@|WL~N4isRf#=G7PW%%7ig-KKBF9BXwatUffU)dC#yjoltvo@U3p1}jFUq?> zypEqwQ1(B!5k@B1SQj+Kn5c2)4I>jl8yyiABb_)$yDKsAb0!bP@i?!g?$!Gogo%d~ zC!YmwxS+6_e1{iC(ks9=z3XWcd1<)4pMTNu)`dLqh_8`q&xD-&ylPr)Sn8afgltgN zKa#2t#h(+@bBJhaqqWEoZ|9}6&K8cUu+~((*W6wg80nneFo|OcAYlu52l9I|!Xy2q zxdkQr|H5|_h`qXClV)@HIioHDSTa9^5WXHSrCZ*pqn$N$vBQBz| zrZm7syPqzCW5N6+WZVYyZ2Ps)?Ko{dgyWXUHq(PA&=p@F7;3qHgnLvTL@Zq|DP51_ zhy-{|?Iew7;>6xJT(e9_JnM{1?6p&LG4-46_)^OTDFsrFWu8cx zmt6<(r`SdlggWA`AUe~obPT_Vk>DJlDSUfdog7D$G)cB%;7jk>$qe{$*|B3X*`C<) zYi|6Ev#XyYDV92pOExEvhatneywG^OI<>cZbu>=87#=F~bCXEDGnI}^j7yisg)}fe z4A+sZn}o~YaT~>7M%yPvJ1D-0LY4iVCuO<4`Ive6M|eowWvN#tu^^+4HLcybPN(4a zAK4M$6jZL;Uk-3*t+im*6O`I?-?7oj!f;^i;Zqu;SpmoWTU=KR8iZ{CSzcz#GE^N} z0JzZV!8lAPNVL*k$|Bu49S_QA+gf3zp@rwI7$o* zBok2PvdI;ZMX5rMB1V;+$?$hv60Wj$8p&ISt&cOvKV9BziCGe8^^}s?>UJFVgP*^~ z8oAW}TA2HSw0@Hh43=x_Pc^Au#C}C=`MjDSyOI{Fsb;9i3Bj_RDz35({s+Mk8Y)Xw zh#svl2hbM+ERmdJ)*$ZHT5nTDzNf3NJJK!7sAGwN&b7VXZvZ!k2QdE+d2e>ve)cCn zS3)&AQ4=b*ad?TgVb^s3O0@F$W#Jza$~l^oem<0=s&~PJc|j-I_c!+ldoL}Wi|18P zkAERsN7OG)u+~NHzk6?5DpntN+3$Prqk2Z`4XT}3`HZH$mxptxZG2@xIN3=i~ zcP1VMh;#KpiQkn}KJTn1%Hdit*ZuyVI22*vL_sQj2C%vNTf9HT+f|MJ zk5OT_YGtkHQTHDs59x)O=%#eRb9JBQEX*Y=@N2lGs(s;WSxjKvh@rGv3o%aN)rs^u{`cmw42j9;BB z1$_R$T?ZF>8+%1LBmc^pUzkX8@G?8*Yh zeSREpe)-cjZ^xc` z?KtDk^=UU_aTQDe8v@l08b+!Ib=9f?rI5GU4-4QO>2!sP>4Vmq-KGp+Q@fh{5=zc$ zz}dl4HUpd(Cx2~H2S>q^JtaA#=W3afgJo@cAJ_%C1V@&TPHB>z2FF&Ox;q=Gi{59Y z8M3T3H7(~xg?0KkovV?_i&wdl(gb)2%5*VB^lq0JAfQU{B^SOKxdS~GHgalPq&LRq zAs$|TSDY{r!Xq!p;hg4ttL1cUXa0)@>U?)!RqAFXQxvRiY)aQdzxIsAr9VZJb9WK9 zz~RNT0h7K92jKn|K5)jb5K#!w9RJX7c~HlYmGW$pAbo4@(@2V~i@?M|RsWYDV&DcN ziuo!>-C8#YUXSr7$wQ@rzIm@q=;rp?)(6#u#pTb?ec4gBu5M3jQY8JnT=xBN#z z$8^q1o{gokEIZySuzUd{=2;dG=-uZdwBvqKP1`{zpY~CySc*-6O5R10xg}VPiu~H6 z-7m3;@({BjXVD9;Q9%X``ztzBfgNjSb;stfv4d+}bd%Q{v z8|OcKlFD=5ARm>~)GM2g>L=DxrVC=#6*a-H%N`Uw@YoGPqs$lm1b7b-ACSKFgE#40 zDtA#qNJwSl@_Jd2R3cD%vggHbzbwxuJ=ao-JUkXJS&H>KucWAn0q?3k4upG(@jQ1P z>1yfIpq+#-)@+f-a!UFamJTt;W<$oT9A1rW4eNzkS!hDd5ysamMR>frR|@ODLj>VU z#XC}S`45)0k1?_ncw7sb77~#t$W_4M>7VB@`Ye&S6IKndMJKpKZX5H4f0VwdBp4Xe zoCIyK?gCr_pnw5h8oyJvWopC4RG^?^oMg|T}vxOPxSCWa%U zc_?s-5iIRGwy}9ezBG&@pm?!Jf$}F|=ESvQVHu4B(&!!kPRei=+IH>yznlevJ6IhxeY+ZBmV9ZGOw|J*>-k+U}ouZ{)zf+8J68v?i)hOy+7yvsnl3 z?YX>DUJk^6jVuc&TwTa|LHcC9cv4aXFiL;CVdgdZX*!|gPSKmq+neJ!snPlFrOn#o z9(5&E5pi??q$6fo#8JM?+1Yr_wAN}===KEfmBA70eB=01{^wL|$@cNL2D{L$ z>pZKU@>sFa?UK?*`My^6x_<9?AVy=QIeyr@ib^X|iv+n$qTN0%N@$pM?+LJj>T>Uwi=*=zWx51SH;ze<1OAUllGDH z6RBy{OCWP;S{NJm)Y1!85Mt18oRE&8eJF70f=$z4AZB%oD$Qc_hK+N^(9*1Y96XI~{Y4p8LT$R3Z{Ks{At1J>QTp1tX-^TeAH z(Y$QA4yqQG4a;nXnMc&bJ|DRrtVDA2o=%oZ;H2-;^c?#@)w%r7vd6<-Go7oQK?Koi zdBXN^>)qEXVhFV|x^egY9Er7Kiy?SK^o;@FB9+Xz9QNf_qCw$tk?)tED`KWV6`}}L z^QhNSA&M&Sd(%(N>(DBqO`NpruF++{R7q=fS6?ZLDGHf~U@X9}@7OZT zzJUo;tgi7Pk3x+Rf1nYQU9e*$PhPitO=z7P@86)GDu4CcegOrGzh(2(r!xvCbzi4mo&T*-fJ(QE zCtw3*Q`b%+`9LN9-4oFNFJI8xvGF}*@^km+jeUu3=J)DXVwvsbnl9rNcjCvJL)n?1)j@%2^p~xT z+kU)dzi~GI4(4f+>ml+}X4P)Q@5PpVbrnFjRZ>W**O>Dsb@Q3teY-IfUDdZk9dojd zu$0I6osjC$8$;9@%PaX_zDgsKJC{L^>#IdBcegt~yVu=LT@mfB1R$tgBa&@LeKzUl zQQNhM*SfJ5+_&MqVxscac}bw+zwAaeRu&RsL$Fe_a9#{N$thY(A1-8J?a`*p(-VA= z489$A6M^WY` zzwA$l-CI2m4%;S^+W=%YkIIGqW@o+Rx7nNf9-3#zhQ(S4U90a2nq1B>GRyEk5ISCJ zBpxmwyDj&BftT%^TVbkbGS)Dm2WtFs^PsoEeEfVY#e5#a^Kb)hqIvn2Yk}_n&FgPr z&2kixwfp9Z$P)0uzQpm|H8yn4K>Rw)XO>8JBBlujG~)U!)9u?An*$SPDABasGq)7c|(w?;$FaiGzk-h zIhuc({}!A1D2Q}KcbqUmCP>1b^IH+$qFr{}Z9`A68bxsQbPU3vxQ=@qh0A8SZbEpF z(%8ceBV=+^QFlMm`ObH-atkc!`}dKt=L13pf;+qmc+LE4g>&lNJ|YtRM>}(5`Gduv zz@u>D@nWGoWow^C$2WMh7J4+RbG(Bgib(~{?yrxAH*b!$9Bs6;tj|cSCDi8vjAn8L z=567nH2RV>ca~Y4w6f;V-vvXfsCoy&=J!81HO3k$$lTbPyTuXA(NdlJ{f3QhGyT0_ zVLYeP+pGYZ(*UVmPWWFdr25rkdEYtgr(cH035qKHlUaU7^)UC#d_IEmCxWo0ofiNE z0(H}Lz21NDgV+Ru%c;uiZRfp8*#bPfeI17S6*Gu3zE&@sX120TWjCiyh8ok<*|qzU zlh!%?X&3{^tHdV%y~Us)5><}e-h@ujE?Z8^AxS=f!ZHf#C(0cSqy+7+lg!G3Fw@LA zl%KQn@&`MR#yQasV$JFCa4^ZtV;9%1kpd-2l?RR%-8W*(3~>IqYrwg;;@{Z}O2H*9 zINWQy{}_^e$?8G6?lMb;1jL~yhoX2$GpNLpVZ@luXrQVAla()Xn3F#=!vxN6d`DE8 zmGC(|H3Uj$%ik_!DN}`rvP;Q|=gBs%`Dl!F>}MueLFF41#)E;rW|!Q&0~@Cg^UemK z$9(DcY{ev->wTV~Fsj9!=GlDRtK0boXe_l-7P~IKH*y?zjT*(S^Lz7}_xxBWKXWVs z_s807Azcwf!olulO3Tp}imnB?j-V5?)p%jPEKF{<%(BIQFR10XF}q&dA*Spu!gfB{ z0NfC`IGiz}M7WPY*e`#ThHU!^BHvE8T8tQ)F6}*d@#~A?Fx+TR*VNEhB!YE+lw%PXSd-jD^}2ys7Mcqm_Dhs1h*28|{(GMgaEEy8vr9{*11UOm@*Ug6SH-gH=7PloQIae;VIoJqqI4)lI|We9gTVR zM5kZc#BBga>s>JBn&w5zd%vr~|Aj0Xl^`-|z#?!Xi?~m0{_am6vTQy)6e^HmU!|4b z#gB*Q94+Tq9CgYc2LAXu$yME9bRD}fx|&*t{$K*%TwMj-K~7Y8^mLDAJ(4@J+RA-& zqac>FB=D7w#@%OT7)A7bzBH8#V&r7abaRCg`xXT6U_^a)#wkPLHTw0J8C_IC@FA&5 zqm&oCi{s@D4+!#}sAB%rCFqqMN%1RW^gM^gAfH41O>FLFqxcq%vq3kl)uG?v_HCD5 zllSbX@)80iX2i5%^a^F9_Q-XjG`PFAq?A8k~~& zOq1DBb@t2c2NTj~xw<#vcNP}l^uE6NxP)wh`y?rrm~JP<4-IJ?$uV@bY`gC1|ER^s zi*c(6-R$Q;I^LL-_upb3NUqkAJJ_=qvOMZ6l#azDgy438 zCMoSZc@o-aq`6REKWRnQ6E|qcXMUQ`yd}um`aKTF1zwF?IlS5#S`@6vQlH!O(dNg@ zmucn+^As?N&9i#$t*1R?&8<1W+9urjXDAc)N=HcM4vjP4P%N!N%HsB>iW0u}>b)3CgZioEP{)p)V?pXGr9FXzJCl23-CL%Cn=x5-#q~`hl~Y zTeh=E;O|W;d+-cnD9%!b7Ld!o7XXaS-$h_xKPSJo+T0J}^QL*)Ae~&X8IF{OGjI zU2>di(K+4)@N>Ks6aE@GKo4ktN1Ddsm5u=WjyO>#d7i(d%lKWR&>cgp}yGGcKQhf8v_4LZgaK1m5Of06xDZF}df@SoaTxwq@J(eI@=lecjQH11tRSaM_}lQ)`RwA`;~~p#}oO@eF#^ z?$aHw*ZNDZKDQ-(n>$h`D?Q-x+`hTD7AR_GNS1aInS8E^oILmu-^-~IglTuEskuT< z8rWD5|D%(3?Xg#-bb`E;$^cXh00+KT9Dk3Bju$gv?Z`jkSDFgExQLQfHpyD)+_Y;z zzh&d;H166JjC>Az-%__@D_y$SOi_Kp2|u*%Ee{4A9?p{FWZgOvn{US+`ps|ww&+Vx zmfSRrqx@b#;-=Aw#mXW!AC~DH)vfMM&Wi%vah`4G)R=D{#hy)yMIex4Hb$CjU}dGt zRqo|;Yfo^@*15rzrj8?#$BL$3j;d@_ZU@wAjUzXxd#ad;Qm{oU)YL=#nJbPLY~0<* z1=(TNplp18d9Jh1`+lcilg*Ee6Mxd!2=CO;IIG`ylLAvnZ%s9j{_(M^Ix2cD%ENCF zf5H>ja@IbE7D@yC$N%j9qT@bWt2`x56x8#&N=7*^hZ%ilp{qBDCVl%Z zy?F<#aQ%;uGxsT3{%~d}C5N(9McaH7&i8-RasJUvuW=lA(>?tlkzcn%No>Q{R%YGu zW4QBsDs5z1v<^pF%4%fSZ>OTBP-0OcKRZ}h^CS5&w@g1Y6X783HjQ<6k=SCx?swc% zfA#P4Jm-0y^L#$fbKbA#d_Et(a$#vQS>E5xSFZ4r`o)RsISyrX6T*AN{B1rd>1&(d zQGsNGqg9i?_e|Yn;|_ZV8&(@73|G97AeCNz$PYG=R0G|S4vy3*|9E=zi_*5Kj@efa zOnK7$`sb3CGJci*Mf)Dd1C8wi!3&I1GhcbBOYrD)b4<JN?rEuJNS;i^PDq5B~J1hR4r4Z4A6L1akmLAeMB3s1a#RMMX~!#Dvdx zsS7R}M@3w1yx&Z_@UJYD)dI`f@eh;Q@Z<}I7;{EyH)u$@((= zfOkwPv*zWy^z;9(hU=MLq()X$#NW z)l&a77xQe3_qvT@MHs%+z^`U&Lfyj#iLC8T(CliMfMJz?D4 z>_885)DL=@^XR2yrrv|Ey)V{VUc-+P<2(uC?+`J(n(pco-?nQe!|D$8a1>D1DbG~EQ7b3pOCPtPe4ovA((Jf(M##d1L{V>E4$s*`!Nf&q^ zKMIw?28)km1;|z2L<8NT`v9+u`({Jc4>q>W@_~# z>h!kjg`psc5VJXHkO-sdNm(?-9P1akL z4%saS3UkA In3I?O1G`CbZU6uP literal 0 HcmV?d00001 diff --git a/src/api/v1/menu.ts b/src/api/v1/menu.ts index d856fda..fd5a4f8 100644 --- a/src/api/v1/menu.ts +++ b/src/api/v1/menu.ts @@ -6,29 +6,34 @@ export const fetchGetMenusList = (data?: any) => { return http.request>('get', `router/getMenusList`, { params: data }); }; +/** + * 根据路由id获取所有角色 + */ +export const fetchGetRoleListByRouterId = data => { + return http.request>('get', `routerRole/getRoleListByRouterId`, { params: data }); +}; + /** 菜单管理-添加菜单 */ export const fetchAddMenu = (data?: any) => { return http.request>('post', `router/addMenu`, { data }); }; -/** 菜单管理-更新菜单 */ -export const fetchUpdateMenu = (data?: any) => { - return http.request>('put', `router/updateMenu`, { data }); -}; - -/** 菜单管理-删除菜单 */ -export const fetchDeletedMenuByIds = (data?: any) => { - return http.request>('delete', `router/deletedMenuByIds`, { data }); -}; - /** 菜单管理-为菜单分配角色 */ export const fetchAssignRolesToRouter = (data: any) => { return http.request>('post', `routerRole/assignRolesToRouter`, { data }); }; -/** - * 根据路由id获取所有角色 - */ -export const fetchGetRoleListByRouterId = data => { - return http.request>('get', `routerRole/getRoleListByRouterId`, { params: data }); +/** 菜单管理-更新菜单 */ +export const fetchUpdateMenu = (data?: any) => { + return http.request>('put', `router/updateMenu`, { data }); +}; + +/** 菜单管理-快速更新菜单排序 */ +export const fetchUpdateMenuByIdWithRank = (data?: any) => { + return http.request>('put', `router/updateMenuByIdWithRank`, { data }); +}; + +/** 菜单管理-删除菜单 */ +export const fetchDeletedMenuByIds = (data?: any) => { + return http.request>('delete', `router/deletedMenuByIds`, { data }); }; diff --git a/src/api/v1/quartzExecuteLog.ts b/src/api/v1/quartzExecuteLog.ts new file mode 100644 index 0000000..f527753 --- /dev/null +++ b/src/api/v1/quartzExecuteLog.ts @@ -0,0 +1,22 @@ +import { http } from '@/api/service/request'; +import type { BaseResult, ResultTable } from '@/api/service/types'; + +/** 调度任务执行日志---获取调度任务执行日志列表 */ +export const fetchGetQuartzExecuteLogList = (data: any) => { + return http.request>('get', `quartzExecuteLog/getQuartzExecuteLogList/${data.currentPage}/${data.pageSize}`, { params: data }); +}; + +/** 调度任务执行日志---添加调度任务执行日志 */ +export const fetchAddQuartzExecuteLog = (data: any) => { + return http.request>('post', 'quartzExecuteLog/addQuartzExecuteLog', { data }); +}; + +/** 调度任务执行日志---更新调度任务执行日志 */ +export const fetchUpdateQuartzExecuteLog = (data: any) => { + return http.request>('put', 'quartzExecuteLog/updateQuartzExecuteLog', { data }); +}; + +/** 调度任务执行日志---删除调度任务执行日志 */ +export const fetchDeleteQuartzExecuteLog = (data: any) => { + return http.request>('delete', 'quartzExecuteLog/deleteQuartzExecuteLog', { data }); +}; diff --git a/src/store/scheduler/quartzExecuteLog.ts b/src/store/scheduler/quartzExecuteLog.ts new file mode 100644 index 0000000..1ac8f26 --- /dev/null +++ b/src/store/scheduler/quartzExecuteLog.ts @@ -0,0 +1,77 @@ +import { defineStore } from 'pinia'; +import { fetchAddQuartzExecuteLog, fetchDeleteQuartzExecuteLog, fetchGetQuartzExecuteLogList, fetchUpdateQuartzExecuteLog } from '@/api/v1/quartzExecuteLog'; +import { pageSizes } from '@/enums/baseConstant'; +import { storeMessage } from '@/utils/message'; +import { storePagination } from '@/store/useStorePagination'; + +/** + * 调度任务执行日志 Store + */ +export const useQuartzExecuteLogStore = defineStore('quartzExecuteLogStore', { + state() { + return { + // 调度任务执行日志列表 + datalist: [], + // 查询表单 + form: { + // 任务名称 + jobName: undefined, + // 任务分组 + jobGroup: undefined, + // 执行任务类名 + jobClassName: undefined, + // 执行任务core表达式 + cronExpression: undefined, + // 触发器名称 + triggerName: undefined, + // 结束时间 + endTime: undefined, + }, + // 分页查询结果 + pagination: { + currentPage: 1, + pageSize: 150, + total: 100, + pageSizes, + }, + // 加载 + loading: false, + }; + }, + getters: {}, + actions: { + /** 获取调度任务执行日志 */ + async getQuartzExecuteLogList() { + // 整理请求参数 + const data = { ...this.pagination, ...this.form }; + delete data.pageSizes; + delete data.total; + delete data.background; + + // 获取调度任务执行日志列表 + const result = await fetchGetQuartzExecuteLogList(data); + + // 公共页面函数hook + const pagination = storePagination.bind(this); + return pagination(result); + }, + + /** 添加调度任务执行日志 */ + async addQuartzExecuteLog(data: any) { + const result = await fetchAddQuartzExecuteLog(data); + return storeMessage(result); + }, + + /** 修改调度任务执行日志 */ + async updateQuartzExecuteLog(data: any) { + const result = await fetchUpdateQuartzExecuteLog(data); + return storeMessage(result); + }, + + /** 删除调度任务执行日志 */ + async deleteQuartzExecuteLog(data: any) { + const result = await fetchDeleteQuartzExecuteLog(data); + return storeMessage(result); + }, + }, +}); diff --git a/src/store/monitor/schedulers.ts b/src/store/scheduler/schedulers.ts similarity index 100% rename from src/store/monitor/schedulers.ts rename to src/store/scheduler/schedulers.ts diff --git a/src/store/monitor/schedulersGroup.ts b/src/store/scheduler/schedulersGroup.ts similarity index 100% rename from src/store/monitor/schedulersGroup.ts rename to src/store/scheduler/schedulersGroup.ts diff --git a/src/store/system/menu.ts b/src/store/system/menu.ts index 84c208f..f9d6045 100644 --- a/src/store/system/menu.ts +++ b/src/store/system/menu.ts @@ -1,7 +1,7 @@ import { defineStore } from 'pinia'; import { storeMessage } from '@/utils/message'; import { handleTree } from '@/utils/tree'; -import { fetchAddMenu, fetchAssignRolesToRouter, fetchDeletedMenuByIds, fetchGetMenusList, fetchGetRoleListByRouterId, fetchUpdateMenu } from '@/api/v1/menu'; +import { fetchAddMenu, fetchAssignRolesToRouter, fetchDeletedMenuByIds, fetchGetMenusList, fetchGetRoleListByRouterId, fetchUpdateMenu, fetchUpdateMenuByIdWithRank } from '@/api/v1/menu'; import { isAllEmpty } from '@pureadmin/utils'; import { $t } from '@/plugins/i18n'; @@ -42,6 +42,12 @@ export const userMenuStore = defineStore('menuStore', { return storeMessage(result); }, + /** 快速更新菜单排序 */ + async updateMenuByIdWithRank(data: object) { + const result = await fetchUpdateMenuByIdWithRank(data); + return storeMessage(result); + }, + /** 删除菜单 */ async deletedMenuByIds(data: object) { const result = await fetchDeletedMenuByIds(data); diff --git a/src/views/scheduler/quartzExecuteLog/index.vue b/src/views/scheduler/quartzExecuteLog/index.vue new file mode 100644 index 0000000..6439f9a --- /dev/null +++ b/src/views/scheduler/quartzExecuteLog/index.vue @@ -0,0 +1,138 @@ + + + diff --git a/src/views/scheduler/quartzExecuteLog/quartz-execute-log-dialog.vue b/src/views/scheduler/quartzExecuteLog/quartz-execute-log-dialog.vue new file mode 100644 index 0000000..7e8196a --- /dev/null +++ b/src/views/scheduler/quartzExecuteLog/quartz-execute-log-dialog.vue @@ -0,0 +1,77 @@ + + + diff --git a/src/views/scheduler/quartzExecuteLog/utils/columns.ts b/src/views/scheduler/quartzExecuteLog/utils/columns.ts new file mode 100644 index 0000000..db1208f --- /dev/null +++ b/src/views/scheduler/quartzExecuteLog/utils/columns.ts @@ -0,0 +1,61 @@ +import { reactive } from 'vue'; +import { $t } from '@/plugins/i18n'; + +// 表格列 +export const columns: TableColumnList = [ + { type: 'selection', align: 'left' }, + { type: 'index', index: (index: number) => index + 1, label: '序号', width: 60 }, + // 任务名称 + { label: $t('quartzExecuteLog_jobName'), prop: 'jobName' }, + // 任务分组 + { label: $t('quartzExecuteLog_jobGroup'), prop: 'jobGroup' }, + // 执行任务类名 + { label: $t('quartzExecuteLog_jobClassName'), prop: 'jobClassName' }, + // 执行任务core表达式 + { label: $t('quartzExecuteLog_cronExpression'), prop: 'cronExpression' }, + // 触发器名称 + { label: $t('quartzExecuteLog_triggerName'), prop: 'triggerName' }, + // 执行结果 + { label: $t('quartzExecuteLog_executeResult'), prop: 'executeResult', width: 210 }, + // 执行时间 + { label: $t('quartzExecuteLog_duration'), prop: 'duration' }, + // 结束时间 + { label: $t('quartzExecuteLog_endTime'), prop: 'endTime' }, + { label: $t('table.updateTime'), prop: 'updateTime', sortable: true, width: 160 }, + { label: $t('table.createTime'), prop: 'createTime', sortable: true, width: 160 }, + { label: $t('table.createUser'), prop: 'createUser', slot: 'createUser', width: 90 }, + { label: $t('table.updateUser'), prop: 'updateUser', slot: 'updateUser', width: 90 }, + { label: $t('table.operation'), fixed: 'right', width: 210, slot: 'operation' }, +]; + +// 添加规则 +export const rules = reactive({ + // 任务名称 + jobName: [{ required: true, message: `${$t('input')}${$t('quartzExecuteLog_jobName')}`, trigger: 'blur' }], + // 任务分组 + jobGroup: [{ required: true, message: `${$t('input')}${$t('quartzExecuteLog_jobGroup')}`, trigger: 'blur' }], + // 执行任务类名 + jobClassName: [{ required: true, message: `${$t('input')}${$t('quartzExecuteLog_jobClassName')}`, trigger: 'blur' }], + // 执行任务core表达式 + cronExpression: [ + { + required: true, + message: `${$t('input')}${$t('quartzExecuteLog_cronExpression')}`, + trigger: 'blur', + }, + ], + // 触发器名称 + triggerName: [{ required: true, message: `${$t('input')}${$t('quartzExecuteLog_triggerName')}`, trigger: 'blur' }], + // 执行结果 + executeResult: [ + { + required: true, + message: `${$t('input')}${$t('quartzExecuteLog_executeResult')}`, + trigger: 'blur', + }, + ], + // 执行时间 + duration: [{ required: true, message: `${$t('input')}${$t('quartzExecuteLog_duration')}`, trigger: 'blur' }], + // 结束时间 + endTime: [{ required: true, message: `${$t('input')}${$t('quartzExecuteLog_endTime')}`, trigger: 'blur' }], +}); diff --git a/src/views/scheduler/quartzExecuteLog/utils/hooks.ts b/src/views/scheduler/quartzExecuteLog/utils/hooks.ts new file mode 100644 index 0000000..956ad0b --- /dev/null +++ b/src/views/scheduler/quartzExecuteLog/utils/hooks.ts @@ -0,0 +1,99 @@ +import { addDialog } from '@/components/BaseDialog/index'; +import QuartzExecuteLogDialog from '@/views/scheduler/quartzExecuteLog/quartz-execute-log-dialog.vue'; +import { useQuartzExecuteLogStore } from '@/store/scheduler/quartzExecuteLog'; +import { h, ref } from 'vue'; +import { messageBox } from '@/utils/message'; +import type { FormItemProps } from '@/views/scheduler/quartzExecuteLog/utils/types'; +import { $t } from '@/plugins/i18n'; + +export const formRef = ref(); +// 删除ids +export const deleteIds = ref([]); +const quartzExecuteLogStore = useQuartzExecuteLogStore(); + +/** + * * 搜索初始化调度任务执行日志 + */ +export async function onSearch() { + quartzExecuteLogStore.loading = true; + await quartzExecuteLogStore.getQuartzExecuteLogList(); + quartzExecuteLogStore.loading = false; +} + +/** + * * 更新调度任务执行日志 + * @param row + */ +export function onUpdate(row: any) { + addDialog({ + title: `${$t('modify')}${$t('quartzExecuteLog')}`, + width: '30%', + props: { + formInline: { + jobName: row.jobName, + jobGroup: row.jobGroup, + jobClassName: row.jobClassName, + cronExpression: row.cronExpression, + triggerName: row.triggerName, + executeResult: row.executeResult, + duration: row.duration, + endTime: row.endTime, + }, + }, + draggable: true, + fullscreenIcon: true, + closeOnClickModal: false, + contentRenderer: () => h(QuartzExecuteLogDialog, { ref: formRef }), + beforeSure: (done, { options }) => { + const form = options.props.formInline as FormItemProps; + formRef.value.formRef.validate(async (valid: any) => { + if (!valid) return; + + const result = await quartzExecuteLogStore.updateQuartzExecuteLog({ ...form, id: row.id }); + if (!result) return; + done(); + await onSearch(); + }); + }, + }); +} + +/** + * * 删除调度任务执行日志 + */ +export const onDelete = async (row: any) => { + const id = row.id; + + // 是否确认删除 + const result = await messageBox({ + title: $t('confirm_delete'), + showMessage: false, + confirmMessage: undefined, + cancelMessage: $t('cancel_delete'), + }); + if (!result) return; + + // 删除数据 + await quartzExecuteLogStore.deleteQuartzExecuteLog([id]); + await onSearch(); +}; + +/** + * 批量删除 + */ +export const onDeleteBatch = async () => { + const ids = deleteIds.value; + + // 是否确认删除 + const result = await messageBox({ + title: $t('confirm_delete'), + showMessage: false, + confirmMessage: undefined, + cancelMessage: $t('cancel_delete'), + }); + if (!result) return; + + // 删除数据 + await quartzExecuteLogStore.deleteQuartzExecuteLog(ids); + await onSearch(); +}; diff --git a/src/views/scheduler/quartzExecuteLog/utils/types.ts b/src/views/scheduler/quartzExecuteLog/utils/types.ts new file mode 100644 index 0000000..826375a --- /dev/null +++ b/src/views/scheduler/quartzExecuteLog/utils/types.ts @@ -0,0 +1,24 @@ +// 添加或者修改表单元素 +export interface FormItemProps { + // 任务名称 + jobName: string; + // 任务分组 + jobGroup: string; + // 执行任务类名 + jobClassName: string; + // 执行任务core表达式 + cronExpression: string; + // 触发器名称 + triggerName: string; + // 执行结果 + executeResult: any; + // 执行时间 + duration: number; + // 结束时间 + endTime: any; +} + +// 添加或修改表单Props +export interface FormProps { + formInline: FormItemProps; +} diff --git a/src/views/scheduler/schedulers/index.vue b/src/views/scheduler/schedulers/index.vue index dc52eb5..7f7d86e 100644 --- a/src/views/scheduler/schedulers/index.vue +++ b/src/views/scheduler/schedulers/index.vue @@ -10,7 +10,7 @@ import EditPen from '@iconify-icons/ep/edit-pen'; import Refresh from '@iconify-icons/ep/refresh'; import { selectUserinfo } from '@/components/Table/Userinfo/columns'; import { $t } from '@/plugins/i18n'; -import { useSchedulersStore } from '@/store/monitor/schedulers'; +import { useSchedulersStore } from '@/store/scheduler/schedulers'; import { useRenderIcon } from '@/components/CommonIcon/src/hooks'; import { FormInstance } from 'element-plus'; diff --git a/src/views/scheduler/schedulers/schedulers-dialog.vue b/src/views/scheduler/schedulers/schedulers-dialog.vue index 56a1710..2bd795e 100644 --- a/src/views/scheduler/schedulers/schedulers-dialog.vue +++ b/src/views/scheduler/schedulers/schedulers-dialog.vue @@ -4,8 +4,8 @@ import { FormInstance } from 'element-plus'; import { rules } from '@/views/scheduler/schedulers/utils/columns'; import { FormProps } from '@/views/scheduler/schedulers/utils/types'; import { $t } from '@/plugins/i18n'; -import { useSchedulersGroupStore } from '@/store/monitor/schedulersGroup'; -import { useSchedulersStore } from '@/store/monitor/schedulers'; +import { useSchedulersGroupStore } from '@/store/scheduler/schedulersGroup'; +import { useSchedulersStore } from '@/store/scheduler/schedulers'; const props = withDefaults(defineProps(), { formInline: () => ({ diff --git a/src/views/scheduler/schedulers/utils/hooks.ts b/src/views/scheduler/schedulers/utils/hooks.ts index dd0dad8..49b9dd8 100644 --- a/src/views/scheduler/schedulers/utils/hooks.ts +++ b/src/views/scheduler/schedulers/utils/hooks.ts @@ -1,6 +1,6 @@ import { addDialog } from '@/components/BaseDialog/index'; import SchedulersDialog from '@/views/scheduler/schedulers/schedulers-dialog.vue'; -import { useSchedulersStore } from '@/store/monitor/schedulers'; +import { useSchedulersStore } from '@/store/scheduler/schedulers'; import { h, ref } from 'vue'; import { messageBox } from '@/utils/message'; import type { FormItemProps } from '@/views/scheduler/schedulers/utils/types'; diff --git a/src/views/scheduler/schedulersGroup/index.vue b/src/views/scheduler/schedulersGroup/index.vue index c07575b..9796e85 100644 --- a/src/views/scheduler/schedulersGroup/index.vue +++ b/src/views/scheduler/schedulersGroup/index.vue @@ -10,7 +10,7 @@ import EditPen from '@iconify-icons/ep/edit-pen'; import Refresh from '@iconify-icons/ep/refresh'; import { selectUserinfo } from '@/components/Table/Userinfo/columns'; import { $t } from '@/plugins/i18n'; -import { useSchedulersGroupStore } from '@/store/monitor/schedulersGroup'; +import { useSchedulersGroupStore } from '@/store/scheduler/schedulersGroup'; import { useRenderIcon } from '@/components/CommonIcon/src/hooks'; import { FormInstance } from 'element-plus'; diff --git a/src/views/scheduler/schedulersGroup/utils/hooks.ts b/src/views/scheduler/schedulersGroup/utils/hooks.ts index a3643e4..b1a317f 100644 --- a/src/views/scheduler/schedulersGroup/utils/hooks.ts +++ b/src/views/scheduler/schedulersGroup/utils/hooks.ts @@ -1,6 +1,6 @@ import { addDialog } from '@/components/BaseDialog/index'; import SchedulersGroupDialog from '@/views/scheduler/schedulersGroup/schedulers-group-dialog.vue'; -import { useSchedulersGroupStore } from '@/store/monitor/schedulersGroup'; +import { useSchedulersGroupStore } from '@/store/scheduler/schedulersGroup'; import { h, ref } from 'vue'; import { messageBox } from '@/utils/message'; import type { FormItemProps } from '@/views/scheduler/schedulersGroup/utils/types'; diff --git a/src/views/system/menu/index.vue b/src/views/system/menu/index.vue index bab4f62..4ddc80a 100644 --- a/src/views/system/menu/index.vue +++ b/src/views/system/menu/index.vue @@ -6,7 +6,7 @@ import Delete from '@iconify-icons/ep/delete'; import EditPen from '@iconify-icons/ep/edit-pen'; import Refresh from '@iconify-icons/ep/refresh'; import AddFill from '@iconify-icons/ri/add-circle-line'; -import { assignRolesToRouter, handleDelete, onAdd, onchangeVisible, onSearch, onUpdate, switchLoadMap } from '@/views/system/menu/utils/hooks'; +import { assignRolesToRouter, handleDelete, onAdd, onChangeMenuRank, onchangeVisible, onSearch, onUpdate, switchLoadMap } from '@/views/system/menu/utils/hooks'; import PureTable from '@pureadmin/table'; import { columns } from '@/views/system/menu/utils/columns'; import { userMenuStore } from '@/store/system/menu'; @@ -85,6 +85,10 @@ onMounted(() => { /> + + diff --git a/src/views/system/menu/utils/columns.tsx b/src/views/system/menu/utils/columns.tsx index 8dd521c..fea83b5 100644 --- a/src/views/system/menu/utils/columns.tsx +++ b/src/views/system/menu/utils/columns.tsx @@ -1,5 +1,6 @@ import { h, reactive } from 'vue'; import type { FormRules } from 'element-plus'; +import { ElTag } from 'element-plus'; import { $t } from '@/plugins/i18n'; import { isAllEmpty } from '@pureadmin/utils'; import { getMenuType } from '@/views/system/menu/utils/hooks'; @@ -26,9 +27,9 @@ export const columns: TableColumnList = [ prop: 'menuType', width: 100, cellRenderer: ({ row, props }) => ( - + {getMenuType(row.menuType, true)} - + ), }, { label: '路由路径', prop: 'path' }, @@ -37,13 +38,13 @@ export const columns: TableColumnList = [ prop: 'component', formatter: ({ path, component }) => (isAllEmpty(component) ? path : component), }, - { label: '排序', prop: 'rank', width: 100 }, + { label: '排序', prop: 'rank', width: 80, slot: 'rank' }, { label: '隐藏', prop: 'visible', slot: 'visible', width: 100 }, { label: $t('table.updateTime'), prop: 'updateTime', sortable: true }, { label: $t('table.createTime'), prop: 'createTime', sortable: true }, { label: $t('table.createUser'), prop: 'createUser', slot: 'createUser', width: 90 }, { label: $t('table.updateUser'), prop: 'updateUser', slot: 'updateUser', width: 90 }, - { label: $t('table.operation'), fixed: 'right', width: 210, slot: 'operation' }, + { label: $t('table.operation'), fixed: 'right', width: 230, slot: 'operation' }, ]; /** 自定义表单规则校验 */ diff --git a/src/views/system/menu/utils/hooks.tsx b/src/views/system/menu/utils/hooks.tsx index b5f1897..8878d1a 100644 --- a/src/views/system/menu/utils/hooks.tsx +++ b/src/views/system/menu/utils/hooks.tsx @@ -20,7 +20,7 @@ const formRef = ref(); * @param type * @param text */ -export const getMenuType = (type, text = false) => { +export const getMenuType = (type: number, text: boolean = false): any => { switch (type) { case 0: return text ? '菜单' : 'primary'; @@ -199,6 +199,27 @@ export const onchangeVisible = async (row: any, index: number) => { }); }; +/** + * * 更新菜单排序 + * @param row + */ +export const onChangeMenuRank = async (row: any) => { + const data = { id: row.id, rank: row.rank }; + + // 是否确认修改显示状态 + const confirm = await messageBox({ + title: $t('confirm_update_sort'), + showMessage: false, + confirmMessage: undefined, + cancelMessage: $t('cancel'), + }); + + // 取消修改 + if (!confirm) return; + + await routerStore.updateMenuByIdWithRank(data); +}; + /** * 为路由分配角色 * @param row