Skip to content

Commit 78bc6af

Browse files
committed
fix(notes): 缩略图 maxWidth 保留 + 多项小修复(M3/L1-L4/L6)
M3: NoteImage 缩略图保留 maxWidth 容器约束 + TODO(v0.12.0) 后端 thumbs 路径 L1: WindowSelectCard 展开刷新防抖 200ms(快速开合只保留最后一次) L2: group_route.rs 去掉重复 is_some() 外层判断 L3: 测试注释 Task 0 → Task 14 实证 L4: line-limit-exemptions 登记 NoteGroupPanel 545 行(v0.11.5 树形合并) L6: SessionListItem.displayNo 补兼容注释
1 parent de656b4 commit 78bc6af

6 files changed

Lines changed: 22 additions & 6 deletions

File tree

‎app/src-tauri/src/group_route.rs‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,8 @@ pub fn route_group(signals: &GroupRouteSignals) -> GroupRouteDecision {
123123
}
124124
// 规则 4:低密度票 + 领域命中 → 主题组(领域=强前提,低密度 1 票即可触发——
125125
// Task 14 实证:B站标题有领域词但低密度票不足 2 的会话不再落兜底独立组)
126-
if low >= 1 && signals.domain_kind.is_some() {
126+
if low >= 1 {
127+
// 审查修复(L2):去掉重复 is_some() 外层判断——内层 if let 已覆盖
127128
if let Some(kind) = signals.domain_kind {
128129
reasons_low.push(format!("领域命中({})", kind.label()));
129130
return GroupRouteDecision { action: RouteAction::TopicGroup, reasons: reasons_low };

‎app/src-tauri/src/note_group_assign_tests.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ fn low_structure_with_domain_joins_topic_group() {
119119
#[test]
120120
fn bilibili_marketing_title_with_domain_routes_to_topic() {
121121
// Arrange:低结构会话(无系列、零章节、术语不成块、形态已识别)
122-
// + 领域命中(标题"公积金"→ 经济管理)——Task 0 实证:
122+
// + 领域命中(标题"公积金"→ 经济管理)——Task 14 实证:
123123
// B站标题有领域词但低密度票不足 2(仅"零章节"1 票),
124124
// 旧判据落入兜底独立组,新判据应归主题组
125125
let db = mem_db();

‎app/src/components/NoteImage.tsx‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,9 @@ export default function NoteImage({ src, alt = "", noteId, onOpen }: Props) {
7474
loading="lazy"
7575
onClick={() => onOpen?.(url, alt)}
7676
style={{
77-
// v0.11.5:笔记图片缩略图(240px cover)——点击经 onOpen 看原图
77+
// 当前为 CSS 缩略图:全尺寸图片加载后 CSS 缩放为 240×160 cover(容器约束保留)。
78+
// TODO(v0.12.0): 使用后端 thumbs/ 缩略图路径替代全尺寸 CSS 缩放
79+
maxWidth: "100%",
7880
width: 240,
7981
height: 160,
8082
objectFit: "cover",

‎app/src/components/WindowSelectCard.tsx‎

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,12 @@ export function WindowSelectCard({ windows, selected, onSelect, onRefresh, loadi
6868
const [open, setOpen] = useState(false);
6969
const [showAll, setShowAll] = useState(false);
7070
const rootRef = useRef<HTMLDivElement>(null);
71+
// L1(审查修复):展开刷新防抖定时器——快速开合只保留最后一次刷新,
72+
// 避免连续触发 list_windows 堆积过期请求(旧请求先完成覆盖新结果)
73+
const refreshTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
74+
75+
// L1:卸载时清理防抖定时器
76+
useEffect(() => () => { if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current); }, []);
7177

7278
// 推荐窗口 = 评分命中;其余收进"显示全部"折叠区
7379
const recommended = windows.filter((w) => w.score > 0);
@@ -88,7 +94,11 @@ export function WindowSelectCard({ windows, selected, onSelect, onRefresh, loadi
8894
const next = !open;
8995
setOpen(next);
9096
// v0.11.5:展开时自动后台刷新(旧列表先显,完成替换——无闪烁)
91-
if (next) onRefresh(true);
97+
// L1(审查修复):防抖 200ms——快速开合只刷新最后一次,杜绝请求堆积竞态
98+
if (next) {
99+
if (refreshTimerRef.current) clearTimeout(refreshTimerRef.current);
100+
refreshTimerRef.current = setTimeout(() => onRefresh(true), 200);
101+
}
92102
};
93103

94104
const handlePick = (win: WindowInfo) => {

‎app/src/types/session.ts‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,10 @@ export interface SessionListItem {
234234
noteTitle: string | null;
235235
/** 有转写段或 OCR 块(空会话不进入"待转化") */
236236
hasContent: boolean;
237-
/** v0.11.5:显示序号(按 started_at 升序 rank,删除会话后自动归位;与内部 id 分离) */
237+
/**
238+
* v0.11.5:显示序号(按 started_at 升序 rank,删除会话后自动归位;与内部 id 分离)
239+
* 兼容:旧后端响应缺省 displayNo 时,前端未使用该字段。
240+
*/
238241
displayNo: number;
239242
}
240243

‎docs/standards/line-limit-exemptions.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
| app/src/components/SessionDetailPanel.tsx | 371 | 会话详情面板:质量报告/段列表/OCR 概览/操作区单一面板完整交互流内聚(前端审查登记) | 若再增长:质量报告区拆至 SessionQualityReport.tsx |
6666
| app/src/components/ProfileDetector.tsx | 330 | 档案检测组件:投票/确认流/记忆偏好 UI + v0.11.5 Task 5 冲突提示内聚(实测 2026-08-22) | 若再增长:确认流拆至 ProfileConfirmFlow.tsx |
6767
| app/src/components/NoteEditView.tsx | 315 | 笔记编辑视图:编辑态/标签/结构面板内聚(前端审查登记) | 若再增长:结构面板拆至 NoteStructurePane.tsx |
68-
| app/src/components/NoteGroupPanel.tsx | 393 | v0.11.0~4 笔记组侧栏:组列表/路由可见可改/碎片捕获/闪卡生成与复习入口/结算仪式/周契约卡/feed 碎片列表(周契约与碎片列表已拆独立组件 WeekContractCard/FeedFragmentList)——组域交互单一面板内聚 | 若再增长:结算仪式区拆至 GroupSettlementPane.tsx |
68+
| app/src/components/NoteGroupPanel.tsx | 545 | v0.11.0~4 笔记组侧栏:组列表/路由可见可改/碎片捕获/闪卡生成与复习入口/结算仪式/周契约卡/feed 碎片列表(周契约与碎片列表已拆独立组件 WeekContractCard/FeedFragmentList)——组域交互单一面板内聚;v0.11.5 树形合并(buildTree 消费/搜索新建工具条/受控展开组) | 若再增长:结算仪式区拆至 GroupSettlementPane.tsx |
6969

7070
> 前端 **拆分中**(Task #9 笔记域修复进行中,暂不登记行数):`app/src/types.ts`、`app/src/pages/NotesPage.tsx`——待前端拆分完成后以实测行数重新评估。
7171
> 前端 SessionsPage.tsx 审查快照 304 行(登记值),v0.7.1 硬拆后长期 ≤300,本轮审查期间轻微越线;随 NotesPage/types.ts 拆分任务一并复核,若仍越线按上表模式登记。

0 commit comments

Comments
 (0)