【SSM】第三课 超市订单管理平台--供应商管理功能

概念

本文在上一文章之后完成供应商管理模块的实现。

需求分析

供应商管理:
1.如果是系统管理员,不具备操作供应商的功能
2.如果是经理,经理有权利去添加,删除,修改和查询供应商
3.如果是普通员工,查询供应商详情信息

功能实现

在home.jsp页面中,根据不同身份的员工登录之后,点击“供应商管理”按钮,触发一下JavaScript的点击事件:

function gysgl() {
		//先获得当前登录的用户的身份
		var input=document.getElementById("hidd");
		var i=input.value;
		switch (i) {
		case "2":
			//能和供应商直接对接的只能是经理身份
			//跳转至servlet--》调度业务逻辑层--》调度数据访问层--》数据库
			location.href="GetProviderList.do";
			break;
		case "3":
			//普通员工可以查看所有供应商信息,但不能添加,修改,删除供应商信息
			location.href="GetProviderList.do";
			break;
		default:
			//如果不是经理,那么都不允许操作该功能
			alert("当前登录的员工不具备该功能的操作权限");
			break;
		}
	}

这里我们只允许普通员工和经理操作供应商信息,管理员不具备权限。

普通员工只能查看所有供应商信息

在控制层包中创建ProviderController类,并定义GetProviderList.do虚拟地址,接收访问请求:

package com.smbms.controller;

import com.smbms.service.IProviderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpSession;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
public class ProviderController {
    @Autowired
    IProviderService pService;
    List<Map<String, Object>> providers=null;
    //定义方法,用于根据用户的身份完成供应商管理功能
    @RequestMapping("/GetProviderList.do")
    public ModelAndView GetProviderList(HttpSession session){
        ModelAndView mav=new ModelAndView();
        //获得登录者的个人信息
        Map<String,Object> m= (Map<String, Object>) session.getAttribute("userInfo");
        int userRole= (int) m.get("userRole");
        providers = pService.getProviders();
        mav.addObject("providers",providers);
        if (userRole==2){
            //经理
            mav.setViewName("providerList");
        }else {
            //普通员工,只能查看供应商信息
            mav.setViewName("providerList2");
        }
        return mav;
    }
    

}

在service层中创建IProviderService接口,定义获得所有供应商信息的方法:

package com.smbms.service;

import java.util.List;
import java.util.Map;

public interface IProviderService {
    List<Map<String,Object>> getProviders();

   
}

 在service层中创建ProviderServiceImp类,实现该接口的未实现的方法:

package com.smbms.service;

import com.smbms.dao.IProviderDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
@Service(value = "pService")
public class ProviderServiceImp implements IProviderService {
    @Autowired
    IProviderDao dao;
    @Override
    public List<Map<String, Object>> getProviders() {
        return dao.getProviders();
    }

   
}

在dao层中创建IProviderDao接口,编写sql语句完成查询供应商信息功能:

package com.smbms.dao;

import org.apache.ibatis.annotations.*;

import java.util.List;
import java.util.Map;

public interface IProviderDao {
    //查询所有的供应商信息
    @Select("select * from smbms_provider")
    List<Map<String,Object>> getProviders();

   
}

查询后的数据返回控制层,由控制器将数据通过ModelAndView发送给providerList2.jsp页面进行展示:

<%@page import="java.util.List"%>
<%@ page import="java.util.Map" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>超市订单管理系统--供应商列表</title>
</head>
<body>
	<div style="width: 1680px;height: 1000px;margin: auto;">
		<div style="width: 100%;height: 160px;background-color:skyblue;">
			<div  style="width: 100%;height: 20px;">
			
				<div align="left" style="width: 20%;height: 100%;float: left;" >
					&nbsp;<a href="home.do" style="text-decoration: none;">返回首页</a>
				</div>
			
			<div align="right" style="width: 80%;height: 100%;float: right;">
				<a>欢迎,<span style="color: red;">${userInfo.userName}</span></a>
				&nbsp;&nbsp;<a href="index.do" style="text-decoration: none;">注销</a>&nbsp;
			</div>
			
			</div>
			<div align="center" style="width: 100%;height: 140px;line-height: 140px;"><h1>超市订单管理系统</h1></div>
		</div>
		<div align="center" style="width: 100%;height: 840px;background-color: pink;overflow: scroll;">
			<table border="1" style="width: 90%;text-align: center;height: 800px;border-collapse: collapse;">
				<tr>
					<td>主键Id</td>
					<td>供应商编码</td>
					<td>供应商名称</td>
					<td>供应商详细描述</td>
					<td>供应商联系人</td>
					<td>联系电话</td>
					<td>地址</td>
					<td>传真</td>
				</tr>
				<%  List<Map<String,Object>> list=(List<Map<String,Object>>)request.getAttribute("providers"); %>
				<% for(int i=0;i<list.size();i++){ %>
					<tr>
					<td ><%=list.get(i).get("id") %></td>
					<td><%=list.get(i).get("proCode") %></td>
					<td><%=list.get(i).get("proName") %></td>
					<td ><p style="text-overflow: ellipsis;
					overflow: hidden;white-space: nowrap;
					width: 260px;"><%=list.get(i).get("proDesc") %></p>
					</td>
					<td><%=list.get(i).get("proContact") %></td>
					<td><%=list.get(i).get("proPhone") %></td>
					<td><%=list.get(i).get("proAddress")%></td>
					<td><%=list.get(i).get("proFax") %></td>
				</tr>
				<%} %>
			</table>
		
		</div>
	</div>
</body>
</html>

其页面效果如下:

经理操作供应商管理功能查看信息

经理和普通员工都具备查阅供应商信息的权限,因此在控制层中直接调用service中的方法即可,无需在重复编写方法接口,则经理操作的时候,将数据发送给providerList.jsp页面进行展示,并且提供,添加供应商,修改,删除供应商的功能操作。

<%@page import="java.util.List"%>
<%@ page import="java.util.Map" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>超市订单管理系统--供应商列表</title>
</head>
<body>
	<div style="width: 1680px;height: 1000px;margin: auto;">
		<div style="width: 100%;height: 160px;background-color:skyblue;">
			<div  style="width: 100%;height: 20px;">
			
				<div align="left" style="width: 20%;height: 100%;float: left;" >
					&nbsp;<a href="home.do" style="text-decoration: none;">返回首页</a>
				</div>
			
			<div align="right" style="width: 80%;height: 100%;float: right;">
				<a>欢迎,<span style="color: red;">${userInfo.userName}</span></a>
				&nbsp;&nbsp;<a href="index.do" style="text-decoration: none;">注销</a>&nbsp;
			</div>
			
			</div>
			<div align="center" style="width: 100%;height: 140px;line-height: 140px;"><h1>超市订单管理系统</h1></div>
		</div>
		<div align="center" style="width: 100%;height: 840px;background-color: pink;overflow: scroll;">
			<div align="left" style="height: 40px;" >
				<a href="addProvider.do" style="text-decoration: none;
				 text-align:center;  width: 50px;
				 height: 20px;
				 color: white;font-weight: bold;
				 margin-top:20px;margin-left:10px;
				 border-radius: 5px;">添加供应商</a>
			</div>
			<table border="1" style="width: 90%;text-align: center;height: 800px;border-collapse: collapse;">
				<tr>
					<td>主键Id</td>
					<td>供应商编码</td>
					<td>供应商名称</td>
					<td>供应商详细描述</td>
					<td>供应商联系人</td>
					<td>联系电话</td>
					<td>地址</td>
					<td>传真</td>
					<td>操作</td>
				</tr>
				<%  List<Map<String,Object>> list=(List<Map<String,Object>>)request.getAttribute("providers"); %>
				<% for(int i=0;i<list.size();i++){ %>
					<tr>
					<td ><%=list.get(i).get("id") %></td>
					<td><%=list.get(i).get("proCode") %></td>
					<td><%=list.get(i).get("proName") %></td>
					<td ><p style="text-overflow: ellipsis;
					overflow: hidden;white-space: nowrap;
					width: 260px;"><%=list.get(i).get("proDesc") %></p>
					</td>
					<td><%=list.get(i).get("proContact") %></td>
					<td><%=list.get(i).get("proPhone") %></td>
					<td><%=list.get(i).get("proAddress")%></td>
					<td><%=list.get(i).get("proFax") %></td>
					<td>
					<a href="GetProvider.do?index=<%=i%>"><input type="button" value="修改" style="background-color: green;border: none;border-radius: 5px;color: white;"></a>
					<a href="DeleteProvider.do?id=<%=list.get(i).get("id") %>"><input type="button" value="删除" style="background-color: red;border: none;border-radius: 5px;color: white;"></a>
					</td>
				</tr>
				<%} %>
			</table>
		
		</div>
	</div>
</body>
</html>

 页面效果如图:

经理添加供应商信息 

当经理点击添加供应商,向控制器发出请求addProvider.do,那么在控制器中定义方法接收该请求:

//定义方法,用于接收添加供应商的虚拟地址,用于跳转至提那家供应商页面
    @RequestMapping("/addProvider.do")
    public String addProvider(){
        return "addProvider";
    }

即跳转至添加供应商的页面,其代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>超市订单管理系统--添加供应商</title>
</head>
<body>
	<div style="width: 1200px;height: 800px;margin: auto;">
		<div style="width: 100%;height: 160px;background-color:skyblue;">
			<div  style="width: 100%;height: 20px;">
			
				<div align="left" style="width: 20%;height: 100%;float: left;" >
					&nbsp;<a href="home.do" style="text-decoration: none;">返回首页</a>
				</div>
			
			<div align="right" style="width: 80%;height: 100%;float: right;">
				<a>欢迎,<span style="color: red;">${userInfo.userName}</span></a>
				&nbsp;&nbsp;<a href="index.do" style="text-decoration: none;">注销</a>&nbsp;
			</div>
			
			</div>
			<div align="center" style="width: 100%;height: 140px;line-height: 140px;"><h1>超市订单管理系统</h1></div>
		</div>
		<div align="center" style="width: 100%;height: 640px;background-color: pink;">
			<form action="toAddProvider.do" method="post">
				<div style="padding: 5px 0px">
				<label for="proCode">供应商编码:</label>&nbsp;
				<input id="proCode" name="proCode" type="text" placeholder="请输入供应商编码" />
				</div>
				<div style="padding: 5px 0px">
				<label for="proName">供应商名称:</label>&nbsp;
				<input id="proName" name="proName" type="text" placeholder="请输入供应商名称" />
				</div>
				<div style="padding: 5px 0px">
				<label >供应商详细描述:</label><br/>
				<textarea rows="5" cols="40" name="proDesc" placeholder="请输入主营产品内容"></textarea>
				</div>
				<div style="padding: 5px 0px">
				<label >供应商联系人:</label>&nbsp;
				<input type="text" name="proContact" placeholder="请输入联系人姓名">
				</div>
				<div style="padding: 5px 0px">
				<label >联系电话:</label>&nbsp;
				<input type="number" name="proPhone" placeholder="请输入手机号" >
				</div>
				<div style="padding: 5px 0px">
				<label >地址:</label>&nbsp;
				<input type="text" name="proAddress" placeholder="请输入地址" >
				</div>
				<div style="padding: 5px 0px">
				<label >传真:</label>&nbsp;
				<input type="text" name="proFax" placeholder="请输入传真号码" >
				</div>
				<div style="padding: 5px 0px">
					<input type="submit"
					  value="添加" 
					 style="width: 120px;background-color: green;
					 border: none;padding: 5px;border-radius: 5px;
					 color: white;"/>
				</div>
			</form>
			
		
		</div>
	</div>
</body>
</html>

效果图如下:

当经理填写新供应商信息之后,点击添加按钮将数据通过post发送 toAddProvider.do请求,因此我们需要在控制层中定义方法接收该请求以及数据信息:

//定义方法,接收添加供应商页面发送过来的新供应商的信息
    @RequestMapping(value = "/toAddProvider.do",
    params = {"proCode","proName","proDesc","proContact","proPhone","proAddress","proFax"})
    public String toAddProvider(String proCode,String proName,String proDesc,
                               String proContact,String proPhone,
                               String proAddress,String proFax,HttpSession session ){
        //定义Map集合,将数据封装,便于传输
        Map<String,Object> map=new HashMap<>();
        map.put("proCode",proCode);//编号
        map.put("proName",proName);//名称
        map.put("proDesc",proDesc);//主营业务
        map.put("proContact",proContact);//联系人
        map.put("proPhone",proPhone);//联系电话
        map.put("proAddress",proAddress);//地址
        map.put("proFax",proFax);//传真
        //获得经理的id,表示该新供应商是由这个经理添加的
        long id= (long) ((Map<String,Object>)session.getAttribute("userInfo")).get("id");
        map.put("createdBy",id);
        map.put("creationDate",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
                .format(new Date()));
        int i = pService.add(map);
        String url="";
        if (i>0)
            //添加供应商成功
            url="redirect:GetProviderList.do";
        return url;
    }

控制层接收到新的供应商信息之后,将其进行封装成Map集合,然后发送给service层,因此我们需要在service的接口中定义接收数据的方法:

//添加供应商
    int add(Map<String,Object> map);

在service实现类中实现该方法:

@Override
    public int add(Map<String, Object> map) {
        return dao.add(map);
    }

并将封装的数据发送给dao层中的接口,通过Mybatis框架完成添加的sql语句,并将返回值返回:

//添加供应商
    @Insert("insert into smbms_provider(proCode,proName,proDesc," +
            "proContact,proPhone,proAddress,proFax,createdBy,creationDate) " +
            "values(#{proCode},#{proName},#{proDesc}," +
            "#{proContact},#{proPhone},#{proAddress}," +
            "#{proFax},#{createdBy},#{creationDate})")
    int add(Map<String,Object> map);

添加成功后,需同步刷新页面,可以看到列表上有新的供应商信息的显示,则表示添加成功。

经理操作修改供应商信息

在供应商列表显示页面,选择要修改的供应商进行点击修改按钮,则将该供应商对应的下标通过发送请求携带下标值发送给控制器,

<a href="GetProvider.do?index=<%=i%>"><input type="button" value="修改" style="background-color: green;border: none;border-radius: 5px;color: white;"></a>
					

控制器中需定义方法接收该请求以及下标的值,并根据下标从集合中获得要修改的供应商信息,

//定义方法,获得下标,用于找到要修改的供应商信息,并显示在修改页面上
    @RequestMapping("/GetProvider.do")
    public ModelAndView GetProvider(@RequestParam int index){
        Map<String, Object> map = providers.get(index);
        ModelAndView mav=new ModelAndView();
        mav.addObject("map",map);
        mav.setViewName("updateProvider");
        return mav;
    }

并将信息发送到修改页面上供用户进行修改:

<%@ page import="java.util.Map" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
		 pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>超市订单管理系统--修改供应商</title>
</head>
<body>
	<div style="width: 1200px;height: 800px;margin: auto;">
		<div style="width: 100%;height: 160px;background-color:skyblue;">
			<div  style="width: 100%;height: 20px;">
			
				<div align="left" style="width: 20%;height: 100%;float: left;" >
					&nbsp;<a href="home.do" style="text-decoration: none;">返回首页</a>
				</div>
			
			<div align="right" style="width: 80%;height: 100%;float: right;">
				<a>欢迎,<span style="color: red;">${userInfo.userName}</span></a>
				&nbsp;&nbsp;<a href="index.do" style="text-decoration: none;">注销</a>&nbsp;
			</div>
			
			</div>
			<div align="center" style="width: 100%;height: 140px;line-height: 140px;"><h1>超市订单管理系统</h1></div>
		</div>
		<% Map<String,Object> provider=(Map<String,Object>)request.getAttribute("map"); %>
		<div align="center" style="width: 100%;height: 640px;background-color: pink;">
			<form action="UpdateProvider.do" method="post">
				<!-- 完成修改功能的时候,需要将主键id隐藏存储在表单页面上
					因为在完成修改的sql语句的同时,是需要条件,只有主键id是不允许被修改的,
					那么能作为条件去修改数据库表中的数据只有主键id
				 -->
				<input type="hidden" name="id" value="<%=provider.get("id") %>">
				<div style="padding: 5px 0px">
				<label for="proCode">供应商编码:</label>&nbsp;
				<input id="proCode" name="proCode" value="<%=provider.get("proCode") %>" type="text" placeholder="请输入供应商编码" />
				</div>
				<div style="padding: 5px 0px">
				<label for="proName">供应商名称:</label>&nbsp;
				<input id="proName" name="proName" value="<%=provider.get("proName") %>" type="text" placeholder="请输入供应商名称" />
				</div>
				<div style="padding: 5px 0px">
				<label >供应商详细描述:</label><br/>
				<textarea rows="5" cols="40" name="proDesc"  placeholder="请输入主营产品内容"><%=provider.get("proDesc") %></textarea>
				</div>
				<div style="padding: 5px 0px">
				<label >供应商联系人:</label>&nbsp;
				<input type="text" name="proContact" value="<%=provider.get("proContact") %>" placeholder="请输入联系人姓名">
				</div>
				<div style="padding: 5px 0px">
				<label >联系电话:</label>&nbsp;
				<input type="number" name="proPhone" value="<%=provider.get("proPhone") %>" placeholder="请输入手机号" >
				</div>
				<div style="padding: 5px 0px">
				<label >地址:</label>&nbsp;
				<input type="text" name="proAddress" value="<%=provider.get("proAddress") %>" placeholder="请输入地址" >
				</div>
				<div style="padding: 5px 0px">
				<label >传真:</label>&nbsp;
				<input type="text" name="proFax" value="<%=provider.get("proFax") %>" placeholder="请输入传真号码" >
				</div>
				<div style="padding: 5px 0px">
					<input type="submit"
					  value="修改供应商信息" 
					 style="background-color: green;
					 border: none;padding: 5px;border-radius: 5px;
					 color: white;"/>
				</div>
			</form>
			
		
		</div>
	</div>
</body>
</html>

其效果图如下:

当经理修改信息后,将修改后的数据信息发送给UpdateProvider.do请求给控制器,并使用post请求传输数据,控制器中定义方法接收:

//定义方法,获得修改供应商页面发送过来的更新后的供应商信息
    @RequestMapping(value = "/UpdateProvider.do",
            params = {"id","proCode","proName","proDesc","proContact","proPhone","proAddress","proFax"})
    public String UpdateProvider(long id,String proCode,String proName,String proDesc,
                                 String proContact,String proPhone,
                                 String proAddress,String proFax,HttpSession session){
        //定义Map集合,将数据封装,便于传输
        Map<String,Object> map=new HashMap<>();
        map.put("id",id);
        map.put("proCode",proCode);//编号
        map.put("proName",proName);//名称
        map.put("proDesc",proDesc);//主营业务
        map.put("proContact",proContact);//联系人
        map.put("proPhone",proPhone);//联系电话
        map.put("proAddress",proAddress);//地址
        map.put("proFax",proFax);//传真
        //获得经理的id,表示该新供应商是由这个经理添加的
        long userid= (long) ((Map<String,Object>)session.getAttribute("userInfo")).get("id");
        map.put("modifyBy",userid);
        map.put("modifyDate",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
                .format(new Date()));
        int i = pService.update(map);
        String url="";
        if (i>0)
            //修改成功,刷新页面
            url="redirect:GetProviderList.do";
        return url;
    }

 控制器将接收的数据封装成Map集合后,发送给service接口:

//修改供应商
    int update(Map<String,Object> map);

并在service实现类中实现给方法:

@Override
    public int update(Map<String, Object> map) {
        return dao.update(map);
    }

并将所有数据发送给dao层的接口完成修改sql语句,更新至数据库的数据:

//修改供应商
    @Update("update smbms_provider set proCode=#{proCode},proName=#{proName}," +
            "proDesc=#{proDesc},proContact=#{proContact},proPhone=#{proPhone}," +
            "proAddress=#{proAddress},proFax=#{proFax},modifyBy=#{modifyBy}," +
            "modifyDate=#{modifyDate} where id=#{id}")
    int update(Map<String,Object> map);

如果修改成功,则会将int返回值给控制器,控制器根据判断返回值进行重定向跳转页面,刷新供应商列表页面。

经理删除解除合同的供应商信息

在供应商列表页面选择需要删除的供应商的删除按钮,发送请求给控制器,并携带该供应商的主键id:

<a href="DeleteProvider.do?id=<%=list.get(i).get("id") %>"><input type="button" value="删除" style="background-color: red;border: none;border-radius: 5px;color: white;"></a>
					

那么控制器中定义方法接收该请求,并获得主键id,发送给service接口:

//定义方法,用于根据id作为条件删除对应的供应商信息
    @RequestMapping("/DeleteProvider.do")
    public String DeleteProvider(@RequestParam long id){
        int i = pService.del(id);
        String url="";
        if (i>0)
            //删除成功,刷新页面
            url="redirect:GetProviderList.do";
        return url;
    }

在service接口中定义方法:

//删除供应商
    int del(long id);

在service实现类中实现该方法:

@Override
    public int del(long id) {
        return dao.del(id);
    }

在dao层中完成删除供应商的sql语句操作,并将结果的int类型值返回给控制器:

//删除供应商
    @Delete("delete from smbms_provider where id=#{id}")
    int del(@Param("id")long id);

控制器判断返回值进行刷新列表页面,即完成删除功能。

总结

该模块的功能完成与上文的用户管理模块类似,可以加深读者对MVC架构以及Sql语句的操作。后期文章将介绍订单管理模块的实现步骤!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笔触狂放

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值