初步接口测完

This commit is contained in:
2025-02-20 01:42:47 +08:00
parent 3f3c0095c8
commit e6ec7ecd96
40 changed files with 934 additions and 173 deletions

View File

@ -18,10 +18,11 @@ export default {
},
buildingList:(community_id,status)=>request.get('/api/order/community_building/count',{community_id,status}),
list:(data)=>request.get('/api/order/deliveryman/list',data,true),
list:(data)=>request.get('/api/order/deliveryman/list',data,{delayLoading:true}),
detail:(orderid)=>request.get(`/api/order/${orderid}`),
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)})
complete:(orderid,images)=>request.post(`/api/order/${orderid}/deliveryman/complete`,{images:images})
}

View File

@ -4,7 +4,7 @@ let app = getApp();
const sendRequest = (options)=>{
if(!app)app = getApp();
let timer;
if(options.delayLoading){
if(options.options.delayLoading){
timer = setTimeout(()=>{
wx.showLoading({
title: '加载中...',
@ -23,16 +23,21 @@ const sendRequest = (options)=>{
if(result.data.code==200){
rs(result.data.data);
}else{
if(!options.options.noTips){
wx.showToast({
icon:'error',
title: result.data.message,
});
}
rj(result.data);
}
}else if(result.statusCode==401){
wx.navigateTo({
url: '/pages/login/login',
})
}else{
rj(result.data);
}
},
@ -54,16 +59,16 @@ const sendRequest = (options)=>{
export default {
baseUrl:baseUrl,
get(url,data,delayLoading){
return sendRequest({url,method:'get',data,delayLoading});
get(url,data,options){
return sendRequest({url,method:'get',data,options:options||{}});
},
post(url,data){
return sendRequest({url,method:'post',data});
post(url,data,options){
return sendRequest({url,method:'post',data,options:options||{}});
},
put(url,data){
return sendRequest({url,method:'put',data});
put(url,data,options){
return sendRequest({url,method:'put',data,options:options||{}});
},
delete(url,data){
return sendRequest({url,method:'delete',data});
delete(url,data,options){
return sendRequest({url,method:'delete',data,options:options||{}});
}
}

View File

@ -9,11 +9,26 @@ export default {
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'),
orderSummary:()=>request.get('/api/order/deliveryman/summary'),
incomeList:(data)=>request.get('/api/account/details',data),
getRNAuth:()=>request.get('/api/user/auth'),
getRNAuth:()=>request.get('/api/user/auth',{noTips:true}),
setRNAuth:(data)=>request.post('/api/user/auth',data),
bankCard:{
list:()=>request.get('/api/bank-cards'),
add:(data)=>request.post('/api/bank-cards',data),
delete:(card_id)=>request.delete(`/api/bank-cards/${card_id}`)
},
verifyCode:(phone)=>request.post('/api/user/send-code',{phone}),
modifyPassword:(new_password,verify_code)=>request.post('/api/user/change-password',{new_password,verify_code}),
withdraw:{
add:(bank_card_id,amount)=>request.post('/api/withdraw',{bank_card_id,amount}),
list:(status)=>request.get('/api/withdraw/user',status?{status}:{}),
},
uploadImg(file,progress){
if(!app)app = getApp();
return new Promise((rs,rj)=>{
const task = wx.uploadFile({
filePath: file.tempFilePath,

46
app.js
View File

@ -1,8 +1,9 @@
import userApi from './api/user';
const token = wx.getStorageSync('accessToken');
// console.log()
const date = new Date();
App({
verifyCodeWaitingTime:60,
onLaunch() {
if(!token){
wx.navigateTo({
@ -47,6 +48,49 @@ App({
this.globalData.summaryGetTime = new Date();
return data;
},
validateForm(rules,page){
const result = [];
for(var key in rules){
((rules[key] instanceof Array)?rules[key]:[rules[key]]).map((item)=>{
let valid = true;
//非空
if(item.required){
if(page.data[key].trim()==''){
valid = false;
}
}else if(item.length){
//绝对长度
if(page.data[key].trim().length!=item.length){
valid = false;
}
}
if(valid){
page.setData({
[`${key}Message`]:''
});
}else{
page.setData({
[`${key}Message`]:item.message
});
result.push({
[key]:item.message
})
}
})
}
return result;
},
validateInput(rule,page){
if(rule.required){
if(page.data[key].trim()==''){
page.setData({
[`${key}Message`]:rule.message
});
return false;
}
}
return true;
},
globalData: {
userInfo: null,
accessToken:token,

View File

@ -9,7 +9,9 @@
"pages/user/income/index",
"pages/user/rnAuth/index",
"pages/user/bank/index/index",
"pages/user/bank/editor/index"
"pages/user/bank/editor/index",
"pages/user/password/index",
"pages/withdraw/list/index"
],
"window": {
"navigationBarTextStyle": "black",

View File

@ -39,7 +39,7 @@ button[plain]{
border: 1rpx solid rgba(255, 195, 0, 0.5);
color: #FFC300;
}
button:not([plain])[type=primary]:hover{
button:not([plain]):not([disabled])[type=primary]:hover{
background-color:var(--main-hover-color);
}
button[type=default]{
@ -224,7 +224,6 @@ page-container .content{
display: flex;
align-items: center;
padding:0 40rpx;
min-height: 116rpx;
font-size: 30rpx;
position: relative;
}
@ -251,13 +250,28 @@ page-container .content{
}
.cells .cell-bd{
flex:1;
display: flex;
align-items: center;
position:relative;
min-height: 116rpx;
}
.cells .cell-bd .error{
color:red;
position: absolute;
left:0;bottom:10rpx;
font-size: 24rpx;
}
.cells .cell-bd input{
height:100rpx;
}
.cells .cell-ft{
position: relative;
padding-right:40rpx;
color:#999;
}
.cells .cell-ft::after{
.cells.cells-access .cell-ft{
padding-right: 40rpx;
}
.cells.cells-access .cell-ft::after{
content:" ";
width:24rpx;height:48rpx;
-webkit-mask-position:0 0;
@ -309,6 +323,10 @@ page-container .content{
navigator button{
vertical-align: middle;
}
.navigator-hover{
background-color: transparent;
opacity: 1;
}
.list-empty{

View File

@ -22,6 +22,7 @@ Page({
userInfo:{},
userInfoTrigger:false,
summary:{},
orderSummary:{},
statusDetail:{
created:{
key:'CREATED',value:0,text:"待接单"
@ -55,10 +56,7 @@ Page({
scrollViewHeight:windowInfo.windowHeight-windowInfo.statusBarHeight-44 - 125
});
app.getUserInfo().then((data)=>{
this.setData({
userInfo:data
});
this.getUserInfo().then(()=>{
return this.loadStatusDetail();
}).then((data)=>{
return this.loadBuilding();
@ -71,20 +69,30 @@ Page({
});
});
},
getUserInfo(){
app.forceGetUserInfo().then((data)=>{
async getUserInfo(){
await app.forceGetUserInfo().then((data)=>{
this.setData({
userInfo:data,
userInfoTrigger:false
})
});
userApi.orderSummary().then((data)=>{
this.setData({
orderSummary:data
})
});
userApi.summary().then((data)=>{
this.setData({
summary:data
})
})
},
setStatus(event){
const status = event.currentTarget.dataset.item;
console.log(status);
//先不setData 让加载出来之后再设置
this.loadBuilding().then((data)=>{
this.data.statusDetailKey = status.key.toLowerCase();
this.loadBuilding().then((data)=>{
this.data.pager.pageIndex = 0;
this.data.pager.loadAll = false;
this.loadList();
@ -109,8 +117,8 @@ Page({
},
async loadStatusDetail(){
const data = await orderApi.statusDetail(this.data.userInfo.community_id);
data.map((item)=>{
this.data.statusDetail.completed.value = 0;
data.map((item)=>{
if(item.status==this.data.orderStatus.unpaid||item.status==this.data.orderStatus.completed){
this.data.statusDetail.completed.value += item.count;
}else{
@ -119,14 +127,19 @@ Page({
}
}
});
console.log(this.data.statusDetail);
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);
const status = this.data.statusDetail[this.data.statusDetailKey];
let _status = status.key;
if(status.key==this.data.orderStatus.completed){
_status = `${this.data.orderStatus.unpaid},${this.data.orderStatus.completed}`;
}
const data = await orderApi.buildingList(cid,_status);
this.setData({
buildingList:data
});
@ -146,7 +159,7 @@ Page({
if(this.data.statusDetailKey=='completed'){
params.status = `${this.data.orderStatus.unpaid},${this.data.orderStatus.completed}`
}else{
params.status = this.data.statusDetailKey;
params.status = this.data.statusDetail[this.data.statusDetailKey].key;
}
orderApi.list(params).then((data)=>{
if(this.data.pager.pageIndex==0){
@ -206,10 +219,6 @@ Page({
placeholderText:'请输入退款原因',
editable:true,
complete: (res) => {
if (res.cancel) {
}
if (res.confirm) {
}
@ -219,6 +228,8 @@ Page({
chooseImage(){
wx.chooseMedia({
count:this.data.maxChooseImgCount - this.data.tempImgs.length,
mediaType:['image'],
sourceType:['camera'],
success:(res)=>{
console.log(res);
this.setData({
@ -227,9 +238,10 @@ Page({
}
});
},
navToOrderDetail(){
navToOrderDetail(event){
const id = event.currentTarget.dataset.id;
wx.navigateTo({
url: '/pages/order-detail/index',
url: `/pages/order-detail/index?id=${id}`,
})
},
@ -278,9 +290,11 @@ Page({
this.data.tempImgs.map((item)=>{
urls.push(item.serverUrl);
})
console.log('uploadAndConfirmSend',urls);
// return;
orderApi.complete(this.currentOrder.orderid,urls).then((data)=>{
this.setData({
isShowConfirm:false
})
this.refreshList();
wx.showToast({
icon:'success',
title: '订单已完成',
@ -330,9 +344,14 @@ Page({
})
}
},
navToUserInfo(){
wx.navigateTo({
url: '/pages/user/info/index',
logout(){
wx.removeStorage({
key: 'accessToken',
success(){
wx.redirectTo({
url: '/pages/login/index',
})
}
})
}
})

View File

@ -26,7 +26,7 @@
refresher-triggered="{{pager.refreshTrigger}}"
show-load-more="{{!(list.length==0&&pager.loadAll)}}"
loading="{{pager.loading}}" load-all="{{pager.loadAll}}">
<view wx:for="{{list}}" wx:key="index" bind:tap="navToOrderDetail"
<view wx:for="{{list}}" wx:key="index" bind:tap="navToOrderDetail" data-id="{{item.orderid}}"
class="item {{item.status==orderStatus.unpaid||item.status==orderStatus.completed?'no-btns':''}}" >
<view class="station-list">
<view class="sl-item" wx:for="{{item.packages}}" wx:key="index" wx:for-item="pItem" wx:for-index="pIndex">
@ -34,7 +34,10 @@
<view class="package">
<view class="key">{{pItem.pickup_codes.length}}件包裹:</view>
<view class="value">
<label wx:for="{{pItem.pickup_codes}}" wx:key="index" class="code-item">******</label>
<label wx:for="{{pItem.pickup_codes}}" wx:key="index" class="code-item"
wx:for-item="code">
{{item.status==orderStatus.created?'******':code}}
</label>
</view>
</view>
</view>
@ -117,35 +120,35 @@
<view class="order-info">
<view class="item">
<view class="key">总量订单</view>
<view class="value">{{summary.total}}</view>
<view class="value">{{orderSummary.total_count}}</view>
</view>
<view class="item">
<view class="key">昨日订单</view>
<view class="value">{{summary.yesterday_total}}</view>
<view class="value">{{orderSummary.yesterday_count}}</view>
</view>
<view class="item">
<view class="key">今日订单</view>
<view class="value">{{summary.today_total}}</view>
<view class="value">{{orderSummary.today_count}}</view>
</view>
</view>
</view>
<view class="page-container income">
<view class="item" bind:tap="navToUserInfo">
<navigator url="/pages/user/info/index" class="item">
<view class="key">
<label>账户余额</label>
<image class="icon" src="/assets/icon/right-arrow-small.png"/>
</view>
<view class="value">{{summary.balance}}</view>
</view>
</navigator>
<view class="spliter"></view>
<view class="item">
<navigator url="/pages/user/income/index" class="item">
<view class="key">
<label>今日收益</label>
<image class="icon" src="/assets/icon/right-arrow-small.png"/>
</view>
<view class="value">{{summary.today_income}}</view>
</view>
</navigator>
</view>
<view class="page-container actions">
@ -153,17 +156,17 @@
<image class="icon" src="/assets/icon/service.png"/>
<view>在线客服</view>
</view>
<view class="item">
<navigator url="/pages/user/password/index" class="item">
<image class="icon" src="/assets/icon/password.png"/>
<view>修改密码</view>
</view>
</navigator>
<view class="item">
<image class="icon" src="/assets/icon/agreement.png"/>
<view>用户协议</view>
</view>
</view>
<button type="primary" class="logout-btn">退出登录</button>
<button type="primary" class="logout-btn" bind:tap="logout">退出登录</button>
</scroll-view>
</movable-view>
</movable-area>

View File

@ -1,21 +1,79 @@
// pages/order-detail/index.js
import orderApi from '../../api/order';
import userApi from '../../api/user';
Page({
orderId:'',
/**
* 页面的初始数据
*/
data: {
orderDetail:{},
refreshTrigger:false,
orderStatus:orderApi.status,
orderStatusKV:orderApi.statusKV,
deliverStatusKV:orderApi.deliverStatusKV,
genderKV:userApi.genderKV,
orderStep:0,
scrollViewHeight:0
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
const windowInfo = wx.getWindowInfo();
this.setData({
scrollViewHeight:windowInfo.windowHeight
});
this.orderId = options.id;
this.getOrderDetail();
},
getOrderDetail(){
orderApi.detail(this.orderId).then((data)=>{
let orderStep = 0;
if(data.order.status==this.data.orderStatus.received){
orderStep = 1;
}else if(data.order.status==this.data.orderStatus.delivering){
orderStep = 2;
}else if(data.order.status==this.data.orderStatus.unpaid||data.order.status==this.data.orderStatus.completed){
orderStep = 3;
}
data.order.complete_time = this.formatTime(data.order.complete_time);
data.order.pickup_time = this.formatTime(data.order.pickup_time);
data.order.received_time = this.formatTime(data.order.received_time);
data.packages.map((item)=>{
item.pickup_codes = item.pickup_codes.split(',')
})
this.setData({
orderDetail:data,
refreshTrigger:false,
orderStep
})
}).catch(()=>{
this.setData({
refreshTrigger:false
})
})
},
copyOrderId(){
wx.setClipboardData({
data: 'data',
data: this.data.orderDetail.order.orderid,
})
},
formatTime(time){
return (time||'').substr(5,11);
},
preview(event){
const current = event.currentTarget.dataset.url;
wx.previewImage({
current:current,
urls: this.data.orderDetail.order.complete_images,
})
},
/**

View File

@ -1,60 +1,73 @@
<view class="page-container package-info">
<scroll-view refresher-triggered="{{refreshTrigger}}" bindrefresherrefresh="getOrderDetail"
refresher-enabled scroll-y style="height:{{scrollViewHeight*2}}rpx;">
<view class="page-container package-info">
<view class="station-list" bind:tap="navToOrderDetail">
<view class="sl-item" wx:for="{{3}}" wx:key="index">
<view class="name">菜鸟驿站(丽晶公馆)</view>
<view class="sl-item" wx:for="{{orderDetail.packages}}" wx:key="index">
<view class="name">{{item.station_name}}</view>
<view class="package">
<view class="key">4件包裹:</view>
<view class="key">{{item.pickup_codes.length}} 件包裹:</view>
<view class="value">
<label wx:for="{{6}}" wx:key="index">****** </label>
<label wx:for="{{item.pickup_codes}}" wx:key="index" wx:for-item="code">
{{orderDetail.order.status==orderStatus.created?'******':code}}
</label>
</view>
</view>
</view>
</view>
<view class="address">
<view class="title">佳兆业丽晶公馆3栋2单元2702</view>
<view class="sub-title">冯先生158****3822丨放在门口</view>
<view class="title">
{{orderDetail.order.community_name}}
{{orderDetail.order.building_name}}
{{orderDetail.order.address_detail}}
</view>
</view>
<view class="page-container steps">
<view class="item night">
<view class="sub-title">
{{orderDetail.order.address_name}}
{{genderKV[orderDetail.order.address_gender]}}{{orderDetail.order.address_phone}}丨{{deliverStatusKV[orderDetail.order.delivery_method]}}
</view>
</view>
</view>
<view class="page-container steps">
<view class="item {{orderStep>0?'night':''}}">
<view class="content">
<view class="name">接单</view>
<view class="time">07-01 14:23</view>
<view class="time">{{orderDetail.order.received_time}}</view>
</view>
</view>
<view class="item night">
<view class="item {{orderStep>1?'night':(orderStep==1?'half-night':'')}}">
<view class="content">
<view class="name">取货</view>
<view class="time">07-01 14:23</view>
<view class="time">{{orderDetail.order.pickup_time}}</view>
</view>
</view>
<view class="item half-night">
<view class="item {{orderStep>2?'night':(orderStep==2?'half-night':'')}}">
<view class="content">
<view class="name">送达</view>
<view class="time">07-01 14:23</view>
<view class="time">{{orderDetail.order.complete_time}}</view>
</view>
</view>
</view>
<view class="page-container photos">
</view>
<view class="page-container photos" wx:if="{{orderDetail.order.complete_images}}">
<view class="title">拍照留证</view>
<view class="imgs">
<image class="image" src="/assets/icon/phone.png" wx:for="{{4}}" wx:key="index"/>
<image class="image" src="{{item}}" wx:for="{{orderDetail.order.complete_images}}" wx:key="index" bind:tap="preview" data-url="{{item}}"/>
</view>
</view>
<view class="page-container income">
</view>
<view class="page-container income">
<label>订单收益:</label>
<label class="money">3.0</label>
</view>
<view class="page-container order-info">
<label class="money">{{orderDetail.order.deliveryman_share}}</label>
</view>
<view class="page-container order-info">
<view class="row">
<view class="key">订单编号</view>
<view class="value">2024071166325555</view>
<view class="value">{{orderDetail.order.orderid}}</view>
<view class="copy-area" bind:tap="copyOrderId">
<view class="copy-btn">复制</view>
</view>
</view>
<view class="row">
<view class="key">下单时间</view>
<view class="value">2024071166325555</view>
<view class="value">{{orderDetail.order.create_time}}</view>
</view>
</view>
</view>
</scroll-view>

View File

@ -55,6 +55,9 @@
}
.package-info .package .value{
flex:1;
display: flex;
flex-wrap: wrap;
gap: 16rpx;
}
.package-info .address{

View File

@ -1,11 +1,14 @@
// pages/user/bank/editor/index.js
import userApi from '../../../../api/user';
Page({
/**
* 页面的初始数据
*/
data: {
name:'',
bankName:'',
cardNumber:'',//16-19
},
/**
@ -15,6 +18,22 @@ Page({
},
addCard(){
userApi.bankCard.add({
name:this.data.name,
card_number:this.data.cardNumber,
bank_name:this.data.bankName
}).then(()=>{
wx.navigateBack({
success(){
wx.showToast({
icon:'success',
title: '添加成功',
})
}
});
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/

View File

@ -1,3 +1,4 @@
{
"usingComponents": {}
"usingComponents": {},
"navigationBarTitleText": "添加银行卡"
}

View File

@ -3,23 +3,23 @@
<view class="cell">
<view class="cell-hd">持卡姓名</view>
<view class="cell-bd">
<input placeholder="请输入持卡姓名"/>
<input placeholder="请输入持卡姓名" model:value="{{name}}"/>
</view>
</view>
<view class="cell">
<view class="cell-hd">开户银行</view>
<view class="cell-bd">
<input placeholder="请输入开户银行"/>
<input placeholder="请输入开户银行" model:value="{{bankName}}"/>
</view>
</view>
<view class="cell">
<view class="cell-hd">银行卡号</view>
<view class="cell-bd">
<input placeholder="请输入银行卡号"/>
<input placeholder="请输入银行卡号" model:value="{{cardNumber}}"/>
</view>
</view>
</view>
<view class="bottom-bar">
<button type="primary" class="save-btn">提交并认证</button>
<button type="primary" class="save-btn" bind:tap="addCard">提交并认证</button>
</view>

View File

@ -1,24 +1,44 @@
// pages/user/bank/index/index.js
import userApi from '../../../../api/user';
Page({
/**
* 页面的初始数据
*/
data: {
cardList:[],
listLoading:false
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
navToAdd(){
wx.navigateTo({
url: '/pages/user/bank/editor/index',
})
},
deleteCard(event){
const card = event.currentTarget.dataset.item;
const endNumber = card.card_number.substr(card.card_number.length-4,card.card_number.length);
wx.showModal({
title: '是否确认删除此银行卡',
content: `尾号(${endNumber}`,
complete: (res) => {
if (res.confirm) {
userApi.cardList.delete(card.id).then((data)=>{
wx.showToast({
icon:'success',
title: '删除成功',
})
this.getCardList();
});
}
}
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
@ -30,7 +50,21 @@ Page({
* 生命周期函数--监听页面显示
*/
onShow() {
this.getCardList();
},
getCardList(){
if(this.data.listLoading)return;
this.setData({
listLoading:true
});
wx.showNavigationBarLoading();
userApi.bankCard.list().then((data)=>{
wx.hideNavigationBarLoading();
this.setData({
cardList:data,
listLoading:false
})
})
},
/**

View File

@ -1,23 +1,27 @@
<view class="bank-card">
<view class="title">
<view class="page-title">
<label>提现用卡</label>
<view class="tag">个人账户</view>
</view>
<view class="card">
<view class="card" wx:for="{{cardList}}" wx:key="index">
<view class="head">
<image class="icon-card" src="/assets/icon/card.png"/>
<view class="name">中国工商银行</view>
<image class="icon-delete" src="/assets/icon/delete.png"/>
<view class="name">{{item.bank_name}}</view>
<image class="icon-delete" src="/assets/icon/delete.png" bind:tap="deleteCard" data-item="{{item}}"/>
</view>
<view class="spliter"></view>
<view class="info-item">
<view class="key">持卡人</view>
<view class="value">仙人模斗</view>
<view class="value">{{item.name}}</view>
</view>
<view class="info-item">
<view class="key">银行卡号</view>
<view class="value card-no">**** **** **** ***9 009</view>
<view class="value card-no">{{item.card_number}}</view>
</view>
</view>
<view class="list-empty" wx:if="{{cardList.length==0&&!listLoading}}">
<image class="icon" src="/assets/icon/list-empty.png"/>
<view class="title">暂无银行卡</view>
</view>
<button bind:tap="navToAdd" class="add-card-btn">添加银行卡</button>
</view>

View File

@ -5,12 +5,12 @@
padding:60rpx 30rpx;
}
.title{
.page-title{
font-size: 40rpx;
display: flex;
align-items: flex-end;
}
.title .tag{
.page-title .tag{
font-size: 24rpx;
background-color: rgba(255, 195, 0, 0.1);
padding:5rpx 8rpx;
@ -63,3 +63,10 @@
margin-top:40rpx;
background-color: rgba(153, 153, 153, 0.15);
}
.list-empty{
padding:200rpx 0;
}
.list-empty .icon{
margin-top:0;
}

View File

@ -7,16 +7,56 @@ Page({
* 页面的初始数据
*/
data: {
scrollViewHeight:0,
pager:{limit:10,loading:false,loadAll:false,pageIndex:0,refreshTrigger:false},
list:[]
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
userApi.incomeList();
const windowInfo = wx.getWindowInfo();
this.setData({
scrollViewHeight:windowInfo.windowHeight
})
this.loadList();
},
refreshList(){
this.data.pager.pageIndex = 0;
this.data.pager.loadAll = false;
this.setData({
pager:this.data.pager
});
this.loadList();
},
loadList(){
if(this.data.pager.loading||this.data.pager.loadAll){
return;
}
this.setData({
"pager.loading":true
})
userApi.incomeList().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<this.data.pager.limit){
this.data.pager.loadAll = true;
}
this.setData({
list:this.data.list,
pager:this.data.pager
})
});
},
/**
* 生命周期函数--监听页面初次渲染完成
*/

View File

@ -1,4 +1,6 @@
{
"usingComponents": {},
"usingComponents": {
"list-view":"/components/listView"
},
"navigationBarTitleText": "交易明细"
}

View File

@ -1,9 +1,15 @@
<view class="income-list">
<view class="item" wx:for="{{3}}">
<list-view bind:refresh="refreshList"
bind:loadMore="loadList" height="{{scrollViewHeight}}"
refresher-triggered="{{pager.refreshTrigger}}"
show-load-more="{{!(list.length==0&&pager.loadAll)}}"
loading="{{pager.loading}}" load-all="{{pager.loadAll}}">
<view class="income-list">
<view class="item" wx:for="{{list}}">
<view class="content">
<view class="title">订单编号6777跑腿收益</view>
<view class="sub-title">2024.10.10 12:15:51</view>
<view class="title">{{item.description}}</view>
<view class="sub-title">{{item.create_time}}</view>
</view>
<view class="money">3.0</view>
<view class="money">{{item.amount}}</view>
</view>
</view>
</view>
</list-view>

View File

@ -18,3 +18,7 @@
margin-top:32rpx;
color: #888888;
}
.income-list .item .money{
color:var(--main-color);
}

View File

@ -15,7 +15,6 @@ Page({
* 生命周期函数--监听页面加载
*/
onLoad(options) {
this.refreshSummary();
},
refreshSummary(){
@ -37,7 +36,7 @@ Page({
* 生命周期函数--监听页面显示
*/
onShow() {
this.refreshSummary();
},
/**

View File

@ -6,9 +6,9 @@
<view class="page-container user-info">
<view class="title">账户余额 (元)</view>
<view class="_money">{{summary.balance}}</view>
<view class="today">今日收益(元) {{summary.today_total}}</view>
<view class="today">今日收益(元) {{summary.today_income}}</view>
<navigator url="/pages/withdraw/index/index">
<button class="button" type="primary" disabled="{{summary.balance==0||true}}">提现</button>
<button class="button" type="primary" disabled="{{summary.balance==0}}">提现</button>
</navigator>
</view>
@ -19,7 +19,7 @@
</view>
<view class="cell-ft"></view>
</navigator>
<navigator url="" class="cell" hover-class="cell-active">
<navigator url="/pages/withdraw/list/index" class="cell" hover-class="cell-active">
<view class="cell-bd">
<view>提现记录</view>
</view>

View File

@ -0,0 +1,163 @@
const app = getApp();
import userApi from '../../../api/user';
Page({
verifyCodeTimer:null,
/**
* 页面的初始数据
*/
data: {
phone:'',
verifyCode:'',
password:'',
rePassword:'',
codeLoading:false,
getCodeBtnText:'获取验证码',
waitingTime:app.verifyCodeWaitingTime,
modifyLoading:false
},
validator:{
verifyCode:[
{required:true,message:'请输入验证码'},
{length:6,message:'请输入 6 位数验证码'}
],
password:{required:true,message:'请输入新密码'},
rePassword:{required:true,message:'请输入确认新密码'},
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
app.getUserInfo().then((data)=>{
this.setData({
phone:data.phone
})
});
let time = wx.getStorageSync('password-verify-code-time');
if(time){
let remainTime = app.verifyCodeWaitingTime*1000 - ((new Date()).getTime() - time);
if(remainTime>0){
this.setData({
waitingTime:parseInt(remainTime/1000),
codeLoading:true
})
this.startTimer();
}else{
wx.removeStorageSync('password-verify-code-time')
}
}
},
getVerifyCode(){
if(this.data.codeLoading)return;
this.setData({
codeLoading:true
});
userApi.verifyCode(this.data.phone).then((data)=>{
this.setData({
getCodeBtnText:`${this.data.waitingTime}S`
});
const time = new Date();
wx.setStorageSync('password-verify-code-time', time.getTime());
this.startTimer();
})
},
startTimer(){
console.log(this.data.waitingTime);
if(this.data.waitingTime<=0){
this.setData({
codeLoading:false,
getCodeBtnText:'获取验证码',
waitingTime:app.verifyCodeWaitingTime
});
wx.removeStorageSync('password-verify-code-time')
}else{
this.setData({
getCodeBtnText:`${this.data.waitingTime--}S`
});
this.verifyCodeTimer = setTimeout(this.startTimer,1000);
}
},
save(){
if(this.data.modifyLoading)return;
const valid = app.validateForm(this.validator,this);
if(valid.length==0){
if(this.data.password==this.data.rePassword){
this.setData({
rePasswordMessage:''
});
this.setData({
modifyLoading:true
});
userApi.modifyPassword(this.data.rePassword,this.data.verifyCode).then((data)=>{
wx.navigateBack({
success(){
wx.showToast({
icon:'success',
title: '修改成功',
})
}
})
}).catch(()=>{
console.log(11111,'errro');
this.setData({
modifyLoading:false
})
})
}else{
this.setData({
rePasswordMessage:'两次密码不一致'
})
}
}
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
clearTimeout(this.verifyCodeTimer);
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})

View File

@ -0,0 +1,4 @@
{
"usingComponents": {},
"navigationBarTitleText": "修改密码"
}

View File

@ -0,0 +1,34 @@
<view class="cells">
<view class="cell">
<view class="cell-hd">手机号码</view>
<view class="cell-bd">{{phone}}</view>
</view>
<view class="cell">
<view class="cell-hd">验证码</view>
<view class="cell-bd">
<input placeholder="请输入验证码" model:value="{{verifyCode}}"/>
<view class="error">{{verifyCodeMessage}}</view>
</view>
<view class="cell-ft">
<button size="mini" type="primary" disabled="{{codeLoading}}"
bind:tap="getVerifyCode" class="verify-btn">
{{getCodeBtnText}}
</button>
</view>
</view>
<view class="cell">
<view class="cell-hd">新密码</view>
<view class="cell-bd">
<input placeholder="请输入新密码" model:value="{{password}}"/>
<view class="error">{{passwordMessage}}</view>
</view>
</view>
<view class="cell">
<view class="cell-hd">确认新密码</view>
<view class="cell-bd">
<input placeholder="请确认新密码" model:value="{{rePassword}}"/>
<view class="error">{{rePasswordMessage}}</view>
</view>
</view>
<button type="primary" class="save-btn" bind:tap="save" loading="{{modifyLoading}}">修改并保存</button>
</view>

View File

@ -0,0 +1,15 @@
.verify-btn{
font-weight: normal;
}
.verify-btn[disabled]{
background-color: #fff;
border: 2rpx solid var(--main-color);
color:var(--main-color)!important;
}
.cells .cell-hd{
width:155rpx;
}
.save-btn{
margin:60rpx 30rpx 30rpx!important;
}

View File

@ -1,20 +1,38 @@
// pages/user/rnAuth/index.js
import user from '../../../api/user';
import userApi from '../../../api/user';
Page({
/**
* 页面的初始数据
*/
data: {
name:'',
idCard:'',
already:false
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
userApi.getRNAuth().then((data)=>{
if(data&&data.id_number){
this.setData({
name:data.name,
idCard:data.id_number,
already:true
})
}
});
},
save(){
userApi.setRNAuth({
name:this.data.name,
id_number:this.data.idCard
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/

View File

@ -3,16 +3,18 @@
<view class="cell">
<view class="cell-hd">真实姓名</view>
<view class="cell-bd">
<input placeholder="请输入真实姓名"/>
<label wx:if="{{already}}">{{name}}</label>
<input placeholder="请输入真实姓名" model:value="{{name}}" wx:else/>
</view>
</view>
<view class="cell">
<view class="cell-hd">身份证号</view>
<view class="cell-bd">
<input placeholder="请输入身份证号"/>
<label wx:if="{{already}}">{{idCard}}</label>
<input placeholder="请输入身份证号" model:value="{{idCard}}" wx:else/>
</view>
</view>
<view class="cell">
<!-- <view class="cell">
<view class="cell-hd">手机号码</view>
<view class="cell-bd">
<input placeholder="请输入手机号码"/>
@ -26,9 +28,9 @@
<view class="cell-bd">
<input placeholder="请输入验证码"/>
</view>
</view>
</view> -->
</view>
<view class="bottom-bar">
<button type="primary" class="save-btn">保存并使用</button>
<view class="bottom-bar" wx:if="{{!already}}">
<button type="primary" class="save-btn" bind:tap="save">保存并使用</button>
</view>

View File

@ -1,29 +1,88 @@
// pages/withdraw/index.js
import userApi from '../../../api/user';
const app = getApp();
Page({
/**
* 页面的初始数据
*/
data: {
bankList:[],
amount:'',
amountMessage:'',
summary:{},
inputFocus:false,
bank:''
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
userApi.bankCard.list().then((data)=>{
data.map((item)=>{
item.endNumber = item.card_number.substr(item.card_number.length-4,item.card_number.length);
});
this.setData({
bankList:data
})
});
this.getSummary();
},
getSummary(){
app.forceGetSummary().then((data)=>{
this.setData({
summary:data
})
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
setAmountAll(){
this.setData({
amount:this.data.summary.balance
})
},
widthdraw(){
if(this.data.amount==''){
this.setData({
amountMessage:'请输入提现金额',
inputFocus:true
})
return;
}else{
this.setData({
amountMessage:''
})
}
if(this.data.bank){
userApi.withdraw.add(this.data.bank,this.data.amount).then((data)=>{
this.getSummary();
this.setData({
amount:''
})
const bank = this.data.bankList.find((item)=>item.id==data.bank_card_id);
console.log(bank,data.id);
const showText = `${bank.bank_name}${bank.endNumber}`;
wx.navigateTo({
url: '/pages/withdraw/success/index',
url: `/pages/withdraw/success/index?amount=${data.amount}&bank=${showText}`,
})
});
}else{
wx.showToast({
icon:'error',
title: this.data.bankList.length==0?'请添加银行卡':'请选择银行卡',
})
}
},
navToAddCard(){
wx.navigateTo({
url: '/pages/user/bank/editor/index',
})
},
/**

View File

@ -1,3 +1,4 @@
{
"usingComponents": {}
"usingComponents": {},
"navigationBarTitleText": "账户提现"
}

View File

@ -4,30 +4,26 @@
<view class="value">24小时到账</view>
</view>
<view class="input-area">
<input class="input" placeholder="请输入提现金额"/>
<input class="input" placeholder="请输入提现金额" type="digit" focus="{{inputFocus}}" model:value="{{amount}}"/>
<view class="error">{{amountMessage}}</view>
</view>
<view class="bottom">
<view class="key">账户余额:4500.0</view>
<view class="value">全部提现</view>
<view class="key">账户余额:{{summary.balance}}</view>
<view class="value" bind:tap="setAmountAll">全部提现</view>
</view>
</view>
<view class="page-container banks">
<view class="head">提现方式</view>
<view class="spliter"></view>
<radio-group class="bank-list">
<label class="item">
<radio-group class="bank-list" model:value="{{bank}}">
<label class="item" wx:for="{{bankList}}" wx:key="index">
<image class="icon" src="/assets/icon/card.png"/>
<view class="name">中国工商银行(7726)</view>
<checkbox class="checkbox"/>
</label>
<label class="item">
<image class="icon" src="/assets/icon/card.png"/>
<view class="name">中国工商银行(7726)</view>
<checkbox class="checkbox"/>
<view class="name">{{item.bank_name}}({{item.endNumber}})</view>
<radio class="checkbox" value="{{item.id}}" checked="{{index==0}}"/>
</label>
<view class="item">
<view class="item" bind:tap="navToAddCard">
<view class="icon plus">
<image src="/assets/icon/plus.png" class="plus"/>
</view>

View File

@ -19,6 +19,13 @@
display: flex;
align-items: center;
margin-top:60rpx;
position: relative;
}
.amount .input-area .error{
position: absolute;
bottom:-15rpx;left:55rpx;
color:red;
font-size: 24rpx;
}
.amount .input-area::before{
content: '¥';

View File

@ -0,0 +1,115 @@
import userApi from '../../../api/user';
Page({
/**
* 页面的初始数据
*/
data: {
scrollViewHeight:0,
pager:{limit:10,loading:false,loadAll:false,pageIndex:0,refreshTrigger:false},
list:[]
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
const windowInfo = wx.getWindowInfo();
this.setData({
scrollViewHeight:windowInfo.windowHeight
})
this.loadList();
},
refreshList(){
this.data.pager.pageIndex = 0;
this.data.pager.loadAll = false;
this.setData({
pager:this.data.pager
});
this.loadList();
},
loadList(){
if(this.data.pager.loading||this.data.pager.loadAll){
return;
}
this.setData({
"pager.loading":true
})
userApi.withdraw.list().then((data)=>{
this.data.pager.loadAll = true;
this.data.pager.loading = false;
this.setData({
list:data,
pager:this.data.pager
});
return;
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<this.data.pager.limit){
this.data.pager.loadAll = true;
}
this.setData({
list:this.data.list,
pager:this.data.pager
})
});
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})

View File

@ -0,0 +1,6 @@
{
"usingComponents": {
"list-view":"/components/listView"
},
"navigationBarTitleText": "提现记录"
}

View File

@ -0,0 +1,15 @@
<list-view bind:refresh="refreshList"
bind:loadMore="loadList" height="{{scrollViewHeight}}"
refresher-triggered="{{pager.refreshTrigger}}"
show-load-more="{{!(list.length==0&&pager.loadAll)}}"
loading="{{pager.loading}}" load-all="{{pager.loadAll}}">
<view class="income-list">
<view class="item" wx:for="{{list}}">
<view class="content">
<view class="title">{{item.description}}</view>
<view class="sub-title">{{item.create_time}}</view>
</view>
<view class="money">{{item.amount}}</view>
</view>
</view>
</list-view>

View File

@ -0,0 +1,24 @@
.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;
}
.income-list .item .money{
color:var(--main-color);
}

View File

@ -5,14 +5,18 @@ Page({
* 页面的初始数据
*/
data: {
amount:'',
bank:''
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
this.setData({
amount:options.amount,
bank:options.bank
})
},
done(){
wx.navigateBack({

View File

@ -1,3 +1,4 @@
{
"usingComponents": {}
"usingComponents": {},
"navigationBarTitleText": "账户提现"
}

View File

@ -11,11 +11,11 @@
</view>
<view class="cell">
<view class="cell-hd">提现金额</view>
<view class="cell-bd money money-normal">8888.0</view>
<view class="cell-bd money money-normal">{{amount}}</view>
</view>
<view class="cell">
<view class="cell-hd">到账方式</view>
<view class="cell-bd">中国工商银行7726</view>
<view class="cell-bd">{{bank}}</view>
</view>
</view>