Эх сурвалжийг харах

major update: elementui, store, login/logout,
helpers, mixins, filters...

Michael Wang 6 жил өмнө
parent
commit
14dfb9d92d

+ 1 - 0
.env.development

@@ -0,0 +1 @@
+VUE_APP_ENABLE_VUE_RENDER_LOGS=true

+ 0 - 9
babel.config.js

@@ -1,12 +1,3 @@
 module.exports = {
   presets: ["@vue/app"],
-  plugins: [
-    [
-      "import",
-      {
-        libraryName: "iview",
-        libraryDirectory: "src/components",
-      },
-    ],
-  ],
 };

+ 5 - 3
package.json

@@ -1,6 +1,6 @@
 {
   "name": "vue-starter",
-  "version": "0.3.0-dev",
+  "version": "0.4.0-dev",
   "private": true,
   "scripts": {
     "serve": "vue-cli-service serve",
@@ -17,14 +17,16 @@
   },
   "dependencies": {
     "axios": "^0.18.0",
+    "axios-progress-bar": "^1.2.0",
     "bootstrap": "^4.3.1",
     "core-js": "^2.6.5",
-    "iview": "^3.4.1",
+    "element-ui": "^2.8.2",
     "js-cookie": "^2.2.0",
     "lodash-es": "^4.17.11",
     "moment": "^2.24.0",
     "register-service-worker": "^1.6.2",
     "vue": "^2.6.10",
+    "vue-awesome": "^3.5.1",
     "vue-navigation": "^1.1.4",
     "vue-router": "^3.0.6",
     "vuex": "^3.1.1",
@@ -44,11 +46,11 @@
     "babel-plugin-import": "^1.11.0",
     "eslint": "^5.16.0",
     "eslint-plugin-vue": "^5.2.2",
-    "iview-loader": "^1.2.2",
     "lint-staged": "^8.1.5",
     "node-sass": "^4.12.0",
     "sass-loader": "^7.0.1",
     "vue-cli-plugin-axios": "0.0.4",
+    "vue-cli-plugin-element": "^1.0.1",
     "vue-template-compiler": "^2.6.10"
   },
   "gitHooks": {

+ 2 - 15
src/App.vue

@@ -1,34 +1,21 @@
 <template>
   <div id="app">
-    <img src="./assets/logo.png" />
-    <div>
-      <p>
-        App.vue rendered!
-      </p>
-    </div>
-    <HelloWorld msg="Welcome to Your Vue.js App" />
     <router-view></router-view>
   </div>
 </template>
 
 <script>
-import HelloWorld from "./components/HelloWorld.vue";
-
 export default {
   name: "app",
-  components: {
-    HelloWorld,
-  },
 };
 </script>
 
 <style>
 #app {
-  font-family: "Avenir", Helvetica, Arial, sans-serif;
+  font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB",
+    "Microsoft YaHei", "微软雅黑", Arial, sans-serif;
   -webkit-font-smoothing: antialiased;
   -moz-osx-font-smoothing: grayscale;
-  text-align: center;
   color: #2c3e50;
-  margin-top: 60px;
 }
 </style>

+ 46 - 0
src/api/login.js

@@ -0,0 +1,46 @@
+import { httpApp } from "@/plugins/axiosApp";
+
+export function loginByUsername({
+  accountType,
+  accountValue,
+  sessionType,
+  password,
+}) {
+  const data = {
+    accountType,
+    accountValue,
+    password,
+    sessionType,
+  };
+  return httpApp.post(
+    "/ocean/api/ocean-cloud-security/security/adminUserLogin",
+    data
+  );
+}
+
+export function loginByPhone({ securityPhone, securityCode }) {
+  const data = {
+    securityPhone,
+    securityCode,
+  };
+  return httpApp.post(
+    "/ocean/api/ocean-cloud-security/security/adminUserSmsLogin",
+    data
+  );
+}
+
+export function sendSMS({ securityPhone }) {
+  const data = {
+    securityPhone,
+  };
+  return httpApp.post(
+    "/ocean/api/ocean-cloud-security/security/sendSms4AdminUser",
+    data
+  );
+}
+
+export function logout() {
+  return httpApp.post({
+    url: "/login/logout",
+  });
+}

+ 1 - 0
src/constant/constants.js

@@ -0,0 +1 @@
+export const YYYYMMDDHHmmss = "YYYY-MM-DD HH:mm:ss";

+ 16 - 0
src/filters/index.js

@@ -0,0 +1,16 @@
+import Vue from "vue";
+
+Vue.filter("booleanYesNoFilter", function(val) {
+  if (val === null) return "无";
+  return { true: "是", false: "否" }[val];
+});
+
+Vue.filter("booleanEnableDisableFilter", function(val) {
+  if (val === null) return "无";
+  return { true: "启用", false: "禁用" }[val];
+});
+
+Vue.filter("booleanPassFilter", function(val) {
+  if (val === null) return "无";
+  return { true: "通过", false: "不通过" }[val];
+});

+ 10 - 89
src/main.js

@@ -4,15 +4,21 @@ import App from "./App.vue";
 import router from "./router";
 import store from "./store";
 // import "./registerServiceWorker";
-import "./plugins/axiosCommonService";
-import "./plugins/axiosApp";
-import "./plugins/iview";
+// import "./plugins/axiosCommonService";
+// import "./plugins/axiosApp";
+import "./plugins/customComponents";
+import "./filters";
+import "./mixins/logout";
+import "./plugins/element.js";
+import "./plugins/vueAwesome";
+import "./plugins/helpers";
 
 // styles begin
 import "./styles/bootstrap.scss";
 import "./styles/global.css";
 // styles end
 
+// 可以回退到上次route的状态,不重新执行生命周期函数
 Vue.use(Navigation, { router });
 
 Vue.config.productionTip = false;
@@ -24,92 +30,7 @@ if (
   const vueLifecylceLogs = require("./plugins/vueLifecylceLogs").default;
 
   const options = {
-    ignoreComponents: [
-      undefined,
-      "transition",
-      "router-link",
-      "Affix",
-      "Alert",
-      "Anchor",
-      "AnchorLink",
-      "AutoComplete",
-      "Avatar",
-      "BackTop",
-      "Badge",
-      "Breadcrumb",
-      "BreadcrumbItem",
-      "Button",
-      "ButtonGroup",
-      "Card",
-      "Carousel",
-      "CarouselItem",
-      "Cascader",
-      "Cell",
-      "CellGroup",
-      "Checkbox",
-      "CheckboxGroup",
-      "i-circle",
-      "Col",
-      "Collapse",
-      "ColorPicker",
-      "Content",
-      "Divider",
-      "DatePicker",
-      "Drawer",
-      "Drop",
-      "Dropdown",
-      "DropdownItem",
-      "DropdownMenu",
-      "Footer",
-      "Form",
-      "iForm",
-      "FormItem",
-      "Header",
-      "Icon",
-      "Input",
-      "InputNumber",
-      "Layout",
-      "LoadingBar",
-      "Menu",
-      "MenuGroup",
-      "MenuItem",
-      "Sider",
-      "Submenu",
-      "Modal",
-      "Option",
-      "OptionGroup",
-      "Page",
-      "PageOption",
-      "Panel",
-      "Poptip",
-      "Progress",
-      "Radio",
-      "RadioGroup",
-      "Rate",
-      "Row",
-      "Select",
-      "Slider",
-      "Spin",
-      "Split",
-      "Step",
-      "Steps",
-      "i-switch",
-      "Table",
-      "TableHead",
-      "TableBody",
-      "TableCell",
-      "Tabs",
-      "TabPane",
-      "Tag",
-      "Time",
-      "Timeline",
-      "TimelineItem",
-      "TimePicker",
-      "Tooltip",
-      "Transfer",
-      "Tree",
-      "Upload",
-    ],
+    ignoreComponents: [undefined, "transition", "router-link"],
     ignoreComponentsNameRegexArray: [/^i[A-Z].*/, /^fa-.*/],
     groupCollapsed: true,
   };

+ 12 - 0
src/mixins/logout.js

@@ -0,0 +1,12 @@
+import { removeKeyToken } from "@/auth/auth";
+import Vue from "vue";
+
+Vue.mixin({
+  methods: {
+    logout(cause = "") {
+      removeKeyToken();
+      // window._hmt.push(["_trackEvent", "退出", cause]);
+      this.$router.push("/login" + cause);
+    },
+  },
+});

+ 45 - 21
src/plugins/axiosApp.js

@@ -1,7 +1,6 @@
 import Vue from "vue";
-import { Notice } from "iview";
 import axios from "axios";
-import { loadProgressBar } from "./axiosProgress";
+import { loadProgressBar } from "axios-progress-bar";
 import cachingGet from "./axiosCache";
 import { getKeyToken, removeKeyToken } from "../auth/auth";
 
@@ -29,17 +28,21 @@ const _axiosApp = axios.create(config);
 
 _axiosApp.interceptors.request.use(
   function(config) {
-    const [wk_token, wk_key] = getKeyToken();
-    if (wk_token) {
-      config.headers.common["token"] = wk_token;
-      config.headers.common["key"] = wk_key;
+    if (config.url.endsWith("Login") === false) {
+      const [wk_token, wk_key] = getKeyToken();
+      if (wk_token) {
+        config.headers.common["token"] = wk_token;
+        config.headers.common["key"] = wk_key;
+      }
     }
     return config;
   },
   function(error) {
     // Do something with request error
-    Notice.error({
-      title: error,
+    Vue.prototype.$notify({
+      showClose: true,
+      message: error,
+      type: "error",
     });
     return Promise.reject(error);
   }
@@ -54,8 +57,10 @@ _axiosApp.interceptors.response.use(
     if (!error.response) {
       // "Network Error" 网络不通,直接返回
 
-      Notice.error({
-        title: "网络连接异常,请检查网络设置。",
+      Vue.prototype.$notify({
+        showClose: true,
+        message: "网络连接异常,请检查网络设置。",
+        type: "error",
       });
       return Promise.reject(error);
     }
@@ -64,14 +69,31 @@ _axiosApp.interceptors.response.use(
 
     // 登录失效 跳转登录页面
     if (status == 403 || status == 401) {
-      Notice.warning({
-        title: "登录失效,请重新登录!",
-      });
+      if (
+        window.___lastInvalidDate === undefined ||
+        window.___lastInvalidDate < Date.now() - 300
+      ) {
+        Vue.prototype.$notify({
+          showClose: true,
+          message: "登录失效,请重新登录!",
+          type: "error",
+        });
+        window.___lastInvalidDate = Date.now();
+      }
       removeKeyToken();
       return Promise.reject(error);
     } else if (status == 405) {
-      Notice.warning({
-        title: "没有权限!",
+      Vue.prototype.$notify({
+        showClose: true,
+        message: "没有权限!",
+        type: "error",
+      });
+      return Promise.reject(error);
+    } else if (status == 502) {
+      Vue.prototype.$notify({
+        showClose: true,
+        message: "服务器异常(502)!",
+        type: "error",
       });
       return Promise.reject(error);
     }
@@ -79,14 +101,16 @@ _axiosApp.interceptors.response.use(
     if (status != 200) {
       const data = error.response.data;
       if (data && data.desc) {
-        Notice.error({
-          title: "服务器返回",
-          desc: data.desc,
+        Vue.prototype.$notify({
+          showClose: true,
+          message: data.desc,
+          type: "error",
         });
       } else {
-        Notice.error({
-          title: "未定义异常: ",
-          desc: JSON.stringify(data, 2),
+        Vue.prototype.$notify({
+          showClose: true,
+          message: "未定义异常: " + JSON.stringify(data, 2),
+          type: "error",
         });
       }
       return Promise.reject(error);

+ 0 - 46
src/plugins/axiosProgress.js

@@ -1,46 +0,0 @@
-import iView from "iview";
-import axios from "axios";
-
-const calculatePercentage = (loaded, total) => Math.floor(loaded * 1.0) / total;
-
-export function loadProgressBar(instance = axios) {
-  let requestsCounter = 0;
-
-  const setupStartProgress = () => {
-    instance.interceptors.request.use(config => {
-      requestsCounter++;
-      iView.LoadingBar.start();
-      return config;
-    });
-  };
-
-  const setupUpdateProgress = () => {
-    const update = e =>
-      iView.LoadingBar.update(calculatePercentage(e.loaded, e.total));
-    instance.defaults.onDownloadProgress = update;
-    instance.defaults.onUploadProgress = update;
-  };
-
-  const setupStopProgress = () => {
-    const responseFunc = response => {
-      if (--requestsCounter === 0) {
-        iView.LoadingBar.finish();
-      }
-      return response;
-    };
-
-    const errorFunc = error => {
-      if (--requestsCounter === 0) {
-        iView.LoadingBar.error();
-      }
-      console.log(error);
-      throw error;
-    };
-
-    instance.interceptors.response.use(responseFunc, errorFunc);
-  };
-
-  setupStartProgress();
-  setupUpdateProgress();
-  setupStopProgress();
-}

+ 10 - 0
src/plugins/customComponents.js

@@ -0,0 +1,10 @@
+import Vue from "vue";
+// import AppType from "@/components/common/AppType.vue";
+
+const components = {
+  //  AppType,
+};
+
+Object.keys(components).forEach(key => {
+  Vue.component(key, components[key]);
+});

+ 5 - 0
src/plugins/element.js

@@ -0,0 +1,5 @@
+import Vue from "vue";
+import Element from "element-ui";
+import "../styles/element-variables.scss";
+
+Vue.use(Element, { size: "medium" });

+ 13 - 0
src/plugins/helpers.js

@@ -0,0 +1,13 @@
+import Vue from "vue";
+import queryHandlers from "@/utils/queryHandlers";
+
+const helpers = { ...queryHandlers };
+
+const plugin = {
+  install() {
+    Vue.helpers = helpers;
+    Vue.prototype.$helpers = helpers;
+  },
+};
+
+Vue.use(plugin);

+ 0 - 13
src/plugins/iview.js

@@ -1,13 +0,0 @@
-import Vue from "vue";
-import "iview/dist/styles/iview.css";
-import { Button, Form, FormItem, Input, Icon, Message, Notice } from "iview";
-
-Vue.component("Button", Button);
-Vue.component("Form", Form);
-Vue.component("FormItem", FormItem);
-Vue.component("Input", Input);
-Vue.component("Icon", Icon);
-Vue.component("Message", Message);
-
-Vue.prototype.$Message = Message;
-Vue.prototype.$Notice = Notice;

+ 12 - 0
src/plugins/vueAwesome.js

@@ -0,0 +1,12 @@
+import Vue from "vue";
+import Icon from "vue-awesome/components/Icon";
+
+import "vue-awesome/icons/database";
+import "vue-awesome/icons/copyright";
+import "vue-awesome/icons/user-tag";
+import "vue-awesome/icons/user";
+import "vue-awesome/icons/users";
+import "vue-awesome/icons/sign-out-alt";
+import "vue-awesome/icons/bars";
+
+Vue.component("v-icon", Icon);

+ 2 - 2
src/plugins/vueLifecylceLogs.js

@@ -9,10 +9,10 @@ import Vue from "vue";
 // const RENDER_DURATION = 1 * 1000;
 
 export default function({
-  ignoreComponents = [undefined, "transition", "router-link"],
+  ignoreComponents = [undefined, "transition", "router-link", "Bar"],
   ignoreComponentsNameRegexArray = [/^El[A-Z].*/, /^fa-.*/],
   groupCollapsed = true,
-  RENDER_DURATION = 3 * 1000,
+  RENDER_DURATION = 1 * 1000,
 }) {
   function getParentNumber(that) {
     let parentNumber = 0;

+ 3 - 0
src/store/action-types.js

@@ -0,0 +1,3 @@
+export const LOGIN_BY_USERNAME = "LOGIN_BY_USERNAME";
+export const LOGIN_BY_PHONE = "LOGIN_BY_PHONE";
+export const SEND_SMS = "SEND_SMS";

+ 5 - 1
src/store/index.js

@@ -1,11 +1,15 @@
 import Vue from "vue";
 import Vuex from "vuex";
 import createPersistedState from "vuex-persistedstate";
+import user from "./modules/user";
 
 Vue.use(Vuex);
 
 export default new Vuex.Store({
-  plugins: [createPersistedState()],
+  plugins: [createPersistedState({ storage: window.sessionStorage })],
+  modules: {
+    user,
+  },
   state: {},
   mutations: {},
   actions: {},

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

@@ -0,0 +1,78 @@
+import { loginByUsername, loginByPhone, sendSMS, logout } from "@/api/login";
+import { removeKeyToken, setKeyToken } from "@/auth/auth";
+import { omit } from "lodash-es";
+import { LOGIN_BY_USERNAME, LOGIN_BY_PHONE, SEND_SMS } from "../action-types";
+
+const user = {
+  state: {
+    accountType: "LOGIN_NAME",
+    datasetId: null,
+    loginName: "",
+    name: "",
+    partitionId: null,
+    roleList: null,
+    smsSendDate: null,
+  },
+
+  mutations: {
+    SET_USER: (state, user) => {
+      // state.user = user;
+      if (user && user.datasetId === -1) {
+        user.datasetId = null;
+      }
+      state = Object.assign(state, user);
+    },
+    SET_SMS_SEND_DATE: (state, date) => {
+      state = Object.assign(state, { smsSendDate: date });
+    },
+  },
+
+  actions: {
+    // 用户名登录
+    [LOGIN_BY_USERNAME]({ commit }, userInfo) {
+      return loginByUsername(userInfo).then(response => {
+        const data = response.data;
+        commit("SET_USER", omit(data.accessAdminUser, ["token", "uid"]));
+        setKeyToken(response.data.accessAdminUser);
+      });
+    },
+    [LOGIN_BY_PHONE]({ commit }, userInfo) {
+      return loginByPhone(userInfo).then(response => {
+        const data = response.data;
+        commit("SET_USER", omit(data.accessAdminUser, ["token", "uid"]));
+        setKeyToken(response.data.accessAdminUser);
+      });
+    },
+    [SEND_SMS]({ commit }, userInfo) {
+      return sendSMS(userInfo).then(() => {
+        commit("SET_SMS_SEND_DATE", Date.now());
+      });
+    },
+
+    // 登出
+    LogOut({ commit, state }) {
+      return new Promise((resolve, reject) => {
+        logout(state.token)
+          .then(() => {
+            commit("SET_USER", null);
+            removeKeyToken();
+            resolve();
+          })
+          .catch(error => {
+            reject(error);
+          });
+      });
+    },
+
+    // 前端 登出
+    FedLogOut({ commit }) {
+      return new Promise(resolve => {
+        commit("SET_USER", null);
+        removeKeyToken();
+        resolve();
+      });
+    },
+  },
+};
+
+export default user;

+ 11 - 0
src/styles/element-variables.scss

@@ -0,0 +1,11 @@
+/*
+Write your variables here. All available variables can be
+found in element-ui/packages/theme-chalk/src/common/var.scss.
+For example, to overwrite the theme color:
+*/
+$--color-primary: teal;
+
+/* icon font path, required */
+$--font-path: "~element-ui/lib/theme-chalk/fonts";
+
+@import "~element-ui/packages/theme-chalk/src/index";

+ 3 - 1
src/styles/global.css

@@ -1,3 +1,5 @@
+@import "./nprogress.css";
+
 body {
   margin: 0;
 }
@@ -104,4 +106,4 @@ body {
 .qm-icon-button:hover {
   color: #444444;
   background-color: #ffffff;
-}
+}

+ 12 - 0
src/styles/nprogress.css

@@ -0,0 +1,12 @@
+#nprogress .bar {
+  background: yellow !important;
+}
+
+#nprogress .peg {
+  box-shadow: 0 0 10px yellow, 0 0 5px yellow !important;
+}
+
+#nprogress .spinner-icon {
+  border-top-color: yellow !important;
+  border-left-color: yellow !important;
+}

+ 7 - 0
src/utils/queryHandlers.js

@@ -0,0 +1,7 @@
+import { omitBy } from "lodash-es";
+
+export default {
+  omitEmpty(obj) {
+    return omitBy(obj, v => v === null || v === "" || v === undefined);
+  },
+};

+ 7 - 0
src/utils/utils.js

@@ -4,3 +4,10 @@ import moment from "moment";
 export function dateFormatForAPI(date) {
   return moment(date).format(YYYYMMDDHHmmss);
 }
+
+export function formatEmptyToNull(obj) {
+  Object.keys(obj).forEach(key => {
+    obj[key] = obj[key] === "" || obj[key] === undefined ? null : obj[key];
+  });
+  return obj;
+}

+ 1 - 12
vue.config.js

@@ -15,18 +15,6 @@ module.exports = {
   devServer: {
     proxy,
   },
-  chainWebpack: config => {
-    // iview Loader
-    config.module
-      .rule("vue")
-      .test(/\.vue$/)
-      .use("iview-loader")
-      .loader("iview-loader")
-      .options({
-        prefix: true,
-      })
-      .end();
-  },
   configureWebpack: {
     devtool: "source-map",
     plugins: [
@@ -35,4 +23,5 @@ module.exports = {
       new webpack.IgnorePlugin(/^\.\/locale$/, /moment|iview$/),
     ],
   },
+  transpileDependencies: [/\bvue-awesome\b/],
 };

+ 51 - 62
yarn.lock

@@ -1800,10 +1800,10 @@ async-limiter@~1.0.0:
   resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
   integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==
 
-async-validator@^1.10.0:
-  version "1.10.1"
-  resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-1.10.1.tgz#41e9b0b9f8e719e6edf946372f018a958c2e70f3"
-  integrity sha512-VLiLKZuJc8VIeAMC3YobVsZov8XPNhbwyIkKjhPW5cFnhZXH+HHJpkE270YMD/6zJIOJXUN/Cq0t3fR7XPwaDQ==
+async-validator@~1.8.1:
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-1.8.5.tgz#dc3e08ec1fd0dddb67e60842f02c0cd1cec6d7f0"
+  integrity sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==
   dependencies:
     babel-runtime "6.x"
 
@@ -1851,6 +1851,11 @@ aws4@^1.8.0:
   resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f"
   integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==
 
+axios-progress-bar@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/axios-progress-bar/-/axios-progress-bar-1.2.0.tgz#f9ee88dc9af977246be1ef07eedfa4c990c639c5"
+  integrity sha512-PEgWb/b2SMyHnKJ/cxA46OdCuNeVlo8eqL0HxXPtz+6G/Jtpyo49icPbW+jpO1wUeDEjbqpseMoCyWxESxf5pA==
+
 axios@^0.18.0:
   version "0.18.0"
   resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.0.tgz#32d53e4851efdc0a11993b6cd000789d70c05102"
@@ -1931,6 +1936,11 @@ babel-generator@^6.18.0, babel-generator@^6.26.0:
     source-map "^0.5.7"
     trim-right "^1.0.1"
 
+babel-helper-vue-jsx-merge-props@^2.0.0:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz#22aebd3b33902328e513293a8e4992b384f9f1b6"
+  integrity sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg==
+
 babel-helpers@^6.24.1:
   version "6.24.1"
   resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
@@ -2166,11 +2176,6 @@ base@^0.11.1:
     mixin-deep "^1.2.0"
     pascalcase "^0.1.1"
 
-batch-processor@1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/batch-processor/-/batch-processor-1.0.0.tgz#75c95c32b748e0850d10c2b168f6bdbe9891ace8"
-  integrity sha1-dclcMrdI4IUNEMKxaPa9vpiRrOg=
-
 batch@0.6.1:
   version "0.6.1"
   resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
@@ -3604,12 +3609,12 @@ deep-is@~0.1.3:
   resolved "https://registry.yarnpkg.com/deep-is/-/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.yarnpkg.com/deepmerge/-/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753"
   integrity sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==
 
-deepmerge@^2.1.0, deepmerge@^2.2.1:
+deepmerge@^2.1.0:
   version "2.2.1"
   resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.2.1.tgz#5d3ff22a01c00f645405a2fbc17d0778a1801170"
   integrity sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==
@@ -3949,12 +3954,17 @@ elegant-spinner@^1.0.1:
   resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e"
   integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=
 
-element-resize-detector@^1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/element-resize-detector/-/element-resize-detector-1.2.0.tgz#63344fd6f4e5ecff6f018d027e17b281fd4fa338"
-  integrity sha512-UmhNB8sIJVZeg56gEjgmMd6p37sCg8j8trVW0LZM7Wzv+kxQ5CnRHcgRKBTB/kFUSn3e7UP59kl2V2U8Du1hmg==
+element-ui@^2.8.2:
+  version "2.8.2"
+  resolved "https://registry.yarnpkg.com/element-ui/-/element-ui-2.8.2.tgz#21a7a4cb92616b0f8b75d4d4e637d3a1cd8c09de"
+  integrity sha512-LABKHKGUyewFNvpf9BQLecB659Wq0XYvyP1tBveZ4RWpdlPSylDfGW/RLvDYU7zuCBoRasdZAz7ryjOwq1lLNg==
   dependencies:
-    batch-processor "1.0.0"
+    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.4.1"
@@ -6219,27 +6229,6 @@ istanbul-reports@^1.5.1:
   dependencies:
     handlebars "^4.0.3"
 
-iview-loader@^1.2.2:
-  version "1.2.2"
-  resolved "https://registry.yarnpkg.com/iview-loader/-/iview-loader-1.2.2.tgz#abdf52074de93c82ef01a2c293deb82c8cbbbde0"
-  integrity sha512-mfnLOsaGcsb570G4Aa9WX7rPle+tNkBEApaCSxUrqtOI6aXBkkETO9rUrbrV0CjH96XQY3AntqSWnNvDw6M+RQ==
-  dependencies:
-    loader-utils "^1.1.0"
-
-iview@^3.4.1:
-  version "3.4.2"
-  resolved "https://registry.yarnpkg.com/iview/-/iview-3.4.2.tgz#1deafe8183fe29b9b33179d85faa37b3813b0f73"
-  integrity sha512-02GK6ew+ufywSk3bGJYQZJxnPzyqfolVIfeJOZPFjf671SUPDMQJ/NTDbTAFJVF/jHJJHFaVdqtvStTKf95xpA==
-  dependencies:
-    async-validator "^1.10.0"
-    deepmerge "^2.2.1"
-    element-resize-detector "^1.2.0"
-    js-calendar "^1.2.3"
-    lodash.throttle "^4.1.1"
-    popper.js "^1.14.6"
-    tinycolor2 "^1.4.1"
-    v-click-outside-x "^3.5.6"
-
 javascript-stringify@^1.6.0:
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-1.6.0.tgz#142d111f3a6e3dae8f4a9afd77d45855b5a9cce3"
@@ -6696,11 +6685,6 @@ js-beautify@^1.6.12, js-beautify@^1.6.14:
     mkdirp "~0.5.0"
     nopt "~4.0.1"
 
-js-calendar@^1.2.3:
-  version "1.2.3"
-  resolved "https://registry.yarnpkg.com/js-calendar/-/js-calendar-1.2.3.tgz#a583b0644b4e695ba394f344d103dbcc7a7a7d3e"
-  integrity sha512-dAA1/Zbp4+c5E+ARCVTIuKepXsNLzSYfzvOimiYD4S5eeP9QuplSHLcdhfqFSwyM1o1u6ku6RRRCyaZ0YAjiBw==
-
 js-cookie@^2.2.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.0.tgz#1b2c279a6eece380a12168b92485265b35b1effb"
@@ -7169,11 +7153,6 @@ lodash.templatesettings@^4.0.0:
   dependencies:
     lodash._reinterpolate "~3.0.0"
 
-lodash.throttle@^4.1.1:
-  version "4.1.1"
-  resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4"
-  integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=
-
 lodash.transform@^4.6.0:
   version "4.6.0"
   resolved "https://registry.yarnpkg.com/lodash.transform/-/lodash.transform-4.6.0.tgz#12306422f63324aed8483d3f38332b5f670547a0"
@@ -7948,6 +7927,11 @@ normalize-url@^3.0.0:
   resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559"
   integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==
 
+normalize-wheel@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/normalize-wheel/-/normalize-wheel-1.0.1.tgz#aec886affdb045070d856447df62ecf86146ec45"
+  integrity sha1-rsiGr/2wRQcNhWRH32Ls+GFG7EU=
+
 npm-bundled@^1.0.1:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979"
@@ -8531,11 +8515,6 @@ pn@^1.1.0:
   resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
   integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==
 
-popper.js@^1.14.6:
-  version "1.14.7"
-  resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.7.tgz#e31ec06cfac6a97a53280c3e55e4e0c860e7738e"
-  integrity sha512-4q1hNvoUre/8srWsH7hnoSJ5xVmIL4qgz+s4qf2TnJIMyZFUFMGH+9vE7mXynAlHSZ/NdTmmow86muD0myUkVQ==
-
 portfinder@^1.0.20:
   version "1.0.20"
   resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a"
@@ -9704,6 +9683,11 @@ reselect@^3.0.1:
   resolved "https://registry.yarnpkg.com/reselect/-/reselect-3.0.1.tgz#efdaa98ea7451324d092b2b2163a6a1d7a9a2147"
   integrity sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc=
 
+resize-observer-polyfill@^1.5.0:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464"
+  integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==
+
 resolve-cwd@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
@@ -10873,6 +10857,11 @@ throat@^4.0.0:
   resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a"
   integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=
 
+throttle-debounce@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-1.1.0.tgz#51853da37be68a155cb6e827b3514a3c422e89cd"
+  integrity sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg==
+
 through2@^2.0.0:
   version "2.0.5"
   resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
@@ -10903,11 +10892,6 @@ timsort@^0.3.0:
   resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
   integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=
 
-tinycolor2@^1.4.1:
-  version "1.4.1"
-  resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8"
-  integrity sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=
-
 tmp@^0.0.33:
   version "0.0.33"
   resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
@@ -11295,11 +11279,6 @@ uuid@^3.0.1, uuid@^3.3.2:
   resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
   integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==
 
-v-click-outside-x@^3.5.6:
-  version "3.7.1"
-  resolved "https://registry.yarnpkg.com/v-click-outside-x/-/v-click-outside-x-3.7.1.tgz#aa03eaa0e41e44cb5207dcf86c2d9f0dd64084c1"
-  integrity sha512-WmUgmcIXr9clVpm1AYS/FgHtcDicfnfoxgQCNg4O6vfk9GVnxA0vSqO321ogUo0b7czYTidj7fQENvWFMWOkUg==
-
 validate-npm-package-license@^3.0.1:
   version "3.0.4"
   resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
@@ -11334,11 +11313,21 @@ vm-browserify@0.0.4:
   dependencies:
     indexof "0.0.1"
 
+vue-awesome@^3.5.1:
+  version "3.5.3"
+  resolved "https://registry.yarnpkg.com/vue-awesome/-/vue-awesome-3.5.3.tgz#ff0f00d0717801d5fc9d8c06717481007dbeeb7b"
+  integrity sha512-TzkL0GImNVhj/hUdHVCV3rUK+ozgac565z1aeu3G61gYL8q+TPc0sl1PGDEl0nOMaOh3fade/IgC160egZzbMg==
+
 vue-cli-plugin-axios@0.0.4:
   version "0.0.4"
   resolved "https://registry.yarnpkg.com/vue-cli-plugin-axios/-/vue-cli-plugin-axios-0.0.4.tgz#29d4eb48275c7fe15b92e1fd5d95fbe2a966436f"
   integrity sha512-p2b/fvPJuPBnvU8027PAAuU5DiOzUn2lku8XLG/f6c8FU0N+/MXWZAlOuHhqd9e7+KIZitwe/c8qlmv7TglbTg==
 
+vue-cli-plugin-element@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/vue-cli-plugin-element/-/vue-cli-plugin-element-1.0.1.tgz#34e58fb65b36cf59afaf14f503288e5e578b1554"
+  integrity sha512-OJSOnJtn7f1v/8xX+MJae+RrE8WguhiiG9QTBx/MNOPXYsxqut6Ommo+ZD3raNc7eryhqdM2T/DlMfdvIKpCtw==
+
 vue-eslint-parser@^2.0.3:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz#c268c96c6d94cfe3d938a5f7593959b0ca3360d1"