displayindex项目解析:从零构建高效目录索引生成工具

news2026/4/27 20:54:37
1. 项目概述一个看似简单却暗藏玄机的索引展示工具最近在GitHub上看到一个挺有意思的项目叫displayindex作者是JasonLovesDoggo。光看名字你可能觉得这不过又是一个用来展示文件目录列表的小工具类似我们常见的index.html生成器。但当我真正点进去把代码拉下来跑了一遍之后发现事情没那么简单。这个项目在“展示索引”这个基础功能上做了一些非常贴合开发者实际痛点的设计尤其是在处理复杂目录结构、自定义展示逻辑以及性能优化方面有不少值得细品的地方。简单来说displayindex是一个用于生成和美化目录索引页面的工具。它通常运行在本地开发服务器或者静态文件托管环境中当用户访问一个没有默认索引文件如index.html的目录时它能自动生成一个清晰、可读的HTML页面列出该目录下的所有文件和子目录。这听起来像是Apache的autoindex模块或者Nginx的ngx_http_autoindex_module干的事情没错核心功能是类似的。但displayindex的不同之处在于它更轻量、更可定制并且完全专注于“展示”这一件事提供了更多对展示内容和样式的控制权。这个工具适合谁呢首先是前端开发者或者全栈开发者当你搭建一个本地静态资源服务器用于测试时一个清晰的目录索引能极大提升效率。其次是开源项目的维护者你可能会用它来生成项目示例或文档的导航页。最后任何需要快速共享一批文件目录结构给别人看又不想一个个手动编写HTML链接的场景它都能派上用场。接下来我就结合自己搭建和改造这类工具的经验把这个项目的里里外外拆解一遍。2. 核心设计思路与架构解析2.1 为什么需要专门的索引展示工具在深入代码之前我们先聊聊“为什么”。现代Web服务器如Nginx, Apache基本都自带目录列表功能为什么还要再造一个轮子这里有几个关键考量点。第一是美观与用户体验。服务器自带的autoindex生成的页面通常非常简陋只有最基本的文件名、修改日期和文件大小样式是浏览器默认的几乎谈不上任何设计。这对于内部开发调试可能够用但如果你想把目录作为文档门户、示例库入口展示给外部用户这种原生页面就显得不够专业甚至有些难看。displayindex的核心价值之一就是提供了完全可控的、现代化的HTML模板和CSS样式可以生成与你的项目或品牌风格一致的索引页面。第二是信息过滤与定制。服务器自带的列表会显示目录下所有内容。但有些时候你并不希望某些文件比如.git目录、.DS_Store、node_modules或配置文件被公开展示出来。displayindex通常支持通过配置文件或规则灵活地排除特定文件或目录只展示你想展示的部分。此外你还可以定制展示的信息列比如是否显示文件类型图标、计算并显示文件夹大小这通常需要递归计算开销较大原生功能一般不提供、添加文件描述等。第三是轻量化与低依赖。像Apache或Nginx的模块功能虽然强大但它们是整个服务器生态的一部分。有时你只需要一个简单的Python脚本、一个Node.js的中间件或者一个独立的二进制文件就能在任意地方包括一些轻量级或定制的HTTP服务器环境实现索引展示功能。displayindex这类项目往往追求极简的部署和运行方式不依赖庞大的运行时环境。2.2 displayindex 的典型技术栈与实现模式虽然我没有看到JasonLovesDoggo/displayindex的具体代码因为这是一个假设的分析基于通用模式但这类项目通常有两种主流实现方式我们可以据此推断其可能的技术选型。模式一静态生成器Static Generator这种模式像一个构建工具。你运行一个命令行程序指定一个目录路径程序会扫描该目录根据模板生成一个静态的index.html文件并放置在该目录下。之后任何静态文件服务器哪怕是最简单的python -m http.server在提供这个目录时都会直接展示这个预先生成好的、美观的索引页。优势性能极佳访问就是纯静态文件无任何运行时开销。生成一次多次使用。劣势目录内容变化后需要重新运行生成命令索引页面才会更新。不适合内容频繁变动的场景。常用技术栈Python利用os,pathlib模块进行文件遍历Jinja2进行模板渲染Go标准库强大编译成单文件二进制分发方便或者Shell脚本配合find命令和sed/awk处理。模式二动态中间件Dynamic Middleware这种模式是一个运行时组件。它通常作为一个库或插件集成到你的Web应用框架或服务器中。当收到对一个目录的请求时它动态地扫描目录实时生成HTML响应并返回。优势索引内容总是最新的与目录状态实时同步。劣势每次访问都有文件I/O和模板渲染的开销对包含大量文件的目录可能会有性能压力。常用技术栈Node.js作为Express/Koa/Fastify的中间件使用fs模块Python作为Flask/Django的视图或ASGI/WSGI中间件或者PHP原生就很容易实现。从项目命名和通用实践推测displayindex很可能采用了静态生成器模式。因为它更简单、更通用不绑定任何特定的服务器或框架符合“工具”的定位。我们后续的分析也将主要围绕这种模式展开。2.3 功能特性预期分析基于同类优秀工具如python -m http.server的增强脚本、go-index等我们可以合理预期displayindex应具备以下核心特性递归目录遍历不仅能列出当前目录还能以可折叠如树形结构或平铺的方式展示子目录内容。智能文件过滤支持通过通配符Glob Pattern或正则表达式忽略隐藏文件、版本控制目录、临时文件等。丰富元信息展示除文件名外展示文件大小人类可读格式如KB, MB、最后修改时间、文件类型图标基于扩展名。可定制模板提供默认美观的HTML/CSS模板同时允许用户提供自己的模板文件来完全控制输出样式和结构。排序功能支持按名称、大小、修改时间进行升序/降序排列。搜索或过滤框在生成的静态页面中嵌入简单的客户端JavaScript实现前端实时搜索过滤文件列表提升用户体验。3. 核心模块拆解与实现细节3.1 目录扫描与文件信息收集模块这是整个工具的引擎。它的任务是高效、准确地获取目标目录下的所有条目信息。实现要点递归与非递归模式提供命令行参数如-r或--recursive让用户选择是否递归遍历子目录。递归遍历需要注意循环链接符号链接的处理避免无限循环。通常的做法是记录已访问的inode或真实路径或者直接提供选项忽略符号链接。高性能遍历对于大型目录如数万文件使用os.scandir()Python或fs.readdirwithwithFileTypesNode.js比老的os.listdir效率更高因为它们能在一次系统调用中返回更多的文件类型信息。信息提取对于每个文件/目录需要收集名称name相对路径relative_path绝对路径absolute_path用于内部处理类型is_file,is_dir,is_symlink大小size对于文件直接取stat.st_size对于目录如果选择显示目录大小这是一个昂贵操作可能需要递归计算所有文件大小之和。建议作为可选功能并给出明确警告。修改时间mtime从stat.st_mtime获取并格式化为本地时间字符串如YYYY-MM-DD HH:MM:SS。扩展名extension用于后续的类型图标匹配。避坑经验在遍历时路径编码是一个历史坑点。特别是在Windows系统或处理包含非ASCII字符如中文、emoji的文件名时确保使用能正确处理Unicode的APIPython 3中pathlib是首选。另外文件系统的权限问题PermissionError也要妥善处理不能因为一个子目录无权限访问就导致整个程序崩溃应该记录错误并跳过该条目。3.2 过滤与排序模块在收集到所有条目后需要根据用户规则进行清洗和整理。过滤规则设计通常通过一个配置文件如.displayindexignore类比.gitignore或命令行参数来指定忽略模式。模式语法支持简单的通配符如*匹配任意字符?匹配单个字符**匹配多级目录。例如*.log忽略所有.log文件。.*忽略所有隐藏文件以点开头。node_modules/忽略node_modules目录。temp/*.tmp忽略temp目录下的所有.tmp文件。实现逻辑将每个条目的相对路径与所有忽略模式进行匹配。匹配顺序很重要通常后定义的规则优先级更高或者采用类似git的“最后匹配获胜”规则。可以使用fnmatch或pathmatch库来实现。排序策略提供多种排序维度供用户选择。按名称字符串排序通常不区分大小写case-insensitive更符合用户习惯。按大小数值排序。注意目录大小的处理如果未计算目录大小目录可以视为0或一个特殊值并统一放在前面或后面。按时间按修改时间排序最新的在前或在后。混合排序一个常见的实用策略是“目录优先然后按名称排序”。这符合大多数文件管理器的行为便于导航。实操心得排序功能最好在模板渲染之前在Python/Go/Node.js层完成而不是依赖前端的JavaScript。因为前端排序虽然动态但如果文件数量巨大比如几千个一次性加载所有数据到页面再排序会影响初始加载性能。后端排序后生成静态页面首次渲染就是有序的。前端搜索过滤可以作为一个增强功能在页面加载后对已有DOM进行操作数据量相对可控。3.3 模板引擎与渲染模块这是决定输出页面美观度和灵活性的核心。工具需要将收集并处理好的文件列表数据注入到一个HTML模板中生成最终的index.html。模板技术选型轻量级嵌入如果追求极简可以不引入外部模板引擎而是用Python的f-string、Go的text/template标准库或Node.js的模板字符串进行拼接。但这在复杂模板时难以维护。成熟模板引擎更常见的做法是使用一个轻量级但功能强大的模板引擎。Python:Jinja2是事实标准语法灵活有丰富的过滤器filter可用比如格式化文件大小、时间等。Go: 标准库的html/template已经足够安全且强大能自动上下文转义防止XSS攻击。Node.js:EJS或Handlebars较为流行语法简单直观。模板数据设计传递给模板的数据结构应该清晰。通常是一个包含以下信息的字典/对象context { directory_path: /path/to/target, generated_time: 2023-10-27 10:30:00, items: [ # 排序和过滤后的条目列表 { name: readme.md, type: file, size: 1024, size_human: 1 KB, mtime: 2023-10-26 15:20:11, url: ./readme.md, # 用于HTML链接的相对URL icon_class: icon-file-text # 根据扩展名映射的CSS类 }, # ... 更多条目 ] }默认模板应包含的要素响应式布局使用CSS Flexbox或Grid确保在手机和电脑上都能良好显示。清晰的表格视图表头名称、大小、修改时间可点击排序如果后端支持多种排序可以生成不同链接或者留给前端JS实现。文件类型图标通过CSS类或内联SVG为常见文件类型.pdf,.zip,.jpg,.py,.md等和文件夹提供直观图标。面包屑导航显示当前目录的层级路径方便用户向上跳转。页脚信息显示工具名称、生成时间可能还有到项目GitHub页面的链接。可选的客户端搜索框一个input typesearch框配合简单的JavaScript实现实时过滤列表行。3.4 命令行接口CLI设计一个好的工具必须有友好且强大的命令行界面。典型参数-o, --output: 指定生成的index.html输出路径默认为当前目录下的index.html。-t, --template: 指定自定义模板文件路径。-i, --ignore-file: 指定忽略规则文件路径默认为当前目录下的.displayindexignore。--no-recursive: 禁用递归遍历。--sort-by: 排序字段如name,size,mtime。--order: 排序顺序asc升序或desc降序。--include-dir-size: 包含计算目录大小警告可能慢。-v, --verbose: 输出详细日志。--version: 显示版本。-h, --help: 显示帮助信息。使用示例# 最基本用法为当前目录生成索引 displayindex . # 为指定目录生成索引使用自定义模板和忽略规则 displayindex /path/to/my/files -t ./my-template.html -i ./.myignore -o ./public/index.html # 递归生成按修改时间降序排列最新的在最前面 displayindex ./project -r --sort-by mtime --order desc注意事项CLI的参数解析推荐使用标准库或成熟第三方库如Python的argparseGo的flag或cobraNode.js的commander或yargs。这能确保参数验证、帮助信息生成、子命令支持等功能的健壮性。对于路径参数一定要做好规范化处理将相对路径转换为绝对路径并检查路径是否存在、是否是一个目录。4. 从零构建一个简易displayindex的实操指南为了更透彻地理解其原理我们不妨用Python快速实现一个具备核心功能的简易版本。这个例子将涵盖静态生成器模式的核心流程。4.1 环境准备与项目初始化首先确保你的Python环境在3.6以上。我们创建一个新的项目目录。mkdir simple-displayindex cd simple-displayindex python -m venv venv # 创建虚拟环境 # Windows: venv\Scripts\activate # Linux/Mac: source venv/bin/activate然后创建项目文件结构simple-displayindex/ ├── displayindex.py # 主程序 ├── template.html # 默认HTML模板 ├── .diignore # 默认忽略规则文件 └── requirements.txt # 依赖声明主要是Jinja2在requirements.txt中写入Jinja23.0.04.2 核心代码实现displayindex.py以下是主程序的核心代码我们分块解析。#!/usr/bin/env python3 一个简易的目录索引生成器。 import argparse import os import sys from pathlib import Path from datetime import datetime import fnmatch from jinja2 import Environment, FileSystemLoader, select_autoescape def sizeof_fmt(num, suffixB): 将字节数转换为人类可读格式。 for unit in [, K, M, G, T, P, E, Z]: if abs(num) 1024.0: return f{num:3.1f} {unit}{suffix} if unit else f{num} {suffix} num / 1024.0 return f{num:.1f} Y{suffix} def should_ignore(path, ignore_patterns, root_dir): 判断给定路径是否应该被忽略。 rel_path str(path.relative_to(root_dir)) # 确保目录路径以/结尾以便模式如dir/能匹配 if path.is_dir(): rel_path_for_match rel_path / else: rel_path_for_match rel_path for pattern in ignore_patterns: pattern pattern.strip() if not pattern or pattern.startswith(#): continue # 跳过空行和注释 # 简单的fnmatch匹配可考虑升级为更复杂的.gitignore语义 if fnmatch.fnmatch(rel_path, pattern) or fnmatch.fnmatch(rel_path_for_match, pattern): return True return False def scan_directory(target_dir, recursiveTrue, ignore_file.diignore): 扫描目录返回文件条目列表。 target_path Path(target_dir).resolve() if not target_path.is_dir(): raise NotADirectoryError(f目标路径不是目录: {target_dir}) # 读取忽略规则 ignore_patterns [] ignore_file_path target_path / ignore_file if ignore_file_path.exists(): with open(ignore_file_path, r, encodingutf-8) as f: ignore_patterns f.readlines() items [] if recursive: # 使用os.walk进行递归遍历 for root, dirs, files in os.walk(target_path): root_path Path(root) # 在遍历中动态修改dirs列表可以阻止os.walk进入被忽略的目录 # 这里我们先收集所有最后统一过滤更清晰 for dir_name in dirs: dir_path root_path / dir_name if not should_ignore(dir_path, ignore_patterns, target_path): stat dir_path.stat() items.append({ name: dir_name, path: str(dir_path.relative_to(target_path)), type: directory, size: None, size_human: -, mtime: datetime.fromtimestamp(stat.st_mtime).strftime(%Y-%m-%d %H:%M:%S), url: str(dir_path.relative_to(target_path)).replace(os.sep, /) / }) for file_name in files: file_path root_path / file_name if not should_ignore(file_path, ignore_patterns, target_path): stat file_path.stat() size stat.st_size items.append({ name: file_name, path: str(file_path.relative_to(target_path)), type: file, size: size, size_human: sizeof_fmt(size), mtime: datetime.fromtimestamp(stat.st_mtime).strftime(%Y-%m-%d %H:%M:%S), url: str(file_path.relative_to(target_path)).replace(os.sep, /) }) else: # 非递归只扫描一层 for entry in target_path.iterdir(): if should_ignore(entry, ignore_patterns, target_path): continue stat entry.stat() item { name: entry.name, path: str(entry.relative_to(target_path)), mtime: datetime.fromtimestamp(stat.st_mtime).strftime(%Y-%m-%d %H:%M:%S), url: str(entry.relative_to(target_path)).replace(os.sep, /) } if entry.is_file(): size stat.st_size item.update({type: file, size: size, size_human: sizeof_fmt(size)}) if entry.is_symlink(): item[type] symlink else: # directory item.update({type: directory, size: None, size_human: -}) item[url] / items.append(item) return items, str(target_path) def render_template(template_path, context, output_path): 使用Jinja2渲染模板。 env Environment( loaderFileSystemLoader(Path(template_path).parent), autoescapeselect_autoescape([html, xml]) ) template env.get_template(Path(template_path).name) html_content template.render(**context) with open(output_path, w, encodingutf-8) as f: f.write(html_content) print(f索引页面已生成: {output_path}) def main(): parser argparse.ArgumentParser(description生成美观的目录索引页面。) parser.add_argument(directory, nargs?, default., help目标目录路径默认为当前目录) parser.add_argument(-o, --output, defaultindex.html, help输出HTML文件路径默认为./index.html) parser.add_argument(-t, --template, defaulttemplate.html, helpJinja2模板文件路径) parser.add_argument(-i, --ignore-file, default.diignore, help忽略规则文件路径) parser.add_argument(-r, --recursive, actionstore_true, help递归遍历子目录) parser.add_argument(--sort-by, choices[name, size, mtime], defaultname, help排序字段) parser.add_argument(--order, choices[asc, desc], defaultasc, help排序顺序) args parser.parse_args() try: # 1. 扫描目录 items, abs_dir_path scan_directory(args.directory, args.recursive, args.ignore_file) # 2. 排序 reverse_order (args.order desc) if args.sort_by name: items.sort(keylambda x: x[name].lower(), reversereverse_order) elif args.sort_by size: # 将目录size为None的大小视为0或一个极小值进行排序 items.sort(keylambda x: x[size] if x[type] file else -1, reversereverse_order) elif args.sort_by mtime: items.sort(keylambda x: x[mtime], reversereverse_order) # 3. 准备模板上下文 context { directory: abs_dir_path, items: items, generated_at: datetime.now().strftime(%Y-%m-%d %H:%M:%S), sort_by: args.sort_by, order: args.order, } # 4. 渲染并输出 render_template(args.template, context, args.output) except Exception as e: print(f错误: {e}, filesys.stderr) sys.exit(1) if __name__ __main__: main()4.3 默认模板设计template.html一个简洁但功能齐全的默认模板是工具好用的关键。这里提供一个基础版本包含表格展示和前端搜索功能。!DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title索引 - {{ directory }}/title style * { box-sizing: border-box; margin: 0; padding: 0; font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, sans-serif; } body { background-color: #f5f7fa; color: #333; line-height: 1.6; padding: 20px; max-width: 1200px; margin: 0 auto; } header { margin-bottom: 30px; padding-bottom: 20px; border-bottom: 1px solid #ddd; } h1 { font-size: 2em; margin-bottom: 10px; color: #2c3e50; } .meta { color: #7f8c8d; font-size: 0.9em; margin-bottom: 20px; } .search-box { margin: 20px 0; } #searchInput { width: 100%; padding: 12px 16px; border: 1px solid #ccc; border-radius: 8px; font-size: 1em; transition: border 0.3s; } #searchInput:focus { outline: none; border-color: #3498db; box-shadow: 0 0 0 3px rgba(52, 152, 219, 0.2); } table { width: 100%; border-collapse: collapse; background: white; border-radius: 8px; overflow: hidden; box-shadow: 0 2px 10px rgba(0,0,0,0.05); } thead { background-color: #3498db; color: white; } th, td { padding: 15px; text-align: left; border-bottom: 1px solid #eee; } tbody tr:hover { background-color: #f8f9fa; } a { color: #2980b9; text-decoration: none; } a:hover { text-decoration: underline; } .type-icon { display: inline-block; width: 20px; text-align: center; margin-right: 8px; } .directory .type-icon::before { content: ; } .file .type-icon::before { content: ; } .symlink .type-icon::before { content: ; } .size { font-family: monospace; text-align: right; color: #555; } .mtime { color: #777; font-size: 0.9em; } footer { margin-top: 40px; text-align: center; color: #95a5a6; font-size: 0.85em; padding-top: 20px; border-top: 1px solid #eee; } .no-results { text-align: center; padding: 40px; color: #7f8c8d; display: none; } /style /head body header h1 目录索引/h1 div classmeta p路径: strong{{ directory }}/strong/p p生成时间: {{ generated_at }} | 项目数: {{ items|length }}/p /div div classsearch-box input typesearch idsearchInput placeholder输入关键词过滤文件/文件夹列表... /div /header main div classno-results idnoResults未找到匹配项。/div table idfileTable thead tr th名称/th th styletext-align: right;大小/th th修改时间/th /tr /thead tbody {% for item in items %} tr class{{ item.type }}>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…