基于Java+SpringBoot+Vue前后端分离仓库管理系统设计实现
Posted java李杨勇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Java+SpringBoot+Vue前后端分离仓库管理系统设计实现相关的知识,希望对你有一定的参考价值。
博主介绍:✌全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌
🍅文末获取源码联系🍅
👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟
java项目精品实战案例《100套》https://blog.csdn.net/weixin_39709134/category_11128297.html?spm=1001.2014.3001.5482
Java微信小程序项目实战《100套》https://blog.csdn.net/weixin_39709134/category_12022111.html
目录
一、前言介绍:
1.1 项目摘要
信息内容数据从传统到当今,一直在改变,忽然互联网技术让传统信息内容管理见到划时代的黎明,由于传统信息内容管理从时效性、安全系数、可执行性等多个方面,碰到互联网时代发觉弥补了从古至今的缺陷,有效提升管理效率工作能力。在传统的管理模式中,时间越长,管理具体内容越大,需要更多人梳理数据,数据归纳查看高效率非常低,数据安全性从来不会确保安全系数。融合数据具体内容管理的缺陷,在互联网时代能够得到很好的填补。融合前沿的大数据技术,开发设计满足要求的软件,使数据具体内容管理可以最大程度地提升准确率,管理更科学便捷,不论是输入时效性、查询的时效性或是梳理总结的时效性。
仓库管理系统进行了字典管理、公告管理、老师管理、物资供应管理、物资申请管理、学生管理、等服务。设备采用关联数据库里的mysql做为全面的数据库,合理存放数据,合理备份数据,确保数据稳定性。除此之外,程序流程还具备程序流程所需要的所有功能,大大提升了实际操作安全度,使库房管理系统软件从概念迈向实际,真真正正提升了信息资源管理效率。
1.2 目的意义:
仓库管理系统的开发不但涉及到页面设计和功能分析,还涉及到数据库系统和计算机语言。针对已经毕业的学生而言,一是夯实有关专业知识;二是让学生懂得如何将基础理论知识用于具体软件的开发全过程;三是让学生明白知识是无边无际的,我们应该时时刻刻了解学无止境的精髓,让学生培养时时刻刻学习的好习惯。与此同时,大家也要相信,通过这些流程的开发,学生对专业知识的理解软件开发水平的提升会有很大帮助。
二、主要技术:
2.1 Spring Boot框架:
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
SpringBoot基于Spring4.0设计,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决。
2.2 MySQL:
为了能更容易接受MySQL数据库,下面来描述一下它的主要特征。
(1)MySQL数据库的最佳选择都是为了节约开发资产,由于MySQL的源码早已在网络上公布表明,开发者也可以根据程序开发的需求免费下载,还可以在程序中使用一些转变,能够促进开发者开发这一程序进度。
(2)SQL数据信息语言表达同样适用于MySQL
(3)MySQL不但可以适用各种编程语言,如C语言、Java语言表达及其课下接触到的php语言表达,C 语言表达等计算机语言,它能够很好的适用,而MySQL安装与使用也不挑应用服务平台。
(4)MySQL能够支持日志记录数据库,电子计算机操作系统初次组装或重装,可根据实际情况挑选组装32位或64位操作系统,二种操作系统对表文件信息适用不一样,32位操作系统最多能存放4GB表文档,64位操作系统最多能存放8TB表文档。
(5)MySQL数据库能通过GPL协议书开展个性定制,开发者必须改动数据库的源码,进而开发自已的MySQL。
2.3 Springboot
程序开发语言许多,但到现在为止,Java语言依旧是IT领域深受认同和常用的创作语言之一。因而,在挑选这一程序的创作语言时,我决定选择使用程序编写语言开展程序开发。可以这么说,通过这些年的发展趋势,Java语言不但在Web开发领域作出了杰出贡献,并且在互联网开发和android开发领域也得到广泛应用。因为Java语言具有极强的拓展性能可靠性,它已经成为大中型后端系统开发语言的最佳选择。现如今,Java语言成为了网络平台常见解决方案。
Java语言做为源码在互联网上开源系统的对象,其开发的程序不太可能直接从各个平台上运作。Java程序的运转必须在作业平台上配置其工作环境,包含数据分析软件和Java程序开发软件的安装及配置。Java程序工作环境配置在Win7、Win10或其它作业平台上,只需自然环境配置取得成功,Java程序就能运作。
三、系统设计:
3.1 系统功能设计:
仓库管理系统主要功能设计:
主要角色:用户 管理员 仓库管理员
3.2 登录流程设计:
3.3 登录时序图设计:
四、功能截图:
4.1 登录注册:
4.2 系统首页:
4.3 基础数据类型:
4.4 公告管理:
4.5 物资管理:
此页面让管理员管理物资的数据,物资管理页面见下图。此页面主要实现物资的增加、修改、删除、查看的功能
4.6 物资类型统计
4.7 物资申请管理
用户登录可以新增物资申请
用户申请之后-由仓库管理员审核申请-审核通过后用户申请成功-最后由超级管理员默认物资是否归还
4.8 用户管理:
五、部分数据设计:
在规划这一部分以前,首先要了解和掌握数据类型和每一个数据类型长度范畴,毕竟在一个特定数据表中,为了更好地了解,这里有一个典型的例子。比如,用户信息内容表中字段名是用户实体的属性。这时,必须设定字段名的数据类型和字段长度,并配有外键约束做为用户情况表的唯一鉴别。这都是数据库表结构设计方案要完成内容。依据仓储管理系统的功能分析和概念模型设计规定,显示设备的数据表构造。
(1)下图是公告实体和其具备的属性。
公告实体属性图
(2)下图是物资实体和其具备的属性。
物资实体属性图
(3)下图是物资申请实体和其具备的属性。
图物资申请实体属性
六、代码参考
/**
* 上传文件映射表
*/
@RestController
@RequestMapping("file")
@SuppressWarnings("unchecked","rawtypes")
public class FileController
@Autowired
private 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);
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);
七、项目总结:
仓库管理系统的开发制作,从题目确定到成品完成,自己投入的精力与心血是非常多的。从仓库管理系统的前台页面实现,到仓库管理系统的后台代码的编辑,我用到的软件包括了数据库软件MySQL,Java开发工具IDEA,办公软件Office,浏览器软件Fireworks,图像处理软件Photoshop等,这也是我第一次使用Java语言,开发的这个比较简单的仓库管理系统。
仓库管理系统开发过程中,自己之前觉得比较抽象的许多门课程,例如数据库原理,软件工程,动态网站开发等课程开始变得很清晰,只有自己独立开发程序,才会觉得这些开发类的课程在实践中具有的重要作用。为了让自己设计的作品能够顺利的完成,我把所学知识全部运用在程序的开发流程中,包括了程序的需求分析环节,程序的编码环节,程序的测试环节等,让程序软件在开发周期内完成制作,并能够保证程序质量达标,力求程序开发流程规范化,程序对应的配套文档标准化。
本次开发的系统整体界面还是比较清晰简明,功能上面考虑得比较全,几乎可以满足用户使用要求。尽管我对这次的毕设付出了许多的努力,但是程序还是有很多不足的地方,系统界面整体感觉还行,但是字体字号的选取上面还是有些不符合现实审美,在程序的CSS样式编码上面,我还有许多不熟悉的地方,虽然经过反复的测试与调试选中了现在这样的程序界面,但是我还是明显感觉到自己对一些常用CSS样式的不熟悉,编码过程中,我还要多次进行资料查看才知道。另外我编写的代码写作不是很规范,可读性比较差,幸运的是,我最终还是实现了系统中所要求的功能。
仓库管理系统现已完成了开发,除了基本功能可以符合用户需求外,在页面设计层面上没有融入更多的设计元素,需要从美学角度进行优化,另外在程序的代码层面,也有许多重合部分,需要进行整理归类,让代码变得更加的简洁。
实践出真知,但是知识也是通过实践变得更加深刻,这次作品制作,让自己的专业知识水平与解决问题的能力得到了提高。也让自己更加明白活到老学到老的真正含义。
总的说来,这次编写毕业设计作品,我真正锻炼了自己的实际操作能力,以前只知道理论知识,现在通过实践,我对理论知识的认识变得更加深刻,由于编写程序时间比较短暂,程序开发期间遇到过很多坎坷,但最后都通过老师还有同学帮忙解决了,可以说这次的毕设作品进展得还算顺利。
八、源码获取:
大家点赞、收藏、关注、评论啦 、查看👇🏻获取联系方式👇🏻
精彩专栏推荐订阅:在下方专栏👇🏻
基于Springboot+vue实现前后端分离二手图书交易
作者主页:编程指南针
作者简介:Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师
主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助
文末获取源码
项目编号:KS-029
一,项目简介
本项目基于Springboot+vue实现的前后端分离的二手图书交易系统,实现的功能较为简单。用户登陆系统后可以进行图书的发布和浏览,并可以进行全文检索,别的用户可以查看详情联系发布人进行线下交易。
二,环境介绍
语言环境:Java: jdk1.8
数据库:Mysql: mysql5.7
应用服务器:Tomcat: tomcat8.5.31
开发工具:IDEA或eclipse
三,系统展示
用户登陆
首页展示
图书列表
图书详情
个人中心:可以发布图书和管理己发布的图片
添加图书
修改密码
四,核心代码展示
package com.znz.backend.wj.contorller;
import com.znz.backend.result.Result;
import com.znz.backend.wj.Service.BookService;
import com.znz.backend.wj.bean.Book;
import net.coobird.thumbnailator.Thumbnails;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Random;
/**
* @author znz
* @create 2020/02/07/10:52
*/
@RestController
public class LibraryController
@Resource(name="bookService")
private BookService bookService;
@Value("$fileupload.path")
private String path;
//返回所有的图书
@CrossOrigin
@GetMapping("api/books")
public List<Book>findAll() throws Exception
return bookService.findAll();
//根据用户账号返回所有的书
@CrossOrigin
@PostMapping("api/booksByUid")
public List<Book>findAllByUid(@RequestBody Book book)
return bookService.findAllByUid(book.getUid());
//根据种类查询图书
@CrossOrigin
@GetMapping("api/categories/cid/books")
public List<Book> listByCategory(@PathVariable("cid") String cid) throws Exception
if (!cid.equals("0"))
return bookService.findAllByCategory(cid);
else
return findAll();
//根据种类和用户名查询用户添加的图书
@CrossOrigin
@PostMapping("api/categories/uid/UserBooks")
public List<Book> listByCategoryAndUid(@RequestBody Book book)
System.out.println(book);
if (!book.getCid().equals("0"))
return bookService.findAllByCategoryAndUid(book.getCid(),book.getUid());
else
return bookService.findAllByUid(book.getUid());
//根据id删除图书
@CrossOrigin
@PostMapping("api/delete")
public Result deleteBookById(@RequestBody Book book)
int num=bookService.deleteBookById(book.getId());
if(num==0)
return new Result(400);
else
return new Result(200);
//根据id和用户编号删除图书,并删除本地服务器存储的图片
@PostMapping("api/deleteById")
@CrossOrigin
public Result deleteBookByIdAndUid(@RequestBody Book book)
int num=bookService.deleteBookByIdAndUid(book);
if(num==0)
return new Result(400);
else
if(!book.getCover().equals(""))
String cover=book.getCover().split("/api/file/")[1];
deleteImg(cover);
if(!book.getImg_1().equals(""))
String img_1=book.getImg_1().split("/api/file/")[1];
deleteImg(img_1);
if(!book.getImg_2().equals(""))
String img_2=book.getImg_2().split("/api/file/")[1];
deleteImg(img_2);
if(!book.getImg_3().equals(""))
String img_3=book.getImg_3().split("/api/file/")[1];
deleteImg(img_3);
if(!book.getImg_4().equals(""))
String img_4=book.getImg_4().split("/api/file/")[1];
deleteImg(img_4);
if(!book.getImg_5().equals(""))
String img_5=book.getImg_5().split("/api/file/")[1];
deleteImg(img_5);
return new Result(200);
@CrossOrigin
public void deleteImg(String imgName)
String imgUrl="/home/Youth-imgs/"+imgName;
File img=new File(imgUrl);
img.delete();
//添加一本图书
@CrossOrigin
@PostMapping("api/insert")
public Result insertBook(@RequestBody Book book)
System.out.println(book);
if(bookService.insertBook(book)==0)
return new Result(400);
else
return new Result(200);
//根据书名查找图书
//使用form表单传递数据
@CrossOrigin
@PostMapping("api/search")
public List<Book> searchBooksByTitle(@RequestParam Map<String,Object> keywords, HttpSession session)
return bookService.finAllByTitle((String)keywords.get("keywords"));
//上传图片
@CrossOrigin
@PostMapping("api/uploadImg")
public String coversUpload(MultipartFile file) throws Exception
//查看图片类型
String type=file.getContentType().split("/")[1];
if(type==null||file.getSize()>1048576)
return null;
String folder = path;
File imageFolder = new File(folder);
File f = new File(imageFolder, getRandomString(10) + file.getOriginalFilename()
.substring(file.getOriginalFilename().length() - 4));
if (!f.getParentFile().exists())
//如果不存在文件则创建文件夹
f.getParentFile().mkdirs();
try
//存入图片
file.transferTo(f);
//对存入的图片进行压缩,并转换为jpeg格式
Thumbnails.of(f)
.outputFormat("jpg")
.scale(0.5f)//图片比例压缩
.outputQuality(0.5f)//图片清晰度压缩
.toFile(f.getPath().split("\\\\.")[0]+".jpg");
if(!type.equals("jpeg"))
//删除图片
f.delete();
String imgURL = "http://localhost:8443/api/file/" + f.getName().split("\\\\.")[0]+".jpg";
return imgURL;
catch (IOException e)
e.printStackTrace();
return "";
//删除图片
@CrossOrigin
@PostMapping("api/deleteImg")
public void deleteImg(@RequestParam Map<String,Object> requestMap)
String imgName=requestMap.get("imgUrl").toString().split("/api/file/")[1];
deleteImg(imgName);
//生成length个随机数组成的字符串
public String getRandomString(int length)
String base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random random = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length; i++)
int number = random.nextInt(base.length());
sb.append(base.charAt(number));
return sb.toString();
package com.znz.backend.wj.contorller;
/**
* @author znz
* @create 2020/01/27/16:00
*/
import com.znz.backend.result.Result;
import com.znz.backend.wj.Service.UserService;
import com.znz.backend.wj.bean.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.Map;
@Controller
public class UserController
//Mybatis操作数据库
@Resource(name = "userService")
private UserService userService;
//登录账号
//注解@CrossOrigin解决跨域问题
//@CrossOrigin
@CrossOrigin
@PostMapping(value = "api/login")
@ResponseBody
public String login(@RequestBody User requestUser)
return userService.login(requestUser);
//注册账号
// @PostMapping(value="api/register")
// @ResponseBody
// public Boolean register(@RequestBody User requestUser)
// return userService.register(requestUser);
//
//修改密码
@PostMapping(value = "api/changePassword")
@ResponseBody
public Result ChangePassword(@RequestParam Map<String, Object> requestMap)
return userService.changePassword(requestMap);
//查找账户是否存在
@PostMapping(value = "api/selectUser")
@ResponseBody
public Boolean selectUser(@RequestParam Map<String, Object> requestMap)
return userService.selectUser(requestMap);
package com.znz.backend.wj.dao;
import com.znz.backend.wj.bean.Book;
import com.znz.backend.wj.bean.Category;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.mapping.FetchType;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author znz
* @create 2020/02/06/23:21
*/
@Mapper
@Repository(value = "bookMapper")
public interface BookMapper
//根据书的种类找到这一类型的所有书
@Select("select * from book\\n" +
"where book.cid=#_parameter")
List<Book> findAllByCategory(String cid);
根据书的种类和用户账户找到这一类型的所有书
@Select("Select * from book where book.cid=#param1 and book.uid=#param2")
List<Book>findAllByCategoryAndUid(String cid,String uid);
//根据书名模糊找到书
@Select("select * from book\\n" +
"where book.title like '%$_parameter%'")
List<Book> findAllByTitle(String title);
//找到所有的书
@Select("select * from book")
List<Book> findAllBooks();
//根据用户账号返回所有的书
@Select("Select * from book where uid=#_parameter")
List<Book> findAllBooksByUid(String uid);
//根据id删除书籍
@Delete("delete from book where id=#id")
int deleteBookById(int id);
//添加图书
@Insert("insert into znz.book(cover,title,author,date,price,newOld,contact,phone,qq,weChat,img_1,img_2,img_3,img_4,img_5,abs,cid,uid)\\n" +
"values(#param1,#param2,#param3,#param4,#param5,#param6,#param7,#param8,#param9,#param10,#param11,#param12,#param13,#param14, #param15,#param16,#param17,#param18)")
int insertBook(String cover,String title,String author,String date,String price,String newOld,String contact,String phone,
String qq,String weChat,String img_1,String img_2,String img_3,String img_4,String img_5,String abs,
String cid,String uid);
//根据用户账号和书的id删除书籍
@Delete("delete from book where id=#param1 and uid=#param2")
int deleteBookByIdAndUid(int id,String uid);
package com.znz.backend.wj.Service;
import com.znz.backend.wj.bean.Book;
import com.znz.backend.wj.bean.Category;
import com.znz.backend.wj.dao.BookMapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* @author znz
* @create 2020/02/07/10:38
*/
@Service(value = "bookService")
public class BookService
@Resource(name = "bookMapper")
private BookMapper bookMapper;
@Resource(name = "categoryService")
private CategoryService categoryService;
/*******查询******/
//返回所有的图书
public List<Book> findAll()
return bookMapper.findAllBooks();
//根据用户账号返回所有的书
public List<Book> findAllByUid(String uid)
return bookMapper.findAllBooksByUid(uid);
//根据书的种类返回所有的书
public List<Book> findAllByCategory(String cid)
return bookMapper.findAllByCategory(cid);
//根据书的种类和用户账户返回所有的书
public List<Book> findAllByCategoryAndUid(String cid,String uid)
return bookMapper.findAllByCategoryAndUid(cid,uid);
//根据书名找到所有的数据
public List<Book> finAllByTitle(String title)
return bookMapper.findAllByTitle(title);
//根据id删除图书
public int deleteBookById(int id)
return bookMapper.deleteBookById(id);
//添加一本书
public int insertBook(Book book)
return bookMapper.insertBook(book.getCover(), book.getTitle(), book.getAuthor(), book.getDate(), book.getPrice(), book.getNewOld(), book.getContact()
, book.getPhone(), book.getQq(), book.getWeChat(), book.getImg_1(), book.getImg_2(), book.getImg_3(), book.getImg_4(), book.getImg_5(), book.getAbs(), book.getCid(), book.getUid());
//根据用户账号和书的id删除书籍
public int deleteBookByIdAndUid(Book book)
return bookMapper.deleteBookByIdAndUid(book.getId(), book.getUid());
五,项目总结
本项目结构简单,代码简洁,比较适合做课程设计或期未作业使用,也可以在这个基础上进行功能扩展和增加,实现一个比较完整的毕业设计系统
以上是关于基于Java+SpringBoot+Vue前后端分离仓库管理系统设计实现的主要内容,如果未能解决你的问题,请参考以下文章
Java+MySQL基于Springboot+vue的酒店民宿管理系统前后台#毕业设计