项目练习目标 :
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——表示为能操作库存模块的人员
项目分包
第一层:按照模块分
用户模块(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 List readFormFile(String fileName,E ee){
List list = new ArrayList();
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) 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
封装的用户数据:
cn.hncu.bookStore.user.vo;
UserModel.java
package cn.hncu.bookStore.user.vo;
/**
* @author 陈浩翔
* @version 1.0
*
*
* 用于保存用户信息的值对象
* 1、可序列化
* 2、私有化所有变量成员,补setter-getters方法
* 3、写equals和hashCode方法----用主键(uuid)唯一标识码
* 4、toString方法
* 5,空参构造方法
*/
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 getAll();
/**
* 功能:按照一定的查找条件进行查找,
*
* 把满足查找条件的用户数据返回。
*
* @param uqm---被封装的查找条件
* @return---满足查找条件的用户数据集合
*/
public List getbyCondition(UserQueryModel uqm);
/**
* 功能:得到一个确定的用户的数据资料
*
* @param uuid---用户唯一标识码
* @return ---返回按这个唯一标识码找到的用户数据
*/
public UserModel getSingle(String uuid);
}