SpringBoot+Vue项目图书个性化推荐系统

news/2023/5/28 7:33:42

文末获取源码 

开发语言:Java

框架:springboot

JDK版本:JDK1.8

服务器:tomcat7

数据库:mysql 5.7/8.0

数据库工具:Navicat11

开发软件:eclipse/myeclipse/idea

Maven包:Maven3.3.9

浏览器:谷歌浏览器

一、前言介绍 

本文主要论述了如何使用JAVA语言开发一个图书个性化推荐系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用BS架构,面向对象编程思想进行项目开发。在引言中,作者将论述图书个性化推荐系统的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,对系统进行各个阶段分析设计。

图书个性化推荐系统的主要使用者分为管理员和学生,实现功能包括管理员:首页、个人中心、学生管理、图书分类管理、图书信息管理、图书预约管理、退换图书管理、管理员管理、留言板管理、系统管理,学生:首页、个人中心、图书预约管理、退换图书管理、我的收藏管理,前台首页;首页、图书信息、好书推荐、留言反馈、个人中心、后台管理等功能。由于本系统的功能模块设计比较全面,所以使得整个图书个性化推荐系统信息管理的过程得以实现。

二、系统结构设计

整个系统是由多个功能模块组合而成的,要将所有的功能模块都一一列举出来,然后进行逐个的功能设计,使得每一个模块都有相对应的功能设计,然后进行系统整体的设计。 

本图书个性化推荐系统结构图如图

三、前台首页功能模块

3.1首页 

图书个性化推荐系统,在前台首页可以查看首页、图书信息、好书推荐、留言反馈、个人中心、后台管理等内容,如图

3.2图书信息

在图书信息页面通过查看图书编号、图书名称、图书类别、图片、作者、出版社、版次、数量、点击次数等信息进行预约、立即提交或点我收藏操作,如图

四、管理员模块

4.1首页

管理员登录进入图书个性化推荐系统可以查看首页、个人中心、学生管理、图书分类管理、图书信息管理、图书预约管理、退换图书管理、管理员管理、留言板管理、系统管理等信息。

4.2学生管理

在学生管理页面中可以通过查看学号、密码、学生姓名、性别、出生日期、联系电话、班级等内容进行修改、删除等操作,如图所示。还可以根据需要对图书分类管理进行修改或删除等详细操作,如图

4.3图书信息管理

在图书信息管理页面中可以查看图书编号、图书名称、图书类别、图片、作者、出版社、版次、数量等信息,并可根据需要对己有图书信息管理进行详情、预约、查看评论、修改或删除等操作,如图

4.4图书预约管理

在图书预约管理页面中可以查看图书编号、图书名称、图书类别、作者、出版社、版次、数量、学号、学生姓名、联系电话、申请日期、审核回复、审核信息等操作,如图

4.5退换图书管理

在退换图书管理页面中可以查看图书编号、图书名称、作者、出版社、版次、数量、学号、退换类型、退换原因、日期、审核回复、审核状态、审核等内容,并且根据需要对己有退换图书管理进行详情,修改或删除等详细操作,如图

4.6管理员管理

在管理员管理页面中可以查看用户名、密码、角色等内容,并且根据需要对已有管理员管理进行详情,修改或删除等详细操作,如图

五、学生功能模块

学生登录进入图书个性化推荐系统可以查看首页、个人中心、图书预约管理、退换图书管理、我的收藏管理等内容。

5.1个人信息

在个人信息页面中通过填写学号、密码、学生姓名、性别、出生日期、联系电话、班级等信息,还可以根据需要对个人信息进行修改等操作、如图

5.2图书预约管理

在图书预约管理页面中可以查看图书编号、图书名称、图书类别、作者、出版社、版次、数量、学号、学生姓名、联系电话、申请日期、审核回复、审核状态等信息内容,并且根据需要对已有图书预约管理进行详情、退换或删除等其他详细操作,如图

六、部分核心代码

/*** 上传文件映射表*/
@RestController
@RequestMapping("file")
@SuppressWarnings({"unchecked","rawtypes"})
public class FileController{@Autowiredprivate ConfigService configService;/*** 上传文件*/@RequestMapping("/upload")public R upload(@RequestParam("file") MultipartFile file,String type) throws Exception {if (file.isEmpty()) {throw new EIException("上传文件不能为空");}String fileExt = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")+1);File path = new File(ResourceUtils.getURL("classpath:static").getPath());if(!path.exists()) {path = new File("");}File upload = new File(path.getAbsolutePath(),"/upload/");if(!upload.exists()) {upload.mkdirs();}String fileName = new Date().getTime()+"."+fileExt;File dest = new File(upload.getAbsolutePath()+"/"+fileName);file.transferTo(dest);/*** 如果使用idea或者eclipse重启项目,发现之前上传的图片或者文件丢失,将下面一行代码注释打开* 请将以下的"D:\\springbootq33sd\\src\\main\\resources\\static\\upload"替换成你本地项目的upload路径,* 并且项目路径不能存在中文、空格等特殊字符*/
//		FileUtils.copyFile(dest, new File("D:\\springbootq33sd\\src\\main\\resources\\static\\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);}/*** 下载文件*/@IgnoreAuth@RequestMapping("/download")public ResponseEntity<byte[]> download(@RequestParam String fileName) {try {File path = new File(ResourceUtils.getURL("classpath:static").getPath());if(!path.exists()) {path = new File("");}File upload = new File(path.getAbsolutePath(),"/upload/");if(!upload.exists()) {upload.mkdirs();}File file = new File(upload.getAbsolutePath()+"/"+fileName);if(file.exists()){/*if(!fileService.canRead(file, SessionManager.getSessionUser())){getResponse().sendError(403);}*/HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);    headers.setContentDispositionFormData("attachment", fileName);    return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);}} catch (IOException e) {e.printStackTrace();}return new ResponseEntity<byte[]>(HttpStatus.INTERNAL_SERVER_ERROR);}}
RestController
@RequestMapping("/kechengchengji")
public class KechengchengjiController {@Autowiredprivate KechengchengjiService kechengchengjiService;/*** 后端列表*/@RequestMapping("/page")public R page(@RequestParam Map<String, Object> params,KechengchengjiEntity kechengchengji,HttpServletRequest request){String tableName = request.getSession().getAttribute("tableName").toString();if(tableName.equals("jiaoshi")) {kechengchengji.setJiaoshizhanghao((String)request.getSession().getAttribute("username"));}if(tableName.equals("xuesheng")) {kechengchengji.setXuehao((String)request.getSession().getAttribute("username"));}EntityWrapper<KechengchengjiEntity> ew = new EntityWrapper<KechengchengjiEntity>();PageUtils page = kechengchengjiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, kechengchengji), params), params));return R.ok().put("data", page);}/*** 前端列表*/@IgnoreAuth@RequestMapping("/list")public R list(@RequestParam Map<String, Object> params,KechengchengjiEntity kechengchengji, HttpServletRequest request){EntityWrapper<KechengchengjiEntity> ew = new EntityWrapper<KechengchengjiEntity>();PageUtils page = kechengchengjiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, kechengchengji), params), params));return R.ok().put("data", page);}/*** 列表*/@RequestMapping("/lists")public R list( KechengchengjiEntity kechengchengji){EntityWrapper<KechengchengjiEntity> ew = new EntityWrapper<KechengchengjiEntity>();ew.allEq(MPUtil.allEQMapPre( kechengchengji, "kechengchengji")); return R.ok().put("data", kechengchengjiService.selectListView(ew));}/*** 查询*/@RequestMapping("/query")public R query(KechengchengjiEntity kechengchengji){EntityWrapper< KechengchengjiEntity> ew = new EntityWrapper< KechengchengjiEntity>();ew.allEq(MPUtil.allEQMapPre( kechengchengji, "kechengchengji")); KechengchengjiView kechengchengjiView =  kechengchengjiService.selectView(ew);return R.ok("查询课程成绩成功").put("data", kechengchengjiView);}/*** 后端详情*/@RequestMapping("/info/{id}")public R info(@PathVariable("id") Long id){KechengchengjiEntity kechengchengji = kechengchengjiService.selectById(id);return R.ok().put("data", kechengchengji);}/*** 前端详情*/@IgnoreAuth@RequestMapping("/detail/{id}")public R detail(@PathVariable("id") Long id){KechengchengjiEntity kechengchengji = kechengchengjiService.selectById(id);return R.ok().put("data", kechengchengji);}/*** 后端保存*/@RequestMapping("/save")public R save(@RequestBody KechengchengjiEntity kechengchengji, HttpServletRequest request){kechengchengji.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());//ValidatorUtils.validateEntity(kechengchengji);kechengchengjiService.insert(kechengchengji);return R.ok();}/*** 前端保存*/@RequestMapping("/add")public R add(@RequestBody KechengchengjiEntity kechengchengji, HttpServletRequest request){kechengchengji.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());//ValidatorUtils.validateEntity(kechengchengji);kechengchengjiService.insert(kechengchengji);return R.ok();}/*** 修改*/@RequestMapping("/update")public R update(@RequestBody KechengchengjiEntity kechengchengji, HttpServletRequest request){//ValidatorUtils.validateEntity(kechengchengji);kechengchengjiService.updateById(kechengchengji);//全部更新return R.ok();}/*** 删除*/@RequestMapping("/delete")public R delete(@RequestBody Long[] ids){kechengchengjiService.deleteBatchIds(Arrays.asList(ids));return R.ok();}/*** 提醒接口*/@RequestMapping("/remind/{columnName}/{type}")public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, @PathVariable("type") String type,@RequestParam Map<String, Object> map) {map.put("column", columnName);map.put("type", type);if(type.equals("2")) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Calendar c = Calendar.getInstance();Date remindStartDate = null;Date remindEndDate = null;if(map.get("remindstart")!=null) {Integer remindStart = Integer.parseInt(map.get("remindstart").toString());c.setTime(new Date()); c.add(Calendar.DAY_OF_MONTH,remindStart);remindStartDate = c.getTime();map.put("remindstart", sdf.format(remindStartDate));}if(map.get("remindend")!=null) {Integer remindEnd = Integer.parseInt(map.get("remindend").toString());c.setTime(new Date());c.add(Calendar.DAY_OF_MONTH,remindEnd);remindEndDate = c.getTime();map.put("remindend", sdf.format(remindEndDate));}}Wrapper<KechengchengjiEntity> wrapper = new EntityWrapper<KechengchengjiEntity>();if(map.get("remindstart")!=null) {wrapper.ge(columnName, map.get("remindstart"));}if(map.get("remindend")!=null) {wrapper.le(columnName, map.get("remindend"));}String tableName = request.getSession().getAttribute("tableName").toString();if(tableName.equals("jiaoshi")) {wrapper.eq("jiaoshizhanghao", (String)request.getSession().getAttribute("username"));}if(tableName.equals("xuesheng")) {wrapper.eq("xuehao", (String)request.getSession().getAttribute("username"));}int count = kechengchengjiService.selectCount(wrapper);return R.ok().put("count", count);}}

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

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

PS 2020版本放大工具无法鼠标左右拖动精细放大的解决方案

今天突然发现PS的缩放工具没办法通过左右拖动细微缩放了&#xff0c;正常情况下&#xff0c;只需要重新打开选项栏中的“细微缩放”选项即可&#xff08;下图&#xff09;。 但是我这次细微缩放却不可选&#xff0c;在网上找到的解决方案是&#xff1a;“编辑”-“首选项”-“性…

PS放大图片某区域

PS放大图片某区域 打开图片用快捷键U(画矩形)在图片上画一个虚线矩形。用快捷键M(选择框)在对应的矩形框内选择ctrlC,ctrlV 粘贴框选的区域&#xff0c;同时此时会生成一个新的图层&#xff0c;就是刚刚复制的那块区域&#xff08;注&#xff0c;这里复制的图层&#xff0c;默…

ps放大镜

ps放大镜 今天来教教大家如何做ps里的放大镜先看圆图。 1.我们需要拉一张图片进来&#xff0c;然后把图片复制一张&#xff0c;然后把背景图锁上&#xff0c;在把图层进行模糊化。点击滤镜 &#xff08;模糊 高斯模糊&#xff09;然后在把半径20。 点击锁定。 2.我们用椭圆工…

使用PS制作放大镜效果

&#xff08;撰写时间&#xff1a;2019年5月7日 作者&#xff1a;陈景鸿&#xff09; PS的的放大镜也就是将模糊的东西能够看得清楚&#xff0c;也是一款神奇的东西&#xff0c;制作放大镜有两种效果&#xff0c;一种是将图片发大&#xff0c;一种是将图片变得清晰&#xff0c…

ps 做放大镜效果

1 随意打出你想做出效果的文字或应用图片 2.复制一层文字图层&#xff0c;将复制的文字图层栅格化后用椭圆选框工具在你想要放大的地方画一个正圆 3.滤镜——扭曲——球面化 参数可以根据自己调节 4.再新建一个图层&#xff0c;在原来的正圆选框上 编辑 ——描边&#xff0c;…

PS制作局部放大

PS制作局部放大 开发工具与关键技术&#xff1a;Photoshop 创建剪贴蒙版 作者&#xff1a;伊利奶盒 撰写时间&#xff1a;2021年4月28日首先&#xff0c;我们在PS中导入一张图片。 然后CtrlJ复制一份背景图层。 用直线工具制作一条直线&#xff08;粗细可根据实际情况进行调节…

【Java IO流】字符集使用详解

文章目录前言ASCIIGBKUnicode为什么会出现乱码前言 上一节关于字节流的文章中&#xff0c;在使用字节流读取本地文件中的数据时&#xff0c;文件中只存放了英文&#xff0c;而并没有存放中文数据。我们还提到了不建议使用字节流读取纯文本文件的数据&#xff0c;否则会出现乱码…

数字图像处理---空间滤波基础

空间滤波概念 滤波&#xff1a;通过修改或者抑制给定图像的特定频率分量&#xff0c;常见有低通滤波器与高通滤波器。空间滤波&#xff1a;将像素值使用该像素值及其邻域的值进行替换&#xff0c;替换方式有线性与非线性两种&#xff0c;即线性滤波器与非线性滤波器。 线性滤…

MIT开发出高效「查询方法」,以寻找黑盒机器学习分类器的对抗样本

原文来源&#xff1a;arXiv、LabSix作者&#xff1a;Andrew Ilyas、 Logan Engstrom、 Anish Athalye、Jessy Lin「雷克世界」编译&#xff1a;嗯~阿童木呀、哆啦A亮对真实世界AI的局部信息攻击我们已经开发出一种查询有效的方法&#xff0c;以寻找用于黑盒机器学习分类器的对抗…

跳槽季 | 普通程序员到底如何转行人工智能?

作为一名软件工程师&#xff0c;我们应该活到老学到老&#xff0c;时刻与不断发展的框架、标准和范式保持同步。同时&#xff0c;还要能活学活用&#xff0c;在工作中使用最合适的工具&#xff0c;以提高工作效率。随着机器学习在越来越多的应用程序中寻得了一席之地&#xff0…

【数字化】赵国栋:数字经济各要素的重构和演变

中关村大数据产业联盟秘书长 赵国栋大家好&#xff0c;很高兴跟大家做本次交流。我2010年加入证券分析师的队伍&#xff0c;15年离开&#xff0c;也算资本市场的老人了&#xff0c;今天跟老朋友见面交流&#xff0c;感到非常亲切。接下来我将以“数字经济各要素的重构和演变”为…

python-某旗小说app的学习过程

第一步&#xff0c;去豌豆荚网站下载该app&#xff0c;手机连接上电脑使用adb shell install apk进行安装&#xff0c;charles抓包看看都是什么&#xff0c;抓包结果如图&#xff1a; 第二步&#xff0c;使用python requests 构建请求&#xff0c;测试字段&#xff0c;发现该ap…

android新闻应用、应用锁、小说阅读、短视频APP等源码

Android精选源码 android应用锁源码 android新闻日报源码 仿锤子官网首页海报3D触摸布局 android工艺灯控制器源码 Txt阅读器快速集成库 KotlinMVPRretrofitRxJavaGlide 等架构实现的短视频类的 APP android实用的休闲类、新闻、视频、技术源码 android文件与目录的选择器源码 …

某猫小说sign简单分析

1、前言 这次案例是某猫免费小说&#xff08;ps:本篇分析的APP版本为4.0.0) 2、APP抓包分析 用Fiddler对目标app进行抓包&#xff0c;抓包结果如下&#xff1a; 主要找sign的生成过程&#xff0c;打开jadx搜索代码"sign"&#xff0c;把可能会生成sign的方法都给hoo…

使用Python爬取喜欢的小说后在本地存储为txt文件

使用Python爬取喜欢的小说后在本地存储为txt文件 最近在看小说时因为是在手机上在线观看&#xff0c;百度了半天也没找到可以下载的txt全集&#xff0c;实在没办法只好借助python来帮我完成需求&#xff01; 准备爬取的小说名称 萧阳叶云舒 目标小说网站 https://www.ly990.co…

Python3网络爬虫(一)-小说爬取(以笔趣看网站小说为例)

一 工具准备 我用的是AnacondaPyCharm的组合 如何安装使用看这篇教程就够了&#xff1a; URL: https://blog.csdn.net/yggaoeecs/article/details/78378938 非常详细。 二 简单爬取 1 安装requests及BeautifulSoup库 在pyCharm的终端(Terminal)中输入&#xff1a; pip ins…

[oeasy]python0053_ 续行符_line_continuation_python行尾续行

续行符与三引号 回忆上次内容 上次还是转义序列 类型英文符号\abell响铃\bbackspace退格\ttab水平制表符\vvertical tab垂直制表符换行不回车\\backslash反斜杠\"double quote双引号\’single quote单引号\xhh具体字符输出(hh)16 进制对应的ascii 字符\ooo具体字符输出…

《哪吒》VS《姜子牙》,用Python对比—我发现了这个......

目录前言一、票房对比分析1.获取票房数据2.票房走势分析二、评价对比分析1.爬取影评1.1获取评论页面1.2 解析页面中的评论1.3 定义爬取函数1.4 完整代码2.词云分析2.1 完整代码2.2 结果展示前言随着国内疫情得到有效控制&#xff0c;每个地区的电影院都陆陆续续的开放了&#x…

IP概念盛行的背后:资本在狂欢,电影想哭泣 IP,英文“Intellectual Property”的缩写,直译为“知识产权”。它的存在方式很多元,可以是一个故事,也可以是某一个形象,运营成功的IP可

IP概念盛行的背后&#xff1a;资本在狂欢&#xff0c;电影想哭泣 IP容易拉投资、谈合作&#xff0c;甚至还能简化宣发途径&#xff0c;越来越多的人涌入了电影这个产业&#xff0c;争抢IP成为他们进入行业的最快捷的方法。IP盛行暴露出的另一个问题是国产电影原创力的匮乏。 刘…

Y9000P Ubuntu/Windows 双系统安装

一&#xff1a;配置介绍 Y9000P默认系统Win11&#xff0c;系统盘500G&#xff0c;从盘2T&#xff0c;内存32G&#xff0c;显卡3060 二&#xff1a;Windows系统分盘 系统盘&#xff08;磁盘1&#xff09;建议通过压缩卷分出300M作为Ubuntu的引导分区。 从盘&#xff08;磁盘2…