需求分析
实验目的
强化集合和常用API的知识点以及编程能力,以及逻辑思维能力,个人试验目的在于锻炼并加强MVC架构环境的搭建能力
结构介绍
该项目我采用SSM框架的SpringMVC架构模式,
采用面向接口编程的思想完成结构搭建,对象注入为单例模式仿照,其中controller为视图控制层,控制界面的跳转;
service为业务逻辑层,处理并管理后台数据,dao为持久化层的模式仿照(项目未连接数据库),
存储整个项目的数据。BooksManagement为启动类。
功能介绍
- controller包下有两个视图跳转器,第一个是booksController,负责图书管理系统主界面,添加图书,删除图书,
图书查询的视图呈现,视图相互之间有跳转的连接通道,第二个为userController,负责用户账号注册,
登入功能,密码修改的逻辑实现。 - dao包有两个数据交换的接口,以及实现类,在实际开发中实现类是不存在的,是整合数据库进行数据交换的,第一个bookDaoImpl存储的是书籍信息,
第二个UserDaoImpl存储的是用户信息 - entity是实体类,因为我数据存储是模拟数据库,所以使用的是map集合,采用的键值对的方式,存储值为books对象
- service包下就全为业务逻辑,也就是数据分析判断的接口及其实现类。
代码解析
- 需求一:管理员账号随机生成
- 解决:核心代码位于UserDaoImpl类中,实现方法为create,账号前三位是随机生成的字母,后三位是随机生成的数字,采用random随机数完成,
并用String类的contact()方法连接字符串
- 解决:核心代码位于UserDaoImpl类中,实现方法为create,账号前三位是随机生成的字母,后三位是随机生成的数字,采用random随机数完成,
- 需求二:自定义密码及密码长度不能小于6位
- 解决:代码位于userController类下,做主要逻辑判断,用了String类的isEmpty()和length()方法解题
- 需求三:实现添加图书的功能和修改功能
- 解决:实体类为books位于entity包下,功能选择在booksController类中,业务逻辑判断主要有图书编号是否重复,如果重复则拒绝添加,
并反馈失败信息,如果编号重复的情况下,书名,作者与出版社相同,则修改新添加的价格和累计数量,书籍信息修改在dao层完成,
编号修改与当前传入编号不同且重复则操作失败,获取时间用的是SimpleDateFormat方法对内置Data对象的时间戳进行格式化,再输出当前系统时间
- 解决:实体类为books位于entity包下,功能选择在booksController类中,业务逻辑判断主要有图书编号是否重复,如果重复则拒绝添加,
- 需求三:删除图书并打印
- 解决:使用的是map的remove方法,根据图书编号删除,然后对返回的map集合转换为set集合进行遍历,用的是keySet方法转换,foreach循环,
如果忘记图书编号,可以使用图书名称进行编号查询,这里用的是map集合可以体现键值对关系的entrySet方法
- 解决:使用的是map的remove方法,根据图书编号删除,然后对返回的map集合转换为set集合进行遍历,用的是keySet方法转换,foreach循环,
- 需求四:图书查找
- 解决:根据编号可以查询完整的图书信息,如果忘记编号可以书名查询编号,用的是map集合的entrySet方法
- 需求五:
- 解决:userController类下实现修改密码功能,首先输入原始密码进行判断,业务逻辑层判断,才允许使用新密码修改,新密码长度仍然不能小于6位
项目需求及总结图表:
完整代码:
结构图:
需求一,管理员账号随机生成,密码自定义
视图控制层:(userController)
package com.ldx.controller;
import com.ldx.servicce.userService;
import com.ldx.servicce.userServiceImpl;
import java.util.Scanner;
public class userController {
private final userService userService=new userServiceImpl();
Scanner sc = new Scanner(System.in);
public void create(){
System.out.println("----------管理员初始化---------");
System.out.println("您的管理员账号为:"+userService.create());
password();
}
public void password(){
System.out.println("请输入您的密码:");
String passwordInit=sc.next();
if(passwordInit.isEmpty()){
System.out.println("警告:密码不能为空!");
password();
}else if(passwordInit.length()<6){
System.out.println("警告:密码长度不能小于六位!");
password();
}
System.out.println("请确认您的密码:");
String password=sc.next();
if(!passwordInit.equals(password)){
System.out.println("警告:两次输入的密码不相同");
password();
}
userService.save(password);
System.out.println("密码设置成功!");
login();
}
public void login(){
System.out.println("----------管理员登入---------");
System.out.println("请输入管理员账号:");
String username=sc.next();
System.out.println("请输入管理员密码:");
String password=sc.next();
String login = userService.login(username, password);
if(login!=null){
System.out.println(login);
login();
}
new booksController().home();
}
public void alert(){
int i = userService.alert();
if(i==0){
new booksController().home();
}else {
login();
}
}
}
业务逻辑处理接口:(userService)
package com.ldx.servicce;
public interface userService {
String create();
void save(String password);
String login(String username,String password);
int alert();
}
实现类及其处理(userServiceImpl)
package com.ldx.servicce;
import com.ldx.dao.UserDao;
import com.ldx.dao.UserDaoImpl;
import java.util.Scanner;
public class userServiceImpl implements userService{
private final UserDao userDao=new UserDaoImpl();
@Override
public String create() {
return userDao.create();
}
@Override
public void save(String password) {
userDao.save(password);
}
@Override
public String login(String username, String password) {
return userDao.login(username,password);
}
@Override
public int alert() {
Scanner sc=new Scanner(System.in);
System.out.println("请输入原始密码:");
String oldPassword = sc.next();
System.out.println("请输入新密码:");
String newPassword = sc.next();
System.out.println("请确认新密码:");
String password = sc.next();
if(!newPassword.equals(password)){
System.out.println("警告:两次输入密码不一样");
alert();
}else if(password.length()<6){
System.out.println("警告:密码长度不能小于六位");
alert();
}
int i = userDao.alert(oldPassword,password);
if(i==0){
System.out.println("警告:原密码错误,修改失败!");
return 0;
}else {
System.out.println("修改密码成功");
return 1;
}
}
}
数据持久层接口:(userDao)
package com.ldx.dao;
public interface UserDao {
String create();
void save(String password);
String login(String username,String password);
int alert(String oldPassword,String password);
}
伪数据库:(userDaoImpl)
package com.ldx.dao;
import java.util.HashMap;
public class UserDaoImpl implements UserDao{
static HashMap<String, String> msg = new HashMap<>();
/*普通创建功能*/
@Override
public String create() {
String[] word={"a","b","c","d","e","f","g","h",
"i","j","k","l","m","n","o","p","q","r",
"s","t","u","v","w","x","y","z"};
String username = "";
for(int i=0;i<3;i++){
int chooseWord=(int)(Math.random()*26);
username=username.concat(word[chooseWord]);
}
for(int i=0;i<3;i++){
int number=(int)(Math.random()*10);
username=username.concat(String.valueOf(number));
}
msg.put("username",username);
return username;
}
/*数据库功能注册密码*/
@Override
public void save(String password){
msg.put("password", password);
}
@Override
public String login(String username, String password) {
if(!username.equals(msg.get("username"))){
return "警告:账号错误";
}else if(!password.equals(msg.get("password"))){
return "警告:密码错误";
}
return null;
}
@Override
public int alert(String oldPassword,String password) {
if(!oldPassword.equals(msg.get("password"))){
return 0;
}
msg.remove("password");
msg.put("password",password);
return 1;
}
}
需求二、图书操作
视图控制层(booksController)
package com.ldx.controller;
import com.ldx.servicce.booksService;
import com.ldx.servicce.booksServiceImpl;
import java.util.Scanner;
public class booksController {
private final booksService booksService=new booksServiceImpl();
Scanner sc = new Scanner(System.in);
public void home(){
System.out.println("----------图书管理系统---------");
System.out.println("1.添加图书");
System.out.println("2.删除图书");
System.out.println("3.修改图书");
System.out.println("4.查找图书");
System.out.println("5.修改密码");
System.out.println("6.退出系统");
String str=sc.next();
switch (str){
case "1":addBooks();home();break;
case "2":deleteBook();home();break;
case "3":upload();home();break;
case "4":select();home();break;
case "5":new userController().alert();break;
case "6":System.exit(0);
default:
System.out.println("警告:错误选项!");home();
}
}
public void addBooks(){
System.out.println("----------图书添加--------");
booksService.addBooks();
}
public void deleteBook(){
System.out.println("----------图书删除--------");
System.out.println("1.根据图书编号删除图书");
System.out.println("2.忘记图书编号");
String str=sc.next();
switch (str) {
case "1":
booksService.deleteBook();
home();
case "2":
booksService.findId();
home();
default:
System.out.println("警告:错误选项!");home();
}
}
public void upload(){
System.out.println("----------图书修改--------");
System.out.println("1.输入图书编号修改");
System.out.println("2.忘记图书编号");
String str=sc.next();
switch (str) {
case "1":
booksService.upload();
home();
case "2":
booksService.findId();
home();
default:
System.out.println("警告:错误选项!");home();
}
}
public void select(){
System.out.println("----------图书查询--------");
System.out.println("1.根据图书编号查询图书");
System.out.println("2.忘记图书编号");
System.out.println("3.书库全查");
String str=sc.next();
switch (str) {
case "1":
booksService.selectById();
home();
case "2":
booksService.findId();
home();
case "3":
booksService.selectAll();
home();
default:
System.out.println("警告:错误选项!");home();
}
}
}
业务逻辑层接口:(booksService)
package com.ldx.servicce;
public interface booksService {
void addBooks();
void deleteBook();
void findId();
void selectById();
void selectAll();
void upload();
void uploadChoose(Integer i);package com.ldx.servicce;
}
业务逻辑层实现类(booksServiceImpl)
import com.ldx.controller.booksController;
import com.ldx.dao.booksDao;
import com.ldx.dao.booksDaoImpl;
import com.ldx.entity.books;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
public class booksServiceImpl implements booksService{
private final booksDao booksDao=new booksDaoImpl();
Scanner sc = new Scanner(System.in);
@Override
public void addBooks() {
try {
System.out.println("请输入图书编号:");
Integer id=sc.nextInt();
System.out.println("请输入图书名称:");
String bookName = sc.next();
System.out.println("请输入图书作者:");
String author = sc.next();
System.out.println("请输入图书价格:");
double price = sc.nextDouble();
System.out.println("请输入图书出版社:");
String press = sc.next();
System.out.println("请输入图书数量:");
Integer nums = sc.nextInt();
Map<Integer, books> map = booksDao.addBooks(id, bookName, author, price, press, nums);
if(map==null){
System.out.println("警告:不同书籍编号不允许重复");
addBooks();
}else {
System.out.println("添加成功!");
System.out.println("书库信息:");
Set<Integer> integers = map.keySet();
for (Integer integer : integers) {
System.out.println("图书编号:"+integer+","+map.get(integer));
}
}
}catch (Exception e){
System.out.println("警告:存在错误信息!");
new booksController().home();
}
}
@Override
public void deleteBook() {
System.out.println("请输入删除书籍的编号");
int i = sc.nextInt();
Map<Integer, books> map = booksDao.deleteBook(i);
if(map==null){
System.out.println("警告:书籍编号对应书籍不存在");
new booksController().home();
}else {
System.out.println("删除成功!");
System.out.println("书库信息:");
Set<Integer> integers = map.keySet();
for (Integer integer : integers) {
System.out.println("图书编号:"+integer+","+map.get(integer));
}
}
}
@Override
public void upload() {
System.out.println("请输入图书编号:");
int i = sc.nextInt();
books book = booksDao.selectById(i);
if(book==null){
System.out.println("书库中未找到该书籍");
}else {
uploadChoose(i);
}
}
@Override
public void uploadChoose(Integer i) {
booksDao.uploadChoose(i);
}
@Override
public void findId() {
System.out.println("请输入书籍的名称");
String name = sc.next();
int id = booksDao.findId(name);
if(id==0){
System.out.println("书籍不存在");
}else {
System.out.println("该书籍对应的编号为:"+id);
}
}
@Override
public void selectById() {
System.out.println("请输入图书编号:");
int i = sc.nextInt();
books book = booksDao.selectById(i);
if(book==null){
System.out.println("书库中未找到该书籍");
}else {
System.out.println(book);
}
}
@Override
public void selectAll() {
Map<Integer, books> map = booksDao.selectAll();
if(map!=null){
Set<Map.Entry<Integer, books>> entries = map.entrySet();
for (Map.Entry<Integer, books> entry : entries) {
Integer key = entry.getKey();
books b = entry.getValue();
System.out.println("书籍编号:"+key+","+b);
}
}else {
System.out.println("书库为空!");
}
}
}
}
持久化层接口(booksDao)
package com.ldx.dao;
import com.ldx.entity.books;
import java.util.Map;
public interface booksDao {
Map<Integer, books> addBooks(Integer id,String bookName, String author, double price, String press, Integer nums);
Map<Integer, books> deleteBook(Integer id);
int findId(String bookName);
books selectById(Integer id);
Map<Integer, books> selectAll();
void uploadChoose(Integer in);
}
伪数据库:(booksDaoImpl)
package com.ldx.dao;
import com.ldx.entity.books;
import java.text.SimpleDateFormat;
import java.util.*;
public class booksDaoImpl implements booksDao {
static Map<Integer, books> map = new HashMap<>();
@Override
public Map<Integer, books> addBooks(Integer id, String bookName, String author, double price, String press, Integer nums) {
if (!map.isEmpty()) {
Set<Map.Entry<Integer, books>> entries = map.entrySet();
for (Map.Entry<Integer, books> entry : entries) {
Integer key = entry.getKey();
books b = entry.getValue();
if (key.equals(id) && b.getBookName().equals(bookName) && b.getAuthor().equals(author) && b.getPress().equals(press)) {
nums += b.getNums();
map.remove(key);
map.put(id, new books(bookName, author, price, press, nums));
return map;
} else if (key.equals(id)) {
return null;
}
}
map.put(id, new books(bookName, author, price, press, nums));
return map;
}
map.put(id, new books(bookName, author, price, press, nums));
return map;
}
@Override
public Map<Integer, books> deleteBook(Integer id) {
if (!map.isEmpty()) {
map.remove(id);
return map;
}
return null;
}
@Override
public void uploadChoose(Integer in) {
try {
Scanner sc = new Scanner(System.in);
System.out.println("********修改图书*********");
System.out.println("请修改图书ID:");
Integer id = sc.nextInt();
Set<Integer> key = map.keySet();
for (Integer i : key) {
if(id.equals(i)&&!id.equals(in)){
System.out.println("警告:书籍编号重复!");
return;
}
}
map.remove(in);
System.out.println("请修改图书名称:");
String bookName = sc.next();
System.out.println("请修改图书作者:");
String author = sc.next();
System.out.println("请修改图书单价:");
double price = sc.nextDouble();
System.out.println("请修改图书出版社:");
String press = sc.next();
System.out.println("请修改图书数量:");
int nums = sc.nextInt();
map.put(id, new books(bookName, author, price, press, nums));
System.out.println("书籍编号:"+id+","+map.get(id));
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("操作成功时间:" + df.format(new Date()));
} catch (Exception e) {
System.out.println("警告:错误操作!");
}
}
@Override
public int findId(String bookName) {
if (!map.isEmpty()) {
Set<Map.Entry<Integer, books>> entries = map.entrySet();
for (Map.Entry<Integer, books> entry : entries) {
Integer key = entry.getKey();
books b = entry.getValue();
if (b.getBookName().equals(bookName)) {
return key;
}
}
}
return 0;
}
@Override
public books selectById(Integer id) {
if (!map.isEmpty()) {
Set<Integer> integers = map.keySet();
for (Integer integer : integers) {
if (integer.equals(id)) {
return map.get(id);
}
}
}
return null;
}
@Override
public Map<Integer, books> selectAll() {
if (!map.isEmpty()) {
return map;
}
return null;
}
}