nodeJs学习(第一周)

news2025/3/14 20:44:26

文章目录

  • 学习总结
    • nodejs基础知识
      • 核心模块(内置模块)
        • fs(file-system)文件系统
        • fs增删查改
        • url
        • Query String
      • http
        • request
        • 根据不同的请求路径发送不同的响应结果
        • require
          • ip地址和端口号
          • Content-Type
        • 第三方模块
    • express
      • 登录接口逻辑分析
      • express的基本使用
      • 服务器相关
        • 服务器:
        • api接口构成要素
      • postman 接口测试
      • api接口书写
      • middlewear 中间件
      • 静态资源目录 static
      • 路由
    • 异步回调 promise
  • 生活总结

学习总结

nodejs基础知识

核心模块(内置模块)

是一个JS运行时的环境,简单来说就是Node.js可以解析执行JS代码
Node.js中的JS没有BOM、DOM;在Node这个JS执行环境中为JS提供了一些服务器级别的操作API
例如:文件读写、网络服务的构建、网络通信、http服务器等的处理

fs(file-system)文件系统

在Node中如果执行文件操作必须引入fs这个核心模块;在fs这个核心模块中,就提供了所有的文件操作相关的API

var fs = require('fs')
fs.mkdir(path,callback)		创建文件夹
fs.rename()		更改文件名
fs.rmdir(path,callback)		删除文件夹,文件夹只能是空的
fs.stat()		判断是文件还是文件夹
fs.stat('./node01',(err,stats)=>{
  if(stats.isFile()){
    console.log('is file)
  }else{
    console.log('is dir')
  }
})
fs增删查改

fs.readFile用来读取文件的

// 读文件异步
// 成功
// 		date 数据
//		error  null
// 失败
// 		date  undefined没有数据
//		error  错误对象
// 同步错误处理
// 		try   catch
fs.readFile('./date/helloWorld.txt',function(error,date){
    console.log(date.toString())
})
fs.writeFile()	用来创建文件的
// 写文件
// 成功
// 		文件写入成功
// 		error 是 null
// 失败
// 		文件写入失败
//  	error就是错误对象
      
fs.writeFile('./date/你好.md','大家好,我是檀健次老婆',function(error){
    console.log('文件成功写入')
    if(error){
        console.log('写入失败')
      }else{
        console.log('写入成功')
      }
})

在这里插入图片描述
在这里插入图片描述

fs.appendFile()		用来写入文件

fs.appendFile('./date/你好.md','大家好,我是檀健次老婆',function(error){
    console.log('error')
})
fs.unlink()		用来删除文件

fs.unlink('./date/你好.md','大家好,我是檀健次老婆',function(error){
    console.log('error')
})
url
url.parse()  将url字符串转成对象

const url = require('url')
let urlString = 'https:47.95.207.1:3000/fcj/recommend/hot/hehe?us=123&ps=567#nihao'
let urlObj = url.parse(urlString)
console.log(urlObj)
url.format()  将url对象转成字符

let obj = {
    protocol: 'https:',
    slashes: null,
    auth: null,
    host: null,
    port: null,
    hostname: null,
    hash: '#nihao',
    search: '?us=123&ps=567',
    query: 'us=123&ps=567',
    pathname: '47.95.207.1:3000/fcj/recommend/hot/hehe',
    path: '47.95.207.1:3000/fcj/recommend/hot/hehe?us=123&ps=567',
    href: 'https:47.95.207.1:3000/fcj/recommend/hot/hehe?us=123&ps=567#nihao'
  }
  let string = url.format(obj)
  console.log(string)
Query String
querystring.parst()		将字符串变成对象
querystring.stringify()		将对象变成字符串

const qs = require('querystring')
let string = 'name=mq&pass=123&sex=0'
// 两种写法
let obj = qs.parse(string)
let obj = qs.parse(string,'&','=')
console.log(obj)

在这里插入图片描述

const qs = require('querystring')
let obj = { name: 'mq', pass: '123', sex: '0'}
let string = qs.stringify(obj,'^','?')
console.log(string)

在这里插入图片描述

qs.escape()		编码操作
qs.unescape()	解码操作

http

在Node中专门提供了一个核心模块:http
职责就是创建编写服务器

// 1. 加载http
var http = require('http')

// 2.使用http.createServer()方法创建一个Web服务器
//   返回一个Server实例
var server = http.createServer()

// 3.服务器
//     提供服务:对数据的服务
//     发送请求
//     接受请求
//     处理请求
//     发送响应 
//     注册 request请求事件
//     当客户端请求过来,就会自动触发服务器的request请求事件,然后执行第二个参数;回调处理函数
server.on('request',function(){
    console.log('收到客户端的请求了')
})

// 4.绑定端口号,启动服务器
server.listen(3000,function(){
    console.log('服务器启动成功了,可以通过http://127.0.0.1:3000/ 来访问')
})

在这里插入图片描述

request

请求事件处理函数,需要接收两个参数:

  • Request 请求对象
    请求对象可以用来获取客户端的一些请求信息,比如请求路径
  • Response 响应对象
    响应对象可以用来给客户端发送响应消息
    有一个方法write可以用来给客户端发送响应数据;write可以多次使用,但是最后一定要使用end来结束响应,否则客户端会一直等待
server.on('request',function(request,response){
    console.log('收到客户端的请求了,请求路径是' + request.url)

    response.write('hello nodejs')
    response.end()

  // 简单写法
  response.end('hello  nodejs')
})

在这里插入图片描述

根据不同的请求路径发送不同的响应结果
  1. 获取请求路径
    req.url获取到的是端口号之后的那一部分路径;所有的url都是以/开头的
  2. 判断路径处理响应
server.on('request',function(req,res){
    var url = req.url
    console.log(url)
    if(url === '/' ){
        res.end('index page')
    }else if(url === '/Login'){
        res.end('Login page')
    }else{
        res.end('404 Not Found.')
    }
})

在这里插入图片描述

server.on('request', function (req, res) {
    var url = req.url
    if (url === '/products') {
        var products = [
            {
                name: '苹果 15',
                price: 9999
            },
            {
                name: '菠萝 15',
                price: 5000
            },
            {
                name: '小辣椒 15',
                price: 1999
            },
        ]
        // 响应内容只能是二进制数据或字符串
        res.end(JSON.stringify(products))
    }
})

在这里插入图片描述

require

是一个方法
作用
一、是用来加载模块并执行里面的代码的;
在Node中,模块有三种:
具名的核心模块,例如 fs http
用户自己编写的文件模块 相对路径必须加 ./ 可以省略后缀名
在Node中没有全局作用域,只有模块作用域(文件作用域)

  • 外部访问不到内部
  • 内部也访问不到外部
  • 默认都是封闭的
var foo = 'aaa'
console.log('a  start')
require('./b.js')
console.log('a end')
console.log('foo的值是:' + foo)
console.log('b  start')
var foo = 'bbb'
require('./c.js')
console.log('b  end')
console.log('ccc')

在这里插入图片描述
二、拿到被加载文件模块导出的接口对象
每个文件模块中都提供了一个对象:exports
exports 默认是一个空对象

var bExports = require('./b')
var fs = require('fs')
console.log(bExports.foo)
console.log(bExports.add(10,30))

bExports.readFile('./a/js')

fs.readFile('./a.js',function (err,date) {
    if(err){
        console.log('读取文件失败')
    }else{
        console.log(date.toString())
    }
})
var foo = 'bbb'
exports.foo = 'hello'
exports.add = function(x,y){
    return x + y
}

exports.readFile = function(path,callback){
    console.log('文件路径:',path)
}

在这里插入图片描述

ip地址和端口号

IP地址用来定位计算机
端口号用来定位具体的应用程序
所有需要联网通信的应用程序都会占用一个端口号

Content-Type

在服务器默认发送的数据是utf-8编码的内容,但浏览器不知道,中文操作系统默认是gbk
不同的资源对应的Content-Type是不一样,具体参照:http://tool.oschina.net/commons
对于文本类型的数据,最好都加上编码,目的是为了防止中文解析乱码问题
在http协议中,Content-Type就是用来告知对方我给你发送的数据内容是什么类型

var http = require('http')
var server = http.createServer()
server.on('request',function(req,res){
    res.setHeader('Content-Type','text/plain;charset=utf-8')
    res.end('hello  檀健次')
})
server.listen(3000,function(){
    console.log('Server is running...')
})

在这里插入图片描述
如果发送的是html格式的字符串,则也要告诉浏览器我发送的是text/html格式的内容

var http = require('http')
const { default: test } = require('node:test')
var server = http.createServer()
server.on('request',function(req,res){
    // res.setHeader('Content-Type','text/plain;charset=utf-8')
    // res.end('hello  檀健次')

    var url = req.url
    if(url === '/plain'){
        res.setHeader('Content-Type','text/plain;charset=utf-8')
        res.end('hello  檀健次')
    }else if(url === '/html'){
        res.setHeader('Content-Type','text/html;charset=utf-8')
        res.end('<p>hello html<a>点我</a></p>')
    }
})
server.listen(3000,function(){
    console.log('Server is running...')
})

在这里插入图片描述
通过网络发送文件

  • 发送的并不是文件,本质上来讲发送是文件的内容
  • 当浏览器收到服务器响应内容之后,会根据你的Content-Type进行对应的解析处理
var fs = require('fs')
var http = require('http')
const { default: test } = require('node:test')
var server = http.createServer()
server.on('request',function(req,res){
    var url = req.url
    if(url === '/'){
        fs.readFile('./resource/index.html',function(err,data){
            if(err){
                res.setHeader('Content-Type','text/plain;charset=utf-8')
                res.end('文件读取失败,请稍后重试!')
            }else{
                res.setHeader('Content-Type','text/html;charset=utf-8')
                res.end(data)
            }
        })
    }else if(url === '/a'){
        fs.readFile('./resource/aaa.jpg',function(err,data){
            if(err){
                res.setHeader('Content-Type','text/plain;charset=utf-8')
                res.end('文件读取失败,请稍后重试!')
            }else{
                res.setHeader('Content-Type','image/jpeg')
                res.end(data)
            }
        })
    }
    
})
server.listen(3000,function(){
    console.log('Server is running...')
})

在这里插入图片描述
在这里插入图片描述

第三方模块

nodemailer 可以实现发邮件
npm install jquery --save
npm官网 [http://www.npmjs.com/]

const nodemailer = require("nodemailer");

// 创建发送邮件的对象
const transporter = nodemailer.createTransport({
    host: "smtp.ethereal.email", // 发送方邮箱   通过lib/well-known/services.json
    port: 587, // 端口号
    secure: false, // Use `true` for port 465, `false` for all other ports
    auth: {
        user: "maddison53@ethereal.email",  // 发送方的邮箱地址
        pass: testAccount.pass, // mpt 验证码
    },
});

// 邮件信息
let mailobj = {
    from: '"Maddison Foo Koch 👻" <maddison53@ethereal.email>', // sender address
    to: "bar@example.com, baz@example.com", // list of receivers
    subject: "Hello ✔", // Subject line
    text: "Hello world?", // plain text body
    html: "<b>Hello world?</b>", // html body
}

// 发送邮件
transporter.sendMail(mailobj,(err,data)=>{
    console.log(err)
    console.log(data)
})

express

登录接口逻辑分析

1.接收用户传递数据
2.处理数据
3.返回数据

express的基本使用

1.安装

npm  install express -save

第三方模块引用,从当前目录的node——modules以此向上寻找
2.简单使用

const express = require('express')
const app = express()
// express 实例化

// 最简单的api接口
app.get('/user/login',(req,res)=>{
    console.log('你好')
    res.send({err:0,msg:'regist ok'})
})
app.listen(3000,()=>{
    // 监听3000端口  开启服务器
    console.log('server start')
})

在这里插入图片描述

服务器相关

服务器:

1.服务器就是一台电脑
2.服务器软件(apach tomcat iis ngnix node)
3.服务器IP 和端口号
局域网:服务器通过网线(无线)连接,每个电脑都会有一个ip
外网:
ip:确定服务器主机的位置
port:确定服务器里某个应用程序

api接口构成要素

ip
port
pathname 语义化,见文知意
method get post
接收用户传递数据 数据格式由后端确定的

postman 接口测试

api接口书写

接受数据

  • get req.query
  • post req.body 需要body-parser 插件进行解析
  • 注意数据格式 json x-www-form-urencode formdata
const express = require('express')
const app = express()
// express 实例化
const bodypaser = require('body-parser')
// app.use  使用中间插件
// 解析表单数据
// 解析form表单
app.use(bodypaser.urlencoded({extended:false}))
// 解析json 数据
app.use(bodypaser.json())

// 最简单的api接口
app.get('/user/login',(req,res)=>{
    // 接收get参数   req.query
    console.log(req.query)
    console.log('你好')
    let {us,ps} = req.query
    // 处理参数
    if(us === 'mq' && ps == 456){
        res.send({err: 0,msg:'regist ok'})
    }else{
        res.send({err: -1,msg:'us pass no ok'})
    }
    
})

app.post('/user/reg',(req,res)=>{
    // 接收post数据  消息体  请求体   req.body
    let {us,ps} = req.body
    console.log(req.body)
    // express 不能直接解析消息体
    // 通过第三方插件实现解析
    if(us == 123 && ps == 123){
        res.send({err: 0,msg:'regist ok'})
    }else{
        res.send({err: -1,msg:'us pass no ok'})
    }


})

app.listen(3000,()=>{
    // 监听3000端口  开启服务器
    console.log('server start')
})

middlewear 中间件

内置中间件 static
自定义中间件(全局 局部)
第三方中间件 (body-parser)(拦截器)
中间件使用 一定注意next

const express = require('express')
const app = express()
// 拦截器
app.use('/',(req,res,next)=>{
    console.log('中间件')
    let {token} = req.query
    if(token){
        next()   // 是否继续往下执行
    }else{
        res.send('缺少token')
    }
})

app.get('/test1',(req,res)=>{
    console.log('test1')
    // let {token} = req.query
    // if(token){
    //     res.send('ok')
    // }else{
    //     res.send('no ok')
    // }

    res.send('test1')
})

app.get('/test2',(req,res)=>{
    console.log('test2')
    // let {token} = req.query
    // if(token){
    //     res.send('ok')
    // }else{
    //     res.send('no ok')
    // }

    res.send('test2')
})

app.listen(3000,()=>{
    console.log('server  start')
})
const express = require('express')
const app = express()

app.get('/test1',(req,res,next)=>{
    console.log('fun1')
    next()
},s
(req,res)=>{
    console.log('fun2')
    res.send('test1')
})
// app.get('/pathname',fun,fun,...)


app.listen(3000,()=>{
    console.log('server  start')
})

静态资源目录 static

指定一个目录,目录可以被访问

const express = require('express')
const path = require('path')
const app = express()
console.log(__dirname)    // 当前文件所在的绝对路径
console.log(path.join(__dirname,'./data'))     // 拼接路径
app.use(express.static(path.join(__dirname,'./data')))    // 写法一
app.use('/',express.static(path.join(__dirname,'./data')))    // 写法二
app.listen(3000,()=>{
    console.log('server  static')
})

路由

user/add
user/del
food/add
food/del

const express = require('express')
const app = express()
// app.get('/user/add',(req,res)=>{
//     res.send('user/add ok')
// })
// app.get('/user/del',(req,res)=>{
//     res.send('user/del ok')
// })

let userRouter = require('./router/userRouter')
let foodRouter = require('./router/foodRouter')
app.use('/user',userRouter)
app.use('/food',foodRouter)

app.listen(3000,()=>{
    console.log('server  static')
})
const express = require('express')
const router = express.Router()   //获取路由的实例

router.get('/add',(req,res)=>{
    res.send('food add')
})
router.get('/del',(req,res)=>{
    res.send('food del')
})


module.exports = router
const express = require('express')
const router = express.Router()   //获取路由的实例

router.get('/add',(req,res)=>{
    res.send('food add')
})
router.get('del',(req,res)=>{
    res.send('food del')
})


module.exports = router

异步回调 promise

1.封装promise 解决回调地狱

function test(){
  // 返回promise
  return new Promise((resolve,reject)=>{
    // 需要的异步处理
    成功的时候  resolve
    失败的时候  reject
  })
}

2.根据顺序 形成链式调用
test( ).then( ).then( ).catch( )
3.捕获错误

const { rejects } = require('assert')
const { promises } = require('dns')
const fs = require('fs')
const { resolve } = require('path')
function isEixt(){
    return new Promise((resolve,reject)=>{
        fs.stat('./hehe.js',(err,stats)=>{
            if(err){
                reject('文件不存在')
            }else{
                resolve('文件存在')
            }
        })
    })
}

function delFile(){
    return new Promise((resolve,reject)=>{
        fs.unlink('./hehe.js',(err)=>{
            if(err){
                reject('del no ok')
            }else{
                resolve('del ok')
            }
        })
    })
}

isEixt()
.then(()=>{
    console.log('is exit 的成功处理')
    return delFile()
})
.then(()=>{
    console.log('删除文件的成功处理')
})
.catch((err)=>{
    console.log('chatch')
    console.log(err)
})

注:一组链式调用中只需要一个catch;如何手动终止链式调用的执行 抛出一个错误

.then(()=>{
    console.log('删除文件的成功处理')
  throw new Error('手动终止')
})

生活总结

项目结束,没有那么赶,这周倒是不那么忙了,时间不是很紧迫了,nodejs有些偏后端,对于自己来说还是不太好学的,还是得下点功夫,这次的考核,要自己写接口和页面,不是很简单,亚历山大。周末突然加了认知实习,还要手写两千字总结,真的没什么意义啊啊啊啊啊,还浪费时间,我好不容易盼来的周末假期,,真的够了。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1695336.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LeetCode:2769. 找出最大的可达成数字 + 模拟】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

MySQL--执行计划

一、执行计划 1.介绍 执行计划是sql在执行时&#xff0c;优化器优化后&#xff0c;选择的cost最低的方案 通过desc、explain可以查看sql的执行计划 2.如何查看执行计划 table语句操作的表&#xff0c;在多表时才有意义type查找类型possible_keys可能会用到的索引key最终选择的…

基于python数据挖掘在淘宝评价方面的应用与分析,技术包括kmeans聚类及情感分析、LDA主题分析

随着电子商务的蓬勃发展&#xff0c;淘宝作为中国最大的在线购物平台之一&#xff0c;吸引了大量的消费者进行购物并留下了大量的客户评价。这些客户评价中包含了丰富的消费者意见和情感信息&#xff0c;对于商家改进产品、提升服务质量以及消费者决策都具有重要的参考价值。 …

JVM学习-垃圾回收(一)

什么是垃圾 垃圾是指在运行程序中没有任何指针指向的对象&#xff0c;这个对象就是需要被回收的垃圾如果不及时对内存的垃圾进行清理&#xff0c;垃圾对象所占用的内存空间会一直保留到应用程序结束&#xff0c;被保留的空间无法被其它对象所用&#xff0c;甚至可能导致内存溢…

视频批量剪辑神器大揭秘:一键删减片头片尾,高效打造精彩视频内容!

在数字化时代的浪潮中&#xff0c;视频已经成为人们传递信息、分享生活的重要载体。无论是制作一部精美的宣传片&#xff0c;还是剪辑一段有趣的短视频&#xff0c;视频时长都是至关重要的因素。然而&#xff0c;很多视频创作者在调整视频时长时遇到了困难&#xff0c;耗费了大…

实体-联系图

为了把用户的数据要求清楚、准确地描述出来,系统分析员通常建立一个概念性的数据模型(也称为信息模型)。概念性数据模型是一种面向问题的数据模型,是按照用户的观点对数据建立的模型。它描述了从用户角度看到的数据,它反映了用户的现实环境, 而且与在软件系统中的实现方法无关。…

计算几何-扫描线算法

1、定义 计算几何中&#xff0c;扫描线算法&#xff08;Sweep Line Algorithm&#xff09;或平面扫描算法&#xff08;Plane Sweep Algorithm&#xff09;是一种算法模式&#xff0c;虚拟扫描线或扫描面来解决欧几里德空间中的各种问题&#xff0c;一般被用来解决图形面积&am…

Java面试八股之Synchronized和ReentrantLock的区别

Synchronized和ReentrantLock的区别 实现级别&#xff1a; synchronized是Java的一个关键字&#xff0c;属于JVM层面的原生支持&#xff0c;它通过监视器锁&#xff08;Monitor&#xff09;来实现同步控制&#xff0c;无需手动获取和释放锁。 ReentrantLock是java.util.conc…

免费插件集-illustrator插件-Ai插件-文本对象和文本段落互转

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件&#xff0c;加强illustrator使用人员工作效率&#xff0c;进行文本对象和文本段落互转。首先从下载网址下载这款插件 https://download.csdn.net/download/m0_67316550/878…

【408真题】2009-16

“接”是针对题目进行必要的分析&#xff0c;比较简略&#xff1b; “化”是对题目中所涉及到的知识点进行详细解释&#xff1b; “发”是对此题型的解题套路总结&#xff0c;并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材&#xff08;2025版&…

计算机毕业设计Hadoop+Hive地震预测系统 地震数据分析可视化 地震爬虫 大数据毕业设计 Spark 机器学习 深度学习 Flink 大数据

2024 届本科毕业论文&#xff08;设计&#xff09; 基于Hadoop的地震预测的 分析与可视化研究 姓 名&#xff1a;____田伟情_________ 系 别&#xff1a;____信息技术学院___ 专 业&#xff1a;数据科学与大数据技术 学 号&#xff1a;__2011103094________ 指导…

Sam Altman微软Build 2024最新演讲:AI可能是下一个移动互联网

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

vue+echart :点击趋势图中的某一点或是柱状图,出现弹窗,并传输数据

样式 在趋势图中点击某一个柱状图&#xff0c;出现下面的弹窗 代码实现 主要是在趋势图页面代码中&#xff0c;在初始化趋势图的设置中&#xff0c;添加对趋势图监听的点击方法 drawChart() {const chartData this.chartData;let option {};if (!chartData.xData?.len…

【LVGL_Linux安装NXP的Gui-Guider】

GUI Guider是恩智浦为LVGL开发了一个上位机GUI设计工具&#xff0c;可以通过拖放控件的方式设计LVGL GUI页面&#xff0c;加速GUI的设计。 虽然他只支持自家芯片&#xff0c;但是应用层我们可以直接拿来用作其他MCU上。 GUI-Guider 下载 NXP官网下载&#xff1a;链接&#xff1…

SpringBoot 集成 ChatGPT(附实战源码)

建项目 项目结构 application.properties openai.chatgtp.modelgpt-3.5-turbo openai.chatgtp.api.keyREPLACE_WITH_YOUR_API_KEY openai.chatgtp.api.urlhttps://api.openai.com/v1/chat/completionsopenai.chatgtp.max-completions1 openai.chatgtp.temperature0 openai.cha…

超值分享50个DFM模型格式的素人直播资源,适用于DeepFaceLive的DFM合集

50直播模型&#xff1a;点击下载 作为直播达人&#xff0c;我在网上购买了大量直播用的模型资源&#xff0c;包含男模女模、明星脸、大众脸、网红脸及各种稀缺的路人素人模型。现在&#xff0c;我将这些宝贵的资源整理成合集分享给大家&#xff0c;需要的朋友们可以直接点击下…

前端中 dayjs 时间的插件使用(在vue 项目中)

Day.js中文网 这是dayjs的中文文档 里面包括了使用方法 下面我来详细介绍一下这个插件的使用 Day.js 可以运行在浏览器和 Node.js 中。 一般咱直接是 npm 安装 npm install dayjs 目前应该使用的是Es6 的语法 import dayjs from dayjs 当前时间 直接调用 dayjs() 将返回…

中小企业纵横数智之海,华为云“航母级”平台护航

自古以来&#xff0c;中国人对探索未知世界的想象&#xff0c;便是“纵横四海”。 《尚书》最早记载了中国人的海洋观念&#xff0c;所谓“文命&#xff0c;敷于四海”。屈原在《九歌 云中君》中感叹,“览冀州兮有余&#xff0c;横四海兮焉穷”&#xff0c;希望云神带着他找寻海…

SRE视角下的DevOps:构建稳定高效的软件交付流程

SRE 和 DevOps 有什么区别和联系&#xff1f;本文对此进行了解读&#xff0c;并着重从 SRE 实践出发阐述了 DevOps 的建设思路。 SRE 就是在用软件工程的思维和方法论完成以前由系统管理员团队手动完成的工作。SRE 的职责是运维一个服务&#xff0c;该服务由一些相关的系统组件…

【MyBatis】MyBatis解析全局配置文件源码详解

目录 一、前言 思维导图概括 二、配置文件解析过程分析 2.1 配置文件解析入口 2.2 初始化XMLConfigBuilder 2.3 XMLConfigBuilder#parse()方法&#xff1a;解析全局配置文件 2.3.1 解析properties配置 2.3.2 解析settings配置 2.3.2.1 元信息对象&#xff08;MetaClas…