yangzj 2 жил өмнө
parent
commit
ef817907a5

+ 2 - 0
.env.dev

@@ -0,0 +1,2 @@
+# 请求基础api
+VUE_APP_BASE_API = '/api'

+ 2 - 0
.env.prod

@@ -0,0 +1,2 @@
+# 请求基础api
+VUE_APP_BASE_API = '/api'

+ 1 - 0
.gitignore

@@ -1,6 +1,7 @@
 .DS_Store
 node_modules
 /dist
+.history
 
 
 # local env files

+ 3 - 0
package.json

@@ -8,7 +8,10 @@
     "lint": "vue-cli-service lint"
   },
   "dependencies": {
+    "axios": "^0.27.2",
     "core-js": "^3.8.3",
+    "element-ui": "^2.15.9",
+    "js-cookie": "^3.0.1",
     "register-service-worker": "^1.7.2",
     "vue": "^2.6.14",
     "vue-router": "^3.5.1",

+ 1 - 1
public/index.html

@@ -3,7 +3,7 @@
   <head>
     <meta charset="utf-8">
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
     <link rel="icon" href="<%= BASE_URL %>favicon.ico">
     <title><%= htmlWebpackPlugin.options.title %></title>
   </head>

+ 0 - 23
src/App.vue

@@ -1,32 +1,9 @@
 <template>
   <div id="app">
-    <nav>
-      <router-link to="/">Home</router-link> |
-      <router-link to="/about">About</router-link>
-    </nav>
     <router-view/>
   </div>
 </template>
 
 <style lang="scss">
-#app {
-  font-family: Avenir, Helvetica, Arial, sans-serif;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-  text-align: center;
-  color: #2c3e50;
-}
 
-nav {
-  padding: 30px;
-
-  a {
-    font-weight: bold;
-    color: #2c3e50;
-
-    &.router-link-exact-active {
-      color: #42b983;
-    }
-  }
-}
 </style>

+ 47 - 0
src/api/Home/index.js

@@ -0,0 +1,47 @@
+/**
+ * @Description: 首页api
+ * @Author: 空白格
+ * @Date: 2022-08-10 14:10:36
+ * @LastEditors: 空白格
+ * @LastEditTime: 2022-08-10 17:36:05
+ * @FilePath: \veterans_client_web\src\api\Home\index.js
+ * @Copyright: Copyright (c) 2016~2022 by 空白格, All Rights Reserved.
+ */
+import request from '@/utils/request'
+
+// 获取轮播图片
+export function getBannerList(params) {
+  return request({
+    url: '/app/sysadv/list',
+    method: 'get',
+    headers: {
+      noLoginFlag: true
+    },
+    params
+  })
+}
+
+// 获取新闻内容
+export function getNewsList(params) {
+  return request({
+    url: '/app/sec/article/door/list',
+    method: 'get',
+    headers: {
+      noLoginFlag: true
+    },
+    params
+  })
+}
+
+// 获取公告内容
+export function getNoticeList(params) {
+  return request({
+    url: '/app/notice/queryNewest',
+    method: 'get',
+    headers: {
+      noLoginFlag: true
+    },
+    params
+  })
+}
+

+ 28 - 0
src/api/Login/index.js

@@ -0,0 +1,28 @@
+/**
+ * @Description: 登录接口
+ * @Author: 空白格
+ * @Date: 2022-08-10 14:58:23
+ * @LastEditors: 空白格
+ * @LastEditTime: 2022-08-10 15:06:53
+ * @FilePath: \veterans_client_web\src\api\Login\index.js
+ * @Copyright: Copyright (c) 2016~2022 by 空白格, All Rights Reserved.
+ */
+import request from '@/utils/request'
+
+// 验证码验证登录
+export function loginAuthCode(data) {
+  return request({
+    url: '/auth/verifyCode',
+    method: 'post',
+    data
+  })
+}
+
+// 获取验证码
+export function getAuthCode(data) {
+  return request({
+    url: '/auth/sendSmsCode',
+    method: 'post',
+    data
+  })
+}

BIN
src/assets/images/default-news.jpg


+ 35 - 0
src/assets/images/home-menu-icon/home-menu-icon-1.svg

@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="98px" height="98px" viewBox="0 0 98 98" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>编组 2</title>
+    <defs>
+        <linearGradient x1="35.0409203%" y1="0%" x2="71.9385317%" y2="100%" id="linearGradient-1">
+            <stop stop-color="#FD8282" offset="0%"></stop>
+            <stop stop-color="#FF3835" offset="100%"></stop>
+        </linearGradient>
+        <filter id="filter-2">
+            <feColorMatrix in="SourceGraphic" type="matrix" values="0 0 0 0 1.000000 0 0 0 0 1.000000 0 0 0 0 1.000000 0 0 0 1.000000 0"></feColorMatrix>
+        </filter>
+        <filter x="-24.0%" y="-24.0%" width="148.0%" height="148.0%" filterUnits="objectBoundingBox" id="filter-3">
+            <feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feGaussianBlur stdDeviation="2" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.0964270105 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+    </defs>
+    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="首页" transform="translate(-68.000000, -611.000000)">
+            <g id="编组-2" transform="translate(68.000000, 611.000000)">
+                <rect id="矩形" fill="url(#linearGradient-1)" x="0" y="0" width="98" height="98" rx="26"></rect>
+                <g filter="url(#filter-2)" id="rencaizhengce">
+                    <g filter="url(#filter-3)" transform="translate(24.000000, 24.000000)">
+                        <path d="M0,10.0591395 L0,47.4216577 C0,49.5771876 3.21428571,50.6549525 5.71428571,49.5771876 L23.5714286,42.032833 C24.2857143,41.673578 25.3571429,41.673578 26.4285714,42.032833 L44.2857143,49.5771876 C46.7857143,50.6549525 50,49.2179326 50,47.4216577 L50,10.0591395 L0,10.0591395 Z M34.6428571,25.1478488 L31.0714286,28.7403986 C30.7142857,29.0996536 30.3571429,29.4589086 30.3571429,29.8181635 L31.4285714,34.8477333 C31.4285714,35.5662433 30.7142857,36.2847532 30,35.9254983 L25,33.4107134 L23.9285714,33.4107134 L19.2857143,35.9254983 C18.9285714,36.2847532 17.8571429,35.5662433 17.8571429,34.8477333 L18.9285714,29.8181635 C18.9285714,29.4589086 18.9285714,29.0996536 18.5714286,28.7403986 L15,25.1478488 C14.2857143,24.4293388 14.6428571,23.3515739 15.3571429,23.3515739 L20.7142857,22.6330639 C21.0714286,22.6330639 21.4285714,22.2738089 21.4285714,21.9145539 L23.9285714,17.6034941 C24.2857143,16.8849842 25.3571429,16.8849842 25.7142857,17.6034941 L28.2142857,22.2738089 C28.2142857,22.6330639 28.5714286,22.6330639 28.9285714,22.9923189 L34.2857143,23.7108288 C34.6428571,23.3515739 35,24.4293388 34.6428571,25.1478488 L34.6428571,25.1478488 Z" id="形状" fill="#000000" fill-rule="nonzero"></path>
+                        <path d="M50,7.54435463 L0,7.54435463 L0,2.51478488 C0,1.07776495 1.42857143,0 2.85714286,0 L47.1428571,0 C48.5714286,0 50,1.07776495 50,2.51478488 L50,7.54435463 Z" id="路径" fill="#000000" fill-rule="nonzero" opacity="0.600000024"></path>
+                    </g>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>

+ 30 - 0
src/assets/images/home-menu-icon/home-menu-icon-2.svg

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="98px" height="98px" viewBox="0 0 98 98" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>编组 3</title>
+    <defs>
+        <linearGradient x1="31.4967862%" y1="0%" x2="73.2262359%" y2="100%" id="linearGradient-1">
+            <stop stop-color="#AF76E5" offset="0%"></stop>
+            <stop stop-color="#8724DF" offset="100%"></stop>
+        </linearGradient>
+        <filter x="-25.0%" y="-21.1%" width="150.0%" height="142.1%" filterUnits="objectBoundingBox" id="filter-2">
+            <feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feGaussianBlur stdDeviation="2" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.0996230332 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+    </defs>
+    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="首页" transform="translate(-239.000000, -611.000000)">
+            <g id="编组-3" transform="translate(239.000000, 611.000000)">
+                <rect id="矩形备份" fill="url(#linearGradient-1)" x="0" y="0" width="98" height="98" rx="26"></rect>
+                <g id="puyangjiuye-" filter="url(#filter-2)" transform="translate(25.000000, 21.000000)" fill="#FFFFFF" fill-rule="nonzero">
+                    <path d="M11.6833222,12.4709439 C11.6833222,19.3318777 17.3352981,24.9418878 24.1189551,24.9418878 C30.9026122,24.9418878 36.432418,19.3318777 36.432418,12.4709439 C36.432418,5.61001008 30.9026122,0 23.996785,0 C17.2131279,0 11.6833222,5.61639234 11.6833222,12.4709439 L11.6833222,12.4709439 Z M38.3228399,25.3184414 L41.7178835,25.3184414 C44.2320161,25.4460867 45.9874079,26.6906281 47.2476892,28.9371851 C47.7492297,29.9328183 48,31.0560967 48,32.1793752 L48,50.1390662 C48,52.7557944 46.8683188,54.7534431 44.6049565,56.1256298 C43.6018754,56.7510917 42.3415941,57 41.2099129,57 L26.0093771,57 C25.7586068,57 25.7586068,56.8723547 25.880777,56.7510917 C28.8964501,47.4010749 31.9121232,37.9170306 34.9277964,28.5670138 C35.3071668,27.5713806 35.557937,26.5693651 35.9308774,25.5737319 C35.9308774,25.4460867 36.0594776,25.3248236 36.1816477,25.3248236 L38.3228399,25.3248236 L38.3228399,25.3184414 Z M34.554856,46.6415855 L42.8495646,46.6415855 C43.1003349,46.6415855 43.228935,46.6415855 43.3511052,46.5139402 C43.7304756,46.3862949 43.9812458,45.8884783 43.8526457,45.518307 C43.7240455,45.0204904 43.3511052,44.7715821 42.9717348,44.7715821 L34.3040857,44.7715821 C33.9247153,44.7715821 33.5517749,45.0204904 33.4231748,45.518307 C33.4231748,46.0225059 33.8025452,46.6415855 34.554856,46.6415855 Z M11.8119223,25.3184414 C12.0626926,25.3184414 12.1912927,25.4460867 12.1912927,25.5673497 C15.5799062,35.9193819 18.8463496,46.3926772 22.2413932,56.7447094 C22.2413932,56.8723547 22.2413932,56.8723547 22.3699933,56.9936177 L6.9122572,56.9936177 C4.27595445,56.9936177 2.26336236,55.8703393 0.880910918,53.6237823 C0.379370395,52.7494122 0.128600134,51.753779 0,50.7581458 L0,32.1793752 C0,29.8115553 0.880910918,27.9415519 2.88707301,26.5693651 C4.14092431,25.694995 5.40120563,25.3248236 6.90582719,25.3248236 L11.8119223,25.3248236 L11.8119223,25.3184414 Z" id="形状"></path>
+                    <path d="M23.7780089,26.1292755 C23.9053782,26 23.9053782,26 24.026379,26 C24.026379,26 24.1537484,26 24.2747492,26.1292755 C26.1407097,27.7710746 28.0066702,29.4128737 29.8726307,30.9253973 C30,31.0546728 30,31.1774845 30,31.30676 C28.0066702,37.4925936 26.1407097,43.5556154 24.1537484,49.7479127 C24.1537484,49.8771883 24.1537484,49.8771883 24.026379,50 C23.6506396,48.991651 23.4022694,47.9768381 23.0328984,46.9684891 C21.4153081,41.7910046 19.7977177,36.6135201 18.0527581,31.4360356 C17.9253888,31.1839483 18.0527581,31.0546728 18.1801274,30.8025855 C20.0460879,29.2900619 21.9120484,27.7710746 23.7780089,26.1292755 L23.7780089,26.1292755 Z" id="路径" opacity="0.600000024"></path>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>

+ 35 - 0
src/assets/images/home-menu-icon/home-menu-icon-3.svg

@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="98px" height="98px" viewBox="0 0 98 98" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>编组 4</title>
+    <defs>
+        <linearGradient x1="18.3844457%" y1="0%" x2="75.1737447%" y2="100%" id="linearGradient-1">
+            <stop stop-color="#76A0F8" offset="0%"></stop>
+            <stop stop-color="#276EFF" offset="100%"></stop>
+        </linearGradient>
+        <filter id="filter-2">
+            <feColorMatrix in="SourceGraphic" type="matrix" values="0 0 0 0 1.000000 0 0 0 0 1.000000 0 0 0 0 1.000000 0 0 0 1.000000 0"></feColorMatrix>
+        </filter>
+        <filter x="-21.1%" y="-26.1%" width="142.1%" height="152.2%" filterUnits="objectBoundingBox" id="filter-3">
+            <feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feGaussianBlur stdDeviation="2" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.1035566 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+    </defs>
+    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="首页" transform="translate(-415.000000, -611.000000)">
+            <g id="编组-4" transform="translate(415.000000, 611.000000)">
+                <rect id="矩形备份-2" fill="url(#linearGradient-1)" x="0" y="0" width="98" height="98" rx="26"></rect>
+                <g filter="url(#filter-2)" id="hezuoqiye">
+                    <g filter="url(#filter-3)" transform="translate(21.000000, 26.000000)">
+                        <path d="M50.1413272,7.29998455 L53.4370012,7.29998455 C54.3819673,7.29998455 55.2882299,7.64648003 55.9564218,8.26324594 C56.6246137,8.88001186 57,9.71652595 57,10.5887647 L57,27.0308238 C57,28.8471669 55.4047911,30.3196039 53.4370012,30.3196039 L46.951386,30.3196039 L32.049034,10.4396095 L30.3154137,8.17466013 L19.7022259,12.6971931 C19.016491,12.9890125 18.2480448,13.0721945 17.5077699,12.9347366 C14.2692846,12.3295225 13.1826964,11.2829809 14.248005,9.79511169 C15.2787344,8.35020905 19.6676467,5.44260334 27.4147417,1.07229455 C27.6146775,0.958161553 27.8249316,0.860201256 28.0431541,0.779508398 C31.297599,-0.634703891 35.0108848,-0.124629921 39.1830113,2.30973031 C42.6316496,4.32824329 46.3039017,6.00114142 50.1373373,7.29998455 L50.1413272,7.29998455 Z M2.43385131,30.1483517 C0.980130933,29.7000009 0,28.4437429 0,27.0289824 L0,10.5887647 C0,8.77242156 1.59520888,7.29998455 3.56299875,7.29998455 L11.7782445,7.29998455 L11.7642797,7.31103308 C10.761891,8.14688307 10.2066485,9.34619341 10.2450312,10.5925733 C10.2834139,11.8389532 10.9115665,13.0072141 11.9637757,13.7891565 C14.5755763,15.7335735 18.0994435,16.2742863 21.2523099,15.2144173 L29.2560899,12.5185752 L34.8758925,20.0168465 C35.0485919,20.1697034 35.2043077,20.3381097 35.3407182,20.5195548 L45.1898362,33.6599438 C45.7782966,34.4455319 45.9677087,35.4284425 45.7088312,36.3531502 C45.4499537,37.2778579 44.7683601,38.0530147 43.8412432,38.4771044 L28.1069929,45.6586511 C27.4012862,45.9820572 26.598968,46.0792448 25.8267534,45.9348645 L26.4092818,45.3824378 C29.1528229,42.8207211 29.1528229,38.6983735 26.4092818,36.1366568 L15.0120748,25.5006019 C14.0080323,24.5628153 12.6390744,24.0350361 11.2106783,24.0350361 C9.78228224,24.0350361 8.41332428,24.5628153 7.40928182,25.5006019 L2.43185639,30.1483517 L2.43385131,30.1483517 Z" id="形状" fill="#000000" fill-rule="nonzero"></path>
+                        <path d="M14.073471,28.9664427 L23.9919485,38.275803 C24.8617825,39.0931749 25.2006168,40.2762441 24.8827711,41.3861861 L24.3835189,43.1420182 C24.1545266,43.9409407 23.5145419,44.5832505 22.6738226,44.8579259 C21.8331034,45.1326013 20.9003363,45.0041328 20.1819688,44.5147267 L7.424606,35.8136434 C6.60647401,35.2554449 6.09047021,34.3949203 6.01078935,33.4558624 C5.9311085,32.5168044 6.29562526,31.5920178 7.00954142,30.9220076 L9.09465364,28.9628112 C9.75151463,28.3467096 10.6468964,28 11.5811255,28 C12.5153546,28 13.4107364,28.3467096 14.0675974,28.9628112 L14.073471,28.9664427 Z" id="路径" fill="#000000" fill-rule="nonzero" opacity="0.600000024"></path>
+                    </g>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>

+ 36 - 0
src/assets/images/home-menu-icon/home-menu-icon-4.svg

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="98px" height="98px" viewBox="0 0 98 98" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>编组 5</title>
+    <defs>
+        <linearGradient x1="25.7322683%" y1="0%" x2="75.4036289%" y2="100%" id="linearGradient-1">
+            <stop stop-color="#FF74AA" offset="0%"></stop>
+            <stop stop-color="#FF2C7D" offset="100%"></stop>
+        </linearGradient>
+        <filter id="filter-2">
+            <feColorMatrix in="SourceGraphic" type="matrix" values="0 0 0 0 1.000000 0 0 0 0 1.000000 0 0 0 0 1.000000 0 0 0 1.000000 0"></feColorMatrix>
+        </filter>
+        <filter x="-21.1%" y="-26.1%" width="142.1%" height="152.2%" filterUnits="objectBoundingBox" id="filter-3">
+            <feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feGaussianBlur stdDeviation="2" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.104621941 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+    </defs>
+    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="首页" transform="translate(-586.000000, -611.000000)">
+            <g id="编组-5" transform="translate(586.000000, 611.000000)">
+                <rect id="矩形备份-3" fill="url(#linearGradient-1)" x="0" y="0" width="98" height="98" rx="26"></rect>
+                <g filter="url(#filter-2)" id="iconfont-school">
+                    <g filter="url(#filter-3)" transform="translate(21.000000, 26.000000)">
+                        <path d="M15.4044488,46 L25.4734325,46 L25.4734325,35.7256381 L31.5263377,35.7256381 L31.5263377,46 L41.5953214,46 L41.5953214,0 L15.4044488,0 L15.4044488,46 Z M30.3369248,5.42109074 L36.3899448,5.42109074 L36.3899448,11.4607625 L30.3369248,11.4607625 L30.3369248,5.42109074 L30.3369248,5.42109074 Z M30.3369248,15.1279743 L36.3899448,15.1279743 L36.3899448,21.1675322 L30.3369248,21.1675322 L30.3369248,15.1279743 Z M30.3369248,24.8336059 L36.3899448,24.8336059 L36.3899448,30.8732776 L30.3369248,30.8732776 L30.3369248,24.8336059 Z M20.6100553,5.42109074 L26.6629604,5.42109074 L26.6629604,11.4607625 L20.6100553,11.4607625 L20.6100553,5.42109074 L20.6100553,5.42109074 Z M20.6100553,15.1279743 L26.6629604,15.1279743 L26.6629604,21.1675322 L20.6100553,21.1675322 L20.6100553,15.1279743 Z M20.6100553,24.8336059 L26.6629604,24.8336059 L26.6629604,30.8732776 L20.6100553,30.8732776 L20.6100553,24.8336059 Z" id="形状" fill="#000000" fill-rule="nonzero"></path>
+                        <path d="M57,4.12155862 L57,46 L47.8340507,46 L47.8340507,36.6463962 L43.9457622,36.6463962 L43.9457622,4.12155862 L57,4.12155862 Z M52.2603906,26.7292975 L46.7516275,26.7292975 L46.7516275,32.2281235 L52.2603906,32.2281235 L52.2603906,26.7292975 Z M52.2603906,17.8934351 L46.7516275,17.8934351 L46.7516275,23.3910091 L52.2603906,23.3910091 L52.2603906,17.8934351 Z M52.2603906,9.05654835 L46.7516275,9.05654835 L46.7516275,14.5550329 L52.2603906,14.5550329 L52.2603906,9.05654835 Z" id="形状结合" fill="#000000" fill-rule="nonzero" opacity="0.600000024"></path>
+                        <path d="M13.0542378,4.12155862 L13.0542378,36.6463962 L9.16594932,36.6463962 L9.16594932,46 L9.9475983e-14,46 L9.9475983e-14,4.12155862 L13.0542378,4.12155862 Z M10.2483725,26.7294113 L4.73960945,26.7294113 L4.73960945,32.2281235 L10.2483725,32.2281235 L10.2483725,26.7294113 Z M10.2483725,17.8934351 L4.73960945,17.8934351 L4.73960945,23.3911229 L10.2483725,23.3911229 L10.2483725,17.8934351 Z M10.2483725,9.05654835 L4.73960945,9.05654835 L4.73960945,14.5550329 L10.2483725,14.5550329 L10.2483725,9.05654835 Z" id="形状结合" fill="#000000" fill-rule="nonzero" opacity="0.600000024"></path>
+                    </g>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 27 - 0
src/assets/images/home-menu-icon/home-menu-icon-5.svg


+ 37 - 0
src/assets/images/home-menu-icon/home-menu-icon-6.svg

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="98px" height="98px" viewBox="0 0 98 98" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>编组 7</title>
+    <defs>
+        <linearGradient x1="28.0360227%" y1="0%" x2="81.0837396%" y2="100%" id="linearGradient-1">
+            <stop stop-color="#FFA182" offset="0%"></stop>
+            <stop stop-color="#FB6337" offset="100%"></stop>
+        </linearGradient>
+        <filter id="filter-2">
+            <feColorMatrix in="SourceGraphic" type="matrix" values="0 0 0 0 1.000000 0 0 0 0 1.000000 0 0 0 0 1.000000 0 0 0 1.000000 0"></feColorMatrix>
+        </filter>
+        <filter x="-22.2%" y="-22.2%" width="144.4%" height="144.4%" filterUnits="objectBoundingBox" id="filter-3">
+            <feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feGaussianBlur stdDeviation="2" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.1035566 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+    </defs>
+    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="首页" transform="translate(-239.000000, -804.000000)">
+            <g id="编组-7" transform="translate(239.000000, 804.000000)">
+                <rect id="矩形备份-5" fill="url(#linearGradient-1)" x="0" y="0" width="98" height="98" rx="26"></rect>
+                <g filter="url(#filter-2)" id="peixunguanli">
+                    <g filter="url(#filter-3)" transform="translate(22.000000, 22.000000)">
+                        <path d="M50.3093762,0 L3.68989137,0 C2.71138904,0 1.7724369,0.388916041 1.08104,1.08105467 C0.388844554,1.77281797 0,2.71132812 0,3.68994142 L0,32.3100586 C0,33.2885742 0.388910767,34.2275391 1.08104,34.9196777 C1.77287283,35.6116754 2.7113821,36 3.68989137,36 L8.99987791,36 L8.99987791,26.8198242 C9.0167234,22.8500976 12.2298146,19.6362304 16.1994873,19.6201172 L19.799292,19.6201172 C22.221915,19.6312651 24.4765595,20.8598868 25.7992106,22.8896485 L34.5588575,14.1899414 C35.2487895,13.4099121 35.8786638,13.3198242 36.2390105,13.6794434 C36.5986247,14.0390625 36.5986247,14.6396484 35.9094251,15.4196777 L26.9996338,26.7297363 L26.9996338,36 L50.3093762,36 C51.2878786,36 52.2268307,35.611084 52.91896,34.9196777 C53.6110552,34.227548 54,33.28886 54,32.3100586 L54,3.68994142 C54,2.71142581 53.6110892,1.77246094 52.91896,1.08105467 C52.2267623,0.389065965 51.2881372,0 50.3093762,0 L50.3093762,0 Z M17.9997559,18.9902344 C15.9702424,18.9902344 14.1421422,17.7663574 13.3679827,15.890625 C12.5938233,14.0148925 13.0281436,11.8579101 14.4673331,10.4274902 C15.9065226,8.99707029 18.0664053,8.57592768 19.9369855,9.36108399 C21.8082979,10.1455078 23.0211722,11.9816895 23.0088161,14.010498 C22.9933405,16.7651367 20.7550896,18.9902344 17.9997559,18.9902344 L17.9997559,18.9902344 Z" id="形状" fill="#000000" fill-rule="nonzero"></path>
+                        <path d="M5.99991864,41.4902344 L8.99987791,41.4902344 C12.314042,41.4902344 14.9997965,44.1760254 14.9997965,47.4902344 L14.9997965,54 L0,54 L0,47.4602051 C0.0168454895,44.1577149 2.69820558,41.4902344 5.99991864,41.4902344 Z" id="路径" fill="#000000" fill-rule="nonzero" opacity="0.600000024"></path>
+                        <path d="M44.9993896,41.4902344 L47.999349,41.4902344 C51.3127806,41.4902344 53.9992676,44.1760254 53.9992676,47.4902344 L53.9992676,54 L38.9994711,54 L38.9994711,47.4602051 C39.0163165,44.1577149 41.6976766,41.4902344 44.9993896,41.4902344 Z" id="路径" fill="#000000" fill-rule="nonzero" opacity="0.600000024"></path>
+                        <path d="M25.4696253,41.4902344 L28.4695845,41.4902344 C31.7830162,41.4902344 34.4695032,44.1760254 34.4695032,47.4902344 L34.4695032,54 L19.4697066,54 L19.4697066,47.4602051 C19.4858197,44.1577149 22.1679122,41.4902344 25.4696253,41.4902344 L25.4696253,41.4902344 Z" id="路径" fill="#000000" fill-rule="nonzero" opacity="0.600000024"></path>
+                    </g>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>

+ 35 - 0
src/assets/images/home-menu-icon/home-menu-icon-7.svg

@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="98px" height="98px" viewBox="0 0 98 98" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>编组 8</title>
+    <defs>
+        <linearGradient x1="26.3343951%" y1="0%" x2="77.0049085%" y2="100%" id="linearGradient-1">
+            <stop stop-color="#7CD2FD" offset="0%"></stop>
+            <stop stop-color="#27B5FE" offset="100%"></stop>
+        </linearGradient>
+        <filter id="filter-2">
+            <feColorMatrix in="SourceGraphic" type="matrix" values="0 0 0 0 1.000000 0 0 0 0 1.000000 0 0 0 0 1.000000 0 0 0 1.000000 0"></feColorMatrix>
+        </filter>
+        <filter x="-18.2%" y="-26.1%" width="136.4%" height="152.2%" filterUnits="objectBoundingBox" id="filter-3">
+            <feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feGaussianBlur stdDeviation="2" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.100360577 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+    </defs>
+    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="首页" transform="translate(-415.000000, -804.000000)">
+            <g id="编组-8" transform="translate(415.000000, 804.000000)">
+                <rect id="矩形备份-6" fill="url(#linearGradient-1)" x="0" y="0" width="98" height="98" rx="26"></rect>
+                <g filter="url(#filter-2)" id="iconfont-xueli">
+                    <g filter="url(#filter-3)" transform="translate(16.000000, 26.000000)">
+                        <path d="M62.9225969,11.8295585 C56.2541377,8.90543738 42.8439416,3.55601259 36.978165,0.982128851 C33.6914752,-0.772307721 31.7955077,0.0663663986 28.2199889,1.6014984 C22.1744782,4.04219264 10.7632885,8.50708748 3.85799569,11.288541 C-1.43094482,13.4038665 -1.11105707,14.9809277 3.77204343,17.4681999 C11.1026853,21.1940758 25.8669647,26.914319 28.9680807,28.1635742 C32.0722247,29.4010496 34.3194415,29.4095798 37.4464686,27.9146168 C40.565147,26.4158626 45.0969549,24.4947473 59.1901838,18.318654 L59.1901838,27.4766395 L55.8686287,30.6833878 L60.715047,35.8319226 L65.5096863,30.5344918 L63.2049373,28.0874788 L63.2049373,16.4858202 C64.8272159,15.4039658 68.7339991,14.5193455 62.9225969,11.8295585 Z" id="形状" fill="#000000" fill-rule="nonzero"></path>
+                        <path d="M27.8345231,33.6191986 C22.5772469,31.4024125 18.2363767,29.7440204 14.3642859,27.8044004 L14.3642859,37.54276 C14.3642859,37.54276 20.986676,46 33.2604595,46 C44.657158,46 51.1340305,37.54276 51.1340305,37.54276 L51.1340305,26.3917612 C46.1252675,29.0376783 41.5358841,31.8905333 38.1235319,33.6192888 C35.1909031,35.5303844 31.0782151,35.0319731 27.8345231,33.6191986 Z" id="路径" fill="#000000" fill-rule="nonzero" opacity="0.600000024"></path>
+                    </g>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 18 - 0
src/assets/images/home-menu-icon/home-menu-icon-8.svg


+ 1 - 0
src/assets/styles/index.scss

@@ -0,0 +1 @@
+@import './reset.scss';

+ 138 - 0
src/assets/styles/reset.scss

@@ -0,0 +1,138 @@
+html,
+body,
+div,
+span,
+applet,
+object,
+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-family: PingFangSC;
+  font-weight: normal;
+  vertical-align: baseline;
+}
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+menu,
+nav,
+section {
+  display: block;
+}
+ol,
+ul,
+li {
+  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;
+}
+th,
+td {
+  vertical-align: middle;
+}
+a {
+  outline: none;
+  color: #16418a;
+  text-decoration: none;
+}
+a:focus {
+  outline: none;
+}
+input:focus,
+select:focus,
+textarea:focus {
+  outline: -webkit-focus-ring-color auto 0;
+}

+ 0 - 61
src/components/HelloWorld.vue

@@ -1,61 +0,0 @@
-<template>
-  <div class="hello">
-    <h1>{{ msg }}</h1>
-    <p>
-      For a guide and recipes on how to configure / customize this project,<br>
-      check out the
-      <a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>.
-    </p>
-    <h3>Installed CLI Plugins</h3>
-    <ul>
-      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li>
-      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-pwa" target="_blank" rel="noopener">pwa</a></li>
-      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-router" target="_blank" rel="noopener">router</a></li>
-      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-vuex" target="_blank" rel="noopener">vuex</a></li>
-      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint" target="_blank" rel="noopener">eslint</a></li>
-    </ul>
-    <h3>Essential Links</h3>
-    <ul>
-      <li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li>
-      <li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li>
-      <li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li>
-      <li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li>
-      <li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li>
-    </ul>
-    <h3>Ecosystem</h3>
-    <ul>
-      <li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li>
-      <li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li>
-      <li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li>
-      <li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li>
-      <li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li>
-    </ul>
-  </div>
-</template>
-
-<script>
-export default {
-  name: 'HelloWorld',
-  props: {
-    msg: String
-  }
-}
-</script>
-
-<!-- Add "scoped" attribute to limit CSS to this component only -->
-<style scoped lang="scss">
-h3 {
-  margin: 40px 0 0;
-}
-ul {
-  list-style-type: none;
-  padding: 0;
-}
-li {
-  display: inline-block;
-  margin: 0 10px;
-}
-a {
-  color: #42b983;
-}
-</style>

+ 132 - 0
src/layout/index.vue

@@ -0,0 +1,132 @@
+<!--
+ * @Description: 共有头部
+ * @Author: 空白格
+ * @Date: 2022-08-10 11:30:36
+ * @LastEditors: 空白格
+ * @LastEditTime: 2022-08-10 15:36:48
+ * @FilePath: \veterans_client_web\src\layout\index.vue
+ * @Copyright: Copyright (c) 2016~2022 by 空白格, All Rights Reserved.
+-->
+<template>
+  <el-container>
+    <el-header class="header" height="60px">
+      <div class="header-box">
+        <div class="header-box-left">贵州退役军人教育培训</div>
+        <div class="header-box-right">
+          <div class="header-box-right-search">
+            <el-input
+              placeholder="请输入搜索内容"
+              size="small"
+              v-model="searchValue"
+            >
+              <i slot="prefix" class="el-input__icon el-icon-search"></i>
+            </el-input>
+          </div>
+          <div class="header-box-right-user" v-if="userInfo.userName">
+            下午好,{{ userInfo.userName }}
+          </div>
+          <div class="header-box-right-user" v-else>
+            下午好,请<router-link class="link" to="/login">登录</router-link>
+          </div>
+        </div>
+      </div>
+    </el-header>
+    <el-main class="main">
+      <router-view />
+    </el-main>
+    <el-footer class="footer" height="100px">
+      <div class="footer-link">
+        <router-link class="link" to="">关于我们</router-link> |
+        <router-link class="link" to="">加入收藏</router-link> |
+        <router-link class="link" to="">隐私声明</router-link> |
+        <router-link class="link" to="">网站地图</router-link> |
+        <router-link class="link" to="">联系我们</router-link> |
+        <router-link class="link" to="">网站年报</router-link>
+      </div>
+      <div class="footer-organizer">
+        主办单位:贵州省退役军人事务厅、黔CP备19001516号-1
+        网站标识码:5200000143
+      </div>
+    </el-footer>
+  </el-container>
+</template>
+
+<script>
+import { mapState } from "vuex";
+export default {
+  name: "Layout",
+  data() {
+    return {
+      searchValue: "",
+    };
+  },
+  computed: {
+    ...mapState({
+      userInfo: (state) => state.user.userInfo,
+    }),
+  },
+  created() {
+    console.log(this.userInfo);
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.header {
+  background-color: #3d5d4c;
+  height: 60px;
+  &-box {
+    width: 70%;
+    min-width: 600px;
+    height: 60px;
+    margin: 0 auto;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    &-left {
+      color: #fff;
+      font-size: 20px;
+    }
+    &-right {
+      display: flex;
+      align-items: center;
+      &-search {
+        ::v-deep .el-input__inner {
+          border-radius: 100px !important;
+        }
+      }
+      &-user {
+        color: #fff;
+        margin-left: 30px;
+        .link {
+          color: #fff;
+        }
+      }
+    }
+  }
+}
+.main {
+  min-height: calc(100vh - 160px);
+  background-color: #f2f2f2;
+  padding: 0;
+}
+.footer {
+  background-color: #3d5d4c;
+  opacity: 0.7;
+  height: 100px;
+  text-align: center;
+  color: #fff;
+  font-size: 12px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  &-link {
+    line-height: 30px;
+    .link {
+      color: #fff;
+      margin: 0 5px;
+    }
+  }
+}
+</style>

+ 5 - 0
src/main.js

@@ -3,6 +3,11 @@ import App from './App.vue'
 import './registerServiceWorker'
 import router from './router'
 import store from './store'
+import '@/assets/styles/index.scss'
+import ElementUI from 'element-ui'
+import 'element-ui/lib/theme-chalk/index.css'
+
+Vue.use(ElementUI)
 
 Vue.config.productionTip = false
 

+ 16 - 9
src/router/index.js

@@ -1,26 +1,33 @@
 import Vue from 'vue'
 import VueRouter from 'vue-router'
-import HomeView from '../views/HomeView.vue'
+import Layout from '@/layout'
 
 Vue.use(VueRouter)
 
 const routes = [
   {
     path: '/',
-    name: 'home',
-    component: HomeView
+    component: Layout,
+    children: [
+      {
+        path: '',
+        name: 'Index',
+        component: () => import('@/views/Home/HomeIndex.vue'),
+        meta: {
+          title: '首页'
+        }
+      }
+    ]
   },
   {
-    path: '/about',
-    name: 'about',
-    // route level code-splitting
-    // this generates a separate chunk (about.[hash].js) for this route
-    // which is lazy-loaded when the route is visited.
-    component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')
+    path: '/login',
+    name: 'Login',
+    component: () => import('@/views/Login/LoginIndex.vue')
   }
 ]
 
 const router = new VueRouter({
+  mode: 'history',
   routes
 })
 

+ 4 - 0
src/store/getters.js

@@ -0,0 +1,4 @@
+const getters = {
+  userInfo: (state) => state.user.userInfo
+};
+export default getters;

+ 5 - 9
src/store/index.js

@@ -1,17 +1,13 @@
 import Vue from 'vue'
 import Vuex from 'vuex'
+import getters from './getters'
+import user from './modules/user'
 
 Vue.use(Vuex)
 
 export default new Vuex.Store({
-  state: {
-  },
-  getters: {
-  },
-  mutations: {
-  },
-  actions: {
-  },
   modules: {
-  }
+    user
+  },
+  getters
 })

+ 60 - 0
src/store/modules/user.js

@@ -0,0 +1,60 @@
+/**
+ * @Description: 用户模块
+ * @Author: 空白格
+ * @Date: 2022-08-10 13:40:53
+ * @LastEditors: 空白格
+ * @LastEditTime: 2022-08-10 15:19:32
+ * @FilePath: \veterans_client_web\src\store\modules\user.js
+ * @Copyright: Copyright (c) 2016~2022 by 空白格, All Rights Reserved.
+ */
+import { getToken } from "@/utils/auth"
+import { loginAuthCode, getAuthCode } from "@/api/Login";
+const user = {
+  state: {
+    token: getToken(),
+    isLogin: false,
+    userInfo: {
+      userName: 'xxx'
+    }
+  },
+  mutations: {
+    SET_TOKEN: (state, token) => {
+      state.token = token;
+    },
+    SET_LOGIN_FLAG: (state, flag) => {
+      state.isLogin = flag;
+    }
+  },
+  actions: {
+    // 登录验证验证码
+    Login({ commit, state }, userInfo) {
+      return new Promise((resolve, reject) => {
+        loginAuthCode({
+          accessToken: state.user.token,
+					userId: userInfo.userId,
+					code: userInfo.code
+        })
+          .then(res => {
+            commit('SET_LOGIN_FLAG', true)
+            resolve()
+          })
+          .catch((error) => {
+            reject(error)
+          })
+      })
+    },
+    GetLoginCode({ commit }) {
+      return new Promise((resolve, reject) => {
+        getAuthCode()
+          .then(res => {
+            commit('SET_TOKEN', res.accessToken)
+            resolve(res)
+          })
+          .catch((error) => {
+            reject(error)
+          })
+      })
+    }
+  }
+}
+export default user

+ 29 - 0
src/utils/auth.js

@@ -0,0 +1,29 @@
+import Cookies from 'js-cookie';
+
+const TokenKey = 'Vetervas-Client-Web-Token';
+
+const ExpiresInKey = 'Vetervas-Client-Web-Expires-In';
+
+export function getToken(keyValue) {
+  return Cookies.get(keyValue || TokenKey);
+}
+
+export function setToken(token, keyValue) {
+  return Cookies.set(keyValue || TokenKey, token);
+}
+
+export function removeToken(keyValue) {
+  return Cookies.remove(keyValue || TokenKey);
+}
+
+export function getExpiresIn(keyValue) {
+  return Cookies.get(keyValue || ExpiresInKey) || -1;
+}
+
+export function setExpiresIn(time, keyValue) {
+  return Cookies.set(keyValue || ExpiresInKey, time);
+}
+
+export function removeExpiresIn(keyValue) {
+  return Cookies.remove(keyValue || ExpiresInKey);
+}

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
src/utils/jsonlint.js


+ 97 - 0
src/utils/request.js

@@ -0,0 +1,97 @@
+import axios from 'axios';
+import { Notification, MessageBox, Message, Loading } from 'element-ui';
+import { getToken } from '@/utils/auth';
+import { tansParams } from '@/utils/utils'
+
+axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8';
+
+// 创建axios实例
+const service = axios.create({
+  // axios中请求配置有baseURL选项,表示请求URL公共部分
+  baseURL: '/api',
+  // 超时
+  timeout: 60000
+});
+
+// request拦截器
+service.interceptors.request.use(
+  (config) => {
+    // 不需要token验证标识
+    if (config.headers.noLoginFlag) {
+      config.headers['noLoginFlag'] = true;
+    }
+    // 是否需要设置 token
+    const isToken = (config.headers || {}).isToken === false;
+
+    // 让每个请求携带自定义token 请根据实际情况自行修改
+    if (getToken() && !isToken) {
+      config.headers['Authorization'] = `Bearer ${getToken()}`;
+    }
+    // url拼接时间戳参数
+    config.url = `${config.url}?_t=${new Date().getTime()}`;
+    // get请求映射params参数
+    if (config.method === 'get' && config.params) {
+      let url = config.url + '&' + tansParams(config.params);
+      url = url.slice(0, -1);
+      config.params = {};
+      config.url = url;
+    }
+    return config;
+  },
+  (error) => {
+    Promise.reject(error);
+  }
+);
+
+// 响应拦截器
+service.interceptors.response.use(
+  (res) => {
+    // 未设置状态码则默认成功状态
+    const code = res.data.code || 200;
+    // 鉴权校验
+    if (code === 400) {
+      MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
+        confirmButtonText: '重新登录',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+        .then(() => {
+
+        })
+        .catch(() => {
+          return Promise.reject('登录状态已过期,请重新登录。');
+        });
+    } else if (code === 500) {
+      Message({
+        message: msg,
+        type: 'error'
+      });
+      return Promise.reject(new Error(msg));
+    } else if (code !== 200) {
+      Notification.error({
+        title: res?.data?.msg
+      });
+      return Promise.reject('error');
+    } else {
+      return res.data;
+    }
+  },
+  (error) => {
+    let { message } = error;
+    if (message == 'Network Error') {
+      message = '后端接口连接异常';
+    } else if (message.includes('timeout')) {
+      message = '系统接口请求超时';
+    } else if (message.includes('Request failed with status code')) {
+      message = '系统接口' + message.substr(message.length - 3) + '异常';
+    }
+    Message({
+      message: message,
+      type: 'error',
+      duration: 5 * 1000
+    });
+    return Promise.reject(error);
+  }
+);
+
+export default service;

+ 89 - 0
src/utils/utils.js

@@ -0,0 +1,89 @@
+/**
+ * @Description:
+ * @Author: 空白格
+ * @Date: 2022-08-10 15:31:30
+ * @LastEditors: 空白格
+ * @LastEditTime: 2022-08-10 15:31:30
+ * @FilePath: \veterans_client_web\src\utils\utils.js
+ * @Copyright: Copyright (c) 2016~2022 by 空白格, All Rights Reserved.
+ */
+/**
+ * 参数处理
+ * @param {*} params  参数
+ */
+export function tansParams(params) {
+  let result = ''
+  for (const propName of Object.keys(params)) {
+    const value = params[propName]
+    var part = encodeURIComponent(propName) + '='
+    if (value !== null && value !== '' && typeof value !== 'undefined') {
+      if (typeof value === 'object') {
+        for (const key of Object.keys(value)) {
+          if (
+            value[key] !== null &&
+            value[key] !== '' &&
+            typeof value[key] !== 'undefined'
+          ) {
+            let params = propName + '[' + key + ']'
+            var subPart = encodeURIComponent(params) + '='
+            result += subPart + encodeURIComponent(value[key]) + '&'
+          }
+        }
+      } else {
+        result += part + encodeURIComponent(value) + '&'
+      }
+    }
+  }
+  return result
+}
+
+/**
+ * 日期格式化
+ * @param {*} time
+ * @param {*} pattern
+ * @returns
+ */
+export function parseTime(time, pattern) {
+  if (arguments.length === 0 || !time) {
+    return null
+  }
+  const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
+  let date
+  if (typeof time === 'object') {
+    date = time
+  } else {
+    if (typeof time === 'string' && /^[0-9]+$/.test(time)) {
+      time = parseInt(time)
+    } else if (typeof time === 'string') {
+      time = time
+        .replace(new RegExp(/-/gm), '/')
+        .replace('T', ' ')
+        .replace(new RegExp(/\.[\d]{3}/gm), '')
+    }
+    if (typeof time === 'number' && time.toString().length === 10) {
+      time = time * 1000
+    }
+    date = new Date(time)
+  }
+  const formatObj = {
+    y: date.getFullYear(),
+    m: date.getMonth() + 1,
+    d: date.getDate(),
+    h: date.getHours(),
+    i: date.getMinutes(),
+    s: date.getSeconds(),
+    a: date.getDay()
+  }
+  const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
+    let value = formatObj[key]
+    // Note: getDay() returns 0 on Sunday
+    if (key === 'a') {
+      return ['日', '一', '二', '三', '四', '五', '六'][value]
+    }
+    if (result.length > 0 && value < 10) {
+      value = '0' + value
+    }
+    return value || 0
+  })
+  return time_str
+}

+ 0 - 5
src/views/AboutView.vue

@@ -1,5 +0,0 @@
-<template>
-  <div class="about">
-    <h1>This is an about page</h1>
-  </div>
-</template>

+ 349 - 0
src/views/Home/HomeIndex.vue

@@ -0,0 +1,349 @@
+<!--
+ * @Description: 首页
+ * @Author: 空白格
+ * @Date: 2022-08-10 11:26:40
+ * @LastEditors: 空白格
+ * @LastEditTime: 2022-08-10 17:38:49
+ * @FilePath: \veterans_client_web\src\views\Home\HomeIndex.vue
+ * @Copyright: Copyright (c) 2016~2022 by 空白格, All Rights Reserved.
+-->
+<template>
+  <div class="home">
+    <!-- 轮播图 -->
+    <div class="home-carousel">
+      <el-carousel :interval="2000" arrow="always" height="500px">
+        <el-carousel-item v-for="(item, index) in bannerList" :key="index">
+          <el-image class="image" :src="item.bannerUrl" fit="fill">
+            <div slot="placeholder" class="image-slot">
+              加载图片中<span class="dot">...</span>
+            </div>
+          </el-image>
+        </el-carousel-item>
+      </el-carousel>
+    </div>
+    <div class="home-main">
+      <div class="home-main-box">
+        <!-- 菜单部分 -->
+        <el-row :gutter="30" class="home-main-menu">
+          <el-col
+            :xs="12"
+            :sm="8"
+            :md="6"
+            :lg="3"
+            :xl="3"
+            v-for="(menu, index) in menuList"
+            :key="index"
+          >
+            <div class="home-main-menu-icon">
+              <el-image class="image" :src="menu.icon"></el-image>
+            </div>
+            <div class="home-main-menu-name">{{ menu.name }}</div>
+          </el-col>
+        </el-row>
+        <!-- 新闻部分 -->
+        <el-row :gutter="30" class="home-main-news">
+          <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+            <div class="home-main-news-left">
+              <el-carousel :interval="100000" arrow="never" height="400px">
+                <el-carousel-item
+                  v-for="(item, index) in newsList"
+                  :key="index"
+                >
+                  <el-image
+                    class="image"
+                    :src="
+                      item.artImage ||
+                      require('@/assets/images/default-news.jpg')
+                    "
+                    fit="fill"
+                  >
+                    <div slot="placeholder" class="image-slot">
+                      加载图片中<span class="dot">...</span>
+                    </div>
+                    <div slot="error" class="image-slot">
+                      <el-image
+                        class="image"
+                        :src="require('@/assets/images/default-news.jpg')"
+                        fit="fill"
+                      ></el-image>
+                    </div>
+                  </el-image>
+                  <div class="title">
+                    {{ item.artTitle || "" }}
+                  </div>
+                </el-carousel-item>
+              </el-carousel>
+            </div>
+          </el-col>
+          <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+            <div class="home-main-news-right">
+              <el-tabs v-model="activeName" @tab-click="handleClick">
+                <el-tab-pane label="新闻动态" name="first">
+                  <ul class="news-infomation">
+                    <li
+                      class="news-infomation-item"
+                      v-for="(item, index) in newsList"
+                      :key="index"
+                    >
+                      <div class="title">{{ item.artTitle }}</div>
+                      <div class="date">
+                        {{ parseTime(item.createTime, "{y}-{m}-{d}") }}
+                      </div>
+                    </li>
+                  </ul>
+                </el-tab-pane>
+                <el-tab-pane label="通知公告" name="second">
+                  <ul class="news-infomation">
+                    <li
+                      class="news-infomation-item"
+                      v-for="(item, index) in noticeList"
+                      :key="index"
+                    >
+                      <div class="title">{{ item.content }}</div>
+                      <div class="date">
+                        {{ parseTime(item.releasTime, "{y}-{m}-{d}") }}
+                      </div>
+                    </li>
+                  </ul>
+                </el-tab-pane>
+              </el-tabs>
+            </div>
+          </el-col>
+        </el-row>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { parseTime } from "@/utils/utils";
+import { getBannerList, getNewsList, getNoticeList } from "@/api/Home";
+export default {
+  name: "HomeIndex",
+  data() {
+    return {
+      bannerList: [],
+      menuList: [
+        {
+          name: "政策咨询",
+          icon: require("@/assets/images/home-menu-icon/home-menu-icon-1.svg"),
+        },
+        {
+          name: "招聘就业",
+          icon: require("@/assets/images/home-menu-icon/home-menu-icon-2.svg"),
+        },
+        {
+          name: "合作企业",
+          icon: require("@/assets/images/home-menu-icon/home-menu-icon-3.svg"),
+        },
+        {
+          name: "合作院校",
+          icon: require("@/assets/images/home-menu-icon/home-menu-icon-4.svg"),
+        },
+        {
+          name: "技能培训",
+          icon: require("@/assets/images/home-menu-icon/home-menu-icon-5.svg"),
+        },
+        {
+          name: "适应性培训",
+          icon: require("@/assets/images/home-menu-icon/home-menu-icon-6.svg"),
+        },
+        {
+          name: "学历提升",
+          icon: require("@/assets/images/home-menu-icon/home-menu-icon-7.svg"),
+        },
+        {
+          name: "创业指引",
+          icon: require("@/assets/images/home-menu-icon/home-menu-icon-8.svg"),
+        },
+      ],
+      newsList: [],
+      noticeList: [],
+      activeName: "first",
+      parseTime: parseTime,
+    };
+  },
+  created() {
+    this.initData();
+  },
+  methods: {
+    initData() {
+      this.getBanner();
+      this.getNews();
+      this.getNotice();
+    },
+    /**
+     * 获取轮播图
+     * @date 2022-08-10
+     * @returns {any}
+     */
+    getBanner() {
+      getBannerList({ type: 0 }).then((res) => {
+        this.bannerList = res.data;
+      });
+    },
+    /**
+     * 获取新闻
+     * @date 2022-08-10
+     * @returns {any}
+     */
+    getNews() {
+      getNewsList({
+        artCategoryId: 2,
+        pageNum: 1,
+        pageSize: 5,
+      }).then((res) => {
+        this.newsList = res.rows;
+      });
+    },
+    /**
+     * 获取公告
+     * @date 2022-08-10
+     * @returns {any}
+     */
+    getNotice() {
+      getNoticeList().then((res) => {
+        this.noticeList = res.data;
+      });
+    }
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.home {
+  &-carousel {
+    .image {
+      width: 100%;
+      height: 100%;
+    }
+    .image-slot {
+      line-height: 500px;
+      text-align: center;
+    }
+    ::v-deep .el-carousel__indicators {
+      // 指示器
+      bottom: 6%;
+    }
+    ::v-deep .el-carousel__button {
+      // 指示器按钮
+      width: 10px;
+      height: 10px;
+      border: none;
+      border-radius: 50%;
+      background-color: #fff;
+    }
+    ::v-deep .is-active .el-carousel__button {
+      // 指示器激活按钮
+      width: 20px;
+      border-radius: 10px;
+    }
+  }
+  &-main {
+    width: 70%;
+    margin: 0 auto;
+    min-width: 600px;
+    position: relative;
+    &-box {
+      width: 100%;
+      position: absolute;
+      top: -30px;
+      z-index: 1000;
+    }
+    &-menu {
+      width: 100%;
+      background-color: #fff;
+      padding: 30px 30px 0;
+      border-radius: 5px;
+      &-icon {
+        text-align: center;
+        .image {
+          width: 98px;
+          height: 98px;
+        }
+      }
+      &-name {
+        text-align: center;
+        margin-top: 20px;
+        margin-bottom: 30px;
+      }
+    }
+    &-news {
+      width: 100%;
+      background-color: #fff;
+      padding: 30px;
+      border-radius: 5px;
+      margin-top: 30px;
+      &-left {
+        .image {
+          width: 100%;
+          height: 100%;
+          border-radius: 5px;
+        }
+        .title {
+          width: calc(100% - 40px);
+          height: 40px;
+          line-height: 40px;
+          padding: 0 20px;
+          background-color: rgba($color: #000000, $alpha: 0.3);
+          color: #fff;
+          white-space: nowrap;
+          overflow: hidden;
+          text-overflow: ellipsis;
+          word-break: break-all;
+          position: absolute;
+          bottom: 0;
+        }
+        ::v-deep .el-carousel__indicators {
+          // 指示器
+          left: auto;
+          right: -20px;
+        }
+        ::v-deep .el-carousel__button {
+          // 指示器按钮
+          width: 10px;
+          height: 10px;
+          border: none;
+          border-radius: 50%;
+          background-color: #fff;
+        }
+        ::v-deep .is-active .el-carousel__button {
+          // 指示器激活按钮
+          width: 20px;
+          border-radius: 10px;
+          background-color: #f00;
+        }
+      }
+      &-right {
+        .news-infomation {
+          &-item {
+            display: flex;
+            justify-content: space-between;
+            margin-bottom: 10px;
+            font-size: 14px;
+            cursor: pointer;
+            &:hover {
+              text-decoration: underline;
+            }
+            .title {
+              width: 80%;
+              white-space: nowrap;
+              overflow: hidden;
+              text-overflow: ellipsis;
+              word-break: break-all;
+            }
+            .date {
+              width: 20%;
+              white-space: nowrap;
+              overflow: hidden;
+              text-overflow: ellipsis;
+              word-break: break-all;
+              text-align: right;
+            }
+          }
+        }
+      }
+    }
+  }
+}
+</style>

+ 0 - 18
src/views/HomeView.vue

@@ -1,18 +0,0 @@
-<template>
-  <div class="home">
-    <img alt="Vue logo" src="../assets/logo.png">
-    <HelloWorld msg="Welcome to Your Vue.js App"/>
-  </div>
-</template>
-
-<script>
-// @ is an alias to /src
-import HelloWorld from '@/components/HelloWorld.vue'
-
-export default {
-  name: 'HomeView',
-  components: {
-    HelloWorld
-  }
-}
-</script>

+ 12 - 0
src/views/Login/LoginIndex.vue

@@ -0,0 +1,12 @@
+<!--
+ * @Description: 登录页
+ * @Author: 空白格
+ * @Date: 2022-08-10 11:45:16
+ * @LastEditors: 空白格
+ * @LastEditTime: 2022-08-10 11:45:16
+ * @FilePath: \veterans_client_web\src\views\Login\LoginIndex.vue
+ * @Copyright: Copyright (c) 2016~2022 by 空白格, All Rights Reserved.
+-->
+<template>
+  <div>登录页</div>
+</template>

+ 16 - 1
vue.config.js

@@ -1,5 +1,20 @@
 const { defineConfig } = require('@vue/cli-service')
+let port = 9010
 module.exports = defineConfig({
   transpileDependencies: true,
-  lintOnSave: false
+  lintOnSave: false,
+  devServer: {
+    host: '0.0.0.0',
+    port,
+    proxy: {
+      // 开发模式请求基础api反代理
+      '/api': {
+        target: `https://wx.hw.hongweisoft.com/veterans`,
+        changeOrigin: true,
+        pathRewrite: {
+          '^/api': ''
+        }
+      }
+    }
+  }
 })

+ 99 - 3
yarn.lock

@@ -1986,6 +1986,13 @@ astral-regex@^2.0.0:
   resolved "https://registry.npmmirror.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
   integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
 
+async-validator@~1.8.1:
+  version "1.8.5"
+  resolved "https://registry.npmmirror.com/async-validator/-/async-validator-1.8.5.tgz#dc3e08ec1fd0dddb67e60842f02c0cd1cec6d7f0"
+  integrity sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==
+  dependencies:
+    babel-runtime "6.x"
+
 async@^2.6.4:
   version "2.6.4"
   resolved "https://registry.npmmirror.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221"
@@ -1998,6 +2005,11 @@ async@^3.2.3:
   resolved "https://registry.npmmirror.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c"
   integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==
 
+asynckit@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+  integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
+
 at-least-node@^1.0.0:
   version "1.0.0"
   resolved "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
@@ -2015,6 +2027,19 @@ autoprefixer@^10.2.4:
     picocolors "^1.0.0"
     postcss-value-parser "^4.2.0"
 
+axios@^0.27.2:
+  version "0.27.2"
+  resolved "https://registry.npmmirror.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972"
+  integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==
+  dependencies:
+    follow-redirects "^1.14.9"
+    form-data "^4.0.0"
+
+babel-helper-vue-jsx-merge-props@^2.0.0:
+  version "2.0.3"
+  resolved "https://registry.npmmirror.com/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz#22aebd3b33902328e513293a8e4992b384f9f1b6"
+  integrity sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg==
+
 babel-loader@^8.2.2:
   version "8.2.5"
   resolved "https://registry.npmmirror.com/babel-loader/-/babel-loader-8.2.5.tgz#d45f585e654d5a5d90f5350a779d7647c5ed512e"
@@ -2056,6 +2081,14 @@ babel-plugin-polyfill-regenerator@^0.4.0:
   dependencies:
     "@babel/helper-define-polyfill-provider" "^0.3.2"
 
+babel-runtime@6.x:
+  version "6.26.0"
+  resolved "https://registry.npmmirror.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+  integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==
+  dependencies:
+    core-js "^2.4.0"
+    regenerator-runtime "^0.11.0"
+
 balanced-match@^1.0.0:
   version "1.0.2"
   resolved "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
@@ -2393,6 +2426,13 @@ colorette@^2.0.10:
   resolved "https://registry.npmmirror.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798"
   integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==
 
+combined-stream@^1.0.8:
+  version "1.0.8"
+  resolved "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+  integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+  dependencies:
+    delayed-stream "~1.0.0"
+
 commander@^2.20.0:
   version "2.20.3"
   resolved "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
@@ -2504,6 +2544,11 @@ core-js-compat@^3.21.0, core-js-compat@^3.22.1, core-js-compat@^3.8.3:
     browserslist "^4.21.3"
     semver "7.0.0"
 
+core-js@^2.4.0:
+  version "2.6.12"
+  resolved "https://registry.npmmirror.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
+  integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
+
 core-js@^3.8.3:
   version "3.24.1"
   resolved "https://registry.npmmirror.com/core-js/-/core-js-3.24.1.tgz#cf7724d41724154010a6576b7b57d94c5d66e64f"
@@ -2711,7 +2756,7 @@ deep-is@^0.1.3:
   resolved "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
   integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
 
-deepmerge@^1.5.2:
+deepmerge@^1.2.0, deepmerge@^1.5.2:
   version "1.5.2"
   resolved "https://registry.npmmirror.com/deepmerge/-/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753"
   integrity sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==
@@ -2748,6 +2793,11 @@ define-properties@^1.1.3, define-properties@^1.1.4:
     has-property-descriptors "^1.0.0"
     object-keys "^1.1.1"
 
+delayed-stream@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+  integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
+
 depd@2.0.0:
   version "2.0.0"
   resolved "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
@@ -2883,6 +2933,18 @@ electron-to-chromium@^1.4.202:
   resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.213.tgz#a0d0f535e4fbddc25196c91ff2964b5660932297"
   integrity sha512-+3DbGHGOCHTVB/Ms63bGqbyC1b8y7Fk86+7ltssB8NQrZtSCvZG6eooSl9U2Q0yw++fL2DpHKOdTU0NVEkFObg==
 
+element-ui@^2.15.9:
+  version "2.15.9"
+  resolved "https://registry.npmmirror.com/element-ui/-/element-ui-2.15.9.tgz#b03548e007b7ab7496c49a282db92a0fffd7efc7"
+  integrity sha512-dx45nQLt4Hn87/Z9eRr3ex6KFZbxlFAwEU3QoW3wA5EsYftvHTyL9Pq7VnXXD7hu1Eiaup2jcs6kp+/VSFmXuA==
+  dependencies:
+    async-validator "~1.8.1"
+    babel-helper-vue-jsx-merge-props "^2.0.0"
+    deepmerge "^1.2.0"
+    normalize-wheel "^1.0.1"
+    resize-observer-polyfill "^1.5.0"
+    throttle-debounce "^1.0.1"
+
 emoji-regex@^8.0.0:
   version "8.0.0"
   resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
@@ -3492,11 +3554,20 @@ flatted@^3.1.0:
   resolved "https://registry.npmmirror.com/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2"
   integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==
 
-follow-redirects@^1.0.0:
+follow-redirects@^1.0.0, follow-redirects@^1.14.9:
   version "1.15.1"
   resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5"
   integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==
 
+form-data@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
+  integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "^1.0.8"
+    mime-types "^2.1.12"
+
 forwarded@0.2.0:
   version "0.2.0"
   resolved "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
@@ -4218,6 +4289,11 @@ joi@^17.4.0:
     "@sideway/formula" "^3.0.0"
     "@sideway/pinpoint" "^2.0.0"
 
+js-cookie@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/js-cookie/-/js-cookie-3.0.1.tgz#9e39b4c6c2f56563708d7d31f6f5f21873a92414"
+  integrity sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==
+
 js-message@1.0.7:
   version "1.0.7"
   resolved "https://registry.npmmirror.com/js-message/-/js-message-1.0.7.tgz#fbddd053c7a47021871bb8b2c95397cc17c20e47"
@@ -4553,7 +4629,7 @@ mime-db@1.52.0, "mime-db@>= 1.43.0 < 2":
   resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
   integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
 
-mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34:
+mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34:
   version "2.1.35"
   resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
   integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
@@ -4742,6 +4818,11 @@ normalize-url@^6.0.1:
   resolved "https://registry.npmmirror.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a"
   integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==
 
+normalize-wheel@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/normalize-wheel/-/normalize-wheel-1.0.1.tgz#aec886affdb045070d856447df62ecf86146ec45"
+  integrity sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA==
+
 npm-run-path@^2.0.0:
   version "2.0.2"
   resolved "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
@@ -5479,6 +5560,11 @@ regenerate@^1.4.2:
   resolved "https://registry.npmmirror.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a"
   integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==
 
+regenerator-runtime@^0.11.0:
+  version "0.11.1"
+  resolved "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+  integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
+
 regenerator-runtime@^0.13.4:
   version "0.13.9"
   resolved "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"
@@ -5565,6 +5651,11 @@ requires-port@^1.0.0:
   resolved "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
   integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==
 
+resize-observer-polyfill@^1.5.0:
+  version "1.5.1"
+  resolved "https://registry.npmmirror.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464"
+  integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==
+
 resolve-from@^4.0.0:
   version "4.0.0"
   resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
@@ -6249,6 +6340,11 @@ thread-loader@^3.0.0:
     neo-async "^2.6.2"
     schema-utils "^3.0.0"
 
+throttle-debounce@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/throttle-debounce/-/throttle-debounce-1.1.0.tgz#51853da37be68a155cb6e827b3514a3c422e89cd"
+  integrity sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg==
+
 thunky@^1.0.2:
   version "1.1.0"
   resolved "https://registry.npmmirror.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d"

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно