Commit 7b66c349a9fa1be581853b3a56cd9b4850afff2f
1 parent
70490f92
改变文件上传,用安卓原生拍照
Showing
17 changed files
with
1998 additions
and
1327 deletions
garbage-removal/.env.local
garbage-removal/package-lock.json
| ... | ... | @@ -33,6 +33,7 @@ |
| 33 | 33 | "sass": "1.58.3", |
| 34 | 34 | "sass-loader": "13.2.0", |
| 35 | 35 | "uqrcodejs": "^4.0.7", |
| 36 | + "vconsole": "^3.15.1", | |
| 36 | 37 | "vue": "^3.2.45", |
| 37 | 38 | "vue-i18n": "^9.1.9", |
| 38 | 39 | "vue3-qr-reader": "^1.0.0" |
| ... | ... | @@ -5400,6 +5401,17 @@ |
| 5400 | 5401 | "dev": true, |
| 5401 | 5402 | "license": "MIT" |
| 5402 | 5403 | }, |
| 5404 | + "node_modules/copy-text-to-clipboard": { | |
| 5405 | + "version": "3.2.0", | |
| 5406 | + "resolved": "https://registry.npmmirror.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz", | |
| 5407 | + "integrity": "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==", | |
| 5408 | + "engines": { | |
| 5409 | + "node": ">=12" | |
| 5410 | + }, | |
| 5411 | + "funding": { | |
| 5412 | + "url": "https://github.com/sponsors/sindresorhus" | |
| 5413 | + } | |
| 5414 | + }, | |
| 5403 | 5415 | "node_modules/core-js": { |
| 5404 | 5416 | "version": "3.33.2", |
| 5405 | 5417 | "resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.33.2.tgz", |
| ... | ... | @@ -9293,6 +9305,11 @@ |
| 9293 | 9305 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", |
| 9294 | 9306 | "license": "MIT" |
| 9295 | 9307 | }, |
| 9308 | + "node_modules/mutation-observer": { | |
| 9309 | + "version": "1.0.3", | |
| 9310 | + "resolved": "https://registry.npmmirror.com/mutation-observer/-/mutation-observer-1.0.3.tgz", | |
| 9311 | + "integrity": "sha512-M/O/4rF2h776hV7qGMZUH3utZLO/jK7p8rnNgGkjKUw8zCGjRQPxB8z6+5l8+VjRUQ3dNYu4vjqXYLr+U8ZVNA==" | |
| 9312 | + }, | |
| 9296 | 9313 | "node_modules/nanoid": { |
| 9297 | 9314 | "version": "3.3.7", |
| 9298 | 9315 | "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz", |
| ... | ... | @@ -11328,6 +11345,17 @@ |
| 11328 | 11345 | "node": ">= 0.8" |
| 11329 | 11346 | } |
| 11330 | 11347 | }, |
| 11348 | + "node_modules/vconsole": { | |
| 11349 | + "version": "3.15.1", | |
| 11350 | + "resolved": "https://registry.npmmirror.com/vconsole/-/vconsole-3.15.1.tgz", | |
| 11351 | + "integrity": "sha512-KH8XLdrq9T5YHJO/ixrjivHfmF2PC2CdVoK6RWZB4yftMykYIaXY1mxZYAic70vADM54kpMQF+dYmvl5NRNy1g==", | |
| 11352 | + "dependencies": { | |
| 11353 | + "@babel/runtime": "^7.17.2", | |
| 11354 | + "copy-text-to-clipboard": "^3.0.1", | |
| 11355 | + "core-js": "^3.11.0", | |
| 11356 | + "mutation-observer": "^1.0.3" | |
| 11357 | + } | |
| 11358 | + }, | |
| 11331 | 11359 | "node_modules/vite": { |
| 11332 | 11360 | "version": "4.0.3", |
| 11333 | 11361 | "resolved": "https://registry.npmmirror.com/vite/-/vite-4.0.3.tgz", | ... | ... |
garbage-removal/package.json
garbage-removal/src/apis/common.js
| ... | ... | @@ -6,7 +6,7 @@ export const uploadFilePromise = async (requestPath, url) => { |
| 6 | 6 | return new Promise((resolve, reject) => { |
| 7 | 7 | let a = uni.uploadFile({ |
| 8 | 8 | url: requestPath, // 仅为示例,非真实的接口地址 |
| 9 | - filePath: url, | |
| 9 | + file: url, | |
| 10 | 10 | name: 'file', |
| 11 | 11 | header: { |
| 12 | 12 | "Authorization": store.token | ... | ... |
garbage-removal/src/main.js
| ... | ... | @@ -4,6 +4,7 @@ import * as Pinia from 'pinia'; |
| 4 | 4 | import piniaPersistUni from "pinia-plugin-persist-uni"; |
| 5 | 5 | import { createSSRApp } from "vue"; |
| 6 | 6 | import mixin from './common/mixin'; |
| 7 | +import Vconsole from 'vconsole' | |
| 7 | 8 | |
| 8 | 9 | // 引入uView对小程序分享的mixin封装 |
| 9 | 10 | import mpShare from '@/uview-plus/libs/mixin/mpShare.js'; |
| ... | ... | @@ -52,6 +53,7 @@ export function createApp() { |
| 52 | 53 | // 配置uView |
| 53 | 54 | // 调用setConfig方法,方法内部会进行对象属性深度合并,可以放心嵌套配置 |
| 54 | 55 | // 需要在app.use(uview-plus)之后执行 |
| 56 | + new Vconsole(); | |
| 55 | 57 | uni.$u.setConfig({ |
| 56 | 58 | // 修改$u.config对象的属性 |
| 57 | 59 | config: { | ... | ... |
garbage-removal/src/pages.json
garbage-removal/src/pages/home-info/clean/index.vue
| 1 | 1 | <template> |
| 2 | - <view id="ccccccccccccc"> | |
| 3 | - <scroll-view :scroll-top="scrollTop" scroll-y="true"> | |
| 4 | - <view class="mask-box"> | |
| 5 | - <address-popup ref="addressPopupRef" @currentChange="currentChange"></address-popup> | |
| 6 | - <liu-delivery-time :isMask="true" :change="changeTime" ref="chooseTime" title="请选择预约时间"> | |
| 7 | - </liu-delivery-time> | |
| 8 | - </view> | |
| 9 | - <view class="company-clean-container"> | |
| 10 | - | |
| 11 | - <view class="company-clean-container-box"> | |
| 12 | - <view class="company-clean-container-header"> | |
| 13 | - <view class="company-clean-container-header-address"> | |
| 14 | - {{ userAddress.garUserAddress }}{{ userAddress.garRemark }} | |
| 15 | - </view> | |
| 16 | - <view class="company-clean-container-header-base-info"> | |
| 17 | - <view class="company-clean-container-header-base-info-left"> | |
| 18 | - {{ userAddress.garUserContactName }} {{ userAddress.garUserContactTel }} | |
| 19 | - </view> | |
| 20 | - <view class="company-clean-container-header-base-info-right"> | |
| 21 | - <view class="company-clean-container-header-base-info-right-icon"> | |
| 22 | - <image width="35" height="35" :src="changeAddressUrl" @click="handlerChooseAddress"></image> | |
| 23 | - </view> | |
| 24 | - </view> | |
| 25 | - </view> | |
| 26 | - <view @click.stop="handleTimeChoose" class="company-clean-container-header-reservation"> | |
| 27 | - <view class="company-clean-container-header-reservation-left"> | |
| 28 | - <text style="color: red;">*</text> <u-icon name="calendar" size="40"></u-icon>预约时间 | |
| 29 | - </view> | |
| 30 | - <view class="company-clean-container-header-reservation-right"> | |
| 31 | - <text style="margin-right: 10rpx;">{{ dayTime ? dayTime : "请选择时间" }}</text> <u-icon name="arrow-right" | |
| 32 | - size="25"></u-icon> | |
| 33 | - </view> | |
| 34 | - </view> | |
| 35 | - </view> | |
| 36 | - | |
| 37 | - <view class="company-clean-container-car-main"> | |
| 38 | - <view class="company-clean-container-car-main-content"> | |
| 39 | - <view class="company-clean-container-car-main-content-type"> | |
| 40 | - <view class="company-clean-container-car-main-content-type-price-area"> | |
| 41 | - <text style="color: red;">*</text>选择车型: {{carName}} | |
| 42 | - </view> | |
| 43 | - </view> | |
| 44 | - | |
| 45 | - <view> | |
| 46 | - <swiper :class="swiperClass" @change="onChangeSwiper" indicator-dots circular="true" easing-function="linear" duration="2000"> | |
| 47 | - <swiper-item v-for="(car,index) in garCarInfoList" :key="index" > | |
| 48 | - <view><image :src="combinationImagePath(car)" mode ="widthFix"></image></view> | |
| 49 | - <view><text style="color:#909399;font-size: 14px;">{{car.remark}}</text></view> | |
| 50 | - </swiper-item> | |
| 51 | - </swiper> | |
| 52 | - </view> | |
| 53 | - | |
| 54 | - <view class="company-clean-container-car-main-content-type"> | |
| 55 | - <view class="company-clean-container-car-main-content-type-price-area"> | |
| 56 | - <text style="color: red;">*</text>车辆容积: | |
| 57 | - </view> | |
| 58 | - <view style=" width:100%;display:flex; color:#909399; align-items: center;"> | |
| 59 | - <text>{{containerVolume}} 方</text> | |
| 60 | - </view> | |
| 61 | - </view> | |
| 62 | - | |
| 63 | - <view class="company-clean-container-car-main-content-type"> | |
| 64 | - <view class="company-clean-container-car-main-content-type-price-area"> | |
| 65 | - <text style="color: red;">*</text>添加车辆数量: | |
| 66 | - </view> | |
| 67 | - <view style=" width:100%;display:flex; color:#909399; align-items: center;"> | |
| 68 | - <u-number-box :min="0" :max="9999" integer buttonSize="46" :inputWidth="100" :disabledInput="true" v-model="carNumber[swiperIndex]" @change="numberBoxChange"></u-number-box> | |
| 69 | - </view> | |
| 70 | - </view> | |
| 71 | - | |
| 72 | - | |
| 73 | - <view class="company-clean-container-car-main-content-type"> | |
| 74 | - <view class="company-clean-container-car-main-content-type-price-area"> | |
| 75 | - <text style="color: red;">*</text>垃圾类型: | |
| 76 | - </view> | |
| 77 | - <view style=" width:100%;display:flex; color:#909399; align-items: center;"> | |
| 78 | - <myPiker :parentValue="paramFrom.garbageType" :title="'垃圾类型'" @change="handlePickerGarbageTypeConfirm" | |
| 79 | - :array="garbageTypeList"> | |
| 80 | - </myPiker> | |
| 81 | - </view> | |
| 82 | - </view> | |
| 83 | - | |
| 84 | - | |
| 85 | - <view class="company-clean-container-car-main-content-type"> | |
| 86 | - <view class="company-clean-container-car-main-content-type-price-area"> | |
| 87 | - <text style="color: red;">*</text>进入地下车库: | |
| 88 | - </view> | |
| 89 | - <view style="width:100%;display: flex;justify-content: flex-start;align-items: center; "> | |
| 90 | - <view style="display: flex; align-items: center;"> | |
| 91 | - <up-radio-group shape="square" size="34" v-model="paramFrom.garInCarStore" placement="row" | |
| 92 | - @change="handleInCarClick"> | |
| 93 | - <up-radio activeColor="#19a97c" labelSize="32" iconSize="30" :customStyle="{ marginRight: '30rpx' }" label="需要" | |
| 94 | - :name="true"> | |
| 95 | - </up-radio> | |
| 96 | - <up-radio activeColor="#19a97c" labelSize="32" iconSize="30" :customStyle="{ marginRight: '30rp' }" label="不需要" | |
| 97 | - :name="false"> | |
| 98 | - </up-radio> | |
| 99 | - </up-radio-group> | |
| 100 | - </view> | |
| 101 | - </view> | |
| 102 | - </view> | |
| 103 | - <view v-if="paramFrom.garInCarStore" class="company-in-car-store-box-info"> | |
| 104 | - <view class="company-clean-container-site-image-info-input-remark-box"> | |
| 105 | - <u--textarea v-model="paramFrom.remark" placeholder="请填写限制高度(米)"></u--textarea> | |
| 106 | - </view> | |
| 107 | - <!-- <view class="company-clean-container-car-main-content-remark" style="margin-top: 20rpx; font-size: 23rpx;"> | |
| 2 | + <view id="ccccccccccccc"> | |
| 3 | + <scroll-view :scroll-top="scrollTop" scroll-y="true"> | |
| 4 | + <view class="mask-box"> | |
| 5 | + <address-popup ref="addressPopupRef" @currentChange="currentChange"></address-popup> | |
| 6 | + <liu-delivery-time :isMask="true" :change="changeTime" ref="chooseTime" title="请选择预约时间"> | |
| 7 | + </liu-delivery-time> | |
| 8 | + </view> | |
| 9 | + <view class="company-clean-container"> | |
| 10 | + | |
| 11 | + <view class="company-clean-container-box"> | |
| 12 | + <view class="company-clean-container-header"> | |
| 13 | + <view class="company-clean-container-header-address"> | |
| 14 | + {{ userAddress.garUserAddress }}{{ userAddress.garRemark }} | |
| 15 | + </view> | |
| 16 | + <view class="company-clean-container-header-base-info"> | |
| 17 | + <view class="company-clean-container-header-base-info-left"> | |
| 18 | + {{ userAddress.garUserContactName }} {{ userAddress.garUserContactTel }} | |
| 19 | + </view> | |
| 20 | + <view class="company-clean-container-header-base-info-right"> | |
| 21 | + <view class="company-clean-container-header-base-info-right-icon"> | |
| 22 | + <image width="35" height="35" :src="changeAddressUrl" @click="handlerChooseAddress"> | |
| 23 | + </image> | |
| 24 | + </view> | |
| 25 | + </view> | |
| 26 | + </view> | |
| 27 | + <view @click.stop="handleTimeChoose" class="company-clean-container-header-reservation"> | |
| 28 | + <view class="company-clean-container-header-reservation-left"> | |
| 29 | + <text style="color: red;">*</text> <u-icon name="calendar" size="40"></u-icon>预约时间 | |
| 30 | + </view> | |
| 31 | + <view class="company-clean-container-header-reservation-right"> | |
| 32 | + <text style="margin-right: 10rpx;">{{ dayTime ? dayTime : "请选择时间" }}</text> <u-icon | |
| 33 | + name="arrow-right" size="25"></u-icon> | |
| 34 | + </view> | |
| 35 | + </view> | |
| 36 | + </view> | |
| 37 | + | |
| 38 | + <view class="company-clean-container-car-main"> | |
| 39 | + <view class="company-clean-container-car-main-content"> | |
| 40 | + <view class="company-clean-container-car-main-content-type"> | |
| 41 | + <view class="company-clean-container-car-main-content-type-price-area"> | |
| 42 | + <text style="color: red;">*</text>选择车型: {{carName}} | |
| 43 | + </view> | |
| 44 | + </view> | |
| 45 | + | |
| 46 | + <view> | |
| 47 | + <swiper :class="swiperClass" @change="onChangeSwiper" indicator-dots circular="true" | |
| 48 | + easing-function="linear" duration="2000"> | |
| 49 | + <swiper-item v-for="(car,index) in garCarInfoList" :key="index"> | |
| 50 | + <view> | |
| 51 | + <image :src="combinationImagePath(car)" mode="widthFix"></image> | |
| 52 | + </view> | |
| 53 | + <view><text style="color:#909399;font-size: 14px;">{{car.remark}}</text></view> | |
| 54 | + </swiper-item> | |
| 55 | + </swiper> | |
| 56 | + </view> | |
| 57 | + | |
| 58 | + <view class="company-clean-container-car-main-content-type"> | |
| 59 | + <view class="company-clean-container-car-main-content-type-price-area"> | |
| 60 | + <text style="color: red;">*</text>车辆容积: | |
| 61 | + </view> | |
| 62 | + <view style=" width:100%;display:flex; color:#909399; align-items: center;"> | |
| 63 | + <text>{{containerVolume}} 方</text> | |
| 64 | + </view> | |
| 65 | + </view> | |
| 66 | + | |
| 67 | + <view class="company-clean-container-car-main-content-type"> | |
| 68 | + <view class="company-clean-container-car-main-content-type-price-area"> | |
| 69 | + <text style="color: red;">*</text>添加车辆数量: | |
| 70 | + </view> | |
| 71 | + <view style=" width:100%;display:flex; color:#909399; align-items: center;"> | |
| 72 | + <u-number-box :min="0" :max="9999" integer buttonSize="46" :inputWidth="100" | |
| 73 | + :disabledInput="true" v-model="carNumber[swiperIndex]" | |
| 74 | + @change="numberBoxChange"></u-number-box> | |
| 75 | + </view> | |
| 76 | + </view> | |
| 77 | + | |
| 78 | + | |
| 79 | + <view class="company-clean-container-car-main-content-type"> | |
| 80 | + <view class="company-clean-container-car-main-content-type-price-area"> | |
| 81 | + <text style="color: red;">*</text>垃圾类型: | |
| 82 | + </view> | |
| 83 | + <view style=" width:100%;display:flex; color:#909399; align-items: center;"> | |
| 84 | + <myPiker :parentValue="paramFrom.garbageType" :title="'垃圾类型'" | |
| 85 | + @change="handlePickerGarbageTypeConfirm" :array="garbageTypeList"> | |
| 86 | + </myPiker> | |
| 87 | + </view> | |
| 88 | + </view> | |
| 89 | + | |
| 90 | + | |
| 91 | + <view class="company-clean-container-car-main-content-type"> | |
| 92 | + <view class="company-clean-container-car-main-content-type-price-area"> | |
| 93 | + <text style="color: red;">*</text>进入地下车库: | |
| 94 | + </view> | |
| 95 | + <view | |
| 96 | + style="width:100%;display: flex;justify-content: flex-start;align-items: center; "> | |
| 97 | + <view style="display: flex; align-items: center;"> | |
| 98 | + <up-radio-group shape="square" size="34" v-model="paramFrom.garInCarStore" | |
| 99 | + placement="row" @change="handleInCarClick"> | |
| 100 | + <up-radio activeColor="#19a97c" labelSize="32" iconSize="30" | |
| 101 | + :customStyle="{ marginRight: '30rpx' }" label="需要" :name="true"> | |
| 102 | + </up-radio> | |
| 103 | + <up-radio activeColor="#19a97c" labelSize="32" iconSize="30" | |
| 104 | + :customStyle="{ marginRight: '30rp' }" label="不需要" :name="false"> | |
| 105 | + </up-radio> | |
| 106 | + </up-radio-group> | |
| 107 | + </view> | |
| 108 | + </view> | |
| 109 | + </view> | |
| 110 | + <view v-if="paramFrom.garInCarStore" class="company-in-car-store-box-info"> | |
| 111 | + <view class="company-clean-container-site-image-info-input-remark-box"> | |
| 112 | + <u--textarea v-model="paramFrom.remark" placeholder="请填写限制高度(米)"></u--textarea> | |
| 113 | + </view> | |
| 114 | + <!-- <view class="company-clean-container-car-main-content-remark" style="margin-top: 20rpx; font-size: 23rpx;"> | |
| 108 | 115 | 提示:需要进入车库需要写车辆限高,部门车库限高2.3m,如果装修垃圾在车库,要考虑车辆是否能进入。 |
| 109 | 116 | </view> --> |
| 110 | - </view> | |
| 111 | - <view class="company-clean-container-car-main-content-prompt"> | |
| 112 | - 温馨提示:垃圾类型不符合,企业有权拒绝清运。 | |
| 113 | - </view> | |
| 114 | - </view> | |
| 115 | - </view> | |
| 116 | - <view class="company-clean-container-site-image-info"> | |
| 117 | - <view class="company-clean-container-site-image-info-remark"> | |
| 118 | - <text style="color: red;" @click="openPhone">*测试</text>请上传垃圾量照片(至少1张,最多5张),照片须看清全貌。 | |
| 119 | - </view> | |
| 120 | - <view class="company-clean-container-site-image-info-img"> | |
| 121 | - <u-upload width="200" height="150" :fileList="fileList" @afterRead="afterRead" :deletable="deletable" | |
| 122 | - @delete="deletePic" name="5" multiple :maxCount="5" :previewFullImage="true"></u-upload> | |
| 123 | - </view> | |
| 124 | - </view> | |
| 125 | - <view class="company-clean-container-site-image-info-sure-button"> | |
| 126 | - <view class="company-clean-container-site-image-info-sure-button-radio"> | |
| 127 | - <view @click="changeAgree"> | |
| 128 | - <u-checkbox-group v-model="paramFrom.sureReadFlag" placement="row"> | |
| 129 | - <u-checkbox activeColor="#19a97c" :customStyle="{ marginBottom: '0px', marginTop: '1px' }" size="30" | |
| 130 | - labelSize="28" shape="square" :key="0" :name="true" :labelDisabled="true" iconSize="28" | |
| 131 | - labelColor="#909399"></u-checkbox> | |
| 132 | - </u-checkbox-group> | |
| 133 | - </view> | |
| 134 | - <view> | |
| 135 | - 本人完全同意<text class="link">《装修垃圾收运意向协议》</text>且已确认信息真实有效,并承担相应法律责任。 | |
| 136 | - </view> | |
| 137 | - </view> | |
| 138 | - </view> | |
| 139 | - </view> | |
| 140 | - | |
| 141 | - <view class="company-clean-bottom" style="z-index: 10074;"> | |
| 142 | - <view class="company-clean-bottom-box"> | |
| 143 | - <view class="company-clean-bottom-left"> | |
| 144 | - <view class="company-clean-bottom-left-icon"> | |
| 145 | - <u-icon :stop="true" size="50" name="car-fill"></u-icon> | |
| 146 | - </view> | |
| 147 | - <view class="company-clean-bottom-left-number"> | |
| 148 | - <up-badge :type="type" max="99" :value="garCarNumberCount"></up-badge> | |
| 149 | - </view> | |
| 150 | - </view> | |
| 151 | - <view class="company-clean-bottom-right"> | |
| 152 | - <u-button @click="handleOderSure" shape="square" color="#19a97c" text="立即下单"></u-button> | |
| 153 | - </view> | |
| 154 | - </view> | |
| 155 | - </view> | |
| 156 | - | |
| 157 | - | |
| 158 | - | |
| 159 | - <view v-if="!carPopupShowFlag" ref="movableAreaElement" > | |
| 160 | - <uni-fab horizontal="right" vertical="bottom" popMenu="false" @fabClick="handleContactClick(tel)"></uni-fab> | |
| 161 | - </view> | |
| 162 | - </view> | |
| 163 | -</scroll-view> | |
| 164 | -</view> | |
| 117 | + </view> | |
| 118 | + <view class="company-clean-container-car-main-content-prompt"> | |
| 119 | + 温馨提示:垃圾类型不符合,企业有权拒绝清运。 | |
| 120 | + </view> | |
| 121 | + </view> | |
| 122 | + </view> | |
| 123 | + <view class="company-clean-container-site-image-info"> | |
| 124 | + <view class="company-clean-container-site-image-info-remark"> | |
| 125 | + <text style="color: red;">*</text>请上传垃圾量照片(至少1张,最多5张),照片须看清全貌。 | |
| 126 | + </view> | |
| 127 | + <view class="company-clean-container-site-image-info-img"> | |
| 128 | + <u-upload width="200" height="150" :fileList="fileList" @afterRead="afterRead" | |
| 129 | + :deletable="deletable" @delete="deletePic" name="5" multiple :maxCount="5" | |
| 130 | + :previewFullImage="true"></u-upload> | |
| 131 | + </view> | |
| 132 | + </view> | |
| 133 | + <view class="company-clean-container-site-image-info-sure-button"> | |
| 134 | + <view class="company-clean-container-site-image-info-sure-button-radio"> | |
| 135 | + <view @click="changeAgree"> | |
| 136 | + <u-checkbox-group v-model="paramFrom.sureReadFlag" placement="row"> | |
| 137 | + <u-checkbox activeColor="#19a97c" | |
| 138 | + :customStyle="{ marginBottom: '0px', marginTop: '1px' }" size="30" | |
| 139 | + labelSize="28" shape="square" :key="0" :name="true" :labelDisabled="true" | |
| 140 | + iconSize="28" labelColor="#909399"></u-checkbox> | |
| 141 | + </u-checkbox-group> | |
| 142 | + </view> | |
| 143 | + <view> | |
| 144 | + 本人完全同意<text class="link">《装修垃圾收运意向协议》</text>且已确认信息真实有效,并承担相应法律责任。 | |
| 145 | + </view> | |
| 146 | + </view> | |
| 147 | + </view> | |
| 148 | + </view> | |
| 149 | + | |
| 150 | + <view class="company-clean-bottom" style="z-index: 10074;"> | |
| 151 | + <view class="company-clean-bottom-box"> | |
| 152 | + <view class="company-clean-bottom-left"> | |
| 153 | + <view class="company-clean-bottom-left-icon"> | |
| 154 | + <u-icon :stop="true" size="50" name="car-fill"></u-icon> | |
| 155 | + </view> | |
| 156 | + <view class="company-clean-bottom-left-number"> | |
| 157 | + <up-badge :type="type" max="99" :value="garCarNumberCount"></up-badge> | |
| 158 | + </view> | |
| 159 | + </view> | |
| 160 | + <view class="company-clean-bottom-right"> | |
| 161 | + <u-button @click="handleOderSure" shape="square" color="#19a97c" text="立即下单"></u-button> | |
| 162 | + </view> | |
| 163 | + </view> | |
| 164 | + </view> | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + <view v-if="!carPopupShowFlag" ref="movableAreaElement"> | |
| 169 | + <uni-fab horizontal="right" vertical="bottom" popMenu="false" | |
| 170 | + @fabClick="handleContactClick(tel)"></uni-fab> | |
| 171 | + </view> | |
| 172 | + </view> | |
| 173 | + </scroll-view> | |
| 174 | + </view> | |
| 165 | 175 | </template> |
| 166 | 176 | <script setup> |
| 167 | -import { queryAddress } from '@/apis/address.js'; | |
| 168 | -import { queryCarList } from '@/apis/carinfo.js'; | |
| 169 | -import { uploadFilePromise } from '@/apis/common.js'; | |
| 170 | -import { saveOrder } from '@/apis/order.js'; | |
| 171 | -import addressPopup from '@/components/address-popup/address-popup.vue'; | |
| 172 | -import liuDeliveryTime from "@/components/liu-delivery-time/liu-delivery-time.vue"; | |
| 173 | -import myPiker from '@/components/my-piker/index.vue'; | |
| 174 | -import changeAddressUrl from '@/static/image/change-address.png'; | |
| 175 | -import garbageUrl from '@/static/image/garbage.png'; | |
| 176 | -import { useMainStore } from '@/stores/index.js'; | |
| 177 | -import { onLoad } from '@dcloudio/uni-app'; | |
| 178 | -import { computed, getCurrentInstance, ref, watch } from 'vue'; | |
| 179 | -const { proxy } = getCurrentInstance(); | |
| 180 | -const store = useMainStore(); | |
| 181 | -const userType = computed(() => store.userType) | |
| 182 | -const x = ref(360) | |
| 183 | -const y = ref(650) | |
| 184 | -const movableAreaElement = ref() | |
| 185 | -const deletable = ref(false) | |
| 186 | -const companyObj = ref() | |
| 187 | -const tel = ref() | |
| 188 | -const carName=ref("") | |
| 189 | -const carTypeShowFlag = ref(false) | |
| 190 | -const garbageTypeShowFlag = ref(false) | |
| 191 | -const carPopupShowFlag = ref(false) | |
| 192 | -const addressPopupRef = ref(null); | |
| 193 | -const swiperClass=ref("swiperHeight1") | |
| 194 | -const pageStyle=ref("") | |
| 195 | -const userAddress = ref({ | |
| 196 | - garUserContactName: "", | |
| 197 | - garUserContactTel: "", | |
| 198 | - garRemark: "", | |
| 199 | - garUserAddress: "", | |
| 200 | - garCoordinate: "", | |
| 201 | - garLongitude: "", | |
| 202 | - garLatitude: "", | |
| 203 | -}) | |
| 204 | -const isCallBtn = ref(false); | |
| 205 | -// 车辆信息 | |
| 206 | -const garCarInfoList = ref({}) | |
| 207 | -const garCarLabelInfoList = ref({}) | |
| 208 | -const garCarLabelInfoNow = ref() | |
| 209 | -const swiperIndex =ref(0) | |
| 210 | -const containerVolume=ref("") | |
| 211 | -const carNumber=ref([]); | |
| 212 | -const scrollTop=ref(0) | |
| 213 | -// 车辆数量 | |
| 214 | -const garCarNumberCount = ref() | |
| 215 | -const garbageTypeList = ref(["装修垃圾", "建筑垃圾"]) | |
| 216 | -const paramFrom = ref({ | |
| 217 | - carNumber: 0, | |
| 218 | - remark: "", | |
| 219 | - sureReadFlag: [], | |
| 220 | - carType: "", | |
| 221 | - garbageType: "装修垃圾", | |
| 222 | - garInCarStore: false, | |
| 223 | - garEstimatedCost:"" | |
| 224 | -}) | |
| 225 | -const dayTime = ref() | |
| 226 | -const dayTimeType =ref() | |
| 227 | - | |
| 228 | -const chooseTime = ref() | |
| 229 | -const fileList = ref([ | |
| 230 | - { | |
| 231 | - url: garbageUrl, | |
| 232 | - label: '预览' | |
| 233 | - } | |
| 234 | -]) | |
| 235 | -const candidates = ref([]) | |
| 236 | -const handleTimeChoose = () => { | |
| 237 | - chooseTime.value.open(); | |
| 238 | -} | |
| 239 | - | |
| 240 | -const openPhone = () => { | |
| 241 | - alert("网页调试---->>> 拍照点击事件 调用安卓层功能 "); | |
| 242 | - window.JsInterface.takePhone(); | |
| 243 | -} | |
| 244 | - | |
| 245 | -const takePhoneCallBack = (path) => { | |
| 246 | - //如果用户不授予权限 或者没有权限 获取拍照之后没确定 不会过这里 | |
| 247 | - //最好也是判断 path 非空的时候 去处理逻辑 | |
| 248 | - alert("网页调试---->>> 拍照后回调 路径=" + path); | |
| 177 | + import { | |
| 178 | + queryAddress | |
| 179 | + } from '@/apis/address.js'; | |
| 180 | + import { | |
| 181 | + queryCarList | |
| 182 | + } from '@/apis/carinfo.js'; | |
| 183 | + import { | |
| 184 | + uploadFilePromise | |
| 185 | + } from '@/apis/common.js'; | |
| 186 | + import { | |
| 187 | + saveOrder | |
| 188 | + } from '@/apis/order.js'; | |
| 189 | + import addressPopup from '@/components/address-popup/address-popup.vue'; | |
| 190 | + import liuDeliveryTime from "@/components/liu-delivery-time/liu-delivery-time.vue"; | |
| 191 | + import myPiker from '@/components/my-piker/index.vue'; | |
| 192 | + import changeAddressUrl from '@/static/image/change-address.png'; | |
| 193 | + import garbageUrl from '@/static/image/garbage.png'; | |
| 194 | + import { | |
| 195 | + useMainStore | |
| 196 | + } from '@/stores/index.js'; | |
| 197 | + import { | |
| 198 | + onLoad | |
| 199 | + } from '@dcloudio/uni-app'; | |
| 200 | + import { | |
| 201 | + computed, | |
| 202 | + getCurrentInstance, | |
| 203 | + ref, | |
| 204 | + watch, | |
| 205 | + onMounted, | |
| 206 | + onBeforeUnmount | |
| 207 | + } from 'vue'; | |
| 208 | + const { | |
| 209 | + proxy | |
| 210 | + } = getCurrentInstance(); | |
| 211 | + const store = useMainStore(); | |
| 212 | + const userType = computed(() => store.userType) | |
| 213 | + const x = ref(360) | |
| 214 | + const y = ref(650) | |
| 215 | + const movableAreaElement = ref() | |
| 216 | + const deletable = ref(false) | |
| 217 | + const companyObj = ref() | |
| 218 | + const tel = ref() | |
| 219 | + const carName = ref("") | |
| 220 | + const carTypeShowFlag = ref(false) | |
| 221 | + const garbageTypeShowFlag = ref(false) | |
| 222 | + const carPopupShowFlag = ref(false) | |
| 223 | + const addressPopupRef = ref(null); | |
| 224 | + const swiperClass = ref("swiperHeight1") | |
| 225 | + const pageStyle = ref("") | |
| 226 | + const userAddress = ref({ | |
| 227 | + garUserContactName: "", | |
| 228 | + garUserContactTel: "", | |
| 229 | + garRemark: "", | |
| 230 | + garUserAddress: "", | |
| 231 | + garCoordinate: "", | |
| 232 | + garLongitude: "", | |
| 233 | + garLatitude: "", | |
| 234 | + }) | |
| 235 | + const isCallBtn = ref(false); | |
| 236 | + // 车辆信息 | |
| 237 | + const garCarInfoList = ref({}) | |
| 238 | + const garCarLabelInfoList = ref({}) | |
| 239 | + const garCarLabelInfoNow = ref() | |
| 240 | + const swiperIndex = ref(0) | |
| 241 | + const containerVolume = ref("") | |
| 242 | + const carNumber = ref([]); | |
| 243 | + const scrollTop = ref(0) | |
| 244 | + // 车辆数量 | |
| 245 | + const garCarNumberCount = ref() | |
| 246 | + const garbageTypeList = ref(["装修垃圾", "建筑垃圾"]) | |
| 247 | + const paramFrom = ref({ | |
| 248 | + carNumber: 0, | |
| 249 | + remark: "", | |
| 250 | + sureReadFlag: [], | |
| 251 | + carType: "", | |
| 252 | + garbageType: "装修垃圾", | |
| 253 | + garInCarStore: false, | |
| 254 | + garEstimatedCost: "" | |
| 255 | + }) | |
| 256 | + const dayTime = ref() | |
| 257 | + const dayTimeType = ref() | |
| 258 | + | |
| 259 | + const chooseTime = ref() | |
| 260 | + const fileList = ref([{ | |
| 261 | + url: garbageUrl, | |
| 262 | + label: '预览' | |
| 263 | + }]) | |
| 264 | + const candidates = ref([]) | |
| 265 | + | |
| 266 | + const photoPath = ref(null) | |
| 267 | + | |
| 268 | + const handleTimeChoose = () => { | |
| 269 | + chooseTime.value.open(); | |
| 270 | + } | |
| 271 | + | |
| 272 | + const changeTime = (e) => { | |
| 273 | + dayTime.value = e.value | |
| 274 | + | |
| 275 | + if (e.startHour == "00:00" || e.startHour == "01:00" || e.startHour == "02:00" || e.startHour == "03:00" || e | |
| 276 | + .startHour == "04:00" || e.startHour == "05:00" || | |
| 277 | + e.startHour == "06:00" || e.startHour == "22:00" || e.startHour == "23:00") { | |
| 278 | + dayTimeType.value = "2207"; | |
| 279 | + | |
| 280 | + } else { | |
| 281 | + dayTimeType.value = ""; | |
| 282 | + if (swiperClass.value == "swiperHeight3") { | |
| 283 | + jumpPrompt("中大型车辆只能选择22:00-07:00时间段") | |
| 284 | + } | |
| 285 | + } | |
| 286 | + | |
| 287 | + | |
| 288 | + } | |
| 289 | + const changeAgree = (e) => { | |
| 290 | + // paramFrom.value.sureReadFlag = e | |
| 291 | + paramFrom.value.sureReadFlag[0] = !paramFrom.value.sureReadFlag[0] | |
| 292 | + } | |
| 293 | + const onChange = (e) => {} | |
| 294 | + | |
| 295 | + const onChangeSwiper = (e) => { | |
| 296 | + if (garCarInfoList.value) { | |
| 297 | + carName.value = garCarInfoList.value[e.detail.current].carType; | |
| 298 | + swiperIndex.value = e.detail.current; | |
| 299 | + containerVolume.value = garCarInfoList.value[e.detail.current].containerVolume; | |
| 300 | + if (garCarInfoList.value[e.detail.current].containerVolume == "4") { | |
| 301 | + swiperClass.value = "swiperHeight1"; | |
| 302 | + } else if (garCarInfoList.value[e.detail.current].containerVolume == "6") { | |
| 303 | + swiperClass.value = "swiperHeight2"; | |
| 304 | + } else { | |
| 305 | + swiperClass.value = "swiperHeight3"; | |
| 306 | + | |
| 307 | + if (dayTimeType.value == '2207') { | |
| 308 | + | |
| 309 | + } else if ((dayTime.value != null && dayTime.value != "" && dayTime.value != undefined) && | |
| 310 | + garCarInfoList.value[e.detail.current].containerVolume && parseFloat(garCarInfoList.value[e.detail | |
| 311 | + .current].containerVolume) >= 8) { | |
| 312 | + jumpPrompt("中大型车辆只能选择22:00-07:00时间段") | |
| 313 | + } | |
| 314 | + } | |
| 315 | + | |
| 316 | + | |
| 317 | + } | |
| 318 | + | |
| 319 | + } | |
| 320 | + | |
| 321 | + const numberBoxChange = (value) => { | |
| 322 | + garCarInfoList.value[swiperIndex.value].garOrderCarNumber = value.value; | |
| 323 | + carNumber.value[swiperIndex.value] = value.value; | |
| 324 | + if (!garCarNumberCount.value) { | |
| 325 | + garCarNumberCount.value = 0; | |
| 326 | + } | |
| 327 | + let va = 0; | |
| 328 | + console.log(garCarInfoList.value[swiperIndex.value].garOrderCarNumber); | |
| 329 | + carNumber.value.forEach(function(item, index, arr) { | |
| 330 | + if (item) { | |
| 331 | + va = va + item; | |
| 332 | + } | |
| 333 | + }) | |
| 334 | + | |
| 335 | + garCarNumberCount.value = va; | |
| 336 | + } | |
| 337 | + /** | |
| 338 | + * 初始化信息 | |
| 339 | + */ | |
| 340 | + onLoad((options) => { | |
| 341 | + initOptions(options); | |
| 342 | + }) | |
| 343 | + | |
| 344 | + | |
| 345 | + const combinationImagePath = (car) => { | |
| 346 | + return import.meta.env.VITE_BASE_URL + "/" + car.carLeft; | |
| 347 | + } | |
| 348 | + | |
| 349 | + const initOptions = async (options) => { | |
| 350 | + companyObj.value = JSON.parse(options.companyObj); | |
| 351 | + tel.value = options.tel; | |
| 352 | + await queryAddress('CURRENT').then(res => { | |
| 353 | + try { | |
| 354 | + if (res.data.data && res.data.data[0]) { | |
| 355 | + userAddress.value = res.data.data[0] ? res.data.data[0] : {} | |
| 356 | + } else { | |
| 357 | + userAddress.value = {}; | |
| 358 | + } | |
| 359 | + } catch (error) { | |
| 360 | + userAddress.value = {}; | |
| 361 | + } | |
| 362 | + }) | |
| 363 | + if (!userAddress.value.garLongitude) { | |
| 364 | + uni.$u.toast("请设置清运地址!") | |
| 365 | + // 返回上级 | |
| 366 | + uni.navigateBack({ | |
| 367 | + delta: 1 | |
| 368 | + }) | |
| 369 | + return | |
| 370 | + } | |
| 371 | + queryCarList({ | |
| 372 | + companyId: companyObj.value.id | |
| 373 | + }).then(res => { | |
| 374 | + | |
| 375 | + garCarInfoList.value = res.data.rows; | |
| 376 | + if (garCarInfoList.value[0]) { | |
| 377 | + carName.value = garCarInfoList.value[0].carType; | |
| 378 | + containerVolume.value = garCarInfoList.value[0].containerVolume; | |
| 379 | + } | |
| 380 | + }) | |
| 381 | + } | |
| 382 | + | |
| 383 | + const handleInCarClick = (val) => { | |
| 384 | + // paramFrom.value.garInCarStore = !paramFrom.value.garInCarStore | |
| 385 | + } | |
| 386 | + /** | |
| 387 | + * 拨打电话回调 | |
| 388 | + */ | |
| 389 | + const handleContactClick = (val) => { | |
| 390 | + console.log("点击了电话"); | |
| 391 | + if (isCallBtn.value) { | |
| 392 | + uni.makePhoneCall({ | |
| 393 | + phoneNumber: val | |
| 394 | + }).then(res => {}).catch(err => {}); | |
| 395 | + } | |
| 396 | + } | |
| 397 | + | |
| 398 | + // 删除图片 | |
| 399 | + const deletePic = (event) => { | |
| 400 | + fileList.value.splice(event.index, 1); | |
| 401 | + }; | |
| 402 | + | |
| 403 | + // 新增图片 | |
| 404 | + const afterRead = async (event) => { | |
| 405 | + // 当设置 mutiple 为 true 时, file 为数组格式,否则为对象格式 | |
| 406 | + let lists = [].concat(event.file); | |
| 407 | + | |
| 408 | + lists.map((item) => { | |
| 409 | + fileList.value.push({ | |
| 410 | + ...item, | |
| 411 | + status: 'uploading', | |
| 412 | + message: '上传中', | |
| 413 | + }); | |
| 414 | + }); | |
| 415 | + let fileListLen = fileList.value.length--; | |
| 416 | + // 将blob转为file对象的方法 | |
| 417 | + function blobToFile(blob, fileName) { | |
| 418 | + return new File([blob], fileName, { | |
| 419 | + type: 'image/png' | |
| 420 | + }) | |
| 421 | + } | |
| 422 | + for (let i = 0; i < lists.length; i++) { | |
| 423 | + // 获取blob对象 | |
| 424 | + fetch(lists[i].url) | |
| 425 | + .then(response => response.blob()) | |
| 426 | + .then(blob => { | |
| 427 | + // 将blob转换为file | |
| 428 | + let fileN = blobToFile(blob, lists[i].name) | |
| 429 | + // 上传file对象 | |
| 430 | + let requestPath = import.meta.env.VITE_BASE_URL + import.meta.env | |
| 431 | + .VITE_BASE_FILE_UPLOAD_PREFIX; | |
| 432 | + uploadFilePromise(requestPath, fileN).then(result => { | |
| 433 | + let item = fileList.value[fileListLen]; | |
| 434 | + fileList.value.splice(fileListLen, 1, { | |
| 435 | + ...item, | |
| 436 | + status: 'success', | |
| 437 | + message: '', | |
| 438 | + url: result.data.url, | |
| 439 | + }); | |
| 440 | + fileListLen++; | |
| 441 | + }); | |
| 442 | + | |
| 443 | + }) | |
| 444 | + | |
| 445 | + | |
| 446 | + } | |
| 447 | + fileList.value = fileList.value.filter(item => { | |
| 448 | + deletable.value = true | |
| 449 | + return !item.label | |
| 450 | + }) | |
| 451 | + }; | |
| 452 | + | |
| 453 | + | |
| 454 | + const handlePickerGarbageTypeConfirm = (e) => { | |
| 455 | + paramFrom.value.garbageType = e | |
| 456 | + garbageTypeShowFlag.value = false | |
| 457 | + } | |
| 458 | + const handlePickerCarInfoConfirm = (e) => { | |
| 459 | + paramFrom.value.carType = e | |
| 460 | + garCarLabelInfoNow.value = garCarLabelInfoList.value[paramFrom.value.carType] | |
| 461 | + carTypeShowFlag.value = false | |
| 462 | + } | |
| 463 | + | |
| 464 | + const orderClick = ref(true) | |
| 465 | + /** | |
| 466 | + * 处理下单 | |
| 467 | + */ | |
| 468 | + const handleOderSure = async () => { | |
| 469 | + let garCarInfos = []; | |
| 470 | + for (const key in garCarInfoList.value) { | |
| 471 | + if (garCarInfoList.value[key] && garCarInfoList.value[key].garOrderCarNumber && garCarInfoList.value[ | |
| 472 | + key].garOrderCarNumber > 0) { | |
| 473 | + garCarInfos.push(garCarInfoList.value[key]); | |
| 474 | + } | |
| 475 | + | |
| 476 | + } | |
| 477 | + if (dayTime.value != null && dayTime.value != "" && dayTime.value != undefined) { | |
| 478 | + if (dayTimeType.value != '2207') { | |
| 479 | + let length = garCarInfos.length; | |
| 480 | + for (let index = 0; index < length; index++) { | |
| 481 | + | |
| 482 | + if (garCarInfos[index].containerVolume && parseFloat(garCarInfos[index].containerVolume) >= | |
| 483 | + 8) { | |
| 484 | + jumpPrompt("中大型车辆只能选择22:00-07:00时间段"); | |
| 485 | + | |
| 486 | + return; | |
| 487 | + } | |
| 488 | + | |
| 489 | + } | |
| 249 | 490 | } |
| 491 | + } | |
| 492 | + | |
| 493 | + | |
| 494 | + | |
| 495 | + let params = { | |
| 496 | + /** | |
| 497 | + * 订单地址 | |
| 498 | + */ | |
| 499 | + garOrderAddress: userAddress.value.garUserAddress, | |
| 500 | + | |
| 501 | + /** | |
| 502 | + * 订单详细地址 | |
| 503 | + */ | |
| 504 | + garOrderAddressDetails: userAddress.value.garRemark, | |
| 505 | + | |
| 506 | + /** | |
| 507 | + * 订单姓名 | |
| 508 | + */ | |
| 509 | + garOrderContactName: userAddress.value.garUserContactName, | |
| 510 | + garCarInfoList: garCarInfos, | |
| 511 | + | |
| 512 | + /** | |
| 513 | + * 垃圾类型 | |
| 514 | + */ | |
| 515 | + garOrderTrashType: paramFrom.value.garbageType, | |
| 516 | + | |
| 517 | + /** | |
| 518 | + * 订单人电话 | |
| 519 | + */ | |
| 520 | + garOrderContactTel: userAddress.value.garUserContactTel, | |
| 521 | + | |
| 522 | + /** | |
| 523 | + * 承接经营单位 | |
| 524 | + */ | |
| 525 | + garOrderCompanyId: companyObj.value.id, | |
| 526 | + | |
| 527 | + /** | |
| 528 | + * 公司名称 | |
| 529 | + */ | |
| 530 | + garOrderCompanyName: companyObj.value.name, | |
| 531 | + | |
| 532 | + /** | |
| 533 | + * 公司负责人电话 | |
| 534 | + */ | |
| 535 | + garOrderCompanyTel: companyObj.value.servicePhone, | |
| 536 | + | |
| 537 | + /** | |
| 538 | + * 约定时间 | |
| 539 | + */ | |
| 540 | + garOrderAgreementTime: dayTime.value, | |
| 541 | + /** | |
| 542 | + * 备注 | |
| 543 | + */ | |
| 544 | + garRemark: paramFrom.value.remark, | |
| 545 | + /** | |
| 546 | + * 图片列表 | |
| 547 | + */ | |
| 548 | + imageUrls: fileList.value.filter(item => !item.label).map(item => item.url), | |
| 549 | + garLongitude: userAddress.value.garLongitude, | |
| 550 | + garLatitude: userAddress.value.garLatitude, | |
| 551 | + garCoordinate: userAddress.value.garCoordinate, | |
| 552 | + garInCarStore: paramFrom.value.garInCarStore | |
| 553 | + } | |
| 554 | + console.log("----------------------->5"); | |
| 555 | + if (!validateParams(params)) { | |
| 556 | + console.log("未通过", params); | |
| 557 | + | |
| 558 | + return; | |
| 559 | + } | |
| 560 | + | |
| 561 | + // 请求防抖 | |
| 562 | + if (orderClick.value) { | |
| 563 | + orderClick.value = false | |
| 564 | + setTimeout(async () => { | |
| 565 | + orderClick.value = true | |
| 566 | + await handlerSaveOrder(params); | |
| 567 | + }, 800); | |
| 568 | + } else { | |
| 569 | + uni.$u.toast("请勿频繁操作") | |
| 570 | + } | |
| 571 | + } | |
| 572 | + const handlerSaveOrder = async (params) => { | |
| 573 | + await saveOrder(params).then(res => { | |
| 574 | + if (res.data.success) { | |
| 575 | + if (userType.value != "用户") { | |
| 576 | + uni.$u.toast("下单成功,请切换成且角色查看订单详情") | |
| 577 | + uni.$u.route({ | |
| 578 | + type: 'navigateBack', | |
| 579 | + url: `pages/home/index`, | |
| 580 | + }) | |
| 581 | + } else { | |
| 582 | + uni.$u.toast('下单成功') | |
| 583 | + uni.$u.route({ | |
| 584 | + type: "redirect", | |
| 585 | + url: `pages/order-info/order-other/detail/index`, | |
| 586 | + params: { | |
| 587 | + orderId: res.data.data | |
| 588 | + } | |
| 589 | + }) | |
| 590 | + } | |
| 591 | + } | |
| 592 | + }) | |
| 593 | + } | |
| 250 | 594 | |
| 251 | -const changeTime = (e) => { | |
| 252 | - dayTime.value = e.value | |
| 253 | - | |
| 254 | - if(e.startHour=="00:00" || e.startHour=="01:00" || e.startHour=="02:00" || e.startHour=="03:00" ||e.startHour=="04:00" || e.startHour=="05:00" | |
| 255 | - || e.startHour=="06:00" || e.startHour=="22:00" ||e.startHour=="23:00"){ | |
| 256 | - dayTimeType.value = "2207"; | |
| 257 | - | |
| 258 | - }else{ | |
| 259 | - dayTimeType.value = ""; | |
| 260 | - if( swiperClass.value == "swiperHeight3"){ | |
| 261 | - jumpPrompt("中大型车辆只能选择22:00-07:00时间段") | |
| 262 | - } | |
| 263 | - } | |
| 264 | - | |
| 265 | - | |
| 266 | -} | |
| 267 | -const changeAgree = (e) => { | |
| 268 | - // paramFrom.value.sureReadFlag = e | |
| 269 | - paramFrom.value.sureReadFlag[0] = !paramFrom.value.sureReadFlag[0] | |
| 270 | -} | |
| 271 | -const onChange = (e) => { | |
| 272 | -} | |
| 273 | - | |
| 274 | -const onChangeSwiper=(e)=>{ | |
| 275 | - if(garCarInfoList.value){ | |
| 276 | - carName.value=garCarInfoList.value[e.detail.current].carType; | |
| 277 | - swiperIndex.value = e.detail.current; | |
| 278 | - containerVolume.value = garCarInfoList.value[e.detail.current].containerVolume; | |
| 279 | - if(garCarInfoList.value[e.detail.current].containerVolume=="4"){ | |
| 280 | - swiperClass.value = "swiperHeight1"; | |
| 281 | - }else if(garCarInfoList.value[e.detail.current].containerVolume=="6"){ | |
| 282 | - swiperClass.value = "swiperHeight2"; | |
| 283 | - }else{ | |
| 284 | - swiperClass.value = "swiperHeight3"; | |
| 285 | - | |
| 286 | - if(dayTimeType.value == '2207'){ | |
| 287 | - | |
| 288 | - }else if((dayTime.value != null && dayTime.value != "" && dayTime.value != undefined) && garCarInfoList.value[e.detail.current].containerVolume && parseFloat(garCarInfoList.value[e.detail.current].containerVolume) >= 8){ | |
| 289 | - jumpPrompt("中大型车辆只能选择22:00-07:00时间段") | |
| 290 | - } | |
| 291 | - } | |
| 292 | - | |
| 293 | - | |
| 294 | - } | |
| 295 | - | |
| 296 | -} | |
| 297 | - | |
| 298 | -const numberBoxChange=(value)=>{ | |
| 299 | - garCarInfoList.value[swiperIndex.value].garOrderCarNumber=value.value; | |
| 300 | - carNumber.value[swiperIndex.value]=value.value; | |
| 301 | - if(!garCarNumberCount.value){ | |
| 302 | - garCarNumberCount.value=0; | |
| 303 | - } | |
| 304 | - let va = 0; | |
| 305 | - console.log(garCarInfoList.value[swiperIndex.value].garOrderCarNumber); | |
| 306 | - carNumber.value.forEach(function(item,index,arr){ | |
| 307 | - if(item){ | |
| 308 | - va = va+item; | |
| 309 | - } | |
| 310 | - }) | |
| 311 | - | |
| 312 | - garCarNumberCount.value = va; | |
| 313 | -} | |
| 314 | -/** | |
| 315 | - * 初始化信息 | |
| 316 | - */ | |
| 317 | -onLoad((options) => { | |
| 318 | - initOptions(options); | |
| 319 | -}) | |
| 320 | - | |
| 321 | - | |
| 322 | -const combinationImagePath=(car)=>{ | |
| 323 | - return import.meta.env.VITE_BASE_URL+"/"+car.carLeft; | |
| 324 | -} | |
| 325 | - | |
| 326 | -const initOptions = async (options) => { | |
| 327 | - companyObj.value = JSON.parse(options.companyObj); | |
| 328 | - tel.value = options.tel; | |
| 329 | - await queryAddress('CURRENT').then(res => { | |
| 330 | - try { | |
| 331 | - if (res.data.data && res.data.data[0]) { | |
| 332 | - userAddress.value = res.data.data[0] ? res.data.data[0] : {} | |
| 333 | - } else { | |
| 334 | - userAddress.value = {}; | |
| 335 | - } | |
| 336 | - } catch (error) { | |
| 337 | - userAddress.value = {}; | |
| 338 | - } | |
| 339 | - }) | |
| 340 | - if (!userAddress.value.garLongitude) { | |
| 341 | - uni.$u.toast("请设置清运地址!") | |
| 342 | - // 返回上级 | |
| 343 | - uni.navigateBack({ | |
| 344 | - delta: 1 | |
| 345 | - }) | |
| 346 | - return | |
| 347 | - } | |
| 348 | - queryCarList({ companyId: companyObj.value.id }).then(res => { | |
| 349 | - | |
| 350 | - garCarInfoList.value=res.data.rows; | |
| 351 | - if(garCarInfoList.value[0]){ | |
| 352 | - carName.value=garCarInfoList.value[0].carType; | |
| 353 | - containerVolume.value=garCarInfoList.value[0].containerVolume; | |
| 354 | - } | |
| 355 | - }) | |
| 356 | -} | |
| 357 | - | |
| 358 | -const handleInCarClick = (val) => { | |
| 359 | - // paramFrom.value.garInCarStore = !paramFrom.value.garInCarStore | |
| 360 | -} | |
| 361 | -/** | |
| 362 | - * 拨打电话回调 | |
| 363 | - */ | |
| 364 | -const handleContactClick = (val) => { | |
| 365 | - console.log("点击了电话"); | |
| 366 | - if (isCallBtn.value) { | |
| 367 | - uni.makePhoneCall({ phoneNumber: val }).then(res => { | |
| 368 | - }).catch(err => { }); | |
| 369 | - } | |
| 370 | -} | |
| 371 | - | |
| 372 | -// 删除图片 | |
| 373 | -const deletePic = (event) => { | |
| 374 | - fileList.value.splice(event.index, 1); | |
| 375 | -}; | |
| 376 | - | |
| 377 | -// 新增图片 | |
| 378 | -const afterRead = async (event) => { | |
| 379 | - // 当设置 mutiple 为 true 时, file 为数组格式,否则为对象格式 | |
| 380 | - let lists = [].concat(event.file); | |
| 381 | - let fileListLen = fileList.value.length; | |
| 382 | - lists.map((item) => { | |
| 383 | - fileList.value.push({ | |
| 384 | - ...item, | |
| 385 | - status: 'uploading', | |
| 386 | - message: '上传中', | |
| 387 | - }); | |
| 388 | - }); | |
| 389 | - for (let i = 0; i < lists.length; i++) { | |
| 390 | - let requestPath = import.meta.env.VITE_BASE_URL + import.meta.env.VITE_BASE_FILE_UPLOAD_PREFIX; | |
| 391 | - const result = await uploadFilePromise(requestPath, lists[i].url); | |
| 392 | - let item = fileList.value[fileListLen]; | |
| 393 | - fileList.value.splice(fileListLen, 1, { | |
| 394 | - ...item, | |
| 395 | - status: 'success', | |
| 396 | - message: '', | |
| 397 | - url: result.data.fileName, | |
| 398 | - }); | |
| 399 | - fileListLen++; | |
| 400 | - } | |
| 401 | - fileList.value = fileList.value.filter(item => { | |
| 402 | - deletable.value = true | |
| 403 | - return !item.label | |
| 404 | - }) | |
| 405 | -}; | |
| 406 | - | |
| 407 | - | |
| 408 | -const handlePickerGarbageTypeConfirm = (e) => { | |
| 409 | - paramFrom.value.garbageType = e | |
| 410 | - garbageTypeShowFlag.value = false | |
| 411 | -} | |
| 412 | -const handlePickerCarInfoConfirm = (e) => { | |
| 413 | - paramFrom.value.carType = e | |
| 414 | - garCarLabelInfoNow.value = garCarLabelInfoList.value[paramFrom.value.carType] | |
| 415 | - carTypeShowFlag.value = false | |
| 416 | -} | |
| 417 | - | |
| 418 | -const orderClick = ref(true) | |
| 419 | -/** | |
| 420 | - * 处理下单 | |
| 421 | - */ | |
| 422 | -const handleOderSure = async () => { | |
| 423 | - let garCarInfos = []; | |
| 424 | - for (const key in garCarInfoList.value) { | |
| 425 | - if(garCarInfoList.value[key]&& garCarInfoList.value[key].garOrderCarNumber && garCarInfoList.value[key].garOrderCarNumber>0){ | |
| 426 | - garCarInfos.push(garCarInfoList.value[key]); | |
| 427 | - } | |
| 428 | - | |
| 429 | - } | |
| 430 | - if(dayTime.value != null && dayTime.value != "" && dayTime.value != undefined){ | |
| 431 | - if(dayTimeType.value != '2207' ){ | |
| 432 | - let length = garCarInfos.length; | |
| 433 | - for (let index = 0; index <length; index++) { | |
| 434 | - | |
| 435 | - if(garCarInfos[index].containerVolume && parseFloat(garCarInfos[index].containerVolume) >=8){ | |
| 436 | - jumpPrompt("中大型车辆只能选择22:00-07:00时间段"); | |
| 437 | - | |
| 438 | - return; | |
| 439 | - } | |
| 440 | - | |
| 441 | - } | |
| 442 | - } | |
| 443 | - } | |
| 444 | - | |
| 445 | - | |
| 446 | - | |
| 447 | - let params = { | |
| 448 | - /** | |
| 449 | - * 订单地址 | |
| 450 | - */ | |
| 451 | - garOrderAddress: userAddress.value.garUserAddress, | |
| 452 | - | |
| 453 | - /** | |
| 454 | - * 订单详细地址 | |
| 455 | - */ | |
| 456 | - garOrderAddressDetails: userAddress.value.garRemark, | |
| 457 | - | |
| 458 | - /** | |
| 459 | - * 订单姓名 | |
| 460 | - */ | |
| 461 | - garOrderContactName: userAddress.value.garUserContactName, | |
| 462 | - garCarInfoList: garCarInfos, | |
| 463 | - | |
| 464 | - /** | |
| 465 | - * 垃圾类型 | |
| 466 | - */ | |
| 467 | - garOrderTrashType: paramFrom.value.garbageType, | |
| 468 | - | |
| 469 | - /** | |
| 470 | - * 订单人电话 | |
| 471 | - */ | |
| 472 | - garOrderContactTel: userAddress.value.garUserContactTel, | |
| 473 | - | |
| 474 | - /** | |
| 475 | - * 承接经营单位 | |
| 476 | - */ | |
| 477 | - garOrderCompanyId: companyObj.value.id, | |
| 478 | - | |
| 479 | - /** | |
| 480 | - * 公司名称 | |
| 481 | - */ | |
| 482 | - garOrderCompanyName: companyObj.value.name, | |
| 483 | - | |
| 484 | - /** | |
| 485 | - * 公司负责人电话 | |
| 486 | - */ | |
| 487 | - garOrderCompanyTel: companyObj.value.servicePhone, | |
| 488 | - | |
| 489 | - /** | |
| 490 | - * 约定时间 | |
| 491 | - */ | |
| 492 | - garOrderAgreementTime: dayTime.value, | |
| 493 | - /** | |
| 494 | - * 备注 | |
| 495 | - */ | |
| 496 | - garRemark: paramFrom.value.remark, | |
| 497 | - /** | |
| 498 | - * 图片列表 | |
| 499 | - */ | |
| 500 | - imageUrls: fileList.value.filter(item => !item.label).map(item => item.url), | |
| 501 | - garLongitude: userAddress.value.garLongitude, | |
| 502 | - garLatitude: userAddress.value.garLatitude, | |
| 503 | - garCoordinate: userAddress.value.garCoordinate, | |
| 504 | - garInCarStore: paramFrom.value.garInCarStore | |
| 505 | - } | |
| 506 | - console.log("----------------------->5"); | |
| 507 | - if (!validateParams(params)) { | |
| 508 | - console.log("未通过", params); | |
| 509 | - | |
| 510 | - return; | |
| 511 | - } | |
| 512 | - | |
| 513 | - // 请求防抖 | |
| 514 | - if (orderClick.value) { | |
| 515 | - orderClick.value = false | |
| 516 | - setTimeout(async () => { | |
| 517 | - orderClick.value = true | |
| 518 | - await handlerSaveOrder(params); | |
| 519 | - }, 800); | |
| 520 | - } else { | |
| 521 | - uni.$u.toast("请勿频繁操作") | |
| 522 | - } | |
| 523 | -} | |
| 524 | -const handlerSaveOrder = async (params) => { | |
| 525 | - await saveOrder(params).then(res => { | |
| 526 | - if (res.data.success) { | |
| 527 | - if (userType.value != "用户") { | |
| 528 | - uni.$u.toast("下单成功,请切换成且角色查看订单详情") | |
| 529 | - uni.$u.route({ | |
| 530 | - type: 'navigateBack', | |
| 531 | - url: `pages/home/index`, | |
| 532 | - }) | |
| 533 | - } else { | |
| 534 | - uni.$u.toast('下单成功') | |
| 535 | - uni.$u.route({ | |
| 536 | - type: "redirect", | |
| 537 | - url: `pages/order-info/order-other/detail/index`, | |
| 538 | - params: { | |
| 539 | - orderId: res.data.data | |
| 540 | - } | |
| 541 | - }) | |
| 542 | - } | |
| 543 | - } | |
| 544 | - }) | |
| 545 | -} | |
| 546 | - | |
| 547 | -const handlerChooseAddress = () => { | |
| 548 | - addressPopupRef.value.open(userAddress.value) | |
| 549 | -} | |
| 550 | -const currentChange = (val) => { | |
| 551 | - userAddress.value = val | |
| 552 | - console.log("currentChange====================>"); | |
| 553 | - | |
| 554 | - console.log(userAddress.value); | |
| 555 | - | |
| 556 | -} | |
| 557 | -/** | |
| 558 | - * 校验参数 | |
| 559 | - * @param {Object} params | |
| 560 | - */ | |
| 561 | -const validateParams = (params) => { | |
| 562 | - | |
| 563 | - if (params.garInCarStore && !params.garRemark) { | |
| 564 | - jumpPrompt('请输入限高') | |
| 565 | - return false; | |
| 566 | - } | |
| 567 | - | |
| 568 | - if (!paramFrom.value.sureReadFlag[0]) { | |
| 569 | - jumpPrompt('请勾选"本人已确认信息真实有效,并承担相应法律责任"') | |
| 570 | - return false; | |
| 571 | - } | |
| 572 | - for (const key in params) { | |
| 573 | - // 跳过garInCarStore | |
| 574 | - if (key == "garInCarStore") { | |
| 575 | - continue; | |
| 576 | - } | |
| 577 | - if (!params[key] && key != "garRemark") { | |
| 578 | - switch (key) { | |
| 579 | - case "garOrderAgreementTime": | |
| 580 | - jumpPrompt('请选择预约时间') | |
| 581 | - break; | |
| 582 | - case "garOrderCompanyTel": | |
| 583 | - jumpPrompt('企业负责人手机号不能为空') | |
| 584 | - break; | |
| 585 | - } | |
| 586 | - console.log("201================="+key); | |
| 587 | - | |
| 588 | - return false; | |
| 589 | - } | |
| 590 | - if (key === "garCarInfoList") { | |
| 591 | - let count = 0; | |
| 592 | - params[key].forEach(item => { | |
| 593 | - count += item.garOrderCarNumber; | |
| 594 | - }) | |
| 595 | - if (count === 0) { | |
| 596 | - jumpPrompt('请添加车辆数量') | |
| 597 | - return false; | |
| 598 | - } | |
| 599 | - } | |
| 600 | - | |
| 601 | - if (key == "imageUrls") { | |
| 602 | - if (params[key].length == 0) { | |
| 603 | - jumpPrompt('请上传现场图片') | |
| 604 | - return false; | |
| 605 | - } | |
| 606 | - if (!validateImage(params[key])) { | |
| 607 | - uni.$u.toast('请等待图片上传完毕') | |
| 608 | - return false; | |
| 609 | - } | |
| 610 | - } | |
| 611 | - } | |
| 612 | - return true; | |
| 613 | -} | |
| 614 | - | |
| 615 | -const jumpPrompt = (msg) => { | |
| 616 | - uni.showModal({ | |
| 617 | - title: '提示', | |
| 618 | - content: msg, | |
| 619 | - showCancel: false, | |
| 620 | - success: function (res) { | |
| 621 | - if (res.confirm) { | |
| 622 | - } else if (res.cancel) { | |
| 623 | - } | |
| 624 | - } | |
| 625 | - }); | |
| 626 | -} | |
| 627 | -const validateImage = (fileList) => { | |
| 628 | - for (let index = 0; index < fileList.length; index++) { | |
| 629 | - const str = fileList[index]; | |
| 630 | - if (!str.startsWith("/profile/upload")) { | |
| 631 | - return false; | |
| 632 | - } | |
| 633 | - } | |
| 634 | - return true; | |
| 635 | -} | |
| 636 | - | |
| 637 | -const garEstimatedCostFocusFun=()=>{ | |
| 638 | - //pageStyle.value="height:2000px"; | |
| 639 | - scrollTop.value=11900 | |
| 640 | - console.log(scrollTop.value); | |
| 641 | - | |
| 642 | -} | |
| 643 | - | |
| 644 | -const garEstimatedCostBlurFun=()=>{ | |
| 645 | - pageStyle.value=""; | |
| 646 | -} | |
| 647 | - | |
| 648 | -// 开始执行一次 | |
| 649 | -watch(carPopupShowFlag, (val) => { | |
| 650 | - // carPopupShowFlag.value = val | |
| 651 | - if (!val) { | |
| 652 | - setTimeout(() => { | |
| 653 | - isCallBtn.value = true; | |
| 654 | - }, 1500) | |
| 655 | - } | |
| 656 | -}, { | |
| 657 | - immediate: true | |
| 658 | -}) | |
| 595 | + const handlerChooseAddress = () => { | |
| 596 | + addressPopupRef.value.open(userAddress.value) | |
| 597 | + } | |
| 598 | + const currentChange = (val) => { | |
| 599 | + userAddress.value = val | |
| 600 | + console.log("currentChange====================>"); | |
| 659 | 601 | |
| 602 | + console.log(userAddress.value); | |
| 603 | + | |
| 604 | + } | |
| 605 | + /** | |
| 606 | + * 校验参数 | |
| 607 | + * @param {Object} params | |
| 608 | + */ | |
| 609 | + const validateParams = (params) => { | |
| 610 | + | |
| 611 | + if (params.garInCarStore && !params.garRemark) { | |
| 612 | + jumpPrompt('请输入限高') | |
| 613 | + return false; | |
| 614 | + } | |
| 615 | + | |
| 616 | + if (!paramFrom.value.sureReadFlag[0]) { | |
| 617 | + jumpPrompt('请勾选"本人已确认信息真实有效,并承担相应法律责任"') | |
| 618 | + return false; | |
| 619 | + } | |
| 620 | + for (const key in params) { | |
| 621 | + // 跳过garInCarStore | |
| 622 | + if (key == "garInCarStore") { | |
| 623 | + continue; | |
| 624 | + } | |
| 625 | + if (!params[key] && key != "garRemark") { | |
| 626 | + switch (key) { | |
| 627 | + case "garOrderAgreementTime": | |
| 628 | + jumpPrompt('请选择预约时间') | |
| 629 | + break; | |
| 630 | + case "garOrderCompanyTel": | |
| 631 | + jumpPrompt('企业负责人手机号不能为空') | |
| 632 | + break; | |
| 633 | + } | |
| 634 | + console.log("201=================" + key); | |
| 635 | + | |
| 636 | + return false; | |
| 637 | + } | |
| 638 | + if (key === "garCarInfoList") { | |
| 639 | + let count = 0; | |
| 640 | + params[key].forEach(item => { | |
| 641 | + count += item.garOrderCarNumber; | |
| 642 | + }) | |
| 643 | + if (count === 0) { | |
| 644 | + jumpPrompt('请添加车辆数量') | |
| 645 | + return false; | |
| 646 | + } | |
| 647 | + } | |
| 648 | + | |
| 649 | + if (key == "imageUrls") { | |
| 650 | + if (params[key].length == 0) { | |
| 651 | + jumpPrompt('请上传现场图片') | |
| 652 | + return false; | |
| 653 | + } | |
| 654 | + if (!validateImage(params[key])) { | |
| 655 | + uni.$u.toast('请等待图片上传完毕') | |
| 656 | + return false; | |
| 657 | + } | |
| 658 | + } | |
| 659 | + } | |
| 660 | + return true; | |
| 661 | + } | |
| 662 | + | |
| 663 | + const jumpPrompt = (msg) => { | |
| 664 | + uni.showModal({ | |
| 665 | + title: '提示', | |
| 666 | + content: msg, | |
| 667 | + showCancel: false, | |
| 668 | + success: function(res) { | |
| 669 | + if (res.confirm) {} else if (res.cancel) {} | |
| 670 | + } | |
| 671 | + }); | |
| 672 | + } | |
| 673 | + const validateImage = (fileList) => { | |
| 674 | + for (let index = 0; index < fileList.length; index++) { | |
| 675 | + const str = fileList[index]; | |
| 676 | + if (!str.includes("/profile/upload")) { | |
| 677 | + return false; | |
| 678 | + } | |
| 679 | + } | |
| 680 | + return true; | |
| 681 | + } | |
| 660 | 682 | |
| 683 | + const garEstimatedCostFocusFun = () => { | |
| 684 | + //pageStyle.value="height:2000px"; | |
| 685 | + scrollTop.value = 11900 | |
| 686 | + console.log(scrollTop.value); | |
| 687 | + | |
| 688 | + } | |
| 689 | + | |
| 690 | + const garEstimatedCostBlurFun = () => { | |
| 691 | + pageStyle.value = ""; | |
| 692 | + } | |
| 693 | + | |
| 694 | + // 开始执行一次 | |
| 695 | + watch(carPopupShowFlag, (val) => { | |
| 696 | + // carPopupShowFlag.value = val | |
| 697 | + if (!val) { | |
| 698 | + setTimeout(() => { | |
| 699 | + isCallBtn.value = true; | |
| 700 | + }, 1500) | |
| 701 | + } | |
| 702 | + }, { | |
| 703 | + immediate: true | |
| 704 | + }) | |
| 661 | 705 | </script> |
| 662 | 706 | |
| 663 | 707 | <style lang="scss" scoped> |
| 664 | -$custom-marin-bottom: 20rpx; | |
| 665 | -$custom-page-padding: 20rpx; | |
| 666 | -$custom-border-radio: 20rpx; | |
| 667 | -$custom-bottom-height: 200rpx; | |
| 708 | + $custom-marin-bottom: 20rpx; | |
| 709 | + $custom-page-padding: 20rpx; | |
| 710 | + $custom-border-radio: 20rpx; | |
| 711 | + $custom-bottom-height: 200rpx; | |
| 712 | + | |
| 713 | + .link { | |
| 714 | + color: blue; | |
| 715 | + } | |
| 668 | 716 | |
| 669 | -.link { | |
| 670 | - color: blue; | |
| 717 | + .swiperHeight1 { | |
| 718 | + height: 280px; | |
| 719 | + text-align: center; | |
| 720 | + justify-content: center; | |
| 671 | 721 | } |
| 672 | 722 | |
| 673 | -.swiperHeight1{ | |
| 674 | - height: 280px; | |
| 675 | - text-align: center; | |
| 676 | - justify-content: center; | |
| 677 | -} | |
| 678 | -.swiperHeight2{ | |
| 679 | - height: 300px; | |
| 680 | - text-align: center; | |
| 681 | - justify-content: center; | |
| 682 | -} | |
| 683 | -.swiperHeight3{ | |
| 684 | - height: 310px; | |
| 685 | - text-align: center; | |
| 686 | - justify-content: center; | |
| 687 | -} | |
| 688 | -.company-clean-container { | |
| 689 | - height: 100%; | |
| 690 | - width: 100%; | |
| 691 | - background-color: $u-info-light; | |
| 692 | - box-sizing: border-box; | |
| 693 | - overflow-y: scroll; | |
| 694 | - | |
| 695 | - | |
| 696 | - .company-clean-container-box { | |
| 697 | - height: 100%; | |
| 698 | - width: 100%; | |
| 699 | - padding: $custom-page-padding; | |
| 700 | - box-sizing: border-box; | |
| 701 | - | |
| 702 | - .company-clean-container-header { | |
| 703 | - padding: $custom-page-padding; | |
| 704 | - box-sizing: border-box; | |
| 705 | - background-color: #ffffff; | |
| 706 | - border-radius: $custom-border-radio; | |
| 707 | - margin-bottom: $custom-marin-bottom; | |
| 708 | - | |
| 709 | - .company-clean-container-header-address { | |
| 710 | - font-size: 30rpx; | |
| 711 | - font-weight: bold; | |
| 712 | - color: $u-main-color; | |
| 713 | - } | |
| 714 | - | |
| 715 | - .company-clean-container-header-base-info { | |
| 716 | - font-size: 25rpx; | |
| 717 | - color: $u-info; | |
| 718 | - line-height: 80rpx; | |
| 719 | - display: flex; | |
| 720 | - | |
| 721 | - .company-clean-container-header-base-info-left { | |
| 722 | - flex: 2; | |
| 723 | - } | |
| 724 | - | |
| 725 | - .company-clean-container-header-base-info-right { | |
| 726 | - flex: 1; | |
| 727 | - display: flex; | |
| 728 | - align-items: center; | |
| 729 | - justify-content: flex-end; | |
| 730 | - | |
| 731 | - .company-clean-container-header-base-info-right-icon { | |
| 732 | - width: 37rpx; | |
| 733 | - height: 37rpx; | |
| 734 | - @include handleClick; | |
| 735 | - display: flex; | |
| 736 | - align-items: center; | |
| 737 | - | |
| 738 | - image { | |
| 739 | - height: 100%; | |
| 740 | - width: 100%; | |
| 741 | - background-size: 100% 100; | |
| 742 | - } | |
| 743 | - } | |
| 744 | - } | |
| 745 | - } | |
| 746 | - | |
| 747 | - .company-clean-container-header-reservation { | |
| 748 | - line-height: 80rpx; | |
| 749 | - display: flex; | |
| 750 | - justify-content: space-between; | |
| 751 | - font-size: 28rpx; | |
| 752 | - @include handleClick; | |
| 753 | - | |
| 754 | - .company-clean-container-header-reservation-left { | |
| 755 | - display: flex; | |
| 756 | - align-items: center; | |
| 757 | - color: $u-content-color; | |
| 758 | - } | |
| 759 | - | |
| 760 | - .company-clean-container-header-reservation-right { | |
| 761 | - display: flex; | |
| 762 | - align-items: center; | |
| 763 | - color: $u-content-color; | |
| 764 | - } | |
| 765 | - } | |
| 766 | - | |
| 767 | - | |
| 768 | - } | |
| 769 | - | |
| 770 | - .company-clean-container-car-main { | |
| 771 | - padding: $custom-page-padding; | |
| 772 | - border-radius: $custom-border-radio; | |
| 773 | - box-sizing: border-box; | |
| 774 | - background-color: #ffffff; | |
| 775 | - margin-bottom: $custom-marin-bottom; | |
| 776 | - | |
| 777 | - .company-clean-container-car-main-title { | |
| 778 | - font-size: 30rpx; | |
| 779 | - font-weight: bold; | |
| 780 | - color: #a9e08f; | |
| 781 | - display: flex; | |
| 782 | - justify-content: center; | |
| 783 | - } | |
| 784 | - | |
| 785 | - .company-clean-container-car-main-content { | |
| 786 | - width: 100%; | |
| 787 | - display: flex; | |
| 788 | - flex-direction: column; | |
| 789 | - justify-content: center; | |
| 790 | - | |
| 791 | - .company-clean-container-car-main-content-img { | |
| 792 | - width: 600rpx; | |
| 793 | - height: 400rpx; | |
| 794 | - | |
| 795 | - .company-clean-container-car-main-content-img { | |
| 796 | - width: 600rpx; | |
| 797 | - height: 400rpx; | |
| 798 | - } | |
| 799 | - } | |
| 800 | - | |
| 801 | - .company-clean-container-car-main-content-remark { | |
| 802 | - color: $u-tips-color; | |
| 803 | - font-size: 23rpx; | |
| 804 | - line-height: 30rpx; | |
| 805 | - padding: $custom-page-padding; | |
| 806 | - background-color: $u-info-light; | |
| 807 | - word-break: break-all; | |
| 808 | - } | |
| 809 | - | |
| 810 | - .company-clean-container-car-main-content-type { | |
| 811 | - margin-top: $custom-marin-bottom; | |
| 812 | - margin-bottom: $custom-marin-bottom; | |
| 813 | - display: flex; | |
| 814 | - justify-content: space-between; | |
| 815 | - border-radius: $custom-border-radio; | |
| 816 | - // background-color: $u-info-light; | |
| 817 | - box-sizing: border-box; | |
| 818 | - | |
| 819 | - .company-clean-container-car-main-content-type-price-area { | |
| 820 | - display: flex; | |
| 821 | - justify-content: flex-start; | |
| 822 | - align-items: center; | |
| 823 | - color: $u-info; | |
| 824 | - white-space: nowrap; | |
| 825 | - width: 100%; | |
| 826 | - } | |
| 827 | - } | |
| 828 | - | |
| 829 | - .company-clean-container-car-main-content-number { | |
| 830 | - display: flex; | |
| 831 | - justify-content: space-between; | |
| 832 | - font-size: 28rpx; | |
| 833 | - color: $u-tips-color; | |
| 834 | - font-weight: small; | |
| 835 | - align-items: center; | |
| 836 | - | |
| 837 | - .company-clean-container-car-main-content-number-txt { | |
| 838 | - line-height: 80rpx; | |
| 839 | - } | |
| 840 | - | |
| 841 | - .company-clean-container-car-main-content-number-button {} | |
| 842 | - } | |
| 843 | - } | |
| 844 | - | |
| 845 | - | |
| 846 | - } | |
| 847 | - | |
| 848 | - .company-clean-container-car-main-content-prompt { | |
| 849 | - color: $u-tips-color; | |
| 850 | - font-size: 23rpx; | |
| 851 | - line-height: 30rpx; | |
| 852 | - padding: $custom-page-padding; | |
| 853 | - word-break: break-all; | |
| 854 | - text-align: center; | |
| 855 | - } | |
| 856 | - | |
| 857 | - .company-clean-container-site-image-info { | |
| 858 | - padding: $custom-page-padding; | |
| 859 | - background-color: #ffffff; | |
| 860 | - border-radius: $custom-border-radio; | |
| 861 | - color: $u-info; | |
| 862 | - font-size: 28rpx; | |
| 863 | - margin-bottom: $custom-marin-bottom; | |
| 864 | - | |
| 865 | - .company-clean-container-site-image-info-remark { | |
| 866 | - line-height: 50rpx; | |
| 867 | - | |
| 868 | - } | |
| 869 | - | |
| 870 | - .company-clean-container-site-image-info-img {} | |
| 871 | - | |
| 872 | - .company-clean-container-site-image-info-input-remark { | |
| 873 | - line-height: 80rpx; | |
| 874 | - } | |
| 875 | - | |
| 876 | - .company-clean-container-site-image-info-input-remark-box {} | |
| 877 | - } | |
| 878 | - | |
| 879 | - .company-clean-container-site-image-info-sure-button { | |
| 880 | - padding-bottom: $custom-bottom-height; | |
| 881 | - font-size: 28rpx; | |
| 882 | - | |
| 883 | - .company-clean-container-site-image-info-sure-button-radio { | |
| 884 | - padding: $custom-page-padding; | |
| 885 | - box-sizing: border-box; | |
| 886 | - display: flex; | |
| 887 | - // flex-flow: row wrap; | |
| 888 | - font-size: 28rpx; | |
| 889 | - color: $u-info; | |
| 890 | - } | |
| 891 | - } | |
| 892 | - } | |
| 893 | - | |
| 894 | - .company-clean-bottom { | |
| 895 | - position: absolute; | |
| 896 | - width: 100%; | |
| 897 | - bottom: 0; | |
| 898 | - left: 0; | |
| 899 | - box-shadow: 0 0 10rpx 0 rgba(0, 0, 0, 0.1); | |
| 900 | - | |
| 901 | - .company-clean-bottom-box { | |
| 902 | - height: $custom-bottom-height; | |
| 903 | - background-color: #ffffff; | |
| 904 | - padding: 50rpx; | |
| 905 | - box-sizing: border-box; | |
| 906 | - display: flex; | |
| 907 | - justify-content: space-between; | |
| 908 | - align-items: center; | |
| 909 | - | |
| 910 | - .company-clean-bottom-left { | |
| 911 | - display: flex; | |
| 912 | - | |
| 913 | - .company-clean-bottom-left-icon { | |
| 914 | - transform: rotateY(180deg); | |
| 915 | - } | |
| 916 | - | |
| 917 | - } | |
| 918 | - | |
| 919 | - .company-clean-bottom-right { | |
| 920 | - min-width: 200rpx; | |
| 921 | - } | |
| 922 | - } | |
| 923 | - | |
| 924 | - } | |
| 925 | - | |
| 926 | - .movableArea { | |
| 927 | - pointer-events: none; | |
| 928 | - position: absolute; | |
| 929 | - left: 0; | |
| 930 | - bottom: 240rpx; | |
| 931 | - width: 100%; | |
| 932 | - z-index: 99; | |
| 933 | - | |
| 934 | - .movableView { | |
| 935 | - box-sizing: border-box; | |
| 936 | - | |
| 937 | - display: flex; | |
| 938 | - justify-content: flex-end; | |
| 939 | - margin-right: 50rpx; | |
| 940 | - | |
| 941 | - .company-clean-call-box-container { | |
| 942 | - max-height: 60rpx; | |
| 943 | - max-width: 60rpx; | |
| 944 | - display: flex; | |
| 945 | - align-items: center; | |
| 946 | - justify-content: center; | |
| 947 | - background-color: #19a97c; | |
| 948 | - border-radius: 100%; | |
| 949 | - padding: 5rpx; | |
| 950 | - } | |
| 951 | - } | |
| 952 | - } | |
| 953 | - | |
| 954 | - | |
| 955 | - | |
| 956 | -} | |
| 957 | - | |
| 958 | -.hoverClickStyle { | |
| 959 | - @include handleClick; | |
| 960 | -} | |
| 961 | - | |
| 962 | -// 弹出框 | |
| 963 | -.company-clean-container-car-popup { | |
| 964 | - box-sizing: border-box; | |
| 965 | - color: $u-info; | |
| 966 | - | |
| 967 | - .company-clean-container-car-popup-content { | |
| 968 | - font-size: 28rpx; | |
| 969 | - | |
| 970 | - .company-clean-container-car-popup-content-box { | |
| 971 | - box-sizing: border-box; | |
| 972 | - padding: 0 $custom-page-padding; | |
| 973 | - border-radius: 10rpx; | |
| 974 | - border: 1rpx solid $u-info; | |
| 975 | - | |
| 976 | - .company-clean-container-car-popup-content-box-item { | |
| 977 | - display: flex; | |
| 978 | - align-items: center; | |
| 979 | - justify-content: space-between; | |
| 980 | - margin: 20rpx 0; | |
| 981 | - box-sizing: border-box; | |
| 982 | - | |
| 983 | - .company-clean-container-car-popup-content-box-item-text {} | |
| 984 | - | |
| 985 | - .company-clean-container-car-popup-content-box-item-number {} | |
| 986 | - } | |
| 987 | - } | |
| 988 | - | |
| 989 | - .company-clean-container-car-popup-content-title { | |
| 990 | - color: $u-info; | |
| 991 | - box-sizing: border-box; | |
| 992 | - font-size: 30rpx !important; | |
| 993 | - line-height: 30rpx; | |
| 994 | - margin-bottom: 20rpx; | |
| 995 | - } | |
| 996 | - } | |
| 997 | - | |
| 998 | - .company-clean-container-car-popup-button-safe { | |
| 999 | - width: 100%; | |
| 1000 | - height: $custom-bottom-height; | |
| 1001 | - } | |
| 1002 | -} | |
| 1003 | - | |
| 1004 | -.company-in-car-store-box-text-yes { | |
| 1005 | - background: #19a97c; | |
| 1006 | -} | |
| 1007 | - | |
| 1008 | -.company-in-car-store-box-text-no { | |
| 1009 | - background: #909399; | |
| 1010 | -} | |
| 1011 | -</style> | |
| 723 | + .swiperHeight2 { | |
| 724 | + height: 300px; | |
| 725 | + text-align: center; | |
| 726 | + justify-content: center; | |
| 727 | + } | |
| 728 | + | |
| 729 | + .swiperHeight3 { | |
| 730 | + height: 310px; | |
| 731 | + text-align: center; | |
| 732 | + justify-content: center; | |
| 733 | + } | |
| 734 | + | |
| 735 | + .company-clean-container { | |
| 736 | + height: 100%; | |
| 737 | + width: 100%; | |
| 738 | + background-color: $u-info-light; | |
| 739 | + box-sizing: border-box; | |
| 740 | + overflow-y: scroll; | |
| 741 | + | |
| 742 | + | |
| 743 | + .company-clean-container-box { | |
| 744 | + height: 100%; | |
| 745 | + width: 100%; | |
| 746 | + padding: $custom-page-padding; | |
| 747 | + box-sizing: border-box; | |
| 748 | + | |
| 749 | + .company-clean-container-header { | |
| 750 | + padding: $custom-page-padding; | |
| 751 | + box-sizing: border-box; | |
| 752 | + background-color: #ffffff; | |
| 753 | + border-radius: $custom-border-radio; | |
| 754 | + margin-bottom: $custom-marin-bottom; | |
| 755 | + | |
| 756 | + .company-clean-container-header-address { | |
| 757 | + font-size: 30rpx; | |
| 758 | + font-weight: bold; | |
| 759 | + color: $u-main-color; | |
| 760 | + } | |
| 761 | + | |
| 762 | + .company-clean-container-header-base-info { | |
| 763 | + font-size: 25rpx; | |
| 764 | + color: $u-info; | |
| 765 | + line-height: 80rpx; | |
| 766 | + display: flex; | |
| 767 | + | |
| 768 | + .company-clean-container-header-base-info-left { | |
| 769 | + flex: 2; | |
| 770 | + } | |
| 771 | + | |
| 772 | + .company-clean-container-header-base-info-right { | |
| 773 | + flex: 1; | |
| 774 | + display: flex; | |
| 775 | + align-items: center; | |
| 776 | + justify-content: flex-end; | |
| 777 | + | |
| 778 | + .company-clean-container-header-base-info-right-icon { | |
| 779 | + width: 37rpx; | |
| 780 | + height: 37rpx; | |
| 781 | + @include handleClick; | |
| 782 | + display: flex; | |
| 783 | + align-items: center; | |
| 784 | + | |
| 785 | + image { | |
| 786 | + height: 100%; | |
| 787 | + width: 100%; | |
| 788 | + background-size: 100% 100; | |
| 789 | + } | |
| 790 | + } | |
| 791 | + } | |
| 792 | + } | |
| 793 | + | |
| 794 | + .company-clean-container-header-reservation { | |
| 795 | + line-height: 80rpx; | |
| 796 | + display: flex; | |
| 797 | + justify-content: space-between; | |
| 798 | + font-size: 28rpx; | |
| 799 | + @include handleClick; | |
| 800 | + | |
| 801 | + .company-clean-container-header-reservation-left { | |
| 802 | + display: flex; | |
| 803 | + align-items: center; | |
| 804 | + color: $u-content-color; | |
| 805 | + } | |
| 806 | + | |
| 807 | + .company-clean-container-header-reservation-right { | |
| 808 | + display: flex; | |
| 809 | + align-items: center; | |
| 810 | + color: $u-content-color; | |
| 811 | + } | |
| 812 | + } | |
| 813 | + | |
| 814 | + | |
| 815 | + } | |
| 816 | + | |
| 817 | + .company-clean-container-car-main { | |
| 818 | + padding: $custom-page-padding; | |
| 819 | + border-radius: $custom-border-radio; | |
| 820 | + box-sizing: border-box; | |
| 821 | + background-color: #ffffff; | |
| 822 | + margin-bottom: $custom-marin-bottom; | |
| 823 | + | |
| 824 | + .company-clean-container-car-main-title { | |
| 825 | + font-size: 30rpx; | |
| 826 | + font-weight: bold; | |
| 827 | + color: #a9e08f; | |
| 828 | + display: flex; | |
| 829 | + justify-content: center; | |
| 830 | + } | |
| 831 | + | |
| 832 | + .company-clean-container-car-main-content { | |
| 833 | + width: 100%; | |
| 834 | + display: flex; | |
| 835 | + flex-direction: column; | |
| 836 | + justify-content: center; | |
| 837 | + | |
| 838 | + .company-clean-container-car-main-content-img { | |
| 839 | + width: 600rpx; | |
| 840 | + height: 400rpx; | |
| 841 | + | |
| 842 | + .company-clean-container-car-main-content-img { | |
| 843 | + width: 600rpx; | |
| 844 | + height: 400rpx; | |
| 845 | + } | |
| 846 | + } | |
| 847 | + | |
| 848 | + .company-clean-container-car-main-content-remark { | |
| 849 | + color: $u-tips-color; | |
| 850 | + font-size: 23rpx; | |
| 851 | + line-height: 30rpx; | |
| 852 | + padding: $custom-page-padding; | |
| 853 | + background-color: $u-info-light; | |
| 854 | + word-break: break-all; | |
| 855 | + } | |
| 856 | + | |
| 857 | + .company-clean-container-car-main-content-type { | |
| 858 | + margin-top: $custom-marin-bottom; | |
| 859 | + margin-bottom: $custom-marin-bottom; | |
| 860 | + display: flex; | |
| 861 | + justify-content: space-between; | |
| 862 | + border-radius: $custom-border-radio; | |
| 863 | + // background-color: $u-info-light; | |
| 864 | + box-sizing: border-box; | |
| 865 | + | |
| 866 | + .company-clean-container-car-main-content-type-price-area { | |
| 867 | + display: flex; | |
| 868 | + justify-content: flex-start; | |
| 869 | + align-items: center; | |
| 870 | + color: $u-info; | |
| 871 | + white-space: nowrap; | |
| 872 | + width: 100%; | |
| 873 | + } | |
| 874 | + } | |
| 875 | + | |
| 876 | + .company-clean-container-car-main-content-number { | |
| 877 | + display: flex; | |
| 878 | + justify-content: space-between; | |
| 879 | + font-size: 28rpx; | |
| 880 | + color: $u-tips-color; | |
| 881 | + font-weight: small; | |
| 882 | + align-items: center; | |
| 883 | + | |
| 884 | + .company-clean-container-car-main-content-number-txt { | |
| 885 | + line-height: 80rpx; | |
| 886 | + } | |
| 887 | + | |
| 888 | + .company-clean-container-car-main-content-number-button {} | |
| 889 | + } | |
| 890 | + } | |
| 891 | + | |
| 892 | + | |
| 893 | + } | |
| 894 | + | |
| 895 | + .company-clean-container-car-main-content-prompt { | |
| 896 | + color: $u-tips-color; | |
| 897 | + font-size: 23rpx; | |
| 898 | + line-height: 30rpx; | |
| 899 | + padding: $custom-page-padding; | |
| 900 | + word-break: break-all; | |
| 901 | + text-align: center; | |
| 902 | + } | |
| 903 | + | |
| 904 | + .company-clean-container-site-image-info { | |
| 905 | + padding: $custom-page-padding; | |
| 906 | + background-color: #ffffff; | |
| 907 | + border-radius: $custom-border-radio; | |
| 908 | + color: $u-info; | |
| 909 | + font-size: 28rpx; | |
| 910 | + margin-bottom: $custom-marin-bottom; | |
| 911 | + | |
| 912 | + .company-clean-container-site-image-info-remark { | |
| 913 | + line-height: 50rpx; | |
| 914 | + | |
| 915 | + } | |
| 916 | + | |
| 917 | + .company-clean-container-site-image-info-img {} | |
| 918 | + | |
| 919 | + .company-clean-container-site-image-info-input-remark { | |
| 920 | + line-height: 80rpx; | |
| 921 | + } | |
| 922 | + | |
| 923 | + .company-clean-container-site-image-info-input-remark-box {} | |
| 924 | + } | |
| 925 | + | |
| 926 | + .company-clean-container-site-image-info-sure-button { | |
| 927 | + padding-bottom: $custom-bottom-height; | |
| 928 | + font-size: 28rpx; | |
| 929 | + | |
| 930 | + .company-clean-container-site-image-info-sure-button-radio { | |
| 931 | + padding: $custom-page-padding; | |
| 932 | + box-sizing: border-box; | |
| 933 | + display: flex; | |
| 934 | + // flex-flow: row wrap; | |
| 935 | + font-size: 28rpx; | |
| 936 | + color: $u-info; | |
| 937 | + } | |
| 938 | + } | |
| 939 | + } | |
| 940 | + | |
| 941 | + .company-clean-bottom { | |
| 942 | + position: absolute; | |
| 943 | + width: 100%; | |
| 944 | + bottom: 0; | |
| 945 | + left: 0; | |
| 946 | + box-shadow: 0 0 10rpx 0 rgba(0, 0, 0, 0.1); | |
| 947 | + | |
| 948 | + .company-clean-bottom-box { | |
| 949 | + height: $custom-bottom-height; | |
| 950 | + background-color: #ffffff; | |
| 951 | + padding: 50rpx; | |
| 952 | + box-sizing: border-box; | |
| 953 | + display: flex; | |
| 954 | + justify-content: space-between; | |
| 955 | + align-items: center; | |
| 956 | + | |
| 957 | + .company-clean-bottom-left { | |
| 958 | + display: flex; | |
| 959 | + | |
| 960 | + .company-clean-bottom-left-icon { | |
| 961 | + transform: rotateY(180deg); | |
| 962 | + } | |
| 963 | + | |
| 964 | + } | |
| 965 | + | |
| 966 | + .company-clean-bottom-right { | |
| 967 | + min-width: 200rpx; | |
| 968 | + } | |
| 969 | + } | |
| 970 | + | |
| 971 | + } | |
| 972 | + | |
| 973 | + .movableArea { | |
| 974 | + pointer-events: none; | |
| 975 | + position: absolute; | |
| 976 | + left: 0; | |
| 977 | + bottom: 240rpx; | |
| 978 | + width: 100%; | |
| 979 | + z-index: 99; | |
| 980 | + | |
| 981 | + .movableView { | |
| 982 | + box-sizing: border-box; | |
| 983 | + | |
| 984 | + display: flex; | |
| 985 | + justify-content: flex-end; | |
| 986 | + margin-right: 50rpx; | |
| 987 | + | |
| 988 | + .company-clean-call-box-container { | |
| 989 | + max-height: 60rpx; | |
| 990 | + max-width: 60rpx; | |
| 991 | + display: flex; | |
| 992 | + align-items: center; | |
| 993 | + justify-content: center; | |
| 994 | + background-color: #19a97c; | |
| 995 | + border-radius: 100%; | |
| 996 | + padding: 5rpx; | |
| 997 | + } | |
| 998 | + } | |
| 999 | + } | |
| 1000 | + | |
| 1001 | + | |
| 1002 | + | |
| 1003 | + } | |
| 1004 | + | |
| 1005 | + .hoverClickStyle { | |
| 1006 | + @include handleClick; | |
| 1007 | + } | |
| 1008 | + | |
| 1009 | + // 弹出框 | |
| 1010 | + .company-clean-container-car-popup { | |
| 1011 | + box-sizing: border-box; | |
| 1012 | + color: $u-info; | |
| 1013 | + | |
| 1014 | + .company-clean-container-car-popup-content { | |
| 1015 | + font-size: 28rpx; | |
| 1016 | + | |
| 1017 | + .company-clean-container-car-popup-content-box { | |
| 1018 | + box-sizing: border-box; | |
| 1019 | + padding: 0 $custom-page-padding; | |
| 1020 | + border-radius: 10rpx; | |
| 1021 | + border: 1rpx solid $u-info; | |
| 1022 | + | |
| 1023 | + .company-clean-container-car-popup-content-box-item { | |
| 1024 | + display: flex; | |
| 1025 | + align-items: center; | |
| 1026 | + justify-content: space-between; | |
| 1027 | + margin: 20rpx 0; | |
| 1028 | + box-sizing: border-box; | |
| 1029 | + | |
| 1030 | + .company-clean-container-car-popup-content-box-item-text {} | |
| 1031 | + | |
| 1032 | + .company-clean-container-car-popup-content-box-item-number {} | |
| 1033 | + } | |
| 1034 | + } | |
| 1035 | + | |
| 1036 | + .company-clean-container-car-popup-content-title { | |
| 1037 | + color: $u-info; | |
| 1038 | + box-sizing: border-box; | |
| 1039 | + font-size: 30rpx !important; | |
| 1040 | + line-height: 30rpx; | |
| 1041 | + margin-bottom: 20rpx; | |
| 1042 | + } | |
| 1043 | + } | |
| 1044 | + | |
| 1045 | + .company-clean-container-car-popup-button-safe { | |
| 1046 | + width: 100%; | |
| 1047 | + height: $custom-bottom-height; | |
| 1048 | + } | |
| 1049 | + } | |
| 1050 | + | |
| 1051 | + .company-in-car-store-box-text-yes { | |
| 1052 | + background: #19a97c; | |
| 1053 | + } | |
| 1054 | + | |
| 1055 | + .company-in-car-store-box-text-no { | |
| 1056 | + background: #909399; | |
| 1057 | + } | |
| 1058 | +</style> | |
| 1012 | 1059 | \ No newline at end of file | ... | ... |
garbage-removal/src/pages/login/code.vue
garbage-removal/src/pages/login/index.vue
| ... | ... | @@ -5,7 +5,7 @@ |
| 5 | 5 | <view class="content"> |
| 6 | 6 | <view class="title">欢迎登录</view> |
| 7 | 7 | <input class="u-border-bottom" type="number" v-model="tel" placeholder="请输入手机号" /> |
| 8 | - <view class="tips">未注册的手机号验证后自动创建账号</view> | |
| 8 | + <!-- <view class="tips">未注册的手机号验证后自动创建账号</view> --> | |
| 9 | 9 | <button @tap="submit" :style="[inputStyle]" class="getCaptcha">获取短信验证码</button> |
| 10 | 10 | <view class="alternative"> |
| 11 | 11 | </view> | ... | ... |
garbage-removal/src/pages/order-info/order-disposal/scan-detail/index.vue
| ... | ... | @@ -102,7 +102,8 @@ |
| 102 | 102 | } from '@dcloudio/uni-app'; |
| 103 | 103 | import { |
| 104 | 104 | computed, |
| 105 | - ref | |
| 105 | + ref, | |
| 106 | + onMounted | |
| 106 | 107 | } from 'vue'; |
| 107 | 108 | const details = ref({}); |
| 108 | 109 | const fileList = ref([]); |
| ... | ... | @@ -113,9 +114,36 @@ |
| 113 | 114 | fileList.value.splice(event.index, 1); |
| 114 | 115 | }; |
| 115 | 116 | |
| 117 | + | |
| 118 | + const location = ref({}); | |
| 119 | + | |
| 120 | + const takeLocalCallBack = (lngLat) => { | |
| 121 | + const ll = lngLat.split(","); | |
| 122 | + console.log(ll); | |
| 123 | + location.value = { | |
| 124 | + longitude: ll[0], | |
| 125 | + latitude: ll[1] | |
| 126 | + }; | |
| 127 | + } | |
| 128 | + | |
| 129 | + // 生命周期处理 | |
| 130 | + onMounted(() => { | |
| 131 | + // 挂载全局回调 | |
| 132 | + window.takeLocationCallBack = takeLocalCallBack | |
| 133 | + }) | |
| 134 | + | |
| 135 | + const takeLocation = () => { | |
| 136 | + console.log("获取定位信息"); | |
| 137 | + // 获取定位信息 | |
| 138 | + window.JsInterface.takeLocation(); | |
| 139 | + } | |
| 140 | + | |
| 141 | + | |
| 116 | 142 | const isNew = ref(false) |
| 117 | 143 | // 新增图片 |
| 118 | 144 | const afterRead = async (event) => { |
| 145 | + // 获取定位信息 | |
| 146 | + takeLocation(); | |
| 119 | 147 | // 当设置 mutiple 为 true 时, file 为数组格式,否则为对象格式 |
| 120 | 148 | let lists = [].concat(event.file); |
| 121 | 149 | let fileListLen = fileList.value.length; |
| ... | ... | @@ -126,66 +154,70 @@ |
| 126 | 154 | message: '上传中', |
| 127 | 155 | }); |
| 128 | 156 | }); |
| 157 | + // 将blob转为file对象的方法 | |
| 158 | + function blobToFile(blob, fileName) { | |
| 159 | + return new File([blob], fileName, { | |
| 160 | + type: 'image/png' | |
| 161 | + }) | |
| 162 | + } | |
| 129 | 163 | for (let i = 0; i < lists.length; i++) { |
| 130 | - let requestPath = import.meta.env.VITE_BASE_URL + import.meta.env.VITE_BASE_FILE_UPLOAD_PREFIX; | |
| 131 | - const result = await uploadFilePromise(requestPath, lists[i].url); | |
| 132 | - let item = fileList.value[fileListLen]; | |
| 133 | - fileList.value.splice(fileListLen, 1, { | |
| 134 | - ...item, | |
| 135 | - status: 'success', | |
| 136 | - message: '', | |
| 137 | - url: result.data.fileName, | |
| 138 | - }); | |
| 139 | - fileListLen++; | |
| 164 | + // 获取blob对象 | |
| 165 | + fetch(lists[i].url) | |
| 166 | + .then(response => response.blob()) | |
| 167 | + .then(blob => { | |
| 168 | + // 将blob转换为file | |
| 169 | + let fileN = blobToFile(blob, lists[i].name) | |
| 170 | + // 上传file对象 | |
| 171 | + let requestPath = import.meta.env.VITE_BASE_URL + import.meta.env | |
| 172 | + .VITE_BASE_FILE_UPLOAD_PREFIX; | |
| 173 | + uploadFilePromise(requestPath, fileN).then(result => { | |
| 174 | + let item = fileList.value[fileListLen]; | |
| 175 | + fileList.value.splice(fileListLen, 1, { | |
| 176 | + ...item, | |
| 177 | + status: 'success', | |
| 178 | + message: '', | |
| 179 | + url: result.data.url, | |
| 180 | + }); | |
| 181 | + fileListLen++; | |
| 182 | + }); | |
| 183 | + | |
| 184 | + }) | |
| 140 | 185 | } |
| 141 | 186 | }; |
| 142 | 187 | const handlerInputChange = (val) => { |
| 143 | 188 | console.log(val); |
| 144 | 189 | } |
| 145 | 190 | const handlerSubmit = async () => { |
| 146 | - try { | |
| 147 | - // 获取定位信息 | |
| 148 | - const location = await new Promise((resolve, reject) => { | |
| 149 | - uni.getLocation({ | |
| 150 | - type: 'wgs84', | |
| 151 | - success: resolve, | |
| 152 | - fail: reject | |
| 153 | - }); | |
| 154 | - }); | |
| 155 | - // 校验参数 | |
| 156 | - let params = { | |
| 157 | - ...details.value, | |
| 158 | - fillImageList: fileList.value.map((item) => item.url), | |
| 159 | - garOrderHandlerCompanyName: details.value.garOrderCompanyName, | |
| 160 | - garOrderHandlerCompanyId: details.value.garOrderCompanyId, | |
| 161 | - // 添加定位信息 | |
| 162 | - latitude: location.latitude, | |
| 163 | - longitude: location.longitude | |
| 164 | - } | |
| 165 | - if (validateParams(params)) { | |
| 166 | - await askTransport(params).then((res) => { | |
| 167 | - console.log(res); | |
| 168 | - if (res.data.code == 200) { | |
| 169 | - uni.$u.toast("当前趟次记录完毕!") | |
| 170 | - } | |
| 171 | - }).catch((err) => { | |
| 172 | - uni.$u.toast("当前趟次记录失败") | |
| 173 | - }) | |
| 174 | - // 返回上级 | |
| 175 | - uni.navigateBack({ | |
| 176 | - delta: 1 | |
| 177 | - }); | |
| 178 | - } | |
| 179 | - } catch (error) { | |
| 180 | - console.error('定位获取失败:', error); | |
| 191 | + if (typeof(location.value.latitude) === 'undefined') { | |
| 192 | + console.log('定位获取失败', ); | |
| 181 | 193 | uni.$u.toast("需要位置权限才能提交"); |
| 182 | - // 可选:引导用户打开设置 | |
| 183 | - uni.openSetting({ | |
| 184 | - success(res) { | |
| 185 | - console.log('授权设置:', res.authSetting); | |
| 194 | + return; | |
| 195 | + } | |
| 196 | + // 校验参数 | |
| 197 | + let params = { | |
| 198 | + ...details.value, | |
| 199 | + fillImageList: fileList.value.map((item) => item.url), | |
| 200 | + garOrderHandlerCompanyName: details.value.garOrderCompanyName, | |
| 201 | + garOrderHandlerCompanyId: details.value.garOrderCompanyId, | |
| 202 | + // 添加定位信息 | |
| 203 | + latitude: location.value.latitude, | |
| 204 | + longitude: location.value.longitude | |
| 205 | + } | |
| 206 | + if (validateParams(params)) { | |
| 207 | + await askTransport(params).then((res) => { | |
| 208 | + console.log(res); | |
| 209 | + if (res.data.code == 200) { | |
| 210 | + uni.$u.toast("当前趟次记录完毕!") | |
| 186 | 211 | } |
| 212 | + }).catch((err) => { | |
| 213 | + uni.$u.toast("当前趟次记录失败") | |
| 214 | + }) | |
| 215 | + // 返回上级 | |
| 216 | + uni.navigateBack({ | |
| 217 | + delta: 1 | |
| 187 | 218 | }); |
| 188 | 219 | } |
| 220 | + | |
| 189 | 221 | } |
| 190 | 222 | |
| 191 | 223 | const validateParams = (params) => { |
| ... | ... | @@ -215,7 +247,7 @@ |
| 215 | 247 | if (fillImageList instanceof Array && fillImageList.length > 0) { |
| 216 | 248 | for (let index = 0; index < fillImageList.length; index++) { |
| 217 | 249 | const str = fillImageList[index]; |
| 218 | - if (!str.startsWith("/profile/upload")) { | |
| 250 | + if (!str.includes("/profile/upload")) { | |
| 219 | 251 | uni.$u.toast("请等待图片上传~"); |
| 220 | 252 | return false; |
| 221 | 253 | } | ... | ... |
garbage-removal/src/pages/order-info/order-disposal/transport-detail/index.vue
| ... | ... | @@ -159,7 +159,7 @@ const handleOrderDetail = (orderId) => { |
| 159 | 159 | element.fillImage = import.meta.env.VITE_BASE_URL + element.fillImage |
| 160 | 160 | }) |
| 161 | 161 | currentImages.value = dataGram.value.currentImages.map(element => { |
| 162 | - return { url: import.meta.env.VITE_BASE_URL + element } | |
| 162 | + return { url: element } | |
| 163 | 163 | }); |
| 164 | 164 | transportWeightCount.value = dataGram.value.transportDetails.reduce((pre, cur) => { |
| 165 | 165 | console.log(pre, cur); | ... | ... |
garbage-removal/src/pages/order-info/order-driver/detail/index.vue
| ... | ... | @@ -284,13 +284,13 @@ const handleOrderDetail = (orderId) => { |
| 284 | 284 | dataGram.value = res.data.data; |
| 285 | 285 | console.log(res.data.data); |
| 286 | 286 | currentImages.value = res.data.data.currentImages.map(item => { |
| 287 | - return { url: import.meta.env.VITE_BASE_URL + item }; | |
| 287 | + return { url: item }; | |
| 288 | 288 | }); |
| 289 | 289 | putOnImages.value = res.data.data.putOnImages.map(item => { |
| 290 | - return { url: import.meta.env.VITE_BASE_URL + item }; | |
| 290 | + return { url: item }; | |
| 291 | 291 | }); |
| 292 | 292 | putDownImages.value = res.data.data.putDownImages.map(item => { |
| 293 | - return { url: import.meta.env.VITE_BASE_URL + item }; | |
| 293 | + return { url: item }; | |
| 294 | 294 | }); |
| 295 | 295 | }) |
| 296 | 296 | } | ... | ... |
garbage-removal/src/pages/order-info/order-driver/upload/index.vue
| 1 | 1 | <template> |
| 2 | - <view class="upload-image-box"> | |
| 3 | - <view class="upload-image-box-choose"> | |
| 4 | - <text class="upload-image-box-choose-txt">请选着上传图片类型:</text> | |
| 5 | - <view class="upload-image-box-choose-type"> | |
| 6 | - <u-radio-group v-model="putType" @change="groupChange" placement="row"> | |
| 7 | - <u-radio activeColor="#19be6b" :customStyle="{ marginBottom: '8px' }" size="28" labelSize="28" | |
| 8 | - v-for="(item, index) in chooseList" :key="index" :label="item.name" :name="item.name" @change="radioChange"> | |
| 9 | - </u-radio> | |
| 10 | - </u-radio-group> | |
| 11 | - </view> | |
| 12 | - </view> | |
| 13 | - <view class="upload-image-box-bottom"> | |
| 14 | - <text class="upload-image-box-bottom-txt">{{ putType }}(最多上传10张)</text> | |
| 15 | - <view class="upload-image-box-button-container"> | |
| 16 | - <u-upload :fileList="fileList" @afterRead="afterRead" @delete="deletePic" name="3" multiple :maxCount="10" | |
| 17 | - :previewFullImage="true" width="200" height="150"></u-upload> | |
| 18 | - </view> | |
| 19 | - </view> | |
| 20 | - <view class="upload-image-box-submit-box"> | |
| 21 | - <view class="upload-image-box-submit-box-button" @click="handleSubmit(orderId, putType,driver,carPlate)"> | |
| 22 | - <view class="upload-image-box-submit-box-button-container"> | |
| 23 | - <up-button color="#19be6b" type="primary" shape="square" text="确定"></up-button> | |
| 24 | - </view> | |
| 25 | - </view> | |
| 26 | - </view> | |
| 27 | - </view> | |
| 2 | + <view class="upload-image-box"> | |
| 3 | + <view class="upload-image-box-choose"> | |
| 4 | + <text class="upload-image-box-choose-txt">请选着上传图片类型:</text> | |
| 5 | + <view class="upload-image-box-choose-type"> | |
| 6 | + <u-radio-group v-model="putType" @change="groupChange" placement="row"> | |
| 7 | + <u-radio activeColor="#19be6b" :customStyle="{ marginBottom: '8px' }" size="28" labelSize="28" | |
| 8 | + v-for="(item, index) in chooseList" :key="index" :label="item.name" :name="item.name" | |
| 9 | + @change="radioChange"> | |
| 10 | + </u-radio> | |
| 11 | + </u-radio-group> | |
| 12 | + </view> | |
| 13 | + </view> | |
| 14 | + <view class="upload-image-box-bottom"> | |
| 15 | + <text class="upload-image-box-bottom-txt">{{ putType }}(最多上传10张)</text> | |
| 16 | + <view class="upload-image-box-button-container"> | |
| 17 | + <u-upload :fileList="fileList" @afterRead="afterRead" @delete="deletePic" name="3" multiple | |
| 18 | + :maxCount="10" :previewFullImage="true" width="200" height="150"></u-upload> | |
| 19 | + </view> | |
| 20 | + </view> | |
| 21 | + <view class="upload-image-box-submit-box"> | |
| 22 | + <view class="upload-image-box-submit-box-button" @click="handleSubmit(orderId, putType,driver,carPlate)"> | |
| 23 | + <view class="upload-image-box-submit-box-button-container"> | |
| 24 | + <up-button color="#19be6b" type="primary" shape="square" text="确定"></up-button> | |
| 25 | + </view> | |
| 26 | + </view> | |
| 27 | + </view> | |
| 28 | + </view> | |
| 28 | 29 | </template> |
| 29 | 30 | |
| 30 | 31 | <script setup> |
| 31 | -import { uploadFilePromise } from '@/apis/common.js'; | |
| 32 | -import { uploadImageUrlByType } from '@/apis/order.js'; | |
| 33 | -import { onLoad } from '@dcloudio/uni-app'; | |
| 34 | -import { reactive, ref } from 'vue'; | |
| 35 | -import { useMainStore } from '@/stores/index.js'; | |
| 36 | -const store = useMainStore(); | |
| 37 | -const putType = ref("装车图片") | |
| 38 | -const orderId = ref(); | |
| 39 | -const carPlate = ref(); | |
| 40 | -const driver = ref(); | |
| 41 | -const fileList = ref([]) | |
| 42 | -const chooseList = reactive([{ name: "装车图片" }, { name: "卸车图片" }]) | |
| 43 | -// 删除图片 | |
| 44 | -const deletePic = (event) => { | |
| 45 | - fileList.value.splice(event.index, 1); | |
| 46 | -}; | |
| 47 | - | |
| 48 | -// 新增图片 | |
| 49 | -const afterRead = async (event) => { | |
| 50 | - // 当设置 mutiple 为 true 时, file 为数组格式,否则为对象格式 | |
| 51 | - let lists = [].concat(event.file); | |
| 52 | - let fileListLen = fileList.value.length; | |
| 53 | - lists.map((item) => { | |
| 54 | - fileList.value.push({ | |
| 55 | - ...item, | |
| 56 | - status: 'uploading', | |
| 57 | - message: '上传中', | |
| 58 | - }); | |
| 59 | - }); | |
| 60 | - for (let i = 0; i < lists.length; i++) { | |
| 61 | - let requestPath = import.meta.env.VITE_BASE_URL + import.meta.env.VITE_BASE_FILE_UPLOAD_PREFIX; | |
| 62 | - const result = await uploadFilePromise(requestPath, lists[i].url); | |
| 63 | - let item = fileList.value[fileListLen]; | |
| 64 | - fileList.value.splice(fileListLen, 1, { | |
| 65 | - ...item, | |
| 66 | - status: 'success', | |
| 67 | - message: '', | |
| 68 | - url: result.data.fileName, | |
| 69 | - }); | |
| 70 | - fileListLen++; | |
| 71 | - } | |
| 72 | -}; | |
| 73 | -// 提交图片 | |
| 74 | -const handleSubmit = async (id, type, driver, carPlate) => { | |
| 75 | - try { | |
| 76 | - // 获取定位信息 | |
| 77 | - const location = await new Promise((resolve, reject) => { | |
| 78 | - uni.getLocation({ | |
| 79 | - type: 'wgs84', | |
| 80 | - success: resolve, | |
| 81 | - fail: reject | |
| 82 | - }); | |
| 83 | - }); | |
| 84 | - | |
| 85 | - if (!validateImage()) { | |
| 86 | - uni.$u.toast("请等待图片上传~") | |
| 87 | - return | |
| 88 | - } | |
| 89 | - | |
| 90 | - const userPhone = store.userPhone; | |
| 91 | - let params = { | |
| 92 | - garOrderId: id, | |
| 93 | - driver: driver, | |
| 94 | - carPlate: carPlate, | |
| 95 | - userPhone: userPhone, | |
| 96 | - type: type == "装车图片" ? 1 : 2, | |
| 97 | - imageUrls: fileList.value.map(item => item.url), | |
| 98 | - // 添加定位信息 | |
| 99 | - latitude: location.latitude, | |
| 100 | - longitude: location.longitude | |
| 101 | - } | |
| 102 | - | |
| 103 | - if(params.imageUrls && params.imageUrls.length == 0){ | |
| 104 | - uni.$u.toast("请上传现场图片"); | |
| 105 | - return; | |
| 106 | - } | |
| 107 | - | |
| 108 | - uploadImageUrlByType(params).then(res => { | |
| 109 | - if (res.data.success) { | |
| 110 | - uni.$u.toast("图片上传完毕!"); | |
| 111 | - setTimeout(() => { | |
| 112 | - uni.$u.route({ | |
| 113 | - type: 'navigateBack', | |
| 114 | - url: `pages/order-info/order-other/detail/index`, | |
| 115 | - }) | |
| 116 | - }, 300) | |
| 117 | - } | |
| 118 | - }) | |
| 119 | - | |
| 120 | - } catch (error) { | |
| 121 | - console.error('定位获取失败:', error); | |
| 122 | - uni.$u.toast("需要位置权限才能提交"); | |
| 123 | - // 可选:引导用户打开设置 | |
| 124 | - uni.openSetting({ | |
| 125 | - success(res) { | |
| 126 | - console.log('授权设置:', res.authSetting); | |
| 127 | - } | |
| 128 | - }); | |
| 129 | - } | |
| 130 | -} | |
| 131 | -// 提交图片 | |
| 132 | -// const handleSubmit = async (id, type,driver,carPlate) => { | |
| 133 | -// if (!validateImage()) { | |
| 134 | -// uni.$u.toast("请等待图片上传~") | |
| 135 | -// return | |
| 136 | -// } | |
| 137 | -// const userPhone = store.userPhone; | |
| 138 | -// let params = { | |
| 139 | -// garOrderId: id, | |
| 140 | -// driver:driver, | |
| 141 | -// carPlate:carPlate, | |
| 142 | -// userPhone:userPhone, | |
| 143 | -// type: type == "装车图片" ? 1 : 2, | |
| 144 | -// imageUrls: fileList.value.map(item => item.url) | |
| 145 | -// } | |
| 146 | -// if(params.imageUrls && params.imageUrls.length == 0){ | |
| 147 | -// uni.$u.toast("请上传现场图片"); | |
| 148 | -// return; | |
| 149 | -// } | |
| 150 | - | |
| 151 | -// uploadImageUrlByType(params).then(res => { | |
| 152 | -// if (res.data.success) { | |
| 153 | -// uni.$u.toast("图片上传完毕!"); | |
| 154 | -// setTimeout(() => { | |
| 155 | -// uni.$u.route({ | |
| 156 | -// type: 'navigateBack', | |
| 157 | -// url: `pages/order-info/order-other/detail/index`, | |
| 158 | -// }) | |
| 159 | -// }, 300) | |
| 160 | -// } | |
| 161 | -// }) | |
| 162 | -// } | |
| 163 | - | |
| 164 | -const validateImage = () => { | |
| 165 | - for (let index = 0; index < fileList.value.length; index++) { | |
| 166 | - const str = fileList.value[index].url; | |
| 167 | - if (!str.startsWith("/profile/upload")) { | |
| 168 | - return false; | |
| 169 | - } | |
| 170 | - } | |
| 171 | - return true; | |
| 172 | -} | |
| 173 | - | |
| 174 | -onLoad((options) => { | |
| 175 | - orderId.value = options.orderId; | |
| 176 | - carPlate.value = options.carPlate; | |
| 177 | - driver.value = options.driver; | |
| 178 | - // putType.value = options.putType === "putOnImages" ? "装车图片" : "卸车图片"; | |
| 179 | - | |
| 180 | -}) | |
| 32 | + import { | |
| 33 | + uploadFilePromise | |
| 34 | + } from '@/apis/common.js'; | |
| 35 | + import { | |
| 36 | + uploadImageUrlByType | |
| 37 | + } from '@/apis/order.js'; | |
| 38 | + import { | |
| 39 | + onLoad | |
| 40 | + } from '@dcloudio/uni-app'; | |
| 41 | + import { | |
| 42 | + reactive, | |
| 43 | + ref, | |
| 44 | + onMounted | |
| 45 | + } from 'vue'; | |
| 46 | + import { | |
| 47 | + useMainStore | |
| 48 | + } from '@/stores/index.js'; | |
| 49 | + const store = useMainStore(); | |
| 50 | + const putType = ref("装车图片") | |
| 51 | + const orderId = ref(); | |
| 52 | + const carPlate = ref(); | |
| 53 | + const driver = ref(); | |
| 54 | + const fileList = ref([]) | |
| 55 | + const chooseList = reactive([{ | |
| 56 | + name: "装车图片" | |
| 57 | + }, { | |
| 58 | + name: "卸车图片" | |
| 59 | + }]) | |
| 60 | + const location = ref({}); | |
| 61 | + // 删除图片 | |
| 62 | + const deletePic = (event) => { | |
| 63 | + fileList.value.splice(event.index, 1); | |
| 64 | + }; | |
| 65 | + | |
| 66 | + const takeLocalCallBack = (lngLat) => { | |
| 67 | + const ll = lngLat.split(","); | |
| 68 | + console.log(ll); | |
| 69 | + location.value = { | |
| 70 | + longitude: ll[0], | |
| 71 | + latitude: ll[1] | |
| 72 | + }; | |
| 73 | + } | |
| 74 | + | |
| 75 | + // 生命周期处理 | |
| 76 | + onMounted(() => { | |
| 77 | + // 挂载全局回调 | |
| 78 | + window.takeLocationCallBack = takeLocalCallBack | |
| 79 | + }) | |
| 80 | + | |
| 81 | + const takeLocation = () => { | |
| 82 | + console.log("获取定位信息"); | |
| 83 | + // 获取定位信息 | |
| 84 | + window.JsInterface.takeLocation(); | |
| 85 | + } | |
| 86 | + // 新增图片 | |
| 87 | + const afterRead = async (event) => { | |
| 88 | + // 获取定位信息 | |
| 89 | + takeLocation(); | |
| 90 | + // 当设置 mutiple 为 true 时, file 为数组格式,否则为对象格式 | |
| 91 | + let lists = [].concat(event.file); | |
| 92 | + let fileListLen = fileList.value.length; | |
| 93 | + lists.map((item) => { | |
| 94 | + fileList.value.push({ | |
| 95 | + ...item, | |
| 96 | + status: 'uploading', | |
| 97 | + message: '上传中', | |
| 98 | + }); | |
| 99 | + }); | |
| 100 | + // 将blob转为file对象的方法 | |
| 101 | + function blobToFile(blob, fileName) { | |
| 102 | + return new File([blob], fileName, { | |
| 103 | + type: 'image/png' | |
| 104 | + }) | |
| 105 | + } | |
| 106 | + for (let i = 0; i < lists.length; i++) { | |
| 107 | + // 获取blob对象 | |
| 108 | + fetch(lists[i].url) | |
| 109 | + .then(response => response.blob()) | |
| 110 | + .then(blob => { | |
| 111 | + // 将blob转换为file | |
| 112 | + let fileN = blobToFile(blob, lists[i].name) | |
| 113 | + // 上传file对象 | |
| 114 | + let requestPath = import.meta.env.VITE_BASE_URL + import.meta.env | |
| 115 | + .VITE_BASE_FILE_UPLOAD_PREFIX; | |
| 116 | + uploadFilePromise(requestPath, fileN).then(result => { | |
| 117 | + let item = fileList.value[fileListLen]; | |
| 118 | + fileList.value.splice(fileListLen, 1, { | |
| 119 | + ...item, | |
| 120 | + status: 'success', | |
| 121 | + message: '', | |
| 122 | + url: result.data.url, | |
| 123 | + }); | |
| 124 | + fileListLen++; | |
| 125 | + }); | |
| 126 | + | |
| 127 | + }) | |
| 128 | + } | |
| 129 | + }; | |
| 130 | + // 提交图片 | |
| 131 | + const handleSubmit = async (id, type, driver, carPlate) => { | |
| 132 | + if (!validateImage()) { | |
| 133 | + uni.$u.toast("请等待图片上传~") | |
| 134 | + return | |
| 135 | + } | |
| 136 | + if(typeof(location.value.latitude) === 'undefined'){ | |
| 137 | + console.log('定位获取失败'); | |
| 138 | + uni.$u.toast("需要位置权限才能提交"); | |
| 139 | + return; | |
| 140 | + } | |
| 141 | + const userPhone = store.userPhone; | |
| 142 | + let params = { | |
| 143 | + garOrderId: id, | |
| 144 | + driver: driver, | |
| 145 | + carPlate: carPlate, | |
| 146 | + userPhone: userPhone, | |
| 147 | + type: type == "装车图片" ? 1 : 2, | |
| 148 | + imageUrls: fileList.value.map(item => item.url), | |
| 149 | + // 添加定位信息 | |
| 150 | + latitude: location.latitude, | |
| 151 | + longitude: location.longitude | |
| 152 | + } | |
| 153 | + | |
| 154 | + if (params.imageUrls && params.imageUrls.length == 0) { | |
| 155 | + uni.$u.toast("请上传现场图片"); | |
| 156 | + return; | |
| 157 | + } | |
| 158 | + | |
| 159 | + uploadImageUrlByType(params).then(res => { | |
| 160 | + if (res.data.success) { | |
| 161 | + uni.$u.toast("图片上传完毕!"); | |
| 162 | + setTimeout(() => { | |
| 163 | + uni.$u.route({ | |
| 164 | + type: 'navigateBack', | |
| 165 | + url: `pages/order-info/order-other/detail/index`, | |
| 166 | + }) | |
| 167 | + }, 300) | |
| 168 | + } | |
| 169 | + }) | |
| 170 | + } | |
| 171 | + // 提交图片 | |
| 172 | + // const handleSubmit = async (id, type,driver,carPlate) => { | |
| 173 | + // if (!validateImage()) { | |
| 174 | + // uni.$u.toast("请等待图片上传~") | |
| 175 | + // return | |
| 176 | + // } | |
| 177 | + // const userPhone = store.userPhone; | |
| 178 | + // let params = { | |
| 179 | + // garOrderId: id, | |
| 180 | + // driver:driver, | |
| 181 | + // carPlate:carPlate, | |
| 182 | + // userPhone:userPhone, | |
| 183 | + // type: type == "装车图片" ? 1 : 2, | |
| 184 | + // imageUrls: fileList.value.map(item => item.url) | |
| 185 | + // } | |
| 186 | + // if(params.imageUrls && params.imageUrls.length == 0){ | |
| 187 | + // uni.$u.toast("请上传现场图片"); | |
| 188 | + // return; | |
| 189 | + // } | |
| 190 | + | |
| 191 | + // uploadImageUrlByType(params).then(res => { | |
| 192 | + // if (res.data.success) { | |
| 193 | + // uni.$u.toast("图片上传完毕!"); | |
| 194 | + // setTimeout(() => { | |
| 195 | + // uni.$u.route({ | |
| 196 | + // type: 'navigateBack', | |
| 197 | + // url: `pages/order-info/order-other/detail/index`, | |
| 198 | + // }) | |
| 199 | + // }, 300) | |
| 200 | + // } | |
| 201 | + // }) | |
| 202 | + // } | |
| 203 | + | |
| 204 | + const validateImage = () => { | |
| 205 | + for (let index = 0; index < fileList.value.length; index++) { | |
| 206 | + const str = fileList.value[index].url; | |
| 207 | + if (!str.includes("/profile/upload")) { | |
| 208 | + return false; | |
| 209 | + } | |
| 210 | + } | |
| 211 | + return true; | |
| 212 | + } | |
| 213 | + | |
| 214 | + onLoad((options) => { | |
| 215 | + orderId.value = options.orderId; | |
| 216 | + carPlate.value = options.carPlate; | |
| 217 | + driver.value = options.driver; | |
| 218 | + // putType.value = options.putType === "putOnImages" ? "装车图片" : "卸车图片"; | |
| 219 | + | |
| 220 | + }) | |
| 181 | 221 | </script> |
| 182 | 222 | |
| 183 | 223 | <style lang="scss" scoped> |
| 184 | -.upload-image-box { | |
| 185 | - height: 100%; | |
| 186 | - width: 100%; | |
| 187 | - background-color: #ffffff; | |
| 188 | - padding: 20rpx; | |
| 189 | - box-sizing: border-box; | |
| 190 | - line-height: 80rpx; | |
| 191 | - | |
| 192 | - .upload-image-box-choose { | |
| 193 | - display: flex; | |
| 194 | - | |
| 195 | - .upload-image-box-choose-txt { | |
| 196 | - white-space: nowrap; | |
| 197 | - } | |
| 198 | - | |
| 199 | - .upload-image-box-choose-type { | |
| 200 | - display: flex; | |
| 201 | - justify-content: center; | |
| 202 | - align-items: center; | |
| 203 | - } | |
| 204 | - } | |
| 205 | - | |
| 206 | - .upload-image-box-bottom { | |
| 207 | - .upload-image-box-bottom-txt { | |
| 208 | - color: $u-info; | |
| 209 | - } | |
| 210 | - | |
| 211 | - .upload-image-box-button-container { | |
| 212 | - min-height: 350rpx; | |
| 213 | - min-width: 100%; | |
| 214 | - padding: 20rpx; | |
| 215 | - // background-color: $u-info-light; | |
| 216 | - border: 2rpx solid $u-border-color; | |
| 217 | - box-sizing: border-box; | |
| 218 | - border-radius: 10rpx; | |
| 219 | - } | |
| 220 | - } | |
| 221 | - | |
| 222 | - .upload-image-box-submit-box { | |
| 223 | - box-sizing: border-box; | |
| 224 | - margin-top: 80rpx; | |
| 225 | - width: 100%; | |
| 226 | - | |
| 227 | - .upload-image-box-submit-box-button { | |
| 228 | - box-sizing: border-box; | |
| 229 | - display: flex; | |
| 230 | - justify-content: flex-end; | |
| 231 | - align-items: center; | |
| 232 | - | |
| 233 | - .upload-image-box-submit-box-button-container { | |
| 234 | - white-space: nowrap; | |
| 235 | - box-sizing: border-box; | |
| 236 | - width: 200rpx; | |
| 237 | - } | |
| 238 | - } | |
| 239 | - } | |
| 240 | -} | |
| 241 | -</style> | |
| 224 | + .upload-image-box { | |
| 225 | + height: 100%; | |
| 226 | + width: 100%; | |
| 227 | + background-color: #ffffff; | |
| 228 | + padding: 20rpx; | |
| 229 | + box-sizing: border-box; | |
| 230 | + line-height: 80rpx; | |
| 231 | + | |
| 232 | + .upload-image-box-choose { | |
| 233 | + display: flex; | |
| 234 | + | |
| 235 | + .upload-image-box-choose-txt { | |
| 236 | + white-space: nowrap; | |
| 237 | + } | |
| 238 | + | |
| 239 | + .upload-image-box-choose-type { | |
| 240 | + display: flex; | |
| 241 | + justify-content: center; | |
| 242 | + align-items: center; | |
| 243 | + } | |
| 244 | + } | |
| 245 | + | |
| 246 | + .upload-image-box-bottom { | |
| 247 | + .upload-image-box-bottom-txt { | |
| 248 | + color: $u-info; | |
| 249 | + } | |
| 250 | + | |
| 251 | + .upload-image-box-button-container { | |
| 252 | + min-height: 350rpx; | |
| 253 | + min-width: 100%; | |
| 254 | + padding: 20rpx; | |
| 255 | + // background-color: $u-info-light; | |
| 256 | + border: 2rpx solid $u-border-color; | |
| 257 | + box-sizing: border-box; | |
| 258 | + border-radius: 10rpx; | |
| 259 | + } | |
| 260 | + } | |
| 261 | + | |
| 262 | + .upload-image-box-submit-box { | |
| 263 | + box-sizing: border-box; | |
| 264 | + margin-top: 80rpx; | |
| 265 | + width: 100%; | |
| 266 | + | |
| 267 | + .upload-image-box-submit-box-button { | |
| 268 | + box-sizing: border-box; | |
| 269 | + display: flex; | |
| 270 | + justify-content: flex-end; | |
| 271 | + align-items: center; | |
| 272 | + | |
| 273 | + .upload-image-box-submit-box-button-container { | |
| 274 | + white-space: nowrap; | |
| 275 | + box-sizing: border-box; | |
| 276 | + width: 200rpx; | |
| 277 | + } | |
| 278 | + } | |
| 279 | + } | |
| 280 | + } | |
| 281 | +</style> | |
| 242 | 282 | \ No newline at end of file | ... | ... |
garbage-removal/src/pages/wode/index.vue
garbage-removal/src/uview-plus/components/u-upload/u-upload.vue
| ... | ... | @@ -124,6 +124,9 @@ export default { |
| 124 | 124 | deep: true, |
| 125 | 125 | }, |
| 126 | 126 | }, |
| 127 | + mounted() { | |
| 128 | + window.takePhoneCallBack = this.onTakePhoneCallBack; | |
| 129 | + }, | |
| 127 | 130 | // #ifdef VUE3 |
| 128 | 131 | emits: ['error', 'beforeRead', 'oversize', 'afterRead', 'delete', 'clickPreview'], |
| 129 | 132 | // #endif |
| ... | ... | @@ -144,40 +147,30 @@ export default { |
| 144 | 147 | this.isInCount = lists.length < maxCount |
| 145 | 148 | }, |
| 146 | 149 | chooseFile() { |
| 147 | - const { | |
| 148 | - maxCount, | |
| 149 | - multiple, | |
| 150 | - lists, | |
| 151 | - disabled | |
| 152 | - } = this; | |
| 153 | - if (disabled) return; | |
| 154 | - // 如果用户传入的是字符串,需要格式化成数组 | |
| 155 | - let capture; | |
| 156 | - try { | |
| 157 | - capture = uni.$u.test.array(this.capture) ? this.capture : this.capture.split(','); | |
| 158 | - } catch (e) { | |
| 159 | - capture = []; | |
| 160 | - } | |
| 161 | - chooseFile( | |
| 162 | - Object.assign({ | |
| 163 | - accept: this.accept, | |
| 164 | - multiple: this.multiple, | |
| 165 | - capture: capture, | |
| 166 | - compressed: this.compressed, | |
| 167 | - maxDuration: this.maxDuration, | |
| 168 | - sizeType: this.sizeType, | |
| 169 | - camera: this.camera, | |
| 170 | - }, { | |
| 171 | - maxCount: maxCount - lists.length, | |
| 172 | - }) | |
| 173 | - ) | |
| 174 | - .then((res) => { | |
| 175 | - this.onBeforeRead(multiple ? res : res[0]); | |
| 176 | - }) | |
| 177 | - .catch((error) => { | |
| 178 | - this.$emit('error', error); | |
| 179 | - }); | |
| 150 | + this.takePhoto(); | |
| 180 | 151 | }, |
| 152 | + takePhoto() { | |
| 153 | + if (window.JsInterface && typeof window.JsInterface.takePhone === 'function') { | |
| 154 | + window.JsInterface.takePhone(); | |
| 155 | + } else { | |
| 156 | + uni.$u.toast('当前环境不支持原生拍照'); | |
| 157 | + } | |
| 158 | + }, | |
| 159 | + | |
| 160 | + onTakePhoneCallBack(path) { | |
| 161 | + if (!path) return; | |
| 162 | + console.log(">>>进入回调path:",path); | |
| 163 | + const file = { | |
| 164 | + url: path, | |
| 165 | + thumb: path, | |
| 166 | + size: 0, | |
| 167 | + name: path.split('/').pop(), | |
| 168 | + type: 'image' | |
| 169 | + }; | |
| 170 | + console.log(file); | |
| 171 | + this.onBeforeRead(file); | |
| 172 | + // this.onAfterRead(file); | |
| 173 | + }, | |
| 181 | 174 | // 文件读取之前 |
| 182 | 175 | onBeforeRead(file) { |
| 183 | 176 | const { | ... | ... |
garbage-removal/src/uview-plus/components/u-upload/u-uploadbf.vue
0 → 100644
| 1 | +<template> | |
| 2 | + <view class="u-upload" :style="[$u.addStyle(customStyle)]"> | |
| 3 | + <view class="u-upload__wrap"> | |
| 4 | + <template v-if="previewImage"> | |
| 5 | + <view class="u-upload__wrap__preview" v-for="(item, index) in lists" :key="index"> | |
| 6 | + <image v-if="item.isImage || (item.type && item.type === 'image')" :src="item.thumb || item.url" | |
| 7 | + :mode="imageMode" class="u-upload__wrap__preview__image" @tap="onPreviewImage(item)" :style="[{ | |
| 8 | + // width: $u.addUnit(width), | |
| 9 | + // height: $u.addUnit(height) | |
| 10 | + }]" /> | |
| 11 | + <view v-else class="u-upload__wrap__preview__other"> | |
| 12 | + <u-icon color="#80CBF9" size="26" | |
| 13 | + :name="item.isVideo || (item.type && item.type === 'video') ? 'movie' : 'folder'"></u-icon> | |
| 14 | + <text class="u-upload__wrap__preview__other__text">{{ item.isVideo || (item.type && item.type === 'video') ? | |
| 15 | + '视频' : '文件' }}</text> | |
| 16 | + </view> | |
| 17 | + <view class="u-upload__status" v-if="item.status === 'uploading' || item.status === 'failed'"> | |
| 18 | + <view class="u-upload__status__icon"> | |
| 19 | + <u-icon v-if="item.status === 'failed'" name="close-circle" color="#ffffff" size="25" /> | |
| 20 | + <u-loading-icon size="22" mode="circle" color="#ffffff" v-else /> | |
| 21 | + </view> | |
| 22 | + <text v-if="item.message" class="u-upload__status__message">{{ item.message }}</text> | |
| 23 | + </view> | |
| 24 | + <view class="u-upload__deletable" | |
| 25 | + v-if="item.status !== 'uploading' && (deletable || item.deletable) && !isReadOnly" | |
| 26 | + @tap.stop="deleteItem(index)"> | |
| 27 | + <view class="u-upload__deletable__icon"> | |
| 28 | + <u-icon name="close" color="#ffffff" size="25"></u-icon> | |
| 29 | + </view> | |
| 30 | + </view> | |
| 31 | + <view class="u-upload__success" v-if="false"> | |
| 32 | + <!-- #ifdef APP-NVUE --> | |
| 33 | + <image :src="successIcon" class="u-upload__success__icon"></image> | |
| 34 | + <!-- #endif --> | |
| 35 | + <!-- #ifndef APP-NVUE --> | |
| 36 | + <view class="u-upload__success__icon"> | |
| 37 | + <u-icon name="checkmark" color="#ffffff" size="12"></u-icon> | |
| 38 | + </view> | |
| 39 | + <!-- #endif --> | |
| 40 | + </view> | |
| 41 | + </view> | |
| 42 | + | |
| 43 | + </template> | |
| 44 | + | |
| 45 | + <template v-if="isInCount && !isReadOnly"> | |
| 46 | + <view v-if="$slots.default || $slots.$default" @tap="chooseFile"> | |
| 47 | + <slot /> | |
| 48 | + </view> | |
| 49 | + <view v-else class="u-upload__button" :hover-class="!disabled ? 'u-upload__button--hover' : ''" | |
| 50 | + hover-stay-time="150" @tap="chooseFile" :class="[disabled && 'u-upload__button--disabled']" :style="[{ | |
| 51 | + // width: $u.addUnit(width), | |
| 52 | + // height: $u.addUnit(height) | |
| 53 | + }]"> | |
| 54 | + <u-icon :name="uploadIcon" size="26" :color="uploadIconColor"></u-icon> | |
| 55 | + <text v-if="uploadText" class="u-upload__button__text">{{ uploadText }}</text> | |
| 56 | + </view> | |
| 57 | + </template> | |
| 58 | + </view> | |
| 59 | + | |
| 60 | + </view> | |
| 61 | +</template> | |
| 62 | + | |
| 63 | +<script> | |
| 64 | +import mixin from '../../libs/mixin/mixin.js'; | |
| 65 | +import mpMixin from '../../libs/mixin/mpMixin.js'; | |
| 66 | +import mixinUp from './mixin.js'; | |
| 67 | +import props from './props.js'; | |
| 68 | +import { | |
| 69 | + chooseFile | |
| 70 | +} from './utils'; | |
| 71 | + | |
| 72 | +/** | |
| 73 | + * upload 上传 | |
| 74 | + * @description 该组件用于上传图片场景 | |
| 75 | + * @tutorial https://uviewui.com/components/upload.html | |
| 76 | + * @property {String} accept 接受的文件类型, 可选值为all media image file video (默认 'image' ) | |
| 77 | + * @property {String | Array} capture 图片或视频拾取模式,当accept为image类型时设置capture可选额外camera可以直接调起摄像头(默认 ['album', 'camera'] ) | |
| 78 | + * @property {Boolean} compressed 当accept为video时生效,是否压缩视频,默认为true(默认 true ) | |
| 79 | + * @property {String} camera 当accept为video时生效,可选值为back或front(默认 'back' ) | |
| 80 | + * @property {Number} maxDuration 当accept为video时生效,拍摄视频最长拍摄时间,单位秒(默认 60 ) | |
| 81 | + * @property {String} uploadIcon 上传区域的图标,只能内置图标(默认 'camera-fill' ) | |
| 82 | + * @property {String} uploadIconColor 上传区域的图标的字体颜色,只能内置图标(默认 #D3D4D6 ) | |
| 83 | + * @property {Boolean} useBeforeRead 是否开启文件读取前事件(默认 false ) | |
| 84 | + * @property {Boolean} previewFullImage 是否显示组件自带的图片预览功能(默认 true ) | |
| 85 | + * @property {String | Number} maxCount 最大上传数量(默认 52 ) | |
| 86 | + * @property {Boolean} disabled 是否启用(默认 false ) | |
| 87 | + * @property {String} imageMode 预览上传的图片时的裁剪模式,和image组件mode属性一致(默认 'aspectFill' ) | |
| 88 | + * @property {String} name 标识符,可以在回调函数的第二项参数中获取 | |
| 89 | + * @property {Array} sizeType 所选的图片的尺寸, 可选值为original compressed(默认 ['original', 'compressed'] ) | |
| 90 | + * @property {Boolean} multiple 是否开启图片多选,部分安卓机型不支持 (默认 false ) | |
| 91 | + * @property {Boolean} deletable 是否展示删除按钮(默认 true ) | |
| 92 | + * @property {String | Number} maxSize 文件大小限制,单位为byte (默认 Number.MAX_VALUE ) | |
| 93 | + * @property {Array} fileList 显示已上传的文件列表 | |
| 94 | + * @property {String} uploadText 上传区域的提示文字 | |
| 95 | + * @property {String | Number} width 内部预览图片区域和选择图片按钮的区域宽度(默认 80 ) | |
| 96 | + * @property {String | Number} height 内部预览图片区域和选择图片按钮的区域高度(默认 80 ) | |
| 97 | + * @property {Object} customStyle 组件的样式,对象形式 | |
| 98 | + * @event {Function} afterRead 读取后的处理函数 | |
| 99 | + * @event {Function} beforeRead 读取前的处理函数 | |
| 100 | + * @event {Function} oversize 文件超出大小限制 | |
| 101 | + * @event {Function} clickPreview 点击预览图片 | |
| 102 | + * @event {Function} delete 删除图片 | |
| 103 | + * @example <u-upload :action="action" :fileList="fileList" ></u-upload> | |
| 104 | + */ | |
| 105 | +export default { | |
| 106 | + name: "u-upload", | |
| 107 | + mixins: [mpMixin, mixin, mixinUp, props], | |
| 108 | + data() { | |
| 109 | + return { | |
| 110 | + // #ifdef APP-NVUE | |
| 111 | + successIcon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAKKADAAQAAAABAAAAKAAAAAB65masAAACP0lEQVRYCc3YXygsURwH8K/dpcWyG3LF5u/6/+dKVylSypuUl6uUPMifKMWL8oKEB1EUT1KeUPdR3uTNUsSLxb2udG/cbvInNuvf2rVnazZ/ZndmZ87snjM1Z+Z3zpzfp9+Z5mEAhlvjRtZgCKs+gnPAOcAkkMOR4jEHfItjDvgRxxSQD8cM0BuOCaAvXNCBQrigAsXgggYUiwsK0B9cwIH+4gIKlIILGFAqLiBAOTjFgXJxigJp4BQD0sIpAqSJow6kjSNAFTnRaHJwLenD6Mud52VQAcrBfTd2oyq+HtGaGGWAcnAVcXWoM3bCZrdi+ncPfaAcXE5UKVpdW/vitGPqqAtn98d0gXJwX7Qp6MmegUYVhvmTIezdmHlxJCjpHRTCFerLkRRu4k0aqdajN3sWOo0BK//msHa+xDuPC/oNFMKRhTtM4xjIX0SCNpXL4+7VIaHuyiWEp2L7ahWLf8fejfPdqPmC3mJicORZUp1CQzm+GiphvljGk+PBvWRbxii+xVTj5M6CiZ/tsDufvaXyxEUDxeLIyvu3m0iOyEFWVAkydcVYdyFrE9tQk9iMq6f/GNlvwt3LjQfh60LUrw9/cFyyMJUW/XkLSNMV4Mi6C5ML+ui4x5ClAX9sB9w0wV6wglJwJCv5fOxcr6EstgbGiEw4XcfUry4cWrcEUW8n+ARKxXEJHhw2WG43UKSvwI/TSZgvl7kh0b3XLZaLEy0QmMgLZAVH7J+ALOE+AVnDvQOyiPMAWcW5gSzjCPAV+78S5WE0GrQAAAAASUVORK5CYII=', | |
| 112 | + // #endif | |
| 113 | + lists: [], | |
| 114 | + isInCount: true, | |
| 115 | + } | |
| 116 | + }, | |
| 117 | + watch: { | |
| 118 | + // 监听文件列表的变化,重新整理内部数据 | |
| 119 | + fileList: { | |
| 120 | + handler() { | |
| 121 | + this.formatFileList() | |
| 122 | + }, | |
| 123 | + immediate: true, | |
| 124 | + deep: true, | |
| 125 | + }, | |
| 126 | + }, | |
| 127 | + // #ifdef VUE3 | |
| 128 | + emits: ['error', 'beforeRead', 'oversize', 'afterRead', 'delete', 'clickPreview'], | |
| 129 | + // #endif | |
| 130 | + methods: { | |
| 131 | + formatFileList() { | |
| 132 | + const { | |
| 133 | + fileList = [], maxCount | |
| 134 | + } = this; | |
| 135 | + const lists = fileList.map((item) => | |
| 136 | + Object.assign(Object.assign({}, item), { | |
| 137 | + // 如果item.url为本地选择的blob文件的话,无法判断其为video还是image,此处优先通过accept做判断处理 | |
| 138 | + isImage: this.accept === 'image' || uni.$u.test.image(item.url || item.thumb), | |
| 139 | + isVideo: this.accept === 'video' || uni.$u.test.video(item.url || item.thumb), | |
| 140 | + deletable: typeof (item.deletable) === 'boolean' ? item.deletable : this.deletable, | |
| 141 | + }) | |
| 142 | + ); | |
| 143 | + this.lists = lists | |
| 144 | + this.isInCount = lists.length < maxCount | |
| 145 | + }, | |
| 146 | + chooseFile() { | |
| 147 | + const { | |
| 148 | + maxCount, | |
| 149 | + multiple, | |
| 150 | + lists, | |
| 151 | + disabled | |
| 152 | + } = this; | |
| 153 | + if (disabled) return; | |
| 154 | + // 如果用户传入的是字符串,需要格式化成数组 | |
| 155 | + let capture; | |
| 156 | + try { | |
| 157 | + capture = uni.$u.test.array(this.capture) ? this.capture : this.capture.split(','); | |
| 158 | + } catch (e) { | |
| 159 | + capture = []; | |
| 160 | + } | |
| 161 | + chooseFile( | |
| 162 | + Object.assign({ | |
| 163 | + accept: this.accept, | |
| 164 | + multiple: this.multiple, | |
| 165 | + capture: capture, | |
| 166 | + compressed: this.compressed, | |
| 167 | + maxDuration: this.maxDuration, | |
| 168 | + sizeType: this.sizeType, | |
| 169 | + camera: this.camera, | |
| 170 | + }, { | |
| 171 | + maxCount: maxCount - lists.length, | |
| 172 | + }) | |
| 173 | + ) | |
| 174 | + .then((res) => { | |
| 175 | + this.onBeforeRead(multiple ? res : res[0]); | |
| 176 | + }) | |
| 177 | + .catch((error) => { | |
| 178 | + this.$emit('error', error); | |
| 179 | + }); | |
| 180 | + }, | |
| 181 | + // 文件读取之前 | |
| 182 | + onBeforeRead(file) { | |
| 183 | + const { | |
| 184 | + beforeRead, | |
| 185 | + useBeforeRead, | |
| 186 | + } = this; | |
| 187 | + let res = true | |
| 188 | + // beforeRead是否为一个方法 | |
| 189 | + if (uni.$u.test.func(beforeRead)) { | |
| 190 | + // 如果用户定义了此方法,则去执行此方法,并传入读取的文件回调 | |
| 191 | + res = beforeRead(file, this.getDetail()); | |
| 192 | + } | |
| 193 | + if (useBeforeRead) { | |
| 194 | + res = new Promise((resolve, reject) => { | |
| 195 | + this.$emit( | |
| 196 | + 'beforeRead', | |
| 197 | + Object.assign(Object.assign({ | |
| 198 | + file | |
| 199 | + }, this.getDetail()), { | |
| 200 | + callback: (ok) => { | |
| 201 | + ok ? resolve() : reject(); | |
| 202 | + }, | |
| 203 | + }) | |
| 204 | + ); | |
| 205 | + }); | |
| 206 | + } | |
| 207 | + if (!res) { | |
| 208 | + return; | |
| 209 | + } | |
| 210 | + if (uni.$u.test.promise(res)) { | |
| 211 | + res.then((data) => this.onAfterRead(data || file)); | |
| 212 | + } else { | |
| 213 | + this.onAfterRead(file); | |
| 214 | + } | |
| 215 | + }, | |
| 216 | + getDetail(index) { | |
| 217 | + return { | |
| 218 | + name: this.name, | |
| 219 | + index: index == null ? this.fileList.length : index, | |
| 220 | + }; | |
| 221 | + }, | |
| 222 | + onAfterRead(file) { | |
| 223 | + const { | |
| 224 | + maxSize, | |
| 225 | + afterRead | |
| 226 | + } = this; | |
| 227 | + const oversize = Array.isArray(file) ? | |
| 228 | + file.some((item) => item.size > maxSize) : | |
| 229 | + file.size > maxSize; | |
| 230 | + if (oversize) { | |
| 231 | + this.$emit('oversize', Object.assign({ | |
| 232 | + file | |
| 233 | + }, this.getDetail())); | |
| 234 | + return; | |
| 235 | + } | |
| 236 | + if (typeof afterRead === 'function') { | |
| 237 | + afterRead(file, this.getDetail()); | |
| 238 | + } | |
| 239 | + this.$emit('afterRead', Object.assign({ | |
| 240 | + file | |
| 241 | + }, this.getDetail())); | |
| 242 | + }, | |
| 243 | + deleteItem(index) { | |
| 244 | + this.$emit( | |
| 245 | + 'delete', | |
| 246 | + Object.assign(Object.assign({}, this.getDetail(index)), { | |
| 247 | + file: this.fileList[index], | |
| 248 | + }) | |
| 249 | + ); | |
| 250 | + }, | |
| 251 | + // 预览图片 | |
| 252 | + onPreviewImage(item) { | |
| 253 | + if (!item.isImage || !this.previewFullImage) return | |
| 254 | + let baseUrl = item.url.startsWith('/profile/upload/') ? import.meta.env.VITE_BASE_URL : item.url; | |
| 255 | + let imageArray = this.lists.filter((item) => this.accept === 'image' || uni.$u.test.image(item.url || item.thumb)).map((item) => item.url || item.thumb); | |
| 256 | + for (let index = 0; index < imageArray.length; index++) { | |
| 257 | + if (!imageArray[index].startsWith(baseUrl)) { | |
| 258 | + imageArray[index] = baseUrl + imageArray[index]; | |
| 259 | + } | |
| 260 | + } | |
| 261 | + uni.previewImage({ | |
| 262 | + // 先filter找出为图片的item,再返回filter结果中的图片url | |
| 263 | + urls: imageArray, | |
| 264 | + current: item.url || item.thumb, | |
| 265 | + fail() { | |
| 266 | + uni.$u.toast('预览图片失败') | |
| 267 | + }, | |
| 268 | + }); | |
| 269 | + }, | |
| 270 | + onPreviewVideo(event) { | |
| 271 | + if (!this.data.previewFullImage) return; | |
| 272 | + const { | |
| 273 | + index | |
| 274 | + } = event.currentTarget.dataset; | |
| 275 | + const { | |
| 276 | + lists | |
| 277 | + } = this.data; | |
| 278 | + wx.previewMedia({ | |
| 279 | + sources: lists | |
| 280 | + .filter((item) => isVideoFile(item)) | |
| 281 | + .map((item) => | |
| 282 | + Object.assign(Object.assign({}, item), { | |
| 283 | + type: 'video' | |
| 284 | + }) | |
| 285 | + ), | |
| 286 | + current: index, | |
| 287 | + fail() { | |
| 288 | + uni.$u.toast('预览视频失败') | |
| 289 | + }, | |
| 290 | + }); | |
| 291 | + }, | |
| 292 | + onClickPreview(event) { | |
| 293 | + const { | |
| 294 | + index | |
| 295 | + } = event.currentTarget.dataset; | |
| 296 | + const item = this.data.lists[index]; | |
| 297 | + this.$emit( | |
| 298 | + 'clickPreview', | |
| 299 | + Object.assign(Object.assign({}, item), this.getDetail(index)) | |
| 300 | + ); | |
| 301 | + } | |
| 302 | + } | |
| 303 | +} | |
| 304 | +</script> | |
| 305 | + | |
| 306 | +<style lang="scss" scoped> | |
| 307 | +@import '../../libs/css/components.scss'; | |
| 308 | +$u-upload-preview-border-radius: 2px !default; | |
| 309 | +$u-upload-preview-margin: 0 8px 8px 0 !default; | |
| 310 | +$u-upload-image-width: 80px !default; | |
| 311 | +$u-upload-image-height: $u-upload-image-width; | |
| 312 | +$u-upload-other-bgColor: rgb(242, 242, 242) !default; | |
| 313 | +$u-upload-other-flex: 1 !default; | |
| 314 | +$u-upload-text-font-size: 11px !default; | |
| 315 | +$u-upload-text-color: $u-tips-color !default; | |
| 316 | +$u-upload-text-margin-top: 2px !default; | |
| 317 | +$u-upload-deletable-right: 0 !default; | |
| 318 | +$u-upload-deletable-top: 0 !default; | |
| 319 | +$u-upload-deletable-bgColor: rgb(55, 55, 55) !default; | |
| 320 | +$u-upload-deletable-height: 14px !default; | |
| 321 | +$u-upload-deletable-width: $u-upload-deletable-height; | |
| 322 | +$u-upload-deletable-boder-bottom-left-radius: 100px !default; | |
| 323 | +$u-upload-deletable-zIndex: 3 !default; | |
| 324 | +$u-upload-success-bottom: 0 !default; | |
| 325 | +$u-upload-success-right: 0 !default; | |
| 326 | +$u-upload-success-border-style: solid !default; | |
| 327 | +$u-upload-success-border-top-color: transparent !default; | |
| 328 | +$u-upload-success-border-left-color: transparent !default; | |
| 329 | +$u-upload-success-border-bottom-color: $u-success !default; | |
| 330 | +$u-upload-success-border-right-color: $u-upload-success-border-bottom-color; | |
| 331 | +$u-upload-success-border-width: 9px !default; | |
| 332 | +$u-upload-icon-top: 0px !default; | |
| 333 | +$u-upload-icon-right: 0px !default; | |
| 334 | +$u-upload-icon-h5-top: 1px !default; | |
| 335 | +$u-upload-icon-h5-right: 0 !default; | |
| 336 | +$u-upload-icon-width: 16px !default; | |
| 337 | +$u-upload-icon-height: $u-upload-icon-width; | |
| 338 | +$u-upload-success-icon-bottom: -10px !default; | |
| 339 | +$u-upload-success-icon-right: -10px !default; | |
| 340 | +$u-upload-status-right: 0 !default; | |
| 341 | +$u-upload-status-left: 0 !default; | |
| 342 | +$u-upload-status-bottom: 0 !default; | |
| 343 | +$u-upload-status-top: 0 !default; | |
| 344 | +$u-upload-status-bgColor: rgba(0, 0, 0, 0.5) !default; | |
| 345 | +$u-upload-status-icon-Zindex: 1 !default; | |
| 346 | +$u-upload-message-font-size: 12px !default; | |
| 347 | +$u-upload-message-color: #FFFFFF !default; | |
| 348 | +$u-upload-message-margin-top: 5px !default; | |
| 349 | +$u-upload-button-width: 80px !default; | |
| 350 | +$u-upload-button-height: $u-upload-button-width; | |
| 351 | +$u-upload-button-bgColor: rgb(244, 245, 247) !default; | |
| 352 | +$u-upload-button-border-radius: 2px !default; | |
| 353 | +$u-upload-botton-margin: 0 8px 8px 0 !default; | |
| 354 | +$u-upload-text-font-size: 11px !default; | |
| 355 | +$u-upload-text-color: $u-tips-color !default; | |
| 356 | +$u-upload-text-margin-top: 2px !default; | |
| 357 | +$u-upload-hover-bgColor: rgb(230, 231, 233) !default; | |
| 358 | +$u-upload-disabled-opacity: .5 !default; | |
| 359 | + | |
| 360 | +.u-upload { | |
| 361 | + @include flex(column); | |
| 362 | + flex: 1; | |
| 363 | + | |
| 364 | + &__wrap { | |
| 365 | + @include flex; | |
| 366 | + flex-wrap: wrap; | |
| 367 | + flex: 1; | |
| 368 | + | |
| 369 | + &__preview { | |
| 370 | + border-radius: $u-upload-preview-border-radius; | |
| 371 | + margin: $u-upload-preview-margin; | |
| 372 | + position: relative; | |
| 373 | + overflow: hidden; | |
| 374 | + @include flex; | |
| 375 | + | |
| 376 | + &__image { | |
| 377 | + width: $u-upload-image-width; | |
| 378 | + height: $u-upload-image-height; | |
| 379 | + } | |
| 380 | + | |
| 381 | + &__other { | |
| 382 | + width: $u-upload-image-width; | |
| 383 | + height: $u-upload-image-height; | |
| 384 | + background-color: $u-upload-other-bgColor; | |
| 385 | + flex: $u-upload-other-flex; | |
| 386 | + @include flex(column); | |
| 387 | + justify-content: center; | |
| 388 | + align-items: center; | |
| 389 | + | |
| 390 | + &__text { | |
| 391 | + font-size: $u-upload-text-font-size; | |
| 392 | + color: $u-upload-text-color; | |
| 393 | + margin-top: $u-upload-text-margin-top; | |
| 394 | + } | |
| 395 | + } | |
| 396 | + } | |
| 397 | + } | |
| 398 | + | |
| 399 | + &__deletable { | |
| 400 | + position: absolute; | |
| 401 | + top: $u-upload-deletable-top; | |
| 402 | + right: $u-upload-deletable-right; | |
| 403 | + background-color: $u-upload-deletable-bgColor; | |
| 404 | + height: $u-upload-deletable-height; | |
| 405 | + width: $u-upload-deletable-width; | |
| 406 | + @include flex; | |
| 407 | + border-bottom-left-radius: $u-upload-deletable-boder-bottom-left-radius; | |
| 408 | + align-items: center; | |
| 409 | + justify-content: center; | |
| 410 | + z-index: $u-upload-deletable-zIndex; | |
| 411 | + | |
| 412 | + &__icon { | |
| 413 | + position: absolute; | |
| 414 | + transform: scale(0.7); | |
| 415 | + top: $u-upload-icon-top; | |
| 416 | + right: $u-upload-icon-right; | |
| 417 | + /* #ifdef H5 */ | |
| 418 | + top: $u-upload-icon-h5-top; | |
| 419 | + right: $u-upload-icon-h5-right; | |
| 420 | + /* #endif */ | |
| 421 | + } | |
| 422 | + } | |
| 423 | + | |
| 424 | + &__success { | |
| 425 | + display: none; | |
| 426 | + position: absolute; | |
| 427 | + bottom: $u-upload-success-bottom; | |
| 428 | + right: $u-upload-success-right; | |
| 429 | + @include flex; | |
| 430 | + // 由于weex(nvue)为阿里巴巴的KPI(部门业绩考核)的laji产物,不支持css绘制三角形 | |
| 431 | + // 所以在nvue下使用图片,非nvue下使用css实现 | |
| 432 | + /* #ifndef APP-NVUE */ | |
| 433 | + border-style: $u-upload-success-border-style; | |
| 434 | + border-top-color: $u-upload-success-border-top-color; | |
| 435 | + border-left-color: $u-upload-success-border-left-color; | |
| 436 | + border-bottom-color: $u-upload-success-border-bottom-color; | |
| 437 | + border-right-color: $u-upload-success-border-right-color; | |
| 438 | + border-width: $u-upload-success-border-width; | |
| 439 | + align-items: center; | |
| 440 | + justify-content: center; | |
| 441 | + /* #endif */ | |
| 442 | + | |
| 443 | + &__icon { | |
| 444 | + /* #ifndef APP-NVUE */ | |
| 445 | + position: absolute; | |
| 446 | + transform: scale(0.7); | |
| 447 | + bottom: $u-upload-success-icon-bottom; | |
| 448 | + right: $u-upload-success-icon-right; | |
| 449 | + /* #endif */ | |
| 450 | + /* #ifdef APP-NVUE */ | |
| 451 | + width: $u-upload-icon-width; | |
| 452 | + height: $u-upload-icon-height; | |
| 453 | + /* #endif */ | |
| 454 | + } | |
| 455 | + } | |
| 456 | + | |
| 457 | + &__status { | |
| 458 | + position: absolute; | |
| 459 | + top: $u-upload-status-top; | |
| 460 | + bottom: $u-upload-status-bottom; | |
| 461 | + left: $u-upload-status-left; | |
| 462 | + right: $u-upload-status-right; | |
| 463 | + background-color: $u-upload-status-bgColor; | |
| 464 | + @include flex(column); | |
| 465 | + align-items: center; | |
| 466 | + justify-content: center; | |
| 467 | + | |
| 468 | + &__icon { | |
| 469 | + position: relative; | |
| 470 | + z-index: $u-upload-status-icon-Zindex; | |
| 471 | + } | |
| 472 | + | |
| 473 | + &__message { | |
| 474 | + font-size: $u-upload-message-font-size; | |
| 475 | + color: $u-upload-message-color; | |
| 476 | + margin-top: $u-upload-message-margin-top; | |
| 477 | + } | |
| 478 | + } | |
| 479 | + | |
| 480 | + &__button { | |
| 481 | + @include flex(column); | |
| 482 | + align-items: center; | |
| 483 | + justify-content: center; | |
| 484 | + width: $u-upload-button-width; | |
| 485 | + height: $u-upload-button-height; | |
| 486 | + background-color: $u-upload-button-bgColor; | |
| 487 | + border-radius: $u-upload-button-border-radius; | |
| 488 | + margin: $u-upload-botton-margin; | |
| 489 | + /* #ifndef APP-NVUE */ | |
| 490 | + box-sizing: border-box; | |
| 491 | + /* #endif */ | |
| 492 | + | |
| 493 | + &__text { | |
| 494 | + font-size: $u-upload-text-font-size; | |
| 495 | + color: $u-upload-text-color; | |
| 496 | + margin-top: $u-upload-text-margin-top; | |
| 497 | + } | |
| 498 | + | |
| 499 | + &--hover { | |
| 500 | + background-color: $u-upload-hover-bgColor; | |
| 501 | + } | |
| 502 | + | |
| 503 | + &--disabled { | |
| 504 | + opacity: $u-upload-disabled-opacity; | |
| 505 | + } | |
| 506 | + } | |
| 507 | +} | |
| 508 | +</style> | ... | ... |
garbage-removal/yarn.lock
| ... | ... | @@ -924,7 +924,7 @@ |
| 924 | 924 | "resolved" "https://registry.npmmirror.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz" |
| 925 | 925 | "version" "0.8.0" |
| 926 | 926 | |
| 927 | -"@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4": | |
| 927 | +"@babel/runtime@^7.17.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4": | |
| 928 | 928 | "integrity" "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==" |
| 929 | 929 | "resolved" "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.23.2.tgz" |
| 930 | 930 | "version" "7.23.2" |
| ... | ... | @@ -3075,6 +3075,11 @@ |
| 3075 | 3075 | "resolved" "https://registry.npmmirror.com/cookie/-/cookie-0.5.0.tgz" |
| 3076 | 3076 | "version" "0.5.0" |
| 3077 | 3077 | |
| 3078 | +"copy-text-to-clipboard@^3.0.1": | |
| 3079 | + "integrity" "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==" | |
| 3080 | + "resolved" "https://registry.npmmirror.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz" | |
| 3081 | + "version" "3.2.0" | |
| 3082 | + | |
| 3078 | 3083 | "core-js-compat@^3.31.0", "core-js-compat@^3.33.1": |
| 3079 | 3084 | "integrity" "sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw==" |
| 3080 | 3085 | "resolved" "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.33.2.tgz" |
| ... | ... | @@ -3082,7 +3087,7 @@ |
| 3082 | 3087 | dependencies: |
| 3083 | 3088 | "browserslist" "^4.22.1" |
| 3084 | 3089 | |
| 3085 | -"core-js@^3", "core-js@^3.31.1", "core-js@^3.4.1": | |
| 3090 | +"core-js@^3", "core-js@^3.11.0", "core-js@^3.31.1", "core-js@^3.4.1": | |
| 3086 | 3091 | "integrity" "sha512-XeBzWI6QL3nJQiHmdzbAOiMYqjrb7hwU7A39Qhvd/POSa/t9E1AeZyEZx3fNvp/vtM8zXwhoL0FsiS0hD0pruQ==" |
| 3087 | 3092 | "resolved" "https://registry.npmmirror.com/core-js/-/core-js-3.33.2.tgz" |
| 3088 | 3093 | "version" "3.33.2" |
| ... | ... | @@ -4817,6 +4822,11 @@ |
| 4817 | 4822 | "resolved" "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz" |
| 4818 | 4823 | "version" "2.1.3" |
| 4819 | 4824 | |
| 4825 | +"mutation-observer@^1.0.3": | |
| 4826 | + "integrity" "sha512-M/O/4rF2h776hV7qGMZUH3utZLO/jK7p8rnNgGkjKUw8zCGjRQPxB8z6+5l8+VjRUQ3dNYu4vjqXYLr+U8ZVNA==" | |
| 4827 | + "resolved" "https://registry.npmmirror.com/mutation-observer/-/mutation-observer-1.0.3.tgz" | |
| 4828 | + "version" "1.0.3" | |
| 4829 | + | |
| 4820 | 4830 | "nanoid@^3.3.6": |
| 4821 | 4831 | "integrity" "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==" |
| 4822 | 4832 | "resolved" "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz" |
| ... | ... | @@ -5941,6 +5951,16 @@ |
| 5941 | 5951 | "resolved" "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz" |
| 5942 | 5952 | "version" "1.1.2" |
| 5943 | 5953 | |
| 5954 | +"vconsole@^3.15.1": | |
| 5955 | + "integrity" "sha512-KH8XLdrq9T5YHJO/ixrjivHfmF2PC2CdVoK6RWZB4yftMykYIaXY1mxZYAic70vADM54kpMQF+dYmvl5NRNy1g==" | |
| 5956 | + "resolved" "https://registry.npmmirror.com/vconsole/-/vconsole-3.15.1.tgz" | |
| 5957 | + "version" "3.15.1" | |
| 5958 | + dependencies: | |
| 5959 | + "@babel/runtime" "^7.17.2" | |
| 5960 | + "copy-text-to-clipboard" "^3.0.1" | |
| 5961 | + "core-js" "^3.11.0" | |
| 5962 | + "mutation-observer" "^1.0.3" | |
| 5963 | + | |
| 5944 | 5964 | "vite@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", "vite@^4.0.0", "vite@4.0.3": |
| 5945 | 5965 | "integrity" "sha512-HvuNv1RdE7deIfQb8mPk51UKjqptO/4RXZ5yXSAvurd5xOckwS/gg8h9Tky3uSbnjYTgUm0hVCet1cyhKd73ZA==" |
| 5946 | 5966 | "resolved" "https://registry.npmmirror.com/vite/-/vite-4.0.3.tgz" | ... | ... |