From 49a435043b0b1a289a24606e35253365d7ab3956 Mon Sep 17 00:00:00 2001 From: QYF-GitLab1 <1940665526@qq.com> Date: 星期一, 25 八月 2025 17:51:57 +0800 Subject: [PATCH] 首页、及教学出版样式修改 --- src/views/home/index.vue | 651 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 646 insertions(+), 5 deletions(-) diff --git a/src/views/home/index.vue b/src/views/home/index.vue index 4221005..d5dddec 100644 --- a/src/views/home/index.vue +++ b/src/views/home/index.vue @@ -1,16 +1,362 @@ <template> <div class="homePage"> - <el-carousel :height="screenheight"> - <el-carousel-item v-for="item in 4" :key="item"> - <h3 class="small justify-center" text="2xl">{{ item }}</h3> + <el-carousel :height="'615px'"> + <el-carousel-item v-for="(item, index) in banner" :key="index"> + <div class="bannerBox"> + <img id="autoHeight" class="bannerImg" :src="item.icon" @click="bannerLink(item)" /> + </div> </el-carousel-item> </el-carousel> + <div v-if="informationList.length > 0" class="contentBox" style="margin-top: 50px"> + <div class="informationBox"> + <div class="bookListTitle"> + <div class="title">鏂伴椈璧勮</div> + <div class="more" @click="toMore">鏇村></div> + </div> + <div class="informationList"> + <div class="informationItem" v-for="(item, index) in informationList" :key="index"> + <div class="imgBox"><img class="autoImg" :src="item.icon" alt="" /></div> + <div class="informationContent"> + <div class="informationTitle" :alt="item.name">{{ item.name }}</div> + <div class="informationDate">{{ moment(item.publishDate).format('YYYY-MM-DD') }}</div> + <div class="informationText">{{ item.description }}</div> + </div> + </div> + </div> + </div> + </div> + <div class="bookListBox"> + <div class="contentBox"> + <div class="bookListTitle"> + <div class="titleBox"> + <span class="titleTextBg">鎺ㄨ崘</span> + <span>鏁欐潗</span> + </div> + <div class="more" @click="toMore">鏇村></div> + </div> + <div class="recommendList"> + <div class="recommendItem" v-for="item in bookListData" :key="item.id" @click="toDetail(item)"> + <div class="recommendItemImg"> + <img class="autoImg" :src="item.icon" /> + </div> + <div class="infoBox"> + <div class="bookName">{{ item.name }}</div> + <div class="author"> + {{ item.author ? item.author : '-' }} 钁� + </div> + <div class="priceBox"> + <span class="price" v-if="item.price && item.price > 0"> + <span> 楼{{ item.price }}</span> + </span> + <span class="oldPrice" v-if="item.oldPrice > 0"> 楼{{ item.oldPrice }}</span> + </div> + </div> + </div> + </div> + </div> + </div> + <div class="contentBox"> + <div class="funBox"> + <div class="authentication"> + <div class="cardNav" @click="toAuthentication(true)"> + <img id="rightImg" src="@/assets/images/xiehe/home/jxfw.png" alt=""> + <div class="cardTitle">鏁欏笀璁よ瘉</div> + <div class="cardText"> + 瀛︽牎浠昏鑰佸笀涓婁紶鏁欏笀璇佹槑鏂囦欢锛岄�氳繃璁よ瘉鍚庯紝鍙繘琛屾暟瀛楁暀鏉愯瘯鐢ㄧ敵璇峰強寮�璇惧紑鐝� + </div> + </div> + </div> + <div class="manual"> + <div class="cardNav" @click="toAuthentication(false)"> + <img id="rightImg" src="@/assets/images/xiehe/home/jxfw.png" alt=""> + <div class="cardTitle">鎿嶄綔鎵嬪唽</div> + <div class="cardText">蹇�熶簡瑙d娇鐢ㄦ楠わ紝杞绘澗寮�鍚暀瀛︽敮鎸佷箣鏃�</div> + </div> + </div> + </div> + + <div class="bookListTitle"> + <div class="title" style="display: flex; line-height: 50px"> + <div class="titleBox"> + <span class="titleTextBg">鏁欏</span> + <span>瀵艰埅</span> + </div> + <div class="titleTabs" v-if="classfeild.length > 0"> + <el-tabs v-model="activeName" @tab-change="handleClick"> + <el-tab-pane v-for="item in classfeild" :key="item.value" :label="item.name" :name="item.value" /> + </el-tabs> + </div> + <div class="more" style="margin-left: 30px; font-weight: normal" @click="toMore"> + 鏇村> + </div> + </div> + </div> + <div class="recommendList"> + <div class="recommendItem" v-for="item in navBookList" :key="item.id" @click="toDetail(item)"> + <div class="recommendItemImg"> + <img class="autoImg" :src="item.icon" /> + </div> + <div class="infoBox"> + <div class="bookName">{{ item.name }}</div> + <div class="author"> + {{ item.author ? item.author : '-' }} 钁� + </div> + <div class="priceBox"> + <span class="price" v-if="item.price && item.price > 0"> + <span>楼{{ item.price }}</span> + </span> + <span class="oldPrice" v-if="item.oldPrice > 0">楼{{ item.oldPrice }}</span> + </div> + </div> + </div> + </div> + </div> + <teacherCertification :isShow="teacherDialog" @dialog-Change="dialogChange" /> </div> </template> <script setup> -import { ref } from 'vue' -let screenheight = ref(document.documentElement.clientHeight / 4) +import moment from 'moment' +import { ElMessage } from 'element-plus' +import teacherCertification from '@/views/personalCenter/teacherCertification.vue' +import { ref, onBeforeMount, inject, reactive, onMounted, watch } from 'vue' +let screenheight = ref(document.documentElement.clientHeight / 2) +import { useRouter, useRoute } from 'vue-router' +const router = useRouter() +const route = useRoute() + +const MG = inject('MG') +const config = inject('config') +const logIn = inject('logIn') +const tool = inject('tool') +const toolClass = inject('toolClass') +const banner = reactive([]) +const informationList = reactive([]) +let classfeild = ref([]) +let activeName = ref('A1') +let callbackLink = ref(null) + +let bookListData = ref([]) +let navBookList = ref([]) +let teacherDialog = ref(false) +onBeforeMount(() => { + console.log(document.documentElement.clientWidth / 2.628) + window.onresize = () => { + let c = 2.628 + if (document.documentElement.clientWidth >= 1220) { + screenheight.value = document.documentElement.clientWidth / c + console.log(document.documentElement.clientWidth / c) + } + } +}) + +// 鑾峰彇url鍙傛暟 +const getUrlParams = () => { + let url = window.location.href + let params = url.split('?')[1] + let paramsObj = {} + if (params) { + paramsObj = params.split('&').reduce((pre, cur) => { + pre[cur.split('=')[0]] = cur.split('=')[1] + return pre + }, {}) + } + return paramsObj +} + +onMounted(() => { + // 鐩戝惉鏄惁鏉ヨ嚜鏁板瓧闃呰 + const params = getUrlParams() + if (params.login) { + localStorage.setItem('loginBack', decodeURIComponent(params.callBackUrl)) + logIn() + } + getBanner() + classifList() + getInformationList() + getBookList() + getNavBookList() +}) + +watch( + () => route, // 鐩戝惉 path 鍙樺寲 + (newPath, oldPath) => { + console.log('璺敱璺緞浠�', oldPath, '鍙樹负', newPath) + }, +) + +const toMore = () => { + router.push({ + path: '/bookStore', + }) +} + +const toDetail = (item) => { + router.push({ + path: '/bookdetail', + query: { + bookId: item.id, + }, + }) +} + +const handleClick = (tab, event) => { + console.log(tab) + + activeName.value = tab + getNavBookList() +} + +const classifList = () => { + const query = { + refCodes: ['digitalTextbooks'], + } + MG.resource.getCmsTypeByRefCode(query).then((res) => { + const types = toolClass.handleTypeList(res) + const typeData = types[0].cmsTypeLinks[0].children + const temp_classfeild = typeData.find((item) => item.typeField.refCode === 'teachingLevel') + ?.typeField.cfg.option + + const noCheck = temp_classfeild.map((item) => { + return { + name: item.name, + value: item.value, + } + }) + + classfeild.value = noCheck + }) +} + +const getNavBookList = () => { + MG.store + .getProductList({ + path: '*', + queryType: '*', + storeInfo: 'defaultGoodsStore1', + paging: { + start: 0, + size: 5, + }, + fields: { + 'teachingLevel=': activeName.value, + author: [], + }, + }) + .then((res) => { + navBookList.value = res.datas?.map(item => { + return { + ...item, + price: toolClass.toDecimal2(item.price), + oldPrice: toolClass.toDecimal2(item.oldPrice), + } + }) + }) +} + +const dialogChange = (val) => { + getTeacherInfo() + if (val == false) { + teacherDialog.value = false + } else { + teacherDialog.value = true + } +} + +//鏁欏笀淇℃伅 +function getTeacherInfo() { + const data = { + start: 0, + size: 10, + topicIdOrRefCode: 'teacherRoleApproval', + appRefCode: config.appRefCode, + sort: { + type: 'Desc', + field: 'CreateDate', + }, + } + MG.ugc.getTopicMessageList(data).then((res) => { + try { + const resData = res.datas.find((i) => i.appUserCreator.userId == userId.value) + if (resData) { + teacherState.value = resData.state + if (resData.feedBack != null) { + reasonTxt.value = JSON.parse(resData.feedBack).reason + } + } else { + teacherState.value = '' + } + loading.value = false + } catch (error) { + loading.value = false + } + }) +} + +const toAuthentication = (type) => { + if (type) { + if (localStorage.getItem(config.tokenKey)) { + teacherDialog.value = true + } else { + logIn() + } + } else { + ElMessage({ + message: '寤鸿涓�...', + type: 'warning', + }) + } +} + +const getBookList = () => { + MG.store + .getProductList({ + path: 'recommendedTextbooks', + paging: { + start: 0, + size: 5, + }, + fields: { + author: [], + isbn: [] + }, + }) + .then((res) => { + bookListData.value = res.datas?.map(item => { + return { + ...item, + price: toolClass.toDecimal2(item.price), + oldPrice: toolClass.toDecimal2(item.oldPrice), + } + }) + }) +} + +const getInformationList = () => { + MG.resource + .getItem({ + path: 'information', + fields: { publishDate: [], content: [] }, + paging: { start: 0, size: 9 }, + }) + .then((res) => { + informationList.push(...res.datas) + console.log(res.datas) + }) +} + +const getBanner = () => { + MG.resource + .getItem({ + path: 'banner\\homeBanner', + fields: { link: [] }, + paging: { start: 0, size: 9 }, + }) + .then((res) => { + banner.push(...res.datas) + console.log(res.datas) + }) +} </script> <style lang="less" scoped> @@ -18,7 +364,35 @@ min-width: 1220px; min-height: calc(100vh - 61.8%); background-color: #fff; + padding-bottom: 100px; + + .titleBox { + min-width: 127px; + font-family: JDLangZhengTi, JDLangZhengTi; + font-weight: 400; + font-size: 24px; + color: #000; + line-height: 24px; + text-align: left; + white-space: nowrap; + + .titleTextBg { + padding: 2px 5px; + box-sizing: border-box; + background-image: url('@/assets/images/xiehe/home/Text_bg2@.png'); + background-size: 100% 100%; + background-repeat: no-repeat; + background-position: center; + color: #fff; + } + } + + .bannerBox { + width: 100%; + height: 100%; + } } + .el-carousel__item h3 { color: #475669; opacity: 0.75; @@ -34,4 +408,271 @@ .el-carousel__item:nth-child(2n + 1) { background-color: #d3dce6; } + +.informationList { + display: flex; + flex-wrap: wrap; + + .informationItem { + display: flex; + width: 42%; + min-height: 100px; + margin-right: 5%; + margin-bottom: 20px; + border: 1px solid #ebebeb; + border-radius: 10px; + padding: 10px; + cursor: pointer; + + .imgBox { + width: 30%; + height: 100%; + position: relative; + } + + .informationContent { + width: 70%; + padding-left: 10px; + + .informationTitle { + font-size: 14px; + width: 100%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + color: #333333; + font-weight: bold; + margin-bottom: 10px; + } + + .informationDate { + margin-top: 10px; + } + + .informationText { + color: #666666; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + margin-top: 10px; + display: -webkit-box; + /* 灏嗗璞′綔涓哄脊鎬т几缂╃洅瀛愭ā鍨嬫樉绀� */ + -webkit-line-clamp: 3; + /* 鏄剧ず鐨勮鏁� */ + -webkit-box-orient: vertical; + /* 璁剧疆鎴栨绱几缂╃洅瀵硅薄鐨勫瓙鍏冪礌鐨勬帓鍒楁柟寮� */ + overflow: hidden; + /* 婧㈠嚭闅愯棌 */ + } + } + } + + // .informationItem:hover { + // border: 1px solid #019e58; + // } +} + +.bookListBox { + width: 100%; + padding: 80px 0; + background-repeat: no-repeat; + background-size: 100% 100%; + background-image: url('@/assets/images/tuijian-bg.png'); + background-repeat: no-repeat; + background-size: 100% 100%; +} + +.recommendList { + display: flex; + padding-top: 20px; + + .recommendItem { + flex: 1; + margin-right: 20px; + width: 261px; + height: 389px; + background-repeat: no-repeat; + background-size: 100% 100%; + cursor: pointer; + border: 1px solid #dedede; + background-color: #fff; + padding-top: 10px; + background: rgba(255, 255, 255, 0.73); + border-radius: 8px 8px 8px 8px; + border: 1px solid #DEDEDE; + box-sizing: border-box; + padding: 30px 0; + box-sizing: border-box; + + &:last-child { + margin-right: 0; + } + } + + .recommendItem:hover { + background-image: url(@/assets/images/Mouse_fill.png); + background-position: center; + background-size: 100% 100%; + background-repeat: no-repeat; + } +} + +.recommendItemImg { + width: 156px; + height: 210px; + position: relative; + margin: 0 auto; +} + +.infoBox { + text-align: center; + padding: 20px 0; + box-sizing: border-box; + font-family: Microsoft YaHei UI, Microsoft YaHei UI; + box-sizing: border-box; +} + +.bookName { + font-weight: bold; + font-size: 18px; + color: #000000; + font-weight: 700; +} + +.author { + font-weight: 400; + font-size: 16px; + color: #333333; + padding: 15px 0; + box-sizing: border-box; +} + +.priceBox { + font-family: DIN, DIN; + font-weight: 500; + font-size: 18px; + color: #D91523; + padding: 15px 0; + box-sizing: border-box; + + .oldPrice { + color: #999999; + text-decoration: line-through; + margin-left: 20px; + } + + .price { + span { + font-weight: bold; + color: #d91523; + } + } +} + +.funBox { + display: flex; + justify-content: space-between; + align-items: center; + margin-top: 60px; + margin-bottom: 60px; + + .authentication { + width: 650px; + height: 123px; + background-repeat: no-repeat; + background-size: 100% 100%; + background-image: url('@/assets/images/xiehe/home/jiaoshirenzheng.png'); + } + + .manual { + width: 650px; + height: 123px; + background-repeat: no-repeat; + background-size: 100% 100%; + background-image: url('@/assets/images/xiehe/home/caozuoshouce.png'); + } +} + +.titleTabs { + margin-left: 30px; + width: 85%; +} + +.bookListTitle { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 20px; + border-bottom: 1px solid #ebebeb; + + + .title { + font-size: 20px; + color: #333333; + font-weight: bold; + } + + .more { + font-size: 14px; + color: #999999; + cursor: pointer; + font-weight: 500; + min-width: 60px; + text-align: center; + } +} + +.cardNav { + margin-left: 150px; + margin-top: 20px; + padding-right: 20px; + cursor: pointer; + position: relative; + + #rightImg { + position: absolute; + right: 48px; + top: 26px; + height: 30px; + } + + .cardTitle { + font-family: JDLangZhengTi, JDLangZhengTi; + font-weight: 400; + font-size: 32px; + color: #FFFFFF; + margin-bottom: 5px; + font-weight: 500; + } + + .cardText { + width: 351px; + font-family: PingFang SC, PingFang SC; + font-weight: 400; + font-size: 14px; + color: #FFFFFF; + line-height: 25px; + } + + +} + +::v-deep(.el-tabs__item) { + height: 50px; + line-height: 22px; + text-align: center; + padding: 15px 0; + box-sizing: border-box; + margin: 0 10px; +} + + +::v-deep(.el-tabs__header) { + padding: 0; + position: relative; + margin: 0 0 0 0px; + display: flex; + align-items: center; + justify-content: space-between +} </style> -- Gitblit v1.9.1