detail.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754
  1. <template>
  2. <view class="app-container">
  3. <u-navbar
  4. title="票信息"
  5. bgColor="#01DCEA"
  6. :fixed="true"
  7. :autoBack="false"
  8. :titleStyle="{color: '#fff'}"
  9. leftIconColor="#fff"
  10. leftIconSize="28"
  11. @leftClick="handleLeftClick"
  12. >
  13. </u-navbar>
  14. <!-- 曲面背景 -->
  15. <view class="app-container_bg">
  16. </view>
  17. <view class="app-container-item flex-column-center">
  18. <view class="title-card flex-column-center">
  19. <view style="color: white;font-size: 24px;font-weight: bold;margin-bottom: 10px">
  20. {{detailInfo.title}}
  21. </view>
  22. <view style="background: #E7F9FD;color: #2ABED2;padding: 2px 12px;border-radius: 14px">
  23. {{ detailInfo.date }} {{ detailInfo.openStartTime }}-{{ detailInfo.openEndTime }}
  24. </view>
  25. </view>
  26. <view class="ticket-swiper-card">
  27. <!--票数显示区域-->
  28. <view class="info-ticket-num flex-align-center">
  29. <text>{{swiperCurrent + 1}}</text><text v-show="detailInfo.swiperItem.length > 1">/&nbsp;{{detailInfo.swiperItem.length}}</text><text>张</text>
  30. </view>
  31. <!--票类型显示区域-->
  32. <view v-if="detailInfo.swiperItem[swiperCurrent].isUse || (!detailInfo.swiperItem[swiperCurrent].isUse && isObsoleteTime)" :class="[detailInfo.swiperItem[swiperCurrent].isUse?'info-right-default' : 'info-right-gray', 'flex']">
  33. <view class="circle flex">
  34. {{ detailInfo.swiperItem[swiperCurrent].isUse ? '已检票' : '已失效' }}
  35. </view>
  36. </view>
  37. <!--票二维码显示区域-->
  38. <view class="info-ticket-swiper">
  39. <view class="swiper_btn flex" @click="handleSwiperChange('left')" v-if="detailInfo.swiperItem.length > 1">
  40. <text class="iconfont icon-swiper-left"
  41. style="font-size: 24px;color: #7B7F86"></text>
  42. </view>
  43. <swiper class="swiper" :current="swiperCurrent" :indicator-dots="false" :autoplay="false" :circular="true" :vertical="false" :duration="500" @change="swiperChange">
  44. <swiper-item class="swiper-item flex-align-center" v-for="(item,index) in detailInfo.swiperItem" :key="index">
  45. <view class="qr-info flex-column-center" v-if="!isTicketTime">
  46. <text style="font-size: 18px" v-if="isNotYetTime">未到时间~</text>
  47. </view>
  48. <view class="qr-info flex-column" style="justify-content: flex-end;" v-else-if="isTicketTime">
  49. <text style="color: #333333" v-if="!item.isUse">{{item.username}}</text>
  50. <text style="color: #333333" v-if="!item.isUse">{{item.idNumber}}</text>
  51. <text v-if="!item.isUse">二维码实时更新,请勿截屏使用</text>
  52. </view>
  53. <view class="qr-img flex-column-center" v-if="isTicketTime && !item.isUse">
  54. <img :src="picUrl.qrImage"></img>
  55. </view>
  56. <view class="qr-img flex-column-center" v-else>
  57. <text style="color: #333333" >{{item.username}}</text>
  58. <text style="color: #333333">{{item.idNumber}}</text>
  59. </view>
  60. <!--未使用&未过时间-->
  61. <view v-if="!item.isUse && !isObsoleteTime && !item.isQuickEntry" class="quick-entry-btn flex" @click="openQuickEntry(item, index)">开通快速入园</view>
  62. <view v-if="!item.isUse && !isObsoleteTime && item.isQuickEntry" class="quick-entry-tips flex">已开通快速入园</view>
  63. </swiper-item>
  64. </swiper>
  65. <view class="swiper_btn flex" @click="handleSwiperChange('right')" v-if="detailInfo.swiperItem.length > 1">
  66. <text class="iconfont icon-swiper-right"
  67. style="font-size: 24px;color: #7B7F86"></text>
  68. </view>
  69. </view>
  70. <!--温馨提示显示区域-->
  71. <view class="info-ticket-tips flex-column-center">
  72. <view>
  73. <text>温馨提示</text>
  74. <text class="iconfont icon-tips-fill"
  75. style="font-size: 14px;color: #F7931A;margin-left: 5px"></text>
  76. </view>
  77. <text>已开通快速入园的游客可直接刷脸入园,也可通过二维码、身份证、现场手输身份证号入园。</text>
  78. </view>
  79. </view>
  80. <view class="order-detail">
  81. <view class="title flex-between" @click="toOrderDetail">
  82. <text>订单信息</text>
  83. <text class="iconfont icon-swiper-right" style="font-size: 14px;color: #333333"></text>
  84. </view>
  85. <text style="font-size: 13px;color: #7B7F86;height: 30px;line-height: 30px">查看订单详情</text>
  86. </view>
  87. </view>
  88. <u-modal closeOnClickOverlay v-if="quickEntryModal.show" :show="quickEntryModal.show" title="">
  89. <view class="flex-column modal_area">
  90. <view class="modal_icon flex">
  91. <view class="circle_icon flex">
  92. <text class="iconfont icon-bulb" style="font-size: 30px;color: #ffffff"></text>
  93. </view>
  94. </view>
  95. <view class="modal_title">
  96. 是否开通快速入园
  97. </view>
  98. <text class="modal_content">
  99. <text style="color: #FFAF51">开通快速入园后,可直接刷脸快速入园。</text>
  100. 点击<text style="color: #FFAF51"> “立即开通” </text>拍摄人脸照片,开通快速入园;取消后也可在票夹内手动开通。
  101. </text>
  102. </view>
  103. <template #confirmButton>
  104. <view class="modal_btn flex-between">
  105. <view class="modal_btn_cancel" @click="onClose">
  106. 取消
  107. </view>
  108. <view class="modal_btn_ok" @click="onConfirm">
  109. 立即开通({{quickEntryModal.timerCount}}s)
  110. </view>
  111. </view>
  112. </template>
  113. </u-modal>
  114. <u-modal closeOnClickOverlay v-if="takePhotosModal.show" :show="takePhotosModal.show" title="">
  115. <view class="flex-column modal_area">
  116. <view class="modal_title flex-column-center">
  117. <view>请 {{quickEntryList[quickEntryIndex].username}} 做好准备</view>
  118. <view>即将开始拍摄照片</view>
  119. </view>
  120. <text class="modal_content">
  121. 拍摄人脸照片,开通快速入园;取消后也可在票夹内手动开通。
  122. </text>
  123. </view>
  124. <!-- <button id="fileInput" @click="chooseImageFuc"></button>-->
  125. <template #confirmButton>
  126. <view class="modal_btn flex-between">
  127. <view class="modal_btn_cancel" @click="onTakePhotosClose">
  128. 取消
  129. </view>
  130. <view ref="takePhotosRef" class="modal_btn_ok" @click="onTakePhotosConfirm">
  131. 开始
  132. </view>
  133. </view>
  134. </template>
  135. </u-modal>
  136. <u-modal closeOnClickOverlay v-if="quickEntryTipsModal.show" :show="quickEntryTipsModal.show" title="">
  137. <view class=" modal_area" style="width: 100%">
  138. <view class="modal_title flex-column-center">
  139. <view>已全部部分开通快速入园</view>
  140. </view>
  141. <view style="display: flex;flex-direction: column;justify-content: flex-start;width: 100%">
  142. <view style="color: #333333;font-size: 15px;font-weight: 700">游玩人:</view>
  143. <view style="display: flex;flex-direction: column;width: 100%;padding: 10px;color: #636B85;font-size: 14px">
  144. <text v-for="item in quickEntryList.filter(v=>v.isQuickEntry)" style="height: 24px;line-height: 24px;display: flex;justify-content: flex-start;align-items: center">{{item.username}}&nbsp;&nbsp;&nbsp;{{item.idNumber}}</text>
  145. </view>
  146. </view>
  147. </view>
  148. <template #confirmButton>
  149. <view class="modal_btn flex-between">
  150. <view class="modal_btn_ok" style="width: 100%;" @click="onQuickEntryTipsClose">
  151. 确定({{quickEntryTipsModal.timerCount}}s)
  152. </view>
  153. </view>
  154. </template>
  155. </u-modal>
  156. </view>
  157. </template>
  158. <script>
  159. export default {
  160. components: {},
  161. data() {
  162. return {
  163. // 是否开通快速入园
  164. quickEntryModal: {
  165. show: false,
  166. timer: null, // 倒计时
  167. timerCount: 10, // 倒计时计数
  168. },
  169. // 开始拍照
  170. takePhotosModal: {
  171. show: false,
  172. },
  173. // 开通快速入园提示
  174. quickEntryTipsModal: {
  175. show: false,
  176. timer: null, // 倒计时
  177. timerCount: 5, // 倒计时计数
  178. },
  179. swiperCurrent: 0,
  180. userInfo: {},
  181. ticketInfo: {
  182. title: '兰花街1、2、3',
  183. date: '2024.06.14',
  184. openStartTime: '08:00',
  185. openEndTime: '20:00',
  186. state: 2,
  187. checkedTickets: 0,
  188. // 轮播图 二维码区域
  189. swiperItem:[{
  190. username: '刘琳琳', // 姓名
  191. idNumber: '430822199903010465', // 身份证号
  192. avatar: '',
  193. qrCodeUrl:'',
  194. isQuickEntry: false,
  195. isUse: false, // 是否使用
  196. }, {
  197. username: '刘琳X', // 姓名
  198. idNumber: '430822199903010464', // 身份证号
  199. avatar: '',
  200. qrCodeUrl:'',
  201. isQuickEntry: true,
  202. isUse: false, // 是否使用
  203. }, {
  204. username: '刘琳Y', // 姓名
  205. idNumber: '430822199903010463', // 身份证号
  206. avatar: '',
  207. qrCodeUrl:'',
  208. isQuickEntry: false,
  209. isUse: false, // 是否使用
  210. }],
  211. },
  212. quickEntryList: [], // 开通快速入园的列表
  213. quickEntryIndex: 0, //
  214. detailInfo: {},
  215. loading: true,
  216. isLogin: true,
  217. picUrl: this.$require,
  218. content: `<p>1、票型有效期:仅限游玩当日有效。</p> <p>2、检票方式:刷脸(开通快速入园后)、刷 身份证(原件)、刷二维码或现场手输身份证号入园。</p> <p>3、退改规则:一经检票,不得退票。</p> <p>4、实名制一证一票。门票仅限入园1次,不可重复入园。</p> <p>5、禁止携带宠物入园。</p>`
  219. };
  220. },
  221. computed: {
  222. // 已到时间
  223. isTicketTime() {
  224. const startTime = new Date(`${this.detailInfo.date} ${this.detailInfo.openStartTime}`); // 开始时间
  225. const endTime = new Date(`${this.detailInfo.date} ${this.detailInfo.openEndTime}`); // 结束时间
  226. const currentTime = new Date();
  227. console.log(startTime, endTime, currentTime);
  228. return (startTime <= currentTime) && (endTime >= currentTime);
  229. },
  230. // 未到时间
  231. isNotYetTime(){
  232. const startTime = new Date(`${this.detailInfo.date} ${this.detailInfo.openStartTime}`); // 开始时间
  233. const currentTime = new Date();
  234. return (startTime >= currentTime);
  235. },
  236. // 已过时间
  237. isObsoleteTime() {
  238. const endTime = new Date(`${this.detailInfo.date} ${this.detailInfo.openEndTime}`); // 结束时间
  239. const currentTime = new Date();
  240. return (endTime <= currentTime);
  241. },
  242. },
  243. filters: {
  244. matchState(code) {
  245. switch (code) {
  246. case 1:
  247. return '已检票';
  248. case 2:
  249. return '已失效';
  250. }
  251. }
  252. },
  253. onLoad(options) {
  254. // this.detailInfo = JSON.parse(options.info);
  255. console.log('onLoad')
  256. let swiperArr = [];
  257. this.ticketInfo.swiperItem.forEach(item=>{
  258. swiperArr.push({
  259. ...item,
  260. username: this.$sun.desensitization(item.username, 1, 2),
  261. idNumber: this.$sun.desensitizationIdNumber(item.idNumber)
  262. })
  263. });
  264. this.detailInfo = {
  265. ...this.ticketInfo,
  266. swiperItem: swiperArr
  267. };
  268. },
  269. onShow() {
  270. this.userInfo = uni.getStorageSync('userInfo')
  271. this.userInfo = {
  272. ...this.userInfo,
  273. phone: '18322568765'
  274. };
  275. // this.isLogin = this.userInfo.username ? true : false;
  276. },
  277. methods: {
  278. /**
  279. * 订单详情
  280. */
  281. toOrderDetail() {
  282. console.log(this.ticketInfo);
  283. uni.navigateTo({
  284. url: '/pages/order/detail?info=' + JSON.stringify(this.ticketInfo)
  285. });
  286. },
  287. swiperChange(e) {
  288. console.log(e);
  289. this.swiperCurrent = e.detail.current;
  290. },
  291. /**
  292. * 二维码区域切换
  293. */
  294. handleSwiperChange(type) {
  295. if (type == 'left') {
  296. let nextIndex = this.swiperCurrent - 1;
  297. if (nextIndex < 0) {
  298. nextIndex = this.detailInfo.swiperItem.length - 1; // 循环到最后一页
  299. }
  300. this.swiperCurrent = nextIndex;
  301. } else {
  302. let nextIndex = this.swiperCurrent + 1;
  303. if (nextIndex >= this.detailInfo.swiperItem.length) {
  304. nextIndex = 0; // 循环到第一页
  305. }
  306. this.swiperCurrent = nextIndex;
  307. }
  308. },
  309. handleLeftClick() {
  310. //获取页面栈的长度
  311. const canNavBack = getCurrentPages()
  312. //判断是否刷新了浏览器,刷新了浏览器,页面栈只有当前一个
  313. if (canNavBack && canNavBack.length > 1) {
  314. uni.navigateBack({
  315. delta: 1
  316. })
  317. } else {
  318. history.back()
  319. }
  320. },
  321. getGuideInfo() {
  322. // this.isLogin = true;
  323. },
  324. /**
  325. * 开通快速入园
  326. * @param data
  327. * @param index
  328. */
  329. openQuickEntry(data, index) {
  330. console.log(data, index);
  331. let _this = this;
  332. _this.quickEntryList = _this.detailInfo.swiperItem.filter(item=> !item.isQuickEntry);
  333. _this.quickEntryIndex = 0;
  334. console.log(_this.quickEntryList, _this.quickEntryIndex);
  335. _this.quickEntryModal.show = true;
  336. _this.quickEntryModal.timer = setInterval(() => {
  337. if (_this.quickEntryModal.timerCount > 1) {
  338. _this.quickEntryModal.timerCount = _this.quickEntryModal.timerCount - 1;
  339. } else {
  340. _this.onConfirm();
  341. }
  342. }, 1000);
  343. },
  344. onClose() {
  345. this.quickEntryModal.show = false;
  346. this.quickEntryModal.timer && clearInterval(this.quickEntryModal.timer);
  347. this.quickEntryModal.timerCount = 10;
  348. this.quickEntryModal.timer = null;
  349. },
  350. onConfirm() {
  351. this.onClose();
  352. this.openTakePhotos();
  353. },
  354. /**
  355. * 打开准备拍照的 Modal 开始
  356. * @param data
  357. */
  358. openTakePhotos() {
  359. let _this = this;
  360. _this.takePhotosModal.show = true;
  361. },
  362. onTakePhotosClose() {
  363. this.takePhotosModal.show = false;
  364. if (this.quickEntryIndex < this.quickEntryList.length - 1) {
  365. this.quickEntryIndex = this.quickEntryIndex + 1;
  366. this.openTakePhotos();
  367. } else {
  368. this.openQuickEntryTips();
  369. }
  370. },
  371. onTakePhotosConfirm() {
  372. let _this = this;
  373. _this.takePhotosModal.show = false;
  374. uni.chooseImage({
  375. count: 1, // 默认9,设置图片的数量
  376. sourceType: ['camera'], // 可选择的源类型,'album'从相册选择,'camera'使用相机拍照
  377. success: (res) => {
  378. // 成功选择图片后的回调
  379. console.log(res.tempFilePaths, _this.quickEntryIndex, _this.quickEntryList.length);
  380. _this.quickEntryList[_this.quickEntryIndex].isQuickEntry = true;
  381. _this.quickEntryList[_this.quickEntryIndex].avatar = [res.tempFilePaths];
  382. let index = _this.detailInfo.swiperItem.findIndex(v=>v.idNumber == _this.quickEntryList[_this.quickEntryIndex].idNumber);
  383. _this.detailInfo.swiperItem[index].isQuickEntry = true;
  384. if (_this.quickEntryIndex < _this.quickEntryList.length - 1) {
  385. _this.quickEntryIndex = _this.quickEntryIndex + 1;
  386. _this.openTakePhotos();
  387. } else {
  388. _this.openQuickEntryTips();
  389. }
  390. // blob:http://localhost:8080/2060af0e-0a26-480a-bd2d-9ce4e6f6652a
  391. // res.tempFilePaths 是一个包含拍照文件本地临时路径的数组
  392. },
  393. fail: (err) => {
  394. // 选择图片失败的回调
  395. console.log('选择图片失败:', err);
  396. }
  397. });
  398. },
  399. /**
  400. * 开通快速入园成功提示
  401. * @param data
  402. * @param index
  403. */
  404. openQuickEntryTips() {
  405. let _this = this;
  406. console.log(_this.ticketInfo.swiperItem, _this.quickEntryList);
  407. if (_this.quickEntryList.filter(item=> item.isQuickEntry).length > 0) {
  408. _this.quickEntryTipsModal.show = true;
  409. _this.quickEntryTipsModal.timer = setInterval(() => {
  410. if (_this.quickEntryTipsModal.timerCount > 1) {
  411. _this.quickEntryTipsModal.timerCount = _this.quickEntryTipsModal.timerCount - 1;
  412. } else {
  413. _this.onQuickEntryTipsClose();
  414. }
  415. }, 1000);
  416. }
  417. },
  418. onQuickEntryTipsClose() {
  419. this.quickEntryTipsModal.show = false;
  420. this.quickEntryTipsModal.timer && clearInterval(this.quickEntryTipsModal.timer);
  421. this.quickEntryTipsModal.timerCount = 5;
  422. this.quickEntryTipsModal.timer = null;
  423. },
  424. }
  425. };
  426. </script>
  427. <style lang="scss" scoped>
  428. .app-container {
  429. width: 100vw;
  430. background: rgba(243, 244, 246, 1);
  431. //overflow: hidden;
  432. position: relative;
  433. &_bg {
  434. position: absolute;
  435. top: 44px;
  436. z-index: 0;
  437. width: 100%;
  438. height: 200px;
  439. overflow: hidden;
  440. &::after {
  441. content: '';
  442. position: absolute;
  443. width: 160%;
  444. height: 100%;
  445. //background: linear-gradient(179.48deg, #DCF9FF 0.45%, rgba(207, 254, 242, 0) 99.55%);
  446. background: linear-gradient(180deg, #01DCEA 0%, rgba(29, 211, 236, 0) 100%);
  447. left: -30%;
  448. border-radius: 0 0 50% 50%;
  449. }
  450. }
  451. &-item {
  452. position: absolute;
  453. top: 44px;
  454. width: 100%;
  455. .top-ticket {
  456. background: #01DCEA;
  457. height: 80px;
  458. width: 100%;
  459. padding: 0 20px;
  460. box-sizing: border-box;
  461. .title {
  462. color: #fff;
  463. font-size: 24px;
  464. font-weight: bold;
  465. }
  466. .btn {
  467. padding: 4px 16px;
  468. background: #fff;
  469. font-size: 14px;
  470. border-radius: 16px;
  471. color: #00B6CE;
  472. }
  473. }
  474. .title-card {
  475. background: transparent;
  476. color: #333;
  477. box-sizing: border-box;
  478. width: 100%;
  479. margin-top: 10px;
  480. }
  481. .ticket-swiper-card {
  482. width: calc(100% - 30px);
  483. margin-top: 10px;
  484. background: #fff;
  485. border-radius: 8px;
  486. min-height: 460px;
  487. position: relative;
  488. .info {
  489. &-ticket-tips {
  490. background: #F7931A12;
  491. width: calc(100% - 16px);
  492. min-height: 90px;
  493. position: absolute;
  494. bottom: 5px;
  495. left: 8px;
  496. border-radius: 8px;
  497. padding: 8px 12px;
  498. box-sizing: border-box;
  499. align-items: flex-start;
  500. text {
  501. &:first-child {
  502. color: #F7931A;
  503. font-size: 15px;
  504. font-weight: bold;
  505. }
  506. &:last-child {
  507. color: #B17E52;
  508. font-size: 14px;
  509. margin-top: 5px;
  510. }
  511. }
  512. }
  513. &-ticket-swiper {
  514. position: absolute;
  515. top: 60px;
  516. z-index: 2;
  517. width: 100%;
  518. padding: 0 5px;
  519. box-sizing: border-box;
  520. height: 280px;
  521. display: flex;
  522. justify-content: space-around;
  523. .swiper_btn {
  524. width: 50px;
  525. height: calc(100% - 60px - 35px);
  526. margin-top: 60px;
  527. }
  528. .swiper {
  529. width: 260px;
  530. height: 280px;
  531. }
  532. .swiper-item {
  533. flex-direction: column;
  534. box-sizing: border-box;
  535. .qr-info {
  536. width: 100%;
  537. height: 60px;
  538. font-size: 13px;
  539. color: #A8ABB1;
  540. }
  541. .qr-img {
  542. width: 160px;
  543. height: 160px;
  544. margin-top: 5px;
  545. box-sizing: border-box;
  546. font-size: 13px;
  547. background: #F1F9FB;
  548. color: #333333;
  549. img {
  550. width: 100%;
  551. height: 100%;
  552. }
  553. }
  554. .quick-entry-btn {
  555. background: #0ED6E2;
  556. color: #fff;
  557. font-size: 18px;
  558. font-weight: 500;
  559. line-height: 27px;
  560. text-align: center;
  561. width: 174px;
  562. height: 35px;
  563. margin-top: 20px;
  564. border-radius: 20px;
  565. }
  566. .quick-entry-tips {
  567. background: #fff;
  568. color: #42D7E0;
  569. font-size: 18px;
  570. font-weight: 500;
  571. line-height: 27px;
  572. text-align: center;
  573. width: 174px;
  574. height: 35px;
  575. margin-top: 20px;
  576. }
  577. }
  578. }
  579. &-ticket-num {
  580. position: absolute;
  581. left: 15px;
  582. top: 15px;
  583. text {
  584. &:nth-child(1) {
  585. color: #2ABED2;
  586. font-size: 18px;
  587. font-weight: 500;
  588. margin-right: 5px;
  589. }
  590. &:nth-child(2){
  591. color: #333333;
  592. font-size: 13px;
  593. }
  594. &:nth-child(3){
  595. color: #333333;
  596. font-size: 13px;
  597. }
  598. }
  599. }
  600. &-left {
  601. height: 100%;
  602. display: flex;
  603. flex-direction: column;
  604. justify-content: center;
  605. width: calc(100% - 55px);
  606. min-height: 70px;
  607. .item {
  608. display: flex;
  609. flex-direction: column;
  610. }
  611. }
  612. &-right-default {
  613. width: 70px;
  614. height: 70px;
  615. background: #fff;
  616. border: 2.5px solid #E8F0FC;
  617. border-radius: 50%;
  618. position: absolute;
  619. right: 15px;
  620. top: 15px;
  621. .circle {
  622. width: 54px;
  623. height: 54px;
  624. background: #E8F0FC;
  625. border-radius: 50%;
  626. flex-shrink: 0;
  627. color: #A7B7D1;
  628. display: flex;
  629. justify-content: center;
  630. align-items: center;
  631. transform: rotate(-15deg);
  632. font-size: 14px;
  633. }
  634. }
  635. &-right-gray {
  636. width: 70px;
  637. height: 70px;
  638. background: #fff;
  639. border: 2.5px solid #EDF1F6;
  640. border-radius: 50%;
  641. position: absolute;
  642. right: 15px;
  643. top: 15px;
  644. .circle {
  645. width: 54px;
  646. height: 54px;
  647. background: #EDF1F6;
  648. border-radius: 50%;
  649. flex-shrink: 0;
  650. color: #B2BCCB;
  651. display: flex;
  652. justify-content: center;
  653. align-items: center;
  654. transform: rotate(-15deg);
  655. font-size: 14px;
  656. }
  657. }
  658. }
  659. }
  660. .order-detail {
  661. width: calc(100% - 30px);
  662. margin-top: 10px;
  663. background: #fff;
  664. border-radius: 8px;
  665. min-height: 80px;
  666. position: relative;
  667. display: flex;
  668. flex-direction: column;
  669. padding: 10px;
  670. box-sizing: border-box;
  671. .title {
  672. width: 100%;
  673. font-size: 16px;
  674. }
  675. }
  676. }
  677. }
  678. .modal_area {
  679. position: relative;
  680. .modal_icon {
  681. position: absolute;
  682. left: -10px;
  683. top: calc(-25px - 72px / 2);
  684. width: 72px;
  685. height: 72px;
  686. background: #FF9237;
  687. border-radius: 50%;
  688. box-sizing: border-box;
  689. .circle_icon {
  690. width: 63px;
  691. height: 63px;
  692. background: #FF9237;
  693. border-radius: 50%;
  694. border: 2px solid white;
  695. box-sizing: border-box;
  696. }
  697. }
  698. .modal_title {
  699. color: #1D2633;
  700. font-size: 20px;
  701. font-weight: bold;
  702. //height: 30px;
  703. line-height: 30px;
  704. margin-bottom: 20px;
  705. }
  706. .modal_content {
  707. color: #333333;
  708. font-size: 15px;
  709. line-height: 24px;
  710. }
  711. }
  712. .modal_btn {
  713. &_cancel {
  714. height: 44px;
  715. line-height: 44px;
  716. border-radius: 4px;
  717. background: #fff;
  718. color: #01DCEA;
  719. width: calc((100% - 20px) / 2);
  720. border: 1px solid #01DCEA;
  721. text-align: center;
  722. }
  723. &_ok {
  724. height: 44px;
  725. line-height: 44px;
  726. border-radius: 4px;
  727. color: #fff;
  728. background: #01DCEA;
  729. width: calc((100% - 10px) / 2);
  730. border: 1px solid #01DCEA;
  731. text-align: center;
  732. }
  733. }
  734. </style>