爱简收旧衣按件回收前端代码仓库
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.

716 lines
20 KiB

1 week ago
1 week ago
1 week ago
1 week ago
6 days ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
  1. <template>
  2. <view class="pickup-container" :style="{paddingTop: navBarHeightRpx + 'rpx'}">
  3. <!-- 顶部导航栏 -->
  4. <view class="nav-bar" :style="{height: (statusBarHeight + 88) + 'rpx', paddingTop: statusBarHeight + 'px'}">
  5. <view class="back" @tap="goBack">
  6. <uni-icons type="left" size="20"></uni-icons>
  7. </view>
  8. <text class="title">免费上门取件预约</text>
  9. </view>
  10. <!-- 内容区域 -->
  11. <view class="content">
  12. <!-- 回收流程卡片 -->
  13. <view class="card process-card">
  14. <view class="card-title process-title">回收流程</view>
  15. <view class="process-steps">
  16. <view
  17. class="process-step-card"
  18. v-for="(step, i) in steps"
  19. :key="i"
  20. >
  21. <image :src="step.icon" class="step-icon" mode="aspectFit" />
  22. <view v-if="i === 0" class="step-bottom-bar">
  23. <view class="step-num-bar">
  24. <text class="text-main">{{ step.num }}{{ step.text }}</text>
  25. </view>
  26. </view>
  27. <view v-else class="step-label-gray">
  28. <text class="text-gray">{{ step.num }}{{ step.text }}</text>
  29. </view>
  30. </view>
  31. </view>
  32. <view class="divider"></view>
  33. <!-- 取件信息 -->
  34. <view class="pickup-info">
  35. <view class="info-item" @tap="selectAddress">
  36. <text class="label">取件地址</text>
  37. <view class="value">
  38. <text class="text" :class="{placeholder: !displayAddress}">{{ displayAddress || '请选择' }}</text>
  39. <text class="arrow">></text>
  40. </view>
  41. </view>
  42. <view class="info-item" @tap="openTimePicker">
  43. <text class="label">上门时间</text>
  44. <view class="value">
  45. <text class="text" :class="{placeholder: !selectedTime}">{{ selectedTime || '请选择' }}</text>
  46. <text class="arrow">></text>
  47. </view>
  48. </view>
  49. </view>
  50. </view>
  51. <!-- 订单详情卡片 -->
  52. <view class="card order-card">
  53. <view class="card-title process-title">订单详情</view>
  54. <view class="order-items">
  55. <view class="order-item" v-for="(item, index) in showAllItems ? selectedItems : selectedItems.slice(0, 3)" :key="index">
  56. <image :src="item.icon" mode="aspectFit"></image>
  57. <view class="item-info">
  58. <view class="name">{{ item.name }}</view>
  59. <view class="desc">{{ item.desc }}</view>
  60. <view class="price-row">
  61. <text class="price">{{ item.unitPrice }}/</text>
  62. <text class="count">x{{ item.quantity }}</text>
  63. <text class="amount">{{ item.unitPrice * item.quantity }}</text>
  64. </view>
  65. </view>
  66. </view>
  67. </view>
  68. <view v-if="selectedItems.length > 3" class="expand-btn" @tap="toggleExpandOrder">
  69. <text>{{ showAllItems ? '收起' : `展开(共${selectedItems.length}件)` }}</text>
  70. <text class="arrow">{{ showAllItems ? '▲' : '▼' }}</text>
  71. </view>
  72. </view>
  73. </view>
  74. <!-- 订单说明 -->
  75. <view class="order-desc">
  76. <view>1. 当前回收快递免费上门由于快递成本较高为避免不必要的成本及资源二次浪费不属于回收品类或不符合回收标准的物品请勿寄出</view>
  77. <view>2. 已通过的回收物品将正常结算不符合回收要求的物品可选择安排取回逾期未联系将默认捐赠无法再次取回</view>
  78. <view>3. 若用户寄出大量不可回收的物品平台有权限制下次回收权限或取消下次包邮服务</view>
  79. <view>4. 对于合格率高的回收订单平台将根据实际情况给予额外回收奖励</view>
  80. </view>
  81. <!-- 底部提交栏 -->
  82. <view class="agreement-bar">
  83. <view class="checkbox" :class="{active: agreed}" @tap="toggleAgreement">
  84. <text v-if="agreed"></text>
  85. </view>
  86. <text>我已阅读并同意</text>
  87. <text class="link" @tap="showServiceAgreement">回收服务协议</text>
  88. <text></text>
  89. <text class="link" @tap="showPrivacyPolicy">隐私政策</text>
  90. </view>
  91. <view class="bottom-bar">
  92. <view class="summary">
  93. <text>已选 {{ totalCount }} 预估回收可得</text>
  94. <text class="amount">{{ totalPriceRange }}</text>
  95. </view>
  96. <button class="main-btn" @tap="submitOrder">预约上门取件</button>
  97. </view>
  98. <!-- 时间选择弹窗 -->
  99. <view class="time-picker" v-if="showTimePicker">
  100. <view class="mask" @tap="closeTimePicker"></view>
  101. <view class="picker-content">
  102. <view class="picker-header">
  103. <text class="reset" @tap="resetPicker">重置</text>
  104. <text class="title">预约上门时间</text>
  105. </view>
  106. <view class="picker-section">
  107. <view class="section-title">选择日期</view>
  108. <view class="date-btns">
  109. <view
  110. v-for="(tab, index) in dateTabs"
  111. :key="index"
  112. :class="['date-btn', {active: currentDateTab === index}]"
  113. @tap="selectDateTab(index)"
  114. >
  115. {{ tab }}
  116. </view>
  117. </view>
  118. </view>
  119. <view class="picker-section">
  120. <view class="section-title">选择时间</view>
  121. <view class="time-btns">
  122. <view
  123. v-for="(slot, idx) in timeSlots"
  124. :key="idx"
  125. :class="['time-btn', {active: selectedTimeSlot === idx}]"
  126. @tap="selectTimeSlot(idx)"
  127. >
  128. {{ slot }}
  129. </view>
  130. </view>
  131. </view>
  132. <view class="confirm-btn" @tap="confirmTime">确认</view>
  133. </view>
  134. </view>
  135. </view>
  136. </template>
  137. <script>
  138. import pullRefreshMixin from '@/pages/mixins/pullRefreshMixin.js'
  139. export default {
  140. mixins: [pullRefreshMixin],
  141. data() {
  142. return {
  143. statusBarHeight: 0,
  144. navBarHeight: 0, // px
  145. navBarHeightRpx: 0, // rpx
  146. fromRecycle: false,
  147. address: '',
  148. selectedAddress: null,
  149. selectedTime: '',
  150. agreed: false,
  151. selectedItems: [
  152. {
  153. name: '羽绒服',
  154. icon: '/static/home/羽绒服.png',
  155. desc: '允许脏破烂,160码以上',
  156. unitPrice: 8,
  157. quantity: 8
  158. },
  159. {
  160. name: '品牌服饰',
  161. icon: '/static/home/品牌服饰.png',
  162. desc: '允许脏破烂,160码以上',
  163. unitPrice: 8,
  164. quantity: 1
  165. },{
  166. name: '羽绒服',
  167. icon: '/static/home/羽绒服.png',
  168. desc: '允许脏破烂,160码以上',
  169. unitPrice: 8,
  170. quantity: 8
  171. },
  172. {
  173. name: '品牌服饰',
  174. icon: '/static/home/品牌服饰.png',
  175. desc: '允许脏破烂,160码以上',
  176. unitPrice: 8,
  177. quantity: 1
  178. },{
  179. name: '羽绒服',
  180. icon: '/static/home/羽绒服.png',
  181. desc: '允许脏破烂,160码以上',
  182. unitPrice: 8,
  183. quantity: 8
  184. },
  185. {
  186. name: '品牌服饰',
  187. icon: '/static/home/品牌服饰.png',
  188. desc: '允许脏破烂,160码以上',
  189. unitPrice: 8,
  190. quantity: 1
  191. }
  192. ],
  193. showTimePicker: false,
  194. currentDateTab: 0,
  195. dateTabs: ['今天 04-20', '明天 04-21', '后天 04-22', '周一 04-23', '周二 04-24', '周三 04-25'],
  196. timeSlots: ['11:00~13:00', '13:00~15:00', '15:00~17:00'],
  197. selectedTimeSlot: 0,
  198. steps: [
  199. { icon: '/static/home/① 在线预约.png', num: '①', text: '在线预约' },
  200. { icon: '/static/home/② 快递上门.png', num: '②', text: '快递上门' },
  201. { icon: '/static/home/③ 透明质检.png', num: '③', text: '透明质检' },
  202. { icon: '/static/home/④ 现金打款.png', num: '④', text: '现金打款' }
  203. ],
  204. showAllItems: false
  205. }
  206. },
  207. onShow() {
  208. // 页面显示时触发,包括从地址选择页面返回时
  209. console.log('当前选中的地址:', this.selectedAddress)
  210. if (this.selectedAddress) {
  211. // 确保地址信息被正确更新
  212. this.address = this.selectedAddress.address
  213. // 强制更新视图
  214. this.$forceUpdate()
  215. }
  216. },
  217. onLoad(options) {
  218. // 判断是否从回收页面跳转而来
  219. this.fromRecycle = options.fromRecycle === 'true'
  220. // 如果是从回收页面跳转来的,解析传递的衣物信息
  221. if (this.fromRecycle && options.items) {
  222. try {
  223. this.selectedItems = JSON.parse(decodeURIComponent(options.items))
  224. } catch (e) {
  225. console.error('解析衣物信息失败:', e)
  226. }
  227. }
  228. // 监听地址选择事件
  229. uni.$on('addressSelected', (address) => {
  230. console.log('接收到选中的地址:', address)
  231. this.selectedAddress = address
  232. this.address = address.address
  233. this.$forceUpdate()
  234. })
  235. const sysInfo = uni.getSystemInfoSync()
  236. this.statusBarHeight = sysInfo.statusBarHeight
  237. let navBarHeight = 44
  238. try {
  239. const menuButtonInfo = uni.getMenuButtonBoundingClientRect()
  240. navBarHeight = menuButtonInfo.bottom + menuButtonInfo.top - sysInfo.statusBarHeight
  241. } catch (e) {}
  242. this.navBarHeight = navBarHeight
  243. this.navBarHeightRpx = Math.round(navBarHeight * 750 / sysInfo.windowWidth)
  244. },
  245. onUnload() {
  246. // 页面卸载时移除事件监听
  247. uni.$off('addressSelected')
  248. },
  249. computed: {
  250. totalCount() {
  251. return this.selectedItems.reduce((sum, item) => sum + item.quantity, 0)
  252. },
  253. totalPriceRange() {
  254. if (this.selectedItems.length === 0) return '0-0'
  255. const total = this.selectedItems.reduce((sum, item) => sum + (item.unitPrice * item.quantity), 0)
  256. return `${(total * 0.92).toFixed(1)}~${(total * 1.1).toFixed(1)}`
  257. },
  258. canSubmit() {
  259. return this.agreed && this.selectedItems.length > 0 && this.selectedTime && this.displayAddress
  260. },
  261. displayAddress() {
  262. console.log('displayAddress computed:', this.selectedAddress)
  263. if (this.selectedAddress) {
  264. return this.selectedAddress.address
  265. }
  266. return ''
  267. }
  268. },
  269. methods: {
  270. async onRefresh() {
  271. // 模拟刷新数据
  272. await new Promise(resolve => setTimeout(resolve, 1000))
  273. this.stopPullRefresh()
  274. },
  275. goBack() {
  276. uni.navigateBack()
  277. },
  278. showMoreMenu() {
  279. uni.showModal({ title: '更多', content: '这里可以放更多操作' })
  280. },
  281. showScan() {
  282. uni.showModal({ title: '扫码', content: '这里可以实现扫码功能' })
  283. },
  284. selectAddress() {
  285. uni.navigateTo({ url: '/pages/subcomponent/select?mode=select' })
  286. },
  287. openTimePicker() {
  288. this.showTimePicker = true
  289. },
  290. closeTimePicker() {
  291. this.showTimePicker = false
  292. },
  293. selectDateTab(index) {
  294. this.currentDateTab = index
  295. },
  296. selectTimeSlot(index) {
  297. this.selectedTimeSlot = index
  298. },
  299. confirmTime() {
  300. this.selectedTime = `${this.dateTabs[this.currentDateTab]} ${this.timeSlots[this.selectedTimeSlot]}`
  301. this.closeTimePicker()
  302. },
  303. resetPicker() {
  304. this.currentDateTab = 0
  305. this.selectedTimeSlot = 0
  306. },
  307. toggleAgreement() {
  308. this.agreed = !this.agreed
  309. },
  310. showServiceAgreement() {
  311. uni.showModal({ title: '回收服务协议', content: '这里展示回收服务协议内容' })
  312. },
  313. showPrivacyPolicy() {
  314. uni.showModal({ title: '隐私政策', content: '这里展示隐私政策内容' })
  315. },
  316. submitOrder() {
  317. if (!this.agreed) {
  318. uni.showToast({ title: '请先同意服务协议', icon: 'none' })
  319. return
  320. }
  321. if (!this.displayAddress || this.displayAddress === '请选择取件地址') {
  322. uni.showToast({ title: '请选择取件地址', icon: 'none' })
  323. return
  324. }
  325. if (!this.selectedTime) {
  326. uni.showToast({ title: '请选择上门时间', icon: 'none' })
  327. return
  328. }
  329. if (this.selectedItems.length === 0) {
  330. uni.showToast({ title: '请选择回收物品', icon: 'none' })
  331. return
  332. }
  333. // 校验通过,提交
  334. uni.showLoading({ title: '提交中...' })
  335. setTimeout(() => {
  336. uni.hideLoading()
  337. uni.showToast({ title: '预约成功', icon: 'success' })
  338. setTimeout(() => {
  339. uni.navigateBack()
  340. }, 1500)
  341. }, 1000)
  342. },
  343. toggleExpandOrder() {
  344. this.showAllItems = !this.showAllItems
  345. }
  346. }
  347. }
  348. </script>
  349. <style lang="scss" scoped>
  350. .pickup-container {
  351. min-height: 100vh;
  352. background: #f8f8f8;
  353. }
  354. .nav-bar {
  355. position: fixed;
  356. top: 0;
  357. left: 0;
  358. right: 0;
  359. z-index: 999;
  360. display: flex;
  361. align-items: center;
  362. background: #fff;
  363. padding: 0 30rpx;
  364. .back {
  365. padding: 20rpx;
  366. margin-left: -20rpx;
  367. }
  368. .title {
  369. flex: 1;
  370. text-align: center;
  371. font-size: 34rpx;
  372. font-weight: 500;
  373. color: #222;
  374. }
  375. .right-btns {
  376. display: flex;
  377. gap: 30rpx;
  378. .more, .scan {
  379. font-size: 40rpx;
  380. color: #333;
  381. }
  382. }
  383. }
  384. .content {
  385. padding: 20rpx;
  386. }
  387. .card {
  388. background: linear-gradient(to bottom,#fff3db 0%,#fffefb 40%);
  389. border-radius: 20rpx;
  390. margin-bottom: 20rpx;
  391. overflow: hidden;
  392. box-shadow: 0 2rpx 10rpx rgba(0,0,0,0.03);
  393. }
  394. .process-card {
  395. background: #fff;
  396. border-radius: 24rpx;
  397. box-shadow: 0 8rpx 32rpx rgba(255, 149, 0, 0.08);
  398. padding: 0 0 20rpx 0;
  399. }
  400. .process-steps {
  401. display: flex;
  402. justify-content: space-between;
  403. align-items: flex-start;
  404. padding: 0 30rpx 30rpx;
  405. .process-step-card {
  406. background: #FFF8ED;
  407. border-radius: 24rpx;
  408. min-width: 140rpx;
  409. min-height: 180rpx;
  410. display: flex;
  411. flex-direction: column;
  412. align-items: center;
  413. margin-right: 24rpx;
  414. position: relative;
  415. .step-icon {
  416. width: 64rpx;
  417. height: 64rpx;
  418. margin: 24rpx 0 18rpx 0;
  419. }
  420. .step-bottom-bar {
  421. position: absolute;
  422. left: 0;
  423. right: 0;
  424. bottom: 0;
  425. height: 56rpx;
  426. background: #FFB74D;
  427. border-radius: 0 0 24rpx 24rpx;
  428. display: flex;
  429. align-items: center;
  430. justify-content: center;
  431. .step-num-bar {
  432. display: flex;
  433. flex-direction: row;
  434. align-items: center;
  435. margin-top: 8rpx;
  436. .num-main {
  437. width: 32rpx;
  438. height: 32rpx;
  439. border-radius: 50%;
  440. background: #fff;
  441. color: #FFB74D;
  442. font-size: 22rpx;
  443. display: flex;
  444. align-items: center;
  445. justify-content: center;
  446. font-weight: 600;
  447. margin-right: 10rpx;
  448. }
  449. .text-main {
  450. color: #fff;
  451. font-size: 26rpx;
  452. font-weight: 500;
  453. }
  454. }
  455. }
  456. .step-label-gray {
  457. position: absolute;
  458. left: 0;
  459. right: 0;
  460. bottom: 0;
  461. height: 56rpx;
  462. background: #FFF8ED;
  463. border-radius: 0 0 24rpx 24rpx;
  464. display: flex;
  465. align-items: center;
  466. justify-content: center;
  467. .num-gray {
  468. width: 32rpx;
  469. height: 32rpx;
  470. border-radius: 50%;
  471. background: #eee;
  472. color: #bbb;
  473. font-size: 22rpx;
  474. display: flex;
  475. align-items: center;
  476. justify-content: center;
  477. font-weight: 600;
  478. margin-right: 10rpx;
  479. }
  480. .text-gray {
  481. color: #bbb;
  482. font-size: 26rpx;
  483. font-weight: 500;
  484. }
  485. }
  486. }
  487. .process-step-card:last-child {
  488. margin-right: 0;
  489. }
  490. }
  491. .divider {
  492. height: 1rpx;
  493. background: rgba(0, 0, 0, 0.05);
  494. margin: 0 30rpx;
  495. }
  496. .pickup-info {
  497. padding: 0 30rpx;
  498. .info-item {
  499. padding: 30rpx 0;
  500. border-bottom: 1rpx solid rgba(0, 0, 0, 0.05);
  501. &:last-child { border-bottom: none; }
  502. .label {
  503. font-size: 28rpx;
  504. color: #333;
  505. margin-bottom: 16rpx;
  506. display: block;
  507. }
  508. .value {
  509. display: flex;
  510. justify-content: space-between;
  511. align-items: center;
  512. .text {
  513. flex: 1;
  514. font-size: 28rpx;
  515. color: #333;
  516. overflow: hidden;
  517. text-overflow: ellipsis;
  518. white-space: nowrap;
  519. }
  520. .text.placeholder { color: #ccc; }
  521. .arrow {
  522. color: #999;
  523. font-size: 28rpx;
  524. margin-left: 10rpx;
  525. }
  526. }
  527. }
  528. }
  529. .order-card {
  530. background: #fff;
  531. border-radius: 24rpx;
  532. box-shadow: 0 8rpx 32rpx rgba(0,0,0,0.04);
  533. margin-bottom: 20rpx;
  534. .order-items {
  535. padding: 0 30rpx;
  536. .order-item {
  537. display: flex;
  538. align-items: center;
  539. padding: 30rpx 0;
  540. border-bottom: 1rpx solid #f5f5f5;
  541. &:last-child { border-bottom: none; }
  542. image { width: 80rpx; height: 80rpx; margin-right: 20rpx; }
  543. .item-info {
  544. flex: 1;
  545. .name { font-size: 30rpx; color: #333; font-weight: 500; }
  546. .desc { font-size: 24rpx; color: #999; margin: 4rpx 0 8rpx 0; }
  547. .price-row {
  548. display: flex;
  549. align-items: center;
  550. .price { color: #FF9500; font-size: 26rpx; margin-right: 10rpx; }
  551. .count { color: #999; font-size: 24rpx; margin-right: 10rpx; }
  552. .amount { color: #333; font-size: 28rpx; margin-left: auto; }
  553. }
  554. }
  555. }
  556. }
  557. .expand-btn {
  558. text-align: center;
  559. color: #999;
  560. font-size: 24rpx;
  561. padding: 10rpx 0;
  562. .arrow { font-size: 20rpx; }
  563. }
  564. }
  565. .agreement-bar {
  566. display: flex;
  567. align-items: center;
  568. background: #fffbe6;
  569. padding: 20rpx 30rpx;
  570. font-size: 24rpx;
  571. .checkbox {
  572. width: 32rpx; height: 32rpx; border-radius: 50%; border: 2rpx solid #FFB74D;
  573. margin-right: 10rpx; display: flex; align-items: center; justify-content: center;
  574. background: #fff;
  575. &.active { background: #FFB74D; color: #fff; }
  576. }
  577. .link { color: #FFB74D; }
  578. }
  579. .bottom-bar {
  580. display: flex;
  581. align-items: center;
  582. justify-content: space-between;
  583. background: #fff;
  584. padding: 20rpx 30rpx calc(40rpx + env(safe-area-inset-bottom));
  585. .summary { color: #666; font-size: 26rpx; }
  586. .amount { color: #FF9500; font-size: 32rpx; font-weight: bold; margin-left: 10rpx; }
  587. .main-btn {
  588. background: #FFB74D;
  589. color: #fff;
  590. font-size: 28rpx;
  591. border-radius: 40rpx;
  592. padding: 0 40rpx;
  593. width: 60%;
  594. height: 80rpx;
  595. display: flex;
  596. justify-content: center;
  597. &[disabled] { opacity: 0.5; }
  598. }
  599. }
  600. .order-desc {
  601. color: #999;
  602. font-size: 22rpx;
  603. padding: 0 30rpx 20rpx 30rpx;
  604. line-height: 1.7;
  605. }
  606. .time-picker {
  607. position: fixed;
  608. left: 0;
  609. right: 0;
  610. top: 0;
  611. bottom: 0;
  612. z-index: 1000;
  613. .mask {
  614. position: absolute;
  615. left: 0;
  616. right: 0;
  617. top: 0;
  618. bottom: 0;
  619. background: rgba(0, 0, 0, 0.5);
  620. }
  621. .picker-content {
  622. position: absolute;
  623. left: 0;
  624. right: 0;
  625. bottom: 0;
  626. background: #fff;
  627. border-radius: 20rpx 20rpx 0 0;
  628. padding-bottom: env(safe-area-inset-bottom);
  629. .picker-header {
  630. padding: 30rpx 0 0 0;
  631. display: flex;
  632. align-items: center;
  633. border-bottom: 1rpx solid #eee;
  634. .reset {
  635. color: #bbb;
  636. font-size: 28rpx;
  637. margin-left: 30rpx;
  638. }
  639. .title {
  640. flex: 1;
  641. text-align: center;
  642. font-size: 32rpx;
  643. font-weight: 500;
  644. color: #222;
  645. margin-right: 60rpx;
  646. }
  647. }
  648. .picker-section {
  649. padding: 30rpx 30rpx 0 30rpx;
  650. .section-title {
  651. font-size: 28rpx;
  652. color: #222;
  653. margin-bottom: 20rpx;
  654. }
  655. .date-btns, .time-btns {
  656. display: flex;
  657. flex-wrap: wrap;
  658. gap: 20rpx 20rpx;
  659. }
  660. .date-btn, .time-btn {
  661. width: 200rpx;
  662. height: 70rpx;
  663. background: #f5f5f5;
  664. color: #999;
  665. border-radius: 18rpx;
  666. display: flex;
  667. align-items: center;
  668. justify-content: center;
  669. font-size: 28rpx;
  670. border: 2rpx solid transparent;
  671. margin-bottom: 10rpx;
  672. }
  673. .date-btn.active, .time-btn.active {
  674. background: #fff;
  675. color: #FFB74D;
  676. border: 2rpx solid #FFB74D;
  677. font-weight: 500;
  678. }
  679. }
  680. .confirm-btn {
  681. margin: 40rpx 30rpx 30rpx 30rpx;
  682. height: 90rpx;
  683. background: linear-gradient(90deg, #FFB74D 0%, #FF9500 100%);
  684. color: #fff;
  685. font-size: 32rpx;
  686. border-radius: 45rpx;
  687. display: flex;
  688. align-items: center;
  689. justify-content: center;
  690. box-shadow: 0 4rpx 16rpx rgba(255, 149, 0, 0.08);
  691. }
  692. }
  693. }
  694. .process-title {
  695. font-size: 32rpx;
  696. font-weight: bold;
  697. background: linear-gradient(to bottom,#fff3db 0%,#fffefb 40%);
  698. color: #222;
  699. text-align: left;
  700. padding: 36rpx 0 24rpx 30rpx;
  701. letter-spacing: 1rpx;
  702. }
  703. </style>