Sendya 7 жил өмнө
parent
commit
7555b25941

+ 0 - 3
.browserslistrc

@@ -1,3 +0,0 @@
-> 1%
-last 2 versions
-not ie <= 8

+ 0 - 17
.eslintrc.js

@@ -1,17 +0,0 @@
-module.exports = {
-  root: true,
-  env: {
-    node: true
-  },
-  'extends': [
-    'plugin:vue/essential',
-    'eslint:recommended'
-  ],
-  rules: {
-    'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
-    'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
-  },
-  parserOptions: {
-    parser: 'babel-eslint'
-  }
-}

+ 30 - 1
package.json

@@ -8,6 +8,11 @@
     "lint": "vue-cli-service lint"
   },
   "dependencies": {
+    "ant-design-vue": "^1.0.3",
+    "axios": "^0.18.0",
+    "js-cookie": "^2.2.0",
+    "moment": "^2.22.2",
+    "nprogress": "^0.2.0",
     "vue": "^2.5.17",
     "vue-router": "^3.0.1",
     "vuex": "^3.0.1"
@@ -19,5 +24,29 @@
     "node-sass": "^4.9.0",
     "sass-loader": "^7.0.1",
     "vue-template-compiler": "^2.5.17"
-  }
+  },
+  "eslintConfig": {
+    "root": true,
+    "env": {
+      "node": true
+    },
+    "extends": [
+      "plugin:vue/essential",
+      "eslint:recommended"
+    ],
+    "rules": {},
+    "parserOptions": {
+      "parser": "babel-eslint"
+    }
+  },
+  "postcss": {
+    "plugins": {
+      "autoprefixer": {}
+    }
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions",
+    "not ie <= 8"
+  ]
 }

+ 0 - 5
postcss.config.js

@@ -1,5 +0,0 @@
-module.exports = {
-  plugins: {
-    autoprefixer: {}
-  }
-}

+ 1 - 1
public/index.html

@@ -5,7 +5,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>vue-antd-pro</title>
+    <title>Ant Design Pro</title>
   </head>
   <body>
     <noscript>

+ 1 - 25
src/App.vue

@@ -1,29 +1,5 @@
 <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>
+</template>

+ 32 - 0
src/api/login.js

@@ -0,0 +1,32 @@
+import { axios } from '@/utils/request'
+
+export function login(username, password) {
+  return axios({
+    url: '/auth/login',
+    method: 'post',
+    data: {
+      username,
+      password
+    }
+  })
+}
+
+export function getInfo() {
+  return axios({
+    url: '/user/info',
+    method: 'get',
+    headers: {
+      'Content-Type': 'application/json;charset=UTF-8'
+    }
+  })
+}
+
+export function logout() {
+  return axios({
+    url: '/auth/logout',
+    method: 'post',
+    headers: {
+      'Content-Type': 'application/json;charset=UTF-8'
+    }
+  })
+}

+ 45 - 0
src/components/Breadcrumb.vue

@@ -0,0 +1,45 @@
+<template>
+    <a-breadcrumb class="breadcrumb">
+        <a-breadcrumb-item v-for="(item, index) in breadList" :key="index">
+            <router-link v-if="item.name != name" :to="{ path: item.path }">
+                {{ item.meta.title }}
+            </router-link>
+            <span v-else>{{ item.meta.title }}</span>
+        </a-breadcrumb-item>
+    </a-breadcrumb>
+</template>
+
+<script>
+export default {
+    data() {
+      return {
+        name: '',
+        breadList: [],
+      }
+    },
+  created () {
+    this.getBreadcrumb()
+  },
+  methods: {
+    getBreadcrumb() {
+      this.breadList = this.$route.matched
+      this.name = this.$route.name
+      this.$route.matched.forEach((item) => {
+        // item.meta.name === 'dashboard' ? item.path = '/dashboard' : this.$route.path === item.path
+        if (item.name === undefined) {
+          item.meta.title = '首页'
+        }
+      })
+    }
+  },
+  watch: {
+    $route() {
+      this.getBreadcrumb()
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 57 - 0
src/components/NavMenu.vue

@@ -0,0 +1,57 @@
+<template>
+    <a-menu
+            theme="dark"
+            mode="inline"
+            :defaultSelectedKeys="['1']">
+
+        <a-sub-menu key="1">
+            <span slot="title"><a-icon type="dashboard" /><span>dashboard</span></span>
+            <a-menu-item key="11">分析页</a-menu-item>
+            <a-menu-item key="12">监控页</a-menu-item>
+            <a-menu-item key="13">工作台</a-menu-item>
+        </a-sub-menu>
+        <a-sub-menu key="2">
+            <span slot="title"><a-icon type="form" /><span>表单页</span></span>
+            <a-menu-item key="21">基础表单</a-menu-item>
+            <a-menu-item key="22">分步表单</a-menu-item>
+            <a-menu-item key="23">高级表单</a-menu-item>
+        </a-sub-menu>
+        <a-sub-menu key="3">
+            <span slot="title"><a-icon type="table" /><span>列表页</span></span>
+            <a-menu-item key="31">查询表单</a-menu-item>
+            <a-menu-item key="32">表单列表</a-menu-item>
+            <a-menu-item key="33">卡片列表</a-menu-item>
+            <a-sub-menu key="34">
+                <span slot="title"><span>搜索列表</span></span>
+                <a-menu-item key="341">搜索列表(文章)</a-menu-item>
+                <a-menu-item key="342">表单列表(项目)</a-menu-item>
+                <a-menu-item key="343">卡片列表(应用)</a-menu-item>
+            </a-sub-menu>
+        </a-sub-menu>
+        <a-sub-menu key="4">
+            <span slot="title"><a-icon type="profile" /><span>详细页</span></span>
+            <a-menu-item key="41">基础详情页</a-menu-item>
+            <a-menu-item key="42">高级详情页</a-menu-item>
+        </a-sub-menu>
+        <a-sub-menu key="5">
+            <span slot="title"><a-icon type="check-circle-o" /><span>结果页</span></span>
+            <a-menu-item key="51">成功</a-menu-item>
+            <a-menu-item key="52">失败</a-menu-item>
+        </a-sub-menu>
+        <a-sub-menu key="6">
+            <span slot="title"><a-icon type="warning" /><span>异常页</span></span>
+            <a-menu-item key="61">成功</a-menu-item>
+            <a-menu-item key="62">失败</a-menu-item>
+        </a-sub-menu>
+    </a-menu>
+</template>
+
+<script>
+  export default {
+    name: "Navmenu"
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 12 - 2
src/main.js

@@ -1,7 +1,17 @@
 import Vue from 'vue'
 import App from './App.vue'
-import router from './router'
-import store from './store'
+import router from './router/'
+import store from './store/'
+
+import { VueAxios } from "@/utils/request"
+
+import AntDesign from 'ant-design-vue'
+import 'ant-design-vue/dist/antd.css';  // or 'ant-design-vue/dist/antd.less'
+
+import '@/permission' // permission control
+
+Vue.use(AntDesign)
+Vue.use(VueAxios, router)
 
 Vue.config.productionTip = false
 

+ 39 - 0
src/permission.js

@@ -0,0 +1,39 @@
+import router from './router'
+import store from './store'
+
+import NProgress from 'nprogress' // progress bar
+import 'nprogress/nprogress.css' // progress bar style
+
+NProgress.configure({ showSpinner: false })// NProgress Configuration
+
+const whiteList = ['/login']// no redirect whitelist
+
+router.beforeEach((to, from, next) => {
+  NProgress.start() // start progress bar
+  if (to.path === '/login') {
+    next({ path: '/' })
+    NProgress.done()
+  } else {
+    if (store.getters.roles.length === 0) {
+      const roles = ['editor', 'develop']
+      store.dispatch('GenerateRoutes', { roles }).then(() => { // 根据roles权限生成可访问的路由表
+        router.addRoutes(store.getters.addRouters) // 动态添加可访问路由表
+        next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record
+      })
+    } else {
+      next()
+    }
+  }
+
+  if (whiteList.indexOf(to.path) !== -1) { // 在免登录白名单,直接进入
+    next()
+  } else {
+    next('/login')
+    NProgress.done() // if current page is login will not trigger afterEach hook, so manually handle it
+  }
+
+})
+
+router.afterEach(() => {
+  NProgress.done() // finish progress bar
+})

+ 0 - 25
src/router.js

@@ -1,25 +0,0 @@
-import Vue from 'vue'
-import Router from 'vue-router'
-import Home from './views/Home.vue'
-
-Vue.use(Router)
-
-export default new Router({
-  mode: 'history',
-  base: process.env.BASE_URL,
-  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')
-    }
-  ]
-})

+ 185 - 0
src/router/index.js

@@ -0,0 +1,185 @@
+import Vue from 'vue'
+import Router from 'vue-router'
+import Layout from '../views/Layout'
+
+Vue.use(Router)
+/**
+ * hidden: true                   if `hidden:true` will not show in the sidebar(default is false)
+ * alwaysShow: true               if set true, will always show the root menu, whatever its child routes length
+ *                                if not set alwaysShow, only more than one route under the children
+ *                                it will becomes nested mode, otherwise not show the root menu
+ * redirect: noredirect           if `redirect:noredirect` will no redirct in the breadcrumb
+ * name:'router-name'             the name is used by <keep-alive> (must set!!!)
+ * meta : {
+    title: 'title'               the name show in submenu and breadcrumb (recommend set)
+    icon: 'svg-name'             the icon show in the sidebar,
+  }
+ **/
+export const constantRouterMap = [
+  {
+    path: '/login',
+    component: () => import('../views/About')
+  },
+  {
+    path: '/404',
+    component: () => import('../views/404')
+  },
+  {
+    path: '/',
+    component: Layout,
+    redirect: '/dashboard',
+    name: '首页',
+    hidden: true
+  }
+]
+
+export default new Router({
+  mode: 'history',
+  base: process.env.BASE_URL,
+  scrollBehavior: () => ({ y: 0 }),
+  routes: constantRouterMap
+})
+
+export const asyncRouterMap = [
+  {
+    path: '/dashboard',
+    component: Layout,
+    name: 'dashboard',
+    meta: { title: 'dashboard' },
+    children: [
+      {
+        path: 'analysis',
+        name: 'Analysis',
+        component: () => import('../views/dashboard/Analysis'),
+        meta: { title: '分析页', hideHeader: true }
+      },
+      {
+        path: 'monitor',
+        name: 'Monitor',
+        component: () => import('../views/dashboard/Monitor'),
+        meta: { title: '监控页', hideHeader: true }
+      },
+      {
+        path: 'workplace',
+        name: 'Workplace',
+        component: () => import('../views/dashboard/Workplace'),
+        meta: { title: '工作台', hideHeader: true }
+      }
+    ]
+  },
+  {
+    path: '/form',
+    component: Layout,
+    name: 'form',
+    meta: { title: '表单页' },
+    children: [
+      {
+        path: 'base-form',
+        name: 'BaseForm',
+        component: () => import('../views/form/BasicForm'),
+        meta: { title: '基础表单' }
+      },
+      {
+        path: 'step-form',
+        name: 'StepForm',
+        component: () => import('../views/form/BasicForm'),
+        meta: { title: '分步表单' }
+      },
+      {
+        path: 'advanced-form',
+        name: 'AdvanceForm',
+        component: () => import('../views/form/BasicForm'),
+        meta: { title: '高级表单' }
+      }
+    ]
+  },
+  {
+    path: '/list',
+    component: Layout,
+    name: 'list',
+    meta: { title: '列表页' },
+    children: [
+      {
+        path: 'table-list',
+        name: 'TableList',
+        component: () => import('../views/list/TableList'),
+        meta: { title: '查询表格' }
+      }
+    ]
+  },
+  {
+    path: '/profile',
+    component: Layout,
+    name: 'profile',
+    meta: { title: '详情页' },
+    children: [
+      {
+        path: 'basic',
+        name: 'ProfileBasic',
+        component: () => import('../views/list/TableList'),
+        meta: { title: '基础详情页' }
+      },
+      {
+        path: 'advanced',
+        name: 'ProfileAdvanced',
+        component: () => import('../views/list/TableList'),
+        meta: { title: '高级详情页' }
+      }
+    ]
+  },
+  {
+    path: '/result',
+    component: Layout,
+    name: 'result',
+    meta: { title: '结果页' },
+    children: [
+      {
+        path: 'success',
+        name: 'ResultSuccess',
+        component: () => import('../views/result/Success'),
+        meta: { title: '成功' }
+      },
+      {
+        path: 'fail',
+        name: 'ResultFail',
+        // 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: "fail" */ '../views/result/Success'),
+        meta: { title: '失败' }
+      }
+    ]
+  },
+  {
+    path: '/exception',
+    component: Layout,
+    name: 'exception',
+    meta: { title: '异常页' },
+    children: [
+      {
+        path: '403',
+        name: 'Exception403',
+        component: () => import('../views/result/Success'),
+        meta: { title: '403' }
+      },
+      {
+        path: '404',
+        name: 'Exception404',
+        // 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: "fail" */ '../views/result/Success'),
+        meta: { title: '404' }
+      },
+      {
+        path: '500',
+        name: 'Exception500',
+        // 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: "fail" */ '../views/result/Success'),
+        meta: { title: '500' }
+      }
+    ]
+  }
+]

+ 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: {
-
-  }
-})

+ 8 - 0
src/store/getters.js

@@ -0,0 +1,8 @@
+const getters = {
+  device: state => state.app.device,
+  token: state => state.user.token,
+  roles: state => state.user.roles,
+  addRouters: state => state.permission.addRouters
+}
+
+export default getters

+ 27 - 0
src/store/index.js

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

+ 43 - 0
src/store/modules/app.js

@@ -0,0 +1,43 @@
+import Cookies from 'js-cookie'
+
+const app = {
+  state: {
+    sidebar: {
+      opened: !+Cookies.get('sidebarStatus'),
+      withoutAnimation: false
+    },
+    device: 'desktop'
+  },
+  mutations: {
+    TOGGLE_SIDEBAR: state => {
+      if (state.sidebar.opened) {
+        Cookies.set('sidebarStatus', 1)
+      } else {
+        Cookies.set('sidebarStatus', 0)
+      }
+      state.sidebar.opened = !state.sidebar.opened
+      state.sidebar.withoutAnimation = false
+    },
+    CLOSE_SIDEBAR: (state, withoutAnimation) => {
+      Cookies.set('sidebarStatus', 1)
+      state.sidebar.opened = false
+      state.sidebar.withoutAnimation = withoutAnimation
+    },
+    TOGGLE_DEVICE: (state, device) => {
+      state.device = device
+    }
+  },
+  actions: {
+    ToggleSideBar: ({ commit }) => {
+      commit('TOGGLE_SIDEBAR')
+    },
+    CloseSideBar({ commit }, { withoutAnimation }) {
+      commit('CLOSE_SIDEBAR', withoutAnimation)
+    },
+    ToggleDevice({ commit }, device) {
+      commit('TOGGLE_DEVICE', device)
+    }
+  }
+}
+
+export default app

+ 62 - 0
src/store/modules/permission.js

@@ -0,0 +1,62 @@
+import { asyncRouterMap, constantRouterMap } from "@/router"
+
+function hasPermission(permission, route) {
+  if (route.meta && route.meta.permission) {
+    let flag = -1
+    for (let i = 0, len = permission.length; i < len; i++) {
+      flag = route.meta.permission.indexOf(permission[i])
+      if (flag >= 0) {
+        return true
+      }
+    }
+  }
+}
+
+function hasRole(roles, route) {
+  if (route.meta && route.meta.roles) {
+    return route.meta.roles.indexOf(roles.id)
+  } else {
+    return true
+  }
+}
+
+function filterAsyncRouter(asyncRouterMap, roles) {
+  console.log(asyncRouterMap, roles)
+
+  const accessedRouters = asyncRouterMap.filter(route => {
+    if (hasPermission(roles.permissionList, route)) {
+      if (route.children && route.children.length) {
+        route.children = filterAsyncRouter(route.children, roles)
+      }
+      return true
+    }
+    return false
+  })
+  return accessedRouters
+}
+
+const permission = {
+  state: {
+    routers: constantRouterMap,
+    addRouters: []
+  },
+  mutations: {
+    SET_ROUTERS: (state, routers) => {
+      state.addRouters = routers
+      state.routers = constantRouterMap.concat(routers)
+    }
+  },
+  actions: {
+    GenerateRoutes({ commit }, data) {
+      return new Promise(resolve => {
+        const { roles } = data
+        let accessedRouters
+        accessedRouters = filterAsyncRouter(asyncRouterMap, roles)
+        commit('SET_ROUTERS', accessedRouters)
+        resolve()
+      })
+    }
+  }
+}
+
+export default permission

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

@@ -0,0 +1,100 @@
+
+const user = {
+  state: {
+    token: '',
+    name: '',
+    avatar: '',
+    roles: []
+  },
+
+  mutations: {
+    SET_TOKEN: (state, token) => {
+      state.token = token
+    },
+    SET_NAME: (state, name) => {
+      state.name = name
+    },
+    SET_AVATAR: (state, avatar) => {
+      state.avatar = avatar
+    },
+    SET_ROLES: (state, roles) => {
+      state.roles = roles
+    }
+  },
+
+  actions: {
+    // 登录
+    Login({ commit }, userInfo) {
+      const username = userInfo.username.trim()
+      return new Promise((resolve, reject) => {
+        login(username, userInfo.password).then(response => {
+          const result = response.result
+
+          console.log('login:', result)
+
+          setToken(result.token)
+          commit('SET_TOKEN', result.token)
+          resolve()
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
+
+    // 获取用户信息
+    GetInfo({ commit, state }) {
+      return new Promise((resolve, reject) => {
+        getInfo().then(response => {
+          const result = response.result
+
+          if (result.role && result.permissions.length > 0) {
+            const role = result.role
+            role.permissions = result.permissions
+            role.permissions.map(per => {
+              if (per.actionEntitySet != null && per.actionEntitySet.length > 0) {
+                let action = per.actionEntitySet.map(action => { return action.action })
+                per.actionList = action
+              }
+            })
+            role.permissionList = role.permissions.map(permission => { return permission.permissionId });
+            commit('SET_ROLES', result.role)
+          } else {
+            reject('getInfo: roles must be a non-null array !')
+          }
+
+          commit('SET_NAME', result.name)
+          commit('SET_AVATAR', '')
+
+          resolve(response)
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
+
+    // 登出
+    LogOut({ commit, state }) {
+      return new Promise((resolve, reject) => {
+        logout(state.token).then(() => {
+          commit('SET_TOKEN', '')
+          commit('SET_ROLES', [])
+          // removeToken()
+          resolve()
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
+
+    // 前端 登出
+    FedLogOut({ commit }) {
+      return new Promise(resolve => {
+        commit('SET_TOKEN', '')
+        // removeToken()
+        resolve()
+      })
+    }
+  }
+}
+
+export default user

+ 37 - 0
src/utils/axios.js

@@ -0,0 +1,37 @@
+const VueAxios = {
+    vm: {},
+    // eslint-disable-next-line no-unused-vars
+    install(Vue, router = {}, instance) {
+        if (this.installed) {
+            return;
+        }
+        this.installed = true;
+
+        if (!instance) {
+            // eslint-disable-next-line no-console
+            console.error('You have to install axios');
+            return;
+        }
+
+        Vue.axios = instance;
+
+        Object.defineProperties(Vue.prototype, {
+            axios: {
+                get: function get() {
+                    return instance;
+                }
+            },
+            $http: {
+                get: function get() {
+                    return instance;
+                }
+            }
+        });
+    }
+};
+
+export {
+    VueAxios,
+    // eslint-disable-next-line no-undef
+    instance as axios
+}

+ 52 - 0
src/utils/request.js

@@ -0,0 +1,52 @@
+import axios from 'axios'
+import store from '../store'
+import { VueAxios } from './axios'
+
+// 创建 axios 实例
+const service = axios.create({
+    baseURL: process.env.BASE_API, // api base_url
+    timeout: 5000 // 请求超时时间
+})
+
+// request 拦截器
+service.interceptors.request.use(config => {
+    if (store.getters.token) {
+        config.headers['Access-Token'] = '' // 让每个请求携带自定义 token 请根据实际情况自行修改
+    }
+    return config
+}, error => {
+    // Do something with request error
+    Promise.reject(error)
+})
+
+// respone拦截器
+service.interceptors.response.use(
+    (response) => {
+        const res = response.data
+        //console.log('[LOG] -> respoinse.use', res)
+        if (res.status !== 200) {
+            return Promise.reject('error')
+        } else {
+            return response.data
+        }
+    },
+    (error) => {
+        if (error.response && error.response.data) {
+            const result = error.response.data
+            return Promise.reject(result)
+        }
+        return Promise.reject(error)
+    }
+)
+
+const installer = {
+    vm: {},
+    install(Vue, router = {}) {
+        Vue.use(VueAxios, router, service)
+    }
+}
+
+export {
+    installer as VueAxios,
+    service as axios
+}

+ 15 - 0
src/views/404.vue

@@ -0,0 +1,15 @@
+<template>
+    <div>
+        404 page
+    </div>
+</template>
+
+<script>
+  export default {
+    name: "404"
+  }
+</script>
+
+<style scoped>
+
+</style>

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 10 - 0
src/views/Layout.vue


+ 15 - 0
src/views/dashboard/Analysis.vue

@@ -0,0 +1,15 @@
+<template>
+    <div>
+        Analysis
+    </div>
+</template>
+
+<script>
+  export default {
+    name: "Analysis"
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 15 - 0
src/views/dashboard/Monitor.vue

@@ -0,0 +1,15 @@
+<template>
+    <div>
+        Monitor
+    </div>
+</template>
+
+<script>
+  export default {
+    name: "Monitor"
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 15 - 0
src/views/dashboard/Workplace.vue

@@ -0,0 +1,15 @@
+<template>
+    <div>
+        Workplace
+    </div>
+</template>
+
+<script>
+  export default {
+    name: "Workplace"
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 15 - 0
src/views/form/BasicForm.vue

@@ -0,0 +1,15 @@
+<template>
+    <div>
+        BaseForm
+    </div>
+</template>
+
+<script>
+  export default {
+    name: "BaseForm"
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 15 - 0
src/views/list/TableList.vue

@@ -0,0 +1,15 @@
+<template>
+    <div>
+        TableList
+    </div>
+</template>
+
+<script>
+  export default {
+    name: "TableList"
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 15 - 0
src/views/result/Success.vue

@@ -0,0 +1,15 @@
+<template>
+    <div>
+        Success
+    </div>
+</template>
+
+<script>
+  export default {
+    name: "Success"
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 145 - 4
yarn.lock

@@ -960,6 +960,12 @@ acorn@^5.0.0, acorn@^5.3.0, acorn@^5.5.0, acorn@^5.6.2, acorn@^5.7.1:
   version "5.7.1"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8"
 
+add-dom-event-listener@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/add-dom-event-listener/-/add-dom-event-listener-1.0.2.tgz#8faed2c41008721cf111da1d30d995b85be42bed"
+  dependencies:
+    object-assign "4.x"
+
 address@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/address/-/address-1.0.3.tgz#b5f50631f8d6cec8bd20c963963afb55e06cbce9"
@@ -1028,6 +1034,31 @@ ansi-styles@^3.2.1:
   dependencies:
     color-convert "^1.9.0"
 
+ant-design-vue@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/ant-design-vue/-/ant-design-vue-1.0.3.tgz#f47fe6fef6a4358312af013c607ad828f99fd5f6"
+  dependencies:
+    add-dom-event-listener "^1.0.2"
+    array-tree-filter "^2.1.0"
+    async-validator "^1.8.2"
+    babel-helper-vue-jsx-merge-props "^2.0.3"
+    babel-runtime "6.x"
+    classnames "^2.2.5"
+    component-classes "^1.2.6"
+    dom-align "^1.6.7"
+    dom-closest "^0.2.0"
+    dom-scroll-into-view "^1.2.1"
+    enquire.js "^2.1.6"
+    is-negative-zero "^2.0.0"
+    json2mq "^0.2.0"
+    lodash "^4.17.5"
+    moment "^2.21.0"
+    omit.js "^1.0.0"
+    resize-observer-polyfill "^1.5.0"
+    shallow-equal "^1.0.0"
+    shallowequal "^1.0.2"
+    warning "^3.0.0"
+
 anymatch@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
@@ -1105,6 +1136,10 @@ array-reduce@~0.0.0:
   version "0.0.0"
   resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b"
 
+array-tree-filter@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz#873ac00fec83749f255ac8dd083814b4f6329190"
+
 array-union@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
@@ -1167,6 +1202,12 @@ async-limiter@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
 
+async-validator@^1.8.2:
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-1.8.5.tgz#dc3e08ec1fd0dddb67e60842f02c0cd1cec6d7f0"
+  dependencies:
+    babel-runtime "6.x"
+
 async@^1.5.2:
   version "1.5.2"
   resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
@@ -1204,6 +1245,13 @@ aws4@^1.6.0, aws4@^1.8.0:
   version "1.8.0"
   resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f"
 
+axios@^0.18.0:
+  version "0.18.0"
+  resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.0.tgz#32d53e4851efdc0a11993b6cd000789d70c05102"
+  dependencies:
+    follow-redirects "^1.3.0"
+    is-buffer "^1.1.5"
+
 babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
   version "6.26.0"
   resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
@@ -1253,6 +1301,13 @@ babel-plugin-transform-vue-jsx@^4.0.1:
   dependencies:
     esutils "^2.0.2"
 
+babel-runtime@6.x, babel-runtime@^6.23.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+  dependencies:
+    core-js "^2.4.0"
+    regenerator-runtime "^0.11.0"
+
 babylon@7.0.0-beta.44:
   version "7.0.0-beta.44"
   resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d"
@@ -1666,6 +1721,10 @@ class-utils@^0.3.5:
     isobject "^3.0.0"
     static-extend "^0.1.1"
 
+classnames@^2.2.5:
+  version "2.2.6"
+  resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce"
+
 clean-css@4.2.x:
   version "4.2.1"
   resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17"
@@ -1797,10 +1856,20 @@ commondir@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
 
+component-classes@^1.2.6:
+  version "1.2.6"
+  resolved "https://registry.yarnpkg.com/component-classes/-/component-classes-1.2.6.tgz#c642394c3618a4d8b0b8919efccbbd930e5cd691"
+  dependencies:
+    component-indexof "0.0.3"
+
 component-emitter@^1.2.1:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
 
+component-indexof@0.0.3:
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/component-indexof/-/component-indexof-0.0.3.tgz#11d091312239eb8f32c8f25ae9cb002ffe8d3c24"
+
 compressible@~2.0.14:
   version "2.0.14"
   resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.14.tgz#326c5f507fbb055f54116782b969a81b67a29da7"
@@ -1904,7 +1973,7 @@ copy-webpack-plugin@^4.5.2:
     p-limit "^1.0.0"
     serialize-javascript "^1.4.0"
 
-core-js@^2.5.3:
+core-js@^2.4.0, core-js@^2.5.3:
   version "2.5.7"
   resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e"
 
@@ -2347,12 +2416,30 @@ doctrine@^2.1.0:
   dependencies:
     esutils "^2.0.2"
 
+dom-align@^1.6.7:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.8.0.tgz#c0e89b5b674c6e836cd248c52c2992135f093654"
+
+dom-closest@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/dom-closest/-/dom-closest-0.2.0.tgz#ebd9f91d1bf22e8d6f477876bbcd3ec90216c0cf"
+  dependencies:
+    dom-matches ">=1.0.1"
+
 dom-converter@~0.1:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.1.4.tgz#a45ef5727b890c9bffe6d7c876e7b19cb0e17f3b"
   dependencies:
     utila "~0.3"
 
+dom-matches@>=1.0.1:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/dom-matches/-/dom-matches-2.0.0.tgz#d2728b416a87533980eb089b848d253cf23a758c"
+
+dom-scroll-into-view@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/dom-scroll-into-view/-/dom-scroll-into-view-1.2.1.tgz#e8f36732dd089b0201a88d7815dc3f88e6d66c7e"
+
 dom-serializer@0:
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
@@ -2467,6 +2554,10 @@ enhanced-resolve@^4.1.0:
     memory-fs "^0.4.0"
     tapable "^1.0.0"
 
+enquire.js@^2.1.6:
+  version "2.1.6"
+  resolved "https://registry.yarnpkg.com/enquire.js/-/enquire.js-2.1.6.tgz#3e8780c9b8b835084c3f60e166dbc3c2a3c89814"
+
 entities@~1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
@@ -2980,7 +3071,7 @@ flush-write-stream@^1.0.0:
     inherits "^2.0.1"
     readable-stream "^2.0.4"
 
-follow-redirects@^1.0.0:
+follow-redirects@^1.0.0, follow-redirects@^1.3.0:
   version "1.5.5"
   resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.5.tgz#3c143ca599a2e22e62876687d68b23d55bad788b"
   dependencies:
@@ -3779,6 +3870,10 @@ is-glob@^4.0.0:
   dependencies:
     is-extglob "^2.1.1"
 
+is-negative-zero@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461"
+
 is-number@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
@@ -3921,6 +4016,10 @@ js-base64@^2.1.8:
   version "2.4.8"
   resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.8.tgz#57a9b130888f956834aa40c5b165ba59c758f033"
 
+js-cookie@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.0.tgz#1b2c279a6eece380a12168b92485265b35b1effb"
+
 js-message@1.0.5:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/js-message/-/js-message-1.0.5.tgz#2300d24b1af08e89dd095bc1a4c9c9cfcb892d15"
@@ -3989,6 +4088,12 @@ json-stringify-safe@~5.0.1:
   version "5.0.1"
   resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
 
+json2mq@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/json2mq/-/json2mq-0.2.0.tgz#b637bd3ba9eabe122c83e9720483aeb10d2c904a"
+  dependencies:
+    string-convert "^0.2.0"
+
 json3@^3.3.2:
   version "3.3.2"
   resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1"
@@ -4440,6 +4545,10 @@ mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdi
   dependencies:
     minimist "0.0.8"
 
+moment@^2.21.0, moment@^2.22.2:
+  version "2.22.2"
+  resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66"
+
 move-concurrently@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
@@ -4692,6 +4801,10 @@ npm-run-path@^2.0.0:
     gauge "~2.7.3"
     set-blocking "~2.0.0"
 
+nprogress@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1"
+
 nth-check@^1.0.1, nth-check@~1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4"
@@ -4714,7 +4827,7 @@ oauth-sign@~0.9.0:
   version "0.9.0"
   resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
 
-object-assign@^4.0.1, object-assign@^4.1.0:
+object-assign@4.x, object-assign@^4.0.1, object-assign@^4.1.0:
   version "4.1.1"
   resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
 
@@ -4782,6 +4895,12 @@ obuf@^1.0.0, obuf@^1.1.1:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e"
 
+omit.js@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/omit.js/-/omit.js-1.0.0.tgz#e013cb86a7517b9cf6f7cfb0ddb4297256a99288"
+  dependencies:
+    babel-runtime "^6.23.0"
+
 on-finished@~2.3.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
@@ -5606,7 +5725,7 @@ regenerate@^1.2.1, regenerate@^1.4.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
 
-regenerator-runtime@^0.11.1:
+regenerator-runtime@^0.11.0, regenerator-runtime@^0.11.1:
   version "0.11.1"
   resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
 
@@ -5791,6 +5910,10 @@ requires-port@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
 
+resize-observer-polyfill@^1.5.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.0.tgz#660ff1d9712a2382baa2cad450a4716209f9ca69"
+
 resolve-cwd@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
@@ -6047,6 +6170,14 @@ shallow-clone@^1.0.0:
     kind-of "^5.0.0"
     mixin-object "^2.0.1"
 
+shallow-equal@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-1.0.0.tgz#508d1838b3de590ab8757b011b25e430900945f7"
+
+shallowequal@^1.0.2:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8"
+
 shebang-command@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
@@ -6308,6 +6439,10 @@ stream-shift@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
 
+string-convert@^0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/string-convert/-/string-convert-0.2.1.tgz#6982cc3049fbb4cd85f8b24568b9d9bf39eeff97"
+
 string-width@^1.0.1, string-width@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
@@ -6871,6 +7006,12 @@ vuex@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/vuex/-/vuex-3.0.1.tgz#e761352ebe0af537d4bb755a9b9dc4be3df7efd2"
 
+warning@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c"
+  dependencies:
+    loose-envify "^1.0.0"
+
 watchpack@^1.5.0:
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"

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