pFTLASLb`GF%hxD6~GsxenjVCcd${eZ0}RQuFZ
z6)9|j)>(@j@y7k?h9A3(59eEtJvr;u53G(bw+1n+JbpHd!AIu+_DRj6{`4f6FB6KT&EODGSW)P?Da*IHIvZ0FzsbD>XUbihMVVKRROS8aRKBSBZ3-nh14X
z%r!jZD`!1ac{SSG;A$?7TMnS&wJ9a8@D-6vlNtN2`HuC!bQUH>U=tKFQ+K~8IKzXu
zm0GrvP^49KzPtUqVpmNofa%MxMA(zGJ^~3`-0(+g52(Ez!mJPV
zM|Iyv@XcTC#bFKPsAxYLgIc=2iV~;pWGaxsSSDaeU+92WPd2LgO4kEjcougQI|)@N
z7!f#hcynL#dWaqmFO9uC*+Ip!LIb}ma%Lb+i*Zu$oOk$S$I_Bk$a2%Po1Gn)Rc4r!
zn@Rv`uXCp(7&*n|0`ReapK)E}jcE3avE|JzC?If|`!#|B60_+QPG0>b72d7=`D8dj
zA~{$YGnh{KW3RrcKeNZ+ZEDX!^|_%udR*mPC-OgRbS7VmNd3^RS_B!=6Hu1hMi$AK
zEz3}OP|d<)H>SSo;Z2f4nbLa*+?zh37T$2^UgGV&S3!Hp%d+LUlLn1#7Xf0Gi#LC!;?qY+B<_
z*`oFQ4gh~1BW;dGum-m7>xFcxm3_JM`B^rm#Gs86U$X
z?}aa}wbbE=ow0Ex0noMS`-42&ewD`rK(Oap4RE_1<2MtWh^XG}RYG4^Ta2@^_n>1E
z8R)hRm?SNS=z0_UIDD<+6vNadf}tSFAmm_3*>*H+bg#25wUmSeGGI?Yd{X&}!(pG@
zH2B_JT*PIojFXuzS`$e`0Tt)5Bfs6$qP}+)A%6;V@oJcl)
zA<=~)KtyWOWffuYo_e)Wa-Z0i<|GpP%|BxRN0#6rMfbYa1RUtMq=&a7tX87q8C?f
zx4mf=1l6Fif}xy2CbqMo`?V;nZe7pzX9^1m`N$-1DvFgZ5}OFTl{SLL>_7ak
zTYz48>%4ID=Ok^}t2(HtIO@4lIY~kn
zt_Z=Re#D{5U0*PPkhS(_P6PDnO3u0hO#`}WFK;r6S#L87Rx@*XgGD6-`qK&3iMhn*
zGBiqBOMhCDn})oM(Msmce?y-DAzdWE-)gV3&24qe)|Tc&n{Z~HBiLQdyhYV@8k4KA
ztCYJ_<8uDIaWp$!)c2dx%cVBZdtGS14(yn!pV_|%*6Ryf!&m<_{o&pIuMLlH)H-*k{~+AbIvTL^x~7V-f;AKyl6oU(^&m0sEMQmDyw;aZ
z53_s`pv~}oZ%EWSPpHxNM?!%nw|pado2wf^6tpdz1WUD`D$3txk2A7cCH~hO;M4}U
z!68qEsz3briD%^0IY)=8#2f9RD#9ft?4i5U8*_Y(PBn(7!Eq4gT^RPEpjX!YE@-ox
zPdB{GQP^Z&h5xLkV~T=*6*01jobQu
z!9N=lav_{l>ee(6ObSUqQMvtV4EhYyQz)Ebze#cT+`C7_-z|_*1@ss+`IA6I{U-&d
zq{pi#yxNkILi+Xj)QOGo!^bAccza)V^zc`2?f`=k^@%?SMm5vfkHw(9q=)DpkI9v$@>7nJazW#QT6z{jZHook78SI
zb?hx%=B_YnQPKL}sbgt0u)!Ikgi-H-)=7LkTPBhNf$A%eh?_%*Dy-+&&o8-xcyQCOVF7
z6m~V;fvCJJ?XKH|B2<7@FJzy^%H-6Hz@U^?#@m*=fc)^~Q0{l|`=4Nv28qXB+1b!|
zxM0uqfOp!+E~ricsQc>aKsBPlG6q(dD<`X)jmmse=bhN~FVh3x_u?(7)_5{z3Vyc?
znvrZgNJRkutRjY#xk(cDSX~>XL|;eJPS>PEZGHosO(L_35x*z5HF97X)Zu)$XTjZV
z*<&~gU+x)vJU1>{4XbK`@^!-?=Lk{Qtad6lnLGjxzM}6
zCKf+b%o8g0Ncm)BrSBg(5QaB}@tEjGH#gBzPYajmvQj)>labLgl23p#T
zxWI+AC8p0pBE_RZWj@x#?WsGFB1orPc{|;zc_)
zL<3iILw9l3ju+RwJugH51(`6QWufAVZ$`VLp_!(GgmfEC%ZOO{VOUrf@R(-w>C>^R
z=yR^KD;LfI+E!)C*93n7Y8s2uEmBWIjyr5XYbVhm{;y7W#)W`8fYZKx*X`V)5Ys1+
z9FB!4_kj{Gr4;;ZYnciy%uu{MC7l#|7>lSxv(yVVreITE_iWAKha@-dq=};~
zYaPAaSag;ywzRuePJKu=BMkzZA
zi@;HwDZ`ta;V2v7i4p9#F^Vnu-To-IDK5kyb{{_W5`&7&s{R^&c+TF$A@}))1!~iC
z1YTkLtFw7m8J;)ijo^=^ro04kw12bj5he)pUU$z!l&DMcLjA^no#`lbCb|JeJ{`r_FsZ8;0A(BPU&MFx9?$NO}DX?5ct
z{rrm5tLXBl=phd~swGc0Bln90G;gpSXFWcyYKld&aU{CsIBQL@KZO`
z4X`+S`3QP)?36xwhFvL>>P<3nGXik)NCdNxw+5bg8uk*gb^JArG9#;S_^Ugbud~^;bvrq0H)UK?9#oNE;A_{xjQEws(yNP(+4l#U4U;mG~
zWNyj)9bCkz1d=~r(A~txX?H$6cvmU~Tis+kfG`h6BOGuWeC(S2mmV?glZP3=Swz=R
z&AqwZNv=?DbbxM-z>u_U3C`Z2q%;
zB8}-|z|g<=k%JWGu3<1KdTKHn9uF%>rvYb%q_!>MI#&@Oa|>MR6b)PVrf?jTLmb)a
zR(YHR;oMd2&dOay|J%!r=-UzJfzkh(e~4T_`_)qg&F+9n>;vPjl#0!FOqoYhWm+Z-&Q!6LTK`MqY9>(5vqZl<5iI$4D3VGm&ESK}rRqvMK0$sBV4>3!SWs^(tJ
zE2NDLb&Ec_(AzsWbt#-EZjby6R^HiA=Wf8JE4s4r67fcH!
zy*kR!U$?_blZNo=e4k>Gy7+C^Q$VI{#6|ov<+=6R^wP})*WrJ_kT3-J)7f&9|8R8Q
z4VnmUeJ8_PQQ{&itlLF9-7DbcXsk;nPA`hq)q$T;)g}6^IlrCL8ZN>pYDss}+Y&gd
z32Vod(hRC_MXg}~Ugsu$ATGON%v-;iG&8Vy&(8Kiv#Q-@WNA#9
zmQpug`KEcPzwL4LzWZ5ePiFv`f?c7@n=ky|gtM3}HzBU!#)
zKj!IV*m(cV4w-ae#l`Z8;;BpbG|+qB6n0e_#%Nm-R8xb&uVX6+7n%Cyt`l=FS{z1c
zm_fDY#UEw+^tgR+x&@&-d(6ejWuMJxfDq?o*EBpIbHZp|1FXiwzs&g7v>h&s_=S0<
zB7nZ0R5Ycr-iKX`x(w^hlo(Kz$c$Wk=ZM`OG8KsltvloT_wS-!rXuV41G9byiCf{T
zBSl9Mc|^pSi;3U4%Vff+3~HMz)5gE1^W|rvtgSi6*#<|KsK}J
z2)cR;SFw>Fxs9>$?;w5u-6wq=E=dn?fIi#|XV-OVPGPuVLN}^xDDt$V
zi`H<_(2=In2*A61(DH9Q{dJ@x(KD%lZau;PfBH%P!>s>g82X5USoU*YypRq4SE2^V
zt@S@?9}DAw(gPH4{;9tGs?9#Z_sG7;cBmo4CAkqe_3x*(yy*AqM^I#Hn@S!k_>v{#
z%T&JGFIH#Tr0kCYvOhcRKN7NZ9uXtJ4G6J6Ov-II3C{eHE%HM;8t~o=nll%0S!y#v
z`1C}5zW~HTF2kN}axWiN*p*=U$WrmbKGs$yFd02ZD#4sN(>DTT79hGqZB!GvtrRBK
zc8~dAGuuMs-5*hITpSXwe6MlKAbU7a_N5i$zWNh>bz2a_hZ#BeZw^Q4p-RgR5%Q<;
z@@0VvBa+%9=f0XRgq$4fi)*r4Wtb#K@@}KLt$5mjs9s((9Z7VA!yMFJr#FxOlbokv
z&W&*WblI0BnYLRdB=eTHT05tvPKK!0|45Fd&`Y*X8JRUP4Ou
zs^$@{-@MEaL=>S{ovT@R+^oQ&o?y$g`_+jbjIOy)TI`
znxA_=NF;&o_qjZ%mCZFxsB;=~uVNm~xr7q`
z+gBoto}GqFk)Z6^S_ocC--AHYwN}L^f400F8a*D{q%Ln&?4Qt)t$Os-_Z8YWR<#9I
zV)w#U33mTRXmbzW*^y`&0d0P>5$`Rgc7M3)(33&IuJf7zZ>t@x
zuUrO~_E$9gy2@0fRQCtdFcP6Y%ajQ^^q{7_*4r`v>}VPKM6hj4+#khkvR
zxG8KkMO4KfMCpt!&BZPPKfq5VVd@WG9f)^6Ye7rD7Wp-7w(_B|qKQD(P--?35VwmA
z^kI%NO}S#pi}gmB(}ubG1HLNcn3(GI3JarI#=)ryD3-+dk%DBl2R|EQ2>87#J^~OqUz0f?4}ZIzD2>t&KJL
zYfGKfr@(1S@e)VFmE`*9&+TMBu_2n;2YcdL2r=QGs#_&Q3QpsX(i(clM33vEG}Hsb
zKb8k63r}7G#vc7Q3e^37Z99C{XbU^fvA>fogi1cDgLc-Rjkay?`r|~bVd)O`cIyw@
zxq=2ga
z2MuOMoQu%~1aCzUBa1>2-t&X^M_GUyX6@Jo9z#0OKQT7bB|H_19oLACRjB;-b>OB+t!|
zmOquH003^wf3pA=>EAavwULibU6`t@=GtgE8q$OM0~R^drt!>f9j;f2KAh
ze!^E-_l!^WUF{e0c@kI8k?Rr&mQ@o)l#Hmf-nD4T)N=AQjso?bel$kHj}=-3u&DJ9
z!Ll`_C2iYaW$w3#3LNh7;t@NjTi`=fWxk`%g>snsYQ^){|%O0Z%HQgc!#8xwd?+wT+D=z!@_@)9H+)G+zFw
z{2j(Tf6r5#J{K=1Q@{}@%M)%*eA`6==fhz$%{_DA+`^o*JJpe>Q}TDcGz>lkf(VM48H4tNAprd
z&7^i87l!Qlw8<`jC>KSnv~PoOF|@4XzYRXC|*L{F`NpNRVl;0^p862sS+dy0Xmx
z{HZ`GHMnS%`m0*2#-3RlM5S5vA=<1l!0@gk1JA}fMKHcb1?zM5`%MT19td$`oqS2;
zltp?#>X3*KcV=ZdhHPdYD_iOH&jLdP%{-BmLJi`>07@&j)=%LeSGm?BJtsxge@GtIhDz2n_VM
zd24k0k4?*3IdKL=sYQxsl|&my&0ixY84y4JUE+eK>-uw0uzNim{-;=tmf;T4h4pGK
zcM0)xjVT@#0zy!20Me44AnygEC$SD@AH2_fj)YAI4e8%HtIR%$OX^yqrK_>rBY5N-
zB?M615A6G-U#34hzskO}l2={Udp3La;yhI-PaMUCY%iQjDe4_AH#P3il~x}TP=e^}
zn<|vw-SEH|?>Jnng~-@FSzpqd{mpQrVbX>}W00o>(VjE}Rn4QVdvih6GC~desUkbH
z%-tJm02!}j@D|mV_b5LpspBX^`r=9GJD6dKDRZe>jscqx5|@dl*aX?O&W?{W9f2&;
zp__d|&wa}bYZWQ)Jfve+Mb+-vXZ%7kRXP?CaIRXh0qE`BU%HJKCZ0$jFDIW8
z%`NT*;zam8*esshKlt*Yme!4_e*?G-A~EinbALl|Hg4{TcTe(%f5R
zOEjGVuk$I^O%T#jb)eHO>1l{BvDh+=Wd*IRjxYUHgvb9`~d
z_9X{r-Ch!zHk}@(=O7j@9;T0tlEX5ejOX7CW6>&R**LZ=(6`fvez^A}$@!HSvbEh>
z-?pwuCe$0MtIc6?P+cSl4OFJsm8nE1Ev@y~7JFrNQprKRx&+BFDGqz`8%{TpYO&dz
z{d1>M`cS3D14ChY&eVIQ+K^1@?6=Z(mFqfYn(o_rBAXoS=*({T=L?g%N$Sj|zkbI&
zfmM?KE_?cSZ>LR`&GQrMq&SU56jO+_Cx(xkpYSUREPrs
zFnDK3NGHt@_<07QIGGy~4Wz1HO^tz^B*n(6mwZN0Fx%CE5Lb@KeR&yXo%E*(`oI_e
z%>6?-t5NF)ce>%`M6ds23H{F>0Nj|zMm|T{!m+IttqS;Z!oR;w20n;2U|emILF^8v
zMT9ePvSNMahbo(clI-V!5fw3KbKLd~W;8z=WvF1Zgv%CA4@zc04xe1_
zY}t_j#Kv5i%m8PJX|4ev;5S!h#H*gS_q5~gi&jCzA|ns{*Vs0MtjtZmRD-Qe_dG&x
zGZGbg=$RKTSC2s*#`{AnjPc1N%IBBR#+X2s7@T&Qcj&NYkhS9?Qjh)Ck5C&h#Zi(v
zS;>3?s1|CFCZkOU?{Qac^>5J4{%1}l&Y&ksX+G{@X*AfK>SB0MrR(Lw7A)o`SbV|8
zP}E{7HZ{36MM2y2tBr*mc5Ua-G7M;at0lSV@I>)GJ1aAE(_vl1DE=No*@peIoF)c3
z-tDWSf=-)L{^=NOqim&d5e-PC+9QzFY7Y!{YGZXEKmMGT>Iod`C*_X!bF?XCL~iyr
z)*C#H3%i^(SOm~_MDj^ueCJf&rDtOmW!mmvELjf_BMED<*)?BPNT_Tq6GUYs=ep!Q
zz0XKyCR@Y{x0GT}uw%L8QW3BIyK+n?jCHMtoR9qpKXd!nnX}oFYU+J_=&ij`#CwE*
z2R7C>!z})}Bp{(CxBNswwj+VZH}!Qo@%O&+ca?V}=(bR{5l2DXRv`wtExbuNaT<{1GmV)kB0E;~My!*)3`EO6*%dKWs?eOu=SPqA^RteMwXdvA8RNpY_ZB-Ugjh*gM-V&V+~bC17XEg3@Viy*kf8iCi<
z2w}GDjEw}wfP-0y}JqvmZ>vl
z@$b&qlrjvQE{tWU{ntwf0bvg@6RI>)@$cYL{^>ik+>fpl59g>Ls*Y)k@1j`3hDscL
z|9t#?2eteYsIBX25yPEU-=f1AP?5+0<@@2^c*$NX>z<2UkgJwwhEd9mRf?Wsq+qo}
zGpOV<2B&d%Z%M?d>8z>rx_slEzzc%c^?<)$83XMT(Rv$AB4}np+%M4_&P!Z9=hmiV
zHJZ|QneGE9#?PZTvnw#|DVz30bNefa^?&24tvog?&%di+@V!fFKTl8}5qH>OK3(0?
zz(XNJ;V1iA8o9^EvHQJ9U&3>C?)iHo)_URJe$z`Y!mKX`Bhl+KzpV_CdiF^>s^YJfI{YDO^V`pvj9UTbX2yaA~d|etB77h!KE=pCrlQLkq(FYBLi+c
zsN!s0;V;bm+(I-L0Te!7q3toG!Lc9j{d7t4G70O%Cg=Q!Su>o!B#tsCVCbDPCZaR(
zU&Hj%3RJrpkYEMSirqFfJyD^&a+#v@eJORFjt%~OZ#e#7I6;7rq&cu#TNY<5HJc8J
z{;YG%c1kSmh$fbRP#V#qrx-4ar__c@%%lJMdsr>UR%w(BhC=6mQh|+g(PY8(ljMR|
z9l{{6bfE5%-k4Xa1Sv>HQsky*8!VD|n`P^Y!R+&6W^k!Uf|E#P`jfDl5N&2bhZOj|
z#(r5H(M{`5X@A-;2BpWI|WWmKh!6Pvb>JsjkNtx$#uSFBQM!6!atN)?iTMrM(tpm)0X);<b}dKlQ)#F%yRy`9P-)T-14yQH29-6j@Hb^<_{)!g
z={ZLkWmyFHQC(O#o6mBl<7erdDvadic-EkMR`1ls7!B*qf06?A_L=$m?}Yz)<8hS%
z|K}4!bQ5ky3yePv8GKO#1jYKX`rgVKEt-kQ_F0D0SF#^30hC);(I=GZeuuxKWA(2`
zePGR^!zp@I5W6RISQHS;gfpHlRn;Kl_*)C3@n?T!1XLG!NnA|PIl%+9eTjZi%6WQgHLgTGfl4oTizhE#9u$3_%MwXX}@2aRS?
z*{jq;`6N+68}PUeY&&pUex5$kn8OV^BLZSkr!(yEa>$p#6#Dup6wHWyfTIj|4e2ec
zh~1{^Y=KxB0;L)4Hf%k!CXP{LCA5YRA|e)wXCcnW8jUZIMPa-xLox!EvQhz4&fqgV
zQta8ln;Jp%_+`5)(K7gz=lJ&P*6p5UzSYOke$j&cXzOgFS0!Bm5rI@s4xMyl>Y
z!7Jp?hVEP!FB)tn8PAl^Pyr+8Ce^godVub5b5Yq_oyCa(u6}6%c*cz9
z9`O;;NbsLJeOlA)*nqbVPhh$NqcxedX%w@v&_yaZ8)3}>~&^5P!<7IA}@U_
zm15W;Eh#ktc$>j(DuT=_JyFrp+9RX3z#*0M?O*8!Nvux+v`Z6F
z&j`=0KmQ&4_NQ%^s{qi8>G<5bT^?1GnFv&w6Z2`8p`fQ#<0zt|w&Q>wWL|O!Lfa)b
zUbu>p`^5Y9r=kpLkC_Hue#kv${;Iuk!X3(;|L|txs-n&wKaMxCL4v~j-;-AFtF;qUucoFw~y&f_BwH|0V|DK-HAU
zo&Qg=V5kxpaWsKpo!H9RRtH%F>nZp+Wx#0fSrx
literal 0
HcmV?d00001
diff --git a/uniCloud-alipay/cloudfunctions/gift_info/index.obj.js b/uniCloud-alipay/cloudfunctions/gift_info/index.obj.js
new file mode 100644
index 0000000..03fc4ac
--- /dev/null
+++ b/uniCloud-alipay/cloudfunctions/gift_info/index.obj.js
@@ -0,0 +1,24 @@
+const db = uniCloud.database();
+const _ = db.command;
+module.exports = {
+ _before: function () { // 通用预处理器
+
+ },
+ async getGiftList() {
+ try {
+ const res = await db.collection("gifts").get();
+ console.log(res.data);
+ return {
+ code: 200,
+ data: res.data
+ }
+ } catch(e) {
+ console.log(e.message);
+ return {
+ code: 500,
+ msg: e.message
+ }
+ }
+ },
+
+}
diff --git a/uniCloud-alipay/cloudfunctions/gift_info/package.json b/uniCloud-alipay/cloudfunctions/gift_info/package.json
new file mode 100644
index 0000000..1881fce
--- /dev/null
+++ b/uniCloud-alipay/cloudfunctions/gift_info/package.json
@@ -0,0 +1,7 @@
+{
+ "name": "gift_info",
+ "dependencies": {},
+ "extensions": {
+ "uni-cloud-jql": {}
+ }
+}
\ No newline at end of file
diff --git a/uniCloud-alipay/cloudfunctions/user-info/index.obj.js b/uniCloud-alipay/cloudfunctions/user-info/index.obj.js
new file mode 100644
index 0000000..4c46b01
--- /dev/null
+++ b/uniCloud-alipay/cloudfunctions/user-info/index.obj.js
@@ -0,0 +1,185 @@
+const db = uniCloud.database();
+const _ = db.command;
+
+let obj = {
+ isValidIP(ip) {
+ // ------------------------- IPv4 验证 -------------------------
+ if (ip.includes('.')) {
+ const ipv4Regex = /^(?:(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])$/;
+ return ipv4Regex.test(ip); // 直接通过正则匹配[1,5](@ref)
+ }
+
+ // ------------------------- IPv6 验证 -------------------------
+ if (ip.includes(':')) {
+ const parts = ip.split(':');
+ // 处理压缩的::符号(如::1或2001:db8::1)
+ const hasDoubleColon = ip.includes('::');
+ if (hasDoubleColon && ip.indexOf('::') !== ip.lastIndexOf('::')) return false; // 禁止多个::[6](@ref)
+
+ // 分割后的段数应在1到8之间(允许压缩)
+ if (parts.length < 3 || parts.length > 8) return false;
+
+ // 展开压缩段(如将::替换为填充段)
+ let expandedParts = [];
+ let fillZeros = 8 - parts.filter(p => p !== '').length;
+ for (let part of parts) {
+ if (part === '') {
+ while (fillZeros-- > 0) expandedParts.push('0');
+ } else {
+ expandedParts.push(part);
+ }
+ }
+ if (expandedParts.length !== 8) return false;
+
+ // 验证每段是否为1-4位十六进制字符
+ const hexRegex = /^[0-9a-fA-F]{1,4}$/;
+ return expandedParts.every(p => hexRegex.test(p)); // 每段必须符合规则[6,7](@ref)
+ }
+
+ return false;
+ },
+ isReservedOrLocalIP(ip) {
+ // ------------------------- IPv4 处理逻辑 -------------------------
+ if (ip.includes('.')) {
+ const parts = ip.split('.').map(Number);
+ // 格式验证
+ if (parts.length !== 4 || parts.some(n => n < 0 || n > 255)) return false;
+
+ // 1. 局域网地址(私有地址)
+ if (
+ parts[0] === 10 || // 10.0.0.0/8 [1,2,4](@ref)
+ (parts[0] === 172 && parts[1] >= 16 && parts[1] <= 31) || // 172.16.0.0/12 [1,2,4](@ref)
+ (parts[0] === 192 && parts[1] === 168) // 192.168.0.0/16 [1,2,4](@ref)
+ ) return true;
+
+ // 2. 保留地址
+ return (
+ parts[0] === 127 || // 127.0.0.0/8(环回地址)[1,4](@ref)
+ (parts[0] === 169 && parts[1] === 254) || // 169.254.0.0/16(链路本地地址)[4,5](@ref)
+ (parts[0] >= 224 && parts[0] <= 239) || // 224.0.0.0/4(多播地址)[3,5](@ref)
+ ip === '0.0.0.0' || // 未指定地址 [1](@ref)
+ ip === '255.255.255.255' // 广播地址 [1](@ref)
+ );
+ }
+
+ // ------------------------- IPv6 处理逻辑 -------------------------
+ if (ip.includes(':')) {
+ // 规范化IPv6(展开缩写)
+ const normalized = ip.replace(/(^:|:$)/g, '::').replace(/::/g, ':0:').split(':')
+ .map(seg => seg.padStart(4, '0')).join(':').padStart(39, '0:');
+
+ if (normalized.startsWith('fc00:') || normalized.startsWith('fd00:')) return true;
+
+ // 2. 保留地址
+ return (
+ normalized === '0000:0000:0000:0000:0000:0000:0000:0001' ||
+ normalized.startsWith('fe80:') ||
+ normalized.startsWith('ff00:') ||
+ normalized.startsWith('2001:0db8:') ||
+ normalized === '0000:0000:0000:0000:0000:0000:0000:0000'
+ );
+ }
+
+ return false;
+ },
+ async getIPAddress(ip) {
+ if (!obj.isValidIP(ip)) return "未知";
+ if (obj.isReservedOrLocalIP(ip)) return "未知";
+
+ let address = "";
+
+ const res = await uniCloud.collection("ip").where({
+ ip: ip
+ })
+ .get();
+
+ console.log(res);
+
+ if (res.data.length > 0) {
+ const res = await uniCloud.collection("ip").where({
+ ip: ip
+ })
+ .field({
+ ip:true,
+ country: true,
+ economize: true,
+ market: true,
+ })
+ .get();
+ if (res.data[0].market === "") address = res.data[0].country + " " + res.data[0].economize;
+ else {
+ address = res.data[0].economize + " " + res.data[0].market;
+ }
+ return address;
+ }
+
+ let url= "https://62cccca0.api.cn/ipdata?token=7cec107b2f759a84211c74d9d9d6b4c4&datatype=json&ip=" + ip;
+ const response = await uniCloud.httpclient.request(url, {
+ method: 'GET',
+ timeout: 1000
+ });
+ console.log(response);
+ if (response.status === 200) {
+ await uniCloud.collection("ip").add({
+ ip: response.data.ip,
+ country: response.data.data[0]==="台湾"?"中国台湾":response.data.data[0],
+ economize: response.data.data[1],
+ market: response.data.data[2],
+ county: response.data.data[3],
+ operator: response.data.data[4],
+ postal_code: response.data.data[5],
+ area_code: response.data.data[6],
+ network: response.data.data[7]
+ });
+ if (response.data.data[2] === "" ) {
+ address = response.data.data[0] + " " + response.data.data[1];
+ }else {
+ address = response.data.data[1] + " " + response.data.data[2];
+ }
+
+ return address;
+ }
+ return address;
+
+ }
+}
+module.exports = {
+ _before: function () { // 通用预处理器
+
+ },
+
+ async get_user_info(query) {
+ try {
+ let uid = query.uid;
+ console.log(uid);
+ if (!uid) throw new Error("uid不存在");
+ console.log(uid);
+ let res = await db.collection("uni-id-users")
+ .doc(uid)
+ .field({
+ _id: true,
+ nickname: true,
+ avatar_file: true,
+ last_login_ip:true,
+ register_date: true,
+ last_login_date:true,
+ personal_profile: true,
+ gender: true
+ })
+ .get();
+ res.data[0].last_login_ip = await obj.getIPAddress(res.data[0].last_login_ip);
+ console.log(res)
+
+ return {
+ code: 200,
+ data: res.data[0]
+ }
+ } catch (e) {
+ console.log(e);
+ return {
+ code: 500,
+ msg: e.message
+ }
+ }
+ }
+}
diff --git a/uniCloud-alipay/cloudfunctions/user-info/package.json b/uniCloud-alipay/cloudfunctions/user-info/package.json
new file mode 100644
index 0000000..3315045
--- /dev/null
+++ b/uniCloud-alipay/cloudfunctions/user-info/package.json
@@ -0,0 +1,7 @@
+{
+ "name": "user-info",
+ "dependencies": {},
+ "extensions": {
+ "uni-cloud-jql": {}
+ }
+}
\ No newline at end of file
diff --git a/uniCloud-alipay/database/gifts.schema.json b/uniCloud-alipay/database/gifts.schema.json
new file mode 100644
index 0000000..c952e73
--- /dev/null
+++ b/uniCloud-alipay/database/gifts.schema.json
@@ -0,0 +1,37 @@
+{
+ "bsonType": "object",
+ "required": ["price"], // 添加 price 为必填字段
+ "permission": {
+ "read": true,
+ "create": "'admin' in auth.role",
+ "update": "'admin' in auth.role",
+ "delete": "'admin' in auth.role"
+ },
+ "properties": {
+ "_id": {
+ "description": "ID,系统自动生成"
+ },
+ "url": {
+ "bsonType": "string",
+ "title": "资源地址",
+ "description": "带签名时效的静态资源 URL",
+ "trim": "both",
+ "pattern": "^https?://", // 基础 URL 格式校验
+ "errorMessage": {
+ "format": "URL 必须以 http/https 开头"
+ }
+ },
+ "price": {
+ "bsonType": "int",
+ "title": "商品价格",
+ "description": "单位:分(整数类型)",
+ "minimum": 0,
+ "maximum": 100000000,
+ "errorMessage": {
+ "type": "价格必须为整数类型",
+ "minimum": "价格不能为负数",
+ "maximum": "单件商品价格不得超过100万元"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/uniCloud-alipay/database/users-give-gift.schema.json b/uniCloud-alipay/database/users-give-gift.schema.json
new file mode 100644
index 0000000..d758733
--- /dev/null
+++ b/uniCloud-alipay/database/users-give-gift.schema.json
@@ -0,0 +1,48 @@
+{
+ "bsonType": "object",
+ "required": ["user_id", "article_id", "months", "create_time"], // 必填字段
+ "permission": {
+ "read": true,
+ "create": "doc._id == auth.uid || 'admin' in auth.role",
+ "update": "doc._id == auth.uid || 'admin' in auth.role",
+ "delete": "doc._id == auth.uid || 'admin' in auth.role"
+ },
+ "properties": {
+ "_id": {
+ "description": "ID,系统自动生成"
+ },
+ "months": {
+ "bsonType": "int",
+ "title": "累计月数",
+ "defaultValue": 0,
+ "minimum": 0
+ },
+ "user_id": {
+ "bsonType": "string",
+ "title": "用户ID",
+ "foreignKey": "uni-id-users._id",
+ "trim": "both",
+ "errorMessage": "用户ID不能为空"
+ },
+ "article_id": {
+ "bsonType": "string",
+ "title": "文章ID",
+ "trim": "both",
+ "errorMessage": "文章ID不能为空"
+ },
+ "gift_value": {
+ "bsonType": "int",
+ "title": "礼物价值",
+ "minimum": 0,
+ "defaultValue": 0,
+ "errorMessage": "礼物价值不能小于1"
+ },
+ "create_time": {
+ "bsonType": "timestamp",
+ "title": "创建时间",
+ "defaultValue": {
+ "$env": "now" // 自动填充服务器时间[1](@ref)
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/uni_modules/uni-notice-bar/changelog.md b/uni_modules/uni-notice-bar/changelog.md
new file mode 100644
index 0000000..ce50674
--- /dev/null
+++ b/uni_modules/uni-notice-bar/changelog.md
@@ -0,0 +1,20 @@
+## 1.2.2(2023-12-20)
+- 修复动态绑定title时,滚动速度不一致的问题
+## 1.2.1(2022-09-05)
+- 新增 属性 fontSize,可修改文字大小。
+## 1.2.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-notice-bar](https://uniapp.dcloud.io/component/uniui/uni-notice-bar)
+## 1.1.1(2021-11-09)
+- 新增 提供组件设计资源,组件样式调整
+## 1.1.0(2021-07-30)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 1.0.9(2021-05-12)
+- 新增 组件示例地址
+## 1.0.8(2021-04-21)
+- 优化 添加依赖 uni-icons, 导入后自动下载依赖
+## 1.0.7(2021-02-05)
+- 优化 组件引用关系,通过uni_modules引用组件
+
+## 1.0.6(2021-02-05)
+- 调整为uni_modules目录规范
diff --git a/uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue b/uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue
new file mode 100644
index 0000000..47fb9b3
--- /dev/null
+++ b/uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue
@@ -0,0 +1,431 @@
+
+
+
+
+
+ {{text}}
+
+
+
+ {{ moreText }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uni-notice-bar/package.json b/uni_modules/uni-notice-bar/package.json
new file mode 100644
index 0000000..1e9762c
--- /dev/null
+++ b/uni_modules/uni-notice-bar/package.json
@@ -0,0 +1,87 @@
+{
+ "id": "uni-notice-bar",
+ "displayName": "uni-notice-bar 通告栏",
+ "version": "1.2.2",
+ "description": "NoticeBar 通告栏组件,常用于展示公告信息,可设为滚动公告",
+ "keywords": [
+ "uni-ui",
+ "uniui",
+ "通告栏",
+ "公告",
+ "跑马灯"
+],
+ "repository": "https://github.com/dcloudio/uni-ui",
+ "engines": {
+ "HBuilderX": ""
+ },
+ "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"
+ },
+ "uni_modules": {
+ "dependencies": [
+ "uni-scss",
+ "uni-icons"
+ ],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ },
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ }
+ }
+ }
+ }
+}
diff --git a/uni_modules/uni-notice-bar/readme.md b/uni_modules/uni-notice-bar/readme.md
new file mode 100644
index 0000000..fb2ede2
--- /dev/null
+++ b/uni_modules/uni-notice-bar/readme.md
@@ -0,0 +1,13 @@
+
+
+## NoticeBar 通告栏
+> **组件名:uni-notice-bar**
+> 代码块: `uNoticeBar`
+
+
+通告栏组件 。
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-notice-bar)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
+
+