1. 程式人生 > >node專案實戰-用node-koa2-mysql-bootstrap搭建一個前端論壇

node專案實戰-用node-koa2-mysql-bootstrap搭建一個前端論壇

前言

在學習了koa2和express並寫了一些demo後,打算自己寫一個專案練練手,由於是在校生,沒什麼好的專案做,即以開發一個前端論壇為目標,功能需求參照一下一些社群擬定,主要有:

  1. 登入註冊
  2. 個人資訊維護、頭像等基本資訊
  3. 發表文章,富文字編輯器採用wangEditor外掛,編輯、刪除文章,文章分類等
  4. 文章評論、文章收藏、點贊等
  5. 支援文章分頁、評論分頁載入
  6. 關注取關使用者
  7. 資源(檔案)上傳分享、下載、檢視
  8. 學習資源推薦.....

作者個人日記
but。。。。由於種種原因,目前僅實現了部分功能,資源分享還沒寫
專案執行效果:http://120.77.211.212/home

專案技術棧應用:node-koa2-ejs-bootstrap3—jquery, github地址:

https://github.com/Jay214/myb...,如果覺得對你有幫助或者還看得下去,歡迎star~~鼓勵鼓勵我這前端渣渣輝。

開發環境

node: v8.3.0

koa: ^2.4.1

mysql: 5.7.1

npm: 5.3.0及以上

如何執行專案

將專案clone至本地 git clone [email protected]:Jay214/myblog-koa2.git
安裝模組中介軟體 npm install
安裝mysql
mysql版本推薦使用5.7以下的,5.7的有個bug,圖形化介面推薦使用navicat for mysql
執行可以安裝supervisor(npm install supervisor 專案執行工具,開啟後即處於監聽模式,修改檔案後儲存即可,無需再啟動專案) node index 或npm supervisor index
localhost:8080/home 埠號可自行修改
若發現專案有存在什麼bug或有比較好的建議歡迎多多提議,qq:2752402930。

準備工作

由於koa2是基於es6的promise和es7的await/async語法,所以如果對es6/es7不懂的話請先過一遍文件,後臺搭建資料庫是關鍵,所以請先安裝好mysql,mysql建議安裝5.7版本以下的,因為5.7.0版本有個bug,需要更改配置檔案,具體若你們安裝的時候便知道了。

安裝node環境,使用node -v檢視node版本,node需要較新版本能夠支援es6的promise和es7的await/async語法,現在node版本都會自帶npm的,所以不需要再去安裝npm。

專案結構


1.config存放預設檔案(資料庫連線配置)
2.lib存放資料庫檔案
3.middlewares存放判斷登陸註冊與否中介軟體
4.public存放靜態檔案,js,引用bootstrap框架等檔案
5.routers存放路由檔案
6.views存放模板檔案
7.index是程式主檔案,定義介面,資料庫介面,引用模組等
8.package.json專案的配置檔案,包括專案名,作者,依賴,模組等

專案用vscode開發的,用起來很舒服,還沒嘗試過的小夥伴趕緊去試一下吧。
專案初始化:cd myblog1 -> npm init 此時已經建立好了package.json檔案了。

由於koa2是輕量級的框架,小巧精悍,所以我們為了促進我們的開發效率和方便性,我們需要安裝一些koa2的模組中介軟體:

npm install i koa koa-bodyparser koa-mysql-session koa-router koa-session-minimal koa-static koa-views md5 moment mysql ejs koa-static-cache --save-dev

各模組用處

koa node框架
koa-bodyparser 表單解析中介軟體
koa-mysql-session、koa-session-minimal 處理資料庫的中介軟體
koa-router 路由中介軟體
koa-static 靜態資源載入中介軟體
ejs 模板引擎
md5 密碼加密
moment 時間中介軟體
mysql 資料庫
koa-views 模板呈現中介軟體
koa-static-cache 檔案快取

專案基本框架搭建

配置資料庫連線
在config資料夾新建default.js :


const config = {   
 //啟動埠    
port: 8080,
    //資料庫配置   
 database: {      
  DATABASE: 'nodesql',        
  USERNAME: 'root',       
 PASSWORD: '123456',      
  PORT: '3306',        
HOST: 'localhost'  
  }
}
module.exports = config;  
然後在lib資料夾新建mysql.js:
var mysql = require('mysql');
var config = require('../config/default.js')
//建立資料庫連線池
var pool = mysql.createPool({
    host: config.database.HOST,
    user: config.database.USERNAME,
    password: config.database.PASSWORD,
    database: config.database.DATABASE
});
let query = function(sql, values) {    
return new Promise((resolve, reject)=>{
        pool.getConnection(function (err,connection) {
            if(err){      reject(err);
                }else{                
connection.query(sql,values,(err,rows)=>{ 
                   if(err){ 
                       reject(err);
                    }else{
                        resolve(rows); 
                   }                   
 connection.release(); //為每一個請求都建立一個connection使用完後呼叫connection.release(); 直接釋放資源。 
                                         //query用來操作資料庫表
                })
            } 
            }) 
   })}

這裡建立了一個數據庫連線池和封裝了一個操作資料庫表的函式,如果對於資料庫連線有不懂的話請自行百度。

建立入口檔案

在主目錄新建index.js,即專案入口檔案:

const koa = require("koa");   //node框架
const path = require("path");  
const bodyParser = require("koa-bodyparser"); //表單解析中介軟體
const ejs = require("ejs");   //模板引擎
const session = require("koa-session-minimal");   //處理資料庫的中介軟體
const MysqlStore = require("koa-mysql-session");  //處理資料庫的中介軟體
const router = require("koa-router");     //路由中介軟體
const config = require('./config/default.js');    //引入預設檔案
const views = require("koa-views");   //模板呈現中介軟體
const koaStatic = require("koa-static");  //靜態資源載入中介軟體
const staticCache = require('koa-static-cache')
const app = new koa();

//session儲存配置,將session儲存至資料庫
const sessionMysqlConfig = {
    user: config.database.USERNAME,
    password: config.database.PASSWORD,
    database: config.database.DATABASE,
    host: config.database.HOST,
}

//配置session中介軟體
app.use(session({
    key: 'USER_SID',
    store: new MysqlStore(sessionMysqlConfig)
}))

//配置靜態資源載入中介軟體
app.use(koaStatic(
    path.join(__dirname , './public')
))

//配置服務端模板渲染引擎中介軟體
app.use(views(path.join(__dirname, './views'),{
    extension: 'ejs'
}))

//使用表單解析中介軟體
app.use(bodyParser({
    "formLimit":"5mb",
    "jsonLimit":"5mb",
    "textLimit":"5mb"
}));

//使用新建的路由檔案
//登入
app.use(require('./routers/signin.js').routes())
//註冊
app.use(require('./routers/signup.js').routes())
//退出登入
app.use(require('./routers/signout.js').routes())
//首頁
app.use(require('./routers/home.js').routes())
//個人主頁
app.use(require('./routers/personal').routes())
//文章頁
app.use(require('./routers/articles').routes())
//資源分享
app.use(require('./routers/share').routes())
//個人日記
app.use(require('./routers/selfNote').routes())
//監聽在8080埠
app.listen(8080) 

console.log(`listening on port ${config.port}`)

上面程式碼都有註釋,我就不一一說明了,由於資源分享和個人日記還沒寫,所以暫時統一share...替代。

接下來向mysql.js新增資料庫操作語句,建表、增刪改查。。。

var users = `create table if not exists users(
    id INT(200) NOT NULL AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    pass VARCHAR(40) NOT NULL,
    avator VARCHAR(100) DEFAULT 'default.jpg', 
    job VARCHAR(40),
    company VARCHAR(40),
    introdu VARCHAR(255),
    userhome VARCHAR(100),
    github VARCHAR(100),
    PRIMARY KEY (id)
);`

var posts = `create table if not exists posts(
    id INT(200) NOT NULL AUTO_INCREMENT,
        name VARCHAR(100) NOT NULL,
        title VARCHAR(100) NOT NULL,
        content TEXT NOT NULL,
        uid INT(200) NOT NULL,
        moment VARCHAR(40) NOT NULL,
        comments VARCHAR(255) NOT NULL DEFAULT '0',
        pv VARCHAR(40) NOT NULL DEFAULT '0',
        likes INT(200) NOT NULL DEFAULT '0',
        type VARCHAR(20) NOT NULL,
        avator VARCHAR(100),
        collection INT(200) NOT NULL DEFAULT '0', 
        PRIMARY KEY (id) ,
        FOREIGN KEY (uid) REFERENCES users(id)
        ON DELETE CASCADE

);`

var comment= `create table if not exists comment(
 id INT(200) NOT NULL AUTO_INCREMENT,
 name VARCHAR(100) NOT NULL,
 content TEXT NOT NULL,
 moment VARCHAR(40) NOT NULL,
 postid INT(200) NOT NULL,
 avator VARCHAR(100),
 PRIMARY KEY ( id ),
 FOREIGN KEY (postid) REFERENCES posts(id)
 ON DELETE CASCADE
);`

var likes = `create table if not exists likes(
    id INT(200) NOT NULL AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    postid INT(200) NOT NULL,
    PRIMARY KEY (id),
    FOREIGN KEY (postid) REFERENCES posts(id)
    ON DELETE CASCADE
);`
 var collection = `create table if not exists collection(
     id INT(200) NOT NULL AUTO_INCREMENT,
     uid VARCHAR(100) NOT NULL,
     postid INT(200) NOT NULL,
     PRIMARY KEY (id),
     FOREIGN KEY (postid) REFERENCES posts(id) 
     ON DELETE CASCADE
 );`
 var follow = `create table if not exists follow(
         id INT(200) NOT NULL AUTO_INCREMENT,
         uid INT(200) NOT NULL,  
         fwid INT(200) NOT NULL DEFAULT '0',
         PRIMARY KEY (id),
         FOREIGN KEY (uid) REFERENCES users(id)
         ON DELETE CASCADE
     )
     `

let createTable = function(sql){
    return query(sql, []);
}

//建表
createTable(users);
createTable(posts);
createTable(comment);
createTable(likes);
createTable(collection);
createTable(follow);
//createTable(follower);
//註冊使用者
let insertData = function(value){
    let _sql = "insert into users(name,pass) values(?,?);"
    return query(_sql,value);
}
//更新頭像
let updateUserImg = function(value){
    let _sql = "update users set avator=? where id=?"
    return query(_sql,value);
}
//更新使用者資訊
let updateUser = function(value){
    let _sql = "update users set name=?,job=?,company=?,introdu=?,userhome=?,github=? where id=?"
    return query(_sql,value);
}
//發表文章
let insertPost = function(value){
    let _sql = "insert into posts(name,title,content,uid,moment,type,avator) values(?,?,?,?,?,?,?);"
    return query(_sql,value);
}

//更新文章評論數
let updatePostComment = function(value){
    let _sql = "update posts set comments=? where id=?"
    return query(_sql,value);
}
.......

總共六張表:使用者表、文章表、文章評論表、文章收藏表、文章點贊表、使用者關注表。

這裡引用了外來鍵,但是現在的開發不推薦使用外來鍵了,所以你們可以自行修改,這裡在專案第一次啟動時會出現資料庫建立失敗(由於外來鍵原因),只要重新啟動就ok了,如果對mysql還不瞭解的,這裡附送大家一個傳送門:mysql入門視訊教程 密碼:c2q7 。

專案基本框架搭建好後,我們就可以開始開發頁面和介面。

由於學業繁忙,後續內容持續更新。。。


相關推薦

node專案實戰-node-koa2-mysql-bootstrap搭建一個前端論壇

前言在學習了koa2和express並寫了一些demo後,打算自己寫一個專案練練手,由於是在校生,沒什麼好的專案做,即以開發一個前端論壇為目標,功能需求參照一下一些社群擬定,主要有:登入註冊個人資訊維護、頭像等基本資訊發表文章,富文字編輯器採用wangEditor外掛,編輯、

Node專案實戰-靜態資源伺服器

開啟github,在github上建立新專案: Repository name: anydoor Descripotion: Tiny NodeJS Static Web server 選擇:public 選擇:Initialize this repository with a README 新

大型網站B2C商城專案實戰+MongoDB+Redis+zookeeper+MySQL

本文列出了當今計算機軟體開發和應用領域最關鍵部分,如果你想保證你現在以及未來的幾年不失業,那麼你最好跟上這些技術的發展。雖然你不必對這十種技術樣樣精通,但至少應該對它們非常熟悉。 架構師必備:分散式架構+微服務架構+高效能架構+B2C商城專案   給大家推薦一個程式設計師

Vue.js學習記錄-8-Vue去哪兒網專案實戰:首頁開發-環境搭建

專案實戰 1. 首頁開發 環境搭建 開發環境:node.js、Vue-cli腳手架工具 開發IDE:VScode 版本控制工具:Git 檢查環境搭建結果: 關於Vue-cli: Vue提供的官方命令列工具,可用於快速搭建大型單頁應用。該工具為現代化的前端開發工作流提供

Python+Flask+Gunicorn 專案實戰(一) 從零開始,寫一個Markdown解析器 —— 初體驗

      (一)前言 在開始學習之前,你需要確保你對Python, JavaScript, HTML, Markdown語法有非常基礎的瞭解。專案的原始碼你可以在 https://github.com/zhu-y/markdown-toolkit 找到,最後的

Python Selenium專案實戰(一)—— 怎麼去驗證一個按鈕是啟用的(可點選)?

Q: 使用 Python Selenium WebDriver 怎麼去驗證一個按鈕是啟用的(可點選)? A:Selenium WebDriver API 裡面給出瞭解決方法is_enabled() 使用WebDriver API —— driver.find_element_by_css_selector()

【gulp】gulp搭建一個前端專案

一、安裝與建立 1.安裝node:https://nodejs.org/zh-cn/ 2.安裝gulp:npm install gulp -g 3.新建一個資料夾用來存放專案 4.在命令列進入建立的資料夾輸入 gulp init即可 5.新建一

一步一步騰訊雲伺服器搭建一個tomcat專案,並用外網通過ip訪問專案

搭建了一天的專案,陸陸續續也遇到一些小問題不過最後還是成功解決了,接下來把這個過程記錄下來。首先呢,是因為騰訊雲伺服器的一波廣告一個月才10塊錢,所以毫不猶豫買下來了也就是這樣的伺服器,還不錯接下來呢就是配置這個伺服器1.安裝java JDK並配置環境參考:http://bl

MVC + EFCore 專案實戰 - 數倉管理系統2- 搭建基本框架配置EFCore

本次課程就正式進入開發部分。 首先我們先搭建專案框架,還是和之前漸進式風格保持一致,除必備元件外,儘量使用原生功能以方便大家理解。   開發工具:vs 2019 或以上 資料庫:SQL SERVER 2017 或以上   其他需要用到的我們在專案過程中再提。   一、新

Python手把手教你搭建一個web框架-flask微框架!

如果大家在學習Python的路上,或者打算學習Python需要學習資料,可以加群571799375,小編將群裡學習資料免費贈送大家喔! 在之前的文章當中,小編已經教過大家怎麼搭建一個Django框架,今天我們來探索另外的一種框架的搭建,這個框架就是web框架-flask微框架啦!首先我們帶著以下

實戰講解:如何用Python搭建一個伺服器

在當今Python伺服器框架 (framework, 比如Django, Twisted, web.py等等) 橫行的時代,從底層的socket開始寫伺服器似乎是一個出力不討好的笨方法。 有人說表示只學Python沒有用,必須學會一個框架(比如Django和web.py)才能找到工作。 其實

Netty實戰(1)使用Netty搭建一個簡單的客戶端與伺服器的互動Demo

       Netty 是一個基於 JAVA NIO 類庫的非同步通訊框架,它的架構特點是:非同步非阻塞、基於事件驅動、高效能、高可靠性和高可定製性。換句話說,Netty是一個NIO框架,使用它可以簡單快速地開發網路應用程式,比如客戶端和服務端的協議。Netty大大簡化了網

2020年總結-學習過的技術搭建一個簡單的微服務框架 + 原始碼

框架中使用的技術知識 工作快4年了,有時很迷茫,有時很有幹勁,學習了一些技術,也忘記了一些技術,即使對一些技術,瞭解的深度不夠,至少自己學習過使用過,那麼在面對問題時,不會顯得那麼無力,解決問題後,也能有更大的收穫。 NET Core基礎知識,EF CORE Code First,DB First

Node.js + Koa2 +MongoDB 企業級CMS前後端專案實戰-環境搭建 22741487

1.安裝koa並測試 npm install koa --save var koa = require("koa"); var app = new koa(); app.use(async(ctx)=>{ ctx.body = "hello koa2.x

iKcamp|基於Koa2搭建Node.js實戰(含視頻)? 代碼分層

如果 讓我 span module input 數據 listen else nod 視頻地址:https://www.cctalk.com/v/15114923889408 文章 在前面幾節中,我們已經實現了項目中的幾個常見操作:啟動服務器、路由中間件、Get 和 Po

iKcamp|基於Koa2搭建Node.js實戰(含視頻)? 錯誤處理

響應 當前 錯誤頁面 內部 修改 搭建 lock htm ret 滬江CCtalk視頻地址:https://www.cctalk.com/v/15114923887518 處理錯誤請求 愛能遮掩一切過錯。 當我們在訪問一個站點的時候,如果訪問的地址不存在(404),或

以太坊 DApp 開發入門實戰Node.js和truffle框架搭建——區塊鏈投票系統!

以太坊 區塊鏈 Node.js truffle DApp 第一節 概述 面向初學者,內容涵蓋以太坊開發相關的基本概念,並將手把手地教大家如何構建一個 基於以太坊的完整去中心化應用 —— 區塊鏈投票系統。 通過學習,你將掌握: 以太坊區塊鏈的基本知識 開發和部署以太坊合約所需的軟件

最新短視頻網站實戰教程 node.js+ES+Koa2基礎到精通項目實戰課程

tde 靜態 request 上下 純函數 pos api 1-1 node 下載地址:百度網盤下載 node.js+ES+Koa2項目實戰課,課程目錄很多,只展示了主要章節課程目錄第1章 2018 年的編程姿勢1-0 課前必看.mp41-1 koa2導學.mp41-2 安

Vue/Node/MongoDB開發微信全家桶專案實戰視訊教程

第1章 本地與伺服器環境準備     介紹微信公眾號/小程式/域名/伺服器的申請選購流程,在本地與線上伺服器分別對專案的執行環境進行搭建部署,如 Node.js/Vue/Yarn/PM2/Nginx/MongoDB 等等,同時會來簡單介紹下從本地通過 PM2 利用 Git 倉庫直

最新Vue/Node/MongoDB開發微信全家桶專案實戰

第1章 本地與伺服器環境準備     介紹微信公眾號/小程式/域名/伺服器的申請選購流程,在本地與線上伺服器分別對專案的執行環境進行搭建部署,如 Node.js/Vue/Yarn/PM2/Nginx/MongoDB 等等,同時會來簡單介紹下從本地通過 PM2 利用 Git 倉庫直