From 56fd844b75ad3055146e812528176d9dc0c964ff Mon Sep 17 00:00:00 2001 From: cbb <1055026847@qq.com> Date: Mon, 29 Dec 2025 15:09:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=88=91=E7=9A=84=E5=9B=A2=E9=98=9F=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 2 + components/cb-file-picker/cb-file-picker.vue | 140 ++++ pages.json | 14 + pages/my-index/components/card-input.vue | 42 +- pages/my-index/my-index.vue | 2 +- pages/my-index/my-team.vue | 56 ++ .../wallet/bank-card/card-details.vue | 3 + pages/my-index/wallet/index.vue | 4 +- pages/my-index/wallet/real-id.vue | 67 ++ static/images/my-index/id-front.png | Bin 0 -> 7247 bytes static/images/my-index/id-opposite.png | Bin 0 -> 8050 bytes static/images/my-index/team-bg.png | Bin 0 -> 5030 bytes uni_modules/uni-file-picker/changelog.md | 91 +++ .../uni-file-picker/choose-and-upload-file.js | 287 ++++++++ .../uni-file-picker/uni-file-picker.vue | 680 ++++++++++++++++++ .../uni-file-picker/upload-file.vue | 323 +++++++++ .../uni-file-picker/upload-image.vue | 285 ++++++++ .../components/uni-file-picker/utils.js | 110 +++ uni_modules/uni-file-picker/package.json | 105 +++ uni_modules/uni-file-picker/readme.md | 10 + utils/request.js | 4 +- utils/uploadFile.js | 134 ++++ 22 files changed, 2346 insertions(+), 13 deletions(-) create mode 100644 .env create mode 100644 components/cb-file-picker/cb-file-picker.vue create mode 100644 pages/my-index/my-team.vue create mode 100644 pages/my-index/wallet/real-id.vue create mode 100644 static/images/my-index/id-front.png create mode 100644 static/images/my-index/id-opposite.png create mode 100644 static/images/my-index/team-bg.png create mode 100644 uni_modules/uni-file-picker/changelog.md create mode 100644 uni_modules/uni-file-picker/components/uni-file-picker/choose-and-upload-file.js create mode 100644 uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue create mode 100644 uni_modules/uni-file-picker/components/uni-file-picker/upload-file.vue create mode 100644 uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue create mode 100644 uni_modules/uni-file-picker/components/uni-file-picker/utils.js create mode 100644 uni_modules/uni-file-picker/package.json create mode 100644 uni_modules/uni-file-picker/readme.md create mode 100644 utils/uploadFile.js diff --git a/.env b/.env new file mode 100644 index 0000000..f9faf53 --- /dev/null +++ b/.env @@ -0,0 +1,2 @@ +# API +VITE_SYSTEM_URL = "http://ge465bd9.natappfree.cc" \ No newline at end of file diff --git a/components/cb-file-picker/cb-file-picker.vue b/components/cb-file-picker/cb-file-picker.vue new file mode 100644 index 0000000..a052557 --- /dev/null +++ b/components/cb-file-picker/cb-file-picker.vue @@ -0,0 +1,140 @@ + + + + + diff --git a/pages.json b/pages.json index 0a82779..f0cfc60 100644 --- a/pages.json +++ b/pages.json @@ -87,6 +87,20 @@ "navigationBarBackgroundColor": "#ffffff" } }, + { + "path": "pages/my-index/wallet/real-id", + "style": { + "navigationBarTitleText": "实名认证", + "navigationBarBackgroundColor": "#ffffff" + } + }, + { + "path": "pages/my-index/my-team", + "style": { + "navigationBarTitleText": "我的团队", + "navigationBarBackgroundColor": "#ffffff" + } + }, { "path": "pages/my-index/wallet/bank-card/card-details", "style": { diff --git a/pages/my-index/components/card-input.vue b/pages/my-index/components/card-input.vue index 1e5c8ff..c58d350 100644 --- a/pages/my-index/components/card-input.vue +++ b/pages/my-index/components/card-input.vue @@ -1,4 +1,11 @@ + + + + diff --git a/pages/my-index/wallet/bank-card/card-details.vue b/pages/my-index/wallet/bank-card/card-details.vue index 3e9cff5..341a90a 100644 --- a/pages/my-index/wallet/bank-card/card-details.vue +++ b/pages/my-index/wallet/bank-card/card-details.vue @@ -51,6 +51,9 @@ stateData.state === '101' ? '支付宝账号' : '微信账号' }`" > + + + diff --git a/pages/my-index/wallet/index.vue b/pages/my-index/wallet/index.vue index 6b241c0..2926ccf 100644 --- a/pages/my-index/wallet/index.vue +++ b/pages/my-index/wallet/index.vue @@ -13,7 +13,7 @@ key: '3', url: '/pages/my-index/wallet/edit-password' }, - { title: '实名认证', key: '4', url: '' } + { title: '实名认证', key: '4', url: '/pages/my-index/wallet/real-id' } ] @@ -23,7 +23,7 @@ 我的资产 - 2222 + 1222 diff --git a/pages/my-index/wallet/real-id.vue b/pages/my-index/wallet/real-id.vue new file mode 100644 index 0000000..2fab6d3 --- /dev/null +++ b/pages/my-index/wallet/real-id.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/static/images/my-index/id-front.png b/static/images/my-index/id-front.png new file mode 100644 index 0000000000000000000000000000000000000000..6c2c3ac893410999df0a0330b106db1fd83526bb GIT binary patch literal 7247 zcmdsc=T{SN)NMc%M0!(1ih!X=lOiQlX%Zj;p-D$NNDEaWgsuUR-a@EC0O`F6D7{w+ zf&zj-=)H#a=J&4q;rzR4>IcH|gb7t?2)Pbl|l0PH|005L4FIDsa03sg3 zc_rB$!d@FvL`66ddFiRY0F;kBS_c3g-PKT0()YL6HivtdO})D*uPrg}4|v=X)E6xH zb}1Zy(fNKG%$Mu^!n5*voxvV;SL|_Ebh;D9+iId$i-+}&s22V^b7FI*s2$K6uP!nM zWc{$`%u#jBFZu(CXu?~~r%pyK6TWS5AD_`ycy^0J0eti-lR3t2TN;;jcrkLd zeHw@ZEsXc+VlWt?5&N1`N0cu;tt&9^Qw`NMHAyglCN5Yp;v>YcWa_@DiOETQU0o~R zNpbp(wC9paTYEc#oiWriu6>`>$ zmr=3f0FVR+3y_Fw!`=M-{dwqIK; z8B6goS`;x6VP-z3h@_++(olfu)CF~7P%QUF>_0rkTV(nrQ@v^E`AKnCms?jkeE(&l z_?%e1POn&Btugqm**N=uxSTrHu&>X5-9_E{Uox>h8W6)r{I;X& zguA42eHx3slaO$`XpFkA_-;<#;Msrg>i+DfXwiGv{Iqe(MH;Fk<|scx=#Bq89l%Q2ar|E}Brf!zmU%!Eh08FT-{f- zD(LH12_Kfl=Id-I1D5sK-5iqvB!(#T1J3zjn}pEx`++}#(RntJOwUw;12rB2zjrh1 zG);8c@knR9<0x`W07$EL-mA0u^nGjV?bgTs@Mt7o_GnlRXDNFel%!HeVxBB%&~7Qa zk%>lMyq|!y7%}@yEqGXZJ~NS)Xui~`8rl1h0W3nyQE2r^hl_};@-V{&WvhmebeY{k zbX28Uc_#yTu7NAv&TJJW`XIg)7JfS6htvqWyVBjm@Xi8Ks6QLbI-zftl7!wNE+G_HPqh7NrO zHjAlEfD+R2_(V*zf--q@!lOX(%VCXv zQA)9~gb-DqOWDuKgfH_c&u0_XG1}=uvnksJgI+FcQS}QspRnItk`pRTe`_%pcNq=D z)8Fge%u`7w!97p4?~-b@OwV($hfEySbRNC;v_%Gg{F)!Hc2dHNl=7-SbYC(C)d`p< zn`%lnWNU_%+;Q~6Xnr+L*jq_5tO0$^N#^Fc6LOyq5e;1AaMaIjno3RgjF-sY)n+f? zA>SPz?4}jvRaZASn|l;-E}58sMqXuRXKYhEYymc8?QG4eA!;{>2V7u!vpsXCNj*}v z0ocas<=UeS0k&&{sUb1y>j9}FxP7h)oM!=pK)sJ15mG_c*B?Dm&N!IN6xas;tj5;W zPfj<>tHYZWUbPCwfDZpXIt&*H_0TVnm5vB|JXaSrMJ^|E{#*`rlIjhlr@Nbn-`e;eDO6dKaz+2K0ofo7U55t^82Hd8NF^Xvtk`zM}qBg78={+^-e4x0jfZEVU;hSZCT!boDXUlx;0 zPCPFytKS={X^($cSx|7%i9Iqe+Xblcc~U+NZs+^Ppafa0(!;D)9dJ`-1wg28|6NiQ z)LrADh)^xFkw=);f5%R*$cci83`;m%-7FV>2-JIT&IH>qH zI`a!;hi)@`%i!x+=%B2YTz9c>x`ALbjo)(VLMA@di*z)PTTFi7*R9{_6V&NJ<$q!i$XKlvMKa7J0Ha@{HUZmYox6Co2PMkdaciCQa@e!Eq{jwEk{qXgJft%uSJu%~u)qj74l$_`JIx{+uPvx2ti+yAY8NJpPiSyiK$%hVuV zN$33olJnjm^}s0jRVC^^s6X~-0c=`bhdW$Sfuw6iNj=&FE^+;= zBi5R17BlX=B3s53tI+p4ZejN?=2NyYTvrHVdQwK75B?_5U*h=cVDv*(5zO}KCw9yg zR9%j0^I=%M1q=s4OBc_25c?&F`puyOXNQ%(7=3v)ZtHc=oQ!4U`_hx-GyftS7BzMg(UpPnz5{+j}Vvw&VqKQL(BNekhj zqB+l{+V9G^ou8ApGVGpAp1esduR1P8uhu3+S3T1epU3B}KMwE@a9p=L1){9X`=wEP z+)P_luneaMU~u@L5;X)FZP#|mp@w+g;~DDR%SO&5{8C--Ce=b5w7XY@qC zzui*@g?xof`~r$m*F`klfI=a5Zg;uOeYN~vL~fKC<#QJ!5&vS-UgT*-Q^Iw=*LSR~ zw1o54*lo?HT9k3n2T61~xadO5T;-KXO)j4{Y>2+zlL>JUq$vxm~W@ z6Cv%%`qHsv@E1e1SWrk(PL@p$LDAf}J3^SG<>ZD@(6h==M+OGj=x^8;|8NVd0mtve zsBUu!f-AN1usR9oqg2i(lGkm9^2(Cg^4xuMI|05~#)p<1zN~}kyQbXo;7p=1pN`t;k*$n=wrMTTm8hnJ__5zQMmbNSsz{#ZJFPcZO>Gj zG#AQrQocGUz5V#My+XAlL=mDy7j@lqu*|@kU|V-qvoGni@Y8ct>BF;Bv^)^nfD8?{ z#xgI9OI<=`Djl&A+g$w5B0Mt|ez!)jt+)L2A=_fWiKSJOzlT)EF|_F!41+n?zxtm@ zN#Vuti(5sNMk_ei>fP$s!i}af=E`288&bE((Dtd!U@NH{O4!5K2U0V`$_*aG4RfIV zb6-{wt%sCuR~OqZ>oY#n0{5gn9}uw{DaC&Pi1WNNE`RwdmFgxuasX?v#6&A~rLHvM z)WYo0e!yp(Dk{#Ch_)D)D13-8O1_1m7^q3iA~G*S45gEdYG}>}JVwBD>oewm`Twhq zqgNntSYK`<(2pj6A-FpZakd~Xv+I{N0)H8V(G_8xxtN=p+2!EDqEp&GdYMd4sCD8H z<32RQQejB%Z?F|gSVAZkb22^L`rp z+gDP*Iu8mMVO7E1Q2x`=!kf-s7NBw^4nMK7TP|jT2p=OrTH^C!)JYuZyma@l)0y23 zHA#&}Wc)I7v47UL?vNEr1`4X60%!Qm$~&uhH=Y5|6^RWdijad!v-qrl`J3E|*Eok0 z5=wv444-s#rIABsSB;CM%3EUju?Fp%LuLBiiN&SHGB~_3zo0P25bWJ3Wi7Vx4Kg3` zm|ypn_)xRyk*9~gRCY@ev;5x(c6x@3>>Q=rWg<7DN|2bvhNUveAdk2nrd6h1>vY>y zO=pE`m-lY1mu`2L1RhrPecx!nO4=UTOLh6JwNq2En@~Kd{9BbU@tUh>j#gZuCd1{L zFLaI?AQn^ZGCaP2&Eliy+@rL>u~5I{VkldYEH`Z)R}uU@>*w^>Nbo z!{2|72f|Rxy!ER)Y^Adlcg%L{M<}Uacqy7+R@!|>>@!}RB);E_7dx<2GS&Ev%Bc*K zQEom*=%RJxDg#@IG4_viKseQi5YYEtwvdyP&<_$?x7ikNnCM3bR`ACi<}CKnwo9WBGYi)Ct=KBsghyBapHg{}&x-R1sn-kom! zlsv}zBdh2pin-pp1QD%<;NIESX)0E6iJqG~fA_2d0`Q4X6cValIbx4yt?4g(qm6N+ zsv8G+&jyEDN&>k8OG=&>LThYk>nwphiA7c?O{Id#!!n;8tSxVWlnms~E-EHFkB<8v zD^F~4fsn5J3zj!(T0W*TG~Cd^rf zDI-3DUs@b5W`k*^3s!m-rUw$e57%d-DbaaUE^X)Qz#!o_g3^I{({L7FG;j{jIw0*o zV&`pF-%{>bYRh$2$W&00x0-}uK|Gz}&pcg!s?RX7hHw9?`v~fGo`430_Ph}7TOUxZ z*{OR{BlJg82!&R10CXNVf?aYGUCMKZ-s~KDlr0$y{=}q}P8cU0N*6rS-eu2zmq9g> zX+c3NV&Oe_wm%?c^$P58dbf$Sk#V@#1TXd;(q5+mA;rXK-Hr6q{If_O_-e^(h*jD_ z&Ff#2J+-w&2}^bB(NF1pSmd;($X4tUd~ZTck3hr3Vu3$f8c}m@3qxdqU;buJ_P-BG zd)mDzK}tE?&rxXJsW2^37@%oPOn2c|e{PSnpPlq{YgPVe2g2q{HHrzgy#EgblFV^wY~h^YiWtGMxo-)rIc^|o@yH5ER4^doV*S7B9|=XctMW;bDkt=WT}K}SnZUP zwXT~;xKfmcC1kS5@NN3y)*IFeS861TxTU$8w;v}3{l4fKDvNpNV1DS;>G3;$x8UMJ zXzb=}ugg=$Otyw$-YP<=f?WnixBw;Q?HK>%KxZ=tGoWyWs{)S6pUtw z-#N8^H7*BLFBk=W?V0EUDwUocudS?`o|D8?C_aDY z(iTpwjZmSUHnZo$f9%QxxpP)0hB0co#qyt$Yk2H1MYZvX(dg$>7E%xH42oXk7@xU4 z$TBRRxGEX>LTXsNLPpK`+8~gS2lS!x-Jx!{Z|;lVy@*yb4W>5a2LyxR%O%y9JU#qVYE>qEQYhe_N#i8(1xn~c#|DI9&f?~;-C z`?fWacUm!>6wcz;yAEH|m6GNqcbbR)2+#f&Trm?Qk{$-PtlLY{5045t4v#+#OwI3^ zUXFY(pKZi{2mBf)8sWfp8ABf;4i^wk8JQ@vd4I1mH6DmkACa*rcP(_nO^wWv9D#_p z?8qWPMQ>$yXXahK%}ozR#{13gJyIP}_{y--ufeFKn%SGR@8@)*A1IyNA^-GKF=M@O zO;+kT?z9y2dwQaw<+*BL671NZ46IfusA({0=C%Q;??$pYV>@eeck}A0=D%q z^oA0pt0759SPi|n6ds{Z`;mLgzP+Vq3HK!dq$;^RaA_JT9#HLYFYxg+*J_m&iRNvmQ8Pzkv|Rn5oZ<-hdq^t3h2U+N$<7o*BF^*C&p>(}r<IxH8+N>(;MsBXnNb6uCQgPrwfG=6nOIgCjTozy| z>g|3iGdtO8aWnTiEq}-~V|ZciS{PeGABmBm@9))+U3Jig`xApASCbTTCE$If8dtqX zQgZUge61$@XREp1ESd}^&GHMXmOEz34HYI_$HYS%qLb@&&hZt~yAlhl(W%}t63p>t zDs&UtE2=R?GcafwA}-OHE?GAF^yw4)k0TORbY?zRffN6l^g!kZc&9>=7knXYH;?6a z%ep2jZVb5fJ%Uu&PC^O7NAJ%yxuVHnk)45&1dEC53(?U}SAmfu0z;c^{Mg1u5h5Sw zvf6S9Wfn2lTEUEIgpliI&eK^#jj6bY>D045EJSh8Z!2NrL?J&p0Wfgc+A~iM8h3)Y zu%AM$MoOYb(2n`)@_M^M6u%LE^}0>vAF$HA6eP%|Kcm>_Ns0H>0Lu*S=T_c|9CZXO zS?_6p)+4g6{~I)p9JU1AUYaTX31*>>y-jS72{EPs_JrxApwm9_Cr4f1dK0xzuC+dv zmLnDR1ZV%kQ(aL5_C}OH8C=|dE4(|?j3h1RjI@A>=t+OEu|Q~A{ zXJ2n)dXhP55 zjd;ZnlO%)zEO|bs@w9v+u({87915k#XQ&1LVUF63n-B}>+n_%@Ic_(2*# z#1W@OLNKem*b$feBLs&l4+0@px{|wm)z84MMoGe;_;)`(K7LM1OE&chOq9ovmqBRI zR`ir+oDzj`RZ9yY=Imt%R+ObJq8Zn~rVOkc_%$~-&(nQ4zsWHGK7MZ#KM5dg8mbVL J@)uU2{{s#tz5f6J literal 0 HcmV?d00001 diff --git a/static/images/my-index/id-opposite.png b/static/images/my-index/id-opposite.png new file mode 100644 index 0000000000000000000000000000000000000000..5d68e90d7d0a9d17fb7e8c68d915bb9c27a9acbb GIT binary patch literal 8050 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 DSYLF1 literal 0 HcmV?d00001 diff --git a/uni_modules/uni-file-picker/changelog.md b/uni_modules/uni-file-picker/changelog.md new file mode 100644 index 0000000..5320eb2 --- /dev/null +++ b/uni_modules/uni-file-picker/changelog.md @@ -0,0 +1,91 @@ +## 1.1.3(2025-12-03) +- 修复: 腾讯云目录错误导致的上传错误问题 +## 1.1.2(2025-09-17) +- 修复 设置readonly属性后内容插槽失效的问题。 +## 1.1.1(2025-09-03) +- 修复 动态dir目录,不生效的问题 +## 1.1.0(2025-09-02) +- 新增 dir 属性,可以选择上传目录 +## 1.0.13(2025-08-18) +- 修复 删除文件后,返回信息不包含file对象的问题 +## 1.0.12(2025-04-14) +- 修复 支付宝小程序 上传样式问题 +## 1.0.10(2024-07-09) +- 优化 vue3兼容性 +## 1.0.9(2024-07-09) +- 修复 value 属性不兼容vue3的bug +## 1.0.8(2024-03-20) +- 补充 删除文件时返回文件下标 +## 1.0.7(2024-02-21) +- 新增 微信小程序选择视频时改用chooseMedia,并返回视频缩略图 +## 1.0.6(2024-01-06) +- 新增 微信小程序不再调用chooseImage,而是调用chooseMedia +## 1.0.5(2024-01-03) +- 新增 上传文件至云存储携带本地文件名称 +## 1.0.4(2023-03-29) +- 修复 手动上传删除一个文件后不能再上传的bug +## 1.0.3(2022-12-19) +- 新增 sourceType 属性, 可以自定义图片和视频选择的来源 +## 1.0.2(2022-07-04) +- 修复 在uni-forms下样式不生效的bug +## 1.0.1(2021-11-23) +- 修复 参数为对象的情况下,url在某些情况显示错误的bug +## 1.0.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-file-picker](https://uniapp.dcloud.io/component/uniui/uni-file-picker) +## 0.2.16(2021-11-08) +- 修复 传入空对象 ,显示错误的Bug +## 0.2.15(2021-08-30) +- 修复 return-type="object" 时且存在v-model时,无法删除文件的Bug +## 0.2.14(2021-08-23) +- 新增 参数中返回 fileID 字段 +## 0.2.13(2021-08-23) +- 修复 腾讯云传入fileID 不能回显的bug +- 修复 选择图片后,不能放大的问题 +## 0.2.12(2021-08-17) +- 修复 由于 0.2.11 版本引起的不能回显图片的Bug +## 0.2.11(2021-08-16) +- 新增 clearFiles(index) 方法,可以手动删除指定文件 +- 修复 v-model 值设为 null 报错的Bug +## 0.2.10(2021-08-13) +- 修复 return-type="object" 时,无法删除文件的Bug +## 0.2.9(2021-08-03) +- 修复 auto-upload 属性失效的Bug +## 0.2.8(2021-07-31) +- 修复 fileExtname属性不指定值报错的Bug +## 0.2.7(2021-07-31) +- 修复 在某种场景下图片不回显的Bug +## 0.2.6(2021-07-30) +- 修复 return-type为object下,返回值不正确的Bug +## 0.2.5(2021-07-30) +- 修复(重要) H5 平台下如果和uni-forms组件一同使用导致页面卡死的问题 +## 0.2.3(2021-07-28) +- 优化 调整示例代码 +## 0.2.2(2021-07-27) +- 修复 vue3 下赋值错误的Bug +- 优化 h5平台下上传文件导致页面卡死的问题 +## 0.2.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 0.1.1(2021-07-02) +- 修复 sourceType 缺少默认值导致 ios 无法选择文件 +## 0.1.0(2021-06-30) +- 优化 解耦与uniCloud的强绑定关系 ,如不绑定服务空间,默认autoUpload为false且不可更改 +## 0.0.11(2021-06-30) +- 修复 由 0.0.10 版本引发的 returnType 属性失效的问题 +## 0.0.10(2021-06-29) +- 优化 文件上传后进度条消失时机 +## 0.0.9(2021-06-29) +- 修复 在uni-forms 中,删除文件 ,获取的值不对的Bug +## 0.0.8(2021-06-15) +- 修复 删除文件时无法触发 v-model 的Bug +## 0.0.7(2021-05-12) +- 新增 组件示例地址 +## 0.0.6(2021-04-09) +- 修复 选择的文件非 file-extname 字段指定的扩展名报错的Bug +## 0.0.5(2021-04-09) +- 优化 更新组件示例 +## 0.0.4(2021-04-09) +- 优化 file-extname 字段支持字符串写法,多个扩展名需要用逗号分隔 +## 0.0.3(2021-02-05) +- 调整为uni_modules目录规范 +- 修复 微信小程序不指定 fileExtname 属性选择失败的Bug diff --git a/uni_modules/uni-file-picker/components/uni-file-picker/choose-and-upload-file.js b/uni_modules/uni-file-picker/components/uni-file-picker/choose-and-upload-file.js new file mode 100644 index 0000000..9c6bcdf --- /dev/null +++ b/uni_modules/uni-file-picker/components/uni-file-picker/choose-and-upload-file.js @@ -0,0 +1,287 @@ +'use strict'; + +const ERR_MSG_OK = 'chooseAndUploadFile:ok'; +const ERR_MSG_FAIL = 'chooseAndUploadFile:fail'; + +function chooseImage(opts) { + const { + count, + sizeType = ['original', 'compressed'], + sourceType, + extension + } = opts + return new Promise((resolve, reject) => { + // 微信由于旧接口不再维护,针对微信小程序平台改用chooseMedia接口 + // #ifdef MP-WEIXIN + uni.chooseMedia({ + count, + sizeType, + sourceType, + mediaType: ['image'], + extension, + success(res) { + res.tempFiles.forEach(item => { + item.path = item.tempFilePath; + }) + resolve(normalizeChooseAndUploadFileRes(res, 'image')); + }, + fail(res) { + reject({ + errMsg: res.errMsg.replace('chooseImage:fail', ERR_MSG_FAIL), + }); + }, + }) + // #endif + // #ifndef MP-WEIXIN + uni.chooseImage({ + count, + sizeType, + sourceType, + extension, + success(res) { + resolve(normalizeChooseAndUploadFileRes(res, 'image')); + }, + fail(res) { + reject({ + errMsg: res.errMsg.replace('chooseImage:fail', ERR_MSG_FAIL), + }); + }, + }); + // #endif + + }); +} + +function chooseVideo(opts) { + const { + count, + camera, + compressed, + maxDuration, + sourceType, + extension + } = opts; + return new Promise((resolve, reject) => { + // 微信由于旧接口不再维护,针对微信小程序平台改用chooseMedia接口 + // #ifdef MP-WEIXIN + uni.chooseMedia({ + count, + compressed, + maxDuration, + sourceType, + extension, + mediaType: ['video'], + success(res) { + const { + tempFiles, + } = res; + resolve(normalizeChooseAndUploadFileRes({ + errMsg: 'chooseVideo:ok', + tempFiles: tempFiles.map(item => { + return { + name: item.name || '', + path: item.tempFilePath, + thumbTempFilePath: item.thumbTempFilePath, + size:item.size, + type: (res.tempFile && res.tempFile.type) || '', + width:item.width, + height:item.height, + duration:item.duration, + fileType: 'video', + cloudPath: '', + } + }), + }, 'video')); + }, + fail(res) { + reject({ + errMsg: res.errMsg.replace('chooseVideo:fail', ERR_MSG_FAIL), + }); + }, + }) + // #endif + // #ifndef MP-WEIXIN + uni.chooseVideo({ + camera, + compressed, + maxDuration, + sourceType, + extension, + success(res) { + const { + tempFilePath, + duration, + size, + height, + width + } = res; + resolve(normalizeChooseAndUploadFileRes({ + errMsg: 'chooseVideo:ok', + tempFilePaths: [tempFilePath], + tempFiles: [{ + name: (res.tempFile && res.tempFile.name) || '', + path: tempFilePath, + size, + type: (res.tempFile && res.tempFile.type) || '', + width, + height, + duration, + fileType: 'video', + cloudPath: '', + }, ], + }, 'video')); + }, + fail(res) { + reject({ + errMsg: res.errMsg.replace('chooseVideo:fail', ERR_MSG_FAIL), + }); + }, + }); + // #endif + }); +} + +function chooseAll(opts) { + const { + count, + extension + } = opts; + return new Promise((resolve, reject) => { + let chooseFile = uni.chooseFile; + if (typeof wx !== 'undefined' && + typeof wx.chooseMessageFile === 'function') { + chooseFile = wx.chooseMessageFile; + } + if (typeof chooseFile !== 'function') { + return reject({ + errMsg: ERR_MSG_FAIL + ' 请指定 type 类型,该平台仅支持选择 image 或 video。', + }); + } + chooseFile({ + type: 'all', + count, + extension, + success(res) { + resolve(normalizeChooseAndUploadFileRes(res)); + }, + fail(res) { + reject({ + errMsg: res.errMsg.replace('chooseFile:fail', ERR_MSG_FAIL), + }); + }, + }); + }); +} + +function normalizeChooseAndUploadFileRes(res, fileType) { + res.tempFiles.forEach((item, index) => { + if (!item.name) { + item.name = item.path.substring(item.path.lastIndexOf('/') + 1); + } + if (fileType) { + item.fileType = fileType; + } + item.cloudPath = + Date.now() + '_' + index + item.name.substring(item.name.lastIndexOf('.')); + }); + if (!res.tempFilePaths) { + res.tempFilePaths = res.tempFiles.map((file) => file.path); + } + return res; +} + +function uploadCloudFiles(files, max = 5, onUploadProgress) { + files = JSON.parse(JSON.stringify(files)) + const len = files.length + let count = 0 + let self = this + return new Promise(resolve => { + while (count < max) { + next() + } + + function next() { + let cur = count++ + if (cur >= len) { + !files.find(item => !item.url && !item.errMsg) && resolve(files) + return + } + const fileItem = files[cur] + const index = self.files.findIndex(v => v.uuid === fileItem.uuid) + fileItem.url = '' + delete fileItem.errMsg + + uniCloud + .uploadFile({ + filePath: fileItem.path, + cloudPath: fileItem.cloudPath, + fileType: fileItem.fileType, + onUploadProgress: res => { + res.index = index + onUploadProgress && onUploadProgress(res) + } + }) + .then(res => { + fileItem.url = res.fileID + fileItem.index = index + if (cur < len) { + next() + } + }) + .catch(res => { + fileItem.errMsg = res.errMsg || res.message + fileItem.index = index + if (cur < len) { + next() + } + }) + } + }) +} + + + + + +function uploadFiles(choosePromise, { + onChooseFile, + onUploadProgress +}) { + return choosePromise + .then((res) => { + if (onChooseFile) { + const customChooseRes = onChooseFile(res); + if (typeof customChooseRes !== 'undefined') { + return Promise.resolve(customChooseRes).then((chooseRes) => typeof chooseRes === 'undefined' ? + res : chooseRes); + } + } + return res; + }) + .then((res) => { + if (res === false) { + return { + errMsg: ERR_MSG_OK, + tempFilePaths: [], + tempFiles: [], + }; + } + return res + }) +} + +function chooseAndUploadFile(opts = { + type: 'all' +}) { + if (opts.type === 'image') { + return uploadFiles(chooseImage(opts), opts); + } else if (opts.type === 'video') { + return uploadFiles(chooseVideo(opts), opts); + } + return uploadFiles(chooseAll(opts), opts); +} + +export { + chooseAndUploadFile, + uploadCloudFiles +}; diff --git a/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue b/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue new file mode 100644 index 0000000..cf67ac7 --- /dev/null +++ b/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue @@ -0,0 +1,680 @@ + + + + + diff --git a/uni_modules/uni-file-picker/components/uni-file-picker/upload-file.vue b/uni_modules/uni-file-picker/components/uni-file-picker/upload-file.vue new file mode 100644 index 0000000..0d26379 --- /dev/null +++ b/uni_modules/uni-file-picker/components/uni-file-picker/upload-file.vue @@ -0,0 +1,323 @@ + + + + + \ No newline at end of file diff --git a/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue b/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue new file mode 100644 index 0000000..0ce5eb7 --- /dev/null +++ b/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue @@ -0,0 +1,285 @@ + + + + + diff --git a/uni_modules/uni-file-picker/components/uni-file-picker/utils.js b/uni_modules/uni-file-picker/components/uni-file-picker/utils.js new file mode 100644 index 0000000..1bc9259 --- /dev/null +++ b/uni_modules/uni-file-picker/components/uni-file-picker/utils.js @@ -0,0 +1,110 @@ +/** + * 获取文件名和后缀 + * @param {String} name + */ +export const get_file_ext = (name) => { + const last_len = name.lastIndexOf('.') + const len = name.length + return { + name: name.substring(0, last_len), + ext: name.substring(last_len + 1, len) + } +} + +/** + * 获取扩展名 + * @param {Array} fileExtname + */ +export const get_extname = (fileExtname) => { + if (!Array.isArray(fileExtname)) { + let extname = fileExtname.replace(/(\[|\])/g, '') + return extname.split(',') + } else { + return fileExtname + } + return [] +} + +/** + * 获取文件和检测是否可选 + */ +export const get_files_and_is_max = (res, _extname) => { + let filePaths = [] + let files = [] + if(!_extname || _extname.length === 0){ + return { + filePaths, + files + } + } + res.tempFiles.forEach(v => { + let fileFullName = get_file_ext(v.name) + const extname = fileFullName.ext.toLowerCase() + if (_extname.indexOf(extname) !== -1) { + files.push(v) + filePaths.push(v.path) + } + }) + if (files.length !== res.tempFiles.length) { + uni.showToast({ + title: `当前选择了${res.tempFiles.length}个文件 ,${res.tempFiles.length - files.length} 个文件格式不正确`, + icon: 'none', + duration: 5000 + }) + } + + return { + filePaths, + files + } +} + + +/** + * 获取图片信息 + * @param {Object} filepath + */ +export const get_file_info = (filepath) => { + return new Promise((resolve, reject) => { + uni.getImageInfo({ + src: filepath, + success(res) { + resolve(res) + }, + fail(err) { + reject(err) + } + }) + }) +} +/** + * 获取封装数据 + */ +export const get_file_data = async (files, type = 'image') => { + // 最终需要上传数据库的数据 + let fileFullName = get_file_ext(files.name) + const extname = fileFullName.ext.toLowerCase() + let filedata = { + name: files.name, + uuid: files.uuid, + extname: extname || '', + cloudPath: files.cloudPath, + fileType: files.fileType, + thumbTempFilePath: files.thumbTempFilePath, + url: files.path || files.path, + size: files.size, //单位是字节 + image: {}, + path: files.path, + video: {} + } + if (type === 'image') { + const imageinfo = await get_file_info(files.path) + delete filedata.video + filedata.image.width = imageinfo.width + filedata.image.height = imageinfo.height + filedata.image.location = imageinfo.path + } else { + delete filedata.image + } + return filedata +} diff --git a/uni_modules/uni-file-picker/package.json b/uni_modules/uni-file-picker/package.json new file mode 100644 index 0000000..b13e315 --- /dev/null +++ b/uni_modules/uni-file-picker/package.json @@ -0,0 +1,105 @@ +{ + "id": "uni-file-picker", + "displayName": "uni-file-picker 文件选择上传", + "version": "1.1.3", + "description": "文件选择上传组件,可以选择图片、视频等任意文件并上传到当前绑定的服务空间", + "keywords": [ + "uni-ui", + "uniui", + "图片上传", + "文件上传" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "", + "uni-app": "^4.33", + "uni-app-x": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue", + "darkmode": "x", + "i18n": "x", + "widescreen": "x" + }, + "uni_modules": { + "dependencies": [ + "uni-scss" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "√", + "aliyun": "√", + "alipay": "√" + }, + "client": { + "uni-app": { + "vue": { + "vue2": "√", + "vue3": "√" + }, + "web": { + "safari": "√", + "chrome": "√" + }, + "app": { + "vue": "√", + "nvue": "-", + "android": "√", + "ios": "√", + "harmony": "√" + }, + "mp": { + "weixin": "√", + "alipay": "√", + "toutiao": "√", + "baidu": "√", + "kuaishou": "√", + "jd": "-", + "harmony": "-", + "qq": "√", + "lark": "-" + }, + "quickapp": { + "huawei": "√", + "union": "√" + } + }, + "uni-app-x": { + "web": { + "safari": "-", + "chrome": "-" + }, + "app": { + "android": "-", + "ios": "-", + "harmony": "-" + }, + "mp": { + "weixin": "-" + } + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-file-picker/readme.md b/uni_modules/uni-file-picker/readme.md new file mode 100644 index 0000000..7393e6c --- /dev/null +++ b/uni_modules/uni-file-picker/readme.md @@ -0,0 +1,10 @@ + +## FilePicker 文件选择上传 + +> **组件名:uni-file-picker** +> 代码块: `uFilePicker` + + +文件选择上传组件,可以选择图片、视频等任意文件并上传到当前绑定的服务空间 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-file-picker) \ No newline at end of file diff --git a/utils/request.js b/utils/request.js index dc54999..3a0ff57 100644 --- a/utils/request.js +++ b/utils/request.js @@ -1,6 +1,6 @@ import { getToken, removeToken } from './storage' -const BASE_URL = 'http://c36bd4b4.natappfree.cc' +const BASE_URL = import.meta.env.VITE_SYSTEM_URL /** * 网络请求封装 @@ -14,7 +14,7 @@ const request = options => { method: 'GET', data: {}, header: { - 'deviceId': uni.getDeviceInfo().deviceId, + deviceId: uni.getDeviceInfo().deviceId, 'Content-Type': 'application/json' // 默认请求内容类型 } } diff --git a/utils/uploadFile.js b/utils/uploadFile.js new file mode 100644 index 0000000..61e69a3 --- /dev/null +++ b/utils/uploadFile.js @@ -0,0 +1,134 @@ +import { getToken } from './storage' + +/** + * 二次封装的uni.uploadFile方法 (Promise化) + * @param {string} filePath - 要上传的文件路径 + * @param {Object} [config] - 可选配置项 + * @param {string} [config.url] - 上传接口地址,若不传则使用默认或全局配置 + * @param {string} [config.name='file'] - 文件对应的 key + * @param {Object} [config.formData={}] - 额外的 form data + * @param {Object} [config.header] - 请求头,可覆盖默认头 + * @param {number} [config.timeout] - 超时时间(ms) + * @returns {Promise} 返回一个Promise对象,成功时解析上传响应数据 + */ +export const uploadSingleFile = (filePath, config = {}) => { + // 默认配置,可从全局导入或在此定义 + const DEFAULT_CONFIG = { + baseURL: import.meta.env.VITE_SYSTEM_URL, + // timeout: 30000, + name: 'file', + header: { + deviceId: uni.getDeviceInfo().deviceId, + Authorization: `Bearer ${getToken()}` + } + } + + // 合并配置 + const mergedConfig = { + ...DEFAULT_CONFIG, + ...config, + header: { + ...DEFAULT_CONFIG.header + } + } + + const { baseURL, ...uploadOptions } = mergedConfig + const finalUrl = baseURL + ? `${baseURL}${uploadOptions.url || ''}` + : uploadOptions.url + + if (!finalUrl) { + return Promise.reject(new Error('上传接口地址不能为空')) + } + + return new Promise((resolve, reject) => { + uni.showLoading({ + title: '上传中...', + mask: true // 防止触摸穿透 + }) + const uploadTask = uni.uploadFile({ + url: finalUrl, + filePath: filePath, + name: uploadOptions.name, + formData: uploadOptions.formData, + header: uploadOptions.header, + timeout: uploadOptions.timeout, + success: res => { + uni.hideLoading() + if (res.statusCode === 200) { + try { + // 尝试解析返回数据,假设是 + const data = + typeof res.data === 'string' + ? JSON.parse(res.data) + : res.data + // 验证失效去登录页 + if (data.code === 401) { + uni.removeStorage({ + key: 'token' + }) + uni.reLaunch({ + url: '/pages/login/login' + }) + return + } + if (data.code === 200) { + console.log('上传成功:', data) + resolve(data.url) // 根据后端实际结构,可能需进一步处理,如 data.data.url + return + } + + uni.showToast({ + title: data.msg || '请求失败', + icon: 'none' + }) + } catch (e) { + // 解析失败可能返回的是字符串,直接返回 + resolve(res.data) + } + return + } + + reject(new Error(`上传失败,状态码: ${res.statusCode}`)) + }, + fail: err => { + uni.hideLoading() + reject(err) + } + }) + + // 可选:监听上传进度事件[6](@ref) + uploadTask.onProgressUpdate(res => { + console.log('上传进度:', res.progress) + console.log('已上传:', res.totalBytesSent, '字节') + console.log('总大小:', res.totalBytesExpectedToSend, '字节') + if (res.progress !== 100) { + uni.showLoading({ + title: `업로드 진행: ${res.progress}`, + mask: true // 防止触摸穿透 + }) + } + // 可通过自定义事件或回调函数将进度传递出去 + if (typeof config.onProgress === 'function') { + config.onProgress(res) + } + }) + }) +} + +/** + * 多文件上传 + * @param {Array} filePaths - 文件路径数组 + * @param {Object} config - 同uploadSingleFile的config + * @returns {Promise} 返回一个Promise,解析为所有上传结果数组 + */ +export const uploadMultipleFiles = (filePaths, config = {}) => { + // 使用Promise.all同时发起所有上传请求[3,4](@ref) + const uploadPromises = filePaths.map( + filePath => + uploadSingleFile(filePath, config) + .then(res => ({ status: 'fulfilled', value: res })) // 成功,记录结果 + .catch(err => ({ status: 'rejected', reason: err })) // 失败,记录原因 + ) + return Promise.all(uploadPromises) +}