✌全网粉丝20W+,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌
🍅文末获取项目下载方式🍅
一、项目背景介绍:
随着信息技术的快速发展,仓库管理系统成为了现代企业不可或缺的重要组成部分。SpringBoot和Thymeleaf作为流行的Java开发框架和模板引擎,提供了快速、高效的Web应用开发解决方案。基于SpringBoot+Thymeleaf的仓库管理系统可以利用其丰富的功能和灵活的扩展性,实现仓库的库存管理、进销存等核心业务功能,并提供友好的用户界面。本研究旨在探索基于该技术组合的仓库管理系统在实际应用中的效果和潜在优势,为企业提供更便捷、高效的仓库管理解决方案。
二、项目技术简介:
- JAVA:Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
- SpringBoot:Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
- Mybatis-Plus:MyBatis-Plus(简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为 简化开发、提高效率而生。
- Thymeleaf:thymeleaf是一个XML/XHTML/HTML5模板引擎,可用于Web与非Web环境中的应用开发。它是一个开源的Java库,基于Apache License 2.0许可,由Daniel Fernández创建,该作者还是Java加密库Jasypt的作者。
Thymeleaf提供了一个用于整合Spring MVC的可选模块,在应用开发中,你可以使用Thymeleaf来完全代替JSP或其他模板引擎,如Velocity、FreeMarker等。Thymeleaf的主要目标在于提供一种可被浏览器正确显示的、格式良好的模板创建方式,因此也可以用作静态建模。你可以使用它创建经过验证的XML与HTML模板。相对于编写逻辑或代码,开发者只需将标签属性添加到模板中即可。接下来,这些标签属性就会在DOM(文档对象模型)上执行预先制定好的逻辑。
三、系统功能模块介绍:
四、数据库设计:
1:bus_customer(bus_customer)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | int | NULL | |
customername | varchar | NULL | |
zip | varchar | NULL | |
address | varchar | NULL | |
telephone | varchar | NULL | |
connectionperson | varchar | NULL | |
phone | varchar | NULL | |
bank | varchar | NULL | |
account | varchar | NULL | |
varchar | NULL | ||
fax | varchar | NULL | |
available | int | NULL |
2:bus_goods(bus_goods)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | int | NULL | |
goodsname | varchar | NULL | |
produceplace | varchar | NULL | |
size | varchar | NULL | |
goodspackage | varchar | NULL | |
productcode | varchar | NULL | |
promitcode | varchar | NULL | |
description | varchar | NULL | |
price | double | NULL | |
number | int | NULL | |
dangernum | int | NULL | |
goodsimg | varchar | NULL | |
available | int | NULL | |
providerid | int | NULL |
3:bus_inport(bus_inport)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | int | NULL | |
paytype | varchar | NULL | |
inporttime | datetime | NULL | |
operateperson | varchar | NULL | |
number | int | NULL | |
remark | varchar | NULL | |
inportprice | double | NULL | |
providerid | int | NULL | |
goodsid | int | NULL |
4:bus_outport(bus_outport)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | int | NULL | |
providerid | int | NULL | |
paytype | varchar | NULL | |
outputtime | datetime | NULL | |
operateperson | varchar | NULL | |
outportprice | double | NULL | |
number | int | NULL | |
remark | varchar | NULL | |
goodsid | int | NULL |
5:bus_provider(bus_provider)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | int | NULL | |
providername | varchar | NULL | |
zip | varchar | NULL | |
address | varchar | NULL | |
telephone | varchar | NULL | |
connectionperson | varchar | NULL | |
phone | varchar | NULL | |
bank | varchar | NULL | |
account | varchar | NULL | |
varchar | NULL | ||
fax | varchar | NULL | |
available | int | NULL |
6:bus_sales(bus_sales)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | int | NULL | |
customerid | int | NULL | |
paytype | varchar | NULL | |
salestime | datetime | NULL | |
operateperson | varchar | NULL | |
number | int | NULL | |
remark | varchar | NULL | |
saleprice | decimal | NULL | |
goodsid | int | NULL |
7:bus_salesback(bus_salesback)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | int | NULL | |
customerid | int | NULL | |
paytype | varchar | NULL | |
salesbacktime | datetime | NULL | |
salebackprice | double | NULL | |
operateperson | varchar | NULL | |
number | int | NULL | |
remark | varchar | NULL | |
goodsid | int | NULL |
8:sys_dept(sys_dept)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | int | NULL | |
pid | int | NULL | |
title | varchar | NULL | |
open | int | NULL | |
remark | varchar | NULL | |
address | varchar | NULL | |
available | int | NULL | 状态【0不可用1可用】 |
ordernum | int | NULL | 排序码【为了调事显示顺序】 |
createtime | datetime | NULL |
9:sys_loginfo(sys_loginfo)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | int | NULL | |
loginname | varchar | NULL | |
loginip | varchar | NULL | |
logintime | datetime | NULL |
10:sys_notice(sys_notice)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | int | NULL | |
title | varchar | NULL | |
content | text | NULL | |
createtime | datetime | NULL | |
opername | varchar | NULL |
11:sys_permission(sys_permission)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | int | NULL | |
pid | int | NULL | |
type | varchar | NULL | 权限类型[menu/permission] |
title | varchar | NULL | |
percode | varchar | NULL | 权限编码[只有type= permission才有 user:view] |
icon | varchar | NULL | |
href | varchar | NULL | |
target | varchar | NULL | |
open | int | NULL | |
ordernum | int | NULL | |
available | int | NULL | 状态【0不可用1可用】 |
12:sys_role(sys_role)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | int | NULL | |
name | varchar | NULL | |
remark | varchar | NULL | |
available | int | NULL | |
createtime | datetime | NULL |
13:sys_role_permission(sys_role_permission)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
rid | int | NULL | |
pid | int | NULL |
14:sys_role_user(sys_role_user)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
rid | int | NULL | |
uid | int | NULL |
15:sys_user(sys_user)
字段名 | 类型 | 默认值 | 列注释 |
---|---|---|---|
id | int | NULL | |
name | varchar | NULL | |
loginname | varchar | NULL | |
address | varchar | NULL | |
sex | int | NULL | |
remark | varchar | NULL | |
pwd | varchar | NULL | |
deptid | int | NULL | |
hiredate | datetime | NULL | |
mgr | int | NULL | |
available | int | NULL | |
ordernum | int | NULL | |
type | int | NULL | 用户类型[0超级管理员1,管理员,2普通用户] |
imgpath | varchar | NULL | 头像地址 |
salt | varchar | NULL |
五、功能模块:
-
后台首页:最新文章、实时时间显示
-
登录:
-
基础管理:客户管理、供应商管理、商品管理
-
进货管理:商品进退货、商品退货查询
-
系统管理:系统管理、菜单管理、权限管理、角色管理、用户管理
-
其他管理:登录日志、系统公告、图标管理、缓存管理
-
其他功能:清除缓存、锁屏、个人信息修改、修改密码
六、代码示例:
/**
* 生成验证码
*/
@GetMapping("/captchaImage")
public AjaxResult getCode(HttpServletResponse response) throws IOException
{
AjaxResult ajax = AjaxResult.success();
boolean captchaEnabled = configService.selectCaptchaEnabled();
ajax.put("captchaEnabled", captchaEnabled);
if (!captchaEnabled)
{
return ajax;
}
// 保存验证码信息
String uuid = IdUtils.simpleUUID();
String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid;
String capStr = null, code = null;
BufferedImage image = null;
// 生成验证码
String captchaType = RuoYiConfig.getCaptchaType();
if ("math".equals(captchaType))
{
String capText = captchaProducerMath.createText();
capStr = capText.substring(0, capText.lastIndexOf("@"));
code = capText.substring(capText.lastIndexOf("@") + 1);
image = captchaProducerMath.createImage(capStr);
}
else if ("char".equals(captchaType))
{
capStr = code = captchaProducer.createText();
image = captchaProducer.createImage(capStr);
}
redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
// 转换流信息写出
FastByteArrayOutputStream os = new FastByteArrayOutputStream();
try
{
ImageIO.write(image, "jpg", os);
}
catch (IOException e)
{
return AjaxResult.error(e.getMessage());
}
ajax.put("uuid", uuid);
ajax.put("img", Base64.encode(os.toByteArray()));
return ajax;
}
/**
* 通用的本地文件上传
*
* @param multipartFile 文件对象
* @return 文件访问链接URL
*/
@PostMapping("/file")
public SimpleResponse uploadImg(@RequestParam("file") MultipartFile file) {
// 文件后缀
String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);
File savePathFile = new File(newTomcatFolder);
if (!savePathFile.exists()) {
// 若不存在该目录,则创建目录
savePathFile.mkdir();
}
// 通过UUID生成唯一文件名
String filename = UUID.randomUUID() + "." + suffix;
try {
// 将文件保存指定目录
file.transferTo(new File(newTomcatFolder + filename));
} catch (Exception e) {
e.printStackTrace();
return SimpleResponse.error("保存文件异常");
}
// 返回访问链接
return SimpleResponse.success(newTomcatHost + filename);
}
@PostMapping("/login")
public ReturnMsg manageLogin(@RequestBody Map<String, String> param) {
if (StrUtil.isEmpty(param.get("username")) || StrUtil.isEmpty(param.get("password"))) {
return ReturnMsg.error("用户名或密码错误!");
}
ManageDTO manageDTO = new ManageDTO();
manageDTO.setUserName(param.get("username"));
manageDTO.setPassWord(param.get("password"));
QueryWrapper<ManageDTO> manageDTOQueryWrapper = new QueryWrapper<>(manageDTO);
manageDTOQueryWrapper.last("limit 1");
ManageDTO adminDTOS = manageService.getOne(manageDTOQueryWrapper);
if (adminDTOS == null) return ReturnMsg.error("用户名或密码错误!");
Map<String, Object> map = new HashMap<>();
map.put("avatar", StrUtil.isNotBlank(adminDTOS.getPhotoImg()) ? adminDTOS.getPhotoImg() : "https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif");
map.put("introduction", adminDTOS.getName() + ",你好!");
map.put("name", adminDTOS.getName());
map.put("roles", Arrays.asList("admin"));
map.put("type", adminDTOS.getStatus());
Map<String, String> returnMap = new HashMap<>();
String uuid = UUID.randomUUID().toString();
returnMap.put("token", uuid);
userInfoMap.put(uuid, JSON.toJSONString(map));
return ReturnMsg.ok(returnMap);
}
七、项目总结:
开发基于SpringBoot+Thymeleaf仓库管理系统是作为毕设作品进行设计的,这个毕设作品是我在校进行知识学习的一个毕业考核项目,也是检验我通过网络工具,图书工具等学习工具进行自学的能力水平,让我在根据程序开发的需求分析初步完成程序功能之外,还接触了程序的测试过程,了解程序测试的具体的过程,以及遇到问题怎么去寻找相应的解决办法等等,毕业作品的制作以及设计才是学校对我真正的考验。
在程序软件没能进行开发之前,我去了学校的图书馆借了有关数据库操作的书籍,在查看了sqlserver和mysql两种数据库的相关知识之后,我最后选择了我比较熟悉的mysql数据库。在编程语言的抉择上,由于自己之前接触过Java程序的开发,所以为了让我尽快在短时间内完成程序制作,我确定用Java编程语言进行程序编程。另外我从百度上下载了很多的有关信息增加,信息删除等操作的源代码,并通过不断调试以及完成配套的数据库的设计,开始完成程序的各个部分的功能。每当我粗心大意,致使我深陷程序开发困扰不能自拔之时,值得庆幸的是,我就会得到老师,还有我的寝室同学的耐心指导。
历经长达几个月的毕业作品制作,我凭借自己的知识技能,还有大家的指导帮助,能够在学校规定的时间段之内提交毕业作品。虽然已经算是完成了毕业作品,但是付出了这么多心血,还是想把这个作品做得更加完美一点。针对我的毕业作品学生信息管理系统,我觉得还有很多方面需要完善,第一就是界面上需要细微调整,比如色彩搭配有点违背广众的审美,需要细微调整,还有系统里面的字体大小也需要调大一点,太小的字体看起来有些费眼。然后在程序的功能上因为自己的入门开发水平的影响,所以目前只能做到这个境界,这个系统相比其他类似系统来说功能很简单,逻辑结构设计得也比较合理。
自己一个人完成程序的开发,我不仅亲自体验了程序的开发流程,体验到了程序开发的各种不易。这种体验也还加深了我对知识的尊重。学海无涯,知识不是大学短短四年就能学完的,在大学学到的知识在最终经历检验时,才会深深地明白自己的知识积累原来还很浅薄。所以今后不管身在何处,自己的学习心态一定要时刻体现出来,要深刻明白知识学到手里就是自己的。同时,自己也不必过多抱怨学到的知识没有用处,相信学到的知识总会有派上用处的那天。不要等到需要用时再去学习知识,那样就会导致自己错失很多本该属于自己的机遇。
八、源码获取:
大家点赞、收藏、关注、评论啦 、查看👇🏻👇🏻👇🏻获取项目下载链接,博主联系方式👇🏻👇🏻👇🏻
链接点击直达:下载链接