软件工程作业 1:Where Is...?——实验室物品管理 GUI

项目源代码:CS3331-Homework1-where-is-lab

我的需求是开发一个本地桌面工具,记录实验室物品在哪里,并将物品与实验 Protocol 联系起来。程序使用 Python、Tkinter/ttk 和 SQLite,开发过程中使用 Codex 辅助生成、修改代码和执行测试。部分提示词也由 AI 协助起草和完善。

第1轮

我给AI的提示词:

# 角色

你是一名擅长 Python 桌面应用、Tkinter、SQLite 和软件测试的高级软件工程师。
请保持代码结构清楚、运行步骤简单,并用中文说明关键设计。不要为了展示技术而引入不必要的框架或复杂设计。

# 项目背景

我要完成一项“使用 AI 辅助开发 GUI 软件”的课程作业。完整项目的目标是开发一个“实验室物品、位置与 Protocol 管理工具”,用于:

- 记录实验室中的试剂、抗体、耗材、样品和仪器;
- 记录物品在实验室中的具体存放位置;
- 支持一个物品拥有多个中文名、英文名和常用别名;
- 后续将物品与实验 Protocol、准备清单和本地文件关联。

本轮是第 1 轮开发,只实现最小可运行版本。不要一次实现完整产品。

……

## 1. 位置管理

位置使用层级结构。例如:
```
实验室
└── 细胞房
    └── 4℃冰箱
        └── 第二层
            └── 抗体盒
```

每个位置包含:

- 唯一编号;
- 位置名称;
- 上级位置;
- 备注。

需要支持:

- 添加位置;
- 修改位置;
- 删除位置;
- 使用树形控件显示位置层级;
- 计算并显示完整位置路径;
- 根位置允许没有上级位置。

## 2. 物品管理

物品包含:

- 唯一编号;
- 主要名称;
- 中文名;
- 英文名;
- 类别;
- 备注;
- 所在位置。

类别只能从以下内容中选择:

- 试剂
- 抗体
- 耗材
- 样品
- 仪器
- 其他

每件物品在本轮只关联一个位置。

需要支持:

- 添加物品;
- 修改物品;
- 删除物品;
- 在表格中显示全部物品;
- 显示物品的完整位置路径;
- 点击表格中的物品后,将内容填回编辑表单。

## 3. 多别名管理

一个物品可以拥有零个或多个别名。例如,同一个物品可以包含:

- 主要名称:RBC Lysis Buffer
- 别名:ACK
- 别名:裂红液
- 别名:红细胞裂解液

请在数据库中使用独立的别名表保存别名,不要只把全部别名拼接成一个不可查询的字符串。允许用户使用逗号或换行输入多个别名。保存物品时,将这些别名正确写入数据库。修改物品时,可以增加或删除别名。

## 4. 搜索与筛选

在主界面提供全局搜索框。

搜索应当忽略英文字母大小写,并匹配:

- 主要名称;
- 中文名;
- 英文名;
- 别名;
- 类别;
- 备注;
- 完整位置路径。

另外提供类别筛选和“显示全部”功能。

……

# 测试要求

请为数据库和业务逻辑编写 unittest 测试,至少覆盖:

- 创建位置层级;
- 生成完整位置路径;
- 创建和修改物品;
- 保存多个别名;
- 使用别名搜索物品;
- 防止位置循环;
- 阻止删除包含子位置的位置;
- 阻止删除仍然存放物品的位置。

不要求编写复杂的 GUI 自动化测试。测试不能使用正式数据库文件,应使用临时数据库或内存数据库。

请实际运行测试,并报告真实结果。

AI生成的初版要点:

AI 做出了物品管理和位置管理两个中文标签页,支持物品增删改查、多别名、层级位置、完整路径搜索及 SQLite 本地保存,基本符合初版预期。代码按数据库、业务逻辑和 GUI 分层,提供运行说明,基础自动测试通过。初版能够运行,但界面比较朴素,还没有 Protocol 功能;我进行了部分手工测试,当时没有发现明显基本功能错误。

第2轮

发现的问题:

初版只能回答“物品在哪里”,还不能查看某个实验需要哪些物品。代码审查与模拟检查还提示两处状态问题:筛选后可能保留旧选中物品,位置改名后可能丢失有效选择;这些不是我在真实窗口中发现的问题,所以修改要求中明确请 AI 先核对。

我给AI的修改要求:

# 本轮需求

## 1. Protocol 基础管理

增加“Protocol 管理”标签页,支持:

- 新建 Protocol;
- 查看和编辑 Protocol;
- 删除 Protocol;
- 查看 Protocol 列表;
- 按名称、步骤正文和备注搜索 Protocol。

每份 Protocol 包含:

- 唯一编号;
- 名称;
- 实验步骤正文;
- 备注。

名称必填,去除首尾空格后不能为空。步骤正文和备注允许为空,以便保存草稿。

实验步骤使用可以滚动的多行文本框,支持中文和换行。本轮由用户手动输入正文。

删除前必须确认。没有选中记录时,修改和删除应给出中文提示。

## 2. 手动关联已有物品

每份 Protocol 可以关联多个已有物品;同一个物品也可以被多个 Protocol 使用。

在 Protocol 编辑区域提供物品选择功能:

- 可按名称或别名搜索已有物品;
- 显示物品名称、类别和完整位置路径;
- 可以选择多个物品;
- 可以查看和移除已选择的物品;
- 修改 Protocol 时,正确显示已有的关联;
- 用户点击保存后,才写入关联。

未关联任何物品的 Protocol 也允许保存。

同一份 Protocol 不能重复关联同一个物品。

## 3. 双向查看关联

从 Protocol 查看:

- 它关联了哪些物品;
- 各物品的类别;
- 各物品当前的完整存放位置。

从物品查看:

- 哪些 Protocol 使用了它;
- 可以打开其中一份 Protocol,查看正文和关联物品。

物品改名或移动位置后,Protocol 中显示的信息应随之更新,不得继续显示过时的名称或位置。

## 4. 数据关系与删除规则

使用独立的 Protocol 表和关联表保存数据,例如:

- protocols:保存名称、步骤正文和备注;
- protocol_items:通过 protocol_id 和 item_id 建立关联。

关联必须使用数据库编号,不能通过名称文本建立。

请设置适当的外键和唯一约束。

保存 Protocol 及其关联应在同一个事务中完成;失败时整体回滚,不能出现正文已保存但关联只保存了一部分的情况。

删除 Protocol 时:

- 删除它的物品关联;
- 保留被关联的物品和位置。

删除物品时:

- 如果仍被 Protocol 使用,阻止删除;
- 提示用户先解除关联,并说明有哪些 Protocol 正在使用该物品。

……

# 补充检查:界面状态问题

以下问题来自代码审查和模拟状态检查,尚未由我在真实窗口中复现。请先核对相关代码,必要时修复,并补充验证。

## 搜索后的选中状态

当前 refresh_items 刷新表格后,selected_item_id 可能仍保留旧值。

目标行为:

搜索或类别筛选后,如果原选中物品不再显示,应清除选中编号和编辑表单。列表没有选中记录时,修改和删除不得操作之前的物品。

## 位置改名后的选择

当前 \_refresh_location_choices 通过显示文字判断是否保留位置选择,位置改名后可能将物品表单中的位置清空。

目标行为:

通过位置编号保留有效选择,并更新显示名称和完整路径。如果该位置已经不存在,再清除选择。

AI修改了什么:

AI 增加了 Protocol 基础管理、手动多物品关联与双向查看,正文和关联使用事务保存,并设置重复关联与删除保护。两处选中状态问题也被确认并修复,原有功能保留,自动测试通过;此时还没有自动识别和文件导入。

第3轮

发现的问题:

逐个手动关联物品仍然麻烦,我希望系统先给出候选,再由我确认和补充。现有 Protocol 文件需要手动复制,正文编辑框不适合持续阅读;后续用真实正文测试又发现,名称写法不同以及过严的英文边界规则,会导致物品识别不到。

我给AI的修改要求:

请在现有项目上完善 Protocol 的录入、识别和阅读流程。保留物品、位置、双向关联与原有数据,不删除数据库,不擅自添加未要求的功能。

一、自动识别与人工确认
1. 根据正文中出现的物品名称、中英文名和别名,从数据库中生成候选,展示名称、类别、位置、匹配依据和正文上下文。
2. 保留手动搜索补充与移除关联;同一物品不能重复加入。自动识别不直接写入数据库,用户确认后仍需点击保存。
3. 对名称写法不同的情况增加局部字符相似度比较,严格超过 60% 才展示模糊候选。放宽英文边界限制,使 1XRBC 中的 RBC 也能成为候选。
4. 相似、连续包含和重名候选不得默认勾选,提示用户核对实际物品。相似度只是文字相似,不代表同一种产品。

二、文件导入与放大阅读
1. 支持 DOCX、DOC、PDF、TXT 和 Markdown 导入,将原件复制到本地应用目录,不依赖原文件原来的路径。
2. 提取文字后先预览,提供替换正文、追加正文、仅保存附件和取消。提取失败或用户取消时,不得清空已有正文。
3. 文字型 PDF 直接提取;扫描 PDF 需要 OCR。
4. 新增独立只读阅读窗口,支持放大、滚动、字号调整和全屏,也能打开原文件副本核对排版。

三、编辑保护与验证
1. Protocol 存在未保存修改时,切换记录、清空或关闭前允许保存、放弃和取消;保存失败不能丢失编辑。
2. 补充测试,检查匹配阈值、重复关联、确认后保存、原文件移动后的副本读取,以及导入失败和取消场景。
3. 测试使用临时数据库和文件,不操作我的正式实验记录,报告实际结果和仍未验证的部分。

AI修改了什么:

AI 增加了自动候选、人工确认与手动补充、未保存提醒、文件副本与文字预览,以及独立只读阅读窗口。识别规则调整为字面包含和局部字符相似度候选,保留人工核对与最终保存,自动测试通过;扫描 PDF OCR 未实现。

第4轮

发现的问题:

界面需要统一设计。美化后的实际截图又暴露了选中标签变小、内容显示不全和滚动范围不对的问题;识别依据还把正文中的大写文字显示成小写,因此需要继续修正显示和交互。

我给AI的修改要求:

请根据实际运行截图优化现有界面,软件统一命名为“Where Is...?”。本轮以显示和交互改进为主,不改变数据库结构、附件路径、匹配阈值或业务保存规则。

1. 统一字体、颜色、间距和按钮层级,突出保存操作,明确区分删除操作;物品页面采用左侧列表、右侧详情布局。
2. 主标签及 Protocol 内部标签选中后应更大、更醒目,避免主题默认设置导致选中后反而缩小。
3. 将 Protocol 右侧名称、步骤正文、关联标签和保存按钮放进同一个纵向滚动区。内容超出窗口时能滚到所有控件,左侧列表保持原位,不要只给下方关联区加滚动。
4. 缩小顶部标题、图标和留白,将工作区上移,改善小窗口下的可见范围。
5. 匹配时可以忽略英文大小写,但显示的匹配片段和上下文必须来自原文。正文是 PBS 就显示 PBS,正文是 pbs 就保留 pbs,不要直接展示小写比较副本。
6. 重新检查保存、取消、自动识别、手动补充、附件导入和本地持久化,确认界面调整没有破坏已有功能。隐藏窗口测试与真实视觉验收分别说明。

AI修改了什么:

AI 完成 Where Is...? 更名和统一样式,使选中标签更大,将 Protocol 右侧整个编辑区纳入滚动,并缩小顶部占用。还分离了比较文字与显示原文,修正匹配依据的大小写显示,最终自动测试通过。

我的检查与验证说明

我怎么确认结果正确:

我结合自己在窗口中的操作反馈与 AI 执行的自动测试判断结果,而不是只看“代码已经生成”。初版的部分手工测试没有发现明显问题,但后续使用真实 Protocol 正文时,我发现了零候选;通过实际截图,又发现了标签、滚动和大小写显示问题。

我采用了以下检查思路:

  1. 真实样例验证。 使用实际 Protocol 正文检查识别。修复后,AI 用同一段正文与现有库只读复现,展示 PBS、RBC Lysis Buffer 和离心机三个候选,再核对匹配依据及人工确认流程。
  2. 显示交叉核对。 对照正文、候选依据和截图,检查匹配结果是否保留原文写法,以及滚动范围是否对应我提出的“整个右侧”,而不是只看有没有滚动条。
  3. 边界与数据检查。 自动测试使用临时数据库和文件,覆盖位置循环、受限删除、别名搜索、重复关联、事务回滚、恰好 60% 的相似度边界、文件副本读取和未保存提醒的不同分支。
  4. 回归验证。 增加功能后重新执行原有测试,确认旧功能仍有效。

心得

本次协作最大惊喜/失望:

AI的能力让许多没有相关经验的人成为开发者,但是也有一些问题,比如自动测试通过之后,程序仍可能没有解决真实使用问题,例如我希望右侧整体滚动,AI 第一次却只修改了下方区域。AI 能快速实现功能让我惊喜,但它不会自动理解我的全部使用场景;这次实践让我学会用具体页面、操作、截图和预期结果说明问题,再核对 AI 实际改了什么,而不是只说“优化一下”。

posted @ 2026-10-05 00:38  dvsghk  阅读(4)  评论(0)    收藏  举报