• SSM项目实战——哈哈音乐(四)前台模块开发


    1、项目准备

    ①导入依赖和前端资源

    1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    3. <parent>
    4. <artifactId>hami-parent</artifactId>
    5. <groupId>com.qcby</groupId>
    6. <version>1.0-SNAPSHOT</version>
    7. </parent>
    8. <modelVersion>4.0.0</modelVersion>
    9. <artifactId>hami-portal</artifactId>
    10. <packaging>war</packaging>
    11. <name>hami-portal Maven Webapp</name>
    12. <dependencies>
    13. <dependency>
    14. <groupId>com.qcby</groupId>
    15. <version>1.0-SNAPSHOT</version>
    16. <artifactId>hami-core</artifactId>
    17. </dependency>
    18. <dependency>
    19. <groupId>org.springframework</groupId>
    20. <artifactId>spring-web</artifactId>
    21. </dependency>
    22. <dependency>
    23. <groupId>org.springframework</groupId>
    24. <artifactId>spring-webmvc</artifactId>
    25. </dependency>
    26. <dependency>
    27. <groupId>javax.servlet</groupId>
    28. <artifactId>servlet-api</artifactId>
    29. <scope>provided</scope>
    30. </dependency>
    31. <dependency>
    32. <groupId>javax.servlet.jsp</groupId>
    33. <artifactId>jsp-api</artifactId>
    34. <scope>provided</scope>
    35. </dependency>
    36. <dependency>
    37. <groupId>jstl</groupId>
    38. <artifactId>jstl</artifactId>
    39. </dependency>
    40. </dependencies>
    41. </project>

     

    ②在resources下导入创建springmvc.xml

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:mvc="http://www.springframework.org/schema/mvc"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    6. xsi:schemaLocation="
    7. http://www.springframework.org/schema/beans
    8. http://www.springframework.org/schema/beans/spring-beans.xsd
    9. http://www.springframework.org/schema/mvc
    10. http://www.springframework.org/schema/mvc/spring-mvc.xsd
    11. http://www.springframework.org/schema/context
    12. http://www.springframework.org/schema/context/spring-context.xsd">
    13. <mvc:annotation-driven>
    14. <mvc:message-converters>
    15. <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
    16. <property name="supportedMediaTypes" value="text/html;charset=UTF-8"/>
    17. <property name="features">
    18. <array>
    19. <value>WriteMapNullValue</value>
    20. <value>WriteNullStringAsEmpty</value>
    21. </array>
    22. </property>
    23. <property name="dateFormat" value="yyyy-MM-dd"></property>
    24. </bean>
    25. </mvc:message-converters>
    26. </mvc:annotation-driven>
    27. <context:component-scan base-package="com.qcby.controller"/>
    28. <bean id="viewResource" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    29. <property name="prefix" value="/WEB-INF/page/"></property>
    30. <property name="suffix" value=".jsp"></property>
    31. </bean>
    32. <mvc:view-controller path="/index" view-name="index"></mvc:view-controller>
    33. <mvc:default-servlet-handler/>
    34. </beans>

    ③配置web.xml

    1. <web-app
    2. version="2.5"
    3. xmlns="http://java.sun.com/xml/ns/javaee"
    4. xmlns:xml="http://www.w3.org/XML/1998/namespace"
    5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    6. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    7. <filter>
    8. <filter-name>SpringCharacterEncodingFilter</filter-name>
    9. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    10. <init-param>
    11. <param-name>encoding</param-name>
    12. <param-value>UTF-8</param-value>
    13. </init-param>
    14. </filter>
    15. <filter-mapping>
    16. <filter-name>SpringCharacterEncodingFilter</filter-name>
    17. <url-pattern>/*</url-pattern>
    18. </filter-mapping>
    19. <servlet>
    20. <servlet-name>dispatcher</servlet-name>
    21. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    22. <init-param>
    23. <param-name>contextConfigLocation</param-name>
    24. <param-value>classpath:springmvc.xml</param-value>
    25. </init-param>
    26. <load-on-startup>1</load-on-startup>
    27. </servlet>
    28. <servlet-mapping>
    29. <servlet-name>dispatcher</servlet-name>
    30. <url-pattern>/</url-pattern>
    31. </servlet-mapping>
    32. <listener>
    33. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    34. </listener>
    35. <context-param>
    36. <param-name>contextConfigLocation</param-name>
    37. <param-value>classpath:applicationContext.xml</param-value>
    38. </context-param>
    39. </web-app>

    2、歌曲界面

    ①展示所有歌曲

    启动tomcat后,进入index.jsp页面,发送dofindAll,可以根据条件查询歌曲也可以查询所有歌曲信息

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>Title</title>
    5. </head>
    6. <body>
    7. <jsp:forward page="/song/dofindAll"></jsp:forward>
    8. </body>
    9. </html>

     创建SongController,编写dofindAll,给search.jsp页面返回歌曲和所有专辑信息

    1. package com.qcby.controller;
    2. import com.qcby.model.Mtype;
    3. import com.qcby.model.Page;
    4. import com.qcby.model.Song;
    5. import com.qcby.query.SongQuery;
    6. import com.qcby.service.MtypeService;
    7. import com.qcby.service.SongService;
    8. import com.qcby.service.SongerService;
    9. import org.springframework.beans.factory.annotation.Autowired;
    10. import org.springframework.stereotype.Controller;
    11. import org.springframework.ui.Model;
    12. import org.springframework.web.bind.annotation.RequestMapping;
    13. import org.springframework.web.bind.annotation.ResponseBody;
    14. import javax.servlet.http.Cookie;
    15. import javax.servlet.http.HttpServletRequest;
    16. import javax.servlet.http.HttpServletResponse;
    17. import java.io.UnsupportedEncodingException;
    18. import java.net.URLDecoder;
    19. import java.net.URLEncoder;
    20. import java.util.ArrayList;
    21. import java.util.List;
    22. @Controller
    23. @RequestMapping("/song")
    24. public class SongController {
    25. @Autowired
    26. private SongService songService;
    27. @Autowired
    28. private MtypeService mtypeService;
    29. @RequestMapping("/dofindAll")
    30. public String list(SongQuery mq, Model model){
    31. if(mq.getPageNo() == 0){
    32. mq.setPageNo(1);
    33. }
    34. Page page = songService.selectObjectByCondition(mq);
    35. model.addAttribute("page", page);
    36. model.addAttribute("mq", mq);
    37. List mtypes = mtypeService.selectObjectAll();
    38. model.addAttribute("mtypes", mtypes);
    39. return "search";
    40. }

    research.jsp界面展示歌曲信息

    1. <div id="body" class="gap">
    2. <input id="tid" type="hidden" value="${mq.tid}">
    3. <input id="isHot" type="hidden" value="${mq.isHot}">
    4. <input id="isNew" type="hidden" value="${mq.isNew}">
    5. <div class="wrapper">
    6. <div class="content_wrapper">
    7. <div class="content">
    8. <div class="filter" data-spm="1392350033">
    9. <dl>
    10. <dt>流派&nbsp;:</dt>
    11. <dd>
    12. <p>
    13. <a href="#" ftype="mtype" value="" class="current">全部</a>
    14. <c:forEach items="${mtypes}" var="mtype">
    15. <a href="#" ftype="mtype" value="${mtype.tid}">${mtype.tname}</a>
    16. </c:forEach>
    17. </p>
    18. </dd>
    19. </dl>
    20. <dl>
    21. <dt>热门&nbsp;:</dt>
    22. <dd>
    23. <p>
    24. <a href="#" ftype="isHot" value="" class="current">全部</a>
    25. <a href="#" ftype="isHot" value="1">热门</a>
    26. </p>
    27. </dd>
    28. </dl>
    29. <dl>
    30. <dt>新歌&nbsp;:</dt>
    31. <dd>
    32. <p>
    33. <a href="#" ftype="isNew" value="" class="current">全部</a>
    34. <a href="#" ftype="isNew" value="1">最新</a>
    35. </p>
    36. </dd>
    37. </dl>
    38. </div>
    39. <div class="chart" data-spm="1392350021">
    40. <table>
    41. <thead>
    42. <tr>
    43. <td width="40"></td>
    44. <td width="45"></td>
    45. <td></td>
    46. <td width="180"></td>
    47. <td width="180"></td>
    48. <td width="130"></td>
    49. </tr>
    50. <tr>
    51. <th align="right"><input type="checkbox" checked onclick="selectall(this);"></th>
    52. <th align="left" colspan="5"><b class="play" onclick="playsongs();"></b>
    53. </th>
    54. </tr>
    55. </thead>
    56. <tbody id="content">
    57. <c:forEach items="${page.list}" var="song" varStatus="status">
    58. <tr data-index="0">
    59. <td align="right"><input type="checkbox" name="chartids" checked="checked"
    60. value="${song.sid}"></td>
    61. <td align="center">${status.count}</td>
    62. <td>
    63. <div class="song">
    64. <div class="image">
    65. <img src="${filePath}${song.songer.pic}" alt="Every Breath You Take"
    66. height="55" width="55"/>
    67. <b></b>
    68. </div>
    69. <div class="info"><p><strong><a target="_blank" title="Every Breath You Take"
    70. href="#">${song.sname}</a></strong></p></div>
    71. </div>
    72. </td>
    73. <td><span>
    74. <a target="_blank" href="#" title="Karen Souza">${song.songer.srname}</a>
    75. </span></td>
    76. <td><span>
    77. <a target="_blank" title="Essentials" href="#">${song.album.aname}</a>
    78. </span></td>
    79. <td>
    80. <div class="action">
    81. <button class="play" onclick="play(${song.sid});" title="试听">试听</button>
    82. <button class="download" title="下载">下载</button>
    83. <button class="offline" title="发送到">发送到</button>
    84. </div>
    85. </td>
    86. </tr>
    87. </c:forEach>
    88. </tbody>
    89. </table>
    90. </div>
    91. <input type="hidden" id="pageNoPortal" value="${mq.pageNoPortal}">
    92. <c:if test="${page.pageNo < page.totalPage}">
    93. <div class="loadr" id="loader"><a href="javascript:void(0);" onclick="loadMore()"><b></b>查看更多</a>
    94. </div>
    95. </c:if>
    96. <c:if test="${page.pageNo == page.totalPage}">
    97. <div class="loadr" id="nomore" style="font-size: 18px;">没有更多啦!</div>
    98. </c:if>
    99. </div>
    100. </div>
    101. <div class="sidebar" data-spm="1392350021">
    102. <div class="nav">
    103. <a class="index" href="#"><b></b>发现</a>
    104. <a class="top" href="#"><b></b>排行榜</a>
    105. <a class="magazines" href="#"><b></b>音乐人企划</a>
    106. <a class="artists" href="/songer/dofindAll"><b></b>音乐人</a>
    107. <a class="songs current" href="/song/dofindAll"><b></b>歌曲</a>
    108. <a class="albums" href="#"><b></b>专辑<sup>无损</sup></a>
    109. </div>
    110. <div class="genre">
    111. <c:forEach items="${mtypes}" var="mtype">
    112. <a href="/song/dofindAll?tid=${mtype.tid}"><b></b>${mtype.tname}</a>
    113. </c:forEach>
    114. </div>
    115. </div>
    116. </div>
    117. </div>

     

    ②根据条件搜索歌曲 

    search.jsp页面的js请求

    1. <script>
    2. var tid = "";
    3. var isHot = "";
    4. var isNew = "";
    5. $(function () {
    6. //指定点击事件
    7. $(".filter p a").click(function () {
    8. //移除同辈的a链接的样式
    9. $(this).siblings().removeClass("current");
    10. //把点击的a链接的样式加上
    11. $(this).addClass("current");
    12. //获得流派的选中值
    13. var tid = $("a[ftype='mtype'][class='current']").attr("value");
    14. var isHot = $("a[ftype='isHot'][class='current']").attr("value");
    15. var isNew = $("a[ftype='isNew'][class='current']").attr("value");
    16. //alert(tid+" "+isHot+" "+isNew);
    17. window.location.href = "/song/dofindAll?tid=" + tid + "&isHot=" + isHot + "&isNew=" + isNew;
    18. })
    19. tid = $("#tid").val();
    20. isHot = $("#isHot").val();
    21. isNew = $("#isNew").val();
    22. //流派的回显
    23. $("a[ftype='mtype'][class='current']").removeClass("current");
    24. $("a[ftype='mtype'][value='" + tid + "']").addClass("current");
    25. //热门回显
    26. $("a[ftype='isHot'][class='current']").removeClass("current");
    27. $("a[ftype='isHot'][value='" + isHot + "']").addClass("current");
    28. //新歌回显
    29. $("a[ftype='isNew'][class='current']").removeClass("current");
    30. $("a[ftype='isNew'][value='"+ isNew + "']").addClass("current");
    31. })

    ③查看更多

     js代码

    1. function loadMore() {
    2. //2 111111 5 10 15 20
    3. var pageNoPortal = parseInt($("#pageNoPortal").val());
    4. //计算pageSize
    5. var pageSize = 5 * (++pageNoPortal);
    6. window.location.href = "/song/dofindAll?tid=" + tid + "&isHot=" + isHot + "&isNew=" + isNew + "&pageSize=" + pageSize + "&pageNoPortal=" + pageNoPortal;
    7. }

    前端代码

    1. <c:if test="${page.pageNo < page.totalPage}">
    2. <div class="loadr" id="loader"><a href="javascript:void(0);" onclick="loadMore()"><b></b>查看更多</a>
    3. </div>
    4. </c:if>
    5. <c:if test="${page.pageNo == page.totalPage}">
    6. <div class="loadr" id="nomore" style="font-size: 18px;">没有更多啦!</div>
    7. </c:if>

    上面三个功能都是通过controller中dofindAll这一个请求来实现,只是所传的参数不一致 

    对于展示所有歌曲,dofindAll不传任何参数,直接查询所有的歌曲信息

    对于根据条件搜索歌曲,传入歌曲流派、是否热门、是否是新歌这三个信息作为筛选条件进行歌曲搜索

    对于查看更多,除了传入三个搜索条件还传入页面大小和当前页码作为条件进行查询

    ④歌曲播放

    功能:可以通过点试听,单个歌曲播放,也可以选取多个歌曲放入播放列表中按顺序播放

    实现思路:对于单个歌曲播放功能,直接根据当前传入的歌曲id查询歌曲信息,将歌曲信息传给play.jsp页面进行歌曲播放

    对于播放列表播放歌曲,首先通过cookie获取上一次未播放完的歌曲id,然后本次传入的歌曲id列表加上上次的歌曲id列表,变成一个新的歌曲id列表,并将新的歌曲id列表存入cookie中。根据歌曲id列表查询歌曲信息,将其交给paly.jsp页面,进行歌曲播放

    js代码

    1. function selectall(checkallObj) {
    2. var checked = $(checkallObj).attr("checked");
    3. if(checked =="checked"){
    4. $("tbody tr td input[type='checkbox']").attr("checked","checked");
    5. }else{
    6. $("tbody tr td input[type='checkbox']").removeAttr("checked");
    7. }
    8. }
    9. function playsongs() {
    10. //拿到所有的复选框选中的元素
    11. var songs = $("tbody tr td input[type='checkbox']:checked")
    12. var sids = ""; //"1,2,3,4,5,"
    13. songs.each(function () {
    14. var sid = $(this).val();
    15. sids = sids + sid+","
    16. })
    17. window.open("/song/play?sids="+sids,"play");
    18. }
    19. function play(sid) {
    20. window.open("/song/play?sids="+sid,"play");
    21. }
    22. </script>

    controller代码

    1. /**
    2. * 实现歌曲播放列表
    3. * @param sids 选中的歌曲列表
    4. * @param model
    5. * @param request
    6. * @param response
    7. * @return
    8. * @throws UnsupportedEncodingException
    9. */
    10. @RequestMapping("/play")
    11. public String play(String sids, Model model, HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
    12. //1、处理sids字符串,变成集合给后台查询,变成cookie作为下一次使用的记录
    13. //idList记录歌曲播放列表,就是本次新添加的播放歌曲sids+上一次的播放歌曲列表
    14. List<String> idList = new ArrayList<>();
    15. String[] idArr = null;
    16. //程序严谨性判断
    17. if(sids != null && !"".equals(sids)){
    18. idArr = sids.split(",");
    19. for (String s : idArr) {
    20. idList.add(s);
    21. }
    22. }
    23. //如果是第一次添加歌曲列表,不考虑,否则需要拿到cookie查看上次播放记录
    24. //pids存储的是上次歌曲播放值
    25. String pids = "";
    26. Cookie[] cookies = request.getCookies();
    27. if(cookies != null && cookies.length > 0){
    28. for (Cookie cookie : cookies) {
    29. String name = cookie.getName();
    30. if("playids".equals(name)){
    31. //解码 防止乱码
    32. pids = URLDecoder.decode(cookie.getValue(),"UTF-8");
    33. }
    34. }
    35. }
    36. //oldArr存放的是上一次播放的歌曲列表
    37. String[] oldArr = pids.split(",");
    38. for (int i = 0; i < oldArr.length; i++) {
    39. //保证不重复添加相同的歌曲,如果上次歌曲播放列表中含有本次添加的播放列表,则不添加到新的播放列表
    40. if(!idList.contains(oldArr[i])){
    41. idList.add(oldArr[i]);
    42. }
    43. }
    44. //创建新的歌曲播放列表,原来存储的播放歌曲列表为list<String>类型,idsList变成list<Integer>,用于后台查询
    45. List<Integer> idsList = new ArrayList<>();
    46. //字符串类型的新的播放列表,用于cookie传值给前端作为上一次播放列表
    47. String playids = "";
    48. for (String s : idList) {
    49. if(!"".equals(s)){
    50. idsList.add(new Integer(s));
    51. playids = playids + s+",";
    52. }
    53. }
    54. List<Song> songs = new ArrayList<>();
    55. if(idsList.size() > 0)
    56. songs = songService.getSongByIds(idsList);
    57. model.addAttribute("songs",songs);
    58. System.out.println(songs);
    59. System.out.println(playids);
    60. playids = URLEncoder.encode(playids, "UTF-8");
    61. Cookie cookie = new Cookie("playids", playids);
    62. //cookie的有效时间
    63. cookie.setMaxAge(60*60*24*30);
    64. //设置cookie的访问有效路径
    65. cookie.setPath("/");
    66. response.addCookie(cookie);
    67. return "player";
    68. }
    69. /**
    70. * 获取播放的歌曲信息,实现歌曲播放
    71. * @param sid
    72. * @return
    73. */
    74. @ResponseBody
    75. @RequestMapping("/getSong")
    76. public Song getSong(Integer sid){
    77. Song song = songService.getSong(sid);
    78. System.out.println(song);
    79. return song;
    80. }

     通过歌曲id获取歌曲信息的service接口

    1. //添加播放列表
    2. public List<Song> getSongByIds(List<Integer> idsList);
    3. //实现歌曲播放
    4. Song getSong(Integer sid);

    通过歌曲id获取歌曲信息的service实现类

    1. @Override
    2. public List<Song> getSongByIds(List idsList) {
    3. return songMapper.getSongByIds(idsList);
    4. }
    5. //实现歌曲播放
    6. @Override
    7. public Song getSong(Integer sid) {
    8. return songMapper.getSong(sid);
    9. }

    通过歌曲id获取歌曲信息的mapper接口

    1. //实现添加播放列表
    2. List<Song> getSongByIds(List<Integer> idsList);
    3. //实现歌曲播放
    4. Song getSong(Integer sid);

    通过歌曲id获取歌曲信息的sql

    1. <resultMap id="getSongByIdsRM" type="com.qcby.model.Song" extends="ResultMapWithBLOBs">
    2. <association property="songer" javaType="com.qcby.model.Songer" resultMap="com.qcby.dao.SongerMapper.BaseResultMap"></association>
    3. </resultMap>
    4. <!-- 查询要播放的歌曲集合返回-->
    5. <select id="getSongByIds" parameterType="java.util.List" resultMap="selectObjectByConditionRM">
    6. select * from song s left join mtype m on s.tid=m.tid left join songer sr on s.srid=sr.srid left join album a on s.aid=a.aid
    7. <where>
    8. s.sid in
    9. <if test="list!=null">
    10. <foreach collection="list" open="(" close=")" separator="," item="sid">
    11. #{sid}
    12. </foreach>
    13. </if>
    14. order by field (s.sid,
    15. <foreach collection="list" separator="," item="sid">
    16. #{sid}
    17. </foreach>
    18. )
    19. </where>
    20. </select>
    21. <resultMap id="getSongRM" type="com.qcby.model.Song" extends="ResultMapWithBLOBs">
    22. <association property="songer" javaType="com.qcby.model.Songer" resultMap="com.qcby.dao.SongerMapper.BaseResultMap"></association>
    23. </resultMap>
    24. <!-- 实现歌曲播放-->
    25. <select id="getSong" parameterType="int" resultMap="getSongRM">
    26. select * from song left join songer on song.srid=songer.srid where song.sid=#{sid}
    27. </select>

    play.jsp页面

    1. <c:forEach items="${songs}" var="song" varStatus="status">
    2. <li class="songList">
    3. <div class="songLMain">
    4. <div class="check">
    5. <input class="checkIn" type="checkbox" select="0" value="${song.sid}">
    6. </div>
    7. <div class="start" >
    8. <em sonN="${status.count}" msid="${song.sid}">${status.count}</em>
    9. </div>
    10. <div class="songBd">
    11. <div class="col colsn">${song.sname}</div>
    12. <div class="col colcn">${song.songer.srname}</div>
    13. <div class="col">${song.album.aname}</div>
    14. </div>
    15. <div class="control">
    16. <a class="cicon love"></a>
    17. <a class="cicon more" style="display:none"></a>
    18. <a class="cicon dele" style="display:none"></a>
    19. </div>
    20. </div>
    21. </li>
    22. </c:forEach>

    3、音乐人界面

    ①展示所有音乐人

    创建SongerController,编写controller

    1. package com.qcby.controller;
    2. import com.qcby.model.Mtype;
    3. import com.qcby.model.Page;
    4. import com.qcby.model.Songer;
    5. import com.qcby.query.SongerQuery;
    6. import com.qcby.service.MtypeService;
    7. import com.qcby.service.SongService;
    8. import com.qcby.service.SongerService;
    9. import org.springframework.beans.factory.annotation.Autowired;
    10. import org.springframework.stereotype.Controller;
    11. import org.springframework.ui.Model;
    12. import org.springframework.web.bind.annotation.RequestMapping;
    13. import java.util.ArrayList;
    14. import java.util.List;
    15. @Controller
    16. @RequestMapping("/songer")
    17. public class SongerController {
    18. @Autowired
    19. private SongerService songerService;
    20. @Autowired
    21. private MtypeService mtypeService;
    22. @RequestMapping("/dofindAll")
    23. public String listType(SongerQuery mq, Model model) {
    24. if (mq.getPageNo() == 0) {
    25. mq.setPageNo(1);
    26. }
    27. mq.setPageSize(20);
    28. Page<Songer> page = songerService.selectObjectByCondition(mq);
    29. List<Mtype> mtypes = mtypeService.selectObjectAll();
    30. List<List<Songer>> list = new ArrayList<>();
    31. List<Songer> slist = (List<Songer>) page.getList();
    32. List<Songer> list1 = null;
    33. for (int i = 0; i < 20; i++) {
    34. if (i % 5 == 0) {
    35. list1 = new ArrayList<>();
    36. list.add(list1);
    37. }
    38. Songer s = null;
    39. if (i < slist.size()) {
    40. s = slist.get(i);
    41. list1.add(s);
    42. }
    43. }
    44. model.addAttribute("sList", list);
    45. model.addAttribute("page", page);
    46. model.addAttribute("mq", mq);
    47. model.addAttribute("mtypes", mtypes);
    48. return "songers";
    49. }

    前端songers.jsp页面展示

    1. <div id="body" class="gap">
    2. <input id="tid" type="hidden" value="${mq.tid}">
    3. <input id="isHot" type="hidden" value="${mq.isHot}">
    4. <div class="wrapper">
    5. <div class="content_wrapper">
    6. <div class="content">
    7. <div class="filter" data-spm="1392350033">
    8. <dl>
    9. <dt>流派&nbsp;:</dt>
    10. <dd>
    11. <p>
    12. <a href="#" ftype="mtype" value="" class="current">全部</a>
    13. <c:forEach items="${mtypes}" var="mtype">
    14. <a href="#" ftype="mtype" value="${mtype.tid}">${mtype.tname}</a>
    15. </c:forEach>
    16. </p>
    17. </dd>
    18. </dl>
    19. <dl>
    20. <dt>热门&nbsp;:</dt>
    21. <dd>
    22. <p>
    23. <a href="#" ftype="isHot" value="" class="current">全部</a>
    24. <a href="#" ftype="isHot" value="1">热门</a>
    25. </p>
    26. </dd>
    27. </dl>
    28. </div>
    29. <div class="albums" data-spm="1392350021">
    30. <c:forEach items="${sList}" var="subList">
    31. <div class="album_list">
    32. <c:forEach items="${subList}" var="songer">
    33. <div class="album" data-needpay="0" data-playstatus="1" data-downloadstatus="1">
    34. <div class="image">
    35. <a target="_blank" title="${songer.srname}" href="/songer/getSonger?srid=${songer.srid}">
    36. <img src="${filePath}${songer.pic}" alt="${songer.srname}">
    37. <b class="icon toplay" onclick="playalbum(406532);return false;" style="display: none;"></b>
    38. <dl style="display: none;">
    39. <dt>
    40. <b class="icon toheart"></b>
    41. <b class="icon todropmenu"></b>
    42. </dt>
    43. <dd style="display: none;">
    44. <ul>
    45. <li onclick="tag(406532,5);return false;"><b class="icon tofavourite"></b>收藏</li>
    46. <li onclick="album2collect(406532);return false;"><b class="icon tocollect"></b>添加到</li>
    47. <li onclick="recommend(406532,33);return false;"><b class="icon toshare"></b>分享到</li>
    48. </ul>
    49. </dd>
    50. </dl>
    51. <sup title="${songer.srname}"></sup> </a>
    52. </div>
    53. <div class="info">
    54. <p>
    55. <a target="_blank" title="${songer.srname}" href="#">${songer.srname}</a>
    56. </p>
    57. </div>
    58. </div>
    59. </c:forEach>
    60. </div>
    61. </c:forEach>
    62. </div>
    63. <input type="hidden" id="pageNoPortal" value="${mq.pageNoPortal}">
    64. <c:if test="${page.pageNo < page.totalPage}">
    65. <div class="loadr" id="loader"><a href="javascript:void(0);" onclick="loadMore01()"><b></b>查看更多</a></div>
    66. </c:if>
    67. <c:if test="${page.pageNo == page.totalPage}">
    68. <div class="loadr" id="nomore" style="font-size: 18px;">没有更多啦!</div>
    69. </c:if>
    70. </div>
    71. </div>
    72. <div class="sidebar" data-spm="1392350021">
    73. <div class="nav">
    74. <a class="index" href="#"><b></b>发现</a>
    75. <a class="top" href="#"><b></b>排行榜</a>
    76. <a class="magazines" href="#"><b></b>音乐人企划</a>
    77. <a class="artists current" href="#"><b></b>音乐人</a>
    78. <a class="songs " href="/song/dofindAll"><b></b>歌曲</a>
    79. <a class="albums" href="#"><b></b>专辑<sup>无损</sup></a>
    80. </div>
    81. <div class="genre">
    82. <c:forEach items="${mtypes}" var="mtype">
    83. <a href="/songer/dofindAll?tid=${mtype.tid}"><b></b>${mtype.tname}</a>
    84. </c:forEach>
    85. </div>
    86. </div>
    87. </div>
    88. </div>

    ②根据条件搜索音乐人

    songers.jsp页面的js请求

    1. <script>
    2. $(function () {
    3. var tid = "";
    4. var isHot = "";
    5. $(function () {
    6. //指定点击事件
    7. $(".filter p a").click(function () {
    8. //移除同辈的a链接的样式
    9. $(this).siblings().removeClass("current");
    10. //把点击的a链接的样式加上
    11. $(this).addClass("current");
    12. //获得流派的选中值
    13. var tid = $("a[ftype='mtype'][class='current']").attr("value");
    14. var isHot = $("a[ftype='isHot'][class='current']").attr("value");
    15. //alert(tid+" "+isHot+" "+isNew);
    16. window.location.href = "/songer/dofindAll?tid="+tid+"&isHot="+isHot;
    17. })
    18. tid = $("#tid").val();
    19. isHot = $("#isHot").val();
    20. //流派的回显
    21. $("a[ftype='mtype'][class='current']").removeClass("current");
    22. $("a[ftype='mtype'][value='"+tid+"']").addClass("current");
    23. //热门回显
    24. $("a[ftype='isHot'][class='current']").removeClass("current");
    25. $("a[ftype='isHot'][value='"+isHot+"']").addClass("current");
    26. })

    ③查看更多

    songers.jsp页面的js请求

    1. function loadMore01() {
    2. var pageNoPortal = parseInt($("#pageNoPortal").val());
    3. //计算pageSize
    4. var pageSize = 5*(++pageNoPortal);
    5. window.location.href = "/song/dofindAll?tid="+tid+"&isHot="+isHot+"&pageSize="+pageSize+"&pageNoPortal="+pageNoPortal;
    6. }

    这里前三个共用一个请求—dofindAll,和歌曲界面相似,也只是请求参数不一样 

    ④查看音乐人的详细信息

    点击音乐人的图片,就可以查看音乐人的详细信息,发送getSonger请求,并带有音乐人的id

    <a target="_blank" title="${songer.srname}" href="/songer/getSonger?srid=${songer.srid}">

    controller编写,根据音乐人的id联表查询歌曲信息,将其返回给songer,jsp页面

    1. @RequestMapping("/getSonger")
    2. public String getSong(Integer srid, Model model) {
    3. Songer songer = songerService.getSongs(srid);
    4. model.addAttribute("songer",songer);
    5. System.out.println(songer);
    6. return "songer";
    7. }

    根据音乐人的id联表查询歌曲信息的service接口

    1. //根据歌手id联表查询歌曲信息
    2. public Songer getSongs(Integer srid);

    根据音乐人的id联表查询歌曲信息的service实现类

    1. @Override
    2. public Songer getSongs(Integer srid) {
    3. return songerMapper.getSongs(srid);
    4. }

    根据音乐人的id联表查询歌曲信息的mapper接口

    1. //根据歌手id联表查询歌曲信息
    2. public Songer getSongs(Integer srid);

    根据音乐人的id联表查询歌曲信息的sql

    1. <resultMap id="getSongsRM" type="com.qcby.model.Songer" extends="ResultMapWithBLOBs">
    2. <collection property="songs" ofType="com.qcby.model.Song" resultMap="com.qcby.dao.SongMapper.BaseResultMap"></collection>
    3. <collection property="mtype" ofType="com.qcby.model.Mtype" resultMap="com.qcby.dao.MtypeMapper.BaseResultMap"></collection>
    4. </resultMap>
    5. <select id="getSongs" parameterType="Integer" resultMap="getSongsRM">
    6. select sr.srid, sr.srname, sr.area, sr.intro, sr.pic, m.*, s.* from songer sr left join mtype m on sr.tid=m.tid left join song s on sr.srid=s.srid where sr.srid=#{srid}
    7. </select>

    songer.jsp页面

    1. <div id="artist_info">
    2. <table>
    3. <tbody>
    4. <tr>
    5. <td width="56" valign="top" class="item">地区:</td>
    6. <td valign="top">${songer.area}</td>
    7. </tr>
    8. <tr>
    9. <td width="56" valign="top" class="item">风格:</td>
    10. <td valign="top"><a href="/songer/dofindAll?tid="${songer.mtype.tid}>
    11. ${songer.mtype.tname}</a>
    12. </td>
    13. </tr>
    14. <tr>
    15. <td width="56" valign="top" class="item">档案:</td>
    16. <td valign="top">
    17. <div class="record">
    18. ${songer.intro}
    19. </div>
    20. </td>
    21. </tr>
    22. </tbody>
    23. </table>
    24. </div>
    25. <div id="artist_photo">
    26. <a id="cover_lightbox"
    27. href="#" target="_blank"
    28. title="${songer.srname}" data-lightbox="lightbox"> <img
    29. src="${filePath}${songer.pic}"
    30. alt="${songer.srname}"/></a>
    31. </div>

    至此,一个哈哈音乐项目就全部完成啦!!!

  • 相关阅读:
    【Proteus仿真】L297驱动步进电机
    SAP 10策略测试及简介
    张益唐的朗道-西格尔零点猜想的论文公布,专家认为该论文尚未完整解决零点猜想
    Photoshop图层混合模式公式(Unity,CG实现)
    基于opencv的图像阴影消除&车辆变道检测
    什么是原生IP?原生IP与住宅IP有何区别?
    Docker基本使用和认识
    多媒体应用设计师 第5章 多媒体信息显示、发布及搜索技术
    毕设 JAVA JSPsqlserver_基于J2EE的论坛论文
    如何选择高频器件功分器和耦合器的PCB材料
  • 原文地址:https://blog.csdn.net/weixin_47480200/article/details/137402648