大家知道js现在不仅仅可以写前端界面而且可以写后端的业务了,这样js就可以写一个全栈的项目。这里介绍一个nodejs + express + mongodb + bootstap 的全栈项目。
1、安装必要的包,npm install express npm install mongodb npm install ejs (需要使用什么工具,就安装哪个工具)
2、建一个入口文件,index.js,这里主要是做路由的分发。启动: node index.js
var express = require("express");// require express 的框架
var app = express(); // 实例化一个 express的对象
var router = require("./router/router.js"); // 引用 router 的文件,下面将介绍这个router
var session = require('express-session');// 使用了 express 一个 session 的工具,主要用作注册登录使用
var config = require("./config.js");// 引用一个配置文件
//使用session
app.use(session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: true,
}));
app.set("view engine","ejs");// 设置一个模版引擎, 渲染模版引擎是 ejs
app.use(express.static("./assets"));// 静态一个文件夹,实用的好处这里的文件的路径就可以 用 / 表示
app.get("/",router.index); // 后端分发的路由 "/" 表示主页 主页的业务代码逻辑在 router里的 index 的函数里
//我的发布
// app.get("/mypost", routerUser.list);
//search
// app.get("/search",routerSearch.list);
//执行登陆业务
app.post("/doLogin",router.doLogin);
app.post("/doCinemaSubmit",router.doCinemaSubmit);
//个人中心页
// app.get("/usercenter",router.showUserCenter);
app.get("/cinema/:targetId",router.showSelectPage);
app.post('/seatHandle', router.seatHandle)
//退出
app.get("/user_exit",router.logout);
//提交修改密码
app.post("/reviseMyMsg",router.reviseMyMsg);
app.listen(config.port, function () {
console.log("项目启动成功: " + config.port);
});
3、处理后端业务数据逻辑的router,这里router 名字可以随便取,贴切的话可以 命名为 controller 或者 model ,两个命名规范的业务划分,我统统集合在这个一个文件里。
//又提交,引入formidable
var formidable = require("formidable"); // 一个前台提交到后端接受数据的一个包,缺点: 没办法接受前端传来的数组数据
//引入封装好的db.js,从config走
var db = require("../model/db.js"); // 这里的解释转到4
var path = require("path");
var fs = require("fs");var mongo = require('mongodb');
var Ob = mongo.ObjectID;
var userData = {};
// post 请求的一种方式
//注册业务 这是一个post 的请求,接受前端传来的数据做业务处理,处理后返回前端 res.send('....') 前端ajax 获得一个返回状态,做前端数据处理
exports.doRegist = function (req,res,next) {
var form = new formidable.IncomingForm();
form.parse(req, function(err, fields, files) {
var username = fields.username;
var userpassword = fields.userpassword;
var sharecode = fields.sharecode;
// 邀请码
if (!sharecode){
res.send("-11");
return;
}
if (!Ob.isValid(sharecode)){
res.send("-11");
return;
}
// sharecode = "59ac32bbab6a439ed60ebb74"; 测试用
db.find(ds.SHARECODE, {"_id":mongo.ObjectID(sharecode)}, function(err, result){
if (err){
res.send("-11");
return;
}
if (result.length == 0){
res.send("-11");
return;
}
db.find("users",{"username": username},function (err,result) {
if(err) {
res.send("-3");
return;
}
if(result.length !=0) {//数据库查询到有数据占用
res.send("-1");//被占用
return;
}
//设置MD5加密
userpassword = md5(md5(userpassword)+"adou");
//返回result.length的长度为0,说明数据库中没有此名字
db.insertOne("users",{
"msgnum" : 0,
"username" : username,
"userpassword" : userpassword,
"nickname" : '',
"avatar" : "/user/default.jpg"
},function(err,result){
if(err){
res.send("-3");//服务器错误
return;
}
refresh(req,res,username);
// 删除此邀请码
db.deleteMany(ds.SHARECODE, {"_id":mongo.ObjectID(sharecode)}, function(err, result){});
});
});
});
});
}
// //执行登录
exports.doLogin = function (req,res,next) {
var form = new formidable.IncomingForm();
form.parse(req, function(err, fields, files) {
//表单数据
var username = fields.username;
var userpassword = fields.userpassword;
userpassword_handel= md5(md5(userpassword)+"adou");
db.find("users",{"username" : username},function(err,result){