From b9ac8101461c0d68aee384d4ec6a402bb0c6750e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BD=87?= Date: Tue, 18 Feb 2025 18:26:07 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/order.js | 27 +++ api/request.js | 69 +++++++ api/user.js | 34 +++ app.js | 58 +++++- app.json | 9 +- app.wxss | 1 + assets/icon/agreement.png | Bin 0 -> 803 bytes assets/icon/back.png | Bin 0 -> 745 bytes assets/icon/card.png | Bin 0 -> 1406 bytes assets/icon/password.png | Bin 0 -> 877 bytes assets/icon/plus.png | Bin 0 -> 326 bytes assets/icon/right-arrow-small.png | Bin 0 -> 609 bytes assets/icon/service.png | Bin 0 -> 1230 bytes assets/icon/success.png | Bin 0 -> 4140 bytes assets/img/login-bg.png | Bin 0 -> 26910 bytes components/navBar/index.js | 53 +++++ components/navBar/index.json | 5 + components/navBar/index.wxml | 16 ++ components/navBar/index.wxss | 51 +++++ components/swipeButton/index.js | 88 ++++++++ components/swipeButton/index.json | 4 + components/swipeButton/index.wxml | 9 + components/swipeButton/index.wxss | 35 ++++ pages/index/index.js | 329 ++++++++++++++++++++++++------ pages/index/index.json | 6 +- pages/index/index.wxml | 157 ++++++++++---- pages/index/index.wxss | 196 ++++++++++++++---- pages/login/index.js | 93 +++++++++ pages/login/index.json | 4 + pages/login/index.wxml | 20 ++ pages/login/index.wxss | 51 +++++ pages/order-detail/index.json | 10 +- pages/user/income/index.js | 68 ++++++ pages/user/income/index.json | 4 + pages/user/income/index.wxml | 9 + pages/user/income/index.wxss | 20 ++ pages/user/info/index.js | 77 +++++++ pages/user/info/index.json | 6 + pages/user/info/index.wxml | 42 ++++ pages/user/info/index.wxss | 28 +++ pages/withdraw/index/index.js | 70 +++++++ pages/withdraw/index/index.json | 3 + pages/withdraw/index/index.wxml | 39 ++++ pages/withdraw/index/index.wxss | 83 ++++++++ pages/withdraw/success/index.js | 70 +++++++ pages/withdraw/success/index.json | 3 + pages/withdraw/success/index.wxml | 22 ++ pages/withdraw/success/index.wxss | 27 +++ 48 files changed, 1743 insertions(+), 153 deletions(-) create mode 100644 api/order.js create mode 100644 api/request.js create mode 100644 api/user.js create mode 100644 assets/icon/agreement.png create mode 100644 assets/icon/back.png create mode 100644 assets/icon/card.png create mode 100644 assets/icon/password.png create mode 100644 assets/icon/plus.png create mode 100644 assets/icon/right-arrow-small.png create mode 100644 assets/icon/service.png create mode 100644 assets/icon/success.png create mode 100644 assets/img/login-bg.png create mode 100644 components/navBar/index.js create mode 100644 components/navBar/index.json create mode 100644 components/navBar/index.wxml create mode 100644 components/navBar/index.wxss create mode 100644 components/swipeButton/index.js create mode 100644 components/swipeButton/index.json create mode 100644 components/swipeButton/index.wxml create mode 100644 components/swipeButton/index.wxss create mode 100644 pages/login/index.js create mode 100644 pages/login/index.json create mode 100644 pages/login/index.wxml create mode 100644 pages/login/index.wxss create mode 100644 pages/user/income/index.js create mode 100644 pages/user/income/index.json create mode 100644 pages/user/income/index.wxml create mode 100644 pages/user/income/index.wxss create mode 100644 pages/user/info/index.js create mode 100644 pages/user/info/index.json create mode 100644 pages/user/info/index.wxml create mode 100644 pages/user/info/index.wxss create mode 100644 pages/withdraw/index/index.js create mode 100644 pages/withdraw/index/index.json create mode 100644 pages/withdraw/index/index.wxml create mode 100644 pages/withdraw/index/index.wxss create mode 100644 pages/withdraw/success/index.js create mode 100644 pages/withdraw/success/index.json create mode 100644 pages/withdraw/success/index.wxml create mode 100644 pages/withdraw/success/index.wxss diff --git a/api/order.js b/api/order.js new file mode 100644 index 0000000..b304c5d --- /dev/null +++ b/api/order.js @@ -0,0 +1,27 @@ +import request from './request'; + +export default { + status:{ + created:'CREATED', + cancelled:'CANCELLED', + received:'RECEIVED', + delivering:'DELIVERING', + unpaid:'UNPAID', + completed:'COMPLETED' + }, + statusKV:{ + CREATED:'已创建',CANCELLED:'已取消',RECEIVED:'已接单',DELIVERING:'配送中',UNPAID:'未支付',COMPLETED:'已完成' + }, + deliverStatusKV:{ + DELIVERY_AT_DOORSTEP:"放在门口", + DELIVERY_TO_ROOM:"敲门递件" + }, + + buildingList:(community_id,status)=>request.get('/api/order/community_building/count',{community_id,status}), + list:(data)=>request.get('/api/order/deliveryman/list',data,true), + + statusDetail:(community_id)=>request.get('/api/order/status/count',{community_id}), + receive:(orderid)=>request.post(`/api/order/${orderid}/deliveryman/receive`), + pickup:(orderid)=>request.post(`/api/order/${orderid}/deliveryman/pickup`), + complete:(orderid,images)=>request.post(`/api/order/${orderid}/deliveryman/complete`,{images:JSON.stringify(images)}) +} \ No newline at end of file diff --git a/api/request.js b/api/request.js new file mode 100644 index 0000000..f3fe8b1 --- /dev/null +++ b/api/request.js @@ -0,0 +1,69 @@ +const baseUrl = 'https://api-dev.beefast.co'; +let app = getApp(); + +const sendRequest = (options)=>{ + if(!app)app = getApp(); + let timer; + if(options.delayLoading){ + timer = setTimeout(()=>{ + wx.showLoading({ + title: '加载中...', + }) + },800) + } + return new Promise((rs,rj)=>{ + wx.request({ + url: `${baseUrl}${options.url}`, + success:(result)=>{ + if(timer){ + clearTimeout(timer); + wx.hideLoading(); + } + if(result.statusCode==200){ + if(result.data.code==200){ + rs(result.data.data); + }else{ + wx.showToast({ + icon:'error', + title: result.data.message, + }); + rj(result.data); + } + }else if(result.statusCode==401){ + wx.navigateTo({ + url: '/pages/login/login', + }) + } + }, + + method:options.method, + data:options.data, + header:{ + Authorization: `Bearer ${app.globalData.accessToken}`, + "content-type":options.data&&options.data.file?'application/x-www-form-urlencoded':'application/json' + }, + fail:(res)=>{ + wx.showToast({ + title: 'Request Error', + }) + rj(res); + } + }) + }) +} + +export default { + baseUrl:baseUrl, + get(url,data,delayLoading){ + return sendRequest({url,method:'get',data,delayLoading}); + }, + post(url,data){ + return sendRequest({url,method:'post',data}); + }, + put(url,data){ + return sendRequest({url,method:'put',data}); + }, + delete(url,data){ + return sendRequest({url,method:'delete',data}); + } +} \ No newline at end of file diff --git a/api/user.js b/api/user.js new file mode 100644 index 0000000..51084b4 --- /dev/null +++ b/api/user.js @@ -0,0 +1,34 @@ +import request from './request'; +let app = getApp(); +const token = wx.getStorageSync('accessToken'); + +export default { + genderKV:{ + MALE:'先生',FEMALE:'女士' + }, + login:(phone,password)=>request.post('/api/user/password-login',{phone,password,role:'deliveryman'}), + userInfo:()=>request.get('/api/user/info'), + summary:()=>request.get('/api/account/summary'), + incomeList:(data)=>request.get('/api/account/details',data), + + uploadImg(file,progress){ + return new Promise((rs,rj)=>{ + const task = wx.uploadFile({ + filePath: file.tempFilePath, + name: 'file', + header:{ + Authorization: `Bearer ${token||app.globalData.accessToken}` + }, + url: request.baseUrl+'/api/upload/image', + success:(res)=>{ + const response = JSON.parse(res.data); + rs(response.data); + }, + fail:(res)=>{ + rj(res); + } + }); + task.onProgressUpdate(progress); + }); + } +} \ No newline at end of file diff --git a/app.js b/app.js index 1ed57c4..a9115ed 100644 --- a/app.js +++ b/app.js @@ -1,19 +1,55 @@ -// app.js +import userApi from './api/user'; +const token = wx.getStorageSync('accessToken'); + +const date = new Date(); App({ onLaunch() { - // 展示本地存储能力 - const logs = wx.getStorageSync('logs') || [] - logs.unshift(Date.now()) - wx.setStorageSync('logs', logs) - - // 登录 - wx.login({ - success: res => { - // 发送 res.code 到后台换取 openId, sessionKey, unionId + if(!token){ + wx.navigateTo({ + url: '/pages/login/index', + }) + } + wx.onAppShow((options) => { + if(token){ + // this.getUserInfo(); } }) }, + forceGetUserInfo(){ + this.globalData.userInfoGetTime = null; + return this.getUserInfo(); + }, + async getUserInfo(){ + if(this.globalData.userInfoGetTime&& + this.globalData.userInfo&& + new Date()-this.globalData.userInfoGetTime<1000*60*5){ + return this.globalData.userInfo; + } + const data = await userApi.userInfo(); + this.globalData.userInfo = data; + this.globalData.userInfoGetTime = new Date(); + return data; + }, + + + forceGetSummary(){ + this.globalData.summaryGetTime = null; + return this.getSummary(); + }, + async getSummary(){ + if(this.globalData.summaryGetTime&& + this.globalData.summary&& + new Date()-this.globalData.summaryGetTime<1000*60*5){ + return this.globalData.summary; + } + const data = await userApi.summary(); + this.globalData.summary = data; + this.globalData.summaryGetTime = new Date(); + return data; + }, globalData: { - userInfo: null + userInfo: null, + accessToken:token, + summary:null } }) diff --git a/app.json b/app.json index 0e75b00..ae81040 100644 --- a/app.json +++ b/app.json @@ -1,7 +1,12 @@ { "pages": [ "pages/index/index", - "pages/order-detail/index" + "pages/order-detail/index", + "pages/login/index", + "pages/user/info/index", + "pages/withdraw/index/index", + "pages/withdraw/success/index", + "pages/user/income/index" ], "window": { "navigationBarTextStyle": "black", @@ -12,4 +17,4 @@ "componentFramework": "glass-easel", "sitemapLocation": "sitemap.json", "lazyCodeLoading": "requiredComponents" -} +} \ No newline at end of file diff --git a/app.wxss b/app.wxss index 0ffc008..8cc41f2 100644 --- a/app.wxss +++ b/app.wxss @@ -255,6 +255,7 @@ page-container .content{ .cells .cell-ft{ position: relative; padding-right:40rpx; + color:#999; } .cells .cell-ft::after{ content:" "; diff --git a/assets/icon/agreement.png b/assets/icon/agreement.png new file mode 100644 index 0000000000000000000000000000000000000000..fc7b7deff2b48a6e5e91b7f9874c2cdbab4b7f39 GIT binary patch literal 803 zcmV+;1Kj+HP)Px#1am@3R0s$N2z&@+hyVZr%}GQ-RA_Qa0QSGfC^$NKr@E%t2>BNL6m3z**w@V8FW%4SQ#YioAHe2e7D-)-1%;A?*uI^ zjY7&c&>_UZ5m#Ygcg@GBc31`?DTc8Fw;xLoss=$H^V1;R29*Z>hdj*ANK6se?l zoCCMKJ+S~GbAIZWvm%vqdsuJr=<$QMDbz*8oC6thdEa^(M#i6B8XxSus#`Y34JFF{> z*#Et(1ScrR@|ls5J>W5xKVh{?Gr?v^E8nce0?2?w`kaBCZ5zQ|rY3f>P;RVD*$7@% zJhONBVrR+%;Zi5ntlv5&L^-muXESLj{yOUrt#eK`C;_CSrI%p6EQP4CMPs%u@Mr}$ zomOzuv7Du+DA!PM^C0*Lhnvo>SP33UpM$cEbi&o9v!hl+`ulSl$sRGw=e2zmt8Lo%%Id1yF z#0XP_m?gh}m<3VZWpEdz1?T#7PrwonB|z{H-tiE?{F`il_%0-{{>Y=_3Cf@K^{1E} hre$B`XldCZ{sOBKx@|K6uVw%M002ovPDHLkV1hn@cFO<& literal 0 HcmV?d00001 diff --git a/assets/icon/back.png b/assets/icon/back.png new file mode 100644 index 0000000000000000000000000000000000000000..4c947f748573b4f34dec12498431ab55c1c74a7c GIT binary patch literal 745 zcmVPx#1am@3R0s$N2z&@+hyVZrlSxEDRA_?{&vd4dTA&CtL)){}Xf(uLuNkj2IiP_pA%xKo!mSX(F)T@} zH92Hq_v4!hTDXgusr@PiO^o2Xzxj#XG1s3`cMFXW!hsON=@7!~e|)4FLRk4vh3wsp5x`h3NoplI111B)vCG1CRuS3|GI9U*O z3|s3G_EbUG57<?%2>TE#QoBZjWq8mfY%9AN%Tv2X zgH?FcrK)+@MX6n*!RqWg*^L`mklHmG4B|yWWv^giYS(BmgjXfP&PnYW4TkZiAnXOq zO6?jA=Hhvmu;Vy`d8u710ef`rRJ63WfHP8i{z+^jzUU+%KQ*WaB_HY0+C0)BlzwSl zti?+!N4cM+YnYqbwKA|q@xtS(IxH!3w3n8TyM%_D7)b3}874Ll-F8a%u{gDBWhl2j zysr*>;T*lx0LW3U#q$)aQ@d7%a!tJF7)6An-jSuH!p*Q0!?%=oz2E?cQ8&Ac50qE1G b&-CUu>hzI<{+XV}00000NkvXXu0mjf+ml}1 literal 0 HcmV?d00001 diff --git a/assets/icon/card.png b/assets/icon/card.png new file mode 100644 index 0000000000000000000000000000000000000000..11bb7e6f631a831d4b51353e680912945655fc48 GIT binary patch literal 1406 zcmV-^1%djBP)Px#1am@3R0s$N2z&@+hyVZuC`m*?RCt{2oX<~HM-<0D=iX-&u}FhTDw;G=i6$i` znivZb64S7@n}^z!cH18-qDk$q)J2>2ALs&H)t0xBH0jRG3y8)<6T^ZAA*mus5meOR z6XD*|#T^jj0dMZR_x-T%ld!mC=FE3aX6~IibLI&#qbXeKX~d-oWC% z6eI&oBRoWT01PAC#AA>Nh9!v?r%s8(sNSKPryN7*KxjqTo0mah1f>t9hpqI>L1rS7 zx}=E+(KH8eIg8Q(?2gj*62=gE@aUE{hN3bWi6eA?CVbALd<^~3JyO?GlTgW z%gYgZgL>whMXGy%QjqCO#>>O5JKjR)0qXpU84}G3Lr4 z)2FOtof>AbbU8Lj#pQIiMb`>P=nd+b;})f}VvL$`HgNdO<@m~}G0z3wUMB!Fm_9CJ z*@(~qn((+z@itI}Vg{EFm+o4Zj|iXhy!}o9s5X6FWN}1jngcl8BAWG*Bz*G-B>II#%HBg1iS)db)YP~}> z<isyyk3zeciAv3F6uci3asxDg}4XfIn+ndyEflCHT9x5ypRsycx%2s+2B| z{{-*(>t}rhQ&)n`R#YgN1Tal02V-`A4)af7emZz|Ho<$JMZM9RPMDmf(v4AW{s8v> z0lM&66p)B#wD8a|iCZO(6N~_Hqjv&;^1uOxqqkgk3_A!ni>;#Q2sa(P{1dUt9*;qX z35F3yimjz+2qR1|>_`$1rLWj}iiXlBNj%3q^jI61n~GXe{)EwF`W`r9EB(Njm4W9s zO3N8@Q-LNs#!TM>N60~D5X(`aui)N=XqUQSQ4j8Y6=W z|2E9QN_6Px#1am@3R0s$N2z&@+hyVZs7fD1xRA_fqDEkAZgR}?@p(>x=OH&w(!VP zLbyb!0EPHcfDoX(${D`xe#OR3v`dLT6@*Km1b9pSB?5euSB~)Igm6LPLH+&fZG8C3}wpJFRZ7M(oxQIVp;-fsTGh1_o#G`%{kNOpxk9sfqs&w9nZm8tMip5>gU=^w{J^o<(A16hsyx(FdTs-s6wU@YQ$riP^>!cdh{ z0;BH~Fx+KrQA#|N7XU+_D|GC%_7A0?9c~TEW!AQAjB+8`<`4U_z~>Vg_Fn{mXR@}y z76&1_#zDx6L?|I7Z}e>9PKeN?M^Vlx${AnCQ$#**^sIKLZPfl38Q|*PlgA0)^X<$lh%R5Nc6DR z+BFVBb`2A6v-h3IAns#@Ef5;`e`X|fb$9JfoZs|!>j;6w37nRr4nhXh0T08SLx)%$ zp2qLKInWBmRc*@qAjqqXQM{+!}g_8~^f>lL8ih3<=a}SOyC4{Dw*K-4F$Lw;(JwhEf zFM%k|t*q_KQkMc+UpGRCaJ_6%&m;9IikuAN0PHx=1|J-!6#=%2Gtk44ofy`glX(f`uoOFahHwBu z4M$1`kpIEc#W5tJ_3ey{yiE=QF6q6j7n)=fSfiL!17@k-XpCSiTcCR3;16bxbKHi< z1r*->-mU5r_fA2QVa`H82zhE4M6o*J&{M_sS( zSRo}I`gl=ROvu?Zm+uc3{=KM_ar11xX&B@ze^zXZS za;pcEgWa3Wvn$pqjn(D1O2C{S3evw{N+1lTM0)M3HwKnhn^&*6=_M4UW{1TTvjO$NS VFEM?yJss$G22WQ%mvv4FO#nL7hr$2= literal 0 HcmV?d00001 diff --git a/assets/icon/right-arrow-small.png b/assets/icon/right-arrow-small.png new file mode 100644 index 0000000000000000000000000000000000000000..0d5f206df4a1aae957be07998a5abc612869faec GIT binary patch literal 609 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

!9t+4M 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 + + + + + + + + {{backTitle}} + + + + + + + \ No newline at end of file diff --git a/components/navBar/index.wxss b/components/navBar/index.wxss new file mode 100644 index 0000000..3605b44 --- /dev/null +++ b/components/navBar/index.wxss @@ -0,0 +1,51 @@ +/* components/navBar.wxss */ +.nav-bar{ +} +.nav-bar-content{ + display: flex; + align-items: center; + justify-content: space-between; + padding:0 34rpx; +} +.nav-bar-content .left{ + flex:1; + display: flex; + align-items: center; +} +.nav-bar-content .left .btns{ + display: inline-flex; + align-items: center; + border-radius: 60rpx; + vertical-align: middle; +} +.nav-bar-content .left .spliter{ + width:1.2rpx;height:36rpx; + background-color:#D8D8D8; +} +/*单一一个返回或者加上 backTitle的时候*/ +.nav-bar-content .back{ + width:40rpx;height:40rpx; + padding:12rpx 14rpx 12rpx 0; +} +.nav-bar-content .left .btns.border{ + border: 1.2px solid #D8D8D8; +} +/*有俩按钮 back+share 的时候*/ +.nav-bar-content .left .btns.border .back{ + padding:12rpx 24rpx; + width:36rpx;height:36rpx; +} +.nav-bar-content .back-title{ + font-size: 36rpx; + font-weight: 600; + white-space: nowrap; +} +.nav-bar-content .share{ + width:30rpx;height:34rpx; + padding:12rpx 28rpx; +} +.nav-bar-content .center{ + flex:1; + text-align: center; +} +.nav-bar-content .right{flex:1;} \ No newline at end of file diff --git a/components/swipeButton/index.js b/components/swipeButton/index.js new file mode 100644 index 0000000..6caa00d --- /dev/null +++ b/components/swipeButton/index.js @@ -0,0 +1,88 @@ +// components/swipeButton/index.js +Component({ + + /** + * 组件的属性列表 + */ + properties: { + loading:{ + type:Boolean, + value:false + }, + buttonText:{ + type:String, + value:'我要接单' + }, + buttonLoadingText:{ + type:String, + value:'接单中' + } + }, + /** + * 组件的初始数据 + */ + data: { + moveEvent:null, + moveAreaWidth:0, + moveViewWidth:92, + + + textOpacity:1, + textRight:120, + moveViewX:0 + }, + + /** + * 组件的方法列表 + */ + methods: { + buttonOnMove(event){ + this.data.moveEvent = event; + if(!this.data.moveAreaWidth){ + this.createSelectorQuery().select('#moveArea'+index).boundingClientRect((res)=>{ + this.data.moveAreaWidth = res.width; + }).exec(); + } + let x = this.data.moveEvent.detail.x; + let opacity = 1 - x/(this.data.moveAreaWidth - this.data.moveViewWidth); + let right = opacity*120; + this.setData({ + textOpacity:opacity, + textRight:right + }) + }, + buttonMoveCancel(event){ + const x = this.data.moveEvent.detail.x; + //给 10 像素边界 + //moveAreaWidth - this.data.moveViewWidth - 10 <= x + let viewX = 0,loading = false; + if((this.data.moveAreaWidth - this.data.moveViewWidth)/3*2 < x){ + viewX = this.data.moveAreaWidth - this.data.moveViewWidth; + loading = true; + this.triggerEvent('done'); + } + console.log(viewX,this.data.moveAreaWidth,this.data.moveViewWidth,x); + this.setData({ + moveViewX:viewX, + loading:loading + }); + } + }, + + lifetimes:{ + attached(){ + this.createSelectorQuery().select('#moveArea').boundingClientRect((res)=>{ + this.data.moveAreaWidth = res.width; + }).exec(); + } + }, + observers:{ + "loading"(l){ + if(!l){ + this.setData({ + moveViewX:0, + }); + } + } + } +}) \ No newline at end of file diff --git a/components/swipeButton/index.json b/components/swipeButton/index.json new file mode 100644 index 0000000..e8cfaaf --- /dev/null +++ b/components/swipeButton/index.json @@ -0,0 +1,4 @@ +{ + "component": true, + "usingComponents": {} +} \ No newline at end of file diff --git a/components/swipeButton/index.wxml b/components/swipeButton/index.wxml new file mode 100644 index 0000000..18cbfe4 --- /dev/null +++ b/components/swipeButton/index.wxml @@ -0,0 +1,9 @@ + + + + + {{buttonText}} + {{buttonLoadingText}} + \ No newline at end of file diff --git a/components/swipeButton/index.wxss b/components/swipeButton/index.wxss new file mode 100644 index 0000000..b7bf17c --- /dev/null +++ b/components/swipeButton/index.wxss @@ -0,0 +1,35 @@ +.move-area{ + background-color: var(--main-color); + border-radius: 12rpx; + width:100%; + height:100%; +} +.move-area .tips{ + position: absolute; + /* right:120rpx; */ + top:30rpx; + color: #000000; + font-size: 36rpx; + z-index: 0; + font-weight: 500; + transition-duration: .1s; +} +.move-area .tips.loading{ + transition-duration: .4s; + left:110rpx; +} + +.move-view{ + background-color: #fff; + /* 为了精确定位width 用 px 单位 包括下面的 border*/ + width: 88px;height:88rpx; + display: flex; + align-items: center; + justify-content:center; + border-radius: 12rpx; + border:2px solid var(--main-color); + z-index: 1; +} +.move-view .icon{ + width:56rpx;height:56rpx; +} \ No newline at end of file diff --git a/pages/index/index.js b/pages/index/index.js index f567908..840d568 100644 --- a/pages/index/index.js +++ b/pages/index/index.js @@ -1,49 +1,201 @@ +import orderApi from '../../api/order'; +import userApi from '../../api/user'; + +const app = getApp(); Page({ + currentOrder:null, data: { statusBarHeight:0, - list:[{}], - moveEvent:null, - moveViewX:0, - tipsOpacity:1, - tipsRight:120, - moveAreaWidth:0, - moveViewWidth:92, - receiving:false, + list:[], + leftPanelEvent:null, scrollViewHeight:0, + pager:{limit:10,loading:false,loadAll:false,pageIndex:0,refreshTrigger:false}, isShowConfirm:false, isShowLeftPanel:false, + isShowLeftPanelMask:false, + leftPanelMoveViewX:0, tempImgs:[], - maxChooseImgCount:10 + maxChooseImgCount:10, + + userInfo:{}, + userInfoTrigger:false, + summary:{}, + statusDetail:{ + created:{ + key:'CREATED',value:0,text:"待接单" + }, + received:{ + key:'RECEIVED',value:0,text:"待取货" + }, + delivering:{ + key:'DELIVERING',value:0,text:"送货中" + }, + completed:{ + key:'COMPLETED',value:0,text:"已送达" + } + }, + statusDetailKey:'created', + buildingList:[], + buildingIndex:0, + + orderStatus:orderApi.status, + orderStatusKV:orderApi.statusKV, + + deliverStatusKV:orderApi.deliverStatusKV, + + genderKV:userApi.genderKV }, onLoad(){ const windowInfo = wx.getWindowInfo(); - console.log(windowInfo); + this.setData({ statusBarHeight:windowInfo.statusBarHeight, scrollViewHeight:windowInfo.windowHeight-windowInfo.statusBarHeight-44 - 125 }); - //增加列表之后 放在列表加载之后 优化动画效果 - this.createSelectorQuery().select('#moveArea0').boundingClientRect((res)=>{ - console.log(res); - this.data.moveAreaWidth = res.width; - }).exec(); + + app.getUserInfo().then((data)=>{ + this.setData({ + userInfo:data + }); + return this.loadStatusDetail(); + }).then((data)=>{ + return this.loadBuilding(); + }).then((data)=>{ + this.loadList(); + }); + app.getSummary().then((data)=>{ + this.setData({ + summary:data + }); + }); }, - confirmSend(){ - this.setData({ - isShowConfirm:true + getUserInfo(){ + app.forceGetUserInfo().then((data)=>{ + this.setData({ + userInfo:data, + userInfoTrigger:false + }) }) }, + setStatus(event){ + const status = event.currentTarget.dataset.item; + console.log(status); + //先不setData 让加载出来之后再设置 + this.loadBuilding().then((data)=>{ + this.data.statusDetailKey = status.key.toLowerCase(); + this.data.pager.pageIndex = 0; + this.data.pager.loadAll = false; + this.loadList(); + }) + }, + setBuilding(event){ + const buildingIndex = event.currentTarget.dataset.index; + //先不setData 让加载出来之后再设置 + this.data.buildingIndex = buildingIndex; + this.data.pager.pageIndex = 0; + this.data.pager.loadAll = false; + this.loadList(); + }, + refreshList(){ + this.loadStatusDetail().then(()=>{ + return this.loadBuilding(); + }).then(()=>{ + this.data.pager.pageIndex = 0; + this.data.pager.loadAll = false; + this.loadList(); + }) + }, + async loadStatusDetail(){ + const data = await orderApi.statusDetail(this.data.userInfo.community_id); + data.map((item)=>{ + this.data.statusDetail.completed.value = 0; + if(item.status==this.data.orderStatus.unpaid||item.status==this.data.orderStatus.completed){ + this.data.statusDetail.completed.value += item.count; + }else{ + this.data.statusDetail[item.status.toLowerCase()].value = item.count; + } + }); + this.setData({ + statusDetail:this.data.statusDetail + }) + }, + async loadBuilding(){ + const cid = this.data.userInfo.community_id; + const status = this.data.statusDetailKey; + const data = await orderApi.buildingList(cid,status); + this.setData({ + buildingList:data + }); + }, + loadList(){ + if(this.data.pager.loading||this.data.pager.loadAll){ + return; + } + this.setData({ + "pager.loading":true + }); + let params = { + building_id:this.data.buildingList[this.data.buildingIndex].building_id, + skip:this.data.pager.pageIndex*this.data.pager.limit, + limit:this.data.pager.limit, + } + if(this.data.statusDetailKey=='completed'){ + params.status = `${this.data.orderStatus.unpaid},${this.data.orderStatus.completed}` + }else{ + params.status = this.data.statusDetailKey; + } + orderApi.list(params).then((data)=>{ + if(this.data.pager.pageIndex==0){ + this.data.list = data.items; + }else{ + this.data.list = this.data.list.concat(data.items); + } + this.data.pager.loading = false; + this.data.pager.pageIndex++; + this.data.pager.refreshTrigger = false; + if(data.items.length{ + item.packages.map((pItem)=>{ + pItem.pickup_codes = pItem.pickup_codes.split(','); + }) + }) + this.setData({ + list:this.data.list, + pager:this.data.pager, + statusDetailKey:this.data.statusDetailKey, + buildingIndex:this.data.buildingIndex + }); + console.log(this.data.list); + }) + }, + + openLeftPanel(){ this.setData({ - isShowLeftPanel:true + isShowLeftPanel:true, + }); + wx.nextTick(()=>{ + this.setData({ + isShowLeftPanelMask:true, + leftPanelMoveViewX:560 + }) }) }, closeLeftPanel(){ this.setData({ - isShowLeftPanel:false - }) + leftPanelMoveViewX:0, + isShowLeftPanelMask:false + }); + setTimeout(()=>{ + this.setData({ + isShowLeftPanel:false, + }) + },400) }, refund(){ wx.showModal({ @@ -79,45 +231,106 @@ Page({ }) }, + //接单 + getOrder(event){ + const item = event.currentTarget.dataset.item; - buttonOnMove(event){ - if(this.data.receiving)return; - this.setData({ - moveEvent:event - }); - const index = event.currentTarget.dataset.index; - if(!this.data.moveAreaWidth){ - this.createSelectorQuery().select('#moveArea'+index).boundingClientRect((res)=>{ - this.data.moveAreaWidth = res.width; - }).exec(); - } - let x = this.data.moveEvent.detail.x; - let opacity = 1 - x/(this.data.moveAreaWidth - this.data.moveViewWidth); - let right = opacity*120 - this.setData({ - tipsOpacity:opacity, - tipsRight:right + orderApi.receive(item.orderid).then((data)=>{ + wx.showToast({ + icon:'success', + title: '接单成功', + }) + this.refreshList(); }) }, - buttonMoveCancel(event){ - if(this.data.receiving)return; - const index = event.currentTarget.dataset.index; - this.createSelectorQuery().select('#moveArea'+index).boundingClientRect((res)=>{ - const x = this.data.moveEvent.detail.x; - const moveAreaWidth = res.width; - //给 10 像素边界 - //moveAreaWidth - this.data.moveViewWidth - 10 <= x - if((moveAreaWidth - this.data.moveViewWidth)/3*2 < x){ - console.log('success'); - this.setData({ - moveViewX:moveAreaWidth - this.data.moveViewWidth, - receiving:true - }); - }else{ - this.setData({ - moveViewX:0 - }); - } - }).exec(); + //取货完毕 + receivedOrder(event){ + const item = event.currentTarget.dataset.item; + orderApi.pickup(item.orderid).then((data)=>{ + wx.showToast({ + icon:'success', + title: '取货成功', + }) + this.refreshList(); + }) + }, + //完成配送 选择图片 + confirmSend(event){ + this.currentOrder = event.currentTarget.dataset.item; + this.setData({ + isShowConfirm:true + }) + }, + //完成配送 + uploadAndConfirmSend(){ + console.log(this.currentOrder); + if(this.data.tempImgs.length==0){ + wx.showToast({ + icon:'error', + title: '请选择快递照片', + }) + return; + } + this.uploadImages().then(()=>{ + let urls = []; + this.data.tempImgs.map((item)=>{ + urls.push(item.serverUrl); + }) + console.log('uploadAndConfirmSend',urls); + // return; + orderApi.complete(this.currentOrder.orderid,urls).then((data)=>{ + wx.showToast({ + icon:'success', + title: '订单已完成', + }) + }) + }); + }, + async uploadImages(){ + let imgIndex = -1; + const file = this.data.tempImgs.find((item,index)=>{ + imgIndex = index; + return !item.uploaded; + }); + if(!file){ + return; + } + const uploadResult = await userApi.uploadImg(file,(res)=>{ + //进度 + this.setData({ + [`tempImgs[${imgIndex}].progress`]:res.progress + }) + }); + console.log(uploadResult); + if(uploadResult.url){ + this.setData({ + [`tempImgs[${imgIndex}].uploaded`]:true, + [`tempImgs[${imgIndex}].serverUrl`]:uploadResult.url + }) + await this.uploadImages(); + }else{ + //上传失败 + return new Error('失败') + } + }, + leftPanelMove(event){ + this.setData({ + leftPanelEvent:event + }); + }, + leftPanelMoveCancel(){ + const leftPanelWidth = 280; + if(this.data.leftPanelEvent.detail.x<280/4*3){ + this.closeLeftPanel(); + }else{ + this.setData({ + leftPanelMoveViewX:560 + }) + } + }, + navToUserInfo(){ + wx.navigateTo({ + url: '/pages/user/info/index', + }) } }) diff --git a/pages/index/index.json b/pages/index/index.json index f397104..1322457 100644 --- a/pages/index/index.json +++ b/pages/index/index.json @@ -1,6 +1,8 @@ { "usingComponents": { - "list-view":"/components/listView" + "list-view":"/components/listView", + "swipe-button":"/components/swipeButton" }, - "navigationStyle": "custom" + "navigationStyle": "custom", + "navigationBarTextStyle": "white" } \ No newline at end of file diff --git a/pages/index/index.wxml b/pages/index/index.wxml index c13bcb0..5726e74 100644 --- a/pages/index/index.wxml +++ b/pages/index/index.wxml @@ -3,62 +3,70 @@ - + - - 待接单(0) - 待取货(0) - 送货中(0) - 已送达(0) + + + + {{item.text}}({{item.value}}) + - - 1栋(10) - 2栋(10) - 3栋(10) - 4栋(10) - 5栋(10) + + + {{item.building_name}}({{item.order_count}}) + - - + + - - 菜鸟驿站(丽晶公馆) + + {{pItem.station_name}} - 4件包裹: + {{pItem.pickup_codes.length}}件包裹: - + - 佳兆业丽晶公馆3栋2单元2702 - 冯先生:158****3822丨放在门口 + + {{item.address.community_name}} + {{item.address.building_name}} + {{item.address.address_detail}} + + + {{item.address.name}}{{genderKV[item.address.gender]}}:{{item.address.phone}}丨{{deliverStatusKV[item.delivery_method]}} + - + - - - - - 我要接单 - 接单中... - + - + + + + + - + - + 暂无跑腿订单 @@ -71,20 +79,91 @@ 当用户要求把包裹放在门口请拍照上传留证 拍摄时请把门牌号和包裹数量整体拍照 - + + + 点击拍照 - + - - + + + + + + - + + + + + + + {{summary.balance}} + + + + + + + + {{summary.today_income}} + + + + + + + 在线客服 + + + + 修改密码 + + + + 用户协议 + + + + + + + diff --git a/pages/index/index.wxss b/pages/index/index.wxss index 976808a..a3d9714 100644 --- a/pages/index/index.wxss +++ b/pages/index/index.wxss @@ -29,6 +29,12 @@ .head{ display: flex; background-color: #111111; + position: relative; +} +.head.loading::after{ + content: ''; + position: absolute; + left:0;right:0;top:0;bottom:0; } .head .item{ color: #BEBEBE; @@ -45,14 +51,29 @@ display: flex; overflow-x: auto; gap: 10rpx; - margin:20rpx 8rpx; + flex-wrap: nowrap; + margin:20rpx 16rpx; + position: relative; +} +.building.loading{ + overflow: hidden; +} +.building.loading::after{ + content: ''; + position: absolute; + width:100%;left:0;top:0;bottom:0; } .building .item{ font-size:28rpx; color: #666666; padding:15rpx 36rpx; - white-space: nowrap; background-color: #ffffff; + border-radius: 10rpx; + white-space: nowrap; +} +.building .item.current{ + background-color: var(--main-color); + color:var(--main-font-color); } @@ -78,6 +99,9 @@ left:38.5rpx;top:90rpx; bottom:250rpx; } +.package-list .item.no-btns::before{ + bottom:100rpx; +} .package-list .item .name{ font-size: 40rpx; font-weight: 600; @@ -112,11 +136,15 @@ } .package-list .item .package .value{ flex:1; + display: flex; + flex-wrap: wrap; + gap: 16rpx; } .package-list .item .address{ padding-left:64rpx; position: relative; + padding-bottom:20rpx; } .package-list .item .address::before{ content: '送'; @@ -143,7 +171,7 @@ .package-list .item .btns{ display: flex; gap:24rpx; - margin-top:50rpx; + margin-top:30rpx; } .package-list .item .btns .button{ @@ -156,40 +184,11 @@ padding:30rpx 40rpx; margin:0; } -.package-list .item .btns .move-area{ - background-color: var(--main-color); - border-radius: 12rpx; +.package-list .item .btns .swipe-button{ height:96rpx; flex:1; } -.package-list .item .btns .move-view{ - background-color: #fff; - /* 为了精确定位width 用 px 单位 包括下面的 border*/ - width: 88px;height:88rpx; - display: flex; - align-items: center; - justify-content:center; - border-radius: 12rpx; - border:2px solid var(--main-color); - z-index: 1; -} -.package-list .item .btns .move-view .icon{ - width:56rpx;height:56rpx; -} -.move-area .tips{ - position: absolute; - /* right:120rpx; */ - top:30rpx; - color: #000000; - font-size: 36rpx; - z-index: 0; - font-weight: 500; - transition-duration: .1s; -} -.move-area .tips.receiving{ - transition-duration: .4s; - left:110rpx; -} + .concat-user-btn{ display: flex; @@ -230,6 +229,21 @@ height:160rpx; border-radius: 12rpx; border: 1.2rpx solid rgba(124, 134, 149, 0.3); + position: relative; +} +.confirm-sending .photos .item .progress{ + position: absolute; + top:0;left:0; + width:100%; + z-index: 1; +} +.confirm-sending .photos .item.loading::after{ + content: ''; + position: absolute; + width:100%;height:100%; + left:0;top:0; + background-color: rgba(0, 0, 0, 0.3); + z-index: 0; } .confirm-sending .photos .item .image{ width:100%;height:100%; @@ -248,19 +262,121 @@ margin-top:114rpx; } +.left-move-view{ + width:1120rpx;height:100vh; + left: -560rpx;top:0; + position: fixed; +} .left-panel{ width:560rpx; background-color: #fff; height:100vh; - position: fixed; - left:0;top:0; - left:-560rpx; - transition-duration: .3s; + /* position: fixed; */ + /* left:0;top:0; */ + /* transition-duration: .3s; */ } .left-panel-mask{ position: fixed; - width:100vw; + width:calc(100vw + 560rpx); height:100vh; - left:0;top:0; + right:0;top:0; + transition-duration: .4s; background-color: rgba(0, 0, 0, 0.6); +} + + +.left-panel{ + background-color: var(--main-bgclolor); + box-sizing: border-box; +} +.left-panel .user-info{ + text-align: center; + padding-bottom:0; +} +.left-panel .user-info .avatar{ + width:120rpx;height:120rpx; + border-radius: 50%; + margin-top:40rpx; +} +.left-panel .user-info .name{ + margin-top:30rpx; + font-weight: 500; +} +.left-panel .user-info .phone{ + color: #888888; + margin-top:24rpx; +} +.left-panel .user-info .community-name{ + margin-top:24rpx; +} +.left-panel .user-info .spliter{ + margin-top:40rpx; +} +.left-panel .user-info .order-info{ + display: flex; + justify-content: space-between; +} +.left-panel .user-info .order-info .item{ + padding:30rpx 24rpx; +} +.left-panel .user-info .order-info .key{ + font-size:24rpx; +} +.left-panel .user-info .order-info .value{ + font-size: 36rpx; + font-weight: 500; + margin-top:22rpx; +} + +.left-panel .income{ + display: flex; + justify-content: space-between; + text-align: center; +} +.left-panel .income .item{ + padding:0 20rpx; +} +.left-panel .income .spliter{ + width:1.2rpx; + height:88rpx; + background-color: rgba(153, 153, 153, 0.3); +} +.left-panel .income .item .key{ + font-size: 24rpx; +} +.left-panel .income .item .value{ + font-size: 36rpx; + margin-top:28rpx; + font-weight: 500; +} +.left-panel .income .item .icon{ + width:16rpx;height:16rpx; + margin-left:6rpx; +} + +.left-panel .actions{ + text-align: center; + display: flex; + justify-content: space-between; + font-size: 24rpx; + color: #555555; +} +.left-panel .actions .item{ + padding:0 20rpx; +} +.left-panel .actions .item .icon{ + width:40rpx;height:40rpx; + margin-bottom:28rpx; +} + +.left-panel .logout-btn{ + position: absolute; + bottom:80rpx; + left:20rpx;right:20rpx; + background-color: #fff; + font-weight: normal; +} +.left-panel .logout-btn:hover{ + background-color: #fff!important; + color:#222!important; } \ No newline at end of file diff --git a/pages/login/index.js b/pages/login/index.js new file mode 100644 index 0000000..c5c0fb8 --- /dev/null +++ b/pages/login/index.js @@ -0,0 +1,93 @@ +import userApi from '../../api/user'; +const app = getApp(); + +Page({ + + /** + * 页面的初始数据 + */ + data: { + phone:'13438370499', + password:'6x9vw9s2', + isAgree:false + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad(options) { + + }, + login(){ + if(this.data.isAgree){ + userApi.login(this.data.phone,this.data.password).then((data)=>{ + app.globalData.userInfo = data.user; + app.globalData.accessToken = data.access_token; + wx.setStorage({ + key:'accessToken', + data:data.access_token, + success:()=>{ + wx.reLaunch({ + url: '/pages/index/index', + }) + } + }) + }) + }else{ + + } + }, + handleAgreeChange(event){ + this.setData({ + isAgree:!!event.detail + }) + }, + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady() { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow() { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide() { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload() { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh() { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom() { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage() { + + } +}) \ No newline at end of file diff --git a/pages/login/index.json b/pages/login/index.json new file mode 100644 index 0000000..965b8e8 --- /dev/null +++ b/pages/login/index.json @@ -0,0 +1,4 @@ +{ + "usingComponents": {}, + "navigationStyle": "custom" +} \ No newline at end of file diff --git a/pages/login/index.wxml b/pages/login/index.wxml new file mode 100644 index 0000000..c513946 --- /dev/null +++ b/pages/login/index.wxml @@ -0,0 +1,20 @@ + \ No newline at end of file diff --git a/pages/login/index.wxss b/pages/login/index.wxss new file mode 100644 index 0000000..19f784f --- /dev/null +++ b/pages/login/index.wxss @@ -0,0 +1,51 @@ +.login{ + background-color: #fff; + height:100vh; +} +.login .head{ + background-color: var(--main-color); + position: relative; + height:554rpx; +} +.login .head .bg{ + width: 450rpx;height:486rpx; + position: absolute; + right:-40rpx;top:204rpx; +} +.login .head .title{ + font-size: 46rpx; + position: absolute; + left:40rpx; + bottom:144rpx; +} +.login .input-area{ + border-radius: 30rpx 30rpx 0px 0px; + margin-top:-80rpx; + background-color: #fff; + position: relative; + padding:40rpx 50rpx; +} +.login .input-area .input{ + background-color:#F7F7F7; + border-radius: 18rpx; + height: 100rpx; + padding:0 30rpx; + margin-bottom:24rpx; +} +.login .input-area .button{ + margin-top:50rpx; + border-radius: 20rpx; +} + +.agree{ + font-size: 26rpx; + margin-top:50rpx; +} +.agree .yellow{ + color:var(--main-color); + margin: 0; +} +.agree .policy{ + display: inline-flex; + align-items: center; +} \ No newline at end of file diff --git a/pages/order-detail/index.json b/pages/order-detail/index.json index 781f718..7790401 100644 --- a/pages/order-detail/index.json +++ b/pages/order-detail/index.json @@ -1,4 +1,12 @@ { "usingComponents": {}, - "navigationBarTitleText": "订单详情" + "navigationBarTitleText": "订单详情", + "window": { + "navigationBarBackgroundColor": "#ffffff", + "navigationBarTextStyle": "black", + "navigationBarTitleText": "title", + "backgroundColor": "#eeeeee", + "backgroundTextStyle": "light", + "enablePullDownRefresh": true + } } \ No newline at end of file diff --git a/pages/user/income/index.js b/pages/user/income/index.js new file mode 100644 index 0000000..666342e --- /dev/null +++ b/pages/user/income/index.js @@ -0,0 +1,68 @@ +import userApi from '../../../api/user'; + + +Page({ + + /** + * 页面的初始数据 + */ + data: { + + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad(options) { + userApi.incomeList(); + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady() { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow() { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide() { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload() { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh() { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom() { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage() { + + } +}) \ No newline at end of file diff --git a/pages/user/income/index.json b/pages/user/income/index.json new file mode 100644 index 0000000..42531bc --- /dev/null +++ b/pages/user/income/index.json @@ -0,0 +1,4 @@ +{ + "usingComponents": {}, + "navigationBarTitleText": "交易明细" +} \ No newline at end of file diff --git a/pages/user/income/index.wxml b/pages/user/income/index.wxml new file mode 100644 index 0000000..c764551 --- /dev/null +++ b/pages/user/income/index.wxml @@ -0,0 +1,9 @@ + + + + 订单编号6777跑腿收益 + 2024.10.10 12:15:51 + + 3.0 + + \ No newline at end of file diff --git a/pages/user/income/index.wxss b/pages/user/income/index.wxss new file mode 100644 index 0000000..f5ca93c --- /dev/null +++ b/pages/user/income/index.wxss @@ -0,0 +1,20 @@ +.income-list{ + background-color: #ffffff; + margin-top:20rpx; +} +.income-list .item{ + display: flex; + padding:40rpx 30rpx; + border-bottom: 1rpx solid rgba(153, 153, 153, 0.2); +} +.income-list .item .content{ + flex:1; + +} +.income-list .item .title{ + font-size: 32rpx; +} +.income-list .item .sub-title{ + margin-top:32rpx; + color: #888888; +} \ No newline at end of file diff --git a/pages/user/info/index.js b/pages/user/info/index.js new file mode 100644 index 0000000..a592206 --- /dev/null +++ b/pages/user/info/index.js @@ -0,0 +1,77 @@ +import userApi from '../../../api/user'; +const app = getApp(); + +Page({ + + /** + * 页面的初始数据 + */ + data: { + summary:{}, + refreshTrigger:false + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad(options) { + this.refreshSummary(); + }, + + refreshSummary(){ + app.forceGetSummary().then((data)=>{ + this.setData({ + summary:data, + refreshTrigger:false + }) + }) + }, + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady() { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow() { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide() { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload() { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh() { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom() { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage() { + + } +}) \ No newline at end of file diff --git a/pages/user/info/index.json b/pages/user/info/index.json new file mode 100644 index 0000000..d24de84 --- /dev/null +++ b/pages/user/info/index.json @@ -0,0 +1,6 @@ +{ + "usingComponents": { + "nav-bar":"/components/navBar" + }, + "navigationStyle": "custom" +} \ No newline at end of file diff --git a/pages/user/info/index.wxml b/pages/user/info/index.wxml new file mode 100644 index 0000000..e3f7540 --- /dev/null +++ b/pages/user/info/index.wxml @@ -0,0 +1,42 @@ + + + + + + + + + + 交易明细 + + + + + + 提现记录 + + + + + + + 实名认证 + + + + + + 银行卡管理 + + + + + diff --git a/pages/user/info/index.wxss b/pages/user/info/index.wxss new file mode 100644 index 0000000..50a5d9c --- /dev/null +++ b/pages/user/info/index.wxss @@ -0,0 +1,28 @@ +.bg{ + background-color: var(--main-color); + border-radius: 0 0 20rpx 20rpx; + padding-bottom:240rpx; +} +.scroll-view{ + position: fixed; + top:15vh;left:0; + height:85vh; +} +.user-info{ + text-align: center; + padding-top:60rpx; +} +.user-info ._money{ + font-size: 80rpx; + margin-top:50rpx; + font-weight: 600; +} +.user-info .today{ + font-size: 28rpx; + color: #555555; + margin-top:50rpx; +} +.user-info .button{ + border-radius: 60rpx; + margin-top:70rpx; +} \ No newline at end of file diff --git a/pages/withdraw/index/index.js b/pages/withdraw/index/index.js new file mode 100644 index 0000000..bce20f1 --- /dev/null +++ b/pages/withdraw/index/index.js @@ -0,0 +1,70 @@ +// pages/withdraw/index.js +Page({ + + /** + * 页面的初始数据 + */ + data: { + + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad(options) { + + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady() { + + }, + widthdraw(){ + wx.navigateTo({ + url: '/pages/withdraw/success/index', + }) + }, + /** + * 生命周期函数--监听页面显示 + */ + onShow() { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide() { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload() { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh() { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom() { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage() { + + } +}) \ No newline at end of file diff --git a/pages/withdraw/index/index.json b/pages/withdraw/index/index.json new file mode 100644 index 0000000..8835af0 --- /dev/null +++ b/pages/withdraw/index/index.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/withdraw/index/index.wxml b/pages/withdraw/index/index.wxml new file mode 100644 index 0000000..1adf5c2 --- /dev/null +++ b/pages/withdraw/index/index.wxml @@ -0,0 +1,39 @@ + + + 提现金额 + 24小时到账 + + + + + + 账户余额:4500.0 + 全部提现 + + + + + 提现方式 + + + + + + + + + + 添加银行卡 + + + + + \ No newline at end of file diff --git a/pages/withdraw/index/index.wxss b/pages/withdraw/index/index.wxss new file mode 100644 index 0000000..107a56b --- /dev/null +++ b/pages/withdraw/index/index.wxss @@ -0,0 +1,83 @@ +.amount{ + padding-bottom:0; +} +.amount .head{ + display: flex; + align-items: center; + justify-content: space-between; +} + +.amount .head .key{ + font-size: 32rpx; +} +.amount .head .value{ + font-size: 26rpx; + color: #888888; +} + +.amount .input-area{ + display: flex; + align-items: center; + margin-top:60rpx; +} +.amount .input-area::before{ + content: '¥'; + font-size: 50rpx; + font-weight: 500; +} +.amount .input{ + flex: 1; + font-size: 56rpx; + font-weight: 500; + height:114rpx; + margin-left:24rpx; +} +.amount .bottom{ + display: flex; + align-items: center; + justify-content: space-between; + font-size: 26rpx; +} +.amount .bottom .value{ + padding:32rpx 0 32rpx 32rpx; + color:var(--main-color); +} + +.banks{ +} +.banks .spliter{ + margin-top:30rpx; +} +.banks .bank-list{ + margin-top:20rpx; +} +.banks .item{ + display: flex; + align-items: center; + padding:20rpx 0; + margin:0; +} +.banks .icon{ + width:44rpx;height:44rpx; +} +.banks .icon.plus{ + background-color: var(--main-color); + border-radius: 50%; + color:#fff; + display: flex; + align-items: center; + justify-content: center; +} +.banks .icon .plus{ + width:28rpx;height:28rpx; +} +.banks .name{ + font-size: 32rpx; + margin-left:30rpx; + flex:1; +} +.banks .checkbox{} + +.widthdraw-btn{ + margin:40rpx 20rpx 0 20rpx!important; +} \ No newline at end of file diff --git a/pages/withdraw/success/index.js b/pages/withdraw/success/index.js new file mode 100644 index 0000000..86f2a6f --- /dev/null +++ b/pages/withdraw/success/index.js @@ -0,0 +1,70 @@ +// pages/withdraw/success/index.js +Page({ + + /** + * 页面的初始数据 + */ + data: { + + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad(options) { + + }, + done(){ + wx.navigateBack({ + delta:2 + }) + }, + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady() { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow() { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide() { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload() { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh() { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom() { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage() { + + } +}) \ No newline at end of file diff --git a/pages/withdraw/success/index.json b/pages/withdraw/success/index.json new file mode 100644 index 0000000..8835af0 --- /dev/null +++ b/pages/withdraw/success/index.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/pages/withdraw/success/index.wxml b/pages/withdraw/success/index.wxml new file mode 100644 index 0000000..1c74849 --- /dev/null +++ b/pages/withdraw/success/index.wxml @@ -0,0 +1,22 @@ + + + 提现申请成功 + 24小时到账 (周末节假日顺延),以实际到账时间为准! + + + + + 提现类型 + 账户提现 + + + 提现金额 + 8888.0 + + + 到账方式 + 中国工商银行(7726) + + + + \ No newline at end of file diff --git a/pages/withdraw/success/index.wxss b/pages/withdraw/success/index.wxss new file mode 100644 index 0000000..1e81843 --- /dev/null +++ b/pages/withdraw/success/index.wxss @@ -0,0 +1,27 @@ +.success-info{ + text-align: center; + padding-top:70rpx +} +.success-info .icon{ + width:90rpx;height:90rpx; +} +.success-info .title{ + font-size: 44rpx; + margin-top:40rpx; + font-weight: 500; +} +.success-info .sub-title{ + font-size: 24rpx; + color: #555555; + margin-top:40rpx; +} +.order-info .cell-hd{ + color:#555555; +} +.order-info .cell-bd{ + font-weight: 500; +} + +.done-btn{ + margin:40rpx 20rpx 0 20rpx!important; +}