一、系统架构
系统为前后端分离项目,代码简洁易懂,采用MVC架构,逻辑清晰严谨
前端:Vue2+axios+js+css
后端:SpringBoot+Mybatis
数据库:MySQL8
推荐编译器:IDEA(后端)+Vscode(前端)
数据库参数编辑文件:application.yaml
二、核心功能
登录页:支持两个角色登录系统:管理员、员工,输入正确的账号和密码即可成功登录。
管理员(数据库表对应admin)员工(数据库表对应staff),进入表即可查询账号和密码,管理员账号密码都为admin
登录接口代码:WebController接口处理登录流程,数据库校验完成后,利用jwt生成token,并返回前端
/**
* 登录
*/
@PostMapping("/login")
public Result login(@RequestBody Account account) {
if (ObjectUtil.isEmpty(account.getUsername()) || ObjectUtil.isEmpty(account.getPassword())
|| ObjectUtil.isEmpty(account.getRole()) || ObjectUtil.isEmpty(account.getKey())
|| ObjectUtil.isEmpty(account.getCode())) {
return Result.error(ResultCodeEnum.PARAM_LOST_ERROR);
}
// 对验证码进行校验
boolean result = ValidateCodeCache.validateCode(account.getKey(), account.getCode());
if (!result) { // code不存在
return Result.error(ResultCodeEnum.VALIDATE_CODE_ERROR);
}
if (RoleEnum.ADMIN.name().equals(account.getRole())) {
account = adminService.login(account);
} else if (RoleEnum.STAFF.name().equals(account.getRole())) {
account = staffService.login(account);
}
// 记录登录的日志
LogsService.recordLog("用户登录", "登录", account.getUsername());
return Result.success(account);
}
/**
* service登录处理
*/
public Account login(Account account) {
Account dbAdmin = adminMapper.selectByUsername(account.getUsername());
if (ObjectUtil.isNull(dbAdmin)) {
throw new CustomException(ResultCodeEnum.USER_NOT_EXIST_ERROR);
}
if (!account.getPassword().equals(dbAdmin.getPassword())) {
throw new CustomException(ResultCodeEnum.USER_ACCOUNT_ERROR);
}
// 生成token
String tokenData = dbAdmin.getId() + "-" + RoleEnum.ADMIN.name();
String token = TokenUtils.createToken(tokenData, dbAdmin.getPassword());
dbAdmin.setToken(token);
return dbAdmin;
}
2.1 首页:展示剩余库存、采购订单、销售订单数据,还有最新一周商品销售的趋势折线图、库存统计图,最下面展示公告列表
2.2 仓库管理:对仓库的增删改,包括仓库编号、仓库名称、仓库面积、负责人、仓库地址、仓库容量、状态
接口代码如下:对应WarehouseController接口
/**
* 仓库前端操作接口
**/
@RestController
@RequestMapping("/warehouse")
public class WarehouseController {
@Resource
private WarehouseService warehouseService;
/**
* 新增
*/
@PostMapping("/add")
public Result add(@RequestBody Warehouse warehouse) {
warehouseService.add(warehouse);
return Result.success();
}
/**
* 删除
*/
@DeleteMapping("/delete/{id}")
public Result deleteById(@PathVariable Integer id) {
warehouseService.deleteById(id);
return Result.success();
}
/**
* 批量删除
*/
@DeleteMapping("/delete/batch")
public Result deleteBatch(@RequestBody List<Integer> ids) {
warehouseService.deleteBatch(ids);
return Result.success();
}
/**
* 修改
*/
@PutMapping("/update")
public Result updateById(@RequestBody Warehouse warehouse) {
warehouseService.updateById(warehouse);
return Result.success();
}
/**
* 根据ID查询
*/
@GetMapping("/selectById/{id}")
public Result selectById(@PathVariable Integer id) {
Warehouse warehouse = warehouseService.selectById(id);
return Result.success(warehouse);
}
/**
* 查询所有
*/
@GetMapping("/selectAll")
public Result selectAll(Warehouse warehouse ) {
List<Warehouse> list = warehouseService.selectAll(warehouse);
return Result.success(list);
}
/**
* 分页查询
*/
@GetMapping("/selectPage")
public Result selectPage(Warehouse warehouse,
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
PageInfo<Warehouse> page = warehouseService.selectPage(warehouse, pageNum, pageSize);
return Result.success(page);
}
/**
* 批量导出数据
*/
@GetMapping("/export")
public void exportData(HttpServletResponse response) throws IOException {
ExcelWriter writer = ExcelUtil.getWriter(true);
// 查询出当前Waregouse表的所有数据
List<Warehouse> list = warehouseService.selectAll(null);
writer.write(list, true);
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("仓库信息表", "UTF-8") + ".xlsx");
ServletOutputStream outputStream = response.getOutputStream();
writer.flush(outputStream, true);
outputStream.flush();
writer.close();
outputStream.close();
}
}
2.3 供应商信息:供应商名称、地址、电话、邮箱、联系人、联系人电话、开户银行、开户行账号、状态
接口代码:
package com.example.controller;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.example.common.Result;
import com.example.common.enums.ResultCodeEnum;
import com.example.entity.Supplier;
import com.example.service.SupplierService;
import com.github.pagehelper.PageInfo;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
/**
* 供应商表前端操作接口
**/
@RestController
@RequestMapping("/supplier")
public class SupplierController {
@Resource
private SupplierService supplierService;
/**
* 新增
*/
@PostMapping("/add")
public Result add(@RequestBody Supplier supplier) {
supplierService.add(supplier);
return Result.success();
}
/**
* 删除
*/
@DeleteMapping("/delete/{id}")
public Result deleteById(@PathVariable Integer id) {
supplierService.deleteById(id);
return Result.success();
}
/**
* 批量删除
*/
@DeleteMapping("/delete/batch")
public Result deleteBatch(@RequestBody List<Integer> ids) {
supplierService.deleteBatch(ids);
return Result.success();
}
/**
* 修改
*/
@PutMapping("/update")
public Result updateById(@RequestBody Supplier supplier) {
supplierService.updateById(supplier);
return Result.success();
}
/**
* 根据ID查询
*/
@GetMapping("/selectById/{id}")
public Result selectById(@PathVariable Integer id) {
Supplier supplier = supplierService.selectById(id);
return Result.success(supplier);
}
/**
* 查询所有
*/
@GetMapping("/selectAll")
public Result selectAll(Supplier supplier) {
List<Supplier> list = supplierService.selectAll(supplier);
return Result.success(list);
}
/**
* 分页查询
*/
@GetMapping("/selectPage")
public Result selectPage(Supplier supplier,
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
PageInfo<Supplier> page = supplierService.selectPage(supplier, pageNum, pageSize);
return Result.success(page);
}
/**
* 批量导出数据
*/
@GetMapping("/export")
public void exportData(HttpServletResponse response) throws IOException {
ExcelWriter writer = ExcelUtil.getWriter(true);
List<Supplier> list = supplierService.selectAll(null);
writer.write(list, true);
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("供应商信息表", "UTF-8") + ".xlsx");
ServletOutputStream outputStream = response.getOutputStream();
writer.flush(outputStream, true);
outputStream.flush();
writer.close();
outputStream.close();
}
/**
* 批量导入
*/
@PostMapping("/import")
public Result importData(MultipartFile file) throws IOException {
ExcelReader reader = ExcelUtil.getReader(file.getInputStream());
List<Supplier> list = reader.readAll(Supplier.class);
// 写入数据到数据库
try {
for (Supplier supplier : list) {
supplierService.add(supplier);
}
} catch (Exception e) {
return Result.error(ResultCodeEnum.DATA_IMPORT_ERROR);
}
return Result.success();
}
}
2.4 客户信息:客户名称、客户地址、邮箱、邮编、联系人、电话、开户银行、开户行账号、状态
接口对应CustomerController,代码如下:
/**
* 客户表前端操作接口
**/
@RestController
@RequestMapping("/customer")
public class CustomerController {
@Resource
private CustomerService customerService;
/**
* 新增
*/
@PostMapping("/add")
public Result add(@RequestBody Customer customer) {
customerService.add(customer);
return Result.success();
}
/**
* 删除
*/
@DeleteMapping("/delete/{id}")
public Result deleteById(@PathVariable Integer id) {
customerService.deleteById(id);
return Result.success();
}
/**
* 批量删除
*/
@DeleteMapping("/delete/batch")
public Result deleteBatch(@RequestBody List<Integer> ids) {
customerService.deleteBatch(ids);
return Result.success();
}
/**
* 修改
*/
@PutMapping("/update")
public Result updateById(@RequestBody Customer customer) {
customerService.updateById(customer);
return Result.success();
}
/**
* 根据ID查询
*/
@GetMapping("/selectById/{id}")
public Result selectById(@PathVariable Integer id) {
Customer customer = customerService.selectById(id);
return Result.success(customer);
}
/**
* 查询所有
*/
@GetMapping("/selectAll")
public Result selectAll(Customer customer) {
List<Customer> list = customerService.selectAll(customer);
return Result.success(list);
}
/**
* 分页查询
*/
@GetMapping("/selectPage")
public Result selectPage(Customer customer,
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
PageInfo<Customer> page = customerService.selectPage(customer, pageNum, pageSize);
return Result.success(page);
}
/**
* 批量导出数据
*/
@GetMapping("/export")
public void exportData(HttpServletResponse response) throws IOException {
ExcelWriter writer = ExcelUtil.getWriter(true);
List<Customer> list = customerService.selectAll(null);
writer.write(list, true);
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("客户信息表", "UTF-8") + ".xlsx");
ServletOutputStream outputStream = response.getOutputStream();
writer.flush(outputStream, true);
outputStream.flush();
writer.close();
outputStream.close();
}
/**
* 批量导入
*
* @param file 传入的excel文件对象
* @return 导入结果
*/
@PostMapping("/import")
public Result importData(MultipartFile file) throws IOException {
ExcelReader reader = ExcelUtil.getReader(file.getInputStream());
List<Customer> list = reader.readAll(Customer.class);
// 写入数据到数据库
try {
for (Customer customer : list) {
customerService.add(customer);
}
} catch (Exception e) {
System.err.println(e.getMessage());
return Result.error(ResultCodeEnum.DATA_IMPORT_ERROR);
}
return Result.success();
}
}
2.5 商品信息:商品名称、商品产地、商品描述、销售价格、商品数量、商品图片、商品规格、包装单位、生产批次、批准文号、状态
2.6 商品进货信息:供应商、商品、支付类型、进货时间、操作人、进货数量、商品规格、进货价格、进货总价格、备注
接口对应StockController:
/**
* 商品进货前端操作接口
**/
@RestController
@RequestMapping("/stock")
public class StockController {
@Resource
private StockService stockService;
/**
* 新增
*/
@PostMapping("/add")
public Result add(@RequestBody Stock stock) {
stockService.add(stock);
return Result.success();
}
/**
* 删除
*/
@DeleteMapping("/delete/{id}")
public Result deleteById(@PathVariable Integer id) {
stockService.deleteById(id);
return Result.success();
}
/**
* 批量删除
*/
@DeleteMapping("/delete/batch")
public Result deleteBatch(@RequestBody List<Integer> ids) {
stockService.deleteBatch(ids);
return Result.success();
}
/**
* 修改
*/
@PutMapping("/update")
public Result updateById(@RequestBody Stock stock) {
stockService.updateById(stock);
return Result.success();
}
/**
* 根据ID查询
*/
@GetMapping("/selectById/{id}")
public Result selectById(@PathVariable Integer id) {
Stock stock = stockService.selectById(id);
return Result.success(stock);
}
/**
* 查询所有
*/
@GetMapping("/selectAll")
public Result selectAll(Stock stock) {
List<Stock> list = stockService.selectAll(stock);
return Result.success(list);
}
/**
* 分页查询
*/
@GetMapping("/selectPage")
public Result selectPage(Stock stock,
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
PageInfo<Stock> page = stockService.selectPage(stock, pageNum, pageSize);
return Result.success(page);
}
}
2.7 商品退货查询:供应商、商品、支付类型、退货时间、操作人、退货数量、商品规格、退货价格、退货总价格、备注
2.8 商品销售信息:客户、商品、支付类型、销售时间、操作人、销售单价、销售数量、商品规格、销售总价、备注
2.9 公告信息:标题、内容、创建时间、创建人
接口对应NoticeController:
/**
* 公告信息表前端操作接口
**/
@RestController
@RequestMapping("/notice")
public class NoticeController {
@Resource
private NoticeService noticeService;
/**
* 新增
*/
@PostMapping("/add")
public Result add(@RequestBody Notice notice) {
noticeService.add(notice);
return Result.success();
}
/**
* 删除
*/
@DeleteMapping("/delete/{id}")
public Result deleteById(@PathVariable Integer id) {
noticeService.deleteById(id);
return Result.success();
}
/**
* 批量删除
*/
@DeleteMapping("/delete/batch")
public Result deleteBatch(@RequestBody List<Integer> ids) {
noticeService.deleteBatch(ids);
return Result.success();
}
/**
* 修改
*/
@PutMapping("/update")
public Result updateById(@RequestBody Notice notice) {
noticeService.updateById(notice);
return Result.success();
}
/**
* 根据ID查询
*/
@GetMapping("/selectById/{id}")
public Result selectById(@PathVariable Integer id) {
Notice notice = noticeService.selectById(id);
return Result.success(notice);
}
/**
* 查询所有
*/
@GetMapping("/selectAll")
public Result selectAll(Notice notice ) {
List<Notice> list = noticeService.selectAll(notice);
return Result.success(list);
}
/**
* 分页查询
*/
@GetMapping("/selectPage")
public Result selectPage(Notice notice,
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
PageInfo<Notice> page = noticeService.selectPage(notice, pageNum, pageSize);
return Result.success(page);
}
}
前端项目结构:
源码免费分享,不收费!获取请前往小程序《星梦Blog》获取
请获取点赞、收藏、关注,祝大家2025年好运连连、心想事成!
如果有源码问题,或者疑惑可在评论区讨论!