├── README.md ├── views ├── error.ejs ├── resume.ejs ├── list.ejs ├── header.ejs ├── detail.ejs ├── login.ejs ├── index.ejs ├── article.ejs └── register.ejs ├── style.css ├── routes ├── users.js ├── detail.js ├── register.js ├── index.js ├── login.js └── article.js ├── database.js └── package.json /README.md: -------------------------------------------------------------------------------- 1 | # nodejs- 2 | 基于nodejs,Robomong数据库开发的博客后台管理系统 3 | -------------------------------------------------------------------------------- /views/error.ejs: -------------------------------------------------------------------------------- 1 |

<%= message %>

2 |

<%= error.status %>

3 |
<%= error.stack %>
4 | -------------------------------------------------------------------------------- /style.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 50px; 3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; 4 | } 5 | 6 | a { 7 | color: #00B7FF; 8 | } 9 | -------------------------------------------------------------------------------- /routes/users.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | 4 | /* GET users listing. */ 5 | router.get('/', function(req, res, next) { 6 | res.send('respond with a resource'); 7 | }); 8 | 9 | 10 | 11 | 12 | 13 | 14 | module.exports = router; 15 | -------------------------------------------------------------------------------- /database.js: -------------------------------------------------------------------------------- 1 | // var mongoose=require("mongoose");//引用mongoose第三方数据库模块 对象模型工具 2 | 3 | // mongoose.connect("mongodb://localhost:27017/test1707");//test1707自动被创建 链接到test1707数据库 我们可以通过利用mongoose的connect()方法连接到MongoDB 。是系统方法 4 | 5 | //module.exports暴露 要看情况暴露与否 6 | // 7 | // 8 | // 9 | // 10 | var mongoose =require("mongoose"); 11 | 12 | mongoose.connect("mongodb://localhost:27017/chenzhen"); -------------------------------------------------------------------------------- /routes/detail.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | var Article = require("../model/article"); 4 | /* GET home page. */ 5 | router.get('/', function(req, res, next) { 6 | 7 | Article.find({ 8 | _id:req.query.id 9 | }).then(result=>{ 10 | // console.log(result); 11 | res.render('detail', { title: '详情页面',isShow:false,info:result[0] }); 12 | }) 13 | 14 | }); 15 | 16 | module.exports = router; 17 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "backend", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "start": "node-dev ./bin/www" 7 | }, 8 | "dependencies": { 9 | "body-parser": "~1.18.2", 10 | "cookie-parser": "~1.4.3", 11 | "debug": "~2.6.9", 12 | "ejs": "~2.5.7", 13 | "express": "~4.15.5", 14 | "morgan": "~1.9.0", 15 | "serve-favicon": "~2.4.5" 16 | }, 17 | "devDependencies": { 18 | "express-session": "^1.15.6", 19 | "md5": "^2.2.1", 20 | "mongoose": "^4.12.5", 21 | "multer": "^1.3.0" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /views/resume.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | <%= title %> 6 | 7 | 8 | 9 | 10 | 11 | 12 | <%- include("./header.ejs",{title:"个人信息",isShow:false})%> 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /views/list.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | <%= title %> 6 | 7 | 8 | 9 | 10 | 11 | 12 | <%- include("./header.ejs",{title:"已发表文章",isShow:false})%> 13 | 14 |

标题

15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /routes/register.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | 4 | 5 | var User=require("../model/user");//引入model。user文件 6 | 7 | 8 | var md5=require("md5"); 9 | /* GET home page. */ 10 | router.get('/', function(req, res, next) { 11 | res.render('register', { title: '主页',isShow:false }); 12 | }); 13 | 14 | 15 | 16 | router.post('/',function (req,res) { 17 | // console.log(req.body); 18 | 19 | 20 | User.find({ 21 | email:req.body.email//查询有没有同名的邮箱 22 | }).then(result=>{//如果有打印[] 如果没有打印出来 23 | if (result.length==0) { //没有重名的情况下 插入数据 24 | return User.create({//name这些要跟user.js里的相对应 25 | name:req.body.username, 26 | tel:req.body.tel, 27 | email:req.body.email, 28 | // password:req.body.password 29 | password:md5(req.body.password)//引用md5模块 对注册密码进行加密处理 30 | }) 31 | } else { 32 | res.render('register', {title:"注册页面",isShow:true})//如果邮箱重复 33 | 34 | } 35 | }).then(result=>{ 36 | //这个回调函数等待create的promise reslove之后才会调用 37 | res.redirect("/login");//邮箱没有被注册则进行跳转到 登录页面 38 | }) 39 | }) 40 | module.exports = router; -------------------------------------------------------------------------------- /views/header.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /routes/index.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | 4 | 5 | //首页引入article数据库 6 | var Article=require("../model/article");//适合article共用一个数据库 7 | /* GET home page. */ 8 | router.get('/', function(req, res, next) { 9 | // res.render('index', { title: 'Express' }); 10 | 11 | // 拿到cook值显示在Index 12 | // res.render('index', { title: 'Express',name:req.cookies["currentUser"] }); 13 | 14 | //session 15 | if (req.session.chenzhenInfo) {//也就是session有效 也就是用户登录成功 ()回到index 16 | 17 | Article.find({//当找到登录作者的姓名时才进行登录 而不是谁都可以对文章进行操作 18 | author:req.session.chenzhenInfo["name"] 19 | }).then(result=>{ 20 | // res.render('index', { title: 'Express',name:req.cookies["currentUser"] });再加一下对文章列表的模板 21 | res.render('index', { title: 'Express',name:req.cookies["currentUser"] ,list:result}) 22 | }) 23 | 24 | 25 | } else { 26 | res.redirect("/login");//重定向到登录 27 | } 28 | 29 | }); 30 | 31 | 32 | //销毁session 33 | //点击注销后跳转至此 34 | router.get("/logout",function (req,res) { 35 | req.session.destroy(()=>{//session.destroy方法 销毁session 36 | res.redirect("/login");//重定向到login 37 | }) 38 | }) 39 | 40 | 41 | //主页个人信息 42 | router.get('/resume', function(req, res, next) { 43 | res.render('resume', { title: '主页',isShow:false }); 44 | }); 45 | 46 | 47 | //已发表文章list 48 | router.get('/list', function(req, res, next) { 49 | res.render('list', { title: '主页',isShow:false }); 50 | }); 51 | 52 | 53 | 54 | module.exports = router; 55 | -------------------------------------------------------------------------------- /views/detail.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | <%= title %> 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | <%- include("./header.ejs",{title:"详情页面",isShow:false})%> 20 | 21 |
22 |

标题

23 |
24 | 25 |
26 |

<%= info.title%>

27 |
28 | 29 | 30 |

摘要

31 |
32 | 33 |

<%= info.abstract%>

34 |
35 | 36 | 37 | 38 |

内容

39 |
40 |
41 | 42 |
43 | 44 | 45 | 46 |
47 |
48 | 49 |
50 | 51 | -------------------------------------------------------------------------------- /routes/login.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | var User=require("../model/user");//引入model。user文件 4 | 5 | var md5=require("md5");//注册进行了md5加密 登录也应该用md5解密后进行登录 6 | /* GET home page. */ 7 | router.get('/', function(req, res, next) { 8 | res.render('login', { title: '登录页面',isShow:false});//此路由链接login。ejs路由 不同路径显示不同内容 9 | }); 10 | 11 | 12 | //对login.js传过来的数据进行处理 13 | //路由可以简单理解为分发和接收处理数据 14 | router.post("/",function (req,res) {//用post处理数据 15 | 16 | User.find({//如果找到重名的 数据库 在注册数据中进行find 17 | tel:req.body.tel, 18 | email:req.body.email, 19 | password:md5(req.body.password)//用md5模块进行登录 20 | 21 | 22 | }).then(result=>{//如果重名在控制台打印 如果没有则打印空数组 23 | // console.log(result); 24 | if (result==0) { //也就是数组为0 意思是没有注册信息 25 | res.render('login', {title:'登录页面',isShow:true}) 26 | } else { 27 | // 将名字以cook的形式进行存在浏览器 也可以选择从数据库去取 但是这样方便 28 | // 1.先将登录的name值 以变量currentUser进行存储在cook 29 | // 2.在index.js中name:req.cookies["currentUser"] 获取到index页面 30 | // 3.在index.ejs中 31 | // 4.在header.ejs的模板中 32 | // res.cookie("currentUser",result[0].name); 33 | 34 | 35 | // 使用app.js的session模块 36 | // req.session对应cook钥匙 在路由上对后端的session房间进行存值 result[0]是登录的对象 使得session变得有效 否则只是开辟空间没有效果 就不能登录后使用index 37 | // key value值 38 | // 还要进行处理 不能所有人都进入页面 39 | 40 | 41 | // 登录成功后才会走一下分支 接着走index.js分支 42 | // req.session.chenzhenInfo=result[0]; //一个等于号 43 | 44 | req.session.chenzhenInfo=result[0];//拿到cook值 45 | 46 | res.cookie("currentUser",result[0].name); 47 | 48 | res.redirect("/"); 49 | } 50 | 51 | 52 | 53 | 54 | }) 55 | 56 | 57 | 58 | }) 59 | 60 | 61 | 62 | module.exports = router; -------------------------------------------------------------------------------- /views/login.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | <%= title %> 6 | 7 | 8 | 9 | 10 | 11 | 12 | <%- include("./header.ejs",{title:"登录页面",isShow:false})%> 13 | 14 |
15 | 16 |
17 | 21 | 22 |
23 | 24 | 25 |
26 | 27 | 28 |
29 | 30 | 31 |
32 |
33 | 34 | 35 |
36 | 46 | 47 | 48 | 49 | <% if(isShow){%> 50 |
51 | 52 |
53 | <%}%> 54 |
55 |
56 | 57 | 58 | -------------------------------------------------------------------------------- /routes/article.js: -------------------------------------------------------------------------------- 1 | // var express = require('express'); 2 | // var router = express.Router(); 3 | 4 | // router.get('/', function(req, res, next) { 5 | // res.render('article', { title: '发表页面',isShow:false}); 6 | // }); 7 | 8 | 9 | // router.post("/",function (req,res) { 10 | // console.log(req.body);//路由接收浏览器信息给后台 此时会将发表页面内容打印在控制台 11 | // }) 12 | 13 | 14 | // module.exports = router; 15 | 16 | 17 | // 一下代码为操作数据库模型article 18 | var express = require('express'); 19 | var router = express.Router(); 20 | 21 | var Article=require("../model/article"); 22 | 23 | //--------配置multer,设置存储路径以及文件名字--------------- 24 | // 25 | // 26 | var multer = require("multer"); 27 | var storage = multer.diskStorage({ 28 | destination: function (req, file, cb) { 29 | cb(null,"public/chenzhenphoto"); 30 | }, 31 | filename: function (req, file, cb) { 32 | cb(null, file.fieldname + '-' + Date.now()) 33 | } 34 | }) 35 | 36 | var upload = multer({ storage: storage }) 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | router.get('/', function(req, res, next) { 45 | res.render('article', { title: '发表页面',isShow:false,isNew:true}); 46 | }); 47 | 48 | router.post("/",upload.single('chenzhenphoto'),function (req,res) { 49 | console.log(req.file);//路由接收浏览器信息给后台 此时会将发表页面内容打印在控制台 50 | 51 | Article.create({ 52 | //将姓名 定义在创建的表格author中 53 | author:req.session.chenzhenInfo["name"],// 第一种解决 54 | // author:req.cookies["currentUser"],//第二种解决 55 | title:req.body.title, 56 | abstract:req.body.abstract, 57 | content:req.body.content, 58 | pathname:`/chenzhenphoto/${req.file.filename}`//将图片路径存放在数据库 59 | }).then(result=>{//发表成功后跳转到index页面 60 | res.redirect("/"); 61 | }) 62 | 63 | 64 | 65 | 66 | }) 67 | 68 | 69 | 70 | router.get("/fixed",function(req,res){ 71 | 72 | Article.find({ 73 | _id:req.query.id 74 | }).then(result=>{ 75 | res.render('article', { title: '更新页面',isShow:false,isNew:false,info:result[0] }); 76 | }) 77 | 78 | }) 79 | 80 | 81 | router.post("/fixed",function(req,res){ 82 | console.log(req.body); 83 | Article.findByIdAndUpdate(req.body.id,{$set:{title:req.body.title,abstract:req.body.abstract,content:req.body.content}}).then(result=>{ 84 | 85 | res.redirect("/"); 86 | }) 87 | }) 88 | 89 | 90 | //删除的操作 91 | router.get("/delete",function(req,res){ 92 | Article.findByIdAndRemove(req.query.id).then(result=>{ 93 | res.redirect("/"); 94 | }) 95 | }) 96 | 97 | module.exports = router; -------------------------------------------------------------------------------- /views/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | <%= title %> 7 | 8 | 9 | 10 | 11 | 12 | 57 | 58 | 59 | 60 | 61 | <%- include("./header.ejs",{title:"后台管理系统",isShow:true,headername:name})%> 62 |
63 | 64 | 71 | 72 |
73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | <%for(var i=0;i 84 | 85 | 90 | 91 | 94 | 98 | 99 | <%}%> 100 | 101 |
标题摘要基本操作
86 | 87 | <%= list[i].title%> 88 | 89 | 92 | <%= list[i].abstract%> 93 | 95 | 修改 96 | 删除 97 |
102 |
103 | 104 |
105 | 110 | 111 | 113 |
114 |
115 | 116 | 117 | 118 | 119 | -------------------------------------------------------------------------------- /views/article.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | <%= title %> 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | <%- include("./header.ejs",{title:'title',isShow:false})%> 19 | 20 |
21 | 22 | 23 | 27 | 28 | <%if(isNew){%> 29 | 30 |
31 | 35 |
36 | 37 | 38 |
39 |
40 | 41 | 42 |
43 |
44 | 45 | 46 |
47 | 48 | 49 |
50 | 54 | 55 | 56 |
57 | 58 | 59 | 60 | <%} else {%> 61 | 62 | 63 | 67 |
68 | 69 | 70 |
71 |
72 | 73 | 74 |
75 |
76 | 77 | 78 |
79 | 80 | 84 | 87 | 88 | 89 | 90 | 91 | 92 |
93 | 94 | 95 | <%}%> 96 | 97 | 98 |
99 | 100 | 101 | -------------------------------------------------------------------------------- /views/register.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | register 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | <%- include("./header.ejs",{title:"注册页面",isShow:false})%> 16 | 17 |
18 | 19 |
20 |
21 | 22 | 23 | 24 |
25 |
26 | 27 | 28 | 29 |
30 |
31 | 32 | 33 | 34 |
35 |
36 | 37 | 38 | 39 |
40 |
41 | 42 | 43 | 44 |
45 |
  • 强度检测
  • 46 |
    47 | 48 | 49 | 50 |
    51 |
    52 | 53 |
    54 | 55 | 更新 56 | 57 |
    58 | 59 | 60 |
    61 | 62 | 63 |
    64 | 65 | <%if(isShow){%> 66 |
    邮箱重复
    67 | <%}%> 68 |
    69 | 70 | 71 | 72 | --------------------------------------------------------------------------------