| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552 |
- <template>
- <view class="flex-common-css iPhone-bottom box-border-box">
- <Nav title="跑腿代拿" leftIconColor="#333" titleColor="#333"></Nav>
- <scroll-view :scroll-y="true" class="scroll-view-css box-border-box p-24">
- <view class="box-border-box mb-20">
- <uni-swiper-dot :info="bannerList" mode="dot" :dotsStyles="dotStyle" :current="current">
- <swiper class="swiper" @change="change" :autoplay='true' :circular='true' interval="4000">
- <swiper-item v-for="(item,i) in bannerList" :key="i">
- <image class="swiper-item" :src="item.image" mode="aspectFill">
- </image>
- </swiper-item>
- </swiper>
- </uni-swiper-dot>
- </view>
- <view class="align-items-center p-16 box-border-box b-rad-20 bgc-f mb-20">
- <view class="flex-1 flex-direction align-items-center b-rad-20 ptb-15" v-for="(item,index) in serveData"
- :key="index" @click="serveClick(item)"
- :class="formData.errands_id === item.errands_id?'bgc-BCEAFF':'bgc-f'">
- <image class="item-img mb-8 b-rad-16" :src="item.img" mode=""></image>
- <view class="text-align-center fs-26">
- {{item.name}}
- </view>
- </view>
- </view>
- <view class="form-box bgc-f b-rad-16 p-20 box-border-box">
- <view class="align-items-flex-start mb-20">
- <view class="fs-26 fc-3 mr-20 flex-shrink0 pt-15">
- <text class="fc-ff3939">*</text>服务描述 :
- </view>
- <view class="textarea-box flex-1 bgc-F6F6F6 b-rad-16">
- <textarea class="textarea" v-model="formData.serve_desc" maxlength='50'
- :placeholder="errandsData.desc" />
- <view class="fs-24 fc-6 tj-num">
- {{formData.serve_desc.length}}/50
- </view>
- </view>
- </view>
- <view class="align-items-flex-start mb-20">
- <view class="fs-26 fc-3 mr-20 flex-shrink0 pt-15">
- 图片介绍 :
- </view>
- <view class="up-img-box align-items-center flex-wrap-wrap">
- <view class="up-img" v-for="(item, index) in formData.images" :key="index">
- <image class="img" :src="item" mode="aspectFill"></image>
- <uni-icons @click="deleteImg(index)" class="delete-icons" color="#000" type="clear"
- size="20"></uni-icons>
- </view>
- <view @click="upImg" v-if="formData.images.length<= 5"
- class="add-img-box flex-direction flex-justify-center align-items-center bgc-F6F6F6">
- <image class="add-img" src="@/static/img/my/sc.png" mode=""></image>
- <view class="fs-20 fc-9">
- 上传照片
- </view>
- <view class="fs-20 fc-9">
- (最多6张)
- </view>
- </view>
- </view>
- </view>
- <view class="align-items-flex-start mb-20">
- <view class="fs-26 fc-3 mr-20 flex-shrink0 pt-15">
- <text class="fc-ff3939">*</text>服务地址 :
- </view>
- <view class="textarea-box flex-1 bgc-F6F6F6 b-rad-16">
- <textarea class="textarea" cursor-spacing='30' v-model="formData.serve_address" maxlength='50'
- :placeholder="errandsData.add_str" />
- <view class="fs-24 fc-6 tj-num">
- {{formData.serve_address.length}}/50
- </view>
- </view>
- </view>
- <view class="align-items-center ptb-24 b-b-EFF2F5 mb-20" @click="openAddress">
- <view class="fs-26 fc-3 mr-20 flex-shrink0">
- <text class="fc-ff3939" v-if="errandsData.errands_id != 4">*</text>送达地址 :
- </view>
- <view class="text-overflow-ellipsis-one fs-26" :class="formData.address_id?'fc-0':'fc-9'">
- {{formData.address_id?addressData.school_name + addressData.dorm_name + addressData.address :'选择地址'}}
- </view>
- </view>
- <view class="align-items-center ptb-24 b-b-EFF2F5 mb-20" @click="openTime">
- <view class="fs-26 fc-3 mr-20 flex-shrink0">
- <text class="fc-ff3939">*</text>{{errandsData.time_str}} :
- </view>
- <view class="text-overflow-ellipsis-one fs-26" :class="deliverText?'fc-0':'fc-9'">
- {{deliverText?'预计'+ deliverText+ '送达':'选择'+ errandsData.time_str}}
- </view>
- </view>
- <view class="align-items-center ptb-24 b-b-EFF2F5 mb-20" @click="openItem"
- v-if="errandsData.item && errandsData.item.length>0">
- <view class="fs-26 fc-3 mr-20 flex-shrink0">
- <text class="fc-ff3939">*</text>{{errandsData.item_name}} :
- </view>
- <view class="text-overflow-ellipsis-one fs-26" :class="itemData.item_id?'fc-0':'fc-9'">
- {{itemData.item_id?itemData.name:'选择'+ errandsData.item_name}}
- </view>
- </view>
- <view class="align-items-center ptb-24 b-b-EFF2F5 mb-20">
- <view class="fs-26 fc-3 mr-20 flex-shrink0">
- <text class="fc-ff3939">*</text>是否上楼 :
- </view>
- <view class="fs-26 align-items-center">
- <view class="align-items-center mr-50" @click="isUpClick(0)">
- <uni-icons class="mr-10" v-if="formData.is_up === 0" type="checkbox-filled" size="22"
- color="#4495FD"></uni-icons>
- <uni-icons class="mr-10" v-else type="circle" size="22" color="#000"></uni-icons>
- <view class="fs-28 mr-10">
- 否
- </view>
- <view class="fs-28">
- (0元)
- </view>
- </view>
- <view class="align-items-center" @click="isUpClick(1)">
- <uni-icons class="mr-10" v-if="formData.is_up === 1" type="checkbox-filled" size="22"
- color="#4495FD"></uni-icons>
- <uni-icons class="mr-10" v-else type="circle" size="22" color="#000"></uni-icons>
- <view class="fs-28 mr-10">
- 是
- </view>
- <view class="fs-28 mr-10 fc-FB3D03">
- ¥{{errandsData.up_price}}
- </view>
- </view>
- </view>
- </view>
- <view class="align-items-center ptb-24 b-b-EFF2F5 mb-20">
- <view class="fs-26 fc-3 mr-20 flex-shrink0">
- 打赏金额 :
- </view>
- <view class="">
- <input v-model="formData.reward_money" type="digit" cursor-spacing='20' class="uni-input"
- placeholder="自定义金额 0~1000" @blur="amountNum" @input="handleInput" />
- </view>
- </view>
- </view>
- </scroll-view>
- <view class="bgc-f b-t-F9F9F9 plr-24 box-border-box">
- <view class="but-box align-items-center box-border-box flex-justify-space b-rad-200">
- <view class="but-left align-items-center flex-1 bgc-3 pl-24 box-border-box" @click="openPop">
- <view class="fs-32 fc-FB4845 mr-20 fw-600">
- ¥ {{amount}}
- </view>
- <view class="fs-24 fc-f">
- (点击展开明细)
- </view>
- </view>
- <view class="but bgc-5CC2FF fs-26 fc-f text-align-center" @click.stop="goToUrl">
- 去下单
- </view>
- </view>
- </view>
- <uni-popup ref="popup" type="bottom" border-radius="10px 10px 0 0" background-color="#fff"
- :is-mask-click="false">
- <view class="pop-box box-border-box">
- <uni-icons @click="closePop" class="box-close" type="closeempty" size="20"></uni-icons>
- <view class="bgc-f p-24 box-border-box">
- <view class="fs-34 fw-600 mb-20">
- 费用明细
- </view>
- <view class="align-items-center flex-justify-space mb-20">
- <view class="fs-28 fc-6">
- 基础服务费
- </view>
- <view class="fs-28 fc-0">
- ¥ {{errandsData.price}}
- </view>
- </view>
- <view class="align-items-center flex-justify-space mb-20">
- <view class="fs-28 fc-6">
- {{errandsData.item_name}}加价
- </view>
- <view class="fs-28 fc-0">
- ¥ {{itemData.price?itemData.price:'0.00'}}
- </view>
- </view>
- <view class="align-items-center flex-justify-space mb-20">
- <view class="fs-28 fc-6">
- 上楼加价
- </view>
- <view class="fs-28 fc-0">
- ¥ {{formData.is_up === 1?errandsData.up_price:'0.00'}}
- </view>
- </view>
- <view class="align-items-center flex-justify-space">
- <view class="fs-28 fc-6">
- 打赏金额
- </view>
- <view class="fs-28 fc-0">
- ¥ {{formData.reward_money?(Number(formData.reward_money)).toFixed(2):'0.00'}}
- </view>
- </view>
- </view>
- <view class="p-20 box-border-box bgc-f b-t-F9F9F9">
- <view class="but-box align-items-center box-border-box flex-justify-space b-rad-200">
- <view class="but-left align-items-center flex-1 bgc-3 pl-24 box-border-box" @click="closePop">
- <view class="fs-32 fc-FB4845 mr-20 fw-600">
- ¥ {{amount}}
- </view>
- </view>
- <view class="but bgc-5CC2FF fs-26 fc-f text-align-center" @click.stop="goToUrl">
- 去下单
- </view>
- </view>
- </view>
- </view>
- </uni-popup>
- <selectAddressVue ref="selectAddress" @giveAddress='giveAddress'></selectAddressVue>
- <timeVue ref="selectTime" @giveTime='giveTime' @timeAndType='timeAndType'></timeVue>
- <selectModVue ref="selectModRef" @selectData='selectData' :popTitleName='errandsData.item_name'></selectModVue>
- </view>
- </template>
- <script>
- import selectAddressVue from './confirm-mod/select-address.vue';
- import timeVue from './confirm-mod/time.vue';
- import selectModVue from './run-errands-mod/select-mod.vue';
- import {
- getAddressDefault
- } from '@/api/member.js'
- import {
- errandsBanner,
- errandsServe,
- errandsCreate
- } from "@/api/errands.js"
- import tools from '@/service/tools';
- import {
- upLoadingFileOss
- } from "@/service/upLoadingFile.js"
- export default {
- components: {
- selectAddressVue,
- timeVue,
- selectModVue
- },
- data() {
- return {
- bannerList: [],
- dotStyle: {
- width: 6,
- bottom: 6,
- backgroundColor: 'rgba(51, 51, 51,0.3)',
- border: '1px rgba(0,0,0,0) solid',
- color: '#fff',
- selectedBackgroundColor: 'rgba(79, 179, 239,0.9)',
- selectedBorder: '1px rgba(0,0,0,0) solid'
- },
- current: 0,
- serveData: [], // 类型
- errandsData: {}, // 类型对应的数据
- formData: {
- errands_id: 0,
- serve_desc: '',
- serve_address: '',
- images: [],
- address_id: '',
- time_type: '',
- serve_time: '',
- item_id: 0,
- is_up: 0,
- reward_money: ''
- },
- deliverText: '',
- addressData: {},
- itemData: {},
- amount: '0.00',
- };
- },
- onShow() {
- let isConfirmAddressFlag = uni.getStorageSync('isConfirmAddressFlag');
- if (isConfirmAddressFlag.flag) {
- this.openAddress(isConfirmAddressFlag);
- }
- },
- onHide() {
- uni.removeStorageSync('isConfirmAddressFlag');
- },
- onUnload() {
- uni.removeStorageSync('isConfirmAddressFlag');
- },
- onLoad(data) {
- this.getAddressDefault();
- },
- mounted() {
- this.getBanner()
- this.getErrandsServe()
- },
- methods: {
- goToUrl() {
- errandsCreate(this.formData).then((res) => {
- if (res.code === 1) {
- uni.redirectTo({
- url: `/pages-takeout/run-errands-mod/pay-page?orderId=${res.data.order_id}`
- });
- } else {
- tools.error(res.msg)
- }
- })
- },
- isUpClick(num) {
- this.formData.is_up = num
- this.amountNum()
- },
- handleInput(event) {
- let value = event.detail.value;
- // 只允许数字和小数点
- value = value.replace(/[^0-9.]/g, '');
- // 禁止输入多个小数点
- const parts = value.split('.'); // 按小数点分割字符串
- if (parts.length > 2) { // 如果小数点数量超过1个
- value = parts[0] + '.' + parts.slice(1).join(''); // 只保留第一个小数点
- }
- // 限制小数位数最多为1位
- if (parts.length === 2 && parts[1].length > 1) {
- value = parts[0] + '.' + parts[1].charAt(0); // 只保留第一位小数
- tools.error('金额只会保留一位小数')
- }
- // 禁止以0开头的多个0(例如:001 -> 1)
- value = value.replace(/^0+(\d+)/, '$1');
- // 更新输入框的值
- this.formData.reward_money = value;
- // 手动触发 input 事件,确保 v-model 更新
- this.$nextTick(() => {
- event.target.value = value; // 更新输入框的实际值
- });
- },
- amountNum() {
- this.amount = 0
- if (this.errandsData.price) {
- this.amount = (Number(this.amount) + Number(this.errandsData.price)).toFixed(2)
- }
- if (this.itemData.price) {
- this.amount = (Number(this.amount) + Number(this.itemData.price)).toFixed(2)
- }
- if (this.formData.is_up === 1) {
- this.amount = (Number(this.amount) + Number(this.errandsData.up_price)).toFixed(2)
- }
- if (this.formData.reward_money) {
- this.amount = (Number(this.amount) + Number(this.formData.reward_money)).toFixed(2)
- }
- },
- openPop() {
- this.$refs.popup.open()
- },
- closePop() {
- this.$refs.popup.close()
- },
- selectData(item) {
- if (item) {
- this.itemData = item
- this.formData.item_id = item.item_id
- this.amountNum()
- }
- },
- openItem() {
- this.$refs.selectModRef.getList(this.formData.item_id, this.errandsData.item);
- },
- openTime() {
- // 选择时间
- this.$refs.selectTime.getList(0, this.errandsData.time);
- },
- timeAndType(type, time) {
- // 时间选择
- this.formData.time_type = type
- this.formData.serve_time = time
- if (type == 1) {
- this.deliverText = '今天' + time
- } else {
- this.deliverText = '明天' + time
- }
- console.log(type, time, '&&&&&&&&&&&&&&&&&&&&&&&&');
- },
- giveTime(e) {
- console.log(e);
- },
- openAddress(addressData) {
- // 选择地址
- if (this.addressData.id) {
- this.$refs.selectAddress.id = this.addressData.id;
- }
- if (addressData && addressData.is_default == 1) {
- this.$refs.selectAddress.id = addressData.id;
- this.$refs.selectAddress.getList(addressData.id);
- } else {
- this.$refs.selectAddress.getList();
- }
- },
- // 获取默认地址
- getAddressDefault() {
- getAddressDefault().then((res) => {
- if (res.code === 1) {
- this.addressData = res.data
- if (this.addressData.id) {
- this.formData.address_id = this.addressData.id;
- }
- }
- })
- },
- giveAddress(e) {
- this.addressData = e;
- this.formData.address_id = this.addressData.id;
- },
- deleteImg(index) {
- this.formData.images.splice(index, 1)
- },
- upImg() {
- uni.chooseImage({
- count: 6,
- sizeType: ["compressed", "camera"],
- sourceType: ["album", "camera"],
- success: (res) => {
- res.tempFiles.forEach((file) => {
- this.uploadingFile(file);
- })
- }
- })
- },
- uploadingFile(file) {
- upLoadingFileOss(file.path).then((res) => {
- if (res) {
- this.formData.images.push(res)
- } else {
- tools.error('图片上传失败')
- }
- })
- },
- serveClick(item) {
- if (this.formData.errands_id === item.errands_id) {
- return
- }
- this.formData.errands_id = item.errands_id
- this.errandsData = item
- this.itemData = {}
- this.deliverText = ''
- this.amountNum()
- },
- getBanner() {
- errandsBanner().then((res) => {
- if (res.code === 1) {
- this.bannerList = res.data;
- }
- })
- },
- getErrandsServe() {
- errandsServe().then((res) => {
- if (res.code === 1) {
- this.serveData = res.data
- this.formData.errands_id = this.serveData[0].errands_id
- this.errandsData = this.serveData[0]
- this.amountNum()
- }
- })
- },
- change(e) {
- this.current = e.detail.current
- },
- },
- }
- </script>
- <style lang="scss" scoped>
- .pop-box {
- position: relative;
- }
- .box-close {
- position: absolute;
- top: 24rpx;
- right: 22rpx;
- }
- .swiper {
- width: 702rpx;
- height: 280rpx;
- border-radius: 20rpx;
- .swiper-item {
- width: 702rpx;
- height: 280rpx;
- border-radius: 20rpx;
- }
- }
- .item-img {
- width: 60rpx;
- height: 60rpx;
- }
- .up-img {
- width: 150rpx;
- height: 150rpx;
- margin: 0 8rpx 8rpx 0;
- position: relative;
- .img {
- width: 100%;
- height: 100%;
- border-radius: 10rpx;
- }
- .delete-icons {
- position: absolute;
- right: 0;
- top: 0;
- }
- }
- .textarea-box {
- height: 150rpx;
- position: relative;
- }
- .tj-num {
- position: absolute;
- right: 10rpx;
- bottom: 10rpx;
- }
- .textarea {
- width: 100%;
- height: 100%;
- padding: 20rpx;
- box-sizing: border-box;
- }
- .add-img-box {
- width: 150rpx;
- height: 150rpx;
- border: 1px dashed #666;
- .add-img {
- width: 36rpx;
- height: 36rpx;
- }
- }
- .but-box {
- height: 80rpx;
- }
- .but-left {
- height: 100%;
- line-height: 80rpx;
- border-radius: 200rpx 0 0 200rpx;
- }
- .but {
- width: 180rpx;
- height: 100%;
- line-height: 80rpx;
- border-radius: 0 200rpx 200rpx 0;
- }
- </style>
|