当前位置:文档之家› 在线音乐管理系统项目文档

在线音乐管理系统项目文档

在线音乐管理系统项目文档本次的课程设计是基于Web技术的在线音乐管理系统。

此系统通过AJAX+Struts 2.x+JSP框架技术来实现。

数据库管理系统则为MySQL。

此系统分为两部分:管理员模块(后台部分)和注册用户模块(前台部分)。

在具体实现各个模块的相应功能时,利用AJAX和JSP技术实现该系统的相应页面,利用Struts 2.x框架技术实现业务逻辑。

1系统功能结构根据在线音乐管理系统,可将其分为前台和后台两个部分。

从前台主界面可以发现注册用户可以实现如下功能:用户注册,用户登录,分享歌曲,下载歌曲,填写关于音乐的评论,音乐盒,点歌,试听歌曲,发送和接受短消息。

前台功能结构如图1所示图1 在线音乐管理系统前台结构图从后台主界面可以发现超级管理员可以实现如下功能:管理员登录,音乐管理,友情链接,用户管理,添加管理员,修改密码和关闭。

后台功能结构如图2所示在线音乐管理前台用 户 注册用户登录 分享歌曲发送短消息 接受短消息注销登录填写评论添 加 音乐盒试听歌曲点歌下载歌曲图2 在线音乐管理系统后台结构图2业务流程图如图所示在线音乐管理后台管理员登录音乐管理 友情链接用户管理添加管理员修改密码登录前台页面首页发送 短消息 分 享歌曲 接受短消息注册分享成功 添加试听音用户下载添加点歌3数据库概念设计根据系统所做的需求分析,规划出本系统中使用的数据库实体分别为用户信息实体,管理员档案实体,音乐信息实体,留言信息实体,短信信息实体。

下面将介绍几个关键实体的E-R图。

用户信息实体用户信息实体包括编号,用户名,用户的密码,音乐盒。

考生档案实体的E-R 图如图1.4所示。

,音乐信息实体音乐信息实体包括编号,音乐的标题,音乐的歌曲,音乐所属专辑,上传时间,音乐试听次数,音乐的地址。

音乐信息实体的E-R 图如图1.5所示。

,图1.5 音乐信息实体E-R 图 短信信息实体音乐信息实体包括编号,发短信的用户,接受短信的用户,短信的标题,短信的内容 ,发短信的时间,发短信的 次数。

短信信息实体的E-R 图如图1.5所示。

,图1.5 短信信息实体E-R图4用例图(个人)1.用户具有用户信息,每个用户具有一种账户状态用于标识权限;2.用户空间与用户一一对应,具有空间属性;3.每个用户都可以注册多个账户;4.用户信息:用户名,用户密码;5.用户注册:用户名,用户密码密码,确认密码;6.已注册用户,直接登陆:输入用户名及密码;7.修改密码:输入密码、新密码、重复密码;5数据库的逻辑结构1各数据表的结构Admin(管理员信息表)管理员信息表用来保存管理员信息,该表的结构如图1.1所示。

表1.1 admin表的结构comments(留言信息表)留言信息表用来保存留言信息,该表的结构如图1.2所示。

表1.2 comments表的结构link(链接表)链接表用来保存链接信息,该表的结构如图1.3所示。

表1.3 link表的结构Message(短信信息表)短信信息表用来保存短信信息,该表的结构如图1.4所示。

表1.4 message表的结构Music(音乐信息表)音乐信息表用来保存音乐信息,该表的结构如图1.5所示。

表1.5 comments表的结构Tip (提示信息表)提示信息表用来保存提示信息,该表的结构如图1.6所示。

表1.6 comments表的结构user(用户信息表)用户信息表用来保存用户信息,该表的结构如图1.7所示。

表1.7 user表的结构6数据表之间的关系设计7系统总体设计7.1 用户注册功能实现功能说明: 用户点击首页中的注册链接后,页面中显示注册层供用户填写注册信息,当用户入新注册的用户名时,struts的register.java调用后判断是否存在同名用户,并返回判断的信息;当用户输入密码和确认密码时,判断密码是否和确认密码相同;若以上两个条件同时满足,注册按钮可用,否则,注册按钮不可用。

完成输入信息后,点击注册按钮进行用户注册操作,注册操作完成后,系统自动为用户跳到登录页面。

描述:7.2登陆功能实现功能说明:用户点击完登陆链接后,在页面中显示,用户输入完用户名和密码后点击登陆按钮完成登陆操作,退出登录时点击注销登录。

描述:7.3实现在线音乐上传功能功能说明:用户进入主页面后,点击上传歌曲,进入上传歌曲页面。

上传歌曲时,音乐的形式在后台的servlet相关类uploadmusic.java类中做了相关设置。

当用户上传完歌曲后,可以点击下一步按钮,显示上传成功提示框,系统自动将歌曲添加到数据库中,同时跳转到音乐更新页面,填写音乐相关信息,主题的字数和内容的字数在后台的upload.java中都做了设置,当用户输入完相应的信息后,可以点击提交按钮,系统自动将信息添加到数据库中,添加成功后,显示添加成功提示框,跳转到主页可以进行音乐播放试听。

描述:7.4实现添加评论功能功能说明:当用户上传完音乐信息后,点击阅读全文,跳转到添加评论页面,可以输入信息,主题的字数和内容的字数在后台的servlet相关类addComments中都做了设置。

当用户输入完相应的信息后,可以点击提交按钮,系统自动将信息添加到数据库中,添加成功后可以查看输入的内容。

当用户输入的信息不满足要求时,会发出错误信息提示,同时不满足要求的信息也不会添加到数据库中。

因此用户需要进行修改内容,然后在重新添加。

描述:7.5实现音乐盒功能功能说明:在上传完音乐后,用户可以创建属于该用户自己的音乐盒。

点击添加音乐盒按钮,相关添加操作在后台servlet类中做了设置,并获取数据库进行连接查询,查看数据库中是否已存在相同音乐,如果没有则将音乐添加到数据库中,添加成功后,通过后台的servlet相关类setbox.java进行操作音乐盒中的播放列表,并通过JDOM组件动态创建XML播放列表,并且在主页动态显示。

描述:7.6实现短信发送功能功能说明:用户进入主页面后,点击短消息,进入发送短信页面。

发送短信时,信息的相关内容在后台的servlet相关类message.java类中做了相关设置。

当用户输入完相应的信息后,可以点击提交按钮,系统自动将信息添加到数据库中,添加成功后显示发送成功的提示框,对方可以进行信息的查看和接受。

当用户输入的信息不满足要求时,会发出错误信息提示,同时不满足要求的信息也不会添加到数据库中。

因此用户需要进行修改内容,然后在重新提交。

描述:7.7实现短信接收删除功能功能说明:用户进入主页面后,点击查看短消息,看是否有已接受的未读短信,进行删除操作,删除操作通过后台的sevlet相关类desmessage.java进行执行,操作成功后,自动更新数据库,并在主页面上显示删除成功。

描述:7.8实现点歌功能功能说明:用户上传完歌曲可以进行点歌功能,点击sendmusic页面的点歌,可以为对方点歌,并进行留言和信息发送。

点歌和信息发送,通过后台的servlet 相关类sendmusic.java类进行执行验证,操作成功后,自动更新数据库,更新成功后,显示信息发送成功提示框。

对方可以进行信息接收和歌曲试听。

描述:7.9实现超级用户登陆功能功能说明: 进入后台主界面后,页面中显示登录层供管理员填写信息,当用户填写相关信息后时,struts的login.java调用后判断是否存在此用户,并返回判断的信息;若以上条件满足时,登录按钮可用,否则,登录按钮不可用。

完成输入信息后,点击登录按钮进行超级用户登录操作,登录操作完成后,系统自动为用户跳到主页面。

描述:7.10实现修改当前超级管理员密码功能功能说明: 当超级管理员登录在线音乐管理系统的后台,进入修改密码页面。

struts通过调用后台的servlet相关类changepwd.java执行,判断是否存在此用户,并返回判断的信息;当用户输入密码和确认密码时,判断密码是否和确认密码相同;若以上两个条件同时满足,提交按钮可用,否则,提交按钮不可用。

完成输入信息后,点击提交按钮进行超级用户修改密码操作,修改操作完成后,系统自动更新数据库,并显示修改成功提示框。

描述:7.11实现删除注册用户功能功能说明: 当管理员进入后台系统的uer.jsp页面后,不仅可以查看所有注册用户的信息,还可以删除任何一个注册用户。

通过调用后台的servlet相关类deluser.java类,检查是否存在该用户,并执行删除操作,删除成功后,自动更新数据库,并在页面中成功显示。

描述:7.11实现删除注册用户功能功能说明:当超级管理员登录在线音乐管理系统的后台后,不仅可以查看所有上传音乐的信息,还可以删除任何一个上传音乐。

通过调用后台的servlet相关类delmusic.java类,检查是否存在此用户,并执行删除操作,删除成功后,自动更新数据库,并在页面中成功显示。

描述:7.12实现友情链接功能功能说明:当超级管理员登录在线音乐管理系统的后台后,不仅可以添加友情链接的信息的信息,还可以删除任何已存在的超级链接。

通过调用后台的servlet 相关类link.java类,执行插入操作,插入成功后,自动更新数据库,并在当前页面中成功显示,能进行删除操作,且能在前台中成功显示链接。

描述:附录1.AJAX技术运用:public String execute() throws Exception {ServletActionContext.getResponse().setCharacterEncoding("GB2312");//设置页面编码格式PrintWriter out = ServletActionContext.getResponse().getWriter(); //获取输出流//设置页面的相关信息ServletActionContext.getResponse().setHeader("Pragma", "No-cache");ServletActionContext.getResponse().setHeader("Cache-Control","no-cache");ServletActionContext.getResponse().setDateHeader("Expires", 0);//生成文件名String fileType = getUploadFileName().substring(getUploadFileName().lastIndexOf("."));SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); //设置时间格式Date dt = new Date(); //获取当前时间Random rd = new Random(); //随机变量setUploadFileName(sdf.format(dt) + rd.nextInt(9999) + fileType); //生成上传文件的名字if ("audio/mpeg".equals(getUploadContentType())) { //判断音乐类型//获取文件输出流FileOutputStream fos = new FileOutputStream(getSavePath() + "\\"+ getUploadFileName());//获取文件输入流FileInputStream fis = new FileInputStream(getUpload());byte[] buffer = new byte[10240]; //创建字节数组int len = 0;while ((len = fis.read(buffer)) > 0) { //实现文件上传fos.write(buffer, 0, len);}String filePath = "upload\\\\" + getUploadFileName(); //创建文件路径属性out.println(function.PlutoJump("上传成功,请认真填写歌曲内容!", "upload.jsp?path=" + filePath));} else { //当文件上传失败out.println(function.PlutoJump("文件类型必须为MP3!", "uploadmusic.jsp"));}return null;}<h2 class="title">上传音乐第一步(上传音乐)</h2><div class="entry"><p><form id="form1" name="form1" method="post"action="upload.action?path=<%=request.getParameter("path")%>"class="niceform" onsubmit="return check();"><input type="hidden" name="path"value="<%=request.getParameter("path")%>" /><table width="80%" border="0" align="center"><tr><td height="31"><div align="center">您的音乐已经上传成功,您可以点下面的播放器进行试听!</div></td></tr>public class upload extends ActionSupport {private String title;private String singer;.private String special;private String path;private String value;public String getValue() {return value;}public void setValue(String value) {this.value = value;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getPath() {return path;}public void setPath(String path) {this.path = path;}public String getSinger() {return singer;}public void setSinger(String singer) {this.singer = singer;}public String getSpecial() {return special;}public void setSpecial(String special) {this.special = special;}@Override//编写execute()方法public String execute() throws Exception {ServletActionContext.getResponse().setCharacterEncoding("GB2312");//设置页面的编码格式PrintWriter out = ServletActionContext.getResponse().getWriter();//获取输出流//获取HttpservletRequest对象HttpServletRequest request = ServletActionContext.getRequest();HttpSession session = ServletActionContext.getRequest().getSession();//设置页面的相关信息ServletActionContext.getResponse().setHeader("Pragma", "No-cache");ServletActionContext.getResponse().setHeader("Cache-Control","no-cache");ServletActionContext.getResponse().setDateHeader("Expires", 0);String filePath = request.getParameter("path"); //获取路径参数if (function.isInvalid(title) || function.isInvalid(singer)|| function.isInvalid(special) || function.isInvalid(path)) {//判断参数是否为空out.println(function.PlutoJump("任何一项都不能为空!", "upload.jsp?path="+ filePath));} else {filePath = filePath.replace("upload", "upload\\");// 获取文件后缀DBConnection conn = new DBConnection(); //获取数据库连接long time = new Date().getTime(); //获取上传时间//当操作数据库成功if (conn.execute("insert into music(title,singer,special,value,time,click,url) values('"+ title+ "','"+ singer+ "','"+ special+ "','"+ value + "','" + time + "',0,'" + filePath + "')")) {// 添加TIP信息String tip = "[" + session.getAttribute("PlutoUser").toString()+ "] 分享了歌曲[" + title + "]";conn.execute("insert into tip(value) values('" + tip + "')");out.println(function.PlutoJump("提交成功!", "index.jsp"));} else { //操作数据库失败out.println(function.PlutoJump("提交失败!", "upload.jsp?path="+ filePath));}}return null;}}2.JDom组件动态创建XML播放列表:public class creatXML {private String str = "3,2,4,5,6,7";private String [] playListArr;private String path;public String getPath() {return path;}public void setPath(String path) {this.path = path;}public void bulidXML(String [] id,HttpServletRequest request,String userName) throws IOException, JDOMException, SQLException {//创建XML头Element playList = new Element("playlist");;Document Doc = new Document(playList);playList = Doc.getRootElement();playList.setAttribute("version", "1");playList.setAttribute("xmln","/ns/0/");Element title = new Element("title");title.setText("Pluto's Player");playList.addContent(title);//头结束Element trackList = new Element("trackList");playList.addContent(trackList);//trackListDBConnection conn = new DBConnection(); //获取数据库连接for(int i=0;i<id.length;i++){ResultSet rs = conn.executeQuery("select * from music where id = "+id[i]+"");rs.next();String music_title = rs.getString("title"); //获取标题String music_singer = rs.getString("singer"); //获取歌手String music_url = rs.getString("url"); //获取歌曲的URL地址Element track = new Element("track");Element annotation = new Element("annotation");annotation.setText(music_title + " - " + music_singer);track.addContent(annotation);Element location = new Element("location");location.setText("../" + music_url);track.addContent(location);trackList.addContent(track);}//获取查询结果ResultSet userRs = conn.executeQuery("select id from user where name = '"+userName+"'");userRs.next();String user_id = userRs.getString("id"); //获取idXMLOutputter XMLOut = new XMLOutputter(); //创建XMLOutputter对象XMLOut.output(Doc, newFileOutputStream(request.getSession().getServletContext().getRealPath("/player/xml/" + user_id + ".xml")));}}如有侵权请联系告知删除,感谢你们的配合!。

相关主题