1系统需求分析
1.1功能需求分析
本课题根据图书信息管理综合分析,便出于方便管理考虑,将图书信息管理系统的功能总结起来,共需要实现以下几个方面功能:
1.1.1管理图书信息
管理所有图书的基本信息,对图书信息的操作包括添加、修改、删除等;可以根据各种条件查询出需要的信息,比如修改,可以通过图书书本号查询出该书的基本信息,然后通过对需要修改项进行修改并保存修改后的结果存入数据库的图书表中。
1.1.2图书管理员信息
管理员所有的基本信息,包括对书本信息的添加、修改、删除等操作;可以根据各种条件查询出需要的信息,并对相应的信息进行操作。比如修改和删除,可以通过管理员的工号查询出管理员的相应信息,对相应的信息进行修改、删除操作。
1.1.3注册模块
首先用户需先注册,然后将注册的信息存储在数据库中,完成注册功能模块,后可以访问本系统.
1.1.4登录模块
用户根据数据库中注册的信息进行登录,首先输入的信息会和数据库中的信息进行匹配,若用户名密码相同,则登录成功,否则登录失败,需重新输入信息.
1.1.5模块总结
通过以上功能的设计与实现,并实现图书信息管理系统的基本功能。当然在实际的图书信息管理系统中,其功能要比本课题的多的多,也复杂的多,本课题仅以比较简单易懂的方式介绍给读者—一个图书管理系统的设计与实现的流程。从而让读者明白一个项目开发中需要做的工作,并在今后的工作中能遇到相关问题能知道如何解决。
1.2用到的技术
该系统的开发运用了JAVA语言,后端技术主要运用了JAVA中的JSP技术,Servlet技术,JDBC技术,以及tomcat服务器,前端技术主要运用了HTML,CSS,JavaScript技术,以及运用了当下最火的前端框架BOOTSTARP3框架,完成了整个系统的开发.
2 图书信息管理系统设计
2.1数据模型分析与设计
数据库模型描述了在数据库中结构化和操纵数据的方法,模型的结构部分规定了数据如何被描述(例如树、表等);模型的操纵部分规定了数据的添加、删除、显示、维护、打印、查找、选择、排序和更新等操作。数据库模型的分类:分层模型、关系模型、网络模型和对象模型。
本课题选择的关系模型,关系模型是目前最重要的一种数据模型。关系数据库系统采用关系模型作为数据的组织方式。关系数据模型具有下列优点:
◆关系模型与非关系模型不同,它是建立在严格的数学概念的基础上的。
◆关系模型的概念单一。无论实体还是实体之间的联系都用关系表示。对数据的检索结构也是关系(即表)。所以其数据结构简单、清晰,拥护易懂易用。
◆关系模型的存取路径对用户透明,从而具有更高的数据独立性、更好的安全保密性,也简化了程序员的工作和数据库开发建立的工作。
所以,关系数据模型诞生以后发展迅速,深受拥护的喜爱,这也是本课题选取关系数据模型的原因。
当然,关系数据模型也有缺点,其中最主要的缺点是,由于存取路径对用户透明,查询效率往往不如非关系数据模型。因此为了提高性能,必须对用户的查询请求进行优化,增加了开发数据库管理系统的难度。
本课题的关系数据模型的数据结构可分为一个表来表示:图书信息表
图书信息表用于记录书本的基本信息,如表 3-1;图书信息表用于记录书本的基本信息,图3.1图书信息E-R图;如下图。
表2-1图书信息表
图2.1图书信息E-R图
2.2结构设计与结构功能图
2.2.1 结构设计
根据对系统进行需求分析,本系统将分为4个模块:
◆书本管理
管理书本基本信息,包括每本书信息的添加、修改、删除以及整套书信息的添加。
◆图书管理员
图书管理员的基本信息,包括管理员的添加、修改和删除。
◆登录
管理用户信息,包括用户的登录存储,以及从数据库中获取内容来进行匹配登录.
◆注册
将用户的注册信息存储到数据库中
2.2.2功能结构图
3系统实现
该系统由6个模块构成,包括图书管理系统主界面模块、图书信息管理模块、管理员信息管理模块、登录注册管理模块、信息查询模块和数据操作模块。下面分别加以叙述:
3.4图书管理系统主界面模块
图书管理系统主界面模块运用shouye.jsp文件来实现。Shouye.jsp文件是图书管理系统的主页面,其中包含了各个功能模块的URL,以及主页面运用的各个前端样式,从而生成了图书管理系统的界面,如图4.1所示。shouye.jsp页面将所有功能集中到竖向导航栏中,并通过调用其他模块来实现图书管理系统的各个功能。
图3.1图书管理系统主界面
3.2图书信息管理模块
图书信息管理模块主要由HotRoutes_Info 、 Login 、MainJframe 、Registered、UpdateStudentServlet.java ,Registration_Management共计6个文件组成,如图4.2所示。
图3.2图书信息管理模块功能结构图
图书信息管理模块的6个文件组成了主界面中的“图书信息管理”菜单的内容,其中包括增加、修改、删除等功能,如图4.3所示。
图3.3图书信息管理模块的运行界面
3.3图书管理员模块
图书管理员模块主要由RegistrationInfo_Change 、TouristGroup 、HotRoutes_Info、
这3个文件组成,如图3.4所示。
图3.4图书管理管理员模块功能结构图
课程信息管理模块中的5个类文件组成了主界面中“教师信息管理”菜单的内容,其中包括增加、修改和删除功能,如图3.5所示。
图3.5图书管理员模块运行界面
3.4登录管理模块
登录管理模块主要由Login这个文件组成,如图3.6所示。
图3.6登录管理模块功能结构图
登录管理模块中的2个文件组成了主界面中的“登录”菜单的内容,其中包括登录注册功能,如图3.7所示。
图3.7 登录模块的运行界面
3.5注册模块
注册管理模块主要由Login这1个文件组成,如图3.8所示。
注册模块主要包括管理员注册和返回登录功能。注册的运行主截面如图4.9所示。
package com.orange.View;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JTextField;import com.orange.Controller.Select;import com.orange.Controller.Updata;import com.orange.Utils.ValidateUtils;import javax.swing.JButton;import java.awt.event.ActionListener;import java.util.regex.Matcher;import java.util.regex.Pattern;import java.awt.event.ActionEvent;import java.awt.Color;import java.awt.Font;import java.awt.Image;import java.awt.Toolkit;import javax.swing.JComboBox;import javax.swing.DefaultComboBoxModel;import javax.swing.ImageIcon;//添加图书界面public class Registration_Info extends JFrame {private static final long serialVersionUID = 1L;private JTextField nameField;private JTextField ageField;private JTextField IDcardField;private JTextField addressField;private JTextField phoneField;private JTextField touristNumberField;private JTextField accompanyField;private JTextField foodsField;Select select = new Select();Updata updata = new Updata();String name,sex,age,IDcard,address,phone,touristNumber,accompany,foods;public Registration_Info() {super("填写图书信息");this.setBounds(0, 0, 800, 600);this.setLocationRelativeTo(null);//让窗口在屏幕中间显示this.setResizable(false);//让窗口大小不可改变getContentPane().setLayout(null);//设置窗口图标Toolkit tk = Toolkit.getDefaultToolkit();Image frameImage=tk.createImage("img/logo.png"); this.setIconImage(frameImage);//图片添加JLabel jl = new JLabel();jl.setIcon(new ImageIcon("img/brand.png"));//文件路径jl.setBounds(453, 10, 800, 300);this.add(jl);//书名JLabel nameLabel= new JLabel("书 名:");nameLabel.setFont(new Font("微软雅黑", Font.BOLD, 15));nameLabel.setBounds(130, 39, 72, 18);getContentPane().add(nameLabel);nameField = new JTextField();nameField.setBounds(191, 36, 240, 28);getContentPane().add(nameField);nameField.setColumns(10);//编码JLabel ageLabel= new JLabel("编 码:");ageLabel.setFont(new Font("微软雅黑", Font.BOLD, 15));ageLabel.setBounds(130, 138, 72, 18);getContentPane().add(ageLabel);ageField = new JTextField();ageField.setBounds(191, 135, 240, 28);getContentPane().add(ageField);ageField.setColumns(10);//图书代码JLabel IDcardLabel= new JLabel("图书代码:");IDcardLabel.setFont(new Font("微软雅黑", Font.BOLD, 15));IDcardLabel.setBounds(98, 188, 117, 18);getContentPane().add(IDcardLabel);IDcardField = new JTextField();IDcardField.setBounds(191, 185, 240, 28);getContentPane().add(IDcardField);IDcardField.setColumns(10);//作者信息JLabel addressLabel= new JLabel("作者信息:");addressLabel.setFont(new Font("微软雅黑", Font.BOLD, 15));addressLabel.setBounds(113, 234, 100, 18);getContentPane().add(addressLabel);addressField = new JTextField();addressField.setBounds(191, 231, 240, 28);getContentPane().add(addressField);addressField.setColumns(10);//出版方JLabel phoneLabel= new JLabel("出版方:");phoneLabel.setFont(new Font("微软雅黑", Font.BOLD, 15));phoneLabel.setBounds(113, 280, 100, 18);getContentPane().add(phoneLabel);phoneField = new JTextField();phoneField.setBounds(191, 277, 240, 28);getContentPane().add(phoneField);phoneField.setColumns(10);//立即报名JButton submitButton = new JButton("立即添加");submitButton.setFont(new Font("微软雅黑", Font.PLAIN, 18));submitButton.setBounds(320, 495, 150, 33);submitButton.setFocusPainted(false);//去掉按钮周围的焦点框submitButton.setBackground(new Color(78, 110, 242));submitButton.setForeground(Color.WHITE);getContentPane().add(submitButton);submitButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//判断输入的信息是否为空,是否完整if (name.equals("")||sex.equals("")||age.equals("")||IDcard.equals("")||address.equals("")||phone.equals("")||touristNumber.equals("")||accompany.equals("")||foods.equals("")) {JOptionPane.showMessageDialog(null, "请输入完整信息!");} else {//判断身份证号码if (!ValidateUtils.IDcard(IDcard)) {JOptionPane.showMessageDialog(null, "身份证号码错误!请检查!");} else {String i = select.getString("SELECT user_id FROM `user` WHERE user_state='已登录'");String sql = "INSERT INTO `tourist` VALUES (null, '"+i+"', '"+name+"', '"+sex+"', '"+age+"', '"+IDcard+"', '"+address+"', '"+phone+"', '"+touristNumber+"', '"+accompany+"', '"+foods+"');";int result = updata.addData(sql);//判断手机号是否符合格式String regex = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(17[013678])|(18[0,5-9]))\\d{8}$";if(phone.length() != 11){JOptionPane.showMessageDialog(null, "手机号应为11位数!");}else{Pattern p = Pattern.compile(regex);Matcher m = p.matcher(phone);boolean isMatch = m.matches();if(!isMatch){JOptionPane.showMessageDialog(null, "您的手机号" + phone + "是错误格式!!!");}else {//判断插入结果if (result>0) {JOptionPane.showMessageDialog(null, "报名成功!");dispose();//关闭窗口} else {JOptionPane.showMessageDialog(null, "报名失败,请与管理员联系!");}}}}}}});}}
package com.orange.View;import java.awt.Color;import java.awt.Font;import java.awt.Image;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPasswordField;import javax.swing.JTextField;import com.orange.Controller.Updata;//注册界面public class Registered extends JFrame {private static final long serialVersionUID = 1L;Updata updata = new Updata();private JTextField userField;//账号private JPasswordField passwordField;//密码private JPasswordField passwordAgainField;//确认密码public Registered() {super.setTitle("西亚斯图书管理系统");this.setBounds(0, 0, 700, 450);//设置大小this.setLocationRelativeTo(null);//让窗口在屏幕中间显示this.setResizable(false);//让窗口大小不可改变getContentPane().setLayout(null);//设置窗口图标Toolkit tk = Toolkit.getDefaultToolkit();Image frameImage=tk.createImage("img/logo.png"); this.setIconImage(frameImage);//logo添加JLabel jl_logo = new JLabel();jl_logo.setIcon(new ImageIcon("img/logo2.png"));//文件路径jl_logo.setBounds(280, 15, 200, 50);this.add(jl_logo);//文本信息显示JLabel font = new JLabel();font.setFont(new Font("微软雅黑", Font.PLAIN, 25));font.setText("欢迎来到西亚斯,请注册使用!");font.setBounds(140, 58, 600, 50);add(font);//账户名JLabel usernameLabel = new JLabel("账 号 名:");usernameLabel.setFont(new Font("微软雅黑", Font.BOLD, 15));usernameLabel.setBounds(165, 138, 72, 18);getContentPane().add(usernameLabel);userField = new JTextField();userField.setBounds(248, 130, 255, 34);getContentPane().add(userField);userField.setColumns(10);//密码JLabel passwordLabel = new JLabel("输入密码:");passwordLabel.setFont(new Font("微软雅黑", Font.BOLD, 15));passwordLabel.setBounds(165, 208, 83, 18);getContentPane().add(passwordLabel);passwordField = new JPasswordField();passwordField.setBounds(248, 267, 255, 34);getContentPane().add(passwordField);passwordField.setColumns(10);JLabel passwordAgainLabel = new JLabel("确认密码:");passwordAgainLabel.setFont(new Font("微软雅黑", Font.BOLD, 15));passwordAgainLabel.setBounds(165, 275, 92, 18);getContentPane().add(passwordAgainLabel);passwordAgainField = new JPasswordField();passwordAgainField.setBounds(248, 200, 255, 34);getContentPane().add(passwordAgainField);passwordAgainField.setColumns(10);//确认注册按钮JButton button = new JButton("确定注册");button.setFont(new Font("微软雅黑", Font.BOLD, 15));button.setBounds(250, 330, 250, 34);button.setFocusPainted(false);//去掉按钮周围的焦点框button.setBackground(new Color(78, 110, 242));button.setForeground(Color.WHITE);getContentPane().add(button);button.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent arg0) {String username = userField.getText();@SuppressWarnings("deprecation")String password = passwordField.getText();@SuppressWarnings("deprecation")String passwordAgain = passwordAgainField.getText();//确认输入的信息是否为空if (username.equals("")&&password.equals("")&&passwordAgain.equals("")) {JOptionPane.showMessageDialog(null, "请完整输入信息!");}else {//判断两次密码是否一致if (password.equals(passwordAgain)) {String sql = "INSERT INTO `user` VALUES (null, '" + username + "', '"+password + "', '游客', '未登录');";int reselt = updata.addData(sql);if (reselt>0) {JOptionPane.showMessageDialog(null, "注册成功,即将跳转到登录页面!");//打开登录界面Login l = new Login();l.setVisible(true);dispose();}else {JOptionPane.showMessageDialog(null, "注册失败,请联系管理员!");}}else {JOptionPane.showMessageDialog(null, "两次输入的密码不一致,请重新输入!");}}}});}}
package com.orange.View;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JScrollPane;import javax.swing.JTable;import javax.swing.ScrollPaneConstants;import javax.swing.Timer;import javax.swing.table.DefaultTableCellRenderer;import javax.swing.table.DefaultTableModel;import javax.swing.table.TableColumn;import javax.swing.table.TableColumnModel;import com.orange.Controller.Select;import com.orange.Controller.Updata;import javax.swing.ImageIcon;import javax.swing.JButton;import java.awt.event.ActionListener;import java.sql.Date;import java.text.SimpleDateFormat;import java.awt.Color;import java.awt.Dimension;import java.awt.Font;import java.awt.Image;import java.awt.Toolkit;import java.awt.event.ActionEvent;//主界面public class MainJframe extends JFrame {private static final long serialVersionUID = 1L;Select select = new Select();Updata updata = new Updata();Object[] header = {"图书编号","图书名称","图书名称","图书代码","图书简介"};//表头Object[][] data = select.getLineInfo();public MainJframe() {this.setTitle("西亚斯图书管理系统");this.setBounds(0, 0, 1130, 700);this.setLocationRelativeTo(null);//让窗口在屏幕中间显示this.setResizable(false);//让窗口大小不可改变getContentPane().setLayout(null);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//用户单击窗口的关闭按钮时程序执行的操作//设置窗口图标Toolkit tk = Toolkit.getDefaultToolkit();Image frameImage=tk.createImage("img/logo.png"); this.setIconImage(frameImage);//logo添加JLabel jl_logo = new JLabel();jl_logo.setIcon(new ImageIcon("img/logo2.png"));//文件路径jl_logo.setBounds(950, 6, 200, 50);this.add(jl_logo);//热门图书推荐ImageIcon icon1 = new ImageIcon("img/Icon1.png");JButton searchButton = new JButton("热门图书推荐",icon1);searchButton.setBounds(20, 11, 145, 35);searchButton.setFocusPainted(false);//去掉按钮周围的焦点框searchButton.setContentAreaFilled(false);//设置按钮透明背景searchButton.setFont(new Font("微软雅黑", Font.BOLD, 14));//searchButton.setBackground(new Color(255, 153, 41));searchButton.setForeground(Color.black);getContentPane().add(searchButton);searchButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent arg0) {//显示热门图书界面HotRoutes_Info hr = new HotRoutes_Info();hr.setVisible(true);//dispose();关闭旧窗口}});//添加图书ImageIcon icon2 = new ImageIcon("img/Icon2.png");JButton signButton = new JButton("添加图书",icon2);signButton.setBounds(173, 11, 120, 35);signButton.setFocusPainted(false);//去掉按钮周围的焦点框signButton.setContentAreaFilled(false);//设置按钮透明背景signButton.setFont(new Font("微软雅黑", Font.BOLD, 14));//signButton.setBackground(new Color(255, 153, 41));signButton.setForeground(Color.black);getContentPane().add(signButton);signButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent arg0) {//判断当前是否有用户登录String sql = "SELECT COUNT(*) FROM `user` WHERE user_state='已登录'";int reselt = select.getCount(sql);if (reselt>0) {//打开报名界面Registration_Info r = new Registration_Info();r.setVisible(true);} else {JOptionPane.showMessageDialog(null, "请先登录!");//打开登录界面Login l = new Login();l.setVisible(true);//dispose();}}});//图书管理按钮ImageIcon icon3 = new ImageIcon("img/Icon3.png");JButton orderButton = new JButton("图书管理",icon3);orderButton.setBounds(300, 11, 125, 35);orderButton.setFocusPainted(false);//去掉按钮周围的焦点框orderButton.setContentAreaFilled(false);//设置按钮透明背景orderButton.setFont(new Font("微软雅黑", Font.BOLD, 14));//yhdl.setBackground(new Color(255, 153, 41));orderButton.setForeground(Color.black);getContentPane().add(orderButton);orderButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent arg0) {//判断当前是否有用户登录String sql = "SELECT COUNT(*) FROM `user` WHERE user_state='已登录'";int reselt = select.getCount(sql);if (reselt>0) {//判断当前登录的用户身份String user_type = select.getString("SELECT user_type FROM `user` WHERE user_state='已登录'");if (user_type.equals("管理员")) {//打开订单管理界面Registration_Management r = new Registration_Management();r.setVisible(true);dispose();}else{JOptionPane.showMessageDialog(null, "当前用户无权限!请登录管理员账号!");}} else {JOptionPane.showMessageDialog(null, "请先登录!");//打开登录界面Login l = new Login();l.setVisible(true);//dispose();//关闭旧窗口}}});//用户切换按钮ImageIcon icon4 = new ImageIcon("img/Icon4.png");JButton switchButton = new JButton("用户切换",icon4);switchButton.setBounds(433, 11, 120, 35);switchButton.setFocusPainted(false);//去掉按钮周围的焦点框switchButton.setContentAreaFilled(false);//设置按钮透明背景switchButton.setFont(new Font("微软雅黑", Font.BOLD, 14));//switchButton.setBackground(new Color(255, 153, 41));switchButton.setForeground(Color.black);getContentPane().add(switchButton);switchButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent arg0) {//判断当前是否有用户登录String sql = "SELECT COUNT(*) FROM `user` WHERE user_state='已登录'";int reselt = select.getCount(sql);if (reselt>0) {String i = select.getString("SELECT user_account FROM `user` WHERE user_state='已登录'");int a = JOptionPane.showConfirmDialog(null,"当前已有用户" + " ”"+ i +"” " + "登录!是否注销?","注销提示",0,1);if(a == JOptionPane.OK_OPTION){JOptionPane.showMessageDialog(null, "已注销前账户!");updata.addData("UPDATE user SET user_state='未登录' WHERE user_account='"+ i +"';");//打开登录界面Login l = new Login();l.setVisible(true);dispose();//关闭旧窗口}}else {//打开登录界面Login l = new Login();l.setVisible(true);dispose();//关闭旧窗口}}});//添加用户按钮ImageIcon icon5 = new ImageIcon("img/Icon5.png");JButton appendButton = new JButton("添加用户",icon5);appendButton.setBounds(560, 11, 120, 35);appendButton.setFocusPainted(false);//去掉按钮周围的焦点框appendButton.setContentAreaFilled(false);//设置按钮透明背景appendButton.setFont(new Font("微软雅黑", Font.BOLD, 14));//appendButton.setBackground(new Color(255, 153, 41));appendButton.setForeground(Color.black);getContentPane().add(appendButton);appendButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent arg0) {//判断当前是否有用户登录String sql = "SELECT COUNT(*) FROM `user` WHERE user_state='已登录'";int reselt = select.getCount(sql);if (reselt>0) {String i = select.getString("SELECT user_account FROM `user` WHERE user_state='已登录'");//JOptionPane.showMessageDialog(null, "当前已有用户"+" ”"+i+"” "+"登录!是否注销?");int a = JOptionPane.showConfirmDialog(null,"当前已有用户" + " ”" + i + "” " + "登录!是否注销?","注销提示",0,1);if(a == JOptionPane.OK_OPTION){JOptionPane.showMessageDialog(null, "已注销前账户!");updata.addData("UPDATE user SET user_state='未登录' WHERE user_account='" + i + "';");//打开注册界面Registered r = new Registered();r.setVisible(true);//dispose();//打开新窗口的时候关闭旧窗口}}else {//打开注册界面Registered r = new Registered();r.setVisible(true);//dispose();}}});//退出系统按钮ImageIcon icon6 = new ImageIcon("img/Icon6.png");JButton exitButton = new JButton("退出系统",icon6);exitButton.setBounds(687, 11, 120, 35);exitButton.setFocusPainted(false);//去掉按钮周围的焦点框exitButton.setContentAreaFilled(false);//设置按钮透明背景exitButton.setFont(new Font("微软雅黑", Font.BOLD, 14));//exitButton.setBackground(new Color(255, 153, 41));exitButton.setForeground(Color.black);getContentPane().add(exitButton);exitButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent arg0) {int result = JOptionPane.showConfirmDialog(null,"您现在要关闭系统吗" />