图书馆管理系统 订阅
针对图书馆的业务范围及特点,设计了采购子系统、编目子系统、打印子系统、检索统计子系统、流通信息子系统以及系统维护子系统,这几个子系统包括了图书馆的主要业务工作,可以全面实现对图书馆的采购、编目、检索、统计和流通等业务的计算机管理。系统采用智能导航式界面设计,在业务流程的实现方面更加注重智能化、规范化、流程化,极大地提高图书馆的管理效率及服务质量。同时该系统和下面的:电子阅览室管理子系统、通道验证管理子系统、证卡打印子系统和OA办公子系统构成图书馆局部一卡通。 展开全文
针对图书馆的业务范围及特点,设计了采购子系统、编目子系统、打印子系统、检索统计子系统、流通信息子系统以及系统维护子系统,这几个子系统包括了图书馆的主要业务工作,可以全面实现对图书馆的采购、编目、检索、统计和流通等业务的计算机管理。系统采用智能导航式界面设计,在业务流程的实现方面更加注重智能化、规范化、流程化,极大地提高图书馆的管理效率及服务质量。同时该系统和下面的:电子阅览室管理子系统、通道验证管理子系统、证卡打印子系统和OA办公子系统构成图书馆局部一卡通。
信息
注    重
智能化、规范化、流程化
特    点
流程简单等
中文名
图书馆管理系统
功能模块
四个子系统
图书馆管理系统工作流程
图书馆管理系统的工作流程非常简单,首先在电子标签内写入详细的图书资料信息,然后把电子标签粘贴在相应的图书资料上,当需要对图书资料进行借还、查找、盘点等操作时,读写器就会读取资料上电子标签的信息并将信息传送到服务器上,从而实现对图书资料的管理。
收起全文
精华内容
参与话题
问答
  • 图书馆管理系统 实验目的: 1、掌握面向对象分析与设计的思想与方法。 2、使用UML进行系统的面向对象分析与设计:用例图,类图,顺序图,状态图,活动图,组件图等。 3.系统功能用Java或...

    实验题目:

    图书馆管理系统

     

    实验目的:

    1、掌握面向对象分析与设计的思想与方法。

    2、使用UML进行系统的面向对象分析与设计:用例图,类图,顺序图,状态图,活动图,组件图等。

    3.系统功能用Java或C++语言实现,并与后台数据库连接,实现系统的基本功能。

     

    实验设备及环境:

    硬件:多媒体计算机

    软件:Windows7操作系统、Rational Rose建模工具

     

    实验内容及要求:

    工资管理:在取得授权的情况下,有关人员要进行如下工作。

    (1)书籍信息录入

    图书管理员录入书籍的书号、名称,修改录入的出错(维护),形成图书表。

    (2)读者信息录入

    系统管理员录入读者的个人信息,修改录入的出错(维护),形成读者表。

    (3)借阅情况的录入

    图书管理员在读者借阅图书时录入信息,修改录入的出错(维护),形成借阅表和历史借阅表。

    (4)计算扣款金额

    图书管理员按读者借书时间、还书时间和借阅时长判断读者是否需要扣费,然后生成信息到历史借阅表中。 

    (5)读者、图书管理员及图书信息的查询

    读者可以根据自己的读者号查询自己的个人信息;图书管理员可以根据自己的管理员号查询自己的个人信息(包括工资);所有人都可以登录之后无条件查询图书的信息包括馆藏册数。

     

    完成步骤和要求:

    完成用户需求的分析,找出系统的执行者、用况,画出用况模型图(包括用例描述)。

    找出系统的概念类,建立基本模型。

    建立系统顺序/通信图,找出系统与外界交互的消息。

    建立系统活动图,找出系统的主要业务流程与关键操作流程。

    建立系统中主要对象的状态机图,找出对象在其生存期内因响应事件所经历的状态序列。

    给出系统的问题域部分设计的思路,结合2建立类设计模型图。

    给出系统的关键界面设计图,并予以说明。

    给出数据管理部分的设计结果。

    给出控制驱动部分的设计思路。(可选)

    设计系统的构件图和部署图。(可选)

     

    四、实验结果及分析

    1. 根据用户的需求画出用况图:

     

    在本系统中一共包含了三个参与者:

    其中读者的主要用例包括查询读者账户(即查询自己的个人信息以及查询自己的账户和借阅情况)、借书、还书和查询图书信息。

    图书管理员的主要用例是查看读者的账户,包括读者的个人信息以及读者的账户和借阅情况。在对书籍的信息进行管理的时候能够查看并添加添加图书的各种信息,修改图书的信息,以及删除图书的信息。在对借书记录和还书记录进行管理时图书管理员可以判断读者的借书情况是否超期,根据超期的情况决定是否需要罚款。

    系统管理员有五个用例,管理借阅者信息,包括添加新生信息和删除毕业生信息。在对图书的信息进行管理的时候,也能够添加新书的信息和删除已损坏图书的信息。同时,系统管理员也可以查询现有所有图书的信息,来决定是否需要引进新书。系统管理员也可以管理借书记录和还书记录,主要是当图书管理员遇到问题时,系统管理员也可以实现借还书的功能。

    另外,图书管理员和系统管理员都继承于图书馆内部人员这个父类。

     

    2.根据用况图建立本系统的类图:

     

    本系统一共设计了七个类:    。

    读者类:属性包含(1)读者证号 (2)密码 (3)最大借书数量

    方法包括(1)借书 (2)还书 (3)查看用户账户 (4)查看借书数量 (5)登录系统

        (5)查询图书信息 (6)交罚款

        图书管理员类:属性包含(1)管理员帐号 (2)密码

    方法包括(1)查询图书信息(2)修改图书信息

        书架类:属性包含(1)书架号 (2)类型(3)位置(4)存放数量

    方法只有 存放图书

    图书类:属性包含(1)书号(2)书名(3)数量(4)价格(5)出版社

        (6)馆藏册数(7)在馆册数

    系统管理员类:属性包含 值班时间

         方法包括(1)查看用户个人信息(2)修改用户个人信息

    后台系统类:属性包含(1)级别(2)配置

         方法包括(1)存储用户个人信息(2)存储图书信息(3)存储借阅信息

    Item类:属性包含 id

         方法包括(1)创建(2)销毁(3)更新(4)显示图书信息(5)显示借阅次数

    其中,图书管理员类和系统管理员类是工作人员类的子类,图书管理员在继承了其父类的属性和操作以外还自己添加了管理员帐号和密码这两个属性,添加了查询图书信息和修改图书信息这两个操作。系统管理员在继承了父类的基础以外还添加了值班时间这个属性,以及查看用户个人信息和修改用户个人信息这两个操作。

    另外,读者类和工作人员类是Person类的子类,读者在继承了其父类的属性和操作以外还自己添加了读者证号、密码和最大借书数量这几个属性,添加了借书、还书、查看用户账户、查看借书数量、登录系统、查询图书信息和交罚款这些操作。工作人员在继承了其父类的属性和操作以外还自己添加了工资和管理范围这两个属性,添加了登录账户、查询用户借阅信息、管理借书记录、管理还书记录、查看用户账户这些操作。

    Person类是读者类和工作人员类的父类,它包含了所有人都有的三个属性:姓名、性别和年龄。读者类和工作人员类继承于Person类,这就简化了这两个子类的属性。

    类之间的关系先从图书管理员讲起,图书管理员能够为读者提供服务,因此,二者之间应该是服务与被服务的关系。另外,图书管理员能够管理书架和图书,而且书架与图书之间是存放与被存放的关系,所有的图书都被存放于图书馆的书架中。最后,图书管理员还能够查看Item,Item类有点类似于超市中在购物后产生的小票,当读者在完成整个借阅的操作之后,后台系统会自动生成一个Item,因此,在类图中Item与后台系统之间是一种聚合的关系,而读者也可以查看Item,因为当读者在完成借阅之后,Item便可以证明借书是否成功以及后台系统是否发生故障。

    除了图书管理员之外,同样继承于工作人员的系统管理员类也与其他类有着很多联系,比如说系统管理员同样与图书类有着维护与被维护这样的关系,但与图书管理员不同的是,系统管理员只负责通过从后台系统中的添加、修改或者删除来管理图书,而不是像图书管理员一样去管理实体的图书。另外,系统管理员可以管理后台系统,控制后台系统中所存储的信息以及当后台系统在发生一些故障时,系统管理员能够提供及时的维修。

     

     

    3.用户登录的时候的时序图:

        借书过程的时序图:

    上图表示了读者在进行借阅操作时的一系列变化,读者在进行借书操作之前,首先需要输入自己的信息包括帐号和密码,显示器将这些信息发送给数据库,在数据库中将读者的帐号和密码进行比对,进行身份验证,并将验证的结果返回给读者。如果身份验证成功则用户登录成功,反之读者登录失败。

    然后,读者可以向图书管理员发送借阅请求,图书管理员在收到消息后可以向后台系统输入借阅信息,后台系统查看对应图书的馆藏册数,并根据馆藏信息,返回该图书是否可借阅。若可借阅,则图书管理员可在此时修改后台系统的借阅信息,将需要借阅图书的读者信息添加到后台数据库的借阅表中,并且后台系统自动计算当前对应的借阅时间。

    此时,后台系统调用其Item功能,当图书管理员修改完借阅表之后,后台系统生成一张纸质书单,即类似于超市购物时的小票,图书管理员得到小票确认无误后将纸质小票返回给借阅者,借阅者可以得到实体的图书,整个借阅过程结束。

     

    还书过程的时序图:

    用户在还书的时候也需要登录,在登录的时候,首先需要输入自己的信息包括帐号和密码,显示器讲这些信息发送给数据库,在数据库中将用户的帐号和密码进行比对,进行身份验证,并将验证的结果返回给用户。如果身份验证成功则用户登录成功,反之用户登录失败。

    借阅者在登录成功之后,可以向图书管理员发送还书请求,图书管理员在接收到还书请求之后,需要进入后台系统查看该借阅者是否超期借阅,后台系统返回超期的信息,若借阅者还书的时间超过了应还的时间,后台系统则自动生成一张扣款账单,由图书管理员返回给借阅者。

    之后借阅者需要支付扣款的金额,支付完毕后,图书管理员需要修改借阅信息,即进入后台数据库的借阅表删除这条借阅信息,后台系统自动将删除的借阅信息添加到后台数据库的历史借阅表中。另外,后台系统还需要修改图书的馆藏册数,将所还图书的馆藏册数加一,并返回馆藏信息。

    最后,借阅者可以归还实体的图书,图书管理员将会请求生成一张还书书单,后台系统启用其Item功能生成一张还书书单并返回给读者,整个还书操作结束。

     

    4.进行还书操作时的活动图:

    读者在进行借书操作时,可以向图书管理员发送借阅请求,图书管理员在收到消息后可以向后台系统输入借阅信息,并查看对应图书的馆藏信息,并根据馆藏信息,产生一个分支判断。若馆藏册数为0,则不可借阅,返回错误信息并拒绝读者的借阅,之后结束整个借书操作。若馆藏册数不为0,则可借阅,后台系统返回可借阅信息。

    图书管理员在后台系统返回可借阅信息之后修改后台系统的借阅信息,将需要借阅图书的读者信息添加到后台数据库的借阅表中,并且后台系统自动计算当前对应的借阅时间,与此同时,后台系统调用其Item功能,当图书管理员修改完借阅信息之后,后台系统生成一张纸质书单。

    完成这两个操作之后,借阅者可以得到实体的图书,整个借阅过程结束。

     

    5.读者从未登记到还书成功时的状态图:

    读者在进行借书与还书操作之前首先需要通过注册来验证身份,学校中的图书馆借阅者以学生为主,学生在登记学生信息之后一直处于未注册的状态。通过图书馆管理员对其进行注册操作,读者的状态才由未注册转向已注册。另外,读者在已注册的状态下也可以修改个人信息,此时借阅者的状态不变。

    注册完之后的读者在身份验证成功之后就可以进入到系统,进行图书信息和自己个人信息的查询。已注册的读者此时处于可借阅的状态,若读者借书数量小于等于10本时,在办理借阅手续之后就可以对图书馆中的图书进行借阅。在取完实体书之后,借阅者便进入一个未还书的状态。

    若借阅者处于未还书状态超过2个月,则借阅者进入欠款状态,若借阅者处于未还书状态不超过2个月,则借阅者依旧处于未欠款状态。当借阅者在欠款状态时,需要进行还款,还款之后返回到未欠款状态。通过还书,借阅者进入已还书的状态。

    此时可选择继续借阅或者是直接结束,若是通过继续借阅返回,则需要进行判断,当读者借书数量小于等于10本时,才可以继续借阅,若是读者借书数量大于10本,则直接结束,无法再借。

     

    6.系统的界面设计:

    系统的页面包括主界面、录入界面、查询所有学生界面和查询单个学生界面。

    主界面:是所有分界面的总和,所有的分界面都展示在主界面上。

     

     

    录入界面:将新入学的学生录入到图书管理系统中,同时注册自己的账号,用账号登录到系统后,即可以查询自己的借书记录。

     

     

    查询所有学生界面:图书管理员可以通过“查询所有”这个界面来查询所有借阅者的信息以及借书的数量。

     

     

     

    查询单个学生界面:通过输入单个借阅者的姓名来查询对应借阅者的借阅信息。

     

     

    7、后台数据库管理部分的设计结果

    主要设计了7个表,具体表结构如下:

    图书表

    字段名称

    数据类型

    长度

    说明

    书号

    VARCHAR2

    15

    主码

    书名

    VARCHAR2

    20

    非空

      作者

    VARCHAR2

      10

    -

    类型

    VARCHAR2

    15

    依赖于书架类型表中的类型字段

    价格

    FLOAT

      -

    -

    出版社

    VARCHAR2

    40

    -

    摘要

    VARCHAR2

    50

    -

    馆藏册数

    NUMBER

    -

    -

    在馆册数

    NUMBER

    -

    小于馆藏册数

    存放位置

    VARCHAR2

    5

    -

    被借次数

    NUMBER

    -

    判断图书是否受欢迎的标准

     

    读者表

    字段名称

    数据类型

    长度

    说明

    卡号

    VARCHAR2

    15

    主码

    姓名

    VARCHAR2

    20

       -

    性别

    CHAR

    2

    为“男”或“女”

    单位

    VARCHAR2

    40

       -

    类型

    VARCHAR2

      10

    依赖于读者类型表中的类型字段

    级别

    NUMBER

    -

    用来记录该学生借阅的数量

    在借册数

    NUMBER

    -

       -

     

    读者类型表

    字段名称

    数据类型

    长度

    说明

    类型

    VARCHAR2

    10

    主码

    借书时间

    DATE

       -

     

    最多在借册数

    NUMBER

       -

     

     

    正借阅表

    字段名称

    数据类型

    长度

    说明

    书号

    VARCHAR2

    15

    主码

    卡号

    VARCHAR2

    15

    借书时间

    DATE

       -

     

    已还表

    字段名称

    数据类型

    长度

    说明

    书号

    VARCHAR2

    15

    主码

    卡号

    VARCHAR2

    15

    借书时间

    DATE

    -

    还书时间

    DATE

        -

     

    书架表

    字段名称

    数据类型

    长度

    说明

    书架号

    VARCHAR2

    15

    主码

    类型

    VARCHAR2

    15

    NOT NULL

     

    工作人员表

    字段名称

    数据类型

    长度

    说明

    工作号

    VARCHAR2

    15

    主码

    姓名

    VARCHAR2

    20

       -

    职务

    VARCHAR2

    20

       -

    工资

    FLOAT

    -

     -

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 图书馆管理系统(C语言课程设计)

    万次阅读 多人点赞 2018-02-13 13:09:29
    图书馆管理系统程序描述:该程序主要采用链表的形式来对书籍进行添加、修改、删除等等一系列操作,系统内含有用户以及管理员两种形式的访问人员,通过用户以及管理员的形式去对于书籍的一些借阅、归还、添加、删除、...

    图书馆管理系统

    程序描述:该程序主要采用链表的形式来对书籍进行添加、修改、删除等等一系列操作,系统内含有用户以及管理员两种形式的访问人员,通过用户以及管理员的形式去对于书籍的一些借阅、归还、添加、删除、修改的操作。对于这些书籍以及用户和管理员的属性的修改都会实时的保存到文本文件中,以方便下一次的读取。

    主要功能:用户的登陆和注册,管理员的登陆和注册,用户对于书籍的借阅、归还以及查看已借书籍的信息,管理员对于书籍的添加、删除、修改以及书籍的实时信息查询和用户的信息查询。

    编程语言:C语言

    涉及范围:结构体、链表、文件

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<math.h>
    #include<windows.h>
    struct userstruct        /*用户*/
    {
    	int bookcount;
    	char username[10];
    	char scert[10];
    	char booklist[10][20];
    	struct userstruct *next;
    };
    struct adminstruct       /*管理员*/
    {
    	char adminname[10];
    	char scert[10];
    	struct adminstruct *next;
    };
    struct bookstruct
    {
    	int id;
    	char bookname[10];
    	char author[10];
    	int year;
    	int month;
    	int day;
    	int count;
    	struct bookstruct *next;
    };
    struct userstruct *head = NULL, *end = NULL;
    struct adminstruct *adminhead = NULL, *adminend = NULL;
    struct bookstruct *bookhead = NULL, *bookend = NULL;
    int usercount, admincount, bookcount;
    
    void startsys();
    void readuserfile();
    void readadminfile();
    void readbookfile();
    void userlogin();
    void userfunction(struct userstruct *p);
    void userregister();
    void adminlogin();
    void adminregister();
    void adminfunction();
    void borrowbook(struct userstruct *userp);
    void findbook(struct userstruct *userp);
    void returnbook(struct userstruct *userp);
    void addbook();
    void deletebook();
    void searchbook();
    void changebook();
    void searchuser();
    void writefile(int flag);
    void changuserbook(char *userbookname,char *bookname);
    void deleteuserbook(char *bookname);
    
    int main()
    {
    	FILE *fp;
    
    	head = (struct userstruct *)malloc(sizeof(struct userstruct));
    	adminhead = (struct adminstruct *)malloc(sizeof(struct adminstruct));
    	bookhead = (struct bookstruct *)malloc(sizeof(struct bookstruct));
    
    	fp = fopen("user", "a+");
    	usercount = fread(head, sizeof(struct userstruct), 1, fp);
    	fclose(fp);
    	end = head;
    	readuserfile();
    
    	fp = fopen("admin", "a+");
    	admincount = fread(adminhead, sizeof(struct adminstruct), 1, fp);
    	fclose(fp);
    	adminend = adminhead;
    	readadminfile();
    
    	fp = fopen("book", "a+");
    	bookcount = fread(bookhead, sizeof(struct bookstruct), 1, fp);
    	fclose(fp);
    	bookend = bookhead;
    	readbookfile();
    
    	startsys();
    	return 0;
    }
    
    void startsys()
    {
    	int cmd;
    	int end = 0;
    
    	while (1)
    	{
    		system("cls");
    		printf("\n\n\n\n\n\n\n");
    		printf("**************************************************************");
    		printf("\n图书馆管理系统\n");
    		printf("1.用户登陆\n");
    		printf("2.管理员登陆\n");
    		printf("3.用户注册\n");
    		printf("4.管理员注册\n");
    		printf("0.退出\n");
    		printf("**************************************************************");
    		printf("\n\n\n\n\n\n\n");
    		printf("输入你需要进行的操作: ");
    		scanf("%d", &cmd);
    		getchar();
    		switch (cmd)
    		{
    		case 1:
    			userlogin();
    			break;
    		case 2:
    			adminlogin();
    			break;
    		case 3:
    			userregister();
    			break;
    		case 4:
    			adminregister();
    			break;
    		case 0:
    			end = 1;
    			break;
    		default:
    			printf("错误输入!\n");
    		}
    		if (end == 1)
    			break;
    	}
    }
    
    void userlogin()
    {
    	struct userstruct *p;
    	char username[100];
    	char scert[100];
    	int exist = 0;
    	FILE *fp;
    
    	p = head;
    	system("cls");
    	printf("\n\n\n\n\n\n\n");
    	printf("**************************************************************");
    	printf("\n输入您的用户信息: \n");
    	printf("username: ");
    	gets(username);
    	printf("userscert: ");
    	gets(scert);
    	printf("**************************************************************");
    	printf("\n\n\n\n\n\n\n");
    
    	while (p != NULL)
    	{
    		if (strcmp(p->username, username) == 0)
    		{
    			exist = 1;
    			while(strcmp(p->scert, scert) != 0)
    			{
    				printf("密码错误!请重新输入\n");
    				printf("userscert: ");
    				gets(scert);
    			}
    			printf("用户%s登陆成功!3秒后自动跳转至用户界面...", p->username);
    			Sleep(3000);
    			userfunction(p);
    		}
    		p = p->next;
    	}
    	if (!exist)
    	{
    		printf("不存在此用户名,请先前往注册...\n");
    		printf("3秒后自动跳转至主界面...");
    		Sleep(3000);
    	}
    }
    
    void userfunction(struct userstruct *p)
    {
    	int cmd;
    	int end = 0;
    
    	while (1)
    	{
    		system("cls");
    		printf("\n\n\n\n\n\n\n");
    		printf("**************************************************************");
    		printf("\n图书馆用户功能系统\n");
    		printf("1.借阅书籍\n");
    		printf("2.归还书籍\n");
    		printf("3.已借阅书籍信息\n");
    		printf("0.退出\n");
    		printf("**************************************************************");
    		printf("\n\n\n\n\n\n\n");
    		printf("输入您需要进行的操作: ");
    		scanf("%d", &cmd);
    		switch (cmd)
    		{
    		case 1:
    			borrowbook(p);
    			break;
    		case 2:
    			returnbook(p);
    			break;
    		case 3:
    			findbook(p);
    			break;
    		case 0:
    			end = 1;
    			break;
    		default:
    			printf("错误的输入!\n");
    		}
    		if (end == 1)
    			break;
    	}
    }
    
    void userregister()
    {
    	struct userstruct *p;
    	char username[1000];
    	char scert[1000];
    	FILE *fp;
    
    	system("cls");
    	if (usercount == 0)            //第一次添加
    	{
    		printf("username: ");
    		while (gets(username))
    		{
    			if (strlen(username) < 10 && !isexist(username, 0))
    				break;
    			else if (isexist(username, 0))
    			{
    				printf("该用户名已经存在!\n");
    				printf("username: ");
    			}
    			else
    			{
    				printf("too long\n");
    				printf("username: ");
    			}
    		}
    		strcpy(head->username, username);
    		printf("userscert: ");
    		while (gets(scert))
    		{
    			if (strlen(scert) < 10)
    				break;
    			else
    				printf("too long");
    		}
    		strcpy(head->scert, scert);
    		head->bookcount = 0;
    		end = head;
    		end->next = NULL;
    
    	}
    	else
    	{
    		p = (struct userstruct *)malloc(sizeof(struct userstruct));
    		printf("username: ");
    		while (gets(username))
    		{
    			if (strlen(username) < 10 && !isexist(username, 0))
    				break;
    			else if (isexist(username, 0))
    			{
    				printf("该用户名已经存在!\n");
    				printf("username: ");
    			}
    			else
    			{
    				printf("too long\n");
    				printf("username: ");
    			}
    		}
    		strcpy(p->username, username);
    		printf("userscert: ");
    		while (gets(scert))
    		{
    			if (strlen(scert) < 10)
    				break;
    			else
    				printf("too long");
    		}
    		strcpy(p->scert, scert);
    		p->bookcount = 0;
    		end->next = p;
    		end = p;
    		end->next = NULL;
    	}
    	usercount++;
    
    
    	fp = fopen("user", "w");
    	p = head;
    	while (p != NULL)
    	{
    		fwrite(p, sizeof(struct userstruct), 1, fp);
    		p = p->next;
    	}
    	fclose(fp);
    
    	system("cls");
    	printf("用户%s创建成功\n", end->username);
    	printf("3秒后自动返回主界面....\n");
    	Sleep(3000);
    }
    
    int isexist(char *name,int flag)
    {
    	if (flag == 0)
    	{
    		struct userstruct *p;
    		p = head;
    		while (p != NULL && usercount != 0)
    		{
    			if (strcmp(name, p->username) == 0)
    				return 1;
    			p = p->next;
    		}
    	}
    	else if (flag == 1)
    	{
    		struct adminstruct *p;
    		p = adminhead;
    		while (p != NULL)
    		{
    			if (strcmp(name, p->adminname) == 0)
    				return 1;
    			p = p->next;
    		}
    	}
    	else if (flag == 2)
    	{
    		struct bookstruct *p;
    		p = bookhead;
    		while (p != NULL)
    		{
    			if (strcmp(name, p->bookname) == 0)
    				return 1;
    			p = p->next;
    		}
    	}
    	return 0;
    }
    
    void adminlogin()
    {
    	struct adminstruct *p;
    	char adminname[100];
    	char adminscert[100];
    
    	p = adminhead;
    	system("cls");
    	printf("\n\n\n\n\n\n\n");
    	printf("**************************************************************");
    	printf("\n输入您的管理员信息: \n");
    	printf("adminname: ");
    	gets(adminname);
    	printf("adminscert: ");
    	gets(adminscert);
    	printf("**************************************************************");
    	printf("\n\n\n\n\n\n\n");
    
    	while (p != NULL)
    	{
    		if (strcmp(p->adminname, adminname) == 0)
    		{
    			while (strcmp(p->scert, adminscert) != 0)
    			{
    				printf("密码错误!请重新输入\n");
    				printf("adminscert: ");
    				gets(adminscert);
    			}
    			printf("管理员%s登陆成功!3秒后自动跳转至用户界面...", p->adminname);
    			Sleep(3000);
    			adminfunction(p);
    		}
    		p = p->next;
    	}
    }
    
    void adminfunction()
    {
    	int cmd;
    	int end = 0;
    
    	while (1)
    	{
    		system("cls");
    		printf("\n\n\n\n\n\n\n");
    		printf("**************************************************************");
    		printf("\n图书馆管理员功能系统\n");
    		printf("1.添加书籍信息\n");
    		printf("2.删除书籍信息\n");
    		printf("3.修改书籍信息\n");
    		printf("4.查询书籍信息\n");
    		printf("5.查询用户信息\n");
    		printf("0.退出\n");
    		printf("**************************************************************");
    		printf("\n\n\n\n\n\n\n");
    		printf("输入您需要进行的操作: ");
    		scanf("%d", &cmd);
    		getchar();
    		switch (cmd)
    		{
    		case 1:
    			addbook();
    			break;
    		case 2:
    			deletebook();
    			break;
    		case 3:
    			changebook();
    			break;
    		case 4:
    			searchbook();
    			break;
    		case 5:
    			searchuser();
    			break;
    		case 0:
    			end = 1;
    			break;
    		default:
    			printf("错误的输入!\n");
    		}
    		if (end == 1)
    			break;
    	}
    }
    
    void adminregister()
    {
    	struct adminstruct *p;
    	char adminname[1000];
    	char adminscert[1000];
    	FILE *fp;
    
    	system("cls");
    	if (admincount == 0)            //第一次添加
    	{
    		adminhead = (struct adminstruct *)malloc(sizeof(struct adminstruct));
    		printf("adminname: ");
    		while (gets(adminname))
    		{
    			if (strlen(adminname) < 10)
    				break;
    			else
    				printf("too long");
    		}
    		strcpy(adminhead->adminname, adminname);
    		printf("adminscert: ");
    		while (gets(adminscert))
    		{
    			if (strlen(adminscert) < 10)
    				break;
    			else
    				printf("too long");
    		}
    		strcpy(adminhead->scert, adminscert);
    		adminend = adminhead;
    		adminend->next = NULL;
    	}
    	else
    	{
    		p = (struct adminstruct *)malloc(sizeof(struct adminstruct));
    		printf("adminname: ");
    		while (gets(adminname))
    		{
    			if (strlen(adminname) < 10)
    				break;
    			else
    				printf("too long");
    		}
    		strcpy(p->adminname, adminname);
    		printf("adminscert: ");
    		while (gets(adminscert))
    		{
    			if (strlen(adminscert) < 10)
    				break;
    			else
    				printf("too long");
    		}
    		strcpy(p->scert, adminscert);
    		adminend->next = p;
    		adminend = p;
    		adminend->next = NULL;
    	}
    	admincount++;
    
    	fp = fopen("admin", "w");
    	p = adminhead;
    	while (p != NULL)
    	{
    		fwrite(p, sizeof(struct adminstruct), 1, fp);
    		p = p->next;
    	}
    	fclose(fp);
    
    	system("cls");
    	printf("管理员%s创建成功\n", adminend->adminname);
    	printf("3秒后自动返回主界面....\n");
    	Sleep(3000);
    }
    
    void borrowbook(struct userstruct *userp)
    {
    	struct bookstruct *p;
    	char bookname[100];
    	int exist = 0;
    
    	system("cls");
    	p = bookhead;
    	while (p != NULL)
    	{
    		printf("bookname: %10s\tbookcount: %3d\n", p->bookname, p->count);
    		p = p->next;
    	}
    	printf("输入您需要借阅的书籍名称: ");
    	getchar();
    	gets(bookname);
    
    	p = bookhead;
    	while (p != NULL)
    	{
    		if (strcmp(bookname, p->bookname) == 0)
    		{
    			if (p->count == 0)
    				printf("此书无余量...");
    			else
    			{
    				p->count -= 1;
    				userp->bookcount++;
    				strcpy(userp->booklist[userp->bookcount - 1], p->bookname);
    				writefile(0);
    				writefile(2);
    				exist = 1;
    				break;
    			}
    		}
    		p = p->next;
    	}
    
    	if (exist == 0)
    		printf("不存在此书!\n");
    	else
    		printf("%s借阅成功", p->bookname);
    	printf("3秒后返回用户界面...");
    	Sleep(3000);
    }
    
    void returnbook(struct userstruct *userp)
    {
    	struct bookstruct *p;
    	char bookname[100];
    	int count = userp->bookcount;
    	int exist;
    	int flag;
    
    	system("cls");
    	p = bookhead;
    	while (count--)
    	{
    		printf("booklist:\n");
    		printf("%s\n", userp->booklist[count]);
    	}
    	printf("\n\n\n\n\n");
    	printf("**************************************************************");
    	printf("\n输入你需要归还的书籍名称: ");
    
    	getchar();
    	while (gets(bookname))
    	{
    		exist = 0;
    		for (int i = 0; i < userp->bookcount; i++)
    		{
    			if (strcmp(bookname, userp->booklist[i]) == 0)
    			{
    				flag = i;
    				exist = 1;
    				break;
    			}
    		}
    		if (!exist)
    		{
    			printf("你借阅的书籍中不存在此书籍...\n");
    			printf("请重新输入你需要归还的书籍名称: ");
    		}
    		else
    			break;
    	}
    	printf("**************************************************************");
    	while (p != NULL)
    	{
    		if (strcmp(p->bookname, bookname) == 0)
    		{
    			p->count++;
    			break;
    		}
    		p = p->next;
    	}
    
    	for (int i = flag; i < userp->bookcount - 1; i++)
    	{
    		strcpy(userp->booklist[i], userp->booklist[i + 1]);
    	}
    	userp->bookcount--;
    	writefile(0);
    	writefile(2);
    	printf("\n%s归还成功...", bookname);
    	printf("3秒后自动跳转回用户界面...");
    	Sleep(3000);
    }
    
    void findbook(struct userstruct *userp)
    {
    	int count = userp->bookcount;
    	int n;
    
    	system("cls");
    	printf("\n\n\n\n\n");
    	printf("**************************************************************");
    	printf("\nbooklist:\n");
    	while (count--)
    	{
    		printf("%s\n", userp->booklist[count]);
    	}
    	printf("**************************************************************");
    	printf("\n输入0返回用户界面: ");
    	while (1)
    	{
    		scanf("%d", &n);
    		if (n == 0)
    			break;
    		else
    			printf("无效的输入,请重新输入: ");
    	}
    }
    
    void addbook()
    {
    	struct bookstruct *p;
    	char bookname[100];
    	FILE *fp;
    
    	system("cls");
    	if (bookcount == 0)
    	{
    		printf("输入新增书籍的书名: ");
    		while (gets(bookname))
    		{
    			if (strlen(bookname) > 10)
    				printf("too long\n");
    			else
    				break;
    		}
    		strcpy(bookhead->bookname, bookname);
    		printf("id: ");
    		scanf("%d", &bookhead->id);
    		printf("author: ");
    		scanf("%s", bookhead->author);
    		printf("bookyear: ");
    		scanf("%d", &bookhead->year);
    		printf("bookmonth: ");
    		scanf("%d", &bookhead->month);
    		printf("bookday: ");
    		scanf("%d", &bookhead->day);
    		printf("bookcount: ");
    		scanf("%d", &bookhead->count);
    
    		bookend = bookhead;
    		bookend->next = NULL;
    	}
    	else
    	{
    		printf("输入新增书籍的书名: ");
    		while (gets(bookname))
    		{
    			if (strlen(bookname) > 10)
    				printf("too long\n");
    			else
    				break;
    		}
    		int isexist = 0;
    		p = bookhead;
    		while (p != NULL)
    		{
    			if (strcmp(bookname, p->bookname) == 0)
    			{
    				isexist = 1;
    				break;
    			}
    			p = p->next;
    		}
    		if (isexist == 1)
    		{
    			int count;
    
    			printf("输入新添书籍的数量: ");
    			scanf("%d", &count);
    			p->count += count;
    		}
    		else
    		{
    			p = (struct bookstruct *)malloc(sizeof(struct bookstruct));
    
    			strcpy(p->bookname, bookname);
    			printf("id: ");
    			scanf("%d", &p->id);
    			printf("author: ");
    			scanf("%s", p->author);
    			printf("bookyear: ");
    			scanf("%d", &p->year);
    			printf("bookmonth: ");
    			scanf("%d", &p->month);
    			printf("bookday: ");
    			scanf("%d", &p->day);
    			printf("bookcount: ");
    			scanf("%d", &p->count);
    
    			bookend->next = p;
    			bookend = p;
    			bookend->next = NULL;
    		}
    	}
    	bookcount++;
    
    	p = bookhead;
    	fp = fopen("book", "w");
    	while (p != NULL)
    	{
    		fwrite(p, sizeof(struct bookstruct), 1, fp);
    		p = p->next;
    	}
    	fclose(fp);
    
    	system("cls");
    	printf("书籍添加成功\n");
    	printf("3秒后自动返回管理员界面....\n");
    	Sleep(3000);
    }
    
    void deletebook()
    {
    	struct bookstruct *bookp;
    	char bookname[100];
    	int exist = 0;
    
    	bookp = bookhead;
    	printf("输入你需要删除的书籍名称: ");
    	while (gets(bookname))
    	{
    		while (bookp != NULL)
    		{
    			if (strcmp(bookname, bookp->bookname) == 0)
    			{
    				exist = 1;
    				break;
    			}
    			bookp = bookp->next;
    		}
    		if (!exist)
    		{
    			printf("不存在此书籍名称的书籍...\n");
    			printf("请重新输入: ");
    		}
    		else
    			break;
    	}
    	deleteuserbook(bookname);
    	bookp = bookhead;
    	if (strcmp(bookhead->bookname,bookname) == 0)
    		bookhead = bookhead->next;
    	while (bookp->next != NULL)
    	{
    		if (strcmp(bookp->next->bookname, bookname) == 0)
    		{
    			bookp->next = bookp->next->next;
    			break;
    		}
    		bookp = bookp->next;
    	}
    	bookp = NULL;
    	writefile(2);
    }
    
    void searchbook()
    {
    	struct bookstruct *p;
    	char bookname[100];
    	int exist = 0;
    	
    	system("cls");
    	printf("\n\n\n\n\n\n\n");
    	printf("\n请输入您需要查询的书籍名称或书籍编号: ");
    	gets(bookname);
    	printf("\n\n\n\n\n\n\n");
    
    	p = bookhead;
    	while (p != NULL)
    	{
    		if (strcmp(p->bookname, bookname) == 0)
    		{
    			printf("**************************************************************");
    			printf("\nbookname: ");
    			puts(p->bookname);
    			printf("bookid: %d\n", p->id);
    			printf("author: %s\n", p->author);
    			printf("year/month/day: %d/%d/%d\n", p->year, p->month, p->day);
    			printf("bookcount: %d\n", p->count);
    			printf("**************************************************************\n");
    			exist = 1;
    			break;
    		}
    		p = p->next;
    	}
    	if (exist == 0)
    		printf("未找到相关书籍...\n");
    	printf("输入0返回管理员界面: ");
    	int n;
    
    	while (1)
    	{
    		scanf("%d", &n);
    		if (n == 0)
    			break;
    	}
    }
    
    void changebook()
    {
    	struct bookstruct *bookp;
    	char bookname[100];
    	int exist = 0;
    	int end = 0;
    	int bookyear, bookmonth, bookday, bookid, count;
    	char bookauthor[100];
    
    	bookp = bookhead;
    	system("cls");
    	printf("booklist:\n");
    	while (bookp != NULL)
    	{
    		printf("bookname: %10s\n", bookp->bookname);
    		bookp = bookp->next;
    	}
    
    	bookp = bookhead;
    	printf("输入你需要修改的书籍名称(按@退出): ");
    	while (gets(bookname))
    	{
    		if (strcmp(bookname, "@") == 0)
    			break;
    		while (bookp != NULL)
    		{
    			if (strcmp(bookp->bookname, bookname) == 0)
    			{
    				exist = 1;
    				break;
    			}
    			bookp = bookp->next;
    		}
    		if (!exist)
    			printf("不存在该书籍名称,请重新输入: ");
    		else
    			break;
    	}
    
    	if (!exist)
    		return;
    	else
    	{
    		int cmd;
    
    		system("cls");
    		printf("\n\n\n\n\n\n\n");
    		printf("**************************************************************\n");
    		printf("1.修改书籍名称\n");
    		printf("2.修改书籍id号\n");
    		printf("3.修改书籍日期\n");
    		printf("4.修改书籍数量\n");
    		printf("5.修改书籍作者\n");
    		printf("0.退出\n");
    		printf("**************************************************************");
    		printf("\n\n\n\n\n\n\n");
    		while (1)
    		{
    			printf("输入您需要进行的操作: ");
    			scanf("%d", &cmd);
    			switch (cmd)
    			{
    			case 1:
    			{
    				printf("输入你修改后的书籍名称: ");
    				scanf("%s", bookname);
    				changuserbook(bookp->bookname,bookname);
    				strcpy(bookp->bookname, bookname);
    				break;
    			}
    			case 2:
    			{
    				printf("输入你修改后的书籍ID: ");
    				scanf("%d", &bookid);
    				bookp->id = bookid;
    				break;
    			}
    			case 3:
    			{
    				printf("输入你修改后的书籍日期: ");
    				scanf("%d%d%d", &bookyear, &bookmonth, &bookday);
    				bookp->year = bookyear;
    				bookp->month = bookmonth;
    				bookp->day = bookday;
    				break;
    			}
    			case 4:
    			{
    				printf("输入你修改后的书籍数量: ");
    				scanf("%d", &count);
    				bookp->count = count;
    				break;
    			}
    			case 5:
    			{
    				printf("输入你修改后的书籍作者: ");
    				scanf("%s", bookauthor);
    				strcpy(bookp->author, bookauthor);
    				break;
    			}
    			case 0:
    			{
    				end = 1;
    				break;
    			}
    			}
    			if (end == 1)
    				break;
    		}
    	}
    	writefile(2);
    }
    
    void searchuser()
    {
    	struct userstruct *p;
    	char username[100];
    	int flag = 0;
    
    	p = head;
    	system("cls");
    	printf("\n\n\n\n\n\n\n");
    	printf("**************************************************************");
    	printf("\n输入您需要查询的用户名!\n");
    	printf("username: ");
    	gets(username);
    	while (p != NULL)
    	{
    		if (strcmp(p->username, username) == 0)
    		{
    			flag = 1;
    			break;
    		}
    		p = p->next;
    	}
    	if (flag == 0)
    	{
    		system("cls");
    		printf("不存在该用户信息\n");
    		printf("3秒后自动跳转至管理员页面...\n");
    		Sleep(3000);
    		return;
    	}
    	else
    	{
    		int n;
    
    		while (1)
    		{
    			system("cls");
    			printf("\n\n\n\n\n\n\n");
    			printf("**************************************************************");
    			printf("\n\t用户%s的个人信息\n", p->username);
    			printf("**************************************************************");
    			printf("\nusername: ");
    			puts(p->username);
    			printf("userscert: ");
    			puts(p->scert);
    			printf("bookcount: %d\n", p->bookcount);
    			if (p->bookcount != 0)
    			{
    				printf("booklist: ");
    				for (int i = 0; i < p->bookcount; i++)
    					puts(p->booklist[i]);
    			}
    			printf("输入0返回管理员页面!\n");
    			scanf("%d", &n);
    			if (n == 0)
    				break;
    		}
    	}
    }
    
    void readuserfile()
    {
    	struct userstruct *p;
    	FILE *fp;
    
    	p = head;
    	fp = fopen("user", "ab+");
    	while (fread(p,sizeof(struct userstruct),1,fp))
    	{
    		if (p->next != NULL)
    		{
    			p = (struct userstruct *)malloc(sizeof(struct userstruct));
    
    			end->next = p;
    			end = p;
    			end->next = NULL;
    		}
    	}
    }
    
    void readadminfile()
    {
    	struct adminstruct *p;
    	FILE *fp;
    
    	p = adminhead;
    	fp = fopen("admin", "ab+");
    	while (fread(p, sizeof(struct adminstruct), 1, fp))
    	{
    		if (p->next != NULL)
    		{
    			p = (struct adminstruct *)malloc(sizeof(struct adminstruct));
    
    			adminend->next = p;
    			adminend = p;
    			adminend->next = NULL;
    		}
    	}
    }
    
    void readbookfile()
    {
    	struct bookstruct *p;
    	FILE *fp;
    
    	p = bookhead;
    	fp = fopen("book", "ab+");
    	while (fread(p, sizeof(struct bookstruct), 1, fp))
    	{
    		if (p->next != NULL)
    		{
    			p = (struct bookstruct *)malloc(sizeof(struct bookstruct));
    
    			bookend->next = p;
    			bookend = p;
    			bookend->next = NULL;
    		}
    	}
    }
    
    void writefile(int flag)
    {
    	FILE *fp;
    	struct userstruct *userp;
    	struct adminstruct *adminp;
    	struct bookstruct *bookp;
    
    	userp = head;
    	adminp = adminhead;
    	bookp = bookhead;
    
    	if (flag == 0)
    	{
    		fp = fopen("user", "w");
    		while (userp != NULL)
    		{
    			fwrite(userp, sizeof(struct userstruct), 1, fp);
    			userp = userp->next;
    		}
    	}
    	else if (flag == 1)
    	{
    		fp = fopen("admin", "w");
    		while (adminp != NULL)
    		{
    			fwrite(adminp, sizeof(struct adminstruct), 1, fp);
    			adminp = adminp->next;
    		}
    	}
    	else
    	{
    		fp = fopen("book", "w");
    		while (bookp != NULL)
    		{
    			fwrite(bookp, sizeof(struct bookstruct), 1, fp);
    			bookp = bookp->next;
    		}
    	}
    	fclose(fp);
    }
    
    void changuserbook(char *userbookname,char *bookname)
    {
    	struct userstruct *userp;
    
    	userp = head;
    	while (userp != NULL)
    	{
    		for (int i = 0; i < userp->bookcount; i++)
    		{
    			if (strcmp(userp->booklist[i], userbookname) == 0)
    			{
    				strcpy(userp->booklist[i], bookname);
    			}
    		}
    		userp = userp->next;
    	}
    	writefile(0);
    }
    
    void deleteuserbook(char *bookname)
    {
    	struct userstruct *userp;
    	int flag = -1;
    
    	userp = head;
    	while (userp != NULL)
    	{
    		flag = -1;
    		for (int i = 0; i < userp->bookcount; i++)
    		{
    			if (strcmp(userp->booklist[i], bookname) == 0)
    			{
    				flag = i;
    				break;
    			}
    		}
    		if (flag != -1)
    		{
    			for (int i = flag; i < userp->bookcount - 1; i++)
    			{
    				strcpy(userp->booklist[i], userp->booklist[i + 1]);
    			}
    			userp->bookcount--;
    		}
    		userp = userp->next;
    	}
    	writefile(0);
    }

    展开全文
  • 图书馆管理系统由读者管理、图书管理、借阅、归还、续借、系统查询、排行榜、系统设置等管理模块组成,其规划功能模块如下: q 读者管理 读者管理主要实现读者类型管理、读者档案管理等功能。 q 图书管理 图书管理...
  • javaWeb图书馆管理系统源码mysql版本

    千次下载 热门讨论 2014-03-31 11:01:25
    图书馆管理系统主要的目的是实现图书馆的信息化管理。图书馆的主要业务就是新书的借阅和归还,因此系统最核心的功能便是实现图书的借阅和归还。此外,还需要提供图书的信息查询、读者图书借阅情况的查询等功能。项目...
  • Java图书馆管理系统

    千次阅读 多人点赞 2019-10-23 14:47:22
    思路:所有包都在book_manage包里 利用面向对象的多态特性去除了很多if-else的...另外一个类是BookList,这个类是用来管理每一个书,通过这个类来寻找每一本书。 private Book[] books = new Book[100]; Book数组里...

    思路:所有包都在book_manage包里
    利用面向对象的多态特性去除了很多if-else的判断,不同的子类在父类所对应的方法不同。

    1.首先建立一个book包
    包里面有2个类,一个是Book,这个类里面包含一本书的全部信息
    另外一个类是BookList,这个类是用来管理每一个书,通过这个类来寻找每一本书。
    private Book[] books = new Book[100];
    Book数组里面存放所有的书。

    2.再建立一个包Operation 这个类里面有一个OI接口,通过对接口里面的Work方法重写,来实现管理员身份和普通用户身份的不同操作。

    3.最后建立一个User包,里面有三个类,User,Admin,NormalUser
    Admin和NormalUser都继承自User.
    User里秒你有一个数组
    protected IO[] operation;
    这个数组里面包含了用户或者管理员所具备的操作。
    通过对数组的索引来确定具体需要调用的操作方法。

    下面来看看代码吧:
    book包
    Book类

    package book_manager.book;
    
    public class Book {
        private String name;
        private String id;
        private String author;
        private int price;
        private String type;
        private boolean isBorrow;
    
        public Book(String name, String id, String author, int price,
                    String type, boolean isBorrow) {
            this.name = name;
            this.id = id;
            this.author = author;
            this.price = price;
            this.type = type;
            this.isBorrow = isBorrow;
        }
    
        @Override     //Object中内置的类,用来格式化打印book的信息
        public String toString() {
            return "Book{" +
                    "name='" + name + '\'' +
                    ", id='" + id + '\'' +
                    ", author='" + author + '\'' +
                    ", price=" + price +
                    ", type='" + type + '\'' +
                    ", isBorrow=" + isBorrow +
                    '}';
        }
    
        public String getName(){
            return name;
        }
    
        public boolean isBorrow(){
            return isBorrow;
        }
    
        public void setBorrow(boolean bool){
            this.isBorrow=bool;
        }
    
        public String getId(){
            return id;
        }
    }
    
    

    BookList类

    package book_manager.book;
    
    import java.util.Arrays;
    
    public class BookList {
            private Book[] books = new Book[100];
            private int size;
         public BookList(){
            books[0] = new Book("金瓶梅",
                    "001", "兰陵笑笑生", 100,
                    "古典名著", false);
            books[1] = new Book("水浒传",
                    "002", "施耐庵", 100,
                    "古典名著", false);
            books[2] = new Book("西游记",
                    "003", "吴承恩", 100,
                    "古典名著", false);
            size = 3;
        }
    
        public int getSize(){
             return size;
        }
    
        public void setBooks(int index,Book book){
             books[index]=book;
        }
    
        public void setSize(int size){
                this.size=size;
        }
    
        public  Book getBook(int index){
             return books[index];
        }
    }
    
    

    Operation包:
    ADD类

    package book_manager.Operation;
    
    import book_manager.book.*;
    
    import java.util.Scanner;
    
    public class ADD implements IO{
    
        @Override
        public void work(BookList bookList) {
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入书名");
            String name =scanner.next();
            System.out.println("请输入序号");
            String id = scanner.next();
            System.out.println("请输入作者");
            String author =scanner.next();
            System.out.println("请输入价格");
            int price = scanner.nextInt();
            System.out.println("请输入类型");
            String type = scanner.next();
            Book book = new Book(name, id,
                    author, price, type, false);
            bookList.setBooks(bookList.getSize(),book);
            bookList.setSize(bookList.getSize()+1);
            System.out.println("添加成功");
        }
    }
    
    

    Borrow类

    package book_manager.Operation;
    
    import book_manager.book.Book;
    import book_manager.book.BookList;
    
    import java.util.Scanner;
    
    public class Borrow implements IO{
        @Override
        public void work(BookList bookList) {
            int i=0;
            int flag=0;
            Scanner scan = new Scanner(System.in);
    
            System.out.println("请输入需要借阅的书名");
            String name = scan.next();
            for(;i<bookList.getSize();i++){
                if(name.equals(bookList.getBook(i).getName())){
                    if(bookList.getBook(i).isBorrow()==false){
                        System.out.println("借阅成功");
                        flag=1;
                        bookList.getBook(i).setBorrow(true);
                    }
    
                    }
                }
            if(flag==0){
                System.out.println("不好意思,借阅失败");
            }
    
        }
    }
    
    

    Delete类

    package book_manager.Operation;
    
    import book_manager.book.BookList;
    
    import java.util.Scanner;
    
    public class Delete implements IO{
    
        public void work(BookList bookList){
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入想要删除的编号");
            String id  = scanner.next();
            for(int i=0;i<bookList.getSize();i++){
                if(bookList.getBook(i).getId().equals(id)){
                    bookList.setBooks(i,bookList.getBook(bookList.getSize()));
                    bookList.setSize(bookList.getSize()-1);
                    System.out.println("删除成功");
                }
                else{
                    System.out.println("删除失败");
                }
            }
        }
    }
    
    

    Exit类

    package book_manager.Operation;
    
    import book_manager.book.BookList;
    
    public class Exit implements IO{
        @Override
        public void work(BookList bookList) {
            System.out.println("退出成功");
            System.exit(0);
        }
    }
    
    

    Find类

    package book_manager.Operation;
    
    import book_manager.book.BookList;
    
    import java.util.Scanner;
    
    public class Find implements IO{
        @Override
        public void work(BookList bookList) {
            int i=0;
            int count=0;
            Scanner scan = new Scanner(System.in);
    
            System.out.println("请输入需要查找的书名");
            String name = scan.next();
            for(;i<bookList.getSize();i++){
                if(name.equals(bookList.getBook(i).getName())){
                    count++;
                }
            }
            if(count==0){
                System.out.println("不好意思,没有找到");
            }
            else{
                System.out.println("找到了,共计"+count+"本");
            }
        }
    }
    
    

    IO接口

    package book_manager.Operation;
    
    import book_manager.book.BookList;
    
    public interface IO {
        abstract public void work(BookList bookList);
    }
    
    

    PrintAll类

    package book_manager.Operation;
    
    import book_manager.book.BookList;
    
    public class PrintAll implements IO{
        @Override
        public void work(BookList bookList) {
            for(int i=0;i<bookList.getSize();i++){
                System.out.println(bookList.getBook(i));
            }
        }
    
    }
    
    

    Return类

    package book_manager.Operation;
    
    import book_manager.book.BookList;
    
    import java.util.Scanner;
    
    public class Return implements IO{
        @Override
        public void work(BookList bookList) {
            int i=0;
            int flag=0;
            Scanner scan = new Scanner(System.in);
    
            System.out.println("请输入需要归还的ID");
            String id = scan.next();
            for(;i<bookList.getSize();i++){
                if(id.equals(bookList.getBook(i).getId())){
                    if(bookList.getBook(i).isBorrow()==true){
                        System.out.println("归还成功");
                        bookList.getBook(i).setBorrow(false);
                        flag=1;
                    }
                    else{
                        System.out.println("归还失败");
                    }
                }
    
            }
            if(flag==0){
                System.out.println("不好意思,没有此书");
            }
    
        }
    }
    
    

    user包:
    User类

    package book_manager.user;
    
    import book_manager.Operation.*;
    import book_manager.Operation.IO;
    import book_manager.book.BookList;
    
    abstract public class User {
        String name;
        protected IO[] operation;
    
        public User(String name){
            this.name=name;
        }
    
        abstract public int menu();//该方法被重写
        public void doOperation(int choice, BookList bookList) {
            operation[choice].work(bookList);
        }
    }
    
    

    Admin类

    package book_manager.user;
    
    import book_manager.Operation.*;
    
    import java.util.Scanner;
    
    public class Admin extends User{
        public Admin(String name){
            super(name);
            operation=new IO[]{
                    new Exit(),
                    new Find(),
                    new ADD(),
                    new Delete(),
                    new PrintAll(),
            };
    
        }
    
    
    
        public int menu() {
            System.out.println("============");
            System.out.println("hello " + 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

    package book_manager.user;
    
    import book_manager.Operation.*;
    
    import java.util.Scanner;
    
    public class NormalUser extends User{
        public NormalUser(String name){
            super(name);
            operation=new IO[]{
                    new Exit(),
                    new Find(),
                    new Borrow(),
                    new Return(),
                    new PrintAll()
            };
        }
        public int menu() {
            System.out.println("============");
            System.out.println("hello " + 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();
            // close 本质上是在关闭 System.in
            // 由于后面还需要用到 System.in, 此处不能盲目关闭.
            // scanner.close();
            return choice;
        }
    
    }
    
    

    最后还有一个Test类,里面放了main函数

    package book_manager;
    
    import book_manager.book.BookList;
    import book_manager.user.Admin;
    import book_manager.user.NormalUser;
    import book_manager.user.User;
    
    import java.util.Scanner;
    
    public class Test {
        public static void main(String[] args) {
            BookList list = new BookList();
            User user = login();
            //通过不同的choice和身份调用不同的Operation方法
                while(true){
                int choice = user.menu();
                user.doOperation(choice, list);
            }
        }
    
        public static User login(){
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入你的姓名");
            String name = scanner.next();
            System.out.println("请输入你的身份");
            System.out.println("1.普通用户 2.管理员");
            int role= scanner.nextInt();
            if(role==1){
                return new NormalUser(name);
            }
            else{
                return new Admin(name);
            }
    
        }
    }
    
    
    展开全文
  • 图书馆管理系统功能

    2012-07-18 19:07:06
    3、实现图书馆管理系统的登录 4、实现图书馆信息管理 5、更改口令及利用用户自定义控件技术简化代码 6、利用母板页技术及JSOOP思想实现书架信息管理(1) 7、利用母板页技术及JSOOP思想实现书架信息管理(2) 8、系统...
  • 图书馆管理系统》是适用于企业、单位、学校等各个行业管理图书的一款软件,该软件主要图书的入库、借阅、归还等业务,以及相应的数据查询功能;软件界面设计简洁、美观其人性化的管理可以使用户用轻易上手,提高...
  • 图书馆管理系统

    千次阅读 2018-12-17 01:00:52
    图书馆管理系统 项目需求 通过Java SE,在线下环境开发设计一个图书馆管理系统,在这个系统中可以实现图书馆图书信息管理及图书馆工作人员管理等功能。 项目 Github 地址 https://github.com/AlbumenJ/library ...

    图书馆管理系统

    项目需求

    通过Java SE,在线下环境开发设计一个图书馆管理系统,在这个系统中可以实现图书馆中图书信息管理及图书馆工作人员管理等功能。

    项目 Github 地址

    https://github.com/AlbumenJ/library

    MySQL表结构

    book_category   ---------- 书籍种类
    book_detail        ---------- 具体书籍
    user_detail          ---------- 用户详情
    user_security       ---------- 用户安全信息(包括密码等)
    library                  ---------- 图书馆
    log                       ---------- 日志

    项目分包

    cn.albumen.library.annotation
    cn.albumen.library.bean
    cn.albumen.library.config
    cn.albumen.library.constant
    cn.albumen.library.controller
    cn.albumen.library.dao
    cn.albumen.library.dto
    cn.albumen.library.security
    cn.albumen.library.service
    cn.albumen.library.util

    API文档

    eoLinker

    环境配置

    1. 修改 cn.albumen.library.constant.SecurityConfig 中 PEM_KEY_PATH 所指向的地址到当前项目路径下Key目录
    2. 运行 ./sql/library.sql 导入数据库

    RequestWrapper

    原因

    1. HttpServletRequest的getInputStream使用后不能像其他Stream一样回到头部以后交给下一级还可以正常使用
    2. 本项目中使用了JSON替代了传统的表单提交,而我们在验证用户登录时需要获取一次Body中的loginUserId作为验证

    解决方案

    重写 Servlet 默认的 HttpServletRequestWrapper 使 InputStream 可重复使用

    JWT

    在 /Key/pem 中存放了RSA私钥,通过RSAKeyUtil读取私钥并生成公钥供JWT使用。

    cn.albumen.library.util.RsaKeyUtil
    BufferedReader br = new BufferedReader(new FileReader(PEM_KEY_PATH));
    Security.addProvider(new BouncyCastleProvider());
    KeyPair kp = (KeyPair) new PEMReader(br).readObject();
    this.privateKey = (RSAPrivateKey) kp.getPrivate();
    this.publicKey = (RSAPublicKey) kp.getPublic();
    

    由于私钥转换使用了较长时间为了以及提高密钥的复用性,REAKeyUtil使用了工厂模式,仅在第一次运行时进行私钥的转换,第二次开始则从内存中直接读取数据。

    cn.albumen.library.util.JwtUtil
    private static RSAPublicKey publicKey = RsaKeyUtil.getInstance().getPublicKey();
    private static RSAPrivateKey privateKey = RsaKeyUtil.getInstance().getPrivateKey();
    

    JwtUtil使用 com.auth0.jwt 对JWT的支持,直接生成token。
    注:此处签发token的有效期由 cn.albumen.library.constant.SecurityConfig 中的EXP_TIME决定,单位为毫秒。

    token = JWT.create()
                .withIssuer("Albumen")
                .withSubject(userName)
                .withExpiresAt(new Date(System.currentTimeMillis() + SecurityConfig.EXP_TIME))
                .withArrayClaim("Permission", permission)
                .sign(algorithmRS);
    

    验证token的核心代码

    JWTVerifier verifier = 
                JWT.require(algorithmRS)
                   .withIssuer("Albumen")
                   .withSubject(userName)
                   .build();
    DecodedJWT jwt = verifier.verify(token);
    

    SpringSecurity + JWT

    配置时会出现的问题

    1. 全局进行认证会导致永远不能认证成功,登录时陷入认证的死循环,抛出NPE
    2. 采用JSON提交登录页与默认表单提交不兼容,无法获取到用户名和密码
    3. 登陆页面加入白名单后SpringSecurity就不再拦截了
    4. 登陆成功以后默认返回成功信息不是原生支持JWT
    5. 不采用默认认证方式,RBAC获取不到之前登陆时候的角色
    6. 自定义认证时从Body中直接获取loginUserId会导致后续Controller无法获取到Body的内容

    解决方案

    1. 将登陆api加入到permit列表中
    2. 重写默认用户认证拦截器(UsernamePasswordAuthenticationFilter)
      http.addFilterAt(customUsernamePasswordAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
      
    3. 在重写的认证拦截器中加入对登录页的拦截
      filter.setFilterProcessesUrl("/usersecurity/login");
      
    4. 重写身份验证组件(AuthenticationProvider)
      auth.authenticationProvider(customAuthenticationProvider);
      
    5. 重写Token验证组件(BasicAuthenticationFilter),在成功验证后读取JWT中的角色并返回到 UsernamePasswordAuthenticationToken 中
      http.addFilter(new CustomAuthenticationFilter(authenticationManager(), redisUtil))
      
      ...
      
      //验证成功
       ArrayList<GrantedAuthority> authorities = new ArrayList<>();
       for (String permission : ret) {
           authorities.add(new GrantedAuthorityImpl(permission));
       }
       UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(id, null, authorities);
       SecurityContextHolder.getContext().setAuthentication(authentication);
      
    6. 通过前文重写的 RequestWrapper 解决

    Token的保存

    虽然通过JWT的加密,从客户端返回的Token一定是正确的,但为了管理用户的在线状态,我还是把Token存入 Redis 借助 Redis 的 TTL 来验证用户状态。做到在服务端就可以使用户下线。

    展开全文
  • 数据库课程设计实验报告--图书馆管理系统

    万次阅读 多人点赞 2018-03-08 14:03:13
    一、系统平台 开发工具:Eclipse java Mars 数据库 MySQL server,Navicat可视化工具 操作系统:win10 ... 提取码:4y44 ... 图书信息管理系统数据库用以收集、存储书籍信息、人员(读者、图书管理员...
  • 图书馆管理系统UML各种图

    万次阅读 多人点赞 2017-12-13 11:29:12
    1用例图主要用来描述“用户、需求、系统功能单元”之间的关系。它展示了一个外部用户能够观察到的系统功能模型图。  【用途】:帮助开发团队以一种可视化的方式理解系统的功能...如下是图书管理系统中管理员用例图:
  • 图书管理系统(Java MySQL)

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

    万次阅读 多人点赞 2016-10-16 16:01:52
    项目参考自:http://www.java1234.com/a/yuanchuang/swing2/ 项目视频及代码下载地址:http://pan.baidu.com/s/1gdtVQtt 项目开发环境的搭建:...(2),图书类别管理 (3),图书管理 (4),退出二,工具(1)
  • 图书,作为文献的聚集地和展示平台,常常扮演着引领文化前进的角色,是每个大学不可或缺的基础设施,而图书管理系统则是一个图书能够正常运转的关键。本次课程设计使用C语言制作程序来实现图书的登记,删除,...
  • C语言图书管理系统设计报告

    万次阅读 多人点赞 2017-06-20 17:37:54
    源代码:https://blog.csdn.net/k_young1997/article/details/73480766 XXXX大学 C语言课程设计报告 ...题 目 图书管理系统设计 专业班级 XXXX级计算机科学与技术本科X班 组 别 计科第...
  • 基于Java和MySQL的图书管理系统

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

    万次阅读 多人点赞 2016-05-02 10:11:02
    目前为止跟着学校进度学习C语言大概半年左右,基础学习只学到了指针,学得非常浅。...ok,废话不多说了,下面是我第二节课的作品————C语言的图书管理系统。一个简单的小程序。并非纯原创,是基于网络搜索到的...
  • 详细介绍了图书管理系统的实现,包括:环境搭建、系统业务、技术实现、项目运行、功能演示、系统扩展等,以通俗易懂的方式,手把手的带你从零开始运行本套图书管理系统,该项目附带全部源码可作为毕设使用。...
  • java实战——图书管理系统

    万次阅读 多人点赞 2018-09-07 22:04:44
    因为这个写的比较完整,所以简单说明一下过程中使用的EJB和RMI两个东西。 EJB实现原理:就是把原来放到客户端实现的代码放到服务器端,并依靠RMI进行通信。 RMI实现原理:就是通过Java对象可序列化机制实现分布...
  • 图书管理系统UML课程设计

    万次阅读 多人点赞 2018-11-12 17:37:50
    这是本人在学习UML建模语言时的课程设计,个人感觉学的还不错,我采用了用例建模、对象建模、交互建模去分析该图书管理系统。下面是我的文档。文档较长,大概将近90页。 关注下面的微信公众号,将会有更多的学习...
  • 基于JavaWeb开发的图书管理系统

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

    千次下载 热门讨论 2010-05-12 07:41:44
    php图书馆管理系统(包含程序和说明文档) 通过计算机对图书进行管理,不仅为图书馆的管理注入了新的生机,而且在运营过程节省了大量的人力、物力、财力和时间,提高图书馆的效率,还为图书馆在读者群中树立了一个...
  • 图书管理系统C++程序源代码

    万次阅读 多人点赞 2019-06-18 20:20:25
    图书管理系统 大一期末C++实验综合程序,水平有限,写得有点烂… 实验要求 程序源代码 代码有点长…写了1000多行,,,将就地看一下叭。。。 #include <iostream> #include <fstream>//文件输入输出 #...
  • 图书馆管理系统-MFC写的-非常详细-完善

    千次下载 热门讨论 2011-04-28 19:43:55
    图书管理系统实现了以下功能:  实现图书的入库与入库退货管理。  实现图书的库存盘点管理。  实现图书的定价、调价管理。  实现图书的销售、销售退货管理。  实现图书的入库查询、入库退货查询、图书...
  • C语言课程设计-图书管理系统

    万次阅读 多人点赞 2018-03-27 22:05:41
    实训项目名称:图书管理系统的设计与实现 1.实训目的 开发一个小型的图书管理应用软件,使用该软件可以实现图书信息的登记、浏览、借书、还书、删除和更新等操作。通过该系统的实现可以了解C++连接数据库的原理和...
  • ASP.NET图书管理系统简单实现步骤

    万次阅读 多人点赞 2019-01-05 01:37:14
    一、数据库添加 ![用户信息表](https://img-blog.csdnimg.cn/20190105001446419.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0MDMyNDEx,...
  • 大一java图书馆管理系统课程设计

    万次阅读 多人点赞 2017-09-18 16:24:15
    大一java图书馆管理系统课程设计代码仅供参考!!!仅供参考!!!效果图如下管理员用户名:123456 密码123456下载地址:http://download.csdn.net/download/qq_36326947/9995208...
  • 图书管理系统

    万次阅读 多人点赞 2018-05-29 09:43:25
    应同学请求帮忙写个简易版的图书管理系统,毕竟是个大一菜鸟,写出来还是蛮有趣的。需求是书店图书信息管理系统一、软件开发目的 该软件主要是使用C语言设计开发一个简单的书店图书管理系统,实现对图书信息的输入...
  • Java Web项目 图书管理系统

    万次阅读 多人点赞 2018-01-21 23:36:28
    版权声明:本文为博主原创文章,未经博主允许不得转载 2019.5.22更新 看到很多人看这个项目我也没想到,不过我现在不在CSDN写文章了, 博客地址链接 ←这是我的博客地址链接 GitHub地址链接←这是我的github...
  • 图书管理系统是一款功能非常强大的中小学图书管理软件,V5.0在继承了以往系统版本优点的基础上做了进一步优化;在功能上包含图书管理的常用功能(如图书管理、读者管理、借、还、数据备份、数据的导入导出和统计...
  • 图书馆管理系统设计说明书

    万次阅读 2014-11-06 12:59:28
    图书馆信息管理系统 软件设计说明书 文档编号:QY2014007-LY7 文档信息:图书馆信息管理系统软件设计说明书 文档类别:管理文档 密 级:机密 版本信息:1.0 建立日期:2014-05-20   创 建 人: 审 核...

空空如也

1 2 3 4 5 ... 20
收藏数 81,608
精华内容 32,643
关键字:

图书馆管理系统