徐桐章 4 jaren geleden
commit
9952e4cecd
73 gewijzigde bestanden met toevoegingen van 13845 en 0 verwijderingen
  1. 9 0
      .env.development
  2. 9 0
      .env.production
  3. 9 0
      .env.test
  4. 21 0
      .gitignore
  5. 49 0
      README.md
  6. 10 0
      babel.config.js
  7. 59 0
      package.json
  8. BIN
      public/img/logo.png
  9. 28 0
      public/index.html
  10. BIN
      public/static/favicon.ico
  11. BIN
      public/static/loginBG.png
  12. BIN
      public/static/logo.ico
  13. 53 0
      src/App.vue
  14. 17 0
      src/common/api/api.js
  15. 112 0
      src/common/api/axios.js
  16. 12 0
      src/common/api/port.js
  17. 539 0
      src/common/font/demo.css
  18. 745 0
      src/common/font/demo_index.html
  19. 117 0
      src/common/font/iconfont.css
  20. BIN
      src/common/font/iconfont.eot
  21. 1 0
      src/common/font/iconfont.js
  22. 184 0
      src/common/font/iconfont.json
  23. 101 0
      src/common/font/iconfont.svg
  24. BIN
      src/common/font/iconfont.ttf
  25. BIN
      src/common/font/iconfont.woff
  26. BIN
      src/common/font/iconfont.woff2
  27. BIN
      src/common/font/pingFang.ttf
  28. 25 0
      src/common/sass/appPage.scss
  29. 5 0
      src/common/sass/common.scss
  30. 56 0
      src/common/sass/currency.scss
  31. 2 0
      src/common/sass/indexPage.scss
  32. 41 0
      src/common/sass/layout.scss
  33. 156 0
      src/common/sass/loginPage.scss
  34. 20 0
      src/common/sass/utils/cookiesDeploy.js
  35. 41 0
      src/common/sass/utils/utils.js
  36. 21 0
      src/common/utils/cookiesDeploy.js
  37. 44 0
      src/common/utils/utils.js
  38. 15 0
      src/components/vAbove/vAbove.js
  39. 60 0
      src/components/vAbove/vAbove.scss
  40. 53 0
      src/components/vAbove/vAbove.vue
  41. 15 0
      src/components/vBread/vBread.js
  42. 19 0
      src/components/vBread/vBread.scss
  43. 65 0
      src/components/vBread/vBread.vue
  44. 8 0
      src/components/vInput/vInput.js
  45. 62 0
      src/components/vInput/vInput.scss
  46. 149 0
      src/components/vInput/vInput.vue
  47. 15 0
      src/components/vNav/vNav.js
  48. 70 0
      src/components/vNav/vNav.scss
  49. 176 0
      src/components/vNav/vNav.vue
  50. 8 0
      src/components/vPager/vPager.js
  51. 43 0
      src/components/vPager/vPager.scss
  52. 42 0
      src/components/vPager/vPager.vue
  53. 8 0
      src/components/vTable/vTable.js
  54. 30 0
      src/components/vTable/vTable.scss
  55. 185 0
      src/components/vTable/vTable.vue
  56. 152 0
      src/components/wangEnduit/wangEnduit.vue
  57. 76 0
      src/main.js
  58. 26 0
      src/permission.js
  59. 113 0
      src/router/index.js
  60. 21 0
      src/store/index.js
  61. 244 0
      src/views/candidateManage/candidateList.vue
  62. 58 0
      src/views/companyManage/basicInfo.vue
  63. 92 0
      src/views/companyManage/formManage.vue
  64. 55 0
      src/views/companyManage/passwordSettings.vue
  65. 86 0
      src/views/companyManage/positionInfo.vue
  66. 88 0
      src/views/companyManage/procedureManage.vue
  67. 67 0
      src/views/companyManage/sceneManage.vue
  68. 84 0
      src/views/companyManage/templateManage.vue
  69. 72 0
      src/views/companyManage/videoManage.vue
  70. 13 0
      src/views/error.vue
  71. 113 0
      src/views/login.vue
  72. 60 0
      vue.config.js
  73. 8916 0
      yarn.lock

+ 9 - 0
.env.development

@@ -0,0 +1,9 @@
+// 本地环境
+module.exports={
+  NODE_ENV = development
+  VUE_APP_API = http://47.100.59.52:7782
+  VUE_APP_IMG = http://cdn.info666.com
+  VUE_APP_VER = 0.0.1
+  VUE_APP_DAT = new Date().getTime()
+  VUE_APP_DOMAIN = 127.0.0.1
+}

+ 9 - 0
.env.production

@@ -0,0 +1,9 @@
+// 生产环境
+module.exports={
+  NODE_ENV = production
+  VUE_APP_API = https://api.batterycloud.com.cn
+  VUE_APP_IMG = https://cdn.batterycloud.com.cn
+  VUE_APP_VER = 0.0.1
+  VUE_APP_DAT = new Date().getTime()
+  VUE_APP_DOMAIN = info666.com
+}

+ 9 - 0
.env.test

@@ -0,0 +1,9 @@
+// 测试环境
+module.exports={
+  NODE_ENV = test
+  VUE_APP_API = http://47.100.59.52:7782
+  VUE_APP_IMG = http://cdn.info666.com
+  VUE_APP_VER = 0.0.1
+  VUE_APP_DAT = new Date().getTime()
+  VUE_APP_DOMAIN = info666.com
+}

+ 21 - 0
.gitignore

@@ -0,0 +1,21 @@
+.DS_Store
+node_modules
+/dist
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?

+ 49 - 0
README.md

@@ -0,0 +1,49 @@
+<!--
+ * @Author       : yuanrunwei
+ * @Date         : 2020-05-18 12:05:37
+ * @LastEditors  : yuanrunwei
+ * @LastEditTime : 2020-05-18 19:38:29
+ * @FilePath     : \ambre-admin-noob\README.md
+--> 
+# 费多多后台
+
+```
+install:yarn install
+```
+```
+dev:yarn serve
+```
+```
+build:yarn test/build
+```
+
+#version
+
+# ⭐AMBRE⭐
+
+## v-input:顶部搜索栏
+
+### 组件引用
+
+```
+<v-input
+:list="list"              // 组件内功能项列表
+@search="search">         // 查询方法
+</v-input>
+```
+
+### 参数说明
+
+```
+{
+  placeholder: '',        //
+  type: 'select',         //
+  props: 'test',          //
+  options: [              //
+    {
+      label: '第一项',
+      value: '1'
+    }
+  ]
+}
+```

+ 10 - 0
babel.config.js

@@ -0,0 +1,10 @@
+module.exports = {
+  'presets': [
+    [
+      '@babel/preset-env',
+      {
+        'useBuiltIns': 'entry'
+      }
+    ]
+  ]
+}

+ 59 - 0
package.json

@@ -0,0 +1,59 @@
+{
+  "name": "vuecli3",
+  "version": "0.1.0",
+  "private": true,
+  "scripts": {
+    "serve": "vue-cli-service serve",
+    "build": "vue-cli-service build --mode production",
+    "test": "vue-cli-service build --mode test",
+    "lint": "vue-cli-service lint"
+  },
+  "dependencies": {
+    "af-table-column": "^1.0.3",
+    "axios": "^0.19.0",
+    "babel-polyfill": "^6.26.0",
+    "core-js": "^3.4.3",
+    "css-vars-ponyfill": "^2.3.2",
+    "element-ui": "^2.13.0",
+    "js-cookie": "^2.2.1",
+    "js-cookies": "^1.0.4",
+    "vue": "^2.6.10",
+    "vue-cropper": "^0.5.2",
+    "vue-router": "^3.1.3",
+    "vuex": "^3.1.2",
+    "wangeditor": "^3.1.1"
+  },
+  "devDependencies": {
+    "@vue/cli-plugin-babel": "^4.1.0",
+    "@vue/cli-plugin-eslint": "^4.1.0",
+    "@vue/cli-plugin-router": "^4.1.0",
+    "@vue/cli-plugin-vuex": "^4.1.0",
+    "@vue/cli-service": "^4.1.0",
+    "@vue/eslint-config-standard": "^4.0.0",
+    "babel-eslint": "^10.0.3",
+    "eslint": "^5.16.0",
+    "eslint-plugin-vue": "^5.0.0",
+    "node-sass": "^4.12.0",
+    "sass-loader": "^8.0.0",
+    "vue-template-compiler": "^2.6.10"
+  },
+  "eslintConfig": {
+    "root": true,
+    "env": {
+      "node": true
+    },
+    "extends": [
+      "plugin:vue/essential",
+      "@vue/standard"
+    ],
+    "rules": {},
+    "parserOptions": {
+      "parser": "babel-eslint"
+    }
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions",
+    "not ie < 11"
+  ]
+}

BIN
public/img/logo.png


+ 28 - 0
public/index.html

@@ -0,0 +1,28 @@
+<!--
+ * @Description: create
+ * @Version: 1.0
+ * @Autor: XuTongZhang
+ * @Date: 2020-06-09 15:30:15
+ * @LastEditors: XuTongZhang
+ * @LastEditTime: 2020-07-28 16:33:21
+--> 
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta name="referrer" content="no-referrer" />
+    <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 %>static/logo.ico">
+    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Noto+Sans+SC:100,300,400,500,600,700,900">
+    <script src = "https://cdn.jsdelivr.net/npm/proxy-polyfill@0.3.0/proxy.min.js"></script>
+    <title>上海梵天软件</title>
+  </head>
+  <body>
+    <noscript>
+      <strong>We're sorry but vuecli3 doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
+    </noscript>
+    <div id="app"></div>
+    <!-- built files will be auto injected -->
+  </body>
+</html>

BIN
public/static/favicon.ico


BIN
public/static/loginBG.png


BIN
public/static/logo.ico


+ 53 - 0
src/App.vue

@@ -0,0 +1,53 @@
+<!--
+ * @Description: create
+ * @Version: 1.0
+ * @Autor: XuTongZhang
+ * @Date: 2020-06-09 15:30:15
+ * @LastEditors: XuTongZhang
+ * @LastEditTime: 2020-07-28 15:51:58
+-->
+<template>
+  <div class="appPage">
+    <template v-if="$route.name!=='login'">
+    <v-nav @keyPath="keyPath" class="leftNav"></v-nav>
+    <div class="view">
+      <v-above></v-above>
+      <div class="view-info">
+        <v-bread :path="path" :nav="nav"></v-bread>
+        <router-view />
+      </div>
+    </div>
+    </template>
+    <router-view v-else />
+  </div>
+</template>
+<script>
+export default {
+  data () {
+    return {
+      path: '',
+      nav: []
+    }
+  },
+  mounted () {
+  },
+  methods: {
+    keyPath (val, route) {
+      this.path = val
+      this.nav = route
+    }
+  },
+  watch: {
+    $route (to, from) {
+      if (from.name === 'login') {
+        this.$router.go(0)
+      }
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.view{
+  padding-left:210px;
+}
+</style>

+ 17 - 0
src/common/api/api.js

@@ -0,0 +1,17 @@
+/*
+ * @Author       : yuanrunwei
+ * @Date         : 2020-05-18 12:05:37
+ * @LastEditors  : yuanrunwei
+ * @LastEditTime : 2020-06-14 16:09:38
+ * @FilePath     : \batterycloud-admin\src\common\api\api.js
+ */
+import axios from './axios'
+export default {
+  post (api, data) {
+    return axios.post(api, data)
+  },
+  get (api) {
+    return axios.get(api)
+  }
+
+}

+ 112 - 0
src/common/api/axios.js

@@ -0,0 +1,112 @@
+/*
+ * @Author       : yuanrunwei
+ * @Date         : 2020-05-18 12:05:37
+ * @LastEditors  : yuanrunwei
+ * @LastEditTime : 2020-06-15 20:50:00
+ * @FilePath     : \batterycloud-admin\src\common\api\axios.js
+ */
+import axios from 'axios'
+import vue from '../../main'
+import { Message, Loading } from 'element-ui'
+// import { all } from 'core-js/fn/promise'
+let api = ''
+let loading
+const whiteList = ['test', 'production']
+const allowList = [
+  '/platform/upload/platformUploadImg'
+]
+
+const service = axios.create({
+  baseURL: whiteList.indexOf(process.env.NODE_ENV) !== -1 && process.env.VUE_APP_API,
+  timeout: 90000
+})
+
+service.interceptors.request.use(
+  config => {
+    if (allowList.indexOf(config.url) === -1) {
+      let data = {
+        'from': 0,
+        'page': 1,
+        'rows': 10,
+        'userid': localStorage.getItem('managerid') - 0,
+        'sidx': '',
+        'sord': '',
+        'token': localStorage.getItem('token'),
+        'reqdata': {}
+      }
+      config.data = Object.assign(data, config.data)
+    }
+    loading = Loading.service({
+      lock: true,
+      text: 'Loading',
+      spinner: 'el-icon-loading',
+      background: 'rgba(0, 0, 0, 0.7)'
+    })
+    config.headers['platform-sessionId'] = localStorage.getItem('token')
+    api = config.url
+    return config
+  },
+  error => {
+    Promise.reject(error)
+  }
+)
+
+service.interceptors.response.use(
+  res => {
+    return new Promise((resolve, reject) => {
+      if (res.data.state === 206) {
+        localStorage.clear()
+        // sessionStorage.claer()
+        vue.$cookies.removeCookies()
+        loading.close()
+        setTimeout(() => {
+          location.reload()
+        }, 100)
+      }
+      if (allowList.indexOf(api) !== -1) {
+        loading.close()
+        resolve(res.data)
+      } else {
+        if (res.status === 200) {
+          if (res.data.state !== 100) {
+            Message({
+              message: res.data.msg,
+              type: 'error',
+              duration: 5 * 1000
+            })
+            loading.close()
+            reject(res.data.msg)
+          } else {
+            resolve(res.data)
+            loading.close()
+          }
+        } else {
+          loading.close()
+          Message({
+            message: res.statusText,
+            type: 'error',
+            duration: 5 * 1000
+          })
+          if (res.status > 100 && res.status < 200) {
+            if (whiteList.indexOf(process.env.NODE_ENV) !== -1) {
+              let url = `http://monitor.info666.com/monitor/alert?projectAbbr=batterycloud-test&errorMsg=接口:${api}(${res.statusText})&logPath=前端开发环境(${process.env.NODE_ENV})`
+              axios.get(url)
+              loading.close()
+            }
+          }
+          loading.close()
+          reject(res)
+        }
+      }
+    })
+  },
+  error => {
+    loading.close()
+    Message({
+      message: '请求异常' + error,
+      type: 'error',
+      duration: 5 * 1000
+    })
+  }
+)
+export default service

+ 12 - 0
src/common/api/port.js

@@ -0,0 +1,12 @@
+/*
+ * @Description: create
+ * @Version: 1.0
+ * @Autor: XuTongZhang
+ * @Date: 2020-07-28 14:22:47
+ * @LastEditors: XuTongZhang
+ * @LastEditTime: 2020-07-28 14:34:52
+ */
+
+export default {
+  websiteHomePage: '/website/home/websiteHomePage' // 首页
+}

+ 539 - 0
src/common/font/demo.css

@@ -0,0 +1,539 @@
+/* Logo 字体 */
+@font-face {
+  font-family: "iconfont logo";
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
+}
+
+.logo {
+  font-family: "iconfont logo";
+  font-size: 160px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+/* tabs */
+.nav-tabs {
+  position: relative;
+}
+
+.nav-tabs .nav-more {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  height: 42px;
+  line-height: 42px;
+  color: #666;
+}
+
+#tabs {
+  border-bottom: 1px solid #eee;
+}
+
+#tabs li {
+  cursor: pointer;
+  width: 100px;
+  height: 40px;
+  line-height: 40px;
+  text-align: center;
+  font-size: 16px;
+  border-bottom: 2px solid transparent;
+  position: relative;
+  z-index: 1;
+  margin-bottom: -1px;
+  color: #666;
+}
+
+
+#tabs .active {
+  border-bottom-color: #f00;
+  color: #222;
+}
+
+.tab-container .content {
+  display: none;
+}
+
+/* 页面布局 */
+.main {
+  padding: 30px 100px;
+  width: 960px;
+  margin: 0 auto;
+}
+
+.main .logo {
+  color: #333;
+  text-align: left;
+  margin-bottom: 30px;
+  line-height: 1;
+  height: 110px;
+  margin-top: -50px;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.main .logo a {
+  font-size: 160px;
+  color: #333;
+}
+
+.helps {
+  margin-top: 40px;
+}
+
+.helps pre {
+  padding: 20px;
+  margin: 10px 0;
+  border: solid 1px #e7e1cd;
+  background-color: #fffdef;
+  overflow: auto;
+}
+
+.icon_lists {
+  width: 100% !important;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.icon_lists li {
+  width: 100px;
+  margin-bottom: 10px;
+  margin-right: 20px;
+  text-align: center;
+  list-style: none !important;
+  cursor: default;
+}
+
+.icon_lists li .code-name {
+  line-height: 1.2;
+}
+
+.icon_lists .icon {
+  display: block;
+  height: 100px;
+  line-height: 100px;
+  font-size: 42px;
+  margin: 10px auto;
+  color: #333;
+  -webkit-transition: font-size 0.25s linear, width 0.25s linear;
+  -moz-transition: font-size 0.25s linear, width 0.25s linear;
+  transition: font-size 0.25s linear, width 0.25s linear;
+}
+
+.icon_lists .icon:hover {
+  font-size: 100px;
+}
+
+.icon_lists .svg-icon {
+  /* 通过设置 font-size 来改变图标大小 */
+  width: 1em;
+  /* 图标和文字相邻时,垂直对齐 */
+  vertical-align: -0.15em;
+  /* 通过设置 color 来改变 SVG 的颜色/fill */
+  fill: currentColor;
+  /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
+      normalize.css 中也包含这行 */
+  overflow: hidden;
+}
+
+.icon_lists li .name,
+.icon_lists li .code-name {
+  color: #666;
+}
+
+/* markdown 样式 */
+.markdown {
+  color: #666;
+  font-size: 14px;
+  line-height: 1.8;
+}
+
+.highlight {
+  line-height: 1.5;
+}
+
+.markdown img {
+  vertical-align: middle;
+  max-width: 100%;
+}
+
+.markdown h1 {
+  color: #404040;
+  font-weight: 500;
+  line-height: 40px;
+  margin-bottom: 24px;
+}
+
+.markdown h2,
+.markdown h3,
+.markdown h4,
+.markdown h5,
+.markdown h6 {
+  color: #404040;
+  margin: 1.6em 0 0.6em 0;
+  font-weight: 500;
+  clear: both;
+}
+
+.markdown h1 {
+  font-size: 28px;
+}
+
+.markdown h2 {
+  font-size: 22px;
+}
+
+.markdown h3 {
+  font-size: 16px;
+}
+
+.markdown h4 {
+  font-size: 14px;
+}
+
+.markdown h5 {
+  font-size: 12px;
+}
+
+.markdown h6 {
+  font-size: 12px;
+}
+
+.markdown hr {
+  height: 1px;
+  border: 0;
+  background: #e9e9e9;
+  margin: 16px 0;
+  clear: both;
+}
+
+.markdown p {
+  margin: 1em 0;
+}
+
+.markdown>p,
+.markdown>blockquote,
+.markdown>.highlight,
+.markdown>ol,
+.markdown>ul {
+  width: 80%;
+}
+
+.markdown ul>li {
+  list-style: circle;
+}
+
+.markdown>ul li,
+.markdown blockquote ul>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown>ul li p,
+.markdown>ol li p {
+  margin: 0.6em 0;
+}
+
+.markdown ol>li {
+  list-style: decimal;
+}
+
+.markdown>ol li,
+.markdown blockquote ol>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown code {
+  margin: 0 3px;
+  padding: 0 5px;
+  background: #eee;
+  border-radius: 3px;
+}
+
+.markdown strong,
+.markdown b {
+  font-weight: 600;
+}
+
+.markdown>table {
+  border-collapse: collapse;
+  border-spacing: 0px;
+  empty-cells: show;
+  border: 1px solid #e9e9e9;
+  width: 95%;
+  margin-bottom: 24px;
+}
+
+.markdown>table th {
+  white-space: nowrap;
+  color: #333;
+  font-weight: 600;
+}
+
+.markdown>table th,
+.markdown>table td {
+  border: 1px solid #e9e9e9;
+  padding: 8px 16px;
+  text-align: left;
+}
+
+.markdown>table th {
+  background: #F7F7F7;
+}
+
+.markdown blockquote {
+  font-size: 90%;
+  color: #999;
+  border-left: 4px solid #e9e9e9;
+  padding-left: 0.8em;
+  margin: 1em 0;
+}
+
+.markdown blockquote p {
+  margin: 0;
+}
+
+.markdown .anchor {
+  opacity: 0;
+  transition: opacity 0.3s ease;
+  margin-left: 8px;
+}
+
+.markdown .waiting {
+  color: #ccc;
+}
+
+.markdown h1:hover .anchor,
+.markdown h2:hover .anchor,
+.markdown h3:hover .anchor,
+.markdown h4:hover .anchor,
+.markdown h5:hover .anchor,
+.markdown h6:hover .anchor {
+  opacity: 1;
+  display: inline-block;
+}
+
+.markdown>br,
+.markdown>p>br {
+  clear: both;
+}
+
+
+.hljs {
+  display: block;
+  background: white;
+  padding: 0.5em;
+  color: #333333;
+  overflow-x: auto;
+}
+
+.hljs-comment,
+.hljs-meta {
+  color: #969896;
+}
+
+.hljs-string,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-strong,
+.hljs-emphasis,
+.hljs-quote {
+  color: #df5000;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-type {
+  color: #a71d5d;
+}
+
+.hljs-literal,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-attribute {
+  color: #0086b3;
+}
+
+.hljs-section,
+.hljs-name {
+  color: #63a35c;
+}
+
+.hljs-tag {
+  color: #333333;
+}
+
+.hljs-title,
+.hljs-attr,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-selector-attr,
+.hljs-selector-pseudo {
+  color: #795da3;
+}
+
+.hljs-addition {
+  color: #55a532;
+  background-color: #eaffea;
+}
+
+.hljs-deletion {
+  color: #bd2c00;
+  background-color: #ffecec;
+}
+
+.hljs-link {
+  text-decoration: underline;
+}
+
+/* 代码高亮 */
+/* PrismJS 1.15.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+  color: black;
+  background: none;
+  text-shadow: 0 1px white;
+  font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+  text-align: left;
+  white-space: pre;
+  word-spacing: normal;
+  word-break: normal;
+  word-wrap: normal;
+  line-height: 1.5;
+
+  -moz-tab-size: 4;
+  -o-tab-size: 4;
+  tab-size: 4;
+
+  -webkit-hyphens: none;
+  -moz-hyphens: none;
+  -ms-hyphens: none;
+  hyphens: none;
+}
+
+pre[class*="language-"]::-moz-selection,
+pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection,
+code[class*="language-"] ::-moz-selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+pre[class*="language-"]::selection,
+pre[class*="language-"] ::selection,
+code[class*="language-"]::selection,
+code[class*="language-"] ::selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+@media print {
+
+  code[class*="language-"],
+  pre[class*="language-"] {
+    text-shadow: none;
+  }
+}
+
+/* Code blocks */
+pre[class*="language-"] {
+  padding: 1em;
+  margin: .5em 0;
+  overflow: auto;
+}
+
+:not(pre)>code[class*="language-"],
+pre[class*="language-"] {
+  background: #f5f2f0;
+}
+
+/* Inline code */
+:not(pre)>code[class*="language-"] {
+  padding: .1em;
+  border-radius: .3em;
+  white-space: normal;
+}
+
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+  color: slategray;
+}
+
+.token.punctuation {
+  color: #999;
+}
+
+.namespace {
+  opacity: .7;
+}
+
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+  color: #905;
+}
+
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+  color: #690;
+}
+
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+  color: #9a6e3a;
+  background: hsla(0, 0%, 100%, .5);
+}
+
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+  color: #07a;
+}
+
+.token.function,
+.token.class-name {
+  color: #DD4A68;
+}
+
+.token.regex,
+.token.important,
+.token.variable {
+  color: #e90;
+}
+
+.token.important,
+.token.bold {
+  font-weight: bold;
+}
+
+.token.italic {
+  font-style: italic;
+}
+
+.token.entity {
+  cursor: help;
+}

+ 745 - 0
src/common/font/demo_index.html

@@ -0,0 +1,745 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8"/>
+  <title>IconFont Demo</title>
+  <link rel="shortcut icon" href="https://gtms04.alicdn.com/tps/i4/TB1_oz6GVXXXXaFXpXXJDFnIXXX-64-64.ico" type="image/x-icon"/>
+  <link rel="stylesheet" href="https://g.alicdn.com/thx/cube/1.3.2/cube.min.css">
+  <link rel="stylesheet" href="demo.css">
+  <link rel="stylesheet" href="iconfont.css">
+  <script src="iconfont.js"></script>
+  <!-- jQuery -->
+  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/7bfddb60-08e8-11e9-9b04-53e73bb6408b.js"></script>
+  <!-- 代码高亮 -->
+  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/a3f714d0-08e6-11e9-8a15-ebf944d7534c.js"></script>
+</head>
+<body>
+  <div class="main">
+    <h1 class="logo"><a href="https://www.iconfont.cn/" title="iconfont 首页" target="_blank">&#xe86b;</a></h1>
+    <div class="nav-tabs">
+      <ul id="tabs" class="dib-box">
+        <li class="dib active"><span>Unicode</span></li>
+        <li class="dib"><span>Font class</span></li>
+        <li class="dib"><span>Symbol</span></li>
+      </ul>
+      
+      <a href="https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=1591804" target="_blank" class="nav-more">查看项目</a>
+      
+    </div>
+    <div class="tab-container">
+      <div class="content unicode" style="display: block;">
+          <ul class="icon_lists dib-box">
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe615;</span>
+                <div class="name">店铺</div>
+                <div class="code-name">&amp;#xe615;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe616;</span>
+                <div class="name">问卷</div>
+                <div class="code-name">&amp;#xe616;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe643;</span>
+                <div class="name">购物车</div>
+                <div class="code-name">&amp;#xe643;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe608;</span>
+                <div class="name">商品管理</div>
+                <div class="code-name">&amp;#xe608;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe66d;</span>
+                <div class="name">账号</div>
+                <div class="code-name">&amp;#xe66d;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6fa;</span>
+                <div class="name">取消</div>
+                <div class="code-name">&amp;#xe6fa;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe638;</span>
+                <div class="name">商品管理</div>
+                <div class="code-name">&amp;#xe638;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe60b;</span>
+                <div class="name">加号</div>
+                <div class="code-name">&amp;#xe60b;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe64e;</span>
+                <div class="name">账号</div>
+                <div class="code-name">&amp;#xe64e;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe674;</span>
+                <div class="name">首页</div>
+                <div class="code-name">&amp;#xe674;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe627;</span>
+                <div class="name">店铺 (2)</div>
+                <div class="code-name">&amp;#xe627;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe731;</span>
+                <div class="name">手机</div>
+                <div class="code-name">&amp;#xe731;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe62b;</span>
+                <div class="name">头像</div>
+                <div class="code-name">&amp;#xe62b;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe665;</span>
+                <div class="name">验证码</div>
+                <div class="code-name">&amp;#xe665;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe614;</span>
+                <div class="name">时间</div>
+                <div class="code-name">&amp;#xe614;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe618;</span>
+                <div class="name">密码</div>
+                <div class="code-name">&amp;#xe618;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe600;</span>
+                <div class="name">删除/数字面板编辑态</div>
+                <div class="code-name">&amp;#xe600;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe617;</span>
+                <div class="name">编 辑</div>
+                <div class="code-name">&amp;#xe617;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe621;</span>
+                <div class="name">眼睛</div>
+                <div class="code-name">&amp;#xe621;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe623;</span>
+                <div class="name">yanjing</div>
+                <div class="code-name">&amp;#xe623;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe625;</span>
+                <div class="name">shijian</div>
+                <div class="code-name">&amp;#xe625;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe626;</span>
+                <div class="name">眼睛2</div>
+                <div class="code-name">&amp;#xe626;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe63f;</span>
+                <div class="name">shangpinguanli (1)@2x</div>
+                <div class="code-name">&amp;#xe63f;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe642;</span>
+                <div class="name">dianpu-copy@2x</div>
+                <div class="code-name">&amp;#xe642;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe644;</span>
+                <div class="name">shangpinguanli@2x</div>
+                <div class="code-name">&amp;#xe644;</div>
+              </li>
+          
+          </ul>
+          <div class="article markdown">
+          <h2 id="unicode-">Unicode 引用</h2>
+          <hr>
+
+          <p>Unicode 是字体在网页端最原始的应用方式,特点是:</p>
+          <ul>
+            <li>兼容性最好,支持 IE6+,及所有现代浏览器。</li>
+            <li>支持按字体的方式去动态调整图标大小,颜色等等。</li>
+            <li>但是因为是字体,所以不支持多色。只能使用平台里单色的图标,就算项目里有多色图标也会自动去色。</li>
+          </ul>
+          <blockquote>
+            <p>注意:新版 iconfont 支持多色图标,这些多色图标在 Unicode 模式下将不能使用,如果有需求建议使用symbol 的引用方式</p>
+          </blockquote>
+          <p>Unicode 使用步骤如下:</p>
+          <h3 id="-font-face">第一步:拷贝项目下面生成的 <code>@font-face</code></h3>
+<pre><code class="language-css"
+>@font-face {
+  font-family: 'iconfont';
+  src: url('iconfont.eot');
+  src: url('iconfont.eot?#iefix') format('embedded-opentype'),
+      url('iconfont.woff2') format('woff2'),
+      url('iconfont.woff') format('woff'),
+      url('iconfont.ttf') format('truetype'),
+      url('iconfont.svg#iconfont') format('svg');
+}
+</code></pre>
+          <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
+<pre><code class="language-css"
+>.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+</code></pre>
+          <h3 id="-">第三步:挑选相应图标并获取字体编码,应用于页面</h3>
+<pre>
+<code class="language-html"
+>&lt;span class="iconfont"&gt;&amp;#x33;&lt;/span&gt;
+</code></pre>
+          <blockquote>
+            <p>"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
+          </blockquote>
+          </div>
+      </div>
+      <div class="content font-class">
+        <ul class="icon_lists dib-box">
+          
+          <li class="dib">
+            <span class="icon iconfont iconjinrudianpu"></span>
+            <div class="name">
+              店铺
+            </div>
+            <div class="code-name">.iconjinrudianpu
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconwenjuan"></span>
+            <div class="name">
+              问卷
+            </div>
+            <div class="code-name">.iconwenjuan
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icongouwuche"></span>
+            <div class="name">
+              购物车
+            </div>
+            <div class="code-name">.icongouwuche
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconshangpinguanli"></span>
+            <div class="name">
+              商品管理
+            </div>
+            <div class="code-name">.iconshangpinguanli
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconzhanghao"></span>
+            <div class="name">
+              账号
+            </div>
+            <div class="code-name">.iconzhanghao
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconquxiao"></span>
+            <div class="name">
+              取消
+            </div>
+            <div class="code-name">.iconquxiao
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconshangpinguanli1"></span>
+            <div class="name">
+              商品管理
+            </div>
+            <div class="code-name">.iconshangpinguanli1
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconjiahao-copy"></span>
+            <div class="name">
+              加号
+            </div>
+            <div class="code-name">.iconjiahao-copy
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconef-zhanghao"></span>
+            <div class="name">
+              账号
+            </div>
+            <div class="code-name">.iconef-zhanghao
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconshouye"></span>
+            <div class="name">
+              首页
+            </div>
+            <div class="code-name">.iconshouye
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icondianpu-copy"></span>
+            <div class="name">
+              店铺 (2)
+            </div>
+            <div class="code-name">.icondianpu-copy
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconshouji"></span>
+            <div class="name">
+              手机
+            </div>
+            <div class="code-name">.iconshouji
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icontouxiang"></span>
+            <div class="name">
+              头像
+            </div>
+            <div class="code-name">.icontouxiang
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconyanzhengma"></span>
+            <div class="name">
+              验证码
+            </div>
+            <div class="code-name">.iconyanzhengma
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconshijian"></span>
+            <div class="name">
+              时间
+            </div>
+            <div class="code-name">.iconshijian
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconmima"></span>
+            <div class="name">
+              密码
+            </div>
+            <div class="code-name">.iconmima
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconchuyidong"></span>
+            <div class="name">
+              删除/数字面板编辑态
+            </div>
+            <div class="code-name">.iconchuyidong
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconbianji"></span>
+            <div class="name">
+              编 辑
+            </div>
+            <div class="code-name">.iconbianji
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconyanjing"></span>
+            <div class="name">
+              眼睛
+            </div>
+            <div class="code-name">.iconyanjing
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconyanjing1"></span>
+            <div class="name">
+              yanjing
+            </div>
+            <div class="code-name">.iconyanjing1
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconshijian1"></span>
+            <div class="name">
+              shijian
+            </div>
+            <div class="code-name">.iconshijian1
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconyanjing3"></span>
+            <div class="name">
+              眼睛2
+            </div>
+            <div class="code-name">.iconyanjing3
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconshangpinguanlix"></span>
+            <div class="name">
+              shangpinguanli (1)@2x
+            </div>
+            <div class="code-name">.iconshangpinguanlix
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icondianpu-copyx"></span>
+            <div class="name">
+              dianpu-copy@2x
+            </div>
+            <div class="code-name">.icondianpu-copyx
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont iconcaigouguanli"></span>
+            <div class="name">
+              shangpinguanli@2x
+            </div>
+            <div class="code-name">.iconcaigouguanli
+            </div>
+          </li>
+          
+        </ul>
+        <div class="article markdown">
+        <h2 id="font-class-">font-class 引用</h2>
+        <hr>
+
+        <p>font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。</p>
+        <p>与 Unicode 使用方式相比,具有如下特点:</p>
+        <ul>
+          <li>兼容性良好,支持 IE8+,及所有现代浏览器。</li>
+          <li>相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。</li>
+          <li>因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。</li>
+          <li>不过因为本质上还是使用的字体,所以多色图标还是不支持的。</li>
+        </ul>
+        <p>使用步骤如下:</p>
+        <h3 id="-fontclass-">第一步:引入项目下面生成的 fontclass 代码:</h3>
+<pre><code class="language-html">&lt;link rel="stylesheet" href="./iconfont.css"&gt;
+</code></pre>
+        <h3 id="-">第二步:挑选相应图标并获取类名,应用于页面:</h3>
+<pre><code class="language-html">&lt;span class="iconfont iconxxx"&gt;&lt;/span&gt;
+</code></pre>
+        <blockquote>
+          <p>"
+            iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
+        </blockquote>
+      </div>
+      </div>
+      <div class="content symbol">
+          <ul class="icon_lists dib-box">
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconjinrudianpu"></use>
+                </svg>
+                <div class="name">店铺</div>
+                <div class="code-name">#iconjinrudianpu</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconwenjuan"></use>
+                </svg>
+                <div class="name">问卷</div>
+                <div class="code-name">#iconwenjuan</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icongouwuche"></use>
+                </svg>
+                <div class="name">购物车</div>
+                <div class="code-name">#icongouwuche</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconshangpinguanli"></use>
+                </svg>
+                <div class="name">商品管理</div>
+                <div class="code-name">#iconshangpinguanli</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconzhanghao"></use>
+                </svg>
+                <div class="name">账号</div>
+                <div class="code-name">#iconzhanghao</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconquxiao"></use>
+                </svg>
+                <div class="name">取消</div>
+                <div class="code-name">#iconquxiao</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconshangpinguanli1"></use>
+                </svg>
+                <div class="name">商品管理</div>
+                <div class="code-name">#iconshangpinguanli1</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconjiahao-copy"></use>
+                </svg>
+                <div class="name">加号</div>
+                <div class="code-name">#iconjiahao-copy</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconef-zhanghao"></use>
+                </svg>
+                <div class="name">账号</div>
+                <div class="code-name">#iconef-zhanghao</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconshouye"></use>
+                </svg>
+                <div class="name">首页</div>
+                <div class="code-name">#iconshouye</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icondianpu-copy"></use>
+                </svg>
+                <div class="name">店铺 (2)</div>
+                <div class="code-name">#icondianpu-copy</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconshouji"></use>
+                </svg>
+                <div class="name">手机</div>
+                <div class="code-name">#iconshouji</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icontouxiang"></use>
+                </svg>
+                <div class="name">头像</div>
+                <div class="code-name">#icontouxiang</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconyanzhengma"></use>
+                </svg>
+                <div class="name">验证码</div>
+                <div class="code-name">#iconyanzhengma</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconshijian"></use>
+                </svg>
+                <div class="name">时间</div>
+                <div class="code-name">#iconshijian</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconmima"></use>
+                </svg>
+                <div class="name">密码</div>
+                <div class="code-name">#iconmima</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconchuyidong"></use>
+                </svg>
+                <div class="name">删除/数字面板编辑态</div>
+                <div class="code-name">#iconchuyidong</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconbianji"></use>
+                </svg>
+                <div class="name">编 辑</div>
+                <div class="code-name">#iconbianji</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconyanjing"></use>
+                </svg>
+                <div class="name">眼睛</div>
+                <div class="code-name">#iconyanjing</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconyanjing1"></use>
+                </svg>
+                <div class="name">yanjing</div>
+                <div class="code-name">#iconyanjing1</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconshijian1"></use>
+                </svg>
+                <div class="name">shijian</div>
+                <div class="code-name">#iconshijian1</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconyanjing3"></use>
+                </svg>
+                <div class="name">眼睛2</div>
+                <div class="code-name">#iconyanjing3</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconshangpinguanlix"></use>
+                </svg>
+                <div class="name">shangpinguanli (1)@2x</div>
+                <div class="code-name">#iconshangpinguanlix</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icondianpu-copyx"></use>
+                </svg>
+                <div class="name">dianpu-copy@2x</div>
+                <div class="code-name">#icondianpu-copyx</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#iconcaigouguanli"></use>
+                </svg>
+                <div class="name">shangpinguanli@2x</div>
+                <div class="code-name">#iconcaigouguanli</div>
+            </li>
+          
+          </ul>
+          <div class="article markdown">
+          <h2 id="symbol-">Symbol 引用</h2>
+          <hr>
+
+          <p>这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇<a href="">文章</a>
+            这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:</p>
+          <ul>
+            <li>支持多色图标了,不再受单色限制。</li>
+            <li>通过一些技巧,支持像字体那样,通过 <code>font-size</code>, <code>color</code> 来调整样式。</li>
+            <li>兼容性较差,支持 IE9+,及现代浏览器。</li>
+            <li>浏览器渲染 SVG 的性能一般,还不如 png。</li>
+          </ul>
+          <p>使用步骤如下:</p>
+          <h3 id="-symbol-">第一步:引入项目下面生成的 symbol 代码:</h3>
+<pre><code class="language-html">&lt;script src="./iconfont.js"&gt;&lt;/script&gt;
+</code></pre>
+          <h3 id="-css-">第二步:加入通用 CSS 代码(引入一次就行):</h3>
+<pre><code class="language-html">&lt;style&gt;
+.icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+&lt;/style&gt;
+</code></pre>
+          <h3 id="-">第三步:挑选相应图标并获取类名,应用于页面:</h3>
+<pre><code class="language-html">&lt;svg class="icon" aria-hidden="true"&gt;
+  &lt;use xlink:href="#icon-xxx"&gt;&lt;/use&gt;
+&lt;/svg&gt;
+</code></pre>
+          </div>
+      </div>
+
+    </div>
+  </div>
+  <script>
+  $(document).ready(function () {
+      $('.tab-container .content:first').show()
+
+      $('#tabs li').click(function (e) {
+        var tabContent = $('.tab-container .content')
+        var index = $(this).index()
+
+        if ($(this).hasClass('active')) {
+          return
+        } else {
+          $('#tabs li').removeClass('active')
+          $(this).addClass('active')
+
+          tabContent.hide().eq(index).fadeIn()
+        }
+      })
+    })
+  </script>
+</body>
+</html>

File diff suppressed because it is too large
+ 117 - 0
src/common/font/iconfont.css


BIN
src/common/font/iconfont.eot


File diff suppressed because it is too large
+ 1 - 0
src/common/font/iconfont.js


+ 184 - 0
src/common/font/iconfont.json

@@ -0,0 +1,184 @@
+{
+  "id": "1591804",
+  "name": "dtpc-admin",
+  "font_family": "iconfont",
+  "css_prefix_text": "icon",
+  "description": "",
+  "glyphs": [
+    {
+      "icon_id": "778003",
+      "name": "店铺",
+      "font_class": "jinrudianpu",
+      "unicode": "e615",
+      "unicode_decimal": 58901
+    },
+    {
+      "icon_id": "1009026",
+      "name": "问卷",
+      "font_class": "wenjuan",
+      "unicode": "e616",
+      "unicode_decimal": 58902
+    },
+    {
+      "icon_id": "1155506",
+      "name": "购物车",
+      "font_class": "gouwuche",
+      "unicode": "e643",
+      "unicode_decimal": 58947
+    },
+    {
+      "icon_id": "1391285",
+      "name": "商品管理",
+      "font_class": "shangpinguanli",
+      "unicode": "e608",
+      "unicode_decimal": 58888
+    },
+    {
+      "icon_id": "2842517",
+      "name": "账号",
+      "font_class": "zhanghao",
+      "unicode": "e66d",
+      "unicode_decimal": 58989
+    },
+    {
+      "icon_id": "3005283",
+      "name": "取消",
+      "font_class": "quxiao",
+      "unicode": "e6fa",
+      "unicode_decimal": 59130
+    },
+    {
+      "icon_id": "3247646",
+      "name": "商品管理",
+      "font_class": "shangpinguanli1",
+      "unicode": "e638",
+      "unicode_decimal": 58936
+    },
+    {
+      "icon_id": "3298423",
+      "name": "加号",
+      "font_class": "jiahao-copy",
+      "unicode": "e60b",
+      "unicode_decimal": 58891
+    },
+    {
+      "icon_id": "3446700",
+      "name": "账号",
+      "font_class": "ef-zhanghao",
+      "unicode": "e64e",
+      "unicode_decimal": 58958
+    },
+    {
+      "icon_id": "4486699",
+      "name": "首页",
+      "font_class": "shouye",
+      "unicode": "e674",
+      "unicode_decimal": 58996
+    },
+    {
+      "icon_id": "4701701",
+      "name": "店铺 (2)",
+      "font_class": "dianpu-copy",
+      "unicode": "e627",
+      "unicode_decimal": 58919
+    },
+    {
+      "icon_id": "5722543",
+      "name": "手机",
+      "font_class": "shouji",
+      "unicode": "e731",
+      "unicode_decimal": 59185
+    },
+    {
+      "icon_id": "6260742",
+      "name": "头像",
+      "font_class": "touxiang",
+      "unicode": "e62b",
+      "unicode_decimal": 58923
+    },
+    {
+      "icon_id": "6730191",
+      "name": "验证码",
+      "font_class": "yanzhengma",
+      "unicode": "e665",
+      "unicode_decimal": 58981
+    },
+    {
+      "icon_id": "8019605",
+      "name": "时间",
+      "font_class": "shijian",
+      "unicode": "e614",
+      "unicode_decimal": 58900
+    },
+    {
+      "icon_id": "9349169",
+      "name": "密码",
+      "font_class": "mima",
+      "unicode": "e618",
+      "unicode_decimal": 58904
+    },
+    {
+      "icon_id": "9645417",
+      "name": "删除/数字面板编辑态",
+      "font_class": "chuyidong",
+      "unicode": "e600",
+      "unicode_decimal": 58880
+    },
+    {
+      "icon_id": "11543012",
+      "name": "编 辑",
+      "font_class": "bianji",
+      "unicode": "e617",
+      "unicode_decimal": 58903
+    },
+    {
+      "icon_id": "12205622",
+      "name": "眼睛",
+      "font_class": "yanjing",
+      "unicode": "e621",
+      "unicode_decimal": 58913
+    },
+    {
+      "icon_id": "12226479",
+      "name": "yanjing",
+      "font_class": "yanjing1",
+      "unicode": "e623",
+      "unicode_decimal": 58915
+    },
+    {
+      "icon_id": "12226481",
+      "name": "shijian",
+      "font_class": "shijian1",
+      "unicode": "e625",
+      "unicode_decimal": 58917
+    },
+    {
+      "icon_id": "12226485",
+      "name": "眼睛2",
+      "font_class": "yanjing3",
+      "unicode": "e626",
+      "unicode_decimal": 58918
+    },
+    {
+      "icon_id": "12797207",
+      "name": "shangpinguanli (1)@2x",
+      "font_class": "shangpinguanlix",
+      "unicode": "e63f",
+      "unicode_decimal": 58943
+    },
+    {
+      "icon_id": "12797277",
+      "name": "dianpu-copy@2x",
+      "font_class": "dianpu-copyx",
+      "unicode": "e642",
+      "unicode_decimal": 58946
+    },
+    {
+      "icon_id": "12797452",
+      "name": "shangpinguanli@2x",
+      "font_class": "caigouguanli",
+      "unicode": "e644",
+      "unicode_decimal": 58948
+    }
+  ]
+}

File diff suppressed because it is too large
+ 101 - 0
src/common/font/iconfont.svg


BIN
src/common/font/iconfont.ttf


BIN
src/common/font/iconfont.woff


BIN
src/common/font/iconfont.woff2


BIN
src/common/font/pingFang.ttf


+ 25 - 0
src/common/sass/appPage.scss

@@ -0,0 +1,25 @@
+.appPage{
+  width: 100%;
+  height: 100%;
+  overflow: auto;
+  display: flex;
+  justify-content: space-between;
+  position: absolute;
+  background-color:$tint-color;
+  // min-width:1450px;
+  .leftNav{
+    width:210px;
+    background: $dark-color;
+  }
+  .view{
+    width:100%;
+    &-info{
+      padding-left:33px;
+      padding-right: 33px;
+    }
+  }
+}
+.el-message{
+  //top: 80px!important;
+  z-index: 99999999!important;
+}

+ 5 - 0
src/common/sass/common.scss

@@ -0,0 +1,5 @@
+@import './currency.scss';
+@import './layout.scss';
+@import './appPage.scss';
+@import './indexPage.scss';
+@import './loginPage.scss';

+ 56 - 0
src/common/sass/currency.scss

@@ -0,0 +1,56 @@
+$tint-color: rgb(251,251,251);
+$desc-color: #B3C4E0;
+$dark-color: rgb(46,47,77);
+$gray-color: rgb(242,243,245);
+$theme-color: rgb(141,144,249);
+/* 改变主题色变量 */
+$--color-primary: $theme-color;
+
+/* 改变 icon 字体路径变量,必需 */
+$--font-path: '~element-ui/lib/theme-chalk/fonts';
+
+@import "~element-ui/packages/theme-chalk/src/index";
+body{
+	width: 100%;
+	height: 100%;
+	position: absolute;
+}
+.default-color,.theme-color{
+	color:$theme-color;
+}
+.tint-color{
+	color:$tint-color;
+}
+.dark-color{
+	color:$dark-color;
+}
+.desc-color{
+	color:$desc-color;
+}
+.gray-color{
+	color:$gray-color;
+}
+.default-bg,.theme-bg{
+	background-color:$theme-color;
+}
+.tint-bg{
+	background-color:$tint-color;
+}
+.dark-bg{
+	background-color:$dark-color;
+}
+.desc-bg{
+	background-color:$desc-color;
+}
+.gray-bg{
+  background-color:$gray-color;
+}
+
+.w-100{
+  width:100% !important;
+}
+.dt-input{
+  .el-input{
+    width:400px
+  }
+}

+ 2 - 0
src/common/sass/indexPage.scss

@@ -0,0 +1,2 @@
+.indexPage{
+}

+ 41 - 0
src/common/sass/layout.scss

@@ -0,0 +1,41 @@
+@font-face {
+  font-family: PingFangSC ;
+  src: url("../font/pingFang.ttf");
+}
+*{
+  margin:0;
+  //font-family:PingFangSC-Regular, sans-serif;
+  // font-family:'Noto Sans SC';
+  //font-family: Helvetica Neue,Helvetica,PingFangSC,Hiragino Sans GB,Microsoft YaHei,Arial,sans-serif;
+  font-family: Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Arial,sans-serif;
+}
+//滑动样式
+::-webkit-scrollbar {
+    width: 6px;
+    height: 6px;
+}
+
+/* 滚动槽 */
+::-webkit-scrollbar-track {
+    -webkit-box-shadow: inset006pxrgba(223, 223, 223, 1) !important;
+    border-radius: 5px;
+}
+
+/* 滚动条滑块 */
+::-webkit-scrollbar-thumb {
+    border-radius: 5px;
+    background: rgba(223, 223, 223, 1) !important;
+    -webkit-box-shadow: inset006pxrgba(223, 223, 223, 1) !important;
+}
+
+::-webkit-scrollbar-thumb:window-inactive {
+    background: rgba(223, 223, 223, 1);
+}
+// button type="number"
+input::-webkit-outer-spin-button,
+input::-webkit-inner-spin-button {
+  -webkit-appearance: none;
+}
+input[type="number"]{
+  -moz-appearance: textfield;
+}

+ 156 - 0
src/common/sass/loginPage.scss

@@ -0,0 +1,156 @@
+.loginPage{
+  width: 100%;
+  height: 100vh;
+  background-image: url("../../../public/static/loginBG.png");
+  background-size: 100% 100%;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  .login{
+    width: 430px;
+    height: auto;
+    background-color: #282B4A;
+    box-sizing: border-box;
+    padding: 32px 55px;
+    box-shadow: 0 1px 5px #1E1F2B!important;
+    /*.content_login{
+      margin: 52px 65px;*/
+      .login-title{
+        height: 25px;
+        margin-bottom: 30px;
+        line-height: 0px;
+        .select-btn{
+          color: #8679FE;
+          font-size: 18px;
+          height: 25px;
+          line-height: 0px;
+        }
+        .unselect-btn{
+          color: #C8C8C8;
+          font-size: 14px;
+          height: 20px;
+          line-height: 0px;
+        }
+      }
+      .pwd-login{
+        /deep/.code-img{
+          margin: 10px;
+          height: 20px;
+          width: 90px;
+        }
+        .error-code{
+          color: #FF2626;
+          font-size: 12px;
+          line-height: 17px;
+          padding-top: 4px;
+          position: absolute;
+          top: 100%;
+          left: 0;
+        }
+      }
+      .code-login{
+        .get-code{
+          width: 98px;
+          height: 40px;
+          position: absolute;
+          top: 1px;
+          right: 0;
+          border-radius: 0px;
+          background-color: rgb(134,121,253);
+          padding: 11px 10px;
+          border: none;
+          color: white;
+        }
+      }
+      .pwd-reg{
+        /deep/.code-img{
+          margin: 10px;
+          height: 20px;
+          width: 90px;
+        }
+        .get-code{
+          width: 98px;
+          height: 40px;
+          position: absolute;
+          top: 1px;
+          right: 0;
+          border-radius: 0px;
+          background-color: rgb(134,121,253);
+          padding: 11px 10px;
+          border: none;
+          color: white;
+        }
+      }
+      .login-footer{
+        .login-btn{
+          // width: 300px;
+          width:100%;
+          height: 40px;
+          background-color: #8679FE;
+          border: none;
+          color: white;
+          font-size: 16px;
+          letter-spacing: 0.19px;
+          margin-bottom: 19px;
+        }
+        .login-option{
+          color: white;
+          /deep/.el-checkbox__label{
+            font-size: 14px;
+            color: white;
+          }
+          .forget{
+            float: right;
+            font-size: 14px;
+            span{
+              cursor: pointer;
+            }
+          }
+        }
+      }
+   /* }*/
+  }
+  .el-form-item{
+    margin-bottom: 24px;
+  }
+  /deep/.el-input--prefix .el-input__inner{
+    height: 40px;
+    // width: 300px;
+    padding-left: 50px;
+    border: none;
+    border-radius: 0;
+    font-size: 12px;
+    color: #222222;
+  }
+  /deep/.el-input__prefix{
+    width: 40px;
+    height: 40px;
+    line-height: 40px;
+    position: absolute;
+    top: 1px;
+    left: 0px;
+    font-size: 16px;
+    color: white;
+    background-color: #c1c1c4;
+  }
+  /deep/input::-webkit-input-placeholder {
+    font-size: 12px;
+    color: #c1c1c1;
+    line-height: 17px;
+  }
+  /deep/input::-moz-input-placeholder {
+    font-size: 12px;
+    color: #c1c1c1;
+    line-height: 17px;
+  }
+  /deep/input::-ms-input-placeholder {
+    font-size: 12px;
+    color: #c1c1c1;
+    line-height: 17px;
+  }
+  /deep/.el-form-item__error{
+    color: #FF2626;
+    font-size: 12px;
+    line-height: 17px;
+  }
+}

+ 20 - 0
src/common/sass/utils/cookiesDeploy.js

@@ -0,0 +1,20 @@
+/*
+ * @Author       : yuanrunwei
+ * @Date         : 2020-05-18 12:05:37
+ * @LastEditors  : yuanrunwei
+ * @LastEditTime : 2020-05-22 19:27:45
+ * @FilePath     : \feiduoduo_admin\src\common\utils\cookiesDeploy.js
+ */
+import Cookies from 'js-cookie'
+const domain = process.env.VUE_APP_DOMAIN
+export default {
+  setCookies (res) {
+    Cookies.set('AUTH', res.object, { expires: 36500, domain })
+  },
+  getCookies () {
+    return Cookies.get('AUTH', { domain })
+  },
+  removeCookies () {
+    Cookies.remove('AUTH', { domain })
+  }
+}

+ 41 - 0
src/common/sass/utils/utils.js

@@ -0,0 +1,41 @@
+export default {
+  getEnv () {
+    return process.env
+  },
+  format (time) {
+    let date = new Date(time)
+    let y = date.getFullYear()
+    let m = date.getMonth() + 1
+    m = m < 10 ? '0' + m : m
+    let d = date.getDate()
+    d = d < 10 ? '0' + d : d
+    let h = date.getHours()
+    h = h < 10 ? '0' + h : h
+    let minute = date.getMinutes()
+    let second = date.getSeconds()
+    minute = minute < 10 ? '0' + minute : minute
+    second = second < 10 ? '0' + second : second
+    return y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second
+  },
+  // 只显示年月日
+  formatYMD (time) {
+    let date = new Date(time)
+    let y = date.getFullYear()
+    let m = date.getMonth() + 1
+    m = m < 10 ? '0' + m : m
+    let d = date.getDate()
+    d = d < 10 ? '0' + d : d
+    return y + '-' + m + '-' + d
+  },
+  formatMoney (num) {
+    var result = ''
+    var counter = 0
+    num = (num || 0).toString()
+    for (var i = num.length - 1; i >= 0; i--) {
+      counter++
+      result = num.charAt(i) + result
+      if (!(counter % 3) && i !== 0) { result = ',' + result }
+    }
+    return '¥ ' + result
+  }
+}

+ 21 - 0
src/common/utils/cookiesDeploy.js

@@ -0,0 +1,21 @@
+/*
+ * @Author       : yuanrunwei
+ * @Date         : 2020-05-18 12:05:37
+ * @LastEditors  : yuanrunwei
+ * @LastEditTime : 2020-05-22 19:27:45
+ * @FilePath     : \feiduoduo_admin\src\common\utils\cookiesDeploy.js
+ */
+import Cookies from 'js-cookie'
+const domain = process.env.VUE_APP_DOMAIN
+
+export default {
+  setCookies (res) {
+    Cookies.set('AUTH', res.object, { expires: 36500, domain })
+  },
+  getCookies () {
+    return Cookies.get('AUTH', { domain })
+  },
+  removeCookies () {
+    Cookies.remove('AUTH', { domain })
+  }
+}

+ 44 - 0
src/common/utils/utils.js

@@ -0,0 +1,44 @@
+export default {
+  getEnv () {
+    return process.env
+  },
+  format (time) {
+    let date = new Date(time)
+    let y = date.getFullYear()
+    let m = date.getMonth() + 1
+    m = m < 10 ? '0' + m : m
+    let d = date.getDate()
+    d = d < 10 ? '0' + d : d
+    let h = date.getHours()
+    h = h < 10 ? '0' + h : h
+    let minute = date.getMinutes()
+    let second = date.getSeconds()
+    minute = minute < 10 ? '0' + minute : minute
+    second = second < 10 ? '0' + second : second
+    return y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second
+  },
+  // 只显示年月日
+  formatYMD (time) {
+    let date = new Date(time)
+    let y = date.getFullYear()
+    let m = date.getMonth() + 1
+    m = m < 10 ? '0' + m : m
+    let d = date.getDate()
+    d = d < 10 ? '0' + d : d
+    return y + '-' + m + '-' + d
+  },
+  formatMoney (num) {
+    num = num + ''
+    if (isNaN(num)) { num = '0' }
+    let sign = ((num - 0) === (num = Math.abs(num)))
+    num = Math.floor(num * 100 + 0.50000000001)
+    let cents = num % 100
+    num = Math.floor(num / 100).toString()
+    if (cents < 10) { cents = '0' + cents }
+    for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3); i++) {
+      num = num.substring(0, num.length - (4 * i + 3)) + ',' +
+    num.substring(num.length - (4 * i + 3))
+    }
+    return ((sign) ? '' : '-') + num + '.' + cents
+  }
+}

+ 15 - 0
src/components/vAbove/vAbove.js

@@ -0,0 +1,15 @@
+/*
+ * @Author       : yuanrunwei
+ * @Date         : 2020-05-18 12:05:37
+ * @LastEditors  : yuanrunwei
+ * @LastEditTime : 2020-05-18 12:23:18
+ * @FilePath     : \ambre-admin-noob\src\components\vAbove\vAbove.js
+ */
+import vAboveComponent from './vAbove.vue'
+const vAbove = {
+  install: function (Vue) {
+    Vue.component('vAbove', vAboveComponent)
+  }
+}
+
+export default vAbove

+ 60 - 0
src/components/vAbove/vAbove.scss

@@ -0,0 +1,60 @@
+$above-height:65px;
+.vAboveCom{
+  position: fixed;
+  left:210px;
+  z-index:100;
+  width: calc(100% - 210px);
+  box-shadow: 1px 1px 12px rgb(244,244,244);
+  background-color:#fff;
+  height:$above-height;
+  .avator{
+    position: absolute;
+    right:30px;
+    top:18px;
+    cursor: pointer;
+    .img{
+      background-color: rgb(212, 209, 209);
+      width:calc(#{$above-height} - 36px);
+      height:calc(#{$above-height} - 36px);
+      display:inline-block;
+      border-radius: 50%;
+      vertical-align: middle;
+      overflow: hidden;
+    }
+    .qr-code{
+      background-color: rgb(212, 209, 209);
+      width: 40px;
+      height: 40px;
+      display:inline-block;
+      border-radius: 0;
+      overflow: hidden;
+      vertical-align: middle;
+      position: absolute;
+      top: -5px;
+      right: 80px;
+    }
+    img{
+       width: 100%;
+       height: 100%;
+     }
+    .qr-font{
+      top: -2px;
+      width: 35px;
+      text-align: right;
+      position: absolute;
+      right: 120px;
+      font-size: 12px;
+    }
+    .el-icon-caret-bottom{
+      padding-left:10px;
+      color:rgb(65, 65, 65);
+    }
+  }
+}
+.dialog-tips{
+  text-align: center;
+}
+
+.user-dropdown{
+  top: 65px!important;
+}

+ 53 - 0
src/components/vAbove/vAbove.vue

@@ -0,0 +1,53 @@
+<!--
+ * @Author       : yuanrunwei
+ * @Date         : 2020-05-18 12:05:37
+ * @LastEditors  : yuanrunwei
+ * @LastEditTime : 2020-05-18 15:16:54
+ * @FilePath     : \ambre-admin-noob\src\components\vAbove\vAbove.vue
+-->
+<template>
+  <div class="vAboveCom">
+    <div class="avator">
+      <el-dropdown trigger="click">
+        <div class="name">
+          {{name||'无昵称'}}
+          <i class="el-icon-caret-bottom"></i>
+        </div>
+        <el-dropdown-menu class="user-dropdown" slot="dropdown">
+          <el-dropdown-item divided>
+            <span @click="logout" style="display:block;">退出</span>
+          </el-dropdown-item>
+        </el-dropdown-menu>
+      </el-dropdown>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data () {
+    return {
+      headImg: '',
+      name
+    }
+  },
+  mounted () {
+    this.name = localStorage.getItem('managername')
+  },
+  methods: {
+    logout () {
+      localStorage.clear()
+      this.$cookies.removeCookies()
+      location.reload()
+    }
+  }
+}
+</script>
+
+<style lang='scss' scoped>
+@import './vAbove.scss';
+.name{
+  font-size: 20px;
+  float: left;
+}
+</style>

+ 15 - 0
src/components/vBread/vBread.js

@@ -0,0 +1,15 @@
+/*
+ * @Author       : yuanrunwei
+ * @Date         : 2020-05-18 12:05:37
+ * @LastEditors  : yuanrunwei
+ * @LastEditTime : 2020-05-18 12:23:53
+ * @FilePath     : \ambre-admin-noob\src\components\vBread\vBread.js
+ */
+import vBreadComponent from './vBread.vue'
+const vBread = {
+  install: function (Vue) {
+    Vue.component('vBread', vBreadComponent)
+  }
+}
+
+export default vBread

+ 19 - 0
src/components/vBread/vBread.scss

@@ -0,0 +1,19 @@
+.vBreadCom{
+  margin:88px 0 19px;
+  .el-breadcrumb{
+    height: 28px;
+    line-height: 28px;
+    .home{
+      .el-breadcrumb__inner {
+        font-size: 14px !important;
+        color: #9E9E9E !important;
+      }
+    }
+    .select{
+      .el-breadcrumb__inner {
+        font-size: 20px !important;
+        color: #000 !important;
+      }
+    }
+  }
+}

+ 65 - 0
src/components/vBread/vBread.vue

@@ -0,0 +1,65 @@
+<!--
+ * @Author       : yuanrunwei
+ * @Date         : 2020-05-18 12:05:37
+ * @LastEditors: XuTongZhang
+ * @LastEditTime: 2020-07-28 16:40:45
+ * @FilePath     : \ambre-admin-noob\src\components\vBread\vBread.vue
+-->
+<template>
+  <div class="vBreadCom">
+    <el-breadcrumb separator="/">
+      <el-breadcrumb-item class="home">{{first}}</el-breadcrumb-item>
+      <el-breadcrumb-item class="select">{{last}}</el-breadcrumb-item>
+    </el-breadcrumb>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    path: {
+      type: String,
+      default: () => '0-0'
+    },
+    nav: {
+      type: Array,
+      default: () => []
+    }
+  },
+  data () {
+    return {
+      first: '',
+      last: ''
+    }
+  },
+  watch: {
+    $route () {
+      this.getBreadcrumb()
+    }
+  },
+  methods: {
+    getBreadcrumb () {
+      console.log(this.nav, this.$route)
+      let parentName = []
+      this.nav.forEach(item => {
+        parentName.push({
+          name: item.name,
+          child: item.child
+        })
+      })
+      parentName.forEach(item => {
+        item.child.forEach(i => {
+          if (i.to === this.$route.name) {
+            this.first = item.name
+            this.last = i.name
+          }
+        })
+      })
+    }
+  }
+}
+</script>
+
+<style lang='scss'>
+@import './vBread.scss';
+</style>

+ 8 - 0
src/components/vInput/vInput.js

@@ -0,0 +1,8 @@
+import vInputComponent from './vInput.vue'
+const vInput = {
+  install: function (Vue) {
+    Vue.component('vInput', vInputComponent)
+  }
+}
+
+export default vInput

+ 62 - 0
src/components/vInput/vInput.scss

@@ -0,0 +1,62 @@
+/*
+ * @Author       : yuanrunwei
+ * @Date         : 2020-05-18 12:05:37
+ * @LastEditors  : yuanrunwei
+ * @LastEditTime : 2020-05-18 12:25:05
+ * @FilePath     : \ambre-admin-noob\src\components\vInput\vInput.scss
+ */ 
+.vInputCom{
+  min-width: 1150px;
+  .el-form{
+    height: 67px;
+    .el-form-item{
+      margin-right: 17px;
+      margin-bottom: 27px;
+      .el-input{
+        height: 40px;
+      }
+      /deep/.select{
+        .el-input__inner{
+          padding-left: 15px;
+        }
+      }
+      /deep/.el-date-editor{
+        padding-right: 0px;
+        //.el-range__icon{
+        //  display: none;
+        //  }
+        .el-range__close-icon{
+          width: 25px;
+        }
+        .el-input__inner{
+          padding-left: 15px;
+        }
+        /deep/.el-input__prefix{
+          left: 195px!important;
+          .el-icon-date:before {
+            content: "\e790";
+            color: #909399;
+          }
+        }
+      }
+    }
+    .search_btn,.reset_btn{
+      width: 95px;
+      height: 40px;
+    }
+    .reset_btn{
+      margin-left: 13px;
+    }
+  }
+  .tool{
+    margin-bottom:20px;
+  }
+  /deep/.el-icon-arrow-up:before {
+    content: "\e78f";
+    color: #909399;
+  }
+  /deep/.el-icon-arrow-down:before {
+    content: "\e790";
+    color: #909399;
+  }
+}

+ 149 - 0
src/components/vInput/vInput.vue

@@ -0,0 +1,149 @@
+<template>
+  <div class="vInputCom">
+    <el-form
+      ref="form"
+      :model="form"
+      label-width="0px"
+      label-position="left" :inline="true"
+      @submit.native.prevent>
+        <el-form-item v-for="(item,index) in list" :key="index" :prop="item.props">
+
+          <!-- date -->
+          <el-date-picker
+          v-if="item.type==='date'"
+          v-model="date"
+          type="daterange"
+          class="date"
+          :style="item.style"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          value-format="yyyy-MM-dd HH:mm:ss"
+          :default-time="['00:00:00', '23:59:59']"
+          :placeholder="item.placeholder">
+          </el-date-picker>
+
+          <!-- select -->
+          <el-select
+          class="select"
+          v-else-if="item.type==='select'"
+          v-model="form[item.props]"
+          :style="item.style"
+          clearable
+          :placeholder="item.placeholder">
+            <el-option
+            v-for="child in item.options"
+            :key="child.value"
+            :label="child.label"
+            :value="child.value">
+            </el-option>
+          </el-select>
+
+          <!-- input -->
+          <el-input
+          v-else
+          :maxlength="item.max"
+          @keyup.enter.native="search"
+          prefix-icon="el-icon-search"
+          v-model.trim="form[item.props]"
+          :placeholder="item.placeholder"
+          :style="item.style"
+          >
+          </el-input>
+
+        </el-form-item>
+
+      <!-- <span class="input_btn">
+        <el-button
+        class="search_btn"
+        @click="search()"
+        type="primary">查询</el-button>
+        <el-button
+        class="reset_btn"
+        @click="reset()"
+        type="primary">重置</el-button>
+      </span> -->
+        <!-- btnGroup -->
+        <el-form-item>
+          <span class="tool" v-for="(item,index) in btn" :key="index">
+            <el-button
+            :icon="item.icon"
+            @click="btnMethods(item)"
+            :type="item.type">{{item.name}}
+            </el-button>
+            <span class="prompt" v-if="item.message">{{item.message}}</span>
+          </span>
+        </el-form-item>
+
+    </el-form>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    list: {
+      type: Array,
+      default: () => []
+    },
+    btn: {
+      type: Array,
+      default: () => []
+    },
+    sortRule: Object
+  },
+  data () {
+    return {
+      form: {},
+      date: null
+    }
+  },
+  mounted () {
+    this.list.forEach(el => {
+      this.$set(this.form, el.props, '')
+    })
+  },
+  methods: {
+    reset () {
+      this.$refs['form'].resetFields()
+      this.search()
+    },
+    search () {
+      let reqdata = JSON.parse(JSON.stringify(this.form))
+      delete reqdata.date
+      reqdata.beginTime = (this.date && this.date.length) ? this.date[0] : ''
+      reqdata.endTime = (this.date && this.date.length) ? this.date[1] : ''
+      this.$emit('search', reqdata, this.sortRule)
+    },
+    btnMethods (item) {
+      let reqdata = JSON.parse(JSON.stringify(this.form))
+      delete reqdata.date
+      this.date && this.date.length && (reqdata.beginTime = this.date[0])
+      this.date && this.date.length && (reqdata.endTime = this.date[1])
+      this.$emit(item.method, reqdata, this.sortRule)
+    }
+  }
+}
+</script>
+
+<style lang='scss' scoped>
+// .date{
+//   width: 250px!important;
+// }
+// .select{
+//   width: 170px!important;
+// }
+// @import './vInput.scss';
+.prompt{
+  // display: block;
+  width: 100px;
+  line-height: 18px;
+  word-wrap:break-word!important;
+  word-break:break-all;
+  color:#bbb;
+  background-color: #fff;
+  font-size: 10px;
+}
+.tool{
+  padding: 0 5px;
+}
+</style>

+ 15 - 0
src/components/vNav/vNav.js

@@ -0,0 +1,15 @@
+/*
+ * @Author       : yuanrunwei
+ * @Date         : 2020-05-18 12:05:37
+ * @LastEditors  : yuanrunwei
+ * @LastEditTime : 2020-05-18 12:25:20
+ * @FilePath     : \ambre-admin-noob\src\components\vNav\vNav.js
+ */
+import vNavComponent from './vNav.vue'
+const vNav = {
+  install: function (Vue) {
+    Vue.component('vNav', vNavComponent)
+  }
+}
+
+export default vNav

+ 70 - 0
src/components/vNav/vNav.scss

@@ -0,0 +1,70 @@
+/*
+ * @Author       : yuanrunwei
+ * @Date         : 2020-05-18 12:05:37
+ * @LastEditors  : yuanrunwei
+ * @LastEditTime : 2020-05-18 14:51:51
+ * @FilePath     : \ambre-admin-noob\src\components\vNav\vNav.scss
+ */ 
+.vNavCom{
+  position: fixed;
+  height:100%;
+  z-index:101;
+  .el-menu{
+    border-right:none;
+    .is-active{
+      .a_menu{
+        color: #ffffff;
+      }
+    }
+    /deep/.el-submenu{
+      .el-submenu__title{
+        padding-left: 38px!important;
+        font-size: 16px;
+        .a_menu{
+          margin-left: 17px;
+        }
+      }
+    }
+  }
+
+  .el-menu-item{
+    text-align: left;
+    border-top-right-radius: 50px;
+    border-bottom-right-radius: 50px;
+    line-height:40px !important;
+    height:40px !important;
+    padding-left:71px !important;
+    width:180px;
+    min-width: 80px !important;
+  }
+  .el-menu-item.is-active{
+    background-color:rgb(141,114,249) !important;
+    color:#fff;
+    width:180px;
+    min-width: 80px;
+
+  }
+  .el-menu-item{
+    &:hover{
+        background:rgba(141,114,249,1) !important;
+    }
+    &:active,&:visited{
+        background:rgba(141,114,249,1) !important;
+    }
+  }
+  .logo{
+    width:100%;
+    text-align: center;
+    img{
+      padding:20px 0;
+      display: inline-block;
+      width:150px;
+    }
+  }
+}
+.f-16{
+  font-size: 16px;
+}
+.f-17{
+  font-size: 17px;
+}

+ 176 - 0
src/components/vNav/vNav.vue

@@ -0,0 +1,176 @@
+<template>
+  <div class="vNavCom">
+    <div class="logo">
+      <!-- <img src="../../../public/img/logo.png" alt=""> -->
+      上海梵天软件
+    </div>
+    <el-menu
+      background-color="#2e2f4d"
+      @select="handleSelect"
+      text-color="#F1F1F1"
+      unique-opened
+      active-text-color="#fff">
+      <el-submenu v-for="(item,index) in route||filterOne" :key="index" :index="`${index}`">
+        <template slot="title" >
+          <span :class="'iconfont '+item.icon"></span>
+          <span class="a_menu">{{item.name}}</span>
+        </template>
+        <el-menu-item
+          v-for="(child,childIndex) in item.child||item.child.filter(j => menuIdList.includes(j.menuid))"
+          @click="jump(child.to)"
+          :class="$route.name===child.to ? 'is-active' : ''"
+          :key="childIndex"
+          :index="`${index}-${childIndex}`"
+          :style="childIndex!==item.child.length-1?'margin-bottom: 15px':''"
+          >
+          <div>{{child.name}}</div>
+          <!-- <div v-else><el-badge :value="$store.getters.getNumber" :hidden="!$store.getters.getNumber" :max="99" type="warning" class="item">{{child.name}}</el-badge></div> -->
+        </el-menu-item>
+      </el-submenu>
+    </el-menu>
+  </div>
+</template>
+
+<script>
+export default {
+  data () {
+    return {
+      list: [],
+      number: 0,
+      menuIdList: [],
+      route: [
+        {
+          name: '公司设置',
+          // menuid: 100,
+          to: '',
+          icon: 'iconshangpinguanlix f-16',
+          child: [
+            {
+              name: '基本信息设置',
+              // menuid: 101,
+              to: 'basicInfo'
+            },
+            {
+              name: '职位信息设置',
+              // menuid: 101,
+              to: 'positionInfo'
+            },
+            {
+              name: '密码设置',
+              // menuid: 101,
+              to: 'passwordSettings'
+            },
+            {
+              name: '面试流程设置',
+              // menuid: 101,
+              to: 'procedureManage'
+            },
+            {
+              name: '面试视频库',
+              // menuid: 101,
+              to: 'videoManage'
+            },
+            {
+              name: '应用场景管理',
+              // menuid: 101,
+              to: 'sceneManage'
+            },
+            {
+              name: '表单管理',
+              // menuid: 101,
+              to: 'formManage'
+            },
+            {
+              name: '模板管理',
+              // menuid: 101,
+              to: 'templateManage'
+            }
+          ]
+        },
+        {
+          name: '候选人管理',
+          // menuid: 200,
+          to: '',
+          icon: 'iconshangpinguanlix f-16',
+          child: [
+            {
+              name: '候选人列表',
+              // menuid: 202,
+              to: 'candidateList'
+            },
+            {
+              name: '邮箱管理',
+              // menuid: 202,
+              to: 'busUser'
+            },
+            {
+              name: '数据统计',
+              // menuid: 202,
+              to: 'busUser'
+            }
+          ]
+        }
+      ]
+    }
+  },
+  created () {
+    // localStorage.getItem('token') && this.queryNumber()
+    // this.menuIdList = localStorage.getItem('menuId') ? localStorage.getItem('menuId').split(',').map(item => item - 0) : []
+  },
+  mounted () {
+    this.handleSelect('0-0', this.route)
+  },
+  computed: {
+    // filterOne () {
+    //   return this.route.filter(item => item.child.filter(j => this.menuIdList.includes(j.menuid)).length)
+    // }
+  },
+  methods: {
+    queryNumber () {
+      let reqdata = {}
+      this.$api.post('/platform/company/platformNotExamineCompanyCount', { reqdata }).then(res => {
+        // this.number = res.object.notExamineCompanyCount
+        this.$store.commit('setNumber', res.object.notExamineCompanyCount)
+      })
+    },
+    handleSelect (key, keyPath) {
+      this.$emit('keyPath', key, this.route || this.filterOne)
+    },
+    jump (to) {
+      if (this.$route.name === to) {
+        return false
+      }
+      this.$router.push({ name: to })
+    }
+  }
+}
+</script>
+
+<style lang='scss' scoped>
+@import './vNav.scss';
+  /deep/.el-submenu__title i{
+    color: #ffffff;
+  }
+  .logo{
+    color: #ffffff;
+    font-size: 20px;
+    padding: 15% 0 13% 0;
+  }
+  // .vNavCom{
+  //   overflow-y: scroll;
+  // }
+  // .vNavCom::-webkit-scrollbar{
+  //   display:none;
+  // }
+</style>
+
+<style lang="scss">
+  .el-submenu{
+    .el-badge__content{
+      margin-top: 25%!important;
+      position: relative;
+      width: 20px;
+      left: 25px;
+    }
+  }
+</style>

+ 8 - 0
src/components/vPager/vPager.js

@@ -0,0 +1,8 @@
+import vPagerComponent from './vPager.vue'
+const vPager = {
+  install: function (Vue) {
+    Vue.component('vPager', vPagerComponent)
+  }
+}
+
+export default vPager

+ 43 - 0
src/components/vPager/vPager.scss

@@ -0,0 +1,43 @@
+/*
+ * @Author       : yuanrunwei
+ * @Date         : 2020-05-18 12:05:37
+ * @LastEditors  : yuanrunwei
+ * @LastEditTime : 2020-05-18 14:19:27
+ * @FilePath     : \ambre-admin-noob\src\components\vPager\vPager.scss
+ */ 
+.vPagerCom{
+  text-align: right;
+  margin-top:37px;
+  margin-bottom: 30px;
+  height: 25px;
+  .el-pagination{
+    height: 25px;
+    padding: 0px!important;
+    .el-pager{
+      li{
+        background-color:rgba(0, 0, 0, 0) !important;
+        height: 25px;
+      }
+      .number,.el-icon-more{
+        background-color:rgba(0, 0, 0, 0) !important;
+      }
+    }
+    .btn-next,.btn-prev{
+      background-color:rgba(0, 0, 0, 0) !important;
+      height: 25px;
+    }
+    .el-pagination__jump{
+      margin-left: 21px;
+      height: 25px;
+      .el-input{
+        height: 25px;
+        margin: 0 9px 0 13px;
+        .el-input__inner{
+          background-color:rgba(0, 0, 0, 0) !important;
+          height: 25px!important;
+        }
+      }
+    }
+  }
+  // background-color:#fff;
+}

+ 42 - 0
src/components/vPager/vPager.vue

@@ -0,0 +1,42 @@
+<template>
+  <div class="vPagerCom">
+    <el-pagination
+      :current-page.sync="currentPage"
+      @current-change="handleCurrentChange"
+      @prev-click="handleCurrentChange"
+      :page-size="10"
+      layout="total, prev, pager, next, jumper"
+      :total="total">
+    </el-pagination>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    total: {
+      type: Number,
+      default: () => 0
+    }
+  },
+  data () {
+    return {
+      currentPage: 1
+    }
+  },
+  methods: {
+    handleCurrentChange (val) {
+      this.$emit('page', val)
+    }
+  },
+  watch: {
+    currentPage (val) {
+      this.$emit('page', val)
+    }
+  }
+}
+</script>
+
+<style lang='scss'>
+@import './vPager.scss';
+</style>

+ 8 - 0
src/components/vTable/vTable.js

@@ -0,0 +1,8 @@
+import vTableComponent from './vTable.vue'
+const vTable = {
+  install: function (Vue) {
+    Vue.component('vTable', vTableComponent)
+  }
+}
+
+export default vTable

+ 30 - 0
src/components/vTable/vTable.scss

@@ -0,0 +1,30 @@
+.vTableCom{
+  .el-table{
+    font-size: 12px!important;
+    color: #222222;
+  }
+  /deep/.has-gutter{
+    .tableHeader{
+      //el-table_1_column_1  is-center el-table-column--selection  is-leaf tableHeader
+      background-color:rgb(242,243,245) !important;
+    }
+  }
+
+  .img{
+    object-fit: contain;
+    margin:auto;
+    width:65px;
+    height: 60.5px;
+    display: block;
+    cursor: pointer;
+    border:2px solid rgb(242,243,245);
+  }
+  .handelBtn{
+    display:inline-block;
+    .btn{
+      height: 32.4px;
+      line-height: 0;
+      margin:0 2.5px;
+    }
+  }
+}

+ 185 - 0
src/components/vTable/vTable.vue

@@ -0,0 +1,185 @@
+<template>
+  <div class="vTableCom">
+    <el-table
+      ref="multipleTable"
+      :data="tableList"
+      flt
+      header-row-class-name="tableHeader"
+      header-cell-class-name="tableHeader"
+      @selection-change="handleSelectionChange"
+      @sort-change='sortthiscolumn'
+      :row-class-name="tableRowClassName"
+      style="width: 100%">
+
+      <!-- selection -->
+      <el-table-column
+        v-if="table.selection"
+        align="center"
+        type="selection"
+        width="55">
+      </el-table-column>
+
+      <!-- column -->
+      <el-table-column
+        align="center"
+        :width="item.width"
+        :prop="item.props"
+        :label="item.label"
+        :sortable="item.sortable?'custom':false"
+        v-for="(item,index) in table.column"
+        :key="index">
+        <template slot-scope="scope">
+
+          <!-- slot 自定义插槽 可以用一个变量来接受item和scope (在订单列表中有使用,可以查看使用方法)-->
+          <slot v-if="item.type==='slot'" name="slot" :item="item" :scope="scope.row"></slot>
+
+          <!-- date -->
+          <span v-else-if="item.type==='date'">
+            <span v-if="item.format==='YMD'">{{$utils.formatYMD(scope.row[item.props])}}</span>
+            <span v-else>{{$utils.format(scope.row[item.props])}}</span>
+          </span>
+
+          <span v-else-if="item.type==='imgList'">
+            <el-image
+              v-for="i in scope.row[item.props]"
+              :key="i.id"
+              style="width: 70px; height: 70px"
+              :src="$img+i.imgPath"
+              :preview-src-list="scope.row[item.props].map(it => $img+it.imgPath)">
+            </el-image>
+          </span>
+
+          <el-popover
+            placement="left"
+            v-else-if="item.type==='cover'"
+            width="200"
+            trigger="hover">
+            <img slot="reference" class="img" :src="scope.row[item.props]" alt="">
+            <img class="w-100" :src="scope.row[item.props]" alt="">
+          </el-popover>
+
+          <!-- pic -->
+          <el-popover
+            placement="left"
+            v-else-if="item.type==='pic'"
+            width="200"
+            trigger="hover">
+            <img slot="reference" class="img" :src="$img+scope.row[item.props]" alt="">
+            <img class="w-100" :src="$img+scope.row[item.props]" alt="">
+          </el-popover>
+
+          <!-- <span v-else-if="item.state">{{item.state[scope.row[item.props]]}}</span> -->
+
+          <!-- option -->
+          <span v-else-if="item.options">{{item.options[scope.row[item.props]]}}</span>
+
+          <span v-else-if="item.html" v-html="scope.row[item.props]"></span>
+
+          <!-- normal -->
+          <span v-else>{{scope.row[item.props]}}</span>
+
+        </template>
+      </el-table-column>
+
+      <!-- handle -->
+      <el-table-column
+      label="操作"
+      v-if="table.handle"
+      align="center">
+        <template slot-scope="scope">
+          <el-button-group style="display:flex;justify-content: center;">
+              <el-button
+                v-for="(item,index) in table.handle.filter(item => show!==item.show).filter(item => scope.row[item.props]===item.key)"
+                :key="index"
+                style="margin:0px;"
+                class="btn handelBtn"
+                :type="item.type"
+                :disabled="!!scope.row[item.disabled]"
+                @click="handleMethods(scope.$index, scope.row, item)">
+                {{item.title}}
+                <!-- v-if="scope.row[item.props]===item.key" -->
+              </el-button>
+          </el-button-group>
+        </template>
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    table: {
+      type: Object,
+      default: () => []
+    },
+    tableList: {
+      type: Array,
+      default: () => []
+    },
+    show: {
+      type: Boolean,
+      default: false
+    },
+    id: {
+      type: String,
+      default: () => ''
+    },
+    errorList: {
+      type: Array,
+      default: () => []
+    },
+    sortType: {
+      type: Boolean,
+      default: false
+    },
+    queryData: {
+      type: Function,
+      default: () => {}
+    },
+    form: Object
+  },
+  data () {
+    return {
+      orderItem: {}
+    }
+  },
+  mounted () {
+  },
+  methods: {
+    handleMethods (index, item, v) {
+      this.$emit(v.method, item)
+    },
+    handleSelectionChange (val) {
+      this.id && this.$emit('selection-change', val.map(item => item[this.id]))
+    },
+    tableRowClassName ({ row, rowIndex }) {
+      if (this.errorList.includes(rowIndex)) {
+        return 'error-row'
+      }
+      return ''
+    },
+    sortthiscolumn ({ column, prop, order }) {
+      this.orderItem = order
+        ? {
+          [prop]: order === 'ascending' ? 'ASC' : 'DESC'
+        }
+        : {}
+      console.log('====================================')
+      console.log(this.form)
+      console.log('====================================')
+      this.queryData(this.form, this.orderItem)
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+    @import './vTable.scss';
+</style>
+
+<style lang='scss'>
+.el-table .error-row {
+  background: rgba($color: red, $alpha: 0.3);
+}
+</style>

+ 152 - 0
src/components/wangEnduit/wangEnduit.vue

@@ -0,0 +1,152 @@
+<template lang="html">
+  <div class="editor">
+    <div ref="toolbar" class="toolbar">
+    </div>
+    <div ref="editor" class="text">
+    </div>
+  </div>
+</template>
+
+<script>
+import E from 'wangeditor'
+export default {
+  name: 'editoritem',
+  data () {
+    let myToken = localStorage.getItem('token')
+    return {
+      myToken,
+      editor: null,
+      info_: null,
+      isChange: false,
+      loading: null
+    }
+  },
+  model: {
+    prop: 'value',
+    event: 'change'
+  },
+  props: {
+    value: {
+      type: String,
+      default: ''
+    }
+  },
+  watch: {
+    isClear (val) {
+      // 触发清除文本域内容
+      if (val) {
+        this.editor.txt.clear()
+        this.info_ = null
+      }
+    },
+    value: function (value) {
+      // if (value !== this.editor.txt.html()) {
+      //   this.editor.txt.html(this.value)
+      // }
+      if (!this.isChange) {
+        this.editor.txt.html(this.value)
+      }
+      this.isChange = false
+    }
+    // value为编辑框输入的内容,这里我监听了一下值,当父组件调用得时候,如果给value赋值了,子组件将会显示父组件赋给的值
+  },
+  mounted () {
+    this.seteditor()
+    this.editor.txt.html(this.value)
+  },
+  methods: {
+    seteditor () {
+      // http://192.168.2.125:8080/admin/storage/create
+      this.editor = new E(this.$refs.toolbar, this.$refs.editor)
+      this.editor.customConfig.uploadImgShowBase64 = false // base 64 存储图片
+      this.editor.customConfig.uploadImgServer = this.$url + '/platform/upload/platformUploadImg'// 配置服务器端地址
+      this.editor.customConfig.uploadImgHeaders = { }// 自定义 header
+      this.editor.customConfig.uploadFileName = 'file' // 后端接受上传文件的参数名
+      this.editor.customConfig.uploadImgMaxSize = 10 * 1024 * 1024 // 将图片大小限制为 10M
+      this.editor.customConfig.uploadImgMaxLength = 20 // 限制一次最多上传 20 张图片
+      this.editor.customConfig.uploadImgTimeout = 3 * 60 * 1000 // 设置超时时间
+
+      // 配置菜单
+      this.editor.customConfig.menus = [
+        'head', // 标题
+        'bold', // 粗体
+        'fontSize', // 字号
+        'fontName', // 字体
+        'italic', // 斜体
+        'underline', // 下划线
+        'strikeThrough', // 删除线
+        'foreColor', // 文字颜色
+        'backColor', // 背景颜色
+        'link', // 插入链接
+        'list', // 列表
+        'justify', // 对齐方式
+        'quote', // 引用
+        'emoticon', // 表情
+        'image', // 插入图片
+        'table', // 表格
+        // 'video', // 插入视频
+        // 'code', // 插入代码
+        'undo', // 撤销
+        'redo', // 重复
+        'fullscreen' // 全屏
+      ]
+
+      // this.editor.customConfig.debug = true
+
+      this.editor.customConfig.customUploadImg = (files, insert) => {
+        console.log(files, '@todo upload')
+        this.loading = this.$loading({
+          lock: true,
+          text: 'Loading',
+          spinner: 'el-icon-loading',
+          background: 'rgba(0, 0, 0, 0.7)'
+        })
+        this.UploadImg(files, insert)
+      }
+      this.editor.customConfig.onchange = (html) => {
+        this.isChange = true
+        this.info_ = html // 绑定当前逐渐地值
+        this.$emit('change', this.info_) // 将内容同步到父组件中
+      }
+      // 创建富文本编辑器
+      this.editor.create()
+    },
+    UploadImg (files, insert) {
+      let formData = new FormData()
+      formData.append('file', files[0])
+      let file = Array.from(files)
+      this.$api.post('/platform/upload/platformUploadImg', formData).then(res => {
+        this.loading.close()
+        console.log(res, 'upload is finally')
+        const img = this.$img + res
+        insert(img)
+        file.shift()
+        file.length && this.UploadImg(file, insert)
+      }).catch(err => {
+        this.loading.close()
+        console.log(err)
+      })
+    }
+  }
+}
+</script>
+
+<style lang="css" scoped>
+  .editor {
+    width: 100%;
+    margin: 0 auto;
+    position: relative;
+    z-index: 0;
+  }
+  .toolbar {
+    border: 1px solid #ccc;
+  }
+  .text {
+    border: 1px solid #ccc;
+    height: 400px;
+    width: 100%;
+  }
+  img {
+    max-width: 100%;
+  }
+</style>

+ 76 - 0
src/main.js

@@ -0,0 +1,76 @@
+/*
+ * @Author       : yuanrunwei
+ * @Date         : 2020-05-18 12:05:37
+ * @LastEditors  : yuanrunwei
+ * @LastEditTime : 2020-05-18 12:21:24
+ * @FilePath     : \ambre-admin-noob\src\main.js
+ */
+import Vue from 'vue'
+import App from './App.vue'
+import store from './store'
+import router from './router'
+import api from './common/api/api'
+import ElementUI from 'element-ui'
+import AFTableColumn from 'af-table-column'
+import utils from './common/utils/utils'
+import Cookies from 'js-cookie'
+
+import VueCropper from 'vue-cropper'
+import vNav from './components/vNav/vNav'
+import vTable from './components/vTable/vTable'
+import vInput from './components/vInput/vInput'
+import vPager from './components/vPager/vPager'
+import vAbove from './components/vAbove/vAbove'
+import vBread from './components/vBread/vBread'
+import cookiesDeploy from './common/utils/cookiesDeploy'
+
+import './common/sass/common.scss'
+import './common/font/iconfont.css'
+// import './permission.js'
+
+import 'babel-polyfill'
+import cssVars from 'css-vars-ponyfill'
+cssVars({})
+
+Vue.use(ElementUI)
+Vue.use(AFTableColumn)
+Vue.use(VueCropper)
+Vue.use(Cookies)
+Vue.use(vTable)
+Vue.use(vInput)
+Vue.use(vPager)
+Vue.use(vAbove)
+Vue.use(vBread)
+Vue.use(vNav)
+
+Vue.prototype.Cookies = Cookies
+Vue.prototype.$cookies = cookiesDeploy
+Vue.prototype.$auth = cookiesDeploy.getCookies()
+Vue.prototype.$api = api
+Vue.prototype.$utils = utils
+Vue.prototype.$storeId = parseInt(localStorage.getItem('storeId')) || ''
+Vue.prototype.$img = process.env.VUE_APP_IMG
+Vue.prototype.$url = process.env.VUE_APP_API
+Vue.config.productionTip = false
+
+window.alert = function (str) {
+  let message
+  switch (str) {
+    case '插入图片错误':
+      message = '插入图片失败,请重新上传图片'
+      break
+    default:
+      message = str
+      break
+  }
+  ElementUI.Message({
+    type: 'error',
+    message
+  })
+}
+
+export default new Vue({
+  router,
+  store,
+  render: h => h(App)
+}).$mount('#app')

+ 26 - 0
src/permission.js

@@ -0,0 +1,26 @@
+/*
+ * @Author       : yuanrunwei
+ * @Date         : 2020-05-18 12:05:37
+ * @LastEditors  : yuanrunwei
+ * @LastEditTime : 2020-05-18 19:29:52
+ * @FilePath     : \ambre-admin-noob\src\permission.js
+ */
+import router from './router'
+import cookiesDeploy from './common/utils/cookiesDeploy'
+
+const whiteList = ['/login'] // 不重定向白名单
+router.beforeEach((to, from, next) => {
+  if (cookiesDeploy.getCookies() && JSON.parse(cookiesDeploy.getCookies()).managerid) {
+    if (to.path === '/login') {
+      next({ path: '/' })
+    } else {
+      next()
+    }
+  } else {
+    if (whiteList.indexOf(to.path) !== -1) {
+      next()
+    } else {
+      next('/login')
+    }
+  }
+})

+ 113 - 0
src/router/index.js

@@ -0,0 +1,113 @@
+/*
+ * @Author       : yuanrunwei
+ * @Date         : 2020-05-18 12:05:37
+ * @LastEditors: XuTongZhang
+ * @LastEditTime: 2020-07-28 17:36:30
+ * @FilePath     : \ambre-admin-noob\src\router\index.js
+ */
+import Vue from 'vue'
+import VueRouter from 'vue-router'
+// import cookiesDeploy from '../common/utils/cookiesDeploy'
+Vue.use(VueRouter)
+// let list
+
+const routes = [
+  {
+    path: '/candidateList',
+    name: 'candidateList',
+    component: () => import('@/views/candidateManage/candidateList')
+  },
+  {
+    path: '/basicInfo',
+    name: 'basicInfo',
+    component: () => import('@/views/companyManage/basicInfo')
+  },
+  {
+    path: '/positionInfo',
+    name: 'positionInfo',
+    component: () => import('@/views/companyManage/positionInfo')
+  },
+  {
+    path: '/passwordSettings',
+    name: 'passwordSettings',
+    component: () => import('@/views/companyManage/passwordSettings')
+  },
+  {
+    path: '/procedureManage',
+    name: 'procedureManage',
+    component: () => import('@/views/companyManage/procedureManage')
+  },
+  {
+    path: '/videoManage',
+    name: 'videoManage',
+    component: () => import('@/views/companyManage/videoManage')
+  },
+  {
+    path: '/sceneManage',
+    name: 'sceneManage',
+    component: () => import('@/views/companyManage/sceneManage')
+  },
+  {
+    path: '/formManage',
+    name: 'formManage',
+    component: () => import('@/views/companyManage/formManage')
+  },
+  {
+    path: '/templateManage',
+    name: 'templateManage',
+    component: () => import('@/views/companyManage/templateManage')
+  },
+  // error
+  {
+    path: '*',
+    name: 'error',
+    component: resolve => require(['@/views/error'], resolve)
+  },
+  // login
+  {
+    path: '/login',
+    name: 'login',
+    component: () => import('@/views/login.vue')
+  },
+  // redirect
+  {
+    path: '/',
+    redirect: '/candidateList'
+  }
+]
+
+const router = new VueRouter({
+  mode: 'history',
+  base: process.env.BASE_URL,
+  routes
+})
+// const whiteList = ['/login'] // 不重定向白名单
+// const info = JSON.parse(sessionStorage.getItem('info'))
+// router.beforeEach((to, from, next) => {
+//   if (info && info.managerid && localStorage.getItem('menuId')) {
+//     if (to.path === '/login') {
+//       next({ path: '/' })
+//     } else {
+//       if (!to.meta.id) next()
+//       else if (localStorage.getItem('menuId')) {
+//         list = localStorage.getItem('menuId').split(',').map(item => item - 0)
+//         // console.log(to, list)
+//         // console.log(list.includes(to.meta.id))
+//         list.includes(to.meta.id) ? next() : next({
+//           path: routes[routes.findIndex(item => list.includes(item.meta.id))].path
+//         })
+//         next()
+//       }
+//     }
+//   } else {
+//     if (whiteList.indexOf(to.path) !== -1) {
+//       next()
+//     } else {
+//       next({
+//         name: 'login'
+//       })
+//     }
+//   }
+// })
+
+export default router

+ 21 - 0
src/store/index.js

@@ -0,0 +1,21 @@
+/*
+ * @Description: create
+ * @Version: 1.0
+ * @Autor: XuTongZhang
+ * @Date: 2020-06-09 15:30:15
+ * @LastEditors: XuTongZhang
+ * @LastEditTime: 2020-07-28 14:36:55
+ */
+
+import Vue from 'vue'
+import Vuex from 'vuex'
+
+Vue.use(Vuex)
+
+export default new Vuex.Store({
+  state: {},
+  mutations: {},
+  getters: {},
+  actions: {},
+  modules: {}
+})

+ 244 - 0
src/views/candidateManage/candidateList.vue

@@ -0,0 +1,244 @@
+<!--
+ * @Description: create
+ * @Version: 1.0
+ * @Autor: XuTongZhang
+ * @Date: 2020-07-28 15:25:06
+ * @LastEditors: XuTongZhang
+ * @LastEditTime: 2020-07-28 16:42:09
+-->
+<template>
+  <div class="indexPage">
+    <v-input :btn="btn" :list="list" :sortRule="sortRule" @add="add" @del="delAll" @search="search"></v-input>
+    <el-radio-group v-model="isCollapse" style="margin-bottom: 20px;">
+      <el-radio-button :label="0">候选人列表</el-radio-button>
+      <el-radio-button :label="1">已通过候选人</el-radio-button>
+      <el-radio-button :label="2">已淘汰候选人</el-radio-button>
+      <el-radio-button :label="3">未读简历</el-radio-button>
+      <el-radio-button :label="4">已通过简历</el-radio-button>
+      <el-radio-button :label="5">已通知简历</el-radio-button>
+      <el-radio-button :label="6">已淘汰简历</el-radio-button>
+    </el-radio-group>
+    <v-table
+      :table="table"
+      :tableList="tableList"
+      :sortType="true"
+      :queryData="queryData"
+      :form="form"
+      @details="details"
+      @update="update"
+      @selection-change="selection"
+      id=""
+    ></v-table>
+    <v-pager @page="callPage" :total="totalrecords"></v-pager>
+  </div>
+</template>
+
+<script>
+export default {
+  data () {
+    return {
+      tableList: [],
+      page: 1,
+      sortRule: {},
+      isCollapse: 0,
+      totalrecords: 0,
+      pickList: [],
+      form: {},
+      list: [
+        {
+          placeholder: '请输入关键字查询',
+          props: ''
+        },
+        {
+          type: 'select',
+          placeholder: '性别',
+          props: '',
+          options: []
+        },
+        {
+          type: 'select',
+          placeholder: '来源',
+          props: '',
+          options: []
+        },
+        {
+          type: 'select',
+          placeholder: '职位',
+          props: '',
+          options: []
+        }
+      ],
+      btn: [
+        {
+          name: '重置',
+          type: 'success',
+          method: ''
+        },
+        {
+          name: '确定',
+          type: 'primary',
+          method: ''
+        }
+      ],
+      table: {
+        selection: true,
+        column: [
+          {
+            label: '编号',
+            props: ''
+          },
+          {
+            label: '姓名',
+            props: ''
+          },
+          {
+            label: '简历来源',
+            props: ''
+          },
+          {
+            label: '简历投递时间',
+            props: ''
+          },
+          {
+            label: '简历投递职位',
+            props: ''
+          },
+          {
+            label: '工作年限',
+            props: ''
+          },
+          {
+            label: '学历',
+            props: ''
+          },
+          {
+            label: '联系电话',
+            props: ''
+          }
+        ],
+        handle: [
+          {
+            title: '查看简历',
+            method: '',
+            type: 'info'
+          },
+          {
+            title: '通知面试',
+            method: '',
+            type: 'info'
+          },
+          {
+            title: '标记通过',
+            method: '',
+            type: 'info'
+          },
+          {
+            title: '标记淘汰',
+            method: '',
+            type: 'warning'
+          }
+        ]
+      }
+    }
+  },
+  mounted () {
+    // this.queryData()
+  },
+  methods: {
+    queryData (form = { conditions: '' }, sort = {}) {
+      let page = this.page
+      this.sortRule = sort
+      this.form = form
+      let reqdata = Object.assign({}, form, sort)
+      this.$api
+        .post('', {
+          reqdata,
+          page
+        })
+        .then((res) => {
+          this.totalrecords = res.totalrecords
+          this.tableList = res.list.map((item) => {
+            item.ctx = item.infoContent
+              ? item.infoContent.length > 15
+                ? item.infoContent.replace(/<[^>]+>/g, '').slice(0, 15) + '...'
+                : item.infoContent.replace(/<[^>]+>/g, '').slice(0, 15)
+              : ''
+            return item
+          })
+        })
+    },
+    search (form, sortRule) {
+      this.queryData(form, sortRule)
+    },
+    add (item) {
+      this.type = 0
+      this.info = {}
+      this.openDiaLog()
+    },
+    details (row) {
+      // this.$refs.multipleTable.selection
+      this.dialogVisible = true
+      this.querydetail(row.infoId)
+    },
+    update (row) {
+      this.type = 1
+      this.querydetail(row.infoId)
+      this.openDiaLog()
+    },
+    querydetail (infoId) {
+      this.$api
+        .post('/platform/information/platformGetInformation', {
+          reqdata: {
+            infoId
+          }
+        })
+        .then((res) => {
+          let obj = res.object
+          // obj.createtime = this.$utils.format(res.object.createtime)
+          this.info = obj
+        })
+    },
+    del (row, type = false) {
+      let id = type ? row : [row.infoId]
+      this.$confirm('此操作将永久删除该数据, 是否继续?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+        .then(() => {
+          this.$api
+            .post('/platform/information/platformDeleteInformation', {
+              reqdata: {
+                id
+              }
+            })
+            .then((res) => {
+              this.queryData(this.form, this.sortRule)
+              this.$message({
+                type: 'success',
+                message: '删除成功!'
+              })
+            })
+        })
+        .catch(() => {
+          this.$message({
+            type: 'info',
+            message: '已取消删除'
+          })
+        })
+    },
+    delAll () {
+      this.pickList.length
+        ? this.del(this.pickList, true)
+        : this.$message({ type: 'info', message: '请选择需要删除的内容' })
+    },
+    selection (val) {
+      this.pickList = val
+    },
+    callPage (val) {
+      this.page = val
+      this.queryData(this.form, this.sortRule)
+    }
+  }
+}
+</script>

+ 58 - 0
src/views/companyManage/basicInfo.vue

@@ -0,0 +1,58 @@
+<!--
+ * @Description: create
+ * @Version: 1.0
+ * @Autor: XuTongZhang
+ * @Date: 2020-07-28 17:19:02
+ * @LastEditors: XuTongZhang
+ * @LastEditTime: 2020-07-29 09:47:17
+-->
+<template>
+  <div class="basicInfo">
+    <el-card class="box-card">
+      <el-form ref="form" :model="form" label-width="140px" label-position="left">
+        <el-form-item label="公司名称">
+          <el-input v-model.trim="form.name"></el-input>
+        </el-form-item>
+        <el-form-item label="公司地址">
+          <el-input v-model.trim="form.name"></el-input>
+        </el-form-item>
+        <el-form-item label="公司简介">
+          <editor-bar class="editor" v-model.trim="form.supplyProductDetails"></editor-bar>
+        </el-form-item>
+        <el-form-item class="button-grounp">
+          <el-button type="primary">确认修改</el-button>
+        </el-form-item>
+      </el-form>
+    </el-card>
+  </div>
+</template>
+
+<script>
+import EditorBar from '../../components/wangEnduit/wangEnduit'
+export default {
+  data () {
+    return {
+      form: {}
+    }
+  },
+  components: {
+    EditorBar
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.basicInfo {
+  display: flex;
+  justify-content: center;
+  align-content: center;
+}
+.box-card {
+  width: 800rpx;
+  padding: 18px 0;
+}
+.button-grounp {
+    display: flex;
+    justify-content: flex-end;
+}
+</style>

+ 92 - 0
src/views/companyManage/formManage.vue

@@ -0,0 +1,92 @@
+<!--
+ * @Description: create
+ * @Version: 1.0
+ * @Autor: XuTongZhang
+ * @Date: 2020-07-28 16:24:44
+ * @LastEditors: XuTongZhang
+ * @LastEditTime: 2020-07-29 09:59:37
+-->
+<template>
+  <div class="indexPage">
+    <v-input :btn="btn" :list="list"></v-input>
+    <v-table
+      :table="table"
+      :tableList="tableList"
+      :sortType="true"
+      :queryData="queryData"
+    ></v-table>
+    <v-pager @page="callPage" :total="totalrecords"></v-pager>
+    <el-dialog :visible.sync="dialogFormVisible">
+      <el-form :model="form" label-width="140px">
+        <el-form-item label="表单名称">
+          <el-input v-model="form.name" autocomplete="off"></el-input>
+        </el-form-item>
+        <el-form-item label="说明">
+          <el-input type="textarea" :rows="4" resize="none" placeholder="请输入内容" v-model="form.textarea"></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogFormVisible = false">取 消</el-button>
+        <el-button type="primary" @click="dialogFormVisible = false">确 定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  data () {
+    return {
+      tableList: [],
+      dialogFormVisible: false,
+      form: {},
+      page: 1,
+      sortRule: {},
+      totalrecords: 0,
+      pickList: [],
+      list: [
+      ],
+      btn: [
+        {
+          name: '添加新视频',
+          type: 'success',
+          method: ''
+        }
+      ],
+      table: {
+        column: [
+          {
+            label: '编号',
+            props: ''
+          },
+          {
+            label: '表单名称',
+            props: ''
+          },
+          {
+            label: '说明',
+            props: ''
+          }
+        ],
+        handle: [
+          {
+            title: '查看',
+            method: '',
+            type: 'info'
+          },
+          {
+            title: '编辑',
+            method: '',
+            type: 'info'
+          },
+          {
+            title: '删除',
+            method: '',
+            type: 'info'
+          }
+        ]
+      }
+    }
+  }
+}
+</script>

+ 55 - 0
src/views/companyManage/passwordSettings.vue

@@ -0,0 +1,55 @@
+<!--
+ * @Description: create
+ * @Version: 1.0
+ * @Autor: XuTongZhang
+ * @Date: 2020-07-28 17:34:44
+ * @LastEditors: XuTongZhang
+ * @LastEditTime: 2020-07-28 17:56:38
+-->
+<template>
+  <div class="passwordSettings">
+    <el-card class="box-card">
+      <el-form ref="form" :model="form" rules="rules" label-width="140px" label-position="left">
+        <el-form-item label="输入旧密码">
+          <el-input v-model.trim="form.name"></el-input>
+        </el-form-item>
+        <el-form-item label="输入新密码">
+          <el-input v-model.trim="form.name"></el-input>
+        </el-form-item>
+        <el-form-item label="确认新密码">
+          <el-input v-model.trim="form.name"></el-input>
+        </el-form-item>
+        <el-form-item class="button-grounp">
+          <el-button type="primary">确认修改</el-button>
+        </el-form-item>
+      </el-form>
+    </el-card>
+  </div>
+</template>
+
+<script>
+export default {
+  data () {
+    return {
+      form: {},
+      rules: {}
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.passwordSettings {
+  display: flex;
+  justify-content: center;
+  align-content: center;
+}
+.box-card {
+  width: 800rpx;
+  padding: 18px 0;
+}
+.button-grounp {
+    display: flex;
+    justify-content: flex-end;
+}
+</style>

+ 86 - 0
src/views/companyManage/positionInfo.vue

@@ -0,0 +1,86 @@
+<!--
+ * @Description: create
+ * @Version: 1.0
+ * @Autor: XuTongZhang
+ * @Date: 2020-07-28 17:19:43
+ * @LastEditors: XuTongZhang
+ * @LastEditTime: 2020-07-29 09:55:44
+-->
+<template>
+  <div class="indexPage">
+    <v-input :btn="btn" :list="list"></v-input>
+    <v-table :table="table" :tableList="tableList" :sortType="true" :queryData="queryData"></v-table>
+    <v-pager @page="callPage" :total="totalrecords"></v-pager>
+    <el-dialog :visible.sync="dialogFormVisible">
+      <el-form :model="form" label-width="140px">
+        <el-form-item label="职位名称">
+          <el-input v-model="form.name" autocomplete="off"></el-input>
+        </el-form-item>
+        <el-form-item label="职位描述">
+          <el-input type="textarea" :rows="4" resize="none" placeholder="请输入内容" v-model="form.textarea"></el-input>
+        </el-form-item>
+        <el-form-item label="职位状态">
+          <el-radio-group v-model="form.status">
+            <el-radio :label="0">启用</el-radio>
+            <el-radio :label="1">禁用</el-radio>
+          </el-radio-group>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogFormVisible = false">取 消</el-button>
+        <el-button type="primary" @click="dialogFormVisible = false">确 定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  data () {
+    return {
+      tableList: [],
+      dialogFormVisible: false,
+      form: {},
+      page: 1,
+      sortRule: {},
+      totalrecords: 0,
+      pickList: [],
+      list: [],
+      btn: [
+        {
+          name: '添加',
+          type: 'success',
+          method: ''
+        }
+      ],
+      table: {
+        column: [
+          {
+            label: '编号',
+            props: ''
+          },
+          {
+            label: '职位名称',
+            props: ''
+          },
+          {
+            label: '职位描述',
+            props: ''
+          },
+          {
+            label: '职位状态',
+            props: ''
+          }
+        ],
+        handle: [
+          {
+            title: '删除',
+            method: '',
+            type: 'info'
+          }
+        ]
+      }
+    }
+  }
+}
+</script>

+ 88 - 0
src/views/companyManage/procedureManage.vue

@@ -0,0 +1,88 @@
+<!--
+ * @Description: create
+ * @Version: 1.0
+ * @Autor: XuTongZhang
+ * @Date: 2020-07-28 16:00:46
+ * @LastEditors: XuTongZhang
+ * @LastEditTime: 2020-07-29 09:59:20
+-->
+<template>
+  <div class="indexPage">
+    <v-input :btn="btn" :list="list"></v-input>
+    <v-table
+      :table="table"
+      :tableList="tableList"
+      :sortType="true"
+      :queryData="queryData"
+    ></v-table>
+    <v-pager @page="callPage" :total="totalrecords"></v-pager>
+    <el-dialog :visible.sync="dialogFormVisible">
+      <el-form :model="form" label-width="140px">
+        <el-form-item label="职位名称">
+          <el-input v-model="form.name" autocomplete="off"></el-input>
+        </el-form-item>
+        <el-form-item label="职位描述">
+          <el-input type="textarea" :rows="4" resize="none" placeholder="请输入内容" v-model="form.textarea"></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogFormVisible = false">取 消</el-button>
+        <el-button type="primary" @click="dialogFormVisible = false">确 定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  data () {
+    return {
+      tableList: [],
+      dialogFormVisible: false,
+      form: {},
+      page: 1,
+      sortRule: {},
+      totalrecords: 0,
+      pickList: [],
+      list: [
+      ],
+      btn: [
+        {
+          name: '添加新面试流程',
+          type: 'success',
+          method: ''
+        }
+      ],
+      table: {
+        column: [
+          {
+            label: '编号',
+            props: ''
+          },
+          {
+            label: '流程名称',
+            props: ''
+          }
+        ],
+        handle: [
+          {
+            title: '查看',
+            method: '',
+            type: 'info'
+          },
+          {
+            title: '编辑',
+            method: '',
+            type: 'info'
+          },
+          {
+            title: '删除',
+            method: '',
+            type: 'info'
+          }
+        ]
+      }
+    }
+  }
+}
+</script>

+ 67 - 0
src/views/companyManage/sceneManage.vue

@@ -0,0 +1,67 @@
+<!--
+ * @Description: create
+ * @Version: 1.0
+ * @Autor: XuTongZhang
+ * @Date: 2020-07-28 16:12:21
+ * @LastEditors: XuTongZhang
+ * @LastEditTime: 2020-07-29 09:58:00
+-->
+<template>
+  <div class="indexPage">
+    <v-table
+      :table="table"
+      :tableList="tableList"
+      :sortType="true"
+      :queryData="queryData"
+    ></v-table>
+    <v-pager @page="callPage" :total="totalrecords"></v-pager>
+    <el-dialog :visible.sync="dialogFormVisible">
+      <el-form :model="form" label-width="140px">
+        <el-form-item label="场景名称">
+          <el-input v-model="form.name" autocomplete="off"></el-input>
+        </el-form-item>
+        <el-form-item label="场景描述">
+          <el-input type="textarea" :rows="4" resize="none" placeholder="请输入内容" v-model="form.textarea"></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogFormVisible = false">取 消</el-button>
+        <el-button type="primary" @click="dialogFormVisible = false">确 定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  data () {
+    return {
+      tableList: [],
+      dialogFormVisible: false,
+      form: {},
+      page: 1,
+      sortRule: {},
+      totalrecords: 0,
+      pickList: [],
+      table: {
+        column: [
+          {
+            label: '编号',
+            props: ''
+          },
+          {
+            label: '场景名称',
+            props: ''
+          },
+          {
+            label: '场景描述',
+            props: ''
+          }
+        ],
+        handle: [
+        ]
+      }
+    }
+  }
+}
+</script>

+ 84 - 0
src/views/companyManage/templateManage.vue

@@ -0,0 +1,84 @@
+<!--
+ * @Description: create
+ * @Version: 1.0
+ * @Autor: XuTongZhang
+ * @Date: 2020-07-28 16:28:13
+ * @LastEditors: XuTongZhang
+ * @LastEditTime: 2020-07-28 17:53:26
+-->
+<template>
+  <div class="indexPage">
+    <v-input :btn="btn" :list="list"></v-input>
+    <v-table
+      :table="table"
+      :tableList="tableList"
+      :sortType="true"
+      :queryData="queryData"
+    ></v-table>
+    <v-pager @page="callPage" :total="totalrecords"></v-pager>
+  </div>
+</template>
+
+<script>
+export default {
+  data () {
+    return {
+      tableList: [],
+      page: 1,
+      sortRule: {},
+      totalrecords: 0,
+      pickList: [],
+      list: [
+      ],
+      btn: [
+        {
+          name: '添加新视频',
+          type: 'success',
+          method: ''
+        }
+      ],
+      table: {
+        column: [
+          {
+            label: '编号',
+            props: ''
+          },
+          {
+            label: '视频名称',
+            props: ''
+          },
+          {
+            label: '关联场景',
+            props: ''
+          },
+          {
+            label: '关联流程',
+            props: ''
+          },
+          {
+            label: '关联表单',
+            props: ''
+          }
+        ],
+        handle: [
+          {
+            title: '查看',
+            method: '',
+            type: 'info'
+          },
+          {
+            title: '删除',
+            method: '',
+            type: 'info'
+          },
+          {
+            title: '二维码',
+            method: '',
+            type: 'info'
+          }
+        ]
+      }
+    }
+  }
+}
+</script>

+ 72 - 0
src/views/companyManage/videoManage.vue

@@ -0,0 +1,72 @@
+<!--
+ * @Description: create
+ * @Version: 1.0
+ * @Autor: XuTongZhang
+ * @Date: 2020-07-28 16:06:20
+ * @LastEditors: XuTongZhang
+ * @LastEditTime: 2020-07-28 16:14:54
+-->
+<template>
+  <div class="indexPage">
+    <v-input :btn="btn" :list="list"></v-input>
+    <v-table
+      :table="table"
+      :tableList="tableList"
+      :sortType="true"
+      :queryData="queryData"
+    ></v-table>
+    <v-pager @page="callPage" :total="totalrecords"></v-pager>
+  </div>
+</template>
+
+<script>
+export default {
+  data () {
+    return {
+      tableList: [],
+      page: 1,
+      sortRule: {},
+      totalrecords: 0,
+      pickList: [],
+      list: [
+      ],
+      btn: [
+        {
+          name: '添加新视频',
+          type: 'success',
+          method: ''
+        }
+      ],
+      table: {
+        column: [
+          {
+            label: '编号',
+            props: ''
+          },
+          {
+            label: '视频名称',
+            props: ''
+          }
+        ],
+        handle: [
+          {
+            title: '查看',
+            method: '',
+            type: 'info'
+          },
+          {
+            title: '编辑',
+            method: '',
+            type: 'info'
+          },
+          {
+            title: '删除',
+            method: '',
+            type: 'info'
+          }
+        ]
+      }
+    }
+  }
+}
+</script>

+ 13 - 0
src/views/error.vue

@@ -0,0 +1,13 @@
+<template>
+  <div>404</div>
+</template>
+
+<script>
+export default {
+
+}
+</script>
+
+<style>
+
+</style>

+ 113 - 0
src/views/login.vue

@@ -0,0 +1,113 @@
+<!--
+ * @Author       : yuanrunwei
+ * @Date         : 2020-05-18 12:05:37
+ * @LastEditors  : yuanrunwei
+ * @LastEditTime : 2020-05-18 19:27:42
+ * @FilePath     : \ambre-admin-noob\src\views\login.vue
+-->
+<template>
+  <div class="loginPage">
+    <div
+      class="login"
+    >
+        <!-- login-title -->
+        <div class="login-title">
+          <el-button type="text" style="margin-right: 33px" class="select-btn">新能源电池后台管理</el-button>
+        </div>
+        <!-- pwd -->
+        <div class="pwd-login">
+          <el-form
+            :model="loginForm"
+            :rules="pwdRules"
+            ref="pwdLogin"
+            label-width="0"
+          >
+            <el-form-item prop="loginname">
+              <el-input
+                v-model="loginForm.loginname"
+                name="loginname"
+                type="tel"
+                autocomplete="new-password"
+                placeholder="请输入账号"
+              >
+                <span slot="prefix" class="iconfont iconshouji"></span>
+              </el-input>
+            </el-form-item>
+            <el-form-item prop="password">
+              <el-input
+                type="password"
+                v-model="loginForm.password"
+                name="password"
+                @keyup.enter.native="login"
+                autocomplete="new-password"
+                placeholder="请输入密码"
+              >
+                <span slot="prefix" class="iconfont iconmima"></span>
+              </el-input>
+            </el-form-item>
+          </el-form>
+        </div>
+
+        <div class="login-footer">
+          <el-button class="login-btn" @click="login">登录</el-button>
+        </div>
+      </div>
+    <!--</div>-->
+  </div>
+</template>
+
+<style lang="scss" scoped>
+  .login-title{
+    display: flex;
+    justify-content: center;
+    align-items: center;
+  }
+</style>
+
+<script>
+export default {
+  data () {
+    return {
+      loginForm: {
+        loginname: '',
+        password: ''
+      },
+      pwdRules: {
+        loginname: [{ required: true, trigger: 'blur', message: '请输入账号' }],
+        password: [{ required: true, trigger: 'blur', message: '请输入密码' }, { min: 3, message: '请输入正确的密码', trigger: 'blur' }]
+      }
+    }
+  },
+  mounted () {
+  },
+  methods: {
+    // 登陆
+    login () {
+      this.$refs['pwdLogin'].validate(res => {
+        if (res) {
+          const { loginname, password } = this.loginForm
+          this.$api.post('/sys/platformLogin', {
+            'reqdata': {
+              loginname,
+              password
+            }
+          }).then(res => {
+            console.log(res)
+            this.$message.success({ message: '登陆成功' })
+            // this.$cookies.setCookies(res)
+            sessionStorage.setItem('info', JSON.stringify(res.object))
+            localStorage.setItem('menuId', res.object.menuids)
+            localStorage.setItem('managername', res.object.managername)
+            localStorage.setItem('managerid', res.object.managerid)
+            localStorage.setItem('token', res.object.token)
+            let time = setTimeout(() => {
+              location.reload()
+              clearTimeout(time)
+            }, 1000)
+          })
+        }
+      })
+    }
+  }
+}
+</script>

+ 60 - 0
vue.config.js

@@ -0,0 +1,60 @@
+/*
+ * @Author       : yuanrunwei
+ * @Date         : 2020-06-10 15:38:47
+ * @LastEditors  : yuanrunwei
+ * @LastEditTime : 2020-06-11 10:20:55
+ * @FilePath     : \batterycloud-admin\vue.config.js
+ */
+module.exports = {
+  transpileDependencies: [/node_modules[/\\\\](element-ui|vuex|)[/\\\\]/],
+  publicPath: './',
+  runtimeCompiler: true,
+  productionSourceMap: false,
+  devServer: {
+    host: '127.0.0.1',
+    https: false,
+    open: true,
+    proxy: {
+      '/sys': {
+        target: 'http://47.100.59.52:7782/sys',
+        wx: true,
+        changeOrigin: true,
+        pathRewrite: {
+          '^/sys': ''
+        }
+      },
+      '/platform': {
+        target: 'http://47.100.59.52:7782/platform',
+        wx: true,
+        changeOrigin: true,
+        pathRewrite: {
+          '^/platform': ''
+        }
+      },
+      'http://47.100.59.52:7782/platform': {
+        target: 'http://47.100.59.52:7782/platform',
+        wx: true,
+        changeOrigin: true,
+        pathRewrite: {
+          '^/http://47.100.59.52:7782/platform': ''
+        }
+      },
+      '/dict': {
+        target: 'http://47.100.59.52:7782/dict',
+        wx: true,
+        changeOrigin: true,
+        pathRewrite: {
+          '^/dict': ''
+        }
+      },
+      '/addr': {
+        target: 'http://47.100.59.52:7782/addr',
+        wx: true,
+        changeOrigin: true,
+        pathRewrite: {
+          '^/addr': ''
+        }
+      }
+    }
+  }
+}

File diff suppressed because it is too large
+ 8916 - 0
yarn.lock