微服务项目->在线oj系统(Java版 - 1)
相信自己,终会成功
目录
C/S架构与B/S架构
C/S架构(Client/Server,客户端/服务器架构)
特点:
优点:
缺点:
典型应用:
B/S架构(Browser/Server,浏览器/服务器架构)
特点:
优点:
缺点:
典型应用:
核心对比
发展趋势
微服务划分
微服务划分的核心目标
微服务划分原则
前端运用技术
vue核心目录:
创建 Vue 实例:
常用指令
计算属性(Computed)和侦听器(Watch)
Mybatis-plus
1. 核心功能
2.常用注解
使用建议:
准备工作介绍
架构分层解析
(1) Controller 层
(2) Service 层
(3) MyBatis(DAO 层)
(4) 连接池
(5) 数据库(MySQL)
2. 完整请求流程
3. 关键设计思想
4. 常见问题与优化
5. 扩展:对比其他架构
接口文档
接口文档的核心作用
需求种类 | 需求内容 |
业务需求 | 题目列表 刷题 竞赛列表 竞赛用户排名 比赛 自动判题 题目管理 竞赛管理 |
用户需求 | 我的竞赛 我的消息 , 获取比赛结果 查看历史竞赛排名 |
系统需求 | 用户登录 , 注册 用户登录 安全防护(身份认证 , 身份认证 . 防sql注入 . 防xxs攻击) |
C/S架构与B/S架构
C/S架构(Client/Server,客户端/服务器架构)
特点:
-
客户端:需要安装专用的客户端软件(如QQ、微信、游戏客户端)。
-
服务器:负责数据处理和业务逻辑,客户端负责用户交互和部分计算。
-
通信:通过自定义协议(如TCP/UDP)直接与服务器交互。
优点:
-
性能高:客户端可以分担计算任务,响应速度快(适合图形渲染、实时交互等场景)。
-
离线能力:部分功能可离线使用,同步数据时再连接服务器。
-
安全性:通信协议可定制,数据加密更灵活。
缺点:
-
部署维护成本高:需为不同操作系统开发客户端,升级时需要用户手动更新。
-
跨平台性差:不同系统(Windows/macOS/Linux)可能需要单独开发。
-
用户门槛:用户需主动安装客户端,推广成本高。
典型应用:
-
大型游戏(如《英雄联盟》)、即时通讯工具(如微信)、企业ERP系统。
B/S架构(Browser/Server,浏览器/服务器架构)
特点:
-
浏览器:用户通过浏览器(Chrome/Firefox等)访问,无需安装额外软件。
-
服务器:承担主要业务逻辑和数据处理,浏览器仅负责展示和简单交互。
-
通信:基于HTTP/HTTPS协议,通常通过Web服务(如RESTful API)交互。
优点:
-
跨平台性:只需兼容浏览器,支持Windows/macOS/Linux甚至移动端。
-
无需安装:用户通过URL即可访问,使用门槛低。
-
维护方便:服务端更新后,所有用户自动获取最新版本。
缺点:
-
性能受限:依赖浏览器和网络,复杂计算或图形处理能力较弱。
-
离线能力差:通常需联网使用(可通过PWA等技术部分缓解)。
-
安全性挑战:易受Web攻击(如XSS、CSRF),需额外防护。
典型应用:
-
网页邮箱(如Gmail)、在线办公(如Google Docs)、电商平台(如淘宝)
核心对比
对比维度 | C/S架构 | B/S架构 |
---|---|---|
安装部署 | 需安装客户端 | 无需安装,浏览器即可访问 |
跨平台性 | 差(需多版本适配) | 强(浏览器通用) |
性能 | 高(本地计算) | 依赖网络和浏览器性能 |
维护成本 | 高(需更新客户端) | 低(服务端统一更新) |
离线支持 | 支持 | 有限支持(需特殊技术) |
典型场景 | 实时游戏、高频交互工具 | 信息查询、在线服务 |
发展趋势
混合架构:现代应用常结合两者优势,如客户端应用内嵌Web页面(Electron、Flutter),或PWA(渐进式Web应用)提供类原生体验。
云原生趋势:B/S架构因云计算的普及更受青睐,但C/S仍在对性能要求高的领域不可替代。
根据需求选择架构:
-
需要高性能、复杂交互 → C/S
-
追求便捷性、跨平台 → B/S
微服务划分
单体架构:
可跨展现差,技术栈受限,可靠性问题
集群架构:
资源利用率低,容错与隔离性不足,部署与升级复杂
分布式架构:
高耦合度,容错与隔离性不足
微服务架构的优势:
易于开发和维护:每个微服务负责的业务比较清晰,体量小,开发和维护成本降低
容错性高:一个服务发生故障,可以使故障隔离在单个服务中,不影响整体服务故障
扩展性好:每个服务都是独立运行的,我们可以结合项目实际情况进行扩展,按需伸缩
技术选型灵活:每个微服务都是单独的团队来运维,可以根据业务特点和团队特点,选择适合的技术栈
微服务带来的挑战
服务依赖:随着服务的数量增多,服务之间的关系也会变得复杂,一个服务的更改,需要考虑对其它服务的影响
运维成本: 一个业务流程会涉及多个微服务共同完成,有更多的服务需要编译,部署,运行,甚至可能是不同的编程语言,不同的运行环境,当然也需要集群来处理故障转移等
开发和测试:一个业务流程可能涉及多个微服务共同完成,服务调用引入网络延迟,不可靠的网络,如何进行容错处理等问题
服务监控:在一个单体结果中,很容易实现服务的监控,因为所有功能都在一个服务中,微服务架构下,不仅需要对整个链路进行监控,还需要对每一个服务进行监控
负载均衡:微服务架构中的服务实例数量肯能非常庞大,因此需要有效的服务发现和负载均衡机制来管理请求流量和保证高可用性
微服务划分的核心目标
-
高内聚低耦合:每个服务专注于单一业务能力,内部功能紧密相关,服务间依赖最小化。
-
独立部署与扩展:服务可单独部署、升级和扩缩容,不影响其他服务。
-
团队自治:每个服务由独立团队全权负责(开发、运维),减少跨团队协调成本。
-
技术异构性:不同服务可根据需求选择合适的技术栈(如数据库、编程语言)。
微服务划分原则
1. 业务能力优先
-
按领域驱动设计(DDD)划分:
-
识别业务领域的限界上下文(Bounded Context),每个上下文对应一个微服务。
-
例如:电商系统中的「订单服务」、「库存服务」、「支付服务」。
-
-
避免技术维度划分:
-
错误示例:按"数据库服务"、"缓存服务"划分(应属于技术组件而非业务服务)。
-
2. 单一职责原则(SRP)
-
每个服务只解决一个核心问题,例如:
-
用户服务:仅处理用户注册、登录、权限。
-
商品服务:仅管理商品信息、分类。
-
-
判断标准:如果修改一个功能的需求频繁影响多个服务,说明划分不合理。
3. 松耦合与高内聚
-
松耦合:服务间通过API通信,避免数据库直接共享。
-
高内聚:服务内部数据和行为紧密关联,例如「订单服务」应包含订单创建、查询、状态机逻辑。
4. 团队规模匹配
-
两个披萨原则:一个微服务应由一个小团队能完全维护。
-
避免服务粒度过细导致运维复杂度爆炸。
5. 演进式设计
在线oj系统:按照业务划分
服务名称 | 具体功能 |
后台数据管理 | 题库管理、竞赛管理、C端⽤⼾管理、定时任务管理 |
用户服务 | 登录、注册、退出登录、个⼈中⼼、我的竞赛、我的消息 |
题库竞赛服务 | 题库列表、竞赛列表、竞赛报名、查看排名、竞赛或者刷题时题⽬切换、提交代 码、运⾏代码、获取代码执⾏结果 |
按照技术划分:
服务名称 | 具体功能 | 拆分原因 |
网关服务 | 统⼀的权限控制,统⼀的请求入口动态路由 转发等 | 功能即原因 |
后台数据管理 服务 | 题库管理、竞赛管理、C端用户管理 | |
定时任务服务 | 定时任务增删改查、定时任务功能实现 | 从技术的⻆度分析定时任务的执行可能需要和 多个服务配合完成。 并且定时任务的执行可能 会周期性或⻓时间占用资源。 |
登录注册服务 | 登录、注册 | 可能需要与第三方的认证服务进行交互,存在 性能瓶颈 |
用户服务 | 退出登录、个⼈中心、我的竞 赛、我的消息 | |
消息服务 | 发送消息,接收消息 | 消息种类较多,短信、站内信、邮件等等。和 多个第三⽅组件交互 |
题库竞赛服务 | 题库列表、竞赛列表、竞赛报名、查看排 名 | |
答题服务 | 竞赛或者刷题时题⽬切换、提交代码、获取 代码执⾏结果 | 竞赛.刷题时高频使用功能 |
判题服务 | 判题 | 判题逻辑可能比较复杂,不同类型的题目判题 逻辑不⼀致,存在⼤量复杂计算 |
代码沙箱服务 | 运行代码 | 与第三方组件进行交互,可能是性能瓶颈 |
服务器架构:
前端运用技术
官方文档: Vue.js - 渐进式 JavaScript 框架 | Vue.js
实战教程: Vue Mastery | The best way to learn Vue.js
Vue Router:Vue Router | Vue.js 的官方路由
vue核心目录:
node_modules:支持项目运行的依赖文件
public:存放静态资源和公共资源,如如favicon.ico网站图标
src:项目开发主要文件夹
index.html:入口的html文件
package.json:项目的描述文件
创建 Vue 实例:
const app = Vue.createApp({data() {return {message: "Hello Vue!",count: 0,};},methods: {increment() {this.count++;},},
});app.mount("#app"); // 挂载到 DOM 元素
-
data()
:定义响应式数据(数据变化时 UI 自动更新)。 -
methods
:定义方法,可在模板或 JS 中调用
常用指令
指令 | 作用 | 示例 |
---|---|---|
v-bind | 动态绑定属性 | <a :href="url"> (缩写 : ) |
v-model | 双向数据绑定(表单) | <input v-model="name"> |
v-if / v-else | 条件渲染 | <p v-if="show">Visible</p> |
v-for | 列表渲染 | <li v-for="item in items">{{ item }}</li> |
v-on | 事件监听 | <button @click="submit"> (缩写 @ ) |
v-show | 显示/隐藏(CSS display ) | <div v-show="isVisible"> |
计算属性(Computed)和侦听器(Watch)
计算属性
computed: {reversedMessage() {return this.message.split('').reverse().join('');}
}
监听器
watch: {count(newVal, oldVal) {console.log(`Count changed from ${oldVal} to ${newVal}`);}
}
适合执行异步操作或复杂逻辑
功能 | 语法 | 说明 |
---|---|---|
数据绑定 | {{ }} 或 v-bind | 动态显示数据 |
事件绑定 | @click 或 v-on | 处理用户交互 |
条件渲染 | v-if / v-show | 控制元素显示 |
列表渲染 | v-for | 循环渲染数组 |
双向绑定 | v-model | 表单输入绑定 |
组件化 | app.component() | 复用 UI 逻辑 |
Mybatis-plus
MyBatis-Plus 🚀 为简化开发而生MyBatis-plus:MyBatis-Plus 🚀 为简化开发而生
MyBatis-Plus(简称 MP)是 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,简化开发、提高效率。主要特性包括:
-
无侵入:只增强不修改 MyBatis 原有功能。
-
强大的 CRUD 操作:内置通用 Mapper 和 Service,减少 SQL 编写。
-
支持 Lambda 表达式:避免硬编码字段名。
-
多种主键策略:支持 UUID、雪花算法等。
-
分页插件:简化分页查询。
-
动态表名:支持运行时动态切换表名。
添加依赖
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version>
</dependency>
创建实体类(示例)
@Data // Lombok 注解,自动生成 getter/setter
@TableName("user") // 指定表名(如果表名和类名一致可省略)
public class User {@TableId(type = IdType.AUTO) // 主键自增private Long id;private String name;private Integer age;private String email;
}
配置数据源
# application.yml
spring:datasource:url: jdbc:mysql://localhost:3306/mp_demo?useSSL=falseusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver
创建 Mapper 接口
public interface UserMapper extends BaseMapper<User> {// 无需写 XML,继承 BaseMapper 即拥有 CRUD 方法
}
1. 核心功能
(1) 条件构造器(Wrapper)
用于构建动态 SQL 条件,支持链式调用。
// 查询 age > 18 且 name 包含 "张" 的用户
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.gt("age", 18).like("name", "张");
List<User> users = userMapper.selectList(wrapper);// Lambda 写法(避免硬编码字段名)
LambdaQueryWrapper<User> lambdaWrapper = new LambdaQueryWrapper<>();
lambdaWrapper.gt(User::getAge, 18).like(User::getName, "张");
List<User> users = userMapper.selectList(lambdaWrapper);
(2) 分页查询
// 配置分页插件
@Configuration
public class MyBatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor());return interceptor;}
}// 使用分页
@Test
void testPage() {Page<User> page = new Page<>(1, 10); // 当前页,每页条数userMapper.selectPage(page, null);System.out.println("总记录数:" + page.getTotal());page.getRecords().forEach(System.out::println);
}
(3) 自定义 SQL
<!-- UserMapper.xml -->
<select id="selectUserByName" resultType="User">SELECT * FROM user WHERE name = #{name}
</select>
// Mapper 接口
public interface UserMapper extends BaseMapper<User> {User selectUserByName(@Param("name") String name);
}
2.常用注解
注解 | 作用 | 示例 |
---|---|---|
@TableName | 指定表名 | @TableName("sys_user") |
@TableId | 指定主键 | @TableId(type = IdType.AUTO) |
@TableField | 指定字段映射 | @TableField("user_name") |
@Version | 乐观锁字段 | @Version private Integer version; |
@EnumValue | 枚举字段存储值 | @EnumValue private StatusEnum status; |
使用建议:
-
避免全表扫描:使用
QueryWrapper
或LambdaQueryWrapper
添加条件。 -
逻辑删除:配置
@TableLogic
实现软删除。 -
性能优化:
-
使用
selectById
替代selectList
查询单条数据。 -
批量操作使用
insertBatch
或updateBatchById
。
-
准备工作介绍
架构分层解析
(1) Controller 层
-
作用:接收 HTTP 请求(如浏览器、API 调用),解析参数,调用 Service 层处理业务逻辑,并返回响应(JSON/页面)。
(2) Service 层
-
作用:处理核心业务逻辑(如订单创建、支付),调用 DAO(如 MyBatis Mapper)操作数据。
(3) MyBatis(DAO 层)
-
作用:负责与数据库交互,执行 SQL 查询/更新,将结果映射为 Java 对象。
-
关键组件:
-
Mapper 接口:定义数据库操作方法。
-
XML/注解 SQL:编写具体 SQL 语句。
-
(4) 连接池
-
作用:管理数据库连接,避免频繁创建/销毁连接带来的性能开销。
-
常见实现:
-
HikariCP(Spring Boot 默认)
-
Druid(阿里开源,带监控功能)
-
-
连接池工作流程:
-
应用启动时初始化多个连接(如图中的
连接1~4
)。 -
请求到达时从池中获取空闲连接。
-
使用完毕后归还连接,而非直接关闭。
-
(5) 数据库(MySQL)
-
作用:持久化存储数据,执行 SQL 语句并返回结果。
2. 完整请求流程
-
HTTP 请求 →
Controller
接收并解析参数。 -
业务逻辑 →
Service
处理业务(如校验、计算)。 -
数据操作 →
MyBatis
通过 Mapper 执行 SQL。 -
连接管理 → 从
连接池
获取连接,访问MySQL
。 -
返回结果 → 数据原路返回,最终由
Controller
响应给客户端。
3. 关键设计思想
-
分层解耦:各层职责单一,便于维护和扩展(如替换 MySQL 为 Oracle 只需修改 MyBatis 配置)。
-
连接池优化:复用连接,减少 TCP 握手和数据库认证开销。
-
ORM 映射:MyBatis 自动将数据库记录转为 Java 对象,避免手动解析 ResultSet。
4. 常见问题与优化
问题 | 解决方案 |
---|---|
Service 层事务失效 | 使用 @Transactional 注解。 |
连接池耗尽 | 调整连接数(如 spring.datasource.hikari.maximum-pool-size=20 )。 |
MyBatis 性能慢 | 开启二级缓存、优化 SQL。 |
5. 扩展:对比其他架构
-
无连接池:每次请求新建连接,高并发时数据库崩溃。
-
Service 和 Controller 合并:违反单一职责原则,难以维护。
-
直接 JDBC 替代 MyBatis:需手动处理结果集映射,代码冗余。
接口文档
接口文档(API Documentation)是开发人员编写的技术说明文件,用于描述系统提供的 API(应用程序编程接口) 的功能、参数、请求方式、返回数据格式等信息。它是前后端开发、测试、运维团队协作的重要依据。
接口文档的核心作用
-
明确接口规范
-
定义请求方法(GET/POST/PUT/DELETE)、URL、参数、返回值,避免前后端联调时出现歧义。
-
-
提高协作效率
-
前端开发无需等待后端完成,即可根据文档模拟数据;测试人员可直接根据文档编写用例。
-
-
降低维护成本
-
新成员通过文档快速理解系统接口设计,减少沟通成本。
-
-
支持自动化工具
-
Swagger、Postman 等工具可基于文档自动生成测试用例或 Mock 服务。
-
模块 | 说明 |
---|---|
接口基本信息 | 接口名称、版本、作者、更新时间等。 |
请求方式 | HTTP 方法(如 GET /api/users )。 |
请求参数 | Query 参数、Path 参数、Body 参数(类型、是否必填、示例值)。 |
响应数据 | 成功/失败的返回格式(字段说明、状态码、示例)。 |
错误码 | 定义全局或接口特定的错误码(如 401 Unauthorized )。 |
安全认证 | 描述鉴权方式(如 Token、OAuth2)。 |
调用限制 | 频率限制(如 100 次/分钟)、权限要求(如管理员角色)。 |
相关文章:
微服务项目->在线oj系统(Java版 - 1)
相信自己,终会成功 目录 C/S架构与B/S架构 C/S架构(Client/Server,客户端/服务器架构) 特点: 优点: 缺点: 典型应用: B/S架构(Browser/Server,浏览器/服务器架构&a…...
【深度学习】使用块的网络(VGG)
虽然 AlexNet 证明深层神经网络卓有成效,但它没有提供一个通用的模板来指导后续的研究人员设计新的网络。 也就是说尽管我知道了更深更大的网络更有效,但是不清楚怎么让它更深更大,从而起到一个更好的效果。 于是,研究人员开始从单…...
Python数据可视化 - Pyecharts绘图示例
文章目录 一、Pyecharts简介及安装1. Pyecharts简介2. 安装Pyecharts 二、准备数据三、饼图示例1. 初始化选项配置2. 饼图相关设置3. 全局配置项3.1 标题配置项3.2 图例配置项3.3 提示框配置项3.4 工具箱配置项3.5 视觉映射配置项 4. 系列配置项4.1 标签选项配置4.2 图元样式配…...
Day29
复习日 知识点回顾 类的装饰器装饰器思想的进一步理解:外部修改、动态类方法的定义:内部定义和外部定义 作业:复习类和函数的知识点,写下自己过去29天的学习心得,如对函数和类的理解,对python这门工具的理…...
Python列表全面解析:从入门到精通
文章目录 Python列表全面解析:从入门到精通一、列表基础1. 什么是列表?2. 列表特性总结表 二、列表的基本操作(基础)1. 访问元素2. 修改列表 三、列表的常用方法(基础)1. 添加元素的方法2. 删除元素的方法3. 查找和统计方法4. 排序和反转 四、列表的高级…...
Nacos数据写入流程
在 3 节点的 Nacos 集群中,数据写入流程和主节点(Leader)的角色基于 Nacos 的分布式一致性协议(通常使用 Raft 协议)来实现。以下以 Markdown 格式详细说明 3 节点 Nacos 集群的数据写入流程以及主节点的角色和确定方式…...
《P4551 最长异或路径》
题目描述 给定一棵 n 个点的带权树,结点下标从 1 开始到 n。寻找树中找两个结点,求最长的异或路径。 异或路径指的是指两个结点之间唯一路径上的所有边权的异或。 输入格式 第一行一个整数 n,表示点数。 接下来 n−1 行,给出…...
Ansible模块——文件属性查看,文件或目录创建和属性修改
ansible.builtin.stat 可以查看文件信息。 选项 类型 默认值 描述 pathstrnull 要检查的文件或目录的完整路径(必需)。 followboolfalse 如果是符号链接,是否跟随到目标路径上获取其状态。 get_attributesbooltrue 是否返回扩展属性&#…...
【图像生成大模型】Wan2.1:下一代开源大规模视频生成模型
Wan2.1:下一代开源大规模视频生成模型 引言Wan2.1 项目概述核心技术1. 3D 变分自编码器(Wan-VAE)2. 视频扩散 Transformer(Video Diffusion DiT)3. 数据处理与清洗 项目运行方式与执行步骤1. 环境准备2. 安装依赖3. 模…...
AGI大模型(25):LangChain提示词模版
我们也可以创建prompt template, 并引入一些变量到prompt template中,这样在应用的时候更加灵活。 1 代码实现 # 我们也可以创建prompt template, 并引入一些变量到prompt template中,这样在应用的时候更加灵活 from langchain_core.prompts import ChatPromptTemplate from…...
mybatis中的resultMap的association及collectio的使用
目录 1.reusltmap的说明 2.association的使用 3.collection的使用 4.总结 1.reusltmap的说明 resultmap定义了数据库的结果映射到java对象的规则,resultmap包含4个属性: id: ResultMap 的唯一标识 type: 映射到的 Java 类型(全限定类名或…...
静态网站部署:如何通过GitHub免费部署一个静态网站
GitHub提供的免费静态网站托管服务可以无需担心昂贵的服务器费用和复杂的设置步骤,本篇文章中将一步步解如何通过GitHub免费部署一个静态网站,帮助大家将创意和作品快速展现给世界。 目录 了解基础情况 创建基础站点 在线调试站点 前端项目部署 部署…...
Android 手写签名功能详解:从原理到实践
Android 手写签名功能详解 1. 引言2. 手写签名核心实现:SignatureView 类3. 交互层实现:MainActivity 类4. 布局与配置5. 性能优化与扩展方向 1. 引言 在电子政务、金融服务等移动应用场景中,手写签名功能已成为提升用户体验与业务合规性的关…...
【iOS(swift)笔记-9】WKWebView无法访问网络
对于iOS 在info中添加App Transport Security Settings,然后在App Transport Security Settings里添加Allow Arbitrary Loadstrue 对于macOS 除了上面的操作,还需在项目信息的App Sandbox里有个Network打钩选项...
Adapter适配器模式
Adapter适配器模式是一种结构设计模式,用于解决接口不兼容的问题,通过适配器类,可以将一个类的接口转换为客户渴望的另一个接口,从而使原来无法协作的对象能够一起工作。 角色和职责: 目标接口(Target&…...
七、xlib窗口渲染
文章目录 1.渲染图片2.双缓冲3.混合图片4.渐变窗口 1.渲染图片 在上篇文章中的最后,我们使用libpng加载了一个png图片,并显示到窗口上,但是我们可以看到显示到窗口的图片周边有黑色的背景。原因是在我测试的操作系统下使用xlib创建的窗口默认…...
python中http.cookiejar和http.cookie的区别
在Python中,http.cookiejar和http.cookie(通常指http.cookies模块)是两个不同的模块,它们的主要区别如下: 1. 功能定位 http.cookiejar 用于管理HTTP客户端的Cookie,提供自动化的Cookie存储、发送和接收功…...
架构设计模式:构建健壮、可扩展的 Serverless 应用
架构设计模式:构建健壮、可扩展的 Serverless 应用 到目前为止,我们已经掌握了 Serverless 的基本概念,了解了 FaaS 和 BaaS 如何协同工作,学会了使用框架进行开发部署,并知道了如何监控和排查问题。现在,是时候从“能用”向“好用”迈进了。 仅仅将代码部署到 Lambda 函…...
2- PyTorch
文章目录 1. Overview2. 线性模型 1. Overview 在人的智能中,最经常做的事情是推理和预测,在机器学习中也是如此。我们在以往的算法课中,所接触的穷举、贪心、分治和动规等算法都是由人设计的,而在机器学习中,算法是由…...
MinIO:从入门到精通,解锁云原生存储的奥秘
一、引言:为什么 MinIO 正在重塑存储世界? 在云计算和大数据时代,传统存储系统面临扩展性差、成本高、兼容性不足等挑战。MinIO 凭借其 S3 兼容性、分布式架构、高性能存储 等特性,成为企业构建现代化存储基础设施的首选。 本文…...
【LeetCode 热题100】739:每日温度(详细解析)(Go语言版)
🌡️ LeetCode 739:每日温度(详解 单调栈 多种思路对比) 📌 题目描述 给定一个整数数组 temperatures,表示每天的温度,返回一个数组 answer,其中 answer[i] 是指在第 i 天之后&am…...
Linux学习笔记|GCC编译指令基础|静动态库|makefile
一、GCC 编译指令基础 基本编译命令 gcc -o code code.c和gcc code.c -o code:这两条命令功能相同,都是使用 GCC 编译器将code.c源文件编译成名为code的可执行文件。-o选项用于指定输出文件名,选项位置在源文件前后不影响最终结果。 编译过程…...
【LeetCode 热题100】17:电话号码的字母组合(详细解析)(Go语言版)
☎️ LeetCode 17. 电话号码的字母组合(回溯 DFS 详解) 📌 题目描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按任意顺序返回。 数字到字母的映射如下(与电话按键相同)…...
C++学习:六个月从基础到就业——C++17:std::optional/variant/any
C学习:六个月从基础到就业——C17:std::optional/variant/any 本文是我C学习之旅系列的第四十七篇技术文章,也是第三阶段"现代C特性"的第九篇,主要介绍C17引入的三个重要工具类型:std::optional、std::varia…...
Go语言中函数 vs 方法
函数(Function):不属于任何类型,是全局可调用的。 方法(Method):绑定在某个类型上的函数,调用时依赖于这个类型的值或指针。 一、函数(Function) func 函数…...
代码随想录算法训练营第六十五天| 图论10—卡码网94. 城市间货物运输 I,95. 城市间货物运输 II
被学校课程轰炸了一周,回过头发现训练营已经要结束了,抓紧时间补完。不过算法这边也很难,感觉每天都是勉强理解在干什么的状态。 94. 城市间货物运输 I 94. 城市间货物运输 I SPFA算法,也是Bellman_ford 队列优化算法 优化原理…...
TDengine 在新能源领域的价值
能源数据的定义 能源数据是指记录和描述能源产业各个方面的信息,包括能源生产、供应、消费、储备、价格、排放以及相关政策和技术的数据。这些数据可以通过各种途径收集和整理,如能源企业的统计报表、政府部门的调查和监测、国际组织的发布数据等。 能…...
浅谈Frida 检测与绕过
目录 ptrace 占位与进程名检测端口检测与 D-Bus 协议通信扫描 /proc 目录(maps、task、fd)定位 so 中的 SVC syscall内存动态释放代码 1. ptrace 占位与进程名检测 检测方式 遍历运行进程列表,检查是否存在 frida-server 或相关进程名&…...
WaterStamp —— 一个实用的网页水印生成器开发记
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 最近,我和 CodeBuddy 一起完成了一个名为 WaterStamp 的网页水印生成器项目。这个小工具主要用于给…...
【MySQL】存储过程,存储函数,触发器
目录 准备工作 一. 存储过程 1.1.什么是存储过程 1.2.创建存储过程 1.3.创建只显示大于等于指定值的记录的存储过程 1.4.显示,删除存储过程 二. 存储函数 2.1.什么是存储函数 2.2.使用存储函数 2.2.1.使用存储函数之前 2.2.2.使用存储函数计算标准体重 …...
python打卡第29天
知识点回顾 类的装饰器装饰器思想的进一步理解:外部修改、动态类方法的定义:内部定义和外部定义 作业:复习类和函数的知识点,写下自己过去29天的学习心得,如对函数和类的理解,对python这门工具的理解等&…...
vim - v
在 Vim 中,使用 可视模式(Visual Mode) 可以选中文本并进行复制、剪切、粘贴等操作。以下是详细的使用方法: 1. 进入可视模式 命令功能v字符可视模式(按字符选择)V(大写)行可视模式…...
Linux 线程(上)
前言:大家早上中午晚上好!!今天来学习一下linux系统下所谓的线程吧!!! 一、重新理解进程,什么是进程? 1.1 图解 其中黑色虚线部分一整块就是进程,注意:一整…...
# 终端执行 java -jar example.jar 时(example.jar为项目jar包)报错:“没有主清单属性” 的解决方法
终端执行 java -jar example.jar 时(example.jar为项目jar包)报错:“没有主清单属性” 的解决方法 在Java中,一个JAR文件必须包含一个主清单属性(Main-Class属性)才能在命令行中直接运行。如果你在尝试运行…...
4:OpenCV—保存图像
将图像和视频保存到文件 在许多现实世界的计算机视觉应用中,需要保留图像和视频以供将来参考。最常见的持久化方法是将图像或视频保存到文件中。因此,本教程准备解释如何使用 OpenCV C将图像和视频保存到文件中。 将图像保存到文件 可以学习如何保存从…...
[C++面试] const相关面试题
1、非 const 的引用必须指向一个已存在的变量 int main() {int &a 20; // 错误const int &b 30; } 字面量 20 是临时值(右值),没有明确的内存地址。非常量引用(左值引用)不能直接绑定到右值(如…...
#Redis黑马点评#(六)Redis当中的消息队列
目录 Redis当中的消息队列 一 基于List 二 基于PubSub 三 基于Stream 单消费模式 消费者组 Redis当中的消息队列 消息队列,字面意思就是存放消息的队列。最简单的消息队列模型包括3个角色: 消息队列:存储和管理消息,也称为…...
Git基础原理和使用
Git 初识 一、版本管理痛点 在日常工作和学习中,我们经常遇到以下问题: - 通过不断复制文件来保存历史版本(如报告-v1、报告-最终版等) - 版本数量增多后无法清晰记住每个版本的修改内容 - 项目代码管理存在同样问题 二、版本控…...
Java程序员学AI(一)
一、前言 最近刷技术圈,满眼都是 GPT、DeepSeek、QWen 这些 AI 名词。看着同行们在群里聊 AI 写代码、做数据分析,我这个摸了 Java 老程序员突然慌了 —— 再不出手,怕是真要被时代落下了! 作为一个 Java 死忠粉,学 …...
《Python星球日记》 第91天:端到端 LLM 应用(综合项目:医疗文档助手)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、项目概述与需求分析1. 项目背景2. 项目目标3. 技术栈概览二、数据准备与处理1. 文档收集策略2. 文本预处理流程3. 向量化与知识库构建三、模…...
目前主流的AI测试工具推荐
以下是目前备受关注的AI测试工具及平台,涵盖功能测试、视觉测试、性能测试及国产化解决方案等多个领域,结合其核心特性与适用场景进行综合推荐: 一、主流AI测试工具推荐 Testim 核心功能:基于AI的动态元素定位技术,…...
vscode优化使用体验篇(快捷键)
本文章持续更新中 最新更新时间为2025-5-18 1、方法查看方法 1.1当前标签跳到新标签页查看方法实现 按住ctrl 鼠标左键点击方法。 1.2使用分屏查看方法实现(左右分屏) 按住ctrl alt 鼠标左键点击方法。...
uniprot中PTM数据的下载
首先是PTM的介绍: 参考:https://en.wikipedia.org/wiki/Post-translational_modification 蛋白质的翻译后修饰(PTM)通过改变氨基酸残基的化学结构,显著影响其带电性质,从而调控蛋白质的功能、定位和相互作…...
【QGIS二次开发】地图编辑-04
系列目录: 【QGIS二次开发】地图显示与交互-01_qgis二次开发加载地图案例-CSDN博客 【QGIS二次开发】地图显示与交互-02_setlayerlabeling-CSDN博客 【QGIS二次开发】地图符号与色表-03-CSDN博客 4 地图编辑 4.1 添加点要素 功能演示: 运行程序后…...
Qt 信号和槽-核心知识点小结(11)
目录 小结表格索引 disconnect函数 lambda表达式 啥是耦合,啥是内聚 简介:这是Qt信号和槽的最后一篇文章,最主要的是总结该信号和槽的核心知识点。以及该核心知识点的文章索引(表格太长了,手机可能看不完整&#…...
React响应事件中onClick={handleClick} 的结尾有没有小括号的区别
你可以通过在组件中声明 事件处理 函数来响应事件: function MyButton() {function handleClick() {alert(You clicked me!);}return (<button onClick{handleClick}>点我</button>);} 注意,onClick{handleClick} 的结尾没有小括号&#x…...
React-Query使用react-testing-library进行测试
1.测试react-query首先我们必须得拥有queryClient,所以我们初始化queryClient,因为默认是重试三次,这意味着如果想测试错误的查询,测试可能会超时。所以可以在初始化时关闭 const createWrapper () > {const queryClient new…...
软件设计师CISC与RISC考点分析——求三连
一、考点分值占比与趋势分析(CISC与RISC) 综合知识分值统计表 年份考题数量分值分值占比考察重点2018111.33%指令特征对比2019111.33%控制器实现方式2020222.67%寄存器数量/流水线技术2021111.33%寻址方式对比2022222.67%指令复杂度/译码方式2023111.3…...
GO语言(一期)常用关键字总结
GO语言(主题一)常用关键字总结 我们这里列出一些go语言关键字,方便各位友友们检查一下自己的学习效果,也方便友友们学习查询。 break default func interface select case defer go map …...
Ubuntu搭建NFS服务器的方法
0 工具 Ubuntu 18.041 Ubuntu搭建NFS服务器的方法 在Ubuntu下搭建NFS(网络文件系统)服务器可以让我们像访问本地文件一样访问Ubuntu上的文件,例如可以把开发板的根文件系统放到NFS服务器目录下方便调试。 1.1 安装nfs-kernel-server&#…...