资讯专栏INFORMATION COLUMN

一个简单express+jade+mysql+bootstrap+nodejs的demo

sherlock221 / 785人阅读

摘要:迅速发展,目前最热的构建框架非莫属,在上有的就可以证明。下面就以为中心构建一个前后端都包含在内的简单吧。简单的能让你迅速地了解到工作流程。创建并初始化项目首先,进入到你的工作目录新建一个项目目录并打开通过命令为你的项目创建一个文件。

Nodejs迅速发展,目前最热的Nodejs构建框架非express莫属,在Github上有32k的star就可以证明。下面就以Nodejs为中心构建一个前后端都包含在内的简单demo吧。

不管开发什么项目,有了脚手架之后不管对于理解还是开发都会变得容易。简单的demo能让你迅速地了解到工作流程。废话不多说,开始构建吧!

1、安装和配置环境
1.1、 安装Node.js与NPM
Windows下安装 Node.js 还是比较方便的,请自行下载并安装, 安装包及源码下载地址为: https://nodejs.org/en/download/ 。安装过程傻瓜式一直‘NEXT’就可以。安装完成后打开命令行输入node -v返回相应的版本号说明环境变量配置成功了。
NPM 是随同 Node.js 一起安装的包管理器,新版的 Node.js 已经集成了 npm ,所以NPM也一并安装好了。

1.2、创建并初始化项目
首先,进入到你的工作目录新建一个项目目录并打开

D:WWW>mkdir nodejs-express-mysql-jade && cd nodejs-express-mysql-jade

通过 npm init 命令为你的项目创建一个 package.json 文件。

D:WWW
odejs-express-mysql-jade>npm init

该命令会要求你输入一些参数,包括应用名、版本等,可以直接按回车设置为默认值。需要注意的是,其中有一项为 entry point: ,它的值为项目的入口文件,你可以设置成你想要的名称,例如 app.js 或者 index.js 等,在这儿我就默认选择了 app.js 。

1.3、安装express和应用生成器express-generator
通过npm直接安装生成器express-generator

npm install express express-generator -g

然后使用express [name]或者直接express命令构建一个项目;name是你输入的文件名,不填就在当前目录构建。

express

构建完成后的目录结构:

然后安装所有的依赖包,如果你写了上面的[name],那么进入到[name]下目录后运行npm install,如果没有写名字,在当前目录直接运行npm install。

npm install

1.4、运行项目

运行命令

set DEBUG=myapp & npm start

然后在浏览器中打开 http://localhost:3000/ 网址就可以看到这个应用了。

当然每次更新代码都要重执行一次命令显得效率低,安装nodemon

npm install nodemon -g

修改package.json:

  "scripts": {
    "start": "set DEBUG=myapp & nodemon ./bin/www"
  },

之后每次只要更新了文件,服务器都会自动更新并启动了,直接去页面刷新即可。

到这里第一步的构建工作已经结束了。

2、连接后台

2.1、安装mysql并连接数据库

npm install mysql -g

安装包之后在项目根目录下新建两个目录如下图红色框所示

在本地建一个数据库user,并建一张user表,然后加入三个字段id、name、age;

其中conf.js:

// MySQL数据库联接配置
module.exports = {
    mysql: {
        host: "localhost", 
        user: "root",
        password: "",
        database:"user", // 前面建的user表位于这个数据库中
        port: 3306
    }
};

userSqlMapping.js:

var user = {
    insert:"INSERT INTO user(name, age) VALUES(? , ?)",
    update:"UPDATE user SET name = ?, age = ? WHERE id = ?",
    delete: "DELETE FROM user WHERE id=?",
    queryById: "SELECT * FROM user WHERE id=?",
    queryAll: "SELECT * FROM user"
};

module.exports = user;

userDao.js:

// 实现与MySQL交互
var mysql = require("mysql");
var $conf = require("../conf/conf");
// var $util = require("../util/util");
var $sql = require("./userSqlMapping");

// 使用连接池,提升性能
var pool = mysql.createPool( $conf.mysql );

// 向前台返回JSON方法的简单封装
var jsonWrite = function (res, ret) {
    if(typeof ret === "undefined") {
        res.json({
            code:"1",
            msg: "操作失败"
        });
    } else {
        res.json(ret);
    }
};

module.exports = {
    add: function (req, res, next) {
        pool.getConnection(function(err, connection) {
            // 获取前台页面传过来的参数
            var param = req.query || req.params;

            // 建立连接,向表中插入值
            // "INSERT INTO user(id, name, age) VALUES(0,?,?)",
            connection.query($sql.insert, [param.name, param.age], function(err, result) {
                if(result) {
                    result = {
                        code: 200,
                        msg:"增加成功"
                    };    
                }
                // 以json形式,把操作结果返回给前台页面
                jsonWrite(res, result);
                // 释放连接 
                connection.release();
            });
        });
    },
    delete: function (req, res, next) {
        // delete by Id
        pool.getConnection(function(err, connection) {
            console.log(req.query.id);
            var id = +req.query.id;
            connection.query($sql.delete, id, function(err, result) {
                if(result.affectedRows > 0) {
                    jsonWrite(res, result);
                    result = {
                        code: 200,
                        msg:"删除成功"
                    };
                } else {
                    result = void 0;
                }
                jsonWrite(res, result);
                connection.release();
            });
        });
    },
    updateUser: function (req, res, next) {
        var param = req.body;
        console.log(param);
        if(param.name == null || param.age == null) {
            jsonWrite(res, undefined);
            return;
        }
        pool.getConnection(function(err, connection) {
            connection.query($sql.update, [param.name, param.age, param.id], function(err, result) {
                // 使用页面进行跳转提示
                // if(result.affectedRows) {
                //     res.render("suc",{
                //         title:"成功页",
                //         result: result
                //     });                     // 第二个参数可以直接在jade中使用
                // } else {
                //     res.render("fail",  {
                //         result: result
                //     });
                // }
                jsonWrite(res, result);
                connection.release();
            });
        });
    },
    queryById: function (req, res, next) {
        var id = +req.query.id;                     // 为了拼凑正确的sql语句,这里要转下整数
        pool.getConnection(function(err, connection) {
            connection.query($sql.queryById, id, function(err, result) {
                jsonWrite(res, result);
                connection.release();
            });
        });
    },
    queryAll: function (req, res, next) {
        pool.getConnection(function(err, connection) {
            connection.query($sql.queryAll, function(err, result) {
                // jsonWrite(res, result);
                res.render("list",{
                    title:"列表页",
                    result:result
                });
                connection.release();
            });
        });
    }
};

2.2、更新路由
编辑routes/users.js

var express = require("express");
var router = express.Router();
var userDao = require("../dao/userDao");

/* GET users listing. */
router.get("/", function(req, res, next) {
  res.send("respond with a resource");
});
// 增加用户
router.get("/addUser", function(req, res, next) {
    userDao.add(req, res, next);
});
router.get("/addUserMiddle", function(req, res, next) {
    res.render("addUser",{
        title:"添加用户页"
    });
});
//查看全部用户
router.get("/queryAll", function(req, res, next) {
    userDao.queryAll(req, res, next);
});
//查询指定用户
router.get("/query", function(req, res, next) {
    userDao.queryById(req, res, next);
});
//删除用户 
router.get("/deleteUser", function(req, res, next) {
    userDao.delete(req, res, next);
});
//更新用户信息
router.post("/updateUser", function(req, res, next) {
    userDao.updateUser(req, res, next);
});

module.exports = router;

2.3、安装bootstrap添加对应的视图文件

安装bootstrap先安装bower

npm install bower -g

安装完了bower之后,编辑.bowerrc文件。能够把下载的包放在对应的位置上:

{
  "directory" : "public/libs"
}

安装bootstrap包:

bower install bootstrap

不过最近bower好像一直在维护,这样的话就用npm安装bootstrap和jquery包了。

npm install bootstrap@3 --save
npm install jquery --save

安装完了之后,因为没用webpack,包模块管理起来没那么方便。所以就用gulp直接把包拉到资源目录public下

npm install gulp -g

在跟package.json同目录下建一个gulpfile.js文件,输入以下代码:

var gulp = require("gulp");

gulp.task("moveJquery" , function(){
    return gulp.src("node_modules/jquery/*/*")
    .pipe(gulp.dest("public/libs/jquery"));
});

gulp.task("moveBootstrap" ,["moveJquery"] ,  function(){
    return gulp.src("node_modules/bootstrap/*/*/*")
    .pipe(gulp.dest("public/libs/bootstrap/"));
});

在命令行输入:

gulp moveBootstrap

这样就把node_modules下的包拉到了public/libs下了

最后在layout.jade上引入相应的文件:

doctype html
html
    head
        title #{title}
        link(rel="stylesheet", href="/libs/bootstrap/dist/css/bootstrap.min.css")
        script(src="/libs/jquery/dist/jquery.min.js")
        script(src="/libs/bootstrap/dist/js/bootstrap.min.js")
    body
        block content

其他的视图就不在这里一一列举了。

完成全部工作之后,在浏览器上输入localhost:3000/users/queryAll就可以完成如下图所示的所有操作啦。

运行结果图:

添加用户:

编辑用户信息:

用户信息列表:

过滤用户信息,这里只简单地写了根据id过滤,这里不重点讲这个:

讲到这里,就已经讲完了。对于刚接触Nodejs的童鞋来说,这是个蛮不错的demo。

下次继续完善前端工具方面的内容。webpack配置热更新等等。。。这样在更新完你的代码之后直接去页面就可以看到效果了,连F5都不用按,这些细节会大大地提高开发效率。

项目地址:Demo,只想了解流程又不想构建的童鞋直接clone到本地哦。对你有丁点的帮助请给个star哈!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/83160.html

相关文章

  • 梦幻西游手游炼药信息采集系统(Node.js+Express+Bower+Bootstrap+Mon

    摘要:后天开题答辩了,报告没整完做,答完再继续做。预祝大家游戏玩的开心,代码写的顺心。先把这第一版放出来,小弟初学此道,还请大家批评指正如果文中有对广州网易计算机系统有限公司侵权的行为,请联系我,立马删文。 梦幻西游手游炼药信息采集系统 一、初衷 本文不是软文!!!本文不是软文!!!本文不是软文!!!文章开始重要的事情说三遍!!!初中时玩一款网易的游戏叫《梦幻西游》,前两天看朋友在玩《梦幻西...

    Hegel_Gu 评论0 收藏0
  • 个人博客主页搭建随笔

    摘要:博主目前的这个项目还不算很大,模块依赖简单,但期望完成诸如版本号替换,压缩代码,合并文件,发布到服务器等和模块化关系不大的工作,所以使用了。同时,对和附加缓存,配合和版本号实现服务器更新,这一部分其实已经帮我们实现好了。 经常在各种论坛、博客还有 github 上活跃的朋友不难发现,许多大牛都有自己的网站,也多以博客为主。博主作为一个立志前端的大白,难道不应该和大牛学习么?说干就干,前...

    whjin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<