├── .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 | 4 | 5 | Created by FontForge 20120731 at Tue Sep 6 12:16:07 2016 6 | By admin 7 | 8 | 9 | 10 | 24 | 26 | 28 | 30 | 32 | 36 | 38 | 40 | 42 | 44 | 46 | 48 | 50 | 52 | 54 | 57 | 60 | 63 | 66 | 69 | 72 | 75 | 77 | 79 | 83 | 85 | 87 | 90 | 93 | 96 | 99 | 101 | 104 | 107 | 109 | 112 | 117 | 121 | 125 | 128 | 131 | 134 | 138 | 142 | 145 | 146 | 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 | 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 | 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 | 37 | 38 | 260 | 261 | 269 | -------------------------------------------------------------------------------- /src/pages/common/404.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /src/pages/common/abstract.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 51 | 52 | 75 | -------------------------------------------------------------------------------- /src/pages/form/big-form.vue: -------------------------------------------------------------------------------- 1 | 138 | 139 | 323 | 324 | 335 | -------------------------------------------------------------------------------- /src/pages/list/with-filters.vue: -------------------------------------------------------------------------------- 1 | 105 | 106 | 265 | 266 | 296 | -------------------------------------------------------------------------------- /src/pages/login/login.vue: -------------------------------------------------------------------------------- 1 | 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 --------------------------------------------------------------------------------