【计算机毕设教程】基于springboot+vue的农产品溯源系统 | 仓库管理系统 | 进销存系统 ——后端篇
系统演示
02.系统功能&业务演示
系统功能
-
采购管理
-
入库管理
-
出库单管理
-
出库管理
-
溯源
-
经销商管理
-
农产品管理
-
客户管理
-
库存查询
-
公告管理
-
系统管理
业务流程
技术栈
技术名称 | 所用框架 |
---|---|
前端脚手架 | vue.js |
请求框架 | axios |
UI框架 | elementUi |
图表可视化 | echarts |
状态管理 | vueX |
导航守卫 | vue-router |
后端开发基础框架 | Springboot |
文档接口 | swagger |
ORM | Mybatis-plus |
JWT | java-jwt |
数据库 | Mysql |
功能开发
首先运行毕设脚手架,脚手架获取方式见文末。
【登录页】
数据库设计
以采购管理功能为例,每条数据记录需要一个主键,或许是单个主键,或许是复合主键;这里为单个int自增主键,起名id。
单据编号为每张采购记录的单据编号,在实际业务中,可能会涉及到票据打印,因此以单据编号作为实际业务中的编号,起名bill_code。
单据日期作为本单据的发生日期,这里使用timestamp时间戳字段,实际上用date更为合适,起名bill_date。
客户名称采购对象的客户名称,这里使用varchar直接将客户名称冗余到该表,实际业务中会使用客户id进行关联更为合理,起名customer_name。
产品名称为所采购的产品名称,类型为varchar,这里也是进行冗余,起名thing_name。
产品单位为所采购产品的数量单位,不同的农产品可能采购方式以及单位不同,例如吨、千克、斤等,类型为varchar,起名unit。
产品数量为本次所采购产品的数量,使用decimal类型进行小数存储,float以及double类型实际存储中会有数据缺失的风险,例如1.6存储为1.599999,起名quanlity。
总价为本次采购农产品的总价格,默认为元,价格可能是小数,因此使用decimal类型,小数点两位进行存储,起名amount。
后端开发
首先需要对常用接口进行实现,包括单增,单删,单改,单查,分页查,全部查。最后再添加自定义接口——生成单据编号。
controller
首先新建Controller类,起名PurchaseController,标注基本的注解。
@RestController
@RequestMapping("/purchase")
public class PurchaseController {
@Autowired
private PurchaseService purchaseService;
}
单增和单改直接调用service服务的saveOrUpdate接口,该接口源于mybatisPlus。
@PostMapping("/save")
public Result save(@RequestBody Purchase purchase) {
boolean b = purchaseService.saveOrUpdate(purchase);
if (b) {
return Result.success();
} else {
return Result.error();
}
}
单删调用调用service服务的removeById接口,该接口源于mybatisPlus。
@DeleteMapping("/deleteById/{id}")
public Result deleteById(@PathVariable Integer id) {
boolean b = purchaseService.removeById(id);
if (b) {
return Result.success();
} else {
return Result.error();
}
}
单查调用调用service服务的ree.e.getById接口,该接口源于mybatisPlus。
@GetMapping("/findById/{id}")
public Result findById(@PathVariable("id") Integer id) {
Purchase purchase = purchaseService.getById(id);
if (null != purchase) {
return Result.success(purchase);
} else {
return Result.error("500", "找不到文章信息");
}
}
分页查调用调用service服务的page接口,该接口源于mybatisPlus。分页查询的条件需要自己向queryWrapper中添加,包括常用的like模糊查询,eq等于查询,orderByDesc排序等等。
@GetMapping("/findPage")
@NoAuth
public Result findPage(@RequestParam Integer pageNum,
@RequestParam Integer pageSize,
@RequestParam(name = "billCode", defaultValue = "") String name) {
Page<Purchase> page = new Page<>(pageNum, pageSize);
QueryWrapper<Purchase> queryWrapper = new QueryWrapper<>();
if (StringUtils.isNotBlank(name)) {
queryWrapper.like("bill_code", name);
}
Page<Purchase> purchasePage = purchaseService.page(page, queryWrapper);
return Result.success(purchasePage);
}
全部查调用调用service服务的list接口,该接口源于mybatisPlus。
@GetMapping("/findAll")
public Result findAll() {
return Result.success(purchaseService.list());
}
最后,我们需要自定义生成单据编码接口,单据编码格式为CK+日期+三位随机数。一般每日的单据不会超过1000个,所以三位数基本够使用,这里没有做单据编码唯一检测,可以自己再加上。
@GetMapping("/generateCode")
public Result generateCode() {
// 生成今日日期,格式为yyyyMMdd
int c = (int) (Math.random() * 1000);
LocalDate today = LocalDate.now();
// 创建日期格式器
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
// 格式化日期
String formattedDate = today.format(formatter);
String code = "CK-" + formattedDate+"-"+String.format("%03d",c);
return Result.success(code);
}
到此,controller层编写完毕。
service
首先定义service接口。
public interface PurchaseService extends IService<Purchase> {
}
接下来实现service接口,注意标注@Service注解。
controller层所用的接口都是mybatis plus自带接口,因此service层无需再做其他开发。
@Service
public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> implements PurchaseService {
}
mapper
mapper层也无需做额外的开发。
public interface PurchaseMapper extends BaseMapper<Purchase> {
}
xml
xml只需注意namespace对应好即可。无需额外开发。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.authority.mapper.PurchaseMapper">
</mapper>
脚手架获取
一键三连获取进群密码。通过企鹅群,直接在群文件中获取即可。