需要安装的模块
body-parser 解析post请求
cookies 读写cookie
express 搭建服务器
markdown Markdown语法解析生成器
mongoose 操作Mongodb数据库
swig 模板解析引擎
目录结构
db 数据库存储目录
models 数据库模型文件目录
public 公共文件目录(css,js,img)
routers 路由文件目录
schemas 数据库结构文件
views 模板视图文件目录
app.js 启动文件
package.json
app.js 文件
1.创建应用、监听端口
const app = express(); app.get('https://www.jb51.net/',(req,res,next) => { res.send("Hello World !"); }); app.listen(3000,(req,res,next) => { console.log("app is running at port 3000"); });
2.配置应用模板
定义使用的模板引擎 app.engine('html',swig.renderFile) 参数1:模板引擎的名称,同时也是模板文件的后缀 参数2:表示用于解析处理模板内容的方法
设置模板文件存放的目录 app.set('views','./views')
注册所使用的模板引擎 app.set('view engine','html')
3.用模板引擎去解析文件
/** * 读取views目录下的指定文件,解析并返回给客户端 * 参数1:模板文件 * 参数2:给模板传递的参数 */ res.render('index',{ title:'首页 ', content: 'hello swig' });
4.开发过程中需要取消模板缓存的限制
swig.setDefaults({ cache: false }); app.set('view cache', false);
5.设置静态文件托管
// 当用户访问的是/public路径下的文件,那么直接返回 app.use('/public',express.static(__dirname + '/public'));
划分模块
前台模块
后台模块
API模块
// 根据不同的功能划分模块 app.use('https://www.jb51.net/',require('./routers/main')); app.use('/admin',require('./routers/admin')); app.use('/api',require('./routers/api'));
对于管理员模块 admin.js
var express = require('express'); var router = express.Router(); // 比如访问 /admin/user router.get('/user',function(req,res,next) { res.send('User'); }); module.exports = router;
前台路由 + 模板
main 模块
/ 首页
/view 内容页
api模块
/首页
/register 用户注册
/login 用户登录
/comment 评论获取
/comment/post 评论提交
后台(admin)路由+模板
首页
/ 后台首页
用户管理
/user 用户列表
分类管理
/category 分类列表
/category/add 分类添加
/category/edit 分类修改
/caterory/delete 分类删除
文章内容管理
/article nei内容列表
/article/add 内容添加
/article/edit 内容修改
/article/delete 内容删除
评论内容管理
/comment 评论列表
/comment/delete 评论删除
功能开发顺序
功能模块开发顺序
用户
栏目
内容
评论
编码顺序
通过Schema定义设计数据存储结构
功能逻辑
页面展示
连接数据库(mongoDB)
启动MongoDB服务端:
mongod --dbpath=G:\data\db --port=27017
启动服务设置数据库的存储地址以及端口
var mongoose = require('mongoose'); // 数据库链接 mongoose.connect("mongodb://localhost:27017/blog",(err) => { if(err){ console.log("数据库连接失败"); }else{ console.log("数据库连接成功"); // 启动服务器,监听端口 app.listen(3000,(req,res,next) => { console.log("app is running at port 3000"); }); } });
定义数据表结构和模型
对于用户数据表(users.js)在schema文件夹下:
var mongoose = require('mongoose'); module.exports = new mongoose.Schema({ // 用户名 username:String, // 密码 password:String });
在models目录下创建user.js模型类
var mongoose = require('mongoose'); var userSchema = require('../schemas/users'); module.exports = mongoose.model('User',userSchema);
处理用户注册
前端通过ajax提交用户名和密码
url: /api/register
后端对前端提交(POST)的数据解析
var bodyParser = require('body-parser'); // bodyParser 配置 // 通过使用这一方法,可以为req对象添加一个body属性 app.use( bodyParser.urlencoded({extended:true})); // 在api模块中: // 1.可以定义一个中间件,来统一返回格式 var responseData; router.use( function(req,res,next){ // path默认为'https://www.jb51.net/',当访问该目录时这个中间件被调用 responseData = { code:0, message:'' }; next(); }); router.post('/register',(req,res,next) => { console.log(req.body); // 去判断用户名、密码是否合法 // 判断是否用户名已经被注册 // 通过 res.json(responseData) 给客户端返回json数据 // 查询数据库 User.findOne({ // 返回一个promise对象 username: username }).then(function( userInfo ) { if( userInfo ){ // 数据库中有该条记录 ... res.json(responseData); return; } // 给数据库中添加该条信息 var user = new User({ username:username,password:password }); return user.save(); // 返回promise对象 }).then(function( newUserInfo ){ console.log(newUserInfo); res.json(responseData); // 数据保存成功 }); });
cookies 模块的使用
全局(app.js)注册使用