v0.4.9
v0.4.9 发布说明
发布日期: 2025年12月02日
版本概述
v0.4.9 版本是一个重要的用户体验优化和功能增强版本,将所有管理列表的详情页面改为弹窗显示,统一了交互方式,提升了操作效率。用户现在可以通过点击列表行直接打开详情弹窗,无需跳转到新页面,所有操作都可以在弹窗中完成。同时修复了测试单状态值不一致的问题,确保前后端状态值统一。此外,还新增了数据库备份、服务器重启、版本信息查看等实用功能,以及自动化发布和编译脚本,大大提升了系统的可维护性和部署效率。在用户菜单中添加了"关于"功能,方便用户查看系统版本信息。
主要更新
1. 详情弹窗统一化 🎯
功能描述
将所有管理列表(Bug、需求、任务、版本、项目、测试单)的详情页面改为弹窗显示,用户点击列表行即可打开详情弹窗,所有操作都可以在弹窗中完成,无需跳转到新页面。
功能特点
- 统一交互:所有列表统一使用点击行打开详情弹窗的方式
- 操作便捷:所有操作(编辑、删除、状态变更等)都可以在弹窗中完成
- 信息完整:弹窗中显示完整的详情信息,包括基本信息、描述、历史记录等
- 防止冒泡:操作按钮使用
@click.stop防止事件冒泡,避免误触发行点击 - 状态保持:编辑后自动刷新详情,保持数据同步
涉及的模块
- ✅ Bug管理 (
Bug.vue) - 详情弹窗包含基本信息、描述、历史记录、关联需求,支持编辑、指派、确认、解决、关闭、转换、删除、添加备注等操作 - ✅ 需求管理 (
Requirement.vue) - 详情弹窗包含基本信息、描述、历史记录,支持编辑、状态变更、转换Bug、删除、添加备注等操作 - ✅ 任务管理 (
Task.vue) - 详情弹窗包含基本信息、描述、历史记录,支持编辑、进度更新、状态变更、删除、添加备注等操作 - ✅ 版本管理 (
Version.vue) - 详情弹窗包含基本信息、描述,支持编辑、发布、状态变更、删除等操作 - ✅ 项目管理 (
Project.vue) - 详情弹窗包含基本信息、描述,支持编辑、成员管理、模块管理、删除等操作 - ✅ 测试单管理 (
TestCase.vue) - 详情弹窗包含基本信息、描述、测试步骤、关联Bug,支持编辑、状态变更、删除等操作
用户体验提升
- 操作效率:无需跳转页面,直接在弹窗中查看和操作,提升效率
- 交互统一:所有列表使用相同的交互方式,降低学习成本
- 信息完整:弹窗中显示完整的详情信息,包括历史记录
- 操作便捷:所有操作都可以在弹窗中完成,无需返回列表
技术实现
- 使用 Ant Design Vue 的
a-modal组件实现弹窗 - 添加
detailModalVisible、detailXXX、detailLoading等状态变量 - 实现
loadXXXDetail函数加载详情数据 - 实现
handleDetailXXX函数处理各种操作 - 使用
@click.stop防止操作按钮事件冒泡 - 添加
table-row-clickable样式类,提示行可点击
2. 移除详情操作按钮 🗑️
功能描述
移除所有列表中的"详情"操作按钮,统一使用点击行打开详情弹窗的方式,简化界面,提升交互一致性。
涉及的模块
- ✅ Bug管理 - 移除详情按钮,保留点击行打开详情
- ✅ 需求管理 - 移除详情按钮,保留点击行打开详情
- ✅ 任务管理 - 移除详情按钮,保留点击行打开详情
- ✅ 版本管理 - 移除详情按钮,保留点击行打开详情
- ✅ 项目管理 - 移除详情按钮,保留点击行打开详情
用户体验提升
- 界面简化:移除冗余的详情按钮,界面更简洁
- 交互统一:所有列表使用相同的交互方式
- 操作直观:点击行即可打开详情,更符合用户习惯
3. 数据库备份功能 💾
功能描述
为服务器添加了数据库备份功能,支持通过命令行参数自动备份 SQLite 数据库,并自动压缩备份文件,保留最近7天的备份。
功能特点
- 一键备份:使用
--backup参数即可完成数据库备份 - 自动压缩:备份文件自动压缩为
.gz格式,节省存储空间 - 时间戳命名:备份文件使用时间戳命名,便于管理
- 自动清理:自动清理7天前的旧备份,避免占用过多空间
- 备份统计:显示备份数量和总大小
使用方法
# 基本使用
./server --backup
# 或者
./server -backup
# 或者
./server backup备份文件位置
- 备份目录:
{数据库文件所在目录}/backups/ - 备份文件格式:
data_YYYYMMDD_HHMMSS.db.gz - 保留期限:最近7天
定时备份(使用 cron)
# 每天凌晨2点自动备份
0 2 * * * cd /path/to/backend && ./server --backup >> /var/log/db-backup.log 2>&14. 服务器停止功能 🛑
功能描述
为服务器添加了停止功能,支持通过命令行参数自动查找并停止运行中的服务器进程。
功能特点
- 智能查找:通过端口号自动查找运行中的服务器进程(支持
lsof、ss、netstat) - 优雅关闭:先发送
SIGTERM信号优雅关闭(等待最多10秒) - 强制终止:如果进程未退出,自动发送
SIGKILL强制终止 - 错误提示:如果服务器未运行,会返回明确的错误信息
使用方法
# 基本使用
./server --stop
# 或者
./server -stop
# 或者
./server stop工作原理
- 通过配置的端口号查找正在运行的服务器进程
- 发送
SIGTERM信号优雅关闭 - 等待进程退出(最多10秒)
- 如果未退出,发送
SIGKILL强制终止 - 显示停止结果
示例输出
2025/12/01 15:32:37 Stopping server on port 8080...
2025/12/01 15:32:37 Found server process: PID 2827595
2025/12/01 15:32:37 Sending SIGTERM to process 2827595...
2025/12/01 15:32:37 Waiting for process 2827595 to exit...
2025/12/01 15:32:37 Process 2827595 has exited
2025/12/01 15:32:37 Server stopped successfully
5. 服务器重启功能 🔄
功能描述
为服务器添加了重启功能,支持通过命令行参数自动查找并停止运行中的服务器进程,然后重新启动服务器。
功能特点
- 智能查找:通过端口号自动查找运行中的服务器进程(支持
lsof、ss、netstat) - 优雅关闭:先发送
SIGTERM信号优雅关闭(等待最多10秒) - 强制终止:如果进程未退出,自动发送
SIGKILL强制终止 - 自动重启:停止后自动在后台启动新的服务器进程
使用方法
# 基本使用
./server --restart
# 或者
./server -restart
# 或者
./server restart工作原理
- 通过配置的端口号查找正在运行的服务器进程
- 发送
SIGTERM信号优雅关闭 - 等待进程退出(最多10秒)
- 如果未退出,发送
SIGKILL强制终止 - 重新启动服务器(后台运行)
与 stop 的区别
--stop:只停止服务器,不重新启动--restart:停止服务器后自动重新启动
6. 版本信息功能 📋
功能描述
为服务器添加了版本信息查看功能,支持通过命令行参数显示版本号、构建时间和 Go 版本信息。
功能特点
- 版本号显示:显示当前版本号
- 构建信息:显示构建时间和 Git 提交哈希(如果通过构建时注入)
- Go 版本:显示编译时使用的 Go 版本
使用方法
# 基本使用
./server --version
# 或者
./server -version
# 或者
./server version
# 或者
./server -v
# 或者
./server -V示例输出
Project Management System
Version: v0.4.9
Go Version: go1.24.10
7. 发布和编译脚本 🛠️
功能描述
添加了自动化发布和编译脚本,简化版本发布和构建流程,支持多平台编译和版本信息注入。
发布脚本 (release.sh)
- 自动更新版本号:自动更新
backend/cmd/server/main.go中的版本号 - 提交和推送:自动提交更改并推送到远程仓库
- 创建/更新 Tag:自动创建或更新 Git tag
- 推送 Tag:自动推送 tag 到远程仓库
编译脚本 (build.sh)
- 多平台支持:支持 Linux、Windows、macOS 等多个平台
- 版本信息注入:自动注入版本号、构建时间、Git 提交哈希
- 前端构建:自动构建前端并复制到 embed 目录
- 统一输出:输出到
releases/<版本号>/目录
使用方法
# 发布版本
./scripts/release.sh v0.5.0 "新功能发布"
# 编译单个平台
./scripts/build.sh v0.5.0 linux
# 编译所有平台
./scripts/build.sh v0.5.0 all支持的平台
linux- Linux (静态编译, 仅支持MySQL)linux-sqlite- Linux (支持SQLite, 需要CGO)windows- Windowsmac- macOS (Intel)mac-arm- macOS (Apple Silicon)all- 构建所有平台
8. 命令行参数处理优化 🔧
功能描述
重构了命令行参数处理方式,使用 Go 标准库 flag 包替代字符串比较,使参数处理更加规范和易维护。
改进内容
- 标准化处理:使用 Go 标准库
flag包处理命令行参数 - 自动帮助:添加
--help/-h参数支持,自动显示帮助信息 - 参数验证:自动检测未知参数并提示错误
- 代码优化:参数定义集中管理,易于维护和扩展
使用方法
# 显示帮助信息
./server --help
# 或者
./server -h支持的参数
--backup/-backup- 备份数据库--stop/-stop- 停止服务器--restart/-restart- 重启服务器--version/-version/-v/-V- 显示版本信息--help/-h- 显示帮助信息
优势
- 标准化:符合 Go 语言惯例,使用标准库
- 易维护:参数定义集中,易于添加新参数
- 用户友好:自动支持帮助信息,提供清晰的使用说明
- 错误处理:自动检测未知参数并提示
9. 关于菜单功能 📱
功能描述
在用户菜单中添加了"关于"菜单项,点击后可以查看系统版本信息,包括版本号、构建时间、Git提交哈希和Go版本等详细信息。
功能特点
- 位置便捷:位于用户菜单中,"退出登录"前面
- 信息完整:显示系统名称、版本号、构建时间、Git提交、Go版本等
- 自动加载:点击"关于"时自动从后端获取最新版本信息
- 友好展示:使用描述列表组件清晰展示各项信息
- 容错处理:如果获取失败,显示默认版本信息
使用方法
- 点击右上角用户头像
- 在下拉菜单中点击"关于"
- 查看系统版本信息弹窗
显示内容
- 系统名称:项目管理系统
- 版本号:当前系统版本(如 v0.4.9)
- 构建时间:系统构建时间(如果可用)
- Git提交:Git提交哈希(如果可用)
- Go版本:编译时使用的Go版本
技术实现
- 后端提供
/api/version接口返回版本信息(无需认证) - 前端使用
getVersionInfoAPI 获取版本信息 - 使用 Ant Design Vue 的
a-descriptions组件展示信息 - 版本信息API与版本管理API共存于
frontend/src/api/version.ts文件中,通过不同的接口路径区分- 系统版本信息:
/api/version(GET) - 版本管理:
/api/versions(GET/POST/PUT/DELETE等)
- 系统版本信息:
10. 测试单状态值修复 🔧
问题描述
测试单的状态值在前端表单和操作按钮中使用的是 pending/running/passed/failed,但后端API只支持 wait/normal/blocked/investigate,导致状态更新失败。
修复内容
- 统一状态值:将前端所有状态值统一为后端支持的值
wait- 待评审normal- 正常blocked- 被阻塞investigate- 研究中
- 更新API接口:更新
CreateTestCaseRequest和UpdateTestCaseRequest的状态类型定义 - 更新表单选项:更新表单中的状态选项为正确的值
- 更新操作按钮:更新状态变更按钮的状态值为正确的值
- 移除状态映射:移除编辑时的状态值转换逻辑,直接使用后端返回的状态值
- 更新状态显示:更新状态颜色和文本映射,确保正确显示
修复效果
- ✅ 测试单状态更新功能正常
- ✅ 前后端状态值完全一致
- ✅ 状态显示正确
- ✅ 符合禅道测试单状态规范
问题修复详情
修复的问题
- ✅ 详情页面需要跳转,操作效率低
- ✅ 不同列表的交互方式不一致
- ✅ 详情按钮冗余,界面不够简洁
- ✅ 测试单状态值不一致,导致状态更新失败
- ✅ 项目详情显示不正确
- ✅ 版本列表页面空白
- ✅ 版本列表
useRouter和watch未导入错误 - ✅ 任务列表重复函数定义错误
- ✅ TypeScript 构建错误:未使用的
router变量 - ✅ TypeScript 类型错误:Action 接口缺少
status_changed和progress_updated类型定义
修复后的效果
- ✅ 所有列表统一使用弹窗显示详情,操作更便捷
- ✅ 点击行即可打开详情,交互更直观
- ✅ 所有操作都可以在弹窗中完成,无需跳转
- ✅ 测试单状态值统一,状态更新功能正常
- ✅ 前后端状态值完全一致
- ✅ 界面更简洁,交互更统一
- ✅ TypeScript 构建通过,无类型错误
- ✅ Action 类型定义完整,支持所有操作类型
技术实现
详情弹窗实现
实现方案
-
状态管理
const detailModalVisible = ref(false) const detailXXX = ref<XXX | null>(null) const detailLoading = ref(false) const shouldKeepDetailOpen = ref(false)
-
加载详情
const loadXXXDetail = async (id: number) => { detailLoading.value = true try { detailXXX.value = await getXXX(id) } finally { detailLoading.value = false } }
-
打开详情
const handleView = async (record: XXX) => { detailModalVisible.value = true await loadXXXDetail(record.id) }
-
表格行点击
<a-table :custom-row="(record) => ({ onClick: () => handleView(record), class: 'table-row-clickable' })" >
-
防止事件冒泡
<a-button @click.stop="handleEdit(record)">编辑</a-button>
测试单状态值修复
实现方案
-
更新API接口定义
export interface CreateTestCaseRequest { status?: 'wait' | 'normal' | 'blocked' | 'investigate' }
-
更新表单选项
<a-select-option value="wait">待评审</a-select-option> <a-select-option value="normal">正常</a-select-option> <a-select-option value="blocked">被阻塞</a-select-option> <a-select-option value="investigate">研究中</a-select-option>
-
更新状态映射
const getStatusText = (status: string) => { const texts: Record<string, string> = { wait: '待评审', normal: '正常', blocked: '被阻塞', investigate: '研究中' } return texts[status] || status }
测试验证
测试场景
- ✅ Bug列表点击行打开详情弹窗
- ✅ Bug详情弹窗中所有操作功能正常
- ✅ 需求列表点击行打开详情弹窗
- ✅ 需求详情弹窗中所有操作功能正常
- ✅ 任务列表点击行打开详情弹窗
- ✅ 任务详情弹窗中所有操作功能正常
- ✅ 版本列表点击行打开详情弹窗
- ✅ 版本详情弹窗中所有操作功能正常
- ✅ 项目列表点击行打开详情弹窗
- ✅ 项目详情弹窗中所有操作功能正常
- ✅ 测试单列表点击行打开详情弹窗
- ✅ 测试单详情弹窗中所有操作功能正常
- ✅ 操作按钮不会触发行点击事件
- ✅ 编辑后详情自动刷新
- ✅ 测试单状态值更新功能正常
- ✅ 测试单状态显示正确
- ✅ TypeScript 类型检查通过
- ✅ 前端构建成功,无编译错误
- ✅ Action 类型定义完整,支持所有操作类型
- ✅ 数据库备份功能正常
- ✅ 服务器停止功能正常
- ✅ 服务器重启功能正常
- ✅ 版本信息显示功能正常
- ✅ 发布脚本功能正常
- ✅ 编译脚本功能正常
- ✅ 命令行参数处理正常
- ✅ 帮助信息显示正常
- ✅ 关于菜单功能正常
- ✅ 版本信息显示正常
测试结果
- 所有测试场景通过
- 详情弹窗功能稳定可靠
- 状态值修复功能正常
- TypeScript 构建通过
- 用户体验显著提升
- 无回归问题
更新内容
修改文件
前端:
frontend/src/views/bug/Bug.vue- 详情改为弹窗显示,移除详情按钮frontend/src/views/requirement/Requirement.vue- 详情改为弹窗显示,移除详情按钮,修复未使用的router变量frontend/src/views/task/Task.vue- 详情改为弹窗显示,移除详情按钮,修复未使用的router变量frontend/src/views/version/Version.vue- 详情改为弹窗显示,移除详情按钮,修复导入错误frontend/src/views/project/Project.vue- 详情改为弹窗显示,移除详情按钮,修复详情显示和操作按钮frontend/src/views/test/TestCase.vue- 详情改为弹窗显示,修复状态值frontend/src/api/testCase.ts- 更新状态类型定义frontend/src/api/requirement.ts- 添加status_changed到 Action 类型定义frontend/src/api/task.ts- 添加status_changed和progress_updated到 Action 类型定义frontend/src/components/AppHeader.vue- 添加"关于"菜单项和版本信息弹窗frontend/src/api/version.ts- 添加系统版本信息API(getVersionInfo),与版本管理API共存
后端:
backend/cmd/server/main.go- 添加数据库备份功能(--backup参数)、服务器停止功能(--stop参数)、服务器重启功能(--restart参数)、版本信息功能(--version参数)、使用flag包重构命令行参数处理、添加系统版本信息API接口(/api/version)
脚本:
scripts/release.sh- 发布版本脚本,自动更新版本号、创建tag、推送代码scripts/build.sh- 编译脚本,支持多平台编译和版本信息注入scripts/README.md- 发布和编译脚本使用说明
代码质量改进
用户体验
- 改进前:详情页面需要跳转,操作效率低
- 改进后:所有详情使用弹窗显示,操作更便捷
- 优势:无需跳转页面,操作效率显著提升
交互统一
- 改进前:不同列表的交互方式不一致
- 改进后:所有列表统一使用点击行打开详情弹窗
- 优势:交互方式统一,降低学习成本
界面简化
- 改进前:每个列表都有详情按钮,界面冗余
- 改进后:移除详情按钮,统一使用点击行打开详情
- 优势:界面更简洁,交互更直观
状态值统一
- 改进前:测试单状态值前后端不一致
- 改进后:前后端状态值完全一致
- 优势:状态更新功能正常,符合禅道规范
代码质量
- 改进前:TypeScript 构建错误,未使用的变量和类型定义不完整
- 改进后:移除未使用的变量,完善类型定义,构建通过
- 优势:代码质量提升,类型安全,便于维护
已知问题
无
后续计划
- 考虑为详情弹窗添加键盘快捷键支持
- 继续优化弹窗的响应式布局
- 考虑添加详情弹窗的打印功能
- 优化移动端弹窗显示效果
升级指南
从 v0.4.8 升级
-
代码更新:拉取最新代码
git pull origin main
-
前端构建:重新构建前端代码
cd frontend npm install npm run build -
测试验证:
- 测试所有列表的详情弹窗功能
- 验证点击行打开详情功能
- 检查所有操作功能是否正常
- 验证测试单状态值更新功能
注意事项
- 此版本主要进行用户体验优化和功能增强
- 详情页面改为弹窗显示,不影响现有功能
- 所有列表统一使用点击行打开详情
- 测试单状态值已修复,确保前后端一致
- 数据库备份功能仅支持 SQLite 数据库
- 服务器停止和重启功能需要系统工具支持(lsof、ss 或 netstat)
- 发布和编译脚本需要 Git 和 Go 环境
开发体验改进
交互优化
- 统一的弹窗模式,便于新模块开发
- 清晰的弹窗逻辑,易于理解和维护
- 提升用户操作效率,改善用户体验
功能完善
- 详情功能更完善,支持所有操作
- 统一的交互模式,降低学习成本
- 提升系统整体易用性
致谢
感谢所有贡献者的支持和反馈!
下载地址: GitHub Releases