├── .babelrc
├── .eslintrc
├── .gitignore
├── Makefile
├── README.md
├── build
├── build.js
├── check-versions.js
├── dev-client.js
├── dev-server.js
├── utils.js
├── webpack.base.conf.js
├── webpack.dev.conf.js
└── webpack.prod.conf.js
├── config
├── dev.env.js
├── index.js
└── prod.env.js
├── docs
├── index.html
└── static
│ ├── css
│ ├── app.a75447e43f64d9be87efdb34fe94951d.css
│ └── app.a75447e43f64d9be87efdb34fe94951d.css.map
│ ├── fonts
│ ├── element-icons.a61be9c.eot
│ └── element-icons.b02bdc1.ttf
│ ├── img
│ └── element-icons.09162bc.svg
│ └── js
│ ├── app.454eedb1d5bc0641b2fe.js
│ ├── app.454eedb1d5bc0641b2fe.js.map
│ ├── manifest.10d67edc14ae1e536fbc.js
│ ├── manifest.10d67edc14ae1e536fbc.js.map
│ ├── vendor.6190c7a13d9bea8967da.js
│ └── vendor.6190c7a13d9bea8967da.js.map
├── index.html
├── package.json
└── src
├── api
├── api.js
└── index.js
├── app.js
├── app.vue
├── assets
└── .gitkeep
├── components
├── .gitkeep
├── breadcrumb.vue
└── index.js
├── mock
├── index.js
├── mock.js
└── user.js
├── pages
├── chart
│ └── chart.vue
├── common
│ ├── 404.vue
│ └── abstract.vue
├── form
│ └── big-form.vue
├── list
│ └── with-filters.vue
└── login
│ └── login.vue
├── resources
├── academics.js
├── schools.js
├── user.js
└── work-durations.js
├── routes.js
├── style.scss
├── styles
├── _global.scss
└── _variables.scss
└── utils
└── .gitkeep
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["es2015", "stage-2"],
3 | "plugins": ["transform-runtime"],
4 | "comments": false
5 | }
6 |
--------------------------------------------------------------------------------
/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "eslint-config-elemefe",
3 | "plugins": [
4 | 'vue'
5 | ],
6 | "globals": {
7 | "Promise": true
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | logs/*
2 | npm-debug.log
3 | node_modules/
4 | tmp
5 | *.swp
6 | *.log
7 | .idea
8 | .DS_Store
9 | .tags
10 | .tags1
11 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | .PHONY: dist test build
2 | install:
3 | @npm install
4 |
5 | dev: install
6 | @npm run dev
7 |
8 | build:
9 | @npm run build
10 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Element-Dashboard
2 |
3 | ### install
4 | ```
5 | git clone git@github.com:ElemeFE/element-dashboard.git
6 | ```
7 |
8 | ### develop
9 | ```
10 | make dev
11 | ```
12 |
13 | ### build
14 | ```
15 | make build
16 | ```
17 |
18 | ### 文件目录
19 |
20 | + src
21 | - api —— API请求
22 | - assets —— 图片等资源文件
23 | - components —— 通用组件
24 | - mock —— API请求拦截器
25 | - pages —— 页面文件夹
26 | - resources —— mock 数据源
27 | - styles —— 全局通用样式文件夹
28 | - utils —— 工具库文件夹
29 |
--------------------------------------------------------------------------------
/build/build.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable */
2 | // https://github.com/shelljs/shelljs
3 | require('./check-versions')()
4 | require('shelljs/global')
5 | env.NODE_ENV = 'production'
6 |
7 | var path = require('path')
8 | var config = require('../config')
9 | var ora = require('ora')
10 | var webpack = require('webpack')
11 | var webpackConfig = require('./webpack.prod.conf')
12 |
13 | console.log(
14 | ' Tip:\n' +
15 | ' Built files are meant to be served over an HTTP server.\n' +
16 | ' Opening index.html over file:// won\'t work.\n'
17 | )
18 |
19 | var spinner = ora('building for production...')
20 | spinner.start()
21 |
22 | var assetsPath = path.join(config.build.assetsRoot, config.build.assetsSubDirectory)
23 | console.log(assetsPath);
24 | rm('-rf', assetsPath)
25 | mkdir('-p', assetsPath)
26 | webpack(webpackConfig, function (err, stats) {
27 | spinner.stop()
28 | if (err) throw err
29 | process.stdout.write(stats.toString({
30 | colors: true,
31 | modules: false,
32 | children: false,
33 | chunks: false,
34 | chunkModules: false
35 | }) + '\n')
36 | })
37 |
--------------------------------------------------------------------------------
/build/check-versions.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable */
2 | var semver = require('semver')
3 | var chalk = require('chalk')
4 | var packageConfig = require('../package.json')
5 | var exec = function (cmd) {
6 | return require('child_process')
7 | .execSync(cmd).toString().trim()
8 | }
9 |
10 | var versionRequirements = [
11 | {
12 | name: 'node',
13 | currentVersion: semver.clean(process.version),
14 | versionRequirement: packageConfig.engines.node
15 | },
16 | {
17 | name: 'npm',
18 | currentVersion: exec('npm --version'),
19 | versionRequirement: packageConfig.engines.npm
20 | }
21 | ]
22 |
23 | module.exports = function () {
24 | var warnings = []
25 | for (var i = 0; i < versionRequirements.length; i++) {
26 | var mod = versionRequirements[i]
27 | if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
28 | warnings.push(mod.name + ': ' +
29 | chalk.red(mod.currentVersion) + ' should be ' +
30 | chalk.green(mod.versionRequirement)
31 | )
32 | }
33 | }
34 |
35 | if (warnings.length) {
36 | console.log('')
37 | console.log(chalk.yellow('To use this template, you must update following to modules:'))
38 | console.log()
39 | for (var i = 0; i < warnings.length; i++) {
40 | var warning = warnings[i]
41 | console.log(' ' + warning)
42 | }
43 | console.log()
44 | process.exit(1)
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/build/dev-client.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable */
2 | require('eventsource-polyfill')
3 | var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true')
4 |
5 | hotClient.subscribe(function (event) {
6 | if (event.action === 'reload') {
7 | window.location.reload()
8 | }
9 | })
10 |
--------------------------------------------------------------------------------
/build/dev-server.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable */
2 | require('./check-versions')()
3 | var config = require('../config')
4 | if (!process.env.NODE_ENV) process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV)
5 | var path = require('path')
6 | var express = require('express')
7 | var webpack = require('webpack')
8 | var opn = require('opn')
9 | var proxyMiddleware = require('http-proxy-middleware')
10 | var webpackConfig = require('./webpack.dev.conf')
11 |
12 | // default port where dev server listens for incoming traffic
13 | var port = process.env.PORT || config.dev.port
14 | // Define HTTP proxies to your custom API backend
15 | // https://github.com/chimurai/http-proxy-middleware
16 | var proxyTable = config.dev.proxyTable
17 |
18 | var app = express()
19 | var compiler = webpack(webpackConfig)
20 |
21 | var devMiddleware = require('webpack-dev-middleware')(compiler, {
22 | publicPath: webpackConfig.output.publicPath,
23 | stats: {
24 | colors: true,
25 | chunks: false
26 | }
27 | })
28 |
29 | var hotMiddleware = require('webpack-hot-middleware')(compiler)
30 | // force page reload when html-webpack-plugin template changes
31 | compiler.plugin('compilation', function (compilation) {
32 | compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) {
33 | hotMiddleware.publish({ action: 'reload' })
34 | cb()
35 | })
36 | })
37 |
38 | // proxy api requests
39 | Object.keys(proxyTable).forEach(function (context) {
40 | var options = proxyTable[context]
41 | if (typeof options === 'string') {
42 | options = { target: options }
43 | }
44 | app.use(proxyMiddleware(context, options))
45 | })
46 |
47 | // handle fallback for HTML5 history API
48 | app.use(require('connect-history-api-fallback')())
49 |
50 | // serve webpack bundle output
51 | app.use(devMiddleware)
52 |
53 | // enable hot-reload and state-preserving
54 | // compilation error display
55 | app.use(hotMiddleware)
56 |
57 | // serve pure static assets
58 | var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory)
59 | app.use(staticPath, express.static('./static'))
60 |
61 | module.exports = app.listen(port, function (err) {
62 | if (err) {
63 | console.log(err)
64 | return
65 | }
66 | var uri = 'http://localhost:' + port
67 | console.log('Listening at ' + uri + '\n')
68 |
69 | // when env is testing, don't need open it
70 | if (process.env.NODE_ENV !== 'testing') {
71 | opn(uri)
72 | }
73 | })
74 |
--------------------------------------------------------------------------------
/build/utils.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable */
2 | var path = require('path')
3 | var config = require('../config')
4 | var ExtractTextPlugin = require('extract-text-webpack-plugin')
5 |
6 | exports.assetsPath = function (_path) {
7 | var assetsSubDirectory = process.env.NODE_ENV === 'production'
8 | ? config.build.assetsSubDirectory
9 | : config.dev.assetsSubDirectory
10 | return path.posix.join(assetsSubDirectory, _path)
11 | }
12 |
13 | exports.cssLoaders = function (options) {
14 | options = options || {}
15 | // generate loader string to be used with extract text plugin
16 | function generateLoaders (loaders) {
17 | var sourceLoader = loaders.map(function (loader) {
18 | var extraParamChar
19 | if (/\?/.test(loader)) {
20 | loader = loader.replace(/\?/, '-loader?')
21 | extraParamChar = '&'
22 | } else {
23 | loader = loader + '-loader'
24 | extraParamChar = '?'
25 | }
26 | return loader + (options.sourceMap ? extraParamChar + 'sourceMap' : '')
27 | }).join('!')
28 |
29 | // Extract CSS when that option is specified
30 | // (which is the case during production build)
31 | if (options.extract) {
32 | return ExtractTextPlugin.extract('vue-style-loader', sourceLoader)
33 | } else {
34 | return ['vue-style-loader', sourceLoader].join('!')
35 | }
36 | }
37 |
38 | // http://vuejs.github.io/vue-loader/en/configurations/extract-css.html
39 | return {
40 | css: generateLoaders(['css']),
41 | postcss: generateLoaders(['css']),
42 | less: generateLoaders(['css', 'less']),
43 | sass: generateLoaders(['css', 'sass?indentedSyntax']),
44 | scss: generateLoaders(['css', 'sass']),
45 | stylus: generateLoaders(['css', 'stylus']),
46 | styl: generateLoaders(['css', 'stylus'])
47 | }
48 | }
49 |
50 | // Generate loaders for standalone style files (outside of .vue)
51 | exports.styleLoaders = function (options) {
52 | var output = []
53 | var loaders = exports.cssLoaders(options)
54 | for (var extension in loaders) {
55 | var loader = loaders[extension]
56 | output.push({
57 | test: new RegExp('\\.' + extension + '$'),
58 | loader: loader
59 | })
60 | }
61 | return output
62 | }
63 |
--------------------------------------------------------------------------------
/build/webpack.base.conf.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable */
2 | var path = require('path')
3 | var config = require('../config')
4 | var utils = require('./utils')
5 | var projectRoot = path.resolve(__dirname, '../')
6 |
7 | var env = process.env.NODE_ENV
8 | // check env & config/index.js to decide whether to enable CSS source maps for the
9 | // various preprocessor loaders added to vue-loader at the end of this file
10 | var cssSourceMapDev = (env === 'development' && config.dev.cssSourceMap)
11 | var cssSourceMapProd = (env === 'production' && config.build.productionSourceMap)
12 | var useCssSourceMap = cssSourceMapDev || cssSourceMapProd
13 |
14 | module.exports = {
15 | entry: {
16 | app: './src/app.js'
17 | },
18 | output: {
19 | path: config.build.assetsRoot,
20 | publicPath: process.env.NODE_ENV === 'production' ? config.build.assetsPublicPath : config.dev.assetsPublicPath,
21 | filename: '[name].js'
22 | },
23 | resolve: {
24 | extensions: ['', '.js', '.vue', '.json'],
25 | fallback: [path.join(__dirname, '../node_modules')],
26 | alias: {
27 | 'vue$': 'vue/dist/vue.common.js',
28 | 'src': path.resolve(__dirname, '../src'),
29 | 'assets': path.resolve(__dirname, '../src/assets'),
30 | 'components': path.resolve(__dirname, '../src/components')
31 | }
32 | },
33 | resolveLoader: {
34 | fallback: [path.join(__dirname, '../node_modules')]
35 | },
36 | module: {
37 | preLoaders: [
38 | {
39 | test: /\.vue$/,
40 | loader: 'eslint',
41 | include: projectRoot,
42 | exclude: /node_modules/
43 | },
44 | {
45 | test: /\.js$/,
46 | loader: 'eslint',
47 | include: projectRoot,
48 | exclude: /node_modules/
49 | }
50 | ],
51 | loaders: [
52 | {
53 | test: /\.vue$/,
54 | loader: 'vue'
55 | },
56 | {
57 | test: /\.js$/,
58 | loader: 'babel',
59 | include: projectRoot,
60 | exclude: /node_modules/
61 | },
62 | {
63 | test: /\.json$/,
64 | loader: 'json'
65 | },
66 | {
67 | test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
68 | loader: 'url',
69 | query: {
70 | limit: 10000,
71 | name: utils.assetsPath('img/[name].[hash:7].[ext]')
72 | }
73 | },
74 | {
75 | test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
76 | loader: 'url',
77 | query: {
78 | limit: 10000,
79 | name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
80 | }
81 | }
82 | ]
83 | },
84 | eslint: {
85 | formatter: require('eslint-friendly-formatter')
86 | },
87 | vue: {
88 | loaders: utils.cssLoaders({ sourceMap: useCssSourceMap }),
89 | postcss: [
90 | require('autoprefixer')({
91 | browsers: ['last 2 versions']
92 | })
93 | ]
94 | }
95 | }
96 |
--------------------------------------------------------------------------------
/build/webpack.dev.conf.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable */
2 | var config = require('../config')
3 | var webpack = require('webpack')
4 | var merge = require('webpack-merge')
5 | var utils = require('./utils')
6 | var baseWebpackConfig = require('./webpack.base.conf')
7 | var HtmlWebpackPlugin = require('html-webpack-plugin')
8 |
9 | // add hot-reload related code to entry chunks
10 | Object.keys(baseWebpackConfig.entry).forEach(function (name) {
11 | baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name])
12 | })
13 |
14 | module.exports = merge(baseWebpackConfig, {
15 | module: {
16 | loaders: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap })
17 | },
18 | // eval-source-map is faster for development
19 | devtool: '#eval-source-map',
20 | plugins: [
21 | new webpack.DefinePlugin({
22 | 'process.env': config.dev.env
23 | }),
24 | // https://github.com/glenjamin/webpack-hot-middleware#installation--usage
25 | new webpack.optimize.OccurrenceOrderPlugin(),
26 | new webpack.HotModuleReplacementPlugin(),
27 | new webpack.NoErrorsPlugin(),
28 | // https://github.com/ampedandwired/html-webpack-plugin
29 | new HtmlWebpackPlugin({
30 | filename: 'index.html',
31 | template: 'index.html',
32 | inject: true
33 | })
34 | ]
35 | })
36 |
--------------------------------------------------------------------------------
/build/webpack.prod.conf.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable */
2 | var path = require('path')
3 | var config = require('../config')
4 | var utils = require('./utils')
5 | var webpack = require('webpack')
6 | var merge = require('webpack-merge')
7 | var baseWebpackConfig = require('./webpack.base.conf')
8 | var ExtractTextPlugin = require('extract-text-webpack-plugin')
9 | var HtmlWebpackPlugin = require('html-webpack-plugin')
10 | var env = config.build.env
11 |
12 | var webpackConfig = merge(baseWebpackConfig, {
13 | module: {
14 | loaders: utils.styleLoaders({ sourceMap: config.build.productionSourceMap, extract: true })
15 | },
16 | devtool: config.build.productionSourceMap ? '#source-map' : false,
17 | output: {
18 | path: config.build.assetsRoot,
19 | filename: utils.assetsPath('js/[name].[chunkhash].js'),
20 | chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
21 | },
22 | vue: {
23 | loaders: utils.cssLoaders({
24 | sourceMap: config.build.productionSourceMap,
25 | extract: true
26 | })
27 | },
28 | plugins: [
29 | // http://vuejs.github.io/vue-loader/en/workflow/production.html
30 | new webpack.DefinePlugin({
31 | 'process.env': env
32 | }),
33 | new webpack.optimize.UglifyJsPlugin({
34 | compress: {
35 | warnings: false
36 | }
37 | }),
38 | new webpack.optimize.OccurrenceOrderPlugin(),
39 | // extract css into its own file
40 | new ExtractTextPlugin(utils.assetsPath('css/[name].[contenthash].css')),
41 | // generate dist index.html with correct asset hash for caching.
42 | // you can customize output by editing /index.html
43 | // see https://github.com/ampedandwired/html-webpack-plugin
44 | new HtmlWebpackPlugin({
45 | filename: config.build.index,
46 | template: 'index.html',
47 | inject: true,
48 | minify: {
49 | removeComments: true,
50 | collapseWhitespace: true,
51 | removeAttributeQuotes: true
52 | // more options:
53 | // https://github.com/kangax/html-minifier#options-quick-reference
54 | },
55 | // necessary to consistently work with multiple chunks via CommonsChunkPlugin
56 | chunksSortMode: 'dependency'
57 | }),
58 | // split vendor js into its own file
59 | new webpack.optimize.CommonsChunkPlugin({
60 | name: 'vendor',
61 | minChunks: function (module, count) {
62 | // any required modules inside node_modules are extracted to vendor
63 | return (
64 | module.resource &&
65 | /\.js$/.test(module.resource) &&
66 | module.resource.indexOf(
67 | path.join(__dirname, '../node_modules')
68 | ) === 0
69 | )
70 | }
71 | }),
72 | // extract webpack runtime and module manifest to its own file in order to
73 | // prevent vendor hash from being updated whenever app bundle is updated
74 | new webpack.optimize.CommonsChunkPlugin({
75 | name: 'manifest',
76 | chunks: ['vendor']
77 | })
78 | ]
79 | })
80 |
81 | if (config.build.productionGzip) {
82 | var CompressionWebpackPlugin = require('compression-webpack-plugin')
83 |
84 | webpackConfig.plugins.push(
85 | new CompressionWebpackPlugin({
86 | asset: '[path].gz[query]',
87 | algorithm: 'gzip',
88 | test: new RegExp(
89 | '\\.(' +
90 | config.build.productionGzipExtensions.join('|') +
91 | ')$'
92 | ),
93 | threshold: 10240,
94 | minRatio: 0.8
95 | })
96 | )
97 | }
98 |
99 | module.exports = webpackConfig
100 |
--------------------------------------------------------------------------------
/config/dev.env.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable */
2 | var merge = require('webpack-merge')
3 | var prodEnv = require('./prod.env')
4 |
5 | module.exports = merge(prodEnv, {
6 | NODE_ENV: '"development"'
7 | })
8 |
--------------------------------------------------------------------------------
/config/index.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable */
2 | // see http://vuejs-templates.github.io/webpack for documentation.
3 | var path = require('path')
4 |
5 | module.exports = {
6 | build: {
7 | env: require('./prod.env'),
8 | index: path.resolve(__dirname, '../docs/index.html'),
9 | assetsRoot: path.resolve(__dirname, '../docs'),
10 | assetsSubDirectory: 'static',
11 | assetsPublicPath: '/element-dashboard/',
12 | productionSourceMap: true,
13 | // Gzip off by default as many popular static hosts such as
14 | // Surge or Netlify already gzip all static assets for you.
15 | // Before setting to `true`, make sure to:
16 | // npm install --save-dev compression-webpack-plugin
17 | productionGzip: false,
18 | productionGzipExtensions: ['js', 'css']
19 | },
20 | dev: {
21 | env: require('./dev.env'),
22 | port: 8080,
23 | assetsSubDirectory: 'static',
24 | assetsPublicPath: '/',
25 | proxyTable: {},
26 | // CSS Sourcemaps off by default because relative paths are "buggy"
27 | // with this option, according to the CSS-Loader README
28 | // (https://github.com/webpack/css-loader#sourcemaps)
29 | // In our experience, they generally work as expected,
30 | // just be aware of this issue when enabling this option.
31 | cssSourceMap: false
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/config/prod.env.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable */
2 | module.exports = {
3 | NODE_ENV: '"production"'
4 | }
5 |
--------------------------------------------------------------------------------
/docs/index.html:
--------------------------------------------------------------------------------
1 |
element-dashboard
--------------------------------------------------------------------------------
/docs/static/fonts/element-icons.a61be9c.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ElemeFE/element-dashboard/6df7b58e7382f8932467b0fa8bb85dd87f7578ad/docs/static/fonts/element-icons.a61be9c.eot
--------------------------------------------------------------------------------
/docs/static/fonts/element-icons.b02bdc1.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ElemeFE/element-dashboard/6df7b58e7382f8932467b0fa8bb85dd87f7578ad/docs/static/fonts/element-icons.b02bdc1.ttf
--------------------------------------------------------------------------------
/docs/static/img/element-icons.09162bc.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
147 |
--------------------------------------------------------------------------------
/docs/static/js/app.454eedb1d5bc0641b2fe.js:
--------------------------------------------------------------------------------
1 | webpackJsonp([2,0],{0:function(e,t,a){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.router=void 0;var n=a(18),o=r(n),i=a(564),s=r(i),l=a(525),u=r(l);a(539);var d=a(549),c=r(d),m=a(241),f=r(m),p=a(548),v=r(p),h=a(247),g=r(h);a(540),f.default.bootstrap(),o.default.use(s.default),o.default.use(u.default),o.default.component("db-breadcrumb",c.default);var b=t.router=new s.default({routes:g.default,mode:"hash",linkActiveClass:"active"});b.beforeEach(function(e,t,a){if(e.matched.some(function(e){return e.meta.requiresAuth})){var r=JSON.parse(localStorage.getItem("user"));r||a({path:"/login",query:{redirect:e.fullPath}})}a()}),new o.default({render:function(e){return e(v.default)},router:b}).$mount("#app")},79:function(e,t,a){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.createResume=t.postResume=t.fetchAcademicOptions=t.fetchWorkDurationOptions=t.fetchSchoolList=t.requestLogin=t.postError=t.removeUser=t.editUser=t.addUser=t.fetchList=void 0;var n=a(77),o=r(n),i="";t.fetchList=function(e){return o.default.get(i+"/user/list",{params:e})},t.addUser=function(e){return o.default.post(i+"/user/add",e)},t.editUser=function(e){return o.default.post(i+"/user/edit",e)},t.removeUser=function(e){return o.default.post(i+"/user/remove",e)},t.postError=function(e){return o.default.get(i+"/error",{params:e})},t.requestLogin=function(e){return o.default.post(i+"/login",e).then(function(e){return e.data})},t.fetchSchoolList=function(e){return o.default.get(i+"/schools").then(function(e){return e.data})},t.fetchWorkDurationOptions=function(e){return o.default.get(i+"/work_durations").then(function(e){return e.data})},t.fetchAcademicOptions=function(e){return o.default.get(i+"/academics").then(function(e){return e.data})},t.postResume=function(e){return o.default.post(i+"/resume",e).then(function(e){return e.data})},t.createResume=function(e){return o.default.post(i+"/resume/add").then(function(e){return e.data})}},123:function(e,t,a){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.Users=t.LoginUsers=void 0;for(var n=a(110),o=r(n),i=[{id:1,username:"vvliebe",password:"123456",avatar:"https://o0p2nwku4.qnssl.com/favicon.ico"}],s=[],l=200,u=0;ui)&&((!s||e.name===s)&&(!l||e.age===l)))});if(r){var c=r.order,m=r.prop;d=d.sort(function(e,t){return"ascending"===c?e[m]-t[m]:t[m]-e[m]})}return 0===a&&a++,d=d.filter(function(e,t){return t<20*a&&t>=20*(a-1)}),new o.default(function(e,t){setTimeout(function(){e([200,{total:u.length,users:d}])},500)})},add:function(e){var t=JSON.parse(e.data),a=t.name,r=t.address,n=t.age,i=t.time;return u.push({id:s.default.Random.guid(),name:a,address:r,age:n,date:new Date(i).getTime()}),new o.default(function(e,t){setTimeout(function(){e([200,{code:200,msg:"添加成功"}])})})},remove:function(e){var t=JSON.parse(e.data),a=t.id;return u=u.filter(function(e){return e.id!==a}),new o.default(function(e,t){setTimeout(function(){e([200,{code:200,msg:"删除成功"}])})})},edit:function(e){var t=JSON.parse(e.data),a=t.id,r=t.name,n=t.address,i=t.age,s=t.time;return u.some(function(e){if(e.id===a)return e.name=r||e.name,e.address=n||e.address,e.age=i||e.age,e.date=s?new Date(s).getTime():e.date,!0}),new o.default(function(e,t){setTimeout(function(){e([200,{code:200,msg:"编辑成功"}])})})}}},244:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.AcademicOptions=[{label:"小学",value:0},{label:"初中",value:1},{label:"高中",value:2},{label:"大专",value:3},{label:"本科",value:4},{label:"硕士",value:5},{label:"博士",value:6}]},245:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.Schools=[{id:1,name:"北京航空航天大学",major_list:[{id:1,name:"高等工程学院"},{id:2,name:"电子工程学院"},{id:3,name:"软件工程"}]},{id:2,name:"北京大学",major_list:[{id:1,name:"地球化学"},{id:2,name:"电子工程学院"},{id:3,name:"软件工程"}]},{id:3,name:"中国人民大学",major_list:[{id:1,name:"法学院"},{id:2,name:"电子工程学院"},{id:3,name:"软件工程"}]}]},246:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.WorkDurationOptions=[{label:"在校学生",value:0},{label:"1年经验",value:1},{label:"1~3年经验",value:2},{label:"3~5年经验",value:3},{label:"5年以上经验",value:4}]},247:function(e,t,a){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var n=a(18),o=r(n),i=a(552),s=r(i),l=a(551),u=r(l),d=a(554),c=r(d),m=a(553),f=r(m),p=a(555),v=r(p),h=a(550),g=r(h),b=o.default.component("root",{template:""}),_=[{path:"/login",component:v.default,name:"login",meta:{hidden:!0}},{path:"/404",component:u.default,name:"404",meta:{requiresAuth:!0}},{path:"/",component:b,meta:{requiresAuth:!0},children:[{path:"list",component:s.default,name:"列表",iconClass:"el-icon-message",children:[{path:"filters",name:"搜索条件",component:c.default,imgUrl:"https://o0p2g4ul8.qnssl.com/vsite%2Fbackground.jpg"}]},{path:"form",component:s.default,name:"表单",iconClass:"el-icon-document",children:[{path:"big-form",name:"简历管理",component:f.default,imgUrl:"https://o0p2g4ul8.qnssl.com/vsite%2Fbackground.jpg"}]},{path:"chart",component:g.default,name:"图表",iconClass:"el-icon-document"}]},{path:"*",redirect:{path:"/404"}}],w=_.length;_[w-2].children.forEach(function(e){e.children&&(e.meta||(e.meta={}),e.meta.children=e.children)}),t.default=_},248:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={data:function(){return{user:{id:"",username:"",avatar:""},activeMenu:""}},created:function(){this.activeMenu=this.$route.name,this.user=JSON.parse(localStorage.getItem("user"))},watch:{$route:function(e,t){this.activeMenu=this.$route.name,this.user=JSON.parse(localStorage.getItem("user"))}},methods:{logout:function(){var e=this;this.$confirm("确定要注销吗?","提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"info"}).then(function(){localStorage.removeItem("user"),e.$router.push({path:"/login"})}).catch(function(){})}}}},249:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={name:"db-breadcrumb",data:function(){return{breadcrumbs:[]}},mounted:function(){this.breadcrumbs=this.$parent&&this.$parent.$route&&this.$parent.$route.matched||[]}}},250:function(e,t,a){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var n=a(293),o=r(n);t.default={data:function(){return{}},mounted:function(){var e=document.getElementById("chart-page");o.default.init(e).setOption({title:{text:"柱形图示例"},tooltip:{},xAxis:{data:["星期一","星期二","星期三","星期四","星期五","星期六","星期日"]},yAxis:{},series:[{name:"销量",type:"bar",data:[5,20,36,10,10,20,30]}]});var t=document.getElementById("line-chart");o.default.init(t).setOption({title:{text:"折线图示例",subtext:"纯属虚构"},tooltip:{trigger:"axis"},legend:{data:["意向","预购","成交"]},toolbox:{show:!0,feature:{magicType:{show:!0,type:["stack","tiled"]},saveAsImage:{show:!0}}},xAxis:{type:"category",boundaryGap:!1,data:["周一","周二","周三","周四","周五","周六","周日"]},yAxis:{type:"value"},series:[{name:"成交",type:"line",smooth:!0,data:[10,12,21,54,260,830,710]},{name:"预购",type:"line",smooth:!0,data:[30,182,434,791,390,30,10]},{name:"意向",type:"line",smooth:!0,data:[1320,1132,601,234,120,90,20]}]});var a=document.getElementById("chart-pie");o.default.init(a).setOption({backgroundColor:"#2c343c",title:{text:"饼图",top:20,textStyle:{color:"#ccc"}},tooltip:{trigger:"item",formatter:"{a}
{b} : {c} ({d}%)"},visualMap:{show:!1,min:80,max:600,inRange:{colorLightness:[0,1]}},series:[{name:"访问来源",type:"pie",radius:"55%",center:["50%","50%"],data:[{value:335,name:"直接访问"},{value:310,name:"邮件营销"},{value:274,name:"联盟广告"},{value:235,name:"视频广告"},{value:400,name:"搜索引擎"}].sort(function(e,t){return e.value-t.value}),roseType:"angle",label:{normal:{textStyle:{color:"rgba(255, 255, 255, 0.3)"}}},labelLine:{normal:{lineStyle:{color:"rgba(255, 255, 255, 0.3)"},smooth:.2,length:10,length2:20}},itemStyle:{normal:{color:"#c23531",shadowBlur:200,shadowColor:"rgba(0, 0, 0, 0.5)"}},animationType:"scale",animationEasing:"elasticOut",animationDelay:function(e){return 200*Math.random()}}]});var r=document.getElementById("funnel-chart");o.default.init(r).setOption({title:{text:"漏斗图",subtext:"纯属虚构"},tooltip:{trigger:"item",formatter:"{a}
{b} : {c}%"},toolbox:{feature:{dataView:{readOnly:!1},restore:{},saveAsImage:{}}},legend:{data:["展现","点击","访问","咨询","订单"]},calculable:!0,series:[{name:"漏斗图",type:"funnel",left:"10%",top:60,bottom:60,width:"80%",min:0,max:100,minSize:"0%",maxSize:"100%",sort:"descending",gap:2,label:{normal:{show:!0,position:"inside"},emphasis:{textStyle:{fontSize:20}}},labelLine:{normal:{length:10,lineStyle:{width:1,type:"solid"}}},itemStyle:{normal:{borderColor:"#fff",borderWidth:1}},data:[{value:60,name:"访问"},{value:40,name:"咨询"},{value:20,name:"订单"},{value:80,name:"点击"},{value:100,name:"展现"}]}]})},methods:{}}},251:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={data:function(){return{children:null}},beforeRouteEnter:function(e,t,a){a(function(e){var t=e.$route.meta.children;t?e.children=t:e.children=null})},watch:{$route:function(e,t){var a=this.$route.meta.children;a?this.children=a:this.children=null}}}},252:function(e,t,a){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var n=a(80),o=r(n),i=a(79);t.default={data:function(){return{form:{name:"",school:"",major:"",company:"",position:"",gender:"",birthday:"",workDuration:null,academic:null,city:"",phone:"",email:"",website:"",skills:[],resumeId:""},schoolList:[],selectedSchoolId:null,workDurationOptions:[],academicOptions:[],resume:[],rules:{name:[{required:!0,message:"请输入姓名",trigger:"blur"}],school:[{required:!0,message:"请选择学校",trigger:"change"}],major:[{required:!0,message:"请选择专业",trigger:"change"}],company:[{required:!0,message:"请输入公司",trigger:"blur"}],position:[{required:!0,message:"请输入职位",trigger:"blur"}],gender:[{required:!0,message:"请选择性别",trigger:"change"}],birthday:[{type:"date",required:!0,message:"请输入生日",trigger:"change"}],workDuration:[{type:"number",required:!0,message:"请选择工作年限",trigger:"change"}],academic:[{type:"number",required:!0,message:"请选择学历",trigger:"change"}],city:[{required:!0,message:"请输入意向城市",trigger:"blur"}],phone:[{required:!0,message:"请输入联系方式",trigger:"blur"}],email:[{required:!0,message:"请输入邮箱",trigger:"blur"}],website:[{required:!0,message:"请输入网站",trigger:"blur"}],skills:[{type:"array",required:!0,message:"请至少输入一条技能",trigger:"blur"}]}}},mounted:function(){this.getSchoolList(),this.getWorkDurationOptions(),this.getAcademicOptions()},methods:{getSchoolList:function(){var e=this;(0,i.fetchSchoolList)().then(function(t){var a=t.code,r=t.school_list;200===a&&(r.forEach(function(e){e.value=e.name,e.major_list.forEach(function(e){e.value=e.name})}),e.schoolList=r,e.selectedSchoolId=r[0]?r[0].id:null)})},getWorkDurationOptions:function(){var e=this;(0,i.fetchWorkDurationOptions)().then(function(t){var a=t.code,r=t.workDurationOptions;200===a&&(e.workDurationOptions=r)})},getAcademicOptions:function(){var e=this;(0,i.fetchAcademicOptions)().then(function(t){var a=t.code,r=t.academicOptions;200===a&&(e.academicOptions=r)})},getSchoolsInfo:function(e,t){var a=this.schoolList.filter(function(t){return t.name.indexOf(e)>-1});t(a)},getMajorsInfo:function(e,t){var a=this.majorList.filter(function(t){return t.name.indexOf(e)>-1});t(a)},handleSelectSchool:function(e){this.selectedSchoolId=e.id},addSkill:function(){this.form.skills.push({name:"",value:0})},saveSkill:function(){},deleteSkill:function(e){this.form.skills.splice(e,1)},handleRemove:function(e,t){},handlePreview:function(e){},handleSuccess:function(){},handleError:function(){},uploadResume:function(){var e=this;return(0,i.postResume)({data:this.resume[0]}).then(function(t){var a=t.code,r=t.msg,n=t.resume_id;200===a?e.form.resumeId=n:e.$message.error(r)}),!1},reset:function(){this.$refs.form.resetFields()},submit:function(){var e=this;this.$refs.form.validate(function(t){return!!t&&(console.log(JSON.parse((0,o.default)(e.form))),void(0,i.createResume)(e.form).then(function(){e.$message({message:"提交成功",type:"success"})}))})}},computed:{majorList:function(){var e=this;return 0!==this.schoolList.length&&this.selectedSchoolId?this.schoolList.filter(function(t){return t.id===e.selectedSchoolId})[0].major_list:[]}}}},253:function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=a(79);t.default={data:function(){return{users:[],total:0,page:0,loading:!0,multipleSelection:[],reserveSelection:!1,editDialog:!1,createDialog:!1,filters:{sortWay:"",userName:"",startEndTime:"",labelVal:"1",age:""},editForm:{id:"",name:"",time:""},createForm:{name:"",time:"",address:""},selectedOptions:[{value:"1",label:"年龄"},{value:"2",label:"姓名"}]}},methods:{formatDate:function(e){return new Date(e.date).toLocaleDateString()},handleSortChange:function(e){this.filters.sortWay={prop:e.prop,order:e.order},this.fetchData()},handleEditSave:function(){var e=this;(0,r.editUser)(this.editForm).then(function(){e.fetchData(),e.editDialog=!1,e.$message({message:"编辑成功",type:"success"})})},handleSave:function(){var e=this;(0,r.addUser)(this.createForm).then(function(){e.fetchData(),e.createDialog=!1,e.$message({message:"保存成功",type:"success"})})},handleEdit:function(e,t){this.editForm.id=t.id,this.editDialog=!0},handleDelete:function(e,t){var a=this;this.$confirm("是否删除此条信息?","提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(function(){(0,r.removeUser)({id:t.id}).then(function(){a.fetchData(),a.$message({message:"删除成功",type:"success"})})})},handleSelectionChange:function(e){this.multipleSelection=e},handleSearch:function(){this.fetchData()},handleCurrentChange:function(e){this.fetchData(e)},fetchData:function(e){var t=this,a=this.filters.sortWay&&this.filters.sortWay.prop?this.filters.sortWay:"";this.page=e||this.page;var n=this.filters.startEndTime?this.filters.startEndTime[0].getTime():"",o=this.filters.startEndTime?this.filters.startEndTime[1].getTime():"";console.log("this.filters.labelVal",this.filters.labelVal);var i={page:this.page,userName:"2"===this.filters.labelVal?this.filters.userName:null,startTime:n,endTime:o,sortWay:a,age:"1"===this.filters.labelVal?parseInt(this.filters.age,10):null};this.loading=!0,(0,r.fetchList)(i).then(function(e){t.$refs.table.clearSelection(),t.users=e.data.users,t.total=e.data.total,t.loading=!1})}},mounted:function(){this.fetchData()}}},254:function(e,t,a){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var n=a(80),o=r(n),i=a(79);t.default={data:function(){return{username:"vvliebe",password:"123456",rememberMe:!1,isBtnLoading:!1}},computed:{btnText:function(){return this.isBtnLoading?"登录中...":"登录"}},methods:{login:function(){var e=this;if(!this.username)return void this.$message.error("请填写用户名!!!");if(!this.password)return void this.$message.error("请填写密码");var t={username:this.username,password:this.password};this.isBtnLoading=!0,(0,i.requestLogin)(t).then(function(t){e.isBtnLoading=!1;var a=t.msg,r=t.code,n=t.user;200!==r?e.$message.error(a):(localStorage.setItem("user",(0,o.default)(n)),e.$route.query.redirect?e.$router.push({path:e.$route.query.redirect}):e.$router.push({path:"/list"}))})}}}},539:function(e,t){},540:function(e,t){},541:function(e,t){},542:function(e,t){},543:function(e,t){},544:function(e,t){},545:function(e,t){},546:function(e,t){},547:function(e,t){},548:function(e,t,a){a(547);var r=a(31)(a(248),a(563),null,null);e.exports=r.exports},549:function(e,t,a){a(545);var r=a(31)(a(249),a(561),null,null);e.exports=r.exports},550:function(e,t,a){a(544);var r=a(31)(a(250),a(559),"data-v-522a188d",null);e.exports=r.exports},551:function(e,t,a){var r=a(31)(null,a(560),null,null);e.exports=r.exports},552:function(e,t,a){a(541);var r=a(31)(a(251),a(556),null,null);e.exports=r.exports},553:function(e,t,a){a(543);var r=a(31)(a(252),a(558),"data-v-51dad2fc",null);e.exports=r.exports},554:function(e,t,a){a(542);var r=a(31)(a(253),a(557),null,null);e.exports=r.exports},555:function(e,t,a){a(546);var r=a(31)(a(254),a(562),"data-v-90a44f3a",null);e.exports=r.exports},556:function(e,t){e.exports={render:function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",{staticClass:"abstract"},[e.children?a("el-row",e._l(e.children,function(t,r){return a("el-col",{attrs:{xs:10,sm:8,md:6,lg:4,offset:r>0?2:0}},[a("el-card",{attrs:{"body-style":{padding:"0px"}}},[a("div",{staticClass:"card-wrapper"},[a("div",{staticClass:"img"},[a("img",{attrs:{src:t.imgUrl,type:"image/webp"}})]),e._v(" "),a("div",{staticClass:"text"},[a("p",[e._v(e._s(t.name))]),e._v(" "),a("router-link",{attrs:{to:{name:t.name}}},[e._v("查看")])],1)])])],1)})):e._e(),e._v(" "),a("router-view")],1)},staticRenderFns:[]}},557:function(e,t){e.exports={render:function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",{attrs:{id:"ListWithFiltersPage"}},[a("db-breadcrumb"),e._v(" "),a("div",{staticClass:"db-content-inner"},[a("div",{staticClass:"filters"},[a("div",{staticClass:"filter"},[a("el-select",{directives:[{name:"model",rawName:"v-model",value:e.filters.labelVal,expression:"filters.labelVal"}],attrs:{clearable:"",placeholder:"请选择"},domProps:{value:e.filters.labelVal},on:{input:function(t){e.filters.labelVal=t}}},e._l(e.selectedOptions,function(e){return a("el-option",{attrs:{label:e.label,value:e.value}})})),e._v(" "),a("el-input",{directives:[{name:"model",rawName:"v-model",value:e.filters.age,expression:"filters.age"},{name:"show",rawName:"v-show",value:"1"==e.filters.labelVal,expression:"filters.labelVal == '1'"}],attrs:{placeholder:"请输入年龄"},domProps:{value:e.filters.age},on:{input:function(t){e.filters.age=t}}}),e._v(" "),a("el-input",{directives:[{name:"model",rawName:"v-model",value:e.filters.userName,expression:"filters.userName"},{name:"show",rawName:"v-show",value:"2"==e.filters.labelVal,expression:"filters.labelVal == '2'"}],attrs:{placeholder:"请输入姓名"},domProps:{value:e.filters.userName},on:{input:function(t){e.filters.userName=t}}})],1),e._v(" "),a("div",{staticClass:"filter"},[e._v("\n 起止时间:\n "),a("el-date-picker",{directives:[{name:"model",rawName:"v-model",value:e.filters.startEndTime,expression:"filters.startEndTime"}],staticStyle:{width:"350px"},attrs:{type:"datetimerange",placeholder:"选择时间范围"},domProps:{value:e.filters.startEndTime},on:{input:function(t){e.filters.startEndTime=t}}})],1),e._v(" "),a("el-button",{attrs:{type:"primary"},on:{click:function(t){e.handleSearch()}}},[e._v("搜索")]),e._v(" "),a("el-button",{attrs:{type:"primary"},on:{click:function(t){e.createDialog=!0}}},[e._v("创建")])],1),e._v(" "),a("el-table",{directives:[{name:"loading",rawName:"v-loading",value:e.loading,expression:"loading"}],ref:"table",staticStyle:{width:"100%"},attrs:{data:e.users,"element-loading-text":"拼命加载中",stripe:""},on:{"selection-change":e.handleSelectionChange,"sort-change":e.handleSortChange}},[a("el-table-column",{attrs:{type:"selection",width:"55","reserve-selection":e.reserveSelection}}),e._v(" "),a("el-table-column",{attrs:{prop:"date",label:"出生日期",formatter:e.formatDate,width:"180"}}),e._v(" "),a("el-table-column",{attrs:{prop:"name",label:"姓名"}}),e._v(" "),a("el-table-column",{attrs:{prop:"age",sortable:"custom",label:"年龄"}}),e._v(" "),a("el-table-column",{attrs:{prop:"address",label:"地址"}}),e._v(" "),a("el-table-column",{attrs:{context:e._self,width:"150",label:"操作"},inlineTemplate:{render:function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",[a("el-button",{attrs:{size:"small"},on:{click:function(t){e.handleEdit(e.$index,e.row)}}},[e._v("编辑")]),e._v(" "),a("el-button",{attrs:{size:"small",type:"danger"},on:{click:function(t){e.handleDelete(e.$index,e.row)}}},[e._v("删除")])],1)},staticRenderFns:[]}})],1),e._v(" "),a("div",{directives:[{name:"show",rawName:"v-show",value:!e.loading,expression:"!loading"}],staticClass:"pagination-wrapper"},[a("el-pagination",{attrs:{layout:"prev, pager, next","page-size":20},on:{"current-change":e.handleCurrentChange}})],1),e._v(" "),a("el-dialog",{directives:[{name:"model",rawName:"v-model",value:e.editDialog,expression:"editDialog"}],attrs:{title:"编辑",size:"tiny"},domProps:{value:e.editDialog},on:{input:function(t){e.editDialog=t}}},[a("el-form",{ref:"editForm",attrs:{model:e.editForm,"label-width":"80px"}},[a("el-form-item",{attrs:{label:"姓名"}},[a("el-input",{directives:[{name:"model",rawName:"v-model",value:e.editForm.name,expression:"editForm.name"}],staticClass:"el-col-24",domProps:{value:e.editForm.name},on:{input:function(t){e.editForm.name=t}}})],1),e._v(" "),a("el-form-item",{attrs:{label:"出生日期"}},[a("el-date-picker",{directives:[{name:"model",rawName:"v-model",value:e.editForm.time,expression:"editForm.time"}],staticClass:"el-col-24",attrs:{type:"datetime",placeholder:"选择日期时间"},domProps:{value:e.editForm.time},on:{input:function(t){e.editForm.time=t}}})],1)],1),e._v(" "),a("span",{staticClass:"dialog-footer",slot:"footer"},[a("el-button",{on:{click:function(t){e.editDialog=!1}}},[e._v("取 消")]),e._v(" "),a("el-button",{attrs:{type:"primary"},on:{click:function(t){e.handleEditSave()}}},[e._v("确 定")])],1)],1),e._v(" "),a("el-dialog",{directives:[{name:"model",rawName:"v-model",value:e.createDialog,expression:"createDialog"}],attrs:{title:"保存",size:"tiny"},domProps:{value:e.createDialog},on:{input:function(t){e.createDialog=t}}},[a("el-form",{ref:"createFrom",attrs:{model:e.createForm,"label-width":"80px"}},[a("el-form-item",{attrs:{label:"姓名"}},[a("el-input",{directives:[{name:"model",rawName:"v-model",value:e.createForm.name,expression:"createForm.name"}],staticClass:"el-col-24",domProps:{value:e.createForm.name},on:{input:function(t){e.createForm.name=t}}})],1),e._v(" "),a("el-form-item",{attrs:{label:"出生日期"}},[a("el-date-picker",{directives:[{name:"model",rawName:"v-model",value:e.createForm.time,expression:"createForm.time"}],staticClass:"el-col-24",attrs:{type:"datetime",placeholder:"选择日期时间"},domProps:{value:e.createForm.time},on:{input:function(t){e.createForm.time=t}}})],1),e._v(" "),a("el-form-item",{attrs:{label:"地址"}},[a("el-input",{directives:[{name:"model",rawName:"v-model",value:e.createForm.address,expression:"createForm.address"}],staticClass:"el-col-24",domProps:{value:e.createForm.address},on:{input:function(t){e.createForm.address=t}}})],1)],1),e._v(" "),a("span",{staticClass:"dialog-footer",slot:"footer"},[a("el-button",{on:{click:function(t){e.createDialog=!1}}},[e._v("取 消")]),e._v(" "),a("el-button",{attrs:{type:"primary"},on:{click:function(t){e.handleSave()}}},[e._v("确 定")])],1)],1)],1)],1)},staticRenderFns:[]}},558:function(e,t){e.exports={render:function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",{attrs:{id:"big-form"}},[a("db-breadcrumb"),e._v(" "),a("div",{staticClass:"db-content-inner"},[a("el-form",{ref:"form",attrs:{rules:e.rules,model:e.form,"label-width":"100px"}},[a("el-form-item",{attrs:{label:"姓名",prop:"name"}},[a("el-input",{directives:[{name:"model",rawName:"v-model",value:e.form.name,expression:"form.name"}],attrs:{placeholder:"请输入您的姓名"},domProps:{value:e.form.name},on:{input:function(t){e.form.name=t}}})],1),e._v(" "),a("el-form-item",{attrs:{label:"性别",prop:"gender"}},[a("el-radio-group",{directives:[{name:"model",rawName:"v-model",value:e.form.gender,expression:"form.gender"}],domProps:{value:e.form.gender},on:{input:function(t){e.form.gender=t}}},[a("el-radio",{attrs:{label:"男"}},[e._v("男")]),e._v(" "),a("el-radio",{attrs:{label:"女"}},[e._v("女")])],1)],1),e._v(" "),a("el-form-item",{attrs:{label:"生日",prop:"birthday"}},[a("el-date-picker",{directives:[{name:"model",rawName:"v-model",value:e.form.birthday,expression:"form.birthday"}],attrs:{type:"date",placeholder:"请输入您的生日"},domProps:{value:e.form.birthday},on:{input:function(t){e.form.birthday=t}}})],1),e._v(" "),a("el-form-item",{attrs:{label:"工作年限",prop:"workDuration"}},[a("el-select",{directives:[{name:"model",rawName:"v-model",value:e.form.workDuration,expression:"form.workDuration"}],attrs:{placeholder:"请选择"},domProps:{value:e.form.workDuration},on:{input:function(t){e.form.workDuration=t}}},e._l(e.workDurationOptions,function(e){return a("el-option",{attrs:{label:e.label,value:e.value}})}))],1),e._v(" "),a("el-form-item",{attrs:{label:"最高学历",prop:"academic"}},[a("el-select",{directives:[{name:"model",rawName:"v-model",value:e.form.academic,expression:"form.academic"}],attrs:{placeholder:"请选择"},domProps:{value:e.form.academic},on:{input:function(t){e.form.academic=t}}},e._l(e.academicOptions,function(e){return a("el-option",{attrs:{label:e.label,value:e.value}})}))],1),e._v(" "),a("el-form-item",{attrs:{label:"学校",prop:"school"}},[a("el-autocomplete",{directives:[{name:"model",rawName:"v-model",value:e.form.school,expression:"form.school"}],attrs:{"fetch-suggestions":e.getSchoolsInfo,placeholder:"请输入您的学校"},domProps:{value:e.form.school},on:{select:e.handleSelectSchool,input:function(t){e.form.school=t}}})],1),e._v(" "),a("el-form-item",{attrs:{label:"专业",prop:"major"}},[a("el-autocomplete",{directives:[{name:"model",rawName:"v-model",value:e.form.major,expression:"form.major"}],attrs:{disabled:!e.form.school,"fetch-suggestions":e.getMajorsInfo,placeholder:"请输入您的专业"},domProps:{value:e.form.major},on:{input:function(t){e.form.major=t}}})],1),e._v(" "),a("el-form-item",{attrs:{label:"在职公司",prop:"company"}},[a("el-input",{directives:[{name:"model",rawName:"v-model",value:e.form.company,expression:"form.company"}],attrs:{placeholder:"请输入您目前所在的公司名称"},domProps:{value:e.form.company},on:{input:function(t){e.form.company=t}}})],1),e._v(" "),a("el-form-item",{attrs:{label:"职位",prop:"position"}},[a("el-input",{directives:[{name:"model",rawName:"v-model",value:e.form.position,expression:"form.position"}],attrs:{placeholder:"请输入您的职位名称"},domProps:{value:e.form.position},on:{input:function(t){e.form.position=t}}})],1),e._v(" "),a("el-form-item",{attrs:{label:"城市",prop:"city"}},[a("el-input",{directives:[{name:"model",rawName:"v-model",value:e.form.city,expression:"form.city"}],attrs:{placeholder:"请输入您意向的工作地点"},domProps:{value:e.form.city},on:{input:function(t){e.form.city=t}}})],1),e._v(" "),a("el-form-item",{attrs:{label:"联系方式",prop:"phone"}},[a("el-input",{directives:[{name:"model",rawName:"v-model",value:e.form.phone,expression:"form.phone"}],attrs:{placeholder:"请输入您的联系方式"},domProps:{value:e.form.phone},on:{input:function(t){e.form.phone=t}}})],1),e._v(" "),a("el-form-item",{attrs:{label:"邮箱",prop:"email"}},[a("el-input",{directives:[{name:"model",rawName:"v-model",value:e.form.email,expression:"form.email"}],attrs:{placeholder:"请输入您的邮箱"},domProps:{value:e.form.email},on:{input:function(t){e.form.email=t}}})],1),e._v(" "),a("el-form-item",{attrs:{label:"网站",prop:"website"}},[a("el-input",{directives:[{name:"model",rawName:"v-model",value:e.form.website,expression:"form.website"}],attrs:{placeholder:"请输入您的个人博客"},domProps:{value:e.form.website},on:{input:function(t){e.form.website=t}}},[a("template",{slot:"prepend"},[e._v("http://")])],2)],1),e._v(" "),a("el-form-item",{attrs:{label:"技能",prop:"skills"}},[e._l(e.form.skills,function(t,r){return a("el-row",{staticClass:"skill-line",attrs:{type:"flex",align:"middle"}},[a("el-col",{attrs:{span:5}},[a("el-input",{directives:[{name:"model",rawName:"v-model",value:t.name,expression:"skill.name"}],attrs:{placeholder:"请输入技能"},domProps:{value:t.name},on:{input:function(e){t.name=e}}})],1),e._v(" "),a("el-col",{attrs:{span:12,offset:1}},[a("el-slider",{directives:[{name:"model",rawName:"v-model",value:t.value,expression:"skill.value"}],domProps:{value:t.value},on:{input:function(e){t.value=e}}})],1),e._v(" "),a("el-col",{attrs:{span:6,offset:1}},[a("el-button",{attrs:{type:"primary",icon:"delete"},on:{click:function(t){e.deleteSkill(r)}}}),e._v(" "),r===e.form.skills.length-1?a("el-button",{attrs:{type:"primary",icon:"plus"},on:{click:e.addSkill}}):e._e()],1)],1)}),e._v(" "),e.form.skills.length<=0?a("el-row",[a("el-col",{attrs:{span:6,offset:1}},[a("el-button",{attrs:{type:"primary",icon:"plus"},on:{click:e.addSkill}},[e._v("添加技能")])],1)],1):e._e()],2),e._v(" "),a("el-form-item",{attrs:{label:"个人简历"}},[a("el-upload",{attrs:{action:"/resume",type:"drag",accept:"pdf","before-upload":e.uploadResume,"on-preview":e.handlePreview,"on-remove":e.handleRemove,"on-success":e.handleSuccess,"on-error":e.handleError,"default-file-list":e.resume}},[a("i",{staticClass:"el-icon-upload"}),e._v(" "),a("div",{staticClass:"el-dragger__text"},[e._v("将文件拖到此处,或"),a("em",[e._v("点击上传")])]),e._v(" "),a("div",{staticClass:"el-upload__tip",slot:"tip"},[e._v("只能上传pdf文件,且不超过5M")])])],1),e._v(" "),a("el-form-item",[a("el-button",{attrs:{type:"primary"},on:{click:e.submit}},[e._v("立即创建")]),e._v(" "),a("el-button",{on:{click:e.reset}},[e._v("重置")])],1)],1)],1)],1)},staticRenderFns:[]}},559:function(e,t){e.exports={render:function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",{staticClass:"main"},[a("el-row",{attrs:{gutter:20}},[a("el-col",{attrs:{span:8}},[a("div",{staticClass:"grid-content"},[a("div",{attrs:{id:"chart-page"}})])]),e._v(" "),a("el-col",{attrs:{span:8}},[a("div",{staticClass:"grid-content"},[a("div",{attrs:{id:"line-chart"}})])]),e._v(" "),a("el-col",{attrs:{span:8}},[a("div",{staticClass:"grid-content"})])],1),e._v(" "),a("el-row",{
2 | attrs:{gutter:20}},[a("el-col",{attrs:{span:8}},[a("div",{staticClass:"grid-content"},[a("div",{attrs:{id:"chart-pie"}})])]),e._v(" "),a("el-col",{attrs:{span:8}},[a("div",{staticClass:"grid-content"},[a("div",{attrs:{id:"funnel-chart"}})])]),e._v(" "),a("el-col",{attrs:{span:8}},[a("div",{staticClass:"grid-content"})])],1)],1)},staticRenderFns:[]}},560:function(e,t){e.exports={render:function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("p",[e._v("页面未找到!")])},staticRenderFns:[]}},561:function(e,t){e.exports={render:function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("el-breadcrumb",{attrs:{separator:"/"}},[a("span",{staticClass:"db-breadcrumb-loc"},[e._v("位置:")]),e._v(" "),e._l(e.breadcrumbs,function(t){return a("el-breadcrumb-item",{attrs:{to:t}},[e._v("\n "+e._s(t.name)+"\n ")])})],2)},staticRenderFns:[]}},562:function(e,t){e.exports={render:function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",{attrs:{id:"login-page"},on:{keyup:function(t){e._k(t.keyCode,"enter",13)||e.login(t)}}},[a("div",{staticClass:"login-form"},[a("div",{staticClass:"input-group"},[a("div",{staticClass:"title"},[e._v("Element Dashboard")]),e._v(" "),a("el-input",{directives:[{name:"model",rawName:"v-model",value:e.username,expression:"username"}],attrs:{autofocus:!0,placeholder:"请输入用户名",icon:"time"},domProps:{value:e.username},on:{input:function(t){e.username=t}}})],1),e._v(" "),a("div",{staticClass:"input-group"},[a("el-input",{directives:[{name:"model",rawName:"v-model",value:e.password,expression:"password"}],attrs:{placeholder:"请输入密码",type:"password",icon:"time"},domProps:{value:e.password},on:{input:function(t){e.password=t}}})],1),e._v(" "),a("div",{staticClass:"input-group"},[a("label",[e._v("记住我?")]),e._v(" "),a("el-switch",{directives:[{name:"model",rawName:"v-model",value:e.rememberMe,expression:"rememberMe"}],attrs:{"on-text":"","off-text":""},domProps:{value:e.rememberMe},on:{input:function(t){e.rememberMe=t}}})],1),e._v(" "),a("div",{staticClass:"input-group"},[a("el-button",{attrs:{type:"primary",loading:e.isBtnLoading},nativeOn:{click:function(t){e.login(t)}}},[e._v(e._s(e.btnText))])],1)])])},staticRenderFns:[]}},563:function(e,t){e.exports={render:function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("section",{staticClass:"db"},[e.$route.meta.hidden?[a("router-view")]:[a("header",{staticClass:"db-header"},[a("router-link",{staticClass:"logo",attrs:{to:{path:"/list/filters"}}},[e._v("Element Dashboard")]),e._v(" "),e.user.id?a("div",{staticClass:"user-info"},[a("span",{domProps:{textContent:e._s(e.user.username)}}),e._v(" "),a("el-dropdown",{attrs:{trigger:"click"}},[a("span",{staticClass:"el-dropdown-link"},[a("img",{attrs:{src:e.user.avatar}})]),e._v(" "),a("el-dropdown-menu",{slot:"dropdown"},[a("el-dropdown-item",[e._v("个人信息")]),e._v(" "),a("el-dropdown-item",[e._v("设置")]),e._v(" "),a("el-dropdown-item",{nativeOn:{click:function(t){e.logout(t)}}},[e._v("注销")])],1)],1)],1):e._e()],1),e._v(" "),a("div",{staticClass:"db-body"},[a("aside",{staticClass:"db-menu-wrapper"},[a("el-menu",{staticClass:"db-menu-bar",attrs:{"default-active":e.activeMenu,router:""}},[e._l(e.$router.options.routes[e.$router.options.routes.length-2].children,function(t,r){return[t.children&&t.name?[a("el-submenu",{attrs:{index:t.name}},[a("template",{slot:"title"},[a("i",{class:t.iconClass}),e._v(e._s(t.name))]),e._v(" "),e._l(t.children,function(t,r){return a("el-menu-item",{attrs:{index:t.name,route:t}},[e._v(e._s(t.name))])})],2)]:e._e(),e._v(" "),!t.children&&t.name?[a("el-menu-item",{attrs:{index:t.name,route:t}},[a("i",{class:t.iconClass}),e._v(e._s(t.name))])]:e._e()]})],2)],1),e._v(" "),a("div",{staticClass:"db-content-wrapper"},[a("section",{staticClass:"db-content"},[a("router-view")],1)])])]],2)},staticRenderFns:[]}}});
3 | //# sourceMappingURL=app.454eedb1d5bc0641b2fe.js.map
--------------------------------------------------------------------------------
/docs/static/js/manifest.10d67edc14ae1e536fbc.js:
--------------------------------------------------------------------------------
1 | !function(e){function t(a){if(n[a])return n[a].exports;var r=n[a]={exports:{},id:a,loaded:!1};return e[a].call(r.exports,r,r.exports,t),r.loaded=!0,r.exports}var a=window.webpackJsonp;window.webpackJsonp=function(o,c){for(var s,l,p=0,d=[];p
2 |
3 |
4 |
5 | element-dashboard
6 |
7 |
8 |
9 |
10 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "element-dashboard",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "dev": "node build/dev-server.js",
8 | "build": "node build/build.js"
9 | },
10 | "repository": {
11 | "type": "git",
12 | "url": "git+https://github.com/ElemeFE/element-dashboard.git"
13 | },
14 | "author": [
15 | "zheng.yu@ele.me",
16 | "hanbiao.xiong@ele.me"
17 | ],
18 | "license": "MIT",
19 | "bugs": {
20 | "url": "https://github.com/ElemeFE/element-dashboard/issues"
21 | },
22 | "homepage": "https://github.com/ElemeFE/element-dashboard#readme",
23 | "dependencies": {
24 | "axios": "^0.15.2",
25 | "babel-polyfill": "*",
26 | "core-js": "^2.4.1",
27 | "echarts": "^3.4.0",
28 | "element-ui": "^1.0.0",
29 | "moment": "^2.17.1",
30 | "vue": "^2.0.1",
31 | "vue-router": "^2.0.3"
32 | },
33 | "devDependencies": {
34 | "autoprefixer": "^6.4.0",
35 | "axios-mock-adapter": "^1.7.1",
36 | "babel-core": "^6.0.0",
37 | "babel-eslint": "^7.0.0",
38 | "babel-loader": "^6.0.0",
39 | "babel-plugin-transform-runtime": "^6.0.0",
40 | "babel-preset-es2015": "^6.0.0",
41 | "babel-preset-stage-2": "^6.0.0",
42 | "babel-register": "^6.0.0",
43 | "chalk": "^1.1.3",
44 | "connect-history-api-fallback": "^1.1.0",
45 | "cooking-vue2": "^0.3.0",
46 | "css-loader": "^0.25.0",
47 | "eslint": "^3.7.1",
48 | "eslint-config-elemefe": "^0.1.1",
49 | "eslint-config-standard": "^6.1.0",
50 | "eslint-config-vue": "^2.0.1",
51 | "eslint-friendly-formatter": "^2.0.5",
52 | "eslint-loader": "^1.5.0",
53 | "eslint-plugin-html": "^1.3.0",
54 | "eslint-plugin-promise": "^3.4.0",
55 | "eslint-plugin-standard": "^2.0.1",
56 | "eslint-plugin-vue": "^1.0.0",
57 | "eventsource-polyfill": "^0.9.6",
58 | "express": "^4.13.3",
59 | "extract-text-webpack-plugin": "^1.0.1",
60 | "file-loader": "^0.9.0",
61 | "function-bind": "^1.0.2",
62 | "html-webpack-plugin": "^2.8.1",
63 | "http-proxy-middleware": "^0.17.2",
64 | "json-loader": "^0.5.4",
65 | "mockjs": "^1.0.1-beta3",
66 | "node-sass": "^4.1.1",
67 | "opn": "^4.0.2",
68 | "ora": "^0.3.0",
69 | "sass-loader": "^4.1.1",
70 | "semver": "^5.3.0",
71 | "shelljs": "^0.7.4",
72 | "url-loader": "^0.5.7",
73 | "vue-loader": "^10.0.0",
74 | "vue-style-loader": "^1.0.0",
75 | "vue-template-compiler": "^2.1.0",
76 | "webpack": "^1.13.2",
77 | "webpack-dev-middleware": "^1.8.3",
78 | "webpack-hot-middleware": "^2.12.2",
79 | "webpack-merge": "^0.14.1"
80 | },
81 | "engines": {
82 | "node": ">= 4.0.0",
83 | "npm": ">= 3.0.0"
84 | }
85 | }
86 |
--------------------------------------------------------------------------------
/src/api/api.js:
--------------------------------------------------------------------------------
1 | import axios from 'axios';
2 |
3 | let base = '';
4 |
5 | export const fetchList = params => { return axios.get(`${ base }/user/list`, {params: params}); };
6 |
7 | export const addUser = params => { return axios.post(`${ base }/user/add`, params); };
8 |
9 | export const editUser = params => { return axios.post(`${ base }/user/edit`, params); };
10 |
11 | export const removeUser = params => { return axios.post(`${ base }/user/remove`, params); };
12 |
13 | export const postError = params => { return axios.get(`${ base }/error`, {params: params}); };
14 |
15 | export const requestLogin = params => { return axios.post(`${ base }/login`, params).then(res => res.data); };
16 |
17 | export const fetchSchoolList = params => {return axios.get(`${ base }/schools`).then(res => res.data); };
18 |
19 | export const fetchWorkDurationOptions = params => {return axios.get(`${ base }/work_durations`).then(res => res.data); };
20 |
21 | export const fetchAcademicOptions = params => {return axios.get(`${ base }/academics`).then(res => res.data); };
22 |
23 | export const postResume = params => {return axios.post(`${ base }/resume`, params).then(res => res.data);};
24 |
25 | export const createResume = params => { return axios.post(`${ base }/resume/add`).then(res => res.data); };
26 |
--------------------------------------------------------------------------------
/src/api/index.js:
--------------------------------------------------------------------------------
1 | import * as api from './api';
2 |
3 | export default api;
4 |
--------------------------------------------------------------------------------
/src/app.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import VueRouter from 'vue-router';
3 |
4 | import ElementUI from 'element-ui';
5 | import 'element-ui/lib/theme-default/index.css';
6 |
7 | import Breadcrumb from './components/breadcrumb';
8 |
9 | // start mock
10 | import Mock from './mock';
11 | Mock.bootstrap();
12 |
13 | import App from './app.vue';
14 | import routes from './routes';
15 | import './style.scss';
16 |
17 | Vue.use(VueRouter);
18 | Vue.use(ElementUI);
19 |
20 | // register dashboard components
21 | Vue.component('db-breadcrumb', Breadcrumb);
22 |
23 | export const router = new VueRouter({
24 | routes,
25 | mode: 'hash',
26 | linkActiveClass: 'active'
27 | });
28 |
29 | router.beforeEach((to, from, next) => {
30 | if (to.matched.some(record => record.meta.requiresAuth)) {
31 | let user = JSON.parse(localStorage.getItem('user'));
32 | if (!user) {
33 | next({path: '/login', query: {redirect: to.fullPath}});
34 | }
35 | }
36 | next();
37 | });
38 |
39 | new Vue({
40 | render: h => h(App),
41 | router
42 | }).$mount('#app');
43 |
--------------------------------------------------------------------------------
/src/app.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
43 |
44 |
45 |
46 |
47 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
97 |
98 |
173 |
--------------------------------------------------------------------------------
/src/assets/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ElemeFE/element-dashboard/6df7b58e7382f8932467b0fa8bb85dd87f7578ad/src/assets/.gitkeep
--------------------------------------------------------------------------------
/src/components/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ElemeFE/element-dashboard/6df7b58e7382f8932467b0fa8bb85dd87f7578ad/src/components/.gitkeep
--------------------------------------------------------------------------------
/src/components/breadcrumb.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 | 位置:
4 |
5 | {{ item.name }}
6 |
7 |
8 |
9 |
10 |
25 |
26 |
31 |
--------------------------------------------------------------------------------
/src/components/index.js:
--------------------------------------------------------------------------------
1 | import Breadcrumb from './breadcrumb';
2 |
3 | export default {
4 | Breadcrumb
5 | };
6 |
--------------------------------------------------------------------------------
/src/mock/index.js:
--------------------------------------------------------------------------------
1 | import mock from './mock';
2 |
3 | export default mock;
4 |
--------------------------------------------------------------------------------
/src/mock/mock.js:
--------------------------------------------------------------------------------
1 | import axios from 'axios';
2 | import MockAdapter from 'axios-mock-adapter';
3 | import { LoginUsers } from '../resources/user';
4 | import { Schools } from '../resources/schools';
5 | import { WorkDurationOptions } from '../resources/work-durations';
6 | import { AcademicOptions } from '../resources/academics';
7 | import UserAPI from './user';
8 | import Mock from 'mockjs';
9 |
10 | export default {
11 | /**
12 | * mock bootstrap
13 | */
14 | bootstrap() {
15 | let mock = new MockAdapter(axios);
16 |
17 | // mock list request
18 | mock.onGet('/user/list').reply(UserAPI.list);
19 |
20 | mock.onPost('/user/add').reply(UserAPI.add);
21 |
22 | mock.onPost('/user/remove').reply(UserAPI.remove);
23 |
24 | mock.onPost('/user/edit').reply(UserAPI.edit);
25 | // mock success request
26 | mock.onPost('/resume/add').reply(200, {
27 | msg: 'success'
28 | });
29 |
30 | // mock error request
31 | mock.onGet('/error').reply(500, {
32 | msg: 'failure'
33 | });
34 |
35 | mock.onPost('/login').reply(config => {
36 | let {username, password} = JSON.parse(config.data);
37 | return new Promise((resolve, reject) => {
38 | let user = null;
39 | setTimeout(() => {
40 | let hasUser = LoginUsers.some(u => {
41 | if (u.username === username && u.password === password) {
42 | user = JSON.parse(JSON.stringify(u));
43 | user.password = undefined;
44 | return true;
45 | }
46 | });
47 |
48 | if (hasUser) {
49 | resolve([200, { code: 200, msg: '请求成功!!!', user }]);
50 | } else {
51 | resolve([200, { code: 500, msg: '用户名或密码错误!!!' }]);
52 | }
53 | }, Math.random() * 1000 + 1000);
54 | });
55 | });
56 |
57 | mock.onGet('/schools').reply(config => {
58 | return new Promise((resolve, reject) => {
59 | setTimeout(() => {
60 | let school_list = JSON.parse(JSON.stringify(Schools));
61 | resolve([200, {code: 200, msg: '请求成功!!!', school_list}]);
62 | }, Math.random() * 200 + 50);
63 | });
64 | });
65 |
66 | mock.onGet('/work_durations').reply(config => {
67 | return new Promise((resolve, reject) => {
68 | setTimeout(() => {
69 | let workDurationOptions = JSON.parse(JSON.stringify(WorkDurationOptions));
70 | resolve([200, {code: 200, msg: '请求成功!!!', workDurationOptions}]);
71 | }, Math.random() * 200 + 50);
72 | });
73 | });
74 |
75 | mock.onGet('/academics').reply(config => {
76 | return new Promise((resolve, reject) => {
77 | setTimeout(() => {
78 | let academicOptions = JSON.parse(JSON.stringify(AcademicOptions));
79 | resolve([200, {code: 200, msg: '请求成功!!!', academicOptions}]);
80 | }, Math.random() * 200 + 50);
81 | });
82 | });
83 |
84 | mock.onPost('/resume').reply(config => {
85 | return new Promise((resolve, reject) => {
86 | setTimeout(() => {
87 | resolve([200, {code: 200, msg: '上传成功', resume_id: Mock.Random.guid()}]);
88 | }, Math.random() * 200 + 50);
89 | });
90 | });
91 | }
92 | };
93 |
--------------------------------------------------------------------------------
/src/mock/user.js:
--------------------------------------------------------------------------------
1 | import Mock from 'mockjs';
2 | import { Users } from '../resources/user';
3 | let _Users = Users;
4 |
5 | export default {
6 | list: config => {
7 | let {page, sortWay, startTime, endTime, userName, age} = config.params;
8 | let mockUsers = _Users.filter(user => {
9 | if (startTime && user.date < startTime) return false;
10 | if (endTime && user.date > endTime) return false;
11 | if (userName && user.name !== userName) return false;
12 | if (age && user.age !== age) return false;
13 | return true;
14 | });
15 | if (sortWay) {
16 | let {order, prop} = sortWay;
17 | mockUsers = mockUsers.sort((u1, u2) => order === 'ascending' ? u1[prop] - u2[prop] : u2[prop] - u1[prop]);
18 | }
19 | if (page === 0) page++;
20 | mockUsers = mockUsers.filter((u, index) => index < 20 * page && index >= 20 * (page - 1));
21 | return new Promise((resolve, reject) => {
22 | setTimeout(() => {
23 | resolve([200, {
24 | total: _Users.length,
25 | users: mockUsers
26 | } ]);
27 | }, 500);
28 | });
29 | },
30 | add: config => {
31 | let { name, address, age, time } = JSON.parse(config.data);
32 | _Users.push({
33 | id: Mock.Random.guid(),
34 | name,
35 | address,
36 | age,
37 | date: new Date(time).getTime()
38 | });
39 | return new Promise((resolve, reject) => {
40 | setTimeout(() => {
41 | resolve([200, {
42 | code: 200,
43 | msg: '添加成功'
44 | }]);
45 | });
46 | });
47 | },
48 | remove: config => {
49 | let { id } = JSON.parse(config.data);
50 | _Users = _Users.filter(u => u.id !== id);
51 | return new Promise((resolve, reject) => {
52 | setTimeout(() => {
53 | resolve([200, {
54 | code: 200,
55 | msg: '删除成功'
56 | }]);
57 | });
58 | });
59 | },
60 | edit: config => {
61 | let { id, name, address, age, time } = JSON.parse(config.data);
62 | _Users.some(u => {
63 | if (u.id === id) {
64 | u.name = name || u.name;
65 | u.address = address || u.address;
66 | u.age = age || u.age;
67 | u.date = time ? new Date(time).getTime() : u.date;
68 | return true;
69 | }
70 | });
71 | return new Promise((resolve, reject) => {
72 | setTimeout(() => {
73 | resolve([200, {
74 | code: 200,
75 | msg: '编辑成功'
76 | }]);
77 | });
78 | });
79 | }
80 | };
81 |
--------------------------------------------------------------------------------
/src/pages/chart/chart.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
9 |
10 |
11 |
12 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
25 |
26 |
27 |
28 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
260 |
261 |
269 |
--------------------------------------------------------------------------------
/src/pages/common/404.vue:
--------------------------------------------------------------------------------
1 |
2 | 页面未找到!
3 |
4 |
--------------------------------------------------------------------------------
/src/pages/common/abstract.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
![]()
9 |
10 |
11 |
{{route.name}}
12 |
查看
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
51 |
52 |
75 |
--------------------------------------------------------------------------------
/src/pages/form/big-form.vue:
--------------------------------------------------------------------------------
1 |
2 |
137 |
138 |
139 |
323 |
324 |
335 |
--------------------------------------------------------------------------------
/src/pages/list/with-filters.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
18 |
19 |
20 |
21 |
22 |
23 |
24 | 起止时间:
25 |
26 |
27 |
搜索
28 |
创建
29 |
30 |
31 |
32 |
33 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 | 编辑
46 | 删除
47 |
48 |
49 |
50 |
51 |
52 |
53 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
71 |
72 |
73 |
74 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
265 |
266 |
296 |
--------------------------------------------------------------------------------
/src/pages/login/login.vue:
--------------------------------------------------------------------------------
1 |
2 |
34 |
35 |
36 |
83 |
84 |
123 |
--------------------------------------------------------------------------------
/src/resources/academics.js:
--------------------------------------------------------------------------------
1 | export const AcademicOptions = [
2 | {
3 | label: '小学',
4 | value: 0
5 | },
6 | {
7 | label: '初中',
8 | value: 1
9 | },
10 | {
11 | label: '高中',
12 | value: 2
13 | },
14 | {
15 | label: '大专',
16 | value: 3
17 | },
18 | {
19 | label: '本科',
20 | value: 4
21 | },
22 | {
23 | label: '硕士',
24 | value: 5
25 | },
26 | {
27 | label: '博士',
28 | value: 6
29 | }
30 | ];
31 |
--------------------------------------------------------------------------------
/src/resources/schools.js:
--------------------------------------------------------------------------------
1 | export const Schools = [
2 | {
3 | id: 1,
4 | name: '北京航空航天大学',
5 | major_list: [
6 | {
7 | id: 1,
8 | name: '高等工程学院'
9 | },
10 | {
11 | id: 2,
12 | name: '电子工程学院'
13 | },
14 | {
15 | id: 3,
16 | name: '软件工程'
17 | }
18 | ]
19 | },
20 | {
21 | id: 2,
22 | name: '北京大学',
23 | major_list: [
24 | {
25 | id: 1,
26 | name: '地球化学'
27 | },
28 | {
29 | id: 2,
30 | name: '电子工程学院'
31 | },
32 | {
33 | id: 3,
34 | name: '软件工程'
35 | }
36 | ]
37 | },
38 | {
39 | id: 3,
40 | name: '中国人民大学',
41 | major_list: [
42 | {
43 | id: 1,
44 | name: '法学院'
45 | },
46 | {
47 | id: 2,
48 | name: '电子工程学院'
49 | },
50 | {
51 | id: 3,
52 | name: '软件工程'
53 | }
54 | ]
55 | }
56 | ];
57 |
--------------------------------------------------------------------------------
/src/resources/user.js:
--------------------------------------------------------------------------------
1 | import Mock from 'mockjs';
2 | const LoginUsers = [
3 | {
4 | id: 1,
5 | username: 'vvliebe',
6 | password: '123456',
7 | avatar: 'https://o0p2nwku4.qnssl.com/favicon.ico'
8 | }
9 | ];
10 |
11 | const Users = [];
12 | const userCount = 200;
13 |
14 | for (let i = 0; i < userCount; i++) {
15 | Users.push(Mock.mock({
16 | id: Mock.Random.guid(),
17 | name: Mock.Random.cname(),
18 | address: Mock.mock('@county(true)'),
19 | 'age|18-60': 1,
20 | date: Number(Mock.Random.datetime('T'))
21 | }));
22 | }
23 |
24 | export { LoginUsers, Users };
25 |
--------------------------------------------------------------------------------
/src/resources/work-durations.js:
--------------------------------------------------------------------------------
1 | export const WorkDurationOptions = [
2 | {
3 | label: '在校学生',
4 | value: 0
5 | },
6 | {
7 | label: '1年经验',
8 | value: 1
9 | },
10 | {
11 | label: '1~3年经验',
12 | value: 2
13 | },
14 | {
15 | label: '3~5年经验',
16 | value: 3
17 | },
18 | {
19 | label: '5年以上经验',
20 | value: 4
21 | }
22 | ];
23 |
--------------------------------------------------------------------------------
/src/routes.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import Abstract from './pages/common/abstract';
3 | import NotFound from './pages/common/404';
4 |
5 | // list with filters page
6 | import ListWithFilters from './pages/list/with-filters';
7 | import BigForm from './pages/form/big-form';
8 | import Login from './pages/login/login';
9 | import chart from './pages/chart/chart';
10 |
11 | const root = Vue.component('root', {
12 | template: ''
13 | });
14 |
15 | let routes = [
16 | {
17 | path: '/login',
18 | component: Login,
19 | name: 'login',
20 | meta: {
21 | hidden: true
22 | }
23 | },
24 | {
25 | path: '/404',
26 | component: NotFound,
27 | name: '404',
28 | meta: {
29 | requiresAuth: true
30 | }
31 | },
32 | {
33 | path: '/',
34 | component: root,
35 | meta: {
36 | requiresAuth: true
37 | },
38 | children: [
39 | {
40 | path: 'list',
41 | component: Abstract,
42 | name: '列表',
43 | iconClass: 'el-icon-message',
44 | children: [
45 | {
46 | path: 'filters',
47 | name: '搜索条件',
48 | component: ListWithFilters,
49 | imgUrl: 'https://o0p2g4ul8.qnssl.com/vsite%2Fbackground.jpg'
50 | }
51 | ]
52 | },
53 | {
54 | path: 'form',
55 | component: Abstract,
56 | name: '表单',
57 | iconClass: 'el-icon-document',
58 | children: [
59 | {
60 | path: 'big-form',
61 | name: '简历管理',
62 | component: BigForm,
63 | imgUrl: 'https://o0p2g4ul8.qnssl.com/vsite%2Fbackground.jpg'
64 | }
65 | ]
66 | },
67 | {
68 | path: 'chart',
69 | component: chart,
70 | name: '图表',
71 | iconClass: 'el-icon-document'
72 | /* children: [
73 | {
74 | path: 'big-form',
75 | name: '简历管理',
76 | component: BigForm,
77 | imgUrl: 'https://o0p2g4ul8.qnssl.com/vsite%2Fbackground.jpg'
78 | }
79 | ]*/
80 | }
81 | ]
82 | },
83 | {
84 | path: '*',
85 | redirect: {path: '/404'}
86 | }
87 | ];
88 | let menuCount = routes.length;
89 | routes[menuCount - 2].children.forEach(route => {
90 | if (route.children) {
91 | if (!route.meta) route.meta = {};
92 | route.meta.children = route.children;
93 | }
94 | });
95 |
96 | export default routes;
97 |
--------------------------------------------------------------------------------
/src/style.scss:
--------------------------------------------------------------------------------
1 | // Project specific
2 | @import "styles/global";
3 |
4 | // third party css
5 |
--------------------------------------------------------------------------------
/src/styles/_global.scss:
--------------------------------------------------------------------------------
1 | // global styles
2 | html{
3 | height: 100%;
4 | margin: 0;
5 | font-size: 62.5%;
6 | }
7 |
8 | body {
9 | font-size: 1.4rem;
10 | padding: 0;
11 | margin: 0;
12 | font-family: Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei,SimSun,sans-serif;
13 | font-weight: 400;
14 | -webkit-font-smoothing: antialiased;
15 | }
16 |
17 | a {
18 | text-decoration: none;
19 | color: inherit;
20 | }
21 |
22 | // override element style
23 | // hack
24 | .el-loading-mask {
25 | z-index: 1000;
26 | }
27 |
--------------------------------------------------------------------------------
/src/styles/_variables.scss:
--------------------------------------------------------------------------------
1 | // the variables and mixins
2 |
3 | $dark-gray: #35405b
4 |
--------------------------------------------------------------------------------
/src/utils/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ElemeFE/element-dashboard/6df7b58e7382f8932467b0fa8bb85dd87f7578ad/src/utils/.gitkeep
--------------------------------------------------------------------------------