客户资料管理系统的设计与实现
第一章 需求分析
1.1 需求总体介绍
本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对系统资料进行磁盘文件保存。旨在实现客户电子化管理,它主要包括客户界面、客户信息的增加界面、客户信息的修改界面、显示全部客户的信息、删除一条用户信息、按照用户的编号查询用户信息、按照用户的姓名查询用户信息、按照用户的地址查询用户信心、退出系统界面。客户管理系统是一个现代化的软件,它通过窗口 swing 和数据库的结合,以便于对客户信息集体化管理,提高了管理效率,美观性强。
1.2 系统的功能性需求
方便维护客户信息,对客户进行统一管理,把客户信息录入系统进行统计和管理维护。包括客户增加、客户删除、客户修改、客户查询、浏览客户、城市增加、城市删除、城市修改、城市查询、浏览城市、退出系统等功能。并且设置了两个用户权限等级,针对不同客户实现不同的功能。添加了天气,日期等功能并可以实时更新。
1.3 系统的非功能性需求
用户界面有增加用户,用户列表,修改密码等、需要配置好 Java 环境,对 eclipse 配置,连接好数据库,在数据库中建好列表。
第二章 数据库设计
2.1 数据库概念结构设计
图 2-1 客户实体与其属性图
图 2-2 增加客户信息图
图 2-3 查询客户信息图
图 2-4 修改客户信息图
图 2 -5 删除客户信息图
图 2-6 总 E-R 图
2.2 数据库逻辑结构设计
2.2.1 完成关系模式的转化
基本信息:客户编号、客户姓名、客户电话、客户性别、客户邮箱、客户城市、客户等级
2.2.2 数据字典
数据和表的建立:
图 2-7 数据库建立图
图 2-8 数据表建立图 1
图 2-9 数据表建立图 2
图 2-10 数据表建立图 3
2.3 数据库列表
表 2-1 城市信息表
字段名 |
数据类型 |
字段含义 |
||||
cityid |
int |
城市编号 |
||||
cityname |
varchar(20) |
城市姓名 |
表 2-2 客户信息表
字段名 |
数据类型 |
字段含义 |
||||
custid |
int |
客户编号 |
||||
custname |
varchar |
客户姓名 |
||||
custphone |
varchar |
客户电话 |
||||
custemail |
varchar |
客户邮箱 |
||||
custgender |
varchar |
客户性别 |
||||
cityid |
int |
客户城市 |
||||
custlevel |
int |
客户等级 |
图 2-2 用户信息图
字段名 |
数据类型 |
字段含义 |
||||
userid |
int |
用户编号 |
||||
userpassword |
varchar(20) |
用户密码 |
||||
username |
varchar(20) |
用户姓名 |
||||
userlevel |
int |
用户等级 |
第三章 系统设计
系统采用 dao 设计。dao 全称是 data access object,数据库访问对象,主要的功能就是用于进行数据操作的,在程序的标准开发架构中属于数据层的操作。
3.1 体系结构设计
将需求分析中的系统功能用类(实体类、操作类、工具类、异常类等)的形式进行设计,搭建合理的系统架构。
dao 包:ICustomerDao 类是用来装封一定功能(增、删、改、查、浏览)的集合。它好比一个模板,在其中定义了对象必须实现的成员,通过类或结构来实现它。
impl 包:DAO 接口的真实实现类,完成具体的数据库操作,但是不负责数据库的打开和关闭;
CustomerDao 类:用数据库来实现增删改查浏览等功能;
model 包:
Customer 类:客户属性 get 和 set 方法,toString 方法
program 包:程序界面
AddCustomerFrame 类:增加客户的界面
CloseWindow 类:退出系统
DelCustomerFrame 类:删除客户的界面
LoginFrame 类:主界面,即登录上本系统弹出的界面
MainFrame 类:主函数,运行管理系统
SearchCustomerFrame 类:查询客户信息界面
ShowCustomerFrame 类:显示所有员工界面
UpCustomerFrame 类:修改客户信息的界面
util 包:
BaseDao 类:数据库连接与关闭
3.2 人机交互设计
3.3 用户界面设计规则
管理员管理部分:
(1)管理员可以增加客户信息
(2)管理员可以删除客户信息
(3)管理员可以修改客户信息
(4)管理员可以查询客户信息
(5)管理员可退出管理系统
第四章 系统实现
4.1 数据库实现
private String url = "jdbc:mysql://localhost:3306/cus?useUnicode=true&characterEncoding=UTF-8";
private String username = "root";
private String password = "";
private Connection conn = null;
建立一个数据库,数据库名为 cus。
以下为用户登录,用户名如上语句为“root”,密码为 null。
然后是数据库表的创建,表名为 customer,如语句所示:
String SQL = "SELECT * FROM user WHERE username=? AND userpassword=?";
String SQL = "UPDATE `user` SET `userpassword` = ? WHERE `user`.`userid` =?";
String SQL = "SELECT * FROM `user` WHERE username=?";
String SQL = "UPDATE `user` SET `username` = ? WHERE `user`.`userid` =?";
String SQL = "INSERT INTO `user` (`userid`, `username`, `userpassword`, `userlevel`) VALUES (NULL, ?, ?, ?)";
String SQL = "SELECT * FROM `user` WHERE userid=?";
String SQL = "DELETE FROM `user` WHERE `user`.`userid` = ?";
String SQL = "select * from customer";
String SQL = "SELECT * FROM customer WHERE custid=?";
String SQL = "INSERT INTO customer VALUES (NULL,?,?,?,?,?,?)";
String SQL = "UPDATE customer SET custname = ?,custphone = ?,cuetemail = ?,custgender = ?,cityid = ?,cuslevel = ? WHERE custid = ?";
String SQL = "DELETE FROM customer WHERE custid=?";
String SQL = "select * from city";
String SQL = "select * from city order by cityid desc";
String SQL = "SELECT * FROM city WHERE cityid = ?";
String SQL = "INSERT INTO city VALUES (NULL,?)";
String SQL = "UPDATE city SET cityname = ? WHERE cityid = ?";
String SQL = "DELETE FROM city WHERE cityid=?";
String SQL = "SELECT * FROM city WHERE cityname = ?";
4.2 主界面的实现
protected void listCustomerButton(MouseEvent e) {
new ListCustomerFrame().setVisible(true);
}
/**
* 新增客户
* @param e
*/
protected void addCustomerButton(MouseEvent e) {
new AddCustomerFrame().setVisible(true);
}
/**
* 新增城市
* @param e
*/
protected void addCityButton(MouseEvent e) {
new AddCityFrame().setVisible(true);
}
/**
* 城市列表
* @param e
*/
protected void listCityButton(MouseEvent e) {
new ListCityFrame().setVisible(true);
}
/**
* 用户列表按钮点击事件
* @param e
*/
protected void listUserButton(MouseEvent e) {
new ListUserFrame().setVisible(true);
}
/**
* 增加用户按钮点击事件
* @param e
*/
protected void addUserButton(MouseEvent e) {
new AddUserFrame().setVisible(true);
}
/**
* 客户管理组件点击事件
* @param e
*/
protected void mangeCusButton(MouseEvent e, JPanel mangeCusPanel) {
getContentPane().add(mangeCusPanel);
}
/**
* 退出按钮
* @param e
*/
protected void exitButton(ActionEvent e) {
System.exit(0);
}
/**
* 修改密码按钮
* @param arg0
* @param user
*/
protected void updatePasswordButton(ActionEvent arg0, User user) {
new UpdatePwdFrame(user).setVisible(true);
}
/**
* 窗口大小改变事件
*/
protected void mainFrameComponentResized(ComponentEvent arg0, JPanel topPanel, GroupLayout gl_panel) {
4.3 增加功能的实现
protected void addButton(ActionEvent e) {
String cityname = this.citynameText.getText();
}
if (cityname.isEmpty()) {
JOptionPane.showMessageDialog(this, "请输入城市名称");
this.citynameText.requestFocus();
return;
}
if (cityname.length() > 20) {
JOptionPane.showMessageDialog(this, "对不起,城市名称不能超过20位!");
this.citynameText.requestFocus();
return;
}
City city = new City();
city.setCityname(cityname);
int row = cdao.addCity(city);
if (row > 0) {
JOptionPane.showMessageDialog(this, "保存城市信息成功");
} else {
JOptionPane.showMessageDialog(this, "保存城市信息失败");
}
}
4.4 查询功能的实现
protected void detailCustomer(MouseEvent arg0) {
int row = this.table.getSelectedRow();
int custid = (Integer) this.table.getValueAt(row, 0);
Customer customer = cdao.queryCustomerById(custid);
this.custidText.setText(String.valueOf(customer.getCustid()));
this.custnameText.setText(customer.getCustname());
this.custphoneText.setText(customer.getCustphone());
this.cuetemailText.setText(customer.getCuetemail());
this.getCitys("modify");
this.cuslevelText.setText(String.valueOf(customer.getCuslevel()));
if (customer.getCustgender().equals("男")) {
this.menjrbn.setSelected(true);
} else {
this.womenjrb.setSelected(true);
}
int count = this.cityidJrb.getItemCount();
for (int i = 0; i < count; i++) {
City selectcity = dao.queryCityById(customer.getCityid());
if (selectcity.getCityname().equals(this.cityidJrb.getItemAt(i))) {
this.cityidJrb.setSelectedIndex(i);
}
}
}
4.5 修改功能的实现
protected void gainameButton(ActionEvent e) {
String strCustid = this.custidText.getText();
int custid = Integer.parseInt(strCustid);
String custname = this.custnameText.getText();
String cityname = (String) this.cityidJrb.getItemAt(cityidJrb.getSelectedIndex());
String cuetemail = this.cuetemailText.getText();
String custphone = this.custphoneText.getText();
City city = dao.queryCityByName(cityname);
int cuslevel = Integer.parseInt(this.cuslevelText.getText());
Customer customer = new Customer();
customer.setCustid(custid);
customer.setCustname(custname);
customer.setCuetemail(cuetemail);
customer.setCityid(city.getCityid());
customer.setCuslevel(cuslevel);
customer.setCustphone(custphone);
if (this.menjrbn.isSelected()) {
customer.setCustgender("男");
} else {
customer.setCustgender("女");
}
int row = cdao.updateCustomer(customer);
if (row > 0) {
JOptionPane.showMessageDialog(this, "修改成功");
this.getCustomers(null);
} else {
JOptionPane.showMessageDialog(this, "修改失败");
4.6 删除功能的实现
protected void deleButton(ActionEvent e) {
String strCustid = this.custidText.getText();
int custid = Integer.parseInt(strCustid);
int row = this.cdao.deleteCustomer(custid);
if (row > 0) {
JOptionPane.showMessageDialog(this, "删除客户成功");
this.getCustomers(null);
} else {
JOptionPane.showMessageDialog(this, "删除客户失败");
第五章 系统测试
5.1 测试概要
先建立数据库测试,然后分别对客户增加、客户删除、客户修改、客户查询、浏览客户、等功能进行测试。
5.2 测试结果及发现
表 5-1 建立数据库测试表
序号 |
1 |
||
控件名称 |
|||
描述 |
建立数据库 |
||
编号 |
输入/动作 |
期望的输出 |
实际情况 |
1 |
输入用户名“root”,密码为 null |
无输出 |
提示“数据库建立成功” |
表 5-2 增加客户测试表
序号 |
2 |
||
控件名称 |
|||
描述 |
增加客户 |
||
编号 |
输入/动作 |
期望的输出 |
实际情况 |
1 |
编号,姓名 |
提示“添加成功!” |
提示“添加成功!” |
2 |
编号,地址 |
提示“添加失败!” |
提示“添加失败!” |
3 |
姓名,地址 |
提示“添加失败!” |
提示“添加失败!” |
4 |
编号,地址,姓名 |
提示“添加成功!” |
提示“添加成功!” |
表 5-3 删除客户测试表
序号 |
3 |
||
控件名称 |
|||
描述 |
删除客户 |
||
编号 |
输入/动作 |
期望的输出 |
实际情况 |
1 |
不存在的编号 |
提示“查询无此客户!” |
提示“查询无此客户!” |
2 |
存在的编号 |
提示“删除成功!” |
提示“删除成功!” |
表 5-4 修改客户测试表
序号 |
4 |
||
控件名称 |
|||
描述 |
修改客户 |
||
编号 |
输入/动作 |
期望的输出 |
实际情况 |
1 |
不存在的编号 |
提示“查询无此客户!” |
提示“查询无此客户!” |
2 |
存在的编号,输入姓名和地址 |
提示“修改成功!” |
提示“修改成功!” |
表 5-5 查询客户测试表
序号 |
5 |
||
控件名称 |
|||
描述 |
查询客户 |
||
编号 |
输入/动作 |
期望的输出 |
实际情况 |
1 |
编号 |
客户姓名和地址 |
客户姓名和地址 |
2 |
地址 |
客户编号和姓名 |
客户编号和姓名 |
3 |
姓名 |
客户编号和地址 |
客户编号和地址 |
4 |
不存在的编号,姓名,或者地址 |
提示“查询无此客户!” |
提示“查询无此客户!” |
表 5-6 浏览客户测试表
序号 |
6 |
||
控件名称 |
|||
描述 |
浏览客户 |
||
编号 |
输入/动作 |
期望的输出 |
实际情况 |
1 |
无输入 |
所有客户信息,包括无客户的情况 |
所有客户信息,包括无客户的情况 |
5.3 测试结果
经测试,数据库,客户增加、客户删除、客户修改、客户查询、浏览客户、等功能都正常,可正常运行、
第六章 系统使用说明书
6.1 用户登录
首先输入用户名密码登陆系统
6.2 进入系统
两种权限对应两种登录界面,实现不同的功能