/** * 应用全局常量配置 * * @module utils/constants * @description 集中管理所有应用常量,避免硬编码和重复定义 */ /** * localStorage 键名管理 * @description 统一的localStorage键名规范,避免冲突和重复 * * 命名规范:app-{feature}-{key} * - app: 应用级前缀 * - feature: 功能模块标识(filesystem/device-test等) * - key: 具体的数据项 */ export const STORAGE_KEYS = { // 文件系统模块 FILESYSTEM: { FILE_PATH: 'app-filesystem-file-path', FILE_LIST: 'app-filesystem-file-list', FILE_CONTENT: 'app-filesystem-file-content', PATH_HISTORY: 'app-filesystem-path-history', FILE_CONTENT_HEIGHT: 'app-filesystem-file-content-height', PANEL_WIDTH: 'app-filesystem-panel-width', SIDEBAR_VISIBLE: 'app-filesystem-sidebar-visible', FAVORITE_FILES: 'app-filesystem-favorite-files', EDIT_MODE: 'app-filesystem-edit-mode', // HTML/Markdown 编辑模式状态 FILE_DRAFT: 'app-filesystem-file-draft', // 文件草稿 SORT: 'app-filesystem-sort', // 排序状态 COL_SETTINGS: 'app-filesystem-col-settings', // 列配置(显隐+顺序) SHOW_HEADER: 'app-filesystem-show-header', // 表头显隐 }, // 设备测试模块 DEVICE_TEST: { FILE_PATH: 'app-device-test-file-path', FILE_LIST: 'app-device-test-file-list', FILE_CONTENT: 'app-device-test-file-content', PATH_HISTORY: 'app-device-test-path-history', FILE_CONTENT_HEIGHT: 'app-device-test-file-content-height', PANEL_WIDTH: 'app-device-test-panel-width', FAVORITE_FILES: 'app-device-test-favorite-files', }, // 通用配置 COMMON: { THEME: 'app-common-theme', LANGUAGE: 'app-common-language', }, } /** * 文件扩展名分类 * @description 用于文件类型识别和图标映射 */ export const FILE_EXTENSIONS = { // 图片文件 IMAGE: ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'svg', 'webp', 'ico', 'heic', 'heif'], // 视频文件 VIDEO_BROWSER: ['mp4', 'webm', 'ogg', 'mov', 'm4v'], // 浏览器原生支持 VIDEO_EXTERNAL: ['avi', 'mkv', 'wmv', 'flv', 'rmvb', '3gp', 'mts'], // 需要外部播放器(注意:不用 'ts' 避免 TypeScript 冲突) VIDEO: ['mp4', 'webm', 'ogg', 'mov', 'm4v', 'avi', 'mkv', 'wmv', 'flv', 'rmvb', '3gp', 'mts'], // 所有视频 // 音频文件 AUDIO: ['mp3', 'wav', 'flac', 'aac', 'ogg', 'm4a', 'opus', 'webm'], // 文档文件 DOCUMENT: ['doc', 'docx', 'pdf', 'xls', 'xlsx', 'ppt', 'pptx', 'txt', 'rtf', 'odt', 'ods', 'odp'], // 压缩文件 ARCHIVE: ['zip', 'rar', '7z', 'tar', 'gz', 'bz2', 'xz', 'z', 'cab', 'iso'], // 代码文件 CODE: [ 'js', 'ts', 'jsx', 'tsx', 'cts', 'mts', 'cjs', 'mjs', 'vue', 'py', 'java', 'c', 'cpp', 'h', 'go', 'rs', 'php', 'rb', 'cs', 'swift', 'kt', 'scala', 'dart', 'css', 'scss', 'sass', 'less', 'sql', 'sh', 'bat', 'ps1', 'flow', 'pch', 'cc', 'cxx', 'hpp', 'hxx', 'tcc', 'defs', 'makefile', 'mk', 'cmake', 'dockerfile', 'm', 'r', 'matlab' ], // 配置文件(可编辑的文本格式) CONFIG: [ // 数据格式 'json', 'xml', 'yaml', 'yml', // 配置文件 'toml', 'ini', 'cfg', 'conf', // 环境变量/属性 'props', 'env', 'dotenv', // 其他 'manifest', 'lock', 'ignore' ], // 纯文本文件 TEXT: ['txt', 'text', 'log', 'md', 'markdown', 'rst', 'adoc', 'tex', 'msg', 'csv', 'tsv'], // 标记语言文件(用于特殊预览) MARKUP: ['html', 'htm', 'md', 'markdown'], // 数据库文件 DATABASE: ['db', 'sqlite', 'mdb', 'accdb'], // 可执行文件 EXECUTABLE: ['exe', 'msi', 'app', 'dmg', 'deb', 'rpm', 'dll', 'so', 'jsa', 'jar'], // 字体文件 FONT: ['ttf', 'otf', 'woff', 'woff2', 'eot'], } /** * 文件类型图标映射 * @description 根据文件扩展名返回对应的图标 */ export const FILE_ICONS = { // 图片 IMAGE: '🖼️', // 视频 VIDEO: '🎬', // 音频 AUDIO: '🎵', // 文档 PDF: '📕', DOC: '📘', XLS: '📗', PPT: '📙', TXT: '📃', DOCUMENT: '📄', // 压缩包 ARCHIVE: '📦', // 代码 CODE: '💻', // 编程语言特定图标 JAVA: '☕', JAR: '🏺', JSA: '📦', GO: '🐹', PYTHON: '🐍', JAVASCRIPT: '📜', TYPESCRIPT: '💠', HTML: '🌐', CSS: '🎨', SQL: '🗃️', JSON: '📋', XML: '📰', YAML: '⚙️', SHELL: '🐚', C: '🔷', CPP: '🔶', RUST: '🦀', PHP: '🐘', RUBY: '💎', DART: '🎯', DOCKERFILE: '🐳', // 数据库 DATABASE: '🗄️', // 可执行文件 EXECUTABLE: '⚙️', // 字体 FONT: '🔤', // 文件夹 FOLDER: '📁', // 默认文件 FILE: '📄', } /** * 文件类型到图标的映射表 * @description 扩展名 -> 图标 的快速查找表 */ export const FILE_ICON_MAP = new Map() // 初始化图标映射表 const initIconMap = () => { // 图片 FILE_EXTENSIONS.IMAGE.forEach(ext => FILE_ICON_MAP.set(ext, FILE_ICONS.IMAGE)) // 视频 FILE_EXTENSIONS.VIDEO_BROWSER.forEach(ext => FILE_ICON_MAP.set(ext, FILE_ICONS.VIDEO)) FILE_EXTENSIONS.VIDEO_EXTERNAL.forEach(ext => FILE_ICON_MAP.set(ext, FILE_ICONS.VIDEO)) // 音频 FILE_EXTENSIONS.AUDIO.forEach(ext => FILE_ICON_MAP.set(ext, FILE_ICONS.AUDIO)) // 文档 FILE_EXTENSIONS.DOCUMENT.forEach(ext => { if (ext === 'pdf') FILE_ICON_MAP.set(ext, FILE_ICONS.PDF) else if (['doc', 'docx'].includes(ext)) FILE_ICON_MAP.set(ext, FILE_ICONS.DOC) else if (['xls', 'xlsx'].includes(ext)) FILE_ICON_MAP.set(ext, FILE_ICONS.XLS) else if (['ppt', 'pptx'].includes(ext)) FILE_ICON_MAP.set(ext, FILE_ICONS.PPT) else if (ext === 'txt') FILE_ICON_MAP.set(ext, FILE_ICONS.TXT) else FILE_ICON_MAP.set(ext, FILE_ICONS.DOCUMENT) }) // 压缩文件 FILE_EXTENSIONS.ARCHIVE.forEach(ext => FILE_ICON_MAP.set(ext, FILE_ICONS.ARCHIVE)) // 代码文件(通用) FILE_EXTENSIONS.CODE.forEach(ext => FILE_ICON_MAP.set(ext, FILE_ICONS.CODE)) // 配置文件(使用特定图标) const configIcons = { 'json': FILE_ICONS.JSON, 'xml': FILE_ICONS.XML, 'yaml': FILE_ICONS.YAML, 'yml': FILE_ICONS.YAML } FILE_EXTENSIONS.CONFIG.forEach(ext => { FILE_ICON_MAP.set(ext, configIcons[ext] || FILE_ICONS.YAML) }) // 编程语言特定图标 const langIcons = { // Java 'java': FILE_ICONS.JAVA, 'jar': FILE_ICONS.JAR, 'jsa': FILE_ICONS.JSA, // Go 'go': FILE_ICONS.GO, // Python 'py': FILE_ICONS.PYTHON, 'pyw': FILE_ICONS.PYTHON, // JavaScript/TypeScript 'js': FILE_ICONS.JAVASCRIPT, 'jsx': FILE_ICONS.JAVASCRIPT, 'ts': FILE_ICONS.TYPESCRIPT, 'tsx': FILE_ICONS.TYPESCRIPT, 'mjs': FILE_ICONS.JAVASCRIPT, 'cjs': FILE_ICONS.JAVASCRIPT, // Web 'html': FILE_ICONS.HTML, 'htm': FILE_ICONS.HTML, 'xhtml': FILE_ICONS.HTML, 'css': FILE_ICONS.CSS, 'scss': FILE_ICONS.CSS, 'sass': FILE_ICONS.CSS, 'less': FILE_ICONS.CSS, // Shell 'sh': FILE_ICONS.SHELL, 'bash': FILE_ICONS.SHELL, 'zsh': FILE_ICONS.SHELL, 'fish': FILE_ICONS.SHELL, 'cmd': FILE_ICONS.SHELL, 'bat': FILE_ICONS.SHELL, 'ps1': FILE_ICONS.SHELL, // C/C++ 'c': FILE_ICONS.C, 'h': FILE_ICONS.C, 'cpp': FILE_ICONS.CPP, 'hpp': FILE_ICONS.CPP, 'cc': FILE_ICONS.CPP, 'cxx': FILE_ICONS.CPP, // Rust 'rs': FILE_ICONS.RUST, // PHP 'php': FILE_ICONS.PHP, // Ruby 'rb': FILE_ICONS.RUBY, 'gem': FILE_ICONS.RUBY, // SQL 'sql': FILE_ICONS.SQL, // Dart 'dart': FILE_ICONS.DART, // Dockerfile 'dockerfile': FILE_ICONS.DOCKERFILE, } Object.keys(langIcons).forEach(ext => FILE_ICON_MAP.set(ext, langIcons[ext])) // 数据库 FILE_EXTENSIONS.DATABASE.forEach(ext => FILE_ICON_MAP.set(ext, FILE_ICONS.DATABASE)) // 可执行文件 FILE_EXTENSIONS.EXECUTABLE.slice(0, 6).forEach(ext => FILE_ICON_MAP.set(ext, FILE_ICONS.EXECUTABLE)) // 字体 FILE_EXTENSIONS.FONT.forEach(ext => FILE_ICON_MAP.set(ext, FILE_ICONS.FONT)) } // 执行初始化 initIconMap() /** * 常用路径快捷方式 * @description 系统常用路径的emoji标识 */ export const PATH_ICONS = { DESKTOP: '🖥️', DOCUMENTS: '📁', DOWNLOADS: '📥', HOME: '🏠', ROOT: '📂', DRIVE: '💿', } /** * 文件大小单位 * @description 用于文件大小格式化的单位数组 */ export const BYTE_UNITS = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB'] /** * 默认配置值 */ export const DEFAULTS = { // 路径历史最大记录数 MAX_HISTORY_LENGTH: 20, // 收藏夹最大数量 MAX_FAVORITES_LENGTH: 50, // 文件内容高度范围(px) MIN_CONTENT_HEIGHT: 100, MAX_CONTENT_HEIGHT: 800, DEFAULT_CONTENT_HEIGHT: 200, // 面板宽度范围(%) MIN_PANEL_WIDTH: 20, MAX_PANEL_WIDTH: 80, DEFAULT_PANEL_WIDTH: 50, // 侧边栏宽度(px) SIDEBAR_WIDTH: 220, } /** * 文件大小格式化配置 */ export const FILE_SIZE_FORMAT = { UNIT: 1024, // 使用1024进制(KiB, MiB等) DECIMAL_PLACES: 2, // 保留小数位数 } /** * 文件大小阈值配置 * @description 用于文件处理逻辑的大小限制 */ export const FILE_SIZE_THRESHOLDS = { LARGE_FILE: 100 * 1024, // 100KB - 大文件检测阈值 MAX_TEXT_DISPLAY: 5 * 1024 * 1024, // 5MB - 文本文件最大显示大小 } /** * UI 文本常量 * @description 界面上显示的固定文本 */ export const UI_TEXT = { // 对话框标题 CREATE_FILE: '📄 新建文件', CREATE_FOLDER: '📁 新建文件夹', RENAME_FILE: '重命名文件', DELETE_CONFIRM: '确认删除', // 按钮文本 CONFIRM: '确定', CANCEL: '取消', CREATE: '创建', SAVE: '保存', DELETE: '删除', // 提示信息 FILE_NAME_EMPTY: '请输入内容', FILE_NAME_INVALID: '文件名包含非法字符', FOLDER_NAME_INVALID: '文件夹名包含非法字符', FILE_EXISTS: '文件已存在', FOLDER_EXISTS: '文件夹已存在', SELECT_DIRECTORY: '请先选择一个目录', CREATE_SUCCESS: '创建成功', CREATE_FAILED: '创建失败', // 输入提示 ENTER_FILE_NAME: '请输入文件名(如: todo.md)', ENTER_FOLDER_NAME: '请输入文件夹名称', } /** * 验证规则 * @description 数据验证的正则表达式规则 */ export const VALIDATION_RULES = { // Windows 文件名非法字符 ILLEGAL_FILE_NAME_CHARS: /[<>:"/\\|?*]/, }