- Wails v2.12.0升级(App绑定新增API、runtime类型扩展) - 修复mermaid暗色主题切换渲染失败(SVG textContent污染→data-mermaid-src保存源码) - 修复代码高亮全语言失效(languageMap静态白名单替代运行时hljs检查) - 文件系统:FileListPanel重写、FileItemRow合并删除、Toolbar简化 - 新增剪贴板图片粘贴(Ctrl+V粘贴图片到当前目录) - 死代码清理:DeviceTest/errorHandler/useLocalStorage移除 - MarkdownEditor优化、theme store增强、CodeMirror加载器精简
396 lines
10 KiB
JavaScript
396 lines
10 KiB
JavaScript
/**
|
||
* 应用全局常量配置
|
||
*
|
||
* @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: /[<>:"/\\|?*]/,
|
||
}
|