From 2886d8ee7872f6709b53a4bd84f95ffe0a26eafb Mon Sep 17 00:00:00 2001
From: 杨磊 <505174330@qq.com>
Date: 星期一, 18 八月 2025 15:45:57 +0800
Subject: [PATCH] 头部&脚部公共区域

---
 src/assets/main.css                  |  180 +++++++++++++++++++-
 src/views/home/index.vue             |    1 
 src/assets/base.css                  |  125 ++++---------
 src/layout/components/headerPage.vue |   23 ++
 src/layout/components/footerPage.vue |  197 ++++++++++++++++++++-
 src/router/index.js                  |    2 
 6 files changed, 425 insertions(+), 103 deletions(-)

diff --git a/src/assets/base.css b/src/assets/base.css
index 8816868..b64e9ba 100644
--- a/src/assets/base.css
+++ b/src/assets/base.css
@@ -1,86 +1,49 @@
-/* color palette from <https://github.com/vuejs/theme> */
-:root {
-  --vt-c-white: #ffffff;
-  --vt-c-white-soft: #f8f8f8;
-  --vt-c-white-mute: #f2f2f2;
+/* http://meyerweb.com/eric/tools/css/reset/ 
+   v2.0 | 20110126
+   License: none (public domain)
+*/
 
-  --vt-c-black: #181818;
-  --vt-c-black-soft: #222222;
-  --vt-c-black-mute: #282828;
-
-  --vt-c-indigo: #2c3e50;
-
-  --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
-  --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
-  --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65);
-  --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
-
-  --vt-c-text-light-1: var(--vt-c-indigo);
-  --vt-c-text-light-2: rgba(60, 60, 60, 0.66);
-  --vt-c-text-dark-1: var(--vt-c-white);
-  --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
+html, body, div, span, applet, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, img, ins, kbd, q, s, samp,
+small, strike, strong, sub, sup, tt, var,
+b, u, i, center,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, canvas, details, embed, 
+figure, figcaption, footer, header, hgroup, 
+menu, nav, output, ruby, section, summary,
+time, mark, audio, video {
+	margin: 0;
+	padding: 0;
+	border: 0;
+	font-size: 100%;
+	font: inherit;
+	vertical-align: baseline;
 }
-
-/* semantic color variables for this project */
-:root {
-  --color-background: var(--vt-c-white);
-  --color-background-soft: var(--vt-c-white-soft);
-  --color-background-mute: var(--vt-c-white-mute);
-
-  --color-border: var(--vt-c-divider-light-2);
-  --color-border-hover: var(--vt-c-divider-light-1);
-
-  --color-heading: var(--vt-c-text-light-1);
-  --color-text: var(--vt-c-text-light-1);
-
-  --section-gap: 160px;
+/* HTML5 display-role reset for older browsers */
+article, aside, details, figcaption, figure, 
+footer, header, hgroup, menu, nav, section {
+	display: block;
 }
-
-@media (prefers-color-scheme: dark) {
-  :root {
-    --color-background: var(--vt-c-black);
-    --color-background-soft: var(--vt-c-black-soft);
-    --color-background-mute: var(--vt-c-black-mute);
-
-    --color-border: var(--vt-c-divider-dark-2);
-    --color-border-hover: var(--vt-c-divider-dark-1);
-
-    --color-heading: var(--vt-c-text-dark-1);
-    --color-text: var(--vt-c-text-dark-2);
-  }
-}
-
-*,
-*::before,
-*::after {
-  box-sizing: border-box;
-  margin: 0;
-  font-weight: normal;
-}
-
 body {
-  min-height: 100vh;
-  color: var(--color-text);
-  background: var(--color-background);
-  transition:
-    color 0.5s,
-    background-color 0.5s;
-  line-height: 1.6;
-  font-family:
-    Inter,
-    -apple-system,
-    BlinkMacSystemFont,
-    'Segoe UI',
-    Roboto,
-    Oxygen,
-    Ubuntu,
-    Cantarell,
-    'Fira Sans',
-    'Droid Sans',
-    'Helvetica Neue',
-    sans-serif;
-  font-size: 15px;
-  text-rendering: optimizeLegibility;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
+	line-height: 1;
+	font-size: 14px;
 }
+ol, ul {
+	list-style: none;
+}
+blockquote, q {
+	quotes: none;
+}
+blockquote:before, blockquote:after,
+q:before, q:after {
+	content: '';
+	content: none;
+}
+table {
+	border-collapse: collapse;
+	border-spacing: 0;
+}
\ No newline at end of file
diff --git a/src/assets/main.css b/src/assets/main.css
index 480a2ae..4dffbeb 100644
--- a/src/assets/main.css
+++ b/src/assets/main.css
@@ -1,15 +1,177 @@
 @import './base.css';
 
-#app {
-  width: 100%;
-
+/* 灞呬腑甯冨眬 */
+.contentBox{
+  width: 1200px;
+  margin: 0 auto;
 }
 
-a,
-.green {
-  text-decoration: none;
-  color: hsla(160, 100%, 37%, 1);
-  transition: 0.4s;
-  padding: 3px;
+/* 鑷�傚簲鍥剧墖 */
+.autoImg {
+  width: auto;
+  height: auto;
+  max-width: 100%;
+  max-height: 100%;
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  margin: auto;
 }
 
+.bannerImg {
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ margin: auto;
+}
+
+/* 鍏嶈垂 */
+.freePrice {
+  color: #0bc266 !important;
+}
+
+.titleBox {
+  height: 60px;
+  background: #d8f7e6;
+  line-height: 60px;
+  padding: 0 40px;
+  font-weight: 700;
+  color: #00873c;
+  font-size: 18px;
+}
+
+/* 瀵屾枃鏈鍣紝淇濈暀瀵屾枃鏈粯璁ゆ牱寮忥紝鎵�瑙佸嵆鎵�寰� */
+.richTextBox {
+  line-height: 1.4;
+}
+
+.richTextBox p {
+  display: block;
+  margin-block-start: 1em;
+  margin-block-end: 1em;
+  margin-inline-start: 0px;
+  margin-inline-end: 0px;
+}
+
+.richTextBox table[border]:not([border="0"]):not([style*=border-style]) td, .richTextBox table[border]:not([border="0"]):not([style*=border-style]) th {
+  border-style: solid;
+}
+
+.richTextBox table[border]:not([border="0"]):not([style*=border-width]) td, .richTextBox table[border]:not([border="0"]):not([style*=border-width]) th {
+  border-width: 1px;
+}
+.richTextBox table:not([cellpadding]) td, .richTextBox table:not([cellpadding]) th {
+  padding: 0.4rem;
+}
+
+/* 鍗曡鐪佺暐 */
+.ellipsis {
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+
+/* flex甯冨眬 */
+.flex {
+  display: flex;
+}
+
+.flex1 {
+  flex: 1;
+  overflow: hidden;
+}
+
+/* 涓婁紶鍥剧墖 */
+.avatar-uploader .el-upload {
+  width: 190px;
+  height: 140px;
+  border: 1px dashed #d9d9d9;
+  position: relative;
+}
+
+.avatar-uploader .el-upload:hover {
+  border-color: #409eff;
+}
+
+.avatarCover {
+  display: block;
+  position: absolute;
+  left: 0;
+  right: 0;
+  top: 0;
+  bottom: 0;
+  max-width: 100%;
+  max-height: 100%;
+  margin: auto;
+}
+
+/* 鍐呯疆鐘舵�佸瓧浣撻鑹� */
+.primaryTxt {
+  color: #00873C !important;
+}
+.successTxt {
+  color: #67c23a !important;
+}
+.warningTxt {
+  color: #e6a23c !important;
+}
+.errorTxt {
+  color: #f56c6c !important;
+}
+.infoTxt {
+  color: #999 !important;
+}
+/* 鍐呯疆鐘舵�佽儗鏅鑹� */
+.primaryBack {
+  color: #fff !important;
+  background: #00873C !important;
+}
+.successBack {
+  color: #fff !important;
+  background: #67c23a !important;
+}
+.warningBack {
+  color: #fff !important;
+  background: #e6a23c !important;
+}
+.errorBack {
+  color: #fff !important;
+  background: #f56c6c !important;
+}
+
+/* 涓婚鑹蹭慨鏀�,鏍规嵁UI妗嗘灦鍐冲畾鏄惁闇�瑕� */
+/* .el-button--primary {
+  background-color: #00873C !important;
+  border-color: #00873C !important;
+}
+
+.el-button--primary:focus,
+.el-button--primary:hover {
+  background: #086833 !important;
+  border-color: #086833 !important;
+  color: #fff !important;
+}
+
+.el-tabs__item.is-active {
+  color: #00873C !important;
+} */
+
+.el-input-group__append, .el-input-group__prepend { 
+  vertical-align: initial !important;
+}
+.el-checkbox__inner{
+  border: 1px solid #000 !important;
+  width: 20px !important;
+  height: 20px !important;
+}
+
+.el-checkbox__inner::after {
+  left: 7px !important;
+  top: 4px !important;
+}
\ No newline at end of file
diff --git a/src/layout/components/footerPage.vue b/src/layout/components/footerPage.vue
index 15aaa44..184da08 100644
--- a/src/layout/components/footerPage.vue
+++ b/src/layout/components/footerPage.vue
@@ -1,16 +1,193 @@
 <template>
-  <div class="footerBox">FOOT</div>
+  <div class="pageFooter">
+    <div class="footerContent contentBox flex">
+      <div class="infoBox flex1">
+        <ul class="linkBox">
+          <li class="link" @click="toAboutus(index)" v-for="(item, index) in linkList" :key="index">
+            {{ item.name }}
+          </li>
+        </ul>
+        <ul class="linkBox">
+          <li class="link" @click="toAboutus(index)" v-for="(item, index) in newList" :key="index">
+            {{ item.name }}
+          </li>
+        </ul>
+        <ul class="linkBox">
+          <li
+            class="link"
+            @click="toAboutus(index)"
+            v-for="(item, index) in serviceList"
+            :key="index"
+          >
+            {{ item.name }}
+          </li>
+        </ul>
+        <ul class="linkBox">
+          <li class="link" @click="toAboutus(index)">澶╃尗鏃楄埌搴�</li>
+          <li class="link" style="opacity: 1; font-size: 20px" @click="toAboutus(index)">
+            浜笢鏃楄埌搴�
+          </li>
+        </ul>
+      </div>
+      <div class="QRCodeBox">
+        <div class="codeItem">
+          <img src="@/assets/images/pageFooter/wechatCode.png" />
+        </div>
+        <div class="codeItem">
+          <img src="@/assets/images/pageFooter/weiboCode.png" />
+        </div>
+      </div>
+    </div>
+    <div class="copyrightBox">
+      <span
+        >涓浗鍗忓拰鍖荤澶у鍑虹増绀炬湁闄愬叕鍙� 涓� 澶囨搴忓彿锛�<span class="beian" @click="toLink"
+          >浜琁CP澶� 05029104鍙�-4浜掕仈缃戝嚭鐗堣鍙瘉 鏂板嚭缃戣瘉 锛堜含 锛�</span
+        >
+        涓� 澧炲�肩數淇′笟鍔$粡钀ヨ鍙瘉锛氫含B2-20224426</span
+      >
+      <span style="display: block">Copyright漏2013 涓浗鍗忓拰鍖荤澶у鍑虹増绀炬湁闄愬叕鍙� 鐗堟潈鎵�鏈�!</span>
+    </div>
+  </div>
 </template>
 
-<script setup lang="ts"></script>
+<script setup lang="ts">
+import { reactive } from 'vue'
 
-<style scoped>
-.footerBox {
-  width: 100%;
-  height: 240px;
-  min-width: 1200px;
-  color: #fff;
-  background-color: #f0f0f0;
-  text-align: center;
+const toAboutus = () => {}
+
+const linkList = reactive([
+  {
+    name: '鍏充簬鎴戜滑',
+    url: '',
+  },
+  {
+    name: '鍏充簬鎴戜滑',
+    url: '',
+  },
+  {
+    name: '鑱旂郴鎴戜滑',
+    url: '',
+  },
+  {
+    name: '鎰忚鍙嶉',
+    url: '',
+  },
+])
+const newList = reactive([
+  {
+    name: '鏂版墜涓婅矾',
+    url: '',
+  },
+  {
+    name: '鎿嶄綔鎸囧崡',
+    url: '',
+  },
+  {
+    name: '鏁欏笀璁よ瘉',
+    url: '',
+  },
+])
+const serviceList = reactive([
+  {
+    name: '鍙嬫儏閾炬帴',
+    url: '',
+  },
+  {
+    name: '鍥藉绉戝鎶�鏈儴',
+    url: '',
+  },
+  {
+    name: '鍥藉鍗敓鍋ュ悍濮�',
+    url: '',
+  },
+  {
+    name: '鍥藉鏁欒偛閮�',
+    url: '',
+  },
+  {
+    name: '鍖椾含甯傚崼鍋ュ',
+    url: '',
+  },
+])
+</script>
+
+<style lang="less" scoped>
+.pageFooter {
+  background: #444444;
+  background-image: url('@/assets/images/xiehe/home/footer-bg.png');
+  .footerContent {
+    padding: 30px 0;
+    .infoBox {
+      display: flex;
+      .linkBox {
+        font-size: 16px;
+        margin-left: 50px;
+        .link {
+          padding-right: 15px;
+          cursor: pointer;
+          color: #fff;
+          margin-top: 20px;
+          opacity: 0.7;
+          &::after {
+            margin-left: 15px;
+          }
+          &:last-child::after {
+            display: none;
+          }
+          &:first-child {
+            color: #fff;
+            opacity: 1;
+            font-size: 20px;
+            margin-bottom: 10px;
+          }
+        }
+      }
+      .address {
+        margin-top: 30px;
+        font-size: 14px;
+        color: #ccc;
+        span {
+          margin-right: 30px;
+        }
+      }
+      .logo {
+        height: 50px;
+        margin-top: 30px;
+        img {
+          height: 100%;
+        }
+      }
+    }
+    .QRCodeBox {
+      .codeItem {
+        display: inline-block;
+        text-align: center;
+        margin-left: 40px;
+        p {
+          font-size: 16px;
+        }
+        img {
+          width: 100px;
+          height: 100px;
+          margin-top: 20px;
+        }
+      }
+    }
+  }
+  .copyrightBox {
+    text-align: center;
+    color: #fff;
+
+    height: 80px;
+    line-height: 40px;
+    font-size: 12px;
+    border-top: 1px solid #e6e6e6;
+    .beian {
+      cursor: pointer;
+    }
+    .beian:hover {
+      color: blue;
+    }
+  }
 }
 </style>
diff --git a/src/layout/components/headerPage.vue b/src/layout/components/headerPage.vue
index c1664cb..d435d21 100644
--- a/src/layout/components/headerPage.vue
+++ b/src/layout/components/headerPage.vue
@@ -15,7 +15,7 @@
       </div>
       <div class="searchBox" v-show="!hideSerch">
         <el-input
-          style="width: 500px"
+          style="width: 500px; height: 50px"
           placeholder="璇疯緭鍏ュ唴瀹�"
           @change="gotoSearch"
           v-model="searchKey"
@@ -83,7 +83,7 @@
 
 <script setup lang="ts">
 import { ref } from 'vue'
-
+import { Search } from '@element-plus/icons-vue'
 const props = defineProps({
   hideSerch: {
     type: Boolean,
@@ -97,9 +97,28 @@
 
 let searchKey = ref('')
 let userInfo = ref('')
+const navData = ref([
+  {
+    name: '棣栭〉',
+    path: '/home',
+  },
+  {
+    name: '鏁欒偛鍑虹増',
+    path: '/bookStore',
+  },
+  {
+    name: '璇昏�呮湇鍔�',
+    path: '/teachingServices',
+  },
+  {
+    name: '鍏充簬鎴戜滑',
+    path: '/aboutUs',
+  },
+])
 
 const gotoSearch = () => {}
 const handleCommand = () => {}
+const gotoPage = () => {}
 </script>
 
 <style lang="less" scoped>
diff --git a/src/router/index.js b/src/router/index.js
index 9b039b4..9132c1e 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -11,7 +11,7 @@
       redirect: { name: 'home' },
       children: [
         {
-          path: '/',
+          path: '/home',
           name: 'home',
           component: HomeView,
         },
diff --git a/src/views/home/index.vue b/src/views/home/index.vue
index 69936ea..4221005 100644
--- a/src/views/home/index.vue
+++ b/src/views/home/index.vue
@@ -16,6 +16,7 @@
 <style lang="less" scoped>
 .homePage {
   min-width: 1220px;
+  min-height: calc(100vh - 61.8%);
   background-color: #fff;
 }
 .el-carousel__item h3 {

--
Gitblit v1.9.1