├── static └── .gitkeep ├── config ├── prod.env.js ├── dev.env.js └── index.js ├── src ├── plugins │ ├── bus.js │ └── httpInterceptor.js ├── assets │ ├── bg.gif │ ├── read.jpg │ ├── banner.jpeg │ ├── space.jpeg │ ├── timrchen_head.jpeg │ └── timrchen_logo.png ├── apis │ ├── domains.js │ ├── userAPIs.js │ ├── extraAPIs.js │ ├── commentAPIs.js │ └── essayAPIs.js ├── components │ ├── base │ │ ├── robot │ │ │ └── Robot.vue │ │ ├── qrcode │ │ │ └── Qrcode.vue │ │ ├── About.vue │ │ ├── shortUrl │ │ │ └── ShortUrl.vue │ │ ├── morseCode │ │ │ └── MorseCode.vue │ │ ├── AdminComment.vue │ │ ├── news │ │ │ └── News.vue │ │ ├── AdminEssay.vue │ │ ├── rssHub │ │ │ └── RSSHub.vue │ │ ├── oneArticle │ │ │ └── OneArticle.vue │ │ ├── Extra.vue │ │ ├── EditEssay.vue │ │ └── Essay.vue │ ├── TimFooter.vue │ ├── TimBody.vue │ └── TimHeader.vue ├── utils │ └── antiXss.js ├── actions │ ├── userActions.js │ ├── extraActions.js │ ├── commentActions.js │ └── essayActions.js ├── App.vue ├── router │ └── index.js └── main.js ├── .editorconfig ├── .gitignore ├── .postcssrc.js ├── .babelrc ├── index.html ├── package.json └── README.md /static/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /config/prod.env.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | NODE_ENV: '"production"' 3 | } 4 | -------------------------------------------------------------------------------- /src/plugins/bus.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | 3 | export default new Vue() 4 | -------------------------------------------------------------------------------- /src/assets/bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimRChen/TimRChen-Blog/HEAD/src/assets/bg.gif -------------------------------------------------------------------------------- /src/assets/read.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimRChen/TimRChen-Blog/HEAD/src/assets/read.jpg -------------------------------------------------------------------------------- /src/assets/banner.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimRChen/TimRChen-Blog/HEAD/src/assets/banner.jpeg -------------------------------------------------------------------------------- /src/assets/space.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimRChen/TimRChen-Blog/HEAD/src/assets/space.jpeg -------------------------------------------------------------------------------- /src/assets/timrchen_head.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimRChen/TimRChen-Blog/HEAD/src/assets/timrchen_head.jpeg -------------------------------------------------------------------------------- /src/assets/timrchen_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TimRChen/TimRChen-Blog/HEAD/src/assets/timrchen_logo.png -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /.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 | 8 | # Editor directories and files 9 | .idea 10 | *.suo 11 | *.ntvs* 12 | *.njsproj 13 | *.sln 14 | -------------------------------------------------------------------------------- /.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | "plugins": { 5 | // to edit target browsers: use "browserslist" field in package.json 6 | "autoprefixer": {} 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/apis/domains.js: -------------------------------------------------------------------------------- 1 | import config from '../../config/index' 2 | 3 | const isProdEnv = /timrchen\.site/.test(window.location.host) 4 | const timDomain = isProdEnv ? config.build.timDomain : config.dev.timDomain; 5 | 6 | export default timDomain; 7 | -------------------------------------------------------------------------------- /src/apis/userAPIs.js: -------------------------------------------------------------------------------- 1 | import _ from 'lodash' 2 | import domains from './domains' 3 | const addDomain = domain => path => domain + path 4 | 5 | const APIs = { 6 | GET_AUTH: '/api/auth', 7 | GET_LOGOUT: '/logout', 8 | POST_LOGIN: '/login', 9 | POST_SIGNUP: '/signup' 10 | } 11 | 12 | export default _.each(APIs, (path, key) => { 13 | APIs[key] = addDomain(domains)(path) 14 | }) 15 | -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["env", { 4 | "modules": false, 5 | "targets": { 6 | "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] 7 | } 8 | }], 9 | "stage-2" 10 | ], 11 | "plugins": ["transform-runtime"], 12 | "env": { 13 | "test": { 14 | "presets": ["env", "stage-2"], 15 | "plugins": ["istanbul"] 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/components/base/robot/Robot.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 17 | -------------------------------------------------------------------------------- /src/apis/extraAPIs.js: -------------------------------------------------------------------------------- 1 | import _ from 'lodash' 2 | import domains from './domains' 3 | const addDomain = domain => path => domain + path 4 | 5 | const APIs = { 6 | GET_NEWS_LIST: '/api/extra/news', 7 | GET_QRCODE: '/api/extra/qrcode', 8 | GET_ONE_ARTICLE: '/api/extra/oneArticle', 9 | GET_RSS_READER: '/api/extra/rss-timrchen' 10 | } 11 | 12 | export default _.each(APIs, (path, key) => { 13 | APIs[key] = addDomain(domains)(path) 14 | }) 15 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | timrchen 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/plugins/httpInterceptor.js: -------------------------------------------------------------------------------- 1 | /** 2 | * vue plugin - http拦截器,用于添加http request 或 response的header信息; 关于plugin的开发规范,参考https://vuejs.org/guide/plugins.html 3 | * @params { object } Vue - Vue constructor 4 | * @params { object } options - 关于在此拦截器中的一些配置参以及执行逻辑 5 | **/ 6 | const httpInterceptor = { 7 | install (Vue, options) { 8 | Vue.http.interceptors.push((...args) => { 9 | options.operation(...args) 10 | }) 11 | } 12 | } 13 | 14 | export default httpInterceptor 15 | -------------------------------------------------------------------------------- /src/apis/commentAPIs.js: -------------------------------------------------------------------------------- 1 | import _ from 'lodash' 2 | import domains from './domains' 3 | const addDomain = domain => path => domain + path 4 | 5 | const APIs = { 6 | GET_COMMENT_LIST: '/api/comment/list', // 获取文章评论列表 7 | GET_ADMIN_LIST: '/api/comment/admin/list', // 获取评论后台列表 8 | POST_CREATE_COMMENT: '/api/comment/create', // 发表评论 9 | DELETE_COMMENT: '/api/comment/delete' // 删除评论 10 | } 11 | 12 | export default _.each(APIs, (path, key) => { 13 | APIs[key] = addDomain(domains)(path) 14 | }) 15 | -------------------------------------------------------------------------------- /src/utils/antiXss.js: -------------------------------------------------------------------------------- 1 | let antiXss = {} 2 | 3 | /** 4 | * 防XSS的一种方法:转义法 5 | * @param str - 编码html 6 | */ 7 | antiXss.enCodeHtml = function (str) { 8 | str = (str || '').toString() 9 | const character = { 10 | '<': '<', 11 | '>': '>', 12 | '&': '&', 13 | '"': '"', 14 | '\'': ''' 15 | } 16 | return (function () { 17 | return str.replace(/[<>&"']/g, function (c) { 18 | return character[c] 19 | }) 20 | }()) 21 | } 22 | 23 | module.exports = antiXss 24 | -------------------------------------------------------------------------------- /src/apis/essayAPIs.js: -------------------------------------------------------------------------------- 1 | import _ from 'lodash' 2 | import domains from './domains' 3 | const addDomain = domain => path => domain + path 4 | 5 | const APIs = { 6 | POST_NEW_ESSAY: '/api/essay/new', // 新建文章接口 7 | GET_ESSAY_LIST: '/api/essay/list', // 初始化文章首页列表 8 | GET_ADMIN_LIST: '/api/essay/admin/list', // 获取管理文章列表 9 | POST_ESSAY_PAGE: '/api/essay/page', // 获取某一页文章列表 10 | GET_ESSAY_DETAILS: '/api/essay/details', // 获取文章详细内容 11 | DELETE_ESSAY: '/api/essay/delete' // 删除文章 12 | } 13 | 14 | export default _.each(APIs, (path, key) => { 15 | APIs[key] = addDomain(domains)(path) 16 | }) 17 | -------------------------------------------------------------------------------- /src/actions/userActions.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import userAPIs from '../apis/userAPIs' 3 | 4 | /** 5 | * 验证JWT是否有效 6 | */ 7 | const getAuth = function (token) { 8 | return Vue.http.get( 9 | userAPIs.GET_AUTH 10 | ) 11 | } 12 | 13 | /** 14 | * Logout 15 | */ 16 | const logout = function () { 17 | return Vue.http.get( 18 | userAPIs.GET_LOGOUT 19 | ) 20 | } 21 | 22 | /** 23 | * Signup 24 | */ 25 | // const signUp = function (username, password) { 26 | // return Vue.http.post( 27 | // userAPIs.POST_SIGNUP, 28 | // { 29 | // 'username': username, 30 | // 'password': password, 31 | // 'secretOrPrivateKey': 'timrchenqian' 32 | // } 33 | // ) 34 | // } 35 | 36 | /** 37 | * Login 38 | */ 39 | const login = function (username, password) { 40 | return Vue.http.post( 41 | userAPIs.POST_LOGIN, 42 | { 43 | 'username': username, 44 | 'password': password 45 | } 46 | ) 47 | } 48 | 49 | export default ({ 50 | getAuth, 51 | logout, 52 | // signUp, 53 | login 54 | }) 55 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 21 | 22 | 46 | -------------------------------------------------------------------------------- /src/components/TimFooter.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 49 | -------------------------------------------------------------------------------- /src/actions/extraActions.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import extraAPIs from '../apis/extraAPIs' 3 | 4 | /** 5 | * 获取新闻列表 6 | * request: { 7 | * query: { 8 | * type: 新闻类型 9 | * } 10 | * } 11 | */ 12 | const getNewsList = function (type) { 13 | return Vue.http.get( 14 | `${extraAPIs.GET_NEWS_LIST}?type=${type}` 15 | ) 16 | } 17 | 18 | /** 19 | * 生成二维码 20 | */ 21 | const getQrcode = function (textContent) { 22 | return Vue.http.get( 23 | `${extraAPIs.GET_QRCODE}?textContent=${textContent}` 24 | ) 25 | } 26 | 27 | /** 28 | * 获取每日一文 29 | */ 30 | const getOneArticle = function () { 31 | return Vue.http.get( 32 | `${extraAPIs.GET_ONE_ARTICLE}` 33 | ) 34 | } 35 | 36 | /** 37 | * 获取随机每日一文 38 | */ 39 | const getOneRandomArticle = function () { 40 | return Vue.http.get( 41 | `${extraAPIs.GET_ONE_ARTICLE}/random` 42 | ) 43 | } 44 | 45 | /** 46 | * 获取RSSHub订阅内容 47 | */ 48 | const getRssReader = function (rssURI) { 49 | return Vue.http.post( 50 | `${extraAPIs.GET_RSS_READER}`, 51 | { rssURI } 52 | ) 53 | } 54 | 55 | export default ({ 56 | getRssReader, 57 | getNewsList, 58 | getQrcode, 59 | getOneArticle, 60 | getOneRandomArticle 61 | }) 62 | -------------------------------------------------------------------------------- /src/actions/commentActions.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import commentAPIs from '../apis/commentAPIs' 3 | 4 | /** 5 | * GET - 获取文章评论列表 6 | */ 7 | const getCommentList = function (essayId) { 8 | return Vue.http.get( 9 | `${commentAPIs.GET_COMMENT_LIST}?essayId=${essayId}` 10 | ) 11 | } 12 | 13 | /** 14 | * GET - 获取后台评论列表 15 | */ 16 | const getAdminList = function () { 17 | return Vue.http.get( 18 | commentAPIs.GET_ADMIN_LIST 19 | ) 20 | } 21 | 22 | /** 23 | * POST 24 | * @param {Object} commentInfo - 评论信息 25 | */ 26 | const createComment = function (commentInfo) { 27 | return Vue.http.post( 28 | commentAPIs.POST_CREATE_COMMENT, 29 | { 30 | 'essayId': commentInfo.essayId, 31 | 'name': commentInfo.name, 32 | 'content': commentInfo.content 33 | } 34 | ) 35 | } 36 | 37 | /** 38 | * DELETE - 删除评论 39 | * @param {String} commentId - 评论Id 40 | */ 41 | const deleteComment = function (commentId) { 42 | return Vue.http.delete( 43 | commentAPIs.DELETE_COMMENT, 44 | { 45 | 'params': { 46 | 'commentId': commentId 47 | } 48 | } 49 | ) 50 | } 51 | 52 | export default ({ 53 | getCommentList, 54 | getAdminList, 55 | createComment, 56 | deleteComment 57 | }) 58 | -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | import TimBody from '@/components/TimBody' 4 | import AdminEssay from '@/components/base/AdminEssay' 5 | import AdminComment from '@/components/base/AdminComment' 6 | import About from '@/components/base/About' 7 | import Essay from '@/components/base/Essay' 8 | import EditEssay from '@/components/base/EditEssay' 9 | import Extra from '@/components/base/Extra' 10 | 11 | Vue.use(Router) 12 | 13 | export default new Router({ 14 | routes: [ 15 | { 16 | path: '/', 17 | name: 'body', 18 | component: TimBody 19 | }, 20 | { 21 | path: '/essay/:id', 22 | name: 'essay', 23 | component: Essay 24 | }, 25 | { 26 | path: '/edit', 27 | name: 'edit', 28 | component: EditEssay 29 | }, 30 | { 31 | path: '/admin-essay', 32 | name: 'admin-essay', 33 | component: AdminEssay 34 | }, 35 | { 36 | path: '/admin-comment', 37 | name: 'admin-comment', 38 | component: AdminComment 39 | }, 40 | { 41 | path: '/about', 42 | name: 'about', 43 | component: About 44 | }, 45 | { 46 | path: '/extra', 47 | name: 'extra', 48 | component: Extra 49 | } 50 | ] 51 | }) 52 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | // The Vue build version to load with the `import` command 2 | // (runtime-only or standalone) has been set in webpack.base.conf with an alias. 3 | import Vue from 'vue' 4 | import App from './App' 5 | import router from './router' 6 | import VueResource from 'vue-resource' 7 | import '../node_modules/bulma/css/bulma.css' 8 | import '../node_modules/font-awesome/css/font-awesome.css' 9 | import httpInterceptor from './plugins/httpInterceptor' 10 | 11 | Vue.config.productionTip = false 12 | 13 | Vue.use(VueResource) 14 | 15 | /** 16 | * http拦截器插件 17 | */ 18 | Vue.use(httpInterceptor, { 19 | operation: (...args) => { 20 | const [request, next] = args 21 | request.headers.map.Authorization = [window.localStorage.getItem('Authorization') || ''] 22 | next((response) => { 23 | if (typeof response.headers.map.Authorization === 'object') { 24 | window.localStorage.setItem('Authorization', response.headers.map.Authorization[0]) 25 | } else if (typeof response.headers.map.authorization === 'object') { 26 | window.localStorage.setItem('Authorization', response.headers.map.Authorization[0]) 27 | } 28 | return response 29 | }) 30 | } 31 | }) 32 | 33 | /* eslint-disable no-new */ 34 | new Vue({ 35 | el: '#app', 36 | router, 37 | template: '', 38 | components: { App } 39 | }) 40 | -------------------------------------------------------------------------------- /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: 'http://js.timrchen.site/', 11 | productionSourceMap: false, 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 | timDomain: 'http://api.timrchen.site:3000' 24 | }, 25 | dev: { 26 | env: require('./dev.env'), 27 | port: 8080, 28 | autoOpenBrowser: true, 29 | assetsSubDirectory: 'static', 30 | assetsPublicPath: '/', 31 | proxyTable: {}, 32 | // CSS Sourcemaps off by default because relative paths are "buggy" 33 | // with this option, according to the CSS-Loader README 34 | // (https://github.com/webpack/css-loader#sourcemaps) 35 | // In our experience, they generally work as expected, 36 | // just be aware of this issue when enabling this option. 37 | cssSourceMap: false, 38 | timDomain: 'http://127.0.0.1:3000' 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/actions/essayActions.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import essayAPIs from '../apis/essayAPIs' 3 | 4 | /** 5 | * POST 6 | * @param {Object} essayInfo - 文章信息 7 | */ 8 | const newEssay = function (essayInfo) { 9 | return Vue.http.post( 10 | essayAPIs.POST_NEW_ESSAY, 11 | { 12 | 'essayId': essayInfo.essayId, 13 | 'title': essayInfo.title, 14 | 'content': essayInfo.content, 15 | 'picUrl': essayInfo.picUrl 16 | } 17 | ) 18 | } 19 | 20 | /** 21 | * GET - 获取文章列表 22 | */ 23 | const getEssayList = function () { 24 | return Vue.http.get( 25 | essayAPIs.GET_ESSAY_LIST 26 | ) 27 | } 28 | 29 | /** 30 | * GET - 获取管理文章列表 31 | */ 32 | const getAdminList = function () { 33 | return Vue.http.get( 34 | essayAPIs.GET_ADMIN_LIST 35 | ) 36 | } 37 | 38 | /** 39 | * POST - 获取某页文章列表 40 | */ 41 | const getPage = function (nextPage) { 42 | return Vue.http.post( 43 | essayAPIs.POST_ESSAY_PAGE, 44 | { 45 | 'nextPage': nextPage 46 | } 47 | ) 48 | } 49 | 50 | /** 51 | * GET - 获取文章详细内容 52 | * @param {String} essayId - 文章Id 53 | */ 54 | const getEssayDetails = function (essayId) { 55 | return Vue.http.get( 56 | essayAPIs.GET_ESSAY_DETAILS, 57 | { 58 | 'params': { 59 | 'essayId': essayId 60 | } 61 | } 62 | ) 63 | } 64 | 65 | /** 66 | * DELETE - 删除文章 67 | * @param {String} essayId - 文章Id 68 | */ 69 | const deleteEssay = function (essayId) { 70 | return Vue.http.delete( 71 | essayAPIs.DELETE_ESSAY, 72 | { 73 | 'params': { 74 | 'essayId': essayId 75 | } 76 | } 77 | ) 78 | } 79 | 80 | export default ({ 81 | newEssay, 82 | getEssayList, 83 | getAdminList, 84 | getPage, 85 | getEssayDetails, 86 | deleteEssay 87 | }) 88 | -------------------------------------------------------------------------------- /src/components/base/qrcode/Qrcode.vue: -------------------------------------------------------------------------------- 1 | 27 | 60 | 63 | -------------------------------------------------------------------------------- /src/components/base/About.vue: -------------------------------------------------------------------------------- 1 | 44 | 45 | 48 | 49 | -------------------------------------------------------------------------------- /src/components/base/shortUrl/ShortUrl.vue: -------------------------------------------------------------------------------- 1 | 23 | 68 | 71 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "timrchen", 3 | "version": "1.9.7", 4 | "description": "HRC's blog", 5 | "author": "HRC ", 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 | "test": "standard", 12 | "fix": "standard --fix" 13 | }, 14 | "dependencies": { 15 | "anti-key-words": "^1.0.4", 16 | "bulma": "^0.6.2", 17 | "font-awesome": "^4.7.0", 18 | "markdown-it": "^8.4.0", 19 | "moment": "^2.22.2", 20 | "vue": "^2.3.3", 21 | "vue-resource": "^1.3.4", 22 | "vue-router": "^2.6.0" 23 | }, 24 | "devDependencies": { 25 | "autoprefixer": "^7.1.2", 26 | "babel-core": "^6.26.3", 27 | "babel-eslint": "^7.1.1", 28 | "babel-loader": "^7.1.1", 29 | "babel-plugin-transform-runtime": "^6.22.0", 30 | "babel-preset-env": "^1.7.0", 31 | "babel-preset-stage-2": "^6.22.0", 32 | "babel-register": "^6.22.0", 33 | "chalk": "^2.0.1", 34 | "connect-history-api-fallback": "^1.3.0", 35 | "copy-webpack-plugin": "^4.0.1", 36 | "css-loader": "^0.28.0", 37 | "cssnano": "^3.10.0", 38 | "eventsource-polyfill": "^0.9.6", 39 | "express": "^4.16.3", 40 | "extract-text-webpack-plugin": "^2.0.0", 41 | "file-loader": "^0.11.1", 42 | "friendly-errors-webpack-plugin": "^1.1.3", 43 | "html-webpack-plugin": "^2.28.0", 44 | "http-proxy-middleware": "^0.18.0", 45 | "opn": "^5.1.0", 46 | "optimize-css-assets-webpack-plugin": "^2.0.0", 47 | "ora": "^1.2.0", 48 | "rimraf": "^2.6.0", 49 | "semver": "^5.3.0", 50 | "shelljs": "^0.7.6", 51 | "standard": "^10.0.3", 52 | "url-loader": "^1.0.1", 53 | "vue-loader": "^12.1.0", 54 | "vue-style-loader": "^3.0.1", 55 | "vue-template-compiler": "^2.3.3", 56 | "webpack": "^2.6.1", 57 | "webpack-bundle-analyzer": "^2.13.1", 58 | "webpack-dev-middleware": "^1.10.0", 59 | "webpack-hot-middleware": "^2.18.0", 60 | "webpack-merge": "^4.1.0" 61 | }, 62 | "engines": { 63 | "node": ">= 4.0.0", 64 | "npm": ">= 3.0.0" 65 | }, 66 | "browserslist": [ 67 | "> 1%", 68 | "last 2 versions", 69 | "not ie <= 8" 70 | ] 71 | } 72 | -------------------------------------------------------------------------------- /src/components/base/morseCode/MorseCode.vue: -------------------------------------------------------------------------------- 1 | 29 | 72 | 75 | -------------------------------------------------------------------------------- /src/components/base/AdminComment.vue: -------------------------------------------------------------------------------- 1 | 43 | 44 | 90 | 91 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # TimRChen 个人小站 2 | > “生命短暂,最重要的是开开心心的活着啊” 3 | 4 | ## Todo 5 | 6 | - [x] 评论系统设计 7 | - [x] 评论管理界面 8 | - [x] 优化评论管理界面逻辑 9 | - [x] 优化文章管理界面逻辑 10 | - [x] 开发每日一读 11 | - [ ] 重新整体规划首页 12 | - [ ] 规划网站模块 13 | - [ ] 提高网站设计美感 14 | 15 | ### 1.9.6 16 | 17 | - 修改每日一文颜色选项集合 18 | 19 | ### 1.9.5 20 | 21 | - 修复了一些UI上的瑕疵 22 | 23 | ### 1.9.4 24 | 25 | - 增加RSS订阅模块 26 | - 知乎日报 27 | - 知乎热点 28 | - 掘金 29 | - 今日头条 30 | 31 | ### 1.9.3 32 | 33 | - 增加知乎日报阅读模块`new` 34 | 35 | ### 1.9.2 36 | 37 | - 淡出页面加载动画 38 | - 大屏设备首页显示效果 39 | 40 | ### 1.9.1 41 | 42 | - 优化首页卡顿问题 43 | - 移除历史遗留无用代码 44 | - 优化加载遮罩显示效果 45 | 46 | ### 1.9.0 `new` 47 | 48 | > 养生风格设计! 49 | - 重新设计整体界面风格 50 | - 优化网站交互,新版更加流畅 51 | 52 | ### 1.8.3 53 | 54 | - 优化整体效果 55 | - 解决某些移动设备上点击输入框显示不正确问题 56 | 57 | ### 1.8.2 58 | 59 | - 新增每日一读文章阅读 60 | - 优化整体交互体验 61 | 62 | ### 1.8.1 63 | 64 | - 摩斯电码加密工具 65 | 66 | ### 1.8.0 67 | 68 | - 重新设计整体样式风格 69 | - 响应式导航栏 70 | - 优化一些细节 71 | 72 | ### 1.7.3 73 | 74 | - 重新优化整体细节及界面风格 75 | - 修复了一些已知的问题 76 | 77 | ### 1.7.2 78 | 79 | - 优化了管理界面的细节 80 | 81 | ### 1.7.1 82 | 83 | - 集成了假的人工智能机器人 84 | 85 | ### 1.7.0 86 | 87 | - 增强评论功能 88 | - 评论可互相回复 89 | - 支持昵称持久化 `Web Storage` 90 | - 支持擦除昵称 91 | 92 | ### 1.6.2 93 | 94 | - 增加二维码生成工具 95 | - 替换二级菜单打开特效为渐变 96 | 97 | ### 1.6.1 98 | 99 | - 调整Extra板块的菜单层级 100 | - 增加二级菜单打开特效`big boom!` 101 | 102 | ### 1.6.0 103 | 104 | - 增加新闻模块`new!` 105 | 106 | ### 1.5.7 107 | 108 | - 增加CORS匹配多个URL逻辑 109 | 110 | ### 1.5.6 111 | 112 | - 优化文章代码显示效果 113 | - 优化文章海报及标题显示 114 | 115 | ### 1.5.5 116 | 117 | - 增加评论后台 118 | - 优化内容`new` 119 | - 更换文章阅读背景色 120 | - 调整评论区域编辑样式&交互 121 | - 替换About组件图片&title 122 | - 修改个人avator介绍语 123 | - 增加文章6位标识码于阅读量处 - `为方便评论后台管理` 124 | - 修复已知Bug 125 | - 移动端输入时会弹出Top按钮 126 | 127 | ### 1.5.0 128 | 129 | > 重磅更新! 130 | - 增加了评论系统 131 | - 增加违规词汇筛选数组 132 | - 净化评论内容 133 | - antixss 134 | 135 | ### 1.0.2 136 | 137 | - 增加网站favicon小图标 138 | - 更新footer样式 139 | - 增加友情链接 140 | - 备案号移动至底部 141 | - 更新文章详情页样式 142 | - 优化移动端显示效果 143 | - 优化字体缩进 144 | - 优化标题样式 145 | 146 | ### 1.0.1 147 | 148 | - 增加额外功能组件 149 | - 增加短链接生成服务`使用jsonp跨域请求获取数据` 150 | - 修复长连接有 `#` 情况下无法生成短链问题 151 | 152 | ### 1.0.0 153 | 154 | - 修改后台管理接口 155 | - 优化后台管理PC端显示效果 156 | - 增加页面底部备案号 157 | - 修改top颜色 158 | - 增加Star按钮 159 | - `上线前最后的部署准备` 160 | 161 | ### 0.0.9 162 | 163 | - 加入首页文章列表分页组件 164 | - 数字 + 前后导航 165 | 166 | ### 0.0.8 167 | 168 | - 首页文章列表大图点击进入文章 169 | - 优化文章列表动画加载方式 170 | - 改进文章列表动画效果 171 | - 将文章详情页标题与日期显示位置更改为px值定位 172 | - 登录界面输入账号密码后可直接回车登录验证 173 | 174 | ### 0.0.7 175 | 176 | - 移动端兼容处理 - 使用媒体查询增强竖屏下显示效果 177 | - 优化字体显示 178 | - 优化标题显示 179 | - 调整阴影显示策略 180 | 181 | ### 0.0.6 182 | 183 | - 文章管理页 `closed` 184 | - 渲染文章列表 185 | - 删除文章功能 186 | - 更新/编辑文章功能 187 | 188 | 189 | ### 0.0.5 patch 190 | 191 | - 组件间切换过渡动画`fade-in` 192 | - 管理界面加入小而美Hero标题框 193 | - 美化TOP按钮 194 | - 优化整体美感 195 | - 增加 About Me 介绍组件 196 | 197 | 198 | ### 0.0.5 199 | 200 | - 文章编辑页美化 `closed` 201 | - 文章内容展示美化 `closed` 202 | - 首页文章动画渲染优化 `closed` 203 | 204 | ### 0.0.4 205 | 206 | - 加入首页文章列表动画 `高斯渐变` & `方块浮显动画` & **`scroll事件特别优化`** 207 | - 优化 scroll 事件,列表渲染组件销毁后 scroll 事件销毁 208 | - 加入top返回页面最上动态逻辑 209 | - 进入文章详情组件自动滚动置页面顶部 210 | 211 | ### 0.0.3 212 | 213 | - 新建文章组件 214 | - 首页文章展示列表 215 | - 文章详情页 216 | 217 | 218 | ### 0.0.2 219 | 220 | - 完善前后端JWT验证机制 221 | - 注销登录 `closed` 222 | 223 | 224 | ### 0.0.1 225 | 226 | - 开发前端界面 227 | - 首页组件`closed` 228 | - Header Footer Body 229 | - 文章页组件`closed` 230 | - Essay 231 | - 后台管理页面`countinue` 232 | - user`countinue` 233 | - essaylist 234 | - edit essay 235 | 236 | - 完善路由跳转机制`closed` 237 | 238 | 239 | 240 | -------------------------------------------------------------------------------- /src/components/base/news/News.vue: -------------------------------------------------------------------------------- 1 | 46 | 83 | 125 | -------------------------------------------------------------------------------- /src/components/base/AdminEssay.vue: -------------------------------------------------------------------------------- 1 | 56 | 57 | 106 | 107 | -------------------------------------------------------------------------------- /src/components/base/rssHub/RSSHub.vue: -------------------------------------------------------------------------------- 1 | 54 | 114 | 115 | 130 | -------------------------------------------------------------------------------- /src/components/base/oneArticle/OneArticle.vue: -------------------------------------------------------------------------------- 1 | 13 | 91 | 133 | -------------------------------------------------------------------------------- /src/components/TimBody.vue: -------------------------------------------------------------------------------- 1 | 46 | 47 | 112 | 113 | 218 | -------------------------------------------------------------------------------- /src/components/base/Extra.vue: -------------------------------------------------------------------------------- 1 | 163 | 164 | 197 | 198 | -------------------------------------------------------------------------------- /src/components/base/EditEssay.vue: -------------------------------------------------------------------------------- 1 | 121 | 122 | 390 | 391 | 657 | --------------------------------------------------------------------------------