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); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我。
Java设计系列之书店管理系统单机版的更多相关文章
- J2EE课程设计:在线书店管理系统
1.系统实现 使用SpringMVC框架进行开发 使用Maven进行系统构建 使用MySql数据库 项目只实现了查看图书,搜索图书,加入购物车,创建订单,图书管理等基本功能 前台使用Bootstrap ...
- Java-单机版的书店管理系统(练习设计模块和思想_系列汇总)
介绍: 本软件系列到此,我已经全部写完了. 项目练习目标 : 1.Java应用程序基本分析 2.培养面向对象编程的基本思想 3.Java基本设计模式综合应用 4.掌握分层和接口的基本设计 5.构建合理 ...
- 当我们说线程安全时,到底在说什么——Java进阶系列(二)
原创文章,同步发自作者个人博客,转载请以超链接形式在文章开头处注明出处http://www.jasongj.com/java/thread_safe/ 多线程编程中的三个核心概念 原子性 这一点,跟数 ...
- java io系列01之 "目录"
java io 系列目录如下: 01. java io系列01之 "目录" 02. java io系列02之 ByteArrayInputStream的简介,源码分析和示例(包括 ...
- Java 集合系列 15 Map总结
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- Java 集合系列 14 hashCode
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- java多线程系列(九)---ArrayBlockingQueue源码分析
java多线程系列(九)---ArrayBlockingQueue源码分析 目录 认识cpu.核心与线程 java多线程系列(一)之java多线程技能 java多线程系列(二)之对象变量的并发访问 j ...
- Java集合系列[4]----LinkedHashMap源码分析
这篇文章我们开始分析LinkedHashMap的源码,LinkedHashMap继承了HashMap,也就是说LinkedHashMap是在HashMap的基础上扩展而来的,因此在看LinkedHas ...
- Java基础系列--static关键字
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8477914.html 一.概述 static关键字是Java诸多关键字中较常使用的一个,从 ...
随机推荐
- 【题解】[APIO2010]特别行动队
Link 题目大意:一段区间的贡献是\(ax^2+bx+c,x=\sum v\),求一个划分让总区间的价值最大.分段必须连续. \(\text{Solution:}\) 设计\(dp[i]\)表示前\ ...
- Apache账户密码加密方式介绍
一.apache密码存储格式 apache的用户密码一般会生成保存在.htpasswd文件中,保存路径由用户创建时确定,根据使用加密算法有五种保存格式: [注]:如果用户指定了保存密码的文件名,视用户 ...
- Zookeeper基础理论
Zookeeper是分布式开源协调服务, 主要用来解决分布式集群中应用系统的一致性问题. 本质上是分布式小文件存储系统. 特性 全局数据一致性(集群中每个服务器保存一份相同的数据副本,Client ...
- 收集的照片信息都是Excel超链接?批量命名很困难?来试试这个自制的下载器吧!
项目背景 作为大学的一名班委,经常要制作各种表格.统计各种信息,成为一名合格的"表哥"是一门必修课.其实Excel的文字信息和数字信息的统计和处理还并不算难题,很多信息可以通过问卷 ...
- DE2资源集锦
1.The School of Electrical and Computer Engineering (ECE) at the Georgia Institute of Technology:htt ...
- 多测师讲解a'pi自动化框架设计思想_高级讲师肖sir
API自动化框架API自动化框架分为conf.data.utils.api.testcase.runner.report.log8个模块.conf是用来储存系统环境.数据库.邮件等的配置参数.项目的绝 ...
- localhost与127.0.0.1与0.0.0.0
localhost localhost其实是域名,一般系统默认将localhost指向127.0.0.1,但是localhost并不等于127.0.0.1,localhost指向的IP地址是可以配置的 ...
- python 读取文件时报错UnicodeDecodeError
python 读取文件时报错UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 205: illegal multib ...
- linux(centos8):kubeadm单机安装kubernetes(kubernetes 1.18.3)
一,kubernetes安装的准备工作: 1,准备工作的各步骤请参见: https://www.cnblogs.com/architectforest/p/13141743.html 2, ma ...
- centos8平台使用blkid查看分区信息
一,blkid的用途 blkid 命令是一个命令行工具,它可以显示关于可用块设备的信息 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/archite ...