From b67f9611c7c4480c4fd5c8e042b144974251575b Mon Sep 17 00:00:00 2001 From: cbb <1055026847@qq.com> Date: Wed, 24 Dec 2025 17:53:13 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9C=80=E8=A6=81=E4=BF=AE=E5=A4=8D=E5=95=86?= =?UTF-8?q?=E5=9F=8E=E9=A1=B6=E9=83=A8=E7=AD=9B=E9=80=89=E5=B7=A6=E5=8F=B3?= =?UTF-8?q?=E6=BB=91=E5=8A=A8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .hbuilderx/launch.json | 5 + .prettierrc.js => .prettierrc.cjs | 1 - api/index.js | 28 ++- components/cb-search/cb-search.vue | 67 ++++++ components/register-app/register-app.vue | 69 +++++- constants/storage-keys.js | 3 +- pages.json | 77 +++++- pages/contacts/contacts.vue | 7 + pages/discover/discover.vue | 75 ++++++ pages/index/index.vue | 102 ++++---- .../login/forgot-password/forgot-password.vue | 17 +- pages/login/login.vue | 26 ++- pages/mall/confirm-order.vue | 7 + pages/mall/detail.vue | 7 + pages/mall/list.vue | 78 +++++++ pages/my-index/my-index.vue | 221 ++++++++++++++++++ pages/news-list/news-list.vue | 12 + static/images/discover/circle.png | Bin 0 -> 7038 bytes static/images/discover/company.png | Bin 0 -> 2537 bytes static/images/discover/grade.png | Bin 0 -> 5346 bytes static/images/discover/mall.png | Bin 0 -> 5445 bytes static/images/discover/project.png | Bin 0 -> 2699 bytes static/images/discover/sign.png | Bin 0 -> 2716 bytes static/images/discover/team.png | Bin 0 -> 6054 bytes static/images/my-index/circle.png | Bin 0 -> 2370 bytes static/images/my-index/collection.png | Bin 0 -> 2814 bytes static/images/my-index/customer.png | Bin 0 -> 1713 bytes static/images/my-index/meeting.png | Bin 0 -> 1116 bytes static/images/my-index/my-card-bg.png | Bin 0 -> 3175 bytes static/images/my-index/system.png | Bin 0 -> 2424 bytes static/images/my-index/team.png | Bin 0 -> 2597 bytes static/images/my-index/wallet.png | Bin 0 -> 1247 bytes static/images/public/right-arrow.png | Bin 0 -> 331 bytes static/images/public/search.png | Bin 0 -> 1427 bytes static/images/tabBar/contacts.png | Bin 0 -> 1462 bytes static/images/tabBar/contactsHL.png | Bin 0 -> 2433 bytes static/images/tabBar/discover.png | Bin 0 -> 1845 bytes static/images/tabBar/discoverHL.png | Bin 0 -> 1934 bytes static/images/tabBar/my.png | Bin 0 -> 1424 bytes static/images/tabBar/myHL.png | Bin 0 -> 1696 bytes static/images/tabBar/news.png | Bin 0 -> 1130 bytes static/images/tabBar/newsHL.png | Bin 0 -> 1865 bytes stores/token.js | 74 +++--- stores/user.js | 70 ++++++ utils/request.js | 220 ++++++++--------- utils/storage.js | 25 +- utils/use-ui.js | 13 +- utils/validate.js | 84 +++++++ 48 files changed, 1067 insertions(+), 221 deletions(-) rename .prettierrc.js => .prettierrc.cjs (97%) create mode 100644 components/cb-search/cb-search.vue create mode 100644 pages/contacts/contacts.vue create mode 100644 pages/discover/discover.vue create mode 100644 pages/mall/confirm-order.vue create mode 100644 pages/mall/detail.vue create mode 100644 pages/mall/list.vue create mode 100644 pages/my-index/my-index.vue create mode 100644 pages/news-list/news-list.vue create mode 100644 static/images/discover/circle.png create mode 100644 static/images/discover/company.png create mode 100644 static/images/discover/grade.png create mode 100644 static/images/discover/mall.png create mode 100644 static/images/discover/project.png create mode 100644 static/images/discover/sign.png create mode 100644 static/images/discover/team.png create mode 100644 static/images/my-index/circle.png create mode 100644 static/images/my-index/collection.png create mode 100644 static/images/my-index/customer.png create mode 100644 static/images/my-index/meeting.png create mode 100644 static/images/my-index/my-card-bg.png create mode 100644 static/images/my-index/system.png create mode 100644 static/images/my-index/team.png create mode 100644 static/images/my-index/wallet.png create mode 100644 static/images/public/right-arrow.png create mode 100644 static/images/public/search.png create mode 100644 static/images/tabBar/contacts.png create mode 100644 static/images/tabBar/contactsHL.png create mode 100644 static/images/tabBar/discover.png create mode 100644 static/images/tabBar/discoverHL.png create mode 100644 static/images/tabBar/my.png create mode 100644 static/images/tabBar/myHL.png create mode 100644 static/images/tabBar/news.png create mode 100644 static/images/tabBar/newsHL.png create mode 100644 stores/user.js create mode 100644 utils/validate.js diff --git a/.hbuilderx/launch.json b/.hbuilderx/launch.json index 15db785..a5db135 100644 --- a/.hbuilderx/launch.json +++ b/.hbuilderx/launch.json @@ -2,8 +2,13 @@ "version" : "1.0", "configurations" : [ { + "customPlaygroundType" : "device", "playground" : "standard", "type" : "uni-app:app-ios" + }, + { + "playground" : "standard", + "type" : "uni-app:app-android" } ] } diff --git a/.prettierrc.js b/.prettierrc.cjs similarity index 97% rename from .prettierrc.js rename to .prettierrc.cjs index 8ecac9d..def7884 100644 --- a/.prettierrc.js +++ b/.prettierrc.cjs @@ -1,4 +1,3 @@ -// @ts-check module.exports = { printWidth: 74, diff --git a/api/index.js b/api/index.js index fa765f9..a4a8777 100644 --- a/api/index.js +++ b/api/index.js @@ -1 +1,27 @@ -// 各模块api \ No newline at end of file +import http from '@/utils/request' + +/** 注册 */ +export const userRegister = data => { + return http({ + url: '/api/register', + method: 'post', + data + }) +} + +/** 登录 */ +export const userLogin = data => { + return http({ + url: '/api/login', + method: 'post', + data + }) +} + +/** 获取用户信息 */ +export const getUserData = () => { + return http({ + url: '/api/userInfo', + method: 'get' + }) +} diff --git a/components/cb-search/cb-search.vue b/components/cb-search/cb-search.vue new file mode 100644 index 0000000..d226799 --- /dev/null +++ b/components/cb-search/cb-search.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/components/register-app/register-app.vue b/components/register-app/register-app.vue index 6344a8a..c4947bb 100644 --- a/components/register-app/register-app.vue +++ b/components/register-app/register-app.vue @@ -1,6 +1,16 @@ + + + + diff --git a/pages/discover/discover.vue b/pages/discover/discover.vue new file mode 100644 index 0000000..b1475ba --- /dev/null +++ b/pages/discover/discover.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/pages/index/index.vue b/pages/index/index.vue index b536876..bffa7c5 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -1,59 +1,67 @@ - - + + diff --git a/pages/login/forgot-password/forgot-password.vue b/pages/login/forgot-password/forgot-password.vue index ea9358d..40d481f 100644 --- a/pages/login/forgot-password/forgot-password.vue +++ b/pages/login/forgot-password/forgot-password.vue @@ -1,5 +1,8 @@ @@ -38,14 +51,14 @@ v-model="formData.username" placeholder="请输入手机号/邮箱" > - + > --> { - showToast('登录成功') - console.log('登录:', formData) + const onLogin = async () => { + if (!formData.agreement) { + showToast('请同意协议') + return + } + const res = await userLogin({ + account: formData.username, + password: formData.password + }) + setToken(res.token) + await fetchUserInfo() + reLaunch('/pages/news-list/news-list') } const onRegister = () => { @@ -26,7 +40,7 @@ } onLoad(e => { - console.log('接收==:', e.id) + console.log('接收参数,返回对应页面的时候使用', e) }) @@ -50,9 +64,7 @@ 登录 diff --git a/pages/mall/confirm-order.vue b/pages/mall/confirm-order.vue new file mode 100644 index 0000000..017fa36 --- /dev/null +++ b/pages/mall/confirm-order.vue @@ -0,0 +1,7 @@ + + + + + diff --git a/pages/mall/detail.vue b/pages/mall/detail.vue new file mode 100644 index 0000000..46c7b74 --- /dev/null +++ b/pages/mall/detail.vue @@ -0,0 +1,7 @@ + + + + + diff --git a/pages/mall/list.vue b/pages/mall/list.vue new file mode 100644 index 0000000..714f0ed --- /dev/null +++ b/pages/mall/list.vue @@ -0,0 +1,78 @@ + + + + + diff --git a/pages/my-index/my-index.vue b/pages/my-index/my-index.vue new file mode 100644 index 0000000..3175cb3 --- /dev/null +++ b/pages/my-index/my-index.vue @@ -0,0 +1,221 @@ + + + + + diff --git a/pages/news-list/news-list.vue b/pages/news-list/news-list.vue new file mode 100644 index 0000000..ca6dbf3 --- /dev/null +++ b/pages/news-list/news-list.vue @@ -0,0 +1,12 @@ + + + + + diff --git a/static/images/discover/circle.png b/static/images/discover/circle.png new file mode 100644 index 0000000000000000000000000000000000000000..6b57de88f85fed0705d3257eb3d2487b98d71a61 GIT binary patch literal 7038 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 cDWL%RePx;qe(Ya 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 literal 0 HcmV?d00001 diff --git a/static/images/discover/grade.png b/static/images/discover/grade.png new file mode 100644 index 0000000000000000000000000000000000000000..9cf4a4590f8b5bcef083eb2dadb9349bebe15449 GIT binary patch literal 5346 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 FV1mpd0-^u_ literal 0 HcmV?d00001 diff --git a/static/images/discover/sign.png b/static/images/discover/sign.png new file mode 100644 index 0000000000000000000000000000000000000000..82ccdcc276802a83f9399978539cd040bd48e89d GIT binary patch literal 2716 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 literal 0 HcmV?d00001 diff --git a/static/images/my-index/circle.png b/static/images/my-index/circle.png new file mode 100644 index 0000000000000000000000000000000000000000..77e2987fc9f020f5824b84c291b0c438a304d360 GIT binary patch literal 2370 zcmV-I3BC4-P)Px-{7FPXRCr$Pntx~2prG*pnN0Y3$$tmF0BfzsdZwuRm`0NIH> z59=G(e-?}p0u8k($R#E|f6K+o3!BT=+MJ{1u+#wzUftK{Ev-AozySif!mBf|M8Fil z4ujq%@C|7IL=O{lHv?M$G8>QMv#yR4vjgS7rwJl80NL4mm+tmF1*T^s0?aXEl$l?h zSy;S;9pklD0%XVXU0QF?kVbR{gh!$P893n?3*V~tk1wSGA{7ArGY2+nu6thicXU(C zT=fjfC-vu?UHlmVdjQC|K%kwWxhGv+8<`zAccoJZ9Ro1!;%){;m$lA31;Rnd&C{2q ziMIhE1Ypv!O504k_)#!U1Xdy3i8XKUOm6fSoj~XaK+Y*VMNFrH4KU-BJHPO?>JHyL zO}p@7yAYxP#C*a%j7-mS03BUkllVx*EWgk$gth^Mg_qi3Z|}_DYHhR&p%H*U$bspR zCy2E3fz@#b5ZVGTP#Jkb^R(Ce9L_gbb9YwEAN`@37TST(3V>KA=j`83o_7&Mek}oa zk7NDt)ufh?7=Rz}yh%Y{XdYDia4X@14JCyT2Oxj|=HCQ+@pSExq=7LJ0Fmm9TJIkL zKRtQu?P_H9X;^{^0I`m62aSAd6xqTx79UNLA`<}^u#3-Wz%gGyKH*s9uOu}&RZCC> zAT43Kc#;T5DHt7$oo0Wlwd9pUY_*f9_RToR*4oLvW?9kUU z0irFk+Pt}BIq(1JoXWnG0faRNV5ei1ex!QTippnvW?jLDge!dmx7Mvja;Vpx*xE;mnzoi zmpTGq+J!NI@}kPBSmpPrntxPy29H;)@{ZW?V|l~O^!!?^S^xG904;^D4>0ZGgkP=l zxD&HxtOb~M(H19LfX_Qtd0(sm09I>WxDSRZX6a3p@mc#*!v=H_c<-^efG2#u(SCCF z$QgomNSsui!Scq=0N6$LCy1~8R|(HtlR2L8nlo7XcpSX&@1|Y+Ie=Xv27q~dxyY$U z`)0z|E#RBMrHNyeT3We^3n&3-6!5^5msePw00Xz3$%!+4WqqP zK5R}GCjW{iZ3<}g3W}NrdS6c{#`S?;b`t}<`SYN z&~)vM;P)iLhl3yh$FWLQhcUoUgW?G643_UGNm~gY1t3$>+~P;#`T}BH&Mu4v1yNGr z>*N3IU(u(K2E&C=Wo}_(AV8e(s{u$uKJ8fL!%a0JYJk3;lSu+zbS~MTsrCLdwL&Q8 z6h2K%-xmvc9)DnFbNO`@;Tr>x*H$8;ABolke(u*q@R9{kJDL~c!lkeW9GJ06uXN-B zefIv$dhk_$Q#j=rcqvlbH`VHL5CmTaqdR)wX?7TrYl$%+rCXh_fCPv`mAtcbb!6i@ zQn6{U?o)5nPiAw>Tnim+TAK6<09HWH59JUnQpJ zgN#raEIr-I3R(e36GFK5_uw6yu||)_S!ZGkkQ*M$cj=iPkrCuW2v75Nwd&8u0Z0Qv zq*0r=VUx%LU?&<+G4JbC(Zdpv2Qwk;P3lU?;dqQP^OBmj~?5N1!_J$xV$fQUYk5w}J) zWAS*99g+fwgCGw&|Ly&HaPKb-P_f`?<`!+aKzOp~a}{}o1soO4({=zfgCJdw=`2XR zB@|}``Q~uMu}X zz-zRADgc5Msbw}jL(q;!UwR6wV4_2=KL2K1@gy1>1HC=NM6{a-BSCE+XdT4QyH^)q zNYbEb1wJ(Z!6M=zh4GN_41*3fdh#ls$%^N)OmvNyW&4`J8wj)s43mkrG(^b literal 0 HcmV?d00001 diff --git a/static/images/my-index/collection.png b/static/images/my-index/collection.png new file mode 100644 index 0000000000000000000000000000000000000000..4c8a6b24404a4a89c82008624c1e532b86ee2b2e GIT binary patch literal 2814 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 F<-a@0T=oC} literal 0 HcmV?d00001 diff --git a/static/images/my-index/system.png b/static/images/my-index/system.png new file mode 100644 index 0000000000000000000000000000000000000000..9e31ba0fdc6ede0733684a02e64beaffbece6557 GIT binary patch literal 2424 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 literal 0 HcmV?d00001 diff --git a/static/images/tabBar/contacts.png b/static/images/tabBar/contacts.png new file mode 100644 index 0000000000000000000000000000000000000000..3639cef199abf5801ce234e70a35c760ba76b5aa GIT binary patch literal 1462 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 literal 0 HcmV?d00001 diff --git a/static/images/tabBar/discoverHL.png b/static/images/tabBar/discoverHL.png new file mode 100644 index 0000000000000000000000000000000000000000..ad5ed4bd4567bc36ed0a4ff58f6143e6b13a49e8 GIT binary patch literal 1934 zcmV;92XXj`P)Px+NJ&INRA@u(n0;(sWf{hQ_t^{U%EU4g#~8^-#&)_)M<&yy0a7|XHZzt2WrL+- zwo+Y%G@2MQ4VsZC*&oIrk;Ol7+2+83LOLKLYnaxLEDnR2C=GpE)0p6xi6%0wl0mqNuj|X-h@;-fcro`3MwE9QpSJy^4ST%WV^oZA)pKJV}I0C zxT*s*KK#kq1EBx00@qyKjM4%607AiKItt(X^c2irQw8rJ{*LVz9>Bhu#n-f=(t+v*MCK%cs311;F4@(}jLrpe3yodJ z|Gxl+_b;VV?gs5Z3&wMVgYo#Jx zh~66VI%GwdWtVQ3dDY(oe+6kx#G9^)1^g%c&#$U>-RZT_KkvVhO3;l;8=_Z*TyWHg zxg3eoo-L#LB;p-KgJ%#~=mK=X+eczqZ~(uvbNT_C+}A+8v;&_5*0^9L;j*Dfj36aa z;T^>Lf<03SUO?oEbnup1(Sxo^J@_4arVqgIkDIAz7oN1CIxp)O#yt#(AS=$eA?Xp` z4<2N`*Nn;`l)CD`a?T_)v3&dMQv)!t?`jH{wL{Pia=oo^ROeWmp)ix~84ymu3iuR z)|`N|0EV910kRvVA>Z0lREaX5HsCas;>sAIjy=fg&iClwSI46IUPL#9#*!vTMD$cu zQ=^29a!wP=@5>1|3!wP?7)V`JFRyx$TUf+XHCZ>=j0P|>1yt5?&lnXXhWQWkrL%_?unBt8vsGB@Aa5UwIoU z#yW3Dm>Y(l)FQT0J%z_MmficSc>R%=d`gvLz_p26h4`Z`ZSh2nE@~o1-eCi@reSaD z!N0erfb$io1@UBW1M_G@#5mL1loOd09i?#Y0hVq#6F)lqax)tA0uAAWnaniljJx0A znUsY_REl&Fu!a@)m|^dKsK9u4zukKso*V*M>!wC+V)@;PI}9IQPaubZxw$1W0o$wD zGq$2p(nG4LRyh67kJ$b(Edb0SgD+w-4X(L1jNiXuG!@TTD4F_k<13B zy1VOM{7vHu`1}CaY#(_VcnGD!Xt0PioBqMzkuM`WVX2YWtbK>=)!C^pp-_7NXyP|J zGtY~|_&-J^xQ7*Y^w}VWe*P%%Z8wTX$*;A0vt=+tL>G;>@10=){a;1&yQrQ)8Rvx!|K?=ocGN4gvG?-+ijAw_N@dEARZn%mNrWwvf`CckDLP+NT-53>faB zab4yMS{%s0(d#M9ea(GRG#jPr=4R>hZ{B4AEiG;^oZzTE%zfBX>FdQ`z5?78o;uB0 zUB{}H!3mcb=$}tPeg>FNjAr5tw~^82o)h@DHccjssRI}}zJyZgDf_ZOdsxx(m&v@C z{{8}sy&>e*gdg07*qoM6N<$f^licR{#J2 literal 0 HcmV?d00001 diff --git a/static/images/tabBar/my.png b/static/images/tabBar/my.png new file mode 100644 index 0000000000000000000000000000000000000000..b980a768bdfb3503e07f19a68c44a529600ab894 GIT binary patch literal 1424 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 literal 0 HcmV?d00001 diff --git a/static/images/tabBar/newsHL.png b/static/images/tabBar/newsHL.png new file mode 100644 index 0000000000000000000000000000000000000000..907915a4a9ab7bd77b4034b0411dbef89a2453c7 GIT binary patch literal 1865 zcmV-P2e$Z$P)Px+14%?dRA@u(SZ!#QRT#d`6O&xyBi8^PS&xv!+ea>^A=Xu?e%^Akt zAKUwJo^$T&zOMW02;Af^ag*DRUI70!gS`y&GSE#A{0}8`@a-CbV66lOLo)X$sOq!( zPuOK7AcTz9N&yJ-q+P2&*zc47lk4bA>so7rz-b_wkNnG3M8;{u)qC}v+K1j-V9o-`!1Fcsz1~0?&p|-o6!I_K(KUdEccQc`nOFTEnU9mk z=z|R#W|cC4zyuPA$a!oX2WCnXJ!_p2NaPm<84SD|IXQ4oTKQP7>g}cSFgb`x!%515 zA`co$Vqi%o)WLe2gbVpO;ld064ev$1c8%u@k;l{EzHc6?G zJR`NYm7H6{^h)T$g&w?g3^c6qCFEG3z%)iuh&p+Y{;h|(2OTrU(qv%U7_p#9IYx4H zrimftDImWfi-8Xe06z;*X0aPlka}z+f;-j%%See>a$u4%W~Aq1r8o!|WHIoeLK>$< z%Ycai^Ot+erCJswUdoO0V9bk)4YtxU?8OabAD77_!soLXSZe^7AZ4ECx!uby1=6RI zmWmIm5l(e{zd~{=B)!CU;ruKH)+zPrcy$Rwf1sC_*GZQ)sBH!@0UZ}K8{D=O#(S8w zY8+-OBR$Gv&gKURgwJI$@R2PXRD^6sU>*~|^nSx|_br2P=&$qGdhwWOM?|tS$VV6T zM@|3X+Ncc|8fA0mC6a@34v+)H?9!2POi?NJwYP|^mrle^bBtN1F*StG{u2N;6<8Lm zL(PU8hdv-?4;bM{+11vJnaB6Y3sI+LZCc4tQ8#Q7`UZXUn)c`lW*pxwx3?YF8>;WO z4WBITFDZ9>)SYj{oaQ|WT%w8K9|aK3%L4GRO7e+bCf3ue{uQVj{va2oe!uk0PjbbX zUqns>vaxcO7?LaT)--jrq4MY^*$Ii)%c{ik!S|&0n0w+|x&Hj0RxhklTNMb2@R=+C z>m$~9B|9y#vix4Tq%2I;kFVRB@krAyj4dvezmKj-*B1blN4~((j*Hk<@ero;8 z*4YNUdTKAP`K+DP2}>ZHn-#?C`9r)P)f+4+3$e0%LhA4}=l;NpCx4IwL=I=i%vMZz zYm|(J9@!*YuXJF|kcoIYR)1O85@(FmQY@7#Rb?afd_~c%_bye{|@%_jtE=JTsC9#Q( zJ6N!@+^=_{k`X?cC819#1}JqpLgTciGED95<3&~RKpeZ$E^Av3;JZsLt{&usz@l64 z#JtiG8vSP%ny{+%knB`-f#PdI-$AIoZM>)`D#5;fg3=+R;t7CMB$$A>z+)#UF*21uwV0*G~PS*^GgPS7V39vTHn~klvY=|b;#A3c56jUpNI`Ny&t_`(b{7J)O+YCInF3XbDe*IX{Cq)Q&RYhCXYQ_B($?L-m{ zXJ!G|%nDf|2Ya^urZR5sWC?qZe)bIJ4EC64sfyNBriiboN3(|dEs;xa@vtI< z5b@Y+ZSmYn9(Ada-%{`_<${L>qXILB%St@!(R1PS3;^|8J0N6Ed%_Ib{1$<(Ajr#B zs5)=cD=vJBCO7`aDaHi{?PVKBD|Ihm?3D+7DLN2NE9NWw%BOy5`09NC3(O*Kkf*hD zEmE)+SV<%&Hs*D`t!)$dr2sc8!Jfk`*CCubziR;M*8|(8ArR?yu~0UNzf)I{iy<&7 zt{tA%sOm;dkYW{}t_rW=706~ZeX||a%R93HT*JQJ(qFfXMXvZq2n_JA6P?a4BS00# zO+Nf@k4Qe3mQZ(huHP{WLe#|(!J5JVGmwASyPWOran~P!vZ#J{EreVe8>g>nR^YBl z%erfD&oiJ-*ts)@VSP3Nm|=P~xdkWWOjK8U`n?`tdWHc5qA!L8Pa!}jnxYM;u5P~` z2HzM4dcxAH?Adb++#nFW0B(?@uX;=`1HBA%(*u742j_%dK46#=00000NkvXXu0mjf DmU4Xk literal 0 HcmV?d00001 diff --git a/stores/token.js b/stores/token.js index fa4d009..8c99915 100644 --- a/stores/token.js +++ b/stores/token.js @@ -1,42 +1,48 @@ -import { defineStore } from 'pinia'; -import { ref } from 'vue'; -import { STORAGE_KEYS } from '@/constants/storage-keys'; -import { getToken, removeToken } from '@/utils/storage'; +import { defineStore } from 'pinia' +import { ref } from 'vue' +import { STORAGE_KEYS } from '@/constants/storage-keys' +import { setTokenData, getToken, removeToken } from '@/utils/storage' /** 登录状态 */ export const useTokenStore = defineStore(STORAGE_KEYS.TOKEN, () => { + // 从本地存储获取token + const token = ref(getToken() || null) + const isLogin = ref(!!token.value) - // 从本地存储获取token - const token = ref(getToken() || null); - const isLogin = ref(!!token.value); + /** 设置token并保存到本地 */ + const setToken = newToken => { + token.value = newToken + isLogin.value = true + setTokenData(newToken) + } - /** 设置token并保存到本地 */ - const setToken = (newToken) => { - token.value = newToken; - isLogin.value = true; - setToken(newToken); - }; + /** 清除token */ + const clearToken = () => { + token.value = null + isLogin.value = false + removeToken() + } - /** 清除token */ - const clearToken = () => { - token.value = null; - isLogin.value = false; - removeToken() - }; + /** 检查token是否有效(可扩展过期时间判断) */ + const checkToken = () => { + // 简单判断:token存在且不为空 + return !!token.value + } - /** 检查token是否有效(可扩展过期时间判断) */ - const checkToken = () => { - // 简单判断:token存在且不为空 - return !!token.value; - }; + /** 验证token是否过期(实际项目中可添加过期时间判断) */ + const isTokenExpired = () => { + // 示例:如果token中包含过期时间,这里可以判断 + // 例如:const expireTime = parseInt(token.value.split('.')[1]); + // return Date.now() > expireTime * 1000; + return false // 默认不过期 + } - /** 验证token是否过期(实际项目中可添加过期时间判断) */ - const isTokenExpired = () => { - // 示例:如果token中包含过期时间,这里可以判断 - // 例如:const expireTime = parseInt(token.value.split('.')[1]); - // return Date.now() > expireTime * 1000; - return false; // 默认不过期 - }; - - return { token, isLogin, setToken, clearToken, checkToken, isTokenExpired }; -}) \ No newline at end of file + return { + token, + isLogin, + setToken, + clearToken, + checkToken, + isTokenExpired + } +}) diff --git a/stores/user.js b/stores/user.js new file mode 100644 index 0000000..b6dc35a --- /dev/null +++ b/stores/user.js @@ -0,0 +1,70 @@ +import { defineStore } from 'pinia' +import { + getToken, + getUserInfoData, + setUserInfoData, + removeUserInfoData +} from '@/utils/storage' +import { useTokenStore } from './token' +import { getUserData } from '@/api' +import { ref } from 'vue' + +export const useUserStore = defineStore('user', () => { + const { clearToken } = useTokenStore() + + /** 用户信息对象 */ + const userInfo = ref(JSON.parse(getUserInfoData()) || null) + + /** + * 获取用户信息(可从缓存或接口) + */ + const fetchUserInfo = async () => { + // 示例:先尝试从本地缓存读取 + const cachedToken = getToken() + const cachedUserInfo = getUserInfoData() + + if (cachedToken && cachedUserInfo) { + userInfo.value = JSON.parse(cachedUserInfo) + return + } + const res = await getUserData() + await setUserInfo(res.data) + return + } + + /** + * 设置用户信息 + */ + const setUserInfo = async data => { + console.log('存储数据到userInfo==', data) + userInfo.value = data + // 同步到本地存储 + setUserInfoData(data) + } + + /** + * 清除用户信息(退出登录) + */ + const clearUserInfo = () => { + userInfo.value = null + clearToken() + removeUserInfoData() + } + + /** + * 更新部分用户信息(例如昵称、头像) + */ + const updateUserInfo = partialData => { + if (!userInfo.value) return + userInfo.value = { ...userInfo.value, ...partialData } + setUserInfoData(userInfo.value) + } + + return { + userInfo: userInfo.value, + fetchUserInfo, + setUserInfo, + clearUserInfo, + updateUserInfo + } +}) diff --git a/utils/request.js b/utils/request.js index 1cd03e7..490582d 100644 --- a/utils/request.js +++ b/utils/request.js @@ -1,75 +1,81 @@ -import { getToken, removeToken } from './storage'; +import { getToken, removeToken } from './storage' -const BASE_URL = 'xxxxx' +const BASE_URL = 'http://c36bd4b4.natappfree.cc' /** * 网络请求封装 * @param {Object} options 请求参数 * @returns {Promise} */ -const request = (options) => { - // 默认配置 - const defaultOptions = { - url: '', - method: 'GET', - data: {}, - header: { - 'Content-Type': 'application/json' // 默认请求内容类型 - } - } +const request = options => { + // 默认配置 + const defaultOptions = { + url: '', + method: 'GET', + data: {}, + header: { + 'Content-Type': 'application/json' // 默认请求内容类型 + } + } - // 合并配置 - const config = { ...defaultOptions, ...options } + // 合并配置 + const config = { ...defaultOptions, ...options } - // 请求拦截:添加token等通用header - if (getToken()) { - config.header['Authorization'] = 'Bearer ' + getToken() - } + // 请求拦截:添加token等通用header + if (getToken()) { + config.header['Authorization'] = 'Bearer ' + getToken() + } - // 显示加载状态(可选) - if (options.loading !== false) { - uni.showLoading({ - title: '加载中...', - mask: true - }) - }; + // 显示加载状态(可选) + if (options.loading !== false) { + uni.showLoading({ + title: '加载中...', + mask: true + }) + } - return new Promise((resolve, reject) => { - uni.request({ - url: BASE_URL + config.url, - method: config.method, - data: config.data, - timeout: 10000, // 请求超时时间 - header: config.header, - success: (response) => { - // 响应拦截:根据状态码处理 - if (response.statusCode === 200) { - // 这里可以根据后端数据格式调整 - // 例如:if (response.data.code === 0) {...} - resolve(response.data) - } else { - // 状态码错误处理 - handleError(response.statusCode, response.data) - reject(response) - } - }, - fail: (error) => { - // 网络错误处理 - uni.showToast({ - title: '网络异常,请检查网络连接', - icon: 'none', - duration: 2000 - }) - reject(error) - }, - complete: () => { - // 隐藏加载状态 - if (options.loading !== false) { - uni.hideLoading() - } - } - }) - }) + return new Promise((resolve, reject) => { + uni.request({ + url: BASE_URL + config.url, + method: config.method, + data: config.data, + timeout: 10000, // 请求超时时间 + header: config.header, + success: response => { + console.log(response) + // 响应拦截:根据状态码处理 + if (response.statusCode === 200) { + // 这里可以根据后端数据格式调整 + // 例如:if (response.data.code === 0) {...} + if (response.data.code === 200) { + resolve(response.data) + } else { + handleError(response.data.code, response.data) + } + } else { + // 状态码错误处理 + handleError(response.statusCode, response.data) + reject(response) + } + }, + fail: error => { + // 网络错误处理 + uni.showToast({ + title: '网络异常,请检查网络连接', + icon: 'none', + duration: 2000, + mask: true + }) + reject(error) + }, + complete: () => { + // 隐藏加载状态 + if (options.loading !== false) { + uni.hideLoading() + } + } + }) + }) } /** @@ -78,49 +84,53 @@ const request = (options) => { * @param {Object} data 响应数据 */ const handleError = (statusCode, data) => { - switch (statusCode) { - case 401: - uni.showModal({ - title: '提示', - content: '登录已过期,请重新登录', - showCancel: false, - success: () => { - // 清除本地存储的token并跳转到登录页 - removeToken() - uni.navigateTo({ - url: '/pages/login/index' - }) - } - }) - break - case 403: - uni.showToast({ - title: '没有权限访问', - icon: 'none', - duration: 2000 - }) - break - case 404: - uni.showToast({ - title: '请求资源不存在', - icon: 'none', - duration: 2000 - }) - break - case 500: - uni.showToast({ - title: '服务器内部错误', - icon: 'none', - duration: 2000 - }) - break - default: - uni.showToast({ - title: data.message || '请求失败,请重试', - icon: 'none', - duration: 2000 - }) - } + switch (statusCode) { + case 401: + uni.showModal({ + title: '提示', + content: '登录已过期,请重新登录', + showCancel: false, + success: () => { + // 清除本地存储的token并跳转到登录页 + removeToken() + uni.navigateTo({ + url: '/pages/login/index' + }) + } + }) + break + case 403: + uni.showToast({ + title: '没有权限访问', + icon: 'none', + duration: 2000, + mask: true + }) + break + case 404: + uni.showToast({ + title: '请求资源不存在', + icon: 'none', + duration: 2000, + mask: true + }) + break + case 500: + uni.showToast({ + title: data.msg || '服务器内部错误', + icon: 'none', + duration: 2000, + mask: true + }) + break + default: + uni.showToast({ + title: data.msg || '请求失败,请重试', + icon: 'none', + duration: 2000, + mask: true + }) + } } -export default request \ No newline at end of file +export default request diff --git a/utils/storage.js b/utils/storage.js index e7155af..9716994 100644 --- a/utils/storage.js +++ b/utils/storage.js @@ -1,16 +1,31 @@ import { STORAGE_KEYS } from '@/constants/storage-keys' /** 保存 token */ -export const setToken = (v) => { - return uni.setStorageSync(STORAGE_KEYS.TOKEN, v) +export const setTokenData = v => { + return uni.setStorageSync(STORAGE_KEYS.TOKEN, v) } /** 获取 token */ export const getToken = () => { - return uni.getStorageSync(STORAGE_KEYS.TOKEN) || '' + return uni.getStorageSync(STORAGE_KEYS.TOKEN) || '' } /** 清楚 token */ export const removeToken = () => { - return uni.removeStorageSync(STORAGE_KEYS.TOKEN) -} \ No newline at end of file + return uni.removeStorageSync(STORAGE_KEYS.TOKEN) +} + +/** 保存用户信息 */ +export const setUserInfoData = v => { + return uni.setStorageSync(STORAGE_KEYS.USER, JSON.stringify(v)) +} + +/** 获取用户信息 */ +export const getUserInfoData = () => { + return uni.getStorageSync(STORAGE_KEYS.USER) || '' +} + +/** 删除用户信息 */ +export const removeUserInfoData = () => { + return uni.removeStorageSync(STORAGE_KEYS.USER) +} diff --git a/utils/use-ui.js b/utils/use-ui.js index 738464c..16edc7a 100644 --- a/utils/use-ui.js +++ b/utils/use-ui.js @@ -37,11 +37,14 @@ const showToast = (message, type = 'none', duration = 2000) => { if (type === 'error') icon = 'error' if (type === 'warning') icon = 'none' - uni.showToast({ - title: message, - icon, - duration, - mask: true + return new Promise(resolve => { + uni.showToast({ + title: message, + icon, + duration, + mask: true + }) + setTimeout(() => resolve(), duration) }) } diff --git a/utils/validate.js b/utils/validate.js new file mode 100644 index 0000000..d5b91d6 --- /dev/null +++ b/utils/validate.js @@ -0,0 +1,84 @@ +// 正则 + +/** 手机号正则(中国大陆) */ +const PHONE_REGEX = /^1[3-9]\d{9}$/ + +/** 邮箱正则 */ +const EMAIL_REGEX = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/ + +/** 身份证号(简化版) */ +const ID_CARD_REGEX = /(^\d{15}$)|(^\d{18}$)|(^\d{17}[\dXx]$)/ + +/** 密码强度(至少8位,包含数字和字母) */ +const PASSWORD_REGEX = /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d@$!%*#?&]{8,}$/ + +/** + * 校验手机号 + * @param {string} phone - 待校验的手机号 + * @returns {{ valid: boolean, message: string }} + */ +export const validatePhone = phone => { + if (!phone) return { valid: false, message: '手机号不能为空' } + if (!PHONE_REGEX.test(phone)) { + return { valid: false, message: '手机号格式不正确' } + } + return { valid: true, message: '' } +} + +/** + * 校验邮箱 + * @param {string} email - 待校验的邮箱 + * @returns {{ valid: boolean, message: string }} + */ +export const validateEmail = email => { + if (!email) return { valid: false, message: '邮箱不能为空' } + if (!EMAIL_REGEX.test(email)) { + return { valid: false, message: '邮箱格式不正确' } + } + return { valid: true, message: '' } +} + +/** + * 校验密码强度 + * @param {string} password - 待校验的密码 + * @returns {{ valid: boolean, message: string }} + */ +export const validatePassword = password => { + if (!password) return { valid: false, message: '密码不能为空' } + if (password.length < 8) { + return { valid: false, message: '密码长度不能少于8位' } + } + if (!PASSWORD_REGEX.test(password)) { + return { valid: false, message: '密码需包含字母和数字' } + } + return { valid: true, message: '' } +} + +/** + * 校验确认密码是否与原密码一致 + * @param {string} password - 原始密码 + * @param {string} confirmPassword - 确认密码 + * @returns {{ valid: boolean, message: string }} + */ +export function validateConfirmPassword(password, confirmPassword) { + if (!confirmPassword) { + return { valid: false, message: '请再次输入密码' } + } + if (password !== confirmPassword) { + return { valid: false, message: '两次输入的密码不一致' } + } + return { valid: true, message: '' } +} + +/** + * 校验身份证号(仅格式校验,不验证真实性) + * @param {string} idCard - 待校验的身份证号 + * @returns {{ valid: boolean, message: string }} + */ +export const validateIdCard = idCard => { + if (!idCard) return { valid: false, message: '身份证号不能为空' } + if (!ID_CARD_REGEX.test(idCard)) { + return { valid: false, message: '身份证号格式不正确' } + } + return { valid: true, message: '' } +}