Lucky player —— Java 项目(Spring Boot)

一、项目介绍

项目名称:lucky player

项目的主要功能:本系统主要功能为构建了一个用户分享音乐的平台,普通用户不进行登录即可收听其他用户已经发布的专辑中的音乐。

 作为博主则可以在该平台上传音频,以及在线音频录制上传。音频上传成功后,博主可以把自己的音频整理到一个专辑内进行发布,并实现了在线播放的功能。该系统登录后的创作中心分为用户管理、音频管理、专辑管理三个模块。

二、项目需求

2.1功能需求

  (1)用户可以注册后登录进播放器,并且也可以随时退出已经登陆的账户。

  (2)用户可以自己录制音频进行上传,也可以从本地进行上传,并对上传的音乐进行管理。

  (3)用户可以新建专辑将自己的音频进行收录,并且能够对专辑进行上线和下线的管理。

2.2 其他需求

(1)系统界面有良好的视觉体验,营造美观舒适的界面;

(2)操作简单流畅,无可视卡顿;

(3)有良好的引导提示,增强用户体验;

2.3 播放器功能流程图

2.4 总体设计

本系统采用了浏览器/服务器模式,即B/S模式。对表现层、业务层、持久层三层结构均进行了实现。

表现层(data_view):在表现层通过前端界面处理(html+css+JavaScript)配合前端框架进行实现。前端与用户直接接触,保证良好的设计风格和视觉体验。前端数据通过javaScript发送Ajax传输给后端,再通过后端servlet返回的数据进行DOM树的渲染,形成了最终的页面。

业务层(service包和servlet包):service对从数据库或者前端页面获取来的数据进行转换,转换为当下需要的数据格式。在业务层通过Servlet处理,进行前后端交互。由于前端数据需要向后端发出请求。所以在前后端交互处理使用了JavaScript的开源框架jQuery-Ajax进行数据请求响应处理。后端通过servlet接收对应数据进行处理。

持久层(util包、data_object、repository):通过JDBC对数据库进行了连接,创建了用户表、音频表、专辑表、以及关系表,用来存储信息,并创建建了四个表在后端的实体类(UserDo,TrackDo,AlbumDo,TidToCountDo),以及在view_object包下面定义我们需要的json格式的数据,以及对repository对数据库中数据的增删查改。

三、开发环境

1.前端开发:

技术:Html、Css、JavaScript

工具:Intellij IDEA 2020.1.4

2.后端开发:

算法:哈希算法进行加密 

技术:jdk1.8、workbench、servlet、Maven

服务器:tomcat-8.5.50

工具:Intellij IDEA 2020.1.4

3.开发环境:Windows11 家庭版

4.运行环境:Intellij IDEA 2020.1.4

 四、准备工作

1.创建 Spring Boot 项目

具体创建方法参考怎样用IDEA社区版以及企业版创建spring boot项目?这篇博客哟,注意在创建时记得勾选下面两个依赖

2.配置pom.xml内容(添加依赖)

通过<packaging>war</packaging>为后续打包,打成war包。通过第三方仓库导入MYSQL,Servlet,Thymeleaf,jackson的依赖。通过<build><finalName>${project.artifactld}</finalName></build>将war包名称改变,方便后续部署到云服务器。

3.配置MYSQL连接
在application.yml中配置关联数据库的相关信息

五、包的命名规则

data_object:用来存放与数据库直接交互的实体类

repository: 用来直接对数据库中的数据进行操作

service(服务层):把数据转换为当前需要的格式,当数据来自多张表需要在代码中做组装时,在Service中进行。

controller:进行前后端的交互,接收请求和发送响应给浏览器

session_object:定义浏览器需要的JSON格式的属性

resources:存储前端文档以及动态的资源,实现了页面的动态呈现。


六、各个功能的详细介绍

6.1库表的建立

建表语句

-- 修改 MySQL 服务器的查询包最大限制为 500M
-- 但每次重启 MySQL 之后(包括重启电脑/关机之后)都需要手动再执行下
-- 直接去 MySQL Workbench 上去执行即可
set global max_allowed_packet = 500 * 1024 * 1024;
-- 设置之后,需要将 MySQL Workbench 重新打开下
-- 设置之后,需要重启 Tomcat,让 MySQL 重新连接
create database lucky_player charset utf8mb4;use lucky_player;create table users (uid int primary key auto_increment,username varchar(20) not null unique,password char(60) not null
);create table tracks (tid int primary key auto_increment,uid int not null,title varchar(10) not null,type char(40) not null,content longblob not null comment '音频的二进制数据'
);create table albums (aid int primary key auto_increment,uid int not null,title varchar(10) not null,cover varchar(600) not null,state int not null comment '0: 已下线 / 1: 未发布 / 2: 已发布'
);create table relations (rid int primary key auto_increment,aid int not null,tid int not null
) comment '维护专辑和音频之间的多对多关系';

数据库中的表信息与data_object包对应,在后端操作的实际上是这里定义的数据库属性。

下面是对各表的详细介绍:

用户表

users:

音频表

tracks: 

专辑表

albums:

关系表

relations:

      

relations表用于维护专辑与音频之间多对多的关系

数据库中的四个表对应data_object中的四个实体类

6.2用户管理

注册功能:

通过from表单发送HTTP的post请求,后端RegisterDoServlet接收HTTP请求,并进行相关的处理,在这个类里可以进行合法性校验,注册之后,将用户对象放入session中,再重定向到首页,重定向之后注册完成。

登录用到的类的介绍:

UsersSO: 是对外表现的对象,存放在session中,传给前端,只定义了uid 和username ,并没有把password写进这个类里面。

UserService: 完成注册(完成数据库地插入操作),在类中把UserDO(数据库需要的形式)转化为UserSO(我们需要的形式)。

UserDO:这里的数据是被数据库操作的,所以为了方便操作,属性名称都与数据库相同。

UserRepo: 进行sql操作,对User表操作。为了代码简洁,直接用@SneakyThrows (lombok包下),不添加throws也可以正常抛出受查异常。

为了是代码简洁,引入了 lombok.Data,@Data可以给我们自动添加getter/setter/toString/equals。

登录功能:

在LoginDoServlet中判断session

UserService:(3个操作)

(1)首先根据用户名在数据库中查出数据

(2)然后检查密码是否正确

(3)UserRepo用来进行查询操作

注销功能:

实现:把session中的currentUser删掉即可,在servlet中删除session
 

6.3.音频管理

文件上传:

需要上传文件:前端 upload.html

(1)from必须使用post提交

(2)From的enctype必须是multipart/formdata

(3)input type=file

UploadDoServle类:用来接收前端的from表单,而要想接收enctype=multipart/formdata 必须使用@MultipartConfig修饰。

(1)首先第一步利用session来判断用户是否登录。

(2)从请求中获取我们需要的信息,我们要取title 、type(文件类型)、content(音频数据)

(3)将拿到的数据插入到数据库中,由于插入比较简单没有引入service,直接在UploadDoServle类中进行插入

Trackrepo类:对数据库进行操作的插入操作。

遇到的问题:由于mysql服务器支持的查询包的大小是4194304,但是上传的音频文件过大就无法上传。所以要进行mysql的设置,只要在workbench中执行SQL:

set global_allowed_packet=500*1024*1024;但每次重启MySQL都需要手动执行一下,即可。

音频列表:

1.采用前后端分离的技术:后端以json格式来提供数据

2.前端:通过Ajax(XHR技术),进行请求+进行DOM树的修改

3.指定具体的JSON格式

具体实现:

(1)前端list.html页面首先要加载JS,准备好展示的列表的容器元素(table/div),list.js发送ajax请求后端的JSON数据,js获取到数据之后进行DOM树的渲染

(2)在后端ListJsonServlet接收到js发送的HTTP请求构造响应,首先判断用户是否登录。

这是在StudioTrackListView中定义的两个属性 List<ListTrackView> trackList,currentUser赋值,如果未登录,则赋值为null即可,如果已登录则这个新的对象赋值为trackService(主要工作是把查询到的数据库TrackDo类型的数据转为ListTrackView类型的数据)中加工后的List集合。

在ListJsonServlet中把list集合的数据序列化为JSON格式的数据,传给前端js,浏览器解析js得到页面。

音频录制:

在前端record.html中留下容器<audio disabled controls></audio>用来开启浏览器的麦克风权限,然后再js中进行DOM树的渲染,给每一个前端的按钮都加上响应,让音频开始录制,结束录制,并且发送post请求,发送给RecordJsonServlet,由这个类把数据保存在数据库表中


6.4.专辑管理

新建专辑:

1.在前端create.html中用from表单提交前端传入的数据,后端用CreateDoServlet接收HTTP请求,接收到之后首先判断用户是否登录,若登录,直接把数据插入在数据库中,并返回专辑创建成功。(业务简单并没有用到service层辅助操作)

关联音频:

在bind.html中保存一个添加的a标签,点击之后,js再次发送HTTP请求,跳转到add.html(新增音频),然后add.js发送ajax请求,请求后端json格式的数据,后端把数据返回给前端,然后js进行渲染,把所有的音频呈现出来(复选框的形式)。

后端json格式的数据由CandidateJsonServlet来做,同样是判断用户是否登录,然后在数据库中查询数据,并把数据转化为JSON格式。

专辑列表:

同上面几乎相同,前端list.html中留下容器,经过js发送ajax得到数据对页面进行渲染得到,后端ListJsonServlet中创建了外部需要的类AblumView,并且写上构造方法,也创造了一个ResultView类定义了当前用户、和专辑列表,然后把数据库中查询得到的数据放在ablumList中,再把数据转化为JSON格式传给前端。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/99875.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL数据库中间件Mycat介绍及下载安装(教程)

一&#xff0c;介绍 MyCat是开源的、活跃的、基于Java语言编写的MySQL数据库中间件。可以像使用MySQL一样来使用MyCat&#xff0c;对于开发人员来说根本感觉不到MyCat的存在。 开发人员只需要连接MyCat即可&#xff0c;而具体底层用到几台数据库&#xff0c;每一台数据库服务器…

GNU GRUB version 2.06 Minimal Bash-lke line editing is supported 问题修复

一、问题背景 博主喜欢折腾系统&#xff0c;电脑原来有一个windows系统&#xff0c;想整一个Linux双系统&#xff0c;结果开机时出现以下画面&#xff1a; GNU GRUB version 2.06 Minimal Bash-lke line editing is supported. TAB lists possible comand completions, Anywh…

vue2.x项目从0到1(七)之用户权限

此章节偏理论知识 对于小一点的项目 比如说角色都是平级的 那我们直接像之前 vue2.x项目从0到1&#xff08;二&#xff09;之后台管理侧边栏&#xff08;动态渲染路由以及高亮&#xff09;_vue动态渲染侧边栏_关忆北_的博客-CSDN博客这样渲染就行了 但是一旦项目大了 …

MongoDB基本使用

在 MongoDB 中我们可以使用use命令来创建数据库&#xff0c;如果该数据库不存在&#xff0c;则会创建一个新的数据库&#xff0c;如果该数据库已经存在&#xff0c;则将切换到该数据库。使用use命令创建数据库的语法格式如下&#xff1a; --use database_name use my_db1;数据…

Java并发编程之线程池详解

目录 &#x1f433;今日良言:不悲伤 不彷徨 有风听风 有雨看雨 &#x1f407;一、简介 &#x1f407;二、相关代码 &#x1f43c;1.线程池代码 &#x1f43c;2.自定义实现线程池 &#x1f407;三、ThreadPoolExecutor类 &#x1f433;今日良言:不悲伤 不彷徨 有风听风 有…

浅析Python爬虫ip程序延迟和吞吐量影响因素

作为一名资深的爬虫程序员&#xff0c;今天我们很有必要来聊聊Python爬虫ip程序的延迟和吞吐量&#xff0c;这是影响我们爬取效率的重要因素。这里我们会提供一些实用的解决方案&#xff0c;让你的爬虫程序飞起来&#xff01; 网络延迟 首先&#xff0c;让我们来看看网络延迟对…

sql2008 开启端口1433,进行远程连接SQL服务器

设置完成后&#xff0c;接着重启SQL服务器 注意本机测试的话&#xff0c;必须要关闭防火墙&#xff0c;如果是腾讯云或阿里云的话&#xff0c;必须开启1433端口。否则无法远程连接到SQL服务器的。 但是这里我们对于外网的项目&#xff0c;基本不会在客户端上直接用 这种模式去…

记一次oracle数据库迁移至mysql数据库(表同步)

目录 一、利用Navicat将oracle迁移至mysql数据库 1、建立数据传输 2、选择需要迁移的数据库跟目标库 3、数据传输选项 4、选择需要迁移表信息 二、迁移之后遇到的一些问题 1、大小写问题 2、数据库函数问题 3、sql语句是否使用空格隔开问题 4、关于子查询别命名问题 …

GPT-3.5——从 人工智障 到 大人工智障

有人说&#xff0c;GPT是从人工智障到人工智能的蜕变&#xff0c;但是。。。 我认为&#xff0c;GPT是从 人工智障 到 大人工智障 的退化。。。 从 人工智障 到 大人工智障 GPT-3.5学术介绍No.1---- 西红柿炒钢丝球基本信息详细制作方法材料步骤 幕后花絮 No.2---- 顶尖数学家…

Android学习之路(7) Frament

Fragment 表示应用界面中可重复使用的一部分。fragment 定义和管理自己的布局&#xff0c;具有自己的生命周期&#xff0c;并且可以处理自己的输入事件。fragment 不能独立存在。它们必须由 activity 或其他 fragment 托管。fragment 的视图层次结构会成为宿主的视图层次结构的…

HarmonyOS学习路之方舟开发框架—学习ArkTS语言(状态管理 四)

Observed装饰器和ObjectLink装饰器&#xff1a;嵌套类对象属性变化 上文所述的装饰器仅能观察到第一层的变化&#xff0c;但是在实际应用开发中&#xff0c;应用会根据开发需要&#xff0c;封装自己的数据模型。对于多层嵌套的情况&#xff0c;比如二维数组&#xff0c;或者数…

Redis 缓存满了怎么办?

引言 Redis 缓存使用内存来保存数据&#xff0c;随着需要缓存的数据量越来越大&#xff0c;有限的缓存空间不可避免地会被写满。此时&#xff0c;应该怎么办&#xff1f;本篇文章接下来就来聊聊缓存满了之后的数据淘汰机制。 值得注意的是&#xff0c;在 Redis 中 过期策略 和…

深度学习入门教学——二分分类

1、什么是二分分类&#xff1f; 二分分类就是判断“有”和“没有”、“是”和“不是”的问题&#xff0c;也就是监督学习中的分类问题。例如&#xff0c;输入一张图片&#xff0c;输出识别该图片的标签。计算机输入图片转化过程如下&#xff1a; 2、神经网络常用符号表示 (x, …

【openfeign】OpenFeign的使用、GET请求和POST请求

RPC全称是Remote Procedure Call&#xff0c;即远程过程调用&#xff0c;其对应的是我们的本地调用。 RPC的目的是&#xff1a;让我们调用远程方法像调用本地方法一样。 //本地调用 R result orderService.findOrderByUserId(id); //RPC远程调用 orderService为代理对象 R …

高效使用ChatGPT之ChatGPT客户端

ChatGPT客户端&#xff0c;支持Mac, Windows, and Linux 下载地址见文章结尾 软件截图 Windows: Mac&#xff1a; 说明 chatgpt桌面版&#xff0c;相比于网页版的chatgpt&#xff0c;最大的特色是支持历史聊天对话记录导出&#xff0c;且支持三种格式&#xff1a;PNG、PDF、…

Ae 效果:CC Line Sweep

过渡/CC Line Sweep Transition/CC Line Sweep CC Line Sweep&#xff08;CC 线条扫描&#xff09;通过线条的扫描动作来制作一个过渡效果&#xff0c;线条可以根据设定的方向、厚度、倾斜度和方向翻转来扫过画面&#xff0c;从而将一个场景过渡到另一个。 ◆ ◆ ◆ 效果属性…

如何关闭“若要接收后续google chrome更新,您需使用windows10或更高版本”

Windows Registry Editor Version 5.00[HKEY_CURRENT_USER\Software\Policies\Google\Chrome] "SuppressUnsupportedOSWarning"dword:00000001 如何关闭“若要接收后续 google chrome 更新,您需使用 windows 10 或更高版本” - 知乎

数学建模及数据分析 || 4. 深度学习应用案例分享

PyTorch 深度学习全连接网络分类 文章目录 PyTorch 深度学习全连接网络分类1. 非线性二分类2. 泰坦尼克号数据分类2.1 数据的准备工作2.2 全连接网络的搭建2.3 结果的可视化 1. 非线性二分类 import sklearn.datasets #数据集 import numpy as np import matplotlib.pyplot as…

YOLOX在启智AI GPU/CPU平台部署笔记

文章目录 1. 概述2. 部署2.1 拉取YOLOX源码2.2 拉取模型文件yolox_s.pth2.3 安装依赖包2.4 安装yolox2.5 测试运行2.6 运行报错处理2.6.1 ImportError: libGL.so.1: cannot open shared object file: No such file or directory2.6.2 ImportError: libgthread-2.0.so.0: cannot…

2、Spring_DI

DI 1.概述 概述&#xff1a;Dependency Injection 依赖注入&#xff0c;给对象设置属性&#xff0c;曾经我们需要自己去创建 mapper 对象&#xff0c;才能调用&#xff0c;现在交给 spring 创建&#xff0c;并且使用 DI 注入&#xff0c;直接拿来用&#xff0c;程序员就可以更…