图书管理系统_图书管理系统数据库 - CSDN
图书管理系统 订阅
图书管理系统,是一个由人、计算机等组成的能进行管理信息的收集、传递、加工、保存、维护和使用的系统。利用信息控制企业的行为;帮助企业实现其规划目标。 展开全文
图书管理系统,是一个由人、计算机等组成的能进行管理信息的收集、传递、加工、保存、维护和使用的系统。利用信息控制企业的行为;帮助企业实现其规划目标。
信息
定    义
能进行图书馆管理系统能实测
特    点
界面必须始终一致
中文名
图书管理系统
外文名
Library management system
图书管理系统概念
图书馆管理系统,能进 行图书馆管理系统能实测国民经济和企业的各种运行情况;利用过去的数据预测未来;从企业全局出发辅助企业进行管理决策;利用信息控制企业的行为;帮助企业实现其规划目标。图书馆管理系统合运用了管理科学,系统科学,运筹学,统计学,计算机科学等学科的知识。可以通俗的简化的描述图书馆管理系统的三要素:系统的观点、数学的方法以及计算机的应用。图书馆管理系统概念结构主要由四大部分组成即信息源、信息处理器、信息用户、信息管理者组成。
收起全文
精华内容
参与话题
  • 详细介绍了图书管理系统的实现,包括:环境搭建、系统业务、技术实现、项目运行、功能演示、系统扩展等,以通俗易懂的方式,手把手的带你从零开始运行本套图书管理系统,该项目附带全部源码可作为毕设使用。...
  • 基于Java和MySQL的图书管理系统

    万次阅读 多人点赞 2020-05-30 15:49:36
    Java图书管理系统 设计人:wangyunpeng_bio 项目需求 随着计算机的普及和应用水平的提高,经过考察比较,决定利用自己的Java知识开发小型的图书管理系统,方便图书的管理。 图书管理系统是典型的信息管理系统。...

    Java图书管理系统

    设计人:wangyunpeng_bio

    项目需求

    随着计算机的普及和应用水平的提高,经过考察比较,决定利用自己的Java知识开发小型的图书管理系统,方便图书的管理。
    图书管理系统是典型的信息管理系统。本次作业利用JAVA开发工具Eclipse和MySQL数据库来开发这个图书管理系统。该系统要解决的图书管理所要解决的问题,可以满足图书管理基本要求,包括添加、管理等功能。该系统能根据用户的需求,快捷方便的为读者提供借阅服务
    图书管理系统应有以下功能:

    1. 读者库管理
    2. 书库管理
    3. 借阅管理
    4. 读者信息查询

    图书管理系统主要针对书库的操作功能、所以系统应尽量满足需求、同时亦不可有多余或繁复的功能、令系统的操作和功能混乱。

    项目地址

    本项目地址:https://github.com/wangyunpengbio/Library/
    免费下载方法:点那个“Clone or download”,再点“Download ZIP”就行了,感兴趣的话,大家可以点个Star
    如果实在太初学者,不会下载的话,就在csdn上下载吧https://download.csdn.net/download/qq_29300341/9667678

    需求分析

    A.业务流程:

    No. 业务流程 需求
    1. 图书管理员登入系统 图书管理员需使用账号和密码登入。
    2. 新增读者资料 新增读者资料,如姓名、性别、职位等。
    3. 新增书籍资料 新增书籍资料,如书名、价格、种类等。
    4. 读者库管理 选中读者库里的读者信息,即可更新和删除。
    5. 书库管理 可以按“书编号查询”和“书名模糊查询”,继而选中书籍信息,即可更新和删除书籍分为在库和借出
    6 借阅管理 输入读者编号,即可检阅读者的数据和借阅的图书,检阅顾客的数据和购买纪录。
    7. 读者登入系统 读者需使用账号和密码登入。
    8 借书 按书名模糊搜索,选中即可借阅图书
    9 还书 检阅自己的读者信息以及已经借阅的图书,点击归还即可,不允许更改或删除读者数据,只允许查询,更改和删除功能由管理员负责。

    以下是使用 实体联系模型-Entity Relationship来分析。

    B.归纳实体和属性

    No. 业务流程 对应的实体 实体的属性值
    1. 图书管理员登入系统 Librarian nameUser password
    2. 新增读者资料 Reader idReader nameReader kind sex password
    3. 新增书籍资料 Book Author Publisher idBook,nameBook,price,kind,author,publisher Author.name, Author.workplace Publisher.name, Publisher.address
    4. 读者库管理 Reader idReader nameReader kind sex password
    5. 书库管理 Book idBook nameBook price kind autor publisher
    6. 借阅管理 Borrow idReader idBook lendDate dueDate overtime
    7. 读者登入系统 Reader idReader password
    8 借书 Borrow idReader idBook lendDate dueDate overtime
    9 还书 Borrow idReader idBook lendDate dueDate overtime

    C.实体的模型

    在这里插入图片描述

    D.ER-实体关系

    Author,Publisher To Book&Borrow&Reader To Librarian
    在这里插入图片描述

    设计

    项目文件夹中,(代码总计:4800+行)
    doc文件夹存放着生成的文档注释,可点击其中的index文件查看整个项目的注释

    Src包下面含有五个包

    • Database用于存储数据库连接操作
    • Frame用于存储各个窗体界面
    • Model用于存储各个实体(表)对应的数据模型
    • Out_of_date用于存储初始时候写的界面,后来舍弃,不再调用。
    • SqlTools用于存储操作数据库的增删改查方法

    image文件夹用于存放相关的界面图片,按钮图片
    备注:程序不同界面的入口已经全部注释掉了,MainFrame是程序的唯一入口

    程序细节设计:

    1. 登陆界面的密码回显,伴有跳转动画(此处利用了多线程,控制线程存活时间)
    2. 表格直接选中即可修改数据,更新数据时候默认有原始数据,可按不同方式搜索图书;
    3. 新增借阅信息时候,自动加入当前时间,并计算归还时间。(SQL函数NOW())
    4. 界面按钮,背景用Photoshop的重新设计,图形用户界面友好;
    5. 数据库设计达到第三范式,去除了所有非主属性对任何候选关键字的传递信依赖,冗余度低。
    6. 变量和方法命名符合规范,可读性强
    7. 不同的Model实体(表)对应不同的SqlTools操作,分开存放,程序复用性好,易扩展。
      使用
    8. 将SQL语句导入,字符集选utf8,不然有可能显示不了中文,数据库名称为library
      create database library;
    9. 推荐使用Mysql Front这个MySQL的前台,支持多句sql语句一起执行,百度第一个链接即可下载。
      http://dlsw.baidu.com/sw-search-sp/soft/6c/17997/MySQL-Front_V5.3.4.214_Setup.1435658094.exe
    10. Java环境中加入数据库的驱动,源程序里database包里DatabaseTools.java文件是有关数据库连接的操作源程序的用户名和密码皆为root,数据库名为:library不同电脑上运行需要稍微改一下这个代码。
    11. 登陆:
      图书管理员:用户名root密码 root或者wangyp密码123456
      **读者:用户名001密码 root **(注:数据库内读者的密码初始值皆为root)
    12. 在不同计算机上Eclipse使用,可能需要重新建立Java类库的路径
      本程序用1.8的jdk写的,所以最好用1.8的jre。
      代码放在1.8下面运行,连警告都不会出现,1.7和1.6显示效果不好。
      awt 和 swing 都依赖虚拟机的具体实现。所以不同平台表现不大一样。如果用javafx,界面才可以移植。
      而且编写用的笔记本电脑是高分屏,在本机上显示大小是正好的,到别的电脑上面有可能会出现界面过大的情况。
    13. 具体的文档注释已经生成,打开doc文件夹其中的index文件查看整个项目的注释
      在这里插入图片描述
    展开全文
  • 图书管理系统(Java MySQL)

    万次阅读 多人点赞 2020-03-06 22:34:05
    (完整代码+实训报告): https://download.csdn.net/download/qq_35793285/10896342 (完整代码): ... ...管理员登录 图书借阅信息管理 图书信息管理 管理员更改密码 退出系统 二,工具 E...

    (完整代码+实训报告):

    https://download.csdn.net/download/qq_35793285/10896342

    (完整代码): 

    链接: https://pan.baidu.com/s/14Z8FarJfrQuUzD5XnzWsFQ 提取码: dwaw 

     

    啊。。。。找我要代码的人太多啦,我发不过来啦。。本来就是打算赚点CSDN积分,不管啦,现在我把(完整代码+实训报告)全部放到了下边百度网盘里,需要的自己下载吧

    链接:https://pan.baidu.com/s/1TAjQyc3AF_iyv1FQBZRPiA  密码:xijk

     

    觉着有用就点个赞哦~

     

    一,功能

    1. 管理员登录
    2. 图书借阅信息管理
    3. 图书信息管理
    4. 管理员更改密码
    5. 退出系统

    二,工具

    • Eclipse Version: 2018-09 (4.9.0)
    • MySQL Workbench 8.0 CE
    • mysql-connector-java-8.0.13.jar

    三、效果图:

    登录界面:

    主界面:

    借阅书籍管理:

    个人书库管理:

    更改密码:

     

    四、数据库设计

         1)图书表

         2)用户表

    两个数据表间没有关联:

    五、JAVA层次分析

     (1)逻辑图

    (2)包结构,采用MVC三层架构组织各个模块

     

    六、主要Java代码分析

     

    Dao类(以BookDao为例)

    package pers.cyz.dao;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.ArrayList;
    import java.util.List;
    
    import pers.cyz.model.Book;
    import pers.cyz.util.DBUtil;
    
    /**
     * 数据库图书表信息数据访问对象类,包含增加图书信息、删除图书信息
     * 、更新图书信息、查询图书信息、查询借阅信息和归还图书
     * 
     * @author 1651200111 陈彦志
     */
    public class BookDao {
    
    
    	/**
    	 * 增加图书信息
    	 */
        public void addBook(Book book) throws Exception{
        	// 首先拿到数据库的连接
            Connection con = DBUtil.getConnection();
            String sql="insert into tb_books"
            		// ISBN、书名、图书价格、图书作者、出版社
            		+ "(ISBN, book_name, book_price, book_author, published_house,"
            		// 分类号、借书人姓名、借书人电话、借书日期,已借天数
            		+ "book_category, borrower_name, borrower_phone) "
            		+ "values("
            		/*
            		 * 参数用?表示,相当于占位符,然后在对参数进行赋值。当真正执行时,
            		 * 这些参数会加载在SQL语句中,把SQL语句拼接完整才去执行。这样就会减少对数据库的操作
            		 */
            		+ "?,?,?,?,?,?,?,?)";
            /*
             * prepareStatement这个方法会将SQL语句加载到驱动程序conn集成程序中,
             * 但是并不直接执行,而是当它调用execute()方法的时候才真正执行;
             */
            PreparedStatement psmt = con.prepareStatement(sql);
            // 先对应SQL语句,给SQL语句传递参数
            psmt.setString(1, book.getISBN());
            psmt.setString(2, book.getBookName());
            psmt.setFloat(3, book.getPrice());
            psmt.setString(4, book.getAuthor());
            psmt.setString(5, book.getPublishHouse());
            psmt.setString(6, book.getBookCategory());
            
            if (book.getBorrowerName() == null || book.getBorrowerName() == "") {
            	psmt.setString(7, null);
            }
            else {
            	  psmt.setString(7, book.getBorrowerName());
            }
          
            if (book.getBorrowerPhone() == null || book.getBorrowerPhone() == "") {
            	 psmt.setString(8, null);  
            }
            else {
            	psmt.setString(8, book.getBorrowerPhone());  
            }
            
            //执行SQL语句
            psmt.execute();
    
        }
    	
      
        /**
         * 删除图书信息
         */
          public void delBook(int ID) throws SQLException{
        	  // 首先拿到数据库的连接
              Connection con=DBUtil.getConnection();
              String sql="" + 
                      "DELETE FROM tb_books "+               
                      // 参数用?表示,相当于占位符
                      "WHERE ID = ?";
              // 预编译sql语句
              PreparedStatement psmt = con.prepareStatement(sql);
              // 先对应SQL语句,给SQL语句传递参数
              psmt.setInt(1, ID);
              // 执行SQL语句
              psmt.execute();    
          }
    	    
    
    	/**
    	 * 更新图书信息
    	 */
        public void changeBook(Book book) throws SQLException{
        	// 首先拿到数据库的连接
            Connection con=DBUtil.getConnection();
            String sql="update tb_books "
            		+ "set ISBN = ?, book_name = ?, book_price = ?, book_author = ?"
                    + ",published_house = ?, book_category = ?, borrower_name = ?, borrower_phone = ? "
                    // 参数用?表示,相当于占位符 
            		+ "where ID = ?";
            // 预编译sql语句
            PreparedStatement psmt = con.prepareStatement(sql);
            // 先对应SQL语句,给SQL语句传递参数
            psmt.setString(1, book.getISBN());
            psmt.setString(2, book.getBookName());
            psmt.setFloat(3, book.getPrice());
            psmt.setString(4, book.getAuthor());
            psmt.setString(5, book.getPublishHouse());
            psmt.setString(6, book.getBookCategory());
            if (book.getBorrowerName().equals("")) {
            	psmt.setString(7, null);
            }
            else {
            	 psmt.setString(7, book.getBorrowerName());
            }
           
            if (book.getBorrowerPhone().equals("")) {
            	psmt.setString(8, null);
            }
            else {
            	 psmt.setString(8, book.getBorrowerPhone());
            }
            psmt.setInt(9, book.getID());
            // 执行SQL语句
            psmt.execute();    
        }
    
    	        
    
    	/**
    	 * 查询书籍信息
    	 */
    	public List<Book> query() throws Exception{	       
    		Connection con = DBUtil.getConnection();	        
    		Statement stmt = con.createStatement();	       
    		ResultSet rs = stmt.executeQuery("select "
    				// ISBN、书名、作者、图书价格、出版社
    				+ "ID, ISBN, book_name, book_author, book_price, published_house, "
    				// 分类号、借书人姓名、借书人电话
    				+ "book_category, borrower_name, borrower_phone "
    				+ "from tb_books");	      
    		List<Book> bookList = new ArrayList<Book>();	       
    		Book book = null;	   
    		// 如果对象中有数据,就会循环打印出来
    		while (rs.next()){	           
    			book = new Book();	     
    			book.setID(rs.getInt("ID"));
    			book.setISBN(rs.getString("ISBN"));
    			book.setBookName(rs.getString("book_name"));	       
    			book.setAuthor(rs.getString("book_author"));
    			book.setPrice(rs.getFloat("book_price"));
    			book.setPublishHouse(rs.getString("published_house"));
    			book.setBookCategory(rs.getString("book_category"));
    			book.setBorrowerName(rs.getString("borrower_name"));
    			book.setBorrowerPhone(rs.getString("borrower_phone"));
    			bookList.add(book);	        
    		}	       
    		return bookList;	  
    	}
    
    
    	/**
    	 * 查询借阅信息
    	 * 
    	 * @return
    	 * 		bookList
    	 */
    	public List<Book> borrowQuery() throws Exception{	       
    		Connection con = DBUtil.getConnection();	        
    		Statement stmt = con.createStatement();	       
    		ResultSet rs = stmt.executeQuery(""
    				// ID、书名、借书人姓名、借书人电话
    				+ "SELECT ID, book_name, borrower_name, borrower_phone "
    				+ "FROM tb_books "
    				+ "WHERE borrower_name IS NOT NULL"
    				);	      
    		List<Book> bookList = new ArrayList<Book>();	       
    		Book book = null;	     
    		// 如果对象中有数据,就会循环打印出来
    		while (rs.next()){	           
    			book = new Book();	     
    			book.setID(rs.getInt("ID"));
    			book.setBookName(rs.getString("book_name"));	       
    			book.setBorrowerName(rs.getString("borrower_name"));
    			book.setBorrowerPhone(rs.getString("borrower_phone"));
    			bookList.add(book);	        
    		}	       
    		return bookList;	  
    	}
    
    	/**
    	 * 更新图书信息,归还图书
    	 */
        public void returnBook(Book book) throws SQLException{
        	// 首先拿到数据库的连接
            Connection con=DBUtil.getConnection();
            String sql="UPDATE tb_books "
            		// ISBN、图书名称、作者、价格
            		+ "SET "
            		// 借书人姓名、借书人电话
            		+ "borrower_name = ?, borrower_phone = ? "
                    // 参数用?表示,相当于占位符 
            		+ "WHERE ID = ?";
            // 预编译sql语句
            PreparedStatement psmt = con.prepareStatement(sql);
            // 先对应SQL语句,给SQL语句传递参数
            psmt.setString(1, book.getBorrowerName());
            psmt.setString(2, book.getBorrowerPhone());
            psmt.setInt(3, book.getID());
            // 执行SQL语句
            psmt.execute();    
        }
    	
    
    }
    

    重点内容 :

    JDBC进行简单的数据库增删改查

    详细参考:https://www.cnblogs.com/Qian123/p/5339164.html#_labelTop

     

    Model类(以Book为例)

    package pers.cyz.model;
    
    /**
     * 图书模型类,包含数据库图书表各对应的字段get、set方法
     * 
     * @author 1651200111 陈彦志
     */
    public class Book {
    	private int ID;
    	// ISBN号
    	private String ISBN;
    	// 图书名称
    	private String bookName;
    	// 图书价格
    	private float price;
    	// 图书作者
    	private String author;
    	// 出版社
    	private String publishedHouse;
    	// 图书分类号
    	private String bookCategory;
    	// 借书人姓名
    	private String borrowerName;
    	// 借书人电话
    	private String borrowerPhone;
    
    	/**
    	 * 获取ID
    	 */
    	public int getID() {
    		return ID;
    	}
    	/**
    	 * 设置ID
    	 */
    	public void setID(int iD) {
    		ID = iD;
    	}
    	
    	/**
    	 * 获取ISBN
    	 */
    	public String getISBN() {
    		return ISBN;
    	}
    	/**
    	 * 设置ISBN
    	 */
    	public void setISBN(String iSBN) {
    		ISBN = iSBN;
    	}
    	
    	
    	/**
    	 * 获取图书名称
    	 */
    	public String getBookName() {
    		return bookName;
    	}
    	/**
    	 * 设置图书名称
    	 */
    	public void setBookName(String bookName) {
    		this.bookName = bookName;
    	}
    	
    	
    	/**
    	 * 获取图书价格
    	 */
    	public float getPrice() {
    		return price;
    	}
    	/**
    	 * 设置图书价格
    	 */
    	public void setPrice(float price) {
    		this.price = price;
    	}
    	
    	
    	/**
    	 * 获取图书作者
    	 */
    	public String getAuthor() {
    		return author;
    	}
    	/**
    	 * 设置图书作者
    	 */
    	public void setAuthor(String author) {
    		this.author = author;
    	}
    	
    	
    	/**
    	 * 获取出版社
    	 */
    	public String getPublishHouse() {
    		return publishedHouse;
    	}
    	/**
    	 * 设置出版社
    	 */
    	public void setPublishHouse(String publishedHouse) {
    		this.publishedHouse = publishedHouse;
    	}
    	
    	
    	/**
    	 * 获取图书分类信息
    	 */
    	public String getBookCategory() {
    		return bookCategory;
    	}
    	/**
    	 * 设置图书分类信息
    	 */
    	public void setBookCategory(String bookCategory) {
    		this.bookCategory = bookCategory;
    	}
    	
    	
    	/**
    	 * 获取借书人姓名
    	 */
    	public String getBorrowerName() {
    		return borrowerName;
    	}
    	/**
    	 * 设置借书人姓名
    	 */
    	public void setBorrowerName(String borrowerName) {
    		this.borrowerName = borrowerName;
    	}
    	
    	
    	/**
    	 * 获取借书人电话
    	 */
    	public String getBorrowerPhone() {
    		return borrowerPhone;
    	}
    	/**
    	 * 设置借书人电话
    	 */
    	public void setBorrowerPhone(String borrowerPhone) {
    		this.borrowerPhone = borrowerPhone;
    	}
    
    
    }
    

    重点内容 :

    主要就是数据库对应表中各对应的字段get、set方法

        Eclipse技巧:

            Shift + alt + s  -> Generate Getters and Setters -> Select all -> Generate 自动生成set、get方法

     

    Controller类(以BookAction为例)

    package pers.cyz.controller;
    
    import java.util.List;
    
    import javax.swing.JTable;
    import javax.swing.JTextField;
    
    import pers.cyz.dao.BookDao;
    import pers.cyz.model.Book;
    
    
    /**
     * 图书信息行为控制类,包含增加图书、删除图书
     * 、 修改图书、和初始化个人书库管理窗体表格
     * 
     * @author 1651200111 陈彦志
     */
    public class BookAction {
    	
     
            
    	/**
    	 * 初始化窗体表格
    	 * @return
    	 * 		results
    	 */
    	@SuppressWarnings("rawtypes")
    	public Object[][] initializTable(String[] columnNames) throws Exception{
    		BookDao bookDao = new BookDao();
    		List list = bookDao.query();
    		Object[][] results = new Object[list.size()][columnNames.length];
    		
    		for(int i = 0; i < list.size(); i++) {
    			Book book = (Book)list.get(i);				
    	
    			results[i][0] = book.getID();
    			results[i][1] = book.getBookName();
    			results[i][2] = book.getAuthor();
    			results[i][3] = book.getPrice();
    			results[i][4] = book.getISBN();
    			results[i][5] = book.getPublishHouse();
    			results[i][6] = book.getBookCategory();	
    	
    			String borrowerName =  book.getBorrowerName();
    			if (borrowerName == null) {	
    				borrowerName = "";	
    				results[i][7] = borrowerName;
    			}
    			else {	
    				results[i][7] = borrowerName;
    			}
    			
    			String borrowerPhone = book.getBorrowerPhone();	
    			if (borrowerPhone == null) {		
    				borrowerPhone = "";	
    				results[i][8] = borrowerPhone;
    			}	
    			else {	
    				results[i][8] = borrowerPhone;
    			}
    		}	   	
    		return results;
    }
    	
    	
     	/**
     	 * 添加图书信息
     	 */
    	public void addBookInformation (JTextField textFieldISBN, JTextField textFieldName
    			,JTextField textFieldPrice, JTextField textFieldAuthor, JTextField textFieldPublishedHouse
    			, JTextField textFieldBookCategory, JTextField textFieldBorrowName
    			, JTextField textFieldBorrowPhone) throws Exception {
    	
            BookDao bookDao=new BookDao();
            Book book=new Book();     
            
            book.setISBN(textFieldISBN.getText());      
            book.setBookName(textFieldName.getText());
            float price = Float.parseFloat(textFieldPrice.getText());
            book.setPrice(price);
            book.setAuthor(textFieldAuthor.getText());
            book.setPublishHouse(textFieldPublishedHouse.getText());
            book.setBookCategory(textFieldBookCategory.getText());
            
            if (textFieldBorrowName.getText() == null ||textFieldBorrowName.getText() == "" ) {
            	book.setBorrowerName(null);
            }
            else {
            	 book.setBorrowerName(textFieldBorrowName.getText());
            }
           
            if (textFieldBorrowPhone.getText() == null || textFieldBorrowPhone.getText() == "") {
            	book.setBorrowerPhone(null);
            }
            else {
            	book.setBorrowerPhone(textFieldBorrowPhone.getText());
            }
            
            //添加图书
            bookDao.addBook(book);
    	}
    	
    	
    
    	/**
    	 * 删除图书信息
    	 */
    	public void delBookInformation (JTable table) throws Exception {
    	
    		int selRow = table.getSelectedRow();
    		int ID = Integer.parseInt(table.getValueAt(selRow, 0).toString());
    		
            BookDao bookDao=new BookDao();
            Book book=new Book();     
            
            book.setID(ID);
       
            // 删除图书信息
            bookDao.delBook(ID);
    	}
    	
    	
    	/**
    	 * 修改图书信息
    	 */
    	public void changeBookInformation (JTextField textFieldISBN, JTextField textFieldName
    			,JTextField textFieldPrice, JTextField textFieldAuthor, JTextField textFieldPublishedHouse
    			, JTextField textFieldBookCategory, JTextField textFieldBorrowerName
    			, JTextField textFieldBorrowerPhone, JTable table) throws Exception{
    		
            BookDao bookDao=new BookDao();
            Book book=new Book();     
           
    		int selRow = table.getSelectedRow();
    		int ID = Integer.parseInt(table.getValueAt(selRow, 0).toString());	
            book.setID(ID);
            
            book.setISBN(textFieldISBN.getText());      
            book.setBookName(textFieldName.getText());
            book.setAuthor(textFieldAuthor.getText());
            float price = Float.parseFloat(textFieldPrice.getText());
            book.setPrice(price);
            book.setPublishHouse(textFieldPublishedHouse.getText());
            book.setBookCategory(textFieldBookCategory.getText());
            book.setBorrowerName(textFieldBorrowerName.getText());
        	book.setBorrowerPhone(textFieldBorrowerPhone.getText());
             
            //修改图书
            bookDao.changeBook(book);       
    	}
    	
    	
    }
        
        
        
    
    
    
    

     

    util类(以DBUtil为例)

    package pers.cyz.util;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    
    /**
     * 连接数据库类,包含一个对外提供获取数据库连接的方法
     * 
     * @author 1651200111 陈彦志
     */
    public class DBUtil {
    	
    	// 数据库连接路径
    	private static final String URL = "jdbc:mysql://127.0.0.1:3306/db_books?"
    			+ "useUnicode = true & serverTimezone = GMT"
    			// MySQL在高版本需要指明是否进行SSL连接
    			+ "& characterEncoding = utf8 & useSSL = false";
    	private static final String NAME = "root";
    	private static final String PASSWORD = "root";
    	private static Connection conn = null;
    	
    	// 静态代码块(将加载驱动、连接数据库放入静态块中)
    	 static{
    	        try {
    	            // 加载驱动程序
    	            Class.forName("com.mysql.cj.jdbc.Driver");
    	            // 获取数据库的连接
    	            conn = DriverManager.getConnection(URL, NAME, PASSWORD);
    	        } catch (ClassNotFoundException e) {
    	            e.printStackTrace();
    	        } catch (SQLException e) {
    	            e.printStackTrace();
    	        }
    	    }
    	 
    	 // 对外提供一个方法来获取数据库连接	    
    	 public static Connection getConnection(){     
    		 return conn;	   
    	 }
    	
    	
    }
    

    util类(以BackgroundImage为例)

    package pers.cyz.util;
    
    import java.awt.Container;
    
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    
    /**
     * 设置背景图片类
     * 
     * @author 1651200111 陈彦志
     */
    public class BackgroundImage {
    	
    	public BackgroundImage(JFrame frame,Container container,String ImageName) {
    		// 限定加载图片路径
    		ImageIcon icon= new ImageIcon("res/" + ImageName);	
    		
    		final JLabel labelBackground = new JLabel();
    		ImageIcon iconBookManageSystemBackground = icon;
    		labelBackground.setIcon(iconBookManageSystemBackground);
    		// 设置label的大小
    		labelBackground.setBounds(0,0,iconBookManageSystemBackground.getIconWidth()
    				,iconBookManageSystemBackground.getIconHeight());		
    		// 将背景图片标签放入桌面面板的最底层
    		frame.getLayeredPane().add(labelBackground,new Integer(Integer.MIN_VALUE));
    		// 将容器转换为面板设置为透明
    		JPanel panel = (JPanel)container;
    		panel.setOpaque(false);
    		
    	}
    	
    
    }
    

     

    重点内容 :

        将图片标签放在窗体底层面板,然后将窗体转化为容器,将容器面板设为透明,背景图片就设置好了,之后就可以直接在该容器中添加组件

     


    • 将所有两个或两个以上类需要用到的代码段全部封装到了公共类。
    • 整体按照MVC三层架构组织

     

    参考文章:https://www.cnblogs.com/Qian123/p/5339164.html#_labelTop

    参考文章:https://blog.csdn.net/acm_hmj/article/details/52830920

     

     

    展开全文
  • C课程设计——图书管理系统 1、题目意义 图书馆,作为文献的聚集地和展示平台,常常扮演着引领文化前进的角色,是每个大学不可或缺的基础设施,而图书管理系统则是一个图书馆能够正常运转的关键。本次课程设计使用...

    C课程设计——图书管理系统

    1、题目意义

    图书馆,作为文献的聚集地和展示平台,常常扮演着引领文化前进的角色,是每个大学不可或缺的基础设施,而图书管理系统则是一个图书馆能够正常运转的关键。本次课程设计使用C语言制作程序来实现图书的登记,删除,查询,浏览以及读者的借阅,还书,会员登录,修改密码等功能。程序中涉及到数据链表和文件指针的操作,包括结构体数据定义,使用及文件的读写,定位,修改等。

    2、设计思想

    ①新建账号密码,然后通过二者的匹配登录系统,这样可以保证是本校同学才能使用,另外还可以修改密码。
    ②添加图书的基本信息,如 书号,书名,作者,出版社,类别,进库量;
    ③删除图书,通过图书的书名进行删除;
    ④图书查询,通过图书的书号,书名,作者或者类别进行检索;
    ⑤浏览图书的库存,将所有数目展示出来;
    ⑥借书登记,先判断是否有这本数,然后进行借书人学号,姓名,归还截止期限,借书书名进行登记
    ⑦还书情况查看。
    ⑧借阅情况查看。
    ⑨会员登录,通过数据文件中的已注册的账号密码来登录到图书管理系统。
    ⑩修改密码

    3.总设计框架图

    在这里插入图片描述

    4.代码展示

    在这里插入图片描述
    在这里插入图片描述

    #include <stdio.h>
    #include <stdlib.h>//其中包含system函数
    #include <conio.h>//定义了通过控制台进行 数据输入 和数据输出的函数,如getch函数。
    #include <string.h>//定义字符数组
    #include <math.h>
    #define LEN sizeof(struct book)//有关图书信息的结构体
    #define LEN1 sizeof(struct reader)//有关读者信息的结构体
    #define LEN2 sizeof(struct land)//有关登录系统的结构体
    
    
    struct book//图书信息
    {
    	char num[20],nam[20],aut[20],pub[20],cat[20];
    	int  many;
    	float price;
    	struct book*next;
    };
    
    struct reader//读者借阅信息
    {
    	int jnum;
    	char jnam[20],time[20],tsnam[20];
    	struct reader *next;
    };
    struct land//登录信息
    {
    	int zhanghao;
    	char password[20];
    	struct land*next;
    };
    
    
    
    int tjzs();//统计library文本个数函数
    void xg(int,char[] );
    void mainmenu();//显示主菜单
    void tsmenu();//显示图书信息菜单
    void jmenu();//显示借阅信息菜单
    void lmenu();//显示登录菜单
    
    void main1();// 主菜单功能
    void tsmain();//图书菜单功能
    void cxts();//查询图书
    void zjts();//增加图书
    void scts();//删除图书
    void llts();//浏览图书
    
    void jmain();//读者借阅信息
    void js();//借书
    void hs();//还书
    void cxjs();//查询借书
    void lljs();// 浏览借书情况
    
    void land();//登录功能系统
    int xinjian(int,char[] );//创建账号密码
    void xgmm();//修改密码
    void lmain();//登录界面函数
    
    
    int tjzs()//统计图书文本个数
    {
    FILE *fp;
    int txcl=0,n;
    float tprice=0;
    char tname[20]={'\0'},tauthor[20]={'\0'},tchuban[20]={'\0'},tkind[20]={'\0'},tshuhao[20]={'\0'};
    fp=fopen("library.txt","r");//打开文件
    for (n=0;!feof(fp);n++)//逐个读文件
    fscanf(fp,"%s%s%s%s%s%d%f",tshuhao,tname,tauthor,tchuban,tkind,&txcl,&tprice);
    n--;
    fclose(fp);//关闭文件
    return (n);//返回个数
    }
    
    
    int tjdzzs()//统计文读者本个数函数
    
    {
    FILE *fp;
    int zhenghao=0,n;
    char mingzi[20]={'\0'},riqi[20]={'\0'},zname[20]={'\0'};
    fp=fopen("reader.txt","r");//打开文件
    for (n=0;!feof(fp);n++)//逐个读文件
    fscanf(fp,"%d%s%s%s ",&zhenghao,&mingzi,&riqi,&zname);
    n--;
    fclose(fp);//关闭文件
    return (n);//返回个数
    }
    
    
    int tjzs3()//统计账号密码文本个数
    {
    FILE *fp;
    int zhao=0,n;
    char mm[20]={'\0'};
    fp=fopen("land.txt","r");//打开文件
    for (n=0;!feof(fp);n++)//逐个读文件
    fscanf(fp,"%d %s",&zhao,mm);
    n--;
    fclose(fp);//关闭文件
    return (n);//返回个数
    }
    
    
    void mainmenu()//主菜单
    {
    system ("cls");
    
    printf("**************************************************");
    
    printf("\n\n 1.图书系统\n\n");
    
    printf("\n\n 2.借阅系统\n\n");
    
    printf("\n\n 3.退出系统\n\n");
    
    printf("\n\n 请按键选择,回车确定\n");
    
    printf("*************************************************\n");
    
    return ;
    }
    
    
    void tsmenu() //图书馆信息菜单
    {
    system ("cls");
    
    printf("****************************************************");
    
    printf("\n 1.增加图书\n\n");
    
    printf("\n 2.删除图书\n\n");
    
    printf("\n 3.查询图书\n\n");
    
    printf("\n 4.库存浏览\n\n");
    
    printf("\n 5.返回上一层\n\n");
    
    printf("\n 请按键选择,回车确定\n");
    
    printf("***************************************************\n");
    
    return ;
    
    }
    
    
    void main1()
    {
    	void tsmian();
    	void jmain();
    	char choose;
    	mainmenu();
    	scanf(" %c",&choose);
    	switch(choose)//功能函数
      {
    	  case'1':
    	    tsmain();
    	    break;
    	  case'2':
    	  	jmain();
    	  	break;
    	  case'3':
    	  	system("cls");
        getch();
      	exit(0);
      	system ("cls");
    	break;
      }
    }
    
    
    void tsmain()
    {
    	void zjts();
    	void scts();
    	void ctts();
    	void llts();
    	char choose;
    	tsmenu();
    	scanf(" %c",&choose);
    	for(;;)
    	{
    		switch(choose)
    	{
    	case'1':
    		zjts();
    		break;
    	case'2':
    		scts();
    		break;
    	case'3':
    		cxts();
    		break;
    	case'4':
    		llts();
    		break;
    	case'5':
    		main1();
    		break;
    	}
        }
    }
    
    
    void zjts()//增加图书
    {
    	FILE*fp;
    	char i;
    	int many=0;
        float price=0;
        char  nam[20]={'\0'},aut[20]={'\0'},cat[20]={'\0'},pub[20]={'\0'},num[20]={'\0'};
        system ("cls");
    
        if ((fp=fopen("library.txt","r"))==NULL)//if语句:打开图书馆文件,不存在此文件则新建
    	{
          fp=fopen("library.txt","w");
          fclose(fp);
        }
    	fp=fopen("library.txt","a");
    	
    	printf("\n请按以下格式输入图书信息:\n书号 书名 作者 出版社 类别 进库量 单价");
    	
    	for(;i!=27;)//为了实现输入一次后按esc退出
    	{
    		printf("请输入:\n");
    		scanf("%s%s%s%s%s%d%f",num,nam,aut,pub,cat,&many,&price);
    		fprintf(fp,"%-8s%-9s%-14s%-16s%-18s%-7d%-8.2f\n",num,nam,aut,pub,cat,many,price);
    	    printf("继续输入请按回车,结束输入请按Esc\n");
            i=getch();//暂停程序当i接收后继续下一条指令
            for (;i!=13&&i!=27;)//保证只能是CR和ESC才能退出循环,输入其他字符无用,暂停程序,按'CR'继续。
            i=getch();
         }
    
    	fclose(fp);
        printf("\n保存成功,按任意键返回上一层!");
        getch();
    	tsmain();//返回上一层
    }
    
    void scts()//删除图书
    {
    	   struct book *head=NULL;
           struct book *p,*p1,*p2;
           int tmany=0,n=0,j,k;
           float tprice=0;
           char  tnam[20]={'\0'},taut[20]={'\0'},tcat[20]={'\0'},tpub[20]={'\0'},tnum[20]={'\0'};
    	   char jjnam[20]={'\0'};
    	   char i;
           FILE *fp;
           if ((fp=fopen("library.txt","r"))==NULL)//打开文件
           {
    	       system ("cls");
               printf("\n记录文件不存在!按任意键返回");
               getch();
               tsmain();
           }
    
    	   else//实现删除的功能
    	   {
    	      system ("cls");
    	      printf("\n请输入你要删除的书名:");//输入删除图书书名
              scanf("%s",jjnam);
              printf("\n确认删除请回车,取消请按Esc\n");
              i=getch();
              for(;i!=13&&i!=27;)
              i=getch();
              if (i==27)
              tsmain();
    	      fp=fopen("library.txt","r");
    		 j=tjzs();
    
    	   for (k=0;k<j;k++)
           {
    	       fscanf(fp,"%s%s%s%s%s%d%f",tnum,tnam,taut,tpub,tcat,&tmany,&tprice);
               if (strcmp(jjnam,tnam))//比较名字,将不同名字的信息复制到链表
              {
    	          n++;//相同返回值为0不执行if语句继续循环,不同则执行直到将所有不同的书名建立成链表
    	            if (n==1)//建立链表
                    {
    		          p1=p2=(struct book*)malloc(LEN);
                      head=p1;
    				}
                    else
    			    {
    			      p2->next=p1;
    				  p2=p1;
                      p1=(struct book*)malloc(LEN);//新建链表
                    }
    
                    strcpy(p1->num,tnum);//复制书号
                    strcpy(p1->nam,tnam);//复制书名
                    strcpy(p1->aut,taut);//复制作者名字
                    strcpy(p1->pub,tpub);//复制出版社
                    strcpy(p1->cat,tcat);//复制类别
                    p1->many=tmany;//复制个数
                    p1->price=tprice;//复制单价
               }
           }
                 if (n==0)//如果图书只有一项且这一项刚好和要删除的相同
    			 {
    			 head=NULL;
    			 }
    			 else//建立链表的最后剩余一个储存空间,所以封底
    			 {
    			 p2->next=p1;
    			 p1->next=NULL;
    			 fclose(fp);
    			 }
        }
    
       fp=fopen("library.txt","w");//清空文件,只写打开,然后关闭
       fclose(fp);
       fp=fopen("library.txt","a");//追加文件
       p=head;
    
       for (;p!=NULL;)//把链表内容覆盖到文件
       {
       	   fprintf(fp,"%-8s%-9s%-14s%-16s%-18s%-7d%-8.2f\n",p->num,p->nam,p->aut,p->pub,p->cat,p->many,p->price);
       	   p=p->next;
       }
       fclose(fp);
       system ("cls");
       printf("\n删除成功 \n按任意键返回上一层\n");
       getch();//返回上一层
       tsmain();
    }
    
    
    void cxts()//查询图书
    {
    	   FILE *fp;
           int k=0,many=0,m=0,n=0;
    	   float price=0;
           char  nam[20]={'\0'},aut[20]={'\0'},cat[20]={'\0'},pub[20]={'\0'},num[20]={'\0'};
           char i;
           char chazhao[20]={'\0'};
           if ((fp=fopen("library.txt","r"))==NULL)//打开文件
           {
    	       system ("cls");
               printf("\n记录文件不存在!按任意键返回");
      		   getch();
    		   tsmain();
           }
    	   system("cls");
           printf("请输入书号,书名,作者或类别查询:\n");
           scanf("%s",chazhao);
           system ("cls");
           m=tjzs();
    
    	   for (n=0;n<m;n++)
    	   {
    	    fscanf(fp,"%s%s%s%s%s%d%f",num,nam,aut,pub,cat,&many,&price);
            if(!strcmp(chazhao,num)||!strcmp(chazhao,nam)||!strcmp(chazhao,aut)||!strcmp(chazhao,cat))
            {
            	if(k==0)
                {
    			  printf("查询结果:\n\n");
    			  printf("书号\t书名\t作者\t\t出版社\t\t类别\t\t现存量\t单价\n");
                }
    			printf("%-8s%-9s%-14s%-16s%-18s%-7d%-8.2f\n",num,nam,aut,pub,cat,many,price);
                k++;
            }
           }
            if (k==0)//文件夹为空则输出无记录并返回上一层
            { system ("cls");
            printf("\n无符合记录!\n");
            getch();
            tsmain();
    		}
    		fclose(fp);//查询结束
    		getch();
    		tsmain();
    }
    
    
    void llts()//浏览图书
    {
    	FILE *fp;
    	int n=0;
           int k=0,m=0,many=0;
    	   float price=0;
           char  nam[20]={'\0'},aut[20]={'\0'},cat[20]={'\0'},pub[20]={'\0'},num[20]={'\0'};
      	   char i;
    	   if ((fp=fopen("library.txt","r"))==NULL)//打开文件
           {
    	       system ("cls");
               printf("\n记录文件不存在!按任意键返回");
    		   getch();//返回
               tsmain();
    	   }
    	   n= tjzs();
           if (n==0)
          {
    	  system ("cls");
          printf("\n无任何记录!");
          }
    
    	     fp=fopen("library.txt","r");//打开只读文件
             system ("cls");
    	     printf("书号\t书名\t作者\t\t出版社\t\t类别\t\t库存量\t单价\n");
      
    	   for (m=0;m<n;m++)//输出数据
    	     {
    	     fscanf(fp,"%s%s%s%s%s%d%f",num,nam,aut,pub,cat,&many,&price);
    		 printf("%-8s%-9s%-14s%-16s%-18s%-7d%-8.2f\n",num,nam,aut,pub,cat,many,price);
    	 	}
    		fclose(fp);
            printf("\n按任意键返回\n");
            getch();
            tsmain();
    }
    
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`!~~~~~~~~~~~~~~~~~~~~~
    	
    void jmenu()//显示借书菜单
    {
    	system("cls");
    	printf("*****************************************************");
    	printf("\n\n 1.借书登记\n\n");
    	printf("\n\n 2.还书登记\n\n");
    	printf("\n\n 3.借阅情况查看\n\n");
    	printf("\n\n 4.查询借书\n\n");
        printf("\n\n 5.返回上一层\n\n");
    	printf("\n\n 请按键选择,回车确定\n");
    	printf("****************************************************");
    	return ;
    }
    
    
    void jmain()//借阅系统函数
    {
    	void js();
    	void hs();
    	void lljs();
    	void cxjs();
    	char choose;
    	jmenu();
    	scanf(" %c",&choose);
    	for(;;)
    	{
    		switch(choose)
    		{
    			case'1':
    			js();
    			break;
    			case'2':
    			hs();
    			break;
    			case'3':
    			lljs();
    			break;
    			case'4':
    			cxjs();
    			break;
    			case'5':
    			main1();
    			break;
    		}
    	}
    
    }
    
    
    
    void js()//借书函数
    {
    	FILE *fp,*fp3;
    	struct book *head=NULL;
        struct book *p,*p1,*p2;
        int i,loop,k,n=0,flag=0,s=0;
    	int jnum=0;
    	int many=0;
    	float tprice=0;
    	char tname[20]={'\0'},tauthor[20]={'\0'},tchuban[20]={'\0'},tkind[20]={'\0'},tshuhao[20]={'\0'},
             ttname[20]={'\0'},mingzi[20]={'\0'},riqi[20]={'\0'},zname[20]={'\0'};
    	char hit=0;
    
    	system("cls");
    	if((fp=fopen("library.txt","r"))==NULL)
    	{
    		system("cls");
    		printf("\n 图书馆无库存!按任意键退出!");
    		getch();
    		exit(0);
    	}
    	else
    	{
            printf("\n请输入借阅书名:\n请输入:");
    		scanf("%s",zname);
        k= tjzs();//统计图书馆文件个数
    
    	for (i=0;i<k;i++)//先将图书信息建立链表,更改库存
        	{
        		fscanf(fp,"%s%s%s%s%s%d%f",tshuhao,tname,tauthor,tchuban,tkind,&many,&tprice);
    			n++;
    			if(n==1)
    			{
    				p1=p2=(struct book*)malloc(LEN);
    				head=p1;
    			}
    		    else
               	{
                    p2->next=p1;
                    p2=p1;
                    p1=(struct book*)malloc(LEN);
    
                }
    			strcpy(p1->num,tshuhao);//复制书号
    			strcpy(p1->nam,tname);//复制书名
    			strcpy(p1->aut,tauthor);//复制作者
    			strcpy(p1->pub,tchuban);//复制出版社
    			strcpy(p1->cat,tkind);//复制类别
    			p1->many=many;//复制现存量
    			p1->price=tprice;//复制单价
            }
            if(n==0)
     		head=NULL;
    		else
    		 {
    		 	p2->next=p1;
    		 	p1->next=NULL;
    		 	fclose(fp);
    		 }
    
    	}
    	p=head;
    	
    	for (;p!=NULL;)
    	{
    		if(!(strcmp(p->nam,zname)))//判断要借书的是否存在,标记等于1,存在库存减一
    		{
    			
                flag=1;
    		 	loop=p->many;
    		 	(p->many)--;
    		 }
    			p=p->next;
      }
    	if(flag&&(loop>0))//存在被借的图书且现存量大于0,把库存量变化后的链表存入文件
        {
    
    		fp=fopen("library.txt","w");
        	fclose(fp);
        	fp=fopen("library.txt","a");
        	p=head;
    
    		for(;p !=NULL;)
        	{
        		fprintf(fp,"%-8s%-9s%-14s%-16s%-18s%-7d%-8.2f\n",p->num,p->nam,p->aut,p->pub,p->cat,p->many,p->price);
       		   	p=p->next;
    		}
    		free(p);
    		fclose(fp);
    
    		if ((fp3=fopen("reader.txt","r"))==NULL)//建读者文件夹存入借书信息
            {
    		    fp3=fopen("reader.txt","w");//打开只读文件
                fclose(fp3);
            }
    		fp3=fopen("reader.txt","a");
    
    		printf("\n请按以下格式输入读者信息:\n 证号 姓名 借书日期 借书书名\n请输入:");//录入读者信息
     		scanf("%d %s %s %s",&jnum,mingzi,riqi,zname);
    		fprintf(fp3,"\n%-8d%-23s%-18s%-10s\n",jnum,mingzi,riqi,zname);
    	    fclose(fp3);
            printf("借书成功!请两个月内归还!!!按任意键返回\n");
    		getch();//返回
    		jmain();//调用借阅系统
       }
    	else
        {
        	if(flag!=0)
            printf("此书已被借完!按任意键返回!");//否则输出此书已被借完
    		else
    		printf("查找无此书!按任意键返回");
    	}
    	    getch();//返回
            jmain();//调用借阅系统
    
    }
    
    
    void hs ()//还书函数
    {
     	 FILE *fp,*fp3;
    	 struct reader *head=NULL;
    	 struct reader *p,*p1,*p2;
    	 struct book *lhead1=NULL;
    	 struct book *zp1,*lp1,*lp2;
    	 int txcl=0,i;
    	 float tprice=0;
    	 char tname[20]={'\0'},tauthor[20]={'\0'},tkind[20]={'\0'},
    	 tchuban[20]={'\0'},ttname[20]={'\0'},tshuhao[20]={'\0'};
    	 int ttzhenghao=0,tzhenghao=0,n=0,k=0,t=0,flag=0;
    	 char tmingzi[20]={'\0'},triqi[20]={'\0'},tzname[20]={'\0'},ttzname[20]={'\0'};
    	 char hitkey=0;
    	 system ("cls");
    {
     	 if ((fp=fopen("reader.txt","r"))==NULL)//不存在读者文件,则输出不能还书
    	  {
             system ("cls");
    		 printf("\n 不存在借书者!按任意键退出!");
    		 getch();
    		 system("cls");
    		 jmain();
          }
    
    	  else
    	  {{
    	     printf("\n请输入读者证号和书名:\n请输入:");
    		 scanf("%d %s",&ttzhenghao,ttzname);//输入还书证号和书名
    		 k=tjdzzs();//获取读者文件夹信息个数
    		 for (i=0;i<k;i++)//读取读者文件夹信息
               {
    			fscanf(fp,"%d%s%s%s\n ",&tzhenghao,tmingzi,triqi,tzname);
    			if((ttzhenghao==tzhenghao)&&!strcmp(ttzname,tzname))//如果证号书名存在,则标记为1
    			flag=1;
    			}
          fclose(fp);
    	  fp=fopen("reader.txt","r");//打开读者文件,删除借书信息
    	  if(flag)
    	  {
    	  for (i=0;i<k;i++)//将读者文件复制到链表
    	  {
    	  fscanf(fp,"%d%s%s%s\n ",&tzhenghao,tmingzi,triqi,tzname);//读取文件信息
    	  if(!((ttzhenghao==tzhenghao)&&!strcmp(ttzname,tzname)))
    	  {
              n++;
    		  if (n==1)
    		  {
    		      p1=p2=(struct reader*)malloc(LEN1);//新建链表
    			  head=p1;
    		  }
    		  else
    		  {
    		        p2->next=p1;
    				p2=p1;
    				p1=(struct reader*)malloc(LEN1);//新建链表
              }
    		  p1->jnum=tzhenghao;//复制证号
    		  strcpy(p1->jnam,tmingzi);//复制读者名字
    		  strcpy(p1->time,triqi);//复制日
    		  strcpy(p1->tsnam,tzname);//复制书名
    		  }}
    		  if (n==0)
    		  head=NULL;
    		  else
    		  {
    		       p2->next=p1;
    			   p1->next=NULL;
    			   fclose(fp);
    	      }
    		  fp=fopen("reader.txt","w");//清空读者文件
    		  fclose(fp);
    		  fp=fopen("reader.txt","a");//追加信息
    		  p=head;
    		  for (;p!=NULL;)//把链表内容覆盖读者文件
    		  {
    		      fprintf(fp,"\n%-8d%-23s%-18s%-10s\n",p->jnum,p->jnam,p->time,p->tsnam);
    			  p=p->next;
    	      }
    		  free(p);
    		  fclose(fp);
    		  }}}}
    
    		  if(flag)//标记为1,即还书时更改库存
    		  {{
    		  {
    		      printf("确认还书请按回车!");
    			  for (;hitkey!=13&&hitkey!=27;)
    			  hitkey=getch();
    			  if (hitkey==13)
    			  printf("成功!按任意键返回!");
    			  n=0;flag=0;
    			  fp3=fopen("library.txt","r");//打开图书馆文件
    			  k=tjzs();//获取图书馆文件个数
    			  for (i=0;i<k;i++)//将图书馆文件复制到链表
    			  {
    			       fscanf(fp3,"%s%s%s%s%s%d%f",tshuhao,tname,tauthor,tchuban,tkind,&txcl,&tprice);//读取信息
    				   n++;
    				   if (n==1)
    				   {
    				       lp1=lp2=(struct book*)malloc(LEN);//新建链表
    					   lhead1=lp1;
    				   }
    				   else
    				   {
    				       lp2->next=lp1;
    					   lp2=lp1;
    					   lp1=(struct book*)malloc(LEN);//新建链表
    				   }
    				   strcpy(lp1->num,tshuhao);//复制书号
    				   strcpy(lp1->nam,tname);//复制书名
    				   strcpy(lp1->aut,tauthor);//复制作者
    				   strcpy(lp1->pub,tchuban);//复制出版社
    				   strcpy(lp1->cat,tkind);//复制类别
    				   lp1->many=txcl; //复制现存量
    				   lp1->price=tprice;//复制单价
    				   }
    				   if (n==0)
    				   {
     	  		          lhead1=NULL;
    				   }
    				   else
    				   {
    				   	   lp2->next=lp1;
    				   	   lp1->next=NULL;
    				   	   fclose(fp3);
    				   }}}
    				   zp1=lhead1;
    				   for (;zp1!=NULL;)
    				   {
    				        if(!(strcmp(zp1->nam,ttzname)))//寻找书名相同
    						++(zp1->many);//现存量加1
    						zp1=zp1->next;
    					}
    					fp3=fopen("library.txt","w");//清空图书馆文件
    					fclose(fp);
    					fp3=fopen("library.txt","a");//追加信息
    					zp1=lhead1;
    					for (;zp1!=NULL;)//把链表内容覆盖图书馆文件
    					{
                             fprintf(fp3,"%-8s%-9s%-14s%-16s%-18s%-7d%-8.2f\n",
            				 zp1->num,zp1->nam,zp1->aut,zp1->pub,zp1->cat,zp1->many,zp1->price);
    						 zp1=zp1->next;
    				    }
    					fclose(fp3);
    					getch();//返回
    					jmain();//调用借阅系统
    					}
    					else
    					printf("不存在此信息!按任意键返回!");
    					getch();//返回
    					jmain();//调用借阅系统
    }
    
    
    void lljs()//显示借书情况函数
    
    {
        FILE *fp;
        int zhenghao=0,xcl=0,n=0,i=0,j=0;
        char mingzi[20]={'\0'},riqi[20]={'\0'},zname[20]={'\0'};
    	if ((fp=fopen("reader.txt","r"))==NULL)//打开读者文件夹
        {
            system ("cls");
            printf("\n记录文件不存在!按任意键返回");
    	    getch();
    	    jmain();
        }
        n=tjdzzs();
        if (n==0)
    	{ system ("cls");
    	printf("\n无任何记录!");
    	}
    	fp=fopen("reader.txt","r");
    	system ("cls");
    	printf("\n证号\t读者姓名\t\t借书日期\t书名\n");
    	for (;!feof(fp);)//输出文件信息
    	{
    	fscanf(fp,"%d%s%s%s\n ",&zhenghao,mingzi,riqi,zname);
    	printf("\n%-8d%-23s%-18s%-10s\n", zhenghao,mingzi,riqi,zname);
    	}
    	fclose(fp);
    	printf("\n按任意键返回\n");
    	getch();//返回
    	jmain();//调用借阅系统
    }
    
    					
    void cxjs()//查询借书
    {
    	   FILE *fp;
           int jsnum=0,k=0,many=0,m=0,n=0;
    
           char  jsnam[20]={'\0'},jstime[20]={'\0'},tsnam[20]={'\0'};
           char i;
           char chazhao[20]={'\0'};
           if ((fp=fopen("reader.txt","r"))==NULL)//打开文件
           {
    	       system ("cls");
               printf("\n记录文件不存在!按任意键返回");
      		   getch();
    		   jmain();
           }
    	   system("cls");
           printf("请输入证号或姓名查询:\n");
           scanf("%s",chazhao);
           system ("cls");
    	   m=tjzs();
    	   for (n=0;n<m;n++)
    	   {
    	    fscanf(fp,"%d%s%s%s",&jsnum,jsnam,jstime,tsnam);
            if(!strcmp(chazhao,jsnam)||(('chazhao'-'0')==jsnum))
            {
            	if(k==0)
                {
    			  printf("查询结果:\n\n");
    			  printf("\n证号\t读者姓名\t\t借书日期\t书名\n");
                }
    			printf("\n%-8d%-23s%-18s%-10s\n",jsnum,jsnam,jstime,tsnam);
                k++;
             }
           }
    	    if (k==0)//文件夹为空则输出无记录并返回上一层
            { system ("cls");
            printf("\n无符合记录!\n");
            getch();
            jmain();
    		}
           fclose(fp);//查询结束
    		getch();
    		jmain();
    }
    
    
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`
    
    void lmenu()//显示登录菜单
    {
    
    
    printf("\n\n\t    欢迎使用会员登录系统\n\n");
    printf("**********************************************");
    printf("\n\n\t\t1.登录系统\n\n");
    printf("\n\n\t\t2.创建账号\n\n");
    printf("\n\n\t\t3.修改密码\n\n");
    printf("\n\n\t\t4.退出系统\n\n");
    printf("\n\n\t    请按键选择,回车确定\n");
    printf("**********************************************");
    return ;
    }
    
    
    void lmain()//登录功能函数
    {
    	void land();
    	void xinjian();
    	char choose;
    	lmenu();
    	scanf(" %c",&choose);
    	switch(choose)//功能函数
      {
    	  case'1':
    	    land();
    	    break;
    	  case'2':
    	  	xinjian();
    	  	break;
    	  	case'3':
    	  	xgmm();
    	  	break;
    	  case'4':
    	  	system("cls");
        getch();
      	exit(0);
      	system ("cls");
    	break;
      }
    }
    
    
    
    void xinjian()//新建账户密码
    {
    	FILE *fp;
    	int zhanghao;
    	char password[20],password1[20];
    	char hit=0;
    	if ((fp=fopen("land.txt","r"))==NULL)//if语句:打开图书馆文件,不存在此文件则新建
    	{
          fp=fopen("land.txt","w");
          fclose(fp);
        }
        system("cls");
    	fp=fopen("land.txt","a");
    	for(;;)//输入两次密码确认,两次相同才能确认
    	{
    	   printf("\n请按以下格式输入账户:\n学号 密码\n");
    	   printf("请输入:");
    	   scanf("%d %s",&zhanghao,password);
           printf("再次输入密码:\n");
    	   scanf("%s",password1);
    	   if(strcmp(password,password1)==0)
    	   {
    	       fprintf(fp,"%d %s\n",zhanghao,password);
    		   break;
           }
           else
    	   {
    	       printf("两次输入密码不一致,继续创建按回车,退出按ESC");
    	       hit=getch();
    		   if(hit=27)
    		   system("cls");
    		   lmain();
    		         }
       }
       fclose(fp);
       printf("创建成功,按任意键返回");
       getch();
       system("cls");
       lmain();
    }
    
    
    
    int match(int m,char a[20])//匹配数据库中的账号密码
    {
    	FILE*fp;
    	int n=0,i=0;
    	int zhanghao;
    	char password[20];
    
    	if ((fp=fopen("land.txt","r"))==NULL)//不存在读者文件
    	  {
             system ("cls");
    		 printf("\n 还未存在用户!请新建账户");
    		 getch();
    	 	system("cls");
    		lmain();
    	
          }
    
    
            for(;!feof(fp);)
          {
            fscanf(fp,"%d%s",&zhanghao,password);
            if(m==zhanghao)
            {
            	if(strcmp(a,password)==0)
    			return 1;
    			else
    			{
    			return -1;
    		   }
    	    }
    	  }
    	  return 0;
     }
    
    void land()//输入账户密码的登录函数
    {
    	int zhanghao;
    	char password[20];
    	int i=2,j,k,n;
    	char hit=0;
    	system("cls");
    	do
    	{
    	   printf("\n请输入账号:\n");
           scanf("%d",&zhanghao);
           printf("确认输入请安回车,重新输入请按ECS");
           hit=getch();//暂停程序当i接收后继续下一条指令
           for (;hit!=13&&hit!=27;)//保证只能是CR和ESC才能退出循环,输入其他字符无用,暂停程序,按'CR'继续。
           {
    	        hit=getch();
    	   }
        }
        while(hit==27);
    	 printf("\n请输入密码:\n");
    	 scanf("%s",password);
         i=match(zhanghao,password);
         if(i==1)
    	 {
           printf("登陆成功!按任意键继续");
    	   getch();
    	   main1();
    	 }
    	 else
    	 {
    	 	if(i==-1)
    		 {
    		 printf("密码错误!");
    		 getch();
             land();
    		 }
    		 if(i==0)
    		 printf("不存在此用户");
    		 getch();
    		 system("cls");
    		 lmain();
    	 }
    }
    
    void xg(int z,char m[20])//修改函数
    {
    	FILE *fp;
    	int zhanghao1,n,j,k;
    	char mima1[20];
    	struct land *head,*p,*p1,*p2;
    
    	 fp=fopen("land.txt","r");
    	   j =tjzs3();
    
    	   for (k=0;k<=j;k++)
           {
    	       fscanf(fp,"%d %s",&zhanghao1,mima1);
               if (z!=zhanghao1)//比较名字,将不同名字的信息复制到链表
              {
    	            n++;//相同返回值为0不执行if语句继续循环,不同则执行直到将所有不同的书名建立成链表
    	            if (n==1)//建立链表
                    {
    		          p1=p2=(struct land*)malloc(LEN2);
                      head=p1;
    				}
                    else
    			    {
    			      p2->next=p1;
    				  p2=p1;
                      p1=(struct land*)malloc(LEN2);//新建链表
                    }
     				p1->zhanghao=zhanghao1;
                    strcpy(p1->password,mima1);//复制账号密码
              }
           }
            if (n==0)
    			 {
    			 head=NULL;
    			 }
    			 else//建立链表的最后剩余一个储存空间,所以封底
    			 {
    			 p2->next=p1;
    			 p1->next=NULL;
    			 fclose(fp);
    			 }
    			  fp=fopen("land.txt","w");//清空文件,只写打开,然后关闭
                  fclose(fp);
                  fp=fopen("land.txt","a");//追加文件
                  p=head;
                for (;p!=NULL;)//把链表内容覆盖到文件
       			{
       	   		 	fprintf(fp,"%d %s%\n",p->zhanghao,p->password);
       	   			p=p->next;
    	        }
    	        fprintf(fp,"%d %s\n",z,m);
                fclose(fp);
                 system ("cls");
    
    }
    
    
    
    void xgmm()//修改密码
    {
    
    	   FILE *fp;
           int zh=0,k=0,many=0,m=0,n=0;
           int chazhao,hit;
           char mima[20]={'\0'},password1[20]={'\0'};
           char  mm[20]={'\0'};
           char i;
    
           if ((fp=fopen("land.txt","r"))==NULL)//打开文件
           {
    	       system ("cls");
               printf("\n记录文件不存在!按任意键返回");
      		   getch();
      		   system("cls");
    		   lmain();
           }
    	   system("cls");
           printf("请输入你的帐号和旧密码:\n");
           scanf("%d %s",&chazhao,mima);
    	   m =tjzs3();
    	   for (n=0;n<=m;n++)
    	   {
    	    fscanf(fp,"%d %s",&zh,mm);
            if(zh==chazhao)
            {
            	if(!strcmp(mm,mima))
            	{
            		printf("请输入新的密码");
            		scanf("%s",mima);
           		    printf("再次输入密码:\n");
    	            scanf("%s",password1);
    	             if(strcmp(mima,password1)==0)
    	   			 {
    		             xg(chazhao,mima);
    		            getch();
    				    lmain();
    	                system("cls");
       			     }
           			  else
    	   			  {
    	       		   	  printf("两次输入密码不一致,按任意键退出");
    	       			  hit=getch();
    		   			  system("cls");
    				      lmain();
    
       				  }
    			}
    			else
    			{
    				printf("旧密码错误,按任意键返回!");
    				getch();
    				system("cls");
    				lmain();
    	            
    			}
    
            }
          }
    	   printf("不存在此账号,按任意键返回");
    		fclose(fp);//修改结束
    		getch();
    		system("cls");
    		lmain();
    }
    
    
    
    int main()
    {
    	system("color 1F");
    	lmain();
    	return 0;
    }
    
    

    5.遇到的难点及解决办法

    (1)不知道如何停止程序,以及只让程序在ESC和回车按下后才继续工作。
    解:查阅资料getch()
    所在头文件:conio.h
    函数用途:从控制台读取一个字符,但不显示在屏幕上
    函数原型:int getch(void)
    返回值:读取的字符
    代码: for(;i!=13&&i!=27;)
    i=getch();

    (2)不知道C语言未初始化的变量的值,导致无限循环。
    解:全局变量 、静态变量初始值为0
    局部变量,自动变量初始值随机分配

    (3)不知道如何快速清理文件和新建文件
    解:查阅览书本后知道,先只写文件,如果文件名和已存在的相同,那么就会先删除原有文件,而且如果不存在文件将会之间新建文件。
    fp=fopen(“library.txt”,“w”); \清空
    fclose(fp);
    if ((fp=fopen(“library.txt”,“r”))==NULL)//快速新建
    {
    fp=fopen(“library.txt”,“w”);
    fclose(fp);
    }

    (4)对a!=2和a=!2弄混淆
    解:a!=2:表示a不等于“2”;
    a=!2:表示a等于“!2”(0);

    (5)编译正确,但是有的时候scanf语句好像没有执行,输入数据回车,程序没反应
    解:查阅得知:
    这种情况通常发生在前面已经有了输入语句,而当前的scanf是在接收字符(即用%c控制输入)时。由于前面的输入语句(不一定是scanf)把最后输入的’\n’遗留在了输入缓冲区,而当前的scanf("%c",…);又会把’\n’当一个字符接收,又由于scanf在%c控制下只接收一个字符,所以就不能接收正式输入的字符了。解决这一问题的最简单办法是在接收字符的scanf的控制符"%c"中的%前加一个空格写成" %c",把前一次输入遗留在输入缓冲区里的所有广义空格(’ ‘、’\t’、’\n’等)都吸收掉。在接收字符的scanf前加getchar()等的办法其实是有漏洞的——当缓冲区里只遗留了一个广义字符时可正常工作,若多于一个则同样出错。 按回车没反应

    (6),关于“feof”的误区
    For(;!feof(fp)?;
    n++;
    n–;来判断文件里面字符的个数为什么错误,
    查阅得知:
    1.EOF
    EOF是一个计算机术语,为End Of File的缩写,在操作系统中表示资料源无更多的资料可读取。资料源通常称为档案或串流。通常在文本的最后存在此字符表示资料结束。这个定义的意思是,文档的结尾都有一个隐藏字符”EOF”,当程序读取它的时候,就会知道文件已经到达结尾。通常使用while循环加EOF判断作为读取结束的标志。
    EOF 的值通常为 -1,但它依系统有所不同。
    2.feof()
    feof()的原理:
    feof()函数,并不是通过读取到文件的EOF来评判,这个文件是否为空。
    对feof()来说,它的工作原理是,站在光标所在位置,向后看看还有没有字符。如果有,返回0;如果没有,返回非0。它并不会读取相关信息,只是查看光标后是否还有内容。
    直接使用时的错误分析:
    对于一个空文件来说,当程序打开它的时候,它的光标会停在文件的开头,但是由于文件里什么内容都没有存(但是EOF是存在的),即整个文件就存贮了一个EOF。当程序打开文件,并直接调用feof()时,这个函数就会站在光标的位置向后张望,结果就看见了EOF,然后就当然返回0了。所以使用feof()函数时,必须要读取文件,让光标移动。

    (7)错因:用正确的格式写入文件,结果却没有数据
    解:没有及时fclose(fp),不弥补数据储存的原理。
    打开文件fopen函数把返回值赋给fp,用fclose关闭文件,如果不关闭文件就结束程序将会丢失数据,因为,在向文件里面写入数据时,是先将数据输入到缓冲区,待缓冲区从满后才正式输出给文件。因此用fclose函数关闭文件时,先把缓冲区中的数据输出到磁盘文件,然后才撤销文件信息区。

    下载链接
    链接:https://pan.baidu.com/s/13fFq7OwTb9ulWMRYHym-ZA 密码:4wbd
    亲,点个赞
    
    
    展开全文
  • java实战——图书管理系统

    万次阅读 多人点赞 2020-09-29 19:45:13
    因为这个写的比较完整,所以简单说明一下过程中使用的EJB和RMI两个东西。 EJB实现原理:就是把原来放到客户端实现的代码放到服务器端,并依靠RMI进行通信。 RMI实现原理:就是通过Java对象可序列化机制实现分布...

    因为这个写的比较完整,所以简单说明一下过程中使用的EJB和RMI两个东西。

    EJB实现原理: 就是把原来放到客户端实现的代码放到服务器端,并依靠RMI进行通信。

    RMI实现原理 :就是通过Java对象可序列化机制实现分布计算。

    好了,没了,就这么简单...想稍微深入了解一下的看一下这个好了,我就不再赘述。

    https://blog.csdn.net/lovechuanyu/article/details/40508507

    虽然提到了上面两个东西,不过程序主体是没怎么用它们的,不过这个程序有个小小的恶作剧!!!(*^__^*) 嘻嘻

    从MyClient.java进入主程序,输入用户名密码登录,这些都是数据库里面存的,后面会直接贴图

     在搜索框里面输入想要查找的书籍名称,可以模糊搜索

    下一个是借阅页面,可以点击书籍所在行选中,然后点击借阅,控制台会提示“借书成功”,数据库里也出现借书信息

    那么接下来进入还书的界面, 直接单击查询能出现你当前登录的用户所有在借书籍的信息,选中书籍再点击归还

     

    还书状态变成了1,同时再点击查询的话在借书籍的信息也不见了 

    下面是数据库结构

     

     

    使用了ejb和rmi的代码在这里,大家可以自己去看

     

    欢迎大家关注我们,发送  图书管理系统  就能获得源码(可以的话麻烦亲们再顺便点一下资源下面的广告给我们一些支持,感谢感谢~)


    Give me your attentions!代码下架了,所以亲们可以无视上面的源码包了,同样的操作方式,发送    图书管理系统    就能获得新版的完整源码地址!

     

    展开全文
  • 图书管理系统

    2019-11-28 11:07:35
    这次我们来聊一聊本人写的第一个项目---图书管理系统。虽然项目难度不高,但是得对c语言要有一个深刻的认识和可以熟练的运用。这个项目基本上用到了c语言的所有内容,这也是这段时间对自身学习成果的检验。话不多说...
  • [mysql+qt] 图书管理系统

    万次阅读 多人点赞 2016-08-29 16:39:24
     图书管理系统包括了游客、用户登录、管理员登录三种模式。  在游客模式下,可以实现检索书籍的功能。  游客可以注册用户,但是借书权限需要管理员授予。  用户登录后,在检索书籍功能的基础上,还可以进行书籍...
  • C#图书管理系统完整源码

    万次阅读 多人点赞 2017-10-15 15:39:21
    C#WInform窗体图书管理项目
  • 一、图书管理系统—-用例图 二、图书管理系统—-类图 三、图书管理系统时序图
  • 基于JavaWeb开发的图书管理系统

    万次阅读 多人点赞 2020-03-12 10:11:42
    使用Java开发的图书管理系统 如题,用Java开发而成,具备基础功能,读者可以注册登录,登录时会判断账号类型再分别跳到各自对应的页面,读者可以查找,借阅,还书,查看历史借阅记录,修改个人资料,密码等,管理...
  • 简单的图书管理系统用例图(UML)

    万次阅读 2018-05-08 22:48:19
    运用工具:Presson自我评价:简单肤浅还可能是不规范的,初次接触用例图若有 错误请指出!此外:本人至今是软件工程大一新生,希望能认识更多志同道合的人共同努力,交流学习经验,也可在下方留下联系方式!...
  • 1 需求分析描述图书信息管理系统是使用计算机实现图书大量信息处理的电子档案管理系统,在本系统中主要满足借书者、图书管理员和系统管理员3方面的需求。对借书者来说主要是查询个人信息、查询图书信息、预定当前...
  • 图书管理系统设计总结与心得

    万次阅读 2018-06-30 22:14:01
    图书管理系统设计总结与心得设计思路:有日期类、记录类、图书类、用户类、管理类各个类之间的包含关系:管理类读取读者信息文件和图书信息文件,实现增删查改用户和图书。个体操作类登录,读取图书信息文件,实现...
  • 基于JAVA的图书管理系统(jsp+mysql+tomcat)

    万次阅读 热门讨论 2018-12-21 12:58:38
    这里分享一个java web 项目,是一个基于JAVA 的图书管理系统 本系统使用JSP+MySQL+Tomcat开发完成,由于开发时间过短,功能不甚完善,前台页面也不怎么美观,但是麻雀虽小,五脏俱全,对于初学者还是有一些帮助的,...
  • 图书管理系统类图实验报告

    万次阅读 2018-08-15 17:20:15
    本次试验就对图书馆管理系统的类图做出一系列列举,实现图书管理系统。 二、框架类图: 借阅者进行借书和还书之后,系统对图书的信息进行一系列操作。 三、创建类图: 四、学习总结: ...
  • 大一java图书管理系统课程设计

    万次阅读 多人点赞 2020-07-08 21:39:03
    大一java图书管理系统课程设计代码仅供参考!!!仅供参考!!!效果图如下管理员用户名:123456 密码123456下载地址:http://download.csdn.net/download/qq_36326947/9995208...
  • 图书管理系统 实验目的: 1、掌握面向对象分析与设计的思想与方法。 2、使用UML进行系统的面向对象分析与设计:用例图,类图,顺序图,状态图,活动图,组件图等。 3.系统功能用Java或...
  • 练习一:请画出学生信息管理系统的用例图 “学生信息管理系统” 功能性需求包括以下内容:  (1)系统管理员登录后可以对班级的基本信息进行增加、删除、修改、查询等操作。学校领导登录后可以对班级基本信息进行...
1 2 3 4 5 ... 20
收藏数 76,764
精华内容 30,705
关键字:

图书管理系统