diff --git "a/reports/daily/\345\215\240\351\233\252\350\212\271/20260807.md" "b/reports/daily/\345\215\240\351\233\252\350\212\271/20260807.md" new file mode 100644 index 0000000000000000000000000000000000000000..7fdb97cb729a2fa14a0127479b97091ed2a6f6d9 --- /dev/null +++ "b/reports/daily/\345\215\240\351\233\252\350\212\271/20260807.md" @@ -0,0 +1,67 @@ +# 日报 - 占雪芹 - 2026-08-07 + +## 今日完成 + + +### 1. 秒杀模块:未开始活动展示功能 +**需求**:后台把秒杀活动状态改为「未开始」时,前台 `/seckill` 列表应展示该商品,状态徽章显示「未开始」。 + + +### 2. 🐛 严重 Bug 修复:秒杀价格未应用到订单 +**问题**:前台秒杀页显示 ¥99.99(秒杀价),用户付款时按商品原价 ¥299.99 结算。属于**资损 Bug**——每个被秒到的用户都被多收了「原价 - 秒杀价」的差额。 + +**根因**:`SeckillService.RushAsync` 调用 `BuyNowOrderAsync` 时**未传秒杀价**,而 `OrderService.BuyNowOrderAsync` 的价格逻辑是: +```csharp +decimal unitPrice = sku?.Price ?? product.Price; // ← 永远用商品原价 +``` + + +**修复后价格优先级**: +``` +服务端覆盖价(秒杀等内部场景,BuyNowOrderAsync 第 3 参数) + ↓ 未传 +SKU 价格(如果商品有 SKU) + ↓ 无 SKU +商品原价(默认) +``` + +**安全设计**: +- ✅ `unitPrice` 是**服务层方法参数**,不是 HTTP Body 字段,前端无法通过 API 直接改价 +- ✅ 覆盖价必须 `> 0`(≤0 直接抛 400) +- ✅ Controller 外部调用显式传 `null`,强制用商品原价 +- ✅ `OrderItem.ProductPrice` 持久化 `finalUnitPrice`,订单历史可追溯 + +### 3. 自检报告:6 项 pre-existing 问题清单 +本次改动自检过程中发现的 6 项 pre-existing 问题(不在本次范围),已逐项列出供后续迭代参考: +1. `AdminSeckillService.ChangeStatusAsync`:从「进行中」切到「未开始」时 Redis 库存不重置也不同步,可能造成"未开始但库存已部分占用"的怪现象 +2. `RushAsync` 先 SETNX + DECR 再校验 status(未开始被拒时多消耗两次 Redis 调用,可接受) +3. EF Core `OrderBy(s => s.Status == 0)` 翻译为 CASE WHEN 表达式,可改用 `(byte)(s.Status == 1 ? 0 : 1)` 更优雅 +4. `formatHms` 无上限格式化(5 天显示 "120h 0m 0s",不显示天数) +5. Status=0 但 StartTime 已过的脏数据风险(admin 改状态未校验时间) +6. `tick` 占位符 + `setInterval(1000)` 每秒强制重渲染整个列表页,对大量活动不友好 + +--- + +## 遇到的问题 + +| 问题描述 | 解决状态 | 解决方式/求助对象 | +|----------|----------|-------------------| +| 详情页倒计时文案与列表页不一致(割裂感) | ✅ 已解决 | 检查时发现并修复:`SeckillDetailPage.vue` 新增 `startCountdownText` computed,按 status 分支显示;提取 `formatHms` 复用 | +| 秒杀价格未应用到订单(资损 Bug) | ✅ 已解决 | 调研发现根因:`BuyNowOrderAsync` 未传覆盖价;服务层加可选参数 `unitPrice`,安全可控 | +| 后端编译时 exe 被进程锁定(PID 32992 / 9948) | ✅ 已解决 | `taskkill /F /IM EshopBackend.exe` 后重编 | +| `OrderService.BuyNowOrderAsync` 签名调整后 `OrderController.BuyNow` 调用处报错 | ✅ 已解决 | Controller 显式传 `null` 作为第二参(外部调用不能覆盖价格) | + +--- + +## 明日计划 + +1. 手工 e2e 验证秒杀全链路:后台新建活动 → 设为「未开始」→ 前台可见 → 切到「进行中」→ 用户抢购 → 确认订单 `TotalAmount` 与 `OrderItem.ProductPrice` 均为秒杀价 +2. 验证数据库中已存在的秒杀订单,确认历史数据未受影响(`ProductPrice` 仍是创建时的快照) +3. 给本次改动拆 2 个 commit 提交:① 秒杀未开始展示(4 文件)② 秒杀价格修复(4 文件) +4. 评估是否补充 `SeckillService` 单元测试(当前 `EshopBackend.Tests` 无 seckill 相关测试,盲区较大) + +--- + +## 今日工时 + +约 **3 小时** \ No newline at end of file diff --git "a/reports/daily/\345\215\240\351\233\252\350\212\271/20260811.md" "b/reports/daily/\345\215\240\351\233\252\350\212\271/20260811.md" new file mode 100644 index 0000000000000000000000000000000000000000..bebc847b94625adf9147c35850c05b7de50591a0 --- /dev/null +++ "b/reports/daily/\345\215\240\351\233\252\350\212\271/20260811.md" @@ -0,0 +1,55 @@ +# 日报 - 占雪芹 - 2026-08-11 + +## 今日完成 + +### 1. 右侧悬浮快捷侧边栏:图标颜色 & 提示气泡位置修复 + +**问题 1:消息图标显示红色** +- Element Plus `ChatLineRound` 图标自带红色 `fill` 样式,与其他三个(购物车/订单/收藏)的中性灰不一致 +- 多次尝试 `:deep(svg path) { fill: currentColor !important }` 仍无法覆盖(EP 内部 SVG `fill` 属性优先级问题) +- **最终方案**:改用 Vue 自定义组件 `ChatIcon`,渲染 stroke 风格的 SVG 圆角矩形气泡 + - `fill="none"` + `stroke="currentColor"` + `stroke-width="56"` + - 颜色严格跟随父级 `color`,与 `ShoppingCart` / `List` / `Star` 完全统一 + - 移除对 `ChatLineRound` 的 import,无外漏引用 + +**问题 2:提示文字浮在图标内部** +- 原本 `qa-label` 通过 `position: absolute; left: 12px` 浮在按钮内,与图标挤在一起 +- **改造**:将 label 从按钮内部移到侧边框**外侧**(左侧),采用 Tooltip 风格 + - 深色圆角胶囊 + 白色文字 + - 右侧加小三角箭头指向侧边栏(`::after` 伪元素 + border-left-color) + - 滑入动画 `translateX(8px) → 0` + + +--- + +### 2. 商家后台全局 UI 美化(CSS-only,零业务改动) + +#### 设计语言 +- **品牌色**:保留商家专属绿色调 `#0d5245 → #1d8870 → #2aa98d` 渐变(与用户端红色 `#e54560` 区分) +- **卡片圆角**:统一 16px +- **按钮形状**:主按钮改为胶囊形 `border-radius: 9999px` +- **标题前缀**:所有页面卡片标题加 3px × 14px 绿色渐变竖条(`:before` 伪元素) +- **表格**:表头浅绿背景 `#f7fbf9`、hover 行 `#f0faf6` +- **主按钮**:渐变 `#1d8870 → #2aa98d`,hover 加深 + +--- + +## 遇到的问题 + +| 问题描述 | 解决状态 | 解决方式/求助对象 | +|----------|----------|-------------------| +| Element Plus `ChatLineRound` 图标红色 fill 无法被 CSS 覆盖 | ✅ 已解决 | 放弃 EP 内置图标,改用自定义 stroke 风格 SVG 组件 | +| 提示气泡位置用户反馈要在侧边框外侧 | ✅ 已解决 | `position: absolute; right: calc(100% + 10px)` 浮在侧边框左侧,加 Tooltip 风格三角箭头 | +| 商家后台页面风格不统一,与用户端红色混淆 | ✅ 已解决 | 锁定绿色品牌主色 `#1d8870`,所有页面统一卡片样式、按钮形状、标题前缀 | + +--- + +## 明日计划 + +1. 无 + +--- + +## 今日工时 + +约 **4 小时** \ No newline at end of file