node.js从零开发企业级后台管理

1,655 阅读6分钟

「这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战

小伙伴们好,我是一个普通本科毕业计算机专业的大四在校生,我想给大家分享一下我学习node.js并用node开发一个后台管理系统,这是对自己学习成功的检验,同时我也是想把这一份学习的热情带给大家,希望初学者能从我的这几行菜鸟代码学到一点知识

废话不多说,我们直接开始吧

Express Cms 项目以及框架搭建

1.首先我们需要连接数据库,这里我使用mongodb,1.安装mongoose(cnpm i mongoose --save) 2.在model文件夹里面新建core.js 用于连接数据库

core.js

//这个模块实现的功能是连接数据库

//1.导入模块mongoose
const mongoose = require('mongoose'); //cnpm i mongoose --save  操作数据库

//2.调用mongoose连接数据库  第二个参数可以消除连接数据库的警告错误,不加都无所谓只是看着舒服一点   第三个参数可以监听数据库有没有连接成功
mongoose.connect('mongodb://127.0.0.1:27017/eggcms', { useNewUrlParser: true } ,function(err){
    if(err) {
        console.log(err);
        return
    }
    console.log("数据库连接成功");
});

module.exports=mongoose;

这里我们还是吧数据库连接地址写在外面用config.js配置

3.在项目里面新建config->config.js

var app={
    "dbUrl": "mongodb://127.0.0.1:27017/express_cms"
}
module.exports=app;//暴露

然后在core.js里面引入 const config = require("../config/config") ,把之前写的固定地址改成 config.dbUrl 像这样

//这个模块实现的功能是连接数据库

//1.导入模块mongoose
const mongoose = require('mongoose'); //cnpm i mongoose --save  操作数据库
const config = require("../config/config") //引入配置的地址文件

//2.调用mongoose连接数据库  第二个参数可以消除连接数据库的警告错误,不加都无所谓只是看着舒服一点   第三个参数可以监听数据库有没有连接成功
mongoose.connect(config.dbUrl, { useNewUrlParser: true } ,function(err){
    if(err) {
        console.log(err);
        return
    }
    console.log("数据库连接成功");
});

module.exports=mongoose;

4.在model文件夹里面创建managerModel.js,这里要说一下,不懂mongoose怎么操作的去看一下我第一篇入坑文章,里面有详细讲解mongoose操作,里面的配置如下

managerModel.js

const mongoose = require('./core.js')

let ManagerSchema = mongoose.Schema({
    username: { type: String },
    password: { type: String },
    email: { type: String },
    mobile: { type: String },
    status: { type: Number, default: 1 },
    login_time: {
        type: Number
    },
    add_time: {
        type: Number
    },
})

5.创建好后配置manager的路由,前端的路由和后端的路由是不同的,这里需要好好琢磨一下,由于manager是admin下的子页面,所有manager路由要配置在admin.js代码里面

//引入模块
const express = require('express'); //引入express框架 cnpm install express --save安装
const manager = require("./admin/manager")

//实例化
const router = express.Router()


//配置路由
router.get("/", (req, res)=> {
    res.send("后台管理中心")
})

//配置引入模块路由 挂载路由
router.use("/manager",manager)


module.exports = router

暴露出去后在app.js里面写配置admin路由和这里的方式是一样的

6.查询manager表

这里我们利用mongoose在表里面已经添加了数据,就不多解释了,查询数据可以用es7的async await

//引入模块
const express = require('express'); //引入express框架 cnpm install express --save安装
const ManagerModel = require("../../model/managerModel")
//实例化
const router = express.Router()

//配置路由
router.get("/", async (req, res)=> {
    let result = await ManagerModel.find({})
    console.log(result);
    res.send("管理员页面")
})
router.get("/add", (req, res)=> {
    var result = new ManagerModel({
        username:"张三",
        password:"123456"
    })
    result.save((err)=>{
        if(err){
            console.log(err);
            return
        }
        console.log("添加管理员成功");
    })
    res.send("添加管理员界面")
})

module.exports = router

7.在开发工具里面配置Eslint(其实没必要安装,完全没用全是报错影响心情)

是因为配置eslint可以严格规范你的代码书写

首先全局安装(cnpm install -g eslint) 然后在代码项目里面 eslint --init 之后根据选项选择安装的eslint的要求,然后yes安装 如果安装失败就 cnpm i eslint@latest --save-dev 安装一遍,但是如果是初学者写代码的话,我认为

开始制作!!

这里我讲的非常的乱,希望大家看到不要打我

安装图形验证码

1.安装 cnpm install --save svg-captcha 2.在login.js文件中写入

var svgCaptcha = require('svg-captcha') //引入图形验证码

router.get('/verify',(req, res)=>{
    var captcha = svgCaptcha.create();
    // req.session.captcha = captcha.text;

    res.type('svg');
    res.status(200).send(captcha.data)
})

3.在login.html文件中引入

局部刷新

你们会发现,当你在首页把导航页面折叠起来的时候,点击其他页面会全部重新刷新,这就需要用到局部刷新的方法

1.使用iframe

用户登录

1.配置session验证验证码 安装(cnpm install express-session)

2.在app.js中引入(const session = require("express-session"); )

3.配置session中间件

//配置session中间件
app.use(session({ //配置session中间件
    secret: 'this is session',//服务器端生成 session 的签名
    name:"leilei", //修改session对应的cookies的名称
    resave: false,  //强制存储session 即使它并没有变化
    saveUninitialized: true,//强制将未初始化的 session 存储
    cookie: {
        maxAge:1000*60*60,
        secure: false, //true表示只有https协议才能访问cookie
    },
    rolling:true, //用户重新访问时续期 
}))

4.将session存储到session里边,

router.get('/verify',(req, res)=>{
    var captcha = svgCaptcha.create();
    req.session.captcha = captcha.text;//1.吧验证码保存到session里面

    res.type('svg');
    res.status(200).send(captcha.data)
})

5.获取表单传过来的数据

const bodyParser = require('body-parser'); //引入第三方中间件  (cnpm install body-parser安装) 用于接受表单post过来的数据

app.use(bodyParser.urlencoded({extended: false}))//配置第三方中间件 获取post传递的数据
app.use(bodyParser.json())

6.post请求

router.post("/dologin", (req, res)=> {
    let username = req.body.username;
    let password = req.body.password;
    let verify = req.body.verify;

    //1.判断验证码是否正确
    //2.判断用户输入的账号密码是否正确
    if(verify.toLocaleLowerCase() != req.session.captcha.toLocaleLowerCase()){
        res.send("验证码错误")
        return;
    }
    res.send("验证成功,执行登录")
})

7.验证码校验:

router.post("/dologin", (req, res)=> {
    let username = req.body.username;
    let password = req.body.password;
    let verify = req.body.verify;

    //1.判断验证码是否正确
    //2.判断用户输入的账号密码是否正确
    if(verify.toLocaleLowerCase() != req.session.captcha.toLocaleLowerCase()){
        res.render("admin/public/error.html",{
            "redirectUrl":"/admin/login",
            "message":"验证码验证失败"
        })
        return;
    }
    //验证成功
    res.render("admin/public/success.html",{
        "redirectUrl":"/admin",
        "message":"验证码验证成功"
    })
})

后台管理的登录功能,权限验证,md5加密

1.首先在login页面引入managerModel模块,然后根据之前mongoose的存储username,和password

const ManagerModel = require("../../model/managerModel") //引入managerModel模块

router.get("/", async(req, res)=> {
    let result = new ManagerModel({
        username:"admin",
        password:"123456"
    })
    await result.save();
    res.render("admin/login/login.html")
})

2.安装cmd5加密功能npm istall md5 --save,然后引入使用

const ManagerModel = require("../../model/managerModel") //引入managerModel模块

router.get("/", async(req, res)=> {
    let result = new ManagerModel({
        username:"admin",
        password:md5("123456")
    })
    await result.save();
    res.render("admin/login/login.html")
})

3.权限认证

router.post("/dologin", async (req, res) => {
    //获取表单传过来的数据
    let username = req.body.username;
    let password = req.body.password;
    let verify = req.body.verify;

    //1.判断验证码是否正确
    if (verify.toLocaleLowerCase() != req.session.captcha.toLocaleLowerCase()) {
        res.render("admin/public/error.html", {
            "redirectUrl": "/admin/login",
            "message": "验证码验证失败"
        })
        return;
    }
    //2.判断用户输入的账号密码是否正确
    let result = await ManagerModel.find({ "username": username, "password": md5(password) })
    if (result.length > 0) {
        //保存用户信息至session
        req.session.userinfo = result[0] //result是一个数组
        //验证成功
        res.render("admin/public/success.html", {
            "redirectUrl": "/admin",
            "message": "登录成功"
        })
    } else {
        //验证失败
        res.render("admin/public/error.html", {
            "redirectUrl": "/admin/login",
            "message": "用户名或密码错误失败"
        })
    }

})

好记得我们在登录的时候吧用户账号密码存入session里面了吗,在用户访问admin页面的时候,我们做一个判断,如果session存在,用户可以访问,如果不存在,则跳转到登录页面

const url = require('url')//对url进行解析

router.use((req, res, next) => {
    // console.log(req.url);
    var pathname = url.parse(req.url).pathname //用于防止死循环
    console.log(pathname);
    if (req.session.userinfo && req.session.userinfo.username) {
        //向下执行
        next();
    } else {
        //防止循环
        if (pathname == "/login" || pathname == "/login/doLogin" || pathname == "/login/verify") {
            next();
        } else {
            res.redirect("/admin/login")
        }

    }
})

管理员的增删改查

1.退出登录 在公共部分mian/index.html 里面

<li><a href="/admin/login/loginOut">安全退出</a>

然后

//退出登录
router.get('/loginOut', (req, res) => {
    req.session.userinfo = null; //消除session
    res.redirect("/admin/login")
})