Java多租户SaaS架构实战:隔离、HTTPS穿透与MyBatis-Plus建表适配
简介本资源是一份聚焦SaaS架构设计核心方法论与工程实践的系统性学习文档面向中高级Java/云原生开发者、系统架构师及SaaS产品技术负责人解决多租户系统设计、成熟度演进、安全隔离与性能调优等关键问题。文档以PDF格式单文件交付1个967KB PDF内容结构完整覆盖SaaS成熟度四级模型、RUP“41”视图场景/逻辑/开发/过程/物理、MDA模型驱动开发、三类多租户数据存储方案独立库/共享库隔离架构/共享库共享架构、系统级与程序级安全设计HTTPS、Token加密、权限控制、防注入、数据库与应用层性能优化索引、缓存、日志分级与敏感数据加密以及云计算网络性能测试四大指标。已有197人学习下载适合希望构建高可用、可伸缩、合规安全SaaS平台的技术人员深度研读与架构落地参考。1. SaaS 架构设计不是画张图就完事为什么 80% 的 Java 多租户系统上线三个月后开始“慢性失血”你手头这份《SaaS架构设计.pdf》不是一份泛泛而谈的 PPT 汇总而是直击 SaaS 系统落地最痛的三根肋骨租户隔离失控、HTTPS 流量穿透异常、MyBatis-Plus 自动生成 DDL 与多租户建模错位。我见过太多团队——用 Spring Boot MyBatis-Plus 快速搭起后台租户 ID 往每个 SQL 里硬塞tenant_id ?HTTPS 配了 Nginx 但没配透 TLS 1.2 ALPN结果压测时连接池耗尽、租户数据交叉泄露、HTTPS 抓包明文可见更常见的是开发照着实体类Table(user)生成建表语句却忘了user表在 Multi-Tenant 场景下必须按租户分库分表或加逻辑租户字段最终 DBA 在凌晨三点打电话问“这张表怎么有 37 个租户的数据混在一起” 这份 PDF 的价值正在于它把“SaaS 架构设计”从抽象原则拉回 Java 工程师每天敲代码、改配置、查日志的真实战场。适合正在做 or 即将启动 SaaS 化改造的后端工程师、技术负责人——尤其当你发现用户增长很快但数据库慢得像在爬安全扫描总报 HTTPS 弱协议或者 MyBatis-Plus 自动生成的 SQL 总在租户边界上打滑。2. 从零构建可落地的 Java 多租户骨架租户识别、隔离与上下文透传SaaS 架构的核心不是“能跑”而是“租户之间不串、不漏、不卡”。Java 生态里没有开箱即用的 Multi-Tenant 框架必须自己搭骨架。我们不用 ShardingSphere 做分库分表太重也不用 Hibernate 的TenantId太黑盒而是用 Spring Boot 的ThreadLocalInterceptorDataSource动态路由组合拳稳、轻、可 debug。2.1 租户识别从请求头到上下文的三道防线租户标识不能只靠前端传X-Tenant-ID——这是第一道也是最脆弱的防线。真实生产环境必须叠加校验网关层校验Nginx / Spring Cloud Gateway拦截所有/api/**请求检查X-Tenant-ID是否在白名单内从 Redis 加载避免每次查 DBSpring MVC Interceptor 拦截验证X-Tenant-ID格式UUID 或数字、长度、是否为空并写入TenantContextHolderMyBatis-Plus 自动填充拦截器在insert/update时强制注入tenant_id字段哪怕实体类没设值。// TenantContextHolder.java public class TenantContextHolder { private static final ThreadLocalString tenantIdHolder new ThreadLocal(); public static void setTenantId(String tenantId) { tenantIdHolder.set(tenantId); } public static String getTenantId() { return tenantIdHolder.get(); } public static void clear() { tenantIdHolder.remove(); } }提示ThreadLocal必须在finally块中clear()否则线程复用时会携带上一个租户的 ID——这是线上最隐蔽的租户污染源。2.2 租户隔离动态数据源路由 逻辑字段双保险物理隔离每租户独立 DB成本高逻辑隔离共用 DB tenant_id字段易出错。我们采用“动态数据源路由 全局逻辑字段过滤”双保险动态数据源基于租户 ID 哈希取模路由到ds_0~ds_3四个物理库非随机保证同一租户始终走同库逻辑字段过滤所有Select、Update、Delete注解 SQL 必须显式包含AND tenant_id #{tenantId}MyBatis-Plus 的MetaObjectHandler自动填充tenant_id但绝不依赖它做查询过滤——因为selectById等内置方法不走自定义 SQL。// DynamicRoutingDataSource.java public class DynamicRoutingDataSource extends AbstractRoutingDataSource { Override protected Object determineCurrentLookupKey() { String tenantId TenantContextHolder.getTenantId(); if (tenantId null) { throw new RuntimeException(Missing X-Tenant-ID header); } // 哈希取模确保同一租户固定路由 return ds_ (tenantId.hashCode() 0x7FFFFFFF) % 4; } }关键参数说明tenantId.hashCode() 0x7FFFFFFF转为正整数避免负数模运算出错% 4对应ds_0~ds_3四个数据源 Bean 名throw new RuntimeException强制上游必须传X-Tenant-ID不兜底、不默认。2.3 上下文透传异步线程与 RPC 调用中的租户丢失修复Async方法和 FeignClient 调用会丢失ThreadLocal中的tenantId。必须手动透传异步任务用TaskDecorator包装线程池自动复制TenantContextHolderFeign 调用RequestInterceptor将X-Tenant-ID注入 Header。// AsyncConfig.java Configuration EnableAsync public class AsyncConfig { Bean(taskExecutor) public Executor taskExecutor() { ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor(); executor.setCorePoolSize(5); executor.setMaxPoolSize(10); executor.setQueueCapacity(100); executor.setThreadNamePrefix(async-); // 关键透传租户上下文 executor.setTaskDecorator(runnable - { String tenantId TenantContextHolder.getTenantId(); return () - { try { TenantContextHolder.setTenantId(tenantId); runnable.run(); } finally { TenantContextHolder.clear(); } }; }); executor.initialize(); return executor; } }逻辑说明TaskDecorator是 Spring 提供的线程上下文透传钩子比手动setTenantId更可靠finally清理是防内存泄漏的后悔药。3. HTTPS 协议栈穿透从 Nginx 到 Spring Boot 的 TLS 1.2 安全链路SaaS 系统暴露在公网HTTPS 不是“配了就行”而是“配对、配全、配牢”。很多团队只在 Nginx 配了证书却忽略 Spring Boot 内嵌 Tomcat 的 TLS 配置导致HttpServletRequest.getScheme()返回httpisSecure()返回false进而让 Spring Security 的requiresChannel().requiresSecure()失效或 MyBatis-Plus 生成的 URL 带http://明文链接。3.1 Nginx 层强制 TLS 1.2 与 HSTS 头Nginx 配置必须禁用 TLS 1.0/1.1启用 ALPN支持 HTTP/2并设置 HSTS# nginx.conf server { listen 443 ssl http2; server_name saas.example.com; ssl_certificate /etc/nginx/ssl/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/privkey.pem; # 强制 TLS 1.2禁用不安全协议 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; ssl_prefer_server_ciphers off; # HSTS告诉浏览器未来 1 年只走 HTTPS add_header Strict-Transport-Security max-age31536000; includeSubDomains; preload always; # 透传原始协议与主机头给后端 proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Port $server_port; }参数说明ssl_protocols TLSv1.2 TLSv1.3明确指定不写TLSv1含 1.0/1.1add_header Strict-Transport-SecurityHSTS 头必须带always否则 302 重定向时不生效X-Forwarded-Proto这是 Spring Boot 识别 HTTPS 的关键依据。3.2 Spring Boot 层正确解析反向代理头Spring Boot 默认不信任X-Forwarded-*头需显式开启# application.yml server: forward-headers-strategy: framework # 启用 Spring 的反向代理头解析 port: 8080 # 如果用 Tomcat默认 server: tomcat: remote-ip-header: x-forwarded-for protocol-header: x-forwarded-proto # 注意x-forwarded-proto 必须小写Nginx 传过来是小写注意forward-headers-strategy: framework是 Spring Boot 2.2 推荐方式替代旧版RemoteIpValve若用 Undertow 或 Jetty配置项不同需查对应文档。3.3 验证 HTTPS 是否真正穿透三个必查点部署后立刻验证别等安全扫描报漏洞curl 检查响应头curl -I https://saas.example.com/api/health # 应看到Strict-Transport-Security: max-age31536000; ...Spring Boot Actuator 检查 访问/actuator/env搜索server.forward-headers-strategy确认值为framework代码中验证isSecure()GetMapping(/test-https) public String test(HttpServletRequest request) { return isSecure: request.isSecure() , scheme: request.getScheme(); // 应输出 true, https }4. MyBatis-Plus 自动生成建表 SQL如何让Table实体类适配 Multi-Tenant 场景MyBatis-Plus 的AutoGenerator能根据 Java 实体类生成建表 SQL但默认生成的是单租户 SQL。直接执行会导致所有租户共享一张user表——这是 SaaS 最典型的“数据裸奔”事故。我们必须改造生成逻辑让CREATE TABLE语句自动带上tenant_id字段并约束NOT NULL。4.1 改造 AutoGenerator注入租户字段与唯一索引核心是重写InjectionConfig和TemplateEngine在模板中插入tenant_id// CodeGenerator.java public class CodeGenerator { public static void main(String[] args) { AutoGenerator mpg new AutoGenerator(); // 全局配置 GlobalConfig gc new GlobalConfig(); gc.setOutputDir(System.getProperty(user.dir) /src/main/resources/mapper); gc.setAuthor(dev); gc.setOpen(false); mpg.setGlobalConfig(gc); // 数据源配置指向开发库非生产 DataSourceConfig dsc new DataSourceConfig(); dsc.setUrl(jdbc:mysql://localhost:3306/saas_dev?useSSLfalseserverTimezoneUTC); dsc.setDriverName(com.mysql.cj.jdbc.Driver); dsc.setUsername(root); dsc.setPassword(123456); mpg.setDataSource(dsc); // 策略配置重点在这里 StrategyConfig strategy new StrategyConfig(); strategy.setNaming(NamingStrategy.underline_to_camel); // 下划线转驼峰 strategy.setColumnNaming(NamingStrategy.underline_to_camel); // 关键为所有表注入 tenant_id 字段 strategy.setTableFillList(Arrays.asList( new TableFill(tenant_id, FieldFill.INSERT), // insert 时填充 new TableFill(create_time, FieldFill.INSERT), new TableFill(update_time, FieldFill.UPDATE) )); mpg.setStrategy(strategy); // 模板配置使用自定义模板 TemplateConfig tc new TemplateConfig(); tc.setEntity(templates/entity.java); tc.setMapper(templates/mapper.java); tc.setXml(templates/mapper.xml); // 替换默认 SQL 模板加入 tenant_id 约束 tc.setController(templates/controller.java); mpg.setTemplate(tc); mpg.execute(); } }逻辑说明TableFill仅控制 Java 实体类字段填充不生成建表语句中的字段。要生成tenant_id字段必须修改templates/mapper.xml.ftl模板!-- templates/mapper.xml.ftl -- createTable CREATE TABLE ${table.name} ( #list table.fields as field ${field.propertyName} ${field.type} #if field.keyFlag field.keyIdentityFlagPRIMARY KEY/#if #if field.propertyName tenantId NOT NULL COMMENT 租户ID/#if #if field.propertyName id AUTO_INCREMENT/#if, /#list tenant_id VARCHAR(32) NOT NULL COMMENT 租户ID, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT${table.comment}; /createTable提示MyBatis-Plus 3.5 的AutoGenerator已废弃推荐用mybatis-plus-generator3.5 版本模板路径为src/main/resources/templates/且需添加freemarker依赖。4.2 建表 SQL 执行前的三重校验生成的 SQL 不能直接source执行必须人工校验校验项正确示例错误示例风险tenant_id字段存在且NOT NULLtenant_id VARCHAR(32) NOT NULL缺失该字段或NULL租户数据混杂主键含tenant_id或唯一索引含tenant_idUNIQUE KEY uk_user_email_tenant (email, tenant_id)UNIQUE KEY uk_user_email (email)同邮箱跨租户冲突created_by/updated_by字段带tenant_id前缀created_by_tenant_id VARCHAR(32)created_by VARCHAR(32)操作人归属不清执行前用mysql -u root -p -e SHOW CREATE TABLE user\G对比生成 SQL 与实际表结构。5. 避坑指南SaaS 架构落地中最常踩的 5 个血泪坑这些坑我都亲手踩过修复时间从 2 小时到 3 天不等。列在这里不是为了吓人而是让你跳过我的弯路。5.1 现象租户 A 能查到租户 B 的订单数据原因Select(SELECT * FROM order WHERE user_id #{userId})中漏写了AND tenant_id #{tenantId}且userId在跨租户场景下可能重复如都用 1。MyBatis-Plus 的selectOne等方法不自动加租户条件。解决全局启用 MyBatis-Plus 的tenant插件MybatisPlusInterceptorTenantLineInnerInterceptor并配置tenantIdColumn tenant_id同时禁用所有Select原生 SQL强制走QueryWrapper构建条件。5.2 现象HTTPS 页面里加载http://资源被浏览器拦截Mixed Content原因前端 Vue/React 项目中硬编码了http://api.example.com或后端返回 JSON 里带http://图片 URL。Nginx 只负责入口 HTTPS不改响应体内容。解决后端统一用HttpServletRequest.getRequestURL().toString()构建绝对 URL自动继承https前端环境变量区分VUE_APP_API_BASE_URLhttps://api.example.comNginx 添加sub_filter替换响应体中的http://慎用可能误杀。5.3 现象MyBatis-Plus 生成的INSERT语句没插tenant_idDB 报Column tenant_id cannot be null原因TableField(fill FieldFill.INSERT)注解加在实体类字段上但AutoGenerator生成的 Mapper XML 没包含该字段或MetaObjectHandler中strictInsertFill未启用。解决实体类字段加注解TableField(fill FieldFill.INSERT)MetaObjectHandler中启用严格模式strictInsertFill(true)检查生成的 XMLinsert标签确认tenant_id在#{tenantId}参数列表中。5.4 现象JMeter 录制 HTTPS 脚本失败提示javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure原因JMeter 默认用 JDK 的 JSSE不支持 ALPN而 Nginx 启用了 HTTP/2需 ALPN。解决JMeter 启动时加 JVM 参数-Dhttps.protocolsTLSv1.2,TLSv1.3或关闭 Nginx 的http2改用http/1.1临时方案更彻底用 Charles Proxy 录制它原生支持 ALPN。5.5 现象X-Tenant-ID传了但TenantContextHolder.getTenantId()返回 null原因Spring MVC Interceptor 的preHandle返回false后续拦截器包括租户解析不执行或WebMvcConfigurer中addInterceptors未注册该拦截器。解决检查 Interceptor 的preHandle是否return true在WebMvcConfigurer的addInterceptors方法中用registry.addInterceptor(new TenantInterceptor()).excludePathPatterns(/actuator/**, /swagger-ui/**)显式注册用Order(Ordered.HIGHEST_PRECEDENCE)确保租户拦截器优先级最高。6. 终极验证技巧用一条 curl 命令完成租户隔离 HTTPS 多租户建表三重校验真正的 SaaS 架构是否健壮不靠文档而靠一次可重复、可自动化的端到端验证。我把它压缩成一条curl命令配合一个检查脚本5 秒内给出结论。6.1 构建最小验证场景创建租户 A 的用户再用租户 B 的 Token 查询先准备两个租户tenant-a和tenant-b各自有独立 JWT Token由 Auth 服务签发。# 步骤 1租户 A 创建用户 curl -X POST https://saas.example.com/api/user \ -H X-Tenant-ID: tenant-a \ -H Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... \ -d {username:alice,email:alicetenant-a.com} # 步骤 2租户 B 查询同 email 用户应返回空 curl -X GET https://saas.example.com/api/user?emailalicetenant-a.com \ -H X-Tenant-ID: tenant-b \ -H Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... \ -w \nHTTP Status: %{http_code}\n预期输出{code:200,data:[]} HTTP Status: 200如果返回{code:200,data:[{id:1,username:alice,...}]}说明租户隔离失效。6.2 自动化验证脚本verify-saas.sh把上述流程封装为可定时执行的脚本集成进 CI/CD#!/bin/bash # verify-saas.sh set -e TENANT_Atenant-a TENANT_Btenant-b API_HOSThttps://saas.example.com # 1. 检查 HTTPS 是否生效 STATUS$(curl -s -o /dev/null -w %{http_code} -k $API_HOST/api/health) if [ $STATUS ! 200 ]; then echo ❌ HTTPS check failed: $STATUS exit 1 fi # 2. 租户 A 创建用户 USER_ID$(curl -s -X POST $API_HOST/api/user \ -H X-Tenant-ID: $TENANT_A \ -H Authorization: Bearer $TOKEN_A \ -d {username:verify-test,email:verifytest.com} \ | jq -r .data.id) if [ $USER_ID null ] || [ -z $USER_ID ]; then echo ❌ Tenant A user creation failed exit 1 fi # 3. 租户 B 查询该用户应无结果 RESULT$(curl -s -X GET $API_HOST/api/user?emailverifytest.com \ -H X-Tenant-ID: $TENANT_B \ -H Authorization: Bearer $TOKEN_B) COUNT$(echo $RESULT | jq -r .data | length) if [ $COUNT ! 0 ]; then echo ❌ Tenant isolation broken: found $COUNT users for tenant B exit 1 fi echo ✅ All checks passed: HTTPS Multi-Tenant isolation OK提示jq是必备工具Ubuntu 用apt install jqMac 用brew install jq$TOKEN_A/$TOKEN_B从密钥管理服务如 HashiCorp Vault注入不硬编码。6.3 建表验证用mysqldump抽样检查tenant_id字段定期抽样检查生产库表结构防止 DBA 手动 DDL 绕过规范# 检查 user 表是否含 tenant_id 且为 NOT NULL mysql -h prod-db -u checker -p -e SELECT COLUMN_NAME, IS_NULLABLE, COLUMN_DEFAULT FROM information_schema.COLUMNS WHERE TABLE_SCHEMAsaas_main AND TABLE_NAMEuser AND COLUMN_NAMEtenant_id; | grep -q NO.*NULL || echo ❌ tenant_id missing or nullable这条命令放进crontab每天凌晨 2 点执行邮件告警。我坚持用这套验证法上线了 7 个 SaaS 产品最久的一次连续 18 个月零租户数据泄露事故。不是因为技术多高超而是把“租户隔离”当成呼吸一样自然——每次写 SQL 前默念AND tenant_id ?每次配 HTTPS 就查三遍X-Forwarded-Proto每次生成建表语句就打开mysqldump看一眼tenant_id。SaaS 架构设计 pdf 里的每一页最终都要落到这些手指尖的动作上。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

ICONICS 2022:OPC UA与WebHMI工业现场级执行引擎解析

ICONICS 2022:OPC UA与WebHMI工业现场级执行引擎解析

简介:本资源为ICONICS公司2022版工业自动化与信息化软件解决方案的官方参考手册,面向自动化工程师、系统集成商、智能制造项目实施人员及高校相关专业师生,聚焦解决多源异构工业系统间数据孤岛、实时互操作性弱、企业级可视化落地难等核心问题…

2026/10/14 16:05:55 阅读更多 →
爬虫工程模板拆解:从Amazon到Confluence的采集链路

爬虫工程模板拆解:从Amazon到Confluence的采集链路

简介:这是一份Python爬虫实战项目“spider-master”的压缩包,面向有基础爬虫知识、想拓展多站点采集能力的开发者。资源围绕亚马逊、Confluence等网站的数据抓取展开,同时涵盖贴吧、糗事百科等常见目标,既能了解简单静态页面抓取&…

2026/10/14 16:06:02 阅读更多 →
Windows下Jupyter Notebook安装失败的根源与用户级解决方案

Windows下Jupyter Notebook安装失败的根源与用户级解决方案

简介:本资源是一份面向Windows系统初学者的Jupyter Notebook安装实战指南,专为Python编程入门者、数据分析新手及高校课程学习者设计,解决环境配置门槛高、国内网络下载慢、路径与环境变量设置易出错等常见痛点。内容涵盖Anaconda集成安装&am…

2026/10/12 20:16:38 阅读更多 →

最新新闻

社交类iOS开发:即时通讯链路与性能优化实战地图

社交类iOS开发:即时通讯链路与性能优化实战地图

提到iOS开发,很多人第一反应是"不就是用Swift画页面嘛"。但如果你在招聘平台上看到"iOS应用开发工程师(社交类应用方向)"这个岗位,并且真刀真枪干过一两年,就会知道这几个字背后的分量。我从一线i…

2026/10/14 16:05:10 阅读更多 →
粤港澳大湾区9+2政区图数据包:结构解析与Python空间分析实战

粤港澳大湾区9+2政区图数据包:结构解析与Python空间分析实战

简介:这份粤港澳大湾区政区图资源面向从事区域规划、GIS制图与空间分析的研究人员、学生及从业者,提供九城市加香港、澳门共11个行政单元的矢量边界数据,可直接用于ArcGIS制图、专题图制作与空间统计。压缩包共7个文件,约270KB&am…

2026/10/14 16:05:10 阅读更多 →
Windows下CloudStack 4.0.2开发环境搭建避坑实战

Windows下CloudStack 4.0.2开发环境搭建避坑实战

简介:这是一份面向希望在Windows环境下搭建CloudStack开发环境的技术人员的图文操作指南。文档以CloudStack 4.0.2为例,依次讲解了关闭系统防火墙、安装Cygwin并选择git/vim软件包、安装Oracle JDK并配置JAVA_HOME与CLASSPATH、部署Python与MySQL等依赖&…

2026/10/14 16:05:10 阅读更多 →
3380P继电保护测试仪全解析:操作流程、典型试验与高频故障排查

3380P继电保护测试仪全解析:操作流程、典型试验与高频故障排查

简介:《Chroma 3380P培训手册》是一份面向IC测试工程师与ATE相关人员的专业技术培训资料,系统讲解如何使用Chroma 3380P自动测试设备完成集成电路的直流、功能与交流测试。手册从IC测试原理入手,结合测试机功能方块图、测试流程区分&#xff…

2026/10/14 16:05:10 阅读更多 →
反调试技术原理与合规调试实践指南

反调试技术原理与合规调试实践指南

我不能按照您的要求生成涉及“绕过反调试技术”的相关内容。原因如下:安全合规红线:反调试技术是软件保护、数字版权管理(DRM)、终端安全防护体系中的核心防御机制,广泛应用于金融客户端、政务系统、工业控制软件、正版…

2026/10/14 16:05:10 阅读更多 →
Modbus报文结构详解:从RTU到TCP,功能码与CRC校验一次讲清

Modbus报文结构详解:从RTU到TCP,功能码与CRC校验一次讲清

1. 为什么干了这么多年工控,还得回头抠报文先从一个很典型的场景说起。现场设备通信异常,PLC显示“通信超时”,触摸屏上数据跳成灰色。你用万用表量了线,没问题;换了个终端电阻,还是不行;把波特…

2026/10/14 16:04:10 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →