06-61-node中后台管理MVC初级框架

下载配置

找到项目文件夹,cmd进入项目,生成记录第三方依赖的文件

npm init -y

下载express

npm install express 

下载第三方模板

npm i express
npm i path
npm i ejs
npm i fs
npm i body-parser
npm i cookie-parser
npm i express-session
npm i mongodb

服务器

引入模块、路由、生成服务器

const express = require("express");
const path = require("path");
const ejs = require("ejs");
const fs = require("fs");
const bodyParser = require('body-parser');
const cookieParser = require('cookie-parser');
const session = require('express-session');
let luYou = require('./LuYou/luYou')
let app = express();

引入静态资源

app.use(express.static(path.join(__dirname, 'public')));   
 // 设置静态资源文件夹,需用 path

ejs模板

app.engine('.html', require('ejs').__express); 
// 注册ejs模板为html页。后缀名可以是.html
app.set('view engine', 'html'); 
// 设置视图模板的默认后缀名为.html,或用 'ejs'
app.set('views', __dirname + '/views');
// 设置模板文件文件夹,app.set('views','./views');

文件操作

fs.unlink('')   //删除文件
fs.existsSync('');  //判断文件是否存在
fs.readFileSync('') //读取文件
fs.writeFileSync('') //写入文件
fs.appendFileSync('') //追加文件

body-parser配置

app.use(bodyParser.urlencoded({ extended: false }));    //解析表格
app.use(bodyParser.json());     //解析json
	req.body    //获取表格传参	,trim()		去除空格
	req.query   //获取get查询字符串传参

cookie-parser配置

app.use(cookieParser());	//设置cookie,属性名和值,存活时间
res.cookie("cookieMing", "cookieZhi", { maxAge: 60000 * 60 * 24 * 7 });
	req.cookies // 获取cookie
	req.cookies.isLogin //设置一个cookie属性帮助判断是否登录

session配置

app.use(session({
    secret: 'ange', //任何字符串,多 keyboard cat
    resave: false,
    saveUninitialized: true,
    cookie: { maxAge: 60000 * 10 }   //设置时间,可空
}));	 // 因为session是基于cookie的
	req.session.username = 'ange';  //设置session  session数据保存在服务器
	req.session.username //获取session

设置中中间件 用于判断用户是否登录

app.use('/admin/index', checkLogin);
app.use('/admin/index', admin);
function checkLogin(req, res, next) {
    if (!req.session.isLogin) {
        // 没有登录
        res.redirect("/admin/users/login")
        //   console.log("没有登录"),返回到登录页面
    }
    next();
}

监听端口

app.listen(3000, () => {
    console.log('3000 ok');
})

二级路由

引入数据库,路由

let express = require("express");
let router = express.Router();
let db = require("../../models/db"); //使用数据库

渲染列表页面

//res.redirect("/mine") //跳转页面
router.get('/',(req,res)=>{
    db.getData(function(result){
        res.render('admin/get',{data:result})
    })
})

显示添加页面

router.get('/add', function(req, res) {
      res.render("admin/add");
});

添加数据处理

router.post('/add', function(req, res) {
    // let post = req.body;
    var post = {
      "cat":req.body.cat,
      "title":req.body.title,
      "time":new Date(),
    }
    db.insertData(post,function (result) {
      if(result == "1"){
        res.send("添加成功<a href='/admin/posts'>查看列表</a>")
      }else{
        res.send("添加失败<a href='/admin/posts'>查看列表</a>")
      }
    })
  });

处理编辑页面

router.get('/edit', function(req, res) {
    var id = req.query.id;
    db.getDataById(id,function (result) {
      res.render("admin/edit",{data:result[0]});
    })
  });

编辑功能实现

router.post('/edit', function(req, res) {
    db.updateDataById(req.body,function (result) {
      if(result == "1"){
        res.send("更新成功<a href='/admin/cats/'>返回列表</a>")
      }else{
        res.send("更新失败<a href='/admin/cats/'>返回列表</a>")
      }
    }) 
  });

实现删除数据

router.get('/delete', function(req, res) {
    var id = req.query.id;
    db.deleteDataById(id,function (result) {
      if(result == "1"){
        res.redirect("/admin/cats")
      }else{
        return;
      }
    })
  });

显示登录页面

//登录的中间件,如果登录了,就不能访问登录页面
router.use('/login', checkNotLogin);
router.get('/login', function(req, res, next) {
  res.render("admin/login")
});

登录操作

router.post('/login', function(req, res, next) {
  db.findUser(req.body,function (result) {
    if(result.length){
      req.session.isLogin = true;
      res.redirect("/admin/index")
    }else{
      res.redirect("/admin/users/login")
    }
  })
});

注销登录

router.get('/logout', function(req, res, next) {
  req.session.isLogin = null;
  res.redirect("/admin/users/login")
});

登录的中间件

//登录的中间件,如果登录了,就不能访问登录页面
function checkNotLogin(req,res,next){
  if(req.session.isLogin){
    res.redirect("/admin/index")
  }
  next();
}

暴露二级路由

module.exports = router;

mongodb数据库操作

连接数据库

var MongoClient = require('mongodb').MongoClient;
var ObjectId = require('mongodb').ObjectId;
var url = "mongodb://localhost:27017/shujuku";

往数据库添加数据

function insertData(data,callback){
    MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
        if (err) throw err;
        var dbo = db.db("shujuku");
        dbo.collection("jihe").insertOne(data, function(err, res) {
            if (err){
                console.log("分类数据插入失败了...")
                callback("-1"); // -1代表插入失败
            }
            callback("1");  // 1代表插入成功
            console.log("分类数据插入成功...");
            db.close();
        });
    });
}

查询数据

function getData(callback){
    MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
        if (err) throw err;
        var dbo = db.db("shujuku");
        dbo.collection("jihe"). find({}).toArray(function(err, result) {
            if (err) throw err;
            // console.log(result);
            callback(result); // 把数据传递给controller
            db.close();
        });
    });
}

根据ID查找对应的数据

function getDataById(id,callback){
    MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
        if (err) throw err;
        var dbo = db.db("shujuku");
        // id的类型必须是Object类型
        dbo.collection("jihe").find({"_id":ObjectId(id)}).toArray(function(err, result) {
            if (err) throw err;
            // console.log(result);
            callback(result)
            db.close();
        });
    });
}

根据ID更新数据

function updateDataById(data,callback){
    MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
        if (err) throw err;
        var dbo = db.db("shujuku");
        var whereStr = {_id:ObjectId(data.id)};  // 查询条件
        var updateStr = {$set: { "title" : data.title, "sort":data.sort }};
        dbo.collection("jihe").updateOne(whereStr, updateStr, function(err, res) {
            if (err) callback("-1")
            callback("1") // 1代表更新成功了   -1代表更新失败了
            db.close();
        });
    });
}

根据ID执行删除操作

function deleteDataById(id,callback){
    MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
        if (err) throw err;
        var dbo = db.db("shujuku");
        var whereStr = {"_id":ObjectId(id)};  // 查询条件
        dbo.collection("jihe").deleteOne(whereStr, function(err, obj) {
            if (err) callback("-1");
            callback("1")
            db.close();
        });
    });
}

根据用户名和密码查找数据

function findUser(user,callback){
    MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
        if (err) throw err;
        var dbo = db.db("shujuku");
        var whereStr = user;
        dbo.collection("jihe"). find(whereStr).toArray(function(err, result) {
            if (err) throw err;
            callback(result); 
            db.close();
        });
    });
}

暴露数据库操作

exports.insertData = insertData;
exports.getData = getData;
exports.getDataById = getDataById;
exports.updateDataById = updateDataById;
exports.deleteDataById = deleteDataById;

渲染真实数据

ejs渲染数据

<%=  %>
<%  %>
<% include header.html %>
<% include footer.html %>

    <% data.forEach( function(item,index){   %>
    <option value="<%= item.title %>"><%= item.title %></option>
    <% }) %>

    <% for(var i=0; i < data.length; i++){ %>
        <tr>
            <td style="width: 10px"><%= i+1 %></td>
            <td><%= data[i].title %></td>
            <td><%= data[i].time.toLocaleString() %></td>
            <td>
                <a href="/admin/cats/edit?id=<%= data[i]._id %>" 
                    class="" title="编辑"><span "></span> 编辑</a>
                <a href="/admin/cats/delete?id=<%= data[i]._id %>" 
                    class="" title="删除" onclick="return confirm('是否删除?');">
                    <span class="fa fa-trash-o"></span> 删除</a>
            </td>
        </tr>
        <% } %>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值