下载配置
找到项目文件夹,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>
<% } %>