Markdown转Word完整教程:从原理到实现

在这里插入图片描述

前言

在技术文档编写和学术论文创作中,Markdown因其简洁的语法和良好的可读性而广受欢迎。然而,在实际工作中,我们经常需要将Markdown文档转换为Word格式,以便与同事协作、提交正式文档或满足特定的格式要求。

本文将详细介绍Markdown转Word的各种方法、技术原理和代码实现,帮助读者掌握这一实用技能。

目录

  1. Markdown转Word的常见需求
  2. 转换方法对比
  3. 技术原理深度解析
  4. 代码实现详解
  5. 高级功能实现
  6. 常见问题与解决方案
  7. 性能优化建议
  8. 总结与展望

Markdown转Word的常见需求

1.1 业务场景

  • 技术文档发布:将GitHub上的README文档转换为Word格式供客户查看
  • 学术论文写作:在Markdown中快速编写,最终转换为符合期刊要求的Word格式
  • 企业文档管理:将技术文档转换为企业标准的Word模板格式
  • 多格式发布:同一份内容需要同时发布到网站和生成PDF/Word版本

1.2 转换要求

  • 格式保真度:标题、列表、表格、代码块等格式需要准确转换
  • 图片处理:本地图片和网络图片的正确嵌入
  • 特殊元素:数学公式、流程图、图表等复杂元素的处理
  • 中文支持:良好的中文字体和编码支持

转换方法对比

2.1 在线转换工具

优点:

  • 操作简单,无需安装软件
  • 支持多种格式转换
  • 界面友好

缺点:

  • 文件大小限制
  • 隐私安全问题
  • 功能有限,无法自定义

2.2 桌面软件

优点:

  • 功能相对完整
  • 支持批量转换
  • 离线使用

缺点:

  • 需要安装额外软件
  • 更新维护成本高
  • 扩展性差

2.3 编程实现

优点:

  • 高度可定制
  • 支持批量处理
  • 可集成到工作流中
  • 支持复杂逻辑处理

缺点:

  • 需要编程知识
  • 开发成本较高

技术原理深度解析

3.1 Markdown解析原理

Markdown是一种轻量级标记语言,其解析过程包括:

# Markdown解析的基本流程
def parse_markdown(content):# 1. 词法分析 - 识别各种标记符号tokens = tokenize(content)# 2. 语法分析 - 构建抽象语法树ast = build_ast(tokens)# 3. 渲染 - 转换为目标格式output = render(ast, target_format)return output

3.2 Word文档结构

Word文档(.docx)实际上是一个ZIP压缩包,包含:

3.3 转换映射关系

Markdown元素Word对应元素转换方式
# 标题Heading 1样式映射
粗体Bold字符格式
斜体Italic字符格式
代码块代码样式段落段落样式
图片内嵌图片媒体嵌入
链接超链接超链接对象
表格Word表格表格对象

代码实现详解

4.1 环境准备

# 安装必要的Python包
pip install pypandoc playwright pillow# 安装Pandoc
# Windows: 下载安装包
# Linux: sudo apt-get install pandoc
# macOS: brew install pandoc# 安装Playwright浏览器
playwright install

4.2 核心转换类

import re
import os
import tempfile
import sys
from io import BytesIO
from PIL import Image
from playwright.sync_api import sync_playwright
import pypandocclass MarkdownToWordConverter:"""Markdown到Word转换器"""def __init__(self):self.temp_dir = Noneself.image_counter = 0def convert(self, input_path, output_path):"""主转换方法"""try:# 1. 读取Markdown文件md_content = self._read_markdown(input_path)# 2. 预处理特殊内容processed_content = self._preprocess_content(md_content, input_path)# 3. 使用Pandoc转换self._convert_with_pandoc(processed_content, output_path)print(f"转换完成: {output_path}")except Exception as e:print(f"转换失败: {e}")raise

4.3 Mermaid图表处理

def render_mermaid(self, code):"""使用Playwright渲染Mermaid图表为PNG"""try:with sync_playwright() as p:browser = p.chromium.launch(headless=True)page = browser.new_page()# 构建包含Mermaid的HTML页面html = f"""<html><body><pre class="mermaid">{code}</pre><script type="module">import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.esm.min.mjs';mermaid.initialize({{ startOnLoad: true, theme: 'default',fontFamily: 'Arial, sans-serif'}});</script></body></html>"""page.set_content(html)page.wait_for_selector('.mermaid svg', timeout=15000)# 获取SVG边界框并截图bbox = page.evaluate('document.querySelector(".mermaid svg").getBBox()')clip = {'x': bbox['x'] - 10,'y': bbox['y'] - 10,'width': bbox['width'] + 20,'height': bbox['height'] + 20}screenshot = page.screenshot(type='png', clip=clip, omit_background=True)browser.close()return screenshotexcept Exception as e:print(f"渲染Mermaid图表时出错: {e}")return None

4.4 图片处理优化

def process_images(self, md_content, temp_dir, md_dir):"""处理Markdown中的图片引用"""def replace_image(match):alt_text = match.group(1)img_path = match.group(2)# 处理本地图片if not img_path.startswith(('http://', 'https://')):try:abs_img_path = os.path.normpath(os.path.join(md_dir, img_path))if os.path.exists(abs_img_path):# 生成ASCII文件名避免编码问题img_ext = os.path.splitext(img_path)[1] or '.png'temp_img_name = f"img_{self.image_counter}{img_ext}"self.image_counter += 1temp_img_path = os.path.join(temp_dir, temp_img_name)# 复制图片文件with open(abs_img_path, 'rb') as src, open(temp_img_path, 'wb') as dst:dst.write(src.read())print(f"图片已处理: {temp_img_name}")return f'![{alt_text}]({temp_img_name})'else:print(f"警告: 图片未找到: {abs_img_path}")except Exception as e:print(f"处理图片 {img_path} 时出错: {e}")return match.group(0)return re.sub(r'!\[(.*?)\]\((.*?)\)', replace_image, md_content)

4.5 Pandoc转换配置

def _convert_with_pandoc(self, content, output_path):"""使用Pandoc进行最终转换"""# 创建临时Markdown文件temp_md_path = os.path.join(self.temp_dir, 'temp.md')with open(temp_md_path, 'w', encoding='utf-8') as f:f.write(content)# Pandoc转换参数pandoc_args = ['--from=markdown+pipe_tables+grid_tables+multiline_tables','--to=docx','--standalone','--wrap=preserve','--markdown-headings=atx','--reference-doc=template.docx',  # 可选:使用自定义模板]# 切换到临时目录执行转换original_cwd = os.getcwd()try:os.chdir(self.temp_dir)pypandoc.convert_file('temp.md','docx',outputfile=output_path,extra_args=pandoc_args)finally:os.chdir(original_cwd)

高级功能实现

5.1 自定义样式模板

def create_custom_template(self, template_path):"""创建自定义Word模板"""# 可以通过修改reference-doc参数使用自定义模板# 模板文件需要包含预定义的样式pass

5.2 批量转换

def batch_convert(self, input_dir, output_dir, pattern="*.md"):"""批量转换Markdown文件"""import globmd_files = glob.glob(os.path.join(input_dir, pattern))for md_file in md_files:filename = os.path.basename(md_file)output_file = os.path.join(output_dir, filename.replace('.md', '.docx'))self.convert(md_file, output_file)

5.3 元数据提取

def extract_metadata(self, content):"""提取Markdown文档元数据"""metadata = {}# 提取YAML前置元数据yaml_match = re.match(r'^---\n(.*?)\n---\n', content, re.DOTALL)if yaml_match:yaml_content = yaml_match.group(1)# 解析YAML内容import yamlmetadata = yaml.safe_load(yaml_content)# 提取标题title_match = re.search(r'^#\s+(.+)$', content, re.MULTILINE)if title_match:metadata['title'] = title_match.group(1).strip()return metadata

常见问题与解决方案

6.1 中文编码问题

问题:转换后的Word文档中文显示乱码

解决方案

# 确保文件读写使用UTF-8编码
with open(file_path, 'r', encoding='utf-8') as f:content = f.read()# Pandoc参数中添加编码支持
pandoc_args.extend(['--from=markdown+pipe_tables+grid_tables+multiline_tables','--to=docx','--standalone','--wrap=preserve','--markdown-headings=atx',
])

6.2 图片路径问题

问题:图片无法正确显示

解决方案

def normalize_image_paths(self, content, base_dir):"""标准化图片路径"""def fix_path(match):alt_text = match.group(1)img_path = match.group(2)# 转换为绝对路径if not os.path.isabs(img_path):abs_path = os.path.join(base_dir, img_path)if os.path.exists(abs_path):return f'![{alt_text}]({abs_path})'return match.group(0)return re.sub(r'!\[(.*?)\]\((.*?)\)', fix_path, content)

6.3 表格格式问题

问题:复杂表格格式丢失

解决方案

# 使用Pandoc的表格扩展
pandoc_args = ['--from=markdown+pipe_tables+grid_tables+multiline_tables+table_captions','--to=docx','--standalone',
]

6.4 数学公式支持

问题:LaTeX数学公式无法正确渲染

解决方案

# 添加数学公式支持
pandoc_args.extend(['--from=markdown+tex_math_dollars','--mathjax',  # 或使用 --katex
])

性能优化建议

7.1 内存优化

def process_large_file(self, input_path, output_path, chunk_size=1024*1024):"""处理大文件的内存优化方案"""# 分块读取大文件with open(input_path, 'r', encoding='utf-8') as f:while True:chunk = f.read(chunk_size)if not chunk:break# 处理每个块self._process_chunk(chunk)

7.2 并发处理

import concurrent.futures
import threadingdef parallel_convert(self, file_list, max_workers=4):"""并行转换多个文件"""with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:futures = []for input_file, output_file in file_list:future = executor.submit(self.convert, input_file, output_file)futures.append(future)# 等待所有任务完成for future in concurrent.futures.as_completed(futures):try:result = future.result()print(f"转换完成: {result}")except Exception as e:print(f"转换失败: {e}")

7.3 缓存机制

import hashlib
import pickleclass CachedConverter:def __init__(self, cache_dir=".cache"):self.cache_dir = cache_diros.makedirs(cache_dir, exist_ok=True)def get_file_hash(self, file_path):"""计算文件哈希值"""with open(file_path, 'rb') as f:return hashlib.md5(f.read()).hexdigest()def is_cached(self, input_path, output_path):"""检查是否已缓存"""input_hash = self.get_file_hash(input_path)cache_file = os.path.join(self.cache_dir, f"{input_hash}.cache")if os.path.exists(cache_file) and os.path.exists(output_path):# 检查输出文件是否比缓存文件新if os.path.getmtime(output_path) > os.path.getmtime(cache_file):return Truereturn False

总结与展望

8.1 技术总结

本文详细介绍了Markdown转Word的完整解决方案,包括:

  1. 多种转换方法对比:在线工具、桌面软件、编程实现各有优劣
  2. 技术原理深度解析:从Markdown解析到Word文档结构的完整流程
  3. 完整代码实现:包含Mermaid图表、图片处理、中文支持等高级功能
  4. 问题解决方案:针对常见问题的具体解决方法
  5. 性能优化策略:内存优化、并发处理、缓存机制等

8.2 应用价值

  • 提高工作效率:自动化文档转换流程
  • 保证格式一致性:统一的转换标准
  • 支持复杂内容:图表、公式、多媒体等
  • 易于集成:可集成到CI/CD流程中

8.3 未来发展方向

  1. AI辅助转换:利用机器学习优化转换质量
  2. 实时协作:支持多人实时编辑和转换
  3. 云端服务:提供SaaS转换服务
  4. 更多格式支持:支持更多输入输出格式

8.4 学习建议

对于想要深入学习文档转换技术的读者,建议:

  1. 掌握基础:熟悉Markdown语法和Word文档结构
  2. 实践项目:从简单转换开始,逐步增加复杂度
  3. 关注更新:跟踪Pandoc等工具的最新版本
  4. 社区参与:参与开源项目,分享经验

附录

A. 完整代码示例

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Markdown到Word转换器完整实现
支持Mermaid图表、图片处理、中文支持等功能
"""import re
import os
import tempfile
import sys
from io import BytesIO
from PIL import Image
from playwright.sync_api import sync_playwright
import pypandocclass MarkdownToWordConverter:def __init__(self):self.temp_dir = Noneself.image_counter = 0def convert(self, input_path, output_path):"""主转换方法"""try:# 创建临时目录self.temp_dir = tempfile.mkdtemp()print(f"临时目录: {self.temp_dir}")# 读取Markdown文件md_content = self._read_markdown(input_path)# 预处理内容processed_content = self._preprocess_content(md_content, input_path)# 使用Pandoc转换self._convert_with_pandoc(processed_content, output_path)print(f"转换完成: {output_path}")except Exception as e:print(f"转换失败: {e}")raisefinally:# 清理临时文件if self.temp_dir and os.path.exists(self.temp_dir):import shutilshutil.rmtree(self.temp_dir)def _read_markdown(self, input_path):"""读取Markdown文件"""try:with open(input_path, 'r', encoding='utf-8') as f:return f.read()except Exception as e:print(f"读取Markdown文件失败: {e}")raisedef _preprocess_content(self, content, input_path):"""预处理Markdown内容"""md_dir = os.path.dirname(os.path.abspath(input_path))# 处理Mermaid图表content = self._process_mermaid(content)# 处理图片content = self._process_images(content, md_dir)return contentdef _process_mermaid(self, content):"""处理Mermaid图表"""def replace_mermaid(match):code = match.group(1).strip()png_bytes = self._render_mermaid(code)if png_bytes:try:fd, path = tempfile.mkstemp(suffix='.png', dir=self.temp_dir)os.write(fd, png_bytes)os.close(fd)rel_path = os.path.basename(path)print(f"Mermaid图表已保存: {path}")return f'![Mermaid Flowchart]({rel_path})'except Exception as e:print(f"保存Mermaid图表时出错: {e}")return match.group(0)return re.sub(r'```mermaid\s*\n(.*?)\n```', replace_mermaid, content, flags=re.DOTALL | re.IGNORECASE)def _render_mermaid(self, code):"""渲染Mermaid图表为PNG"""try:with sync_playwright() as p:browser = p.chromium.launch(headless=True)page = browser.new_page()html = f"""<html><body><pre class="mermaid">{code}</pre><script type="module">import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.esm.min.mjs';mermaid.initialize({{ startOnLoad: true, theme: 'default' }});</script></body></html>"""page.set_content(html)page.wait_for_selector('.mermaid svg', timeout=15000)bbox = page.evaluate('document.querySelector(".mermaid svg").getBBox()')clip = {'x': bbox['x'] - 10,'y': bbox['y'] - 10,'width': bbox['width'] + 20,'height': bbox['height'] + 20}screenshot = page.screenshot(type='png', clip=clip, omit_background=True)browser.close()return screenshotexcept Exception as e:print(f"渲染Mermaid图表时出错: {e}")return Nonedef _process_images(self, content, md_dir):"""处理图片"""def replace_image(match):alt_text = match.group(1)img_path = match.group(2)if not img_path.startswith(('http://', 'https://')):try:abs_img_path = os.path.normpath(os.path.join(md_dir, img_path))print(f"处理图片: {abs_img_path}")if os.path.exists(abs_img_path):img_ext = os.path.splitext(img_path)[1] or '.png'temp_img_name = f"img_{self.image_counter}{img_ext}"self.image_counter += 1temp_img_path = os.path.join(self.temp_dir, temp_img_name)with open(abs_img_path, 'rb') as src, open(temp_img_path, 'wb') as dst:dst.write(src.read())print(f"图片已复制到: {temp_img_path}")return f'![{alt_text}]({temp_img_name})'else:print(f"警告: 图片未找到: {abs_img_path}")except Exception as e:print(f"处理图片 {img_path} 时出错: {e}")return match.group(0)return re.sub(r'!\[(.*?)\]\((.*?)\)', replace_image, content)def _convert_with_pandoc(self, content, output_path):"""使用Pandoc进行转换"""temp_md_path = os.path.join(self.temp_dir, 'temp.md')try:with open(temp_md_path, 'w', encoding='utf-8') as f:f.write(content)print(f"临时Markdown文件已生成: {temp_md_path}")except Exception as e:print(f"写入临时Markdown文件失败: {e}")raiseoutput_dir = os.path.dirname(os.path.abspath(output_path))if not os.access(output_dir, os.W_OK):print(f"错误: 输出目录 {output_dir} 无写入权限")raise PermissionError(f"输出目录 {output_dir} 无写入权限")pandoc_args = ['--from=markdown+pipe_tables+grid_tables+multiline_tables','--to=docx','--standalone','--wrap=preserve','--markdown-headings=atx',]original_cwd = os.getcwd()try:os.chdir(self.temp_dir)print(f"Pandoc工作目录: {self.temp_dir}")pypandoc.convert_file('temp.md','docx',outputfile=output_path,extra_args=pandoc_args)finally:os.chdir(original_cwd)def main():"""主函数"""if len(sys.argv) != 3:print("用法: python md_to_docx.py input.md output.docx")sys.exit(1)input_path = sys.argv[1]output_path = sys.argv[2]if not os.path.exists(input_path):print(f"错误: 输入文件 {input_path} 不存在")sys.exit(1)converter = MarkdownToWordConverter()converter.convert(input_path, output_path)if __name__ == '__main__':main()

B. 使用说明

  1. 安装依赖

    pip install pypandoc playwright pillow
    playwright install
    
  2. 安装Pandoc

    • Windows: 下载安装包
    • Linux: sudo apt-get install pandoc
    • macOS: brew install pandoc
  3. 使用方法

    python md_to_docx.py input.md output.docx
    

C. 注意事项

  1. 确保所有依赖包正确安装
  2. 图片路径使用相对路径
  3. 大文件转换时注意内存使用
  4. 定期更新Pandoc版本以获得最新功能

本文档提供了Markdown转Word的完整解决方案,希望对读者有所帮助。如有问题,欢迎交流讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95579.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95579.shtml
英文地址,请注明出处:http://en.pswp.cn/web/95579.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IBM穿孔卡片:现代计算技术的奠基之作

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 1 打孔卡概述 穿孔卡片&#xff08;Punch Card&#xff09;又称打孔卡…

亚马逊旺季来临如何用woot冲刺

在亚马逊旺季来临之际&#xff0c;使用Woot冲刺需结合新品推广、老品激活、库存清理等不同场景&#xff0c;通过精准选品、活动设置、广告配合及数据监控实现销量与排名的双重提升。以下是具体操作指南&#xff1a;一、精准选品&#xff1a;匹配提报条件新品期选品标准&#xf…

AlexNet:计算机视觉的革命性之作

AlexNet: Revolutionizing Deep Learning for Computer Vision (1)网络提出的背景 论文题目:ImageNet Classification with Deep Convolutional Neural Networks arXiv地址:https://arxiv.org/abs/1207.0575 在2012年ImageNet大规模视觉识别挑战赛(ILSVRC)中,AlexNet以15…

【高等数学】第十一章 曲线积分与曲面积分——第二节 对坐标的曲线积分

上一节&#xff1a;【高等数学】第十一章 曲线积分与曲面积分——第一节 对弧长的曲线积分 总目录&#xff1a;【高等数学】 目录 文章目录1. 对坐标的曲线积分的概念与性质1. 对坐标的曲线积分的概念与性质 变力沿曲线所作的功 先用曲线 LLL 上的点 M1(x1,y1),M2(x2,y2),…,M…

解析SQL Server核心服务与功能

SQL Server 安装后会在 Windows 系统中注册多个服务&#xff0c;每种服务负责不同的功能。主要服务类型包括&#xff1a; &#x1f4cc; 核心服务 (必须或常用)SQL Server Database Engine (数据库引擎服务) 服务名称格式&#xff1a; MSSQL$<InstanceName> (命名实例) 或…

专项智能练习(计算机动画基础)

1.小明在制作Flash作品时&#xff0c;舞台及库中素材如第下图所示&#xff0c;把“马”元件插入到“马”图层第1帧并放在舞台的草地位置&#xff0c;发现舞台中并无马图像显示&#xff0c;下列情形中最有可能的是&#xff08; &#xff09;。A.“马”图层已被锁定 B.“马”图层…

第三方库集成:结合 Express.js 构建本地服务器

引言&#xff1a;Express.js 在 Electron 第三方库集成中的本地服务器构建价值 在 Electron 框架的第三方库集成生态中&#xff0c;Express.js 作为 Node.js 的经典 Web 框架&#xff0c;扮演着构建本地服务器的关键角色。它不仅仅是一个路由和中间件工具&#xff0c;更是 Elec…

百度地图+vue+flask+爬虫 推荐算法旅游大数据可视化系统Echarts mysql数据库 带沙箱支付+图像识别技术

F012 百度地图vueflask爬虫 推荐算法旅游大数据可视化系统Echarts mysql数据库 带沙箱支付图像识别技术 &#x1f4da;编号&#xff1a; F012 文章结尾部分有CSDN官方提供的学长 联系方式名片 博主开发经验15年,全栈工程师&#xff0c;专业搞定大模型、知识图谱、算法和可视化…

# 开发中使用——鸿蒙CoreSpeechKit让文字发声后续

开发中使用——鸿蒙CoreSpeechKit让文字发声后续 设置音量大小 volume// 设置播报相关参数this.extraParam {"queueMode": 0, "speed": AppModel.speed, "volume": AppModel.volume, "pitch": 1, "languageContext": zh-CN,…

Java全栈开发面试实录:从基础到微服务的深度探索

Java全栈开发面试实录&#xff1a;从基础到微服务的深度探索 面试官与应聘者的初次见面 面试官&#xff1a;你好&#xff0c;很高兴见到你。请先做个自我介绍吧。 应聘者&#xff1a;您好&#xff0c;我叫李明&#xff0c;今年28岁&#xff0c;是南京大学计算机科学与技术专业的…

前端路由切换不再白屏:React/Vue 实战优化全攻略(含可运行 Demo)

摘要 在单页应用&#xff08;SPA&#xff09;开发中&#xff0c;React、Vue、Angular 这些主流框架都依赖前端路由来完成页面切换。好处是显而易见的&#xff1a;首屏资源一次加载&#xff0c;后续页面切换靠前端路由完成&#xff0c;体验比传统的多页应用要顺畅很多。 但是在实…

C#之LINQ

文章目录前言LINQ一、LINQ1一、LINQ2一、LINQ3Where方法&#xff1a;每一项数据都会进过predicate的测试&#xff0c;如果针对一个元素&#xff0c;predicate执行的返回值为true&#xff0c;那么这个元素就会放到返回值中。获取一条数据&#xff08;是否带参数的两种写法&#…

第 2 讲:Kafka Topic 与 Partition 基础

课程概述 在第一篇课程中&#xff0c;我们了解了 Kafka 的基本概念和简单的 Producer/Consumer 实现。 本篇课程将深入探讨 Kafka 的核心机制&#xff1a;Topic 和 Partition。 学习目标 通过本课程&#xff0c;您将掌握&#xff1a; Topic 和 Partition 的设计原理&#x…

三阶Bezier曲线曲率极值及对应的u的计算方法

三阶&#xff08;三次&#xff09;Bezier曲线的曲率极值及其对应的参数 u 的计算是一个复杂的非线性优化问题。由于三阶Bezier曲线是参数化曲线&#xff0c;其曲率表达式较为复杂&#xff0c;通常无法通过解析方法直接求得所有极值点&#xff0c;但可以通过求解曲率导数为零的方…

Unity:XML笔记(二)——Xml序列化、反序列化、IXmlSerializable接口

写在前面&#xff1a;写本系列(自用)的目的是回顾已经学过的知识、记录新学习的知识或是记录心得理解&#xff0c;方便自己以后快速复习&#xff0c;减少遗忘。三、Xml序列化序列化就是把想要存储的内容转换为字节序列用于存储或传递。1、序列化我们先创建一个类&#xff0c;之…

java注解、Lambda表达式、Servlet

一、Java注解注解的概念&#xff1a; Java注解是代码中的元数据&#xff0c;可以用于描述其他代码。注解在编译、类加载、运行时被处理&#xff0c;并且不会改变代码逻辑。注解的用途&#xff1a; 提供代码元信息&#xff0c;如 Override 表明一个方法覆盖了父类的方法。 编译检…

【单片机day02】

GPIO&#xff1a;Genral Purpose Input/Output&#xff0c;GPIO是51单片机和外界交互最基本的方式工作模式&#xff1a;输出模式&#xff1a;单片机给定引脚一个电平(高电平(5V) 低电平(0V)),控制引脚实现高低电平输入模式&#xff1a;检测引脚电平变化GPIO水龙头输出模式&…

Java中最常用的设计模式

Java设计模式之结构型—代理模式-CSDN博客 观察者模式详解-CSDN博客 单例模式详解-CSDN博客 Java设计模式之结构型—享元模式-CSDN博客 Java设计模式之创建型—建造者模式-CSDN博客 Java设计模式之结构型—工厂模式-CSDN博客 Java设计模式之结构型—适配器模式-CSDN博客 …

使用Axure动态面板制作轮播图案例详解

在现代网页设计中&#xff0c;轮播图&#xff08;Carousel&#xff09;是一种常见且高效的展示方式&#xff0c;用于在同一空间内循环展示多张图片或内容。Axure RP作为一款强大的原型设计工具&#xff0c;提供了动态面板和丰富的交互事件功能&#xff0c;使得制作轮播图变得简…

VUE的中 computed: { ...mapState([‘auditObj‘]), }写法详解

具体解析&#xff1a;computed&#xff1a;这是 Vue 组件选项中的计算属性&#xff0c;用于声明依赖于其他数据而存在的派生数据。计算属性会根据依赖进行缓存&#xff0c;只有当依赖的数据发生变化时才会重新计算。mapState&#xff1a;这是 Vuex 提供的一个辅助函数&#xff…