项目整体整体布局
项目整体可以分为:
- 数据库连接
- 路由配置
- 业务逻辑编写
*账号(登入、登出)
*文章增加
*文章删除
*文章修改
*文章查看
*文章浏览量统计
数据库连接
新建database.js文件,主要代码:
const mysql = require('mysql');
const config = require('./config');
const database = mysql.createConnection({
host:config.host,
user:config.user,
port:config.port,
password:config.password,
database:config.database
});
database.connect();
module.exports = database;
配置完之后直接在用的地方引这个配置文件就可以使用了。
路由配置
路由配置是非常重要和一个环节,种页面的请求和交互都要在路由配置的文件中实现:
var express = require('express');
var router = express.Router();
var crypto = require('crypto');
var mysql = require('./../database');
/* GET home page. */
router.get('/', function(req, res, next) {
var query = 'SELECT * FROM article ORDER BY articleID DESC';
mysql.query(query, function(err,rows,fields) {
var articles = rows;
articles.forEach(function(ele) {
var year = ele.articleTime.getFullYear();
var month = ele.articleTime.getMonth() + 1 > 10 ? ele.articleTime.getMonth() : '0' + (ele.articleTime.getMonth + 1);
var date = ele.articleTime.getDate() > 10 ? ele.articleTime.getDate() : '0' + ele.articleTime.getDate();
ele.articleTime = year + '-' + month +'-' + date;
});
res.render('index',{articles: articles});
});
//res.render('index', { title: 'Express' });
});
router.get('/friends', function(req, res, next) {
res.render('friends');
});
router.get('/about', function(req, res, next) {
res.render('about');
});
router.get('/logout', function(req, res, next) {
req.session.user = null;
res.redirect('/');
})
页面的请求都是通过路由文件进行分配数据传输以及渲染。
业务逻辑编写
nodejs框架的express模块可以使用个文件组件的方法进行渲染页面,所以可以运用组件的方法进行编写代码,大大的节省了工作量,还能使代码变得整洁,页面head组件例子如下:
<head>
<meta charset="UTF-8">
<title>node的个人博客</title>
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
<meta name="description" content="node的个人博客,分享node.js技术,不忘实心,共同成长">
<meta name="keywords" content="Node,Node.js,Node的博客,Node.js技术">
<link rel="stylesheet" href="/stylesheets/normalize.css">
<link rel="stylesheet" href="/stylesheets/main.css">
</head>
这个头文件可以在其他页面直接使用:
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<%- include("./public/head.ejs")%>
</head>
<body>
<%- include("./public/header.ejs")%>
<section class="main floatfix">
<%- include("./public/aside.ejs")%>
<section class="main-articles about">
<h2>关于博客</h2>
<p>....</p>
</section>
</section>
<%- include("./public/footer.ejs")%>
</body>
</html>
登录都是采用form表单的提交的方式,获取前端页面所提交的用户名密码,然后和数据库中的用户名密码进行对比,作出相应的渲染处理。其中为防止密码泄露,可以通过加密的方式进行比对。
router.post('/login', function(req, res, next) {
var name = req.body.name;
var password = req.body.password;
var hash = crypto.createHash('md5');
hash.update(password);
password=hash.digest('hex');
var query = 'SELECT * FROM author WHERE authorName=' + mysql.escape(name) + 'AND authorPassword=' + mysql.escape(password);
mysql.query(query,function(err, rows, fields) {
if(err) {
console.log(err);
return;
}
var user = rows[0];
if(!user) {
res.render('login',{message:'用户名密码错误'});
return;
}
req.session.user = user;
// req.session.userSign = true;
// req.session.userID = user.authorID;
res.redirect('/');
});
});
route主要处理细节:get请求要用render的方法进行前端页面传数据及渲染;post请求要用redirect方法进行处理或指定渲染页面。