- 博客(92)
- 收藏
- 关注
原创 @RequestMapping注解的各个属性作用
和 常见于 API 规范(如 OpenAPI)或某些框架(如 Spring、JAX-RS、Micronaut)的配置上下文,用于定义接口默认的请求内容类型和默认的响应内容类型。 表示接口默认接收的请求数据格式为 。该格式常用于文件上传或混合表单数据(文本字段+文件)。请求体被划分为多个部分(parts),每个部分可携带不同的数据类型和编码。示例:用户头像上传、带附件的表单提交。 表示接口默认返回的数据格式为 。响应体是标准的 JSON 结构化数据。当前大多数 REST API 使用此格式进行数据交换,
2026-04-27 17:21:22
317
原创 除了前端 JS 配置的国际化,对于 JS 没覆盖到的文本,怎么实现国际化
本文提出了系统国际化开发的核心原则:谁生成文案谁负责翻译。前端负责UI静态文案的国际化(如使用vue-i18n),后端负责动态内容(如错误消息)的国际化(如SpringBoot的MessageSource)。对于数据库内容,可采用多语言字段或多语言表方案。同时建议前端设置兜底策略:未配置的key显示默认语言或key,开发环境输出警告。该方案避免了跨层翻译的混乱,明确了各层的职责边界,建议前端处理UI文案,后端处理业务消息,数据库内容按需设计多语言存储结构。
2026-04-27 16:55:03
425
原创 如何区分是恶意攻击还是游客正常请求
区分正常 / 恶意:靠行为风控 + 人机校验 + 文件真实内容校验 + 接口调用顺序,不靠单一规则;防止存储爆满:核心是白名单格式 + 大小数量限制 + 临时过期存储 + IP 限流 + 自动垃圾清理;不信任任何前端传入参数、所有安全规则后端强制校验、少持久化、多自动删除。「后端上传接口校验规则清单 + 配置参数」(限制大小、白名单、限流阈值、定时清理周期)
2026-04-27 16:43:22
398
原创 实践项目来串联概念(嵌入式、网络、后端、前端、AI)
本文提供了一个从零搭建智能家居系统的完整教程,涵盖嵌入式、网关、后端、前端和AI五大模块。系统架构包括:C语言模拟传感器数据通过TCP发送;Python网关转发数据;Java SpringBoot后端处理业务并调用AI服务;Vue前端展示实时数据;基于TensorFlow的自编码器实现异常检测。教程详细说明了各组件实现步骤,包括代码编写、环境配置和运行测试。文章还分析了生产级系统需补充的关键环节,如设备管理、时序数据库、反向控制通道等,并给出了优化建议。该实践项目完整演示了物联网系统的数据流转过程,适合学习
2026-04-23 09:48:31
398
原创 对于程序员“世界观”的一些疑问
嵌入式AI:在资源受限的嵌入式设备上运行AI模型(如语音唤醒、人脸识别)。一般先用Python训练模型,再转换成C代码(如TensorFlow Lite Micro)烧录到单片机。大模型+嵌入式:大模型通常太大,无法跑在普通嵌入式设备上,但可以通过云端API调用,嵌入式设备只负责采集数据、显示结果。先精通一门(推荐C或Python,看你兴趣方向),理解它的底层模型。再对比学第二门(比如学了C,可以学Go;学了Python,可以学Java),感受设计哲学差异。做一个小而全的项目。
2026-04-22 11:12:30
270
原创 C、Java、Go、Python 对比
选择编程语言时,你需要权衡的是短期开发效率与长期运行性能团队熟悉度与项目创新性等矛盾。一个复杂的系统(如高性能Web服务),采用Go实现核心网关,Python负责后台运营和数据分析,再用C语言优化关键计算模块,是一种常见的成功模式。理解每种语言的哲学,就能做出最适合项目需求的决策。
2026-04-22 10:07:11
338
原创 C语言学习
特性C语言体现程序组织函数(过程)数据与操作分离,通过参数传递设计思想自上而下,逐步求精复用方式函数调用 + 模块化(头文件/源文件)状态管理全局变量(慎用)或指针传递无对象、无继承无法实现面向对象的三大特征(封装、继承、多态)因此,当你看到C代码中大量使用函数 + 结构体 + 指针,并且流程明确、步骤清晰时,那就是“面向过程”风格的最直接体现。指针:不是单纯“记住数据”,而是记住数据的地址,实现间接访问与共享。函数/过程。
2026-04-22 10:04:44
330
原创 LVGL 界面UI库
轻量级但功能强:专为资源受限的嵌入式设备设计,在保证低内存和低Flash占用的同时,提供了完整的GUI解决方案,最低只需要64kB Flash和16kB RAM就能运行。跨平台能力:不仅可以在各种单片机(如STM32、ESP32)上运行,还能在等桌面操作系统上通过模拟器运行,这为前期的学习、开发和调试带来了极大的便利。强大的图形能力:支持动画、抗锯齿、透明度、平滑滚动、图层混合等高级图形效果,让你的产品界面告别单调,更加现代化和富有动感。灵活的布局和交互。
2026-04-22 09:54:09
374
原创 讲解“实时”是怎么实现的
通信模型:从客户端拉取 → 服务器推送。协议选择:WebSocket 是目前双向实时的主流;SSE 适合单向推送;WebRTC 用于极致 P2P。后端挑战:连接管理、水平扩展、跨节点消息路由、状态同步。前端挑战:高性能接收、缓冲、渲染、重连。延迟权衡:真正的实时并不意味着零延迟,而是低且可预测的延迟,用户体验平滑。实时 = 持久化全双工通道 + 事件驱动推送 + 高效端到端渲染。
2026-04-21 10:08:23
416
原创 “沉浸式翻译”工具
一个运行在浏览器上的插件,专门用来翻译网页、PDF、视频字幕等互联网内容,目标用户是需要在网上阅读外文资料的人,方便阅读官方的英文文档。沉浸式翻译(Immersive Translate)是一款免费的,能让你的外语阅读、学习和工作体验变得像在母语环境中一样自然流畅。
2026-04-21 10:05:51
231
原创 OpenClaw “养龙虾”
它不是简单的聊天机器人,而是一个本地优先、可自主执行任务的AI智能体(AI Agent)平台。其核心能力是从“会说”到“会做”,能完成“接收指令 → 拆解任务 → 调用工具 → 执行操作 → 返回结果”的全流程。简单来说,你可以把它理解为一个能替你操作电脑、处理任务的“数字员工”。与普通AI的核心区别在于,它能自动抓取新闻、分拣邮件、管理文件等,并且支持微信、飞书等多种接入方式,数据可保留在本地,安全性更高。“养龙虾”的过程,本质上是部署一个专属的AI智能体。关键在于理解其“动手执行”的核心价值。
2026-04-20 14:44:23
274
原创 STM32加密
步骤操作防范目标1. 生成密钥(出厂一次)读取 UID → MD5 得到固定值 → 作为种子生成随机数 → 写入 Flash让每颗芯片拥有唯一密钥,防止批量克隆2. 校验密钥(每次启动)重新计算 UID + MD5,与 Flash 中的预存值比对,不一致则死循环防止固件被直接复制到另一颗 UID 不同的芯片上运行3. 开启 RDP 读保护设置选项字节为 RDP Level 1 或 Level 2防止通过调试器(ST-Link/J-Link)读出 Flash 中的固件和密钥。
2026-04-20 14:30:16
388
原创 随机数概念及算法
类型随机性来源是否可重现典型算法主要用途真随机(TRNG)物理现象否热噪声采样、量子RNG高安全性、抽奖、密钥生成伪随机(PRNG)数学公式是(种子相同)模拟、游戏、一般编程密码学安全伪随机(CSPRNG)数学公式+安全约束是(种子保密)加密协议、安全令牌注意:日常编程中用生成的是伪随机数,因速度快、可重现便于调试。而对安全性有要求的场景(如重置密码链接的 token)必须使用 CSPRNG。伪随机数是指通过确定性的数学算法生成的、看起来像随机数的数列。“伪”
2026-04-20 11:33:54
419
原创 STM32 和 51单片机
简单来说,STM32是,而不是某一个具体的单片机型号。它由(STMicroelectronics)公司推出,是基于内核的(MCU)系列产品。你可以把STM32想象成一个包含几百种型号的“产品家族”。
2026-04-20 11:17:05
380
原创 嵌入式 和 单片机
单片机(Microcontroller Unit,MCU)就是一块集成了整个计算机主要部件的芯片。想象一下,一台普通电脑有 CPU(处理器)、内存、硬盘、输入输出接口等,这些是分开的部件。而单片机把这几乎所有的东西都集成到一块小小的芯片内部CPU:运算和控制核心RAM:内存(临时存储数据)Flash/ROM:存储程序(相当于硬盘)各种外设:定时器、串口、ADC、PWM 等你只需要给这块芯片通电,再写入程序,它就能独立运行。常见单片机型号。
2026-04-17 14:49:39
755
1
原创 md5加密,别人可以解密吗
问题答案MD5可以数学上"解密"吗?❌ 不可以,哈希函数是单向的MD5可以被实际破解吗?✅ 可以,通过彩虹表、暴力等方式弱密码(如123456)安全吗?❌ 不安全,彩虹表可瞬间破解加盐能防止破解吗?✅ 可以,但MD5本身仍有碰撞风险现在应该用什么?MD5是单向的,但常见密码的MD5值早已被人"算好"并收录在彩虹表中,查表就能反推出原文。所以在实际应用中,MD5早已不是安全的选择。
2026-04-14 14:25:01
313
原创 MD5碰撞攻击
MD5 的输入可以是任意大小的文件(比如一张图片、一个程序、一段文字),输出是固定 128 位的哈希值(通常写成 32 个十六进制字符)。理想情况下:不同的输入应该产生不同的哈希值。就像每个人的指纹理论上唯一对应一个人。现实情况:因为 MD5 的输出长度有限(只有 128 位),而可能的输入是无限的,所以必然存在不同的输入产生相同 MD5 值的情况。这就像全世界几十亿人,但指纹的特征空间有限,理论上可能两个人指纹相同——不过概率极低,通常可以忽略。
2026-04-14 14:23:44
211
原创 SKU概念
SKU是一个由数字、字母或符号组成的唯一代码,用于标识和管理库存中每一种特定的商品。它的关键在于“唯一性”和“特异性”。每一个SKU都对应着一种商品在特定属性组合下的唯一身份。你可以把SKU 理解为“商品的最小管理单元身份证”。它让企业能够像管理图书馆里每一本具体的书一样,去管理库存中每一件具有不同特性的商品,是实现精细化运营的基石。
2026-02-02 09:35:41
1518
原创 为什么@Builder 注解默认父类字段不可见
build()为什么build注解设置父类字段的值,会爆红根据你提供的代码,问题在于创建的构建器可能没有包含父类的字段。这是 Lombok@Builder注解的一个常见限制。
2026-01-23 14:37:52
539
原创 为什么 @Builder 没使用Boolean字段的默认值?
使用@Builder注解的和属性:@Data@Schema(description = "客户表")@Builder(// ... 其他字段@Schema(description = "是否查询客户账户")// 自定义构建器方法。
2026-01-23 14:27:33
579
原创 几种有趣业务功能实现设计及Java代码示例
System.out.println(Thread.currentThread().getName() + " 成功获取锁,执行库存扣减...");System.out.println(Thread.currentThread().getName() + " 获取锁失败,资源正被占用。new Thread(() -> locker.seckillProduct(productId), "线程-" + i).start();
2025-12-24 11:26:09
855
原创 Daily coding practice 算法题 P2(2025.11.18 - 2025.11.30)
最优算法展现了数学思维在算法优化中的强大力量,通过发现并利用Z字形变换的数学规律,实现了最优的时间复杂度。暴力解法2在可读性和性能之间取得了较好平衡,适合大多数工程场景。暴力解法1虽然性能最差,但其模块化的设计思想值得学习,特别适合团队协作和代码维护。推荐选择竞赛/面试:最优算法生产环境:暴力解法2简化版学习教学:暴力解法1(理解Z字形变换过程)可读性:逻辑分层清晰,易于理解和维护可维护性:修改空格分配策略或对齐规则更容易性能:时间复杂度更低,处理大规模数据更高效健壮性:边界条件处理更完善。
2025-12-23 15:27:01
562
原创 使用二进制位(bit)来标记某种状态或标志位
java// 检查是否设置了某个标志= 0;// 添加标志// 移除标志// 切换标志// 获取所有设置的标志描述。
2025-12-22 10:46:01
971
原创 因重载方法使用不当导致报错
方法重载就像在同一个班级里有多个叫"小明"的学生,我们需要通过他们的特征来区分:java// 举例:同样是"打印"功能,但根据不同的"特征"(参数类型)区分// 打印整数System.out.println("整数:" + number);// 打印字符串System.out.println("文本:" + text);// 打印整数和字符串javaString address = "北京市海淀区中关村";// 方法1:substring(开始位置)// "海淀区中关村"
2025-12-15 14:03:32
831
原创 存储过程 vs 存储函数:全面对比
存储过程更适合:复杂的业务逻辑流程需要事务控制的操作返回多个结果的情况存储函数更适合:单一目的的计算在SQL语句中作为表达式使用数据转换和格式化根据具体业务需求选择合适的工具,有时候两者结合使用能达到最佳效果。
2025-11-24 23:50:11
760
原创 多级视图插入检查流程
向最后一个视图插入数据时的检查规则:从最外层视图开始检查,根据其检查选项类型决定检查范围CASCADED: 强制检查当前视图和所有底层视图的条件LOCAL: 只检查当前视图条件,但如果底层视图明确定义了检查选项(CASCADED或LOCAL),也会检查那些视图检查是递归进行的,直到遇到没有定义检查选项的视图或到达基表只要有任何一个视图定义了,就会强制检查它下面的所有视图条件,无论中间视图是否定义了检查选项。
2025-11-23 12:52:31
963
原创 B+Tree高度计算公式
即使对于数十亿记录的大表,B+Tree的高度通常也能保持在3-4层,这也是B+Tree作为数据库索引如此高效的原因之一。每页索引条目数 = (16384 - 120) ÷ (8 + 6) ≈ 1160个。高度 ≈ log(分支因子) (记录总数)-- InnoDB系统表查询(需要权限)(100万-1亿行):通常高度为2-3。页大小:16KB = 16384字节。(< 100万行):通常高度为1-2。-- 查看索引统计信息(包括深度)主键类型:BIGINT(8字节)(> 1亿行):高度为3-4。
2025-11-20 16:28:54
282
原创 MySQL执行计划中的type连接类型详解
理解type连接类型对于SQL性能优化至关重要:尽量让查询达到ref及以上级别避免ALL全表扫描根据业务场景合理设计索引定期分析慢查询的执行计划通过监控和优化type类型,可以显著提升数据库查询性能。
2025-11-20 16:27:23
815
原创 实体类为什么boolean类型的字段,从后端传到前端,字段名字由“isRoot”变成“root”?
实体类为什么boolean类型的字段,从后端传到前端,字段名字由“isRoot”变成“root”?(其实是应该用Boolean)这个问题源于 Java Bean 命名规范与 JSON 序列化库的默认行为之间的差异。
2025-11-20 00:07:34
670
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅