wqb2017 5 rokov pred
rodič
commit
c6112264ca
53 zmenil súbory, kde vykonal 1221 pridanie a 127 odobranie
  1. 6 1
      package.json
  2. 8 1
      public/index.html
  3. 14 22
      src/App.vue
  4. 9 0
      src/assets/css/element-variables.scss
  5. 6 0
      src/assets/css/function.scss
  6. 62 0
      src/assets/css/mixin.scss
  7. 11 0
      src/assets/css/theme.scss
  8. BIN
      src/assets/images/logo.jpg
  9. BIN
      src/assets/logo.png
  10. 0 58
      src/components/HelloWorld.vue
  11. 36 0
      src/components/header/index.scss
  12. 61 0
      src/components/header/index.vue
  13. 28 0
      src/components/main/index.scss
  14. 43 0
      src/components/main/index.vue
  15. 0 0
      src/components/navbar/index.scss
  16. 69 0
      src/components/navbar/index.vue
  17. 12 0
      src/components/panel-card/index.vue
  18. 27 0
      src/components/tags-nav/index.scss
  19. 41 0
      src/components/tags-nav/index.vue
  20. BIN
      src/components/tips-card/images/hldbl@2x.png
  21. BIN
      src/components/tips-card/images/hldbl@3x.png
  22. 24 0
      src/components/tips-card/index.vue
  23. 15 1
      src/main.js
  24. 9 0
      src/route/_import.js
  25. 43 0
      src/route/index.js
  26. 38 0
      src/route/permis-list.js
  27. 8 0
      src/route/routes.js
  28. 37 0
      src/route/white-list.js
  29. 0 23
      src/router.js
  30. 0 16
      src/store.js
  31. 18 0
      src/store/index.js
  32. 68 0
      src/store/menu.js
  33. BIN
      src/views/index/components/entrance-guard/images/logo@2x.png
  34. BIN
      src/views/index/components/entrance-guard/images/logo@3x.png
  35. BIN
      src/views/index/components/entrance-guard/images/zhnmj@2x.png
  36. BIN
      src/views/index/components/entrance-guard/images/zhnmj@3x.png
  37. 73 0
      src/views/index/components/entrance-guard/index.scss
  38. 33 0
      src/views/index/components/entrance-guard/index.vue
  39. BIN
      src/views/index/components/parking/images/logo@2x.png
  40. BIN
      src/views/index/components/parking/images/logo@3x.png
  41. BIN
      src/views/index/components/parking/images/zhntch@2x.png
  42. BIN
      src/views/index/components/parking/images/zhntch@3x.png
  43. 73 0
      src/views/index/components/parking/index.scss
  44. 33 0
      src/views/index/components/parking/index.vue
  45. 75 0
      src/views/index/components/statistical/index.vue
  46. BIN
      src/views/index/components/title/images/dbl@2x.png
  47. BIN
      src/views/index/components/title/images/dbl@3x.png
  48. 34 0
      src/views/index/components/title/index.scss
  49. 21 0
      src/views/index/components/title/index.vue
  50. 30 0
      src/views/index/index.scss
  51. 46 0
      src/views/index/index.vue
  52. 20 0
      src/views/not-found/index.vue
  53. 90 5
      yarn.lock

+ 6 - 1
package.json

@@ -8,7 +8,10 @@
     "lint": "vue-cli-service lint"
   },
   "dependencies": {
+    "babel-polyfill": "^6.26.0",
     "core-js": "^2.6.5",
+    "element-ui": "^2.12.0",
+    "reset.css": "^2.0.2",
     "vue": "^2.6.10",
     "vue-router": "^3.0.3",
     "vuex": "^3.0.1"
@@ -20,7 +23,9 @@
     "@vue/eslint-config-standard": "^4.0.0",
     "babel-eslint": "^10.0.1",
     "eslint": "^5.16.0",
-    "eslint-plugin-vue": "^5.0.0",
+    "eslint-plugin-cypress": "^2.6.1",
+    "eslint-plugin-html": "^6.0.0",
+    "eslint-plugin-vue": "^5.2.3",
     "node-sass": "^4.9.0",
     "sass-loader": "^7.1.0",
     "vue-template-compiler": "^2.6.10"

+ 8 - 1
public/index.html

@@ -1,3 +1,10 @@
+<!--
+ * @Author: WangQiBiao
+ * @Date: 2019-09-24 17:50:53
+ * @LastEditors: WangQiBiao
+ * @LastEditTime: 2019-09-25 09:15:31
+ * @Description:
+ -->
 <!DOCTYPE html>
 <html lang="en">
   <head>
@@ -5,7 +12,7 @@
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta name="viewport" content="width=device-width,initial-scale=1.0">
     <link rel="icon" href="<%= BASE_URL %>favicon.ico">
-    <title>saas-datascreen</title>
+    <title>绘享云</title>
   </head>
   <body>
     <noscript>

+ 14 - 22
src/App.vue

@@ -1,29 +1,21 @@
+<!--
+ * @Author: WangQiBiao
+ * @Date: 2019-09-24 17:50:53
+ * @LastEditors: WangQiBiao
+ * @LastEditTime: 2019-09-24 18:40:54
+ * @Description:
+ -->
 <template>
   <div id="app">
-    <div id="nav">
-      <router-link to="/">Home</router-link> |
-      <router-link to="/about">About</router-link>
-    </div>
     <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 lang="scss" scoped>
+#app{
+  background: #0748A2 url('./assets/images/logo.jpg');
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  width: 100vw;
+  height: 100vh;
 }
 </style>

+ 9 - 0
src/assets/css/element-variables.scss

@@ -0,0 +1,9 @@
+@import './theme.scss';
+
+/* 改变主题色变量 */
+$--color-primary: $primary-color;
+
+/* 改变 icon 字体路径变量,必需 */
+$--font-path: '~element-ui/lib/theme-chalk/fonts';
+
+@import "~element-ui/packages/theme-chalk/src/index";

+ 6 - 0
src/assets/css/function.scss

@@ -0,0 +1,6 @@
+@function halfW($num) {
+  @return ($num / 1920) * 100 + vw;
+}
+@function halfH($num) {
+  @return ($num / 1080) * 100 + vh;
+}

+ 62 - 0
src/assets/css/mixin.scss

@@ -0,0 +1,62 @@
+@import './theme.scss';
+/**
+ * 对于部分不兼容的样式,可以通过 mixins 统一处理
+ */
+
+/**
+ *
+ * $dir 方位: bottom top left right
+ * $width 高度大小: 1px
+ * $style 显示类型: solid
+ * $color 颜色: #e5e5e5
+ * 列子: border(bottom, 1px, solid, #e5e5e5);
+ */
+@mixin border($width: 1px, $style: solid, $color: $divider-color) {
+  border: $width $style $color
+}
+@mixin border-divider ($dir: 'bottom', $width: 1px, $style: solid, $color: $divider-color) {
+  #{border-#{$dir}}: $width $style $color;
+}
+/**
+* 1px 分割线
+*/
+@mixin border-divider-box ($width: 1px, $color: $divider-color) {
+  border: $width solid $color;
+}
+
+/**
+ * NOTE 单行省略
+ */
+@mixin text-ellipsis() {
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+
+/**
+ * NOTE 多行文本省略
+ */
+@mixin lamp-clamp($line) {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  display: -webkit-box;
+  -webkit-line-clamp: $line;
+  -webkit-box-orient: vertical;
+}
+/**
+* 清除浮动
+*/
+@mixin clearBox() {
+  zoom: 1;
+  &:after{
+    content:"";
+    display:block;
+    visibility:hidden;
+    clear:both;
+    height:0;
+  }
+}
+// 阴影
+@mixin boxShadow() {
+  box-shadow: 0px 2px 8px 0px rgba(0, 0, 0, 0.1);
+}

+ 11 - 0
src/assets/css/theme.scss

@@ -0,0 +1,11 @@
+
+// 主题色
+$primary-color: #0080FF;
+// 菜单颜色
+$menu-color: #072848;
+// 背景色
+$bg-color: #f8f8f8;
+// divider 分割线
+$divider-color: #f1f1f1;
+// 菜单宽度
+$left-width: 220px;

BIN
src/assets/images/logo.jpg


BIN
src/assets/logo.png


+ 0 - 58
src/components/HelloWorld.vue

@@ -1,58 +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-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>

+ 36 - 0
src/components/header/index.scss

@@ -0,0 +1,36 @@
+@import '@/assets/css/mixin';
+
+.header{
+  @include clearBox;
+  position: relative;
+  .header-logo{
+    float: left;
+    &.mini-logo{
+      width: 60px;
+      height: 60px;
+    }
+  }
+  .menu-collapse{
+    padding: 15px 10px;
+    font-size: 30px;
+    color: #797979;
+    font-weight: 300;
+    cursor: pointer;
+  }
+  .header-right{
+    position: absolute;
+    right: 20px;
+    top: 0;
+    .user-sec{
+      line-height: 60px;
+      cursor: pointer;
+      .user-sec-name{
+        padding-right: 8px;
+        font-size: 12px;
+      }
+      .user-sec-avatar{
+        border-radius: 50%;
+      }
+    }
+  }
+}

+ 61 - 0
src/components/header/index.vue

@@ -0,0 +1,61 @@
+<!--
+ * @Author: WangQiBiao
+ * @Date: 2019-09-18 15:47:50
+ * @LastEditors: WangQiBiao
+ * @LastEditTime: 2019-09-20 16:53:19
+ * @Description:
+ -->
+<template>
+  <div class="header">
+    <img :class="['header-logo', isCollapse ? 'mini-logo' : 'big-logo']" src="https://via.placeholder.com/220x60" alt="">
+    <i :class="['menu-collapse', isCollapse ? 'el-icon-s-unfold' : 'el-icon-s-fold']" @click="handleIsCollapse"></i>
+    <div class="header-right">
+      <div class="user-sec">
+        <el-dropdown>
+          <span class="el-dropdown-link">
+            <span class="user-sec-name">钢铁虾</span>
+            <img class="user-sec-avatar" src="https://via.placeholder.com/30x30" alt="">
+            <i class="el-icon-caret-bottom el-icon--right"></i>
+          </span>
+          <el-dropdown-menu slot="dropdown">
+            <el-dropdown-item>修改密码</el-dropdown-item>
+            <el-dropdown-item @click.native="exitLogin">退出登录</el-dropdown-item>
+          </el-dropdown-menu>
+        </el-dropdown>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import { mapState, mapActions } from 'vuex'
+export default {
+  computed: {
+    ...mapState('menu', {
+      isCollapse: state => state.isCollapse
+    })
+  },
+  methods: {
+    ...mapActions([
+      'menu/handleIsCollapse',
+      'menu/handleClearPermisStorage'
+    ]),
+    /**
+     * 展开伸缩菜单
+     */
+    handleIsCollapse () {
+      this['menu/handleIsCollapse'](!this.isCollapse)
+    },
+    /**
+     * 退出登录
+     */
+    exitLogin () {
+      this['menu/handleClearPermisStorage']()
+      this.$router.push({ path: '/' })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+@import './index.scss';
+</style>

+ 28 - 0
src/components/main/index.scss

@@ -0,0 +1,28 @@
+@import '@/assets/css/theme';
+@import '@/assets/css/mixin';
+
+.main{
+  .main-left{
+    width: $left-width;
+    background: $menu-color;
+    color: #fff;
+    float: left;
+    position: fixed;
+    top: 60px;
+    left: 0;
+    bottom: 0;
+  }
+  .main-header{
+    background: #fff;
+    position: fixed;
+    top: 0;
+    left: 0;
+    right: 0;
+    padding: 0;
+    @include border-divider(bottom, 5px, solid, $primary-color);
+  }
+  .main-index{
+    padding-left: $left-width;
+    padding-top: 65px;
+  }
+}

+ 43 - 0
src/components/main/index.vue

@@ -0,0 +1,43 @@
+<!--
+ * @Author: WangQiBiao
+ * @Date: 2019-09-18 12:37:05
+ * @LastEditors: WangQiBiao
+ * @LastEditTime: 2019-09-19 20:57:54
+ * @Description:
+ -->
+<template>
+  <el-container class="main">
+    <el-header class="main-header" style="height: 65px">
+      <HeaderCom/>
+    </el-header>
+    <el-aside class="main-left" :style="[{width: isCollapse ? '60px' : '220px'}]">
+      <NavbarCom/>
+    </el-aside>
+    <el-main class="main-index" :style="[{'padding-right': 0, 'padding-left': isCollapse ? '60px' : ''}]">
+      <TagsNavCom/>
+      <router-view />
+    </el-main>
+  </el-container>
+</template>
+<script>
+import NavbarCom from '@/components/navbar'
+import HeaderCom from '@/components/header'
+import TagsNavCom from '@/components/tags-nav'
+import { mapState } from 'vuex'
+export default {
+  components: {
+    NavbarCom,
+    HeaderCom,
+    TagsNavCom
+  },
+  computed: {
+    ...mapState('menu', {
+      isCollapse: state => state.isCollapse
+    })
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+@import "./index.scss";
+</style>

+ 0 - 0
src/components/navbar/index.scss


+ 69 - 0
src/components/navbar/index.vue

@@ -0,0 +1,69 @@
+<!--
+ * @Author: WangQiBiao
+ * @Date: 2019-09-18 14:35:18
+ * @LastEditors: WangQiBiao
+ * @LastEditTime: 2019-09-20 16:00:14
+ * @Description: 菜单
+ -->
+<template>
+  <div class="navbar">
+    <el-menu
+      :router="true"
+      :default-active="defaultActive"
+      background-color="#072848"
+      text-color="#fff"
+      active-text-color="#1890ff"
+      :collapse="isCollapse"
+      :collapse-transition="false"
+      style="width: 100%;"
+    >
+      <el-submenu
+        v-for="(menu, index) in permisList"
+        :key="index"
+        :index="menu.path"
+      >
+        <template slot="title">
+          <i class="el-icon-message"></i>
+          <span>{{menu.meta.title}}</span>
+        </template>
+        <el-menu-item
+          v-for="(child, childIdx) in menu.children"
+          :key="childIdx"
+          :index="'/' + menu.path + '/' +child.path"
+          style="padding-left: 50px;"
+        >{{child.meta.title}}</el-menu-item>
+      </el-submenu>
+    </el-menu>
+  </div>
+</template>
+<script>
+import { mapState } from 'vuex'
+export default {
+  components: {
+  },
+  data () {
+    return {
+      defaultActive: ''
+    }
+  },
+  computed: {
+    ...mapState('menu', {
+      isCollapse: state => state.isCollapse,
+      permisList: state => state.permisList
+    })
+  },
+  watch: {
+    '$route': {
+      immediate: true,
+      handler (route) {
+        if (route) {
+          this.defaultActive = route.path
+        }
+      }
+    }
+  }
+}
+</script>
+<style lang="scss">
+@import './index.scss';
+</style>

+ 12 - 0
src/components/panel-card/index.vue

@@ -0,0 +1,12 @@
+<!--
+ * @Author: WangQiBiao
+ * @Date: 2019-09-25 09:39:11
+ * @LastEditors: WangQiBiao
+ * @LastEditTime: 2019-09-25 09:40:16
+ * @Description:
+ -->
+<template>
+  <div class="panel-card">
+    <div></div>
+  </div>
+</template>

+ 27 - 0
src/components/tags-nav/index.scss

@@ -0,0 +1,27 @@
+@import '@/assets/css/mixin.scss';
+
+.tags-nav{
+  width: 100%;
+  height: 40px;
+  // line-height: 40px;
+  background: #ddd;
+  @include boxShadow;
+  position: relative;
+  overflow: hidden;
+  user-select: none;
+  .tags-nav-scroll{
+    position: absolute;
+    .tags-nav-item{
+      float: left;
+      cursor: pointer;
+      background: #fff;
+      padding: 0 20px;
+      line-height: 40px;
+      color: #333;
+      margin-right: 1px;
+      .tags-nav-item-txt{
+        padding-right: 8px;
+      }
+    }
+  }
+}

+ 41 - 0
src/components/tags-nav/index.vue

@@ -0,0 +1,41 @@
+<!--
+ * @Author: WangQiBiao
+ * @Date: 2019-09-19 20:45:29
+ * @LastEditors: WangQiBiao
+ * @LastEditTime: 2019-09-20 17:58:50
+ * @Description:
+ -->
+<template>
+  <div class="tags-nav" id="tagsNav" ref="tagsNav">
+    <div class="tags-nav-scroll" :style="{left: scrollLeft + 'px'}">
+      <div class="tags-nav-item" v-for="(item, index) in 20" :key="index" @click="onClickNav">
+        <span class="tags-nav-item-txt">标签 {{index+1}}</span>
+        <i class="el-icon-close"></i>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+export default {
+  data () {
+    return {
+      scrollLeft: 0
+    }
+  },
+  methods: {
+    onClickNav (e) {
+      // console.log(window.screen.width)
+      const tagsNavWidth = this.$refs.tagsNav.clientWidth
+      const curNodeX = e.clientX
+      // console.log(curNodeX, tagsNavWidth, e)
+      if (curNodeX > tagsNavWidth) {
+        this.scrollLeft = tagsNavWidth - curNodeX - 200
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+@import './index.scss';
+</style>

BIN
src/components/tips-card/images/hldbl@2x.png


BIN
src/components/tips-card/images/hldbl@3x.png


+ 24 - 0
src/components/tips-card/index.vue

@@ -0,0 +1,24 @@
+<!--
+ * @Author: WangQiBiao
+ * @Date: 2019-09-24 18:38:32
+ * @LastEditors: WangQiBiao
+ * @LastEditTime: 2019-09-25 11:28:30
+ * @Description:
+ -->
+<template>
+  <div class="tips-card">
+    <slot></slot>
+  </div>
+</template>
+<style lang="scss" scoped>
+@import "@/assets/css/function.scss";
+.tips-card {
+  width: halfW(360);
+  height: halfH(150);
+  background: url('./images/hldbl@3x.png');
+  background-size: 100% 100%;
+  background-repeat: no-repeat;
+  color: #fff;
+  text-align: center;
+}
+</style>

+ 15 - 1
src/main.js

@@ -1,7 +1,21 @@
+/*
+ * @Author: WangQiBiao
+ * @Date: 2019-09-24 17:50:53
+ * @LastEditors: WangQiBiao
+ * @LastEditTime: 2019-09-24 18:05:43
+ * @Description:
+ */
 import Vue from 'vue'
 import App from './App.vue'
-import router from './router'
+import router from './route'
 import store from './store'
+import 'reset.css'
+import 'babel-polyfill'
+
+import ElementUI from 'element-ui'
+import 'element-ui/lib/theme-chalk/index.css'
+import '@/assets/css/element-variables.scss'
+Vue.use(ElementUI)
 
 Vue.config.productionTip = false
 

+ 9 - 0
src/route/_import.js

@@ -0,0 +1,9 @@
+/*
+ * @Author: WangQiBiao
+ * @Date: 2019-09-18 09:49:35
+ * @LastEditors: WangQiBiao
+ * @LastEditTime: 2019-09-20 09:41:47
+ * @Description: 动态路由
+ */
+
+export default file => () => import('@/views/' + file + '/index.vue')

+ 43 - 0
src/route/index.js

@@ -0,0 +1,43 @@
+/*
+ * @Author: WangQiBiao
+ * @Date: 2019-09-18 09:37:48
+ * @LastEditors: WangQiBiao
+ * @LastEditTime: 2019-09-20 16:27:58
+ * @Description:
+ */
+import Vue from 'vue'
+import Router from 'vue-router'
+import whiteList from './white-list'
+import { filtersPermisList } from './permis-list'
+import store from '@/store'
+
+Vue.use(Router)
+
+const router = new Router({
+  mode: 'history',
+  routes: [
+    ...whiteList
+  ]
+})
+
+let isFlag = false // 是否第一次添加权限路由表,默认不是;【没有会导致路由无限死循环】
+
+router.beforeEach(async (to, from, next) => {
+  const { permisList } = store.state.menu
+  if (whiteList.map(item => item.path).indexOf(to.path) !== -1) { // 在免登录白名单,直接进入
+    next()
+  } else if (permisList.length) {
+    if (!isFlag) {
+      isFlag = true
+      await filtersPermisList(permisList).then(newRouter => {
+        router.addRoutes(newRouter)
+        next({ ...to, replace: true })
+      })
+    } else {
+      next()
+    }
+  } else {
+    next()
+  }
+})
+export default router

+ 38 - 0
src/route/permis-list.js

@@ -0,0 +1,38 @@
+/*
+ * @Author: WangQiBiao
+ * @Date: 2019-09-18 11:31:29
+ * @LastEditors: WangQiBiao
+ * @LastEditTime: 2019-09-20 16:06:37
+ * @Description: 权限菜单
+ */
+import _import from './_import'
+import MainCom from '@/components/main'
+/**
+ * 格式化权限路由表
+ * @param {array} permisList 权限路由表
+ */
+export const filtersPermisList = (permisList) => {
+  return new Promise((resolve, reject) => {
+    const newPermisList = permisList.map(item => {
+      return {
+        path: `/${item.path}`,
+        component: MainCom,
+        meta: {
+          title: item.meta.title,
+          icon: item.meta.icon
+        },
+        children: item.children && item.children.map(child => {
+          return {
+            path: child.path,
+            component: _import(`${item.path}/${child.path}`),
+            meta: {
+              title: child.meta.title,
+              icon: child.meta.icon
+            }
+          }
+        })
+      }
+    })
+    resolve(newPermisList)
+  })
+}

+ 8 - 0
src/route/routes.js

@@ -0,0 +1,8 @@
+/*
+ * @Author: WangQiBiao
+ * @Date: 2019-09-18 21:10:46
+ * @LastEditors: WangQiBiao
+ * @LastEditTime: 2019-09-24 18:01:00
+ * @Description:
+ */
+export default []

+ 37 - 0
src/route/white-list.js

@@ -0,0 +1,37 @@
+/*
+ * @Author: WangQiBiao
+ * @Date: 2019-09-18 09:40:26
+ * @LastEditors: WangQiBiao
+ * @LastEditTime: 2019-09-24 18:07:51
+ * @Description: 白名单菜单
+ */
+import _import from './_import'
+/**
+ * title 菜单名称
+ * hideInMenu 是否隐藏菜单,默认显示
+ * icon 菜单图
+ */
+
+export default [
+  {
+    path: '',
+    redirect: 'index'
+  },
+  {
+    path: '/',
+    redirect: 'index'
+  },
+  {
+    path: '/index',
+    component: _import('index'),
+    meta: {
+      title: '首页',
+      hideInMenu: false,
+      icon: ''
+    }
+  },
+  {
+    path: '*',
+    component: _import('not-found')
+  }
+]

+ 0 - 23
src/router.js

@@ -1,23 +0,0 @@
-import Vue from 'vue'
-import Router from 'vue-router'
-import Home from './views/Home.vue'
-
-Vue.use(Router)
-
-export default new Router({
-  routes: [
-    {
-      path: '/',
-      name: 'home',
-      component: Home
-    },
-    {
-      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/About.vue')
-    }
-  ]
-})

+ 0 - 16
src/store.js

@@ -1,16 +0,0 @@
-import Vue from 'vue'
-import Vuex from 'vuex'
-
-Vue.use(Vuex)
-
-export default new Vuex.Store({
-  state: {
-
-  },
-  mutations: {
-
-  },
-  actions: {
-
-  }
-})

+ 18 - 0
src/store/index.js

@@ -0,0 +1,18 @@
+/*
+ * @Author: WangQiBiao
+ * @Date: 2019-09-18 09:38:35
+ * @LastEditors: WangQiBiao
+ * @LastEditTime: 2019-09-18 16:05:51
+ * @Description:
+ */
+import Vue from 'vue'
+import Vuex from 'vuex'
+import menu from './menu'
+
+Vue.use(Vuex)
+
+export default new Vuex.Store({
+  modules: {
+    menu
+  }
+})

+ 68 - 0
src/store/menu.js

@@ -0,0 +1,68 @@
+/*
+ * @Author: WangQiBiao
+ * @Date: 2019-09-18 15:59:59
+ * @LastEditors: WangQiBiao
+ * @LastEditTime: 2019-09-20 16:28:25
+ * @Description:
+ */
+
+export default {
+  namespaced: true,
+  state: {
+    isCollapse: false, // 菜单展开收缩
+    permisList: JSON.parse(window.sessionStorage.getItem('PERMIS_LIST')) || [] // 权限路由
+  },
+  mutations: {
+    /**
+     * 设置伸缩菜单
+     */
+    SET_IS_COLLAPSE (state, newValue) {
+      state.isCollapse = newValue
+    },
+    /**
+     * 设置权限路由
+     */
+    SET_PERMIS_LIST (state, newValue) {
+      state.permisList = newValue
+    }
+  },
+  actions: {
+    /**
+     * 操作菜单伸缩
+     */
+    handleIsCollapse ({ commit }, newValue) {
+      commit('SET_IS_COLLAPSE', newValue)
+    },
+    /**
+     * 格式化菜单路由
+     */
+    handlePermisList ({ commit }, routesList = []) {
+      const newRoutesList = routesList.map(item => {
+        return {
+          path: `${item.path}`,
+          meta: {
+            title: item.meta.title,
+            icon: item.meta.icon
+          },
+          children: item.children && item.children.map(child => {
+            return {
+              path: child.path,
+              meta: {
+                title: child.meta.title,
+                icon: child.meta.icon
+              }
+            }
+          })
+        }
+      })
+      window.sessionStorage.setItem('PERMIS_LIST', JSON.stringify(newRoutesList))
+      commit('SET_PERMIS_LIST', newRoutesList)
+    },
+    /**
+     * 清除权限路由表
+     */
+    handleClearPermisStorage () {
+      window.sessionStorage.removeItem('PERMIS_LIST')
+    }
+  }
+}

BIN
src/views/index/components/entrance-guard/images/logo@2x.png


BIN
src/views/index/components/entrance-guard/images/logo@3x.png


BIN
src/views/index/components/entrance-guard/images/zhnmj@2x.png


BIN
src/views/index/components/entrance-guard/images/zhnmj@3x.png


+ 73 - 0
src/views/index/components/entrance-guard/index.scss

@@ -0,0 +1,73 @@
+@import '@/assets/css/function';
+
+.entrance-guard{
+  background: url('./images/logo@3x.png') no-repeat;
+  background-size: 100% 100%;
+  height: halfH(388);
+  color: #fff;
+  padding: 0 halfH(22);
+  overflow: hidden;
+  .title{
+    text-align: center;
+    color: #39D6FE;
+    font-size:22px;
+    font-weight:bold;
+    padding-top: halfH(22);
+  }
+  .tips{
+    display: flex;
+    padding: halfH(20) 0 halfH(12);
+    align-items: flex-end;
+    .tips-logo{
+      width: halfW(50);
+      height: halfH(50);
+    }
+    .tips-desc{
+      flex: 1;
+      text-align: right;
+      font-size: halfH(22);
+      .tips-desc-unit{
+        color: #52DCFF;
+        font-size: halfH(12);
+      }
+    }
+  }
+  .list{
+    border-top: 1px solid #0748A2;
+    padding-top: halfH(12);
+    overflow-y: scroll;
+    height: halfH(210);
+    .list-item{
+      display: flex;
+      align-items: center;
+      padding-bottom: halfH(12);
+      animation: bubble 20s infinite;
+      .list-item-tag{
+        padding: halfH(2) halfW(4);
+        background:#4F1FD9;
+        border-radius:halfH(2);
+        font-size: halfH(12);
+        margin-right: halfW(8);
+      }
+      .list-item-txt{
+        font-size: halfH(14);
+      }
+      .list-item-lr{
+        flex: 1;
+        text-align: right;
+        .list-item-tag{
+          background:#09A4CB;
+          margin-right: 0;
+        }
+      }
+    }
+  }
+  @keyframes bubble {
+    0% {
+      transform: translateY(0);
+    }
+    100% {
+      transform: translateY(-300px);
+    }
+  }
+}

+ 33 - 0
src/views/index/components/entrance-guard/index.vue

@@ -0,0 +1,33 @@
+<!--
+ * @Author: WangQiBiao
+ * @Date: 2019-09-25 10:20:36
+ * @LastEditors: WangQiBiao
+ * @LastEditTime: 2019-09-25 11:13:52
+ * @Description: 智能门禁
+ -->
+<template>
+  <div class="entrance-guard">
+    <h3 class="title">智能门禁</h3>
+    <div class="tips">
+      <img class="tips-logo" src="./images/zhnmj@3x.png" alt="">
+      <div class="tips-desc">
+        <span class="tips-desc-txt">1,145,689</span>
+        <span class="tips-desc-unit"> 人次</span>
+      </div>
+    </div>
+    <div class="list">
+      <div class="list-item" v-for="(item, idx) in 20" :key="idx">
+        <div class="list-item-lf">
+          <span class="list-item-tag">20:12</span>
+          <span class="list-item-txt">刘**通过小区大门</span>
+        </div>
+        <div class="list-item-lr">
+          <span class="list-item-tag">蓝岛康城</span>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<style lang="scss" scoped>
+@import './index.scss';
+</style>

BIN
src/views/index/components/parking/images/logo@2x.png


BIN
src/views/index/components/parking/images/logo@3x.png


BIN
src/views/index/components/parking/images/zhntch@2x.png


BIN
src/views/index/components/parking/images/zhntch@3x.png


+ 73 - 0
src/views/index/components/parking/index.scss

@@ -0,0 +1,73 @@
+@import '@/assets/css/function';
+
+.parking{
+  background: url('./images/logo@3x.png') no-repeat;
+  background-size: 100% 100%;
+  height: halfH(388);
+  color: #fff;
+  padding: 0 halfH(22);
+  overflow: hidden;
+  .title{
+    text-align: center;
+    color: #39D6FE;
+    font-size:22px;
+    font-weight:bold;
+    padding-top: halfH(22);
+  }
+  .tips{
+    display: flex;
+    padding: halfH(20) 0 halfH(12);
+    align-items: flex-end;
+    .tips-logo{
+      width: halfW(50);
+      height: halfH(50);
+    }
+    .tips-desc{
+      flex: 1;
+      text-align: right;
+      font-size: halfH(22);
+      .tips-desc-unit{
+        color: #52DCFF;
+        font-size: halfH(12);
+      }
+    }
+  }
+  .list{
+    border-top: 1px solid #0748A2;
+    padding-top: halfH(12);
+    overflow-y: scroll;
+    height: halfH(210);
+    .list-item{
+      display: flex;
+      align-items: center;
+      padding-bottom: halfH(12);
+      animation: bubble 20s infinite;
+      .list-item-tag{
+        padding: halfH(2) halfW(4);
+        background:#4F1FD9;
+        border-radius:halfH(2);
+        font-size: halfH(12);
+        margin-right: halfW(8);
+      }
+      .list-item-txt{
+        font-size: halfH(14);
+      }
+      .list-item-lr{
+        flex: 1;
+        text-align: right;
+        .list-item-tag{
+          background:#09A4CB;
+          margin-right: 0;
+        }
+      }
+    }
+  }
+  @keyframes bubble {
+    0% {
+      transform: translateY(0);
+    }
+    100% {
+      transform: translateY(-300px);
+    }
+  }
+}

+ 33 - 0
src/views/index/components/parking/index.vue

@@ -0,0 +1,33 @@
+<!--
+ * @Author: WangQiBiao
+ * @Date: 2019-09-25 10:20:36
+ * @LastEditors: WangQiBiao
+ * @LastEditTime: 2019-09-25 11:26:55
+ * @Description: 智能停车
+ -->
+<template>
+  <div class="parking">
+    <h3 class="title">智能停车</h3>
+    <div class="tips">
+      <img class="tips-logo" src="./images/zhntch@3x.png" alt="">
+      <div class="tips-desc">
+        <span class="tips-desc-txt">1,145,689</span>
+        <span class="tips-desc-unit"> 车次</span>
+      </div>
+    </div>
+    <div class="list">
+      <div class="list-item" v-for="(item, idx) in 20" :key="idx">
+        <div class="list-item-lf">
+          <span class="list-item-tag">20:12</span>
+          <span class="list-item-txt">刘**通过小区大门</span>
+        </div>
+        <div class="list-item-lr">
+          <span class="list-item-tag">蓝岛康城</span>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<style lang="scss" scoped>
+@import './index.scss';
+</style>

+ 75 - 0
src/views/index/components/statistical/index.vue

@@ -0,0 +1,75 @@
+<!--
+ * @Author: WangQiBiao
+ * @Date: 2019-09-24 18:56:59
+ * @LastEditors: WangQiBiao
+ * @LastEditTime: 2019-09-25 10:13:40
+ * @Description:
+ -->
+<template>
+  <div class="statistical">
+    <TipsCardCom class="item" v-for="(item, idx) in list" :key="idx">
+      <h3 class="statistical-label">{{item.label}}</h3>
+      <p class="statistical-txt">{{item.value}}</p>
+    </TipsCardCom>
+  </div>
+</template>
+<script>
+import TipsCardCom from '@/components/tips-card'
+export default {
+  data () {
+    return {
+      list: [
+        {
+          label: '物业面积(m^2)',
+          value: '5,000,000,234'
+        },
+        {
+          label: '物业项目(个)',
+          value: '1,000,234'
+        },
+        {
+          label: '房屋(套)',
+          value: '600,046'
+        },
+        {
+          label: '住户(人)',
+          value: '1,900,146'
+        },
+        {
+          label: '车辆(辆)',
+          value: '5,000,000,234'
+        }
+      ]
+    }
+  },
+  components: {
+    TipsCardCom
+  }
+}
+</script>
+<style lang="scss" scoped>
+@import "@/assets/css/function.scss";
+@import "@/assets/css/mixin.scss";
+.statistical{
+  padding: halfH(35) halfW(20) 0;
+  @include clearBox;
+  display: flex;
+  &>div{
+    // margin: 0 halfW(20);
+    margin-right: halfW(20);
+    &:last-child{
+      margin-right: 0;
+    }
+  }
+  .statistical-label{
+    padding-top: halfH(40);
+    font-size:halfH(14);
+    color: #01DFFC;
+  }
+  .statistical-txt{
+    padding-top: halfH(14);
+    font-size:halfH(28);
+    color:#fff;
+  }
+}
+</style>

BIN
src/views/index/components/title/images/dbl@2x.png


BIN
src/views/index/components/title/images/dbl@3x.png


+ 34 - 0
src/views/index/components/title/index.scss

@@ -0,0 +1,34 @@
+@import '@/assets/css/function';
+
+.title{
+  background: url(./images/dbl@3x.png) no-repeat;
+  background-size: 100% 100%;
+  height: halfH(60);
+  position: relative;
+  text-align: center;
+  color: #39D6FE;
+  font-size:halfH(14);
+  .lf{
+    position: absolute;
+    left: halfW(154);
+    top: halfH(10);
+  }
+  .cent{
+    font-size:halfH(32);
+    font-weight:bold;
+    padding-top: halfH(13);
+  }
+  .lr{
+    position: absolute;
+    right: halfW(70);
+    top: halfH(10);
+    .time{
+      font-size:halfH(18);
+      font-weight:bold;
+      padding-right: halfW(30);
+    }
+    .date{
+      padding-right: halfW(10);
+    }
+  }
+}

+ 21 - 0
src/views/index/components/title/index.vue

@@ -0,0 +1,21 @@
+<!--
+ * @Author: WangQiBiao
+ * @Date: 2019-09-25 09:19:42
+ * @LastEditors: WangQiBiao
+ * @LastEditTime: 2019-09-25 09:31:54
+ * @Description: 头部
+ -->
+<template>
+  <div class="title">
+    <div class="lf">让物业管理更简单</div>
+    <div class="cent">绘享云</div>
+    <div class="lr">
+      <span class="time">09:35:26</span>
+      <span class="date">2018/11/04</span>
+      <span class="day">星期一</span>
+    </div>
+  </div>
+</template>
+<style lang="scss" scoped>
+@import './index.scss';
+</style>

+ 30 - 0
src/views/index/index.scss

@@ -0,0 +1,30 @@
+@import "@/assets/css/function.scss";
+@import "@/assets/css/mixin.scss";
+.index{
+  .index-body{
+    width: 100vw;
+    display: flex;
+    padding-top: halfH(18);
+    .index-body-cent{
+      background: red;
+      height: 200px;
+      flex: 1;
+      margin: 0 halfW(18);
+    }
+    .index-body-lf{
+      width:halfW(356);
+      margin-left: halfW(20);
+      .ibl-item{
+        padding-bottom: halfH(18);
+        &:last-child{
+          padding-bottom: 0;
+        }
+      }
+    }
+    .index-body-lr{
+      background: gray;
+      width:halfW(356);
+      margin-right: halfW(20);
+    }
+  }
+}

+ 46 - 0
src/views/index/index.vue

@@ -0,0 +1,46 @@
+<!--
+ * @Author: WangQiBiao
+ * @Date: 2019-09-24 18:06:33
+ * @LastEditors: WangQiBiao
+ * @LastEditTime: 2019-09-25 11:27:08
+ * @Description: 首页
+ -->
+<template>
+  <div class="index">
+    <TitleCom/>
+    <StatisticalCom/>
+    <div class="index-body">
+      <div class="index-body-lf">
+        <div class="ibl-item">
+          <EntranceGuardCom/>
+        </div>
+        <div class="ibl-item">
+          <ParkingCom/>
+        </div>
+      </div>
+      <div class="index-body-cent">index-body-cent</div>
+      <div class="index-body-lr">index-body-lr</div>
+    </div>
+  </div>
+</template>
+<script>
+import StatisticalCom from './components/statistical'
+import TitleCom from './components/title'
+import EntranceGuardCom from './components/entrance-guard'
+import ParkingCom from './components/parking'
+export default {
+  components: {
+    StatisticalCom,
+    TitleCom,
+    EntranceGuardCom,
+    ParkingCom
+  },
+  data () {
+    return {
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+@import './index.scss';
+</style>

+ 20 - 0
src/views/not-found/index.vue

@@ -0,0 +1,20 @@
+<!--
+ * @Author: WangQiBiao
+ * @Date: 2019-09-20 16:22:21
+ * @LastEditors: WangQiBiao
+ * @LastEditTime: 2019-09-20 16:24:25
+ * @Description:404页面
+ -->
+<template>
+  <div class="not-found">
+    404 not-found
+  </div>
+</template>
+<style lang="scss" scoped>
+.not-found{
+  font-size: 32px;
+  font-weight: bold;
+  text-align: center;
+  padding: 200px 0;
+}
+</style>

+ 90 - 5
yarn.lock

@@ -1436,6 +1436,13 @@ async-limiter@~1.0.0:
   resolved "https://registry.npm.taobao.org/async-limiter/download/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
   integrity sha1-3TeelPDbgxCwgpH51kwyCXZmF/0=
 
+async-validator@~1.8.1:
+  version "1.8.5"
+  resolved "https://registry.npm.taobao.org/async-validator/download/async-validator-1.8.5.tgz#dc3e08ec1fd0dddb67e60842f02c0cd1cec6d7f0"
+  integrity sha1-3D4I7B/Q3dtn5ghC8CwM0c7G1/A=
+  dependencies:
+    babel-runtime "6.x"
+
 async@^1.5.2:
   version "1.5.2"
   resolved "https://registry.npm.taobao.org/async/download/async-1.5.2.tgz?cache=0&sync_timestamp=1563385399810&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fasync%2Fdownload%2Fasync-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
@@ -1495,6 +1502,11 @@ babel-eslint@^10.0.1:
     eslint-visitor-keys "^1.0.0"
     resolve "^1.12.0"
 
+babel-helper-vue-jsx-merge-props@^2.0.0:
+  version "2.0.3"
+  resolved "https://registry.npm.taobao.org/babel-helper-vue-jsx-merge-props/download/babel-helper-vue-jsx-merge-props-2.0.3.tgz#22aebd3b33902328e513293a8e4992b384f9f1b6"
+  integrity sha1-Iq69OzOQIyjlEyk6jkmSs4T58bY=
+
 babel-loader@^8.0.5:
   version "8.0.6"
   resolved "https://registry.npm.taobao.org/babel-loader/download/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb"
@@ -1523,6 +1535,23 @@ babel-plugin-module-resolver@3.2.0:
     reselect "^3.0.1"
     resolve "^1.4.0"
 
+babel-polyfill@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.npm.taobao.org/babel-polyfill/download/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153"
+  integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=
+  dependencies:
+    babel-runtime "^6.26.0"
+    core-js "^2.5.0"
+    regenerator-runtime "^0.10.5"
+
+babel-runtime@6.x, babel-runtime@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.npm.taobao.org/babel-runtime/download/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+  integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
+  dependencies:
+    core-js "^2.4.0"
+    regenerator-runtime "^0.11.0"
+
 balanced-match@^1.0.0:
   version "1.0.0"
   resolved "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
@@ -2331,7 +2360,7 @@ copy-webpack-plugin@^4.6.0:
     p-limit "^1.0.0"
     serialize-javascript "^1.4.0"
 
-core-js@^2.6.5:
+core-js@^2.4.0, core-js@^2.5.0, core-js@^2.6.5:
   version "2.6.9"
   resolved "https://registry.npm.taobao.org/core-js/download/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2"
   integrity sha1-a0shRiDINBUuF5Mjcn/Bl0GwhPI=
@@ -2690,7 +2719,7 @@ deep-is@~0.1.3:
   resolved "https://registry.npm.taobao.org/deep-is/download/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
   integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
 
-deepmerge@^1.5.2:
+deepmerge@^1.2.0, deepmerge@^1.5.2:
   version "1.5.2"
   resolved "https://registry.npm.taobao.org/deepmerge/download/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753"
   integrity sha1-EEmdhohEza1P7ghC34x/bwyVp1M=
@@ -2968,6 +2997,18 @@ electron-to-chromium@^1.3.247:
   resolved "https://registry.npm.taobao.org/electron-to-chromium/download/electron-to-chromium-1.3.265.tgz?cache=0&sync_timestamp=1569297775006&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Felectron-to-chromium%2Fdownload%2Felectron-to-chromium-1.3.265.tgz#d69afa05a33e551b913a9798f072a6442f46b348"
   integrity sha1-1pr6BaM+VRuROpeY8HKmRC9Gs0g=
 
+element-ui@^2.12.0:
+  version "2.12.0"
+  resolved "https://registry.npm.taobao.org/element-ui/download/element-ui-2.12.0.tgz#a893bc11ae4f7dbb7e9d541606f23e643f131ee4"
+  integrity sha1-qJO8Ea5Pfbt+nVQWBvI+ZD8THuQ=
+  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"
+
 elliptic@^6.0.0:
   version "6.5.1"
   resolved "https://registry.npm.taobao.org/elliptic/download/elliptic-6.5.1.tgz?cache=0&sync_timestamp=1567592249994&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Felliptic%2Fdownload%2Felliptic-6.5.1.tgz#c380f5f909bf1b9b4428d028cd18d3b0efd6b52b"
@@ -3110,6 +3151,13 @@ eslint-module-utils@^2.4.0:
     debug "^2.6.8"
     pkg-dir "^2.0.0"
 
+eslint-plugin-cypress@^2.6.1:
+  version "2.6.1"
+  resolved "https://registry.npm.taobao.org/eslint-plugin-cypress/download/eslint-plugin-cypress-2.6.1.tgz#b2728663319709c57d21ee7d0dc055edc341dcaf"
+  integrity sha1-snKGYzGXCcV9Ie59DcBV7cNB3K8=
+  dependencies:
+    globals "^11.12.0"
+
 eslint-plugin-es@^1.3.1:
   version "1.4.1"
   resolved "https://registry.npm.taobao.org/eslint-plugin-es/download/eslint-plugin-es-1.4.1.tgz?cache=0&sync_timestamp=1567145035649&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-plugin-es%2Fdownload%2Feslint-plugin-es-1.4.1.tgz#12acae0f4953e76ba444bfd1b2271081ac620998"
@@ -3118,6 +3166,13 @@ eslint-plugin-es@^1.3.1:
     eslint-utils "^1.4.2"
     regexpp "^2.0.1"
 
+eslint-plugin-html@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.npm.taobao.org/eslint-plugin-html/download/eslint-plugin-html-6.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-plugin-html%2Fdownload%2Feslint-plugin-html-6.0.0.tgz#28e5c3e71e6f612e07e73d7c215e469766628c13"
+  integrity sha1-KOXD5x5vYS4H5z18IV5Gl2ZijBM=
+  dependencies:
+    htmlparser2 "^3.10.1"
+
 eslint-plugin-import@^2.14.0:
   version "2.18.2"
   resolved "https://registry.npm.taobao.org/eslint-plugin-import/download/eslint-plugin-import-2.18.2.tgz#02f1180b90b077b33d447a17a2326ceb400aceb6"
@@ -3164,7 +3219,7 @@ eslint-plugin-vue@^4.7.1:
   dependencies:
     vue-eslint-parser "^2.0.3"
 
-eslint-plugin-vue@^5.0.0:
+eslint-plugin-vue@^5.2.3:
   version "5.2.3"
   resolved "https://registry.npm.taobao.org/eslint-plugin-vue/download/eslint-plugin-vue-5.2.3.tgz#3ee7597d823b5478804b2feba9863b1b74273961"
   integrity sha1-PudZfYI7VHiASy/rqYY7G3QnOWE=
@@ -3932,7 +3987,7 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.1.1:
     once "^1.3.0"
     path-is-absolute "^1.0.0"
 
-globals@^11.0.1, globals@^11.1.0, globals@^11.7.0:
+globals@^11.0.1, globals@^11.1.0, globals@^11.12.0, globals@^11.7.0:
   version "11.12.0"
   resolved "https://registry.npm.taobao.org/globals/download/globals-11.12.0.tgz?cache=0&sync_timestamp=1568452081683&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglobals%2Fdownload%2Fglobals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
   integrity sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4=
@@ -4190,7 +4245,7 @@ html-webpack-plugin@^3.2.0:
     toposort "^1.0.0"
     util.promisify "1.0.0"
 
-htmlparser2@^3.3.0:
+htmlparser2@^3.10.1, htmlparser2@^3.3.0:
   version "3.10.1"
   resolved "https://registry.npm.taobao.org/htmlparser2/download/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f"
   integrity sha1-vWedw/WYl7ajS7EHSchVu1OpOS8=
@@ -5727,6 +5782,11 @@ normalize-url@^3.0.0:
   resolved "https://registry.npm.taobao.org/normalize-url/download/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559"
   integrity sha1-suHE3E98bVd0PfczpPWXjRhlBVk=
 
+normalize-wheel@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npm.taobao.org/normalize-wheel/download/normalize-wheel-1.0.1.tgz#aec886affdb045070d856447df62ecf86146ec45"
+  integrity sha1-rsiGr/2wRQcNhWRH32Ls+GFG7EU=
+
 npm-bundled@^1.0.1:
   version "1.0.6"
   resolved "https://registry.npm.taobao.org/npm-bundled/download/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd"
@@ -6944,6 +7004,16 @@ regenerate@^1.2.1, regenerate@^1.4.0:
   resolved "https://registry.npm.taobao.org/regenerate/download/regenerate-1.4.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerate%2Fdownload%2Fregenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
   integrity sha1-SoVuxLVuQHfFV1icroXnpMiGmhE=
 
+regenerator-runtime@^0.10.5:
+  version "0.10.5"
+  resolved "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.10.5.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658"
+  integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=
+
+regenerator-runtime@^0.11.0:
+  version "0.11.1"
+  resolved "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.11.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+  integrity sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=
+
 regenerator-runtime@^0.13.2:
   version "0.13.3"
   resolved "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.13.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5"
@@ -7139,6 +7209,16 @@ reselect@^3.0.1:
   resolved "https://registry.npm.taobao.org/reselect/download/reselect-3.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freselect%2Fdownload%2Freselect-3.0.1.tgz#efdaa98ea7451324d092b2b2163a6a1d7a9a2147"
   integrity sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc=
 
+reset.css@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.npm.taobao.org/reset.css/download/reset.css-2.0.2.tgz#9c01309c820b72e8f219ebcc8e1411949604f7d7"
+  integrity sha1-nAEwnIILcujyGevMjhQRlJYE99c=
+
+resize-observer-polyfill@^1.5.0:
+  version "1.5.1"
+  resolved "https://registry.npm.taobao.org/resize-observer-polyfill/download/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464"
+  integrity sha1-DpAg3T0hAkRY1OvSfiPkAmmBBGQ=
+
 resolve-cwd@^2.0.0:
   version "2.0.0"
   resolved "https://registry.npm.taobao.org/resolve-cwd/download/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
@@ -8047,6 +8127,11 @@ thread-loader@^2.1.2:
     loader-utils "^1.1.0"
     neo-async "^2.6.0"
 
+throttle-debounce@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.npm.taobao.org/throttle-debounce/download/throttle-debounce-1.1.0.tgz#51853da37be68a155cb6e827b3514a3c422e89cd"
+  integrity sha1-UYU9o3vmihVctugns1FKPEIuic0=
+
 through2@^2.0.0:
   version "2.0.5"
   resolved "https://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fthrough2%2Fdownload%2Fthrough2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"