FileServer作为文件上传服务器,接收上传的音乐,图片等信息。
MusicWeb作为音乐网站服务器,提供用户登录,后台管理等功能。
音乐网站主页可以实现听音乐,收藏音乐,搜索音乐(通过歌名,歌手,分类等查询),上传音乐等功能。
后台管理可以实现对用户,音乐,分类等管理,实现增删改查功能。
-
音乐播放:进入音乐网站,点击歌曲进入音乐播放界面,打开音乐播放键,歌曲开始播放;
-
音乐上传:用户个人中心中,进行音乐的添加,输入音乐名称,类型以及图片等信息之后便可以上传音乐文件;
-
音乐查询:通过音乐名称,音乐分类,音乐所唱的语言进行音乐查询;
-
音乐收藏:选中收藏按键,音乐收藏成功;
-
用户注册登录:输入用户名、姓名、出生日期等信息并且提交,进行用户注册;
-
账号管理: 管理员成功登录后,可以查看账号信息、增添账号、查看已经注册的用户、添加新的用户以及对管理员账号的密码进行相应的修改等;
-
音乐分类管理:对音乐的类别来进行增添和查询。添加分类时输入分类名称并提交,可在首页添加新的音乐分类,音乐分类查询可以查看已经拥有的音乐分类;
-
音乐管理:对音乐进行增删改查操作,添加音乐时将音乐名称,音乐类型,音乐语言等信息一并输入,即可进行音乐的增添操作。
表名称 | 说明 |
---|---|
admin | 管理员信息表 |
user | 用户信息表 |
genre | 各区分类 |
song | 歌曲信息表 |
collect | 收藏表 |
comment | 评论表 |
浏览记录Redis |
表名:admin
登录:用户名+密码
列名 | 数据类型 | 约束 | 说明 |
---|---|---|---|
id | int | 非空唯一 | 主键 |
username | varchar(30) | 非空唯一 | 用户名 |
password | varcha(50) | 非空 | 密码 |
varchar(11) | 手机号 | ||
varchar(25) | 邮箱 | ||
enable | varchar(1) | 非空 | Y:启用 N:禁用 默认启用 |
用户名:user
登录:邮箱+密码
列名 | 数据类型 | 约束 | 说明 |
---|---|---|---|
id | int | 非空唯一 | 主键 |
varchar(11) | 唯一 | ||
varchar(25) | 非空唯一 | 邮箱最为用户登录账号 | |
password | varchar(50) | 非空 | 密码 |
nickname | varchar(20) | 昵称(可以使用昵称登录) | |
avatar | varchar(300) | 非空 | 用户头像 |
locked | char(1) | 非空 | Y:锁定 N:正常 默认正常 |
表名:genre
列名 | 数据类型 | 约束 | 说明 |
---|---|---|---|
id | int | 非空唯一 | 主键 |
name | varchar(20) | 非空唯一 | 名称 |
desc | varchar(50) | 分类描述 |
表名:song
列名 | 数据类型 | 约束 | 说明 |
---|---|---|---|
id | bigint | 非空唯一 | 主键 |
genre_id | int | 外键 分类ID | |
admin_id | int | 外键 上传歌曲管理员ID | |
title | varchar(255) | 非空 | 歌曲名称 |
source | varchar(300) | 非空 | 音乐链接 |
poster | varchar(300) | 非空 | 音乐图片 |
author | varchar(20) | 音乐作者,使用“,”间隔 | |
collections | bigint | 非空 | 音乐收藏量 |
status | int | 非空 | 发布状态 0:未发布 1:已发布 2:已下线 |
publish_time | timestamp | 发布时间 | |
offline_time | timestamp | 下线时间 | |
create_time | timestamp | 非空 | 创建时间 |
- 音乐的评论(根节点)
- 对评论的评论(树形结构)
方案一(多表):评论表 回复表
方案二(单表):父子表
实现:id与parent_id
表名:comment
列名 | 数据类型 | 约束 | 说明 |
---|---|---|---|
id | int | 非空唯一 | 主键 |
song_id | int | 非空 | 歌曲ID |
user_id | int | 非空 | 用户ID |
parent_id | int | 指向上级评论的ID, 如果是对歌曲的评论,值为null |
|
content | text | 非空 | 评论内容 |
create_time | timestamp | 非空 | 创建时间 |
一个用户收藏多首音乐,一首歌可以被多个用户收藏 多对多:中间表
表名:collect
列名 | 数据类型 | 约束 | 说明 |
---|---|---|---|
id | int | 非空唯一 | 主键 |
song_id | int | 非空 | 歌曲ID |
user_id | int | 非空 | 用户ID |
- 一对多关系:添加外键
- 多对多关系:中间表
- 大文本:
- id很多情况:bigint
- 树状结构:父子表
- 删除元素:逻辑删除
- 外键的删除更新时操作都改为no ation,使用程序来实现,不使用数据库实现
请求网址:localhost:2001/admin/login
方法:POST
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
username | String | 是 | 用户名 |
password | String | 是 | 密码 |
说明:返回为html页面
登录失败:返回error.jsp页面,过5面后自动跳转错误页面
登录成功:返回musicweb-admin.jsp页面
请求网址:localhost:2001/admin/page
方法:GET
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
pn | int | 是 | 页码 |
size | int | 否 | 页面大小,默认8 |
说明:返回为json数据
{
"code": 100,
"msg": "处理成功!",
"extend": {
"pageInfo": {}
}
}
请求网址:localhost:2001/admin/addUser
方法:POST
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
String | 是 | 邮箱 | |
password | String | 是 | 密码 |
nickname | String | 否 | 昵称 |
phone | String | 否 | 电话 |
avatar | String | 否 | 头像 |
birth | Date | 否 | 生日 |
说明:返回为json数据
【1】添加成功:code=100
{
"code": 100,
"msg": "处理成功!",
"extend": {
"user": {
"id": 6,
"phone": "",
"mail": "",
"password": "",
"nickname": "",
"avatar": "",
"locked": "N",
"birth":
}
}
}
【2】添加失败:code=200
{
"code": 200,
"msg": "该邮箱已注册!",
"extend": {}
}
请求网址:localhost:2001/admin/deleteUser
方法:GET/POST
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id | int | 是 | id |
说明:返回为json数据
【1】删除成功:code=100
{
"code": 100,
"msg": "处理成功!",
"extend": {
"deleteUser": {
"id": ,
"phone": "",
"mail": "",
"password": "",
"nickname": "",
"avatar": "",
"locked": "N",
"birth":
}
}
}
【2】删除失败:code=200
{
"code": 200,
"msg": "用户不存在",
"extend": {}
}
请求网址:localhost:2001/admin/updateUser
方法:POST
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id | int | 是 | id |
String | 否 | 邮箱 | |
password | String | 否 | 密码 |
nickname | String | 否 | 昵称 |
phone | String | 否 | 电话 |
avatar | String | 否 | 头像 |
birth | Date | 否 | 生日 |
locked | Boolean | 否 | 状态 |
说明:返回为json数据
【1】更新成功:code=100
{
"code": 100,
"msg": "处理成功!",
"extend": {
"user": {
"id": 4,
"phone": null,
"mail": null,
"password": "456",
"nickname": "bbb",
"avatar": null,
"locked": "N",
"birth": null
}
}
}
【2】更新失败:code=200
{
"code": 200,
"msg": "处理失败!",
"extend": {}
}
请求网址:localhost:2001/genre/addGenre
方法:POST
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
name | String | 是 | 分类名称 |
description | String | 否 | 描述 |
注意如果descrption使用缩写desc会与关键字冲突!
说明:返回为json数据
【1】添加成功:code=100
{
"code": 100,
"msg": "处理成功!",
"extend": {}
}
【2】添加失败:code=200
{
"code": 200,
"msg": "分类已存在",
"extend": {}
}
请求网址:localhost:2001/genre/page
方法:GET
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
pn | int | 是 | 页码 |
size | int | 否 | 页面大小 |
说明:返回为json数据
【1】成功:code=100
{
"code": 100,
"msg": "处理成功!",
"extend": {
"pageInfo": {
"total": 0,
"list": [],
"pageNum": 1,
"pageSize": 8,
"size": 0,
"startRow": 0,
"endRow": 0,
"pages": 0,
"prePage": 0,
"nextPage": 0,
"isFirstPage": true,
"isLastPage": true,
"hasPreviousPage": false,
"hasNextPage": false,
"navigatePages": 8,
"navigatepageNums": [],
"navigateFirstPage": 0,
"navigateLastPage": 0
}
}
}
请求网址:localhost:2001/genre/deleteGenre
方法:GET
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id | int | 是 | id |
说明:返回为json数据
【1】添加成功:code=100
{
"code": 100,
"msg": "处理成功!",
"extend": {}
}
【2】添加失败:code=200
{
"code": 200,
"msg": "用户不存在",
"extend": {}
}
请求网址:localhost:2001/genre/updateGenre
方法:POST
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id | int | 是 | id |
name | String | 否 | 分类名称 |
description | String | 否 | 描述 |
说明:返回为json数据
【1】添加成功:code=100
{
"code": 100,
"msg": "处理成功!",
"extend": {}
}
【2】添加失败:code=200
{
"code": 200,
"msg": "分类不存在",
"extend": {}
}
###3. 音乐管理
请求网址:localhost:2001/song/page
方法:POST
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
pn | int | 否 | 页码 |
size | int | 否 | 页面大小 |
说明:返回为json数据
{
"code": 100,
"msg": "处理成功!",
"extend": {
"pageInfo": {
"total": 0,
"list": [],
"pageNum": 1,
"pageSize": 8,
"size": 0,
"startRow": 0,
"endRow": 0,
"pages": 0,
"prePage": 0,
"nextPage": 0,
"isFirstPage": true,
"isLastPage": true,
"hasPreviousPage": false,
"hasNextPage": false,
"navigatePages": 8,
"navigatepageNums": [],
"navigateFirstPage": 0,
"navigateLastPage": 0
}
}
}
请求网址:localhost:2001/song/addSong
方法:POST
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
genre_id | int | 是 | 分类id |
admin_id | int | 是 | 上传人员id |
title | String | 是 | 标题 |
language | String | 否 | 语言 |
source | String | 是 | 歌曲链接 |
poster | String | 是 | 歌曲封面 |
author | String | 否 | 歌曲作者 |
说明:返回为json数据
{
"code": 100,
"msg": "处理成功!",
"extend": {
"song": {
"id": null,
"genreId": 1,
"adminId": null,
"title": "",
"language": "",
"source": "",
"poster": "",
"author": "",
"collection": 0,
"status": 1,
"publishTime": null,
"offlineTime": null,
"createTime": null
}
}
}
请求网址:localhost:2001/song/deleteSong
方法:POST
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id | int | 是 | id |
说明:返回为json数据
【1】处理成功
{
"code": 100,
"msg": "处理成功!",
"extend": {}
}
【2】处理失败
{
"code": 200,
"msg": "用户不存在",
"extend": {}
}
请求网址:localhost:2001/song/updateSong
方法:POST
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id | int | 是 | 修改音乐id |
genre_id | int | 否 | 分类id |
title | String | 否 | 标题 |
language | String | 否 | 语言 |
source | String | 否 | 歌曲链接 |
poster | String | 否 | 歌曲封面 |
author | String | 否 | 歌曲作者 |
status | int | 否 | 歌曲状态 |
说明:返回为json数据
【1】处理成功
{
"code": 100,
"msg": "处理成功!",
"extend": {
"song": {
"id": 6,
"genreId": 2,
"adminId": null,
"title": "test",
"language": "汉语",
"source": null,
"poster": null,
"author": "未知",
"collection": 0,
"status": 0,
"publishTime": null,
"offlineTime": null,
"createTime": null
}
}
}
【2】处理失败
{
"code": 200,
"msg": "歌曲不存在",
"extend": {}
}
请求网址:localhost:2001/song/title
方法:GET
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
title | String | 是 | 音乐名称 |
说明:返回为json数据
【1】处理成功
{
"code": 100,
"msg": "处理成功!",
"extend": {
"songList": [
{
"id": 2,
"genreId": 1,
"adminId": null,
"title": "again",
"language": "日语",
"source": "",
"poster": "",
"author": "",
"collection": 0,
"status": 1,
"publishTime": null,
"offlineTime": null,
"createTime": 1629990189000
},
{
...
},
{
...
}
]
}
}
请求网址:localhost:2001/song/genre
方法:GET
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id | int | 是 | 分类名称 |
说明:返回为json数据
【1】处理成功
{
"code": 100,
"msg": "处理成功!",
"extend": {
"songList": [
{
"id": 2,
"genreId": 1,
"adminId": null,
"title": "",
"language": "",
"source": "",
"poster": "",
"author": "",
"collection": 0,
"status": 1,
"publishTime": null,
"offlineTime": null,
"createTime": 1629990189000
},
{
...
},
{
...
}
]
}
}
请求网址:localhost:2001/user/login
方法:POST
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
String | 是 | 邮箱 | |
password | String | 是 | 密码 |
说明:返回为jsp页面
【1】登录成功:music.jsp
【2】登录失败:error.jsp,5秒后返回登录页面
请求网址:localhost:2001/user/register
方法:POST
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
String | 是 | 邮箱 | |
password | String | 是 | 密码 |
nickname | String | 否 | 昵称 |
phone | String | 否 | 电话 |
avatar | String | 否 | 头像 |
birth | Date | 否 | 生日 |
请求网址:localhost:2001/user/checkMail
方法:POST
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
String | 是 | 邮箱 |
说明:返回为json
【1】邮箱可用
{
"code": 100,
"msg": "邮箱可用",
"extend": {}
}
【2】邮箱不可用
{
"code": 200,
"msg": "邮箱重复",
"extend": {}
}
请求网址:localhost:2001/collect/add
方法:GET
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
songId | String | 是 | 音乐id |
userId | String | 是 | 用户id |
说明:返回为json数据
【1】处理成功
{
"code": 100,
"msg": "处理成功!",
"extend": {}
}
【2】处理失败
{
"code": 200,
"msg": "音乐不存在",
"extend": {}
}
请求网址:localhost:2001/collect/delete
方法:GET
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
songId | String | 是 | 音乐id |
userId | String | 是 | 用户id |
说明:返回为json数据
【1】处理成功
{
"code": 100,
"msg": "处理成功!",
"extend": {}
}
【2】处理失败
{
"code": 200,
"msg": "处理失败!",
"extend": {}
}
请求网址:localhost:2001/collect/show
方法:GET
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
userId | String | 是 | 用户id |
说明:返回为json数据
【1】处理成功
{
"code": 100,
"msg": "处理成功!",
"extend": {}
}