基于javaweb+mysql的ssm实现进销存系统(java+ssm+bootstrap+jsp+mysql)
运行环境
Java≥8、MySQL≥5.7、Tomcat≥8
开发工具
eclipse/idea/myeclipse/sts等均可配置运行
适用
课程设计,大作业,毕业设计,项目练习,学习演示等
功能说明
基于javaweb+mysql的SSM实现进销存系统(java+ssm+bootstrap+jsp+mysql)
项目介绍
进销存库存管理系统源码,采用了ssm框架,功能结构非常简单明了,界面也比较清爽大气,非常适合学生和Java新手拿来学习使用。 本项目主要分为管理员、销售、采购员三种角色; 管理员主要功能包括: 用户信息管理:用户查询、用户添加; 货物信息管理:货物查询、库存查询; 入库单信息管理:入库单新建、入库单审核; 出库信息管理:出库单新建、出库单审核; 销售主要功能包括: 出库信息管理:出库单新建; 采购员主要功能包括: 货物信息管理:库存查询 入库单信息管理:入库单新建;
环境要求:
1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS; 5.是否Maven项目: 否;
6.数据库:MySql 5.7版本;
技术栈
-
后端:Spring SpringMVC MyBatis
-
前端:JSP+css+javascript+bootstrap+jQuery
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');
//循环codeLength 我设置的4就是循环4次
for (var i = 0; i < codeLength; i++) {
//设置随机数范围,这设置为0 ~ 36
var index = Math.floor(Math.random() * 36);
//字符串拼接 将每次随机的字符 进行拼接
code += random[index];
}
//将拼接好的字符串赋值给展示的Value
codeV.value = code;
}
//下面就是判断是否== 的代码,无需解释
function validate() {
var name = $("#username").val();
var password = $("#password").val();
var requestDate = {};
requestDate["name"] = name;
requestDate["password"] = password;
var str = JSON.stringify(requestDate);
if (name == "") {
alert("请填写登录名");
return;
}
if (password == "") {
alert("请填写密码");
return;
}
$.ajax({
type : "get",
dataType : 'json',//默认转化对象
async : true,
url : "user/login", //提交到一般处理程序请求数据
data : {
"requestDate" : str
},
error : function() {
alert("登录失败,请与管理员联系!")
},
success : function(data) {
//list = s.bb();
list=s.bb();
// String str=String.join("=", list);
// System.out.println(str);
JSONArray json = JSONArray.fromObject(list);
model.addAttribute("list", list);
//model.addAttribute("json", json);
System.out.println(json);
//System.out.println(list);
return "gly/bb";
}
//********************************采购******************************************
@RequestMapping("tzkccg")
public String tzkccg(Model model, Hw hw) {
hw.setSj(0);
hw.setSh(1);
model.addAttribute("list", h.sp(hw));
return "cg/kc";
}
@RequestMapping("tzrkcg")
public String tzrkcg() {
return "cg/rkd";
}
@RequestMapping("rkcg")
public String zjrkcg(Hw hw, HttpSession session) throws ParseException {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH");
String time = df.format(System.currentTimeMillis());
hw.setDate(df.parse(time));
hw.setSj(0);
hw.setSh(0);
String zrr = (String) session.getAttribute("name");
hw.setZrr(zrr);
h.xjrk(hw);
return "redirect:tzrkcg";
}
@RequestMapping("tzzupss")
public String tzzupss(Model model,HttpSession session) {
int id=(int) session.getAttribute("id");
User user = u.findid(id);
model.addAttribute("user", user);
return "cg/user";
}
//*************************************销售**************************************
<dd>
<a href="tzkc">库存查询</a>
</dd>
</dl>
</li>
<li>
<dl>
<dt>入库单信息管理</dt>
<dd>
<a href="tzrk" class="active">入库单新建</a>
</dd>
<dd>
<a href="tzrksh">入库单审核</a>
</dd>
</dl>
</li>
<li>
<dl>
<dt>出库信息管理</dt>
<dd>
<a href="tzck" >出库单新建</a>
</dd>
<dd>
<a href="tzcksh">出库单审核</a>
</dd>
</dl>
</li>
<!-- <li>
<dl>
<dt>报表管理</dt>
<dd>
<a href="tzbb">生成报表</a>
</dd>
</dl>
</li> -->
</ul>
</aside>
<section class="rt_wrap content mCustomScrollbar">
<form action="update_hw_act" method="post">
<input type="hidden" name="id" value="${hw.id}">
<div class="rt_content">
<div class="page_title">
<h2 class="fl">请输入货物信息</h2>
</div>
<ul class="ulColumn2">
<li>
<span class="item_name" style="width:120px;">货物名称:</span>
<input type="text" name="name" class="textbox textbox_225" value="${hw.name} " placeholder="货物名称..."/>
</li>
<li>
<span class="item_name" style="width:120px;">数量:</span>
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public int getSh() {
return sh;
}
public void setSh(int sh) {
this.sh = sh;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getHw() {
return hw;
}
public void setHw(String hw) {
this.hw = hw;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMoney() {
return money;
}
public void setMoney(String money) {
this.money = money;
}
public String getJg() {
return jg;
}
public void setJg(String jg) {
this.jg = jg;
}
public String getLr() {
return lr;
}
public int delete(int id) {
// TODO Auto-generated method stub
return UserService.delete(id);
}
@Override
public User findid(int id) {
// TODO Auto-generated method stub
return UserService.findid(id);
}
@Override
public int userup(User user) {
// TODO Auto-generated method stub
return UserService.userup(user);
}
}
@Service
public class ShServiceImpl implements ShService{
@Autowired
private ShDao sd;
@Override
public int ck(Sh sh) {
// TODO Auto-generated method stub
return sd.ck(sh);
}
@Override
public int cksh(Sh sh) {
// TODO Auto-generated method stub
return sd.cksh(sh);
}
@Override
public int jj(int id) {
// TODO Auto-generated method stub
return sd.jj(id);
public String getT6() {
return t6;
}
public void setT6(String t6) {
this.t6 = t6;
}
}
public class User{
private int id;
private String name;
private String password;
private int sex;
private String phone;
private String year;
private Date date;
private int t1; // 用户角色 0管理员 1管理员 2销售 3采购员
private int t2; // 用户状态 0可用 1不可用
private String t3;
private String t4;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getSex() {
return sex;
</div>
<script>
$(function() {
$(".icon-save").click(function() {
var name = $("#username").val();
var password = $("#password").val();
var requestDate = {};
requestDate["name"] = name;
requestDate["password"] = password;
var str = JSON.stringify(requestDate);
if (name == "") {
alert("请填写登录名");
return;
}
if (password == "") {
alert("请填写密码");
return;
}
$.ajax({
type : "get",
dataType : 'json',//默认转化对象
async : true,
url : "login", //提交到一般处理程序请求数据
data : {
"requestDate" : str
},
error : function() {
alert("登录失败,请与管理员联系")
},
success : function(data) {
var suc = data.succ;
if (suc == "false") {
alert("登录失败,请确认用户名与密码");
} else {
alert("登录成功")
window.location.href = "sy.do";
}
}
})
})
})
</script>
margin-left: 5px;
width: 70px;
}
</style>
</head>
<body>
<div class="section">
<span><var id="lang_tdBkColor"></var></span>
<input type="text" id="J_tone"/>
</div>
<script type="text/javascript">
var tone = $G("J_tone"),
colorPiker = new UE.ui.ColorPicker({
editor:editor
}),
colorPop = new UE.ui.Popup({
editor:editor,
content:colorPiker
});
domUtils.on(tone, "click", function () {
colorPop.showAnchor(tone);
});
domUtils.on(document, 'mousedown', function () {
colorPop.hide();
});
colorPiker.addListener("pickcolor", function () {
tone.value = arguments[1];
colorPop.hide();
});
colorPiker.addListener("picknocolor", function () {
tone.value="";
colorPop.hide();
});
dialog.onok=function(){
editor.execCommand("edittd",tone.value);
};
var start = editor.selection.getStart(),
cell = start && domUtils.findParentByTagName(start, ["td", "th"], true);
if(cell){
var color = domUtils.getComputedStyle(cell,'background-color');
if(/^#/.test(color)){
tone.value = color
}
}
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<tx:attributes>
<!--所有方法都是事务方法-->
<tx:method name="*"/>
<!--以get开始的所有方法-->
<tx:method name="get" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- -->
<!--Spring配置文件的核心点(数据源、与MyBatis的整合、事务控制-->
</beans>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!--SpringMVC的配置,包含网站跳转逻辑的控制配置-->
<context:component-scan base-package="org.shop" use-default-filters="false">
<!--只扫描控制器-->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"></context:include-filter>
</context:component-scan>
<!--配置视图解析器,方便页面返回-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!--两个标准配置-->
<!--将springmvc不能处理的请求交给tomcat-->
<mvc:default-servlet-handler />
<!--能支持springMVC的更高级的一些功能,JSP303校验,快捷的ajax。。映射动态请求-->
<mvc:annotation-driven />
<!-- 文件上传配置 -->
<bean name="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 默认编码 -->
<property name="defaultEncoding" value="UTF-8"/>
<!-- 上传文件大小限制为31M,31*1024*1024 -->
<property name="maxUploadSize" value="32505856"/>
<!-- 内存中的最大值 -->
<property name="maxInMemorySize" value="4096"/>
</bean>
</beans>
<?xml version="1.0" encoding="UTF-8"?>
}
@RequestMapping("tzcksh")
public String cksss(Model model) {
List list = s.cc(0);
model.addAttribute("list", list);
return "gly/cksh";
}
@RequestMapping("cksh")
public String cksh(int id, Sh sh, Hw hws, HttpSession session) throws ParseException {
Hw hsHw = new Hw();
String name = s.hwss(id).getHw();
hsHw = h.dys(name);
int ye = hsHw.getNumber();
int l = ye - s.hwss(id).getSl();
if(l < 0){
session.setAttribute("msg", "商品数量不足,请先去库存修改!");
return "error";
}
sh.setSh(1);
sh.setHw(s.hwss(id).getHw());
s.cksh(sh);
Sh ssSh = new Sh();
List list = s.hws(name);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH");
String time = df.format(System.currentTimeMillis());
hws.setDate(df.parse(time));
hws.setNumber(l);
hws.setName(name);
h.ckkk(hws);
return "redirect:tzcksh";
}
@RequestMapping("sb")
public String sb(int id, HttpSession session) {
s.jj(id);
return "redirect:tzcksh";
}
@RequestMapping("sbhw")
public String sbhw(int id, HttpSession session) {
h.jj(id);
return "redirect:tzrksh";
}
@Autowired
private HwService h;
@Autowired
private ShService s;
// login
@RequestMapping("tzlogin")
public String tzlogin() {
return "redirect:/";
}
// 登录验证
@ResponseBody
@RequestMapping("login")
public String login(User user, HttpSession session, String requestDate) {
Map map = new HashMap();
JSONObject requestJson = JSONObject.fromObject(requestDate);
map.put("name", requestJson.getString("name"));
map.put("password", requestJson.getString("password"));
user.setName(requestJson.getString("name"));
user.setPassword(requestJson.getString("password"));
User user2 = u.login(user);
if (user2 == null) {
Map reMap = new HashMap();
reMap.put("succ", "false");
JSONObject jsonObject = JSONObject.fromObject(reMap);
return jsonObject.toString();
} else {
if(user2.getT2() == 1){ // 状态不可用
Map reMap = new HashMap();
reMap.put("succ", "no_auth");
JSONObject jsonObject = JSONObject.fromObject(reMap);
return jsonObject.toString();
}
session.setAttribute("t2", user2.getT2());
session.setAttribute("id", user2.getId());
System.out.println("user2" + user2);
session.setAttribute("name", user2.getName());
session.setAttribute("user", user2);
session.setAttribute("t1", user2.getT1());
Map reMap = new HashMap();
reMap.put("succ", "true");
JSONObject jsonObject = JSONObject.fromObject(reMap);
return jsonObject.toString();
}
}
int id=(int) session.getAttribute("id");
User user = u.findid(id);
model.addAttribute("user", user);
return "cg/user";
}
//*************************************销售**************************************
@RequestMapping("tzckxs")
public String tzckxs(Model model, Hw hw) {
hw.setSh(1);
hw.setSj(1);
List list = h.sp(hw);
model.addAttribute("list", list);
return "xs/ckd";
}
@RequestMapping("ckidxs")
public String ckidxs(int id, Model model, HttpSession session) {
Hw list = h.dy(id);
int jj = list.getNumber();
session.setAttribute("jj", jj);
session.setAttribute("gg", list.getMoney());
model.addAttribute("list", list);
return "xs/ckl";
}
@RequestMapping("cklxs")
public String cklxs(Sh sh, HttpSession session, Hw hw) throws ParseException {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH");
String time = df.format(System.currentTimeMillis());
sh.setDate(df.parse(time));
sh.setSh(0);
float g = Float.valueOf(sh.getJg()) - Float.valueOf(sh.getMoney());
//int g = sh.getJg() - sh.getMoney();
BigDecimal jgBigDecimal = new BigDecimal(sh.getJg());
BigDecimal moneyBigDecimal = new BigDecimal(sh.getMoney());
BigDecimal subtract = jgBigDecimal.subtract(moneyBigDecimal);
//double g = Double.parseDouble() - Double.valueOf();
//System.out.println(g);
sh.setLr((subtract.multiply(new BigDecimal(sh.getSl())).doubleValue())+"");
System.out.println(subtract);
//sh.setLr((sh.getSl() * g)+"");
String name = (String) session.getAttribute("name");
sh.setZrr(name);
s.ck(sh);
return "redirect:tzckxs";
}
@RequestMapping("tzzups")
public String tzzups(Model model,HttpSession session) {
int id=(int) session.getAttribute("id");
User user = u.findid(id);
model.addAttribute("user", user);
return "xs/user";
int id=(int) session.getAttribute("id");
User user = u.findid(id);
model.addAttribute("user", user);
return "cg/user";
}
//*************************************销售**************************************
@RequestMapping("tzckxs")
public String tzckxs(Model model, Hw hw) {
hw.setSh(1);
hw.setSj(1);
List list = h.sp(hw);
model.addAttribute("list", list);
return "xs/ckd";
}
@RequestMapping("ckidxs")
public String ckidxs(int id, Model model, HttpSession session) {
Hw list = h.dy(id);
int jj = list.getNumber();
session.setAttribute("jj", jj);
session.setAttribute("gg", list.getMoney());
model.addAttribute("list", list);
return "xs/ckl";
}
@RequestMapping("cklxs")
public String cklxs(Sh sh, HttpSession session, Hw hw) throws ParseException {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH");
String time = df.format(System.currentTimeMillis());
sh.setDate(df.parse(time));
sh.setSh(0);
float g = Float.valueOf(sh.getJg()) - Float.valueOf(sh.getMoney());
//int g = sh.getJg() - sh.getMoney();
BigDecimal jgBigDecimal = new BigDecimal(sh.getJg());
BigDecimal moneyBigDecimal = new BigDecimal(sh.getMoney());
BigDecimal subtract = jgBigDecimal.subtract(moneyBigDecimal);
//double g = Double.parseDouble() - Double.valueOf();
//System.out.println(g);
sh.setLr((subtract.multiply(new BigDecimal(sh.getSl())).doubleValue())+"");
System.out.println(subtract);
//sh.setLr((sh.getSl() * g)+"");
String name = (String) session.getAttribute("name");
sh.setZrr(name);
s.ck(sh);
return "redirect:tzckxs";
}
@RequestMapping("tzzups")
public String tzzups(Model model,HttpSession session) {
<context:component-scan base-package="org.shop">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"></context:exclude-filter>
</context:component-scan>
<!--Spring的配置文件,这里主要配置和业务逻辑有关的-->
<!--数据源,事务控制。。-->
<context:property-placeholder location="classpath:dbconfig.properties"/>
<!--<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:dbconfig.properties"/>
</bean>-->
<bean id="pooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!--配置和MyBatis的整合-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--指定MyBatis的全局配置文件-->
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<property name="dataSource" ref="pooledDataSource"></property>
<!--指定mybatis的mapper配置文件-->
<property name="mapperLocations" value="classpath:mapper/*.xml"></property>
</bean>
<!--配置扫描器,将MyBatis接口的实现加入到ioc容器中-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--扫描所有dao接口的实现,加入到ioc容器中-->
<property name="basePackage" value="org.shop.dao"></property>
</bean>
<!-- -->
<!--事务控制的配置-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--控制住数据源-->
<property name="dataSource" ref="pooledDataSource"></property>
</bean>
<!--开启基于注解的事务,使用xml配置形式的事务(必要主要的都是使用配置式)-->
<aop:config>
<!--切入点表达式-->
<aop:pointcut expression="execution(* org.shop.service..*(..))" id="txPoint" />
<!--配置事务增强-->
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint" />
</aop:config>
<input type="tel" name="phone" class="textbox textbox_225" value="${hw.phone} " placeholder="联系电话..."/>
</li>
<li>
<span class="item_name" style="width:120px;"></span>
<input type="submit" class="link_btn" value="提交"/>
</li>
</ul>
</div>
</form>
</section>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--xmlns:context="http://www.springframework.org/schema/context"-->
<!--除了控制器都扫描,和SpringMVC相反-->
<context:component-scan base-package="org.shop">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"></context:exclude-filter>
</context:component-scan>
<!--Spring的配置文件,这里主要配置和业务逻辑有关的-->
<!--数据源,事务控制。。-->
<context:property-placeholder location="classpath:dbconfig.properties"/>
<!--<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:dbconfig.properties"/>
</bean>-->
<bean id="pooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!--配置和MyBatis的整合-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--指定MyBatis的全局配置文件-->
@Override
public User login(User user) {
// TODO Auto-generated method stub
return UserService.login(user);
}
@Override
public int touser(User user) {
// TODO Auto-generated method stub
return UserService.touser(user);
}
@Override
public List findall(User user ) {
// TODO Auto-generated method stub
return UserService.findall(user);
}
@Override
public int delete(int id) {
// TODO Auto-generated method stub
return UserService.delete(id);
}
@Override
public User findid(int id) {
// TODO Auto-generated method stub
return UserService.findid(id);
}
@Override
public int userup(User user) {
// TODO Auto-generated method stub
return UserService.userup(user);
}
}
public void setPhone(String phone) {
this.phone = phone;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public int getSj() {
return sj;
}
public void setSj(int sj) {
this.sj = sj;
}
public int getSh() {
return sh;
}
public void setSh(int sh) {
this.sh = sh;
}
public String getZrr() {
return zrr;
}
public void setZrr(String zrr) {
this.zrr = zrr;
}
public String getT5() {
return t5;
}
public void setT5(String t5) {
this.t5 = t5;
}
public String getT6() {
return t6;
}