使用Maven基于ssm框架的完整商务管理开发项目(02)

首先要完成的是基本信息中的生产厂家功能。

生产厂家业务

功能:

在货物模块和附近模块,它们都有个生产厂家,讲生产厂家信息提出,成为一个单独的表。

 

《需求说明书》

生产厂家表 FACTORY_C(_C业务后缀)

序号                 

 名称

代码

是否主键       

类型(长度)

说明

1.          

编号                

FACTORY_ID

VARCHAR2(40)

UUID

2.          

全称

FULL_NAME

VARCHAR2(200)

对应客户比较模糊,翻倍2到4倍

3.          

简称

FACTORY_NAME

VARCHAR2(50)

 

4.          

联系人

CONTACTS

VARCHAR2(30)

人名20/30

5.          

电话

PHONE

VARCHAR2(20)

 

6.          

手机

MOBILE

VARCHAR2(20)

 

7.          

传真

FAX

VARCHAR220)

 

8.          

验货员

INSPECTOR

VARCHAR2(30)

 

9.          

排序号

ORDER_NO

INT

 

10.      

备注

CNOTE

VARCHAR2(500)

如果感觉它可能和关键字冲突,给它加个C前缀

11.      

创建人

CREATE_BY

VARCHAR2(40)

权限字段,登陆人ID

12.      

创建部门

CREATE_DEPT

VARCHAR2(40)

登陆人所在部门的ID

13.      

创建时间

CREATE_TIME

TIMESTAMP

 

 

注意:在这里我选用的id类型为varchar2 类型,

INT/LONG 都是一般表示自增,根据业务记录数来决定

STRING   UUID,业务自己定义的规则xxyyzz,每两位为一层,省市县,部门


接着是数据库建模

这里我使用PowerDesigner进行数据库表的设计

关于这个软件的使用,将在相对应的文章中进行详细描写,这里不再进行赘述。

使用Maven基于ssm框架的完整商务管理开发项目(02)_第1张图片

使用Maven基于ssm框架的完整商务管理开发项目(02)_第2张图片


接着就是创建相应的实体类Factory

package com.wakev.xx.domain;

public class Factory {
	private String id;		//主键映射时,都映射成id,跟数据库表的不同factory_id
	private String fullName;
	private String factoryName;
	private String contacts;
	private String phone;
	private String mobile;
	private String fax;
	private String inspector;
	private String cnote;
	private Integer orderNo;
	
	private String createBy;
	private String createDept;
	private java.util.Date createTime;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getFullName() {
		return fullName;
	}
	public void setFullName(String fullName) {
		this.fullName = fullName;
	}
	public String getFactoryName() {
		return factoryName;
	}
	public void setFactoryName(String factoryName) {
		this.factoryName = factoryName;
	}
	public String getContacts() {
		return contacts;
	}
	public void setContacts(String contacts) {
		this.contacts = contacts;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	public String getMobile() {
		return mobile;
	}
	public void setMobile(String mobile) {
		this.mobile = mobile;
	}
	public String getFax() {
		return fax;
	}
	public void setFax(String fax) {
		this.fax = fax;
	}
	public String getInspector() {
		return inspector;
	}
	public void setInspector(String inspector) {
		this.inspector = inspector;
	}
	public String getCnote() {
		return cnote;
	}
	public void setCnote(String cnote) {
		this.cnote = cnote;
	}
	public Integer getOrderNo() {
		return orderNo;
	}
	public void setOrderNo(Integer orderNo) {
		this.orderNo = orderNo;
	}
	public String getCreateBy() {
		return createBy;
	}
	public void setCreateBy(String createBy) {
		this.createBy = createBy;
	}
	public String getCreateDept() {
		return createDept;
	}
	public void setCreateDept(String createDept) {
		this.createDept = createDept;
	}
	public java.util.Date getCreateTime() {
		return createTime;
	}
	public void setCreateTime(java.util.Date createTime) {
		this.createTime = createTime;
	}

	
}

创建相对应的FactoryMapper.xml文件并且完成查询功能





	
		
		
		
		
		
		
		
		
		
		
		
		
		
		
	
	
	
	
 
  

接着开始完善Dao层。创建FactoryDao并继承BaseDao接口

package com.wakev.xx.dao;


import com.wakev.xx.domain.Factory;

public interface FactoryDao extends BaseDao {

}
实现类FactoryDaoImpl继承BaseDaoImpl并实现FactoryDao接口

package com.wakev.xx.dao.impl;

import org.springframework.stereotype.Repository;

import com.wakev.xx.dao.FactoryDao;
import com.wakev.xx.domain.Factory;

@Repository
public class FactoryDaoImpl extends BaseDaoImpl implements FactoryDao {
	//利用默认构造方法初始化命名空间
	public FactoryDaoImpl() {
		super.setNs("com.wakev.xx.mapper.FactoryMapper");
	}
}

接着是Service层

首先FactoryService接口

package com.wakev.xx.service;
import java.io.Serializable;
import java.util.List;
import java.util.Map;

import com.wakev.xx.domain.Factory;
import com.wakev.xx.pagination.Page;


public interface FactoryService {
	public List findPage(Page page);		//分页查询
	public List find(Map paraMap);			//带条件查询,条件可以为null,既没有条件;返回list对象集合
	public Factory get(Serializable id);			//只查询一个,常用于修改
	public void insert(Factory entity);			//插入,用实体作为参数
	public void update(Factory entity);			//修改,用实体作为参数
	public void deleteById(Serializable id);		//按id删除,删除一条;支持整数型和字符串类型ID
	public void delete(Serializable[] ids);			//批量删除;支持整数型和字符串类型ID


}

FactoryServiceImpl实现类

package com.wakev.xx.service.impl;

import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.wakev.xx.dao.FactoryDao;
import com.wakev.xx.pagination.Page;
import com.wakev.xx.service.FactoryService;


@Service
public class FactoryServiceImpl implements FactoryService {
	@Resource
	FactoryDao factoryDao;

	@Override
	public List findPage(Page page) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List find(Map paraMap) {
		return factoryDao.find(paraMap);
	}

	@Override
	public com.wakev.xx.domain.Factory get(Serializable id) {
		return factoryDao.get(id);
	}

	@Override
	public void insert(com.wakev.xx.domain.Factory entity) {
	}
	
	@Overridepublic 
	void update(com.wakev.xx.domain.Factory entity) {
	return null;
	}@Overridepublic 
	void deleteById(Serializable id) {
	return null;
	}@Overridepublic void delete(Serializable[] ids) {
	return null;
	}
}

 
  

 
  接着是Controller层。 
  FactoryController 继承BaseController(不一定要继承) 
  

package com.wakev.xx.controller.basicinfo.factory;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.wakev.xx.controller.BaseController;
import com.wakev.xx.domain.Factory;
import com.wakev.xx.service.FactoryService;

@Controller
public class FactoryController extends BaseController {
	@Resource
	FactoryService factoryService;
	
	//查询
	@RequestMapping("/basicinfo/factory/list.action")
	public String list(Model model){
		List dataList = factoryService.find(null);
		model.addAttribute("dataList", dataList);
		
		return "/basicinfo/factory/jFactoryList.jsp";
	}
}

 
  接着创建相应的页面jsp 
  

在WEB-INF--->  pages--->basicinfo--->factory--->jFactoryList.jsp

使用Maven基于ssm框架的完整商务管理开发项目(02)_第3张图片

修改list部分


	

这里简单提一下整个框架的执行顺序:

首先是在url 输入

1)http://localhost:8080/xx后执行

http://localhost/xx/index.jsp

2)在Jsp中利用js跳转

           window.location.href ="home.action";           //javascript页面跳转

3)  在homeController中跳转,转入登陆页面

@Controller
public class HomeController {

	//系统首页模块
	
	@RequestMapping(value={"/home.action"})		//配合web下/
	public String login(){
		
		return "/index.jsp";			//首页,删除根目录下index.jsp,否则上面url将被拦截进不来
	}

4)  在pages/index.jsp中利用按钮提交,fmain.action

	@RequestMapping(value="/fmain.action")
	public String fmain(){
		return "/home/fmain.jsp";


接下来完成Factory的insert插入功能

首先在FactoryMapper中添加


	
		insert into FACTORY_C
		(FACTORY_ID,FULL_NAME,FACTORY_NAME,CONTACTS,PHONE,MOBILE,FAX,INSPECTOR,CNOTE,ORDER_NO,CREATE_BY,CREATE_DEPT,CREATE_TIME)
		values
		(
		#{id,jdbcType=VARCHAR},
		#{fullName,jdbcType=VARCHAR},
		#{factoryName,jdbcType=VARCHAR},
		#{contacts,jdbcType=VARCHAR},
		#{phone,jdbcType=VARCHAR},
		#{mobile,jdbcType=VARCHAR},
		#{fax,jdbcType=VARCHAR},
		#{inspector,jdbcType=VARCHAR},
		#{cnote,jdbcType=VARCHAR},
		#{orderNo,jdbcType=INTEGER},

		#{createBy,jdbcType=VARCHAR},
		#{createDept,jdbcType=VARCHAR},
		#{createTime,jdbcType=TIMESTAMP}
		)
	

由于dao层跟service层都已经实现了这个方法,所以现在只要在Controller层进行完善

在FactoryController中添加新增功能

//转向新增页面
	@RequestMapping("/basicinfo/factory/tocreate.action")
	public String tocreate(){
		return "/basicinfo/factory/jFactoryCreate.jsp";
	}
	
	//新增保存
	@RequestMapping("/basicinfo/factory/insert.action")
	public String insert(Factory factory){
		factoryService.insert(factory);
		
		return "redirect:/basicinfo/factory/list.action";
	}

创建对应的JfactoryCreate.jsp页面

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ include file="../../base.jsp"%>


    wakev商务管理系统


新增生产厂家信息
序号 厂家全称 缩写 联系人 电话 手机 传真 验货员
${status.index+1} ${o.fullName} ${o.factoryName} ${o.contacts} ${o.phone} ${o.mobile} ${o.fax} ${o.inspector}
排序号: 验货员:
厂家名称: 简称:
联系人: 电话:
手机: 传真:
备注:

在jFactoryList.jsp页面添加 “”新增” 按钮

  • 新增

  • 其中的FormSubmit按钮封装了一个函数

    /* 打开一个新页面:调用时不加第二个参数 add by wakev*/
    function formSubmit (url,sTarget){
        document.forms[0].target = sTarget
        document.forms[0].action = url;
        document.forms[0].submit();
        return true;
    }
    


    测试一下,插入功能到这个开发完成。


    接着完成 修改 功能

    在FactoryMapper中添加

    
    	
    
    	
    		update FACTORY_C
    		
    			FULL_NAME=#{fullName,jdbcType=VARCHAR},
    			FACTORY_NAME=#{factoryName,jdbcType=VARCHAR},
    			CONTACTS=#{contacts,jdbcType=VARCHAR},
    			PHONE=#{phone,jdbcType=VARCHAR},
    			MOBILE=#{mobile,jdbcType=VARCHAR},
    			FAX=#{fax,jdbcType=VARCHAR},
    			INSPECTOR=#{inspector,jdbcType=VARCHAR},
    			CNOTE=#{cnote,jdbcType=VARCHAR},
    			ORDER_NO=#{orderNo,jdbcType=INTEGER},
    
    			CREATE_BY=#{createBy,jdbcType=VARCHAR},
    			CREATE_DEPT=#{createDept,jdbcType=VARCHAR},
    			CREATE_TIME=#{createTime,jdbcType=TIMESTAMP},
    		
    		where FACTORY_ID=#{id}
    	
    

    dao层因为继承了BaseDao,所以不用进行修改

    直接修改Service层,在FactoryServiceImpl实现类中修改

    	@Override
    	public void update(com.wakev.xx.domain.Factory entity) {
    		factoryDao.update(entity);
    	}
    	@Override
    	public com.wakev.xx.domain.Factory get(Serializable id) {
    		return factoryDao.get(id);
    	}
    

    这里的id 类型选用Serializable是因为更加灵活  既可以用int 也可以String


    接着改Controller层,添加方法和注解

    	//转向修改页面
    	@RequestMapping("/basicinfo/factory/toupdate.action")
    	public String toupdate(String id, Model model){
    		Factory obj = factoryService.get(id);
    		model.addAttribute("obj", obj);
    		
    		return "/basicinfo/factory/jFactoryUpdate.jsp";
    	}
    	
    	//修改保存
    	@RequestMapping("/basicinfo/factory/update.action")
    	public String update(Factory factory){
    		factoryService.update(factory);
    		
    		return "redirect:/basicinfo/factory/list.action";
    	}
    

    接着完成相对应的页面

    JFactoryUpdate.jsp

    <%@ page language="java" pageEncoding="UTF-8"%>
    <%@ include file="../../base.jsp"%>
    
    
        wakev商务管理系统
    
    
    
    修改生产厂家信息
    排序号: 验货员:
    厂家名称: 简称:
    联系人: 电话:
    手机: 传真:
    备注:

    测试一下,到这里修改功能也完成了


    接下来完成删除功能

    在FactoryMapper.xml中

    	
    	
    		delete from FACTORY_C
    		where FACTORY_ID=#{pid}
    	
    
    	
    	
    		delete from FACTORY_C
    		where FACTORY_ID in
    		
    			#{id}
    		
    	
    


    FactoryServiceImpl完善

    	@Override
    	public void deleteById(Serializable id) {
    		factoryDao.deleteById(id);
    	}
    
    	@Override
    	public void delete(Serializable[] ids) {
    		factoryDao.delete(ids);
    	}

    接着去完添加FactoryController中的方法

    		//删除单条
    		@RequestMapping("/basicinfo/factory/deleteById.action")
    		public String deleteById(String id){
    			factoryService.deleteById(id);
    			
    			return "redirect:/basicinfo/factory/list.action";
    		}
    		
    		//批量删除
    		@RequestMapping("/basicinfo/factory/delete.action")
    		public String delete(@RequestParam("id")String[] ids){
    			factoryService.delete(ids);
    			
    			return "redirect:/basicinfo/factory/list.action";
    		}
    

    删除玩直接跳转到list页面,所以只需要在在相应的List页面中添加对应的按钮

  • 删除
  • 删多条

  • 测试一下,删除功能到这里也完成。



    做到这里,可以开发加入log4j了,

    创建log4j.properties放在resource目录下

    log4j.rootLogger=DEBUG, stdout
    
    #Console
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%-5p - %m%n
    
    #LogFile
    log4j.appender.file=org.apache.log4j.FileAppender
    log4j.appender.file.File=../logs/jklog.log
    log4j.appender.file.layout=org.apache.log4j.PatternLayout
    log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
    
    
    log4j.logger.org.apache=INFO
    log4j.logger.com.wakev.xx=DEBUG
    

    关于 Log4j 的使用这里不再赘述


    接着我们给Factory完成 查看功能

    因为mapper上之前已经添加过了,所以直接在controller上添加这个功能。

    	//查看
    	@RequestMapping("/basicinfo/factory/toview.action")
    	public String toview(String id, Model model){
    		Factory obj = factoryService.get(id);
    		model.addAttribute("obj", obj);
    		
    		return "/basicinfo/factory/jFactoryView.jsp";
    	}
    

    创建对应的查看页面 jFactoryView.jsp ,可以复制 jFactoryUpdate.jsp 页面进行修改。

    <%@ page language="java" pageEncoding="UTF-8"%>
    <%@ include file="../../base.jsp"%>
    
    
        wakev商务管理系统
    
    
    
    浏览生产厂家信息
    排序号: ${obj.orderNo} 验货员: ${obj.inspector}
    厂家名称: ${obj.fullName} 简称: ${obj.factoryName}
    联系人: ${obj.contacts} 电话: ${obj.phone}
    手机: ${obj.mobile} 传真: ${obj.fax}
    备注:
    ${obj.cnote}

    接着list中添加对应的按钮,之前好像已经有了?

  • 查看

  • 接着测试,这个查询功能也完成了。

    到这里,基本的增删改查功能都完成了。

    接着完成一个Factory更进一步的功能。


    业务:启用,停用

    功能:合作生产厂家突然有一天它以次品冒充优质品,公司不再跟这个厂家进行合作。

    在货物中生产厂家选择框,不能选择这个不再合作的厂家。

    在系统中不能直接删除这个厂家,因为我们的历史数据中含有对这个生产厂家的引用。软件是采用“伪删除”方式来解决。

    实际是在数据库表中加入列,作为标识,标识厂家是否可以被引用。0停用1启用。

    新增厂家默认1,可以修改某个厂家为停用。在货物中选择厂家的下拉列表,只显示为启用。


    数据库表是没有boolean,

    Mysql      tinyint

    Oracle     number(1)

    实际项目中也可以设置为Char(1)


    在数据库中给FACTORY_C表添加列state

    Oracle数据库设置类型为char(1),

    mysql数据库设置为tinyint,


    接着在FactoryMapper中添加


    修改“新增”方法

    	
    	
    		insert into FACTORY_C
    		(FACTORY_ID,FULL_NAME,FACTORY_NAME,CONTACTS,PHONE,MOBILE,FAX,INSPECTOR,CNOTE,ORDER_NO,STATE,CREATE_BY,CREATE_DEPT,CREATE_TIME)
    		values
    		(
    			#{id,jdbcType=VARCHAR},
    			#{fullName,jdbcType=VARCHAR},
    			#{factoryName,jdbcType=VARCHAR},
    			#{contacts,jdbcType=VARCHAR},
    			#{phone,jdbcType=VARCHAR},
    			#{mobile,jdbcType=VARCHAR},
    			#{fax,jdbcType=VARCHAR},
    			#{inspector,jdbcType=VARCHAR},
    			#{cnote,jdbcType=VARCHAR},
    			#{orderNo,jdbcType=INTEGER},
    			#{state,jdbcType=INTEGER},
    			
    			#{createBy,jdbcType=VARCHAR},
    			#{createDept,jdbcType=VARCHAR},
    			#{createTime,jdbcType=TIMESTAMP}
    		)
    	
    

    还有查询方法

    	
    	
    
    并添加状态修改功能

    因为通过ids跟state来进行修改,所以这里传进来的设置为一个map

    	
    	
    		update FACTORY_C
    		set STATE=#{state}
    		where FACTORY_ID in
    		
    			#{id}
    		
    	
    


    在Factory实体类中也要添加state字段,并设置get 和set方法,这里不再进行赘述。


    接着在FactoryServiceImpl中修改insert方法

    @Override
    	public void insert(com.wakev.xx.domain.Factory entity) {
    		entity.setId(UUID.randomUUID().toString());
    		entity.setState("1");			//0停用1启用
    		factoryDao.insert(entity);
    	}
    

    在BaseDao中并没有这个方法,而且这个方法也不是每个表都有的,所以在FactoryDao中单独添加

    public interface FactoryDao extends BaseDao {
    	public void updateState(Map map);	//修改状态
    }
    
    @Repository
    public class FactoryDaoImpl extends BaseDaoImpl implements FactoryDao {
    	//利用默认构造方法初始化命名空间
    	public FactoryDaoImpl() {
    		super.setNs("com.wakev.xx.mapper.FactoryMapper");
    	}
    	@Override
    	public void updateState(Map map) {
    		super.getSqlSession().update(this.getNs() + ".updateState", map);
    	}
    }
    

    接着去修改对应的service层。

    public void start(String[] ids);		//启用
    public void stop(String[] ids);			//停用
    

    ServiceImpl层

    	@Override
    	public void start(String[] ids) {
    		Map map = new HashMap();
    		map.put("state", 1);		//1启用
    		map.put("ids", ids);
    		factoryDao.updateState(map);
    	}
    
    	@Override
    	public void stop(String[] ids) {
    		Map map = new HashMap();
    		map.put("state", 0);		//1停用
    		map.put("ids", ids);
    		factoryDao.updateState(map);
    	}
    
    接着去修改 controller

    	//启用
    	@RequestMapping("/basicinfo/factory/start.action")
    	public String start(@RequestParam("id")String[] ids){
    		factoryService.start(ids);
    		
    		return "redirect:/basicinfo/factory/list.action";
    	}
    	
    	
    	//停用
    	@RequestMapping("/basicinfo/factory/stop.action")
    	public String stop(@RequestParam("id")String[] ids){
    		factoryService.stop(ids);
    		
    		return "redirect:/basicinfo/factory/list.action";
    	}
    

    着在列表页面添加两个按钮 “启动”“停用”。


  • 启用
  • 停用

  • 并且添加一个状态显示列

    
    	
    		
    		序号
    		厂家全称
    		缩写
    		联系人
    		电话
    		手机
    		传真
    		验货员
    		状态
    	
    	
    
    
    	
    		
    		${status.index+1}
    		${o.fullName}
    		${o.factoryName}
    		${o.contacts}
    		${o.phone}
    		${o.mobile}
    		${o.fax}
    		${o.inspector}
    			
    			停用
    			启用		
    	
    

    这样状态功能也开发完毕。

    这个方式,就是流程控制的基础,权限控制基础。

     

    到这里,生产厂家的相关功能我们都开发完了。

    到这里为止只是完成简单的开发,熟悉一下流程,接着的才是开始真正的项目开发。












    你可能感兴趣的:(maven,ssm,框架,项目,项目实战)