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


    书店管理系统:

    项目练习目标 :
    1、Java应用程序基本分析
    2、培养面向对象编程的基本思想
    3、Java基本设计模式综合应用
    4、掌握分层和接口的基本设计
    5、构建合理的Java应用程序包结构
    6、综合应用JSE所学习的知识
    7、在应用中合理使用集合框架
    8、在应用中综合使用swing的常用组件
    9、基本的表现层的实现机制
    10、IO流和文件的基本操作
    11、培养良好的Java编程习惯
    12、培养调试Java程序的能力,培养改错的能力

    项目功能需求 :
    1、能进行操作用户的注册,修改基本信息,删除和查询。
    2、能对图书的基本信息进行增加、删除、修改和查询操作。
    3、能填写进货单,一张进货单带有多条具体的进货信息,进货的书籍必须是图书管理里面已经有的;进货的同时修改库存对应书籍的存货量。
    4、能填写销售单,一张销售单带有多条具体的销售信息,销售的书籍必须是图书管理里面已经有的,而且销售的数量不能超过当前库存的数量;销售的同时修改库存对应书籍的存货量。
    5、可以查看库存的明细,可以按照条件进行查找具体的图书的库存值。
    6、权限方面进行简化,做固定的权限控制。把用户按照模块分成不同操作权限的人员,特设一个admin的用户,可以操作全部的功能。

    项目基本设计 :
    ★ 架构设计
    整体框架、模块划分
    模块划分:用户、图书、进货、销售和库存5个模块

    ★ 系统功能结构设计
    每个功能模块的具体功能子模块

    ★ 数据库设计
    项目框架实现:分模块、分层、分包、构建应用程序

    1、用户管理(User.txt)

    说明:其中的type为int类型,用来表示操作用户的类型。
    1——表示为admin,可以进行全部操作
    2——表示为能操作图书模块的人员
    3——表示为能操作进货模块的人员
    4——表示为能操作销售模块的人员
    5——表示为能操作库存模块的人员

    2、图书管理(Book.txt)

    3、进货管理(InMain.txt)

    4、进货明细管理(InDetail.txt)

    5、销售管理(OutMain.txt)

    6、销售明细管理(OutDetail.txt)

    7、库存管理(Stock.txt)

    项目分包

    第一层:按照模块分
    用户模块(user)、
    图书(book)、
    进货(in)、
    销售(out)、
    库存(store)

    第二层:按照三层模式分
    表现层(ui)、逻辑层(business) 和 数据层(dao)
    通常还要增加一个值对象层(vo)

    第三层:按照层内划分去分
    视具体情况而定,如business和dao内还要再采用铁三角的形式建子包,而ui和vo则不需要再划分子包)。

    项目分层思想:

    未完善,请继续关注本系列(二)

    下面为部分代码:(util里面的一个公共类)
    cn.hncu.bookStore.util
    FileIoUtil.java:

    package cn.hncu.bookStore.util;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.util.ArrayList;
    import java.util.List;
    import javax.swing.JOptionPane;
    
    /**
     * 用户的公用数据读取写入类
     * @author 陈浩翔
     *
     * @version 1.0
     */
    public class FileIoUtil {
    
        public FileIoUtil() {
        }
    
        /**
         * 从数据库中读取所有的数据并返回出来
         * 
         * @param fileName(数据表对应的文件名字)
         * @param ee(传递过来的泛型的类型!)
         * @return 所有表的记录!
         */
        @SuppressWarnings("unchecked")//压警告
        public static<E> List<E> readFormFile(String fileName,E ee){
            List<E> list = new ArrayList<E>();
            final File file = new File(fileName);
    
            ObjectInputStream in =null;
            if(!file.exists()){
                JOptionPane.showMessageDialog(null, "数据表不存在!");
                return list;
            }
            try {
                in = new ObjectInputStream(new FileInputStream(fileName));
                try {
                    list = (List<E>) in.readObject();
    
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally{
                if(in!=null){
                    try {
                        in.close();
                    } catch (IOException e) {
                        throw new RuntimeException("数据库关闭失败");
                    }
                }
            }
            return list;
        }
    
    
        /**
         * 写入一个list集合进入数据文件fileName
         * 
         * @param list(需要存储的数据集合)
         * @param fileName(写入到哪个文件的文件名字)
         */
        public static void write2file(List<Object> list, String fileName){
            ObjectOutputStream out = null;
    
            try {
                out = new ObjectOutputStream(new FileOutputStream(fileName));
                out.writeObject(list);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally{
                if(out!=null){
                    try {
                        out.close();
                    } catch (IOException e) {
                        throw new RuntimeException("数据库关闭失败!");
                    }
                }
            }
        }
    
    }
    

    封装的用户数据:

    cn.hncu.bookStore.user.vo;
    UserModel.java

    package cn.hncu.bookStore.user.vo;
    
    /**
     * @author 陈浩翔
     * @version 1.0
     * 
     * <br/>
     * 用于保存用户信息的值对象<br/>
     * 1、可序列化<br/>
     * 2、私有化所有变量成员,补setter-getters方法<br/>
     * 3、写equals和hashCode方法----用主键(uuid)唯一标识码<br/>
     * 4、toString方法<br/>
     * 5,空参构造方法<br/>
     */
    
    public class UserModel {
        private String uuid;//用户唯一标识码
        private String name;//用户名
        private int type;//用户类型
        private String pwd;//用户密码
        public UserModel() {
        }
    
        /**
         * 功能:得到uuid-用户唯一的标识码
         * 
         * @return 返回uuid-用户唯一的标识码
         */
        public String getUuid() {
            return uuid;
        }
    
        /**
         * 功能:设置uuid-用户唯一的标识码
         * @param uuid-用户唯一的标识码-String型参数
         */
        public void setUuid(String uuid) {
            this.uuid = uuid;
        }
    
        /**
         * 功能:得到用户的用户名
         * @return---name-用户名
         */
        public String getName() {
            return name;
        }
    
        /**
         * 功能:设置用户的用户名
         * 
         * @param name--用户设置的用户名,String型参数
         */
        public void setName(String name) {
            this.name = name;
        }
    
        /**
         * 功能:得到用户的类型:
         *  1——表示为admin,可以进行全部操作
         *  2——表示为能操作图书模块的人员
         *  3——表示为能操作进货模块的人员
         *  4——表示为能操作销售模块的人员
         *  5——表示为能操作库存模块的人员
         * @return 用户的类型
         */
        public int getType() {
            return type;
        }
    
        /**
         *  功能:设置用户的类型:
         *  1——表示为admin,可以进行全部操作
         *  2——表示为能操作图书模块的人员
         *  3——表示为能操作进货模块的人员
         *  4——表示为能操作销售模块的人员
         *  5——表示为能操作库存模块的人员
         * @param type--用户的类型-int型参数
         */
        public void setType(int type) {
            this.type = type;
        }
    
        /**
         *功能:得到用户的密码
         * @return String型,用户的密码
         */
        public String getPwd() {
            return pwd;
        }
    
        /**
         * 功能:设置用户的密码
         * @param pwd--String型参数
         */
        public void setPwd(String pwd) {
            this.pwd = pwd;
        }
    
    
        @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;
            UserModel other = (UserModel) 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 "UserModel [uuid=" + uuid + ", name=" + name + ", type=" + type
                    + ", pwd=" + pwd + "]";
        }
    
    }
    

    封装的用户查询数据:
    cn.hncu.bookStore.user.vo;
    UserQueryModel.java

    package cn.hncu.bookStore.user.vo;
    
    public class UserQueryModel extends UserModel{  
    }

    虽然这个类什么都没有,就只是继承了UserModel,但还是必须写,这是大家都遵守的java编写规范!

    用户Dao(数据层):(接口)
    cn.hncu.bookStore.user.dao.dao;
    UserDao.java

    package cn.hncu.bookStore.user.dao.dao;
    
    import java.util.List;
    
    import cn.hncu.bookStore.user.vo.UserModel;
    import cn.hncu.bookStore.user.vo.UserQueryModel;
    
    /**
     * 
     * @author 陈浩翔
     *
     * @version 1.0
     * 用户模块的数据层接口
     */
    public interface UserDao {
        /**
         * 功能:创建一个用户
         * 
         * @param userModel---将要创建的用户数据
         * @return---true表示创建成功,false表示创建失败
         */
        public boolean create(UserModel user);
    
        /**
         * 功能:删除一个用户
         * 
         * @param uuid---用户唯一的标识码,每个用户都不会相同
         * @return---true表示删除成功,false表示删除失败
         */
        public boolean delete(String uuid);
    
        /**
         * 功能:修改用户数据资料
         * 
         * @param user---需要修改的用户数据参数名
         * @return 返回true-表示修改成功了,返回false-表示修改失败
         */
        public boolean update(UserModel user);
    
        /**
         * 功能:得到所有的用户数据
         * 
         * @return---一个UserModel集合,也就是用户的数据
         */
        public List<UserModel> getAll();
    
        /**
         * 功能:按照一定的查找条件进行查找,
         * <br/>
         * 把满足查找条件的用户数据返回。
         * 
         * @param uqm---被封装的查找条件
         * @return---满足查找条件的用户数据集合
         */
        public List<UserModel> getbyCondition(UserQueryModel uqm);
    
        /**
         * 功能:得到一个确定的用户的数据资料
         * 
         * @param uuid---用户唯一标识码
         * @return ---返回按这个唯一标识码找到的用户数据
         */
        public UserModel getSingle(String uuid);
    
    }
    
  • 相关阅读:
    SpringBoot Lombok使用详解1(基本介绍、安装配置、var和val)
    SpringBoot 实现文件上传2(多文件上传、常用上传参数配置)
    SpringBoot 解决跨域请求问题(No 'AccessControlAllowOrigin' header is...)
    SpringBoot 实现静态资源的访问(附:修改过滤规则、静态资源位置)
    SpringBoot 获取Get请求参数详解(附样例:非空、默认值、数组、对象)
    SpringBoot 实现文件上传1(单文件上传、常用上传参数配置)
    SpringBoot 获取POST请求参数详解(附样例:表单数据、json、数组、对象)
    SpringBoot @ControllerAdvice的使用详解3(请求参数预处理 @InitBinder)
    SpringBoot @ControllerAdvice的使用详解1(全局异常处理 @ExceptionHandler)
    解决自动禁用Flash打开摄像头询问
  • 原文地址:https://www.cnblogs.com/webmen/p/5739323.html
Copyright © 2020-2023  润新知