dingdong-mall/pages/publish/publish-task.vue

514 lines
16 KiB
Vue
Raw Normal View History

2022-04-27 10:00:39 +08:00
<template>
<view>
<!-- 顶部操作条 -->
<cu-custom :bgColor="'bg-main-color'" :isBack="true">
<block slot="backText">返回</block>
<block slot="content">发布任务</block>
</cu-custom>
<!-- 步骤条 -->
<view class="bg-white padding">
<view class="cu-steps">
<view class="cu-item" :class="index>curStep?'':'text-main-color'" v-for="(stepName, index) in stepList">
<text class='cuIcon-radioboxfill'></text> {{stepName}}
</view>
</view>
</view>
<!-- 商品信息-->
<view v-if="curStep === 0">
<view class="bg-white margin-top-sm">
<form @submit="submitServInfo">
<view class="cu-form-group">
<view class="title"><text class="text-red">*</text>发布类目</view>
<input :value="formData.category.name" disabled></input>
<button class='cu-btn bg-main-color light shadow' @tap="showModal"
data-target="categoryModal">选择</button>
</view>
<view class="cu-form-group">
<view class="title"><text class="text-red">*</text>发布规格</view>
<input name="spec" type="text" placeholder="请输入规格,如200*300cm" :value="formData.spec"></input>
</view>
<view class="cu-form-group">
<view class="title"><text class="text-red">*</text>发布数量</view>
<uni-number-box :min="0" :value="formData.publishNum" @change="changePublishNum">
</uni-number-box>
</view>
<view class="cu-form-group">
<view class="title"><text class="text-red">*</text>期望价格</view>
<input name="expectPrice" type="digit" placeholder="请输入期望价格"
:value="formData.expectPrice"></input>
<text>参考价<text class="padding-left-xs text-price">100</text></text>
</view>
<view class="cu-form-group">
<view class="title"><text class="text-red">*</text>上门时间</view>
<uni-datetime-picker type="datetime" v-model="formData.doorTime" @change="changeDoorTime"
:clear-icon="false" />
</view>
<view class="cu-bar bg-white">
<view class="action">
上传图片
</view>
</view>
<view class="cu-form-group">
<view class="grid col-4 grid-square flex-sub img-grid">
<view class="bg-img" v-for="(item,index) in formData.imgList" :key="index"
@tap="viewImage($event, formData.imgList)" :data-url="item">
<image :src="item" mode="aspectFill"></image>
<view class="cu-tag bg-red" @tap.stop="delImg($event, formData.imgList)"
:data-index="index">
<text class='cuIcon-close'></text>
</view>
</view>
<view class="solids" @tap="chooseImage" v-if="formData.imgList.length<4">
<text class='cuIcon-cameraadd'></text>
</view>
</view>
</view>
<view class="cu-bar bg-white">
<view class="action">
备注说明
</view>
</view>
<view class="cu-form-group margin-bottom-with-bar">
<textarea class="solid radius" maxlength="-1" name="comments" :value="formData.comments"
placeholder="请输入商品的特殊要求或对师傅服务过程中的要求"></textarea>
</view>
<!-- 下一步 -->
<view class="cu-bar tabbar border shop fixed-bottom-bar">
<button class="bg-main-color long-btn margin-lr" form-type="submit">下一步</button>
</view>
</form>
</view>
</view>
<!-- 类目抽屉 -->
<view class="DrawerClose" :class="modalName=='categoryModal'?'show':''" @tap="hideModal">
<view class="cuIcon-roundcheckfill text-main-color" @click="chooseCategory"></view>
<view class="cuIcon-roundclosefill"></view>
</view>
<scroll-view scroll-y class="DrawerWindow bg-gray" :class="modalName=='categoryModal'?'show':''">
<vertical-nav :list="categoryList" :containerHeight="'calc(100vh - 200rpx)'"></vertical-nav>
</scroll-view>
<view v-if="curStep === 1">
<view class="margin-top-sm bg-white">
<view v-if="defaultAddress">
<view class="padding margin-lr-sm flex justify-between align-center" @click="showAddress2Choose">
<view>
<view class="flex justify-start align-center">
<view class="text-gray margin-right-xs" v-for="(areaObj, index) in defaultAddress.area">
{{areaObj.name}}
</view>
</view>
<view class="text-lg margin-tb-sm">{{defaultAddress.address}}</view>
<view class="text-gray">
<text class="margin-right">{{defaultAddress.person2Contact}}</text>
<text>{{defaultAddress.phone}}</text>
</view>
</view>
<view class="text-lg"><text class="text-bold text-gray cuIcon-right"></text></view>
</view>
<view class="cu-progress sm striped">
<view class="bg-orange" style="width: 100%;"></view>
</view>
</view>
<view v-else @click="showAddress2Choose">
<view class="flex justify-between align-center padding-lg">
<view class="text-lg text-black">
<text class="cuIcon-locationfill text-blue light"></text>
选择服务地址
</view>
<view class="text-lg">选择<text class="text-bold text-gray cuIcon-right"></text></view>
</view>
<view class="cu-progress sm striped">
<view class="bg-orange" style="width: 100%;"></view>
</view>
</view>
</view>
<view class="bg-white margin-top-sm margin-lr-sm margin-bottom-with-bar">
<form @submit="saveAndUseAddress">
<view class="cu-form-group">
<view class="title">联系人</view>
<input name="person2Contact" placeholder="请输入姓名"></input>
</view>
<view class="cu-form-group">
<view class="title">联系号码</view>
<input name="phone" placeholder="请输入联系号码"></input>
</view>
<view class="cu-form-group">
<view class="title">地址选择</view>
<picker :mode="'multiSelector'" @change="regionChange" @columnchange="regionColumnChange"
:value="multiIndex" :range-key="'name'" :range="areaList">
<view class="picker">
{{areaList[0][multiIndex[0]].name}}{{areaList[1][multiIndex[1]].name}}{{areaList[2][multiIndex[2]].name}}
</view>
</picker>
</view>
<view class="cu-form-group">
<view class="title">详细地址</view>
<input name="address" placeholder="请输入小区/写字楼"></input>
</view>
<view class="padding-tb">
<button class="bg-main-color margin-lr-sm" form-type="submit">保存地址</button>
</view>
<!-- <view class="cu-form-group margin-top">
<view class="title">默认地址</view>
<switch class="main-color radius" @change="isDefaultChange" :class="formData.isDefault?'checked':''"
:checked="formData.isDefault?true:false" name="isDefault" :value="formData.isDefault"></switch>
</view> -->
</form>
</view>
<!-- 底部操作栏 -->
<view class="cu-bar tabbar border shop fixed-bottom-bar">
<button class="bg-white long-btn margin-lr" @click="preStep">上一步</button>
<button class="bg-main-color long-btn margin-lr" @click="submitPublishOrder">提交订单</button>
</view>
</view>
<view v-if="curStep === 2">
<view class="bg-white margin-top-sm margin-bottom-with-bar">
<view class="padding-lg text-center">
<view class="text-price text-sl text-bold">{{formData.expectPrice}}</view>
<view class="text-gray">
{{formData.category.name}}/规格{{formData.spec}}({{formData.publishNum}})
</view>
</view>
<view class="margin-top-lg">
<radio-group @change="changePayWay" style="width: 100vw;">
<view class="cu-list menu">
<view class="cu-item text-lg flex justify-between">
<view class="cuIcon-moneybag padding-left text-main-color"><text
class="padding-left-sm text-black">在线支付</text></view>
<radio class="main-color" value="online" />
</view>
<view class="cu-item text-lg">
<view class="cuIcon-repair padding-left text-main-color"><text
class="padding-left-sm text-black">上门到付</text></view>
<radio class="main-color" value="offline" />
</view>
</view>
</radio-group>
</view>
</view>
<!-- 底部操作栏 -->
<view class="cu-bar tabbar border shop fixed-bottom-bar">
<button class="bg-white long-btn margin-lr" @click="preStep">上一步</button>
<button class="bg-main-color long-btn margin-lr" @click="nextStep">确认支付</button>
</view>
</view>
</view>
</template>
<script>
import verticalNav from '@/components/multi-level-nav/vertical-nav.vue';
export default {
components: {
verticalNav
},
data() {
return {
curStep: 0,
stepList: ['商品信息', '客户信息', '支付订单'],
modalName: null,
categoryList: [],
tmpCategory: {},
formData: {
imgList: [],
category: {}
},
defaultAddress: null,
areaList: [],
multiIndex: [0, 0, 0]
}
},
onLoad() {
this.loadData();
this.bindEvent();
},
onUnload() {
this.offBindEvent();
},
methods: {
async loadData() {
this.categoryList = await this.$api.data('categoryList');
this.areaList = await this.$api.data('areaList');
2022-06-27 17:30:14 +08:00
this.defaultAddress = await this.$api.data('defaultAddress');
uni.showToast({
title: '功能开发中,暂无法使用',
icon: 'none'
})
2022-04-27 10:00:39 +08:00
},
nextStep() {
this.curStep = this.curStep === this.stepList.length - 1 ? this.curStep : ++this.curStep
},
preStep() {
this.curStep = this.curStep === 0 ? 0 : --this.curStep
},
showModal(e) {
this.modalName = e.currentTarget.dataset.target;
},
hideModal(e) {
this.modalName = null
},
bindEvent() {
uni.$on(this.$globalFun.VERTICAL_NAV_GET_ITEM, this.tmpChooseCategory);
uni.$on(this.$globalFun.VERTICAL_NAV_SEARCH, this.searchCategory);
uni.$on(this.$globalFun.CHOOSE_ADDRESS, this.chooseAddress);
},
offBindEvent() {
uni.$off(this.$globalFun.VERTICAL_NAV_GET_ITEM);
uni.$off(this.$globalFun.VERTICAL_NAV_SEARCH);
uni.$off(this.$globalFun.CHOOSE_ADDRESS);
},
tmpChooseCategory(category) {
this.tmpCategory = category;
console.log("tmpCategory=" + JSON.stringify(category))
},
searchCategory(content) {
console.log("搜索[" + content + "]中......")
},
chooseCategory() {
this.formData.category = this.tmpCategory;
},
changePublishNum(value) {
this.formData.publishNum = value;
},
changeDoorTime(value) {
this.formData.doorTime = value;
},
viewImage(e, imgList) {
uni.previewImage({
urls: imgList,
current: e.currentTarget.dataset.url
});
},
delImg(e, imgList) {
uni.showModal({
title: '',
content: '确定要删除这张图片吗?',
cancelText: '取消',
confirmText: '确定',
success: res => {
if (res.confirm) {
imgList.splice(e.currentTarget.dataset.index, 1)
}
}
})
},
chooseImage(e) {
uni.chooseImage({
count: 4, //默认9
sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
sourceType: ['album'], //从相册选择
success: (res) => {
if (this.formData.imgList.length != 0) {
this.formData.imgList = this.formData.imgList.concat(res.tempFilePaths)
} else {
this.formData.imgList = res.tempFilePaths
}
}
});
},
regionChange(e) {
this.multiIndex = e.detail.value;
},
showAddress2Choose() {
uni.navigateTo({
url: '/pages/my/my-address?chooseMode=true'
})
},
chooseAddress(addressInfo) {
this.defaultAddress = addressInfo;
},
saveAndUseAddress(e) {
let addressInfo = e.detail.value;
let valid = this.validateAddress(addressInfo);
if (!valid) {
return;
}
let chosenArea = [];
for (let i = 0; i < this.areaList.length; i++) {
chosenArea.push(this.areaList[i][this.multiIndex[i]]);
}
console.log("chosenArea=" + JSON.stringify(chosenArea))
addressInfo.area = chosenArea;
// 调用后台保存并更新地址选择栏内容
this.defaultAddress = addressInfo;
},
submitServInfo(e) {
let formData = e.detail.value;
this.formData = Object.assign({}, this.formData, formData);
console.log(this.formData)
let valid = this.validateServInfo();
if (valid) {
this.nextStep();
} else {
uni.showToast({
title: '请填写必填项信息',
icon: 'none',
mask: true
})
}
},
submitPublishOrder() {
if (this.defaultAddress && Object.keys(this.defaultAddress).length > 0) {
this.nextStep();
} else {
uni.showToast({
title: '请选择服务地址',
icon: 'none',
mask: true
})
}
},
validateServInfo() {
if ((this.formData.category && Object.keys(this.formData.category).length > 0) &&
Boolean(this.formData.spec) &&
Boolean(this.formData.publishNum) &&
Boolean(this.formData.expectPrice) &&
Boolean(this.formData.doorTime)) {
return true
}
return false;
},
validateAddress(addressInfo) {
let valid = Boolean(addressInfo.person2Contact) &&
Boolean(addressInfo.phone) &&
Boolean(addressInfo.address);
if (!valid) {
uni.showToast({
title: '请填写完整信息',
icon: 'none',
mask: true
})
} else if (!this.$validate.validContactNum(addressInfo.phone)) {
valid = false;
uni.showToast({
title: '联系号码格式错误',
icon: 'none',
mask: true
})
}
return valid;
}
}
}
</script>
<style scoped>
.DrawerPage {
position: fixed;
width: 100vw;
height: 100vh;
left: 0vw;
background-color: #f1f1f1;
transition: all 0.4s;
}
.DrawerPage.show {
transform: scale(0.9, 0.9);
left: 85vw;
box-shadow: 0 0 60upx rgba(0, 0, 0, 0.2);
transform-origin: 0;
}
.DrawerWindow {
z-index: 9999;
position: absolute;
width: 85vw;
height: 100vh;
left: 0;
top: 0;
transform: scale(0.9, 0.9) translateX(-100%);
opacity: 0;
pointer-events: none;
transition: all 0.4s;
padding: 100upx 0;
}
.DrawerWindow.show {
transform: scale(1, 1) translateX(0%);
opacity: 1;
pointer-events: all;
}
.DrawerClose {
position: absolute;
width: 40vw;
height: 100vh;
right: 0;
top: 0;
color: transparent;
padding-bottom: 30upx;
display: flex;
flex-direction: column;
align-items: center;
justify-content: flex-end;
background-image: linear-gradient(90deg, rgba(0, 0, 0, 0.01), rgba(0, 0, 0, 0.6));
letter-spacing: 5px;
font-size: 60upx;
opacity: 0;
pointer-events: none;
transition: all 0.4s;
z-index: 9999;
}
.DrawerClose.show {
opacity: 1;
pointer-events: all;
width: 15vw;
color: #fff;
}
/* .DrawerPage .cu-bar.tabbar .action button.cuIcon {
width: 64upx;
height: 64upx;
line-height: 64upx;
margin: 0;
display: inline-block;
}
.DrawerPage .cu-bar.tabbar .action .cu-avatar {
margin: 0;
}
.DrawerPage .nav {
flex: 1;
}
.DrawerPage .nav .cu-item.cur {
border-bottom: 0;
position: relative;
}
.DrawerPage .nav .cu-item.cur::after {
content: "";
width: 10upx;
height: 10upx;
background-color: currentColor;
position: absolute;
bottom: 10upx;
border-radius: 10upx;
left: 0;
right: 0;
margin: auto;
}
.DrawerPage .cu-bar.tabbar .action {
flex: initial;
} */
.cu-form-group.img-grid {
border: none;
}
.cu-progress {
display: inherit;
}
.cu-progress.sm {
height: 12rpx;
}
</style>