西安邮电大学
(计算机学院)
数据库课程设计报告
题 目: 英雄联盟账号信息管理系统
专业名称: 软件工程
班 级: 软件1202
学生姓名: 尚奕帆
学号(8位):
指导教师: 乔平安
起止时间:
一、 课程设计目的
由于最近游戏《英雄联盟》非常火爆,刚好这学期学习了数据库相关知识,对这款游戏的账号信息管理产生兴趣。所以这次课程设计选题是:英雄联盟账号信息管理系统。要求是能够完成课程设计的分析、设计和编码,写出课程设计报告,了解数据库的操作,数据结构的设计,以及java和数据库的链接操作,并能够通过这次课程设计实践掌握Java的语言规范,面向对象的核心概念和特性。
二、课程设计内容
本次数据库设计,设有五个表,分别是:玩家,召唤师,游戏,皮肤,购买记录。管理员通过登录系统,可以查看五个表的主要信息。还可以对五个表进行查询,添加,更改,删除的操作,从而对账户信息管理。
三、软硬件环境及系统所采用的体系结构
系统的体系结构为C/S结构,开发语言采用Java,数据库软件采用SQL Server 2000(必须升级到SP3),Java语言使用MyEclipse开发环境,系统支持采用Windows 系统。
四、需求分析
4.1 数据流图
说明:
1.管理员的操作包括:
(1)玩家信息基本管理
玩家的基本信息输入,查询,更改,删除
(2)召唤师信息基本管理
召唤师的基本信息输入,查询,更改,删除
(3)英雄信息基本管理
英雄的基本信息输入,查询,更改,删除
(4)皮肤信息基本管理
皮肤的基本信息输入,查询,更改,删除
(5)购买记录信息基本管理
购买记录的基本信息输入,查询,更改,删除
(6)统计报表
基本信息表,包括玩家基本信息(QQ,姓名),召唤师(角色名称,等级,段位,游戏胜率,创建时间,金币),购买记录(购买英雄)。
2、以上的用户请求经应用程序的转化,化为对数据库中的相应的表或视图的操作,数据库再把处理的结果(或都是错误信息)返回结应用程序。
3、应用程序把结果返回给用户,该结果可能为一个对表操作的结果(如插入,删除等),也可能为一个查询的结果,甚至可能为一个错误的信息。
4.2 数据字典
根据题目需求,账号管理系统主要对玩家,召唤师,英雄,皮肤,购买记录的管理,由此分析得到如下数据结构:
数据库表结构设计,数据项如下:表名分别为 玩家,召唤师,英雄,皮肤,购买记录
2.3安全性和完整性要求
安全性和完整性要求:
通过设置外键,建立它们之间的关系,并使它们级联更新相关的字段,级联删除相关的记录。对于构成了环的级联更新或删除,而不能建立级联更新或删除的,通过建立触发器,使得它们保持数据的完整性。
本系统的外键设置和级联操作有:外键:召唤师表的QQ,皮肤表的英雄名称。
购买记录表的角色名称和英雄名称等。在玩家表,召唤师表,英雄表,皮肤表建立触发器不能插入重复记录,从而实现数据库的完整性。
五、系统设计
1.系统结构图(功能模块图)
对系统进行分析,给出系统结构图;并对各个模块进行功能的描述。
(1)用以显示所有基本信息。
(2)对玩家表的操作:查询所有玩家与单个玩家的信息,添加一条玩家记录,对一条玩家记录信息进行修改并保存,删除一条玩家记录信息。
(3)对召唤师表的操作:查询所有召唤师与单个召唤师的信息,添加一条召唤师记录,对一条召唤师记录信息进行修改并保存,删除一条召唤师记录信息。
(4)对英雄表的操作:查询所有英雄与单个英雄的信息,添加一条英雄记录,对一条英雄记录信息进行修改并保存,删除一条英雄记录信息。
(5)对皮肤表的操作:查询所有皮肤与单个皮肤的信息,添加一条皮肤记录,对一条皮肤记录信息进行修改并保存,删除一条皮肤记录信息。
(6)对购买记录表的操作:查询所有购买记录与单条购买记录的信息,添加一条购买记录,对一条购买记录信息进行修改并保存,删除一条购买记录信息。
(7)返回操作:返回上一层界面。
(8)退出操作:退出系统。
2.数据库设计
要求画出E-R图,然后进行逻辑模式的设计,最后得到设计合理的表。
ER图:
逻辑模式:
玩家(QQ,姓名,年龄,性别,电话)
召唤师(角色名称,等级,段位,游戏胜率,金币,创建时间,QQ)
英雄(英雄名称,类别,位置)
皮肤(皮肤名称,级别,英雄名称)
购买记录(角色名称,英雄名称,购买时间)
表的设计:
六、系统的实施
系统的实现方法,应用程序的编制方法,重要代码的说明。
(可以给出流程图)
系统流程:
重要代码:
主界面:
publicclass Main {
JTextField tf_name;
JFrame jf;
JPasswordField tf_mi;
int i;
public Main(){
jf=new JFrame("英雄联盟登录系统");
jf.setSize(250,250);
jf.setLocation(600,250);
JPanel pan=new JPanel();
JLabel name=new JLabel("用户名");
JLabel mi=new JLabel("密码");
pan.add(name);
tf_name=new JTextField(20);
pan.add(tf_name);
pan.add(mi);
tf_mi=new JPasswordField(20);
pan.add(tf_mi);
final JButton jb=new JButton("登录");
pan.add(jb);
jf.add(pan);
jf.setResizable(false);
jf.setVisible(true);
i=1;
jb.addActionListener(new ActionListener(){
@SuppressWarnings("deprecation")
publicvoid actionPerformed(ActionEvent e) {
i++;
String name=tf_name.getText();
String mi=tf_mi.getText();
if(name.equals("sa")&&mi.equals("123")){
jf.setVisible(false);
new MainInterface();
}
else{
if(i<=3){
JOptionPane.showMessageDialog(jb,"用户名或密码错误请重新输入");//给jb组件增加对话框信息
}
else{
JOptionPane.showMessageDialog(jb,"三次输入错误退出程序!!!");
System.exit(0);
}
}
}
});
final JButton jb1=new JButton("退出");
pan.add(jb1);
jb1.addActionListener(new ActionListener() {
publicvoid actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(jb1,"谢谢使用!!!");
System.exit(0);
}
});
}
publicstaticvoid main(String[] args) {
new Main();
}
与Java语言数据库的连接:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String dbURL ="jdbc:odbc:driver={sql server};server=SHANGYIFAN-PC;database=YXLM";
Connection conn=DriverManager.getConnection(dbURL,"sa","123");
视图显示:
class All extends JFrame{
@SuppressWarnings("unchecked")
public All(){
JTable jt=new JTable();
String header[]={"QQ","姓名","角色名称","等级","段位","游戏胜率","创建时间","金币","购买英雄"};
DefaultTableModel md=new DefaultTableModel(header,0);
JScrollPane scorllPane=new JScrollPane(jt);
jt.setModel(md);
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String dbURL ="jdbc:odbc:driver={sql server};server=SHANGYIFAN-PC;database=YXLM";
Connection conn=DriverManager.getConnection(dbURL,"sa","123");
Statement stmt=conn.createStatement();
String sql="select * from 信息";
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()){
Vector v=new Vector();
v.addElement(rs.getString("QQ"));
v.addElement(rs.getString("姓名"));
v.addElement(rs.getString("角色名称"));
v.addElement(rs.getString("等级"));
v.addElement(rs.getString("段位"));
v.addElement(rs.getString("游戏胜率"));
v.addElement(rs.getString("创建时间"));
v.addElement(rs.getString("金币"));
v.addElement(rs.getString("购买英雄"));
md.addRow(v);
}
conn.close();
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
} catch (SQLException e1) {
e1.printStackTrace();
}
this.getContentPane().add(scorllPane,BorderLayout.CENTER);
this.setSize(800,600);
this.setTitle("基本信息");
this.setResizable(false);
this.setVisible(true);
this.setLocation(300,100);
}
}
查询:
jb.addActionListener(new ActionListener() {
publicvoid actionPerformed(ActionEvent e) {
String a=jt.getText();
Double x=new Double(a);
int qq=(int)x.doubleValue();
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String dbURL ="jdbc:odbc:driver={sql server};server=SHANGYIFAN-PC;database=YXLM";
Connection conn=DriverManager.getConnection(dbURL,"sa","123");
Statement stmt=conn.createStatement();
String sql="select * from 玩家 where QQ="+qq+"";
ResultSet rs=stmt.executeQuery(sql);
int i=0;
while(rs.next()){
i=1;
jl_1.setText("QQ:"+rs.getInt(1));
jl_2.setText("姓名:"+rs.getString(2));
jl_3.setText("年龄:"+rs.getInt(3)+"岁");
jl_4.setText("性别:"+rs.getString(4));
jl_5.setText("电话:"+rs.getString(5));
}
conn.close();
if(i==0) JOptionPane.showMessageDialog(jb,"查无此账号!!!");
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
});
添加新的纪录:
jb1.addActionListener(new ActionListener() {
publicvoid actionPerformed(ActionEvent e) {
String a=jt1.getText();
Double x=new Double(a);
int qq=(int)x.doubleValue();
String na=jt2.getText();
String b=jt3.getText();
Double y=new Double(b);
int age=(int)y.doubleValue();
String tel=jt5.getText();
if(arg[jt4.getSelectedIndex()].equals("请选择")) {
JOptionPane.showMessageDialog(jb1,"保存失败,请修改带星号数据。");
jl_x1.setText("**");
}
else{try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String dbURL ="jdbc:odbc:driver={sql server};server=SHANGYIFAN-PC;database=YXLM";
Connection conn=DriverManager.getConnection(dbURL,"sa","123");
Statement stmt=conn.createStatement();
String sql="insert into 玩家 values("+qq+",'"+na+"',"+age+",'"+arg[jt4.getSelectedIndex()]+"','"+tel+"')";
int i=stmt.executeUpdate(sql);
conn.close();
if(i>0){
JOptionPane.showMessageDialog(jb1,"保存成功,返回菜单");
jf.setVisible(false);
new JB1();
}
else {
JOptionPane.showMessageDialog(jb1,"保存失败,请修改带星号数据。");
jl_x.setText("**");
jl_x1.setText("");
}
} catch (Exception e1) {
JOptionPane.showMessageDialog(jb1,"保存失败!!!");
e1.printStackTrace();
}
}
}
});
记录的更新:
jb1.addActionListener(new ActionListener() {
publicvoid actionPerformed(ActionEvent e) {
String na=jt2.getText();
String nl=jt3.getText();
Double x=new Double(nl);
int age=(int)x.doubleValue();
String tel=jt5.getText();
String a=jt.getText();
Double y=new Double(a);
int qq=(int)y.doubleValue();
if(arg[jt4.getSelectedIndex()].equals("请选择")) {
JOptionPane.showMessageDialog(jb1,"更新失败,修改信息。");
}
else{try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String dbURL ="jdbc:odbc:driver={sql server};server=SHANGYIFAN-PC;database=YXLM";
Connection conn=DriverManager.getConnection(dbURL,"sa","123");
Statement stmt=conn.createStatement();
String sql="update 玩家 set 姓名='"+na+"',年龄="+age+",性别='"+arg[jt4.getSelectedIndex()]+"',电话='"+tel+"' where QQ="+qq;
int i=stmt.executeUpdate(sql);
conn.close();
if(i>0){
JOptionPane.showMessageDialog(jb1,"更新成功,返回菜单。");
jf.setVisible(false);
new JB1();
}
else JOptionPane.showMessageDialog(jb1,"更新失败,修改信息。");
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
}
});
记录的删除:
jb.addActionListener(new ActionListener() {
publicvoid actionPerformed(ActionEvent e) {
String QQ=jt.getText();
Double d=new Double(QQ);
int qq=(int)d.doubleValue();
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String dbURL ="jdbc:odbc:driver={sql server};server=SHANGYIFAN-PC;database=YXLM";
Connection conn=DriverManager.getConnection(dbURL,"sa","123");
Statement stmt=conn.createStatement();
String sql2="delete from 购买记录 where 角色名称 in(select 角色名称 from 召唤师 where QQ="+qq+")";
stmt .executeUpdate(sql2);
String sql="delete from 玩家 where QQ="+qq;
int i=stmt.executeUpdate(sql);
String sql1="delete from 召唤师 where QQ="+qq;
stmt.executeUpdate(sql1);
conn.close();
if(i>0){
JOptionPane.showMessageDialog(jb,"删除成功,返回菜单。");
jf.setVisible(false);
new JB1();
}
else{
JOptionPane.showMessageDialog(jb,"查无此账号,请修改信息。");
}
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
});
注:以上为玩家表的增删改查,其他表的增删改查与其核心相同。
退出按钮:
jb3.addActionListener(new ActionListener() {
publicvoid actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(jb3,"谢谢使用!!!");
System.exit(0);
}
});
七、系统评价及心得体会
1、对自己设计进行评价,指出合理和不足之处,提出改进的方案。
在这次课程设计中,完成了基本要求,对数据库设计有了一定的了解。这次的数据库结构设计,表与表之间有基本正确的联系,可以完成基本操作,如查询,增添,更改,删除。但仍不足之处,在界面上设计,应该更加方便使用者使用,更加人性化。还有在完成操作应该更加丰富,比如:统计,排序等。在对表操作上过于单一化,只是对一个表操作,设计增加视图,增强表之间的联系。
2、在学习过程中的感受。
在本次设计中,我们学到很多。当我们遇到问题时,去图书馆,上网查资料,询问同学。比如,数据库与Java语言的连接,Java的图形用户界面GUI的相关知识,都是通过查阅资料学习到的。通过这次课程设计,我们对数据库设计有了
更深了解,当遇到困难时,只有去分析过后,才能真正学到知识。
八、参考文献
《数据库系统原理和应用》 孟彩霞 主编 人民邮电出版社
《Java 核心技术》-第7版
《数据库系统概论》-王珊编第四版
《SQL Server 数据库应用技术》张水平编
《软件工程》-李代平编第二版
《Java API文档》电子版等
九、附录:源代码
(略,详见电子版实验报告)