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

906 lines
21 KiB

1 week ago
5 days ago
1 week ago
1 week ago
1 week ago
  1. <template>
  2. <view class="container">
  3. <!-- 顶部绿色区域 -->
  4. <view class="top-section">
  5. <view class="header">
  6. <view class="back-icon" @tap="navigateBack">
  7. <uni-icons type="left" size="20"></uni-icons>
  8. </view>
  9. <text class="title">订单管理</text>
  10. </view>
  11. <!-- 状态标签栏 -->
  12. <view class="status-tabs">
  13. <view
  14. v-for="(tab, index) in statusTabs"
  15. :key="index"
  16. class="tab-item"
  17. :class="{ active: currentStatus === tab.value }"
  18. @tap="switchStatus(tab.value)"
  19. >
  20. <text>{{ tab.label }}</text>
  21. </view>
  22. </view>
  23. </view>
  24. <!-- 筛选栏 -->
  25. <view class="filter-bar">
  26. <view class="filter-item" @tap="showTimePicker">
  27. <text :class="{ 'text-green': showTimePickerModal || selectedTime }">{{ selectedTime || '处理时间' }}</text>
  28. <uni-icons :type="showTimePickerModal ? 'up' : 'down'" size="14" :color="showTimePickerModal || selectedTime ? '#00C853' : '#666'"></uni-icons>
  29. </view>
  30. <view class="search-area">
  31. <view
  32. class="search-box"
  33. :class="{ active: searchActive }"
  34. v-if="searchActive"
  35. >
  36. <uni-icons type="search" size="16" color="#999"></uni-icons>
  37. <input
  38. type="text"
  39. v-model="searchKey"
  40. placeholder="搜索订单号/用户名"
  41. focus
  42. />
  43. <uni-icons
  44. v-if="searchKey"
  45. type="clear"
  46. size="16"
  47. color="#bbb"
  48. @tap="searchKey = ''"
  49. ></uni-icons>
  50. <text class="cancel-btn" @tap="searchActive = false; searchKey = ''">取消</text>
  51. </view>
  52. <view
  53. class="search-icon"
  54. v-else
  55. @tap="searchActive = true"
  56. >
  57. <uni-icons type="search" size="20" color="#999"></uni-icons>
  58. </view>
  59. </view>
  60. </view>
  61. <!-- 时间选择器弹窗 -->
  62. <view
  63. v-if="showTimePickerModal"
  64. class="time-picker-overlay"
  65. @tap="closeTimePicker"
  66. @touchmove.stop.prevent
  67. >
  68. <view
  69. class="time-picker-wrapper"
  70. :style="{
  71. position: 'fixed',
  72. top: timePickerStyle.top + 'px',
  73. left: 0,
  74. width: '100vw'
  75. }"
  76. @tap.stop
  77. >
  78. <view class="time-type-header">
  79. <view
  80. class="type-item"
  81. :class="{ active: activeTimeType === 'start' }"
  82. @tap="switchTimeType('start')"
  83. >
  84. 开始时间
  85. <view class="active-line" v-if="activeTimeType === 'start'"></view>
  86. </view>
  87. <view class="type-divider"></view>
  88. <view
  89. class="type-item"
  90. :class="{ active: activeTimeType === 'end' }"
  91. @tap="switchTimeType('end')"
  92. >
  93. 结束时间
  94. <view class="active-line" v-if="activeTimeType === 'end'"></view>
  95. </view>
  96. </view>
  97. <view class="time-picker-content">
  98. <view class="select-mask">
  99. <view class="select-line"></view>
  100. <view class="select-line"></view>
  101. </view>
  102. <picker-view
  103. class="picker-view"
  104. :value="currentDateIndexes"
  105. @change="handlePickerChange"
  106. :indicator-style="'height: 88rpx;'"
  107. >
  108. <picker-view-column>
  109. <view
  110. class="picker-item"
  111. v-for="year in yearOptions"
  112. :key="year"
  113. >
  114. {{year}}
  115. </view>
  116. </picker-view-column>
  117. <picker-view-column>
  118. <view
  119. class="picker-item"
  120. v-for="month in monthOptions"
  121. :key="month"
  122. >
  123. {{month}}
  124. </view>
  125. </picker-view-column>
  126. <picker-view-column>
  127. <view
  128. class="picker-item"
  129. v-for="day in dayOptions"
  130. :key="day"
  131. >
  132. {{day}}
  133. </view>
  134. </picker-view-column>
  135. </picker-view>
  136. </view>
  137. <view class="time-picker-footer">
  138. <view class="btn btn-reset" @tap="resetTimePicker">重置</view>
  139. <view class="btn btn-confirm" @tap="confirmTimePicker">确认</view>
  140. </view>
  141. </view>
  142. </view>
  143. <!-- 订单列表 -->
  144. <scroll-view
  145. scroll-y
  146. class="order-list"
  147. @scrolltolower="loadMore"
  148. >
  149. <view
  150. v-for="(order, index) in filteredOrders"
  151. :key="index"
  152. class="order-item"
  153. >
  154. <view class="order-header">
  155. <text class="order-id">{{ order.orderId }}</text>
  156. <text class="status-tag" :class="order.status">{{ getStatusText(order.status) }}</text>
  157. </view>
  158. <view class="order-info">
  159. <view class="info-item">
  160. <text class="label">用户名称</text>
  161. <text class="value">{{ order.userName }}</text>
  162. </view>
  163. <view class="info-item">
  164. <text class="label">电话</text>
  165. <text class="value">{{ order.phone }}</text>
  166. </view>
  167. <view class="info-item">
  168. <text class="label">{{ order.status === 'appointed' ? '预约时间:' : '取件时间:' }}</text>
  169. <text class="value">{{ order.time }}</text>
  170. </view>
  171. </view>
  172. <view class="order-actions">
  173. <view
  174. class="action-btn reject"
  175. v-if="order.status === 'pending'"
  176. @tap="handleReject(order)"
  177. >
  178. <uni-icons type="undo" size="16" color="#666"></uni-icons>
  179. <text>驳回</text>
  180. </view>
  181. <view
  182. class="action-btn approve"
  183. v-if="order.status === 'pending'"
  184. @tap="handleApprove(order)"
  185. >
  186. <uni-icons type="checkmarkempty" size="16" color="#00C853"></uni-icons>
  187. <text>审批</text>
  188. </view>
  189. </view>
  190. </view>
  191. </scroll-view>
  192. </view>
  193. </template>
  194. <script>
  195. import pullRefreshMixin from '@/pages/mixins/pullRefreshMixin.js'
  196. export default {
  197. mixins: [pullRefreshMixin],
  198. data() {
  199. return {
  200. // 状态标签配置
  201. statusTabs: [
  202. { label: '全部', value: 'all' },
  203. { label: '已预约', value: 'appointed' },
  204. { label: '待质检', value: 'pending' },
  205. { label: '待结款', value: 'waiting' },
  206. { label: '已驳回', value: 'rejected' }
  207. ],
  208. currentStatus: 'all',
  209. selectedTime: '',
  210. searchActive: false,
  211. searchKey: '',
  212. showTimePickerModal: false,
  213. timePickerStyle: {
  214. top: 0
  215. },
  216. activeTimeType: 'start',
  217. startDate: {
  218. year: '',
  219. month: '',
  220. day: ''
  221. },
  222. endDate: {
  223. year: '',
  224. month: '',
  225. day: ''
  226. },
  227. orderList: [
  228. {
  229. orderId: 'RE827381278615224',
  230. userName: '周小艺',
  231. phone: '138****1234',
  232. time: '周四 11:00~13:00',
  233. status: 'appointed'
  234. },
  235. {
  236. orderId: 'RE827381278615226',
  237. userName: '周小艺',
  238. phone: '138****1234',
  239. time: '2025-03-20 11:00',
  240. status: 'pending'
  241. },
  242. {
  243. orderId: 'RE827381278615225',
  244. userName: '周小艺',
  245. phone: '138****1234',
  246. time: '2025-03-20 12:00',
  247. status: 'rejected'
  248. },
  249. {
  250. orderId: 'RE827381278615226',
  251. userName: '周小艺',
  252. phone: '138****1234',
  253. time: '2025-03-20 12:00',
  254. status: 'waiting'
  255. }
  256. ],
  257. currentDateIndexes: [0, 0, 0], // 当前选中的年月日索引
  258. // 添加时间范围
  259. timeRange: {
  260. start: '',
  261. end: ''
  262. }
  263. }
  264. },
  265. computed: {
  266. // 年份选项
  267. yearOptions() {
  268. const years = []
  269. const currentYear = new Date().getFullYear()
  270. for (let i = 0; i < 6; i++) {
  271. years.push(currentYear + i)
  272. }
  273. return years
  274. },
  275. // 月份选项
  276. monthOptions() {
  277. return Array.from({length: 12}, (_, i) => i + 1)
  278. },
  279. // 日期选项
  280. dayOptions() {
  281. return Array.from({length: 31}, (_, i) => i + 1)
  282. },
  283. // 过滤后的订单列表
  284. filteredOrders() {
  285. let result = this.orderList
  286. // 根据搜索关键词筛选
  287. if (this.searchKey) {
  288. const keyword = this.searchKey.toLowerCase()
  289. result = result.filter(order => {
  290. return order.orderId.toLowerCase().includes(keyword) ||
  291. order.userName.toLowerCase().includes(keyword)
  292. })
  293. }
  294. // 根据状态筛选
  295. if (this.currentStatus !== 'all') {
  296. result = result.filter(order => order.status === this.currentStatus)
  297. }
  298. // 根据时间范围筛选
  299. if (this.timeRange.start && this.timeRange.end) {
  300. const startTime = new Date(this.timeRange.start).getTime()
  301. const endTime = new Date(this.timeRange.end).getTime()
  302. result = result.filter(order => {
  303. // 将订单时间转换为时间戳进行比较
  304. const orderTime = this.parseOrderTime(order.time)
  305. return orderTime >= startTime && orderTime <= endTime
  306. })
  307. }
  308. return result
  309. }
  310. },
  311. methods: {
  312. async onRefresh() {
  313. // 模拟刷新数据
  314. await new Promise(resolve => setTimeout(resolve, 1000))
  315. this.stopPullRefresh()
  316. },
  317. navigateBack() {
  318. uni.navigateBack()
  319. },
  320. // 切换状态
  321. switchStatus(status) {
  322. this.currentStatus = status
  323. },
  324. // 显示时间选择器
  325. showTimePicker() {
  326. const query = uni.createSelectorQuery().in(this);
  327. query.select('.filter-item').boundingClientRect(rect => {
  328. if (rect) {
  329. this.timePickerStyle = {
  330. top: rect.bottom
  331. }
  332. }
  333. this.showTimePickerModal = true;
  334. this.activeTimeType = 'start';
  335. }).exec();
  336. },
  337. // 关闭时间选择器
  338. closeTimePicker() {
  339. this.showTimePickerModal = false
  340. },
  341. // 切换时间类型
  342. switchTimeType(type) {
  343. this.activeTimeType = type
  344. // 更新索引到当前选中的时间
  345. const target = type === 'start' ? this.startDate : this.endDate
  346. this.currentDateIndexes = [
  347. this.yearOptions.indexOf(target.year) || 0,
  348. this.monthOptions.indexOf(target.month) || 0,
  349. this.dayOptions.indexOf(target.day) || 0
  350. ]
  351. },
  352. // 处理选择器变化
  353. handlePickerChange(e) {
  354. const values = e.detail.value
  355. const target = this.activeTimeType === 'start' ? this.startDate : this.endDate
  356. // 更新选中的日期
  357. target.year = this.yearOptions[values[0]]
  358. target.month = this.monthOptions[values[1]]
  359. target.day = this.dayOptions[values[2]]
  360. // 更新当前索引
  361. this.currentDateIndexes = values
  362. },
  363. // 重置时间选择
  364. resetTimePicker() {
  365. this.startDate = {
  366. year: '',
  367. month: '',
  368. day: ''
  369. }
  370. this.endDate = {
  371. year: '',
  372. month: '',
  373. day: ''
  374. }
  375. this.currentDateIndexes = [0, 0, 0]
  376. this.activeTimeType = 'start'
  377. // 清空时间范围和显示文本
  378. this.timeRange = {
  379. start: '',
  380. end: ''
  381. }
  382. this.selectedTime = ''
  383. },
  384. // 确认时间选择
  385. confirmTimePicker() {
  386. // 检查开始时间是否完整
  387. if (!this.startDate.year || !this.startDate.month || !this.startDate.day) {
  388. uni.showToast({
  389. title: '请选择完整的开始时间',
  390. icon: 'none'
  391. })
  392. return
  393. }
  394. // 检查结束时间是否完整
  395. if (!this.endDate.year || !this.endDate.month || !this.endDate.day) {
  396. uni.showToast({
  397. title: '请选择完整的结束时间',
  398. icon: 'none'
  399. })
  400. return
  401. }
  402. // 构建时间对象进行比较
  403. const startTime = new Date(this.startDate.year, this.startDate.month - 1, this.startDate.day)
  404. const endTime = new Date(this.endDate.year, this.endDate.month - 1, this.endDate.day)
  405. if (startTime > endTime) {
  406. uni.showToast({
  407. title: '开始时间不能大于结束时间',
  408. icon: 'none'
  409. })
  410. return
  411. }
  412. // 更新显示文本
  413. const start = `${this.startDate.year}${this.startDate.month}${this.startDate.day}`
  414. const end = `${this.endDate.year}${this.endDate.month}${this.endDate.day}`
  415. this.selectedTime = `${start} - ${end}`
  416. // 更新时间范围用于筛选
  417. this.timeRange = {
  418. start: `${this.startDate.year}-${this.startDate.month}-${this.startDate.day}`,
  419. end: `${this.endDate.year}-${this.endDate.month}-${this.endDate.day}`
  420. }
  421. this.showTimePickerModal = false
  422. },
  423. // 搜索处理
  424. handleSearch() {
  425. // 搜索已经通过计算属性自动处理,无需额外操作
  426. },
  427. // 加载更多
  428. loadMore() {
  429. // 实现加载更多逻辑
  430. },
  431. // 获取状态文本
  432. getStatusText(status) {
  433. const statusMap = {
  434. appointed: '已预约',
  435. pending: '待质检',
  436. waiting: '待结款',
  437. rejected: '已驳回'
  438. }
  439. return statusMap[status] || status
  440. },
  441. // 处理驳回
  442. handleReject(order) {
  443. uni.showModal({
  444. title: '提示',
  445. content: '确定要驳回该订单吗?',
  446. success: (res) => {
  447. if (res.confirm) {
  448. // 实现驳回逻辑
  449. }
  450. }
  451. })
  452. },
  453. // 处理审批
  454. handleApprove(order) {
  455. uni.showModal({
  456. title: '提示',
  457. content: '确定要审批通过该订单吗?',
  458. success: (res) => {
  459. if (res.confirm) {
  460. // 实现审批逻辑
  461. }
  462. }
  463. })
  464. },
  465. // 解析订单时间字符串为时间戳
  466. parseOrderTime(timeStr) {
  467. // 处理"周四 11:00~13:00"格式
  468. if (timeStr.includes('周')) {
  469. // 这里可以根据实际需求处理周几的转换
  470. return new Date().getTime() // 临时返回当前时间
  471. }
  472. // 处理"2025-03-20 11:00"格式
  473. return new Date(timeStr).getTime()
  474. }
  475. }
  476. }
  477. </script>
  478. <style lang="scss" scoped>
  479. .container {
  480. min-height: 100vh;
  481. background: #f5f5f5;
  482. }
  483. .top-section {
  484. background: #fff;
  485. padding: 60rpx 30rpx 20rpx;
  486. // border-radius: 0 0 30rpx 30rpx;
  487. box-shadow: 0 8rpx 16rpx rgba(0, 200, 83, 0.15);
  488. .header {
  489. // margin-bottom: 30rpx;
  490. display: flex;
  491. align-items: center;
  492. .title {
  493. font-family: PingFang SC;
  494. font-weight: 500;
  495. font-size: 16px;
  496. line-height: 140%;
  497. letter-spacing: 0%;
  498. text-align: center;
  499. vertical-align: middle;
  500. margin-left: 30%;
  501. font-weight: bold;
  502. }
  503. }
  504. .status-tabs {
  505. display: flex;
  506. background: rgba(255,255,255,0.1);
  507. border-radius: 12rpx;
  508. padding: 4rpx;
  509. .tab-item {
  510. flex: 1;
  511. text-align: center;
  512. padding: 16rpx 0;
  513. color: #353535;
  514. font-size: 28rpx;
  515. &.active {
  516. background: #fff;
  517. border-radius: 8rpx;
  518. color: #00C853;
  519. }
  520. }
  521. }
  522. }
  523. .filter-bar {
  524. display: flex;
  525. align-items: center;
  526. background: #fff;
  527. margin: 20rpx;
  528. border-radius: 12rpx;
  529. overflow: visible;
  530. padding: 0 0;
  531. position: relative;
  532. height: 64rpx;
  533. }
  534. .filter-item {
  535. display: flex;
  536. align-items: center;
  537. padding: 0 20rpx;
  538. font-size: 28rpx;
  539. color: #353535;
  540. border-right: 1px solid #eee;
  541. .text-green {
  542. color: #00C853;
  543. }
  544. }
  545. .search-area {
  546. flex: 1;
  547. width: 100%;
  548. display: flex;
  549. justify-content: flex-end;
  550. align-items: center;
  551. position: static;
  552. overflow: visible;
  553. }
  554. .search-box {
  555. display: flex;
  556. align-items: center;
  557. width: 90%;
  558. position: absolute;
  559. left: 0;
  560. right: 0;
  561. top: 0;
  562. height: 100%;
  563. background: #f5f5f5;
  564. border-radius: 12rpx;
  565. box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.04);
  566. padding: 0 24rpx;
  567. z-index: 10;
  568. transform: translateX(100%);
  569. opacity: 0;
  570. transition: all 0.3s cubic-bezier(.4,0,.2,1);
  571. &.active {
  572. transform: translateX(0);
  573. opacity: 1;
  574. }
  575. input {
  576. flex: 1;
  577. font-size: 28rpx;
  578. margin: 0 10rpx;
  579. background: transparent;
  580. border: none;
  581. outline: none;
  582. }
  583. .cancel-btn {
  584. color: #999;
  585. font-size: 28rpx;
  586. margin-left: 16rpx;
  587. }
  588. }
  589. .search-icon {
  590. width: 64rpx;
  591. height: 64rpx;
  592. display: flex;
  593. align-items: center;
  594. justify-content: center;
  595. border-radius: 32rpx;
  596. background: #fff;
  597. box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.04);
  598. }
  599. .order-list {
  600. height: calc(100vh - 300rpx);
  601. width: 80%;
  602. margin: 0 auto;
  603. padding: 0 20rpx;
  604. }
  605. .order-item {
  606. background: #fff;
  607. border-radius: 12rpx;
  608. padding: 20rpx;
  609. margin-bottom: 20rpx;
  610. .order-header {
  611. display: flex;
  612. justify-content: space-between;
  613. align-items: center;
  614. margin-bottom: 20rpx;
  615. .order-id {
  616. font-size: 32rpx;
  617. color: #333;
  618. font-weight: 500;
  619. }
  620. .status-tag {
  621. font-size: 24rpx;
  622. padding: 4rpx 16rpx;
  623. border-radius: 20rpx;
  624. &.appointed {
  625. color: #00C853;
  626. background: rgba(0, 200, 83, 0.1);
  627. }
  628. &.pending {
  629. color: #FF9800;
  630. background: rgba(255, 152, 0, 0.1);
  631. }
  632. &.waiting {
  633. color: #2196F3;
  634. background: rgba(33, 150, 243, 0.1);
  635. }
  636. &.rejected {
  637. color: #F44336;
  638. background: rgba(244, 67, 54, 0.1);
  639. }
  640. }
  641. }
  642. .order-info {
  643. .info-item {
  644. display: flex;
  645. margin-bottom: 10rpx;
  646. .label {
  647. color: #999;
  648. font-size: 28rpx;
  649. width: 160rpx;
  650. }
  651. .value {
  652. color: #333;
  653. font-size: 28rpx;
  654. flex: 1;
  655. }
  656. }
  657. }
  658. .order-actions {
  659. display: flex;
  660. justify-content: flex-end;
  661. margin-top: 20rpx;
  662. padding-top: 20rpx;
  663. border-top: 1px solid #f5f5f5;
  664. .action-btn {
  665. display: flex;
  666. align-items: center;
  667. padding: 10rpx 20rpx;
  668. margin-left: 20rpx;
  669. border-radius: 8rpx;
  670. text {
  671. font-size: 28rpx;
  672. margin-left: 8rpx;
  673. }
  674. &.reject {
  675. background: #f5f5f5;
  676. color: #666;
  677. }
  678. &.approve {
  679. background: rgba(0, 200, 83, 0.1);
  680. color: #00C853;
  681. }
  682. }
  683. }
  684. }
  685. .time-picker-overlay {
  686. position: fixed;
  687. top: 0;
  688. left: 0;
  689. right: 0;
  690. bottom: 0;
  691. z-index: 100;
  692. background: rgba(0,0,0,0.08);
  693. }
  694. .time-picker-wrapper {
  695. background: #fff;
  696. border-radius: 16rpx;
  697. box-shadow: 0 8rpx 32rpx 0 rgba(0,0,0,0.10);
  698. z-index: 101;
  699. }
  700. .time-type-header {
  701. display: flex;
  702. align-items: center;
  703. justify-content: center;
  704. padding: 30rpx 0;
  705. .type-item {
  706. position: relative;
  707. padding: 0 40rpx;
  708. font-size: 32rpx;
  709. color: #999;
  710. &.active {
  711. color: #00C853;
  712. font-weight: bold;
  713. }
  714. .active-line {
  715. position: absolute;
  716. left: 50%;
  717. bottom: -10rpx;
  718. transform: translateX(-50%);
  719. width: 40rpx;
  720. height: 4rpx;
  721. background: #00C853;
  722. border-radius: 2rpx;
  723. }
  724. }
  725. .type-divider {
  726. color: #999;
  727. font-size: 28rpx;
  728. margin: 0 20rpx;
  729. }
  730. }
  731. .time-picker-content {
  732. position: relative;
  733. height: 440rpx;
  734. .select-mask {
  735. position: absolute;
  736. left: 0;
  737. right: 0;
  738. top: 50%;
  739. transform: translateY(-44rpx);
  740. height: 88rpx;
  741. z-index: 2;
  742. pointer-events: none;
  743. .select-line {
  744. position: absolute;
  745. left: 0;
  746. right: 0;
  747. height: 1px;
  748. background: rgba(0, 0, 0, 0.1);
  749. &:first-child {
  750. top: 0;
  751. }
  752. &:last-child {
  753. bottom: 0;
  754. }
  755. }
  756. }
  757. .picker-view {
  758. width: 100%;
  759. height: 100%;
  760. .picker-item {
  761. line-height: 88rpx;
  762. text-align: center;
  763. color: #999;
  764. font-size: 32rpx;
  765. }
  766. }
  767. }
  768. /* 选中项样式 */
  769. ::v-deep .uni-picker-view-indicator {
  770. height: 88rpx !important;
  771. }
  772. ::v-deep .uni-picker-view-mask {
  773. background-image: linear-gradient(180deg,
  774. rgba(255, 255, 255, 0.95) 0%,
  775. rgba(255, 255, 255, 0.6) 45%,
  776. rgba(255, 255, 255, 0) 50%,
  777. rgba(255, 255, 255, 0) 50%,
  778. rgba(255, 255, 255, 0.6) 55%,
  779. rgba(255, 255, 255, 0.95) 100%
  780. );
  781. }
  782. ::v-deep .uni-picker-view-indicator::before,
  783. ::v-deep .uni-picker-view-indicator::after {
  784. height: 1px;
  785. background-color: rgba(0, 0, 0, 0.1);
  786. }
  787. ::v-deep .uni-picker-view-content > view {
  788. color: #999;
  789. font-size: 32rpx;
  790. }
  791. ::v-deep .uni-picker-view-indicator view {
  792. color: #000 !important;
  793. font-weight: bold !important;
  794. }
  795. .time-picker-footer {
  796. padding: 20rpx;
  797. display: flex;
  798. justify-content: space-between;
  799. border-top: 1rpx solid #f5f5f5;
  800. .btn {
  801. flex: 1;
  802. height: 88rpx;
  803. line-height: 88rpx;
  804. text-align: center;
  805. border-radius: 44rpx;
  806. font-size: 32rpx;
  807. margin: 0 10rpx;
  808. &.btn-reset {
  809. background: #f8f8f8;
  810. color: #666;
  811. }
  812. &.btn-confirm {
  813. background: #00C853;
  814. color: #fff;
  815. }
  816. }
  817. }
  818. </style>