Java度量衡换算器:从基础实现到设计模式应用
1. Java度量衡换算器项目概述在编程学习过程中度量衡换算器是一个经典且实用的练手项目。这个Java实现的度量衡换算器不仅能帮助初学者掌握基础语法还能深入理解面向对象编程思想。我最初接触这个项目是在大学二年级的Java课程设计中当时用简单的switch-case结构实现了基本功能。随着编程经验的积累我逐步重构了代码结构加入了更多实用特性。度量衡换算器本质上是一个单位转换工具它能处理长度、重量、温度等常见物理量的相互转换。比如将英寸转换为厘米、磅转换为千克、华氏度转换为摄氏度等。这类工具在日常生活中非常实用特别是对于需要频繁进行单位换算的工程师、科研人员和学生群体。2. 项目核心功能设计2.1 功能模块划分一个完整的度量衡换算器通常包含以下核心模块用户界面模块负责与用户交互接收输入并展示结果转换逻辑模块包含各种单位的转换算法数据验证模块确保用户输入的有效性历史记录模块保存用户查询记录我建议采用MVCModel-View-Controller架构来组织代码这样可以使项目结构更清晰便于后期扩展。Model层处理数据转换逻辑View层负责用户界面Controller层协调两者交互。2.2 单位转换算法实现不同度量衡之间的转换需要精确的数学公式。以下是几个常见转换的算法实现// 长度单位转换 public static double convertLength(double value, String fromUnit, String toUnit) { // 先将所有单位转换为基准单位米 double inMeters switch(fromUnit) { case inch - value * 0.0254; case foot - value * 0.3048; case yard - value * 0.9144; case mile - value * 1609.344; case mm - value / 1000; case cm - value / 100; case km - value * 1000; default - value; // 默认为米 }; // 再从基准单位转换为目标单位 return switch(toUnit) { case inch - inMeters / 0.0254; case foot - inMeters / 0.3048; case yard - inMeters / 0.9144; case mile - inMeters / 1609.344; case mm - inMeters * 1000; case cm - inMeters * 100; case km - inMeters / 1000; default - inMeters; // 默认为米 }; }温度转换相对特殊因为不同温标之间不是简单的线性关系// 温度单位转换 public static double convertTemperature(double value, String fromUnit, String toUnit) { if(fromUnit.equals(toUnit)) return value; // 先转换为摄氏度 double inCelsius switch(fromUnit) { case F - (value - 32) * 5 / 9; // 华氏转摄氏 case K - value - 273.15; // 开尔文转摄氏 default - value; // 默认为摄氏 }; // 再从摄氏度转换为目标单位 return switch(toUnit) { case F - inCelsius * 9 / 5 32; // 摄氏转华氏 case K - inCelsius 273.15; // 摄氏转开尔文 default - inCelsius; // 默认为摄氏 }; }3. 面向对象设计实践3.1 类结构设计良好的类设计是项目可维护性的关键。我建议采用以下类结构// 单位转换器接口 public interface UnitConverter { double convert(double value, String fromUnit, String toUnit); String[] getSupportedUnits(); } // 具体转换器实现 public class LengthConverter implements UnitConverter { // 实现长度单位转换 Override public double convert(double value, String fromUnit, String toUnit) { // 具体实现... } Override public String[] getSupportedUnits() { return new String[]{mm, cm, m, km, inch, foot, yard, mile}; } } // 转换器工厂 public class ConverterFactory { public static UnitConverter getConverter(String type) { return switch(type.toLowerCase()) { case length - new LengthConverter(); case weight - new WeightConverter(); case temperature - new TemperatureConverter(); default - throw new IllegalArgumentException(不支持的转换类型); }; } }3.2 使用设计模式提升代码质量在项目中应用适当的设计模式可以显著提高代码的可扩展性和可维护性工厂模式用于创建不同类型的转换器实例策略模式将不同单位的转换算法封装为独立策略装饰器模式可以为转换器添加额外功能如日志记录、缓存等// 装饰器示例为转换器添加日志功能 public class LoggingConverterDecorator implements UnitConverter { private final UnitConverter decoratedConverter; public LoggingConverterDecorator(UnitConverter converter) { this.decoratedConverter converter; } Override public double convert(double value, String fromUnit, String toUnit) { System.out.printf(转换请求: %.2f %s → %s%n, value, fromUnit, toUnit); double result decoratedConverter.convert(value, fromUnit, toUnit); System.out.printf(转换结果: %.2f %s%n, result, toUnit); return result; } Override public String[] getSupportedUnits() { return decoratedConverter.getSupportedUnits(); } }4. 用户界面实现4.1 控制台界面对于初学者可以先实现一个简单的控制台界面public class ConsoleUI { private static final Scanner scanner new Scanner(System.in); public static void main(String[] args) { System.out.println( 度量衡换算器 ); System.out.println(1. 长度换算); System.out.println(2. 重量换算); System.out.println(3. 温度换算); System.out.print(请选择换算类型: ); int choice scanner.nextInt(); scanner.nextLine(); // 消耗换行符 UnitConverter converter switch(choice) { case 1 - ConverterFactory.getConverter(length); case 2 - ConverterFactory.getConverter(weight); case 3 - ConverterFactory.getConverter(temperature); default - throw new IllegalArgumentException(无效选择); }; System.out.println(支持的单位: String.join(, , converter.getSupportedUnits())); System.out.print(输入数值: ); double value scanner.nextDouble(); scanner.nextLine(); System.out.print(输入原单位: ); String fromUnit scanner.nextLine(); System.out.print(输入目标单位: ); String toUnit scanner.nextLine(); double result converter.convert(value, fromUnit, toUnit); System.out.printf(转换结果: %.2f %s %.2f %s%n, value, fromUnit, result, toUnit); } }4.2 Swing图形界面对于更友好的用户体验可以使用Swing实现图形界面public class ConverterGUI extends JFrame { private final JComboBoxString typeCombo new JComboBox(new String[]{长度, 重量, 温度}); private final JComboBoxString fromUnitCombo new JComboBox(); private final JComboBoxString toUnitCombo new JComboBox(); private final JTextField valueField new JTextField(10); private final JLabel resultLabel new JLabel(结果将显示在这里); public ConverterGUI() { super(度量衡换算器); setLayout(new GridLayout(5, 2, 10, 10)); // 添加组件 add(new JLabel(换算类型:)); add(typeCombo); add(new JLabel(原单位:)); add(fromUnitCombo); add(new JLabel(目标单位:)); add(toUnitCombo); add(new JLabel(数值:)); add(valueField); add(new JLabel(结果:)); add(resultLabel); // 添加转换按钮 JButton convertButton new JButton(转换); convertButton.addActionListener(this::performConversion); add(convertButton); // 类型选择变化时更新单位列表 typeCombo.addActionListener(e - updateUnitCombos()); updateUnitCombos(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setLocationRelativeTo(null); } private void updateUnitCombos() { String type (String) typeCombo.getSelectedItem(); UnitConverter converter ConverterFactory.getConverter(type); String[] units converter.getSupportedUnits(); fromUnitCombo.setModel(new DefaultComboBoxModel(units)); toUnitCombo.setModel(new DefaultComboBoxModel(units)); } private void performConversion(ActionEvent e) { try { String type (String) typeCombo.getSelectedItem(); double value Double.parseDouble(valueField.getText()); String fromUnit (String) fromUnitCombo.getSelectedItem(); String toUnit (String) toUnitCombo.getSelectedItem(); UnitConverter converter ConverterFactory.getConverter(type); double result converter.convert(value, fromUnit, toUnit); resultLabel.setText(String.format(%.2f %s %.2f %s, value, fromUnit, result, toUnit)); } catch (NumberFormatException ex) { resultLabel.setText(请输入有效的数值); } catch (Exception ex) { resultLabel.setText(转换错误: ex.getMessage()); } } public static void main(String[] args) { SwingUtilities.invokeLater(() - new ConverterGUI().setVisible(true)); } }5. 高级功能实现5.1 单位系统扩展为了使换算器更实用可以添加更多单位系统// 面积单位转换 public class AreaConverter implements UnitConverter { private static final MapString, Double TO_SQUARE_METERS Map.of( mm², 0.000001, cm², 0.0001, m², 1.0, km², 1000000.0, inch², 0.00064516, foot², 0.092903, yard², 0.836127, acre, 4046.86, hectare, 10000.0 ); Override public double convert(double value, String fromUnit, String toUnit) { if(!TO_SQUARE_METERS.containsKey(fromUnit) || !TO_SQUARE_METERS.containsKey(toUnit)) { throw new IllegalArgumentException(不支持的单位); } double inSquareMeters value * TO_SQUARE_METERS.get(fromUnit); return inSquareMeters / TO_SQUARE_METERS.get(toUnit); } Override public String[] getSupportedUnits() { return TO_SQUARE_METERS.keySet().toArray(new String[0]); } }5.2 历史记录功能添加历史记录功能可以提升用户体验public class ConversionHistory { private static final ListConversionRecord records new ArrayList(); private static final int MAX_RECORDS 50; public static void addRecord(double value, String fromUnit, String toUnit, double result) { records.add(0, new ConversionRecord(value, fromUnit, toUnit, result, LocalDateTime.now())); if(records.size() MAX_RECORDS) { records.remove(records.size() - 1); } } public static ListConversionRecord getRecentRecords(int count) { return records.stream().limit(count).collect(Collectors.toList()); } public static class ConversionRecord { private final double originalValue; private final String fromUnit; private final String toUnit; private final double result; private final LocalDateTime timestamp; // 构造函数、getter方法等... } }5.3 配置文件支持使用配置文件管理支持的转换类型和单位# converters.properties length.unitsmm,cm,m,km,inch,foot,yard,mile length.convertercom.example.LengthConverter weight.unitsmg,g,kg,ton,ounce,pound,stone weight.convertercom.example.WeightConverter temperature.unitsC,F,K temperature.convertercom.example.TemperatureConverter然后修改ConverterFactory从配置文件加载public class ConverterFactory { private static final Properties CONFIG new Properties(); static { try (InputStream input ConverterFactory.class.getResourceAsStream(/converters.properties)) { CONFIG.load(input); } catch (IOException e) { throw new RuntimeException(加载配置文件失败, e); } } public static UnitConverter getConverter(String type) { String className CONFIG.getProperty(type .converter); try { return (UnitConverter) Class.forName(className).getDeclaredConstructor().newInstance(); } catch (Exception e) { throw new IllegalArgumentException(无法创建转换器: type, e); } } public static String[] getSupportedUnits(String type) { String units CONFIG.getProperty(type .units); return units null ? new String[0] : units.split(,); } }6. 测试与质量保证6.1 单元测试编写全面的单元测试确保转换准确性class LengthConverterTest { private static final LengthConverter converter new LengthConverter(); Test void testInchToCm() { assertEquals(2.54, converter.convert(1, inch, cm), 0.0001); } Test void testMileToKm() { assertEquals(1.60934, converter.convert(1, mile, km), 0.0001); } Test void testSameUnit() { assertEquals(100, converter.convert(100, cm, cm), 0.0001); } Test void testInvalidUnit() { assertThrows(IllegalArgumentException.class, () - converter.convert(1, invalid, cm)); } }6.2 边界条件测试特别注意边界条件和异常情况Test void testZeroValue() { assertEquals(0, converter.convert(0, inch, cm), 0.0); } Test void testNegativeValue() { assertEquals(-2.54, converter.convert(-1, inch, cm), 0.0001); } Test void testExtremeValue() { assertEquals(Double.POSITIVE_INFINITY, converter.convert(Double.MAX_VALUE, km, mm)); }6.3 性能测试对于频繁使用的换算器性能也很重要Test void testConversionPerformance() { int iterations 1_000_000; long startTime System.nanoTime(); for(int i 0; i iterations; i) { converter.convert(i, inch, cm); } long duration System.nanoTime() - startTime; double avgTime duration / (double)iterations; System.out.printf(平均转换时间: %.3f ns%n, avgTime); assertTrue(avgTime 1000, 转换时间过长); }7. 项目部署与打包7.1 使用Maven构建创建标准的Maven项目结构!-- pom.xml -- project modelVersion4.0.0/modelVersion groupIdcom.example/groupId artifactIdunit-converter/artifactId version1.0.0/version dependencies dependency groupIdorg.junit.jupiter/groupId artifactIdjunit-jupiter/artifactId version5.8.2/version scopetest/scope /dependency /dependencies build plugins plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-compiler-plugin/artifactId version3.8.1/version configuration source17/source target17/target /configuration /plugin plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-assembly-plugin/artifactId version3.3.0/version configuration descriptorRefs descriptorRefjar-with-dependencies/descriptorRef /descriptorRefs archive manifest mainClasscom.example.ConverterGUI/mainClass /manifest /archive /configuration executions execution phasepackage/phase goals goalsingle/goal /goals /execution /executions /plugin /plugins /build /project7.2 创建可执行JAR使用Maven Assembly插件创建包含所有依赖的可执行JARmvn clean package这将生成两个JAR文件unit-converter-1.0.0.jar - 不包含依赖unit-converter-1.0.0-jar-with-dependencies.jar - 包含所有依赖的可执行JAR运行程序java -jar target/unit-converter-1.0.0-jar-with-dependencies.jar7.3 使用JPackage创建原生安装包对于更专业的分发可以使用JDK14的jpackage工具jpackage --name UnitConverter --input target/ \ --main-jar unit-converter-1.0.0-jar-with-dependencies.jar \ --main-class com.example.ConverterGUI \ --type app-image --dest dist这将创建一个包含JRE的独立应用程序可以直接分发给最终用户。8. 项目优化与扩展思路8.1 性能优化缓存频繁使用的转换结果对于相同的转换请求可以直接返回缓存结果预计算转换因子避免每次转换都进行完整计算使用更高效的数据结构如EnumMap替代HashMap存储单位转换因子// 缓存实现示例 public class CachedConverter implements UnitConverter { private final UnitConverter delegate; private final MapString, Double cache new ConcurrentHashMap(); public CachedConverter(UnitConverter delegate) { this.delegate delegate; } Override public double convert(double value, String fromUnit, String toUnit) { String cacheKey fromUnit - toUnit : value; return cache.computeIfAbsent(cacheKey, k - delegate.convert(value, fromUnit, toUnit)); } Override public String[] getSupportedUnits() { return delegate.getSupportedUnits(); } }8.2 功能扩展添加更多单位系统如体积、速度、数据存储等单位支持自定义单位允许用户定义自己的单位转换关系添加货币换算功能集成实时汇率API开发移动端应用将核心逻辑移植到Android平台添加语音输入输出集成语音识别和合成功能8.3 国际化支持多语言界面使用ResourceBundle支持不同语言本地化单位系统根据不同地区显示习惯单位地区特定单位如中国的市斤、日本的坪等// 国际化示例 public class I18n { private static ResourceBundle messages; static { Locale locale Locale.getDefault(); messages ResourceBundle.getBundle(MessagesBundle, locale); } public static String getString(String key) { return messages.getString(key); } } // 使用示例 JLabel label new JLabel(I18n.getString(converter.title));9. 常见问题与解决方案9.1 浮点数精度问题单位转换中经常遇到浮点数精度问题特别是在涉及多次转换时。解决方案使用BigDecimal进行精确计算设置合理的精度阈值对结果进行四舍五入public static double preciseConvert(double value, String fromUnit, String toUnit) { BigDecimal decimalValue BigDecimal.valueOf(value); BigDecimal inBase decimalValue.multiply(BigDecimal.valueOf(getBaseFactor(fromUnit))); BigDecimal result inBase.divide(BigDecimal.valueOf(getBaseFactor(toUnit)), 10, RoundingMode.HALF_UP); return result.doubleValue(); }9.2 单位兼容性检查不是所有单位之间都可以直接转换需要添加检查逻辑public void validateUnits(String fromUnit, String toUnit) { if(!getSupportedUnits().contains(fromUnit)) { throw new IllegalArgumentException(不支持的原单位: fromUnit); } if(!getSupportedUnits().contains(toUnit)) { throw new IllegalArgumentException(不支持的目标单位: toUnit); } if(isTemperatureUnit(fromUnit) ! isTemperatureUnit(toUnit)) { throw new IllegalArgumentException(温度单位不能与其他单位相互转换); } }9.3 用户输入验证对用户输入进行严格验证public static double validateInput(String input) { try { double value Double.parseDouble(input); if(Double.isInfinite(value) || Double.isNaN(value)) { throw new IllegalArgumentException(数值超出范围); } return value; } catch (NumberFormatException e) { throw new IllegalArgumentException(请输入有效的数字); } }10. 项目学习价值通过这个项目可以掌握以下Java核心概念和技能面向对象编程类、接口、继承、多态的应用设计模式工厂模式、策略模式、装饰器模式的实际应用异常处理合理的错误处理和用户反馈单元测试保证代码质量的测试方法构建工具Maven项目管理和构建GUI开发Swing框架的使用算法设计单位转换算法的实现与优化这个项目虽然看似简单但涵盖了Java编程的许多核心概念是初学者向中级开发者过渡的绝佳练习。我在重构这个项目的过程中对Java的很多特性有了更深入的理解特别是在设计模式和代码组织方面收获颇丰。

相关新闻

奈奎斯特稳定判据:从频率响应图形化判定闭环系统稳定性

奈奎斯特稳定判据:从频率响应图形化判定闭环系统稳定性

1. 项目概述:从“稳定”这个核心问题说起搞自动控制,无论是设计一个机器人、调节一个化学反应釜的温度,还是让一架无人机平稳悬停,最终都要回答一个最根本的问题:我这个系统到底稳不稳定?不稳定&#xff0c…

2026/10/7 4:30:25 阅读更多 →
【Bug已解决】FSDP2 with lora take more memory than FSDP 解决方案

【Bug已解决】FSDP2 with lora take more memory than FSDP 解决方案

【Bug已解决】FSDP2 with lora take more memory than FSDP 解决方案 一、现象长什么样 给一个用 FSDP2 训练的模型加上 LoRA,发现峰值显存反而比不加 LoRA 的纯 FSDP2 更高: 纯 FSDP2: 峰值 20 GB FSDP2 LoRA: …

2026/9/30 0:22:34 阅读更多 →
微软发布 Windows 11 重量级安全更新:一口气修复 416 项漏洞,涵盖两大在野利用风险

微软发布 Windows 11 重量级安全更新:一口气修复 416 项漏洞,涵盖两大在野利用风险

微软今日正式推送了 2026 年 7 份的“周二补丁日”(Patch Tuesday)累积更新。本次更新堪称“史诗级”,不仅修复了数百个安全漏洞,还对系统底层进行了诸多调整,包括升级 Secure Boot(安全启动)证…

2026/9/28 2:11:09 阅读更多 →

最新新闻

秋招网络岗VLAN面试全攻略:从原理到配置与排障

秋招网络岗VLAN面试全攻略:从原理到配置与排障

1. 秋招网络岗为什么绕不开VLAN这个知识点每年秋招,网络工程师、运维开发、云计算相关岗位的笔试面试里,VLAN出现的频率高得离谱。我翻过近几年的面经,也跟几个做过校招面试官的朋友聊过,发现一个规律:VLAN本身的概念不…

2026/10/14 23:28:03 阅读更多 →
Storm、Spark Streaming、Kafka Streams、Flink:流处理框架选型深度对比与实战指南

Storm、Spark Streaming、Kafka Streams、Flink:流处理框架选型深度对比与实战指南

流式处理这个领域,我差不多是从 Storm 还是绝对主流的时候就开始跟了,中间经历过 Kafka Streams 刚发布时大家观望的阶段,也踩过 Spark Streaming 把批次调小结果资源反而更紧张的坑,再到后来 Flink 逐渐成为很多团队的首选。这几…

2026/10/14 23:28:03 阅读更多 →
带载流子密度的双温模型:MATLAB有限元实现飞秒激光仿真

带载流子密度的双温模型:MATLAB有限元实现飞秒激光仿真

飞秒激光打金属或半导体薄膜,很多刚上手的人会被一张温度分布图问住:脉冲只有几百飞秒,怎么材料表面温度就上万K了?其实这里的温度并不是我们平时说的“材料温度”,而是电子子系统的温度。几百飞秒的激光脉冲&#xff…

2026/10/14 23:28:03 阅读更多 →
街景门牌号数据集解析:从标注处理到OCR/文本检测实战

街景门牌号数据集解析:从标注处理到OCR/文本检测实战

简介:这份街景门牌号数据集专为计算机视觉与图像识别任务设计,面向AI研究人员、算法工程师及参加相关竞赛的开发者,可用于训练和验证门牌号自动识别模型,支撑智能导航、自动驾驶、智慧城市等真实场景。包体共7个文件、约885MB&…

2026/10/14 23:28:03 阅读更多 →
AnyPS5实战:如何让任意设备获得PS5级游戏体验

AnyPS5实战:如何让任意设备获得PS5级游戏体验

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"PS5"这个关键词做文章的项目,而且"Any"这个前缀暗示了某…

2026/10/14 23:28:03 阅读更多 →
用C++实现最简PE加壳器:从解析文件到解密壳落地

用C++实现最简PE加壳器:从解析文件到解密壳落地

简介:这是一套面向C学习者和软件安全初学者的基础加壳实现源码包,围绕PE文件结构改造与程序入口点转移展开,完整演示了编写壳代码、注入保护逻辑、再封装可执行文件的过程。压缩包内共38个文件,体积仅1.47MB,涵盖10个头…

2026/10/14 23:26:59 阅读更多 →

日新闻

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/14 16:30:29 阅读更多 →
影刀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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →