feat: 构建系统重构 + VCHSM 架构迁移 + 右键菜单修复 + 尺寸参数统一
## 构建、打包与分发系统重构 (build/) - 构建系统收敛至 build/ 目录:build.mjs + electron-builder.js + 6 个脚本 - electron-builder 配置从 package.json 提取为 build/electron-builder.js - 新增 --edition (personal/enterprise) 和 --channel (stable/beta/alpha) 参数 - OSS 路径按渠道隔离 - 新增 pre-build-check.mjs:Git/CHANGELOG/版本/环境变量校验 - 新增 bump-version.mjs:版本号管理 + CHANGELOG 自动生成 - updater.ts 发送 channel/edition/deviceFingerprint - 新增 src/shared/utils/rollout.ts 灰度测试工具 - 新增 10 条 NPM 脚本 ## VCHSM 五层架构迁移 - 7 个业务模块 + ~500 处导入路径同步 ## 修复 - MediaCardContextMenu 改用共享 ContextMenu 组件 - ComboBox 尺寸参数显示统一 (size-format.ts) ## 文档 - UpdateA.md / build/README.md / README.md / .env.example 更新 Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
274
PROJECT.md
274
PROJECT.md
@@ -38,7 +38,7 @@
|
||||
- 事件驱动(EDA):
|
||||
1. 主进程与渲染进程通信基于 Electron IPC(ipcMain/ipcRenderer),定义明确的事件通道与载荷类型。
|
||||
|
||||
2. 渲染进程内跨组件通信优先使用 Context;需要解耦的场景使用自定义事件总线(src/utils/event-bus.ts),
|
||||
2. 渲染进程内跨组件通信优先使用 Context;需要解耦的场景使用自定义事件总线(src/shared/utils/bus.ts),
|
||||
所有 emit 调用自动记录到日志文件用于审计追踪。
|
||||
|
||||
3. 自定义错误体系(RequestError / RefreshError)通过事件总线解耦:请求拦截器抛出自定义错误 →
|
||||
@@ -56,157 +56,123 @@
|
||||
|
||||
# 目录结构
|
||||
|
||||
> 每个文件夹下均有 `README.md` 说明该目录的职责与代码边界(自动生成,不进 Git)。
|
||||
> 2026-06-29 重构:业务模块从 `pages/` + `services/modules/` 分散模式统一为 `modules/` 下的
|
||||
> VCHSM 五层架构(Views → Controllers → Hooks → Settings → Model)。
|
||||
|
||||
```md
|
||||
├── electron/ # Electron 主进程 + 预加载
|
||||
│ ├── main.ts # 入口编排:窗口创建 / IPC 注册 / 生命周期
|
||||
│ ├── preload.ts # contextBridge:向渲染进程暴露安全 API
|
||||
│ ├── electron-env.d.ts # 类型声明(APP_ROOT、Window 扩展)
|
||||
│ └── main/ # 主进程核心模块
|
||||
│ │ ├── load-env.ts # .env.{mode} + .env.local 加载器
|
||||
│ │ ├── logger.ts # 日志核心:JSON Lines / 每日轮转 / 批量冲刷
|
||||
│ │ ├── net-request.ts # Electron net.request 的 axios 风格封装
|
||||
│ │ ├── updater.ts # 自动更新:自定义 Provider + 平台 Updater
|
||||
│ │ ├── menu/index.ts # 系统菜单(macOS Edit / Win 无菜单)
|
||||
│ │ ├── ipc/ # IPC handler 集合
|
||||
│ │ │ ├── log-ipc.ts # 渲染进程日志 → 主进程日志桥接
|
||||
│ │ │ ├── safe-storage-ipc.ts # safeStorage 加密/解密 IPC handler
|
||||
│ │ │ └── storage-ipc.ts # 沙箱文件存储 IPC handler(heixiu-data/)
|
||||
│ │ └── utils/ # 平台判断 / 图标路径
|
||||
│ └── preload/ # 预加载脚本(contextBridge 桥接层)
|
||||
│ ├── device.ts # 硬件指纹采集(wmic/powershell | ioreg/sysctl)
|
||||
│ └── device_service.ts # 设备信息缓存层(机器码/IP/MAC)
|
||||
├── src/ # 渲染进程(React 19 + Vite + TypeScript)
|
||||
│ ├── main.tsx # React 挂载 + Provider 嵌套 + 全局错误捕获
|
||||
│ ├── App.tsx # 根组件:叠加层编排(登录/设置/页面调度)
|
||||
│ ├── vite-env.d.ts # Vite 类型声明
|
||||
│ ├── components/ # 通用组件层
|
||||
│ │ ├── providers/ # 全局 Context Provider
|
||||
│ │ │ ├── AppProvider.tsx # 认证状态(login/logout/Token 刷新)
|
||||
│ │ │ ├── ThemeProvider.tsx # 亮/暗主题切换 + antd ConfigProvider
|
||||
│ │ │ └── SettingsProvider.tsx # 本地持久化设置(存储路径等)
|
||||
│ │ ├── frame/ # 应用框架(外层结构 + 页面调度)
|
||||
│ │ │ ├── Layout.tsx # 全高 flex 列布局壳
|
||||
│ │ │ ├── PageDispatcher.tsx # 通用页面调度器(Modal/Drawer/FloatingPanel)
|
||||
│ │ │ └── navbar/ # 导航栏(nav-config → NavBar → NavItem)
|
||||
│ │ └── ui/ # 通用 UI 原子组件
|
||||
│ │ ├── FloatingPanel.tsx # 可拖拽非模态浮动面板
|
||||
│ │ ├── LegalTextModal.tsx # 法律/协议文本 Modal
|
||||
│ │ ├── FormField.tsx # 通用表单字段渲染器(数据驱动,从 auth/components 提升)
|
||||
│ │ └── types.ts # FieldConfig / FieldRule / InputType 通用类型
|
||||
│ ├── hooks/ # 自定义 Hooks
|
||||
│ │ ├── use-async.ts # 通用异步基础设施(竞态/取消/门控)
|
||||
│ │ ├── use-api.ts # 业务 API Hooks(Banner/模型/任务/账户/财务)
|
||||
│ │ └── use-updater.ts # 更新状态机(单例 IPC 监听)
|
||||
│ ├── infrastructure/ # 基础设施层
|
||||
│ │ └── storage/ # 本地加密数据库(core/ + stores/ + services/)
|
||||
│ │ ├── index.ts # 统一入口:init/clear/stats + 全部 re-export
|
||||
│ │ ├── ipc-file.ts # 渲染进程端文件操作桥接
|
||||
│ │ ├── core/ # 数据库核心(4 文件)
|
||||
│ │ │ ├── db-core.ts # sql.js WASM 初始化 + 通用 CRUD
|
||||
│ │ │ ├── db-encrypt.ts # 序列化 → safeStorage 加密 → IPC 写磁盘
|
||||
│ │ │ ├── schema.ts # 6 张业务表 DDL(含索引)
|
||||
│ │ │ └── types.ts # 实体类型定义
|
||||
│ │ ├── stores/ # 实体 CRUD Store(5 文件)
|
||||
│ │ │ ├── task-store.ts # 任务记录
|
||||
│ │ │ ├── order-store.ts # 订单记录(充值 + VIP)
|
||||
│ │ │ ├── param-store.ts # 参数历史快照
|
||||
│ │ │ ├── media-store.ts # 媒体缓存元数据
|
||||
│ │ │ └── settings-store.ts # 应用设置 key-value
|
||||
│ │ └── services/ # 高级服务(4 文件)
|
||||
│ │ ├── media-loader.ts # 媒体下载与三级缓存
|
||||
│ │ ├── sync-manager.ts # 分页同步游标
|
||||
│ │ ├── data-sync.ts # 数据同步辅助(从 settings/sections 归位)
|
||||
│ │ └── user-scope.ts # 用户作用域隔离(JWT user_id)
|
||||
│ ├── pages/ # 业务页面(按功能模块组织)
|
||||
│ │ ├── auth/ # 认证模块
|
||||
│ │ │ ├── index.tsx # LoginPage Modal(登录/注册 Tabs)
|
||||
│ │ │ ├── components/ # 表单组件(LoginForm/RegisterForm/FormField/改密/忘记密码)
|
||||
│ │ │ ├── config/ # 字段配置(login-fields/register-fields)+ 校验函数库
|
||||
│ │ │ └── hooks/ # use-auth-state(偏好)/ use-sms-cooldown(短信冷却)
|
||||
│ │ ├── home/ # 首页主工作区
|
||||
│ │ │ ├── HomePage.tsx # 首页入口
|
||||
│ │ │ ├── HomeContent.tsx # 三列可拖拽面板 + HomeContext.Provider
|
||||
│ │ │ ├── HomeContext.tsx # 共享状态(选中模型/任务/分页)
|
||||
│ │ │ ├── panels/ # 三列面板容器(Left/Center/Right)
|
||||
│ │ │ ├── features/ # 功能模块(Banner/ModelSelector/ModelInputForm/TaskHistory/OutputPreview)
|
||||
│ │ │ ├── controls/ # Widget 控件体系(6 种 Qt→React 映射 + WIDGET_MAP)
|
||||
│ │ │ │ ├── types.ts # WidgetProps 统一接口
|
||||
│ │ │ │ ├── index.ts # WIDGET_MAP 注册表
|
||||
│ │ │ │ ├── simple-widgets.tsx # 6 个简单控件(Checkbox/LineInput/TextInput/ComboBox/SpinBox/DoubleSpinBox)
|
||||
│ │ │ │ ├── upload-widgets.tsx # 单文件上传(ImageInput/VideoInput,共享 enable_switch)
|
||||
│ │ │ │ ├── list-upload-widgets.tsx # 多文件拖拽上传(ImageListInput/AudioListInput)
|
||||
│ │ │ │ └── SeedanceContent.tsx # 复合内容编排
|
||||
│ │ │ └── hooks/ # useModelUI(param_schema → UIFieldConfig)
|
||||
│ │ ├── panels/ # NavBar 触发的功能面板页
|
||||
│ │ │ ├── AccountInfo.tsx # 账户信息(用户/积分/套餐/统计)
|
||||
│ │ │ ├── BillingInfo.tsx # 财务信息(余额 + 账单流水)
|
||||
│ │ │ ├── OrdersPage.tsx # 订单明细(充值/VIP 双 Tab + 轮询)
|
||||
│ │ │ ├── RechargePage.tsx # 积分充值(预设/自定义金额 + 支付追踪)
|
||||
│ │ │ ├── VipPage.tsx # VIP 开通(激活码/套餐选购/权益预览)
|
||||
│ │ │ └── WechatWorkPage.tsx # 企业微信二维码
|
||||
│ │ └── settings/ # 设置页面
|
||||
│ │ ├── SettingsPage.tsx # 设置 Modal 主页面
|
||||
│ │ └── sections/ # 6 个设置分区(主题/系统/更新/路径/密码/数据)
|
||||
│ ├── services/ # 服务层(HTTP 请求封装)
|
||||
│ │ ├── request.ts # Axios 实例:拦截器 + Token 注入 + 401 刷新队列
|
||||
│ │ ├── auth-token.ts # Token 生命周期(refresh_token 持久化/主动刷新)
|
||||
│ │ ├── auth-persistence.ts # 登录表单偏好(用户名回填/记住密码/自动登录)
|
||||
│ │ ├── types.ts # 通用 API 类型(ApiResponse/RequestError/RefreshError)
|
||||
│ │ ├── cache/ # 客户端缓存
|
||||
│ │ │ └── model-cache.ts # 模型列表加密本地缓存
|
||||
│ │ └── modules/ # API 模块(按业务域拆分)
|
||||
│ │ ├── auth.ts # 认证 API(登录/注册/刷新/用户/改密/短信)
|
||||
│ │ ├── models.ts # 模型 API + 分类常量
|
||||
│ │ ├── task.ts # 任务 API(CRUD + 批量状态 + CSV + 轮询常量)
|
||||
│ │ ├── banner.ts # Banner/轮播图 API
|
||||
│ │ ├── billing.ts # 财务 API(余额/账单/导出)
|
||||
│ │ ├── payments.ts # 支付 API(订单 CRUD + 状态映射)
|
||||
│ │ ├── vip-api.ts # VIP API(激活/等级/订单)
|
||||
│ │ └── announcement.ts # 公告 API + 类型标签颜色
|
||||
│ ├── theme/ # 主题系统
|
||||
│ │ ├── tokens.ts # TypeScript 设计令牌
|
||||
│ │ ├── tokens.css # CSS 设计令牌(Tailwind @theme + CSS 变量亮/暗)
|
||||
│ │ ├── antd-theme.ts # Ant Design ConfigProvider 主题配置(亮/暗)
|
||||
│ │ ├── transitions.css # 主题切换过渡(View Transitions API + CSS fallback)
|
||||
│ │ ├── base.css # 全局重置(盒模型/滚动条/聚焦环/拖拽区域)
|
||||
│ │ └── globals.css # 入口文件(按序导入以上 CSS)
|
||||
│ └── utils/ # 渲染进程工具函数(7 文件,已按功能合并)
|
||||
│ ├── env.ts # 运行时环境:平台检测 + 设备 ID(← platform + device)
|
||||
│ ├── bus.ts # 通信层:事件总线 + IPC 守卫 + 日志(← event-bus + ipc + logger)
|
||||
│ ├── display.ts # 展示/格式化:金额、日期、Logo、Nullable<T>(← display + logo + type)
|
||||
│ ├── enum-resolver.ts # 枚举外观模式(7 模块标签/颜色统一解析)
|
||||
│ ├── pricing.ts # 成本计算(Python 六种定价模式移植)
|
||||
│ ├── safe-storage.ts # 加密 localStorage 封装(safeStorage 桥接)
|
||||
│ └── media-upload.ts # 媒体上传共享工具(← controls/media-upload-utils)
|
||||
├── shared/ # 主进程 & 渲染进程共享
|
||||
│ ├── constants/
|
||||
│ │ ├── app.ts # 应用名称/版本类型/窗口标题
|
||||
│ │ ├── ipc-channels.ts # 全部 IPC 通道名称(三类命名空间)
|
||||
│ │ └── version.ts # 从 package.json 读取版本号
|
||||
│ ├── types/
|
||||
│ │ ├── index.ts # 通用类型(Platform/Theme/Edition/Update/Window)
|
||||
│ │ └── logging.ts # 日志类型(LogLevel/LogCategory/LogEntry)
|
||||
│ └── utils/
|
||||
│ ├── index.ts # 纯工具函数(debounce/throttle/compareVersions/deepClone)
|
||||
│ └── sanitize.ts # 日志脱敏(token/密码/邮箱/手机/ID/金额)
|
||||
├── scripts/ # 构建与发布脚本
|
||||
│ ├── clean.mjs # 清理构建产物
|
||||
│ ├── generate-update-info.mjs # 生成 update-info.json(SHA512 + CHANGELOG)
|
||||
│ ├── upload-oss.mjs # 上传安装包到阿里云 OSS
|
||||
│ └── publish-release.mjs # 发布版本到后端 API
|
||||
├── build.mjs # electron-builder 构建总管
|
||||
├── vite.config.ts # Vite 构建配置
|
||||
├── package.json # 含 electron-builder 打包配置
|
||||
├── electron/ # Electron 主进程 + 预加载
|
||||
│ ├── main.ts # 入口编排:窗口创建 / IPC 注册 / 生命周期
|
||||
│ ├── preload.ts # contextBridge:向渲染进程暴露安全 API
|
||||
│ ├── electron-env.d.ts # 类型声明(APP_ROOT、Window 扩展)
|
||||
│ └── main/ # 主进程核心模块
|
||||
│ │ ├── load-env.ts # .env.{mode} + .env.local 加载器
|
||||
│ │ ├── logger.ts # 日志核心:JSON Lines / 每日轮转 / 批量冲刷
|
||||
│ │ ├── net-request.ts # Electron net.request 的 axios 风格封装
|
||||
│ │ ├── updater.ts # 自动更新:自定义 Provider + 平台 Updater
|
||||
│ │ ├── menu/index.ts # 系统菜单(macOS Edit / Win 无菜单)
|
||||
│ │ ├── ipc/ # IPC handler 集合
|
||||
│ │ │ ├── log-ipc.ts # 渲染进程日志 → 主进程日志桥接
|
||||
│ │ │ ├── safe-storage-ipc.ts # safeStorage 加密/解密 IPC handler
|
||||
│ │ │ ├── storage-ipc.ts # 沙箱文件存储 IPC handler(heixiu-data/)
|
||||
│ │ │ └── canvas-ipc.ts # 画布文件操作 IPC handler
|
||||
│ │ └── utils/ # 平台判断 / 图标路径
|
||||
│ └── preload/ # 预加载脚本(contextBridge 桥接层)
|
||||
│ ├── device.ts # 硬件指纹采集
|
||||
│ └── device_service.ts # 设备信息缓存层
|
||||
│
|
||||
├── src/ # 渲染进程(React 19 + Vite + TypeScript)
|
||||
│ │
|
||||
│ ├── app/ # ═══ 应用壳 ═══
|
||||
│ │ ├── App.tsx # 根组件:叠加层编排(登录/设置/页面调度)
|
||||
│ │ ├── main.tsx # React 挂载 + Provider 嵌套 + 全局错误捕获
|
||||
│ │ ├── providers/ # 全局 Context Provider
|
||||
│ │ │ ├── AppProvider.tsx # 认证状态(login/logout/Token 刷新)
|
||||
│ │ │ ├── ThemeProvider.tsx # 亮/暗主题切换 + antd ConfigProvider
|
||||
│ │ │ └── SettingsProvider.tsx # 本地持久化设置(存储路径等)
|
||||
│ │ └── layout/ # 布局框架
|
||||
│ │ ├── Layout.tsx # 全高 flex 列布局壳(NavBar + 内容区)
|
||||
│ │ └── PageDispatcher.tsx # 通用页面调度器(Modal/Drawer/FloatingPanel)
|
||||
│ │
|
||||
│ ├── modules/ # ═══ 业务模块(VCHSM 五层架构)═══
|
||||
│ │ │ # V=views C=controllers H=hooks S=settings M=model
|
||||
│ │ ├── navbar/ V+C+S+M # 导航栏 UI 壳
|
||||
│ │ │ ├── views/ # NavBar.tsx / NavItem.tsx
|
||||
│ │ │ ├── settings/ # nav-config.ts(左右导航项注册表)
|
||||
│ │ │ └── model/ # 导航类型定义
|
||||
│ │ ├── announcement/ V+C # 公告(Badge 角标 + 15 分钟轮询缓存)
|
||||
│ │ │ ├── views/ # AnnouncementDrawer.tsx
|
||||
│ │ │ └── controllers/ # announcement-api.ts
|
||||
│ │ ├── auth/ V+C+H+S+M # 认证模块(14 文件)
|
||||
│ │ │ ├── views/ # AuthPage.tsx + components/(LoginForm/RegisterForm/改密/忘记密码)
|
||||
│ │ │ ├── controllers/ # auth-api.ts / token-manager.ts / auth-persistence.ts
|
||||
│ │ │ ├── hooks/ # use-auth-state.ts / use-sms-cooldown.ts
|
||||
│ │ │ ├── settings/ # login-fields.ts / register-fields.ts / validators.ts
|
||||
│ │ │ └── model/ # 类型定义
|
||||
│ │ ├── home/ V+C+H+S+M # 主工作区(三栏布局 → VCHSM 嵌套)
|
||||
│ │ │ ├── views/
|
||||
│ │ │ │ ├── HomePage.tsx / HomeContent.tsx
|
||||
│ │ │ │ ├── left/ # 左侧栏 — 输入控件(LeftPanel + controls/)
|
||||
│ │ │ │ ├── center/ # 中央栏 — 预览区(CenterPanel)
|
||||
│ │ │ │ └── right/ # 右侧栏 — 模型/任务/输出/Banner
|
||||
│ │ │ ├── controllers/ # task-api.ts / model-api.ts / banner-api.ts / menus/
|
||||
│ │ │ ├── hooks/ # useModelUI.ts
|
||||
│ │ │ ├── stores/ # HomeContext.tsx(页面级状态)
|
||||
│ │ │ └── model/ # 类型定义
|
||||
│ │ ├── account/ V+C # 账户与支付(6 子功能独立子目录)
|
||||
│ │ │ ├── views/ # info/ vip/ recharge/ billing/ orders/ wechat-work/
|
||||
│ │ │ └── controllers/ # vip-api.ts / payment-api.ts / billing-api.ts
|
||||
│ │ ├── canvas/ V+C+H+M+S # 无限画布 + 项目管理
|
||||
│ │ │ ├── views/ # CanvasApp.tsx / CanvasPage.tsx
|
||||
│ │ │ │ ├── core/ # CanvasViewport / LODImage / MediaCard / MediaPreview
|
||||
│ │ │ │ ├── navigation/ # CanvasSidebar / ProjectSelector / EpisodeSelector / ShotList
|
||||
│ │ │ │ └── toolbar/ # CanvasToolbar / CanvasFilterBar / CategoryTabs / StageTabs
|
||||
│ │ │ ├── controllers/ # menus/(右键菜单注册)
|
||||
│ │ │ ├── hooks/ # useCanvasInteraction / useDirectoryScan / useSidecarSync
|
||||
│ │ │ ├── stores/ # useCanvasStore.ts(Zustand store)
|
||||
│ │ │ └── utils/ # scanner.ts / layout.ts / LocalFileDataSource.ts
|
||||
│ │ └── settings/ V+C # 应用设置
|
||||
│ │ ├── views/ # SettingsPage.tsx + sections/(6 个设置分区)
|
||||
│ │ └── controllers/ # settings-actions.ts
|
||||
│ │
|
||||
│ └── shared/ # ═══ 跨模块共享 ═══
|
||||
│ ├── components/ # 通用 UI(FloatingPanel / FormField / LegalTextModal / ContextMenu)
|
||||
│ ├── hooks/ # 全局 Hooks(useAnnouncements / useApi / useAsync / useUpdater)
|
||||
│ ├── services/ # HTTP 客户端 http.ts + API 类型
|
||||
│ ├── utils/ # 工具函数(bus / env / enum-resolver / display / pricing / safe-storage)
|
||||
│ ├── infrastructure/storage/ # 本地加密数据库(sql.js + safeStorage)
|
||||
│ │ ├── core/ # db-core.ts / db-encrypt.ts / schema.ts
|
||||
│ │ ├── stores/ # task-store / order-store / media-store / settings-store
|
||||
│ │ └── services/ # media-loader / sync-manager / data-sync / user-scope
|
||||
│ └── theme/ # 主题系统(tokens / antd-theme / CSS 过渡)
|
||||
│
|
||||
├── shared/ # 主进程 & 渲染进程共享(根级 @shared 别名)
|
||||
│ ├── constants/ # app.ts / ipc-channels.ts / version.ts / keyboard.ts
|
||||
│ ├── types/ # index.ts(Platform/Theme/Edition)/ logging.ts
|
||||
│ └── utils/ # sanitize.ts(日志脱敏)+ index.ts(通用工具)
|
||||
│
|
||||
├── scripts/ # 构建与发布脚本
|
||||
├── vite.config.ts # Vite 构建配置
|
||||
├── package.json # 含 electron-builder 打包配置
|
||||
└── pnpm-workspace.yaml
|
||||
```
|
||||
|
||||
### VCHSM 五层架构说明
|
||||
|
||||
| 层 | 目录 | 职责 | 示例 |
|
||||
|----|------|------|------|
|
||||
| **V** views | `views/` | 页面组件,纯 JSX 结构 | `NavBar.tsx`, `VipPage.tsx`, `CanvasViewport.tsx` |
|
||||
| **C** controllers | `controllers/` | 交互逻辑 + API 请求 + 菜单注册 | `auth-api.ts`, `task-api.ts`, `menus/` |
|
||||
| **H** hooks | `hooks/` | 组件间复用逻辑(状态/副作用/数据流) | `use-auth-state.ts`, `useCanvasInteraction.ts` |
|
||||
| **S** settings | `settings/` | 配置常量、字段映射、验证规则、注册表 | `nav-config.ts`, `login-fields.ts` |
|
||||
| **M** model | `model/` | 纯 TS 类型/接口/枚举(编译时) | `types.ts` |
|
||||
|
||||
模块按需建层:navbar 只用 V+S+M,auth 用 V+C+H+S+M,canvas 额外有 stores/ + utils/。
|
||||
|
||||
# 多窗口与平台判定
|
||||
|
||||
- 窗口管理由 `electron/main.ts` 统一负责:`createMainWindow()` 创建主窗口,`BrowserWindow` 通过 `contextIsolation: true` + `nodeIntegration: false` 运行沙箱化渲染进程。辅助窗口通过 `RENDERER_TO_MAIN.OPEN_SUB_WINDOW` IPC 通道按需创建。
|
||||
|
||||
- 平台判定双端各有一份:`electron/main/utils/platform.ts`(主进程,直接使用 `process.platform`)和 `src/utils/platform.ts`(渲染进程,优先 `process.platform`,降级 `navigator.userAgent`)。
|
||||
- 平台判定双端各有一份:`electron/main/utils/platform.ts`(主进程,直接使用 `process.platform`)和 `src/shared/utils/env.ts`(渲染进程,优先 `process.platform`,降级 `navigator.userAgent`)。
|
||||
|
||||
- 打包配置 (`package.json` build 字段) 须针对平台设置不同的图标、签名策略、安装包格式。
|
||||
|
||||
@@ -238,7 +204,7 @@
|
||||
## 状态管理
|
||||
|
||||
- 使用 React Context + Provider 模式管理全局状态,按领域拆分:AppContext(平台/登录)、ThemeContext(主题)、
|
||||
SettingsContext(设置项)。各 Context 定义与 Provider 合并在 `components/providers/` 目录下,避免引入 Redux 等重量级方案。
|
||||
SettingsContext(设置项)。各 Context 定义与 Provider 合并在 `app/providers/` 目录下,避免引入 Redux 等重量级方案。
|
||||
|
||||
- Provider 在 main.tsx 中按层级嵌套挂载:
|
||||
AppProvider → ThemeProvider → SettingsProvider → AntdApp → App
|
||||
@@ -249,7 +215,7 @@
|
||||
|
||||
## 日志系统
|
||||
|
||||
- 双端日志:主进程直接写文件(electron/main/logger.ts),渲染进程通过 IPC send 上报(src/utils/logger.ts)。
|
||||
- 双端日志:主进程直接写文件(electron/main/logger.ts),渲染进程通过 IPC send 上报(src/shared/utils/bus.ts)。
|
||||
两端暴露一致的 API:`logger.debug / info / warn / error(category, message, error?, context?)`。
|
||||
|
||||
- 文件存储:JSON Lines 格式(每行一个 JSON),路径 `{userData}/logs/app-YYYY-MM-DD.log`,
|
||||
@@ -275,9 +241,9 @@
|
||||
- Linux → libsecret
|
||||
- 实现文件:
|
||||
- `electron/main/safe-storage-ipc.ts` — 主进程加密/解密 IPC 处理(`BIDIRECTIONAL.SAFESTORAGE_ENCRYPT / DECRYPT`)
|
||||
- `src/utils/safe-storage.ts` — 渲染进程桥接层(`initSafeStore / getSafeStore / setSafeStore / clearSafeStore`)
|
||||
- `src/services/request.ts` — token 存取通过 `getSafeStore / setSafeStore`,无需感知加密细节
|
||||
- `src/services/auth-token.ts` — refresh_token 同理通过 safeStorage 存取
|
||||
- `src/shared/utils/safe-storage.ts` — 渲染进程桥接层(`initSafeStore / getSafeStore / setSafeStore / clearSafeStore`)
|
||||
- `src/shared/services/http.ts` — token 存取通过 `getSafeStore / setSafeStore`,无需感知加密细节
|
||||
- `src/modules/auth/controllers/token-manager.ts` — refresh_token 同理通过 safeStorage 存取
|
||||
|
||||
## 双 Token 机制
|
||||
|
||||
@@ -293,15 +259,15 @@
|
||||
|
||||
- `shared/utils/sanitize.ts` 在日志写入前自动脱敏处理
|
||||
- 覆盖字段:用户 ID(SHA256 哈希)、邮箱(`***@domain`)、手机号(掩码)、用户名称、Token(截断)
|
||||
- 主进程 `electron/main/logger.ts` 和渲染进程 `src/utils/logger.ts` 均写入前调用 `sanitizeLogEntry()`
|
||||
- 主进程 `electron/main/logger.ts` 和渲染进程 `src/shared/utils/bus.ts` 均写入前调用 `sanitizeLogEntry()`
|
||||
|
||||
# 样式与主题
|
||||
|
||||
- 优先使用 Tailwind 工具类完成布局与常规样式。自定义设计令牌在 `src/theme/tokens.css` 的 `@theme` 块中定义(Tailwind v4 语法),自动生成 `bg-primary-500`、`text-secondary` 等工具类。
|
||||
- 优先使用 Tailwind 工具类完成布局与常规样式。自定义设计令牌在 `src/shared/theme/tokens.css` 的 `@theme` 块中定义(Tailwind v4 语法),自动生成 `bg-primary-500`、`text-secondary` 等工具类。
|
||||
|
||||
- Ant Design 组件样式通过 ConfigProvider 的 theme 属性覆盖,确保与 Tailwind 主题令牌同步。
|
||||
`ConfigProvider` 同时配置 `locale={zhCN}` 实现全局中文(分页器"条/页"等无需逐个组件设置)。
|
||||
在 src/theme/ 中创建 antd-theme.ts,导出主题配置对象,引用 tokens.ts 中的设计变量。
|
||||
在 src/shared/theme/ 中创建 antd-theme.ts,导出主题配置对象,引用 tokens.ts 中的设计变量。
|
||||
组件级 token(如 Pagination.itemActiveColor / itemActiveBg)在 sharedComponents 中统一管理,
|
||||
亮色/暗色主题共享,避免 CSS !important hack。
|
||||
|
||||
@@ -314,7 +280,7 @@
|
||||
- 所有 IPC 通道名称定义在 shared/constants/ipc-channels.ts 中,分为三类:
|
||||
MAIN_TO_RENDERER / RENDERER_TO_MAIN / BIDIRECTIONAL。
|
||||
|
||||
- 渲染进程通过 src/utils/ipc.ts 中的安全守卫访问 IPC(hasIpc 检查 → safeIpcOn / send / invoke),
|
||||
- 渲染进程通过 src/shared/utils/bus.ts 中的安全守卫访问 IPC(hasIpc 检查 → safeIpcOn / send / invoke),
|
||||
非 Electron 环境下静默跳过,保证浏览器预览不崩溃。
|
||||
|
||||
- 主进程事件处理函数需做好错误捕获与日志记录,渲染进程调用 IPC 时使用 try-catch 并处理超时。
|
||||
@@ -355,8 +321,8 @@
|
||||
| `checkForUpdates` | `electron/main/updater.ts` | 预检版本 → 无更新直发 IPC / 有更新交 electron-updater |
|
||||
| `downloadUpdate` | `electron/main/updater.ts` | 用户确认后触发下载(从 checkForUpdates 分离) |
|
||||
| `netRequest` | `electron/main/net-request.ts` | Electron net.request 的 axios 风格封装 |
|
||||
| `useUpdater` | `src/hooks/use-updater.ts` | 渲染进程更新状态 Hook(单例 IPC 监听) |
|
||||
| `UpdateSetting` | `src/pages/settings/blocks/UpdateSetting.tsx` | 设置页更新区块(含"查看详情"弹窗) |
|
||||
| `useUpdater` | `src/shared/hooks/use-updater.ts` | 渲染进程更新状态 Hook(单例 IPC 监听) |
|
||||
| `UpdateSetting` | `src/modules/settings/views/sections/UpdateSetting.tsx` | 设置页更新区块(含"查看详情"弹窗) |
|
||||
| `server.py` | `test-server/server.py` | 本地测试服务器,扫描 release/ 目录,语义版本排序 |
|
||||
|
||||
## 增量更新(差分下载)
|
||||
|
||||
Reference in New Issue
Block a user