You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1645 lines
43 KiB

6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
1 month ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
1 month ago
6 months ago
6 months ago
1 month ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
  1. <template>
  2. <view class="home-content">
  3. <NewUserCoupon v-if="isNewUser" @close="closeNewUserPopup" @getCoupon="handleGetCoupon"></NewUserCoupon>
  4. <view class="banner">
  5. <uni-swiper-dot class="uni-swiper-dot-box" field="content">
  6. <swiper class="swiper" indicator-dots indicator-color="rgba(255, 255, 255, 0.50)"
  7. indicator-active-color="#ffffff" autoplay interval="5000">
  8. <swiper-item v-for="(item,i) in bannerList" :key="i" @click="towebview(item)">
  9. <image :src="item&&item.image" style="width: 100%;" mode="widthFix" />
  10. <!-- <image :src="item&&item.dictValue" style="width: 100%;" mode="widthFix" /> -->
  11. </swiper-item>
  12. </swiper>
  13. </uni-swiper-dot>
  14. </view>
  15. <view style="margin: -250px 20rpx 0 20rpx;"
  16. @click="toProductDetail">
  17. <image style="width: 710rpx; height: 176rpx;" slot='cover'
  18. src="https://catmdogf.oss-cn-shanghai.aliyuncs.com/CMDF/front/petServiceOrder/TopDetail.png" />
  19. </view>
  20. <view class="card-container">
  21. <uni-card :is-shadow="false" padding="40rpx 20rpx 40rpx 20rpx" margin="20rpx">
  22. <view class="normal-bolb-text">
  23. <view @click="getLocationInfo"
  24. style="display: flex; align-items: center; justify-content: space-between;">
  25. <text v-if="isCheckLocation"
  26. style="color: #333333 ;font-size: 32rpx;font-weight: 600; font-style: normal; width: 450rpx; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;">{{locationName}}</text>
  27. <text v-else
  28. style="color: #C4C4C4 ;font-size: 32rpx;font-weight: 500; font-style: normal;">请选择宠物上门服务地址</text>
  29. <uni-icons type="location-filled" size="20" color="#FFB13F"></uni-icons>
  30. </view>
  31. </view>
  32. <view class="line" style="background-color: #EFEFEF;"></view>
  33. <view class="content-container">
  34. <view class="example-body hideOnPc">
  35. <view class="normal-bolb-text">
  36. <view @click="toggleCalendar('bottom')">
  37. <view v-if="isCheckTime"
  38. style="display: flex; align-items: center; justify-content: space-between;">
  39. <text
  40. style="color: #333333 ;font-size: 32rpx;font-weight: 600; font-style: normal; width: 450rpx; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;">{{selectedDateShowText}}</text>
  41. <text
  42. style="color: #333333 ;font-size: 32rpx;font-weight: 600; font-style: normal;">共选择
  43. <text style="color: #FFB13F;">{{selectedDate.length}}</text>
  44. </text>
  45. </view>
  46. <view v-else
  47. style="display: flex; align-items: center; justify-content: space-between;">
  48. <text
  49. style="color: #C4C4C4 ;font-size: 32rpx;font-weight: 500; font-style: normal;">请选择宠物上门服务时间</text>
  50. <uni-icons type="right" size="20" color="#FFB13F"></uni-icons>
  51. </view>
  52. </view>
  53. </view>
  54. </view>
  55. <view>
  56. <uni-popup ref="popup" background-color="#fff" @change="changePopup">
  57. <view class="popupBottom">
  58. <uni-calendar ref="calendar" class="uni-calendar--hook" :selected="selectedDate"
  59. :startDate="startDate" :endDate="endDate" :showMonth="false"
  60. @change="changeCalendar" @confirm="changeCalendar" @close="close" />
  61. <view style="display: flex; justify-content: center; align-items: center;">
  62. <image @click="closePopup" style="width: 670rpx; height: 80rpx;" slot='cover' src="https://catmdogf.oss-cn-shanghai.aliyuncs.com/CMDF/front/petServiceOrder/yesButton.png" />
  63. </view>
  64. </view>
  65. </uni-popup>
  66. </view>
  67. </view>
  68. <view class="line" style="background-color: #EFEFEF;"></view>
  69. <view>
  70. <view style="display: flex;">
  71. <view @click="getOrder(true)" style="margin-right: 20rpx;">
  72. <image style="width: 304rpx; height: 100rpx;" slot='cover'
  73. src="https://catmdogf.oss-cn-shanghai.aliyuncs.com/CMDF/front/petServiceOrder/OrderByCompanion.png" />
  74. </view>
  75. <view @click="getOrder(false)">
  76. <image style="width: 304rpx; height: 100rpx;"
  77. src="https://catmdogf.oss-cn-shanghai.aliyuncs.com/CMDF/front/petServiceOrder/OrderBySystem.png" />
  78. </view>
  79. </view>
  80. </view>
  81. </uni-card>
  82. </view>
  83. <view class="coupon-list">
  84. <uni-card :is-shadow="false" padding=0 margin="10px">
  85. <view class="coupon-title" slot="title">
  86. <view class="coupon-title-left">
  87. <view class="coupon-flag"></view>
  88. <view>领券中心</view>
  89. </view>
  90. <view class="coupon-title-right">
  91. <view @click="getAllCoupon">
  92. 更多 <uni-icons type="right" size="14px" color="#AAAAAA"></uni-icons>
  93. </view>
  94. </view>
  95. </view>
  96. <view class="split-line"></view>
  97. <view class="coupon-content">
  98. <CouponItem
  99. v-for="(item,index) in couponData"
  100. :key="index"
  101. :couponData="item"
  102. @show-rule="showRulePopup"
  103. @coupon-received="handleCouponReceived"
  104. @update-coupon="updateCouponData"
  105. />
  106. </view>
  107. </uni-card>
  108. </view>
  109. <view class="companion-list">
  110. <uni-card :is-shadow="false" padding=0 margin="10px">
  111. <view class="companion-title" slot="title">
  112. <view class="companion-title-left">
  113. <view class="companion-flag"></view>
  114. <view>周边伴宠师</view>
  115. </view>
  116. <view class="companion-title-right" @click="getAllCompanion">
  117. <view>
  118. 更多 <uni-icons type="right" size="14px" color="#AAA"></uni-icons>
  119. </view>
  120. </view>
  121. </view>
  122. <view class="split-line"></view>
  123. <view class="companion-content"
  124. v-for="(item,index) in companionList" :key="index"
  125. v-if="index < 1">
  126. <view class="companion-item">
  127. <view class="companion-info">
  128. <image class="companion-img" slot='cover'
  129. :src="item.userImage">
  130. </image>
  131. <view class="companion-info-1">
  132. <view class="companion-info-2">
  133. <view class="companion-info-title">
  134. <view class="companion-name">
  135. {{ item.userName || '匿名' }}
  136. </view>
  137. <view class="companion-sex">
  138. <img :src="item.appletUsersTeacher.sex == 0?'https://catmdogf.oss-cn-shanghai.aliyuncs.com/CMDF/front/personal/pet/sex_m.png':
  139. 'https://catmdogf.oss-cn-shanghai.aliyuncs.com/CMDF/front/personal/pet/sex_f.png'" alt="sex"
  140. style="width: 20px;height: 20px;" />
  141. </view>
  142. </view>
  143. <view class="companion-info-star">
  144. <text style="color: #FFB13F;">点赞数{{ item.appletUsersTeacher.thumbsUp || 0 }}</text>
  145. <uni-icons type="hand-up-filled" size="20" color="#FFB13F"></uni-icons>
  146. </view>
  147. </view>
  148. <view class="companion-info-3" style="width: 100%;">
  149. <view class="ellipsis" v-if="item.distanceText">
  150. 距离{{ item.distanceText }}km
  151. </view>
  152. <view class="ellipsis" v-else>
  153. {{ '<' }}1km
  154. </view>
  155. </view>
  156. <view class="companion-info-4" style="width: 100%;">
  157. <view class="ellipsis" style="max-width: 225px;">
  158. 简介{{ item.appletUsersTeacher.userBrief || '暂无' }}
  159. </view>
  160. </view>
  161. </view>
  162. </view>
  163. </view>
  164. <view>
  165. <view class="companion-item-bottom">
  166. <text class="companion-item-bottom-text">养宠{{ item.experience || 0 }} | 评价{{ item.commentNum || 0 }} | 服务小结{{ item.serviceSummaryNum || 0 }}</text>
  167. </view>
  168. </view>
  169. </view>
  170. <view class="no-data" v-if="companionList.length == 0">
  171. <view class="no-data-text">
  172. 您周边没有伴宠师呢
  173. </view>
  174. </view>
  175. </uni-card>
  176. </view>
  177. <view class="history-record">
  178. <uni-card :is-shadow="false" padding=0 margin="10px">
  179. <view class="history-record-title" slot="title">
  180. <view class="history-record-title-left">
  181. <view class="history-record-flag"></view>
  182. <view>历史记录</view>
  183. </view>
  184. <!-- <view class="history-record-title-right">
  185. <view @click="getAllRecord">
  186. 查看服务记录和评价详情 <uni-icons type="right" size="14px" color="#AAAAAA"></uni-icons>
  187. </view>
  188. </view> -->
  189. </view>
  190. <view class="split-line"></view>
  191. <view class="history-record-content"
  192. v-if="historyRecordConfig &&
  193. historyRecordConfig.length > 0">
  194. <view class="history-record-content-image">
  195. <view class="history-record-content-image-1"
  196. v-for="(item, index) in historyRecordConfig"
  197. :key="index"
  198. :style="'background-image: url(' + item.image + '); background-size: cover;'">
  199. <view class="history-record-content-image-1-text">
  200. <view class="history-record-content-image-1-text-1">{{ item.count }}</view>
  201. <view class="history-record-content-image-1-text-2">{{ item.time }}</view>
  202. </view>
  203. </view>
  204. </view>
  205. <view class="history-record-content-text">
  206. <text>*数据来源于猫妈狗爸平台</text>
  207. </view>
  208. </view>
  209. <view class="history-record-content" v-else>
  210. <view class="history-record-content-image">
  211. <view class="history-record-content-image-1">
  212. <view class="history-record-content-image-1-text">
  213. <view class="history-record-content-image-1-text-1">{{historyRecord.dog}}</view>
  214. <view class="history-record-content-image-1-text-2">{{historyRecord.dogTime}}</view>
  215. </view>
  216. </view>
  217. <view class="history-record-content-image-2">
  218. <view class="history-record-content-image-2-text">
  219. <view class="history-record-content-image-2-text-1">{{historyRecord.cat}}</view>
  220. <view class="history-record-content-image-2-text-2">至2{{historyRecord.catTime}}</view>
  221. </view>
  222. </view>
  223. <view class="history-record-content-image-3">
  224. <view class="history-record-content-image-3-text">
  225. <view class="history-record-content-image-3-text-1">{{historyRecord.num}}</view>
  226. <view class="history-record-content-image-3-text-2">{{historyRecord.numTime}}</view>
  227. </view>
  228. </view>
  229. </view>
  230. <view class="history-record-content-text">
  231. <text>*数据来源于猫妈狗爸平台</text>
  232. </view>
  233. </view>
  234. </uni-card>
  235. </view>
  236. <view class="service-content">
  237. <image src="https://catmdogf.oss-cn-shanghai.aliyuncs.com/CMDF/front/second_stage/ysbz.png"
  238. style="width: 100%;" mode="widthFix" alt="service" />
  239. </view>
  240. <!-- <view class="card-container">
  241. <uni-card :is-shadow="false" padding="0px" margin="10px">
  242. <view class="title-img4"></view>
  243. <uni-row class="demo-uni-row">
  244. <uni-col :span="12" v-for="(item,index) in peopleList" :key="index">
  245. <uni-card :is-shadow="false" margin="5px" padding="0" spacing="0" :border="false"
  246. shadow="0px 0px 0px 0px rgba(0, 0, 0, 0.08)">
  247. <image class="people-img" slot='cover' style="width: 100%;"
  248. :src="item&&item.staffImages&&item.staffImages.length>0?item.staffImages[0].url:defaultStaffIamge">
  249. </image>
  250. <text class="people-year">{{item.serviceAge}}年从业经验</text>
  251. <text class="show-text-1">姓名{{item.nickName}}</text>
  252. <text class="show-text-2">简介{{item.shortDescription}}</text>
  253. </uni-card>
  254. </uni-col>
  255. </uni-row>
  256. </uni-card>
  257. </view> -->
  258. <view>
  259. <image style="height: 132rpx; width: 710rpx; margin: 0 20rpx 20rpx 20rpx;"
  260. slot='cover'
  261. @click="toPetFront"
  262. src="https://catmdogf.oss-cn-shanghai.aliyuncs.com/CMDF/front/petServiceOrder/joinus.png" />
  263. </view>
  264. <Kefu></Kefu>
  265. <!-- <view class="coupon_wrap" v-if="envVersion.includes('dev')">
  266. <view class="details-subscribe">
  267. <view @click="getCoupon" class="details-btn">点击领取到卡包</view>
  268. </view>
  269. <view v-if="showMask" @closeMask="closeMask">
  270. <view class="mask-coupon" @click="closeMask">
  271. <view class="wx-coupon">
  272. <view class="title">
  273. 领取优惠券
  274. <i>*</i>
  275. </view>
  276. <view class="content">
  277. 优惠券列表显示
  278. </view>
  279. <view class="" v-for="(item,index) in couponList" :key="index">
  280. <send-coupon @sendcoupon="getSendCoupon" @userconfirm="redirectuser" :sign="item.sign"
  281. :send_coupon_params="item.sendCouponParams"
  282. :send_coupon_merchant="item.send_coupon_merchant">
  283. <view class="text-button">{{item.wechatStock.stockName}}</view>
  284. </send-coupon>
  285. </view>
  286. </view>
  287. </view>
  288. </view>
  289. </view> -->
  290. <!-- 优惠券详细规则弹窗 -->
  291. <CouponRulePopup ref="rulePopup" :coupon="currentCoupon" />
  292. </view>
  293. </template>
  294. <script>
  295. import { bindCode } from '@/api/order/order.js'
  296. import { listAppletBanner } from '@/api/order/AppletOrderBanner.js'
  297. import {
  298. getStaffList,
  299. getProductList,
  300. getBannerList,
  301. getCouponList,
  302. getCouponListNoAuth,
  303. getOpenId,
  304. } from "@/api/system/user"
  305. import {
  306. setToken,
  307. getToken,
  308. getOpenIdKey,
  309. setOpenIdKey
  310. } from '@/utils/auth'
  311. // import { getTeacherListIndex } from '@/api/home'
  312. import {
  313. getTeacherList,
  314. } from "@/api/order/order"
  315. import Kefu from './common/kefu.vue'
  316. import uniPopup from '@/uni_modules/uni-popup/components/uni-popup/uni-popup.vue';
  317. import NewUserCoupon from './components/NewUserCoupon.vue';
  318. import CouponItem from '@/components/CouponItem/index.vue';
  319. import CouponRulePopup from '@/components/CouponRulePopup/index.vue';
  320. import positionMixin from '@/mixins/position.js';
  321. import {getPhoneNumber} from "@/api/system/user.js"
  322. export default {
  323. mixins: [positionMixin],
  324. data() {
  325. return {
  326. current: 0,
  327. swiperDotIndex: 0,
  328. defaultSkuImage: 'https://catmdogf.oss-cn-shanghai.aliyuncs.com/CMDF/front/banner/%E5%96%82%E5%85%BB.png',
  329. defaultStaffIamge: 'https://catmdogf.oss-cn-shanghai.aliyuncs.com/CMDF/front/banner/gold_people.png',
  330. defaultLink: '/pages/details/feed',
  331. skuData: [],
  332. peopleList: [],
  333. cover: 'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/shuijiao.jpg',
  334. bannerList: [],
  335. couponList: [],
  336. showMask: false,
  337. envVersion: 'develop',
  338. isNewUser: false,
  339. selectedDate: [],
  340. startDate: '',
  341. endDate: '',
  342. isCheckTime: false,
  343. selectedDateShowText: '',
  344. isCheckLocation: false,
  345. locationName: '',
  346. locationLatitude: '',
  347. locationLongitude: '',
  348. locationAddress: '',
  349. allInfo: {
  350. isCheckLocation: false,
  351. locationName: '',
  352. locationLatitude: '',
  353. locationLongitude: '',
  354. locationAddress: '',
  355. selectedDate: [],
  356. isCheckTime: false,
  357. selectedDateShowText: '',
  358. },
  359. defaultCompanion: {
  360. name: '宠小二',
  361. gender: 0,
  362. star: 560,
  363. distance: 1.5,
  364. shortDescription: '有一只三岁蓝猫叫憨憨,热爱小宠物,心地善良,喜欢动物',
  365. staffImages: [{
  366. url: "https://catmdogf.oss-cn-shanghai.aliyuncs.com/2024/01/2634af25c5bf294f39b795ecc9d3c4eefa微信图片_20240126125100.png"
  367. }],
  368. year: 4,
  369. record: 11,
  370. serviceNum: 13,
  371. },
  372. couponData: [],
  373. historyRecord: {
  374. dog: "47131",
  375. dogTime: "2024.12.12",
  376. cat: "47131",
  377. catTime: "2024.12.12",
  378. num: "47131",
  379. numTime: "2024.12.12",
  380. },
  381. historyRecordConfig : [],
  382. currentCoupon: null,
  383. companionList: [],
  384. isMember: false,
  385. }
  386. },
  387. components: {
  388. Kefu,
  389. uniPopup,
  390. NewUserCoupon,
  391. CouponItem,
  392. CouponRulePopup
  393. },
  394. // onLoad() {
  395. // this.getCalendarDate();
  396. // },
  397. methods: {
  398. towebview(item){
  399. if(!item.url){
  400. return
  401. }
  402. if(item.url.indexOf('https://') === 0 || item.url.indexOf('http://') === 0){
  403. uni.navigateTo({
  404. url: '/pages_order/webview/webview?url=' + encodeURIComponent(item.url)
  405. })
  406. return
  407. }
  408. uni.navigateTo({
  409. url: item.url
  410. })
  411. },
  412. closeNewUserPopup() {
  413. this.isNewUser = false;
  414. },
  415. handleGetCoupon() {
  416. if (getToken()) {
  417. } else {
  418. uni.navigateTo({
  419. url: '/pages/personalCenter/index'
  420. });
  421. }
  422. },
  423. getAllCoupon() {
  424. uni.navigateTo({
  425. url: '/pages_order/companionPetList/couponList'
  426. });
  427. },
  428. getAllCompanion() {
  429. if (!this.isCheckLocation) {
  430. uni.showToast({
  431. title: '请先选择地址',
  432. duration: 1500,
  433. icon: "none"
  434. })
  435. } else {
  436. uni.navigateTo({
  437. url: `/pages_order/companionPetList/companionPetList?info=` + encodeURIComponent(JSON
  438. .stringify(this.allInfo))
  439. });
  440. }
  441. },
  442. toProductDetail(){
  443. uni.switchTab({
  444. url: 'details/feed'
  445. })
  446. },
  447. getAllRecord () {
  448. },
  449. toggleCalendar(type) {
  450. this.type = type
  451. uni.hideTabBar()
  452. this.$refs.popup.open(type)
  453. },
  454. closePopup() {
  455. this.$refs.popup.close()
  456. setTimeout(() => {
  457. uni.showTabBar()
  458. }, 300)
  459. },
  460. changePopup(e) {
  461. console.log('当前模式:' + e.type + ',状态:' + e.show);
  462. if (e.show) {
  463. uni.hideTabBar()
  464. } else {
  465. setTimeout(() => {
  466. uni.showTabBar()
  467. }, 300)
  468. }
  469. },
  470. close() {
  471. console.log('弹窗关闭');
  472. },
  473. confirm(e) {
  474. console.log('confirm 返回:', e)
  475. },
  476. changeCalendar(e) {
  477. console.log('change 返回:', e)
  478. this.selectedDateShowText = ''
  479. const selectedValue = this.selectedDate.find(item => item.date === e.fulldate)
  480. console.log('const selectedValue', selectedValue)
  481. if (selectedValue) {
  482. this.selectedDate = this.selectedDate.filter(item => item.date !== e.fulldate);
  483. this.allInfo.selectedDate = this.selectedDate;
  484. } else {
  485. this.selectedDate.push({
  486. date: e.fulldate,
  487. info: 'time'
  488. })
  489. this.allInfo.selectedDate = this.selectedDate
  490. console.log('this.selectedDate', this.selectedDate)
  491. }
  492. console.log("this.selectedDate.length", this.selectedDate.length)
  493. console.log("this.selectedDate", this.selectedDate)
  494. if (this.selectedDate.length > 0) {
  495. this.isCheckTime = true
  496. this.allInfo.isCheckTime = this.isCheckTime
  497. if (this.selectedDate.length == 1) {
  498. this.selectedDateShowText = this.selectedDate[0].date + ''
  499. this.selectedDateShowText = this.selectedDateShowText.replace(/-/g, "/");
  500. this.allInfo.selectedDateShowText = this.selectedDateShowText
  501. } else if (this.selectedDate.length == 2) {
  502. this.selectedDateShowText = this.selectedDate[0].date + "," + this.selectedDate[1].date
  503. this.selectedDateShowText = this.selectedDateShowText.replace(/-/g, "/");
  504. this.allInfo.selectedDateShowText = this.selectedDateShowText
  505. } else if (this.selectedDate.length > 2) {
  506. this.selectedDateShowText = this.selectedDate[0].date + '...' + this.selectedDate[this.selectedDate
  507. .length - 1].date
  508. this.selectedDateShowText = this.selectedDateShowText.replace(/-/g, "/");
  509. this.allInfo.selectedDateShowText = this.selectedDateShowText
  510. }
  511. } else {
  512. this.isCheckTime = false
  513. this.allInfo.isCheckTime = this.isCheckTime
  514. }
  515. },
  516. getCalendarDate() {
  517. let tomorrow = new Date()
  518. tomorrow.setDate(tomorrow.getDate());
  519. this.startDate = this.formatDate(tomorrow);
  520. let threeMonthsLater = new Date();
  521. threeMonthsLater.setMonth(threeMonthsLater.getMonth() + 3);
  522. this.endDate = this.formatDate(threeMonthsLater);
  523. },
  524. formatDate(date) {
  525. let year = date.getFullYear();
  526. let month = (date.getMonth() + 1).toString().padStart(2, '0');
  527. let day = date.getDate().toString().padStart(2, '0');
  528. return year + '-' + month + '-' + day;
  529. },
  530. getLocationInfo() {
  531. wx.chooseLocation({
  532. type: 'gcj02',
  533. success: (res) => {
  534. this.isCheckLocation = true
  535. this.locationName = res.address
  536. this.locationLongitude = res.longitude
  537. this.locationLatitude = res.latitude
  538. this.locationAddress = res.address
  539. console.log('选择的位置:', res);
  540. this.allInfo.isCheckLocation = true
  541. this.allInfo.locationName = res.address
  542. this.allInfo.locationLongitude = res.longitude
  543. this.allInfo.locationLatitude = res.latitude
  544. this.allInfo.locationAddress = res.address
  545. // 保存位置信息到Vuex
  546. this.$store.commit('setPosition', {
  547. address: res.address,
  548. longitude: res.longitude,
  549. latitude: res.latitude
  550. });
  551. // 获取周边伴宠师
  552. this.getCompanionList();
  553. },
  554. fail: (err) => {
  555. console.error('选择位置失败:', err);
  556. }
  557. });
  558. },
  559. getLocationFirst() {
  560. wx.chooseLocation({
  561. type: 'gcj02',
  562. success: (res) => {
  563. this.isCheckLocation = true
  564. this.locationName = res.address
  565. this.locationLongitude = res.longitude
  566. this.locationLatitude = res.latitude
  567. this.locationAddress = res.address
  568. this.allInfo.isCheckLocation = true
  569. this.allInfo.locationName = res.address
  570. this.allInfo.locationLongitude = res.longitude
  571. this.allInfo.locationLatitude = res.latitude
  572. this.allInfo.locationAddress = res.address
  573. // 保存位置信息到Vuex
  574. this.$store.commit('setPosition', {
  575. address: res.address,
  576. longitude: res.longitude,
  577. latitude: res.latitude
  578. });
  579. // 获取周边伴宠师
  580. this.getCompanionList();
  581. },
  582. fail: (err) => {
  583. console.error('选择位置失败:', err);
  584. }
  585. });
  586. },
  587. getLocation(){
  588. return new Promise((resolve, reject) => {
  589. uni.getLocation({
  590. type: 'gcj02',
  591. success: (res) => {
  592. resolve(res)
  593. }
  594. })
  595. })
  596. },
  597. async getCompanionList() {
  598. // 构建参数,使用当前位置坐标
  599. let data = {
  600. latitude: this.position.latitude,
  601. longitude: this.position.longitude,
  602. }
  603. // if(!data.latitude){
  604. // let res = await this.getLocation()
  605. // data.latitude = res.latitude
  606. // data.longitude = res.longitude
  607. // }
  608. getTeacherList({}).then(response => {
  609. if (response.code == 200) {
  610. this.companionList = response.rows
  611. this.calculateTeacherListDistance()
  612. }
  613. console.log(response);
  614. })
  615. },
  616. // 跳转伴宠师
  617. toPetFront(){
  618. uni.navigateToMiniProgram({
  619. appId: 'wx01f0f43759922fda',
  620. // path: '',
  621. envVersion: "release",
  622. success: res => {
  623. // 打开成功
  624. console.log("打开成功", res);
  625. },
  626. fail: err => {
  627. console.log(err);
  628. }
  629. })
  630. },
  631. calculateTeacherListDistance(){
  632. this.companionList.forEach(item => {
  633. item.distanceText = this.calculateDistanceAddress(item.appletAddresseList)
  634. })
  635. this.companionList.sort((a,b) => a.distanceText - b.distanceText)
  636. },
  637. getOrder(value) {
  638. if (value) {
  639. if (!this.isCheckLocation) {
  640. uni.showToast({
  641. title: '请先选择地址',
  642. duration: 1500,
  643. icon: "none"
  644. })
  645. } else {
  646. this.$store.commit('setPosition', {
  647. address: this.locationAddress,
  648. longitude: this.locationLongitude,
  649. latitude: this.locationLatitude,
  650. date: this.selectedDateShowText
  651. })
  652. uni.navigateTo({
  653. url: `/pages_order/companionPetList/companionPetList?info=`
  654. + encodeURIComponent(JSON
  655. .stringify(this.allInfo))
  656. });
  657. }
  658. } else {
  659. this.initGlobalData()
  660. this.$store.commit('setPosition', {})
  661. this.buyInfo.teacher = null
  662. uni.navigateTo({
  663. url: '/pages/newOrder/serviceNew',
  664. });
  665. }
  666. },
  667. getCouponListAuth() {
  668. getCouponList().then(res => {
  669. if (res.code == 200) {
  670. for (let index = 0; index < res.data.length; index++) {
  671. const element = res.data[index];
  672. if(element.sendType == 'newUser'){
  673. this.couponData = [element]
  674. this.isNewUser = true
  675. this.$store.commit('setNewUserCoupon', element)
  676. return
  677. }
  678. }
  679. this.couponData = [res.data[0]]
  680. } else {
  681. this.$modal.showToast('获取优惠券失败')
  682. }
  683. })
  684. },
  685. getCouponListNoAuth() {
  686. // console.log('进入 getCouponListNoAuth:');
  687. // getCouponListNoAuth().then(res => {
  688. // if (res.code == 200) {
  689. // if (res.rows && Array.isArray(res.rows)) {
  690. // this.couponData = res.rows.filter(item => item !== null);
  691. // console.log("优惠券数据加载成功:", this.couponData);
  692. // } else if (res.data && Array.isArray(res.data)) {
  693. // this.couponData = res.data.filter(item => item !== null);
  694. // console.log("优惠券数据加载成功:", this.couponData);
  695. // } else {
  696. // console.log("获取优惠券数据格式异常:", res);
  697. // }
  698. // } else {
  699. // this.$modal.showToast('获取优惠券失败')
  700. // }
  701. // }).catch(err => {
  702. // console.error("获取优惠券列表出错:", err);
  703. // })
  704. },
  705. closeMask() {
  706. this.showMask = false
  707. },
  708. getSendCoupon(res) {
  709. let that = this
  710. console.log('res', res)
  711. if (res.detail.errcode == 'OK') {
  712. console.log(222)
  713. if (res.detail.send_coupon_result[0].code == 'SUCCESS') {
  714. that.showMask = false
  715. uni.showToast({
  716. title: '领取成功',
  717. icon: 'success',
  718. duration: 2000,
  719. })
  720. } else {
  721. uni.showModal({
  722. title: '领取失败',
  723. content: res.detail.send_coupon_result[0].message,
  724. showCancel: false,
  725. success: function(res) {
  726. that.showMask = false
  727. }
  728. })
  729. }
  730. } else {
  731. uni.showToast({
  732. title: '领取失败',
  733. icon: 'none'
  734. })
  735. that.showMask = false
  736. }
  737. },
  738. redirectuser() {},
  739. getBanner() {
  740. // getBannerList().then(res => {
  741. // if (res.code == 200) {
  742. // this.bannerList = res.data
  743. // } else {
  744. // this.$modal.showToast('获取Banner失败')
  745. // }
  746. // })
  747. listAppletBanner({
  748. pageNum: 1,
  749. pageSize: 9999999,
  750. }).then(res => {
  751. if (res.code == 200) {
  752. this.bannerList = res.data.records
  753. } else {
  754. this.$modal.showToast('获取Banner失败')
  755. }
  756. })
  757. },
  758. changeSwiper(e) {
  759. this.current = e.detail.current
  760. },
  761. getPeopleList() {
  762. getStaffList().then(response => {
  763. if (response.code == 200) {
  764. this.peopleList = response.rows
  765. }
  766. console.log(response);
  767. })
  768. },
  769. getProductList() {
  770. getProductList({
  771. "publishStatus": 1,
  772. "categoryId": 76
  773. }).then(response => {
  774. if (response && response.content && response.content.length > 0) {
  775. this.skuData = response.content;
  776. }
  777. console.log(response);
  778. })
  779. },
  780. goDetails(item) {
  781. if (item) {
  782. uni.navigateTo({
  783. url: `/pages/details/detail?id=${item.id}`
  784. });
  785. } else {
  786. this.$modal.showToast('数据有误,请联系管理员')
  787. }
  788. },
  789. init() {
  790. this.$globalData.itemPrice = []
  791. this.$globalData.submitData = {
  792. "phone": "",
  793. "wechatId": "",
  794. "note": "",
  795. "totalPrice": "",
  796. "address": {
  797. "province": "",
  798. "city": "",
  799. "district": "",
  800. "detailAddress": ""
  801. },
  802. "skuList": [],
  803. "service": {
  804. "serviceFrequency": "once_a_day",
  805. "serviceDate": [],
  806. "serviceTimeFirst": "",
  807. "serviceTimeSecond": "",
  808. "pet": []
  809. }
  810. }
  811. },
  812. login() {
  813. uni.login({
  814. provider: 'weixin',
  815. success: (loginRes) => {
  816. console.log("login", loginRes)
  817. this.getOpenId(loginRes.code)
  818. },
  819. fail: function(error) {
  820. uni.showToast('授权失败,请授权后再试')
  821. }
  822. });
  823. },
  824. getOpenId(code) {
  825. getOpenId(code).then(res => {
  826. if (res.code == 200 && res.data) {
  827. let resData = JSON.parse(res.data)
  828. let token = resData.token;
  829. let openId = resData.openId;
  830. setOpenIdKey(openId)
  831. if (token) {
  832. setToken(token)
  833. if(uni.getStorageSync('inviteCode')){
  834. bindCode({
  835. openId : openId,
  836. code : uni.getStorageSync('inviteCode'),
  837. })
  838. }
  839. }
  840. }
  841. })
  842. },
  843. showRulePopup(coupon) {
  844. if (!coupon) {
  845. console.warn('尝试显示空优惠券详情');
  846. return;
  847. }
  848. this.currentCoupon = coupon;
  849. this.$refs.rulePopup.show();
  850. },
  851. // 处理优惠券领取成功事件
  852. handleCouponReceived(couponData) {
  853. console.log('首页优惠券领取成功:', couponData);
  854. // 可以在这里处理一些额外的逻辑,比如刷新优惠券列表等
  855. },
  856. // 更新优惠券数据
  857. updateCouponData(updatedCoupon) {
  858. // 找到对应的优惠券并更新数据
  859. const couponIndex = this.couponData.findIndex(item => item.id === updatedCoupon.id);
  860. if (couponIndex !== -1) {
  861. // 使用Vue.set或者$set来确保响应式更新
  862. this.$set(this.couponData, couponIndex, updatedCoupon);
  863. }
  864. }
  865. },
  866. onShow() {
  867. if (!getToken() || !getOpenIdKey()) {
  868. this.login()
  869. }else {
  870. this.getCouponListAuth()
  871. this.$store.commit('getUserInfo')
  872. }
  873. if(this.$globalData.mainSku.length < 1 || !this.$globalData.mainSku[0].price){
  874. // 获取主产品
  875. this.getProductList()
  876. }
  877. this.currentAddress = this.$globalData.newOrderData.currentAddress
  878. if(this.currentAddress&&this.currentAddress.name){
  879. this.isAddressSelected=true
  880. }
  881. this.currentPets = this.$globalData.newOrderData.currentPets
  882. if(this.currentPets&&this.currentPets.length>0){
  883. this.isPetSelected=true
  884. }
  885. this.needPreFamiliarize = this.$globalData.newOrderData.needPreFamiliarize
  886. // 初始化伴宠师等级
  887. if(this.$globalData.newOrderData.companionLevel) {
  888. this.companionLevel = this.$globalData.newOrderData.companionLevel
  889. }
  890. // 获取周边伴宠师数据
  891. this.getCompanionList();
  892. },
  893. onLoad: function({inviteCode}) {
  894. if(inviteCode){
  895. uni.setStorageSync('inviteCode', inviteCode)
  896. }
  897. this.init()
  898. // this.getPeopleList()
  899. this.getProductList()
  900. this.getBanner()
  901. const accountInfo = wx.getAccountInfoSync();
  902. this.envVersion = accountInfo.miniProgram.envVersion;
  903. if (!getToken() || !getOpenIdKey()) {
  904. this.login()
  905. } else {
  906. this.getCouponListAuth()
  907. }
  908. // 设置默认位置,这样即使用户不选择位置也能显示一些伴宠师
  909. this.$store.commit('setPosition', {
  910. address: "上海市浦东新区浦东南路150弄",
  911. longitude: 121.49857,
  912. latitude: 31.22514
  913. });
  914. uni.$on('initConfig', r => {
  915. let homejson = this.$store.state.configMap.home_config
  916. console.log('homejson', homejson);
  917. if(homejson && homejson.paramValueText){
  918. try{
  919. let home = JSON.parse(homejson.paramValueText)
  920. this.historyRecordConfig = home && home.historyRecords || []
  921. }catch(e){}
  922. }
  923. })
  924. this.getCalendarDate()
  925. }
  926. }
  927. </script>
  928. <style lang="scss">
  929. page {
  930. background-color: #F5F5F7 !important;
  931. }
  932. .no-data{
  933. width: 100%;
  934. height: 100%;
  935. display: flex;
  936. align-items: center;
  937. justify-content: center;
  938. .no-data-text{
  939. font-size: 24rpx;
  940. color: #999;
  941. }
  942. }
  943. .home-content {
  944. position: relative;
  945. .swiper {
  946. height: calc(100vw * 1098/1125);
  947. }
  948. .banner {
  949. height: calc(100vw * 1098/1125 + 250px);
  950. background-image: linear-gradient(180deg, #FFBF60 0%, #FFBF60 90%, #F5F5F7 99.41%);
  951. }
  952. .uni-card {
  953. border-radius: 16rpx;
  954. }
  955. .float-button {
  956. position: fixed;
  957. bottom: 150px;
  958. right: 10px;
  959. width: 50px;
  960. height: 50px;
  961. .kf-btn {
  962. background-color: rgba(255, 255, 255, 1);
  963. height: 52px;
  964. width: 52px;
  965. border-radius: 50%;
  966. display: flex;
  967. align-items: center;
  968. }
  969. }
  970. .coupon-list {
  971. width: 100%;
  972. .coupon-title {
  973. display: flex;
  974. line-height: 33rpx;
  975. margin: 42rpx 0 30rpx;
  976. justify-content: space-between;
  977. .coupon-title-left {
  978. display: flex;
  979. align-items: center;
  980. font-weight: 900;
  981. font-size: 30rpx;
  982. color: #333333;
  983. .coupon-flag {
  984. width: 8rpx;
  985. height: 33rpx;
  986. background: #FFBF60;
  987. border-radius: 30rpx 30rpx 30rpx 30rpx;
  988. margin-right: 10rpx;
  989. }
  990. }
  991. .coupon-title-right {
  992. color: #7D8196;
  993. font-size: 24rpx;
  994. font-style: normal;
  995. font-weight: 500;
  996. line-height: 28rpx;
  997. }
  998. }
  999. .split-line {
  1000. width: 100%;
  1001. height: 1rpx;
  1002. background: #EFEFEF;
  1003. }
  1004. .coupon-content {
  1005. // 优惠券内容样式已移至CouponItem组件
  1006. }
  1007. }
  1008. .companion-list {
  1009. width: 100%;
  1010. .companion-title {
  1011. display: flex;
  1012. line-height: 33rpx;
  1013. margin: 42rpx 0 30rpx;
  1014. justify-content: space-between;
  1015. .companion-title-left {
  1016. display: flex;
  1017. align-items: center;
  1018. font-weight: 900;
  1019. font-size: 30rpx;
  1020. color: #333333;
  1021. .companion-flag {
  1022. width: 8rpx;
  1023. height: 33rpx;
  1024. background: #FFBF60;
  1025. border-radius: 30rpx 30rpx 30rpx 30rpx;
  1026. margin-right: 10rpx;
  1027. }
  1028. }
  1029. .companion-title-right {
  1030. color: #7D8196;
  1031. font-size: 24rpx;
  1032. font-style: normal;
  1033. font-weight: 500;
  1034. line-height: 28rpx;
  1035. }
  1036. }
  1037. .split-line {
  1038. width: 100%;
  1039. height: 1rpx;
  1040. background: #EFEFEF;
  1041. }
  1042. .companion-content {
  1043. .companion-item {
  1044. padding: 10px 0px 0px 0;
  1045. .companion-info {
  1046. display: flex;
  1047. align-items: center;
  1048. justify-content: flex-start;
  1049. .companion-img {
  1050. width: 168rpx;
  1051. height: 168rpx;
  1052. border: #FEA714 5rpx solid;
  1053. border-radius: 20rpx;
  1054. }
  1055. .companion-info-1 {
  1056. margin-left: 10px;
  1057. width: 80%;
  1058. .companion-info-2 {
  1059. display: flex;
  1060. flex-wrap: wrap;
  1061. .companion-info-title {
  1062. display: flex;
  1063. flex-wrap: wrap;
  1064. width: 60%;
  1065. }
  1066. .companion-name {
  1067. color: #333;
  1068. font-size: 32rpx;
  1069. margin-right: 10rpx;
  1070. font-weight: 900;
  1071. font-style: normal;
  1072. }
  1073. .companion-info-star {
  1074. color: #FFAA48;
  1075. font-size: 24rpx;
  1076. font-weight: 400;
  1077. line-height: 28rpx;
  1078. display: flex;
  1079. align-items: center;
  1080. }
  1081. }
  1082. .companion-info-3 {
  1083. display: flex;
  1084. align-items: baseline;
  1085. font-size: 28rpx;
  1086. line-height: 32rpx;
  1087. margin-top: 5px;
  1088. color: #FFAA48;
  1089. font-weight: 900;
  1090. }
  1091. .companion-info-4 {
  1092. display: flex;
  1093. align-items: baseline;
  1094. font-size: 24rpx;
  1095. margin-top: 10px;
  1096. color: #7D8196;
  1097. font-weight: 400;
  1098. line-height: 32rpx;
  1099. }
  1100. }
  1101. }
  1102. }
  1103. .companion-item-bottom {
  1104. height: 60rpx;
  1105. background-color: #FFF4E5;
  1106. margin: 20rpx 0 20rpx 0;
  1107. display: flex;
  1108. align-items: center;
  1109. justify-content: center;
  1110. border-radius: 8rpx;
  1111. .companion-item-bottom-text {
  1112. color: #A94F20;
  1113. margin: 14rpx;
  1114. font-size: 24rpx;
  1115. font-weight: 400;
  1116. }
  1117. }
  1118. }
  1119. }
  1120. .history-record {
  1121. width: 100%;
  1122. .history-record-title {
  1123. display: flex;
  1124. line-height: 33rpx;
  1125. margin: 42rpx 0 30rpx;
  1126. justify-content: space-between;
  1127. .history-record-title-left {
  1128. display: flex;
  1129. align-items: center;
  1130. font-weight: 900;
  1131. font-size: 30rpx;
  1132. color: #333333;
  1133. .history-record-flag {
  1134. width: 8rpx;
  1135. height: 33rpx;
  1136. background: #FFBF60;
  1137. border-radius: 30rpx 30rpx 30rpx 30rpx;
  1138. margin-right: 10rpx;
  1139. }
  1140. }
  1141. .history-record-title-right {
  1142. color: #7D8196;
  1143. font-size: 24rpx;
  1144. font-style: normal;
  1145. font-weight: 500;
  1146. line-height: 28rpx;
  1147. }
  1148. }
  1149. .split-line {
  1150. width: 100%;
  1151. height: 1rpx;
  1152. background: #EFEFEF;
  1153. }
  1154. .history-record-content {
  1155. padding: 20rpx 0 20rpx 0;
  1156. .history-record-content-image {
  1157. display: flex;
  1158. flex-wrap: nowrap;
  1159. margin-bottom: 10rpx;
  1160. .history-record-content-image-1 {
  1161. background-image: url("https://catmdogf.oss-cn-shanghai.aliyuncs.com/CMDF/front/petServiceOrder/catNum.png");
  1162. background-size: cover;
  1163. width: 208rpx;
  1164. height: 260rpx;
  1165. margin-right: 20rpx;
  1166. .history-record-content-image-1-text {
  1167. .history-record-content-image-1-text-1 {
  1168. width: 100%;
  1169. display: flex;
  1170. justify-content: center;
  1171. height: 156rpx;
  1172. align-items: flex-end;
  1173. color: #FF8D00;
  1174. font-size: 32rpx;
  1175. font-weight: 900;
  1176. }
  1177. .history-record-content-image-1-text-2 {
  1178. width: 100%;
  1179. display: flex;
  1180. justify-content: center;
  1181. height: 90rpx;
  1182. align-items: flex-end;
  1183. color: #AAAAAA;
  1184. font-size: 24rpx;
  1185. font-weight: 400;
  1186. }
  1187. }
  1188. }
  1189. .history-record-content-image-2 {
  1190. background-image: url("https://catmdogf.oss-cn-shanghai.aliyuncs.com/CMDF/front/petServiceOrder/dogNum.png");
  1191. background-size: cover;
  1192. width: 208rpx;
  1193. height: 260rpx;
  1194. margin-right: 20rpx;
  1195. .history-record-content-image-2-text {
  1196. .history-record-content-image-2-text-1 {
  1197. width: 100%;
  1198. display: flex;
  1199. justify-content: center;
  1200. height: 156rpx;
  1201. align-items: flex-end;
  1202. color: #FF8D00;
  1203. font-size: 32rpx;
  1204. font-weight: 900;
  1205. }
  1206. .history-record-content-image-2-text-2 {
  1207. width: 100%;
  1208. display: flex;
  1209. justify-content: center;
  1210. height: 90rpx;
  1211. align-items: flex-end;
  1212. color: #AAAAAA;
  1213. font-size: 24rpx;
  1214. font-weight: 400;
  1215. }
  1216. }
  1217. }
  1218. .history-record-content-image-3 {
  1219. background-image: url("https://catmdogf.oss-cn-shanghai.aliyuncs.com/CMDF/front/petServiceOrder/goodNum.png");
  1220. background-size: cover;
  1221. width: 208rpx;
  1222. height: 260rpx;
  1223. .history-record-content-image-3-text {
  1224. .history-record-content-image-3-text-1 {
  1225. width: 100%;
  1226. display: flex;
  1227. justify-content: center;
  1228. height: 156rpx;
  1229. align-items: flex-end;
  1230. color: #FF8D00;
  1231. font-size: 32rpx;
  1232. font-weight: 900;
  1233. }
  1234. .history-record-content-image-3-text-2 {
  1235. width: 100%;
  1236. display: flex;
  1237. justify-content: center;
  1238. height: 90rpx;
  1239. align-items: flex-end;
  1240. color: #AAAAAA;
  1241. font-size: 24rpx;
  1242. font-weight: 400;
  1243. }
  1244. }
  1245. }
  1246. }
  1247. .history-record-content-text {
  1248. font-size: 24rpx;
  1249. font-weight: 400;
  1250. color: #A94F20;
  1251. }
  1252. }
  1253. }
  1254. }
  1255. page {
  1256. display: flex;
  1257. flex-direction: column;
  1258. box-sizing: border-box;
  1259. background-color: #fff;
  1260. min-height: 100%;
  1261. height: auto;
  1262. }
  1263. .text {
  1264. text-align: center;
  1265. font-size: 26rpx;
  1266. margin-top: 10rpx;
  1267. }
  1268. .popupBottom {
  1269. height: 950rpx;
  1270. overflow: hidden;
  1271. position: fixed;
  1272. bottom: 0;
  1273. left: 0;
  1274. right: 0;
  1275. padding: 10rpx 20rpx;
  1276. border-radius: 20rpx 20rpx 0 0;
  1277. background-color: #fff;
  1278. .bottom-btn {
  1279. width: 100%;
  1280. border-radius: 120rpx;
  1281. background: #FFB13F;
  1282. font-size: 32rpx;
  1283. color: #FFFFFF;
  1284. }
  1285. }
  1286. .line {
  1287. height: 1px;
  1288. width: 100%;
  1289. margin: 16px 0;
  1290. }
  1291. .swiper-item {
  1292. display: flex;
  1293. flex-direction: column;
  1294. justify-content: center;
  1295. align-items: center;
  1296. color: #fff;
  1297. height: 500rpx;
  1298. line-height: 300rpx;
  1299. }
  1300. .card-container {
  1301. margin: 0;
  1302. padding: 0;
  1303. }
  1304. .title-img1 {
  1305. height: 30px;
  1306. width: 104px;
  1307. background-repeat: no-repeat;
  1308. background-position: left;
  1309. background-size: 104px 30px;
  1310. background-image: url('/static/images/pages/cwfw.png');
  1311. }
  1312. .service-content-img {
  1313. padding: 5px;
  1314. margin-top: 5px;
  1315. border-radius: 8px;
  1316. }
  1317. #myVideo {
  1318. width: 100%;
  1319. border-radius: 5px;
  1320. }
  1321. .service-content {
  1322. width: 100%;
  1323. padding: 0 10px;
  1324. }
  1325. .title-img4 {
  1326. height: 30px;
  1327. width: 202px;
  1328. background-repeat: no-repeat;
  1329. background-position: center;
  1330. background-size: 202px 30px;
  1331. background-image: url('/static/images/pages/jppcs.png');
  1332. margin: 10px 0;
  1333. }
  1334. .demo-uni-row {
  1335. margin: 0;
  1336. padding: 0;
  1337. }
  1338. .people-img {
  1339. width: 190px;
  1340. height: 163px;
  1341. border: #FFBF60 1px solid;
  1342. border-radius: 5px;
  1343. }
  1344. .people-year {
  1345. display: flex;
  1346. width: 68px;
  1347. padding: 1px 4px;
  1348. justify-content: space-between;
  1349. align-items: center;
  1350. border-radius: 0px 10px 10px 0px;
  1351. background: linear-gradient(90deg, #FDA714 0%, #FD8B04 99.41%);
  1352. color: #FFF;
  1353. font-family: PingFang SC;
  1354. font-size: 10px;
  1355. font-style: normal;
  1356. line-height: 14px;
  1357. position: absolute;
  1358. top: 15px;
  1359. left: 0;
  1360. }
  1361. .service-people {
  1362. display: flex;
  1363. }
  1364. .service-people-text {
  1365. display: flex;
  1366. align-items: center;
  1367. line-height: 24px;
  1368. }
  1369. .service-people-text::before {
  1370. content: "";
  1371. background-color: black;
  1372. border-radius: 50%;
  1373. display: inline-block;
  1374. height: 5px;
  1375. width: 5px;
  1376. margin-right: 5px;
  1377. }
  1378. .show-text-1 {
  1379. display: block;
  1380. color: var(--Color-, #222229);
  1381. font-family: PingFang SC;
  1382. font-size: 14px;
  1383. font-style: normal;
  1384. font-weight: 600;
  1385. line-height: 24px;
  1386. }
  1387. .show-text-2 {
  1388. display: block;
  1389. color: var(--Color-, #222229);
  1390. font-family: PingFang SC;
  1391. font-size: 12px;
  1392. font-style: normal;
  1393. line-height: 18px;
  1394. }
  1395. .image-wrapper {
  1396. position: relative;
  1397. }
  1398. .text-wrapper {
  1399. position: absolute;
  1400. bottom: 83px;
  1401. left: 10px;
  1402. color: #fff;
  1403. font-size: 10px;
  1404. font-weight: blod;
  1405. font-family: PingFang SC;
  1406. }
  1407. .coupone_wrap {
  1408. margin-top: 200px;
  1409. }
  1410. .details-subscribe {
  1411. background-color: #FFFFFF;
  1412. padding: 10px;
  1413. width: 100%;
  1414. height: 58px;
  1415. position: fixed;
  1416. bottom: 0;
  1417. z-index: 100;
  1418. .details-btn {
  1419. width: 100%;
  1420. border-radius: 6px;
  1421. background: #FFB13F;
  1422. font-size: 16px;
  1423. color: #FFFFFF;
  1424. }
  1425. }
  1426. .text-button {
  1427. height: 100rpx;
  1428. border-radius: 0px 0px 6rpx 0;
  1429. background: rgba(255, 208, 0, 1);
  1430. font-weight: 500;
  1431. font-size: 36rpx;
  1432. display: flex;
  1433. align-items: center;
  1434. justify-content: center;
  1435. }
  1436. .couponItem {
  1437. width: 100%;
  1438. padding: 0 30rpx;
  1439. margin-top: 24rpx;
  1440. -webkit-overflow-scrolling: touch;
  1441. }
  1442. .couponItem:last-child {
  1443. margin-bottom: 24rpx;
  1444. }
  1445. .mask-coupon {
  1446. background: rgba(0, 0, 0, .5);
  1447. width: 100vw;
  1448. height: 100vh;
  1449. position: fixed;
  1450. left: 0;
  1451. top: 0;
  1452. padding-bottom: 120rpx;
  1453. .wx-coupon {
  1454. background: #F2F2F2;
  1455. min-height: 300px;
  1456. position: fixed;
  1457. bottom: 0;
  1458. left: 0;
  1459. width: 100%;
  1460. }
  1461. .title {
  1462. font-size: 24px;
  1463. display: flex;
  1464. align-items: center;
  1465. justify-content: center;
  1466. padding: 20rpx 0 10rpx;
  1467. }
  1468. .content {
  1469. height: 80%;
  1470. overflow-y: auto;
  1471. }
  1472. .text-button {
  1473. height: 100rpx;
  1474. border-radius: 0px 0px 6rpx 0;
  1475. background: rgba(255, 208, 0, 1);
  1476. font-weight: 500;
  1477. font-size: 36rpx;
  1478. display: flex;
  1479. align-items: center;
  1480. justify-content: center;
  1481. }
  1482. }
  1483. @media screen and (min-width: 500px) {
  1484. .uni-swiper-dot-box {
  1485. width: 400px;
  1486. margin: 0 auto;
  1487. margin-top: 8px;
  1488. }
  1489. .image {
  1490. width: 100%;
  1491. }
  1492. }
  1493. </style>