同学通讯录
版权声明:本文为博主原创文章,转载请标明作者和原链接
https://blog.csdn.net/qq_42239046/article/details/86490152
目录
1同学通讯录的概述
1.1背景与意义
21世纪的人类社会是信息化社会,以信息技术为主要标志的高新技术产业在整个经济中的比重不断增长,多媒体技术及其产品是当今世界计算机和通信产业发展的新领域。正是科学的发展,使得我们与之前的很多同学越走越远,而我们之间的联系也是越来越疏远。
也正因为这样,我们应该多多联系我们远在他乡的同学,我们为了满足这种需求,我们团队便动手设计了这样的一款产品“同学通讯录”。
世间纵有万般好,但也比不上那最真实,最亲切的”情”,人类正是有了情才能一步一步走向这般拥有万古文明的社会,才能构造出这样和谐的美好社会。我们“同学通讯录”便是维护和完善这份感情的重要桥梁。
1.2系统要求
[问题描述]
具有数据插入、修改、删除、显示、查询和统计功能的电话簿管理程序。
[程序设计功能及要求]
- 人数不定,数据使用文件存放。
- 记录每位同学的学号、姓名、性别、工作单位、电话号码和E-mail地址建立单独的条目,存入数据文件。
- 可对记录中的姓名和电话号码等进行修改。
- 可增加或删除记录
- 可显示所有保存的记录
- 加入统计功能,可以统计男女同学或总人数。
- 加入查询功能,通过姓名、学号或电话号码查询到同学的条目。
- 在开始画面加入简单的菜单便于选择功能。
- 文件格式
1.储存数据文件格式
学号 姓名 性别 工作单位 电话号码 E-mail
1 李四 …. …. ….
- 选做:加入文件加密系统,对储存数据文件进行简单的加密,要求通过直接打开储存数据文件无法获得其中的数据。但同时不影响程序对储存数据文件的调用。
[设计提示]
本程序建议采用结构体类型和文件系统实现。
2 同学通讯录的设计思路
2.1功能规划
将主界面设置为简单清新的界面,在主界面通过按钮进行跳转切换来实现不同的界面,使得结构更加完备。
常用功能区域里面添加了插入,修改,删除,显示,查询,统计按钮用来完成不同的操作,用户能够实现这些功能,每个功能跳转不同的界面,每个界面都独立开来。能够记录每位同学的学号、姓名、性别、工作单位、电话号码和E-mail地址建立单独的条目,存入数据文件。可对记录中的姓名和电话号码等进行修改。可增加或删除记录。可显示所有保存的记录。加入统计功能,可以统计男女同学或总人数。加入查询功能,通过姓名、学号或电话号码查询到同学的条目。在开始画面加入简单的菜单便于选择功能。
2.2系统主要功能图
我们首先根据图形编辑器的功能设置了个6模块,分别是“插入功能模块”:用来增加同学数据;“修改功能模块”:用于修改同学信息,可对记录中的姓名和电话号码等进行修改;“删除功能模块”:用于删除同学;“显示功能模块”:可显示所有保存的记录;“查询功能模块”:通过姓名、学号或电话号码查询到同学的条目;“统计功能模块”:可以统计男女同学或总人数。
系统功能图如下图所示:
2.3系统主要流程图
系统主要流程是先打开同学通讯录,这是图形编辑器进行初始化工作,用户点击“进入”按钮,我们同时也非常贴心的设计了“退出”按钮,进入之后,那六个功能板块便进入你的眼中,你可以自由选择你想进行的操作,或者用户默认在打开时的面板中直接进行绘画。用户完成自己操作后,可以选择退出程序,保存已编辑的资料。用户退出程序,关闭软件。
3 系统功能的实现
3.1 通讯录数据库的创建
3.1.1 创建classmates数据库及表格
代码如下:
create database classmates;
use classmates;
create table classmates (
id int(11) NOT NULL AUTO_INCREMENT,
classmate_number varchar(20) DEFAULT NULL,
classmate_name varchar(20) DEFAULT NULL,
classmate_sex varchar(20) DEFAULT NULL,
classmate_unit varchar(20) DEFAULT NULL,
classmate_phone varchar(20) DEFAULT NULL,
classmate_email varchar(20) DEFAULT NULL,
PRIMARY KEY (id)
)ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;
图3.1.1
3.2 同学通讯录的实现
3.2.1 程序初始界面
程序初始界面中,标题是“同学通讯录”,映入眼帘的是“欢迎使用同学通讯录”几个大字,界面的背景图片采用的是非常护眼的黄色,整个界面非常的清新和整洁,给人一种心旷神怡的感觉,正可以推出我们的主题“同学情”,图片中的书本和闹钟可以让我们想起那段青涩的时光和那段简单干净的“小美好”。
主界面上有两个按钮“进入”“退出”,鼠标点击进入,会进入到功能提示界面,进行各种操作,点击退出,则会关闭界面退出同学通讯录。
图3.2.1 初始界面
3.2.2 功能提示界面
在功能提示界面,出现了六个功能按钮,和一个“退出”按钮。任意点击功能按钮,会进入实现各功能的界面,点击退出会关闭功能提示界面,退出同学通讯录,如图3.2.2.1。
图3.2.2.1 功能提示界面
3.2.3 插入功能界面
在功能提示界面,鼠标点击“插入”按钮,会关闭功能提示界面,进入插入操作界面如图3.2.3.1。在插入操作界面,我们可以插入同学的六个信息。当我们填写的数据不完整,就点击“确定”按钮时,会弹出警告:“信息没有填完整”,如图3.2.3.2。当所有信息都填写完整后,点击“确定”按钮,会显示:“添加成功”,如图3.2.3.3。当我们成功完成插入操作后,会自动关闭插入界面。 退回功能提示界面。
图3.2.3.1 插入功能初始界面
图3.2.3.2
图3.2.3.3
3.2.4 显示功能界面
在插入界面完成信息填写,提交成功后。我们在功能提示界面点击“显示”按钮。会出现数据库中保存的所有同学的信息。如图3.2.4.1,我们可以看到,新插入的信息已经完整加入到数据库中,如图3.2.4.2。
图3.2.4.1
图3.2.4.2
3.2.5 修改功能界面
当我们查看显示界面时,我们发现,新添加的同学的邮箱出现错误。在功能提示界面,点击“修改”按钮,进入到修改功能界面如图3.2.5.1。在修改功能界面,我们需要填写要修改信息的同学的姓名,点击确定,就会显示出该同学的所有信息如图3.2.5.2,我们可以直接在文本框上面修改同学的信息,如图3.2.5.3。
图3.2.5.1
图3.2.5.2
图3.2.5.3
修改成功后,在功能提示界面点击“显示”按钮,可以看到信息已经修改好了,如图3.2.5.4。
图3.2.5.4
3.2.6 查询功能界面
在提示功能界面,点击“查询”按钮,可以进入查询界面,如图3.2.6.1。填写要查询的同学的姓名,点击“确定”,可以显示出该同学的所有信息,但不可修改,如图3.2.6.2。如果通讯录数据库中没有对应姓名的同学,会显示警告:“查询不到此同学”,如图3.2.6.3。
图3.2.6.1
图3.2.6.2
图3.2.6.3
3.2.7 删除功能界面
在提示功能界面,点击“删除”按钮,可以进入删除界面,填写想要删除的同学的姓名,就可以进行删除操作,如图3.2.7.1。点击“确定”,即可删除该同学,如图3.2.7.2。
图3.2.7.1
图3.2.7.2
这个时候打开数据库的classmates表格,可以看到该同学已经被删除了。如图3.2.7.3。
图3.2.7.3
3.2.8 统计功能界面
在提示功能界面,点击“统计”按钮,即可进入统计界面。统计界面会统计出数据库里存有的同学的男生人数、女生人数、总人数。如图3.2.8.1。
图3.2.8.1
3.3 通讯录数据的写入、提取与显示
3.3.1 通讯录数据的写入
通讯录中的所有数据都保存在数据库中,所以必须将数据写入数据库中。以插入功能为例,代码截图如下:
public int insert(){
if(Classmate_number.getText().trim().equals("")||Classmate_name.getText().trim().equals("")
)
{
JOptionPane.showMessageDialog(this,"信息没有填完整");
return -1;
}
try {
String num=Classmate_number.getText().trim();
String name=Classmate_name.getText().trim();
String sex=Classmate_sex.getText().trim();
String unit=Classmate_unit.getText().trim();
String phone=Classmate_phone.getText().trim();
String email=Classmate_email.getText().trim();
DbDao d=DbDao.instance("com.mysql.jdbc.Driver",
"jdbc:mysql://localhost:3306/classmates","root","root");
// ResultSet rs = d.query("select classmate_number from classmates ");
// while(rs.next())
// {
// if (rs.getString("classmate_number").equals(num))
// {
// JOptionPane.showMessageDialog(this,"学号重复");
// return 0;
// }
// }
ResultSet rs = d.query("select classmate_number from classmates where classmate_number='"+num+"'");
if(rs.next())
{
JOptionPane.showMessageDialog(this,"学号重复");
return 0;
}
String sql2="Insert into classmates(classmate_number,classmate_name,classmate_sex,classmate_unit,classmate_phone,classmate_email) values('"+num+"','"+name+"','"+sex+"','"+unit+"','"+phone+"','"+email+"')";
d.insert(sql2);
JOptionPane.showMessageDialog(this,"添加成功");
this.dispose(); //关闭当前界面
Features F=new Features("功能界面"); //打开新界面
F.setLocationRelativeTo(null);
return 1;
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return 1;
}
3.3.2 部分界面的代码
初始化界面代码
package package1;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Initialization extends JFrame implements ActionListener{
JLayeredPane backgroundjpl;
JPanel jplNorth,jplCenter,jplbackground;
JButton jbt1,jbt2;
JLabel jlb,jlb1,jlb2;
ImageIcon backgroungimage,insertimage;
Initialization(String str){
super(str);
jlb1 = new JLabel("欢迎使用同学通讯录");
backgroundjpl = new JLayeredPane();
backgroungimage = new ImageIcon("image/background.jpg");
insertimage = new ImageIcon("image/cover.png");
jplbackground = new JPanel();
jplNorth = new JPanel();
jplCenter = new JPanel();
jbt1 = new JButton("进入");
jbt1.addActionListener(this);
jbt2 = new JButton("退出");
jbt2.addActionListener(this);
jlb = new JLabel(backgroungimage);
jlb2 = new JLabel(insertimage);
jplbackground.setSize(backgroungimage.getIconWidth(),backgroungimage.getIconHeight());
jlb.setSize(backgroungimage.getIconWidth(),backgroungimage.getIconHeight());
jplbackground.add(jlb);
jplCenter.setSize(insertimage.getIconWidth(),insertimage.getIconHeight());
jlb2.setSize(insertimage.getIconWidth(),insertimage.getIconHeight());
jplCenter.add(jlb2);
Font f = new Font("宋体",1,60);
Font f1 = new Font("楷体",1,80);
jbt1.setFont(f);
jbt1.setBackground(new Color(242,233,202));
jbt2.setFont(f);
jbt2.setBackground(new Color(242,233,202));
jlb1.setFont(f1);
jbt1.setBounds(100,200,200,80);
jbt2.setBounds(100,300,200,80);
jplCenter.setBounds(670,350,insertimage.getIconWidth(),insertimage.getIconHeight());
jplNorth.add(jlb1);
jplNorth.setBackground(new Color(244,237,209));
jplNorth.setBounds(420,100,800,200);
backgroundjpl.add(jplbackground,JLayeredPane.DEFAULT_LAYER);
backgroundjpl.add(jplNorth,JLayeredPane.MODAL_LAYER);
backgroundjpl.add(jplCenter,JLayeredPane.MODAL_LAYER);
backgroundjpl.add(jbt1,JLayeredPane.MODAL_LAYER);
backgroundjpl.add(jbt2,JLayeredPane.MODAL_LAYER);
this.pack();
this.setLayeredPane(backgroundjpl);
this.setBounds(700,500,backgroungimage.getIconWidth(),backgroungimage.getIconHeight());
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand()=="退出")
{
System.exit(0);
}
else if(e.getActionCommand()=="进入")
{
this.dispose(); //关闭当前界面
Features F=new Features("功能界面"); //打开新界面
F.setLocationRelativeTo(null);
}
}
public static void main(String[] args) {
Initialization Correspondence_address = new Initialization("同学通讯录");
Correspondence_address.setLocationRelativeTo(null);
}
}
功能界面代码
package package1;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Features extends JFrame implements ActionListener{
/**
* 变量声明
*/
JLayeredPane backgroundjpl;
JPanel jplbackground,jpl1,jpl2,jpl3,jpl4,jpl5,jpl6,jpl7;
JButton jbt1,jbt2,jbt3,jbt4,jbt5,jbt6,jbt7;
JLabel jlb,jlb1,jlb2,jlb3,jlb4,jlb5,jlb6,jlb7;
ImageIcon backgroungimage;
/**
* 构造函数
* @param str
*/
Features(String str){
super(str);
backgroungimage = new ImageIcon("image/background.jpg"); //生成界面背景
jbt1 = new JButton("插入"); //生成插入按钮
jbt1.addActionListener(this); //给按钮增加监听事件,点击按钮跳入插入界面
jbt2 = new JButton("删除"); //生成删除按钮
jbt2.addActionListener(this); //给按钮增加监听事件,点击按钮跳入删除界面
jbt3 = new JButton("修改"); //生成修改按钮
jbt3.addActionListener(this); //给按钮增加监听事件,点击按钮跳入修改界面
jbt4 = new JButton("查询"); //生成查询按钮
jbt4.addActionListener(this); //给按钮增加监听事件,点击按钮跳入查询界面
jbt5 = new JButton("显示"); //生成显示按钮
jbt5.addActionListener(this); //给按钮增加监听事件,点击按钮跳入显示界面
jbt6 = new JButton("统计"); //生成统计按钮
jbt6.addActionListener(this); //给按钮增加监听事件,点击按钮跳入统计界面
jbt7 = new JButton("退出"); //生成退出按钮
jbt7.addActionListener(this); //给按钮增加监听事件,点击按钮退出系统
jplbackground = new JPanel(); //生成一个容器jplbackground用来装载jlb
jlb = new JLabel(backgroungimage); //创建具有backgroungimage图片的 JLabel 实例
jplbackground.setSize(backgroungimage.getIconWidth(),backgroungimage.getIconHeight());
//设置容器大小为backgroungimage图片大小
jlb.setSize(backgroungimage.getIconWidth(),backgroungimage.getIconHeight());
//设置JLabel实例大小为backgroungimage图片大小
jplbackground.add(jlb); //将JLabel实例放入JPanel容器
jpl7 = new JPanel(); //生成一个容器jpl7用来装载jlb7
jlb7 = new JLabel("请选择以下操作"); //创建含有文字的 JLabel 实例
jpl7.add(jlb7); //将JLabel实例放入JPanel容器
Font f = new Font("宋体",1,60); //设置字体样式f
Font f1 = new Font("楷体",1,80); //设置字体样式f1
jbt1.setFont(f); //设置插入按钮字体样式为f
jbt1.setBackground(new Color(241,232,199)); //设置按钮颜色
jbt2.setFont(f); //设置删除按钮字体样式为f
jbt2.setBackground(new Color(244,237,209)); //设置按钮颜色
jbt3.setFont(f); //设置修改按钮字体样式为f
jbt3.setBackground(new Color(245,238,210)); //设置按钮颜色
jbt4.setFont(f); //设置查询按钮字体样式为f
jbt4.setBackground(new Color(241,232,199)); //设置按钮颜色
jbt5.setFont(f); //设置显示按钮字体样式为f
jbt5.setBackground(new Color(244,237,209)); //设置按钮颜色
jbt6.setFont(f); //设置统计按钮字体样式为f
jbt6.setBackground(new Color(245,238,210)); //设置按钮颜色
jbt7.setFont(f); //设置退出按钮字体样式为f
jbt7.setBackground(new Color(241,232,199)); //设置按钮颜色
jlb7.setFont(f1); //设置JLabel实例jlb7的字体样式为f1
jpl7.setBackground(new Color(244,237,209));
jbt1.setBounds(100,250,255,80); //设置按钮位置
jbt2.setBounds(500,250,255,80); //设置按钮位置
jbt3.setBounds(900,250,255,80); //设置按钮位置
jbt4.setBounds(100,450,255,80); //设置按钮位置
jbt5.setBounds(500,450,255,80); //设置按钮位置
jbt6.setBounds(900,450,255,80); //设置按钮位置
jbt7.setBounds(500,600,255,80); //设置按钮位置
jpl7.setBounds(300,80,800,100); //设置JLabel实例位置
backgroundjpl = new JLayeredPane(); //生成层级面板backgroundjpl
backgroundjpl.add(jplbackground,JLayeredPane.DEFAULT_LAYER);
//将jplbackground容器放入DEFAULT_LAYER层
backgroundjpl.add(jpl7,JLayeredPane.MODAL_LAYER);
//将JLabel实例jpl7放入MODAL_LAYER层
backgroundjpl.add(jbt1,JLayeredPane.MODAL_LAYER);
//将按钮jbt1放入MODAL_LAYER层
backgroundjpl.add(jbt2,JLayeredPane.MODAL_LAYER);
//将按钮jbt2放入MODAL_LAYER层
backgroundjpl.add(jbt3,JLayeredPane.MODAL_LAYER);
//将按钮jbt3放入MODAL_LAYER层
backgroundjpl.add(jbt4,JLayeredPane.MODAL_LAYER);
//将按钮jbt4放入MODAL_LAYER层
backgroundjpl.add(jbt5,JLayeredPane.MODAL_LAYER);
//将按钮jbt5放入MODAL_LAYER层
backgroundjpl.add(jbt6,JLayeredPane.MODAL_LAYER);
//将按钮jbt6放入MODAL_LAYER层
backgroundjpl.add(jbt7,JLayeredPane.MODAL_LAYER);
//将按钮jbt6放入MODAL_LAYER层
this.setLayeredPane(backgroundjpl);
this.setBounds(700,500,backgroungimage.getIconWidth(),backgroungimage.getIconHeight());
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e){
if(e.getActionCommand()=="插入")
{
this.dispose(); //关闭当前界面
// new Insert("插入界面"); //打开插入界面
}
else if(e.getActionCommand()=="删除")
{
this.dispose(); //关闭当前界面
//new Delete("删除界面"); //打开删除界面
}
else if(e.getActionCommand()=="修改")
{
this.dispose(); //关闭当前界面
//new Modify("修改界面"); //打开修改界面
}
else if(e.getActionCommand()=="查询")
{
this.dispose(); //关闭当前界面
//打开查询界面
}
else if(e.getActionCommand()=="显示")
{
this.dispose(); //关闭当前界面
//new Display("显示界面"); //打开插入界面
}
else if(e.getActionCommand()=="统计")
{
this.dispose(); //关闭当前界面
//打开统计界面
}
else if(e.getActionCommand()=="退出")
{
System.exit(0); //退出系统
}
}
}
4 系统难点及实现
4.1 实现
实现同学通讯录这个项目的要求所有功能 | |
最终效果: | 基本实现同学通讯录这个项目的要求所有功能 |
4.2 难点
实验的难点:
一.关于数据存储,实际上题目建议的是用文件来存储数据,但是我们在本项目中利用的数据库(mysql)来存储数据,有以下几个原因
1.用文件来存储当要存储的字段很多时,在文件中存储的会很乱,格式不清特别在取数据时,把数据要放到ArrayList里面,效率极低,并且当有字段为空时会出现严重的问题,造成取数据时字段与数据的移位
2.用文件存储数据在插入数据时一定是要所有信息必须完整才能添加数据,否则显示信息时,若没有全部的信息必然显示出来的数据与我们所添加数据不对应,但是采用数据库时可以不必一次添加所有数据,这样更为符合实际的情况。
3.插入,查询操作还好,但出现修改操作时极为繁琐,代码冗余特别多
4.web课教了一点mysql.既然有现成工具,所以我们索性采用mysql来实现数据的存储
二.当然最主要的难点还是在于对数据库的操作与图形化界面的结合。在图形化界面上实现这个数据的数据增删改查,以及统计和删除,由于在MySQL不熟,在如何连接MySQL和采用jdbc模式上都耗费长时间,在网上看了很多的资料。
三.在如何把所有人的信息显示在界面,我们有过很多分歧,刚开始准备用图形化做分页功能显示,发现分页做起来难度较大,并且不友好,当数据较多时,需要翻很多页。然后我们决定采用直接把数据中的表导出并用excel表格显示,然而发现并没有这样语句可以实现自动导出,也或许数据库版本不对应。最后我们想到了文本区域框,可是文本区域框有如何显示这样多的数据呢?我们决定遍历数据库中所有数据用arraylist进行存储,然后再遍历arraylist把所有的值用字符串拼接起来再组成一个字符串中间加入’\t’和’\n’,最后添加到文本区域框并增加滑动条,以免数据太多而造成在界面上显示不出来。
5 需要的配置
这个项目需要用到mysql数据库 没有的可以点击https://download.csdn.net/download/qq_42239046/10852618下载,
如果需要完整项目,可点击https://download.csdn.net/download/qq_42239046/10917897进行下载内附Java课程设计代码详细注释及课程设计文档可以参考