基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现
第一章 需求分析
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 访问客户列表修改
相关文章:

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...

算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...

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

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

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...

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

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

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

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

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

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

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

GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...

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

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...