Node项目

Node项目

项目开发流程

  • 项目需求

    自有产品 --> 产品部门 外包项目 --> 需求部门

    -->

    需求文档 -->

    产品经理:交互稿:原型设计 -->

    UI设计设:UI图:PSD图 -->

    前端:根据交互稿和PSD图 实现html和里面的特效 -->

    后端:实现数据库和后端功能和接口的实现 -->

    测试人员:测试功能是否正常,记录到bug反馈系统 -->

    项目发布到生成环境

搭建项目结构

  • dist
  • src
    • controller
    • views
    • model
    • route
    • www
    • app.js
  • package.json
  • README.md

glob 获取目录下的文件路径

  • 安装

    • npm install glob --save
  • 使用

var glob = require("glob")

glob("**/*.js",  function (er, files) {
  // files is an array of filenames.
})

加载所有路由模块

  • 方式一:
//读取静态资源  访问路径 www/index.html
app.use("/www", express.static(path.join(__dirname,"www")));

//导入路由模块
const home = require("./route/home.js");
const sign = require("./route/sign.js");
app.use("/home",home);
app.use("/sign",sign);
  • 方式二:
//加载所有路由模块

//const glob = require("glob");
let files =  glob.sync("./route/*.js");
//files文件的路径数组
//files.forEach((item)=>{
//    const route = require(item);
//    //获取文件的名字
//    let name =  path.basename(item, ".js");
//    app.use("/"+name,route);
//});


let files =  glob.sync("./route/*.js");
//files文件的路径数组
files.forEach((item)=>{
    const route = require(item);
    app.use(route.prefix, route);
});

错误处理

//处理错误--请求的文件不存在-404
app.use((req,res,next)=>{
    //res.status(404).send("4041111");
    res.status(404);
    res.redirect("/404/index.html");
});

//处理错误--服务器错误-500
app.use((err,req,res,next)=>{
    res.status(500);
    res.redirect("/www/500/index.html");
});

设置模板,加载首页

const xtpl = require("xtpl");
app.set('views','./views');
app.set('view engine', 'html');
app.engine('html',xtpl.renderFile);


//读取静态资源  访问路径 http://127.0.0.1:8888/404/index.html
app.use(express.static(path.join(__dirname,"www")));
//控制器中
const controller = module.exports;
controller.getindex = (req,res)=>{
    res.render('blog/index',{array: data},(err,html)=>{
       res.send(html);
    });
};

//路由中
const home = module.exports = express.Router();
home.prefix = "/home";
const controller = require("../controller/home");
home.get("/index",controller.getindex);

从数据库中加载数据

  • 导入包 mysql和orm

    • npm install orm --save
    • npm install mysql --save
  • model中创建对象和表的映射

module.exports = (db, models)=>{
    models.post = db.define("posts", {
        id: { type: 'serial', key: true },
        slug: String,
        title: String,
        excerpt: String,
        content: String,
        status: String,
        comment_status: String,
        comment_count: Number,
        view_count: Number,
        created: Date,
        user_id: Number,
        parent_id: Number,
        type: String
    });

    models.user = db.define("users",{
        id: { type: 'serial', key: true },
        slug: String,
        username: String,
        password: String,
        nickname: String,
        email: String,
        status: String,
        created: Date,
        role: String,
        token: String
    });

    models.comment = db.define("comments",{
        id: { type: 'serial', key: true },
        author: String,
        author_email: String,
        author_ip: String,
        content: String,
        status: String,
        support: Number,
        oppose: Number,
        created: Date,
        post_id:Number,
        parent_id: Number,
        user_id: Number
    });
}
  • app.js中创建连接,导入映射
//设置orm
const orm = require("orm");
app.use(orm.express("mysql://root:@localhost:3306/myblog",{
    define: function(db, models, next){
        //
        let m = require("./model/model.js");
        m(db,models);
        next();
    }
}));
  • 控制器中获取数据
controller.getindex = (req,res)=>{
    let where = {};
    req.models.post.find(where,(err,data)=>{
        if(err)throw err;
        //获取到所有post
        console.log(data);

        res.render('blog/index',{array: data},(err,html)=>{
            res.end(html);
        });
    });
};

首页渲染数据

controller.getindex = (req, res)=>{
    let where = {};
    req.models.post.find(where,{limit:5},["id","A"],(err,data)=>{
        if(err)throw err;
        //获取到所有post

        //把日期转换一下
        data.forEach((item)=>{
            item.created = item.created.toDateString();
        });

        res.render('blog/index',{array: data},(err,html)=>{
            res.send(html);
        });
    });
};

获取帖子的详细内容

  • 设置路由
post.get("/:userid/:id", controller.getpost);
  • 设置控制器

//获取帖子
controller.getpost = (req, res)=>{

    //获取参数
    let userid = req.params.userid;

    //检查用户是否存在
    req.models.user.find({id:userid}, (err, user)=>{
        if(err)throw err;

        if(!user || user.length == 0) {
            res.status(404);
            res.redirect("/404/index.html");
        }
    });

    //获取帖子
    let id = req.params.id;
    req.models.post.find({user_id:userid,id:id},(err,post)=>{
        if(err)throw err;

        if(!post || post.length == 0) {
            res.status(404);
            res.redirect("/404/index.html");
            return;
        }

        post[0].created = post[0].created.toDateString();
        //输出页面
        res.render('blog/post',{post:post[0]},(err,html)=>{
            res.send(html);
        });
    });
}
  • 设置模板

    • 模板中使用 {{{ }}} 不转移内容的html

获取评论列表

  • 设置路由,传递帖子的id,新建comment.js路由
post.prefix = "/comment";
const controller = require("../controller/comment");
//id是帖子的id
post.get("/:id", controller.getcomment);
  • 设置控制器
controller.getcomment = (req, res)=>{
    //根据帖子的id 查询该帖子下的所有评论
    let id = req.params.id;

    //查询某个帖子下的所有评论
    req.models.comment.find({post_id: id}, (err, datas) => {
        if(err)throw err;
        res.send(datas);
    });
}
  • 页面,发送ajax请求,设置内容

支持、反对

  • 设置路由
  • 设置控制器
  • 页面发送ajax请求
  • 根据ip判断是否已经发过评论
controller.support = (req, res) => {
    //获取客户端的ip
    //console.log(req.socket.remoteAddress);
    req.models.comment.find({author_ip:req.socket.remoteAddress}, (err, data)=>{
        if(data && data.length>0) {
            let data = {d:-1};
            res.send(data);

        }else{
            //支持  id 是评论的id
            req.models.comment.get(req.params.id,(err,comment)=>{
                comment.support++;
                //保存
                comment.save();

                let data = {d:comment.support};
                res.send(data);
            })
        }
    });
}

发表评论

  • 获取post过来的参数
    • 安装body-parser npm install body-parser --save
const bodyparser = require("body-parser");
//处理application/x-www-form-urlencoded的 parser
app.use(bodyparser.urlencoded({ extended: false }));

//获取post来的数据
req.body
  • 路由
  • 控制器
//发布评论
controller.create = (req, res) => {
    req.models.comment.create({
        author: req.body.name,
        author_email: req.body.email,
        content: req.body.comment,
        author_ip: req.socket.remoteAddress,
        post_id: req.body.id,
        support: 0,
        oppose: 0
    },(err, comment)=> {
        if(err) throw err;
        //查询某个帖子下的所有评论
        req.models.comment.find({post_id: req.body.id}, (err, datas) => {
            if(err)throw err;
            //修改时间的格式
            datas.forEach((item)=>{
                item.created = item.created.toDateString();
            });
            res.send(datas);
        });
    })
}
  • 页面
//发布评论
      $(".btn").click(function () {
          var json = $("#f1").serialize();

          $.post("/comment/create",json, function (datas) {
              if(datas) {
                  //使用layer插件弹出层
                  //layer.alert("发表成功");
                  layer.msg("发布成功");
                  var html = template("tpl",{datas:datas});
                  $("#comment").html(html);
              }else{
                  layer.msg("发布失败");
              }

          });
          return false;
      });
原文地址:https://www.cnblogs.com/bici/p/6126271.html