Bladeren bron

Merge branch 'dev' into chen

chenxiong 3 jaren geleden
bovenliggende
commit
a7262a9bf5
6 gewijzigde bestanden met toevoegingen van 469 en 214 verwijderingen
  1. 10 4
      src/App.vue
  2. 149 108
      src/apis/common.js
  3. 22 7
      src/components/footer/index.vue
  4. 31 6
      src/components/header/index.vue
  5. 181 52
      src/pages/home/index.vue
  6. 76 37
      src/store/index.js

+ 10 - 4
src/App.vue

@@ -1,17 +1,23 @@
 <template>
   <div id="app">
-    <router-view/>
+    <router-view />
   </div>
 </template>
 
 <script>
 export default {
-  name: 'App'
-}
+  name: "App",
+  created() {
+    /**
+     *
+     * 获取首页配置
+     */
+    this.$store.dispatch("getCommonBaseHomeList");
+  },
+};
 </script>
 
 <style>
 #app {
-  
 }
 </style>

+ 149 - 108
src/apis/common.js

@@ -1,5 +1,33 @@
 import request from '@/axios'
 export default {
+  /**
+   * 
+   * @param {*} data 
+   * @returns 
+   * 首页配置列表
+   */
+  getCommonBaseHomeList(data) {
+    return request({
+      url: '/app/common/base/home/list',
+      method: 'get',
+      params: data,
+      noToken: true
+    })
+  },
+  /**
+   * 
+   * @param {*} data 
+   * @returns 
+   * 广告位
+   */
+  advertisinghomeLocationList(data) {
+    return request({
+      url: '/app/common/base/advertising/adLocation',
+      method: 'get',
+      params: data,
+      noToken: true
+    })
+  },
   /**
    * 
    * @param {*} data 
@@ -8,13 +36,26 @@ export default {
    */
   advertisingList(data) {
     return request({
-			url: '/app/common/base/advertising/list',
-			method: 'get',
-			params: data,
-			noToken: true
-		})
+      url: '/app/common/base/advertising/list',
+      method: 'get',
+      params: data,
+      noToken: true
+    })
+  },
+  /**
+   * 
+   * @param {*} data 
+   * @returns 
+   * 查询商品推荐列表
+   */
+  appCommonActivityRecommendList(data) {
+    return request({
+      url: '/app/common/activity/recommend/list',
+      method: 'get',
+      params: data,
+      noToken: true
+    })
   },
-
   /**
    * 
    * @param {*} data 
@@ -22,13 +63,13 @@ export default {
    * 获取课程教育类型
    */
   educationTypeList(data) {
-		return request({
-			url: '/app/common/course/educationType/list',
-			method: 'get',
-			params: data,
-			noToken: true
-		})
-	},
+    return request({
+      url: '/app/common/course/educationType/list',
+      method: 'get',
+      params: data,
+      noToken: true
+    })
+  },
 
   /**
    * 
@@ -37,13 +78,13 @@ export default {
    * 根据教育类型获取业务层级
    */
   businessList(data) {
-		return request({
-			url: '/app/common/course/business/list',
-			method: 'get',
-			params: data,
-			noToken: true
-		})
-	},
+    return request({
+      url: '/app/common/course/business/list',
+      method: 'get',
+      params: data,
+      noToken: true
+    })
+  },
 
   /**
    * 
@@ -51,14 +92,14 @@ export default {
    * @returns 
    * 根据业务层级获取科目分类
    */
-	subjectList(data) {
-		return request({
-			url: '/app/common/course/subject/list',
-			method: 'get',
-			params: data,
-			noToken: true
-		})
-	},
+  subjectList(data) {
+    return request({
+      url: '/app/common/course/subject/list',
+      method: 'get',
+      params: data,
+      noToken: true
+    })
+  },
 
   /**
    * 
@@ -68,13 +109,13 @@ export default {
    * 根据科目分类获取商品列表
    */
   goodsList(data) {
-		return request({
-			url: '/app/common/goods/list',
-			method: 'get',
-			params: data,
-			noToken: true
-		})
-	},
+    return request({
+      url: '/app/common/goods/list',
+      method: 'get',
+      params: data,
+      noToken: true
+    })
+  },
 
   /**
    * 
@@ -83,12 +124,12 @@ export default {
    * 获取商品详情 
    */
   commonGoodsDetail(data) {
-		return request({
-			url: '/app/common/goods/'+ data,
-			method: 'get',
-			noToken: true
-		})
-	},
+    return request({
+      url: '/app/common/goods/' + data,
+      method: 'get',
+      noToken: true
+    })
+  },
 
   /**
    * 
@@ -97,12 +138,12 @@ export default {
    * 获取商品课程列表
    */
   goodsCourseList(data) {
-		return request({
-			url: '/app/common/goods/course/list/'+ data,
-			method: 'get',
-			noToken: true
-		})
-	},
+    return request({
+      url: '/app/common/goods/course/list/' + data,
+      method: 'get',
+      noToken: true
+    })
+  },
 
   /**
    * 
@@ -111,13 +152,13 @@ export default {
    * 获取商品题库列表
    */
   goodsBankList(data) {
-		return request({
-			url: '/app/common/bank/list',
-			method: 'get',
-			params:data,
-			noToken: true
-		})
-	},
+    return request({
+      url: '/app/common/bank/list',
+      method: 'get',
+      params: data,
+      noToken: true
+    })
+  },
 
   /**
    * 
@@ -126,13 +167,13 @@ export default {
    * 查询题库章卷列表
    */
   goodsChapterList(data) {
-		return request({
-			url: '/app/common/bank/chapter/list',
-			method: 'get',
-			params:data,
-			noToken: true
-		})
-	},
+    return request({
+      url: '/app/common/bank/chapter/list',
+      method: 'get',
+      params: data,
+      noToken: true
+    })
+  },
 
   /**
    * 
@@ -141,13 +182,13 @@ export default {
    * 查询题库试卷列表
    */
   goodsExamList(data) {
-		return request({
-			url: '/app/common/bank/exam/list',
-			method: 'get',
-			params:data,
-			noToken: true
-		})
-	},
+    return request({
+      url: '/app/common/bank/exam/list',
+      method: 'get',
+      params: data,
+      noToken: true
+    })
+  },
 
   /**
    * 
@@ -156,13 +197,13 @@ export default {
    * 获取试做题目列表
    */
   goodsQuestionList(data) {
-		return request({
-			url: '/app/common/bank/question/list',
-			method: 'get',
-			params:data,
-			noToken: true
-		})
-	},
+    return request({
+      url: '/app/common/bank/question/list',
+      method: 'get',
+      params: data,
+      noToken: true
+    })
+  },
 
   /**
    * 
@@ -170,13 +211,13 @@ export default {
    * @returns 
    * 获取商品模块列表
    */
-	goodsCourseList(data) {
-		return request({
-			url: '/app/common/goods/course/list/'+ data,
-			method: 'get',
-			noToken: true
-		})
-	},
+  goodsCourseList(data) {
+    return request({
+      url: '/app/common/goods/course/list/' + data,
+      method: 'get',
+      noToken: true
+    })
+  },
 
   /**
    * 
@@ -184,14 +225,14 @@ export default {
    * @returns 
    * 获取未购买商品模块菜单列表
    */
-	menuList(data) {
-		return request({
-			url: '/app/common/course/menuList',
-			method: 'get',
-			params: data,
-			noToken: true
-		})
-	},
+  menuList(data) {
+    return request({
+      url: '/app/common/course/menuList',
+      method: 'get',
+      params: data,
+      noToken: true
+    })
+  },
 
   /**
    * 
@@ -200,12 +241,12 @@ export default {
    * 获取未购买商品节列表
    */
   sectionList(data) {
-		return request({
-			url: '/app/common/course/sectionList/'+data,
-			method: 'get',
-			noToken: true
-		})
-	},
+    return request({
+      url: '/app/common/course/sectionList/' + data,
+      method: 'get',
+      noToken: true
+    })
+  },
 
   /**
    * 
@@ -214,19 +255,19 @@ export default {
    * 获取未购买商品章列表
    */
   chapterList(data) {
-		return request({
-			url: '/app/common/course/chapterList/'+data,
-			method: 'get',
-			noToken: true
-		})
-	},
+    return request({
+      url: '/app/common/course/chapterList/' + data,
+      method: 'get',
+      noToken: true
+    })
+  },
 
   courseBusiness(data) {
-		return request({
-			url: '/app/common/course/business/'+data,
-			method: 'get',
-      noToken:true
-		})
-	},
+    return request({
+      url: '/app/common/course/business/' + data,
+      method: 'get',
+      noToken: true
+    })
+  },
 
 }

+ 22 - 7
src/components/footer/index.vue

@@ -4,17 +4,17 @@
       <div class="footer__header">
         <div class="title">友情链接:</div>
         <div class="links">
-          <a v-for="(item, index) in 10" :key="index">中国住房和城乡建设部</a>
+          <a
+            v-for="(item, index) in showList(links)"
+            :key="index"
+            :href="item.url ? item.url : 'javascript:;'"
+            >{{ item.name }}</a
+          >
         </div>
       </div>
 
       <div class="footer__body">
-        <p>学校电话:020-87085982 ; 020-87085983;13631379636</p>
-        <p>学校地址:广州市天河区燕岭路建设大厦3楼</p>
-        <p>客服邮箱:2790002970@qq.com</p>
-        <p>服务投诉电话:15361790888</p>
-        <p>技术电话:18664525945</p>
-        <p>服务 QQ:976671708</p>
+        <p v-for="(item, index) in footer" :key="index">{{ item.name }}</p>
       </div>
 
       <div class="footer__footer">
@@ -29,11 +29,26 @@
 </template>
 
 <script>
+import { mapGetters } from "vuex";
 export default {
   name: "Footer",
   data() {
     return {};
   },
+  computed: {
+    ...mapGetters(["footer", "links"]),
+    showList: function () {
+      return function (list) {
+        let showList = [];
+        if (list) {
+          showList = list.filter((item) => {
+            return item.status == 1;
+          });
+        }
+        return showList;
+      };
+    },
+  },
 };
 </script>
 

+ 31 - 6
src/components/header/index.vue

@@ -1,17 +1,27 @@
 <template>
   <header class="header">
     <div class="container clearfix">
-      <h1 class="logo" @click="go('/')"></h1>
+      <img
+        style="cursor: pointer; width: 162px; height: 33px"
+        v-if="header.companyLogo"
+        :src="$tools.splitImgHost(header.companyLogo)"
+        alt=""
+        @click="go('/')"
+      />
+      <h1 class="logo" v-else @click="go('/')"></h1>
       <nav class="nav">
         <ul class="list">
-          <li><a @click="go('/index')">首页</a></li>
-          <li>
-            <a target="view_window" href="https://www.xyyxt.net/abount"
+          <li v-for="(item, index) in showNav(header.Nav)" :key="index">
+            <a v-if="item.name == '首页'" @click="go('/index')">首页</a>
+            <a
+              v-if="item.name == '走进祥粤'"
+              target="view_window"
+              href="https://www.xyyxt.net/abount"
               >走进祥粤</a
             >
+            <a v-if="item.name == '课程'" @click="go('/course-list')">课程</a>
+            <a v-if="item.name == '题库'" @click="go('/bank-list')">题库</a>
           </li>
-          <li><a @click="go('/course-list')">课程</a></li>
-          <li><a @click="go('/bank-list')">题库</a></li>
         </ul>
       </nav>
       <div class="search">
@@ -42,11 +52,26 @@
 </template>
 
 <script>
+import { mapGetters } from "vuex";
 export default {
   name: "Header",
   data() {
     return {};
   },
+  computed: {
+    ...mapGetters(["header"]),
+    showNav: function () {
+      return function (list) {
+        var newList = [];
+        if (list) {
+          newList = list.filter((item) => {
+            return item.status === 1;
+          });
+        }
+        return newList;
+      };
+    },
+  },
   methods: {
     go(path) {
       this.$router.push({

+ 181 - 52
src/pages/home/index.vue

@@ -21,7 +21,12 @@
       <div class="header__body">
         <div class="container clearfix">
           <a class="logo">
-            <h1></h1>
+            <img
+              v-if="header.companyLogo"
+              :src="$tools.splitImgHost(header.companyLogo)"
+              alt=""
+            />
+            <h1 v-else></h1>
           </a>
           <div class="search">
             <div class="search__select">
@@ -35,9 +40,11 @@
             </div>
             <div class="search__btn">搜索</div>
           </div>
-          <div class="contact">
-            <div class="contact__phone">020-87085982</div>
-            <div class="contact__time">周一至周日 8:00-22:30</div>
+          <div class="contact" v-if="header.serviceTel.status == 1">
+            <div class="contact__phone">{{ header.serviceTel.tel }}</div>
+            <div class="contact__time">
+              周一至周日 {{ header.serviceTel.time }}
+            </div>
           </div>
         </div>
       </div>
@@ -46,15 +53,33 @@
     <section class="section">
       <div class="container">
         <div class="tabs">
-          <a class="tab active">首页</a>
-          <a
-            class="tab"
-            target="view_window"
-            href="https://www.xyyxt.net/abount"
-            >走进祥粤</a
-          >
-          <a class="tab" @click="go('/course-list')">课程</a>
-          <a class="tab" @click="go('/bank-list')">题库</a>
+          <template v-for="(item, index) in showNav(header.Nav)">
+            <a v-if="item.name === '首页'" :key="index" class="tab active"
+              >首页</a
+            >
+            <a
+              v-if="item.name === '走进祥粤'"
+              :key="index"
+              class="tab"
+              target="view_window"
+              href="https://www.xyyxt.net/abount"
+              >走进祥粤</a
+            >
+            <a
+              v-if="item.name === '课程'"
+              :key="index"
+              class="tab"
+              @click="go('/course-list')"
+              >课程</a
+            >
+            <a
+              v-if="item.name === '题库'"
+              :key="index"
+              class="tab"
+              @click="go('/bank-list')"
+              >题库</a
+            >
+          </template>
         </div>
       </div>
       <div class="swiper-wrap" :style="{ background: color }">
@@ -224,25 +249,38 @@
         <div class="course__header">
           <div class="title">推荐课程</div>
           <div class="tabs">
-            <div class="tab active">二级建造师</div>
-            <div class="tab">七大员新考</div>
-            <div class="tab">一级建造师</div>
+            <div
+              v-for="(item, index) in goodsList1"
+              :key="index"
+              class="tab"
+              :class="active1 === index ? 'active' : ''"
+              @click="active1 = index"
+            >
+              {{ item.projectName + " - " + item.businessName }}
+            </div>
           </div>
         </div>
         <div class="course__body">
           <ul class="list clearfix">
-            <li class="course-item" v-for="(item, index) in 8" :key="index">
-              <div class="course-item__img">
-                <div class="note">2022</div>
-              </div>
-              <div class="course-item__title">
-                2022年二建建设工程法规及相关知识(黄金基础班)
-              </div>
-              <div class="course-item__desc">
-                <div class="price">¥100</div>
-                <a class="add">加购物车</a>
-              </div>
-            </li>
+            <template v-for="(item, index) in goodsList1[active1].goodsList">
+              <li class="course-item" v-if="index < 8" :key="index">
+                <div class="course-item__img">
+                  <div class="note" v-if="item.year">{{ item.year }}</div>
+                  <img
+                    v-if="item.coverUrl"
+                    :src="$tools.splitImgHost(item.coverUrl)"
+                    alt=""
+                  />
+                </div>
+                <div class="course-item__title">
+                  {{ item.goodsName }}
+                </div>
+                <div class="course-item__desc">
+                  <div class="price">¥{{ item.standPrice }}</div>
+                  <a class="add">加购物车</a>
+                </div>
+              </li>
+            </template>
           </ul>
         </div>
 
@@ -257,25 +295,38 @@
         <div class="bank__header">
           <div class="title">推荐课程</div>
           <div class="tabs">
-            <div class="tab active">二级建造师</div>
-            <div class="tab">七大员新考</div>
-            <div class="tab">一级建造师</div>
+            <div
+              v-for="(item, index) in goodsList2"
+              :key="index"
+              class="tab"
+              :class="active2 === index ? 'active' : ''"
+              @click="active2 = index"
+            >
+              {{ item.projectName + " - " + item.businessName }}
+            </div>
           </div>
         </div>
         <div class="bank__body">
           <ul class="list clearfix">
-            <li class="bank-item" v-for="(item, index) in 8" :key="index">
-              <div class="bank-item__img">
-                <div class="note">2022</div>
-              </div>
-              <div class="bank-item__title">
-                2022年二建建设工程法规及相关知识(黄金基础班)
-              </div>
-              <div class="bank-item__desc">
-                <div class="price">¥100</div>
-                <a class="add">加购物车</a>
-              </div>
-            </li>
+            <template v-for="(item, index) in goodsList2[active2].goodsList">
+              <li class="bank-item" v-if="index < 8" :key="index">
+                <div class="bank-item__img">
+                  <div class="note" v-if="item.year">{{ item.year }}</div>
+                  <img
+                    v-if="item.coverUrl"
+                    :src="$tools.splitImgHost(item.coverUrl)"
+                    alt=""
+                  />
+                </div>
+                <div class="bank-item__title">
+                  {{ item.goodsName }}
+                </div>
+                <div class="bank-item__desc">
+                  <div class="price">¥{{ item.standPrice }}</div>
+                  <a class="add">加购物车</a>
+                </div>
+              </li>
+            </template>
           </ul>
         </div>
 
@@ -343,7 +394,19 @@ export default {
     ToolBar,
   },
   computed: {
-    ...mapGetters(["userInfo", "token"]),
+    ...mapGetters(["userInfo", "token", "header"]),
+
+    showNav: function () {
+      return function (list) {
+        var newList = [];
+        if (list) {
+          newList = list.filter((item) => {
+            return item.status === 1;
+          });
+        }
+        return newList;
+      };
+    },
   },
   data() {
     return {
@@ -400,21 +463,63 @@ export default {
         },
       },
       bannerList: [],
+      goodsList1: [{}], //推荐课程列表
+      goodsList2: [{}], //推荐题库列表
+      active1: 0, //推荐课程index
+      active2: 0, //推荐题库index
     };
   },
   mounted() {
-    this.color = this.colors[0];
+    this.getActivityList();
+    // this.color = this.colors[0];
     this.advertisingList();
   },
   methods: {
     ...mapMutations(["setUserInfo"]),
+    getActivityList() {
+      this.$request
+        .appCommonActivityRecommendList({ platform: 2, status: 1 })
+        .then((res) => {
+          let goodsList1 = []; //推荐视频商品
+          let goodsList2 = []; //推荐题库商品
+          res.rows.forEach((item) => {
+            if (item.type === 1) {
+              goodsList1.push(item);
+            }
+            if (item.type === 2) {
+              goodsList2.push(item);
+            }
+          });
+          this.goodsList1 = goodsList1;
+          this.goodsList2 = goodsList2;
+        });
+    },
     slideChangeTransitionStart(e) {
       this.color = this.colors[this.$refs.mySwiper.swiper.realIndex];
     },
     advertisingList() {
-      this.$request.advertisingList().then((res) => {
-        this.bannerList = res.rows;
-      });
+      this.$request
+        .advertisinghomeLocationList({
+          platform: 2, //1小程序2PC网站
+          status: 1,
+          locationKey: "home-banner", //首页轮播KEY
+        })
+        .then((res) => {
+          /**
+           * 如果存在-调用轮播图列表
+           */
+          if (res.data.length) {
+            this.$request
+              .advertisingList({ locationId: res.data[0].locationId })
+              .then((res) => {
+                this.bannerList = res.rows;
+                this.colors = res.rows.map((item) => {
+                  return item.color ? item.color : "rgba(225,225,225,0.1)";
+                });
+                this.color = this.colors[0];
+              });
+          }
+        });
     },
     go(path) {
       this.$router.push({
@@ -625,7 +730,10 @@ export default {
       margin-top: 16px;
       .logo {
         float: left;
-
+        img {
+          width: 162px;
+          height: 33px;
+        }
         h1 {
           background: url("~@/assets/logo.png") no-repeat center;
           width: 162px;
@@ -959,7 +1067,10 @@ export default {
         align-items: center;
 
         .tab {
-          width: 88px;
+          cursor: pointer;
+          user-select: none;
+          // width: 88px;
+          padding: 0px 6px;
           height: 24px;
           border: 1px solid #f84e05;
           border-radius: 12px;
@@ -1004,8 +1115,11 @@ export default {
             top: -78px;
             background: rgba(122, 136, 246, 1);
             overflow: hidden;
-
             .note {
+              position: absolute;
+              top: 0px;
+              left: 0px;
+              z-index: 2;
               width: 80px;
               height: 24px;
               background: #d94404;
@@ -1015,6 +1129,10 @@ export default {
               line-height: 24px;
               color: #fff;
             }
+            img {
+              width: 100%;
+              height: 100%;
+            }
           }
 
           &__title {
@@ -1111,7 +1229,10 @@ export default {
         align-items: center;
 
         .tab {
-          width: 88px;
+          cursor: pointer;
+          user-select: none;
+          padding: 0px 6px;
+          // width: 88px;
           height: 24px;
           border: 1px solid #437cff;
           border-radius: 12px;
@@ -1158,6 +1279,10 @@ export default {
             overflow: hidden;
 
             .note {
+              position: absolute;
+              top: 0px;
+              left: 0px;
+              z-index: 2;
               width: 80px;
               height: 24px;
               background: #437cff;
@@ -1167,6 +1292,10 @@ export default {
               line-height: 24px;
               color: #fff;
             }
+            img {
+              width: 100%;
+              height: 100%;
+            }
           }
 
           &__title {

+ 76 - 37
src/store/index.js

@@ -1,52 +1,91 @@
 import Vue from 'vue'
 import Vuex from 'vuex'
 import login from '@/apis/login'
+import common from '@/apis/common'
 
 Vue.use(Vuex);
 
 export default new Vuex.Store({
-    //所有的数据都放在state中
-    state:{
-      token:'',
-      user_account:'',
-      userInfo:null,
-      checkGoodsList:[],
-    },
+  //所有的数据都放在state中
+  state: {
+    token: '',
+    user_account: '',
+    userInfo: null,
+    checkGoodsList: [],
+    header: {
+      serviceTel: {}
+    },//页头配置
+    footer: [],//页尾配置
+    links: null,//友情链接
+  },
 
-    getters:{
-      userInfo: state => state.userInfo,
-      token: state => state.token,
-      checkGoodsList: state => state.checkGoodsList
-    },
+  getters: {
+    userInfo: state => state.userInfo,
+    token: state => state.token,
+    checkGoodsList: state => state.checkGoodsList,
+    header: state => state.header,
+    footer: state => state.footer,
+    links: state => state.links,
+  },
 
-    //操作数据,唯一的通道是mutations
-    mutations:{
-      setUserInfo(state,data) {
-        state.userInfo = data;
-      },
-      setCheckGoodsList(state,data) {
-        state.checkGoodsList = data;
-      }
+  //操作数据,唯一的通道是mutations
+  mutations: {
+    setUserInfo(state, data) {
+      state.userInfo = data;
     },
+    setCheckGoodsList(state, data) {
+      state.checkGoodsList = data;
+    },
+    setHomeSetList(state, data) {
+      data.forEach(item => {
+        if (item.configKey === 'home.header') {
+          state.header = JSON.parse(item.configValue)
+          console.log(state.header)
+        }
+        if (item.configKey === 'home.footer') {
+          state.footer = JSON.parse(item.configValue)
+          console.log(state.footer)
+        }
+        if (item.configKey === 'home.links') {
+          state.links = JSON.parse(item.configValue)
+          console.log(state.links)
+        }
+      })
+    }
+  },
 
-    //actions,可以来做异步操作,然后提交给mutations,而后再对state(数据)进行操作
-    actions:{
-      /**
-       * 
-       * @param {*} context 
-       * @returns 
-       * 获取用户信息
-       */
-      getUserInfo(context) {
-        return new Promise(resolve => {
-          login.getInfo().then(res => {
-            console.log(res)
+  //actions,可以来做异步操作,然后提交给mutations,而后再对state(数据)进行操作
+  actions: {
+    /**
+     * 
+     * @param {*} context 
+     * @returns 
+     * 获取用户信息
+     */
+    getUserInfo(context) {
+      return new Promise(resolve => {
+        login.getInfo().then(res => {
+          console.log(res)
 
-              context.commit('setUserInfo',res.data)
-            
-            resolve()
-          })
+          context.commit('setUserInfo', res.data)
+
+          resolve()
+        })
+      })
+    },
+    /**
+     * 
+     * @param {*} context 
+     * @returns 
+     * 获取首页配置
+     */
+    getCommonBaseHomeList(context) {
+      return new Promise(resolve => {
+        common.getCommonBaseHomeList().then(res => {
+          context.commit('setHomeSetList', res.rows)
+          resolve()
         })
-      }
+      })
     }
+  }
 })