《Java应用开发》课件-第13章 基于Java Swing的图书管理系统_第1页
《Java应用开发》课件-第13章 基于Java Swing的图书管理系统_第2页
《Java应用开发》课件-第13章 基于Java Swing的图书管理系统_第3页
《Java应用开发》课件-第13章 基于Java Swing的图书管理系统_第4页
《Java应用开发》课件-第13章 基于Java Swing的图书管理系统_第5页
已阅读5页,还剩158页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第13章基于JavaSwing的图书管理系统·项目概述·数据库设计·项目环境搭建·实体类设计·工具类设计·模块实现13.1.1需求分析在当今社会,随着信息技术的不断发展,信息管理系统已经进入到了人类社会的各个领域,人们对于信息技术的掌握也越来越迅速。在图书管理的过程中也引入图书管理体系,图书管理系统将大大节省人力、物力、时间、金钱等资源,不仅方便了工作人员的管理,也增加了读者查找、借阅图书的便利。13.1.1需求分析在图书管理系统项目中主要讲解如何开发基于JavaSwing的图书管理系统。该项目应满足以下需求。●统一友好的操作界面,具有良好的用户体验。●用户信息的注册、验证、登录功能。●用户通过图书名称模糊搜索相关图书。13.1.1需求分析●用户借书功能。●用户还书功能。●设计后台管理,用于管理系统的各项基本数据,包括类别管理、书籍管理、用户管理。●系统运行安全稳定且响应及时。13.1.2功能结构图书管理系统项目分为用户界面和管理员界面两个部分,用户界面的功能结构具体如下图。13.1.2功能结构管理员界面的功能结构具体如下图。13.1.3项目预览首先进入图书管理系统的用户界面,用户界面主要功能包括借书、还书以及图书查询功能如右图。13.1.3项目预览在上图中,选择借阅信息区域中的一条数据,单击【还书】按钮,即可归还图书。在右图中,选择书籍信息区域中的一条数据,单击【借书】按钮,即可借阅图书。13.1.3项目预览在右图中,用户还可以按书籍名称或者按作者查询图书。例如,按书籍名称查询图书,在文本框中输入书籍名称,单击【查询】按钮,即可获取书籍信息。13.1.3项目预览13.2.1E-R图设计在设计数据库之前,首先需要明确在图书管理系统项目中都有哪些实体对象。根据实体对象间的关系设计数据库。接下来介绍一种能描述实体对象关系的模型——E-R图。E-R图也称实体-联系图(EntityRelationshipDiagram),它能直够直观地表示实体类型和属性之间的关联关系。13.2.1E-R图设计下面根据图书管理系统项目的需求,为本项目的核心实体对象设计E-R图,具体如下:(1)用户实体(user)的E-R图。13.2.1E-R图设计(2)图书实体(book)的E-R图。13.2.1E-R图设计(3)图书类别实体(book_type)的E-R图。13.2.1E-R图设计(4)图书借阅详情实体(borrowdetail)的E-R图。13.2.2数据表结构了解实体类的E-R图结构后,接下来根据13.2.1小节中的E-R图设计数据表。在教材中,只提供数据表的表结构,读者可根据表结构自行编写SQL语句创建表,也可以执行配套的项目源码中的SQL语句创建表。13.2.2数据表结构根据上一小节中的E-R图结构,项目中需要创建4个表,具体如下。(1)用户表—useruser表用于保存图书管理系统用户以及管理员的信息。user表结构如下表。字段名类型是否为空是否为主键说明idint(11)否是用户表主键usernamevarchar(255)否否用户名passwordvarchar(255)否否用户密码roleint(255)否否用户分类sexvarchar(1)否否用户性别phonechar(11)否否用户电话13.2.2数据表结构(2)书籍表—bookbook表用于保存图书管理系统的图书信息。book表结构如下表。字段名类型是否为空是否为主键描述idint(11)否是图书表主键book_namevarchar(255)否否图书名称type_idint(11)否否图书类别authorvarchar(255)否否作者publishvarchar(255)否否出版社pricedouble(10)否否图书价格numberint(11)否否图书数量statusint(11)否否借阅状态remarkvarchar(255)否否图书描述13.2.2数据表结构(3)图书类别表—book_typebook_type表用于保存图书管理系统的图书类别信息。book_type表结构如下表。字段名类型是否为空是否为主键描述idint(11)否是图书类别表主键type_namevarchar(255)否否类别名称remarkvarchar(255)否否类别描述13.2.2数据表结构(4)图书借阅详情表—borrowdetailborrowetail表用于保存图书管理系统图书的借阅详情信息。borrowdetail表结构如下表。字段名类型是否为空是否为主键描述idint(11)否是订单表主键user_idint(11)否否用户idbook_idint(11)否否图书idstatusint(11)否否借阅状态borrow_timebigint(20)否否借阅时间return_timebigint(20)否否归还时间13.3项目环境搭建在开发功能模块之前,应该先进行项目环境及项目框架的搭建等工作,接下来分步骤讲解,在正式开发系统前应做的准备工作,具体如下。(1)确定项目开发环境●操作系统:Windows10版本。●Java开发包:JDK8。●数据库:MySQL5.7。●开发工具:IntelliJIDEA2019.3。●浏览器:谷歌浏览器。13.3项目环境搭建(2)创建数据库表在MySQL数据库中创建一个名称为bookmanager的数据库,并根据表结构在bookmanager数据库中创建相应的表。(3)创建项目,引入JAR包在IntelliJIDEA中创建一个名称为myBookManager的Java工程,将项目所需JAR包导入到项目的WEB-INF/lib文件夹下。本项目使用jdbc连接数据库,因此需要MySQL驱动的JAR包。13.3项目环境搭建本项目所需JAR包具体如下图。13.3项目环境搭建(4)创建包在工程的src文件夹下创建包,命名为cn.itcast.bookmanager,然后在cn.itcast.bookmanager包下创建4个子包,分别命名为dao、JFrame、model、utils,src目录结构如右图。13.3项目环境搭建上图中各个包下的文件归类具体如下。●dao包下的java文件为与数据库进行交互的类。●JFrame包下的java文件为UI界面。●model包下的java文件为实体类。●utils包中的类为项目中所用到的工具类。13.4实体类设计13.2节讲解了项目实体对象的划分和数据表的设计,针对每一个实体对象都要设计一个类。下面分别介绍项目实体类的设计。(1)用户实体类在model包下新建User类,用于描述用户实体。在User类中声明属性userId、userName、password、role、sex、phone,并编写属性对应的getter和setter方法。13.4实体类设计User类具体实现如下。1publicclassUser{2privateIntegeruserId;3privateStringuserName;4privateStringpassword;5privateIntegerrole;//角色1普通2管理员6privateStringsex;7privateStringphone;8publicStringgetSex(){9returnsex;10}11publicvoidsetSex(Stringsex){12this.sex=sex;13}14publicStringgetPhone(){15returnphone;16}17publicvoidsetPhone(Stringphone){18this.phone=phone;19}20publicIntegergetUserId(){21returnuserId;22}23publicvoidsetUserId(IntegeruserId){24this.userId=userId;25}13.4实体类设计26publicStringgetUserName(){27returnuserName;28}29publicvoidsetUserName(StringuserName){30this.userName=userName;31}32publicStringgetPassword(){33returnpassword;34}

35publicvoidsetPassword(Stringpassword){36this.password=password;37}38publicIntegergetRole(){39returnrole;40}41publicvoidsetRole(Integerrole){42this.role=role;43}44}13.4实体类设计(2)图书实体类在model包下新建Book类,用于描述图书实体。在Book类中声明属性bookId、bookName、author、status、bookTypeId、publish、number、price、remark,并编写属性对应的getter和setter方法。13.4实体类设计Book类具体实现如下。1publicclassBook{2privateIntegerbookId;3privateStringbookName;4privateStringauthor;5privateIntegerstatus;//状态1上架2下架6privateIntegerbookTypeId;7privateStringpublish;8privateIntegernumber;//库存9privatedoubleprice;10privateStringremark;11publicIntegergetBookId(){12returnbookId;13}14publicvoidsetBookId(IntegerbookId){15this.bookId=bookId;16}17publicStringgetBookName(){18returnbookName;19}20publicvoidsetBookName(StringbookName){21this.bookName=bookName;22}23publicStringgetAuthor(){24returnauthor;25}13.4实体类设计26publicvoidsetAuthor(Stringauthor){27this.author=author;28}29publicStringgetRemark(){30returnremark;31}32publicvoidsetRemark(Stringremark){33this.remark=remark;34}35publicIntegergetStatus(){36returnstatus;37}38publicvoidsetStatus(Integerstatus){39this.status=status;40}41publicIntegergetBookTypeId(){42returnbookTypeId;43}44publicvoidsetBookTypeId(IntegerbookTypeId){45this.bookTypeId=bookTypeId;46}47publicStringgetPublish(){48returnpublish;49}50publicvoidsetPublish(Stringpublish){51this.publish=publish;52}53publicIntegergetNumber(){54returnnumber;55}13.4实体类设计56publicvoidsetNumber(Integernumber){57this.number=number;58}59publicdoublegetPrice(){60returnprice;61}62publicvoidsetPrice(doubleprice){63this.price=price;64}65}13.4实体类设计(3)图书类别实体类在model包下新建BookType类,用于描述图书类别实体。在BookType类中声明属性typeId、typeName、remark,并编写属性对应的getter和setter方法。13.4实体类设计BookType类具体实现如下。1publicclassBookType{2privateIntegertypeId;3privateStringtypeName;4privateStringremark;5publicIntegergetTypeId(){6returntypeId;7}8publicvoidsetTypeId(IntegertypeId){9this.typeId=typeId;10}11publicStringgetTypeName(){12returntypeName;13}14publicvoidsetTypeName(StringtypeName){15this.typeName=typeName;16}17publicStringgetRemark(){18returnremark;19}20publicvoidsetRemark(Stringremark){21this.remark=remark;22}23@Override24publicStringtoString(){25returnthis.typeName;26}27}13.4实体类设计(4)图书借阅详情实体类在model包下新建BorrowDetail类,用于描述图书借阅详情。在BorrowDetail类中声明属性borrowId、userId、bookId、status、borrowTime、returnTime,并编写属性对应的getter和setter方法。13.4实体类设计BorrowDetail类具体实现如下。1publicclassBorrowDetail{2privateIntegerborrowId;3privateIntegeruserId;4privateIntegerbookId;5privateIntegerstatus;//状态1在借2已还6privateLongborrowTime;7privateLongreturnTime;8publicIntegergetBorrowId(){9returnborrowId;10}11publicvoidsetBorrowId(IntegerborrowId){12this.borrowId=borrowId;13}14publicIntegergetUserId(){15returnuserId;16}17publicvoidsetUserId(IntegeruserId){18this.userId=userId;19}20publicIntegergetBookId(){21returnbookId;22}23publicvoidsetBookId(IntegerbookId){24this.bookId=bookId;25}

13.4实体类设计26publicIntegergetStatus(){27returnstatus;28}29publicvoidsetStatus(Integerstatus){30this.status=status;31}32publicLonggetBorrowTime(){33returnborrowTime;34}

35publicvoidsetBorrowTime(LongborrowTime){36this.borrowTime=borrowTime;37}38publicLonggetReturnTime(){39returnreturnTime;40}41publicvoidsetReturnTime(LongreturnTime){42this.returnTime=returnTime;43}44}13.5工具类设计(1)DbUitil类在utils包下新建DbUtil类,用于获取数据库连接,DbUtil类具体实现如下。1publicclassDbUtil{2privateStringdbDriver="com.mysql.jdbc.Driver";3privateStringdbUrl=4"jdbc:mysql://localhost:3306/bookmanager?characterEncoding=utf-8";5privateStringdbUserName="root";6privateStringdbPassword="root";7publicConnectiongetConnection()throwsException{8Class.forName(dbDriver);

13.5工具类设计9Connectioncon=(Connection)10DriverManager.getConnection(dbUrl,dbUserName,dbPassword);11returncon;12}13publicvoidcloseCon(Connectioncon)throwsException{14if(con!=null){15con.close();16}17}18}13.5工具类设计上述代码中,第2~6行代码是创建JDBC所需的四个连接参数;第7~12行代码用于获取数据库连接;第13~18行代码用于关闭JDBC连接对象资源。13.5工具类设计(2)toolUtil类在utils包下新建toolUtil类,在该类中定义一些方法,用于判断字符串是否为空、获取当前时间、对时间进行格式化以及获取当前登录用户等。13.5工具类设计toolUtil类具体实现如下。1publicclasstoolUtil{2publicstaticbooleanisEmpty(Stringstr){3if(str!=null&&!"".equals(str.trim())){4returnfalse;5}6returntrue;7}8publicstaticLonggetTime(){9 longtime=System.currentTimeMillis();10returntime;11}

13.5工具类设计12publicstaticStringgetDateByTime(Longtime){13SimpleDateFormatformat=newSimpleDateFormat("yyyy-MM-dd14HH:mm:ss");15Stringstring=format.format(newDate(time));16returnstring;17}18publicstaticUsergetUser(HttpSessionsession){19Useruser=(User)session.getAttribute("user");20returnuser;21}22publicstaticvoidsetUser(HttpSessionsession,Useruser){23session.setAttribute("user",user);24}25}13.5工具类设计上述代码中,第2~7行代码用于判断字符串是否为空;第8~11行代码用于获取当前时间;第12~17行代码用于对时间进行格式化;第18~21行代码用于获取当前登录用户;第22~24行代码用于设置用户登录。到此,项目的前期准备就已经完成了,下面将针对用户界面和管理员界面的不同功能模块进行讲解。由于项目代码量大,而教材篇幅有限,在讲解功能模块时,只展示关键性的代码,详细代码请参见项目配套的源代码。13.6.1实现用户注册功能首次进入图书管理系统的用户需要先注册账号,用户只有在注册账号并登录后才可以借阅图书。图书管理系统项目的用户注册页面预览如下图。13.6.1实现用户注册功能1.编写注册页面在JFrame包中新建RegFrm类,在RegFrm类中编写用户注册时需要填写的用户名、密码、手机号、性别等文本框及按钮组件。由于界面部分代码量较大,因此这里我们以密码为例进行讲解。13.6.1实现用户注册功能密码组件的构建代码如下所示:1privateJFramejf;2privateJTextFieldtextField_1;3privateJLabelpasswordMes;4JLabellabel_1=newJLabel("密码:");5label_1.setForeground(Color.BLACK);6label_1.setFont(newFont("幼圆",Font.BOLD,16));7label_1.setBounds(120,108,65,40);8jf.getContentPane().add(label_1);9textField_1=newJTextField();10textField_1.setFont(newFont("Dialog",Font.BOLD,14));11textField_1.setToolTipText("");12textField_1.setColumns(10);13textField_1.setBounds(198,114,164,30);14jf.getContentPane().add(textField_1);13.6.1实现用户注册功能上述代码中,第4行代码创建了一个名为密码的lable;第5~7行代码是对lable设置颜色、字体、坐标、宽高;第8行代码将lable添加到面板中;第9行代码创建了一个文本框;第10~13行代码分别设置文本框中内容的字体、文本框的内容默认为空、文本框的长度、坐标以及宽高;第14行代码将文本框添加到面板中。13.6.1实现用户注册功能2.编写密码文本框的监听器在界面中创建密码组件之后,需要编写一个监听器来监听密码文本框的动作。监听器的实现代码如下所示。1textField_1.addFocusListener(newFocusListener(){2@Override3publicvoidfocusLost(FocusEvente){4Stringpwd=textField_1.getText();5if(toolUtil.isEmpty(pwd)){6passwordMes.setText("密码不能为空");7passwordMes.setForeground(Color.RED);8}else{9booleanflag=10pwd.matches("^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,16}$");13.6.1实现用户注册功能11if(flag){12passwordMes.setText("√");13passwordMes.setForeground(Color.GREEN);14}else{15JOptionPane.showMessageDialog(null,"密码需为6-16位数字和字母16的组合");17passwordMes.setText("");18}19}20}21@Override22publicvoidfocusGained(FocusEvente){23}24});13.6.1实现用户注册功能上述代码中,为密码文本框对象textField_1添加了监听器,在focusLost()函数中编写了密码文本框失去鼠标焦点时,对文本框中内容的校验逻辑。其中,第5~7行代码是判断密码是否为空,当密码为空时提示“密码不能为空”。第10行代码使用正则表达式定义密码的格式必须为6-16位的字母和数字的组合,若输入的密码不符合此规范,进行提示。13.6.1实现用户注册功能3.编写注册按钮的监听器填写注册信息之后,单击【注册】按钮完成注册。在单击【注册】按钮后,注册按钮会对所填注册信息的正确性、完整性进行判断。【注册】按钮监听器实现代码如下所示。13.6.1实现用户注册功能1button=newJButton("注册");2button.addActionListener(newActionListener(){3publicvoidactionPerformed(ActionEvente){4Stringcode=textField_3.getText();5if(toolUtil.isEmpty(code)){6JOptionPane.showMessageDialog(null,"请输入验证码");7}else{8if(code.equalsIgnoreCase(vcode.getCode())){9RegCheck(e);10}else{11JOptionPane.showMessageDialog(null,"验证码错误,请重新输入12");13}14}15}16});13.6.1实现用户注册功能17protectedvoidRegCheck(ActionEvente){18Stringusername=textField.getText();19Stringpassword=textField_1.getText();20Stringphone=textField_2.getText();21Stringsex="";22if(rdbtnNewRadioButton.isSelected()){23sex=rdbtnNewRadioButton.getText();24}else{25sex=rdbtnNewRadioButton_1.getText();26}27if(toolUtil.isEmpty(username)||28toolUtil.isEmpty(password)||toolUtil.isEmpty(phone)){29JOptionPane.showMessageDialog(null,"请输入相关信息");30return;31}13.6.1实现用户注册功能32Useruser=newUser();33user.setUserName(username);34user.setPassword(password);35user.setSex(sex);36user.setPhone(phone);37user.setRole(1);38Connectioncon=null;39try{40con=dbUtil.getConnection();41inti=userDao.addUser(con,user);42if(i==2){43JOptionPane.showMessageDialog(null,"该用户名已存在,请重新注册");44}elseif(i==0){45JOptionPane.showMessageDialog(null,"注册失败");46}else{13.6.1实现用户注册功能47JOptionPane.showMessageDialog(null,"注册成功");48jf.dispose();49newLoginFrm();50}51}catch(Exceptione1){52e1.printStackTrace();53}finally{54try{55dbUtil.closeCon(con);56}catch(Exceptione1){57e1.printStackTrace();58}59}60}13.6.1实现用户注册功能上述代码中,第1行代码创建了一个注册按钮;第2~59行代码为【注册】按钮添加监听器,监听【注册】按钮的单击事件。当单击【注册】按钮时,监听器首先判断是否已经输入了验证码,若没有输入验证码,则提示“请输入验证码”;若已经输入验证码,则判断验证码的正确性,若验证码错误,则提示“验证码错误,请重新输入”;若验证码正确则判断用户名、密码、性别、手机号等信息是否填写完成,若填写完成,则从数据库中查询此用户名是否已经存在;若不存在,则提示“注册成功”,否则提示“该用户名已存在,请重新注册”。13.6.1实现用户注册功能4.编写dao层在dao包中新建UserDao类,在UserDao类中编写addUser()方法,用于完成注册操作。addUser()方法的实现代码如下所示。1publicintaddUser(Connectioncon,Useruser)throwsException{2//查询注册用户名是否存在3Stringsql="select*fromuserwhereuserName=?";4PreparedStatementpstmt=(PreparedStatement)5con.prepareStatement(sql);6pstmt.setString(1,user.getUserName());7ResultSetrs=pstmt.executeQuery();8if(rs.next()){9return2;10}13.6.1实现用户注册功能11sql="insertintouser(username,password,role,sex,phone)values12(?,?,?,?,?)";13PreparedStatementpstmt2=14(PreparedStatement)con.prepareStatement(sql);15pstmt2.setString(1,user.getUserName());16pstmt2.setString(2,user.getPassword());17pstmt2.setInt(3,user.getRole());18pstmt2.setString(4,user.getSex());19pstmt2.setString(5,user.getPhone());20returnpstmt2.executeUpdate();21}13.6.1实现用户注册功能上述代码中,第3~10行代码是从数据库中查询是否存在此用户名的用户,若存在返回2;第11~20行代码是当没有在数据库查询到该用户时,向数据库插入用户信息。13.6.2实现用户登录功能用户注册成功之后,便可以在图书管理系统登录界面进行登录操作。图书管理系统前台系统登录模块流程如下图。13.6.2实现用户登录功能图书管理系统的登录页面如右图。用户登录时需要输入用户名和密码,并选择登陆权限。接下来分步骤讲解用户登录功能的实现。13.6.2实现用户登录功能1.编写登录页面在JFrame包中新建loginFrm类,在loginFrm类中编写用户登录时需要填写的用户名、密码、权限等文本框及下拉框组件,代码如下所示。1publicclassLoginFrmextendsJFrame{2publicstaticUsercurrentUser;3privateJFramejf;4privateJTextFielduserNameText;5privateJTextFieldpasswordText;6privateJComboBox<String>comboBox;7publicLoginFrm(){8jf=newJFrame("图书管理");9jf.getContentPane().setFont(newFont("幼圆",Font.BOLD,14));10jf.setBounds(600,250,500,467);13.6.2实现用户登录功能11jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);12jf.getContentPane().setLayout(null);13JLabellblNewLabel=newJLabel(new14ImageIcon(LoginFrm.class.getResource("/tupian/bg2.png")));15lblNewLabel.setBounds(24,10,430,218);16jf.getContentPane().add(lblNewLabel);17JLabellabel=newJLabel("用户名:");18label.setFont(newFont("幼圆",Font.BOLD,14));19label.setBounds(129,250,60,29);20jf.getContentPane().add(label);21userNameText=newJTextField();22userNameText.setBounds(199,252,127,25);23jf.getContentPane().add(userNameText);24userNameText.setColumns(10);25JLabellabel_1=newJLabel("密码:");

13.6.2实现用户登录功能26label_1.setFont(newFont("幼圆",Font.BOLD,14));27label_1.setBounds(144,289,45,29);28jf.getContentPane().add(label_1);29passwordText=newJPasswordField();30passwordText.setColumns(10);31passwordText.setBounds(199,291,127,25);32jf.getContentPane().add(passwordText);33JLabellabel_2=newJLabel("权限:");34label_2.setFont(newFont("幼圆",Font.BOLD,14));35label_2.setBounds(144,328,45,29);36jf.getContentPane().add(label_2);37comboBox=newJComboBox();38comboBox.setBounds(199,332,127,25);39comboBox.addItem("用户");40comboBox.addItem("管理员");41jf.getContentPane().add(comboBox);42JButtonbutton=newJButton("登录");43button.setBounds(153,377,65,29);44jf.getContentPane().add(button);45}46}13.6.2实现用户登录功能上述代码中,第8~41行代码用于创建标题、用户名、密码、权限的文本框及下拉框组件,并分别为这些组件设置字体、坐标、宽高,最后将这些组件添加到面板中。第42~44行代码创建登录按钮并将登录按钮添加到面板中。13.6.2实现用户登录功能2.编写登录按钮的监听器用户在填写完登录信息后,单击【登录】按钮进行登录时,需要判断用户登录信息的正确性和完整性,这就要为【登录】按钮添加监听器。为【登录】按钮添加监听器的代码如下所示。13.6.2实现用户登录功能1button.addActionListener(newActionListener(){2publicvoidactionPerformed(ActionEvente){3checkLogin(e);4}5});6UserDaouserDao=newUserDao();7DbUtildbUtil=newDbUtil();8protectedvoidcheckLogin(ActionEvente){9StringuserName=userNameText.getText();10Stringpassword=passwordText.getText();11intindex=comboBox.getSelectedIndex();12if(toolUtil.isEmpty(userName)||toolUtil.isEmpty(password)){13JOptionPane.showMessageDialog(null,"用户名和密码不能为空");14return;15}13.6.2实现用户登录功能16Useruser=newUser();17user.setUserName(userName);18user.setPassword(password);19if(index==0){20user.setRole(1);21}else{22user.setRole(2);23}24Connectioncon=null;25try{26con=dbUtil.getConnection();27Userlogin=userDao.login(con,user);28currentUser=login;29if(login==null){30JOptionPane.showMessageDialog(null,"登录失败");31}else{32//权限1普通2管理员33if(index==0){34//学生35jf.dispose();36newUserMenuFrm();37}else{38//管理员39jf.dispose();40newAdminMenuFrm();41}42}

13.6.2实现用户登录功能43}catch(Exceptione21){44e21.printStackTrace();45JOptionPane.showMessageDialog(null,"登录异常");46}finally{47try{48dbUtil.closeCon(con);49}catch(Exceptione31){50e31.printStackTrace();51}52}13.6.2实现用户登录功能上述代码中,第1~5行代码为【登录】按钮添加了监听器。第8~15行代码判断用户名和密码是否为空;第19~23行代码判断当前登录用户的权限。第24~52行代码从数据库中查询是否有此用户。若有此用户,判断用户的权限;若没有,则提示“登录失败”。若登录时出现异常,则提示“登录异常”。13.6.2实现用户登录功能3.编写Dao层在UserDao类中添加login()方法,用于从数据库查询用户。login()方法的实现代码如下所示。1publicUserlogin(Connectioncon,Useruser)throwsException{2UserresultUser=null;3Stringsql="select*fromuserwhereusername=?andpassword=?4androle=?";5PreparedStatementpstmt=(PreparedStatement)6con.prepareStatement(sql);7pstmt.setString(1,user.getUserName());

13.6.2实现用户登录功能8pstmt.setString(2,user.getPassword());9pstmt.setInt(3,user.getRole());10ResultSetrs=pstmt.executeQuery();11if(rs.next()){12resultUser=newUser();13resultUser.setUserId(rs.getInt("id"));14resultUser.setUserName(rs.getString("username"));15resultUser.setSex(rs.getString("sex"));16resultUser.setPhone(rs.getString("phone"));17}18returnresultUser;19}13.7图书借还模块在图书管理系统中,图书借还模块是必不可少的,也是最重要的模块之一。本节将学习图书管理系统项目的图书借还模块的实现。在开发图书借还模块之前,首先带领大家熟悉该模块实现的功能以及整个功能模块的处理流程。下面通过图书借还模块功能结构图来展示图书借还模块实现的所有功能,具体如右图。13.7图书借还模块图书借还功能的流程如下图。13.7.1实现用户借书功能用户成功登录图书管理系统后,就可以借阅图书了。图书管理系统项目的用户借书页面预览如右图。登录用户选中某一条图书信息,或者通过图书名称/作者名称查询图书并选中后,单击【借书】按钮,完成图书借阅。13.7.1实现用户借书功能接下来分步骤讲解借书功能的实现。1.编写借书功能界面在JFrame包中新建UserMenuFrm类,在UserMenuFrm类中编写书籍信息列表相关组件、图书查询相关组件、借书相关组件。由于界面部分代码量较大,这里我们只对核心代码进行讲解,核心代码如下所示。13.7.1实现用户借书功能1panel_2=newJPanel();2panel_2.setBorder(newTitledBorder(null,3"\u4E66\u7C4D\u4FE1\u606F",TitledBorder.LEADING,TitledBorder.TOP,4 null,Color.RED));5panel_2.setBounds(23,374,651,346);6jf.getContentPane().add(panel_2);7panel_2.setLayout(null);8textField_1=newJTextField();9textField_1.setColumns(10);10textField_1.setBounds(252,23,135,27);11panel_2.add(textField_1);12button_1=newJButton("查询");13button_1.setFont(newFont("幼圆",Font.BOLD,16));14button_1.setBounds(408,20,93,33);13.7.1实现用户借书功能15panel_2.add(button_1);16comboBox=newJComboBox();17comboBox.setFont(newFont("幼圆",Font.BOLD,15));18comboBox.setBounds(123,26,109,24);19comboBox.addItem("书籍名称");20comboBox.addItem("书籍作者");21panel_2.add(comboBox);22String[]BookTitle={"编号","书名","类型","作者","描述"};23/*具体的各栏行记录先用空的二维数组占位*/24String[][]BookDates={};25/*然后实例化上面2个控件对象*/26BookModel=newDefaultTableModel(BookDates,BookTitle);27BookTable=newJTable(BookModel);28putDates(newBook());//获取数据库数据放置table中

13.7.1实现用户借书功能29panel_2.setLayout(null);30JScrollPanejscrollpane1=newJScrollPane();31jscrollpane1.setBounds(22,74,607,250);32jscrollpane1.setViewportView(BookTable);33panel_2.add(jscrollpane1);34jf.getContentPane().add(panel_1);35JPanelpanel_3=newJPanel();36panel_3.setBorder(newTitledBorder(null,"\u501F\u4E66",37TitledBorder.LEADING,TitledBorder.TOP,null,Color.RED));38panel_3.setBounds(23,730,645,87);39jf.getContentPane().add(panel_3);40panel_3.setLayout(null);41JLabellabel=newJLabel("编号:");42label.setFont(newFont("Dialog",Font.BOLD,15));13.7.1实现用户借书功能43label.setBounds(68,31,48,33);44panel_3.add(label);45textField_2=newJTextField();46textField_2.setEditable(false);47textField_2.setColumns(10);48textField_2.setBounds(126,34,135,27);49panel_3.add(textField_2);50JLabellabel_1=newJLabel("书名:");51label_1.setFont(newFont("Dialog",Font.BOLD,15));52label_1.setBounds(281,31,48,33);13.7.1实现用户借书功能53panel_3.add(label_1);54textField_3=newJTextField();55textField_3.setEditable(false);56textField_3.setColumns(10);57textField_3.setBounds(339,34,135,27);58panel_3.add(textField_3);59JButtonbutton_2=newJButton("借书");60 button_2.setFont(newFont("Dialog",Font.BOLD,16));61button_2.setBounds(495,31,80,33);62panel_3.add(button_2);13.7.1实现用户借书功能上述代码中,第1~21行代码用于创建图书查询的下拉框、文本框以及查询按钮,并为这些组件设置字体、坐标、宽高,最后将这些组件添加到面板中。第22~40行代码用于创建图书信息列表。其中,列表中的内容从数据库获取。第41~59行代码用于创建借书时用于显示所借图书的图书编号、图书名的文本框以及借书按钮,并将这些组件添加到到面板中。13.7.1实现用户借书功能2.编写借书按钮的监听器用户选中需要借阅的书籍后,单击【借书】按钮进行借书。这时需要判断该用户是否已经借阅这本书,如果已经借阅,则提示“该书已在借,请先还再借”,否则提示“借书成功”。这就要为【借书】按钮添加监听器。为【借书】按钮添加监听器代码如下所示。13.7.1实现用户借书功能1button_2.addActionListener(newActionListener(){2publicvoidactionPerformed(ActionEvente){3StringbookId=textField_2.getText();4StringbookName=textField_3.getText();5if(toolUtil.isEmpty(bookId)||6toolUtil.isEmpty(bookName)){7JOptionPane.showMessageDialog(null,"请选择相关书籍");8return;9}10BorrowDetailborrowDetail=newBorrowDetail();11borrowDetail.setUserId(LoginFrm.currentUser.getUserId());12borrowDetail.setBookId(Integer.parseInt(bookId));13borrowDetail.setStatus(1);14borrowDetail.setBorrowTime(toolUtil.getTime());15Connectioncon=null;13.7.1实现用户借书功能16try{17con=dbUtil.getConnection();18//先查询是否有该书19ResultSetlist=bdetailDao.list(con,borrowDetail);20while(list.next()){21 JOptionPane.showMessageDialog(null,"该书已在借,请先还再借");22return;23}24inti=bdetailDao.add(con,borrowDetail);25if(i==1){26JOptionPane.showMessageDialog(null,"借书成功");27putDates(newBorrowDetail());28}else{29JOptionPane.showMessageDialog(null,"借书失败");30}13.7.1实现用户借书功能31}catch(Exceptione1){32e1.printStackTrace();33JOptionPane.showMessageDialog(null,"借书异常");34}finally{35try{36dbUtil.closeCon(con);37}catch(Exceptione1){38e1.printStackTrace();39}40}41}42});43//从数据库获取书籍信息44privatevoidputDates(Bookbook){13.7.1实现用户借书功能45DefaultTableModelm

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论