Java17+SpringCloud微服务电商实战:Redis、MinIO、Docker整合
简介尚品甄选电商平台全栈开发项目资源包基于Java17与Spring Cloud微服务架构构建完整覆盖前后台用户管理、商品管理、订单处理等核心业务模块并集成Redis缓存、MinIO对象存储与Docker容器化部署。资源面向具备一定Java基础、希望深入理解微服务与电商系统落地的开发者可作为项目实战、毕业设计或技术进阶的参考资料。压缩包共505个文件以java、js、xml、vue前后端源码为主体辅以yml配置、图片素材、Dockerfile部署文件及附赠开发文档整体仅3.06MB目录结构清晰便于按模块检索学习。项目完整呈现了从服务拆分、网关路由到缓存加速、文件存储、容器化交付的典型技术链路附带的开发文档可帮助复盘架构设计与关键代码实现目前已有82人学习浏览是学习现代电商微服务全栈开发的高性价比资料。1. 基于Java17与SpringCloud微服务架构的尚品甄选电商平台先弄懂这个全栈项目解决什么问题一个电商全栈项目最容易翻车的地方不在业务代码而在基础环境JDK 版本、微服务组件版本、缓存和文件存储的中间件选型任何一个不匹配都会让后续所有步骤变成玄学。这个名为「尚品甄选」的项目就是围绕 Java17 与 SpringCloud 微服务架构搭起来的一整套电商平台包含前台用户浏览下单、后台商品与订单管理两套系统并且把 Redis 缓存、MinIO 文件存储、Docker 容器化部署全部集成进去。适合正在学微服务但没跑通完整链路的 Java 工程师也适合想快速搭一套可演示、可二次开发的电商原型的团队。整条链路其实不复杂SpringCloud 负责服务注册、配置与网关分发Redis 扛高并发读和分布式锁MinIO 管商品图片和文件上传最后用 Docker 把 MySQL、Redis、MinIO 和各微服务一起编排起来。下面我按自己实际落地这套架构的顺序从工程骨架、缓存与文件存储、容器化部署三个层面拆开讲最后给你一份能直接照着做的验收清单。2. 先搭 Java17 与 SpringCloud 微服务骨架工程拆分与依赖版本怎么定2.1 为什么选 Java17 SpringCloud而不是 Java8 或 SpringBoot 单体很多老项目还停在 Java8 SpringBoot 2.x这套组合稳定但到了 2026 年再开新项目选 Java17 的好处是长期支持版本、虚拟线程和更干净的垃圾回收器而且 SpringBoot 3.x 已经强制要求 Java17 起跳。SpringCloud 2023 之后的主线版本也全面拥抱 SpringBoot 3.x所以如果你照着 SpringBoot 2.x 的资料去配 SpringCloud依赖冲突会非常明显——最典型的就是javax.servlet和jakarta.servlet命名空间不一致导致启动直接失败。尚品甄选这类电商平台选 SpringCloud 而不是 Dubbo主要看重的是生态完整度服务注册用 Nacos网关用 SpringCloud Gateway配置中心、负载均衡、熔断降级都有现成组件学习资料多接 MinIO 和 Redis 这类中间件也更顺手。单体应用当然也能做电商但一旦要拆用户、商品、订单、库存多个团队并行开发微服务的价值才会体现出来。2.2 工程结构拆分前后台分离与模块划分拿到这个项目之后第一件事不是写代码而是先把工程结构看清。常见做法是把项目拆成父工程加多个子模块父工程只管依赖版本管理子模块各自负责一块业务。我会按下面的方式分shangpin-select-parent ├── shangpin-common # 公共模块统一返回、异常、工具类 ├── shangpin-gateway # SpringCloud Gateway 网关 ├── shangpin-auth # 登录鉴权服务 ├── shangpin-user # 前台用户服务 ├── shangpin-product # 商品服务 ├── shangpin-order # 订单服务 ├── shangpin-admin # 后台管理服务shangpin-common不能放业务代码只放跨服务复用的东西比如统一返回体ResultT、全局异常处理器、JWT 工具类。网关负责路由转发和 token 校验shangpin-auth负责登录签发 token业务服务只管自己的领域逻辑。这样拆的好处是后续做容器化部署时每个服务都能独立构建镜像不会因为模块之间耦合太深导致 Docker 构建时互相牵连。2.3 父工程依赖版本管理的核心配置微服务项目第一个坑就是依赖版本。SpringCloud 与 SpringBoot 版本必须严格对应否则启动时会出现类找不到或者方法签名不匹配。我一般直接在父工程里用dependencyManagement锁版本子模块不再写版本号只写依赖本身。parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.2.5/version relativePath/ /parent properties java.version17/java.version spring-cloud.version2023.0.1/spring-cloud.version spring-cloud-alibaba.version2022.0.0.0/spring-cloud-alibaba.version minio.version8.5.7/minio.version /properties dependencyManagement dependencies dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-dependencies/artifactId version${spring-cloud.version}/version typepom/type scopeimport/scope /dependency dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-alibaba-dependencies/artifactId version${spring-cloud.alibaba.version}/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagementspring-boot-starter-parent的版本决定了 SpringBoot 3.2.5 这个基线spring-cloud.version锁定 SpringCloud 的发布列车版本spring-cloud-alibaba.version负责 Nacos、Sentinel 等阿里系组件的版本。这三者的关系是SpringCloud 2023.0.x 对应 SpringBoot 3.2.xSpringCloud Alibaba 2022.0.0.0 对应该系列如果版本号对不上大概率会冒出NoSuchMethodError这类运行时错误排查起来非常费劲。2.4 用 Nacos 做服务注册与配置中心最小可跑配置服务注册这块项目里用 Nacos 是最稳妥的选择。它的控制台能直观看到每个服务的健康状态配置管理还能把数据源、Redis 地址这类环境相关的配置抽到配置中心里避免每个服务各自维护一份配置文件。spring: application: name: shangpin-product cloud: nacos: discovery: server-addr: 127.0.0.1:8848 namespace: shangpin-dev config: server-addr: 127.0.0.1:8848 file-extension: yaml namespace: shangpin-dev shared-configs: ->spring: cloud: gateway: routes: - id: shangpin-product uri: lb://shangpin-product predicates: - Path/api/product/** filters: - StripPrefix1 - id: shangpin-admin uri: lb://shangpin-admin predicates: - Path/api/admin/** filters: - StripPrefix1 default-filters: - name: AuthFilterlb://表示走负载均衡网关会根据服务名去 Nacos 拉取实例列表。StripPrefix1是把请求路径里的第一段去掉如果前端请求是/api/product/list到了商品服务就变成/list这个细节不搞清楚接口总是 404排查半天才发现是路径没匹配上。AuthFilter是自定义全局过滤器所有请求先校验 token白名单路径直接放行比如登录接口、商品列表接口。3. Redis 缓存与 MinIO 文件存储商品和订单两条数据通道怎么打通3.1 商品详情页的 Redis 缓存策略防穿透、防击穿、防雪崩电商平台里读最频繁的就是商品详情和分类列表这类数据变化频率低、读取量大非常适合缓存。直接把商品信息塞进 Redis 的做法看着简单但高并发场景下有三个坑必须提前处理缓存穿透、缓存击穿、缓存雪崩。缓存穿透是查询一个不存在的商品 ID请求每次都打到数据库解决方法是把空值也缓存到 Redis设置较短的过期时间比如 3 分钟。更稳的做法是用布隆过滤器把所有商品 ID 提前加载进过滤器请求进来先判断 ID 是否存在。缓存击穿是某个热门商品的缓存刚好过期大量请求同时打到数据库解决方法是加互斥锁只让一个线程去查数据库并回填缓存其他线程等待。缓存雪崩是大量缓存同时过期解决方法是过期时间加随机值比如基础过期时间 30 分钟再随机加上 1 到 5 分钟。在实际代码里商品详情的读取逻辑我一般这样写public ProductVO getProductDetail(Long productId) { String cacheKey product:detail: productId; String json stringRedisTemplate.opsForValue().get(cacheKey); if (json ! null) { return JSONUtil.toBean(json, ProductVO.class); } // 互斥锁只锁这个商品ID避免所有商品共用一把锁 String lockKey product:lock: productId; boolean locked stringRedisTemplate.opsForValue() .setIfAbsent(lockKey, 1, Duration.ofSeconds(30)); if (locked) { try { ProductVO product productMapper.selectDetailById(productId); if (product null) { // 空值也缓存设置短过期解决穿透 stringRedisTemplate.opsForValue() .set(cacheKey, , Duration.ofMinutes(3)); } else { // 过期时间加随机值解决雪崩 int randomExpire 1800 (int) (Math.random() * 300); stringRedisTemplate.opsForValue() .set(cacheKey, JSONUtil.toJsonStr(product), Duration.ofSeconds(randomExpire)); } return product; } finally { stringRedisTemplate.delete(lockKey); } } else { // 没拿到锁短暂休眠后递归或循环重试 Thread.sleep(100); return getProductDetail(productId); } }setIfAbsent是 Redis 里SETNX命令的封装同一个商品 ID 同时只能有一个线程拿到锁锁的过期时间设为 30 秒是防止线程执行到一半宕掉导致死锁。空值缓存解决穿透随机过期时间解决雪崩这三个处理全部集中在商品服务里不依赖任何外部框架。3.2 订单扣库存的 Redis 分布式锁为什么不能只用数据库订单系统的核心是扣库存数据库里UPDATE stock SET count count - 1 WHERE product_id ? AND count 0能保证不超卖但在高频并发下数据库压力很大。常见做法是先把库存预加载到 Redis用DECR命令扣减扣到负数就说明库存不足。但DECR只能保证单次操作原子性如果扣库存前后还要做校验、写订单、记流水多个操作必须放在同一个分布式锁里保护。public OrderResult createOrder(OrderRequest request) { String lockKey stock:lock: request.getProductId(); String lockValue UUID.randomUUID().toString(); boolean locked stringRedisTemplate.opsForValue() .setIfAbsent(lockKey, lockValue, Duration.ofSeconds(10)); if (!locked) { throw new BizException(系统繁忙请稍后重试); } try { Long stock stringRedisTemplate.opsForValue() .decrement(stock: request.getProductId()); if (stock null || stock 0) { throw new BizException(库存不足); } // 到这里才允许写订单表 orderMapper.insert(Order.builder() .productId(request.getProductId()) .buyerId(request.getBuyerId()) .build()); return OrderResult.success(); } finally { // 只释放自己持有的锁防止误删别人的锁 String currentValue stringRedisTemplate.opsForValue().get(lockKey); if (lockValue.equals(currentValue)) { stringRedisTemplate.delete(lockKey); } } }这里的lockValue很关键释放锁之前先比对值确认还是自己持有的锁才删除。如果不做这一步当前线程执行超时锁自动过期另一个线程拿到锁第一个线程的finally块如果直接删除就会把第二个线程的锁误删导致两个线程同时操作库存。Redis 分布式锁的原子性问题在单机 Redis 上基本可控如果项目要做到高可用可以再考虑 Redisson 的看门狗机制来自动续期但基础的SETNX 手动比对释放已经足以让订单扣库存这个场景跑稳。3.3 MinIO 文件存储商品图片上传与预签名 URL 访问商品图片、用户头像这类文件不能直接塞进数据库常见方案是把文件传到 MinIO数据库只存访问路径。MinIO 是兼容 S3 协议的对象存储服务部署简单Docker 一条命令就能拉起来。文件上传的核心是拿到一个 MinIO client然后调用putObject方法Value(${minio.endpoint}) private String endpoint; Value(${minio.access-key}) private String accessKey; Value(${minio.secret-key}) private String secretKey; private MinioClient minioClient; PostConstruct public void init() { this.minioClient MinioClient.builder() .endpoint(endpoint) .credentials(accessKey, secretKey) .build(); } public String uploadFile(MultipartFile file, String bucketName) { String objectName UUID.randomUUID().toString().replace(-, ) - file.getOriginalFilename(); try { boolean bucketExists minioClient.bucketExists( BucketExistsArgs.builder().bucket(bucketName).build()); if (!bucketExists) { minioClient.makeBucket( MakeBucketArgs.builder().bucket(bucketName).build()); } minioClient.putObject(PutObjectArgs.builder() .bucket(bucketName) .object(objectName) .stream(file.getInputStream(), file.getSize(), -1) .contentType(file.getContentType()) .build()); return objectName; } catch (Exception e) { throw new BizException(文件上传失败); } }endpoint要区分内网地址和外网地址微服务之间调用走内网前端访问走外网这两个地址如果写错就会出现服务内部能上传成功但图片在浏览器里打不开的情况。文件上传成功后数据库里存的是objectName而不是完整的 URL因为 MinIO 的访问地址可能随着部署环境变化存储完整的 URL 会导致环境迁移后所有图片失效。对象名用 UUID 前缀是为了避免文件名冲突同时也能防止用户通过遍历文件名的方式访问别人上传的内容。文件的访问建议用预签名 URL而不是把桶策略设为公开访问。预签名 URL 是在 URL 上附带签名参数只有拿到这个 URL 的人才能在有效期内访问文件public String getFileUrl(String bucketName, String objectName) { try { return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder() .method(Method.GET) .bucket(bucketName) .object(objectName) .expiry(60 * 60 * 2) .build()); } catch (Exception e) { throw new BizException(文件访问地址生成失败); } }expiry是 URL 的有效期单位是秒2 小时是电商商品图的常规设置。如果做的是永久公开的商品图可以直接用 Nginx 反向代理 MinIO但要注意浏览器缓存设置。文件上传这种操作放在商品服务里会加重它的负担后续量大了可以把上传接口单独拆出一个文件服务MinIO 的 bucket 按用途分开比如product-image、avatar、brand-logo清理和权限管理都方便。4. Docker 容器化部署避坑本地能跑不代表容器里能跑4.1 现象Windows 上 Docker Desktop 显示 virtualization support not detected无法启动这个问题我遇到太多次了尤其是用 Windows 11 的同事第一次装 Docker Desktop启动时报错virtualization support not detected。原因基本都是 BIOS 里的虚拟化功能没开或者 Windows 的 Hyper-V 功能没启用。解决方法是重启电脑进 BIOS找到 Intel Virtualization Technology 或 AMD SVM 并启用然后去控制面板打开「启用或关闭 Windows 功能」勾选 Hyper-V 和 Windows 虚拟机监控程序平台。改完配置必须重启电脑重启之后再启动 Docker Desktop 就不会报这个错了。另外如果你电脑上已经装了 VMware WorkstationDocker Desktop 和它可能会因为虚拟化层冲突起不来常见做法是换用 WSL 2 后端启动速度更快。4.2 现象docker pull minio/minio 一直失败拉不下来MinIO 镜像拉取失败的次数在搭建环境时最高频。原因多数不是 Docker 本身的问题而是镜像仓库连接超时或者镜像源被限流。尤其在网络环境不稳定的时候默认的 Docker Hub 仓库基本拉不动。解决方法是给 Docker 配置国内镜像加速源修改/etc/docker/daemon.json或者 Docker Desktop 的 Docker Engine 配置配置好之后重启 Docker 再拉镜像。MinIO 这个镜像本身不大拉取成功后启动命令要注意官方镜像的入口是minio server /data而且启动时必须设置MINIO_ROOT_USER和MINIO_ROOT_PASSWORD新版 MinIO 不再支持旧的MINIO_ACCESS_KEY和MINIO_SECRET_KEY环境变量了照抄老教程启动会报CredentialsMissingError。services: minio: image: minio/minio:RELEASE.2024-01-16T16-07-38Z container_name: shangpin-minio ports: - 9000:9000 - 9001:9001 environment: MINIO_ROOT_USER: shangpin-admin MINIO_ROOT_PASSWORD: shangpin-secret-2024 command: server /data --console-address :9001 volumes: - ./minio-data:/data9000是 S3 API 端口9001是 Web 控制台端口这两个必须都映射出来。卷挂载到./minio-data是防止容器删除后数据全部丢失这个目录要提前建好并设置好权限否则容器启动可能因为写权限报错。MinIO 启动后访问http://localhost:9001能打开控制台再用 Java 代码上传图片验证 API 是否可用。如果你改了启动账户密码项目里的application.yml也要同步更新不然能连上 MinIO 但是鉴权失败报错信息是The access key ID you provided does not exist。4.3 现象Redis 命令超时报错 nested exception is io.lettuce.core.RedisCommandTimeoutException这个报错在 SpringBoot 集成 Redis 时非常经典特别是用 Docker 部署 Redis 之后应用连接不上 Redis 就会抛这个异常。原因通常是三种Redis 容器没启动、连接地址写错、端口没映射。还有一种容易被忽略的情况是 Redis 容器启动了但应用部署在另一个容器里代码里配置的是localhost:6379这显然连不上。解决方法是先检查 Redis 容器状态再确认应用容器和 Redis 容器是不是在同一个 Docker 网络中。常见做法是在docker-compose.yml中为所有服务定义同一个网络应用配置里的 Redis 地址改成服务名而不是localhost。另外一个排查点是 Redis 的bind配置Docker 里启动 Redis 默认可能只绑定 IPv6 或只监听回环地址启动命令要加--bind 0.0.0.0或者在容器里把配置文件挂载出来。除了连接问题Spring Data Redis 序列化报错也很常见用默认的JdkSerializationRedisSerializer会导致缓存里的 key 和 value 带着乱码前缀redis-desktop-manager 里看到的数据是\xAC\xED\x00\x05t\x00开头的。解决方法是显式配置StringRedisSerializer作为 key 序列化器value 序列化器用Jackson2JsonRedisSerializer或GenericJackson2JsonRedisSerializer这样存进 Redis 的数据可读跨语言也能解析。4.4 现象MySQL 容器丢数据或者 spring 服务连不上数据库Docker 部署 MySQL 最常见的坑就是容器删了之后数据全没了。如果没有挂载数据卷MySQL 的数据文件是写在容器可写层里的容器一删除数据就跟着销毁。做尚品甄选这种项目数据库数据是命根子必须挂载卷。services: mysql: image: mysql:8.0 container_name: shangpin-mysql ports: - 3306:3306 environment: MYSQL_ROOT_PASSWORD: root123456 MYSQL_DATABASE: shangpin_select TZ: Asia/Shanghai command: - --character-set-serverutf8mb4 - --collation-serverutf8mb4_unicode_ci volumes: - ./mysql-data:/var/lib/mysql - ./sql/init.sql:/docker-entrypoint-initdb.d/init.sql:roMYSQL_DATABASE会在首次启动时自动创建数据库./sql/init.sql挂载到docker-entrypoint-initdb.d目录后容器首次启动会自动执行这个 SQL 脚本项目里的建表语句可以放在这里。TZ环境变量必须设否则 MySQL 里的时间会比北京时间早 8 个小时订单表的时间戳会看着非常诡异。mysql-data卷务必要备份不然docker-compose down之后数据就没了这属于血泪经验没有后悔药可以吃。应用连不上 MySQL 时先docker exec进 MySQL 容器里跑一条 SQL确认容器内的数据库是否正常再确认网络和账号权限不要一上来就怀疑代码。5. 项目跑起来之后的验收清单从 es 到 RocketMQ项目能在本地完整跑起来之后先别急着改功能要按下面的清单做一轮验收确认服务之间的依赖都是健康的。第一把三个中间件的状态过一次Rediskeys能不能看到商品缓存MinIO 控制台能不能看到刚才上传的图片MySQL 里订单表的数据和 Redis 扣减后的库存数据是否一致。第二在 Postman 里把整条链路走一遍从后台管理系统添加商品、上传图片到前台商品列表看到该商品再到下单扣库存最后确认库存扣减和订单记录同步生成。第三看日志和监控数据网关、商品服务、订单服务的日志保持连续Nacos 的服务列表里所有服务都是健康状态。这套架构验收通过之后我一般建议继续做四个方向的改造第一个是用 Redisson 替换手写的分布式锁它能自动续期省去锁过期导致业务还没执行完的问题第二个是把商品列表的 Redis 缓存改成 Caffeine 本地缓存加 Redis 两级缓存进一步降低 Redis 压力第三个是给 MinIO 加 Nginx 反向代理文件访问路径更可控也能加一层限流第四个是引入 RocketMQ 做订单超时未支付的延迟消息处理这套电商需求里订单服务就能做状态机流转。这四件事做完整个项目从「能演示」基本就能过渡到「能上线」的工程水准。我自己做微服务项目时有个习惯任何公共组件先写一份最小可跑的 docker-compose 配置再写业务代码。中间件先起来业务代码只是验证连接。这个顺序能避免大量「代码没问题环境没起来」的假故障排查排查时也建议先看中间件日志再看应用日志最后才去翻代码。希望这篇笔记能帮你把尚品甄选这套架构真正跑通少走几段弯路。本文还有配套的精品资源点击获取

相关新闻

Three.js+Vite轻量WebGL教学平台设计与实践

Three.js+Vite轻量WebGL教学平台设计与实践

1. 项目概述:一个面向三维教育场景的轻量级WebGL教学平台“3dschool”这个名字乍一听像某所实体学校的官网,但实际它是一个扎根于浏览器端的三维交互式教学实验平台。我第一次在GitHub上看到这个项目时,第一反应是——这名字起得真准&#xf…

2026/10/8 23:07:23 阅读更多 →
基于YOLOv9实现人体姿态估计:从检测头改造到OKS调优实战

基于YOLOv9实现人体姿态估计:从检测头改造到OKS调优实战

简介:本资源面向计算机视觉方向的研究者、算法工程师与高校学生,提供一套基于YOLOv9实现的人体姿态估计完整项目源码,可用于安全监控、体育分析、人机交互、游戏娱乐及虚拟现实等场景下的关键点检测与动作理解。压缩包共188个文件&#xff0c…

2026/10/8 23:06:52 阅读更多 →
RFSoC RFDC配置实战:ADC混频NCO频率计算与QMC镜像校准

RFSoC RFDC配置实战:ADC混频NCO频率计算与QMC镜像校准

做Zynq UltraScale RFSoC的RF Data Converter IP配置,很多兄弟最头疼的就是两件事:ADC混频器(NCO)的频率字到底怎么算,QMC校准怎么调镜像都压不下去。这两个问题背后,其实是大家对RFDC内部数据通路和配置模…

2026/10/9 0:43:53 阅读更多 →

最新新闻

ABA 问题,一句话

ABA 问题,一句话

地址没变,但里面的东西已经换了一茬,CAS 被骗了。打个比方你桌上放了杯奶茶,你瞅了一眼:是珍珠奶茶 你转身去接个电话。这 5 分钟里:同事把奶茶喝完了,杯子扔了保洁阿姨把杯子捡回来,又倒了杯新…

2026/10/9 2:19:30 阅读更多 →
oneTBB concurrent_unordered_map 观察者(Observers)详解:get_allocator / hash_function / key_eq 的语义与源码实现

oneTBB concurrent_unordered_map 观察者(Observers)详解:get_allocator / hash_function / key_eq 的语义与源码实现

并发编程高性能计算 【免费下载链接】oneTBB oneAPI Threading Building Blocks (oneTBB) 项目地址: https://gitcode.com/gh_mirrors/on/oneTBB 点击查看 免费下载 oneTBB(oneAPI Threading Building Blocks)提供的 oneapi::tbb::concurren…

2026/10/9 2:19:30 阅读更多 →
毕业论文如何用AI提效?全流程实操指南与避坑要点

毕业论文如何用AI提效?全流程实操指南与避坑要点

每年毕业季,我都会被问同一个问题:“毕业论文,怎么写得更快一点?”这两年提问的人还会补一句“用AI行不行”。我的回答一般分成两半——行,但你对它期望越高,越容易翻车。帮人看论文看得多了,我…

2026/10/9 2:19:30 阅读更多 →
Node.js+Vue+ElementUI 搭子社交系统:用 TaoToken 统一 Key 打通聊天与匹配接口

Node.js+Vue+ElementUI 搭子社交系统:用 TaoToken 统一 Key 打通聊天与匹配接口

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 2:19:30 阅读更多 →
动态规划——背包问题

动态规划——背包问题

1、完全平方数Q:给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数&#x…

2026/10/9 2:19:30 阅读更多 →
使用OpenClaw+Skill自动发布微信公众号文章:把settings改到TaoToken的完整配置

使用OpenClaw+Skill自动发布微信公众号文章:把settings改到TaoToken的完整配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 2:18:30 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 13:34:55 阅读更多 →