【JAVA |图书管理系统】JAVA实现图书管理系(附完整代码)

news2024/10/6 10:41:33

✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 
🎈🎈作者主页: 🎈丠丠64-CSDN博客🎈


✨✨ 帅哥美女们,我们共同加油!一起进步!✨✨ 

目录

一、前言

二、问题描述

三、思路

四、实现过程

1.book包

-Book类

-BookList类

2.user包

-User类

-AdminUser类

-NormalUser类

3.operation包

-IOperation接口

-AddOperation类

-DelOperation类 

-FindOperation类 

-ShowOperation类

-BorrowedOperation类

-RetuenOperation类

-ExitOperation类

4.主函数Main


一、前言

前面用了大量篇幅来介绍了JAVASE的大量知识,JAVA的基本语法我们了解的差不多了,我们来实操一个完整的一个代码功能包含了接口,继承等很多全面的知识,以便于我们对该部分的知识更加有印象。


二、问题描述

我们要实现一个图书管理系统,来系统的管理图书。一本书的信息包含书名,作者,类型,价格。在进入系统后首先实名制姓名,然后进入对应的菜单实现对应的功能。

普通用户只能实现查阅、借阅跟归还;

图书管理员不仅可以实现普通用户的所有功能还可以实现删减图书跟增添图书来管理。


三、思路

可以将这个问题大致分为3个模块,分别从用户,图书,以及实现的功能,三个方面去分别实现各自的大致功能,再将三个模块联系在一起来实现。

所以我们先针对这三个模块,各自建立一个包了实现各自功能。


四、实现过程

1.book包

-Book类

首先一上来就是最基本的书,我们先在book这个包下创建一个Book类,用来实现一本书的信息。

分别创建成员变量name、author、typr、price、ifBorrowed

package book;

public class Book {

    private String name;//书名
    private String author;//作者
    private String type;//类型
    private int price;//价格
    private boolean ifBorrowed;//是否被借出
    
}

并对其创建构建方法(因为默认的书就是为未借出,所以可以不构造ifBorrowed这一成员)

因为成员访问权限为private ,所以也要提供get与put函数了实现对外对其访问

并且重写ToString方法,后续会对书进行打印

package book;

public class Book {

    private String name;//书名
    private String author;//作者
    private String type;//类型
    private int price;//价格
    private boolean ifBorrowed;//是否被借出

    public Book(String name, String author, String type, int price) {
        this.name = name;
        this.author = author;
        this.type = type;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }
    public boolean isIfBorrowed() {
        return ifBorrowed;
    }

    public void setIfBorrowed(boolean ifBorrowed) {
        this.ifBorrowed = ifBorrowed;
    }

    @Override
    public String toString() {
        return "凯旋图书馆:{" +
                "书名='" + name + '\'' +
                ", 作者='" + author + '\'' +
                ", 类型='" + type + '\'' +
                ", 价格=" + price +
                ((ifBorrowed == true)?" ,被借出":" ,未借出")+
                '}';
    }
}

-BookList类

我们实现了单个图书以后,想要对图书进行一个整合,类似于书架一样的功能。我们创建一个书的数组books 通过访问下标的方式,来模拟书架对单个书进行管理。

我们先给初始化数组给定10个大小,并且创建一个成员变量用来记录目前书架上书的数量

package book;

public class BookList {
    private Book[] books = new Book[10];
    private int usedSize;//实际放书数量
}

构造方法并对其书架上面的书初始化,我们假设现在设定暂放3本书,所以usedSize也为3

package book;

public class BookList {
    private Book[] books = new Book[10];
    private int usedSize;//实际放书数量

    public BookList() {
        this.books[0] =  new Book("三国演义","罗贯中","小说",15);
        this.books[1] =  new Book("西游记","吴承恩","小说",15);
        this.books[2] =  new Book("红楼梦","曹雪芹","小说",15);
        this.usedSize = 3;
    }

}

因为成员访问权限为private,分别构造出usedSize与 books的get与put函数

package book;

public class BookList {
    private Book[] books = new Book[10];
    private int usedSize;//实际放书数量

    public BookList() {
        this.books[0] =  new Book("三国演义","罗贯中","小说",15);
        this.books[1] =  new Book("西游记","吴承恩","小说",15);
        this.books[2] =  new Book("红楼梦","曹雪芹","小说",15);
        this.usedSize = 3;
    }

    public Book getBooks(int pos) {   //相当于查看书架书的信息
        return books[pos];
    }

    public void setBooks(Book book,int pos) {   //相当于通过下标传入位置放书
        books[pos] = book;
    }

    public int getUsedSize() {
        return usedSize;
    }

    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }
}

2.user包

我们发现系统面对的两个用户,管理员和普通用户实现的功能都差不多,都是进入以后实名制以后打印对应的菜单,所以我们可以使用一个抽象类的父类来实现两个子类的功能


-User类

我们来构造一个父类,首先是子类共有的东西姓名,然后实现各自的菜单,我们可以将其写为抽象方法,子类通过重写来实现各自的菜单,因为有了抽象方法,所以该User类也是抽象类。

同时为了实现管理员与普通用户在操作上的独立性,我们可以构造一个功能数组ioPerations方法用来分别存各自的功能,再构建一个方法来实现数组对应的功能的实现

package user;

public abstract class User {
    protected String name;    //共有属性

    public User(String name) {    //构造方法
        this.name = name;
        
         public IOperation[] ioPerations;    //构造的一个功能数组
    }

    public abstract int menu();    //抽象方法  菜单,返回不同的值用来实现不同的功能

    public void doOperation(int choice, BookList bookList){

        ioPerations[choice].work(bookList);    //通过功能数组来实现各自的功能
    }
}

-AdminUser类

我们构造一个AdminUser类,来实现管理员的功能,首先继承User父类的功能在对抽象方法菜单进行重写。并且创建一个功能数组并且初始化自己的功能。

package user;

import java.util.Scanner;

public class AdminUser extends User{

    public AdminUser(String name) {    //父类的构造方法
        super(name);
    }
    
    //对应的方法数组
    this.ioPerations = new IOperation[]{                    
                new ExitOperation(),    //下标0为退出系统
                new ShowOperation(),    //下标1为显示书
                new FindOperation(),    //下标2为查找书
                new AddOperation(),    //下标3为增添书
                new DelOperation()    //下标4为删减书
        };

    @Override
    public int menu() {        //菜单
        System.out.println("***********************************");
        System.out.println(this.name + "欢迎来到管理员菜单");
        System.out.println("1. 显示书");
        System.out.println("2. 查找书");
        System.out.println("3. 增添书");
        System.out.println("4. 删减书");
        System.out.println("0. 退出系统");
        System.out.println("***********************************");
        System.out.println("请输入你的操作:");
        Scanner scanner = new Scanner(System.in);    //用户进行选择
        int choice = scanner.nextInt();

        return choice;    //返回不同的值用来实现不同的功能
    }
}

-NormalUser类

我们再构造一个NormalUser类,来实现普通用户的功能,首先继承User父类的功能在对抽象方法菜单进行重写。并且创建一个功能数组并且初始化自己的功能。

package user;

import java.util.Scanner;

public class NormalUser extends User {    

    public NormalUser(String name) {    //父类构造方法
        super(name);
    }
    
    //功能数组
    this.ioPerations = new IOperation[]{
                new ExitOperation(),    //下标0为退出系统
                new ShowOperation(),    //下标1为显示书
                new FindOperation(),    //下标2为超找书
                new BorrowedOperation(),  //下标3为借阅书
                new RetuenOperation(),    //下标4为归还书
        };

    @Override
    public int menu(){        //重写菜单
        System.out.println("***********************************");
        System.out.println(this.name + "欢迎来到用户菜单");
        System.out.println("1. 显示书");
        System.out.println("2. 查找书");
        System.out.println("3. 借阅书");
        System.out.println("4. 归还书");
        System.out.println("0. 退出系统");
        System.out.println("***********************************");
        System.out.println("请输入你的操作");
        Scanner scanner = new Scanner(System.in);    //用户进行选择
        int choice = scanner.nextInt();

        return choice;     //返回不同的值用来实现不同的功能
    }

}

3.operation包

这个包用来实现功能,我们可以构建一个接口来对这些功能进行一个规范,让功能重写方法实现各自功能。


-IOperation接口

因为所有的功能都针对于书籍,都操作的BookList这个书架,所以我们构建一个规范。

package operation;

import book.BookList;

public interface IOperation {
    
    public void work(BookList bookList);    //重写方法
}

-AddOperation类

这个类实现增加图书的功能,使用IOperation这个接口,重写里面标准方法。

用户输入要添加书的信息,阅历书架,没有这本书就可以放入,有就提示已经存在这本书不能放并且退出,放入书架总数也加一。

package operation;

import book.Book;
import book.BookList;

public class AddOperation implements IOperation{

    @Override
    public void work(BookList bookList){    //重写接口的标准方法
        System.out.println("增加图书");

        Scanner scanner = new Scanner(System.in);    //输入添加书的信息
        System.out.println("请输入书名 :");
        String name = scanner.nextLine();
        System.out.println("请输入作者 :");
        String author = scanner.nextLine();
        System.out.println("请输入类型 :");
        String type = scanner.nextLine();
        scanner.nextLine();
        System.out.println("请输入价格 :");
        int price = scanner.nextInt();

        Book book = new Book(name,author,type,price);    //为新增的书创建应该实例化对象

        int currentSize = bookList.getUsedSize();     //获取书架此时的书数量

        for (int i = 0; i < currentSize; i++) {
            Book book1 = bookList.getBooks(i);
            if(book1.getName().equals(name)){

                System.out.println("书架已经有这本书,不能添加");    //阅历查找是否书架已有
                return;

            }else{
                bookList.setBooks(book,currentSize);    //在书架默认的最后一个放入新加的书
            }
        }

        bookList.setUsedSize(currentSize+1);    //成功加入书以后,书架总数量也要增加
    }

}

-DelOperation类 

这个类实现删减图书的功能,使用IOperation这个接口,重写里面标准方法。

输入想要删除的书名,若书架中有则删除后面书往前移,若没有则退出。书架总数也减一。

package operation;

import book.BookList;

public class DelOperation implements IOperation{
    @Override
    public void work(BookList bookList) {    //重写接口中的标准方法
        System.out.println("删除图书");

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要删除的书名 :");    //输入需要删除的书名
        String name = scanner.nextLine();

        int currentSize = bookList.getUsedSize();    //获取目前书架书的总数

        int index = -1;    //设置默认值为-1

        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBooks(i);
            if(book.getName().equals(name)){
                index = i;    //书架中有目标书以后,index值为目标书的下标
                break;
            }
        }
        if(index == -1){
            System.out.println("没有你删除的书");    //若没有找到书,则值还为-1,退出
            return;
        }else{

            for (int i = index; i < currentSize-1; i++) {

                Book book1 = bookList.getBooks(i+1);    //找到目标书,将后面的书往前移
                bookList.setBooks(book1,i);
            }

        }

        bookList.setUsedSize(currentSize-1);    //成功删除以后,书架总数要减一
    }
}

-FindOperation类 

这个类实现查找图书的功能,使用IOperation这个接口,重写里面标准方法。

用户输入想要查找的书以后,阅历书架来寻找。

package operation;

import book.BookList;

public class FindOperation implements IOperation{

    @Override
    public void work(BookList bookList) {     //重写接口的标准方法
        System.out.println("查找图书");
        
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要查找的书的名字");
        String name = scanner.nextLine();    //用户输入想查找的书

        int currentSize = bookList.getUsedSize();    //获取bookList中实际书的数量

        for (int i = 0; i < currentSize; i++) {

            Book book = bookList.getBooks(i);

            if(book.getName().equals(name)){    //遍历查阅看看与用户输入的书是否有相等

                System.out.print("找到了: ");
                System.out.println(book);        //找到退出
                return;

            }else{
                System.out.println("找不到");
            }
        }
    }
}

-ShowOperation类

这个类实现显示图书的功能,使用IOperation这个接口,重写里面标准方法。

然后通过遍历数组的方式,遍历books数组来实现显示图书的功能

package operation;

import book.Book;
import book.BookList;

public class ShowOperation implements IOperation {

    @Override
    public void work(BookList bookList) {    //重写接口的标准方法
        System.out.println("显示图书");

        int currentSize = bookList.getUsedSize();    //获取bookList中实际书的数量

        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBooks(i);        //遍历数组,打印所有书
            System.out.println(book);
        }
    }
}

-BorrowedOperation类

这个类实现借阅图书的功能,使用IOperation这个接口,重写里面标准方法。

输入想要借阅的书名字以后,遍历书架,成功找到目标书以后并且没有被借出,将借阅状态置为true

package operation;

import book.BookList;

public class BorrowedOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("借阅图书");

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入书名 :");
        String name = scanner.nextLine();

        int currentSize = bookList.getUsedSize();

        for (int i = 0; i < currentSize; i++) {
            Book book1 = bookList.getBooks(i);
            if(book1.getName().equals(name)){
                if(book1.isIfBorrowed() == false) {
                    book1.setIfBorrowed(true);
                        System.out.println("借阅成功");    
                    return;
                }else{
                    System.out.println("已经被借阅,不能再借");
                }
            }
        }

        System.out.println("没有你要借的书");
    }
}

-RetuenOperation类

这个类实现归还图书的功能,使用IOperation这个接口,重写里面标准方法。

输入想要归还的书名字以后,遍历书架,成功找到目标书以后,将借阅状态置为false。

package operation;

import book.BookList;

public class RetuenOperation implements  IOperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("归还图书");

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入书名 :");
        String name = scanner.nextLine();

        int currentSize = bookList.getUsedSize();

        for (int i = 0; i < currentSize; i++) {
            Book book1 = bookList.getBooks(i);
            if(book1.getName().equals(name)){
                book1.setIfBorrowed(false);
                System.out.println("归还成功");
                return;
            }
        }
        System.out.println("没有你要还的书");
    }
}

-ExitOperation类

这个类实现退出系统的功能,使用IOperation这个接口,重写里面标准方法。

使用exit退出,并且对书架的书和总数进行清零。

package operation;

import book.BookList;

public class ExitOperation implements IOperation{
    @Override
    public void work(BookList bookList) {    //重写接口的标准方法
        System.out.println("退出系统");

        int currentSize = bookList.getUsedSize();    //获取bookList中实际书的数量

        for (int i = 0; i < currentSize; i++) {
            bookList.setBooks(null,i);            //遍历数组将所有元素置为null
        }
        bookList.setUsedSize(0);    //将实际书数量置为0

        System.exit(0);                    //退出系统
    }
}


4.主函数Main

在主程序中首先我们要做的就是登录系统,我们可以用一个方法来区分是否为管理员还是普通用户

拿User接受返回值,在输入不同的数字构造不同的用户,输入1构造AdminUser管理员,输入2为NormalUser普通用户

public static User login(){
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入你的姓名:");
            String name = scanner.nextLine();
            System.out.println("请输入你的身份 1-》管理员,0-》普通用户");
            int choice = scanner.nextInt();
            if(choice == 1){
                return new AdminUser(name);
            }else{
                return new NormalUser(name);
            }
        }

在主函数main中,先实例化书架里面原有的书

向上转型接受login方法的返回值,再通过不同的构造对象打印出不同的菜单

然后循环调用相关的操作,直到用户退出系统

import user.AdminUser;
import user.NormalUser;
import user.User;

import java.util.Scanner;

public class Main {

        public static User login(){

            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入你的姓名:");

            String name = scanner.nextLine();
            System.out.println("请输入你的身份 1-》管理员,0-》普通用户");

            int choice = scanner.nextInt();    //判断
            if(choice == 1){
                return new AdminUser(name);    //返回实例化管理员
            }else{    
                return new NormalUser(name);    //返回治理华普通用户
            }
        }

        public static void main(String[] args){

            BookList bookList = new BookList();    //初始化书架的书

            User user = login();    //对应数字实例化对象

            while(true){

                int choice = user.menu();    //打印并返回对应对象的菜单要实现的功能

                user.doOperation(choice, bookList);    //调用对应的操作
            {  
        }
}

希望对你有帮助

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1709649.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

天津企业采购云管平台需要考虑哪些?选择哪家好?

随着天津上云企业的增加&#xff0c;云管理需求也逐步增加。因此采购云管平台是非常必要的。那天津企业采购云管平台需要考虑哪些&#xff1f;选择哪家好&#xff1f; 天津企业采购云管平台需要考虑哪些&#xff1f; 【回答】&#xff1a;天津企业采购云管平台需要考虑的因素比…

xcode依赖包package已经安装,但是提示No such module ‘Alamofire‘解决办法

明明已经通过xcode自带的swift包管理器安装好了依赖包&#xff0c;但是却还是提示&#xff1a;No such module&#xff0c;这个坑爹的xcode&#xff0c;我也只能说服气&#xff0c;但是无奈&#xff0c;没办法攻打苹果总部&#xff0c;只能自己想解决办法了 No such module Ala…

企业融资新渠道:一文详解动产抵押

在当今瞬息万变的商业环境中&#xff0c;资金是企业发展的血液。面对融资难题&#xff0c;动产抵押作为一种灵活高效的融资方式&#xff0c;越来越受到企业的青睐。本文将为您全面解析动产抵押的概念、流程、优势及注意事项&#xff0c;助力您的企业解锁融资新途径。 什么是动…

西储大学数据集学习

数据集下载地址&#xff1a;CWRU凯斯西储大学轴承数据数据集——附&#xff1a;下载链接_西储大学轴承数据集下载-CSDN博客 最近研究故障诊断&#xff0c;先对使用比较多的西储大学数据集研究。以资料【1】中的内容展开研究。 1、轴承的结构 轴承分为外圈、内圈、保持架和滚珠…

NiuCloud-Admin-SAAS:引领前端技术革新与SaaS应用快速开发的未来

一、引言 在数字化快速发展的今天&#xff0c;企业对于快速搭建、高效运营的SaaS&#xff08;Software-as-a-Service&#xff09;系统的需求日益增长。为满足这一需求&#xff0c;NiuCloud-Admin-SAAS作为一款快速开发SaaS通用管理系统后台框架&#xff0c;凭借其先进的技术栈…

linux安装Java报错cannot execute binary file: Exec format error

uname -a 查看自己jdk版本 下载JDK路径Java Archive Downloads - Java SE 17 下载对应的版本jdk jdk-17.0.10_linux-aarch64_bin.tar.gz jdk-17.0.10_linux-x64_bin.tar.gz

JQuery 入门

一、jQuery 概述 1、JavaScript 库 仓库:可以把很多东西放到这个仓库里面。找东西只需要到仓库里面查找就可以 JavaScript 库&#xff1a;即library&#xff0c;是一个封装好的特定的集合&#xff08;方法和函数&#xff09;。从封装一大堆函数的角度理解库&#xff0c;就是在…

Android 项目Gradle文件讲解(Groovy和Kotlin)

Android 项目Gradle文件讲解&#xff08;Groovy和Kotlin&#xff09; 前言正文一、Gradle的作用二、Gradle的种类① 工程build.gradle② 项目build.gradle③ settings.gradle④ gradle.properties⑤ gradle-wrapper.properties⑥ local.properties 三、Groovy和Kotlin的语言对比…

数字中国 | 官媒“点名”人大金仓出圈

随着数字化浪潮的不断推进&#xff0c;人大金仓作为数字化转型的先行者&#xff0c;亮相第七届数字中国建设峰会现场&#xff0c;引起了福建媒体的广泛关注。人大金仓以其在数字化领域的卓越成果&#xff0c;成为了媒体报道的焦点&#xff0c;展现了其在推动数字中国建设过程中…

7B2PRO5.4.2主题 wordpress主题开心版免授权源码

这款7B2 PRO主题也是很多小伙伴儿喜欢的一个主题&#xff0c;有伙伴儿反馈说想学习下新版本&#xff0c;这不就来了&#xff0c;免受权开心版本可供学习使用&#xff0c;要运营还是尊重下版权到官网进行购买吧。 下载&#xff1a;7B2PRO5.4.2 wordpress主题免授权直接安装_麦…

CLIP 源码分析:simple_tokenizer.py

tokenizer的含义 from .clip import *引入头文件时为什么有个. 正文 import gzip import html import os from functools import lru_cacheimport ftfy import regex as re# 上面的都是头文件# 这段代码定义了一个函数 default_bpe()&#xff0c;它使用了装饰器 lru_cache()。…

Redis(十四) 主从模式

文章目录 前言什么是分布式系统主从模式实现Redis主从模式主从模式原理nagle 算法拓扑结构主从模式实现的过程psync实时复制 前言 Redis 作为在内存中操作数据的服务器系统&#xff0c;每时都会接收成千上万的请求&#xff0c;如果我们的业务只在单个服务器上面部署了 Redis&a…

java项目之高校教师科研管理系统源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的高校教师科研管理系统源码。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 高校教师科研管…

小目标检测篇 | YOLOv8改进之更换Neck网络为BiFPN + 添加小目标检测层

前言:Hello大家好,我是小哥谈。小目标检测是计算机视觉领域中的一个研究方向,旨在从图像或视频中准确地检测和定位尺寸较小的目标物体。相比于常规目标检测任务,小目标检测更具挑战性,因为小目标通常具有低分辨率、低对比度和模糊等特点,容易被背景干扰或遮挡。本篇文章就…

PWN入坑指南

CTF的PWN题想必是很多小伙伴心里的痛&#xff0c;大多小伙伴不知道PWN该如何入门&#xff0c;不知道该如何系统性学习 0x01开篇介绍 PWN 是一个黑客语法的俚语词 &#xff0c;是指攻破设备或者系统 。发音类似"砰"&#xff0c;对黑客而言&#xff0c;这就是成功实施黑…

【软考】下篇 第14章 云原生架构设计与理论实践

目录 一、云原生架构定义二、云原生架构原则三、云原生架构主要架构模式3.1 服务化架构模式3.2 Mesh化架构模式3.3 Serverless模式3.4 存储计算分离模式3.5 分布式事务模式4.6 可观测架构3.7 事件驱动架构 四、云原生架构反模式五、云原生架构技术5.1 容器技术容器编排K8S 5.2 …

使用uniapp编写的微信小程序进行分包

简介&#xff1a; 由于小程序发布的时候每个包最多只能放置2MB的东西&#xff0c;所以把所有的代码资源都放置在一个主包当中不显示&#xff0c;所以就需要进行合理分包&#xff0c;&#xff0c;但是分包后整个小程序最终不能超过20MB。 一般情况下&#xff0c;我习惯将tabba…

为什么推荐前端用WebStorm软件编程?

一、介绍 WebStorm是由JetBrains公司开发的一款JavaScript开发工具&#xff0c;被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。它支持JavaScript、ECMAScript 6、TypeScript、CoffeeScript、Dart和Flow等多种语言的代码…

从 0 开始实现一个博客系统 (SSM 项目)

相关技术 Spring Spring Boot Spring MVC MyBatis Html Css JS pom 文件我就不放出来了, 之前用的 jdk8 做的, MySQL 用的 5.7, 都有点老了, 你们自己看着配版本就好 实现功能 用户注册 - 密码加盐加密 (md5 加密)前后端用户信息存储 - 令牌技术用户登录 - (使用 拦截…

基于51单片机的汽车智能灯光控制系统

一.硬件方案 本设计硬件部分&#xff0c;中央处理器采用了STC89C52RC单片机&#xff0c;另外使用两个灯珠代表远近光灯&#xff0c;感光部分采用了光敏电阻&#xff0c;因为光敏电阻输出的是电压模拟信号&#xff0c;单片机不能直接处理模拟信号&#xff0c;所以经过ADC0832进…