【更新:增加分类】React + redux + ES6 + webpack + koa + mongodb的个人博客

#1

前端基于react、redux、webpack,接口提供使用koa、mongodb 搭建的个人博客,风格仿照 【ECMAScript 6 入门】

基于前后端分离的思想,后端提供接口,前端调用

只看前端代码可忽视server文件夹

在线地址:点击这里

开源代码请点击这里: github地址

$ node -v
v8.1.3

$ npm -v
4.5.0

命令使用

安装 && 运行

$ cd chenxj-blog
$ npm install // src包安装

$ cd server
$ npm install // 后台包安装

$ node run // 启动后台
$ cd ../
$ npm run dev // 启动前端

命令

// 开发
$ npm run dev

// 打包
$ npm run build

技术栈

前端:
- react@15.3.1
- react-router@3.0.5
- redux@3.6.0
- webpack@1.13.2
- es6

后台:
- koa@2.0.0-alpha.8
- mongoose@4.11.1
- asyn/await

浏览器兼容

  • Chrome
  • Firefox
  • Safari
  • IE10+

简单介绍

异步fetch结合action的使用:


// 获取所有文章id、title
export const getArticles = () => {
  return dispatch => {
    const url = `${CONFIG.server}/api/getArts`
    return fetch(url, {
      method: 'POST',
      // 设置这个header,才能正确parse
      headers: { 'Content-Type': 'application/json' },
      mode: 'cors'
    })
      .then(response => response.json())
      .then(data => {
        console.log(data)
        dispatch({
          type: GET_ARTICLES,
          articles: data.articles
        })
      })
  }
}
// 获取所有文章action对应的reducer
case GET_ARTICLES:
    return Object.assign({}, defaultIssuesState, {
      isFetching: false,
      articles: action.articles
    })

异步dispatch(action)的处理

componentDidMount() {
    const { dispatch } = this.props
    NProgress.start()
    dispatch(getArticles())
      .then(() => {
        const { _id } = this.props.articles[0]
        dispatch(getArticleById(_id))
          .then(() => {
            NProgress.done()
            this.setState({
              article: this.props.article
            })
          })
      })
  }

jsonwebtoken在koa的实现

// token 验证
  router.post(
    '/valid',
    async(ctx, next) => {
      const { token } = ctx.request.body
      try {
        const decoded = jwt.verify(token, 'secret')
        // 过期
        if (decoded.exp <= Date.now()/1000 ) {
          ctx.body = {
            status: 0,
            msg: '登录状态已过期,请重新登录'
          }
          return
        }
        if (decoded) {
          // token is ok
          ctx.body = {
            status: 1,
            msg: '登陆验证成功'
          };
          return;
        }
      } catch(e) {
        if(e) {
          ctx.body = {
            status: 0,
            msg: e.message
          } 
        }
      }  
    }
  )

让nodejs支持es6,注意:nodejs主持async/await的话要8.0以上

require('babel-core/register')
require('babel-polyfill')
require('./app')
1 Like
#2

不錯啊,我剛剛接觸React,多多指教呢~

#3

哈,目前功能和架构各方面都十分简洁、比较适合新手看的。
后面有时间会继续完善~
觉得好的话可以关注或者start一下哈哈~
有什么问题都可以问的,一起进步。

#4

提个小建议 ,左侧的导航栏上的链接如果做成,鼠标放上去显示小手会更好:grin:

#5

好的哦
:grin:

#7

有任何问题或者需要交流的可以直接联系本人,欢迎骚扰~
微信:c13266836563

#8

主页面:

#9

随着文章越来越多,就必须给文章进行分类了。本次更新增加分类,并且游客无需登录可在【游客吐槽】模块发帖

#10

学习学习(°_°)…

#11

欢迎~:grinning:

#12

mark,目前也正在学习react,感谢楼主

#13

老兄头像真帅:slight_smile:

#14

老兄能加一下微信吗,我有一些相关的问题想要请教一下:grinning:

#15

可以,c13266836563

#16

:grin:感谢