图书管理系统
1.实现程序框架的搭建
1.1.编写相关的实体类
1.1.1.Book实体类的属性
private String bookCode;//图书号
private String bookName;//图书名称
private String bookPirce;//图书价格
private String bookPath;//图书路径
private Integer commCount=0;//评论数
private boolean isVip=false; //是否VIP
1.1.2.Comment实体类信息
private String commCode; //编号
private String userCode; //用户编号
private String nickname; //昵称
private String bookCode; //图书编号
private String content; //评论内容
private Integer score; //评分
private Date commentDate; //发表时间
1.1.3.User实体类信息
private String userCode; //编号
private String loginName; //登录名
private String loginPwd; //密码
private String nickname; //昵称
private String status="yes"; //状态
private Integer score =0; //积分
private String level ="1"; //管理员0或普通用户 1
1.2.编写工具类
1.2.1.CodeUtil用于生成一个独立ID
1.2.2.DataUtil用户保存程序产生所有的数据
1.2.2.1.DataUtil集合的定义
1.2.2.2.数据的初始化(使用静态块)
1.2.2.3.数据的测试(要明白数据之间的关联关系)
注意:图书信息的显示代码并不完整,需要自己补齐(参考用户显示)
2.实现登录功能
2.1.添加UserDao并根据用户名和密码实现查询功能
2.2.添加BookMenu菜单类
2.2.1.在BookMenu中添加公共变量
2.2.2.并添加一个主菜单功能
public static void main(String[] args) {
mainMenu();
}
// 主菜单功能
public static void mainMenu() {
int choose = 0;
do {
System.out.println("1:登录");
System.out.println("2:注册");
System.out.println("0:退出");
choose = input.nextInt();
switch (choose) {
case 1:
login();
break;
case 2:
System.out.println("暂无实现");
break;
case 0:
System.out.println("退出");
break;
default:
System.out.println("选项错误");
}
} while (choose != 0);
System.out.println("程序结束");
}
2.2.3.添加登录菜单功能(login())
// 登录页面功能
public static void login() {
for (int i = 0; i < 3; i++) {
System.out.println("请输入用户名:");
String uname = input.next();
System.out.println("请输入用户密码:");
String upass = input.next();
loginUser = userDao.login(uname, upass);
if (loginUser != null) {
// 普通用户被冻结
if (loginUser.getStatus().equals("no")) {
System.out.println("用户信息已被冻结,请联系管理员");
break;
}
// 保存登录对象
System.out.println("登录成功");
if (loginUser.getLevel().equals("0")) {
// 管理员登录
System.out.println("欢迎管理员");
//showAdminMenu();
} else {
// 普通用户登录
System.out.println("欢迎普通用户");
//showUserMenu();
}
return;
}
if (i < 2) {
System.out.println("用户名密码错误,请重新输入");
} else {
System.out.println("三次登录机会已被用完");
}
}
}
运行程序,测试是否可以登录成功
3.完成管理员登录后显示所有图书和添加图书的功能(添加图书的名称不重复)
3.1.添加BookDao类
3.2.并添加查询所有图书和添加图书的功能,根据图书名称查询图书信息的方法
3.2.1.查询所有图书
3.2.2.根据图书名称查询单个图书
3.2.3.添加图书
3.3.修改BookMenu类,添加管理官登录后的主菜单
在BookMenu类中添加公共的BookDao类
3.3.1.管理员登录的主菜单
// 管理员主界面
public static void showAdminMenu() {
System.out.println("欢迎:" + loginUser.getNickname() + "登录");
int choose = 0;
do {
System.out.println("1:普通用户管理");
System.out.println("2:图书管理");
System.out.println("0:退出");
choose = input.nextInt();
switch (choose) {
case 1:
System.out.println("暂无实现");
break;
case 2:
showBookInfo();
break;
case 0:
System.out.println("退出");
break;
default:
System.out.println("选项错误");
}
} while (choose != 0);
}
3.3.2.定义显示图书的方法(showBookInfo())
// 显示图书信息功能
public static void showBookInfo() {
int choose = 0;
List<Book> bookList = bookDao.findBooks();
System.out.println("图书编号\t图书名称\t图书价格\t图书评论\t是否VIP");
for (int i = 0; i < bookList.size(); i++) {
Book book = bookList.get(i);
System.out.println(book.getBookCode() + "\t" + book.getBookName() + "\t" + book.getBookPirce() + "\t"
+ book.getCommCount() + "\t" + book.isVip());
}
// 显示用户的信息完毕后调用处理功能
System.out.println("1:添加图书");
System.out.println("2:删除图书");
choose = input.nextInt();
switch (choose) {
case 1:
addBook();
break;
case 2:
System.out.println("暂无实现");
break;
}
}
3.3.3.实现添加图书的功能
// 添加图书信息功能
public static void addBook() {
String bookname = "";
boolean isHave = false;
// 判断图书的名称是否重复
do {
isHave = false;
System.out.println("请输入图书名称:");
bookname = input.next();
Book book = bookDao.findBookByName(bookname);
if (book != null) {
System.out.println("图书名称重复,请换名称");
isHave = true;
}
} while (isHave);
System.out.println("请输入图书价格:");
String price = input.next();
System.out.println("请输入图书路径:");
String path = input.next();
Book book1 = new Book();
book1.setBookCode(CodeUtil.getCode());
book1.setBookName(bookname);
book1.setBookPath(path);
book1.setBookPirce(price);
book1.setCommCount(0);
book1.setVip(false);
// 设置新的图书信息,并添加
bookDao.addBooks(book1);
}
编写完代码后运行程序,测试是否能添加图书的功能
4.完成普通用户登录后查询图书列表功能
4.1.修改BookMenu类,添加普通用户登录后的菜单(showUserMenu())
//普通用户主菜单
public static void showUserMenu(){
System.out.println("欢迎:" + loginUser.getNickname() + "当前积分:"+ loginUser.getScore()+"分");
int choose = 0;
do {
System.out.println("1:查询我的评论");
System.out.println("2:查询图书信息");
System.out.println("0:退出");
choose = input.nextInt();
switch (choose) {
case 1:
//showUserCommInfo();
break;
case 2:
showUserBookInfo();
break;
case 0:
System.out.println("退出");
break;
default:
System.out.println("选项错误");
}
} while (choose != 0);
}
4.2.显示普通用户登录后的图书列表信息(showUserBookInfo())
public static void showUserBookInfo(){
int choose = 0;
List<Book> bookList = bookDao.findBooks();
System.out.println("图书编号\t图书名称\t图书价格\t图书评论\t是否VIP");
for (int i = 0; i < bookList.size(); i++) {
Book book = bookList.get(i);
System.out.println(book.getBookCode() + "\t" + book.getBookName() + "\t" +
book.getBookPirce() + "\t"+ book.getCommCount() + "\t" + book.isVip());
}
// 显示用户的信息完毕后调用处理功能
System.out.println("1:阅读图书");
System.out.println("2:下载图书");
System.out.println("3:发表图书评论");
System.out.println("4:查看图书的评论");
choose = input.nextInt();
switch (choose) {
case 1:
System.out.println("暂无实现");
break;
case 2:
System.out.println("暂无实现");
break;
case 3:
System.out.println("添加书评");
break;
case 4:
System.out.println("暂无实现");
break;
}
}
测试:普通用户登录后是否可以查看所有的图书列表信息
5.完成普通用户登录后查询自己发表的评论功能
5.1.添加一个CommentDao实现查询用户自己评论的信息
5.2.修改BookMenu类实现用户评论信息的显示
//显示用户的评论信息
public static void showUserCommInfo(){
//根据登录用户ID,查询用户的评论
List<Comment> commentList = commentDao.findCommentByUsercode(loginUser.getUserCode());
System.out.println("评论编号\t\t评论内容\t昵称\t评分\t图书名称");
for (int i = 0; i < commentList.size(); i++) {
Comment comment = commentList.get(i);
//根据图书编号获取图书对应的对象
Book book = bookDao.findBookByCode(comment.getBookCode());
System.out.println(comment.getCommCode() + "\t" + comment.getContent() + "\t" +
comment.getNickname() + "\t"+ comment.getScore() + "\t" + book.getBookName());
}
}
测试:能否查看当前登录用户的评论内容
6.完成普通用户登录后发表图书评论功能
(1 首先需要整体增加一个评论,2:当前登录用户增加一个评论 3:某一本图书增加一个评论 4:修改图书的评论的个数 5:修改当前用户的积分)
6.1.修改UserDao增加一个方法,修改用户信息的方法
6.2.修改BookDao增加一个方法,修改图书信息的方法
6.3.修改CommentDao增加一个方法,添加图书评论的方法
public void addComment(Comment comment) {
//整体评论增加
DataUtil.commentList.add(comment);
//为对应的用户添加评论列表
//如果该用户之前已发表评论信息
if(DataUtil.userCommentMap.containsKey(comment.getUserCode())){
List<Comment> commentList = DataUtil.userCommentMap.get(comment.getUserCode());
commentList.add(comment);
}else{
//用户第一次发表评论
List<Comment> commentList = new ArrayList<Comment>();
commentList.add(comment);
//为该用户保存评论的列表
DataUtil.userCommentMap.put(comment.getUserCode(), commentList);
}
//为对应的图书添加图书列表
if(DataUtil.bookCommentMap.containsKey(comment.getUserCode())){
List<Comment> commentList = DataUtil.bookCommentMap.get(comment.getBookCode());
commentList.add(comment);
}else{
//用户第一次发表评论
List<Comment> commentList = new ArrayList<Comment>();
commentList.add(comment);
//为该用户保存评论的列表
DataUtil.bookCommentMap.put(comment.getBookCode(), commentList);
}
}
6.4.修改BookMenu类
6.4.1.添加公共变量
6.4.2.增加方法,实现发表评论的功能
public static void userAddComment(){
Book book=null;
//判断图书编号是否正确
do{
System.out.println("请输入图书编号:");
String bcode =input.next();
book = bookDao.findBookByCode(bcode);
if(book==null){
System.out.println("图书编号错误,重新输入");
}
}while(book==null);
System.out.println("请输入评论内容");
String commstr=input.next();
System.out.println("请输入分");
Integer commscore=input.nextInt();
//创建评论的对象 ,并添加评论
Comment comment = new Comment();
comment.setBookCode(book.getBookCode()); //当前图书本书的 评论
comment.setUserCode(loginUser.getUserCode());//当前登录者的评论
comment.setCommentDate(new Date());
comment.setContent(commstr);
comment.setNickname(loginUser.getNickname());
comment.setScore(commscore);
comment.setCommCode(CodeUtil.getCode());
commentDao.addComment(comment);
//修改用户积分(发表一次评论积分增加1分)
loginUser.setScore(loginUser.getScore()+1 );
userDao.updateUser(loginUser);
//修改图书的评论数(新发表了一个图书,)
book.setCommCount( book.getCommCount() +1 );
bookDao.update(book);
}
测试用户是否可以能够发表评论
7.在退出系统的时候完成系统数据的序列化操作,在启动程序的时候完成数据的反序列化操作
(保证对象能够序列化,用具类实现读取对象和写入对象的功能,在启动和停止程序的时候完成对象的保存和读取)
7.1.修改Book,Comment,User实体类,都要实现Serializale接口
7.2.编写FileUtil工具类,添加保存和写入对象的方法
要自己在项目中创建data文件夹
7.3.在程序结束的时候,保存数据
7.4.在程序加载数据的时候,读取数据对象
7.5.测试功能是否完成
第一次登陆,发表一个评论,然后退出,然后再次启动程序,登录后查询是否存在上一次发表的评论信息
8.添加图书的同时,完成图书文件的上传(上传的文件要保证图书名称不能重复)
8.1.修改FileUtil类,添加上传图书的方法
要保证项目根目录下存在books文件夹
实现图书的上传,同时完成文件名称的修改
//上传图书,返回图书的名称
public static String uploadBook(String bookpath) throws Exception{
//获取上传文件的对象
File file = new File(bookpath);
if(!file.exists()){
throw new Exception("上传的文件不存在");
}
//获取文件名称
String bookname = file.getName();
//只能上传记事本文件
if(!"txt".equals(bookname.substring(bookname.lastIndexOf(".")+1))){
throw new Exception("图书只能是记事本文件");
}
//获取新的文件名称
String newbookname = getNewFileName(bookname);
//实现文件上传的功能(可以使用工具类Files.copy, 也可以使用文件流)
InputStream is = new FileInputStream(file);
OutputStream os = new FileOutputStream(BOOK_PATH+"/"+newbookname );
byte[] temp = new byte[1024];
int size = 0;
//边读边写
do{
size = is.read(temp);
if(size!=-1){
os.write(temp, 0, size);
}
}while(size!=-1);
//关闭流
os.flush();
os.close();
is.close();
return newbookname;
}
public static String getNewFileName(String filename){
//abc.txt --> abc_20190807105712.txt
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
String[] names= filename.split("\\.");
Date date = new Date(); //创建一个当前日期对象
return names[0]+"_"+sdf.format(date)+"."+names[1];
}
8.2.在管理员添加图书的时候,调用上传的功能
修改BookMenu类的addBook的方法 ,修改后需要在方法中声明异常
8.3.测试功能是否完成(添加图书后,项目中是否存在图书文件)
9.实现在线阅读图书的功能
9.1.在FileUtil工具类中添加方法,根据图书路径读取图书内容
//根据图书名称读取图书内容
public static String getFileInfo(String filename) throws Exception{
File file = new File(BOOK_PATH+"/"+filename);
if(!file.exists()){
return "此图书暂无内容";
}
//使用StringBuilder实现字符串的累加
StringBuilder sbstr=new StringBuilder();
//读取文件的内容
InputStream is = new FileInputStream(file);
byte[] temp = new byte[1024];
int size = 0;
do{
size =is.read(temp);
if(size!=-1){
sbstr.append(new String(temp,0,size));
}
}while(size!=-1);
is.close();
return sbstr.toString();
}
9.2.在BookMenu类中添加方法,实现读取图书内容的功能
然后测试,测试是否能够实现在线阅读图书的功能
10.自己完成的一些功能
10.1.自己完成注册功能(要求只能注册普通用户,登录名和密码不能和已有用户重复)
10.2.普通用户可以实现查询图书评论的功能
11.下载(一本图书图书如果是VIP 用户减少 10积分 ,如果非VIP则可以免费下载)
12.管理员可以删除图书(删除图书,删除图书对应文件,删除图书对应的评论内容)