index.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850
  1. <template>
  2. <mobile-frame>
  3. <view class="main">
  4. <view class="one">
  5. <view class="one_1" v-if="barActive=='0'">
  6. <view class="first">
  7. <image class="image" :src="info.logo&&info.logo.length>0?info.logo[0].url:''" mode=""></image>
  8. </view>
  9. <view class="second">
  10. <scroll-view scroll-y="true" class="scroll-view">
  11. <view class="list-scroll-view">
  12. <view class="list" v-for="(item,index) in shoplist" :key="index">
  13. <image class="image" :src="item.file&&item.file.length>0?item.file[0].url:''" mode=""></image>
  14. <view class="name">
  15. {{item.name}}
  16. </view>
  17. <view class="other">
  18. <view class="money">
  19. <text>¥</text>
  20. <text>{{item.sell_money}}</text>
  21. </view>
  22. <view class="btn">
  23. <button type="default" size="mini" @click="toBuy(item)">购买</button>
  24. </view>
  25. </view>
  26. </view>
  27. </view>
  28. </scroll-view>
  29. </view>
  30. </view>
  31. <view class="one_3" v-else-if="barActive=='1'">
  32. <view class="first">
  33. <input type="text" v-model="searchInfo.name" @blur="toInput" placeholder="搜索商品">
  34. </view>
  35. <view class="second">
  36. <scroll-view scroll-y="true" class="scroll-view" @scrolltolower="toPage">
  37. <view class="list-scroll-view">
  38. <view class="second_1">
  39. <view :class="['list',condActive==index?'activeList':'']" v-for="(item,index) in condList" :key="index" @tap="toCond(index,item)">
  40. <view class="name">
  41. {{item.name}}
  42. </view>
  43. <view class="icon">
  44. <view class="icon_1">
  45. <text :class="['iconfont',item.shangActive]" v-if="condActive==index&&shang=='1'"></text>
  46. <text :class="['iconfont',item.shang]" v-else></text>
  47. </view>
  48. <view class="icon_1">
  49. <text :class="['iconfont', item.xiaActive]" v-if="condActive==index&&xia=='-1'"></text>
  50. <text :class="['iconfont', item.xia]" v-else></text>
  51. </view>
  52. </view>
  53. </view>
  54. </view>
  55. <view class="second_2">
  56. <view class="list" v-for="(item,index) in list" :key="index">
  57. <image class="image" :src="item.file&&item.file.length>0?item.file[0].url:''" mode=""></image>
  58. <view class="sale" v-if="item.is_sale==true">
  59. <text>已售尽</text>
  60. </view>
  61. <view class="name">
  62. {{item.name}}
  63. </view>
  64. <view class="other">
  65. <view class="money">
  66. <text>¥</text>
  67. <text>{{item.sell_money}}</text>
  68. </view>
  69. <view class="btn">
  70. <button type="default" size="mini" @click="toBuy(item)">购买</button>
  71. </view>
  72. </view>
  73. </view>
  74. </view>
  75. </view>
  76. </scroll-view>
  77. </view>
  78. </view>
  79. <view class="one_4" v-else-if="barActive=='2'">
  80. <view class="first">
  81. <image class="image" :src="info.logo&&info.logo.length>0?info.logo[0].url:''" mode=""></image>
  82. <view class="name">{{info.name}}</view>
  83. </view>
  84. <view class="second">
  85. <view class="second_1">
  86. <view class="grade">
  87. <view>{{info.goods_score||0}}</view>
  88. 商品
  89. </view>
  90. <view class="grade">
  91. <view>{{info.send_score||0}}</view>
  92. 发货
  93. </view>
  94. <view class="grade">
  95. <view>{{info.service_score||0}}</view>
  96. 服务
  97. </view>
  98. </view>
  99. <view class="second_2">
  100. <view class="second_2_bor" @tap="saveQrcode">
  101. <!-- <image class="image" :src="info.qrcode&&info.qrcode.length>0?info.qrcode[0].url:''" mode=""></image> -->
  102. <!-- <tki-qrcode cid="qrcode1" ref="qrcode" :val="val" :size="size" :unit="unit"
  103. :background="background" :foreground="foreground" :pdground="pdground"
  104. :onval="onval" :loadMake="loadMake" :usingComponents="true" @result="qrR" /> -->
  105. <canvas class="qrcode" canvas-id="myQrcode"></canvas>
  106. </view>
  107. <view class="txt">
  108. 店铺二维码
  109. </view>
  110. </view>
  111. </view>
  112. <view class="collect">
  113. <text v-if="!collection" @click="toCollect" class="iconfont icon-yduishoucangkongxin"></text>
  114. <text v-else @click="toCollect" class="iconfont icon-yduishoucangshixin"></text>
  115. </view>
  116. </view>
  117. </view>
  118. <view class="two">
  119. <view class="list" v-for="(item,index) in barList" :key="index" @tap="barChange(index,item)">
  120. <view class="icon">
  121. <text :class="['iconfont',barActive==index?item.acticon:item.icon]"></text>
  122. </view>
  123. <view :class="['name',barActive==index?'activename':'']">
  124. {{item.name}}
  125. </view>
  126. </view>
  127. </view>
  128. </view>
  129. </mobile-frame>
  130. </template>
  131. <script>
  132. // import tkiQrcode from "@/components/tki-qrcode/tki-qrcode.vue"
  133. import QRCode from '@/common/weapp-qrcode.js'
  134. export default {
  135. components: {},
  136. data() {
  137. return {
  138. val: '', // 要生成的二维码值
  139. size: 300, // 二维码大小
  140. unit: 'upx', // 单位
  141. background: '#FFFFFF', // 背景色
  142. foreground: '#000000', // 前景色
  143. pdground: '#000000', // 角标色
  144. onval: true, // val值变化时自动重新生成二维码
  145. loadMake: true, // 组件加载完成后自动生成二维码
  146. src: '', // 二维码生成后的图片地址或base64
  147. user: {},
  148. id: '',
  149. barActive: '0',
  150. barList: [ //底部菜单
  151. {
  152. icon: 'icon-shangdian',
  153. acticon: "icon-shangdian-copy",
  154. name: '微店首页'
  155. },
  156. {
  157. icon: 'icon-shangpinfenlei',
  158. acticon: "icon-shangpinfenlei-copy",
  159. name: '全部商品'
  160. },
  161. {
  162. icon: 'icon-qiyejianjie',
  163. acticon: "icon-qiyejianjie-copy",
  164. name: '店铺简介'
  165. }
  166. ],
  167. // 店铺信息
  168. info: {},
  169. // 店铺部分商品
  170. shoplist: [],
  171. // 收藏
  172. collection: false,
  173. // 全部商品
  174. searchInfo: {},
  175. list: [],
  176. total: 0,
  177. page: 0,
  178. skip: 0,
  179. limit: 5,
  180. condActive: 0,
  181. shang: '',
  182. xia: '',
  183. condList: [ // 筛选
  184. {
  185. name: '默认',
  186. },
  187. {
  188. name: '销量',
  189. shang: 'icon-shangjiantou',
  190. shangActive: 'icon-shangjiantou-copy',
  191. xia: 'icon-xiajiantou',
  192. xiaActive: 'icon-xiajiantou-copy'
  193. },
  194. {
  195. name: '价格',
  196. shang: 'icon-shangjiantou',
  197. shangActive: 'icon-shangjiantou-copy',
  198. xia: 'icon-xiajiantou',
  199. xiaActive: 'icon-xiajiantou-copy'
  200. },
  201. {
  202. name: '浏览量',
  203. shang: 'icon-shangjiantou',
  204. shangActive: 'icon-shangjiantou-copy',
  205. xia: 'icon-xiajiantou',
  206. xiaActive: 'icon-xiajiantou-copy'
  207. }
  208. ]
  209. };
  210. },
  211. onLoad: async function(e) {
  212. const that = this;
  213. that.$set(that, `id`, e.id || '');
  214. await that.watchLogin();
  215. await that.search();
  216. await that.searchOther();
  217. },
  218. onShow: function() {},
  219. methods: {
  220. qrR(res) {
  221. this.src = res
  222. },
  223. saveQrcode() {
  224. this.$refs.qrcode._saveCode()
  225. },
  226. // 监听用户是否登录
  227. watchLogin() {
  228. const that = this;
  229. uni.getStorage({
  230. key: 'token',
  231. success: function(res) {
  232. let user = that.$jwt(res.data);
  233. that.$set(that, `user`, user);
  234. },
  235. fail: function(err) {}
  236. })
  237. },
  238. // 查询信息
  239. async search() {
  240. const that = this;
  241. if (that.id) {
  242. // 查询店铺信息
  243. const res = await that.$api(`/shop/${that.id}`, 'GET');
  244. if (res.errcode == '0') that.$set(that, `info`, res.data);
  245. let arr = await that.$api(`/storeShop/check`, `GET`, {
  246. customer: that.user._id,
  247. shop: that.id
  248. });
  249. if (arr.errcode == '0') {
  250. that.$set(that, `collection`, arr.data)
  251. }
  252. // 查询店铺商品
  253. that.searchShopMarket();
  254. // 查询全部商品
  255. that.searchAll();
  256. // 创建二维码
  257. that.createQrcode(that.info);
  258. }
  259. },
  260. // 查询店铺商品
  261. async searchShopMarket() {
  262. const that = this;
  263. const res = await that.$api(`/viewGoods/indexGoodsList`, 'GET', {
  264. shop: that.id,
  265. skip: 0,
  266. limit: 20
  267. })
  268. if (res.errcode == '0') that.$set(that, `shoplist`, res.data);
  269. },
  270. // 查询全部产品
  271. async searchAll() {
  272. const that = this;
  273. let info = {
  274. shop: that.id,
  275. skip: that.skip,
  276. limit: that.limit
  277. }
  278. const res = await that.$api(`/viewGoods/indexGoodsList`, `GET`, {
  279. ...info,
  280. ...that.searchInfo
  281. })
  282. if (res.errcode == '0') {
  283. let list = [...that.list, ...res.data];
  284. that.$set(that, `list`, list)
  285. that.$set(that, `total`, res.total)
  286. } else {
  287. uni.showToast({
  288. title: res.errmsg,
  289. });
  290. }
  291. },
  292. // 创建二维码
  293. createQrcode(e) {
  294. // console.log(e);
  295. const that = this;
  296. const url = `${that.$config.serverUrl}/shopinfo?id=${e._id}`;
  297. var qrcode = new QRCode(`myQrcode`, {
  298. text: url,
  299. width: 110,
  300. height: 110,
  301. padding: 3,
  302. colorDark: "#000000",
  303. colorLight: "#ffffff",
  304. correctLevel: QRCode.CorrectLevel.L,
  305. });
  306. },
  307. // 购买
  308. toBuy(item) {
  309. if (item && item._id) {
  310. uni.navigateTo({
  311. url: `/pagesHome/order/detail?id=${item._id}`
  312. })
  313. }
  314. },
  315. // 全部产品-分页
  316. async toPage() {
  317. const that = this;
  318. let list = that.list;
  319. let limit = that.limit;
  320. if (that.total > list.length) {
  321. uni.showLoading({
  322. title: '加载中',
  323. mask: true
  324. })
  325. let page = that.page + 1;
  326. that.$set(that, `page`, page)
  327. let skip = page * limit;
  328. that.$set(that, `skip`, skip)
  329. that.searchAll();
  330. uni.hideLoading();
  331. } else uni.showToast({
  332. title: '没有更多数据了'
  333. });
  334. },
  335. // 输入框
  336. toInput(e) {
  337. const that = this;
  338. that.$set(that.searchInfo, `name`, e.detail.value);
  339. that.clearPage();
  340. that.searchAll();
  341. },
  342. // 筛选
  343. toCond(index, e) {
  344. const that = this;
  345. let condActive = that.condActive;
  346. that.$set(that, `condActive`, index);
  347. if (condActive != index && that.xia == '') {
  348. that.$set(that, `shang`, '0');
  349. that.$set(that, `xia`, '-1');
  350. } else if (condActive == index && that.xia == '-1') {
  351. that.$set(that, `shang`, '1');
  352. that.$set(that, `xia`, '0');
  353. } else if (condActive == index && that.shang == '1') {
  354. that.$set(that, `shang`, '0');
  355. that.$set(that, `xia`, '-1');
  356. } else if (condActive = index && that.shang == '1') {
  357. that.$set(that, `shang`, '0');
  358. that.$set(that, `xia`, '-1');
  359. }
  360. let key = '';
  361. let value;
  362. if (index != 0) {
  363. value = that.shang == '0' ? that.xia : that.shang;
  364. }
  365. if (index == 1) {
  366. key = 'sell_num';
  367. } else if (index == 2) {
  368. key = 'sell_money';
  369. } else if (index == 3) {
  370. key = 'view_num';
  371. }
  372. that.$set(that.searchInfo, `key`, key);
  373. that.$set(that.searchInfo, `value`, value);
  374. that.clearPage();
  375. that.searchAll();
  376. },
  377. // 查询其他信息
  378. async searchOther() {
  379. const that = this;
  380. let user = that.user;
  381. let shop = that.info;
  382. if (user && user._id && shop && shop._id) {
  383. // 商铺是否收藏
  384. let arr = await that.$api(`/storeShop/check`, `GET`, {
  385. customer: user._id,
  386. shop: shop._id
  387. });
  388. if (arr.errcode == '0') {
  389. that.$set(that, `collection`, arr.data)
  390. }
  391. }
  392. },
  393. // 收藏
  394. async toCollect() {
  395. const that = this;
  396. let user = that.user;
  397. let shop = that.info;
  398. if (user && user._id && shop && shop._id) {
  399. let res = await that.$api(`/storeShop`, `POST`, {
  400. customer: user._id,
  401. shop: shop._id
  402. });
  403. if (res.errcode == '0') {
  404. uni.showToast({
  405. title: res.data.msg,
  406. icon: 'none'
  407. })
  408. that.$set(that, `collection`, res.data.result)
  409. }
  410. } else {
  411. uni.showToast({
  412. title: '缺少必要信息,无法收藏',
  413. icon: 'none'
  414. })
  415. }
  416. },
  417. // 选择底部菜单
  418. barChange(index, item) {
  419. const that = this;
  420. that.$set(that, `barActive`, index);
  421. uni.setNavigationBarTitle({
  422. title: item.name
  423. });
  424. },
  425. // 清空列表
  426. clearPage() {
  427. const that = this;
  428. that.$set(that, `list`, [])
  429. that.$set(that, `skip`, 0)
  430. that.$set(that, `limit`, 5)
  431. that.$set(that, `page`, 0)
  432. }
  433. }
  434. }
  435. </script>
  436. <style lang="scss">
  437. .main {
  438. display: flex;
  439. flex-direction: column;
  440. width: 100vw;
  441. height: 100vh;
  442. .one {
  443. position: relative;
  444. flex-grow: 1;
  445. .one_1 {
  446. display: flex;
  447. flex-direction: column;
  448. width: 96vw;
  449. height: 90vh;
  450. padding: 2vw;
  451. background-color: var(--fFB1Color);
  452. .first {
  453. margin: 0 0 2vw 0;
  454. .image {
  455. width: 100%;
  456. height: 50vw;
  457. }
  458. }
  459. .second {
  460. position: relative;
  461. flex-grow: 1;
  462. .list {
  463. margin: 0 2vw 2vw 0;
  464. background-color: var(--fffColor);
  465. padding: 2vw;
  466. width: 43vw;
  467. border-radius: 5px;
  468. .image {
  469. width: 100%;
  470. height: 49vw;
  471. margin: 0 0 1vw 0;
  472. }
  473. .name {
  474. font-size: var(--font15Size);
  475. margin: 0 0 2vw 0;
  476. }
  477. .other {
  478. display: flex;
  479. flex-direction: row;
  480. justify-content: space-between;
  481. .money {
  482. color: var(--ff0Color);
  483. text:nth-child(1) {
  484. font-size: var(--font12Size);
  485. }
  486. }
  487. .btn {
  488. button {
  489. border-radius: 25px;
  490. color: var(--fffColor);
  491. background-color: var(--ff0Color);
  492. font-size: var(--font12Size);
  493. }
  494. }
  495. }
  496. }
  497. .list:nth-child(2n) {
  498. margin: 0 0 2vw 0;
  499. }
  500. }
  501. }
  502. .one_2 {
  503. height: 91vh;
  504. display: flex;
  505. flex-direction: row;
  506. padding: 2vw;
  507. .first_1 {
  508. position: relative;
  509. width: 25vw;
  510. background-color: #fafafa;
  511. display: flex;
  512. flex-direction: column;
  513. .list {
  514. text-align: center;
  515. padding: 2.5vw 0;
  516. border-bottom: 1px solid var(--f1Color);
  517. text {
  518. font-size: var(--font14Size);
  519. }
  520. }
  521. .listActive {
  522. background-color: var(--fffColor);
  523. }
  524. }
  525. .first_2 {
  526. padding: 2vw;
  527. flex-grow: 1;
  528. position: relative;
  529. display: flex;
  530. flex-direction: column;
  531. .list {
  532. margin: 0 0 2vw 0;
  533. padding: 2vw;
  534. .title {
  535. font-size: var(--font16Size);
  536. margin: 0 0 2vw 0;
  537. }
  538. .market {
  539. display: flex;
  540. flex-direction: row;
  541. flex-wrap: wrap;
  542. .marketList {
  543. text-align: center;
  544. margin: 0 2vw 2vw 0;
  545. width: 22vw;
  546. .image {
  547. width: 100%;
  548. height: 15vw;
  549. }
  550. .name {
  551. font-size: var(--font14Size);
  552. }
  553. }
  554. .marketList:nth-child(3n) {
  555. margin: 0 0 2vw 0;
  556. }
  557. }
  558. }
  559. }
  560. }
  561. .one_3 {
  562. display: flex;
  563. flex-direction: column;
  564. width: 100vw;
  565. height: 90vh;
  566. .first {
  567. border-bottom: 1px solid var(--f85Color);
  568. padding: 2vw;
  569. input {
  570. padding: 2vw;
  571. background-color: var(--f1Color);
  572. font-size: var(--font14Size);
  573. border-radius: 5px;
  574. }
  575. }
  576. .second {
  577. position: relative;
  578. flex-grow: 1;
  579. .second_1 {
  580. width: 96vw;
  581. background-color: var(--fffColor);
  582. padding: 2vw;
  583. display: flex;
  584. flex-direction: row;
  585. justify-content: space-around;
  586. .list {
  587. display: flex;
  588. flex-direction: row;
  589. .icon {
  590. position: relative;
  591. top: -5px;
  592. left: 2px;
  593. .icon_1 {
  594. height: 10px;
  595. .iconfont {
  596. font-size: 12px;
  597. }
  598. }
  599. }
  600. }
  601. .activeList {
  602. .name {
  603. color: #ff0000;
  604. }
  605. }
  606. }
  607. .second_2 {
  608. display: flex;
  609. flex-direction: row;
  610. flex-wrap: wrap;
  611. padding: 2vw 2vw 0 2vw;
  612. background-color: var(--f1Color);
  613. .list {
  614. position: relative;
  615. width: 43vw;
  616. margin: 0 2vw 2vw 0;
  617. padding: 2vw;
  618. border-radius: 9px;
  619. background-color: var(--fffColor);
  620. .image {
  621. width: 100%;
  622. height: 40vw;
  623. }
  624. .sale {
  625. position: absolute;
  626. top: 18vw;
  627. text-align: center;
  628. width: 43vw;
  629. text {
  630. background-color: #0000005f;
  631. border-radius: 90px;
  632. display: inline-block;
  633. width: 15vw;
  634. height: 15vw;
  635. color: var(--fffColor);
  636. text-align: center;
  637. line-height: 15vw;
  638. }
  639. }
  640. .name {
  641. font-size: var(--font16Size);
  642. margin: 0 0 1vw 0;
  643. }
  644. .other {
  645. display: flex;
  646. flex-direction: row;
  647. justify-content: space-between;
  648. .money {
  649. font-size: var(--font14Size);
  650. color: var(--ff0Color);
  651. text:nth-child(1) {
  652. font-size: var(--font12Size);
  653. }
  654. }
  655. .other_1 {
  656. flex-grow: 1;
  657. margin: 0 0 0 2vw;
  658. font-size: var(--font12Size);
  659. color: var(--f85Color);
  660. }
  661. .btn {
  662. button {
  663. border-radius: 25px;
  664. color: var(--fffColor);
  665. background-color: var(--ff0Color);
  666. font-size: var(--font12Size);
  667. }
  668. }
  669. }
  670. }
  671. .list:nth-child(2n) {
  672. margin: 0 0 2vw 0;
  673. }
  674. }
  675. }
  676. }
  677. .one_4 {
  678. .first {
  679. display: flex;
  680. flex-direction: column;
  681. align-items: center;
  682. background-color: var(--fFB1Color);
  683. border-bottom-right-radius: 10vw;
  684. border-bottom-left-radius: 10vw;
  685. .image {
  686. width: 20vw;
  687. height: 20vw;
  688. border-radius: 20vw;
  689. }
  690. .name {
  691. margin: 2vw 0;
  692. font-size: var(--font16Szie);
  693. font-weight: bold;
  694. color: var(--mainColor);
  695. }
  696. }
  697. .second {
  698. margin: 2vw 0;
  699. .second_1 {
  700. display: flex;
  701. justify-content: space-evenly;
  702. .grade {
  703. display: flex;
  704. flex-direction: column;
  705. align-items: center;
  706. color: var(--f85Color);
  707. font-size: var(--font13Size);
  708. view {
  709. margin: 1vw 0 0 0;
  710. color: var(--ff0Color);
  711. }
  712. }
  713. }
  714. .second_2 {
  715. display: flex;
  716. justify-content: center;
  717. flex-direction: column;
  718. margin: 15vw 25vw 0 25vw;
  719. text-align: center;
  720. background: #b2b2b2;
  721. padding: 2vw;
  722. border-radius: 5px;
  723. .second_2_bor {
  724. .image {
  725. width: 100%;
  726. height: 40vw;
  727. }
  728. }
  729. .txt {
  730. color: #fff;
  731. font-size: 14px;
  732. margin: 2vw 0;
  733. }
  734. }
  735. }
  736. }
  737. .collect {
  738. position: fixed;
  739. top: 0;
  740. right: 2vw;
  741. .iconfont {
  742. font-size: 25px;
  743. }
  744. }
  745. }
  746. .two {
  747. display: flex;
  748. flex-direction: row;
  749. justify-content: space-around;
  750. border-top: 1px solid #f1f1f1;
  751. .list {
  752. padding: 1vw 0;
  753. text-align: center;
  754. .icon {}
  755. .name {
  756. font-size: 12px;
  757. }
  758. .activename {
  759. color: var(--fFB1Color);
  760. }
  761. }
  762. }
  763. }
  764. .scroll-view {
  765. position: absolute;
  766. top: 0;
  767. left: 0;
  768. right: 0;
  769. bottom: 0;
  770. .list-scroll-view {
  771. display: flex;
  772. flex-direction: row;
  773. flex-wrap: wrap;
  774. }
  775. }
  776. </style>