牛刀弑鸡,用SpringMVC的架构模式来描绘一下普通java程序之图书管理免费代码分享

完整代码点击跳转

需求分析

实验目的

强化集合和常用API的知识点以及编程能力,以及逻辑思维能力,个人试验目的在于锻炼并加强MVC架构环境的搭建能力

结构介绍

      该项目我采用SSM框架的SpringMVC架构模式,
采用面向接口编程的思想完成结构搭建,对象注入为单例模式仿照,其中controller为视图控制层,控制界面的跳转;
service为业务逻辑层,处理并管理后台数据,dao为持久化层的模式仿照(项目未连接数据库),
存储整个项目的数据。BooksManagement为启动类。

功能介绍

  1. controller包下有两个视图跳转器,第一个是booksController,负责图书管理系统主界面,添加图书,删除图书,
    图书查询的视图呈现,视图相互之间有跳转的连接通道,第二个为userController,负责用户账号注册,
    登入功能,密码修改的逻辑实现。
  2. dao包有两个数据交换的接口,以及实现类,在实际开发中实现类是不存在的,是整合数据库进行数据交换的,第一个bookDaoImpl存储的是书籍信息,
    第二个UserDaoImpl存储的是用户信息
  3. entity是实体类,因为我数据存储是模拟数据库,所以使用的是map集合,采用的键值对的方式,存储值为books对象
  4. service包下就全为业务逻辑,也就是数据分析判断的接口及其实现类。

代码解析

  • 需求一:管理员账号随机生成
    • 解决:核心代码位于UserDaoImpl类中,实现方法为create,账号前三位是随机生成的字母,后三位是随机生成的数字,采用random随机数完成,
      并用String类的contact()方法连接字符串
  • 需求二:自定义密码及密码长度不能小于6位
    • 解决:代码位于userController类下,做主要逻辑判断,用了String类的isEmpty()和length()方法解题
  • 需求三:实现添加图书的功能和修改功能
    • 解决:实体类为books位于entity包下,功能选择在booksController类中,业务逻辑判断主要有图书编号是否重复,如果重复则拒绝添加,
      并反馈失败信息,如果编号重复的情况下,书名,作者与出版社相同,则修改新添加的价格和累计数量,书籍信息修改在dao层完成,
      编号修改与当前传入编号不同且重复则操作失败,获取时间用的是SimpleDateFormat方法对内置Data对象的时间戳进行格式化,再输出当前系统时间
  • 需求三:删除图书并打印
    • 解决:使用的是map的remove方法,根据图书编号删除,然后对返回的map集合转换为set集合进行遍历,用的是keySet方法转换,foreach循环,
      如果忘记图书编号,可以使用图书名称进行编号查询,这里用的是map集合可以体现键值对关系的entrySet方法
  • 需求四:图书查找
    • 解决:根据编号可以查询完整的图书信息,如果忘记编号可以书名查询编号,用的是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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CharmDeer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值