lass="lines-code">
+    'no-new-wrappers': 2,
119
+    'no-obj-calls': 2,
120
+    'no-octal': 2,
121
+    'no-octal-escape': 2,
122
+    'no-path-concat': 2,
123
+    'no-proto': 2,
124
+    'no-redeclare': 2,
125
+    'no-regex-spaces': 2,
126
+    'no-return-assign': [2, 'except-parens'],
127
+    'no-self-assign': 2,
128
+    'no-self-compare': 2,
129
+    'no-sequences': 2,
130
+    'no-shadow-restricted-names': 2,
131
+    'no-spaced-func': 2,
132
+    'no-sparse-arrays': 2,
133
+    'no-this-before-super': 2,
134
+    'no-throw-literal': 2,
135
+    'no-trailing-spaces': 2,
136
+    'no-undef': 2,
137
+    'no-undef-init': 2,
138
+    'no-unexpected-multiline': 2,
139
+    'no-unmodified-loop-condition': 2,
140
+    'no-unneeded-ternary': [2, {
141
+      'defaultAssignment': false
142
+    }],
143
+    'no-unreachable': 2,
144
+    'no-unsafe-finally': 2,
145
+    'no-unused-vars': [2, {
146
+      'vars': 'all',
147
+      'args': 'none'
148
+    }],
149
+    'no-useless-call': 2,
150
+    'no-useless-computed-key': 2,
151
+    'no-useless-constructor': 2,
152
+    'no-useless-escape': 0,
153
+    'no-whitespace-before-property': 2,
154
+    'no-with': 2,
155
+    'one-var': [2, {
156
+      'initialized': 'never'
157
+    }],
158
+    'operator-linebreak': [2, 'after', {
159
+      'overrides': {
160
+        '?': 'before',
161
+        ':': 'before'
162
+      }
163
+    }],
164
+    'padded-blocks': [2, 'never'],
165
+    'quotes': [2, 'single', {
166
+      'avoidEscape': true,
167
+      'allowTemplateLiterals': true
168
+    }],
169
+    'semi': [2, 'never'],
170
+    'semi-spacing': [2, {
171
+      'before': false,
172
+      'after': true
173
+    }],
174
+    'space-before-blocks': [2, 'always'],
175
+    'space-before-function-paren': [2, 'never'],
176
+    'space-in-parens': [2, 'never'],
177
+    'space-infix-ops': 2,
178
+    'space-unary-ops': [2, {
179
+      'words': true,
180
+      'nonwords': false
181
+    }],
182
+    'spaced-comment': [2, 'always', {
183
+      'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ',']
184
+    }],
185
+    'template-curly-spacing': [2, 'never'],
186
+    'use-isnan': 2,
187
+    'valid-typeof': 2,
188
+    'wrap-iife': [2, 'any'],
189
+    'yield-star-spacing': [2, 'both'],
190
+    'yoda': [2, 'never'],
191
+    'prefer-const': 2,
192
+    'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
193
+    'object-curly-spacing': [2, 'always', {
194
+      objectsInObjects: false
195
+    }],
196
+    'array-bracket-spacing': [2, 'never']
197
+  }
198
+}

+ 4 - 0
.github/FUNDING.yml

@@ -0,0 +1,4 @@
1
+# These are supported funding model platforms
2
+
3
+patreon: panjiachen
4
+custom: https://panjiachen.github.io/vue-element-admin-site/donate

+ 33 - 0
.github/ISSUE_TEMPLATE/bug_report.md

@@ -0,0 +1,33 @@
1
+---
2
+name: Bug report(报告问题)
3
+about: Create a report to help us improve
4
+---
5
+<!--
6
+    注意:为更好的解决你的问题,请参考模板提供完整信息,准确描述问题,信息不全的 issue 将被关闭。
7
+
8
+    Note: In order to better solve your problem, please refer to the template to provide complete information, accurately describe the problem, and the incomplete information issue will be closed.
9
+-->
10
+
11
+
12
+## Bug report(问题描述)
13
+
14
+#### Steps to reproduce(问题复现步骤)
15
+<!--
16
+1. [xxx]
17
+2. [xxx]
18
+3. [xxxx]
19
+-->
20
+
21
+#### Screenshot or Gif(截图或动态图)
22
+
23
+
24
+#### Link to minimal reproduction(最小可在线还原demo)
25
+
26
+<!--
27
+Please only use Codepen, JSFiddle, CodeSandbox or a github repo
28
+-->
29
+
30
+#### Other relevant information(格外信息)
31
+- Your OS:
32
+- Node.js version:
33
+- vue-element-admin version:

+ 7 - 0
.github/ISSUE_TEMPLATE/feature_request.md

@@ -0,0 +1,7 @@
1
+---
2
+name: Feature Request(新功能建议)
3
+about: Suggest an idea for this project
4
+---
5
+
6
+## Feature request(新功能建议)
7
+

+ 35 - 0
.github/ISSUE_TEMPLATE/question.md

@@ -0,0 +1,35 @@
1
+---
2
+name: Question(提问)
3
+about: Asking questions about use
4
+---
5
+
6
+## Question(提问)
7
+
8
+<!--
9
+    提问之前,请确定你已经过自己的努力,尝试解决过这个问题。
10
+    若是代码相关问题,请不要只截图,请提供在线 demo,以便节约彼此的时间。
11
+
12
+    Before asking a question, please make sure that you have tried your best to solve this problem.
13
+    If it's a code-related issue, please don't just take screenshots. Please provide an online demo to save each other's time.
14
+-->
15
+
16
+#### Steps to reproduce(问题复现步骤)
17
+<!--
18
+1. [xxx]
19
+2. [xxx]
20
+3. [xxxx]
21
+-->
22
+
23
+#### Screenshot or Gif(截图或动态图)
24
+
25
+
26
+#### Link to minimal reproduction(最小可在线还原demo)
27
+
28
+<!--
29
+Please only use Codepen, JSFiddle, CodeSandbox or a github repo
30
+-->
31
+
32
+#### Other relevant information(格外信息)
33
+- Your OS:
34
+- Node.js version:
35
+- vue-element-admin version:

+ 23 - 0
.gitignore

@@ -0,0 +1,23 @@
1
+.DS_Store
2
+node_modules/
3
+dist/
4
+npm-debug.log*
5
+yarn-debug.log*
6
+yarn-error.log*
7
+**/*.log
8
+
9
+tests/**/coverage/
10
+tests/e2e/reports
11
+selenium-debug.log
12
+
13
+# Editor directories and files
14
+.idea
15
+.vscode
16
+*.suo
17
+*.ntvs*
18
+*.njsproj
19
+*.sln
20
+*.local
21
+
22
+package-lock.json
23
+yarn.lock

+ 5 - 0
.travis.yml

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

+ 21 - 0
LICENSE

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

+ 0 - 0
README.md


+ 5 - 0
babel.config.js

@@ -0,0 +1,5 @@
1
+module.exports = {
2
+  presets: [
3
+    '@vue/app'
4
+  ]
5
+}

+ 35 - 0
build/index.js

@@ -0,0 +1,35 @@
1
+const { run } = require('runjs')
2
+const chalk = require('chalk')
3
+const config = require('../vue.config.js')
4
+const rawArgv = process.argv.slice(2)
5
+const args = rawArgv.join(' ')
6
+
7
+if (process.env.npm_config_preview || rawArgv.includes('--preview')) {
8
+  const report = rawArgv.includes('--report')
9
+
10
+  run(`vue-cli-service build ${args}`)
11
+
12
+  const port = 9526
13
+  const publicPath = config.publicPath
14
+
15
+  var connect = require('connect')
16
+  var serveStatic = require('serve-static')
17
+  const app = connect()
18
+
19
+  app.use(
20
+    publicPath,
21
+    serveStatic('./dist', {
22
+      index: ['index.html', '/']
23
+    })
24
+  )
25
+
26
+  app.listen(port, function () {
27
+    console.log(chalk.green(`> Preview at  http://localhost:${port}${publicPath}`))
28
+    if (report) {
29
+      console.log(chalk.green(`> Report at  http://localhost:${port}${publicPath}report.html`))
30
+    }
31
+
32
+  })
33
+} else {
34
+  run(`vue-cli-service build ${args}`)
35
+}

+ 24 - 0
jest.config.js

@@ -0,0 +1,24 @@
1
+module.exports = {
2
+  moduleFileExtensions: ['js', 'jsx', 'json', 'vue'],
3
+  transform: {
4
+    '^.+\\.vue$': 'vue-jest',
5
+    '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$':
6
+      'jest-transform-stub',
7
+    '^.+\\.jsx?$': 'babel-jest'
8
+  },
9
+  moduleNameMapper: {
10
+    '^@/(.*)$': '<rootDir>/src/$1'
11
+  },
12
+  snapshotSerializers: ['jest-serializer-vue'],
13
+  testMatch: [
14
+    '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'
15
+  ],
16
+  collectCoverageFrom: ['src/utils/**/*.{js,vue}', '!src/utils/auth.js', '!src/utils/request.js', 'src/components/**/*.{js,vue}'],
17
+  coverageDirectory: '<rootDir>/tests/unit/coverage',
18
+  // 'collectCoverage': true,
19
+  'coverageReporters': [
20
+    'lcov',
21
+    'text-summary'
22
+  ],
23
+  testURL: 'http://kodo.xfoto.com.cn/api'
24
+}

+ 9 - 0
jsconfig.json

@@ -0,0 +1,9 @@
1
+{ 
2
+  "compilerOptions": {
3
+    "baseUrl": "./",
4
+    "paths": {
5
+        "@/*": ["src/*"]
6
+    }
7
+  },
8
+  "exclude": ["node_modules", "dist"]
9
+}

+ 114 - 0
package.json

@@ -0,0 +1,114 @@
1
+{
2
+  "name": "vue-element-admin",
3
+  "version": "4.2.1",
4
+  "description": "A magical vue admin. An out-of-box UI solution for enterprise applications. Newest development stack of vue. Lots of awesome features",
5
+  "author": "Pan <panfree23@gmail.com>",
6
+  "license": "MIT",
7
+  "scripts": {
8
+    "dev": "vue-cli-service serve",
9
+    "build:prod": "vue-cli-service build",
10
+    "build:stage": "vue-cli-service build --mode staging",
11
+    "preview": "node build/index.js --preview",
12
+    "lint": "eslint --ext .js,.vue src",
13
+    "test:unit": "jest --clearCache && vue-cli-service test:unit",
14
+    "test:ci": "npm run lint && npm run test:unit",
15
+    "svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml",
16
+    "new": "plop"
17
+  },
18
+  "husky": {
19
+    "hooks": {
20
+      "pre-commit": "lint-staged"
21
+    }
22
+  },
23
+  "lint-staged": {
24
+    "src/**/*.{js,vue}": [
25
+      "eslint --fix",
26
+      "git add"
27
+    ]
28
+  },
29
+  "keywords": [
30
+    "vue",
31
+    "admin",
32
+    "dashboard",
33
+    "element-ui",
34
+    "boilerplate",
35
+    "admin-template",
36
+    "management-system"
37
+  ],
38
+  "repository": {
39
+    "type": "git",
40
+    "url": "git+https://github.com/PanJiaChen/vue-element-admin.git"
41
+  },
42
+  "bugs": {
43
+    "url": "https://github.com/PanJiaChen/vue-element-admin/issues"
44
+  },
45
+  "dependencies": {
46
+    "axios": "0.18.1",
47
+    "clipboard": "2.0.4",
48
+    "codemirror": "5.45.0",
49
+    "driver.js": "0.9.5",
50
+    "dropzone": "5.5.1",
51
+    "echarts": "4.2.1",
52
+    "element-ui": "2.13.0",
53
+    "file-saver": "2.0.1",
54
+    "fuse.js": "3.4.4",
55
+    "js-cookie": "2.2.0",
56
+    "jsonlint": "1.6.3",
57
+    "jszip": "3.2.1",
58
+    "normalize.css": "7.0.0",
59
+    "nprogress": "0.2.0",
60
+    "path-to-regexp": "2.4.0",
61
+    "qs": "^6.9.3",
62
+    "screenfull": "4.2.0",
63
+    "script-loader": "0.7.2",
64
+    "showdown": "1.9.0",
65
+    "sortablejs": "1.8.4",
66
+    "tui-editor": "1.3.3",
67
+    "vue": "2.6.10",
68
+    "vue-count-to": "1.0.13",
69
+    "vue-router": "3.0.2",
70
+    "vue-splitpane": "1.0.4",
71
+    "vuedraggable": "2.20.0",
72
+    "vuex": "3.1.0",
73
+    "xlsx": "0.14.1"
74
+  },
75
+  "devDependencies": {
76
+    "@babel/core": "7.0.0",
77
+    "@babel/register": "7.0.0",
78
+    "@vue/cli-plugin-babel": "3.5.3",
79
+    "@vue/cli-plugin-eslint": "^3.9.1",
80
+    "@vue/cli-plugin-unit-jest": "3.5.3",
81
+    "@vue/cli-service": "3.5.3",
82
+    "@vue/test-utils": "1.0.0-beta.29",
83
+    "autoprefixer": "^9.5.1",
84
+    "babel-core": "7.0.0-bridge.0",
85
+    "babel-eslint": "10.0.1",
86
+    "babel-jest": "23.6.0",
87
+    "chalk": "2.4.2",
88
+    "chokidar": "2.1.5",
89
+    "connect": "3.6.6",
90
+    "eslint": "5.15.3",
91
+    "eslint-plugin-vue": "5.2.2",
92
+    "html-webpack-plugin": "3.2.0",
93
+    "husky": "1.3.1",
94
+    "lint-staged": "8.1.5",
95
+    "mockjs": "1.0.1-beta3",
96
+    "node-sass": "^4.9.0",
97
+    "plop": "2.3.0",
98
+    "runjs": "^4.3.2",
99
+    "sass-loader": "^7.1.0",
100
+    "script-ext-html-webpack-plugin": "2.1.3",
101
+    "serve-static": "^1.13.2",
102
+    "svg-sprite-loader": "4.1.3",
103
+    "svgo": "1.2.0",
104
+    "vue-template-compiler": "2.6.10"
105
+  },
106
+  "engines": {
107
+    "node": ">=8.9",
108
+    "npm": ">= 3.0.0"
109
+  },
110
+  "browserslist": [
111
+    "> 1%",
112
+    "last 2 versions"
113
+  ]
114
+}

+ 26 - 0
plop-templates/component/index.hbs

@@ -0,0 +1,26 @@
1
+{{#if template}}
2
+<template>
3
+  <div />
4
+</template>
5
+{{/if}}
6
+
7
+{{#if script}}
8
+<script>
9
+export default {
10
+  name: '{{ properCase name }}',
11
+  props: {},
12
+  data() {
13
+    return {}
14
+  },
15
+  created() {},
16
+  mounted() {},
17
+  methods: {}
18
+}
19
+</script>
20
+{{/if}}
21
+
22
+{{#if style}}
23
+<style lang="scss" scoped>
24
+
25
+</style>
26
+{{/if}}

+ 55 - 0
plop-templates/component/prompt.js

@@ -0,0 +1,55 @@
1
+const { notEmpty } = require('../utils.js')
2
+
3
+module.exports = {
4
+  description: 'generate vue component',
5
+  prompts: [{
6
+    type: 'input',
7
+    name: 'name',
8
+    message: 'component name please',
9
+    validate: notEmpty('name')
10
+  },
11
+  {
12
+    type: 'checkbox',
13
+    name: 'blocks',
14
+    message: 'Blocks:',
15
+    choices: [{
16
+      name: '<template>',
17
+      value: 'template',
18
+      checked: true
19
+    },
20
+    {
21
+      name: '<script>',
22
+      value: 'script',
23
+      checked: true
24
+    },
25
+    {
26
+      name: 'style',
27
+      value: 'style',
28
+      checked: true
29
+    }
30
+    ],
31
+    validate(value) {
32
+      if (value.indexOf('script') === -1 && value.indexOf('template') === -1) {
33
+        return 'Components require at least a <script> or <template> tag.'
34
+      }
35
+      return true
36
+    }
37
+  }
38
+  ],
39
+  actions: data => {
40
+    const name = '{{properCase name}}'
41
+    const actions = [{
42
+      type: 'add',
43
+      path: `src/components/${name}/index.vue`,
44
+      templateFile: 'plop-templates/component/index.hbs',
45
+      data: {
46
+        name: name,
47
+        template: data.blocks.includes('template'),
48
+        script: data.blocks.includes('script'),
49
+        style: data.blocks.includes('style')
50
+      }
51
+    }]
52
+
53
+    return actions
54
+  }
55
+}

+ 16 - 0
plop-templates/store/index.hbs

@@ -0,0 +1,16 @@
1
+{{#if state}}
2
+const state = {}
3
+{{/if}}
4
+
5
+{{#if mutations}}
6
+const mutations = {}
7
+{{/if}}
8
+
9
+{{#if actions}}
10
+const actions = {}
11
+{{/if}}
12
+
13
+export default {
14
+  namespaced: true,
15
+  {{options}}
16
+}

+ 62 - 0
plop-templates/store/prompt.js

@@ -0,0 +1,62 @@
1
+const { notEmpty } = require('../utils.js')
2
+
3
+module.exports = {
4
+  description: 'generate store',
5
+  prompts: [{
6
+    type: 'input',
7
+    name: 'name',
8
+    message: 'store name please',
9
+    validate: notEmpty('name')
10
+  },
11
+  {
12
+    type: 'checkbox',
13
+    name: 'blocks',
14
+    message: 'Blocks:',
15
+    choices: [{
16
+      name: 'state',
17
+      value: 'state',
18
+      checked: true
19
+    },
20
+    {
21
+      name: 'mutations',
22
+      value: 'mutations',
23
+      checked: true
24
+    },
25
+    {
26
+      name: 'actions',
27
+      value: 'actions',
28
+      checked: true
29
+    }
30
+    ],
31
+    validate(value) {
32
+      if (!value.includes('state') || !value.includes('mutations')) {
33
+        return 'store require at least state and mutations'
34
+      }
35
+      return true
36
+    }
37
+  }
38
+  ],
39
+  actions(data) {
40
+    const name = '{{name}}'
41
+    const { blocks } = data
42
+    const options = ['state', 'mutations']
43
+    const joinFlag = `,
44
+  `
45
+    if (blocks.length === 3) {
46
+      options.push('actions')
47
+    }
48
+
49
+    const actions = [{
50
+      type: 'add',
51
+      path: `src/store/modules/${name}.js`,
52
+      templateFile: 'plop-templates/store/index.hbs',
53
+      data: {
54
+        options: options.join(joinFlag),
55
+        state: blocks.includes('state'),
56
+        mutations: blocks.includes('mutations'),
57
+        actions: blocks.includes('actions')
58
+      }
59
+    }]
60
+    return actions
61
+  }
62
+}

+ 9 - 0
plop-templates/utils.js

@@ -0,0 +1,9 @@
1
+exports.notEmpty = name => {
2
+  return v => {
3
+    if (!v || v.trim === '') {
4
+      return `${name} is required`
5
+    } else {
6
+      return true
7
+    }
8
+  }
9
+}

+ 26 - 0
plop-templates/view/index.hbs

@@ -0,0 +1,26 @@
1
+{{#if template}}
2
+<template>
3
+  <div />
4
+</template>
5
+{{/if}}
6
+
7
+{{#if script}}
8
+<script>
9
+export default {
10
+  name: '{{ properCase name }}',
11
+  props: {},
12
+  data() {
13
+    return {}
14
+  },
15
+  created() {},
16
+  mounted() {},
17
+  methods: {}
18
+}
19
+</script>
20
+{{/if}}
21
+
22
+{{#if style}}
23
+<style lang="scss" scoped>
24
+
25
+</style>
26
+{{/if}}

+ 55 - 0
plop-templates/view/prompt.js

@@ -0,0 +1,55 @@
1
+const { notEmpty } = require('../utils.js')
2
+
3
+module.exports = {
4
+  description: 'generate a view',
5
+  prompts: [{
6
+    type: 'input',
7
+    name: 'name',
8
+    message: 'view name please',
9
+    validate: notEmpty('name')
10
+  },
11
+  {
12
+    type: 'checkbox',
13
+    name: 'blocks',
14
+    message: 'Blocks:',
15
+    choices: [{
16
+      name: '<template>',
17
+      value: 'template',
18
+      checked: true
19
+    },
20
+    {
21
+      name: '<script>',
22
+      value: 'script',
23
+      checked: true
24
+    },
25
+    {
26
+      name: 'style',
27
+      value: 'style',
28
+      checked: true
29
+    }
30
+    ],
31
+    validate(value) {
32
+      if (value.indexOf('script') === -1 && value.indexOf('template') === -1) {
33
+        return 'View require at least a <script> or <template> tag.'
34
+      }
35
+      return true
36
+    }
37
+  }
38
+  ],
39
+  actions: data => {
40
+    const name = '{{name}}'
41
+    const actions = [{
42
+      type: 'add',
43
+      path: `src/views/${name}/index.vue`,
44
+      templateFile: 'plop-templates/view/index.hbs',
45
+      data: {
46
+        name: name,
47
+        template: data.blocks.includes('template'),
48
+        script: data.blocks.includes('script'),
49
+        style: data.blocks.includes('style')
50
+      }
51
+    }]
52
+
53
+    return actions
54
+  }
55
+}

+ 9 - 0
plopfile.js

@@ -0,0 +1,9 @@
1
+const viewGenerator = require('./plop-templates/view/prompt')
2
+const componentGenerator = require('./plop-templates/component/prompt')
3
+const storeGenerator = require('./plop-templates/store/prompt.js')
4
+
5
+module.exports = function(plop) {
6
+  plop.setGenerator('view', viewGenerator)
7
+  plop.setGenerator('component', componentGenerator)
8
+  plop.setGenerator('store', storeGenerator)
9
+}

+ 5 - 0
postcss.config.js

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

BIN
public/favicon.ico


+ 15 - 0
public/index.html

@@ -0,0 +1,15 @@
1
+<!DOCTYPE html>
2
+<html>
3
+  <head>
4
+    <meta charset="utf-8">
5
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
6
+    <meta name="renderer" content="webkit">
7
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
8
+    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
9
+    <title><%= webpackConfig.name %></title>
10
+  </head>
11
+  <body>
12
+    <div id="app"></div>
13
+    <!-- built files will be auto injected -->
14
+  </body>
15
+</html>

+ 11 - 0
src/App.vue

@@ -0,0 +1,11 @@
1
+<template>
2
+  <div id="app">
3
+    <router-view />
4
+  </div>
5
+</template>
6
+
7
+<script>
8
+export default {
9
+  name: 'App'
10
+}
11
+</script>

+ 13 - 0
src/api/dashboard.js

@@ -0,0 +1,13 @@
1
+import request from '@/utils/request'
2
+import store from '@/store'
3
+import qs from 'qs'
4
+
5
+export function fetchDashboard(data) {
6
+  data['brand_id'] = 'ywkRTh5vtswRvhh8uLvTTQ'
7
+  data['admin_id'] = store.getters.token
8
+  return request({
9
+    url: '/admin/dashboard',
10
+    method: 'post',
11
+    data: qs.stringify(data)
12
+  })
13
+}

+ 21 - 0
src/api/order.js

@@ -0,0 +1,21 @@
1
+import request from '@/utils/request'
2
+import store from '@/store'
3
+import qs from 'qs'
4
+
5
+export function fetchList(data) {
6
+  data['admin_id'] = store.getters.token
7
+  return request({
8
+    url: '/admin/order/list',
9
+    method: 'post',
10
+    data: qs.stringify(data)
11
+  })
12
+}
13
+
14
+export function updateOrder(data) {
15
+  data['admin_id'] = store.getters.token
16
+  return request({
17
+    url: '/admin/order/update',
18
+    method: 'post',
19
+    data: qs.stringify(data)
20
+  })
21
+}

+ 25 - 0
src/api/user.js

@@ -0,0 +1,25 @@
1
+import request from '@/utils/request'
2
+import qs from 'qs'
3
+
4
+export function login(data) {
5
+  return request({
6
+    url: '/admin/login',
7
+    method: 'post',
8
+    data: qs.stringify(data)
9
+  })
10
+}
11
+
12
+export function getInfo(token) {
13
+  return request({
14
+    url: '/vue-element-admin/user/info',
15
+    method: 'get',
16
+    params: { token }
17
+  })
18
+}
19
+
20
+export function logout() {
21
+  return request({
22
+    url: '/vue-element-admin/user/logout',
23
+    method: 'post'
24
+  })
25
+}

BIN
src/assets/401_images/401.gif


BIN
src/assets/404_images/404.png


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


BIN
src/assets/custom-theme/fonts/element-icons.ttf


BIN
src/assets/custom-theme/fonts/element-icons.woff


+ 0 - 0
src/assets/custom-theme/index.css

@@ -0,0 +1 @@

kodo - Gogs: Go Git Service

Нет описания

FFIB: c25c1f86d3 处理解绑后,再次扫码,不发放相关权益 лет %!s(int64=3): %!d(string=назад)
..
0001_initial.py aa31a5f59a Add kodo лет %!s(int64=8): %!d(string=назад)
0002_auto_20180104_0414.py 018d52f61d Update package django_xxx лет %!s(int64=8): %!d(string=назад)
0003_auto_20180104_0428.py 9ec76d526a TextField => CharField лет %!s(int64=8): %!d(string=назад)
0004_latestappinfo.py 018d52f61d Update package django_xxx лет %!s(int64=8): %!d(string=назад)
0005_auto_20180115_0021.py 49634dc097 Add api operator login лет %!s(int64=8): %!d(string=назад)
0006_auto_20180115_0047.py 49634dc097 Add api operator login лет %!s(int64=8): %!d(string=назад)
0007_consumeinfosubmitloginfo.py 1b1f0192f8 ConsumeInfoSubmitLogInfo лет %!s(int64=8): %!d(string=назад)
0008_auto_20180129_0422.py a77c4993f8 FloatField лет %!s(int64=8): %!d(string=назад)
0009_auto_20180129_0426.py e04f95dc5e long => lon лет %!s(int64=8): %!d(string=назад)
0010_modelinfo_integral.py 71993af1e4 Add integral for ModelInfo лет %!s(int64=8): %!d(string=назад)
0011_modelinfo_model_full_name.py 145973f8f0 Add brand_full_name for BrandInfo лет %!s(int64=8): %!d(string=назад)
0012_auto_20180401_2012.py f1260953bf Move image/url from ModelImageInfo to ModelInfo лет %!s(int64=8): %!d(string=назад)
0013_consumeinfosubmitloginfo_test_user.py e47aa7f8c4 Add field test_user лет %!s(int64=8): %!d(string=назад)
0014_auto_20180508_1058.py c7b55979c0 Add province code/name for DistributorInfo лет %!s(int64=8): %!d(string=назад)
0015_auto_20180508_1433.py d10bd672ea AdministratorInfo/BrandModelDistributorPriceInfo лет %!s(int64=8): %!d(string=назад)
0016_auto_20180508_1507.py d10bd672ea AdministratorInfo/BrandModelDistributorPriceInfo лет %!s(int64=8): %!d(string=назад)
0017_auto_20180508_1830.py 537c495621 Statistic лет %!s(int64=8): %!d(string=назад)
0018_auto_20180514_1519.py 62948fb5c3 Operator add/delete/update/list лет %!s(int64=8): %!d(string=назад)
0019_saleclerkinfo.py 137ed6dee2 Clerk add/delete/update/list лет %!s(int64=8): %!d(string=назад)
0020_auto_20180517_1819.py 2988703c52 Update лет %!s(int64=8): %!d(string=назад)
0021_auto_20180522_1100.py e7dcf47e22 SaleclerkInfo лет %!s(int64=8): %!d(string=назад)
0022_auto_20180522_1355.py b90bf186bc brand_domain лет %!s(int64=8): %!d(string=назад)
0023_auto_20180826_0448.py 3f9969cafc Support scan jancode лет %!s(int64=8): %!d(string=назад)
0024_latestappscreeninfo.py 900c3fd386 Makemigrations лет %!s(int64=8): %!d(string=назад)
0025_auto_20180917_1554.py 9c585b197e Mch migrations лет %!s(int64=8): %!d(string=назад)
0026_auto_20180930_1159.py 66a598b30c Makemigrations лет %!s(int64=8): %!d(string=назад)
0027_distributorinfo_distributor_short_name.py deb84bfcb5 Makemigrations лет %!s(int64=8): %!d(string=назад)
0028_consumeinfosubmitloginfo_dupload.py e9f8a35b9d Makemigrations лет %!s(int64=8): %!d(string=назад)
0029_auto_20181117_0052.py b8784eee8a Makemigrations лет %!s(int64=8): %!d(string=назад)
0030_auto_20190301_1402.py ff3a23ccf0 Activity лет %!s(int64=7): %!d(string=назад)
0031_activityinfo_model_uni_names.py ded4db2cda activityinfo_model_uni_names лет %!s(int64=7): %!d(string=назад)
0032_auto_20190521_1544.py 5a8859fa5e Makemigrations лет %!s(int64=7): %!d(string=назад)
0033_consumeinfosubmitloginfo_activity_id.py 3ade638ea3 Makemigrations лет %!s(int64=7): %!d(string=назад)
0034_auto_20190620_1709.py d666c88eac COUPON_EXPIRED_TIME_TUPLE лет %!s(int64=7): %!d(string=назад)
0035_auto_20190625_1443.py 219acdedb1 Add field has_used лет %!s(int64=7): %!d(string=назад)
0036_auto_20190701_1441.py 77c612316a queryusedsn лет %!s(int64=7): %!d(string=назад)
0037_auto_20190826_1537.py 8d998319f7 Makemigrations лет %!s(int64=7): %!d(string=назад)
0038_auto_20190826_1625.py 9db41fee66 default False лет %!s(int64=7): %!d(string=назад)
0039_auto_20191119_1348.py 3d0d214667 :sparkles: Member Infos лет %!s(int64=7): %!d(string=назад)
0040_modelinfo_shot_member_name.py 4ce7f5c87b :art: Member Relative APIs лет %!s(int64=7): %!d(string=назад)
0041_activityinfo_coupon_id.py a8239c077f :art: CouponInfo for coupon app лет %!s(int64=6): %!d(string=назад)
0042_auto_20200113_1832.py 212f24c882 MarketCode лет %!s(int64=6): %!d(string=назад)
0043_modelcamerabodyinfo.py 72656ceaff :art: model/cameras лет %!s(int64=6): %!d(string=назад)
0044_modelcamerabodyinfo_camera_brand_name.py 9619c195e6 :art: Makemigrations лет %!s(int64=6): %!d(string=назад)
0045_auto_20200304_1826.py dccd94c448 :art: Opt api model/cameras лет %!s(int64=6): %!d(string=назад)
0046_cameramodelinfo.py dccd94c448 :art: Opt api model/cameras лет %!s(int64=6): %!d(string=назад)
0047_auto_20200304_1848.py dccd94c448 :art: Opt api model/cameras лет %!s(int64=6): %!d(string=назад)
0048_modelcamerabodyinfo_is_important.py 43455cdf4e :art: Support is_important лет %!s(int64=6): %!d(string=назад)
0049_modelcamerabodyinfo_camera_market_time.py da799e7af6 :art: Add field camera_market_time for CameraModelInfo/ModelCameraBodyInfo лет %!s(int64=6): %!d(string=назад)
0050_cameramodelinfo_camera_market_time.py da799e7af6 :art: Add field camera_market_time for CameraModelInfo/ModelCameraBodyInfo лет %!s(int64=6): %!d(string=назад)
0051_auto_20200314_2340.py 7dc0b7fc6b :art: Makemigrations лет %!s(int64=6): %!d(string=назад)
0052_consumeinfosubmitloginfo_code_version.py 03631cb847 add code_version лет %!s(int64=6): %!d(string=назад)
0053_auto_20200407_1118.py 608bdf8508 makemigrations лет %!s(int64=6): %!d(string=назад)
0054_auto_20200411_2143.py 58c38a0546 整理 优惠券 лет %!s(int64=6): %!d(string=назад)
0055_auto_20200601_1634.py 89c3cefcc7 saleclerk migrate лет %!s(int64=6): %!d(string=назад)
0056_auto_20200601_1640.py 3872355991 add department_name лет %!s(int64=6): %!d(string=назад)
0057_auto_20200602_1403.py 11df57b63d support qy login лет %!s(int64=6): %!d(string=назад)
0058_auto_20201202_1203.py 6a9e324f6f :art: Re Makemigrations лет %!s(int64=6): %!d(string=назад)
0059_auto_20201221_1115.py 4ba79f76cd 后台管理,添加运营人员角色 лет %!s(int64=5): %!d(string=назад)
0060_modelinfo_is_show_shot.py 45f886651e 添加 is_show_shot 用于控制是否在前端显示 лет %!s(int64=5): %!d(string=назад)
0061_consumeinfosubmitloginfo_integral.py 39290e111b ConsumeInfoSubmitLogInfo 记录用户积分 лет %!s(int64=5): %!d(string=назад)
0062_distributorinfo_office.py 8dcde2c80c 销售员提交新增事务所和销售担当,以及经销商ID лет %!s(int64=5): %!d(string=назад)
0063_auto_20210915_1653.py 414cc1ada2 :art: back_express_name / back_tracking_number лет %!s(int64=5): %!d(string=назад)
0064_alter_modelinfo_display.py 28f8bc3cb9 :art: Models update for tenancy лет %!s(int64=4): %!d(string=назад)
0065_auto_20221118_1657.py 7f990a3af6 增加型号卡口, лет %!s(int64=4): %!d(string=назад)
0066_auto_20230208_1344.py ed0e1dba9a 清除一些无用字段 лет %!s(int64=3): %!d(string=назад)
0067_consumeshotunbindinginfo.py 0a9dd97a7e 增加解绑功能 лет %!s(int64=3): %!d(string=назад)
0068_alter_consumeshotunbindinginfo_reason.py 0a9dd97a7e 增加解绑功能 лет %!s(int64=3): %!d(string=назад)
0069_auto_20230302_1754.py c25c1f86d3 处理解绑后,再次扫码,不发放相关权益 лет %!s(int64=3): %!d(string=назад)
__init__.py aa31a5f59a Add kodo лет %!s(int64=8): %!d(string=назад)