Go 项目如何集成类似mybatisPlus插件呢?GORM走起!!
导读:
在 Go 项目中,虽然没有像 MyBatis Plus 这样特定的 ORM 插件,但可以使用功能相似的 Go ORM 框架,比如 GORM,它支持链式查询、自动迁移、预加载等功能,与 MyBatis Plus 有相似之处。通过一些插件或扩展,可以实现更丰富的功能,比如软删除、分页查询等。下面是 GORM 集成的一些步骤和相关插件的推荐,本文以之前集成的项目Go语言?IDEA能支持吗?增删查走起?_go idea-CSDN博客为模版在此基础上进行迭代。
目录
一、引入GORM
二、GORM能力:
2.1分页查询:
2.2软删除
2.3分页拓展
2.4链式查询
2.5自定义拓展
三、源码改造
3.1改造数据库连接类database.go
3.2改造中间件DBMiddleware
3.3 改造userDao.go
3.4 改造userService.go
3.5 改造router.go
3.6 改造main.go
四、启动
五、异常情况:
5.1解决思路:
六、复杂查询拓展:
6.1实体类Orders.go
6.2新增OrderInfoDTO.go
6.3新增GetUserWithOrders方法:
一、引入GORM
先在项目中引入 GORM:
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql # 根据你的数据库类型选择驱动
二、GORM能力:
GORM 提供了一些类似 MyBatis Plus 的功能,比如:
- 软删除:通过
gorm.Model或自定义字段来实现软删除。 - 条件查询:可以通过链式查询构建条件查询。
- 分页插件:可以手动实现分页,或使用封装的分页插件。
2.1分页查询:
go 一遍集成GORM 的 Limit 和 Offset 方法实现分页查询:
var users []User
db.Limit(10).Offset(20).Find(&users) // 查询第 21-30 条数据
2.2软删除
例如:通过 gorm.Model 或自定义字段来实现软删除。
type User struct {gorm.ModelName stringAge int
}db.Delete(&user) // 软删除
2.3分页拓展
可以手动实现分页,或使用封装的分页插件比如分页器 github.com/biezhi/gorm-paginator 。
2.4链式查询
GORM 支持链式调用来构建复杂的查询:
var users []User
db.Where("age > ?", 18).Find(&users)
2.5自定义拓展
如果需要类似 MyBatis Plus 的扩展功能,你可以通过自定义 GORM 的钩子函数(Hooks)或中间件,来实现数据插入、更新时自动添加字段等逻辑。GORM 提供了生命周期回调接口,可以在执行操作前后进行拦截和处理。
三、源码改造
3.1改造数据库连接类database.go
-
引入 GORM:通过
gorm.io/gorm和gorm.io/driver/mysql代替原来的database/sql。 -
初始化数据库连接:使用
gorm.Open()方法替代sql.Open(),并且支持更多的配置参数,比如charset=utf8mb4和parseTime=True。 -
GetDB 函数:返回
*gorm.DB类型的数据库实例,供其他模块使用。 -
这边删除了原先的func GetDB() *sql.DB { return DB } 方法
package configimport ("fmt""gorm.io/driver/mysql""gorm.io/gorm""gorm.io/gorm/logger""log"
)var DB *gorm.DB// InitGormDatabase 初始化 GORM 数据库连接并返回 *gorm.DB
func InitGormDatabase() *gorm.DB {dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",AppConfig.Database.User,AppConfig.Database.Password,AppConfig.Database.Host,AppConfig.Database.Port,AppConfig.Database.DBName,)var err errorDB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: logger.Default.LogMode(logger.Info),})if err != nil {log.Fatalf("Failed to connect to database: %v", err)return nil}log.Println("GORM database successfully connected")return DB
}
3.2改造中间件DBMiddleware
这边说明一下,中间件的引入是刚搭建项目时想从java中的切面编程来实现跨功能关注点的处理。比如数据库的连接。但是呢go没有内置切面的支持。所以就引入了中间件模式,每次调用数据库操作都通过中间件来处理。下面是优化前的中间件:
package middlewareimport ("database/sql""go_tas/dao/database""log"
)type DBMiddleware struct {db *sql.DB
}func NewDBMiddleware() *DBMiddleware {return &DBMiddleware{db: database.GetDB(),}
}func (mw *DBMiddleware) ExecuteQuery(query string, args ...interface{}) (*sql.Rows, error) {rows, err := mw.db.Query(query, args...) // 使用中间件中保存的 dbif err != nil {return nil, mw.logError("Failed to execute query", err)}return rows, nil
}func (mw *DBMiddleware) ExecuteExec(query string, args ...interface{}) (int64, error) {result, err := mw.db.Exec(query, args...) // 使用中间件中保存的 dbif err != nil {return 0, mw.logError("Failed to execute exec", err)}insertID, err := result.LastInsertId()if err != nil {return 0, mw.logError("Failed to get last insert ID", err)}return insertID, nil
}func (mw *DBMiddleware) BeginTransaction() (*sql.Tx, error) {tx, err := mw.db.Begin() // 使用中间件中保存的 dbif err != nil {return nil, mw.logError("Failed to begin transaction", err)}return tx, nil
}func (mw *DBMiddleware) logError(message string, err error) error {log.Printf("%s: %v", message, err)return err
}
使用原生的 database/sql 改造为使用 GORM,可以直接使用 GORM 的功能来处理查询、事务等操作。GORM 已经封装了这些常见的操作,并且支持更简洁的 API。
下面是改造后的 middleware 模块,使用 GORM 替代 database/sql:
-
gorm.DB替换sql.DB:DBMiddleware中的db现在使用*gorm.DB,所有的数据库操作通过 GORM 进行。 -
ExecuteQuery方法:- 使用 GORM 的
Raw方法执行原生 SQL 查询,并通过Scan将结果映射到传入的model结构体。 - 原生 SQL 查询返回的结果可以映射到结构体切片中。
var users []User middleware.ExecuteQuery(&users, "SELECT * FROM users WHERE age > ?", 18) - 使用 GORM 的
-
ExecuteExec方法:- 使用 GORM 的
Exec方法执行修改(插入、更新、删除)语句。 - 返回执行后影响的行数,而不是插入 ID。
- 使用 GORM 的
-
事务管理:
- 使用 GORM 的
Begin方法开启事务,返回事务对象*gorm.DB。
tx, err := middleware.BeginTransaction() if err != nil {// handle error } // 在事务中执行操作 err = tx.Create(&user).Error if err != nil {tx.Rollback() } else {tx.Commit() }中间件现在可以使用 GORM 的功能,简化数据库操作并支持复杂的 ORM 功能。
- 使用 GORM 的
package middlewareimport ("go_tas/dao/database""log""gorm.io/gorm"
)type DBMiddleware struct {db *gorm.DB
}func NewDBMiddleware() *DBMiddleware {return &DBMiddleware{db: database.GetDB(), // 使用 GORM 的 DB 实例}
}// ExecuteQuery 执行查询语句
func (mw *DBMiddleware) ExecuteQuery(model interface{}, query string, args ...interface{}) error {result := mw.db.Raw(query, args...).Scan(model) // 使用 GORM 的 Raw 方法if result.Error != nil {return mw.logError("Failed to execute query", result.Error)}return nil
}// ExecuteExec 执行修改语句(插入、更新、删除)
func (mw *DBMiddleware) ExecuteExec(query string, args ...interface{}) (int64, error) {result := mw.db.Exec(query, args...) // 使用 GORM 的 Exec 方法if result.Error != nil {return 0, mw.logError("Failed to execute exec", result.Error)}return result.RowsAffected, nil // 返回影响的行数
}// BeginTransaction 开启事务
func (mw *DBMiddleware) BeginTransaction() (*gorm.DB, error) {tx := mw.db.Begin() // 使用 GORM 的事务支持if tx.Error != nil {return nil, mw.logError("Failed to begin transaction", tx.Error)}return tx, nil
}// logError 记录错误信息
func (mw *DBMiddleware) logError(message string, err error) error {log.Printf("%s: %v", message, err)return err
}
3.3 改造userDao.go
使用原生 SQL 改造为使用 GORM,可以直接利用 GORM 的模型操作方法来简化数据库操作。GORM 允许直接对结构体进行增删改查,而不需要手动编写 SQL 查询
package daoimport ("go_tas/entity""gorm.io/gorm""log"
)type UserDAO struct {db *gorm.DB
}// NewUserDAO 创建新的 UserDAO 实例
func NewUserDAO(db *gorm.DB) *UserDAO {return &UserDAO{db: db}
}// GetAllUsers 获取所有用户
func (dao *UserDAO) GetAllUsers() ([]entity.User, error) {var users []entity.User// 使用 GORM 查询所有用户if err := dao.db.Find(&users).Error; err != nil {log.Printf("Failed to get users: %v", err)return nil, err}return users, nil
}// CreateUser 创建新用户
func (dao *UserDAO) CreateUser(user *entity.User) (int64, error) {// 使用 GORM 创建用户if err := dao.db.Create(user).Error; err != nil {log.Printf("Failed to create user: %v", err)return 0, err}// 返回创建的用户 IDreturn int64(user.ID), nil
}
3.4 改造userService.go
使用 GORM 替代原生 SQL 操作来进行数据处理。可以将事务处理和数据库操作使用 GORM 的特性进行简化和改造
package serviceimport ("encoding/json""go_tas/dao""go_tas/entity""go_tas/utils""gorm.io/gorm""net/http"
)// GetUsers 获取所有用户
func GetUsers(w http.ResponseWriter, r *http.Request, db *gorm.DB) {userDAO := dao.NewUserDAO(db)users, err := userDAO.GetAllUsers()if err != nil {utils.HandleError(w, http.StatusInternalServerError, "Failed to retrieve users", err)return}respondWithJSON(w, http.StatusOK, users)
}// CreateUser 创建新用户
func CreateUser(w http.ResponseWriter, r *http.Request, db *gorm.DB) {var user entity.Userif err := json.NewDecoder(r.Body).Decode(&user); err != nil {utils.HandleError(w, http.StatusBadRequest, "Invalid request payload", err)return}// 开始一个事务tx := db.Begin()if tx.Error != nil {utils.HandleError(w, http.StatusInternalServerError, "Failed to begin transaction", tx.Error)return}defer func() {if r := recover(); r != nil {tx.Rollback() // 回滚事务utils.HandleError(w, http.StatusInternalServerError, "Internal server error", nil)}}()// 插入用户数据userDAO := dao.NewUserDAO(tx)if _, err := userDAO.CreateUser(&user); err != nil {tx.Rollback() // 回滚事务utils.HandleError(w, http.StatusInternalServerError, "Failed to create user", err)return}// 提交事务if err := tx.Commit().Error; err != nil {utils.HandleError(w, http.StatusInternalServerError, "Failed to commit transaction", err)return}respondWithJSON(w, http.StatusCreated, user)
}// respondWithJSON 处理JSON响应
func respondWithJSON(w http.ResponseWriter, status int, payload interface{}) {w.Header().Set("Content-Type", "application/json")w.WriteHeader(status)if err := json.NewEncoder(w).Encode(payload); err != nil {utils.HandleError(w, http.StatusInternalServerError, "Failed to encode response data", err)}
}
3.5 改造router.go
将 router 中的数据库操作从 dbMiddleware 改为使用 GORM 数据库连接,并清理代码逻辑
package routerimport ("github.com/gorilla/mux"httpSwagger "github.com/swaggo/http-swagger""go_tas/controller""go_tas/middleware""go_tas/service""gorm.io/gorm""net/http"
)func InitRouter(authMiddleware *middleware.CustomAuthMiddleware, db *gorm.DB) *mux.Router {r := mux.NewRouter()// 添加身份验证中间件r.Use(authMiddleware.Middleware)// 使用 GORM 数据库连接r.HandleFunc("/users", func(w http.ResponseWriter, r *http.Request) {service.GetUsers(w, r, db)}).Methods("GET")r.HandleFunc("/users", func(w http.ResponseWriter, r *http.Request) {service.CreateUser(w, r, db)}).Methods("POST")// 设备控制接口r.HandleFunc("/tas/control", controller.Control).Methods("POST")r.HandleFunc("/tas/adminControl", controller.AdminControl).Methods("POST")// Swagger Handlerr.PathPrefix("/swagger/").Handler(httpSwagger.WrapHandler)return r
}
3.6 改造main.go
main 函数中,可以将原本使用的 dbMiddleware 改为直接使用 GORM 初始化的数据库连接,以便与前面改造的代码保持一致
package mainimport ("go_tas/config""go_tas/logger""go_tas/middleware""go_tas/router""log""net/http"
)func main() {// 初始化配置config.InitConfig()log.Println("Config initialized")// 初始化数据库,获取 GORM 数据库连接db := config.InitGormDatabase()if db == nil {log.Fatal("Failed to initialize database")}log.Println("Database initialized with GORM")// 初始化 Redisconfig.InitRedis()log.Println("Redis initialized")// 初始化日志logger.InitLogger()// 初始化认证中间件appCode := config.AppConfig.AppCodeappSecret := config.AppConfig.AppSecretauthMiddleware := middleware.NewCustomAuthMiddleware(appCode, appSecret)// 初始化路由并传递 GORM 数据库连接r := router.InitRouter(authMiddleware, db)log.Println("authMiddleware initialized")// 启动服务器log.Println("Starting server on :8080")log.Fatal(http.ListenAndServe(":8080", r))
}
四、启动

五、异常情况:
如果提示Table 'go_data_base.users' doesn't exist这种情况可以查看一下实体类,原因可能是由于查询时表名不匹配造成的。GORM 默认会使用复数形式表名进行查询,因此它在查找 users 表,而你的实际表名是 user。
5.1解决思路:
可以通过在 GORM 模型中设置表名
package entitytype User struct {ID int `json:"id"`Name string `json:"name"`Email string `json:"email"`
}// TableName 指定表名为 user
func (User) TableName() string {return "user"
}
六、复杂查询拓展:
如果涉及多表关联查询则可使用Joins来进行SQL联表查询,下面举个栗子:
6.1实体类Orders.go
package entitytype Orders struct {ID int `json:"id"`UserId int `json:"user_id"`Amount int `json:"amount"`Description string `json:"description"`
}func (Orders) TableName() string {return "orders"
}
6.2新增OrderInfoDTO.go
package dtotype OrderInfoDTO struct {ID int `json:"id"`Name string `json:"name"`Email string `json:"email"`Amount int `json:"amount"`Description string `json:"description"`
}
6.3新增GetUserWithOrders方法:
在userDao.go 新增一个GetUserWithOrders方法,Joins 用于执行 SQL 联表查Select("users.*, orders.amount") 指定返回的字段,你可以选择返回哪些表的字段Scan(&users) 将查询结果扫描到 users 切片中。
func (dao *UserDAO) GetUsersWithOrderInfo() ([]dto.OrderInfoDTO, error) {var userInfo []dto.OrderInfoDTOerr := dao.db.Table("user").Joins("LEFT JOIN orders ON orders.user_id = user.id").Select("user.*, orders.*").Scan(&userInfo).Errorif err != nil {log.Printf("Failed to get users with order info: %v", err)return nil, err}return userInfo, nil
}
最后将数据库的语句:
DROP TABLE IF EXISTS `orders`;
CREATE TABLE `orders` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户ID',`amount` int(10) NULL DEFAULT NULL COMMENT '支付金额/分',`description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '商品描述',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,`email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;SET FOREIGN_KEY_CHECKS = 1;
如果需要源码的同学评论区把邮箱放置一下哈!
相关文章:
Go 项目如何集成类似mybatisPlus插件呢?GORM走起!!
导读: 在 Go 项目中,虽然没有像 MyBatis Plus 这样特定的 ORM 插件,但可以使用功能相似的 Go ORM 框架,比如 GORM,它支持链式查询、自动迁移、预加载等功能,与 MyBatis Plus 有相似之处。通过一些插件或扩…...
《深度学习》Dlib库 CNN卷积神经网络 人脸识别
目录 一、如何实现CNN人脸识别 1、CNN核心概念 1)卷积层 2)池化层 3)激活函数 4)全连接层 2、步骤 1)加载预训练的人脸识别模型 2)读取图像并检测人脸 3)提取人脸特征向量 4…...
滚雪球学Redis[7.1讲]:Redis实战案例
全文目录: 🎉前言🚦1. 使用Redis实现会话管理在Web应用中使用Redis管理会话会话过期与刷新策略安全性考虑与优化 🧩2. 使用Redis实现缓存系统缓存的基本原理Redis缓存的应用场景缓存失效策略与雪崩预防 ✨3. Redis在排行榜系统中的…...
WordPress外部图片本地化插件
一款用于本地化文章的外部图片的插件,支持如下功能: 文章发布前通过编辑器插件本地化 文章手动发布时自动本地化 文章定时发布时自动本地化 针对已发布的文章批量本地化。 源码下载:https://download.csdn.net/download/m0_66047725/898963…...
Linux基础-shell的简单实现
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 Linux基础-shell的简单实现 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 1, 全局变…...
Tomcat日志文件详解及catalina.out日志清理方法
目录 前言1. Tomcat日志文件详解1.1 catalina.out1.2 localhost_access_log1.3 catalina.<date>.log1.4 host-manager.<date>.log 和 manager.<date>.log1.5 localhost.<date>.log 2. catalina.out文件管理与清理方法2.1 为什么不能直接删除catalina.o…...
react 中的hooks中的useState
(1). State Hook让函数组件也可以有state状态, 并进行状态数据的读写操作 (2). 语法: const [xxx, setXxx] React.useState(initValue) (3). useState()说明:参数: 第一次初始化指定的值在内部作缓存返回值: 包含2个元素的数组, 第1个为内部当前状态值, 第2个为更新状态值的…...
STM32学习笔记---DMA
目录 一、什么是DMA 1、DMA是什么 2、DMA的工作流程 3、DMA控制器与外设控制器 二、如何配置DMA 1、DMA框图 2、功能说明 2.1 通道选择 2.2 仲裁器 2.3 源、目标和传输模式 2.4 指针递增 2.5 循环模式 2.6 DMA流控制器和外设流控制器 3、程序设计 三、具体使用DMA…...
Cesium 实战 - 自定义纹理材质 - 立体墙(旋转材质)
Cesium 实战 - 自定义纹理材质 - 立体墙(旋转材质) 核心代码完整代码在线示例Cesium 给实体对象(Entity)提供了很多实用的样式,基本满足普通项目需求; 但是作为 WebGL 引擎,肯定不够丰富,尤其是动态效果样式。 对于实体对象(Entity),可以通过自定义材质,实现各种…...
进程间关系与守护进程
一、进程组 1.1、什么是进程组 提到进程的概念, 其实每一个进程除了有一个进程 ID(PID)之外 还属于一 个进程组。进程组是一个或者多个进程的集合, 一个进程组可以包含多个进程。 每一 个进程组也有一个唯一的进程组 ID(PGID), 并且这个 PG…...
金山翻译接口逆向
网址(加密后):aHR0cHM6Ly93d3cuaWNpYmEuY29tL3RyYW5zbGF0ZQ 文章目录 抓包sign值结果加密 逆向sign值第一步第二步1.2.3. 解密content第一步1.2.3. 抓包 F12 -> 翻译框输入spider -> 点击Fetch/XHR -> 找到接口 index.php? 开头的…...
unified-runtime编译与验证
unified-runtime编译与验证 一.创建容器二.编译unified-runtime三.生成一个cuda ptx kernel四.API测试 unified-runtime编译与验证 一.创建容器 docker run --gpus all --shm-size32g -ti \-e NVIDIA_VISIBLE_DEVICESall --privileged --nethost \--rm -it \-v $PWD:/home \-…...
【Python】最详细--基础语法
Python是一种强大且易于学习的编程语言,广泛用于各种应用程序的开发,如web开发、数据科学、人工智能等。以下是一些Python的基础知识: 1. Python的注释 Python的注释用于在代码中添加说明,以提高代码的可读性。注释在代码执行时…...
二叉树基础:什么样的二叉树适合用数组来存储?
二叉树基础:什么样的二叉树适合用数组来存储? 在计算机科学中,二叉树是一种非常重要的数据结构。它具有许多应用,如搜索、排序、表达式解析等。在存储二叉树时,我们可以使用多种方法,其中一种是使用数组。但是,并不是所有的二叉树都适合用数组来存储。那么,什么样的二…...
iTOP-RK3568开发板独立NPU通过算法加特应用到以下的场景
iTOP-3568开发板采用瑞芯微RK3568处理器,内部集成了四核64位Cortex-A55处理器。主频高达2.0Ghz,RK809动态调频。集成了双核心架构GPU,ARM G52 2EE、支持OpenGLES1.1/2.0/3.2、OpenCL2.0、Vulkan1.1、内嵌高性能2D加速硬件。 内置独立NPU,算力…...
Java基于SpringBoot微信小程序的跳蚤市场系统设计与实现(lw+数据库+讲解等)
项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…...
【分布式微服务云原生】《Redis 的高效之道:线程模型、IO 模型与 Reactor 模型全解析》
标题:《分布式缓存Redis 的高效之道:线程模型、IO 模型与 Reactor 模型全解析》 摘要:本文深入探讨分布式缓存 Redis 的 I线程模型、IO 模型以及 Reactor 模型。详细介绍了 Redis 在不同版本中的线程变化、IO 模型的特点和工作流程ÿ…...
科研类型PPT的制作技巧
目录 科研类型PPT的制作技巧 荣誉: 首页:ppt开头结尾 小标题 重点标记:加粗红色下划线 使用三线表 图片,文本排版 一、明确目的与受众分析 二、基础设计原则 三、内容组织与呈现 四、绘图与模型制作 五、其他注意事项 科研类型PPT的制作技巧 荣誉: 首页:ppt开…...
rom定制系列------小米6x_MIUI14_安卓13刷机包修改写入以及功能定制 界面预览
在接待一些定制化系统中。有很多工作室或者一些特殊行业的友友需要在已有固件基础上简略修改其中的功能。方便使用。例如usb调试默认开启。usb安装设置以及usb安装与内置删减一些app的定制服务。今天给友友预览其中小米6X此款机型定制相关的一些界面与功能演示。 定制机型以及…...
线性代数基础02
目录 1.向量 1.1向量的定义 1.2向量的运算 1.2.1向量加法 1.2.2向量数乘 1.2.3向量点积 1.3矩阵的特征值和特征向量 1.4向量的模 1.4.1向量的模的定义 1.4.2向量的模的几何解释 1.4.3向量的模的性质 1.5向量的内积 1.5.1向量的内积的定义 1.5.2向量的内积的几何解…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
