项目介绍
本云音乐平台是一款可以在线播放音乐的音乐平台。主要实现了在线音乐的播放和歌单的显示,歌词的传输和显示,桌面歌词,根据关键字搜素音乐歌单歌手和专辑和本地播放等功能。用户也可以创建自己的歌单,为自己创建的歌单插入自己选择的图片。该流媒体子系统采用C/S(Client/Server)架构,vlc解码、live555传输,以及C++编程语言,对子系统需求和功能进行了设计与实现。本文主要针对软件系统设计方案结合此音乐播放器进行分析。
软件架构风格描述
软件架构既要考虑满足数量众多的各种系统功能需求, 也需要完成诸如系统的易用性、系统的可维护性等非功能性的设计目标, 还要遵从各种行业标准和政策法规。 不过并不是每一个项目我们都需要从头开始进行完全创新性的设计,更多的是通过研究借鉴优秀的设计方案,来逐步改进我们的设计。换句话说,大多数的设计工作都是通过复用(Reuse)相似项目的解决方案,或者采用一些优秀设计方案的方法,这让看起来非常有挑战性的软件架构设计工作变得有例可循。
但是,软件架构又是至关重要的:
首先,软件架构模型有助于项目成员从整体上理解整个系统
其次,给复用提供了一个高层视图,既可以辅助决定从其他系统中复用设计或组件,也给我们构建的软件架构模型未来的复用提供了更多可能性
再次,软件架构模型为整个项目的构建过程提供了一个蓝图,贯穿于整个项目的生命周期
最后,软件架构模型有助于理清系统演化的内在逻辑、有助于跟踪分析软件架构上的依赖关系、有助于项目管理决策和项目风险管理等
系统软件架构
通过前期的需求捕获,建立了用况模型,然后进行了健壮性分析,绘制了通信、交互图,最后得到了类模型。本音乐平台系统采用C/S架构,主要设计两个服务器:RTSP Media Server(流媒体服务器)用于实现流媒体在线播放,Server(数据库服务器)用于管理客户端数据和处理客户端的数据请求。
接口API
由于采用C/S架构,客户端可向服务器请求数据,API是客户端和服务器之间交流的接口。系统中主要的接口如下:
接口名称 | 请求方式 | 请求参数 | 响应信息 | 备注 |
用户登录 | POST | 用户名,密码 | 用户基本信息,是否登录成功 | |
用户注册 | POST | 用户名,密码 | 用户名是否可用,注册是否成功 | 用户名不能重复 |
新建歌单 | POST | 用户名,歌单名 | F/T | 同一个用户的歌单名不能重复 |
获取歌单信息 | GET | 用户名,歌单名 | 歌单内歌曲名、专辑、歌手 | |
删除歌单 | DELETE | 用户名,歌单名 | F/T | |
获取歌手的专辑 | GET | 歌手名 | 专辑列表 | |
获取专辑内歌曲 | GET | 专辑名 | 歌曲列表 | |
播放歌曲 | POST | 歌曲名 | 歌曲路径信息,音频流 | 歌曲信息来自数据库服务器 音频流来自流媒体服务器 |
获取歌词 | GET | 歌曲名 | 歌词文件 | 根据歌词文件内时序信息显示歌词 |
搜索 | POST | 搜索内容 | 搜索结果 | 搜索可以多种内容: 1.搜索内容为歌曲名,返回专辑名、歌手信息 2.搜索内容为歌手名,歌手及其专辑列表 3.搜索内容为专辑名,返回专辑及其歌曲列表 |
重命名歌单 | POST | 原始歌单名,新歌单名 | 是否成功 |
项目实现视图
下图为客户端源代码文件目录结构,分为四个部分。其中,
- helper用来与数据库服务器和流媒体服务器进行交互,获取必要的信息
- musicControl用来控制音乐播放的进度和时间,如暂停、下一曲等
- ui用来与用户进行交互,显示交互界面
- application是总体的音乐播放器实现
下图为数据库服务器源代码文件目录结构。存在四个实体类,分别是music、album、singer、musictable。musicbroker是一个控制类,用来控制数据库的增删查改等操作。这里数据库服务器相当于一个小型的MVC架构。
软件系统概念原型
软件架构模型是通过一组关键视图来描述的,同一个软件架构,由于选取的视角(Perspective)和抽象层次不同可以得到不同的视图,这样一组关键视图搭配起来可以完整地描述一个逻辑自洽的软件架构模型。一般来说,我们常用的几种视图有分解视图、依赖视图、泛化视图、执行视图、实现视图、部署视图和工作任务分配视图。
项目分解视图
依赖视图
执行视图
数据库服务器泛化视图
数据库服务器中有一个控制类,对整体的实体类和数据库进行增删查改的工作。MusicTable是包含Music列表的实体类。
数据库设计
歌迷
变量名 | 类型 | 唯一 | 含义 |
userName | string | 是 | 用户名 |
password | string | 是 | 密码 |
music表
变量名 | 类型 | 唯一 | 含义 |
m_name | string | 是 | 歌曲名 |
m_startDate | string | 是 | 时间 |
m_singerName | string | 是 | 歌手 |
m_album | string | 是 | 所在专辑 |
Album表
变量名 | 类型 | 唯一 | 含义 |
m_name | string | 是 | 专辑名 |
m_startDate | string | 否 | 时间 |
m_singerName | string | 否 | 歌手名 |
_musics | Music | 否 | 歌曲列表 |
Singer表
变量名 | 类型 | 唯一 | 含义 |
m_name | string | 是 | 歌手名 |
m_category | string | 否 | 歌手类别 |
_albums | Album | 否 | 专辑列表 |
管理员
变量名 | 类型 | 唯一 | 含义 |
AdName | string | 是 | 管理员账号 |
password | string | 是 | 密码 |
软件系统运行环境
运行系统:linux
平台:QtCreater
数据库:sqlite3 数据库
概念原型核心工作机制
软件架构代表了软件系统的整体设计结构,它应该是所有这些视图的集合。但我们不会将不同角度的这些视图整合起来,因为不便于阅读和更新。不过我们会有意识地将不同角度的视图之间的映射关系和重叠部分了然于胸,从而深刻理解软件架构内在的一致性和完整性,这就是系统概念原型。
概念是人对能代表某种事物或发展过程的特点及意义所形成的思维结论。概念原型是一种虚拟的、理想化的软件产品形式。就像“程序=算法+数据结构”一样,“概念原型=用例+数据模型”
本系统中用户主要通过播放歌曲,创建歌单等操作与客户端进行交互,客户端通过向服务器请求数据与数据模型交互,进而带动整个系统工作。