团队作业3——需求改进&系统设计

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/
这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/homework/13482
这个作业的目标 修改完善需求规格说明书,完成Alpha任务分配和测试计划
github仓库链接

一、作业概述

本次作业为团队作业3,核心围绕“系统改进”与“系统设计”两大核心模块展开。基于前期需求规格说明书和用户反馈,完成功能优化迭代,输出详细的系统架构设计、模块设计、界面设计及数据库设计,为Alpha阶段核心开发提供完整技术蓝图,确保开发工作有序推进。

二、系统改进(基于需求反馈与技术可行性分析)

1. 需求反馈收集与分析

通过对3名目标用户(实验室研究人员、办公室职员、学生小组组长)的深度访谈,结合技术实现难度评估,整理核心反馈及改进方向如下:

  • 已采纳反馈:增加文件断点续传功能(解决大文件传输中断需重传问题)、优化图片预览交互(支持缩放查看)、添加聊天记录搜索功能(快速定位关键信息)
  • 待后续迭代反馈:增加群聊分组功能(当前优先级低于核心功能,规划Beta阶段实现)、支持自定义界面主题(技术复杂度较高,暂不纳入Alpha阶段)
  • 未采纳反馈:添加云端存储功能(违背局域网无外网依赖核心定位)、支持跨平台客户端(聚焦Windows核心用户,暂不扩展Linux/Mac端)

2. 功能改进明细(分优先级)

2.1 核心改进功能(P0-随Alpha阶段实现)

  • 文件断点续传:基于RandomAccessFile类实现,记录已传输字节位置,网络中断后可从断点继续传输,支持暂停/恢复操作
  • 图片预览优化:聊天区域缩略图点击后弹出独立预览窗口,支持鼠标滚轮缩放、快捷键关闭(ESC)、原图保存功能
  • 聊天记录本地搜索:支持按关键词模糊查询文本消息,高亮显示匹配结果,支持按时间范围筛选(今日/昨日/近7天)

2.2 体验优化功能(P1-核心功能稳定后补充)

  • 消息气泡样式优化:区分发送方/接收方气泡颜色(发送方蓝色、接收方灰色),增加消息发送状态标识(已发送/已送达)
  • 音频播放优化:语音消息支持进度拖拽播放,增加播放速度调节(0.8x/1.0x/1.2x)
  • 连接状态智能提示:网络波动时显示“连接不稳定”预警,重连成功后自动同步未接收消息

3. 技术方案调整

  • 网络通信:原计划使用原生TCP Socket,优化为基于Java NIO的非阻塞通信模型,提升并发连接处理能力,支持更多用户同时在线
  • 数据传输:消息格式统一采用JSON格式封装,新增MsgType字段区分文本、文件、语音、图片等消息类型,便于服务端快速解析转发
  • 文件存储:接收文件默认保存路径优化为“用户文档/ChatApp/接收文件”,按“日期+发送方”自动分类文件夹,便于查找管理

三、系统总体设计

1. 架构设计(分层架构+CS架构结合)

采用“表现层-业务逻辑层-数据访问层-网络通信层”的四层架构设计,各层职责清晰、解耦性强,便于分工开发和后期维护:

  • 表现层(客户端):基于Java Swing实现,包含登录界面、主聊天界面、文件传输界面等所有用户交互组件,负责用户操作接收与结果展示
  • 业务逻辑层(客户端+服务端):客户端负责本地消息处理、界面状态管理;服务端负责用户连接管理、消息转发、权限校验、文件传输调度
  • 数据访问层(客户端+服务端):客户端负责本地聊天记录、用户配置、接收文件的存储;服务端负责在线用户状态、离线消息的临时存储
  • 网络通信层(客户端+服务端):基于TCP协议封装通信工具类,负责数据序列化/反序列化、连接建立/断开、异常处理与自动重连

2. 系统架构图

┌───────────────────────── 客户端 ──────────────────────────┐
│  表现层:Swing界面组件(登录页、聊天窗口、预览窗口等)    │
├─────────────────────────────────────────────────────────┤
│  业务逻辑层:消息处理、界面状态管理、本地功能调度        │
├─────────────────────────────────────────────────────────┤
│  数据访问层:本地数据库操作、文件I/O、配置存储          │
├─────────────────────────────────────────────────────────┤
│  网络通信层:TCP连接管理、数据序列化、自动重连          │
└───────────────────────────┬─────────────────────────────┘
                            │ 局域网TCP通信
┌───────────────────────────▼─────────────────────────────┐
│  网络通信层:客户端连接监听、数据转发、通信异常处理      │
├─────────────────────────────────────────────────────────┤
│  数据访问层:在线用户状态存储、离线消息缓存、文件传输记录│
├─────────────────────────────────────────────────────────┤
│  业务逻辑层:用户管理、消息路由、权限校验、传输调度      │
├─────────────────────────────────────────────────────────┤
│  表现层:服务端控制台(状态监控、日志输出)             │
└───────────────────────── 服务端 ──────────────────────────┘

3. 核心技术栈确认

  • 开发语言:Java 8(兼顾兼容性与功能完整性)
  • 客户端GUI:Java Swing + AWT(界面组件)、ImageIO(图片处理)
  • 网络通信:Java Socket + NIO(非阻塞通信)、JSON(消息序列化)
  • 数据存储:SQLite(本地聊天记录)、文件系统(接收文件/音频/图片)
  • 多媒体处理:Java Sound API(音频录制/播放)、RandomAccessFile(文件断点续传)
  • 辅助工具:Axure RP(原型设计)、DrawIO(架构图绘制)、JUnit(单元测试)

四、详细模块设计

1. 模块划分(按功能维度)

系统分为6大核心模块,模块间通过接口交互,降低耦合度:

  • 用户管理模块(服务端+客户端)
  • 消息处理模块(服务端+客户端)
  • 文件传输模块(服务端+客户端)
  • 多媒体处理模块(客户端)
  • 本地存储模块(客户端)
  • 界面交互模块(客户端)

2. 核心模块详细设计

2.1 用户管理模块

  • 核心职责:用户登录验证、在线状态管理、用户列表维护
  • 核心功能
    1. 客户端:用户名输入校验(3-20位字母/数字/下划线)、服务器连接配置(IP+端口输入)、登录状态保存
    2. 服务端:用户连接建立/断开监听、在线用户列表维护与广播、离线状态检测(心跳包机制,30秒无响应判定离线)
  • 关键接口
    • UserService.login(String username, String serverIp, int port):客户端登录方法
    • UserManager.addOnlineUser(String username, Socket socket):服务端添加在线用户
    • UserManager.broadcastUserStatus(String username, int status):广播用户状态变更(在线/离线)

2.2 消息处理模块

  • 核心职责:消息收发、消息类型解析、聊天记录管理
  • 消息类型定义
    • 文本消息(TYPE_TEXT)、图片消息(TYPE_IMAGE)、语音消息(TYPE_VOICE)、文件消息(TYPE_FILE)、状态通知(TYPE_NOTIFY)
  • 核心功能
    1. 客户端:消息编辑与发送、消息接收与解析、聊天记录本地缓存与搜索
    2. 服务端:消息转发(一对一/群播)、离线消息缓存、消息格式校验
  • 关键接口
    • MessageService.sendMsg(Message msg):客户端发送消息
    • MessageDispatcher.dispatch(Message msg):服务端消息分发
    • ChatRecordService.searchMsg(String keyword, Date startDate, Date endDate):聊天记录搜索

2.3 文件传输模块

  • 核心职责:文件上传/下载、断点续传、传输进度监控
  • 核心功能
    1. 客户端:文件选择与发送、传输进度显示(百分比+进度条)、暂停/恢复/取消传输、断点续传支持
    2. 服务端:文件传输请求转发、传输状态记录、传输权限校验
  • 关键技术
    • 采用分片传输策略,单文件分块大小为1MB,降低单次传输压力
    • 通过RandomAccessFile.seek()方法定位传输起始位置,实现断点续传
  • 关键接口
    • FileTransferService.sendFile(String filePath, String targetUser):发送文件
    • FileTransferService.resumeTransfer(String fileId, long startByte):断点续传
    • FileTransferListener.onProgressUpdate(int progress):传输进度回调

3. 模块交互流程

3.1 文本消息发送流程

  1. 客户端:用户输入文本 → 调用MessageService.sendMsg()封装消息对象(含发送方、接收方、内容、时间戳、消息类型)
  2. 客户端:网络通信层将消息序列化为JSON格式 → 通过TCP Socket发送至服务端
  3. 服务端:网络通信层接收数据 → 反序列化为消息对象 → 调用MessageDispatcher.dispatch()解析接收方
  4. 服务端:若接收方在线,直接转发消息;若离线,缓存至离线消息队列
  5. 接收端客户端:接收消息 → 反序列化 → 更新界面聊天区域 → 缓存至本地数据库

3.2 文件传输流程(含断点续传)

  1. 发送方客户端:选择文件 → 调用FileTransferService.sendFile() → 发送文件元信息(文件名、大小、文件ID)至服务端
  2. 服务端:转发文件元信息至接收方客户端 → 接收方返回“接收就绪”响应
  3. 发送方:按1MB分片传输文件数据 → 服务端转发 → 接收方写入本地文件(RandomAccessFile
  4. 传输中断时:发送方记录已传输字节数与文件ID → 重连后调用resumeTransfer() → 从断点位置继续传输
  5. 传输完成:发送方发送“传输完成”标识 → 接收方校验文件完整性 → 提示用户文件接收完成

五、界面设计(基于Axure低保真原型优化)

1. 界面设计原则

遵循“简洁直观、操作便捷”原则,贴合目标用户操作习惯,核心设计要点:

  • 功能分区明确:左侧在线用户列表、中间聊天区域、右侧功能面板(文件/图片/语音快捷发送)
  • 交互逻辑统一:按钮hover效果、消息发送/接收反馈、弹窗关闭逻辑保持一致
  • 视觉层次清晰:使用字体大小、颜色区分标题、内容、提示信息,关键按钮突出显示

2. 核心界面设计

2.1 登录界面

  • 核心元素:服务器IP输入框(默认记录上次连接IP)、端口输入框(默认8888)、用户名输入框、登录按钮、退出按钮
  • 交互优化:输入框校验(IP格式、端口范围1-65535、用户名非空)、登录加载状态提示、连接失败错误提示(如“服务器未启动”“网络不可达”)

2.2 主聊天界面

  • 左侧在线用户列表:显示用户头像(默认灰色头像,支持自定义)、用户名、在线状态(绿色圆点标识在线),点击用户切换聊天对象
  • 中间聊天区域:
    • 顶部:显示当前聊天对象昵称、在线状态、设置按钮(聊天记录清空/置顶)
    • 中间:消息气泡展示区(区分发送方/接收方)、图片缩略图、语音消息播放按钮
    • 底部:文本输入框(支持回车发送)、功能按钮栏(表情、图片、文件、语音录制)、发送按钮
  • 右侧功能面板:默认隐藏,点击展开,显示最近传输文件、常用图片、语音录制快捷入口

2.3 关键功能界面

  • 图片预览窗口:居中显示原图,支持滚轮缩放(100%-200%)、右键保存、ESC快捷键关闭
  • 文件传输界面:独立弹窗,显示文件名称、传输进度条、百分比、剩余时间,支持暂停/取消按钮
  • 聊天记录搜索界面:顶部搜索框(关键词输入+时间筛选)、中间搜索结果列表(高亮匹配关键词)、底部清空按钮

3. 界面原型截图

登录界面原型(实际替换为Axure原型截图)
主聊天界面原型(实际替换为Axure原型截图)
文件传输界面原型(实际替换为Axure原型截图)

六、数据存储设计

1. 存储方案选择

  • 客户端本地存储:采用SQLite轻量级数据库,存储聊天记录、用户配置、文件传输记录,无需额外安装数据库服务,适配Windows环境
  • 服务端存储:采用内存+文件结合方式,在线用户状态、临时连接信息存储在内存(HashMap),离线消息、用户登录记录存储在本地文件(JSON格式),避免数据库依赖,简化部署

2. 客户端数据库设计(SQLite)

2.1 聊天记录表(chat_records)

字段名 字段类型 约束 说明
id INTEGER PRIMARY KEY AUTOINCREMENT 记录唯一标识
sender TEXT NOT NULL 发送方用户名
receiver TEXT NOT NULL 接收方用户名
msg_type INTEGER NOT NULL 消息类型(1-文本、2-图片、3-语音、4-文件)
content TEXT NOT NULL 消息内容(文本消息为内容,文件/图片/语音为本地路径)
send_time DATETIME NOT NULL 发送时间戳
is_read INTEGER DEFAULT 0 是否已读(0-未读、1-已读)

2.2 用户配置表(user_config)

字段名 字段类型 约束 说明
id INTEGER PRIMARY KEY AUTOINCREMENT 配置ID
username TEXT NOT NULL UNIQUE 用户名
last_server_ip TEXT NOT NULL 上次连接服务器IP
last_server_port INTEGER NOT NULL 上次连接服务器端口
save_path TEXT NOT NULL 文件默认保存路径
is_auto_login INTEGER DEFAULT 0 是否自动登录(0-否、1-是)

2.3 文件传输记录表(file_transfer_records)

字段名 字段类型 约束 说明
file_id TEXT PRIMARY KEY 文件唯一标识(UUID生成)
file_name TEXT NOT NULL 文件名
file_path TEXT NOT NULL 文件本地路径
sender TEXT NOT NULL 发送方用户名
receiver TEXT NOT NULL 接收方用户名
file_size LONG NOT NULL 文件大小(字节)
transfer_status INTEGER NOT NULL 传输状态(0-未完成、1-已完成、2-已取消)
last_transfer_byte LONG DEFAULT 0 上次传输字节位置(用于断点续传)
create_time DATETIME NOT NULL 传输创建时间

3. 服务端存储设计(文件存储)

3.1 离线消息文件(offline_messages.json)

采用JSON数组格式存储,每条消息包含字段:sender、receiver、msg_type、content、send_time,示例如下:

[
  {
    "sender": "user1",
    "receiver": "user2",
    "msg_type": 1,
    "content": "这是一条离线消息",
    "send_time": "2024-10-20 15:30:22"
  }
]

3.2 用户登录记录文件(login_records.json)

存储用户登录历史,包含字段:username、login_time、login_ip,用于日志追溯和异常监控。

七、团队分工与完成情况

1. 分工明细

姓名 核心职责 本次作业具体任务 任务权重
努尔艾力·司马义 系统架构设计、服务端模块设计、技术方案选型 1. 制定总体架构设计(四层架构)
2. 完成服务端核心模块设计(用户管理、消息分发)
3. 设计文件传输模块技术方案(断点续传)
4. 编写服务端存储方案(内存+文件)
50%
刘浩辉 界面设计、客户端模块设计、数据库设计、系统改进 1. 收集用户反馈并整理改进需求
2. 完成Axure原型优化(核心界面)
3. 设计客户端核心模块(界面交互、本地存储)
4. 编写SQLite数据库设计(表结构+字段约束)
5. 整理模块交互流程
50%

2. 完成情况

  • 努尔艾力·司马义:已完成系统总体架构图、服务端模块设计文档、文件传输技术方案文档,所有任务100%完成,技术方案已同步至Git仓库
  • 刘浩辉:已完成用户反馈报告、Axure优化原型(4个核心界面)、客户端模块设计文档、数据库表结构设计,所有任务100%完成,原型文件已上传至仓库共享目录

八、开发风险与应对方案

1. 核心风险识别

  • 风险1:文件断点续传功能兼容性问题(不同Windows版本文件权限差异)
  • 风险2:高并发场景下消息转发延迟(多用户同时发送消息导致队列阻塞)
  • 风险3:Swing界面响应卡顿(文件传输与界面更新共用主线程)

2. 应对方案

  • 风险1:针对Windows 10/11进行兼容性测试,采用文件权限检测机制,异常时提示用户手动授权,同时提供备选存储路径
  • 风险2:服务端采用消息队列(LinkedBlockingQueue)缓冲消息,使用多线程池(FixedThreadPool)处理转发任务,避免单线程瓶颈
  • 风险3:客户端采用多线程设计,文件传输、网络通信单独开启子线程,通过SwingUtilities.invokeLater()更新界面,避免主线程阻塞

九、个人感想

1. 努尔艾力·司马义

本次系统设计让我深刻体会到“架构先行”的重要性。在设计四层架构时,需要充分考虑模块间的解耦与交互效率,既要保证技术可行性,又要为后续扩展预留空间。文件断点续传方案的选型过程中,对比了多种技术实现方式,最终选择基于RandomAccessFile的方案,既满足需求又控制了开发复杂度。后续开发中,我会重点关注服务端并发处理和消息转发效率,确保系统在高并发场景下的稳定性,同时严格按照设计文档推进开发,避免需求蔓延。

2. 刘浩辉

界面设计和数据库设计的过程,让我学会了从“用户体验”和“数据逻辑”双重角度思考问题。在优化Axure原型时,反复模拟用户操作流程,调整按钮位置和交互逻辑,只为让操作更直观。数据库表结构设计则需要兼顾查询效率和数据完整性,比如聊天记录表的索引设计、字段类型选择,都需要结合实际查询场景考量。通过本次作业,我对客户端开发的整体流程有了更清晰的认识,后续将专注于Swing界面实现和本地存储操作,确保界面美观、数据存储可靠,同时积极配合服务端进行联调测试。

十、总结

本次作业完成了系统改进需求梳理和完整的系统设计,明确了架构、模块、界面、存储等核心环节的技术方案,为Alpha阶段敏捷冲刺奠定了坚实基础。团队通过高效协作,实现了职责互补、任务同步推进,确保了设计文档的完整性和可行性。接下来,将进入核心开发阶段,严格按照设计方案和项目计划推进,聚焦核心功能实现,同时关注开发过程中的风险与问题,及时调整优化,确保Alpha版本按时高质量交付。

posted @ 2026-01-08 15:21  allli  阅读(1)  评论(0)    收藏  举报