当前位置: 首页 > news >正文

基于开闭原则优化数据库查询语句拼接方法

背景

在开发实践中,曾有同事在实现新功能时,因直接修改一段数据库查询条件拼接方法的代码逻辑,导致生产环境出现故障。

具体来看,该方法通过在函数内部直接编写条件判断语句实现查询拼接,尽管从面向对象设计的开闭原则(OCP)出发,理想的代码应满足 “对修改封闭、对扩展开放”—— 即允许通过扩展而非修改原有逻辑来应对变化,但这一规范属于非强制性设计原则,在实际开发中难以确保所有成员始终严格遵守,从而导致新增或调整查询条件时,开发人员更倾向于直接修改原函数,而非通过扩展方式实现,最终埋下代码变更的风险隐患。

func (m ActivityModel) buildQuery(ctx context.Context, db *gorm.DB, filter *ActivityListFilter) {if filter.Name != "" {db = db.Where("name like ?", "%"+filter.Name+"%")}if filter.StartAt > 0 {db = db.Where("start_at <= ?", filter.StartAt)}if filter.EndAt > 0 {db = db.Where("end_at >= ?", filter.EndAt)}if filter.Description != "" {db = db.Where("description like ?", "%"+filter.Description+"%")}if filter.CreatedBy != "" {db = db.Where("created_by like ?", "%"+filter.CreatedBy+"%")}db = db.Where("is_del = ?", filter.IsDel)if filter.CreatedAt > 0 {db = db.Where("create_time > ?", filter.CreatedAt)}if filter.UpdatedAt > 0 {db = db.Where("update_time > ?", filter.UpdatedAt)}if filter.DeletedAt > 0 {db = db.Where("delete_time > ?", filter.DeletedAt)}
}

上述代码中,每个查询条件的添加或修改都需直接操作 buildQuery 函数,违背了开闭原则。为降低维护风险并提升代码扩展性,可通过设计模式将查询条件的逻辑解耦,实现 “对扩展开放,对修改封闭” 的目标。

方案一:使用策略模式

策略模式可以将每个查询条件封装成独立的策略,这样在需要添加新的查询条件时,只需新增一个策略类,而无需修改原有的代码。

package mainimport ("context""github.com/jinzhu/gorm"
)// ActivityModel 定义活动模型
type ActivityModel struct{}// ActivityListFilter 定义过滤条件
type ActivityListFilter struct {Name        stringStartAt     int64EndAt       int64Description stringCreatedBy   stringIsDel       boolCreatedAt   int64UpdatedAt   int64DeletedAt   int64
}// QueryStrategy 定义查询策略接口
type QueryStrategy interface {Apply(db *gorm.DB, filter *ActivityListFilter) *gorm.DB
}// NameQueryStrategy 实现名称查询策略
type NameQueryStrategy struct{}func (n NameQueryStrategy) Apply(db *gorm.DB, filter *ActivityListFilter) *gorm.DB {if filter.Name != "" {return db.Where("name like ?", "%"+filter.Name+"%")}return db
}// StartAtQueryStrategy 实现开始时间查询策略
type StartAtQueryStrategy struct{}func (s StartAtQueryStrategy) Apply(db *gorm.DB, filter *ActivityListFilter) *gorm.DB {if filter.StartAt > 0 {return db.Where("start_at >= ?", filter.StartAt)}return db
}// 可以继续为其他条件实现类似的策略// buildQuery 使用策略模式构建查询
func (m ActivityModel) buildQuery(ctx context.Context, db *gorm.DB, filter *ActivityListFilter) *gorm.DB {strategies := []QueryStrategy{NameQueryStrategy{},StartAtQueryStrategy{},// 添加其他策略}for _, strategy := range strategies {db = strategy.Apply(db, filter)}return db.Where("is_del = ?", filter.IsDel)
}

在这个方案中,每个查询条件都被封装成一个独立的策略,buildQuery 函数通过遍历策略列表来应用这些策略。当需要添加新的查询条件时,只需实现一个新的策略类并将其添加到策略列表中。

优势

  • 解耦条件逻辑:每个策略类单一职责,聚焦特定条件处理,降低代码耦合度。
  • 无缝扩展:新增查询条件时,只需实现 QueryStrategy 接口并添加到策略列表,无需修改核心逻辑。
  • 便于测试:可独立单元测试每个策略,提升测试覆盖率和维护效率。

方案二:使用函数切片

你可以将每个查询条件封装成一个函数,并将这些函数存储在一个切片中。这样,在需要添加新的查询条件时,只需添加一个新的函数到切片中。

package mainimport ("context""github.com/jinzhu/gorm"
)// ActivityModel 定义活动模型
type ActivityModel struct{}// ActivityListFilter 定义过滤条件
type ActivityListFilter struct {Name        stringStartAt     int64EndAt       int64Description stringCreatedBy   stringIsDel       boolCreatedAt   int64UpdatedAt   int64DeletedAt   int64
}// QueryFunc 定义查询函数类型
type QueryFunc func(db *gorm.DB, filter *ActivityListFilter) *gorm.DB// buildQuery 使用函数切片构建查询
func (m ActivityModel) buildQuery(ctx context.Context, db *gorm.DB, filter *ActivityListFilter) *gorm.DB {queryFuncs := []QueryFunc{func(db *gorm.DB, filter *ActivityListFilter) *gorm.DB {if filter.Name != "" {return db.Where("name like ?", "%"+filter.Name+"%")}return db},func(db *gorm.DB, filter *ActivityListFilter) *gorm.DB {if filter.StartAt > 0 {return db.Where("start_at >= ?", filter.StartAt)}return db},// 添加其他查询函数}for _, queryFunc := range queryFuncs {db = queryFunc(db, filter)}return db.Where("is_del = ?", filter.IsDel)
}

在这个方案中,每个查询条件都被封装成一个匿名函数,并存储在 queryFuncs 切片中。buildQuery 函数通过遍历这个切片来应用这些查询函数。当需要添加新的查询条件时,只需添加一个新的匿名函数到切片中。

优势

  • 轻量简洁:无需定义额外接口或类,直接通过匿名函数实现条件封装,适合简单场景。
  • 灵活组合:可动态增删条件函数,支持运行时根据业务需求调整查询逻辑。
  • 代码隔离:每个条件逻辑在独立函数内实现,修改单个条件不会影响其他逻辑。

总结

这两种方案都遵循了开闭原则,使得代码在添加新的查询条件时更加灵活,同时减少了修改现有代码的风险。

  • 策略模式适合条件逻辑复杂、需要多维度扩展或复用的场景,通过接口化设计提升代码规范性。
  • 函数切片则以更轻量的方式实现条件解耦,适合快速开发或条件相对固定的场景。

无论选择哪种方案,核心目标都是将查询条件的 “修改” 操作转化为 “扩展” 操作 —— 新增条件时无需触碰原有逻辑,从架构层面降低人为失误导致的风险。

相关文章:

基于开闭原则优化数据库查询语句拼接方法

背景 在开发实践中&#xff0c;曾有同事在实现新功能时&#xff0c;因直接修改一段数据库查询条件拼接方法的代码逻辑&#xff0c;导致生产环境出现故障。 具体来看&#xff0c;该方法通过在函数内部直接编写条件判断语句实现查询拼接&#xff0c;尽管从面向对象设计的开闭原…...

无人机航拍牛只检测数据集VOC+YOLO格式906张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;906 标注数量(xml文件个数)&#xff1a;906 标注数量(txt文件个数)&#xff1a;906 标注…...

【LeetCode 560】和为K的子数组(前缀和+哈希)

题面&#xff1a; 思路&#xff1a; 看到连续非空序列之和&#xff0c;容易想到前缀和计算差分&#xff0c; n u m s nums nums 区间 [ j , i ] [j,i] [j,i] 的和即为&#xff1a; s u m ( i , j ) p r e [ i ] − p r e [ j − 1 ] sum(i, j) pre[i] - pre[j-1] sum(i,j)…...

手术中评估帕金森患者手部运动的无接触式系统

南开大学韩建达教授研究团队提出一种针对帕金森病手术治疗的评估系统&#xff0c;可在手术中对患者手部运动进行实时监测&#xff0c;实现无接触式运动特征提取&#xff0c;并结合可视化数据分析辅助临床决策。相关研究论文“A non-contact system for intraoperative quantita…...

服务器主动发送响应?聊天模块如何实现?

一、背景知识 当我们在某聊天界面中发送一个消息时&#xff0c;如A给B发送了一个消息&#xff0c;而B马上就收到&#xff0c;仔细思考会发现以下问题 &#xff1a; 1. A给服务器发送请求&#xff0c;但服务器却给B发送了响应 2.B没有向服务器发送请求&#xff0c;却收到了…...

服务器远程超出最大连接数的解决方案是什么?

以下是为您撰写的关于服务器远程连接超限问题的解决方案论文&#xff0c;包含技术原理分析、解决策略和实际应用案例&#xff1a; 服务器远程连接超限问题分析与多维解决方案研究 摘要 随着数字化转型进程加速&#xff0c;服务器远程连接过载问题已成为企业IT运维领域的重大挑…...

【资料分享】全志T536(异构多核ARMCortex-A55+玄铁E907 RISC-V)工业核心板硬件说明书

前 言 本文为创龙科技SOM-TLT536工业核心板硬件说明书,主要提供SOM-TLT536工业核心板的产品功能特点、技术参数、引脚定义等内容,以及为用户提供相关电路设计指导。 为便于阅读,下表对文档出现的部分术语进行解释;对于广泛认同释义的术语,在此不做注释。...

Missashe考研日记-day30

Missashe考研日记-day30 0 写在前面 日记也是写到第30篇了哈哈&#xff0c;满月了&#xff0c;虽然过了不止30天中间有断更&#xff0c;但还是表扬一下自己坚持下来了。&#xff1a;&#xff09; 1 专业课408 学习时间&#xff1a;2h30min学习内容&#xff1a; 今天有其他事…...

工程管理部绩效考核关键指标与项目评估

工程管理部的关键绩效考核指标(KPI)设计旨在全面评估部门在设施设备管理、特种设备保养、维修质量以及业主满意度等方面的工作表现。每个指标都与部门的日常运营紧密相关&#xff0c;直接影响到设施的维护质量和业主的满意度。 本文将深入探讨工程管理部的主要绩效考核指标&am…...

【沉浸式求职学习day29】【信科知识面试题第一部分】【新的模块,值得收藏】

快五一辣&#xff0c;大家什么安排呀哈哈哈~可能五一期间我就不更新啦&#xff0c;时间比较碎片化&#xff0c;要陪重要的人 沉浸式求职学习 理论攻坚-计算机基础知识1.诞生2.发展3.特点4.分类巨型 5.应用计算机辅助&#xff1a; 6.计算机的性能指标7.信息的存储单位 理论攻坚…...

Cliosoft安装

创建安装目录、解压 [rootedatest opt]# mkdir Cliosoft [rootedatest opt]# mv sos_7.05.p9/ Cliosoft/ [rootedatest opt]# cd Cliosoft/ [rootedatest Cliosoft]# cd sos_7.05.p9/ [rootedatest sos_7.05.p9]# tar -xf sos_7.05.p9_linux64.tar 用普通用户eda安装 [rooteda…...

MES管理系统:重构生产任务管理的数智化引擎

在制造业的数字化浪潮中&#xff0c;生产任务管理正从传统的经验驱动转向数据驱动的精细化模式。作为连接计划层与执行层的核心枢纽&#xff0c;MES管理系统通过智能化、动态化的管理手段&#xff0c;将生产任务的接收、分配、执行与优化融入全流程闭环&#xff0c;为企业打造透…...

推荐系统在线离线打分不一致:核心原因与全链路解决方案

目录 一、特征维度&#xff1a;数据处理的「隐形杀手」1.1 特征穿越&#xff1a;训练数据的「上帝视角」1.2 线上线下特征不一致的四大陷阱&#xff08;1&#xff09;上线前一致性校验缺失&#xff08;2&#xff09;线上特征监控体系缺位&#xff08;3&#xff09;特征更新延迟…...

Markdown转WPS office工具pandoc实践笔记

随着DeepSeek、文心一言、讯飞星火等AI工具快速发展&#xff0c;其输出网页内容拷贝到WPS Office过程中&#xff0c;文档编排规整的格式很难快速复制。 注&#xff1a;WPS Office不支持Markdown格式&#xff0c;无法识别式样。 在这里推荐个免费开源工具Pandoc&#xff0c;实现…...

记录java线程中断理解,Thread.currentThread().interrupt();

记录java线程中断理解&#xff0c;Thread.currentThread().interrupt(); 一、概述 中断的理解&#xff1a; 1、Java 线程中断&#xff0c;协作式&#xff08;通过 Thread.interrupt() 触发&#xff0c;需代码显式检查中断状态或调用可中断方法&#xff09;。 2、操作系统中断…...

[零基础]内网ubuntu映射到云服务器上,http访问(frp内网穿透)

阿里云服务器&#xff0c;高校教师可以半价&#xff0c; frp下载地址&#xff1a;https://github.com/fatedier/frp/releases&#xff0c;选amd64&#xff0c; 云服务器开放端口 选择网络与安全–>安全组->管理规则 配置开放端口&#xff0c;7000为支持frp开放的端口&…...

Nginx 核心功能笔记

目录 一、Nginx 简介 二、核心功能详解 三、关键指令解析 四、性能优化要点 五、常见应用场景 一、Nginx 简介 定位 高性能的 HTTP/反向代理服务器&#xff0c;同时支持邮件协议代理&#xff08;IMAP/POP3/SMTP&#xff09;。采用 事件驱动、异步非阻塞 架构&#xff0c;…...

多地部署Gerrit Replication插件同步异常解决思路及方案(附脚本与CronJob部署)

背景 为了支持多地开发,我司在代码服务器(Gerrit)上使用了Replication插件,进行多地部署同步。 整体结构如下: A地区:主Gerrit服务器B地区:从Gerrit服务器正常的工作流程是: B地区开发者从从服务器拉取代码。B地区开发者向主服务器推送代码。Replication插件保证主从数…...

JAVA--- 关键字static

之前我们学习了JAVA 面向对象的一些基本知识&#xff0c;今天来进阶一下&#xff01;&#xff01;&#xff01; static关键字 static表示静态&#xff0c;是JAVA中的一个修饰符&#xff0c;可以修饰成员方法&#xff0c;成员变量&#xff0c;可用于修饰类的成员&#xff08;变…...

清华与智谱联合发布TTS模型GLM-4-Voice,支持情绪、语气控制,多语言,实时效果很不错~

项目背景 GLM-4-Voice是由清华大学知识工程组&#xff08;Tsinghua KEG&#xff09;和智谱AI&#xff08;Zhipu AI&#xff09;联合开发的一个开源端到端语音对话模型&#xff0c;旨在推动语音交互技术的进步&#xff0c;弥合机器与人类自然对话之间的差距。 语音交互的挑战与…...

华为云Astro大屏从iotda影子设备抽取数据做设备运行状态的大屏实施步骤

目录 背景与意义 1. 准备阶段 2. IoTDA 开放影子查询API 3. Astro轻应用创建连接器 4. Astro大屏设计界面 5. 数据绑定与交互逻辑 6. 发布与测试 小结&#xff08;流程复盘&#xff09; 背景与意义 随着物联网技术的快速发展&#xff0c;越来越多的设备接入云端&#x…...

Microsoft .NET Framework 3.5 离线安装包 下载

Microsoft. NET Framework 3.5 是支持生成和运行下一代应用程序和XML Web Services 的内部Windows 组件&#xff0c; 对 .NET Framework 2.0 和 3.0 中的许多新功能进行了更新和增补&#xff0c; 且附带了 .NET Framework 2.0 Service Pack 1 和 .NET Framework 3.0 Service…...

通用人工智能(AGI)的技术演进

通用人工智能&#xff08;AGI&#xff09;的技术演进是一个漫长而充满探索的过程&#xff0c;涉及多个领域的技术突破和理念转变。以下是对其演进历程的详细介绍&#xff1a; 早期人工智能探索&#xff08;20世纪50年代 - 80年代&#xff09; 符号主义兴起&#xff1a;1950年…...

mac word接入deepseek

网上大多使用Windows版word来接入deepseek&#xff0c;vba文件引入mac后&#xff0c;因底层工具不同&#xff0c;难以直接运行&#xff0c;例如CreateObject("MSXML2.XMLHTTP")无法创建&#xff0c;为此写了一版新的vba&#xff0c;基于mac底层工具来实现。 vba文件点…...

基于大模型的大肠息肉全程管理研究报告

目录 一、引言 1.1 研究背景与意义 1.2 研究目的 二、大模型预测大肠息肉的原理与数据基础 2.1 大模型的技术原理简介 2.2 数据收集与处理 三、术前预测与准备方案 3.1 息肉特征及风险预测 3.2 患者身体状况评估 3.3 术前准备措施 四、术中方案制定与监控 4.1 手术…...

Liunx安装Apache Tomcat

目录 一、了解tomcat 二、下载 三、启动tomcat 四、网页访问tomcat 五、Tomcat修改默认8080端口 六、Tomcat创建项目步骤-实现项目对外访问 一、了解tomcat Apache Tomcat 是一个开源的 Java Servlet 容器 和 Web 服务器&#xff0c;主要用于运行基于 Java 的 Web 应用…...

Java基于MyBatis 实现前端组装查询语句、后端动态执行查询的功能

1. 前端设计 前端逻辑与之前的设计保持一致,依然是将用户输入的查询条件组装成 JSON 格式,并通过 HTTP 请求发送到后端。 示例请求体: {"filters": [{"field": "name","operator": "LIKE",...

RabbitMQ Linux 安装教程详解

RabbitMQ Linux 安装教程详解 在 Linux 系统上安装 RabbitMQ 并确保其稳定运行&#xff0c;对于构建可靠的分布式消息系统至关重要。本文将详细介绍如何在 Linux 系统上安装 RabbitMQ&#xff0c;并提供关键的注意事项&#xff0c;帮助您避免常见的坑点&#xff0c;确保安装过…...

健康养生:拥抱活力生活

在生活节奏日益加快的当下&#xff0c;人们对健康养生的重视程度与日俱增。健康养生并非是一时的跟风之举&#xff0c;而是一种关乎生活品质与生命长度的科学理念和生活方式&#xff0c;其核心在于通过合理的饮食、适度的运动、充足的睡眠以及良好的心态调节&#xff0c;达成身…...

京东商品数据实时采集指南:API 接口调用与数据解析实战

在当今数字化时代&#xff0c;数据已经成为企业决策和市场分析的重要依据。对于电商领域的从业者来说&#xff0c;实时采集京东等平台的商品数据&#xff0c;能够帮助他们了解市场动态、分析竞争对手以及优化自身的产品策略。本文将详细介绍如何通过 API 接口调用实现京东商品数…...

最新字节跳动运维云原生面经分享

继续分享最新的go面经。 今天分享的是组织内部的朋友在字节的go运维工程师岗位的云原生方向的面经&#xff0c;涉及Prometheus、Kubernetes、CI/CD、网络代理、MySQL主从、Redis哨兵、系统调优及基础命令行工具等知识点&#xff0c;问题我都整理在下面了 面经详解 Prometheus …...

AimRT 从零到一:官方示例精讲 —— 六、pb_chn示例.md

pb_chn示例 官方仓库&#xff1a;pb_chn 这个官方示例展示了如何基于 protobuf 协议和 local 后端实现 channel 通信。主要包括四种场景&#xff1a; 基础示例&#xff1a;分别用两个模块&#xff08;Publisher 和 Subscriber&#xff09;发布和订阅 protobuf 消息&#xff…...

【Web】如何解决 `npm run dev` 报错 `address already in use 127.0.0.1:9005` 的问题

在开发过程中&#xff0c;我们可能会遇到端口占用的问题&#xff0c;尤其是当多个进程或服务尝试监听同一个端口时。最近在运行 npm run dev 时&#xff0c;我遇到的错误是 address already in use 127.0.0.1:9005&#xff0c;这让我花了些时间才找到问题的根源。本文将总结该问…...

每日一道leetcode(不会做学习版,多学一题)

2542. 最大子序列的分数 - 力扣&#xff08;LeetCode&#xff09; 题目 给你两个下标从 0 开始的整数数组 nums1 和 nums2 &#xff0c;两者长度都是 n &#xff0c;再给你一个正整数 k 。你必须从 nums1 中选一个长度为 k 的 子序列 对应的下标。 对于选择的下标 i0 &#…...

当OA闯入元宇宙:打卡、报销和会议的未来狂想

引言&#xff1a;虚实共生中的组织基因突变 元宇宙正以虚实共生的形态重构人类协作的底层逻辑。传统OA系统建立的物理规则——指纹打卡验证在场性、纸质票据堆砌信任链、会议室排期协调时空资源——在元宇宙的数字原野上迎来基因级重组。这场变革不仅是技术工具的迭代&#xf…...

线程数据同步的三种方式

1. 线程同步机制&#xff08;用于控制线程之间的访问顺序和互斥&#xff09; 互斥锁&#xff08;Mutex&#xff09;&#xff1a;用于保护共享资源&#xff0c;确保同一时间只有一个线程可以访问。 信号量&#xff08;Semaphore&#xff09;&#xff1a;用于控制多个线程对共享…...

docker拉取国内镜像

1. 场景 最近整了一个tencent云服务器&#xff0c;想要玩一下docker&#xff0c;结果发现拉不下来&#xff0c;镜像根本拉不下来。 2. 原因 1.云服务器无法访问外网&#xff1b; 2. 国内的很多公有镜像仓库都被封了&#xff1b; 3. 推荐 https://zhuanlan.zhihu.com/p/713…...

中阳策略下的价格趋势识别技巧

中阳策略下的价格趋势识别技巧 在快速变化的市场环境中&#xff0c;掌握有效的趋势识别技巧成为交易者的重要技能。"中阳"策略主张通过量价关系和趋势线分析&#xff0c;捕捉价格运行的主方向&#xff0c;提升交易成功率。 市场中&#xff0c;价格的上行或下行并非随…...

MIT6.S081 - Lab11 networking(网络栈)

本篇是 MIT6.S081 2020 操作系统课程 Lab11 的实验笔记&#xff0c;这是课程的最后一个实验了&#xff0c;目标是为 xv6 实现 E1000 网卡驱动的两个核心函数&#xff1a;发送数据包 e1000_transmit() 和接收数据包 e1000_recv()。 Lab11 地址&#xff1a;https://pdos.csail.mi…...

创龙全志T536全国产(4核A55 ARM+RISC-V+NPU 17路UART)工业开发板硬件说明书

前 言 本文档主要介绍TLT536-EVM评估板硬件接口资源以及设计注意事项等内容。 T536MX-CXX/T536MX-CEN2处理器的IO电平标准一般为1.8V、3.3V,上拉电源一般不超过3.3V或1.8V,当外接信号电平与IO电平不匹配时,中间需增加电平转换芯片或信号隔离芯片。按键或接口需考虑ESD设计…...

《解锁CSS Flex布局:重塑现代网页布局的底层逻辑》

网页布局作为用户体验的基石&#xff0c;其重要性不言而喻。从早期简单的表格布局&#xff0c;到后来基于浮动与定位的复杂尝试&#xff0c;网页布局技术始终在不断演进。而CSS Flex布局的出现&#xff0c;宛如一颗璀璨的新星&#xff0c;彻底革新了网页布局的设计理念与实践方…...

deepseek_ai_ida_plugin开源插件,用于使用 DeepSeekAI 将函数反编译并重命名为人类可读的视图。该插件仅在 ida9 上进行了测试

一、软件介绍 文末提供程序和源码下载 deepseek_ai_ida_plugin开源插件&#xff0c;用于使用 DeepSeekAI 将函数反编译并重命名为人类可读的视图。该插件仅在 ida9 上进行了测试。FunctionRenamerDeepseekAI.cpp 此文件包含 Hex-Rays 反编译器的主要插件实现。它反编译当前函数…...

完整的 SSL 证书生成与 Spring Boot 配置流程

一、生成 SSL 证书 目标:创建 PKCS12 格式的密钥库文件(keystore.p12),供 Spring Boot 使用。 方法 1:使用 keytool(推荐,直接生成 PKCS12 文件) 生成密钥库:keytool -genkeypair \-alias mydomain \ # 别名(自定义,如 mydomain)-keyalg RSA \ …...

taro小程序如何实现大文件(视频、图片)后台下载功能?

一、需求背景 1、需要实现小程序下载最大500M视频 2、同时需支持图片下载 3、退到其他页面再次回到当前页面时&#xff0c;下载进度也需要展示 二、实现步骤 1、在app.ts文件定义一个全局变量globalDownLoadData 2、写一个独立的下载hooks&#xff0c;代码如下&#xff08;…...

阿里云bgp服务器优势有哪些?搭建bgp服务器怎么做?

阿里云服务器bgp优势有哪些?搭建bgp服务器怎么做&#xff1f; BGP服务器的优势 BGP&#xff08;Border Gateway Protocol&#xff09; 是互联网的核心路由协议&#xff0c;用于在不同自治系统&#xff08;AS&#xff09;之间交换路由信息。BGP服务器的核心优势体现在网络连接…...

java连接redis服务器

直接从 Redis 获取数据通常是 Redis通过 客户端库实现的&#xff0c;Jedis 是 Java 中一个常用的 Redis 客户端库。有以下两种主要方式&#xff1a; 1. 使用单个 Jedis 实例&#xff08;不使用连接池&#xff09; import redis.clients.jedis.Jedis; public class RedisExampl…...

从零开始:Android Studio开发购物车(第二个实战项目)

一年经验的全栈程序员&#xff0c;目前头发健在&#xff0c;但不知道能撑多久。 文章目录 前言 一、页面编写 1. 顶部标签栏title_shopping.xml 2. 商品展现列表activity_shopping_channel.xml 3. 商品详情页面activity_shopping_detail.xml 4. 购物车页面activity_shopping…...

2. python协程/异步编程详解

目录 1. 简单的异步程序 2. 协程函数和协程对象 3. 事件循环 4. 任务对象Task及Future对象 4.1 Task与Future的关系 4.2 Future对象 4.3 全局对象和循环事件对象 5. await关键字 6. 异步上下文管理 7.异步迭代器 8. asyncio的常用函数 8.1 asyncio.run 8.2 asyncio.get…...

XSS靶场实战(工作wuwuwu)

knoxss knoxss Single Reflection Using QUERY of URL ——01 测试标签 <script>alert(666666)</script>——02: " <h1>test</h1>没有反应&#xff0c;查看源码 现在需要闭合双引号&#xff0c;我计划还是先搞标签 "><h1>tes…...

DNA复制过程3D动画教学工具

DNA复制过程3D动画教学工具 访问工具页面: DNA复制动画演示 工具介绍 我开发了一个交互式的DNA复制过程3D动画演示工具&#xff0c;用于分子生物学教学。这个工具直观展示了&#xff1a; DNA双螺旋结构的解旋过程碱基互补配对原理半保留复制机制完整的复制周期动画 主要特点…...