计算机毕业设计 基于协同过滤算法的个性化音乐推荐系统的设计与实现 Java实战项目 附源码+文档+视频讲解

news2024/11/20 12:41:16

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌
🍅文末获取源码联系🍅
👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟
————————————————
计算机毕业设计《1000套》✌

Python毕设精品项目✌

微信小程序毕设精品项目✌

大数据及机器学习毕设精品项目✌

目录

1、项目介绍及开发技术

1.1 项目介绍

1.2 开发技术

2、系统功能设计结构图

3、功能截图

3.1 前台功能

3.2 后台功能

4、数据库表结构设计

5、关键代码

5.1 音乐信息Controller模块 

5.2 音乐信息Service模块 

5.3 音乐信息ServiceImpl模块

5.4  音乐信息Dao模块

6、论文目录结构

7、源码获取


1、项目介绍及开发技术

1.1 项目介绍

在数字音乐时代,用户面临着海量的音乐选择,而发现符合个人口味的音乐却变得越来越困难。传统的音乐推荐方式往往无法准确捕捉用户的个性化需求。为了解决这一问题,我们开发了一个基于协同过滤算法的个性化音乐推荐系统,旨在为用户提供更加精准的音乐推荐服务。

背景: 随着互联网技术的发展,在线音乐平台迅速崛起,用户可以在平台上接触到各种各样的音乐。然而,用户在享受丰富音乐资源的同时,也面临着选择困难的问题。传统的音乐推荐系统往往采用简单的热门推荐或随机推荐,无法满足用户对个性化音乐的需求。

目的意义:

  1. 个性化推荐: 系统通过协同过滤算法,分析用户的音乐评分和听歌历史,为用户提供个性化的音乐推荐。
  2. 提升用户体验: 用户可以通过系统发现新的音乐,增加音乐探索的乐趣,提升音乐聆听体验。
  3. 增强用户粘性: 通过精准推荐,系统能够增加用户的满意度和忠诚度,提高用户活跃度。
  4. 促进音乐多样性: 系统不仅推荐热门音乐,还能发现并推荐小众音乐,促进音乐文化的多样性。
  5. 数据驱动的决策支持: 系统收集的用户数据和反馈信息,为音乐产业提供市场趋势分析和决策支持。

综上所述,基于协同过滤算法的个性化音乐推荐系统旨在为用户提供一个更加智能、个性化的音乐聆听环境,通过技术手段优化音乐推荐流程,提升用户的音乐体验。

1.2 开发技术

类别技术名称用途/描述
开发语言Java一种广泛使用的面向对象编程语言。
框架Spring Boot简化Spring应用的初始搭建以及开发过程。
ORM工具MyBatis PlusMyBatis的增强工具,简化CRUD操作。
数据库MySQL流行的关系型数据库管理系统。
构建工具Maven项目管理和理解工具。
开发工具IDEA集成开发环境,用于代码编写和调试。
JDK版本JDK 1.8+Java开发工具包,提供运行Java程序所需的环境。
前端框架Vue用于构建用户界面的渐进式JavaScript框架。
UI框架Element UI基于Vue的桌面端组件库。
前端技术HTML网页内容的标准标记语言。
前端技术CSS描述HTML文档的样式。
前端技术JS网页脚本语言,用于实现网页的动态效果。

2、系统功能设计结构图

功能模块结构图

├── 前端
│   ├── 登录/注册
│   ├── 首页
│   ├── 音乐信息
│   ├── 音乐资讯
│   └── 个人中心
│       ├── 个人中心
│       ├── 修改密码
│       ├── 音乐评分
│       ├── 我的歌单
│       └── 我的收藏

└── 后端
    ├── 登录
    ├── 首页
    ├── 管理员管理
    ├── 用户管理
    ├── 音乐信息管理
    │   ├── 音乐类型
    │   ├── 标签
    │   └── 音乐信息
    ├── 音乐评分管理
    ├── 我的歌单管理
    └── 新闻资讯管理

系统MVC框架,请求流程展示:

3、功能截图

3.1 前台功能

3.2 后台功能

 

4、数据库表结构设计

--
-- Table structure for table `config`
--

DROP TABLE IF EXISTS `config`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `config` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(100) NOT NULL COMMENT '配置参数名称',
  `value` varchar(100) DEFAULT NULL COMMENT '配置参数值',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='配置文件';
/*!40101 SET character_set_client = @saved_cs_client */;


--
-- Table structure for table `discussyinlexinxi`
--

DROP TABLE IF EXISTS `discussyinlexinxi`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `discussyinlexinxi` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `refid` bigint(20) NOT NULL COMMENT '关联表id',
  `userid` bigint(20) NOT NULL COMMENT '用户id',
  `avatarurl` longtext COMMENT '头像',
  `nickname` varchar(200) DEFAULT NULL COMMENT '用户名',
  `content` longtext NOT NULL COMMENT '评论内容',
  `reply` longtext COMMENT '回复内容',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='音乐信息评论表';
/*!40101 SET character_set_client = @saved_cs_client */;


--
-- Table structure for table `storeup`
--

DROP TABLE IF EXISTS `storeup`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `storeup` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `refid` bigint(20) DEFAULT NULL COMMENT 'refid',
  `tablename` varchar(200) DEFAULT NULL COMMENT '表名',
  `name` varchar(200) NOT NULL COMMENT '名称',
  `picture` longtext NOT NULL COMMENT '图片',
  `type` varchar(200) DEFAULT NULL COMMENT '类型(1:收藏,21:赞,22:踩,31:竞拍参与,41:关注)',
  `inteltype` varchar(200) DEFAULT NULL COMMENT '推荐类型',
  `remark` varchar(200) DEFAULT NULL COMMENT '备注',
  `userid` bigint(20) NOT NULL COMMENT '用户id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='我的收藏';
/*!40101 SET character_set_client = @saved_cs_client */;


--
-- Table structure for table `wodegedan`
--

DROP TABLE IF EXISTS `wodegedan`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `wodegedan` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `songname` varchar(200) DEFAULT NULL COMMENT '歌名',
  `yinleleixing` varchar(200) DEFAULT NULL COMMENT '音乐类型',
  `singer` varchar(200) DEFAULT NULL COMMENT '歌手',
  `tianjiariqi` datetime DEFAULT NULL COMMENT '添加日期',
  `yonghuzhanghao` varchar(200) DEFAULT NULL COMMENT '用户账号',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=87 DEFAULT CHARSET=utf8 COMMENT='我的歌单';
/*!40101 SET character_set_client = @saved_cs_client */;


--
-- Table structure for table `yinlepingfen`
--

DROP TABLE IF EXISTS `yinlepingfen`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `yinlepingfen` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `songname` varchar(200) DEFAULT NULL COMMENT '歌名',
  `yinleleixing` varchar(200) DEFAULT NULL COMMENT '音乐类型',
  `singer` varchar(200) DEFAULT NULL COMMENT '歌手',
  `pingfen` int(11) DEFAULT NULL COMMENT '评分',
  `pingfenriqi` datetime DEFAULT NULL COMMENT '评分日期',
  `yonghuzhanghao` varchar(200) DEFAULT NULL COMMENT '用户账号',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=97 DEFAULT CHARSET=utf8 COMMENT='音乐评分';
/*!40101 SET character_set_client = @saved_cs_client */;


--
-- Table structure for table `yonghu`
--

DROP TABLE IF EXISTS `yonghu`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `yonghu` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `yonghuzhanghao` varchar(200) NOT NULL COMMENT '用户账号',
  `yonghumima` varchar(200) NOT NULL COMMENT '用户密码',
  `yonghuxingming` varchar(200) NOT NULL COMMENT '用户姓名',
  `touxiang` longtext COMMENT '头像',
  `xingbie` varchar(200) DEFAULT NULL COMMENT '性别',
  `shoujihaoma` varchar(200) DEFAULT NULL COMMENT '手机号码',
  PRIMARY KEY (`id`),
  UNIQUE KEY `yonghuzhanghao` (`yonghuzhanghao`)
) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8 COMMENT='用户';
/*!40101 SET character_set_client = @saved_cs_client */;

5、关键代码

5.1 音乐信息Controller模块 


package com.cl.controller;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;

import com.cl.utils.ValidatorUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.cl.annotation.IgnoreAuth;
import com.cl.utils.UserBasedCollaborativeFiltering;

import com.cl.entity.YinlexinxiEntity;
import com.cl.entity.view.YinlexinxiView;

import com.cl.service.YinlexinxiService;
import com.cl.service.TokenService;
import com.cl.utils.PageUtils;
import com.cl.utils.R;
import com.cl.utils.MPUtil;
import com.cl.utils.CommonUtil;
import java.io.IOException;
import com.cl.service.StoreupService;
import com.cl.entity.StoreupEntity;

/**
 * 音乐信息
 * 后端接口
 * @author 
 * @email 
 */
@RestController
@RequestMapping("/yinlexinxi")
public class YinlexinxiController {
    @Autowired
    private YinlexinxiService yinlexinxiService;

    @Autowired
    private StoreupService storeupService;


    /**
     * 后端列表
     */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params,YinlexinxiEntity yinlexinxi,
		HttpServletRequest request){
        EntityWrapper<YinlexinxiEntity> ew = new EntityWrapper<YinlexinxiEntity>();

		PageUtils page = yinlexinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, yinlexinxi), params), params));

        return R.ok().put("data", page);
    }
    
    /**
     * 前端列表
     */
	@IgnoreAuth
    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params,YinlexinxiEntity yinlexinxi, 
		HttpServletRequest request){
        EntityWrapper<YinlexinxiEntity> ew = new EntityWrapper<YinlexinxiEntity>();

		PageUtils page = yinlexinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, yinlexinxi), params), params));
        return R.ok().put("data", page);
    }

	/**
     * 列表
     */
    @RequestMapping("/lists")
    public R list( YinlexinxiEntity yinlexinxi){
       	EntityWrapper<YinlexinxiEntity> ew = new EntityWrapper<YinlexinxiEntity>();
      	ew.allEq(MPUtil.allEQMapPre( yinlexinxi, "yinlexinxi")); 
        return R.ok().put("data", yinlexinxiService.selectListView(ew));
    }

	 /**
     * 查询
     */
    @RequestMapping("/query")
    public R query(YinlexinxiEntity yinlexinxi){
        EntityWrapper< YinlexinxiEntity> ew = new EntityWrapper< YinlexinxiEntity>();
 		ew.allEq(MPUtil.allEQMapPre( yinlexinxi, "yinlexinxi")); 
		YinlexinxiView yinlexinxiView =  yinlexinxiService.selectView(ew);
		return R.ok("查询音乐信息成功").put("data", yinlexinxiView);
    }
	
    /**
     * 后端详情
     */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") Long id){
        YinlexinxiEntity yinlexinxi = yinlexinxiService.selectById(id);
		yinlexinxi.setClicknum(yinlexinxi.getClicknum()+1);
		yinlexinxiService.updateById(yinlexinxi);
		yinlexinxi = yinlexinxiService.selectView(new EntityWrapper<YinlexinxiEntity>().eq("id", id));
        return R.ok().put("data", yinlexinxi);
    }

    /**
     * 前端详情
     */
	@IgnoreAuth
    @RequestMapping("/detail/{id}")
    public R detail(@PathVariable("id") Long id){
        YinlexinxiEntity yinlexinxi = yinlexinxiService.selectById(id);
		yinlexinxi.setClicknum(yinlexinxi.getClicknum()+1);
		yinlexinxiService.updateById(yinlexinxi);
		yinlexinxi = yinlexinxiService.selectView(new EntityWrapper<YinlexinxiEntity>().eq("id", id));
        return R.ok().put("data", yinlexinxi);
    }
    



    /**
     * 后端保存
     */
    @RequestMapping("/save")
    public R save(@RequestBody YinlexinxiEntity yinlexinxi, HttpServletRequest request){
    	yinlexinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
    	//ValidatorUtils.validateEntity(yinlexinxi);
        yinlexinxiService.insert(yinlexinxi);
        return R.ok();
    }
    
    /**
     * 前端保存
     */
    @RequestMapping("/add")
    public R add(@RequestBody YinlexinxiEntity yinlexinxi, HttpServletRequest request){
    	yinlexinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
    	//ValidatorUtils.validateEntity(yinlexinxi);
        yinlexinxiService.insert(yinlexinxi);
        return R.ok();
    }



    /**
     * 修改
     */
    @RequestMapping("/update")
    @Transactional
    public R update(@RequestBody YinlexinxiEntity yinlexinxi, HttpServletRequest request){
        //ValidatorUtils.validateEntity(yinlexinxi);
        yinlexinxiService.updateById(yinlexinxi);//全部更新
        return R.ok();
    }



    

    /**
     * 删除
     */
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids){
        yinlexinxiService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }
    
	
	/**
     * 前端智能排序
     */
	@IgnoreAuth
    @RequestMapping("/autoSort")
    public R autoSort(@RequestParam Map<String, Object> params,YinlexinxiEntity yinlexinxi, HttpServletRequest request,String pre){
        EntityWrapper<YinlexinxiEntity> ew = new EntityWrapper<YinlexinxiEntity>();
        Map<String, Object> newMap = new HashMap<String, Object>();
        Map<String, Object> param = new HashMap<String, Object>();
		Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator();
		while (it.hasNext()) {
			Map.Entry<String, Object> entry = it.next();
			String key = entry.getKey();
			String newKey = entry.getKey();
			if (pre.endsWith(".")) {
				newMap.put(pre + newKey, entry.getValue());
			} else if (StringUtils.isEmpty(pre)) {
				newMap.put(newKey, entry.getValue());
			} else {
				newMap.put(pre + "." + newKey, entry.getValue());
			}
		}
		params.put("sort", "clicknum");
        params.put("order", "desc");
		PageUtils page = yinlexinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, yinlexinxi), params), params));
        return R.ok().put("data", page);
    }

    /**
     * 协同算法(基于用户收藏的协同算法)
     */
    @RequestMapping("/autoSort2")
    public R autoSort2(@RequestParam Map<String, Object> params,YinlexinxiEntity yinlexinxi, HttpServletRequest request){
        String userId = request.getSession().getAttribute("userId").toString();
        Integer limit = params.get("limit")==null?10:Integer.parseInt(params.get("limit").toString());
        List<StoreupEntity> storeups = storeupService.selectList(new EntityWrapper<StoreupEntity>().eq("type", 1).eq("tablename", "yinlexinxi"));
        Map<String, Map<String, Double>> ratings = new HashMap<>();
        if(storeups!=null && storeups.size()>0) {
            for(StoreupEntity storeup : storeups) {
                Map<String, Double> userRatings = null;
                if(ratings.containsKey(storeup.getUserid().toString())) {
                    userRatings = ratings.get(storeup.getUserid().toString());
                } else {
                    userRatings = new HashMap<>();
                    ratings.put(storeup.getUserid().toString(), userRatings);
                }

                if(userRatings.containsKey(storeup.getRefid().toString())) {
                    userRatings.put(storeup.getRefid().toString(), userRatings.get(storeup.getRefid().toString())+1.0);
                } else {
                    userRatings.put(storeup.getRefid().toString(), 1.0);
                }
            }
        }
        // 创建协同过滤对象
        UserBasedCollaborativeFiltering filter = new UserBasedCollaborativeFiltering(ratings);

        // 为指定用户推荐物品
        String targetUser = userId;
        int numRecommendations = limit;
        List<String> recommendations = filter.recommendItems(targetUser, numRecommendations);

        // 输出推荐结果
        System.out.println("Recommendations for " + targetUser + ":");
        for (String item : recommendations) {
            System.out.println(item);
        }

        EntityWrapper<YinlexinxiEntity> ew = new EntityWrapper<YinlexinxiEntity>();
        ew.in("id", String.join(",", recommendations));
        if(recommendations!=null && recommendations.size()>0) {
            ew.last("order by FIELD(id, "+"'"+String.join("','", recommendations)+"'"+")");
        }

        PageUtils page = yinlexinxiService.queryPage(params, ew);
        List<YinlexinxiEntity> pageList = (List<YinlexinxiEntity>)page.getList();
        if(pageList.size()<limit) {
            int toAddNum = limit-pageList.size();
            ew = new EntityWrapper<YinlexinxiEntity>();
            ew.notIn("id", recommendations);
            ew.orderBy("id", false);
            ew.last("limit "+toAddNum);
            pageList.addAll(yinlexinxiService.selectList(ew));
        } else if(pageList.size()>limit) {
            pageList = pageList.subList(0, limit);
        }
        page.setList(pageList);

        return R.ok().put("data", page);
    }




    /**
     * (按值统计)
     */
    @RequestMapping("/value/{xColumnName}/{yColumnName}")
    public R value(@PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName,HttpServletRequest request) {
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("xColumn", xColumnName);
        params.put("yColumn", yColumnName);
        EntityWrapper<YinlexinxiEntity> ew = new EntityWrapper<YinlexinxiEntity>();
        List<Map<String, Object>> result = yinlexinxiService.selectValue(params, ew);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        for(Map<String, Object> m : result) {
            for(String k : m.keySet()) {
                if(m.get(k) instanceof Date) {
                    m.put(k, sdf.format((Date)m.get(k)));
                }
            }
        }
        return R.ok().put("data", result);
    }

    /**
     * (按值统计(多))
     */
    @RequestMapping("/valueMul/{xColumnName}")
    public R valueMul(@PathVariable("xColumnName") String xColumnName,@RequestParam String yColumnNameMul, HttpServletRequest request) {
        String[] yColumnNames = yColumnNameMul.split(",");
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("xColumn", xColumnName);
        List<List<Map<String, Object>>> result2 = new ArrayList<List<Map<String,Object>>>();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        EntityWrapper<YinlexinxiEntity> ew = new EntityWrapper<YinlexinxiEntity>();
        for(int i=0;i<yColumnNames.length;i++) {
            params.put("yColumn", yColumnNames[i]);
            List<Map<String, Object>> result = yinlexinxiService.selectValue(params, ew);
            for(Map<String, Object> m : result) {
                for(String k : m.keySet()) {
                    if(m.get(k) instanceof Date) {
                        m.put(k, sdf.format((Date)m.get(k)));
                    }
                }
            }
            result2.add(result);
        }
        return R.ok().put("data", result2);
    }

    /**
     * (按值统计)时间统计类型
     */
    @RequestMapping("/value/{xColumnName}/{yColumnName}/{timeStatType}")
    public R valueDay(@PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName, @PathVariable("timeStatType") String timeStatType,HttpServletRequest request) {
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("xColumn", xColumnName);
        params.put("yColumn", yColumnName);
        params.put("timeStatType", timeStatType);
        EntityWrapper<YinlexinxiEntity> ew = new EntityWrapper<YinlexinxiEntity>();
        List<Map<String, Object>> result = yinlexinxiService.selectTimeStatValue(params, ew);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        for(Map<String, Object> m : result) {
            for(String k : m.keySet()) {
                if(m.get(k) instanceof Date) {
                    m.put(k, sdf.format((Date)m.get(k)));
                }
            }
        }
        return R.ok().put("data", result);
    }

    /**
     * (按值统计)时间统计类型(多)
     */
    @RequestMapping("/valueMul/{xColumnName}/{timeStatType}")
    public R valueMulDay(@PathVariable("xColumnName") String xColumnName, @PathVariable("timeStatType") String timeStatType,@RequestParam String yColumnNameMul,HttpServletRequest request) {
        String[] yColumnNames = yColumnNameMul.split(",");
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("xColumn", xColumnName);
        params.put("timeStatType", timeStatType);
        List<List<Map<String, Object>>> result2 = new ArrayList<List<Map<String,Object>>>();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        EntityWrapper<YinlexinxiEntity> ew = new EntityWrapper<YinlexinxiEntity>();
        for(int i=0;i<yColumnNames.length;i++) {
            params.put("yColumn", yColumnNames[i]);
            List<Map<String, Object>> result = yinlexinxiService.selectTimeStatValue(params, ew);
            for(Map<String, Object> m : result) {
                for(String k : m.keySet()) {
                    if(m.get(k) instanceof Date) {
                        m.put(k, sdf.format((Date)m.get(k)));
                    }
                }
            }
            result2.add(result);
        }
        return R.ok().put("data", result2);
    }

    /**
     * 分组统计
     */
    @RequestMapping("/group/{columnName}")
    public R group(@PathVariable("columnName") String columnName,HttpServletRequest request) {
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("column", columnName);
        EntityWrapper<YinlexinxiEntity> ew = new EntityWrapper<YinlexinxiEntity>();
        List<Map<String, Object>> result = yinlexinxiService.selectGroup(params, ew);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        for(Map<String, Object> m : result) {
            for(String k : m.keySet()) {
                if(m.get(k) instanceof Date) {
                    m.put(k, sdf.format((Date)m.get(k)));
                }
            }
        }
        return R.ok().put("data", result);
    }




    /**
     * 总数量
     */
    @RequestMapping("/count")
    public R count(@RequestParam Map<String, Object> params,YinlexinxiEntity yinlexinxi, HttpServletRequest request){
        EntityWrapper<YinlexinxiEntity> ew = new EntityWrapper<YinlexinxiEntity>();
        int count = yinlexinxiService.selectCount(MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, yinlexinxi), params), params));
        return R.ok().put("data", count);
    }


}

5.2 音乐信息Service模块 

 package com.cl.service;

import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.service.IService;
import com.cl.utils.PageUtils;
import com.cl.entity.YinlexinxiEntity;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;
import com.cl.entity.view.YinlexinxiView;


/**
 * 音乐信息
 *
 * @author 
 * @email 
 */
public interface YinlexinxiService extends IService<YinlexinxiEntity> {

    PageUtils queryPage(Map<String, Object> params);
    
   	List<YinlexinxiView> selectListView(Wrapper<YinlexinxiEntity> wrapper);
   	
   	YinlexinxiView selectView(@Param("ew") Wrapper<YinlexinxiEntity> wrapper);
   	
   	PageUtils queryPage(Map<String, Object> params,Wrapper<YinlexinxiEntity> wrapper);
   	

    List<Map<String, Object>> selectValue(Map<String, Object> params,Wrapper<YinlexinxiEntity> wrapper);

    List<Map<String, Object>> selectTimeStatValue(Map<String, Object> params,Wrapper<YinlexinxiEntity> wrapper);

    List<Map<String, Object>> selectGroup(Map<String, Object> params,Wrapper<YinlexinxiEntity> wrapper);



}

5.3 音乐信息ServiceImpl模块


package com.cl.service.impl;

import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.List;

import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.cl.utils.PageUtils;
import com.cl.utils.Query;


import com.cl.dao.YinlexinxiDao;
import com.cl.entity.YinlexinxiEntity;
import com.cl.service.YinlexinxiService;
import com.cl.entity.view.YinlexinxiView;

@Service("yinlexinxiService")
public class YinlexinxiServiceImpl extends ServiceImpl<YinlexinxiDao, YinlexinxiEntity> implements YinlexinxiService {
	
	
    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        Page<YinlexinxiEntity> page = this.selectPage(
                new Query<YinlexinxiEntity>(params).getPage(),
                new EntityWrapper<YinlexinxiEntity>()
        );
        return new PageUtils(page);
    }
    
    @Override
	public PageUtils queryPage(Map<String, Object> params, Wrapper<YinlexinxiEntity> wrapper) {
		  Page<YinlexinxiView> page =new Query<YinlexinxiView>(params).getPage();
	        page.setRecords(baseMapper.selectListView(page,wrapper));
	    	PageUtils pageUtil = new PageUtils(page);
	    	return pageUtil;
 	}
    
	@Override
	public List<YinlexinxiView> selectListView(Wrapper<YinlexinxiEntity> wrapper) {
		return baseMapper.selectListView(wrapper);
	}

	@Override
	public YinlexinxiView selectView(Wrapper<YinlexinxiEntity> wrapper) {
		return baseMapper.selectView(wrapper);
	}

    @Override
    public List<Map<String, Object>> selectValue(Map<String, Object> params, Wrapper<YinlexinxiEntity> wrapper) {
        return baseMapper.selectValue(params, wrapper);
    }

    @Override
    public List<Map<String, Object>> selectTimeStatValue(Map<String, Object> params, Wrapper<YinlexinxiEntity> wrapper) {
        return baseMapper.selectTimeStatValue(params, wrapper);
    }

    @Override
    public List<Map<String, Object>> selectGroup(Map<String, Object> params, Wrapper<YinlexinxiEntity> wrapper) {
        return baseMapper.selectGroup(params, wrapper);
    }




}

5.4  音乐信息Dao模块


package com.cl.dao;

import com.cl.entity.YinlexinxiEntity;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import java.util.List;
import java.util.Map;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.pagination.Pagination;

import org.apache.ibatis.annotations.Param;
import com.cl.entity.view.YinlexinxiView;


/**
 * 音乐信息
 * 
 * @author 
 * @email 
 */
public interface YinlexinxiDao extends BaseMapper<YinlexinxiEntity> {
	
	List<YinlexinxiView> selectListView(@Param("ew") Wrapper<YinlexinxiEntity> wrapper);

	List<YinlexinxiView> selectListView(Pagination page,@Param("ew") Wrapper<YinlexinxiEntity> wrapper);
	
	YinlexinxiView selectView(@Param("ew") Wrapper<YinlexinxiEntity> wrapper);
	

    List<Map<String, Object>> selectValue(@Param("params") Map<String, Object> params,@Param("ew") Wrapper<YinlexinxiEntity> wrapper);

    List<Map<String, Object>> selectTimeStatValue(@Param("params") Map<String, Object> params,@Param("ew") Wrapper<YinlexinxiEntity> wrapper);

    List<Map<String, Object>> selectGroup(@Param("params") Map<String, Object> params,@Param("ew") Wrapper<YinlexinxiEntity> wrapper);



}

6、论文目录结构

摘要... I

Abstract... II

1 绪论... 1
   1.1 项目简介... 1
   1.2 调查研究... 1
       1.2.1 研究背景及意义... 1
       1.2.2 国内外研究现状... 2
       1.2.3 研究主要内容... 2
   1.3 论文的章节安排... 3

2 系统相关技术介绍... 4
   2.1 Java语言... 4
   2.2 SpringBoot框架... 4
   2.3 Vue框架... 4
   2.4 MySQL数据库... 4

3 系统需求分析... 6
   3.1 可行性分析... 6
       3.1.1 技术可行性... 6
       3.1.2 经济可行性... 6
       3.1.3 操作可行性... 6
   3.2 系统功能需求... 6
       3.2.1 用户端功能需求... 6
       3.2.2 XX端功能需求... 6
       3.2.3 管理员端功能需求... 6
   3.3 系统性能需求... 6

4 系统总体设计... 7
   4.1 系统总体架构设计... 7
   4.2 系统的功能设计... 7
   4.3 数据库设计... 7
       4.3.1 概念设计E-R图... 7
       4.3.2 逻辑设计关系模式... 7
       4.3.3 数据库物理设计... 7

5 系统详细实现... 14
   5.1 系统实现环境... 14
   5.2 用户端... 14
       5.2.1 登录页面... 14
       5.2.2 注册页面... 14
       5.2.3 XXXX页面... 14
       5.2.4 XXXX页面... 14
       5.2.5 XXXX页面... 14
   5.3 XXXX端... 15
       5.3.1 XXXX页面... 15
       5.3.2 XXXX页面... 15
       5.3.3 XXXX页面... 15
       5.3.4 XXXX页面... 15
   5.4 管理端... 15
       5.4.1 用户管理页面... 15
       5.4.2 XXXX页面... 15
       5.4.3 XXXX页面... 16
       5.4.4 XXXX页面... 16

6 系统测试... 16
   6.1 测试目的... 16
   6.2 测试方法... 16
   6.3 测试用例... 16
       6.3.1 XXXX测试... 16
       6.3.2 XXXX测试... 16
   6.4 测试结果... 16

结论... 17

参考文献... 18

致谢... 19

更多源码:

计算机毕业设计选题1000套等你来!!!

Python毕设精品项目

微信小程序毕设精品项目  

大数据及机器学习毕设精品项目 

7、源码获取

感谢大家的阅读,如有不懂的问题可以评论区交流或私聊!

喜欢文章可以点赞、收藏、关注、评论

下方联系方式获取源码

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux系统命令:用于改变用户的登录 Shell 的命令chsh命令详解

目录 一、概述 二、用法 1、基本用法 2、常用选项 3、获取帮助 三、示例 1. 更改当前用户的登录 Shell 2. 更改其他用户的登录 Shell 3、列出所有可用的 shell 四、 注意事项 1、已经安装好 2、权限 3、密码验证 4、shell 路径 5、生效时间 五、示例输出 一、概…

mfc140u.dll缺失?快速解决方法全解析,解决mfc140u.dll错误

当你的电脑出现找不到mfc140u.dll的问题&#xff0c;不少用户在使用电脑时陷入了困扰。这个错误提示就像一道屏障&#xff0c;阻挡了用户正常使用某些软件。无论是办公软件、游戏还是专业的设计工具&#xff0c;一旦出现这个问题&#xff0c;都会导致软件无法正常运行。如果您也…

复数表示的电场

Exm加是复振幅&#xff0c;这是用复数表示电场&#xff0c;并提取只与空间有关的项复振幅就是复数表示电场&#xff0c;且把与空间xyz有关的量提取出来 经过验证实数E0cos&#xff08;wtδx&#xff09;对t求导&#xff0c;等于E0e^j(wtδx)对t求导再取实部 实数表示电磁波cos…

Windows11系统下SkyWalking环境搭建教程

目录 前言SkyWalking简介SkyWalking下载Agent监控实现启动配置SkyWalking启动Java应用程序启动Elasticsearch安装总结 前言 本文为博主在项目环境搭建时记录的SkyWalking安装流程&#xff0c;希望对大家能够有所帮助&#xff0c;不足之处欢迎批评指正&#x1f91d;&#x1f91…

openpnp - 底部相机高级校正的参数设置

文章目录 openpnp - 底部相机高级校正的参数设置概述笔记修改 “Radial Lines Per Calibration Z” 的方法不同 “Radial Lines Per Calibration Z”的校验结果不同 “Radial Lines Per Calibration Z”的设备校验动作的比较总结备注END openpnp - 底部相机高级校正的参数设置 …

5G NR物理信道简介

文章目录 NR 上行物理信道PRACHPUCCHPUSCH NR 下行物理信道PBCHPDCCHPDSCH NR 上行物理信道 PRACH PRACH&#xff08;Physical Random Access Channel)物理随机接入信道&#xff0c;用于传导preamble 序列。PRACH 由循环前缀CP、前导序列和保护间隔三部分组成。 PUCCH PUCCH…

相互作用的检索增强 3D 分子生成扩散模型 - IRDiff 评测

IRDiff 是一个全新的基于蛋白质-配体相互作用的检索增强 3D 分子扩散模型&#xff0c;可以生成目标感知的分子。IRDiff 利用一组设计好的参考配体分子来引导扩散模型生成满足目标特性的分子。 一、背景介绍 IRDiff 来源于清华大学深圳国际研究生院的杨文明教授和鹏城实验室的王…

通信工程学习:什么是POP3邮局协议版本3

POP3&#xff1a;邮局协议版本3 POP3&#xff08;Post Office Protocol - Version 3&#xff09;&#xff0c;即邮局协议版本3&#xff0c;是TCP/IP协议族中的一员&#xff0c;由RFC1939定义。它是一种用于电子邮件接收的协议&#xff0c;主要规定了个人计算机如何连接到互联网…

OpenCV C++ 图像处理实战 ——《基于轮廓比对的缺陷检测》

OpenCV C++ 图像处理实战 ——《基于轮廓比对的缺陷检测》 一、结果演示二、图像预处理三、基于轮廓比对的缺陷检测3.1 计算平移分量3.2 计算旋转角度3.3 缺陷检测3.4 缺陷绘制四、源码测试图像下载总结一、结果演示 二、图像预处理 本文主要是基于轮廓匹配进行缺陷识别,最主…

STM32F103C8T6的平衡小车设计(基于FreeRTOS框架)

github主页&#xff1a;https://github.com/snqx-lqh gitee主页&#xff1a;https://gitee.com/snqx-lqh 本项目github地址&#xff1a;https://github.com/snqx-lqh/Stm32BalanceCar 本项目gitee地址&#xff1a;https://gitee.com/snqx-lqh/stm32-balance-car 欢迎交流 项目介…

leetcode:380. O(1) 时间插入、删除和获取随机元素

实现RandomizedSet 类&#xff1a; RandomizedSet() 初始化 RandomizedSet 对象bool insert(int val) 当元素 val 不存在时&#xff0c;向集合中插入该项&#xff0c;并返回 true &#xff1b;否则&#xff0c;返回 false 。bool remove(int val) 当元素 val 存在时&#xff0…

开发者在AIGC浪潮中的定位与策略

人工智能时代&#xff0c;程序员如何保持核心竞争力&#xff1f; 随着AIGC&#xff08;如chatgpt、midjourney、claude等&#xff09;大语言模型接二连三的涌现&#xff0c;AI辅助编程工具日益普及&#xff0c;程序员的工作方式正在发生深刻变革。有人担心AI可能取代部分编程工…

Python FFmpeg 安装使用教程

文章目录 什么是 FFmpeg&#xff1f;主要功能包括&#xff1a; Windows 下载安装下载解压安装配置环境变量 使用案例使用 ffmpeg-python 库转换视频格式视频剪辑添加字幕 使用 subprocess.run 执行视频格式转换 其它问题ffmpeg 不是内部或外部命令,也不是可运行的程序 个人简介…

【深度学习】反向传播-过程举例

深度学习中&#xff0c;一般的参数更新方式都是梯度下降法&#xff0c;在使用梯度下降法时&#xff0c;涉及到梯度反向传播的过程&#xff0c;那么在反向传播过程中梯度到底是怎么传递的&#xff1f;结合自己最近的一点理解&#xff0c;下面举个例子简单说明&#xff01; 一、…

47.哀家要长脑子了!

1.738. 单调递增的数字 - 力扣&#xff08;LeetCode&#xff09; 贪心不知道怎么贪。。。每个为选择最大的&#xff0c;如果前一位比后一位大&#xff0c;就要把前一位减去1&#xff0c;因为要最大的嘛&#xff0c;一点点减&#xff0c;然后剩下的都变为9&#xff0c;因为要最大…

CSS轮廓

轮廓&#xff08;outline&#xff09;是绘制于元素周围的一条线&#xff0c;位于边框的外围&#xff08;紧贴着边框&#xff09;&#xff0c;主要用来突出显示某个元素&#xff0c;如下图所示&#xff1a; 图&#xff1a;轮廓&#xff08;outline&#xff09; 轮廓和边框看起来…

【网络篇】计算机网络基础知识详述(1)(笔记)

目录 一、因特网基础认识 1. 初识因特网 2. 网络服务 3. 网络协议 4. 网络边缘 5. 物理链路 &#xff08;1&#xff09;双绞铜线 &#xff08;2&#xff09;同轴电缆 &#xff08;3&#xff09;光纤 6. 网络的网络&#xff08;因特网&#xff09; 二、网络核心 1. …

Linux Shell编程快速入门以及案例(Linux一键批量启动、停止、重启Jar包Shell脚本)

文章目录 1&#xff0c;shell核心概念1. 1&#xff0c;变量1. 2. 引号1. 3. 循环1. 4. 条件判断1. 5. 函数1. 6. 重定向1. 7. 管道1. 8. 通配符 2&#xff0c;案例 本文通过介绍Linux Shell编程中最重要的十个核心概念&#xff0c;帮助初学者快速入门。 1&#xff0c;shell核心…

事业单位2024最新资料大全(均已更新)

为了帮助广大考生更加高效、精准地备考&#xff0c;我们特别推出了2024事业单位考试最新资料大全&#xff0c;这份资料已全面更新&#xff0c;确保与最新考试大纲和趋势同步&#xff0c;是你备考路上的得力助手&#xff01; 文章目录 一、资料亮点二、为何选择我们&#xff1f;…

Sqlserver 连接 chche 数据库详细步骤

zihao 第一步&#xff0c;安装ODBC驱动 在windows资源管理器里粘贴以下地址&#xff0c;会进入到驱动文件夹 ftp://ftp.intersystems.com/pub/cache/odbc/2018/ 第二步&#xff0c;添加ODBC 安装后&#xff0c;可能需要重启。然后打开控制面板&#xff0c;搜素ODBC&#xf…