前一段时间,公司组织了一次NodeJs的技术分享,自己有幸去听了听,第一次接触NodeJs,后来经过自己学习和探索,完成了一个很简单的Web演示项目,在这里和初学者做以分享,开发工具:WebStorm 10.04+MySql5.6;框架:Node+ExpressNode;版本:v4.2.3;视图渲染:jade模板引擎。

项目代码结构:

比较核心和关键的当然就是node开源的插件库,都可以npm命令快速的安装和卸载,这一点很像Maven,提供我们express框架和mysql的连接库,项目中这些代码库默认都在node_modules目录下;其次就是node在web项目开发中比较重要的路由中间件了,其主要功能是提供请求路由映射,有点像struts2框架的作用;再者就是views目录下存放我们需要的web展示模板,这里使用jade模板引擎;public目录存放web中用到的静态资源文件;最后为了方便代码的管理,将与数据库交互的代码单独放在dao目录下,下面分别贴出几个比较重要的源代码:

  1. var mysql=require("mysql");
  2. var localConnection=mysql.createConnection({
  3. host:"localhost",
  4. user:"root",
  5. password:"123456",
  6. database:"test"
  7. });
  8.  
  9. exports.queryCount=function(queryParam,callback){
  10.  
  11. var sql='select count(1) as total from company where 1=1';
  12. if(queryParam.name){
  13. sql=sql+' and name like ?';
  14. }
  15. if(queryParam.registNum){
  16. sql=sql+' and registNum like ?';
  17. }
  18. var param=[queryParam.name,queryParam.registNum];
  19. localConnection.query(sql,param,callback);
  20. }
  21. exports.queryAll=function(queryParam,callback){
  22. var sql='select * from company where 1=1';
  23. var param=new Array();
  24. if(queryParam.name){
  25. sql=sql+' and name like ?';
  26. param[0]=queryParam.name;
  27. }
  28. if(queryParam.registNum){
  29. sql=sql+' and registNum like ?';
  30. param[1]=queryParam.registNum;
  31. }
  32. sql=sql+' limit ?,?';
  33. param[2]=(queryParam.pageIndex-1)*queryParam.pageSize;
  34. param[3]=queryParam.pageSize;
  35. localConnection.query(sql,param,callback);
  36. }
  37. exports.delete=function(id,callback){
  38. var sql="delete from company where id=?";
  39. var param=[id];
  40. localConnection.query(sql,param,callback);
  41. }
  42. exports.save=function(company,callback){
  43. var saveSql="insert into company(id,name,address,registNum) values(?,?,?,?)";
  44. var args=new Array();
  45. args[0]=company.id;
  46. args[1]=company.name;
  47. args[2]=company.address;
  48. args[3]=company.registNum;
  49. localConnection.query(saveSql,args,callback);
  50. }
  51. exports.detail=function(id,callback){
  52. var sql="select * from company where id=?"
  53. var param=[id];
  54. localConnection.query(sql,param,callback);
  55. }
  56. exports.update=function(company,callback){
  57. var updateSql="update company set name=?,address=?,registNum=? where id=?";
  58. var param=[company.name,company.address,company.registNum,company.id];
  59. localConnection.query(updateSql,param,callback);
  60. }
  1. var express = require('express');
  2. var dao=require('../dao/dao');
  3. var router = express.Router();
  4.  
  5. /* GET users listing. */
  6. router._list=function(req, res, next){
  7. var name=(req.body.name||req.query.name);
  8. if(!name){
  9. name="";
  10. }else{
  11. name=name.replace(/\t/g,"");
  12. }
  13. var registNum=(req.body.registNum||req.query.registNum);
  14. if(!registNum){
  15. registNum="";
  16. }else{
  17. registNum=registNum.replace(/\t/g,"");
  18. }
  19. var pageIndex=req.params.pageIndex;
  20. if(!pageIndex) pageIndex=1;
  21. var queryParam={};
  22. queryParam.pageIndex=pageIndex;
  23. queryParam.pageSize=15;
  24. queryParam.name='%'+name+'%';
  25. queryParam.registNum='%'+registNum+'%';
  26. dao.queryCount(queryParam,function(err,count){
  27. if(!err){
  28. dao.queryAll(queryParam,function(err,list){
  29. if(!err){
  30. var num=count[0].total;
  31. var totalPage=Math.ceil(num/15);
  32. res.render('company/list',{dataList:list,totalCount:num,totalPage:totalPage,pageIndex:pageIndex,name:name,registNum:registNum,title:'首页'});
  33. }
  34. })
  35.  
  36. }
  37. });
  38. }
  39. router.delete=function(req,res,next){
  40. var id=req.params.id;
  41. var pageIndex=req.params.pageIndex;
  42. var name=req.body.name;
  43. var registNum=req.body.registNum;
  44. dao.delete(id,function(err,result){
  45. if(err){
  46. return next(result);
  47. }
  48. res.redirect('/company/list/'+pageIndex+"?name="+name+"&registNum="+registNum);
  49. })
  50. }
  51.  
  52. router.save=function(req,res,next){
  53. var company={};
  54. var date=new Date();
  55. company.id=Date.parse(date);
  56. company.name=req.body.name;
  57. company.address=req.body.address;
  58. company.registNum=date.getFullYear()+""+date.getMonth()+""+date.getDay();
  59. dao.save(company,function(err,result){
  60. if(err){
  61. return next(result);
  62. }
  63. res.redirect('/company/list/1');
  64. })
  65. }
  66. router.detail=function(req,res,next){
  67. var id=req.params.id;
  68. dao.detail(id,function(err,r){
  69. if(err) throw err;
  70. r[0].success=true;
  71. console.log(r[0]);
  72. res.send(r[0]);
  73. })
  74. }
  75. router.update=function(req,res,next){
  76. var company={id:req.body.id,name:req.body.name,address:req.body.address,registNum:req.body.registNum};
  77. dao.update(company,function(err,r){
  78. if(err) throw err;
  79. res.redirect('/company/list/1')
  80. })
  81. }
  82. module.exports = router;
  1. var express = require('express');
  2. var path = require('path');
  3. var favicon = require('serve-favicon');
  4. var logger = require('morgan');
  5. var cookieParser = require('cookie-parser');
  6. var bodyParser = require('body-parser');
  7.  
  8. var routes = require('./routes/index');
  9. var users = require('./routes/users');
  10.  
  11. var app = express();
  12.  
  13. // view engine setup
  14. app.set('views', path.join(__dirname, 'views'));
  15. app.set('view engine', 'jade');
  16.  
  17. // uncomment after placing your favicon in /public
  18. //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
  19. app.use(logger('dev'));
  20. app.use(bodyParser.json());
  21. app.use(bodyParser.urlencoded({ extended: false }));
  22. app.use(cookieParser());
  23. app.use(express.static(path.join(__dirname, 'public')));
  24. app.use(favicon(__dirname + '/public/favicon.ico'));
  25.  
  26. app.use('/', routes);
  27. app.use('/company/list/:pageIndex', users._list);
  28. app.use('/company/delete/:id/:pageIndex',users.delete);
  29. app.use('/company/save',users.save);
  30. app.use('/company/detail/:id',users.detail);
  31. app.use('/company/update',users.update);
  32.  
  33. // catch 404 and forward to error handler
  34. app.use(function(req, res, next) {
  35. var err = new Error('Not Found');
  36. err.status = 404;
  37. next(err);
  38. });
  39.  
  40. // error handlers
  41.  
  42. // development error handler
  43. // will print stacktrace
  44. if (app.get('env') === 'development') {
  45. app.use(function(err, req, res, next) {
  46. res.status(err.status || 500);
  47. res.render('error', {
  48. message: err.message,
  49. error: err
  50. });
  51. });
  52. }
  53.  
  54. // production error handler
  55. // no stacktraces leaked to user
  56. app.use(function(err, req, res, next) {
  57. res.status(err.status || 500);
  58. res.render('error', {
  59. message: err.message,
  60. error: {}
  61. });
  62. });
  63.  
  64. module.exports = app;
  1. include ../layout
  2. body
  3. form(id='searchForm',role='form',action='/company/list',method='post')
  4. .row
  5. .panel.panel-default
  6. .panel-body
  7. .row.form-group.form-group-sm
  8. .col-sm-4
  9. .input-group
  10. span.input-group-addon='公司名称'
  11. .input-group.col-sm-12
  12. input(name='name',placeholder='请输入公司名称',class='form-control' value='#{name}')
  13. .col-sm-4
  14. .input-group
  15. span.input-group-addon='注册工商号'
  16. .input-group.col-sm-12
  17. input(name='registNum',placeholder='请输入公司注册工商号',class='form-control' value='#{registNum}')
  18. .col-sm-2
  19. button(type='button',class='btn btn-primary btn-sm',id='qryBtn') 查询
  20. button(type='button',class='btn btn-primary btn-sm',id='resetBtn', style='margin-left:10px') 重置
  21. .row
  22. .panel.panel-default
  23. .panel-heading
  24. .btn-group
  25. a.btn.btn-default.btn-xs.new-btn='新建'
  26. table.table.table-bordered.table-hover.table-striped.table-condensed
  27. thead
  28. tr
  29. th='编号'
  30. th='公司名称'
  31. th='公司地址'
  32. th='注册工商号'
  33. th='操作'
  34. tbody
  35. each rowData,index in dataList
  36. tr
  37. td=rowData.id
  38. td=rowData.name
  39. td=rowData.address
  40. td=rowData.registNum
  41. td
  42. a(id='#{rowData.id}').btn.btn-default.btn-xs.btn-del='删除'
  43. a(id='#{rowData.id}').btn.btn-default.btn-xs.btn-update='修改'
  44. include ../pageInfo
  45.  
  46. script(type='text/javascript').
  47. $(".new-btn").click(function(){
  48. var opt={id:"",name:"",address:"",registNum:"",title:"新建注册公司",url:"/company/save"};
  49. createCommonWin(opt);
  50. });
  51. $(".btn-update").click(function(){
  52. var id=$(this).attr("id");
  53. $.ajax({
  54. type:"GET",
  55. async:false,
  56. dataType:"json",
  57. url:"/company/detail/"+id+"",
  58. success:function(data){
  59. if(data.success){
  60. var opt={id:id,name:data.name,address:data.address,registNum:data.registNum,title:"修改注册公司",url:"/company/update"};
  61. createCommonWin(opt);
  62. }
  63. }
  64. });
  65. });
  66. $("#qryBtn").click(function(){
  67. var queryUrl=$('form').attr('action');
  68. $("form").attr('action',queryUrl+'/'+parseInt($('span.nowPage').html()));
  69. $("form").submit();
  70. });
  71. $("#resetBtn").click(function(){
  72. $("form input").val("");
  73. });
  74. $('.btn-del').click(function(){
  75. var id=$(this).attr('id');
  76. var pageIndex=$("li").find("span.nowPage").html();
  77. bootbox.confirm({
  78. buttons: {
  79. confirm: {
  80. label: '确定',
  81. className: 'btn-myStyle'
  82. },
  83. cancel: {
  84. label: '取消',
  85. className: 'btn-default'
  86. }
  87. },
  88. message: '删除要删除本条记录?',
  89. callback: function (result) {
  90. if (result) {
  91. $("form").attr('action', '/company/delete/'+id+'/'+pageIndex);
  92. $("form").submit();
  93. }
  94. },
  95. title: "确认提示"
  96. });
  97. });
  98. function createCommonWin(opt){
  99. bootbox.dialog({
  100. message: "<div class='row'>" +
  101. "<div class='row form-group form-group-sm' style='text-align: center'>" +
  102. "<form class='form-horizontal' id='createForm' role='form' method='post'>" +
  103. '<div class="form-group form-group-sm" style="margin-left:20px"> ' +
  104. '<input type="hidden" value="' + opt.id + '" name="id" id="id">' +
  105. '<input type="hidden" value="' + opt.registNum + '" name="registNum" id="registNum">' +
  106. '<label class="col-sm-2 control-label"><span style="color:red;font-weight: bolder">*</span>公司名称</label> ' +
  107. '<div class="col-sm-4"><input id="name" type="text" name="name" value="'+opt.name+'" class="form-control input-md">' +
  108. '</div></br></br> ' +
  109. '<div class="form-group form-group-sm"> ' +
  110. '<label class="col-sm-2 control-label" style="margin-left:10px;"><span style="color:#ff0000;font-weight: bolder">*</span>公司地址</label> ' +
  111. '<div class="col-sm-4"><input style="width:180px" id="address" type="text" name="address" value="'+opt.address+'" class="form-control input-md">' +
  112. '</div></br></br> ' +
  113. "</form>" +
  114. "</div>" +
  115. "</div>",
  116. title: opt.title,
  117. buttons: {
  118. Cancel: {
  119. label: "取消",
  120. className: "btn-default",
  121. callback: function () {
  122. return true;
  123. }
  124. },
  125. OK: {
  126. label: "保存",
  127. className: "btn-primary",
  128. callback: function () {
  129. var subForm = $("#createForm");
  130. if (subForm.find("#name").val() == "") {
  131. alert("公司名称不能为空!");
  132. return false;
  133. } else if (subForm.find("#address").val() == "") {
  134. alert("公司地址不能为空!");
  135. return false;
  136. } else {
  137. subForm.attr("action", opt.url);
  138. subForm.submit();
  139. return true;
  140. }
  141. }
  142. }
  143. }
  144. });
  145. }

最后运行的界面:

NodeJs+Express实现简单的Web增删改查的更多相关文章

  1. 基于nodejs+express+mysql+webstorm+html的 增删改查

    一.工具准备 Nodejs框架,WebStorm.Mysql服务.Navicat.此篇文章只讲项目的搭建过程,至于Nodejs,WebStorm.Mysql的下载.安装与配置网上资源很多,请自行查阅, ...

  2. salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建

    VisualForce封装了很多的标签用来进行页面设计,本篇主要讲述简单的页面增删改查.使用的内容和设计到前台页面使用的标签相对简单,如果需要深入了解VF相关知识以及标签, 可以通过以下链接查看或下载 ...

  3. 【Mybatis】简单的mybatis增删改查模板

    简单的mybatis增删改查模板: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE map ...

  4. 【转载】salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建

    salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建   VisualForce封装了很多的标签用来进行页面设计,本篇主要讲述简单的页面增删改查.使用的内容和设计到前台页面使用的 ...

  5. 最简单的mybatis增删改查样例

    最简单的mybatis增删改查样例 Book.java package com.bookstore.app; import java.io.Serializable; public class Boo ...

  6. node+express+mysql实现简单的数据增删改查

    前提 电脑已经安装了node,express,mysql. 实现步骤 1.新建数据库表 附数据表结构: 2.创建exprss项目 express -e myapp  新建一个以ejs为模板的expre ...

  7. SQL简单语句(增删改查)

    简单的SQL语句增删改查操作 说明: 在mysql里面亲测结果正确    用到的表(学生表:studnets) 1.创建一个学生表,(学号,姓名,性别,家庭住址) mysql> create t ...

  8. KbmMemTable的简单应用(增删改查示例)

    //kbmMemTable unit Unit1;   interface   uses   Windows, Messages, SysUtils, Variants, Classes, Graph ...

  9. Asp.net简单三层+Sqllite 增删改查

    新建项目à新建一个空白解决方案 在Model新建一个实体类 using System; using System.Collections.Generic; using System.Linq; usi ...

随机推荐

  1. PHP 13: 类

    原文:PHP 13: 类 Notice: This article is working on progress!本章将介绍PHP类.现在,基本上每种语言都支持面向对象,当然PHP也不列外.PHP在以 ...

  2. C# 对Outlook联系人的增、删、查 

    原文:C# 对Outlook联系人的增.删.查 [转] 注:定义变量 Outlook.Application myOlApp = new Outlook.ApplicationClass(); Out ...

  3. leetcode第28题--Divide Two Integers

    Divide two integers without using multiplication, division and mod operator. 分析:题目意思很容易理解,就是不用乘除法和模运 ...

  4. js 文字预写匹配

    效果图: demo如下: <!DOCTYPE html> <html> <head> <title>文字预写</title> </he ...

  5. Android项目---webView

    之前用webView的时候,只知道它可以加载出html页面,竟然不知道,它也可以与js进行交互. WebView是一个网络视图,能加载显示网页,可以将它看作一个浏览器.它使用WebKit渲染引擎加载显 ...

  6. 在SQL Server中添加Linked Server 图解版

    在开发中,经常需要一个SQL Server服务器去访问另一个服务器,微软提供了一种方式Linked Server 下面是配置流程: 1).打开Server Objects下 Linked Server ...

  7. 临时对象与NRV技术

    <More Effective C++>中讲到,在C++中真正的临时对象是看不见的,它们不出现在你的源代码中.建立一个没有命名的非堆(non-heap)对象会产生临时对象,这种未命名的对象 ...

  8. SignalR 2.0 入门与提高

    SignalR 2.0 入门与提高 SignalR 2.0 最近整理了SignalR2.0 部分知识点,原文翻译,由于自己是土鳖,翻译得不好的地方,欢迎指正!仅供各位初学者学习! 第一节. 入门ASP ...

  9. valuechange(动态的监听input,textarea)

    valuechange(动态的监听input,textarea)之前值,之后值的变化 jQuery封装自定义事件--valuechange(动态的监听input,textarea)之前值,之后值的变化 ...

  10. MFC圆角背景移动边角底色毛刺解决方案

    CRect rc; Graphics graphics(pDC->m_hDC); GetClientRect(&rc); CRgn m_rgn; if (m_pBgImage) { gr ...