nodeJs+express框架

nodeJs

1. nodeJs官网:http://nodejs.cn/api/

day01

1. 切换盘符	e:
2. 改变目录	cd目录名
3. 执行程序	node xxx.js

day02

request		请求		-输入请求的信息
response	响应		-输出的东西

`const http = require('http')

const server = http.createServer(function (req, res) {
    // console.log('有人来了')
    console.log(req.url)
    switch (req.url) {
        case '/1.html':
            res.write('111')
            break;
        case '/2.html':
            res.write('222')
            break;
        default:
            res.write('404')
    }

    res.end();
})`

// 监听-等着
// 端口-数字
server.listen(8082)`

day03

1. 文件操作  
`const fs = require('fs')

// readFile('文件名',回调函数)
/*fs.readFile('aaa.txt', function (err, data) {
    if(err){
        console.log('读取失败')
    }else{
        console.log(data.toString())
    }
})*/

// writeFile(文件名,内容,回调)
fs.writeFile('bbb.txt', 'asdfghjkl', err => {
    console.log(err)
})`

2. 服务器读取文件返回给前台
`const http = require('http')
const fs = require('fs')

let server = http.createServer((req, res) => {
    // req.url => '/index.html'
    // 读取 => './www.index.html'
    let file_name = `./www${req.url}`

    fs.readFile(file_name, (err, data) => {
        if(err){
            res.write('404')
        }else {
            res.write(data)
        }
        res.end()
    })
})

server.listen(8082)`

day04

GET数据解析

1. 自己切
2. querystring 	xxx=xx&xxx=xxx
3. url         	aaa?xxx=xx&xx=12
`example:
	url.parse(url,true);  pathname
						  query`

`
const http = require('http')

const server = http.createServer((req, res) => {
let GET = {}
// console.log(req.url)
// /aaa?user=blue&pwd=123456
if (req.url.indexOf('?') !== -1) {
    let arr = req.url.split('?');
    // arr[0] 地址:/aaa
    var url = arr[0];
    // arr[1] 数据:user=blue&pwd=123456
    let arr2 = arr[1].split('&');
    // arr2[0] user=blue
    // arr2[1] pwd=123456
    for (let i = 0; i < arr2.length; i++) {
        let arr3 = arr2[i].split('=')
        // arr3[0] 名字 'user'
        // arr3[1] 数据 'blue'
        GET[arr3[0]] = arr3[1]
    }
} else {
    var url = req.url
}

console.log(url, GET)

res.write('aaa')
res.end()
})

server.listen(8082)
`
1. querystring:查询字符串

`
const querystring = require('querystring')

var json = querystring.parse("user=blue&pass=123456&age=18")

console.log(json) // { user: 'blue', pass: '123456', age: '18' }
`

POST数据解析

1. 
`
const http = require('http')
const fs = require('fs')
const querystring = require('querystring')
const urlLib = require('url')

var server = http.createServer((req, res) => {
// GET
var obj = urlLib.parse(req.url, true)
var url = obj.pathname;
const GET = obj.query;
// POST
var str = '';
req.on('data', data => {
    str += data
})
req.on('end', () => {
    var POST = querystring.parse(str)

    /*
    url -- 要什么
    GET -- get数据
    POST -- POST数据
     */
    console.log(url, GET, POST)
})
// 文件请求
var file_name = './www/' + url;
fs.readFile(file_name, (err, data) => {
    if (err) {
        res.write('404')
    } else {
        res.write(data)
    }
    res.end();
});
})

server.listen(8082)
`

day06 练习

1. server_route.js
	`
const http = require('http')
const fs = require('fs')
const urlLib = require('url')
const querystring = require('querystring')

var users = {
    "blue": "123456",
    "zhangsan": "123456",
    "lisi": "123456"
};

var server = http.createServer((req, res) => {
// 解析数据
var str = '';
req.on('data', data => {
    str += data
})

req.on('end', (err, data) => {
    const obj = urlLib.parse(req.url, true)

    const url = obj.pathname
    const GET = obj.query
    const POST = querystring.parse(str)

    // 区分 —— 接口、文件
    if (url === '/user') { // 接口
        switch (GET.act) {
            case 'reg':
                // 1.检查用户名是否已经有了
                if (users[GET.user]) {
                    res.write('{"ok":false,"msg":"此用户已存在"}')
                } else {
                    // 2.插入users
                    users[GET.user] = GET.pass
                    res.write('{"ok":true,"msg":"恭喜您,注册成功"}')
                }
                break
            case 'login':
                // 1.检查用户名是否已经有了
                // 2.检查用户密码
                if (!users[GET.user]) {
                    res.write('{"ok":false,"msg":"此用户不存在"}')
                } else if (users[GET.user] !== GET.pass) {
                    res.write('{"ok":false,"msg":"用户名或密码有误"}')
                }else {
                    res.write('{"ok":true,"msg":"恭喜您,登陆成功"}')
                }
                break
            default:
                res.write('{"ok":false,"msg":"未知的act"}')
        }
        res.end();
    } else {    // 文件
        // 读取文件
        const file_name = `./www${url}`
        fs.readFile(file_name, (err, data) => {
            if (err) {
                res.write('404')
            } else {
                res.write(data)
            }
            res.end()
        })
    }
    ;
})
})

server.listen(8082)`

2. user.html
`



    
    Title


	用户名:
密码:
`

day07 模块化

1. 系统模块:http、querystring、url
	crypto(加密)
	events(事件触发器)
	net(网络)
	os(操作系统)
	path(路径)
	stream(流)
	timer(定时器)
	tls(安全传输层)
	zlib(压缩)
	
2. 自定义模块
3. 包管理器

day08 自定义模块(自定义模块统一,都放到node_modules里面)

1、模块组成

1. 引入自己的模块 —— ./
2. 如果对外输出东西————必须加给exports

mod.js

`
	exports.a = 12;
	exports.b = 5;
	exports.c = 99;
	
	// 一次性导出多个模块
	module.exports = {
	    a: 12,
	    b: 5,
	    c: 99,
	}

`

jade1.js

`
	const mod1 = require('./mod');
	console.log(mod1.a, mod1.b, mod1.c)

	const {a,b,c} = require('./mod');
	console.log(a, b, c)
`

2、npm:NodeJS Package Manager(NodeJS包管理器)

1. 统一的下载途径
2. npm install xxx
3. npm uninstall xxx
4. npm init
5. npm publish xxx
6. npm unpublish --force xxx (--force:强制删除)
6. npm update xxx
7. npm search express-static

require

1. 如果有'./'
	从当前目录找
2. 如果没有'./'
	先从系统模块
	从node_modules找

3、发布自己的模块

4、总结

4.1 模块里面

1.	require		引入
2.	exports		输出
3.	module.exports		批量输出

4.2 npm

1. 帮咱们下载模块
2. 自动解决依赖

4.3 node_modules

1. 模块放这里

day09 express框架

1、安装

1. npm init 初始化(生成package.json)
2. npm install express --save
3. node server_route.js

2、配置

3、接收请求

   `server.get('/', (req, res) => {
		    console.log('有GET')
		});
	
	server.post('/', (req, res) => {
	    console.log('有POST')
	});*/
	
	server.use('/', (req, res) => {
	    console.log('use')
	});`

4、响应

5、中间件

1. npm install express-static --save 

非侵入式

1. req
	
2. res

	1.1 原生
		res.write();
		res.end(); 
	1.2 express:
		+ res.send();
		res.wirte();
		res.end();

总结

express保留了原生的功能,添加了一些方法(send),增强了原有的功能

使用

1. 创建服务
	`var server = express();
	`
2. 监听
	`server.listen(8080)`

3. 处理请求
	`server.use("地址",function(req,res){res.send()})`

3种方法:

1. `.get("/",function(requst,response){});`
2. `.post("/",function(requst,response){});`
3. `.use("/",function(requst,response){});`
4. 例子:
	`const express = require('express');

	var server = express();
	
	/*server.get('/', (req, res) => {
	    console.log('有GET')
	});
	
	server.post('/', (req, res) => {
	    console.log('有POST')
	});*/
	
	server.use('/', (req, res) => {
	    console.log('use')
	});
	
	server.listen(8082);
	`
express中间件
1. 依赖中间件
2. 接收请求
	get/post/use
	get('地址',function(req,res){})
3. 非破坏式的
	req.url
4. static
	1. npm install express-static --save 
	2. const static = require('express-static')
	3. server.use(static('./www'))

完整案例(http://localhost:8082/form.html)

server2.js
`const express = require('express');
const expressStatic = require('express-static');

var server = express();
server.listen(8082);

// 用户数据
var users = {
    'blue': '123456',
    'zhangsan': '654321',
    'lisi': '987987'
}

// 接口
// /login?user=xxx&pass=xxx => {ok:true,msg:'原因'}
server.get('/login', (req, res) => {
    var user = req.query['user'];
    var pass = req.query['pass'];
    if (users[user] === null) {
        res.send({ok: false, msg: '此用户不存在'})
    } else {
        if (users[user] !== pass) {
            res.send({ok: false, msg: '密码错误'})
        } else {
            res.send({ok: true, msg: '成功'})
        }
    }
})

server.use(expressStatic('./www'));`
form.html
`const express = require('express');
const expressStatic = require('express-static');

var server = express();
server.listen(8082);

// 用户数据
var users = {
    'blue': '123456',
    'zhangsan': '654321',
    'lisi': '987987'
}

// 接口
// /login?user=xxx&pass=xxx => {ok:true,msg:'原因'}
server.get('/login', (req, res) => {
    var user = req.query['user'];
    var pass = req.query['pass'];
    if (users[user] === null) {
        res.send({ok: false, msg: '此用户不存在'})
    } else {
        if (users[user] !== pass) {
            res.send({ok: false, msg: '密码错误'})
        } else { 
            res.send({ok: true, msg: '成功'})
        }
    }
})

server.use(expressStatic('./www'));`

day10

1. 项目初始化
`npm init`
`npm install --save express express-static body-parser multer cookie-parser cookie-session jade ejs consolidate mysql express-route`
2. 使用
	1. GET 无需中间件
		1. req.query
	2.	POST	需要 'body-parser'
		1.	const bodyParser = require('body-parser');
		2.	server.use(bodyParser.urlencoded({}))
		3.	`server.use('/', (req, res) => {console.log(req.body); // post});`

3. 链式操作:next()
	1. server.use((req, res, next) => {})
	2. server.get((req, res, next) => {})
	3. server.post((req, res, next) => {})
	4. next————下一个步骤
	5. next()
	6. server.use('/login',function(){
	 	mysql.query(function(){
		 if(有错)
			res.emit('error');
		 else
			next();
		})
	   })
4. 中间件(body-parser)、自己写中间件
	1. `const querystring = require('querystring');
		module.exports = function () {
		    return function (req, res, next) {
		        var str = '';
		        req.on('data', (data) => {
		            str += data;
		        })
		        req.on('end', () => {
		            req.body = querystring.parse(str);
		            next();
		        })
		    }
		};`

day11 cookie与session

cookie

1. 在浏览器保存一些数据
	1. 不安全
	2. 有限(4k)

2. 校验cookie是否被篡改过

3. 发送cookie

	res.secret="字符串";
	res.cookie('名字',值,{path:'/',maxAge:毫秒,signed:true})
	`
	const express = require('express');
	const cookieParser = require('cookie-parser');
	
	var server = express();
	server.listen(8082);
	
	// cookie
	server.use(cookieParser());
	
	server.use('/', (req, res) => {
	    res.cookie('user','blue')
	    res.send('ok');
	})
	`

4. 读取cookie(完整例子)

	cookie-parser
	server.use(cookieParser('字符串'));
	`
	const express = require('express');
	const cookieParser = require('cookie-parser');
	
	var server = express();
	server.listen(8082);
	
	// cookie
	server.use(cookieParser('qwertyuiop'));
	
	server.use('/', function (req, res) {
	    req.secret = 'qwertyuiop';
	    res.cookie('user', 'blue', {signed: true});
	    // s%3Ablue.%2Bz23zXzMrMx4CI3B%2BJVyh2ljk%2BL2M%2BPZkHi3Ij1uO9o
	
	    // decodeURIComponent('s%3Ablue.%2Bz23zXzMrMx4CI3B%2BJVyh2ljk%2BL2M%2BPZkHi3Ij1uO9o')
	
	    // node 回车 -> 输入:decodeURIComponent('s%3Ablue.%2Bz23zXzMrMx4CI3B%2BJVyh2ljk%2BL2M%2BPZkHi3Ij1uO9o') 解密
	    // 结果:'s:blue.+z23zXzMrMx4CI3B+JVyh2ljk+L2M+PZkHi3Ij1uO9o'
	    // s:代表签名过的,
	    // blue:值,
	    // +z23zXzMrMx4CI3B+JVyh2ljk+L2M+PZkHi3Ij1uO9o:签名
	
	    console.log('签名cookie', req.signedCookies)
	    console.log('无签名cookie', req.cookies)
	
	    res.send('ok');
	})
	`

5. 删除cookie

	res.clearCookie('名字')

session

1. 保存数据,保存在服务端
	1. 安全
	2. 无限(服务器空间有多大,就能携带多少数据)

2. 基于cookie实现的
	1. cookie中会有一个session的ID,服务器利用sessionid找到session文件、读取、写入
3. 隐患:session劫持
	1. session_id

4. cookie-session
	1. server.use(cookieParser())
	2. `var arr = [];
		for (var i = 0; i < 100000; i++) {
		    arr.push('sign_' + Math.random())
		}
		server.use(cookieParser());
		server.use(cookieSession({
		    name: 'sess',
		    keys: arr,
		    maxAge: 2 * 60 * 60 * 1000
		}));`
	3. cookie-session完整例子(常用)
		`/*
		cookie-session
		 */
		const express = require('express');
		const cookieParser = require('cookie-parser')
		const cookieSession = require('cookie-session');
		
		var server = express();
		server.listen(8082);
		
		// cookie
		var arr = [];
		for (var i = 0; i < 100000; i++) {
		    arr.push('sign_' + Math.random())
		}
		server.use(cookieParser());
		server.use(cookieSession({
		    name: 'sess',
		    keys: arr,
		    maxAge: 2 * 60 * 60 * 1000
		}));
		
		server.use('/', function (req, res) {
		    if (req.session['count'] === null) {
		        req.session['count'] = 1;
		    } else {
		        req.session['count']++;
		    }
		
		    console.log(req.session['count']);
		
		
		    res.send('ok');
		})`

	4. 删除cookie
		1. delete req.session

day12 模版引擎

1、jade

1. 破坏式、侵入式、强依赖
2. npm install --save jade

jade语法

1、根据缩进,规定层级

2、属性用()表示,用逗号分隔

1. (style={})
	1. `div(style={width: '200px', height: '200px', background: 'red'}) `
2. (class=[])
	1. `div(class=['aaa left-wrap active'])`

3、内容

`
div
	span
		a(href='http://www.baidu.com') 百度
`

4、jade.render(‘字符串’) jade.renderFile(‘模板文件名’,参数)


1. 根据缩进,规定层级
	1.1	 `
		html
			head
				style
			body
				div
				div		
			`
2. 属性放在()里面,逗号分隔
	1. script(src='a.js') => 
	2. link(href='a.css',ref='rel/stylesheet') => 
	3.  input(type='text',id='txt2',value='abc') => 
3. 内容
	1. a(href='http://www.baidu.com') 官网 => 官网
4. 普通属性写法
	1. div(style="width:200px;height:200px;background:red") => 
2. div(style={width: '200px', height: '200px', background: 'red'}) =>
3. div(class="aaa left-wrap active")=>
4. div(class=['aaa left-wrap active']) =>
5. div&attributes({title: 'aaa', id: 'div3'}) =>
5. script语法 1.
  1. ejs
    1. 温和、非侵入式、弱依赖

day13

1、在页面中编写js代码

1. script.
	1. `script.
            window.onload = function () {
                var oBtn = document.getElementId('btn1')
                oBtn.onclick = function () {
                    alert('aaa')
                }
            }`

2、原样输出代码

1. | abc

3、外部引入js代码

1. `script
        include a.js`

4、使用变量

1. #{name} 或者  div=name
2. `span #{a}
    span=a`

5、使用style与class

1. `jade.renderFile('./views/8.jade', {
	    pretty: true,
	    json: {width: '200px', height: '200px', background: 'red'},
	    arr: ['aaa', 'left-wrap']
	})`
2. `div(style=json)
    div(class=arr)
    div(class=arr class='active')`

6、使用js变量

1.`doctype
	html
	    head
	        style
	        script
	    body
	        -var a = 12;
	        -var b = 5;
	        div 结果是:#{a + b}`

7、for循环

1. `-for (var i=0;i

8、渲染数据库中的富文本样式

1. `div!=content`

9、if else 结构

1. `-var a=12;
    if(a % 2 === 0)
        div(style={background: 'red'}) 偶数
    else
        div(style={background: 'green'}) 奇数`

10、switch case

1. `-var a=1;
    case a
        when 0
            div aaa
        when 1
            div bbb
        when 2
            div ccc
        default
            | 不靠谱`

完整案例

main.js

`
const jade = require('jade');
const fs = require('fs')

var str = jade.renderFile('./views/index.jade', {
    pretty: true
})

fs.writeFile('./build/index.html', str, function (err) {
    if (err) {
        console.log('编译失败')
    } else {
        console.log('成功')
    }
})
`

index.jade

`
doctype
html
    head
        meta(charset='utf-8')
        title jade测试页面
        style.
            div {
                width: 100px;
                height: 100px;
                background: #e4393c;
                text-align: center;
                line-height: 100px;
                float: left;
                margin: 10px auto;
            }

            div.last {
                clear: both;
            }

        script
    body
        -var a=0;
        while a < 12
            if a % 4 === 0 && a !== 0
                div.last=a++
            else
                div=a++
`

index.html

`


  
    
    jade测试页面
    
    
  
  
    
0
1
2
3
4
5
6
7
8
9
10
11
`

day14 ejs

安装

1. npm install --save ejs

1、使用变量

1. `<%= name %>`
2. `<%= json.arr[0].name %>`
3. `<%= 12 + 5 %>`
4. `<%= 'qwerty' %>`

2、for循环

3.js

`const ejs = require('ejs');

	ejs.renderFile('./views/2.ejs', {
	    json: {
	        arr: [
	            {
	                user:'blue',
	                pass:'123456'
	            },
	            {
	                user:'zhangsan',
	                pass:'123456'
	            },
	            {
	                user:'lisi',
	                pass:'999999'
	            }
	        ]
	    }
	}, function (err, data) {
	    console.log(data);
	})`

3.ejs

 `
	
	
	    
	    
	    
	    Document
	
	
	
<% for (var i = 0; i < json.arr.length;i++) { %>
用户名: <%= json.arr[i].user %> 密码: <%= json.arr[i].pass %>
<% } %>
`

3、富文本编译解析

1. '=':转义输出  '-':不转义输出 

案例:4.index

`
const ejs = require('ejs');

ejs.renderFile('./views/4.ejs', {}, function (err, data) {
    console.log(data);
})`

案例:4.js

`


    
    
    
    Document


<% var str = '
' %> <%- str %>
`

4、include(参考5.ejs与5.js)

1. <% include ./../a.txt %>

day15 复习cookie与session-文件的上传

中间件 multer

1. npm install --save multer

文件重命名

rename.js

`
	const fs = require('fs');

	fs.rename('a.txt', 'b.txt', function (err) {
	    console.log(err)
	})
`

path的用法

`
const path = require('path');

var str = 'c:\\wamp\\www\\a.html'

var obj = path.parse(str);

//   root: 'c:\\',
//   dir: 'c:\\wamp\\www', 文件路径路径  或者 文件目录
//   base: 'a.html', 文件名部分
//   ext: '.html',  扩展名部分
//   name: 'a'  文件名,不包含扩展名
console.log(obj);
`

文件上传案例

upload.html

`


    
    Title


文件:
`

server_file.js

`const express = require('express');
const bodyParser = require('body-parser');
const multer = require('multer');
const fs = require('fs');
const pathLib = require('path');

// dest:目标地点
var objMulter = multer({dest: './www/upload'});

var server = express();

// 错误
// server.use(bodyParser.urlencoded({extended: false}));

// 只接收一个文件
// server.use(objMulter.single('f1'))
// 接受任何文件
server.use(objMulter.any())

server.post('/', function (req, res) {
    // console.log(req.files[0].originalname);
    console.log(req.files)
    // [
    // {
    //     fieldname: 'f1',
    //     originalname: 'server_file.png',
    //     encoding: '7bit',
    //     mimetype: 'image/png',
    //     destination: './www/upload',
    //     filename: '9ed7eec53ee6ce6b9e6ac05965e49e48',
    //     path: 'www\\upload\\9ed7eec53ee6ce6b9e6ac05965e49e48',
    //     size: 18845
    // }
    // ]

    // 新文件名
    // 'www/upload/70eee7d5b05ee88c4e279ba3f341b48d' + '.png'
    var newName = req.files[0].path + pathLib.parse(req.files[0].originalname).ext

    // 1、获取原始文件扩展名
    // 2、重命名临时文件
    console.log(req.files[0].path)
    console.log(pathLib.parse(req.files[0].originalname).ext)

    fs.rename(req.files[0].path, newName, function (err) {
        if (err) {
            res.send('上传失败')
        } else {
            res.send('上传成功')
        }
    })
})

server.listen(8080);
`

1. consolidate(适配)

	1. npm install consolidate --save

配置模版引擎

// 哪种模板引擎
server.engine('html', consolidate.ejs)
// 模板文件放在哪
server.set('views', './views')
// 输出什么东西
server.set('view engine', 'html');

// 用户请求
server.get('/index', function (req, res, next) {
    res.render('1.ejs', {name: 'blue'});
    /*if (req.session.userid) { //登录过
        res.render('1.ejs', {name: 'blue'})
    } else { // 没有登陆
        res.render('login.ejs', {})
    }*/
})

#day16 路由

路由的使用

1. 创建router
	1. var routerArticle = express.Router();

2. 把router添加到server(但凡是请求'/user'地址,交给routerArticle路由器去处理)
	1. server.use('/user',router);

3. routerArticle内部
	1. routerArticle.get('/1.html',(req,res)=>{});
	2. routerArticle.get('/2.html',(req,res)=>{});

day17 数据库

关系型数据库:

1. MySQL
	1. 免费、中小网站
	2. 优点:性能非常不错
	3. 缺点:集群、容灾稍微弱一些

2. Oracle
	1. 挺贵、大型应用、金融级
	2. 优点:性能非常不错、集群、容灾非常强
	3. 缺点:挺贵
3. SQLServer
4. Access
5. db2
6. fox pro

文件型:

1. sqlite
2. mongodb

MySQL安装路径

1. C:\Program Files\MySQL\MySQL Server 5.7\bin
2. 执行cmd命令
3. 进入数据库:
	1. mysql.exe -uroot -p
	2. cheng112233

4. 数据库管理工具:NaviCate for MySQL

数据基本概念:两种单位

1. 库:文件夹用来管理,本身没法存数据
2. 表:文件,存数据的
	1. 类似excel
	2. 行:一条数据
	3. 列:(字段、域) 一个数据项
3. 新建数据库	
	1. 数据库名:20161222
	2. 字符集:utf8 -- UTF-8 Unicode
	3. 排序规则:utf8_general_ci

day18 SQL语句

npm install --save mysql

SQL 标准写法

1. 关键字大写
2. 库表字段需要加上``

4大查询语句 – 增删改查

1. 增 INSERT
	1. INSERT INTO 表 (字段列表) VALUES(值列表)
		1. INSERT INTO `user_table` (`ID`,`username`,`password`) VALUES (0,'blue2','987654321');
2. 删 DELETE
3. 改 UPADTE
4. 查 SELECT
	1. SELECT * from `user_table`

day19

数据字典

1. banner(banner_table)
	1. ID	
	2. title	标题		varchar(32)
	3. sub_title	副标题		varchar(16)
	4. src	图片地址		varchar(64)

2.	文章(article_table)
	1.	ID
	2.	author	作者		varchar(16)
	3.	author_src 作者头像		varchar(64)
	4.	title	标题		varchar(32)
	5.	post_time 发布时间(s)	int
	6.	content		内容		text
	7.	summary		概要		
	8.	n_like		赞		int	

3. 用户(user_table)
	1. ID
	2. username		用户名		varchar(32)
	3. password		密码		varchar(32)
	4. src		头像		varchar(64)

new Date().getTime() 时间戳

正则加p标签

1.var str2 = str.replace(/^/gm, '

').replace(/$/gm,'

');

点赞功能实现原理

1. UPDATE article_table SET n_like=n_like+1 WHERE ID=XXX

day24 认识增删改查

1. SQL SELECT 语句
	1. SELECT 列名称 FROM 表名称

2. WHERE 子句
	1. SELECT 列名称 FROM 表名称 WHERE 列 运算符 值

3. AND 和 OR 运算符
	1. 使用 AND 来显示所有姓为 "Carter" 并且名为 "Thomas" 的人:
		1. SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter'
	2. 使用 OR 来显示所有姓为 "Carter" 或者名为 "Thomas" 的人:
		1. SELECT * FROM Persons WHERE firstname='Thomas' OR lastname='Carter'
	3. AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。
	4. 如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。
	5. 如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。
4. 结合 AND 和 OR 运算符
	1. SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName='William') AND LastName='Carter'
5. ORDER BY 语句用于对结果集进行排序。
	1. ORDER BY 语句用于根据指定的列对结果集进行排序。
	2. ORDER BY 语句默认按照升序对记录进行排序。
	3. 如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。
	4. ASC 升序 | DESC 降序
	5. 以逆字母顺序显示公司名称:	
		1. SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC

6. INSERT INTO 语句
	1. INSERT INTO 表名称 VALUES (值1, 值2,....)
	2. INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
	3. INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')
	4. INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees')
	
7. Update 语句
	1. UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
	2. 更新某一行中的一个列
		1. UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson' 
	3. 更新某一行中的若干列
		1. UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing' WHERE LastName = 'Wilson'

8. DELETE 语句
	1. DELETE FROM 表名称 WHERE 列名称 = 值
	2. 删除某行
		1. DELETE FROM Person WHERE LastName = 'Wilson' 

	3. 删除所有行
		1. DELETE FROM table_name
		2. DELETE * FROM table_name

9. GROUP BY (参考案例:student_table)

	1. 语句用于结合合计函数,根据一个或多个列对结果集进行分组。
		1. 查询每个班的人数
			1. select class,COUNT(*) from student_table GROUP BY class;
		2. 查询以班为单位的平均分
			1. select class,AVG(score) from student_table GROUP BY class;
		3. 查询最高分与最低分
			1. select class,MAX(score),MIN(score) from student_table GROUP BY class;

		4. 根据消费降序排列
			1. SELECT name,SUM(price) FROM sales_table GROUP BY name ORDER BY SUM(price) DESC;
			2. SELECT name,SUM(price) FROM sales_table GROUP BY name ORDER BY SUM(price) ASC;

	10. LIMIT 限制 (经常用来做分页)
		1.  LIMIT 10;	前10条
			LIMIT 5,8;	从5开始,要8个
			
			分页:
			每页20条
			
			第1页	0,20	0~19
			第2页	20,20	20~39
			第3页	40,20
			第n页	(n-1)*20,20
	11. 子句之间是有顺序
		WHERE GROUP ORDER LIMIT
		筛选  合并  排序  限制

day30 express-route(模板)

server.js

const express = require('express');
const expressStatic = require('express-static');
const mysql = require('mysql');
const bodyParser = require('body-parser');
const multer = require('multer');
const multerObj = multer({dest: './static/upload'}); // 指明文件上传到哪个目录
const cookieParser = require('cookie-parser');
const cookieSession = require('cookie-session');
const consolidate = require('consolidate');
const expressRoute = require('express-route');

const server = express();
server.listen(8080);

// 1.获取请求数据
//  get自带
server.use(multerObj.any());

// 2.cookie、session
server.use(cookieParser());
(function () {
    let keys = [];
    for (let i = 0; i < 100000; i++) {
        keys.push('keys_' + Math.random());
    }
    server.use(cookieSession({
        name: 'sess_id',
        keys,
        maxAge: 20 * 60 * 1000  // 20分钟
    }));
})()

// 3.模板
server.engine('html', consolidate.ejs); // 哪种模板引擎
server.set('views', 'template'); // 模板文件放在哪
server.set('view engine', 'html'); // 输出什么东西

// 4.route
server.use('/article', require('./route/1')());

server.use('/blog', require('./route/2')());

// 5.default:static
server.use(expressStatic('./static'));

1.js

const express = require('express');

module.exports = function () {
    var router = express.Router();

    router.get('/1.html', function (req, res) {
        // res.send('我是文章').end();
        res.render('./1.ejs', {
            title: '我是标题',
            a: 12,
            b: 5
        })
    });
    router.get('/2.html', function (req, res) {
        res.send('我也是文章').end();
    });

    return router
}	

2.js

const express = require('express');

module.exports = function () {
    var router = express.Router();

    router.get('/a.html', (req, res) => {
        res.send('我是blog').end();
    });
    router.get('/b.html', (req, res) => {
        res.send('我是blog').end();
    });

    return router
}		

day31 MD5加密(签名)

1. 管理员账户通过 md5_2.js 生成
	const common = require('./libs/common');

	var pwd = '123456';
	var str = common.md5(pwd +';fskdv;w无服务%#%^)_+@!#%GUBP:()*&*&%%)/*LHGFGdkfhelGR$#$@$KI783y872343');
	
	console.log(str); // d0fabe637ae9af3131fee39599b7b62c

day35

fs.unlink(); 专门用来删除文件

day 36

1. 前台接口
	1. /get_banners => [{ID,title,description,href}]
	2. /get_custom_evaluations => [{ID,title,description,src}]

你可能感兴趣的:(nodeJs)