Header.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859
  1. <script setup>
  2. import { ref, onMounted } from "vue";
  3. import { Search, Promotion, Avatar } from "@element-plus/icons-vue";
  4. import { useUser } from "~/store/user.js";
  5. import ActivateMembership from "~/components/ActivateMembership/index.vue";
  6. import SvgIcon from "~/components/SvgIcon/index.vue";
  7. import Login from "~/components/Login/Login.vue";
  8. import Level from "~/components/Level/index.vue";
  9. import * as qianApi from "~/api/qiandao";
  10. import { getPicUrl } from "~/utils/util";
  11. import * as taskApi from "~/api/task";
  12. import { useRouter } from "vue-router";
  13. const tosuccess = (type)=>{
  14. if(type=='browse'){
  15. router.replace({
  16. name:'Forum'
  17. })
  18. }
  19. }
  20. const router = useRouter();
  21. // 弹出层
  22. const dialogVisible = ref(false);
  23. //退出
  24. const clearLocalStorage = () => {
  25. localStorage.clear();
  26. dialogVisible.value = false;
  27. router.go(0);
  28. };
  29. //跳转到个人信息
  30. const topersonal = () => {
  31. router.push({
  32. path: "/personal",
  33. });
  34. };
  35. //任务列表
  36. let taskList = ref([]);
  37. const __task__ = async () => {
  38. try {
  39. const { data } = await taskApi.list({
  40. is_page: 0,
  41. // type: "once_repeat",
  42. });
  43. taskList.value = data.reverse();
  44. } catch (error) {}
  45. };
  46. onMounted(__task__);
  47. const User = useUser();
  48. console.log("user", User.name);
  49. let wid = User.already_upgrade_rate * 100 || 0;
  50. console.log(User.already_upgrade_rate);
  51. const keyword = ref(""); // Search keyword
  52. //等级奖励
  53. const levelList = ref([]);
  54. const __level__ = async () => {
  55. try {
  56. const { data } = await qianApi.level({
  57. is_page: 0,
  58. });
  59. levelList.value = data;
  60. } catch (error) {}
  61. };
  62. onMounted(__level__);
  63. //领取奖励
  64. const toget = (id, type) => {
  65. __leve__(id, type);
  66. };
  67. //领取等级奖励接口
  68. const __leve__ = async (id) => {
  69. try {
  70. const { data } = await qianApi.levelPrize({
  71. id: id,
  72. address_id: "",
  73. });
  74. __level__();
  75. ElMessage.success({
  76. message: "领取成功",
  77. type: "success",
  78. });
  79. } catch (error) {}
  80. };
  81. const momentList = ref([
  82. {
  83. label: "论坛",
  84. icon: getPicUrl("../../assets/cicons/send-01.png", import.meta.url),
  85. type: "", // 类型跳转发布时的type
  86. },
  87. {
  88. label: "文章",
  89. icon: getPicUrl("../../assets/cicons/send-02.png", import.meta.url),
  90. type: "", // 类型跳转发布时的type
  91. },
  92. {
  93. label: "资讯",
  94. icon: getPicUrl("../../assets/cicons/send-03.png", import.meta.url),
  95. type: "", // 类型跳转发布时的type
  96. },
  97. {
  98. label: "视频",
  99. icon: getPicUrl("../../assets/cicons/send-04.png", import.meta.url),
  100. type: "", // 类型跳转发布时的type
  101. },
  102. {
  103. label: "草稿箱",
  104. icon: getPicUrl("../../assets/cicons/send-05.png", import.meta.url),
  105. type: "", // 类型跳转发布时的type
  106. },
  107. ]);
  108. const handleClickMoment = (moment) => {
  109. console.log(
  110. "%c click moment item >>>",
  111. "background: blue; color: #fff",
  112. moment
  113. );
  114. };
  115. //兑换
  116. const toinform = (idx) => {
  117. if (idx == 0) {
  118. router.push({
  119. path: "/conversion",
  120. query: {},
  121. });
  122. }
  123. };
  124. //通知
  125. const inform = (idx) => {
  126. router.push({
  127. path: "/inform",
  128. query: {},
  129. });
  130. };
  131. let pan = ref(false);
  132. //开通会员
  133. const member = () => {
  134. pan.value = true;
  135. };
  136. // Login logic
  137. const visibilityLoginDialog = ref(false);
  138. const handleLogin = () => {
  139. visibilityLoginDialog.value = true;
  140. };
  141. const attention = (idx) => {
  142. if (idx == 0) {
  143. router.replace({
  144. name: "Follow",
  145. });
  146. } else {
  147. router.replace({
  148. name: "Home",
  149. });
  150. }
  151. };
  152. </script>
  153. <template>
  154. <div class="header-container flex-row flex-aic flex-jc-sb">
  155. <div class="logo">ny-logo</div>
  156. <div class="header__content flex-row flex-aic flex-jc-sb">
  157. <el-input
  158. v-model="keyword"
  159. class="searchbox"
  160. placeholder="VR拍摄"
  161. :suffix-icon="Search"
  162. />
  163. <el-button-group>
  164. <el-button @click="attention(0)">关注</el-button>
  165. <el-button @click="attention(1)" type="primary">最新</el-button>
  166. </el-button-group>
  167. <div class="header__content__right flex-row flex-aic">
  168. <el-popover
  169. popper-class="vip-poperclass"
  170. placement="bottom"
  171. :width="332"
  172. trigger="click"
  173. >
  174. <template #reference>
  175. <el-button class="vip-btn">
  176. <SvgIcon name="crown" :size="19" :rgap="3" color="#523618" />
  177. 忆象会员
  178. </el-button>
  179. </template>
  180. <div class="vip-container">
  181. <div class="vip-card flex-col flex-jc-sb">
  182. <div class="vip-card__header flex-row">
  183. <div class="vip-avatar">
  184. <img :src="User.avatar" :alt="User.name" class="circle" />
  185. </div>
  186. <div class="vip-userinfo">
  187. <div class="vname">{{ User.name }}</div>
  188. <div class="vdesc">{{ User.introduction }}</div>
  189. </div>
  190. </div>
  191. <div class="vip-card__footer flex-row flex-jc-sb">
  192. <template v-if="User.is_vip">
  193. <span style="width: 170px"
  194. >会员有效期至{{ User.vip_expired_at }}</span
  195. >
  196. <span @click="member">立即续费</span>
  197. </template>
  198. <template v-else>
  199. <span>开通会员享权益</span>
  200. <span @click="member">立即开通</span>
  201. </template>
  202. </div>
  203. </div>
  204. <!-- NOTE: VIP 签到奖励 -->
  205. <!-- NOTE: 三种状态, 已领取/领取/未达标 -->
  206. <div class="vip-sign-prizes">
  207. <div
  208. class="prize-box"
  209. v-for="(item, idx) in levelList"
  210. :key="idx"
  211. >
  212. <div class="prize-box__img"></div>
  213. <div class="prize-box__title">等级达到{{ item.level }}</div>
  214. <div class="prize-box__sub-title">{{ item.prize_name }}</div>
  215. <el-button type="primary" disabled v-if="item.is_received == 1"
  216. >已领取</el-button
  217. >
  218. <el-button
  219. type="primary"
  220. v-if="item.is_received == 0 && item.is_qualified == 1"
  221. @click="toget(item.id, item.prize_type)"
  222. >领取</el-button
  223. >
  224. <el-button link disabled v-if="item.is_qualified == 0"
  225. >未达标</el-button
  226. >
  227. </div>
  228. </div>
  229. <div class="vip-footer">等级奖励</div>
  230. </div>
  231. </el-popover>
  232. <!-- NOTE: 邀请好友&发布 用户登录才有 -->
  233. <template v-if="User.token">
  234. <el-button type="primary">
  235. <SvgIcon name="people" :size="19" color="#ffffff" />
  236. 邀请好友
  237. </el-button>
  238. <!-- NOTE: 发布内容 -->
  239. <el-popover placement="bottom" :width="120" trigger="click">
  240. <template #reference>
  241. <el-button type="primary" :icon="Promotion">发布</el-button>
  242. </template>
  243. <div class="moment-container">
  244. <ul>
  245. <li
  246. v-for="(moment, idx) in momentList"
  247. :key="idx"
  248. class="flex-row flex-aic"
  249. @click="handleClickMoment(moment)"
  250. >
  251. <img :src="moment.icon" :alt="moment.label" class="icon" />
  252. <span class="moment__label">{{ moment.label }}</span>
  253. </li>
  254. </ul>
  255. </div>
  256. </el-popover>
  257. <el-button link @click="inform">
  258. <SvgIcon name="ding" :size="24"></SvgIcon>
  259. </el-button>
  260. <!-- NOTE: User Avatar container -->
  261. <el-popover placement="bottom-start" :width="276" trigger="click">
  262. <template #reference>
  263. <div class="userinfo-avatar">
  264. <img class="circle" :src="User.avatar" :alt="User.name" />
  265. </div>
  266. </template>
  267. <div class="userinfo-container uc">
  268. <div class="uc__avatar" @click="topersonal">
  269. <img class="circle" :src="User.avatar" :alt="User.name" />
  270. </div>
  271. <div class="uc__name">{{ User.name }}</div>
  272. <!-- TODO: 用户徽章 -->
  273. <div class="uc__flags">
  274. <img src="" alt="" />
  275. </div>
  276. <div class="uc__integral flex-row flex-aic flex-jc-sb">
  277. <span class="integral_text"
  278. >当前积分{{ User.integral_sum }},差{{
  279. User.left_upgrade
  280. }}升级</span
  281. >
  282. <el-dropdown>
  283. <el-button class="task-btn" link>任务列表</el-button>
  284. <template #dropdown>
  285. <el-dropdown-menu>
  286. <!-- 点赞 -->
  287. <div v-for="(item, idx) in taskList" :key="idx">
  288. <el-dropdown-item>
  289. <div
  290. style="
  291. width: 320px;
  292. padding: 12px 8px;
  293. box-sizing: border-box;
  294. display: flex;
  295. justify-content: space-between;
  296. align-items: center;
  297. "
  298. >
  299. <div style="display: flex">
  300. <img
  301. style="width: 34px; height: 34px"
  302. :src="item.image"
  303. alt=""
  304. />
  305. <div style="margin-left: 8px">
  306. <div class="title">
  307. {{ item.name }}({{ item.finished_times }}/{{
  308. item.times
  309. }})
  310. </div>
  311. <div
  312. v-if="item.status == 'finished'"
  313. class="bottom"
  314. >
  315. +经验{{ item.integral }}
  316. </div>
  317. <div
  318. v-if="item.status == 'pending'"
  319. class="bottom"
  320. style="color: #777777"
  321. >
  322. +经验{{ item.integral }}
  323. </div>
  324. </div>
  325. </div>
  326. <div
  327. class="success"
  328. v-if="item.status == 'pending'"
  329. style="background: #00b0b0"
  330. @click="tosuccess(item.source_type)"
  331. >
  332. 去完成
  333. </div>
  334. <div class="success" v-else>已完成</div>
  335. </div>
  336. </el-dropdown-item>
  337. </div>
  338. </el-dropdown-menu>
  339. </template>
  340. </el-dropdown>
  341. </div>
  342. <div class="uc__grade">
  343. <div class="uc__grade__show-bar">
  344. <div class="sb-inside" :style="{ width: wid + '%' }"></div>
  345. </div>
  346. <div class="uc__grade_txt flex-row flex-jc-sb">
  347. <Level :level="User.level" full />
  348. <Level :level="User.level + 1" />
  349. </div>
  350. </div>
  351. <div class="uc__part">
  352. <div>
  353. <div>{{ User.follow_count || 0 }}</div>
  354. <div>关注</div>
  355. </div>
  356. <div>
  357. <div>{{ User.fans_count || 0 }}</div>
  358. <div>粉丝</div>
  359. </div>
  360. <div>
  361. <div>{{ User.collect_count || 0 }}</div>
  362. <div>收藏</div>
  363. </div>
  364. <div>
  365. <div>{{ User.view_count || 0 }}</div>
  366. <div>足迹</div>
  367. </div>
  368. </div>
  369. <div class="uc__gap"></div>
  370. <div class="uc__item">
  371. <div class="itembox" @click="toinform(0)">
  372. <div class="icon">
  373. <img
  374. src="../../assets/cicons/header-01.png"
  375. style="width: 20px; height: 20px"
  376. alt=""
  377. />
  378. </div>
  379. <div class="label">兑换记录</div>
  380. </div>
  381. <div class="itembox" @click="toinform(1)">
  382. <div class="icon">
  383. <img
  384. src="../../assets/cicons/header-02.png"
  385. style="width: 20px; height: 20px"
  386. alt=""
  387. />
  388. </div>
  389. <div class="label">预约记录</div>
  390. </div>
  391. <div class="itembox" @click="toinform(2)">
  392. <div class="icon">
  393. <img
  394. src="../../assets/cicons/header-03.png"
  395. style="width: 20px; height: 20px"
  396. alt=""
  397. />
  398. </div>
  399. <div class="label">租赁记录</div>
  400. </div>
  401. <div class="itembox" @click="toinform(3)">
  402. <div class="icon">
  403. <img
  404. src="../../assets/cicons/header-04.png"
  405. style="width: 20px; height: 20px"
  406. alt=""
  407. />
  408. </div>
  409. <div class="label" @click="toinform(4)">签到奖励</div>
  410. </div>
  411. <div class="itembox">
  412. <div class="icon">
  413. <img
  414. src="../../assets/cicons/header-05.png"
  415. style="width: 20px; height: 20px"
  416. alt=""
  417. />
  418. </div>
  419. <div class="label">积分明细</div>
  420. </div>
  421. <div class="itembox" @click="toinform(5)">
  422. <div class="icon">
  423. <img
  424. src="../../assets/cicons/header-06.png"
  425. style="width: 20px; height: 20px"
  426. alt=""
  427. />
  428. </div>
  429. <div class="label" @click="dialogVisible = true">
  430. 退出忆象
  431. </div>
  432. </div>
  433. </div>
  434. </div>
  435. </el-popover>
  436. </template>
  437. <template v-else>
  438. <el-button type="primary" @click="handleLogin">登录/注册</el-button>
  439. </template>
  440. </div>
  441. </div>
  442. </div>
  443. <ActivateMembership :visiblePay="pan" />
  444. <Login v-model="visibilityLoginDialog" />
  445. <!-- 退出意向 -->
  446. <el-dialog title="提示" v-model="dialogVisible" width="416px">
  447. <div>确定要退出忆象吗?</div>
  448. <template #footer>
  449. <span class="dialog-footer">
  450. <el-button @click="dialogVisible = false">取 消</el-button>
  451. <el-button type="primary" @click="clearLocalStorage">确 定</el-button>
  452. </span>
  453. </template>
  454. </el-dialog>
  455. </template>
  456. <style lang="scss" scoped>
  457. @import "~/styles/variable.scss";
  458. .bottom {
  459. font-family: PingFangSC, PingFang SC;
  460. font-weight: 400;
  461. font-size: 10px;
  462. color: #ff6700;
  463. line-height: 14px;
  464. text-align: left;
  465. font-style: normal;
  466. }
  467. .title {
  468. font-family: PingFangSC, PingFang SC;
  469. font-weight: 500;
  470. font-size: 12px;
  471. color: #222222;
  472. line-height: 17px;
  473. text-align: left;
  474. font-style: normal;
  475. }
  476. .success {
  477. width: 56px;
  478. height: 24px;
  479. background: #d7d7d7;
  480. border-radius: 14px;
  481. line-height: 24px;
  482. font-family: PingFangSC, PingFang SC;
  483. font-weight: 400;
  484. font-size: 11px;
  485. color: #ffffff;
  486. line-height: 24px;
  487. text-align: center;
  488. font-style: normal;
  489. }
  490. .header {
  491. &-container {
  492. height: 66px;
  493. background: #ffffff;
  494. box-shadow: 0px 1px 0px 0px rgba(0, 0, 0, 0.06);
  495. padding-right: 20px;
  496. border-bottom: 1px solid rgba(240, 240, 240, 1);
  497. box-sizing: border-box;
  498. }
  499. &__content {
  500. width: 0;
  501. flex: 1;
  502. &__right {
  503. .vip-btn {
  504. background-color: rgba(255, 234, 203, 1);
  505. color: #523618;
  506. }
  507. }
  508. }
  509. .logo {
  510. width: 210px;
  511. height: 66px;
  512. }
  513. .searchbox {
  514. width: 346px;
  515. height: 36px;
  516. border-radius: 4px;
  517. :deep(.el-input__wrapper) {
  518. background-color: #f4f4f4;
  519. }
  520. }
  521. }
  522. .vip {
  523. &-container {
  524. width: 308px;
  525. padding: 4px;
  526. box-sizing: border-box;
  527. }
  528. &-poperclass {
  529. background: #ffffff;
  530. box-shadow: 0px 0px 20px -8px rgba(0, 0, 0, 0.4);
  531. border-radius: 8px;
  532. }
  533. &-card {
  534. width: 300px;
  535. height: 122px;
  536. border-radius: 10px;
  537. background-image: url("~/assets/vip/bgc.png");
  538. background-size: 300px 122px;
  539. padding: 14px 12px 18px 14px;
  540. box-sizing: border-box;
  541. overflow: hidden;
  542. &__header {
  543. .vip-avatar {
  544. width: 36px;
  545. height: 36px;
  546. background-color: #fff;
  547. border-radius: 36px;
  548. img {
  549. width: 100%;
  550. height: 100%;
  551. object-fit: cover;
  552. }
  553. }
  554. .vip-userinfo {
  555. padding-left: 10px;
  556. .vname {
  557. font-size: 14px;
  558. font-weight: 500;
  559. color: #ffffff;
  560. line-height: 16px;
  561. }
  562. .vdesc {
  563. font-size: 12px;
  564. font-weight: 400;
  565. color: #ffffff;
  566. line-height: 22px;
  567. }
  568. }
  569. }
  570. &__footer {
  571. span {
  572. &:last-child {
  573. color: $orange;
  574. cursor: pointer;
  575. }
  576. }
  577. }
  578. }
  579. &-sign-prizes {
  580. display: grid;
  581. grid-template-columns: repeat(3, 33.33%);
  582. padding: 0px 0 20px 0;
  583. .prize-box {
  584. text-align: center;
  585. margin-top: 20px;
  586. &__img {
  587. width: 48px;
  588. height: 48px;
  589. background: #ff7b15;
  590. border-radius: 8px;
  591. opacity: 0.1;
  592. margin: 0 auto 6px;
  593. }
  594. &__title {
  595. font-size: 14px;
  596. font-weight: 400;
  597. color: #333333;
  598. line-height: 26px;
  599. }
  600. &__sub-title {
  601. font-size: 12px;
  602. font-weight: 400;
  603. color: #888888;
  604. line-height: 18px;
  605. margin-bottom: 6px;
  606. }
  607. .el-button.el-button--primary.is-disabled {
  608. background-color: #d8d8d8;
  609. }
  610. }
  611. }
  612. &-footer {
  613. text-align: center;
  614. font-size: 14px;
  615. font-weight: 400;
  616. color: #57c3c2;
  617. // line-height: 40px;
  618. padding-top: 16px;
  619. border-top: 1px solid rgba(204, 204, 204, 0.4);
  620. }
  621. }
  622. .moment {
  623. &-container {
  624. ul {
  625. list-style: none;
  626. padding-inline-start: 0;
  627. margin: 0;
  628. li {
  629. user-select: none;
  630. cursor: pointer;
  631. padding: 8px 7px;
  632. .icon {
  633. width: 22px;
  634. height: 22px;
  635. margin-right: 10px;
  636. }
  637. &:nth-child(4) {
  638. border-bottom: 1px solid #eaeaea;
  639. }
  640. &:last-child {
  641. padding-bottom: initial;
  642. }
  643. }
  644. }
  645. }
  646. &__label {
  647. font-size: 14px;
  648. font-weight: 400;
  649. color: #333333;
  650. line-height: 20px;
  651. cursor: pointer;
  652. }
  653. }
  654. .userinfo {
  655. &-avatar {
  656. cursor: pointer;
  657. margin-left: 20px;
  658. display: inline-block;
  659. width: 36px;
  660. height: 36px;
  661. background-color: blue;
  662. border-radius: 50%;
  663. img {
  664. width: 100%;
  665. height: 100%;
  666. object-fit: cover;
  667. }
  668. }
  669. &-container {
  670. padding: 4px;
  671. .uc {
  672. &__avatar {
  673. width: 58px;
  674. height: 58px;
  675. margin: auto;
  676. border-radius: 50%;
  677. img {
  678. width: 100%;
  679. height: 100%;
  680. object-fit: cover;
  681. }
  682. }
  683. &__name {
  684. font-size: 12px;
  685. font-weight: 600;
  686. color: #222222;
  687. line-height: 17px;
  688. text-align: center;
  689. padding: 8px 0;
  690. }
  691. &__flags {
  692. text-align: center;
  693. img {
  694. width: 12px;
  695. height: 12px;
  696. background-color: green;
  697. margin-right: 4px;
  698. &:last-child {
  699. margin-right: initial;
  700. }
  701. }
  702. }
  703. &__integral {
  704. .task-btn {
  705. font-size: 12px;
  706. font-weight: 400;
  707. color: #00b0b0;
  708. line-height: 14px;
  709. }
  710. }
  711. &__grade {
  712. padding: 10px 0;
  713. &__show-bar {
  714. position: relative;
  715. z-index: 1;
  716. height: 3px;
  717. width: 100%;
  718. background-color: #ccc;
  719. &::after,
  720. &::before {
  721. position: absolute;
  722. z-index: 2;
  723. top: 50%;
  724. transform: translate(-50%, -50%);
  725. content: "";
  726. width: 8px;
  727. height: 8px;
  728. border-radius: 8px;
  729. background: #efefef;
  730. }
  731. &::before {
  732. left: 0;
  733. background-color: #00b0b0;
  734. }
  735. &::after {
  736. right: -8px;
  737. }
  738. .sb-inside {
  739. width: 0%;
  740. height: 3px;
  741. background-color: rgba(0, 176, 176, 1);
  742. }
  743. }
  744. &_txt {
  745. padding: 6px 0;
  746. }
  747. }
  748. &__part {
  749. display: flex;
  750. justify-content: space-between;
  751. padding-bottom: 10px;
  752. > div {
  753. text-align: center;
  754. div:first-child {
  755. font-size: 16px;
  756. font-weight: 400;
  757. color: #222222;
  758. line-height: 17px;
  759. }
  760. div:last-child {
  761. padding-top: 4px;
  762. font-size: 12px;
  763. font-weight: 400;
  764. color: #666666;
  765. line-height: 17px;
  766. }
  767. }
  768. }
  769. &__gap {
  770. height: 1px;
  771. background-color: rgba(225, 225, 225, 0.546);
  772. }
  773. &__item {
  774. display: flex;
  775. flex-wrap: wrap;
  776. justify-content: space-between;
  777. padding-top: 10px;
  778. .itembox {
  779. width: 33%;
  780. margin-bottom: 10px;
  781. text-align: center;
  782. cursor: pointer;
  783. }
  784. }
  785. }
  786. }
  787. }
  788. </style>