├── .babelrc ├── .gitignore ├── README.md ├── config.example.json ├── controller ├── api │ ├── article.js │ ├── edit.js │ └── page.js ├── app.js ├── index.js └── login.js ├── lib ├── assets.json ├── cache.js ├── makePromise.js └── render.js ├── model ├── article.js ├── articleList.js ├── page.js ├── postModel.js ├── quesModel.js ├── tags.js └── updatePost.js ├── package.json ├── tools ├── db.js ├── devServer.js ├── initServer.js ├── starter.js ├── webpack.config.dev.js └── webpack.config.prod.js └── view ├── actions ├── archive.js ├── article.js ├── page.js ├── tags.js └── toggleMobile.js ├── admin.jsx ├── assets ├── bin.svg ├── facebook.svg ├── font.css ├── github.css ├── github.svg ├── header.png ├── normalize.css └── tree_small.png ├── client.jsx ├── components ├── Comment │ └── index.jsx ├── ContentView │ ├── ContentView.sass │ └── index.jsx ├── DashMenu │ ├── DashMenu.sass │ └── index.jsx ├── Editor │ ├── Editor.sass │ └── index.jsx ├── FlexibleTextarea.jsx ├── ListTail │ ├── ListTail.sass │ └── index.jsx ├── ListView │ ├── ListView.sass │ └── index.jsx ├── LoadingAnimation │ ├── LoadingAnimation.sass │ └── index.jsx ├── PageTitle │ ├── PageTitle.sass │ └── index.jsx ├── Sidebar │ ├── Sidebar.sass │ └── index.jsx ├── TagList.jsx ├── Time │ ├── Time.sass │ └── index.jsx ├── TimeSection │ ├── TimeSection.sass │ └── index.jsx ├── Title │ └── index.jsx └── makeList.jsx ├── constants.js ├── containers ├── Root.jsx ├── admin │ ├── Dashboard.jsx │ ├── Dashboard.sass │ ├── Edit.jsx │ └── Profile.jsx └── app │ ├── Archives.jsx │ ├── Index.jsx │ ├── Page.jsx │ ├── Shell.jsx │ ├── Shell.sass │ ├── Single.jsx │ ├── TagArticle.jsx │ └── Tags.jsx ├── middleware.js ├── reducers ├── archive.js ├── article.js ├── index.js ├── navDisplay.js ├── page.js └── tags.js ├── routes.jsx ├── templates ├── admin.jade ├── client.jade └── login.jade └── utils ├── index.js └── scrollLoaderBundle.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": [ 3 | "transform-es2015-modules-commonjs", 4 | "transform-es2015-destructuring", 5 | "transform-es2015-parameters", 6 | "transform-async-to-generator", 7 | "transform-decorators-legacy" 8 | ], 9 | "presets": ["react"] 10 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/* 2 | build/* 3 | public/* 4 | view.ai 5 | .sass-cache/* 6 | *.cache 7 | *.swp 8 | jsconfig.json 9 | .idea/ 10 | tmp/ 11 | config.json 12 | npm-debug.log 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # blog-v4 2 | 3 | Deprecated. 4 | 5 | A blog system based on node.js, mongodb, react and redux, supporting isomorphic render. 6 | 7 | ## APIs 8 | 9 | - `/api/article` 10 | 11 | queries: start, limit, summary, break, bodySource, body 12 | 13 | `GET`: Give number of articles start at after sorted by time, together with `summary, break, bodySource, body` fields if queried. 14 | 15 | `POST`: Create new article. 16 | 17 | - `/api/article/` 18 | 19 | `GET`: Give the article ``. 20 | 21 | `POST`: Update article ``. 22 | 23 | - `/api/page` 24 | 25 | `GET`: Give all pages. 26 | 27 | `POST`: Create new page. 28 | 29 | - `/api/page/` 30 | 31 | `GET`: Give page <title> 32 | 33 | `POST`: Update page <title> 34 | 35 | - `/time` 36 | 37 | `GET`: Give all years since the first article published. 38 | 39 | - `/archive/<year>` 40 | 41 | `GET`: Give all articles published in <year> 42 | 43 | - `/tags` 44 | 45 | `GET`: Give all tags 46 | 47 | - `/tags/<tag>` 48 | 49 | `GET`: Give all articles in tag <tag> 50 | -------------------------------------------------------------------------------- /config.example.json: -------------------------------------------------------------------------------- 1 | { 2 | "admin": { 3 | "name": "fucker", 4 | "passwd": "123" 5 | }, 6 | "site": { 7 | "db": { 8 | "url": "mongodb://localhost/blog" 9 | } 10 | }, 11 | "server": { 12 | "port": 4000 13 | }, 14 | "view": { 15 | "path": "./view/templates/" 16 | }, 17 | "tpl_globals": { 18 | "static_path": "/static/" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /controller/api/article.js: -------------------------------------------------------------------------------- 1 | "use strict" 2 | 3 | import * as article from '../../model/article' 4 | 5 | import { 6 | getList, getByTime, firstYear 7 | } from '../../model/articleList' 8 | 9 | 10 | /** 11 | * Controllers about article 12 | * @type {Object} 13 | */ 14 | 15 | 16 | /** 17 | * Get single article by `_id` 18 | */ 19 | export function *single(id) { 20 | const source = this.query && this.query.source 21 | const data = yield this.query && this.query.hasOwnProperty('source') ? article.getSource(id) : article.getBody(id) 22 | this.send('json', data) 23 | } 24 | 25 | /** 26 | * Get list with fields in query 27 | */ 28 | export function *list() { 29 | const 30 | start = +this.query['start'] || 0, 31 | limit = +this.query['limit'], 32 | 33 | fields = ['summary', 'break', 'body', 'bodySource'].filter( 34 | v => this.query.hasOwnProperty(v)), 35 | 36 | list = yield getList(start, limit, fields) 37 | 38 | this.send('json', list) 39 | } 40 | 41 | // /** 42 | // * Get list with only title and time 43 | // */ 44 | // export function *titles() { 45 | // const 46 | // start = +this.query['start'] || 0, 47 | // limit = +this.query['limit'] || 5, 48 | // list = yield getList(start, limit) 49 | 50 | // this.send('json', list) 51 | // } 52 | 53 | /** 54 | * Get archive by time 55 | */ 56 | export function *archive(year) { 57 | // TODO: Get one year 58 | const start_time = new Date(+year, 0, 1).getTime() 59 | const end_time = new Date(+year + 1, 0, 1).getTime() 60 | const data = yield getByTime(start_time, end_time) 61 | this.send('json', data) 62 | } 63 | export function *years() { 64 | const first_year = yield firstYear() 65 | const cur = new Date().getFullYear() 66 | let list = [] 67 | for (let i = cur; i >= first_year; i--) { 68 | list.push(i) 69 | } 70 | this.send('json', list) 71 | } 72 | 73 | export function *remove(id) { 74 | yield article.remove(id) 75 | this.send({ 76 | status: 204 77 | }) 78 | } 79 | -------------------------------------------------------------------------------- /controller/api/edit.js: -------------------------------------------------------------------------------- 1 | import marked from 'marked' 2 | import formidable from 'formidable' 3 | import update from '../../model/updatePost' 4 | 5 | function getMarked(src) { 6 | return new Promise((res, rej) => { 7 | marked(src, 8 | (err, data) => err ? rej(err) : res(data)) 9 | }) 10 | } 11 | const parseForm = req => 12 | new Promise((res, rej) => { 13 | const form = new formidable.IncomingForm() 14 | form.parse(req, (err, fields, files) => { 15 | if (err) { 16 | console.error(err.message) 17 | this.error() 18 | } else { 19 | res({ fields, files }) 20 | } 21 | }) 22 | }) 23 | /** 24 | * Edit or create new article 25 | */ 26 | function *parseEdit() { 27 | const session = yield this.session() 28 | if (!session.data.auth) { 29 | return null 30 | } 31 | 32 | const 33 | { fields } = yield parseForm(this._req), 34 | marked_string = yield getMarked(fields.body), 35 | paras = marked_string.split('<!--more-->') 36 | 37 | let new_post = { 38 | title: fields.title, 39 | body: marked_string, 40 | bodySource: fields.body, 41 | summary: paras[0], 42 | break: !!paras[1] 43 | } 44 | 45 | if (fields.type) { 46 | new_post.type = fields.type 47 | } 48 | 49 | if (fields.tags) { 50 | if (fields.tags.slice(-1) === ';') { 51 | fields.tags = fields.tags.slice(0, -1) 52 | } 53 | new_post.tags = fields.tags.split(';').map(s => s.trim()) 54 | } 55 | 56 | return new_post 57 | } 58 | 59 | function *finishEdit(id, child, data) { 60 | console.log(arguments) 61 | try { 62 | if (child) { 63 | yield update(id, data) 64 | } else { 65 | yield update(data) 66 | } 67 | this.send({ 68 | status:201 69 | }) 70 | } catch(e) { 71 | console.log(e.stack) 72 | this.error(e, 500) 73 | } 74 | } 75 | 76 | export default type => function *(id, child) { 77 | const new_post = yield* parseEdit.call(this) 78 | if (type) { 79 | new_post.type = type 80 | } 81 | yield* finishEdit.call(this, id, child, new_post) 82 | } 83 | -------------------------------------------------------------------------------- /controller/api/page.js: -------------------------------------------------------------------------------- 1 | "use strict" 2 | 3 | import * as page from '../../model/page' 4 | 5 | export function *singlePage(title) { 6 | const data = yield page.getBody(title) 7 | data ? this.send('json', data) : this.error('not found', 404) 8 | } 9 | 10 | export function *pageList() { 11 | const 12 | start = +this.query['start'] || 0, 13 | limit = +this.query['limit'] || 5, 14 | list = yield page.getList(start, limit, ['summary', 'break']) 15 | 16 | this.send('json', list) 17 | 18 | } 19 | -------------------------------------------------------------------------------- /controller/app.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Provider } from 'react-redux' 3 | import { renderToString } from 'react-dom/server' 4 | import { match, RouterContext } from 'react-router' 5 | import { createStore, applyMiddleware } from 'redux' 6 | import reducer from '../view/reducers' 7 | import { apiFactory } from '../view/middleware' 8 | import routes from '../view/routes' 9 | import server from '../tools/initServer' 10 | import request from 'supertest' 11 | 12 | const getRendered = (store, state) => 13 | renderToString( 14 | <Provider store={ store }> 15 | <RouterContext { ...state } /> 16 | </Provider> 17 | ) 18 | 19 | const matchRouter = (location, routes) => { 20 | return new Promise((res, rej) => { 21 | match({ 22 | location, 23 | routes 24 | }, (error, redirectLocation, renderProps) => 25 | res({error, redirectLocation, renderProps})) 26 | }) 27 | } 28 | 29 | const makeRequest = (url, { method }) => 30 | new Promise((resolve, reject) => { 31 | request(server._server)[method](url) 32 | .end((err, res) => err ? reject(err) : resolve(res)) 33 | }).then(res => !res.error ? res.body : { 34 | err: res.res.statusMessage, 35 | code: res.statusCode, 36 | url: res.res.url 37 | }) 38 | 39 | export default function* () { 40 | const { 41 | 42 | error, 43 | redirectLocation, 44 | renderProps 45 | 46 | } = yield matchRouter(this.url.path, routes) 47 | 48 | if (error) { 49 | 50 | this.error(error.message, 500) 51 | 52 | } else if (redirectLocation) { 53 | 54 | const { pathname, search } = redirectLocation 55 | this.redirect(pathname + search) 56 | 57 | } else { 58 | const cache = this.cache.get(this.url.path) 59 | if (cache) { 60 | this.send('html', cache) 61 | return 62 | } 63 | const 64 | midd = applyMiddleware(apiFactory(makeRequest)), 65 | store = createStore(reducer, midd) 66 | const components = renderProps.components.filter(c => c && c.fetchData) 67 | yield Promise.all(components.map(c => 68 | c.fetchData(store, renderProps))) 69 | const 70 | rendered = getRendered(store, renderProps), 71 | initial_state = JSON.stringify(store.getState()) 72 | this.render('client', { 73 | rendered, 74 | initial_state 75 | }) 76 | } 77 | } -------------------------------------------------------------------------------- /controller/index.js: -------------------------------------------------------------------------------- 1 | import * as article from './api/article' 2 | import * as page from './api/page' 3 | import * as login from './login' 4 | 5 | import { tagList, tagArticle } from '../model/tags' 6 | 7 | import handleEdit from './api/edit' 8 | import app from './app' 9 | 10 | 11 | /** 12 | * Add routes to server 13 | */ 14 | export default function addRoutes(server) { 15 | 16 | const 17 | api = server.route('/api'), 18 | admin = server.route('/admin', function* (child) { 19 | const session = yield this.session() 20 | if (!session.data.auth) { 21 | this.redirect('/login') 22 | } else { 23 | yield* child 24 | } 25 | }) 26 | 27 | server.route('/*').get(app) 28 | server.route('/login') 29 | .get(login.get) 30 | .post(login.post) 31 | admin.route('/*').get(function* () { 32 | this.render('admin') 33 | }) 34 | 35 | api.route('/article') 36 | .get(article.list) 37 | 38 | api.route('/article/::') 39 | .get(article.single) 40 | 41 | api.route('/archive/::') 42 | .get(article.archive) 43 | 44 | api.route('/time') 45 | .get(article.years) 46 | 47 | /** 48 | * /api/page?start={}&limit={} 49 | */ 50 | api.route('/page') 51 | .get(page.pageList) 52 | api.route('/page/::') 53 | .get(page.singlePage) 54 | 55 | api.route('/tags') 56 | .get(function* () { 57 | this.send('json', yield tagList()) 58 | }) 59 | api.route('/tags/::') 60 | .get(function* (tag) { 61 | this.send('json', yield tagArticle(decodeURI(tag))) 62 | }) 63 | 64 | const edit = api.route('/edit', function* (child) { 65 | if (this.method !== 'get') { 66 | const session = yield this.session() 67 | console.log('edit: ', session.data) 68 | if (!session.data.auth) { 69 | return this.error('auth required', 403) 70 | } 71 | this.cache.clear() 72 | } 73 | yield* child 74 | }) 75 | edit.route('/article') 76 | .post(handleEdit('article')) 77 | edit.route('/page') 78 | .post(handleEdit('page')) 79 | edit.route('/::') 80 | .post(handleEdit()) 81 | .delete(article.remove) 82 | } 83 | 84 | -------------------------------------------------------------------------------- /controller/login.js: -------------------------------------------------------------------------------- 1 | import { parse } from 'querystring' 2 | 3 | import config from '../config' 4 | 5 | export function* get() { 6 | const { data: { auth }} = yield this.session() 7 | if (auth) { 8 | this.redirect('/admin') 9 | } 10 | this.render('login') 11 | } 12 | 13 | export function* post() { 14 | const { username, passwd } = parse(yield this.getBody()) 15 | if (username === config.admin.name && passwd === config.admin.pass) { 16 | const session = yield this.session() 17 | yield session.set({ 18 | auth: true 19 | }) 20 | this.send({ 21 | status: 303, 22 | headers: { 23 | Location: '/admin' 24 | } 25 | }) 26 | } else { 27 | this.render('login', { 28 | message: 'Wrong username or passwd' 29 | }) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lib/assets.json: -------------------------------------------------------------------------------- 1 | {"client":{"js":"/static/client.461bef8a4de72133ae20.js","css":"/static/client.461bef8a4de72133ae20.css"},"admin":{"js":"/static/admin.461bef8a4de72133ae20.js","css":"/static/admin.461bef8a4de72133ae20.css"}} -------------------------------------------------------------------------------- /lib/cache.js: -------------------------------------------------------------------------------- 1 | const cached = Symbol('data') 2 | const cache = { 3 | [cached]: {}, 4 | get(url) { 5 | return this[cached][url] 6 | }, 7 | set(url, str) { 8 | this[cached][url] = str 9 | }, 10 | clear() { 11 | this[cached] = {} 12 | } 13 | } 14 | 15 | export default conn => conn.cache = cache 16 | -------------------------------------------------------------------------------- /lib/makePromise.js: -------------------------------------------------------------------------------- 1 | export default db_cur => 2 | new Promise((res, rej) => { 3 | db_cur.exec((err, doc) => 4 | err ? rej(err) : res(doc)) 5 | }) -------------------------------------------------------------------------------- /lib/render.js: -------------------------------------------------------------------------------- 1 | import jade from 'jade' 2 | import path from 'path' 3 | 4 | function render(fn, data = {}) { 5 | const p = path.resolve(this.getConf('view').path, `${fn}.jade`) 6 | const fuck = jade.compileFile(p) 7 | console.log(process.env.NODE_ENV) 8 | if (process.env.NODE_ENV !== 'production') { 9 | data._staticPath = '' 10 | data._assets = this.getConf('bundle') 11 | } else { 12 | data._staticPath = this.getConf('cdn') 13 | data._assets = require('./assets.json') 14 | } 15 | const html = fuck(data) 16 | this.cache.set(this.url.path, html) 17 | return this.send('html', html) 18 | } 19 | 20 | export default conn => conn.render = render 21 | -------------------------------------------------------------------------------- /model/article.js: -------------------------------------------------------------------------------- 1 | import post from './postModel' 2 | 3 | export const getBody = (id) => 4 | post.findById(id, '-bodySource -summary -break -type').exec() 5 | 6 | export const getSource = (id) => 7 | post.findById(id).exec() 8 | 9 | export const remove = id => 10 | post.findOneAndRemove({ _id: id }).exec() 11 | -------------------------------------------------------------------------------- /model/articleList.js: -------------------------------------------------------------------------------- 1 | import post from './postModel' 2 | 3 | export function getList(start, limit, fields) { 4 | return post.fetchList(+start, +limit, fields) 5 | } 6 | 7 | export function getByTime(start, end) { 8 | const conditions = { 9 | type: 'article', 10 | createDate: { 11 | $gte: start, 12 | $lte: end 13 | } 14 | } 15 | return new Promise((res, rej) => { 16 | post.find(conditions, 17 | '_id title createDate tags') 18 | .sort({ createDate: -1 }) 19 | .exec((err, data) => err ? rej(err) : res(data)) 20 | }) 21 | } 22 | 23 | export function firstYear() { 24 | return new Promise((res, rej) => { 25 | post.find({ type: 'article' }) 26 | .sort({ createDate: 1 }) 27 | .select('createDate') 28 | .limit(1) 29 | .exec((err, data) => 30 | err ? rej(err) : res(new Date(data[0].createDate) 31 | .getFullYear())) 32 | }) 33 | } 34 | -------------------------------------------------------------------------------- /model/page.js: -------------------------------------------------------------------------------- 1 | import post from './postModel' 2 | import makePromise from '../lib/makePromise' 3 | 4 | export const getBody = (title) => 5 | post.findOne({ title: title }).exec() 6 | 7 | export const getList = (start, limit = 0) => 8 | post.fetchList(start, limit, [], { 9 | type: 'page' 10 | }) 11 | -------------------------------------------------------------------------------- /model/postModel.js: -------------------------------------------------------------------------------- 1 | import mongo, { Schema } from 'mongoose' 2 | 3 | const postSchema = new Schema({ 4 | title: String, 5 | summary: String, 6 | body: String, 7 | bodySource: String, 8 | createDate: { 9 | type: Number, 10 | default: Date.now 11 | }, 12 | editDate: { 13 | type: Number, 14 | default: Date.now 15 | }, 16 | tags: { 17 | type: [String], 18 | default: [] 19 | }, 20 | type: { 21 | type: String, 22 | default: 'article' 23 | }, 24 | break: { 25 | type: Boolean, 26 | default: false 27 | } 28 | }) 29 | 30 | let post = mongo.model('Post', postSchema) 31 | 32 | post.fetchList = function (start, limit, field, conditions) { 33 | const 34 | cond = conditions || { 35 | type: 'article' 36 | }, 37 | fields = ['_id', 'title', 'tags', 'createDate'].concat(field).join(' ') 38 | let cur = post.find(cond) 39 | .sort({ createDate: -1 }) 40 | .select(fields) 41 | .skip(start) 42 | if (limit) { 43 | cur.limit(limit) 44 | } 45 | return cur.exec() 46 | } 47 | 48 | export default post -------------------------------------------------------------------------------- /model/quesModel.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nameoverflow/blog-v4/59099db2a62fe5d4108484227b98409ba4bcfc2d/model/quesModel.js -------------------------------------------------------------------------------- /model/tags.js: -------------------------------------------------------------------------------- 1 | import post from './postModel' 2 | import makePromise from '../lib/makePromise' 3 | 4 | export const tagList = () => 5 | post.distinct('tags', {}).exec() 6 | 7 | export const tagArticle = tag => 8 | post.find({ tags: { "$in" : [tag] }}).sort({ createDate: -1 }).exec() 9 | -------------------------------------------------------------------------------- /model/updatePost.js: -------------------------------------------------------------------------------- 1 | import post from './postModel' 2 | import makePromise from '../lib/makePromise' 3 | 4 | export default function (id, data) { 5 | if (data) { 6 | return post.update({ _id: id }, data).exec() 7 | } else { 8 | data = id 9 | data['editDate'] = Date.now() 10 | return new post(data).save() 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "blog-v4", 3 | "version": "1.0.0", 4 | "description": "blog", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "mocha", 8 | "start": "node tools/starter", 9 | "start_win": "set NODE_ENV=production&&node tools/starter", 10 | "dev": "node tools/devServer.js", 11 | "deploy": "./node_modules/.bin/webpack -p --config ./tools/webpack.config.prod.js", 12 | "forever": "export NODE_ENV=production && forever start tools/starter.js" 13 | }, 14 | "author": "hcyue", 15 | "license": "MIT", 16 | "dependencies": { 17 | "babel-core": "^6.5.2", 18 | "babel-plugin-transform-async-to-generator": "^6.5.0", 19 | "babel-plugin-transform-decorators": "^6.5.0", 20 | "babel-plugin-transform-decorators-legacy": "^1.3.4", 21 | "babel-polyfill": "^6.5.0", 22 | "babel-preset-es2015": "^6.5.0", 23 | "babel-preset-react": "^6.5.0", 24 | "babel-register": "^6.5.2", 25 | "eliter": "^0.2.0", 26 | "formidable": "^1.0.17", 27 | "isomorphic-fetch": "^2.2.1", 28 | "jade": "^1.11.0", 29 | "marked": "^0.3.5", 30 | "mongoose": "^4.4.4", 31 | "pygmentize-bundled": "^2.3.0", 32 | "react": "^0.14.7", 33 | "react-addons-css-transition-group": "^0.14.7", 34 | "react-dom": "^0.14.7", 35 | "react-redux": "^4.4.0", 36 | "react-router": "^2.0.0", 37 | "react-router-redux": "^4.0.0", 38 | "redux": "^3.3.1", 39 | "supertest": "^1.2.0" 40 | }, 41 | "devDependencies": { 42 | "assets-webpack-plugin": "^3.4.0", 43 | "babel-loader": "^6.2.3", 44 | "css-loader": "^0.23.1", 45 | "eslint-plugin-react": "^3.6.2", 46 | "extract-text-webpack-plugin": "^1.0.1", 47 | "file-loader": "^0.8.5", 48 | "node-sass": "^3.4.2", 49 | "react-hot-loader": "^1.3.0", 50 | "redux-devtools": "^3.1.1", 51 | "sass-loader": "^3.1.2", 52 | "style-loader": "^0.13.0", 53 | "url-loader": "^0.5.7", 54 | "webpack": "^1.12.2", 55 | "webpack-dev-server": "^1.12.1" 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /tools/db.js: -------------------------------------------------------------------------------- 1 | import mongo, { Schema } from 'mongoose' 2 | import _conf from '../config' 3 | 4 | const { site: { db: conf } } = _conf 5 | 6 | let db = mongo.connection 7 | 8 | db.on('error', (err) => { 9 | throw new Error(`Mongoose connection error: ${err}`) 10 | }) 11 | 12 | db.on('connnected', () => { 13 | console.log('Mongoose connected') 14 | }) 15 | 16 | db.on('disconnnected', () => { 17 | console.log('Mongoose disconnected') 18 | }) 19 | 20 | 21 | process.on('SIGINT', () => { 22 | mongo.connection.close(() => { 23 | console.log('Mongoose disconnected through app termination') 24 | process.exit(0) 25 | }) 26 | }) 27 | 28 | mongo.connect(conf.url) 29 | 30 | 31 | -------------------------------------------------------------------------------- /tools/devServer.js: -------------------------------------------------------------------------------- 1 | var webpack = require('webpack') 2 | var WebpackDevServer = require('webpack-dev-server') 3 | var dev_config = require('./webpack.config.dev') 4 | 5 | process.env.NODE_ENV = 'development' 6 | require('./starter') 7 | new WebpackDevServer(webpack(dev_config), { 8 | publicPath: dev_config.output.publicPath, 9 | hot: true, 10 | historyApiFallback: true, 11 | proxy: { 12 | "/": "http://127.0.0.1:4000", 13 | "/admin*": "http://127.0.0.1:4000", 14 | "/login": "http://127.0.0.1:4000", 15 | "/archives": "http://127.0.0.1:4000", 16 | "/lab": "http://127.0.0.1:4000", 17 | "/about": "http://127.0.0.1:4000", 18 | "/article*": "http://127.0.0.1:4000", 19 | "/tags*": "http://127.0.0.1:4000", 20 | "/api*": "http://127.0.0.1:4000" 21 | } 22 | }).listen(3000, 'localhost', function (err, result) { 23 | if (err) { 24 | console.log(err); 25 | } 26 | 27 | console.log('WebpackDevServer Listening at localhost:3000'); 28 | }); -------------------------------------------------------------------------------- /tools/initServer.js: -------------------------------------------------------------------------------- 1 | "use strict" 2 | import eliter from 'eliter' 3 | import pygment from 'pygmentize-bundled' 4 | import marked from 'marked' 5 | import config from '../config.json' 6 | import addRoutes from '../controller' 7 | import render from '../lib/render' 8 | import cache from '../lib/cache' 9 | 10 | import './db' 11 | 12 | const server = new eliter(config) 13 | 14 | server.with(render) 15 | server.with(cache) 16 | 17 | marked.setOptions({ 18 | highlight(code, lang, callback) { 19 | pygment({ 20 | lang: lang, 21 | format: 'html', 22 | options: { 23 | encoding: 'utf-8' 24 | } 25 | }, code, (err, res) => 26 | callback(err, res && res.toString())) 27 | } 28 | }) 29 | 30 | addRoutes(server) 31 | 32 | export default server 33 | -------------------------------------------------------------------------------- /tools/starter.js: -------------------------------------------------------------------------------- 1 | "use strict" 2 | require("babel-register") 3 | const conf = require('../config') 4 | const server = require('./initServer').default 5 | 6 | server.start(conf.server.port) 7 | -------------------------------------------------------------------------------- /tools/webpack.config.dev.js: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | var webpack = require('webpack'); 3 | var ExtractTextPlugin = require('extract-text-webpack-plugin') 4 | 5 | 6 | var root_path = path.join(__dirname, '..') 7 | var view_src = path.join(root_path, 'view') 8 | 9 | var babel_loader = 'babel?presets[]=react,presets[]=es2015,plugins[]=transform-async-to-generator,plugins[]=transform-decorators-legacy' 10 | 11 | module.exports = { 12 | devtool: 'eval', 13 | entry: { 14 | client: [ 15 | 'webpack-dev-server/client?http://localhost:3000', 16 | 'webpack/hot/only-dev-server', 17 | path.join(view_src, 'client.jsx') 18 | ], 19 | admin: [ 20 | 'webpack-dev-server/client?http://localhost:3000', 21 | 'webpack/hot/only-dev-server', 22 | path.join(view_src, 'admin.jsx') 23 | ] 24 | }, 25 | output: { 26 | path: path.join(root_path, 'public'), 27 | filename: '[name].js', 28 | publicPath: '/static/' 29 | }, 30 | plugins: [ 31 | new webpack.HotModuleReplacementPlugin(), 32 | ], 33 | module: { 34 | loaders: [{ 35 | test: /\.jsx$/, 36 | loaders: ['react-hot', babel_loader], 37 | include: path.join(__dirname, '../view') 38 | }, { 39 | test: /\.js$/, 40 | loaders: [babel_loader], 41 | include: path.join(__dirname, '../view') 42 | }, { 43 | test: /\.sass$/, 44 | loaders: ["style", "css", "sass?indentedSyntax"] 45 | }, { 46 | test: /\.s?css$/, 47 | loaders: ["style", "css", "sass"] 48 | }, { 49 | test: /\.png$/, 50 | loader: "url?limit=100000" 51 | }, { 52 | test: /\.(jpg|svg)$/, 53 | loader: "file?name=[name].[ext]" 54 | }] 55 | }, 56 | resolve: { 57 | extensions: ['.js', '.jsx', ''] 58 | } 59 | } -------------------------------------------------------------------------------- /tools/webpack.config.prod.js: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | var webpack = require('webpack'); 3 | var ExtractTextPlugin = require('extract-text-webpack-plugin') 4 | var AssetsPlugin = require('assets-webpack-plugin') 5 | 6 | var root_path = path.join(__dirname, '..') 7 | var view_src = path.join(root_path, 'view') 8 | var babel_loader = 'babel?presets[]=react,presets[]=es2015,plugins[]=transform-async-to-generator,plugins[]=transform-decorators-legacy' 9 | 10 | module.exports = { 11 | entry: { 12 | client: path.join(view_src, 'client.jsx'), 13 | admin: path.join(view_src, 'admin.jsx') 14 | }, 15 | output: { 16 | path: path.join(root_path, 'public'), 17 | filename: '[name].[hash].js', 18 | publicPath: '/static/' 19 | }, 20 | plugins: [ 21 | new ExtractTextPlugin('[name].[hash].css'), 22 | new webpack.DefinePlugin({ 23 | 'process.env.NODE_ENV': '"production"' 24 | }), 25 | new AssetsPlugin({ 26 | path: path.join(root_path, 'lib'), 27 | filename: 'assets.json' 28 | }) 29 | ], 30 | module: { 31 | loaders: [{ 32 | test: /\.jsx$/, 33 | loaders: [babel_loader], 34 | include: path.join(__dirname, '../view') 35 | }, { 36 | test: /\.js$/, 37 | loaders: [babel_loader], 38 | include: path.join(__dirname, '../view') 39 | }, { 40 | test: /\.sass$/, 41 | loader: ExtractTextPlugin.extract("style", ["css", "sass?indentedSyntax"]) 42 | }, { 43 | test: /\.s?css$/, 44 | loader: ExtractTextPlugin.extract("style", ["css", "sass"]) 45 | }, { 46 | test: /\.png$/, 47 | loader: "url?limit=100000" 48 | }, { 49 | test: /\.(jpg|svg)$/, 50 | loader: "file?name=[name].[ext]" 51 | }] 52 | }, 53 | resolve: { 54 | extensions: ['.js', '.jsx', ''] 55 | } 56 | }; -------------------------------------------------------------------------------- /view/actions/archive.js: -------------------------------------------------------------------------------- 1 | import { 2 | GET_YEARS_SUCCESS, 3 | GET_YEARS_FAILURE, 4 | GET_ARCHIVE_SUCCESS, 5 | GET_ARCHIVE_FAILURE, 6 | TOGGLE_TIME_SECTION, 7 | URL_API 8 | } from '../constants' 9 | import { CALL_API } from '../middleware' 10 | 11 | export const loadYears = () => { 12 | const url = `${URL_API}/time` 13 | return { 14 | [CALL_API]: { 15 | method: 'get', 16 | url: url, 17 | success: GET_YEARS_SUCCESS, 18 | fail: GET_YEARS_FAILURE 19 | } 20 | } 21 | } 22 | 23 | export const loadArchive = time => ({ 24 | [CALL_API]: { 25 | method: 'get', 26 | url: `${URL_API}/archive/${time}`, 27 | success: GET_ARCHIVE_SUCCESS, 28 | fail: GET_ARCHIVE_FAILURE, 29 | extra: time 30 | } 31 | }) 32 | 33 | export const toggleTimeSect = time => ({ 34 | type: TOGGLE_TIME_SECTION, 35 | selection: time 36 | }) 37 | -------------------------------------------------------------------------------- /view/actions/article.js: -------------------------------------------------------------------------------- 1 | import { 2 | GET_INDEX_SUCCESS, 3 | GET_INDEX_FAILURE, 4 | 5 | GET_SINGLE_SUCCESS, 6 | GET_SINGLE_FAILURE, 7 | 8 | ENTITIES_PER_PAGE, 9 | 10 | CLEAR_SINGLE, 11 | 12 | URL_ARTICLE 13 | } from '../constants' 14 | import { CALL_API } from '../middleware' 15 | 16 | export const loadIndex = (start = 0, limit = 10) => { 17 | const url = `${URL_ARTICLE}?start=${start}&limit=${limit}&summary&break` 18 | return { 19 | [CALL_API]: { 20 | method: 'get', 21 | url: url, 22 | success: GET_INDEX_SUCCESS, 23 | fail: GET_INDEX_FAILURE 24 | } 25 | } 26 | } 27 | 28 | 29 | export const loadSingle = id => { 30 | const url = `${URL_ARTICLE}/${id}` 31 | return { 32 | [CALL_API]: { 33 | method: 'get', 34 | url: url, 35 | success: GET_SINGLE_SUCCESS, 36 | fail: GET_SINGLE_FAILURE 37 | } 38 | } 39 | } 40 | 41 | 42 | export const clearSingle = () => ({ 43 | type: CLEAR_SINGLE 44 | }) 45 | -------------------------------------------------------------------------------- /view/actions/page.js: -------------------------------------------------------------------------------- 1 | import { 2 | GET_PAGE_SUCCESS, 3 | GET_PAGE_FAILURE, 4 | 5 | GET_PAGE_LIST_SUCCESS, 6 | GET_PAGE_LIST_FAILURE, 7 | 8 | URL_API 9 | } from '../constants' 10 | import { CALL_API } from '../middleware' 11 | 12 | export const loadPage = title => { 13 | const url = `${URL_API}/page/${title}` 14 | return { 15 | [CALL_API]: { 16 | method: 'get', 17 | url: url, 18 | success: GET_PAGE_SUCCESS, 19 | fail: GET_PAGE_FAILURE, 20 | extra: { 21 | title 22 | } 23 | } 24 | } 25 | } 26 | 27 | export const loadPageList = (start, limit) => { 28 | const url = `${URL_API}/page?start=${start}&limit=${limit}` 29 | return { 30 | [CALL_API]: { 31 | method: 'get', 32 | url: url, 33 | success: GET_PAGE_LIST_SUCCESS, 34 | fail: GET_PAGE_LIST_FAILURE 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /view/actions/tags.js: -------------------------------------------------------------------------------- 1 | import { 2 | GET_TAGS_SUCCESS, 3 | GET_TAGS_FAILURE, 4 | 5 | GET_TAG_ARTICLE_SUCCESS, 6 | GET_TAG_ARTICLE_FAILURE, 7 | 8 | URL_API 9 | } from '../constants' 10 | import { CALL_API } from '../middleware' 11 | 12 | export const loadTags = () => { 13 | const url = `${URL_API}/tags` 14 | return { 15 | [CALL_API]: { 16 | method: 'get', 17 | url: url, 18 | success: GET_TAGS_SUCCESS, 19 | fail: GET_TAGS_FAILURE 20 | } 21 | } 22 | } 23 | 24 | export const loadTagArticle = (tag, start = 0, limit = 10) => { 25 | const url = `${URL_API}/tags/${tag}?start=${start}&limit=${limit}` 26 | return { 27 | [CALL_API]: { 28 | method: 'get', 29 | url: url, 30 | success: GET_TAG_ARTICLE_SUCCESS, 31 | fail: GET_TAG_ARTICLE_FAILURE, 32 | extra: { 33 | tagName: tag, 34 | expCount: 10 35 | } 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /view/actions/toggleMobile.js: -------------------------------------------------------------------------------- 1 | import { 2 | TOGGLE_NAV 3 | } from '../constants' 4 | 5 | export () => { 6 | return { 7 | type: TOGGLE_NAV 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /view/admin.jsx: -------------------------------------------------------------------------------- 1 | import "babel-polyfill" 2 | 3 | import React from 'react' 4 | import { render } from 'react-dom' 5 | import { 6 | match, 7 | Route, 8 | Router, 9 | IndexRoute, 10 | browserHistory 11 | } from 'react-router' 12 | 13 | import Dashboard from './containers/admin/Dashboard' 14 | import Profile from './containers/admin/Profile' 15 | import Edit from './containers/admin/Edit' 16 | import Root from './containers/Root' 17 | 18 | 19 | const routes = ( 20 | <Route path="/admin" component={Dashboard}> 21 | <IndexRoute component={Profile} name='profile'/> 22 | <Route path="page" component={Profile} name="page"/> 23 | <Route path="new" component={Edit}> 24 | <Route path="article" name='newArticle'/> 25 | <Route path="page" name='newPage'/> 26 | </Route> 27 | <Route path="edit/:id" component={Edit} name="edit"/> 28 | </Route> 29 | ) 30 | 31 | 32 | render(<Router history={ browserHistory } routes={ routes } /> 33 | , document.getElementById('client')) 34 | 35 | -------------------------------------------------------------------------------- /view/assets/bin.svg: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <!-- Generated by IcoMoon.io --> 3 | <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 4 | <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32"> 5 | <path fill="#444" d="M4 10v20c0 1.1 0.9 2 2 2h18c1.1 0 2-0.9 2-2v-20h-22zM10 28h-2v-14h2v14zM14 28h-2v-14h2v14zM18 28h-2v-14h2v14zM22 28h-2v-14h2v14z"></path> 6 | <path fill="#444" d="M26.5 4h-6.5v-2.5c0-0.825-0.675-1.5-1.5-1.5h-7c-0.825 0-1.5 0.675-1.5 1.5v2.5h-6.5c-0.825 0-1.5 0.675-1.5 1.5v2.5h26v-2.5c0-0.825-0.675-1.5-1.5-1.5zM18 4h-6v-1.975h6v1.975z"></path> 7 | </svg> 8 | -------------------------------------------------------------------------------- /view/assets/facebook.svg: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <!-- Generated by IcoMoon.io --> 3 | <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 4 | <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="512" height="512" viewBox="0 0 512 512"> 5 | <g id="icomoon-ignore"> 6 | </g> 7 | <path d="M464 0h-416c-26.4 0-48 21.6-48 48v416c0 26.4 21.6 48 48 48h208v-224h-64v-64h64v-32c0-52.9 43.1-96 96-96h64v64h-64c-17.6 0-32 14.4-32 32v32h96l-16 64h-80v224h144c26.4 0 48-21.6 48-48v-416c0-26.4-21.6-48-48-48z"></path> 8 | </svg> 9 | -------------------------------------------------------------------------------- /view/assets/font.css: -------------------------------------------------------------------------------- 1 | /*{"c":"2016-03-24T06:11:01Z","s":"prod-origin-043f26a4","v":"7e355f"}*/ 2 | /* 3 | * The Typekit service used to deliver this font or fonts for use on websites 4 | * is provided by Adobe and is subject to these Terms of Use 5 | * http://www.adobe.com/products/eulas/tou_typekit. For font license 6 | * information, see the list below. 7 | * 8 | * brandon-grotesque: 9 | * - http://typekit.com/eulas/0000000000000000000132dd 10 | * - http://typekit.com/eulas/0000000000000000000132e3 11 | * 12 | * (c) 2009-2016 Adobe Systems Incorporated. All Rights Reserved. 13 | */ 14 | 15 | @font-face { 16 | font-family: "brandon-grotesque"; 17 | src: url(data:font/opentype;base64,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); 18 | font-style: normal; 19 | font-weight: 300; 20 | } 21 | 22 | @font-face { 23 | font-family: "brandon-grotesque"; 24 | src: url(data:font/opentype;base64,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); 25 | font-style: normal; 26 | font-weight: 700; 27 | } 28 | -------------------------------------------------------------------------------- /view/assets/github.css: -------------------------------------------------------------------------------- 1 | /* 2 | * GitHub style for Pygments 3 | * Courtesy of GitHub.com 4 | */ 5 | 6 | .hll { background-color: #f8f8f8; border: 1px solid #ccc; padding: 6px 10px; border-radius: 3px; } 7 | .c { color: #999988; font-style: italic; } 8 | .err { color: #a61717; background-color: #e3d2d2; } 9 | .k { font-weight: bold; } 10 | .o { font-weight: bold; } 11 | .cm { color: #999988; font-style: italic; } 12 | .cp { color: #999999; font-weight: bold; } 13 | .c1 { color: #999988; font-style: italic; } 14 | .cs { color: #999999; font-weight: bold; font-style: italic; } 15 | .gd { color: #000000; background-color: #ffdddd; } 16 | .gd .x { color: #000000; background-color: #ffaaaa; } 17 | .ge { font-style: italic; } 18 | .gr { color: #aa0000; } 19 | .gh { color: #999999; } 20 | .gi { color: #000000; background-color: #ddffdd; } 21 | .gi .x { color: #000000; background-color: #aaffaa; } 22 | .go { color: #888888; } 23 | .gp { color: #555555; } 24 | .gs { font-weight: bold; } 25 | .gu { color: #800080; font-weight: bold; } 26 | .gt { color: #aa0000; } 27 | .kc { font-weight: bold; } 28 | .kd { font-weight: bold; } 29 | .kn { font-weight: bold; } 30 | .kp { font-weight: bold; } 31 | .kr { font-weight: bold; } 32 | .kt { color: #445588; font-weight: bold; } 33 | .m { color: #009999; } 34 | .s { color: #dd1144; } 35 | .n { color: #333333; } 36 | .na { color: teal; } 37 | .nb { color: #0086b3; } 38 | .nc { color: #445588; font-weight: bold; } 39 | .no { color: teal; } 40 | .ni { color: purple; } 41 | .ne { color: #990000; font-weight: bold; } 42 | .nf { color: #990000; font-weight: bold; } 43 | .nn { color: #555555; } 44 | .nt { color: navy; } 45 | .nv { color: teal; } 46 | .ow { font-weight: bold; } 47 | .w { color: #bbbbbb; } 48 | .mf { color: #009999; } 49 | .mh { color: #009999; } 50 | .mi { color: #009999; } 51 | .mo { color: #009999; } 52 | .sb { color: #dd1144; } 53 | .sc { color: #dd1144; } 54 | .sd { color: #dd1144; } 55 | .s2 { color: #dd1144; } 56 | .se { color: #dd1144; } 57 | .sh { color: #dd1144; } 58 | .si { color: #dd1144; } 59 | .sx { color: #dd1144; } 60 | .sr { color: #009926; } 61 | .s1 { color: #dd1144; } 62 | .ss { color: #990073; } 63 | .bp { color: #999999; } 64 | .vc { color: teal; } 65 | .vg { color: teal; } 66 | .vi { color: teal; } 67 | .il { color: #009999; } 68 | .gc { color: #999; background-color: #EAF2F5; } -------------------------------------------------------------------------------- /view/assets/github.svg: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="utf-8"?> 2 | <!-- Generated by IcoMoon.io --> 3 | <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 4 | <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="512" height="512" viewBox="0 0 512 512"> 5 | <g id="icomoon-ignore"> 6 | </g> 7 | <path d="M256.004 6.321c-141.369 0-256.004 114.609-256.004 255.999 0 113.107 73.352 209.066 175.068 242.918 12.793 2.369 17.496-5.555 17.496-12.316 0-6.102-0.24-26.271-0.348-47.662-71.224 15.488-86.252-30.205-86.252-30.205-11.641-29.588-28.424-37.458-28.424-37.458-23.226-15.889 1.755-15.562 1.755-15.562 25.7 1.805 39.238 26.383 39.238 26.383 22.836 39.135 59.888 27.82 74.502 21.279 2.294-16.543 8.926-27.84 16.253-34.232-56.865-6.471-116.638-28.425-116.638-126.516 0-27.949 10.002-50.787 26.38-68.714-2.658-6.45-11.427-32.486 2.476-67.75 0 0 21.503-6.876 70.42 26.245 20.418-5.674 42.318-8.518 64.077-8.617 21.751 0.099 43.668 2.943 64.128 8.617 48.867-33.122 70.328-26.245 70.328-26.245 13.936 35.264 5.175 61.3 2.518 67.75 16.41 17.928 26.347 40.766 26.347 68.714 0 98.327-59.889 119.975-116.895 126.312 9.182 7.945 17.362 23.523 17.362 47.406 0 34.254-0.298 61.822-0.298 70.254 0 6.814 4.611 14.797 17.586 12.283 101.661-33.888 174.921-129.813 174.921-242.884 0-141.39-114.617-255.999-255.996-255.999z"></path> 8 | </svg> 9 | -------------------------------------------------------------------------------- /view/assets/header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nameoverflow/blog-v4/59099db2a62fe5d4108484227b98409ba4bcfc2d/view/assets/header.png -------------------------------------------------------------------------------- /view/assets/normalize.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ 2 | 3 | /** 4 | * 1. Set default font family to sans-serif. 5 | * 2. Prevent iOS and IE text size adjust after device orientation change, 6 | * without disabling user zoom. 7 | */ 8 | 9 | html { 10 | font-family: sans-serif; /* 1 */ 11 | -ms-text-size-adjust: 100%; /* 2 */ 12 | -webkit-text-size-adjust: 100%; /* 2 */ 13 | } 14 | 15 | /** 16 | * Remove default margin. 17 | */ 18 | 19 | body { 20 | margin: 0; 21 | } 22 | 23 | /* HTML5 display definitions 24 | ========================================================================== */ 25 | 26 | /** 27 | * Correct `block` display not defined for any HTML5 element in IE 8/9. 28 | * Correct `block` display not defined for `details` or `summary` in IE 10/11 29 | * and Firefox. 30 | * Correct `block` display not defined for `main` in IE 11. 31 | */ 32 | 33 | article, 34 | aside, 35 | details, 36 | figcaption, 37 | figure, 38 | footer, 39 | header, 40 | main, 41 | menu, 42 | nav, 43 | section, 44 | summary { 45 | display: block; 46 | } 47 | 48 | /** 49 | * 1. Correct `inline-block` display not defined in IE 8/9. 50 | * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. 51 | */ 52 | 53 | audio, 54 | canvas, 55 | progress, 56 | video { 57 | display: inline-block; /* 1 */ 58 | vertical-align: baseline; /* 2 */ 59 | } 60 | 61 | /** 62 | * Prevent displaying `audio` without controls in Mobile Safari 4/5/6/7. 63 | */ 64 | 65 | audio:not([controls]) { 66 | display: none; 67 | height: 0; 68 | } 69 | 70 | /** 71 | * Address `[hidden]` styling not present in IE 8/9/10. 72 | * Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22. 73 | */ 74 | 75 | [hidden], 76 | template { 77 | display: none; 78 | } 79 | 80 | /* Links 81 | ========================================================================== */ 82 | 83 | /** 84 | * Remove the gray background color from active links in IE 10. 85 | */ 86 | 87 | a { 88 | background-color: transparent; 89 | } 90 | 91 | /** 92 | * Improve readability of focused elements when they are also in an 93 | * active/hover state. 94 | */ 95 | 96 | a:active, 97 | a:hover { 98 | outline: 0; 99 | } 100 | 101 | /* Text-level semantics 102 | ========================================================================== */ 103 | 104 | /** 105 | * Address inconsistent styling of `abbr[title]`. 106 | * 1. Correct styling in Firefox 39 and Opera 12. 107 | * 2. Correct missing styling in Chrome, Edge, IE, Opera, and Safari. 108 | */ 109 | 110 | abbr[title] { 111 | border-bottom: none; /* 1 */ 112 | text-decoration: underline; /* 2 */ 113 | text-decoration: underline dotted; /* 2 */ 114 | } 115 | 116 | /** 117 | * Address inconsistent styling of b and strong. 118 | * 1. Correct duplicate application of `bolder` in Safari 6.0.2. 119 | * 2. Correct style set to `bold` in Edge 12+, Safari 6.2+, and Chrome 18+. 120 | */ 121 | 122 | b, 123 | strong { 124 | font-weight: inherit; /* 1 */ 125 | } 126 | 127 | b, 128 | strong { 129 | font-weight: bolder; /* 2 */ 130 | } 131 | 132 | /** 133 | * Address styling not present in Safari and Chrome. 134 | */ 135 | 136 | dfn { 137 | font-style: italic; 138 | } 139 | 140 | /** 141 | * Address variable `h1` font-size and margin within `section` and `article` 142 | * contexts in Firefox 4+, Safari, and Chrome. 143 | */ 144 | 145 | h1 { 146 | font-size: 2em; 147 | margin: 0.67em 0; 148 | } 149 | 150 | /** 151 | * Address styling not present in IE 8/9. 152 | */ 153 | 154 | mark { 155 | background-color: #ff0; 156 | color: #000; 157 | } 158 | 159 | /** 160 | * Address inconsistent and variable font size in all browsers. 161 | */ 162 | 163 | small { 164 | font-size: 80%; 165 | } 166 | 167 | /** 168 | * Prevent `sub` and `sup` affecting `line-height` in all browsers. 169 | */ 170 | 171 | sub, 172 | sup { 173 | font-size: 75%; 174 | line-height: 0; 175 | position: relative; 176 | vertical-align: baseline; 177 | } 178 | 179 | sup { 180 | top: -0.5em; 181 | } 182 | 183 | sub { 184 | bottom: -0.25em; 185 | } 186 | 187 | /* Embedded content 188 | ========================================================================== */ 189 | 190 | /** 191 | * Remove border when inside `a` element in IE 8/9/10. 192 | */ 193 | 194 | img { 195 | border: 0; 196 | } 197 | 198 | /** 199 | * Correct overflow not hidden in IE 9/10/11. 200 | */ 201 | 202 | svg:not(:root) { 203 | overflow: hidden; 204 | } 205 | 206 | /* Grouping content 207 | ========================================================================== */ 208 | 209 | /** 210 | * Address margin not present in IE 8/9 and Safari. 211 | */ 212 | 213 | figure { 214 | margin: 1em 40px; 215 | } 216 | 217 | /** 218 | * Address inconsistent styling of `hr`. 219 | * 1. Correct `box-sizing` set to `border-box` in Firefox. 220 | * 2. Correct `overflow` set to `hidden` in IE 8/9/10/11 and Edge 12. 221 | */ 222 | 223 | hr { 224 | box-sizing: content-box; /* 1 */ 225 | height: 0; /* 1 */ 226 | overflow: visible; /* 2 */ 227 | } 228 | 229 | /** 230 | * Contain overflow in all browsers. 231 | */ 232 | 233 | pre { 234 | overflow: auto; 235 | } 236 | 237 | /** 238 | * 1. Correct inheritance and scaling of font-size for preformatted text. 239 | * 2. Address odd `em`-unit font size rendering in all browsers. 240 | */ 241 | 242 | code, 243 | kbd, 244 | pre, 245 | samp { 246 | font-family: monospace, monospace; /* 1 */ 247 | font-size: 1em; /* 2 */ 248 | } 249 | 250 | /* Forms 251 | ========================================================================== */ 252 | 253 | /** 254 | * Known limitation: by default, Chrome and Safari on OS X allow very limited 255 | * styling of `select`, unless a `border` property is set. 256 | */ 257 | 258 | /** 259 | * 1. Correct font properties not being inherited. 260 | * 2. Address margins set differently in Firefox 4+, Safari, and Chrome. 261 | */ 262 | 263 | button, 264 | input, 265 | optgroup, 266 | select, 267 | textarea { 268 | font: inherit; /* 1 */ 269 | margin: 0; /* 2 */ 270 | } 271 | 272 | /** 273 | * Address `overflow` set to `hidden` in IE 8/9/10/11. 274 | */ 275 | 276 | button { 277 | overflow: visible; 278 | } 279 | 280 | /** 281 | * Address inconsistent `text-transform` inheritance for `button` and `select`. 282 | * All other form control elements do not inherit `text-transform` values. 283 | * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. 284 | * Correct `select` style inheritance in Firefox. 285 | */ 286 | 287 | button, 288 | select { 289 | text-transform: none; 290 | } 291 | 292 | /** 293 | * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` 294 | * and `video` controls. 295 | * 2. Correct inability to style clickable `input` types in iOS. 296 | * 3. Improve usability and consistency of cursor style between image-type 297 | * `input` and others. 298 | */ 299 | 300 | button, 301 | html input[type="button"], /* 1 */ 302 | input[type="reset"], 303 | input[type="submit"] { 304 | -webkit-appearance: button; /* 2 */ 305 | cursor: pointer; /* 3 */ 306 | } 307 | 308 | /** 309 | * Re-set default cursor for disabled elements. 310 | */ 311 | 312 | button[disabled], 313 | html input[disabled] { 314 | cursor: default; 315 | } 316 | 317 | /** 318 | * Remove inner padding and border in Firefox 4+. 319 | */ 320 | 321 | button::-moz-focus-inner, 322 | input::-moz-focus-inner { 323 | border: 0; 324 | padding: 0; 325 | } 326 | 327 | /** 328 | * Restore focus style in Firefox 4+ (unset by a rule above) 329 | */ 330 | 331 | button:-moz-focusring, 332 | input:-moz-focusring { 333 | outline: 1px dotted ButtonText; 334 | } 335 | 336 | /** 337 | * Address Firefox 4+ setting `line-height` on `input` using `!important` in 338 | * the UA stylesheet. 339 | */ 340 | 341 | input { 342 | line-height: normal; 343 | } 344 | 345 | /** 346 | * It's recommended that you don't attempt to style these elements. 347 | * Firefox's implementation doesn't respect box-sizing, padding, or width. 348 | * 349 | * 1. Address box sizing set to `content-box` in IE 8/9/10. 350 | * 2. Remove excess padding in IE 8/9/10. 351 | */ 352 | 353 | input[type="checkbox"], 354 | input[type="radio"] { 355 | box-sizing: border-box; /* 1 */ 356 | padding: 0; /* 2 */ 357 | } 358 | 359 | /** 360 | * Fix the cursor style for Chrome's increment/decrement buttons. For certain 361 | * `font-size` values of the `input`, it causes the cursor style of the 362 | * decrement button to change from `default` to `text`. 363 | */ 364 | 365 | input[type="number"]::-webkit-inner-spin-button, 366 | input[type="number"]::-webkit-outer-spin-button { 367 | height: auto; 368 | } 369 | 370 | /** 371 | * Address `appearance` set to `searchfield` in Safari and Chrome. 372 | */ 373 | 374 | input[type="search"] { 375 | -webkit-appearance: textfield; 376 | } 377 | 378 | /** 379 | * Remove inner padding and search cancel button in Safari and Chrome on OS X. 380 | * Safari (but not Chrome) clips the cancel button when the search input has 381 | * padding (and `textfield` appearance). 382 | */ 383 | 384 | input[type="search"]::-webkit-search-cancel-button, 385 | input[type="search"]::-webkit-search-decoration { 386 | -webkit-appearance: none; 387 | } 388 | 389 | /** 390 | * Define consistent border, margin, and padding. 391 | */ 392 | 393 | fieldset { 394 | border: 1px solid #c0c0c0; 395 | margin: 0 2px; 396 | padding: 0.35em 0.625em 0.75em; 397 | } 398 | 399 | /** 400 | * 1. Correct `color` not being inherited in IE 8/9/10/11. 401 | * 2. Remove padding so people aren't caught out if they zero out fieldsets. 402 | */ 403 | 404 | legend { 405 | border: 0; /* 1 */ 406 | padding: 0; /* 2 */ 407 | } 408 | 409 | /** 410 | * Remove default vertical scrollbar in IE 8/9/10/11. 411 | */ 412 | 413 | textarea { 414 | overflow: auto; 415 | } 416 | 417 | /** 418 | * Restore font weight (unset by a rule above). 419 | * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. 420 | */ 421 | 422 | optgroup { 423 | font-weight: bold; 424 | } -------------------------------------------------------------------------------- /view/assets/tree_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nameoverflow/blog-v4/59099db2a62fe5d4108484227b98409ba4bcfc2d/view/assets/tree_small.png -------------------------------------------------------------------------------- /view/client.jsx: -------------------------------------------------------------------------------- 1 | import "babel-polyfill" 2 | 3 | import React from 'react' 4 | import { render } from 'react-dom' 5 | 6 | import { Provider } from 'react-redux' 7 | import { createStore, applyMiddleware } from 'redux' 8 | import { Router, browserHistory, match } from 'react-router' 9 | import { syncHistoryWithStore } from 'react-router-redux' 10 | import fetch from 'isomorphic-fetch' 11 | 12 | import reducer from './reducers' 13 | import { apiFactory } from './middleware' 14 | 15 | import Root from './containers/Root' 16 | import routes from './routes' 17 | 18 | import { scrollLoaderBundle } from './utils' 19 | 20 | 21 | 22 | const makeRequest = (url, opt) => { 23 | const { origin } = window.location 24 | const real_url = origin + url 25 | return fetch(url, opt) 26 | .then(res => 27 | res.ok ? res.json() 28 | : { 29 | err: res.statusText, 30 | code: res.status, 31 | url: res.url 32 | }) 33 | } 34 | 35 | const 36 | initial_state = window.__INITIAL_STATE__, 37 | middleware = applyMiddleware(apiFactory(makeRequest)), 38 | store = createStore(reducer, initial_state, middleware), 39 | history = syncHistoryWithStore(browserHistory, store) 40 | 41 | if (/Edge/.test(navigator.userAgent)) { 42 | alert("检测到你在使用 Edge \n请跟我念:“ Chrome 大法好,退软保平安”") 43 | } 44 | 45 | match({ history, routes }, (error, redirectLocation, renderProps) => { 46 | console.log('matched once') 47 | renderProps.components 48 | .filter(c => c && c.scrollLoad) 49 | .map(c => { 50 | scrollLoaderBundle.bind(() => c.scrollLoad(store, renderProps)) 51 | }) 52 | render( 53 | <Root {...{ store, renderProps }} />, 54 | document.getElementById('client') 55 | ) 56 | }) 57 | -------------------------------------------------------------------------------- /view/components/Comment/index.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component, PropTypes } from 'react' 2 | 3 | export default class Comment extends Component { 4 | getConfig() { 5 | this.page.url = window.location.toString() 6 | this.page.identifier = window.location.pathname 7 | } 8 | addScript() { 9 | window.disqus_config = this.getConfig 10 | const s = document.createElement('script') 11 | const p = document.head || document.body 12 | s.src = '//hcyue.disqus.com/embed.js' 13 | s.setAttribute('data-timestamp', +new Date()) 14 | p.appendChild(s) 15 | } 16 | componentDidMount() { 17 | if (typeof DISQUS === 'undefined') { 18 | this.addScript() 19 | } else { 20 | DISQUS.reset({ 21 | reload: true, 22 | config: this.getConfig 23 | }) 24 | } 25 | } 26 | render() { 27 | return <div id="disqus_thread" /> 28 | } 29 | } 30 | 31 | -------------------------------------------------------------------------------- /view/components/ContentView/ContentView.sass: -------------------------------------------------------------------------------- 1 | .ContentView 2 | padding-top: 4em 3 | .ArticleMeta 4 | font-size: 0.8em 5 | color: #bbb 6 | margin: 2.5em auto 7 | a 8 | border-bottom: 1px #bbb solid 9 | &:hover 10 | color: #333 11 | a 12 | border-bottom: 1px #333 solid 13 | 14 | > div:nth-child(1) 15 | position: relative 16 | width: 49% 17 | text-align: right 18 | &::after 19 | content: '/' 20 | font-size: 300% 21 | font-weight: 100 22 | position: absolute 23 | top: 15px 24 | right: -18px 25 | > div:nth-child(2) 26 | width: 49% 27 | margin-left: auto 28 | margin-right: 0 29 | > div:only-child 30 | width: 100% 31 | text-align: center 32 | &::after 33 | display: none 34 | -------------------------------------------------------------------------------- /view/components/ContentView/index.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component, PropTypes } from 'react' 2 | 3 | import TagList from '../TagList' 4 | import Time from '../Time' 5 | import Title from '../PageTitle' 6 | if (typeof window !== 'undefined') { 7 | require('./ContentView.sass') 8 | } 9 | 10 | const Meta = ({ tags, createDate }) => 11 | <section className='ArticleMeta'> 12 | <div>发布于  <Time {...{ createDate }} /> </div> 13 | 14 | { tags && tags.length ? <div>tags:{ TagList(tags) }</div> : [] } 15 | 16 | </section> 17 | 18 | export default ({ isPage, children }) => { 19 | if (!children) { 20 | return <div>Loading</div> 21 | } 22 | const { title, body, createDate, tags } = children 23 | return ( 24 | <article className='ContentView'> 25 | <Title {...{ isPage }}>{ title } 26 |
27 | { isPage || } 28 | 29 | ) 30 | } -------------------------------------------------------------------------------- /view/components/DashMenu/DashMenu.sass: -------------------------------------------------------------------------------- 1 | .DashMenu 2 | width: 80% 3 | margin-left: auto 4 | margin-right: auto 5 | overflow: hidden 6 | li 7 | list-style: none 8 | float: left 9 | margin: 5px 10px 10 | -------------------------------------------------------------------------------- /view/components/DashMenu/index.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component, PropTypes } from 'react' 2 | import { Link } from 'react-router' 3 | 4 | if (typeof window !== 'undefined') { 5 | require('./DashMenu.sass') 6 | } 7 | export default ({ children }) => { 8 | return ( 9 |
10 |
  • Articles
  • 11 |
  • Pages
  • 12 |
  • Home
  • 13 |
    14 | ) 15 | } 16 | 17 | -------------------------------------------------------------------------------- /view/components/Editor/Editor.sass: -------------------------------------------------------------------------------- 1 | .Editor 2 | position: relative 3 | width: 100% 4 | margin: auto 5 | .editor-wrapper 6 | margin-top: 3rem 7 | position: absolute 8 | width: 45% 9 | left: 0 10 | input, textarea 11 | box-sizing: border-box 12 | display: block 13 | width: 100% 14 | margin-bottom: 2rem 15 | padding: 5px 10px 16 | input 17 | line-height: 2rem 18 | textarea 19 | overflow: hidden 20 | resize: none 21 | height: auto 22 | font-family: Monaco, Menlo, Consolas, 'Microsoft Yahei', monospace 23 | font-size: 14px 24 | line-height: 23px 25 | .preview-wrapper 26 | position: absolute 27 | width: 45% 28 | right: 0 29 | -------------------------------------------------------------------------------- /view/components/Editor/index.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component, PropTypes } from 'react' 2 | 3 | import ContentView from '../ContentView' 4 | import FlexibleTextarea from '../FlexibleTextarea' 5 | 6 | import './Editor.sass' 7 | export default class Editor extends Component { 8 | render() { 9 | const { title, bodySource, tags } = this.props.post 10 | const { handleChange, isPage, handleSubmit } = this.props 11 | return ( 12 |
    13 |
    14 |
    15 | 20 | 26 | 30 | 31 | 32 |
    33 |
    34 | { this.props.post } 35 |
    36 |
    37 | ) 38 | } 39 | } -------------------------------------------------------------------------------- /view/components/FlexibleTextarea.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component, PropTypes } from 'react' 2 | 3 | export default class FlexibleTextarea extends Component { 4 | constructor(props) { 5 | super(props) 6 | } 7 | componentDidUpdate() { 8 | const { ta } = this.refs 9 | ta.style.height = '1px' 10 | ta.style.height = ta.scrollHeight + 'px' 11 | } 12 | 13 | render() { 14 | return ( 15 |