Skip to content

v0.4.9

Choose a tag to compare

@funnywwh funnywwh released this 01 Dec 07:55
· 106 commits to main since this release

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 组件实现弹窗
  • 添加 detailModalVisibledetailXXXdetailLoading 等状态变量
  • 实现 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>&1

4. 服务器停止功能 🛑

功能描述

为服务器添加了停止功能,支持通过命令行参数自动查找并停止运行中的服务器进程。

功能特点

  • 智能查找:通过端口号自动查找运行中的服务器进程(支持 lsofssnetstat
  • 优雅关闭:先发送 SIGTERM 信号优雅关闭(等待最多10秒)
  • 强制终止:如果进程未退出,自动发送 SIGKILL 强制终止
  • 错误提示:如果服务器未运行,会返回明确的错误信息

使用方法

# 基本使用
./server --stop

# 或者
./server -stop

# 或者
./server stop

工作原理

  1. 通过配置的端口号查找正在运行的服务器进程
  2. 发送 SIGTERM 信号优雅关闭
  3. 等待进程退出(最多10秒)
  4. 如果未退出,发送 SIGKILL 强制终止
  5. 显示停止结果

示例输出

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. 服务器重启功能 🔄

功能描述

为服务器添加了重启功能,支持通过命令行参数自动查找并停止运行中的服务器进程,然后重新启动服务器。

功能特点

  • 智能查找:通过端口号自动查找运行中的服务器进程(支持 lsofssnetstat
  • 优雅关闭:先发送 SIGTERM 信号优雅关闭(等待最多10秒)
  • 强制终止:如果进程未退出,自动发送 SIGKILL 强制终止
  • 自动重启:停止后自动在后台启动新的服务器进程

使用方法

# 基本使用
./server --restart

# 或者
./server -restart

# 或者
./server restart

工作原理

  1. 通过配置的端口号查找正在运行的服务器进程
  2. 发送 SIGTERM 信号优雅关闭
  3. 等待进程退出(最多10秒)
  4. 如果未退出,发送 SIGKILL 强制终止
  5. 重新启动服务器(后台运行)

与 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 - Windows
  • mac - 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版本等
  • 自动加载:点击"关于"时自动从后端获取最新版本信息
  • 友好展示:使用描述列表组件清晰展示各项信息
  • 容错处理:如果获取失败,显示默认版本信息

使用方法

  1. 点击右上角用户头像
  2. 在下拉菜单中点击"关于"
  3. 查看系统版本信息弹窗

显示内容

  • 系统名称:项目管理系统
  • 版本号:当前系统版本(如 v0.4.9)
  • 构建时间:系统构建时间(如果可用)
  • Git提交:Git提交哈希(如果可用)
  • Go版本:编译时使用的Go版本

技术实现

  • 后端提供 /api/version 接口返回版本信息(无需认证)
  • 前端使用 getVersionInfo API 获取版本信息
  • 使用 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接口:更新 CreateTestCaseRequestUpdateTestCaseRequest 的状态类型定义
  • 更新表单选项:更新表单中的状态选项为正确的值
  • 更新操作按钮:更新状态变更按钮的状态值为正确的值
  • 移除状态映射:移除编辑时的状态值转换逻辑,直接使用后端返回的状态值
  • 更新状态显示:更新状态颜色和文本映射,确保正确显示

修复效果

  • ✅ 测试单状态更新功能正常
  • ✅ 前后端状态值完全一致
  • ✅ 状态显示正确
  • ✅ 符合禅道测试单状态规范

问题修复详情

修复的问题

  • ✅ 详情页面需要跳转,操作效率低
  • ✅ 不同列表的交互方式不一致
  • ✅ 详情按钮冗余,界面不够简洁
  • ✅ 测试单状态值不一致,导致状态更新失败
  • ✅ 项目详情显示不正确
  • ✅ 版本列表页面空白
  • ✅ 版本列表 useRouterwatch 未导入错误
  • ✅ 任务列表重复函数定义错误
  • ✅ TypeScript 构建错误:未使用的 router 变量
  • ✅ TypeScript 类型错误:Action 接口缺少 status_changedprogress_updated 类型定义

修复后的效果

  • ✅ 所有列表统一使用弹窗显示详情,操作更便捷
  • ✅ 点击行即可打开详情,交互更直观
  • ✅ 所有操作都可以在弹窗中完成,无需跳转
  • ✅ 测试单状态值统一,状态更新功能正常
  • ✅ 前后端状态值完全一致
  • ✅ 界面更简洁,交互更统一
  • ✅ TypeScript 构建通过,无类型错误
  • ✅ Action 类型定义完整,支持所有操作类型

技术实现

详情弹窗实现

实现方案

  1. 状态管理

    const detailModalVisible = ref(false)
    const detailXXX = ref<XXX | null>(null)
    const detailLoading = ref(false)
    const shouldKeepDetailOpen = ref(false)
  2. 加载详情

    const loadXXXDetail = async (id: number) => {
      detailLoading.value = true
      try {
        detailXXX.value = await getXXX(id)
      } finally {
        detailLoading.value = false
      }
    }
  3. 打开详情

    const handleView = async (record: XXX) => {
      detailModalVisible.value = true
      await loadXXXDetail(record.id)
    }
  4. 表格行点击

    <a-table
      :custom-row="(record) => ({
        onClick: () => handleView(record),
        class: 'table-row-clickable'
      })"
    >
  5. 防止事件冒泡

    <a-button @click.stop="handleEdit(record)">编辑</a-button>

测试单状态值修复

实现方案

  1. 更新API接口定义

    export interface CreateTestCaseRequest {
      status?: 'wait' | 'normal' | 'blocked' | 'investigate'
    }
  2. 更新表单选项

    <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>
  3. 更新状态映射

    const getStatusText = (status: string) => {
      const texts: Record<string, string> = {
        wait: '待评审',
        normal: '正常',
        blocked: '被阻塞',
        investigate: '研究中'
      }
      return texts[status] || status
    }

测试验证

测试场景

  1. ✅ Bug列表点击行打开详情弹窗
  2. ✅ Bug详情弹窗中所有操作功能正常
  3. ✅ 需求列表点击行打开详情弹窗
  4. ✅ 需求详情弹窗中所有操作功能正常
  5. ✅ 任务列表点击行打开详情弹窗
  6. ✅ 任务详情弹窗中所有操作功能正常
  7. ✅ 版本列表点击行打开详情弹窗
  8. ✅ 版本详情弹窗中所有操作功能正常
  9. ✅ 项目列表点击行打开详情弹窗
  10. ✅ 项目详情弹窗中所有操作功能正常
  11. ✅ 测试单列表点击行打开详情弹窗
  12. ✅ 测试单详情弹窗中所有操作功能正常
  13. ✅ 操作按钮不会触发行点击事件
  14. ✅ 编辑后详情自动刷新
  15. ✅ 测试单状态值更新功能正常
  16. ✅ 测试单状态显示正确
  17. ✅ TypeScript 类型检查通过
  18. ✅ 前端构建成功,无编译错误
  19. ✅ Action 类型定义完整,支持所有操作类型
  20. ✅ 数据库备份功能正常
  21. ✅ 服务器停止功能正常
  22. ✅ 服务器重启功能正常
  23. ✅ 版本信息显示功能正常
  24. ✅ 发布脚本功能正常
  25. ✅ 编译脚本功能正常
  26. ✅ 命令行参数处理正常
  27. ✅ 帮助信息显示正常
  28. ✅ 关于菜单功能正常
  29. ✅ 版本信息显示正常

测试结果

  • 所有测试场景通过
  • 详情弹窗功能稳定可靠
  • 状态值修复功能正常
  • 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_changedprogress_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 升级

  1. 代码更新:拉取最新代码

    git pull origin main
  2. 前端构建:重新构建前端代码

    cd frontend
    npm install
    npm run build
  3. 测试验证

    • 测试所有列表的详情弹窗功能
    • 验证点击行打开详情功能
    • 检查所有操作功能是否正常
    • 验证测试单状态值更新功能

注意事项

  • 此版本主要进行用户体验优化和功能增强
  • 详情页面改为弹窗显示,不影响现有功能
  • 所有列表统一使用点击行打开详情
  • 测试单状态值已修复,确保前后端一致
  • 数据库备份功能仅支持 SQLite 数据库
  • 服务器停止和重启功能需要系统工具支持(lsof、ss 或 netstat)
  • 发布和编译脚本需要 Git 和 Go 环境

开发体验改进

交互优化

  • 统一的弹窗模式,便于新模块开发
  • 清晰的弹窗逻辑,易于理解和维护
  • 提升用户操作效率,改善用户体验

功能完善

  • 详情功能更完善,支持所有操作
  • 统一的交互模式,降低学习成本
  • 提升系统整体易用性

致谢

感谢所有贡献者的支持和反馈!


下载地址: GitHub Releases