Files
online-attendance-lottery/Code/docs/modification-assessment.md

191 lines
9.9 KiB
Markdown
Raw Permalink 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.
# 修改评估文档
> 项目:在线点名抽奖 (PROJ-20260523012)
> 评估时间2026-05-24
> 版本v1.0.0 → v1.1.0
> 评估人:前端架构 Agent
---
## 修改评估总览
| 修改项 ID | 修改内容 | 影响范围 | 目标 Agent | 是否需要架构设计 | 难度 | 说明 |
|----------|---------|---------|-----------|----------------|------|------|
| M001 | 名单编辑功能(删除按钮) | 名单管理模块 + CSS | frontend-coding-agent | ❌ | 低 | 在现有 name-tag 上追加 × 按钮和删除逻辑 |
| M002 | 概率后门(每人概率设置) | 抽奖引擎 + 后门模块 + 状态结构 | frontend-coding-agent | ⚠️ 部分 | 中 | 需扩展状态结构、改造 pickOne 加权随机算法、后门面板新增概率输入 |
| M003 | 滚动动画改进(左→右滚动 + 快速启动) | 动画模块 + CSS | frontend-coding-agent | ❌ | 中 | 从名字切换改为水平滚动条效果,调整缓动曲线 |
| M004 | 弹窗显示中奖结果 | 动画模块 + CSS + HTML 结构 | frontend-coding-agent | ❌ | 低 | 用模态弹窗替代当前 result-area 内联显示 |
| M005 | 烟花效果改进(弹窗周围炸开 + 3秒以上 | 动画模块Canvas 烟花) | frontend-coding-agent | ❌ | 中 | 移除底部上升阶段,改为弹窗位置直接爆炸,延长持续时间 |
---
## 详细评估
### M001: 名单编辑功能(删除按钮)
- **影响模块**`NameManager` 模块、CSS`.name-tag` 样式)
- **需要变更**
- `NameManager.renderNameList()`:每个 name-tag 内追加 × 按钮,绑定点击事件
- 新增 `NameManager.removeByName(name)` 方法:从 `state.pool` 中移除指定名字,更新计数和列表
- CSS 新增 `.name-tag .delete-btn` 样式(小 ×hover 高亮,红色)
- **依赖关系**:无外部依赖,纯前端 DOM 操作
- **风险点**
- 删除后需同步更新 `state.backdoor.mustWinList``excludeList`(避免引用已删除的名字)
- 若当前正在抽奖中(`state.isDrawing === true`),应禁用删除操作
- **代码量预估**~50 行 JS + ~15 行 CSS
- **架构设计变更**:不需要。属于现有模块的功能增强。
---
### M002: 概率后门(每人概率设置)
- **影响模块**`LotteryEngine` 模块、`Backdoor` 模块、`state` 状态结构、后门面板 HTML/CSS
- **需要变更**
- **状态扩展**`state.backdoor.probabilities` 新增字段,结构为 `{ name: weight }` 的对象(权重值 0-100
- **人员对象扩展**`person` 对象新增 `weight` 字段(默认 1表示等概率
- **抽奖引擎改造**`LotteryEngine.pickOne()` 从等概率随机改为**加权随机**
```
1. 候选池 = state.pool 副本
2. 过滤排除名单
3. 若必中名单非空:取交集
4. 计算总权重 = Σ(person.weight)
5. 随机数 r = Math.random() * totalWeight
6. 累加权重找到对应人选(加权随机算法)
```
- **后门面板**新增概率设置区域支持为每个人设置概率百分比0-100可输入数值或滑块
- **Backdoor.renderChecklists()**:每个名字旁新增概率输入框
- **依赖关系**
- 依赖 M001 的删除逻辑(删除人时同步清理概率配置)
- 与现有必中/排除名单逻辑共存,需明确优先级:必中名单 > 概率权重 > 排除名单
- **风险点**
- 概率总和不为 100% 时的处理策略(建议:按权重比例分配,不强制归一化)
- 概率为 0 的人是否等同于排除名单(建议:是,概率 0 的人不参与抽奖)
- 后门面板 UI 复杂度增加,需注意滚动区域和响应式
- **代码量预估**~120 行 JS + ~60 行 CSS + HTML 结构变更
- **架构设计变更**:⚠️ 部分需要。`state` 数据结构需扩展,`LotteryEngine.pickOne()` 核心算法需改造。需更新 `frontend-architecture.md` 的状态设计和抽奖引擎算法部分。
---
### M003: 滚动动画改进(从左到右滚动 + 快速启动)
- **影响模块**`AnimationEngine` 模块、CSS`.roll-area`、`.roll-name` 相关样式)
- **需要变更**
- **滚动方式改造**:从当前"中心位置名字切换"改为"水平滚动条"效果
- 名字在水平方向上连续滚动,类似老虎机/跑马灯
- 使用 CSS `transform: translateX()` 或 Canvas 实现
- 滚动方向:从左到右
- **速度曲线调整**
- 初始速度要快(建议:初始间隔 20-30ms即每秒 30-50 个名字切换)
- 逐渐减速(缓动函数保持不变或改用更陡峭的 easeOut
- 总时长保持 3.5 秒左右
- **CSS 新增**:滚动容器的 overflow hidden、名字项的水平排列样式
- **DOM 结构**:可能需要在 roll-area 内新增滚动容器 div
- **依赖关系**
- 与 M004 弹窗显示有 UI 交互关系(弹窗弹出时滚动应已停止)
- 头像显示区域可能也需要配合调整(头像跟随滚动还是固定居中)
- **风险点**
- 水平滚动的性能:大量 DOM 节点滚动可能卡顿,建议使用 transform 而非改变 left 属性
- 移动端兼容性:触摸滚动与动画滚动的冲突
- 头像与名字滚动的同步问题
- **代码量预估**~100 行 JS + ~80 行 CSS + HTML 结构调整
- **架构设计变更**:不需要。属于动画模块内部实现替换,接口不变(`startRollAnimation(winner, callback)` 签名不变)。
---
### M004: 弹窗显示中奖结果
- **影响模块**:动画模块(`AnimationEngine.startRollAnimation` 的 callback、CSS弹窗样式、HTML 结构
- **需要变更**
- **新增弹窗 HTML 结构**:在 `#app` 内新增中奖弹窗 div类似后门面板的遮罩 + 模态框结构)
- 遮罩层:全屏半透明黑色
- 弹窗内容:中奖人头像(大尺寸)、名字、"恭喜"字样
- 关闭按钮或点击遮罩关闭
- **CSS 新增**:弹窗遮罩、弹窗容器、动画(弹出缩放 + 淡入效果)
- **动画模块修改**`startRollAnimation` 的 callback 中,从设置 `resultArea` 改为打开弹窗
- **交互**:弹窗可点击关闭,关闭后显示原有的 result-area或直接用弹窗替代 result-area
- **依赖关系**
- 依赖 M003 滚动动画停止后才弹出(时序关系)
- 与 M005 烟花效果配合:弹窗弹出时烟花同时开始
- 与 M002 概率后门无直接依赖
- **风险点**
- 弹窗的 z-index 需高于烟花 Canvas当前烟花 z-index: 9999弹窗 z-index 需设为 10001+
- 弹窗动画与烟花动画的性能叠加,需注意低端设备
- **代码量预估**~60 行 JS + ~70 行 CSS + ~20 行 HTML
- **架构设计变更**:不需要。属于 UI 层变更,不改变模块接口。
---
### M005: 烟花效果改进(弹窗周围炸开 + 3秒以上
- **影响模块**`AnimationEngine.fireFireworks()` 方法、Canvas 粒子系统
- **需要变更**
- **移除上升阶段**:当前 `Firework` 类有 `'rising'` 状态(从底部升到目标位置),需移除
- 烟花直接在目标位置爆炸,不再从底部发射
- **爆炸位置**:围绕弹窗位置生成爆炸点
- 获取弹窗 DOM 元素的中心坐标
- 在弹窗周围一定半径范围内随机生成爆炸点
- 爆炸点分布:弹窗的上下左右四个方向
- **持续时间**:从当前 4 秒改为 3 秒以上(建议 4-5 秒)
- 修改 `endTime = performance.now() + 5000`
- **粒子效果优化**
- 增加初始爆炸的粒子数量(更密集)
- 可考虑多波爆炸效果(第一波密集,后续逐渐稀疏)
- **依赖关系**
- 依赖 M004 弹窗的位置信息(需要弹窗 DOM 元素的坐标)
- 与 M003 无直接依赖
- 与 M002 无直接依赖
- **风险点**
- 弹窗位置动态变化(响应式)时需重新计算爆炸点
- 烟花持续 3 秒以上时,粒子数量控制很重要,避免内存泄漏或卡顿
- 窗口 resize 时的 canvas 尺寸同步
- **代码量预估**~80 行 JS 修改
- **架构设计变更**:不需要。属于动画模块内部实现修改,接口不变(`fireFireworks()` 无参数调用)。
---
## 修改项依赖关系图
```
M001 (名单编辑) ────────────────────────────── 独立
M002 (概率后门) ─── 依赖 M001 的删除同步逻辑 ─── 需架构设计更新
M003 (滚动动画) ────────────────────────────── 独立
M004 (弹窗显示) ─── 依赖 M003 滚动停止 ─────── 独立
M005 (烟花改进) ─── 依赖 M004 弹窗位置 ─────── 独立
```
**建议实施顺序**
1. **M001** → 名单编辑(最基础,无依赖)
2. **M002** → 概率后门(核心逻辑变更,需先完成 M001
3. **M003** → 滚动动画(独立,可与 M004/M005 并行开发)
4. **M004** → 弹窗显示(依赖 M003 完成)
5. **M005** → 烟花改进(依赖 M004 完成)
---
## 总体影响评估
| 维度 | 评估 |
|------|------|
| **代码改动量** | 中等(约 400-500 行 JS + 200-250 行 CSS + HTML 结构调整) |
| **架构变更** | 仅 M002 需要更新状态结构和核心算法,其余为 UI/动画层变更 |
| **测试重点** | M002 加权随机算法的正确性、M003/M005 动画性能、M001 删除边界情况 |
| **兼容性影响** | 无新增 API 依赖,保持现有浏览器兼容性 |
| **文件变更** | 仅 `index.html` 单文件(符合项目约束) |
---
## 目标 Agent 分配总结
| Agent | 负责修改项 | 工作量 |
|-------|-----------|--------|
| **frontend-coding-agent** | M001, M002, M003, M004, M005全部 | 高5 项全部) |
| **test-qa-agent** | 全部 5 项的功能测试 + 性能测试 | 中 |
| **doc-gen-agent** | 更新 README 和使用文档 | 低 |
| **package-release-agent** | Git 同步 + v1.1.0 版本发布 | 低 |
---
*文档版本: v1.0*
*创建时间: 2026-05-24*
*作者: 前端架构 Agent*