Java-单机版的书店管理系统(练习设计模块和思想_系列 六 )

本系列前面博客的链接:

Java-单机版的书店管理系统(练习设计模块和思想_系列 五 )
http://blog.csdn.net/qq_26525215/article/details/51136848

Java-单机版的书店管理系统(练习设计模块和思想_系列 四(2) ):
http://blog.csdn.net/qq_26525215/article/details/51117135

Java-单机版的书店管理系统(练习设计模块和思想_系列 四(1) ):
http://blog.csdn.net/qq_26525215/article/details/51116429

Java-单机版的书店管理系统(练习设计模块和思想_系列 三 ):
http://blog.csdn.net/qq_26525215/article/details/51099202

Java-单机版的书店管理系统(练习设计模块和思想_系列 二 ):
http://blog.csdn.net/qq_26525215/article/details/51089734

Java-单机版的书店管理系统(练习设计模块和思想_系列 一 ):
http://blog.csdn.net/qq_26525215/article/details/51073546

介绍:

现在写到了进货模块了,这应该是本书店系统最难的模块了吧。

本次多写了一个工具类:
把字符串比较的代码抽取出来写了一个类了。因为需要比较的字符串比较多。

还有进货模块的值对模块,分为了4个部分。
1、进货值对象
2、进货查询值对象
3、进货明细值对象
4、进货明细查询值对象。

进货模块表现层的List模块,Add模块。

数据层模块和逻辑层模块。写好了大部分功能。
可以执行添加进货。
list界面有2个list列表,一个是进货列表,一个是进货明细列表。
这2个表示有联系的!选中进货列表的某一行时,需要在另外一个列表中显示这个进货的明细!

后期会对列表一的显示改一下的,时间会改成**年
(取系统时间显示!)
进货人不会再只显示编号。会直接显示名字的!

后面有这次增加的代码模块,
然后,其他模块的源代码可能有部分修改,
其他模块的源代码百度云链接(CSDN上传文件好像有一天的缓冲期,我刚刚上传的,现在还找不到,只能先贴出百度云的文件的源代码链接):
(目前我的所有源代码:)
http://pan.baidu.com/s/1jHOgFqQ

展示图片:

部分的代码模块:

工具类:StringComparison类:

package cn.hncu.bookStore.util;

/**
 * 工具类
 * 字符串比较
 * @author 陈浩翔
 *
 * @version 1.0
 */
public class StringComparison {

    /**
     * @param str1---需要比较的字符串
     * @param str2---被比较的字符串
     * @return--- 返回0 , 2个字符串相同,<br/> 
     *            返回-1,str1和str2不相同,<br/>
     *            返回1,str1是str2的子串(忽略str1两端空格)<br/>
     *            返回2,说明str1为null或者str1全部为空格<br/>
     */
    public static int stringComp(String str1,String str2){
        if(str1==null||!(str1.trim().length()>0)){
            return 2;
        }

        //字符串完全相同
        if(str1!=null&&str1.trim().length()>0){
            if(str1.equals(str2)){
                return 0;
            }
        }

        //模糊匹配(忽略两端空格)
        if(str1!=null&&str1.trim().length()>0){
            if(str2.indexOf(str1.trim())!=-1){
                return 1;
            }
        }
        return -1;
    }
}

注意一个问题:

要使用对象流读取文件:

这个类必须实现Serializable接口!!!!!

值对象模块:

进货值对象:InMainModel:

package cn.hncu.bookStore.in.vo;

import java.io.Serializable;

/**
 * 进货管理值对象封装
 * @author 陈浩翔
 *
 * @version 1.0
 */
public class InMainModel implements Serializable, Comparable<InMainModel>{
    //进货单编号
    private String uuid;
    //进货时间
    private long inDate;
    //进货人员编号
    private String inUserId;

    /* 
       如果某个字段是外键,同时又需要在当前表中相应表现层显示出用户能看得懂
     的信息,则需要补一个专用于信息显示(给用户看)的字段。
     */
    private String inUserName;

    public String getInUserName() {
        return inUserName;
    }

    public void setInUserName(String inUserName) {
        this.inUserName = inUserName;
    }

    /**
     * 
     * @return ---返回进货单编号(String型)
     */
    public String getUuid() {
        return uuid;
    }

    /**
     * 
     * @param uuid---设置进货单编号(String型)
     */
    public void setUuid(String uuid) {
        this.uuid = uuid;
    }

    /**
     * 
     * @return---返回进货时间(long型)
     */
    public long getInDate() {
        return inDate;
    }

    /**
     * 
     * @param inDate---设置进货时间(long型)
     */
    public void setInDate(long inDate) {
        this.inDate = inDate;
    }

    /**
     * 
     * @return---返回进货人员编号(String型)
     */
    public String getInUserId() {
        return inUserId;
    }

    /**
     * 
     * @param inUserId---设置进货人员编号(String型)
     */
    public void setInUserId(String inUserId) {
        this.inUserId = inUserId;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((uuid == null) ? 0 : uuid.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        InMainModel other = (InMainModel) obj;
        if (uuid == null) {
            if (other.uuid != null)
                return false;
        } else if (!uuid.equals(other.uuid))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return uuid + ", " + inDate
                + ", " + inUserId;
    }

    @Override
    public int compareTo(InMainModel o) {
        return Integer.parseInt(uuid)-Integer.parseInt(o.uuid);
    }



}

进货明细值对象类:InDetailModel

package cn.hncu.bookStore.in.vo;

import java.io.Serializable;

/**
 * 进货明细管理的值对象封装
 * @author 陈浩翔
 *
 * @version 1.0
 */
public class InDetailModel implements Serializable{
    //进货明细编号
    private String uuid;
    //进货单编号
    private String inId;
    //图书编号
    private String bookId;
    //进货数量
    private int sumNum;
    //进货总金额
    private double sumMoney;

    //为把书名显示给用户看,给bookUuid添加一个bookName属性
    private String bookName;



    public String getBookName() {
        return bookName;
    }
    public void setBookName(String bookName) {
        this.bookName = bookName;
    }
    public String getUuid() {
        return uuid;
    }
    public void setUuid(String uuid) {
        this.uuid = uuid;
    }
    public String getInId() {
        return inId;
    }
    public void setInId(String inId) {
        this.inId = inId;
    }
    public String getBookId() {
        return bookId;
    }
    public void setBookId(String bookId) {
        this.bookId = bookId;
    }
    public int getSumNum() {
        return sumNum;
    }
    public void setSumNum(int sumNum) {
        this.sumNum = sumNum;
    }
    public double getSumMoney() {
        return sumMoney;
    }
    public void setSumMoney(double sumMoney) {
        this.sumMoney = sumMoney;
    }


    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((uuid == null) ? 0 : uuid.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        InDetailModel other = (InDetailModel) obj;
        if (uuid == null) {
            if (other.uuid != null)
                return false;
        } else if (!uuid.equals(other.uuid))
            return false;
        return true;
    }
    @Override
    public String toString() {
        return uuid +", "+bookName + ", " + sumNum
                + "本, " + sumMoney + "元";
    }





}

进货查询值对象类:InMainQueryModel

package cn.hncu.bookStore.in.vo;

/**
 * 进货查询值对象封装
 * @author 陈浩翔
 *
 * @version 1.0
 */
public class InMainQueryModel extends InMainModel {

    //需要查询的最大时间
    private long inDate2;

    /**
     * 
     * @return---需要查询的最大时间值
     */
    public long getInDate2() {
        return inDate2;
    }

    /**
     * 
     * @param inDate2---设置需要查询的最大时间
     */
    public void setInDate2(long inDate2) {
        this.inDate2 = inDate2;
    }

}

进货明细查询值对象类:InDetailQueryModel

package cn.hncu.bookStore.in.vo;

/**
 * 进货明细查询值对象封装
 * @author 陈浩翔
 *
 * @version 1.0
 */
public class InDetailQueryModel extends InDetailModel {

    //需要查询的最大进货数量
    private int sumNum2;
    //需要查询的最大进货金额
    private double sumMoney2;

    /**
     * 
     * @return---返回需要查询的最大进货数量
     */
    public int getSumNum2() {
        return sumNum2;
    }
    /**
     * 
     * @param sumNum2---设置需要查询的最大进货数量
     */
    public void setSumNum2(int sumNum2) {
        this.sumNum2 = sumNum2;
    }

    /**
     * 
     * @return---返回需要查询的最大进货金额
     */
    public double getSumMoney2() {
        return sumMoney2;
    }

    /**
     * 
     * @param sumMoney2---设置需要查询的最大进货金额
     */
    public void setSumMoney2(double sumMoney2) {
        this.sumMoney2 = sumMoney2;
    }

}

进货模块的数据层:

进货管理数据层接口:InMainDao

package cn.hncu.bookStore.in.dao.dao;

import java.util.List;

import cn.hncu.bookStore.in.vo.InMainModel;
import cn.hncu.bookStore.in.vo.InMainQueryModel;

/**
 * 进货管理数据层接口
 * 
 * @author 陈浩翔
 * 
 * @version 1.0
 */
public interface InMainDao {

    /**
     * 创建一个进货数据对象
     * @param inMain---需要创建的进货数据对象
     * @return---true 表示创建成功,false 表示创建失败
     */
    public boolean create(InMainModel inMain);

    /**
     * 删除一个进货数据对象
     * @param uuid---进货单的编号-唯一的
     * @return---true表示删除成功, false表示删除失败
     */
    public boolean delete(String uuid);

    /**
     * 修改一个进货数据的对象
     * @param inMain---需要修改的进货管理对象
     * @return---true表示修改成功,false表示修改失败
     */
    public boolean update(InMainModel inMain);

    /**
     * 根据进货单编号,得到进货对象的其他信息资料
     * @param uuid---进货单编号
     * @return---该对象的其他其他信息资料
     */
    public InMainModel getSingle(String uuid);

    /**
     * 
     * @return---所有的进货管理对象信息
     */
    public List<InMainModel> getAll();

    /**
     * 查找进货管理对象
     * @param imqm---查找条件!
     * @return---满足查找条件的所有INMainModel对象
     */
    public List<InMainModel> getbyCondition(InMainQueryModel imqm);
}

进货明细管理数据层接口:InDetailDao

package cn.hncu.bookStore.in.dao.dao;

import java.util.List;

import cn.hncu.bookStore.in.vo.InDetailModel;
import cn.hncu.bookStore.in.vo.InDetailQueryModel;

/**
 * 进货明细管理数据层接口
 * @author 陈浩翔
 *
 * @version 1.0
 */
public interface InDetailDao {
    /**
     * 创建一个进货明细数据对象
     * @param inMain---需要创建的进货明细数据对象
     * @return---true 表示创建成功,false 表示创建失败
     */
    public boolean create(InDetailModel inDetail);

    /**
     * 删除一个进货明细数据对象
     * @param uuid---进货明细单的编号-唯一的
     * @return---true表示删除成功, false表示删除失败
     */
    public boolean delete(String uuid);

    /**
     * 修改一个进货明细数据的对象
     * @param inMain---需要修改的进货管理明细对象
     * @return---true表示修改成功,false表示修改失败
     */
    public boolean update(InDetailModel inDetail);

    /**
     * 根据进货明细单编号,得到进货明细对象的其他信息资料
     * @param uuid---进货明细单编号
     * @return---该对象的其他其他信息资料
     */
    public InDetailModel getSingle(String uuid);

    /**
     * 
     * @return---所有的进货明细管理对象信息
     */
    public List<InDetailModel> getAll();

    /**
     * 查找进货明细管理对象
     * @param imqm---查找条件!
     * @return---满足查找条件的所有InDetailModel对象
     */
    public List<InDetailModel> getbyCondition(InDetailQueryModel idqm);
}

进货明细的实现类:InDetailDaoSerImpl

package cn.hncu.bookStore.in.dao.impl;

import java.util.ArrayList;
import java.util.List;

import cn.hncu.bookStore.in.dao.dao.InDetailDao;
import cn.hncu.bookStore.in.dao.factory.InDetailDaoFactory;
import cn.hncu.bookStore.in.vo.InDetailModel;
import cn.hncu.bookStore.in.vo.InDetailQueryModel;
import cn.hncu.bookStore.util.FileIoUtil;
import cn.hncu.bookStore.util.StringComparison;

/**
 * 进货明细的实现类
 * @author 陈浩翔
 *
 * @version 1.0
 */
public class InDetailDaoSerImpl implements InDetailDao{
    //进货明细数据的存储的文件名
    private final String FILE_NAME = "InDetail.txt";

    @Override
    public boolean create(InDetailModel inDetail) {
        List<InDetailModel> lists = FileIoUtil.readFormFile(FILE_NAME);

        for(InDetailModel model: lists){
            //已经存在这个Uuid,不能添加
            if(model.getUuid().equals(inDetail.getUuid())){
                return false;
            }
        }

        lists.add(inDetail);
        FileIoUtil.write2file(lists, FILE_NAME);
        return true;
    }

    @Override
    public boolean delete(String uuid) {
        List<InDetailModel> list = FileIoUtil.readFormFile(FILE_NAME);
        for(InDetailModel model: list){
            //存在,就删除
            if(model.getUuid().equals(uuid)){
                list.remove(model);
                FileIoUtil.write2file(list, FILE_NAME);
                return true;
            }
        }
        return false;
    }

    @Override
    public boolean update(InDetailModel inDetail) {
        List<InDetailModel> list  = FileIoUtil.readFormFile(FILE_NAME);
        for(int i=0;i<list.size();i++){
            //找到了,就修改
            if(list.get(i).getUuid().equals(inDetail.getUuid())){
                list.set(i, inDetail);
                FileIoUtil.write2file(list, FILE_NAME);
                return true;
            }
        }
        return false;
    }

    @Override
    public InDetailModel getSingle(String uuid) {
        List<InDetailModel> list = FileIoUtil.readFormFile(FILE_NAME);
        for(InDetailModel model : list){
            //找到了,就返回
            if(model.getUuid().equals(uuid)){
                return model;
            }
        }
        return null;
    }

    @Override
    public List<InDetailModel> getAll() {
        return FileIoUtil.readFormFile(FILE_NAME);
    }

    @Override
    public List<InDetailModel> getbyCondition(InDetailQueryModel idqm) {
        List<InDetailModel> lists = getAll();
        List<InDetailModel> resulits = new ArrayList<InDetailModel>();
        for(InDetailModel model:lists){

            if(StringComparison.stringComp(idqm.getUuid(), model.getUuid())==-1){
                continue;
            }

            if(StringComparison.stringComp(idqm.getInId(), model.getInId())==-1){
                continue;
            }

            if(StringComparison.stringComp(idqm.getBookId(), model.getBookId())==-1){
                continue;
            }

            if(idqm.getSumNum()>0){
                if(model.getSumNum()<idqm.getSumNum()){
                    continue;
                }
            }
            if(idqm.getSumNum2()>0){
                if(model.getSumNum()>idqm.getSumNum2()){
                    continue;
                }
            }

            if(idqm.getSumMoney()>0){
                if(model.getSumMoney()<idqm.getSumMoney()){
                    continue;
                }
            }
            if(idqm.getSumMoney2()>0){
                if(model.getSumMoney()>idqm.getSumMoney2()){
                    continue;
                }
            }

            resulits.add(model);
        }
        return resulits;
    }

}

进货管理的实现类:InMainDaoSerImpl

package cn.hncu.bookStore.in.dao.impl;

import java.util.ArrayList;
import java.util.List;

import cn.hncu.bookStore.in.dao.dao.InMainDao;
import cn.hncu.bookStore.in.vo.InMainModel;
import cn.hncu.bookStore.in.vo.InMainQueryModel;
import cn.hncu.bookStore.util.FileIoUtil;
import cn.hncu.bookStore.util.StringComparison;

/**
 * 进货管理的实现类
 * @author 陈浩翔
 *
 * @version 1.0
 */
public class InMainDaoSerImpl implements InMainDao {

    private final String FILE_NAME = "InMain.txt";
    @Override
    public boolean create(InMainModel inMain) {
        List<InMainModel> list = FileIoUtil.readFormFile(FILE_NAME);
        for(InMainModel model:list){
            if(model.getUuid().equals(inMain.getUuid())){//存在,则不能添加
                return false;
            }
        }
        list.add(inMain);
        FileIoUtil.write2file(list, FILE_NAME);
        return true;
    }

    @Override
    public boolean delete(String uuid) {
        List<InMainModel> list = FileIoUtil.readFormFile(FILE_NAME);
        for(InMainModel model:list){
            if(model.getUuid().equals(uuid)){//存在,则删除
                list.remove(model);
                FileIoUtil.write2file(list, FILE_NAME);
                return true;
            }
        }
        return false;
    }

    @Override
    public boolean update(InMainModel inMain) {
        List<InMainModel> list = FileIoUtil.readFormFile(FILE_NAME);
        for(int i=0;i<list.size();i++){
            InMainModel model = list.get(i);
            if(model.getUuid().equals(inMain.getUuid())){//存在,则修改
                list.set(i, inMain);
                FileIoUtil.write2file(list, FILE_NAME);
                return true;
            }
        }
        return false;
    }

    @Override
    public InMainModel getSingle(String uuid) {
        List<InMainModel> list = FileIoUtil.readFormFile(FILE_NAME);
        for(InMainModel model:list){
            if(model.getUuid().equals(uuid)){//存在,则返回
                return model;
            }
        }
        return null;
    }

    @Override
    public List<InMainModel> getAll() {
        return FileIoUtil.readFormFile(FILE_NAME);
    }

    @Override
    public List<InMainModel> getbyCondition(InMainQueryModel imqm) {
        List<InMainModel> lists = FileIoUtil.readFormFile(FILE_NAME);
        List<InMainModel> results = new ArrayList<InMainModel>();
        for(InMainModel model : lists){

            if(StringComparison.stringComp(imqm.getUuid(), model.getUuid())==-1){
                continue;
            }

            if(StringComparison.stringComp(imqm.getInUserId(), model.getInUserId())==-1){
                continue;
            }

            if(imqm.getInDate()>0){
                if(model.getInDate()<imqm.getInDate()){
                    continue;
                }
            }
            if(imqm.getInDate2()>0){
                if(model.getInDate()>imqm.getInDate2()){
                    continue;
                }
            }
            results.add(model);
        }
        return results;
    }

}

new 一个进货明细的实现类:InDetailDaoFactory

package cn.hncu.bookStore.in.dao.factory;

import cn.hncu.bookStore.in.dao.dao.InDetailDao;
import cn.hncu.bookStore.in.dao.impl.InDetailDaoSerImpl;

/**
 * 工厂方法----new 一个进货明细的实现类
 * @author 陈浩翔
 *
 * @version 1.0
 */
public class InDetailDaoFactory {

    public static InDetailDao getInDetailDao(){
        return new InDetailDaoSerImpl();
    }
}

new 一个进货实现类:InMainDaoFactory

package cn.hncu.bookStore.in.dao.factory;

import cn.hncu.bookStore.in.dao.dao.InMainDao;
import cn.hncu.bookStore.in.dao.impl.InMainDaoSerImpl;

/**
 * 工厂方法---new 一个进货实现类
 * @author 陈浩翔
 * @version 1.0
 */
public class InMainDaoFactory {

    public static InMainDao getInMainDao(){
        return new InMainDaoSerImpl();
    }
}

进货模块的逻辑层:

逻辑层的接口:InMainEbi

package cn.hncu.bookStore.in.business.ebi;

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

import cn.hncu.bookStore.in.vo.InDetailModel;
import cn.hncu.bookStore.in.vo.InDetailQueryModel;
import cn.hncu.bookStore.in.vo.InMainModel;
import cn.hncu.bookStore.in.vo.InMainQueryModel;

/**
 * 
 * @author 陈浩翔
 * @version 1.0
 */
public interface InMainEbi {

    /**
     * 创建一个进货模块数据-
     * @param inMain---进货数据
     * @param inDetails---进货明细数据
     * @return---返回true表示创建成功,false表示创建失败
     */
    public abstract boolean create(InMainModel inMain,List<InDetailModel> inDetails);

    /**
     * 
     * @return---返回所有的进货模块(包括进货明细)的集合
     */
    public abstract Map<InMainModel, List<InDetailModel>> getAll();

    /**
     * 
     * @param imqm---进货管理需要查找的条件
     * @param idqm---进货明细需要查找的条件
     * @return---满足条件的所有进货数据的Map集合
     */
    public abstract Map<InMainModel, List<InDetailModel>> getByCondition(InMainQueryModel imqm,InDetailQueryModel idqm);

}

逻辑层接口的实现类:InMainEbo

package cn.hncu.bookStore.in.business.ebo;

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

import cn.hncu.bookStore.book.business.ebi.BookEbi;
import cn.hncu.bookStore.book.business.factory.BookEbiFactory;
import cn.hncu.bookStore.common.UuidModelConstance;
import cn.hncu.bookStore.common.uuid.dao.dao.UuidDao;
import cn.hncu.bookStore.common.uuid.dao.factory.UuidDaoFactory;
import cn.hncu.bookStore.in.business.ebi.InMainEbi;
import cn.hncu.bookStore.in.dao.dao.InDetailDao;
import cn.hncu.bookStore.in.dao.dao.InMainDao;
import cn.hncu.bookStore.in.dao.factory.InDetailDaoFactory;
import cn.hncu.bookStore.in.dao.factory.InMainDaoFactory;
import cn.hncu.bookStore.in.vo.InDetailModel;
import cn.hncu.bookStore.in.vo.InDetailQueryModel;
import cn.hncu.bookStore.in.vo.InMainModel;
import cn.hncu.bookStore.in.vo.InMainQueryModel;

public class InMainEbo implements InMainEbi{
    //注入dao

    InMainDao inMainDao = InMainDaoFactory.getInMainDao();
    InDetailDao inDetailDao = InDetailDaoFactory.getInDetailDao();
    UuidDao uuidDao = UuidDaoFactory.getUuidDao();
    BookEbi bookEbi = BookEbiFactory.getBookEbi();

    @Override
    public boolean create(InMainModel inMain, List<InDetailModel> inDetails) {
        //1存储inMain信息///
        //补全inMain中的数据
        //需要:inUuid,inDate,inUserUuid   已组织:inUserUuid
        //还缺(需补):inUuid,inDate
        String inUuid = uuidDao.getNextUuid(UuidModelConstance.IN_MAIN);
        inMain.setUuid(inUuid);
        inMain.setInDate(System.currentTimeMillis());
        inMainDao.create(inMain);

         //2存储inDetail信息///
        for(InDetailModel model:inDetails){
            //补全每一个inDetail中的数据
            //需要:inDetailUuid,inMainUuid,bookUuid,sumNum,sumMoney   已组织:bookUuid,sumNum
            //还缺(需补):inDetailUuid,inMainUuid,sumMoney
            model.setUuid(uuidDao.getNextUuid(UuidModelConstance.IN_DETAIL));
            model.setInId(inUuid);

            double sumMoney = model.getSumNum() * bookEbi.getSingle(model.getBookId()).getInPrice();
            model.setSumMoney(sumMoney);
            inDetailDao.create(model);
        }
        return true;
    }

    @Override
    public Map<InMainModel, List<InDetailModel>> getAll() {
        Map<InMainModel,List<InDetailModel>> map = new TreeMap<InMainModel, List<InDetailModel>>();

        List<InMainModel> inMains = inMainDao.getAll();

        for(InMainModel inMain: inMains ){
            //查询条件值对象的创建
            InDetailQueryModel idqm = new InDetailQueryModel();
            String inUuid = inMain.getUuid();
            idqm.setInId(inUuid);

            List<InDetailModel> details = inDetailDao.getbyCondition(idqm);

            map.put(inMain, details);
        }

        return map;
    }

    @Override
    public Map<InMainModel, List<InDetailModel>> getByCondition(
            InMainQueryModel imqm, InDetailQueryModel idqm) {
        // TODO Auto-generated method stub
        return null;
    }

}

具体实现类的工厂方法:InMainEbiFactory

package cn.hncu.bookStore.in.business.factory;

import cn.hncu.bookStore.in.business.ebi.InMainEbi;
import cn.hncu.bookStore.in.business.ebo.InMainEbo;

/**
 * 工厂方法
 * @author 陈浩翔
 *
 * @version 1.0
 */
public class InMainEbiFactory {
    public static InMainEbi getInMainEbi(){
        return new InMainEbo();
    }
}

进货模块的表现层:

List主界面:InListPanel

/*
 * InListPanel.java
 *
 * Created on __DATE__, __TIME__
 */

package cn.hncu.bookStore.in.ui;

import java.awt.event.ActionEvent;
import java.util.List;
import java.util.Map;

import javax.swing.JFrame;
import javax.swing.event.ListSelectionEvent;

import cn.hncu.bookStore.in.business.factory.InMainEbiFactory;
import cn.hncu.bookStore.in.vo.InDetailModel;
import cn.hncu.bookStore.in.vo.InMainModel;

/**
 * 
 * @author 陈浩翔
 *
 * @version 1.0
 */
public class InListPanel extends javax.swing.JPanel {

    private JFrame mainFrame = null;
    private Map<InMainModel, List<InDetailModel>> map;

    /** Creates new form InListPanel */
    public InListPanel(JFrame mainFrame) {
        this.mainFrame = mainFrame;
        initComponents();
        map = InMainEbiFactory.getInMainEbi().getAll();
        myInitData();
    }

    private void myInitData() {
        jListInMain.setListData(map.keySet().toArray());
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    //GEN-BEGIN:initComponents
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        btnToAdd = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        jListInMain = new javax.swing.JList();
        jScrollPane2 = new javax.swing.JScrollPane();
        jListInDetail = new javax.swing.JList();
        jLabel2 = new javax.swing.JLabel();

        setMinimumSize(new java.awt.Dimension(800, 600));
        setLayout(null);

        jLabel1.setFont(new java.awt.Font("微软雅黑", 1, 48));
        jLabel1.setForeground(new java.awt.Color(204, 0, 0));
        jLabel1.setText("\u8fdb\u8d27\u5217\u8868");
        add(jLabel1);
        jLabel1.setBounds(260, 0, 230, 80);

        btnToAdd.setFont(new java.awt.Font("Dialog", 1, 24));
        btnToAdd.setForeground(new java.awt.Color(0, 204, 204));
        btnToAdd.setText("\u8f6c\u5230\u6dfb\u52a0");
        btnToAdd.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnToAddActionPerformed(evt);
            }
        });
        add(btnToAdd);
        btnToAdd.setBounds(100, 460, 160, 70);

        jListInMain.setFont(new java.awt.Font("宋体", 1, 18));
        jListInMain.setForeground(new java.awt.Color(102, 102, 0));
        jListInMain.setModel(new javax.swing.AbstractListModel() {
            String[] strings = { "" };

            public int getSize() {
                return strings.length;
            }

            public Object getElementAt(int i) {
                return strings[i];
            }
        });
        jListInMain
                .addListSelectionListener(new javax.swing.event.ListSelectionListener() {
                    public void valueChanged(
                            javax.swing.event.ListSelectionEvent evt) {
                        jListInMainValueChanged(evt);
                    }
                });
        jScrollPane1.setViewportView(jListInMain);

        add(jScrollPane1);
        jScrollPane1.setBounds(50, 110, 320, 300);

        jListInDetail.setFont(new java.awt.Font("宋体", 1, 18));
        jListInDetail.setForeground(new java.awt.Color(102, 102, 0));
        jListInDetail.setModel(new javax.swing.AbstractListModel() {
            String[] strings = { "" };

            public int getSize() {
                return strings.length;
            }

            public Object getElementAt(int i) {
                return strings[i];
            }
        });
        jScrollPane2.setViewportView(jListInDetail);

        add(jScrollPane2);
        jScrollPane2.setBounds(400, 110, 370, 300);

        jLabel2.setFont(new java.awt.Font("Dialog", 1, 14));
        jLabel2.setForeground(new java.awt.Color(51, 0, 204));
        jLabel2.setText("\u8fdb\u8d27\u660e\u7ec6\u5217\u8868\uff1a");
        add(jLabel2);
        jLabel2.setBounds(480, 80, 110, 30);
    }// </editor-fold>
    //GEN-END:initComponents

    protected void jListInMainValueChanged(ListSelectionEvent evt) {
        InMainModel inMain = (InMainModel) jListInMain.getSelectedValue();
        List<InDetailModel> details = map.get(inMain);
        //System.out.println(map);
        //System.out.println(inMain);
        jListInDetail.setListData(details.toArray());
    }

    protected void btnToAddActionPerformed(ActionEvent evt) {
        mainFrame.setContentPane(new InAddPanel(mainFrame));
        mainFrame.validate();
    }

    //GEN-BEGIN:variables
    // Variables declaration - do not modify
    private javax.swing.JButton btnToAdd;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JList jListInDetail;
    private javax.swing.JList jListInMain;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    // End of variables declaration//GEN-END:variables

}

添加进货界面类:InAddPanel

/*
 * InAddPanel.java
 *
 * Created on __DATE__, __TIME__
 */

package cn.hncu.bookStore.in.ui;

import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.plaf.ListUI;

import cn.hncu.bookStore.book.business.ebi.BookEbi;
import cn.hncu.bookStore.book.business.factory.BookEbiFactory;
import cn.hncu.bookStore.book.vo.BookModel;
import cn.hncu.bookStore.in.business.factory.InMainEbiFactory;
import cn.hncu.bookStore.in.vo.InDetailModel;
import cn.hncu.bookStore.in.vo.InMainModel;
import cn.hncu.bookStore.user.business.factory.UserEbiFactory;
import cn.hncu.bookStore.user.vo.UserModel;

/**
 * 
 * @author 陈浩翔
 * 
 * @version 1.0
 */
public class InAddPanel extends javax.swing.JPanel {

    private JFrame mainFrame = null;

    private List<InDetailModel> details = new ArrayList<InDetailModel>();

    /**
     * Creates new form InAddPanel
     * 
     * @param mainFrame
     */
    public InAddPanel(JFrame mainFrame) {
        this.mainFrame = mainFrame;
        initComponents();
        jtxArea.setEditable(false);
        myInitData();
    }

    private void myInitData() {
        // 1完成combBook组合框中数据的初始化
        // 访问book模块,把其中的图书获取出来,并把书名填写到combBook组合框中
        // 我们是UI层,只能访问(对方的)逻辑层
        List<BookModel> books = BookEbiFactory.getBookEbi().getAll();
        for (BookModel book : books) {
            combBook.addItem(book.getUuid() + "," + book.getName());
            // 若想更精确地控制每本书显示的信息,可以修改Book的toString()方法
        }

        // 2完成combUser组合框中数据的初始化
        /*
         * 模块之间的交接太深(细节太多了,功能可实现,但从开发技术或设计思想来讲不可取) 
          List<UserModel> users =UserEbiFactory.getUserEbi().getAll(); for(UserModel user: users){
          if(user.getType()==UserTypeEnum.IN.getType()){
          combUser.addItem(user.getName()); } }
         */

        List<UserModel> users = UserEbiFactory.getUserEbi().getAllIn();
        for (UserModel user : users) {
            combUser.addItem(user.getName());
        }

    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    //GEN-BEGIN:initComponents
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        tfdInNum = new javax.swing.JTextField();
        jLabel5 = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        combUser = new javax.swing.JComboBox();
        combBook = new javax.swing.JComboBox();
        jScrollPane1 = new javax.swing.JScrollPane();
        jListDetails = new javax.swing.JList();
        jLabel7 = new javax.swing.JLabel();
        btnAddDetail = new javax.swing.JButton();
        jScrollPane2 = new javax.swing.JScrollPane();
        jtxArea = new javax.swing.JTextArea();
        btnBack = new javax.swing.JButton();
        btnMainAdd = new javax.swing.JButton();

        setMinimumSize(new java.awt.Dimension(800, 600));
        setLayout(null);

        jLabel1.setFont(new java.awt.Font("微软雅黑", 1, 48));
        jLabel1.setForeground(new java.awt.Color(204, 0, 0));
        jLabel1.setText("\u6dfb\u52a0\u8fdb\u8d27");
        add(jLabel1);
        jLabel1.setBounds(270, 0, 210, 60);

        jLabel4.setFont(new java.awt.Font("微软雅黑", 0, 18));
        jLabel4.setText("\u56fe\u4e66\u540d\u79f0:");
        add(jLabel4);
        jLabel4.setBounds(50, 100, 90, 30);

        tfdInNum.setFont(new java.awt.Font("Dialog", 1, 18));
        tfdInNum.setAutoscrolls(false);
        add(tfdInNum);
        tfdInNum.setBounds(140, 170, 150, 30);

        jLabel5.setFont(new java.awt.Font("微软雅黑", 0, 18));
        jLabel5.setForeground(new java.awt.Color(255, 51, 51));
        jLabel5.setText("  \u8fdb\u8d27\u660e\u7ec6\u5217\u8868\uff1a");
        add(jLabel5);
        jLabel5.setBounds(10, 220, 140, 30);

        jLabel6.setFont(new java.awt.Font("微软雅黑", 0, 18));
        jLabel6.setText("\u8fdb\u8d27\u4eba\uff1a");
        add(jLabel6);
        jLabel6.setBounds(480, 420, 80, 30);

        combUser.setFont(new java.awt.Font("Dialog", 1, 14));
        combUser.setModel(new javax.swing.DefaultComboBoxModel(
                new String[] { "请选择..." }));
        add(combUser);
        combUser.setBounds(550, 420, 150, 30);

        combBook.setFont(new java.awt.Font("Dialog", 1, 14));
        combBook.setModel(new javax.swing.DefaultComboBoxModel(
                new String[] { "请选择..." }));
        add(combBook);
        combBook.setBounds(140, 100, 150, 30);

        jListDetails.setFont(new java.awt.Font("Dialog", 1, 14));
        jListDetails.setForeground(new java.awt.Color(255, 51, 51));
        jListDetails.setModel(new javax.swing.AbstractListModel() {
            String[] strings = { "" };

            public int getSize() {
                return strings.length;
            }

            public Object getElementAt(int i) {
                return strings[i];
            }
        });
        jScrollPane1.setViewportView(jListDetails);

        add(jScrollPane1);
        jScrollPane1.setBounds(20, 262, 410, 210);

        jLabel7.setFont(new java.awt.Font("微软雅黑", 0, 18));
        jLabel7.setText("\u8fdb\u8d27\u6570\u91cf\uff1a");
        add(jLabel7);
        jLabel7.setBounds(50, 170, 90, 30);

        btnAddDetail.setFont(new java.awt.Font("Dialog", 1, 14));
        btnAddDetail.setForeground(new java.awt.Color(0, 204, 204));
        btnAddDetail.setText("\u6dfb\u52a0\u5230\u660e\u7ec6");
        btnAddDetail.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAddDetailActionPerformed(evt);
            }
        });
        add(btnAddDetail);
        btnAddDetail.setBounds(480, 280, 120, 60);

        jtxArea.setColumns(20);
        jtxArea.setFont(new java.awt.Font("Dialog", 1, 14));
        jtxArea.setForeground(new java.awt.Color(0, 153, 51));
        jtxArea.setRows(5);
        jtxArea.setText("\u64cd\u4f5c\u8bf4\u660e\uff1a\n1\u3001\u9009\u62e9\u56fe\u4e66\u540d\u79f0\uff0c\u586b\u5199\u8fdb\u8d27\u6570\u91cf\u3002\n2\u3001\u518d\u70b9\u51fb\u4e0b\u65b9\u7684\u6dfb\u52a0\u5230\u660e\u7ec6\u6309\u94ae\uff0c\n      \u6dfb\u52a0\u6570\u636e\u5230\u8fdb\u8d27\u660e\u7ec6\u5217\u8868\uff0c\n      \u5982\u679c\u8fd8\u6709\u56fe\u4e66\uff0c\u91cd\u590d\u524d\u9762\u7684\u64cd\u4f5c\u3002\n3\u3001\u6700\u540e\u70b9\u51fb\u6dfb\u52a0\u6309\u94ae\u3002");
        jScrollPane2.setViewportView(jtxArea);

        add(jScrollPane2);
        jScrollPane2.setBounds(440, 100, 340, 140);

        btnBack.setFont(new java.awt.Font("Dialog", 1, 24));
        btnBack.setForeground(new java.awt.Color(0, 204, 204));
        btnBack.setText("\u8fd4\u56de");
        btnBack.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnBackActionPerformed(evt);
            }
        });
        add(btnBack);
        btnBack.setBounds(530, 510, 120, 60);

        btnMainAdd.setFont(new java.awt.Font("Dialog", 1, 24));
        btnMainAdd.setForeground(new java.awt.Color(0, 204, 204));
        btnMainAdd.setText("\u6dfb\u52a0");
        btnMainAdd.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnMainAddActionPerformed(evt);
            }
        });
        add(btnMainAdd);
        btnMainAdd.setBounds(120, 510, 120, 60);
    }// </editor-fold>
    //GEN-END:initComponents

    private void btnMainAddActionPerformed(java.awt.event.ActionEvent evt) {
        //1收集参数 
        String inUserName = combUser.getSelectedItem().toString();
        if(combUser.getSelectedIndex()==0){
            JOptionPane.showMessageDialog(mainFrame, "请选择用户类型!");
            return ;
        }
        //System.out.println(inUserName);

        String inUserUuid = UserEbiFactory.getUserEbi().getUserByName(inUserName).getUuid();

        //2组织参数
        InMainModel inMain = new InMainModel();
        inMain.setInUserId(inUserUuid);
        inMain.setInUserName(inUserName);//设置:专为外键显示而补的数据

        //3调用逻辑层
        //System.out.println(inMain);
        //System.out.println(details);
        InMainEbiFactory.getInMainEbi().create(inMain, details);

        //4返回到结果页面
        mainFrame.setContentPane( new InListPanel(mainFrame));
        mainFrame.validate();

    }

    private void btnAddDetailActionPerformed(java.awt.event.ActionEvent evt) {
        //1收集参数
        String str = combBook.getSelectedItem().toString();

        //防范未选择图书
        if (combBook.getSelectedIndex() == 0) {
            JOptionPane.showMessageDialog(mainFrame, "请选择图书!");
            return;
        }
        String strs[] = str.split(",");
        String bookUuid = strs[0];
        String bookName = strs[1];
        //      System.out.println(bookName);
        //      System.out.println(bookUuid);

        int sumNum = 0;
        try {
            sumNum = Integer.parseInt(tfdInNum.getText());
            if (sumNum < 0) {
                throw new NumberFormatException();
            }
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(mainFrame, "进货数量格式错误!");
            return;
        }

        //2组织
        InDetailModel detail = new InDetailModel();
        detail.setBookId(bookUuid);
        detail.setSumNum(sumNum);
        //为显示给用户看,补的数据
        detail.setBookName(bookName);

        //3添加到List当中---真正的明细数据是details,界面上的只是回显信息
        details.add(detail);
        echoDetails();
    }

    private void echoDetails() {
        String echoStrs[] = new String[details.size()];

        for (int i = 0; i < details.size(); i++) {
            InDetailModel detail = details.get(i);
            echoStrs[i] = "《" + detail.getBookName() + "》,"
                    + detail.getSumNum() + "本";
        }
        jListDetails.setListData(echoStrs);
    }

    private void btnBackActionPerformed(java.awt.event.ActionEvent evt) {
        back();
    }

    private void back() {
        mainFrame.setContentPane(new InListPanel(mainFrame));
        mainFrame.validate();
    }

    //GEN-BEGIN:variables
    // Variables declaration - do not modify
    private javax.swing.JButton btnAddDetail;
    private javax.swing.JButton btnBack;
    private javax.swing.JButton btnMainAdd;
    private javax.swing.JComboBox combBook;
    private javax.swing.JComboBox combUser;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JList jListDetails;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JTextArea jtxArea;
    private javax.swing.JTextField tfdInNum;
    // End of variables declaration//GEN-END:variables

}

好了,这个模块也算是完成了一半了,接下来的就是进货的查询界面没写了。
还有list界面的那个显示问题。
下一个系列会解决的!

谙忆 CSDN认证博客专家 Java
公众号:程序编程之旅。曾经写过C、C++,使用过Cocos2dx开发过游戏、安卓端、IOS端、PC端页面均开发过。目前专注Java开发,SaaS内核、元数据的研究。偶尔玩玩爬虫
已标记关键词 清除标记
相关推荐
<p> <strong><span style="background-color:#FFFFFF;color:#E53333;font-size:24px;">本页面购买不发书!!!仅为视频课购买!!!</span></strong> </p> <p> <strong><span style="color:#E53333;font-size:18px;">请务必到</span></strong><a href="https://edu.csdn.net/bundled/detail/49?utm_source=banner"><strong><span style="color:#E53333;font-size:18px;">https://edu.csdn.net/bundled/detail/49</span></strong></a><strong><span style="color:#E53333;font-size:18px;">下单购买课+书。</span></strong> </p> <p> <span style="font-size:14px;">本页面,仅为观看视频页面,如需一并购买图书,请</span><span style="font-size:14px;">务必到</span><a href="https://edu.csdn.net/bundled/detail/49?utm_source=banner"><span style="font-size:14px;">https://edu.csdn.net/bundled/detail/49</span></a><span style="font-size:14px;">下单购买课程+图书!!!</span> </p> <p> <br /> </p> <p> <span style="font-size:14px;">疯狂Python精讲课程覆盖《疯狂Python讲义》全书的主体内容。</span> </p> <span style="font-size:14px;">内容包括Python基本数据类型、Python列表、元组和字典、流程控制、函数式编程、面向对象编程、文件读写、异常控制、数据库编程、并发编程与网络编程、数据可视化分析、Python爬虫等。</span><br /> <span style="font-size:14px;"> 全套课程从Python基础开始介绍,逐步步入当前就业热点。将会带着大家从Python基础语法开始学习,为每个知识点都提供对应的代码实操、代码练习,逐步过渡到文件IO、数据库编程、并发编程、网络编程、数据分 析和网络爬虫等内容,本课程会从小案例起,至爬虫、数据分析案例终、以Python知识体系作为内在逻辑,以Python案例作为学习方式,最终达到“知行合一”。</span><br />
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值