<template> <div class="home main-bg-img flex flexc aic"> <!-- 头部 --> <div class="header flex jcb aic"> <div class="left flex aic"> <!-- <img width="70" height="70" src="../../assets/img/png_huizhang.png" alt="LOGO" /> --> <h1 class="title ml10">{{ homeInfo.title }}</h1> </div> <div class="right flex"> <p class="flex aic mr25"> <span class="tips-name"> 今日节约能量: </span> <span class="count count1">{{ homeInfo.dayThrift ?? 0 | filterCount }}</span> </p> <p class="flex aic"> <span class="tips-name"> 累计节约能量: </span> <span class="count count2">{{ homeInfo.totalThrift ?? 0 | filterCount }}</span> </p> </div> </div> <!-- 搜索 --> <div class="flex flexc aic"> <img class="mb32" width="700" src="../../assets/img/png_title@2x.png" /> <div class="search-box"> <el-input v-model="search" placeholder="输入关键词查询"> <i v-show="search" slot="suffix" class="el-icon-circle-close" @click="handleClose" ></i> </el-input> <el-button class="search-btn" @click="handleSearch"> <span class="flex aic jcc"> <img class="mr10" src="../../assets/img/sousuo.png" /> 搜索 </span> </el-button> </div> <div class="hot-search-box flex aic mt28"> <div class="hot-title flex aic jca"> <img src="../../assets/img/icon_hot.png" /> <span>热门词汇:</span> </div> <div @click="handleClick($event)"> <vue-seamless-scroll :data="homeInfo.hotWords" :class-option="optionLeft" class="seamless-warp2" > <div class="hot-list flex aic"> <div class="hot-list-item flex aic" v-for="v in homeInfo.hotWords" :key="v" > <span :data-value="v" v-if="v?.length <= 6" class="hot-search-item" >{{ v }}</span > <span :data-value="v" v-else class="hot-search-item">{{ v?.slice(0, 6) + "..." }}</span> <span class="line"></span> </div> </div> </vue-seamless-scroll> </div> </div> </div> <!-- 主体 --> <div class="main flex aic"> <div class="ranking mr25 flex flexc"> <div> <img class="ranking-title" src="../../assets/img/pic__hot_biaoqian.png" /> </div> <!-- 热门表单列表 --> <div class="ranking-list flex1 flex flexc mt20"> <div v-if="datumList && datumList.length"> <div class="ranking-item flex aic" v-for="(v, i) in datumList" :key="v.id" > <div class="flex aic jcc item-index"> <img v-if="i < 3" :src="checkTopImg(i)" /> <span v-else>{{ i + 1 }}.</span> </div> <p class="flex1" v-ellipsis @click="checkMaterial(i, v)"> {{ v.materialName ? v.materialName : v.materiaFullName }} </p> </div> </div> <div v-else class="tac empty-text">暂无数据</div> </div> </div> <div class="right flex flexc aic jcb"> <div class="right-top flex aic jcb"> <router-link to="/matterList"> <div class="fill-btn flex aic jcc pointer main-kstd-img"> <span class="fill-btn-text1">快</span> <span class="fill-btn-text2">速</span> <span class="fill-btn-text3">查</span> <span class="fill-btn-text4">看</span> </div> </router-link> </div> <!-- 热门事项 --> <div class="right-bottom flex flexc"> <div> <img height="45" class="hot-matter-title" src="../../assets/img/pic__hot_shixiang.png" /> </div> <div class="hot-matter-list flex1 mt10" v-if="matterList && matterList.length" > <vue-seamless-scroll :class-option="optionTop" class="seamless-warp" > <div> <div class="hot-matter-item flex aic" v-for="(v, i) in matterList" :key="v.id" > <div class="flex aic jcc item-index"> <img v-if="i < 3" :src="checkTopImg(i)" /> <span v-else>{{ i + 1 }}.</span> </div> <p class="flex1" v-ellipsis @click="checkMatter(v)"> {{ v.matterName ? v.matterName : v.matterFullName }} </p> </div> </div> </vue-seamless-scroll> </div> <div v-else class="tac empty-text">暂无数据</div> </div> </div> </div> <!-- 底部数据展示 --> <div class="footer flex jcb aic"> <div class="data-item flex1 flex jcc aic"> <span class="data-name">入驻表单量:</span> <div class="count-box"> <span class="data-count" v-format="'#,##0'">{{ homeInfo.datumCont ?? 0 }}</span> <span>份</span> </div> </div> <div class="line"></div> <div class="data-item flex1 flex jcc aic"> <span class="data-name">入驻事项量:</span> <div class="count-box"> <span class="data-count" v-format="'#,##0'">{{ homeInfo.matterCont ?? 0 }}</span> <span>件</span> </div> </div> </div> <!-- 材料列表查看 --> <MateralsList :matterInfo="matterInfo" :visible.sync="visible" ></MateralsList> </div> </template> <script> // import { getHomeInfo } from "@/api"; import MateralsList from "@/components/MateralsList.vue"; import { mapState } from "vuex"; export default { components: { MateralsList, }, data() { return { search: "", rankingActive: 1, top1: require("../../assets/img/png_no.1.png"), top2: require("../../assets/img/png_no.2.png"), top3: require("../../assets/img/png_no.3.png"), // homeInfo: {}, // 首页数据 // datumList: [], // matterList: [], visible: false, matterInfo: {}, }; }, computed: { optionLeft() { return { direction: 2, // 滚动方向 step: 0.5, // 数值越大速度滚动越快 limitMoveNum: 5, // 开启无缝滚动的数据量 设置(数值<=页面展示数据条数不滚)(超过页面展示条数滚动) openWatch: true, // 开启数据实时监控刷新dom waitTime: 2500, // 单行停顿时间(singleHeight,waitTime) }; }, optionTop() { return { direction: 1, // 滚动方向 step: 0.5, // 数值越大速度滚动越快 limitMoveNum: 4, // 开启无缝滚动的数据量 设置(数值<=页面展示数据条数不滚)(超过页面展示条数滚动) openWatch: true, // 开启数据实时监控刷新dom waitTime: 2500, // 单行停顿时间(singleHeight,waitTime) }; }, ...mapState(["homeInfo", "datumList", "matterList"]), }, created() { // this.getHomeInfo(); }, filters: { filterCount(val) { if (val >= 1000 && val < 10000) { let num = val / 1000; return num.toFixed(2) + "kg"; } else if (val >= 10000 && val < 999000) { let num = val / 10000; return num.toFixed(1) + "万kg"; } else if (val >= 999000) { return `999+万kg`; } else { return val + "g"; } }, }, methods: { // 获取首页数据展示 // async getHomeInfo() { // let res = await getHomeInfo({}); // let { data, code } = res.data; // if (code === 1) { // data.hotWords = data.hotWords.map((v) => v.hotwords); // this.homeInfo = data; // this.matterList = data.matterList; // this.datumList = data.datumList; // } // }, checkTopImg(index) { if (index === 0) { return this.top1; } else if (index === 1) { return this.top2; } else if (index === 2) { return this.top3; } }, changeRanking(val) { this.rankingActive = val; }, handleSearch() { this.$router.push({ path: "/searchpage", query: { val: this.search, }, }); }, // 点击热门词汇 handleClick(e) { if (e.target.className === "hot-search-item") { this.search = e.target.dataset.value; this.$router.push({ path: "/searchpage", query: { val: this.search, }, }); } }, handleClose() { this.search = ""; }, // 查看材料列表 checkMatter(row) { this.matterInfo = row; this.visible = true; }, // 查看材料 checkMaterial(index, row) { this.$router.push({ path: "/showmaterials", query: { matterId: row.matterId, index, }, }); }, }, }; </script> <style lang="less" scoped> @keyframes energy { 0% { transform: translateY(0px); } 25% { transform: translateY(-10px); } 50% { transform: translateY(0px); } 75% { transform: translateY(10px); } 100% { transform: translateY(0px); } } @keyframes shadow { 0% { opacity: 1; left: -200px; } 10% { opacity: 0; left: 400px; } 100% { opacity: 0; left: 400px; } } @keyframes ring { 0% { transform: translateY(0px); } 10% { transform: translateY(-30px); } 60%, 100% { transform: translateY(0px); } } .home { width: 100%; height: auto; padding-top: 40px; background-size: 100% 100%; } .header { width: 100%; padding: 0px 40px; margin-bottom: 100px; } .left { .title { font-weight: 400; font-size: 61px; color: var(--main-h1-color); } } .right { .tips-name { font-size: 18px; color: var(--main-h1-color); } .count { color: #317054; font-size: 16px; display: flex; align-items: center; justify-content: center; background: url("../../assets/img/pic_png_nengliang.png") no-repeat; background-size: 100% 100%; } .count1 { width: 60px; height: 60px; animation: energy linear 6000ms infinite; } .count2 { width: 70px; height: 70px; animation: energy linear 6500ms infinite; } } .search-box { box-shadow: 0px 7px 13px 0px rgba(0, 0, 0, 0.1); position: relative; } .hot-search-box { width: 100%; color: #fff; .hot-title { width: 140px; height: 40px; border-radius: 4px; font-size: 22px; background-color: rgba(255, 255, 255, 0.1); } .seamless-warp2 { width: 750px; overflow: hidden; } .hot-search-item { width: 150px; height: 24px; font-size: 22px; text-align: center; cursor: pointer; } .line { display: inline-block; margin: 0px 10px; width: 1px; height: 24px; background-color: #fff; } } :deep(.el-input__suffix) { display: flex; align-items: center; justify-content: center; position: absolute; right: 200px; } .el-icon-circle-close { font-size: 30px; } .search-btn { width: 167px; height: 62px; background: linear-gradient( 90deg, var(--main-theme-color), var(--main-assist-color) ); border-radius: 8px; color: #ffffff; font-size: 24px; border: none; position: absolute; right: 5px; top: 5px; } :deep(.el-input__inner) { width: 895px; height: 72px; padding-right: 240px; font-size: 24px; border-radius: 8px; color: #333; } .main { margin-top: 40px; .ranking { width: 700px; height: 495px; background: linear-gradient(180deg, #fdefed, #fffdf8); box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.1); border-radius: 16px; border: 3px solid #ffffff; position: relative; .empty-text { font-size: 18px; color: #999; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } .tab-box { width: 340px; height: 50px; padding: 3px; margin-top: 10px; background: #efe6e6; border-radius: 8px; .tab-item { width: 50%; height: 100%; border-radius: 8px; text-align: center; font-size: 22px; color: #333; cursor: pointer; } .active { background-color: #fff; } } .ranking-list { padding: 0px 14px; .ranking-item { height: 56px; margin-bottom: 10px; line-height: 56px; border-radius: 8px; font-size: 22px; color: var(--main-theme-color); letter-spacing: 2px; &:nth-child(2n-1) { background-color: #fff; } .item-index { width: 50px; } } } } .right { width: 530px; height: 495px; .fill-btn { width: 530px; height: 170px; background-size: 100% 100%; font-size: 50px; font-weight: 500; color: #ffffff; border: 3px solid #ffffff; border-radius: 16px; box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.1); position: relative; overflow: hidden; // &::before { // content: ""; // position: absolute; // width: 200px; // height: 300%; // left: -200px; // transform: rotateZ(-45deg); // background: linear-gradient( // to right, // transparent 1%, // rgba(255, 255, 255, 0.2) 30%, // rgba(255, 255, 255, 0.5) 60%, // transparent 100% // ); // animation: shadow 6s infinite; // } // .fill-btn-text1 { // animation: ring 6s 20ms infinite; // } // .fill-btn-text2 { // animation: ring 6s 60ms infinite; // } // .fill-btn-text3 { // animation: ring 6s 105ms infinite; // } // .fill-btn-text4 { // animation: ring 6s 145ms infinite; // } } .empty-btn { width: 284px; height: 212px; background: url("../../assets/img/btn_kongbai.png") no-repeat; font-size: 36px; font-weight: 500; color: #ffffff; } .right-bottom { width: 530px; height: 304px; background: #fff; border: 3px solid #ffffff; border-radius: 16px; box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.1); position: relative; .empty-text { font-size: 18px; color: #999; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } .hot-matter-list { height: 130px; padding: 0px 14px; .seamless-warp { height: 100%; overflow: hidden; } .hot-matter-item { height: 45px; margin-bottom: 4px; line-height: 45px; border-radius: 8px; font-size: 20px; color: var(--main-theme-color); letter-spacing: 2px; &:nth-child(2n) { background-color: #f6f9fe; } .item-index { width: 50px; } } } } } } .footer { width: 80%; margin-top: 44px; height: 66px; .data-item { height: inherit; } .data-name { font-size: 22px; font-family: Source Han Sans CN; color: var(--main-sjbt-color); } .count-box { margin: 0px; padding: 0px; font-size: 24px; color: var(--main-theme-color); .data-count { font-size: 38px; font-family: Source Han Sans CN; color: var(--main-theme-color); } } .line { width: 1px; height: inherit; background-image: linear-gradient( to bottom, #ccc, var(--main-theme-color) 35%, var(--main-theme-color) 75%, #ccc 100% ); } } </style>