1. nodeJs官网:http://nodejs.cn/api/
1. 切换盘符 e:
2. 改变目录 cd目录名
3. 执行程序 node xxx.js
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)`
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)`
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' }
`
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)
`
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
用户名:
密码:
`
1. 系统模块:http、querystring、url
crypto(加密)
events(事件触发器)
net(网络)
os(操作系统)
path(路径)
stream(流)
timer(定时器)
tls(安全传输层)
zlib(压缩)
2. 自定义模块
3. 包管理器
1. 引入自己的模块 —— ./
2. 如果对外输出东西————必须加给exports
`
exports.a = 12;
exports.b = 5;
exports.c = 99;
// 一次性导出多个模块
module.exports = {
a: 12,
b: 5,
c: 99,
}
`
`
const mod1 = require('./mod');
console.log(mod1.a, mod1.b, mod1.c)
const {a,b,c} = require('./mod');
console.log(a, b, c)
`
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
1. 如果有'./'
从当前目录找
2. 如果没有'./'
先从系统模块
从node_modules找
1. require 引入
2. exports 输出
3. module.exports 批量输出
1. 帮咱们下载模块
2. 自动解决依赖
1. 模块放这里
1. npm init 初始化(生成package.json)
2. npm install express --save
3. node server_route.js
`server.get('/', (req, res) => {
console.log('有GET')
});
server.post('/', (req, res) => {
console.log('有POST')
});*/
server.use('/', (req, res) => {
console.log('use')
});`
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()})`
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);
`
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'))
`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'));`
`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'));`
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();
})
}
};`
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('名字')
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
1. 破坏式、侵入式、强依赖
2. npm install --save jade
1. (style={})
1. `div(style={width: '200px', height: '200px', background: 'red'}) `
2. (class=[])
1. `div(class=['aaa left-wrap active'])`
`
div
span
a(href='http://www.baidu.com') 百度
`
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. script.
1. `script.
window.onload = function () {
var oBtn = document.getElementId('btn1')
oBtn.onclick = function () {
alert('aaa')
}
}`
1. | abc
1. `script
include a.js`
1. #{name} 或者 div=name
2. `span #{a}
span=a`
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')`
1.`doctype
html
head
style
script
body
-var a = 12;
-var b = 5;
div 结果是:#{a + b}`
1. `-for (var i=0;i
1. `div!=content`
1. `-var a=12;
if(a % 2 === 0)
div(style={background: 'red'}) 偶数
else
div(style={background: 'green'}) 奇数`
1. `-var a=1;
case a
when 0
div aaa
when 1
div bbb
when 2
div ccc
default
| 不靠谱`
`
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('成功')
}
})
`
`
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++
`
`
jade测试页面
0
1
2
3
4
5
6
7
8
9
10
11
`
1. npm install --save ejs
1. `<%= name %>`
2. `<%= json.arr[0].name %>`
3. `<%= 12 + 5 %>`
4. `<%= 'qwerty' %>`
`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);
})`
`
Document
<% for (var i = 0; i < json.arr.length;i++) { %>
用户名:
<%= json.arr[i].user %>
密码:
<%= json.arr[i].pass %>
<% } %>
`
1. '=':转义输出 '-':不转义输出
`
const ejs = require('ejs');
ejs.renderFile('./views/4.ejs', {}, function (err, data) {
console.log(data);
})`
`
Document
<%
var str = ''
%>
<%- str %>
`
1. <% include ./../a.txt %>
1. npm install --save multer
`
const fs = require('fs');
fs.rename('a.txt', 'b.txt', function (err) {
console.log(err)
})
`
`
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);
`
`
Title
`
`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. 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)=>{});
1. MySQL
1. 免费、中小网站
2. 优点:性能非常不错
3. 缺点:集群、容灾稍微弱一些
2. Oracle
1. 挺贵、大型应用、金融级
2. 优点:性能非常不错、集群、容灾非常强
3. 缺点:挺贵
3. SQLServer
4. Access
5. db2
6. fox pro
1. sqlite
2. mongodb
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
1. 关键字大写
2. 库表字段需要加上``
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`
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)
1.var str2 = str.replace(/^/gm, '').replace(/$/gm,'
');
1. UPDATE article_table SET n_like=n_like+1 WHERE ID=XXX
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
筛选 合并 排序 限制
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'));
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
}
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
}
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
1. 前台接口
1. /get_banners => [{ID,title,description,href}]
2. /get_custom_evaluations => [{ID,title,description,src}]