'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

No Description

basic.html 8.8KB

    {% load staticfiles %} <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="format-detection" content="telephone=no,email=no,address=no"> <meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no"> <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> <meta http-equiv="Pragma" content="no-cache" /> <meta http-equiv="Expires" content="0" /> <title>{% block title %}{% endblock %}</title> <link href="//cdnjs.cloudflare.com/ajax/libs/pure/0.6.2/pure-min.css" rel="stylesheet"> <link href="//cdnjs.cloudflare.com/ajax/libs/flexslider/2.6.3/flexslider.min.css" rel="stylesheet"> <link href="//res.wx.qq.com/open/libs/weui/0.4.3/weui.min.css" rel="stylesheet" type="text/css" /> <link href="{% static 'page/css/flexslider.ext.css' %}" rel="stylesheet" type="text/css" /> <link href="{% static 'page/css/weui.ext.css' %}" rel="stylesheet" type="text/css" /> {% block link %}{% endblock %} <style> body { font-family: Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif !important; background: #fff; } img { pointer-events: none; } .clickable { pointer-events: auto; } /* Input 自动填充后,移除 Chrome 默认黄色 */ input:-webkit-autofill { box-shadow: 0 0 0 1000px white inset !important; } .container { padding-bottom: 45px; } .text-center { text-align: center; } .empty { color: #999; padding: .9375rem 0; font-size: .625rem; } .text_ellipsis { overflow:hidden; white-space:nowrap; text-overflow: ellipsis; } .fl { float: left; } .fr { float: right; } .clearfix { zoom: 1; } .clearfix:after { content: "\200B"; display: block; height: 0; clear: both; } </style> {% block tohomecss %} <style> .tohome { width: 40px; height: 40px; background-color: rgba(139, 139, 139, 0.7); position: fixed; right: 10px; bottom: 20px; border-radius: 9999px; border-top-left-radius: 9999px; border-top-right-radius: 9999px; border-bottom-left-radius: 9999px; border-bottom-right-radius: 9999px; z-index: 99999999; } .tohome img { display: block; width: 18px; height: 13px; margin: 6px auto 2px; } .tohome p { color: #ffffff; } </style> {% endblock %} {% block css %}{% endblock %} <script> {% block rem %} //这段js的最后面有两个参数记得要设置,一个为设计稿实际宽度,一个为制作稿最大宽度,例如设计稿为750,最大宽度为750,则为(750,750) !function(e,t){function n(){var n=l.getBoundingClientRect().width;t=t||540,n>t&&(n=t);var i=100*n/e;r.innerHTML="html{font-size:"+i+"px;}"}var i,d=document,o=window,l=d.documentElement,r=document.createElement("style");if(l.firstElementChild)l.firstElementChild.appendChild(r);else{var a=d.createElement("div");a.appendChild(r),d.write(a.innerHTML),a=null}n(),o.addEventListener("resize",function(){clearTimeout(i),i=setTimeout(n,300)},!1),o.addEventListener("pageshow",function(e){e.persisted&&(clearTimeout(i),i=setTimeout(n,300))},!1),"complete"===d.readyState?d.body.style.fontSize="16px":d.addEventListener("DOMContentLoaded",function(e){d.body.style.fontSize="16px"},!1)}(750,750); {% endblock %} </script> </head> <body> {% block somehtml %}{% endblock %} <div class="container"> {% block container %}{% endblock %} {% block tohomehtml %} <div class="tohome"> <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAeCAMAAABzP0xhAAAAS1BMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////+DmQsHAAAAGHRSTlMAoHDw+q0VCufg187DuI+OgGJUSDwyKCBlxSbJAAAAi0lEQVQ4y+3SuRKEIBBFUaQbcd+X9/9fOpRDjaXQGJnNiW/SiwpkmXpiW6C16Sav4dR5qtlKHMpNbhaCR4vUTIwfnuKNxoWONR1uunB0g4Cxt9EbRDSXVewVoqr9bNYCgmJV3kwQ0fxtRkYCj8oZ8GBQqieHIWByev9DEPjfeisy+mDk6Dy9/kevRR9/MjHbEpIcQAAAAABJRU5ErkJggg=="> <p style="text-align:center;font-size:8px">回首页</p> </div> {% endblock %} </div> {% block somehtml2 %}{% endblock %} <script> window.onerror = function(errorMessage, scriptURI, lineNo, columnNo, error) { // 构建错误对象 var errorObj = { lineNo: lineNo || null, columnNo: columnNo || null, scriptURI: scriptURI || null, errorMessage: errorMessage || null, stack: error && error.stack ? error.stack : null }; // 构建Http请求 if (XMLHttpRequest) { var xhr = new XMLHttpRequest(); xhr.open('post', '/e/report', true); xhr.setRequestHeader('Content-Type', 'application/json'); // 设置请求头 xhr.send(JSON.stringify(errorObj)); // 发送参数 } } </script> {# <script src="//cdnjs.cloudflare.com/ajax/libs/zepto/1.1.6/zepto.min.js"></script>#} <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/flexslider/2.6.3/jquery.flexslider-min.js"></script> {% block script %}{% endblock %} <script> // History 压入本地连接 function pushHistory() { var state = { title: "title", url: "#" }; window.history.pushState(state, "title", "#"); } pushHistory(); // 延时监听 setTimeout(function () { // 监听``返回``、``后退``、``上一页`` window.addEventListener("popstate", function (e) { if (confirm("确认退出") == true) { window.history.back(-1); } else { pushHistory(); } }, false); }, 300); </script> <script> {% block glbjs %}{% endblock %} $(function() { /** 格式化输入字符串**/ //用法: "hello{0}".format('world');返回'hello world' String.prototype.format= function(){ var args = arguments; return this.replace(/\{(\d+)\}/g,function(s,i){ return args[i]; }); } {% block flexsliderjs %} // 轮播图 $('.flexslider').flexslider({ slideshowSpeed: 2000, pauseOnHover: true, controlNav: false, directionNav: false, }); {% endblock %} {% block tohomejs %} // 返回首页 $('.tohome').click(function () { window.location.href = '{{ domain }}/page/nav?{{ params|safe }}' }) {% endblock %} {% block js %}{% endblock %} }); </script> <script type="text/javascript" src="//res.wx.qq.com/open/js/jweixin-1.2.0.js"></script> <script type="text/javascript" src="{% static 'machine/js/jswe-1.0.0.js' %}"></script> <script> {# V.initWxData({#} {# imgUrl: '{{ domain }}{% static 'page/img/logo.jpg' %}',#} {# link: 'http://hpsgift.hphcclub.com/we/ws',#} {# desc: '惠普销售红包系统',#} {# title: '惠普销售红包系统',#} {# timeLine: ''#} {# }, true);#} V.hideOptionMenu(); {% block jswe %}{% endblock %} </script> {% block scriptag %}{% endblock %} </body> </html>