基于Springboot+Vue开发前后端端分离农产品进销存系统
项目编号:BS-XX-145
一,项目简介
农产品进销存系统是针对商店、商场、超市的进销存业务处理的计算机化而设计,为进销存业务的处理人员提供计算机化的服务,改变以往的手工操作,提高工作效率,进而增强竞争力。本系统提供的服务主要有商品的进货、销售、库存管理以及相应的报表、查询功能等。系统使用前后端分离模式开发实现,后台使用springboot+mybatis开发,前端使用vue+nodejs实现,通过接口远程调用。系统前端主要实现产品的展销功能,后台主要实现相关的数据管理功能,具体的功能实现如下:
系统用户管理
商品管理
客户管理
供应商管理
进货管理
销售管理
统计报表
前台轮播广告图管理
二,环境介绍
语言环境:Java: jdk1.8
数据库:Mysql: mysql5.7
应用服务器:Tomcat: tomcat8.5.31
开发工具:IDEA或eclipse
后台开发技术:Springboot+mybatis
前台开发技术:nodejs+vue
三,系统展示
前端页面及功能展示

产品购买:

后台用户登陆

用户管理

商品管理

客户管理

供应商管理

商品进货

退货查询

商品销售

商品退货查询

统计报表

轮播图管理
四,核心代码展示
package com.example.demo.controller;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.example.demo.dto.QueryDTO;import com.example.demo.entity.Customer;import com.example.demo.entity.Good;import com.example.demo.result.DataGridViewResult;import com.example.demo.result.Result;import com.example.demo.service.CustomerService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.util.List;/**
* Description: 客户
* date: 2022/9/30 23:46
* @author: znz
* @since JDK 1.8
*/public class CustomerController {
private CustomerService customerService; /**
* 分页查询
* @param queryDTO
* @return
*/
public Result customerList({ QueryDTO queryDTO)return new Result(200,"",customerService.selectCustomerPage(queryDTO));
} /**
* 添加
* @param customer
* @return
*/
public Result addCustomer({ Customer customer)return new Result(200,"",customerService.addCustomer(customer));
} /**
* 更新/修改
* @param customer
* @return
*/
public Result updateCustomer({
System.out.println(customer); Customer customer)return new Result(200,"",customerService.updateCustomer(customer));
} /**
* 删除
* @param custid
* @return
*/
public Result deleteCustomer(Integer custid){ return new Result(200,"",customerService.deleteCustomer(custid));
} /**
* 批量删除
* @param custids
* @return
*/
public Result batchDeleteCustomer({
customerService.batchDelete(custids); List<Integer> custids)return new Result(200,"","");
} /**
* 加载下拉框
*
* @return
*/
public DataGridViewResult loadAllCust() {
QueryWrapper<Customer> queryWrapper = new QueryWrapper<>();
List<Customer> list = customerService.list(queryWrapper); return new DataGridViewResult(list);
} /**
* 根据客户id加载客户名称
* @param
* @return
*/
public DataGridViewResult loadCustById(Integer custid) {
QueryWrapper<Customer> goodsQueryWrapper = new QueryWrapper<>();
goodsQueryWrapper.eq(custid != 0, "custid", custid); Customer customer = customerService.getById(custid); return new DataGridViewResult(customer);
}
}
package com.example.demo.controller;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.baomidou.mybatisplus.core.metadata.IPage;import com.baomidou.mybatisplus.extension.plugins.pagination.Page;import com.example.demo.dto.QueryDTO;import com.example.demo.entity.Good;import com.example.demo.entity.Provider;import com.example.demo.mapper.GoodMapper;import com.example.demo.result.DataGridViewResult;import com.example.demo.result.Result;import com.example.demo.service.GoodService;import com.example.demo.service.ProviderService;import org.apache.commons.lang3.RandomStringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.util.StringUtils;import org.springframework.web.bind.annotation.*;import javax.servlet.http.HttpServletRequest;import java.util.List;/**
* Description:
* date: 2022/9/18 23:56
* @author: znz
* @since JDK 1.8
*/public class GoodController {
private GoodService service;
private GoodMapper goodMapper; /**
* 分页查询
* @param queryDTO
* @return
*/
public Result goodList({ QueryDTO queryDTO)return new Result(200,"",service.selectGoodPage(queryDTO));
}
public Result goodProList(String keyword){ return new Result(200,"",goodMapper.selectname(keyword));
} /**
* 前台显示
* @return
*/
public Result goodLists(){ return new Result(200,"",service.list());
} /**
* 前台查询商品名称
* @return
*/
public Result goodSelectLists(String keyword){ return new Result(200,"",goodMapper.selectgood(keyword));
} /**
* 添加
* @param good
* @return
*/
public Result addGood({ Good good)// 随机的商品编号
String bering = RandomStringUtils.randomAlphanumeric(8);
good.setCommbering(bering);
good.setInventory(0); return new Result(200,"",service.addGood(good));
} /**
* 更新/修改
* @param good
* @return
*/
public Result updateGoods({ Good good)return new Result(200,"",service.updateGood(good));
} /**
* 删除
* @param commid
* @return
*/
public Result deleteGood(Integer commid){ return new Result(200,"",service.deleteGood(commid));
} /**
* 批量删除
* @param commids
* @return
*/
public Result batchDeleteGood({
service.batchDelete(commids); List<Integer> commids)return new Result(200,"","");
} /**
* 根据商品id加载商品信息
* @param
* @return
*/
public DataGridViewResult loadGoodsById(Integer commid) {
QueryWrapper<Good> goodsQueryWrapper = new QueryWrapper<>();
goodsQueryWrapper.eq(commid != 0, "commid", commid); Good good = service.getById(commid);
System.out.println(good); return new DataGridViewResult(good);
} /**
* 根据供应商id加载商品信息
* @param
* @return
*/
public DataGridViewResult loadProById(Integer providerid) {
QueryWrapper<Good> goodsQueryWrapper = new QueryWrapper<>();
goodsQueryWrapper.eq(providerid != 0, "providerid", providerid); Good good = service.getById(providerid);
System.out.println(good); return new DataGridViewResult(good);
} /**
* 加载下拉框
*
* @return
*/
public DataGridViewResult loadAllGoods() {
QueryWrapper<Good> queryWrapper = new QueryWrapper<>();
List<Good> list = service.list(queryWrapper); return new DataGridViewResult(list);
}
}
package com.example.demo.controller;import com.example.demo.result.SysResult;import org.apache.tomcat.util.http.fileupload.FileUtils;import org.springframework.http.MediaType;import org.springframework.util.ResourceUtils;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest;import java.io.File;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;public class ImageudController { /**
* 文件上传
* @param picture
* @param request
* @return
*/
public SysResult upload( { MultipartFile picture, HttpServletRequest request)// 获取文件在服务器的储存位置
// String path = request.getSession().getServletContext().getRealPath("/upload");
// 将文件存储到vue的static文件方便修改整理
String path = "E:/vue/demo-vue/static/upload"; File filePath = new File(path);
System.out.println("文件的保存路径:" + path); if (!filePath.exists() && !filePath.isDirectory()) {
System.out.println("目录不存在,创建目录:" + filePath);
filePath.mkdir();
} //获取原始文件名称(包含格式)
String originalFileName = picture.getOriginalFilename();
System.out.println("原始文件名称:" + originalFileName); //获取文件类型,以最后一个`.`为标识
String type = originalFileName.substring(originalFileName.lastIndexOf(".") + 1);
System.out.println("文件类型:" + type); //获取文件名称(不包含格式)
String name = originalFileName.substring(0, originalFileName.lastIndexOf(".")); //设置文件新名称: 当前时间+文件名称(不包含格式)
Date d = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); String date = sdf.format(d); String fileName = date + name + "." + type;
System.out.println("新文件名称:" + fileName); //在指定路径下创建一个文件
File targetFile = new File(path, fileName); //将文件保存到指定位置
try {
picture.transferTo(targetFile);
System.out.println("上传成功"); //将文件在指定存储路径返回
return new SysResult(true,"/upload/" + fileName);
} catch (IOException e) {
System.out.println("上传失败");
e.printStackTrace(); return new SysResult(false, "上传失败");
}
} /**
* 文件上传
* @param image
* @param request
* @return
*/
public SysResult uploads( { MultipartFile image, HttpServletRequest request)// 获取文件在服务器的储存位置
// String path = request.getSession().getServletContext().getRealPath("/upload");
// 将文件存储到vue的static文件方便修改整理
String path = "E:/vue/demo-vue/static/upload"; File filePath = new File(path);
System.out.println("文件的保存路径:" + path); if (!filePath.exists() && !filePath.isDirectory()) {
System.out.println("目录不存在,创建目录:" + filePath);
filePath.mkdir();
} //获取原始文件名称(包含格式)
String originalFileName = image.getOriginalFilename();
System.out.println("原始文件名称:" + originalFileName); //获取文件类型,以最后一个`.`为标识
String type = originalFileName.substring(originalFileName.lastIndexOf(".") + 1);
System.out.println("文件类型:" + type); //获取文件名称(不包含格式)
String name = originalFileName.substring(0, originalFileName.lastIndexOf(".")); //设置文件新名称: 当前时间+文件名称(不包含格式)
Date d = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); String date = sdf.format(d); String fileName = date + name + "." + type;
System.out.println("新文件名称:" + fileName); //在指定路径下创建一个文件
File targetFile = new File(path, fileName); //将文件保存到指定位置
try {
image.transferTo(targetFile);
System.out.println("上传成功"); //将文件在指定存储路径返回
return new SysResult(true,"/upload/" + fileName);
} catch (IOException e) {
System.out.println("上传失败");
e.printStackTrace(); return new SysResult(false, "上传失败");
}
}
}
package com.example.demo.controller;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.example.demo.dto.QueryDTO;import com.example.demo.entity.Good;import com.example.demo.entity.Provider;import com.example.demo.entity.User;import com.example.demo.result.DataGridViewResult;import com.example.demo.result.Result;import com.example.demo.service.ProviderService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.util.List;/**
* @Author znz
* @Date 2022/10/3 0:06
* @Version 1.0
*/public class ProviderController {
private ProviderService service; /**
* 分页查询
* @param queryDTO
* @return
*/
public Result providerList({ QueryDTO queryDTO)return new Result(200,"",service.selectProviderPage(queryDTO));
} /**
* 添加
* @param provider
* @return
*/
public Result addProvider({ Provider provider)return new Result(200,"",service.addProvider(provider));
} /**
* 更新/修改
* @param provider
* @return
*/
public Result updateProvider({ Provider provider)return new Result(200,"",service.updateProvider(provider));
} /**
* 删除
* @param providerid
* @return
*/
public Result deleteProvider(Integer providerid){ return new Result(200,"",service.deleteProvider(providerid));
} /**
* 批量删除
* @param providerids
* @return
*/
public Result batchDeleteProvider({
service.batchDelete(providerids); List<Integer> providerids)return new Result(200,"","");
} /**
* 根据供应商id加载供应商信息
* @param
* @return
*/
public DataGridViewResult loadProviderById(Integer providerid) {
QueryWrapper<Provider> goodsQueryWrapper = new QueryWrapper<>();
goodsQueryWrapper.eq(providerid != 0, "providerid", providerid); Provider provider = service.getById(providerid);
System.out.println(provider); return new DataGridViewResult(provider);
} /**
* 根据供应商id加载供应商信息
* @param
* @return
*/
public DataGridViewResult loadProviderByIds(Integer providerid) {
QueryWrapper<Provider> goodsQueryWrapper = new QueryWrapper<>();
goodsQueryWrapper.eq(providerid != 0, "providerid", providerid); Provider provider = service.getById(providerid);
System.out.println(provider); return new DataGridViewResult(provider);
} /**
* 加载下拉框
*
* @return
*/
public DataGridViewResult loadAllProvider() {
QueryWrapper<Provider> queryWrapper = new QueryWrapper<>();
List<Provider> list = service.list(queryWrapper); return new DataGridViewResult(list);
}
}
五,项目总结
本项目功能齐全,基于前后端开发模式,前端和后台分别独立运行,并且提供了进销存商品展销的前端页面来供浏览,比较适合做毕业设计使用。