利用node.js搭配express框架写后端接口(一)
Node.js 凭借其高效的非阻塞 I/O 操作、事件驱动架构以及轻量级的特点,成为了开发高性能服务器应用的热门选择。Express 框架作为 Node.js 上最流行的 Web 应用框架之一,以其简洁的 API 和丰富的中间件生态系统,极大地简化了 Web 后端开发流程。本文将引导你如何使用 Node.js 和 Express 框架构建一个简单的后端接口。
目录
一、初始化项目
1.创建项目
2.配置cors跨域
3.配置解析表单数据的中间件
4.初始化路由相关的文件夹
5.初始化用户路由模块
6.抽离用户路由模块中的处理函数
二、新建数据库表
1.新建数据库
2.新建表
三、安装并配置MySQL模块
1.安装MySQL模块
2.连接数据库
四、登录、注册
1.注册
1.1检测表单数据是否合法
1.2检测用户名是否被占用
1.3对密码进行加密处理
1.4插入新用户
1.5优化res.send()代码
1.6优化表单数据验证
2.登录
2.1检测登录表单的数据是否合法
2.2根据用户名查询用户的数据
2.3判断用户输入的密码是否正确
2.4生成jwt的token字符串
2.5配置解析token的中间件
一、初始化项目
1.创建项目
新建一个文件夹作为项目的根目录,并在项目根目录中运行如下命令,初始化包的管理配置文件:
npm i express@4.17.1
然后在项目中新建app.js作为整个项目的入口文件,并初始化如下代码:
//导入express
const express = require('express')
//创建服务器对象
const app = express()
//启动服务器
app.listen(3007, () => {console.log('api server htttp://127.0')
})
2.配置cors跨域
在文件夹的终端运行如下的命令,安装cors中间件:
npm i cors@2.8.5
然后再app.js中导入并配置cors中间件:
//导入并配置cors中间件
const cors = require('cors')
app.use(cors())
3.配置解析表单数据的中间件
通过使用如下代码,配置解析application/x-www-form-urlencoded格式的表单数据的中间件:
//配置解析表单数据的中间件--注意:只能解析application/x-www-from-urlencoded格式的表单数据的中间件
app.use(express.urlencoded({extended:false}))
4.初始化路由相关的文件夹
(1)在项目的根目录中,新建router文件夹,用来存放所有的路由模块。路由模块中,只存放客户端的请求与处理函数之间的映射关系。
(2)在项目的根目录中,新建router_handler文件夹,用来存放所有的路由处理函数模块,这里专门负责存放每个路由对应的处理函数。
5.初始化用户路由模块
在router文件夹中,新建user.js文件,作为用户的路由模块,代码如下:
const express = require('express')
//创建路由对象
const router = express.Router()//注册新用户
router.post('/register', (req, res) => { res.send('注册成功')
})//登录
router.post('/login', (req, res) => { res.send('登录成功')
})//导出路由对象
module.exports = router
在app.js中导入并使用该用户路由模块
//导入并注册用户路由模块
const userRouter = require('./routes/user')
app.use('/api', userRouter)
6.抽离用户路由模块中的处理函数
为了保证路由模块的纯粹性,所有的路由处理函数,必须抽离到对应的路由处理函数模块中。
在router_handler/user.js文件中,使用exports对象,分别向外共享如下两个路由处理函数:
//注册用户的处理函数
exports.regUser = (req, res) => {res.send('注册成功')
}
//登录的处理函数
exports.login = (req, res) => {res.send('登录成功')
}
将router/user.js文件中的代码修改如下结构
const express = require('express')
//创建路由对象
const router = express.Router()//打入用户路由处理函数模块
const userHandler = require('./router_handler/user')//注册新用户---原
// router.post('/register', (req, res) => {
// res.send('注册成功')
// })
//注册新用户--新
router.post('/register',userHandler.regUser )//登录----原
// router.post('/login', (req, res) => {
// res.send('登录成功')
// })
//登录---新
router.post('/login',userHandler.login)//导出路由对象
module.exports = router
二、新建数据库表
在创建库表之前确保已经安装了数据库。
1.新建数据库
2.新建表
在新建的test_mysql数据库中,新建ev_users表 。点击新建查询,输入一下SQL语句
use test_mysql;
CREATE TABLE ev_users
(id INT NOT NULL AUTO_INCREMENT,username VARCHAR(255) NOT NULL,password VARCHAR(255) NOT NULL,nickname VARCHAR(255),email VARCHAR(255),user_pic TEXT,PRIMARY KEY (id)
)
然后点击旁边的运行,下方如果出现OK,就表示创建成功
然后在表那边点击刷新就可以看见新创建的表了
三、安装并配置MySQL模块
在api接口项目中,需要安装并配置MySQL这个第三方模块,俩连接和操作MySQL数据库
1.安装MySQL模块
在根目录的终端中运行如下命令:
npm i mysql@2.18.1
2.连接数据库
在项目中的根目录下新建db文件夹,并在其下方新建index.js文件,在此文件中创建数据库的连接对象
//导入MySQL模块
const mysql = require('mysql')
//创建数据库连接对象
const db = mysql.createPool({host: '127.0.0.1', // 数据库主机名user: '你的数据库用户名', // 数据库用户名password: '你的数据库密码', // 数据库密码database: 'test_mysql' // 数据库名
})
// 导出连接池
module.exports = db;
四、登录、注册
1.注册
1.1检测表单数据是否合法
在router_handle/user.js这个文件中判断用户名和密码是否为空,具体代码如下:
//注册用户的处理函数
exports.regUser = (req, res) => {//获取客户端提交到服务器的用户信息const userInfo = req.body// console.log(userInfo, '这个信息是:')//对表单中的数据,进行合法的校验if (!userInfo.username || !userInfo.password) {return res.send({code: 404,message: 'fail',detail:'用户名或密码不合法'})}
}
1.2检测用户名是否被占用
(1)导入数据库操作模块
在router_handle/user.js这个文件中导入数据库模块
//导入数据库
const db = require('../db/index')
(2)定义SQL语句
//定义SQL语句,查询用户名是否被占用const sqlStr='select * from ev_users where username=?'
(3)执行SQL语句并根据结果判断用户名是否被占用
db.query(sqlStr, userInfo.username, (err, results) => {//执行SQL语句失败if (err) {return res.send({code:500,message: 'fail',detail:err.message})}//判断用户名是否被占用if (results.length > 0) {return res.send({code:409,message: 'fail',detail:'用户名被占用,请更换其他用户名'})}})
1.3对密码进行加密处理
为了保证密码的安全性,不建议在数据库以明文的形式保存用户密码,推荐对密码进行加密存储。
在当前所做项目中,使用bcryptjs对用户密码进行加密,优点在于:
- 加密之后的密码,无法被逆向破解;
- 同一明文密码多次加密,得到的加密结果各不相同,保证了安全性。
(1)安装bcryptjs
在项目终端运行如下命令:
npm i bcryptjs@2.4.3
(2)导入bcryptjs
在router_handle/user.js这个文件中导入bcryptjs
//导入bcryptjs
const bcrypt=require('bcryptjs')
(3)使用bcryptjs
在注册用户的处理函数中,确认用户名可用之后,调用bcrypt.hashSync(明文密码,随机盐的长度)方法,对用户的密码进行加密处理:
//调用bcryptjs-hashSync()对密码进行加密console.log(userInfo,'加密前:')userInfo.password = bcrypt.hashSync(userInfo.password, 10)console.log(userInfo,'加密后:')
1.4插入新用户
(1)定义插入用户的SQL语句
//定义插入新用户的SQL语句const sql='insert into ev_users set ?'
(2)调用db.query()执行SQL语句,插入新用户
//调用db.query()执行SQL语句db.query(sql, { username: userInfo.username, password: userInfo.password }, (err, results) => {//判断SQL语句是否执行成功if (err) {return res.send({code:500,message: 'fail',detail:err.message})}//判断影响函数是否为1if (results.affectedRows != 1) {return res.send({code: 500,message: 'fail',detail:'注册用户失败,请稍后再试'})} else {return res.send({code: 200,message: 'success',detail:'注册成功'})}})
1.5优化res.send()代码
在以上的处理函数中我们可以发现,需要多次调用到res.send()向客户端响应处理失败的结果,为了简化以上代码,这里重新封装了一个res.trans()函数。
在app.js中,所有路由之前,声明一个全局中间件,为res对象挂载一个res.trans()函数
//封装res.trans
app.use((req, res, next) => {//code默认值为500,表示失败的情况//err可能是一个错误对象,也可能是一个错误的描述字符串res.trans = (err,code=500) => {res.send({code,message: 'fail',detail:err instanceof Error?err.detail:err})}next()
})
在router_handle/user.js这个文件中有关注册这个处理函数进行重新修改
//注册用户的处理函数
exports.regUser = (req, res) => {//获取客户端提交到服务器的用户信息const userInfo = req.body// console.log(userInfo, '这个信息是:')//对表单中的数据,进行合法的校验if (!userInfo.username || !userInfo.password) {// return res.send({// code: 400,// message: 'fail',// detail: '用户名或密码不合法'// })return res.trans('用户名或密码不合法',400)}// } else {// return res.send({// code: 200,// message: 'success',// detail:''// })// }//定义SQL语句,查询用户名是否被占用const sqlStr='select * from ev_users where username=?'db.query(sqlStr, userInfo.username, (err, results) => {//执行SQL语句失败if (err) {//原--未封装// return res.send({// code:500,// message: 'fail',// detail:err.message// })//现--分装后return res.trans(err)}//判断用户名是否被占用if (results.length > 0) {//原--未封装// return res.send({// code:409,// message: 'fail',// detail:'用户名被占用,请更换其他用户名'// })//现--分装后return res.trans('用户名被占用,请更换其他用户名',409)}//调用bcryptjs-hashSync()对密码进行加密// console.log(userInfo,'加密前:')userInfo.password = bcrypt.hashSync(userInfo.password, 10)// console.log(userInfo, '加密后:')//定义插入新用户的SQL语句const sql = 'insert into ev_users set ?'//调用db.query()执行SQL语句db.query(sql, { username: userInfo.username, password: userInfo.password }, (err, results) => {//判断SQL语句是否执行成功if (err) {// return res.send({// code:500,// message: 'fail',// detail:err.message// })//现--分装后return res.trans(err)}//判断影响函数是否为1if (results.affectedRows != 1) {// return res.send({// code: 500,// message: 'fail',// detail:'注册用户失败,请稍后再试'// })//现--分装后return res.trans('注册用户失败,请稍后再试')} else {return res.send({code: 200,message: 'success',detail:'注册成功'})}})})
}
1.6优化表单数据验证
表单验证的原则:前端验证为辅,后端验证为主,后端不能相信前端提交过来的任何内容。在实际开发中,前后端都需要对表单的数据进行合法性的验证,而且,后端做为数据合法性验证的最后一个关口,在拦截非法数据方面,起到了至关重要的作用。
单纯的使用 if...e1se...的形式对数据合法性进行验证,效率低下、出错率高、维护性差。因此,推荐使用第三方数据验证模块,来降低出错率、提高验证的效率与可维护性,让后端程序员把更多的精力放在核心业务逻辑的处理上。
(1)安装joi包,为表单中携带的每个数据项,定义验证规则
npm i joi
(2)安装@escook/express-joi中间件,来实现自动对表单数据进行验证的功能
npm i @escook/express-joi
(3)新建/schema/user.js用户信息验证规则模块,并初始化代码
//导入joi
const joi = require('joi')
/*** string 值必须是字符串* alphanum 值只能是包含a-zA-Z0-9的字符串* min(length)最小长度* max(length)最大长度* required() 值是必填项,不能为undefined* pattern(正则表达式) 值必须符合正则表达式的规则*/
//定义用户名和密码的验证
const username = joi.string().alphanum().min(1).max(10).required()
const password = joi.string().pattern(/^[\S]{6,12}$/).required()//定义验证注册和登录表单数据的规则对象
exports.reg_login_schema = {body: {username,password}
}
(4)修改router/user.js中的代码
const express = require('express')
//创建路由对象
const router = express.Router()//打入用户路由处理函数模块
const userHandler = require('../router_handler/user')//导入验证数据的中间件
const expressJoi = require('@escook/express-joi')
//导入需要的验证规则对象
const {reg_login_schema} = require('../schema/user')//注册新用户--新
//1.在注册新用户的路由中,声明局部中间件,对当前请求中携带的数据进行验证
//2.数据验证通过后,会把这次请求流转给后面的路由处理函数
//3.数据验证失败后,终止后端代码的执行,并抛出一个全局的error错误,进入全局错误级别中间件中进行处理
router.post('/register',expressJoi(reg_login_schema),userHandler.regUser )//登录---新
router.post('/login',userHandler.login)//导出路由对象
module.exports = router
(5)在app.js的全局错误级别中间件中,捕获验证失败的错误,并把验证失败的结果响应给客户端
//导入joi
const joi = require('joi')
//中间部分的省略//定义错误级别的中间件
app.use((err, req, res) => {//验证失败导致的错误if (err instanceof joi.ValidationError) {return res.trans(err)}//未知的错误res.trans(err)})
(6)在router_handler/user.js文件中,注册用户处理函数这一块注释掉下面的代码
// if (!userInfo.username || !userInfo.password) {// return res.trans('用户名或密码不合法',400)// }
2.登录
2.1检测登录表单的数据是否合法
将router/user.js中登录的路由代码修改如下
//登录---新
router.post('/login',expressJoi(reg_login_schema),userHandler.login)
2.2根据用户名查询用户的数据
(1)接收表单数据
//获取客户端提交到服务器的用户信息const userInfo = req.body
(2)定义SQL语句
//定义SQL语句,查询用户名是否被占用const sqlStr='select * from ev_users where username=?'
(3)执行SQL语句,查询用户的数据
db.query(sqlStr, userInfo.username, (res, results) => {//执行SQL语句失败if (err) {return res.trans(err)}//执行SQL语句成功,但是查询到数据条数不等于1if (results.length != 1) {return res.trans('登录失败')}})
2.3判断用户输入的密码是否正确
核心:调用bcrypt.compareSync(用户提交的密码,数据库中的密码)方法比较密码是否一致。
db.query(sqlStr, userInfo.username, (err, results) => {//执行SQL语句失败if (err) {return res.trans(err)}//执行SQL语句成功,但是查询到数据条数不等于1if (results.length != 1) {return res.trans('登录失败',405)}//用户输入的密码和数据库中存储的密码进行对比const compareResult = bcrypt.compareSync(userInfo.password, results[0].password)console.log('这是:',compareResult,results[0].password,userInfo.password)//如果对比的结果等于false,则证明用户输入的密码错误if (!compareResult) {return res.trans('登录失败',400)} res.send('ok')})
2.4生成jwt的token字符串
注意:在生成token字符串的时候,一定要提出密码和头像的值
(1)通过es6的高级语法,快速剔除密码和头像的值,该代码书写于上述对比输入密码语句之后
//在服务器端生成token字符串const user = { ...results[0] ,password:'',user_pic:''}console.log(user,'这是:')
(2)安装生成token字符串的包
npm i jsonwebtoken
(3)在router_handler/user.js文件的头部区域,导入jsonwebtoken包
//导入生成的token包
const jwt=require('jsonwebtoken')
(4)创建config.js文件,并向外共享加密和还原token的jwtSecretKey字符串
module.exports = {//加密和解密的token密钥jwtSecretKey: 'test',//token有效期expiresIn:'10h'
}
(5)将用户信息对象加密成token字符串
//导入密钥配置文件
const config=require('../config.js')//对用户的信息进行加密,生成token字符串
const tokenStr = jwt.sign(user, config.jwtSecretKey, { expiresIn: config.expiresIn })
console.log('这是:', tokenStr)
(6)将生成的token字符串响应给客户端
//调用res.send()将token响应给客户端res.send({code: 200,message: 'success',token: 'Bearer '+tokenStr,detail:'登
})
2.5配置解析token的中间件
(1)安装解析token的中间件
npm i express-jwt@5.3.3
(2)在app.js中注册路由之前,配置解析token的中间件
//一定要在路由之前配置解析token的中间件
const { expressJwt } = require('express-jwt')
const config = require('./config')
app.use(expressJwt({ secret: config.jwtSecretKey}).unless({path:[/^\/api/]}))
(3)在app.js中的错误级别中间件中,铺货并处理token认证失败后的错误
//定义错误级别的中间件---暂不使用
app.use((err, req, res,next) => {//验证失败导致的错误// if (err instanceof joi.ValidationError) return res.trans(err)if(err.name==='UnauthorizedError') return res.trans('身份认证失败',401)// //未知的错误res.trans(err)
})
相关文章:
利用node.js搭配express框架写后端接口(一)
Node.js 凭借其高效的非阻塞 I/O 操作、事件驱动架构以及轻量级的特点,成为了开发高性能服务器应用的热门选择。Express 框架作为 Node.js 上最流行的 Web 应用框架之一,以其简洁的 API 和丰富的中间件生态系统,极大地简化了 Web 后端开发流程…...
python-leetcode-最长公共子序列
1143. 最长公共子序列 - 力扣(LeetCode) class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:m, n len(text1), len(text2)dp [[0] * (n 1) for _ in range(m 1)]for i in range(1, m 1):for j in range(1, n …...
【前端基础】Day 1 HTML
总结: 1. Web标准的构成 2. 基本标签 目录 1. Web标准的构成 2. 基本标签 2.1快捷键 2.2.1标题标签 2.2.2段落和换行标签 2.2.3文本格式化标签 2.2.4div和span标签 2.3.1 图像标签和路径 2.3.2路径 2.3.3超链接标签 2.4注释标签 2.5特殊字符 1. Web标准…...
Python解决“比赛配对”问题
Python解决“比赛配对”问题 问题描述测试样例解决思路代码 问题描述 小R正在组织一个比赛,比赛中有 n 支队伍参赛。比赛遵循以下独特的赛制: 如果当前队伍数为 偶数,那么每支队伍都会与另一支队伍配对。总共进行 n / 2 场比赛,…...
前端设计稿转代码工具深度评测:从效率革命到落地困境
前端设计稿转代码工具深度评测:从效率革命到落地困境 ——2025年主流工具横向对比与技术破局路径 一、工具演进史:从"机械翻译"到"AI设计师" 前端设计稿转代码工具经历了三个阶段进化:早期基于规则匹配的代码生成器(2015-2020)、智能布局识别工具(…...
【02】Cocos游戏开发引擎从0开发一款游戏-cocos项目目录结构熟悉-调试运行项目-最重要的assets资源文件认识-场景sense了解-优雅草卓伊凡
【02】Cocos游戏开发引擎从0开发一款游戏-cocos项目目录结构熟悉-调试运行项目-最重要的assets资源文件认识-场景sense了解-优雅草卓伊凡 开发背景 接下来我们直接打开我们的项目开始进一步操作, 实战开发 导入项目 我把得到的项目解压到本地,我们开…...
管理后台环境配置
1. 后端配置及启动 a. 软件安装 Java sdk 1.8 maven 3.6 intellij IDEA 2024 Visual C Redistributable mongodb mysql wsl (管理员:wsl --install) redis curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/shar…...
STM32寄存器控制引脚高低电平
一. 引子 最近在学习32代码的过程当中,虽然在学习IMX6ULL开发板的过程中接触过很多寄存器,最近在返回去看32的时候,在研究代码的时候发现自己对于寄存器的有些特性理解的不够深刻,所以下来的时候去查了资料,以及问了一…...
vue 设置生产 开发 测试环境
在 Vue.js 中,可以通过配置不同的环境变量来区分生产、开发和测试环境的请求。一般情况下,我们使用 webpack 或 Vite 进行构建,它们都支持环境变量的配置。 以下是如何在 Vue 项目中配置不同环境的请求: 1. 配置 .env 文件 在项…...
《模拟器过检测教程:Nox、雷电、Mumu、逍遥模拟器 Magisk、LSposed 框架安装与隐藏应用配置》
一、夜神模拟器 (Nox) 过检测 使用版本:7.0.6.2(20250209) 1. 准备工作 将需要用到的应用放入文件夹: C:\Users\Administrator.DESKTOP-I5V50SS\Nox_share\Download 2. 安装面具鸭(Magisk) 在模拟器下…...
Three.js包围盒
目录 前言 包围矩形Box2 包围盒Box3 包围球Sphere Box3方法.setFromPoints() 几何体方法.computeBoundingBox() 几何体居中方法center() Box3方法.expandByObject() Box3方法.expandByScalar() Box3方法.getSize() Box3方法.getCenter() Sphere方法.getBoundingSp…...
JBoltAI_SpringBoot 资源管理:打造一站式 AI 资源管理平台
在 AI 项目开发中,资源管理一直是个让人头疼的问题。各种模型、数据库、嵌入资源等,如果没有一个统一的管理平台,很容易让开发者陷入混乱。今天,就给大家介绍一个超级实用的资源管理功能 ——JBoltAI_SpringBoot 资源管理…...
Vue2+Element实现Excel文件上传下载预览【超详细图解】
目录 一、需求背景 二、落地实现 1.文件上传 图片示例 HTML代码 业务代码 2.文件下载 图片示例 方式一:代码 方式二:代码 3.文件预览 图片示例 方式一:代码 方式二:代码 一、需求背景 在一个愉快的年后ÿ…...
迪米特法则
迪米特法则 迪米特法则又叫最少知识原则。 只和你的直接朋友交流,不和 ‘陌生人’ 说话。 含义:如果两个软件实体无需直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度ÿ…...
【Swift 算法实战】判断数组中是否存在重复元素
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
机器学习数学基础:35.效度
效度全攻略:从理论到实践的深度剖析 一、效度(Validity)入门:揭开精准测量的面纱 效度,简单来说,就是测量工具能否准确命中目标的“命中率”。想象你手中有一把枪(测量工具)&#…...
excel单、双字节字符转换函数(中英文输入法符号转换)
在Excel中通常使用函数WIDECHAR和ASC来实现单、双字节字符之间的转换。其中 WIDECHAR函数将所有的字符转换为双字节,ASC函数将所有的字符转换为单字节 首先来解释一下单双字节的含义。单字节一般对应英文输入法的输入,如英文字母,英文输入法…...
重学SpringBoot3-整合 Elasticsearch 8.x (二)使用Repository
更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞??收藏评论 整合 Elasticsearch 8.x (二)使用Repository 1. 环境准备 1.1 项目依赖1.2 Elasticsearch 配置 2. 使用Repository的基本步骤 2.1 创建实体类2.2 创建 Reposit…...
Jenkinsfile流水线构建教程
前言 Jenkins 是目前使用非常广泛的自动化流程的执行工具, 我们目前的一些自动化编译, 自动化测试都允许在 Jenkins 上面. 在 Jenkins 的术语里面, 一些自动化工作联合起来称之为流水线, 比如拉取代码, 编译, 运行自动化测试等. 本文的主要目的是引导你快速熟悉 Jenkinsfile …...
比创达电子科技-EMC干货之防静电技术
EMC干货之防静电技术 什么是静电放电 两个具有不同静电电位的物体,由于直接接触或静电场感应引起两物体间的静电电荷的转移,静电电场的能量达到一定程度后,击穿其间介质而进行放电的现象就是静电放电,简称为ESD(Electro Static Discharge)。 静电产生的原…...
PDF扫描档智能方向识别:多模型投票机制的实践测试 救活古典书籍
2025-02-22 20:10物联全栈123 尊敬的诸位!我是一名物联网工程师。关注我,持续分享最新物联网与AI资讯和开发实战。期望与您携手探寻物联网与 AI 的无尽可能 RAG知识库搭建的过程中,扫描档pdf的支持和准确率一直是个大家都不愿主动提起的事情…...
算法教程:岛的最大面积
算法教程:岛的最大面积 我们将首先讨论问题和解决方案,然后使用可视化工具(上一篇博客中进行了介绍)来更好地理解搜索过程。 问题描述 我们将要演练的具体问题是问题 Leetcode:岛屿的最大面积。在 Leetcode 上找到的直接问题描述是: 给你一个 m x n 二进制矩阵网格。岛…...
18439二维前缀和
18439二维前缀和 ⭐️难度:中等 📖 📚 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();int m scanner.nextInt();int q s…...
information_schema.processlist 表详解
information_schema.processlist 表(或 SHOW PROCESSLIST; 命令)用于查看 MySQL 当前所有的连接进程,帮助管理员监控数据库活动并排查性能问题。以下是该表的字段及其具体含义: 🔹 information_schema.processlist 字段…...
数字化转型数据自动采集统计分析发那科(FANUC)数据采集
针对各类数控机床,特别是FANUC系列的数据自动采集需求,以下是一个综合性的解决方案,并详细说明了如何采集FANUC系列机床的各类数据。 一、数据采集方案概述 协议支持: 以适应不同数控机床的通信需求。 针对FANUC系列机床…...
olmOCR:使用VLM解析PDF
在PDF解析中,目前主流的开源工具包括Minuer、GOT OCR等。主要都是通过飞桨等OCR套件组装的一套pipeline,或者直接通过VLM解析图像。 #一、 olmOCR是使用VLM进行的端到端的PDF文档解析 二、document-anchoring 与上述的不同在于,olmOCR使用…...
【自学嵌入式(11)闪存文件系统的应用】
闪存文件系统的应用 闪存文件插件程序的配置上传程序实例一上传程序实例二——上传文件到ESP8266的程序 上篇文章简要了解了闪存文件系统的概念,相关头文件、类以及方法。但我们只尝试了向开发板中传输文本数据,对于更加复杂的内容(如一个界面、一个互动…...
Spring Cloud——路由网关Zuul
??? 哈喽!大家好,我是【一心同学】,一位上进心十足的【Java领域博主】!??? 【一心同学】的写作风格:喜欢用【通俗易懂】的文笔去讲解每一个知识点,而不喜欢用【高大上】的官方陈述。 【一心同学】博客…...
ShenNiusModularity项目源码学习(14:ShenNius.Infrastructure项目分析)
ShenNius.Infrastructure项目用于定义ShenNius.Admin.Mvc项目和ShenNius.Admin.API项目共用的特性类、数据操作接口实现类、上下文类、通讯类,主要文件的用途如下: Attributes文件夹保存特性类或过滤器类定义,主要包括: …...
【博资考4】网安学院-硕转博考试内容
【博资考4】硕转博考试内容 - 网络安全与基础理论 写在最前面一. **21年硕转博面试内容回顾**网络、逆向、操作系统、攻防、漏洞1. **网络安全常见攻击方式及其防范措施**1.1 **DDoS攻击(分布式拒绝服务)**1.2 **SQL注入攻击**1.3 **XSS攻击(…...
web前端初学Angular由浅入深上手开发项目
Angular 是一个功能强大的前端框架,适合构建复杂的企业级应用。作为初学者,通过由浅入深的学习路径,可以快速上手并开发项目。以下是逐步学习 Angular 的指导: 1. 基础知识 (1) 了解 Angular Angular 是什么? Angul…...
5.10 P-Tuning v2:多层级提示编码的微调革新
P-Tuning v2:多层级提示编码的微调革新 一、技术架构解析 #mermaid-svg-4Wy6vkXZi67hY9PZ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-4Wy6vkXZi67hY9PZ .error-icon{fill:#552222;}#mermaid-svg-4Wy6vkXZi67h…...
RuntimeWarning: invalid value encountered in scalar power在进行标量的幂运算时遇到了无效值
year_profit ((profit / initial_cash) ** (1 / yy) - 1) * 100 RuntimeWarning: invalid value encountered in scalar power 这个警告表示在执行标量幂运算 ((profit / initial_cash) ** (1 / yy) - 1) * 100 时遇到了无效值。常见的引发原因及解决办法如下: ###…...
LabVIEW同步数据采集功能
VI通过使用数据采集(DAQ)硬件系统,进行多通道同步采集,实时获取模拟信号数据。它利用外部时钟信号触发数据采集,支持连续采样模式,并将采集到的数据实时显示在波形图上,方便用户进行数据监控和分…...
(21)从strerror到strtok:解码C语言字符函数的“生存指南2”
❤个人主页:折枝寄北的博客 ❤专栏位置:简单入手C语言专栏 目录 前言1. 错误信息报告1.1 strerror 2. 字符操作2.1 字符分类函数2.2 字符转换函数 3. 内存操作函数3.1 memcpy3.2 memmove3.2memset3.3 memcmp 感谢您的阅读 前言 当你写下strcpy(dest, s…...
【Azure 架构师学习笔记】- Azure Databricks (12) -- Medallion Architecture简介
本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (11) – UC搭建 前言 使用ADB 或者数据湖,基本上绕不开一个架构“Medallion”, 它使得数据管理更为简单有效。ADB 通过…...
Golang——内存(内存管理、内存逃逸、垃圾回收 (GC) 机制)
大家好,这里是编程Cookbook。本文详细介绍Go内存相关的内容,包括内存管理、内存逃逸、垃圾回收 (GC) 机制的三色标记,写屏障。 文章目录 Go 的内存管理mspan && arenasarenasmspan mcachemcentralmheap内存分配逻辑内存回收逻辑优势内…...
关系型数据库的技术思路
一、网络协议 需要根据TCP协议设计一个客户端和服务器之间的命令响应协议。 1、服务端回复声明 2、客户端发送登录包 3、服务端返回登录结果 4、登录成功后进入命令阶段,否则退出。 二、每个连接用一个线程 服务器为每个客户端连接开启一个线程。 三、需要文件的随机…...
web安全——分析应用程序
文章目录 一、确定用户输入入口点二、确定服务端技术三、解析受攻击面 一、确定用户输入入口点 在检查枚举应用程序功能时生成的HTTP请求的过程中,用户输入入口点包括: URL文件路径 通常,在查询字符?之前的URL部分并不视为用户输入入口&am…...
数据库事务的基本要素(ACID)
数据库事务的基本要素(ACID) 在数据库管理系统(DBMS)中,事务(Transaction)是一个或多个数据库操作的集合,这些操作要么全部成功,要么全部失败。事务的目标是保证数据的一…...
server.servlet.session.timeout: 12h(HTTP 会话的超时时间为 12 小时)
从你提供的配置文件(应该是 Spring Boot 的 application.yml 或 application.properties 文件)来看,以下部分与会话超时时间相关: server:servlet:session:timeout: 12h # timeout: 30cookie:name: VENDER_SID会话超时时间的…...
Docker数据卷容器实战
数据卷容器 数据共享 上面讲述的是主机和容器之间共享数据,那么如何实现容器和容器之间的共享数据呢?那就是创建 创建数据卷容器。 命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载…...
基于LangChain4j调用火山引擎DeepSeek R1搭建RAG知识库实战指南
基于LangChain4j调用火山引擎DeepSeek R1搭建RAG知识库实战指南 基于LangChain4j调用火山引擎DeepSeek R1搭建RAG知识库实战指南 基于LangChain4j调用火山引擎DeepSeek R1搭建RAG知识库实战指南一、注册火山引擎账号二、RAG技术核心原理三、环境与工具准备1. 核心组件2. 依赖配…...
Java内存的堆(堆内、堆外)、栈含义理解笔记
一、核心概念区分 1. 内存中的堆(Heap)与栈(Stack) 栈内存 ▸ 用途:存储方法调用、局部变量、基本类型数据(如 int a 1) ▸ 特点: 线程私有,每个线程独立分配栈空间。…...
2.7 大模型RAG内容安全合规检查-大模型ACP模拟题-真题
单选题 在RAG应用中,输入内容合规检查的正确顺序是? A. 先处理模型生成,后检查用户输入 B. 先检查用户输入,后处理模型生成 ✅ C. 仅检查用户输入 D. 仅检查模型输出 解析:合规流程应优先过滤用户输入风险࿰…...
C#从入门到精通(35)—如何防止winform程序因为误操作被关闭
前言: 大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任软件经理,从事C#上位机软件开发8年以上!我们在开发的上位机软件运行起来以后,一般在右上角都有一个关闭按钮,正常情况下点击关闭按钮就能关闭软件,但是不排除我们不想关闭软件,但是因为不…...
特斯拉 FSD 算法深度剖析:软件层面全解读
一、引言 特斯拉的 FSD(Full Self-Driving)系统作为自动驾驶领域的前沿成果,其软件层面的算法设计至关重要。本文将从软件的角度,深入探讨特斯拉 FSD 所采用的算法,包括感知、规划、控制等多个方面,以期为…...
中央一号文件里的三维革命:数字孪生如何重构智慧乡村生态?
2024年中央一号文件提出"建设宜居宜业和美乡村",这一目标背后离不开数字技术的支撑。在浙江某数字乡村试点,凡拓数创通过三维建模还原整村风貌,路灯能耗、垃圾分类、古建保护等数据在虚拟空间中实时跳动。管理人员坦言:…...
DeepSeek 助力 Vue3 开发:打造丝滑的页眉(Header)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
一个原教旨的多路径 TCP
前面提到过 ECMP 和 TCP 之间的互不友好,pacing 收益和中断开销的互斥,在事实上阻碍了 packet-based LB 的部署,也限制了交换机,服务器的并发性能,同时潜在增加了 bufferbloat 的概率,而适用 packet-based …...