index.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866
  1. <template>
  2. <view style="background: #F8FAFE;">
  3. <public-module></public-module>
  4. <service-widget @btnClick="btn_click"></service-widget>
  5. <view class="header dis a-c j-s">
  6. <view class="city dis a-c ">
  7. <image src="../../static/image/index/img/cityicon.png" mode=""></image>
  8. <text>{{city}}</text>
  9. <image src="../../static/image/index/img/jiantou.png" mode="" style="width: 12px;height: 12px;"></image>
  10. </view>
  11. <image src="../../static/image/index/img/Scan.png" mode="" @click="scan"></image>
  12. </view>
  13. <view class="page">
  14. <!-- 认证提示 -->
  15. <view class="dis a-c j-s">
  16. <view class="frequentClasses dis f-c " :style="{backgroundImage:`url(${item.img})`}"
  17. v-for="(item,index) in frequentClassesList" :key="index" @click="tapEvent(item)">
  18. <text>{{item.title}}</text>
  19. <text>{{item.description}}</text>
  20. </view>
  21. </view>
  22. <index-nav :resdata="categoryList" :row="1" style="margin: 14px 0;"></index-nav>
  23. <view class="banner">
  24. <image mode="widthFix" src="/static/image/index/ad-img/ad.png" @click="back"></image>
  25. </view>
  26. <view class="topProducts dis f-c ">
  27. <text class="title mt-2 mb-2">精选产品</text>
  28. <view class="data dis f-c">
  29. <view class="Product dis a-c " v-for="(item,index) in pickList" :key="index">
  30. <image :src="item.img" mode=""></image>
  31. <view class="dis f-c a-start item">
  32. <text
  33. style="color: #232832;font-size: 16px;font-weight: bold;letter-spacing: 1px;">{{item.title}}</text>
  34. <text style="color: rgba(35, 40, 50, 0.6);font-size: 12px;">{{item.sum}}人购买</text>
  35. <view class="dis a-c">
  36. <view class="slogan" :style="{backgroundColor:itemslogan.back,color:itemslogan.color}"
  37. v-for="(itemslogan,indexslogan) in item.slogan" :key="indexslogan">
  38. <text>{{itemslogan.name}}</text>
  39. </view>
  40. </view>
  41. <text style="color: rgba(35, 40, 50, 0.6);font-size: 12px;"><text
  42. style="color: #FF6C29;font-size: 16px;margin-right: 3px;">{{item.price}}</text>/年起</text>
  43. </view>
  44. </view>
  45. </view>
  46. </view>
  47. </view>
  48. <auth-Modal :authShow="authShow" @btnClick="authShow=false" @maskClick="authShow=false"></auth-Modal>
  49. </view>
  50. </template>
  51. <script>
  52. import authModal from '@/components/modules/user/authModal.vue'; //实名认证弹窗
  53. import swiperImage from "@/components/modules/index/swiper-image.vue"
  54. import indexNav from "@/components/modules/index/index-nav.vue"
  55. import bankBin from "@/common/bankcardinfo.js"
  56. import store from '@/store';
  57. import {
  58. pathToBase64,
  59. base64ToPath
  60. } from '@/common/image-tools-base64.js';
  61. import {
  62. mapState
  63. } from "vuex"
  64. import base from '@/config/baseUrl';
  65. export default {
  66. components: {
  67. swiperImage,
  68. indexNav,
  69. authModal,
  70. },
  71. data() {
  72. return {
  73. authShow: false,
  74. locationshow: false,
  75. avatar: "",
  76. xuelishow: false,
  77. border: false,
  78. form: {
  79. name: "", //姓名
  80. identity: "", //身份证号
  81. birthday: "", //出生日期
  82. addressnow: "", //居住地址
  83. education: "", //学历
  84. bankname: "", //开户行
  85. accountno: "", //银行卡号
  86. },
  87. labelPosition: 'left',
  88. errorType: ['message'],
  89. rules: {
  90. name: [{
  91. required: true,
  92. message: '请输入姓名',
  93. trigger: 'blur',
  94. }, ]
  95. },
  96. contentSlot: true,
  97. showTitle: false,
  98. asyncClose: false,
  99. isShow: false,
  100. current: 0,
  101. banben: {},
  102. bgColor: "#4B75EB",
  103. //轮播
  104. //分类
  105. frequentClassesList: [{
  106. cat_id: 0,
  107. img: '../../static/image/index/category-img/1.png',
  108. title: '车险',
  109. description: "快速比价",
  110. src: '/pages/carInsure/entry'
  111. },
  112. {
  113. cat_id: 1,
  114. img: '/static/image/index/category-img/2.png',
  115. title: '道路救援',
  116. description: "紧急预警",
  117. src: '/pages/roadRescue/index'
  118. },
  119. {
  120. cat_id: 2,
  121. img: '/static/image/index/category-img/3.png',
  122. title: '审车',
  123. description: "用车无烦恼",
  124. src: ''
  125. },
  126. {
  127. cat_id: 3,
  128. img: '/static/image/index/category-img/4.png',
  129. title: '车检代办',
  130. description: "便捷处理",
  131. src: '/pages/caragent/index'
  132. },
  133. ],
  134. categoryList: [{
  135. cat_id: 0,
  136. img: '/static/image/index/category-img/5.png',
  137. title: '车损测算',
  138. // src: '/pages/carInsure2/entry'
  139. },
  140. {
  141. cat_id: 1,
  142. img: '/static/image/index/category-img/6.png',
  143. title: '司法鉴定',
  144. src: ''
  145. },
  146. {
  147. cat_id: 2,
  148. img: '/static/image/index/category-img/7.png',
  149. title: '掌柜商城',
  150. src: ''
  151. },
  152. {
  153. cat_id: 3,
  154. img: '/static/image/index/category-img/8.png',
  155. title: '洗车',
  156. src: ''
  157. },
  158. {
  159. cat_id: 4,
  160. img: '/static/image/index/category-img/9.png',
  161. title: '代驾',
  162. src: ''
  163. },
  164. {
  165. cat_id: 5,
  166. img: '/static/image/index/category-img/10.png',
  167. title: '一键挪车',
  168. src: '/pages/ticket/ticket'
  169. }
  170. ],
  171. //推荐商品 3个
  172. pickList: [{
  173. goods_id: 0,
  174. img: '../../static/image/index/pick-img/1.png',
  175. price: '25.8元',
  176. slogan: [{
  177. name: "明星产品",
  178. back: "rgba(255,153,0,0.1)",
  179. color: "#FF9900"
  180. },
  181. {
  182. name: "刚需保障",
  183. back: "rgba(255,46,0,0.1)",
  184. color: "#FF2E00"
  185. },
  186. {
  187. name: "专家推荐",
  188. back: "rgba(0,82,255,0.1)",
  189. color: "#0052FF"
  190. }
  191. ],
  192. sum: "1235",
  193. title: "平安个人意外险"
  194. },
  195. {
  196. goods_id: 1,
  197. img: '../../static/image/index/pick-img/2.png',
  198. price: '88元',
  199. sum: "588",
  200. slogan: [{
  201. name: "专家推荐",
  202. back: "rgba(0,82,255,0.1)",
  203. color: "#0052FF"
  204. }],
  205. title: "儿童综合医疗保险"
  206. },
  207. {
  208. goods_id: 0,
  209. img: '../../static/image/index/pick-img/1.png',
  210. price: '25.8元',
  211. slogan: [{
  212. name: "明星产品",
  213. back: "rgba(255,153,0,0.1)",
  214. color: "#FF9900"
  215. },
  216. {
  217. name: "刚需保障",
  218. back: "rgba(255,46,0,0.1)",
  219. color: "#FF2E00"
  220. },
  221. {
  222. name: "专家推荐",
  223. back: "rgba(0,82,255,0.1)",
  224. color: "#0052FF"
  225. }
  226. ],
  227. sum: "1235",
  228. title: "平安行.国内自助游旅行意..."
  229. },
  230. {
  231. goods_id: 1,
  232. img: '../../static/image/index/pick-img/2.png',
  233. price: '88元',
  234. sum: "588",
  235. slogan: [{
  236. name: "专家推荐",
  237. back: "rgba(0,82,255,0.1)",
  238. color: "#0052FF"
  239. }],
  240. title: "平安行.境内节假日出行意..."
  241. },
  242. ],
  243. headerPosition: "fixed",
  244. getApplicationStatus: "",
  245. socketOpen: false,
  246. latitude: "",
  247. longitude: "",
  248. province: "",
  249. city: "",
  250. district: "",
  251. street: "",
  252. streetNum: "",
  253. poiName: "",
  254. cityCode: "",
  255. messageInterval: null,
  256. };
  257. },
  258. computed: {
  259. ...mapState(['userInfo'])
  260. },
  261. onPageScroll(e) {
  262. //兼容iOS端下拉时顶部漂移
  263. if (e.scrollTop >= 0) {
  264. this.headerPosition = "fixed";
  265. } else {
  266. this.headerPosition = "absolute";
  267. }
  268. },
  269. onShow() {
  270. this.loginUser();
  271. if (this.userInfo.sysUser.headSculpture) {
  272. this.avatar = this.$base.baseUrl + this.userInfo.sysUser.headSculpture;
  273. } else {
  274. this.avatar = "/static/image/my/avatar1.png"
  275. }
  276. const arr = uni.getStorageSync('historyInfo');
  277. if (arr) {
  278. uni.removeStorageSync('historyInfo');
  279. }
  280. // #ifdef APP-PLUS
  281. this.getCurrentLocation();
  282. this.soketInit();
  283. // #endif
  284. },
  285. async onLoad() {
  286. },
  287. async onPullDownRefresh() {
  288. await this.loginUser();
  289. uni.stopPullDownRefresh();
  290. },
  291. methods: {
  292. async loginUser() {
  293. let userInfoRes = await this.$http.get('/user/loginUser')
  294. store.commit('setUserModules', {
  295. title: 'userInfo',
  296. data: {
  297. sysUser: {
  298. ...userInfoRes.data
  299. }
  300. }
  301. })
  302. },
  303. tapEvent(item) {
  304. if (this.userInfo.sysUser.status == '0' && this.userInfo.sysUser.managementSource == '2') {
  305. if (this.userInfo.sysUser.factorVerify == '2') {
  306. uni.navigateTo({
  307. url: "/pages/user/authInfo"
  308. })
  309. } else {
  310. this.authShow = true;
  311. }
  312. } else if (this.userInfo.sysUser.status == '8' || this.userInfo.sysUser.status == '3') {
  313. uni.navigateTo({
  314. url: "/pages/user/practitionerInfo"
  315. })
  316. } else if (this.userInfo.sysUser.status == '2') {
  317. uni.navigateTo({
  318. url: "/pages/user/authResult1"
  319. })
  320. } else if (this.userInfo.sysUser.status == '1') {
  321. if (!item.src || item.src == '#' || item.src == '') {
  322. uni.showToast({
  323. icon: "none",
  324. title: '正在开发中...',
  325. duration: 1500
  326. })
  327. } else {
  328. this.navigate({
  329. url: item.src
  330. }, "navigateTo", true)
  331. }
  332. }
  333. },
  334. btn_click() {
  335. uni.navigateTo({
  336. url: '/pages/chat/chat'
  337. })
  338. },
  339. //初始化websoket连接
  340. soketInit() {
  341. uni.connectSocket({
  342. url: base.socketUrl + '/' + this.userInfo.sysUser.id,
  343. method: 'GET',
  344. });
  345. uni.onSocketOpen((res) => {
  346. console.log(res, '已打开');
  347. this.socketOpen = true;
  348. this.sendMessage();
  349. });
  350. },
  351. //发送信息
  352. sendMessage() {
  353. if (this.longitude) {
  354. const dataToSend = {
  355. userId: this.userInfo.sysUser.id,
  356. longitude: this.longitude,
  357. latitude: this.latitude,
  358. province: this.province,
  359. city: this.city,
  360. district: this.district,
  361. street: this.street,
  362. streetNum: this.streetNum,
  363. poiName: this.poiName,
  364. cityCode: this.cityCode
  365. };
  366. console.log("首次消息", dataToSend);
  367. if (this.socketOpen) {
  368. uni.sendSocketMessage({
  369. data: JSON.stringify(dataToSend)
  370. })
  371. if (this.messageInterval) {
  372. clearInterval(this.messageInterval);
  373. }
  374. this.messageInterval = setInterval(async () => {
  375. await this.getCurrentLocation();
  376. await this.updatesendMessage();
  377. }, 120000); // 120000毫秒 = 2分钟
  378. }
  379. }
  380. },
  381. getCurrentLocation() {
  382. //获取当前的地理位置
  383. let vthis = this;
  384. uni.getStorage({
  385. key: 'location',
  386. success: function(res) {
  387. vthis.latitude = res.data.latitude;
  388. vthis.longitude = res.data.longitude;
  389. vthis.province = res.data.province;
  390. vthis.city = res.data.city;
  391. vthis.district = res.data.district;
  392. vthis.street = res.data.street;
  393. vthis.streetNum = res.data.streetNum;
  394. vthis.poiName = res.data.poiName;
  395. vthis.cityCode = res.data.cityCode;
  396. }
  397. });
  398. },
  399. updatesendMessage() {
  400. const dataToSend = {
  401. userId: this.userInfo.sysUser.id,
  402. longitude: this.longitude,
  403. latitude: this.latitude,
  404. province: this.province,
  405. city: this.city,
  406. district: this.district,
  407. street: this.street,
  408. streetNum: this.streetNum,
  409. poiName: this.poiName,
  410. cityCode: this.cityCode
  411. };
  412. console.log("持续消息", dataToSend);
  413. if (this.socketOpen) {
  414. uni.sendSocketMessage({
  415. data: JSON.stringify(dataToSend)
  416. })
  417. }
  418. },
  419. back() {
  420. uni.navigateTo({
  421. url: '/pages/carInsure/entry',
  422. })
  423. },
  424. nameClick() {
  425. this.navigate({
  426. url: "/pages/realname/realname"
  427. }, "navigateTo", true)
  428. },
  429. async chooseImage() {
  430. var _this = this;
  431. uni.chooseImage({
  432. count: 1,
  433. sizeType: "compressed",
  434. success(res) {
  435. pathToBase64(res.tempFilePaths[0])
  436. .then(async base64 => {
  437. var paramImg = {
  438. "image": base64, //图片base64
  439. "imgType": "1" //1身份证 2行驶证
  440. }
  441. let res2 = await _this.$http.post('/api/huanong/imgAI', paramImg);
  442. var data = res2.data.customerInfo;
  443. data.identifyValidDate = data.identifyValidDate.substr(0, 4) + '-' +
  444. data.identifyValidDate.substr(4, 2) + "-" + data.identifyValidDate
  445. .substr(6, 2)
  446. _this.form.name = data.name;
  447. _this.form.identifyNumber = data.identifyNumber;
  448. _this.form.identifyValidDate = data.identifyValidDate;
  449. })
  450. }
  451. });
  452. },
  453. // 验证银行卡
  454. async validateBankCard() {
  455. var that = this;
  456. that.bankname = "";
  457. await bankBin.getBankBin(this.form.name4)
  458. .then((data) => {
  459. that.form.name5 = data.bankName;
  460. return true;
  461. })
  462. .catch((err) => {
  463. return uni.showToast({
  464. title: err.split(":")[1],
  465. icon: "none"
  466. });
  467. })
  468. },
  469. //点击通知
  470. async click(index) {
  471. let res1 = await this.$http.get('/apps/getApplicationStatus?jobNumber=' + this.userInfo.sysUser.id);
  472. if (res1.code == 200) {
  473. this.getApplicationStatus = res1.data;
  474. if (this.getApplicationStatus == '0') {
  475. uni.showToast({
  476. icon: "none",
  477. title: '实名认证等待审核中',
  478. duration: 1500
  479. })
  480. } else if (this.getApplicationStatus == '3') {
  481. uni.showToast({
  482. icon: "none",
  483. title: '实名认证不通过,请修改后提交',
  484. duration: 1500
  485. })
  486. setTimeout(() => {
  487. uni.navigateTo({
  488. url: '/pages/user/certification'
  489. })
  490. }, 1000)
  491. }
  492. } else if (res1.code != '200') {
  493. setTimeout(() => {
  494. uni.navigateTo({
  495. url: '/pages/user/infoInput'
  496. })
  497. }, 1000)
  498. }
  499. if (res1.code == 200) {
  500. this.getApplicationStatus = res1.data;
  501. }
  502. },
  503. //扫一扫
  504. scan() {
  505. uni.scanCode({
  506. success: async (res) => {
  507. let uuid = this.getParameterByName("uuid", res.result)
  508. let resCode = await this.$http.get('/scanQrCode?uuid=' + uuid);
  509. }
  510. });
  511. },
  512. //搜索跳转
  513. toSearch() {
  514. // uni.showToast({title: "建议跳转到新页面做搜索功能"});
  515. },
  516. //推荐商品跳转
  517. toPick(e) {
  518. // uni.showToast({title: '推荐商品'+e.goods_id});
  519. },
  520. //商品跳转
  521. toGoods(e) {
  522. // uni.showToast({title: '商品'+e.goods_id});
  523. },
  524. getParameterByName(name, url) {
  525. if (!url) url = window.location.href;
  526. name = name.replace(/[\[\]]/g, '\\$&');
  527. var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),
  528. results = regex.exec(url);
  529. if (!results) return null;
  530. if (!results[2]) return '';
  531. return decodeURIComponent(results[2].replace(/\+/g, ' '));
  532. }
  533. }
  534. };
  535. </script>
  536. <style lang="scss" scoped>
  537. page {
  538. background: #F8FAFE;
  539. }
  540. .status {
  541. width: 100%;
  542. height: 0;
  543. /* #ifdef APP-PLUS */
  544. height: var(--status-bar-height);
  545. /* #endif */
  546. position: fixed;
  547. top: 0;
  548. z-index: 999;
  549. }
  550. .header {
  551. width: 100%;
  552. display: flex;
  553. position: fixed;
  554. left: 0;
  555. right: 0;
  556. z-index: 996;
  557. padding: 60px 16px 16px;
  558. background-color: #fff;
  559. .city {
  560. color: #fff;
  561. font-size: 15px;
  562. image {
  563. width: 22px;
  564. height: 22px;
  565. }
  566. text {
  567. color: #333;
  568. font-size: 13px;
  569. margin: 0 5px;
  570. }
  571. .icon {
  572. font-size: 10px;
  573. margin-left: 5px;
  574. }
  575. }
  576. image {
  577. width: 22px;
  578. height: 22px;
  579. }
  580. }
  581. .page {
  582. padding: 115px 16px 16px 16px;
  583. .frequentClasses {
  584. width: 148rpx;
  585. height: 148rpx;
  586. padding: 5px;
  587. background-size: cover;
  588. text:nth-child(1) {
  589. color: #fff;
  590. font-size: 28rpx;
  591. line-height: 1;
  592. }
  593. text:nth-child(2) {
  594. color: #fff;
  595. font-size: 22rpx;
  596. }
  597. }
  598. .topProducts {
  599. .title {
  600. color: #232832;
  601. font-size: 32rpx;
  602. font-weight: bold;
  603. }
  604. .data {
  605. background: #FFFFFF;
  606. box-shadow: 0px 2px 5px 0px #DAE3F4;
  607. border-radius: 6px;
  608. padding: 16px;
  609. }
  610. .Product {
  611. margin-bottom: 14px;
  612. image {
  613. width: 85px;
  614. height: 85px;
  615. margin-right: 14px;
  616. }
  617. .item {
  618. line-height: 1.5;
  619. .slogan {
  620. padding: 1px 3px;
  621. border-radius: 2px;
  622. font-size: 22rpx;
  623. margin-right: 5px;
  624. }
  625. }
  626. }
  627. }
  628. }
  629. /* 占位 */
  630. .place {
  631. /* #ifdef APP-PLUS */
  632. margin-top: var(--status-bar-height);
  633. /* #endif */
  634. height: 106upx;
  635. }
  636. .pick {
  637. padding: 0 2.5vw 2.5vw 2.5vw;
  638. }
  639. .pick .box {
  640. width: 100%;
  641. border-radius: 20upx;
  642. background-color: #ffffff;
  643. }
  644. .pick .box .title {
  645. display: flex;
  646. justify-content: flex-start;
  647. align-items: flex-end;
  648. height: 60upx;
  649. border-bottom: solid 1upx #eee;
  650. padding-bottom: 10upx;
  651. }
  652. .pick .box .title .big {
  653. font-size: 34upx;
  654. padding-left: 20upx;
  655. color: #46434f;
  656. }
  657. .pick .box .title .small {
  658. font-size: 24upx;
  659. padding-left: 20upx;
  660. color: #827f8b;
  661. }
  662. .pick .box .product-list {
  663. padding-top: 15upx;
  664. box-sizing: border-box;
  665. overflow: hidden;
  666. }
  667. .pick .box .product-list>view {
  668. background-color: #f8f8f8;
  669. display: inline-block;
  670. width: calc(50% - 10upx);
  671. position: relative;
  672. box-sizing: border-box;
  673. margin: 5upx;
  674. float: left;
  675. }
  676. .pick .box .product-list>view:nth-child(1) {
  677. height: 390upx;
  678. }
  679. .pick .box .product-list>view:nth-child(2),
  680. .pick .box .product-list>view:nth-child(3) {
  681. height: 190upx;
  682. }
  683. .pick .box .product-list>view:nth-child(1) .price {
  684. color: #e65339;
  685. font-size: 26upx;
  686. position: absolute;
  687. bottom: 6upx;
  688. left: 8upx;
  689. }
  690. .pick .box .product-list>view:nth-child(1) .slogan {
  691. color: #807c87;
  692. font-size: 26upx;
  693. position: absolute;
  694. bottom: 6upx;
  695. right: 15upx;
  696. }
  697. .pick .box .product-list>view:nth-child(1) image {
  698. width: 100%;
  699. height: 350upx !important;
  700. padding: 15upx;
  701. box-sizing: border-box;
  702. margin-bottom: 40upx;
  703. }
  704. .pick .box .product-list>view:nth-child(2),
  705. .pick .box .product-list>view:nth-child(3) {
  706. padding: 10upx;
  707. box-sizing: border-box;
  708. }
  709. .pick .box .product-list>view:nth-child(2) image,
  710. .pick .box .product-list>view:nth-child(3) image {
  711. width: calc(50% - 5upx);
  712. height: 170upx !important;
  713. }
  714. .pick .box .product-list>view:nth-child(2) .price,
  715. .pick .box .product-list>view:nth-child(3) .price {
  716. position: absolute;
  717. top: 25%;
  718. left: 55%;
  719. color: #e65339;
  720. font-size: 30upx;
  721. }
  722. .pick .box .product-list>view:nth-child(2) .slogan,
  723. .pick .box .product-list>view:nth-child(3) .slogan {
  724. position: absolute;
  725. top: 60%;
  726. left: 55%;
  727. color: #807c87;
  728. font-size: 26upx;
  729. }
  730. .banner image {
  731. width: 100%;
  732. }
  733. .goods-list {
  734. background-color: #f4f4f4;
  735. }
  736. .goods-list .title {
  737. width: 100%;
  738. display: flex;
  739. justify-content: center;
  740. align-items: center;
  741. height: 60upx;
  742. color: #979797;
  743. font-size: 24upx;
  744. }
  745. .goods-list .loading-text {
  746. width: 100%;
  747. display: flex;
  748. justify-content: center;
  749. align-items: center;
  750. height: 60upx;
  751. color: #979797;
  752. font-size: 24upx;
  753. }
  754. .goods-list .product-list {
  755. padding: 0 2.5% 2.5vw 2.5%;
  756. display: flex;
  757. justify-content: space-between;
  758. flex-wrap: wrap;
  759. }
  760. .goods-list .product-list .product {
  761. width: 48.75%;
  762. border-radius: 20upx;
  763. background-color: #fff;
  764. margin: 0 0 15upx 0;
  765. }
  766. .goods-list .product-list .product image {
  767. width: 100%;
  768. border-radius: 20upx 20upx 0 0;
  769. }
  770. .goods-list .product-list .product .name {
  771. width: 92%;
  772. padding: 10upx 4%;
  773. display: -webkit-box;
  774. -webkit-box-orient: vertical;
  775. -webkit-line-clamp: 1;
  776. text-align: justify;
  777. overflow: hidden;
  778. font-size: 30upx;
  779. }
  780. .goods-list .product-list .product .info {
  781. display: flex;
  782. justify-content: space-between;
  783. align-items: flex-end;
  784. width: 92%;
  785. padding: 10upx 4% 10upx 4%;
  786. }
  787. .goods-list .product-list .product .info .price {
  788. color: #e65339;
  789. font-size: 30upx;
  790. font-weight: 600;
  791. }
  792. .goods-list .product-list .product .info .slogan {
  793. color: #807c87;
  794. font-size: 24upx;
  795. }
  796. </style>