├── .babelrc ├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── .postcssrc.js ├── README.md ├── _config.yml ├── build ├── build.js ├── check-versions.js ├── logo.png ├── utils.js ├── vue-loader.conf.js ├── webpack.base.conf.js ├── webpack.dev.conf.js └── webpack.prod.conf.js ├── config ├── dev.env.js ├── index.js └── prod.env.js ├── dist ├── index.html └── static │ ├── css │ ├── app.9b21055ce9c6856f3c8acd23a25f953b.css │ ├── app.9b21055ce9c6856f3c8acd23a25f953b.css.gz │ └── app.9b21055ce9c6856f3c8acd23a25f953b.css.map │ ├── fonts │ └── element-icons.6f0a763.ttf │ ├── img │ └── logo.fd80e1d.jpg │ └── js │ ├── 0.3a9aa42a329f9b43d8d8.js │ ├── 0.3a9aa42a329f9b43d8d8.js.map │ ├── 1.4820c59af53e9840bc88.js │ ├── 1.4820c59af53e9840bc88.js.gz │ ├── 1.4820c59af53e9840bc88.js.map │ ├── 2.34a849fc09a8134d7c4a.js │ ├── 2.34a849fc09a8134d7c4a.js.gz │ ├── 2.34a849fc09a8134d7c4a.js.map │ ├── 3.9bfee001cf87b62d6d89.js │ ├── 3.9bfee001cf87b62d6d89.js.map │ ├── 4.63b0c96043a372cc3690.js │ ├── 4.63b0c96043a372cc3690.js.map │ ├── 5.d1d7303e40cf7949eead.js │ ├── 5.d1d7303e40cf7949eead.js.map │ ├── app.2fb34aa4ce1edba4a0b5.js │ ├── app.2fb34aa4ce1edba4a0b5.js.map │ ├── manifest.edd1a25d37861aeb8ac9.js │ ├── manifest.edd1a25d37861aeb8ac9.js.map │ ├── vendor.df53402265652c8f9c64.js │ ├── vendor.df53402265652c8f9c64.js.gz │ └── vendor.df53402265652c8f9c64.js.map ├── index.html ├── package-lock.json ├── package.json ├── screenshots ├── detail.jpg ├── home.jpg ├── login.jpg └── register.jpg ├── src ├── App.vue ├── assets │ ├── css │ │ └── base.css │ └── images │ │ ├── login_bg.jpg │ │ └── logo.jpg ├── common │ ├── api.js │ └── mockdata.js ├── components │ ├── aside.vue │ └── footer.vue ├── main.js ├── pages │ ├── demo │ │ └── index.vue │ ├── home │ │ └── index.vue │ ├── login │ │ ├── login.vue │ │ └── register.vue │ └── post │ │ └── single.vue ├── router │ └── index.js ├── store │ ├── action.js │ ├── index.js │ ├── mutation.js │ └── state.js └── utils │ ├── env.js │ ├── fetch.js │ └── mUtils.js └── static └── .gitkeep /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["env", { 4 | "modules": false, 5 | "targets": { 6 | "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] 7 | } 8 | }], 9 | "stage-2" 10 | ], 11 | "plugins": ["transform-vue-jsx", "transform-runtime"] 12 | } 13 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | /build/ 2 | /config/ 3 | /dist/ 4 | /*.js 5 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | // https://eslint.org/docs/user-guide/configuring 2 | 3 | module.exports = { 4 | root: true, 5 | parserOptions: { 6 | parser: 'babel-eslint' 7 | }, 8 | env: { 9 | browser: true, 10 | }, 11 | extends: [ 12 | // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention 13 | // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules. 14 | 'plugin:vue/essential', 15 | // https://github.com/standard/standard/blob/master/docs/RULES-en.md 16 | 'standard' 17 | ], 18 | // required to lint *.vue files 19 | plugins: [ 20 | 'vue' 21 | ], 22 | // add your custom rules here 23 | rules: { 24 | // allow async-await 25 | 'generator-star-spacing': 'off', 26 | // allow debugger during development 27 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | npm-debug.log* 4 | yarn-debug.log* 5 | yarn-error.log* 6 | 7 | # Editor directories and files 8 | .idea 9 | .vscode 10 | *.suo 11 | *.ntvs* 12 | *.njsproj 13 | *.sln 14 | -------------------------------------------------------------------------------- /.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | "plugins": { 5 | "postcss-import": {}, 6 | "postcss-url": {}, 7 | // to edit target browsers: use "browserslist" field in package.json 8 | "autoprefixer": {} 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # h-blog 2 | 3 | > A Vue.js project 用elementUI模仿[我的博客](http://www.hehaibao.com/),简单的写的几个练习页面,仅供参考。 4 | 5 | ## 技术栈 6 | 7 | vue-cli(vue 2.x + webpack + vue-router) + elementUI + ES6 + mock + axios 8 | 9 | 本地代码已全部通过ESlint检测。 10 | 11 | ## 在线预览 12 | 13 | https://hehaibao.github.io/h-blog/dist/index.html 14 | 15 | ## 主要功能 16 | 17 | - [x] 首页(含mock) 18 | ![image](/screenshots/home.jpg) 19 | 20 | - [x] 文章详情页 21 | ![image](/screenshots/detail.jpg) 22 | 23 | - [x] 登录页(含验证和是否登录的逻辑) 24 | ![image](/screenshots/login.jpg) 25 | 26 | - [x] 注册页(含验证) 27 | ![image](/screenshots/register.jpg) 28 | 29 | 里面涉及到了路由的导航守卫,组件的复用,sessionStorage存储是否登录状态,父子组件通信,elementUI的一些用法 等等 30 | 31 | 更多功能,后续有时间会继续添加.. 32 | 33 | ## 如何使用? 34 | 35 | ``` bash 36 | # clone 37 | git clone https://github.com/hehaibao/h-blog.git 38 | 39 | # cd dir 40 | cd h-blog 41 | 42 | # install dependencies 43 | npm install 44 | 45 | # serve with hot reload at localhost:8080 46 | npm run dev 47 | 48 | or 49 | 50 | npm start 51 | 52 | # build for production with minification 53 | npm run build 54 | 55 | # build for production and view the bundle analyzer report 56 | npm run build --report 57 | ``` 58 | 59 | For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader). 60 | 61 | 62 | ## 说明 63 | 64 | > 如果对您有帮助,您可以点右上角 "Star" 支持一下 谢谢! ^_^ 65 | 66 | > 或者您可以 "follow" 一下,我会不断开源更多的有趣的项目 67 | 68 | > 开发环境 macOS 10.12.6 Chrome 68  nodejs 6.10.0 69 | 70 | > 如有问题请直接在 Issues 中提,或者您发现问题并有非常好的解决方案,欢迎 PR 👍 71 | 72 | 73 | ## License 74 | 75 | MIT 76 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-minimal -------------------------------------------------------------------------------- /build/build.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | require('./check-versions')() 3 | 4 | process.env.NODE_ENV = 'production' 5 | 6 | const ora = require('ora') 7 | const rm = require('rimraf') 8 | const path = require('path') 9 | const chalk = require('chalk') 10 | const webpack = require('webpack') 11 | const config = require('../config') 12 | const webpackConfig = require('./webpack.prod.conf') 13 | 14 | const spinner = ora('building for production...') 15 | spinner.start() 16 | 17 | rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { 18 | if (err) throw err 19 | webpack(webpackConfig, (err, stats) => { 20 | spinner.stop() 21 | if (err) throw err 22 | process.stdout.write(stats.toString({ 23 | colors: true, 24 | modules: false, 25 | children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build. 26 | chunks: false, 27 | chunkModules: false 28 | }) + '\n\n') 29 | 30 | if (stats.hasErrors()) { 31 | console.log(chalk.red(' Build failed with errors.\n')) 32 | process.exit(1) 33 | } 34 | 35 | console.log(chalk.cyan(' Build complete.\n')) 36 | console.log(chalk.yellow( 37 | ' Tip: built files are meant to be served over an HTTP server.\n' + 38 | ' Opening index.html over file:// won\'t work.\n' 39 | )) 40 | }) 41 | }) 42 | -------------------------------------------------------------------------------- /build/check-versions.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const chalk = require('chalk') 3 | const semver = require('semver') 4 | const packageConfig = require('../package.json') 5 | const shell = require('shelljs') 6 | 7 | function exec (cmd) { 8 | return require('child_process').execSync(cmd).toString().trim() 9 | } 10 | 11 | const versionRequirements = [ 12 | { 13 | name: 'node', 14 | currentVersion: semver.clean(process.version), 15 | versionRequirement: packageConfig.engines.node 16 | } 17 | ] 18 | 19 | if (shell.which('npm')) { 20 | versionRequirements.push({ 21 | name: 'npm', 22 | currentVersion: exec('npm --version'), 23 | versionRequirement: packageConfig.engines.npm 24 | }) 25 | } 26 | 27 | module.exports = function () { 28 | const warnings = [] 29 | 30 | for (let i = 0; i < versionRequirements.length; i++) { 31 | const mod = versionRequirements[i] 32 | 33 | if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { 34 | warnings.push(mod.name + ': ' + 35 | chalk.red(mod.currentVersion) + ' should be ' + 36 | chalk.green(mod.versionRequirement) 37 | ) 38 | } 39 | } 40 | 41 | if (warnings.length) { 42 | console.log('') 43 | console.log(chalk.yellow('To use this template, you must update following to modules:')) 44 | console.log() 45 | 46 | for (let i = 0; i < warnings.length; i++) { 47 | const warning = warnings[i] 48 | console.log(' ' + warning) 49 | } 50 | 51 | console.log() 52 | process.exit(1) 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /build/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hehaibao/h-blog/4e25b12b70913967b834781da37a604abf952f67/build/logo.png -------------------------------------------------------------------------------- /build/utils.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const config = require('../config') 4 | const ExtractTextPlugin = require('extract-text-webpack-plugin') 5 | const packageConfig = require('../package.json') 6 | 7 | exports.assetsPath = function (_path) { 8 | const assetsSubDirectory = process.env.NODE_ENV === 'production' 9 | ? config.build.assetsSubDirectory 10 | : config.dev.assetsSubDirectory 11 | 12 | return path.posix.join(assetsSubDirectory, _path) 13 | } 14 | 15 | exports.cssLoaders = function (options) { 16 | options = options || {} 17 | 18 | const cssLoader = { 19 | loader: 'css-loader', 20 | options: { 21 | sourceMap: options.sourceMap 22 | } 23 | } 24 | 25 | const postcssLoader = { 26 | loader: 'postcss-loader', 27 | options: { 28 | sourceMap: options.sourceMap 29 | } 30 | } 31 | 32 | // generate loader string to be used with extract text plugin 33 | function generateLoaders (loader, loaderOptions) { 34 | const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader] 35 | 36 | if (loader) { 37 | loaders.push({ 38 | loader: loader + '-loader', 39 | options: Object.assign({}, loaderOptions, { 40 | sourceMap: options.sourceMap 41 | }) 42 | }) 43 | } 44 | 45 | // Extract CSS when that option is specified 46 | // (which is the case during production build) 47 | if (options.extract) { 48 | return ExtractTextPlugin.extract({ 49 | use: loaders, 50 | fallback: 'vue-style-loader' 51 | }) 52 | } else { 53 | return ['vue-style-loader'].concat(loaders) 54 | } 55 | } 56 | 57 | // https://vue-loader.vuejs.org/en/configurations/extract-css.html 58 | return { 59 | css: generateLoaders(), 60 | postcss: generateLoaders(), 61 | less: generateLoaders('less'), 62 | sass: generateLoaders('sass', { indentedSyntax: true }), 63 | scss: generateLoaders('sass'), 64 | stylus: generateLoaders('stylus'), 65 | styl: generateLoaders('stylus') 66 | } 67 | } 68 | 69 | // Generate loaders for standalone style files (outside of .vue) 70 | exports.styleLoaders = function (options) { 71 | const output = [] 72 | const loaders = exports.cssLoaders(options) 73 | 74 | for (const extension in loaders) { 75 | const loader = loaders[extension] 76 | output.push({ 77 | test: new RegExp('\\.' + extension + '$'), 78 | use: loader 79 | }) 80 | } 81 | 82 | return output 83 | } 84 | 85 | exports.createNotifierCallback = () => { 86 | const notifier = require('node-notifier') 87 | 88 | return (severity, errors) => { 89 | if (severity !== 'error') return 90 | 91 | const error = errors[0] 92 | const filename = error.file && error.file.split('!').pop() 93 | 94 | notifier.notify({ 95 | title: packageConfig.name, 96 | message: severity + ': ' + error.name, 97 | subtitle: filename || '', 98 | icon: path.join(__dirname, 'logo.png') 99 | }) 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /build/vue-loader.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const utils = require('./utils') 3 | const config = require('../config') 4 | const isProduction = process.env.NODE_ENV === 'production' 5 | const sourceMapEnabled = isProduction 6 | ? config.build.productionSourceMap 7 | : config.dev.cssSourceMap 8 | 9 | module.exports = { 10 | loaders: utils.cssLoaders({ 11 | sourceMap: sourceMapEnabled, 12 | extract: isProduction 13 | }), 14 | cssSourceMap: sourceMapEnabled, 15 | cacheBusting: config.dev.cacheBusting, 16 | transformToRequire: { 17 | video: ['src', 'poster'], 18 | source: 'src', 19 | img: 'src', 20 | image: 'xlink:href' 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /build/webpack.base.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const utils = require('./utils') 4 | const config = require('../config') 5 | const vueLoaderConfig = require('./vue-loader.conf') 6 | 7 | function resolve (dir) { 8 | return path.join(__dirname, '..', dir) 9 | } 10 | 11 | const createLintingRule = () => ({ 12 | test: /\.(js|vue)$/, 13 | loader: 'eslint-loader', 14 | enforce: 'pre', 15 | include: [resolve('src'), resolve('test')], 16 | options: { 17 | formatter: require('eslint-friendly-formatter'), 18 | emitWarning: !config.dev.showEslintErrorsInOverlay 19 | } 20 | }) 21 | 22 | module.exports = { 23 | context: path.resolve(__dirname, '../'), 24 | entry: { 25 | app: './src/main.js' 26 | }, 27 | output: { 28 | path: config.build.assetsRoot, 29 | filename: '[name].js', 30 | publicPath: process.env.NODE_ENV === 'production' 31 | ? config.build.assetsPublicPath 32 | : config.dev.assetsPublicPath 33 | }, 34 | resolve: { 35 | extensions: ['.js', '.vue', '.json'], 36 | alias: { 37 | 'vue$': 'vue/dist/vue.esm.js', 38 | '@': resolve('src'), 39 | } 40 | }, 41 | module: { 42 | rules: [ 43 | ...(config.dev.useEslint ? [createLintingRule()] : []), 44 | { 45 | test: /\.vue$/, 46 | loader: 'vue-loader', 47 | options: vueLoaderConfig 48 | }, 49 | { 50 | test: /\.js$/, 51 | loader: 'babel-loader', 52 | include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')] 53 | }, 54 | { 55 | test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, 56 | loader: 'url-loader', 57 | options: { 58 | limit: 10000, 59 | name: utils.assetsPath('img/[name].[hash:7].[ext]') 60 | } 61 | }, 62 | { 63 | test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, 64 | loader: 'url-loader', 65 | options: { 66 | limit: 10000, 67 | name: utils.assetsPath('media/[name].[hash:7].[ext]') 68 | } 69 | }, 70 | { 71 | test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, 72 | loader: 'url-loader', 73 | options: { 74 | limit: 10000, 75 | name: utils.assetsPath('fonts/[name].[hash:7].[ext]') 76 | } 77 | } 78 | ] 79 | }, 80 | node: { 81 | // prevent webpack from injecting useless setImmediate polyfill because Vue 82 | // source contains it (although only uses it if it's native). 83 | setImmediate: false, 84 | // prevent webpack from injecting mocks to Node native modules 85 | // that does not make sense for the client 86 | dgram: 'empty', 87 | fs: 'empty', 88 | net: 'empty', 89 | tls: 'empty', 90 | child_process: 'empty' 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /build/webpack.dev.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const utils = require('./utils') 3 | const webpack = require('webpack') 4 | const config = require('../config') 5 | const merge = require('webpack-merge') 6 | const path = require('path') 7 | const baseWebpackConfig = require('./webpack.base.conf') 8 | const CopyWebpackPlugin = require('copy-webpack-plugin') 9 | const HtmlWebpackPlugin = require('html-webpack-plugin') 10 | const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') 11 | const portfinder = require('portfinder') 12 | 13 | const HOST = process.env.HOST 14 | const PORT = process.env.PORT && Number(process.env.PORT) 15 | 16 | const devWebpackConfig = merge(baseWebpackConfig, { 17 | module: { 18 | rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true }) 19 | }, 20 | // cheap-module-eval-source-map is faster for development 21 | devtool: config.dev.devtool, 22 | 23 | // these devServer options should be customized in /config/index.js 24 | devServer: { 25 | clientLogLevel: 'warning', 26 | historyApiFallback: { 27 | rewrites: [ 28 | { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') }, 29 | ], 30 | }, 31 | hot: true, 32 | contentBase: false, // since we use CopyWebpackPlugin. 33 | compress: true, 34 | host: HOST || config.dev.host, 35 | port: PORT || config.dev.port, 36 | open: config.dev.autoOpenBrowser, 37 | overlay: config.dev.errorOverlay 38 | ? { warnings: false, errors: true } 39 | : false, 40 | publicPath: config.dev.assetsPublicPath, 41 | proxy: config.dev.proxyTable, 42 | quiet: true, // necessary for FriendlyErrorsPlugin 43 | watchOptions: { 44 | poll: config.dev.poll, 45 | } 46 | }, 47 | plugins: [ 48 | new webpack.DefinePlugin({ 49 | 'process.env': require('../config/dev.env') 50 | }), 51 | new webpack.HotModuleReplacementPlugin(), 52 | new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update. 53 | new webpack.NoEmitOnErrorsPlugin(), 54 | // https://github.com/ampedandwired/html-webpack-plugin 55 | new HtmlWebpackPlugin({ 56 | filename: 'index.html', 57 | template: 'index.html', 58 | inject: true 59 | }), 60 | // copy custom static assets 61 | new CopyWebpackPlugin([ 62 | { 63 | from: path.resolve(__dirname, '../static'), 64 | to: config.dev.assetsSubDirectory, 65 | ignore: ['.*'] 66 | } 67 | ]) 68 | ] 69 | }) 70 | 71 | module.exports = new Promise((resolve, reject) => { 72 | portfinder.basePort = process.env.PORT || config.dev.port 73 | portfinder.getPort((err, port) => { 74 | if (err) { 75 | reject(err) 76 | } else { 77 | // publish the new Port, necessary for e2e tests 78 | process.env.PORT = port 79 | // add port to devServer config 80 | devWebpackConfig.devServer.port = port 81 | 82 | // Add FriendlyErrorsPlugin 83 | devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({ 84 | compilationSuccessInfo: { 85 | messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`], 86 | }, 87 | onErrors: config.dev.notifyOnErrors 88 | ? utils.createNotifierCallback() 89 | : undefined 90 | })) 91 | 92 | resolve(devWebpackConfig) 93 | } 94 | }) 95 | }) 96 | -------------------------------------------------------------------------------- /build/webpack.prod.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const utils = require('./utils') 4 | const webpack = require('webpack') 5 | const config = require('../config') 6 | const merge = require('webpack-merge') 7 | const baseWebpackConfig = require('./webpack.base.conf') 8 | const CopyWebpackPlugin = require('copy-webpack-plugin') 9 | const HtmlWebpackPlugin = require('html-webpack-plugin') 10 | const ExtractTextPlugin = require('extract-text-webpack-plugin') 11 | const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin') 12 | const UglifyJsPlugin = require('uglifyjs-webpack-plugin') 13 | 14 | const env = require('../config/prod.env') 15 | 16 | const webpackConfig = merge(baseWebpackConfig, { 17 | module: { 18 | rules: utils.styleLoaders({ 19 | sourceMap: config.build.productionSourceMap, 20 | extract: true, 21 | usePostCSS: true 22 | }) 23 | }, 24 | devtool: config.build.productionSourceMap ? config.build.devtool : false, 25 | output: { 26 | path: config.build.assetsRoot, 27 | filename: utils.assetsPath('js/[name].[chunkhash].js'), 28 | chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') 29 | }, 30 | plugins: [ 31 | // http://vuejs.github.io/vue-loader/en/workflow/production.html 32 | new webpack.DefinePlugin({ 33 | 'process.env': env 34 | }), 35 | new UglifyJsPlugin({ 36 | uglifyOptions: { 37 | compress: { 38 | warnings: false 39 | } 40 | }, 41 | sourceMap: config.build.productionSourceMap, 42 | parallel: true 43 | }), 44 | // extract css into its own file 45 | new ExtractTextPlugin({ 46 | filename: utils.assetsPath('css/[name].[contenthash].css'), 47 | // Setting the following option to `false` will not extract CSS from codesplit chunks. 48 | // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack. 49 | // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`, 50 | // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110 51 | allChunks: true, 52 | }), 53 | // Compress extracted CSS. We are using this plugin so that possible 54 | // duplicated CSS from different components can be deduped. 55 | new OptimizeCSSPlugin({ 56 | cssProcessorOptions: config.build.productionSourceMap 57 | ? { safe: true, map: { inline: false } } 58 | : { safe: true } 59 | }), 60 | // generate dist index.html with correct asset hash for caching. 61 | // you can customize output by editing /index.html 62 | // see https://github.com/ampedandwired/html-webpack-plugin 63 | new HtmlWebpackPlugin({ 64 | filename: config.build.index, 65 | template: 'index.html', 66 | inject: true, 67 | minify: { 68 | removeComments: true, 69 | collapseWhitespace: true, 70 | removeAttributeQuotes: true 71 | // more options: 72 | // https://github.com/kangax/html-minifier#options-quick-reference 73 | }, 74 | // necessary to consistently work with multiple chunks via CommonsChunkPlugin 75 | chunksSortMode: 'dependency' 76 | }), 77 | // keep module.id stable when vendor modules does not change 78 | new webpack.HashedModuleIdsPlugin(), 79 | // enable scope hoisting 80 | new webpack.optimize.ModuleConcatenationPlugin(), 81 | // split vendor js into its own file 82 | new webpack.optimize.CommonsChunkPlugin({ 83 | name: 'vendor', 84 | minChunks (module) { 85 | // any required modules inside node_modules are extracted to vendor 86 | return ( 87 | module.resource && 88 | /\.js$/.test(module.resource) && 89 | module.resource.indexOf( 90 | path.join(__dirname, '../node_modules') 91 | ) === 0 92 | ) 93 | } 94 | }), 95 | // extract webpack runtime and module manifest to its own file in order to 96 | // prevent vendor hash from being updated whenever app bundle is updated 97 | new webpack.optimize.CommonsChunkPlugin({ 98 | name: 'manifest', 99 | minChunks: Infinity 100 | }), 101 | // This instance extracts shared chunks from code splitted chunks and bundles them 102 | // in a separate chunk, similar to the vendor chunk 103 | // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk 104 | new webpack.optimize.CommonsChunkPlugin({ 105 | name: 'app', 106 | async: 'vendor-async', 107 | children: true, 108 | minChunks: 3 109 | }), 110 | 111 | // copy custom static assets 112 | new CopyWebpackPlugin([ 113 | { 114 | from: path.resolve(__dirname, '../static'), 115 | to: config.build.assetsSubDirectory, 116 | ignore: ['.*'] 117 | } 118 | ]) 119 | ] 120 | }) 121 | 122 | if (config.build.productionGzip) { 123 | const CompressionWebpackPlugin = require('compression-webpack-plugin') 124 | 125 | webpackConfig.plugins.push( 126 | new CompressionWebpackPlugin({ 127 | asset: '[path].gz[query]', 128 | algorithm: 'gzip', 129 | test: new RegExp( 130 | '\\.(' + 131 | config.build.productionGzipExtensions.join('|') + 132 | ')$' 133 | ), 134 | threshold: 10240, 135 | minRatio: 0.8 136 | }) 137 | ) 138 | } 139 | 140 | if (config.build.bundleAnalyzerReport) { 141 | const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin 142 | webpackConfig.plugins.push(new BundleAnalyzerPlugin()) 143 | } 144 | 145 | module.exports = webpackConfig 146 | -------------------------------------------------------------------------------- /config/dev.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const merge = require('webpack-merge') 3 | const prodEnv = require('./prod.env') 4 | 5 | module.exports = merge(prodEnv, { 6 | NODE_ENV: '"development"' 7 | }) 8 | -------------------------------------------------------------------------------- /config/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | // Template version: 1.3.1 3 | // see http://vuejs-templates.github.io/webpack for documentation. 4 | 5 | const path = require('path') 6 | 7 | module.exports = { 8 | dev: { 9 | 10 | // Paths 11 | assetsSubDirectory: 'static', 12 | assetsPublicPath: '/', 13 | proxyTable: {}, // vue设置的代理,用以解决 跨域 问题 14 | 15 | // Various Dev Server settings 16 | host: 'localhost', // can be overwritten by process.env.HOST 17 | port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined 18 | autoOpenBrowser: true, 19 | errorOverlay: true, 20 | notifyOnErrors: true, 21 | poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- 22 | 23 | // Use Eslint Loader? 24 | // If true, your code will be linted during bundling and 25 | // linting errors and warnings will be shown in the console. 26 | useEslint: true, 27 | // If true, eslint errors and warnings will also be shown in the error overlay 28 | // in the browser. 29 | showEslintErrorsInOverlay: false, 30 | 31 | /** 32 | * Source Maps 33 | */ 34 | 35 | // https://webpack.js.org/configuration/devtool/#development 36 | devtool: 'cheap-module-eval-source-map', 37 | 38 | // If you have problems debugging vue-files in devtools, 39 | // set this to false - it *may* help 40 | // https://vue-loader.vuejs.org/en/options.html#cachebusting 41 | cacheBusting: true, 42 | 43 | cssSourceMap: true 44 | }, 45 | 46 | build: { 47 | // Template for index.html 48 | index: path.resolve(__dirname, '../dist/index.html'), 49 | 50 | // Paths 51 | assetsRoot: path.resolve(__dirname, '../dist'), 52 | assetsSubDirectory: 'static', 53 | assetsPublicPath: '', //为空 防止static前面加入"/" 54 | 55 | /** 56 | * Source Maps 57 | */ 58 | 59 | productionSourceMap: true, 60 | // https://webpack.js.org/configuration/devtool/#production 61 | devtool: '#source-map', 62 | 63 | // Gzip off by default as many popular static hosts such as 64 | // Surge or Netlify already gzip all static assets for you. 65 | // Before setting to `true`, make sure to: 66 | // npm install --save-dev compression-webpack-plugin@1.1.11 (2.x报错) 67 | productionGzip: true, 68 | productionGzipExtensions: ['js', 'css'], 69 | 70 | // Run the build command with an extra argument to 71 | // View the bundle analyzer report after build finishes: 72 | // `npm run build --report` 73 | // Set to `true` or `false` to always turn it on or off 74 | bundleAnalyzerReport: process.env.npm_config_report 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /config/prod.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | module.exports = { 3 | NODE_ENV: '"production"' 4 | } 5 | -------------------------------------------------------------------------------- /dist/index.html: -------------------------------------------------------------------------------- 1 | h-blog | by haibao
-------------------------------------------------------------------------------- /dist/static/css/app.9b21055ce9c6856f3c8acd23a25f953b.css.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hehaibao/h-blog/4e25b12b70913967b834781da37a604abf952f67/dist/static/css/app.9b21055ce9c6856f3c8acd23a25f953b.css.gz -------------------------------------------------------------------------------- /dist/static/fonts/element-icons.6f0a763.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hehaibao/h-blog/4e25b12b70913967b834781da37a604abf952f67/dist/static/fonts/element-icons.6f0a763.ttf -------------------------------------------------------------------------------- /dist/static/img/logo.fd80e1d.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hehaibao/h-blog/4e25b12b70913967b834781da37a604abf952f67/dist/static/img/logo.fd80e1d.jpg -------------------------------------------------------------------------------- /dist/static/js/0.3a9aa42a329f9b43d8d8.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([0],{"4GjL":function(t,e,a){t.exports=a.p+"static/img/logo.fd80e1d.jpg"},"4ako":function(t,e){},"N9/t":function(t,e,a){"use strict";var n={name:"Aside",data:function(){return{title:"博客标题",blogUrl:"http://www.hehaibao.com/",solgan:"不忘初心,砥砺前行",logo:a("4GjL"),navs:[{text:"首页",link:"/"},{text:"登录",link:"/login"},{text:"注册",link:"/register"},{text:"效果演示",link:"/demo"},{text:"凑数而已",link:"/undefined"}]}},methods:{emit:function(){this.$emit("showmsg","hello world")}}},s={render:function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"h"},[a("el-aside",{staticClass:"aside h",attrs:{width:"200px"}},[a("a",{attrs:{target:"_blank",href:t.blogUrl}},[a("img",{staticClass:"logo",attrs:{src:t.logo,alt:""}}),t._v(" "),a("h1",[t._v(t._s(t.title))])]),t._v(" "),a("p",{staticClass:"solgan"},[t._v(t._s(t.solgan))]),t._v(" "),a("ul",t._l(t.navs,function(e){return a("li",{key:e.text},[a("router-link",{attrs:{to:e.link}},[t._v(t._s(e.text))])],1)})),t._v(" "),a("p",{staticClass:"test-btn",on:{click:t.emit}},[a("a",{attrs:{href:"javascript:;"}},[t._v("父子组件通信测试,点我查看")])])])],1)},staticRenderFns:[]};var i=a("VU/8")(n,s,!1,function(t){a("4ako")},"data-v-5c236406",null);e.a=i.exports},e9bX:function(t,e){},mzkE:function(t,e,a){"use strict";var n={render:function(){var t=this.$createElement;return(this._self._c||t)("div",{staticClass:"footer"},[this._v("\n copyright by haibao 2018(http://www.hehaibao.com/)\n")])},staticRenderFns:[]};var s=a("VU/8")({name:"Foot"},n,!1,function(t){a("e9bX")},"data-v-90694156",null);e.a=s.exports}}); 2 | //# sourceMappingURL=0.3a9aa42a329f9b43d8d8.js.map -------------------------------------------------------------------------------- /dist/static/js/0.3a9aa42a329f9b43d8d8.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///./src/assets/images/logo.jpg","webpack:///src/components/aside.vue","webpack:///./src/components/aside.vue?2345","webpack:///./src/components/aside.vue","webpack:///src/components/footer.vue","webpack:///./src/components/footer.vue?25b5","webpack:///./src/components/footer.vue"],"names":["module","exports","__webpack_require__","p","aside","name","data","title","blogUrl","solgan","logo","navs","text","link","methods","emit","this","$emit","components_aside","render","_vm","_h","$createElement","_c","_self","staticClass","attrs","width","target","href","src","alt","_v","_s","_l","nav","key","to","on","click","staticRenderFns","Component","normalizeComponent","ssrContext","__webpack_exports__","components_footer"],"mappings":"yCAAAA,EAAAC,QAAAC,EAAAC,EAAA,0FCmBA,IAAAC,GACAC,KAAA,QACAC,KAFA,WAGA,OACAC,MAAA,OACAC,QAAA,2BACAC,OAAA,YACAC,KAAAR,EAAA,QACAS,OAEAC,KAAA,KACAC,KAAA,MAGAD,KAAA,KACAC,KAAA,WAGAD,KAAA,KACAC,KAAA,cAGAD,KAAA,OACAC,KAAA,UAGAD,KAAA,OACAC,KAAA,iBAKAC,SACAC,KADA,WAEAC,KAAAC,MAAA,4BClDAC,GADiBC,OAFjB,WAA0B,IAAAC,EAAAJ,KAAaK,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBE,YAAA,MAAgBF,EAAA,YAAiBE,YAAA,UAAAC,OAA6BC,MAAA,WAAiBJ,EAAA,KAAUG,OAAOE,OAAA,SAAAC,KAAAT,EAAAZ,WAAsCe,EAAA,OAAYE,YAAA,OAAAC,OAA0BI,IAAAV,EAAAV,KAAAqB,IAAA,MAAyBX,EAAAY,GAAA,KAAAT,EAAA,MAAAH,EAAAY,GAAAZ,EAAAa,GAAAb,EAAAb,YAAAa,EAAAY,GAAA,KAAAT,EAAA,KAAyEE,YAAA,WAAqBL,EAAAY,GAAAZ,EAAAa,GAAAb,EAAAX,WAAAW,EAAAY,GAAA,KAAAT,EAAA,KAAAH,EAAAc,GAAAd,EAAA,cAAAe,GAAmF,OAAAZ,EAAA,MAAgBa,IAAAD,EAAAvB,OAAaW,EAAA,eAAoBG,OAAOW,GAAAF,EAAAtB,QAAeO,EAAAY,GAAAZ,EAAAa,GAAAE,EAAAvB,UAAA,MAAiCQ,EAAAY,GAAA,KAAAT,EAAA,KAAuBE,YAAA,WAAAa,IAA2BC,MAAAnB,EAAAL,QAAkBQ,EAAA,KAAUG,OAAOG,KAAA,kBAAuBT,EAAAY,GAAA,4BAEnqBQ,oBCCjB,IAcAC,EAdAvC,EAAA,OAcAwC,CACAtC,EACAc,GATA,EAVA,SAAAyB,GACAzC,EAAA,SAaA,kBAEA,MAUA0C,EAAA,EAAAH,EAAA,gECnBA,ICJAI,GADiB1B,OAFjB,WAA0B,IAAaE,EAAbL,KAAaM,eAAkD,OAA/DN,KAAuCQ,MAAAD,IAAAF,GAAwB,OAAiBI,YAAA,WAAhFT,KAAqGgB,GAAA,iEAE9GQ,oBCCjB,IAcAC,EAdAvC,EAAA,OAcAwC,EFTArC,KAAA,QEWAwC,GATA,EAVA,SAAAF,GACAzC,EAAA,SAaA,kBAEA,MAUA0C,EAAA,EAAAH,EAAA","file":"static/js/0.3a9aa42a329f9b43d8d8.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/img/logo.fd80e1d.jpg\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/assets/images/logo.jpg\n// module id = 4GjL\n// module chunks = 0","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/aside.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"h\"},[_c('el-aside',{staticClass:\"aside h\",attrs:{\"width\":\"200px\"}},[_c('a',{attrs:{\"target\":\"_blank\",\"href\":_vm.blogUrl}},[_c('img',{staticClass:\"logo\",attrs:{\"src\":_vm.logo,\"alt\":\"\"}}),_vm._v(\" \"),_c('h1',[_vm._v(_vm._s(_vm.title))])]),_vm._v(\" \"),_c('p',{staticClass:\"solgan\"},[_vm._v(_vm._s(_vm.solgan))]),_vm._v(\" \"),_c('ul',_vm._l((_vm.navs),function(nav){return _c('li',{key:nav.text},[_c('router-link',{attrs:{\"to\":nav.link}},[_vm._v(_vm._s(nav.text))])],1)})),_vm._v(\" \"),_c('p',{staticClass:\"test-btn\",on:{\"click\":_vm.emit}},[_c('a',{attrs:{\"href\":\"javascript:;\"}},[_vm._v(\"父子组件通信测试,点我查看\")])])])],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-5c236406\",\"hasScoped\":true,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/aside.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-5c236406\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./aside.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./aside.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./aside.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-5c236406\\\",\\\"hasScoped\\\":true,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./aside.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-5c236406\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/aside.vue\n// module id = null\n// module chunks = ","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/footer.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"footer\"},[_vm._v(\"\\n copyright by haibao 2018(http://www.hehaibao.com/)\\n\")])}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-90694156\",\"hasScoped\":true,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/footer.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-90694156\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./footer.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./footer.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./footer.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-90694156\\\",\\\"hasScoped\\\":true,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./footer.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-90694156\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/footer.vue\n// module id = null\n// module chunks = "],"sourceRoot":""} -------------------------------------------------------------------------------- /dist/static/js/1.4820c59af53e9840bc88.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hehaibao/h-blog/4e25b12b70913967b834781da37a604abf952f67/dist/static/js/1.4820c59af53e9840bc88.js.gz -------------------------------------------------------------------------------- /dist/static/js/2.34a849fc09a8134d7c4a.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hehaibao/h-blog/4e25b12b70913967b834781da37a604abf952f67/dist/static/js/2.34a849fc09a8134d7c4a.js.gz -------------------------------------------------------------------------------- /dist/static/js/3.9bfee001cf87b62d6d89.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([3],{"4GD7":function(e,o){},QlWu:function(e,o,t){"use strict";Object.defineProperty(o,"__esModule",{value:!0});var r=t("mvHQ"),n=t.n(r),i={name:"Login",data:function(){return{isLogin:!1,loginForm:{username:"",password:"",checked:!1},rules:{username:[{required:!0,message:"请输入用户名"}],password:[{required:!0,message:"请输入密码"}]}}},mounted:function(){this.isLogin=function(e){if(e)return window.sessionStorage.getItem(e)}("isLogin")},methods:{onSubmit:function(e){var o=this;this.$refs[e].validate(function(e){if(!e)return!1;var t,r;r=!0,(t="isLogin")&&("string"!=typeof r&&(r=n()(r)),window.sessionStorage.setItem(t,r)),o.loginForm.username="",o.loginForm.password="",o.$router.push({path:"/"})})}}},s={render:function(){var e=this,o=e.$createElement,t=e._self._c||o;return t("div",[e.isLogin?e._e():t("el-form",{ref:"loginForm",staticClass:"login-form",attrs:{model:e.loginForm,"status-icon":"",rules:e.rules,"label-width":"80px"}},[t("h2",[e._v("用户登录")]),e._v(" "),t("el-form-item",{attrs:{label:"用户名",prop:"username"}},[t("el-input",{model:{value:e.loginForm.username,callback:function(o){e.$set(e.loginForm,"username",o)},expression:"loginForm.username"}})],1),e._v(" "),t("el-form-item",{attrs:{label:"密码",prop:"password"}},[t("el-input",{attrs:{type:"password","auto-complete":"off"},model:{value:e.loginForm.password,callback:function(o){e.$set(e.loginForm,"password",o)},expression:"loginForm.password"}})],1),e._v(" "),t("el-form-item",[t("el-checkbox",{model:{value:e.loginForm.checked,callback:function(o){e.$set(e.loginForm,"checked",o)},expression:"loginForm.checked"}},[e._v("记住密码")])],1),e._v(" "),t("el-form-item",[t("el-button",{attrs:{type:"primary"},on:{click:function(o){e.onSubmit("loginForm")}}},[e._v("登录")]),e._v(" "),t("router-link",{attrs:{to:"/register"}},[e._v("还没有账号?去注册")]),e._v(" | "),t("router-link",{attrs:{to:"/"}},[e._v("返回首页")])],1)],1),e._v(" "),e.isLogin?t("el-card",{staticClass:"box-card"},[t("div",{staticClass:"text item"},[e._v("\n Hi, 欢迎回来!当前状态:已登录\n "),t("p",[t("router-link",{attrs:{to:"/"}},[e._v("回到首页")])],1)])]):e._e()],1)},staticRenderFns:[]};var a=t("VU/8")(i,s,!1,function(e){t("4GD7")},"data-v-b5cd49f2",null);o.default=a.exports},mvHQ:function(e,o,t){e.exports={default:t("qkKv"),__esModule:!0}},qkKv:function(e,o,t){var r=t("FeBl"),n=r.JSON||(r.JSON={stringify:JSON.stringify});e.exports=function(e){return n.stringify.apply(n,arguments)}}}); 2 | //# sourceMappingURL=3.9bfee001cf87b62d6d89.js.map -------------------------------------------------------------------------------- /dist/static/js/3.9bfee001cf87b62d6d89.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///src/pages/login/login.vue","webpack:///./src/utils/mUtils.js","webpack:///./src/pages/login/login.vue?564b","webpack:///./src/pages/login/login.vue","webpack:///./node_modules/babel-runtime/core-js/json/stringify.js","webpack:///./node_modules/core-js/library/fn/json/stringify.js"],"names":["login","name","data","isLogin","loginForm","username","password","checked","rules","required","message","mounted","this","window","sessionStorage","getItem","getStore","methods","onSubmit","formName","_this","$refs","validate","valid","content","stringify_default","setItem","$router","push","path","login_login","render","_vm","_h","$createElement","_c","_self","_e","ref","staticClass","attrs","model","status-icon","label-width","_v","label","prop","value","callback","$$v","$set","expression","type","auto-complete","on","click","$event","to","staticRenderFns","Component","__webpack_require__","normalizeComponent","ssrContext","__webpack_exports__","module","exports","default","__esModule","core","$JSON","JSON","stringify","it","apply","arguments"],"mappings":"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","file":"static/js/3.9bfee001cf87b62d6d89.js","sourcesContent":["\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/pages/login/login.vue","/**\n * 常用工具\n * update at 2018-08-13 by haibao\n */\n\n/**\n * 存储sessionStorage\n */\nexport const setStore = (name, content) => {\n if (!name) return\n if (typeof content !== 'string') {\n content = JSON.stringify(content)\n }\n window.sessionStorage.setItem(name, content)\n}\n\n/**\n * 获取sessionStorage\n */\nexport const getStore = name => {\n if (!name) return\n return window.sessionStorage.getItem(name)\n}\n\n/**\n * 删除sessionStorage\n */\nexport const removeStore = name => {\n if (!name) return\n window.sessionStorage.removeItem(name)\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/utils/mUtils.js","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[(!_vm.isLogin)?_c('el-form',{ref:\"loginForm\",staticClass:\"login-form\",attrs:{\"model\":_vm.loginForm,\"status-icon\":\"\",\"rules\":_vm.rules,\"label-width\":\"80px\"}},[_c('h2',[_vm._v(\"用户登录\")]),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":\"用户名\",\"prop\":\"username\"}},[_c('el-input',{model:{value:(_vm.loginForm.username),callback:function ($$v) {_vm.$set(_vm.loginForm, \"username\", $$v)},expression:\"loginForm.username\"}})],1),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":\"密码\",\"prop\":\"password\"}},[_c('el-input',{attrs:{\"type\":\"password\",\"auto-complete\":\"off\"},model:{value:(_vm.loginForm.password),callback:function ($$v) {_vm.$set(_vm.loginForm, \"password\", $$v)},expression:\"loginForm.password\"}})],1),_vm._v(\" \"),_c('el-form-item',[_c('el-checkbox',{model:{value:(_vm.loginForm.checked),callback:function ($$v) {_vm.$set(_vm.loginForm, \"checked\", $$v)},expression:\"loginForm.checked\"}},[_vm._v(\"记住密码\")])],1),_vm._v(\" \"),_c('el-form-item',[_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":function($event){_vm.onSubmit('loginForm')}}},[_vm._v(\"登录\")]),_vm._v(\" \"),_c('router-link',{attrs:{\"to\":\"/register\"}},[_vm._v(\"还没有账号?去注册\")]),_vm._v(\" | \"),_c('router-link',{attrs:{\"to\":\"/\"}},[_vm._v(\"返回首页\")])],1)],1):_vm._e(),_vm._v(\" \"),(_vm.isLogin)?_c('el-card',{staticClass:\"box-card\"},[_c('div',{staticClass:\"text item\"},[_vm._v(\"\\n Hi, 欢迎回来!当前状态:已登录\\n \"),_c('p',[_c('router-link',{attrs:{\"to\":\"/\"}},[_vm._v(\"回到首页\")])],1)])]):_vm._e()],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-b5cd49f2\",\"hasScoped\":true,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/pages/login/login.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-b5cd49f2\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./login.vue\")\n}\nvar normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./login.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./login.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-b5cd49f2\\\",\\\"hasScoped\\\":true,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./login.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-b5cd49f2\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/pages/login/login.vue\n// module id = null\n// module chunks = ","module.exports = { \"default\": require(\"core-js/library/fn/json/stringify\"), __esModule: true };\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/babel-runtime/core-js/json/stringify.js\n// module id = mvHQ\n// module chunks = 3","var core = require('../../modules/_core');\nvar $JSON = core.JSON || (core.JSON = { stringify: JSON.stringify });\nmodule.exports = function stringify(it) { // eslint-disable-line no-unused-vars\n return $JSON.stringify.apply($JSON, arguments);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/core-js/library/fn/json/stringify.js\n// module id = qkKv\n// module chunks = 3"],"sourceRoot":""} -------------------------------------------------------------------------------- /dist/static/js/4.63b0c96043a372cc3690.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([4],{"/1AV":function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=i("N9/t"),s=i("mzkE"),n={name:"Demo",data:function(){return{msg:"",filterTest:"hello world",fullscreenLoading:!1,centerDialogVisible:!1}},components:{leftSide:o.a,foot:s.a},directives:{txtDemo:function(t,e){t.style.color=e.value.color,t.style.fontSize=e.value.fontsize}},filters:{filterA:function(t){return t?(t=t.toString()).toUpperCase():""}},computed:{count:function(){return this.$store.state.count}},methods:{loading:function(){var t=this;this.fullscreenLoading=!0,setTimeout(function(){t.fullscreenLoading=!1},2e3)},toast:function(){this.$message.error("测试消息")},messageBox:function(){this.$alert("你好","提示",{confirmButtonText:"确定",callback:function(t){alert("回调")}})},notification:function(){var t=this.$createElement;this.$notify({title:"您有一条消息",message:t("i",{style:"color: teal"},"恭喜你中奖了,哈哈哈")})},dialog:function(){this.centerDialogVisible=!0},test:function(){alert("todo")},getcomponentmsg:function(t){alert("我在效果演示页-----"+t)}}},a={render:function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"home h"},[i("el-container",{staticClass:"h"},[i("left-side",{attrs:{msg:t.msg},on:{showmsg:t.getcomponentmsg}}),t._v(" "),i("el-main",[i("div",{staticClass:"breadcrumb"},[i("el-breadcrumb",{attrs:{separator:"/"}},[i("el-breadcrumb-item",{attrs:{to:{path:"/"}}},[t._v("首页")]),t._v(" "),i("el-breadcrumb-item",[t._v("效果演示")])],1)],1),t._v(" "),i("div",{staticClass:"content"},[i("h2",{staticClass:"title"},[t._v("elementUI demos")]),t._v(" "),i("div",{staticClass:"demos"},[i("a",{directives:[{name:"loading",rawName:"v-loading.fullscreen.lock",value:t.fullscreenLoading,expression:"fullscreenLoading",modifiers:{fullscreen:!0,lock:!0}}],attrs:{href:"javascript:;"},on:{click:t.loading}},[t._v("loading")]),t._v(" "),i("a",{attrs:{href:"javascript:;"},on:{click:t.toast}},[t._v("toast")]),t._v(" "),i("a",{attrs:{href:"javascript:;"},on:{click:t.messageBox}},[t._v("messageBox")]),t._v(" "),i("a",{attrs:{href:"javascript:;"},on:{click:t.notification}},[t._v("notification")]),t._v(" "),i("a",{attrs:{href:"javascript:;"},on:{click:t.dialog}},[t._v("dialog")])]),t._v(" "),i("h2",{staticClass:"title"},[t._v("my demos")]),t._v(" "),i("div",{staticClass:"demos"},[i("a",{directives:[{name:"txtDemo",rawName:"v-txtDemo",value:{color:"red",fontsize:"18px"},expression:"{ color: 'red', fontsize: '18px' }"}]},[t._v("指令 - 让我变红")]),t._v(" "),i("a",[t._v(t._s(t._f("filterA")(t.filterTest))+" - 过滤 - 小写变大写")])]),t._v(" "),i("h2",{staticClass:"title"},[t._v("vuex demo")]),t._v(" "),i("div",{staticClass:"demos"},[i("p",[t._v("当前数量:"+t._s(t.count))]),t._v(" "),i("div",[i("button",{on:{click:function(e){t.$store.commit("add")}}},[t._v("加1")]),t._v(" "),i("button",{on:{click:function(e){t.$store.commit("diff")}}},[t._v("减1")]),t._v(" "),i("button",{on:{click:function(e){t.$store.dispatch("asyncAdd")}}},[t._v("异步加1")]),t._v(" "),i("button",{on:{click:function(e){t.$store.dispatch("asyncDiff")}}},[t._v("异步减1")])])])]),t._v(" "),i("foot")],1)],1),t._v(" "),i("el-dialog",{attrs:{title:"提示",visible:t.centerDialogVisible,width:"30%",center:""},on:{"update:visible":function(e){t.centerDialogVisible=e}}},[i("span",[t._v("需要注意的是内容是默认不居中的")]),t._v(" "),i("span",{staticClass:"dialog-footer",attrs:{slot:"footer"},slot:"footer"},[i("el-button",{on:{click:function(e){t.centerDialogVisible=!1}}},[t._v("取 消")]),t._v(" "),i("el-button",{attrs:{type:"primary"},on:{click:function(e){t.centerDialogVisible=!1}}},[t._v("确 定")])],1)])],1)},staticRenderFns:[]};var c=i("VU/8")(n,a,!1,function(t){i("NjRI")},"data-v-96ad09b8",null);e.default=c.exports},NjRI:function(t,e){}}); 2 | //# sourceMappingURL=4.63b0c96043a372cc3690.js.map -------------------------------------------------------------------------------- /dist/static/js/4.63b0c96043a372cc3690.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///src/pages/demo/index.vue","webpack:///./src/pages/demo/index.vue?103a","webpack:///./src/pages/demo/index.vue"],"names":["demo","name","data","msg","filterTest","fullscreenLoading","centerDialogVisible","components","leftSide","aside","foot","footer","directives","txtDemo","el","binding","style","color","value","fontSize","fontsize","filters","filterA","toString","toUpperCase","computed","count","this","$store","state","methods","loading","_this","setTimeout","toast","$message","error","messageBox","$alert","confirmButtonText","callback","action","alert","notification","h","$createElement","$notify","title","message","dialog","test","getcomponentmsg","pages_demo","render","_vm","_h","_c","_self","staticClass","attrs","on","showmsg","_v","separator","to","path","rawName","expression","modifiers","fullscreen","lock","href","click","_s","_f","$event","commit","dispatch","visible","width","center","update:visible","slot","type","staticRenderFns","Component","__webpack_require__","normalizeComponent","ssrContext","__webpack_exports__"],"mappings":"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","file":"static/js/4.63b0c96043a372cc3690.js","sourcesContent":["\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/pages/demo/index.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"home h\"},[_c('el-container',{staticClass:\"h\"},[_c('left-side',{attrs:{\"msg\":_vm.msg},on:{\"showmsg\":_vm.getcomponentmsg}}),_vm._v(\" \"),_c('el-main',[_c('div',{staticClass:\"breadcrumb\"},[_c('el-breadcrumb',{attrs:{\"separator\":\"/\"}},[_c('el-breadcrumb-item',{attrs:{\"to\":{ path: '/' }}},[_vm._v(\"首页\")]),_vm._v(\" \"),_c('el-breadcrumb-item',[_vm._v(\"效果演示\")])],1)],1),_vm._v(\" \"),_c('div',{staticClass:\"content\"},[_c('h2',{staticClass:\"title\"},[_vm._v(\"elementUI demos\")]),_vm._v(\" \"),_c('div',{staticClass:\"demos\"},[_c('a',{directives:[{name:\"loading\",rawName:\"v-loading.fullscreen.lock\",value:(_vm.fullscreenLoading),expression:\"fullscreenLoading\",modifiers:{\"fullscreen\":true,\"lock\":true}}],attrs:{\"href\":\"javascript:;\"},on:{\"click\":_vm.loading}},[_vm._v(\"loading\")]),_vm._v(\" \"),_c('a',{attrs:{\"href\":\"javascript:;\"},on:{\"click\":_vm.toast}},[_vm._v(\"toast\")]),_vm._v(\" \"),_c('a',{attrs:{\"href\":\"javascript:;\"},on:{\"click\":_vm.messageBox}},[_vm._v(\"messageBox\")]),_vm._v(\" \"),_c('a',{attrs:{\"href\":\"javascript:;\"},on:{\"click\":_vm.notification}},[_vm._v(\"notification\")]),_vm._v(\" \"),_c('a',{attrs:{\"href\":\"javascript:;\"},on:{\"click\":_vm.dialog}},[_vm._v(\"dialog\")])]),_vm._v(\" \"),_c('h2',{staticClass:\"title\"},[_vm._v(\"my demos\")]),_vm._v(\" \"),_c('div',{staticClass:\"demos\"},[_c('a',{directives:[{name:\"txtDemo\",rawName:\"v-txtDemo\",value:({ color: 'red', fontsize: '18px' }),expression:\"{ color: 'red', fontsize: '18px' }\"}]},[_vm._v(\"指令 - 让我变红\")]),_vm._v(\" \"),_c('a',[_vm._v(_vm._s(_vm._f(\"filterA\")(_vm.filterTest))+\" - 过滤 - 小写变大写\")])]),_vm._v(\" \"),_c('h2',{staticClass:\"title\"},[_vm._v(\"vuex demo\")]),_vm._v(\" \"),_c('div',{staticClass:\"demos\"},[_c('p',[_vm._v(\"当前数量:\"+_vm._s(_vm.count))]),_vm._v(\" \"),_c('div',[_c('button',{on:{\"click\":function($event){_vm.$store.commit('add')}}},[_vm._v(\"加1\")]),_vm._v(\" \"),_c('button',{on:{\"click\":function($event){_vm.$store.commit('diff')}}},[_vm._v(\"减1\")]),_vm._v(\" \"),_c('button',{on:{\"click\":function($event){_vm.$store.dispatch('asyncAdd')}}},[_vm._v(\"异步加1\")]),_vm._v(\" \"),_c('button',{on:{\"click\":function($event){_vm.$store.dispatch('asyncDiff')}}},[_vm._v(\"异步减1\")])])])]),_vm._v(\" \"),_c('foot')],1)],1),_vm._v(\" \"),_c('el-dialog',{attrs:{\"title\":\"提示\",\"visible\":_vm.centerDialogVisible,\"width\":\"30%\",\"center\":\"\"},on:{\"update:visible\":function($event){_vm.centerDialogVisible=$event}}},[_c('span',[_vm._v(\"需要注意的是内容是默认不居中的\")]),_vm._v(\" \"),_c('span',{staticClass:\"dialog-footer\",attrs:{\"slot\":\"footer\"},slot:\"footer\"},[_c('el-button',{on:{\"click\":function($event){_vm.centerDialogVisible = false}}},[_vm._v(\"取 消\")]),_vm._v(\" \"),_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":function($event){_vm.centerDialogVisible = false}}},[_vm._v(\"确 定\")])],1)])],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-96ad09b8\",\"hasScoped\":true,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/pages/demo/index.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-96ad09b8\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./index.vue\")\n}\nvar normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./index.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./index.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-96ad09b8\\\",\\\"hasScoped\\\":true,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./index.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-96ad09b8\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/pages/demo/index.vue\n// module id = null\n// module chunks = "],"sourceRoot":""} -------------------------------------------------------------------------------- /dist/static/js/5.d1d7303e40cf7949eead.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([5],{"8zp9":function(r,e,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var t={name:"Register",data:function(){var r=this;return{regForm:{username:"",password:"",password_confirm:"",email:""},rules:{username:[{required:!0,message:"请输入用户名"}],password:[{required:!0,validator:function(e,o,t){""===o?t(new Error("请输入密码")):(""!==r.regForm.password_confirm&&r.$refs.regForm.validateField("password_confirm"),t())}}],password_confirm:[{required:!0,validator:function(e,o,t){""===o?t(new Error("请再次输入密码")):o!==r.regForm.password?t(new Error("两次输入密码不一致!")):t()}}],email:[{required:!0,message:"请输入常用的邮箱"},{type:"email",message:"请输入正确的邮箱地址",trigger:["blur","change"]}]}}},methods:{onSubmit:function(r){this.$refs[r].validate(function(r){if(!r)return!1;alert("submit!")})}}},s={render:function(){var r=this,e=r.$createElement,o=r._self._c||e;return o("div",[o("el-form",{ref:"regForm",staticClass:"reg-form",attrs:{model:r.regForm,"status-icon":"",rules:r.rules,"label-width":"80px"}},[o("h2",[r._v("用户注册")]),r._v(" "),o("el-form-item",{attrs:{label:"用户名",prop:"username"}},[o("el-input",{model:{value:r.regForm.username,callback:function(e){r.$set(r.regForm,"username",e)},expression:"regForm.username"}})],1),r._v(" "),o("el-form-item",{attrs:{label:"密码",prop:"password"}},[o("el-input",{attrs:{type:"password","auto-complete":"off"},model:{value:r.regForm.password,callback:function(e){r.$set(r.regForm,"password",e)},expression:"regForm.password"}})],1),r._v(" "),o("el-form-item",{attrs:{label:"确认密码",prop:"password_confirm"}},[o("el-input",{attrs:{type:"password","auto-complete":"off"},model:{value:r.regForm.password_confirm,callback:function(e){r.$set(r.regForm,"password_confirm",e)},expression:"regForm.password_confirm"}})],1),r._v(" "),o("el-form-item",{attrs:{label:"邮箱",prop:"email"}},[o("el-input",{model:{value:r.regForm.email,callback:function(e){r.$set(r.regForm,"email",e)},expression:"regForm.email"}})],1),r._v(" "),o("el-form-item",[o("el-button",{attrs:{type:"primary"},on:{click:function(e){r.onSubmit("regForm")}}},[r._v("注册")]),r._v(" "),o("router-link",{attrs:{to:"/login"}},[r._v("已有账号?去登录")]),r._v(" | "),o("router-link",{attrs:{to:"/"}},[r._v("返回首页")])],1)],1)],1)},staticRenderFns:[]};var a=o("VU/8")(t,s,!1,function(r){o("I8no")},"data-v-6426f0d5",null);e.default=a.exports},I8no:function(r,e){}}); 2 | //# sourceMappingURL=5.d1d7303e40cf7949eead.js.map -------------------------------------------------------------------------------- /dist/static/js/5.d1d7303e40cf7949eead.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///src/pages/login/register.vue","webpack:///./src/pages/login/register.vue?d02a","webpack:///./src/pages/login/register.vue"],"names":["register","name","data","_this","this","regForm","username","password","password_confirm","email","rules","required","message","validator","rule","value","callback","Error","$refs","validateField","type","trigger","methods","onSubmit","formName","validate","valid","alert","login_register","render","_vm","_h","$createElement","_c","_self","ref","staticClass","attrs","model","status-icon","label-width","_v","label","prop","$$v","$set","expression","auto-complete","on","click","$event","to","staticRenderFns","Component","__webpack_require__","normalizeComponent","ssrContext","__webpack_exports__"],"mappings":"uGAyBA,IAAAA,GACAC,KAAA,WACAC,KAFA,WAEA,IAAAC,EAAAC,KAoBA,OACAC,SACAC,SAAA,GACAC,SAAA,GACAC,iBAAA,GACAC,MAAA,IAEAC,OACAJ,WACAK,UAAA,EAAAC,QAAA,WAEAL,WACAI,UAAA,EAAAE,UA/BA,SAAAC,EAAAC,EAAAC,GACA,KAAAD,EACAC,EAAA,IAAAC,MAAA,WAEA,KAAAd,EAAAE,QAAAG,kBACAL,EAAAe,MAAAb,QAAAc,cAAA,oBAEAH,QA0BAR,mBACAG,UAAA,EAAAE,UAxBA,SAAAC,EAAAC,EAAAC,GACA,KAAAD,EACAC,EAAA,IAAAC,MAAA,YACAF,IAAAZ,EAAAE,QAAAE,SACAS,EAAA,IAAAC,MAAA,eAEAD,OAoBAP,QACAE,UAAA,EAAAC,QAAA,aACAQ,KAAA,QAAAR,QAAA,aAAAS,SAAA,sBAKAC,SACAC,SADA,SACAC,GACApB,KAAAc,MAAAM,GAAAC,SAAA,SAAAC,GACA,IAAAA,EAOA,SAJAC,MAAA,gBC1EAC,GADiBC,OAFjB,WAA0B,IAAAC,EAAA1B,KAAa2B,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAAA,EAAA,WAA+BE,IAAA,UAAAC,YAAA,WAAAC,OAA4CC,MAAAR,EAAAzB,QAAAkC,cAAA,GAAA7B,MAAAoB,EAAApB,MAAA8B,cAAA,UAA6EP,EAAA,MAAAH,EAAAW,GAAA,UAAAX,EAAAW,GAAA,KAAAR,EAAA,gBAA2DI,OAAOK,MAAA,MAAAC,KAAA,cAAiCV,EAAA,YAAiBK,OAAOvB,MAAAe,EAAAzB,QAAA,SAAAW,SAAA,SAAA4B,GAAsDd,EAAAe,KAAAf,EAAAzB,QAAA,WAAAuC,IAAuCE,WAAA,uBAAgC,GAAAhB,EAAAW,GAAA,KAAAR,EAAA,gBAAqCI,OAAOK,MAAA,KAAAC,KAAA,cAAgCV,EAAA,YAAiBI,OAAOjB,KAAA,WAAA2B,gBAAA,OAAwCT,OAAQvB,MAAAe,EAAAzB,QAAA,SAAAW,SAAA,SAAA4B,GAAsDd,EAAAe,KAAAf,EAAAzB,QAAA,WAAAuC,IAAuCE,WAAA,uBAAgC,GAAAhB,EAAAW,GAAA,KAAAR,EAAA,gBAAqCI,OAAOK,MAAA,OAAAC,KAAA,sBAA0CV,EAAA,YAAiBI,OAAOjB,KAAA,WAAA2B,gBAAA,OAAwCT,OAAQvB,MAAAe,EAAAzB,QAAA,iBAAAW,SAAA,SAAA4B,GAA8Dd,EAAAe,KAAAf,EAAAzB,QAAA,mBAAAuC,IAA+CE,WAAA,+BAAwC,GAAAhB,EAAAW,GAAA,KAAAR,EAAA,gBAAqCI,OAAOK,MAAA,KAAAC,KAAA,WAA6BV,EAAA,YAAiBK,OAAOvB,MAAAe,EAAAzB,QAAA,MAAAW,SAAA,SAAA4B,GAAmDd,EAAAe,KAAAf,EAAAzB,QAAA,QAAAuC,IAAoCE,WAAA,oBAA6B,GAAAhB,EAAAW,GAAA,KAAAR,EAAA,gBAAAA,EAAA,aAAqDI,OAAOjB,KAAA,WAAiB4B,IAAKC,MAAA,SAAAC,GAAyBpB,EAAAP,SAAA,eAA0BO,EAAAW,GAAA,QAAAX,EAAAW,GAAA,KAAAR,EAAA,eAA+CI,OAAOc,GAAA,YAAerB,EAAAW,GAAA,cAAAX,EAAAW,GAAA,OAAAR,EAAA,eAAuDI,OAAOc,GAAA,OAAUrB,EAAAW,GAAA,uBAEngDW,oBCCjB,IAcAC,EAdAC,EAAA,OAcAC,CACAvD,EACA4B,GATA,EAVA,SAAA4B,GACAF,EAAA,SAaA,kBAEA,MAUAG,EAAA,QAAAJ,EAAA","file":"static/js/5.d1d7303e40cf7949eead.js","sourcesContent":["\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/pages/login/register.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('el-form',{ref:\"regForm\",staticClass:\"reg-form\",attrs:{\"model\":_vm.regForm,\"status-icon\":\"\",\"rules\":_vm.rules,\"label-width\":\"80px\"}},[_c('h2',[_vm._v(\"用户注册\")]),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":\"用户名\",\"prop\":\"username\"}},[_c('el-input',{model:{value:(_vm.regForm.username),callback:function ($$v) {_vm.$set(_vm.regForm, \"username\", $$v)},expression:\"regForm.username\"}})],1),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":\"密码\",\"prop\":\"password\"}},[_c('el-input',{attrs:{\"type\":\"password\",\"auto-complete\":\"off\"},model:{value:(_vm.regForm.password),callback:function ($$v) {_vm.$set(_vm.regForm, \"password\", $$v)},expression:\"regForm.password\"}})],1),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":\"确认密码\",\"prop\":\"password_confirm\"}},[_c('el-input',{attrs:{\"type\":\"password\",\"auto-complete\":\"off\"},model:{value:(_vm.regForm.password_confirm),callback:function ($$v) {_vm.$set(_vm.regForm, \"password_confirm\", $$v)},expression:\"regForm.password_confirm\"}})],1),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":\"邮箱\",\"prop\":\"email\"}},[_c('el-input',{model:{value:(_vm.regForm.email),callback:function ($$v) {_vm.$set(_vm.regForm, \"email\", $$v)},expression:\"regForm.email\"}})],1),_vm._v(\" \"),_c('el-form-item',[_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":function($event){_vm.onSubmit('regForm')}}},[_vm._v(\"注册\")]),_vm._v(\" \"),_c('router-link',{attrs:{\"to\":\"/login\"}},[_vm._v(\"已有账号?去登录\")]),_vm._v(\" | \"),_c('router-link',{attrs:{\"to\":\"/\"}},[_vm._v(\"返回首页\")])],1)],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-6426f0d5\",\"hasScoped\":true,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/pages/login/register.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-6426f0d5\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./register.vue\")\n}\nvar normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./register.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./register.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-6426f0d5\\\",\\\"hasScoped\\\":true,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./register.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-6426f0d5\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/pages/login/register.vue\n// module id = null\n// module chunks = "],"sourceRoot":""} -------------------------------------------------------------------------------- /dist/static/js/app.2fb34aa4ce1edba4a0b5.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([7],{NHnr:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=n("7+uW"),o=(n("Qbok"),n("zL8q")),u=n.n(o),a=(n("tvR6"),{render:function(){var e=this.$createElement,t=this._self._c||e;return t("div",{attrs:{id:"app"}},[t("keep-alive",[t("transition",{attrs:{name:"router-fade",mode:"out-in"}},[this.$route.meta.keepAlive?t("router-view"):this._e()],1)],1),this._v(" "),t("transition",{attrs:{name:"router-fade",mode:"out-in"}},[this.$route.meta.keepAlive?this._e():t("router-view")],1)],1)},staticRenderFns:[]});var r=n("VU/8")({name:"App"},a,!1,function(e){n("p2vH")},null,null).exports,l=n("//Fk"),m=n.n(l),c=n("/ocq");i.default.use(c.a);var s=[{path:"",component:function(){return Promise.all([n.e(0),n.e(1)]).then(n.bind(null,"FP3a"))},meta:{title:"博客首页"}},{path:"/detail/:id",name:"Detail",component:function(){return Promise.all([n.e(0),n.e(2)]).then(n.bind(null,"WDDs"))},meta:{title:"文章详情页",keepAlive:!0}},{path:"/login",component:function(){return n.e(3).then(n.bind(null,"QlWu"))},meta:{title:"登录"}},{path:"/register",component:function(){return n.e(5).then(n.bind(null,"8zp9"))},meta:{title:"注册"}},{path:"/demo",component:function(){return Promise.all([n.e(0),n.e(4)]).then(n.bind(null,"/1AV"))},meta:{title:"效果演示页",keepAlive:!0}}],d=new c.a({routes:s,scrollBehavior:function(e,t,n){return n&&e.meta.keepAlive?n:new m.a(function(e){setTimeout(function(){e({x:0,y:0})},0)})}});d.beforeEach(function(e,t,n){window.document.title=e.meta.title,0===e.matched.length?t.name?n({name:t.name}):n("/"):n()});var f=d,p=n("NYxO"),v={actions:{asyncAdd:function(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{num:1}).num;setTimeout(function(){e.commit("add",{num:t})},1e3)},asyncDiff:function(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{num:1}).num;setTimeout(function(){e.commit("diff",{num:t})},1e3)}},mutations:{add:function(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{num:1}).num;e.count+=t},diff:function(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{num:1}).num;e.count-=t}},state:{count:0}};i.default.use(p.a);var h=new p.a.Store(v);i.default.config.productionTip=!1,i.default.use(u.a),new i.default({el:"#app",router:f,store:h,components:{App:r},template:""})},Qbok:function(e,t){},p2vH:function(e,t){},tvR6:function(e,t){}},["NHnr"]); 2 | //# sourceMappingURL=app.2fb34aa4ce1edba4a0b5.js.map -------------------------------------------------------------------------------- /dist/static/js/app.2fb34aa4ce1edba4a0b5.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///./src/App.vue?d5af","webpack:///./src/App.vue","webpack:///src/App.vue","webpack:///./src/router/index.js","webpack:///./src/store/index.js","webpack:///./src/store/action.js","webpack:///./src/store/mutation.js","webpack:///./src/store/state.js","webpack:///./src/main.js"],"names":["selectortype_template_index_0_src_App","render","_h","this","$createElement","_c","_self","attrs","id","name","mode","$route","meta","_e","_v","keepAlive","staticRenderFns","src_App","__webpack_require__","normalizeComponent","ssrContext","vue_esm","use","vue_router_esm","routes","path","component","Promise","all","e","then","bind","title","router","scrollBehavior","to","from","savedPosition","promise_default","a","resolve","setTimeout","x","y","beforeEach","next","window","document","matched","length","src_router","store","actions","asyncAdd","num","arguments","undefined","commit","asyncDiff","mutations","add","state","count","diff","vuex_esm","main_store","Store","config","productionTip","element_ui_common_default","el","components","App","template"],"mappings":"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","file":"static/js/app.2fb34aa4ce1edba4a0b5.js","sourcesContent":["var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app\"}},[_c('keep-alive',[_c('transition',{attrs:{\"name\":\"router-fade\",\"mode\":\"out-in\"}},[(_vm.$route.meta.keepAlive)?_c('router-view'):_vm._e()],1)],1),_vm._v(\" \"),_c('transition',{attrs:{\"name\":\"router-fade\",\"mode\":\"out-in\"}},[(!_vm.$route.meta.keepAlive)?_c('router-view'):_vm._e()],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-92825894\",\"hasScoped\":false,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/App.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-92825894\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../node_modules/vue-loader/lib/selector?type=styles&index=0!./App.vue\")\n}\nvar normalizeComponent = require(\"!../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../node_modules/vue-loader/lib/selector?type=script&index=0!./App.vue\"\nimport __vue_script__ from \"!!babel-loader!../node_modules/vue-loader/lib/selector?type=script&index=0!./App.vue\"\n/* template */\nimport __vue_template__ from \"!!../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-92825894\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../node_modules/vue-loader/lib/selector?type=template&index=0!./App.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/App.vue\n// module id = null\n// module chunks = ","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/App.vue","import Vue from 'vue'\nimport Router from 'vue-router'\n\nVue.use(Router)\n\n// 路由配置\nconst routes = [\n { path: '', component: () => import(/* webpackChunkName: \"home\" */'@/pages/home/index'), meta: { title: '博客首页' } },\n { path: '/detail/:id', name: 'Detail', component: () => import(/* webpackChunkName: \"Detail\" */'@/pages/post/single'), meta: { title: '文章详情页', keepAlive: true } },\n { path: '/login', component: () => import(/* webpackChunkName: \"login\" */'@/pages/login/login'), meta: { title: '登录' } },\n { path: '/register', component: () => import(/* webpackChunkName: \"register\" */'@/pages/login/register'), meta: { title: '注册' } },\n { path: '/demo', component: () => import(/* webpackChunkName: \"demo\" */'@/pages/demo/index'), meta: { title: '效果演示页', keepAlive: true } }\n]\n\n// 创建Vue Router实例\nconst router = new Router({\n // mode: \"history\",\n routes,\n scrollBehavior (to, from, savedPosition) {\n // return 期望滚动到哪个的位置 keep-alive 返回缓存页面后记录浏览位置\n if (savedPosition && to.meta.keepAlive) {\n return savedPosition\n }\n // 异步滚动操作\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve({ x: 0, y: 0 })\n }, 0)\n })\n }\n})\n\n/**\n * 路由 前置守卫\n * @param to: 即将要进入的目标 路由对象\n * @param from: 当前导航正要离开的路由\n * @param next: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。\n */\nrouter.beforeEach((to, from, next) => {\n window.document.title = to.meta.title // 修改浏览器标题\n // 这里也可以做是否登录的验证\n if (to.matched.length === 0) { // 如果未匹配到路由\n from.name ? next({ name: from.name }) : next('/') // 如果上级也未匹配到路由则跳转登录页面,如果上级能匹配到则转上级路由\n } else {\n next() // 如果匹配到正确跳转\n }\n})\n\nexport default router\n\n\n\n// WEBPACK FOOTER //\n// ./src/router/index.js","import actions from './action.js'\nimport mutations from './mutation.js'\nimport state from './state.js'\n\nexport default {\n actions,\n mutations,\n state\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/store/index.js","export default {\n // 异步 1秒之后加1\n asyncAdd (store, { num } = { num: 1 }) {\n setTimeout(() => {\n store.commit('add', { num })\n }, 1000)\n },\n // 异步 1秒之后减1\n asyncDiff (store, { num } = { num: 1 }) {\n setTimeout(() => {\n store.commit('diff', { num })\n }, 1000)\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/store/action.js","export default {\n add (state, { num } = { num: 1 }) {\n state.count += num\n },\n diff (state, { num } = { num: 1 }) {\n state.count -= num\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/store/mutation.js","let count = 0\nexport default {\n count\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/store/state.js","// The Vue build version to load with the `import` command\n// (runtime-only or standalone) has been set in webpack.base.conf with an alias.\nimport Vue from 'vue'\nimport '@/assets/css/base.css'\nimport ElementUI from 'element-ui'\nimport 'element-ui/lib/theme-chalk/index.css'\nimport App from './App'\nimport router from './router'\nimport Vuex from 'vuex'\nimport Store from '@/store/index.js'\n\nVue.use(Vuex)\nlet store = new Vuex.Store(Store)\n\nVue.config.productionTip = false\n\nVue.use(ElementUI)\n\n/* eslint-disable no-new */\nnew Vue({\n el: '#app',\n router,\n store,\n components: { App },\n template: ''\n})\n\n\n\n// WEBPACK FOOTER //\n// ./src/main.js"],"sourceRoot":""} -------------------------------------------------------------------------------- /dist/static/js/manifest.edd1a25d37861aeb8ac9.js: -------------------------------------------------------------------------------- 1 | !function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,c,a){for(var i,u,f,s=0,d=[];s 2 | 3 | 4 | 5 | 6 | h-blog | by haibao 7 | 8 | 9 |
10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "h-blog", 3 | "version": "1.0.0", 4 | "description": "A Vue.js project", 5 | "author": "hehaibao ", 6 | "private": true, 7 | "scripts": { 8 | "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", 9 | "start": "npm run dev", 10 | "lint": "eslint --ext .js,.vue src", 11 | "build": "node build/build.js" 12 | }, 13 | "dependencies": { 14 | "element-ui": "^2.4.5", 15 | "vue": "^2.5.2", 16 | "vue-router": "^3.0.1" 17 | }, 18 | "devDependencies": { 19 | "autoprefixer": "^7.1.2", 20 | "axios": "^0.18.0", 21 | "babel-core": "^6.22.1", 22 | "babel-eslint": "^8.2.1", 23 | "babel-helper-vue-jsx-merge-props": "^2.0.3", 24 | "babel-loader": "^7.1.1", 25 | "babel-plugin-syntax-jsx": "^6.18.0", 26 | "babel-plugin-transform-runtime": "^6.22.0", 27 | "babel-plugin-transform-vue-jsx": "^3.5.0", 28 | "babel-preset-env": "^1.3.2", 29 | "babel-preset-stage-2": "^6.22.0", 30 | "chalk": "^2.0.1", 31 | "compression-webpack-plugin": "^1.1.11", 32 | "copy-webpack-plugin": "^4.0.1", 33 | "css-loader": "^0.28.0", 34 | "eslint": "^4.15.0", 35 | "eslint-config-standard": "^10.2.1", 36 | "eslint-friendly-formatter": "^3.0.0", 37 | "eslint-loader": "^1.7.1", 38 | "eslint-plugin-import": "^2.7.0", 39 | "eslint-plugin-node": "^5.2.0", 40 | "eslint-plugin-promise": "^3.4.0", 41 | "eslint-plugin-standard": "^3.0.1", 42 | "eslint-plugin-vue": "^4.0.0", 43 | "extract-text-webpack-plugin": "^3.0.0", 44 | "file-loader": "^1.1.4", 45 | "friendly-errors-webpack-plugin": "^1.6.1", 46 | "html-webpack-plugin": "^2.30.1", 47 | "less": "^3.8.1", 48 | "less-loader": "^4.1.0", 49 | "mockjs": "^1.0.1-beta3", 50 | "node-notifier": "^5.1.2", 51 | "optimize-css-assets-webpack-plugin": "^3.2.0", 52 | "ora": "^1.2.0", 53 | "portfinder": "^1.0.13", 54 | "postcss-import": "^11.0.0", 55 | "postcss-loader": "^2.0.8", 56 | "postcss-url": "^7.2.1", 57 | "rimraf": "^2.6.0", 58 | "semver": "^5.3.0", 59 | "shelljs": "^0.7.6", 60 | "uglifyjs-webpack-plugin": "^1.1.1", 61 | "url-loader": "^1.0.1", 62 | "vue-codemirror": "^4.0.5", 63 | "vue-loader": "^13.3.0", 64 | "vue-style-loader": "^3.0.1", 65 | "vue-template-compiler": "^2.5.2", 66 | "vuex": "^3.0.1", 67 | "webpack": "^3.6.0", 68 | "webpack-bundle-analyzer": "^2.9.0", 69 | "webpack-dev-server": "^2.9.1", 70 | "webpack-merge": "^4.1.0" 71 | }, 72 | "engines": { 73 | "node": ">= 6.0.0", 74 | "npm": ">= 3.0.0" 75 | }, 76 | "browserslist": [ 77 | "> 1%", 78 | "last 2 versions", 79 | "not ie <= 8" 80 | ] 81 | } 82 | -------------------------------------------------------------------------------- /screenshots/detail.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hehaibao/h-blog/4e25b12b70913967b834781da37a604abf952f67/screenshots/detail.jpg -------------------------------------------------------------------------------- /screenshots/home.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hehaibao/h-blog/4e25b12b70913967b834781da37a604abf952f67/screenshots/home.jpg -------------------------------------------------------------------------------- /screenshots/login.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hehaibao/h-blog/4e25b12b70913967b834781da37a604abf952f67/screenshots/login.jpg -------------------------------------------------------------------------------- /screenshots/register.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hehaibao/h-blog/4e25b12b70913967b834781da37a604abf952f67/screenshots/register.jpg -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 20 | 21 | 32 | -------------------------------------------------------------------------------- /src/assets/css/base.css: -------------------------------------------------------------------------------- 1 | /** 2 | ** 基础样式 3 | */ 4 | body, ul, h1, h2 {margin: 0;padding: 0} 5 | html, body {font-size: 14px;font-family: Arial, Helvetica, sans-serif;line-height: 1;height: 100%} 6 | li {list-style: none} 7 | a {text-decoration: none;color: #666} 8 | 9 | .h {height: 100%} -------------------------------------------------------------------------------- /src/assets/images/login_bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hehaibao/h-blog/4e25b12b70913967b834781da37a604abf952f67/src/assets/images/login_bg.jpg -------------------------------------------------------------------------------- /src/assets/images/logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hehaibao/h-blog/4e25b12b70913967b834781da37a604abf952f67/src/assets/images/logo.jpg -------------------------------------------------------------------------------- /src/common/api.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 存放接口 3 | */ -------------------------------------------------------------------------------- /src/common/mockdata.js: -------------------------------------------------------------------------------- 1 | /** 2 | * mockjs 模拟数据 3 | */ 4 | import Mock from 'mockjs' 5 | 6 | const Random = Mock.Random 7 | 8 | // 模拟首页-最新文章列表 9 | const newsList = Mock.mock('newsList', getNewsList) 10 | 11 | function getNewsList () { 12 | let lists = [] 13 | 14 | for (let i = 0; i < 10; i++) { 15 | let tmpArr = { 16 | id: Random.increment(), 17 | title: Random.ctitle(10, 30), // Random.csentence( min, max ) 18 | desc: Random.cparagraph(1, 3), 19 | date: Random.date('yyyy-MM-dd'), 20 | tags: Random.range(3) 21 | } 22 | lists.push(tmpArr) 23 | } 24 | 25 | return { 26 | total: 100, 27 | lists: lists 28 | } 29 | } 30 | 31 | // 模拟首页-热评文章列表 32 | const hotList = Mock.mock('hotList', getHotList) 33 | 34 | function getHotList () { 35 | let lists = [] 36 | 37 | for (let i = 0; i < 5; i++) { 38 | let tmpArr = { 39 | id: Random.increment(), 40 | title: Random.ctitle(10, 20) 41 | } 42 | lists.push(tmpArr) 43 | } 44 | 45 | return { 46 | lists: lists 47 | } 48 | } 49 | 50 | // 模拟首页-标签列表 51 | const tagsList = Mock.mock('tagsList', getTagsList) 52 | 53 | function getTagsList () { 54 | let lists = [] 55 | 56 | for (let i = 0; i < 50; i++) { 57 | let tmpArr = { 58 | id: Random.increment(), 59 | text: Random.word(4, 8), 60 | color: Random.color() 61 | } 62 | lists.push(tmpArr) 63 | } 64 | 65 | return { 66 | lists: lists 67 | } 68 | } 69 | 70 | export { newsList, hotList, tagsList } 71 | -------------------------------------------------------------------------------- /src/components/aside.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 59 | 60 | 105 | -------------------------------------------------------------------------------- /src/components/footer.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | 13 | 19 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | // The Vue build version to load with the `import` command 2 | // (runtime-only or standalone) has been set in webpack.base.conf with an alias. 3 | import Vue from 'vue' 4 | import '@/assets/css/base.css' 5 | import ElementUI from 'element-ui' 6 | import 'element-ui/lib/theme-chalk/index.css' 7 | import App from './App' 8 | import router from './router' 9 | import Vuex from 'vuex' 10 | import Store from '@/store/index.js' 11 | 12 | Vue.use(Vuex) 13 | let store = new Vuex.Store(Store) 14 | 15 | Vue.config.productionTip = false 16 | 17 | Vue.use(ElementUI) 18 | 19 | /* eslint-disable no-new */ 20 | new Vue({ 21 | el: '#app', 22 | router, 23 | store, 24 | components: { App }, 25 | template: '' 26 | }) 27 | -------------------------------------------------------------------------------- /src/pages/demo/index.vue: -------------------------------------------------------------------------------- 1 | 61 | 62 | 157 | 158 | 177 | -------------------------------------------------------------------------------- /src/pages/home/index.vue: -------------------------------------------------------------------------------- 1 | 66 | 67 | 130 | 131 | 219 | -------------------------------------------------------------------------------- /src/pages/login/login.vue: -------------------------------------------------------------------------------- 1 | 30 | 31 | 76 | 77 | 90 | -------------------------------------------------------------------------------- /src/pages/login/register.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 89 | 90 | 103 | -------------------------------------------------------------------------------- /src/pages/post/single.vue: -------------------------------------------------------------------------------- 1 | 62 | 63 | 164 | 165 | 187 | -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | 4 | Vue.use(Router) 5 | 6 | // 路由配置 7 | const routes = [ 8 | { path: '', component: () => import(/* webpackChunkName: "home" */'@/pages/home/index'), meta: { title: '博客首页' } }, 9 | { path: '/detail/:id', name: 'Detail', component: () => import(/* webpackChunkName: "Detail" */'@/pages/post/single'), meta: { title: '文章详情页', keepAlive: true } }, 10 | { path: '/login', component: () => import(/* webpackChunkName: "login" */'@/pages/login/login'), meta: { title: '登录' } }, 11 | { path: '/register', component: () => import(/* webpackChunkName: "register" */'@/pages/login/register'), meta: { title: '注册' } }, 12 | { path: '/demo', component: () => import(/* webpackChunkName: "demo" */'@/pages/demo/index'), meta: { title: '效果演示页', keepAlive: true } } 13 | ] 14 | 15 | // 创建Vue Router实例 16 | const router = new Router({ 17 | // mode: "history", 18 | routes, 19 | scrollBehavior (to, from, savedPosition) { 20 | // return 期望滚动到哪个的位置 keep-alive 返回缓存页面后记录浏览位置 21 | if (savedPosition && to.meta.keepAlive) { 22 | return savedPosition 23 | } 24 | // 异步滚动操作 25 | return new Promise((resolve) => { 26 | setTimeout(() => { 27 | resolve({ x: 0, y: 0 }) 28 | }, 0) 29 | }) 30 | } 31 | }) 32 | 33 | /** 34 | * 路由 前置守卫 35 | * @param to: 即将要进入的目标 路由对象 36 | * @param from: 当前导航正要离开的路由 37 | * @param next: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。 38 | */ 39 | router.beforeEach((to, from, next) => { 40 | window.document.title = to.meta.title // 修改浏览器标题 41 | // 这里也可以做是否登录的验证 42 | if (to.matched.length === 0) { // 如果未匹配到路由 43 | from.name ? next({ name: from.name }) : next('/') // 如果上级也未匹配到路由则跳转登录页面,如果上级能匹配到则转上级路由 44 | } else { 45 | next() // 如果匹配到正确跳转 46 | } 47 | }) 48 | 49 | export default router 50 | -------------------------------------------------------------------------------- /src/store/action.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 异步 3 | */ 4 | export default { 5 | // 异步 1秒之后加1 6 | asyncAdd (store, { num } = { num: 1 }) { 7 | setTimeout(() => { 8 | store.commit('add', { num }) 9 | }, 1000) 10 | }, 11 | // 异步 1秒之后减1 12 | asyncDiff (store, { num } = { num: 1 }) { 13 | setTimeout(() => { 14 | store.commit('diff', { num }) 15 | }, 1000) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/store/index.js: -------------------------------------------------------------------------------- 1 | import actions from './action.js' 2 | import mutations from './mutation.js' 3 | import state from './state.js' 4 | 5 | export default { 6 | actions, 7 | mutations, 8 | state 9 | } 10 | -------------------------------------------------------------------------------- /src/store/mutation.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 同步 3 | */ 4 | export default { 5 | add (state, { num } = { num: 1 }) { 6 | state.count += num 7 | }, 8 | diff (state, { num } = { num: 1 }) { 9 | state.count -= num 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/store/state.js: -------------------------------------------------------------------------------- 1 | let count = 0 2 | export default { 3 | count 4 | } 5 | -------------------------------------------------------------------------------- /src/utils/env.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 配置开发环境和线上环境之间的切换 3 | * 4 | * baseUrl: 域名地址 5 | * imgBaseUrl: 图片所在域名地址 6 | * 7 | */ 8 | 9 | let baseUrl = '' 10 | let imgBaseUrl = '' 11 | 12 | if (process.env.NODE_ENV == 'development') { // 开发环境 13 | baseUrl = 'http://localhost:8080/' 14 | imgBaseUrl = baseUrl + 'assets/images' 15 | }else if (process.env.NODE_ENV == 'production') { // 线上环境 16 | baseUrl = 'http://demo.com/';//TODO: 替换域名 17 | imgBaseUrl = baseUrl + 'static/img' 18 | } 19 | 20 | export { 21 | baseUrl, 22 | imgBaseUrl 23 | } -------------------------------------------------------------------------------- /src/utils/fetch.js: -------------------------------------------------------------------------------- 1 | import { baseUrl } from './env' 2 | 3 | export default async(url = '', data = {}, type = 'GET', method = 'fetch') => { 4 | type = type.toUpperCase() 5 | url = baseUrl + url 6 | 7 | if (type == 'GET') { 8 | let dataStr = '' //数据拼接字符串 9 | Object.keys(data).forEach(key => { 10 | dataStr += key + '=' + data[key] + '&' 11 | }) 12 | 13 | if (dataStr !== '') { 14 | dataStr = dataStr.substr(0, dataStr.lastIndexOf('&')) 15 | url = url + '?' + dataStr 16 | } 17 | } 18 | 19 | if (window.fetch && method == 'fetch') { 20 | let requestConfig = { 21 | credentials: 'include', 22 | method: type, 23 | headers: { 24 | 'Accept': 'application/json', 25 | 'Content-Type': 'application/json' 26 | }, 27 | mode: "cors", 28 | cache: "force-cache" 29 | } 30 | 31 | if (type == 'POST') { 32 | Object.defineProperty(requestConfig, 'body', { 33 | value: JSON.stringify(data) 34 | }) 35 | } 36 | 37 | try { 38 | const response = await fetch(url, requestConfig) 39 | const responseJson = await response.json() 40 | return responseJson 41 | } catch (error) { 42 | throw new Error(error) 43 | } 44 | } else { 45 | return new Promise((resolve, reject) => { 46 | let requestObj 47 | if (window.XMLHttpRequest) { 48 | requestObj = new XMLHttpRequest() 49 | } else { 50 | requestObj = new ActiveXObject 51 | } 52 | 53 | let sendData = '' 54 | if (type == 'POST') { 55 | sendData = JSON.stringify(data) 56 | } 57 | 58 | requestObj.open(type, url, true) 59 | requestObj.setRequestHeader("Content-type", "application/x-www-form-urlencoded") 60 | requestObj.send(sendData) 61 | 62 | requestObj.onreadystatechange = () => { 63 | if (requestObj.readyState == 4) { 64 | if (requestObj.status == 200) { 65 | let obj = requestObj.response 66 | if (typeof obj !== 'object') { 67 | obj = JSON.parse(obj) 68 | } 69 | resolve(obj) 70 | } else { 71 | reject(requestObj) 72 | } 73 | } 74 | } 75 | }) 76 | } 77 | } -------------------------------------------------------------------------------- /src/utils/mUtils.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 常用工具 3 | * update at 2018-08-13 by haibao 4 | */ 5 | 6 | /** 7 | * 存储sessionStorage 8 | */ 9 | export const setStore = (name, content) => { 10 | if (!name) return 11 | if (typeof content !== 'string') { 12 | content = JSON.stringify(content) 13 | } 14 | window.sessionStorage.setItem(name, content) 15 | } 16 | 17 | /** 18 | * 获取sessionStorage 19 | */ 20 | export const getStore = name => { 21 | if (!name) return 22 | return window.sessionStorage.getItem(name) 23 | } 24 | 25 | /** 26 | * 删除sessionStorage 27 | */ 28 | export const removeStore = name => { 29 | if (!name) return 30 | window.sessionStorage.removeItem(name) 31 | } 32 | -------------------------------------------------------------------------------- /static/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hehaibao/h-blog/4e25b12b70913967b834781da37a604abf952f67/static/.gitkeep --------------------------------------------------------------------------------