配送时段适配,若干细节调整

This commit is contained in:
2025-03-05 19:46:10 +08:00
parent 58a98c9403
commit 42f5eda659
28 changed files with 313 additions and 176 deletions

5
api/common.js Normal file
View File

@ -0,0 +1,5 @@
import request from './request';
export default {
getConfig:()=>request.get('/api/config')
}

27
app.js
View File

@ -1,7 +1,7 @@
import userApi from './api/user';
import commonApi from './api/common';
const token = wx.getStorageSync('accessToken');
// console.log()
const date = new Date();
console.log(1)
App({
verifyCodeWaitingTime:60,
onLaunch() {
@ -14,9 +14,6 @@ App({
})
}
},
onHide(){
console.log('app on hide');
},
resetUserInfoUpdateTag(){
this.globalData.userInfoGetTime = null;
},
@ -36,6 +33,16 @@ App({
return data;
},
async getAppConfig(){
if(!this.globalData.appConfig){
const data = await commonApi.getConfig();
this.globalData.appConfig = {};
data.map((item)=>{
this.globalData.appConfig[item.key] = item.value;
})
}
return this.globalData.appConfig;
},
forceGetSummary(){
this.globalData.summaryGetTime = null;
@ -57,7 +64,7 @@ App({
for(var key in rules){
((rules[key] instanceof Array)?rules[key]:[rules[key]]).map((item)=>{
let valid = true;
let value = page.data[key].trim();
let value = (page.data[key]||'').trim();
//非空
if(item.required){
if(value==''){
@ -82,9 +89,11 @@ App({
[`${key}Message`]:''
});
}else{
page.setData({
[`${key}Message`]:item.message
});
if(item.message){
page.setData({
[`${key}Message`]:item.message
});
}
result.push({
[key]:item.message,autoFocus:item.autoFocus,key:key,shake:item.shake
})

View File

@ -1,8 +1,8 @@
{
"pages": [
"pages/index/index",
"pages/order-detail/index",
"pages/login/index",
"pages/order-detail/index",
"pages/user/info/index",
"pages/withdraw/index/index",
"pages/withdraw/success/index",
@ -11,11 +11,12 @@
"pages/user/bank/index/index",
"pages/user/bank/editor/index",
"pages/user/password/index",
"pages/withdraw/list/index"
"pages/withdraw/list/index",
"pages/browser/index"
],
"window": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "Weixin",
"navigationBarTitleText": "",
"navigationBarBackgroundColor": "#ffffff"
},
"style": "v2",

BIN
assets/icon/eyes-close.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
assets/icon/eyes-open.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
assets/icon/fengkuai.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

BIN
assets/icon/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

View File

@ -27,7 +27,7 @@ Component({
this.bgam = wx.getBackgroundAudioManager();
this.bgam.title = '后台通知';
this.bgam.audioType = 'music';
this.bgam.coverImgUrl = 'https://dman-1311994147.cos.ap-chengdu.myqcloud.com/20250227/DoADoEhKi4U4ab75d180b27fa14b7c34ae7969762809_d7ee9018-828e-43c7-8b2b-29d4352c0277.jpg?imageMogr2/thumbnail/800x800/format/webp';
this.bgam.coverImgUrl = 'https://dman-1311994147.cos.ap-chengdu.myqcloud.com/static/logo_large.jpg';
this.bgam.onEnded(()=>{
this.bgam.src = this.data.emptyAudio;
});

View File

@ -5,14 +5,14 @@ Component({
* 组件的属性列表
*/
properties: {
"bindrefresherrefresh":{
type:Function
},
"refresherTriggered":{
refresherTriggered:{
type:Boolean,
value:false
},
height:0,
height:{
type:Number,
value:0
},
loadMoreText:{
type:String,
value:'已经到底了'

View File

@ -34,7 +34,10 @@ Component({
type:String,
value:'请输入内容'
},
isShowCancel:true,
isShowCancel:{
type:Boolean,
value:true
},
cancelButtonText:{
type:String,
value:'取消'

View File

@ -9,7 +9,7 @@
<view class="text" wx:else>{{content}}</view>
<view class="btns">
<button class="button cancel" plain vx:if="{{isShowCancel}}" bind:tap="cancelButtonTap">{{cancelButtonText}}</button>
<button class="button cancel" plain wx:if="{{isShowCancel}}" bind:tap="cancelButtonTap">{{cancelButtonText}}</button>
<button class="button confirm" type="primary" bind:tap="okButtonTap">{{okButtonText}}</button>
</view>
</view>

75
pages/browser/index.js Normal file
View File

@ -0,0 +1,75 @@
// pages/browser/index.js
Page({
/**
* 页面的初始数据
*/
data: {
webUrl:''
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
let url = decodeURIComponent(options.url);
if(url.indexOf('?')>-1){
url = `${url}&random=${Math.random()}`
}else{
url = `${url}?random=${Math.random()}`
}
console.log(url);
this.setData({
webUrl:decodeURIComponent(options.url)
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})

1
pages/browser/index.wxml Normal file
View File

@ -0,0 +1 @@
<web-view src="{{webUrl}}"></web-view>

1
pages/browser/index.wxss Normal file
View File

@ -0,0 +1 @@
/* pages/browser/index.wxss */

View File

@ -72,17 +72,17 @@ Page({
});
this.getUserInfo().then(()=>{
app.getSummary().then((data)=>{
this.setData({
summary:data
});
});
return this.loadStatusDetail();
}).then((data)=>{
return this.loadBuilding();
}).then((data)=>{
this.loadList();
});
app.getSummary().then((data)=>{
this.setData({
summary:data
});
});
},
findNewOrder(){
// app.forceGetUserInfo().then((data)=>{

View File

@ -39,7 +39,13 @@
loading="{{pager.loading}}" load-all="{{pager.loadAll}}">
<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':''}} {{item.is_first_order?'is-new-order':''}}" >
class="item {{item.status==orderStatus.unpaid||item.status==orderStatus.completed?'no-btns':''}} {{item.is_first_order?'is-new-order':''}}">
<view class="item-head">
<view class="tag">代取快递</view>
<view class="deliver-time" wx:if="{{item.time_period_name}}">
送达时间(<label class="time">{{item.time_period_name}}</label>
</view>
</view>
<view class="station-list">
<view class="sl-item" wx:for="{{item.packages}}" wx:key="index" wx:for-item="pItem" wx:for-index="pIndex">
<view class="name">{{pItem.station_name}} {{pItem.pickup_codes.length}} 件</view>

View File

@ -42,11 +42,12 @@
gap: 14rpx;
font-size: 28rpx;
}
.nav-bar .loop-order-switch .switch{
width:84rpx;
}
.nav-bar .loop-order-switch .switch .wx-switch-input{
width:84rpx;
height: 48rpx;
--switch-checked-color:red;
--switch-node-size: 16rpx;
}
.head{
display: flex;
@ -112,16 +113,34 @@
}
.package-list{
}
.package-list .item{
margin:30rpx 16rpx;
background-color: #ffffff;
border-radius: 18rpx;
color: #555555;
padding:56rpx 20rpx 20rpx;
padding:20rpx;
position: relative;
}
.package-list .item .item-head{
display: flex;
align-items: center;
justify-content: space-between;
padding-bottom:50rpx;
}
.package-list .item .item-head .tag{
background-color: rgba(153, 153, 153, 0.1);
border-radius: 12rpx;
padding:16rpx 20rpx;
font-weight: 500;
color:#555555;
}
.package-list .item .item-head .deliver-time{
color:#222222;
}
.package-list .item .item-head .time{
color:#ff0000;
font-weight: 500;
}
.package-list .item:first-child{
margin-top:0;
}
@ -130,27 +149,9 @@
position: absolute;
width:1.2rpx;
background-color: rgba(85, 85, 85, 0.5);
left:38.5rpx;top:90rpx;
left:38.5rpx;top:160rpx;
bottom:250rpx;
}
.package-list .item.is-new-order::before{
top:145rpx;
}
.package-list .item.is-new-order{
padding-top:110rpx;
}
.package-list .item.is-new-order::after{
content:'新';
position: absolute;
right:24rpx;top:0;
width:58rpx;height:58rpx;
line-height: 52rpx;
background-color: #FF0000;
border-radius: 0px 0px 40rpx 40rpx;
text-align: center;
color: #fff;
font-weight: 500;
}
.package-list .item.no-btns::before{
bottom:100rpx;
}
@ -228,7 +229,18 @@
}
.package-list .item .address .sub-title{
font-size: 32rpx;
margin-top:24rpx
margin-top:24rpx;
display:flex;
align-items: center;
}
.package-list .item.is-new-order .address .sub-title::before{
content:'新';
background-color:#ff0000;
color:#fff;
font-size: 24rpx;
margin-right: 12rpx;
border-radius: 8rpx;
padding:6rpx 8rpx;
}
.package-list .item .btns{

View File

@ -9,7 +9,10 @@ Page({
data: {
phone:'',
password:'',
isAgree:false
logining:false,
isAgree:false,
isEyesOpen:false,
appConfig:{}
},
/**
* 生命周期函数--监听页面加载
@ -17,15 +20,26 @@ Page({
onLoad(options) {
this.validator = {
phone:{type:'phone',message:'请输入正确的手机号',shake:true,autoFocus:true},
password:{required:true,message:'请输入密码',shake:true,autoFocus:true}
password:{minLength:6,message:'请输入 6 位数密码',shake:true,autoFocus:true}
}
app.getAppConfig().then((data)=>{
this.setData({
appConfig:data
})
})
},
login(){
if(this.data.isAgree){
const valid = app.validateForm(this.validator,this);
console.log(valid,this.validator);
if(valid.length==0){
this.setData({
logining:true
})
userApi.login(this.data.phone,this.data.password).then((data)=>{
this.setData({
logining:false
})
app.globalData.userInfo = data.user;
app.globalData.accessToken = data.access_token;
wx.setStorage({
@ -37,10 +51,17 @@ Page({
})
}
})
}).catch(()=>{
console.log('catch');
this.setData({
logining:false
})
})
}
}else{
app.validateForm({
shake:{required:true,shake:true}
},this);
}
},
handleAgreeChange(event){
@ -48,6 +69,21 @@ Page({
isAgree:!!event.detail
})
},
toggleEyes(){
this.setData({
isEyesOpen:!this.data.isEyesOpen
})
},
navToAgreement(){
wx.navigateTo({
url: `/pages/browser/index?url=${this.data.appConfig.url_user_agreement}`,
})
},
navToPrivacy(){
wx.navigateTo({
url: `/pages/browser/index?url=${this.data.appConfig.url_user_privacy}`,
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/

View File

@ -1,19 +1,35 @@
<view class="login">
<view class="head">
<image src="/assets/img/login-bg.png" class="bg"/>
<view class="title">欢迎使用蜂快到家</view>
<image src="/assets/icon/logo.png" class="logo"/>
<view class="title">
欢迎使用
<image src="/assets/icon/fengkuai.png" class="t-logo" mode="heightFix"/>
</view>
</view>
<view class="input-area">
<input class="input" model:value="{{phone}}" placeholder="请输入手机号" animation="{{phoneAnimation}}" focus="{{phoneFocus}}"/>
<input class="input" model:value="{{password}}" type="password" animation="{{passwordAnimation}}" focus="{{passwordFocus}}" placeholder="请输入密码"/>
<button bind:tap="login" type="primary" class="button">登录</button>
<view class="input-container">
<input class="input" model:value="{{phone}}" placeholder="请输入手机号"
animation="{{phoneAnimation}}" focus="{{phoneFocus}}" placeholder-class="ph-class"/>
</view>
<view class="input-container">
<input class="input" model:value="{{password}}" placeholder="请输入密码"
animation="{{passwordAnimation}}" focus="{{passwordFocus}}"
placeholder-class="ph-class" password="{{!isEyesOpen}}"/>
<image src="{{isEyesOpen?'/assets/icon/eyes-open.png':'/assets/icon/eyes-close.png'}}" class="icon" bind:tap="toggleEyes"/>
</view>
<view class="forgot-pwd">
<navigator url="/pages/user/password/index" class="forgot">忘记密码</navigator>
</view>
<button bind:tap="login" type="primary" class="button" loading="{{logining}}"
disabled="{{logining}}">登录</button>
<radio-group bindchange="handleAgreeChange" class="agree">
<radio-group bindchange="handleAgreeChange" class="agree" animation="{{shakeAnimation}}">
<label class="policy">
<radio class="radio" value="agree"></radio>
<label>我已阅读并同意</label>
<label class="yellow">《用户协议》</label>与
<label class="yellow">《隐私政策》</label>
<label capture-catch:tap="navToAgreement" class="yellow">《用户协议》</label>与
<label capture-catch:tap="navToPrivacy" class="yellow">《隐私政策》</label>
</label>
</radio-group>
</view>

View File

@ -13,36 +13,76 @@
right:-40rpx;top:204rpx;
}
.login .head .title{
font-size: 46rpx;
font-size: 40rpx;
position: absolute;
left:40rpx;
bottom:144rpx;
font-weight: 500;
bottom:140rpx;
display: flex;
align-items: center;
}
.login .head .title .t-logo{
height: 36rpx;
margin-left: 10rpx;
}
.login .head .logo{
position: absolute;
width: 136rpx;height: 136rpx;
bottom:218rpx;left:54rpx;
}
.login .input-area{
border-radius: 30rpx 30rpx 0px 0px;
margin-top:-80rpx;
background-color: #fff;
position: relative;
padding:40rpx 50rpx;
padding:16rpx 50rpx 40rpx 50rpx;
}
.login .input-area .input{
.input-container{
display: flex;
align-items: center;
background-color:#F7F7F7;
border-radius: 18rpx;
margin-top:24rpx;
padding-left:30rpx;
}
.login .input-area .input{
height: 100rpx;
padding:0 30rpx;
margin-bottom:24rpx;
font-weight: 500;
font-size: 36rpx;
}
.login .input-area .ph-class{
font-weight: normal;
font-size: 32rpx;
}
.input-container .input{
flex: 1;
}
.input-container .icon{
width:44rpx;height:44rpx;
padding:20rpx;
}
.login .input-area .input.error{
background-color: rgb(252, 198, 198);
}
.login .input-area .forgot-pwd{
display:flex;
justify-content: flex-end;
}
.login .input-area .forgot{
color:#888888;
font-size:24rpx;
padding:30rpx 0 30rpx 30rpx;
}
.login .input-area .button{
margin-top:50rpx;
border-radius: 20rpx;
}
.agree{
font-size: 26rpx;
font-size: 28rpx;
margin-top:50rpx;
text-align: center;
}
.agree .yellow{
color:var(--main-color);

View File

@ -1,5 +1,5 @@
<scroll-view refresher-triggered="{{refreshTrigger}}" bindrefresherrefresh="getOrderDetail"
refresher-enabled scroll-y class="order-detail">
refresher-enabled scroll-y class="order-detail {{orderDetail.is_first_order?'is-new-order':''}}">
<view class="content">
<view class="page-container address-info">
<view class="title">
@ -8,8 +8,10 @@
{{orderDetail.address_detail}}
</view>
<view class="sub-title">
{{orderDetail.address_name}}
{{genderKV[orderDetail.address_gender]}}{{orderDetail.address_phone}}丨{{deliverStatusKV[orderDetail.delivery_method]}}
{{orderDetail.address_name}}{{genderKV[orderDetail.address_gender]}}{{orderDetail.address_phone}}丨{{deliverStatusKV[orderDetail.delivery_method]}}
</view>
<view class="deliver-time">
送达时间:<label class="time">{{orderDetail.time_period_name}}</label>
</view>
</view>
<view class="page-container station-info" wx:for="{{orderDetail.packages}}" wx:key="index">

View File

@ -11,7 +11,26 @@
.address-info .sub-title{
font-size: 32rpx;
margin-top:36rpx;
display:flex;
align-items: center;
}
.is-new-order .address-info .sub-title::before{
content:'新';
background-color:#ff0000;
color:#fff;
font-size: 24rpx;
margin-right: 12rpx;
border-radius: 8rpx;
padding:6rpx 8rpx;
}
.address-info .deliver-time{
margin-top:30rpx;
}
.address-info .deliver-time .time{
color: #ff0000;
font-weight: 500;
}
.station-info{
padding-bottom:0;
}
@ -123,6 +142,7 @@
margin: 0 auto;
text-align: center;
position: relative;
overflow:visible;
}
.steps .item .name{
font-size: 28rpx;

View File

@ -1,94 +0,0 @@
// pages/test/audio.js
Page({
/**
* 页面的初始数据
*/
data: {
time:0
},
gbam:null,
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
this.bgam = wx.getBackgroundAudioManager();
this.bgam.src = 'https://dman-1311994147.cos.ap-chengdu.myqcloud.com/static/empty.mp3';
this.bgam.title = '后台通知';
this.bgam.audioType = 'music';
this.bgam.coverImgUrl = 'https://dman-1311994147.cos.ap-chengdu.myqcloud.com/20250227/DoADoEhKi4U4ab75d180b27fa14b7c34ae7969762809_d7ee9018-828e-43c7-8b2b-29d4352c0277.jpg?imageMogr2/thumbnail/800x800/format/webp';
this.bgam.play();
this.bgam.onPlay();
this.bgam.onEnded(()=>{
console.log('end');
// this.bgam.src = 'https://dman-1311994147.cos.ap-chengdu.myqcloud.com/static/empty.mp3';
// this.bgam.play();
})
// const innerAudioContext = wx.createInnerAudioContext({
// useWebAudioImplement:true
// })
// innerAudioContext.src = '/assets/audio/order_complete.wav';
// innerAudioContext.play();
},
playAudio(){
setInterval(()=>{
this.setData({
time:this.data.time+1
});
},1000);
setInterval(()=>{
this.bgam.src = 'https://dman-1311994147.cos.ap-chengdu.myqcloud.com/static/new_order.mp3';
this.bgam.play();
},10000)
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})

View File

@ -1 +0,0 @@
<button bind:tap="playAudio" type="primary">play({{time}})</button>

View File

@ -1 +0,0 @@
/* pages/test/audio.wxss */

View File

@ -8,6 +8,7 @@ Page({
*/
data: {
phone:'',
isLogin:false,
verifyCode:'',
password:'',
rePassword:'',
@ -17,9 +18,12 @@ Page({
modifyLoading:false
},
validator:{
phone:{
type:'phone',autoFocus:true,shake:true,message:'请输入正确的手机号码'
},
verifyCode:[
{required:true,message:'请输入验证码',shake:true,autoFocus:true},
{length:6,message:'请输入 6 位数验证码',shake:true,autoFocus:true}
// {length:6,message:'请输入 6 位数验证码',shake:true,autoFocus:true}
],
password:{minLength:6,message:'请输入至少 6 位新密码',shake:true,autoFocus:true},
rePassword:{minLength:true,message:'请输入确认新密码',shake:true,autoFocus:true},
@ -29,11 +33,10 @@ Page({
* 生命周期函数--监听页面加载
*/
onLoad(options) {
app.getUserInfo().then((data)=>{
this.setData({
phone:data.phone
})
});
this.setData({
phone:app.globalData.userInfo?.phone||'',
isLogin:!!app.globalData.userInfo?.phone
})
let time = wx.getStorageSync('password-verify-code-time');
if(time){
let remainTime = app.verifyCodeWaitingTime*1000 - ((new Date()).getTime() - time);
@ -64,7 +67,6 @@ Page({
})
},
startTimer(){
console.log(this.data.waitingTime);
if(this.data.waitingTime<=0){
this.setData({
codeLoading:false,

View File

@ -1,7 +1,11 @@
<view class="cells">
<view class="cell">
<view class="cell-hd">手机号码</view>
<view class="cell-bd">{{phone}}</view>
<view class="cell-bd">
<input placeholder="请输入手机号码" model:value="{{phone}}" disabled="{{isLogin}}"
animation="{{phoneAnimation}}" focus="{{phoneFocus}}"/>
<view class="error">{{phoneMessage}}</view>
</view>
</view>
<view class="cell">
<view class="cell-hd">验证码</view>