基于Java+MySQL实现(GUI)客户管理系统

news2025/6/15 6:01:46

客户资料管理系统的设计与实现

第一章 需求分析

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 进入系统

两种权限对应两种登录界面,实现不同的功能

6.3 新增客户

6.4 访问客户列表修改

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2407292.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…