7

说明

为了教女友node中数据库的使用,花了几个小时看了一下sequelize这个orm框架,然后写了一个简单的留言板,可以实现发表留言,删除留言,修改留言.
(注:我本身不是学js的,node也就断断续续学了几天,半吊子,有不对的或者写的不好的地方希望指出.)
NodeJs版本:0.12.4(有点老了。。。)
系统:Ubuntu 14.04(系统貌似都差不多)

开始

安装

生成express项目,用ejs模板渲染

express -e message_board
cd message_board 
npm install

安装sequelize以及mysql驱动

npm install --save sequelize
npm install --save mysql

用phpmyadmin创建一个数据库
创建数据库

代码编写

首先看看项目结构:

项目结构
这里创建一个model文件夹,message.js用来连接数据库,并定义message模型,也就是留言板里的每一条留言。
routes文件夹中,index.js用来处理添加留言、删除留言。edit.js用来处理编辑留言。
views文件夹中有一个404.js,当缺少参数时,会跳转到这个页面中,显示“404, Not Found。”

代码:

message.js:

var Sequelize = require('sequelize');
var sequelize = new Sequelize(
    'message_board',    //数据库名
    'root',             //用户名
    'root',             //密码
    {
        'dialect': 'mysql',
        'host': 'localhost',
        'port': 3306
    }
);

//定义表的模型
var Message = sequelize.define('message', {
    id:{ //自增长id,主键,整形
        type:Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement:true
    },
    username: { //谁留的言
        type: Sequelize.STRING(30)
    },
    content: { //留言的内容
        type: Sequelize.TEXT
    }
});
Message.sync(); //创建表

module.exports = Message;



index.js:

var express = require('express');
var router = express.Router();
//引入数据库Message模块
var Message = require('../model/message');

//查找所有留言
router.get('/', function(req, res, next) {
    Message.findAll().then(function(msgs) {
        res.render('index', { messages: msgs });
    });
});

//删除一个留言
router.get('/del_msg', function(req, res, next) {
    //如果没有id字段,返回404
    if (req.query.id == undefined ||req.query.id == '') {
        res.render('404', {});
        return;
    }
    //先查找,再调用删除,最后返回首页
    Message.findOne({
        where:{
            id:req.query.id
        }
    }).then(function(msg){
        msg.destroy().then(function(){
            console.log('delete success !!');
            res.redirect('/');
        });
    });
});

//添加一条留言
router.post('/add_msg', function(req, res, next) {
    //如果没有post数据或者数据为空,直接返回
    if (req.body.username == undefined ||req.body.username == ''
        || req.body.content == undefined || req.body.content == '') {
        res.render('404', {});
        return;
    }
    var message = {
        username: req.body.username,
        content: req.body.content
    };
    //创建一条记录,创建成功后跳转回首页
    Message.create(message).then(function(msg){
        console.log(msg);
        res.redirect('/');
    });
});

module.exports = router;

index.ejs:

<!DOCTYPE html>
<html>
  <head>
    <title>NodeJs留言板</title>
  </head>
  <body>
    <h1>NodeJs留言板</h1>
    <h3>发表留言</h3>
    <form method="post" action="/add_msg">
        你的名字:&nbsp;&nbsp;<input name="username" type="text"><br/><br/>
        留言内容:&nbsp;&nbsp;<textarea name="content"></textarea><br/><br/>
        <input type="submit" value="发表留言"/>
    </form>
    <h3>留言版</h3>
    <hr/>
    <% for(var i = messages.length - 1; i>=0; i--) {%> <!-- ejs for循环输出留言板内容 -->
    <b>名字:</b>&nbsp;&nbsp;&nbsp;&nbsp;<%=messages[i].username %><br/>
    <b>内容:</b><br/>
    <%=messages[i].content %><br/>
    <a href="/edit?id=<%=messages[i].id %>">编辑留言</a>&nbsp;&nbsp;&nbsp;<a href="/del_msg?id=<%=messages[i].id %>">删除留言</a>
    <hr/>
    <% } %>
  </body>
</html>

edit.js:

var express = require('express');
var router = express.Router();
//引入数据库Message模块
var Message = require('../model/message');

//查找一个留言
router.get('/', function(req, res, next) {
    //如果没有id或者id为空,直接返回
    if (req.query.id == undefined || req.query.id == '') {
        res.render('404', {});
        return;
    }
    Message.findOne({
            where:{
                id:req.query.id
            }
    }).then(function(msg){
        res.render('edit', { message: msg });
    });
});

//更新一条留言
router.post('/update_msg', function(req, res, next) {
    //如果没有post数据或者数据为空,直接返回
    if (req.body.username == undefined ||req.body.username == ''
        || req.body.content == undefined || req.body.content == ''
        || req.body.id == undefined || req.body.id == '') {
        res.render('404', {});
        return;
    }
    var message = {
        username: req.body.username,
        content: req.body.content,
    };
    //创建一条记录,创建成功后跳转回首页
    Message.update(message,{
        where:{
            id:req.body.id
        }
    }).then(function(msg){
        console.log(msg);
        res.redirect('/');
    });
});

module.exports = router;

edit.ejs:

<!DOCTYPE html>
<html>
<head>
    <title>NodeJs留言板</title>
</head>
<body>
<h3>修改留言</h3>
<form method="post" action="/edit/update_msg">
    <input type="hidden" name="id" value="<%=message.id %>">
    名字:&nbsp;&nbsp;<input name="username" type="text" value="<%=message.username %>"><br/><br/>
    留言:&nbsp;&nbsp;<textarea name="content"><%=message.content %></textarea><br/><br/>
    <input type="submit" value="提交修改"/>
</form>
</body>
</html>

效果

发表留言:
发表留言

删除留言:
删除留言

编辑留言:
修改

编辑后:
修改后

代码下载:

http://nladuo.github.io/2016/...


叁公子_KCN
583 声望40 粉丝

全栈工程师。CS博士生