基于JavaSpringMVC+vue实现协同过滤电影推荐系统详细设计《下》

举报
Java李杨勇 发表于 2022/08/31 20:37:54 2022/08/31
【摘要】 四、功能截图: 4.1 登录注册:​编辑 4.2 用户首页: 4.2.1 首页:电影推荐系统,在系统首页可以查看首页,免费电影,付费电影,电影论坛,电影资讯,个人中心等内容,并进行详细操作。​编辑 4.2.2 免费电影:免费电影,在免费电影页面可以查看电影编号,电影分类,评分,开映时间,时长,导演,主演,点击次数等信息,并进行赞一下,踩一下,点我收藏等操作 ​编辑 4.2.3 付费电影:付...

四、功能截图:

4.1 登录注册:

​编辑

4.2 用户首页:

4.2.1 首页:

电影推荐系统,在系统首页可以查看首页,免费电影,付费电影,电影论坛,电影资讯,个人中心等内容,并进行详细操作。

​编辑

4.2.2 免费电影:

免费电影,在免费电影页面可以查看电影编号,电影分类,评分,开映时间,时长,导演,主演,点击次数等信息,并进行赞一下,踩一下,点我收藏等操作

​编辑 4.2.3 付费电影:

付费电影,在免费电影页面可以查看电影编号,电影分类,评分,开映时间,时长,导演,主演,点击次数等信息,并进行赞一下,踩一下,点我收藏等操作

​编辑

查看详情!进行预览播放视频!收藏 点餐 踩等功能!收藏越多权重越高

​编辑 详情查看以及评论等操作​编辑

4.2.4 电影论坛:

​编辑

​编辑

4.2.5 电影资讯:

​编辑

4.2.6 个人中心:

个人中心,在个人中心页面通过填写用户名,姓名,密码,性别,年龄,手机号等内容进行更新信息,还可以根据需要对我的发布,我的收藏进行相对应操作

​编辑

4.3 用户后端:

4.3.1 个人信息:

​编辑

4.3.2 电影订单:

​编辑

4.4 管理员后端:

可以对首页,个人中心,用户管理,电影分类管理,免费电影管理,付费电影管理,电影订单管理、电影论坛,系统管理等功能进行相应的操作

4.4.1 用户管理:

用户管理,在用户管理页面可以对索引,用户名,姓名,性别,年龄,手机号等内容进行详情,修改和删除操作

​编辑

4.4.2 电影分类:

​编辑

4.4.3 免费电影:

免费电影管理,在免费电影管理页面可以对索引,电影编号,电影名称,视频,海报,评分,开映时间,时长,主演,导演等内容进行详情,修改,查看评论和删除操作

​编辑

​编辑

4.4.4 付费电影:

付费电影管理,在付费电影管理页面可以对索引,电影编号,电影名称,预告片,价格,海报,评分,开映时间,时长,主演,导演等内容进行详情,修改,查看评论和删除操作

​编辑

4.4.5 电影订单:

电影订单管理,在电影订单管理页面可以对 索引,订单编号,电影编号,电影名称,价格,用户名,姓名,手机号,购买时间,是否支付等内容进行详情,我的电影,修改和删除等操作

​编辑

4.4.7 电影论坛:

​编辑

4.4.8 系统管理:

​编辑

4.4.9 首页轮播图:

​编辑

五、代码实现:

5.1 用户登录:

 form.on('submit(login)', function(data) {
                data = data.field;
                if (vue.roles.length!=1) {
                	if (!data.role) {
			    layer.msg('请选择登录用户类型', {
				time: 2000,
				icon: 5
			    });
			    return false;
			}
                } else {
                        data.role = vue.roles[0].tableName;
                }
                http.request(data.role + '/login', 'get', data, function(res) {
                    layer.msg('登录成功', {
                        time: 2000,
                        icon: 6
                    });
                    // 登录凭证
                    localStorage.setItem('Token', res.token);
                    var roleName = "";
                    if(typeof(jquery('#role:checked').attr('title')) == "undefined") {
                    	roleName = vue.roles[0].roleName;
                    } else {
                    	roleName = jquery('#role:checked').attr('title');
                    }
                    localStorage.setItem('role', roleName);
                    // 当前登录用户角色
                    localStorage.setItem('userTable', data.role);
                    localStorage.setItem('sessionTable', data.role);
                    // 用户名称
                    localStorage.setItem('adminName', data.username);
                    http.request(data.role + '/session', 'get', {}, function(res) {
                        // 用户id
                        localStorage.setItem('userid', res.data.id);
		    	if(res.data.vip) {
				localStorage.setItem('vip', res.data.vip);
		    	}
                        // 路径访问设置
                        window.location.href = '../../index.html';
                    })
                    
                });
                return false
            });

5.2 文件上传;

/**
	 * 上传文件
	 */
	@RequestMapping("/upload")
	public R upload(@RequestParam("file") MultipartFile file, String type,HttpServletRequest request) throws Exception {
		if (file.isEmpty()) {
			throw new EIException("上传文件不能为空");
		}
		String fileExt = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")+1);
		String fileName = new Date().getTime()+"."+fileExt;
		File dest = new File(request.getSession().getServletContext().getRealPath("/upload")+"/"+fileName);
		file.transferTo(dest);
	
//		FileUtils.copyFile(dest, new File("D:\ssmpiv99\src\main\webapp\upload"+"/"+fileName)); /**修改了路径以后请将该行最前面的//注释去掉**/
		if(StringUtils.isNotBlank(type) && type.equals("1")) {
			ConfigEntity configEntity = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "faceFile"));
			if(configEntity==null) {
				configEntity = new ConfigEntity();
				configEntity.setName("faceFile");
				configEntity.setValue(fileName);
			} else {
				configEntity.setValue(fileName);
			}
			configService.insertOrUpdate(configEntity);
		}
		return R.ok().put("file", fileName);
	}

5.3 电影订单:



/**
 * 电影订单
 * 后端接口
 * @author 
 * @email 
 * @date 2022-08-06 21:42:07
 */
@RestController
@RequestMapping("/dianyingdingdan")
public class DianyingdingdanController {
    @Autowired
    private DianyingdingdanService dianyingdingdanService;

        /**
     * 前端列表
     */
    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params,DianyingdingdanEntity dianyingdingdan, 
		HttpServletRequest request){
        EntityWrapper<DianyingdingdanEntity> ew = new EntityWrapper<DianyingdingdanEntity>();
		PageUtils page = dianyingdingdanService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, dianyingdingdan), params), params));
        return R.ok().put("data", page);
    }

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

	 /**
     * 查询
     */
    @RequestMapping("/query")
    public R query(DianyingdingdanEntity dianyingdingdan){
        EntityWrapper< DianyingdingdanEntity> ew = new EntityWrapper< DianyingdingdanEntity>();
 		ew.allEq(MPUtil.allEQMapPre( dianyingdingdan, "dianyingdingdan")); 
		DianyingdingdanView dianyingdingdanView =  dianyingdingdanService.selectView(ew);
		return R.ok("查询电影订单成功").put("data", dianyingdingdanView);
    }


    /**
     * 前端详情
     */
    @RequestMapping("/detail/{id}")
    public R detail(@PathVariable("id") Long id){
        DianyingdingdanEntity dianyingdingdan = dianyingdingdanService.selectById(id);
        return R.ok().put("data", dianyingdingdan);
    }
    

    
    /**
     * 前端保存
     */
    @RequestMapping("/add")
    public R add(@RequestBody DianyingdingdanEntity dianyingdingdan, HttpServletRequest request){
    	dianyingdingdan.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
    	//ValidatorUtils.validateEntity(dianyingdingdan);

        dianyingdingdanService.insert(dianyingdingdan);
        return R.ok();
    }

    /**
     * 修改
     */
    @RequestMapping("/update")
    public R update(@RequestBody DianyingdingdanEntity dianyingdingdan, HttpServletRequest request){
        //ValidatorUtils.validateEntity(dianyingdingdan);
        dianyingdingdanService.updateById(dianyingdingdan);//全部更新
        return R.ok();
    }
    
    /**
     * 删除
     */
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids){
        dianyingdingdanService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }

}

5.4 协同过滤算法主要实现:

 /**
     * 协同算法(按收藏推荐)
     */
    @RequestMapping("/autoSort")
    public R autoSort2(@RequestParam Map<String, Object> params,MianfeidianyingEntity mianfeidianying, HttpServletRequest request){
        String userId = request.getSession().getAttribute("userId").toString();
        String inteltypeColumn = "dianyingfenlei";
        List<StoreupEntity> storeups = storeupService.selectList(new EntityWrapper<StoreupEntity>().eq("type", 1).eq("userid", userId).eq("tablename", "mianfeidianying").orderBy("addtime", false));
        List<String> inteltypes = new ArrayList<String>();
        Integer limit = params.get("limit")==null?10:Integer.parseInt(params.get("limit").toString());
        List<MianfeidianyingEntity> mianfeidianyingList = new ArrayList<MianfeidianyingEntity>();
        //去重
        if(storeups!=null && storeups.size()>0) {
            for(StoreupEntity s : storeups) {
                mianfeidianyingList.addAll(mianfeidianyingService.selectList(new EntityWrapper<MianfeidianyingEntity>().eq(inteltypeColumn, s.getInteltype())));
            }
        }
        EntityWrapper<MianfeidianyingEntity> ew = new EntityWrapper<MianfeidianyingEntity>();
        params.put("sort", "id");
        params.put("order", "desc");
        PageUtils page = mianfeidianyingService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, mianfeidianying), params), params));
        List<MianfeidianyingEntity> pageList = (List<MianfeidianyingEntity>)page.getList();
        if(mianfeidianyingList.size()<limit) {
            int toAddNum = (limit-mianfeidianyingList.size())<=pageList.size()?(limit-mianfeidianyingList.size()):pageList.size();
            for(MianfeidianyingEntity o1 : pageList) {
                boolean addFlag = true;
                for(MianfeidianyingEntity o2 : mianfeidianyingList) {
                    if(o1.getId().intValue()==o2.getId().intValue()) {
                        addFlag = false;
                        break;
                    }
                }
                if(addFlag) {
                    mianfeidianyingList.add(o1);
                    if(--toAddNum==0) break;
                }
            }
        }
        page.setList(mianfeidianyingList);
        return R.ok().put("data", page);
    }

六、项目总结:

历经六个月左右的时间,本次的毕业设计已画上了句号。原本以为完成一个系统会很顺利,因为在之前课上,也曾动手操作过相关的模块编写,但当真正接触到一个完整的系统时,发现并没有想象地那么简单。首先,以前实践过的只是单独的模块,而这次,是一个庞大的系统,许多细节不容忽视,有时候稍不留意的一个小错误,会致使整个系统都运行不起来,而查找错误的过程又漫长且艰辛,这也正是经验不足所导致的。在整个系统开发过程中,也查阅了很多书籍和相关资料,这让我不但巩固了原本的知识,同时还学习到了一些新的知识,这让我受益匪浅。

此次系统从整体看来,已基本达到预期的设计目的,能够实现基本的功能,但相较于市场的一些优秀网站而言,还是有许多不足的地方。遗憾的是,由于时间的有限,已经不允许再投入更多的时间和精力进行研究开发。相信在以后的工作中,我会接触到更多相关的知识,会更丰富自身的经验,我希望到时能够在此基础上完成一个丰富完整的学习网站,这将对我有很大的意义。

通过这次的毕业设计,我学到了很多,除了学识方面的知识,在态度上也有了很大的转变,细心和耐心是整个开发过程中最重要的两件事。我也在跟随着系统的完善而成长,这次毕业设计考核地也不单单是所学的知识,也同样在衡量着面对困难时的态度。

大家点赞、收藏、关注、评论啦 、查看👇🏻👇🏻

打卡 文章 更新 308/  365天

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。