基于SpringBoot+BootStrap实现的进销存管理系统
系统介绍
作为一个进销存管理系统,最根本的功能还是实现采购管理、销售管理和库存管理等基本功能的增删改查。在基础功能也针对进货、销售和库存等做了少部分统计功能;同时支持商品、客户的资料管理和系统用户管理,登陆时可选择用户角色。
功能架构
系统架构
本系统设计采用的是MAVEN + SPRING BOOT+ JPA 的架构来搭建的项目。用这三个技术搭建项目框架,可以快速完成,省去许多简单繁杂的步骤,对于我们快速开发是有非常大的优势的。
相关技术点
前端:系统前端采用jsp + JavaScript + css的组合技术开发,使用了jQuery和bootstrap框架。
后端:SpringBoot
数据库:MySQL5.6
开发运行环境:IDEA、SpringBoo内置Tomcat、JDK1.8
功能截图
系统目前主要实现了采购管理、销售管理、库存管理、资料管理、系统用户管理等功能。由于篇幅有限,只贴出部分功能的运行截图。
- 登录
- 采购入库
- 出库
- 发货
- 销售统计
- 资料管理
- 用户管理
部分源码
- 查询Controller
package com.xu.web;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;
import com.xu.bean.Customer;
import com.xu.bean.Goods;
import com.xu.bean.Suppliers;
import com.xu.exception.ServiceException;
import com.xu.service.QueryService;
@Controller
@RequestMapping("/query")
@SessionAttributes(value={"goods","name","count","map"})
public class QueryController {
@Resource
private QueryService queryService;
/**
* 跳转到商品查询首页
* @return
*/
@RequestMapping("/goodes")
public String gotoQueryGoods(){
return "queryGoods";
}
/**
* 跳转到客户查询首页
* @return
*/
@RequestMapping("/customers")
public String gotoQueryCustomer(){
return "queryCustomer";
}
/**
* 跳转到供应商查询首页
* @return
*/
@RequestMapping("/supplierss")
public String gotoQuerySuppliers(){
return "querySuppliers";
}
/**
* 跳转到商品订单查询首页
* @return
*/
@RequestMapping("/goodsOrder")
public String gotoQueryGoodsOrder(){
return "querySaleOrder";
}
/**
* 跳转到商品订单查询首页
* @return
*/
@RequestMapping("/allgoodsOrder")
public String gotoQueryAllGoodsOrder(){
return "queryAllSaleOrder";
}
/**
* 销售统计
* @param request
* @param model
* @return
*/
@RequestMapping("/queryAllOrder")
public String queryAllOrders(HttpServletRequest request,Model model){
String min = request.getParameter("logmin");
String max = request.getParameter("logmax");
try {
Map<String,Long> map = queryService.findAllOrderCount(min,max);
model.addAttribute("map", map);
} catch (ServiceException e) {
e.printStackTrace();
}
return "queryAllSaleOrder";
}
/**
* 查询某种商品在某个时间段的销量
* @param request
* @param model
* @return
*/
@RequestMapping("/queryOrder")
public String queryGoodsOrders(HttpServletRequest request,Model model){
String min = request.getParameter("logmin");
String max = request.getParameter("logmax");
String orderName = request.getParameter("orderName");
try {
Long count = queryService.findGoodsOrderByTimeAndName(min,max,orderName);
model.addAttribute("name",orderName);
model.addAttribute("count", count);
} catch (ServiceException e) {
e.printStackTrace();
}
return "querySaleOrder";
}
/**
* 查询商品
* @param request
* @param model
* @return
*/
@RequestMapping("/queryGoods")
public String querygoods(HttpServletRequest request,Model model){
String name = request.getParameter("goodName");
try {
Goods goods = queryService.findGoodsByName(name);
model.addAttribute("goods",goods);
} catch (ServiceException e) {
e.printStackTrace();
}
return "queryGoods";
}
/**
* 查询客户
* @param request
* @param model
* @return
*/
@RequestMapping("/queryEmployee")
public String querycustomer(HttpServletRequest request,Model model){
String name = request.getParameter("customerName");
try {
Customer customer = queryService.findCustomerByName(name);
model.addAttribute("customer",customer);
} catch (ServiceException e) {
e.printStackTrace();
}
return "queryCustomer";
}
/**
* 查询供应商
* @param request
* @param model
* @return
*/
@RequestMapping("/querySuppliers")
public String querysuppliers(HttpServletRequest request,Model model){
String name = request.getParameter("suppliersName");
try {
Suppliers suppliers = queryService.findSuppliersByName(name);
model.addAttribute("suppliers",suppliers);
} catch (ServiceException e) {
e.printStackTrace();
}
return "querySuppliers";
}
}
- 销售Service
package com.xu.service.imp;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import com.xu.bean.SaleItem;
import com.xu.bean.SaleOrder;
import com.xu.dao.GoodsRepository;
import com.xu.dao.SaleItemRepository;
import com.xu.dao.SaleOrderRepository;
import com.xu.dao.StockRepository;
import com.xu.exception.ServiceException;
import com.xu.service.SaleService;
@Service
public class SaleServiceImp implements SaleService{
@Resource
private SaleOrderRepository saleOrderRepository;
@Resource
private SaleItemRepository saleItemRepository;
@Resource
private StockRepository stockRepository;
@Resource
private GoodsRepository goodsRepository;
@Override
public List<SaleOrder> findSaleOrderByPage(int pageNum) throws ServiceException {
Pageable pageable = new PageRequest(pageNum, 10);
Page<SaleOrder> page =saleOrderRepository.findAll(pageable);
List<SaleOrder> list = new ArrayList<SaleOrder>();
for(SaleOrder p:page){
list.add(p);
}
return list;
}
@Override
public Long findSaleOrderCount() throws ServiceException {
return saleOrderRepository.count();
}
@Override
public Long getTotalPage() throws ServiceException {
long count = findSaleOrderCount();
Long totalPage;
if(count%10==0){
totalPage = count/10;
}else{
totalPage = count/10 +1;
}
return totalPage;
}
@Override
public int addSaleOrder(SaleOrder saleOrder, List<SaleItem> itemList) throws ServiceException {
Double total =0D;
for(SaleItem item:itemList){
Double price = item.getPrice();
Long count = item.getCount();
Double i = price * count;
total += i;
}
saleOrder.setCustomerId(itemList.get(0).getCustomerId());
saleOrder.setTotal(total);
SaleOrder saleOrder2 = saleOrderRepository.save(saleOrder);
for(SaleItem item:itemList){
item.setSaleOrderId(saleOrder2.getId());
saleItemRepository.save(item);
}
return 1;
}
@Override
public List<SaleItem> delPurchaseItemByPurchaseId(Long orderId) throws ServiceException {
List<SaleItem> saleItem = saleItemRepository.findSaleItemByOrderId(orderId);
saleItemRepository.delete(orderId);
return saleItem;
}
@Override
public SaleOrder delOrderByPurchaseId(Long orderId) throws ServiceException {
SaleOrder saleOrder = saleOrderRepository.findOne(orderId);
saleOrderRepository.delete(orderId);
return saleOrder;
}
@Override
public String findFlagByOrderId(Long orderId) throws ServiceException {
return saleOrderRepository.findFlagByOrderId(orderId);
}
@Override
public List<SaleItem> findSaleOrderByOrderId(Long orderId) throws ServiceException {
return saleItemRepository.findSaleItemByOrderId(orderId);
}
@Override
public int updateFlagByOrderId(String string, Long orderId) throws ServiceException {
saleOrderRepository.updateFlagByOrderId(string,orderId);
return 1;
}
@Override
public int updateStockBySaleReturnOrder(List<SaleItem> saleItem) throws ServiceException {
for(SaleItem si:saleItem){
Long goodsId = goodsRepository.findGoodsIdByGoodsName(si.getName());
Long count = stockRepository.findCountByGoodsId(goodsId);
stockRepository.updateStockCountByGoodsId(count+si.getCount(),goodsId);
}
return 0;
}
}
3.首页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html lang="en">
<base href="<%=basePath%>" />
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<meta name="keywords" content="admin, dashboard, bootstrap, template, flat, modern, theme, responsive, fluid, retina, backend, html5, css, css3">
<meta name="description" content="">
<meta name="author" content="ThemeBucket">
<title>首页</title>
<link rel="Bookmark" href="favicon.ico" >
<link rel="Shortcut Icon" href="favicon.ico" />
<link rel="stylesheet" type="text/css" href="static/h-ui/css/H-ui.min.css" />
<link rel="stylesheet" type="text/css" href="static/h-ui.admin/css/H-ui.admin.css" />
<link rel="stylesheet" type="text/css" href="lib/Hui-iconfont/1.0.8/iconfont.css" />
<link rel="stylesheet" type="text/css" href="static/h-ui.admin/skin/default/skin.css" id="skin" />
<link rel="stylesheet" type="text/css" href="static/h-ui.admin/css/style.css" />
<!--/meta 作为公共模版分离出去-->
</head>
<body>
<!--_header 作为公共模版分离出去-->
<header class="navbar-wrapper">
<div class="navbar navbar-fixed-top">
<div class="container-fluid cl"> <span class="logo navbar-logo f-l mr-10 hidden-xs" ><a href="/sys/gotoIndex" class="logo navbar-logo f-l mr-10 hidden-xs">进销存管理系统</a></span>
<span class="logo navbar-slogan f-l mr-10 hidden-xs">1.0</span>
<a aria-hidden="false" class="nav-toggle Hui-iconfont visible-xs" href="javascript:;"></a>
<nav id="Hui-userbar" class="nav navbar-nav navbar-userbar hidden-xs">
<ul class="cl">
<li>超级管理员</li>
<li class="dropDown dropDown_hover"> <a href="#" class="dropDown_A">${user.name} <i class="Hui-iconfont"></i></a>
<ul class="dropDown-menu menu radius box-shadow">
<li><a href="/log/gotoInformation">个人信息</a></li>
<li><a href="log/in">切换账户</a></li>
<li><a href="log/out">退出</a></li>
</ul>
</li>
<li id="Hui-msg"> <a href="/log/getMessage" title="消息"><span class="badge badge-danger">${messageCount}</span><i class="Hui-iconfont" style="font-size:18px"></i></a> </li>
<li id="Hui-skin" class="dropDown right dropDown_hover"> <a href="javascript:;" class="dropDown_A" title="换肤"><i class="Hui-iconfont" style="font-size:18px"></i></a>
<ul class="dropDown-menu menu radius box-shadow">
<li><a href="javascript:;" data-val="default" title="默认(黑色)">默认(黑色)</a></li>
<li><a href="javascript:;" data-val="blue" title="蓝色">蓝色</a></li>
<li><a href="javascript:;" data-val="green" title="绿色">绿色</a></li>
<li><a href="javascript:;" data-val="red" title="红色">红色</a></li>
<li><a href="javascript:;" data-val="yellow" title="黄色">黄色</a></li>
<li><a href="javascript:;" data-val="orange" title="橙色">橙色</a></li>
</ul>
</li>
</ul>
</nav>
</div>
</div>
</header>
<!--/_header 作为公共模版分离出去-->
<!--_menu 作为公共模版分离出去-->
<aside class="Hui-aside">
<div class="menu_dropdown bk_2">
<dl id="menu-article">
<dt><i class="Hui-iconfont"></i> 采购管理<i class="Hui-iconfont menu_dropdown-arrow"></i></dt>
<dd>
<ul>
<li><a href="purchase/pur" title="采购订单">采购订单</a></li>
<li><a href="purchase/forwordAddStock" title="收货入库">收货入库</a></li>
<li><a href="returnPurchase/turn" title="采购退货">采购退货</a></li>
</ul>
</dd>
</dl>
<dl id="menu-picture">
<dt><i class="Hui-iconfont"></i> 库存管理<i class="Hui-iconfont menu_dropdown-arrow"></i></dt>
<dd>
<ul>
<li><a href="stock-add.html" title="商品入库">商品入库</a></li>
<li><a href="stock/out" title="商品出库">商品出库</a></li>
<li><a href="stock/stockquery" title="库存查询">库存查询</a></li>
<li><a href="stock/area" title="商品移库">商品移库</a></li>
<li><a href="stock/allStock" title="库存盘点">库存盘点</a></li>
</ul>
</dd>
</dl>
<dl id="menu-product">
<dt><i class="Hui-iconfont"></i> 销售管理<i class="Hui-iconfont menu_dropdown-arrow"></i></dt>
<dd>
<ul>
<li><a href="sale/gotosale" title="销售订单">销售订单</a></li>
<li><a href="sale/gotooutsale" title="发货出库">发货出库</a></li>
<li><a href="salereturn/forwordSaleReturn" title="销售退货">销售退货</a></li>
</ul>
</dd>
</dl>
<dl id="menu-comments">
<dt><i class="Hui-iconfont"></i> 查询统计<i class="Hui-iconfont menu_dropdown-arrow"></i></dt>
<dd>
<ul>
<li><a href="/query/goodes" title="商品查询">商品查询</a></li>
<li><a href="/query/supplierss" title="供应商查询">供应商查询</a></li>
<li><a href="/query/customers" title="客户查询">客户查询</a></li>
<li><a href="/query/goodsOrder" title="销售查询">销售查询</a></li>
<li><a href="/query/allgoodsOrder" title="销售统计">销售统计</a></li>
</ul>
</dd>
</dl>
<dl id="menu-member">
<dt><i class="Hui-iconfont"></i> 资料管理<i class="Hui-iconfont menu_dropdown-arrow"></i></dt>
<dd>
<ul>
<li><a href="/sys/goods" title="商品资料">商品资料</a></li>
<li><a href="/sys/gotoSuppliers" title="供应商资料">供应商资料</a></li>
<li><a href="/sys/gotoCustomer" title="客户资料">客户资料</a></li>
</ul>
</dd>
</dl>
<dl id="menu-admin">
<dt><i class="Hui-iconfont"></i> 系统管理<i class="Hui-iconfont menu_dropdown-arrow"></i></dt>
<dd>
<ul>
<li><a href="/sys/gotoEmployee" title="用户管理">用户管理</a></li>
<li><a href="/backups/gotuBackup" title="备份与恢复">备份与恢复</a></li>
</ul>
</dd>
</dl>
</div>
</aside>
<div class="dislpayArrow hidden-xs"><a class="pngfix" href="javascript:void(0);" onClick="displaynavbar(this)"></a></div>
<!--/_menu 作为公共模版分离出去-->
<section class="Hui-article-box">
<nav class="breadcrumb"><i class="Hui-iconfont"></i> <a href="/" class="maincolor">首页</a>
<span class="c-999 en">></span>
<span class="c-666">我的桌面</span>
<a class="btn btn-success radius r" style="line-height:1.6em;margin-top:3px" title="刷新" ><i class="Hui-iconfont"></i></a></nav>
<div class="Hui-article">
<article class="cl pd-20">
<p class="f-20 text-success">欢迎使用H-ui.admin
<span class="f-14">v2.3</span>
后台模版!</p>
<p>登录次数:18 </p>
<p>上次登录IP:222.35.131.79.1 上次登录时间:2014-6-14 11:19:55</p>
<table class="table table-border table-bordered table-bg">
<thead>
<tr>
<th colspan="7" scope="col">信息统计</th>
</tr>
<tr class="text-c">
<th>统计</th>
<th>资讯库</th>
<th>图片库</th>
<th>产品库</th>
<th>用户</th>
<th>管理员</th>
</tr>
</thead>
<tbody>
<tr class="text-c">
<td>总数</td>
<td>92</td>
<td>9</td>
<td>0</td>
<td>8</td>
<td>20</td>
</tr>
<tr class="text-c">
<td>今日</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr class="text-c">
<td>昨日</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr class="text-c">
<td>本周</td>
<td>2</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr class="text-c">
<td>本月</td>
<td>2</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
</tbody>
</table>
<table class="table table-border table-bordered table-bg mt-20">
<thead>
<tr>
<th colspan="2" scope="col">服务器信息</th>
</tr>
</thead>
<tbody>
<tr>
<th width="30%">服务器计算机名</th>
<td><span id="lbServerName">http://127.0.0.1/</span></td>
</tr>
<tr>
<td>服务器IP地址</td>
<td>192.168.1.1</td>
</tr>
<tr>
<td>服务器域名</td>
<td>www.h-ui.net</td>
</tr>
<tr>
<td>服务器端口 </td>
<td>80</td>
</tr>
<tr>
<td>服务器IIS版本 </td>
<td>Microsoft-IIS/6.0</td>
</tr>
<tr>
<td>本文件所在文件夹 </td>
<td>D:\WebSite\HanXiPuTai.com\XinYiCMS.Web\</td>
</tr>
<tr>
<td>服务器操作系统 </td>
<td>Microsoft Windows NT 5.2.3790 Service Pack 2</td>
</tr>
<tr>
<td>系统所在文件夹 </td>
<td>C:\WINDOWS\system32</td>
</tr>
<tr>
<td>服务器脚本超时时间 </td>
<td>30000秒</td>
</tr>
<tr>
<td>服务器的语言种类 </td>
<td>Chinese (People's Republic of China)</td>
</tr>
<tr>
<td>.NET Framework 版本 </td>
<td>2.050727.3655</td>
</tr>
<tr>
<td>服务器当前时间 </td>
<td>2014-6-14 12:06:23</td>
</tr>
<tr>
<td>服务器IE版本 </td>
<td>6.0000</td>
</tr>
<tr>
<td>服务器上次启动到现在已运行 </td>
<td>7210分钟</td>
</tr>
<tr>
<td>逻辑驱动器 </td>
<td>C:\D:\</td>
</tr>
<tr>
<td>CPU 总数 </td>
<td>4</td>
</tr>
<tr>
<td>CPU 类型 </td>
<td>x86 Family 6 Model 42 Stepping 1, GenuineIntel</td>
</tr>
<tr>
<td>虚拟内存 </td>
<td>52480M</td>
</tr>
<tr>
<td>当前程序占用内存 </td>
<td>3.29M</td>
</tr>
<tr>
<td>Asp.net所占内存 </td>
<td>51.46M</td>
</tr>
<tr>
<td>当前Session数量 </td>
<td>8</td>
</tr>
<tr>
<td>当前SessionID </td>
<td>gznhpwmp34004345jz2q3l45</td>
</tr>
<tr>
<td>当前系统用户名 </td>
<td>NETWORK SERVICE</td>
</tr>
</tbody>
</table>
</article>
<footer class="footer">
<p>
Copyright ©2017 xuks 版权所有<br>
京ICP证000007,京公网安备11000002000016号
</p>
</footer>
</div>
</section>
<!--_footer 作为公共模版分离出去-->
<script type="text/javascript" src="lib/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript" src="lib/layer/2.4/layer.js"></script>
<script type="text/javascript" src="static/h-ui/js/H-ui.js"></script>
<script type="text/javascript" src="static/h-ui.admin/js/H-ui.admin.page.js"></script>
<!--/_footer /作为公共模版分离出去-->
<!--请在下方写此页面业务相关的脚本-->
<script type="text/javascript">
</script>
<!--/请在上方写此页面业务相关的脚本-->
</body>
</html>
最后
如果感兴趣,可以扫码咨询