run-errands.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. <template>
  2. <view class="flex-common-css iPhone-bottom box-border-box p-24">
  3. <Nav title="跑腿代拿" leftIconColor="#333" titleColor="#333"></Nav>
  4. <scroll-view :scroll-y="true" class="scroll-view-css">
  5. <view class="box-border-box mb-20">
  6. <uni-swiper-dot :info="bannerList" mode="dot" :dotsStyles="dotStyle" :current="current">
  7. <swiper class="swiper" @change="change" :autoplay='true' :circular='true' interval="4000">
  8. <swiper-item v-for="(item,i) in bannerList" :key="i">
  9. <image class="swiper-item" :src="item.image" mode="aspectFill">
  10. </image>
  11. </swiper-item>
  12. </swiper>
  13. </uni-swiper-dot>
  14. </view>
  15. <view class="align-items-center p-16 box-border-box b-rad-20 bgc-f mb-20">
  16. <view class="flex-1 flex-direction align-items-center b-rad-20 ptb-15" v-for="(item,index) in serveData"
  17. :key="index" @click="serveClick(item)"
  18. :class="formData.errands_id === item.errands_id?'bgc-BCEAFF':'bgc-f'">
  19. <image class="item-img mb-8 b-rad-16" :src="item.img" mode=""></image>
  20. <view class="text-align-center fs-26">
  21. {{item.name}}
  22. </view>
  23. </view>
  24. </view>
  25. <view class="form-box bgc-f b-rad-16 p-20 box-border-box">
  26. <view class="align-items-flex-start mb-20">
  27. <view class="fs-26 fc-3 mr-20 flex-shrink0 pt-15">
  28. <text class="fc-ff3939">*</text>服务描述 :
  29. </view>
  30. <view class="textarea-box flex-1 bgc-F6F6F6 b-rad-16">
  31. <textarea class="textarea" v-model="formData.serve_desc" maxlength='50'
  32. :placeholder="errandsData.desc" />
  33. <view class="fs-24 fc-6 tj-num">
  34. {{formData.serve_desc.length}}/50
  35. </view>
  36. </view>
  37. </view>
  38. <view class="align-items-flex-start mb-20">
  39. <view class="fs-26 fc-3 mr-20 flex-shrink0 pt-15">
  40. 图片介绍 :
  41. </view>
  42. <view class="up-img-box align-items-center flex-wrap-wrap">
  43. <view class="up-img" v-for="(item, index) in formData.images" :key="index">
  44. <image class="img" :src="item" mode="aspectFill"></image>
  45. <uni-icons @click="deleteImg(index)" class="delete-icons" color="#000" type="clear"
  46. size="20"></uni-icons>
  47. </view>
  48. <view @click="upImg" v-if="formData.images.length<= 5"
  49. class="add-img-box flex-direction flex-justify-center align-items-center bgc-F6F6F6">
  50. <image class="add-img" src="@/static/img/my/sc.png" mode=""></image>
  51. <view class="fs-20 fc-9">
  52. 上传照片
  53. </view>
  54. <view class="fs-20 fc-9">
  55. (最多6张)
  56. </view>
  57. </view>
  58. </view>
  59. </view>
  60. <view class="align-items-flex-start mb-20">
  61. <view class="fs-26 fc-3 mr-20 flex-shrink0 pt-15">
  62. <text class="fc-ff3939">*</text>服务地址 :
  63. </view>
  64. <view class="textarea-box flex-1 bgc-F6F6F6 b-rad-16">
  65. <textarea class="textarea" cursor-spacing='30' v-model="formData.serve_address" maxlength='50'
  66. :placeholder="errandsData.add_str" />
  67. <view class="fs-24 fc-6 tj-num">
  68. {{formData.serve_address.length}}/50
  69. </view>
  70. </view>
  71. </view>
  72. <view class="align-items-center ptb-24 b-b-EFF2F5 mb-20" @click="openAddress">
  73. <view class="fs-26 fc-3 mr-20 flex-shrink0">
  74. <text class="fc-ff3939" v-if="errandsData.errands_id != 4">*</text>送达地址 :
  75. </view>
  76. <view class="text-overflow-ellipsis-one fs-26" :class="formData.address_id?'fc-0':'fc-9'">
  77. {{formData.address_id?addressData.school_name + addressData.dorm_name + addressData.address :'选择地址'}}
  78. </view>
  79. </view>
  80. <view class="align-items-center ptb-24 b-b-EFF2F5 mb-20" @click="openTime">
  81. <view class="fs-26 fc-3 mr-20 flex-shrink0">
  82. <text class="fc-ff3939">*</text>{{errandsData.time_str}} :
  83. </view>
  84. <view class="text-overflow-ellipsis-one fs-26" :class="deliverText?'fc-0':'fc-9'">
  85. {{deliverText?'预计'+ deliverText+ '送达':'选择'+ errandsData.time_str}}
  86. </view>
  87. </view>
  88. <view class="align-items-center ptb-24 b-b-EFF2F5 mb-20" @click="openItem"
  89. v-if="errandsData.item && errandsData.item.length>0">
  90. <view class="fs-26 fc-3 mr-20 flex-shrink0">
  91. <text class="fc-ff3939">*</text>{{errandsData.item_name}} :
  92. </view>
  93. <view class="text-overflow-ellipsis-one fs-26" :class="itemData.item_id?'fc-0':'fc-9'">
  94. {{itemData.item_id?itemData.name:'选择'+ errandsData.item_name}}
  95. </view>
  96. </view>
  97. <view class="align-items-center ptb-24 b-b-EFF2F5 mb-20">
  98. <view class="fs-26 fc-3 mr-20 flex-shrink0">
  99. <text class="fc-ff3939">*</text>是否上楼 :
  100. </view>
  101. <view class="fs-26 align-items-center">
  102. <view class="align-items-center mr-50" @click="formData.is_up = 0">
  103. <uni-icons class="mr-10" v-if="formData.is_up === 0" type="checkbox-filled" size="22"
  104. color="#4495FD"></uni-icons>
  105. <uni-icons class="mr-10" v-else type="circle" size="22" color="#000"></uni-icons>
  106. <view class="fs-28 mr-10">
  107. 否
  108. </view>
  109. <view class="fs-28">
  110. (0元)
  111. </view>
  112. </view>
  113. <view class="align-items-center" @click="formData.is_up = 1">
  114. <uni-icons class="mr-10" v-if="formData.is_up === 1" type="checkbox-filled" size="22"
  115. color="#4495FD"></uni-icons>
  116. <uni-icons class="mr-10" v-else type="circle" size="22" color="#000"></uni-icons>
  117. <view class="fs-28 mr-10">
  118. 是
  119. </view>
  120. <view class="fs-28 mr-10 fc-FB3D03">
  121. ¥{{errandsData.up_price}}
  122. </view>
  123. </view>
  124. </view>
  125. </view>
  126. <view class="align-items-center ptb-24 b-b-EFF2F5 mb-20">
  127. <view class="fs-26 fc-3 mr-20 flex-shrink0">
  128. 打赏金额 :
  129. </view>
  130. <view class="">
  131. <input v-model="formData.reward_money" type="digit" cursor-spacing='20' class="uni-input"
  132. placeholder="自定义金额 0~1000" />
  133. </view>
  134. </view>
  135. </view>
  136. </scroll-view>
  137. <view class="p-20 box-border-box bgc-f b-t-F9F9F9">
  138. <view class="but-box align-items-center box-border-box flex-justify-space b-rad-200">
  139. <view class="but-left align-items-center flex-1 bgc-3 pl-24 box-border-box">
  140. <view class="fs-32 fc-FB4845 mr-20 fw-600">
  141. ¥ {{amount}}
  142. </view>
  143. <view class="fs-24 fc-f">
  144. (点击展开明细)
  145. </view>
  146. </view>
  147. <view class="but bgc-5CC2FF fs-26 fc-f text-align-center">
  148. 去下单
  149. </view>
  150. </view>
  151. </view>
  152. <selectAddressVue ref="selectAddress" @giveAddress='giveAddress'></selectAddressVue>
  153. <timeVue ref="selectTime" @giveTime='giveTime' @timeAndType='timeAndType'></timeVue>
  154. <selectModVue ref="selectModRef" @selectData='selectData' :popTitleName='errandsData.item_name'></selectModVue>
  155. </view>
  156. </template>
  157. <script>
  158. import selectAddressVue from './confirm-mod/select-address.vue';
  159. import timeVue from './confirm-mod/time.vue';
  160. import selectModVue from './run-errands-mod/select-mod.vue';
  161. import {
  162. getAddressDefault
  163. } from '@/api/member.js'
  164. import {
  165. errandsBanner,
  166. errandsServe
  167. } from "@/api/errands.js"
  168. import tools from '@/service/tools';
  169. import {
  170. upLoadingFileOss
  171. } from "@/service/upLoadingFile.js"
  172. export default {
  173. components: {
  174. selectAddressVue,
  175. timeVue,
  176. selectModVue
  177. },
  178. data() {
  179. return {
  180. bannerList: [],
  181. dotStyle: {
  182. width: 6,
  183. bottom: 6,
  184. backgroundColor: 'rgba(51, 51, 51,0.3)',
  185. border: '1px rgba(0,0,0,0) solid',
  186. color: '#fff',
  187. selectedBackgroundColor: 'rgba(79, 179, 239,0.9)',
  188. selectedBorder: '1px rgba(0,0,0,0) solid'
  189. },
  190. current: 0,
  191. serveData: [], // 类型
  192. errandsData: {}, // 类型对应的数据
  193. formData: {
  194. errands_id: 0,
  195. serve_desc: '',
  196. serve_address: '',
  197. images: [],
  198. address_id: '',
  199. time_type: '',
  200. serve_time: '',
  201. item_id: 0,
  202. is_up: 0,
  203. reward_money: ''
  204. },
  205. deliverText: '',
  206. addressData: {},
  207. itemData: {},
  208. amount: '0.00',
  209. };
  210. },
  211. onShow() {
  212. let isConfirmAddressFlag = uni.getStorageSync('isConfirmAddressFlag');
  213. if (isConfirmAddressFlag.flag) {
  214. this.openAddress(isConfirmAddressFlag);
  215. }
  216. },
  217. onHide() {
  218. uni.removeStorageSync('isConfirmAddressFlag');
  219. },
  220. onUnload() {
  221. uni.removeStorageSync('isConfirmAddressFlag');
  222. },
  223. onLoad(data) {
  224. this.getAddressDefault();
  225. },
  226. mounted() {
  227. this.getBanner()
  228. this.getErrandsServe()
  229. },
  230. methods: {
  231. selectData(item) {
  232. if (item) {
  233. this.itemData = item
  234. }
  235. },
  236. openItem() {
  237. this.$refs.selectModRef.getList(this.formData.item_id, this.errandsData.item);
  238. },
  239. openTime() {
  240. // 选择时间
  241. this.$refs.selectTime.getList(0, this.errandsData.time);
  242. },
  243. timeAndType(type, time) {
  244. // 时间选择
  245. this.formData.time_type = type
  246. this.formData.serve_time = time
  247. if (type == 1) {
  248. this.deliverText = '今天' + time
  249. } else {
  250. this.deliverText = '明天' + time
  251. }
  252. console.log(type, time, '&&&&&&&&&&&&&&&&&&&&&&&&');
  253. },
  254. giveTime(e) {
  255. console.log(e);
  256. },
  257. openAddress(addressData) {
  258. // 选择地址
  259. if (this.addressData.id) {
  260. this.$refs.selectAddress.id = this.addressData.id;
  261. }
  262. if (addressData && addressData.is_default == 1) {
  263. this.$refs.selectAddress.id = addressData.id;
  264. this.$refs.selectAddress.getList(addressData.id);
  265. } else {
  266. this.$refs.selectAddress.getList();
  267. }
  268. },
  269. // 获取默认地址
  270. getAddressDefault() {
  271. getAddressDefault().then((res) => {
  272. if (res.code === 1) {
  273. this.addressData = res.data
  274. if (this.addressData.id) {
  275. this.formData.address_id = this.addressData.id;
  276. }
  277. }
  278. })
  279. },
  280. giveAddress(e) {
  281. this.addressData = e;
  282. this.formData.address_id = this.addressData.id;
  283. },
  284. deleteImg(index) {
  285. this.formData.images.splice(index, 1)
  286. },
  287. upImg() {
  288. uni.chooseImage({
  289. count: 6,
  290. sizeType: ["compressed", "camera"],
  291. sourceType: ["album", "camera"],
  292. success: (res) => {
  293. res.tempFiles.forEach((file) => {
  294. this.uploadingFile(file);
  295. })
  296. }
  297. })
  298. },
  299. uploadingFile(file) {
  300. upLoadingFileOss(file.path).then((res) => {
  301. if (res) {
  302. this.formData.images.push(res)
  303. } else {
  304. tools.error('图片上传失败')
  305. }
  306. })
  307. },
  308. serveClick(item) {
  309. if (this.formData.errands_id === item.errands_id) {
  310. return
  311. }
  312. this.formData.errands_id = item.errands_id
  313. this.errandsData = item
  314. this.itemData = {}
  315. this.deliverText = ''
  316. },
  317. getBanner() {
  318. errandsBanner().then((res) => {
  319. if (res.code === 1) {
  320. this.bannerList = res.data;
  321. }
  322. })
  323. },
  324. getErrandsServe() {
  325. errandsServe().then((res) => {
  326. if (res.code === 1) {
  327. this.serveData = res.data
  328. this.formData.errands_id = this.serveData[0].errands_id
  329. this.errandsData = this.serveData[0]
  330. }
  331. })
  332. },
  333. change(e) {
  334. this.current = e.detail.current
  335. },
  336. },
  337. }
  338. </script>
  339. <style lang="scss" scoped>
  340. .swiper {
  341. width: 702rpx;
  342. height: 280rpx;
  343. border-radius: 20rpx;
  344. .swiper-item {
  345. width: 702rpx;
  346. height: 280rpx;
  347. border-radius: 20rpx;
  348. }
  349. }
  350. .item-img {
  351. width: 60rpx;
  352. height: 60rpx;
  353. }
  354. .up-img {
  355. width: 150rpx;
  356. height: 150rpx;
  357. margin: 0 8rpx 8rpx 0;
  358. position: relative;
  359. .img {
  360. width: 100%;
  361. height: 100%;
  362. border-radius: 10rpx;
  363. }
  364. .delete-icons {
  365. position: absolute;
  366. right: 0;
  367. top: 0;
  368. }
  369. }
  370. .textarea-box {
  371. height: 150rpx;
  372. position: relative;
  373. }
  374. .tj-num {
  375. position: absolute;
  376. right: 10rpx;
  377. bottom: 10rpx;
  378. }
  379. .textarea {
  380. width: 100%;
  381. height: 100%;
  382. padding: 20rpx;
  383. box-sizing: border-box;
  384. }
  385. .add-img-box {
  386. width: 150rpx;
  387. height: 150rpx;
  388. border: 1px dashed #666;
  389. .add-img {
  390. width: 36rpx;
  391. height: 36rpx;
  392. }
  393. }
  394. .but-box {
  395. height: 80rpx;
  396. }
  397. .but-left {
  398. height: 100%;
  399. line-height: 80rpx;
  400. border-radius: 200rpx 0 0 200rpx;
  401. }
  402. .but {
  403. width: 180rpx;
  404. height: 100%;
  405. line-height: 80rpx;
  406. border-radius: 0 200rpx 200rpx 0;
  407. }
  408. </style>