From 29f9f3de317c7d21f3c8820696f61d61319d7793 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=B2=E5=A8=9C=E8=B4=9Der?= <15891557205@163.com> Date: Mon, 20 Jan 2025 03:43:19 +0000 Subject: [PATCH] =?UTF-8?q?!11=20follow=E5=90=8E=E7=AB=AF=E5=8F=91?= =?UTF-8?q?=E5=B8=83=20*=20docs:=20readme=20*=20fix:=20missing=20formPath?= =?UTF-8?q?=20*=20chore:=20=E5=8E=BB=E9=99=A4=E9=94=81=E5=AE=9A=E7=9A=84es?= =?UTF-8?q?build=E7=89=88=E6=9C=AC=20*=20perf:=20=E5=8E=BB=E9=99=A4debug?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=20*=20perf:=20=E5=8F=82=E6=95=B0=E9=94=AE?= =?UTF-8?q?=E5=80=BC=20=E8=87=AA=E5=8A=A8=E9=AB=98=E5=BA=A6=20*=20refactor?= =?UTF-8?q?:=20=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E9=87=8D=E6=9E=84=20=E5=8E=BB=E9=99=A4?= =?UTF-8?q?=E6=AD=A5=E9=AA=A4=E6=9D=A1=20*=20perf:=20=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E6=96=87=E4=BB=B6=20*=20docs:=20=E6=96=87=E4=BB=B6=E5=A4=B9?= =?UTF-8?q?=E8=AF=B4=E6=98=8E=20*=20chore:=20=E7=A7=BB=E9=99=A4=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E9=85=8D=E7=BD=AE=E9=A1=B9=20*=20chore:=20=E6=B3=A8?= =?UTF-8?q?=E9=87=8A=E4=BC=98=E5=8C=96=20*=20refactor:=20=E7=A7=BB?= =?UTF-8?q?=E9=99=A4ele=E5=92=8Cnaive=E7=9B=AE=E5=BD=95=20*=20Merge=20bran?= =?UTF-8?q?ch=20'main'=20of=20https://github.com/vbenjs/vue-vben-admin=20i?= =?UTF-8?q?nto=20dev=20*=20perf:=20request=20support=20to=20set=20how=20to?= =?UTF-8?q?=20return=20response=20(#5436)=20*=20Merge=20branch=20'main'=20?= =?UTF-8?q?of=20https://github.com/vbenjs/vue-vben-admin=20into=20dev=20*?= =?UTF-8?q?=20refactor:=20=E7=99=BB=E5=BD=95=E8=B6=85=E6=97=B6=E7=9A=84i18?= =?UTF-8?q?n=20*=20fix:=20requestClient=E7=BC=BA=E5=A4=B1i18n=E5=86=85?= =?UTF-8?q?=E5=AE=B9=20*=20refactor:=20=E4=BC=98=E5=8C=96oss=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E8=BF=9B=E5=BA=A6=E6=8F=90=E7=A4=BA=20*=20feat:=20?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E8=BF=9B=E5=BA=A6loading=20*=20fix:=20antd?= =?UTF-8?q?=20button=20icon=20style=20(#5421)=20*=20feat:=20oss=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E8=BF=9B=E5=BA=A6(=E5=B7=B2=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E7=9A=84KB=20=E6=97=A0=E6=B3=95=E4=BD=9C=E4=B8=BA=E8=BF=9B?= =?UTF-8?q?=E5=BA=A6=E6=98=BE=E7=A4=BA=20total=E8=BF=94=E5=9B=9E=E4=B8=BAn?= =?UTF-8?q?ull)=20*=20fix:=20=E4=B8=8B=E8=BD=BD=E6=96=87=E4=BB=B6=E6=97=B6?= =?UTF-8?q?(responseType=20=3D=3D=3D=20'blob')=E9=9C=80=E8=A6=81=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E4=B8=8B=E8=BD=BD=E5=A4=B1=E8=B4=A5(=E8=BF=94?= =?UTF-8?q?=E5=9B=9Ejson=E8=80=8C=E9=9D=9E=E4=BA=8C=E8=BF=9B=E5=88=B6)?= =?UTF-8?q?=E7=9A=84=E6=83=85=E5=86=B5=20*=20Merge=20branch=20'main'=20of?= =?UTF-8?q?=20https://github.com/vbenjs/vue-vben-admin=20into=20dev=20*=20?= =?UTF-8?q?refactor:=20=E6=96=B0=E5=A2=9E=E5=90=8E=E8=B7=B3=E8=BD=AC?= =?UTF-8?q?=E5=88=B0=E6=9C=AA=E5=8F=91=E5=B8=83=E6=B5=81=E7=A8=8B=20*=20fi?= =?UTF-8?q?x:=20same=20name=20route=20*=20chore:=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E4=B8=BA=E9=83=A8=E7=BD=B2json=E7=B1=BB=E5=9E=8B=20*=20fix:=20?= =?UTF-8?q?mouse=20events=20ignored=20on=20modal=20loading=20(#5409)=20*?= =?UTF-8?q?=20docs:=20update=20docs=20(#5408)=20*=20refactor:=20=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E5=B7=B2=E7=BB=8F=E5=BC=83=E7=94=A8=E7=9A=84=E6=96=B9?= =?UTF-8?q?=E6=B3=95=20*=20refactor:=20follow=E5=AE=98=E6=96=B9handleRange?= =?UTF-8?q?TimeValue=E6=9B=B4=E6=96=B0=20*=20chore:=20=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=A4=B9(=E5=89=8D=E7=AB=AF=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E9=9C=80=E8=A6=81=E7=9A=84)=20*=20chore:=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=9C=AC=E5=9C=B0=E8=B7=AF=E7=94=B1=E5=86=99=E6=B3=95?= =?UTF-8?q?(=E6=96=B0=E7=89=88)/=E6=96=B0=E5=A2=9E=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E5=9B=BE=E6=A0=87=20*=20fix:=20form=20update?= =?UTF-8?q?=20state=20error=20before=20form=20mounted=20(#5406)=20*=20fix:?= =?UTF-8?q?=20demos=20route=20fixed=20(#5405)=20*=20chore:=20=E4=B8=8D?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=9F=BA=E7=A1=80=E5=B8=83=E5=B1=80=EF=BC=88?= =?UTF-8?q?=E4=BB=85=E5=9C=A8=E9=A1=B6=E7=BA=A7=E7=94=9F=E6=95=88=EF=BC=89?= =?UTF-8?q?=20*=20feat:=20modal=20state=20locked=20on=20submitting=20(#540?= =?UTF-8?q?1)=20*=20chore:=20=E4=BF=AE=E6=94=B9zIndex=20*=20Merge=20branch?= =?UTF-8?q?=20'main'=20of=20https://github.com/vbenjs/vue-vben-admin=20int?= =?UTF-8?q?o=20dev=20*=20refactor:=20fix=20popup=20component=20zIndex=20(#?= =?UTF-8?q?5397)=20*=20style:=20element=20plus=20loading=20style=20fixed?= =?UTF-8?q?=20(#5393)=20*=20perf:=20improve=20fieldMappingTime=20to=20supp?= =?UTF-8?q?ort=20format=20function=20(#5392)=20*=20fix:=20hide=20root=20ro?= =?UTF-8?q?ute=20in=20breadcrumb=20*=20feat:=20support=20set=20default=20p?= =?UTF-8?q?rops=20for=20drawer=20and=20modal=20(#5390)=20*=20fix:=20root?= =?UTF-8?q?=20router=20config=20fixed=20(#5389)=20*=20fix:=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9Vxe=E9=BB=98=E8=AE=A4zIndex=E4=B8=BA995=20=E8=A7=A3?= =?UTF-8?q?=E5=86=B3=E5=8F=B3=E4=B8=8A=E8=A7=92=E5=85=A8=E5=B1=8F=E5=90=8E?= =?UTF-8?q?modal/drawer(zIndex:=201000)=E8=A2=AB=E9=81=AE=E6=8C=A1=20*=20f?= =?UTF-8?q?eat:=20add=20`noBasicLayout`=20in=20route=20meta=20(#5386)=20*?= =?UTF-8?q?=20chore:=20wechat=20image=20*=20Merge=20branch=20'main'=20of?= =?UTF-8?q?=20https://github.com/vbenjs/vue-vben-admin=20into=20dev=20*=20?= =?UTF-8?q?chore:=20=E6=94=B9=E4=B8=BA=E5=85=A8=E5=B1=80=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=20=E5=8E=BB=E9=99=A4=E5=B1=80=E9=83=A8?= =?UTF-8?q?=E5=8F=82=E6=95=B0=20*=20fix:=20spinner=20may=20stop=20playing?= =?UTF-8?q?=20animation=20after=20dismiss=20(#5365)=20*=20style:=20popover?= =?UTF-8?q?=20bgColor=20is=20too=20close=20to=20common=20(#5364)=20*=20doc?= =?UTF-8?q?s:=20version=20update=20*=20docs:=20changelog=20*=20chore:=20?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=8A=E4=BC=A0=20=E6=8F=8F=E8=BF=B0=20*?= =?UTF-8?q?=20ci:=20retry=20deploy=20while=20faild=20*=20feat:=20=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E4=B8=8A=E4=BC=A0=20=E8=BF=9B=E5=BA=A6=E6=9D=A1+?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E6=96=87=E5=AD=97=20*=20feat:=20=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E4=B8=8A=E4=BC=A0=20=E8=BF=9B=E5=BA=A6=E6=9D=A1=20*?= =?UTF-8?q?=20feat:=20=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E8=AF=B4=E6=98=8E=20*=20Merge=20branch=20'main'=20of?= =?UTF-8?q?=20https://github.com/vbenjs/vue-vben-admin=20into=20warmflow?= =?UTF-8?q?=20*=20fix:=20useEcharts=20return=20invalid=20instance=20(#5360?= =?UTF-8?q?)=20*=20feat:=20popup=20component=20support=20overlay=20blur=20?= =?UTF-8?q?effect=20(#5359)=20*=20feat:=20improve=20`tippy`=20demo=20(#535?= =?UTF-8?q?7)=20*=20feat:=20integrate=20new=20component=20`Tippy`=20with?= =?UTF-8?q?=20demo=20(#5355)=20*=20chore:=20=E4=BC=98=E5=8C=96=E8=A1=A8?= =?UTF-8?q?=E6=A0=BC=E5=9B=BE=E7=89=87=E6=98=BE=E7=A4=BA=20*=20perf:=20add?= =?UTF-8?q?=20nested=20modal=20demo=20(#5353)=20*=20chore:=20=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E6=98=BE=E7=A4=BA=E5=8F=B3=E8=BE=B9=E7=9A=84=E6=BB=9A?= =?UTF-8?q?=E5=8A=A8=E6=9D=A1=20=E9=98=B2=E6=AD=A2=E5=87=BA=E7=8E=B0?= =?UTF-8?q?=E6=BB=9A=E5=8A=A8=E6=9D=A1=E8=A2=AB=E6=8C=A4=E5=8E=8B=20*=20pe?= =?UTF-8?q?rf:=20modal=20and=20drawer=20api=20support=20chain=20calls=20(#?= =?UTF-8?q?5351)=20*=20feat:=20allow=20close=20tab=20when=20mouse=20middle?= =?UTF-8?q?=20button=20click=20(#5347)=20*=20Merge=20branch=20'main'=20of?= =?UTF-8?q?=20https://github.com/vbenjs/vue-vben-admin=20into=20warmflow?= =?UTF-8?q?=20*=20refactor:=20=E9=87=8D=E6=9E=84=E6=98=BE=E7=A4=BAtotal?= =?UTF-8?q?=E7=9A=84=E9=80=BB=E8=BE=91=20*=20chore:=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E9=AB=98=E5=BA=A6=E8=87=AA=E9=80=82=E5=BA=94=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=20*=20chore:=20vxe=E5=8D=87=E7=BA=A74.10.0=E7=89=88=E6=9C=AC(?= =?UTF-8?q?=E9=94=81=E5=AE=9A)=20*=20fix:=20=E6=B7=BB=E5=8A=A0=E5=A4=B1?= =?UTF-8?q?=E6=95=88=E7=9A=84option=20*=20fix:=20=E9=9C=80=E8=A6=81?= =?UTF-8?q?=E4=B8=BA=E6=95=B0=E7=BB=84=20*=20fix:=20locale=20switching=20l?= =?UTF-8?q?ogic=20correction=20(#5344)=20*=20Merge=20branch=20'main'=20of?= =?UTF-8?q?=20https://github.com/vbenjs/vue-vben-admin=20into=20warmflow?= =?UTF-8?q?=20*=20chore:=20=E5=AF=BC=E5=85=A5=E7=B1=BB=E5=9E=8B=E4=BC=98?= =?UTF-8?q?=E5=8C=96=20=E8=A7=A3=E5=86=B3eslint=E6=8A=A5=E7=BA=A2=20*=20re?= =?UTF-8?q?factor:=20type/=E6=B3=A8=E9=87=8A=E4=BC=98=E5=8C=96=20=E5=8E=BB?= =?UTF-8?q?=E9=99=A4=E5=A4=A7=E9=87=8Fany=20*=20fix:=20vxeGrid=20init=20wi?= =?UTF-8?q?thout=20search=20form=20(#5342)=20*=20chore:=20=E9=94=81?= =?UTF-8?q?=E5=B1=8F=E9=BB=98=E8=AE=A4false=20=20=E5=85=B3=E9=97=AD?= =?UTF-8?q?=E8=AF=A5=E5=8A=9F=E8=83=BD=20*=20chore:=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=20*=20chore:=20update=20deps=20*=20fix:=20pr?= =?UTF-8?q?imaryColor=20calculation=20(#5337)=20*=20fix:=20form=20valid-er?= =?UTF-8?q?ror=20style=20in=20naive=20(#5336)=20*=20fix:=20form=20`fieldMa?= =?UTF-8?q?ppingTime`=20improve=20and=20`modelPropName`=20support=20(#5335?= =?UTF-8?q?)=20*=20fix:=20code=20lint=20*=20fix:=20form=20`fieldMappingTim?= =?UTF-8?q?e`=20is=20not=20working=20(#5333)=20*=20chore:=20=E9=80=89?= =?UTF-8?q?=E4=BA=BA=E7=BB=84=E4=BB=B6=E6=A0=B7=E5=BC=8F=20*=20fix:=20down?= =?UTF-8?q?load=20from=20url=20triggered=20twice=20sometimes=20(#5319)=20*?= =?UTF-8?q?=20chore:=20=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81=20*=20chore:?= =?UTF-8?q?=20=E5=8A=A8=E6=80=81=E7=B1=BB=E5=90=8D(=E6=97=A0=E6=95=88)?= =?UTF-8?q?=E6=94=B9=E4=B8=BAstyle=20*=20refactor:=20=E5=AD=97=E5=85=B8?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E5=8A=9F=E8=83=BD=E9=87=8D=E6=9E=84=20?= =?UTF-8?q?=E9=87=87=E7=94=A8=E4=B8=80=E4=B8=AAMap=E5=82=A8=E5=AD=98?= =?UTF-8?q?=E5=AD=97=E5=85=B8(=E4=B9=8B=E5=89=8D=E4=B8=BA=E4=B8=A4?= =?UTF-8?q?=E4=B8=AAMap)=20*=20feat:=20=E5=AD=97=E5=85=B8=E6=94=AF?= =?UTF-8?q?=E6=8C=81number=E7=B1=BB=E5=9E=8B=E5=AD=98=E5=82=A8=20*=20chore?= =?UTF-8?q?:=20=E8=B0=83=E6=95=B4=E6=A0=B7=E5=BC=8F=20*=20chore:=20?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=80=89=E4=B8=ADborder=E4=B8=BA1px=20*=20ch?= =?UTF-8?q?ore:=20=E5=AD=97=E6=AE=B5=20*=20chore:=20=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E6=96=B0=E7=AA=97=E5=8F=A3=E6=89=93=E5=BC=80(=E9=80=82?= =?UTF-8?q?=E7=94=A8=E4=BA=8Epdf/=E5=9B=BE=E7=89=87)=E8=80=8C=E9=9D=9E?= =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E4=B8=8B=E8=BD=BD=20*=20chore:=20=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E6=A0=B7=E5=BC=8F=20*=20chore:=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=20*=20chore:=20=E6=94=B9=E4=B8=BAcomputed=20?= =?UTF-8?q?*=20chore:=20=E8=B7=B3=E8=BD=AC=E5=88=B0=E6=9C=AA=E5=8F=91?= =?UTF-8?q?=E5=B8=83=E6=B5=81=E7=A8=8Btab=20*=20chore:=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=A0=B7=E5=BC=8F=20*=20docs:=20readme=20*=20fix:=20n?= =?UTF-8?q?ame=E9=87=8D=E5=A4=8D=E5=AF=BC=E8=87=B4=E7=9A=84404=20*=20Merge?= =?UTF-8?q?=20branch=20'dev'=20of=20https://gitee.com/dapppp/ruoyi-plus-vb?= =?UTF-8?q?en5=20into=20warmflow=20*=20chore:=20=E4=BD=BF=E7=94=A8legacy?= =?UTF-8?q?=E6=9D=A5=E4=BF=9D=E8=AF=81copy=E7=9A=84=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E6=80=A7=20*=20chore:=20=E5=8E=BB=E9=99=A4log=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E8=AF=B4=E6=98=8E=20*=20chore:=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=20*=20feat:=20=E8=8A=82=E7=82=B9=E5=85=B3?= =?UTF-8?q?=E8=81=94/=E8=8A=82=E7=82=B9=E7=8B=AC=E7=AB=8B=E7=9A=84?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E9=80=BB=E8=BE=91=20*=20chore:=20remove=20lo?= =?UTF-8?q?gic=20*=20chore:=20vxe=E5=8F=AF=E7=BC=96=E8=BE=91=E8=A1=A8?= =?UTF-8?q?=E6=A0=BCdemo=20*=20chore:=20=E4=B8=8D=E5=85=81=E8=AE=B8?= =?UTF-8?q?=E5=9C=A8=E6=8C=89=E9=92=AE=E4=B8=8B=E6=B7=BB=E5=8A=A0=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=20*=20docs:=20changelog=20*=20fix:=20wrong=20code=20*?= =?UTF-8?q?=20chore:=20=E7=A7=BB=E9=99=A4=E6=B5=8B=E8=AF=95=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=20*=20chore:=20=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=20*=20refactor:=20=E7=A7=9F=E6=88=B7=E5=A5=97=E9=A4=90?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E6=9B=BF=E6=8D=A2=E4=B8=BA=E6=96=B0=E7=89=88?= =?UTF-8?q?=20*=20refactor:=20=E4=BD=BF=E7=94=A8=E6=96=B0=E7=89=88?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E5=8B=BE=E9=80=89=20*=20chore:=20=E7=82=B9?= =?UTF-8?q?=E8=A1=8C=E4=BC=9A=E5=8B=BE=E9=80=89/=E5=8F=96=E6=B6=88?= =?UTF-8?q?=E5=85=A8=E9=83=A8=E6=9D=83=E9=99=90=20=20=E7=82=B9=E6=9D=83?= =?UTF-8?q?=E9=99=90=E4=B8=8D=E4=BC=9A=E5=8B=BE=E9=80=89=E8=A1=8C=20*=20ch?= =?UTF-8?q?ore:=20=E5=85=A8=E5=B1=8F=E5=BC=95=E5=AF=BC+=E6=A0=B7=E5=BC=8F?= =?UTF-8?q?=E4=BC=98=E5=8C=96=20*=20chore:=20=E8=B0=83=E6=95=B4=E9=97=B4?= =?UTF-8?q?=E8=B7=9D=20*=20Merge=20branch=20'main'=20of=20https://github.c?= =?UTF-8?q?om/vbenjs/vue-vben-admin=20into=20dev=20*=20feat:=20useEcharts?= =?UTF-8?q?=20exports=20echarts=20instance#5294=20(#5299)=20*=20chore:=20u?= =?UTF-8?q?pdate=20quick-start.md=20(#5303)=20*=20chore:=20updateCheckedNu?= =?UTF-8?q?mber=20*=20refactor:=20=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81=20*?= =?UTF-8?q?=20chore:=20=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81=20*=20chore:?= =?UTF-8?q?=20=E4=BC=98=E5=8C=96=E6=A0=B7=E5=BC=8F=20*=20chore:=20keys?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=E4=BA=8Emenu=20=E9=9C=80=E8=A6=81=E5=85=88?= =?UTF-8?q?=E5=8A=A0=E8=BD=BDmenu=20*=20chore:=20=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E5=AE=8C=E6=AF=95=E5=86=8D=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=20*=20feat:=20=E6=96=B0=E7=9A=84=E8=8F=9C=E5=8D=95=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E7=BB=84=E4=BB=B6(beta)=20*=20chore:=20$t=20*=20chore?= =?UTF-8?q?:=20=E6=B5=8B=E8=AF=95=E8=8F=9C=E5=8D=95=E9=A1=B5=E9=9D=A2=20*?= =?UTF-8?q?=20chore:=20=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81=20*=20feat:=20?= =?UTF-8?q?=E5=AF=B9ossId=E5=9B=9E=E6=98=BE=E7=9A=84=E6=94=AF=E6=8C=81=20*?= =?UTF-8?q?=20chore:=20=E5=8F=AA=E8=8E=B7=E5=8F=96=E4=B8=80=E6=AC=A1?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E5=AF=86=E7=A0=81=E8=80=8C=E9=9D=9E=E6=AF=8F?= =?UTF-8?q?=E6=AC=A1=E6=89=93=E5=BC=80modal=E9=83=BD=E8=8E=B7=E5=8F=96=20*?= =?UTF-8?q?=20fix:=20vben=20select=20placeholder=20color=20(#5286)=20*=20M?= =?UTF-8?q?erge=20branch=20'main'=20of=20https://github.com/vbenjs/vue-vbe?= =?UTF-8?q?n-admin=20into=20dev=20*=20perf:=20format=20code=20with=20bette?= =?UTF-8?q?r=20style=20(#5283)=20*=20chore:=20=E5=B7=A5=E4=BD=9C=E6=B5=81?= =?UTF-8?q?=E6=BC=94=E7=A4=BA=E7=AB=99=20*=20fix:=20sidebar=20preferences?= =?UTF-8?q?=20fixed=20(#5276)=20*=20Merge=20branch=20'main'=20of=20https:/?= =?UTF-8?q?/github.com/vbenjs/vue-vben-admin=20into=20dev=20*=20fix:=20bre?= =?UTF-8?q?adcrumb=20setting=20not=20valid=20for=20`header-sidebar-nav`=20?= =?UTF-8?q?layout=20(#5275)=20*=20fix:=20header=20logo=20may=20not=20be=20?= =?UTF-8?q?collapsed=20in=20`header-sidebar-nav`=20layout=20(#5274)=20*=20?= =?UTF-8?q?feat:=20new=20layout=20`sidebar=20nav=20with=20full=20header`?= =?UTF-8?q?=20(#5270)=20*=20feat:=20drawer=20close=20icon=20placement=20(#?= =?UTF-8?q?5269)=20*=20docs:=20update=20dialog=20and=20drawer=20docs=20*?= =?UTF-8?q?=20feat:=20drawer=20support=20destroy=20on=20close=20*=20feat:?= =?UTF-8?q?=20drawer=20support=20`onOpened`=20&=20`onClosed`=20*=20feat:?= =?UTF-8?q?=20modal=20support=20destroy=20on=20close=20*=20fix:=20wrong=20?= =?UTF-8?q?boolean=20*=20Merge=20branch=20'main'=20of=20https://github.com?= =?UTF-8?q?/vbenjs/vue-vben-admin=20into=20dev=20*=20chore:=20=E8=B0=83?= =?UTF-8?q?=E6=95=B4tab=E4=BD=8D=E7=BD=AE=20*=20chore:=20=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=8E=86=E5=8F=B2=E6=B5=81=E7=A8=8B=20=E6=94=B9?= =?UTF-8?q?=E4=B8=BAtab=E5=88=87=E6=8D=A2=20*=20fix:=20header-mixed=20layo?= =?UTF-8?q?ut=20side-menu=20active=20(#5265)=20*=20feat:=20header=20mixed?= =?UTF-8?q?=20layout=20(#5263)=20*=20chore:=20release=205.5.2=20*=20Merge?= =?UTF-8?q?=20branch=20'main'=20of=20https://github.com/vbenjs/vue-vben-ad?= =?UTF-8?q?min=20into=20dev=20*=20chore:=20downgrade=20vue-tsc=20version?= =?UTF-8?q?=20*=20feat:=20header=20menu=20align=20support=20(#5256)=20*=20?= =?UTF-8?q?chore:=20update=20deps=20*=20Merge=20branch=20'main'=20of=20htt?= =?UTF-8?q?ps://github.com/vbenjs/vue-vben-admin=20into=20dev=20*=20chore:?= =?UTF-8?q?=20add=20apiSelect=20remote=20search=20demo=20(#5246)=20*=20cho?= =?UTF-8?q?re:=20=E5=AE=A1=E6=89=B9=E6=94=B9=E4=B8=BAdescription=E8=80=8C?= =?UTF-8?q?=E9=9D=9Edisabled=E7=9A=84=E8=A1=A8=E5=8D=95=20*=20chore:=20?= =?UTF-8?q?=E6=94=B9=E4=B8=BAts=20*=20chore:=20=E9=94=99=E8=AF=AF=E7=9A=84?= =?UTF-8?q?conetnt=20*=20refactor:=20=E7=BB=88=E6=AD=A2/=E8=BD=AC=E5=8A=9E?= =?UTF-8?q?/=E5=A7=94=E6=89=98=E6=94=AF=E6=8C=81=E5=A1=AB=E5=86=99?= =?UTF-8?q?=E6=84=8F=E8=A7=81=20*=20chore:=20=E7=AC=AC=E4=B8=80=E6=AC=A1?= =?UTF-8?q?=E6=8B=BF=E5=88=B0=E7=9A=84=E6=98=AFreadonly=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=20=E5=A6=82=E6=9E=9C=E9=9C=80=E8=A6=81=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=20=E9=9C=80=E8=A6=81cloneDeep=20*=20Merge=20branch=20?= =?UTF-8?q?'main'=20of=20https://github.com/vbenjs/vue-vben-admin=20into?= =?UTF-8?q?=20dev=20*=20fix:=20grid=20form=20submit=20button=20locale=20sw?= =?UTF-8?q?itch=20(#5205)=20*=20chore:=20=E8=B0=83=E6=95=B4=E9=A9=B3?= =?UTF-8?q?=E5=9B=9E=20*=20Merge=20branch=20'main'=20of=20https://github.c?= =?UTF-8?q?om/vbenjs/vue-vben-admin=20into=20dev=20*=20fix:=20build=20erro?= =?UTF-8?q?r=20(#5199)=20*=20fix:=20esbuild=E8=87=AA=E5=8A=A8=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=E5=AF=BC=E8=87=B4=E8=BF=90=E8=A1=8C/=E6=89=93?= =?UTF-8?q?=E5=8C=85=E6=8A=A5=E9=94=99=20*=20fix:=20esbuild=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=8D=87=E7=BA=A7=E5=AF=BC=E8=87=B4=E8=BF=90=E8=A1=8C?= =?UTF-8?q?/=E6=89=93=E5=8C=85=E6=8A=A5=E9=94=99=20*=20chore:=20=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=AE=9A=E4=B9=89=20=E6=BF=80=E6=B4=BB=E6=94=B9?= =?UTF-8?q?=E4=B8=BAswitch=20*=20chore:=20=E6=B5=81=E7=A8=8B=E7=94=B3?= =?UTF-8?q?=E8=AF=B7=E6=94=AF=E6=8C=81=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=20*=20chore:=20title=20=E5=AE=A1=E6=89=B9=E9=80=9A=E8=BF=87=20?= =?UTF-8?q?*=20fix:=20vxeGrid=20top=20padding=20(#5193)=20*=20fix:=20?= =?UTF-8?q?=E8=A1=A8=E6=A0=BC=E6=8E=92=E5=BA=8F=E7=BF=BB=E9=A1=B5=E4=BC=9A?= =?UTF-8?q?=E4=B8=A2=E5=A4=B1=E6=8E=92=E5=BA=8F=E5=8F=82=E6=95=B0=20*=20ch?= =?UTF-8?q?ore:=20=E5=8E=BB=E9=99=A4log=E6=89=93=E5=8D=B0=20*=20chore:=20?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E7=9B=91=E6=8E=A7=20=E5=BE=85=E5=8A=9E?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=20*=20chore:=20=E6=88=91=E5=8F=91=E8=B5=B7?= =?UTF-8?q?=E7=9A=84=20*=20chore:=20=E5=8E=BB=E9=99=A4=E5=B7=B2=E7=BB=8F?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E7=9A=84=E8=8F=9C=E5=8D=95=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=20*=20chore:=20=E6=88=91=E7=9A=84=E5=B7=B2=E5=8A=9E=20*=20chor?= =?UTF-8?q?e:=20=E9=A1=B5=E9=9D=A2=E4=BC=98=E5=8C=96=20*=20chore:=20?= =?UTF-8?q?=E9=87=8D=E7=BD=AEtooltip=20*=20feat:=20=E6=88=91=E7=9A=84?= =?UTF-8?q?=E6=8A=84=E9=80=81=E6=90=9C=E7=B4=A2/=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E8=A7=A6=E5=8F=91=E7=9A=84=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=20*=20feat:=20=E6=B5=81=E7=A8=8B=E5=AE=9A=E4=B9=89=20=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=20*=20chore:=20=E4=BF=AE=E6=94=B9=E5=88=86=E7=B1=BB?= =?UTF-8?q?=20*=20Merge=20branch=20'main'=20of=20https://github.com/vbenjs?= =?UTF-8?q?/vue-vben-admin=20into=20dev=20*=20fix:=20grid=20tools=20in=20t?= =?UTF-8?q?oolbar=20config=20not=20working=20as=20expected=20(#5190)=20*?= =?UTF-8?q?=20feat:=20add=20`resizable`=20and=20`ColPage`=20component=20(#?= =?UTF-8?q?5188)=20*=20chore:=20=E6=9D=A1=E4=BB=B6=20*=20chore:=20break-al?= =?UTF-8?q?l=20*=20feat:=20=E6=B5=81=E7=A8=8B=E5=88=86=E7=B1=BB=20?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=20*=20chore:=20=E5=BC=B9=E7=AA=97=E5=85=B3?= =?UTF-8?q?=E9=97=AD=E5=90=8E=E4=BB=8D=E7=84=B6=E6=98=BE=E7=A4=BA=E8=A1=A8?= =?UTF-8?q?=E5=8D=95=E6=B5=AE=E5=B1=82=20*=20chore:=20=E9=80=89=E4=BA=BA?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E7=9A=84=E6=A0=B7=E5=BC=8F=20*=20chore:=20?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E7=9A=84=E6=A0=B7=E5=BC=8F=20*=20chore:=20?= =?UTF-8?q?=E6=BC=8F=E6=8E=89=E7=9A=84=E5=AF=BC=E5=85=A5=20*=20chore:=20?= =?UTF-8?q?=E6=9C=80=E5=A4=A7=E6=98=BE=E7=A4=BA=E7=9A=84=E5=A4=B4=E5=83=8F?= =?UTF-8?q?=E6=95=B0=E9=87=8F=20=E8=B6=85=E8=BF=87=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E4=B8=BA=E7=9C=81=E7=95=A5=E5=8F=B7=E5=A4=B4=E5=83=8F=20*=20fi?= =?UTF-8?q?x:=20=E9=80=89=E4=BA=BA=E7=9A=84=E4=B8=80=E4=BA=9B=E9=97=AE?= =?UTF-8?q?=E9=A2=98=20*=20Merge=20branch=20'warmflow'=20of=20https://gite?= =?UTF-8?q?e.com/dapppp/ruoyi-plus-vben5=20i=E2=80=A6=20*=20chore:=20?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E6=9B=B4=E5=A4=9A=E6=95=B0=E6=8D=AE=E4=BA=86?= =?UTF-8?q?=20*=20fix:=20sidebar=20header=20height=20(#5183)=20*=20chore:?= =?UTF-8?q?=20=E6=90=9C=E7=B4=A2=E8=A1=A8=E5=8D=95=E5=B8=83=E5=B1=80+?= =?UTF-8?q?=E7=94=B3=E8=AF=B7=E4=BA=BA=20*=20fix:=20remove=20the=20overlap?= =?UTF-8?q?=20caused=20by=20border-b=20(#5160)=20*=20docs:=20fix=20typos?= =?UTF-8?q?=20(#5169)=20*=20fix:=20resolve=20eslint=20errors=20as=20well?= =?UTF-8?q?=20as=20TS=20type=20errors=20(#5172)=20*=20chore:=20enter?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E8=A1=A8=E5=8D=95=20*=20chore:=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=96=87=E6=A1=88=20*=20chore:=20=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E5=85=A8=E9=83=A8=E5=B1=95=E5=BC=80=20*=20Merge=20branch=20'ma?= =?UTF-8?q?in'=20of=20https://github.com/vbenjs/vue-vben-admin=20into=20de?= =?UTF-8?q?v=20*=20feat:=20page=20content=20class=20override=20(#5179)=20*?= =?UTF-8?q?=20fix:=20sidebar=20style=20on=20focus=20(#5178)=20*=20fix:=20?= =?UTF-8?q?=E6=8A=84=E9=80=81=E9=80=89=E4=BA=BA=20=E6=9C=80=E5=8F=B3?= =?UTF-8?q?=E4=BE=A7=E5=B7=B2=E9=80=89=E4=B8=AD=E5=88=A0=E9=99=A4item?= =?UTF-8?q?=E6=97=A0=E6=95=88=20*=20feat:=20=E5=A4=8D=E5=88=B6=20*=20chore?= =?UTF-8?q?:=20=E6=98=B5=E7=A7=B0=E8=BF=87=E9=95=BF=E7=9A=84=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=20*=20chore:=20=E9=BB=98=E8=AE=A4=E9=80=89=E4=B8=AD?= =?UTF-8?q?=E7=AC=AC=E4=B8=80=E4=B8=AA=20*=20chore:=20=E4=BF=AE=E6=94=B9re?= =?UTF-8?q?lative=E4=BD=8D=E7=BD=AE=20*=20chore:=20=E6=90=9C=E7=B4=A2=20*?= =?UTF-8?q?=20feat:=20=E6=88=91=E7=9A=84=E5=BE=85=E5=8A=9E=20-=20=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E6=9D=A1=E4=BB=B6=20*=20chore:=20=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E7=9B=91=E6=8E=A7=20-=20=E5=BE=85=E5=8A=9E=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E7=9A=84id=E4=B8=8D=E5=94=AF=E4=B8=80=20?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E5=89=8D=E7=AB=AF=E5=A4=84=E7=90=86=20*=20fe?= =?UTF-8?q?at:=20=E4=BF=AE=E6=94=B9=E5=8A=9E=E7=90=86=E4=BA=BA=20*=20chore?= =?UTF-8?q?:=20=E6=B5=81=E7=A8=8B=E5=B9=B2=E9=A2=84=20-=20=E5=8A=A0?= =?UTF-8?q?=E7=AD=BE/=E5=87=8F=E7=AD=BE=20*=20chore:=20avatar=E5=A4=A7?= =?UTF-8?q?=E5=B0=8F=20*=20chore:=20=E6=8A=84=E9=80=81=E9=9C=80=E8=A6=81?= =?UTF-8?q?=E6=89=8B=E5=8A=A8=E6=B7=BB=E5=8A=A0createByName=20*=20Merge=20?= =?UTF-8?q?branch=20'main'=20of=20https://github.com/vbenjs/vue-vben-admin?= =?UTF-8?q?=20into=20dev=20*=20chore:=20=E5=AE=A1=E6=89=B9=E9=80=9A?= =?UTF-8?q?=E8=BF=87=20=E6=8A=84=E9=80=81=20*=20feat:=20=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E5=AE=9E=E4=BE=8B-=E6=B5=81=E7=A8=8B=E9=A2=84=E8=A7=88=20*=20c?= =?UTF-8?q?hore:=20spell=20*=20chore:=20clientid=20*=20chore:=20=E5=88=86?= =?UTF-8?q?=E7=B1=BB=E6=9D=A1=E4=BB=B6=20*=20chore:=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=8A=9E=E7=90=86=E4=BA=BA=20*=20chore:=20=E6=9B=B4=E6=94=B9po?= =?UTF-8?q?stMessage=E5=8F=82=E6=95=B0=20*=20chore:=20=E5=86=85=E5=B5=8Cif?= =?UTF-8?q?rame=E9=AB=98=E5=BA=A6=E6=A0=B9=E6=8D=AE=E8=A1=A8=E5=8D=95?= =?UTF-8?q?=E9=AB=98=E5=BA=A6=E8=B0=83=E6=95=B4=20*=20chore:=20=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E8=AF=A6=E6=83=85=20*=20feat:=20=E6=8A=84=E9=80=81?= =?UTF-8?q?=E9=80=89=E6=8B=A9=20*=20chore:=20=E8=B0=83=E6=95=B4=E5=88=86?= =?UTF-8?q?=E7=B1=BB=E6=A0=91=20*=20fix:=20user=20homePath=20no=20effect?= =?UTF-8?q?=20sometimes=20(#5166)=20*=20feat:=20form=20compact=20mode=20su?= =?UTF-8?q?pport=20(#5165)=20*=20fix:=20form=20auto=20submit=20no=20effect?= =?UTF-8?q?=20when=20showDefaultActions=20is=20false=20(#5163)=20*=20chore?= =?UTF-8?q?:=20=E4=BF=AE=E6=94=B9width=20*=20feat:=20=E5=BE=85=E5=8A=9E?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=20*=20feat:=20=E6=88=91=E7=9A=84=E6=8A=84?= =?UTF-8?q?=E9=80=81=20*=20chore:=20=E6=B5=81=E7=A8=8B=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=20=E6=A0=B7=E5=BC=8F=20*=20chore:=20=E9=80=80=E5=9B=9E?= =?UTF-8?q?=E5=90=8E=E9=87=8D=E6=96=B0=E7=94=B3=E8=AF=B7=20*=20chore:=20?= =?UTF-8?q?=E8=AF=B7=E5=81=87=E7=94=B3=E8=AF=B7=E5=B8=83=E5=B1=80=20*=20ch?= =?UTF-8?q?ore:=20=E8=AF=B7=E5=81=87=E7=94=B3=E8=AF=B7-=E5=B9=B6=E8=A1=8C?= =?UTF-8?q?=E4=BC=9A=E7=AD=BE=E7=BD=91=E5=85=B3=20*=20chore:=20=E5=88=86?= =?UTF-8?q?=E7=B1=BB=E5=8E=BB=E9=99=A4=E6=A0=B9=E7=9B=AE=E5=BD=95=20*=20ch?= =?UTF-8?q?ore:=20=E8=AF=A6=E6=83=85modal(=E6=9C=AA=E5=AE=8C=E6=88=90)=20*?= =?UTF-8?q?=20chore:=20=E8=AF=B7=E5=81=87=E7=94=B3=E8=AF=B7=E6=A0=B9?= =?UTF-8?q?=E6=8D=AE=E4=B8=8D=E5=90=8C=E7=8A=B6=E6=80=81=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E6=8C=89=E9=92=AE=20*=20chore:=20=E6=B5=81=E7=A8=8B=E5=88=A0?= =?UTF-8?q?=E9=99=A4/=E6=92=A4=E9=94=80=20*=20chore:=20=E5=AE=A1=E6=89=B9?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=90=8E=E5=88=B7=E6=96=B0=E5=BD=93=E5=89=8D?= =?UTF-8?q?=E9=A1=B5=20*=20feat:=20=E9=80=89=E4=BA=BA=E7=BB=84=E4=BB=B6(?= =?UTF-8?q?=E6=9C=AA=E5=AE=8C=E6=88=90)=20=E5=8A=A0=E7=AD=BE=E5=87=8F?= =?UTF-8?q?=E7=AD=BE=20*=20docs:=20fix=20docs-link=20and=20add=20`Ellipsis?= =?UTF-8?q?Text`=20docs=20(#5158)=20*=20chore:=20=E6=96=B0=E7=AA=97?= =?UTF-8?q?=E5=8F=A3=E6=89=93=E5=BC=80=E6=96=87=E4=BB=B6=20*=20chore:=20?= =?UTF-8?q?=E5=AE=A1=E6=89=B9=E9=80=9A=E8=BF=87=20*=20chore:=20=E4=BD=BF?= =?UTF-8?q?=E7=94=A8useEventListener=E6=9B=BF=E6=8D=A2=E5=8E=9F=E7=94=9F?= =?UTF-8?q?=20*=20chore:=20=E5=AD=97=E6=AE=B5=E9=94=99=E8=AF=AF=20*=20chor?= =?UTF-8?q?e:=20iframe=E9=80=9A=E4=BF=A1=20=E5=8A=A0=E8=BD=BD=E5=AE=8C?= =?UTF-8?q?=E6=AF=95=E5=90=8E=E6=89=8D=E6=98=BE=E7=A4=BA=E8=A1=A8=E5=8D=95?= =?UTF-8?q?=20=E8=A7=A3=E5=86=B3=E5=8D=A1=E9=A1=BF=E9=97=AE=E9=A2=98=20*?= =?UTF-8?q?=20chore:=20=E5=AE=A1=E6=89=B9=E7=BB=88=E6=AD=A2/=E9=A9=B3?= =?UTF-8?q?=E5=9B=9E=20*=20chore:=20=E9=99=84=E4=BB=B6=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=20*=20chore:=20process=5Frunning=E6=98=BE=E7=A4=BA=E6=8C=89?= =?UTF-8?q?=E9=92=AE=20*=20chore:=20label=E9=94=99=E8=AF=AF=20*=20chore:?= =?UTF-8?q?=20=E4=BF=9D=E5=AD=98=E7=9A=84=E4=BA=8B=E4=BB=B6=20*=20chore:?= =?UTF-8?q?=20=E9=9C=80=E8=A6=81=E5=8A=A0=E4=B8=8AclientId=20*=20Merge=20b?= =?UTF-8?q?ranch=20'main'=20of=20https://github.com/vbenjs/vue-vben-admin?= =?UTF-8?q?=20into=20dev=20*=20feat:=20form=20`colon`=20support=20(#5156)?= =?UTF-8?q?=20*=20chore:=20=E5=AE=8C=E5=96=84=E8=AF=B7=E5=81=87=E7=94=B3?= =?UTF-8?q?=E8=AF=B7=20*=20feat:=20improve=20code=20login=20demo=20(#5154)?= =?UTF-8?q?=20*=20chore:=20=E5=AE=A2=E6=88=B7=E7=AB=AF=E7=AE=A1=E7=90=86?= =?UTF-8?q?=20=E8=A1=8C=E9=AB=98=E8=87=AA=E9=80=82=E5=BA=94=20*=20chore:?= =?UTF-8?q?=20=E5=86=85=E5=B5=8C=E8=A1=A8=E5=8D=95=E7=9A=84=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=20*=20chore:=20=E4=BF=AE=E6=94=B9avatar=E8=83=8C?= =?UTF-8?q?=E6=99=AF=E8=89=B2=20*=20chore:=20=E6=B3=A8=E9=87=8A=20*=20chor?= =?UTF-8?q?e:=20activePath=20*=20chore:=20leave=E8=A1=A8=E5=8D=95=20*=20ch?= =?UTF-8?q?ore:=20=E4=BF=AE=E6=94=B9=E8=AF=B7=E5=81=87demo=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=20*=20chore:=20categoryId=20*=20chore:=20=E6=88=91?= =?UTF-8?q?=E7=9A=84=E5=B7=B2=E5=8A=9E=20*=20chore:=20=E6=88=91=E5=8F=91?= =?UTF-8?q?=E8=B5=B7=E7=9A=84=20*=20chore:=20loading=20*=20chore:=20?= =?UTF-8?q?=E5=8E=86=E5=8F=B2=E7=89=88=E6=9C=AC=20*=20chore:=20=E5=AE=8C?= =?UTF-8?q?=E5=96=84task=20api=20*=20chore:=20=E9=9A=90=E8=97=8F'=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E5=8A=A0=E8=BD=BD=E4=B8=AD'=20*=20chore:=20missing=20?= =?UTF-8?q?import=20*=20feat:=20add=20demo=20for=20modify=20menu=20badge?= =?UTF-8?q?=20data=20*=20chore:=20=E6=B5=81=E7=A8=8B=E5=AE=9E=E4=BE=8B=20*?= =?UTF-8?q?=20chore:=20=E5=AE=A1=E6=89=B9=E9=99=84=E4=BB=B6=20*=20chore:?= =?UTF-8?q?=20=E6=88=91=E7=9A=84=E5=BE=85=E5=8A=9E=20=E6=8F=90=E5=8F=96?= =?UTF-8?q?=E5=85=AC=E5=85=B1=E7=BB=84=E4=BB=B6=20*=20chore:=20=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E9=83=A8=E7=BD=B2=20*=20chore:=20=E6=96=B0=E5=A2=9E/?= =?UTF-8?q?=E7=BC=96=E8=BE=91/=E5=AF=BC=E5=87=BAxml=20*=20chore:=20?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E5=AE=9A=E4=B9=89(=E9=99=A4=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E7=89=88=E6=9C=AC)=20*=20feat:=20`autoActivateChild`?= =?UTF-8?q?=20support=20more=20layout=20mode=20(#5148)=20*=20feat:=20auto?= =?UTF-8?q?=20activate=20subMenu=20on=20select=20root=20menu=20(#5147)=20*?= =?UTF-8?q?=20fix:=20`disabledOnChangeListener`=20not=20work=20in=20form?= =?UTF-8?q?=20(#5146)=20*=20fix:=20login=20expired=20modal=20z-index=20(#5?= =?UTF-8?q?145)=20*=20feat:=20user-dropdown=20support=20`hover`=20trigger?= =?UTF-8?q?=20(#5143)=20*=20fix:=20pinInput=20value=20synchronous=20update?= =?UTF-8?q?=20(#5142)=20*=20fix:=20vxeGrid=20default=20sort=20data=20no=20?= =?UTF-8?q?effect=20in=20first=20query=20(#5141)=20*=20fix:=20vscode=20deb?= =?UTF-8?q?ug=20profile=20(#5140)=20*=20fix:=20form=20component=20events?= =?UTF-8?q?=20bind=20(#5137)=20*=20chore:=20=E5=9C=A8=E7=BA=BF=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=A0=B7=E5=BC=8F=20=E5=BC=80=E5=90=AF=E8=99=9A?= =?UTF-8?q?=E6=8B=9F=E6=BB=9A=E5=8A=A8=20*=20chore:=20=E5=8E=BB=E6=8E=89?= =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E4=B8=AD=E5=BF=83=20=E5=9C=A8=E7=BA=BF?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E7=9A=84=E5=88=86=E9=A1=B5=20*=20chore:=20?= =?UTF-8?q?=E5=8E=BB=E6=8E=89=E5=9C=A8=E7=BA=BF=E7=94=A8=E6=88=B7=E7=9A=84?= =?UTF-8?q?=E5=88=86=E9=A1=B5=20*=20chore:=20changelog=20*=20refactor:=20?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=AD=97=E5=85=B8=E7=9A=84=E6=96=B9=E6=B3=95?= =?UTF-8?q?=20=E6=8F=90=E5=8F=96=E5=85=AC=E5=85=B1=E5=87=BD=E6=95=B0=20?= =?UTF-8?q?=E5=87=8F=E5=B0=91=E5=86=97=E4=BD=99=E4=BB=A3=E7=A0=81=20*=20fi?= =?UTF-8?q?x:=20element=20plus=20validate=20failed=20style=20(#5130)=20*?= =?UTF-8?q?=20chore:=20=E4=BD=BF=E7=94=A8=E7=A7=81=E6=9C=89=E6=A1=B6?= =?UTF-8?q?=E7=9A=84=E6=8F=90=E7=A4=BA=20*=20feat:=20tabbar=20support=20mo?= =?UTF-8?q?use=20wheel=20vertical=20(#5129)=20*=20fix:=20form=20support=20?= =?UTF-8?q?`disabledOnInputListener`=20(#5127)=20*=20fix:=20form=20submiss?= =?UTF-8?q?ion=20not=20appropriate=20(#5126)=20*=20Merge=20branch=20'main'?= =?UTF-8?q?=20of=20https://gitee.com/dapppp/ruoyi-plus-vben5=20into=20dev?= =?UTF-8?q?=20*=20chore:=20release=205.5.1=20*=20feat:=20table=20search=20?= =?UTF-8?q?form=20visible=20control=20(#5121)=20*=20chore:=20=E9=9C=80?= =?UTF-8?q?=E8=A6=81=E9=9A=90=E8=97=8F=E8=8F=9C=E5=8D=95=20*=20chore:=20?= =?UTF-8?q?=E6=88=91=E7=9A=84=E5=BE=85=E5=8A=9E=20&=20=E8=AF=B7=E5=81=87?= =?UTF-8?q?=20*=20chore:=20=E6=B5=81=E7=A8=8B=E5=AE=9A=E4=B9=89(=E6=9C=AA?= =?UTF-8?q?=E5=AE=8C=E6=88=90)=20*=20chore:=20=E6=B5=81=E7=A8=8B=E5=AE=9A?= =?UTF-8?q?=E4=B9=89(=E5=BC=80=E5=8F=91=E4=B8=AD)=20*=20Merge=20branch=20'?= =?UTF-8?q?main'=20of=20https://gitee.com/dapppp/ruoyi-plus-vben5=20into?= =?UTF-8?q?=20dev=20*=20Merge=20branch=20'main'=20of=20https://gitee.com/d?= =?UTF-8?q?apppp/ruoyi-plus-vben5=20into=20dev=20*=20Merge=20branch=20'mai?= =?UTF-8?q?n'=20of=20https://gitee.com/dapppp/ruoyi-plus-vben5=20into=20de?= =?UTF-8?q?v=20*=20chore:=20version=20*=20chore:=20=E9=94=81=E5=AE=9Avxe-t?= =?UTF-8?q?able=E7=89=88=E6=9C=AC=204.9.8=E7=89=88=E6=9C=AC=E5=AD=98?= =?UTF-8?q?=E5=9C=A8=E6=A0=B7=E5=BC=8F=E9=97=AE=E9=A2=98=20*=20chore:=20?= =?UTF-8?q?=E6=9A=82=E6=97=B6=E9=94=81=E5=AE=9Acspell=E7=89=88=E6=9C=AC=20?= =?UTF-8?q?*=20refactor:=20=E7=94=B1=E4=BA=8E=E4=B8=8D=E8=83=BD=E8=BE=93?= =?UTF-8?q?=E5=85=A5=20=E9=9C=80=E8=A6=81=E4=BD=BF=E7=94=A8watch=E7=9B=91?= =?UTF-8?q?=E5=90=AC=20*=20chore:=20https://gitee.com/dapppp/ruoyi-plus-vb?= =?UTF-8?q?en5/issues/IB7ANL=20*=20chore:=20=E7=A7=BB=E9=99=A4=E5=86=97?= =?UTF-8?q?=E4=BD=99=E4=BB=A3=E7=A0=81=20*=20chore:=20=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E5=8D=B8=E8=BD=BD=E6=97=B6=E7=A7=BB=E9=99=A4emitter=20*=20fix:?= =?UTF-8?q?=20the=20route=20path=20did=20not=20synchronize=20with=20the=20?= =?UTF-8?q?page=20(#4947)=20*=20style:=20typo=20(#4948)=20*=20chore:=20?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E4=B8=BAcommonDownloadExcel=20*=20fix:=20?= =?UTF-8?q?=E5=B7=A6=E8=BE=B9=E9=83=A8=E9=97=A8=E6=A0=91=E9=94=99=E8=AF=AF?= =?UTF-8?q?emit=E5=AF=BC=E8=87=B4=E4=BC=9A=E8=B0=83=E7=94=A8=E4=B8=A4?= =?UTF-8?q?=E6=AC=A1=E5=88=97=E8=A1=A8api=20*=20chore:=20label=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F=20*=20chore:=20=E6=94=B9=E4=B8=BATextarea=20*=20chore?= =?UTF-8?q?:=20=E6=BB=9A=E5=8A=A8=E6=9D=A1=E5=AE=BD=E5=BA=A6=20*=20chore:?= =?UTF-8?q?=20=E5=AE=A1=E6=89=B9=E6=A0=B7=E5=BC=8F=20*=20chore:=20?= =?UTF-8?q?=E9=83=A8=E9=97=A8=E5=8F=8A=E4=BB=A5=E4=B8=8B=E6=88=96=E6=9C=AC?= =?UTF-8?q?=E4=BA=BA=E6=95=B0=E6=8D=AE=E6=9D=83=E9=99=90=20*=20Merge=20bra?= =?UTF-8?q?nch=20'main'=20of=20https://gitee.com/dapppp/ruoyi-plus-vben5?= =?UTF-8?q?=20into=20dev=20*=20chore:=20=E4=B8=AA=E4=BA=BA=E4=B8=AD?= =?UTF-8?q?=E5=BF=83=E5=BC=BA=E9=80=80=E8=AE=BE=E5=A4=87=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/deploy.yml | 17 + .github/workflows/rerun.yml | 19 + .lintstagedrc.mjs | 14 +- .vscode/launch.json | 8 +- CHANGELOG.md | 30 +- README.zh-CN.md | 20 +- apps/backend-mock/api/table/list.ts | 29 +- apps/backend-mock/utils/mock-data.ts | 5 +- apps/web-antd/package.json | 2 +- apps/web-antd/src/adapter/component/index.ts | 3 +- apps/web-antd/src/adapter/vxe-table.ts | 46 +- apps/web-antd/src/api/common.d.ts | 1 + apps/web-antd/src/api/core/menu.ts | 2 +- apps/web-antd/src/api/core/upload.ts | 19 +- apps/web-antd/src/api/monitor/online/index.ts | 7 +- .../web-antd/src/api/monitor/operlog/index.ts | 18 +- apps/web-antd/src/api/request.ts | 45 +- apps/web-antd/src/api/system/client/index.ts | 40 +- apps/web-antd/src/api/system/config/index.ts | 33 +- .../web-antd/src/api/system/config/model.d.ts | 2 +- apps/web-antd/src/api/system/dept/index.ts | 23 +- .../web-antd/src/api/system/dict/dict-data.ts | 6 +- .../web-antd/src/api/system/dict/dict-type.ts | 7 +- apps/web-antd/src/api/system/menu/index.ts | 30 +- apps/web-antd/src/api/system/menu/model.d.ts | 11 + apps/web-antd/src/api/system/notice/index.ts | 24 +- .../src/api/system/oss-config/index.ts | 4 +- apps/web-antd/src/api/system/oss/index.ts | 30 +- apps/web-antd/src/api/system/post/index.ts | 36 +- apps/web-antd/src/api/system/role/index.ts | 85 ++- apps/web-antd/src/api/system/social/index.ts | 7 +- .../src/api/system/tenant-package/index.ts | 52 +- apps/web-antd/src/api/system/tenant/index.ts | 47 +- .../web-antd/src/api/system/tenant/model.d.ts | 2 +- apps/web-antd/src/api/system/user/index.ts | 8 +- apps/web-antd/src/api/tool/gen/index.ts | 7 +- .../src/api/workflow/category/index.ts | 15 +- .../src/api/workflow/category/model.d.ts | 10 + .../src/api/workflow/definition/index.ts | 155 ++++++ .../src/api/workflow/definition/model.d.ts | 19 + .../src/api/workflow/instance/index.ts | 120 ++++ .../src/api/workflow/instance/model.d.ts | 41 ++ apps/web-antd/src/api/workflow/task/index.ts | 158 ++++++ .../web-antd/src/api/workflow/task/model.d.ts | 74 +++ apps/web-antd/src/bootstrap.ts | 13 + apps/web-antd/src/components/cropper/index.ts | 3 +- .../components/cropper/src/cropper-avatar.vue | 16 +- .../components/cropper/src/cropper-modal.vue | 4 +- .../src/components/cropper/src/cropper.vue | 1 + .../description/src/description.vue | 14 +- .../src/components/description/src/typing.ts | 3 +- .../web-antd/src/components/dict/src/data.tsx | 2 +- .../src/components/dict/src/index.vue | 4 +- apps/web-antd/src/components/table/index.ts | 1 + .../src/components/table/src/options-tag.vue | 21 + .../src/components/tinymce/src/editor.vue | 7 +- .../src/components/tinymce/src/helper.ts | 4 +- apps/web-antd/src/components/tree/index.ts | 1 + .../web-antd/src/components/tree/src/data.tsx | 85 +++ .../src/components/tree/src/helper.tsx | 133 +++++ .../web-antd/src/components/tree/src/hook.tsx | 62 +++ .../components/tree/src/menu-select-table.vue | 412 ++++++++++++++ .../components/tree/src/tree-select-panel.vue | 12 +- .../src/components/upload/src/file-upload.vue | 31 +- .../components/upload/src/image-upload.vue | 93 +++- .../src/components/upload/src/typing.ts | 2 +- .../src/components/upload/src/use-upload.ts | 3 +- apps/web-antd/src/locales/index.ts | 7 +- .../src/locales/langs/en-US/http.json | 7 + .../src/locales/langs/zh-CN/http.json | 7 + apps/web-antd/src/router/access.ts | 4 +- apps/web-antd/src/router/guard.ts | 14 +- apps/web-antd/src/router/routes/core.ts | 10 +- apps/web-antd/src/router/routes/local.ts | 149 ++--- .../src/router/routes/modules/dashboard.ts | 4 +- .../src/router/routes/modules/demos.ts | 30 - .../src/router/routes/modules/vben.ts | 15 +- apps/web-antd/src/store/dict.ts | 62 +-- apps/web-antd/src/store/tenant.ts | 7 +- apps/web-antd/src/utils/dict.ts | 84 +-- apps/web-antd/src/utils/file/download.ts | 40 +- apps/web-antd/src/utils/file/index.ts | 31 ++ apps/web-antd/src/utils/modal.tsx | 3 +- apps/web-antd/src/utils/render.tsx | 34 +- .../views/_core/authentication/code-login.vue | 9 +- .../src/views/_core/authentication/login.vue | 7 +- .../_core/profile/components/account-bind.vue | 9 +- .../profile/components/online-device.vue | 9 +- .../src/views/_core/social-callback/index.vue | 4 +- apps/web-antd/src/views/common.tsx | 18 - .../dashboard/analytics/analytics-trends.vue | 9 +- .../analytics/analytics-visits-data.vue | 9 +- .../analytics/analytics-visits-sales.vue | 9 +- .../analytics/analytics-visits-source.vue | 9 +- .../dashboard/analytics/analytics-visits.vue | 9 +- apps/web-antd/src/views/demo/demo/index.vue | 21 +- apps/web-antd/src/views/demo/tree/index.vue | 8 +- apps/web-antd/src/views/demos/antd/index.vue | 66 --- .../cache/components/command-chart.vue | 13 +- .../monitor/cache/components/memory-chart.vue | 16 +- .../cache/components/redis-description.vue | 11 +- .../src/views/monitor/cache/index.vue | 10 +- .../src/views/monitor/logininfor/data.tsx | 10 +- .../src/views/monitor/logininfor/index.vue | 27 +- .../web-antd/src/views/monitor/online/data.ts | 6 +- .../src/views/monitor/online/index.vue | 42 +- .../src/views/monitor/operlog/data.tsx | 2 +- .../src/views/monitor/operlog/index.vue | 23 +- .../operlog/operation-preview-drawer.vue | 4 +- .../web-antd/src/views/system/client/data.tsx | 8 +- .../src/views/system/client/index.vue | 26 +- apps/web-antd/src/views/system/config/data.ts | 5 +- .../src/views/system/config/index.vue | 22 +- apps/web-antd/src/views/system/dept/data.ts | 3 +- .../src/views/system/dept/dept-drawer.vue | 4 +- apps/web-antd/src/views/system/dept/index.vue | 20 +- .../src/views/system/dict/data/data.ts | 7 +- .../src/views/system/dict/data/index.vue | 25 +- .../system/dict/data/tag-style-picker.vue | 13 +- .../src/views/system/dict/type/data.ts | 3 +- .../src/views/system/dict/type/index.vue | 24 +- apps/web-antd/src/views/system/menu/data.tsx | 3 +- apps/web-antd/src/views/system/menu/index.vue | 23 +- .../src/views/system/menu/menu-drawer.vue | 7 +- apps/web-antd/src/views/system/notice/data.ts | 2 +- .../src/views/system/notice/index.vue | 22 +- .../src/views/system/oss-config/data.tsx | 9 +- .../src/views/system/oss-config/index.vue | 22 +- .../system/oss-config/oss-config-drawer.vue | 14 +- apps/web-antd/src/views/system/oss/data.tsx | 9 +- .../views/system/oss/file-upload-modal.vue | 1 + apps/web-antd/src/views/system/oss/index.vue | 67 ++- apps/web-antd/src/views/system/post/data.ts | 2 +- apps/web-antd/src/views/system/post/index.vue | 22 +- .../src/views/system/role-assign/data.tsx | 3 +- .../src/views/system/role-assign/index.vue | 18 +- .../system/role-assign/role-assign-drawer.vue | 9 +- apps/web-antd/src/views/system/role/data.tsx | 3 +- apps/web-antd/src/views/system/role/index.vue | 31 +- .../src/views/system/role/role-auth-modal.vue | 4 +- .../src/views/system/role/role-drawer.vue | 44 +- .../web-antd/src/views/system/tenant/data.tsx | 3 +- .../src/views/system/tenant/index.vue | 25 +- .../src/views/system/tenantPackage/data.ts | 3 +- .../src/views/system/tenantPackage/index.vue | 23 +- .../tenantPackage/tenant-package-drawer.vue | 85 +-- .../views/system/tenantPackage/tree-item.tsx | 4 +- apps/web-antd/src/views/system/user/data.tsx | 3 +- .../src/views/system/user/dept-tree.vue | 11 +- apps/web-antd/src/views/system/user/index.vue | 28 +- .../src/views/system/user/user-drawer.vue | 15 +- .../src/views/system/user/user-info-modal.vue | 10 +- .../system/user/user-reset-pwd-modal.vue | 6 +- .../src/views/tool/gen/code-preview-modal.vue | 14 +- apps/web-antd/src/views/tool/gen/data.tsx | 3 +- apps/web-antd/src/views/tool/gen/edit-gen.vue | 117 +++- .../tool/gen/edit-steps/basic-setting.vue | 39 +- .../src/views/tool/gen/edit-steps/basic.tsx | 4 +- .../views/tool/gen/edit-steps/gen-config.vue | 88 +-- .../views/tool/gen/edit-steps/gen-success.vue | 25 - .../src/views/tool/gen/edit-steps/index.ts | 1 - apps/web-antd/src/views/tool/gen/index.vue | 12 +- apps/web-antd/src/views/tool/gen/mitt.ts | 15 - .../src/views/tool/gen/table-import-modal.vue | 14 +- .../workflow/category/category-modal.vue | 28 +- .../src/views/workflow/category/data.ts | 21 +- .../src/views/workflow/category/index.vue | 10 +- .../views/workflow/components/apply-modal.vue | 135 +++++ .../workflow/components/approval-card.vue | 82 ++- .../workflow/components/approval-content.vue | 26 + .../workflow/components/approval-modal.vue | 154 ++++++ .../workflow/components/approval-panel.vue | 520 ++++++++++++++++++ .../components/approval-rejection-modal.vue | 131 +++++ .../components/approval-timeline-item.vue | 82 +++ .../workflow/components/approval-timeline.vue | 49 +- .../workflow/components/copy-component.vue | 85 +++ .../workflow/components/flow-designer.vue | 52 ++ .../workflow/components/flow-info-modal.vue | 38 ++ .../components/flow-interfere-modal.vue | 171 ++++++ .../src/views/workflow/components/helper.tsx | 60 ++ .../src/views/workflow/components/index.ts | 28 + .../views/workflow/components/rejection.png | Bin 26804 -> 0 bytes .../workflow/components/user-select-modal.vue | 365 ++++++++++++ .../src/views/workflow/formManage/index.vue | 9 - .../src/views/workflow/leave/api/index.ts | 62 +++ .../src/views/workflow/leave/api/model.d.ts | 107 ++++ .../src/views/workflow/leave/data.tsx | 173 ++++++ .../src/views/workflow/leave/index.vue | 197 ++++++- .../workflow/leave/leave-description.vue | 45 ++ .../src/views/workflow/leave/leave-form.vue | 199 +++++++ .../src/views/workflow/model/index.vue | 9 - .../processDefinition/category-tree.vue | 112 ++++ .../workflow/processDefinition/constant.ts | 36 ++ .../views/workflow/processDefinition/data.tsx | 103 ++++ .../workflow/processDefinition/index.vue | 372 ++++++++++++- .../process-definition-deploy-modal.vue | 73 +++ .../process-definition-modal.vue | 131 +++++ .../views/workflow/processInstance/data.tsx | 91 +++ .../views/workflow/processInstance/index.vue | 234 +++++++- .../instance-invalid-modal.vue | 67 +++ .../instance-variable-modal.vue | 28 + .../views/workflow/task/allTaskWaiting.vue | 356 +++++++++++- .../src/views/workflow/task/myDocument.vue | 255 ++++++++- .../src/views/workflow/task/taskCopyList.vue | 297 +++++++++- .../src/views/workflow/task/taskFinish.vue | 297 +++++++++- .../src/views/workflow/task/taskWaiting.vue | 337 ++++++++---- .../src/views/演示使用自行删除/README.md | 1 + .../src/views/演示使用自行删除/menu/index.vue | 27 + .../views/演示使用自行删除/upload/index.vue | 17 +- .../views/演示使用自行删除/vxe/edit-table.vue | 234 ++++++++ .../src/views/演示使用自行删除/vxe/index.vue | 17 + .../views/演示使用自行删除/wechat/index.vue | 20 +- apps/web-antd/vite.config.mts | 9 - apps/web-ele/.env | 5 - apps/web-ele/.env.analyze | 7 - apps/web-ele/.env.development | 16 - apps/web-ele/.env.production | 19 - apps/web-ele/index.html | 35 -- apps/web-ele/package.json | 53 -- apps/web-ele/postcss.config.mjs | 1 - apps/web-ele/public/favicon.ico | Bin 5430 -> 0 bytes apps/web-ele/src/adapter/component/index.ts | 234 -------- apps/web-ele/src/adapter/form.ts | 39 -- apps/web-ele/src/adapter/vxe-table.ts | 68 --- apps/web-ele/src/api/core/auth.ts | 51 -- apps/web-ele/src/api/core/index.ts | 3 - apps/web-ele/src/api/core/menu.ts | 10 - apps/web-ele/src/api/core/user.ts | 10 - apps/web-ele/src/api/index.ts | 1 - apps/web-ele/src/api/request.ts | 113 ---- apps/web-ele/src/app.vue | 17 - apps/web-ele/src/bootstrap.ts | 51 -- apps/web-ele/src/layouts/auth.vue | 23 - apps/web-ele/src/layouts/basic.vue | 157 ------ apps/web-ele/src/layouts/index.ts | 6 - apps/web-ele/src/locales/README.md | 3 - apps/web-ele/src/locales/index.ts | 100 ---- .../src/locales/langs/en-US/demos.json | 13 - .../web-ele/src/locales/langs/en-US/page.json | 14 - .../src/locales/langs/zh-CN/demos.json | 13 - .../web-ele/src/locales/langs/zh-CN/page.json | 14 - apps/web-ele/src/main.ts | 31 -- apps/web-ele/src/preferences.ts | 13 - apps/web-ele/src/router/access.ts | 42 -- apps/web-ele/src/router/guard.ts | 125 ----- apps/web-ele/src/router/index.ts | 37 -- apps/web-ele/src/router/routes/core.ts | 88 --- apps/web-ele/src/router/routes/index.ts | 37 -- .../src/router/routes/modules/dashboard.ts | 40 -- .../src/router/routes/modules/demos.ts | 38 -- .../web-ele/src/router/routes/modules/vben.ts | 82 --- apps/web-ele/src/store/auth.ts | 116 ---- apps/web-ele/src/store/index.ts | 1 - apps/web-ele/src/views/_core/README.md | 3 - apps/web-ele/src/views/_core/about/index.vue | 9 - .../views/_core/authentication/code-login.vue | 64 --- .../_core/authentication/forget-password.vue | 42 -- .../src/views/_core/authentication/login.vue | 98 ---- .../_core/authentication/qrcode-login.vue | 10 - .../views/_core/authentication/register.vue | 95 ---- .../src/views/_core/fallback/coming-soon.vue | 7 - .../src/views/_core/fallback/forbidden.vue | 9 - .../views/_core/fallback/internal-error.vue | 9 - .../src/views/_core/fallback/not-found.vue | 9 - .../src/views/_core/fallback/offline.vue | 9 - .../dashboard/analytics/analytics-trends.vue | 100 ---- .../analytics/analytics-visits-data.vue | 84 --- .../analytics/analytics-visits-sales.vue | 48 -- .../analytics/analytics-visits-source.vue | 67 --- .../dashboard/analytics/analytics-visits.vue | 57 -- .../src/views/dashboard/analytics/index.vue | 90 --- .../src/views/dashboard/workspace/index.vue | 266 --------- .../web-ele/src/views/demos/element/index.vue | 117 ---- apps/web-ele/src/views/demos/form/basic.vue | 180 ------ apps/web-ele/tailwind.config.mjs | 1 - apps/web-ele/tsconfig.json | 12 - apps/web-ele/tsconfig.node.json | 10 - apps/web-ele/vite.config.mts | 27 - apps/web-naive/.env | 5 - apps/web-naive/.env.analyze | 7 - apps/web-naive/.env.development | 16 - apps/web-naive/.env.production | 19 - apps/web-naive/index.html | 35 -- apps/web-naive/package.json | 49 -- apps/web-naive/postcss.config.mjs | 1 - apps/web-naive/public/favicon.ico | Bin 5430 -> 0 bytes apps/web-naive/src/adapter/component/index.ts | 182 ------ apps/web-naive/src/adapter/form.ts | 45 -- apps/web-naive/src/adapter/naive.ts | 25 - apps/web-naive/src/adapter/vxe-table.ts | 67 --- apps/web-naive/src/api/core/auth.ts | 51 -- apps/web-naive/src/api/core/index.ts | 3 - apps/web-naive/src/api/core/menu.ts | 10 - apps/web-naive/src/api/core/user.ts | 10 - apps/web-naive/src/api/index.ts | 1 - apps/web-naive/src/api/request.ts | 112 ---- apps/web-naive/src/app.vue | 56 -- apps/web-naive/src/bootstrap.ts | 46 -- apps/web-naive/src/layouts/auth.vue | 23 - apps/web-naive/src/layouts/basic.vue | 158 ------ apps/web-naive/src/layouts/index.ts | 6 - apps/web-naive/src/locales/README.md | 3 - apps/web-naive/src/locales/index.ts | 38 -- .../src/locales/langs/en-US/demos.json | 14 - .../src/locales/langs/en-US/page.json | 15 - .../src/locales/langs/zh-CN/demos.json | 14 - .../src/locales/langs/zh-CN/page.json | 15 - apps/web-naive/src/main.ts | 31 -- apps/web-naive/src/preferences.ts | 13 - apps/web-naive/src/router/access.ts | 40 -- apps/web-naive/src/router/guard.ts | 124 ----- apps/web-naive/src/router/index.ts | 37 -- apps/web-naive/src/router/routes/core.ts | 88 --- apps/web-naive/src/router/routes/index.ts | 37 -- .../src/router/routes/modules/dashboard.ts | 40 -- .../src/router/routes/modules/demos.ts | 46 -- .../src/router/routes/modules/vben.ts | 82 --- apps/web-naive/src/store/auth.ts | 116 ---- apps/web-naive/src/store/index.ts | 1 - apps/web-naive/src/views/_core/README.md | 3 - .../web-naive/src/views/_core/about/index.vue | 9 - .../views/_core/authentication/code-login.vue | 64 --- .../_core/authentication/forget-password.vue | 42 -- .../src/views/_core/authentication/login.vue | 98 ---- .../_core/authentication/qrcode-login.vue | 10 - .../views/_core/authentication/register.vue | 95 ---- .../src/views/_core/fallback/coming-soon.vue | 7 - .../src/views/_core/fallback/forbidden.vue | 9 - .../views/_core/fallback/internal-error.vue | 9 - .../src/views/_core/fallback/not-found.vue | 9 - .../src/views/_core/fallback/offline.vue | 9 - .../dashboard/analytics/analytics-trends.vue | 100 ---- .../analytics/analytics-visits-data.vue | 84 --- .../analytics/analytics-visits-sales.vue | 48 -- .../analytics/analytics-visits-source.vue | 67 --- .../dashboard/analytics/analytics-visits.vue | 57 -- .../src/views/dashboard/analytics/index.vue | 90 --- .../src/views/dashboard/workspace/index.vue | 266 --------- apps/web-naive/src/views/demos/form/basic.vue | 143 ----- .../web-naive/src/views/demos/naive/index.vue | 68 --- .../web-naive/src/views/demos/table/index.vue | 38 -- apps/web-naive/tailwind.config.mjs | 1 - apps/web-naive/tsconfig.json | 12 - apps/web-naive/tsconfig.node.json | 10 - apps/web-naive/vite.config.mts | 20 - cspell.json | 3 + docs/.vitepress/components/preview-group.vue | 4 +- docs/.vitepress/config/en.mts | 4 +- docs/.vitepress/config/zh.mts | 8 +- .../theme/components/site-layout.vue | 1 - docs/package.json | 2 +- docs/src/_env/adapter/component.ts | 4 +- docs/src/_env/adapter/form.ts | 2 - .../common-ui/vben-api-component.md | 15 +- docs/src/components/common-ui/vben-drawer.md | 30 +- .../common-ui/vben-ellipsis-text.md | 56 ++ docs/src/components/common-ui/vben-form.md | 49 +- docs/src/components/common-ui/vben-modal.md | 31 +- .../components/common-ui/vben-vxe-table.md | 20 +- docs/src/demos/vben-drawer/dynamic/index.vue | 3 +- .../demos/vben-drawer/shared-data/index.vue | 11 +- .../demos/vben-ellipsis-text/expand/index.vue | 10 + .../demos/vben-ellipsis-text/line/index.vue | 10 + .../vben-ellipsis-text/tooltip/index.vue | 14 + docs/src/demos/vben-modal/dynamic/index.vue | 3 +- .../demos/vben-modal/shared-data/index.vue | 11 +- docs/src/demos/vben-vxe-table/form/index.vue | 5 + docs/src/en/guide/essentials/route.md | 3 - docs/src/en/guide/essentials/settings.md | 1 + docs/src/guide/essentials/route.md | 18 +- docs/src/guide/essentials/settings.md | 1 + docs/src/guide/in-depth/ui-framework.md | 2 +- docs/src/guide/introduction/quick-start.md | 2 +- .../commitlint-config/package.json | 2 +- .../eslint-config/src/configs/import.ts | 1 + .../eslint-config/src/configs/javascript.ts | 1 - .../src/configs/perfectionist.ts | 61 +- .../eslint-config/src/configs/vue.ts | 1 - .../stylelint-config/package.json | 2 +- internal/node-utils/package.json | 2 +- internal/node-utils/src/spinner.ts | 4 +- internal/tailwind-config/package.json | 2 +- internal/tsconfig/package.json | 2 +- internal/vite-config/package.json | 2 +- .../vite-config/src/config/application.ts | 4 +- .../src/plugins/inject-app-loading/index.ts | 4 +- internal/vite-config/src/utils/env.ts | 1 - package.json | 9 +- packages/@core/base/design/package.json | 2 +- packages/@core/base/design/src/css/ui.css | 4 + .../base/design/src/design-tokens/dark.css | 6 +- .../base/design/src/design-tokens/default.css | 2 + packages/@core/base/icons/package.json | 2 +- packages/@core/base/icons/src/lucide.ts | 1 + packages/@core/base/shared/package.json | 4 +- .../base/shared/src/constants/dict-enum.ts | 1 + packages/@core/base/shared/src/utils/cn.ts | 4 +- .../@core/base/shared/src/utils/download.ts | 1 + packages/@core/base/typings/package.json | 2 +- packages/@core/base/typings/src/app.d.ts | 4 + packages/@core/base/typings/src/helper.d.ts | 5 +- .../@core/base/typings/src/menu-record.ts | 3 +- .../@core/base/typings/src/vue-router.d.ts | 14 +- packages/@core/composables/package.json | 2 +- .../@core/composables/src/use-layout-style.ts | 9 +- .../composables/src/use-priority-value.ts | 2 +- .../src/use-simple-locale/index.ts | 5 +- .../__snapshots__/config.test.ts.snap | 6 +- packages/@core/preferences/package.json | 2 +- packages/@core/preferences/src/config.ts | 8 +- packages/@core/preferences/src/preferences.ts | 4 +- packages/@core/preferences/src/types.ts | 9 + .../@core/preferences/src/use-preferences.ts | 27 +- packages/@core/ui-kit/form-ui/package.json | 2 +- .../form-ui/src/components/form-actions.vue | 61 +- packages/@core/ui-kit/form-ui/src/config.ts | 15 +- packages/@core/ui-kit/form-ui/src/form-api.ts | 151 +++-- .../form-ui/src/form-render/form-field.vue | 31 +- .../ui-kit/form-ui/src/form-render/form.vue | 17 +- packages/@core/ui-kit/form-ui/src/types.ts | 51 +- .../ui-kit/form-ui/src/use-form-context.ts | 14 +- .../ui-kit/form-ui/src/vben-use-form.vue | 37 +- packages/@core/ui-kit/layout-ui/package.json | 2 +- .../src/components/layout-content.vue | 3 +- .../src/components/layout-footer.vue | 1 + .../src/components/layout-header.vue | 1 + .../src/components/layout-sidebar.vue | 5 +- .../src/components/layout-tabbar.vue | 1 + .../ui-kit/layout-ui/src/hooks/use-layout.ts | 14 +- .../ui-kit/layout-ui/src/vben-layout.vue | 30 +- packages/@core/ui-kit/menu-ui/package.json | 2 +- .../ui-kit/menu-ui/src/components/menu.vue | 10 +- packages/@core/ui-kit/menu-ui/src/index.ts | 1 + packages/@core/ui-kit/menu-ui/src/types.ts | 1 - .../@core/ui-kit/menu-ui/src/utils/index.ts | 1 + .../src/drawer/__tests__/drawer-api.test.ts | 22 +- .../ui-kit/popup-ui/src/drawer/drawer-api.ts | 50 +- .../ui-kit/popup-ui/src/drawer/drawer.ts | 38 +- .../ui-kit/popup-ui/src/drawer/drawer.vue | 36 +- .../@core/ui-kit/popup-ui/src/drawer/index.ts | 2 +- .../ui-kit/popup-ui/src/drawer/use-drawer.ts | 40 +- .../src/modal/__tests__/modal-api.test.ts | 11 - .../@core/ui-kit/popup-ui/src/modal/index.ts | 2 +- .../ui-kit/popup-ui/src/modal/modal-api.ts | 41 +- .../@core/ui-kit/popup-ui/src/modal/modal.ts | 24 +- .../@core/ui-kit/popup-ui/src/modal/modal.vue | 30 +- .../popup-ui/src/modal/use-modal-draggable.ts | 2 +- .../ui-kit/popup-ui/src/modal/use-modal.ts | 36 +- packages/@core/ui-kit/shadcn-ui/package.json | 2 +- .../src/components/avatar/avatar.vue | 2 +- .../src/components/back-top/back-top.vue | 2 +- .../src/components/breadcrumb/types.ts | 1 - .../shadcn-ui/src/components/button/button.ts | 3 +- .../components/context-menu/context-menu.vue | 9 +- .../src/components/hover-card/hover-card.vue | 5 +- .../shadcn-ui/src/components/icon/icon.vue | 3 +- .../src/components/pin-input/input.vue | 4 + .../src/components/popover/popover.vue | 5 +- .../render-content/render-content.vue | 2 +- .../components/segmented/tabs-indicator.vue | 4 +- .../src/components/select/select.vue | 6 + .../src/components/spinner/spinner.vue | 11 + .../src/components/tooltip/tooltip.vue | 1 - .../shadcn-ui/src/ui/accordion/Accordion.vue | 9 +- .../src/ui/accordion/AccordionContent.vue | 6 +- .../src/ui/accordion/AccordionItem.vue | 10 +- .../src/ui/accordion/AccordionTrigger.vue | 10 +- .../ui-kit/shadcn-ui/src/ui/avatar/Avatar.vue | 5 +- .../src/ui/avatar/AvatarFallback.vue | 4 +- .../shadcn-ui/src/ui/avatar/AvatarImage.vue | 4 +- .../ui-kit/shadcn-ui/src/ui/avatar/avatar.ts | 4 +- .../ui-kit/shadcn-ui/src/ui/badge/Badge.vue | 4 +- .../ui-kit/shadcn-ui/src/ui/badge/badge.ts | 4 +- .../src/ui/breadcrumb/BreadcrumbLink.vue | 5 +- .../ui-kit/shadcn-ui/src/ui/button/Button.vue | 5 +- .../ui-kit/shadcn-ui/src/ui/button/button.ts | 4 +- .../shadcn-ui/src/ui/checkbox/Checkbox.vue | 4 +- .../context-menu/ContextMenuCheckboxItem.vue | 9 +- .../ui/context-menu/ContextMenuContent.vue | 11 +- .../src/ui/context-menu/ContextMenuGroup.vue | 4 +- .../src/ui/context-menu/ContextMenuItem.vue | 11 +- .../src/ui/context-menu/ContextMenuLabel.vue | 6 +- .../src/ui/context-menu/ContextMenuPortal.vue | 4 +- .../ui/context-menu/ContextMenuRadioGroup.vue | 10 +- .../ui/context-menu/ContextMenuRadioItem.vue | 9 +- .../ui/context-menu/ContextMenuSeparator.vue | 9 +- .../src/ui/context-menu/ContextMenuSub.vue | 9 +- .../ui/context-menu/ContextMenuSubContent.vue | 14 +- .../ui/context-menu/ContextMenuSubTrigger.vue | 10 +- .../ui/context-menu/ContextMenuTrigger.vue | 8 +- .../ui-kit/shadcn-ui/src/ui/dialog/Dialog.vue | 9 +- .../shadcn-ui/src/ui/dialog/DialogClose.vue | 4 +- .../shadcn-ui/src/ui/dialog/DialogContent.vue | 24 +- .../src/ui/dialog/DialogDescription.vue | 10 +- .../shadcn-ui/src/ui/dialog/DialogOverlay.vue | 2 +- .../src/ui/dialog/DialogScrollContent.vue | 6 +- .../shadcn-ui/src/ui/dialog/DialogTitle.vue | 6 +- .../shadcn-ui/src/ui/dialog/DialogTrigger.vue | 4 +- .../src/ui/dropdown-menu/DropdownMenu.vue | 9 +- .../DropdownMenuCheckboxItem.vue | 9 +- .../ui/dropdown-menu/DropdownMenuContent.vue | 11 +- .../ui/dropdown-menu/DropdownMenuGroup.vue | 4 +- .../src/ui/dropdown-menu/DropdownMenuItem.vue | 10 +- .../ui/dropdown-menu/DropdownMenuLabel.vue | 10 +- .../dropdown-menu/DropdownMenuRadioGroup.vue | 10 +- .../dropdown-menu/DropdownMenuRadioItem.vue | 9 +- .../dropdown-menu/DropdownMenuSeparator.vue | 9 +- .../src/ui/dropdown-menu/DropdownMenuSub.vue | 9 +- .../dropdown-menu/DropdownMenuSubContent.vue | 14 +- .../dropdown-menu/DropdownMenuSubTrigger.vue | 10 +- .../ui/dropdown-menu/DropdownMenuTrigger.vue | 8 +- .../shadcn-ui/src/ui/hover-card/HoverCard.vue | 9 +- .../src/ui/hover-card/HoverCardContent.vue | 13 +- .../src/ui/hover-card/HoverCardTrigger.vue | 4 +- .../@core/ui-kit/shadcn-ui/src/ui/index.ts | 1 + .../ui-kit/shadcn-ui/src/ui/label/Label.vue | 6 +- .../src/ui/number-field/NumberField.vue | 4 +- .../ui/number-field/NumberFieldDecrement.vue | 4 +- .../ui/number-field/NumberFieldIncrement.vue | 4 +- .../src/ui/pagination/PaginationEllipsis.vue | 6 +- .../src/ui/pagination/PaginationFirst.vue | 6 +- .../src/ui/pagination/PaginationLast.vue | 6 +- .../src/ui/pagination/PaginationNext.vue | 6 +- .../src/ui/pagination/PaginationPrev.vue | 6 +- .../shadcn-ui/src/ui/pin-input/PinInput.vue | 11 +- .../src/ui/pin-input/PinInputGroup.vue | 6 +- .../src/ui/pin-input/PinInputInput.vue | 12 +- .../src/ui/pin-input/PinInputSeparator.vue | 4 +- .../src/ui/popover/PopoverContent.vue | 12 +- .../src/ui/popover/PopoverTrigger.vue | 4 +- .../src/ui/radio-group/RadioGroup.vue | 11 +- .../src/ui/radio-group/RadioGroupItem.vue | 5 +- .../src/ui/resizable/ResizableHandle.vue | 47 ++ .../src/ui/resizable/ResizablePanelGroup.vue | 34 ++ .../shadcn-ui/src/ui/resizable/index.ts | 3 + .../src/ui/scroll-area/ScrollArea.vue | 7 +- .../src/ui/scroll-area/ScrollBar.vue | 10 +- .../shadcn-ui/src/ui/select/SelectContent.vue | 8 +- .../shadcn-ui/src/ui/select/SelectGroup.vue | 6 +- .../shadcn-ui/src/ui/select/SelectItem.vue | 5 +- .../src/ui/select/SelectItemText.vue | 4 +- .../shadcn-ui/src/ui/select/SelectLabel.vue | 5 +- .../src/ui/select/SelectScrollDownButton.vue | 10 +- .../src/ui/select/SelectScrollUpButton.vue | 10 +- .../src/ui/select/SelectSeparator.vue | 6 +- .../shadcn-ui/src/ui/select/SelectTrigger.vue | 11 +- .../shadcn-ui/src/ui/select/SelectValue.vue | 4 +- .../shadcn-ui/src/ui/separator/Separator.vue | 6 +- .../ui-kit/shadcn-ui/src/ui/sheet/Sheet.vue | 9 +- .../shadcn-ui/src/ui/sheet/SheetClose.vue | 4 +- .../shadcn-ui/src/ui/sheet/SheetContent.vue | 52 +- .../src/ui/sheet/SheetDescription.vue | 6 +- .../shadcn-ui/src/ui/sheet/SheetOverlay.vue | 2 +- .../shadcn-ui/src/ui/sheet/SheetTitle.vue | 6 +- .../shadcn-ui/src/ui/sheet/SheetTrigger.vue | 4 +- .../ui-kit/shadcn-ui/src/ui/sheet/sheet.ts | 4 +- .../ui-kit/shadcn-ui/src/ui/switch/Switch.vue | 12 +- .../shadcn-ui/src/ui/tabs/TabsContent.vue | 6 +- .../ui-kit/shadcn-ui/src/ui/tabs/TabsList.vue | 6 +- .../shadcn-ui/src/ui/tabs/TabsTrigger.vue | 6 +- .../src/ui/toggle-group/ToggleGroup.vue | 12 +- .../src/ui/toggle-group/ToggleGroupItem.vue | 11 +- .../ui-kit/shadcn-ui/src/ui/toggle/Toggle.vue | 15 +- .../ui-kit/shadcn-ui/src/ui/toggle/toggle.ts | 4 +- .../shadcn-ui/src/ui/tooltip/Tooltip.vue | 9 +- .../src/ui/tooltip/TooltipContent.vue | 14 +- .../src/ui/tooltip/TooltipProvider.vue | 4 +- .../src/ui/tooltip/TooltipTrigger.vue | 4 +- packages/@core/ui-kit/tabs-ui/package.json | 2 +- .../src/components/tabs-chrome/tabs.vue | 15 + .../tabs-ui/src/components/tabs/tabs.vue | 15 + .../@core/ui-kit/tabs-ui/src/tabs-view.vue | 11 + packages/@core/ui-kit/tabs-ui/src/types.ts | 9 + .../@core/ui-kit/tabs-ui/src/use-tabs-drag.ts | 8 +- .../tabs-ui/src/use-tabs-view-scroll.ts | 8 + packages/constants/package.json | 2 +- packages/effects/access/package.json | 2 +- packages/effects/access/src/accessible.ts | 21 +- packages/effects/common-ui/package.json | 6 +- .../api-component/api-component.vue | 33 +- .../point-selection-captcha-card.vue | 3 +- .../captcha/slider-captcha/index.vue | 4 +- .../slider-captcha/slider-captcha-action.vue | 2 +- .../slider-captcha/slider-captcha-bar.vue | 4 +- .../slider-captcha/slider-captcha-content.vue | 2 +- .../common-ui/src/components/captcha/types.ts | 1 - .../src/components/col-page/col-page.vue | 107 ++++ .../src/components/col-page/index.ts | 2 + .../src/components/col-page/types.ts | 26 + .../ellipsis-text/ellipsis-text.vue | 3 +- .../components/icon-picker/icon-picker.vue | 4 +- .../effects/common-ui/src/components/index.ts | 2 + .../common-ui/src/components/page/index.ts | 1 + .../common-ui/src/components/page/page.vue | 28 +- .../common-ui/src/components/page/types.ts | 11 + .../src/components/tippy/directive.ts | 100 ++++ .../common-ui/src/components/tippy/index.ts | 67 +++ packages/effects/common-ui/src/index.ts | 1 + .../effects/common-ui/src/ui/about/about.vue | 3 +- .../src/ui/authentication/code-login.vue | 5 +- .../src/ui/authentication/forget-password.vue | 5 +- .../ui/authentication/login-expired-modal.vue | 27 +- .../common-ui/src/ui/authentication/login.vue | 5 +- .../src/ui/authentication/qrcode-login.vue | 6 +- .../src/ui/authentication/register.vue | 5 +- .../dashboard/workbench/workbench-project.vue | 2 +- .../workbench/workbench-quick-nav.vue | 2 +- .../common-ui/src/ui/fallback/fallback.vue | 5 +- packages/effects/hooks/package.json | 3 +- packages/effects/hooks/src/index.ts | 1 + .../effects/hooks/src/use-design-tokens.ts | 1 + .../effects/hooks/src/use-hover-toggle.ts | 61 ++ packages/effects/hooks/src/use-pagination.ts | 1 + packages/effects/hooks/src/use-tabs.ts | 3 +- packages/effects/layouts/package.json | 2 +- .../layouts/src/basic/content/content.vue | 5 +- .../layouts/src/basic/header/header.vue | 21 +- packages/effects/layouts/src/basic/layout.vue | 48 +- .../layouts/src/basic/menu/extra-menu.vue | 3 +- .../effects/layouts/src/basic/menu/menu.vue | 6 + .../layouts/src/basic/menu/mixed-menu.vue | 5 +- .../layouts/src/basic/menu/use-extra-menu.ts | 64 ++- .../layouts/src/basic/menu/use-mixed-menu.ts | 42 +- .../layouts/src/basic/menu/use-navigation.ts | 3 +- .../layouts/src/basic/tabbar/tabbar.vue | 3 + .../layouts/src/basic/tabbar/use-tabbar.ts | 5 +- .../layouts/src/iframe/iframe-router-view.vue | 5 +- .../layouts/src/widgets/breadcrumb.vue | 5 +- .../widgets/check-updates/check-updates.vue | 3 +- .../widgets/global-search/global-search.vue | 4 +- .../widgets/global-search/search-panel.vue | 6 +- .../layouts/src/widgets/layout-toggle.vue | 3 +- .../widgets/lock-screen/lock-screen-modal.vue | 3 +- .../src/widgets/lock-screen/lock-screen.vue | 4 +- .../src/widgets/notification/notification.vue | 1 - .../widgets/preferences/blocks/input-item.vue | 3 +- .../preferences/blocks/layout/content.vue | 3 +- .../preferences/blocks/layout/header.vue | 31 +- .../preferences/blocks/layout/layout.vue | 18 +- .../preferences/blocks/layout/sidebar.vue | 28 +- .../preferences/blocks/layout/tabbar.vue | 14 + .../preferences/blocks/number-field-item.vue | 3 +- .../preferences/blocks/select-item.vue | 3 +- .../preferences/blocks/switch-item.vue | 16 +- .../preferences/blocks/theme/builtin.vue | 29 +- .../preferences/blocks/theme/theme.vue | 1 - .../preferences/icons/header-mixed-nav.vue | 202 +++++++ .../preferences/icons/header-sidebar-nav.vue | 177 ++++++ .../src/widgets/preferences/icons/index.ts | 2 + .../preferences/preferences-drawer.vue | 23 +- .../src/widgets/preferences/preferences.vue | 3 +- .../widgets/user-dropdown/user-dropdown.vue | 153 +++--- packages/effects/plugins/package.json | 2 +- .../plugins/src/echarts/use-echarts.ts | 18 +- packages/effects/plugins/src/vxe-table/api.ts | 15 +- .../effects/plugins/src/vxe-table/index.ts | 8 +- .../effects/plugins/src/vxe-table/init.ts | 5 +- .../effects/plugins/src/vxe-table/types.ts | 20 +- .../plugins/src/vxe-table/use-vxe-grid.vue | 88 ++- packages/effects/request/package.json | 2 +- .../src/request-client/request-client.test.ts | 23 + .../src/request-client/request-client.ts | 55 +- .../request/src/request-client/types.ts | 28 +- packages/icons/package.json | 2 +- .../icons/src/iconify-offline/menu-icons.ts | 8 +- packages/locales/package.json | 2 +- packages/locales/src/i18n.ts | 6 +- .../src/langs/en-US/authentication.json | 2 +- packages/locales/src/langs/en-US/common.json | 3 +- .../locales/src/langs/en-US/preferences.json | 19 +- .../src/langs/zh-CN/authentication.json | 2 +- packages/locales/src/langs/zh-CN/common.json | 3 +- .../locales/src/langs/zh-CN/preferences.json | 21 +- packages/preferences/package.json | 2 +- packages/stores/package.json | 2 +- packages/stores/src/modules/access.ts | 19 + packages/stores/src/modules/tabbar.ts | 4 +- packages/styles/package.json | 5 +- packages/styles/src/antd/index.css | 15 +- packages/styles/src/ele/index.css | 41 ++ packages/styles/src/naive/index.css | 20 + packages/types/package.json | 2 +- packages/utils/package.json | 2 +- .../utils/src/helpers/find-menu-by-path.ts | 4 +- playground/package.json | 3 +- playground/src/adapter/component/index.ts | 4 +- playground/src/api/request.ts | 23 +- playground/src/bootstrap.ts | 13 + playground/src/layouts/basic.vue | 1 + playground/src/locales/index.ts | 4 +- .../src/locales/langs/en-US/examples.json | 6 + playground/src/locales/langs/en-US/page.json | 4 +- .../src/locales/langs/zh-CN/examples.json | 3 + playground/src/locales/langs/zh-CN/page.json | 4 +- playground/src/router/guard.ts | 14 +- playground/src/router/routes/core.ts | 10 +- .../src/router/routes/modules/dashboard.ts | 4 +- playground/src/router/routes/modules/demos.ts | 3 +- .../src/router/routes/modules/examples.ts | 22 +- playground/src/router/routes/modules/vben.ts | 24 +- .../views/_core/authentication/code-login.vue | 50 +- .../dashboard/analytics/analytics-trends.vue | 9 +- .../analytics/analytics-visits-data.vue | 9 +- .../analytics/analytics-visits-sales.vue | 9 +- .../analytics/analytics-visits-source.vue | 9 +- .../dashboard/analytics/analytics-visits.vue | 9 +- playground/src/views/demos/badge/index.vue | 110 +++- .../features/vue-query/paginated-queries.vue | 5 +- playground/src/views/examples/doc-button.vue | 8 +- .../src/views/examples/drawer/base-demo.vue | 3 + .../src/views/examples/drawer/index.vue | 50 +- .../src/views/examples/ellipsis/index.vue | 5 + playground/src/views/examples/form/basic.vue | 64 ++- playground/src/views/examples/form/custom.vue | 31 +- .../examples/form/modules/two-fields.vue | 42 ++ .../src/views/examples/layout/col-page.vue | 106 ++++ .../src/views/examples/modal/blur-demo.vue | 23 + .../views/examples/modal/form-modal-demo.vue | 21 +- playground/src/views/examples/modal/index.vue | 147 +++-- .../src/views/examples/modal/nested-demo.vue | 24 + playground/src/views/examples/tippy/index.vue | 303 ++++++++++ .../views/examples/vxe-table/custom-cell.vue | 1 + .../src/views/examples/vxe-table/form.vue | 25 +- .../src/views/examples/vxe-table/remote.vue | 19 +- pnpm-workspace.yaml | 122 ++-- scripts/turbo-run/package.json | 2 +- scripts/vsh/package.json | 2 +- scripts/vsh/src/publint/index.ts | 1 - vben-admin.code-workspace | 8 - 729 files changed, 12839 insertions(+), 9132 deletions(-) create mode 100644 .github/workflows/rerun.yml create mode 100644 apps/web-antd/src/api/workflow/definition/index.ts create mode 100644 apps/web-antd/src/api/workflow/definition/model.d.ts create mode 100644 apps/web-antd/src/api/workflow/instance/index.ts create mode 100644 apps/web-antd/src/api/workflow/instance/model.d.ts create mode 100644 apps/web-antd/src/api/workflow/task/index.ts create mode 100644 apps/web-antd/src/api/workflow/task/model.d.ts create mode 100644 apps/web-antd/src/components/table/src/options-tag.vue create mode 100644 apps/web-antd/src/components/tree/src/data.tsx create mode 100644 apps/web-antd/src/components/tree/src/helper.tsx create mode 100644 apps/web-antd/src/components/tree/src/hook.tsx create mode 100644 apps/web-antd/src/components/tree/src/menu-select-table.vue create mode 100644 apps/web-antd/src/locales/langs/en-US/http.json create mode 100644 apps/web-antd/src/locales/langs/zh-CN/http.json delete mode 100644 apps/web-antd/src/router/routes/modules/demos.ts create mode 100644 apps/web-antd/src/utils/file/index.ts delete mode 100644 apps/web-antd/src/views/common.tsx delete mode 100644 apps/web-antd/src/views/demos/antd/index.vue delete mode 100644 apps/web-antd/src/views/tool/gen/edit-steps/gen-success.vue delete mode 100644 apps/web-antd/src/views/tool/gen/mitt.ts create mode 100644 apps/web-antd/src/views/workflow/components/apply-modal.vue create mode 100644 apps/web-antd/src/views/workflow/components/approval-content.vue create mode 100644 apps/web-antd/src/views/workflow/components/approval-modal.vue create mode 100644 apps/web-antd/src/views/workflow/components/approval-panel.vue create mode 100644 apps/web-antd/src/views/workflow/components/approval-rejection-modal.vue create mode 100644 apps/web-antd/src/views/workflow/components/approval-timeline-item.vue create mode 100644 apps/web-antd/src/views/workflow/components/copy-component.vue create mode 100644 apps/web-antd/src/views/workflow/components/flow-designer.vue create mode 100644 apps/web-antd/src/views/workflow/components/flow-info-modal.vue create mode 100644 apps/web-antd/src/views/workflow/components/flow-interfere-modal.vue create mode 100644 apps/web-antd/src/views/workflow/components/helper.tsx delete mode 100644 apps/web-antd/src/views/workflow/components/rejection.png create mode 100644 apps/web-antd/src/views/workflow/components/user-select-modal.vue delete mode 100644 apps/web-antd/src/views/workflow/formManage/index.vue create mode 100644 apps/web-antd/src/views/workflow/leave/api/index.ts create mode 100644 apps/web-antd/src/views/workflow/leave/api/model.d.ts create mode 100644 apps/web-antd/src/views/workflow/leave/data.tsx create mode 100644 apps/web-antd/src/views/workflow/leave/leave-description.vue create mode 100644 apps/web-antd/src/views/workflow/leave/leave-form.vue delete mode 100644 apps/web-antd/src/views/workflow/model/index.vue create mode 100644 apps/web-antd/src/views/workflow/processDefinition/category-tree.vue create mode 100644 apps/web-antd/src/views/workflow/processDefinition/constant.ts create mode 100644 apps/web-antd/src/views/workflow/processDefinition/data.tsx create mode 100644 apps/web-antd/src/views/workflow/processDefinition/process-definition-deploy-modal.vue create mode 100644 apps/web-antd/src/views/workflow/processDefinition/process-definition-modal.vue create mode 100644 apps/web-antd/src/views/workflow/processInstance/data.tsx create mode 100644 apps/web-antd/src/views/workflow/processInstance/instance-invalid-modal.vue create mode 100644 apps/web-antd/src/views/workflow/processInstance/instance-variable-modal.vue create mode 100644 apps/web-antd/src/views/演示使用自行删除/README.md create mode 100644 apps/web-antd/src/views/演示使用自行删除/menu/index.vue create mode 100644 apps/web-antd/src/views/演示使用自行删除/vxe/edit-table.vue create mode 100644 apps/web-antd/src/views/演示使用自行删除/vxe/index.vue delete mode 100644 apps/web-ele/.env delete mode 100644 apps/web-ele/.env.analyze delete mode 100644 apps/web-ele/.env.development delete mode 100644 apps/web-ele/.env.production delete mode 100644 apps/web-ele/index.html delete mode 100644 apps/web-ele/package.json delete mode 100644 apps/web-ele/postcss.config.mjs delete mode 100644 apps/web-ele/public/favicon.ico delete mode 100644 apps/web-ele/src/adapter/component/index.ts delete mode 100644 apps/web-ele/src/adapter/form.ts delete mode 100644 apps/web-ele/src/adapter/vxe-table.ts delete mode 100644 apps/web-ele/src/api/core/auth.ts delete mode 100644 apps/web-ele/src/api/core/index.ts delete mode 100644 apps/web-ele/src/api/core/menu.ts delete mode 100644 apps/web-ele/src/api/core/user.ts delete mode 100644 apps/web-ele/src/api/index.ts delete mode 100644 apps/web-ele/src/api/request.ts delete mode 100644 apps/web-ele/src/app.vue delete mode 100644 apps/web-ele/src/bootstrap.ts delete mode 100644 apps/web-ele/src/layouts/auth.vue delete mode 100644 apps/web-ele/src/layouts/basic.vue delete mode 100644 apps/web-ele/src/layouts/index.ts delete mode 100644 apps/web-ele/src/locales/README.md delete mode 100644 apps/web-ele/src/locales/index.ts delete mode 100644 apps/web-ele/src/locales/langs/en-US/demos.json delete mode 100644 apps/web-ele/src/locales/langs/en-US/page.json delete mode 100644 apps/web-ele/src/locales/langs/zh-CN/demos.json delete mode 100644 apps/web-ele/src/locales/langs/zh-CN/page.json delete mode 100644 apps/web-ele/src/main.ts delete mode 100644 apps/web-ele/src/preferences.ts delete mode 100644 apps/web-ele/src/router/access.ts delete mode 100644 apps/web-ele/src/router/guard.ts delete mode 100644 apps/web-ele/src/router/index.ts delete mode 100644 apps/web-ele/src/router/routes/core.ts delete mode 100644 apps/web-ele/src/router/routes/index.ts delete mode 100644 apps/web-ele/src/router/routes/modules/dashboard.ts delete mode 100644 apps/web-ele/src/router/routes/modules/demos.ts delete mode 100644 apps/web-ele/src/router/routes/modules/vben.ts delete mode 100644 apps/web-ele/src/store/auth.ts delete mode 100644 apps/web-ele/src/store/index.ts delete mode 100644 apps/web-ele/src/views/_core/README.md delete mode 100644 apps/web-ele/src/views/_core/about/index.vue delete mode 100644 apps/web-ele/src/views/_core/authentication/code-login.vue delete mode 100644 apps/web-ele/src/views/_core/authentication/forget-password.vue delete mode 100644 apps/web-ele/src/views/_core/authentication/login.vue delete mode 100644 apps/web-ele/src/views/_core/authentication/qrcode-login.vue delete mode 100644 apps/web-ele/src/views/_core/authentication/register.vue delete mode 100644 apps/web-ele/src/views/_core/fallback/coming-soon.vue delete mode 100644 apps/web-ele/src/views/_core/fallback/forbidden.vue delete mode 100644 apps/web-ele/src/views/_core/fallback/internal-error.vue delete mode 100644 apps/web-ele/src/views/_core/fallback/not-found.vue delete mode 100644 apps/web-ele/src/views/_core/fallback/offline.vue delete mode 100644 apps/web-ele/src/views/dashboard/analytics/analytics-trends.vue delete mode 100644 apps/web-ele/src/views/dashboard/analytics/analytics-visits-data.vue delete mode 100644 apps/web-ele/src/views/dashboard/analytics/analytics-visits-sales.vue delete mode 100644 apps/web-ele/src/views/dashboard/analytics/analytics-visits-source.vue delete mode 100644 apps/web-ele/src/views/dashboard/analytics/analytics-visits.vue delete mode 100644 apps/web-ele/src/views/dashboard/analytics/index.vue delete mode 100644 apps/web-ele/src/views/dashboard/workspace/index.vue delete mode 100644 apps/web-ele/src/views/demos/element/index.vue delete mode 100644 apps/web-ele/src/views/demos/form/basic.vue delete mode 100644 apps/web-ele/tailwind.config.mjs delete mode 100644 apps/web-ele/tsconfig.json delete mode 100644 apps/web-ele/tsconfig.node.json delete mode 100644 apps/web-ele/vite.config.mts delete mode 100644 apps/web-naive/.env delete mode 100644 apps/web-naive/.env.analyze delete mode 100644 apps/web-naive/.env.development delete mode 100644 apps/web-naive/.env.production delete mode 100644 apps/web-naive/index.html delete mode 100644 apps/web-naive/package.json delete mode 100644 apps/web-naive/postcss.config.mjs delete mode 100644 apps/web-naive/public/favicon.ico delete mode 100644 apps/web-naive/src/adapter/component/index.ts delete mode 100644 apps/web-naive/src/adapter/form.ts delete mode 100644 apps/web-naive/src/adapter/naive.ts delete mode 100644 apps/web-naive/src/adapter/vxe-table.ts delete mode 100644 apps/web-naive/src/api/core/auth.ts delete mode 100644 apps/web-naive/src/api/core/index.ts delete mode 100644 apps/web-naive/src/api/core/menu.ts delete mode 100644 apps/web-naive/src/api/core/user.ts delete mode 100644 apps/web-naive/src/api/index.ts delete mode 100644 apps/web-naive/src/api/request.ts delete mode 100644 apps/web-naive/src/app.vue delete mode 100644 apps/web-naive/src/bootstrap.ts delete mode 100644 apps/web-naive/src/layouts/auth.vue delete mode 100644 apps/web-naive/src/layouts/basic.vue delete mode 100644 apps/web-naive/src/layouts/index.ts delete mode 100644 apps/web-naive/src/locales/README.md delete mode 100644 apps/web-naive/src/locales/index.ts delete mode 100644 apps/web-naive/src/locales/langs/en-US/demos.json delete mode 100644 apps/web-naive/src/locales/langs/en-US/page.json delete mode 100644 apps/web-naive/src/locales/langs/zh-CN/demos.json delete mode 100644 apps/web-naive/src/locales/langs/zh-CN/page.json delete mode 100644 apps/web-naive/src/main.ts delete mode 100644 apps/web-naive/src/preferences.ts delete mode 100644 apps/web-naive/src/router/access.ts delete mode 100644 apps/web-naive/src/router/guard.ts delete mode 100644 apps/web-naive/src/router/index.ts delete mode 100644 apps/web-naive/src/router/routes/core.ts delete mode 100644 apps/web-naive/src/router/routes/index.ts delete mode 100644 apps/web-naive/src/router/routes/modules/dashboard.ts delete mode 100644 apps/web-naive/src/router/routes/modules/demos.ts delete mode 100644 apps/web-naive/src/router/routes/modules/vben.ts delete mode 100644 apps/web-naive/src/store/auth.ts delete mode 100644 apps/web-naive/src/store/index.ts delete mode 100644 apps/web-naive/src/views/_core/README.md delete mode 100644 apps/web-naive/src/views/_core/about/index.vue delete mode 100644 apps/web-naive/src/views/_core/authentication/code-login.vue delete mode 100644 apps/web-naive/src/views/_core/authentication/forget-password.vue delete mode 100644 apps/web-naive/src/views/_core/authentication/login.vue delete mode 100644 apps/web-naive/src/views/_core/authentication/qrcode-login.vue delete mode 100644 apps/web-naive/src/views/_core/authentication/register.vue delete mode 100644 apps/web-naive/src/views/_core/fallback/coming-soon.vue delete mode 100644 apps/web-naive/src/views/_core/fallback/forbidden.vue delete mode 100644 apps/web-naive/src/views/_core/fallback/internal-error.vue delete mode 100644 apps/web-naive/src/views/_core/fallback/not-found.vue delete mode 100644 apps/web-naive/src/views/_core/fallback/offline.vue delete mode 100644 apps/web-naive/src/views/dashboard/analytics/analytics-trends.vue delete mode 100644 apps/web-naive/src/views/dashboard/analytics/analytics-visits-data.vue delete mode 100644 apps/web-naive/src/views/dashboard/analytics/analytics-visits-sales.vue delete mode 100644 apps/web-naive/src/views/dashboard/analytics/analytics-visits-source.vue delete mode 100644 apps/web-naive/src/views/dashboard/analytics/analytics-visits.vue delete mode 100644 apps/web-naive/src/views/dashboard/analytics/index.vue delete mode 100644 apps/web-naive/src/views/dashboard/workspace/index.vue delete mode 100644 apps/web-naive/src/views/demos/form/basic.vue delete mode 100644 apps/web-naive/src/views/demos/naive/index.vue delete mode 100644 apps/web-naive/src/views/demos/table/index.vue delete mode 100644 apps/web-naive/tailwind.config.mjs delete mode 100644 apps/web-naive/tsconfig.json delete mode 100644 apps/web-naive/tsconfig.node.json delete mode 100644 apps/web-naive/vite.config.mts create mode 100644 docs/src/components/common-ui/vben-ellipsis-text.md create mode 100644 docs/src/demos/vben-ellipsis-text/expand/index.vue create mode 100644 docs/src/demos/vben-ellipsis-text/line/index.vue create mode 100644 docs/src/demos/vben-ellipsis-text/tooltip/index.vue create mode 100644 packages/@core/ui-kit/shadcn-ui/src/ui/resizable/ResizableHandle.vue create mode 100644 packages/@core/ui-kit/shadcn-ui/src/ui/resizable/ResizablePanelGroup.vue create mode 100644 packages/@core/ui-kit/shadcn-ui/src/ui/resizable/index.ts create mode 100644 packages/effects/common-ui/src/components/col-page/col-page.vue create mode 100644 packages/effects/common-ui/src/components/col-page/index.ts create mode 100644 packages/effects/common-ui/src/components/col-page/types.ts create mode 100644 packages/effects/common-ui/src/components/page/types.ts create mode 100644 packages/effects/common-ui/src/components/tippy/directive.ts create mode 100644 packages/effects/common-ui/src/components/tippy/index.ts create mode 100644 packages/effects/hooks/src/use-hover-toggle.ts create mode 100644 packages/effects/layouts/src/widgets/preferences/icons/header-mixed-nav.vue create mode 100644 packages/effects/layouts/src/widgets/preferences/icons/header-sidebar-nav.vue create mode 100644 packages/styles/src/naive/index.css create mode 100644 playground/src/views/examples/form/modules/two-fields.vue create mode 100644 playground/src/views/examples/layout/col-page.vue create mode 100644 playground/src/views/examples/modal/blur-demo.vue create mode 100644 playground/src/views/examples/modal/nested-demo.vue create mode 100644 playground/src/views/examples/tippy/index.vue diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 533a87c3..b4afdd93 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -153,3 +153,20 @@ jobs: username: ${{ secrets.WEB_NAIVE_FTP_ACCOUNT }} password: ${{ secrets.WEB_NAIVE_FTP_PASSWORD }} local-dir: ./apps/web-naive/dist/ + + rerun-on-failure: + name: Rerun on failure + needs: + - deploy-playground-ftp + - deploy-docs-ftp + - deploy-antd-ftp + - deploy-ele-ftp + - deploy-naive-ftp + if: failure() && fromJSON(github.run_attempt) < 10 + runs-on: ubuntu-latest + steps: + - name: Retry ${{ fromJSON(github.run_attempt) }} of 10 + env: + GH_REPO: ${{ github.repository }} + GH_TOKEN: ${{ github.token }} + run: gh workflow run rerun.yml -F run_id=${{ github.run_id }} diff --git a/.github/workflows/rerun.yml b/.github/workflows/rerun.yml new file mode 100644 index 00000000..2b462551 --- /dev/null +++ b/.github/workflows/rerun.yml @@ -0,0 +1,19 @@ +name: Rerun workflow + +on: + workflow_dispatch: + inputs: + run_id: + description: The workflow id to relanch + required: true +jobs: + rerun: + runs-on: ubuntu-latest + steps: + - name: rerun ${{ inputs.run_id }} + env: + GH_REPO: ${{ github.repository }} + GH_TOKEN: ${{ github.token }} + run: | + gh run watch ${{ inputs.run_id }} > /dev/null 2>&1 + gh run rerun ${{ inputs.run_id }} --failed diff --git a/.lintstagedrc.mjs b/.lintstagedrc.mjs index e68d8a3e..94b0192a 100644 --- a/.lintstagedrc.mjs +++ b/.lintstagedrc.mjs @@ -1,4 +1,10 @@ export default { + '*.md': ['prettier --cache --ignore-unknown --write'], + '*.vue': [ + 'prettier --write', + 'eslint --cache --fix', + 'stylelint --fix --allow-empty-input', + ], '*.{js,jsx,ts,tsx}': [ 'prettier --cache --ignore-unknown --write', 'eslint --cache --fix', @@ -7,14 +13,8 @@ export default { 'prettier --cache --ignore-unknown --write', 'stylelint --fix --allow-empty-input', ], - '*.md': ['prettier --cache --ignore-unknown --write'], - '*.vue': [ - 'prettier --write', - 'eslint --cache --fix', - 'stylelint --fix --allow-empty-input', - ], + 'package.json': ['prettier --cache --write'], '{!(package)*.json,*.code-snippets,.!(browserslist)*rc}': [ 'prettier --cache --write--parser json', ], - 'package.json': ['prettier --cache --write'], }; diff --git a/.vscode/launch.json b/.vscode/launch.json index 7740e810..e9673304 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -9,7 +9,7 @@ "url": "http://localhost:5555", "env": { "NODE_ENV": "development" }, "sourceMaps": true, - "webRoot": "${workspaceFolder}" + "webRoot": "${workspaceFolder}/playground" }, { "type": "chrome", @@ -18,7 +18,7 @@ "url": "http://localhost:5666", "env": { "NODE_ENV": "development" }, "sourceMaps": true, - "webRoot": "${workspaceFolder}" + "webRoot": "${workspaceFolder}/apps/web-antd" }, { "type": "chrome", @@ -27,7 +27,7 @@ "url": "http://localhost:5777", "env": { "NODE_ENV": "development" }, "sourceMaps": true, - "webRoot": "${workspaceFolder}" + "webRoot": "${workspaceFolder}/apps/web-ele" }, { "type": "chrome", @@ -36,7 +36,7 @@ "url": "http://localhost:5888", "env": { "NODE_ENV": "development" }, "sourceMaps": true, - "webRoot": "${workspaceFolder}" + "webRoot": "${workspaceFolder}/apps/web-naive" } ] } diff --git a/CHANGELOG.md b/CHANGELOG.md index 834f8252..8575978f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,36 @@ -# 1.1.4 +# 1.2.0 + +**REFACTOR** + +- 菜单选择组件重构为Table形式 +- 字典相关功能重构 采用一个Map储存字典(之前为两个Map) +- 代码生成配置页面重构 去除步骤条 **Features** -- 通用的vxe-table排序事件(排序逻辑改为在排序事件中处理而非在api处理) +- 对接后端工作流 +- ~~通用的vxe-table排序事件(排序逻辑改为在排序事件中处理而非在api处理)~~ +- getDict/getDictOptions 提取公共逻辑 减少冗余代码 +- 字典新增对Number类型的支持 -> `getDictOptions('', true);`即可获取number类型的value +- 文件上传 增加上传进度条 下方上传提示 +- 图片上传 增加上传进度条 下方上传提示 +- oss下载进度提示 **BUG FIXES** -- 字典项为空时getDict方法无限调用接口((无奈兼容 不给字典item本来就是错误用法)) +- 字典项为空时getDict方法无限调用接口(无奈兼容 不给字典item本来就是错误用法) +- 表格排序翻页会丢失排序参数 +- 下载文件时(responseType === 'blob')需要判断下载失败(返回json而非二进制)的情况 +- requestClient缺失i18n内容 + +**OTHERS** + +- 用户管理 新增只获取一次(mounted)默认密码而非每次打开modal都获取 +- `apps/web-antd/src/utils/dict.ts` `getDict`方法将于下个版本删除 使用`getDictOptions`替代 +- VxeTable升级V4.10.0 +- 移除`@deprecated` `apps/web-antd/src/adapter/vxe-table.ts`的`tableCheckboxEvent`方法 +- 移除`由于更新方案弃用的` `apps/web-antd/src/adapter/vxe-table.ts`的`vxeSortEvent`方法 +- 移除apps下的ele和naive目录 # 1.1.3 diff --git a/README.zh-CN.md b/README.zh-CN.md index c4cff382..5853a02d 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -2,21 +2,15 @@ ## 提示 -该仓库使用vben最新版本v5开发, ~~老版本v2地址(不维护)~~ [前往](https://gitee.com/dapppp/ruoyi-plus-vben) +该仓库使用vben最新版本v5开发 v5版本采用分仓(包)目录结构, 具体开发路径为: `根目录/apps/web-antd` -目前对应后端版本: **5.2.3/2.2.3** +目前对应后端版本: **分布式5.3.0-beta/微服务2.2.3** V1.1.0版本已支持离线图标 -## 进度 - -**工作流相关模块等待后端重构后开发** - -基础功能已经开发完毕 - -👉 [更新日志](https://gitee.com/dapppp/ruoyi-plus-vben5/blob/main/CHANGELOG.md) +V1.2.0版本对接warmflow工作流 ## 简介 @@ -24,9 +18,9 @@ V1.1.0版本已支持离线图标 | 组件/框架 | 版本 | | :------------- | :----- | -| vben | 5.4.5 | -| ant-design-vue | 4.2.5 | -| vue | 3.5.11 | +| vben | 5.5.2 | +| ant-design-vue | 4.2.6 | +| vue | 3.5.13 | 对应后端项目: **(分布式 5.X 分支 微服务 2.分支)** @@ -194,4 +188,4 @@ pnpm build:antd 如果项目帮助到您 可以考虑请作者喝杯咖啡 万分感谢您对开源的支持! - + diff --git a/apps/backend-mock/api/table/list.ts b/apps/backend-mock/api/table/list.ts index 4a0db94e..55b88eaa 100644 --- a/apps/backend-mock/api/table/list.ts +++ b/apps/backend-mock/api/table/list.ts @@ -43,6 +43,31 @@ export default eventHandler(async (event) => { await sleep(600); - const { page, pageSize } = getQuery(event); - return usePageResponseSuccess(page as string, pageSize as string, mockData); + const { page, pageSize, sortBy, sortOrder } = getQuery(event); + const listData = structuredClone(mockData); + if (sortBy && Reflect.has(listData[0], sortBy as string)) { + listData.sort((a, b) => { + if (sortOrder === 'asc') { + if (sortBy === 'price') { + return ( + Number.parseFloat(a[sortBy as string]) - + Number.parseFloat(b[sortBy as string]) + ); + } else { + return a[sortBy as string] > b[sortBy as string] ? 1 : -1; + } + } else { + if (sortBy === 'price') { + return ( + Number.parseFloat(b[sortBy as string]) - + Number.parseFloat(a[sortBy as string]) + ); + } else { + return a[sortBy as string] < b[sortBy as string] ? 1 : -1; + } + } + }); + } + + return usePageResponseSuccess(page as string, pageSize as string, listData); }); diff --git a/apps/backend-mock/utils/mock-data.ts b/apps/backend-mock/utils/mock-data.ts index 71970a28..3967b906 100644 --- a/apps/backend-mock/utils/mock-data.ts +++ b/apps/backend-mock/utils/mock-data.ts @@ -4,6 +4,7 @@ export interface UserInfo { realName: string; roles: string[]; username: string; + homePath?: string; } export const MOCK_USERS: UserInfo[] = [ @@ -20,6 +21,7 @@ export const MOCK_USERS: UserInfo[] = [ realName: 'Admin', roles: ['admin'], username: 'admin', + homePath: '/workspace', }, { id: 2, @@ -27,6 +29,7 @@ export const MOCK_USERS: UserInfo[] = [ realName: 'Jack', roles: ['user'], username: 'jack', + homePath: '/analytics', }, ]; @@ -50,7 +53,6 @@ export const MOCK_CODES = [ const dashboardMenus = [ { - component: 'BasicLayout', meta: { order: -1, title: 'page.dashboard.title', @@ -113,7 +115,6 @@ const createDemosMenus = (role: 'admin' | 'super' | 'user') => { return [ { - component: 'BasicLayout', meta: { icon: 'ic:baseline-view-in-ar', keepAlive: true, diff --git a/apps/web-antd/package.json b/apps/web-antd/package.json index d303cf5e..b759ba10 100644 --- a/apps/web-antd/package.json +++ b/apps/web-antd/package.json @@ -1,6 +1,6 @@ { "name": "@vben/web-antd", - "version": "1.1.3", + "version": "1.2.0", "homepage": "https://vben.pro", "bugs": "https://github.com/vbenjs/vue-vben-admin/issues", "repository": { diff --git a/apps/web-antd/src/adapter/component/index.ts b/apps/web-antd/src/adapter/component/index.ts index 370bcdf3..95472d96 100644 --- a/apps/web-antd/src/adapter/component/index.ts +++ b/apps/web-antd/src/adapter/component/index.ts @@ -3,9 +3,10 @@ * 可用于 vben-form、vben-modal、vben-drawer 等组件使用, */ +import type { Component, SetupContext } from 'vue'; + import type { BaseFormComponentType } from '@vben/common-ui'; -import type { Component, SetupContext } from 'vue'; import { h } from 'vue'; import { ApiComponent, globalShareState, IconPicker } from '@vben/common-ui'; diff --git a/apps/web-antd/src/adapter/vxe-table.ts b/apps/web-antd/src/adapter/vxe-table.ts index 857751b3..592161af 100644 --- a/apps/web-antd/src/adapter/vxe-table.ts +++ b/apps/web-antd/src/adapter/vxe-table.ts @@ -1,10 +1,8 @@ -import { h, type Ref } from 'vue'; +import type { VxeGridPropTypes } from '@vben/plugins/vxe-table'; -import { - setupVbenVxeTable, - useVbenVxeGrid, - type VxeGridDefines, -} from '@vben/plugins/vxe-table'; +import { h } from 'vue'; + +import { setupVbenVxeTable, useVbenVxeGrid } from '@vben/plugins/vxe-table'; import { Button, Image } from 'ant-design-vue'; @@ -43,7 +41,7 @@ setupVbenVxeTable({ // 鼠标移入行显示 hover 样式 isHover: true, // 点击行高亮 - isCurrent: true, + isCurrent: false, }, columnConfig: { // 可拖拽列宽 @@ -105,21 +103,6 @@ export { useVbenVxeGrid }; export type * from '@vben/plugins/vxe-table'; -/** - * 通用的表格复选框是否选中事件 - * @deprecated 使用vxeCheckboxChecked代替 - * @param checked 是否选中 - * @returns function - */ -export function tableCheckboxEvent(checked: Ref) { - const event: (params: VxeGridDefines.CheckboxChangeEventParams) => void = ( - params, - ) => { - checked.value = params.$table.getCheckboxRecords().length > 0; - }; - return event; -} - /** * 判断vxe-table的复选框是否选中 * @param tableApi api @@ -132,22 +115,21 @@ export function vxeCheckboxChecked( } /** - * 通用的vxe-table排序事件 支持单/多字段排序 - * @param tableApi api - * @param sortParams 排序参数 + * 通用的 排序参数添加到请求参数中 + * @param params 请求参数 + * @param sortList vxe-table的排序参数 */ -export function vxeSortEvent( - tableApi: ReturnType[1], - sortParams: VxeGridDefines.SortChangeEventParams, +export function addSortParams( + params: Record, + sortList: VxeGridPropTypes.ProxyAjaxQuerySortCheckedParams[], ) { - const { sortList } = sortParams; - // 这里是排序取消 length为0 就不传参数了 + // 这里是排序取消 length为0 就不添加参数了 if (sortList.length === 0) { - tableApi.query(); return; } // 支持单/多字段排序 const orderByColumn = sortList.map((item) => item.field).join(','); const isAsc = sortList.map((item) => item.order).join(','); - tableApi.query({ orderByColumn, isAsc }); + params.orderByColumn = orderByColumn; + params.isAsc = isAsc; } diff --git a/apps/web-antd/src/api/common.d.ts b/apps/web-antd/src/api/common.d.ts index 233f2aa6..a6ed2aea 100644 --- a/apps/web-antd/src/api/common.d.ts +++ b/apps/web-antd/src/api/common.d.ts @@ -38,4 +38,5 @@ export interface PageQuery { orderByColumn?: string; pageNum?: number; pageSize?: number; + [key: string]: any; } diff --git a/apps/web-antd/src/api/core/menu.ts b/apps/web-antd/src/api/core/menu.ts index e4bef601..e04c2baf 100644 --- a/apps/web-antd/src/api/core/menu.ts +++ b/apps/web-antd/src/api/core/menu.ts @@ -19,7 +19,7 @@ export interface MenuMeta { * @param name 菜单名 * @param path 菜单路径 * @param hidden 是否隐藏 - * @param component 组件名称 Laout + * @param component 组件名称 Layout * @param alwaysShow 总是显示 * @param query 路由参数(json形式) * @param meta 路由信息 diff --git a/apps/web-antd/src/api/core/upload.ts b/apps/web-antd/src/api/core/upload.ts index 32833b66..a74cb19f 100644 --- a/apps/web-antd/src/api/core/upload.ts +++ b/apps/web-antd/src/api/core/upload.ts @@ -1,12 +1,27 @@ +import type { AxiosRequestConfig } from '@vben/request'; + import { requestClient } from '#/api/request'; +/** + * Axios上传进度事件 + */ +export type AxiosProgressEvent = AxiosRequestConfig['onUploadProgress']; + /** * 通过单文件上传接口 * @param file 上传的文件 + * @param onUploadProgress 上传进度事件 非必传 * @returns 上传结果 */ -export function uploadApi(file: Blob | File) { - return requestClient.upload('/resource/oss/upload', { file }); +export function uploadApi( + file: Blob | File, + onUploadProgress?: AxiosProgressEvent, +) { + return requestClient.upload( + '/resource/oss/upload', + { file }, + { onUploadProgress, timeout: 60_000 }, + ); } /** * 默认上传结果 diff --git a/apps/web-antd/src/api/monitor/online/index.ts b/apps/web-antd/src/api/monitor/online/index.ts index 4d8224a2..8b4d938c 100644 --- a/apps/web-antd/src/api/monitor/online/index.ts +++ b/apps/web-antd/src/api/monitor/online/index.ts @@ -17,6 +17,11 @@ export function onlineDeviceList() { return requestClient.get>(Api.root); } +/** + * 这里的分页参数无效 返回的是全部的分页 + * @param params 请求参数 + * @returns 结果 + */ export function onlineList(params?: PageQuery) { return requestClient.get>(Api.onlineList, { params }); } @@ -36,5 +41,5 @@ export function forceLogout(tokenId: string) { * @returns void */ export function forceLogout2(tokenId: string) { - return requestClient.postWithMsg(`${Api.root}/${tokenId}`); + return requestClient.deleteWithMsg(`${Api.root}/myself/${tokenId}`); } diff --git a/apps/web-antd/src/api/monitor/operlog/index.ts b/apps/web-antd/src/api/monitor/operlog/index.ts index c061b447..44946f10 100644 --- a/apps/web-antd/src/api/monitor/operlog/index.ts +++ b/apps/web-antd/src/api/monitor/operlog/index.ts @@ -12,20 +12,36 @@ enum Api { root = '/monitor/operlog', } +/** + * 操作日志分页 + * @param params 查询参数 + * @returns 分页结果 + */ export function operLogList(params?: PageQuery) { return requestClient.get>(Api.operLogList, { params, }); } +/** + * 删除操作日志 + * @param operIds id/ids + */ export function operLogDelete(operIds: IDS) { return requestClient.deleteWithMsg(`${Api.root}/${operIds}`); } +/** + * 清空全部分页日志 + */ export function operLogClean() { return requestClient.deleteWithMsg(Api.operLogClean); } -export function operLogExport(data: any) { +/** + * 导出操作日志 + * @param data 查询参数 + */ +export function operLogExport(data: Partial) { return commonExport(Api.operLogExport, data); } diff --git a/apps/web-antd/src/api/request.ts b/apps/web-antd/src/api/request.ts index b3d80804..515cb70d 100644 --- a/apps/web-antd/src/api/request.ts +++ b/apps/web-antd/src/api/request.ts @@ -1,6 +1,7 @@ /** * 该文件可自行根据业务逻辑进行调整 */ + import type { HttpResponse } from '@vben/request'; import { useAppConfig } from '@vben/hooks'; @@ -134,14 +135,14 @@ function createRequestClient(baseURL: string) { }); // 通用的错误处理, 如果没有进入上面的错误处理逻辑,就会进入这里 - // 主要处理http状态码不为200的情况 必须放在在下面的响应拦截器之前 + // 主要处理http状态码不为200(如网络异常/离线)的情况 必须放在在下面的响应拦截器之前 client.addResponseInterceptor( errorMessageResponseInterceptor((msg: string) => message.error(msg)), ); client.addResponseInterceptor({ - fulfilled: (response) => { - const encryptKey = (response.headers || {})['encrypt-key']; + fulfilled: async (response) => { + const encryptKey = (response.headers ?? {})['encrypt-key']; if (encryptKey) { /** RSA私钥解密 拿到解密秘钥的base64 */ const base64Str = encryptUtil.decrypt(encryptKey); @@ -164,39 +165,57 @@ function createRequestClient(baseURL: string) { // 不进行任何处理,直接返回 // 用于页面代码可能需要直接获取code,data,message这些信息时开启 if (!isTransformResponse) { - return response.data; + /** + * 需要判断下载二进制的情况 正常是返回二进制 报错会返回json + * 当type为blob且content-type为application/json时 则判断已经下载出错 + */ + if ( + response.config.responseType === 'blob' && + response.headers['content-type']?.includes?.('application/json') + ) { + // 这时候的data为blob类型 + const blob = response.data as unknown as Blob; + // 拿到字符串转json对象 + response.data = JSON.parse(await blob.text()); + // 然后按正常逻辑执行下面的代码(判断业务状态码) + } else { + // 其他情况 直接返回 + return response.data; + } } const axiosResponseData = response.data; if (!axiosResponseData) { - throw new Error($t('fallback.http.apiRequestFailed')); + throw new Error($t('http.apiRequestFailed')); } - // ruoyi-plus没有采用严格的{code, msg, data}模式 + // 后端并没有采用严格的{code, msg, data}模式 const { code, data, msg, ...other } = axiosResponseData; - // 这里逻辑可以根据项目进行修改 + // 业务状态码为200则请求成功 const hasSuccess = Reflect.has(axiosResponseData, 'code') && code === 200; if (hasSuccess) { let successMsg = msg; if (isNull(successMsg) || isEmpty(successMsg)) { - successMsg = $t(`fallback.http.operationSuccess`); + successMsg = $t(`http.operationSuccess`); } if (response.config.successMessageMode === 'modal') { Modal.success({ content: successMsg, - title: $t('fallback.http.successTip'), + title: $t('http.successTip'), }); } else if (response.config.successMessageMode === 'message') { message.success(successMsg); } + // 分页情况下为code msg rows total 并没有data字段 // 如果有data 直接返回data 没有data将剩余参数(...other)封装为data返回 - // 需要考虑data为null的情况(比如查询为空) + // 需要考虑data为null的情况(比如查询为空) 所以这里直接判断undefined if (data !== undefined) { return data; } + // 没有data 将其他参数包装为data return other; } // 在此处根据自己项目的实际情况对不同的code执行不同的操作 @@ -209,7 +228,7 @@ function createRequestClient(baseURL: string) { return; } isLogoutProcessing = true; - const _msg = '登录超时, 请重新登录'; + const _msg = $t('http.loginTimeout'); const userStore = useAuthStore(); userStore.logout().finally(() => { message.error(_msg); @@ -230,13 +249,13 @@ function createRequestClient(baseURL: string) { if (response.config.errorMessageMode === 'modal') { Modal.error({ content: timeoutMsg, - title: $t('fallback.http.errorTip'), + title: $t('http.errorTip'), }); } else if (response.config.errorMessageMode === 'message') { message.error(timeoutMsg); } - throw new Error(timeoutMsg || $t('fallback.http.apiRequestFailed')); + throw new Error(timeoutMsg || $t('http.apiRequestFailed')); }, }); diff --git a/apps/web-antd/src/api/system/client/index.ts b/apps/web-antd/src/api/system/client/index.ts index 354fab95..bb8c4b99 100644 --- a/apps/web-antd/src/api/system/client/index.ts +++ b/apps/web-antd/src/api/system/client/index.ts @@ -12,30 +12,60 @@ enum Api { root = '/system/client', } +/** + * 查询客户端分页列表 + * @param params 请求参数 + * @returns 列表 + */ export function clientList(params?: PageQuery) { return requestClient.get>(Api.clientList, { params }); } -export function clientExport(data: any) { +/** + * 导出客户端excel + * @param data 请求参数 + */ +export function clientExport(data: Partial) { return commonExport(Api.clientExport, data); } +/** + * 客户端详情 + * @param id id + * @returns 详情 + */ export function clientInfo(id: ID) { return requestClient.get(`${Api.root}/${id}`); } -export function clientAdd(data: any) { +/** + * 客户端新增 + * @param data 参数 + */ +export function clientAdd(data: Partial) { return requestClient.postWithMsg(Api.root, data); } -export function clientUpdate(data: any) { +/** + * 客户端修改 + * @param data 参数 + */ +export function clientUpdate(data: Partial) { return requestClient.putWithMsg(Api.root, data); } +/** + * 客户端状态修改 + * @param data 状态 + */ export function clientChangeStatus(data: any) { - return requestClient.putWithMsg(Api.root, data); + return requestClient.putWithMsg(Api.clientChangeStatus, data); } +/** + * 客户端删除 + * @param ids id集合 + */ export function clientRemove(ids: IDS) { - return requestClient.deleteWithMsg(`${Api.root}/${ids}`); + return requestClient.deleteWithMsg(`${Api.root}/${ids}`); } diff --git a/apps/web-antd/src/api/system/config/index.ts b/apps/web-antd/src/api/system/config/index.ts index 588bb2b1..546c95b1 100644 --- a/apps/web-antd/src/api/system/config/index.ts +++ b/apps/web-antd/src/api/system/config/index.ts @@ -1,4 +1,4 @@ -import type { Config } from './model'; +import type { SysConfig } from './model'; import type { ID, IDS, PageQuery, PageResult } from '#/api/common'; @@ -13,15 +13,24 @@ enum Api { root = '/system/config', } +/** + * 系统参数分页列表 + * @param params 请求参数 + * @returns 列表 + */ export function configList(params?: PageQuery) { - return requestClient.get>(Api.configList, { params }); + return requestClient.get>(Api.configList, { params }); } export function configInfo(configId: ID) { - return requestClient.get(`${Api.root}/${configId}`); + return requestClient.get(`${Api.root}/${configId}`); } -export function configExport(data: any) { +/** + * 导出 + * @param data 参数 + */ +export function configExport(data: Partial) { return commonExport(Api.configExport, data); } @@ -33,14 +42,26 @@ export function configRefreshCache() { return requestClient.deleteWithMsg(Api.configRefreshCache); } -export function configUpdate(data: any) { +/** + * 更新系统配置 + * @param data 参数 + */ +export function configUpdate(data: Partial) { return requestClient.putWithMsg(Api.root, data); } -export function configAdd(data: any) { +/** + * 新增系统配置 + * @param data 参数 + */ +export function configAdd(data: Partial) { return requestClient.postWithMsg(Api.root, data); } +/** + * 删除配置 + * @param configIds ids + */ export function configRemove(configIds: IDS) { return requestClient.deleteWithMsg(`${Api.root}/${configIds}`); } diff --git a/apps/web-antd/src/api/system/config/model.d.ts b/apps/web-antd/src/api/system/config/model.d.ts index 85afc559..ee13acf4 100644 --- a/apps/web-antd/src/api/system/config/model.d.ts +++ b/apps/web-antd/src/api/system/config/model.d.ts @@ -1,4 +1,4 @@ -export interface Config { +export interface SysConfig { configId: number; configName: string; configKey: string; diff --git a/apps/web-antd/src/api/system/dept/index.ts b/apps/web-antd/src/api/system/dept/index.ts index 7557537d..bf7b721c 100644 --- a/apps/web-antd/src/api/system/dept/index.ts +++ b/apps/web-antd/src/api/system/dept/index.ts @@ -10,7 +10,11 @@ enum Api { root = '/system/dept', } -export function deptList(params?: any) { +/** + * 部门列表 + * @returns list + */ +export function deptList(params?: { deptName?: string; status?: string }) { return requestClient.get(Api.deptList, { params }); } @@ -23,15 +27,28 @@ export function deptNodeList(deptId: ID) { return requestClient.get(`${Api.deptNodeInfo}/${deptId}`); } +/** + * 部门详情 + * @param deptId 部门id + * @returns 部门信息 + */ export function deptInfo(deptId: ID) { return requestClient.get(`${Api.root}/${deptId}`); } -export function deptAdd(data: any) { +/** + * 部门新增 + * @param data 参数 + */ +export function deptAdd(data: Partial) { return requestClient.postWithMsg(Api.root, data); } -export function deptUpdate(data: any) { +/** + * 部门更新 + * @param data 参数 + */ +export function deptUpdate(data: Partial) { return requestClient.putWithMsg(Api.root, data); } diff --git a/apps/web-antd/src/api/system/dict/dict-data.ts b/apps/web-antd/src/api/system/dict/dict-data.ts index a39ec396..61c7db9f 100644 --- a/apps/web-antd/src/api/system/dict/dict-data.ts +++ b/apps/web-antd/src/api/system/dict/dict-data.ts @@ -34,7 +34,7 @@ export function dictDataList(params?: PageQuery) { * @param data 表单参数 * @returns blob */ -export function dictDataExport(data: any) { +export function dictDataExport(data: Partial) { return commonExport(Api.dictDataExport, data); } @@ -52,7 +52,7 @@ export function dictDataRemove(dictIds: IDS) { * @param data 表单参数 * @returns void */ -export function dictDataAdd(data: any) { +export function dictDataAdd(data: Partial) { return requestClient.postWithMsg(Api.root, data); } @@ -61,7 +61,7 @@ export function dictDataAdd(data: any) { * @param data 表单参数 * @returns void */ -export function dictDataUpdate(data: any) { +export function dictDataUpdate(data: Partial) { return requestClient.putWithMsg(Api.root, data); } diff --git a/apps/web-antd/src/api/system/dict/dict-type.ts b/apps/web-antd/src/api/system/dict/dict-type.ts index e3d4b291..96341606 100644 --- a/apps/web-antd/src/api/system/dict/dict-type.ts +++ b/apps/web-antd/src/api/system/dict/dict-type.ts @@ -27,7 +27,7 @@ export function dictTypeList(params?: PageQuery) { * @param data 表单参数 * @returns blob */ -export function dictTypeExport(data: any) { +export function dictTypeExport(data: Partial) { return commonExport(Api.dictTypeExport, data); } @@ -53,7 +53,7 @@ export function refreshDictTypeCache() { * @param data 表单参数 * @returns void */ -export function dictTypeAdd(data: any) { +export function dictTypeAdd(data: Partial) { return requestClient.postWithMsg(Api.root, data); } @@ -62,7 +62,7 @@ export function dictTypeAdd(data: any) { * @param data 表单参数 * @returns void */ -export function dictTypeUpdate(data: any) { +export function dictTypeUpdate(data: Partial) { return requestClient.putWithMsg(Api.root, data); } @@ -76,6 +76,7 @@ export function dictTypeInfo(dictId: ID) { } /** + * 这个在ele用到 v5用不上 * 下拉框 返回值和list一样 * @returns options */ diff --git a/apps/web-antd/src/api/system/menu/index.ts b/apps/web-antd/src/api/system/menu/index.ts index 65c3b4f9..0381449d 100644 --- a/apps/web-antd/src/api/system/menu/index.ts +++ b/apps/web-antd/src/api/system/menu/index.ts @@ -1,4 +1,4 @@ -import type { Menu, MenuOption, MenuResp } from './model'; +import type { Menu, MenuOption, MenuQuery, MenuResp } from './model'; import type { ID, IDS } from '#/api/common'; @@ -12,22 +12,44 @@ enum Api { tenantPackageMenuTreeselect = '/system/menu/tenantPackageMenuTreeselect', } -export function menuList(params?: any) { +/** + * 菜单列表 + * @param params 参数 + * @returns 列表 + */ +export function menuList(params?: MenuQuery) { return requestClient.get(Api.menuList, { params }); } +/** + * 菜单详情 + * @param menuId 菜单id + * @returns 菜单详情 + */ export function menuInfo(menuId: ID) { return requestClient.get(`${Api.root}/${menuId}`); } -export function menuAdd(data: any) { +/** + * 菜单新增 + * @param data 参数 + */ +export function menuAdd(data: Partial) { return requestClient.postWithMsg(Api.root, data); } -export function menuUpdate(data: any) { +/** + * 菜单更新 + * @param data 参数 + */ +export function menuUpdate(data: Partial) { return requestClient.putWithMsg(Api.root, data); } +/** + * 菜单删除 + * @param menuIds ids + */ export function menuRemove(menuIds: IDS) { return requestClient.deleteWithMsg(`${Api.root}/${menuIds}`); } diff --git a/apps/web-antd/src/api/system/menu/model.d.ts b/apps/web-antd/src/api/system/menu/model.d.ts index 0234425f..5854f5c7 100644 --- a/apps/web-antd/src/api/system/menu/model.d.ts +++ b/apps/web-antd/src/api/system/menu/model.d.ts @@ -33,6 +33,8 @@ export interface MenuOption { weight: number; children: MenuOption[]; key: string; // 实际上不存在 ide报错 + menuType: string; + icon: string; } /** @@ -44,3 +46,12 @@ export interface MenuResp { checkedKeys: number[]; menus: MenuOption[]; } + +/** + * 菜单表单查询 + */ +export interface MenuQuery { + menuName?: string; + visible?: string; + status?: string; +} diff --git a/apps/web-antd/src/api/system/notice/index.ts b/apps/web-antd/src/api/system/notice/index.ts index 82877943..8588930f 100644 --- a/apps/web-antd/src/api/system/notice/index.ts +++ b/apps/web-antd/src/api/system/notice/index.ts @@ -9,22 +9,44 @@ enum Api { root = '/system/notice', } +/** + * 通知公告分页 + * @param params 分页参数 + * @returns 分页结果 + */ export function noticeList(params?: PageQuery) { return requestClient.get(Api.noticeList, { params }); } +/** + * 通知公告详情 + * @param noticeId id + * @returns 详情 + */ export function noticeInfo(noticeId: ID) { return requestClient.get(`${Api.root}/${noticeId}`); } -export function noticeAdd(data: any) { +/** + * 通知公告新增 + * @param data 参数 + */ +export function noticeAdd(data: Partial) { return requestClient.postWithMsg(Api.root, data); } +/** + * 通知公告更新 + * @param data 参数 + */ export function noticeUpdate(data: any) { return requestClient.putWithMsg(Api.root, data); } +/** + * 通知公告删除 + * @param noticeIds ids + */ export function noticeRemove(noticeIds: IDS) { return requestClient.deleteWithMsg(`${Api.root}/${noticeIds}`); } diff --git a/apps/web-antd/src/api/system/oss-config/index.ts b/apps/web-antd/src/api/system/oss-config/index.ts index 3774e8af..ee01800a 100644 --- a/apps/web-antd/src/api/system/oss-config/index.ts +++ b/apps/web-antd/src/api/system/oss-config/index.ts @@ -21,12 +21,12 @@ export function ossConfigInfo(ossConfigId: ID) { } // 添加新的OSS配置 -export function ossConfigAdd(data: any) { +export function ossConfigAdd(data: Partial) { return requestClient.postWithMsg(Api.root, data); } // 更新现有的OSS配置 -export function ossConfigUpdate(data: any) { +export function ossConfigUpdate(data: Partial) { return requestClient.putWithMsg(Api.root, data); } diff --git a/apps/web-antd/src/api/system/oss/index.ts b/apps/web-antd/src/api/system/oss/index.ts index 139b9260..f1772aeb 100644 --- a/apps/web-antd/src/api/system/oss/index.ts +++ b/apps/web-antd/src/api/system/oss/index.ts @@ -1,3 +1,5 @@ +import type { AxiosRequestConfig } from '@vben/request'; + import type { OssFile } from './model'; import type { ID, IDS, PageQuery, PageResult } from '#/api/common'; @@ -13,20 +15,30 @@ enum Api { root = '/resource/oss', } +/** + * 文件list + * @param params 参数 + * @returns 分页 + */ export function ossList(params?: PageQuery) { return requestClient.get>(Api.ossList, { params }); } +/** + * 查询文件信息 返回为数组 + * @param ossIds id数组 + * @returns 信息数组 + */ export function ossInfo(ossIds: IDS) { - return requestClient.get(`${Api.ossInfo}/${ossIds}`); + return requestClient.get(`${Api.ossInfo}/${ossIds}`); } /** - * @deprecated + * @deprecated 使用apps/web-antd/src/api/core/upload.ts uploadApi方法 * @param file 文件 * @returns void */ -export function ossUpload(file: any) { +export function ossUpload(file: Blob | File) { const formData = new FormData(); formData.append('file', file); return requestClient.postWithMsg(Api.ossUpload, formData, { @@ -38,16 +50,26 @@ export function ossUpload(file: any) { /** * 下载文件 返回为二进制 * @param ossId ossId + * @param onDownloadProgress 下载进度(可选) * @returns blob */ -export function ossDownload(ossId: ID) { +export function ossDownload( + ossId: ID, + onDownloadProgress?: AxiosRequestConfig['onDownloadProgress'], +) { return requestClient.get(`${Api.ossDownload}/${ossId}`, { responseType: 'blob', timeout: 30 * 1000, isTransformResponse: false, + onDownloadProgress, }); } +/** + * 删除文件 + * @param ossIds id数组 + * @returns void + */ export function ossRemove(ossIds: IDS) { return requestClient.deleteWithMsg(`${Api.root}/${ossIds}`); } diff --git a/apps/web-antd/src/api/system/post/index.ts b/apps/web-antd/src/api/system/post/index.ts index 61c5c3eb..3e1ef2e2 100644 --- a/apps/web-antd/src/api/system/post/index.ts +++ b/apps/web-antd/src/api/system/post/index.ts @@ -21,26 +21,56 @@ export function postList(params?: PageQuery) { return requestClient.get(Api.postList, { params }); } -export function postExport(data: any) { +/** + * 导出岗位信息 + * @param data 请求参数 + * @returns blob + */ +export function postExport(data: Partial) { return commonExport(Api.postExport, data); } +/** + * 查询岗位信息 + * @param postId id + * @returns 岗位信息 + */ export function postInfo(postId: ID) { return requestClient.get(`${Api.root}/${postId}`); } -export function postAdd(data: any) { +/** + * 岗位新增 + * @param data 参数 + * @returns void + */ +export function postAdd(data: Partial) { return requestClient.postWithMsg(Api.root, data); } -export function postUpdate(data: any) { +/** + * 岗位更新 + * @param data 参数 + * @returns void + */ +export function postUpdate(data: Partial) { return requestClient.putWithMsg(Api.root, data); } +/** + * 岗位删除 + * @param postIds ids + * @returns void + */ export function postRemove(postIds: IDS) { return requestClient.deleteWithMsg(`${Api.root}/${postIds}`); } +/** + * 根据部门id获取岗位下拉列表 + * @param deptId 部门id + * @returns 岗位 + */ export function postOptionSelect(deptId: ID) { return requestClient.get(Api.postSelect, { params: { deptId } }); } diff --git a/apps/web-antd/src/api/system/role/index.ts b/apps/web-antd/src/api/system/role/index.ts index 6382fa03..e9e32891 100644 --- a/apps/web-antd/src/api/system/role/index.ts +++ b/apps/web-antd/src/api/system/role/index.ts @@ -1,3 +1,4 @@ +import type { User } from '../user/model'; import type { DeptResp, Role } from './model'; import type { ID, IDS, PageQuery, PageResult } from '#/api/common'; @@ -20,30 +21,65 @@ enum Api { root = '/system/role', } +/** + * 查询角色分页列表 + * @param params 搜索条件 + * @returns 分页列表 + */ export function roleList(params?: PageQuery) { return requestClient.get>(Api.roleList, { params }); } -export function roleExport(data: any) { +/** + * 导出角色信息 + * @param data 查询参数 + * @returns blob + */ +export function roleExport(data: Partial) { return commonExport(Api.roleExport, data); } +/** + * 查询角色信息 + * @param roleId 角色id + * @returns 角色信息 + */ export function roleInfo(roleId: ID) { return requestClient.get(`${Api.root}/${roleId}`); } -export function roleAdd(data: any) { +/** + * 角色新增 + * @param data 参数 + * @returns void + */ +export function roleAdd(data: Partial) { return requestClient.postWithMsg(Api.root, data); } -export function roleUpdate(data: any) { +/** + * 角色更新 + * @param data 参数 + * @returns void + */ +export function roleUpdate(data: Partial) { return requestClient.putWithMsg(Api.root, data); } -export function roleChangeStatus(data: any) { +/** + * 修改角色状态 + * @param data 参数 + * @returns void + */ +export function roleChangeStatus(data: Partial) { return requestClient.putWithMsg(Api.roleChangeStatus, data); } +/** + * 角色删除 + * @param roleIds ids + * @returns void + */ export function roleRemove(roleIds: IDS) { return requestClient.deleteWithMsg(`${Api.root}/${roleIds}`); } @@ -57,12 +93,20 @@ export function roleDataScope(data: any) { return requestClient.putWithMsg(Api.roleDataScope, data); } +/** + * @deprecated 全局并没有用到这个方法 + */ export function roleOptionSelect(params?: any) { return requestClient.get(Api.roleOptionSelect, { params }); } -export function roleAllocatedList(params: any) { - return requestClient.get(Api.roleAllocatedList, { params }); +/** + * 已分配角色的用户分页 + * @param params 请求参数 + * @returns 分页 + */ +export function roleAllocatedList(params?: PageQuery) { + return requestClient.get>(Api.roleAllocatedList, { params }); } /** @@ -71,28 +115,26 @@ export function roleAllocatedList(params: any) { * @returns void */ export function roleUnallocatedList(params: any) { - return requestClient.get(Api.roleUnallocatedList, { params }); + return requestClient.get>(Api.roleUnallocatedList, { + params, + }); } /** - * 取消授权 - * @param data {userId: 2, roleId: "2"} + * 取消用户角色授权 * @returns void */ -export function roleAuthCancel(data: any) { +export function roleAuthCancel(data: { roleId: ID; userId: ID }) { return requestClient.putWithMsg(Api.roleAuthCancel, data); } /** * 批量取消授权 - * @param roleId - * @param userIds + * @param roleId 角色ID + * @param userIds 用户ID集合 * @returns void */ -export function roleAuthCancelAll( - roleId: number | string, - userIds: number[] | string[], -) { +export function roleAuthCancelAll(roleId: ID, userIds: IDS) { return requestClient.putWithMsg( `${Api.roleAuthCancelAll}?roleId=${roleId}&userIds=${userIds.join(',')}`, ); @@ -100,21 +142,18 @@ export function roleAuthCancelAll( /** * 批量授权用户 - * @param roleId - * @param userIds + * @param roleId 角色ID + * @param userIds 用户ID集合 * @returns void */ -export function roleSelectAll( - roleId: number | string, - userIds: number[] | string[], -) { +export function roleSelectAll(roleId: ID, userIds: IDS) { return requestClient.putWithMsg( `${Api.roleAuthSelectAll}?roleId=${roleId}&userIds=${userIds.join(',')}`, ); } /** - * 部门树 + * 根据角色id获取部门树 * @param roleId 角色id * @returns DeptResp */ diff --git a/apps/web-antd/src/api/system/social/index.ts b/apps/web-antd/src/api/system/social/index.ts index 7c50ed3a..91aef896 100644 --- a/apps/web-antd/src/api/system/social/index.ts +++ b/apps/web-antd/src/api/system/social/index.ts @@ -1,5 +1,7 @@ import type { SocialInfo } from './model'; +import type { ID } from '#/api/common'; + import { requestClient } from '#/api/request'; enum Api { @@ -15,6 +17,9 @@ export function socialList() { return requestClient.get(Api.socialList); } -export function socialInfo(id: number | string) { +/** + * @deprecated 并没有用到这个方法 + */ +export function socialInfo(id: ID) { return requestClient.get(`${Api.root}/${id}`); } diff --git a/apps/web-antd/src/api/system/tenant-package/index.ts b/apps/web-antd/src/api/system/tenant-package/index.ts index 1851a7bc..3cb83a2b 100644 --- a/apps/web-antd/src/api/system/tenant-package/index.ts +++ b/apps/web-antd/src/api/system/tenant-package/index.ts @@ -13,37 +13,75 @@ enum Api { root = '/system/tenant/package', } +/** + * 租户套餐分页列表 + * @param params 请求参数 + * @returns 分页列表 + */ export function packageList(params?: PageQuery) { return requestClient.get>(Api.packageList, { params, }); } -// 下拉框 +/** + * 租户套餐下拉框 + * @returns 下拉框 + */ export function packageSelectList() { return requestClient.get(Api.packageSelectList); } -export function packageExport(data: any) { +/** + * 租户套餐导出 + * @param data 参数 + * @returns blob + */ +export function packageExport(data: Partial) { return commonExport(Api.packageExport, data); } +/** + * 租户套餐信息 + * @param id id + * @returns 信息 + */ export function packageInfo(id: ID) { return requestClient.get(`${Api.root}/${id}`); } -export function packageAdd(data: any) { +/** + * 租户套餐新增 + * @param data data + * @returns void + */ +export function packageAdd(data: Partial) { return requestClient.postWithMsg(Api.root, data); } -export function packageUpdate(data: any) { +/** + * 租户套餐更新 + * @param data data + * @returns void + */ +export function packageUpdate(data: Partial) { return requestClient.putWithMsg(Api.root, data); } -export function packageChangeStatus(data: any) { - return requestClient.putWithMsg(Api.packageChangeStatus, data); +/** + * 租户套餐状态变更 + * @param data data + * @returns void + */ +export function packageChangeStatus(data: Partial) { + return requestClient.putWithMsg(Api.packageChangeStatus, data); } +/** + * 租户套餐移除 + * @param ids ids + * @returns void + */ export function packageRemove(ids: IDS) { - return requestClient.deleteWithMsg(`${Api.root}/${ids}`); + return requestClient.deleteWithMsg(`${Api.root}/${ids}`); } diff --git a/apps/web-antd/src/api/system/tenant/index.ts b/apps/web-antd/src/api/system/tenant/index.ts index f5c6505e..e0269b23 100644 --- a/apps/web-antd/src/api/system/tenant/index.ts +++ b/apps/web-antd/src/api/system/tenant/index.ts @@ -16,14 +16,29 @@ enum Api { tenantSyncPackage = '/system/tenant/syncTenantPackage', } +/** + * 查询租户分页列表 + * @param params 参数 + * @returns 分页 + */ export function tenantList(params?: PageQuery) { return requestClient.get(Api.tenantList, { params }); } -export function tenantExport(data: any) { +/** + * 租户导出 + * @param data data + * @returns void + */ +export function tenantExport(data: Partial) { return commonExport(Api.tenantExport, data); } +/** + * 查询租户信息 + * @param id id + * @returns 租户信息 + */ export function tenantInfo(id: ID) { return requestClient.get(`${Api.root}/${id}`); } @@ -33,18 +48,33 @@ export function tenantInfo(id: ID) { * @param data data * @returns void */ -export function tenantAdd(data: any) { +export function tenantAdd(data: Partial) { return requestClient.postWithMsg(Api.root, data, { encrypt: true }); } -export function tenantUpdate(data: any) { +/** + * 租户更新 + * @param data data + * @returns void + */ +export function tenantUpdate(data: Partial) { return requestClient.putWithMsg(Api.root, data); } -export function tenantStatusChange(data: any) { +/** + * 租户状态更新 + * @param data data + * @returns void + */ +export function tenantStatusChange(data: Partial) { return requestClient.putWithMsg(Api.tenantStatus, data); } +/** + * 租户删除 + * @param ids ids + * @returns void + */ export function tenantRemove(ids: IDS) { return requestClient.deleteWithMsg(`${Api.root}/${ids}`); } @@ -70,17 +100,12 @@ export function tenantDynamicClear() { * 租户套餐同步 * @param tenantId 租户id * @param packageId 套餐id - * @param showMsg 是否显示成功信息 * @returns void */ -export function tenantSyncPackage( - tenantId: string, - packageId: string, - showMsg = true, -) { +export function tenantSyncPackage(tenantId: string, packageId: string) { return requestClient.get(Api.tenantSyncPackage, { params: { packageId, tenantId }, - successMessageMode: showMsg ? 'message' : 'none', + successMessageMode: 'message', }); } diff --git a/apps/web-antd/src/api/system/tenant/model.d.ts b/apps/web-antd/src/api/system/tenant/model.d.ts index 309ad587..db6121c3 100644 --- a/apps/web-antd/src/api/system/tenant/model.d.ts +++ b/apps/web-antd/src/api/system/tenant/model.d.ts @@ -9,7 +9,7 @@ export interface Tenant { id: number; intro: string; licenseNumber?: any; - packageId?: string; + packageId: string; remark?: string; status: string; tenantId: string; diff --git a/apps/web-antd/src/api/system/user/index.ts b/apps/web-antd/src/api/system/user/index.ts index ff2a3d52..ed1b20c4 100644 --- a/apps/web-antd/src/api/system/user/index.ts +++ b/apps/web-antd/src/api/system/user/index.ts @@ -38,7 +38,7 @@ export function userList(params?: PageQuery) { * @param data data * @returns blob */ -export function userExport(data: any) { +export function userExport(data: Partial) { return commonExport(Api.userExport, data); } @@ -91,7 +91,7 @@ export function findUserInfo(userId?: ID) { * @param data data * @returns void */ -export function userAdd(data: any) { +export function userAdd(data: Partial) { return requestClient.postWithMsg(Api.root, data); } @@ -100,7 +100,7 @@ export function userAdd(data: any) { * @param data data * @returns void */ -export function userUpdate(data: any) { +export function userUpdate(data: Partial) { return requestClient.putWithMsg(Api.root, data); } @@ -109,7 +109,7 @@ export function userUpdate(data: any) { * @param data data * @returns void */ -export function userStatusChange(data: any) { +export function userStatusChange(data: Partial) { return requestClient.putWithMsg(Api.userStatusChange, data); } diff --git a/apps/web-antd/src/api/tool/gen/index.ts b/apps/web-antd/src/api/tool/gen/index.ts index 0514d3e0..127b962c 100644 --- a/apps/web-antd/src/api/tool/gen/index.ts +++ b/apps/web-antd/src/api/tool/gen/index.ts @@ -1,6 +1,6 @@ import type { GenInfo } from './model'; -import type { ID, IDS } from '#/api/common'; +import type { ID, IDS, PageQuery } from '#/api/common'; import { ContentTypeEnum } from '#/api/helper'; import { requestClient } from '#/api/request'; @@ -19,7 +19,7 @@ enum Api { syncDb = '/tool/gen/synchDb', } // 查询代码生成列表 -export function generatedList(params: any) { +export function generatedList(params?: PageQuery) { return requestClient.get(Api.generatedList, { params }); } @@ -29,7 +29,7 @@ export function genInfo(tableId: ID) { } // 查询数据库列表 -export function readyToGenList(params: any) { +export function readyToGenList(params?: PageQuery) { return requestClient.get(Api.readyToGenList, { params }); } @@ -63,6 +63,7 @@ export function editSave(data: any) { export function genRemove(tableIds: IDS) { return requestClient.deleteWithMsg(`${Api.root}/${tableIds}`); } + // 预览代码 export function previewCode(tableId: ID) { return requestClient.get<{ [key: string]: string }>( diff --git a/apps/web-antd/src/api/workflow/category/index.ts b/apps/web-antd/src/api/workflow/category/index.ts index 3497c749..8126effd 100644 --- a/apps/web-antd/src/api/workflow/category/index.ts +++ b/apps/web-antd/src/api/workflow/category/index.ts @@ -1,9 +1,22 @@ -import type { CategoryForm, CategoryQuery, CategoryVO } from './model'; +import type { + CategoryForm, + CategoryQuery, + CategoryTree, + CategoryVO, +} from './model'; import type { ID, IDS } from '#/api/common'; import { requestClient } from '#/api/request'; +/** + * 获取流程分类树列表 + * @returns tree + */ +export function categoryTree() { + return requestClient.get('/workflow/category/categoryTree'); +} + /** * 查询流程分类列表 * @param params diff --git a/apps/web-antd/src/api/workflow/category/model.d.ts b/apps/web-antd/src/api/workflow/category/model.d.ts index 87937ec8..7d28c1a6 100644 --- a/apps/web-antd/src/api/workflow/category/model.d.ts +++ b/apps/web-antd/src/api/workflow/category/model.d.ts @@ -30,6 +30,7 @@ export interface CategoryVO { * 子对象 */ children: CategoryVO[]; + key: string; } export interface CategoryForm extends BaseEntity { @@ -85,3 +86,12 @@ export interface CategoryQuery { */ params?: any; } + +export interface CategoryTree { + id: number; + parentId: number; + label: string; + weight: number; + children: CategoryTree[]; + key: string; +} diff --git a/apps/web-antd/src/api/workflow/definition/index.ts b/apps/web-antd/src/api/workflow/definition/index.ts new file mode 100644 index 00000000..e21255c3 --- /dev/null +++ b/apps/web-antd/src/api/workflow/definition/index.ts @@ -0,0 +1,155 @@ +import type { ProcessDefinition } from './model'; + +import type { ID, IDS, PageQuery, PageResult } from '#/api/common'; + +import { requestClient } from '#/api/request'; + +/** + * 全部的流程定义 + * @param params 查询参数 + * @returns 分页 + */ +export function workflowDefinitionList(params?: PageQuery) { + return requestClient.get>( + '/workflow/definition/list', + { params }, + ); +} + +/** + * 未发布的流程定义 + * @param params 查询参数 + * @returns 分页 + */ +export function unPublishList(params?: PageQuery) { + return requestClient.get>( + '/workflow/definition/unPublishList', + { params }, + ); +} + +/** + * 获取历史流程定义列表 + * @param flowCode + * @returns ProcessDefinition[] + */ +export function getHisListByKey(flowCode: string) { + return requestClient.get( + `/workflow/definition/getHisListByKey/${flowCode}`, + ); +} + +/** + * 获取流程定义详细信息 + * @param id id + * @returns ProcessDefinition + */ +export function workflowDefinitionInfo(id: ID) { + return requestClient.get(`/workflow/definition/${id}`); +} + +/** + * 新增流程定义 + * @param data + */ +export function workflowDefinitionAdd(data: any) { + return requestClient.postWithMsg('/workflow/definition', data); +} + +/** + * 更新流程定义 + * @param data + */ +export function workflowDefinitionUpdate(data: any) { + return requestClient.putWithMsg('/workflow/definition', data); +} + +/** + * 发布流程定义 + * @param id id + * @returns boolean + */ +export function workflowDefinitionPublish(id: ID) { + return requestClient.putWithMsg( + `/workflow/definition/publish/${id}`, + ); +} + +/** + * 取消发布流程定义 + * @param id id + * @returns boolean + */ +export function workflowDefinitionUnPublish(id: ID) { + return requestClient.putWithMsg( + `/workflow/definition/unPublish/${id}`, + ); +} + +/** + * 删除流程定义 + * @param ids idList + */ +export function workflowDefinitionDelete(ids: IDS) { + return requestClient.deleteWithMsg(`/workflow/definition/${ids}`); +} + +/** + * 复制流程定义 + * @param id id + */ +export function workflowDefinitionCopy(id: ID) { + return requestClient.postWithMsg(`/workflow/definition/copy/${id}`); +} + +/** + * 导入流程定义 + * @returns boolean + */ +export function workflowDefinitionImport(data: { + category: ID; + file: Blob | File; +}) { + return requestClient.postWithMsg( + '/workflow/definition/importDef', + data, + { headers: { 'Content-Type': 'multipart/form-data' } }, + ); +} + +/** + * 导出流程定义 + * @param id id + * @returns blob + */ +export function workflowDefinitionExport(id: ID) { + return requestClient.postWithMsg( + `/workflow/definition/exportDef/${id}`, + {}, + { + responseType: 'blob', + isTransformResponse: false, + }, + ); +} + +/** + * 获取流程定义xml字符串 + * @param id id + * @returns xml + */ +export function workflowDefinitionXml(id: ID) { + return requestClient.get(`/workflow/definition/xmlString/${id}`); +} + +/** + * 激活/挂起流程定义 + * @param id 流程定义id + * @param active 激活/挂起 + * @returns boolean + */ +export function workflowDefinitionActive(id: ID, active: boolean) { + return requestClient.putWithMsg( + `/workflow/definition/active/${id}?active=${active}`, + ); +} diff --git a/apps/web-antd/src/api/workflow/definition/model.d.ts b/apps/web-antd/src/api/workflow/definition/model.d.ts new file mode 100644 index 00000000..b5eeed9c --- /dev/null +++ b/apps/web-antd/src/api/workflow/definition/model.d.ts @@ -0,0 +1,19 @@ +export interface ProcessDefinition { + id: string; + createTime: string; + updateTime: string; + tenantId: string; + delFlag: string; + flowCode: string; + flowName: string; + category: string; + categoryName: string; + version: string; + isPublish: number; + formCustom: string; + formPath: string; + activityStatus: number; + listenerType?: any; + listenerPath?: any; + ext?: any; +} diff --git a/apps/web-antd/src/api/workflow/instance/index.ts b/apps/web-antd/src/api/workflow/instance/index.ts new file mode 100644 index 00000000..774f3999 --- /dev/null +++ b/apps/web-antd/src/api/workflow/instance/index.ts @@ -0,0 +1,120 @@ +import type { TaskInfo } from '../task/model'; +import type { FlowInfoResponse } from './model'; + +import type { ID, IDS, PageQuery, PageResult } from '#/api/common'; + +import { requestClient } from '#/api/request'; + +/** + * @param businessId 业务ID + * @returns TaskInfo + */ +export function getTaskByBusinessId(businessId: string) { + return requestClient.get( + `/workflow/instance/getInfo/${businessId}`, + ); +} + +/** + * 分页查询正在运行的流程实例 + * @param params + * @returns + */ +export function pageByRunning(params?: PageQuery) { + return requestClient.get('/workflow/instance/pageByRunning', { params }); +} + +/** + * pageByFinish + * @param params + * @returns + */ +export function pageByFinish(params?: PageQuery) { + return requestClient.get('/workflow/instance/pageByFinish', { params }); +} + +/** + * 按照业务id删除流程实例 + * @param businessIds 业务id + */ +export function deleteByBusinessIds(businessIds: IDS) { + return requestClient.deleteWithMsg( + `/workflow/instance/deleteByBusinessIds${businessIds}`, + ); +} + +/** + * 按照实例id删除流程实例 + * @param instanceIds 实例id + */ +export function deleteByInstanceIds(instanceIds: IDS) { + return requestClient.deleteWithMsg( + `/workflow/instance/deleteByInstanceIds/${instanceIds}`, + ); +} + +/** + * 撤销流程 + * @param data + */ +export function cancelProcessApply(data: { businessId: ID; message?: string }) { + return requestClient.putWithMsg( + '/workflow/instance/cancelProcessApply', + data, + ); +} + +/** + * 激活/挂起流程实例 + * @param instanceId + * @param active + */ +export function workflowInstanceActive(instanceId: ID, active: boolean) { + return requestClient.putWithMsg( + `/workflow/instance/active/${instanceId}?active=${active}`, + ); +} + +/** + * 获取当前登录人发起的流程实例 + * @param params + * @returns PageResult + */ +export function pageByCurrent(params?: PageQuery) { + return requestClient.get>( + '/workflow/instance/pageByCurrent', + { params }, + ); +} + +/** + * 获取流程图,流程记录 + * @param businessId 业务标识 + * @returns 流程图,流程记录 + */ +export function flowInfo(businessId: string) { + return requestClient.get( + `/workflow/instance/flowImage/${businessId}`, + ); +} + +/** + * 获取流程变量 + * @param instanceId + * @returns Map + */ +export function instanceVariable(instanceId: string) { + return requestClient.get>( + `/workflow/instance/variable/${instanceId}`, + ); +} + +/** + * 作废流程 + */ +export function workflowInstanceInvalid(data: { + comment?: string; + id: string; +}) { + return requestClient.postWithMsg('/workflow/instance/invalid', data); +} diff --git a/apps/web-antd/src/api/workflow/instance/model.d.ts b/apps/web-antd/src/api/workflow/instance/model.d.ts new file mode 100644 index 00000000..8ef4b22e --- /dev/null +++ b/apps/web-antd/src/api/workflow/instance/model.d.ts @@ -0,0 +1,41 @@ +export interface Flow { + id: string; + createTime: string; + updateTime: string; + tenantId: string; + delFlag: string; + definitionId: string; + flowName?: any; + instanceId: string; + taskId: string; + cooperateType: number; + cooperateTypeName: string; + businessId?: any; + nodeCode: string; + nodeName: string; + nodeType: number; + targetNodeCode: string; + targetNodeName: string; + approver: string; + approveName: string; + collaborator?: any; + permissionList?: any; + skipType: string; + flowStatus: string; + flowTaskStatus?: any; + flowStatusName?: any; + message: string; + ext: null | string; + createBy?: any; + formCustom: string; + formPath: string; + flowCode?: any; + version?: any; + runDuration: string; + nickName?: any; +} + +export interface FlowInfoResponse { + image: string; + list: Flow[]; +} diff --git a/apps/web-antd/src/api/workflow/task/index.ts b/apps/web-antd/src/api/workflow/task/index.ts new file mode 100644 index 00000000..ae4cc407 --- /dev/null +++ b/apps/web-antd/src/api/workflow/task/index.ts @@ -0,0 +1,158 @@ +import type { + CompleteTaskReqData, + StartWorkFlowReqData, + TaskInfo, + TaskOperationData, + TaskOperationType, +} from './model'; + +import type { ID, IDS, PageQuery, PageResult } from '#/api/common'; + +import { requestClient } from '#/api/request'; + +/** + * 启动任务 + * @param data + */ +export function startWorkFlow(data: StartWorkFlowReqData) { + return requestClient.post<{ + processInstanceId: string; + taskId: string; + }>('/workflow/task/startWorkFlow', data); +} + +/** + * 办理任务 + * @param data + */ +export function completeTask(data: CompleteTaskReqData) { + return requestClient.postWithMsg('/workflow/task/completeTask', data); +} + +/** + * 查询当前用户的待办任务 + * @param params + */ +export function pageByTaskWait(params?: PageQuery) { + return requestClient.get>( + '/workflow/task/pageByTaskWait', + { params }, + ); +} + +/** + * 查询当前用户的已办任务 + * @param params + */ +export function pageByTaskFinish(params?: PageQuery) { + return requestClient.get>( + '/workflow/task/pageByTaskFinish', + { params }, + ); +} + +/** + * 查询所有待办任务 + * @param params + */ +export function pageByAllTaskWait(params?: PageQuery) { + return requestClient.get>( + '/workflow/task/pageByAllTaskWait', + { params }, + ); +} + +/** + * 查询已办任务 + * @param params + */ +export function pageByAllTaskFinish(params?: PageQuery) { + return requestClient.get>( + '/workflow/task/pageByAllTaskFinish', + { params }, + ); +} + +/** + * 查询当前用户的抄送 + * @param params + */ +export function pageByTaskCopy(params?: PageQuery) { + return requestClient.get>( + '/workflow/task/pageByTaskCopy', + { params }, + ); +} + +/** + * 根据taskId查询代表任务 + * @param taskId 任务id + * @returns info + */ +export function getTaskByTaskId(taskId: string) { + return requestClient.get(`/workflow/task/getTask/${taskId}`); +} + +/** + * 终止任务 + */ +export function terminationTask(data: { comment?: string; taskId: string }) { + return requestClient.postWithMsg( + '/workflow/task/terminationTask', + data, + ); +} + +/** + * 任务操作 + * @param taskOperationData 参数 + * @param taskOperation 操作类型,委派 delegateTask、转办 transferTask、加签 addSignature、减签 reductionSignature + */ +export function taskOperation( + taskOperationData: TaskOperationData, + taskOperation: TaskOperationType, +) { + return requestClient.postWithMsg( + `/workflow/task/taskOperation/${taskOperation}`, + taskOperationData, + ); +} + +/** + * 修改任务办理人 + * @param taskIdList 任务id + * @param userId 办理人id + */ +export function updateAssignee(taskIdList: IDS, userId: ID) { + return requestClient.putWithMsg( + `/workflow/task/updateAssignee/${userId}`, + taskIdList, + ); +} + +/** + * 驳回审批 + * @param data 参数 + */ +export function backProcess(data: any) { + return requestClient.postWithMsg('/workflow/task/backProcess', data); +} + +/** + * 获取可驳回节点 + * @param definitionId 流程定义ID + * @param nodeCode 当前节点编码 + */ +export function getBackTaskNode(definitionId: string, nodeCode: string) { + return requestClient.get<{ nodeCode: string; nodeName: string }[]>( + `/workflow/task/getBackTaskNode/${definitionId}/${nodeCode}`, + ); +} + +/** + * 获取当前任务的所有办理人 + * @param taskId 任务id + */ +export function currentTaskAllUser(taskId: ID) { + return requestClient.get(`/workflow/task/currentTaskAllUser/${taskId}`); +} diff --git a/apps/web-antd/src/api/workflow/task/model.d.ts b/apps/web-antd/src/api/workflow/task/model.d.ts new file mode 100644 index 00000000..8322e2b7 --- /dev/null +++ b/apps/web-antd/src/api/workflow/task/model.d.ts @@ -0,0 +1,74 @@ +export interface TaskInfo { + id: string; + categoryName: string; + createTime: string; + updateTime: string; + tenantId: string; + delFlag?: any; + definitionId: string; + instanceId: string; + flowName: string; + businessId: string; + nodeCode: string; + nodeName: string; + nodeType: number; + permissionList?: any; + userList?: any; + formCustom: string; + formPath?: any; + flowCode: string; + version: string; + flowStatus: string; + flowStatusName: string; + assigneeIds: string; + assigneeNames: string; + processedBy: string; + type: string; + nodeRatio?: string; + createBy: string; + createByName: string; + targetNodeName?: string; +} + +export interface CompleteTaskReqData { + messageType: string[]; + flowCopyList: { userId: string; userName: string }[]; + taskId: ID; + taskVariables: Record; + variables: any; + // 附件ID 1,2,3,4形式 + fileId?: string; +} + +export interface StartWorkFlowReqData { + /** + * 业务ID + */ + businessId: ID; + /** + * flowCode + */ + flowCode: string; + /** + * 流程变量 + */ + variables: Record; +} + +export interface TaskOperationData { + message?: string; + taskId: ID; + // 单个操作人 + userId?: ID; + // 多个操作人 + userIds?: IDS; +} + +/** + * 操作类型,委派 delegateTask、转办 transferTask、加签 addSignature、减签 reductionSignature + */ +export type TaskOperationType = + | 'addSignature' + | 'delegateTask' + | 'reductionSignature' + | 'transferTask'; diff --git a/apps/web-antd/src/bootstrap.ts b/apps/web-antd/src/bootstrap.ts index f842021c..b2d106e8 100644 --- a/apps/web-antd/src/bootstrap.ts +++ b/apps/web-antd/src/bootstrap.ts @@ -1,6 +1,7 @@ import { createApp, watchEffect } from 'vue'; import { registerAccessDirective } from '@vben/access'; +import { initTippy } from '@vben/common-ui'; import { preferences } from '@vben/preferences'; import { initStores } from '@vben/stores'; import '@vben/styles'; @@ -19,6 +20,15 @@ async function bootstrap(namespace: string) { // 初始化组件适配器 await initComponentAdapter(); + // // 设置弹窗的默认配置 + // setDefaultModalProps({ + // fullscreenButton: false, + // }); + // // 设置抽屉的默认配置 + // setDefaultDrawerProps({ + // zIndex: 1020, + // }); + const app = createApp(App); // 全局组件 @@ -33,6 +43,9 @@ async function bootstrap(namespace: string) { // 安装权限指令 registerAccessDirective(app); + // 初始化 tippy + initTippy(app); + // 配置路由及路由守卫 app.use(router); diff --git a/apps/web-antd/src/components/cropper/index.ts b/apps/web-antd/src/components/cropper/index.ts index b74a1272..6afad017 100644 --- a/apps/web-antd/src/components/cropper/index.ts +++ b/apps/web-antd/src/components/cropper/index.ts @@ -1,4 +1,3 @@ -export { default as CropperImage } from './src/cropper.vue'; - export { default as CropperAvatar } from './src/cropper-avatar.vue'; +export { default as CropperImage } from './src/cropper.vue'; export type { Cropper } from './src/typing'; diff --git a/apps/web-antd/src/components/cropper/src/cropper-avatar.vue b/apps/web-antd/src/components/cropper/src/cropper-avatar.vue index 5e17d2f2..a29aab2e 100644 --- a/apps/web-antd/src/components/cropper/src/cropper-avatar.vue +++ b/apps/web-antd/src/components/cropper/src/cropper-avatar.vue @@ -1,18 +1,14 @@ + + diff --git a/apps/web-antd/src/components/tinymce/src/editor.vue b/apps/web-antd/src/components/tinymce/src/editor.vue index 05950305..d3511d10 100644 --- a/apps/web-antd/src/components/tinymce/src/editor.vue +++ b/apps/web-antd/src/components/tinymce/src/editor.vue @@ -2,6 +2,10 @@ import type { IPropTypes } from '@tinymce/tinymce-vue/lib/cjs/main/ts/components/EditorPropTypes'; import type { Editor as EditorType } from 'tinymce/tinymce'; +import type { PropType } from 'vue'; + +import type { UploadResult } from '#/api/core/upload'; + import { computed, nextTick, @@ -9,7 +13,6 @@ import { onBeforeUnmount, onDeactivated, onMounted, - type PropType, ref, unref, useAttrs, @@ -22,7 +25,7 @@ import { buildShortUUID } from '@vben/utils'; import Editor from '@tinymce/tinymce-vue'; import { isNumber } from 'lodash-es'; -import { uploadApi, type UploadResult } from '#/api/core/upload'; +import { uploadApi } from '#/api/core/upload'; import { bindHandlers } from './helper'; import ImgUpload from './img-upload.vue'; diff --git a/apps/web-antd/src/components/tinymce/src/helper.ts b/apps/web-antd/src/components/tinymce/src/helper.ts index e169f501..1f98dda4 100644 --- a/apps/web-antd/src/components/tinymce/src/helper.ts +++ b/apps/web-antd/src/components/tinymce/src/helper.ts @@ -4,9 +4,9 @@ const validEvents = new Set([ 'onBeforeAddUndo', 'onBeforeExecCommand', 'onBeforeGetContent', + 'onBeforePaste', 'onBeforeRenderUI', 'onBeforeSetContent', - 'onBeforePaste', 'onBlur', 'onChange', 'onClearUndos', @@ -42,8 +42,8 @@ const validEvents = new Set([ 'onMouseOver', 'onMouseUp', 'onNodeChange', - 'onObjectResizeStart', 'onObjectResized', + 'onObjectResizeStart', 'onObjectSelected', 'onPaste', 'onPostProcess', diff --git a/apps/web-antd/src/components/tree/index.ts b/apps/web-antd/src/components/tree/index.ts index 3dfcd39a..f142790a 100644 --- a/apps/web-antd/src/components/tree/index.ts +++ b/apps/web-antd/src/components/tree/index.ts @@ -1 +1,2 @@ +export { default as MenuSelectTable } from './src/menu-select-table.vue'; export { default as TreeSelectPanel } from './src/tree-select-panel.vue'; diff --git a/apps/web-antd/src/components/tree/src/data.tsx b/apps/web-antd/src/components/tree/src/data.tsx new file mode 100644 index 00000000..2bbaf317 --- /dev/null +++ b/apps/web-antd/src/components/tree/src/data.tsx @@ -0,0 +1,85 @@ +import type { VxeGridProps } from '#/adapter/vxe-table'; +import type { ID } from '#/api/common'; +import type { MenuOption } from '#/api/system/menu/model'; + +import { h, markRaw } from 'vue'; + +import { FolderIcon, MenuIcon, OkButtonIcon, VbenIcon } from '@vben/icons'; + +export interface Permission { + checked: boolean; + id: ID; + label: string; +} + +export interface MenuPermissionOption extends MenuOption { + permissions: Permission[]; +} + +const menuTypes = { + C: { icon: markRaw(MenuIcon), value: '菜单' }, + F: { icon: markRaw(OkButtonIcon), value: '按钮' }, + M: { icon: markRaw(FolderIcon), value: '目录' }, +}; + +export const nodeOptions = [ + { label: '节点关联', value: true }, + { label: '节点独立', value: false }, +]; + +export const columns: VxeGridProps['columns'] = [ + { + type: 'checkbox', + title: '菜单名称', + field: 'label', + treeNode: true, + headerAlign: 'left', + align: 'left', + width: 230, + }, + { + title: '图标', + field: 'icon', + width: 80, + slots: { + default: ({ row }) => { + if (row?.icon === '#') { + return ''; + } + return ( + + + + ); + }, + }, + }, + { + title: '类型', + field: 'menuType', + width: 80, + slots: { + default: ({ row }) => { + const current = menuTypes[row.menuType as 'C' | 'F' | 'M']; + if (!current) { + return '未知'; + } + return ( + + {h(current.icon, { class: 'size-[18px]' })} + {current.value} + + ); + }, + }, + }, + { + title: '权限标识', + field: 'permissions', + headerAlign: 'left', + align: 'left', + slots: { + default: 'permissions', + }, + }, +]; diff --git a/apps/web-antd/src/components/tree/src/helper.tsx b/apps/web-antd/src/components/tree/src/helper.tsx new file mode 100644 index 00000000..9ce64a21 --- /dev/null +++ b/apps/web-antd/src/components/tree/src/helper.tsx @@ -0,0 +1,133 @@ +import type { MenuPermissionOption } from './data'; + +import type { useVbenVxeGrid } from '#/adapter/vxe-table'; +import type { MenuOption } from '#/api/system/menu/model'; + +import { eachTree, treeToList } from '@vben/utils'; + +import { difference, isEmpty, isUndefined } from 'lodash-es'; + +/** + * 权限列设置是否全选 + * @param record 行记录 + * @param checked 是否选中 + */ +export function setPermissionsChecked( + record: MenuPermissionOption, + checked: boolean, +) { + if (record?.permissions?.length > 0) { + // 全部设置为选中 + record.permissions.forEach((permission) => { + permission.checked = checked; + }); + } +} + +/** + * 设置当前行 & 所有子节点选中状态 + * @param record 行 + * @param checked 是否选中 + */ +export function rowAndChildrenChecked( + record: MenuPermissionOption, + checked: boolean, +) { + // 当前行选中 + setPermissionsChecked(record, checked); + // 所有子节点选中 + record?.children?.forEach?.((permission) => { + rowAndChildrenChecked(permission as MenuPermissionOption, checked); + }); +} + +/** + * void方法 会直接修改原始数据 + * 将树结构转为 tree+permissions结构 + * @param menus 后台返回的menu + */ +export function menusWithPermissions(menus: MenuOption[]) { + eachTree(menus, (item: MenuPermissionOption) => { + if (item.children && item.children.length > 0) { + /** + * 所有为按钮的节点提取出来 + * 需要注意 这里需要过滤目录下直接是按钮的情况item.menuType !== 'M' + * 将按钮往children添加而非加到permissions + */ + const permissions = item.children.filter( + (child: MenuOption) => child.menuType === 'F' && item.menuType !== 'M', + ); + // 取差集 + const diffCollection = difference(item.children, permissions); + // 更新后的children 即去除按钮 + item.children = diffCollection; + + // permissions作为字段添加到item + const permissionsArr = permissions.map((permission) => { + return { + id: permission.id, + label: permission.label, + checked: false, + }; + }); + item.permissions = permissionsArr; + } + }); +} + +/** + * 设置表格选中 + * @param checkedKeys 选中的keys + * @param menus 菜单 转换后的菜单 + * @param tableApi api + * @param association 是否节点关联 + */ +export function setTableChecked( + checkedKeys: (number | string)[], + menus: MenuPermissionOption[], + tableApi: ReturnType['1'], + association: boolean, +) { + // tree转list + const menuList: MenuPermissionOption[] = treeToList(menus); + // 拿到勾选的行数据 + let checkedRows = menuList.filter((item) => checkedKeys.includes(item.id)); + + /** + * 节点独立切换到节点关联 只需要最末尾的数据 即children为空 + */ + if (!association) { + checkedRows = checkedRows.filter( + (item) => isUndefined(item.children) || isEmpty(item.children), + ); + } + + // 设置行选中 & permissions选中 + checkedRows.forEach((item) => { + tableApi.grid.setCheckboxRow(item, true); + if (item?.permissions?.length > 0) { + item.permissions.forEach((permission) => { + if (checkedKeys.includes(permission.id)) { + permission.checked = true; + } + }); + } + }); + + /** + * 节点独立切换到节点关联 + * 勾选后还需要过滤权限没有任何勾选的情况 这时候取消行的勾选 + */ + if (!association) { + const emptyRows = checkedRows.filter((item) => { + if (isUndefined(item.permissions) || isEmpty(item.permissions)) { + return false; + } + return item.permissions.every( + (permission) => permission.checked === false, + ); + }); + // 设置为不选中 + tableApi.grid.setCheckboxRow(emptyRows, false); + } +} diff --git a/apps/web-antd/src/components/tree/src/hook.tsx b/apps/web-antd/src/components/tree/src/hook.tsx new file mode 100644 index 00000000..b7a70ad8 --- /dev/null +++ b/apps/web-antd/src/components/tree/src/hook.tsx @@ -0,0 +1,62 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import type { TourProps } from 'ant-design-vue'; + +import { defineComponent, ref } from 'vue'; + +import { useLocalStorage } from '@vueuse/core'; +import { Tour } from 'ant-design-vue'; + +/** + * 全屏引导 + * @returns value + */ +export function useFullScreenGuide() { + const open = ref(false); + /** + * 是否已读 只显示一次 + */ + const read = useLocalStorage('menu_select_fullscreen_read', false); + + function openGuide() { + if (!read.value) { + open.value = true; + } + } + + function closeGuide() { + open.value = false; + read.value = true; + } + + const steps: TourProps['steps'] = [ + { + title: '提示', + description: '点击这里可以全屏', + target: () => + document.querySelector( + 'div#menu-select-table .vxe-tools--operate > button[title="全屏"]', + )!, + }, + ]; + + const FullScreenGuide = defineComponent({ + name: 'FullScreenGuide', + inheritAttrs: false, + setup() { + return () => ( + + ); + }, + }); + + return { + FullScreenGuide, + openGuide, + closeGuide, + }; +} diff --git a/apps/web-antd/src/components/tree/src/menu-select-table.vue b/apps/web-antd/src/components/tree/src/menu-select-table.vue new file mode 100644 index 00000000..a8a570b6 --- /dev/null +++ b/apps/web-antd/src/components/tree/src/menu-select-table.vue @@ -0,0 +1,412 @@ + + + + + + diff --git a/apps/web-antd/src/components/tree/src/tree-select-panel.vue b/apps/web-antd/src/components/tree/src/tree-select-panel.vue index 9a2a7744..e7597f91 100644 --- a/apps/web-antd/src/components/tree/src/tree-select-panel.vue +++ b/apps/web-antd/src/components/tree/src/tree-select-panel.vue @@ -3,7 +3,9 @@ import type { CheckboxChangeEvent } from 'ant-design-vue/es/checkbox/interface'; import type { DataNode } from 'ant-design-vue/es/tree'; import type { CheckInfo } from 'ant-design-vue/es/vc-tree/props'; -import { computed, nextTick, onMounted, type PropType, ref, watch } from 'vue'; +import type { PropType, SetupContext } from 'vue'; + +import { computed, nextTick, onMounted, ref, useSlots, watch } from 'vue'; import { findGroupParentIds, treeToList } from '@vben/utils'; @@ -108,8 +110,8 @@ const stop = watch([checkedKeys, () => props.treeData], () => { * @param info info.halfCheckedKeys为父节点的ID */ type CheckedState = - | { checked: T[]; halfChecked: T[] } - | T[]; + | T[] + | { checked: T[]; halfChecked: T[] }; function handleChecked(checkedStateKeys: CheckedState, info: CheckInfo) { // 数组的话为节点关联 if (Array.isArray(checkedStateKeys)) { @@ -157,6 +159,8 @@ onMounted(async () => { expandedKeys.value = allKeys.value; } }); + +const slots = useSlots() as SetupContext['slots'];