资源描述
课程设计实验报告
一、课程设计题目
会员信息管理系统
二、本次课程设计应达到的目的
1. 通过该题目的设计,使学生掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
三、本次课程设计任务的主要内容和要求(包括原始数据、技术参数、设计要求等)
使用窗体等控件构建会员信息管理系统界面,实现简单的会员信息管理功能,每次录入完会员信息之后就能实现对其删除,查询,修改等操作。
要求:
1.1人完成
2.功能实现,界面友好
四、进度安排
1. 第1天:选题、查阅资料;
2. 第2天:确定设计方案;
3. 3 -8天:方案的实现、调试与验证;
4. 9-10天:撰写课程设计报告初稿并修改;
五、主要参考文献:
1. 《Javas实用教程(第2版)》, 郑阿奇,电子工业出版社
2. MSDN
一、应用技术及开发环境
1.JAVA语言及JDK
JDK(Java Development Kit)是Sun Microsystems针对Java开发员的产品。自从Java推出以来,JDK已经成为使用最广泛的Java SDK。JDK 是整个Java的核心,包括了Java运行环境、Java工具和Java基础类库。JDK是学好Java的第一步。而专门运行在x86平台的Jrocket在服务端运行效率也要比Sun JDK好很多。从SUN的JDK5.0开始,提供了泛型等非常实用的功能,其版本也不断更新,运行效率得到了非常大的提高。
2.eclipse
Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。
二、结构设计与结构功能图
1. 结构设计
根据对系统进行需求分析,本系统将分为4个模块:
● 会员基本信息管理
管理会员基本信息,包括个人信息的添加、修改、删除以及查询。
● 会员消费信息管理
管理会员的消费信息,包括消费记录的添加、修改、删除以及查询。
● 会员积分信息管理
管理会员积分信息,包括会员积分的添加、修改、删除以及查询。。
2. 功能结构图
会员信息管理系统功能结构如图2.1所示。
会员信息管理系统
会员基本信息管理模块
会员消费信息管理模块
会员积分信息管理模块
查询
修改
删除
添加
查询
修改
删除
添加
显示
查询
修改
删除
添加
图2.1 会员信息管理系统功能结构图
三、系统实现
该系统由4个模块构成,包括会员信息管理系统主界面模块、会员基本信息管理模块、会员消费信息管理模块和会员积分信息管理模块。下面分别加以叙述:
① 会员信息管理系统主界面模块
图3.1 会员信息管理系统主界面
② 会员基本信息管理模块
图3.2 会员基本信息管理模块的运行界面
③ 会员消费信息管理模块
图3.3 会员消费信息管理模块运行界面
④ 会员积分信息管理模块
图3.4 会员积分信息管理模块的运行界面
四、 系统调试与测试
4.1测试的定义及目的
软件测试就是在软件投入运行之前,对软件需求分析、设计规格说明和编码的最终复审,是保证软件质量的关键步骤。如果要给软件测试下定义,可以这样讲,软件测试是为了发现错误而执行程序的过程。
测试的目的在于将软件设计时设计者与程序开发者之间理解不一致的地方、功能与需求不一致的地方、不符合逻辑思维的情况都反映给质量控制部门,由质量控制部门调配需求部门统一做出一个明确解答,再由开发人员进行修改和补充。
4.2系统功能测试
功能测试主要是测试程序模块是否实现了设计中所要求的功能。功能测试中需要注意的有:
(1)查询功能中,是按会员号进行查询的。每次查询前需要先输入会员号,如果没有,程序运行时会弹出提示信息窗口,告诉用户输入会员信息。
(2)录入功能中,需要注意的是前台设置的数值长度是否大于后台数值长度,以及前台和后台的数据结构是否相符,很多时候录入功能无法实现是由于这些原因。还有就是必须录入的字段的设置时候有误。
(3)测试删除功能中需要注意的是单击"删除"按钮后,一般会出现提示信息,询问是否确定删除。通常情况下,我们单击"确认"按钮查看信息是否被删除掉了,而忽略了单击"取消"按钮后程序的反应:这时有可能的是没有删除,还有一种可能是即便单击了"取消"按钮,也一样删除了数据。
(4)关于修改功能的测试主要是看修改确认后是否数据真正已被修改了。这是最基本的功能,需要注意的是看是否能把不应该修改的数据也修改成功了。
4.3系统调试常见错误
1.NullPointerException异常
一般是对一个为NULL值的变量进行操作引起的。为避免这种异常,最好在对变量操作之前检查,看它是否为NULL值。
2.NumberFormatException异常
这是由于数字的格式错误而出现的例外。为了避免出现此类错误,一般必须保证数据格式输入正确。
结束语
经过这次课题的设计并实现,尽管会遇到很多难题,但是让我更加受益的是在这次课题中得到的经验、心得和锻炼。我发现开发项目的过程其实就是个不断的解决问题的过程,从中也感觉到项目开发的快乐,一个人永远有学不完的知识,就算是项目开发中的知识点都学了,但在实际的开发过程中仍然会遇到不少问题,遇到问题时要做到两点:一个是“查”
,一个是“问”。不懂的地方就得要自己找答案,可以从书本、网络中查找解决的答案;再一个就是问周边的同学。比如,在本科课题的编写代码部分,本人就参考了《java 核心技术》,从中得到了图形编程的很多有用的方法。这次课程的设计给我以前所学的知识做了一个总结,为我深入学习编程做了铺垫。在本课题中存在的不足之处是在所难免的,本人将在日后加于改进。
致 谢
在本课题的设计和实现的过程中遇到的不少的难题,我要感谢那些给我带来帮助的书籍和internet,还有周边的同学们。如果没有他们的帮助,本课题的设计和实现就不会如期顺利完成。还要感谢我们的指导老师给我们这么多学生的文档认真批改,让我们知道在课程设计与实现的过程中存在的问题。
附录:程序源代码
(1)Menu.java(主窗口)
package CRM;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.*;
import java.util.*;
class Menu extends JFrame implements ActionListener {
JButton CustomerManager = new JButton("会员信息");
JButton ConsumptionManager = new JButton("消费信息");
JButton Score = new JButton("会员积分信息");
JMenuBar mb = new JMenuBar();// 菜单栏
JPanel jp = new JPanel();// 用来填放子模块
Container cp = getContentPane();
String username;
Menu() {
}
Menu(String username) {
this.username = username;
mb.add(CustomerManager);
mb.add(ConsumptionManager);
mb.add(Score);
cp.add(mb, "North");
// 设置边框
jp.setBorder(BorderFactory.createTitledBorder(
BorderFactory.createLineBorder(Color.blue, 2), null,
TitledBorder.CENTER, TitledBorder.TOP));
jp.setLayout(new BorderLayout());
JLabel label1 = new JLabel(new ImageIcon("4.jpg"));
jp.add(label1);
JLabel label2 = new JLabel(new ImageIcon("2.jpg"));
jp.add(label2, "South");
JScrollPane scrollpane = new JScrollPane(jp);
cp.add(scrollpane);
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screen = kit.getScreenSize();
int x = screen.width; /* 取得显示器窗口的宽度 */
int y = screen.height; /* 取得显示器窗口的高度 */
setSize(600, 600);
int xcenter = (x - 600) / 2;
int ycenter = (y - 600) / 2;
setLocation(xcenter, ycenter);/* 显示在窗口中央 */
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 注册临听器
CustomerManager.addActionListener(this);
ConsumptionManager.addActionListener(this);
Score.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if (cmd.equals("会员信息")) {
new CustomerManager();
}
if (cmd.equals("消费信息")) {
new ConsumptionManager();
}
if (cmd.equals("会员积分信息")) {
new Score();
}
}
public static void main(String[] args) {
new Menu("");
}
}
(2)Score.java (会员积分管理界面)
package CRM;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.*;
class Customer1 implements java.io.Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
String number, name, lastmonth, thismonth, sex, total;
public Customer1() {
};
public void setNumber(String number) {
this.number = number;
}
public String getNumber() {
return number;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setlastmonth(String lastmonth) {
this.lastmonth = lastmonth;
}
public String getlastmonth() {
return lastmonth;
}
public void setthismonth(String thismonth) {
this.thismonth = thismonth;
}
public String getthismonth() {
return thismonth;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getSex() {
return sex;
}
public void settotal(String total) {
this.total = total;
}
public String gettotal() {
return total;
}
}
public class Score extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
JLabel lb = new JLabel("录入请先输入记录,查询、删除请先输入会员号,修改时对查询" + "内容改后的保存!");
JTextField 会员号, 姓名, 上月积分, 本月积分, 总积分;
JRadioButton 男, 女;
ButtonGroup group = null;
JButton 录入, 查询, 删除, 修改, 显示;
JPanel p1, p2, p3, p4, p5, p6, pv, ph;
Customer1 会员 = null;
Hashtable<String, Customer1> 会员散列表 = null;
File file = null;
FileInputStream inOne = null;
ObjectInputStream inTwo = null;
FileOutputStream outOne = null;
ObjectOutputStream outTwo = null;
public Score() {
super("会员积分信息管理系统");
会员号 = new JTextField(10);
姓名 = new JTextField(10);
上月积分 = new JTextField(10);
本月积分 = new JTextField(10);
总积分 = new JTextField(10);
group = new ButtonGroup();
男 = new JRadioButton("男", true);
女 = new JRadioButton("女", false);
group.add(男);
group.add(女);
录入 = new JButton("录入");
查询 = new JButton("查询");
删除 = new JButton("删除");
修改 = new JButton("修改");
显示 = new JButton("显示");
录入.addActionListener(new InputAct());
查询.addActionListener(new InquestAct());
修改.addActionListener(new ModifyAct());
删除.addActionListener(new DeleteAct());
显示.addActionListener(new ShowAct());
修改.setEnabled(false);
p1 = new JPanel();
p1.add(new JLabel(" 会员号:", JLabel.CENTER));
p1.add(会员号);
p2 = new JPanel();
p2.add(new JLabel(" 姓名:", JLabel.CENTER));
p2.add(姓名);
p3 = new JPanel();
p3.add(new JLabel(" 性别:", JLabel.CENTER));
p3.add(男);
p3.add(女);
p4 = new JPanel();
p4.add(new JLabel(" 上月积分:", JLabel.CENTER));
p4.add(上月积分);
p5 = new JPanel();
p5.add(new JLabel(" 本月积分:", JLabel.CENTER));
p5.add(本月积分);
p6 = new JPanel();
p6.add(new JLabel(" 总积分:", JLabel.CENTER));
p6.add(总积分);
pv = new JPanel();
pv.setLayout(new GridLayout(6, 1));
pv.add(p1);
pv.add(p2);
pv.add(p3);
pv.add(p4);
pv.add(p5);
pv.add(p6);
ph = new JPanel();
ph.add(录入);
ph.add(查询);
ph.add(修改);
ph.add(删除);
ph.add(显示);
file = new File("会员积分信息.txt");
会员散列表 = new Hashtable<String, Customer1>();
if (!file.exists()) {
try {
FileOutputStream out = new FileOutputStream(file);
ObjectOutputStream objectOut = new ObjectOutputStream(out);
objectOut.writeObject(会员散列表);
objectOut.close();
out.close();
} catch (IOException e) {
}
}
Container con = getContentPane();
con.setLayout(new BorderLayout());
con.add(lb, BorderLayout.NORTH);
con.add(pv, BorderLayout.CENTER);
con.add(ph, BorderLayout.SOUTH);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setBounds(100, 50, 500, 380);
setVisible(true);
}
public static void main(String args[]) {
new Score();
}
class InputAct implements ActionListener {
public void actionPerformed(ActionEvent e) {
修改.setEnabled(false);
String number = "";
number = 会员号.getText();
if (number.length() > 0) {
try {
inOne = new FileInputStream(file);
inTwo = new ObjectInputStream(inOne);
会员散列表 = (Hashtable) inTwo.readObject();
inOne.close();
inTwo.close();
} catch (Exception ee) {
System.out.println("创建散列表出现问题!");
}
if (会员散列表.containsKey(number)) {
String warning = "该会员信息已存在,请到修改页面修改!";
JOptionPane.showMessageDialog(null, warning, "警告",
JOptionPane.WARNING_MESSAGE);
}// end if1
else {
String m = "该会员信息将被录入!";
int ok = JOptionPane.showConfirmDialog(null, m, "确认",
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE);
if (ok == JOptionPane.YES_OPTION) {
String name = 姓名.getText();
String lastmonth = 上月积分.getText();
String thismonth = 本月积分.getText();
String total = 总积分.getText();
String sex = null;
if (男.isSelected()) {
sex = 男.getText();
} else {
sex = 女.getText();
}
会员 = new Customer1();
会员.setNumber(number);
会员.setName(name);
会员.setlastmonth(lastmonth);
会员.setthismonth(thismonth);
会员.settotal(total);
会员.setSex(sex);
try {
outOne = new FileOutputStream(file);
outTwo = new ObjectOutputStream(outOne);
会员散列表.put(number, 会员);
outTwo.writeObject(会员散列表);
outTwo.close();
outOne.close();
} catch (Exception ee) {
System.out.println("输出散列表出现问题!");
}
会员号.setText(null);
姓名.setText(null);
上月积分.setText(null);
本月积分.setText(null);
总积分.setText(null);
}
}// end else1
}// end if0
else {
String warning = "必须输入会员号!";
JOptionPane.showMessageDialog(null, warning, "警告",
JOptionPane.WARNING_MESSAGE);
}// end else0
}// end actionPerformed
}// end class
class InquestAct implements ActionListener {
public void actionPerformed(ActionEvent e) {
String number = "";
number = 会员号.getText();
if (number.length() > 0) {
try {
inOne = new FileInputStream(file);
inTwo = new ObjectInputStream(inOne);
会员散列表 = (Hashtable) inTwo.readObject();
inOne.close();
inTwo.close();
} catch (Exception ee) {
System.out.println("散列表有问题!");
}
if (会员散列表.containsKey(number)) {
修改.setEnabled(true);
Customer1 stu = (Customer1) 会员散列表.get(number);
姓名.setText(stu.getName());
上月积分.setText(stu.getlastmonth());
本月积分.setText(stu.getthismonth());
总积分.setText(stu.gettotal());
if (stu.getSex().equals("男")) {
男.setSelected(true);
} else {
女.setSelected(true);
}
} else {
修改.setEnabled(false);
String warning = "该会员号不存在!";
JOptionPane.showMessageDialog(null, warning, "警告",
JOptionPane.WARNING_MESSAGE);
}
} else {
修改.setEnabled(false);
String warning = "必须输入会员号!";
JOptionPane.showMessageDialog(null, warning, "警告",
JOptionPane.WARNING_MESSAGE);
}
}
}
class ModifyAct implements ActionListener {
public void actionPerformed(ActionEvent e) {
String number = 会员号.getText();
String name = 姓名.getText();
String lastmonth = 上月积分.getText();
String thismonth = 本月积分.getText();
String total = 总积分.getText();
String sex = null;
if (男.isSelected()) {
sex = 男.getText();
} else {
sex = 女.getText();
}
Customer1 会员 = new Customer1();
会员.setNumber(number);
会员.setName(name);
会员.setlastmonth(lastmonth);
会员.setthismonth(thismonth);
会员.settotal(total);
会员.setSex(sex);
try {
outOne = new FileOutputStream(file);
outTwo = new ObjectOutputStream(outOne);
会员散列表.put(number, 会员);
outTwo.close();
outOne.close();
会员号.setText(null);
姓名.setText(null);
上月积分.setText(null);
本月积分.setText(null);
总积分.setText(null);
} catch (Exception ee) {
System.out.println("录入修改出现问题!");
修改.setEnabled(false);
}
}
}
class DeleteAct implements ActionListener {
public void actionPerformed(ActionEvent e) {
修改.setEnabled(false);
String number = 会员号.getText();
if (number.length() > 0) {
try {
inOne = new FileInputStream(file);
inTwo = new ObjectInputStream(inOne);
会员散列表 = (Hashtable) inTwo.readObject();
inTwo.close();
inOne.close();
} catch (Exception ee) {
}
if (会员散列表.containsKey(number)) {
Customer1 stu = (Customer1) 会员散列表.get(number);
姓名.setText(stu.getName());
上月积分.setText(stu.getlastmonth());
本月积分.setText(stu.getthismonth());
总积分.setText(stu.gettotal());
if (stu.getSex().equals("男")) {
男.setSelected(true);
} else {
女.setSelected(true);
}
}
String m = "确定要删除该会员的记录吗?";
int ok = JOptionPane
.showConfirmDialog(null, m, "确认",
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE);
if (ok == JOptionPane.YES_OPTION) {
会员散列表.remove(number);
try {
outOne = new FileOutputStream(file);
outTwo = new ObjectOutputStream(outOne);
outTwo.writeObject(会员散列表);
outTwo.close();
outOne.close();
会员号.setText(null);
姓名.setText(null);
上月积分.setText(null);
本月积分.setText(null);
总积分.setText(null);
} catch (Exception ee) {
System.out.println(ee);
}
} else if (ok == JOptionPane.NO_OPTION) {
会员号.setText(null);
姓名.setText(null);
上月积分.setText(null);
本月积分.setText(null);
总积分.setText(null);
} else {
String warning = "该会员不存在!";
JOptionPane.showMessageDialog(null, warning, "警告",
JOptionPane.WARNING_MESSAGE);
}
} else {
String warning = "必须输入会员号!";
JOptionPane.showMessageDialog(null, warning, "警告",
JOptionPane.WARNING_MESSAGE);
}
}
}
class ShowAct implements ActionListener {
public void actionPerformed(ActionEvent e) {
new CustomerShow(file);
}
}
class CustomerShow extends JDialog {
/**
展开阅读全文