黑马博客管理系统MySql + Express + art-template项目搭建(源码)

本文介绍了使用MySql数据库、Express框架和art-template模板引擎搭建一个多人博客管理系统的步骤。系统包括博客内容展示、管理功能,涉及主路由、后台及前台js代码、html模板和mysql源码等多个部分。
摘要由CSDN通过智能技术生成

前言

关于搭建本系统要用到: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)
        
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值