package java1.book.util;
/_*
- 字符串工具类
_/
public class Stringutil {
/_*
- 判断是否为空
_/
public static boolean isEmpty(String str) {
if(str==null || “”.equals(str.trim())) {
return true;
}else {
return false;
}
}
/_*
- 判断是否不是空
_/
public static boolean isNoteEmpty(String str ) {
if(str!=null && !“”.equals(str.trim())) {
return true;
}else {
return false;
}
}
6.3窗体设计
6.3.1主窗体设计
管理员通过“系统登陆”模块的验证后,可以登陆到图书资料管理系统的主界面,系统主窗体包括基本数据维护(图书类别管理,图书信息管理,和安全退出模块),“关于我们”只是简单的进行了一个展示。调用了一个JTextPane容器 进行文本框书写,在后面不在过多介绍。下面对这一模块的具体实现进行描述。
图6.2图书资料管理系统主界面
//设置JFrame最大化
this.setExtendedState(JFrame.MAXIMIZED_BOTH);
其添加事件的方法,点开Design然后在相关的需要添加事件的地方进行右击鼠标,找到Add event handler 下的action,再进一层点开actionPerformed。点击之后即可进行实际的事件添加,编写相应的代码。
图6.3添加功能方法图
代码如下:
public void actionPerformed(ActionEvent e) {
booktypeInter jbooktypeInter=new booktypeInter();
jbooktypeInter.setVisible(true);
table.add(jbooktypeInter);
6.3.2登陆界面
对于整个系统来说,无论是管理员还是普通读者,都必须登陆后才可以进行各种各样的操作。因此登陆界面的设计是本系统的关键。用户登陆必须输入用户名和密码,系统检测数据库中是否有该用户的信息以及密码是否正确,若符合要求则登陆成功,否者登陆失败。
登陆界面的设计如下:登陆界面通过添加相应的属性即可完成,不过区别在于这个时候要和数据库连接,检查数据库中是否有相应的管理员所以建立工具类Userdao。代码如下所示:
package java1.book.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java1.book.model.User;
/_*
-
用户Dao类
-
@author 徐建国
_/
public class Userdao {
public User login(Connection con,User user)throws Exception{
User resultUser=null;
String sql=“select _from t_user where username=?and password=?”;
PreparedStatement pstmt=con.prepareStatement(sql);//结果集遍历
pstmt.setString(1, user.getUserName());
pstmt.setString(2, user.getPassword());
ResultSet rs=pstmt.executeQuery();
if(rs.next())
{
resultUser=new User();
resultUser.setId(rs.getInt(“id”));//获取id
resultUser.setUserName(rs.getString(“username”));//获取用户名
resultUser.setPassword(rs.getString(“password”));//获取密码
}
return resultUser;
}}
运行后界面如图所示:
图6.4图书资料管理系统登陆界面图
6.3.3图书信息添加界面
图书信息是本系统的基础。书籍管理包括书籍数据的添加和修改等功能,同时可以根据书籍的id号进行查询等功能。主要是对数据库中书籍表(t_book)的操作。本模块中的操作有“查询”“添加”“修改”“保存”“删除”。涉及对数据库的操作有查询、增加、删除、修改等。
1.若数据库中存在此书籍的信息,则将结果显示出来。
2.保存:当管理员新增或修改书籍信息后,需要将数据信息保存到数据库中,更新数据库的数据。操作完成后,可到数据库中查看信息是否保存成功。
3.删除:当书籍不存在时,管理员需要将数据库中书籍的信息删除,以防止数据的冗余。
对于修改操作的实现,本系统采用如下方法:当用户单击“修改”按钮后,系统将删除数据库中当前的书籍信息,等待用户填入新的信息后,必须单击保存按钮将新的信息保存到数据库中。对于添加操作同样要在填入新的信息后单击保存才可以。图书类别的添加主要包括图书类别名称和图书描述信息的添加。
(1)添加方法就是在添加按钮添加事件,进行调用。
图6.5图书类别的添加
/__
- 图书类别添加事件处理
_/
private void bookTypeAddActionPerformed(ActionEvent evt) {
String bookTypeName=this.bookTypeNametxt.getText();
String bookTypeDesc=this.bookTypeDesctxt.getText();
if(Stringutil.isEmpty(bookTypeName)) {
JOptionPane.showMessageDialog(null, “图书类别不能为空”);
return;
}
Booktype booktype=new Booktype(bookTypeName,bookTypeDesc);
Connection con=null;
try {
con=dbutil.GetCon();
int n=booktypedao.add(con, booktype);
if(n==1) {
JOptionPane.showMessageDialog(null, “图书类别添加成功”);
resetValue();
}else {
JOptionPane.showMessageDialog(null, “图书类别添加失败”);
}
}catch(Exception e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, “图书类别添加失败”);
}finally {
try {
dbutil.closeCon(con);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
添加成功之后还会进行表格的刷新。
图6.5图书类别添加
在此还设置了重置按钮可以防止数据的误操作之后进行数据的恢复。
/_*
- 重置表单
_/
private void resetValue() {
this.bookTypeNametxt.setText(“”);
this.bookTypeDesctxt.setText(“”);
}
(2)图书类别的修改主要是通过和数据库进行连接之后进行更新操作。
/_*
-
图书类别修改记录 事件处理
-
@param evt
*/
private void bookTypeUpdateActionEvent(ActionEvent evt) {
String id=idTxt.getText();
String bookTypeName=bookTypeNameTxt.getText();
String bookTypeDesc=bookTypeDescTxt.getText();
if(Stringutil.isEmpty(id)) {
JOptionPane.showMessageDialog(null, “请选择要修改的记录”);
return;
}
if(Stringutil.isEmpty(bookTypeName)) {
JOptionPane.showMessageDialog(null, “图书类别不能为空”);
return;
}
Booktype bookType=new Booktype(bookTypeName,bookTypeDesc );
Connection con =null;
try {
con=dbutil.GetCon();
int modifyNum=booktypedao.update( con, bookType);
if(modifyNum==1) {
JOptionPane.showMessageDialog(null, “修改成功”);
this.resetValue();
this.fillTable(new Booktype());
} else {
JOptionPane.showMessageDialog(null, “修改失败”);
}
}catch (Exception e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, “修改失败”);
}finally {
try {
dbutil.closeCon(con);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}} }
(3)图书类别的查询与修改
图书类比的查询与修改主要涉及到的就是表单操作以及对数据的查询,修改和及时更新数据,书籍信息查询或者说是书籍检索是任何人都可以进行的操作,它不要求用户的登陆。其功能已在书籍管理模块中涉及,不同之处在于此时只用于显示,用户不可对其修改。查询时的关键字可有“书籍作者”“出版社”“书籍名称”“书籍号”“书籍简介”。
图6.6图书类别的查询与修改
/**
* 图书类别修改记录 事件处理
_/
private void bookTypeUpdateActionEvent(ActionEvent evt) {
String id=idTxt.getText();
String bookTypeName=bookTypeNameTxt.getText();
String bookTypeDesc=bookTypeDescTxt.getText();
if(Stringutil.isEmpty(id)) {
JOptionPane.showMessageDialog(null, “请选择要修改的记录”);
return;}
if(Stringutil.isEmpty(bookTypeName)) {
JOptionPane.showMessageDialog(null, “图书类别不能为空”);
return;}
Booktype bookType=new Booktype(bookTypeName,bookTypeDesc );
Connection con =null;
try {
con=dbutil.GetCon();
int modifyNum=booktypedao.update( con, bookType);
if(modifyNum==1) {
JOptionPane.showMessageDialog(null, “修改成功”);
this.resetValue();
this.fillTable(new Booktype());
} else {
JOptionPane.showMessageDialog(null, “修改失败”);}
}catch (Exception e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, “修改失败”);
}finally {
try {
dbutil.closeCon(con);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}} }
(4)表格行点击事件主要是对上面的表格数据进行遍历按照相应的显示规则,在下面进行同步显示,此操作和后期的图书信息的添加与维护一致,后面不在描述
/_*
* 表格行点击事件处理
_/
private void bookTypeTableMousePressed(MouseEvent evt) {
int row=bookTypeTable.getSelectedRow();
idTxt.setText((String)bookTypeTable.getValueAt(row, 0));
bookTypeNameTxt.setText((String)bookTypeTable.getValueAt(row, 1));
bookTypeDescTxt.setText((String)bookTypeTable.getValueAt(row, 2)); }
/_*
* 图书类别搜索事件
*/
private void bookTypeSearchActionPerformed(ActionEvent evt) {
String s_bookTypeName=this.s_bookTypeNameTxt.getText();
Booktype booktype=new Booktype();
booktype.setBooktypename(s_bookTypeName);
this.fillTable(booktype); }
(5)图书信息添加
对于本系统来说,图书信息添加和重置是最重要的功能,涉及到数据库中的两张表,考虑到查询效率和方便程度,决定建立视图查询,要求输入,图书名称,图书作者,作者性别,图书价格,图书类别,图书价格等信息 ,因为代码和之前添加 事件代码区别不大 ,这里不在赘述而采用代码的复用。
图6.7图书信息添加与重置
(6)图书资料管理是重中之重,如何有效的对数据管理,才是关键,所以采用嵌套语句和字符串拼接等方式,与数据库进行有效的连接并且同步数据 。在此用到了表格行点击事件。
图6.8图书资料管理
7测试分析报告
在测试分析的基础上,进行测试后需要对测试的结果以及测试的数据等加以记录和分析总结,它是测试过程的一个重要的环节,同时,它也是对软件性能的一个总的分析和对认识不足的说明。为以后的软件开发程序提供了丰富的经验。
系统的设计工作完成后,必须经过严格的测试才可以进行实际的应用。作为一个数据库软件,应该结合数据库本身和软件进行联合测试,即可以在软件中进行一些操作,同时在数据库中查看相关数据。下面对系统的各模块进行测试。
1 登陆模块等测试
登陆模块的测试包括登陆成功,不成功以及退出等3种情况,还需要查看登陆成功即退出后的菜单是否正常等。程序运行后,选择“系统”|“登陆”命令,弹出登陆对话框,在上面输入用户名和密码后,单击“确定”按钮。如下所示:如果输入错误的用户名或密码,则显示登陆失败。登陆后选择“系统”|“退出”命令,可看到状态栏的改变,即完成退出命令。其他的图书类别的添加修改等都是相同操作。
图7.1登陆模块及相关测试
2 书籍信息模块测试
使用管理员权限登陆后,可以对书籍信息进行管理。选择“基本资料维护”|“图书资料维护”命令,弹出书籍资料维护对话框。如果单击“添加”按钮,输入新的信息后,单击“保存”按钮保存到数据库中。如下图所示:
图7.2书记信息模块测试
上面对系统的各个模块进行了简单的测试,图示资料系统基本模块的功能是正确的。
3.性能测试及未完成的模块
在本次图书资料管理系统中测试时出现过好多BUG,
1.Java.lang.NullPointerException
首先要理解的是此错误并不会在 程序中报错,只会在运行的时候报错。
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
Vue 面试题
1.Vue 双向绑定原理
2.描述下 vue 从初始化页面–修改数据–刷新页面 UI 的过程?
3.你是如何理解 Vue 的响应式系统的?
4.虚拟 DOM 实现原理
5.既然 Vue 通过数据劫持可以精准探测数据变化,为什么还需要虚拟 DOM 进行 diff 检测差异?
6.Vue 中 key 值的作用?
7.Vue 的生命周期
8.Vue 组件间通信有哪些方式?
9.watch、methods 和 computed 的区别?
10.vue 中怎么重置 data?
11.组件中写 name 选项有什么作用?
12.vue-router 有哪些钩子函数?
13.route 和 router 的区别是什么?
14.说一下 Vue 和 React 的认识,做一个简单的对比
15.Vue 的 nextTick 的原理是什么?
16.Vuex 有哪几种属性?
17.vue 首屏加载优化
18.Vue 3.0 有没有过了解?
19.vue-cli 替我们做了哪些工作?
34915)]
Vue 面试题
1.Vue 双向绑定原理
2.描述下 vue 从初始化页面–修改数据–刷新页面 UI 的过程?
3.你是如何理解 Vue 的响应式系统的?
4.虚拟 DOM 实现原理
5.既然 Vue 通过数据劫持可以精准探测数据变化,为什么还需要虚拟 DOM 进行 diff 检测差异?
6.Vue 中 key 值的作用?
7.Vue 的生命周期
8.Vue 组件间通信有哪些方式?
9.watch、methods 和 computed 的区别?
10.vue 中怎么重置 data?
11.组件中写 name 选项有什么作用?
12.vue-router 有哪些钩子函数?
13.route 和 router 的区别是什么?
14.说一下 Vue 和 React 的认识,做一个简单的对比
15.Vue 的 nextTick 的原理是什么?
16.Vuex 有哪几种属性?
17.vue 首屏加载优化
18.Vue 3.0 有没有过了解?
19.vue-cli 替我们做了哪些工作?
[外链图片转存中…(img-np8SKjWy-1711029634915)]