├── .babelrc
├── .editorconfig
├── .gitignore
├── .postcssrc.js
├── README.md
├── build
├── build.js
├── check-versions.js
├── dev-client.js
├── dev-server.js
├── 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
├── favicon.ico
├── index.html
├── package.json
├── resource
├── 流程图
│ ├── 流程图-01.jpg
│ └── 流程图.ai
└── 设计图
│ ├── JPG
│ ├── 个人资料.jpg
│ ├── 主页.jpg
│ ├── 代码片段.jpg
│ ├── 全部博客.jpg
│ ├── 分类.jpg
│ ├── 分类_.jpg
│ ├── 发布博客.jpg
│ ├── 归档.jpg
│ ├── 文章详情.jpg
│ └── 登录.jpg
│ ├── PSD
│ ├── 个人资料.psd
│ ├── 主页.psd
│ ├── 全部博客.psd
│ ├── 分类.psd
│ ├── 分类_.psd
│ ├── 发布博客.psd
│ ├── 归档.psd
│ ├── 文章详情.psd
│ └── 登录.psd
│ └── 压缩JPG
│ ├── 主页.jpg
│ ├── 代码片段.jpg
│ ├── 发布博客.jpg
│ └── 登录.jpg
├── src
├── App.vue
├── assets
│ ├── font_icon
│ │ ├── demo.css
│ │ ├── demo_fontclass.html
│ │ ├── demo_symbol.html
│ │ ├── demo_unicode.html
│ │ ├── iconfont.css
│ │ ├── iconfont.eot
│ │ ├── iconfont.js
│ │ ├── iconfont.svg
│ │ ├── iconfont.ttf
│ │ └── iconfont.woff
│ ├── img
│ │ └── defaultIcon.gif
│ ├── script
│ │ ├── common.js
│ │ └── html5shiv.min.js
│ ├── style
│ │ ├── common.less
│ │ ├── markdown.less
│ │ └── reset.css
│ └── view
│ │ └── ripple.html
├── bmob.js
├── components
│ ├── BAM
│ │ ├── allBlog
│ │ │ └── allBlog.vue
│ │ ├── draft
│ │ │ └── draft.vue
│ │ ├── layout
│ │ │ └── layout.vue
│ │ ├── self
│ │ │ ├── default.png
│ │ │ └── self.vue
│ │ ├── side
│ │ │ └── side.vue
│ │ └── writeBlog
│ │ │ └── writeBlog.vue
│ ├── article
│ │ ├── content
│ │ │ └── content.vue
│ │ └── layout
│ │ │ └── layout.vue
│ ├── blog
│ │ └── layout
│ │ │ └── layout.vue
│ ├── code
│ │ ├── codeMirror
│ │ │ └── codeMirror.vue
│ │ ├── codeTitle
│ │ │ └── codeTitle.vue
│ │ └── layout
│ │ │ └── layout.vue
│ ├── common
│ │ ├── Message
│ │ │ └── Message.vue
│ │ ├── alert
│ │ │ └── alert.vue
│ │ ├── article
│ │ │ └── article.vue
│ │ ├── blogTags
│ │ │ └── blogTags.vue
│ │ ├── catalogue
│ │ │ └── catalogue.vue
│ │ ├── dialog
│ │ │ └── dialog.vue
│ │ ├── error
│ │ │ └── error.vue
│ │ ├── header
│ │ │ ├── header.vue
│ │ │ └── noavatar_small.gif
│ │ ├── loading
│ │ │ └── loading.vue
│ │ └── sidebar
│ │ │ └── sidebar.vue
│ ├── login
│ │ └── layout
│ │ │ ├── Layer_1.png
│ │ │ ├── Layer_2.png
│ │ │ └── layout.vue
│ └── time
│ │ ├── layout
│ │ └── layout.vue
│ │ └── timeList
│ │ └── timeList.vue
├── main.js
└── router
│ └── index.js
├── src_node
├── App.vue
├── assets
│ ├── font_icon
│ │ ├── demo.css
│ │ ├── demo_fontclass.html
│ │ ├── demo_symbol.html
│ │ ├── demo_unicode.html
│ │ ├── iconfont.css
│ │ ├── iconfont.eot
│ │ ├── iconfont.js
│ │ ├── iconfont.svg
│ │ ├── iconfont.ttf
│ │ └── iconfont.woff
│ ├── script
│ │ ├── common.js
│ │ └── html5shiv.min.js
│ ├── style
│ │ ├── common.less
│ │ ├── markdown.less
│ │ └── reset.css
│ └── view
│ │ └── ripple.html
├── components
│ ├── BAM
│ │ ├── allBlog
│ │ │ └── allBlog.vue
│ │ ├── draft
│ │ │ └── draft.vue
│ │ ├── layout
│ │ │ └── layout.vue
│ │ ├── self
│ │ │ ├── default.png
│ │ │ └── self.vue
│ │ ├── side
│ │ │ └── side.vue
│ │ └── writeBlog
│ │ │ └── writeBlog.vue
│ ├── article
│ │ ├── content
│ │ │ └── content.vue
│ │ └── layout
│ │ │ └── layout.vue
│ ├── blog
│ │ └── layout
│ │ │ └── layout.vue
│ ├── common
│ │ ├── Message
│ │ │ └── Message.vue
│ │ ├── article
│ │ │ └── article.vue
│ │ ├── blogTags
│ │ │ └── blogTags.vue
│ │ ├── catalogue
│ │ │ └── catalogue.vue
│ │ ├── dialog
│ │ │ └── dialog.vue
│ │ ├── editor
│ │ │ └── editor.vue
│ │ ├── header
│ │ │ ├── header.vue
│ │ │ └── noavatar_small.gif
│ │ └── sidebar
│ │ │ └── sidebar.vue
│ ├── login
│ │ └── layout
│ │ │ ├── Layer_1.png
│ │ │ ├── Layer_2.png
│ │ │ └── layout.vue
│ ├── tags
│ │ └── layout
│ │ │ └── layout.vue
│ └── time
│ │ ├── layout
│ │ └── layout.vue
│ │ └── timeList
│ │ └── timeList.vue
├── main.js
├── router
│ └── index.js
└── todos.md
└── static
├── .gitkeep
└── lib
├── bmob
└── bmob-min.js
├── highlight
├── github.min.css
└── highlight.min.js
├── pace
├── pace-theme-flash.css
└── pace.min.js
└── tocbot
└── tocbot.js
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | ["env", { "modules": false }],
4 | "stage-2"
5 | ],
6 | "plugins": ["transform-runtime"],
7 | "comments": false,
8 | "env": {
9 | "test": {
10 | "presets": ["env", "stage-2"],
11 | "plugins": [ "istanbul" ]
12 | }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/.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 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules/
3 | dist/
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 |
--------------------------------------------------------------------------------
/.postcssrc.js:
--------------------------------------------------------------------------------
1 | // https://github.com/michael-ciniawsky/postcss-load-config
2 |
3 | module.exports = {
4 | "plugins": {
5 | // to edit target browsers: use "browserlist" field in package.json
6 | "autoprefixer": {}
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ### 文章系统+代码片段管理
2 |
3 | #### 项目简介:
4 | 一个可以注册登录的个人文章系统,包括前台博客、归档(按时间排序博客)、代码片段管理、后台管理等功能。
5 |
6 | #### 项目目的:
7 | 一方面是为了做一个属于自己的网站,有自己想要的定制功能;另一方面也为了练练手多学习,从原型、设计到前端再到node,一步步遇到问题然后解决问题。
8 |
9 | #### 项目技术:
10 | 前期:Vue + node + MySQL (node部分比较简陋,可[参考](https://github.com/Tetegw/pawnBlog_nodejs))
11 | 后期:Vue + Bmob(云后台)
12 |
13 | #### 项目效果:
14 | 
15 | 
16 | 
17 | 
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/build/build.js:
--------------------------------------------------------------------------------
1 | require('./check-versions')()
2 |
3 | process.env.NODE_ENV = 'production'
4 |
5 | var ora = require('ora')
6 | var rm = require('rimraf')
7 | var path = require('path')
8 | var chalk = require('chalk')
9 | var webpack = require('webpack')
10 | var config = require('../config')
11 | var webpackConfig = require('./webpack.prod.conf')
12 |
13 | var spinner = ora('building for production...')
14 | spinner.start()
15 |
16 | rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
17 | if (err) throw err
18 | webpack(webpackConfig, function (err, stats) {
19 | spinner.stop()
20 | if (err) throw err
21 | process.stdout.write(stats.toString({
22 | colors: true,
23 | modules: false,
24 | children: false,
25 | chunks: false,
26 | chunkModules: false
27 | }) + '\n\n')
28 |
29 | console.log(chalk.cyan(' Build complete.\n'))
30 | console.log(chalk.yellow(
31 | ' Tip: built files are meant to be served over an HTTP server.\n' +
32 | ' Opening index.html over file:// won\'t work.\n'
33 | ))
34 | })
35 | })
36 |
--------------------------------------------------------------------------------
/build/check-versions.js:
--------------------------------------------------------------------------------
1 | var chalk = require('chalk')
2 | var semver = require('semver')
3 | var packageConfig = require('../package.json')
4 | var shell = require('shelljs')
5 | function exec (cmd) {
6 | return require('child_process').execSync(cmd).toString().trim()
7 | }
8 |
9 | var versionRequirements = [
10 | {
11 | name: 'node',
12 | currentVersion: semver.clean(process.version),
13 | versionRequirement: packageConfig.engines.node
14 | },
15 | ]
16 |
17 | if (shell.which('npm')) {
18 | versionRequirements.push({
19 | name: 'npm',
20 | currentVersion: exec('npm --version'),
21 | versionRequirement: packageConfig.engines.npm
22 | })
23 | }
24 |
25 | module.exports = function () {
26 | var warnings = []
27 | for (var i = 0; i < versionRequirements.length; i++) {
28 | var mod = versionRequirements[i]
29 | if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
30 | warnings.push(mod.name + ': ' +
31 | chalk.red(mod.currentVersion) + ' should be ' +
32 | chalk.green(mod.versionRequirement)
33 | )
34 | }
35 | }
36 |
37 | if (warnings.length) {
38 | console.log('')
39 | console.log(chalk.yellow('To use this template, you must update following to modules:'))
40 | console.log()
41 | for (var i = 0; i < warnings.length; i++) {
42 | var warning = warnings[i]
43 | console.log(' ' + warning)
44 | }
45 | console.log()
46 | process.exit(1)
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/build/dev-client.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable */
2 | require('eventsource-polyfill')
3 | var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true')
4 |
5 | hotClient.subscribe(function (event) {
6 | if (event.action === 'reload') {
7 | window.location.reload()
8 | }
9 | })
10 |
--------------------------------------------------------------------------------
/build/dev-server.js:
--------------------------------------------------------------------------------
1 | require('./check-versions')()
2 |
3 | var config = require('../config')
4 | if (!process.env.NODE_ENV) {
5 | process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV)
6 | }
7 |
8 | var opn = require('opn')
9 | var path = require('path')
10 | var express = require('express')
11 | var webpack = require('webpack')
12 | var proxyMiddleware = require('http-proxy-middleware')
13 | var webpackConfig = require('./webpack.dev.conf')
14 |
15 | // default port where dev server listens for incoming traffic
16 | var port = process.env.PORT || config.dev.port
17 | // automatically open browser, if not set will be false
18 | var autoOpenBrowser = !!config.dev.autoOpenBrowser
19 | // Define HTTP proxies to your custom API backend
20 | // https://github.com/chimurai/http-proxy-middleware
21 | var proxyTable = config.dev.proxyTable
22 |
23 | var app = express()
24 |
25 | var compiler = webpack(webpackConfig)
26 |
27 | var devMiddleware = require('webpack-dev-middleware')(compiler, {
28 | publicPath: webpackConfig.output.publicPath,
29 | quiet: true
30 | })
31 |
32 | var hotMiddleware = require('webpack-hot-middleware')(compiler, {
33 | log: () => { }
34 | })
35 | // force page reload when html-webpack-plugin template changes
36 | compiler.plugin('compilation', function (compilation) {
37 | compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) {
38 | hotMiddleware.publish({ action: 'reload' })
39 | cb()
40 | })
41 | })
42 |
43 | // proxy api requests
44 | Object.keys(proxyTable).forEach(function (context) {
45 | var options = proxyTable[context]
46 | if (typeof options === 'string') {
47 | options = { target: options }
48 | }
49 | app.use(proxyMiddleware(options.filter || context, options))
50 | })
51 |
52 | // handle fallback for HTML5 history API
53 | app.use(require('connect-history-api-fallback')())
54 |
55 | // serve webpack bundle output
56 | app.use(devMiddleware)
57 |
58 | // enable hot-reload and state-preserving
59 | // compilation error display
60 | app.use(hotMiddleware)
61 |
62 | // serve pure static assets
63 | var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory)
64 | app.use(staticPath, express.static('./static'))
65 |
66 | var uri = 'http://localhost:' + port
67 |
68 | var _resolve
69 | var readyPromise = new Promise(resolve => {
70 | _resolve = resolve
71 | })
72 |
73 | console.log('> Starting dev server...')
74 | devMiddleware.waitUntilValid(() => {
75 | console.log('> Listening at ' + uri + '\n')
76 | // when env is testing, don't need open it
77 | if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') {
78 | opn(uri)
79 | }
80 | _resolve()
81 | })
82 |
83 | var server = app.listen(port)
84 |
85 | module.exports = {
86 | ready: readyPromise,
87 | close: () => {
88 | server.close()
89 | }
90 | }
91 |
--------------------------------------------------------------------------------
/build/utils.js:
--------------------------------------------------------------------------------
1 | var path = require('path')
2 | var config = require('../config')
3 | var ExtractTextPlugin = require('extract-text-webpack-plugin')
4 |
5 | exports.assetsPath = function (_path) {
6 | var assetsSubDirectory = process.env.NODE_ENV === 'production'
7 | ? config.build.assetsSubDirectory
8 | : config.dev.assetsSubDirectory
9 | return path.posix.join(assetsSubDirectory, _path)
10 | }
11 |
12 | exports.cssLoaders = function (options) {
13 | options = options || {}
14 |
15 | var cssLoader = {
16 | loader: 'css-loader',
17 | options: {
18 | minimize: process.env.NODE_ENV === 'production',
19 | sourceMap: options.sourceMap
20 | }
21 | }
22 |
23 | // generate loader string to be used with extract text plugin
24 | function generateLoaders (loader, loaderOptions) {
25 | var loaders = [cssLoader]
26 | if (loader) {
27 | loaders.push({
28 | loader: loader + '-loader',
29 | options: Object.assign({}, loaderOptions, {
30 | sourceMap: options.sourceMap
31 | })
32 | })
33 | }
34 |
35 | // Extract CSS when that option is specified
36 | // (which is the case during production build)
37 | if (options.extract) {
38 | return ExtractTextPlugin.extract({
39 | use: loaders,
40 | fallback: 'vue-style-loader'
41 | })
42 | } else {
43 | return ['vue-style-loader'].concat(loaders)
44 | }
45 | }
46 |
47 | // https://vue-loader.vuejs.org/en/configurations/extract-css.html
48 | return {
49 | css: generateLoaders(),
50 | postcss: generateLoaders(),
51 | less: generateLoaders('less'),
52 | sass: generateLoaders('sass', { indentedSyntax: true }),
53 | scss: generateLoaders('sass'),
54 | stylus: generateLoaders('stylus'),
55 | styl: generateLoaders('stylus')
56 | }
57 | }
58 |
59 | // Generate loaders for standalone style files (outside of .vue)
60 | exports.styleLoaders = function (options) {
61 | var output = []
62 | var loaders = exports.cssLoaders(options)
63 | for (var extension in loaders) {
64 | var loader = loaders[extension]
65 | output.push({
66 | test: new RegExp('\\.' + extension + '$'),
67 | use: loader
68 | })
69 | }
70 | return output
71 | }
72 |
--------------------------------------------------------------------------------
/build/vue-loader.conf.js:
--------------------------------------------------------------------------------
1 | var utils = require('./utils')
2 | var config = require('../config')
3 | var isProduction = process.env.NODE_ENV === 'production'
4 |
5 | module.exports = {
6 | loaders: utils.cssLoaders({
7 | sourceMap: isProduction
8 | ? config.build.productionSourceMap
9 | : config.dev.cssSourceMap,
10 | extract: isProduction
11 | })
12 | }
13 |
--------------------------------------------------------------------------------
/build/webpack.base.conf.js:
--------------------------------------------------------------------------------
1 | var path = require('path')
2 | var utils = require('./utils')
3 | var config = require('../config')
4 | var vueLoaderConfig = require('./vue-loader.conf')
5 |
6 | function resolve(dir) {
7 | return path.join(__dirname, '..', dir)
8 | }
9 |
10 | module.exports = {
11 | entry: {
12 | app: './src/main.js'
13 | },
14 | output: {
15 | path: config.build.assetsRoot,
16 | filename: '[name].js',
17 | publicPath: process.env.NODE_ENV === 'production'
18 | ? config.build.assetsPublicPath
19 | : config.dev.assetsPublicPath
20 | },
21 | resolve: {
22 | extensions: ['.js', '.vue', '.json'],
23 | alias: {
24 | 'vue$': 'vue/dist/vue.esm.js',
25 | '@': resolve('src')
26 | }
27 | },
28 | module: {
29 | rules: [
30 | {
31 | test: /\.vue$/,
32 | loader: 'vue-loader',
33 | options: vueLoaderConfig
34 | },
35 | {
36 | test: /\.js$/,
37 | loader: 'babel-loader',
38 | include: [resolve('src'), resolve('test')]
39 | },
40 | {
41 | test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
42 | loader: 'url-loader',
43 | options: {
44 | limit: 10000,
45 | name: utils.assetsPath('img/[name].[hash:7].[ext]')
46 | }
47 | },
48 | {
49 | test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
50 | loader: 'url-loader',
51 | options: {
52 | limit: 10000,
53 | name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
54 | }
55 | }
56 | ]
57 | },
58 |
59 |
60 | }
61 |
--------------------------------------------------------------------------------
/build/webpack.dev.conf.js:
--------------------------------------------------------------------------------
1 | var utils = require('./utils')
2 | var webpack = require('webpack')
3 | var config = require('../config')
4 | var merge = require('webpack-merge')
5 | var baseWebpackConfig = require('./webpack.base.conf')
6 | var HtmlWebpackPlugin = require('html-webpack-plugin')
7 | var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
8 |
9 | // add hot-reload related code to entry chunks
10 | Object.keys(baseWebpackConfig.entry).forEach(function (name) {
11 | baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name])
12 | })
13 |
14 | module.exports = merge(baseWebpackConfig, {
15 | module: {
16 | rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap })
17 | },
18 | // cheap-module-eval-source-map is faster for development
19 | devtool: '#cheap-module-eval-source-map',
20 | plugins: [
21 | new webpack.DefinePlugin({
22 | 'process.env': config.dev.env
23 | }),
24 | // https://github.com/glenjamin/webpack-hot-middleware#installation--usage
25 | new webpack.HotModuleReplacementPlugin(),
26 | new webpack.NoEmitOnErrorsPlugin(),
27 | // https://github.com/ampedandwired/html-webpack-plugin
28 | new HtmlWebpackPlugin({
29 | filename: 'index.html',
30 | template: 'index.html',
31 | inject: true,
32 | chunks: ['app'] // 需要引入的chunk入口名
33 | }),
34 | new FriendlyErrorsPlugin()
35 | ]
36 | })
37 |
--------------------------------------------------------------------------------
/build/webpack.prod.conf.js:
--------------------------------------------------------------------------------
1 | var path = require('path')
2 | var utils = require('./utils')
3 | var webpack = require('webpack')
4 | var config = require('../config')
5 | var merge = require('webpack-merge')
6 | var baseWebpackConfig = require('./webpack.base.conf')
7 | var CopyWebpackPlugin = require('copy-webpack-plugin')
8 | var HtmlWebpackPlugin = require('html-webpack-plugin')
9 | var ExtractTextPlugin = require('extract-text-webpack-plugin')
10 | var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
11 |
12 | var env = config.build.env
13 |
14 | var webpackConfig = merge(baseWebpackConfig, {
15 | module: {
16 | rules: utils.styleLoaders({
17 | sourceMap: config.build.productionSourceMap,
18 | extract: true
19 | })
20 | },
21 | devtool: config.build.productionSourceMap ? '#source-map' : false,
22 | output: {
23 | path: config.build.assetsRoot,
24 | filename: utils.assetsPath('js/[name].[chunkhash].js'),
25 | chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
26 | },
27 | plugins: [
28 | // http://vuejs.github.io/vue-loader/en/workflow/production.html
29 | new webpack.DefinePlugin({
30 | 'process.env': env
31 | }),
32 | new webpack.optimize.UglifyJsPlugin({
33 | compress: {
34 | warnings: false,
35 | drop_debugger: true,
36 | drop_console: true
37 | },
38 | sourceMap: true
39 | }),
40 | // extract css into its own file
41 | new ExtractTextPlugin({
42 | filename: utils.assetsPath('css/[name].[contenthash].css')
43 | }),
44 | // Compress extracted CSS. We are using this plugin so that possible
45 | // duplicated CSS from different components can be deduped.
46 | new OptimizeCSSPlugin({
47 | cssProcessorOptions: {
48 | safe: true
49 | }
50 | }),
51 | // generate dist index.html with correct asset hash for caching.
52 | // you can customize output by editing /index.html
53 | // see https://github.com/ampedandwired/html-webpack-plugin
54 | new HtmlWebpackPlugin({
55 | filename: config.build.index,
56 | template: 'index.html',
57 | inject: true,
58 | minify: {
59 | removeComments: true,
60 | collapseWhitespace: true,
61 | removeAttributeQuotes: true
62 | // more options:
63 | // https://github.com/kangax/html-minifier#options-quick-reference
64 | },
65 | // necessary to consistently work with multiple chunks via CommonsChunkPlugin
66 | chunksSortMode: 'dependency'
67 | }),
68 | // split vendor js into its own file
69 | new webpack.optimize.CommonsChunkPlugin({
70 | name: 'vendor',
71 | minChunks: function (module, count) {
72 | // any required modules inside node_modules are extracted to vendor
73 | return (
74 | module.resource &&
75 | /\.js$/.test(module.resource) &&
76 | module.resource.indexOf(
77 | path.join(__dirname, '../node_modules')
78 | ) === 0
79 | )
80 | }
81 | }),
82 | // extract webpack runtime and module manifest to its own file in order to
83 | // prevent vendor hash from being updated whenever app bundle is updated
84 | new webpack.optimize.CommonsChunkPlugin({
85 | name: 'manifest',
86 | chunks: ['vendor']
87 | }),
88 | // copy custom static assets
89 | new CopyWebpackPlugin([
90 | {
91 | from: path.resolve(__dirname, '../static'),
92 | to: config.build.assetsSubDirectory,
93 | ignore: ['.*']
94 | }
95 | ])
96 | ]
97 | })
98 |
99 | if (config.build.productionGzip) {
100 | var CompressionWebpackPlugin = require('compression-webpack-plugin')
101 |
102 | webpackConfig.plugins.push(
103 | new CompressionWebpackPlugin({
104 | asset: '[path].gz[query]',
105 | algorithm: 'gzip',
106 | test: new RegExp(
107 | '\\.(' +
108 | config.build.productionGzipExtensions.join('|') +
109 | ')$'
110 | ),
111 | threshold: 10240,
112 | minRatio: 0.8
113 | })
114 | )
115 | }
116 |
117 | if (config.build.bundleAnalyzerReport) {
118 | var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
119 | webpackConfig.plugins.push(new BundleAnalyzerPlugin())
120 | }
121 |
122 | module.exports = webpackConfig
123 |
--------------------------------------------------------------------------------
/config/dev.env.js:
--------------------------------------------------------------------------------
1 | var merge = require('webpack-merge')
2 | var prodEnv = require('./prod.env')
3 |
4 | module.exports = merge(prodEnv, {
5 | NODE_ENV: '"development"'
6 | })
7 |
--------------------------------------------------------------------------------
/config/index.js:
--------------------------------------------------------------------------------
1 | // see http://vuejs-templates.github.io/webpack for documentation.
2 | var path = require('path')
3 |
4 | module.exports = {
5 | build: {
6 | env: require('./prod.env'),
7 | index: path.resolve(__dirname, '../dist/index.html'),
8 | assetsRoot: path.resolve(__dirname, '../dist'),
9 | assetsSubDirectory: 'static',
10 | assetsPublicPath: './',
11 | productionSourceMap: true,
12 | // Gzip off by default as many popular static hosts such as
13 | // Surge or Netlify already gzip all static assets for you.
14 | // Before setting to `true`, make sure to:
15 | // npm install --save-dev compression-webpack-plugin
16 | productionGzip: false,
17 | productionGzipExtensions: ['js', 'css'],
18 | // Run the build command with an extra argument to
19 | // View the bundle analyzer report after build finishes:
20 | // `npm run build --report`
21 | // Set to `true` or `false` to always turn it on or off
22 | bundleAnalyzerReport: process.env.npm_config_report
23 | },
24 | dev: {
25 | env: require('./dev.env'),
26 | port: 8080,
27 | autoOpenBrowser: true,
28 | assetsSubDirectory: 'static',
29 | assetsPublicPath: '/',
30 | proxyTable: {
31 | /* '/api': {
32 | target: 'http://127.0.0.1:8090',
33 | changeOrigin: true,
34 | pathRewrite: {
35 | '^/api': '/api'
36 | }
37 | },
38 | '/admin': {
39 | target: 'http://127.0.0.1:8090',
40 | changeOrigin: true,
41 | pathRewrite: {
42 | '^/admin': '/admin'
43 | }
44 | },
45 | '/login': {
46 | target: 'http://127.0.0.1:8090',
47 | changeOrigin: true,
48 | pathRewrite: {
49 | '^/login': '/login'
50 | }
51 | },
52 | '/logout': {
53 | target: 'http://127.0.0.1:8090',
54 | changeOrigin: true,
55 | pathRewrite: {
56 | '^/logout': '/logout'
57 | }
58 | },
59 | '/initUserInfo': {
60 | target: 'http://127.0.0.1:8090',
61 | changeOrigin: true,
62 | pathRewrite: {
63 | '^/initUserInfo': '/initUserInfo'
64 | }
65 | },
66 | '/pushArticle': {
67 | target: 'http://127.0.0.1:8090',
68 | changeOrigin: true,
69 | pathRewrite: {
70 | '^/pushArticle': '/pushArticle'
71 | }
72 | },
73 | '/pushDraft': {
74 | target: 'http://127.0.0.1:8090',
75 | changeOrigin: true,
76 | pathRewrite: {
77 | '^/pushDraft': '/pushDraft'
78 | }
79 | },
80 | '/articleList': {
81 | target: 'http://127.0.0.1:8090',
82 | changeOrigin: true,
83 | pathRewrite: {
84 | '^/articleList': '/articleList'
85 | }
86 | },
87 | '/draftList': {
88 | target: 'http://127.0.0.1:8090',
89 | changeOrigin: true,
90 | pathRewrite: {
91 | '^/draftList': '/draftList'
92 | }
93 | },
94 | '/draftDetail': {
95 | target: 'http://127.0.0.1:8090',
96 | changeOrigin: true,
97 | pathRewrite: {
98 | '^/draftDetail': '/draftDetail'
99 | }
100 | },
101 | '/articleDetail': {
102 | target: 'http://127.0.0.1:8090',
103 | changeOrigin: true,
104 | pathRewrite: {
105 | '^/articleDetail': '/articleDetail'
106 | }
107 | },
108 | '/cols': {
109 | target: 'http://127.0.0.1:8090',
110 | changeOrigin: true,
111 | pathRewrite: {
112 | '^/cols': '/cols'
113 | }
114 | },
115 | '/upload': {
116 | target: 'http://127.0.0.1:8090',
117 | changeOrigin: true,
118 | pathRewrite: {
119 | '^/upload': '/upload'
120 | }
121 | },
122 | '/updateSelfInfo': {
123 | target: 'http://127.0.0.1:8090',
124 | changeOrigin: true,
125 | pathRewrite: {
126 | '^/updateSelfInfo': '/updateSelfInfo'
127 | }
128 | },
129 | '/deleteArticle': {
130 | target: 'http://127.0.0.1:8090',
131 | changeOrigin: true,
132 | pathRewrite: {
133 | '^/deleteArticle': '/deleteArticle'
134 | }
135 | },
136 | '/deleteDraft': {
137 | target: 'http://127.0.0.1:8090',
138 | changeOrigin: true,
139 | pathRewrite: {
140 | '^/deleteDraft': '/deleteDraft'
141 | }
142 | } */
143 | },
144 | },
145 | // CSS Sourcemaps off by default because relative paths are "buggy"
146 | // with this option, according to the CSS-Loader README
147 | // (https://github.com/webpack/css-loader#sourcemaps)
148 | // In our experience, they generally work as expected,
149 | // just be aware of this issue when enabling this option.
150 | cssSourceMap: false
151 | }
152 |
--------------------------------------------------------------------------------
/config/prod.env.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | NODE_ENV: '"production"'
3 | }
4 |
--------------------------------------------------------------------------------
/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/favicon.ico
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | pawnBlog
10 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "develop",
3 | "version": "1.0.0",
4 | "description": "my blog",
5 | "author": "Tetegw <1151832942@qq.com>",
6 | "private": true,
7 | "scripts": {
8 | "dev": "node build/dev-server.js",
9 | "start": "node build/dev-server.js",
10 | "build": "node build/build.js"
11 | },
12 | "dependencies": {
13 | "highlight.js": "^9.12.0",
14 | "mavon-editor": "^2.2.9",
15 | "muse-ui": "^2.0.3",
16 | "vue": "^2.2.6",
17 | "vue-codemirror": "^4.0.5",
18 | "vue-resource": "^1.3.4",
19 | "vue-router": "^2.3.1",
20 | "xmlhttprequest": "^1.8.0"
21 | },
22 | "devDependencies": {
23 | "autoprefixer": "^6.7.2",
24 | "babel-core": "^6.22.1",
25 | "babel-loader": "^6.2.10",
26 | "babel-plugin-transform-runtime": "^6.22.0",
27 | "babel-preset-env": "^1.3.2",
28 | "babel-preset-stage-2": "^6.22.0",
29 | "babel-register": "^6.22.0",
30 | "chalk": "^1.1.3",
31 | "connect-history-api-fallback": "^1.3.0",
32 | "copy-webpack-plugin": "^4.0.1",
33 | "css-loader": "^0.28.1",
34 | "eventsource-polyfill": "^0.9.6",
35 | "express": "^4.14.1",
36 | "extract-text-webpack-plugin": "^2.0.0",
37 | "file-loader": "^0.11.1",
38 | "friendly-errors-webpack-plugin": "^1.1.3",
39 | "html-webpack-plugin": "^2.28.0",
40 | "http-proxy-middleware": "^0.17.3",
41 | "less": "^2.7.2",
42 | "less-loader": "^4.0.3",
43 | "opn": "^4.0.2",
44 | "optimize-css-assets-webpack-plugin": "^1.3.0",
45 | "ora": "^1.2.0",
46 | "rimraf": "^2.6.0",
47 | "semver": "^5.3.0",
48 | "shelljs": "^0.7.6",
49 | "url-loader": "^0.5.8",
50 | "vue-loader": "^11.3.4",
51 | "vue-style-loader": "^2.0.5",
52 | "vue-template-compiler": "^2.2.6",
53 | "webpack": "^2.3.3",
54 | "webpack-bundle-analyzer": "^2.2.1",
55 | "webpack-dev-middleware": "^1.10.0",
56 | "webpack-hot-middleware": "^2.18.0",
57 | "webpack-merge": "^4.1.0"
58 | },
59 | "engines": {
60 | "node": ">= 4.0.0",
61 | "npm": ">= 3.0.0"
62 | },
63 | "browserslist": [
64 | "> 1%",
65 | "last 2 versions",
66 | "not ie <= 8"
67 | ]
68 | }
69 |
--------------------------------------------------------------------------------
/resource/流程图/流程图-01.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/resource/流程图/流程图-01.jpg
--------------------------------------------------------------------------------
/resource/流程图/流程图.ai:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/resource/流程图/流程图.ai
--------------------------------------------------------------------------------
/resource/设计图/JPG/个人资料.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/resource/设计图/JPG/个人资料.jpg
--------------------------------------------------------------------------------
/resource/设计图/JPG/主页.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/resource/设计图/JPG/主页.jpg
--------------------------------------------------------------------------------
/resource/设计图/JPG/代码片段.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/resource/设计图/JPG/代码片段.jpg
--------------------------------------------------------------------------------
/resource/设计图/JPG/全部博客.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/resource/设计图/JPG/全部博客.jpg
--------------------------------------------------------------------------------
/resource/设计图/JPG/分类.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/resource/设计图/JPG/分类.jpg
--------------------------------------------------------------------------------
/resource/设计图/JPG/分类_.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/resource/设计图/JPG/分类_.jpg
--------------------------------------------------------------------------------
/resource/设计图/JPG/发布博客.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/resource/设计图/JPG/发布博客.jpg
--------------------------------------------------------------------------------
/resource/设计图/JPG/归档.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/resource/设计图/JPG/归档.jpg
--------------------------------------------------------------------------------
/resource/设计图/JPG/文章详情.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/resource/设计图/JPG/文章详情.jpg
--------------------------------------------------------------------------------
/resource/设计图/JPG/登录.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/resource/设计图/JPG/登录.jpg
--------------------------------------------------------------------------------
/resource/设计图/PSD/个人资料.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/resource/设计图/PSD/个人资料.psd
--------------------------------------------------------------------------------
/resource/设计图/PSD/主页.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/resource/设计图/PSD/主页.psd
--------------------------------------------------------------------------------
/resource/设计图/PSD/全部博客.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/resource/设计图/PSD/全部博客.psd
--------------------------------------------------------------------------------
/resource/设计图/PSD/分类.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/resource/设计图/PSD/分类.psd
--------------------------------------------------------------------------------
/resource/设计图/PSD/分类_.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/resource/设计图/PSD/分类_.psd
--------------------------------------------------------------------------------
/resource/设计图/PSD/发布博客.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/resource/设计图/PSD/发布博客.psd
--------------------------------------------------------------------------------
/resource/设计图/PSD/归档.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/resource/设计图/PSD/归档.psd
--------------------------------------------------------------------------------
/resource/设计图/PSD/文章详情.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/resource/设计图/PSD/文章详情.psd
--------------------------------------------------------------------------------
/resource/设计图/PSD/登录.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/resource/设计图/PSD/登录.psd
--------------------------------------------------------------------------------
/resource/设计图/压缩JPG/主页.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/resource/设计图/压缩JPG/主页.jpg
--------------------------------------------------------------------------------
/resource/设计图/压缩JPG/代码片段.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/resource/设计图/压缩JPG/代码片段.jpg
--------------------------------------------------------------------------------
/resource/设计图/压缩JPG/发布博客.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/resource/设计图/压缩JPG/发布博客.jpg
--------------------------------------------------------------------------------
/resource/设计图/压缩JPG/登录.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/resource/设计图/压缩JPG/登录.jpg
--------------------------------------------------------------------------------
/src/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
83 |
84 |
85 |
86 |
--------------------------------------------------------------------------------
/src/assets/font_icon/demo_fontclass.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | IconFont
7 |
8 |
9 |
10 |
11 |
12 |
IconFont 图标
13 |
76 |
77 |
font-class引用
78 |
79 |
80 |
font-class是unicode使用方式的一种变种,主要是解决unicode书写不直观,语意不明确的问题。
81 |
与unicode使用方式相比,具有如下特点:
82 |
83 | - 兼容性良好,支持ie8+,及所有现代浏览器。
84 | - 相比于unicode语意明确,书写更直观。可以很容易分辨这个icon是什么。
85 | - 因为使用class来定义图标,所以当要替换图标时,只需要修改class里面的unicode引用。
86 | - 不过因为本质上还是使用的字体,所以多色图标还是不支持的。
87 |
88 |
使用步骤如下:
89 |
第一步:引入项目下面生成的fontclass代码:
90 |
91 |
92 |
93 |
第二步:挑选相应图标并获取类名,应用于页面:
94 |
<i class="iconfont icon-xxx"></i>
95 |
96 | "iconfont"是你项目下的font-family。可以通过编辑项目查看,默认是"iconfont"。
97 |
98 |
99 |
100 |
101 |
--------------------------------------------------------------------------------
/src/assets/font_icon/demo_symbol.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | IconFont
7 |
8 |
9 |
10 |
24 |
25 |
26 |
27 |
IconFont 图标
28 |
111 |
112 |
113 |
symbol引用
114 |
115 |
116 |
这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章
117 | 这种用法其实是做了一个svg的集合,与另外两种相比具有如下特点:
118 |
119 | - 支持多色图标了,不再受单色限制。
120 | - 通过一些技巧,支持像字体那样,通过
font-size
,color
来调整样式。
121 | - 兼容性较差,支持 ie9+,及现代浏览器。
122 | - 浏览器渲染svg的性能一般,还不如png。
123 |
124 |
使用步骤如下:
125 |
第一步:引入项目下面生成的symbol代码:
126 |
127 |
第二步:加入通用css代码(引入一次就行):
128 |
<style type="text/css">
129 | .icon {
130 | width: 1em; height: 1em;
131 | vertical-align: -0.15em;
132 | fill: currentColor;
133 | overflow: hidden;
134 | }
135 | </style>
136 |
第三步:挑选相应图标并获取类名,应用于页面:
137 |
<svg class="icon" aria-hidden="true">
138 | <use xlink:href="#icon-xxx"></use>
139 | </svg>
140 |
141 |
142 |
143 |
144 |
--------------------------------------------------------------------------------
/src/assets/font_icon/demo_unicode.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | IconFont
7 |
8 |
9 |
29 |
30 |
31 |
32 |
IconFont 图标
33 |
34 |
35 | -
36 |
37 |
日期
38 | 
39 |
40 |
41 | -
42 |
43 |
头像
44 | 
45 |
46 |
47 | -
48 |
49 |
退出
50 | 
51 |
52 |
53 | -
54 |
55 |
emi纸飞机
56 | 
57 |
58 |
59 | -
60 |
61 |
主页
62 | 
63 |
64 |
65 | -
66 |
67 |
loading
68 | 
69 |
70 |
71 | -
72 |
73 |
编辑器 · 代码
74 | 
75 |
76 |
77 | -
78 |
79 |
搜索
80 | 
81 |
82 |
83 | -
84 |
85 |
无数据
86 | 
87 |
88 |
89 | -
90 |
91 |
fepawn
92 | 
93 |
94 |
95 |
96 |
unicode引用
97 |
98 |
99 |
unicode是字体在网页端最原始的应用方式,特点是:
100 |
101 | - 兼容性最好,支持ie6+,及所有现代浏览器。
102 | - 支持按字体的方式去动态调整图标大小,颜色等等。
103 | - 但是因为是字体,所以不支持多色。只能使用平台里单色的图标,就算项目里有多色图标也会自动去色。
104 |
105 |
106 | 注意:新版iconfont支持多色图标,这些多色图标在unicode模式下将不能使用,如果有需求建议使用symbol的引用方式
107 |
108 |
unicode使用步骤如下:
109 |
第一步:拷贝项目下面生成的font-face
110 |
@font-face {
111 | font-family: 'iconfont';
112 | src: url('iconfont.eot');
113 | src: url('iconfont.eot?#iefix') format('embedded-opentype'),
114 | url('iconfont.woff') format('woff'),
115 | url('iconfont.ttf') format('truetype'),
116 | url('iconfont.svg#iconfont') format('svg');
117 | }
118 |
119 |
第二步:定义使用iconfont的样式
120 |
.iconfont{
121 | font-family:"iconfont" !important;
122 | font-size:16px;font-style:normal;
123 | -webkit-font-smoothing: antialiased;
124 | -webkit-text-stroke-width: 0.2px;
125 | -moz-osx-font-smoothing: grayscale;
126 | }
127 |
128 |
第三步:挑选相应图标并获取字体编码,应用于页面
129 |
<i class="iconfont">3</i>
130 |
131 |
132 | "iconfont"是你项目下的font-family。可以通过编辑项目查看,默认是"iconfont"。
133 |
134 |
135 |
136 |
137 |
138 |
139 |
--------------------------------------------------------------------------------
/src/assets/font_icon/iconfont.css:
--------------------------------------------------------------------------------
1 |
2 | @font-face {font-family: "iconfont";
3 | src: url('iconfont.eot?t=1525323546749'); /* IE9*/
4 | src: url('iconfont.eot?t=1525323546749#iefix') format('embedded-opentype'), /* IE6-IE8 */
5 | url('data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAAvoAAsAAAAAEPwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAARAAAAFZXDkkjY21hcAAAAYAAAACwAAACPDV9NsJnbHlmAAACMAAABzoAAAmIubKC82hlYWQAAAlsAAAAMQAAADYTXrQRaGhlYQAACaAAAAAgAAAAJAn9BaZobXR4AAAJwAAAAB8AAAAwMrP//2xvY2EAAAngAAAAGgAAABoOCgvsbWF4cAAACfwAAAAfAAAAIAElASduYW1lAAAKHAAAAUUAAAJtPlT+fXBvc3QAAAtkAAAAhAAAAKXHnSOpeJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2BksWKcwMDKwMHUyXSGgYGhH0IzvmYwYuRgYGBiYGVmwAoC0lxTGBwYKp59Z27438AQw9zAsAAozAiSAwD5fAzGeJzFkkEOgkAMRf8AgygsXBjjDdh4CnZwGJaGg3gCV57sX4El/k4Jica1tnmT9HfSTjoFEAHk4ioKIDwRYPaQGpKe45D0AjfFJxylFJiYMbJhy44DR87LouzEsKn9pn5aUJUTzptf5KaWqLFHhp06xtSlklx+qfAjC/9r/W5NOu9rVItpRU/kiuYHZo7dYXQ0U7BxYPnW0ZzBzrE/Zu/YTnBwbDc4OrYfnB1UL25+NIB4nE0VbYhcV/Wee9/nvDcz+75nZ3c+3nv73st+ze58m2wya2qiMVhaEjFUaD5KbRKlSTE/qsGYlbq1xbYGUxHalGIQK0YwRgw0iVhFkYCQCIIoWhoStsSqIDX+MDtvPXdm1zr3vnPP1z1zz7nnnEtEQtZusWusQCyyidTJDvIwISBNQ5CjJfCTVo1Og+OLjmfnWBImvhwGNbYNvECy3UanFXuSLOUhB2Vo+o1OUqMJtFs9ugANtwQwOlbca0bjJjsDmUJSXk530/PgVMLxfG82/fjMot2oWsrTummOmuYLiiSKCqVCPgdPeq4qqhkp/a6YLzrXKpO0AvpoUvzEI9nqmHnoudaxUuSpAEtLYI1Vc28sGkUD55eKrmWOyiNZpVDMhhM2PH1HK1h6Kb5N8KehrwfZz+k7hBEZqTz67JGQzJGPkI+RXYREYXsBQqfZxU9cX/ln2VIQJ+0e+uRErTiQZKcMjU47cnLABf76Ghq+wXwE8JWlpV8MZvrlDWzODVwABP2/eT7HfI/ugPruOqSvDJYD7NSn+vP05m+ewd9WDp6huw3PMz5juq4JhusaT3ByeipqNqOpybjZjCdXb7NSfyv8IzUJEQb+nUT/IrJAjpCjeJNuBRxXlgYjBzVI4uHotrtxp9tpeGWQ68yTvUW8QdlHXgW6CRfULSlIYinE203iPLieW6EIvDLFfd3OIu2hYhzKaK1Ofy8ICmgZO+sW5/X5bk2bcW3d0TTIKbnyjj/snBzJ/ZCOuPuW25vl/ihMffiLT7kj4BTtxyePzltzblZihiiKIEt6humWUZXj+Uk1tJwszWhZEETRYKIOdygTM1PjRa2RzFqCAKLozkQ1rTg+nVH37PMbteTQzvRKcfSFa0L7ykMfvdyDK18fLQLAMXVUscYqBgVKx80RxjLzEwEuQFkuiJoZJvjjFGCkVMA8YYOaeJZViUQc4mIU2z4OT3Z8J8LbDdu+ZzTbHv1r2gf26o10Nb1OF1rpoRs3W1A4evjwq4dvnjtHz6f9G0fS2jnguUfR5pJwli0hphAidpNIVEG04N8vvZRm4GX4Z3oaLr699MvJt0/C99LNy2zfYM9bAmGPEZHkCFFpWwXZ8AcDBJLioDiW1ggfsAQNeDE9cZ6Dl9MlGPKqhP/f2rfYX9hhxAxSxIyfIW3Sw5wnwBO31Wm4LAfDeo6GtC1FNRjWuOXy9EcmrJd8YEnrShCvtwH6eejs6eA8MDE3t2tuDj47GgTNIOhPrfM/Pb7lwS1bHoQ/OdObZ2Y2L+aT8fGk1L9V5twtTJrkSp1+HvjuXXNrQcv3W8HWIRu+NlTrv+7yzTNwPV/i+9OJ0sDq8M6wACT6M2JjH/sQeoa5KzPJ9qwyLEIP5qDbiUVWA96sKphoWBlup2t11hU3yBi2z2quekeSVhRPm80w9c2rkkB/tEFdvSpTlWus6OmRBd1l32RZfX2lZyIUprcUR01vq4IaKYXMykrGuwelD6iCwpWg4sJkjunZ/u90m+XQBp3LWsM8Oc1WMU+qeEtETGrQ7UEbCzcHchm8BpYeHhW77aAKY/Ssi2wU1oC9d18GaSIR371w8a4o3r24/URDseT7qq3m8hlBElefZJee/+plQbj03POX/PuypTS/8MCFd0Xh7kXcEPkSRWUBZFEzYmoPFZcvM+USIfm1tbXTUgXP5ZBZsp8sk2+Tn5C3yG/JH8kKeZ+sgQIGFAnpNl1bDh1JDuJtEMatbrONzSRqt+IQ22YYSI7rNR230W03O60EfJ5JCxC3jR4sALZYfEVcz7DlJs9BfHqkDczFFhYk3SZGwKhB6KMlw3abPo9QImFL62CgeDvzOq7XbWLQjFac+BgZh5uMNgzyZMaTDf+3zdPYYRwdioM4wmPFgYyZ4zZQ0G2WYShwWh1+OFuS/QHxgSQKatDCo3Nh0oM45FWB9TMspKTRGXJec1TVAbwIJ5NxwALxMUnIgCNIoHISuav/6r+v6rq6X4P5sAf1AO6F86Cd4Lz/QEZTNV05JjNND7LFB0wPHxEjlQ2vYMI2TZGYPX9sUyRsmj5em9YDW3OUP/fMQsFMNa76YlCHfqUiq6pcUbPq/5B7unqK20dAz5bL/t5qpVLde1VXVjh3RdE1FR5SNU1Nf6zounKWo2cVPT1hlAycxYmJomGaRs4wxNJYGLaRNg3DRPpX3CkVJGHdu8WhqxI2vvUIpG/opm55dH9Qd4J6Peif9yzd0B2Epq6Pa7r+aMGkB/ir1/+OWdAUR7MDfbp2fGpSiDYdn7eoqATgmXQ/99AznXrwzv/7NkBWH0dH0NyZ6ier5TKCCsVAAmjIO8hFGmQPbjCeNUp+eWSiHZahUjHHjEch7IQ4K0gV8Y3FZr72DfZ39hR/FyLwuwmfstc0EPgcRAn7afp9eHhxZ3r5wufSR7LZ6+kT2Sy8kh7JZtmbQg5O7d3z65OWnf7AtvrvWTZsJ+S/eD23qQAAeJxjYGRgYADipRkLuOP5bb4ycLMwgMB1gR1SMPr///8JbPLMDUAuBwMTSBQAJvsK6gAAAHicY2BkYGBu+N/AEMMm/////19s8gxAERTAAwCl/waueJxjYWBgYH7JwMDCgIQno/ElGBjY5P//B7EBSG4D4wAAAAAAAHYA5gGKAbQBzgHyAmQCyAMUBJgExAAAeJxjYGRgYOBhlGbgZwABJiDmAkIGhv9gPgMADaQBTgB4nGWPTU7DMBCFX/oHpBKqqGCH5AViASj9EatuWFRq911036ZOmyqJI8et1ANwHo7ACTgC3IA78EgnmzaWx9+8eWNPANzgBx6O3y33kT1cMjtyDRe4F65TfxBukF+Em2jjVbhF/U3YxzOmwm10YXmD17hi9oR3YQ8dfAjXcI1P4Tr1L+EG+Vu4iTv8CrfQ8erCPuZeV7iNRy/2x1YvnF6p5UHFockikzm/gple75KFrdLqnGtbxCZTg6BfSVOdaVvdU+zXQ+ciFVmTqgmrOkmMyq3Z6tAFG+fyUa8XiR6EJuVYY/62xgKOcQWFJQ6MMUIYZIjK6Og7VWb0r7FDwl57Vj3N53RbFNT/c4UBAvTPXFO6stJ5Ok+BPV8bUnV0K27LnpQ0kV7NSRKyQl7WtlRC6gE2ZVeOEXpc0Yk/KGdI/wAJWm7IAAAAeJxtwUEOgjAQBdB+BIqAiSvuQUIaPQ1p7FCGQGtsG9DTu3DreyITP7X4r0WGE3IUKCFR4YwaDVpcBI7c6EhV9Olg7WxhOQ6qoY0/M0/EC3ez36jvh/tNKdLhzQ/vHEW5em3Y2Su7QK84Rm3HiWk1ZfApJC/3FOa0pHKip96dEF/15CYV') format('woff'),
6 | url('iconfont.ttf?t=1525323546749') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
7 | url('iconfont.svg?t=1525323546749#iconfont') format('svg'); /* iOS 4.1- */
8 | }
9 |
10 | .iconfont {
11 | font-family:"iconfont" !important;
12 | font-size:16px;
13 | font-style:normal;
14 | -webkit-font-smoothing: antialiased;
15 | -moz-osx-font-smoothing: grayscale;
16 | }
17 |
18 | .icon-date:before { content: "\e60c"; }
19 |
20 | .icon-touxiang:before { content: "\e64a"; }
21 |
22 | .icon-git46:before { content: "\e66e"; }
23 |
24 | .icon-emizhifeiji:before { content: "\e649"; }
25 |
26 | .icon-home1149866easyiconnet:before { content: "\e601"; }
27 |
28 | .icon-loading:before { content: "\e627"; }
29 |
30 | .icon-insert_tag_field:before { content: "\e6f7"; }
31 |
32 | .icon-sousuo:before { content: "\e605"; }
33 |
34 | .icon-wushuju:before { content: "\e642"; }
35 |
36 | .icon-fepawn:before { content: "\e602"; }
37 |
38 |
--------------------------------------------------------------------------------
/src/assets/font_icon/iconfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/src/assets/font_icon/iconfont.eot
--------------------------------------------------------------------------------
/src/assets/font_icon/iconfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/src/assets/font_icon/iconfont.ttf
--------------------------------------------------------------------------------
/src/assets/font_icon/iconfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/src/assets/font_icon/iconfont.woff
--------------------------------------------------------------------------------
/src/assets/img/defaultIcon.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/src/assets/img/defaultIcon.gif
--------------------------------------------------------------------------------
/src/assets/script/common.js:
--------------------------------------------------------------------------------
1 | // 点击水波纹效果
2 | function ripple(rippleWrap, callback) {
3 | var rippleWrapEle = document.querySelector('#' + rippleWrap)
4 | var rippleDiv = rippleWrapEle.querySelectorAll('.rippleWrap');
5 | for (var i = 0; i < rippleDiv.length; i++) {
6 | rippleDiv[i].addEventListener('click', creatRipple);
7 | }
8 | // 获取位置,创建水波标签
9 | function creatRipple(e, callback) {
10 | var offsetL = this.getBoundingClientRect().left;
11 | var offsetT = this.getBoundingClientRect().top;
12 | var x = e.clientX;
13 | var y = e.clientY;
14 | var ripple = document.createElement('span');
15 | ripple.className = 'rippleSpan';
16 | var rippleW = ripple.offsetWidth;
17 | var rippleH = ripple.offsetHeight;
18 | ripple.style.position = 'absolute';
19 | ripple.style.left = x - offsetL - rippleW / 2 + 'px';
20 | ripple.style.top = y - offsetT - rippleH / 2 + 'px';
21 | this.removeChild(this.childNodes[0]);
22 | this.appendChild(ripple);
23 | callback && callback();
24 | }
25 | };
26 | /*//获取到页面顶部的距离,固定定位一样可以获取到
27 | function getAbsPoint(e) {
28 | var x = e.offsetLeft;
29 | var y = e.offsetTop;
30 | while (e = e.offsetParent) {
31 | x += e.offsetLeft;
32 | y += e.offsetTop;
33 | }
34 | return {
35 | "x": x,
36 | "y": y
37 | };
38 | }
39 | // 获取卷起高度
40 | function getScroll() {
41 | return {
42 | top: window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0,
43 | left: window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0
44 | };
45 | }
46 | // 判断是否有固定定位
47 | function isFixed(e) {
48 | while (e = e.offsetParent) {
49 | if (getStyle(e, 'position')=== 'fixed') {
50 | return true;
51 | }
52 | }
53 | }
54 | // 获取计算后的属性,包括css中属性
55 | function getStyle(obj, attr) {
56 | if (obj.currentStyle) {
57 | return obj.currentStyle[attr];
58 | } else {
59 | return getComputedStyle(obj, false)[attr];
60 | }
61 | }*/
62 |
63 |
64 |
65 | // 列表渐变效果
66 | function ListfadeOut() {
67 | var Ul = document.querySelector('.fadeOutList');
68 | var aLi = Ul.querySelectorAll('li');
69 | for (var i = 0; i < aLi.length; i++) {
70 | var oP = aLi[i].querySelectorAll('p')[0];
71 | oP.iAlpha = 0;
72 | oP.time = null;
73 | aLi[i].onmouseover = function () {
74 | var oP = this.querySelectorAll('p')[0];
75 | oP.time ? clearInterval(oP.time) : "";
76 | oP.style.opacity = 1;
77 | oP.style.filter = "alpha(opacity=100)";
78 | oP.iAlpha = 100;
79 | oP.parentNode.style.color = '#fff';
80 | }
81 | aLi[i].onmouseout = function () {
82 | var oP = this.querySelectorAll('p')[0];
83 | starmove(oP);
84 | oP.parentNode.style.color = '#383838';
85 | };
86 | }
87 |
88 | function starmove(obj) {
89 | obj.time ? clearInterval(obj.time) : "";
90 | obj.time = setInterval(function () {
91 | domove(obj);
92 | }, 14);
93 | }
94 |
95 | function domove(obj) {
96 | var iSpeed = 3;
97 | if (obj.iAlpha <= iSpeed) {
98 | clearInterval(obj.time);
99 | obj.iAlpha = 0;
100 | obj.time = null;
101 | } else {
102 | obj.iAlpha -= iSpeed;
103 | }
104 | obj.style.opacity = obj.iAlpha / 100;
105 | obj.style.filter = "alpha(opacity=" + obj.iAlpha + ")";
106 | }
107 | };
108 |
109 |
110 | export { ripple, ListfadeOut };
111 |
--------------------------------------------------------------------------------
/src/assets/script/html5shiv.min.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
3 | */
4 | !function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document);
--------------------------------------------------------------------------------
/src/assets/style/common.less:
--------------------------------------------------------------------------------
1 | /* 水波纹 */
2 | /* .rippleMixin(20px, 50px, rgba(0, 0, 0, .2), 200, person); */
3 |
4 | .rippleMixin(@paddingLeft, @height, @rgba, @scale, @ripple) {
5 | .ripple {
6 | cursor: pointer;
7 | display: inline-block;
8 | position: relative;
9 | padding: 0 @paddingLeft;
10 | height: @height;
11 | }
12 | .rippleWrap {
13 | position: absolute;
14 | top: 0;
15 | left: 0;
16 | width: 100%;
17 | height: 100%;
18 | overflow: hidden;
19 | }
20 | @keyframes ripple {
21 | to {
22 | transform: scale(@scale*2/20);
23 | opacity: 0;
24 | }
25 | }
26 | .rippleSpan {
27 | width: 10px;
28 | height: 10px;
29 | position: absolute;
30 | background: @rgba;
31 | border-radius: 100%;
32 | transform: scale(0);
33 | pointer-events: none;
34 | animation: ripple .4s ease-out;
35 | }
36 | }
37 |
38 | .clearfixMixin() {
39 | &:before,
40 | &:after {
41 | content: "";
42 | display: table;
43 | }
44 | &:after {
45 | clear: both;
46 | }
47 | & {
48 | *zoom: 1;
49 | }
50 | }
51 |
52 | // 多行
53 | .txt-cut(@clamp) {
54 | overflow: hidden;
55 | text-overflow: ellipsis;
56 | display: -webkit-box;
57 | -webkit-line-clamp: @clamp;
58 | -webkit-box-orient: vertical;
59 | }
60 |
61 | // 扫光
62 | .sliderlight() {
63 | position: relative;
64 | overflow: hidden;
65 | &:before {
66 | content: '';
67 | position: absolute;
68 | width: 20px;
69 | height: 50px;
70 | background-color: #fff;
71 | background: linear-gradient(to right, rgba(255, 255, 255, 0), rgba(255, 255, 255, .7), rgba(255, 255, 255, 0));
72 | transform: skew(-40deg) translate(-70px, -20px);
73 | }
74 | &:hover::before {
75 | transition: all .8s;
76 | transform: skew(-40deg) translate(70px, -20px);
77 | }
78 | }
79 |
80 | // placeholder
81 | .placeholder(@color) {
82 | :-moz-placeholder {
83 | /* Mozilla Firefox 4 to 18 */
84 | color: @color;
85 | opacity: .5;
86 | }
87 | ::-moz-placeholder {
88 | /* Mozilla Firefox 19+ */
89 | color: @color;
90 | opacity: .5;
91 | }
92 | input:-ms-input-placeholder,
93 | textarea:-ms-input-placeholder {
94 | color: @color;
95 | opacity: .5;
96 | }
97 | input::-webkit-input-placeholder,
98 | textarea::-webkit-input-placeholder {
99 | color: @color;
100 | opacity: .5;
101 | }
102 | }
103 |
104 | //.TooltipMixin(70px,-45px,0, 6px, 6px, 7px);
105 | // 父盒子需要定位
106 | .TooltipMixin(@width,@bottom,@t,@l,@b,@r){
107 | .Tooltip {
108 | &:before {
109 | content: '';
110 | position: absolute;
111 | left: 50%;
112 | transform: translateX(-50%);
113 | top: -7px;
114 | width: 0;
115 | height: 0;
116 | border-top: @t solid transparent;
117 | border-left: @l solid transparent;
118 | border-right: @b solid transparent;
119 | border-bottom: @r solid #1F2D3D;
120 | }
121 | padding: 5px 8px;
122 | position: absolute;
123 | bottom: @bottom;
124 | left: 50%;
125 | transform: translateX(-50%);
126 | width: @width;
127 | line-height: 24px;
128 | text-align: center;
129 | background-color: #1F2D3D;
130 | color: #fff;
131 | border-radius: 4px;
132 |
133 | }
134 | }
135 |
--------------------------------------------------------------------------------
/src/assets/style/markdown.less:
--------------------------------------------------------------------------------
1 | .margin-tb-zero,
2 | .markdown-content ol ol,
3 | .markdown-content ul ol,
4 | .markdown-content ol ul,
5 | .markdown-content ul ul,
6 | .markdown-content ol ul ol,
7 | .markdown-content ul ul ol,
8 | .markdown-content ol ul ul,
9 | .markdown-content ul ul ul {
10 | margin: 0.7em 0;
11 | }
12 | .markdown-content li{
13 | list-style: initial;
14 | line-height: 1.8em;
15 | }
16 | .markdown-content li p{
17 | margin: 0;
18 | }
19 | .markdown-content {
20 | font-family: "Open Sans","Clear Sans","Helvetica Neue",Helvetica,Arial,sans-serif;
21 | font-size: 16px;
22 | color: rgb(51, 51, 51);
23 | line-height: 1.6;
24 | word-wrap: break-word;
25 | padding: 15px 0;
26 | background: #fff;
27 | -webkit-border-radius: 0 0 3px 3px;
28 | border-radius: 0 0 3px 3px;
29 | }
30 | .markdown-content > *:first-child {
31 | margin-top: 0 !important;
32 | }
33 | .markdown-content > *:last-child {
34 | margin-bottom: 0 !important;
35 | }
36 | .markdown-content * {
37 | -webkit-box-sizing: border-box;
38 | -moz-box-sizing: border-box;
39 | box-sizing: border-box;
40 | }
41 | .markdown-content h1,
42 | .markdown-content h2,
43 | .markdown-content h3,
44 | .markdown-content h4,
45 | .markdown-content h5,
46 | .markdown-content h6 {
47 | position: relative;
48 | margin-top: 1rem;
49 | margin-bottom: .8rem;
50 | font-weight: bold;
51 | line-height: 1.4;
52 | cursor: text;
53 | }
54 |
55 | .markdown-content p,
56 | .markdown-content blockquote,
57 | .markdown-content ul,
58 | .markdown-content ol,
59 | .markdown-content dl,
60 | .markdown-content table,
61 | .markdown-content pre {
62 | margin: 0.6em 0;
63 | }
64 | .markdown-content h1 {
65 | margin: 2.2em 0 1em 0;
66 | padding-bottom: 0.3em;
67 | font-size: 2.25em;
68 | line-height: 1.2;
69 | border-bottom: 1px solid #eee;
70 | }
71 | .markdown-content h2 {
72 | margin: 2em 0 0.8em 0;
73 | padding-bottom: 0.3em;
74 | font-size: 1.75em;
75 | line-height: 1.225;
76 | border-bottom: 1px solid #eee;
77 | }
78 | .markdown-content h3 {
79 | margin: 1.8em 0 0.5em 0;
80 | font-size: 1.5em;
81 | line-height: 1.43;
82 | }
83 | .markdown-content h4 {
84 | margin: 0.6em 0 0.3em 0;
85 | font-size: 1.25em;
86 | }
87 | .markdown-content h5 {
88 | font-size: 1em;
89 | }
90 | .markdown-content h6 {
91 | font-size: 1em;
92 | color: #777;
93 | }
94 | .markdown-content ol,
95 | .markdown-content ul {
96 | padding-left: 2em;
97 | }
98 | .markdown-content ol ol,
99 | .markdown-content ul ol {
100 | list-style-type: lower-roman;
101 | }
102 | .markdown-content ol ul,
103 | .markdown-content ul ul {
104 | list-style-type: circle;
105 | }
106 | .markdown-content ol ul ul,
107 | .markdown-content ul ul ul {
108 | list-style-type: square;
109 | }
110 | .markdown-content ol {
111 | list-style-type: decimal;
112 | }
113 | .markdown-content ul {
114 | list-style-type: disc;
115 | }
116 | .markdown-content blockquote {
117 | margin-left: 0;
118 | margin-right: 0;
119 | padding: 0 15px;
120 | color: #777;
121 | border-left: 4px solid #ddd;
122 | }
123 | .markdown-content table {
124 | display: block;
125 | width: 100%;
126 | overflow: auto;
127 | word-break: normal;
128 | word-break: keep-all;
129 | border-collapse: collapse;
130 | border-spacing: 0;
131 | }
132 | .markdown-content table tr {
133 | background-color: #fff;
134 | border-top: 1px solid #ccc;
135 | }
136 | .markdown-content table tr:nth-child(2n) {
137 | background-color: #f8f8f8;
138 | }
139 | .markdown-content table th,
140 | .markdown-content table td {
141 | padding: 6px 13px;
142 | border: 1px solid #ddd;
143 | }
144 | .markdown-content pre {
145 | word-wrap: normal;
146 | padding: 16px;
147 | overflow: auto;
148 | font-size: 85%;
149 | line-height: 1.45;
150 | background-color: #f8f8f8;
151 | -webkit-border-radius: 3px;
152 | border: 1px solid #ddd;
153 | border-radius: 3px;
154 | margin: 1.2em 0 1.8em;
155 | }
156 | .markdown-content pre code {
157 | display: inline;
158 | max-width: initial;
159 | padding: 0;
160 | margin: 0;
161 | overflow: initial;
162 | font-size: 100%;
163 | line-height: inherit;
164 | word-wrap: normal;
165 | white-space: pre;
166 | border: 0;
167 | -webkit-border-radius: 3px;
168 | border-radius: 3px;
169 | color: #333;
170 | background-color: transparent;
171 | }
172 | .markdown-content pre code:before,
173 | .markdown-content pre code:after {
174 | content: normal;
175 | }
176 | .markdown-content code {
177 | font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
178 | padding: 0;
179 | padding-top: 0.2em;
180 | padding-bottom: 0.2em;
181 | margin: 0 3px;
182 | font-size: 85%;
183 | color: #c7254e;
184 | background-color: #f9f2f4;
185 | -webkit-border-radius: 3px;
186 | border-radius: 3px;
187 | }
188 | .markdown-content code:before,
189 | .markdown-content code:after {
190 | letter-spacing: -0.2em;
191 | content: "\00a0";
192 | }
193 | .markdown-content a {
194 | color: #4078c0;
195 | text-decoration: none;
196 | background: transparent;
197 | }
198 | .markdown-content img {
199 | display: block;
200 | max-width: 100%;
201 | max-height: 100%;
202 | margin: 1.4em auto;
203 | }
204 | .markdown-content strong {
205 | font-weight: bold;
206 | }
207 | .markdown-content em {
208 | font-style: italic;
209 | }
210 | .markdown-content del {
211 | text-decoration: line-through;
212 | }
--------------------------------------------------------------------------------
/src/assets/style/reset.css:
--------------------------------------------------------------------------------
1 | /**
2 | * Eric Meyer's Reset CSS v2.0 (http://meyerweb.com/eric/tools/css/reset/)
3 | * http://cssreset.com
4 | */
5 | html, body, div, span, applet, object, iframe,
6 | h1, h2, h3, h4, h5, h6, p, blockquote, pre,
7 | a, abbr, acronym, address, big, cite, code,
8 | del, dfn, em, img, ins, kbd, q, s, samp,
9 | small, strike, strong, sub, sup, tt, var,
10 | b, u, i, center,
11 | dl, dt, dd, ol, ul, li,
12 | fieldset, form, label, legend,
13 | table, caption, tbody, tfoot, thead, tr, th, td,
14 | article, aside, canvas, details, embed,
15 | figure, figcaption, footer, header,
16 | menu, nav, output, ruby, section, summary,
17 | time, mark, audio, video, input {
18 | margin: 0;
19 | padding: 0;
20 | border: 0;
21 | font-size: 100%;
22 | font-weight: normal;
23 | vertical-align: baseline;
24 | }
25 |
26 | /* HTML5 display-role reset for older browsers */
27 | article, aside, details, figcaption, figure,
28 | footer, header, menu, nav, section {
29 | display: block;
30 | }
31 |
32 | body {
33 | line-height: 1;
34 | }
35 |
36 | blockquote, q {
37 | quotes: none;
38 | }
39 |
40 | blockquote:before, blockquote:after,
41 | q:before, q:after {
42 | content: none;
43 | }
44 |
45 | table {
46 | border-collapse: collapse;
47 | border-spacing: 0;
48 | }
49 |
50 | /* custom */
51 | a {
52 | color: #7e8c8d;
53 | text-decoration: none;
54 | -webkit-backface-visibility: hidden;
55 | }
56 |
57 | li {
58 | list-style: none;
59 | }
60 |
61 | /* ::-webkit-scrollbar {
62 | width: 5px;
63 | height: 5px;
64 | }
65 |
66 | ::-webkit-scrollbar-track-piece {
67 | background-color: rgba(0, 0, 0, 0.2);
68 | -webkit-border-radius: 6px;
69 | }
70 |
71 | ::-webkit-scrollbar-thumb:vertical {
72 | height: 5px;
73 | background-color: rgba(125, 125, 125, 0.7);
74 | -webkit-border-radius: 6px;
75 | }
76 |
77 | ::-webkit-scrollbar-thumb:horizontal {
78 | width: 5px;
79 | background-color: rgba(125, 125, 125, 0.7);
80 | -webkit-border-radius: 6px;
81 | }
82 | */
83 |
84 |
85 |
86 |
87 | html, body {
88 | width: 100%;
89 | font-family: 'Microsoft YaHei', Tahoma, Arial, sans-serif;
90 | -webkit-overflow-scrolling : touch;
91 | }
92 |
93 | body {
94 | -webkit-text-size-adjust: none;
95 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
96 | }
97 |
98 | input,button, select{
99 | border:0;
100 | outline:none;
101 | font-family: 'Microsoft YaHei', Tahoma, Arial, sans-serif;
102 | appearance:none;
103 | -moz-appearance:none;
104 | -webkit-appearance:none;
105 | }
106 | i{
107 | font-style: normal
108 | }
109 |
--------------------------------------------------------------------------------
/src/assets/view/ripple.html:
--------------------------------------------------------------------------------
1 |
2 |
8 |
--------------------------------------------------------------------------------
/src/components/BAM/allBlog/allBlog.vue:
--------------------------------------------------------------------------------
1 |
2 |
11 |
12 |
13 |
71 |
72 |
102 |
--------------------------------------------------------------------------------
/src/components/BAM/draft/draft.vue:
--------------------------------------------------------------------------------
1 |
2 |
11 |
12 |
13 |
70 |
71 |
101 |
--------------------------------------------------------------------------------
/src/components/BAM/layout/layout.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
65 |
66 |
76 |
77 |
78 |
79 |
--------------------------------------------------------------------------------
/src/components/BAM/self/default.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/src/components/BAM/self/default.png
--------------------------------------------------------------------------------
/src/components/BAM/side/side.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
10 |
11 | -
12 | 我的主页
13 |
14 | -
15 | 代码片段
16 |
17 | -
18 | 全部博客
19 |
20 | -
21 | 发布博客
22 |
23 | -
24 | 草稿箱
25 |
26 | -
27 | 个人资料
28 |
29 |
30 |
31 |
32 |
33 |
75 |
76 |
167 |
168 |
--------------------------------------------------------------------------------
/src/components/article/content/content.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
![]()
8 |
9 |
10 |
11 | 作者{{userInfoCopy.showName}}
12 |
最后修改:{{articleContent.date}}
13 |
14 |
15 |
16 |
{{articleContent.mainTitle}}
17 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
84 |
85 |
173 |
174 |
175 |
258 |
--------------------------------------------------------------------------------
/src/components/article/layout/layout.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
69 |
70 |
79 |
80 |
81 |
82 |
--------------------------------------------------------------------------------
/src/components/common/Message/Message.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
i
6 |
{{sendMessage}}
7 |
8 |
9 |
10 |
11 |
12 |
30 |
31 |
--------------------------------------------------------------------------------
/src/components/common/alert/alert.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
{{info}}
5 |
6 | 确定
7 | 取消
8 |
9 |
10 |
11 |
12 |
13 |
37 |
38 |
81 |
--------------------------------------------------------------------------------
/src/components/common/blogTags/blogTags.vue:
--------------------------------------------------------------------------------
1 |
2 |
15 |
16 |
17 |
40 |
41 |
--------------------------------------------------------------------------------
/src/components/common/catalogue/catalogue.vue:
--------------------------------------------------------------------------------
1 |
2 |
31 |
32 |
33 |
89 |
90 |
196 |
--------------------------------------------------------------------------------
/src/components/common/dialog/dialog.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
{{titleInfo}}
6 |
{{DialogInfo}}
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
53 |
54 |
--------------------------------------------------------------------------------
/src/components/common/error/error.vue:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 |
14 |
15 |
47 |
--------------------------------------------------------------------------------
/src/components/common/header/noavatar_small.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/src/components/common/header/noavatar_small.gif
--------------------------------------------------------------------------------
/src/components/common/loading/loading.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Loading...
5 |
6 |
7 |
8 |
9 |
14 |
15 |
58 |
--------------------------------------------------------------------------------
/src/components/common/sidebar/sidebar.vue:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
42 |
43 |
--------------------------------------------------------------------------------
/src/components/login/layout/Layer_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/src/components/login/layout/Layer_1.png
--------------------------------------------------------------------------------
/src/components/login/layout/Layer_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/src/components/login/layout/Layer_2.png
--------------------------------------------------------------------------------
/src/components/time/layout/layout.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
141 |
142 |
172 |
--------------------------------------------------------------------------------
/src/components/time/timeList/timeList.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
{{index.substring(4)}}
5 |
14 |
15 |
16 |
17 |
18 |
38 |
39 |
--------------------------------------------------------------------------------
/src/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import VuerResource from 'vue-resource'
3 | import App from './App'
4 | import router from './router'
5 | import { currentUser } from './bmob'
6 |
7 | import '@/assets/style/reset.css'
8 | import '@/assets/style/markdown.less'
9 | import '@/assets/font_icon/iconfont.css'
10 |
11 | Vue.use(VuerResource);
12 |
13 | Vue.http.options.emulateJSON = true; /*vue-resource的坑,post请求头不对*/
14 | Vue.config.productionTip = false;
15 |
16 |
17 | /* eslint-disable no-new */
18 | var vm = new Vue({
19 | el: '#app',
20 | router,
21 | template: '',
22 | components: { App },
23 | })
24 |
25 | router.beforeEach((to, from, next) => {
26 | // 要去的路由需要登录
27 | if (to.meta.requireAuth) {
28 | // 获取cookie,判断是否要重新发送请求
29 | currentUser().then((result) => {
30 | next()
31 | return;
32 | }, (res) => {
33 | if (res.code === '001') {
34 | next({
35 | path: '/login',
36 | query: { redirect: to.fullPath }
37 | })
38 | }
39 | })
40 | } else {
41 | next();
42 | }
43 | })
44 |
--------------------------------------------------------------------------------
/src/router/index.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import Router from 'vue-router'
3 | import Blog from '@/components/blog/layout/layout'
4 | import Time from '@/components/time/layout/layout'
5 | import Code from '@/components/code/layout/layout'
6 | import BAM from '@/components/BAM/layout/layout'
7 | import Login from '@/components/login/layout/layout'
8 | import Article from '@/components/article/layout/layout'
9 |
10 | import BAllBlog from '@/components/BAM/allBlog/allBlog'
11 | import BWriteBlog from '@/components/BAM/writeBlog/writeBlog'
12 | import BDraft from '@/components/BAM/draft/draft'
13 | import BSelf from '@/components/BAM/self/self'
14 |
15 | Vue.use(Router)
16 |
17 | export default new Router({
18 | routes: [
19 | { path: '/', redirect: '/blog' },
20 | { path: '/blog', component: Blog, },
21 | { path: '/time', component: Time },
22 | { path: '/code', component: Code },
23 | { path: '/article', component: Article },
24 | {
25 | path: '/BAM',
26 | component: BAM,
27 | redirect: '/BAM/BAllBlog',
28 | meta: { requireAuth: true },
29 | children: [
30 | { path: 'BAllBlog', name: 'BAllBlog', component: BAllBlog, meta: { requireAuth: true } },
31 | { path: 'BWriteBlog', name: 'BWriteBlog', component: BWriteBlog, meta: { requireAuth: true } },
32 | { path: 'BDraft', name: 'BDraft', component: BDraft, meta: { requireAuth: true } },
33 | { path: 'BSelf', component: BSelf, meta: { requireAuth: true } },
34 | ]
35 | },
36 | { path: '/login', name: 'login', component: Login }
37 | ]
38 | })
39 |
--------------------------------------------------------------------------------
/src_node/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
56 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/src_node/assets/font_icon/demo_fontclass.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | IconFont
7 |
8 |
9 |
10 |
11 |
12 |
IconFont 图标
13 |
14 |
15 | -
16 |
17 |
退出
18 | .icon-tuichu
19 |
20 |
21 | -
22 |
23 |
github
24 | .icon-github
25 |
26 |
27 | -
28 |
29 |
头像
30 | .icon-touxiang
31 |
32 |
33 | -
34 |
35 |
主页
36 | .icon-zhuye
37 |
38 |
39 | -
40 |
41 |
标签
42 | .icon-biaoqian
43 |
44 |
45 | -
46 |
47 |
日期
48 | .icon-riqi
49 |
50 |
51 | -
52 |
53 |
搜索_搜索
54 | .icon-sousuo_sousuo
55 |
56 |
57 |
58 |
59 |
font-class引用
60 |
61 |
62 |
font-class是unicode使用方式的一种变种,主要是解决unicode书写不直观,语意不明确的问题。
63 |
与unicode使用方式相比,具有如下特点:
64 |
65 | - 兼容性良好,支持ie8+,及所有现代浏览器。
66 | - 相比于unicode语意明确,书写更直观。可以很容易分辨这个icon是什么。
67 | - 因为使用class来定义图标,所以当要替换图标时,只需要修改class里面的unicode引用。
68 | - 不过因为本质上还是使用的字体,所以多色图标还是不支持的。
69 |
70 |
使用步骤如下:
71 |
第一步:引入项目下面生成的fontclass代码:
72 |
73 |
74 |
75 |
第二步:挑选相应图标并获取类名,应用于页面:
76 |
<i class="iconfont icon-xxx"></i>
77 |
78 | "iconfont"是你项目下的font-family。可以通过编辑项目查看,默认是"iconfont"。
79 |
80 |
81 |
82 |
83 |
--------------------------------------------------------------------------------
/src_node/assets/font_icon/demo_symbol.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | IconFont
7 |
8 |
9 |
10 |
24 |
25 |
26 |
27 |
IconFont 图标
28 |
29 |
30 | -
31 |
34 |
退出
35 | #icon-tuichu
36 |
37 |
38 | -
39 |
42 |
github
43 | #icon-github
44 |
45 |
46 | -
47 |
50 |
头像
51 | #icon-touxiang
52 |
53 |
54 | -
55 |
58 |
主页
59 | #icon-zhuye
60 |
61 |
62 | -
63 |
66 |
标签
67 | #icon-biaoqian
68 |
69 |
70 | -
71 |
74 |
日期
75 | #icon-riqi
76 |
77 |
78 | -
79 |
82 |
搜索_搜索
83 | #icon-sousuo_sousuo
84 |
85 |
86 |
87 |
88 |
89 |
symbol引用
90 |
91 |
92 |
这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章
93 | 这种用法其实是做了一个svg的集合,与另外两种相比具有如下特点:
94 |
95 | - 支持多色图标了,不再受单色限制。
96 | - 通过一些技巧,支持像字体那样,通过
font-size
,color
来调整样式。
97 | - 兼容性较差,支持 ie9+,及现代浏览器。
98 | - 浏览器渲染svg的性能一般,还不如png。
99 |
100 |
使用步骤如下:
101 |
第一步:引入项目下面生成的symbol代码:
102 |
103 |
第二步:加入通用css代码(引入一次就行):
104 |
<style type="text/css">
105 | .icon {
106 | width: 1em; height: 1em;
107 | vertical-align: -0.15em;
108 | fill: currentColor;
109 | overflow: hidden;
110 | }
111 | </style>
112 |
第三步:挑选相应图标并获取类名,应用于页面:
113 |
<svg class="icon" aria-hidden="true">
114 | <use xlink:href="#icon-xxx"></use>
115 | </svg>
116 |
117 |
118 |
119 |
120 |
--------------------------------------------------------------------------------
/src_node/assets/font_icon/demo_unicode.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | IconFont
7 |
8 |
9 |
29 |
30 |
31 |
32 |
IconFont 图标
33 |
34 |
35 | -
36 | 㐻
37 |
退出
38 | 㐻
39 |
40 |
41 | -
42 |
43 |
github
44 | 
45 |
46 |
47 | -
48 |
49 |
头像
50 | 
51 |
52 |
53 | -
54 |
55 |
主页
56 | 
57 |
58 |
59 | -
60 |
61 |
标签
62 | 
63 |
64 |
65 | -
66 |
67 |
日期
68 | 
69 |
70 |
71 | -
72 |
73 |
搜索_搜索
74 | 
75 |
76 |
77 |
78 |
unicode引用
79 |
80 |
81 |
unicode是字体在网页端最原始的应用方式,特点是:
82 |
83 | - 兼容性最好,支持ie6+,及所有现代浏览器。
84 | - 支持按字体的方式去动态调整图标大小,颜色等等。
85 | - 但是因为是字体,所以不支持多色。只能使用平台里单色的图标,就算项目里有多色图标也会自动去色。
86 |
87 |
88 | 注意:新版iconfont支持多色图标,这些多色图标在unicode模式下将不能使用,如果有需求建议使用symbol的引用方式
89 |
90 |
unicode使用步骤如下:
91 |
第一步:拷贝项目下面生成的font-face
92 |
@font-face {
93 | font-family: 'iconfont';
94 | src: url('iconfont.eot');
95 | src: url('iconfont.eot?#iefix') format('embedded-opentype'),
96 | url('iconfont.woff') format('woff'),
97 | url('iconfont.ttf') format('truetype'),
98 | url('iconfont.svg#iconfont') format('svg');
99 | }
100 |
101 |
第二步:定义使用iconfont的样式
102 |
.iconfont{
103 | font-family:"iconfont" !important;
104 | font-size:16px;font-style:normal;
105 | -webkit-font-smoothing: antialiased;
106 | -webkit-text-stroke-width: 0.2px;
107 | -moz-osx-font-smoothing: grayscale;
108 | }
109 |
110 |
第三步:挑选相应图标并获取字体编码,应用于页面
111 |
<i class="iconfont">3</i>
112 |
113 |
114 | "iconfont"是你项目下的font-family。可以通过编辑项目查看,默认是"iconfont"。
115 |
116 |
117 |
118 |
119 |
120 |
121 |
--------------------------------------------------------------------------------
/src_node/assets/font_icon/iconfont.css:
--------------------------------------------------------------------------------
1 |
2 | @font-face {font-family: "iconfont";
3 | src: url('iconfont.eot?t=1495802693344'); /* IE9*/
4 | src: url('iconfont.eot?t=1495802693344#iefix') format('embedded-opentype'), /* IE6-IE8 */
5 | url('iconfont.woff?t=1495802693344') format('woff'), /* chrome, firefox */
6 | url('iconfont.ttf?t=1495802693344') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
7 | url('iconfont.svg?t=1495802693344#iconfont') format('svg'); /* iOS 4.1- */
8 | }
9 |
10 | .iconfont {
11 | font-family:"iconfont" !important;
12 | font-size:16px;
13 | font-style:normal;
14 | -webkit-font-smoothing: antialiased;
15 | -moz-osx-font-smoothing: grayscale;
16 | }
17 |
18 | .icon-tuichu:before { content: "\343b"; }
19 |
20 | .icon-github:before { content: "\e69f"; }
21 |
22 | .icon-touxiang:before { content: "\e64a"; }
23 |
24 | .icon-zhuye:before { content: "\e600"; }
25 |
26 | .icon-biaoqian:before { content: "\e623"; }
27 |
28 | .icon-riqi:before { content: "\e60a"; }
29 |
30 | .icon-sousuo_sousuo:before { content: "\e608"; }
31 |
32 |
--------------------------------------------------------------------------------
/src_node/assets/font_icon/iconfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/src_node/assets/font_icon/iconfont.eot
--------------------------------------------------------------------------------
/src_node/assets/font_icon/iconfont.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
61 |
--------------------------------------------------------------------------------
/src_node/assets/font_icon/iconfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/src_node/assets/font_icon/iconfont.ttf
--------------------------------------------------------------------------------
/src_node/assets/font_icon/iconfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/src_node/assets/font_icon/iconfont.woff
--------------------------------------------------------------------------------
/src_node/assets/script/common.js:
--------------------------------------------------------------------------------
1 | // 点击水波纹效果
2 | function ripple(rippleWrap, callback) {
3 | var rippleWrapEle = document.querySelector('#' + rippleWrap)
4 | var rippleDiv = rippleWrapEle.querySelectorAll('.rippleWrap');
5 | for (var i = 0; i < rippleDiv.length; i++) {
6 | rippleDiv[i].addEventListener('click', creatRipple);
7 | }
8 | // 获取位置,创建水波标签
9 | function creatRipple(e, callback) {
10 | var offsetL = this.getBoundingClientRect().left;
11 | var offsetT = this.getBoundingClientRect().top;
12 | var x = e.clientX;
13 | var y = e.clientY;
14 | var ripple = document.createElement('span');
15 | ripple.className = 'rippleSpan';
16 | var rippleW = ripple.offsetWidth;
17 | var rippleH = ripple.offsetHeight;
18 | ripple.style.position = 'absolute';
19 | ripple.style.left = x - offsetL - rippleW / 2 + 'px';
20 | ripple.style.top = y - offsetT - rippleH / 2 + 'px';
21 | this.removeChild(this.childNodes[0]);
22 | this.appendChild(ripple);
23 | callback && callback();
24 | }
25 | };
26 | /*//获取到页面顶部的距离,固定定位一样可以获取到
27 | function getAbsPoint(e) {
28 | var x = e.offsetLeft;
29 | var y = e.offsetTop;
30 | while (e = e.offsetParent) {
31 | x += e.offsetLeft;
32 | y += e.offsetTop;
33 | }
34 | return {
35 | "x": x,
36 | "y": y
37 | };
38 | }
39 | // 获取卷起高度
40 | function getScroll() {
41 | return {
42 | top: window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0,
43 | left: window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0
44 | };
45 | }
46 | // 判断是否有固定定位
47 | function isFixed(e) {
48 | while (e = e.offsetParent) {
49 | if (getStyle(e, 'position')=== 'fixed') {
50 | return true;
51 | }
52 | }
53 | }
54 | // 获取计算后的属性,包括css中属性
55 | function getStyle(obj, attr) {
56 | if (obj.currentStyle) {
57 | return obj.currentStyle[attr];
58 | } else {
59 | return getComputedStyle(obj, false)[attr];
60 | }
61 | }*/
62 |
63 |
64 |
65 | // 列表渐变效果
66 | function ListfadeOut() {
67 | var Ul = document.querySelector('.fadeOutList');
68 | var aLi = Ul.querySelectorAll('li');
69 | for (var i = 0; i < aLi.length; i++) {
70 | var oP = aLi[i].querySelectorAll('p')[0];
71 | oP.iAlpha = 0;
72 | oP.time = null;
73 | aLi[i].onmouseover = function () {
74 | var oP = this.querySelectorAll('p')[0];
75 | oP.time ? clearInterval(oP.time) : "";
76 | oP.style.opacity = 1;
77 | oP.style.filter = "alpha(opacity=100)";
78 | oP.iAlpha = 100;
79 | oP.parentNode.style.color = '#fff';
80 | }
81 | aLi[i].onmouseout = function () {
82 | var oP = this.querySelectorAll('p')[0];
83 | starmove(oP);
84 | oP.parentNode.style.color = '#383838';
85 | };
86 | }
87 |
88 | function starmove(obj) {
89 | obj.time ? clearInterval(obj.time) : "";
90 | obj.time = setInterval(function () {
91 | domove(obj);
92 | }, 14);
93 | }
94 |
95 | function domove(obj) {
96 | var iSpeed = 3;
97 | if (obj.iAlpha <= iSpeed) {
98 | clearInterval(obj.time);
99 | obj.iAlpha = 0;
100 | obj.time = null;
101 | } else {
102 | obj.iAlpha -= iSpeed;
103 | }
104 | obj.style.opacity = obj.iAlpha / 100;
105 | obj.style.filter = "alpha(opacity=" + obj.iAlpha + ")";
106 | }
107 | };
108 |
109 |
110 | export { ripple, ListfadeOut };
111 |
--------------------------------------------------------------------------------
/src_node/assets/script/html5shiv.min.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
3 | */
4 | !function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document);
--------------------------------------------------------------------------------
/src_node/assets/style/common.less:
--------------------------------------------------------------------------------
1 | /* 水波纹 */
2 | /* .rippleMixin(20px, 50px, rgba(0, 0, 0, .2), 200, person); */
3 |
4 | .rippleMixin(@paddingLeft, @height, @rgba, @scale, @ripple) {
5 | .ripple {
6 | cursor: pointer;
7 | display: inline-block;
8 | position: relative;
9 | padding: 0 @paddingLeft;
10 | height: @height;
11 | }
12 | .rippleWrap {
13 | position: absolute;
14 | top: 0;
15 | left: 0;
16 | width: 100%;
17 | height: 100%;
18 | overflow: hidden;
19 | }
20 | @keyframes ripple {
21 | to {
22 | transform: scale(@scale*2/20);
23 | opacity: 0;
24 | }
25 | }
26 | .rippleSpan {
27 | width: 10px;
28 | height: 10px;
29 | position: absolute;
30 | background: @rgba;
31 | border-radius: 100%;
32 | transform: scale(0);
33 | pointer-events: none;
34 | animation: ripple .4s ease-out;
35 | }
36 | }
37 |
38 | .clearfixMixin() {
39 | &:before,
40 | &:after {
41 | content: "";
42 | display: table;
43 | }
44 | &:after {
45 | clear: both;
46 | }
47 | & {
48 | *zoom: 1;
49 | }
50 | }
51 |
52 | // 多行
53 | .txt-cut(@clamp) {
54 | overflow: hidden;
55 | text-overflow: ellipsis;
56 | display: -webkit-box;
57 | -webkit-line-clamp: @clamp;
58 | -webkit-box-orient: vertical;
59 | }
60 |
61 | // 扫光
62 | .sliderlight() {
63 | position: relative;
64 | overflow: hidden;
65 | &:before {
66 | content: '';
67 | position: absolute;
68 | width: 20px;
69 | height: 50px;
70 | background-color: #fff;
71 | background: linear-gradient(to right, rgba(255, 255, 255, 0), rgba(255, 255, 255, .7), rgba(255, 255, 255, 0));
72 | transform: skew(-40deg) translate(-70px, -20px);
73 | }
74 | &:hover::before {
75 | transition: all .8s;
76 | transform: skew(-40deg) translate(70px, -20px);
77 | }
78 | }
79 |
80 | // placeholder
81 | .placeholder(@color) {
82 | :-moz-placeholder {
83 | /* Mozilla Firefox 4 to 18 */
84 | color: @color;
85 | opacity: .5;
86 | }
87 | ::-moz-placeholder {
88 | /* Mozilla Firefox 19+ */
89 | color: @color;
90 | opacity: .5;
91 | }
92 | input:-ms-input-placeholder,
93 | textarea:-ms-input-placeholder {
94 | color: @color;
95 | opacity: .5;
96 | }
97 | input::-webkit-input-placeholder,
98 | textarea::-webkit-input-placeholder {
99 | color: @color;
100 | opacity: .5;
101 | }
102 | }
103 |
104 | //.TooltipMixin(70px,-45px,0, 6px, 6px, 7px);
105 | // 父盒子需要定位
106 | .TooltipMixin(@width,@bottom,@t,@l,@b,@r){
107 | .Tooltip {
108 | &:before {
109 | content: '';
110 | position: absolute;
111 | left: 50%;
112 | transform: translateX(-50%);
113 | top: -7px;
114 | width: 0;
115 | height: 0;
116 | border-top: @t solid transparent;
117 | border-left: @l solid transparent;
118 | border-right: @b solid transparent;
119 | border-bottom: @r solid #1F2D3D;
120 | }
121 | padding: 5px 8px;
122 | position: absolute;
123 | bottom: @bottom;
124 | left: 50%;
125 | transform: translateX(-50%);
126 | width: @width;
127 | line-height: 24px;
128 | text-align: center;
129 | background-color: #1F2D3D;
130 | color: #fff;
131 | border-radius: 4px;
132 |
133 | }
134 | }
135 |
--------------------------------------------------------------------------------
/src_node/assets/style/markdown.less:
--------------------------------------------------------------------------------
1 | .margin-tb-zero,
2 | .markdown-content ol ol,
3 | .markdown-content ul ol,
4 | .markdown-content ol ul,
5 | .markdown-content ul ul,
6 | .markdown-content ol ul ol,
7 | .markdown-content ul ul ol,
8 | .markdown-content ol ul ul,
9 | .markdown-content ul ul ul {
10 | margin-top: 0;
11 | margin-bottom: 0;
12 | }
13 | .markdown-content li{
14 | list-style: initial
15 | }
16 | .markdown-content {
17 | font-family: -apple-system,SF UI Text,Arial,PingFang SC,Hiragino Sans GB,Microsoft YaHei,WenQuanYi Micro Hei,sans-serif;
18 | font-size: 16px;
19 | color: #333;
20 | line-height: 1.8;
21 | word-wrap: break-word;
22 | padding: 15px 0;
23 | background: #fff;
24 | -webkit-border-radius: 0 0 3px 3px;
25 | border-radius: 0 0 3px 3px;
26 | }
27 | .markdown-content > *:first-child {
28 | margin-top: 0 !important;
29 | }
30 | .markdown-content > *:last-child {
31 | margin-bottom: 0 !important;
32 | }
33 | .markdown-content * {
34 | -webkit-box-sizing: border-box;
35 | -moz-box-sizing: border-box;
36 | box-sizing: border-box;
37 | }
38 | .markdown-content h1,
39 | .markdown-content h2,
40 | .markdown-content h3,
41 | .markdown-content h4,
42 | .markdown-content h5,
43 | .markdown-content h6 {
44 | margin-top: 2em;
45 | margin-bottom: 18px;
46 | font-weight: bold;
47 | line-height: 1.4;
48 | }
49 |
50 | .markdown-content p,
51 | .markdown-content blockquote,
52 | .markdown-content ul,
53 | .markdown-content ol,
54 | .markdown-content dl,
55 | .markdown-content table,
56 | .markdown-content pre {
57 | margin-top: 0;
58 | margin-bottom: 16px;
59 | }
60 | .markdown-content h1 {
61 | margin: 2em 0 1em 0;
62 | padding-bottom: 0.3em;
63 | font-size: 2.25em;
64 | line-height: 1.2;
65 | border-bottom: 1px solid #eee;
66 | }
67 | .markdown-content h2 {
68 | padding-bottom: 0.3em;
69 | font-size: 1.75em;
70 | line-height: 1.225;
71 | border-bottom: 1px solid #eee;
72 | }
73 | .markdown-content h3 {
74 | font-size: 1.5em;
75 | line-height: 1.43;
76 | }
77 | .markdown-content h4 {
78 | font-size: 1.25em;
79 | }
80 | .markdown-content h5 {
81 | font-size: 1em;
82 | }
83 | .markdown-content h6 {
84 | font-size: 1em;
85 | color: #777;
86 | }
87 | .markdown-content ol,
88 | .markdown-content ul {
89 | padding-left: 2em;
90 | }
91 | .markdown-content ol ol,
92 | .markdown-content ul ol {
93 | list-style-type: lower-roman;
94 | }
95 | .markdown-content ol ul,
96 | .markdown-content ul ul {
97 | list-style-type: circle;
98 | }
99 | .markdown-content ol ul ul,
100 | .markdown-content ul ul ul {
101 | list-style-type: square;
102 | }
103 | .markdown-content ol {
104 | list-style-type: decimal;
105 | }
106 | .markdown-content ul {
107 | list-style-type: disc;
108 | }
109 | .markdown-content blockquote {
110 | margin-left: 0;
111 | margin-right: 0;
112 | padding: 0 15px;
113 | color: #777;
114 | border-left: 4px solid #ddd;
115 | }
116 | .markdown-content table {
117 | display: block;
118 | width: 100%;
119 | overflow: auto;
120 | word-break: normal;
121 | word-break: keep-all;
122 | border-collapse: collapse;
123 | border-spacing: 0;
124 | }
125 | .markdown-content table tr {
126 | background-color: #fff;
127 | border-top: 1px solid #ccc;
128 | }
129 | .markdown-content table tr:nth-child(2n) {
130 | background-color: #f8f8f8;
131 | }
132 | .markdown-content table th,
133 | .markdown-content table td {
134 | padding: 6px 13px;
135 | border: 1px solid #ddd;
136 | }
137 | .markdown-content pre {
138 | word-wrap: normal;
139 | padding: 16px;
140 | overflow: auto;
141 | font-size: 85%;
142 | line-height: 1.45;
143 | background-color: #f7f7f7;
144 | -webkit-border-radius: 3px;
145 | border-radius: 3px;
146 | }
147 | .markdown-content pre code {
148 | display: inline;
149 | max-width: initial;
150 | padding: 0;
151 | margin: 0;
152 | overflow: initial;
153 | font-size: 100%;
154 | line-height: inherit;
155 | word-wrap: normal;
156 | white-space: pre;
157 | border: 0;
158 | -webkit-border-radius: 3px;
159 | border-radius: 3px;
160 | color: #333;
161 | background-color: transparent;
162 | }
163 | .markdown-content pre code:before,
164 | .markdown-content pre code:after {
165 | content: normal;
166 | }
167 | .markdown-content code {
168 | font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
169 | padding: 0;
170 | padding-top: 0.2em;
171 | padding-bottom: 0.2em;
172 | margin: 0 3px;
173 | font-size: 85%;
174 | color: #c7254e;
175 | background-color: #f9f2f4;
176 | -webkit-border-radius: 3px;
177 | border-radius: 3px;
178 | }
179 | .markdown-content code:before,
180 | .markdown-content code:after {
181 | letter-spacing: -0.2em;
182 | content: "\00a0";
183 | }
184 | .markdown-content a {
185 | color: #4078c0;
186 | text-decoration: none;
187 | background: transparent;
188 | }
189 | .markdown-content img {
190 | max-width: 100%;
191 | max-height: 100%;
192 | -webkit-border-radius: 4px;
193 | border-radius: 4px;
194 | -webkit-box-shadow: 0 0 10px #555;
195 | box-shadow: 0 0 10px #555;
196 | }
197 | .markdown-content strong {
198 | font-weight: bold;
199 | }
200 | .markdown-content em {
201 | font-style: italic;
202 | }
203 | .markdown-content del {
204 | text-decoration: line-through;
205 | }
--------------------------------------------------------------------------------
/src_node/assets/style/reset.css:
--------------------------------------------------------------------------------
1 | /**
2 | * Eric Meyer's Reset CSS v2.0 (http://meyerweb.com/eric/tools/css/reset/)
3 | * http://cssreset.com
4 | */
5 | html, body, div, span, applet, object, iframe,
6 | h1, h2, h3, h4, h5, h6, p, blockquote, pre,
7 | a, abbr, acronym, address, big, cite, code,
8 | del, dfn, em, img, ins, kbd, q, s, samp,
9 | small, strike, strong, sub, sup, tt, var,
10 | b, u, i, center,
11 | dl, dt, dd, ol, ul, li,
12 | fieldset, form, label, legend,
13 | table, caption, tbody, tfoot, thead, tr, th, td,
14 | article, aside, canvas, details, embed,
15 | figure, figcaption, footer, header,
16 | menu, nav, output, ruby, section, summary,
17 | time, mark, audio, video, input {
18 | margin: 0;
19 | padding: 0;
20 | border: 0;
21 | font-size: 100%;
22 | font-weight: normal;
23 | vertical-align: baseline;
24 | }
25 |
26 | /* HTML5 display-role reset for older browsers */
27 | article, aside, details, figcaption, figure,
28 | footer, header, menu, nav, section {
29 | display: block;
30 | }
31 |
32 | body {
33 | line-height: 1;
34 | }
35 |
36 | blockquote, q {
37 | quotes: none;
38 | }
39 |
40 | blockquote:before, blockquote:after,
41 | q:before, q:after {
42 | content: none;
43 | }
44 |
45 | table {
46 | border-collapse: collapse;
47 | border-spacing: 0;
48 | }
49 |
50 | /* custom */
51 | a {
52 | color: #7e8c8d;
53 | text-decoration: none;
54 | -webkit-backface-visibility: hidden;
55 | }
56 |
57 | li {
58 | list-style: none;
59 | }
60 |
61 | /* ::-webkit-scrollbar {
62 | width: 5px;
63 | height: 5px;
64 | }
65 |
66 | ::-webkit-scrollbar-track-piece {
67 | background-color: rgba(0, 0, 0, 0.2);
68 | -webkit-border-radius: 6px;
69 | }
70 |
71 | ::-webkit-scrollbar-thumb:vertical {
72 | height: 5px;
73 | background-color: rgba(125, 125, 125, 0.7);
74 | -webkit-border-radius: 6px;
75 | }
76 |
77 | ::-webkit-scrollbar-thumb:horizontal {
78 | width: 5px;
79 | background-color: rgba(125, 125, 125, 0.7);
80 | -webkit-border-radius: 6px;
81 | }
82 | */
83 |
84 |
85 |
86 |
87 | html, body {
88 | width: 100%;
89 | font-family: 'Microsoft YaHei', Tahoma, Arial, sans-serif;
90 | }
91 |
92 | body {
93 | -webkit-text-size-adjust: none;
94 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
95 | }
96 |
97 | input,button, select{
98 | border:0;
99 | outline:none;
100 | font-family: 'Microsoft YaHei', Tahoma, Arial, sans-serif;
101 | }
102 | i{
103 | font-style: normal
104 | }
105 |
--------------------------------------------------------------------------------
/src_node/assets/view/ripple.html:
--------------------------------------------------------------------------------
1 |
2 |
8 |
--------------------------------------------------------------------------------
/src_node/components/BAM/allBlog/allBlog.vue:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 |
51 |
52 |
--------------------------------------------------------------------------------
/src_node/components/BAM/draft/draft.vue:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 |
49 |
50 |
--------------------------------------------------------------------------------
/src_node/components/BAM/layout/layout.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
76 |
77 |
87 |
88 |
89 |
90 |
--------------------------------------------------------------------------------
/src_node/components/BAM/self/default.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/src_node/components/BAM/self/default.png
--------------------------------------------------------------------------------
/src_node/components/BAM/self/self.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
![头像]()
6 |
7 |
8 |
9 |
10 |
20 |
21 |
个人简介:
22 |
23 |
剩余可输入{{surplus}}/100字
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
136 |
137 |
--------------------------------------------------------------------------------
/src_node/components/BAM/side/side.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
10 |
11 | -
12 | 我的主页
13 |
14 | -
15 | 全部博客
16 |
17 | -
18 | 发布博客
19 |
20 | -
21 | 草稿箱
22 |
23 |
24 | -
25 | 个人资料
26 |
27 |
28 |
29 |
30 |
31 |
70 |
71 |
129 |
130 |
--------------------------------------------------------------------------------
/src_node/components/article/content/content.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
![]()
6 |
7 |
8 |
9 | 作者{{articleContent.author}}
10 |
最后修改:{{articleContent.date}}
11 |
12 |
13 |
14 |
{{articleContent.mainTitle}}
15 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
46 |
47 |
118 |
--------------------------------------------------------------------------------
/src_node/components/article/layout/layout.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
60 |
61 |
69 |
70 |
71 |
72 |
--------------------------------------------------------------------------------
/src_node/components/blog/layout/layout.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
![]()
6 |
7 |
8 |
9 | 作者{{userInfo.showName}}
10 |
11 |
12 | 文章:{{allArticleList.length}}
13 | |
14 | 字数:{{wordCount}}
15 |
16 |
{{userInfo.singName}}
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
189 |
190 |
--------------------------------------------------------------------------------
/src_node/components/common/Message/Message.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
i
6 |
{{sendMessage}}
7 |
8 |
9 |
10 |
11 |
12 |
30 |
31 |
--------------------------------------------------------------------------------
/src_node/components/common/blogTags/blogTags.vue:
--------------------------------------------------------------------------------
1 |
2 |
15 |
16 |
17 |
40 |
41 |
--------------------------------------------------------------------------------
/src_node/components/common/catalogue/catalogue.vue:
--------------------------------------------------------------------------------
1 |
2 |
31 |
32 |
33 |
83 |
84 |
--------------------------------------------------------------------------------
/src_node/components/common/dialog/dialog.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
{{titleInfo}}
6 |
{{DialogInfo}}
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
53 |
54 |
--------------------------------------------------------------------------------
/src_node/components/common/editor/editor.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
61 |
62 |
--------------------------------------------------------------------------------
/src_node/components/common/header/noavatar_small.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/src_node/components/common/header/noavatar_small.gif
--------------------------------------------------------------------------------
/src_node/components/common/sidebar/sidebar.vue:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
42 |
43 |
--------------------------------------------------------------------------------
/src_node/components/login/layout/Layer_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/src_node/components/login/layout/Layer_1.png
--------------------------------------------------------------------------------
/src_node/components/login/layout/Layer_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/src_node/components/login/layout/Layer_2.png
--------------------------------------------------------------------------------
/src_node/components/tags/layout/layout.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
18 |
19 |
--------------------------------------------------------------------------------
/src_node/components/time/layout/layout.vue:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 |
120 |
121 |
--------------------------------------------------------------------------------
/src_node/components/time/timeList/timeList.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
{{index.substring(4)}}
5 |
14 |
15 |
16 |
17 |
18 |
38 |
39 |
--------------------------------------------------------------------------------
/src_node/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import VuerResource from 'vue-resource'
3 | import App from './App'
4 | import router from './router'
5 |
6 | import '@/assets/style/reset.css'
7 | import '@/assets/style/markdown.less'
8 | import '@/assets/font_icon/iconfont.css'
9 |
10 | Vue.use(VuerResource);
11 |
12 |
13 | Vue.http.options.emulateJSON = true; /*vue-resource的坑,post请求头不对*/
14 | Vue.config.productionTip = false;
15 |
16 |
17 | /* eslint-disable no-new */
18 | var vm = new Vue({
19 | el: '#app',
20 | router,
21 | template: '',
22 | components: { App },
23 | })
24 |
25 | router.beforeEach((to, from, next) => {
26 | // 要去的路由需要登录
27 | if (to.meta.requireAuth) {
28 | // 获取cookie,判断是否要重新发送请求
29 | var value = document.cookie.match(new RegExp("(^| )sess_id=([^;]*)(;|$)"));
30 | var cookie = null != value ? decodeURIComponent(value[2]) : null;
31 | if (cookie) {
32 | next()
33 | return;
34 | }
35 | vm.$http.get('/admin').then((res) => {
36 | if (res.body.ret_code === "001") {
37 | next({
38 | path: '/login',
39 | query: { redirect: to.fullPath }
40 | })
41 | } else {
42 | next();
43 | }
44 | })
45 | } else {
46 | next();
47 | }
48 | })
--------------------------------------------------------------------------------
/src_node/router/index.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import Router from 'vue-router'
3 | import Blog from '@/components/blog/layout/layout'
4 | import Time from '@/components/time/layout/layout'
5 | import Tags from '@/components/tags/layout/layout'
6 | import BAM from '@/components/BAM/layout/layout'
7 | import Login from '@/components/login/layout/layout'
8 | import Article from '@/components/article/layout/layout'
9 |
10 | import BAllBlog from '@/components/BAM/allBlog/allBlog'
11 | import BWriteBolg from '@/components/BAM/writeBlog/writeBlog'
12 | import BDraft from '@/components/BAM/draft/draft'
13 | import BSelf from '@/components/BAM/self/self'
14 |
15 | Vue.use(Router)
16 |
17 | export default new Router({
18 | routes: [
19 | { path: '/', redirect: '/blog' },
20 | { path: '/blog', component: Blog, },
21 | { path: '/time', component: Time },
22 | { path: '/article', component: Article },
23 | {
24 | path: '/BAM',
25 | component: BAM,
26 | redirect: '/BAM/BAllBlog',
27 | meta: { requireAuth: true },
28 | children: [
29 | { path: 'BAllBlog', name: 'BAllBlog', component: BAllBlog, meta: { requireAuth: true } },
30 | { path: 'BWriteBolg', name: 'BWriteBolg', component: BWriteBolg, meta: { requireAuth: true } },
31 | { path: 'BDraft', name: 'BDraft', component: BDraft, meta: { requireAuth: true } },
32 | { path: 'BSelf', component: BSelf, meta: { requireAuth: true } },
33 | ]
34 | },
35 | { path: '/login', component: Login },
36 | { path: '/sun', component: Tags },
37 | ]
38 | })
39 |
--------------------------------------------------------------------------------
/src_node/todos.md:
--------------------------------------------------------------------------------
1 | ### todo
2 | - md编辑器图片上传
3 | - 注册
4 | - 邮件验证
5 | - 个人中心(头像)
--------------------------------------------------------------------------------
/static/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tetegw/pawnBlog/5f3b80cfcc93758086509861c9c52de65295a390/static/.gitkeep
--------------------------------------------------------------------------------
/static/lib/highlight/github.min.css:
--------------------------------------------------------------------------------
1 | .hljs{display:block;overflow-x:auto;padding:0.5em;color:#333;background:#f8f8f8}.hljs-comment,.hljs-quote{color:#998;font-style:italic}.hljs-keyword,.hljs-selector-tag,.hljs-subst{color:#333;font-weight:bold}.hljs-number,.hljs-literal,.hljs-variable,.hljs-template-variable,.hljs-tag .hljs-attr{color:#008080}.hljs-string,.hljs-doctag{color:#d14}.hljs-title,.hljs-section,.hljs-selector-id{color:#900;font-weight:bold}.hljs-subst{font-weight:normal}.hljs-type,.hljs-class .hljs-title{color:#458;font-weight:bold}.hljs-tag,.hljs-name,.hljs-attribute{color:#000080;font-weight:normal}.hljs-regexp,.hljs-link{color:#009926}.hljs-symbol,.hljs-bullet{color:#990073}.hljs-built_in,.hljs-builtin-name{color:#0086b3}.hljs-meta{color:#999;font-weight:bold}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:bold}
--------------------------------------------------------------------------------
/static/lib/pace/pace-theme-flash.css:
--------------------------------------------------------------------------------
1 | /* This is a compiled file, you should be editing the file in the templates directory */
2 | .pace {
3 | -webkit-pointer-events: none;
4 | pointer-events: none;
5 | -webkit-user-select: none;
6 | -moz-user-select: none;
7 | user-select: none;
8 | }
9 |
10 | .pace-inactive {
11 | display: none;
12 | }
13 |
14 | .pace .pace-progress {
15 | background: #7cefb5;
16 | position: fixed;
17 | z-index: 2000;
18 | top: 0;
19 | right: 100%;
20 | width: 100%;
21 | height: 3px;
22 | }
23 |
24 | .pace .pace-progress-inner {
25 | display: block;
26 | position: absolute;
27 | right: 0px;
28 | width: 100px;
29 | height: 100%;
30 | box-shadow: 0 0 10px #7cefb5, 0 0 5px #7cefb5;
31 | opacity: 1.0;
32 | -webkit-transform: rotate(3deg) translate(0px, -4px);
33 | -moz-transform: rotate(3deg) translate(0px, -4px);
34 | -ms-transform: rotate(3deg) translate(0px, -4px);
35 | -o-transform: rotate(3deg) translate(0px, -4px);
36 | transform: rotate(3deg) translate(0px, -4px);
37 | }
38 |
39 | .pace .pace-activity {
40 | display: block;
41 | position: fixed;
42 | z-index: 2000;
43 | top: 15px;
44 | right: 15px;
45 | width: 14px;
46 | height: 14px;
47 | border: solid 4px transparent;
48 | border-top-color: #7cefb5;
49 | border-left-color: #7cefb5;
50 | border-radius: 10px;
51 | -webkit-animation: pace-spinner 400ms linear infinite;
52 | -moz-animation: pace-spinner 400ms linear infinite;
53 | -ms-animation: pace-spinner 400ms linear infinite;
54 | -o-animation: pace-spinner 400ms linear infinite;
55 | animation: pace-spinner 400ms linear infinite;
56 | }
57 |
58 | @-webkit-keyframes pace-spinner {
59 | 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); }
60 | 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); }
61 | }
62 | @-moz-keyframes pace-spinner {
63 | 0% { -moz-transform: rotate(0deg); transform: rotate(0deg); }
64 | 100% { -moz-transform: rotate(360deg); transform: rotate(360deg); }
65 | }
66 | @-o-keyframes pace-spinner {
67 | 0% { -o-transform: rotate(0deg); transform: rotate(0deg); }
68 | 100% { -o-transform: rotate(360deg); transform: rotate(360deg); }
69 | }
70 | @-ms-keyframes pace-spinner {
71 | 0% { -ms-transform: rotate(0deg); transform: rotate(0deg); }
72 | 100% { -ms-transform: rotate(360deg); transform: rotate(360deg); }
73 | }
74 | @keyframes pace-spinner {
75 | 0% { transform: rotate(0deg); transform: rotate(0deg); }
76 | 100% { transform: rotate(360deg); transform: rotate(360deg); }
77 | }
78 |
--------------------------------------------------------------------------------