Private
Public Access
1
0
Files
u-desk/web/src/utils/constants.js
绝尘 7dbd57a8b6 重构:Wails升级/mermaid主题切换/代码高亮修复/文件系统UI重构
- 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加载器精简
2026-04-11 16:49:10 +08:00

396 lines
10 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 应用全局常量配置
*
* @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: /[<>:"/\\|?*]/,
}