From 7f9a6bd9cb15624dbf2eeef32beb884e2b60d3ed Mon Sep 17 00:00:00 2001 From: super <2903208875@qq.com> Date: Sat, 21 Mar 2026 10:00:16 +0800 Subject: [PATCH] =?UTF-8?q?=E7=8E=AF=E5=A2=83=E6=90=AD=E5=BB=BA=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 + 1.xlsx | Bin 0 -> 15829 bytes app/.env | 12 + app/__pycache__/app.cpython-312.pyc | Bin 0 -> 2014 bytes app/__pycache__/app_common.cpython-312.pyc | Bin 0 -> 15390 bytes app/__pycache__/config.cpython-312.pyc | Bin 0 -> 2050 bytes app/__pycache__/html_crypto.cpython-312.pyc | Bin 0 -> 3452 bytes app/app.py | 2 +- app/app_common.py | 17 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 149 bytes .../__pycache__/admin.cpython-312.pyc | Bin 0 -> 20140 bytes .../__pycache__/auth.cpython-312.pyc | Bin 0 -> 6264 bytes .../__pycache__/brand.cpython-312.pyc | Bin 0 -> 47455 bytes .../__pycache__/image.cpython-312.pyc | Bin 0 -> 22268 bytes .../__pycache__/main.cpython-312.pyc | Bin 0 -> 7330 bytes app/blueprints/main.py | 37 ++- .../__pycache__/main.cpython-312.pyc | Bin 0 -> 25343 bytes .../__pycache__/web_dec.cpython-312.pyc | Bin 0 -> 5890 bytes app/config.py | 2 + app/main.py | 28 +- app/tool/__pycache__/devices.cpython-312.pyc | Bin 0 -> 10550 bytes app/version.txt | 1 + .../nanri/aiimage/config/SecurityConfig.java | 21 ++ .../file/controller/FileUploadController.java | 13 + .../modules/file/model/vo/ExcelInfoVo.java | 17 + .../file/service/LocalFileStorageService.java | 81 +++++ .../brand/components/BrandConvertTab.vue | 305 ++++++------------ .../pages/brand/components/BrandDedupeTab.vue | 205 ++++++------ .../pages/brand/components/BrandSplitTab.vue | 204 ++++++------ .../pages/brand/components/BrandTopBar.vue | 137 ++++++++ frontend-vue/src/shared/api/brand.ts | 24 +- frontend-vue/src/shared/api/http.ts | 28 +- frontend-vue/src/shared/api/java-modules.ts | 162 ++++++++++ frontend-vue/src/shared/bridges/pywebview.ts | 175 ++-------- frontend-vue/vite.config.ts | 21 +- source_code/__pycache__/app.cpython-314.pyc | Bin 0 -> 2046 bytes .../__pycache__/config.cpython-314.pyc | Bin 0 -> 1939 bytes source_code/__pycache__/main.cpython-314.pyc | Bin 0 -> 17624 bytes 38 files changed, 885 insertions(+), 611 deletions(-) create mode 100644 1.xlsx create mode 100644 app/.env create mode 100644 app/__pycache__/app.cpython-312.pyc create mode 100644 app/__pycache__/app_common.cpython-312.pyc create mode 100644 app/__pycache__/config.cpython-312.pyc create mode 100644 app/__pycache__/html_crypto.cpython-312.pyc create mode 100644 app/blueprints/__pycache__/__init__.cpython-312.pyc create mode 100644 app/blueprints/__pycache__/admin.cpython-312.pyc create mode 100644 app/blueprints/__pycache__/auth.cpython-312.pyc create mode 100644 app/blueprints/__pycache__/brand.cpython-312.pyc create mode 100644 app/blueprints/__pycache__/image.cpython-312.pyc create mode 100644 app/blueprints/__pycache__/main.cpython-312.pyc create mode 100644 app/brand_spider/__pycache__/main.cpython-312.pyc create mode 100644 app/brand_spider/__pycache__/web_dec.cpython-312.pyc create mode 100644 app/tool/__pycache__/devices.cpython-312.pyc create mode 100644 app/version.txt create mode 100644 backend-java/src/main/java/com/nanri/aiimage/modules/file/model/vo/ExcelInfoVo.java create mode 100644 frontend-vue/src/pages/brand/components/BrandTopBar.vue create mode 100644 frontend-vue/src/shared/api/java-modules.ts create mode 100644 source_code/__pycache__/app.cpython-314.pyc create mode 100644 source_code/__pycache__/config.cpython-314.pyc create mode 100644 source_code/__pycache__/main.cpython-314.pyc diff --git a/.gitignore b/.gitignore index ae2c06c..d865f33 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ frontend-vue/node_modules/ # frontend-vue build output frontend-vue/dist/ +frontend-vue/new_web_source # generated type declarations frontend-vue/auto-imports.d.ts @@ -28,3 +29,6 @@ backend-java/src/main/resources/application-local.yml # backend-java IDE files backend-java/.idea/ backend-java/*.iml + +# desktop app +desktop/ diff --git a/1.xlsx b/1.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a6e124d0dbe2f6c1357bab05ac304a389d469c0b GIT binary patch literal 15829 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 literal 0 HcmV?d00001 diff --git a/app/.env b/app/.env new file mode 100644 index 0000000..0b38d5f --- /dev/null +++ b/app/.env @@ -0,0 +1,12 @@ +base_url=http://159.75.121.33:15124 +workflow_id=7608812635877900322 +mysql_host=159.75.121.33 +mysql_user=AIimage + +proxy_url=https://api.jikip.com/ip-get?num=1&minute=1&format=json&area=all&protocol=1&mode=2&key=r4m8dov52giup2o +proxy_mode=2 + +client_name=NanriAI +java_api_base=http://127.0.0.1:18080 + + diff --git a/app/__pycache__/app.cpython-312.pyc b/app/__pycache__/app.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..234a9f46cad782738cc7b453f3bb75c52196acc9 GIT binary patch literal 2014 zcma)6Uu+ab7@z%fx7%&6S7^(hYVZ^ccTqqZ6=H}Hj%z*s9Hv(v+%#;qw?n(_?(JoE zPc5m*HPix%27;j|62`ya7W?Lt-^|^%He$lu?#%D^ zec$YSH}jkCr$|IW(C*;t<_!^{yOactuYsi-0LGDlRAg`lZ*eNeMqcG%6fD6ORgt4U z(F)mNHOz3xl5AO(84g=@wxTL_y;{$>WHs0kHNvoLHQG@%%5a_4WUo=zFsxW>?Pj%^ z;d-mZZdF?WH;f{69gpz3iCS{%dLwE?Mmco@-e@!q#t|Yi_%{T84h```e4?p11{0L> z2Nx=rruL>|+hQG-?heMvXFse=TvP6!IbDA5v-uO(@4r7*J~ei4>bv>#m&=!K{Q1Kt z^H;x|zcv!ri(Y@?ZfWG+)b|TlzFoNdMcmfSJhfD=Ua6cNE1$a<*A2UBf|-@mC*!8A z_hA}RK0i`9eJ0*Z^t_Q!7HI031n1Xzri~43c{-2~O9+6NJkpg-@V;c`O;0m=eR<#B zY)ado?gFPo^U!(=6w(B$P-ZLFFk7{T*@}R3wcTPv7gwQaWsLkh)CkNI6rmBEd$AQRdPMN`b(ZD*;6rh#S5Q48y)N&g} zT3z7xS_5Q=lc6AT7!9lo>?@-Y-U9@D8&_-r^4bCve1rSH$j2W!a?>M6#vVEHsfR^o zQ9{aqUZNhh3zqI-?U-X3nD`Ob(>*g6P$ip6cBQ(tgQ+(b=#mTc45{7>eaQ9OUQ2Zy z-kV8fy0vU7n@u0dXou1rsqXaQRAMcmBJgER%j-7QG(u;R5Vi4+>q|KQrb(QwFLK>u7`=%YZY;Un0b#-5fOUE zgo=pN)2;zJNLA1a1((V#_V<>KmwF1s8NfNOCr9+REKIf)tYV*;?|~rtZZ8b^3Zz1J z1SpBYycT%fkD)7}Sta_BJQ=?kpHU8$lCz?Gs(Ca$+q!;SJ*SQzJ$Ll;L*Hz@-JYCo zPyV>?R(t2I)>li((ah|Q-BbF^j#o;_lLtl){2YB|T6}gfj6(8lv29vx`*hcgxcN6x zdMMjHBW_vo{g>UTZ!8^Hg5*$c`62>YzOF9c9`I(sWD9gIO(_;5 zPf(`>PPV5|ZqZiir8lmG?upXL&XLZuEf@EH_52hrb^a>uCr{EDpdD7Ov;=>=ZfE0<~=? zPv~wjefrU5Nx9o;)nvk2Wu+N0rTI<&j-^$cX>XO8l~tz3Rc2OUnLe4o*ya(sErb@Q zuMzwE)m@YK*p5-O@XO={a8Vh%uS2&ea2)r57dUZAMx62oYMeux%4q!@daQ!tb7(Vr vo}NSW`70dZq7Pz7T64lG2}@y~OL2<|5*tn(|3%pNyIB8jdQm`P8(a1tK#%28 literal 0 HcmV?d00001 diff --git a/app/__pycache__/app_common.cpython-312.pyc b/app/__pycache__/app_common.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..92c7675cb5c7a8f1b9327c4a01bf83b891b84e15 GIT binary patch literal 15390 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 XIfvaoqrAb=jWj}1yAKkK9*(@DM42Ml zy<=ns63V8oBE_;qRkletNv-@CaqCuci!@Ct*+!oGqCf$vULBx7b(Hi{v!wwSe(LNU zkCq%aed|k);LhyK-0tnnH?#A{>S_;yM~_^OHnB1kfYd7Cmdwbk| z+5C0heD%uhh4HnUSr8U-AKI&#*@?nOzb#yv_N)`8$VOp`Vii6bAb@;p8FCLek@8}i_AKX|ycS*FJ3!xfW z|LJ8Ck29AGZ~k&^_QvYXM>HKp88*kNb&$Ujq zPPZ-B)Gb%~oPu@MBdiTs6 zUGfGN*+2<)L53$8lOYI-tjpmt)QH?l87pnNU;=4V(K)~#rgWmWo*~Ks-7q~wKP-uc zkYfR`q*717Yvt^pxMaS6rf~jR;q0tc1J0Rm{G8O13$NW?7`6O+dtuDaSl+>8M-ouW ziy-_enKR%#gNis|z)c{;k2(WkwB0ZekM3CV?93d#<@SwgXS|uVjv+WT!DeHZk&`~L>e}%O+qGJfICZ||Fg{)#%K?#_ap9+R(#ripKP)M&7;2%~B z*)Ve-eXu^`SeMtY6l7<0D5i{qHn!Bo9btA3+!iw(BQ26G=vH$ zH5PPGZA1&_MpaoMMWRq{0-$S!zt#-{0A8pbRkF{0ChW++v|L-4r2tbVpGxShFPA8ckm+0F%b zxjt#;f~~IqYm^)Xx7a8tXYpo~I8|-D(%-DiU#>vsL7?Ehuv!;>97X_y9|+z@1}lxf zW=ktD!6fLIRMiLJQLYU(JobY@J283)JQ^Bvol~9DM@9u39#vbiN0+J|$#gsnAKbX_ zKf?pJ!4?Mlg)4;s*Sb;;0Fy%k^gN`uYJ!wL3CBE!_H5|Rnh|D5f~MI)R8B)KMI5|3 zn=#LxH?wo30a=)Y9K7GRSZR4#4DIa=l4q|-`jq!RAQy>sr;Do#7glF}1f3<^DP8NN za%g0*%@1`#J1KOW3ad%dM))aAK2#$&pOb7+&1q&-1rtwxn^=&zWKfZ1xW?t0E!jia zmqt(J4}MzHvgmI4*DY_uKM}<>{<)^1$N;^kRe|}dE)RNL*vg!zwle;D!zD>dA}mR` z5pUiYvew;6aAq)?j;*4C33LoLlt{#^bN>QaSA$)H+}|947A~fK3lnz`e`zBy zz;P++A2dU;B@d!}e?fwY9{U{a{~SGAgcN-&)spWZ xqLvwzh+2w1p4yq!iU>$vFA-9#=c#SBXqzqCR;=f!#%!vHfXp=9A;kL5e*+p8s{{Z5 literal 0 HcmV?d00001 diff --git a/app/app.py b/app/app.py index c1f0140..940be83 100644 --- a/app/app.py +++ b/app/app.py @@ -37,7 +37,7 @@ app = create_app() def run_app(host='127.0.0.1', port=5123): - init_db() + # init_db() app.run(host=host, port=port, threaded=True, use_reloader=False) diff --git a/app/app_common.py b/app/app_common.py index 67169e0..341da46 100644 --- a/app/app_common.py +++ b/app/app_common.py @@ -14,6 +14,7 @@ from config import mysql_host, mysql_user, mysql_password, mysql_database BASE_DIR = os.path.dirname(os.path.abspath(__file__)) STATIC_DIR = os.path.join(BASE_DIR, 'static') +ASSETS_DIR = os.path.join(BASE_DIR, 'assets') def get_db(): @@ -42,6 +43,22 @@ def _render_html(template_name: str, **context): return render_template_string(content, **context) +def _render_html_new(template_name: str, **context): + """读取 HTML 模板:若为加密文件则先解密,再渲染。未加密或解密失败时按明文渲染。""" + path = os.path.join(BASE_DIR, "web_source", template_name) + if not os.path.isfile(path): + return render_template(template_name, **context) + with open(path, "rb") as f: + raw = f.read() + try: + from html_crypto import decrypt + content = decrypt(raw).decode("utf-8") + except Exception: + content = raw.decode("utf-8", errors="replace") + return render_template_string(content, **context) + + + def _is_session_user_valid(): """校验 session 中的 user_id 是否在数据库中仍存在;不存在则清除 session 并返回 False""" uid = session.get('user_id') diff --git a/app/blueprints/__pycache__/__init__.cpython-312.pyc b/app/blueprints/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df3d62af2a992f05b2f3fa5d159388abe232da25 GIT binary patch literal 149 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 a_b|{wdS+LGu8<*%?rCZ9m#C$93jQx0(j5Z; literal 0 HcmV?d00001 diff --git a/app/blueprints/__pycache__/auth.cpython-312.pyc b/app/blueprints/__pycache__/auth.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb68be03acc25c352645c71b5d7f7eee65e4e5b1 GIT binary patch literal 6264 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 literal 0 HcmV?d00001 diff --git a/app/blueprints/__pycache__/image.cpython-312.pyc b/app/blueprints/__pycache__/image.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b5847a3c2e2f4254374ec7827842a1d7018ae183 GIT binary patch literal 22268 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 literal 0 HcmV?d00001 diff --git a/app/blueprints/__pycache__/main.cpython-312.pyc b/app/blueprints/__pycache__/main.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43d88acad7ea94df381d501e44bdff4fb7b4cf4a GIT binary patch literal 7330 zcmeHLZ*WuBmA~(g{>zq(Wo(T9$T&3E*f>B~3JXpRw!wyAicJC4RF?IgZ7F(^dfyW= zj+~fIW`Y|!wkO$`mSmQ+X&VNbNoKkmX4-VqHapXq_JdS;$DX&I+06t(`Lrfx%a(rG zbDsPp;Sqs$c6Ro|Ud_Ar>fUqiJMZ3ee)pX7+oB>Xf%3KcGEbSb*0WYB_mne4EcaBfMC1jN zxb7-QgT+%RRt9%w`uVkBzRG0&3znD2)s-nv)kCPQI<;sQY&rTYU-d)y?0I}e1^8+n z!dINf=P1Be`w%{-&L@=QxIFHMP_M~Sm*!E|J%rkor7p{(-tZ9WwZlXx|2}iALO%&% zT^?8cL%1r1^~3o*Re3y5oMjuTW5?mBtT(Rz?Dkv#aQn^g|KZg)Z(jPvfBgJ=w}13H zjC?wAZX_a!(7@=e$(L__@WUG)zHxKvJsf%U+^xwA8KT>7e)qG9bDzEb@{OPUBTOBR z3`eZDQ3sAR@Tz5BC?-Z}Agrk7W1<|5gk@1RQSqBGQC3uoEQST|P#`2Wm{sGjsCb1z z)$XM*DpK!=B8Ako-hk|tMOh9+!rqt+!)JVWYsb*jVX1}7EVl?C(icrdN+qM+}L&+Cf@yf~-wk}nWenHK+w#%m4QFbB`_G*q)hS+NX4f-6>}QLR)0qw4{! zQFQCiS`c+9CY@Tb=skhedGxlI6r|(ydA;o=4g3-KR@}vaFlIsVx8NC%S$#2OWQ(?? z4F*~QuTnWU4vH_O4y*vG$Q7~-HM##(=kER}jRaxm`u)@w4~eun8j8Vr^!uXG{z3i7 z<$moA(X*-{04F+1tATqxJo3{}O^_R=;+LO4_x$v(IaBrAhA+=;*uCf|f5UXymab?@ zJDQW`=0#iSYX>eKPP-b?w#FpiNRfNY(1JoguFaGySAxYlZ?4U0m$F75Ra|=Sn(6AwPV|y` zvX#h8oMp%G|HVKai*RqYjyf32;KkS7d_(bd0!@&A3>Y7gD;lU&z>T^Bu+BY zHCT>}ZR_ng+_AsUjfN2RNn(>5Fh;`D4Xg_un&+;`K{LVkw%kPFgS67ai*_9(u3-gD2mA z@_OS(gXwKubA2b1r~2nl4Wv#DBz@1NPleKb(p>z7dxVTK``J60W{Hq?_E{DHWt2I> z-X-J&>&0e-jbP)9vOr;pviB_TzVoO5eAi0sWuFs9lN(<7(c9u5*C>92Oj4mpEMGzT61g@vX{z&yY7Z@7vD( z($uyY`oG$4*tf^@t1p|d|4f^u-Nt=vWuP82wge>K@PnX(8?Av39(6v{=U^Qmmpw9O z)!}t{WhEq$g)dtBi1iCx0g3G8E;DDDyi0%+*lV1AIrNe%{D1x}yz{fE z=^MYebXR^C#1p{*CLe-1^>2`JUV#-uyy(~GXn-|zKqu7&qU;u1e0XI8<c0R(3n6emhO$Z)WfPphUE^~Y3SQj~I6AfX!9$~XL3UEi zhcuWA>da%Riz|a-t5!b*>-NDTk3sbXXqIf=dwn$RKA3iNJpgCPx~=JwZT~}fwiXq( zEgD!+R5>P36lfCMtL%j;o{aOzqhxijkROvLBi?wcN`lFoFA#7kxC>ed zI`v+z)xRde=dF?r%yM)BC-Bz{S66(Yal;4^j6Yz;jS0hFv2P~aw_)5jKr3zEOt5dJ zFWR?+5%!Hwm=fF&JHuY6hMhBy1D8^!%LtNW!$N%wydXmmo#$00VZOSuE4?5EL;T!0 zH_pa$eN!C5Pen_lB5M#`*;NHX&-LRLfm1N)pp}G0_vj!XH@(3L<{=h?LxGH2Ua<78 zv~eacRHP_!E9#)ik3?kUelf&a3iv(E;QbCOBb|XJ0A);GWprHSFkfVh`lwF=uSoDI zKGifL`XHSpt0sRW@?1caRfjJWio_vzmB~KAj1rK_H2BrawO{)C$af?2HQQ4)+vjR_+%@o})=z47%vh(n>EjEI zHB)CN&%W|}a>JgKW6zR-6gj8MCc77Ec0k|ayhDH*VpUhwd})2Ew0^O)a<+A*b-`JQ zy*)E~7E3DTOX^Z3b?K7&1=spT*ZSF>nVyBJx&>GH-4ct-dfxoGi&TkB(p&*ywtLfj zZA+@QWxjSts&>a*?M@J<%KAy|&KcV@KP@geN~gvq$6iS!>$j&I+d+ilHPbu3{p>>R zP84Syh*O2)I4dri=PNd)DmJ~dX}+;F)!3T+%F(prt4Z@$|FparME=vV8z}$luASIj z^R_2awkI&w?q(L&yRY@WS9(3ZOcQf~8^pCz%*Ir59t!*zh z{<5fTFZ6$Hb+@~WzizCD{>R03tSd`9%-qM#&JK?IcrOF}f94EOk6BtE=NQ=%j1JSo zu#_L3Y{|xw12B{yUFRX;W8Mk5m<~LWl^f;3I0+J?V`g0zh}SXJZwW@lVYt7{5?H5l zHY$Q6pt*cG|4?%c(Y06|Oc$ey<9c3gDT*P<3-HJ_P=WH>4#P9WHTniESRKrlnCqG9K8#N=$STV|^S|RfaCMZdO z2Y4%HvJB`|QM3(;H<%WXQB7RUokfpFOYCOyPe!olp}=r1%|u;DFbI`u_IlC$yj}no z$QpYGqpE=dVu@N#SIaMH`3o&`Krs^2{9bwpduVyu4y@iK^ByT8#6n^#od6OrOCq0z z8nlaH?yxMwFB=JC{a51nH?k{DcHQGG41142wT#t07h#%Hr0Evfnj%~O-B~?R^og}} zy7S_}v~}Zz39N^;yj*>*`n;TGO7E~7vw4{#tZNB-OLl!So@UAy7{?vf!VIuT;KZt8 z3El1wL?-z3W3X8-^I literal 0 HcmV?d00001 diff --git a/app/blueprints/main.py b/app/blueprints/main.py index 37e63b5..9f3fdf4 100644 --- a/app/blueprints/main.py +++ b/app/blueprints/main.py @@ -2,7 +2,8 @@ 主页面蓝图:首页、home、图片工作台、品牌页、静态文件、Logo """ import os -from flask import Blueprint, send_file +import requests +from flask import Blueprint, Response, request, send_file from app_common import ( get_db, @@ -16,7 +17,9 @@ from app_common import ( ) from flask import redirect, url_for, session -from config import base_url,version +from config import base_url,version,java_api_base + +JAVA_API_BASE = java_api_base main_bp = Blueprint('main', __name__) @@ -90,6 +93,36 @@ def serve_new_web_source(filename): +@main_bp.route('/newApi/', methods=['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS']) +def proxy_new_api(subpath): + target_url = f"{JAVA_API_BASE}/{subpath}" + try: + headers = { + key: value + for key, value in request.headers.items() + if key.lower() not in {'host', 'content-length'} + } + upstream = requests.request( + method=request.method, + url=target_url, + params=request.args, + data=request.get_data(), + headers=headers, + cookies=request.cookies, + allow_redirects=False, + timeout=300, + ) + excluded_headers = {'content-encoding', 'content-length', 'transfer-encoding', 'connection'} + response_headers = [ + (name, value) + for name, value in upstream.headers.items() + if name.lower() not in excluded_headers + ] + return Response(upstream.content, upstream.status_code, response_headers) + except requests.RequestException as exc: + return {'success': False, 'message': str(exc), 'data': None}, 502 + + @main_bp.route('/logo.jpg', methods=['GET']) def get_logo_image(): return send_file(os.path.join(BASE_DIR, "logo.jpg"), mimetype='image/jpeg') diff --git a/app/brand_spider/__pycache__/main.cpython-312.pyc b/app/brand_spider/__pycache__/main.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..161636e0ed24b3e0091eff8d49b6cde48736734e GIT binary patch literal 25343 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�BnMZPyarM&7aZD&p0W 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 YgvkzfzfTw4X7nc?gwP^WEZ?X91>ap%1poj5 literal 0 HcmV?d00001 diff --git a/app/version.txt b/app/version.txt new file mode 100644 index 0000000..fa60655 --- /dev/null +++ b/app/version.txt @@ -0,0 +1 @@ +{"version": "1.0.3"} \ No newline at end of file diff --git a/backend-java/src/main/java/com/nanri/aiimage/config/SecurityConfig.java b/backend-java/src/main/java/com/nanri/aiimage/config/SecurityConfig.java index 968fadf..ec84041 100644 --- a/backend-java/src/main/java/com/nanri/aiimage/config/SecurityConfig.java +++ b/backend-java/src/main/java/com/nanri/aiimage/config/SecurityConfig.java @@ -5,6 +5,11 @@ import org.springframework.context.annotation.Configuration; import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.web.SecurityFilterChain; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.CorsConfigurationSource; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; + +import java.util.List; @Configuration public class SecurityConfig { @@ -12,9 +17,25 @@ public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { return http + .cors(Customizer.withDefaults()) .csrf(csrf -> csrf.disable()) .authorizeHttpRequests(auth -> auth.anyRequest().permitAll()) .httpBasic(Customizer.withDefaults()) .build(); } + + @Bean + public CorsConfigurationSource corsConfigurationSource() { + CorsConfiguration configuration = new CorsConfiguration(); + configuration.setAllowedOriginPatterns(List.of("*")); + configuration.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "OPTIONS")); + configuration.setAllowedHeaders(List.of("*")); + configuration.setExposedHeaders(List.of("Content-Disposition")); + configuration.setAllowCredentials(false); + configuration.setMaxAge(3600L); + + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", configuration); + return source; + } } diff --git a/backend-java/src/main/java/com/nanri/aiimage/modules/file/controller/FileUploadController.java b/backend-java/src/main/java/com/nanri/aiimage/modules/file/controller/FileUploadController.java index 0f61e6c..210e3f2 100644 --- a/backend-java/src/main/java/com/nanri/aiimage/modules/file/controller/FileUploadController.java +++ b/backend-java/src/main/java/com/nanri/aiimage/modules/file/controller/FileUploadController.java @@ -1,6 +1,7 @@ package com.nanri.aiimage.modules.file.controller; import com.nanri.aiimage.common.api.ApiResponse; +import com.nanri.aiimage.modules.file.model.vo.ExcelInfoVo; import com.nanri.aiimage.modules.file.model.vo.UploadFileVo; import com.nanri.aiimage.modules.file.service.LocalFileStorageService; import io.swagger.v3.oas.annotations.Operation; @@ -11,8 +12,10 @@ import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; @@ -46,4 +49,14 @@ public class FileUploadController { MultipartFile file) throws Exception { return ApiResponse.success(localFileStorageService.saveTempFile(file)); } + + @GetMapping("/excel-info") + @Operation(summary = "读取 Excel 信息", description = "根据 fileKey 读取 Excel 第一行表头及总行数,供前端选择保留列和展示总条数。") + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "读取成功", content = @Content(schema = @Schema(implementation = ExcelInfoVo.class))), + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "源文件不存在") + }) + public ApiResponse excelInfo(@RequestParam String fileKey) throws Exception { + return ApiResponse.success(localFileStorageService.getExcelInfo(fileKey)); + } } diff --git a/backend-java/src/main/java/com/nanri/aiimage/modules/file/model/vo/ExcelInfoVo.java b/backend-java/src/main/java/com/nanri/aiimage/modules/file/model/vo/ExcelInfoVo.java new file mode 100644 index 0000000..273774c --- /dev/null +++ b/backend-java/src/main/java/com/nanri/aiimage/modules/file/model/vo/ExcelInfoVo.java @@ -0,0 +1,17 @@ +package com.nanri.aiimage.modules.file.model.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Data +@Schema(description = "Excel 文件信息") +public class ExcelInfoVo { + + @Schema(description = "表头列表") + private List headers; + + @Schema(description = "数据总行数") + private Integer totalRows; +} diff --git a/backend-java/src/main/java/com/nanri/aiimage/modules/file/service/LocalFileStorageService.java b/backend-java/src/main/java/com/nanri/aiimage/modules/file/service/LocalFileStorageService.java index 6236bff..ca18468 100644 --- a/backend-java/src/main/java/com/nanri/aiimage/modules/file/service/LocalFileStorageService.java +++ b/backend-java/src/main/java/com/nanri/aiimage/modules/file/service/LocalFileStorageService.java @@ -2,14 +2,26 @@ package com.nanri.aiimage.modules.file.service; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.IdUtil; +import com.nanri.aiimage.common.exception.BusinessException; import com.nanri.aiimage.config.StorageProperties; +import com.nanri.aiimage.modules.file.model.vo.ExcelInfoVo; import com.nanri.aiimage.modules.file.model.vo.UploadFileVo; import lombok.RequiredArgsConstructor; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.DataFormatter; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; @Service @RequiredArgsConstructor @@ -36,4 +48,73 @@ public class LocalFileStorageService { vo.setSize(file.getSize()); return vo; } + + public ExcelInfoVo getExcelInfo(String fileKey) throws IOException { + File inputFile = findLocalSourceFile(fileKey); + if (inputFile == null || !inputFile.exists()) { + throw new BusinessException("源文件不存在"); + } + + DataFormatter formatter = new DataFormatter(); + try (FileInputStream fis = new FileInputStream(inputFile); Workbook workbook = org.apache.poi.ss.usermodel.WorkbookFactory.create(fis)) { + Sheet sheet = workbook.getSheetAt(0); + Row headerRow = sheet.getRow(0); + if (headerRow == null) { + throw new BusinessException("Excel 表头为空"); + } + + Map headerMap = new HashMap<>(); + List headers = new ArrayList<>(); + for (int i = 0; i < headerRow.getLastCellNum(); i++) { + Cell cell = headerRow.getCell(i); + String value = normalizeCellText(cell == null ? null : formatter.formatCellValue(cell)); + if (value.isBlank()) { + continue; + } + value = value.split("idASIN国家状态价格变体数量", 2)[0].trim().isEmpty() + ? value + : value.split("idASIN国家状态价格变体数量", 2)[0].trim(); + if (headerMap.containsKey(value)) { + continue; + } + headerMap.put(value, i); + headers.add(value); + if ("缩略图地址8".equals(value)) { + break; + } + } + + ExcelInfoVo vo = new ExcelInfoVo(); + vo.setHeaders(headers); + vo.setTotalRows(Math.max(sheet.getLastRowNum(), 0)); + return vo; + } catch (BusinessException e) { + throw e; + } catch (Exception e) { + throw new BusinessException("读取 Excel 信息失败"); + } + } + + private File findLocalSourceFile(String fileKey) { + File baseDir = FileUtil.file(storageProperties.getLocalTempDir()); + if (!baseDir.exists()) { + return null; + } + List matchedFiles = FileUtil.loopFiles(baseDir, pathname -> pathname.isFile() && pathname.getName().startsWith(fileKey)); + return matchedFiles.isEmpty() ? null : matchedFiles.getFirst(); + } + + private String normalizeCellText(String value) { + if (value == null) { + return ""; + } + return value.replace("\ufeff", "") + .replace("\u3000", " ") + .replace("\r\n", " ") + .replace("\r", " ") + .replace("\n", " ") + .replace("\t", " ") + .trim() + .replaceAll("\\s+", " "); + } } diff --git a/frontend-vue/src/pages/brand/components/BrandConvertTab.vue b/frontend-vue/src/pages/brand/components/BrandConvertTab.vue index 8bbda4b..85d2977 100644 --- a/frontend-vue/src/pages/brand/components/BrandConvertTab.vue +++ b/frontend-vue/src/pages/brand/components/BrandConvertTab.vue @@ -1,6 +1,9 @@