前言
关于搭建本系统要用到:mysql数据库,exprss框架,art-template模板引擎,session会话,joi验证(由于博主垃圾电脑无法装载bcrypt,所以不作加密处理),有疑惑或有问题欢迎提问和指出(可以私信)。
多人博客管理系统:博客内容展示,博客管理功能
项目所需文件和插件
插件
文件
js源码部分(带注释)
主路由
sever.js
const express = require("express");
const session = require("express-session");
const dateFormat = require("dateformat");
const template = require("art-template");
const home = require("./route/home");
const admin = require("./route/admin");
const bodyParser = require("body-parser");
const path = require("path");
const app = express();
app.use(express.static(path.join(__dirname, "public")));
app.use(bodyParser.urlencoded({ extended: false }));
// 配置 session
app.use(
session({
secret: "secret key",
saveUninitialized: false,
//cookie存在时间为一天
cookie: {
maxAge: 24 * 60 * 60 * 1000,
},
})
);
// 拦截请求,判断用户登录状态
app.use("/admin", require("./middleware/loginGuard"));
// 前台路由
app.use("/home", home);
// 后台路由
app.use("/admin", admin);
//集中处理错误请求
app.use((err, req, res, next) => {
const result = JSON.parse(err);
let params = [];
for (const attr in result) {
if (attr != "path") {
params.push(attr + "=" + result[attr]);
}
}
res.redirect(`${result.path}?${params.join("&")}`);
});
app.set("views", path.join(__dirname, "views"));
app.set("view engine", "art");
app.engine("art", require("express-art-template"));
// 向模板内部导入dateFormate变量
template.defaults.imports.dateFormat = dateFormat;
app.listen("3000", () => {
console.log("服务器启动成功");
});
common.js数据库连接
const mysql = require("mysql");
const connect = mysql.createConnection({
host: "localhost",
port: 3306,
user: "这里填自己MySQL的用户",
password: "这里填自己MySQL的密码",
database: "数据库名字",
});
connect.connect();
/**
*@function 获取MySQL数据库中的数函
*@param sql一条MySQL语句
*@return Promise对象,异步函数
@example await {result} = db("select * from user").then((result) => {
return result;
});
**/
function db(sql) {
return new Promise((resolve, reject) => {
connect.query(sql, (err, result) => {
if (err) {
reject(err);
} else {
resolve(result);
}
});
});
}
module.exports = { db };
loginGuard.js
const guard = (req, res, next) => {
// 判断用户访问的是否是登录页面
// 判断用户的登录状态
// 如果用户是登录的,将请求放行,向下执行;如果用户不是登录的,则将请求重定向到登录页
if (req.url != "/login" && !req.session.username) {
// 重定向到登录页
return res.redirect("/admin/login");
} else {
//判断用户是否是管理员
if (req.session.role == "normal") {
return res.redirect("/home/");
}
// 用户是登录的,将请求放行,向下执行
next();
}
};
module.exports = guard;
admin后台js
admin.js
const express = require("express");
const common = require("../model/common");
const admin = express.Router();
//渲染登录页面
admin.get("/login", require("./admin/loginup"));
// 实现登录功能
admin.post("/login", require("./admin/login"));
//渲染用户页面
admin.get("/user", require("./admin/userPage"));
// 实现退出功能
admin.get("/logout", require("./admin/logout"));
// 渲染创建用户列表路由
admin.get("/user-edit", require("./admin/userEdit"));
// 创建实现添加用户功能
admin.post("/user-edit", require("./admin/user-edit-fn"));
// 创建实现修改用户功能
admin.post("/user-modify", require("./admin/user-modify"));
// 创建实现删除用户功能
admin.get("/delete", require("./admin/user-delete"));
//文章列表界面
admin.get("/article", require("./admin/article"));
//文章编辑界面
admin.get("/article-edit", require("./admin/article-edit"));
// 实现文章添加功能的路由
admin.post("/article-add", require("./admin/article-add"));
module.exports = admin;
home.js
const express = require("express");
const home = express.Router();
// 博客前台首页的展示页面
home.get("/", require("./home/index"));
// 博客前台文章详情展示页面
home.get("/article", require("./home/article"));
// 创建评论功能路由
home.post("/comment", require("./home/comment"));
module.exports = home;
登录
login.js
const express = require("express");
const common = require("../../model/common");
const login = express.Router();
login.post("/login", (req, res) => {
const { email, password } = req.body;
let sql = `select * from user where email='${email}'`;
//判断邮件和密码是否为空
if (email.trim().length == 0) {
res.status(400).render("admin/error.art", { msg: "邮件地址或密码错误" });
}
//实现登录
common.db(sql).then((result) => {
if (result.length > 0) {
result.forEach((v) => {
if (password == v.password) {
//将用户名存储到req请求中
req.session.username = v.username;
req.session.role = v.role;
req.app.locals.userInfo = v;
//判断用户是否是管理员,是就可以进入后台
if (v.role == "admin") {
res.redirect("/admin/user");
} else {
res.redirect("/home/");
}
} else {
res
.status(400)
.render("admin/error.art", { msg: "邮件地址或密码错误" });
}
});
} else {
// 没有查询到用户
res.status(400).render("admin/error.art", { msg: "邮件地址或密码错误" });
}
});
});
module.exports = login;
loginup.js
module.exports = (req, res) => {
res.render("admin/login.art");
};
logout.js
module.exports = (req, res) => {
// 删除 session
req.session.destroy(function () {
// 删除 cookie
res.clearCookie("connect.sid");
// 清除模板中的用户信息
req.app.locals.userInfo = null;
// 重定向到登陆页面
res.redirect("/admin/login");
});
};
用户
user-delete.js
const common = require("../../model/common");
module.exports = (req, res) => {
common.db(`delete from user where _id='${req.query.id}'`);
res.redirect("/admin/user");
};
user-edit-fn.js
// 引入 joi 模块
const Joi = require("joi");
const common = require("../../model/common");
module.exports = (req, res, next) => {
common
.db(`select * from user where email='${req.body.email}'`)
.then(async (result) => {
if (result.length > 0) {
return res.redirect(`/admin/user-edit?message=邮箱地址已经被占用`);
} else {
// 定义对象的验证规则
const schema = {
username: Joi.string()
.alphanum()
.min(2)