├── .gitignore
├── day06-nodejs06
├── 03.中间件
│ ├── public
│ │ ├── text
│ │ │ └── 01.txt
│ │ ├── center.html
│ │ ├── index.html
│ │ ├── err.ejs
│ │ ├── login.html
│ │ └── register.html
│ ├── static
│ │ ├── err.jpg
│ │ ├── haijing.jpg
│ │ └── lijing.jpg
│ ├── db
│ │ └── index.js
│ ├── model
│ │ └── userModel.js
│ └── server.js
├── 02.login
│ ├── static
│ │ ├── err.jpg
│ │ ├── haijing.jpg
│ │ └── lijing.jpg
│ ├── db
│ │ └── index.js
│ ├── model
│ │ └── userModel.js
│ ├── public
│ │ ├── center.html
│ │ ├── index.html
│ │ ├── err.ejs
│ │ ├── login.html
│ │ └── register.html
│ └── server.js
├── 03.ejs模板引擎
│ ├── index.ejs
│ └── server.js
└── 01.express复习.js
├── day03-nodejs03
├── 03.fs
│ ├── text.txt
│ ├── 05.简单写入.js
│ ├── 07.简单读取.js
│ ├── 01.同步写入.js
│ ├── 08.流式读取文件.js
│ ├── 12.pipe.js
│ ├── 06.流式写入.js
│ ├── 11.promisify练习.js
│ ├── 09.流式读取及写入.js
│ ├── 02.异步写入.js
│ ├── 03.异步写入解决回调地狱.js
│ ├── 10.promisify.js
│ └── 04.异步写入解决回调地狱2.js
├── 晨测.md
├── 04.http
│ ├── index.html
│ ├── 02.客户端.js
│ └── 01.server1.js
├── 02.crypto.js
└── 01.events事件触发器.js
├── day11-gulp
└── 01.gulp
│ ├── src
│ ├── js
│ │ ├── index.js
│ │ └── add.js
│ ├── less
│ │ ├── public.less
│ │ └── test.less
│ └── index.html
│ ├── package.json
│ └── gulpfile.js
├── day12-webpack
├── src
│ ├── less
│ │ ├── public.less
│ │ └── test.less
│ ├── js
│ │ ├── person.json
│ │ ├── add.js
│ │ └── index.js
│ ├── img
│ │ ├── err.jpg
│ │ ├── haijing.jpg
│ │ └── lijing.jpg
│ └── index.html
├── .eslintrc.json
├── package.json
└── config
│ ├── webpack.config.dev.js
│ └── webpack.config.prod.js
├── day04-node04
├── 06.MIME类型
│ ├── jj.jpg
│ ├── 01.MIME类型.js
│ ├── server1.js
│ ├── server3.js
│ ├── server2.js
│ └── index.html
├── 01.http.js
├── 11.面试题.js
├── 05.请求方式.js
├── 10.四次挥手.js
├── 09.三次握手.js
├── 11.浏览器渲染过程.js
├── 08.osi网络模型.js
├── post.html
├── 07.状态码.js
├── 04.响应报文.js
├── 02.server.js
├── 03.请求报文.js
└── 晨测.md
├── day02-nodejs02
├── 09.包和包管理器
│ ├── node_modules
│ │ ├── add
│ │ │ ├── main.js
│ │ │ └── package.json
│ │ └── sub
│ │ │ └── index.js
│ └── test.js
├── 07.nodeJS模块化
│ ├── sub.js
│ ├── add.js
│ └── index.js
├── 08.模块引入练习
│ ├── 01.引入内置模块.js
│ └── 02.引入第三方模块.js
├── 02.面试题2.js
├── 10.Buffer
│ └── 01.Buffer.js
├── 01.面试题.js
├── 12.path
│ └── 01.path.js
├── 05.面试题.js
├── 04.面试题.js
├── 06.node的外层函数.js
├── 晨测.md
├── 11.process
│ └── 01.process.js
└── 03.面试题3.js
├── day08-node08
├── 01.强制缓存
│ ├── lijing.jpg
│ ├── index.html
│ └── server.js
├── 02.协商缓存
│ ├── readMe.md
│ ├── index.html
│ └── server.js
├── 晨测.md
├── 04.ajax
│ ├── server.js
│ └── index.html
└── 03.压缩
│ └── server.js
├── day09-ajax
├── 05.module
│ ├── 01.commonjs
│ │ ├── mins.js
│ │ ├── add.js
│ │ ├── index.js
│ │ ├── index.html
│ │ └── build.js
│ └── 02.ES6
│ │ ├── js
│ │ ├── add.js
│ │ ├── person.js
│ │ ├── mins.js
│ │ └── index.js
│ │ ├── build
│ │ ├── add.js
│ │ ├── mins.js
│ │ ├── person.js
│ │ ├── index.js
│ │ └── build.js
│ │ └── index.html
├── 03.jsonp
│ ├── jQuery跨域.html
│ ├── server.js
│ ├── index.html
│ └── test.html
├── 04.cors
│ ├── index.html
│ └── server.js
├── 01.ajax
│ ├── server.js
│ └── index.html
└── 02.axios
│ ├── server.js
│ └── index.html
├── day01-nodejs01
├── 01.node启动.js
├── 09.事件轮询练习题3.js
├── 08.事件轮询练习题2.js
├── 07.事件轮询练习题1.js
├── 04.基础的事件轮询机制.js
├── 02.global.js
├── 03.setImmediate.js
├── 10.事件轮询练习题4.js
├── 06.宏任务和微任务.js
├── 05.nodeJS事件轮询.js
└── 晨测.md
├── day07-nodejs07
├── 01.中间件
│ ├── static
│ │ ├── err.jpg
│ │ ├── haijing.jpg
│ │ └── lijing.jpg
│ ├── db
│ │ └── index.js
│ ├── model
│ │ └── userModel.js
│ ├── views
│ │ ├── center.html
│ │ └── err.ejs
│ ├── public
│ │ ├── index.html
│ │ ├── login.html
│ │ └── register.html
│ ├── router
│ │ ├── isEmptyRouter.js
│ │ ├── regRouter.js
│ │ ├── registerRouter.js
│ │ ├── loginRouter.js
│ │ └── centerRouter.js
│ └── server.js
├── 05.session
│ ├── static
│ │ ├── err.jpg
│ │ ├── lijing.jpg
│ │ └── haijing.jpg
│ ├── db
│ │ └── index.js
│ ├── model
│ │ └── userModel.js
│ ├── views
│ │ ├── center.html
│ │ └── err.ejs
│ ├── public
│ │ ├── index.html
│ │ ├── login.html
│ │ └── register.html
│ ├── util
│ │ └── open.js
│ ├── router
│ │ ├── centerRouter.js
│ │ ├── isEmptyRouter.js
│ │ ├── regRouter.js
│ │ ├── registerRouter.js
│ │ └── loginRouter.js
│ └── server.js
├── 03.cookie.js
├── 04.session.js
├── 05.autoOpen.js
├── 02.localStorage
│ ├── center.html
│ └── index.html
└── 晨测.md
├── day05-node05
├── 03.mongoose模块化
│ ├── index.js
│ ├── db
│ │ └── index.js
│ └── schema
│ │ └── teacher.js
├── index.html
├── 02.mongoose
│ ├── 01.连接数据库.js
│ ├── 02.Schema.js
│ ├── 07.数据库的删.js
│ ├── 03.创建model对象及初始化仓库.js
│ ├── 05数据库的查.js
│ ├── 06.数据库的改.js
│ └── 04.数据库的增.js
├── 01.mongoDBText
│ └── 01.Mongo语句.js
└── 04.express基础.js
├── day13-axios
├── db.json
├── server.js
├── 08.原生ajax取消.html
├── 09.手写new.html
├── 07.取消请求.html
├── 08.取消请求2.html
├── 06.响应拦截器.html
├── 05.请求拦截器.html
├── 01.axios1.html
├── 02.axios2.html
├── 04.axios.create.html
└── 03.封装axios.html
├── day10-手写promise
├── 01.promise构造函数.js
├── ex.html
├── 02.promise的then方法.js
├── index.html
├── 03.then的返回值.js
└── 04.catch方法.js
└── package.json
/.gitignore:
--------------------------------------------------------------------------------
1 | .vscode/
2 | node_modules/
3 | *.mp4
--------------------------------------------------------------------------------
/day06-nodejs06/03.中间件/public/text/01.txt:
--------------------------------------------------------------------------------
1 | hello world
--------------------------------------------------------------------------------
/day03-nodejs03/03.fs/text.txt:
--------------------------------------------------------------------------------
1 | 锄禾日当午汗滴禾下土谁知盘中餐粒粒皆辛苦今天天气真好今天天气真好
--------------------------------------------------------------------------------
/day11-gulp/01.gulp/src/js/index.js:
--------------------------------------------------------------------------------
1 | import add from './add';
2 | add(400, 999);
--------------------------------------------------------------------------------
/day12-webpack/src/less/public.less:
--------------------------------------------------------------------------------
1 | body {
2 | background-color: yellow;
3 | }
--------------------------------------------------------------------------------
/day12-webpack/src/js/person.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "laowang",
3 | "age": 18,
4 | "sex": "nan"
5 | }
--------------------------------------------------------------------------------
/day12-webpack/src/js/add.js:
--------------------------------------------------------------------------------
1 | function add(a, b) {
2 | console.log(a + b);
3 | }
4 |
5 | export default add;
--------------------------------------------------------------------------------
/day04-node04/06.MIME类型/jj.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowLetsgo/NB-Plus0322/HEAD/day04-node04/06.MIME类型/jj.jpg
--------------------------------------------------------------------------------
/day11-gulp/01.gulp/src/js/add.js:
--------------------------------------------------------------------------------
1 | function add(a, b) {
2 | console.log(a + b);
3 | }
4 |
5 | export default add;
--------------------------------------------------------------------------------
/day12-webpack/src/img/err.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowLetsgo/NB-Plus0322/HEAD/day12-webpack/src/img/err.jpg
--------------------------------------------------------------------------------
/day02-nodejs02/09.包和包管理器/node_modules/add/main.js:
--------------------------------------------------------------------------------
1 | function add(a, b) {
2 | return a + b;
3 | }
4 | exports.add = add;
--------------------------------------------------------------------------------
/day02-nodejs02/09.包和包管理器/node_modules/sub/index.js:
--------------------------------------------------------------------------------
1 | function sub(a, b) {
2 | return a - b;
3 | }
4 | exports.sub = sub;
--------------------------------------------------------------------------------
/day08-node08/01.强制缓存/lijing.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowLetsgo/NB-Plus0322/HEAD/day08-node08/01.强制缓存/lijing.jpg
--------------------------------------------------------------------------------
/day09-ajax/05.module/01.commonjs/mins.js:
--------------------------------------------------------------------------------
1 | function mins(a, b) {
2 | console.log(a - b);
3 | }
4 | module.exports = mins;
--------------------------------------------------------------------------------
/day12-webpack/src/img/haijing.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowLetsgo/NB-Plus0322/HEAD/day12-webpack/src/img/haijing.jpg
--------------------------------------------------------------------------------
/day12-webpack/src/img/lijing.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowLetsgo/NB-Plus0322/HEAD/day12-webpack/src/img/lijing.jpg
--------------------------------------------------------------------------------
/day09-ajax/05.module/01.commonjs/add.js:
--------------------------------------------------------------------------------
1 | function add(a, b) {
2 | console.log(a + b);
3 | }
4 |
5 | module.exports = add;
--------------------------------------------------------------------------------
/day01-nodejs01/01.node启动.js:
--------------------------------------------------------------------------------
1 | let a = 4;
2 | a++;
3 | console.log(a);
4 | console.log("hello world 0322");
5 | console.log("nodejs1");
--------------------------------------------------------------------------------
/day06-nodejs06/02.login/static/err.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowLetsgo/NB-Plus0322/HEAD/day06-nodejs06/02.login/static/err.jpg
--------------------------------------------------------------------------------
/day06-nodejs06/03.中间件/static/err.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowLetsgo/NB-Plus0322/HEAD/day06-nodejs06/03.中间件/static/err.jpg
--------------------------------------------------------------------------------
/day07-nodejs07/01.中间件/static/err.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowLetsgo/NB-Plus0322/HEAD/day07-nodejs07/01.中间件/static/err.jpg
--------------------------------------------------------------------------------
/day02-nodejs02/09.包和包管理器/node_modules/add/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "add",
3 | "version": "1.0.0",
4 | "main": "main.js"
5 | }
--------------------------------------------------------------------------------
/day06-nodejs06/03.中间件/static/haijing.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowLetsgo/NB-Plus0322/HEAD/day06-nodejs06/03.中间件/static/haijing.jpg
--------------------------------------------------------------------------------
/day06-nodejs06/03.中间件/static/lijing.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowLetsgo/NB-Plus0322/HEAD/day06-nodejs06/03.中间件/static/lijing.jpg
--------------------------------------------------------------------------------
/day07-nodejs07/01.中间件/static/haijing.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowLetsgo/NB-Plus0322/HEAD/day07-nodejs07/01.中间件/static/haijing.jpg
--------------------------------------------------------------------------------
/day07-nodejs07/01.中间件/static/lijing.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowLetsgo/NB-Plus0322/HEAD/day07-nodejs07/01.中间件/static/lijing.jpg
--------------------------------------------------------------------------------
/day07-nodejs07/05.session/static/err.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowLetsgo/NB-Plus0322/HEAD/day07-nodejs07/05.session/static/err.jpg
--------------------------------------------------------------------------------
/day06-nodejs06/02.login/static/haijing.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowLetsgo/NB-Plus0322/HEAD/day06-nodejs06/02.login/static/haijing.jpg
--------------------------------------------------------------------------------
/day06-nodejs06/02.login/static/lijing.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowLetsgo/NB-Plus0322/HEAD/day06-nodejs06/02.login/static/lijing.jpg
--------------------------------------------------------------------------------
/day07-nodejs07/05.session/static/lijing.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowLetsgo/NB-Plus0322/HEAD/day07-nodejs07/05.session/static/lijing.jpg
--------------------------------------------------------------------------------
/day07-nodejs07/05.session/static/haijing.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowLetsgo/NB-Plus0322/HEAD/day07-nodejs07/05.session/static/haijing.jpg
--------------------------------------------------------------------------------
/day02-nodejs02/07.nodeJS模块化/sub.js:
--------------------------------------------------------------------------------
1 | function sub(a, b) {
2 | console.log(a - b);
3 | }
4 |
5 | //暴露模块
6 | // exports.sub = sub;
7 | module.exports = sub;
--------------------------------------------------------------------------------
/day09-ajax/05.module/02.ES6/js/add.js:
--------------------------------------------------------------------------------
1 | function add(a, b) {
2 | console.log(a + b);
3 | }
4 |
5 | //默认暴露
6 | //当一个模块只需要暴露一个对象的时候使用
7 | export default add;
--------------------------------------------------------------------------------
/day03-nodejs03/晨测.md:
--------------------------------------------------------------------------------
1 | ## 晨测.md
2 | - 用nodejs搭建一个服务器(合理注释)
3 |
4 | - 用nodejs搭建一个客户端(合理注释)
5 |
6 | - 书写一个流式写入(pipe)(合理注释)
7 |
8 | https://wss.pet/s/5l29iil1bil 复制链接到浏览器打开
--------------------------------------------------------------------------------
/day11-gulp/01.gulp/src/less/public.less:
--------------------------------------------------------------------------------
1 | * {
2 | margin: 0;
3 | padding: 0;
4 | }
5 |
6 | html {
7 | width: auto;
8 |
9 | body {
10 | background-color: pink;
11 | }
12 | }
--------------------------------------------------------------------------------
/day04-node04/01.http.js:
--------------------------------------------------------------------------------
1 | /*
2 | http:
3 | - 超文本传输协议
4 | - 协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则。
5 | - 这个规则规定了客户端和服务器互相发送的报文格式
6 | - 客户端发送给服务器的称为“请求报文”,服务器发送给客户端的称为“响应报文”。
7 |
8 | */
--------------------------------------------------------------------------------
/day02-nodejs02/08.模块引入练习/01.引入内置模块.js:
--------------------------------------------------------------------------------
1 | const os = require("os");
2 | const free = os.freemem();
3 | const total = os.totalmem();
4 | const scale = free / total;
5 | console.log("内存剩余容量是:" + (scale * 100).toFixed(2) + "%");
--------------------------------------------------------------------------------
/day12-webpack/src/js/index.js:
--------------------------------------------------------------------------------
1 | import add from './add';
2 | import person from './person'
3 |
4 | //引入所有依赖的less
5 | import '../less/public.less';
6 | import '../less/test.less';
7 |
8 | console.log(person);
9 | add(2, 2);
--------------------------------------------------------------------------------
/day02-nodejs02/09.包和包管理器/test.js:
--------------------------------------------------------------------------------
1 | const {
2 | add
3 | } = require("add");
4 | const {
5 | sub
6 | } = require("sub");
7 |
8 | console.log(add(1, 2));
9 | console.log(sub(1, 2));
10 |
11 | console.dir(module)
--------------------------------------------------------------------------------
/day09-ajax/05.module/01.commonjs/index.js:
--------------------------------------------------------------------------------
1 | const add = require("./add");
2 | const mins = require("./mins");
3 |
4 | add(1, 2);
5 | mins(1, 3);
6 |
7 |
8 | /*
9 | browserify:
10 | 可以让浏览器中使用commonjs模块化规范
11 |
12 |
13 | */
--------------------------------------------------------------------------------
/day09-ajax/05.module/02.ES6/js/person.js:
--------------------------------------------------------------------------------
1 | //分别暴露:必须暴露完整的定义
2 | //一般在所有的东西都需要暴露的时候使用
3 |
4 | export const name = "laowang";
5 | export const age = 18;
6 | export const sex = "nan";
7 |
8 | export function say() {
9 | console.log("goodBye");
10 | }
--------------------------------------------------------------------------------
/day11-gulp/01.gulp/src/less/test.less:
--------------------------------------------------------------------------------
1 | #box {
2 | width: 100px;
3 | height: 100px;
4 | background-color: red;
5 |
6 | #con {
7 | width: 50px;
8 | height: 50px;
9 | background-color: yellowgreen;
10 | }
11 | }
--------------------------------------------------------------------------------
/day09-ajax/05.module/02.ES6/js/mins.js:
--------------------------------------------------------------------------------
1 | const name = "laohuang"
2 |
3 | function mins(a, b) {
4 | console.log(a - b);
5 | }
6 |
7 | function hello() {
8 | console.log("hello");
9 | }
10 |
11 |
12 | //统一暴露
13 | //当模块部分暴露的时候使用
14 | export {
15 | hello,
16 | mins,
17 | name
18 | }
--------------------------------------------------------------------------------
/day04-node04/11.面试题.js:
--------------------------------------------------------------------------------
1 | /*
2 | 从输入url到网页展示经历的过程
3 | 1. DNS解析
4 | - 把域名解析成ip地址去访问
5 | - 浏览器缓存、计算机缓存、路由器缓存、运营商缓存
6 |
7 | 2.TCP三次握手
8 |
9 | 3.客户端发送数据,把请求报文发送给服务端
10 |
11 | 4.客户端接收响应,服务端会生成响应报文发送给客户端
12 |
13 | 5.解析响应来的文件(渲染页面)
14 |
15 | 6.断开连接:TCP四次挥手
16 |
17 | */
--------------------------------------------------------------------------------
/day04-node04/05.请求方式.js:
--------------------------------------------------------------------------------
1 | /*
2 | 请求方式:
3 | - GET:读取数据,不应该对数据产生任何副作用(查)
4 | - POST:提交数据,表单的提交,文件的上传。。。一般用来创建一个资源(增)
5 | - PUT:提交数据,修改数据内容(改)
6 | - DELETE:请求删除某个资源(删)
7 | - HEAD:和GET类似,只不过不返回响应体,只返回响应头(查询一些资源的信息)
8 | - OPTIONS:预检请求,一般浏览器自动发送,检查服务端是否支持某个请求方法
9 |
10 |
11 | */
--------------------------------------------------------------------------------
/day04-node04/10.四次挥手.js:
--------------------------------------------------------------------------------
1 | /*
2 | TCP四次挥手
3 | - TCP 是双向的,所以需要在两个方向分别关闭,每个方向的关闭又需要请求和确认,所以一共就4次。
4 | - 客户端发送释放信号给服务端(Fin数据包:表示释放信号)
5 | - 服务端接受到释放信号,并给出回应,确认收到释放信号,但是数据可能没有传输完毕,等待传输(ack数据包,确认接收释放信号)
6 | - 服务端发送释放信号给客户端,并表示数据发送完毕(Fin数据包:释放信号)
7 | - 客户端发送确认信息给服务端,表示收到释放信号(ack数据包:确认接收释放信号)
8 | */
--------------------------------------------------------------------------------
/day09-ajax/05.module/02.ES6/build/add.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | Object.defineProperty(exports, "__esModule", {
4 | value: true
5 | });
6 | exports["default"] = void 0;
7 |
8 | function add(a, b) {
9 | console.log(a + b);
10 | } //默认暴露
11 | //当一个模块只需要暴露一个对象的时候使用
12 |
13 |
14 | var _default = add;
15 | exports["default"] = _default;
--------------------------------------------------------------------------------
/day02-nodejs02/02.面试题2.js:
--------------------------------------------------------------------------------
1 | //1 2 3 5 4
2 | setTimeout(() => {
3 | console.log(4);
4 | }, 0);
5 |
6 | new Promise(resolve => {
7 | console.log(1);
8 | for (let i = 0; i < 10000; i++) {
9 | i == 9999 && resolve();
10 | }
11 | console.log(2)
12 | }).then(() => {
13 | console.log(5)
14 | })
15 |
16 | console.log(3)
--------------------------------------------------------------------------------
/day03-nodejs03/03.fs/05.简单写入.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const path = require("path");
3 |
4 | const filePath = path.resolve(__dirname, "text.txt");
5 |
6 | //简单写入
7 | fs.writeFile(filePath, "就像牵着一条狗", {
8 | flag: "a"
9 | }, (err) => {
10 | if (err) {
11 | return;
12 | }
13 |
14 | console.log("文件写入成功");
15 | })
--------------------------------------------------------------------------------
/day12-webpack/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "parserOptions": {
3 | "ecmaVersion": 6,
4 | "sourceType": "module",
5 | "ecmaFeatures": {
6 | "jsx": true
7 | }
8 | },
9 | "rules": {
10 | // "semi": "error",
11 | // "for-direction": "error"
12 | // "comma-dangle": "error"
13 | }
14 | }
--------------------------------------------------------------------------------
/day05-node05/03.mongoose模块化/index.js:
--------------------------------------------------------------------------------
1 | //1.引入连接数据库模块
2 | require("./db/index");
3 |
4 | //2.引入teacher模块
5 | const teacherModel = require("./schema/teacher");
6 |
7 | teacherModel.findOne({
8 | age: {
9 | $lte: 20
10 | }
11 | })
12 | .then(data => {
13 | console.log(data);
14 | }).catch(err => {
15 | console.log(err);
16 | })
--------------------------------------------------------------------------------
/day01-nodejs01/09.事件轮询练习题3.js:
--------------------------------------------------------------------------------
1 | // 1 3 6 4 5 2
2 | console.log('1') //同步
3 |
4 | setTimeout(() => {
5 | console.log('2') //宏任务
6 | }, 0)
7 |
8 | new Promise((resolve) => {
9 | console.log('3') //同步
10 | resolve()
11 | })
12 | .then(() => {
13 | console.log('4') //微任务
14 | })
15 | .then(() => {
16 | console.log('5') //微任务
17 | })
18 |
19 | console.log('6') //同步
--------------------------------------------------------------------------------
/day03-nodejs03/03.fs/07.简单读取.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const path = require("path");
3 |
4 | // const filePath = path.resolve(__dirname, "text.txt");
5 | const filePath = path.resolve(__dirname, "01.mp4");
6 |
7 | //简单读取文件(一次性读取)
8 | fs.readFile(filePath, (err, re) => {
9 | if (err) {
10 | return;
11 | }
12 | console.log(re);
13 | // console.log(re.toString());
14 | })
--------------------------------------------------------------------------------
/day07-nodejs07/03.cookie.js:
--------------------------------------------------------------------------------
1 | /*
2 | cookie:
3 | - http是无状态协议,http自身不会对响应和请求之间的通信进行保存,每次请求的时候,不知道客户端是谁
4 | - cookie的本职工作其实并非本地存储,而是维持状态
5 | - cookie是绕开了http的无状态协议的手段,服务端可以通过用户请求携带的cookie信息,来维护客户端和服务端之间的状态
6 |
7 | cookie的特点:
8 | - cookie提供的内存很小,并且有个数限制
9 | - cookie一定会随着请求发送,过多的cookie会有更多性能消耗
10 | - cookie在http的传输中是明文的,安全性不高,https除外
11 |
12 |
13 | */
--------------------------------------------------------------------------------
/day09-ajax/05.module/01.commonjs/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/day09-ajax/05.module/02.ES6/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/day04-node04/09.三次握手.js:
--------------------------------------------------------------------------------
1 | /*
2 | TCP三次握手
3 | - 三次握手的意义在于,客户端和服务端双方都能确定对象的收发能力正常。
4 | - 客户端向服务端发送请求,服务端接收(客户端发送能力正常)
5 | - 发送一个syn字段包(k),syn是新连接的数据包
6 | - 服务端接收到请求,向客户端发送数据包,客户端接收(服务端接收能力和发送能力都正常)
7 | - 服务端发送一个ack+syn的数据包,ack=syn+1,表示确认客户端请求有效,然后并重新发送了一个新连接syn=k
8 | - 客户端向服务端发送请求,服务端接受(客户端接收能力正常)
9 | - 客户端发送一个ack = syn+1 确认连接
10 |
11 | */
--------------------------------------------------------------------------------
/day06-nodejs06/02.login/db/index.js:
--------------------------------------------------------------------------------
1 | const mongoose = require("mongoose");
2 |
3 | //连接数据库
4 | mongoose.connect("mongodb://127.0.0.1:27017/login", {
5 | useNewUrlParser: true,
6 | useUnifiedTopology: true
7 | });
8 |
9 | //监听数据库是否连接成
10 | mongoose.connection.once("open", err => {
11 | if (err) {
12 | console.log(err);
13 | return;
14 | }
15 | console.log("数据库连接成功");
16 | })
--------------------------------------------------------------------------------
/day06-nodejs06/03.中间件/db/index.js:
--------------------------------------------------------------------------------
1 | const mongoose = require("mongoose");
2 |
3 | //连接数据库
4 | mongoose.connect("mongodb://127.0.0.1:27017/login", {
5 | useNewUrlParser: true,
6 | useUnifiedTopology: true
7 | });
8 |
9 | //监听数据库是否连接成
10 | mongoose.connection.once("open", err => {
11 | if (err) {
12 | console.log(err);
13 | return;
14 | }
15 | console.log("数据库连接成功");
16 | })
--------------------------------------------------------------------------------
/day07-nodejs07/01.中间件/db/index.js:
--------------------------------------------------------------------------------
1 | const mongoose = require("mongoose");
2 |
3 | //连接数据库
4 | mongoose.connect("mongodb://127.0.0.1:27017/login", {
5 | useNewUrlParser: true,
6 | useUnifiedTopology: true
7 | });
8 |
9 | //监听数据库是否连接成
10 | mongoose.connection.once("open", err => {
11 | if (err) {
12 | console.log(err);
13 | return;
14 | }
15 | console.log("数据库连接成功");
16 | })
--------------------------------------------------------------------------------
/day07-nodejs07/05.session/db/index.js:
--------------------------------------------------------------------------------
1 | const mongoose = require("mongoose");
2 |
3 | //连接数据库
4 | mongoose.connect("mongodb://127.0.0.1:27017/login", {
5 | useNewUrlParser: true,
6 | useUnifiedTopology: true
7 | });
8 |
9 | //监听数据库是否连接成
10 | mongoose.connection.once("open", err => {
11 | if (err) {
12 | console.log(err);
13 | return;
14 | }
15 | console.log("数据库连接成功");
16 | })
--------------------------------------------------------------------------------
/day04-node04/11.浏览器渲染过程.js:
--------------------------------------------------------------------------------
1 | /*
2 | 浏览器渲染过程:
3 | 1. 构建DOM树:解析 html 结构为浏览器可以理解的 DOM 树结构
4 |
5 | 2. 构建CSSOM树(样式树)
6 |
7 | 3. 构建渲染树(render Tree):合并DOM树和样式树,计算每一个节点的位置和样式
8 |
9 | 4. 分层:页面有很多复杂的效果,为了实现效果会进行分层绘制(有滚动条的,3d的,半透明等等都需要分层)
10 |
11 | 5. 图层绘制:生成多个绘制指令
12 |
13 | 6. 栅格化:把图层不是一次性直接绘制,而是分为了多个图块
14 |
15 | 7.合成及显示:把图块放在渲染的线程上开始绘制,并显示在浏览器中
16 |
17 |
18 | */
--------------------------------------------------------------------------------
/day09-ajax/05.module/02.ES6/build/mins.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | Object.defineProperty(exports, "__esModule", {
4 | value: true
5 | });
6 | exports.hello = hello;
7 | exports.mins = mins;
8 | exports.name = void 0;
9 | var name = "laohuang";
10 | exports.name = name;
11 |
12 | function mins(a, b) {
13 | console.log(a - b);
14 | }
15 |
16 | function hello() {
17 | console.log("hello");
18 | } //统一暴露
19 | //当模块部分暴露的时候使用
--------------------------------------------------------------------------------
/day01-nodejs01/08.事件轮询练习题2.js:
--------------------------------------------------------------------------------
1 | //微任务
2 | Promise.resolve().then(() => {console.log(555);});
3 |
4 | //微任务 并且一定在第一的位置
5 | process.nextTick(() => {
6 | console.log('process.nextTick() 333');
7 | })
8 |
9 | //宏任务
10 | setTimeout(() => {
11 | console.log('setTimeout() 111');
12 | }, 0)
13 |
14 | //宏任务
15 | setImmediate(() => {
16 | console.log('setImmediate() 222');
17 | })
18 |
19 | //同步
20 | console.log('全局代码执行完了 444');
21 |
22 |
--------------------------------------------------------------------------------
/day04-node04/06.MIME类型/01.MIME类型.js:
--------------------------------------------------------------------------------
1 | /*
2 | Content-Type用于指示资源的MIME类型。告诉客户端实际返回的内容的内容类型。
3 |
4 | MIME类型也叫媒体类型,是一种标准,用来表示文档、文件等内容的格式。
5 |
6 | 常见MIME类型:
7 | text/plain : 普通文本
8 | text/css : css文件
9 | text/html : html文件
10 | application/javascript: js文件
11 | image/图片格式:图片
12 | video/视频格式:视频
13 | audio/音频格式:音频
14 | application/x-www-form-urlencoded:form表单格式
15 | */
--------------------------------------------------------------------------------
/day06-nodejs06/02.login/model/userModel.js:
--------------------------------------------------------------------------------
1 | const mongoose = require("mongoose");
2 |
3 | const userSchema = new mongoose.Schema({
4 | username: {
5 | type: String,
6 | unique: true,
7 | required: true
8 | },
9 | password: {
10 | type: String,
11 | required: true
12 | }
13 | });
14 |
15 | //创建一个model
16 | const userModel = mongoose.model("userInfo", userSchema);
17 |
18 | module.exports = userModel;
--------------------------------------------------------------------------------
/day06-nodejs06/03.中间件/model/userModel.js:
--------------------------------------------------------------------------------
1 | const mongoose = require("mongoose");
2 |
3 | const userSchema = new mongoose.Schema({
4 | username: {
5 | type: String,
6 | unique: true,
7 | required: true
8 | },
9 | password: {
10 | type: String,
11 | required: true
12 | }
13 | });
14 |
15 | //创建一个model
16 | const userModel = mongoose.model("userInfo", userSchema);
17 |
18 | module.exports = userModel;
--------------------------------------------------------------------------------
/day07-nodejs07/01.中间件/model/userModel.js:
--------------------------------------------------------------------------------
1 | const mongoose = require("mongoose");
2 |
3 | const userSchema = new mongoose.Schema({
4 | username: {
5 | type: String,
6 | unique: true,
7 | required: true
8 | },
9 | password: {
10 | type: String,
11 | required: true
12 | }
13 | });
14 |
15 | //创建一个model
16 | const userModel = mongoose.model("userInfo", userSchema);
17 |
18 | module.exports = userModel;
--------------------------------------------------------------------------------
/day07-nodejs07/01.中间件/views/center.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 | 我是888号技师 晶晶为您服务
13 | 洗剪20 吹800
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/day12-webpack/src/less/test.less:
--------------------------------------------------------------------------------
1 | #box {
2 | width: 400px;
3 | height: 400px;
4 | background-color: red;
5 | animation: move 1s;
6 |
7 | #con {
8 | width: 200px;
9 | height: 200px;
10 | background: url("../img/haijing.jpg");
11 | }
12 | }
13 |
14 | @keyframes move {
15 | from {
16 | transform: rotate(30deg);
17 | }
18 |
19 | to {
20 | transform: rotate(80deg);
21 | }
22 | }
--------------------------------------------------------------------------------
/day06-nodejs06/03.中间件/public/center.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 | 我是888号技师 晶晶为您服务
13 | 洗剪20 吹800
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/day07-nodejs07/05.session/model/userModel.js:
--------------------------------------------------------------------------------
1 | const mongoose = require("mongoose");
2 |
3 | const userSchema = new mongoose.Schema({
4 | username: {
5 | type: String,
6 | unique: true,
7 | required: true
8 | },
9 | password: {
10 | type: String,
11 | required: true
12 | }
13 | });
14 |
15 | //创建一个model
16 | const userModel = mongoose.model("userInfo", userSchema);
17 |
18 | module.exports = userModel;
--------------------------------------------------------------------------------
/day07-nodejs07/05.session/views/center.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 | 我是888号技师 晶晶为您服务
13 | 洗剪20 吹800
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/day01-nodejs01/07.事件轮询练习题1.js:
--------------------------------------------------------------------------------
1 | //2 1 4 3 6
2 | //微任务
3 | process.nextTick(() => {console.log(111);});
4 |
5 |
6 | //同步代码
7 | const promise = new Promise(resolve => {
8 | console.log(222);
9 | resolve();
10 | });
11 |
12 | //宏任务
13 | setImmediate(() => {console.log(666);});
14 |
15 | //宏任务
16 | setTimeout(() => {console.log(333);}, 100);
17 | // setTimeout(() => {console.log(333);});
18 |
19 | //微任务
20 | promise.then(() => {console.log(444);});
21 |
22 |
--------------------------------------------------------------------------------
/day06-nodejs06/02.login/public/center.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 | 我是888号技师 晶晶为您服务
13 | 洗剪20 吹800
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/day12-webpack/src/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/day09-ajax/05.module/02.ES6/build/person.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | Object.defineProperty(exports, "__esModule", {
4 | value: true
5 | });
6 | exports.say = say;
7 | exports.sex = exports.age = exports.name = void 0;
8 | //分别暴露:必须暴露完整的定义
9 | //一般在所有的东西都需要暴露的时候使用
10 | var name = "laowang";
11 | exports.name = name;
12 | var age = 18;
13 | exports.age = age;
14 | var sex = "nan";
15 | exports.sex = sex;
16 |
17 | function say() {
18 | console.log("goodBye");
19 | }
--------------------------------------------------------------------------------
/day07-nodejs07/04.session.js:
--------------------------------------------------------------------------------
1 | /*
2 | session:
3 | - 服务端存储
4 | 1.客户端发送登录请求,在报文体中携带登录信息
5 | 2.服务端接收请求,创建一个session对象,然后给当前的用户信息创建一个永远不会重复的sessionID,把当前的用户的信息和sessionID组成一个key-value保存在session对象中
6 | 3.服务端返回响应,cookie携带了sessionID
7 | 4.客户端接收响应,把sessionID保存在cookie中
8 | 5.客户端第二次发送请求,会自动携带cookie,cookie中携带有sessionID
9 | 6.服务端通过解析,获取到了客户端请求的cookie中的sessionID,去判断用户信息是否在session对象中保存
10 | 7.如果服务端验证成功,则会响应对应的请求,否则需要再次登录
11 |
12 | */
--------------------------------------------------------------------------------
/day04-node04/08.osi网络模型.js:
--------------------------------------------------------------------------------
1 | /*
2 | 在理论上网络模型分为7层 被称作为OSI七层网络模型
3 | 在应用实践上分为四层,被称作为TCP/IP四层网络模型
4 | - 应用层
5 | - TCP/IP协议的应用层对应这OSI的应用层、会话层、表示层
6 | - 应用层:为用户的应用提供支持和网络访问(HTTP)
7 | - 会话层:负责网络中的通信
8 | - 表示层:负责转化数据,对数据的加密和压缩
9 |
10 | - 传输层
11 | - 提供应用程序接口(TCP)
12 | - 对数据进行检测,流量控制
13 |
14 | - 网络层
15 | - 解决数据由一个计算机的ip如何发送到目标计算机的过程(IP)
16 | - 包含了MAC地址 IP地址
17 |
18 | - 链路层
19 | - 将数据转化为电子的形式在传输介质上传播
20 | */
--------------------------------------------------------------------------------
/day05-node05/03.mongoose模块化/db/index.js:
--------------------------------------------------------------------------------
1 | //这个db文件专门用来连接数据库
2 | //1.引入mongoose模块
3 | const mongoose = require("mongoose");
4 |
5 | //2.连接数据库 (open事件监听)
6 | mongoose.connect("mongodb://127.0.0.1:27017/atguigu", {
7 | useNewUrlParser: true,
8 | useUnifiedTopology: true
9 | });
10 | //当数据库连接成功以后 会触发mongoose.connection的open事件
11 | mongoose.connection.once("open", err => {
12 | if (err) {
13 | console.log(err);
14 | return;
15 | }
16 | console.log("数据库连接成功");
17 | })
--------------------------------------------------------------------------------
/day03-nodejs03/04.http/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/day02-nodejs02/10.Buffer/01.Buffer.js:
--------------------------------------------------------------------------------
1 | /*
2 | Buffer.alloc: 创建指定大小的buffer
3 | Buffer.from():将数据转成buffer
4 | toString方法: 把buffer转成数据
5 |
6 |
7 | */
8 |
9 | const buf1 = Buffer.alloc(11, "李沛华");
10 | console.log(buf1);
11 |
12 | const buf2 = Buffer.allocUnsafe(20);
13 | console.log(buf2);
14 |
15 | const buf3 = Buffer.from("尚硅谷NB");
16 | console.log(buf3);
17 |
18 |
19 | //使用toString可以将一个buffer转为字符串
20 | console.log(buf3.toString());
21 | console.log(buf1.toString());
22 | console.log(buf2.toString());
--------------------------------------------------------------------------------
/day03-nodejs03/03.fs/01.同步写入.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const path = require("path");
3 |
4 | //得到要写入文件的绝对路径
5 | const filePath = path.resolve(__dirname, "text.txt")
6 | console.log(filePath)
7 |
8 | //同步打开文件(第二个参数是文件系统的flag:默认r代表可写,如果没有这个文件则报错,还有a,代表追加,如果没有这个文件则创建)、
9 | const fd = fs.openSync(filePath, "a");
10 | //读取文件的返回值是一个当前文件的id标识
11 | console.log(fd);
12 |
13 |
14 | //同步写入
15 | fs.writeSync(fd, "蛋黄的长裙");
16 |
17 | //关闭文件
18 | fs.closeSync(fd);
19 |
20 |
21 | console.log("同步的文件操作没有执行完成,是不会执行这条语句的")
--------------------------------------------------------------------------------
/day03-nodejs03/03.fs/08.流式读取文件.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const path = require("path");;
3 | const filePath = path.resolve(__dirname, "01.mp4");
4 |
5 | //创建可读流 进行流式读取
6 | const rs = fs.createReadStream(filePath);
7 |
8 | //rs是打开了一个可读流
9 | //可读流每次最大释放的数据大小是64kb,将会一直持续释放数据
10 | //可读流的data方法就是来消费可读流的,只要有数据读取 data就会触发
11 | rs.on("data", (chunk) => {
12 | //chunk就是持续读取的数据
13 |
14 | console.log(chunk);
15 | })
16 |
17 | //当可读流读完之后,会自动触发end事件
18 | rs.on("end", () => {
19 | console.log("数据读取完毕");
20 | })
--------------------------------------------------------------------------------
/day01-nodejs01/04.基础的事件轮询机制.js:
--------------------------------------------------------------------------------
1 | /*
2 | js事件轮询机制:
3 | - 代码分类
4 | - 初始化代码(同步代码):设置定时器,绑定事件,执行for等等....
5 | - 回调执行代码(异步代码):定时器回调,事件回调,ajax回调.....
6 | - js先执行同步代码 再执行异步代码
7 |
8 | - js事件轮询模型
9 | - 主线程
10 | - 浏览器的管理模块(DOM事件管理、Ajax管理、定时器管理)
11 | - 回调队列
12 |
13 | - 模型的运转流程
14 | - 执行初始化代码, 将异步回调函数交给对应模块管理
15 | - 当异步回调函数需要被执行的时候,将回调函数添加到回调列队中
16 | - 当同步代码执行完毕之后,会遍历调用回调队列中的回调函数执行
17 |
18 |
19 | */
--------------------------------------------------------------------------------
/day11-gulp/01.gulp/src/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
13 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/day03-nodejs03/02.crypto.js:
--------------------------------------------------------------------------------
1 | const crypto = require("crypto");
2 |
3 | //得到一个明文
4 | let str = "123456";
5 |
6 | //为了安全起见,有两种防止被撞库的方法 1.加密再加密多加密几层 2.给明文加一点盐
7 |
8 | let salt = "atguigu1";
9 |
10 | str += salt;
11 |
12 | //先确定使用哪一种消息摘要加密算法 MD5 sha1 sha256 sha512
13 | let md5 = crypto.createHash("sha512");
14 |
15 | //使用update方法得到对应的hash对象,参数是明文和明文的字符编码
16 | const secretHash = md5.update(str, "utf-8");
17 |
18 | //通过hash对象的digest("hex")方法 可以得到对应的密文
19 | const secret = secretHash.digest("hex");
20 |
21 | console.log(secret);
--------------------------------------------------------------------------------
/day02-nodejs02/01.面试题.js:
--------------------------------------------------------------------------------
1 | //4 1 3 6 8 2 7 5
2 | async function async1() {
3 | console.log('1');
4 | //await async2()中 acync2函数的执行是同步的 因为先执行完方法才会执行await
5 | await async2();
6 | console.log('2')
7 | }
8 |
9 | async function async2() {
10 | console.log('3')
11 | }
12 | console.log('4');
13 | setTimeout(() => {
14 | console.log('5')
15 | }, 0);
16 | async1();
17 | new Promise((resolve) => {
18 | console.log('6');
19 | resolve()
20 | }).then(() => {
21 | console.log('7')
22 | });
23 | console.log('8')
--------------------------------------------------------------------------------
/day01-nodejs01/02.global.js:
--------------------------------------------------------------------------------
1 | /*
2 | global对象:
3 | NodeJS的顶层对象
4 | 包含了
5 | - 3个计时器方法 和 3个清除计时器的方法
6 | - 微任务方法
7 | - process\Buffer\console对象
8 |
9 |
10 | */
11 |
12 | console.log(global);
13 | // setInterval(() => console.log(1), 1000)
14 | // setTimeout(() => console.log(2), 0)
15 | // queueMicrotask(() => console.log(3))
16 | // setImmediate(() => console.log(4))
17 |
18 | // console.log(global.process);
19 | // console.log(global.Buffer);
20 | // console.log(global.console);
--------------------------------------------------------------------------------
/day04-node04/post.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/day03-nodejs03/03.fs/12.pipe.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const path = require("path");;
3 | const readFilePath = path.resolve(__dirname, "01.mp4");
4 | const writeFilePath = path.resolve(__dirname, "02.mp4");
5 |
6 | //流式读取数据 创建可读流
7 | //流式写入数据 创建可写流
8 | const rs = fs.createReadStream(readFilePath);
9 | const ws = fs.createWriteStream(writeFilePath, {
10 | flag: "a"
11 | })
12 |
13 |
14 | // pipe会持续性消费可读流数据
15 | // 将可读流数据写入到可写流中
16 | // 会自动关闭可写流
17 | rs.pipe(ws);
18 |
19 | //监听可读流
20 | rs.on("end", (err) => {
21 | console.log("读取完成");
22 | })
--------------------------------------------------------------------------------
/day07-nodejs07/05.autoOpen.js:
--------------------------------------------------------------------------------
1 | //引入express
2 | const express = require("express");
3 |
4 | const {
5 | exec
6 | } = require('child_process');
7 |
8 | //创建一个express的application对象
9 | const app = express();
10 |
11 | app.get("/", (req, res) => {
12 | res.send("下雨了")
13 | })
14 |
15 | //监听端口号和服务器状态
16 | let port = "3002";
17 | app.listen(port, err => {
18 | if (err) {
19 | console.log(err);
20 | return;
21 | }
22 |
23 | console.log("服务器启动,请访问" + ` http://127.0.0.1:${port}`);
24 | exec("start http://127.0.0.1:3002")
25 | })
--------------------------------------------------------------------------------
/day03-nodejs03/01.events事件触发器.js:
--------------------------------------------------------------------------------
1 | const EventEmitter = require("events");
2 |
3 | //创建子类继承父类EventEmitter
4 | class myEmitter extends EventEmitter {};
5 |
6 | //实例化子类
7 | const emitter = new myEmitter();
8 |
9 | //绑定事件 对象有一个 eventEmitter.on() 函数,用于将一个或多个函数绑定到命名事件上
10 | emitter.on("myClick", () => {
11 | console.log("嘿,你调用我了myClick");
12 | })
13 |
14 | /* emitter.once("myClick", () => {
15 | console.log("嘿,你调用我了myClick");
16 | }) */
17 |
18 | // eventEmitter.emit() 用于触发事件
19 | setTimeout(() => {
20 | emitter.emit("myClick");
21 | emitter.emit("myClick");
22 | }, 2000)
--------------------------------------------------------------------------------
/day05-node05/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 | hello world
13 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/day13-axios/db.json:
--------------------------------------------------------------------------------
1 | {
2 | "posts": [
3 | {
4 | "title": "react",
5 | "author": "fxe",
6 | "id": 3
7 | },
8 | {
9 | "title": "css3",
10 | "author": "laoliu",
11 | "id": 4
12 | },
13 | {
14 | "title": "css3",
15 | "author": "laoliu",
16 | "id": 5
17 | },
18 | {
19 | "title": "vue",
20 | "author": "laowang",
21 | "id": 6
22 | }
23 | ],
24 | "comments": [],
25 | "profile": {
26 | "name": "typicode"
27 | },
28 | "class": {
29 | "name": "nodejs",
30 | "teacher": "laoli"
31 | }
32 | }
--------------------------------------------------------------------------------
/day03-nodejs03/03.fs/06.流式写入.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const path = require("path");
3 |
4 | const filePath = path.resolve(__dirname, "text.txt");
5 |
6 | //流式写入 创建可写流
7 | const fd = fs.createWriteStream(filePath, {
8 | flag: "a"
9 | });
10 |
11 | //可写流有一个open和close事件,当可写流打开和关闭的时候触发
12 |
13 | fd.on("open", () => {
14 | console.log("可写流打开 开始写入~");
15 | })
16 |
17 | fd.on("close", () => {
18 | console.log("可写流关闭,停止写入!");
19 | })
20 |
21 | //流式写入:可以持续写入
22 | fd.write("锄禾日当午");
23 | fd.write("汗滴禾下土");
24 | fd.write("谁知盘中餐");
25 | fd.write("粒粒皆辛苦");
26 |
27 | //当写入完成可以自行关闭流
28 | fd.close();
--------------------------------------------------------------------------------
/day04-node04/07.状态码.js:
--------------------------------------------------------------------------------
1 | /*
2 | HTTP 响应状态代码(status)指示特定 HTTP 请求的状态。响应分为五类
3 | - 1XX: 请求已经被服务端接收,继续处理中
4 | 100:请求正常,可以继续请求
5 | 101:需要切换协议
6 | 102:服务端正在处理,但是还没有找到资源
7 |
8 | - 2XX: 请求已经被服务器接收,并且处理完成
9 | 200:请求成功
10 | 201:请求处理成功,并创建了新资源 常见POST请求
11 |
12 | - 3XX: 需要后续操作才能完成请求
13 | 301:永久重定向
14 | 302:临时重定向
15 | 304:读取缓存
16 |
17 | - 4XX: 客户端错误(服务器无法执行)
18 | 400:请求中出现语法错误
19 | 401:需要重新认证
20 | 403:拒绝访问
21 | 404:找不到资源
22 |
23 | - 5XX: 服务端错误
24 | - 500:服务器执行过程中出现了错误
25 | - 503:服务器因为各种原因停止运行,无法处理请求
26 |
27 |
28 | */
--------------------------------------------------------------------------------
/day03-nodejs03/04.http/02.客户端.js:
--------------------------------------------------------------------------------
1 | const http = require("http");
2 |
3 | //服务端地址
4 | const url = "http://127.0.0.1:3000";
5 |
6 | //http模块有一个request方法可以进行请求服务端(创建可客户端)
7 | const request = http.request(url, (response) => {
8 | //回调函数有一个参数,就是请求服务端得到的响应
9 | console.log(response);
10 |
11 | //得到响应状态码
12 | console.log(response.statusCode);
13 |
14 | //响应的数据是一个可读流,通过data方法监听得到
15 | response.on("data", (chunk) => {
16 | console.log(chunk.toString());
17 | })
18 |
19 | response.on("end", (chunk) => {
20 | console.log("响应数据接受完毕");
21 | })
22 | })
23 |
24 | //创建的客户端有一个end方法,可以开始发送请求
25 | request.end();
--------------------------------------------------------------------------------
/day08-node08/02.协商缓存/readMe.md:
--------------------------------------------------------------------------------
1 | 协商缓存:
2 | 1. 客户端向服务端发送一个请求,请求相应的资源
3 | 2. 服务端向客户端发送一个响应,在响应头中携带两个关于缓存的信息,分别是 当前文件的唯一标识(eTag)和 当前文件的最后一次修改时间(last-modified)
4 | 3. 客户端收到了响应文件和关于文件的缓存信息,并把缓存信息保存在客户端,但是更换了名称,把eTag更名为if-none-match,把last-modified更名为if-modified-since。
5 |
6 | 4. 客户端第二次请求服务端,请求相应的资源,会在请求头上携带两个字段,就是之前已经请求过的文件的缓存信息 if-none-match和if-modified-since
7 | 5. 服务端接收到了客户端的if-none-match和if-modified-since,然后会重新获取被请求文件的eTag和last-modified,然后开始比较,如果两个都比较成功,则读取缓存,否则返回新的响应
8 |
9 | 6.如果走缓存,则服务端的响应状态码是304,并且不需要设置任何的响应内容
10 | 7.如果走缓存,则客户端接收到的状态码是304,并直接去读取缓存
11 |
12 | 8.如果不走缓存,则响应状态码是200,并且响应最新的数据,还要携带最新的eTag和last-modified
--------------------------------------------------------------------------------
/day08-node08/02.协商缓存/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
13 | 协商缓存111
14 |
15 | - 1
16 | - 1
17 | - 1
18 | - 1
19 | - 1
20 |
21 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/day02-nodejs02/12.path/01.path.js:
--------------------------------------------------------------------------------
1 | const path = require("path");
2 |
3 | //根据当前路径 得到其他绝对路径
4 | const filePath1 = path.resolve("../11.process/index.txt");
5 | console.log(filePath1);
6 |
7 | const filePath2 = path.resolve("../11.process", "01.txt");
8 | console.log(filePath2);
9 |
10 | const filePath3 = path.resolve("../11.process/util", "01.js");
11 | console.log(filePath3);
12 |
13 |
14 |
15 | //需求1:在path.js(当前)文件,获取process.js文件的绝对路径
16 | const processPath = path.resolve("../11.process", "01.process.js");
17 | console.log(processPath);
18 |
19 | //需求:在path.js(当前)文件,获取其他文件的绝对路径
20 | const otherPath = path.resolve(__dirname, "01.txt");
21 | console.log(otherPath);
--------------------------------------------------------------------------------
/day02-nodejs02/05.面试题.js:
--------------------------------------------------------------------------------
1 | Promise.resolve().then(() => {
2 | console.log(1)
3 | //当then中return的是一个Promise.resolve()的时候,PromiseA+规范会默认在后边添加一个.then((res) => res),js底层也会默认添加一个.then((res) => res)
4 | return Promise.resolve(2)
5 | // return Promise.resolve(2).then((res) => res).then((res) => res)
6 | })
7 | .then(res => {
8 | console.log(res)
9 | })
10 |
11 |
12 | Promise.resolve()
13 | .then(() => {
14 | console.log(3)
15 | })
16 | .then(() => {
17 | console.log(4)
18 | })
19 | .then(() => {
20 | console.log(5)
21 | })
22 | .then(() => {
23 | console.log(6)
24 | })
--------------------------------------------------------------------------------
/day06-nodejs06/03.ejs模板引擎/index.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
13 | <%- data %>
14 |
15 |
16 | <%- name %>
17 |
18 |
19 |
20 | <% user.forEach((item)=>{ %>
21 | 姓名是: <%- item.name %>
22 | 性别是: <%- item.sex %>
23 | 年龄是: <%- item.age %>
24 |
25 | <% }) %>
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/day01-nodejs01/03.setImmediate.js:
--------------------------------------------------------------------------------
1 | /*
2 | setImmediate()方法:
3 | - 立即执行计时器
4 | - 当浏览器执行完同步代码后会立即执行这个函数(在宏任务中,不可以书写延迟时间)
5 |
6 | */
7 |
8 | /* console.log(1);
9 |
10 | setImmediate(() => {
11 | console.log(2);
12 | })
13 |
14 | console.log(3); */
15 |
16 |
17 |
18 | /*
19 | process.nextTick():
20 | - 立即执行函数
21 | - 当浏览器执行完同步代码后会立即执行这个函数
22 | - 如果你希望异步任务尽可能快地执行,那就使用 process.nextTick
23 | - process.nextTick要优先于所有的异步代码执行
24 |
25 | */
26 |
27 | console.log(1);
28 |
29 | setImmediate(() => {
30 | console.log(2);
31 | })
32 |
33 | process.nextTick(() => {
34 | console.log(4);
35 | })
36 |
37 | console.log(3);
--------------------------------------------------------------------------------
/day02-nodejs02/04.面试题.js:
--------------------------------------------------------------------------------
1 | //1 2 3 8 4 7 5 6
2 | new Promise((resolve, reject) => {
3 | console.log(1)
4 | resolve(1)
5 | })
6 | .then(() => {
7 | console.log(2)
8 | new Promise((resolve, reject) => {
9 | console.log(3)
10 | resolve()
11 | })
12 | .then(() => {
13 | console.log(4)
14 | })
15 | .then(() => {
16 | console.log(5)
17 | })
18 | .then(() => {
19 | console.log(6)
20 | })
21 | console.log(8);
22 | })
23 | .then(() => {
24 | console.log(7)
25 | })
--------------------------------------------------------------------------------
/day06-nodejs06/03.中间件/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 | 欢迎来到晶晶红浪漫
13 | 技师列表
14 |
15 |
16 |

17 |

18 |
19 |
20 |
21 |
22 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/day07-nodejs07/01.中间件/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 | 欢迎来到晶晶红浪漫
13 | 技师列表
14 |
15 |
16 |

17 |

18 |
19 |
20 |
21 |
22 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/day07-nodejs07/05.session/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 | 欢迎来到晶晶红浪漫
13 | 技师列表
14 |
15 |
16 |

17 |

18 |
19 |
20 |
21 |
22 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/day07-nodejs07/05.session/util/open.js:
--------------------------------------------------------------------------------
1 | const {
2 | exec
3 | } = require("child_process");
4 |
5 | function open(port, host) {
6 |
7 | const type = process.platform;
8 | let open = "";
9 | /*
10 | window:start打开浏览器
11 | MacOS:open打开浏览器
12 | Linux:xdg-open打开浏览器
13 | */
14 |
15 | switch (type) {
16 | case "win32":
17 | open = "start";
18 | break;
19 | case "darwin":
20 | open = "open";
21 | break;
22 | case "linux":
23 | open = "xdg-open";
24 | break;
25 | }
26 | exec(`${open} ${host}:${port}`)
27 | }
28 |
29 | module.exports = open;
--------------------------------------------------------------------------------
/day06-nodejs06/02.login/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 | 欢迎来到晶晶红浪漫
13 | 技师列表
14 |
15 |
16 |

17 |

18 |
19 |
20 |
21 |
22 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/day02-nodejs02/06.node的外层函数.js:
--------------------------------------------------------------------------------
1 | //可以打印出实参
2 | console.log(arguments);
3 | //根据实参获取所在的函数
4 | console.log(arguments.callee);
5 | //把实参得到函数转字符串打印出来
6 | console.log(arguments.callee.toString());
7 |
8 | /*
9 | 得到node中的js默认外层函数如下:
10 | function (exports, require, module, __filename, __dirname) {
11 |
12 | }
13 |
14 | exports:指向的对象 就是被暴露的对象
15 | require:用来引入其他模块
16 | module: 真正用来暴露模块 里边有一个module.exports方法
17 | __filename:当前文件的绝对路径
18 | __dirname:当前文件所在文件夹的绝对路径
19 |
20 | */
21 | console.log(exports); //{}
22 | console.log(require); //方法
23 | console.log(module); // 对象 有很多方法
24 | console.log(__filename); //当前文件的绝对路径
25 | console.log(__dirname); //当前文件所在文件夹的绝对路径
26 |
27 |
--------------------------------------------------------------------------------
/day03-nodejs03/03.fs/11.promisify练习.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const path = require("path");
3 |
4 | //得到文件路径
5 | const filePath = path.resolve(__dirname, "text.txt");
6 |
7 | //获取promisify
8 | const {
9 | promisify
10 | } = require("util");
11 |
12 | //使用promisify处理异步方法
13 | const open = promisify(fs.open);
14 | const write = promisify(fs.write);
15 | const close = promisify(fs.close);
16 |
17 |
18 | (async () => {
19 | const fd = await open(filePath, "a");
20 | await write(fd, "今天天气真好");
21 | const re = await close(fd);
22 | return "写入成功";
23 | })()
24 | .then((data) => {
25 | console.log(data);
26 | })
27 | .catch((err) => {
28 | console.log(err);
29 | })
--------------------------------------------------------------------------------
/day07-nodejs07/02.localStorage/center.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
13 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/day03-nodejs03/03.fs/09.流式读取及写入.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const path = require("path");;
3 | const readFilePath = path.resolve(__dirname, "01.mp4");
4 | const writeFilePath = path.resolve(__dirname, "02.mp4");
5 |
6 | //流式读取数据 创建可读流
7 | //流式写入数据 创建可写流
8 | const rs = fs.createReadStream(readFilePath);
9 | const ws = fs.createWriteStream(writeFilePath, {
10 | flag: "a"
11 | })
12 |
13 | //书写一个data事件 监听可读流
14 | rs.on("data", (chunk) => {
15 | //chunk就是读取的数据,然后把读取的数据流式写入到可写流中
16 | ws.write(chunk)
17 | })
18 |
19 | //书写一个end事件,监听可读流关闭
20 | rs.on("end", () => {
21 | //关闭可写流
22 | ws.close();
23 | })
24 |
25 |
26 | //给可写流绑定close事件,当可写流关闭的时候触发
27 | ws.on("close", () => {
28 | console.log("文件写入完毕");
29 | })
--------------------------------------------------------------------------------
/day11-gulp/01.gulp/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "gulp-test",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "gulp watch",
8 | "build": "gulp build"
9 | },
10 | "keywords": [],
11 | "author": "",
12 | "license": "ISC",
13 | "devDependencies": {
14 | "@babel/core": "^7.14.6",
15 | "@babel/preset-env": "^7.14.5",
16 | "gulp": "^4.0.2",
17 | "gulp-babel": "^8.0.0",
18 | "gulp-browserify": "^0.5.1",
19 | "gulp-concat": "^2.6.1",
20 | "gulp-connect": "^5.7.0",
21 | "gulp-cssmin": "^0.2.0",
22 | "gulp-htmlmin": "^5.0.1",
23 | "gulp-less": "^4.0.1",
24 | "gulp-rename": "^2.0.0",
25 | "gulp-uglify": "^3.0.2"
26 | }
27 | }
--------------------------------------------------------------------------------
/day05-node05/03.mongoose模块化/schema/teacher.js:
--------------------------------------------------------------------------------
1 | const mongoose = require("mongoose");
2 | // 3. 创建Schema对象, 方便未来对某个集合的值进行约束
3 | const teacherSchema = new mongoose.Schema({
4 | name: {
5 | type: String,
6 | unique: true, //唯一存在(以后不能有name的重名)
7 | required: true //必填项
8 | },
9 | age: Number,
10 | sex: String,
11 | // hobby:Array,//限制值必须是一个数组
12 | hobby: [String], //限制值必须是一个数组 并且数组的值必须是字符串
13 | createTime: {
14 | type: Date,
15 | default: Date.now
16 | }
17 | });
18 |
19 | //直接把这个schema所约束的集合给创建了
20 | //4.创建model对象(集合)
21 | //两个参数:集合的名字 集合的约束对象
22 | const teacherModel = mongoose.model("teacher", teacherSchema);
23 |
24 |
25 | //把创建集合暴露出去
26 | module.exports = teacherModel;
--------------------------------------------------------------------------------
/day03-nodejs03/03.fs/02.异步写入.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const path = require("path");
3 |
4 | //得到文件路径
5 | const filePath = path.resolve(__dirname, "text.txt");
6 |
7 | //异步打开文件
8 | fs.open(filePath, "a", (err, fd) => {
9 | //回调函数一般第一个参数都是err,因为nodejs遵循错误优先处理机制
10 | if (err) {
11 | return;
12 | }
13 |
14 | //第二个参数fd就是我们打开的文件id标识
15 |
16 | //异步写入文件
17 | fs.write(fd, "蓬松的头发2", (err) => {
18 | if (err) {
19 | return;
20 | }
21 |
22 | //异步关闭文件
23 | fs.close(fd, (err) => {
24 | if (err) {
25 | return;
26 | }
27 | console.log("文件关闭成功");
28 | })
29 | })
30 |
31 | })
32 |
33 | console.log("hello world");
--------------------------------------------------------------------------------
/day07-nodejs07/05.session/router/centerRouter.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const router = new express.Router();
3 | const path = require("path");
4 |
5 |
6 | //权限控制
7 | router.use("/center.html", async (req, res, next) => {
8 | //判断请求有没有携带sessionid
9 | if (!req.session.username) {
10 | //拼接err.ejs的路径
11 | const filePath = path.resolve(__dirname, "../views/err.ejs");
12 | return res.render(filePath, {
13 | errData: "权限不足"
14 | })
15 | }
16 |
17 | next();
18 | })
19 |
20 | router.get("/center.html", (req, res) => {
21 | //响应页面
22 | const filePath = path.resolve(__dirname, "../views/center.html")
23 | res.sendFile(filePath);
24 | })
25 |
26 | module.exports = router;
--------------------------------------------------------------------------------
/day04-node04/04.响应报文.js:
--------------------------------------------------------------------------------
1 | /*
2 | GET响应报文:
3 | //1.响应报文首行(协议名 状态码 状态值)
4 | HTTP/1.1 200 OK
5 | //2.响应报文头
6 | Content-Type: text/plain;charset=utf-8//响应的内容的格式和数据编码
7 | Date: Sat, 05 Jun 2021 02:26:26 GMT//响应的时间
8 | Connection: keep-alive//保持长连接
9 | Keep-Alive: timeout=5//长连接的保持时间
10 | Content-Length: 9//响应内容的字节长度
11 | //3.响应报文空行
12 |
13 | //4.响应报文体
14 | 你真棒
15 |
16 | */
17 |
18 |
19 | /*
20 | POST响应报文:
21 | HTTP/1.1 200 OK
22 | Content-Type: text/plain;charset=utf-8
23 | Date: Sat, 05 Jun 2021 02:30:04 GMT
24 | Connection: keep-alive
25 | Keep-Alive: timeout=5
26 | Content-Length: 9
27 |
28 | 你真棒
29 |
30 |
31 | */
--------------------------------------------------------------------------------
/day05-node05/02.mongoose/01.连接数据库.js:
--------------------------------------------------------------------------------
1 | //引入mongoose模块
2 | const mongoose = require("mongoose");
3 |
4 | /* //连接数据库(回调函数监听)
5 | mongoose.connect("mongodb://127.0.0.1:27017/atguigu", {
6 | //去除警告
7 | useNewUrlParser: true,
8 | useUnifiedTopology: true
9 | }, err => {
10 | if (err) {
11 | console.log(err);
12 | return;
13 | }
14 | console.log("数据库连接成功");
15 | }); */
16 |
17 |
18 | //连接数据库 (open事件监听)
19 | mongoose.connect("mongodb://127.0.0.1:27017/atguigu", {
20 | useNewUrlParser: true,
21 | useUnifiedTopology: true
22 | });
23 | //当数据库连接成功以后 会触发mongoose.connection的open事件
24 | mongoose.connection.once("open", err => {
25 | if (err) {
26 | console.log(err);
27 | return;
28 | }
29 | console.log("数据库连接成功");
30 | })
--------------------------------------------------------------------------------
/day09-ajax/03.jsonp/jQuery跨域.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
13 |
14 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/day01-nodejs01/10.事件轮询练习题4.js:
--------------------------------------------------------------------------------
1 | //1 4 8 5 2 6 3 9
2 | process.nextTick(() => {
3 | console.log(111);
4 | });
5 |
6 | setTimeout(() => {
7 | console.log(222);
8 | }, 0);
9 | setImmediate(() => {
10 | console.log(333);
11 | });
12 |
13 | const promise = Promise.resolve();
14 |
15 | promise
16 | .then(() => {
17 | console.log(444);
18 | process.nextTick(() => {
19 | console.log(555);
20 | });
21 | // queueMicrotask(() => console.log(555));
22 | setTimeout(() => {
23 | console.log(666);
24 | }, 0);
25 | })
26 | .catch(() => {
27 | console.log(777);
28 | })
29 | .then(() => {
30 | console.log(888);
31 | setImmediate(() => {
32 | console.log(999);
33 | });
34 | })
35 | .catch(() => {
36 | console.log(101010);
37 | })
--------------------------------------------------------------------------------
/day07-nodejs07/01.中间件/views/err.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
14 |
15 |
16 |
17 |
18 |
19 | <%- errData %>
20 |
21 | 请重新选择以下的跳转连接
22 |
23 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/day06-nodejs06/02.login/public/err.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
14 |
15 |
16 |
17 |
18 |
19 | <%- errData %>
20 |
21 | 请重新选择以下的跳转连接
22 |
23 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/day06-nodejs06/03.中间件/public/err.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
14 |
15 |
16 |
17 |
18 |
19 | <%- errData %>
20 |
21 | 请重新选择以下的跳转连接
22 |
23 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/day07-nodejs07/05.session/views/err.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
14 |
15 |
16 |
17 |
18 |
19 | <%- errData %>
20 |
21 | 请重新选择以下的跳转连接
22 |
23 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/day10-手写promise/01.promise构造函数.js:
--------------------------------------------------------------------------------
1 | //构造一个myPromise的类
2 |
3 | //exector是默认的回调函数
4 | function myPromise(exector) {
5 | //保存指向实例化对象的this
6 | const _this = this;
7 | //给实例化对象扩展两个属性值 status value
8 | //默认status是pending 默认value是undefined
9 | _this.status = "pending";
10 | _this.value = undefined;
11 |
12 | //封装resolve和reject函数,当promise的回调函数触发的时候传递进去
13 | function resolve(value) {
14 | if (_this.status !== "pending") return;
15 | _this.status = "resolved";
16 | _this.value = value;
17 | }
18 |
19 | function reject(reason) {
20 | if (_this.status !== "pending") return;
21 | _this.status = "rejected";
22 | _this.value = reason;
23 | }
24 |
25 | //当构造函数被实例化的时候 exector需要直接触发
26 | exector(resolve, reject);
27 | }
--------------------------------------------------------------------------------
/day06-nodejs06/02.login/public/login.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 | 登录页面 8号为你服务
13 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/day06-nodejs06/02.login/public/register.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 | 注册页面~
13 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/day06-nodejs06/03.中间件/public/login.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 | 登录页面 8号为你服务
13 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/day07-nodejs07/01.中间件/public/login.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 | 登录页面 8号为你服务
13 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/day04-node04/02.server.js:
--------------------------------------------------------------------------------
1 | const http = require("http");
2 |
3 | //使用http模块创建一个服务 参数是一个回调函数 监听客户端请求(当客用户端请求了这个服务器 则回调函数调用)
4 | const server = http.createServer((request, response) => {
5 | //回调函数有两个参数,一个是请求对象request 一个是响应对象response
6 | console.log("客户端请求");
7 | // console.log(request);
8 | // console.log(response);
9 |
10 | //在响应头上肯定会设置一个属性Content-Type 规定响应的类型和字符编码
11 | //在response对象上有一个setHeader方法 可以设置响应头
12 | response.setHeader("Content-Type", "text/plain;charset=utf-8");
13 |
14 |
15 | // response的end方法就是返回响应,参数就是响应的内容
16 | response.end("你真棒")
17 | })
18 |
19 |
20 | let port = "3000";
21 | let host = '127.0.0.1';
22 | //给当前创建的服务添加端口号和主机地址,第三个参数是个回调函数,当启动服务的时候调用
23 | server.listen(port, host, () => {
24 | console.log("服务器启动,请访问:" + `http://${host}:${port}`);
25 | })
--------------------------------------------------------------------------------
/day07-nodejs07/05.session/public/login.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 | 登录页面 8号为你服务
13 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/day02-nodejs02/晨测.md:
--------------------------------------------------------------------------------
1 | ## 晨测
2 | - 谈一谈定义模块
3 | - 默认情况下模块内部代码对于外部来说都是不可见的,可以通过两种方式向外部暴露变量和函数
4 | - 两种方法暴露
5 | - module.exports
6 | - 默认是一个对象{},是真正暴露的对象,也就是module.exports指向的对象是谁,就暴露谁
7 | - exports
8 | - 是module.exports的一个引用,指向的是module.exports默认对象
9 |
10 | - 谈一谈模块引入和模块标识
11 | - 引入模块 使用require方法
12 | - 模块的标识:
13 | - 就是require中的参数
14 | - 引入模块类型
15 | - 自定义模块
16 | 需要添加路径信息(当前文件夹需要添加./)
17 | 可以省略文件后缀名(按照以下顺序默认添加 1.js 2.json 3.node)
18 | - node内部模块
19 | 直接书写模块名称即可
20 | - 第三方模块(jQuery\vue等)
21 | - 首先需要npm下载,然后再直接书写当前模块名称
22 |
23 | - npm操作
24 | - 初始化包
25 | - 全局下载包
26 | - 本地生产环境下载包
27 | - 开发环境下载包
28 | - 删除包
29 | - 安装package.json中所有的包
--------------------------------------------------------------------------------
/day01-nodejs01/06.宏任务和微任务.js:
--------------------------------------------------------------------------------
1 | /*
2 | 宏任务和微任务:
3 | - 异步代码有优先级关系。有的优先级高先执行,有的优先级低后执行。
4 | - 异步代码分为宏任务(macrotask )和微任务(microtask )
5 | - 宏任务:包括整体代码script,setTimeout,setInterval等等
6 | - 微任务: Promise.then/catch/fanally,process.nextTick,queueMicrotask(nodeJS语义化方法,就是微任务的意思)
7 | - js引擎执行异步代码。会优先执行微任务,再执行宏任务
8 | - 微任务优先级高,优先级最高的是process.nextTick,其他微任务,按代码顺序依次执行
9 | - 宏任务优先级低:顺序看nodejs的事件轮询机制
10 | - 过程如下:
11 | 1. 执行栈 选择最先进入队列的宏任务(一般都是script),执行其同步代码直至结束,在执行同步的时候如果有设置异步代码,会把微任务放入微任务队列,把宏任务交给对应的模块管理
12 | 2. 检查是否存在微任务,有则会执行至微任务队列为空;
13 | 3. 执行宏任务中的异步代码(setTimeout等回调)
14 | 4. 执行过程中如果遇到微任务,就将它添加到微任务的任务队列中
15 | 5. 当前的宏任务执行完毕后,立即执行当前微任务队列中的所有微任务(依次执行)
16 | 6. 开始下一个宏任务(从事件队列中获取)
17 | */
--------------------------------------------------------------------------------
/day03-nodejs03/04.http/01.server1.js:
--------------------------------------------------------------------------------
1 | const http = require("http");
2 |
3 | //使用http模块创建一个服务 参数是一个回调函数 监听客户端请求(当客用户端请求了这个服务器 则回调函数调用)
4 | const server = http.createServer((request, response) => {
5 | //回调函数有两个参数,一个是请求对象request 一个是响应对象response
6 | console.log("客户端请求");
7 | // console.log(request);
8 | // console.log(response);
9 |
10 | //在响应头上肯定会设置一个属性Content-Type 规定响应的类型和字符编码
11 | //在response对象上有一个setHeader方法 可以设置响应头
12 | response.setHeader("Content-Type", "text/plain;charset=utf-8");
13 |
14 |
15 | // response的end方法就是返回响应,参数就是响应的内容
16 | response.end("你真棒")
17 | })
18 |
19 |
20 | let port = "3000";
21 | let host = '127.0.0.1';
22 | //给当前创建的服务添加端口号和主机地址,第三个参数是个回调函数,当启动服务的时候调用
23 | server.listen(port, host, () => {
24 | console.log("服务器启动,请访问:" + `http://${host}:${port}`);
25 | })
--------------------------------------------------------------------------------
/day06-nodejs06/03.中间件/public/register.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 | 注册页面~
13 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/day07-nodejs07/01.中间件/public/register.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 | 注册页面~
13 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/day07-nodejs07/05.session/public/register.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 | 注册页面~
13 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/day04-node04/06.MIME类型/server1.js:
--------------------------------------------------------------------------------
1 | const http = require("http");
2 | const fs = require("fs");
3 | const path = require("path");
4 |
5 | //使用http模块创建一个服务 参数是一个回调函数 监听客户端请求(当客用户端请求了这个服务器 则回调函数调用)
6 | const server = http.createServer((request, response) => {
7 | console.log("客户端请求");
8 |
9 | //获取请求文件的地址
10 | const filePath = path.resolve(__dirname, "01.mp4");
11 | //给当前的文件创建一个可读流
12 | const rs = fs.createReadStream(filePath);
13 |
14 | response.setHeader("Content-Type", "video/mp4;charset=utf-8");
15 |
16 |
17 | //response本身也是一个可写流,所以可以直接把可读流写到response中
18 | rs.pipe(response);
19 | })
20 |
21 |
22 | let port = "3000";
23 | let host = '127.0.0.1';
24 | //给当前创建的服务添加端口号和主机地址,第三个参数是个回调函数,当启动服务的时候调用
25 | server.listen(port, host, () => {
26 | console.log("服务器启动,请访问:" + `http://${host}:${port}`);
27 | })
--------------------------------------------------------------------------------
/day04-node04/06.MIME类型/server3.js:
--------------------------------------------------------------------------------
1 | const http = require("http");
2 | const fs = require("fs");
3 | const path = require("path");
4 |
5 | //使用http模块创建一个服务 参数是一个回调函数 监听客户端请求(当客用户端请求了这个服务器 则回调函数调用)
6 | const server = http.createServer((request, response) => {
7 | console.log("客户端请求");
8 |
9 | //获取请求文件的地址
10 | const filePath = path.resolve(__dirname, "jj.jpg");
11 | //给当前的文件创建一个可读流
12 | const rs = fs.createReadStream(filePath);
13 |
14 | response.setHeader("Content-Type", "image/jpg;charset=utf-8");
15 |
16 |
17 | //response本身也是一个可写流,所以可以直接把可读流写到response中
18 | rs.pipe(response);
19 | })
20 |
21 |
22 | let port = "3000";
23 | let host = 'localhost';
24 | //给当前创建的服务添加端口号和主机地址,第三个参数是个回调函数,当启动服务的时候调用
25 | server.listen(port, host, () => {
26 | console.log("服务器启动,请访问:" + `http://${host}:${port}`);
27 | })
--------------------------------------------------------------------------------
/day04-node04/06.MIME类型/server2.js:
--------------------------------------------------------------------------------
1 | const http = require("http");
2 | const fs = require("fs");
3 | const path = require("path");
4 |
5 | //使用http模块创建一个服务 参数是一个回调函数 监听客户端请求(当客用户端请求了这个服务器 则回调函数调用)
6 | const server = http.createServer((request, response) => {
7 | console.log("客户端请求");
8 |
9 | //获取请求文件的地址
10 | const filePath = path.resolve(__dirname, "index.html");
11 | //给当前的文件创建一个可读流
12 | const rs = fs.createReadStream(filePath);
13 |
14 | response.setHeader("Content-Type", "text/html;charset=utf-8");
15 |
16 |
17 | //response本身也是一个可写流,所以可以直接把可读流写到response中
18 | rs.pipe(response);
19 | })
20 |
21 |
22 | let port = "3000";
23 | let host = '192.168.17.28';
24 | //给当前创建的服务添加端口号和主机地址,第三个参数是个回调函数,当启动服务的时候调用
25 | server.listen(port, host, () => {
26 | console.log("服务器启动,请访问:" + `http://${host}:${port}`);
27 | })
--------------------------------------------------------------------------------
/day13-axios/server.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const app = express();
3 |
4 | app.get("/login", (req, res) => {
5 | res.set("Access-Control-Allow-Origin", "*");
6 | setTimeout(() => {
7 | console.log(req.query);
8 | if (req.query.name === "laowang" && req.query.pass === "123") {
9 | return res.json({
10 | code: 10000,
11 | mes: "登录成功",
12 | data: {
13 | name: "laowang"
14 | }
15 | })
16 | }
17 |
18 | res.json({
19 | code: 10001,
20 | mes: "登录失败"
21 | })
22 | }, 5000)
23 | })
24 |
25 | app.listen("3000", (err) => {
26 | if (err) {
27 | console.log(err);
28 | return;
29 | }
30 | console.log("http://127.0.0.1:3000");
31 | })
--------------------------------------------------------------------------------
/day02-nodejs02/08.模块引入练习/02.引入第三方模块.js:
--------------------------------------------------------------------------------
1 | /* const {
2 | JSDOM
3 | } = require("jsdom");
4 | const {
5 | window
6 | } = new JSDOM("");
7 | const $ = require("jquery")(window);
8 |
9 | const arr = [1, 2, 3, 4];
10 |
11 | $.each(arr, (index, item) => {
12 | console.log(item);
13 | }) */
14 |
15 |
16 | /* const download = require("download-git-repo");
17 | download("github:nowLetsgo/6-1happy", "./test", err => {
18 | console.log(err ? "error" : "success");
19 | }) */
20 |
21 |
22 | //如果需要等待图形展示 需要下载ora的包
23 | //cnpm i ora -s
24 | const download = require("download-git-repo");
25 | const ora = require("ora");
26 | const process = ora("下载。。。项目");
27 | process.start();
28 | download("github:nowLetsgo/6-1happy", "./test", err => {
29 | if (err) {
30 | process.fail()
31 | } else {
32 | process.succeed();
33 | }
34 | })
--------------------------------------------------------------------------------
/day07-nodejs07/01.中间件/router/isEmptyRouter.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 |
3 | const router = new express.Router();
4 |
5 | const path = require("path");
6 |
7 | const isEmptyRouterFn = (req, res, next) => {
8 | //查看用户输入内容 拿到用户名和密码
9 | const {
10 | username,
11 | password
12 | } = req.query;
13 |
14 | //查看用户的账号和密码是否为空
15 | if (!username || !password) {
16 | //拼接err.ejs的路径
17 | const filePath = path.resolve(__dirname, "../views/err.ejs");
18 | return res.render(filePath, {
19 | errData: "账号或者密码不能为空"
20 | })
21 | }
22 |
23 | //当处理完成需要继续向下走的话 需要调用next方法
24 | next();
25 | }
26 |
27 | //处理账号和密码是否为空的中间件
28 | router.use("/login", isEmptyRouterFn)
29 |
30 | //处理账号和密码是否为空的中间件
31 | router.use("/register", isEmptyRouterFn)
32 |
33 | module.exports = router;
--------------------------------------------------------------------------------
/day02-nodejs02/11.process/01.process.js:
--------------------------------------------------------------------------------
1 | /*
2 | process.argv():
3 | 查看node启动时 传递的命令行参数
4 | 是一个数组:
5 | - 第一个值是node命令的位置
6 | - 第二个是当前文件的位置路径
7 | - 后边的参数 是用户启动时传递的传递的
8 |
9 | process.argv0
10 | 获取node路径
11 |
12 | process.cwd();
13 | node的工作目录(也就是node在哪一个路径启动) 而不是当前文件的目录
14 |
15 | */
16 | // console.log(process.argv);
17 | // console.log(process.argv0);
18 |
19 | console.log(process.cwd())
20 |
21 |
22 | const proArr = process.argv;
23 |
24 | if (proArr[2] === "start") {
25 | console.log("开启启动服务");
26 | } else if (proArr[2] === "end") {
27 | console.log("关闭服务");
28 | } else {
29 | console.log("请重新传递命令");
30 | }
31 |
32 |
33 | let i = 0;
34 | setInterval(() => {
35 | console.log(i++);
36 | if (i > 4) {
37 | process.exit("");
38 | }
39 | }, 1000)
--------------------------------------------------------------------------------
/day07-nodejs07/05.session/router/isEmptyRouter.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 |
3 | const router = new express.Router();
4 |
5 | const path = require("path");
6 |
7 | const isEmptyRouterFn = (req, res, next) => {
8 | //查看用户输入内容 拿到用户名和密码
9 | const {
10 | username,
11 | password
12 | } = req.query;
13 |
14 | //查看用户的账号和密码是否为空
15 | if (!username || !password) {
16 | //拼接err.ejs的路径
17 | const filePath = path.resolve(__dirname, "../views/err.ejs");
18 | return res.render(filePath, {
19 | errData: "账号或者密码不能为空"
20 | })
21 | }
22 |
23 | //当处理完成需要继续向下走的话 需要调用next方法
24 | next();
25 | }
26 |
27 | //处理账号和密码是否为空的中间件
28 | router.use("/login", isEmptyRouterFn)
29 |
30 | //处理账号和密码是否为空的中间件
31 | router.use("/register", isEmptyRouterFn)
32 |
33 | module.exports = router;
--------------------------------------------------------------------------------
/day06-nodejs06/01.express复习.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 |
3 | //创建一个application对象
4 | const app = express();
5 |
6 | app.get("/:id", (req, res) => {
7 | //params接受url地址的路径参数
8 | console.log(req.params);
9 | res.send(":id")
10 | })
11 |
12 | app.get("/", (req, res) => {
13 | console.log("根目录访问");
14 |
15 |
16 | // res.end("你好 世界")
17 | // res.send("你好 世界")
18 | // res.download()
19 | // res.sendFile()
20 | // res.json();
21 | // res.redirect();
22 |
23 |
24 | console.log(req.url);
25 | console.log(req.query);
26 |
27 | res.send("你好 世界")
28 | })
29 |
30 |
31 |
32 |
33 |
34 | //监听端口和启动服务
35 | let port = "3002";
36 | app.listen(port, err => {
37 | if (err) {
38 | console.log(err);
39 | return;
40 | }
41 |
42 | console.log("服务器启动,请访问" + ` http://127.0.0.1:${port}`);
43 | })
--------------------------------------------------------------------------------
/day07-nodejs07/01.中间件/router/regRouter.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 |
3 | const router = new express.Router();
4 |
5 | const path = require("path");
6 |
7 | const regRouterFn = (req, res, next) => {
8 | //查看用户输入内容 拿到用户名和密码
9 | const {
10 | username,
11 | password
12 | } = req.query;
13 |
14 | const userReg = /^[0-9a-zA-Z_]{6,15}$/;
15 | const passReg = /^[0-9a-zA-Z_]{1,15}$/;
16 | if (!userReg.test(username) || !passReg.test(password)) {
17 | //拼接err.ejs的路径
18 | const filePath = path.resolve(__dirname, "../views/err.ejs");
19 | return res.render(filePath, {
20 | errData: "账号和密码格式不对"
21 | })
22 | }
23 |
24 | next();
25 |
26 | }
27 | //处理账号和密码的正则校验
28 | router.use("/login", regRouterFn)
29 | router.use("/register", regRouterFn)
30 |
31 |
32 | module.exports = router;
--------------------------------------------------------------------------------
/day07-nodejs07/05.session/router/regRouter.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 |
3 | const router = new express.Router();
4 |
5 | const path = require("path");
6 |
7 | const regRouterFn = (req, res, next) => {
8 | //查看用户输入内容 拿到用户名和密码
9 | const {
10 | username,
11 | password
12 | } = req.query;
13 |
14 | const userReg = /^[0-9a-zA-Z_]{6,15}$/;
15 | const passReg = /^[0-9a-zA-Z_]{1,15}$/;
16 | if (!userReg.test(username) || !passReg.test(password)) {
17 | //拼接err.ejs的路径
18 | const filePath = path.resolve(__dirname, "../views/err.ejs");
19 | return res.render(filePath, {
20 | errData: "账号和密码格式不对"
21 | })
22 | }
23 |
24 | next();
25 |
26 | }
27 | //处理账号和密码的正则校验
28 | router.use("/login", regRouterFn)
29 | router.use("/register", regRouterFn)
30 |
31 |
32 | module.exports = router;
--------------------------------------------------------------------------------
/day09-ajax/04.cors/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
13 |
14 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/day09-ajax/03.jsonp/server.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const app = express();
3 |
4 |
5 |
6 | app.get("/login", (req, res) => {
7 | const {
8 | user,
9 | pass,
10 | callback
11 | } = req.query;
12 | console.log(req.query);
13 |
14 | if (user === "laoli" && pass === "123") {
15 | const data = {
16 | mes: "ok",
17 | code: 1
18 | }
19 | res.set("content-type", "application/javascript;charset=utf-8");
20 | return res.send(`${callback}(${JSON.stringify(data)})`);
21 |
22 | }
23 |
24 |
25 | const err = {
26 | mes: "no ok",
27 | code: 0
28 | }
29 | return res.send(err);
30 | })
31 |
32 | app.listen("3000", (err) => {
33 | if (err) {
34 | console.log(err);
35 | return;
36 | }
37 | console.log("http://127.0.0.1:3000");
38 | })
--------------------------------------------------------------------------------
/day08-node08/晨测.md:
--------------------------------------------------------------------------------
1 | ## 晨测
2 | - 谈一谈 强制缓存
3 | - 强制缓存就是向浏览器缓存查找该请求结果,并根据该结果的缓存规则来决定是否使用该缓存结果的过程。
4 | - 简单来讲就是强制浏览器使用当前缓存
5 | - 首先请求头需要携带"Cache-Control"的信息为"max-age = 时间":客户端允许开启强制缓存
6 | - 响应头需要携带"Cache-Control"的信息为"max-age = 时间":服务端也允许开启强制缓存
7 |
8 | - 谈一谈 协商缓存
9 | 1. 客户端向服务端发送一个请求,请求相应的资源
10 | 2. 服务端向客户端发送一个响应,在响应头中携带两个关于缓存的信息,分别是 当前文件的唯一标识(eTag)和 当前文件的最后一次修改时间(last-modified)
11 | 3. 客户端收到了响应文件和关于文件的缓存信息,并把缓存信息保存在客户端,但是更换了名称,把eTag更名为if-none-match,把last-modified更名为if-modified-since。
12 |
13 | 4. 客户端第二次请求服务端,请求相应的资源,会在请求头上携带两个字段,就是之前已经请求过的文件的缓存信息 if-none-match和if-modified-since
14 | 5. 服务端接收到了客户端的if-none-match和if-modified-since,然后会重新获取被请求文件的eTag和last-modified,然后开始比较,如果两个都比较成功,则读取缓存,否则返回新的响应
15 |
16 | 6.如果走缓存,则服务端的响应状态码是304,并且不需要设置任何的响应内容
17 | 7.如果走缓存,则客户端接收到的状态码是304,并直接去读取缓存
18 |
19 | 8.如果不走缓存,则响应状态码是200,并且响应最新的数据,还要携带最新的eTag和last-modified
20 |
21 | - 手写原生ajax的post请求
--------------------------------------------------------------------------------
/day08-node08/01.强制缓存/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
13 |
14 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/day02-nodejs02/07.nodeJS模块化/add.js:
--------------------------------------------------------------------------------
1 | function add(...rest) {
2 | return rest.reduce((p, i) => {
3 | return p + i
4 | })
5 | }
6 |
7 |
8 | /*
9 | - 默认情况下模块内部代码对于外部来说都是不可见的,可以通过两种方式向外部暴露变量和函数
10 | - 两种方法暴露
11 | - module.exports
12 | - 默认是一个对象{},是真正暴露的对象,也就是module.exports指向的对象是谁,就暴露谁
13 | - exports
14 | - 是module.exports的一个引用,指向的是module.exports默认对象
15 |
16 |
17 | */
18 | //1.暴露出去的是一个对象 对象里有一个add方法
19 | //将来引入这个模块的的时候,接收的是一个对象,对象中有add
20 | //可以暴露多个方法或属性
21 | module.exports.add = add;
22 | //一次暴露多个
23 | /* module.exports = {
24 | add1,
25 | add2,
26 | } */
27 |
28 | //2.把默认module.exports指向的对象 直接更换为了add方法,所以暴露的直接是add方法
29 | //将来引入的模块的时候,接受的直接是add方法
30 | //只能暴露一个方法
31 | // module.exports = add;
32 |
33 |
34 | //3.相当于给module.exports默认的对象添加了一个方法 也可以暴露出去
35 | // exports.add = add;
36 |
37 | //4.不能成功暴露,因为我们修改了exports地址,不再指向module.exports,所以并没有给module.exports添加方法
38 | // exports = add;
--------------------------------------------------------------------------------
/day01-nodejs01/05.nodeJS事件轮询.js:
--------------------------------------------------------------------------------
1 | /*
2 | NodeJS的事件轮询
3 | - JS是单线程的, nodejs是做到非阻塞是因为在nodejs内部使用了第三方库libuv,nodejs会把IO,文件读取等异步操作交由他处理,而nodejs主线程可以继续去处理其他的事情。
4 | - libuv会开启不同的线程去处理这些延时操作,处理完后,会把异步操作的回调函数放到nodejs的轮询队列中,nodejs会在适当的时候处理轮询队列中的回调函数,从而实现非阻塞。
5 | - node的事件轮询分为六个阶段,每个阶段都有一个 FIFO(先进先出) 队列来执行回调,事件轮询会依次进入每一个回调队列,当该队列已用尽或达到回调限制,事件循环将移动到下一阶段。
6 | - 六个阶段
7 | 1. timers:用来处理setTimeout() 和 setInterval() 的回调函数
8 | 2. pending callbacks阶段:这个阶段用来处理系统操作的回调函数(可以忽略)
9 | 3. idle prepare阶段:此阶段是仅供nodejs内部操作调用,忽略
10 | 4. poll阶段:这个阶段主要用来处理如IO操作,网络请求等异步操作
11 | - 当poll阶段的回调函数队列不为空的时候,则处理队列中的回调函数,直到队列为空或者达到上限的时候,就跳过此阶段,处理下一阶段。
12 | - 当poll阶段的回调函数队列为空的时候,系统会在此阶段等待新的回调函数入队,再进行处理,但是如果timers阶段有回调函数需要执行,或者check阶段有setImmediate需要执行,则会立马进入下一个阶段
13 | 5. check阶段:这个阶段用来处理setImmediate的回调函数
14 | 6. close callbacks阶段:这个阶段用来处理如socket的close事件
15 |
16 |
17 |
18 | */
--------------------------------------------------------------------------------
/day05-node05/02.mongoose/02.Schema.js:
--------------------------------------------------------------------------------
1 | //1.引入mongoose模块
2 | const mongoose = require("mongoose");
3 |
4 |
5 | //2.连接数据库 (open事件监听)
6 | mongoose.connect("mongodb://127.0.0.1:27017/atguigu", {
7 | useNewUrlParser: true,
8 | useUnifiedTopology: true
9 | });
10 | //当数据库连接成功以后 会触发mongoose.connection的open事件
11 | mongoose.connection.once("open", err => {
12 | if (err) {
13 | console.log(err);
14 | return;
15 | }
16 | console.log("数据库连接成功");
17 | })
18 |
19 | // 3. 创建Schema对象, 方便未来对某个集合的值进行约束
20 | const teacherSchema = new mongoose.Schema({
21 | name: {
22 | type: String,
23 | unique: true, //唯一存在(以后不能有name的重名)
24 | required: true //必填项
25 | },
26 | age: Number,
27 | sex: String,
28 | // hobby:Array,//限制值必须是一个数组
29 | hobby: [String], //限制值必须是一个数组 并且数组的值必须是字符串
30 | createTime: {
31 | type: Date,
32 | default: Date.now
33 | }
34 | });
35 |
36 | // console.log(teacherSchema);
--------------------------------------------------------------------------------
/day02-nodejs02/07.nodeJS模块化/index.js:
--------------------------------------------------------------------------------
1 | //一般所有的模块都有一个入口文件,我们常用 index.js 或者main.js表示
2 |
3 | //引入模块 使用require方法
4 | // require()
5 |
6 |
7 |
8 |
9 |
10 | /*
11 | 模块的标识:
12 | - 就是require中的参数
13 | - 引入模块类型
14 | - 自定义模块
15 | 需要添加路径信息(当前文件夹需要添加./)
16 | 可以省略文件后缀名(按照以下顺序默认添加 1.js 2.json 3.node)
17 | - node内部模块
18 | 直接书写模块名称即可
19 | - 第三方模块(jQuery\vue等)
20 | - 首先需要npm下载,然后再直接书写当前模块名称
21 |
22 | require("./add.js")
23 | require("fs")
24 | require("jquery");
25 | */
26 |
27 |
28 |
29 | //开始引入模块
30 | //1.当暴露的方法在对象中的时候,接受的是一个对象
31 | /* const o = require("./add");
32 | console.log(o);
33 | */
34 |
35 |
36 | //2.当暴露的方法在对象中,可以使用解构赋值,拿出这个方法
37 | /* const {
38 | add
39 | } = require("./add");
40 |
41 | console.log(add(1, 2, 3, 4))
42 |
43 |
44 | const {
45 | sub
46 | } = require("./sub");
47 | sub(4, 1); */
48 |
49 |
50 | //3.直接暴露的是一个方法,直接接受即可
51 | const sub = require("./sub");
52 | sub(1, 4)
--------------------------------------------------------------------------------
/day09-ajax/05.module/01.commonjs/build.js:
--------------------------------------------------------------------------------
1 | (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i {
13 | //查看用户输入内容 拿到用户名和密码
14 | const {
15 | username,
16 | password
17 | } = req.query;
18 |
19 |
20 | //判断当前的用户名是否被注册
21 | //去数据库查询当前的用户名
22 | const isHasUser = await userModel.findOne({
23 | username
24 | })
25 |
26 | if (isHasUser) {
27 | //拼接err.ejs的路径
28 | const filePath = path.resolve(__dirname, "../views/err.ejs");
29 | return res.render(filePath, {
30 | errData: "用户名已经被注册"
31 | })
32 | };
33 |
34 |
35 | //向数据库写入当前用户信息
36 | const registerData = await userModel.create({
37 | username,
38 | password
39 | });
40 |
41 | console.log(registerData)
42 | // res.send("注册成功");
43 | //如果注册成功则直接重定向到登录页面
44 | res.redirect("/login.html")
45 |
46 | })
47 |
48 | module.exports = router;
--------------------------------------------------------------------------------
/day07-nodejs07/05.session/router/registerRouter.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 |
3 | const router = new express.Router();
4 |
5 | const path = require("path")
6 |
7 | //引入mongoose的当前用户信息集合
8 | const userModel = require("../model/userModel");
9 |
10 |
11 | //注册接口
12 | router.get("/register", async (req, res) => {
13 | //查看用户输入内容 拿到用户名和密码
14 | const {
15 | username,
16 | password
17 | } = req.query;
18 |
19 |
20 | //判断当前的用户名是否被注册
21 | //去数据库查询当前的用户名
22 | const isHasUser = await userModel.findOne({
23 | username
24 | })
25 |
26 | if (isHasUser) {
27 | //拼接err.ejs的路径
28 | const filePath = path.resolve(__dirname, "../views/err.ejs");
29 | return res.render(filePath, {
30 | errData: "用户名已经被注册"
31 | })
32 | };
33 |
34 |
35 | //向数据库写入当前用户信息
36 | const registerData = await userModel.create({
37 | username,
38 | password
39 | });
40 |
41 | console.log(registerData)
42 | // res.send("注册成功");
43 | //如果注册成功则直接重定向到登录页面
44 | res.redirect("/login.html")
45 |
46 | })
47 |
48 | module.exports = router;
--------------------------------------------------------------------------------
/day12-webpack/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "webpack-test",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "webpack-dev-server --config ./config/webpack.config.dev.js",
8 | "build": "webpack --config ./config/webpack.config.prod.js"
9 | },
10 | "keywords": [],
11 | "author": "",
12 | "license": "ISC",
13 | "devDependencies": {
14 | "@babel/core": "^7.14.6",
15 | "@babel/preset-env": "^7.14.5",
16 | "babel-loader": "^8.2.2",
17 | "css-loader": "^5.2.6",
18 | "css-minimizer-webpack-plugin": "^3.0.1",
19 | "eslint": "^7.28.0",
20 | "file-loader": "^6.2.0",
21 | "html-loader": "^1.3.2",
22 | "html-webpack-plugin": "^5.3.1",
23 | "less": "^4.1.1",
24 | "less-loader": "^10.0.0",
25 | "mini-css-extract-plugin": "^1.6.0",
26 | "postcss": "^8.3.5",
27 | "postcss-loader": "^6.1.0",
28 | "postcss-preset-env": "^6.7.0",
29 | "style-loader": "^2.0.0",
30 | "url-loader": "^3.0.0",
31 | "webpack": "^5.39.0",
32 | "webpack-cli": "^3.3.12",
33 | "webpack-dev-server": "^3.11.2"
34 | },
35 | "dependencies": {}
36 | }
37 |
--------------------------------------------------------------------------------
/day08-node08/04.ajax/server.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const app = express();
3 | const path = require("path");
4 |
5 | //body-parser中间件是处理post请求数据的
6 | const bodyParser = require("body-parser");
7 | //如果post请求发送的数据是json字符串格式,则使用下边处理
8 | app.use(bodyParser.json());
9 | //如果post请求发送的数据是form表单格式,则使用下边处理
10 | app.use(bodyParser.urlencoded({
11 | extended: false
12 | }));
13 |
14 | app.get("/", (req, res) => {
15 | const filePath = path.resolve(__dirname, "./index.html");
16 | res.sendFile(filePath)
17 | })
18 |
19 | app.post("/login", (req, res) => {
20 | const {
21 | user,
22 | pass
23 | } = req.body;
24 | console.log(req.body);
25 |
26 | if (user === "laoli" && pass === "123") {
27 | const data = {
28 | mes: "ok",
29 | code: 1
30 | }
31 | return res.json(data);
32 | }
33 |
34 |
35 | const err = {
36 | mes: "no ok",
37 | code: 0
38 | }
39 | return res.json(err);
40 | })
41 |
42 | app.listen("3000", (err) => {
43 | if (err) {
44 | console.log(err);
45 | return;
46 | }
47 | console.log("http://127.0.0.1:3000");
48 | })
--------------------------------------------------------------------------------
/day09-ajax/05.module/02.ES6/js/index.js:
--------------------------------------------------------------------------------
1 | //引入的路径需要使用commonjs规范
2 |
3 |
4 | //当引入的模块是默认暴露的时候
5 | import add from "./add";
6 | //当引入的模块是统一暴露或者分别暴露的时候 必须使用解构赋值的方法接受
7 | import {
8 | hello,
9 | mins,
10 | name
11 | } from "./mins"
12 |
13 | import {
14 | //当重名的时候给某个变量起一个别名
15 | name as name1,
16 | age,
17 | sex,
18 | say
19 | } from "./person";
20 |
21 | //无法直接接受暴露的对象,一般使用解构赋值
22 | // import person from "./person";
23 |
24 | //如果一定想要一个对象保存所有的暴露值
25 | // import * as person from "./person"
26 |
27 | console.log("111111", person);
28 |
29 | console.log(name);
30 | hello();
31 | add(1, 2);
32 |
33 |
34 |
35 | /*
36 | 浏览器不支持ES6模块化:
37 | 1.使用babel把某个文件夹内容的文件 编译成一个新的文件夹
38 | 编译成为了commonJS规范
39 | - 本地安装babel:npm install --save-dev @babel/core @babel/cli @babel/preset-env
40 | - 配置package.json
41 | "babel": {
42 | "presets": [
43 | "@babel/env"
44 | ]
45 | }
46 | - npx(当命令没有安装到全局的时候,启动本地命令)
47 | - npx babel js -d build
48 |
49 | 2.使用browserify把刚编译好的commonjs规范的入口文件编译成浏览器可识别的文件
50 |
51 | */
--------------------------------------------------------------------------------
/day09-ajax/05.module/02.ES6/build/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | var _add = _interopRequireDefault(require("./add"));
4 |
5 | var _mins = require("./mins");
6 |
7 | var _person = require("./person");
8 |
9 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
10 |
11 | //引入的路径需要使用commonjs规范
12 | //当引入的模块是默认暴露的时候
13 | //当引入的模块是统一暴露或者分别暴露的时候 必须使用解构赋值的方法接受
14 | //无法直接接受暴露的对象,一般使用解构赋值
15 | // import person from "./person";
16 | //如果一定想要一个对象保存所有的暴露值
17 | // import * as person from "./person"
18 | console.log("111111", person);
19 | console.log(_mins.name);
20 | (0, _mins.hello)();
21 | (0, _add["default"])(1, 2);
22 | /*
23 | 浏览器不支持ES6模块化:
24 | 1.使用babel把某个文件夹内容的文件 编译成一个新的文件夹
25 | 编译成为了commonJS规范
26 | - 本地安装babel:npm install --save-dev @babel/core @babel/cli @babel/preset-env
27 | - 配置package.json
28 | "babel": {
29 | "presets": [
30 | "@babel/env"
31 | ]
32 | }
33 | - npx(当命令没有安装到全局的时候,启动本地命令)
34 | - npx babel js -d build
35 |
36 | 2.使用browserify把刚编译好的commonjs规范的入口文件编译成浏览器可识别的文件
37 |
38 | */
--------------------------------------------------------------------------------
/day03-nodejs03/03.fs/03.异步写入解决回调地狱.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const path = require("path");
3 |
4 | //得到文件路径
5 | const filePath = path.resolve(__dirname, "text.txt");
6 |
7 |
8 | (async () => {
9 | const fd = await new Promise((resolve, reject) => {
10 | fs.open(filePath, "a", (err, fd) => {
11 | //错误处理 调用reject
12 | if (err) {
13 | reject(err);
14 | return;
15 | }
16 |
17 | resolve(fd);
18 | })
19 | });
20 | await new Promise((resolve, reject) => {
21 | fs.write(fd, "牵着你的手", (err) => {
22 | if (err) {
23 | reject(err);
24 | return;
25 | }
26 |
27 | resolve();
28 | })
29 | });
30 | const re = await new Promise((resolve, reject) => {
31 | fs.close(fd, (err) => {
32 | if (err) {
33 | reject(err);
34 | return;
35 | }
36 |
37 | resolve("全部完成")
38 | })
39 | });
40 |
41 | return re;
42 | })()
43 | .then((data) => {
44 | console.log(data);
45 | })
46 | .catch((err) => {
47 | console.log(err);
48 | })
--------------------------------------------------------------------------------
/day08-node08/01.强制缓存/server.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 |
3 | const {
4 | exec
5 | } = require("child_process")
6 |
7 | const path = require("path");
8 |
9 | const fs = require("fs");
10 |
11 | const app = express();
12 |
13 | app.get("/", (req, res) => {
14 | const filePath = path.resolve(__dirname, "./index.html");
15 | /* const rs = fs.createReadStream(filePath);
16 | rs.pipe(res); */
17 |
18 | res.sendFile(filePath)
19 | })
20 |
21 | /*
22 | 强制缓存:
23 | - 强制缓存就是向浏览器缓存查找该请求结果,并根据该结果的缓存规则来决定是否使用该缓存结果的过程。
24 | - 简单来讲就是强制浏览器使用当前缓存
25 | - 首先请求头需要携带"Cache-Control"的信息为"max-age = 时间":客户端允许开启强制缓存
26 | - 响应头需要携带"Cache-Control"的信息为"max-age = 时间":服务端也允许开启强制缓存
27 |
28 |
29 | */
30 | app.get("/img", (req, res) => {
31 | const filePath = path.resolve(__dirname, "./lijing.jpg");
32 | const rs = fs.createReadStream(filePath);
33 | //设置强制缓存
34 | res.set("Cache-Control", "max-age=10000")
35 | rs.pipe(res);
36 | })
37 |
38 |
39 |
40 |
41 | app.listen("3000", (err) => {
42 | if (err) {
43 | console.log(err);
44 | return;
45 | }
46 | console.log("服务已经启动 http://127.0.0.1:3000");
47 | // exec("start http://127.0.0.1:3000")
48 | })
--------------------------------------------------------------------------------
/day02-nodejs02/03.面试题3.js:
--------------------------------------------------------------------------------
1 | //1 2 3 4
2 | /* Promise.resolve().then(() => {
3 | console.log(1);
4 | process.nextTick(() => {
5 | console.log(2);
6 | })
7 | })
8 | Promise.resolve().then(function () {
9 | setTimeout(() => {
10 | new Promise(function (resolve, reject) {
11 | console.log(3);
12 | reject();
13 | }).catch(function () {
14 | console.log(4);
15 | });
16 | })
17 | }); */
18 |
19 |
20 | //1 3 2 4
21 | /* Promise.resolve().then(() => {
22 | console.log(1);
23 | queueMicrotask(() => {
24 | console.log(2);
25 | })
26 | })
27 |
28 | Promise.resolve().then(function () {
29 | new Promise(function (resolve, reject) {
30 | console.log(3);
31 | reject();
32 | }).catch(function () {
33 | console.log(4);
34 | });
35 | }); */
36 |
37 |
38 | // 1 3 4 2
39 | /* Promise.resolve().then(() => {
40 | console.log(1);
41 | process.nextTick(() => {
42 | console.log(2);
43 | })
44 | })
45 | Promise.resolve().then(function () {
46 | new Promise(function (resolve, reject) {
47 | console.log(3);
48 | reject();
49 | }).catch(function () {
50 | console.log(4);
51 | });
52 | }); */
--------------------------------------------------------------------------------
/day07-nodejs07/01.中间件/server.js:
--------------------------------------------------------------------------------
1 | //引入express
2 | const express = require("express");
3 |
4 | //创建一个express的application对象
5 | const app = express();
6 |
7 | //连接数据库
8 | require("./db")
9 |
10 | //引入ejs
11 | const ejs = require("ejs");
12 | //通知express使用ejs模板引擎
13 | app.set("view engine", "ejs");
14 | app.set("views", "views");
15 |
16 | //路由管理模块引入
17 | const isEmptyRouter = require("./router/isEmptyRouter");
18 | const regRouter = require("./router/regRouter");
19 | const registerRouter = require("./router/registerRouter");
20 | const loginRouter = require("./router/loginRouter");
21 | const centerRouter = require("./router/centerRouter");
22 |
23 |
24 |
25 | //官方的静态资源中间件
26 | app.use(express.static("./public"));
27 | app.use(express.static("./static"));
28 |
29 | //处理req请求携带的数据的中间件,把req的数据放在了req.body的属性上了
30 | app.use(express.urlencoded({
31 | extended: true
32 | }))
33 |
34 |
35 | //把所有的引入的路由管理挂载在app上
36 | app.use(isEmptyRouter)
37 | app.use(regRouter)
38 | app.use(registerRouter)
39 | app.use(loginRouter)
40 | app.use(centerRouter)
41 |
42 | //监听端口号和服务器状态
43 | let port = "3002";
44 | app.listen(port, err => {
45 | if (err) {
46 | console.log(err);
47 | return;
48 | }
49 |
50 | console.log("服务器启动,请访问" + ` http://127.0.0.1:${port}`);
51 | })
--------------------------------------------------------------------------------
/day09-ajax/04.cors/server.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const app = express();
3 |
4 |
5 |
6 | app.get("/login", (req, res) => {
7 | const {
8 | user,
9 | pass
10 | } = req.query;
11 | console.log(req.query);
12 | //获取请求的host+port
13 | console.log(req.headers.referer);
14 | //允许跨域的地址
15 | const arr = ["http://127.0.0.1:3320/", "http://127.0.0.1:3520/", "http://127.0.0.1:5500/", "http://127.0.0.1:8320/"]
16 |
17 | if (arr.includes(req.headers.referer)) {
18 | res.set("Access-Control-Allow-Origin", req.headers.referer.slice(0, -1))
19 | }
20 | //允许某一个地址进行跨域
21 | // res.set("Access-Control-Allow-Origin", "http://127.0.0.1:5500")
22 | //允许所有地址进行跨域
23 | // res.set("Access-Control-Allow-Origin", "*")
24 | if (user === "laoli" && pass === "123") {
25 | const data = {
26 | mes: "ok",
27 | code: 1
28 | }
29 | return res.send(data);
30 | }
31 |
32 |
33 | const err = {
34 | mes: "no ok",
35 | code: 0
36 | }
37 | return res.send(err);
38 | })
39 |
40 | app.listen("3000", (err) => {
41 | if (err) {
42 | console.log(err);
43 | return;
44 | }
45 | console.log("http://127.0.0.1:3000");
46 | })
--------------------------------------------------------------------------------
/day03-nodejs03/03.fs/10.promisify.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const path = require("path");
3 |
4 | // const filePath = path.resolve(__dirname, "text.txt");
5 | const filePath = path.resolve(__dirname, "01.mp4");
6 |
7 | //简单读取文件(一次性读取)
8 | /* fs.readFile(filePath, (err, re) => {
9 | if (err) {
10 | return;
11 | }
12 | console.log(re);
13 | // console.log(re.toString());
14 | }) */
15 |
16 |
17 |
18 | /*
19 | function readFile(){
20 | return new Promise((resolve, reject) => {
21 | fs.readFile(filePath, (err, re) => {
22 | if (err) {
23 | reject(err);
24 | return;
25 | }
26 | resolve(re);
27 | // console.log(re.toString());
28 | })
29 | })
30 | }
31 |
32 | readFile().then((data) => {
33 | console.log(data);
34 | }).catch((err) => {
35 | console.log(err);
36 | }) */
37 |
38 |
39 | // 使用promisify
40 | const {
41 | promisify
42 | } = require("util");
43 |
44 | //promisify是把一个异步方法处理 返回一个函数,并且这个函数已经使用promise进行封装了,如果异步成功则返回成功的promise对象,否则返回失败的promise对象
45 | const readFile = promisify(fs.readFile);
46 | console.log(readFile);
47 | readFile(filePath).then((data) => {
48 | console.log(data);
49 | }).catch((err) => {
50 | console.log(err);
51 | })
--------------------------------------------------------------------------------
/day09-ajax/03.jsonp/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
13 |
38 |
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/day06-nodejs06/03.ejs模板引擎/server.js:
--------------------------------------------------------------------------------
1 | //引入express
2 | const express = require("express");
3 |
4 | //引入path
5 | const path = require("path");
6 |
7 | //创建一个express的application对象
8 | const app = express();
9 |
10 | //首先引入ejs
11 | const ejs = require("ejs");
12 |
13 | //通知express使用ejs模板引擎
14 | app.set("view engine", "ejs");
15 | app.set("views", "views");
16 |
17 |
18 | app.get("/", (req, res) => {
19 | //获取模板的路径
20 | const filePath = path.resolve(__dirname, "index.ejs");
21 | const data = "hello jingjing";
22 |
23 | res.render(filePath, {
24 | data: data,
25 | name: "laowang",
26 | user: [{
27 | name: "laowang",
28 | age: 18,
29 | sex: "nan"
30 | }, {
31 | name: "xiaowang",
32 | age: 19,
33 | sex: "nv"
34 | }, {
35 | name: "zhongwang",
36 | age: 28,
37 | sex: "nan"
38 | }, {
39 | name: "dawang",
40 | age: 38,
41 | sex: "nv"
42 | }]
43 | })
44 | })
45 |
46 |
47 | //监听端口号和服务器状态
48 | let port = "3002";
49 | app.listen(port, err => {
50 | if (err) {
51 | console.log(err);
52 | return;
53 | }
54 |
55 | console.log("服务器启动,请访问" + ` http://127.0.0.1:${port}`);
56 | })
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "nb-plus0322",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "build": "browserify ./day09-ajax/05.module/01.commonjs/index.js -o ./day09-ajax/05.module/01.commonjs/build.js",
8 | "start": "babel ./day09-ajax/05.module/02.ES6/js -d ./day09-ajax/05.module/02.ES6/build & browserify ./day09-ajax/05.module/02.ES6/build/index.js -o ./day09-ajax/05.module/02.ES6/build/build.js"
9 |
10 | },
11 | "repository": {
12 | "type": "git",
13 | "url": "git+https://github.com/nowLetsgo/NB-Plus0322.git"
14 | },
15 | "keywords": [],
16 | "author": "",
17 | "license": "ISC",
18 | "bugs": {
19 | "url": "https://github.com/nowLetsgo/NB-Plus0322/issues"
20 | },
21 | "homepage": "https://github.com/nowLetsgo/NB-Plus0322#readme",
22 | "dependencies": {
23 | "body-parser": "^1.19.0",
24 | "cookie-parser": "^1.4.5",
25 | "ejs": "^3.1.6",
26 | "etag": "^1.8.1",
27 | "express": "^4.17.1",
28 | "express-session": "^1.17.2",
29 | "mongoose": "^5.12.13"
30 | },
31 | "devDependencies": {
32 | "@babel/cli": "^7.14.5",
33 | "@babel/core": "^7.14.5",
34 | "@babel/preset-env": "^7.14.5"
35 | },
36 | "babel": {
37 | "presets": [
38 | "@babel/env"
39 | ]
40 | }
41 | }
--------------------------------------------------------------------------------
/day05-node05/02.mongoose/07.数据库的删.js:
--------------------------------------------------------------------------------
1 | //1.引入mongoose模块
2 | const mongoose = require("mongoose");
3 |
4 |
5 | //2.连接数据库 (open事件监听)
6 | mongoose.connect("mongodb://127.0.0.1:27017/atguigu", {
7 | useNewUrlParser: true,
8 | useUnifiedTopology: true
9 | });
10 | //当数据库连接成功以后 会触发mongoose.connection的open事件
11 | mongoose.connection.once("open", err => {
12 | if (err) {
13 | console.log(err);
14 | return;
15 | }
16 | console.log("数据库连接成功");
17 | })
18 |
19 | // 3. 创建Schema对象, 方便未来对某个集合的值进行约束
20 | const teacherSchema = new mongoose.Schema({
21 | name: {
22 | type: String,
23 | unique: true, //唯一存在(以后不能有name的重名)
24 | required: true //必填项
25 | },
26 | age: Number,
27 | sex: String,
28 | // hobby:Array,//限制值必须是一个数组
29 | hobby: [String], //限制值必须是一个数组 并且数组的值必须是字符串
30 | createTime: {
31 | type: Date,
32 | default: Date.now
33 | }
34 | });
35 |
36 | // console.log(teacherSchema);
37 |
38 |
39 | //4.创建model对象(集合)
40 | //两个参数:集合的名字 集合的约束对象
41 | const teacherModel = mongoose.model("teacher", teacherSchema);
42 |
43 |
44 | //4.删
45 | // delete方法可以删除数据库的数据
46 | teacherModel.deleteOne({
47 | name: "王七"
48 | })
49 | .then(data => {
50 | console.log(data);
51 | })
52 | .catch(err => {
53 | console.log(err);
54 | })
--------------------------------------------------------------------------------
/day07-nodejs07/晨测.md:
--------------------------------------------------------------------------------
1 | ### 晨测
2 | - 谈一谈session
3 | - 服务端存储
4 | 1.客户端发送登录请求,在报文体中携带登录信息
5 | 2.服务端接收请求,创建一个session对象,然后给当前的用户信息创建一个永远不会重复的sessionID,把当前的用户的信息和sessionID组成一个key-value保存在session对象中
6 | 3.服务端返回响应,cookie携带了sessionID
7 | 4.客户端接收响应,把sessionID保存在cookie中
8 | 5.客户端第二次发送请求,会自动携带cookie,cookie中携带有sessionID
9 | 6.服务端通过解析,获取到了客户端请求的cookie中的sessionID,去判断用户信息是否在session对象中保存
10 | 7.如果服务端验证成功,则会响应对应的请求,否则需要再次登录
11 |
12 | - 谈一谈cookie
13 | cookie:
14 | - http是无状态协议,http自身不会对响应和请求之间的通信进行保存,每次请求的时候,不知道客户端是谁
15 | - cookie的本职工作其实并非本地存储,而是维持状态
16 | - cookie是绕开了http的无状态协议的手段,服务端可以通过用户请求携带的cookie信息,来维护客户端和服务端之间的状态
17 |
18 | cookie的特点:
19 | - cookie提供的内存很小,并且有个数限制
20 | - cookie一定会随着请求发送,过多的cookie会有更多性能消耗
21 | - cookie在http的传输中是明文的,安全性不高,https除外
22 |
23 | - 谈一谈Storage
24 | localStorage:本地存储
25 | - 把数据保存在本地磁盘上,按照浏览器和域名存储
26 | - 保存的数据长期存在,每次访问的时候都可以直接读取到数据
27 | - 大小为5M左右
28 | - 仅限客户端时候,不和服务端通信
29 | - 跨页面通信
30 | - 接口封装非常nice
31 |
32 | 接口:
33 | 设置:localStorage.setItem(key,value)
34 | 获取:localStorage.getItem(key)
35 | 删除:localStorage.removeItem(key)
36 |
37 |
38 | 临时存储接口:(页面关闭即消失,不能夸页面通信)
39 | 设置:sessionStorage.setItem(key,value)
40 | 获取:sessionStorage.getItem(key)
41 | 删除:sessionStorage.removeItem(key)
--------------------------------------------------------------------------------
/day03-nodejs03/03.fs/04.异步写入解决回调地狱2.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const path = require("path");
3 |
4 | //得到文件路径
5 | const filePath = path.resolve(__dirname, "text.txt");
6 |
7 | function open() {
8 | return new Promise((resolve, reject) => {
9 | fs.open(filePath, "a", (err, fd) => {
10 | //错误处理 调用reject
11 | if (err) {
12 | reject(err);
13 | return;
14 | }
15 |
16 | resolve(fd);
17 | })
18 | })
19 | }
20 |
21 | function write(fd) {
22 | return new Promise((resolve, reject) => {
23 | fs.write(fd, "牵着你的手", (err) => {
24 | if (err) {
25 | reject(err);
26 | return;
27 | }
28 |
29 | resolve();
30 | })
31 | })
32 | }
33 |
34 | function close(fd) {
35 | return new Promise((resolve, reject) => {
36 | fs.close(fd, (err) => {
37 | if (err) {
38 | reject(err);
39 | return;
40 | }
41 |
42 | resolve("全部完成")
43 | })
44 | });
45 | }
46 |
47 |
48 | (async () => {
49 | const fd = await open();
50 | await write(fd);
51 | const re = await close(fd);
52 | return re;
53 | })()
54 | .then((data) => {
55 | console.log(data);
56 | })
57 | .catch((err) => {
58 | console.log(err);
59 | })
--------------------------------------------------------------------------------
/day07-nodejs07/05.session/router/loginRouter.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 |
3 | const router = new express.Router();
4 |
5 | const path = require("path")
6 |
7 | //引入mongoose的当前用户信息集合
8 | const userModel = require("../model/userModel");
9 |
10 | //登录接口
11 | router.get("/login", async (req, res) => {
12 | //拿到用户的登录信息
13 | const {
14 | username,
15 | password
16 | } = req.query;
17 |
18 |
19 | //根据username去数据库查询是否存在该用户
20 | const isHasUser = await userModel.findOne({
21 | username
22 | });
23 |
24 | //如果有没有用户名则返回用户名不存在
25 | console.log(isHasUser) //如果不存在则返回null
26 | if (!isHasUser) {
27 | //拼接err.ejs的路径
28 | const filePath = path.resolve(__dirname, "../views/err.ejs");
29 | return res.render(filePath, {
30 | errData: "用户名不存在"
31 | })
32 | }
33 |
34 | //如果用户名存在,则判断密码是否正确
35 | if (isHasUser.password != password) {
36 | //拼接err.ejs的路径
37 | const filePath = path.resolve(__dirname, "../views/err.ejs");
38 | return res.render(filePath, {
39 | errData: "密码错误"
40 | })
41 | }
42 |
43 | // 登录成功设置session
44 | req.session.username = username;
45 | //登录成功跳转到个人中心页
46 | const filePath = path.resolve(__dirname, "../views/center.html")
47 | res.sendFile(filePath);
48 | })
49 |
50 |
51 |
52 |
53 | module.exports = router;
--------------------------------------------------------------------------------
/day09-ajax/03.jsonp/test.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
13 |
14 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/day05-node05/02.mongoose/03.创建model对象及初始化仓库.js:
--------------------------------------------------------------------------------
1 | //1.引入mongoose模块
2 | const mongoose = require("mongoose");
3 |
4 |
5 | //2.连接数据库 (open事件监听)
6 | mongoose.connect("mongodb://127.0.0.1:27017/atguigu", {
7 | useNewUrlParser: true,
8 | useUnifiedTopology: true
9 | });
10 | //当数据库连接成功以后 会触发mongoose.connection的open事件
11 | mongoose.connection.once("open", err => {
12 | if (err) {
13 | console.log(err);
14 | return;
15 | }
16 | console.log("数据库连接成功");
17 | })
18 |
19 | // 3. 创建Schema对象, 方便未来对某个集合的值进行约束
20 | const teacherSchema = new mongoose.Schema({
21 | name: {
22 | type: String,
23 | unique: true, //唯一存在(以后不能有name的重名)
24 | required: true //必填项
25 | },
26 | age: Number,
27 | sex: String,
28 | // hobby:Array,//限制值必须是一个数组
29 | hobby: [String], //限制值必须是一个数组 并且数组的值必须是字符串
30 | createTime: {
31 | type: Date,
32 | default: Date.now
33 | }
34 | });
35 |
36 | // console.log(teacherSchema);
37 |
38 |
39 | //4.创建model对象(集合)
40 | //两个参数:集合的名字 集合的约束对象
41 | const teacherModel = mongoose.model("teacher", teacherSchema);
42 |
43 | //5.初始化集合的内容(也可以不初始化,直接增)
44 | new teacherModel({
45 | name: "张三",
46 | age: 18,
47 | sex: "男",
48 | hobby: ["唱", "跳"],
49 | createTime: Date.now()
50 | }).save((err) => {
51 | if (err) {
52 | console.log(err);
53 | return;
54 | }
55 | console.log("teacher初始化成功");
56 | })
--------------------------------------------------------------------------------
/day13-axios/08.原生ajax取消.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/day07-nodejs07/02.localStorage/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
13 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/day04-node04/06.MIME类型/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 | 0322学生信息
13 |
14 |
15 | | 学号 |
16 | 姓名 |
17 | 年龄 |
18 | 校区 |
19 |
20 |
21 | | 001 |
22 | 张三 |
23 | 12 |
24 | 武汉 |
25 |
26 |
27 | | 001 |
28 | 张三 |
29 | 12 |
30 | 武汉 |
31 |
32 |
33 | | 001 |
34 | 张三 |
35 | 12 |
36 | 武汉 |
37 |
38 |
39 | | 001 |
40 | 张三 |
41 | 12 |
42 | 武汉 |
43 |
44 |
45 | | 001 |
46 | 张三 |
47 | 12 |
48 | 武汉 |
49 |
50 |
51 | | 001 |
52 | 张三 |
53 | 12 |
54 | 武汉 |
55 |
56 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/day12-webpack/config/webpack.config.dev.js:
--------------------------------------------------------------------------------
1 | const path = require("path");
2 | const HtmlWebpackPlugin = require('html-webpack-plugin');
3 |
4 | module.exports = {
5 | //入口路径配置
6 | entry: "./src/js/index.js",
7 | //出口路径配置
8 | output: {
9 | path: path.resolve(__dirname, "build"),
10 | filename: "./js/build.js"
11 | },
12 | //打包环境
13 | mode: "development",
14 | //loader的配置
15 | module: {
16 | rules: [{
17 | test: /\.less$/i,
18 | use: [{
19 | loader: 'style-loader',
20 | },
21 | {
22 | loader: 'css-loader',
23 | },
24 | {
25 | loader: 'less-loader',
26 | },
27 | ],
28 | }, {
29 | test: /\.(png|jpg|gif)$/i,
30 | use: [{
31 | loader: 'url-loader',
32 | options: {
33 | limit: 3 * 1024,
34 | name: './imgs/[hash:10].[ext]'
35 | },
36 | }, ],
37 | }, {
38 | test: /\.html$/i,
39 | loader: 'html-loader',
40 | }, ],
41 | },
42 | plugins: [new HtmlWebpackPlugin({
43 | template: "./src/index.html"
44 | })],
45 |
46 | devServer: {
47 | port: 8888,
48 | host: "127.0.0.1",
49 | open: true,
50 | compress: true,
51 | quiet: true
52 | },
53 | devtool: "source-map"
54 | }
--------------------------------------------------------------------------------
/day13-axios/09.手写new.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
51 |
52 |
53 |
--------------------------------------------------------------------------------
/day10-手写promise/ex.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/day05-node05/02.mongoose/05数据库的查.js:
--------------------------------------------------------------------------------
1 | //1.引入mongoose模块
2 | const mongoose = require("mongoose");
3 |
4 |
5 | //2.连接数据库 (open事件监听)
6 | mongoose.connect("mongodb://127.0.0.1:27017/atguigu", {
7 | useNewUrlParser: true,
8 | useUnifiedTopology: true
9 | });
10 | //当数据库连接成功以后 会触发mongoose.connection的open事件
11 | mongoose.connection.once("open", err => {
12 | if (err) {
13 | console.log(err);
14 | return;
15 | }
16 | console.log("数据库连接成功");
17 | })
18 |
19 | // 3. 创建Schema对象, 方便未来对某个集合的值进行约束
20 | const teacherSchema = new mongoose.Schema({
21 | name: {
22 | type: String,
23 | unique: true, //唯一存在(以后不能有name的重名)
24 | required: true //必填项
25 | },
26 | age: Number,
27 | sex: String,
28 | // hobby:Array,//限制值必须是一个数组
29 | hobby: [String], //限制值必须是一个数组 并且数组的值必须是字符串
30 | createTime: {
31 | type: Date,
32 | default: Date.now
33 | }
34 | });
35 |
36 | // console.log(teacherSchema);
37 |
38 |
39 | //4.创建model对象(集合)
40 | //两个参数:集合的名字 集合的约束对象
41 | const teacherModel = mongoose.model("teacher", teacherSchema);
42 |
43 |
44 | //2.查
45 | //提供了find方法 返回一个promise对象
46 | /* teacherModel.find({
47 | age: {
48 | $lte: 20
49 | }
50 | })
51 | .then(data => {
52 | console.log(data);
53 | }).catch(err => {
54 | console.log(err);
55 | }) */
56 |
57 | teacherModel.findOne({
58 | age: {
59 | $lte: 20
60 | }
61 | })
62 | .then(data => {
63 | console.log(data);
64 | }).catch(err => {
65 | console.log(err);
66 | })
--------------------------------------------------------------------------------
/day07-nodejs07/01.中间件/router/loginRouter.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 |
3 | const router = new express.Router();
4 |
5 | const path = require("path")
6 |
7 | //引入mongoose的当前用户信息集合
8 | const userModel = require("../model/userModel");
9 |
10 | //登录接口
11 | router.get("/login", async (req, res) => {
12 | //拿到用户的登录信息
13 | const {
14 | username,
15 | password
16 | } = req.query;
17 |
18 |
19 | //根据username去数据库查询是否存在该用户
20 | const isHasUser = await userModel.findOne({
21 | username
22 | });
23 |
24 | //如果有没有用户名则返回用户名不存在
25 | console.log(isHasUser) //如果不存在则返回null
26 | if (!isHasUser) {
27 | //拼接err.ejs的路径
28 | const filePath = path.resolve(__dirname, "../views/err.ejs");
29 | return res.render(filePath, {
30 | errData: "用户名不存在"
31 | })
32 | }
33 |
34 | //如果用户名存在,则判断密码是否正确
35 | if (isHasUser.password != password) {
36 | //拼接err.ejs的路径
37 | const filePath = path.resolve(__dirname, "../views/err.ejs");
38 | return res.render(filePath, {
39 | errData: "密码错误"
40 | })
41 | }
42 |
43 | //登录成功要设置cookie响应给客户端(把ID设置给cookie)
44 | res.cookie("userID", isHasUser._id, {
45 | maxAge: 1000 * 60 * 60 * 24, //http1.1提供,以毫秒为单位
46 | // expires: new Date(Date.now() + 1000 * 60 * 60 * 24 * 7), //http1.0提供
47 | httpOnly: true
48 | });
49 | //登录成功跳转到个人中心页
50 | const filePath = path.resolve(__dirname, "../views/center.html")
51 | res.sendFile(filePath);
52 | })
53 |
54 |
55 |
56 |
57 | module.exports = router;
--------------------------------------------------------------------------------
/day10-手写promise/02.promise的then方法.js:
--------------------------------------------------------------------------------
1 | //构造一个myPromise的类
2 |
3 | //exector是默认的回调函数
4 | function myPromise(exector) {
5 | //保存指向实例化对象的this
6 | const _this = this;
7 | //给实例化对象扩展两个属性值 status value
8 | //默认status是pending 默认value是undefined
9 | _this.status = "pending";
10 | _this.value = undefined;
11 | _this.callback = {};
12 |
13 | //封装resolve和reject函数,当promise的回调函数触发的时候传递进去
14 | function resolve(value) {
15 | if (_this.status !== "pending") return;
16 | _this.status = "resolved";
17 | _this.value = value;
18 |
19 | //为了保证then中的onResolved函数永远是异步的,则我们给他包裹一层异步代码
20 | //保证onRejected执行的时候,then要已经执行过了
21 | setTimeout(() => {
22 | _this.callback.onResolved(value);
23 | })
24 |
25 | }
26 |
27 | function reject(reason) {
28 | if (_this.status !== "pending") return;
29 | _this.status = "rejected";
30 | _this.value = reason;
31 | //为了保证then中的onResolved函数永远是异步的,则我们给他包裹一层异步代码
32 | //保证onRejected执行的时候,then要已经执行过了
33 | setTimeout(() => {
34 | _this.callback.onRejected(reason);
35 | })
36 | }
37 |
38 | //当构造函数被实例化的时候 exector需要直接触发
39 | exector(resolve, reject);
40 | }
41 |
42 | //then在使用的时候是同步调用了,但是我们可以控制then中的函数是异步调用
43 | myPromise.prototype.then = function (onResolved, onRejected) {
44 | const _this = this;
45 | //onResolved和onRejected两个方法需要在reject函数和resolve函数调用的时候才能执行
46 | //但是这两个函数只能在then中接受,所以我们需要把两个函数交给构造函数中的reject函数和resolve函数使用
47 |
48 | _this.callback.onResolved = onResolved;
49 | _this.callback.onRejected = onRejected;
50 |
51 | }
--------------------------------------------------------------------------------
/day09-ajax/01.ajax/server.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const app = express();
3 | const path = require("path");
4 |
5 | //body-parser中间件是处理post请求数据的
6 | const bodyParser = require("body-parser");
7 | //如果post请求发送的数据是json字符串格式,则使用下边处理
8 | app.use(bodyParser.json());
9 | //如果post请求发送的数据是form表单格式,则使用下边处理
10 | app.use(bodyParser.urlencoded({
11 | extended: false
12 | }));
13 |
14 | app.get("/", (req, res) => {
15 | const filePath = path.resolve(__dirname, "./index.html");
16 | res.sendFile(filePath)
17 | })
18 |
19 | app.post("/login", (req, res) => {
20 | const {
21 | user,
22 | pass
23 | } = req.body;
24 | console.log(req.body);
25 |
26 | if (user === "laoli" && pass === "123") {
27 | const data = {
28 | mes: "ok",
29 | code: 1
30 | }
31 | return res.json(data);
32 | }
33 |
34 |
35 | const err = {
36 | mes: "no ok",
37 | code: 0
38 | }
39 | return res.json(err);
40 | })
41 |
42 | app.get("/login", (req, res) => {
43 | const {
44 | user,
45 | pass
46 | } = req.query;
47 | console.log(req.query);
48 |
49 | if (user === "laoli" && pass === "123") {
50 | const data = {
51 | mes: "ok",
52 | code: 1
53 | }
54 | return res.json(data);
55 | }
56 |
57 |
58 | const err = {
59 | mes: "no ok",
60 | code: 0
61 | }
62 | return res.json(err);
63 | })
64 |
65 | app.listen("3000", (err) => {
66 | if (err) {
67 | console.log(err);
68 | return;
69 | }
70 | console.log("http://127.0.0.1:3000");
71 | })
--------------------------------------------------------------------------------
/day09-ajax/02.axios/server.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const app = express();
3 | const path = require("path");
4 |
5 | //body-parser中间件是处理post请求数据的
6 | const bodyParser = require("body-parser");
7 | //如果post请求发送的数据是json字符串格式,则使用下边处理
8 | app.use(bodyParser.json());
9 | //如果post请求发送的数据是form表单格式,则使用下边处理
10 | app.use(bodyParser.urlencoded({
11 | extended: false
12 | }));
13 |
14 | app.get("/", (req, res) => {
15 | const filePath = path.resolve(__dirname, "./index.html");
16 | res.sendFile(filePath)
17 | })
18 |
19 | app.post("/login", (req, res) => {
20 | const {
21 | user,
22 | pass
23 | } = req.body;
24 | console.log(req.body);
25 |
26 | if (user === "laoli" && pass === "123") {
27 | const data = {
28 | mes: "ok",
29 | code: 1
30 | }
31 | return res.json(data);
32 | }
33 |
34 |
35 | const err = {
36 | mes: "no ok",
37 | code: 0
38 | }
39 | return res.json(err);
40 | })
41 |
42 | app.get("/login", (req, res) => {
43 | const {
44 | user,
45 | pass
46 | } = req.query;
47 | console.log(req.query);
48 |
49 | if (user === "laoli" && pass === "123") {
50 | const data = {
51 | mes: "ok",
52 | code: 1
53 | }
54 | return res.json(data);
55 | }
56 |
57 |
58 | const err = {
59 | mes: "no ok",
60 | code: 0
61 | }
62 | return res.json(err);
63 | })
64 |
65 | app.listen("3000", (err) => {
66 | if (err) {
67 | console.log(err);
68 | return;
69 | }
70 | console.log("http://127.0.0.1:3000");
71 | })
--------------------------------------------------------------------------------
/day07-nodejs07/01.中间件/router/centerRouter.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const router = new express.Router();
3 | const path = require("path");
4 | //引入mongoose的当前用户信息集合
5 | const userModel = require("../model/userModel");
6 |
7 | const cookieParser = require("cookie-parser");
8 | //获取cookie并且把cookie以对象的形式呈现
9 | router.use(cookieParser());
10 |
11 | //权限控制
12 | router.use("/center.html", async (req, res, next) => {
13 | //当用户访问center.html的时候,进行判断是否携带服务端发送的cookie
14 | console.log(req.cookies); //cookie-parser方法拿cookie
15 | // console.log(req.headers.cookie); //原生的方法拿cookie
16 |
17 | try {
18 | const re = await userModel.findOne({
19 | _id: req.cookies.userID
20 | })
21 | if (re) {
22 | next();
23 | } else {
24 | //没有查询到当前的userID
25 | // 清除掉当前的错误cookie
26 | res.clearCookie("userID")
27 | //拼接err.ejs的路径
28 | const filePath = path.resolve(__dirname, "../views/err.ejs");
29 | return res.render(filePath, {
30 | errData: "权限不足,请重新登录再访问个人中心页"
31 | })
32 | }
33 |
34 | } catch (e) {
35 | //查询userID出错
36 | // 清除掉当前的错误cookie
37 | res.clearCookie("userID")
38 | //拼接err.ejs的路径
39 | const filePath = path.resolve(__dirname, "../views/err.ejs");
40 | return res.render(filePath, {
41 | errData: "权限不足,请重新登录再访问个人中心页"
42 | })
43 | }
44 |
45 | })
46 |
47 | router.get("/center.html", (req, res) => {
48 | //响应页面
49 | const filePath = path.resolve(__dirname, "../views/center.html")
50 | res.sendFile(filePath);
51 | })
52 |
53 | module.exports = router;
--------------------------------------------------------------------------------
/day07-nodejs07/05.session/server.js:
--------------------------------------------------------------------------------
1 | //引入express
2 | const express = require("express");
3 |
4 | //创建一个express的application对象
5 | const app = express();
6 |
7 | //连接数据库
8 | require("./db")
9 |
10 | //自动打开浏览器
11 | const open = require("./util/open")
12 |
13 | const expressSession = require("express-session");
14 | //配置session
15 | app.use(expressSession({
16 | secret: 'atguigu0322',
17 | resave: false,
18 | saveUninitialized: true,
19 | cookie: {
20 | maxAge: 1000 * 60 * 60 * 24 * 7,
21 | httpOnly: true
22 | }
23 | }))
24 |
25 |
26 | //引入ejs
27 | const ejs = require("ejs");
28 | //通知express使用ejs模板引擎
29 | app.set("view engine", "ejs");
30 | app.set("views", "views");
31 |
32 | //路由管理模块引入
33 | const isEmptyRouter = require("./router/isEmptyRouter");
34 | const regRouter = require("./router/regRouter");
35 | const registerRouter = require("./router/registerRouter");
36 | const loginRouter = require("./router/loginRouter");
37 | const centerRouter = require("./router/centerRouter");
38 |
39 |
40 |
41 | //官方的静态资源中间件
42 | app.use(express.static("./public"));
43 | app.use(express.static("./static"));
44 |
45 | //处理req请求携带的数据的中间件,把req的数据放在了req.body的属性上了
46 | app.use(express.urlencoded({
47 | extended: true
48 | }))
49 |
50 |
51 | //把所有的引入的路由管理挂载在app上
52 | app.use(isEmptyRouter)
53 | app.use(regRouter)
54 | app.use(registerRouter)
55 | app.use(loginRouter)
56 | app.use(centerRouter)
57 |
58 | //监听端口号和服务器状态
59 | let port = "3002";
60 | app.listen(port, err => {
61 | if (err) {
62 | console.log(err);
63 | return;
64 | }
65 |
66 | console.log("服务器启动,请访问" + ` http://127.0.0.1:${port}`);
67 | //自动打开浏览器
68 | // open(port, "http://127.0.0.1");
69 |
70 | })
--------------------------------------------------------------------------------
/day05-node05/02.mongoose/06.数据库的改.js:
--------------------------------------------------------------------------------
1 | //1.引入mongoose模块
2 | const mongoose = require("mongoose");
3 |
4 |
5 | //2.连接数据库 (open事件监听)
6 | mongoose.connect("mongodb://127.0.0.1:27017/atguigu", {
7 | useNewUrlParser: true,
8 | useUnifiedTopology: true
9 | });
10 | //当数据库连接成功以后 会触发mongoose.connection的open事件
11 | mongoose.connection.once("open", err => {
12 | if (err) {
13 | console.log(err);
14 | return;
15 | }
16 | console.log("数据库连接成功");
17 | })
18 |
19 | // 3. 创建Schema对象, 方便未来对某个集合的值进行约束
20 | const teacherSchema = new mongoose.Schema({
21 | name: {
22 | type: String,
23 | unique: true, //唯一存在(以后不能有name的重名)
24 | required: true //必填项
25 | },
26 | age: Number,
27 | sex: String,
28 | // hobby:Array,//限制值必须是一个数组
29 | hobby: [String], //限制值必须是一个数组 并且数组的值必须是字符串
30 | createTime: {
31 | type: Date,
32 | default: Date.now
33 | }
34 | });
35 |
36 | // console.log(teacherSchema);
37 |
38 |
39 | //4.创建model对象(集合)
40 | //两个参数:集合的名字 集合的约束对象
41 | const teacherModel = mongoose.model("teacher", teacherSchema);
42 |
43 |
44 | //3.改
45 | // updateMany方法可以进行更新数据
46 | // updateOne方法可以进行更新数据
47 |
48 | /* teacherModel.updateMany({
49 | sex: "男"
50 | }, {
51 | $set: {
52 | age: 2
53 | }
54 | })
55 | .then(data => {
56 | console.log(data);
57 | })
58 | .catch(err => {
59 | console.log(err);
60 | }) */
61 |
62 | teacherModel.updateOne({
63 | sex: "男"
64 | }, {
65 | $set: {
66 | age: 2
67 | }
68 | })
69 | .then(data => {
70 | console.log(data);
71 | })
72 | .catch(err => {
73 | console.log(err);
74 | })
--------------------------------------------------------------------------------
/day04-node04/03.请求报文.js:
--------------------------------------------------------------------------------
1 | /*
2 | get请求报文:
3 | //1.报文首行(请求的信息:请求方式+主机地址和端口+查询字符串[就是请求携带的数据] 协议名称)
4 | GET http://127.0.0.1:3000/?user=laowang&pass=123 HTTP/1.1
5 |
6 | //2.报文头部
7 | Host: 127.0.0.1:3000//主机地址+端口号
8 | Connection: keep-alive//保持长连接
9 | Cache-Control: no-cache//是否读取缓存 不读取
10 | //是否允许使用https:允许
11 | Upgrade-Insecure-Requests: 1
12 | //用户代理字符串
13 | User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36
14 | //客户端可以接收的类型
15 | Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng
16 | //支持的压缩类型
17 | Accept-Encoding: gzip, deflate, br
18 | //支持的语言
19 | Accept-Language: zh-CN,zh;q=0.9
20 |
21 | //3.报文空行(用来间隔报文体)
22 |
23 | //4.报文体(请求的内容,但是get请求的内容都在url地址上,所以get请求报文体为空)
24 |
25 | */
26 |
27 | /*
28 | POST请求报文
29 | //1.请求报文首行
30 | POST http://127.0.0.1:3000/ HTTP/1.1
31 | //2.请求报文头
32 | Host: 127.0.0.1:3000
33 | Connection: keep-alive
34 | Content-Length: 22
35 | Cache-Control: max-age=0
36 | Upgrade-Insecure-Requests: 1
37 | Content-Type: application/x-www-form-urlencoded
38 | User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36
39 | Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng
40 | Accept-Encoding: gzip, deflate, br
41 | Accept-Language: zh-CN,zh;q=0.9
42 | //3.请求报文空行
43 |
44 | //4.请求报文体(post请求 发送的数据在报文体中)
45 | user=laoli&pass=123456
46 |
47 | */
--------------------------------------------------------------------------------
/day08-node08/03.压缩/server.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const app = express();
3 | const path = require("path");
4 | const fs = require("fs");
5 | const zlib = require("zlib");
6 |
7 |
8 | app.get("/", (req, res) => {
9 | const filePath = path.resolve(__dirname, "./index.html");
10 | const rs = fs.createReadStream(filePath);
11 |
12 | //获取请求中的Accept-Encoding可以接受的类型,根据可以接受的类型来完成压缩选择
13 | console.log(req.headers["accept-encoding"]);
14 | const acceptEncoding = req.headers["accept-encoding"];
15 | //可以使用includes判断字符串中是否含有某个值
16 | if (acceptEncoding.includes("gzip")) {
17 | const zlibFile = rs.pipe(zlib.createGzip())
18 | res.set("Content-Encoding", "gzip")
19 | return zlibFile.pipe(res);
20 | }
21 |
22 | if (acceptEncoding.includes("deflate")) {
23 | const zlibFile = rs.pipe(zlib.createDeflate())
24 | res.set("Content-Encoding", "deflate")
25 | return zlibFile.pipe(res);
26 | }
27 |
28 | if (acceptEncoding.includes("br")) {
29 | const zlibFile = rs.pipe(zlib.createBrotliCompress())
30 | res.set("Content-Encoding", "br")
31 | return zlibFile.pipe(res);
32 | }
33 |
34 |
35 | //如果上边的条件都不符合,则不压缩 直接响应
36 | rs.pipe(res);
37 |
38 |
39 |
40 | //使用gZip压缩:创建一个新的gzip对象,并把文件写入这个对象中
41 | /* const zlibFile = rs.pipe(zlib.createGzip())
42 | res.set("Content-Encoding", "gzip") */
43 |
44 | /* const zlibFile = rs.pipe(zlib.createBrotliCompress())
45 | res.set("Content-Encoding", "br") */
46 |
47 | /* const zlibFile = rs.pipe(zlib.createDeflate())
48 | res.set("Content-Encoding", "deflate") */
49 |
50 | // zlibFile.pipe(res);
51 | })
52 |
53 | app.listen("3000", (err) => {
54 | if (err) {
55 | console.log(err);
56 | return;
57 | }
58 | console.log("http://127.0.0.1:3000");
59 | })
--------------------------------------------------------------------------------
/day08-node08/02.协商缓存/server.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 |
3 | const {
4 | exec
5 | } = require("child_process")
6 |
7 | const path = require("path");
8 |
9 | const etag = require("etag");
10 |
11 | const {
12 | promisify
13 | } = require("util");
14 |
15 | const fs = require("fs");
16 | const {
17 | resolve6
18 | } = require("dns");
19 |
20 | const app = express();
21 |
22 | app.get("/", async (req, res) => {
23 | // sendFile已经把协商缓存设置好了
24 | /* const filePath = path.resolve(__dirname, "./index.html");
25 | res.sendFile(filePath) */
26 |
27 | //在接收请求的时候,先获取请求头携带的if-none-match 和 if-modified-since
28 | const ifNoneMatch = req.headers["if-none-match"];
29 | const ifModifiedSince = req.headers["if-modified-since"];
30 | console.log(ifNoneMatch, ifModifiedSince);
31 |
32 |
33 | const filePath = path.resolve(__dirname, "./index.html");
34 | const rs = fs.createReadStream(filePath);
35 |
36 | //fs有一个stat方法 可以得到文件的详细信息
37 | //使用promisify方法把stat方法包装成promise对象
38 | const stat = promisify(fs.stat);
39 |
40 | //得到文件详细的信息
41 | const fileDetail = await stat(filePath);
42 | // console.log(fileDetail);
43 |
44 | //得到文件的最后修改时间
45 | const fileTime = fileDetail.mtime.toGMTString();
46 | //得到文件的唯一标识
47 | const fileEtag = etag(fileDetail);
48 | // console.log(fileTime.toString(), fileEtag);
49 |
50 |
51 | //协商缓存判断
52 | if (ifNoneMatch === fileEtag && ifModifiedSince === fileTime) {
53 | return res.status(304).end()
54 | }
55 |
56 |
57 | //把文件的唯一标识和最后修改时间设置在响应头中
58 | res.set("ETag", fileEtag);
59 | res.set("Last-Modified", fileTime);
60 |
61 | rs.pipe(res);
62 | })
63 |
64 |
65 |
66 |
67 | app.listen("3000", (err) => {
68 | if (err) {
69 | console.log(err);
70 | return;
71 | }
72 | console.log("服务已经启动 http://127.0.0.1:3000");
73 | // exec("start http://127.0.0.1:3000")
74 | })
--------------------------------------------------------------------------------
/day10-手写promise/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
13 |
64 |
65 |
66 |
--------------------------------------------------------------------------------
/day05-node05/01.mongoDBText/01.Mongo语句.js:
--------------------------------------------------------------------------------
1 | /*
2 | // 查看当前Mongo中所有的数据库
3 | show databases
4 |
5 | //使用或者创建一个数据库
6 | use atguigu
7 |
8 | //查看当前所在的数据库
9 | db
10 |
11 | // 新增一条数据
12 | db.student.insert({name:"小龙女",age:612,sex:"女"})
13 |
14 | //新增多条数据
15 | db.student.insert([{name:"杨过",age:600,sex:"男"},{name:"尹志平",age:702,sex:"男"}])
16 |
17 |
18 |
19 | // 查找当前集合所有的数据
20 | db.student.find()
21 |
22 | //查找当前集合 所有年龄为302的数据
23 | db.student.find({age:302})
24 |
25 | //查找当前集合 所有男的数据
26 | db.student.find({sex:"男"})
27 |
28 | //查找当前集合 id为某个值的(id是自动生成的)
29 | db.student.find({_id:ObjectId("60bd89542154201d5853b42a")})
30 |
31 | //查找当前集合 年龄小于等于600岁的
32 | db.student.find({age:{$lte:600}})
33 |
34 | //查找当前集合 年龄大于等于600岁的
35 | db.student.find({age:{$gte:600}})
36 |
37 | //查找当前集合 年龄大于600岁的
38 | db.student.find({age:{$gt:600}})
39 |
40 | //查找当前集合 年龄小于600岁的
41 | db.student.find({age:{$lt:600}})
42 |
43 | //查找当前集合 年龄大于等于600 或 性别是男 的数据
44 | db.student.find({$or:[{age:{$gte:600}},{sex:"男"}]})
45 |
46 | //查找当前集合 年龄符和 600 302 612的条件的时候
47 | db.student.find({age:{$in:[600,302,612]}})
48 |
49 | //查找当前集合 以小为开头 (正则表达式)
50 | db.student.find({name:/^小/})
51 |
52 | //查找符合where条件的
53 | db.student.find({$where:function(){
54 | return this.age>600 || this.age<40
55 | }})
56 |
57 | //查找符合条件的数据 并限制显示的字段 只显示name 和 id
58 | db.student.find({},{name:1})
59 | //查找符合条件的数据 并限制显示的字段 只显示name 和 id和age
60 | db.student.find({},{name:1,age:1})
61 | //查找符合条件的数据 并限制显示的字段 只显示name和age
62 | db.student.find({},{name:1,age:1,_id:0})
63 | //查找符合条件的数据 并限制显示的字段 不显示age
64 | db.student.find({},{age:0})
65 |
66 |
67 | //修改某个符合条件的数据
68 | db.student.updateOne({sex:"男"},{$set:{age:2}})
69 | //修改所有符合条件的数据
70 | db.student.updateMany({sex:"男"},{$set:{age:4}})
71 |
72 | //删除某个符合条件的数据
73 | db.student.deleteOne({age:36})
74 | */
--------------------------------------------------------------------------------
/day13-axios/07.取消请求.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
62 |
63 |
64 |
--------------------------------------------------------------------------------
/day13-axios/08.取消请求2.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
63 |
64 |
65 |
--------------------------------------------------------------------------------
/day05-node05/04.express基础.js:
--------------------------------------------------------------------------------
1 | //1.引入第三方模块express
2 | const express = require("express");
3 |
4 | //2.创建一个express的application对象
5 | const app = express();
6 |
7 | const fs = require("fs");
8 | const path = require("path");
9 |
10 | //书写接口
11 | app.get("/", (req, res) => {
12 | console.log("/ 被请求了");
13 | // console.log(req);
14 | console.log(req.method); //请求方式
15 | console.log(req.params);
16 | console.log(req.query); //GET请求的查询字符串组成的对象
17 | console.log(req.url); //请求的路径信息
18 |
19 |
20 | //响应
21 |
22 | //不会设置响应头的content-type
23 | // res.end("今天真的热")
24 |
25 | //自动设置响应头的content-type
26 | // res.send("今天真的热")
27 |
28 | //把数据转化为json响应
29 | // res.json({
30 | // "name": "laowang"
31 | // })
32 |
33 | //响应下载
34 | /* const filePath = path.resolve(__dirname, "index.html");
35 | res.download(filePath); */
36 |
37 | //发送文件 如果浏览器可以打开 则使用是浏览器打开
38 | /* const filePath = path.resolve(__dirname, "index.html");
39 | res.sendFile(filePath) */
40 |
41 |
42 | //重定向
43 | // res.redirect("http://docs.lipeihua.vip")
44 |
45 |
46 | //设置响应头
47 | /* res.set("hello", "world");
48 | res.status(200)
49 | res.send("今天真的热") */
50 |
51 |
52 | const filePath = path.resolve(__dirname, "index.html");
53 | res.sendFile(filePath)
54 |
55 | })
56 |
57 | app.post("/register", (req, res) => {
58 | console.log("post请求");
59 |
60 | console.log(req.params)
61 |
62 | res.send("注册成功")
63 | })
64 |
65 | app.get("/login", (req, res) => {
66 | res.send("登录成功")
67 | })
68 |
69 | app.get("/img/goods", (req, res) => {
70 | res.send("商品详情")
71 | })
72 |
73 | app.get("/img/:id", (req, res) => {
74 | res.send("图片路径出错")
75 | })
76 |
77 | //访问的是/后边跟任意的路径
78 | app.get("/:id", (req, res) => {
79 | res.send("请检查路径")
80 | })
81 |
82 |
83 | //3.给当前的服务监听端口号
84 | app.listen(3001, (err) => {
85 | if (err) {
86 | console.log(err);
87 | return;
88 | }
89 | console.log("服务启动成功,请访问:" + `http://127.0.0.1:3001`);
90 | })
--------------------------------------------------------------------------------
/day09-ajax/01.ajax/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
13 |
14 |
72 |
73 |
74 |
--------------------------------------------------------------------------------
/day05-node05/02.mongoose/04.数据库的增.js:
--------------------------------------------------------------------------------
1 | //1.引入mongoose模块
2 | const mongoose = require("mongoose");
3 |
4 |
5 | //2.连接数据库 (open事件监听)
6 | mongoose.connect("mongodb://127.0.0.1:27017/atguigu", {
7 | useNewUrlParser: true,
8 | useUnifiedTopology: true
9 | });
10 | //当数据库连接成功以后 会触发mongoose.connection的open事件
11 | mongoose.connection.once("open", err => {
12 | if (err) {
13 | console.log(err);
14 | return;
15 | }
16 | console.log("数据库连接成功");
17 | })
18 |
19 | // 3. 创建Schema对象, 方便未来对某个集合的值进行约束
20 | const teacherSchema = new mongoose.Schema({
21 | name: {
22 | type: String,
23 | unique: true, //唯一存在(以后不能有name的重名)
24 | required: true //必填项
25 | },
26 | age: Number,
27 | sex: String,
28 | // hobby:Array,//限制值必须是一个数组
29 | hobby: [String], //限制值必须是一个数组 并且数组的值必须是字符串
30 | createTime: {
31 | type: Date,
32 | default: Date.now
33 | }
34 | });
35 |
36 | // console.log(teacherSchema);
37 |
38 |
39 | //4.创建model对象(集合)
40 | //两个参数:集合的名字 集合的约束对象
41 | const teacherModel = mongoose.model("teacher", teacherSchema);
42 |
43 |
44 | //1.增
45 | //增加一个文档
46 | /* teacherModel.create({
47 | name: "张三",
48 | age: 18,
49 | sex: "男",
50 | hobby: ["唱", "跳"],
51 | createTime: Date.now()
52 | }, err => {
53 | if (err) {
54 | console.log(err);
55 | return;
56 | }
57 | console.log("数据添加成功");
58 | }) */
59 |
60 | //增加多个文档
61 | /* teacherModel.create([{
62 | name: "王四",
63 | age: 22,
64 | sex: "女",
65 | hobby: ["篮球", "Rap"],
66 | createTime: Date.now()
67 | }, {
68 | name: "李五",
69 | age: 33,
70 | sex: "男",
71 | hobby: ["篮球", "晶晶"]
72 | }], err => {
73 | if (err) {
74 | console.log(err);
75 | return;
76 | }
77 | console.log("数据添加成功");
78 | }) */
79 |
80 | //create方法返回一个promise对象,所以可以解决回调函数问题
81 |
82 | teacherModel.create([{
83 | name: "王七",
84 | age: 12,
85 | sex: "女",
86 | hobby: ["足球", "Rap"],
87 | createTime: Date.now()
88 | }])
89 | .then(data => {
90 | //返回添加的对象
91 | console.log(data);
92 | })
93 | .catch(err => {
94 | console.log(err);
95 | })
--------------------------------------------------------------------------------
/day04-node04/晨测.md:
--------------------------------------------------------------------------------
1 | ## 晨测
2 | - 谈一谈HTTP协议
3 | - 超文本传输协议
4 | - 协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则。
5 | - 这个规则规定了客户端和服务器互相发送的报文格式
6 | - 客户端发送给服务器的称为“请求报文”,服务器发送给客户端的称为“响应报文”。
7 |
8 | - 谈一谈请求方式
9 | - GET:读取数据,不应该对数据产生任何副作用(查)
10 | - POST:提交数据,表单的提交,文件的上传。。。一般用来创建一个资源(增)
11 | - PUT:提交数据,修改数据内容(改)
12 | - DELETE:请求删除某个资源(删)
13 | - HEAD:和GET类似,只不过不返回响应体,只返回响应头(查询一些资源的信息)
14 | - OPTIONS:预检请求,一般浏览器自动发送,检查服务端是否支持某个请求方法
15 |
16 | - 谈一谈状态码
17 | HTTP 响应状态代码(status)指示特定 HTTP 请求的状态。响应分为五类
18 | - 1XX: 请求已经被服务端接收,继续处理中
19 | 100:请求正常,可以继续请求
20 | 101:需要切换协议
21 | 102:服务端正在处理,但是还没有找到资源
22 |
23 | - 2XX: 请求已经被服务器接收,并且处理完成
24 | 200:请求成功
25 | 201:请求处理成功,并创建了新资源 常见POST请求
26 |
27 | - 3XX: 需要后续操作才能完成请求
28 | 301:永久重定向
29 | 302:临时重定向
30 | 304:读取缓存
31 |
32 | - 4XX: 客户端错误(服务器无法执行)
33 | 400:请求中出现语法错误
34 | 401:需要重新认证
35 | 403:拒绝访问
36 | 404:找不到资源
37 |
38 | - 5XX: 服务端错误
39 | - 500:服务器执行过程中出现了错误
40 | - 503:服务器因为各种原因停止运行,无法处理请求
41 |
42 | - 从url输入到渲染的过程
43 | 1. DNS解析
44 | - 把域名解析成ip地址去访问
45 | - 浏览器缓存、计算机缓存、路由器缓存、运营商缓存
46 |
47 | 2. TCP三次握手
48 | - 三次握手的意义在于,客户端和服务端双方都能确定对象的收发能力正常。
49 | - 客户端向服务端发送请求,服务端接收(客户端发送能力正常)
50 | - 发送一个syn字段包(k),syn是新连接的数据包
51 | - 服务端接收到请求,向客户端发送数据包,客户端接收(服务端接收能力和发送能力都正常)
52 | - 服务端发送一个ack+syn的数据包,ack=syn+1,表示确认客户端请求有效,然后并重新发送了一个新连接syn=k
53 | - 客户端向服务端发送请求,服务端接受(客户端接收能力正常)
54 | - 客户端发送一个ack = syn+1 确认连接
55 |
56 | 3. 客户端发送数据,把请求报文发送给服务端
57 |
58 | 4. 客户端接收响应,服务端会生成响应报文发送给客户端
59 |
60 | 5. 解析响应来的文件(渲染页面)
61 | 1. 构建DOM树:解析 html 结构为浏览器可以理解的 DOM 树结构
62 |
63 | 2. 构建CSSOM树(样式树)
64 |
65 | 3. 构建渲染树(render Tree):合并DOM树和样式树,计算每一个节点的位置和样式
66 |
67 | 4. 分层:页面有很多复杂的效果,为了实现效果会进行分层绘制(有滚动条的,3d的,半透明等等都需要分层)
68 |
69 | 5. 图层绘制:生成多个绘制指令
70 |
71 | 6. 栅格化:把图层不是一次性直接绘制,而是分为了多个图块
72 |
73 | 7.合成及显示:把图块放在渲染的线程上开始绘制,并显示在浏览器中
74 |
75 | 6. 断开连接:TCP四次挥手
76 | - TCP 是双向的,所以需要在两个方向分别关闭,每个方向的关闭又需要请求和确认,所以一共就4次。
77 | - 客户端发送释放信号给服务端(Fin数据包:表示释放信号)
78 | - 服务端接受到释放信号,并给出回应,确认收到释放信号,但是数据可能没有传输完毕,等待传输(ack数据包,确认接收释放信号)
79 | - 服务端发送释放信号给客户端,并表示数据发送完毕(Fin数据包:释放信号)
80 | - 客户端发送确认信息给服务端,表示收到释放信号(ack数据包:确认接收释放信号)
--------------------------------------------------------------------------------
/day09-ajax/02.axios/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
13 |
14 |
15 |
79 |
80 |
81 |
--------------------------------------------------------------------------------
/day13-axios/06.响应拦截器.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
80 |
81 |
82 |
--------------------------------------------------------------------------------
/day13-axios/05.请求拦截器.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
74 |
75 |
76 |
--------------------------------------------------------------------------------
/day01-nodejs01/晨测.md:
--------------------------------------------------------------------------------
1 | ## 晨测
2 | - js事件轮询机制:
3 | - 代码分类
4 | - 初始化代码(同步代码):设置定时器,绑定事件,执行for等等....
5 | - 回调执行代码(异步代码):定时器回调,事件回调,ajax回调.....
6 | - js先执行同步代码 再执行异步代码
7 |
8 | - js事件轮询模型
9 | - 主线程
10 | - 浏览器的管理模块(DOM事件管理、Ajax管理、定时器管理)
11 | - 回调队列
12 |
13 | - 模型的运转流程
14 | - 执行初始化代码, 将异步回调函数交给对应模块管理
15 | - 当异步回调函数需要被执行的时候,将回调函数添加到回调列队中
16 | - 当同步代码执行完毕之后,会遍历调用回调队列中的回调函数执行
17 |
18 | - 谈一谈nodejs事件轮询
19 | - JS是单线程的, nodejs是做到非阻塞是因为在nodejs内部使用了第三方库libuv,nodejs会把IO,文件读取等异步操作交由他处理,而nodejs主线程可以继续去处理其他的事情。
20 | - libuv会开启不同的线程去处理这些延时操作,处理完后,会把异步操作的回调函数放到nodejs的轮询队列中,nodejs会在适当的时候处理轮询队列中的回调函数,从而实现非阻塞。
21 | - node的事件轮询分为六个阶段,每个阶段都有一个 FIFO(先进先出) 队列来执行回调,事件轮询会依次进入每一个回调队列,当该队列已用尽或达到回调限制,事件循环将移动到下一阶段。
22 | - 六个阶段
23 | 1. timers:用来处理setTimeout() 和 setInterval() 的回调函数
24 | 2. pending callbacks阶段:这个阶段用来处理系统操作的回调函数(可以忽略)
25 | 3. idle prepare阶段:此阶段是仅供nodejs内部操作调用,忽略
26 | 4. poll阶段:这个阶段主要用来处理如IO操作,网络请求等异步操作
27 | - 当poll阶段的回调函数队列不为空的时候,则处理队列中的回调函数,直到队列为空或者达到上限的时候,就跳过此阶段,处理下一阶段。
28 | - 当poll阶段的回调函数队列为空的时候,系统会在此阶段等待新的回调函数入队,再进行处理,但是如果timers阶段有回调函数需要执行,或者check阶段有setImmediate需要执行,则会立马进入下一个阶段
29 | 5. check阶段:这个阶段用来处理setImmediate的回调函数
30 | 6. close callbacks阶段:这个阶段用来处理如socket的close事件
31 |
32 | - 谈一谈宏任务和微任务:
33 | - 异步代码有优先级关系。有的优先级高先执行,有的优先级低后执行。
34 | - 异步代码分为宏任务(macrotask )和微任务(microtask )
35 | - 宏任务:包括整体代码script,setTimeout,setInterval等等
36 | - 微任务: Promise.then/catch/fanally,process.nextTick,queueMicrotask(nodeJS语义化方法,就是微任务的意思)
37 | - js引擎执行异步代码。会优先执行微任务,再执行宏任务
38 | - 微任务优先级高,优先级最高的是process.nextTick,其他微任务,按代码顺序依次执行
39 | - 宏任务优先级低:顺序看nodejs的事件轮询机制
40 | - 过程如下:
41 | 1. 执行栈 选择最先进入队列的宏任务(一般都是script),执行其同步代码直至结束,在执行同步的时候如果有设置异步代码,会把微任务放入微任务队列,把宏任务交给对应的模块管理
42 | 2. 检查是否存在微任务,有则会执行至微任务队列为空;
43 | 3. 执行宏任务中的异步代码(setTimeout等回调)
44 | 4. 执行过程中如果遇到微任务,就将它添加到微任务的任务队列中
45 | 5. 当前的宏任务执行完毕后,立即执行当前微任务队列中的所有微任务(依次执行)
46 | 6. 开始下一个宏任务(从事件队列中获取)
47 |
48 | - 根据提示书写git命令
49 | - 初始化仓库 git init
50 | - 提交到暂存区 git add .
51 | - 提交到本地仓库 git commit -m ''
52 | - 撤销暂存区的提交 git restore .
53 | - 撤销工作区的改动 git restore --staged .
54 | - 对比工作区和暂存区差异 git diff
55 | - 对比暂存区和仓库的差异 git diff --cached
56 | - 查看历史版本 git log
57 | - 回滚其他版本 git reset --hard/--mixed/--soft commitID
58 | - 查看分支 git branch
59 | - 创建并切换分支 git checkout -b branchName
60 | - 切换分支 git checkout branchName
61 | - 删除分支git branch -d branchName
62 | - 合并分支 git merge branchName
63 | - 本地仓库关联远程仓库 git remote add origin '地址'
64 | - 本地仓库提交到远程仓库 git push -u origin master
65 | - 本地仓库拉取远程仓库的更新 git pull origin master
66 | - 本地仓库拉起远程仓库的其他分支 git fetch origin dev:dev
67 |
68 |
--------------------------------------------------------------------------------
/day13-axios/01.axios1.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
80 |
81 |
82 |
--------------------------------------------------------------------------------
/day13-axios/02.axios2.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
88 |
89 |
90 |
--------------------------------------------------------------------------------
/day09-ajax/05.module/02.ES6/build/build.js:
--------------------------------------------------------------------------------
1 | (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i {
22 | //因为并不是每一次的resolve方法都要执行then 所以并不是每一次都有onResolved方法,所以需要判断
23 | _this.callback.onResolved && _this.callback.onResolved(value);
24 | // _this.callback?.onResolved(value);
25 | })
26 |
27 | }
28 |
29 | function reject(reason) {
30 | if (_this.status !== "pending") return;
31 | _this.status = "rejected";
32 | _this.value = reason;
33 | //为了保证then中的onResolved函数永远是异步的,则我们给他包裹一层异步代码
34 | //保证onRejected执行的时候,then要已经执行过了
35 | setTimeout(() => {
36 | _this.callback.onRejected && _this.callback.onRejected(reason);
37 | })
38 | }
39 |
40 | //当构造函数被实例化的时候 exector需要直接触发
41 | exector(resolve, reject);
42 | }
43 |
44 | //then在使用的时候是同步调用了,但是我们可以控制then中的函数是异步调用
45 | myPromise.prototype.then = function (onResolved, onRejected) {
46 | const _this = this;
47 |
48 | //then方法一定会返回一个promise对象
49 | return new myPromise((resolve, reject) => {
50 | //封装两个函数onResolved,onRejected 给到实例化对象,让promise中的resolve和reject之后调用
51 | _this.callback.onResolved = function (value) {
52 | //当callback的函数调用之后,我们让then中的onResolved执行,拿到返回值,因为我们then的返回值要看回调函数的返回值
53 | //但是onResolved调用可能会报错,如果报错,则直接返回一个失败的promise对象,值是报错信息
54 | try {
55 | const re = onResolved(value);
56 | //判断onResolved返回值是promise对象吗
57 | if (re instanceof myPromise) {
58 | //如果re是promise对象,re成功则调用resolve re失败则调用reject
59 | //不能通过re.status判断re是成功还是失败,因为onResolved函数调用的时候,内部可能有异步代码改变promise状态
60 | //在这里可以直接使用then来监听re是成功还是失败
61 | re.then(function (data) {
62 | resolve(data);
63 | }, function (reason) {
64 | reject(reason)
65 | })
66 | } else {
67 | resolve(re);
68 | }
69 | } catch (e) {
70 | //当then中的方法出错,则直接调用reject返回失败的promise对象
71 | reject(e);
72 | }
73 |
74 | };
75 | _this.callback.onRejected = function (reason) {
76 | try {
77 | const re = onRejected(reason);
78 | if (re instanceof myPromise) {
79 | re.then((value) => {
80 | resolve(value)
81 | }, (reason) => {
82 | reject(reason)
83 | })
84 | } else {
85 | resolve(re)
86 | }
87 | } catch (e) {
88 | reject(e);
89 | }
90 | };
91 | });
92 |
93 | }
--------------------------------------------------------------------------------
/day13-axios/04.axios.create.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
103 |
104 |
105 |
--------------------------------------------------------------------------------
/day08-node08/04.ajax/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
19 |
87 |
88 |
89 |
--------------------------------------------------------------------------------
/day11-gulp/01.gulp/gulpfile.js:
--------------------------------------------------------------------------------
1 | const {
2 | series,
3 | parallel
4 | } = require('gulp');
5 | const gulp = require('gulp');
6 | const babel = require('gulp-babel');
7 | const browserify = require('gulp-browserify');
8 | const rename = require('gulp-rename');
9 | const less = require('gulp-less');
10 | const concat = require('gulp-concat');
11 | const connect = require('gulp-connect');
12 | const uglify = require('gulp-uglify');
13 | const cssmin = require('gulp-cssmin');
14 | const htmlmin = require('gulp-htmlmin');
15 |
16 | const {
17 | exec
18 | } = require("child_process");
19 |
20 | //使用task定义一个任务 规定任务名
21 | gulp.task('babel', () =>
22 | gulp.src('./src/js/*js') //把某个文件夹的文件读取出来一个可读流
23 | .pipe(babel({
24 | //把ES6代码编译为ES6
25 | //把ES6模块化规范编译为CommonJS规范
26 | presets: ['@babel/env']
27 | }))
28 | .pipe(gulp.dest('./dist/js')) //把处理的流写入到某个文件夹
29 | .pipe(connect.reload())
30 | );
31 |
32 |
33 |
34 |
35 | //browserify配置
36 | gulp.task('browserify', function () {
37 | return gulp.src('./dist/js/index.js')
38 | .pipe(browserify({
39 | insertGlobals: true,
40 | }))
41 | .pipe(rename('build.js'))
42 | .pipe(gulp.dest('./dist/js'))
43 | .pipe(connect.reload())
44 | });
45 |
46 |
47 | //less配置
48 | gulp.task('less', function () {
49 | return gulp.src('./src/less/*.less')
50 | .pipe(less())
51 | .pipe(concat("all.css"))
52 | .pipe(gulp.dest('./dist/css'))
53 | .pipe(connect.reload())
54 | });
55 |
56 | //html配置
57 | gulp.task("html", function () {
58 | return gulp.src("./src/index.html")
59 | .pipe(gulp.dest("./dist"))
60 | .pipe(connect.reload())
61 | })
62 |
63 | //服务器配置
64 | gulp.task('connect', function () {
65 | connect.server({
66 | port: 8888,
67 | root: ['./dist'], //暴露的目录
68 | livereload: true //开启自动刷新
69 | });
70 |
71 | //自动打开浏览器
72 | exec("start http://127.0.0.1:8888")
73 |
74 | //自动监视文件的变化
75 | gulp.watch("./src/js/*.js", gulp.series(['js-dev']));
76 | gulp.watch("./src/less/*.less", gulp.series(['less']));
77 | gulp.watch("./src/index.html", gulp.series(['html']));
78 | });
79 |
80 |
81 | gulp.task("uglify", function () {
82 | return gulp
83 | .src("./dist/js/build.js")
84 | .pipe(uglify())
85 | .pipe(rename("build.min.js"))
86 | .pipe(gulp.dest("./dist/js"))
87 | })
88 |
89 | gulp.task('cssmin', function () {
90 | return gulp.src('./dist/css/*.css')
91 | .pipe(cssmin())
92 | .pipe(rename("all.min.css"))
93 | .pipe(gulp.dest('./dist/css'));
94 | });
95 |
96 |
97 | gulp.task('htmlmin', () => {
98 | return gulp.src('./src/index.html')
99 | .pipe(htmlmin({
100 | collapseWhitespace: true,
101 | removeComments: true
102 | }))
103 | .pipe(gulp.dest('./dist'));
104 | });
105 |
106 |
107 |
108 | //统一js任务配置
109 | //series()方法可以整合多个任务,并且是会按照顺序依次执行
110 | gulp.task("js-dev", series(['babel', 'browserify']))
111 |
112 | //统一配置 js html less
113 | // parallel方法可以整合多个任务,并且是并行执行的 优点是:速度快
114 | gulp.task("dev", parallel(["js-dev", "html", "less"]))
115 |
116 | //开发环境的统一配置
117 | gulp.task("watch", series(['dev', 'connect']))
118 |
119 |
120 | //生产环境的统一配置
121 | gulp.task("js-prod", series(['js-dev', 'uglify']))
122 | gulp.task("css-prod", series(['less', 'cssmin']))
123 | gulp.task("build", parallel(['js-prod', 'css-prod', 'htmlmin']))
--------------------------------------------------------------------------------
/day13-axios/03.封装axios.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
111 |
112 |
113 |
--------------------------------------------------------------------------------
/day10-手写promise/04.catch方法.js:
--------------------------------------------------------------------------------
1 | //构造一个myPromise的类
2 |
3 | //exector是默认的回调函数
4 | function myPromise(exector) {
5 | //保存指向实例化对象的this
6 | const _this = this;
7 | //给实例化对象扩展两个属性值 status value
8 | //默认status是pending 默认value是undefined
9 | _this.status = "pending";
10 | _this.value = undefined;
11 | _this.callback = {};
12 |
13 | //封装resolve和reject函数,当promise的回调函数触发的时候传递进去
14 | function resolve(value) {
15 | if (_this.status !== "pending") return;
16 | _this.status = "resolved";
17 | _this.value = value;
18 |
19 | //为了保证then中的onResolved函数永远是异步的,则我们给他包裹一层异步代码
20 | //保证onRejected执行的时候,then要已经执行过了
21 | setTimeout(() => {
22 | //因为并不是每一次的resolve方法都要执行then 所以并不是每一次都有onResolved方法,所以需要判断
23 | _this.callback.onResolved && _this.callback.onResolved(value);
24 | // _this.callback?.onResolved(value);
25 | })
26 |
27 | }
28 |
29 | function reject(reason) {
30 | if (_this.status !== "pending") return;
31 | _this.status = "rejected";
32 | _this.value = reason;
33 | //为了保证then中的onResolved函数永远是异步的,则我们给他包裹一层异步代码
34 | //保证onRejected执行的时候,then要已经执行过了
35 | setTimeout(() => {
36 | _this.callback.onRejected && _this.callback.onRejected(reason);
37 | })
38 | }
39 |
40 | //当构造函数被实例化的时候 exector需要直接触发
41 | exector(resolve, reject);
42 | }
43 |
44 | //then在使用的时候是同步调用了,但是我们可以控制then中的函数是异步调用
45 | myPromise.prototype.then = function (onResolved, onRejected) {
46 | const _this = this;
47 |
48 | //用户在then的时候 可能不传递第二个参数函数,所以我们需要进行一个处理
49 | onRejected = typeof onRejected !== "function" ? function (reason) {
50 | //如果用户没有传递第二个参数,则我们处理第二个参数的时候,直接把调用then的失败的信息返回即可
51 | throw reason;
52 | } : onRejected;
53 |
54 | //catch其实就是then不传递第一个参数,但是可能会有成功的promise调用catch,需要对第一个参数处理
55 | onResolved = typeof onResolved !== "function" ? function (value) {
56 | return value;
57 | } : onResolved;
58 |
59 | //then方法一定会返回一个promise对象
60 | return new myPromise((resolve, reject) => {
61 | //封装两个函数onResolved,onRejected 给到实例化对象,让promise中的resolve和reject之后调用
62 | _this.callback.onResolved = function (value) {
63 | //当callback的函数调用之后,我们让then中的onResolved执行,拿到返回值,因为我们then的返回值要看回调函数的返回值
64 | //但是onResolved调用可能会报错,如果报错,则直接返回一个失败的promise对象,值是报错信息
65 | try {
66 | const re = onResolved(value);
67 | //判断onResolved返回值是promise对象吗
68 | if (re instanceof myPromise) {
69 | //如果re是promise对象,re成功则调用resolve re失败则调用reject
70 | //不能通过re.status判断re是成功还是失败,因为onResolved函数调用的时候,内部可能有异步代码改变promise状态
71 | //在这里可以直接使用then来监听re是成功还是失败
72 | re.then(function (data) {
73 | resolve(data);
74 | }, function (reason) {
75 | reject(reason)
76 | })
77 | } else {
78 | resolve(re);
79 | }
80 | } catch (e) {
81 | //当then中的方法出错,则直接调用reject返回失败的promise对象
82 | reject(e);
83 | }
84 |
85 | };
86 | _this.callback.onRejected = function (reason) {
87 | try {
88 | const re = onRejected(reason);
89 | if (re instanceof myPromise) {
90 | re.then((value) => {
91 | resolve(value)
92 | }, (reason) => {
93 | reject(reason)
94 | })
95 | } else {
96 | resolve(re)
97 | }
98 | } catch (e) {
99 | reject(e);
100 | }
101 | };
102 | });
103 |
104 | }
105 |
106 |
107 | //catch处理
108 | myPromise.prototype.catch = function (onRejected) {
109 | return this.then(null, onRejected);
110 | }
--------------------------------------------------------------------------------
/day06-nodejs06/03.中间件/server.js:
--------------------------------------------------------------------------------
1 | //引入express
2 | const express = require("express");
3 |
4 | //创建一个express的application对象
5 | const app = express();
6 |
7 | //引入path
8 | const path = require("path");
9 |
10 | //引入mongoose
11 | const mongoose = require("mongoose");
12 |
13 | //引入ejs
14 | // const ejs = require("ejs");
15 |
16 | //通知express使用ejs模板引擎
17 | app.set("view engine", "ejs");
18 | app.set("views", "views");
19 |
20 | //连接数据库
21 | require("./db")
22 |
23 | //引入mongoose的当前用户信息集合
24 | const userModel = require("./model/userModel");
25 |
26 |
27 | //官方的静态资源中间件
28 | app.use(express.static("./public"));
29 | app.use(express.static("./static"));
30 |
31 | //处理req请求携带的数据的中间件,把req的数据放在了req.body的属性上了
32 | app.use(express.urlencoded({
33 | extended: true
34 | }))
35 |
36 |
37 | //处理账号和密码是否为空的中间件
38 | app.use((req, res, next) => {
39 | //查看用户输入内容 拿到用户名和密码
40 | const {
41 | username,
42 | password
43 | } = req.query;
44 |
45 | //查看用户的账号和密码是否为空
46 | if (!username || !password) {
47 | //拼接err.ejs的路径
48 | const filePath = path.resolve(__dirname, "./public/err.ejs");
49 | return res.render(filePath, {
50 | errData: "账号或者密码不能为空"
51 | })
52 | }
53 |
54 | //当处理完成需要继续向下走的话 需要调用next方法
55 | next();
56 | })
57 |
58 | //处理账号和密码的正则校验
59 | app.use((req, res, next) => {
60 | //查看用户输入内容 拿到用户名和密码
61 | const {
62 | username,
63 | password
64 | } = req.query;
65 |
66 | const userReg = /^[A-Z]{1}[0-9a-zA-Z_]{6,10}$/;
67 | const passReg = /^[0-9]{6}$/;
68 | if (!userReg.test(username) || !passReg.test(password)) {
69 | //拼接err.ejs的路径
70 | const filePath = path.resolve(__dirname, "./public/err.ejs");
71 | return res.render(filePath, {
72 | errData: "账号和密码格式不对"
73 | })
74 | }
75 |
76 | next();
77 |
78 | })
79 |
80 | //注册接口
81 | app.get("/register", async (req, res) => {
82 | //查看用户输入内容 拿到用户名和密码
83 | const {
84 | username,
85 | password
86 | } = req.query;
87 |
88 |
89 | //判断当前的用户名是否被注册
90 | //去数据库查询当前的用户名
91 | const isHasUser = await userModel.findOne({
92 | username
93 | })
94 |
95 | if (isHasUser) {
96 | //拼接err.ejs的路径
97 | const filePath = path.resolve(__dirname, "./public/err.ejs");
98 | return res.render(filePath, {
99 | errData: "用户名已经被注册"
100 | })
101 | };
102 |
103 |
104 | //向数据库写入当前用户信息
105 | const registerData = await userModel.create({
106 | username,
107 | password
108 | });
109 |
110 | console.log(registerData)
111 | // res.send("注册成功");
112 | //如果注册成功则直接重定向到登录页面
113 | res.redirect("/login.html")
114 |
115 | })
116 |
117 | //登录接口
118 | app.get("/login", async (req, res) => {
119 | //拿到用户的登录信息
120 | const {
121 | username,
122 | password
123 | } = req.query;
124 |
125 |
126 | //根据username去数据库查询是否存在该用户
127 | const isHasUser = await userModel.findOne({
128 | username
129 | });
130 |
131 | //如果有没有用户名则返回用户名不存在
132 | console.log(isHasUser) //如果不存在则返回null
133 | if (!isHasUser) {
134 | //拼接err.ejs的路径
135 | const filePath = path.resolve(__dirname, "./public/err.ejs");
136 | return res.render(filePath, {
137 | errData: "用户名不存在"
138 | })
139 | }
140 |
141 | //如果用户名存在,则判断密码是否正确
142 | if (isHasUser.password != password) {
143 | //拼接err.ejs的路径
144 | const filePath = path.resolve(__dirname, "./public/err.ejs");
145 | return res.render(filePath, {
146 | errData: "密码错误"
147 | })
148 | }
149 |
150 | // return res.send("登录成功")
151 | //登录成功跳转到个人中心页
152 | const filePath = path.resolve(__dirname, "./public/center.html")
153 | res.sendFile(filePath);
154 | })
155 |
156 |
157 |
158 | //监听端口号和服务器状态
159 | let port = "3002";
160 | app.listen(port, err => {
161 | if (err) {
162 | console.log(err);
163 | return;
164 | }
165 |
166 | console.log("服务器启动,请访问" + ` http://127.0.0.1:${port}`);
167 | })
--------------------------------------------------------------------------------
/day06-nodejs06/02.login/server.js:
--------------------------------------------------------------------------------
1 | //引入express
2 | const express = require("express");
3 |
4 | //创建一个express的application对象
5 | const app = express();
6 |
7 | //引入path
8 | const path = require("path");
9 |
10 | //引入mongoose
11 | const mongoose = require("mongoose");
12 |
13 | //引入ejs
14 | const ejs = require("ejs");
15 |
16 | //通知express使用ejs模板引擎
17 | app.set("view engine", "ejs");
18 | app.set("views", "views");
19 |
20 | //连接数据库
21 | require("./db")
22 |
23 | //引入mongoose的当前用户信息集合
24 | const userModel = require("./model/userModel");
25 |
26 |
27 |
28 | //注册接口
29 | app.get("/register", async (req, res) => {
30 | //查看用户输入内容 拿到用户名和密码
31 | console.log(req.query);
32 | const {
33 | username,
34 | password
35 | } = req.query;
36 |
37 | //查看用户的账号和密码是否为空
38 | if (!username || !password) {
39 | //拼接err.ejs的路径
40 | const filePath = path.resolve(__dirname, "./public/err.ejs");
41 | return res.render(filePath, {
42 | errData: "账号或者密码不能为空"
43 | })
44 | }
45 |
46 | //判断当前的用户名是否被注册
47 | //去数据库查询当前的用户名
48 | const isHasUser = await userModel.findOne({
49 | username
50 | })
51 |
52 | if (isHasUser) {
53 | //拼接err.ejs的路径
54 | const filePath = path.resolve(__dirname, "./public/err.ejs");
55 | return res.render(filePath, {
56 | errData: "用户名已经被注册"
57 | })
58 | };
59 |
60 |
61 | //向数据库写入当前用户信息
62 | const registerData = await userModel.create({
63 | username,
64 | password
65 | });
66 |
67 | console.log(registerData)
68 | // res.send("注册成功");
69 | //如果注册成功则直接重定向到登录页面
70 | res.redirect("/login.html")
71 |
72 | })
73 |
74 | //登录接口
75 | app.get("/login", async (req, res) => {
76 | //拿到用户的登录信息
77 | const {
78 | username,
79 | password
80 | } = req.query;
81 |
82 | //查看用户的账号和密码是否为空
83 | if (!username || !password) {
84 | //拼接err.ejs的路径
85 | const filePath = path.resolve(__dirname, "./public/err.ejs");
86 | return res.render(filePath, {
87 | errData: "账号或者密码不能为空"
88 | })
89 | };
90 |
91 | //根据username去数据库查询是否存在该用户
92 | const isHasUser = await userModel.findOne({
93 | username
94 | });
95 |
96 | //如果有没有用户名则返回用户名不存在
97 | console.log(isHasUser) //如果不存在则返回null
98 | if (!isHasUser) {
99 | //拼接err.ejs的路径
100 | const filePath = path.resolve(__dirname, "./public/err.ejs");
101 | return res.render(filePath, {
102 | errData: "用户名不存在"
103 | })
104 | }
105 |
106 | //如果用户名存在,则判断密码是否正确
107 | if (isHasUser.password != password) {
108 | //拼接err.ejs的路径
109 | const filePath = path.resolve(__dirname, "./public/err.ejs");
110 | return res.render(filePath, {
111 | errData: "密码错误"
112 | })
113 | }
114 |
115 | // return res.send("登录成功")
116 | //登录成功跳转到个人中心页
117 | const filePath = path.resolve(__dirname, "./public/center.html")
118 | res.sendFile(filePath);
119 | })
120 |
121 |
122 | //图片接口
123 | app.get("/static/:src", (req, res) => {
124 | // console.log(req.params)
125 | const {
126 | src
127 | } = req.params;
128 |
129 | const filePath = path.resolve(__dirname, "./static", src);
130 | res.sendFile(filePath);
131 | })
132 |
133 |
134 |
135 | //默认路径是index.html
136 | app.get("/", (req, res) => {
137 | //当访问根目录则默认重定向到index.html
138 | res.redirect("/index.html")
139 | })
140 | //index.html的路径
141 | app.get("/index.html", (req, res) => {
142 | //获取index.html的路径
143 | const filePath = path.resolve(__dirname, "./public/index.html");
144 | res.sendFile(filePath);
145 | })
146 | //login.html的路径
147 | app.get("/login.html", (req, res) => {
148 | //获取index.html的路径
149 | const filePath = path.resolve(__dirname, "./public/login.html");
150 | res.sendFile(filePath);
151 | })
152 | //register.html的路径
153 | app.get("/register.html", (req, res) => {
154 | //获取index.html的路径
155 | const filePath = path.resolve(__dirname, "./public/register.html");
156 | res.sendFile(filePath);
157 | })
158 |
159 |
160 | //监听端口号和服务器状态
161 | let port = "3002";
162 | app.listen(port, err => {
163 | if (err) {
164 | console.log(err);
165 | return;
166 | }
167 |
168 | console.log("服务器启动,请访问" + ` http://127.0.0.1:${port}`);
169 | })
--------------------------------------------------------------------------------