index.vue 19 KB

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