用了几天时间走了一趟沐风ol的实战教程,很感谢Up主,因为我怕学了忘,所以记录下来,以便后来进行观看记录,这几天,我彻底明白了前后端如何分离操作,如何连接数据库操作,如何在前台渲染数据,如何区分后台渲染和前台渲染。接下来,我还要把这个应用到我毕设上面,用Vue框架实现的工程和Node.js融合,最后,再次感谢Up主的实战视频

第一步:新建js文件先安装这两个指令

npm install --save art-template
npm install --save express

第二步:渲染data数据,并展示出来

// node.js
// 模板引擎整合

const express = require('express');

const path = require('path');

const template = require('art-template');

const app = express();

//设置模板的路径

app.set('views',path.join(__dirname,'views'));

//设置模板引擎

app.set('view engine','art');

//使express兼容art-template模板引擎

app.engine('art',require('express-art-template'));

app.get('/list',(req,res)=>{
    let data = {
        title:'水果',
        list:['apple','orange','banana']
    }
    res.render('list',data);
});

app.listen(3000,()=>{
    console.log('runing....');
});

list.art

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>模板</title>
  </head>
  <body>
        <div>{{title}}</div>
        <div>
        <ul>
            {{each list}}
            <li>{{$value}}</li>
            {{/each}}
        </ul>
        </div>
  </body>
</html>

第三步:实现json数据的业务模块、路由模块设置、以及json数据的渲染

// index.js

//图书馆管理系统入口文件

const express = require('express');
const router = require('./router.js');//第一步
const path = require('path');
const template = require('art-template');
const bodyParser = require('body-parser');
const app = express();

//设置模板的路径

app.set('views',path.join(__dirname,'views'));

//设置模板引擎

app.set('view engine','art');

//使express兼容art-template模板引擎

app.engine('art',require('express-art-template'));

//处理请求参数
//挂在参数处理中间件(post)
app.use(bodyParser.urlencoded({extended:false}));
//处理json格式的参数
app.use(bodyParser.json());


//启动服务器功能
//配置路由
app.use(router);//第二步
//监听端口
app.listen(3000,()=>{
    console.log('running...');
})

// router.js

// 路由模块
const express = require('express');
const router = express.Router();
const service = require('./service.js');

//路由处理
router.get('/',service.showIndex);

module.exports = router;

// service.js

// 业务模块

//加载所有数据
const data = require('./data.json');

//渲染主页面
exports.showIndex = (req,res)=>{
    res.render('index',{list:data});
}

index.art

<tbody>
     {{each list}}
     <tr>
         <td>{{$value.id}}</td>
         <td>{{$value.name}}</td>
         <td>{{$value.author}}</td>
         <td>{{$value.category}}</td>
         <td>{{$value.desc}}</td>
         <td><a href="#">修改</a>|<a href="#">删除</a></td>
     </tr>
     {{/each}}
 </tbody>

运行node index.js,打开localhost:3000就可以看到效果了。

目录截图

node.js程序员项目总结 node.js开发实战_node.js程序员项目总结

第四步:样式单独抽取到静态资源里

目录

node.js程序员项目总结 node.js开发实战_json_02

index.js

node.js程序员项目总结 node.js开发实战_node.js程序员项目总结_03

index.art

node.js程序员项目总结 node.js开发实战_json_04


添加图书功能:

index.art 通过href跳转到toAddBook

node.js程序员项目总结 node.js开发实战_json_05

router.js service.toAddBook是方法

node.js程序员项目总结 node.js开发实战_html_06

service.js

node.js程序员项目总结 node.js开发实战_html_07

addBook.art

node.js程序员项目总结 node.js开发实战_数据_08

data.json格式化快捷键Ctrl+K Ctrl+F

初始界面:通过action发起post请求

addBook.art

node.js程序员项目总结 node.js开发实战_数据_09

router.js 执行service的addBook方法

node.js程序员项目总结 node.js开发实战_node.js程序员项目总结_10

service.js

node.js程序员项目总结 node.js开发实战_数据_11


node.js程序员项目总结 node.js开发实战_html_12


解释:

//第一步,执行方法,获取表单数据req.body

把info的内容赋值给book

//第二步,获取当前json数据的最大那个id,赋给新增的数据,所以需要执行自动生成图书编号的函数,把每一个item的id赋给新数组arr,并且返回arr数组的最大位置。

//第三步,把新增id赋给新的图书,把数据存入内存data里面。

//第四步,需要进行文件存取操作,引入path和fs模块

//第五步,fs.writeFile(写入路径,写入内容(把data转换成字符串,因为data是文本文件))注意:

//会清除json文件的所有空格

node.js程序员项目总结 node.js开发实战_node.js程序员项目总结_13


//会格式化数据的时候,前面填充四个空格

node.js程序员项目总结 node.js开发实战_数据_14


注意:记得重启node服务

第五步:修改图书信息(删除请看第十步)

分两步实现:查询、修改

index.art

点击跳转到toEditBook,并且传输id值

node.js程序员项目总结 node.js开发实战_json_15

router.js

跳转到toEditBook

node.js程序员项目总结 node.js开发实战_json_16


执行方法:

node.js程序员项目总结 node.js开发实战_json_17


执行完跳转到editBook.art模板里,同时渲染指定id的内容到表单里

以上为修改的第一步,查询渲染

editBook.art

node.js程序员项目总结 node.js开发实战_html_18

红框内容告诉服务器编辑的id是哪一个,必须指定,否则无效果

执行到/editBook路由的post请求

router.js

node.js程序员项目总结 node.js开发实战_node.js程序员项目总结_19

service.js

node.js程序员项目总结 node.js开发实战_json_20

获取内容的id,找到相同id的内容,新内容替换旧内容,return执行终止操作。然后执行保存文档操作。红框操作部分都是一样的。

第六步:数据库连接

node.js程序员项目总结 node.js开发实战_json_21

注:新建表可以选择自动增长的id

initsql.js

node.js程序员项目总结 node.js开发实战_数据_22

注:生成sql脚本的js,执行node方法

node.js程序员项目总结 node.js开发实战_node.js程序员项目总结_23


新建目录,用npm init -y生成package.json,新建Index.js用来连接数据库:

mydb/index.js

node.js程序员项目总结 node.js开发实战_html_24

注:connection.query里面的语句执行查询数据,可以通过百度npm>搜索mysql>install找到这些代码,
 cnpm install mysqljs/mysql

第七步:数据库的增删改查(测试)

目录

node.js程序员项目总结 node.js开发实战_json_25

总共有4个文件,分别是增删改查的js

4个js文件,基础内容都是:

node.js程序员项目总结 node.js开发实战_json_26

红框部分就是主要不同的地方:

insert.js

let sql = 'insert into book set ?'

let data = {
    name:'明朝那些事',
    author:'当年明月',
    category:'文学',
    description:'明朝的历史'
}

update.js

let sql = 'update book set name=?,author=?,category=?,description=? where id=?';
//这里的where是限定只修改一个数据,如果不设置就会更新所有数据

let data =['浪潮','浪潮','浪潮','浪潮',36];
  //操作数据库

delete.js

let sql = 'delete from book where id=?';
//这里的where是限定只修改一个数据,如果不设置就会更新所有数据
let data =[36];//也要数组的符号,这是格式要求

select.js

let sql = 'select * from book where id = ?';
//这里的where是限定只修改一个数据,如果不设置就会更新所有数据
let data =[1];

注:返回的参数都是以results体现。

第八步:封装操作数据库的通用API

db.js

node.js程序员项目总结 node.js开发实战_node.js程序员项目总结_27


基础内容不变,通过exports暴露出去,方法为base(),同时,数据库操作是异步的,需要使用回调函数返回结果。

测试文件dbtest.js

node.js程序员项目总结 node.js开发实战_node.js程序员项目总结_28


通过传输参数,执行db.base()方法就可以完美地进行数据库的各项操作了。

第九步:登录验证(前端+后端+数据库)

目录

node.js程序员项目总结 node.js开发实战_node.js程序员项目总结_29


新建上图三个文件,package.json用cnpm init -y创建,并安装express,和body-parser模块

login.js

node.js程序员项目总结 node.js开发实战_数据_30

注:引入db.js数据库通用API

login.html

node.js程序员项目总结 node.js开发实战_json_31


在浏览器端打开localhost:3000/login.html访问,填写内容后点击提交post请求,打开check路由执行方法会查询数据库并且返回结果。

第十步:图书馆管理系统的增删改查(去掉json,更新为数据库动态操作)

主要更新了service.js的内容:

(一)渲染模块

node.js程序员项目总结 node.js开发实战_json_32

(二)添加图书模块

node.js程序员项目总结 node.js开发实战_html_33

(三)更新图书模块

node.js程序员项目总结 node.js开发实战_html_34

(四)删除图书模块

由于前面没有写,所以这里多加一些描述:

index.art

node.js程序员项目总结 node.js开发实战_html_35

router.js

node.js程序员项目总结 node.js开发实战_html_36

service.js

node.js程序员项目总结 node.js开发实战_数据_37

注:查询操作体现在渲染界面以及更新操作上,
另外,所有的.art文件里面的desc全部替换为了description,避免进行数据库操作,“desc”为排序所用。

第十一步:后台接口开发

(一)JSON

目录

node.js程序员项目总结 node.js开发实战_html_38

注:新建文件夹api和文件index.js,package.json等,安装express,mysql模块

node.js程序员项目总结 node.js开发实战_html_39


返回数据结果为:

node.js程序员项目总结 node.js开发实战_数据_40

(二)JSONP(需要传递一个回调函数的名称)

其实是把json数据作为参数传给回调函数

node.js程序员项目总结 node.js开发实战_node.js程序员项目总结_41

判断是不是函数

node.js程序员项目总结 node.js开发实战_json_42

自定义回调函数参数名称

node.js程序员项目总结 node.js开发实战_html_43


node.js程序员项目总结 node.js开发实战_json_44

(三)Restful (是从URL的格式来表述的)

node.js程序员项目总结 node.js开发实战_json_45


效果图:

node.js程序员项目总结 node.js开发实战_node.js程序员项目总结_46


node.js程序员项目总结 node.js开发实战_html_47

第十二步:Restful后台接口全面接入图书馆管理系统

其实是json接口和restful接口的混合使用

新建文件目录和文件

node.js程序员项目总结 node.js开发实战_node.js程序员项目总结_48

index.js

node.js程序员项目总结 node.js开发实战_node.js程序员项目总结_49

router.js

node.js程序员项目总结 node.js开发实战_html_50

service.js

node.js程序员项目总结 node.js开发实战_json_51

node.js程序员项目总结 node.js开发实战_数据_52

没有页面要借助postman工具进行测试

添加

node.js程序员项目总结 node.js开发实战_html_53

删除

node.js程序员项目总结 node.js开发实战_node.js程序员项目总结_54

更新注意:指定更新的id

node.js程序员项目总结 node.js开发实战_node.js程序员项目总结_55

第十三步:前后端分离之前端渲染、增删查改

(一)渲染

目录

node.js程序员项目总结 node.js开发实战_node.js程序员项目总结_56

index.html

node.js程序员项目总结 node.js开发实战_node.js程序员项目总结_57

public/js/index.js

node.js程序员项目总结 node.js开发实战_数据_58

js文件夹引入三个文件:

node.js程序员项目总结 node.js开发实战_node.js程序员项目总结_59

以下的增加、更新都采用模态框弹出来显示信息,可参考bootstrap的模态框样式。

node.js程序员项目总结 node.js开发实战_数据_60

addBook(); //用以重新给添加数据绑定事件。每一次渲染都会触发该函数。
表单重置分为隐藏模块和非隐藏模块的不同操作。

(二)增加

node.js程序员项目总结 node.js开发实战_html_61

(三)更新

node.js程序员项目总结 node.js开发实战_html_62

(四)删除

node.js程序员项目总结 node.js开发实战_json_63

注:1.使用同一个弹窗需要解绑click事件,采用unbind('click').click();
    2.渲染函数需要单独拎出来设为initList();
    3.解绑click事件,再次启动会没有效果,所以要单独拎出来,在渲染界面的时候,重新赋予添加数据函数click的方法。
    4.
以上都为public/js/index.js的内容
以下为index.html的渲染内容和模态框的表单请求

node.js程序员项目总结 node.js开发实战_node.js程序员项目总结_64


node.js程序员项目总结 node.js开发实战_数据_65

第十四步:服务器主动发送请求

新建一个index.js文件(测试文件)

node.js程序员项目总结 node.js开发实战_node.js程序员项目总结_66

//可替代postman来测试端口

(一)查询

注:需要先打开node到resful文件夹的index.js服务,才能打开另一个服务请求到数据

01jquery.js

node.js程序员项目总结 node.js开发实战_json_67

03queryid.js //根据指定id查询

node.js程序员项目总结 node.js开发实战_node.js程序员项目总结_68

(二)增加

02addBook.js

node.js程序员项目总结 node.js开发实战_数据_69

(三)更新

04editBook.js

node.js程序员项目总结 node.js开发实战_数据_70

注:更新数据是不在url处写入id的

(四)删除

05delete.js

node.js程序员项目总结 node.js开发实战_html_71

第十五步:调用第三方接口获取数据

06.js

node.js程序员项目总结 node.js开发实战_数据_72

第十六步:封装通用第三方api接口

新建weather.js

node.js程序员项目总结 node.js开发实战_json_73

注:封装weather.js,用于查询天气的通用接口,使用exports暴露该方法,方法名为queryWeather,可以在其他地方传递参数调用该API

最终封装形式:

node.js程序员项目总结 node.js开发实战_node.js程序员项目总结_74

注:port:80为请求第三方接口的默认远端端口号

创建07.js测试该通用接口weather.js

node.js程序员项目总结 node.js开发实战_json_75