Go 语言即时通讯系统开发日志-日志day2-5:架构设计与日志封装
Go语言即时通讯系统开发日志day2
计划:学习go中MySQL,Redis的使用,使用MySQL和Redis完成一个单聊demo。
总结:现在每天下午用来开发这个项目,如果有课的话可能学习时间只有3-4个小时,再加上今天的学习效率不高;今天只做了一些开发规划,并了解了go语言如何使用MySQL,Redis,下了两篇博客,Go 语言 sqlx 库使用:对 MySQL 增删改查、Go 语言 Redis 使用 :安装、配置与操作,并把第一天的欠下的net/http库学习了解了一下,Go 语言 net/http 包使用:HTTP 服务器、客户端与中间件。打算先参照GitHub上的go-chat这个IM进行参考学习,后续有能力了再对项目的模块进行优化和重构。
项目实现顺序分析
大概分析了一下,后续开发的顺序,实际随情况而变,主要是为了防止每天开始学习时,不知从而下手的处境。
- 基础架构搭建
- 搭建项目结构
- 日志系统封装
- 配置系统
- WebSocket基础服务
- 实现WebSocket
- 连接管理
- 单聊核心功能
- 数据库表设计
- 数据模型
- 消息流转
- 前端实现(AI实现)
- 其他功能
- 消息状态
- 通知系统
- 用户认证
Go语言即时通讯系统开发日志day3
计划:了解Gin,Gorm框架的使用,构建项目结构,了解Go项目的开发流程。
总结:通过【最新Go Web开发教程】基于gin框架和gorm的web开发实战 (七米出品)学习了Go语言的Gin框架,Gorm框架。
Gin
Go语言 Gin框架 使用指南
Gin 是一个用 Go 编写的高性能 Web 框架,以轻量级和快速路由著称,适合构建 RESTful API 和微服务。它提供了中间件支持、JSON 解析、错误处理等常用功能,代码简洁且易于上手,是 Go 生态中最流行的 Web 框架之一。
Gorm
Go语言 GORM框架 使用指南
Gorm 是 Go 的 ORM(对象关系映射)库,支持 MySQL、PostgreSQL 等数据库,通过结构体模型操作数据,简化了数据库交互。它提供链式调用、事务管理、关联查询等功能,兼顾灵活性和易用性,适合快速开发数据驱动的应用。
两者常结合使用(Gin 处理 HTTP,Gorm 操作数据库)。可以看我写了的两篇博客了解其快速入门并使用。
Go语言即时通讯系统开发日志day4
计划:搭建项目基本结构,学习了解项目开发(架构、规范、开发了流程)等内容。
总结:写了两篇相关博客,Go语言 Gin框架 使用指南,Go语言 GORM框架 使用指南,快速浏览了一下 Go 语言项目开发实战(付费课程)。
项目架构
简单了解一下各种项目架构:
1. 分层架构(Layered Architecture)
- 核心思想:将系统分为若干层(如表现层、业务层、数据层),每层仅依赖下层。
- 优点:结构简单,易于分工和维护。
- 缺点:层间可能冗余,性能瓶颈(如数据库访问集中)。
- 场景:传统企业应用(如ERP、CRM)、教学示例。
2. MVC架构(Model-View-Controller)
- 核心思想:分离数据(Model)、界面(View)和逻辑(Controller)。
- 优点:开发快速,适合UI交互多的应用。
- 缺点:Controller易臃肿,不适合复杂业务逻辑。
- 场景:Web应用(如博客、内容管理系统)。
3. 微服务架构(Microservices)
- 核心思想:将单体应用拆分为独立的小服务,通过API通信。
- 优点:高扩展性、技术栈灵活、故障隔离。
- 缺点:分布式复杂性(如事务、网络延迟)、运维成本高。
- 场景:大型复杂系统(如电商平台、Uber)。
4. 事件驱动架构(Event-Driven Architecture, EDA)
- 核心思想:通过事件(消息)异步触发组件行为,松耦合。
- 优点:高实时性,易于扩展。
- 缺点:事件顺序难保证,调试复杂。
- 场景:实时系统(如金融交易、IoT)、最终一致性需求(如库存管理)。
5. 六边形架构(Hexagonal Architecture)
- 核心思想:核心业务与外部依赖(如DB、UI)解耦,通过“端口-适配器”交互。
- 优点:技术无关性,测试友好。
- 缺点:设计成本高,可能过度工程化。
- 场景:领域驱动设计(DDD)、长期演化的核心系统(如银行核心业务)。
6. CQRS(Command Query Responsibility Segregation)
- 核心思想:读写分离,命令(写操作)和查询(读操作)使用不同模型。
- 优点:独立优化读写性能,适合高并发查询。
- 缺点:数据同步延迟,实现复杂。
- 场景:社交平台、数据分析看板。
7. 无服务器架构(Serverless)
- 核心思想:开发者无需管理服务器,按需运行函数(如AWS Lambda)。
- 优点:零运维成本,自动扩缩容。
- 缺点:冷启动延迟,不适合长任务。
- 场景:低频任务(如定时作业、Webhook)、轻量API。
8. 空间基架构(Space-Based Architecture)
- 核心思想:通过分布式内存网格(如Redis)共享数据,避免数据库瓶颈。
- 优点:超高并发、低延迟。
- 缺点:数据一致性难保证,成本高。
- 场景:金融交易系统、实时游戏服务器。
9. 插件化架构(Plugin Architecture)
- 核心思想:核心系统提供扩展点,功能通过插件动态加载。
- 优点:灵活扩展,主系统轻量。
- 缺点:插件管理复杂,接口需严格设计。
- 场景:IDE(如VS Code)、可定制化软件(如WordPress)。
10. 前后端分离架构(Frontend-Backend Separation)
- 核心思想:前端(React/Vue)与后端(API服务)独立开发,通过REST/GraphQL交互。
- 优点:团队解耦,多端适配(Web/移动)。
- 缺点:API设计需严谨,SEO需额外处理。
- 场景:现代Web应用(如社交平台、管理后台)。
11. IAM架构(Identity and Access Management)
- 核心思想:集中管理身份认证(Authentication)和权限授权(Authorization)。
- 优点:统一安全管控,最小权限原则。
- 缺点:集成复杂,可能成为单点故障。
- 场景:企业级系统(如OA、云平台)、合规性要求高的领域(金融)。
12. 单体架构(Monolithic Architecture)
- 核心思想:所有功能集中在一个代码库中,统一部署。
- 优点:开发简单,适合小型项目。
- 缺点:难以扩展,维护成本随规模增长。
- 场景:初创项目、内部工具。
如何选择?
需求 | 推荐架构 |
---|---|
快速开发简单应用 | 单体架构、MVC |
高并发、大规模系统 | 微服务、空间基架构 |
实时数据处理 | 事件驱动架构 |
灵活扩展功能 | 插件化架构 |
低成本、无运维 | 无服务器架构 |
严格权限控制 | IAM架构 |
读写性能分离 | CQRS |
长期演化的核心业务 | 六边形架构 |
规范设计
开源规范
开源项目应遵循明确的许可证(如MIT、Apache-2.0),并在README中说明项目目标、使用方式及贡献指南。代码需保持模块化、可复用,并提供清晰的API文档,方便他人理解和使用。
文档规范
项目文档应包括README(快速入门)、API文档(如Swagger)、设计文档(架构图)和贡献指南(PR流程)。文档需结构化、定期更新,并采用Markdown等通用格式,确保易读性和可维护性。
版本规范
推荐使用语义化版本(SemVer):主版本号.次版本号.修订号(如v1.2.3
),分别对应不兼容改动、新增功能、Bug修复。版本变更需在CHANGELOG中记录,明确影响范围,便于用户升级。
commit规范
类型 | 类别 | 说明 |
---|---|---|
feat | Production | 新增功能 |
fix | Production | Bug修复 |
perf | Production | 提高代码性能的变更 |
style | Development | 代码格式类的变更,比如用gofmt 格式化代码、删除空行等 |
refactor | Production | 其他代码类的变更,这些变更不属于feat、fix、perf 和 style,例 如简化代码、重命名变量、删除冗余代码等 |
test | Development | 新增测试用例或是更新现有测试用例 |
ci | Development | 持续集成和部署相关的改动,比如修改Jenkins、GitLab CI等CI 配置文件或者更新systemdunit文件 |
docs | Development | 文档类的更新,包括修改用户文档或者开发文档等 |
chore | Development | 其他类型,比如构建流程、依赖管理或者辅助工具的变动等 |
参考资料: Go 语言项目开发实战 - 规范设计(付费课程)
Go语言即时通讯系统开发日志day5
计划:选择项目架构,搭建项目结构,构建表结构。
总结:完成了项目构建,了解了MVC三层架构,了解了zap并对其完成了简单封装,使其可以向
log
库一样使用。
项目结构
构建项目结构
.
├── api
├── cmd
├── configs
├── docs
├── pkg
├── test
├── go.mod
├── go.sum
├── internal
│ ├── config
│ ├── dao
│ ├── dto
│ ├── model
│ └── service
└── web├── public└── src
-
api/
:存放 API 协议定义文件,用于描述接口规范,不包含具体实现。 -
cmd/
:存放 可执行程序的入口文件(每个子目录对应一个独立的二进制程序)。 -
configs/
:存放 配置文件模板或默认配置(如开发/生产环境配置)。 -
pkg/
:存放 可复用的公共库代码(允许被其他项目导入)。 -
test/
:存放 集成测试/端到端测试代码(单元测试应直接放在各包内)。 -
internal/
:存放 私有业务逻辑(禁止被外部项目导入),是项目核心-
onfig/
:定义配置结构体及加载逻辑。 -
dao/
(Data Access Object):数据库操作层(直接与 MySQL/Redis 等交互)。 -
dto/
(Data Transfer Object):定义 API 请求/响应的数据结构。 -
**
model/
**定义数据库表对应的结构体(ORM 模型)。 -
service/
:实现核心业务逻辑(如消息发送、用户鉴权)。
-
-
web/
:存放 前端代码和静态资源。-
public/
:编译后的静态文件(可直接通过 HTTP 访问)。 -
src/
:前端源码(如 React/Vue 项目)。】
-
用户发送消息流程:
参考资料:第 25 章 - Golang 项目结构
MVC 三层架构
Model 层(数据 + 业务核心)
对应目录:
internal/model/
:定义数据结构(如User
、Message
)internal/dao/
:数据库操作(CRUD)internal/service/
:业务逻辑(如发送消息的校验、权限控制)
View 层(数据展示)
对应目录:web/
- 前端代码(Vue/React)通过 API 或 WebSocket 获取数据并渲染。
实时更新:通过 pkg/websocket
监听服务端推送。
Controller 层(请求协调)
对应目录:
api/
:定义接口协议(如 REST 路由、gRPC 方法)internal/dto/
:请求/响应的数据结构internal/service/
:实际控制层(处理参数校验、调用 Model 层)
参考资料:MVC 三层架构案例详细讲解
日志封装 zap
核心结构
type Logger struct {l *zap.Logger // 实际的 zap logger 实例al *zap.AtomicLevel // 支持动态调整日志级别
}
- 封装了
zap.Logger
并添加了原子级别的日志级别控制
初始化机制
var (once sync.Once // 确保只初始化一次std *Logger // 默认 logger 实例logPath string // 日志路径initDone bool // 初始化标志
)func initLogger() {// 从配置获取日志路径conf := config.GetConfig()logPath = filepath.Join(conf.LogConfig.LogPath, "app.log")// 创建日志目录os.MkdirAll(filepath.Dir(logPath), 0755)// 创建带轮转功能的 loggerstd = NewWithRotate(InfoLevel, NewProductionRotateConfig(logPath))initDone = true
}func Default() *Logger {once.Do(initLogger) // 线程安全的单次初始化return std
}
- 使用
sync.Once
确保线程安全的单次初始化 - 自动从配置系统获取日志路径
- 自动创建所需目录结构
TOML配置文件(
internal/config/config.go
):package configimport ("github.com/BurntSushi/toml" )type LogConfig struct {LogPath string `toml:"logPath"` }type Config struct {LogConfig `toml:"logConfig"` }var cfg *Configfunc GetConfig() *Config {if cfg == nil {cfg = &Config{}if _, err := toml.DecodeFile("config.toml", cfg); err != nil {panic(err)}}return cfg }
对应的TOML文件 (
configs/config.toml
) :[logConfig] logPath = "logs/"
日志轮转实现
func NewWithRotate(level Level, cfg *RotateConfig, opts ...zap.Option) *Logger {// 选择轮转策略var writer io.Writerif cfg.MaxSize > 0 {writer = NewRotateBySize(cfg)} else {writer = NewRotateByTime(cfg)}// 创建 zap coreal := zap.NewAtomicLevelAt(level)encoderCfg := zap.NewProductionEncoderConfig()encoderCfg.EncodeTime = zapcore.RFC3339TimeEncodercore := zapcore.NewCore(zapcore.NewJSONEncoder(encoderCfg),zapcore.AddSync(writer),al,)return &Logger{l: zap.New(core, opts...),al: &al,}
}
- 根据配置自动选择轮转策略
- 使用 JSON 格式编码日志
- 支持动态日志级别调整
日志级别控制
func (l *Logger) SetLevel(level Level) {if l.al != nil {l.al.SetLevel(level) // 原子操作修改日志级别}
}
- 支持运行时动态调整日志级别
日志方法
// 各级别日志方法
func (l *Logger) Debug(msg string, fields ...Field)
func (l *Logger) Info(msg string, fields ...Field)
// ...其他级别方法// 全局快捷方法
func Debug(msg string, fields ...Field) { Default().Debug(msg, fields...) }
// ...其他全局方法
- 提供从 Debug 到 Fatal 的全级别日志支持
- 支持结构化日志字段
- 提供全局快捷访问方法
代码地址:IM-Go/pkg/zap
参考资料:Go 第三方 log 库之 zap 使用、如何基于 zap 封装一个更好用的日志库、github-log
相关文章:
Go 语言即时通讯系统开发日志-日志day2-5:架构设计与日志封装
Go语言即时通讯系统开发日志day2 计划:学习go中MySQL,Redis的使用,使用MySQL和Redis完成一个单聊demo。 总结:现在每天下午用来开发这个项目,如果有课的话可能学习时间只有3-4个小时,再加上今天的学习效率不…...
@JsonProperty和@JSONField 使用
JsonProperty和JSONField注解的区别 1.底层框架不同 JsonProperty 是Jackson实现的 JSONField 是fastjson实现的 2.用法不同 (1)bean序列化为Json: JsonProperty: ObjectMapper().writeValueAsString(Object value) JSONField&…...
从代码学习深度学习 - 近似训练 PyTorch版
文章目录 前言负采样 (Negative Sampling)层序Softmax (Hierarchical Softmax)代码示例总结前言 在自然语言处理(NLP)领域,词嵌入(Word Embeddings)技术如Word2Vec(包括Skip-gram和CBOW模型)已经成为一项基础且强大的工具。它们能够将词语映射到低维稠密向量空间,使得…...
代码上传gitte仓库
把代码push上去就行...
系统架构设计(十四):解释器风格
概念 解释器风格是一种将程序的每个语句逐条读取并解释执行的体系结构风格。程序在运行时不会先被编译为机器码,而是动态地由解释器分析并执行其语义。 典型应用:Python 解释器、JavaScript 引擎、Bash Shell、SQL 引擎。 组成结构 解释器风格系统的…...
掌握LINQ:查询语法与方法语法全解析
文章目录 引言1. 查询语法 vs 方法语法1.1 查询语法 (Query Syntax)1.2 方法语法 (Method Syntax)1.3 两种语法的比较 2. 基本的 LINQ 查询结构2.1 数据源2.2 查询操作2.3 查询执行 3. 查询表达式中的关键字3.1 基本关键字fromwhereselectorderbygroup byjoin 3.2 其他常用关键…...
Go 后端中双 token 的实现模板
下面是一个典型的 Go 后端双 Token 认证机制 实现模板,使用 Gin 框架 JWT Redis,结构清晰、可拓展,适合实战开发。 项目结构建议 /utils├── jwt.go // Access & Refresh token 的生成和解析├── claims.go // 从请求…...
GESP编程能力等级认证C++3级1-数组1
1 GESP编程能力等级认证C3级 1.1 GESP简介 GESP是CCF 编程能力等级认证的简称,它为青少年计算机和编程学习者提供学业能力验证的规则和平台。GESP 覆盖中小学阶段,符合年龄条件的青少年均可参加认证。 1.2 GESP的分级 C 编程测试划分为一至八级&…...
FreeRTOS “探究任务调度机制魅力”
引入 现如今随着单片机的资源越来越多,主频越来越高,在面临更复杂的功能实现以及对MCU性能的充分压榨,会RTOS已经成为一个必要的技能,新手刚开始学习的时候就很好奇“为什么代码可以放到两个循环里同时运行?”。接下来…...
BGP策略实验练习
要求: 1、使用PreVal策略,确保R4通过R2到达192.168.10.0/24 2、使用AS_Path策略,确保R4通过R3到达192.168.11.0/24 3、配置MED策略,确保R4到达R3到达192.168.11.0/24 4、使用Local Preference策略,确保R1通过R2到达192…...
Office 中 VBE 的共同特点与区别
1. Excel VBE 核心对象 #mermaid-svg-IklDO11Hu656bdGS {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-IklDO11Hu656bdGS .error-icon{fill:#552222;}#mermaid-svg-IklDO11Hu656bdGS .error-text{fill:#552222;stro…...
Linux虚拟文件系统(1)
1 虚拟文件系统(VFS) 虚拟文件系统(Virtual File System, VFS)作为内核的子系统。,它为用户空间的应用程序提供了一个统一的文件系统接口。通过VFS,不同的文件系统可以共存于同一个操作系统中,…...
目标检测评估指标mAP详解:原理与代码
目标检测评估指标mAP详解:原理与代码 目标检测评估指标mAP详解:原理与代码一、前言:为什么需要mAP?二、核心概念解析2.1 PR曲线(Precision-Recall Curve)2.2 AP计算原理 三、代码实现详解3.1 核心函数ap_pe…...
Linux干货(六)
前言 从B站黑马程序员Linux课程摘选的学习干货,新手友好!若有侵权,会第一时间处理。 目录 前言 1.环境变量 1.环境变量的定义 2.env命令的作用 3.$符号的作用 4.PATH的定义和作用 5.修改环境变量的方法 1.临时生效 2.永久生效 2.…...
字符串相乘(43)
43. 字符串相乘 - 力扣(LeetCode) 解法: class Solution { public:string multiply(string num1, string num2) {string res "0";for (int i 0; i < num2.size(); i) {string str multiplyOneNum(num1, num2[num2.size() -…...
【Vue篇】数据秘语:从watch源码看响应式宇宙的蝴蝶效应
目录 引言 一、watch侦听器(监视器) 1.作用: 2.语法: 3.侦听器代码准备 4. 配置项 5.总结 二、翻译案例-代码实现 1.需求 2.代码实现 三、综合案例——购物车案例 1. 需求 2. 代码 引言 💬 欢迎讨论&#…...
esp32课设记录(二)lcd屏显示文字与照片
取模软件链接: 链接: 百度网盘 请输入提取码 提取码: 1234 课设要求如图所示,因此需要在esp32显示文字和照片。在上个文章中我已经写了按键相关内容。这篇主要描述怎么显示文字和照片。我使用的是ESP-IDF库。 本项目使用的是基于ST7789驱动芯片的LCD屏幕…...
Open CASCADE学习|几何体切片处理:OpenMP与OSD_Parallel并行方案深度解析
在三维建模与仿真领域,几何体切片处理是CAE前处理、3D打印路径规划、医学影像分析等场景的关键技术。其核心目标是将三维模型沿特定方向离散为二维截面集合,便于后续分析或制造。OpenCASCADE作为开源几何内核,提供高效的布尔运算与几何算法&a…...
【Android】从Choreographer到UI渲染(二)
【Android】从Choreographer到UI渲染(二) Google 在 2012 年推出的 Project Butter(黄油计划)是 Android 系统发展史上的重要里程碑,旨在解决长期存在的 UI 卡顿、响应延迟等问题,提升用户体验。 在 Androi…...
板凳-------Mysql cookbook学习 (三)
1.22 使长输出行更具可读性 mysql> show full columns from limbs; ------------------------------------------------------------------------------------------------------------- | Field | Type | Collation | Null | Key | Default | Extra | Pri…...
济南国网数字化培训班学习笔记-第三组-2-电力通信光缆网认知
电力通信光缆网认知 光缆网架构现状 基础底座 电路系统是高度复杂,实时性、安全性、可靠性要求极高的巨系统,必须建设专用通信网 相伴相生 电力系统是由发电、输电、变电、配电、用电等一次设施,及保障其正常运行的保护、自动化、通信等…...
黑灰产业链深度解析
黑灰产业链深度解析 大家好,欢迎来到「黑产档案」。本频道专注于反诈教育宣传,通过深度拆解黑灰产业链的运作逻辑,帮助公众识别骗局、规避风险。本节课将聚焦产业链的核心环节,揭示其背后的灰色生态。 一、黑灰产的定义与范畴 要…...
golang选项设计模式
选项设计模式 有时候一个函数会有很多参数,为了方便函数的使用,我们会给希望给一些参数设定默认值,调用时只需要传与默认值不同的参数即可,类似于 python 里面的默认参数和字典参数,虽然 golang 里面既没有默认参数也…...
方案精读:104页DeepSeek金融银行核算流程场景部署建设方案【附全文阅读】
DeepSeek,金融银行核算流程的革新方案! 这份方案专为金融银行从业者打造,旨在解决传统核算流程的难题。当下,金融银行核算面临效率低、错误率高、合规压力大等挑战,DeepSeek 方案正是应对之策。 该方案运用人工智能和大数据技术,实现数据采集、清洗自动化,智能核算对账,…...
【MySQL】02.数据库基础
1. 数据库的引入 之前存储数据用文件就可以了,为什么还要弄个数据库? 文件存储存在安全性问题,文件不利于数据查询和管理,文件不利于存储海量数据,文件在程序中控制不方便。而为了解决上述问题,专家们设计出更加利于…...
STM32项目实战:ADC采集
STM32F103C8T6的ADC配置。PB0对应的是ADC1的通道8。在标准库中,需要初始化ADC,设置通道,时钟,转换模式等。需要配置GPIOB的第0脚为模拟输入模式,然后配置ADC1的通道8,设置转换周期和触发方式。 接下来是I2C…...
《AI语音模型:MiniMax Speech-02》
开场:AI 语音界的震撼弹 在 AI 语音技术的激烈竞争赛道上,MiniMax Speech - 02 的出现宛如一颗震撼弹,瞬间引爆了整个行业。不久前,一则消息在全球 AI 领域引起轩然大波:MiniMax 的新一代语音大模型 Speech - 02&#…...
基于LabVIEW的双音多频系统设计
目录 1 系统设计概述 双音多频(Dual-Tone Multi-Frequency, DTMF)信号是一种广泛应用于电话系统中的音频信号,通过不同的频率组合表示不同的按键。每个按键对应两个频率,一个低频和一个高频,共同组成独特的信号。在虚拟仪器技术快速发展的背景下,利用LabVIEW等图形化编程…...
快速生成角色背景设定:基于Next.js的AI辅助工具开发实践
引言 在游戏开发、小说创作和角色扮演(RP)中,角色背景设定(Headcanon)的构建往往耗时耗力。传统方法依赖手动编写,容易陷入思维定式。本文将分享如何利用Next.js和Tailwind CSS开发一个高效的AI角色设定生…...
轻量级视频剪辑方案:FFmpeg图形化工具体验
FFmpeg小白助手是基于开源FFmpeg开发的本地化视频处理软件,采用绿色免安装设计,解压后即可直接运行。该工具主要面向普通用户的日常音视频处理需求,通过简洁的图形界面降低了FFmpeg的使用门槛。 功能特性 基础编辑功能 格式转换:…...
主成分分析的应用之sklearn.decomposition模块的PCA函数
主成分分析的应用之sklearn.decomposition模块的PCA函数 一、模型建立整体步骤 二、数据 2297.86 589.62 474.74 164.19 290.91 626.21 295.20 199.03 2262.19 571.69 461.25 185.90 337.83 604.78 354.66 198.96 2303.29 589.99 516.21 236.55 403.92 730.05 438.41 225.80 …...
Java基于数组的阻塞队列实现详解
在多线程编程中,阻塞队列是一种非常有用的工具,它可以在生产者和消费者之间提供一个缓冲区,使得生产者可以往队列中添加数据,而消费者可以从队列中取出数据。当队列满时,生产者会被阻塞直到有空间可用;当队…...
ngx_http_random_index_module 模块概述
一、使用场景 随机内容分发 当同一目录下存放多份等价内容(如多张轮播图、不同版本静态页面等)时,可通过随机索引实现负载均衡或流量分散。A/B 测试 通过目录请求自动随机分配用户到不同测试组,无需后端逻辑参与。动态“首页”选…...
你引入的lodash充分利用了吗?
#开发中,发现自己只有cloneDeep的时候才想起来用这个库的便利,搜索了项目内代码,发现大家基本也是这样,其实我们错过了很多好东西# cloneDeep 深拷贝 var objects [{ a: 1 }, { b: 2 }];var deep _.cloneDeep(objects); conso…...
Python爬虫基础
本篇内容中,我们主要分享一些爬虫的前置知识,主要知识点有: 爬虫的概念和作用爬虫的流程【重要】http相关的复习 http和https概念和区别浏览器访问一个网址的过程爬虫中常用的请求头、响应头常见的响应状态码 浏览器自带开发者工具的使用 爬…...
飞帆控件:on_post_get 接口配置
在网页中写一个接口是很基础的要求。 今天我们介绍一个工具,不用写代码,配置即可。 先上链接: on_post_gethttps://fvi.cn/798来看看控件的配置: 使用这个控件,在网页中写 post/get 接口可以告别代码。或许能做到初…...
C++笔试题(金山科技新未来训练营):
题目分布: 17道单选(每题3分)3道多选题(全对3分,部分对1分)2道编程题(每一道20分)。 不过题目太多,就记得一部分了: 单选题: static变量的初始…...
Selenium-Java版(css表达式)
css表达式 前言 根据 tag名、id、class 选择元素 tag名 #id .class 选择子元素和后代元素 定义 语法 根据属性选择 验证CSS Selector 组选择 按次序选择子节点 父元素的第n个子节点 父元素的倒数第n个子节点 父元素的第几个某类型的子节点 父元素的…...
19. 结合Selenium和YAML对页面实例化PO对象改造
19. 结合Selenium和YAML对页面实例化PO对象改造 一、架构升级核心思路 1.1 改造核心目标 # 原始PO模式:显式定义元素定位 username (id, ctl00_MainContent_username)# 改造后PO模式:动态属性访问 self.username.send_keys(Tester) # 自动触发元素定…...
MySQL——5、基本查询
表的增删改查 1、Create1.1、单行数据全列插入1.2、多行数据指定列插入1.3、插入否则更新1.4、替换 2、Retrieve2.1、select列2.2、where条件2.3、结果排序2.4、筛选分页结果 3、Update4、Delete4.1、删除数据4.2、截断表 5、插入查询结果6、聚合函数7、group by子句的使用8、实…...
ngx_http_referer_module 模块概述
一、使用场景 防盗链 仅允许本站或特定域名的页面直接引用图片、视频等资源,拒绝第三方网站直接嵌入。流量控制 阻止来自社交媒体、搜索引擎或未知来源的大量自动化抓取。安全审计 简易记录并过滤可疑 Referer,以减少非法请求。 注意 Referer 头可被伪造…...
Go语言--语法基础5--基本数据类型--类型转换
Go 编程语言中 if 条件语句的语法如下: 1、基本形式 if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } If 在布尔表达式为 true 时,其后紧跟的语句块执行,如果为 false 则 不执行。 package main import "fmt" …...
用golang实现二叉搜索树(BST)
目录 一、概念、性质二、二叉搜索树的实现1. 结构2. 查找3. 插入4. 删除5. 中序遍历 中序前驱/后继结点 一、概念、性质 二叉搜索树(Binary Search Tree),简写BST,又称为二叉查找树 它满足: 空树是一颗二叉搜索树对…...
基于FPGA的电子万年历系统开发,包含各模块testbench
目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于FPGA的电子万年历系统开发,包含各模块testbench。主要包含以下核心模块: 时钟控制模块:提供系统基准时钟和计时功能。 日历计算模块:…...
上位机知识篇---Web
文章目录 前言 前言 本文简单介绍了Web。...
2025 ISCC 练武赛Pwn-wp(含附件)
前言 去年个人赛报名了忘记打了(笑), 所以这应该算是我第一次参加ISCC, 体验也是非常非常非常非常的cha(第四声)!!! 主办方也是非常幽默,pwn和web都是公用容器,那web最后都被当成玩具玩坏了 下面是这次练武题的pwn所有附件 通过网盘分享的文件…...
LeetCode Hot100刷题——除自身以外数组的乘积
238. 除自身以外数组的乘积 给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&a…...
IDEA - Windows IDEA 代码块展开与折叠(基础折叠操作、高级折叠操作)
一、基础折叠操作 折叠当前代码块:Ctrl - # 操作方式按下 【Ctrl】 键,再按下 【-】 键展开当前代码块:Ctrl # 操作方式按下 【Ctrl】 键,再按下 【】 键折叠所有代码块:Ctrl Shift - # 操作方式按下 【Ctrl】…...
javaSE.Map
Map存储映射关系。键值对。key-value 左边值映射着右边的值,左边相当于钥匙,开到右边的门获取得到信息。 get👇put 是否存在该key👇containsKey() map.values👇 entrySet👇 entrySet()获取map中所有的键…...
Python Requests库完全指南:从入门到精通
引言 在Python的生态系统中,requests库以其简洁优雅的API设计和强大的功能,成为HTTP请求处理领域的标杆工具。无论是数据爬虫开发、API接口调用,还是自动化测试场景,requests都能将复杂的网络交互简化为几行可读性极高的代码。相…...