論壇系統也是一個很經典的系統了,不少人大學的時候估計也寫過,可是三天就能從開寫到部署上線這是之前怎麼也不敢想的,得益於現代前端工做流和一些優秀開源框架,讓這成爲可能。能很快看到本身寫的東西部署在網上,相信帶來的成就感也是推進不少人持續學習的動力吧。javascript
前端:react、react-redux、antd、axios、stylus前端
後端:egg.jsjava
數據庫相關:mysql、sequelizenode
其餘:postman、jwt、Nginx、七牛雲等...mysql
client + service ,前端主要看src下,後端主要看app下react
我這裏前端部分沒有采用create-react-app腳手架搭建,是本身用webpack搭建的,對webpack不熟的同窗建議直接用官方腳手架。由於這個項目只用了三天,因此樣式大部分使用antd,種類多,啥組件都有,又好看(強勢安利一波)。webpack
數據管理用的是redux,目前來講主要是用戶登陸後的我的信息管理。創建了store文件夾來放置actions和reducers。創建一個全局的store樹,之後哪一個組件須要用戶信息只須要connect一下就能夠直接從store裏面拿數據了。可是修改的話就須要dispatch一個action,這樣就保證了數據的統一性。ios
請求數據用的是axios,先axios.create()
建立一個實例,而後在實例上配置了interceptors攔截器,對返回的結果進行攔截處理。git
const instance = axios.create({
xsrfCookieName: 'xsrf-name',
baseURL: baseDomain
});
instance.interceptors.response.use(function(response) {
if (response.data.success) {
return Promise.resolve(response.data)
} else {
notification['error']({
message: response.data.message
});
return Promise.reject({
message: response.data.message
})
}
}, function(error) {
try {
notification['error']({
message: error.response.data.message || '系統異常'
})
console.log(error.response.status)
if (error.response.status === 401) {
setTimeout(() => {
window.location.href = '/login';
}, 2000);
}
} catch(e) {
notification['error']({
message: '系統異常, 請稍後再試!'
})
}
return Promise.reject({
messageCode: 'sysError'
})
})
複製代碼
tips: 開發時跨域是經過devserver 轉發請求實現的。github
項目搭建直接用官方腳手架egg-init egg-example --type=simple
。通常在實際應用中,Controller 通常不會本身產出數據,也不會包含複雜的邏輯,複雜的過程應抽象爲業務邏輯層Service,因此咱們主要的業務邏輯仍是在service裏面完成,而後把結果返回給controller就能夠了。詳細的CRUD就不具體說了,這裏說幾個關鍵點。
框架會把 app/extend/context.js中定義的對象與Context的prototype對象進行合併,在處理請求時會基於擴展後的 prototype 生成 ctx 對象。咱們能夠在這裏得到一些數據,好比說在這裏獲取token裏 解析出的userId,這樣就只需獲取一次,以後能夠用緩存,提高了性能。或者還可已在這裏封裝一些函數,好比把原生的this.staus,this.body一塊兒封裝成一個returnBody。
returnBody (status, message, data = {}) {
this.status = status;
this.body = {
data,
message,
success: true
}
}
複製代碼
能夠在middleware裏面寫一些自定義的中間件,好比我這個項目中用到的鑑權中間件。而後在app/config.default.js里加上一行config.middleware = [ 'authorization' ];
就可使用了,是否是十分方便呢?
數據庫的話咱們能夠採用一些ORM工具來操做。好比sequelize,一款優秀的異步ORM框架,讓咱們能夠用OOP的方式操做數據庫,優雅的生成安全、可維護的SQL代碼。使用的話也是很是的簡單,值得注意的是咱們最好在初始化以前配置一下,讓自動生成的文件都在database目錄下,便於管理。
sequelize開發環境配置:
"development": {
"username": "root",// mysql帳戶
"password": "yourpassword",// mysql密碼
"database": "newbeeForum",// 數據庫名字
"port": 3306,
"host": "127.0.0.1",
"dialect": "mysql"
}
複製代碼
發帖的圖片是先上傳到七牛雲,而後返回連接,數據庫裏只保存了連接。具體操做能夠參見七牛雲開發者文檔。
JavaScript SDK: developer.qiniu.com/kodo/sdk/12… Node.js SDK: developer.qiniu.com/kodo/sdk/12…
登陸的話咱們採用jwt來進行跨域身份驗證,登陸成功後會簽發一個token,並把這個token種到cookie裏面,鑑權中間件就是經過這個token來鑑別用戶是否有權限訪問頁面。
簽發token:
const token = jwt.sign({ userId: existUser.userId }, this.app.config.jwtSecret, { expiresIn: '7d' })
;
明文保存用戶密碼是不道德的,因此我採用了crypto來加密保存用戶密碼,登陸的時候也是先將明文密碼加密再與數據庫中比對,相同才容許登陸。
加密保存用戶密碼:
user.password = crypto.createHmac('sha256', this.app.config.password_secret) .update(user.password) .digest('hex');
部署條件:服務器安裝node 8.0以上版本,安裝mysql,安裝Nginx
個人是騰訊雲的服務器,系統是centos7。前端npm run bulid
,把打包後的項目放到服務器上,好比/home/newbeeforum下,而後後端項目npm install --production
,這樣就只安裝dependencies的依賴,而後tar -zcvf ../release.tgz
,放到服務器上解壓縮後npm start
,就能夠運行了。最後在配置一下Nginx的轉發請求就能夠實現跨域了。
轉發請求:
```
//若是隻是host、端口轉換
location /project {
proxy_pass http://127.0.0.1:8080/project;
}
//若是路徑也變化了,則須要設置cookie的路徑轉換,不然cookie會丟失
location /proxy_path {
proxy_pass http://127.0.0.1:8080/project;
}
```
複製代碼
tips: 若是react前端部署上去是一片白的話多是路徑的問題,要注意是相對路徑仍是絕對路徑。