Browse Source

初始化

master
超级管理员 3 years ago
parent
commit
e16dcdc048
  1. 14
      .editorconfig
  2. 7
      .env.development
  3. 7
      .env.production
  4. 10
      .env.staging
  5. 4
      .eslintignore
  6. 199
      .eslintrc.js
  7. 16
      .gitignore
  8. 5
      .travis.yml
  9. 21
      LICENSE
  10. 111
      README-zh.md
  11. 14
      babel.config.js
  12. 35
      build/index.js
  13. 24
      jest.config.js
  14. 9
      jsconfig.json
  15. 57
      mock/index.js
  16. 81
      mock/mock-server.js
  17. 29
      mock/table.js
  18. 84
      mock/user.js
  19. 25
      mock/utils.js
  20. 63
      package.json
  21. 8
      postcss.config.js
  22. BIN
      public/--favicon.ico
  23. BIN
      public/favicon.ico
  24. 19
      public/index.html
  25. 61
      src/App.vue
  26. 44
      src/__layout/components/AppMain.vue
  27. 155
      src/__layout/components/Navbar.vue
  28. 26
      src/__layout/components/Sidebar/FixiOSBug.js
  29. 41
      src/__layout/components/Sidebar/Item.vue
  30. 54
      src/__layout/components/Sidebar/Link.vue
  31. 82
      src/__layout/components/Sidebar/Logo.vue
  32. 95
      src/__layout/components/Sidebar/SidebarItem.vue
  33. 56
      src/__layout/components/Sidebar/index.vue
  34. 3
      src/__layout/components/index.js
  35. 93
      src/__layout/index.vue
  36. 45
      src/__layout/mixin/ResizeHandler copy.js
  37. 45
      src/__layout/mixin/ResizeHandler.js
  38. 273
      src/api/api/dutys.js
  39. 24
      src/api/api/group.js
  40. 26
      src/api/api/login/login.js
  41. 75
      src/api/api/renwu.js
  42. 9
      src/api/api/table.js
  43. 73
      src/api/api/user.js
  44. 42
      src/api/duty/dimension.js
  45. 418
      src/api/duty/duty.js
  46. 162
      src/api/duty/group.js
  47. 146
      src/api/duty/gwDingXing.js
  48. 59
      src/api/duty/gwFangan.js
  49. 91
      src/api/duty/oldGwDingXing.js
  50. 154
      src/api/duty/project.js
  51. 196
      src/api/duty/projectNew.js
  52. 59
      src/api/duty/quanXian.js
  53. 42
      src/api/duty/quantitativeIndicators.js
  54. 83
      src/api/duty/rules.js
  55. 89
      src/api/dutys.js
  56. 49
      src/api/echarts/echarts.js
  57. 32
      src/api/group.js
  58. 81
      src/api/honer.js
  59. 292
      src/api/personnel/post.js
  60. 9
      src/api/table.js
  61. 172
      src/api/user.js
  62. BIN
      src/assets/404_images/404.png
  63. BIN
      src/assets/404_images/404_cloud.png
  64. BIN
      src/assets/404_images/dashbord.png
  65. BIN
      src/assets/404_images/login_background.jpg
  66. 33
      src/assets/404_images/login_background.svg
  67. 123
      src/assets/404_images/login_left.svg
  68. BIN
      src/assets/404_images/logo.jpg
  69. BIN
      src/assets/404_images/logo.png
  70. BIN
      src/assets/404_images/logo_login.png
  71. 78
      src/components/Breadcrumb/index.vue
  72. 44
      src/components/Hamburger/index.vue
  73. 62
      src/components/SvgIcon/index.vue
  74. 151
      src/components/projectDialog/index.vue
  75. 9
      src/icons/index.js
  76. 1
      src/icons/svg/dashboard.svg
  77. 1
      src/icons/svg/example.svg
  78. 1
      src/icons/svg/eye-open.svg
  79. 1
      src/icons/svg/eye.svg
  80. 1
      src/icons/svg/form.svg
  81. 1
      src/icons/svg/link.svg
  82. 1
      src/icons/svg/nested.svg
  83. 1
      src/icons/svg/password.svg
  84. 1
      src/icons/svg/table.svg
  85. 1
      src/icons/svg/tree.svg
  86. 1
      src/icons/svg/user.svg
  87. 22
      src/icons/svgo.yml
  88. 48
      src/layout/components/AppMain.vue
  89. 154
      src/layout/components/Navbar.vue
  90. 26
      src/layout/components/Sidebar/FixiOSBug.js
  91. 41
      src/layout/components/Sidebar/Item.vue
  92. 49
      src/layout/components/Sidebar/Link.vue
  93. 82
      src/layout/components/Sidebar/Logo.vue
  94. 95
      src/layout/components/Sidebar/SidebarItem copy.vue
  95. 95
      src/layout/components/Sidebar/SidebarItem.vue
  96. 95
      src/layout/components/Sidebar/index.vue
  97. 42
      src/layout/components/Sidebar/subMenu copy.vue
  98. 44
      src/layout/components/Sidebar/subMenu.vue
  99. 94
      src/layout/components/TagsView/ScrollPane.vue
  100. 294
      src/layout/components/TagsView/index.vue

14
.editorconfig

@ -0,0 +1,14 @@
# http://editorconfig.org
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
[*.md]
insert_final_newline = false
trim_trailing_whitespace = false

7
.env.development

@ -0,0 +1,7 @@
# just a flag
ENV = 'development'
# base api
VUE_APP_BASE_API = 'http://vue.admin.net/api'
VUE_APP_BASE_API1 = 'http://vue.admin.net/hrapi'
VUE_APP_BASE_API2 = 'http://vue.admin.net/fileapi'

7
.env.production

@ -0,0 +1,7 @@
# just a flag
ENV = 'production'
# base api
VUE_APP_BASE_API = 'http://ginadmin.hxgk.group/api'
VUE_APP_BASE_API1 = 'http://ginadmin.hxgk.group/hrapi'
VUE_APP_BASE_API2 = 'http://ginadmin.hxgk.group/fileapi'

10
.env.staging

@ -0,0 +1,10 @@
NODE_ENV = production
# just a flag
ENV = 'staging'
# base api
VUE_APP_BASE_API = 'http://kpi.hxgk.net/api'
VUE_APP_BASE_API1 = 'http://kpi.hxgk.net/hrapi'
VUE_APP_BASE_API2 = 'http://kpi.hxgk.net/fileapi'

4
.eslintignore

@ -0,0 +1,4 @@
build/*.js
src/assets
public
dist

199
.eslintrc.js

@ -0,0 +1,199 @@
module.exports = {
root: true,
parserOptions: {
parser: 'babel-eslint',
sourceType: 'module',
"requireConfigFile":false
},
env: {
browser: true,
node: true,
es6: true,
},
extends: ['plugin:vue/recommended', 'eslint:recommended'],
// add your custom rules here
//it is base on https://github.com/vuejs/eslint-config-vue
rules: {
"vue/max-attributes-per-line": [2, {
"singleline": 10,
"multiline": {
"max": 1,
"allowFirstLine": false
}
}],
"vue/singleline-html-element-content-newline": "off",
"vue/multiline-html-element-content-newline":"off",
"vue/name-property-casing": ["error", "PascalCase"],
"vue/no-v-html": "off",
'accessor-pairs': 2,
'arrow-spacing': [2, {
'before': true,
'after': true
}],
'block-spacing': [2, 'always'],
'brace-style': [2, '1tbs', {
'allowSingleLine': true
}],
'camelcase': [0, {
'properties': 'always'
}],
'comma-dangle': [2, 'never'],
'comma-spacing': [2, {
'before': false,
'after': true
}],
'comma-style': [2, 'last'],
'constructor-super': 2,
'curly': [2, 'multi-line'],
'dot-location': [2, 'property'],
'eol-last': 2,
'eqeqeq': ["error", "always", {"null": "ignore"}],
'generator-star-spacing': [2, {
'before': true,
'after': true
}],
'handle-callback-err': [2, '^(err|error)$'],
'indent': [2, 2, {
'SwitchCase': 1
}],
'jsx-quotes': [2, 'prefer-single'],
'key-spacing': [2, {
'beforeColon': false,
'afterColon': true
}],
'keyword-spacing': [2, {
'before': true,
'after': true
}],
'new-cap': [2, {
'newIsCap': true,
'capIsNew': false
}],
'new-parens': 2,
'no-array-constructor': 2,
'no-caller': 2,
'no-console': 'off',
'no-class-assign': 2,
'no-cond-assign': 2,
'no-const-assign': 2,
'no-control-regex': 0,
'no-delete-var': 2,
'no-dupe-args': 2,
'no-dupe-class-members': 2,
'no-dupe-keys': 2,
'no-duplicate-case': 2,
'no-empty-character-class': 2,
'no-empty-pattern': 2,
'no-eval': 2,
'no-ex-assign': 2,
'no-extend-native': 2,
'no-extra-bind': 2,
'no-extra-boolean-cast': 2,
'no-extra-parens': [2, 'functions'],
'no-fallthrough': 2,
'no-floating-decimal': 2,
'no-func-assign': 2,
'no-implied-eval': 2,
'no-inner-declarations': [2, 'functions'],
'no-invalid-regexp': 2,
'no-irregular-whitespace': 2,
'no-iterator': 2,
'no-label-var': 2,
'no-labels': [2, {
'allowLoop': false,
'allowSwitch': false
}],
'no-lone-blocks': 2,
'no-mixed-spaces-and-tabs': 2,
'no-multi-spaces': 2,
'no-multi-str': 2,
'no-multiple-empty-lines': [2, {
'max': 1
}],
'no-native-reassign': 2,
'no-negated-in-lhs': 2,
'no-new-object': 2,
'no-new-require': 2,
'no-new-symbol': 2,
'no-new-wrappers': 2,
'no-obj-calls': 2,
'no-octal': 2,
'no-octal-escape': 2,
'no-path-concat': 2,
'no-proto': 2,
'no-redeclare': 2,
'no-regex-spaces': 2,
'no-return-assign': [2, 'except-parens'],
'no-self-assign': 2,
'no-self-compare': 2,
'no-sequences': 2,
'no-shadow-restricted-names': 2,
'no-spaced-func': 2,
'no-sparse-arrays': 2,
'no-this-before-super': 2,
'no-throw-literal': 2,
'no-trailing-spaces': 2,
'no-undef': 2,
'no-undef-init': 2,
'no-unexpected-multiline': 2,
'no-unmodified-loop-condition': 2,
'no-unneeded-ternary': [2, {
'defaultAssignment': false
}],
'no-unreachable': 2,
'no-unsafe-finally': 2,
'no-unused-vars': [2, {
'vars': 'all',
'args': 'none'
}],
'no-useless-call': 2,
'no-useless-computed-key': 2,
'no-useless-constructor': 2,
'no-useless-escape': 0,
'no-whitespace-before-property': 2,
'no-with': 2,
'one-var': [2, {
'initialized': 'never'
}],
'operator-linebreak': [2, 'after', {
'overrides': {
'?': 'before',
':': 'before'
}
}],
'padded-blocks': [2, 'never'],
'quotes': [2, 'single', {
'avoidEscape': true,
'allowTemplateLiterals': true
}],
'semi': [2, 'never'],
'semi-spacing': [2, {
'before': false,
'after': true
}],
'space-before-blocks': [2, 'always'],
'space-before-function-paren': [2, 'never'],
'space-in-parens': [2, 'never'],
'space-infix-ops': 2,
'space-unary-ops': [2, {
'words': true,
'nonwords': false
}],
'spaced-comment': [2, 'always', {
'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ',']
}],
'template-curly-spacing': [2, 'never'],
'use-isnan': 2,
'valid-typeof': 2,
'wrap-iife': [2, 'any'],
'yield-star-spacing': [2, 'both'],
'yoda': [2, 'never'],
'prefer-const': 2,
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
'object-curly-spacing': [2, 'always', {
objectsInObjects: false
}],
'array-bracket-spacing': [2, 'never']
}
}

16
.gitignore

@ -0,0 +1,16 @@
.DS_Store
node_modules/
dist/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
package-lock.json
tests/**/coverage/
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln

5
.travis.yml

@ -0,0 +1,5 @@
language: node_js
node_js: 10
script: npm run test
notifications:
email: false

21
LICENSE

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2017-present PanJiaChen
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

111
README-zh.md

@ -0,0 +1,111 @@
# vue-admin-template
> 这是一个极简的 vue admin 管理后台。它只包含了 Element UI & axios & iconfont & permission control & lint,这些搭建后台必要的东西。
[线上地址](http://panjiachen.github.io/vue-admin-template)
[国内访问](https://panjiachen.gitee.io/vue-admin-template)
目前版本为 `v4.0+` 基于 `vue-cli` 进行构建,若你想使用旧版本,可以切换分支到[tag/3.11.0](https://github.com/PanJiaChen/vue-admin-template/tree/tag/3.11.0),它不依赖 `vue-cli`
<p align="center">
<b>SPONSORED BY</b>
</p>
<p align="center">
<a href="https://finclip.com?from=vue_element" title="FinClip" target="_blank">
<img height="200px" src="https://gitee.com/panjiachen/gitee-cdn/raw/master/vue%E8%B5%9E%E5%8A%A9.png" title="FinClip">
</a>
</p>
## Extra
如果你想要根据用户角色来动态生成侧边栏和 router,你可以使用该分支[permission-control](https://github.com/PanJiaChen/vue-admin-template/tree/permission-control)
## 相关项目
- [vue-element-admin](https://github.com/PanJiaChen/vue-element-admin)
- [electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin)
- [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template)
- [awesome-project](https://github.com/PanJiaChen/vue-element-admin/issues/2312)
写了一个系列的教程配套文章,如何从零构建后一个完整的后台项目:
- [手摸手,带你用 vue 撸后台 系列一(基础篇)](https://juejin.im/post/59097cd7a22b9d0065fb61d2)
- [手摸手,带你用 vue 撸后台 系列二(登录权限篇)](https://juejin.im/post/591aa14f570c35006961acac)
- [手摸手,带你用 vue 撸后台 系列三 (实战篇)](https://juejin.im/post/593121aa0ce4630057f70d35)
- [手摸手,带你用 vue 撸后台 系列四(vueAdmin 一个极简的后台基础模板,专门针对本项目的文章,算作是一篇文档)](https://juejin.im/post/595b4d776fb9a06bbe7dba56)
- [手摸手,带你封装一个 vue component](https://segmentfault.com/a/1190000009090836)
## Build Setup
```bash
# 克隆项目
git clone https://github.com/PanJiaChen/vue-admin-template.git
# 进入项目目录
cd vue-admin-template
# 安装依赖
npm install
# 建议不要直接使用 cnpm 安装以来,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题
npm install --registry=https://registry.npm.taobao.org
# 启动服务
npm run dev
```
浏览器访问 [http://localhost:9528](http://localhost:9528)
## 发布
```bash
# 构建测试环境
npm run build:stage
# 构建生产环境
npm run build:prod
```
## 其它
```bash
# 预览发布环境效果
npm run preview
# 预览发布环境效果 + 静态资源分析
npm run preview -- --report
# 代码格式检查
npm run lint
# 代码格式检查并自动修复
npm run lint -- --fix
```
更多信息请参考 [使用文档](https://panjiachen.github.io/vue-element-admin-site/zh/)
## 购买贴纸
你也可以通过 购买[官方授权的贴纸](https://smallsticker.com/product/vue-element-admin) 的方式来支持 vue-element-admin - 每售出一张贴纸,我们将获得 2 元的捐赠。
## Demo
![demo](https://github.com/PanJiaChen/PanJiaChen.github.io/blob/master/images/demo.gif)
## Browsers support
Modern browsers and Internet Explorer 10+.
| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt="IE / Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>IE / Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Safari |
| --------- | --------- | --------- | --------- |
| IE10, IE11, Edge| last 2 versions| last 2 versions| last 2 versions
## License
[MIT](https://github.com/PanJiaChen/vue-admin-template/blob/master/LICENSE) license.
Copyright (c) 2017-present PanJiaChen

14
babel.config.js

@ -0,0 +1,14 @@
module.exports = {
presets: [
// https://github.com/vuejs/vue-cli/tree/master/packages/@vue/babel-preset-app
'@vue/cli-plugin-babel/preset'
],
'env': {
'development': {
// babel-plugin-dynamic-import-node plugin only does one thing by converting all import() to require().
// This plugin can significantly increase the speed of hot updates, when you have a large number of pages.
// https://panjiachen.github.io/vue-element-admin-site/guide/advanced/lazy-loading.html
'plugins': ['dynamic-import-node']
}
}
}

35
build/index.js

@ -0,0 +1,35 @@
const { run } = require('runjs')
const chalk = require('chalk')
const config = require('../vue.config.js')
const rawArgv = process.argv.slice(2)
const args = rawArgv.join(' ')
if (process.env.npm_config_preview || rawArgv.includes('--preview')) {
const report = rawArgv.includes('--report')
run(`vue-cli-service build ${args}`)
const port = 9526
const publicPath = config.publicPath
var connect = require('connect')
var serveStatic = require('serve-static')
const app = connect()
app.use(
publicPath,
serveStatic('./dist', {
index: ['index.html', '/']
})
)
app.listen(port, function () {
console.log(chalk.green(`> Preview at http://localhost:${port}${publicPath}`))
if (report) {
console.log(chalk.green(`> Report at http://localhost:${port}${publicPath}report.html`))
}
})
} else {
run(`vue-cli-service build ${args}`)
}

24
jest.config.js

@ -0,0 +1,24 @@
module.exports = {
moduleFileExtensions: ['js', 'jsx', 'json', 'vue'],
transform: {
'^.+\\.vue$': 'vue-jest',
'.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$':
'jest-transform-stub',
'^.+\\.jsx?$': 'babel-jest'
},
moduleNameMapper: {
'^@/(.*)$': '<rootDir>/src/$1'
},
snapshotSerializers: ['jest-serializer-vue'],
testMatch: [
'**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'
],
collectCoverageFrom: ['src/utils/**/*.{js,vue}', '!src/utils/auth.js', '!src/utils/request.js', 'src/components/**/*.{js,vue}'],
coverageDirectory: '<rootDir>/tests/unit/coverage',
// 'collectCoverage': true,
'coverageReporters': [
'lcov',
'text-summary'
],
testURL: 'http://gin.vueadmin.net/'
}

9
jsconfig.json

@ -0,0 +1,9 @@
{
"compilerOptions": {
"baseUrl": "./",
"paths": {
"@/*": ["src/*"]
}
},
"exclude": ["node_modules", "dist"]
}

57
mock/index.js

@ -0,0 +1,57 @@
const Mock = require('mockjs')
const { param2Obj } = require('./utils')
const user = require('./user')
const table = require('./table')
const mocks = [
...user,
...table
]
// for front mock
// please use it cautiously, it will redefine XMLHttpRequest,
// which will cause many of your third-party libraries to be invalidated(like progress event).
function mockXHR() {
// mock patch
// https://github.com/nuysoft/Mock/issues/300
Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send
Mock.XHR.prototype.send = function() {
if (this.custom.xhr) {
this.custom.xhr.withCredentials = this.withCredentials || false
if (this.responseType) {
this.custom.xhr.responseType = this.responseType
}
}
this.proxy_send(...arguments)
}
function XHR2ExpressReqWrap(respond) {
return function(options) {
let result = null
if (respond instanceof Function) {
const { body, type, url } = options
// https://expressjs.com/en/4x/api.html#req
result = respond({
method: type,
body: JSON.parse(body),
query: param2Obj(url)
})
} else {
result = respond
}
return Mock.mock(result)
}
}
for (const i of mocks) {
Mock.mock(new RegExp(i.url), i.type || 'get', XHR2ExpressReqWrap(i.response))
}
}
module.exports = {
mocks,
mockXHR
}

81
mock/mock-server.js

@ -0,0 +1,81 @@
const chokidar = require('chokidar')
const bodyParser = require('body-parser')
const chalk = require('chalk')
const path = require('path')
const Mock = require('mockjs')
const mockDir = path.join(process.cwd(), 'mock')
function registerRoutes(app) {
let mockLastIndex
const { mocks } = require('./index.js')
const mocksForServer = mocks.map(route => {
return responseFake(route.url, route.type, route.response)
})
for (const mock of mocksForServer) {
app[mock.type](mock.url, mock.response)
mockLastIndex = app._router.stack.length
}
const mockRoutesLength = Object.keys(mocksForServer).length
return {
mockRoutesLength: mockRoutesLength,
mockStartIndex: mockLastIndex - mockRoutesLength
}
}
function unregisterRoutes() {
Object.keys(require.cache).forEach(i => {
if (i.includes(mockDir)) {
delete require.cache[require.resolve(i)]
}
})
}
// for mock server
const responseFake = (url, type, respond) => {
return {
url: new RegExp(`${process.env.VUE_APP_BASE_API}${url}`),
type: type || 'get',
response(req, res) {
console.log('request invoke:' + req.path)
res.json(Mock.mock(respond instanceof Function ? respond(req, res) : respond))
}
}
}
module.exports = app => {
// parse app.body
// https://expressjs.com/en/4x/api.html#req.body
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({
extended: true
}))
const mockRoutes = registerRoutes(app)
var mockRoutesLength = mockRoutes.mockRoutesLength
var mockStartIndex = mockRoutes.mockStartIndex
// watch files, hot reload mock server
chokidar.watch(mockDir, {
ignored: /mock-server/,
ignoreInitial: true
}).on('all', (event, path) => {
if (event === 'change' || event === 'add') {
try {
// remove mock routes stack
app._router.stack.splice(mockStartIndex, mockRoutesLength)
// clear routes cache
unregisterRoutes()
const mockRoutes = registerRoutes(app)
mockRoutesLength = mockRoutes.mockRoutesLength
mockStartIndex = mockRoutes.mockStartIndex
console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed ${path}`))
} catch (error) {
console.log(chalk.redBright(error))
}
}
})
}

29
mock/table.js

@ -0,0 +1,29 @@
const Mock = require('mockjs')
const data = Mock.mock({
'items|30': [{
id: '@id',
title: '@sentence(10, 20)',
'status|1': ['published', 'draft', 'deleted'],
author: 'name',
display_time: '@datetime',
pageviews: '@integer(300, 5000)'
}]
})
module.exports = [
{
url: '/vue-admin-template/table/list',
type: 'get',
response: config => {
const items = data.items
return {
code: 20000,
data: {
total: items.length,
items: items
}
}
}
}
]

84
mock/user.js

@ -0,0 +1,84 @@
const tokens = {
admin: {
token: 'admin-token'
},
editor: {
token: 'editor-token'
}
}
const users = {
'admin-token': {
roles: ['admin'],
introduction: 'I am a super administrator',
avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
name: 'Super Admin'
},
'editor-token': {
roles: ['editor'],
introduction: 'I am an editor',
avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
name: 'Normal Editor'
}
}
module.exports = [
// user login
{
url: '/vue-admin-template/user/login',
type: 'post',
response: config => {
const { username } = config.body
const token = tokens[username]
// mock error
if (!token) {
return {
code: 60204,
message: 'Account and password are incorrect.'
}
}
return {
code: 20000,
data: token
}
}
},
// get user info
{
url: '/vue-admin-template/user/info\.*',
type: 'get',
response: config => {
const { token } = config.query
const info = users[token]
// mock error
if (!info) {
return {
code: 50008,
message: 'Login failed, unable to get user details.'
}
}
return {
code: 20000,
data: info
}
}
},
// user logout
{
url: '/vue-admin-template/user/logout',
type: 'post',
response: _ => {
return {
code: 20000,
data: 'success'
}
}
}
]

25
mock/utils.js

@ -0,0 +1,25 @@
/**
* @param {string} url
* @returns {Object}
*/
function param2Obj(url) {
const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ')
if (!search) {
return {}
}
const obj = {}
const searchArr = search.split('&')
searchArr.forEach(v => {
const index = v.indexOf('=')
if (index !== -1) {
const name = v.substring(0, index)
const val = v.substring(index + 1, v.length)
obj[name] = val
}
})
return obj
}
module.exports = {
param2Obj
}

63
package.json

@ -0,0 +1,63 @@
{
"name": "vue-admin-template",
"version": "4.4.0",
"description": "A vue admin template with Element UI & axios & iconfont & permission control & lint",
"author": "Pan <panfree23@gmail.com>",
"scripts": {
"dev": "vue-cli-service serve",
"build:prod": "vue-cli-service build",
"build:stage": "vue-cli-service build --mode staging",
"preview": "node build/index.js --preview",
"svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml",
"lint": "eslint --ext .js,.vue src",
"test:unit": "jest --clearCache && vue-cli-service test:unit",
"test:ci": "npm run lint && npm run test:unit"
},
"dependencies": {
"axios": "0.18.1",
"core-js": "^3.20.2",
"echarts": "^5.3.2",
"element-ui": "2.15.6",
"js-cookie": "2.2.0",
"normalize.css": "7.0.0",
"nprogress": "0.2.0",
"path-to-regexp": "2.4.0",
"vue": "2.6.10",
"vue-router": "3.0.6",
"vuex": "3.1.0"
},
"devDependencies": {
"@vue/cli-plugin-babel": "4.4.4",
"@vue/cli-plugin-eslint": "4.4.4",
"@vue/cli-plugin-unit-jest": "4.4.4",
"@vue/cli-service": "4.4.4",
"@vue/test-utils": "1.0.0-beta.29",
"autoprefixer": "9.5.1",
"babel-eslint": "10.1.0",
"babel-jest": "23.6.0",
"babel-plugin-dynamic-import-node": "2.3.3",
"chalk": "2.4.2",
"connect": "3.6.6",
"eslint": "6.7.2",
"eslint-plugin-vue": "6.2.2",
"html-webpack-plugin": "3.2.0",
"mockjs": "1.0.1-beta3",
"runjs": "4.3.2",
"sass": "1.26.8",
"sass-loader": "8.0.2",
"script-ext-html-webpack-plugin": "2.1.3",
"serve-static": "1.13.2",
"svg-sprite-loader": "4.1.3",
"svgo": "1.2.2",
"vue-template-compiler": "2.6.10"
},
"browserslist": [
"> 1%",
"last 2 versions"
],
"engines": {
"node": ">=8.9",
"npm": ">= 3.0.0"
},
"license": "MIT"
}

8
postcss.config.js

@ -0,0 +1,8 @@
// https://github.com/michael-ciniawsky/postcss-load-config
module.exports = {
'plugins': {
// to edit target browsers: use "browserslist" field in package.json
'autoprefixer': {}
}
}

BIN
public/--favicon.ico

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

BIN
public/favicon.ico

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

19
public/index.html

@ -0,0 +1,19 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title><%= webpackConfig.name %></title>
<script src="//res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
<script src="https://open.work.weixin.qq.com/wwopen/js/jwxwork-1.0.0.js"></script>
</head>
<body>
<noscript>
<strong>We're sorry but <%= webpackConfig.name %> 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>

61
src/App.vue

@ -0,0 +1,61 @@
<template>
<div id="app">
<router-view />
</div>
</template>
<script>
export default {
name: 'App',
data () {
return {
sjUrl:'https://www.hxgk.group/jumpapiurl/webindex?url=http://new.hxgk.group/sj/index.html'
}
},
beforeCreate(){
if (
navigator.userAgent.match(
/(Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i
)
) {
window.open('https://www.hxgk.group/jumpapiurl/webindex?url=http://new.hxgk.group/sj/index.html','_blank')
//return true; //
} else {
console.log("PC端");
//return false; // alert('PC')
}
if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) { //iPhone|iPad|iPod|iOS
window.location.href = 'https://www.hxgk.group/jumpapiurl/webindex?url=http://new.hxgk.group/sj/index.html';
}
},
created(){
// let flag = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i)
// if (flag) {
// //
// window.open(this.sjUrl,'_blank')
// } else {
// // pc
// }
},
mounted(){
window.addEventListener('hashchange',()=>{
var currentPath = window.location.hash.slice(1); //
if(this.$router.path !== currentPath){
console.log('动态跳转')
// this.$router.push(currentPath); //
}
},false);
}
}
</script>

44
src/__layout/components/AppMain.vue

@ -0,0 +1,44 @@
<template>
<section class="app-main">
<transition name="fade-transform" mode="out-in">
<router-view :key="key" />
</transition>
</section>
</template>
<script>
export default {
name: 'AppMain',
computed: {
key() {
console.log("AppMain")
console.log("AppMain")
console.log(this.$route.path)
return this.$route.path
}
}
}
</script>
<style scoped>
.app-main {
/*50 = navbar */
min-height: calc(100vh - 50px);
width: 100%;
position: relative;
overflow: hidden;
padding: 10px;
}
.fixed-header+.app-main {
padding-top: 50px;
}
</style>
<style lang="scss">
// fix css style bug in open el-dialog
.el-popup-parent--hidden {
.fixed-header {
padding-right: 15px;
}
}
</style>

155
src/__layout/components/Navbar.vue

@ -0,0 +1,155 @@
<template>
<div class="navbar">
<hamburger :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
<breadcrumb class="breadcrumb-container" />
<div class="right-menu">
<el-dropdown class="avatar-container" trigger="click">
<div class="avatar-wrapper">
<!-- <img :src="avatar+'?imageView2/1/w/80/h/80'" class="user-avatar"> -->
<div>
{{userInfo.groupName}}{{userInfo.roleName}}
</div>
<i class="el-icon-caret-bottom" />
</div>
<el-dropdown-menu slot="dropdown" class="user-dropdown">
<router-link to="/">
<el-dropdown-item>
个人信息
</el-dropdown-item>
</router-link>
<!-- <a target="_blank" href="https://github.com/PanJiaChen/vue-admin-template/">
<el-dropdown-item>Github</el-dropdown-item>
</a>
<a target="_blank" href="https://panjiachen.github.io/vue-element-admin-site/#/">
<el-dropdown-item>Docs</el-dropdown-item>
</a> -->
<el-dropdown-item divided @click.native="logout">
<span style="display:block;">退 </span>
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
</div>
</template>
<script>
import { mapGetters } from 'vuex'
import Breadcrumb from '@/components/Breadcrumb'
import Hamburger from '@/components/Hamburger'
export default {
data () {
return {
userInfo:{}
}
},
components: {
Breadcrumb,
Hamburger
},
computed: {
...mapGetters([
'sidebar',
'avatar'
])
},
created () {
if (JSON.parse(sessionStorage.getItem('userinfo'))==null) {
console.log('Navbarr Login')
this.$router.push('/login')
}
this.userInfo=JSON.parse(sessionStorage.getItem('userinfo'));
console.log(this.userInfo)
console.log("this.userInfo")
},
methods: {
toggleSideBar() {
this.$store.dispatch('app/toggleSideBar')
},
logout() {
this.$store.commit('user/loginOut')
}
}
}
</script>
<style lang="scss" scoped>
.navbar {
height: 50px;
overflow: hidden;
position: relative;
background: #fff;
box-shadow: 0 1px 4px rgba(0,21,41,.08);
.hamburger-container {
line-height: 46px;
height: 100%;
float: left;
cursor: pointer;
transition: background .3s;
-webkit-tap-highlight-color:transparent;
&:hover {
background: rgba(0, 0, 0, .025)
}
}
.breadcrumb-container {
float: left;
}
.right-menu {
float: right;
height: 100%;
line-height: 50px;
&:focus {
outline: none;
}
.right-menu-item {
display: inline-block;
padding: 0 8px;
height: 100%;
font-size: 18px;
color: #5a5e66;
vertical-align: text-bottom;
&.hover-effect {
cursor: pointer;
transition: background .3s;
&:hover {
background: rgba(0, 0, 0, .025)
}
}
}
.avatar-container {
margin-right: 30px;
.avatar-wrapper {
margin-top: 5px;
position: relative;
.user-avatar {
cursor: pointer;
width: 40px;
height: 40px;
border-radius: 10px;
}
.el-icon-caret-bottom {
cursor: pointer;
position: absolute;
right: -20px;
top: 25px;
font-size: 12px;
}
}
}
}
}
</style>

26
src/__layout/components/Sidebar/FixiOSBug.js

@ -0,0 +1,26 @@
export default {
computed: {
device() {
return this.$store.state.app.device
}
},
mounted() {
// In order to fix the click on menu on the ios device will trigger the mouseleave bug
// https://github.com/PanJiaChen/vue-element-admin/issues/1135
this.fixBugIniOS()
},
methods: {
fixBugIniOS() {
const $subMenu = this.$refs.subMenu
if ($subMenu) {
const handleMouseleave = $subMenu.handleMouseleave
$subMenu.handleMouseleave = (e) => {
if (this.device === 'mobile') {
return
}
handleMouseleave(e)
}
}
}
}
}

41
src/__layout/components/Sidebar/Item.vue

@ -0,0 +1,41 @@
<script>
export default {
name: 'MenuItem',
functional: true,
props: {
icon: {
type: String,
default: ''
},
title: {
type: String,
default: ''
}
},
render(h, context) {
const { icon, title } = context.props
const vnodes = []
if (icon) {
if (icon.includes('el-icon')) {
vnodes.push(<i class={[icon, 'sub-el-icon']} />)
} else {
vnodes.push(<svg-icon icon-class={icon}/>)
}
}
if (title) {
vnodes.push(<span slot='title'>{(title)}</span>)
}
return vnodes
}
}
</script>
<style scoped>
.sub-el-icon {
color: currentColor;
width: 1em;
height: 1em;
}
</style>

54
src/__layout/components/Sidebar/Link.vue

@ -0,0 +1,54 @@
<template>
<component :is="type" v-bind="linkProps(to)">
<slot />
</component>
</template>
<script>
import { isExternal } from '@/utils/validate'
export default {
props: {
to: {
type: String,
required: true
}
},
created () {
console.log("tiaozhuan")
},
computed: {
isExternal() {
return isExternal(this.to)
},
type() {
if (this.isExternal) {
return 'a'
}
return 'router-link'
}
},
methods: {
linkProps(to) {
console.log("to")
console.log(to)
console.log("this.isExternal")
console.log(this.isExternal)
console.log("this.type")
console.log(this.type)
if (this.isExternal) {
console.log("isExternal")
return {
href: to,
target: '_blank',
rel: 'noopener'
}
}
return {
to: to
}
}
}
}
</script>

82
src/__layout/components/Sidebar/Logo.vue

@ -0,0 +1,82 @@
<template>
<div class="sidebar-logo-container" :class="{'collapse':collapse}">
<transition name="sidebarLogoFade">
<router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/">
<img v-if="logo" :src="logo" class="sidebar-logo">
<h1 v-else class="sidebar-title">{{ title }} </h1>
</router-link>
<router-link v-else key="expand" class="sidebar-logo-link" to="/">
<img v-if="logo" :src="logo" class="sidebar-logo">
<h1 class="sidebar-title">{{ title }} </h1>
</router-link>
</transition>
</div>
</template>
<script>
export default {
name: 'SidebarLogo',
props: {
collapse: {
type: Boolean,
required: true
}
},
data() {
return {
title: 'Vue Admin Template',
logo: 'https://wpimg.wallstcn.com/69a1c46c-eb1c-4b46-8bd4-e9e686ef5251.png'
}
}
}
</script>
<style lang="scss" scoped>
.sidebarLogoFade-enter-active {
transition: opacity 1.5s;
}
.sidebarLogoFade-enter,
.sidebarLogoFade-leave-to {
opacity: 0;
}
.sidebar-logo-container {
position: relative;
width: 100%;
height: 50px;
line-height: 50px;
background: #2b2f3a;
text-align: center;
overflow: hidden;
& .sidebar-logo-link {
height: 100%;
width: 100%;
& .sidebar-logo {
width: 32px;
height: 32px;
vertical-align: middle;
margin-right: 12px;
}
& .sidebar-title {
display: inline-block;
margin: 0;
color: #fff;
font-weight: 600;
line-height: 50px;
font-size: 14px;
font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif;
vertical-align: middle;
}
}
&.collapse {
.sidebar-logo {
margin-right: 0px;
}
}
}
</style>

95
src/__layout/components/Sidebar/SidebarItem.vue

@ -0,0 +1,95 @@
<template>
<div v-if="!item.hidden">
<template v-if="hasOneShowingChild(item.children,item) && (!onlyOneChild.children||onlyOneChild.noShowingChildren)&&!item.alwaysShow">
<app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path)">
<el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{'submenu-title-noDropdown':!isNest}">
<item :icon="onlyOneChild.meta.icon||(item.meta&&item.meta.icon)" :title="onlyOneChild.meta.title" />
</el-menu-item>
</app-link>
</template>
<el-submenu v-else ref="subMenu" :index="resolvePath(item.path)" popper-append-to-body>
<template slot="title">
<item v-if="item.meta" :icon="item.meta && item.meta.icon" :title="item.meta.title" />
</template>
<sidebar-item
v-for="child in item.children"
:key="child.path"
:is-nest="true"
:item="child"
:base-path="resolvePath(child.path)"
class="nest-menu"
/>
</el-submenu>
</div>
</template>
<script>
import path from 'path'
import { isExternal } from '@/utils/validate'
import Item from './Item'
import AppLink from './Link'
import FixiOSBug from './FixiOSBug'
export default {
name: 'SidebarItem',
components: { Item, AppLink },
mixins: [FixiOSBug],
props: {
// route object
item: {
type: Object,
required: true
},
isNest: {
type: Boolean,
default: false
},
basePath: {
type: String,
default: ''
}
},
data() {
// To fix https://github.com/PanJiaChen/vue-admin-template/issues/237
// TODO: refactor with render function
this.onlyOneChild = null
return {}
},
methods: {
hasOneShowingChild(children = [], parent) {
const showingChildren = children.filter(item => {
if (item.hidden) {
return false
} else {
// Temp set(will be used if only has one showing child)
this.onlyOneChild = item
return true
}
})
// When there is only one child router, the child router is displayed by default
if (showingChildren.length === 1) {
return true
}
// Show parent if there are no child router to display
if (showingChildren.length === 0) {
this.onlyOneChild = { ... parent, path: '', noShowingChildren: true }
return true
}
return false
},
resolvePath(routePath) {
if (isExternal(routePath)) {
return routePath
}
if (isExternal(this.basePath)) {
return this.basePath
}
return path.resolve(this.basePath, routePath)
}
}
}
</script>

56
src/__layout/components/Sidebar/index.vue

@ -0,0 +1,56 @@
<template>
<div :class="{'has-logo':showLogo}">
<logo v-if="showLogo" :collapse="isCollapse" />
<el-scrollbar wrap-class="scrollbar-wrapper">
<el-menu
:default-active="activeMenu"
:collapse="isCollapse"
:background-color="variables.menuBg"
:text-color="variables.menuText"
:unique-opened="false"
:active-text-color="variables.menuActiveText"
:collapse-transition="false"
mode="vertical"
>
<sidebar-item v-for="route in routes" :key="route.path" :item="route" :base-path="route.path" />
</el-menu>
</el-scrollbar>
</div>
</template>
<script>
import { mapGetters } from 'vuex'
import Logo from './Logo'
import SidebarItem from './SidebarItem'
import variables from '@/styles/variables.scss'
export default {
components: { SidebarItem, Logo },
computed: {
...mapGetters([
'sidebar'
]),
routes() {
return this.$router.options.routes
},
activeMenu() {
const route = this.$route
const { meta, path } = route
// if set path, the sidebar will highlight the path you set
if (meta.activeMenu) {
return meta.activeMenu
}
return path
},
showLogo() {
return this.$store.state.settings.sidebarLogo
},
variables() {
return variables
},
isCollapse() {
return !this.sidebar.opened
}
}
}
</script>

3
src/__layout/components/index.js

@ -0,0 +1,3 @@
export { default as Navbar } from './Navbar'
export { default as Sidebar } from './Sidebar'
export { default as AppMain } from './AppMain'

93
src/__layout/index.vue

@ -0,0 +1,93 @@
<template>
<div :class="classObj" class="app-wrapper">
<div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside" />
<sidebar class="sidebar-container" />
<div class="main-container">
<div :class="{'fixed-header':fixedHeader}">
<navbar />
</div>
<app-main />
</div>
</div>
</template>
<script>
import { Navbar, Sidebar, AppMain } from './components'
import ResizeMixin from './mixin/ResizeHandler'
export default {
name: 'Layout',
components: {
Navbar,
Sidebar,
AppMain
},
mixins: [ResizeMixin],
computed: {
sidebar() {
return this.$store.state.app.sidebar
},
device() {
return this.$store.state.app.device
},
fixedHeader() {
return this.$store.state.settings.fixedHeader
},
classObj() {
return {
hideSidebar: !this.sidebar.opened,
openSidebar: this.sidebar.opened,
withoutAnimation: this.sidebar.withoutAnimation,
mobile: this.device === 'mobile'
}
}
},
methods: {
handleClickOutside() {
this.$store.dispatch('app/closeSideBar', { withoutAnimation: false })
}
}
}
</script>
<style lang="scss" scoped>
@import "~@/styles/mixin.scss";
@import "~@/styles/variables.scss";
.app-wrapper {
@include clearfix;
position: relative;
height: 100%;
width: 100%;
&.mobile.openSidebar{
position: fixed;
top: 0;
}
}
.drawer-bg {
background: #000;
opacity: 0.3;
width: 100%;
top: 0;
height: 100%;
position: absolute;
z-index: 999;
}
.fixed-header {
position: fixed;
top: 0;
right: 0;
z-index: 9;
width: calc(100% - #{$sideBarWidth});
transition: width 0.28s;
}
.hideSidebar .fixed-header {
width: calc(100% - 54px)
}
.mobile .fixed-header {
width: 100%;
}
</style>

45
src/__layout/mixin/ResizeHandler copy.js

@ -0,0 +1,45 @@
import store from '@/store'
const { body } = document
const WIDTH = 992 // refer to Bootstrap's responsive design
export default {
watch: {
$route(route) {
if (this.device === 'mobile' && this.sidebar.opened) {
store.dispatch('app/closeSideBar', { withoutAnimation: false })
}
}
},
beforeMount() {
window.addEventListener('resize', this.$_resizeHandler)
},
beforeDestroy() {
window.removeEventListener('resize', this.$_resizeHandler)
},
mounted() {
const isMobile = this.$_isMobile()
if (isMobile) {
store.dispatch('app/toggleDevice', 'mobile')
store.dispatch('app/closeSideBar', { withoutAnimation: true })
}
},
methods: {
// use $_ for mixins properties
// https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential
$_isMobile() {
const rect = body.getBoundingClientRect()
return rect.width - 1 < WIDTH
},
$_resizeHandler() {
if (!document.hidden) {
const isMobile = this.$_isMobile()
store.dispatch('app/toggleDevice', isMobile ? 'mobile' : 'desktop')
if (isMobile) {
store.dispatch('app/closeSideBar', { withoutAnimation: true })
}
}
}
}
}

45
src/__layout/mixin/ResizeHandler.js

@ -0,0 +1,45 @@
import store from '@/store'
const { body } = document
const WIDTH = 992 // refer to Bootstrap's responsive design
export default {
watch: {
$route(route) {
if (this.device === 'mobile' && this.sidebar.opened) {
store.dispatch('app/closeSideBar', { withoutAnimation: false })
}
}
},
beforeMount() {
window.addEventListener('resize', this.$_resizeHandler)
},
beforeDestroy() {
window.removeEventListener('resize', this.$_resizeHandler)
},
mounted() {
const isMobile = this.$_isMobile()
if (isMobile) {
store.dispatch('app/toggleDevice', 'mobile')
store.dispatch('app/closeSideBar', { withoutAnimation: true })
}
},
methods: {
// use $_ for mixins properties
// https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential
$_isMobile() {
const rect = body.getBoundingClientRect()
return rect.width - 1 < WIDTH
},
$_resizeHandler() {
if (!document.hidden) {
const isMobile = this.$_isMobile()
store.dispatch('app/toggleDevice', isMobile ? 'mobile' : 'desktop')
if (isMobile) {
store.dispatch('app/closeSideBar', { withoutAnimation: true })
}
}
}
}
}

273
src/api/api/dutys.js

@ -0,0 +1,273 @@
import request from '@/utils/request'
//个人需要填写的考核项目
export function myassessmentlist(params) {
return request({
url: '/dutys/myassessmentlist',
method: 'post',
params
})
}
//根据具体考核项目获取被考核部门
export const getDutydepartlist = (data) => {
return request({
url: '/dutys/getDutydepartlist',
method: 'post',
data: data
})
}
//根据具体考核项目获取被考核部门
export const addassessmentscore = (data) => {
return request({
url: '/dutys/addassessmentscore',
method: 'post',
data: data
})
}
//个人考核评价记录
export const myevaluatelist = (data) => {
return request({
url: '/dutys/myevaluatelist',
method: 'post',
data: data
})
}
//根据部门和时间获取考核详情
export const getdeparttimeassess = (data) => {
return request({
url: '/dutys/getdeparttimeassess',
method: 'post',
data: data
})
}
//获取企业微信发起基础配置
export const getconfig = (data) => {
return request({
url: '/examine/getconfig',
method: 'post',
data: data
})
}
//以部门维度考核内容列表
export const departmentassess = (data) => {
return request({
url: '/dutys/departmentassess',
method: 'post',
data: data
})
}
//根据部门和时间写入全部考核项分值
export const departmentassessdata = (data) => {
return request({
url: '/dutys/departmentassessdata',
method: 'post',
data: data
})
}
//查看审批详细内容
export const lookdepartmentassessinfo = (data) => {
return request({
url: '/noverify/lookdepartmentassessinfo',
method: 'post',
data: data
})
}
//查看本部门提交的和个人提交的审批
export const lookpersonalordepartment = (data) => {
return request({
url: '/dutys/lookpersonalordepartment',
method: 'post',
data: data
})
}
//定性考核列表
export const qualevalulist = (data) => {
return request({
url: '/eval/qualevalulist',
method: 'post',
data: data
})
}
//添加加分或减分
export const additionandsubtractionscore = (data) => {
return request({
url: '/eval/plusorminuspoints',
method: 'post',
data: data
})
}
//流程列表
export const seeflowlog = (data) => {
return request({
url: '/eval/seeflowlog',
method: 'post',
data: data
})
}
//文档上传
export const upordown = (data) => {
return request({
url: '/upordown',
method: 'post',
data: data
})
}
// @Tags Api
// @Summary 获取集团架构人员信息对照表
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body dbModel.Api true "获取集团架构"
// @Success 200 {string} json "{"success":true,"data":{},"msg":"获取成功"}"
// @Router /group/grouplist [get]
export const getgroupuser = (data) => {
return request({
url: '/group/getgroupuser',
method: 'post',
data
})
}
//划分责任人
export const adddivisionresponsibility = (data) => {
return request({
url: '/eval/rersonincharge',
method: 'post',
data: data
})
}
//添加整改措施
export const addcorrectivemeasures = (data) => {
return request({
url: '/eval/rectificationmeasures',
method: 'post',
data: data
})
}
//定量考核列表
export const qualitativeevalration = (data) => {
return request({
url: '/eval/qualitativeevalration',
method: 'post',
data: data
})
}
//获取集团架构(集团+分厂)
export const getgroupdepartmap = (data) => {
return request({
url: '/group/getgroupdepartmap',
method: 'post',
data: data
})
}
//获取分厂
export const departmentlist = (data) => {
return request({
url: '/group/departmentlist',
method: 'post',
data: data
})
}
//定量考核打分
export const addflowrationlog = (data) => {
return request({
url: '/eval/addflowrationlog',
method: 'post',
data: data
})
}
//提交定量审核
export const quanOperation = (data) => {
return request({
url: '/quan/operation',
method: 'post',
data: data
})
}
//查看定性考核审批列表
export const lookdutkscoreflow = (data) => {
return request({
url: '/eval/lookdutkscoreflow',
method: 'post',
data: data
})
}
//查看定量考核
export const lookrationkscoreflow = (data) => {
return request({
url: '/eval/lookrationkscoreflow',
method: 'post',
data: data
})
}
//获取班组
export const getteamlist = (data) => {
return request({
url: '/noverify/getteamlist',
method: 'post',
data: data
})
}
//获取人员
export const stafflist = (data) => {
return request({
url: '/staff/stafflist',
method: 'post',
data: data
})
}
//新定性考核列表
export const newqualitative = (data) => {
return request({
url: '/eval/newqualitative',
method: 'post',
data: data
})
}
//获取新定性考核详细指标
export const newgetqualdetailedtarget = (data) => {
return request({
url: '/eval/newgetqualdetailedtarget',
method: 'post',
data: data
})
}
//加减分NEW
export const plusorminuspoints = (data) => {
return request({
url: '/eval/plusorminuspointsnew',
method: 'post',
data: data
})
}
//流程图 1是整改2是不整改
export const examineflow = (data) => {
return request({
url: '/eval/examineflow',
method: 'post',
data: data
})
}
//定性审批
export const operation = (data) => {
return request({
url: '/qual/operation',
method: 'post',
data: data
})
}
//定量审批
export const sanction = (data) => {
return request({
url: '/quan/sanction',
method: 'post',
data: data
})
}
//汇总详情
export const summarydetails = (data) => {
return request({
url: '/quan/summarydetails',
method: 'post',
data: data
})
}

24
src/api/api/group.js

@ -0,0 +1,24 @@
import request from '@/utils/request'
// @Tags Api
// @Summary 获取集团架构(集团+分厂)
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body dbModel.Api true "获取集团架构"
// @Success 200 {string} json "{"success":true,"data":{},"msg":"获取成功"}"
// @Router /group/grouplist [get]
export const getgroupdepartmap = (data) => {
return request({
url: '/group/getgroupdepartmap',
method: 'post',
data: data
})
}
//以部门维度考核内容列表
export const departmentassess = (data) => {
return request({
url: '/dutys/departmentassess',
method: 'post',
data: data
})
}

26
src/api/api/login/login.js

@ -0,0 +1,26 @@
import request from '@/utils/request'
//个人需要填写的考核项目
export const oauth2 = (data) => {
return request({
url: '/base/oauth2',
method: 'post',
data: data
})
}
// @Summary 用户端登录
// @Produce application/json
// @Param data body {username:"string",password:"string"}
// @Router /base/login [post]
export const mylogin = (data) => {
return request({
url: '/base/mylogin',
method: 'post',
data: data
})
}
export function logout() {
return request({
url: '/vue-admin-template/user/logout',
method: 'post'
})
}

75
src/api/api/renwu.js

@ -0,0 +1,75 @@
import request from '@/utils/request'
//注销接口
export function logout(params) {
return request({
url: '/logout.do',
method: 'get',
params
})
}
//登录接口
export const login = (data) => {
return request({
url: '/login.do',
method: 'post',
data: data
})
}
//注册
export const register = (data) => {
return request({
url: '/login/register',
method: 'post',
data: data
})
}
//绑定提现账户
export const accountBinding = (data) => {
return request({
url: '/user/accountBinding',
method: 'post',
data: data
})
}
//申请提现
export const withdraw = (data) => {
return request({
url: '/user/withdraw',
method: 'post',
data: data
})
}
//激活码激活
export const cdkActivation = (data) => {
return request({
url: '/user/cdkActivation',
method: 'post',
data: data
})
}
//主页
export const index = (data) => {
return request({
url: '/user/index',
method: 'post',
data: data
})
}
//开始任务按钮
export const start = (data) => {
return request({
url: '/user/start',
method: 'post',
data: data
})
}
//校验是否到期并且上传收益接口
export const checkAndAdd = (data) => {
return request({
url: '/user/checkAndAdd',
method: 'post',
data: data
})
}

9
src/api/api/table.js

@ -0,0 +1,9 @@
import request from '@/utils/request'
export function getList(params) {
return request({
url: '/vue-admin-template/table/list',
method: 'get',
params
})
}

73
src/api/api/user.js

@ -0,0 +1,73 @@
import request from '@/utils/request'
export function login(data) {
return request({
url: '/vue-admin-template/user/login',
method: 'post',
data
})
}
export function getInfo(token) {
return request({
url: '/vue-admin-template/user/info',
method: 'get',
params: { token }
})
}
// @Summary 获取验证码
// @Produce application/json
// @Param data body {username:"string",password:"string"}
// @Router /base/captcha [post]
// export const captcha = (data) => {
// return service({
// url: '/base/captcha',
// method: 'post',
// data: data
// })
// }
export function captcha() {
return request({
url: '/base/captcha',
method: 'post'
})
}
// @Summary 用户端登录
// @Produce application/json
// @Param data body {username:"string",password:"string"}
// @Router /base/login [post]
export const mylogin = (data) => {
return request({
url: '/base/mylogin',
method: 'post',
data: data
})
}
// @Summary 超级登录
// @Produce application/json
// @Param data body {username:"string",password:"string"}
// @Router /base/login [post]
export const scancodelogin = (data) => {
return request({
url: '/base/scancodelogin',
method: 'post',
data: data
})
}
export function logout() {
return request({
url: '/vue-admin-template/user/logout',
method: 'post'
})
}
// @Summary 查询个人信息
// @Produce application/json
// @Param data body {username:"string",password:"string"}
// @Router /base/login [post]
export const scancode = (data) => {
return request({
url: '/noverify/scancode',
method: 'post',
data: data
})
}

42
src/api/duty/dimension.js

@ -0,0 +1,42 @@
// 考核纬度api
import request from '@/utils/request'
//考核维度
export const dutyclasslist = (data) => {
return request({
url: '/duty/dutyclasslist',
method: 'post',
data: data
})
}
//添加考核类别
export const adddutyclass = (data) => {
return request({
url: '/duty/adddutyclass',
method: 'post',
data: data
})
}
//查询考核维度详情
export const getdutyclassinfo = (data) => {
return request({
url: '/duty/getdutyclassinfo',
method: 'post',
data: data
})
}
//编辑考核维度内容
export const eitedutyclassinfo = (data) => {
return request({
url: '/duty/eitedutyclassinfo',
method: 'post',
data: data
})
}
//删除或改变考核维度状态
export const statedutyclass = (data) => {
return request({
url: '/duty/statedutyclass',
method: 'post',
data: data
})
}

418
src/api/duty/duty.js

@ -0,0 +1,418 @@
// 定性考核api
import request from '@/utils/request'
//定性考核列表
export const getqualevallist = (data) => {
return request({
url: '/duty/getqualevallist',
method: 'post',
data: data
})
}
//获取正在激活的考核方案
export const getactivationplanversion = (data) => {
return request({
url: '/admin/getactivationplanversion',
method: 'post',
data: data
})
}
//添加定性考核
export const addqualeval = (data) => {
return request({
url: '/duty/addqualeval',
method: 'post',
data: data
})
}
//根据条件获取组合指标
export const gettasktarget = (data) => {
return request({
url: '/duty/gettasktarget',
method: 'post',
data: data
})
}
//根据条件获取组合指标子栏目
export const gettasktargetsun = (data) => {
return request({
url: '/duty/gettasktargetsun',
method: 'post',
data: data
})
}
//根据条件获取考核详情
export const gettasktargetcontary = (data) => {
return request({
url: '/duty/gettasktargetcontary',
method: 'post',
data: data
})
}
//添加定量考核
export const addration = (data) => {
return request({
url: '/duty/addration',
method: 'post',
data: data
})
}
//考核表列表
export const departmenttasklist = (data) => {
return request({
url: '/duty/departmenttasklist',
method: 'post',
data: data
})
}
//删除考核
export const delrationlist = (data) => {
return request({
url: '/duty/delrationlist',
method: 'post',
data: data
})
}
//删除定性考核内容
export const delqualevalcont = (data) => {
return request({
url: '/duty/delqualevalcont',
method: 'post',
data: data
})
}
//删除考核细则方案内容
export const deldepartmenttasklist = (data) => {
return request({
url: '/duty/deldepartmenttasklist',
method: 'post',
data: data
})
}
//获取定量考核详情
export const getrationlist = (data) => {
return request({
url: '/duty/getrationlist',
method: 'post',
data: data
})
}
//修改定量考核
export const eiterationlist = (data) => {
return request({
url: '/duty/eiterationlist',
method: 'post',
data: data
})
}
//获取部门考核指标详情
export const getqualeval = (data) => {
return request({
url: '/duty/getqualeval',
method: 'post',
data: data
})
}
//修改定性考核内容
export const eitequalevalcont = (data) => {
return request({
url: '/duty/eitequalevalcont',
method: 'post',
data: data
})
}
//添加指标权重(批量
export const addqubatch = (data) => {
return request({
url: '/duty/addqubatch',
method: 'post',
data: data
})
}
//部门考核列表
export const bumenList = (data) => {
return request({
url: '/duty/departmentlist',
method: 'post',
data: data
})
}
//部门考核列表新
export const departmentlistnew = (data) => {
return request({
url: '/duty/departmentlistnew',
method: 'post',
data: data
})
}
//部门新增考核列表
export const adddepartmentdutyinfo = (data) => {
return request({
url: '/duty/adddepartmentdutyinfo',
method: 'post',
data: data
})
}
//查看定量考核目标设定
export const lookquantitativeconfig = (data) => {
return request({
url: '/admin/lookquantitativeconfig',
method: 'post',
data: data
})
}
//结算周期
export const setevaluationobjectives = (data) => {
return request({
url: '/duty/setevaluationobjectives',
method: 'post',
data: data
})
}
//获取定性考核列表用于列表展示
export const dutydepartmentlist = (data) => {
return request({
url: '/admin/dutydepartmentlist',
method: 'post',
data: data
})
}
//获取定性考核列表用于下拉列表
export const selectdutylist = (data) => {
return request({
url: '/admin/selectdutylist',
method: 'post',
data: data
})
}
//根据指标ID获取列表信息
export const idtotargetsunlist = (data) => {
return request({
url: '/admin/idtotargetsunlist',
method: 'post',
data: data
})
}
//修改子栏目名称
export const eitesuntargetname = (data) => {
return request({
url: '/admin/eitesuntargetname',
method: 'post',
data: data
})
}
////获取定性指标->指标细则修改回显
export const getdetailedtargetcallback = (data) => {
return request({
url: '/admin/getdetailedtargetcallback',
method: 'post',
data: data
})
}
////获取定性指标->指标细则修改回显与新增
export const eitedetailedtargetcallback = (data) => {
return request({
url: '/admin/eitedetailedtargetcallback',
method: 'post',
data: data
})
}
////删除定性考核指标
export const deldutytarget = (data) => {
return request({
url: '/admin/deldutytarget',
method: 'post',
data: data
})
}
////删除定性考核指标子栏目
export const delsuntardimeat = (data) => {
return request({
url: '/admin/delsuntardimeat',
method: 'post',
data: data
})
}
//获取定性考核指标关系指定列表
export const getdutyrelationlist = (data) => {
return request({
url: '/admin/getdutyrelationlist',
method: 'post',
data: data
})
}
//获取定性考核子栏目
export const lookdutytargetinfo = (data) => {
return request({
url: '/admin/lookdutytargetinfo',
method: 'post',
data: data
})
}
//添加 定性考核指标关系指定
export const adddutyrelation = (data) => {
return request({
url: '/admin/adddutyrelation',
method: 'post',
data: data
})
}
//删除定性考核指标(NEW)
export const newdeltarget = (data) => {
return request({
url: '/admin/newdeltarget',
method: 'post',
data: data
})
}
//获取被修改指标细则的详情(NEW)
export const getneweitedetailedtarget = (data) => {
return request({
url: '/admin/getneweitedetailedtarget',
method: 'post',
data: data
})
}
//删除指标细则内容(NEW)
export const newdeldetailedtarget = (data) => {
return request({
url: '/admin/newdeldetailedtarget',
method: 'post',
data: data
})
}
//删除指标子栏目内容(NEW)
export const newdelsuntarget = (data) => {
return request({
url: '/admin/newdelsuntarget',
method: 'post',
data: data
})
}
//修改或添加定性考核指标细则内容(NEW)
export const neweitedetailedtarget = (data) => {
return request({
url: '/admin/neweitedetailedtarget',
method: 'post',
data: data
})
}
//部门考核添加。NEW
export const newadddepartduty = (data) => {
return request({
url: '/admin/newadddepartduty',
method: 'post',
data: data
})
}
//新的部门考核指标获取列表
export const newgerderpattarlist = (data) => {
return request({
url: '/admin/newgerderpattarlist',
method: 'post',
data: data
})
}
//删除部门考核(New)
export const deldepartduty = (data) => {
return request({
url: '/admin/deldepartduty',
method: 'post',
data: data
})
}
//删除部门考核指标(New)
export const deldepartdutytarger = (data) => {
return request({
url: '/admin/deldepartdutytarger',
method: 'post',
data: data
})
}
//获取定性考核相关部门
export const getdepartforduty = (data) => {
return request({
url: '/admin/getdepartforduty',
method: 'post',
data: data
})
}
//修改已知定性考核指标关联部门
export const eitedepartforduty = (data) => {
return request({
url: '/admin/eitedepartforduty',
method: 'post',
data: data
})
}
//部门考核方案版本列表
export const departdutyplanversion = (data) => {
return request({
url: '/admin/departdutyplanversion',
method: 'post',
data: data
})
}
//添加部门考核方案(待版本号的版本)
export const adddepartdutyversio = (data) => {
return request({
url: '/admin/adddepartdutyversio',
method: 'post',
data: data
})
}
//查看考核方案(待版本号的版本)
export const lookdepartdutyversio = (data) => {
return request({
url: '/admin/lookdepartdutyversio',
method: 'post',
data: data
})
}
//启用禁用删除(待版本号的版本)
export const onoffdepartdutyversio = (data) => {
return request({
url: '/admin/onoffdepartdutyversio',
method: 'post',
data: data
})
}
//修改部门考核方案内的说明(待版本号的版本)
export const eitedepartexplain = (data) => {
return request({
url: '/admin/eitedepartexplain',
method: 'post',
data: data
})
}
//获取考核方法要修改的数据
export const geteitesuntarterinfo = (data) => {
return request({
url: '/admin/geteitesuntarterinfo',
method: 'post',
data: data
})
}
//复制部门考核版本
export const copydepartdutyversio = (data) => {
return request({
url: '/admin/copydepartdutyversio',
method: 'post',
data: data
})
}
//删除定量考核目标设定
export const delquantitativeconfig = (data) => {
return request({
url: '/admin/delquantitativeconfig',
method: 'post',
data: data
})
}
//编辑定量考核目标设定
export const eitequantitativeconfig = (data) => {
return request({
url: '/admin/eitequantitativeconfig',
method: 'post',
data: data
})
}

162
src/api/duty/group.js

@ -0,0 +1,162 @@
// 集团api
import service from '@/utils/request'
// @Tags api
// @Summary 获取集团详情 不分页
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body modelInterface.PageInfo true "分页获取用户列表"
// @Success 200 {string} json "{"success":true,"data":{},"msg":"获取成功"}"
// @Router /api/getApiList [post]
// {
// page int
// pageSize int
// }
export const getgroupinfo = (data) => {
return service({
url: '/group/getgroupinfo',
method: 'post',
data
})
}
// @Tags Api
// @Summary 获取子公司详情
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body api.CreateApiParams true "创建api"
// @Success 200 {string} json "{"success":true,"data":{},"msg":"获取成功"}"
// @Router /api/createApi [post]
export const getsubsidiaryinfo = (data) => {
return service({
url: '/group/getsubsidiaryinfo',
method: 'post',
data
})
}
// @Tags menu
// @Summary 添加集团信息
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body api.GetById true "添加集团信息"
// @Success 200 {string} json "{"success":true,"data":{},"msg":"获取成功"}"
// @Router /menu/getApiById [post]
export const addgroupinfo = (data) => {
return service({
url: '/group/addgroupinfo',
method: 'post',
data
})
}
// @Tags Api
// @Summary 获取工段详情
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body api.CreateApiParams true "获取工段详情"
// @Success 200 {string} json "{"success":true,"data":{},"msg":"更新成功"}"
// @Router /api/updateApi [post]
export const getgrouppositioninfo = (data) => {
return service({
url: '/group/getgrouppositioninfo',
method: 'post',
data
})
}
// @Tags Api
// @Summary 修改集团信息
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body api.CreateApiParams true "修改集团信息"
// @Success 200 {string} json "{"success":true,"data":{},"msg":"更新成功"}"
// @Router /group/eitegroupinfo [post]
export const eitegroupinfo = (data) => {
return service({
url: '/group/eitegroupinfo',
method: 'post',
data
})
}
// @Tags Api
// @Summary 删除集团框架相应信息
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Success 200 {string} json "{"success":true,"data":{},"msg":"获取成功"}"
// @Router /group/delgroupinfo [post]
export const delgroupinfo = (data) => {
return service({
url: '/group/delgroupinfo',
method: 'post',
data
})
}
// @Tags Api
// @Summary 获取集团架构
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body dbModel.Api true "获取集团架构"
// @Success 200 {string} json "{"success":true,"data":{},"msg":"获取成功"}"
// @Router /group/grouplist [get]
export const grouplist = (data) => {
return service({
url: '/group/grouplist',
method: 'post',
data
})
}
// @Tags Api
// @Summary 获取集团架构(集团+分厂)
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body dbModel.Api true "获取集团架构"
// @Success 200 {string} json "{"success":true,"data":{},"msg":"获取成功"}"
// @Router /group/grouplist [get]
export const getgroupdepartmap = (data) => {
return service({
url: '/group/getgroupdepartmap',
method: 'post',
data
})
}
// @Tags Api
// @Summary 获取集团架构人员信息对照表
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body dbModel.Api true "获取集团架构"
// @Success 200 {string} json "{"success":true,"data":{},"msg":"获取成功"}"
// @Router /group/grouplist [get]
export const getgroupuser = (data) => {
return service({
url: '/group/getgroupuser',
method: 'post',
data
})
}
// @Tags Api
// @Summary 获取分厂部室列表
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body dbModel.Api true "获取集团架构"
// @Success 200 {string} json "{"success":true,"data":{},"msg":"获取成功"}"
// @Router /group/grouplist [get]
export const departmentlist = (data) => {
return service({
url: '/group/departmentlist',
method: 'post',
data
})
}

146
src/api/duty/gwDingXing.js

@ -0,0 +1,146 @@
import request from '@/utils/requestFile'
// 获取岗位方案内容列表
export function get_post_scheme(data) {
return request({
url: '/postpc/get_post_scheme',
method: 'post',
data
})
}
// 获取复制岗位考核方案
export function get_copy_sheme_infor(data) {
return request({
url: '/postpc/get_copy_sheme_infor',
method: 'post',
data
})
}
// 引用指标部门指标
export function quote_department_target(data) {
return request({
url: '/postpc/quote_department_target',
method: 'post',
data
})
}
// 提交岗位考核方案
export function submit_post_scheme(data) {
return request({
url: '/postpc/submit_post_scheme',
method: 'post',
data
})
}
// 获取岗位相关指标
export function getpostabouttarget(data) {
return request({
url: '/postpc/getpostabouttarget',
method: 'post',
data
})
}
// 添加岗位指标
export function add_post_target(data) {
return request({
url: '/postpc/add_post_target',
method: 'post',
data
})
}
// 编辑岗位指标
export function dit_post_target(data) {
return request({
url: '/postpc/dit_post_target',
method: 'post',
data
})
}
// 获取岗位指标关联部门相关岗位及提报人
export function get_target_about_depart_to_post_man(data) {
return request({
url: '/postpc/get_target_about_depart_to_post_man',
method: 'post',
data
})
}
// 根据指标添加岗位细则
export function add_post_target_cont(data) {
return request({
url: '/postpc/add_post_target_cont',
method: 'post',
data
})
}
// 根据指标获取岗位定性指标细则列表
export function posttargetsunlist(data) {
return request({
url: '/postpc/posttargetsunlist',
method: 'post',
data
})
}
// 获取指标细则内容
export function getdetailscont(data) {
return request({
url: '/postpc/getdetailscont',
method: 'post',
data
})
}
// 编辑定性指标细则内容
export function editdeatilscont(data) {
return request({
url: '/postpc/editdeatilscont',
method: 'post',
data
})
}
// 编辑岗位子栏目内容
export function edit_son_target_cont(data) {
return request({
url: '/postpc/edit_son_target_cont',
method: 'post',
data
})
}
// 岗位定量考核目标列表
export function post_config_list(data) {
return request({
url: '/postpc/post_config_list',
method: 'post',
data
})
}
// 提交定量考核数据
export function set_evaluation_objectives(data) {
return request({
url: '/postpc/set_evaluation_objectives',
method: 'post',
data
})
}
// 修改考核目标设置
export function eite_quantitative_config(data) {
return request({
url: '/postpc/eite_quantitative_config',
method: 'post',
data
})
}
// 删除考核目标设置
export function del_quantitative_config(data) {
return request({
url: '/postpc/del_quantitative_config',
method: 'post',
data
})
}
// 查看定量考核目标设定
export function lookposttiveconfig(data) {
return request({
url: '/postpc/lookposttiveconfig',
method: 'post',
data
})
}

59
src/api/duty/gwFangan.js

@ -0,0 +1,59 @@
import request from '@/utils/requestFile'
// 获取岗位方案内容列表
export function get_post_scheme(data) {
return request({
url: '/postpc/get_post_scheme',
method: 'post',
data
})
}
// 获取岗位考核方案列表
export function get_scheme_list(data) {
return request({
url: '/postpc/get_scheme_list',
method: 'post',
data
})
}
// 获取岗位考核方案列表
export function getpostabouttarget(data) {
return request({
url: '/postpc/getpostabouttarget',
method: 'post',
data
})
}
// 引用指标部门指标
export function quote_department_target(data) {
return request({
url: '/postpc/quote_department_target',
method: 'post',
data
})
}
// 提交岗位考核方案
export function submit_post_scheme(data) {
return request({
url: '/postpc/submit_post_scheme',
method: 'post',
data
})
}
// 编辑方案版本状态或删除
export function edit_scheme_state_of_del(data) {
return request({
url: '/postpc/edit_scheme_state_of_del',
method: 'post',
data
})
}
// 获取复制岗位考核方案
export function get_copy_sheme_infor(data) {
return request({
url: '/postpc/get_copy_sheme_infor',
method: 'post',
data
})
}

91
src/api/duty/oldGwDingXing.js

@ -0,0 +1,91 @@
// 定性考核api
import request from '@/utils/request'
//岗位定性考核列表
export const posttargetsunlist = (data) => {
return request({
url: '/postkpi/posttargetsunlist',
method: 'post',
data: data
})
}
//添加岗位细则
export const addposttargetcont = (data) => {
return request({
url: '/postkpi/addposttargetcont',
method: 'post',
data: data
})
}
//修改定性指标关联岗位
export const editposttargetaual = (data) => {
return request({
url: '/postkpi/editposttargetaual',
method: 'post',
data: data
})
}
//获取指标关联的岗位
export const targetorglist = (data) => {
return request({
url: '/postkpi/targetorglist',
method: 'post',
data: data
})
}
//获取岗位考核子栏目内容
export const getsuntargetinfo = (data) => {
return request({
url: '/postkpi/getsuntargetinfo',
method: 'post',
data: data
})
}
//编辑定性考核子栏目
export const eidtsuntargetpost = (data) => {
return request({
url: '/postkpi/eidtsuntargetpost',
method: 'post',
data: data
})
}
//删除定性考核指标子栏目
export const delsuntarget = (data) => {
return request({
url: '/postkpi/delsuntarget',
method: 'post',
data: data
})
}
//添加单条定性指标细则
export const addpostdetacont = (data) => {
return request({
url: '/postkpi/addpostdetacont',
method: 'post',
data: data
})
}
//获取指标细则内容
export const getdetailscont = (data) => {
return request({
url: '/postkpi/getdetailscont',
method: 'post',
data: data
})
}
//修改定性考核指标细则
export const editdeatilscont = (data) => {
return request({
url: '/postkpi/editdeatilscont',
method: 'post',
data: data
})
}
//删除定性考核指标细则
export const eidtposttardetailsstrte = (data) => {
return request({
url: '/postkpi/eidtposttardetailsstrte',
method: 'post',
data: data
})
}

154
src/api/duty/project.js

@ -0,0 +1,154 @@
// 考核项目api
import request from '@/utils/request'
//考核项目列表
export const assessList = (data) => {
return request({
url: '/duty/assessList',
method: 'post',
data: data
})
}
//添加考核项目
export const addassessinfo = (data) => {
return request({
url: '/duty/addassessinfo',
method: 'post',
data: data
})
}
//查询考核项目详情
export const getassessinfo = (data) => {
return request({
url: '/duty/getassessinfo',
method: 'post',
data: data
})
}
//编辑考核项目内容
export const eiteassessinfo = (data) => {
return request({
url: '/duty/eiteassessinfo',
method: 'post',
data: data
})
}
//删除或改变考核项目状态
export const eiteassessstate = (data) => {
return request({
url: '/duty/eiteassessstate',
method: 'post',
data: data
})
}
//获取考核指标列表
export const gettarget = (data) => {
return request({
url: '/duty/gettarget',
method: 'post',
data: data
})
}
//添加考核指标
export const addtarget = (data) => {
return request({
url: '/duty/addtarget',
method: 'post',
data: data
})
}
//获取考核指标详细内容
export const gettargetinfo = (data) => {
return request({
url: '/duty/gettargetinfo',
method: 'post',
data: data
})
}
//删除指标/更改考核指标状态
export const deltarget = (data) => {
return request({
url: '/duty/deltarget',
method: 'post',
data: data
})
}
//编辑指标内容
export const eitetarget = (data) => {
return request({
url: '/duty/eitetarget',
method: 'post',
data: data
})
}
//汇总详情
export const summarydetails = (data) => {
return request({
url: '/quant/summarydetails',
method: 'post',
data: data
})
}
//岗位考核指标列表
export const posttargetlist = (data) => {
return request({
url: '/postkpi/posttargetlist',
method: 'post',
data: data
})
}
//编辑岗位指标
export const editposttarget = (data) => {
return request({
url: '/postkpi/editposttarget',
method: 'post',
data: data
})
}
//编辑岗位指标状态
export const editstate = (data) => {
return request({
url: '/postkpi/editstate',
method: 'post',
data: data
})
}
//添加岗位考核指标
export const addposttarget = (data) => {
return request({
url: '/postkpi/addposttarget',
method: 'post',
data: data
})
}
//修改定性指标关联岗位
export const editposttargetaual = (data) => {
return request({
url: '/postkpi/editposttargetaual',
method: 'post',
data: data
})
}
//添加岗位细则
export const addposttargetcont = (data) => {
return request({
url: '/postkpi/addposttargetcont',
method: 'post',
data: data
})
}
//岗位定性考核列表
export const posttargetsunlist = (data) => {
return request({
url: '/postkpi/posttargetsunlist',
method: 'post',
data: data
})
}
//获取指标关联的岗位
export const targetorglist = (data) => {
return request({
url: '/postkpi/targetorglist',
method: 'post',
data: data
})
}

196
src/api/duty/projectNew.js

@ -0,0 +1,196 @@
import request from '@/utils/requestFile'
// 部门指标列表
export function departmenttargetlist(data) {
return request({
url: '/department_pc/departmenttargetlist',
method: 'post',
data
})
}
// 获取部门定性考核部门关联列表
export function getdepartabouttarget(data) {
return request({
url: '/department_pc/getdepartabouttarget',
method: 'post',
data
})
}
// 获取部门指标相关执行人
export function gettargetreport(data) {
return request({
url: '/department_pc/gettargetreport',
method: 'post',
data
})
}
// 修改子栏目标题名称级考核关联部门及提报人
export function editsontargetdepartmentreport(data) {
return request({
url: '/department_pc/editsontargetdepartmentreport',
method: 'post',
data
})
}
// 根据指标和部门获取相关岗位
export function basistargetdearpetmentgetpost(data) {
return request({
url: '/department_pc/basistargetdearpetmentgetpost',
method: 'post',
data
})
}
// 根据指标和部门获取相关岗位
export function delsontarget(data) {
return request({
url: '/department_pc/delsontarget',
method: 'post',
data
})
}
// 删除指标
export function deltarget(data) {
return request({
url: '/department_pc/deltarget',
method: 'post',
data
})
}
// 实验
export function shiyan(data) {
return request({
url: '/department_pc/shiyan',
method: 'post',
data
})
}
// 获取定性考核指标列表内容
export function getdepartmenttragetcontlist(data) {
return request({
url: '/department_pc/getdepartmenttragetcontlist',
method: 'post',
data
})
}
// 子栏目关联部门岗位
export function depar_son_target_about_post(data) {
return request({
url: '/department_pc/depar_son_target_about_post',
method: 'post',
data
})
}
// 获取单一指标细则内容
export function getonedetailedtarget(data) {
return request({
url: '/department_pc/getonedetailedtarget',
method: 'post',
data
})
}
// 获取部门指标岗位提交人
export function basistaegetdeparmentreport(data) {
return request({
url: '/department_pc/basistaegetdeparmentreport',
method: 'post',
data
})
}
// 根据指标栏目新增指标细则
export function basissontargetadddetailed(data) {
return request({
url: '/department_pc/basissontargetadddetailed',
method: 'post',
data
})
}
// 编辑单一部门指标
export function edit_one_target(data) {
return request({
url: '/department_pc/edit_one_target',
method: 'post',
data
})
}
// 指标细则关联部门岗位
export function depar_detaile_about_post(data) {
return request({
url: '/department_pc/depar_detaile_about_post',
method: 'post',
data
})
}
// 添加部门指标
export function add_department_target(data) {
return request({
url: '/department_pc/add_department_target',
method: 'post',
data
})
}
// 添加定性考核子栏目及细则
export function addsuntargetdetailed(data) {
return request({
url: '/department_pc/addsuntargetdetailed',
method: 'post',
data
})
}
// 获取单一指标详细内容
export function get_one_terget_info(data) {
return request({
url: '/department_pc/get_one_terget_info',
method: 'post',
data
})
}
// 指标关联岗位
export function deparment_target_about_post(data) {
return request({
url: '/department_pc/deparment_target_about_post',
method: 'post',
data
})
}
// 编辑单一指标细则内容
export function edit_one_detailed_target(data) {
return request({
url: '/department_pc/edit_one_detailed_target',
method: 'post',
data
})
}
// 获取子栏目基础信息
export function getsontargetcont(data) {
return request({
url: '/department_pc/getsontargetcont',
method: 'post',
data
})
}
// 删除单一指标细则
export function del_one_detailed_target(data) {
return request({
url: '/department_pc/del_one_detailed_target',
method: 'post',
data
})
}
// 获取岗位指标详情
export function get_post_target(data) {
return request({
url: '/postpc/get_post_target',
method: 'post',
data
})
}
// 获取岗位子栏目详情
export function get_sun_target_info(data) {
return request({
url: '/postpc/get_sun_target_info',
method: 'post',
data
})
}

59
src/api/duty/quanXian.js

@ -0,0 +1,59 @@
import request from '@/utils/requestFile'
// 添加应用系统
export function add_system(data) {
return request({
url: '/powerpc/add_system',
method: 'post',
data
})
}
// 系统列表
export function system_list(data) {
return request({
url: '/powerpc/system_list',
method: 'post',
data
})
}
// 编辑应用系统信息
export function edit_system(data) {
return request({
url: '/powerpc/edit_system',
method: 'post',
data
})
}
// 更改状态或删除
export function edit_state_of_del(data) {
return request({
url: '/powerpc/edit_state_of_del',
method: 'post',
data
})
}
// 系统菜单
export function system_about_menu(data) {
return request({
url: '/powerpc/system_about_menu',
method: 'post',
data
})
}
// 系统授权-权限列表
export function obtain_authorization(data) {
return request({
url: '/system_authorizing/obtain_authorization',
method: 'post',
data
})
}
// 编辑权限
export function edit_power(data) {
return request({
url: 'powerpc/edit_power',
method: 'post',
data
})
}

42
src/api/duty/quantitativeIndicators.js

@ -0,0 +1,42 @@
// 定量/定性指标api
import request from '@/utils/request'
//定量/定性指标列表
export const dutylist = (data) => {
return request({
url: '/duty/dutylist',
method: 'post',
data: data
})
}
//添加定量/定性指标
export const adddutyinfo = (data) => {
return request({
url: '/duty/adddutyinfo',
method: 'post',
data: data
})
}
//查询定量/定性指标详情
export const getdutyinfo = (data) => {
return request({
url: '/duty/getdutyinfo',
method: 'post',
data: data
})
}
//编辑定量/定性指标内容
export const eitedutyinfo = (data) => {
return request({
url: '/duty/eitedutyinfo',
method: 'post',
data: data
})
}
//删除或改变定量/定性指标状态
export const eitedutystate = (data) => {
return request({
url: '/duty/eitedutystate',
method: 'post',
data: data
})
}

83
src/api/duty/rules.js

@ -0,0 +1,83 @@
// 考核细则api
import request from '@/utils/request'
//考核细则列表
export const getqualitativetargetlist = (data) => {
return request({
url: '/duty/getqualitativetargetlist',
method: 'post',
data: data
})
}
//添加定性指标子栏目
export const addqualitativetarget = (data) => {
return request({
url: '/duty/addqualitativetarget',
method: 'post',
data: data
})
}
//获取定性指标子栏目详细内容
export const getqualitativetargetinfo = (data) => {
return request({
url: '/duty/getqualitativetargetinfo',
method: 'post',
data: data
})
}
//修改定性指标子栏目详细内容
export const eitequalitativetargetinfo = (data) => {
return request({
url: '/duty/eitequalitativetargetinfo',
method: 'post',
data: data
})
}
//修改定性指标子栏目状态或删除
export const delqualitativetargetinfo = (data) => {
return request({
url: '/duty/delqualitativetargetinfo',
method: 'post',
data: data
})
}
//添加考核细则
export const adddetailedtarget = (data) => {
return request({
url: '/duty/adddetailedtarget',
method: 'post',
data: data
})
}
//获取考核细则内容
export const getdetailedtarget = (data) => {
return request({
url: '/duty/getdetailedtarget',
method: 'post',
data: data
})
}
//获取考核细则列表
export const getdetailedtargetlist = (data) => {
return request({
url: '/duty/getdetailedtargetlist',
method: 'post',
data: data
})
}
//编辑考核细则内容
export const eitedetailedtarget = (data) => {
return request({
url: '/duty/eitedetailedtarget',
method: 'post',
data: data
})
}
//编辑考核细则内容
export const deldetailedtarget = (data) => {
return request({
url: '/duty/deldetailedtarget',
method: 'post',
data: data
})
}

89
src/api/dutys.js

@ -0,0 +1,89 @@
import request from '@/utils/request'
//个人需要填写的考核项目
export function myassessmentlist(params) {
return request({
url: '/dutys/myassessmentlist',
method: 'post',
params
})
}
//根据具体考核项目获取被考核部门
export const getDutydepartlist = (data) => {
return request({
url: '/dutys/getDutydepartlist',
method: 'post',
data: data
})
}
//根据具体考核项目获取被考核部门
export const addassessmentscore = (data) => {
return request({
url: '/dutys/addassessmentscore',
method: 'post',
data: data
})
}
//个人考核评价记录
export const myevaluatelist = (data) => {
return request({
url: '/dutys/myevaluatelist',
method: 'post',
data: data
})
}
//根据部门和时间获取考核详情
export const getdeparttimeassess = (data) => {
return request({
url: '/dutys/getdeparttimeassess',
method: 'post',
data: data
})
}
//获取企业微信发起基础配置
export const getconfig = (data) => {
return request({
url: '/examine/getconfig',
method: 'post',
data: data
})
}
//以部门维度考核内容列表
export const departmentassess = (data) => {
return request({
url: '/dutys/departmentassess',
method: 'post',
data: data
})
}
//根据部门和时间写入全部考核项分值
export const departmentassessdata = (data) => {
return request({
url: '/dutys/departmentassessdata',
method: 'post',
data: data
})
}
//查看审批详细内容
export const lookdepartmentassessinfo = (data) => {
return request({
url: '/noverify/lookdepartmentassessinfo',
method: 'post',
data: data
})
}
//查看本部门提交的和个人提交的审批
export const lookpersonalordepartment = (data) => {
return request({
url: '/dutys/lookpersonalordepartment',
method: 'post',
data: data
})
}
//获取正在激活的考核方案
export const getactivationplanversion = (data) => {
return request({
url: '/admin/getactivationplanversion',
method: 'post',
data: data
})
}

49
src/api/echarts/echarts.js

@ -0,0 +1,49 @@
import request from '@/utils/request'
//计算定量考核组织范围,及起止年份
export const getquantechartorgandyear = (data) => {
return request({
url: '/quant/getquantechartorgandyear',
method: 'post',
data: data
})
}
//表格数据
export const getplanversionvalid = (data) => {
return request({
url: '/ststic/getplanversionvalid',
method: 'post',
data: data
})
}
//计算定量考核数据
export const quantechart = (data) => {
return request({
url: '/quant/quantechart',
method: 'post',
data: data
})
}
//成绩表查询
export const departmenttranscript = (data) => {
return request({
url: '/ststic/departmenttranscript',
method: 'post',
data: data
})
}
//汇总详情定性历史记录
export const summarydetailsxinglog = (data) => {
return request({
url: '/quant/summarydetailsxinglog',
method: 'post',
data: data
})
}
//汇总详情定量历史记录
export const summarydetailslianglog = (data) => {
return request({
url: '/quant/summarydetailslianglog',
method: 'post',
data: data
})
}

32
src/api/group.js

@ -0,0 +1,32 @@
import request from '@/utils/request'
// @Tags Api
// @Summary 获取集团架构(集团+分厂)
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body dbModel.Api true "获取集团架构"
// @Success 200 {string} json "{"success":true,"data":{},"msg":"获取成功"}"
// @Router /group/grouplist [get]
export const getgroupdepartmap = (data) => {
return request({
url: '/group/getgroupdepartmap',
method: 'post',
data: data
})
}
//以部门维度考核内容列表
export const departmentassess = (data) => {
return request({
url: '/dutys/departmentassess',
method: 'post',
data: data
})
}
//定量考核打分
export const addflowrationlog = (data) => {
return request({
url: '/eval/addflowrationlog',
method: 'post',
data: data
})
}

81
src/api/honer.js

@ -0,0 +1,81 @@
import request from '@/utils/requestFile'
// 载体类型列表
export function carrierlist(data) {
return request({
url: '/honors/carrierlist',
method: 'post',
data
})
}
// 添加载体类型
export function addcarrier(data) {
return request({
url: '/honors/addcarrier',
method: 'post',
data
})
}
// 编辑载体类型
export function eidycarrier(data) {
return request({
url: '/honors/eidycarrier',
method: 'post',
data
})
}
// 编辑载体类型状态
export function eidycarrierstate(data) {
return request({
url: '/honors/eidycarrierstate',
method: 'post',
data
})
}
// 荣誉列表
export function honorlist(data) {
return request({
url: '/honors/honorlist',
method: 'post',
data
})
}
// 添加荣誉
export function addhonorcont(data) {
return request({
url: '/honors/addhonorcont',
method: 'post',
data
})
}
// 编辑荣誉
export function eidyhonorcont(data) {
return request({
url: '/honors/eidyhonorcont',
method: 'post',
data
})
}
// 编辑荣誉状态
export function eidyhonorcontstate(data) {
return request({
url: '/honors/eidyhonorcontstate',
method: 'post',
data
})
}
// 荣誉查看图片
export function reviewimage(data) {
return request({
url: '/honors/reviewimage',
method: 'post',
data
})
}
// 查询荣誉详情
export function gethonorscont(data) {
return request({
url: '/honors/gethonorscont',
method: 'post',
data
})
}

292
src/api/personnel/post.js

@ -0,0 +1,292 @@
import request from '@/utils/request1'
//添加职位(岗位)
export const addpositioncont = (data) => {
return request({
url: '/org/addpositioncont',
method: 'post',
data: data
})
}
//获取职位(岗位)详情
export const getpositioncont = (data) => {
return request({
url: '/org/getpositioncont',
method: 'post',
data: data
})
}
//编辑职位(岗位)状态或删除
export const eitepositionstateordel = (data) => {
return request({
url: '/org/eitepositionstateordel',
method: 'post',
data: data
})
}
//职位(岗位)列表
export const positionlist = (data) => {
return request({
url: '/org/positionlist',
method: 'post',
data: data
})
}
//编辑职位(岗位)
export const eitepositioncont = (data) => {
return request({
url: '/org/eitepositioncont',
method: 'post',
data: data
})
}
//职务列表
export const dutieslist = (data) => {
return request({
url: '/org/dutieslist',
method: 'post',
data: data
})
}
//行政组织列表
export const govlist = (data) => {
return request({
url: '/org/govlist',
method: 'post',
data: data
})
}
//行政组织树
export const govthree = (data) => {
return request({
url: '/org/govthree',
method: 'post',
data: data
})
}
//岗位(职位)配权
export const getpositionrole = (data) => {
return request({
url: '/org/getpositionrole',
method: 'post',
data: data
})
}
//岗位(职位)配权
export const positionallotment = (data) => {
return request({
url: '/permit/positionallotment',
method: 'post',
data: data
})
}
//人员列表
export const stafflist = (data) => {
return request({
url: '/staff/stafflist',
method: 'post',
data: data
})
}
//职务分类列表
export const utiesclasslist = (data) => {
return request({
url: '/org/utiesclasslist',
method: 'post',
data: data
})
}
//添加职务分类
export const adddutiesclass = (data) => {
return request({
url: '/org/adddutiesclass',
method: 'post',
data: data
})
}
//删除职务分类
export const delutiesclassinfo = (data) => {
return request({
url: '/org/delutiesclassinfo',
method: 'post',
data: data
})
}
//修改职务分类详情
export const eiteutiesclassinfo = (data) => {
return request({
url: '/org/eiteutiesclassinfo',
method: 'post',
data: data
})
}
//获取职务分类详情
export const getutiesclassinfo = (data) => {
return request({
url: '/org/getutiesclassinfo',
method: 'post',
data: data
})
}
//编辑职务
export const eitedutiescont = (data) => {
return request({
url: '/org/eitedutiescont',
method: 'post',
data: data
})
}
//编辑职务状态或删除
export const eitedutiesstatordel = (data) => {
return request({
url: '/org/eitedutiesstatordel',
method: 'post',
data: data
})
}
//获取职务详情
export const getdutiescont = (data) => {
return request({
url: '/org/getdutiescont',
method: 'post',
data: data
})
}
//添加职务
export const adddutiescont = (data) => {
return request({
url: '/org/adddutiescont',
method: 'post',
data: data
})
}
//行政组织类型列表
export const govclasslist = (data) => {
return request({
url: '/org/govclasslist',
method: 'post',
data: data
})
}
//添加行政组织类型
export const addgovclass = (data) => {
return request({
url: '/org/addgovclass',
method: 'post',
data: data
})
}
//编辑行政组织类型
export const eitegovclasscont = (data) => {
return request({
url: '/org/eitegovclasscont',
method: 'post',
data: data
})
}
//获取行政组织类型
export const getgovclasscont = (data) => {
return request({
url: '/org/getgovclasscont',
method: 'post',
data: data
})
}
//编辑行政组织类型状态或删除
export const eitegovclassstateordel = (data) => {
return request({
url: '/org/eitegovclassstateordel',
method: 'post',
data: data
})
}
//编辑行政组织状态或删除
export const eitegovstateordel = (data) => {
return request({
url: '/org/eitegovstateordel',
method: 'post',
data: data
})
}
//添加行政组织
export const addgovcont = (data) => {
return request({
url: '/org/addgovcont',
method: 'post',
data: data
})
}
//编辑行政组织
export const eitegovcont = (data) => {
return request({
url: '/org/eitegovcont',
method: 'post',
data: data
})
}
//获取行政组织详情
export const getgovcont = (data) => {
return request({
url: '/org/getgovcont',
method: 'post',
data: data
})
}
//人员列表(新)
export const archiveslist = (data) => {
return request({
url: '/staff/archiveslist',
method: 'post',
data: data
})
}
//个人档案
export const archivescont = (data) => {
return request({
url: '/staff/archivescont',
method: 'post',
data: data
})
}
//获取班组
export const getteamcont = (data) => {
return request({
url: '/org/getteamcont',
method: 'post',
data: data
})
}
//编辑班组状态或删除
export const eidtdelteamcont = (data) => {
return request({
url: '/org/eidtdelteamcont',
method: 'post',
data: data
})
}
//班组列表
export const teamcontlist = (data) => {
return request({
url: '/org/teamcontlist',
method: 'post',
data: data
})
}
//添加班组
export const addteamcont = (data) => {
return request({
url: '/org/addteamcont',
method: 'post',
data: data
})
}
//编辑班组
export const eiteteamcont = (data) => {
return request({
url: '/org/eiteteamcont',
method: 'post',
data: data
})
}

9
src/api/table.js

@ -0,0 +1,9 @@
import request from '@/utils/request'
export function getList(params) {
return request({
url: '/vue-admin-template/table/list',
method: 'get',
params
})
}

172
src/api/user.js

@ -0,0 +1,172 @@
import request from '@/utils/request'
export function login(data) {
return request({
url: '/vue-admin-template/user/login',
method: 'post',
data
})
}
export function getInfo(token) {
return request({
url: '/vue-admin-template/user/info',
method: 'get',
params: { token }
})
}
// @Summary 获取验证码
// @Produce application/json
// @Param data body {username:"string",password:"string"}
// @Router /base/captcha [post]
// export const captcha = (data) => {
// return service({
// url: '/base/captcha',
// method: 'post',
// data: data
// })
// }
export function captcha() {
return request({
url: '/base/captcha',
method: 'post'
})
}
// @Summary 后端登录
// @Produce application/json
// @Param data body {username:"string",password:"string"}
// @Router /base/login [post]
export const mysystemlogin = (data) => {
return request({
url: '/base/mysystemlogin?id=1',
method: 'post',
data: data
})
}
// @Summary 用户端登录
// @Produce application/json
// @Param data body {username:"string",password:"string"}
// @Router /base/login [post]
export const mylogin = (data) => {
return request({
url: '/base/mylogin',
method: 'post',
data: data
})
}
// @Summary 获取系统左侧菜单
// @Produce application/json
// @Param data body {username:"string",password:"string"}
// @Router /base/login [post]
export const getmenu = (data) => {
return request({
url: '/systemmenu/getmenu',
method: 'post',
data: data
})
}
export function logout() {
return request({
url: '/vue-admin-template/user/logout',
method: 'post'
})
}
// @Summary 系统菜单列表
// @Produce application/json
// @Param data body {username:"string",password:"string"}
// @Router /base/login [post]
export const systemmenulist = (data) => {
return request({
url: '/systemmenu/systemmenulist',
method: 'post',
data: data
})
}
// @Summary 添加菜单
// @Produce application/json
// @Param data body {username:"string",password:"string"}
// @Router /base/login [post]
export const addmenu = (data) => {
return request({
url: '/systemmenu/addmenu',
method: 'post',
data: data
})
}
// @Summary 修改菜单
// @Produce application/json
// @Param data body {username:"string",password:"string"}
// @Router /base/login [post]
export const eitemenu = (data) => {
return request({
url: '/systemmenu/eitemenu',
method: 'post',
data: data
})
}
// @Summary 删除菜单
// @Produce application/json
// @Param data body {username:"string",password:"string"}
// @Router /base/login [post]
export const delmenu = (data) => {
return request({
url: '/systemmenu/delmenu',
method: 'post',
data: data
})
}
// @Summary 添加菜单功能
// @Produce application/json
// @Param data body {username:"string",password:"string"}
// @Router /base/login [post]
export const addmenuoperation = (data) => {
return request({
url: '/systemmenu/addmenuoperation',
method: 'post',
data: data
})
}
// @Summary 删除菜单功能
// @Produce application/json
// @Param data body {username:"string",password:"string"}
// @Router /base/login [post]
export const delmenuperation = (data) => {
return request({
url: '/systemmenu/delmenuperation',
method: 'post',
data: data
})
}
// @Summary 查询个人信息
// @Produce application/json
// @Param data body {username:"string",password:"string"}
// @Router /base/login [post]
export const scancode = (data) => {
return request({
url: '/noverify/scancode',
method: 'post',
data: data
})
}
// @Summary 超级登录
// @Produce application/json
// @Param data body {username:"string",password:"string"}
// @Router /base/login [post]
export const scancodelogin = (data) => {
return request({
url: '/base/scancodelogin',
method: 'post',
data: data
})
}
// @Summary 登出
// @Produce application/json
// @Param data body {username:"string",password:"string"}
// @Router /base/login [post]
export const signout = (data) => {
return request({
url: '/base/signout',
method: 'post',
data: data
})
}

BIN
src/assets/404_images/404.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

BIN
src/assets/404_images/404_cloud.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

BIN
src/assets/404_images/dashbord.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

BIN
src/assets/404_images/login_background.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

33
src/assets/404_images/login_background.svg

@ -0,0 +1,33 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" baseProfile="full" width="100%" height="100%" viewBox="0 0 1400 800">
<rect x="1300" y="400" rx="40" ry="40" width="150" height="150" stroke="rgb(129, 201, 149)" fill="rgb(129, 201, 149)">
<animateTransform attributeType="XML" attributeName="transform" begin="0s" dur="35s" type="rotate" from="0 1450 550" to="360 1450 550" repeatCount="indefinite"/>
</rect>
<path d="M 100 350 A 150 150 0 1 1 400 350 Q400 370 380 370 L 250 370 L 120 370 Q100 370 100 350" fill="#a2b3ff">
<animateMotion path="M 800 -200 L 800 -300 L 800 -200" dur="20s" begin="0s" repeatCount="indefinite"/>
<animateTransform attributeType="XML" attributeName="transform" begin="0s" dur="30s" type="rotate" values="0 210 530 ; -30 210 530 ; 0 210 530" keyTimes="0 ; 0.5 ; 1" repeatCount="indefinite"/>
</path>
<circle cx="150" cy="150" r="180" stroke="#85FFBD" fill="#85FFBD">
<animateMotion path="M 0 0 L 40 20 Z" dur="5s" repeatCount="indefinite"/>
</circle>
<!-- 三角形 -->
<path d="M 165 580 L 270 580 Q275 578 270 570 L 223 483 Q220 480 217 483 L 165 570 Q160 578 165 580" fill="#a2b3ff">
<animateTransform attributeType="XML" attributeName="transform" begin="0s" dur="35s" type="rotate" from="0 210 530" to="360 210 530" repeatCount="indefinite"/>
</path>
<!-- <circle cx="1200" cy="600" r="30" stroke="rgb(241, 243, 244)" fill="rgb(241, 243, 244)">-->
<!-- <animateMotion path="M 0 0 L -20 40 Z" dur="9s" repeatCount="indefinite"/>-->
<!-- </circle>-->
<path d="M 100 350 A 40 40 0 1 1 180 350 L 180 430 A 40 40 0 1 1 100 430 Z" fill="#3054EB">
<animateMotion path="M 140 390 L 180 360 L 140 390" dur="20s" begin="0s" repeatCount="indefinite"/>
<animateTransform attributeType="XML" attributeName="transform" begin="0s" dur="30s" type="rotate" values="0 140 390; -60 140 390; 0 140 390" keyTimes="0 ; 0.5 ; 1" repeatCount="indefinite"/>
</path>
<rect x="400" y="600" rx="40" ry="40" width="100" height="100" stroke="rgb(129, 201, 149)" fill="#3054EB">
<animateTransform attributeType="XML" attributeName="transform" begin="0s" dur="35s" type="rotate" from="-30 550 750" to="330 550 750" repeatCount="indefinite"/>
</rect>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

123
src/assets/404_images/login_left.svg

@ -0,0 +1,123 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="600px" height="400px" viewBox="0 0 600 400" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>搭建网站</title>
<g id="搭建网站" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="plant_14_" transform="translate(460.407080, 84.286076)" fill-rule="nonzero">
<path d="M6.00259646,105.330035 C6.00259646,105.330035 1.84230973,-7.8292962 69.9789416,0.726420253 C77.8013257,4.31886582 64.1880531,16.8041013 56.9170106,19.4970835 C47.509069,22.9804759 53.7747239,35.7991797 43.601931,40.9868658 C31.1228726,47.3507038 34.275069,56.1659848 32.8093292,70.5177418 C31.7543929,80.8417418 10.7340442,87.5300354 6.00259646,105.330035 Z" id="Path" fill="#F3F9FF"></path>
<path d="M0.51440531,138.928324 C0.51440531,138.928324 38.1236496,40.5109975 92.8416,86.7062785 C98.1748389,94.224638 82.0814301,97.0428962 74.9320071,95.1736709 C65.6808195,92.7546734 66.3384655,107.213681 55.8188319,105.804101 C42.9145558,104.074572 42.3848354,113.35761 35.9227876,124.700041 C31.2733204,132.860101 11.0007062,126.525104 0.51440531,138.928324 Z" id="Path" fill="#E7F4FE"></path>
<path d="M8.45390442,132.267068 C8.45390442,132.267068 18.6906602,6.36023291 81.8670195,35.9181468 C87.3029593,39.0338228 77.5076372,49.6381165 68.456446,50.3645367 C59.4061558,51.090957 62.246646,68.606157 55.6071239,78.2605165 C48.237885,88.9774684 34.5723611,87.3542886 32.0372708,103.647372 C30.2147805,115.370137 14.933069,112.333772 8.45390442,132.267068 Z" id="Path" fill="#DCEEFD"></path>
</g>
<g id="cog_4_" transform="translate(291.941593, 205.055696)" fill="#F3F9FF" fill-rule="nonzero">
<path d="M120.51048,32.7700253 C119.524011,30.3879797 116.994326,29.0342785 114.467343,29.534481 L106.4828,31.1144 C104.59995,31.4875241 102.652237,30.8314025 101.381088,29.3938835 C100.034265,27.8716456 98.6072637,26.4386329 97.1054885,25.1011544 C95.6739823,23.8267646 95.0253451,21.8881418 95.3965097,20.0072 L96.9739593,12.0328 C97.4739504,9.5038481 96.1199204,6.97309367 93.7397823,5.98710886 L81.9508018,1.1022481 C79.5706637,0.115362025 76.8247664,0.94723038 75.3905575,3.08953924 L70.8690159,9.84362532 C69.8041699,11.4343595 67.970869,12.348243 66.060092,12.2373873 C64.0529204,12.1202228 62.0313345,12.1247291 60.0034425,12.2482025 C58.0854584,12.3644658 56.2494549,11.4523848 55.1801044,9.85534177 L50.6513558,3.08953924 C49.2171469,0.94723038 46.4712496,0.116263291 44.0911115,1.1022481 L32.3030319,5.98710886 C29.9219929,6.97399494 28.5688637,9.5038481 29.0688549,12.0328 L30.6490071,20.020719 C31.0210726,21.9043646 30.3661292,23.852 28.9292177,25.1245873 C27.407623,26.4719797 25.9752159,27.8995848 24.6383027,29.4019949 C23.3644513,30.8341063 21.4257469,31.4830177 19.5465009,31.1116962 L11.5754708,29.534481 C9.04758761,29.0342785 6.51790265,30.388881 5.53233451,32.7700253 L0.649538053,44.5639899 C-0.336930973,46.9451342 0.494585841,49.6921924 2.63598938,51.1270076 L9.38722124,55.6495595 C10.9772832,56.7148557 11.8907805,58.5489316 11.7790708,60.4605165 C11.6628566,62.4685367 11.6664602,64.4918785 11.7898814,66.5206278 C11.9069965,68.4394228 10.9944,70.2771038 9.39803186,71.3460051 L2.6350885,75.8766684 C0.493684956,77.3105823 -0.336930973,80.0585418 0.648637168,82.4396861 L5.53143363,94.2327494 C6.51790265,96.6147949 9.04668673,97.9684962 11.5745699,97.4682937 L19.5591133,95.8874734 C21.4419628,95.5152506 23.3896761,96.1704709 24.6608248,97.6079899 C26.0076478,99.1302278 27.4346496,100.563241 28.9364248,101.900719 C30.367931,103.175109 31.017469,105.114633 30.6454035,106.994673 L29.0688549,114.968172 C28.5688637,117.497124 29.9219929,120.027878 32.3030319,121.014765 L44.0911115,125.899625 C46.4721504,126.886511 49.2171469,126.054643 50.6513558,123.912334 L55.1719965,117.158248 C56.2368425,115.567514 58.0701434,114.65363 59.9809204,114.764486 C61.988092,114.881651 64.0096779,114.877144 66.0384708,114.753671 C67.9564549,114.637408 69.7924584,115.548587 70.8618088,117.146532 L75.3905575,123.912334 C76.8247664,126.053742 79.5706637,126.88561 81.9508018,125.899625 L93.7388814,121.014765 C96.1199204,120.027878 97.4730496,117.498025 96.9730584,114.969073 L95.3929062,106.981154 C95.0208407,105.097509 95.6757841,103.149873 97.1126956,101.877286 C98.6342903,100.529894 100.066697,99.1022886 101.403611,97.5998785 C102.677462,96.1677671 104.616166,95.5188557 106.496313,95.8901772 L114.467343,97.4673924 C116.995227,97.9675949 119.524912,96.6138937 120.51048,94.2318481 L125.393276,82.4387848 C126.378844,80.0567392 125.548228,77.309681 123.406825,75.8757671 L116.655593,71.3532152 C115.065531,70.287919 114.152034,68.453843 114.262842,66.5422582 C114.379958,64.534238 114.375453,62.5117975 114.252032,60.4830481 C114.135818,58.5642532 115.047513,56.7265722 116.643881,55.6576709 L123.406825,51.1270076 C125.547327,49.6921924 126.378844,46.9451342 125.393276,44.5639899 L120.51048,32.7700253 Z M73.3635664,88.4835747 C59.5719186,94.1985013 43.7613876,87.6462987 38.0488761,73.8497215 C32.3363646,60.052243 38.8857982,44.2350278 52.6765451,38.5201013 C66.4681929,32.8051747 82.2787239,39.3573772 87.9912354,53.1539544 C93.7037469,66.9505316 87.1552142,82.7686481 73.3635664,88.4835747 Z" id="Shape"></path>
</g>
<g id="window" transform="translate(116.269027, 38.321519)" fill-rule="nonzero">
<g id="Group">
<rect id="Rectangle" fill="#F3F9FF" x="11.4115097" y="11.7164557" width="342.937173" height="202.78481"></rect>
<path d="M355.838747,0.450632911 L9.92054513,0.450632911 C4.52424425,0.450632911 0.150447788,4.82627848 0.150447788,10.2248608 L0.150447788,215.992861 C0.150447788,221.391443 4.52424425,225.767089 9.92054513,225.767089 L355.839648,225.767089 C361.235949,225.767089 365.609745,221.391443 365.609745,215.992861 L365.609745,10.2248608 C365.609745,4.82627848 361.235048,0.450632911 355.838747,0.450632911 Z M354.348683,214.501266 L11.4115097,214.501266 L11.4115097,11.7164557 L354.348683,11.7164557 L354.348683,214.501266 L354.348683,214.501266 Z" id="Shape" fill="#224380"></path>
</g>
<g id="Group" transform="translate(25.224779, 23.432911)">
<path d="M307.56843,179.926005 L119.367257,179.926005 C116.879913,179.926005 114.862832,177.908071 114.862832,175.419676 L114.862832,9.01265823 C114.862832,6.52426329 116.879913,4.50632911 119.367257,4.50632911 L307.56843,4.50632911 C310.055773,4.50632911 312.072855,6.52426329 312.072855,9.01265823 L312.072855,175.419676 C312.072855,177.908071 310.055773,179.926005 307.56843,179.926005 Z" id="Path" fill="#DAE7FF"></path>
<path d="M307.56843,175.419676 L119.367257,175.419676 C116.879913,175.419676 114.862832,173.401742 114.862832,170.913347 L114.862832,4.50632911 C114.862832,2.01793418 116.879913,0 119.367257,0 L307.56843,0 C310.055773,0 312.072855,2.01793418 312.072855,4.50632911 L312.072855,170.913347 C312.072855,173.401742 310.055773,175.419676 307.56843,175.419676 Z" id="Path" fill="#FFFFFF"></path>
<path d="M101.296405,44.7667747 L5.21161947,44.7667747 C2.72427611,44.7667747 0.70719469,42.7488405 0.70719469,40.2604456 L0.70719469,9.01265823 C0.70719469,6.52426329 2.72427611,4.50632911 5.21161947,4.50632911 L101.296405,4.50632911 C103.783749,4.50632911 105.80083,6.52426329 105.80083,9.01265823 L105.80083,40.2604456 C105.80083,42.7497418 103.78465,44.7667747 101.296405,44.7667747 Z" id="Path" fill="#DAE7FF"></path>
<path d="M101.296405,40.2604456 L5.21161947,40.2604456 C2.72427611,40.2604456 0.70719469,38.2425114 0.70719469,35.7541165 L0.70719469,4.50632911 C0.70719469,2.01793418 2.72427611,0 5.21161947,0 L101.296405,0 C103.783749,0 105.80083,2.01793418 105.80083,4.50632911 L105.80083,35.7541165 C105.80083,38.2434127 103.78465,40.2604456 101.296405,40.2604456 Z" id="Path" fill="#FFFFFF"></path>
<path d="M101.296405,106.279068 L5.21161947,106.279068 C2.72427611,106.279068 0.70719469,104.261134 0.70719469,101.772739 L0.70719469,70.5249519 C0.70719469,68.036557 2.72427611,66.0186228 5.21161947,66.0186228 L101.296405,66.0186228 C103.783749,66.0186228 105.80083,68.036557 105.80083,70.5249519 L105.80083,101.772739 C105.80083,104.261134 103.78465,106.279068 101.296405,106.279068 Z" id="Path" fill="#DAE7FF"></path>
<path d="M101.296405,101.772739 L5.21161947,101.772739 C2.72427611,101.772739 0.70719469,99.7548051 0.70719469,97.2664101 L0.70719469,66.0186228 C0.70719469,63.5302278 2.72427611,61.5122937 5.21161947,61.5122937 L101.296405,61.5122937 C103.783749,61.5122937 105.80083,63.5302278 105.80083,66.0186228 L105.80083,97.2664101 C105.80083,99.7548051 103.78465,101.772739 101.296405,101.772739 Z" id="Path" fill="#FFFFFF"></path>
<path d="M226.222122,22.7272203 L133.116563,22.7272203 C132.121085,22.7272203 131.314793,21.9205873 131.314793,20.9246886 L131.314793,13.3116962 C131.314793,12.3157975 132.121085,11.5091646 133.116563,11.5091646 L226.222122,11.5091646 C227.2176,11.5091646 228.023892,12.3157975 228.023892,13.3116962 L228.023892,20.9246886 C228.023892,21.9205873 227.2176,22.7272203 226.222122,22.7272203 Z" id="Path" fill="#1B90FB"></path>
<path d="M170.846526,80.5434228 L133.117464,80.5434228 C132.121986,80.5434228 131.315694,79.7367899 131.315694,78.7408911 L131.315694,71.1278987 C131.315694,70.132 132.121986,69.3253671 133.117464,69.3253671 L170.846526,69.3253671 C171.842004,69.3253671 172.648296,70.132 172.648296,71.1278987 L172.648296,78.7408911 C172.648296,79.7358886 171.841103,80.5434228 170.846526,80.5434228 Z" id="Path" fill="#7266D5"></path>
<g transform="translate(130.628319, 29.741772)" fill="#DCEEFD" id="Path">
<path d="M163.352064,3.56540759 L2.32608496,3.56540759 C1.42069558,3.56540759 0.686474336,2.83087595 0.686474336,1.9251038 L0.686474336,1.91879494 C0.686474336,1.01302278 1.42069558,0.278491139 2.32608496,0.278491139 L163.352064,0.278491139 C164.257453,0.278491139 164.991674,1.01302278 164.991674,1.91879494 L164.991674,1.9251038 C164.991674,2.83177722 164.258354,3.56540759 163.352064,3.56540759 Z"></path>
<path d="M163.352064,13.1404557 L2.32608496,13.1404557 C1.42069558,13.1404557 0.686474336,12.4059241 0.686474336,11.5001519 L0.686474336,11.493843 C0.686474336,10.5880709 1.42069558,9.85353924 2.32608496,9.85353924 L163.352064,9.85353924 C164.257453,9.85353924 164.991674,10.5880709 164.991674,11.493843 L164.991674,11.5001519 C164.991674,12.4059241 164.258354,13.1404557 163.352064,13.1404557 Z"></path>
<path d="M163.352064,22.7155038 L2.32608496,22.7155038 C1.42069558,22.7155038 0.686474336,21.9809722 0.686474336,21.0752 L0.686474336,21.0688911 C0.686474336,20.163119 1.42069558,19.4285873 2.32608496,19.4285873 L163.352064,19.4285873 C164.257453,19.4285873 164.991674,20.163119 164.991674,21.0688911 L164.991674,21.0752 C164.991674,21.9809722 164.258354,22.7155038 163.352064,22.7155038 Z"></path>
<path d="M63.241223,32.2896506 L2.32608496,32.2896506 C1.42069558,32.2896506 0.686474336,31.555119 0.686474336,30.6493468 L0.686474336,30.643038 C0.686474336,29.7372658 1.42069558,29.0027342 2.32608496,29.0027342 L63.241223,29.0027342 C64.1466124,29.0027342 64.8808336,29.7372658 64.8808336,30.643038 L64.8808336,30.6493468 C64.8808336,31.5560203 64.1475133,32.2896506 63.241223,32.2896506 Z"></path>
</g>
</g>
</g>
<g id="chevron_arrow_2_" transform="translate(61.315044, 96.903797)" fill-rule="nonzero">
<polygon id="Path" fill="#F3F9FF" points="19.8068566 71.8750481 38.8335469 90.9097823 38.8335469 104.425165 19.8068566 85.3904304 0.781067257 104.425165 0.781067257 90.9097823"></polygon>
<polygon id="Path" fill="#E7F4FE" points="19.8068566 48.0825316 38.8335469 67.1163646 38.8335469 80.6317468 19.8068566 61.5970127 0.781067257 80.6317468 0.781067257 67.1163646"></polygon>
<polygon id="Path" fill="#DCEEFD" points="19.8068566 24.2891139 38.8335469 43.3238481 38.8335469 56.8383291 19.8068566 37.8035949 0.781067257 56.8383291 0.781067257 43.3238481"></polygon>
<polygon id="Path" fill="#D0E7FE" points="19.8068566 0.495696203 38.8335469 19.5304304 38.8335469 33.0449114 19.8068566 14.0110785 0.781067257 33.0449114 0.781067257 19.5304304"></polygon>
</g>
<g id="woman_7_" transform="translate(138.791150, 38.321519)" fill-rule="nonzero">
<rect id="Rectangle" fill="#0D1F42" x="8.16652212" y="0.450632911" width="2.57022478" height="156.781499"></rect>
<g id="Group" transform="translate(9.008850, 72.101266)">
<path d="M76.4626106,27.1326076 L65.7285664,27.1326076 C65.2510973,27.1326076 64.8637168,26.7450633 64.8637168,26.2673924 L64.8637168,26.2628861 C64.8637168,25.7852152 65.2510973,25.3976709 65.7285664,25.3976709 L76.4626106,25.3976709 L78.714823,26.2646886 L76.4626106,27.1326076 Z" id="Path" fill="#224380"></path>
<polygon id="Path" fill="#F1B282" points="23.8941717 111.707392 24.5590248 114.999716 20.2473894 115.60717 18.9420071 112.501408"></polygon>
<path d="M24.6527168,114.604962 C24.6527168,114.604962 20.5636,115.675666 19.2212814,115.806349 C17.8789628,115.937033 15.6015257,118.817478 14.2249735,119.255494 C12.5547327,119.786339 12.7511257,121.708739 14.0159681,122.049418 C15.802423,122.529792 26.1932301,122.361256 26.2202566,118.839109 C26.2481841,115.10877 24.6527168,114.604962 24.6527168,114.604962 Z" id="Path" fill="#102B5E"></path>
<polygon id="Path" fill="#F1B282" points="31.0661168 110.626775 29.2409239 113.484689 33.2084212 115.548587 35.5894602 113.08723"></polygon>
<path d="M12.8195929,82.2080608 C11.4817788,83.8438582 15.0916248,112.72402 17.2681628,114.131797 C19.4447009,115.539575 24.9346938,112.509519 24.9346938,112.509519 C24.9346938,112.509519 28.4364336,85.8059139 26.8274531,82.2071595 C25.2193735,78.6102076 14.1574071,80.5722633 12.8195929,82.2080608 Z" id="Path" fill="#0B224E"></path>
<path d="M59.1998531,83.8177215 C57.5908726,74.8221873 38.5470655,67.4354127 33.2084212,67.1515139 C27.869777,66.8676152 8.66921593,73.2828253 7.34221239,74.5139544 C6.01520885,75.7450835 5.43684071,85.1434835 17.1744708,84.8595848 C28.9121009,84.5756861 34.4011929,82.8713924 34.4011929,82.8713924 C34.4011929,82.8713924 41.3794478,85.7013671 45.7226142,87.4930835 C41.6380018,92.0300557 30.3481115,105.116435 30.4255876,111.090025 C30.8039593,112.794319 35.2525292,114.594147 36.4831381,114.025448 C37.7137469,113.456749 60.8097345,92.814157 59.1998531,83.8177215 Z" id="Path" fill="#102B5E"></path>
<path d="M29.1949788,24.0187342 C29.1949788,24.0187342 27.3968124,30.6475443 26.2607965,32.1625722 C25.1247805,33.6776 34.0228212,35.9505924 34.9687504,35.003362 C35.9146796,34.0561316 36.1047664,27.6174886 36.1047664,27.6174886 C36.1047664,27.6174886 40.837115,28.7467747 42.0677239,27.7328506 C43.2983327,26.7189266 43.6767044,24.8713316 43.7712973,24.3035342 C43.8658903,23.7357367 45.5694637,23.1201722 45.5694637,22.2675747 C45.5694637,21.4149772 44.7172265,15.5360203 43.0614,14.1715038 C42.1406956,13.4135392 31.4661097,10.0995848 30.4255876,16.1596962 C29.3841646,22.2198076 29.1949788,24.0187342 29.1949788,24.0187342 Z" id="Path" fill="#F1B282"></path>
<path d="M30.2364018,25.7239291 C33.1705841,25.7239291 37.9984265,24.8713316 37.9984265,21.9359089 C37.9984265,19.0004861 34.2120071,14.7393013 37.9984265,15.2124658 C41.784846,15.6856304 44.7172265,15.6901367 44.7190283,11.7092456 C44.7208301,6.21693165 30.3192832,0.219007595 25.1256814,12.7420962 C21.5284478,21.4149772 26.4725044,25.7239291 30.2364018,25.7239291 Z" id="Path" fill="#102B5E"></path>
<path d="M62.1601611,33.5811646 C62.1601611,33.5811646 65.9087434,29.8958886 66.3483752,29.365043 C68.3321239,26.9685772 67.5024088,24.0358582 70.2699274,24.0358582 C71.7906212,24.0358582 74.5076903,25.177762 74.5860673,27.0956557 C74.6203009,27.9221165 74.8950708,30.9557772 72.4284478,31.3442228 C70.3645204,31.6686785 64.8330867,37.3926177 64.8330867,37.3926177 L62.1601611,33.5811646 Z" id="Path" fill="#F1B282"></path>
<path d="M67.5258319,34.2661266 C67.0528673,31.2360709 63.5376142,30.7475848 61.4682814,32.6564658 C60.806131,33.2675241 52.9008655,37.2925772 49.451377,39.8017013 C46.444223,35.9731241 38.7758903,29.748081 29.067954,29.748081 C15.2808106,29.748081 0.136033628,43.2896 0.136033628,52.6636658 C0.136033628,59.1960405 3.8386708,59.6340557 7.24311504,58.6588861 C6.12151327,63.0868051 4.64135929,70.6421165 5.90800354,75.9586835 C6.88005841,80.0396152 18.2149929,75.200719 22.7581558,74.5382886 C27.3013186,73.8758582 36.6723239,74.159757 36.2939522,69.5200405 C35.9155805,64.8803241 34.9939752,50.2086177 42.9109522,50.565519 C46.5081858,50.565519 47.1730389,53.0430987 50.3027133,53.0430987 C56.2656708,53.0421975 68.1915858,38.5273114 67.5258319,34.2661266 Z" id="Path" fill="#1B90FB"></path>
<path d="M26.5923221,6.78472911 C26.5923221,6.78472911 26.7724991,0.0612860759 17.1744708,0.0612860759 C-2.32428319,0.0612860759 5.43774159,18.2425215 5.15306195,27.7121215 C4.8683823,37.1817215 0.326120354,36.5183899 0.136033628,39.8332456 C-0.0531522124,43.1472 18.5933646,40.4956759 19.9185664,27.6174886 C21.2437681,14.7393013 22.1896973,8.80716962 24.9355947,9.90941772 C27.681492,11.0125671 26.5923221,6.78472911 26.5923221,6.78472911 Z" id="Path" fill="#102B5E"></path>
<path d="M29.1526372,5.0948557 C31.0309823,5.98891139 26.6860142,13.8064911 24.0518265,12.785357 C21.4176389,11.7642228 26.7040319,3.92951899 29.1526372,5.0948557 Z" id="Path" fill="#1B90FB"></path>
<path d="M7.22059292,58.7472101 C7.22059292,58.7472101 10.453869,46.5089215 15.1393717,43.3842329 C15.1393717,43.3842329 9.3178531,58.7472101 5.51161416,73.4017924 C5.51161416,73.4017924 5.26567257,64.6342785 7.22059292,58.7472101 Z" id="Path" fill="#1277D7"></path>
<path d="M45.5703646,87.6625215 L48.2676142,88.5529722 C48.2676142,88.5529722 41.6551186,94.9123038 37.5551912,97.3430177 C37.5551912,97.3430177 43.5803097,88.4961924 45.5703646,87.6625215 Z" id="Path" fill="#0B224E"></path>
<path d="M29.2265097,112.703291 C29.2265097,112.703291 33.6705752,115.496314 35.2291062,116.174066 C36.7867363,116.852719 38.2443681,120.878673 39.7065044,121.903413 C41.4803469,123.146258 40.3875735,125.147068 38.7137292,125.010076 C36.3489062,124.816304 23.9184956,120.478511 25.4554053,116.657144 C27.0815027,112.610461 29.2265097,112.703291 29.2265097,112.703291 Z" id="Path" fill="#102B5E"></path>
</g>
<path d="M4.07650442,162.738866 L70.4573115,162.738866 C72.2392619,162.738866 73.6833805,161.294137 73.6833805,159.511433 L73.6833805,159.206805 C73.6833805,157.424101 72.2392619,155.979372 70.4573115,155.979372 L4.07650442,155.979372 C2.29455398,155.979372 0.850435398,157.424101 0.850435398,159.206805 L0.850435398,159.511433 C0.850435398,161.294137 2.29455398,162.738866 4.07650442,162.738866 Z" id="Path" fill="#0D1F42"></path>
<rect id="Rectangle" fill="#0D1F42" x="65.3069522" y="0.450632911" width="2.57022478" height="156.781499"></rect>
</g>
<g id="man_on_ladder_1_" transform="translate(377.525664, 121.237975)" fill-rule="nonzero">
<rect id="Rectangle" fill="#183168" x="46.2235062" y="14.6356557" width="41.7163788" height="3.60506329"></rect>
<rect id="Rectangle" fill="#183168" x="45.943331" y="41.523119" width="41.0064814" height="3.60506329"></rect>
<rect id="Rectangle" fill="#183168" x="46.2235062" y="76.2317671" width="42.0704265" height="3.60506329"></rect>
<rect id="Rectangle" fill="#183168" x="52.0098903" y="107.820233" width="35.6840531" height="3.60506329"></rect>
<rect id="Rectangle" fill="#183168" x="46.3613416" y="206.888273" width="41.3605292" height="3.60506329"></rect>
<rect id="Rectangle" fill="#183168" x="46.3613416" y="239.241013" width="41.3605292" height="3.60506329"></rect>
<rect id="Rectangle" fill="#183168" x="46.5784549" y="138.928324" width="41.3605292" height="3.60506329"></rect>
<rect id="Rectangle" fill="#183168" x="86.2282035" y="0.89315443" width="3.60353982" height="256.868871"></rect>
<rect id="Rectangle" fill="#183168" x="45.4856814" y="0.89315443" width="3.60353982" height="256.868871"></rect>
<g id="Group" transform="translate(0.000000, 14.420253)">
<path d="M11.6682619,19.8963443 L12.5195982,18.2290025 C12.8105841,17.6585013 12.8628354,17.0095899 12.6646407,16.4003342 C12.4673469,15.7919797 12.0448319,15.2962835 11.4754726,15.0051747 L1.85131858,10.0887696 C1.08556637,9.69762025 0.781067257,8.75669873 1.17115044,7.99062278 L3.18823186,4.03857215 C3.37831858,3.66725063 3.7008354,3.39236456 4.09632389,3.26438481 C4.49271327,3.13460253 4.91703009,3.1670481 5.28549204,3.35901772 L8.88452743,5.1976 L9.26470088,4.45225316 L5.66566549,2.61367089 C5.09360354,2.32526582 4.44676814,2.27118987 3.8386708,2.46946835 C3.22967257,2.66684557 2.73508673,3.08953924 2.44410088,3.65913924 L0.427019469,7.61209114 C-0.172969912,8.7891443 0.295490265,10.2347747 1.47114513,10.835919 L11.0952991,15.7523241 C11.4664637,15.9406886 11.7412336,16.2633418 11.8691593,16.6598987 C11.997085,17.0564557 11.9637522,17.4791494 11.7745664,17.8495696 L10.9232301,19.5169114 L11.6682619,19.8963443 Z" id="Path" fill="#4D78CC"></path>
<path d="M6.84762655,8.24027342 L23.1878779,16.5868962 C24.2734442,17.1411747 25.6022496,16.7103696 26.1571947,15.6243443 L27.8373451,12.3320203 C28.3913894,11.2459949 27.9607664,9.91662785 26.8752,9.3614481 L10.5349487,1.01482532 C9.4493823,0.460546835 8.12057699,0.891351899 7.56563186,1.97737722 L5.88548142,5.26970127 C5.33143717,6.35662785 5.76206018,7.68599494 6.84762655,8.24027342 Z" id="Path" fill="#7266D5"></path>
<path d="M9.85297876,27.6463291 L13.5087699,20.4830684 C14.0628142,19.397043 13.6321912,18.0676759 12.5466248,17.5124962 L12.3385204,17.4061468 C11.252954,16.8518684 9.92414867,17.2826734 9.36920354,18.3686987 L5.71341239,25.5319595 C5.15936814,26.6179848 5.58999115,27.9473519 6.67555752,28.5025316 L6.88366195,28.608881 C7.96922832,29.1631595 9.29893451,28.7323544 9.85297876,27.6463291 Z" id="Path" fill="#224380"></path>
</g>
<rect id="Rectangle" fill="#183168" x="48.0324832" y="174.534633" width="41.3605292" height="3.60506329"></rect>
<path d="M62.5376319,165.929347 L64.1970619,170.75923 C64.1970619,170.75923 67.5699752,173.811818 69.317692,169.460506 C69.317692,169.460506 68.7744584,166.525084 68.5762637,165.453478 C68.378069,164.380972 62.5376319,165.929347 62.5376319,165.929347 Z" id="Path" fill="#F1B282"></path>
<path d="M69.8465115,166.232172 L61.3826973,166.232172 C61.3826973,166.232172 53.460315,135.112365 51.2567504,126.868486 C49.5207451,120.375767 47.5027628,98.9157266 48.3036496,88.9197873 C49.0676,79.3898025 65.2727186,84.5513519 66.1177487,91.2441519 C68.5960832,110.863808 63.9835522,125.415646 64.220485,128.846765 C68.2411345,139.022056 69.8465115,166.232172 69.8465115,166.232172 Z" id="Path" fill="#102B5E"></path>
<path d="M46.6280035,27.6598481 C45.6045982,29.859838 46.1063912,31.0576203 45.8550442,31.9841215 C45.6036973,32.9115241 44.6424531,34.7825519 44.6019133,35.6702987 C44.5613735,36.5580456 45.5036991,36.6788152 45.7072991,37.8387443 C45.9108991,38.9986734 45.3766743,40.5100962 46.083869,41.7259038 C46.7910637,42.9417114 49.5351593,42.6605165 49.373,43.8339646 C49.2117416,45.0074127 47.4820425,49.3623291 47.4820425,49.3623291 L58.7656265,49.5434835 C58.7656265,49.5434835 58.3151841,43.204881 58.8890478,40.5849013 C59.4629115,37.9649215 60.7349611,28.3394025 58.3917593,27.1722633 C56.0485575,26.0051241 47.7144708,25.3246684 46.6280035,27.6598481 Z" id="Path" fill="#F1B282"></path>
<path d="M52.8224885,22.6695392 C62.2097097,22.9624506 65.5033451,25.3291747 65.3961398,32.667281 C65.332177,37.0411241 62.9196071,43.0949266 59.7520956,43.0751473 C57.4683522,43.0606785 52.9657292,42.8065215 52.176554,41.5582684 C50.3036142,38.5949063 51.9071894,34.5040608 50.6522566,33.0917772 C48.8685044,31.0846582 44.815423,32.1184101 45.3721699,25.2038987 C45.9289168,18.2893873 49.6982195,22.5713013 52.8224885,22.6695392 Z" id="Path" fill="#0B224E"></path>
<path d="M74.1401292,20.5768 C74.1401292,20.5768 75.7401009,16.118238 75.4545204,13.7343899 C74.9941681,9.89319494 65.856492,9.87607089 65.4628053,13.202643 C65.0456956,16.7347038 66.6916124,17.6585013 67.7663681,18.5804962 C68.8411239,19.5024911 70.069931,21.115757 70.3771327,21.7304203 C70.6843345,22.3450835 73.6788761,22.3441823 74.1401292,20.5768 Z" id="Path" fill="#F1B282"></path>
<path d="M9.9646885,46.2709873 C9.9646885,46.2709873 5.46656991,44.7902076 3.76389735,43.0985316 C1.02070265,40.3722025 6.62781062,33.1548658 9.49082301,34.8907038 C12.5313097,36.7337924 12.2466301,38.6003139 12.3114938,40.0153013 C12.3763575,41.4302886 12.8925646,43.391443 13.1880549,44.0124152 C13.4835451,44.6324861 11.6412354,46.9938025 9.9646885,46.2709873 Z" id="Path" fill="#F1B282"></path>
<path d="M40.234423,158.566005 L42.6650106,163.057013 C42.6650106,163.057013 46.4937717,165.513863 47.5027628,160.934532 C47.5027628,160.934532 46.4847628,158.128891 46.1126973,157.103251 C45.7406319,156.078511 40.234423,158.566005 40.234423,158.566005 Z" id="Path" fill="#F1B282"></path>
<path d="M40.4794637,89.3334684 C40.4794637,89.3334684 24.1797522,112.419392 23.7833628,117.053701 C23.0671593,125.416547 39.0173274,158.62639 39.0173274,158.62639 L47.266731,156.855403 C47.266731,156.855403 41.7416035,131.821843 37.375915,123.286856 C45.7721628,111.929104 59.0728283,105.586896 59.0728283,90.7520608 C59.0737292,86.7297114 40.4794637,89.3334684 40.4794637,89.3334684 Z" id="Path" fill="#0B224E"></path>
<path d="M57.6548354,47.6616405 C55.2386619,47.4985114 50.7414442,47.7454582 48.1225717,47.6958886 C41.4163841,47.5697114 32.3552832,53.5342886 25.0923487,55.6657823 C20.3464867,50.5267646 13.3880513,42.3730127 13.3880513,42.3730127 L7.53590265,45.9888911 C7.53590265,45.9888911 17.9825646,64.0142076 24.4040726,65.0479595 C28.2904903,65.673438 34.5381274,65.4337013 39.3866903,63.4229772 C39.3866903,69.4596557 31.6561965,93.1169823 37.3362761,94.3219747 C43.0163558,95.5269671 51.9675487,93.4612658 57.4755593,94.3219747 C62.9835699,95.1826835 69.0077876,99.3158886 67.6312354,88.9837772 C66.2537823,78.6516658 60.2286637,79.7629266 73.1383451,60.0513418 C76.5193664,54.8888911 80.4553327,47.3687291 79.8589469,41.0625722 C78.6923009,28.7368608 75.6986602,19.4718481 75.6986602,19.4718481 L69.2933681,20.5046987 C69.2933681,20.5046987 69.8465115,33.4811241 71.2230637,41.0580658 C69.8456106,44.7045873 67.7681699,47.2137114 65.3961398,49.8075544 C64.0970637,51.2288506 61.4376513,47.5255494 57.6548354,47.6616405 Z" id="Path" fill="#FFCB01"></path>
<path d="M69.4618336,168.30959 C70.1293894,168.222167 70.8347823,168.939575 70.8068549,171.602815 C70.7789274,174.266056 70.9014478,175.676537 68.8366195,175.962238 C67.5393451,176.14159 62.6502425,174.847372 57.8872637,174.932992 C56.1665735,174.963635 53.0044673,174.156101 51.8954779,172.677124 C51.6693558,172.3752 51.6189062,171.939889 51.7675522,171.571271 C51.9161982,171.202653 52.2360124,170.969225 52.5801504,170.979139 C56.4170195,171.08639 56.483685,171.459514 59.5890354,169.253215 C60.7160425,168.45199 61.6574673,167.703038 62.2520513,167.662481 C63.4087876,167.58317 63.9439133,169.124334 65.8285646,168.923352 C67.7150177,168.721468 68.3078,168.461003 69.4618336,168.30959 Z" id="Path" fill="#0B224E"></path>
<path d="M47.5622212,159.639413 C48.2604071,159.50242 49.1703009,160.431625 49.5207451,162.892081 C49.8711894,165.353438 50.5801858,167.32 48.4207646,167.758916 C47.0649327,168.034704 40.0074,167.316395 34.9471292,167.800375 C33.1192336,167.97522 30.9769292,167.088375 29.5850619,165.81759 C29.3003823,165.558025 29.185069,165.160567 29.2913735,164.807271 C29.3976779,164.453975 29.7048796,164.211534 30.0724407,164.190805 C34.1741699,163.963686 34.2993929,164.302562 37.2921327,162.002532 C38.3786,161.167058 39.2740796,160.395575 39.9019965,160.308152 C41.1226956,160.136911 41.8569168,161.186886 43.8361611,160.8408 C45.8154053,160.494714 46.3541345,159.877347 47.5622212,159.639413 Z" id="Path" fill="#0B224E"></path>
</g>
<g id="man_with_paper" transform="translate(204.555752, 213.167089)">
<path d="M24.5076743,4.49641519 C27.5787912,4.09174684 30.3147788,6.04569114 30.3147788,8.43404557 C30.3147788,8.95407595 30.1111788,9.89229367 30.508469,11.0810633 C30.7742301,11.8759797 31.8886248,12.9025215 31.8787807,13.985843 C31.8688053,15.0691646 30.249915,14.8249215 30.3787416,15.7937823 C30.5075681,16.7617418 31.1535027,18.7634532 30.7012584,19.5376405 C30.249915,20.3127291 25.2166708,19.4087595 25.0878442,21.2157975 C24.9590177,23.0228354 26.249085,26.4990177 26.249085,26.4990177 L15.4087363,25.6698532 C15.4087363,25.6698532 14.5033469,8.93064304 15.4087363,7.65895696 C16.9258265,5.52926582 22.0554655,4.81906835 24.5076743,4.49641519 Z" id="Path" fill="#F1B282" fill-rule="nonzero"></path>
<path d="M4.81072566,153.006096 C4.81072566,153.006096 2.79995044,161.619494 4.79541062,163.34722 L9.20163894,163.750086 C9.60343363,163.787038 9.9583823,163.490522 9.99531858,163.088557 L10.0583805,162.39999 C10.0583805,162.39999 11.9042938,164.207028 13.359223,164.339514 C14.8141522,164.472 22.5743752,164.531484 22.5743752,164.531484 C22.5743752,164.531484 24.3635327,165.012759 24.5220885,163.273316 C24.7491115,160.782218 18.4041788,160.457762 15.9816991,158.191078 C13.5592195,155.924395 12.4322124,153.701873 12.4322124,153.701873 L4.81072566,153.006096 Z" id="Path" fill="#0B224E"></path>
<path d="M28.0544584,155.318744 C28.0544584,155.318744 26.8355611,164.079949 28.9796673,165.61841 L33.4048142,165.61841 C33.8084106,165.61841 34.1354319,165.291251 34.1354319,164.887484 L34.1354319,164.196213 C34.1354319,164.196213 36.1380991,165.827504 37.5984336,165.827504 C39.0587681,165.827504 48.4054496,165.81038 48.4054496,165.81038 C48.4054496,165.81038 50.2306425,166.126724 50.2306425,164.380071 C50.2306425,161.879058 42.2695221,161.502329 39.6506496,159.465468 C37.031777,157.428608 35.7074761,155.317843 35.7074761,155.317843 L28.0544584,155.317843 L28.0544584,155.318744 Z" id="Path" fill="#0B224E"></path>
<path d="M66.1042354,54.1687797 C66.1042354,54.8068759 65.8420779,55.4170329 65.379023,55.8559494 C49.6603823,70.7583797 22.9167115,70.6430313 22.9167115,70.6430313 L22.9167115,36.7103595 C22.9167115,36.7103595 47.0676354,38.9427949 64.8033575,22.4712608 C65.0285788,22.2612658 65.3574018,22.2053873 65.6393788,22.3288608 C65.9213558,22.4523342 66.1042354,22.7308253 66.1042354,23.0390582 L66.1042354,54.1687797 Z" id="Path" fill="#1B90FB" fill-rule="nonzero"></path>
<path d="M57.7800584,41.8836253 C57.7800584,41.8836253 60.1998354,39.075281 60.6836106,38.4948658 C61.1673858,37.9135494 61.5628743,34.5247899 62.4295257,33.6532658 C63.296177,32.7817418 66.0339664,31.2739241 66.757377,31.355038 C67.7798814,31.4704 68.8699522,35.8550582 68.4978867,39.0013772 C68.1555504,41.8944405 66.5501735,42.8741165 64.142108,43.2616608 C62.888977,43.4635443 60.5124425,46.2637772 60.3187522,47.0379646 L57.7800584,41.8836253 Z" id="Path" fill="#F1B282" fill-rule="nonzero"></path>
<path d="M27.5085221,31.9309468 C27.5085221,31.9309468 27.8409487,26.9343291 26.1130513,26.3872608 C24.385154,25.8401924 16.1871009,23.3860456 15.0826159,25.0326582 C13.9790319,26.6792709 13.8150708,30.9999392 13.8150708,30.9999392 L27.5085221,31.9309468 Z" id="Path" fill="#1EAF69" fill-rule="nonzero"></path>
<path d="M33.0913062,4.272 C32.9489664,-0.794916456 11.855646,-1.93141266 11.3988973,9.17398481 C11.1358389,15.5846886 12.8168903,20.892243 14.2952425,20.8733165 C18.1726513,20.8228456 15.8015221,14.053438 18.0447257,13.7542177 C20.5392761,13.4207494 18.0231044,24.7920203 24.3563257,24.123281 C34.9786602,23.0003038 32.2057363,15.0691646 25.6256726,16.3372456 C19.0456088,17.6053266 20.6951292,10.2726278 26.1788159,8.90090127 C31.6616018,7.52737215 33.194908,7.96538734 33.0913062,4.272 Z" id="Path" fill="#0B224E" fill-rule="nonzero"></path>
<path d="M7.34941947,79.5511291 C7.34941947,79.5511291 6.88546372,96.574238 9.19082832,113.829873 L3.74768142,153.827149 C3.70353805,154.149803 3.79723009,154.475159 4.00443363,154.725711 C4.21163717,154.976263 4.5152354,155.127676 4.83955398,155.1448 L14.0781292,155.614359 C14.6186602,155.641397 15.1042372,155.292608 15.2528832,154.772577 C16.7123168,149.656992 23.9617381,123.890704 24.4833504,115.185377 C25.0644212,105.502177 27.1932124,79.7449013 22.5473487,77.0338937 C17.901485,74.3228861 7.94490442,71.5983595 7.34941947,79.5511291 Z" id="Path" fill="#0B224E" fill-rule="nonzero"></path>
<path d="M13.0628319,78.5831696 C14.3592053,88.772881 23.3230106,117.509742 25.4518018,121.382481 L26.7553823,155.848689 C26.7851115,156.627382 27.3869027,157.262775 28.1625646,157.333073 L35.8615274,158.033357 C36.2786372,158.07121 36.6939451,157.938724 37.0119575,157.664739 C37.3299699,157.390754 37.5227593,157.000506 37.5479841,156.581418 L39.7767735,118.846319 C39.7767735,118.846319 37.2606018,80.7119595 32.6138372,76.8392203 C27.9670726,72.966481 12.3970779,73.3513215 13.0628319,78.5831696 Z" id="Path" fill="#102B5E" fill-rule="nonzero"></path>
<path d="M12.9592301,52.5113519 C15.7285504,50.4420456 18.9293947,47.7193215 19.9978442,45.5139241 C22.0113221,41.3563848 20.8464779,23.5464709 13.4312938,28.9684861 C6.01610973,34.3905013 0.362155752,50.7241418 0.665753982,56.2452962 C0.969352212,61.7664506 25.7806248,72.8943797 25.7806248,72.8943797 L27.9031097,63.9087595 C27.9031097,63.9078582 17.8528372,56.1569722 12.9592301,52.5113519 Z" id="Path" fill="#1EAF69" fill-rule="nonzero"></path>
<path d="M63.0241097,45.171443 L59.0079646,39.8674937 C58.7548159,39.5331241 58.2818513,39.4610228 57.9404159,39.7052658 C55.9945044,41.0977215 49.8567752,45.5788152 45.6649575,49.5768304 C42.1596142,43.3589975 33.1904035,28.3736506 27.9688743,28.0365772 C25.1067628,27.1650532 15.9663841,25.9059848 12.2889717,29.392081 C8.61065841,32.8781772 9.96558938,41.3996456 9.38541947,54.5680405 C8.80434867,67.7373367 3.19093451,79.9377722 7.64310796,81.8745924 C12.0952814,83.8114127 16.5474549,78.9698127 22.5491504,79.1635848 C28.5499451,79.357357 35.9209858,82.8434532 36.4948496,78.0018532 C37.0110566,73.6415291 32.3705982,62.8497722 32.8525717,54.2390785 C37.1993416,58.9328709 42.5028513,63.8159291 45.1982991,63.0904101 C49.7153363,61.8737013 60.7791044,48.8044456 63.0024885,46.1348962 C63.2313133,45.8582076 63.241223,45.4589468 63.0241097,45.171443 Z" id="Path" fill="#2CCD7F" fill-rule="nonzero"></path>
<path d="M33.9003009,64.2827848 C30.4391009,61.5483443 23.8653434,54.6852051 25.6463929,42.9489215 C25.6463929,42.9489215 26.3202549,43.9871797 27.4661805,45.7915139 C28.7436354,47.7824101 30.610269,50.7187342 32.8318513,54.2201519 C32.8318513,54.2201519 32.8318513,54.2282633 32.8399593,54.2282633 L32.8399593,54.2363747 C32.6534761,57.4268557 33.1877009,60.9282734 33.9003009,64.2827848 Z" id="Path" fill="#1EAF69" fill-rule="nonzero"></path>
</g>
<g id="check_2_" transform="translate(446.893805, 23.000000)" fill-rule="nonzero">
<ellipse id="Oval" fill="#DBFEED" cx="25.0725292" cy="24.9245063" rx="24.7743363" ry="24.7848101"></ellipse>
<ellipse id="Oval" fill="#9AEEC5" cx="25.0725292" cy="24.9245063" rx="19.2690283" ry="19.2771747"></ellipse>
<ellipse id="Oval" fill="#60DFA0" cx="25.0725292" cy="24.9245063" rx="13.7637204" ry="13.7695392"></ellipse>
<path d="M23.6383204,30.4321418 C23.6194018,30.4321418 23.5995823,30.4321418 23.5806637,30.4321418 C23.1986885,30.415919 22.8410372,30.2410734 22.5941947,29.9508658 L18.4654389,25.1317975 C17.9690513,24.5558886 18.0366177,23.6852658 18.6149858,23.1904709 C19.1942549,22.7010835 20.0609062,22.7659747 20.5545912,23.3409823 L23.7230035,27.0379747 L31.0453965,19.8116253 C31.5841257,19.2789772 32.4597858,19.2870886 32.991308,19.8251443 C33.5246319,20.3686076 33.5192265,21.2401316 32.9777947,21.7745823 L24.604069,30.0364861 C24.3473168,30.2897418 24.0004761,30.4321418 23.6383204,30.4321418 Z" id="Path" fill="#FFFFFF"></path>
</g>
<g id="plant_13_" transform="translate(46.000000, 234.797468)" fill-rule="nonzero">
<path d="M69.5330035,53.0530127 C69.1789558,53.0530127 68.8726549,52.7889418 68.8240071,52.4275342 C65.7591965,27.7085165 68.1564513,12.8727797 75.9482053,8.33941266 C83.4336584,3.98629873 92.8938513,10.8981063 93.2830336,11.1973266 C93.6028478,11.4298532 93.6650088,11.8786835 93.428977,12.1914228 C93.1929451,12.5077671 92.7334938,12.5735595 92.4353009,12.3374278 C92.3452124,12.2680304 83.3579841,5.67617215 76.6581027,9.57324557 C71.6744071,12.4762228 66.5177416,22.2387342 70.2429009,52.2535899 C70.2915487,52.6429367 70.0131752,52.9980354 69.6239929,53.0467038 C69.5888584,53.0494076 69.560931,53.0530127 69.5330035,53.0530127 Z" id="Path" fill="#2CCD7F"></path>
<path d="M54.1738159,114.058795 L61.3106265,139.114886 C61.8250319,140.921023 66.3871133,142.334208 71.9383664,142.334208 C77.4896195,142.334208 82.0517009,140.921023 82.5661062,139.114886 L89.7029168,114.058795 L54.1738159,114.058795 Z" id="Path" fill="#C3D3F3"></path>
<path d="M89.7317451,113.853306 C89.7317451,113.922704 89.7218354,113.9912 89.7029168,114.058795 C89.1704938,115.928922 81.4210814,117.413306 71.9392673,117.413306 C62.4574531,117.413306 54.7080407,115.929823 54.1756177,114.058795 C54.1566991,113.990299 54.1467894,113.921803 54.1467894,113.853306 C54.1467894,111.886744 62.113315,110.293306 71.9401681,110.293306 C81.7670212,110.293306 89.7317451,111.887646 89.7317451,113.853306 Z" id="Path" fill="#DAE7FF"></path>
<path d="M70.4528071,113.826268 C70.7627115,96.5814481 70.6203717,79.2627241 69.4005735,62.0611646 C68.6807664,53.5036456 67.9627611,44.8001215 65.5105522,36.6842228 C64.8267805,34.7474025 64.0745416,32.6348354 62.7277186,31.4064101 C61.4881009,30.002238 59.6611062,30.8070684 58.3214903,32.4311494 C55.5638814,35.4548962 53.7693186,39.5015797 51.9477292,43.3454785 L51.9288106,43.3851342 C51.7603451,43.7402329 51.3360283,43.8916456 50.9810796,43.7231089 C50.6288336,43.5554734 50.477485,43.1363848 50.6396442,42.7821873 C52.4612336,38.8265316 54.1242673,34.7582177 57.1575469,31.3090734 C57.8719487,30.4177215 58.8890478,29.7048203 60.0674053,29.1676658 C61.4340478,28.8107646 62.9493363,29.1965063 63.8565274,30.1176 C65.7402779,31.8597468 66.4276531,34.0408101 67.2258372,36.1074127 C69.9086726,44.557681 70.7248743,53.2476861 71.5897239,61.8818127 C73.0752832,79.1924253 73.4743752,96.5219646 73.4221239,113.881246 C73.4194212,114.702299 72.7527664,115.364729 71.9320602,115.36293 C71.111354,115.360223 70.4492035,114.693286 70.4510053,113.872233 C70.4528071,113.866825 70.4528071,113.831676 70.4528071,113.826268 Z" id="Path" fill="#2CCD7F"></path>
<path d="M71.8266566,90.3095392 C71.4302673,90.3095392 71.1176602,89.9895899 71.1176602,89.596638 C71.1176602,70.4537519 73.7167133,59.9053367 78.840046,58.2434025 C83.5732956,56.6932253 88.3137522,63.1904506 88.5155504,63.4653367 C88.7452761,63.7852861 88.6750071,64.2269063 88.3560938,64.4594329 C88.0362796,64.6892557 87.5912425,64.618957 87.3624177,64.2999089 C87.3137699,64.2404253 83.053485,58.3930127 79.278777,59.5962025 C76.2067593,60.5975089 72.536554,66.612557 72.536554,89.596638 C72.5356531,89.9895899 72.223046,90.3095392 71.8266566,90.3095392 Z" id="Path" fill="#2CCD7F"></path>
<path d="M68.3411327,40.6407797 C68.3411327,40.6407797 70.7230726,25.8329823 58.4845504,11.307281 C58.4845504,11.307281 65.0159664,26.8577215 68.3411327,40.6407797 Z" id="Path" fill="#2CCD7F"></path>
<path d="M87.939885,63.8817215 C83.3850106,55.6937215 92.2028726,46.1267848 98.9450956,46.1267848 C105.687319,46.1267848 114.907876,56.2371848 114.907876,56.2371848 C114.907876,56.2371848 98.9450956,54.5581266 98.9450956,56.8401316 C98.9450956,59.1221367 112.528639,55.1538633 117.981696,57.8324253 C123.434752,60.5109873 124.327529,68.3465924 124.327529,68.3465924 C124.327529,68.3465924 102.018915,63.1886481 101.919818,64.9740557 C101.82072,66.7594633 124.228432,66.9577418 125.715793,71.4217114 C127.203154,75.885681 126.707667,80.0513316 126.707667,80.0513316 C126.707667,80.0513316 105.787317,70.7277367 105.191832,73.9010937 C104.597248,77.0753519 126.786945,77.6701873 126.786945,83.7212861 C126.786945,89.7723848 123.039264,101.476223 123.93114,103.46081 C123.93114,103.46081 111.041278,107.825641 107.869262,103.46081 C104.696345,99.0959797 104.101761,86.5981266 101.523428,86.5981266 C98.9450956,86.5981266 100.036067,102.181914 105.985512,105.400334 C105.985512,105.400334 94.2857186,107.824739 93.0956496,100.48483 C91.9055805,93.1449215 94.7812053,80.4478886 92.6992602,79.5556354 C90.617315,78.6633823 85.7588425,92.9538532 92.0055788,103.163392 C92.0055788,103.163392 83.0823133,104.849661 82.0904389,96.9140152 C81.0985646,88.9783696 86.2543292,75.9559797 84.767869,75.9559797 C83.2814088,75.9559797 75.1500212,88.0861165 75.7455062,95.0294684 C75.7455062,95.0294684 66.0285611,87.9869772 68.0114088,83.2255899 C69.9942566,78.4642025 77.5301593,72.9097013 76.2409929,71.8182684 C74.9518265,70.7268354 66.2267558,77.1744911 65.731269,80.9435848 C65.731269,80.9435848 61.0709912,70.2311392 70.1933522,61.7006582 C77.0490867,55.2872506 87.939885,63.8817215 87.939885,63.8817215 Z" id="Path" fill="#45D48F"></path>
<path d="M118.215025,36.6139241 C118.215025,36.6139241 123.626641,27.639119 119.994273,22.8921519 C111.987207,12.3599595 104.054014,15.1782177 104.128788,13.3243139 C104.20266,11.4704101 116.806041,12.5825722 119.40149,16.5138937 C119.40149,16.5138937 119.253745,6.27821772 114.656529,6.27821772 C110.059313,6.27821772 104.20266,8.50344304 103.758524,7.09386329 C103.313487,5.68428354 113.989874,4.64602532 113.989874,4.64602532 C113.989874,4.64602532 106.138662,-0.397458228 99.4252673,0.195574684 C91.165954,0.9256 92.8605186,11.7660253 92.8605186,11.7660253 C92.8605186,11.7660253 86.4849558,0.6408 80.6274018,6.20341266 C74.7707487,11.7660253 76.8463876,17.9225722 79.2184177,21.631281 C80.7012743,17.403443 85.1489434,11.6182177 86.1876637,13.1386532 C87.2254832,14.6590886 75.512177,25.0425722 83.7408602,30.9765063 C85.0750708,24.7460557 90.0425504,15.3269266 91.4515345,17.2547342 C93.0587133,17.688243 83.6669876,29.9094076 86.3363097,34.3138937 C89.0056319,37.2808608 92.8605186,38.8382481 92.8605186,38.8382481 C92.8605186,38.8382481 94.3433752,20.8147342 97.3090885,22.6695392 C100.274802,24.5243443 91.0073982,35.0556354 95.7523593,40.2478278 C100.49732,45.4400203 109.319687,44.9947949 110.134988,47.5904405 C110.134988,47.5904405 118.142053,41.5086987 116.807842,36.9843443 C115.002469,30.8638481 105.835064,27.639119 106.502619,26.1186835 C107.168373,24.5982481 117.473596,27.0460861 118.215025,36.6139241 Z M104.128788,18.3677975 C103.906269,17.1808304 105.018862,16.1425722 110.134087,17.6999595 C115.249312,19.2573468 118.511416,27.0451848 118.511416,27.0451848 C114.730402,20.1477975 104.351306,19.5547646 104.128788,18.3677975 Z" id="Shape" fill="#7BE6B1"></path>
<path d="M25.3373894,64.1214582 C26.1238619,66.812638 10.0763982,70.216719 5.72332212,80.069357 C2.50536106,87.3524861 14.5871292,99.2762329 14.5871292,99.2762329 C16.5168248,95.1078785 31.1895381,97.7729215 40.2614496,90.1139646 C49.3333611,82.4550076 36.1092708,62.8074127 41.4767434,60.3478582 C46.8442159,57.8892051 45.4082053,88.3835342 45.4082053,88.3835342 C45.4082053,88.3835342 52.2008779,86.6152506 57.3134,82.2296911 C62.7394301,75.4368506 49.6747965,52.9349468 52.458531,52.5582177 C55.2359593,49.6363139 61.5034159,66.4863797 62.3826796,77.2069367 C77.4490796,69.0649013 60.0971345,49.1325063 62.1655664,46.8126481 C64.2339982,44.4927899 70.4230779,55.1457519 71.9852124,62.5460456 C76.7635062,56.8536506 81.5769345,47.0001114 72.9815912,36.4129418 C64.3862478,25.8257722 51.2936867,43.0633823 51.2936867,43.0633823 C51.2936867,43.0633823 56.4872885,25.2850127 42.8190619,22.2648709 C31.7093487,19.8107241 17.4699611,26.5449823 17.4699611,26.5449823 C17.4699611,26.5449823 35.1164956,30.6069873 34.0651628,32.8691646 C33.0138301,35.1313418 23.6932743,30.1320203 15.997915,29.1316152 C8.30255575,28.1312101 5.83052743,45.2345316 5.83052743,45.2345316 C11.0286336,39.2185823 32.3696973,40.0982177 32.090423,43.2184 C31.8111487,46.3385823 19.1447062,39.8945316 3.45038938,55.7829468 C-3.66299823,62.9389975 3.44588496,79.1410532 3.44588496,79.1410532 C6.7665469,63.2850835 24.5509168,61.4302785 25.3373894,64.1214582 Z M5.02964071,63.0597671 C5.02964071,63.0597671 12.1835681,50.7322532 21.0861133,49.2379544 C29.9886584,47.7436557 31.6246655,49.7237367 30.994046,51.6623595 C30.3634265,53.600081 12.8592319,52.3347038 5.02964071,63.0597671 Z" id="Shape" fill="#9AEEC5"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 44 KiB

BIN
src/assets/404_images/logo.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
src/assets/404_images/logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

BIN
src/assets/404_images/logo_login.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

78
src/components/Breadcrumb/index.vue

@ -0,0 +1,78 @@
<template>
<el-breadcrumb class="app-breadcrumb" separator="/">
<transition-group name="breadcrumb">
<el-breadcrumb-item v-for="(item,index) in levelList" :key="item.path">
<span v-if="item.redirect==='noRedirect'||index==levelList.length-1" class="no-redirect">{{ item.meta.title }}</span>
<a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a>
</el-breadcrumb-item>
</transition-group>
</el-breadcrumb>
</template>
<script>
import pathToRegexp from 'path-to-regexp'
export default {
data() {
return {
levelList: null
}
},
watch: {
$route() {
this.getBreadcrumb()
}
},
created() {
this.getBreadcrumb()
},
methods: {
getBreadcrumb() {
// only show routes with meta.title
let matched = this.$route.matched.filter(item => item.meta && item.meta.title)
const first = matched[0]
// if (!this.isDashboard(first)) {
// matched = [{ path: '/dashboard', meta: { title: 'Dashboard' }}].concat(matched)
// }
this.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false)
},
isDashboard(route) {
const name = route && route.name
if (!name) {
return false
}
return name.trim().toLocaleLowerCase() === 'Dashboard'.toLocaleLowerCase()
},
pathCompile(path) {
// To solve this problem https://github.com/PanJiaChen/vue-element-admin/issues/561
const { params } = this.$route
var toPath = pathToRegexp.compile(path)
return toPath(params)
},
handleLink(item) {
const { redirect, path } = item
if (redirect) {
this.$router.push(redirect)
return
}
this.$router.push(this.pathCompile(path))
}
}
}
</script>
<style lang="scss" scoped>
.app-breadcrumb.el-breadcrumb {
display: inline-block;
font-size: 14px;
line-height: 50px;
margin-left: 8px;
.no-redirect {
color: #97a8be;
cursor: text;
}
}
</style>

44
src/components/Hamburger/index.vue

@ -0,0 +1,44 @@
<template>
<div style="padding: 0 15px;" @click="toggleClick">
<svg
:class="{'is-active':isActive}"
class="hamburger"
viewBox="0 0 1024 1024"
xmlns="http://www.w3.org/2000/svg"
width="64"
height="64"
>
<path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 0 0 0-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0 0 14.4 7z" />
</svg>
</div>
</template>
<script>
export default {
name: 'Hamburger',
props: {
isActive: {
type: Boolean,
default: false
}
},
methods: {
toggleClick() {
this.$emit('toggleClick')
}
}
}
</script>
<style scoped>
.hamburger {
display: inline-block;
vertical-align: middle;
width: 20px;
height: 20px;
}
.hamburger.is-active {
transform: rotate(180deg);
}
</style>

62
src/components/SvgIcon/index.vue

@ -0,0 +1,62 @@
<template>
<div v-if="isExternal" :style="styleExternalIcon" class="svg-external-icon svg-icon" v-on="$listeners" />
<svg v-else :class="svgClass" aria-hidden="true" v-on="$listeners">
<use :xlink:href="iconName" />
</svg>
</template>
<script>
// doc: https://panjiachen.github.io/vue-element-admin-site/feature/component/svg-icon.html#usage
import { isExternal } from '@/utils/validate'
export default {
name: 'SvgIcon',
props: {
iconClass: {
type: String,
required: true
},
className: {
type: String,
default: ''
}
},
computed: {
isExternal() {
return isExternal(this.iconClass)
},
iconName() {
return `#icon-${this.iconClass}`
},
svgClass() {
if (this.className) {
return 'svg-icon ' + this.className
} else {
return 'svg-icon'
}
},
styleExternalIcon() {
return {
mask: `url(${this.iconClass}) no-repeat 50% 50%`,
'-webkit-mask': `url(${this.iconClass}) no-repeat 50% 50%`
}
}
}
}
</script>
<style scoped>
.svg-icon {
width: 1em;
height: 1em;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}
.svg-external-icon {
background-color: currentColor;
mask-size: cover!important;
display: inline-block;
}
</style>

151
src/components/projectDialog/index.vue

@ -0,0 +1,151 @@
<template>
<div>
<div>
<el-button size="small" @click="showDialog()">选择考核项目</el-button>
</div>
<el-dialog title="提示" :visible.sync="dialogVisible" width="60%" :append-to-body="true">
<div class="gva-search-box">
<el-form ref="searchForm" :inline="true" :model="projectSearchInfo">
<el-form-item label="考核项目名称">
<el-input
placeholder="请输入名称"
v-model="projectSearchInfo.title"
clearable>
</el-input>
</el-form-item>
<!-- <el-form-item label="考核项目状态">
<el-select v-model="projectSearchInfo.state" clearable placeholder="请选择状态">
<el-option :value=1 label="正常">正常</el-option>
<el-option :value=2 label="禁止">禁止</el-option>
</el-select>
</el-form-item> -->
<el-form-item label="所属考核类别">
<el-select v-model="projectSearchInfo.parentId" clearable placeholder="请选择状态">
<el-option
v-for="item in dutyclasslist"
:key="item.outId"
:label="item.title"
:value="item.outId">
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button size="mini" type="primary" icon="el-icon-search" @click="onSubmit">查询</el-button>
<!-- <el-button size="mini" icon="el-icon-refresh" @click="onReset">重置</el-button> -->
</el-form-item>
</el-form>
</div>
<div class="gva-table-box">
<el-table :data="assessList">
<!-- <el-table-column
type="selection"
width="55"
/> -->
<el-table-column align="left" label="所属考核类别" prop="parentTitle"/>
<el-table-column align="left" label="考核项目名称" prop="title"/>
<el-table-column align="left" label="考核项目说明" prop="content"/>
<el-table-column align="left" fixed="right" label="操作" width="200">
<template #default="scope">
<el-button type="primary" round @click="checked(scope.row)">选中</el-button>
</template>
</el-table-column>
</el-table>
<div class="gva-pagination">
<el-pagination
:current-page="projectSearchInfo.page"
:page-size="projectSearchInfo.pageSize"
:page-sizes="[10, 30, 50, 100]"
:total="total"
layout="total, sizes, prev, pager, next, jumper"
@current-change="handleCurrentChange"
@size-change="handleSizeChange"
/>
</div>
</div>
<!-- <span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="dialogVisible = false"> </el-button>
</span> -->
</el-dialog>
</div>
</template>
<script>
import {
dutyclasslist
} from '@/api/duty/dimension'
import {
assessList,
} from '@/api/duty/project'
export default {
data() {
return {
projectTitle:'',
total:'',
searchList:{
page:1,
pagesize:10000,
},
dutyclasslist:{},
projectSearchInfo:{
page: 1,
pageSize: 10,
state:1,
},
dialogVisible: false,
assessList:null,
}
},
created () {
this.getProjectList();
this.getDutyclasslist();
},
methods: {
//
onSubmit() {
this.page = 1
this.pageSize = 10
this.getProjectList()
},
// pagesize
handleSizeChange(val) {
this.projectSearchInfo.pageSize=val
},
//
handleCurrentChange(val) {
this.projectSearchInfo.page=val
},
//
async getDutyclasslist(){
const res = await dutyclasslist(this.searchList)
this.dutyclasslist=res.data.list;
},
//
showDialog(){
this.dialogVisible=true;
},
//
async getProjectList(){
const res = await assessList(this.projectSearchInfo)
this.assessList=res.data.list;
this.projectSearchInfo.page=res.data.page;
this.projectSearchInfo.pageSize=res.data.pageSize;
this.total=res.data.total;
},
//
checked(row){
this.projectTitle=row.title;
this.$emit('checkedInfo',row)
this.dialogVisible=false
},
}
}
</script>
<style lang="scss" scoped>
</style>

9
src/icons/index.js

@ -0,0 +1,9 @@
import Vue from 'vue'
import SvgIcon from '@/components/SvgIcon'// svg component
// register globally
Vue.component('svg-icon', SvgIcon)
const req = require.context('./svg', false, /\.svg$/)
const requireAll = requireContext => requireContext.keys().map(requireContext)
requireAll(req)

1
src/icons/svg/dashboard.svg

@ -0,0 +1 @@
<svg width="128" height="100" xmlns="http://www.w3.org/2000/svg"><path d="M27.429 63.638c0-2.508-.893-4.65-2.679-6.424-1.786-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.465 2.662-1.785 1.774-2.678 3.916-2.678 6.424 0 2.508.893 4.65 2.678 6.424 1.786 1.775 3.94 2.662 6.465 2.662 2.524 0 4.678-.887 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zm13.714-31.801c0-2.508-.893-4.65-2.679-6.424-1.785-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zM71.714 65.98l7.215-27.116c.285-1.23.107-2.378-.536-3.443-.643-1.064-1.56-1.762-2.75-2.094-1.19-.33-2.333-.177-3.429.462-1.095.639-1.81 1.573-2.143 2.804l-7.214 27.116c-2.857.237-5.405 1.266-7.643 3.088-2.238 1.822-3.738 4.152-4.5 6.992-.952 3.644-.476 7.098 1.429 10.364 1.905 3.265 4.69 5.37 8.357 6.317 3.667.947 7.143.474 10.429-1.42 3.285-1.892 5.404-4.66 6.357-8.305.762-2.84.619-5.607-.429-8.305-1.047-2.697-2.762-4.85-5.143-6.46zm47.143-2.342c0-2.508-.893-4.65-2.678-6.424-1.786-1.775-3.94-2.662-6.465-2.662-2.524 0-4.678.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.786 1.775 3.94 2.662 6.464 2.662 2.524 0 4.679-.887 6.465-2.662 1.785-1.775 2.678-3.916 2.678-6.424zm-45.714-45.43c0-2.509-.893-4.65-2.679-6.425C68.68 10.01 66.524 9.122 64 9.122c-2.524 0-4.679.887-6.464 2.661-1.786 1.775-2.679 3.916-2.679 6.425 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zm32 13.629c0-2.508-.893-4.65-2.679-6.424-1.785-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zM128 63.638c0 12.351-3.357 23.78-10.071 34.286-.905 1.372-2.19 2.058-3.858 2.058H13.93c-1.667 0-2.953-.686-3.858-2.058C3.357 87.465 0 76.037 0 63.638c0-8.613 1.69-16.847 5.071-24.703C8.452 31.08 13 24.312 18.714 18.634c5.715-5.68 12.524-10.199 20.429-13.559C47.048 1.715 55.333.035 64 .035c8.667 0 16.952 1.68 24.857 5.04 7.905 3.36 14.714 7.88 20.429 13.559 5.714 5.678 10.262 12.446 13.643 20.301 3.38 7.856 5.071 16.09 5.071 24.703z"/></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

1
src/icons/svg/example.svg

@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M96.258 57.462h31.421C124.794 27.323 100.426 2.956 70.287.07v31.422a32.856 32.856 0 0 1 25.971 25.97zm-38.796-25.97V.07C27.323 2.956 2.956 27.323.07 57.462h31.422a32.856 32.856 0 0 1 25.97-25.97zm12.825 64.766v31.421c30.46-2.885 54.507-27.253 57.713-57.712H96.579c-2.886 13.466-13.146 23.726-26.292 26.291zM31.492 70.287H.07c2.886 30.46 27.253 54.507 57.713 57.713V96.579c-13.466-2.886-23.726-13.146-26.291-26.292z"/></svg>

After

Width:  |  Height:  |  Size: 497 B

1
src/icons/svg/eye-open.svg

@ -0,0 +1 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="128" height="128"><defs><style/></defs><path d="M512 128q69.675 0 135.51 21.163t115.498 54.997 93.483 74.837 73.685 82.006 51.67 74.837 32.17 54.827L1024 512q-2.347 4.992-6.315 13.483T998.87 560.17t-31.658 51.669-44.331 59.99-56.832 64.34-69.504 60.16-82.347 51.5-94.848 34.687T512 896q-69.675 0-135.51-21.163t-115.498-54.826-93.483-74.326-73.685-81.493-51.67-74.496-32.17-54.997L0 513.707q2.347-4.992 6.315-13.483t18.816-34.816 31.658-51.84 44.331-60.33 56.832-64.683 69.504-60.331 82.347-51.84 94.848-34.816T512 128.085zm0 85.333q-46.677 0-91.648 12.331t-81.152 31.83-70.656 47.146-59.648 54.485-48.853 57.686-37.675 52.821-26.325 43.99q12.33 21.674 26.325 43.52t37.675 52.351 48.853 57.003 59.648 53.845T339.2 767.02t81.152 31.488T512 810.667t91.648-12.331 81.152-31.659 70.656-46.848 59.648-54.186 48.853-57.344 37.675-52.651T927.957 512q-12.33-21.675-26.325-43.648t-37.675-52.65-48.853-57.345-59.648-54.186-70.656-46.848-81.152-31.659T512 213.334zm0 128q70.656 0 120.661 50.006T682.667 512 632.66 632.661 512 682.667 391.339 632.66 341.333 512t50.006-120.661T512 341.333zm0 85.334q-35.328 0-60.33 25.002T426.666 512t25.002 60.33T512 597.334t60.33-25.002T597.334 512t-25.002-60.33T512 426.666z"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

1
src/icons/svg/eye.svg

@ -0,0 +1 @@
<svg width="128" height="64" xmlns="http://www.w3.org/2000/svg"><path d="M127.072 7.994c1.37-2.208.914-5.152-.914-6.87-2.056-1.717-4.797-1.226-6.396.982-.229.245-25.586 32.382-55.74 32.382-29.24 0-55.74-32.382-55.968-32.627-1.6-1.963-4.57-2.208-6.397-.49C-.17 3.086-.399 6.275 1.2 8.238c.457.736 5.94 7.36 14.62 14.72L4.17 35.96c-1.828 1.963-1.6 5.152.228 6.87.457.98 1.6 1.471 2.742 1.471s2.284-.49 3.198-1.472l12.564-13.983c5.94 4.416 13.021 8.587 20.788 11.53l-4.797 17.418c-.685 2.699.686 5.397 3.198 6.133h1.37c2.057 0 3.884-1.472 4.341-3.68L52.6 42.83c3.655.736 7.538 1.227 11.422 1.227 3.883 0 7.767-.49 11.422-1.227l4.797 17.173c.457 2.208 2.513 3.68 4.34 3.68.457 0 .914 0 1.143-.246 2.513-.736 3.883-3.434 3.198-6.133l-4.797-17.172c7.767-2.944 14.848-7.114 20.788-11.53l12.336 13.738c.913.981 2.056 1.472 3.198 1.472s2.284-.49 3.198-1.472c1.828-1.963 1.828-4.906.228-6.87l-11.65-13.001c9.366-7.36 14.849-14.474 14.849-14.474z"/></svg>

After

Width:  |  Height:  |  Size: 944 B

1
src/icons/svg/form.svg

@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M84.068 23.784c-1.02 0-1.877-.32-2.572-.96a8.588 8.588 0 0 1-1.738-2.237 11.524 11.524 0 0 1-1.042-2.621c-.232-.895-.348-1.641-.348-2.238V0h.278c.834 0 1.622.085 2.363.256.742.17 1.645.575 2.711 1.214 1.066.64 2.363 1.535 3.892 2.686 1.53 1.15 3.453 2.664 5.77 4.54 2.502 2.045 4.494 3.771 5.977 5.178 1.483 1.406 2.618 2.6 3.406 3.58.787.98 1.274 1.812 1.46 2.494.185.682.277 1.278.277 1.79v2.046H84.068zM127.3 84.01c.278.682.464 1.535.556 2.558.093 1.023-.37 2.003-1.39 2.94-.463.427-.88.832-1.25 1.215-.372.384-.696.704-.974.96a6.69 6.69 0 0 1-.973.767l-11.816-10.741a44.331 44.331 0 0 0 1.877-1.535 31.028 31.028 0 0 1 1.737-1.406c1.112-.938 2.317-1.343 3.615-1.215 1.297.128 2.363.405 3.197.83.927.427 1.923 1.173 2.989 2.239 1.065 1.065 1.876 2.195 2.432 3.388zM78.23 95.902c2.038 0 3.752-.511 5.143-1.534l-26.969 25.83H18.037c-1.761 0-3.684-.47-5.77-1.407a24.549 24.549 0 0 1-5.838-3.709 21.373 21.373 0 0 1-4.518-5.306c-1.204-2.003-1.807-4.07-1.807-6.202V16.495c0-1.79.44-3.665 1.32-5.626A18.41 18.41 0 0 1 5.04 5.562a21.798 21.798 0 0 1 5.213-3.964C12.198.533 14.237 0 16.37 0h53.24v15.984c0 1.62.278 3.367.834 5.242a16.704 16.704 0 0 0 2.572 5.179c1.159 1.577 2.665 2.898 4.518 3.964 1.853 1.066 4.078 1.598 6.673 1.598h20.295v42.325L85.458 92.45c1.02-1.364 1.529-2.856 1.529-4.476 0-2.216-.857-4.113-2.572-5.69-1.714-1.577-3.776-2.366-6.186-2.366H26.1c-2.409 0-4.448.789-6.116 2.366-1.668 1.577-2.502 3.474-2.502 5.69 0 2.217.834 4.092 2.502 5.626 1.668 1.535 3.707 2.302 6.117 2.302h52.13zM26.1 47.951c-2.41 0-4.449.789-6.117 2.366-1.668 1.577-2.502 3.473-2.502 5.69 0 2.216.834 4.092 2.502 5.626 1.668 1.534 3.707 2.302 6.117 2.302h52.13c2.409 0 4.47-.768 6.185-2.302 1.715-1.534 2.572-3.41 2.572-5.626 0-2.217-.857-4.113-2.572-5.69-1.714-1.577-3.776-2.366-6.186-2.366H26.1zm52.407 64.063l1.807-1.663 3.476-3.196a479.75 479.75 0 0 0 4.587-4.284 500.757 500.757 0 0 1 5.004-4.667c3.985-3.666 8.48-7.758 13.485-12.276l11.677 10.741-13.485 12.404-5.004 4.603-4.587 4.22a179.46 179.46 0 0 0-3.267 3.068c-.88.853-1.367 1.322-1.46 1.407-.463.341-.973.703-1.529 1.087-.556.383-1.112.703-1.668.959-.556.256-1.413.575-2.572.959a83.5 83.5 0 0 1-3.545 1.087 72.2 72.2 0 0 1-3.475.895c-1.112.256-1.946.426-2.502.511-1.112.17-1.854.043-2.224-.383-.371-.426-.464-1.151-.278-2.174.092-.511.278-1.279.556-2.302.278-1.023.602-2.067.973-3.132l1.042-3.005c.325-.938.58-1.577.765-1.918a10.157 10.157 0 0 1 2.224-2.941z"/></svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

1
src/icons/svg/link.svg

@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M115.625 127.937H.063V12.375h57.781v12.374H12.438v90.813h90.813V70.156h12.374z"/><path d="M116.426 2.821l8.753 8.753-56.734 56.734-8.753-8.745z"/><path d="M127.893 37.982h-12.375V12.375H88.706V0h39.187z"/></svg>

After

Width:  |  Height:  |  Size: 285 B

1
src/icons/svg/nested.svg

@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M.002 9.2c0 5.044 3.58 9.133 7.998 9.133 4.417 0 7.997-4.089 7.997-9.133 0-5.043-3.58-9.132-7.997-9.132S.002 4.157.002 9.2zM31.997.066h95.981V18.33H31.997V.066zm0 45.669c0 5.044 3.58 9.132 7.998 9.132 4.417 0 7.997-4.088 7.997-9.132 0-3.263-1.524-6.278-3.998-7.91-2.475-1.63-5.524-1.63-7.998 0-2.475 1.632-4 4.647-4 7.91zM63.992 36.6h63.986v18.265H63.992V36.6zm-31.995 82.2c0 5.043 3.58 9.132 7.998 9.132 4.417 0 7.997-4.089 7.997-9.132 0-5.044-3.58-9.133-7.997-9.133s-7.998 4.089-7.998 9.133zm31.995-9.131h63.986v18.265H63.992V109.67zm0-27.404c0 5.044 3.58 9.133 7.998 9.133 4.417 0 7.997-4.089 7.997-9.133 0-3.263-1.524-6.277-3.998-7.909-2.475-1.631-5.524-1.631-7.998 0-2.475 1.632-4 4.646-4 7.91zm31.995-9.13h31.991V91.4H95.987V73.135z"/></svg>

After

Width:  |  Height:  |  Size: 821 B

1
src/icons/svg/password.svg

@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M108.8 44.322H89.6v-5.36c0-9.04-3.308-24.163-25.6-24.163-23.145 0-25.6 16.881-25.6 24.162v5.361H19.2v-5.36C19.2 15.281 36.798 0 64 0c27.202 0 44.8 15.281 44.8 38.961v5.361zm-32 39.356c0-5.44-5.763-9.832-12.8-9.832-7.037 0-12.8 4.392-12.8 9.832 0 3.682 2.567 6.808 6.407 8.477v11.205c0 2.718 2.875 4.962 6.4 4.962 3.524 0 6.4-2.244 6.4-4.962V92.155c3.833-1.669 6.393-4.795 6.393-8.477zM128 64v49.201c0 8.158-8.645 14.799-19.2 14.799H19.2C8.651 128 0 121.359 0 113.201V64c0-8.153 8.645-14.799 19.2-14.799h89.6c10.555 0 19.2 6.646 19.2 14.799z"/></svg>

After

Width:  |  Height:  |  Size: 623 B

1
src/icons/svg/table.svg

@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M.006.064h127.988v31.104H.006V.064zm0 38.016h38.396v41.472H.006V38.08zm0 48.384h38.396v41.472H.006V86.464zM44.802 38.08h38.396v41.472H44.802V38.08zm0 48.384h38.396v41.472H44.802V86.464zM89.598 38.08h38.396v41.472H89.598zm0 48.384h38.396v41.472H89.598z"/><path d="M.006.064h127.988v31.104H.006V.064zm0 38.016h38.396v41.472H.006V38.08zm0 48.384h38.396v41.472H.006V86.464zM44.802 38.08h38.396v41.472H44.802V38.08zm0 48.384h38.396v41.472H44.802V86.464zM89.598 38.08h38.396v41.472H89.598zm0 48.384h38.396v41.472H89.598z"/></svg>

After

Width:  |  Height:  |  Size: 597 B

1
src/icons/svg/tree.svg

@ -0,0 +1 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M126.713 90.023c.858.985 1.287 2.134 1.287 3.447v29.553c0 1.423-.429 2.6-1.287 3.53-.858.93-1.907 1.395-3.146 1.395H97.824c-1.145 0-2.146-.465-3.004-1.395-.858-.93-1.287-2.107-1.287-3.53V93.47c0-.875.19-1.696.572-2.462.382-.766.906-1.368 1.573-1.806a3.84 3.84 0 0 1 2.146-.657h9.725V69.007a3.84 3.84 0 0 0-.43-1.806 3.569 3.569 0 0 0-1.143-1.313 2.714 2.714 0 0 0-1.573-.492h-36.47v23.149h9.725c1.144 0 2.145.492 3.004 1.478.858.985 1.287 2.134 1.287 3.447v29.553c0 .876-.191 1.696-.573 2.463-.38.766-.905 1.368-1.573 1.806a3.84 3.84 0 0 1-2.145.656H51.915a3.84 3.84 0 0 1-2.145-.656c-.668-.438-1.216-1.04-1.645-1.806a4.96 4.96 0 0 1-.644-2.463V93.47c0-1.313.43-2.462 1.288-3.447.858-.986 1.907-1.478 3.146-1.478h9.582v-23.15h-37.9c-.953 0-1.74.356-2.359 1.068-.62.711-.93 1.56-.93 2.544v19.538h9.726c1.239 0 2.264.492 3.074 1.478.81.985 1.216 2.134 1.216 3.447v29.553c0 1.423-.405 2.6-1.216 3.53-.81.93-1.835 1.395-3.074 1.395H4.29c-.476 0-.93-.082-1.358-.246a4.1 4.1 0 0 1-1.144-.657 4.658 4.658 0 0 1-.93-1.067 5.186 5.186 0 0 1-.643-1.395 5.566 5.566 0 0 1-.215-1.56V93.47c0-.437.048-.875.143-1.313a3.95 3.95 0 0 1 .429-1.15c.19-.328.429-.656.715-.984.286-.329.572-.602.858-.821.286-.22.62-.383 1.001-.493.382-.11.763-.164 1.144-.164h9.726V61.619c0-.985.31-1.833.93-2.544.619-.712 1.358-1.068 2.216-1.068h44.335V39.62h-9.582c-1.24 0-2.288-.492-3.146-1.477a5.09 5.09 0 0 1-1.287-3.448V5.14c0-1.423.429-2.627 1.287-3.612.858-.985 1.907-1.477 3.146-1.477h25.743c.763 0 1.478.246 2.145.739a5.17 5.17 0 0 1 1.573 1.888c.382.766.573 1.587.573 2.462v29.553c0 1.313-.43 2.463-1.287 3.448-.859.985-1.86 1.477-3.004 1.477h-9.725v18.389h42.762c.954 0 1.74.355 2.36 1.067.62.711.93 1.56.93 2.545v26.925h9.582c1.239 0 2.288.492 3.146 1.478z"/></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

1
src/icons/svg/user.svg

@ -0,0 +1 @@
<svg width="130" height="130" xmlns="http://www.w3.org/2000/svg"><path d="M63.444 64.996c20.633 0 37.359-14.308 37.359-31.953 0-17.649-16.726-31.952-37.359-31.952-20.631 0-37.36 14.303-37.358 31.952 0 17.645 16.727 31.953 37.359 31.953zM80.57 75.65H49.434c-26.652 0-48.26 18.477-48.26 41.27v2.664c0 9.316 21.608 9.325 48.26 9.325H80.57c26.649 0 48.256-.344 48.256-9.325v-2.663c0-22.794-21.605-41.271-48.256-41.271z" stroke="#979797"/></svg>

After

Width:  |  Height:  |  Size: 440 B

22
src/icons/svgo.yml

@ -0,0 +1,22 @@
# replace default config
# multipass: true
# full: true
plugins:
# - name
#
# or:
# - name: false
# - name: true
#
# or:
# - name:
# param1: 1
# param2: 2
- removeAttrs:
attrs:
- 'fill'
- 'fill-rule'

48
src/layout/components/AppMain.vue

@ -0,0 +1,48 @@
<template>
<section class="app-main">
<transition name="fade-transform" mode="out-in">
<router-view :key="key" />
</transition>
<!-- <router-view /> -->
<!-- <router-view :key="key" /> -->
</section>
</template>
<script>
export default {
name: 'AppMain',
computed: {
key() {
console.log("AppMain")
console.log("AppMain")
console.log(this.$route.path)
console.log(this.$route.fullPath)
return this.$route.fullPath
}
}
}
</script>
<style scoped>
.app-main {
/*50 = navbar */
min-height: calc(100vh - 50px);
width: 100%;
position: relative;
overflow: hidden;
padding: 10px;
}
.fixed-header+.app-main {
padding-top: 50px;
}
</style>
<style lang="scss">
// fix css style bug in open el-dialog
.el-popup-parent--hidden {
.fixed-header {
padding-right: 15px;
}
}
</style>

154
src/layout/components/Navbar.vue

@ -0,0 +1,154 @@
<template>
<div class="navbar">
<hamburger :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
<breadcrumb class="breadcrumb-container" />
<div class="right-menu">
<el-dropdown class="avatar-container" trigger="click">
<div class="avatar-wrapper">
<!-- <img :src="avatar+'?imageView2/1/w/80/h/80'" class="user-avatar"> -->
<div>
{{userInfo.name}}{{userInfo.number}}
</div>
<i class="el-icon-caret-bottom" />
</div>
<el-dropdown-menu slot="dropdown" class="user-dropdown">
<router-link to="/">
<el-dropdown-item>
个人信息
</el-dropdown-item>
</router-link>
<!-- <a target="_blank" href="https://github.com/PanJiaChen/vue-admin-template/">
<el-dropdown-item>Github</el-dropdown-item>
</a>
<a target="_blank" href="https://panjiachen.github.io/vue-element-admin-site/#/">
<el-dropdown-item>Docs</el-dropdown-item>
</a> -->
<el-dropdown-item divided @click.native="logout">
<span style="display:block;">退 </span>
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
</div>
</template>
<script>
import { mapGetters } from 'vuex'
import Breadcrumb from '@/components/Breadcrumb'
import Hamburger from '@/components/Hamburger'
import { signout } from '@/api/user'
export default {
data () {
return {
userInfo:{}
}
},
components: {
Breadcrumb,
Hamburger
},
computed: {
...mapGetters([
'sidebar',
'avatar'
])
},
created () {
if (JSON.parse(sessionStorage.getItem('userinfo'))==null) {
this.$router.push('/login')
}
this.userInfo=JSON.parse(sessionStorage.getItem('userinfo'));
},
methods: {
toggleSideBar() {
this.$store.dispatch('app/toggleSideBar')
},
async logout() {
const res = await signout()
this.$store.commit('user/loginOut')
}
}
}
</script>
<style lang="scss" scoped>
.navbar {
height: 50px;
overflow: hidden;
position: relative;
background: #fff;
box-shadow: 0 1px 4px rgba(0,21,41,.08);
.hamburger-container {
line-height: 46px;
height: 100%;
float: left;
cursor: pointer;
transition: background .3s;
-webkit-tap-highlight-color:transparent;
&:hover {
background: rgba(0, 0, 0, .025)
}
}
.breadcrumb-container {
float: left;
}
.right-menu {
float: right;
height: 100%;
line-height: 50px;
&:focus {
outline: none;
}
.right-menu-item {
display: inline-block;
padding: 0 8px;
height: 100%;
font-size: 18px;
color: #5a5e66;
vertical-align: text-bottom;
&.hover-effect {
cursor: pointer;
transition: background .3s;
&:hover {
background: rgba(0, 0, 0, .025)
}
}
}
.avatar-container {
margin-right: 30px;
.avatar-wrapper {
margin-top: 5px;
position: relative;
.user-avatar {
cursor: pointer;
width: 40px;
height: 40px;
border-radius: 10px;
}
.el-icon-caret-bottom {
cursor: pointer;
position: absolute;
right: -20px;
top: 25px;
font-size: 12px;
}
}
}
}
}
</style>

26
src/layout/components/Sidebar/FixiOSBug.js

@ -0,0 +1,26 @@
export default {
computed: {
device() {
return this.$store.state.app.device
}
},
mounted() {
// In order to fix the click on menu on the ios device will trigger the mouseleave bug
// https://github.com/PanJiaChen/vue-element-admin/issues/1135
this.fixBugIniOS()
},
methods: {
fixBugIniOS() {
const $subMenu = this.$refs.subMenu
if ($subMenu) {
const handleMouseleave = $subMenu.handleMouseleave
$subMenu.handleMouseleave = (e) => {
if (this.device === 'mobile') {
return
}
handleMouseleave(e)
}
}
}
}
}

41
src/layout/components/Sidebar/Item.vue

@ -0,0 +1,41 @@
<script>
export default {
name: 'MenuItem',
functional: true,
props: {
icon: {
type: String,
default: ''
},
title: {
type: String,
default: ''
}
},
render(h, context) {
const { icon, title } = context.props
const vnodes = []
if (icon) {
if (icon.includes('el-icon')) {
vnodes.push(<i class={[icon, 'sub-el-icon']} />)
} else {
vnodes.push(<svg-icon icon-class={icon}/>)
}
}
if (title) {
vnodes.push(<span slot='title'>{(title)}</span>)
}
return vnodes
}
}
</script>
<style scoped>
.sub-el-icon {
color: currentColor;
width: 1em;
height: 1em;
}
</style>

49
src/layout/components/Sidebar/Link.vue

@ -0,0 +1,49 @@
<template>
<component :is="type" v-bind="linkProps(to)">
<slot />
</component>
</template>
<script>
import { isExternal } from '@/utils/validate'
export default {
props: {
to: {
type: String,
required: true
}
},
computed: {
isExternal() {
return isExternal(this.to)
},
type() {
if (this.isExternal) {
return 'a'
}
return 'router-link'
}
},
methods: {
linkProps(to) {
console.log("to")
console.log(to)
console.log("this.isExternal")
console.log(this.isExternal)
console.log("this.type")
console.log(this.type)
if (this.isExternal) {
return {
href: to,
target: '_blank',
rel: 'noopener'
}
}
return {
to: to
}
}
}
}
</script>

82
src/layout/components/Sidebar/Logo.vue

@ -0,0 +1,82 @@
<template>
<div class="sidebar-logo-container" :class="{'collapse':collapse}">
<transition name="sidebarLogoFade">
<router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/">
<img v-if="logo" :src="logo" class="sidebar-logo">
<h1 v-else class="sidebar-title">{{ title }} </h1>
</router-link>
<router-link v-else key="expand" class="sidebar-logo-link" to="/">
<img v-if="logo" :src="logo" class="sidebar-logo">
<h1 class="sidebar-title">{{ title }} </h1>
</router-link>
</transition>
</div>
</template>
<script>
export default {
name: 'SidebarLogo',
props: {
collapse: {
type: Boolean,
required: true
}
},
data() {
return {
title: 'Vue Admin Template',
logo: 'https://wpimg.wallstcn.com/69a1c46c-eb1c-4b46-8bd4-e9e686ef5251.png'
}
}
}
</script>
<style lang="scss" scoped>
.sidebarLogoFade-enter-active {
transition: opacity 1.5s;
}
.sidebarLogoFade-enter,
.sidebarLogoFade-leave-to {
opacity: 0;
}
.sidebar-logo-container {
position: relative;
width: 100%;
height: 50px;
line-height: 50px;
background: #2b2f3a;
text-align: center;
overflow: hidden;
& .sidebar-logo-link {
height: 100%;
width: 100%;
& .sidebar-logo {
width: 32px;
height: 32px;
vertical-align: middle;
margin-right: 12px;
}
& .sidebar-title {
display: inline-block;
margin: 0;
color: #fff;
font-weight: 600;
line-height: 50px;
font-size: 14px;
font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif;
vertical-align: middle;
}
}
&.collapse {
.sidebar-logo {
margin-right: 0px;
}
}
}
</style>

95
src/layout/components/Sidebar/SidebarItem copy.vue

@ -0,0 +1,95 @@
<template>
<div v-if="!item.hidden">
<template v-if="hasOneShowingChild(item.children,item) && (!onlyOneChild.children||onlyOneChild.noShowingChildren)&&!item.alwaysShow">
<app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path)">
<el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{'submenu-title-noDropdown':!isNest}">
<item :icon="onlyOneChild.meta.icon||(item.meta&&item.meta.icon)" :title="onlyOneChild.meta.title" />
</el-menu-item>
</app-link>
</template>
<el-submenu v-else ref="subMenu" :index="resolvePath(item.path)" popper-append-to-body>
<template slot="title">
<item v-if="item.meta" :icon="item.meta && item.meta.icon" :title="item.meta.title" />
</template>
<sidebar-item
v-for="child in item.children"
:key="child.path"
:is-nest="true"
:item="child"
:base-path="resolvePath(child.path)"
class="nest-menu"
/>
</el-submenu>
</div>
</template>
<script>
import path from 'path'
import { isExternal } from '@/utils/validate'
import Item from './Item'
import AppLink from './Link'
import FixiOSBug from './FixiOSBug'
export default {
name: 'SidebarItem',
components: { Item, AppLink },
mixins: [FixiOSBug],
props: {
// route object
item: {
type: Object,
required: true
},
isNest: {
type: Boolean,
default: false
},
basePath: {
type: String,
default: ''
}
},
data() {
// To fix https://github.com/PanJiaChen/vue-admin-template/issues/237
// TODO: refactor with render function
this.onlyOneChild = null
return {}
},
methods: {
hasOneShowingChild(children = [], parent) {
const showingChildren = children.filter(item => {
if (item.hidden) {
return false
} else {
// Temp set(will be used if only has one showing child)
this.onlyOneChild = item
return true
}
})
// When there is only one child router, the child router is displayed by default
if (showingChildren.length === 1) {
return true
}
// Show parent if there are no child router to display
if (showingChildren.length === 0) {
this.onlyOneChild = { ... parent, path: '', noShowingChildren: true }
return true
}
return false
},
resolvePath(routePath) {
if (isExternal(routePath)) {
return routePath
}
if (isExternal(this.basePath)) {
return this.basePath
}
return path.resolve(this.basePath, routePath)
}
}
}
</script>

95
src/layout/components/Sidebar/SidebarItem.vue

@ -0,0 +1,95 @@
<template>
<div>
<template v-if="hasOneShowingChild(item.child,item) && (!onlyOneChild.child||onlyOneChild.noShowingChildren)&&!item.alwaysShow">
<app-link v-if="onlyOneChild.title" :to="resolvePath(onlyOneChild.apiUrl)">
<el-menu-item :index="resolvePath(onlyOneChild.apiUrl)" :class="{'submenu-title-noDropdown':!isNest}">
<item :title="onlyOneChild.title" />
</el-menu-item>
</app-link>
</template>
<el-submenu v-else ref="subMenu" :index="resolvePath(item.apiUrl)" popper-append-to-body>
<template slot="title">
<item v-if="item.title" :title="item.title" />
</template>
<sidebar-item
v-for="child in item.child"
:key="child.id"
:is-nest="true"
:item="child"
:base-path="resolvePath(child.apiUrl)"
class="nest-menu"
/>
</el-submenu>
</div>
</template>
<script>
import path from 'path'
import { isExternal } from '@/utils/validate'
import Item from './Item'
import AppLink from './Link'
import FixiOSBug from './FixiOSBug'
export default {
name: 'SidebarItem',
components: { Item, AppLink },
mixins: [FixiOSBug],
props: {
// route object
item: {
type: Object,
required: true
},
isNest: {
type: Boolean,
default: false
},
basePath: {
type: String,
default: ''
}
},
data() {
// To fix https://github.com/PanJiaChen/vue-admin-template/issues/237
// TODO: refactor with render function
this.onlyOneChild = null
return {}
},
methods: {
hasOneShowingChild(children = [], parent) {
const showingChildren = children.filter(item => {
if (item.hidden) {
return false
} else {
// Temp set(will be used if only has one showing child)
this.onlyOneChild = item
return true
}
})
// When there is only one child router, the child router is displayed by default
if (showingChildren.length === 1) {
return true
}
// Show parent if there are no child router to display
if (showingChildren.length === 0) {
this.onlyOneChild = { ... parent, path: '', noShowingChildren: true }
return true
}
return false
},
resolvePath(routePath) {
if (isExternal(routePath)) {
return routePath
}
if (isExternal(this.basePath)) {
return this.basePath
}
return path.resolve(this.basePath, routePath)
}
}
}
</script>

95
src/layout/components/Sidebar/index.vue

@ -0,0 +1,95 @@
<template>
<div :class="{'has-logo':showLogo}">
<logo v-if="showLogo" :collapse="isCollapse" />
<el-scrollbar wrap-class="scrollbar-wrapper">
<!-- <el-menu
:default-active="activeMenu"
:collapse="isCollapse"
:background-color="variables.menuBg"
:text-color="variables.menuText"
:unique-opened="false"
:active-text-color="variables.menuActiveText"
:collapse-transition="false"
mode="vertical"
>
<sidebar-item v-for="route in menu" :key="route.path" :item="route" :base-path="route.path" />
</el-menu> -->
<!-- <el-menu
:default-active="activeMenu"
:collapse="isCollapse"
:background-color="variables.menuBg"
:text-color="variables.menuText"
:unique-opened="false"
:active-text-color="variables.menuActiveText"
:collapse-transition="false"
mode="vertical"
>
<sidebar-item v-for="route in menu" :key="route.id" :item="route" :base-path="route.apiUrl" />
</el-menu> -->
<el-menu
:background-color="variables.menuBg"
:text-color="variables.menuText"
:default-active="$route.meta.pageId"
>
<template v-for="item in menu">
<router-link :to="item.apiUrl" :key="item.id" v-if="item.child.length===0">
<el-menu-item :index="item.id.toString()">
<i :class="item.icon"></i>
<span slot="title">{{item.title}}</span>
</el-menu-item>
</router-link>
<subMenu v-else :data="item" :key="item.id"></subMenu>
</template>
</el-menu>
</el-scrollbar>
</div>
</template>
<script>
import subMenu from "./subMenu";
import { mapGetters } from 'vuex'
import Logo from './Logo'
import SidebarItem from './SidebarItem'
import variables from '@/styles/variables.scss'
import { getmenu } from '@/api/user'
export default {
components: { SidebarItem, Logo,subMenu },
data () {
return {
menu:[],
}
},
async created () {
console.log(this.$router.options.routes)
const res = await getmenu()
this.menu=res.data.list
},
computed: {
...mapGetters([
'sidebar'
]),
// routes() {
// return this.$router.options.routes
// },
activeMenu() {
const route = this.$route
const { meta, path } = route
// if set path, the sidebar will highlight the path you set
if (meta.activeMenu) {
return meta.activeMenu
}
return path
},
showLogo() {
return this.$store.state.settings.sidebarLogo
},
variables() {
return variables
},
isCollapse() {
return !this.sidebar.opened
}
}
}
</script>

42
src/layout/components/Sidebar/subMenu copy.vue

@ -0,0 +1,42 @@
<template functional>
<el-submenu :index="props.data.id.toString()">
<template slot="title">
<i :class="props.data.icon"></i>
<span>{{props.data.title}}</span>
</template>
<template v-for="item in props.data.child">
<app-link :to="item.apiUrl" v-if="item.child.length===0" :key="item.id">
<el-menu-item class="subitem" :index="item.id.toString()">
<i :class="item.icon"></i>
<span slot="title">{{item.title}}</span>
</el-menu-item>
</app-link>
<!-- <router-link :to="item.apiUrl" :key="item.id" v-if="item.child.length===0">
<el-menu-item class="subitem" :index="item.id.toString()">
<i :class="item.icon"></i>
<span slot="title">{{item.title}}</span>
</el-menu-item>
</router-link> -->
<sub-menu v-else :data="item" :key="item.id"></sub-menu>
</template>
</el-submenu>
</template>
<script>
import AppLink from './Link'
export default {
name: "submenu",
components: { AppLink },
props: {
data: [Array, Object]
}
};
</script>
<style lang="scss" scoped>
.el-submenu {
.el-menu-item {
padding: 0;
}
}
</style>

44
src/layout/components/Sidebar/subMenu.vue

@ -0,0 +1,44 @@
<template functional>
<el-submenu :index="props.data.id.toString()">
<template slot="title">
<i :class="props.data.icon"></i>
<span>{{props.data.title}}</span>
</template>
<template v-for="item in props.data.child">
<!-- <router-link :to="item.apiUrl" v-if="item.child.length===0" :key="item.id"> -->
<router-link :to="{ path: item.apiUrl }" v-if="item.child.length===0" :key="item.id">
<el-menu-item class="subitem" :index="item.id.toString()">
<i :class="item.icon"></i>
<span slot="title">{{item.title}}</span>
</el-menu-item>
</router-link>
<!-- <component :is="type" v-bind="linkProps(to)">
<slot />
</component> -->
<!-- <applink :to="item.apiUrl" v-if="item.child.length===0" :key="item.id">
<el-menu-item class="subitem" :index="item.id.toString()">
<i :class="item.icon"></i>
<span slot="title">{{item.title}}</span>
</el-menu-item>
</applink> -->
<!-- <sub-menu v-else :data="item" :key="item.id"></sub-menu> -->
<sub-menu v-else :data="item" ></sub-menu>
</template>
</el-submenu>
</template>
<script>
import applink from '../Sidebar/Link.vue'
export default {
name: "submenu",
components: { applink },
props: {
data: [Array, Object]
}
}
</script>
<style lang="scss" scoped>
</style>

94
src/layout/components/TagsView/ScrollPane.vue

@ -0,0 +1,94 @@
<template>
<el-scrollbar ref="scrollContainer" :vertical="false" class="scroll-container" @wheel.native.prevent="handleScroll">
<slot />
</el-scrollbar>
</template>
<script>
const tagAndTagSpacing = 4 // tagAndTagSpacing
export default {
name: 'ScrollPane',
data() {
return {
left: 0
}
},
computed: {
scrollWrapper() {
return this.$refs.scrollContainer.$refs.wrap
}
},
mounted() {
this.scrollWrapper.addEventListener('scroll', this.emitScroll, true)
},
beforeDestroy() {
this.scrollWrapper.removeEventListener('scroll', this.emitScroll)
},
methods: {
handleScroll(e) {
const eventDelta = e.wheelDelta || -e.deltaY * 40
const $scrollWrapper = this.scrollWrapper
$scrollWrapper.scrollLeft = $scrollWrapper.scrollLeft + eventDelta / 4
},
emitScroll() {
this.$emit('scroll')
},
moveToTarget(currentTag) {
const $container = this.$refs.scrollContainer.$el
const $containerWidth = $container.offsetWidth
const $scrollWrapper = this.scrollWrapper
const tagList = this.$parent.$refs.tag
let firstTag = null
let lastTag = null
// find first tag and last tag
if (tagList.length > 0) {
firstTag = tagList[0]
lastTag = tagList[tagList.length - 1]
}
if (firstTag === currentTag) {
$scrollWrapper.scrollLeft = 0
} else if (lastTag === currentTag) {
$scrollWrapper.scrollLeft = $scrollWrapper.scrollWidth - $containerWidth
} else {
// find preTag and nextTag
const currentIndex = tagList.findIndex(item => item === currentTag)
const prevTag = tagList[currentIndex - 1]
const nextTag = tagList[currentIndex + 1]
// the tag's offsetLeft after of nextTag
const afterNextTagOffsetLeft = nextTag.$el.offsetLeft + nextTag.$el.offsetWidth + tagAndTagSpacing
// the tag's offsetLeft before of prevTag
const beforePrevTagOffsetLeft = prevTag.$el.offsetLeft - tagAndTagSpacing
if (afterNextTagOffsetLeft > $scrollWrapper.scrollLeft + $containerWidth) {
$scrollWrapper.scrollLeft = afterNextTagOffsetLeft - $containerWidth
} else if (beforePrevTagOffsetLeft < $scrollWrapper.scrollLeft) {
$scrollWrapper.scrollLeft = beforePrevTagOffsetLeft
}
}
}
}
}
</script>
<style lang="scss" scoped>
.scroll-container {
white-space: nowrap;
position: relative;
overflow: hidden;
width: 100%;
::v-deep {
.el-scrollbar__bar {
bottom: 0px;
}
.el-scrollbar__wrap {
height: 49px;
}
}
}
</style>

294
src/layout/components/TagsView/index.vue

@ -0,0 +1,294 @@
<template>
<div id="tags-view-container" class="tags-view-container">
<scroll-pane ref="scrollPane" class="tags-view-wrapper" @scroll="handleScroll">
<router-link
v-for="tag in visitedViews"
ref="tag"
:key="tag.path"
:class="isActive(tag)?'active':''"
:to="{ path: tag.path, query: tag.query, fullPath: tag.fullPath }"
tag="span"
class="tags-view-item"
@click.middle.native="!isAffix(tag)?closeSelectedTag(tag):''"
@contextmenu.prevent.native="openMenu(tag,$event)"
>
{{ generateTitle(tag.title) }}
<span v-if="!isAffix(tag)" class="el-icon-close" @click.prevent.stop="closeSelectedTag(tag)" />
</router-link>
</scroll-pane>
<ul v-show="visible" :style="{left:left+'px',top:top+'px'}" class="contextmenu">
<li @click="refreshSelectedTag(selectedTag)">{{ $t('tagsView.refresh') }}</li>
<li v-if="!isAffix(selectedTag)" @click="closeSelectedTag(selectedTag)">{{ $t('tagsView.close') }}</li>
<li @click="closeOthersTags">{{ $t('tagsView.closeOthers') }}</li>
<li @click="closeAllTags(selectedTag)">{{ $t('tagsView.closeAll') }}</li>
</ul>
</div>
</template>
<script>
import ScrollPane from './ScrollPane'
import { generateTitle } from '@/utils/i18n'
import path from 'path'
export default {
components: { ScrollPane },
data() {
return {
visible: false,
top: 0,
left: 0,
selectedTag: {},
affixTags: []
}
},
computed: {
visitedViews() {
return this.$store.state.tagsView.visitedViews
},
routes() {
return this.$store.state.permission.routes
}
},
watch: {
$route() {
this.addTags()
this.moveToCurrentTag()
},
visible(value) {
if (value) {
document.body.addEventListener('click', this.closeMenu)
} else {
document.body.removeEventListener('click', this.closeMenu)
}
}
},
mounted() {
this.initTags()
this.addTags()
},
methods: {
generateTitle, // generateTitle by vue-i18n
isActive(route) {
return route.path === this.$route.path
},
isAffix(tag) {
return tag.meta && tag.meta.affix
},
filterAffixTags(routes, basePath = '/') {
let tags = []
routes.forEach(route => {
if (route.meta && route.meta.affix) {
const tagPath = path.resolve(basePath, route.path)
tags.push({
fullPath: tagPath,
path: tagPath,
name: route.name,
meta: { ...route.meta }
})
}
if (route.children) {
const tempTags = this.filterAffixTags(route.children, route.path)
if (tempTags.length >= 1) {
tags = [...tags, ...tempTags]
}
}
})
return tags
},
initTags() {
const affixTags = this.affixTags = this.filterAffixTags(this.routes)
for (const tag of affixTags) {
// Must have tag name
if (tag.name) {
this.$store.dispatch('tagsView/addVisitedView', tag)
}
}
},
addTags() {
const { name } = this.$route
if (name) {
this.$store.dispatch('tagsView/addView', this.$route)
}
return false
},
moveToCurrentTag() {
const tags = this.$refs.tag
this.$nextTick(() => {
for (const tag of tags) {
if (tag.to.path === this.$route.path) {
this.$refs.scrollPane.moveToTarget(tag)
// when query is different then update
if (tag.to.fullPath !== this.$route.fullPath) {
this.$store.dispatch('tagsView/updateVisitedView', this.$route)
}
break
}
}
})
},
refreshSelectedTag(view) {
this.$store.dispatch('tagsView/delCachedView', view).then(() => {
const { fullPath } = view
this.$nextTick(() => {
this.$router.replace({
path: '/redirect' + fullPath
})
})
})
},
closeSelectedTag(view) {
this.$store.dispatch('tagsView/delView', view).then(({ visitedViews }) => {
if (this.isActive(view)) {
this.toLastView(visitedViews, view)
}
})
},
closeOthersTags() {
this.$router.push(this.selectedTag)
this.$store.dispatch('tagsView/delOthersViews', this.selectedTag).then(() => {
this.moveToCurrentTag()
})
},
closeAllTags(view) {
this.$store.dispatch('tagsView/delAllViews').then(({ visitedViews }) => {
if (this.affixTags.some(tag => tag.path === view.path)) {
return
}
this.toLastView(visitedViews, view)
})
},
toLastView(visitedViews, view) {
const latestView = visitedViews.slice(-1)[0]
if (latestView) {
this.$router.push(latestView.fullPath)
} else {
// now the default is to redirect to the home page if there is no tags-view,
// you can adjust it according to your needs.
if (view.name === 'Dashboard') {
// to reload home page
this.$router.replace({ path: '/redirect' + view.fullPath })
} else {
this.$router.push('/')
}
}
},
openMenu(tag, e) {
const menuMinWidth = 105
const offsetLeft = this.$el.getBoundingClientRect().left // container margin left
const offsetWidth = this.$el.offsetWidth // container width
const maxLeft = offsetWidth - menuMinWidth // left boundary
const left = e.clientX - offsetLeft + 15 // 15: margin right
if (left > maxLeft) {
this.left = maxLeft
} else {
this.left = left
}
this.top = e.clientY
this.visible = true
this.selectedTag = tag
},
closeMenu() {
this.visible = false
},
handleScroll() {
this.closeMenu()
}
}
}
</script>
<style lang="scss" scoped>
.tags-view-container {
height: 34px;
width: 100%;
background: #fff;
border-bottom: 1px solid #d8dce5;
box-shadow: 0 1px 3px 0 rgba(0, 0, 0, .12), 0 0 3px 0 rgba(0, 0, 0, .04);
.tags-view-wrapper {
.tags-view-item {
display: inline-block;
position: relative;
cursor: pointer;
height: 26px;
line-height: 26px;
border: 1px solid #d8dce5;
color: #495060;
background: #fff;
padding: 0 8px;
font-size: 12px;
margin-left: 5px;
margin-top: 4px;
&:first-of-type {
margin-left: 15px;
}
&:last-of-type {
margin-right: 15px;
}
&.active {
background-color: #42b983;
color: #fff;
border-color: #42b983;
&::before {
content: '';
background: #fff;
display: inline-block;
width: 8px;
height: 8px;
border-radius: 50%;
position: relative;
margin-right: 2px;
}
}
}
}
.contextmenu {
margin: 0;
background: #fff;
z-index: 3000;
position: absolute;
list-style-type: none;
padding: 5px 0;
border-radius: 4px;
font-size: 12px;
font-weight: 400;
color: #333;
box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, .3);
li {
margin: 0;
padding: 7px 16px;
cursor: pointer;
&:hover {
background: #eee;
}
}
}
}
</style>
<style lang="scss">
//reset element css of el-icon-close
.tags-view-wrapper {
.tags-view-item {
.el-icon-close {
width: 16px;
height: 16px;
vertical-align: 2px;
border-radius: 50%;
text-align: center;
transition: all .3s cubic-bezier(.645, .045, .355, 1);
transform-origin: 100% 50%;
&:before {
transform: scale(.6);
display: inline-block;
vertical-align: -3px;
}
&:hover {
background-color: #b4bccc;
color: #fff;
}
}
}
}
</style>

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save