Express学习笔记(六)——前后端的身份认证
目录
1. Web 开发模式
1.1 服务端渲染的 Web 开发模式
1.2 服务端渲染的优缺点
1.3 前后端分离的 Web 开发模式
1.4 前后端分离的优缺点
1.5 如何选择 Web 开发模式
2. 身份认证
2.1 什么是身份认证
2.2 为什么需要身份认证
2.3 不同开发模式下的身份认证
3. Session 认证机制
3.1 HTTP 协议的无状态性
3.2 如何突破 HTTP 无状态的限制
3.3 什么是 Cookie
3.4 Cookie 在身份认证中的作用
3.5 Cookie 不具有安全性
3.6 提高身份认证的安全性
3.7 Session 的工作原理
4. 在 Express 中使用 Session 认证
4.1 安装 express-session 中间件
4.2 配置 express-session 中间件
4.3 向 session 中存数据
4.4 从 session 中取数据
4.5 清空 session
5. JWT 认证机制(重点)
5.1 了解 Session 认证的局限性
5.2 什么是 JWT
5.3 JWT 的工作原理
5.4 JWT 的组成部分
5.6 JWT 的三个部分各自代表的含义
5.7 JWT 的使用方式
5.7.1 安装 JWT 相关的包
5.7.2 导入 JWT 相关的包
5.7.3 定义 secret 密钥
5.7.4 在登录成功后生成 JWT 字符串
5.7.5 将 JWT 字符串还原为 JSON 对象
5.7.6 使用 req.auth 获取用户信息
5.7.7 捕获解析 JWT 失败后产生的错误
1. Web 开发模式
- ① 基于服务端渲染的传统 Web 开发模式
- ② 基于前后端分离的新型 Web 开发模式
1.1 服务端渲染的 Web 开发模式
- 服务器发送给客户端的 HTML 页面,是在服务器通过字符串的拼接,动态生成的。因此,客户端不需要使用 Ajax 这样的技术额外请求页面的数据。
- 代码示例如下:

1.2 服务端渲染的优缺点
- ① 前端耗时少。因为服务器端负责动态生成 HTML 内容,浏览器只需要直接渲染页面即可。尤其是移动端,更省电。
- ② 有利于SEO。因为服务器端响应的是完整的 HTML 页面内容,所以爬虫更容易爬取获得信息,更有利于 SEO。
- ① 占用服务器端资源。即服务器端完成 HTML 页面内容的拼接,如果请求较多,会对服务器造成一定的访问压力。
- ② 不利于前后端分离,开发效率低。使用服务器端渲染,则无法进行分工合作,尤其对于前端复杂度高的项目,不利于项目高效开发。
1.3 前后端分离的 Web 开发模式
- 前后端分离的开发模式,依赖于 Ajax 技术的广泛应用。简而言之,前后端分离的 Web 开发模式,就是后端只负责提供 API 接口,前端使用 Ajax 调用接口的开发模式。
1.4 前后端分离的优缺点
- ① 开发体验好。前端专注于 UI 页面的开发,后端专注于api 的开发,且前端有更多的选择性。
- ② 用户体验好。Ajax 技术的广泛应用,极大的提高了用户的体验,可以轻松实现页面的局部刷新。
- ③ 减轻了服务器端的渲染压力。因为页面最终是在每个用户的浏览器中生成的。
- ① 不利于 SEO。因为完整的 HTML 页面需要在客户端动态拼接完成,所以爬虫对无法爬取页面的有效信息。(解决方案:利用 Vue、React 等前端框架的 SSR (server side render)技术能够很好的解决 SEO 问题!)
1.5 如何选择 Web 开发模式
- 比如企业级网站,主要功能是展示而没有复杂的交互,并且需要良好的 SEO,则这时我们就需要使用服务器端渲染;
- 而类似后台管理项目,交互性比较强,不需要考虑 SEO,那么就可以使用前后端分离的开发模式。
2. 身份认证
2.1 什么是身份认证
- 日常生活中的身份认证随处可见,例如:高铁的验票乘车,手机的密码或指纹解锁,支付宝或微信的支付密码等。
- 在 Web 开发中,也涉及到用户身份的认证,例如:各大网站的手机验证码登录、邮箱密码登录、二维码登录等。
2.2 为什么需要身份认证
2.3 不同开发模式下的身份认证
- ① 服务端渲染推荐使用 Session 认证机制
- ② 前后端分离推荐使用 JWT 认证机制
3. Session 认证机制
3.1 HTTP 协议的无状态性
3.2 如何突破 HTTP 无状态的限制
- 现实生活中的会员卡身份认证方式,在 Web 开发中的专业术语叫做 Cookie。
3.3 什么是 Cookie
- ① 自动发送
- ② 域名独立
- ③ 过期时限
- ④ 4KB 限制
3.4 Cookie 在身份认证中的作用
- 客户端第一次请求服务器的时候,服务器通过响应头的形式,向客户端发送一个身份认证的 Cookie,客户端会自动将 Cookie 保存在浏览器中。
- 随后,当客户端浏览器每次请求服务器的时候,浏览器会自动将身份认证相关的 Cookie,通过请求头的形式发送给服务器,服务器即可验明客户端的身份。
3.5 Cookie 不具有安全性
- 千万不要使用 Cookie 存储重要且隐私的数据!比如用户的身份信息、密码等。
3.6 提高身份认证的安全性
3.7 Session 的工作原理

4. 在 Express 中使用 Session 认证
4.1 安装 express-session 中间件
npm install express-session 4.2 配置 express-session 中间件
// 导入 session 中间件
const session = require('express-session')// TODO_01:请配置 Session 中间件
app.use(session({secret: 'itheima', // secret 属性值可以为任意字符串resave: false, // 固定写法saveUninitialized: true // 固定写法
}))
4.3 向 session 中存数据
// 登录的 API 接口
app.post('/api/login', (req, res) => {// 判断用户提交的登录信息是否正确if (req.body.username !== 'admin' || req.body.password !== '000000') {return res.send({ status: 1, msg: '登录失败' })}// TODO_02:请将登录成功后的用户信息,保存到 Session 中req.session.user = req.body // 用户的信息req.session.islogin = true // 用户的登录状态res.send({ status: 0, msg: '登录成功' })
}) 4.4 从 session 中取数据
// 获取用户姓名的接口
app.get('/api/username', (req, res) => {// TODO_03:请从 Session 中获取用户的名称,响应给客户端if (!req.session.islogin) {return res.send({status: 1,msg: 'fail'})}res.send({status: 0,msg: 'success',username: req.session.user.username})
}) 4.5 清空 session
// 退出登录的接口
app.post('/api/logout', (req, res) => {// TODO_04:清空 Session 信息req.session.destroy()res.send({status: 0,msg: '退出登录成功'})
})
完整代码:
// 导入 express 模块
const express = require('express')
const session = require('express-session')
// 创建 express 的服务器实例
const app = express()// TODO_01:请配置 Session 中间件
app.use(session({secret: 'itheima', // secret 属性值可以为任意字符串resave: false, // 固定写法saveUninitialized: true // 固定写法
}))// 托管静态页面
app.use(express.static('./pages'))
// 解析 POST 提交过来的表单数据
app.use(express.urlencoded({ extended: false }))// 登录的 API 接口
app.post('/api/login', (req, res) => {// 判断用户提交的登录信息是否正确if (req.body.username !== 'admin' || req.body.password !== '000000') {return res.send({ status: 1, msg: '登录失败' })}// TODO_02:请将登录成功后的用户信息,保存到 Session 中req.session.user = req.body // 用户的信息req.session.islogin = true // 用户的登录状态res.send({ status: 0, msg: '登录成功' })
})// 获取用户姓名的接口
app.get('/api/username', (req, res) => {// TODO_03:请从 Session 中获取用户的名称,响应给客户端if (!req.session.islogin) {return res.send({status: 1,msg: 'fail'})}res.send({status: 0,msg: 'success',username: req.session.user.username})
})// 退出登录的接口
app.post('/api/logout', (req, res) => {// TODO_04:清空 Session 信息req.session.destroy()res.send({status: 0,msg: '退出登录成功'})
})// 调用 app.listen 方法,指定端口号并启动web服务器
app.listen(80, function () {console.log('Express server running at http://127.0.0.1:80')
}) 5. JWT 认证机制(重点)
5.1 了解 Session 认证的局限性
- 当前端请求后端接口不存在跨域问题的时候,推荐使用 Session 身份认证机制。
- 当前端需要跨域请求后端接口的时候,不推荐使用 Session 身份认证机制,推荐使用 JWT 认证机制。
5.2 什么是 JWT
5.3 JWT 的工作原理

- 用户的信息通过 Token 字符串的形式,保存在客户端浏览器中。服务器通过还原 Token 字符串的形式来认证用户的身份。
5.4 JWT 的组成部分
5.6 JWT 的三个部分各自代表的含义
- Payload 部分才是真正的用户信息,它是用户信息经过加密之后生成的字符串。
- Header 和 Signature 是安全性相关的部分,只是为了保证 Token 的安全性。

5.7 JWT 的使用方式
5.7.1 安装 JWT 相关的包
npm install jsonwebtoken express-jwt - jsonwebtoken 用于生成 JWT 字符串
- express-jwt 用于将 JWT 字符串解析还原成 JSON 对象
5.7.2 导入 JWT 相关的包
// TODO_01:安装并导入 JWT 相关的两个包,分别是 jsonwebtoken 和 express-jwt
// jsonwebtoken 用于生成 JWT 字符串
const jwt = require('jsonwebtoken')
// express-jwt 用于将 JWT 字符串解析还原成 JSON 对象
const { expressjwt } = require('express-jwt') 5.7.3 定义 secret 密钥
- ① 当生成 JWT 字符串的时候,需要使用 secret 密钥对用户的信息进行加密,最终得到加密好的 JWT 字符串
- ② 当把 JWT 字符串解析还原成 JSON 对象的时候,需要使用 secret 密钥进行解密
- secret 密钥的本质:就是一个字符串
// TODO_02:定义 secret 密钥,建议将密钥命名为 secretKey
const secretKey = 'itheima No1 ^_^' 5.7.4 在登录成功后生成 JWT 字符串
// 登录接口
app.post('/api/login', function (req, res) {// 将 req.body 请求体中的数据,转存为 userinfo 常量const userinfo = req.body// 登录失败if (userinfo.username !== 'admin' || userinfo.password !== '000000') {return res.send({status: 400,message: '登录失败!'})}// 登录成功// TODO_03:在登录成功之后,调用 jwt.sign() 方法生成 JWT 字符串。并通过 token 属性发送给客户端// 参数 1:用户的信息对象// 参数 2:加密的秘钥// 参数 3:配置对象,可以配置当前 token 的有效期// 记住:千万不要把用户的登录密码加密到 token 字符串中const token = jwt.sign({username: userinfo.username,},secretKey,{expiresIn: '60s'})res.send({status: 200,message: '登录成功!',token: token // 要发送给客户端的 token 字符串})
}) 
5.7.5 将 JWT 字符串还原为 JSON 对象
// TODO_04:注册将 JWT 字符串解析还原成 JSON 对象的中间件
// expressjwt({ secret: secretKey, algorithms: ['HS256']}) 就是用来解析 token 的中间件
// .unless({ path: [ /^\/api\// ] })) 用来指定那些接口不需要访问权限
// / ^\/api\/ / 以 /api/ 开头 ^ 的接口都不需要访问权限
// \ 表示转义
// 注意:只要配置成功了 express-jwt 这个中间件,就可以把解析出来的用户信息,挂载到 req.auth 属性上
app.use(expressjwt({ secret: secretKey, algorithms: ['HS256'] }).unless({ path: [ /^\/api\// ] })) 5.7.6 使用 req.auth 获取用户信息
// 这是一个有权限的 API 接口
app.get('/admin/getinfo', function (req, res) {// TODO_05:使用 req.auth 获取用户信息,并使用 data 属性将用户信息发送给客户端console.log(req.auth)res.send({status: 200,message: '获取用户信息成功!',data: req.auth // 要发送给客户端的用户信息})
}) 
5.7.7 捕获解析 JWT 失败后产生的错误

// TODO_06:使用全局错误处理中间件,捕获解析 JWT 失败后产生的错误
app.use((err, req, res, next) => {// 这次错误是由 token 解析失败导致的if (err.name === 'UnauthorizedError') {console.log('token 过期了。')return res.send({status: 401,message: '无效的token'})}res.send({status: 500,message: '未知的错误'})
}) 
完整代码:
// 导入 express 模块
const express = require('express')
// 创建 express 的服务器实例
const app = express()// TODO_01:安装并导入 JWT 相关的两个包,分别是 jsonwebtoken 和 express-jwt
// jsonwebtoken 用于生成 JWT 字符串
const jwt = require('jsonwebtoken')
// express-jwt 用于将 JWT 字符串解析还原成 JSON 对象
const { expressjwt } = require('express-jwt')// 允许跨域资源共享
const cors = require('cors')
app.use(cors())// 解析 post 表单数据的中间件
const bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({ extended: false }))// TODO_02:定义 secret 密钥,建议将密钥命名为 secretKey
const secretKey = 'itheima No1 ^_^'// TODO_04:注册将 JWT 字符串解析还原成 JSON 对象的中间件
// expressjwt({ secret: secretKey, algorithms: ['HS256']}) 就是用来解析 token 的中间件
// .unless({ path: [ /^\/api\// ] })) 用来指定那些接口不需要访问权限
// / ^\/api\/ / 以 /api/ 开头 ^ 的接口都不需要访问权限
// \ 表示转义
// 注意:只要配置成功了 express-jwt 这个中间件,就可以把解析出来的用户信息,挂载到 req.user 属性上
app.use(expressjwt({ secret: secretKey, algorithms: ['HS256'] }).unless({ path: [ /^\/api\// ] }))// 登录接口
app.post('/api/login', function (req, res) {// 将 req.body 请求体中的数据,转存为 userinfo 常量const userinfo = req.body// 登录失败if (userinfo.username !== 'admin' || userinfo.password !== '000000') {return res.send({status: 400,message: '登录失败!'})}// 登录成功// TODO_03:在登录成功之后,调用 jwt.sign() 方法生成 JWT 字符串。并通过 token 属性发送给客户端// 参数 1:用户的信息对象// 参数 2:加密的秘钥// 参数 3:配置对象,可以配置当前 token 的有效期// 记住:千万不要把用户的登录密码加密到 token 字符串中const token = jwt.sign({username: userinfo.username,},secretKey,{expiresIn: '60s'})res.send({status: 200,message: '登录成功!',token: token // 要发送给客户端的 token 字符串})
})// 这是一个有权限的 API 接口
app.get('/admin/getinfo', function (req, res) {// TODO_05:使用 req.auth 获取用户信息,并使用 data 属性将用户信息发送给客户端console.log(req.auth)res.send({status: 200,message: '获取用户信息成功!',data: req.auth // 要发送给客户端的用户信息})
})// TODO_06:使用全局错误处理中间件,捕获解析 JWT 失败后产生的错误
app.use((err, req, res, next) => {// 这次错误是由 token 解析失败导致的if (err.name === 'UnauthorizedError') {console.log('token 过期了。')return res.send({status: 401,message: '无效的token'})}res.send({status: 500,message: '未知的错误'})
})// 调用 app.listen 方法,指定端口号并启动web服务器
app.listen(8888, function () {console.log('Express server running at http://127.0.0.1:8888')
})
相关文章:
Express学习笔记(六)——前后端的身份认证
目录 1. Web 开发模式 1.1 服务端渲染的 Web 开发模式 1.2 服务端渲染的优缺点 1.3 前后端分离的 Web 开发模式 1.4 前后端分离的优缺点 1.5 如何选择 Web 开发模式 2. 身份认证 2.1 什么是身份认证 2.2 为什么需要身份认证 2.3 不同开发模式下的身份认证 3. Sessio…...
Ubuntu 修改语言报错Failed to download repository information
1.进入文件(ps:vim可能出现无法修改sources.list文件的问题) sudo gedit /etc/apt/sources.list2.修改(我是直接增添以下内容在其原始源前面,没有删原始内容)文件并保存,这里会替换原文件 deb http://mirrors.aliyun.com/ubuntu/ focal mai…...
leetcode 309. Best Time to Buy and Sell Stock with Cooldown
目录 题目描述 第一步,明确并理解dp数组及下标的含义 第二步,分析并理解递推公式 1.求dp[i][0] 2.求dp[i][1] 3.求dp[i][2] 第三步,理解dp数组如何初始化 第四步,理解遍历顺序 代码 题目描述 这道题与第122题的区别就是卖…...
优化自旋锁的实现
在《C11实现一个自旋锁》介绍了分别使用TAS和CAS算法实现自旋锁的方案,以及它们的优缺点。TAS算法虽然实现简单,但是因为每次自旋时都要导致一场内存总线流量风暴,对全局系统影响很大,一般都要对它进行优化,以降低对全…...
SS25001-多路复用开关板
1 概述 1.1 简介 多路复用开关板是使用信号继电器实现2线制的多路复用开关板卡;多路复用开关是一种可以将一个输入连接到多个输出或一个输出连接到多个输入的拓扑结构。这种拓扑通常用于扫描,适合将一系列通道自动连接到公共线路的的设备。多路复用开…...
thanos sidecar和receive区别?
Thanos Sidecar 和 Thanos Receive 是 Thanos 生态系统中两个关键组件,但它们在架构中的作用和功能上有明显的区别。以下是它们的主要区别: 1. Thanos Sidecar 功能: 与 Prometheus 集成: Sidecar 是一个部署在每个 Prometheus…...
string函数的应用
字符串查找 find 方法 实例 string s "Hello World,C is awesome!";//查找子串 size_t pos1 s.find("World"); //pos16 size_t pos2 s.find("Python"); //pos2string::npos//查找字符 size_tpos3s.find(c); //pos313//从指定位置开始查找 size…...
【AI News | 20250418】每日AI进展
AI Repos 1、exa-mcp-server AI助手通过Exa获得实时网络信息获取的能力,提供结构化的搜索结果,返回包括标题、URL以及内容片段在内的结构化结果;会把最近的搜索结果缓存为资源,下次再搜索相同的内容时可以直接使用缓存࿱…...
Dify LLM大模型参数(一)
深入了解大语言模型(LLM)的参数设置 模型的参数对模型的输出效果有着至关重要的影响。不同的模型会拥有不同的参数,而这些参数的设置将直接影响模型的生成结果。以下是 DeepSeek 模型参数的详细介绍: 温度(Tempera…...
展示数据可视化的魅力,如何通过图表、动画等形式让数据说话
在当今信息爆炸的时代,数据的量级和复杂性不断增加。如何从海量数据中提取有价值的信息,并将其有效地传达给用户,成为了一个重要的课题。数据可视化作为一种将复杂数据转化为直观图形、图表和动画的技术,能够帮助用户快速理解数据…...
基于Redis的4种延时队列实现方式
延时队列是一种特殊的消息队列,它允许消息在指定的时间后被消费。在微服务架构、电商系统和任务调度场景中,延时队列扮演着关键角色。例如,订单超时自动取消、定时提醒、延时支付等都依赖延时队列实现。 Redis作为高性能的内存数据库&#x…...
时序预测 | Matlab实现基于VMD-WOA-ELM和VMD-ELM变分模态分解结合鲸鱼算法优化极限学习机时间序列预测
时序预测 | Matlab实现基于VMD-WOA-ELM和VMD-ELM变分模态分解结合鲸鱼算法优化极限学习机时间序列预测 目录 时序预测 | Matlab实现基于VMD-WOA-ELM和VMD-ELM变分模态分解结合鲸鱼算法优化极限学习机时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab…...
静态测试:软件质量保障的第一道防线
在软件测试领域,静态测试往往是被低估却极其重要的环节。与动态测试不同,静态测试不需要执行代码,而是在软件开发早期阶段就能发现潜在问题。本文将深入探讨静态测试的概念、方法、优势以及如何在项目中有效实施。 什么是静态测试࿱…...
星露谷物语 7000+ 大型MOD整合包
衣服美化、家具美化、地图美化、人物肖像美化 全地图装修存档、人物美化、扩展包、环境美化、家具、动植物、通用前置包、新增NPC、功能、服装发饰妆 帽子发型农场小镇美化大型玩法拓展实用功能mod 动漫人物形象MOD 地点/动物/地图/功能/机械/家具/建筑/界面美化/扩展/农场/食谱…...
基于EasyX库开发的球球大作战游戏
目录 球球大作战 一、开发环境 二、流程图预览 三、代码逻辑 1、初始化时间 2、设置开始界面大小 3、设置开始界面 4、让玩家选择速度 5、设置玩家小球、人机小球、食物的属性 6、一次性把图绘制到界面里 7、进入死循环 8、移动玩家小球 9、移动人机 10、食物刷新…...
《系统分析师-第三阶段—总结(一)》
背景 采用三遍读书法进行阅读,此阶段是第三遍。 过程 第一章 第二章 总结 在这个过程中,对导图的规范越来越清楚,开始结构化,找关系,找联系。...
AI——K近邻算法
文章目录 一、什么是K近邻算法二、KNN算法流程总结三、Scikit-learn工具1、安装2、导入3、简单使用 三、距离度量1、欧式距离2、曼哈顿距离3、切比雪夫距离4、闵可夫斯基距离5、K值的选择6、KD树 一、什么是K近邻算法 如果一个样本在特征空间中的k个最相似(即特征空…...
L2-006 树的遍历
L2-006 树的遍历 问题描述格式输入格式输出样例输入样例输出评测用例规模与约定解析参考程序难度等级 问题描述 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。 格式输入 输入第一行给出一个正整数N࿰…...
java线程池原理及使用和处理流程
实际测试使用如下: package com.study;import java.util.concurrent.*;/*** 线程池作用:* 1、线程的复用* 2、资源管理* 3、任务调度* --------------执行过程--------------* 第1-3个任务进来时,直接创建任务并执行* 第4-8个任务进来时&…...
用 NLP + Streamlit,把问卷变成能说话的反馈
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
TCP/IP和UDP协议的发展历程
TCP/IP和UDP协议的发展历程 引言 互联网的发展史是人类技术创新的辉煌篇章,而在这一发展过程中,通信协议发挥了奠基性的作用。TCP/IP(传输控制协议/互联网协议)和UDP(用户数据报协议)作为互联网通信的基础…...
Function Calling的时序图(含示例)
🧍 用户: 发起请求,输入 prompt(比如:“请告诉我北京的天气”)。 🟪 应用: 将用户输入的 prompt 和函数定义(包括函数名、参数结构等)一起发给 OpenAI。 …...
DICOM通讯(ACSE->DIMSE->Worklist)
DICOM 通讯协议中的 ACSE → DIMSE → Worklist 这条通讯链路。DICOM 通讯栈本身是一个多层的协议结构,就像 OSI 模型一样,逐层封装功能。 一、DICOM 通讯协议栈总体架构 DICOM 通讯使用 TCP/IP 建立连接,其上面封装了多个协议层次…...
若依框架修改左侧菜单栏默认选中颜色
1.variables.sacc中修改为想要的颜色 2.给目标设置使用的颜色...
搜广推校招面经七十八
字节推荐算法 一、实习项目:多任务模型中的每个任务都是做什么?怎么确定每个loss的权重 这个根据实际情况来吧。如果实习时候用了moe,就可能被问到。 loss权重的话,直接根据任务的重要性吧。。。 二、特征重要性怎么判断的&…...
广搜bfs-P1443 马的遍历
P1443 马的遍历 题目来源-洛谷 题意 要求马到达棋盘上任意一个点最少要走几步 思路 国际棋盘规则是马的走法是-日字形,也称走马日,即x,y一个是走两步,一个是一步 要求最小步数,所以考虑第一次遍历到的点即为最小步数ÿ…...
强化学习算法系列(六):应用最广泛的算法——PPO算法
强化学习算法 (一)动态规划方法——策略迭代算法(PI)和值迭代算法(VI) (二)Model-Free类方法——蒙特卡洛算法(MC)和时序差分算法(TD) (三)基于动作值的算法——Sarsa算法与Q-Learning算法 (四…...
Vue3 + TypeScript中provide和inject的用法示例
基础写法(类型安全) typescript // parent.component.vue import { provide, ref } from vue import type { InjectionKey } from vue// 1. 定义类型化的 InjectionKey const COUNTER_KEY Symbol() as InjectionKey<number> const USER_KEY Sy…...
AI Agents系列之AI代理架构体系
1. 引言 智能体架构是定义智能体组件如何组织和交互的蓝图,使智能体能够感知其环境、推理并采取行动。本质上,它就像是智能体的数字大脑——集成了“眼睛”(传感器)、“大脑”(决策逻辑)和“手”(执行器),用于处理信息并采取行动。 选择正确的架构对于构建有效的智能…...
3个实用的脚本
1. Linux 系统清理临时文件脚本 该脚本用于清理系统中 /tmp 目录下超过 7 天的临时文件。 #!/bin/bash# 清理 /tmp 目录下超过 7 天的文件 find /tmp -type f -atime 7 -exec rm -f {} \;# 清理 /var/tmp 目录下超过 7 天的文件 find /var/tmp -type f -atime 7 -exec rm -f {…...
