Git代码管理工具

Git

分布式的版本控制系统

1.常用命令

$ git init # 初始化仓库
$ git status # 查看版本库状态
$ git add . # 添加到暂存区
$ git commit -m 'feat: message' # 提交到本地仓库
$ git log # 日志
$ git clone repo.git # 克隆远程中央仓库到本地
$ git push origin master # 将本地版本库推送到远程中央仓库中
$ git remote add origin repo.git # 将本地仓库与远程中央仓库关联
$ git pull origin master # 将远程分支中最新代码拉取到本地
# ..........

分支:

$ git branch <branch-name> # 创建分支
$ git checkout <branch-name> # 切换分支
$ git checkout -b <branch-name> # 创建并切换到新分支
# ...........

2.SSH Key

用于本地与远程中央仓库连接认证(不用每次输入用户名与密码)。

本地生成 ssk key 所需要使用到的 rsa 公私钥密钥对:

$ ssh-keygen

执行命令时,一路回车完成文件创建,默认在 系统用户目录下,会生成 .ssh 目录,在该目录下有两个文件:id_rsaid_rsa.pub。打开 id_rsa.pub 公钥文件,复制所有内容。

在远程中央仓库用户账号中配置:

个人头像 --> 设置 --> 左侧 安全设置下 SSH公钥 --> 粘贴复制的 id_rsa.pub 文件内容 --> 确定 --> 确认密码 --> 添加成功

配置完成后,可测试是否配置成功:

$ ssh -T git@gitee.com

看到类似如下信息,则说明配置成功:

Hi 小明! You've successfully authenticated, but GITEE.COM does not provide shell access.

Nodejs

官网

中文文档 【读后端文档】

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时。

“Ryan Dahl 现在是 Google Brain 的一个软件工程师。他是 Node.js 之父,Node.js 是一个基于 Chrome V8 JavaScript 引擎的 JS 运行环境。”

Nodejs版本 => 偶数稳定 | 奇数开发版本

1.npm

node package manager - node 包资源管理器

  • cnpm npm install -g cnpm

  • yarn npm i -g yarn

安装包

$ npm install <package-name@version> --save-dev
# 或
$ yarn add <package-name@version> --dev
# 或
$ cnpm install <package-name>
  • --save 是将安装包资源信息保存到 package.json 中的 dependencies 字段中,而 --save-dev 是保存到 devDependencies 中。--save 可以简写为 -S--save-dev 可简写为 -D

NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题

$ npm -v # 检测安装是否成功
$ yarn -v # 检测安装是否成功
$ npm i <Module Name> # 安装软件包
$ npm uninstall <package-name> # 卸载npm软件包
软件包是全局安装的,则需要添加 -g--global 标志:
$ npm uninstall -g <package-name>

2.package.json

项目描述文件 =>记录安装的依赖包

$ npm init -y # 初始化生成package.json文件

npm scripts

在 package.json 文件中,有一个 scripts 字段,可以在命令行中使用 npm run 来执行这个字段中的脚本:

{
  "scripts": {
    "start": "node ./bin/www",
    "dev": "node ./bin/www",
    "serve": "node ./bin/www"
  },
}

可执行

$ npm run start # 对于 start 任务,可省略 run 的书写:npm start
$ npm run dev
$ npm run serve

3.bs请求响应模式

Broswer浏览器

Server服务器

B/S 请求-响应模式

Client客户端

Node.js 创建第一个应用

端口号范围 0-65535,前1024端口为系统预留

  • http 80端口

  • https 443端口

  • 浏览器chrome测试中,不要监听6666端口

  • js是单线程 JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如两个线程同时操作一个dom。

nodejs.js 文件内容如下:

//使用 require 指令来载入 http 模块
const http = require('http');
//使用 fs 模块,来读取文件
const fs = require('fs')
//nodemon 自动重启文件
//创建服务器
http.createServer(function (request, response) {
    //监听到客户端请求时,会自动调用该回调函数处理请求并返回响应
    const {
        url,
        method
    } = request
    console.log('url', url, 'method', method)

    //服务端路由的处理 繁琐
    let html = 'hello Nodejs'
    switch (url) {
        case '/index.html':
            html = fs.readFileSync('index.html')
            break;
        case '/login.html':
            html = 'html'
            break;

    }
    //发动http头部
    //http状态值:200:ok
    //内容类型:text/plain
    response.writeHead(200, {
        'Content-Type': 'text/plain'  //纯文本格式
    });


    //发送响应数据
    response.end(html)

    //监听端口,等待客户端链接
}).listen(8888);

//终端打印信息如下
console.log('Server running at http://127.0.0.1:8888/')

4.模块化

模块化规范:

前端模块化开发中:一个js文件就是一个模块,在js文件模块中定义的数据是私有的, 可以向外部暴露数据和方法,其它js文件模块可以引入暴露的方法数据进行使用

  • AMD - require.js
  • CMD - sea.js
  • commonJS - NodeJS (引入依赖模块require() ,moudle.exports定义导出模块 )
  • ES6 - import / export

5.nodemon

这是一个能够监视文件变化,在文件变化后自动重启node应用的工具

$ npm i nodemon -g

6.核心模块

nodejs官网

oop 面向对象编程

oo 面向对象

  • os-操作系统

  • globa-全局变量:

    setTimeout/setInterval/require()/module/__dirname/__filename 
    
  • path-路径

  • http-http模块

  • fs-文件系统

  • querystring-查询字符串 - 作用 向后端传递参数数据,请求数据

  • events - 事件

Express

express中文网 -

基于 Node.js 平台,快速、开放、极简的 Web 开发框架

0.安装

$ npm i express  #安装
# 或
$ yarn add express

1.使用

1.利用express搭建服务器

  • req.body 使用中间件,用于解析处理post请求主体的数据 =>req.body
  • req.query 请求路由,get请求获取url中的请求参数
  • express.static(‘public’) 使用中间件,托管静态资源将 public 目录下的图片、CSS 文件、JavaScript 文件对外开放访问了
//引入express模块
const express = require('express')

//创建Express 应用实例
const app = express()

// 使用中间件,用于解析处理请求主体的数据 =>req.body
app.use(express.json()) // for parsing application/json
app.use(express.urlencoded({
    extended: true // 普通文本数据
})) // for parsing application/x-www-form-urlencoded

// 使用中间件,托管静态资源将 public 目录下的图片、CSS 文件、JavaScript 文件对外开放访问了
// 如果要使用多个静态资源目录,请多次调用 express.static 中间件函数:
//Express 在静态目录查找文件,因此,存放静态文件的目录名不会出现在 URL 中。
app.use(express.static('public')) //=>url直接访问对应页面


/* 处理路由 */
// 处理 GET 请求
// app.get('/', (req, res) => {
//     /*此应用程序启动一个服务器并在端口 3000 上侦听连接。该应用程序响应“Hello World!” 对根 URL ( /) 或路由的请求。对于其他所有路径,它将以404 Not Found响应。 */
//     // res.send('你好!Express!!!')

//     // console.log('__dirname:',__dirname)
//     // // res.sendFile('public/index.html') => 绝对路径
//     // //TypeError: path must be absolute or specify root to res.sendFile
//     // res.sendFile(__dirname + '/public/index.html')

//     // res.json({
//     //     code:200,
//     //     data:{
//     //         usesrInfo:{
//     //             name:'张三',
//     //             age:18
//     //         }
//     //     }
//     // })   
// })

//处理post请求
app.post('/api/login.do', (req, res) => {
    //获取请求主体的数据
    console.log('BODY', req.body); //BODY undefined => express官网 Api参考手册
    const {
        username,
        password
    } = req.body

    // TODO: 进行数据库验证
    // TODO:::::
    res.send('处理用户登录')

})

// 处理get请求
app.get('/api/login.do', (req, res) => {
    //获取请求主体的数据
    console.log('BODY', req.query); //BODY undefined => express官网 Api参考手册
    const {
        username,
        password
    } = req.query

    // TODO: 进行数据库验证
    // TODO:::::
    res.send('处理用户登录1')

})

app.listen(9527, () => {
    console.log('Example app Listening on port 9527')
})

2.Express 应用程序生成器

1.建立文件夹,打开bash,输入命令

$npx express-generator 
$npm i  
$npm run start #运行文件
  • npx是个非常强大的命令

  • 引入核心模块 | 第三方包,直接写名字;引入自己的文件模块,写路径

  • 中间件(本质函数)功能是按顺序执行的,因此中间件包含的顺序很重要。

app.use(function(err, req, res, next)

next=>这个中间件执行完毕,能否进到下一步。有next,进行下一步,没有next,中断

2.文件准备

  • 建立文件 public/register.html
<h1>用户</h1>
   <form action="/api/users/register.do" method="post">
        <input type="text" name="username"><br>
        <input type="text" name="password"><br>
        <button>注册</button>
   </form>

<!--app.js文件-->
app.use('/api/users', usersRouter);//访问api/users下的资源

=>访问 http://localhost:3000/register.html => 确定 =>Not Found 404

  • users.js文件
//处理用户注册,完整url:/api/users/register.do
router.post('/register.do', function(req, res) {
  const {username,password} = req.body //post请求包主体
  console.log(req.body);
  res.json({
    username,
    password
  })
  res.send('处理用户注册');
});

=>访问 http://localhost:3000/register.html => 确定 => 处理用户注册

3.连接数据库=>复制首页案例

$ npm i mongoose
  • users.js文件
//处理用户注册,完整url:/api/users/register.do
router.post('/register.do', function (req, res) {
  const {
    username,
    password
  } = req.body

  //保存到数据库中 <mogodb需要先服务运行,看任务管理器>
  const mongoose = require('mongoose'); //引入mongoose连接数据库
  mongoose.connect('mongodb://localhost/save'); //连接数据库 save

  //创建model
  const Cat = mongoose.model('Cat', {
    username: String,
    password: String,
  });
  //创建实例 -- 文档
  const kitty = new Cat({
    username,
    password,
  });
  //保存到数据库
  kitty.save().then((data) => {
    console.log(data, 'meow保存成功')
    //响应,返回给浏览器JSON格式额数据
    res.json({
     code:200,
     data:{
      username,
      password
     }
    })
  });

=>访问 http://localhost:3000/register.html => 确定 => mongodb数据库存入用户信息

  • 不能重复创建 Cannot overwrite Cat model once compiled. 500
  • 创建文件moudles/user.js =>引入公共部分,为了重复创建

4.user.js文件 && 修改后的users.js文件

  • user.js文件
const mongoose = require('mongoose');
//创建model

  module.exports = mongoose.model('Cat', {
    username: String,
    password: String,
  });
  • 修改后的users.js文件
const Cat = require('../moudel/user') //引入公共的创建对象

//处理用户注册,完整url:/api/users/register.do
router.post('/register.do', function (req, res) {
  const {
    username,
    password
  } = req.body

  //保存到数据库中 <mogodb需要先服务运行,看任务管理器>
  const mongoose = require('mongoose'); //引入mongoose连接数据库
  mongoose.connect('mongodb://localhost/save'); //连接数据库 save

  //创建model 删除
  // const Cat = mongoose.model('Cat', {
  //   username: String,
  //   password: String,
  // });
 
  //创建实例 -- 文档
  const kitty = new Cat({
    username,
    password,
  });
  //保存到数据库
  kitty.save().then((data) => {
    console.log(data, 'meow保存成功')
    //响应,返回给浏览器JSON格式额数据
    res.json({
     code:200,
     data:{
      username,
      password
     }
    })
  });
});
module.exports = router; //导出路由对象

mongoDB-数据库

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-875P1gEx-1669703515627)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1651717980974.png)]

0. 安装 (菜鸟教程)

1.配置环境变量

安装目录下-bin ( 复制路径地址 )

我的电脑-鼠标右键-属性-高级系统设置-环境变量-path-编辑-新建-确定 (目录放进去)

配置完毕后,重新打开新的cmd提示

$ mongod --version

2.启动mongoDb服务

注意,windows 10,如果在服务中,mongoDb服务状态是正在运行,则不需要此操作

命令行执行:

$ mongod --dbpath <path-name>
  • 是数据文件的保存路径,该路径需要事先创建好

  • 启动服务后,命令窗口中的任务并没结束,请不要关闭( 关闭窗口,则服务停止 )

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gz9chTsg-1669703515628)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1651719848981.png)]

启动成功状态如上:

$ mongo

3.数据库概念

  • database:数据库,容器,用于保存管理数据
  • collection:集合(类似于 MySQL 中 table)
  • document:文档(类似于 MySQL table 中的 row)
  • primary key: 主键,唯一标识,默认 _id 为主键字段

robo3t可视化软件 常用

4.常用命令

  • show dbs:显示所有数据库

  • db:查看当前所在数据库,默认为test

  • use db-name:切换数据库

  • db.createCollection(coll-name集合名):创建集合 = 表

CRUD - CreateReadUpdateDelete

  • db.coll-name.insert() : 向集合中插入文档
  • db.coll-name.find() :查找集合中的文档
  • db.coll-name.updata() :修改集合中的文档
  • db,coll-name.remove() :删除集合中的文档

5.mongoose

用于在 NodeJS 应用中连接 MongoDB 数据库

官网

安装

$ npm i mongoose
# 或
$ yarn add mongoose

数据库

mysql数据库 - 连接数据库 -> Sequelize 【关系型】

mongodb数据库 - 连接 - mongoose 【非关系型】

RESTful

Node.js RESTful API

RESTful 架构详解

REST即表述性状态传递,是一套软件架构风格。是一组约束条件与原则,满足这些约束条件和原则的应用程序或设计就是RESTful。 REST 通常使用 JSON 数据格式。

虽然REST本身受Web技术的影响很深, 但是理论上REST架构风格并不是绑定在HTTP上,只不过目前HTTP是唯一与REST相关的实例。 所以我们这里描述的REST也是通过HTTP实现的REST。

资源与URI

任何事物,只要有被引用到的必要,它就是一个资源。资源可以是实体(例如手机号码),也可以只是一个抽象概念(例如价值) 。

要让一个资源可以被识别,需要有个唯一标识,在Web中这个唯一标识就是URI (Uniform Resource Identifier)。

统一资源接口

接口应该使用标准的HTTP方法如GET,PUT和POST,并遵循这些方法的语义。

  • GET - 查询
  • POST - 添加
  • PUT - 修改
  • DELETE - 删除

使用案例

当后端未开发完成接口文档的时候,前端需要接口进行数据测试,就用到以下两种方式进行接口测试

  • Express 应用程序生成器

1.postman软件|插件使用

  • day03 - user-management1 routes - users.js - 使用postman请求
1.app.js =>
	app.use('/api/users', usersRouter);
2.routes/user.js =>
	/* GET */
    router.get('/', function(req, res, next) {
      res.send('get1111');
    });
    router.post('/', function(req, res, next) {
      res.send('post2222');
    });
3.postman插件 输入完整地址
	http://127.0.0.1:3000/api/users

2.REST client => vscode插件

  • day03 - user-management1 - users.http
    http消息结构=>菜鸟教程
  • 占用资源小
1.moudle/user.http =>
	### get
    GET http://127.0.0.1:3000/api/users  HTTP/1.1

    ### post
    POST http://127.0.0.1:3000/api/users   HTTP/1.1
2.点击send

用户管理系统创建

1.快速搭建服务器 => Express应用程序生成器

$npx express-generator
$npm i  => node_modules文件夹

2.moogoose官网- 阅读文档 -schemas

  • 新建文件model/user.js

  • $ npm install mongoose

    const mongoose = require('mongoose');
    
    //1.定义一个schemas 表结构的项
    const Schema = mongoose.Schema;
    
    var userSchema = new Schema({
      username: String,
      password: String,
      sex: String,
      address: String,
      headerImg: String,
    });
    
    //2.创建一个实例model
    var userModel = mongoose.model('user', userSchema);
    
    //3.导出模块
    module.exports = userModel;
    

3.app.js => 连接mongodb数据库

//02.连接mongo数据库
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/test');


app.use('/api/users', usersRouter); 
  • test是默认数据库

4.routes/users.js => 数据库添加删除修改查找用户数据

  • post从请求主体中获取待添加用户的数据 req.body
  • modle方法检索
const User = require('../moudles/user') //引入模块实例
const CryptoJS = require('crypto-js') //引入加密包
/**
 * 获取用户信息 get 完整地址:http://127.0.0.1:3000/api/users
 * 如果传入参数id,则查找确认id的用户
 * 如果没有传入参数id,则根据页数,每页数据查找用户
 * :_id? => 是否有参数都可以 正则表达式
 */
router.get('/:_id?', function (req, res, next) {
  //获取用户id
  const {
    _id
  } = req.params
  //查找用户id
  if (_id) {
    // 有 _id,则查询单个用户数据
    User.findById(_id) 
      .then(data => {
        res.json({
          code: 200,
          data
        })
      })
  }else{
    // 没有 _id,则分页查询数据
    // 从查询字符串中获取分页页码与每页记录数
    const {page,pageSize} = req.query
    User.find()
    .limit(pageSize)
    .skip((page-1)*pageSize)
    .then(data=>{
      res.json({
        code:200,
        data
      })
    })
    

  }
  // res.send('get');
});
/**
 * 添加保存用户信息 post 完整地址:api/users
 */
router.post('/', function (req, res, next) {

  //post从请求主体中获取待添加用户的数据
  const {
    username,
    password,
    sex,
    address,
    phone
  } = req.body

  //1.判断用户名|密码是否填写
  if (!username || !password) {
    res.json({
      code: 400,
      data: null,
      message: '用户名与密码为必填项'
    })
    return;
  }
  // res.send('post');

  //2.判断数据库中用户名是否已经注册,是则提示错误;否,则保存用户信息到数据库中
  User
    .findOne({
      username
    })
    .then(data => {
      // console.log("查寻数据库结果:", data); //查结果: []
      if (!data) {
        //不存在用户,则可以保存到数据库中
        //3.密码加密 MD5 => npm i crypto-js 
        const hash = CryptoJS.MD5(password).toString()
        new User({
            username,
            password: hash,
            sex,
            address,
            phone
          })
          .save() //保存到数据库中
          .then(data => {
            res.json({
              code: 200,
              data: {
                id: data.__id,
                username
              }

            })
          })
      } else {
        //用户存在,提示用户错误
        res.json({
          code: 400,
          data: null,
          message: "用户已注册,请修改您的用户名"
        })
      }
    })

});


/**
 * 修改用户信息 get 
 * 完整URL: /api/users/123497124
 * :_id 定义的是动态路径参数
 */
router.put('/:_id', function (req, res, next) {
  // 从请求的路径参数中获取待修改用户的主键值
  const {
    _id
  } = req.params
  // 从请求主体中获取修改后的数据
  const {
    sex,
    phone,
    address
  } = req.body
  // 修改数据库中的数据
  User.updateOne({
      _id
    }, {
      sex,
      address,
      phone
    }) //条件,修改的信息
    .then(() => {
      res.json({
        code: 200,
        data: {
          status: 200,
          message: '修改成功'
        }
      })
    })

  // res.send('put');
});


/**
 * 删除用户信息 get 
 * 完整URL: /api/users/123497124
 * :_id 定义的是动态路径参数
 */
router.delete('/:_id', function (req, res, next) {
  // 从请求的路径参数中获取待修改用户的主键值
  const {
    _id
  } = req.params
  User.deleteOne({
      _id
    })
    .then(() => {
      res.json({
        code: 200,
        data: {
          status: 200,
          message: "删除成功"
        }
      })
    })
  // res.send('delete');
});

module.exports = router;

5.test / users.http

const {
_id
} = req.params
// 从请求主体中获取修改后的数据
const {
sex,
phone,
address
} = req.body
// 修改数据库中的数据
User.updateOne({
_id
}, {
sex,
address,
phone
}) //条件,修改的信息
.then(() => {
res.json({
code: 200,
data: {
status: 200,
message: ‘修改成功’
}
})
})

// res.send(‘put’);
});

/**

  • 删除用户信息 get
  • 完整URL: /api/users/123497124
  • :_id 定义的是动态路径参数
    */
    router.delete(‘/:_id’, function (req, res, next) {
    // 从请求的路径参数中获取待修改用户的主键值
    const {
    _id
    } = req.params
    User.deleteOne({
    _id
    })
    .then(() => {
    res.json({
    code: 200,
    data: {
    status: 200,
    message: “删除成功”
    }
    })
    })
    // res.send(‘delete’);
    });

module.exports = router;


5.test / users.http

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值