From 2c0812be7b989e88a83fae3e29bea56f82b39260 Mon Sep 17 00:00:00 2001 From: weiweiw <14335254+weiweiw22@user.noreply.gitee.com> Date: Wed, 23 Oct 2024 08:03:27 +0800 Subject: [PATCH] first commit --- .gitignore | 16 ++ LICENSE | 21 ++ README.md | 39 +++ bonus-ai-architecture.jpg | Bin 0 -> 62448 bytes bonus-modules/bonus-ai/pom.xml | 123 ++++++++ .../java/com/bonus/ai/BonusAIApplication.java | 36 +++ .../controller/AnnotationTaskController.java | 90 ++++++ .../controller/AnnotationTeamController.java | 57 ++++ .../ai/controller/BasicFileController.java | 78 ++++++ .../ai/controller/DatasetController.java | 85 ++++++ .../bonus/ai/controller/LabelController.java | 75 +++++ .../java/com/bonus/ai/domain/AiDataSet.java | 114 ++++++++ .../com/bonus/ai/domain/AnnotationTask.java | 159 +++++++++++ .../com/bonus/ai/domain/AnnotationTeam.java | 17 ++ .../java/com/bonus/ai/domain/BasicFile.java | 112 ++++++++ .../main/java/com/bonus/ai/domain/Label.java | 62 +++++ .../com/bonus/ai/domain/ReleaseVersion.java | 80 ++++++ .../ai/domain/enums/AnnotationFileStatus.java | 25 ++ .../ai/domain/enums/AnnotationTaskStatus.java | 23 ++ .../bonus-ai/src/main/resources/banner.txt | 10 + .../bonus-ai/src/main/resources/bootstrap.yml | 35 +++ .../bonus-ai/src/main/resources/logback.xml | 74 +++++ scripts/ai_bootstrap.yml | 35 +++ scripts/auth_bootstrap.yml | 35 +++ scripts/deploy.sh | 87 ++++++ scripts/file_bootstrap.yml | 29 ++ scripts/gateway_bootstrap.yml | 58 ++++ scripts/gen_bootstrap.yml | 29 ++ scripts/job_bootstrap.yml | 29 ++ scripts/system_bootstrap.yml | 33 +++ scripts/visual_bootstrap.yml | 29 ++ sql/bonus_ai.sql | 262 ++++++++++++++++++ 32 files changed, 1957 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 bonus-ai-architecture.jpg create mode 100644 bonus-modules/bonus-ai/pom.xml create mode 100644 bonus-modules/bonus-ai/src/main/java/com/bonus/ai/BonusAIApplication.java create mode 100644 bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/AnnotationTaskController.java create mode 100644 bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/AnnotationTeamController.java create mode 100644 bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/BasicFileController.java create mode 100644 bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/DatasetController.java create mode 100644 bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/LabelController.java create mode 100644 bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/AiDataSet.java create mode 100644 bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/AnnotationTask.java create mode 100644 bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/AnnotationTeam.java create mode 100644 bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/BasicFile.java create mode 100644 bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/Label.java create mode 100644 bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/ReleaseVersion.java create mode 100644 bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/enums/AnnotationFileStatus.java create mode 100644 bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/enums/AnnotationTaskStatus.java create mode 100644 bonus-modules/bonus-ai/src/main/resources/banner.txt create mode 100644 bonus-modules/bonus-ai/src/main/resources/bootstrap.yml create mode 100644 bonus-modules/bonus-ai/src/main/resources/logback.xml create mode 100644 scripts/ai_bootstrap.yml create mode 100755 scripts/auth_bootstrap.yml create mode 100755 scripts/deploy.sh create mode 100755 scripts/file_bootstrap.yml create mode 100755 scripts/gateway_bootstrap.yml create mode 100755 scripts/gen_bootstrap.yml create mode 100755 scripts/job_bootstrap.yml create mode 100755 scripts/system_bootstrap.yml create mode 100755 scripts/visual_bootstrap.yml create mode 100644 sql/bonus_ai.sql diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e9a196f --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +*.log +*.log.* +*.bak +logs +**/target +.idea/ +*.class +*.manifest +*.spec +.DS_Store + + + + + + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..bd95df1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 若依 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..c3ffaf6 --- /dev/null +++ b/README.md @@ -0,0 +1,39 @@ +

+ logo +

+

bonus v3.6.4

+

基于 Vue/Element UI 和 Spring Boot/Spring Cloud & Alibaba 前后端分离的分布式微服务架构

+ + +## 平台简介 + +博诺思人工智能平台是基于博诺思微服务平台的轻量级系统,基于Spring Boot、Spring Cloud、Spring Cloud Alibaba、OAuth2.0、JWT、Redis、MyBatis、Shiro、Quartz、Swagger、EasyExcel、EasyPoi、Layui、Element UI、Vue、Nginx、Docker、Maven、Git、GitHub、Gitee、Jen + +博诺思微服务平台代码仓库:http://192.168.0.56:3000/bonus/Bonus-Cloud.git + +## 系统模块 +~~~ +com.bonus +├── bonus-api // 接口模块 +│ └── bonus-ai-api-system // 系统接口 +├── bonus-modules // 业务模块 +│ └── bonus-ai // 人工智能平台系统模块 +├──pom.xml // 公共依赖 +~~~ + +## 人工智能平台架构图 + + + +## 软件版本要求 +~~~ + +软件名称 版本要求 推荐版本 +JDK >= 1.8 1.8 +Mysql >= 5.7.0 5.7.0 +Redis >= 3.0 7.2.3 +nacos >= 2.0.4 2.1.0 +sentinel >= 1.6.0 1.8.7 +Maven >= 3.0 3.9.6 +Node >= 12 16.9.0 +~~~ diff --git a/bonus-ai-architecture.jpg b/bonus-ai-architecture.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c1b3db7939acf87f8fc9ec85b47ac23f49366f22 GIT binary patch literal 62448 zcma&O1z3}B7%x0f!hwR4N{RuD6hRRs6^oJ>HDZWJkM5LGLBOB{DU}?fVWUex3CS^F z0|cbIg%Rh)&Hp*ych2`+hwI|v+RO7kdB^Ym-S@NCPt+fr244V!K%mo)9^TUefli`9 zpc5su)WDO+KYzyoe<)nE9w>qGe{#+NA5K~-swsj%MbUKoW>moEQ;rV}TtJ{RO~=0! ztq$4GK%kA#NB0zUJWUo4R-!NC{APB4PWpE<_#B-*vGMHaB^5nWgm-VkD9v^KWfs>L zFU*XDsX0%aOZ&F$`h$Du(oX*%vuM# z*K=3RMa}VHOJvt;7rvjjocJUpu1j3^uQsipYy0!=-8)T#kLOblQ<#n>Mm)wktt2l* z-v83`?@#Hq@&G3%r+5E7AphIk?uhRMupr>)ez+su@!!G|mO~SJPVQz|pfs@%*zu!4 zRF!n)I}!B_j+xe>2CVH+Y}&|oL@L`tvhak(oV%mzkk^P%M9I@h<10Hwqa7Qstx`)J zBGnm6gfzcrnfH0~wBH$HNooJ_Stj56&9KX>rWW6^@B`^~*0sujhE)W z`l&5?sCTtvhHGZ8Xf3*`2KB3RG1w=6*Tt}O9})Op?6 zudW$Z_-BEIzdD^)(_+WE7W9NSv4&z0FEvO`omI5W({G|1B^a=a1+8n9|LDC@eIm6KWcses&i ze*HKVDiig>Ji*ICcQ44gvp+AhugWB7pp*Gxz?5<&QGRFgcN^lzX&yDZm<$FY-A&~$ zmy8>)dg`)!N(phd`;1N%IT4wu%@91S5v$TDS3)4yCGxKQqLEZ`us$? zgz%aYgXNMrRy+% z&4|H1Yfr?BaSTY6<*v8M#@{Q88PVl@_Q)Iq1*0vag3%g@qS4VG3yA!UsC5iTPrMIbH)dyAB(5}amZ>$ODzC)COaye8gg2T*0(_v|F=z4{ zTh*!HMIZJtDTA#8d-+M}2%d!H3=_;$)T5?7Z{bD}`t#$g$D5xPd@rL5Z1l&~(RK0k ze2PP#E^CGt%cGpus793YZHu%R+KhFJ8V?nE%Djh#9SrDP-k$;fTfcJs2@4C7uXfty zc2*BZUHaC2Ol&<5SJj#L-lcq&Gi z;TT#HATwoU;xUF|Uk$hs89Y^1SQpX~0$FJErqtCr|nbLuU+`m0glEP~>Ab7UY& zAD!GaI5uieSlz`On=(MVd&nmOs<$FH1Hnsa0gHJ2BW_5V8VJNLLYD5%8T8DG)BDOhLDc59-}_nlkAk_=G&HI`^wwBH4ogupq5~gbUj}jzrB(K zUnoQK;BSG%MM-0bYlF*Y4XNRaq`~2tIz?0<^9Q7PUU!{Y;pt^LTYs4}Vtt1|{~kRQ z2D%zV?lWxp6(}=={NZ6!kIWzEtnH&Ah0g zdh^4e9OM7VcuQJFk!$#ya`N^jLyv;>c1C}FzI(px+~*b>K6m$`(XAxUaS zV9Ri&?~LDVs>Q^{_qNIpGalzXF5AI&q%r#$j=Jcz)kqre|)N)K-rUYdyX! zWu!*)(`FeeRsN|J{qv>?=JqGr#F$jcIxcm zMiUgHd4!UKNu4S^>2y?eTFzjX z0HY!EPR{|-97?!(K5vT~;l}WlEETsi6n~$8$W8oG_@yEOc73FaT1~W2^Si~}^y0=J zbnk~Dg+Uf-7Y)v{V^1WO+sCU~#ev)wDjg zF?jIet=Ik){HZ1pG3M*lGo``=iE~|FjQGzYc8SyW@@KZQN!Dhu9}wD7bfD~$x24Z9 zEGIQ0u3z^nlom#_y%ZgH-El;IGNqPz9e5Sot5u4!7}v$ioYPfqzNpELfG&7-ifZWU zeY6l6kBh5l6;53#UbPw8+$QNteMrxhvp#=q8O6IC#JZAbmSFw+a>sUtz#FH~9Wt`+ zDv}h?)dVw4S+#R}lIYG@=SHe|S<3B}sp{d4frH%1SOi)5Q?gYi?&iOLRTF+99*bF> z`!zer(JwppT&{o~X;Tflx;1D5X9_W~kA>yN7_uU!RC!tMWR9?{)c$ajIW4dfWpP;2 zRC|(0U`6aw=rSk92JgkYE*_XO@gV=FC^XK#e|4ZeINo9fX-q6^;~zN_wfxcT0CLp@ zrl?x$>tuM+$e+<%pnGiwzZGor+1Ug}cOsGZB&;z+Z?xQom_UciX(9AK(!JGHAu_bJYnJh1|UQ0`@u8+Qn-@_^hl{Bbo zHnY$O;?^z1nB`gaPc}pp(1xkLn$&|_X{Lx=uEN(}eMIy-kiK1nwJTF-3v-XqUJ5vC zSJ8&H@nd^C)p=4+w0?d1rj*O4n)(jMR>h#(XcqH*f4 z1%(H(JJ1n7!-MXtNM-p3>|w=9U>bGrYHSd7v0MQ=$&2e%4$sH-u{JAaWaFfGp^AF& z3L89IWr*qKN{^MI&-#GhM(tN!U5lEdv6A+>1Fy4)8jp`$0aIB+0WybP+a){U`B-C` zkNkgSJ@6DCp-~i*)_5A6pBc`f)@SAKa-tczyP{!%+1l$WDX7^}jH_9DzFmfk$dB+Z z)8ioT2m9&EUGVk6tI&Rd!Y3e#ytWl*{V*7tgN5mz7O~eMNx&-v8uUH7 z82rPWL+8;K99!&*!H`PM@|rN_l>GGzBxf1;+8|?sVzv!xOX2s#%^FhQyI_ai5&t(- zqsV3?oDTmBQd;}|=0U%$U2M3>OS0-;=FU4m$lSmh7Dav#((t>7KS<;a1<7uzzRE4H zG?C-c4-?I2KSA!1v5|IDnI$lnK>0skbENZovc*$ycSq zXS<62YIJ0d5MRNiH>b!AzoFSLos#`iGLv)Ig!w02*(!X-KMGGl?KI0mi!PG(`Zc^- z#4a4i*g}R)SA*b`Nf)MVXN6%#@;^lvnHm3W#~=D})*Ise2o&3co5ju6{*(LCw=v!# zRp&}MhL$#-)_hQ|76!CY^mc)dg_EwGuYLT`lJZ^g8F?Q0>gyZG8R&Pk%SdORy#r6p z^QaGv^_~XIXHtYGmZCYxa}HE`eS6HuDk~6czq6%%QX+C(h0yjy&=kjzz`XybeHc=y z&Y<=dt9(A~$}X`sH_lHuHKHymDl#am|G=m|BlYFb>*NKUu8Xw=N%_lUr_0W1Ecot4 zeNjHj)Y>I9?T3extA2?1?t$9YJ2pfHrC_H@m_>Q)0uibm*~##hSq6I|BV$v#>}^|k zlZb5VzEhK*s_fNq-8bZeR2ctuMep&q#PZt%aY*Un56N@>H>{k^B2NVxDKLq&mqFoF z?TJdo5+O*MhxT~Hvu*Tvg~zGE^+|WfEv6y^ELxGh`fbA7P2TnZTJ}{92TIdPVF)l703?8Itt8;iRA% zQ1s9h{(}4d0ll0AS3$4T9OPHXmLf~e{ar)-_p=ByE^xWdyAxjpI&8p2o0aFa>Xpf3 z-YkWH-<(Jn7(Tfo#8VqDD-#eSyI%YR2X&$)8dL7Yx1_djJ0eZr-~H zWh=8cmG5B1O?tHs0l;&uZ?qt$3n$kSx3Xd8{uGD3rcy9z=tdYQnp?Q9_=>K$zge?0 zvUT%Yr%&nG8wbmBAL>Lm`*@<44sc@~hrj;-?qn~?)WZM4Kzj8K+3I~?%J-g-sPa1) zzJOJ+9BO1p2+GaA!eV^-qUK{C3oMw3*by5vk#iWQERz=Q+go$7qDK!?3ND$mAnZR- zQ=7Vpdr=v9qvrg<@~*HY*lwxm?w2XBtktCL9@k!-?F<%hXYPmNG(%k}0oQ%7Kbb}> z|83tlBW#Cy9vQYOv_fxrjq5_*8tNAPrcvL56k>MGdJM{GGy8Hu^Ac4x0!qja%5L&h zMnB%Fc8OImVE2$Zz!WG2so2{wZ|`0V^M^1u-TBjio$?s{Uc0|8RxBn@)IHSG)QrWE zgP8hPf`h|qn2g-dZj}uzEZSEwPFS_8Cm~9oBo@~osQ|2v49uJ&j=y zq|Aocsfa6XLuKNNg?}N3W$Hd4SZ?M^L@3y%Y}QWbIW+6k%s^_kBS{wUzAAs3F~sr4 zj0cYnl@7$}ktCBGl;ug-=_nGu9kee3tQHSikRTDgB&+)+%(3lN+!dh;!$y?y=)T`+ zn2J6NSC*PUg4JhS-`gO%MGeTW3lj_Es0!#k<@PBwbDrnLK1k3nYt1(nZhtXun8CtJ z*wns+{^Jms@d>_AxZ*5xxwm84<<*j|blWN29}GX*{50+qut>S_yI>6izqHBLT-8~c zX)(mBrHyit^=0rUwd*J^A-v)-|H01;WXZr|K=G*OoD_#0?ZGXdR7Macn4Xz_VGAIf8qjdP(SO4Rk{%Ri$T0fUZ0VoPVyt$lRla6&S+S0Xli*S}kh}8Iat!%bL7| zG7!`$9#=iP|0iAZY@o40^^<)aUgl6~mV#lS{Aan=`JW6kX+O;`w2bSb*4wBJ8=Q)X z22`5cyNPZK7xiT8ofqy?3?^8bM%JIw3lm+@8)ED~z0M@?(_eKeY z@!=D{PsWE&Z=(o}mobhiBWGU-l3~od$EWGf2!B!Ne^aIGaZmLm`NWvVSqIiWIvny5 zOJ*u$_%i>=N%%ZR-aHV2TOQ$2#A<}NAh~NTFq&BxWSrBx@&mTB#4LXL-}4K%tpTf5 zj$#bCQJYCI3H=yrvsV*UAhbY^mver|$p1W(&;6X={oDvSFnU;l9JN;(PoQLwvhR`# zy{ti~e!yYY2W5m}vlvy>&?BX%YDX{V#ea+V!Z9=r##t|Kup8#ncfa5FTd6;3^m4cMN=m%_xc{8zpK-mu z4QGmY|AD6B`CH$1Jo>N)Y9qch@r7u{exSS{ zMtDr6l^75HU?hao(0$P?0{%3xERg{I5?(KSfYC%!8Hd2Gk+3U!4iw_3Q)I3bxz9hX zGCq(hdlbQ?=OCzKz^}SS$;&p7knby+mh)2Ho<+Z*IP+~D{rEhE7QXyLNA0lRW)jbx zvJijlB(ya>(c~QB3QtKT59#>fjFq~Gr2?S~VGj#9psP!wvu}i6>pFcLF$pny!m|E5 z2odfCVv$1>3WL%6yxC-%W6Y^^Yfik)3S4iufo2Lbw*L#2pgUv^jK0xQCIki+zi~c^ zuI~#jIOo?ec0oz8H*s8-@s7yPj?IRNLV^kBY)Ico6Uy1&;885?+t0kHM@2RFwqkH? zHYoL2Sg1`UxMzZdo4P_tmQh^1y-~!NOM^uwuq)Ki+i&r!w{5VaP-gxsup@~gWDGy1 z2%Xpg^kl*R#tP=2R#w&~62Qf_{tw4xieR)H*LrQ~FGS1KAVkN!#&jI!%KZ_zt0U)- z9ec>`%CX#Wlg^r4X8LrUP~lp`pHq*S@p;K}Sxo$M+d>Q~8p| ztI-a`G9#|FunrS^h$Fwsz69DXm}QT#IB=EQN5;w zq0y>zkWC9u7G9LO0k^gL(W?FuuHJK{#Pdv!jU-dt)JE#{g{kY+egaW7vbxVl*JmWI zlGR%&6K}>x=&c?xreZMvDlW9#TX_J^&rY<`X{lb>P$1)-XG+5OvJOp!wfEUWBUOdtou0Te`e|aJS?W?i};8xw2oB zB5bawmukYu4pHC?dbs5m<6ZB$-mS=1uua|&Es(e=$7T@hGcu>s#bL6zm;{yW)?k^v`E=U**J$3!C zmfhn~df53LfQQK3O^-+NeT^*GeUZgubg<~)AD4W`m;bicA!?EElZmu~`r&;?75O_jL+{F-xRNM-ZE6#7+9)jKuDUVh~+Zcafx<2^JmoO(kl0~FyxEYZQS3UiXUsMUENon#=Rl~+?djnMizxw{hBgE zY#at26iB(CB|h#Ud%_poiEl(+tRcfd1)iVLCCxn<$*Z5ZsmJ50{G42ys{9^eLX%xa zXkJ_u{pEZyyHdzzw0qQpWFXTRxP;JJF9s^d<67F%*Qpn@o+wI(TNtHfytU27`jZ5& z`(LD_3Zua-6l{oVr(SRXvgJu#$=keN(ACzn7+Ihmz^zw@A4&*x@;T&lp z51#~nT@JYW)z94bvR$wVte~bWRKbJHF`T@SYozsklIl*5!sCti6z}Y(_Uz5HhN{~H znZED#8B2x2l;N!My5>`Hj0h=G`XcaqHw|v!(7M|z&B5E=FLP&Jgi3tjq?iflHzi-6 zY**;5o?;^yl`bg>hw;Yrm)l#$=D+)FUx}Y1vbLg}sv^uAQJkdXy~k{4e8w5RL^;k{ zo^wRUDm<5nJB~6|mu(wS*_6n|Om>->dn1*w?))IV3zT*-wY45JSH4y^PEX+ z^q5u!3ypPhg19J`%*R%&%iNO+i}Fd?cE^(lHe3lu7j~ z{x%PR4c^dh9&ER@E8%VV3(H5-mcdcO`S5JVHfr6!=`+A}=cdeaB3PnV%578b&etxl zmD+RUV-tr0R(2)J&c6gO&2i2M9+_dIA~`*9Ou1_-9O=|xyFyu*J1_`WE~N|jzl^gn z%ZHqSUVAF--SuW`0G;Q4vU{TQ6TLt)vfbuoFG7zFV$4&k2yh>UC{=pHSr_XnR?OV- z##f5Z#=_)CGyiV=300(H4^VdQYM?G2fTyPu$fg@(-Lh){}mr`uV@bkYsX-D35Y zG8l8pz$*AHo(DUTK{+R{BXnW2zm=qR2DdRWllHMYTT1l{sa+|{?6g12ydy}S$@xGh zdogO;!;bjINo%&s3ot@b$&gfP%MPL(18JSlHAV{Lu74JN{TZ%;h1H90GC7(FY^G$5 zWsUCiZxXT9MI_M__qkxZ;QWl=J>S{3ga0c#8)d#Vz%2%75@qN8?yUry`^l4JMBK;x z!o$%XxrLKZ^H7Sa&w(oGkb)|w+!{;YKPKCUK0FCY=4UXZv+qbzA8ftPpOXWohvS+3 z6L4d%g#4xXDwvEH z)wY^qd=ScE#OK*zW(vkD`o`PoQGV5KsQaUR==N0IA1C*PA>z={AwVh5xaa>P7~V*6 zYEgx$8@77#g%YPYMao7b{uRK@2 z+%;Eb=g3=MPZYvLziEZWjmjG-$W8B@CCOTe^p(b*@L@kE5X{?`{W)} zWYViTG?rUBA}cH);)_#<6mSH2*TC`Sx1*HwN@_&4K77f+FDxc~;j$|2~#n z9?(f)1LcvT>-t4i3txyVgM2qIp7;Z@s9M?po|uuz4eg4ifQyo+7fzWbNPksqtS$8= zr6`+KkJQPO}G6oua)cW(qvE5D0Ri|01qph^W z&gnq9s!%)F!~YYP@Xy72<9{=yWlSJyQn*>4rz%L$qB7(}{9sHqKTj_xS^0may{~|C zDzoj0duHVr?ylQEMb#N1Qn&pxd~3I_O+C|;HMOSieBTPO!mUAaq*eN3m50o>1$l;MV@ror`1TnQqcql+7KZZvXCjHH znIzh_{poTR&Mc#9HHS)q9+hE^ed4qdN(W&4Lf6P=$ANg0E2vpG6Iy>6+vGhL-gRY=!Q((UI z+O74o7Z6hmf}V6rH#@g%s4uCEmt&V zyLPyo&2G2L0Nq(BGm7eRN*J6So zJx)3HeW^bk*t(E&9+NMjIS^F;9XKcX&{}jW=a)XxEl%XWe%dlRkJM6AY)>420Jz2Q zqP#P#FQ>Nm9UuHFJn=gRFh}fCn)=Kkcg-S#k<(9pl<(iV0oQINSKFz_YQ#cM97;r zd7UYb;B0Oy6{@cWHAdov_Z`Rk8hVP@_61HpcAXOv`~<$6q`-`b#S5ND-m1K!YpyS1 zJM6yCe&~9zhCJxkH)vks?OwMU;Y|n+&h<2Gy)?@2kUZ~1Sm_;;ZxngMM%KS>__}tL z)@MxqOM8kqy80VmcrSA`mi8UwB7Be8do{){a3n1z=p%T0ScCP_3nx03N{zNKxiRVb z@qcPCew}G4PC%3(5!_an%&jA*d@+7mpuC}UFh4IPT@m6hs`vQ8V^k-9e^`{Ftz z={ar~zoO~^a+9sYjY29fRYLOB1b=_-*{7ywAszgW1)k>{eO7)@=EDkD#LN&wsw`Q2V-yUvRQt%Qsx?di6BffXd?QQR6_zTa(`yLkti zF)gsTo<#xAC8@Qlp;3<{)M-bh@+xHl9qAB1+=yTH$`QBK?>hLG9|dia2%!3}oz{yv ze{*MGC%tCB%Ky8lMX3AmDjHgDlX_x$mkVGYB^JEe{&b%sh*xg2cV{6i{-yGZ6`puhK@k-c#;|mhPh0r>kEHoxbnpVAx-%6dwBQikQ zpG?lhNS;&@v%#KCN*sj;X5mU_#bSU;oc6}g&Iiv}^a=a$%q#c8 z^DZEoyVB25scu)G>eh!wDPC!v^kY`uRPgt!{ZK;C`&H`#cy;Z z8F`cho6^1G>3^qte~-EMYi?AWAS6>2Gx1XJ#xqD2tGC%Bm_DbdYFJk?>;#z)9|_6JyarFzK|IvmcX{N-?`R*$A0C$`>*nx!ge_v z{HWc$d(&q#)z)*LF2}3>kgUUbhq-Yr>4F`7*9QMc3p_Nq-c8$>s@!vBg_OK?Ao+}= z(u(8kZDMJt!MT^P!^4-K{RDQ@CJr{T^k~s<_y*T^iiT5^^7h=5orymt?CRY8 z9VFyso8nJ33=qDIztuDNE%4`W*$C+p5UDj5bV3(QT?2&2GUC2VeCzC^`PQO*PX6c&k$RDlY`GHqV$X3= zd9S6dM@>6O*84MN<~2|&Dzn7%EDqLN0IA?^N$UH`gHI_Tp)gd#d!F7`%N#V1-N3#R zpgh`=eNfJzI;XeW)L0j^EH*u+hm&{L_-dzrBBKz&vPA9Zuv}}wWonYO>&hR$J+t(x zf@$nF06m+?hO2m*9U)k614iF7X2Qpzg(%-;#A*afPW#bxlL(FaXPwswS~ok&=Y>UZ zP9I?&YM?$cCO>}nQ6CEv;O*K6C<4h0R5EJGhpND z)htRruFFu-8rPL~$%(0IL9#gGHGnvKXBh>oKf`f@J7-bCTAD&lzAB4Ka z5L4TR0cxGd1k}|>BkTP&i2Q-S4ue#sQh&KqmT)dIi3+4ms`G%qXLkuV2f?|?N`0W-h0p(cokfL;3U<;D zlu0W5P`LT8ZafYs7Pr>hKIWH9+gY>RCB~mQ0d$Hz<=fk?mi15 zW+v_d&aL220p2aaPp(6K@i(MxhO6(!?dtq3&I4lA+(gCAmA>X4v%Bz5N3tI$ z)4L6JJmiyoCq+TH*7su$`!cpY?3d4v>=@%8g+0@}j&Iv3xY0GaqK#XMYtZ!n z#MzkeO?dqOObXMzXxqA7eYI&mQ|FJ? z%=VAP2fM>`rZ1=beOkYDz$8Ny8f-D`{=Wk_A|~Yg(<~4?UR}3$(dl)_Fh`;DT2l)t z-gwsylcMp&s1hH}k-8~|D#TWuDI7{d2$io-Af;zlvu=l+u@HZo8iETFt`ccP9oqS0 zzs1#mg`R~cj#crz9dyi^HJK4>y~Ss zU^7xDOGy&g9qDn-p;WC^QUB{5LAg$i;iZE;dNi}$SwyH#P1z7H@o*)bR-<=ZxxZsU z!7O~|c1J*+p)R#d&q6bU+C*C_+<+Oe8x5;wT>yfMZpmwSIunmw|F6rIsS&pMRjEE5 zs}--JjB)iMzRRE8SZMX4Khj2YjCDEft+Xr_EPpxZFJE+Lb|0G2+aLLuG`eQ9mrRT{ z9UI%clVh9x&VN!otcXT|x*o}6aDIdY`Ts3uRKHcZU<(Zm+cE9g9H*<^Tu1=l1 zLpaP4T3d>Zm1X<`T~wtW0=g5yQ*{ne^(zYMU){cnIz;Osu6w=F4nQK04k(eNc((hs zy3NR=>ha`$j?q%}Z+-mOQ-|)Zx8>*DcSbG~v@*^qahxtKaLmej+gKwsPZ4IOmSy+kPOGHDywFSX(il1rOM8YbSaIxp6L8?&^=atok!d|Je-)zU9K% zwv^SB^Xpc2#n#f{Zb0;ujQj1WTJNqZB~0i62~Bn@`UhR`2ng3ev|FP%sKEAwgN`57 z)ZFszjmTk?zjGewrK6DjLH_HcP-an`Ya>(pZE3zHB7=fJY}FJCc+1_3T5E=?A+X(I zX(PinYPBtK{;VbIBfAKo)XkJX!q>Fg&ppV`G*{+o*}*m9IXP1oLU3!}!N^!~z-`MT zYTJOSDc=>(xK<2!Js0;XfN;}i1Y}G?8~UOww1XdDY=$xX+oO*h_@Dd9uL^v!x+AKm zSn`xz5refmXxRS3`}O)r0r+W~%_RHS^z14EV%AAuww4r`;RRpj80 zeLs}RGvHaU(_e18QQDQCc{Irz{IZ$^Y$7FoUw~K<1=d z4QXE;CxH?MHR-R*Hg^%=XNie%=5D#8&f{q&G&xV+-Cw9Wd*57}q?`1~aP`SAc&=rHGSHf2AD`ckRn;zdzAjX5#DWw3B#d~5?pg|QiWAA_v19|T zWptAu3H*8H=oQV)eWT_$#LBZp)N$%^zHBiZ#~RTDAMUu_S$tfo5!?K+#$0)$?2coi zLlX?mou<4|%F|HZRoskiTKuNIJJE_P*JhZSC*F6YfwPn5^zq}}o3iqR_dtR`S)7?# zjz0ou8e+1g06BxYd>-){jX1C1by1h)@i8*M^9r3UXF(0eudkIJ{I2vWi3Uot;n}2~ z&VOtNEjVGOq8rLs{LA|1%+69yZLmIwZ@weqKpVt-;mX|%9o{(G(`fZ*q{a4H?yvSN z8_|^_n}u>HLV2fbsa{qOG)PL7!S6HMsnw`_p478l%C!BQn>nAZfi=P@gx;O|1u@{V zScaj-I1#()+IP4RO}7k~M=mGr7!x_|v*>HqcbB*4E{?MX){r2|^Jo0#8mI5=8$m0| zMnpfF#MdW!e#~4j)0QPb{$TYokzWvBA!z5}FuKJ3rQHSg%7F8RQviJT!E}}RZE&YL z($&k6VBd9#muuypblzso)YY_=WzO^C&Nb*UieE7lsa~hd(!oqcc4DjLn=323l+ z-}Z5tYuj7o6RKzL9cE^Q4Fuy7`PY2a^o#)&BZYQ>9~1gKVZF>x=cG4H8p`u1+ijKI zKHM~k9oJ}Wx3jXCo@zI;ip?eD{=lKJdZN5SRp+LS;1)r--)a+|yXQPK!Ty+r{H5#k?AoxqNVDS=i1qQw6e+K)X5QWu1c|0Iz z(9F*(#2=%P3PNWRgX{(G*<`og1rTwU7dmC~%9yF8yA^&MR#Y3#YKn1Q z%g}miP}RM^r4Ai|N}p~;qOSlY3FYS;DM0Qd5S;L$;`CK9Fxte2Sd{!&yAW$3yV=gQ zQ&Dr3!j8n$i=UYPd=m}6Ld9>aB*evrLKaftGt5!A&veXKR~U;csE~Aj08Ty4&W&09 zDnw-jHqotMs03>61P$-kQ^83Iw0ioEBFLkQ*xZp(BhcONSowg!qX*H4FsI3;o#F>G z(Zvr|&@W9vwAiwYgWFM>wRqvb;*Sr+G^F2z$Ifn+G?Gk7i1mw^(`n zh@FegFIS$4$sOrtviCC7gVIPjK==gn&pg8hNvfm}SX6oX+ZL|7_8Js#lnVF}qhCa< zHAX8 zi0kcjK&9p)Y{){c#yW#5(2E3Gt|ETEpco%;#2}K@HmkJQo`Cd86q&e_4#G@;8PQA; zzcBHr@W1U0sc7h)33s&h+)UJ|&lroOPQ=+$zoRKUMUu=$fZ3|xJB|f2Nxn2eJoL6p zet0^B_P-~E6?&qbHO{9&(}928Z9-wiOBlEu5JLDcNfJ+8A|&nv?t#Q<{<@X=d)9e^ zk+-BQIZuERNI)L`S*Pe8_8ivsAJbNUPjGPJ@e80mnR=_gcXpmx`V2_ip4`X(>*KYz z-p8IKljIo_1eB74l;m2tlj1)#m)SYl@IU=uAa(1eDo4?=0h`Gh$?t^B2VAoMQoKw)=RTl9d%Q{Ec2IZ z+lubXw6o%(OCpAE*fFxop9vf#xkRR~;t$f#gqtg3r0n@4FqOH=I7gu)ujUY_^7o9# z;!K}E5_7$U^3TvUp>!AlfA&vd6m^84*-w*drGfan0phu?#6L$6DWWaZY7f?>wg7JE z5lP5Em2pxPN{i0y3V~&{4!xj@-=EKu)|n@WTmv_25z5zzIxqBU#U21JkabvtO508%k)~t}SfC4oMugtPz zvTJ43^q{*y9@G%1c9fI7m3a)Ycx zwdX(`l1D|QJnn}LTO3<%SetRSKsoXb-AiEl>}*?UV+Iw3N@aj-ViDmYv3fli6L7&i zQE`g3kdAcb-^2sGlcQ+#qCfGmaf{>>YH4F*l(N%?A(lZ?4YlvSeALp^2PHFFk0&%T_vZzJS_P1RT_ve+IEG9UQS@#U4wPI?fh&1QKMVO zcgy{Fzdf47z-Kov*ymPW{zaMCneU9GP0^8^I{n*{GPh}Uy+~6TirQVsY!q?e5M9(N zgz7$zHH$<2wmCg|yx+^TPQB8i>=JJB^p(7|M`OjQvYs(DN9oBw0heiAf+T2dVJ9A< zqpy2B(!IVS39Xna72XIImnRr1De5uC{q?J9{2|iTCr|XHwOwU9sg{0gd~9iQaiw-` zW6^SDUxqk5V){J)Ls81@$vFzQ>x*%-diH{)m1Z;^V?ez#1Rd1fR=SsAZEJ43yK`w4 z*q3^0T68ZnLiU+(v1adzn&Mmkmw=f}1!(=zXNiX<*kj3)gL&~2r#I@pb6XyvPgNN0 zhD4pXDDvcHont%Ha0rxh;Q`)srD?A_6w&KYBz zJ}ePul$-$)uAWG54YjZlCCF3?m#50B_e}Kw7254|t@EAGnBxn<3&`ZlO^)fbVVzL^ z&Lt0)u!0qfg2OG2p_``u*NKfDN66#{j;AF*js&hl65X|a6FF}>fy+I zwO3~u=|A|3RU_!YB}TDv)E{wO6)*kkB{u$E&I>&M>mG)y)zXvs7o#1;AgO9v{G!g) zGVNDNZzVW&>?meW{G~9(FNVOD2!E6ZdAdB*(U$U$DL?R>c3jaTB(Umcp3r3zz}$}k-|&Ec1p0CxBSo=C*%Z$X zG?|r`JzxC!_}$U%+^J)~Vmrjrcc$b65Gka6au=a57L7vOYp*GnF0nPpdO6epR1AK% zCa%f6_azjv;7)~lkC!B%~PCS1FOo075&^f5lGjC*#%NwmDh_1m+ zlPb#-y1$3P6s4cd;02kujqBcV3DB05fWbfJu}1t697B8#{t3)Cd{X~7O+FD$II}bN z%n1eDTxy6LKytSe0){3**Y5%I_Z0^WkplYz8!66$k)h=x1Q=Z%F3LttHLl6>oF&%C zX)w00yrW#UY_-Eskl8 zRQF7#beRt^kF()~-s@?ehugT%oX0p1Q2ZUo7uCyq!AYvqKnQG8jJSq$zQzPX^FafE0LW(YmeI@SC=DlivJ08h6r?DlPMH}^Ol{uy4$#ebzk ztFsQ@6xq0&cl|ooN%(2viH;x35cIhK#~eqb_g&hfSCg!ELSyA0Q)#;&k0xntVRn-Y zw7>t}#@Sa5EGDIuFH8?P_qMo2ZqKk}ZjLY_BI}M_N}!quQT>%9v|C%bPWE=ro4#8K zw{Q`_*IXEhXzG~7Wpq6Vc9B@Q(<{)mGeLw1L`+w>JZ?=b$M=*%eh~KO*Opua16WH5 zpFD=GFZpxA!`z2OuAM1KgrIW++nMTeez!SmtwiJZi;`|~;1Bq%+5tD~S#r1r+T#$l<#}W>Z9v<}Bum^i5c8&_$TUVD& zJCMt4wdub%Mv`6|*8Y4{+6gyp!)szPcHKD;c<)cZ7jPt4j4^-cLIFl@?dCE5E)?{e z0T>*H@d5YM#FK?Ww`tM2g#xM{BA)Pnni+6QkJk$_phJIVd@OSIo>Um@!Hwh{%KTOT zIf&>fN=dPA68P`|`_D@>M0JeR!e6H3M#hS-YXOX*6>;0u$St1|gfA~?Lt#GWX1i9N zrP2+}{VW7Vw~2oj>564}657%x@?e2z_CEQ{2|+PwAj4H#*}A&@sI9vrf3loM66GLN zx>&uc|9hW^Vs}0J-`StNoTt%hzcG(mCHkAIr09K{ksaN=ue8L;-|MUXI~B*=J7YaA zv+$YkOnv^M7?3vqQrqqoF(%E?gfg7{Al8MG{f;vj-0F4sJxbHbXL@rlP_rGo@POO)f>XDI2kV?`K0E2xbx*c_c)r28>-*DhLO zV|~^qwQftg?+7RBztEUemo)j81_O42DFn8#aQ)SzWMatC$CQm3>`%9KmsbM6a<}#! z)pq)Bg?s$el&hW2TK@8!r=Yw*HVo$5N(CGO1KQ}}?@Ee+F;!z;x44lT@we>Hpu_EF zBTXsv4ylvtPTh1@$+JF{yxxim01feqNY$qi1G~2u4+xWCT^d9ioLYINpZx<2RvXZB zQ_qDHvRc6m#d>ut_U4@}H1Z(OATv}VsmEiww({!0PbZrh)@GSGm!NFr83nE6$-#{X z=j2)6rj(VF3lC-#u(g?8P@8lD*j1GR&gOmr5$h1ua3nmdCb?C2E^!8W6Wb`lp``54 zy+-qBDY6c=i;tEMEbTJn-xJRsC?Sq#8qcy6tXTP!6-GHCVR$u+MG$JN+LF7Sq1t3W zlKW2n>Tn)OrOzVl?~moA0_aWMK2rrVCFJw^^4zEIw=J!0xAz-a&Pk5x&FJ^+z6Ev>of%v4^{Do!-DFR653{vU+Bc|4SD8$N#9HHgYqDyc^?vb0!A5%PGlWgBEH zBPm(N7P5_950ajzEG1dWHe;BCF=MAFL&(lBmc};refPbl_kF*g-}kTIpJnE{ult_s zzOM5;&f_>vP|tnSllD(p0}UIn}?&e>7=be%LP|Bxu_yXcNTF2H=hi zY2SMeKWJV!pdbZ;6giES0uo1d|Crc+HB@q+J9+Wsxf=_49G?6B$$o|qhssGEg7w;X2=!UzuE$N7vv+ zTpE4BLtNh3jvdLBrN)LACJD16|K%n+Gep1c6Qhy72M!o*b0Lgk)YH9^GMYFz#zi8L zsht}$YA+mQ6`XluO7zEBbtsIg>jOU?V+pz&$hellY zRr9%nu;Z!q$6I^7tOD649y9^$JTuvY5_QjChV|W9XxTk=&F0KURC5j9QHfioKC{e2 z23rz4@BW8o!TpdbH^qW+E-Rphs=U~D;AMv$A0xt7b>;0!|F?41J|v7=^5mRoz++>Z z7v75QH`VZznjkF4Ebh~Z39$!e{Pm^Q&hNjhC=OW)m4!Rf-1lyQi!(tX5C}+8m+LbT z4fx`p`QSN3D7Xhpv*l#0iKDmLautCjG&knJTFI4}BBD%#(x;wj3I~VSrq}05MLKg6 z>jfydV%_yACv3e5k9Zr0`T0EE!gS>wQTlaQNmpRwp7m#om`=f?WN#70Ax>sWYH&+E z5qU&J*q`Nf8@ncc)V#!|cka^R$XTVIqvrQ%N5jmISbqIE1do$@tyB<~o;uW|LdE9b z9-j8r8SRlNQh($QLfWezym0CaaY|M*)?6YHMqKvCM7`#DbGVT4$XQCHMw4QZzEF?< zH@IMsC#1@GQ&5YsDRHkP1m^_fK2!?1@{IPduOdim_xrnl;JTWT-5fk=){T%`{@yevbqC~O;(YZkX*OYh z{2=A#UQ5&LNwDxi`FpQpgVCLkTc5SMSr1k#r^&EN!y0{Q7a>EeT%*7*_I~Y1Pj-P7 zx9lt4$Q8bRuvl@NJbtHF3mVh};ZAB4vSgwxy&13kBjjc9jQl|@JJOlV2SM!*`!_TS zW`E1m-UDM4;&Jk9^-~;uTJk|RIg;JU(boW%|5}MKrop3_+_A~K-F>U>XWZAHM0AA(tnY6mhE0=b}GFQxaf{a{%W>Jhu2&C>EMe- zK&m*K4o3RJHQ|Nq5QA*`RTv~AfY{)|3e?20IPPtW<1MMA0sE))FF8pkP*vok_VZOu z{kZ)n(n0!u>C3UtWm|2&UQ!$h?2gqKZL^Cj$`kcUun0Uo5&LrJMcsM)^hR#`_bA<+ zjF+v5VA2_e>A}K<@OC{RTUbTpj2r~5Ytc4V(*y=TjN?Kn{6`esU*O|kBvjK_YXSel zAXE+2bC{_Av@?cQ+9`)%V$YJf zqsdI*(8;%&YNsO1Iz2lsov3EYp@1RCK+Km3L*ZfHyZoOcK2U;&6<3bc`hwTC_RrBI zH=tt*C*;Cjm>(kAmIzrKWjC++-rJ!S5cUf9BUUT#KCK==3?7M@Z|>!K?WcN>f4Nn_ zh)2WTeA($Rb=ldAkD(?0ESd!{#-O$cVW`v3!_PjKq!{eiy>eF(fu7r6dkQK;wv@sY z-;^|_-xa;Y#r~y_=aX|*^QB+!efl|VAK;IFJh-p+bmeZs=P16?)f9H?-_r|KyS;sg zXp-e2a|B)*jWkq~FQhs<*X?;}5F5<0-{8;SqL5ZJPU{>mnZAuIL^slyZs~C_CThko z-&nvINK(D@{Th4IWw<_y7*r7Au;7Q<2JGw1c2Z1XPc`zt&V<-cuH|%Ac*75(>G={e z=A5dLz{5vEf<~og-j6FLJO?-ukz2vmpk@@vO+24b7&r&Lqsc?y6~Q(?^!Ixz`o`xh*soKQ?%t?OVt4m z0!^Qqk+Ooz6WtB6MMvR>yOw*d*0|QGxgZTj&7Dscc~p2ZFT3kH^2|NB^jaj+&=ese z1lCId0Hn3DddJaruWbLOlO;J5k$lcWhbtnH*iCYhtl?axrNDbSd7dXUp1C+C5|L%B z6rM=^(DA5y4{wUVNgfQm^RBE2OlU)z_2Zc{UZY8STbpXJ@U){i_gqWLS&`PDRdEWdi>>9%$xdv@^}EJF@)&dLV{qhO{zKdXs1N z6D5f<#w4Lgb7xFcQkn%%TGq>!AF^-e%m?`!+jP}(G!=;MGlhLeV_EvRnR~r43Bisy zv_N7RiK}fkyY2%cVqad&qrx;V^tLK|Qny7|D%{=Z9#8QvgvlIvG3{CM!cV(t#xr)U z!Cza3?V4Z6ifAiiqk967SPSbno7JOjM6?sFvCNg+nn$gFIklGO{d%ZM?$~J07=bs@ z*#Ye@=<9R%UC9tCwYNTWcD0?|c2ub<7{0)h;U0-RMgZ%AR@sdIvYbUhW!|J>Su<6r zu@x73%52OH`+G#6Mva5EwU23a++(gY8avnji%cle3 zJ*_k(%mU?&SFlIlF494`<Gy9GRGl4U7V#rL{c$AHj zK3tMbUIblQnm5yI9#5)Ud?oRIP+tBiZX$4S=F?JC$(!&(Gom&G8D)C$XpM!-c96dH z)G(4Jy)g775C$g}4#1OiC|PGNwlCc%#8SyEa?7s{8&tS)T9~l6ryd7#wzug{9jUJm zIL)N~-L(3S9Uj?r>*AC&TcIhK#$dXg2NyDE&G>vp5wwu{_^kqN>QRlJ7huJEPA+C%jm(lkvYNL_%QWIqeqdV9_g0Wbok^46T z_t$#=NyPCwLe>~X5eIJ;Xd-susOZtO^vy6_YEPS+Lbp+_lJ(DPh~rmDXTHDh-JNgqK7zZiW>w@REW>*w-Zr&p%-iDMCPl z3LiXh*)R%!Ql$|V?zR?zCmfZrr12Azq&S6EPmJ~yh>0(!ni92Z;BnUFiM4@mNS!_M+^pn~p?`>-^ z?O>}R#BTZO>6;tcJQT4lH?tk8M?Buz@DxJQFBf@H5Kp8Dy5?^5<+ZW-XL15aL^A(j z{09L^p~Cj{-c{96$`rcFbH5>ja@N9<9eNHdOrqh6^F5d6sef+x7g;er@!}G0;9A!#(1$66PA={`;Q7GGTN3Dy9hmsAl74co!5600iqs;nx43a(c zr~v_N1{|^_LyA#WjG(>`;xollcJ{^+0A6*-Uhvy~&&6vXKE$^+U~Zb1J(q7Vr#{Ex zidGs;B3;kqd)+J}l*5X5KWQ=U_{QIUFu@>tt;o#K(%W5DIAf6wC^LV%?WE7@w4()KpL6m+5w~ zF)W}aT(@Y=#>v1p!RqAA<7_hWe9wvkjOX*UiIc2-&l_nbBHF!(e_rxH3YJ!iLnsmO{ZJWKXwUR(lDKO=<*bGX zg!-GCU*W-a!loOOnW6@8W>dn~XB-5Z6Ay-KiqA&;V1uGTMM{gwC-t>29!(m)mHTsS zQCD2xghL#Pr|%R%wRz=4yrz{PNb43j?8g;hsKN7M=$jz_TnFOoS5ClrDQxjg<@6)? zA}c}c#48G)l6%f^kJAw05j&UY^}VJW0OBrt{Cn&g$JC0qsGz{^=`u%3&R~*k>O=%2 zDy-iA)6yDNA)3Gg5#+ZM?xMb(u3k}-xEPAR-y#cHzQUG+Btpc|LYu?J%nQ`~zox@(+iMOM?$ zm@==W|ljr#@SO!2b|< zw(!^)-O)~aUoW7*ds=5c`@mC{yPB0;#FJC$v)e2;MB^_HpY9wdu+FZ&^x)}Z3b6ZF z5pG*HLWjWHHwd2jC1b#jzKRRM_;kh3uIG#B`pf1On?xaQw3&x>v*t;i0nW+1S~wH< zgB4J1L^9DOqzSLe0m-X&%fj{`+J+Unr7nneyKoUIb5QL@8f2O%s-q(C0X%H^jzc0i zb81@wFi4wa8u7WlX{32Mcz*wH7D;$Bhp2}JGjEk0gt~n7kQqU^q}k>4;t}YfyoAzh zpF)=cAVWd{2pEt)tR<7{t7I_)6KDC7*?nq&=nf7H8Zjz zN_00*^Jv|inPyIteK(z_!_ORpQUpXbIrTfFct^F>X58bJI-kO$en0t73| z8)JnEbR9&b|9~2u#3Cp%W|tk%+VC??DrFQC8*Wje9nXJsp21j3RmdhKBpxPO zO9`tT4rOwTY9T4AiBPgwTwL7*3zOVvKWpZn*Lw+aWy(i6>&4^rSVR!u1aSm=3&)JD z9-yTF6cJKTkQ=!Vc z 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 + + + com.bonus + bonus-modules + 24.9.0-SNAPSHOT + + 4.0.0 + + bonus-modules-ai + + + bonus-modules-ai服务 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-sentinel + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + + + + com.mysql + mysql-connector-j + + + + + com.bonus + bonus-common-datasource + + + + com.bonus + bonus-common-core + + + + + com.bonus + bonus-common-datascope + + + com.bonus + bonus-common-swagger + + + com.bonus + bonus-common-log + + + + + com.bonus + bonus-common-log + + + + + com.bonus + bonus-common-swagger + + + com.google.guava + guava + 30.0-jre + compile + + + com.bonus + bonus-common-security + + + com.google.code.gson + gson + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + + + diff --git a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/BonusAIApplication.java b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/BonusAIApplication.java new file mode 100644 index 0000000..a5f9a97 --- /dev/null +++ b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/BonusAIApplication.java @@ -0,0 +1,36 @@ +package com.bonus.ai; + +import com.bonus.common.security.annotation.EnableCustomConfig; +import com.bonus.common.security.annotation.EnableRyFeignClients; +import com.bonus.common.swagger.annotation.EnableCustomSwagger2; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + + + +/** + * 文件服务 + * + * @author bonus + */ +@EnableCustomConfig +@EnableCustomSwagger2 +@EnableRyFeignClients +@SpringBootApplication +public class BonusAIApplication +{ + public static void main(String[] args) + { + SpringApplication.run(BonusAIApplication.class, args); + System.out.println("(♥◠‿◠)ノ゙ 人工智能服务启动成功 ლ(´ڡ`ლ)゙ \n" + + " .-------. ____ __ \n" + + " | _ _ \\ \\ \\ / / \n" + + " | ( ' ) | \\ _. / ' \n" + + " |(_ o _) / _( )_ .' \n" + + " | (_,_).' __ ___(_ o _)' \n" + + " | |\\ \\ | || |(_,_)' \n" + + " | | \\ `' /| `-' / \n" + + " | | \\ / \\ / \n" + + " ''-' `'-' `-..-' "); + } +} diff --git a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/AnnotationTaskController.java b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/AnnotationTaskController.java new file mode 100644 index 0000000..500757c --- /dev/null +++ b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/AnnotationTaskController.java @@ -0,0 +1,90 @@ +package com.bonus.ai.controller; + +import com.bonus.ai.domain.AiDataSet; +import com.bonus.ai.domain.AnnotationTask; +import com.bonus.ai.domain.ReleaseVersion; +import com.bonus.common.core.web.domain.AjaxResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/task") +public class AnnotationTaskController { + + /** + * 获取所有的任务列表 + * @return 返回所有的任务列表 + */ + @GetMapping("/list/") + public AjaxResult list() { + return AjaxResult.success(); + } + + /** + * 查看由我创建的任务 + * @return 返回我创建的任务列表 + */ + @GetMapping("/list/created") + public AjaxResult getTasksCreatedByMe() { + return AjaxResult.success(); + } + + /** + * 查看由我参与的任务 + * @return 返回我参与的任务列表 + */ + + @GetMapping("/list/participated") + public AjaxResult getTasksParticipatedByMe() { + return AjaxResult.success(); + } + + /** + * 根据任务编号获取任务详情,如果是标注人员获取分配的文件列表,如果是审核人员获取所有分配的文件列表,如果是管理员获取所有文件列表 + * @param taskId 任务编号 + * @return 返回任务详情 + */ + @GetMapping(value = "/{taskId}") + public AjaxResult getInfo(@PathVariable Long taskId) { + return AjaxResult.success(new AnnotationTask()); + } + + + /**发布任务 + * @param version 发布任务的版本信息 + * @return 返回影响的行数或错误信 + */ + @PostMapping("/release") + public AjaxResult release(@Validated @RequestBody ReleaseVersion version) { + return AjaxResult.success(); + } + + /**新增数据集 + * @param task 新增的数据集信息 + * @return 返回影响的行数或错误信 + */ + @PostMapping + public AjaxResult add(@Validated @RequestBody AnnotationTask task) { + return AjaxResult.success(); + } + + /**修改任务 + * @param task 修改的任务 + * @return 返回影响的行数或错误信 + */ + @PutMapping + public AjaxResult edit(@Validated @RequestBody AnnotationTask task) { + return AjaxResult.success(); + } + + /** + * 删除的任务 + * @param taskId 修改的任务 + * @return 返回影响的行数或错误信 + */ + @DeleteMapping("/{taskId}") + public AjaxResult remove(@PathVariable Long taskId) { + return AjaxResult.success(); + } + +} diff --git a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/AnnotationTeamController.java b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/AnnotationTeamController.java new file mode 100644 index 0000000..31f1dd5 --- /dev/null +++ b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/AnnotationTeamController.java @@ -0,0 +1,57 @@ +package com.bonus.ai.controller; + +import com.bonus.ai.domain.AiDataSet; +import com.bonus.ai.domain.AnnotationTeam; +import com.bonus.common.core.web.domain.AjaxResult; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 标注人员管理控制层 + * @author wangvivi + */ + +@RestController +@RequestMapping("/team") +@Slf4j +public class AnnotationTeamController { + + /** + * 获取所有标注人员和审核人员 + * @return 返回满足条件的数据集列表 + */ + @GetMapping("/list") + public AjaxResult list() { + return AjaxResult.success(); + } + + /**新增标注人员或审核人员 + * @param team 新增的人员id和角色信息 + * @return 返回影响的行数或错误信 + */ + @PostMapping + public AjaxResult add(@Validated @RequestBody AnnotationTeam team) { + return AjaxResult.success(); + } + + /**修改标注人员或审核人员 + * @param team 修改的数据信息 + * @return 返回影响的行数或错误信 + */ + @PutMapping + public AjaxResult edit(@Validated @RequestBody AnnotationTeam team) { + return AjaxResult.success(); + } + + /** + * 删除的team标注人员或审核人员 + * @param team 删除的信息 + * @return 返回影响的行数或错误信 + */ + @DeleteMapping + public AjaxResult remove(@Validated @RequestBody AnnotationTeam team) { + return AjaxResult.success(); + } + +} diff --git a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/BasicFileController.java b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/BasicFileController.java new file mode 100644 index 0000000..0a0b991 --- /dev/null +++ b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/BasicFileController.java @@ -0,0 +1,78 @@ +package com.bonus.ai.controller; + +import com.bonus.common.core.web.domain.AjaxResult; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +/** +* 基础文件管理控制层,获取指定存储方式的文件列表等 +* @author wangvivi + */ +@RestController +@RequestMapping("/basicfile") +@Slf4j +public class BasicFileController { + /** + * 获取由我创建和公共文件的列表 + * @return 返回所有的文件列表 + */ + @GetMapping("/list/") + public AjaxResult list() { + return AjaxResult.success(); + } + + /** + * 获取由我创建和公共文件树 + * @return 返回所有的文件树 + */ + @GetMapping("/tree/") + public AjaxResult tree() { + return AjaxResult.success(); + } + + /** + * 创建文件夹 + * @param folderName 单个文件 + * @return 文件夹网络路径 + */ + @PostMapping("/createFolder") + @ApiOperation("创建文件夹") + public AjaxResult createFolder(@RequestParam("folderName") String folderName) + { + return AjaxResult.success("创建文件夹"); + } + + /** + * 文件夹删除 + * 从各个存储平台删除文件 + * @param folderName 文件夹名,默认为根目录 + * @return 文件夹网络路径 + */ + @DeleteMapping("/deleteFolder") + public AjaxResult deleteFolder(@RequestParam("folderName") String folderName) { + return AjaxResult.success("文件夹删除成功"); + } + + /** + * 单文件上传到指定文件夹 + * @param file 单个文件 + * @return 文件信息,包括文件名和文件路径 + */ + @PostMapping("upload") + public AjaxResult upload(MultipartFile file, String folderName){ + return AjaxResult.success("文件上传成功"); + } + + /** + * 多文件上传到指定文件夹 + * @param files 多个文件流 + * @return 文件信息 + */ + @PostMapping("/uploadFiles") + public AjaxResult uploadFile(MultipartFile[] files, String folderName) { + return AjaxResult.success("文件上传成功"); + } + +} diff --git a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/DatasetController.java b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/DatasetController.java new file mode 100644 index 0000000..2e5932e --- /dev/null +++ b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/DatasetController.java @@ -0,0 +1,85 @@ +package com.bonus.ai.controller; + +import com.bonus.ai.domain.AiDataSet; +import com.bonus.ai.domain.ReleaseVersion; +import com.bonus.common.core.web.domain.AjaxResult; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 数据集管理控制层,标注任务创建等 + * @author wangvivi + */ +@RestController +@RequestMapping("/dataset") +@Slf4j +public class DatasetController { + /** + * 查看由我创建的数据集和公共数据集 + * @return 返回满足条件的数据集列表 + */ + @GetMapping("/list") + public AjaxResult list() { + return AjaxResult.success(); + } + + /** + * 根据数据集编号获取数据集详情 + * @param datasetId 数据集编号 + * @return 返回数据集详情 + */ + @GetMapping(value = "/{datasetId}") + public AjaxResult getInfo(@PathVariable Long datasetId) { + return AjaxResult.success(new AiDataSet()); + } + + + /**发布数据集 + * @param version 发布数据集的版本信息 + * @return 返回影响的行数或错误信 + */ + @PostMapping("/release") + public AjaxResult release(@Validated @RequestBody ReleaseVersion version) { + return AjaxResult.success(); + } + + /**导出发布版本的数据集 + * @param versionId 发布数据集的版本id + * @return 返回影响的行数或错误信 + */ + @GetMapping(value = "/export/{versionId}") + public AjaxResult export(@PathVariable Long versionId) { + return AjaxResult.success(); + } + + /**新增数据集 + * @param dataSet 新增的数据集信息,并且建立和文件的关联关系 + * @return 返回影响的行数或错误信 + */ + @PostMapping + public AjaxResult add(@Validated @RequestBody AiDataSet dataSet) { + return AjaxResult.success(); + } + + /**修改数据集 + * @param dataSet 修改的数据集信息 + * @return 返回影响的行数或错误信 + */ + @PutMapping + public AjaxResult edit(@Validated @RequestBody AiDataSet dataSet) { + return AjaxResult.success(); + } + + /** + * 删除的数据集 + * @param dataSetId 修改的数据集信息 + * @return 返回影响的行数或错误信 + */ + @DeleteMapping("/{dataSetId}") + public AjaxResult remove(@PathVariable Long dataSetId) { + return AjaxResult.success(); + } + + +} diff --git a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/LabelController.java b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/LabelController.java new file mode 100644 index 0000000..ccc042e --- /dev/null +++ b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/controller/LabelController.java @@ -0,0 +1,75 @@ +package com.bonus.ai.controller; + +import com.bonus.ai.domain.AiDataSet; +import com.bonus.ai.domain.Label; +import com.bonus.common.core.web.domain.AjaxResult; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 标签管理控制层 + * @author wangvivi + */ +@RestController +@RequestMapping("/label") +@Slf4j +public class LabelController { + /** + * 获取所有标签列表 + * @return 返回所有的标签 + */ + @GetMapping("/list/") + public AjaxResult list() { + return AjaxResult.success(); + } + + /** + * 获取所有标签列表树 + * @return 返回所有的标签树 + */ + @GetMapping("/tree") + public AjaxResult tree() { + return AjaxResult.success(); + } + + /** + * 根据标签编号获取标签详情 + * @param labelId 标签编号 + * @return 返回标签详情 + */ + @GetMapping(value = "/{labelId}") + public AjaxResult getInfo(@PathVariable Long labelId) { + return AjaxResult.success(new Label()); + } + + /**新增标签 + * @param label 新增的标签信息 + * @return 返回影响的行数或错误信 + */ + @PostMapping + public AjaxResult add(@Validated @RequestBody Label label) { + return AjaxResult.success(); + } + + /**修改标签 + * @param label 修改的标签信息 + * @return 返回影响的行数或错误信 + */ + @PutMapping + public AjaxResult edit(@Validated @RequestBody Label label) { + return AjaxResult.success(); + } + + /** + * 删除的标签 + * @param labelId 修改的标签信息 + * @return 返回影响的行数或错误信 + */ + @DeleteMapping("/{labelId}") + public AjaxResult remove(@PathVariable Long labelId) { + return AjaxResult.success(); + } + + +} diff --git a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/AiDataSet.java b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/AiDataSet.java new file mode 100644 index 0000000..3209a8f --- /dev/null +++ b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/AiDataSet.java @@ -0,0 +1,114 @@ +package com.bonus.ai.domain; + +import com.bonus.common.core.web.domain.BaseEntity; + +import java.util.ArrayList; +import java.util.List; + +/** + * 数据集类 + * @author wangvivi + */ +public class AiDataSet extends BaseEntity { + + /**数据集ID*/ + private Long datasetId; + /**数据集名称*/ + private String datasetName; + /**数据集描述*/ + private String datasetDesc; + /** 数据类型:0图片,1视频 ,2音频,3自由格式*/ + private String dataType; + private String inputPath; + private String outputPath; + + /** 是否公开(0代表未标注 1代表已标注)*/ + private String annotationStatus; + + /** 是否公开(0代表不公开 1代表公开)*/ + private String isPublic; + /**删除标志(0代表存在 1代表删除) */ + private String delFlag; + + private List files; + + public Long getDatasetId() { + return datasetId; + } + + public void setDatasetId(Long datasetId) { + this.datasetId = datasetId; + } + + public String getDatasetName() { + return datasetName; + } + + public void setDatasetName(String datasetName) { + this.datasetName = datasetName; + } + + public String getDatasetDesc() { + return datasetDesc; + } + + public void setDatasetDesc(String datasetDesc) { + this.datasetDesc = datasetDesc; + } + + public String getDataType() { + return dataType; + } + + public void setDataType(String dataType) { + this.dataType = dataType; + } + + public String getInputPath() { + return inputPath; + } + + public void setInputPath(String inputPath) { + this.inputPath = inputPath; + } + + public String getOutputPath() { + return outputPath; + } + + public void setOutputPath(String outputPath) { + this.outputPath = outputPath; + } + + public String getIsPublic() { + return isPublic; + } + + public void setIsPublic(String isPublic) { + this.isPublic = isPublic; + } + + public String getDelFlag() { + return delFlag; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public List getFiles() { + return files; + } + + public void setFiles(List files) { + this.files = files; + } + + public String getAnnotationStatus() { + return annotationStatus; + } + + public void setAnnotationStatus(String annotationStatus) { + this.annotationStatus = annotationStatus; + } +} diff --git a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/AnnotationTask.java b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/AnnotationTask.java new file mode 100644 index 0000000..bd8cb56 --- /dev/null +++ b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/AnnotationTask.java @@ -0,0 +1,159 @@ +package com.bonus.ai.domain; + +import com.bonus.ai.domain.enums.AnnotationFileStatus; +import com.bonus.ai.domain.enums.AnnotationTaskStatus; +import com.bonus.common.core.web.domain.BaseEntity; + +import java.util.List; + +public class AnnotationTask extends BaseEntity { + + /**任务名称*/ + private Long taskId; + /**数据集id*/ + private Long datasetId; + /**标注团队id,为0表示未启用标注团队,否则启用标注团队的关联id*/ + private Long annotationTeamId; + /**任务名称*/ + private String taskName; + /**任务描述*/ + private String taskDesc; + /**标注场景 数据类型:0图片,1视频 ,2音频,3自由格式*/ + private String annotateScene; + /**标注类型:图像分类,物体检测等*/ + private String annotateType; + /**标签集合,标签之间用逗号分隔*/ + private String labels; + + AnnotationTaskStatus annotateTaskStatus; + + /**删除标志(0代表存在 1代表删除) */ + private String delFlag; + + /**标注人员列表*/ + private List annotators; + + /**审核人员列表*/ + private List reviewers; + + public class SubTask{ + /**标注人员id*/ + private Long annotatorId; + /**审核人员id*/ + private Long reviewerId; + /**文件id*/ + private Long fileId; + + /**文件标注状态*/ + private AnnotationFileStatus annotateFileStatus; + /**标注结果*/ + private String annotationResult; + /**标注来源,0人工标注,1智能标注*/ + private String annotationSource; + + /**标注时间*/ + private java.util.Date annotationTime; + /**审核时间*/ + private java.util.Date reviewTime;; + } + + /**分配后子任务*/ + private List subAnnotationTasks; + + public List getReviewers() { + return reviewers; + } + + public void setReviewers(List reviewers) { + this.reviewers = reviewers; + } + + public List getAnnotators() { + return annotators; + } + + public void setAnnotators(List annotators) { + this.annotators = annotators; + } + + public List getSubAnnotationTasks() { + return subAnnotationTasks; + } + + public void setSubAnnotationTasks(List subAnnotationTasks) { + this.subAnnotationTasks = subAnnotationTasks; + } + + + public Long getTaskId() { + return taskId; + } + + public void setTaskId(Long taskId) { + this.taskId = taskId; + } + + public Long getDatasetId() { + return datasetId; + } + + public void setDatasetId(Long datasetId) { + this.datasetId = datasetId; + } + + public Long getAnnotationTeamId() { + return annotationTeamId; + } + + public void setAnnotationTeamId(Long annotationTeamId) { + this.annotationTeamId = annotationTeamId; + } + + public String getTaskName() { + return taskName; + } + + public void setTaskName(String taskName) { + this.taskName = taskName; + } + + public String getTaskDesc() { + return taskDesc; + } + + public void setTaskDesc(String taskDesc) { + this.taskDesc = taskDesc; + } + + public String getAnnotateScene() { + return annotateScene; + } + + public void setAnnotateScene(String annotateScene) { + this.annotateScene = annotateScene; + } + + public String getAnnotateType() { + return annotateType; + } + + public void setAnnotateType(String annotateType) { + this.annotateType = annotateType; + } + + public String getLabels() { + return labels; + } + + public void setLabels(String labels) { + this.labels = labels; + } + + public String getDelFlag() { + return delFlag; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } +} diff --git a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/AnnotationTeam.java b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/AnnotationTeam.java new file mode 100644 index 0000000..eb431f6 --- /dev/null +++ b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/AnnotationTeam.java @@ -0,0 +1,17 @@ +package com.bonus.ai.domain; + +import com.bonus.common.core.web.domain.BaseEntity; +import com.bonus.system.api.domain.SysUser; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author wangvivi + */ +public class AnnotationTeam extends BaseEntity{ + + private Long userId; + /**0标注,1审核*/ + private String roleId; +} diff --git a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/BasicFile.java b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/BasicFile.java new file mode 100644 index 0000000..a18d40f --- /dev/null +++ b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/BasicFile.java @@ -0,0 +1,112 @@ +package com.bonus.ai.domain; + +import com.bonus.common.core.web.domain.BaseEntity; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class BasicFile extends BaseEntity { + private Long fileId; + private String fileName; + private String filePath; + private Long fileSize; + /**文件最后修改时间*/ + private java.util.Date lastModifyTime; + /**上传时间*/ + private java.util.Date uploadTime;; + /** 是否公开(0代表不公开 1代表公开)*/ + private String isPublic; + + /**文件的标签集合 */ + private List labels; + + /** 删除标志(0代表存在 2代表删除) */ + private String delFlag; + + /** 父节点名称 */ + private String parentName; + + /** 子部门 */ + private List children = new ArrayList(); + + public Long getFileId() { + return fileId; + } + + public void setFileId(Long fileId) { + this.fileId = fileId; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getFilePath() { + return filePath; + } + + public void setFilePath(String filePath) { + this.filePath = filePath; + } + + public Long getFileSize() { + return fileSize; + } + + public void setFileSize(Long fileSize) { + this.fileSize = fileSize; + } + + public Date getLastModifyTime() { + return lastModifyTime; + } + + public void setLastModifyTime(Date lastModifyTime) { + this.lastModifyTime = lastModifyTime; + } + + public Date getUploadTime() { + return uploadTime; + } + + public void setUploadTime(Date uploadTime) { + this.uploadTime = uploadTime; + } + + public String getIsPublic() { + return isPublic; + } + + public void setIsPublic(String isPublic) { + this.isPublic = isPublic; + } + + public String getDelFlag() { + return delFlag; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public String getParentName() { + return parentName; + } + + public void setParentName(String parentName) { + this.parentName = parentName; + } + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } +} diff --git a/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/Label.java b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/Label.java new file mode 100644 index 0000000..1189da9 --- /dev/null +++ b/bonus-modules/bonus-ai/src/main/java/com/bonus/ai/domain/Label.java @@ -0,0 +1,62 @@ +package com.bonus.ai.domain; + +import com.bonus.common.core.web.domain.BaseEntity; + +import java.util.ArrayList; +import java.util.List; +/** + * 标签类 + * @author wangvivi + */ +public class Label extends BaseEntity { + private Long labelId; + private String labelName; + /** 删除标志(0代表存在 2代表删除) */ + private String delFlag; + + /** 父节点名称 */ + private String parentName; + + /** 子部门 */ + private List