# DCAlc 前端迁移探索分析 ## 项目状态 - **frontend**:旧项目,功能完整 - Pages: Home, Character(Equipment/Skill/Forge) - 组件库:自研 calc-* 组件库(UnoCSS) - 样式:SCSS,暗黑 DNF 风格(棕金色) - API: /info, /calc - **frontendNew**:新项目,早期阶段 - Pages: Home, Dcalc(DnfHelper) - 组件库:shadcn-vue + reka-ui + lucide-vue - 样式:Tailwind CSS 4 - 仅实现了 DnfHelper 模块 ## 主要技术栈差异 | 方面 | frontend | frontendNew | |------|----------|-----------| | Vue Router | 4.5.0 | 5.0.4 | | TypeScript | ~5.8.0 | ~6.0.0 | | 样式方案 | UnoCSS + SCSS | Tailwind CSS 4 | | 组件库 | 自研 calc-* | shadcn-vue + reka-ui | | 图标库 | 内置 | lucide-vue-next | | 状态管理 | Pinia (同版本) | Pinia (同版本) | ## 业务模块复杂度评估 1. **Home 页面** - 简单 2. **DnfHelper** - 中等(已部分实现) 3. **Equipment 装备** - 高(复杂组件层级) 4. **Skill 技能** - 中等(树形/列表) 5. **Forge 打造** - 高(多标签页面) ## 迁移风险 - calc-* 组件完全重写(shadcn-vue) - 样式系统从 UnoCSS 转换到 Tailwind - 路由结构升级(Vue Router 5) - 组件复用和嵌套关系复杂 ## Equipment 完整文件清单 ### Frontend 版本 - 页面层: `src/pages/Character/EquipmentDictionary/Index.vue` (主页面) - 页面工具: `src/pages/Character/EquipmentDictionary/formatData.ts` - 页面选项: `src/pages/Character/EquipmentDictionary/components/options.vue` - 组件层: - `src/components/dnf/Equipment/Icon/index.vue` - `src/components/dnf/Equipment/Info/index.vue` - `src/components/dnf/Equipment/List/index.vue` - `src/components/dnf/Equipment/Oath/index.vue` - `src/components/dnf/Equipment/PartSelect/index.vue` - `src/components/dnf/Equipment/RaritySelect/index.vue` - `src/components/dnf/Equipment/SuitInfo/index.vue` ### 已迁移模式分析 (DnfHelper) - 位置: frontendNew/src/pages/Dcalc/DnfHelper/ - 使用 shadcn-vue 原生组件 - Tailwind CSS 4 样式 - useLocalStorage 本地存储模式 ## Equipment 迁移状态 - **未迁移**:frontendNew 中没有对应的 Equipment 页面和组件 - **frontend 中的关键文件**: - Pages: `/pages/Character/Equipment/` (已禁用), `/pages/Character/EquipmentDictionary/Index.vue` (当前使用) - 组件库 (7 子组件): Icon, Info, List, Oath, PartSelect, RaritySelect, SuitInfo - 工具函数: `formatData.ts` (formatEqu, formatOath) - 数据处理: 复杂的排列、分组、筛选逻辑 ## DnfHelper 迁移分析(已实现) - **Pages**: `/pages/Dcalc/DnfHelper/` - bind.vue: 表单组件 (InputGroup, Button, Field) - list.vue: 网格列表 (Card, Grid) - index.vue: 容器编排 - **Store**: `dnfhelper.ts` - 本地存储 + API 调用 - **UI 组件复用**:shadcn-vue Button/Card/Field 直接使用 - **样式**:Tailwind 原生类名(grid-cols, gap, padding等) - **图标**:lucide-vue-next (RefreshCcw, GalleryVerticalEnd, Shuffle) ## 修正记录(2026-05-11) - 纠正:frontendNew 已存在并接入 equipment 页面。 - 实际路径:frontendNew/src/pages/Dcalc/Character/EquipmentDictionary/Index.vue - 实际路由:frontendNew/src/router/index.ts 中 character/equipment 子路由已配置。 - 结论:equipment 迁移状态应定义为“主体完成,后续做一致性优化”。 --- # 详细模块分析 ## 1. SKILL 模块详解 ### Frontend 旧版结构 **文件清单**: - `src/pages/Character/Skill/index.vue` (650+ 行) - 子组件: SkillTree, SkillVP, SkillUP, SkillDetail - `src/pages/Character/Skill/components/`: - `SkillTree/index.tsx` - TSX 渲染函数,技能树面板(等级/技能筛选) - `SkillTree/img/` - 美术资源 - `SkillVP/index.tsx` - TSX 技能进化选择(5个VP槽位) - `SkillUP/index.tsx` - TSX 技能突破选择(多个UP槽位) - `SkillDetail/index.tsx` - 技能详情弹窗 - 依赖 calc-* 组件(button/checkbox/tabs) **职责分层**: - **L0(展示层)**: index.vue 主容器 + 6 个 tab 组织 - **L1(交互层)**: SkillTree/SkillUP/SkillVP/SkillDetail - **L2(核心)**: TSX 条件渲染 + 计算属性 + 样式定制 **关键依赖**: - `useInfoStore.skills` - 技能数据源 - `useConfigStore.config.skills` - 技能配置 { lv, vp, up } - `onClickOutside` VueUse 钩子 - Calc-UI 组件库 ### FrontendNew 占位状态 - **文件**: `src/pages/Dcalc/Character/Skill/index.vue` (48 行) - **内容**: 搜索框 + 技能卡片网格(展示级) - **缺失**: - SkillTree 树形选择 - SkillVP/SkillUP 配置面板 - 技能详情弹窗 - 数据编辑交互 ### 迁移差距 | 功能 | 旧版 | 新版 | 缺失 | |-----|------|------|------| | 技能列表搜索 | SkillTree | 简单搜索框 | 树形结构 | | VP 进化配置 | SkillVP | ❌ | 5 槽位选择 | | UP 突破配置 | SkillUP | ❌ | 多槽选择 | | 详情展示 | SkillDetail 弹窗 | ❌ | 弹窗界面 | --- ## 2. FORGE 模块详解 ### Frontend 旧版结构 **文件清单**: - `src/pages/Character/Forge/index.vue` (32 行) - 简洁容器 - `src/pages/Character/Forge/components/`: - `Equipments.vue` - 装备打造子面板 - `Avatars.vue` - 时装打造子面板 - `Emblems.vue` - 徽章打造子面板 - `Oaths.vue` - 誓约打造子面板 - `Jades.vue` - 辟邪玉子面板 - `Sundry.vue` - 其他配置子面板 - 使用 calc-collapse/calc-tabs 容器化 **职责分层**: - **L0(入口)**: Forge/index.vue - 6 个 collapse 分类 - **L1(子模块)**: 6 个 .vue 组件 - Equipments: 装备强化/升级/精炼/魔石编辑 - Avatars: 时装附魔/徽章选择 - Oaths: 誓约配置 - Jades: 玉石配置 - Sundry: 杂项选项(绑定觉醒等) **关键依赖**: - `useConfigStore` - 装备配置状态 - 各自与对应的 List 组件嵌套 - Calc-UI collapse/tabs ### FrontendNew 占位状态 - **文件**: `src/pages/Dcalc/Character/Forge/index.vue` (45 行) - **内容**: 3 张 Card 统计(装备数、誓约数、时装徽章数) - **缺失**: - 所有 6 个子面板 - 装备编辑界面 - 誓约/玉石/时装编辑 - 数据交互 ### 迁移差距 | 功能 | 旧版 | 新版 | 缺失 | |-----|------|------|------| | 装备编辑 | Equipments | 仅统计 | 完整编辑器 | | 时装编辑 | Avatars | 仅统计 | 完整编辑器 | | 徽章编辑 | Emblems | 仅统计 | 完整编辑器 | | 誓约配置 | Oaths | ❌ | 完整面板 | | 玉石配置 | Jades | ❌ | 完整面板 | | 其他选项 | Sundry | ❌ | 完整面板 | --- ## 3. RESULT 模块详解 ### Frontend 旧版结构 **文件清单**: - `src/pages/Character/Result/Index.vue` (72 行) - 主容器,管理分类切换 - `src/pages/Character/Result/components/`: - `Info.vue` (200+ 行) - 左侧信息面板 - EquList 子组件 (装备列表) - Oath 子组件 (誓约信息) - 基础属性数值展示 - `Skill.vue` (180+ 行) - 右侧技能伤害表 - 技能名/CD/次数/秒伤/总伤害/占比 - 可编辑技能次数 - 排序功能(按 dps/total 等) - `BufferSkill.vue` (190+ 行) - 组队模式技能表 - 不同的表头字段(MAIN/ATK/STRINT 等) - 不可编辑模式 **职责分层**: - **L0(入口)**: Result/Index.vue - 切换 Equipment/Oath 视图 + 标准对比 - **L1(左侧)**: Info.vue - 装备信息 + 基础属性 - EquList: 装备图标列表 - Oath: 誓约信息 - 属性值网格 - **L1(右侧)**: Skill.vue / BufferSkill.vue - 技能伤害统计 - 表格渲染(固定列宽) - 排序交互 - 伤害数值编辑 **关键依赖**: - `useConfigStore.result.state` - 计算结果数据 - `useInfoStore.standard` - 标准对比数据 - `configStore.skillCountConfig` - 技能次数配置 - 复杂的数据处理和样式定制 ### FrontendNew 缺失状态 - **不存在**: 零文件,没有 Result 模块 - **缺失**: - 整个右侧结果面板 - 技能伤害表展示 - 标准对比功能 - 装备信息展示 ### 完整缺失情况 Result 是 **三个模块中缺失最严重** 的: - 没有代码框架 - 没有占位符 - 没有数据绑定 - 完全的新建工作 --- ## 4. 数据依赖图 ### Skill 依赖 ``` infoStore.skills (API) ↓ SkillTree/SkillVP/SkillUP ↓ configStore.config.skills ↓ Result 右侧 Skill 表展示 ``` ### Forge 依赖 ``` configStore.config.equips/avatar/oaths ↓ 6 个 Forge 子面板编辑 ↓ Result 左侧 Info 面板展示 ↓ API /calc 计算 ↓ Result 右侧 Skill 表 ``` ### Result 依赖 ``` configStore.result.state (来自 API /calc) infoStore.standard (标准对比数据) ↓ Info.vue 左侧展示 Skill.vue / BufferSkill.vue 右侧表格 ↓ setStandard() 保存对比基准 ``` --- ## 5. 组件库差异影响 ### Frontend 原生组件映射 **calc-* 组件** → **shadcn-vue 替代**: - `calc-tabs` → `shadcn Tabs + TabsList + TabsTrigger` - `calc-collapse` → `shadcn Accordion` 或自定义 collapsible - `calc-button` → `shadcn Button` - `calc-checkbox` → `shadcn Checkbox` - `calc-input` → `shadcn Input` - `calc-dialog` → `shadcn Dialog` **样式转换**: - UnoCSS shorthand (如 `h-40px`) → Tailwind (如 `h-10`) - DNF 暗色主题 `#101012` → Tailwind `bg-black` + custom 深灰 - 金色强调 `#836832` / `#6C5E4A` → Tailwind 或 CSS variables --- ## 6. 核心差异总结 | 方面 | Frontend | FrontendNew | 迁移工作 | |------|----------|-----------|---------| | **Skill** | 完整 TSX + UI | 占位(搜索框) | ★★★★ 高 | | **Forge** | 6 个子面板 | 占位(统计卡) | ★★★★★ 最高 | | **Result** | Info + Skill 双面板 | ❌ 不存在 | ★★★★★ 最高 | | **路由** | `/character/xxx` | `/dcalc/character/xxx` | ★ 低 | | **Store** | 全部就位 | 基础就位 | ★ 低 | | **UI 库** | 自研 calc-* | shadcn-vue | ★★ 中 |