阶段二,综合项目
Java课程设计
(综合项目文档)
Yoga会员管理系统
二〇二〇年七月
目 录
1 绪论 1
1.1 项目概述 1
1.2 项目意义 1
2 开发工具和相关技术简介 1
2.1 Eclipse简介 2
2.2 Java语言介绍 2
2.3 MySQL简介 3
2.4 JDBC技术简介 3
2.5 GUI简介 3
2.6 IDEA简介 3
3 系统需求分析 4
3.1 系统可行性分析 4
3.2 系统需求分析 4
3.3 组内成员分工 5
3.4 进度安排 5
4 系统设计 6
4.1 系统设计 6
4.2 数据库设计 6
5 系统实现 8
5.1 用户登录界面实现 8
5.2 管理员登录界面实现 20
6 系统测试 34
7 结论和心得 36
1 绪论
1.1 项目概述
普通用户注册后成为会员,登录后可以设置和修改个人信息、查看学时、查看课程安排,课程的价目表,老师的信息表以及签到。
管理员登录系统后可以产看到所有人的信息,可以修改个人信息(学时和消费金额)、课程安排、老师信息、价目表以及查看个人信息(学时及课程)。还可以添加管理员和老师。
1.2 项目意义
解决管理会员时每次需要用纸笔记录出勤记录的问题,更换课程表价目表时也无需再次打印整张实体表。
2 开发工具和相关技术简介
本项目是yoga会员管理系统。开发环境:Eclipse,MySQL,IDEA开发语言:Java语言;开发技术:JDBC,GUI。本章将对开发工具和相关技术进行简单介绍。
2.1 Eclipse简介
Eclipse是一个开放可扩展的集成开发环境(IDE)。它不仅可以用于Java的开发,通过开发插件,它可以构建其他的开发工具。Eclipse是开放源代码的项目,并可以免费下载。
- 非常适合java语言,开发、编写、查错、编译、帮助等各方面非常方便
- 有中文版,上手较快
- 更新速度快
- 插件功能强大,免费
- 开源、免费
2.2 Java语言介绍
Java是由Sun公司于1995年5月推出的面向对象的程序设计语言。
Java继承了C++语言面向对象技术的核心,又舍弃了C++语言中的指针、运算符重载以及多重继承的特性,同时引入了泛型编程、类型安全的枚举等特性,使Java成为简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言。
Java优点
- Java为纯面向对象的语言。
- 平台无关性。
- Java提供了很多内置的类库,通过这些类库,简化了开发人员的程序设计工作,同时缩短了项目的开发时间。
- 提供了对Web应用开发的支持,例如,Applet、Servlet和JSP可以用来开发Web应用程序;Socket、RMI可以用来开发分布式应用程序的类库。
- 具有较好的安全性和健壮性。
- 去除了C++语言中难以理解、容易混淆的特性,例如头文件、指针、结构、单元、运算符重载、虚拟基础类、多重继承等,使得程序更加严谨、简洁。
2.3 MySQL简介
MySQL是最流行的开放源码SQL数据库管理系统,它是由MySQL AB公司开发、发布并支持的。MySQL AB是由多名MySQL开发人创办的一家商业公司。它是一家第二代开放源码公司,结合了开放源码价值取向、方法和成功的商业模型。
体积小、速度快、总体拥有成本低、开放源代码、性能快捷、优化SQL语言、容易使用、多线程和可靠性、多用户支持、可移植性和开放源代码、遵守国际标准和国际化支持、为多种编程语言提供API
2.4 JDBC技术简介
JDBC是java database connectivity的缩写,是SUN公司提供的一套操作数据库的标准规范,其本质也就是一系列的接口。JDBC提供了一些操作数据库的API,开发者可以在java中使用这些API操作数据库,实现对表中数据的增删改查操作,JDBC相当于Java和数据库之间的一座桥梁。
2.5 GUI简介
GUI(Graphics User Interface),中文名称为图形用户界面,是指采用图形方式显示的计算机操作用户界面,是计算机与其使用者之间的对话接口,是计算机系统的重要组成部分。
2.6 IDEA简介
IDEA 全称IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手、代码自动提示、重构、J2EE支持、Ant、JUnit、CVS整合、代码审查、 创新的GUI设计等方面的功能可以说是超常的。IDEA是JetBrains公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。
优点:
1.更好的项目管理方式
2.更高的开发效率
3.历史记录功能
4.动态语法检测
5.丰富的导航模式
3 系统需求分析
3.1 系统可行性分析
1.技术可行性:需要技术:Java语言,GUI以及使用JDBC对进行数据库的增,改,查的操作。所需技术基本掌握,所以技术上可行。
2.经济可行性:使用软件(Eclipse,MySQL)免费, 经济上可行。
3.操作可行性:用户根据界面上显示内容使用键盘录入信息。 操作上可行。
3.2 系统需求分析
普通用户注册后成为会员,登录后可以设置和修改个人信息、查看学时、查看课程安排以及签到。管理员登录系统后可以修改个人信息(学时,是否签到以及课程)、课程安排以及查看个人信息(学时及课程)。
图3-1 用户功能模块图
图3-2 管理员功能模块图
3.3 组内成员分工
表3-1 组内成员分工情况表
序号 |
姓名 |
组内角色 |
小组分工 |
备注 |
1 |
刘庆龙 |
项目经理 |
建立数据库,实现JDBC |
|
2 |
纪凯文 |
编码 |
用户界面 |
|
3 |
田炳豪 |
编码 |
管理员界面 |
|
说明:组内角色:组长为项目经理;其他人分别为编码、测试、架构师等。
3.4 进度安排
进度安排如表3-2所示。
表3-2 进度安排表
阶段 |
持续时间 |
阶段描述 |
输出 |
构思阶段 |
3h |
需求分析 |
需求说明,功能模块图 |
设计阶段 |
4h |
系统设计 |
设计说明-可以画流程图;数据库设计 |
实现阶段 |
10day |
编写代码 |
项目工程源代码 |
4h |
系统测试 |
进行黑盒测试(功能测试)-测试说明 |
|
运行阶段 |
10h |
部署、运行 |
系统使用说明、运维报告-答辩 |
4 系统设计
4.1 系统设计
根据系统的实际功能需求分析,对系统功能部分进行了设计。
登录时如果密码或账户不对应设置了提示窗口,注册时id系统会随机给出,显示id的弹窗会一直存在直到用户手动关闭。用户登录后直接可以看到自己的信息,如果为刚刚注册用户。可以选择“保存/修改信息”按钮来进行信息的补充,课程选择时使用下拉框,让用户可以直接选择而不用再输入课程名称。剩余课时为0时仍可签到,后续选课的课时会剪去课时为0时签到的次数。管理员在修改会员信息时,输出所有注册的会员信息,根据输入的id进行修改课时和消费金额。
4.2 数据库设计
根据系统需求分析设计了7张表,分别为用户信息,用户账号密码表,管理员信息,老师信息表表,签到表,课程表,价目表。具体信息如表4-1到4-7所示。一下为参考,可以按照自己的需求修改
表4-1 用户信息
序号 |
字段名 |
数据类型 |
约束 |
是否为空 |
说明 |
|
1 |
Id |
varchar |
主键 |
否 |
用户id |
可设置 |
2 |
name |
varchar |
|
是 |
用户的姓名 |
|
2 |
age |
int |
|
是 |
用户的年龄 |
|
3 |
sex |
cher |
|
是 |
用户的性别 |
|
4 |
phone |
bigint |
|
是 |
用户的电话 |
|
5 |
card |
varcher |
|
是 |
用户所报课程 |
|
6 |
cost |
int |
|
是 |
消费金额 |
不可设置 |
7 |
times |
int |
|
是 |
用户学时(默认10) |
表4-2 管理员信息
序号 |
字段名 |
数据类型 |
约束 |
是否为空 |
说明 |
1 |
Id |
varchar |
主建 |
否 |
管理员id |
2 |
cipher |
varchar |
|
否 |
管理员密码 |
表4-3 课程表
序号 |
字段名 |
数据类型 |
约束 |
是否为空 |
说明 |
1 |
week |
int |
主键 |
否 |
星期天数 |
2 |
first |
varchar |
|
否 |
星期几的五节课程安排 |
3 |
second |
varchar |
|
否 |
|
4 |
third |
varchar |
|
否 |
|
5 |
fourth |
varchar |
|
否 |
|
6 |
fifth |
varchar |
|
否 |
表4-4 价目表
序号 |
字段名 |
数据类型 |
约束 |
是否为空 |
说明 |
1 |
num |
Int |
主键 |
否 |
课程代码 |
2 |
Id |
varchar |
|
否 |
授课老师id |
3 |
card |
varchar |
|
否 |
课程名称 |
4 |
course |
varchar |
|
否 |
时间(默认“一个疗程”) |
5 |
times |
int |
|
否 |
学时(默认10) |
6 |
price |
int |
|
否 |
价格 |
表4-5 老师信息表
序号 |
字段名 |
数据类型 |
约束 |
是否为空 |
说明 |
1 |
Id |
varchar |
主建 |
否 |
老师员id |
2 |
name |
varchar |
|
否 |
老师姓名 |
3 |
phone |
bigint |
|
否 |
老师电话 |
4 |
rank |
varchar |
|
否 |
老师级别 |
表4-6 签到表
序号 |
字段名 |
数据类型 |
约束 |
是否为空 |
说明 |
1 |
qdid |
varchar |
主键 |
否 |
签到id |
1 |
Id |
varchar |
|
否 |
签到会员id |
2 |
name |
varchar |
|
否 |
签到人姓名 |
3 |
time |
datetime |
|
否 |
签到日期 |
表4-7 密码表
序号 |
字段名 |
数据类型 |
约束 |
是否为空 |
说明 |
1 |
Id |
int |
主键 |
否 |
会员id |
2 |
cipher |
varchar |
|
否 |
密码 |
5 系统实现
5.1 用户登录界面实现
用户通过输入账号密码来进行登录后台管理系统。
用户在输入ID和密码后,系统判断用户所输入的ID在数据库中是否存在,若存在则继续判断密码是否为该ID的正确密码,若密码正确则跳转到用户功能界面,否则会弹出错误提示框,提示用户密码或ID错误。
图5-1 用户登录界面
public boolean customize(String id,String cipher) {
boolean sign=false;
try {
conn=DBUtil.getConnection();
String sql="select id,cipher from cipher where id = ? and cipher = ?";
ps=conn.prepareStatement(sql);
ps.setString(1, id);
ps.setString(2,cipher);
rs=ps.executeQuery();
if(rs.next()) {
sign=true;
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//释放资源
DBUtil.closee(conn, ps, rs);
}
return sign;
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
if (obj == b2){
new Register();
dispose();
}else if (obj == b1) {
String id = tf1.getText();
gdid.setid(id);
String cipher = String.valueOf(pf1.getPassword());
if(i.customize(id, cipher)){
new SaveInformation();
dispose();
}else {
new Error();
//dispose();
}
}else if(obj == b3) {
new Administrators();
dispose();
}
}
public Error(){
GridLayout gridLayout = new GridLayout(0,1,1,1);
this.setLayout(gridLayout);
this.setBackground(Color.WHITE);
this.setBounds(500, 400, 300, 150);
this.setTitle("Error");
p1 = new JPanel();
p2 = new JPanel();
this.add(p1);
this.add(p2);
l1 = new JLabel("账户或密码错误!请重新输入!");
p1.add(l1);
b1 = new JButton("返回");
b1.addActionListener(this);
p2.add(b1);
this.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
if (obj == b1) {
dispose();
}
}
}
图5-2 用户注册界面
public String zc(String cipher) {
String where="cipher";
String id=ot.qtid(where);
mid.setzzid(id);
try {
conn=DBUtil.getConnection();
conn.setAutoCommit(false);
String sql ="insert into cipher(id,cipher) values (?,?)";
ps=conn.prepareStatement(sql);
ps.setString(1, id);
ps.setString(2, cipher);
int count=ps.executeUpdate();
String sql1="insert into vip(id) values (?)";
ps=conn.prepareStatement(sql1);
ps.setString(1, id);
count+=ps.executeUpdate();
System.out.print(count==2 ? "注册成功" : "注册失败");
conn.commit();
} catch (Exception e) {
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally {
DBUtil.closee(conn, ps, rs);
}
return id;
}
public Error2(){
GridLayout gridLayout = new GridLayout(0,1,1,1);
this.setLayout(gridLayout);
this.setBackground(Color.WHITE);
this.setBounds(500, 400, 300, 150);
this.setTitle("Error");
p1 = new JPanel();
p2 = new JPanel();
this.add(p1);
this.add(p2);
l1 = new JLabel("两次密码不一样!请重新输入!");
p1.add(l1);
b1 = new JButton("返回");
b1.addActionListener(this);
p2.add(b1);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
if (obj == b1) {
dispose();
}
}
public GetId(String id){
GridLayout gridLayout = new GridLayout(0,1,1,1);
this.setLayout(gridLayout);
this.setBackground(Color.WHITE);
this.setBounds(500, 400, 300, 150);
this.setTitle("尊敬的会员欢迎您");
p1 = new JPanel();
p2 = new JPanel();
this.add(p1);
this.add(p2);
l1 = new JLabel("您的ID为:("+id+")\n请务必记住");//gdid.getzzid()
p1.add(l1);
b1 = new JButton("返回");
b1.addActionListener(this);
p2.add(b1);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
if (obj == b1) {
dispose();
}
}
图5-3 用户修改信息界面
public void inxx(String id,String name,int age,String sex,long phone) {
try {
conn=DBUtil.getConnection();
String sql="update vip set name = ?,age = ?,sex = ?,phone = ? where id = ?";
ps=conn.prepareStatement(sql);
ps.setString(1, name);
ps.setInt(2, age);
ps.setString(3, sex);
ps.setLong(4, phone);
ps.setString(5, id);
int count=ps.executeUpdate();
} catch (Exception e) {
}finally {
DBUtil.closee(conn, ps, rs);
}
}
图5-4 用户课程选择界面
图5-5 用户查询信息界面
public class QueryClassHour extends JFrame implements ActionListener {
private JTextArea ta;
private JButton b1;
private JPanel p1,p2;
Outbiao ot=new Outbiao();
MadeId gdid=new MadeId();
String id=gdid.getid();
private String [] key =ot.outvip(id);
public QueryClassHour(){
GridLayout gridLayout = new GridLayout(0, 1, 1, 1);
this.setLayout(gridLayout);
this.setBackground(Color.WHITE);
this.setBounds(600, 400, 400, 500);
this.setTitle("尊敬的会员欢迎您");
p1 = new JPanel();
p2 = new JPanel();
this.add(p1);
this.add(p2);
ta = new JTextArea("您当前课程为:"+key[0]+"\n您剩余课时为:"+key[1]+"\n消费金额:"+key[2]);
ta.setEditable(false);
b1 = new JButton("返回");
b1.addActionListener(this);
p1.add(ta);
p2.add(b1);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
if (obj == b1) {
new SaveInformation();
dispose();
}
}
}
public String[] outxx(String id) {
String[] xx=new String[4];
try {
conn=DBUtil.getConnection();
String sql="select name,sex,age,phone from vip where id = ?";
ps=conn.prepareStatement(sql);
ps.setString(1, id);
rs=ps.executeQuery();
if(rs.next()) {
xx[0]=rs.getString("name");
xx[1]=rs.getString("sex");
xx[2]=rs.getString("age");
xx[3]=rs.getString("phone");
}
} catch (Exception e) {
e.printStackTrace();
}finally {
DBUtil.closee(conn, ps, rs);
}
return xx;
图5-6 用户查询表格界面
三张表格输出代码基本一致,此处以价目表的代码为例。
public String[][] outjm() {
String[][] xx=new String [13][6];
try{
conn=DBUtil.getConnection();
String sql="select kcid,lsid,card,course,times,prices from jiamubiao";
ps=conn.prepareStatement(sql);
rs=ps.executeQuery();
for(int i=0;rs.next();i++) {
String c=rs.getString("kcid");
String id=rs.getString("lsid");
String cd=rs.getString("card");
String cr=rs.getString("course");
String t=rs.getString("times");
String p=rs.getString("prices");
xx[i][0]=c;
xx[i][1]=id;
xx[i][2]=cd;
xx[i][3]=cr;
xx[i][4]=t;
xx[i][5]=p;
}
} catch (Exception e) {
}finally {
DBUtil.closee(conn, ps, rs);
}
return xx;
}
public class PriceList extends JFrame implements ActionListener {
Outbiao o=new Outbiao();
String[] ifm = new String[]{"课程ID","老师ID","课程","疗程","课时","价格"};
String[][] pri = o.outjm();
private JButton b1;
private JPanel p1,p2;
private JTable t1;
private JScrollPane sp;
public PriceList(){
GridLayout gridLayout = new GridLayout(0, 1, 1, 1);
this.setLayout(gridLayout);
this.setBackground(Color.WHITE);
this.setBounds(600, 400, 550, 500);
this.setTitle("尊敬的会员欢迎您");
p1 = new JPanel();
p2 = new JPanel();
this.add(p1);
this.add(p2);
t1 = new JTable(pri,ifm);
sp = new JScrollPane(t1){
@Override
public Dimension getPreferredSize() {
return new Dimension(450, 200);
}
};
t1.setEnabled(false);
b1 = new JButton("返回");
b1.addActionListener(this);
p1.add(sp);
p2.add(b1);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
if (obj == b1) {
dispose();
}
}
}
图5-7 用户签到成功提示界面
public class OutId {
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
ZaXiang z=new ZaXiang();
public String sjid() {
String newid="null";
try {
conn=DBUtil.getConnection();
int sign=1;
String sql="select qdid from qiandao";
ps=conn.prepareStatement(sql);
rs=ps.executeQuery();
while(sign==1) {
int sign2=0;
newid=z.outid();
while(rs.next()) {
String i=rs.getString("qdid");
if(newid==i) {
sign2++;
}
if(sign2==0) {
sign=0;
}
}
}
System.out.println(newid);
} catch (Exception e) {
}finally {
DBUtil.closee(conn, ps, rs);
}
return newid;
}
public class QianDao {
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
ZaXiang z=new ZaXiang();
OutId qd=new OutId();
Change cg=new Change();
public void qd(String id) {
try {
conn=DBUtil.getConnection();
String qdid=qd.sjid();
String name=null ;
String time=z.time();
cg.cgtimes(id);
String sql1="select id,name from vip where id=?";
ps=conn.prepareStatement(sql1);
ps.setString(1, id);
rs=ps.executeQuery();
if(rs.next()) {
String nm=rs.getString("name");
System.out.print(nm);
name=nm;
String sql="insert into qiandao(qdid,id,name,time) values(?,?,?,?)";
ps=conn.prepareStatement(sql);
ps.setString(1, qdid);
ps.setString(2, id);
ps.setString(3, name);
ps.setString(4, time);
int count=ps.executeUpdate();
} catch (Exception e) {
}finally {
DBUtil.closee(conn, ps, rs);
}
}
}
public void cgtimes(String id) {
try {
conn=DBUtil.getConnection();
int i = 10;
String sql="select id,times from vip where id = ?";
ps=conn.prepareStatement(sql);
ps.setString(1, id);
rs=ps.executeQuery();
if(rs.next()) {
i=rs.getInt("times");
i-=1;
}
String sql1="update vip set times = ? where id = ?";
ps=conn.prepareStatement(sql1);
ps.setInt(1, i);
ps.setString(2, id);
int count = ps.executeUpdate();
} catch (Exception e) {
}finally {
DBUtil.closee(conn, ps, rs);
}
}
5.2 管理员登录界面实现
图5-8 管理员登录界面
public class Administrators extends JFrame implements ActionListener {
GLin in=new GLin();
private JTextField tf1;
private JPasswordField pf1;
private JLabel l1,l2;
private JButton b1;
private JPanel p1,p2,p3;
public Administrators(){
GridLayout gridLayout = new GridLayout(0,1,1,1);
this.setLayout(gridLayout);
this.setBackground(Color.WHITE);
this.setBounds(400, 200, 400, 400);
this.setTitle("管理员登陆页");
p1 = new JPanel();
p2 = new JPanel();
p3 = new JPanel();
this.add(p1);
this.add(p2);
this.add(p3);
tf1 = new JTextField(10);
pf1 = new JPasswordField(10);
pf1.setEchoChar('*');
l1 = new JLabel("ID");
l2 = new JLabel("Password");
p1.add(l1);p1.add(tf1);
p2.add(l2);p2.add(pf1);
b1 = new JButton("登陆");
b1.addActionListener(this);
p3.add(b1);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
if(obj==b1) {
String id=tf1.getText();
String cipher=String.valueOf(pf1.getPassword());
if(in.denglu(id, cipher)) {
new GlyXiuGai();
dispose();
}else {
new Error();
}
}
}
}
public boolean denglu (String id,String cipher) {
boolean sign=false;
try {
conn=DBUtil.getConnection();
String sql="select id,cipher from administrator where id = ? and cipher = ?";
ps=conn.prepareStatement(sql);
ps.setString(1, id);
ps.setString(2,cipher);
rs=ps.executeQuery();
if(rs.next()) {
sign=true;
}
} catch (Exception e) {
e.printStackTrace();
}finally{
DBUtil.closee(conn, ps, rs);
}
return sign;
}
图5-9 管理员选择功能界面界面
public class GlyXiuGai extends JFrame implements ActionListener {
private JButton b1,b2,b3,b4,b5,b6,b7,b8;
private JPanel p1,p2,p3,p4,p5,p6,p7,p8;
public GlyXiuGai(){
GridLayout gridLayout = new GridLayout(0,1,1,1);
this.setLayout(gridLayout);
this.setBackground(Color.WHITE);
this.setBounds(400, 200, 400, 400);
this.setTitle("管理员修改");
p1 = new JPanel();
p2 = new JPanel();
p3 = new JPanel();
p4 = new JPanel();
p5 = new JPanel();
p6 = new JPanel();
p7 = new JPanel();
p8 = new JPanel();
this.add(p1);
this.add(p2);
this.add(p3);
this.add(p4);
this.add(p5);
this.add(p6);
this.add(p7);
this.add(p8);
b1 = new JButton("修改课程表");
b2 = new JButton("修改价目表");
b3 = new JButton("修改老师信息");
b4 = new JButton("查看签到表");
b5 = new JButton("修改会员课程课时");
b7 = new JButton("添加管理员");
b8 = new JButton("添加老师");
b6 = new JButton("退出");
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
b4.addActionListener(this);
b5.addActionListener(this);
b6.addActionListener(this);
b7.addActionListener(this);
b8.addActionListener(this);
p1.add(b1);
p2.add(b2);
p3.add(b3);
p4.add(b4);
p5.add(b5);
p6.add(b7);
p7.add(b8);
p8.add(b6);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
if(obj==b1){
new ModifyClassScheduleCard();
dispose();
}else if(obj==b2){
new ModifyPrice();
dispose();
}else if(obj==b3){
new MotifyTeacherInformation();
dispose();
}else if(obj==b4){
new Qiandao();
dispose();
}else if(obj==b5){
new ModifyLessonTime();
dispose();
}else if(obj==b7){
new Tianjia();
dispose();
}else if(obj==b8){
new Addteacher();
dispose();
}else if(obj==b6){
new Administrators();
dispose();
}
}
}
图5-10 管理员修改课表,价目表,老师信息界面
三次修改代码基本一致,此处以修改课程表的代码为例。
public ModifyClassScheduleCard(){
GridLayout gridLayout = new GridLayout(0,1,1,1);
this.setLayout(gridLayout);
this.setBackground(Color.WHITE);
this.setBounds(500, 300, 400, 400);
this.setTitle("修改课程表");
p1 = new JPanel();
p2 = new JPanel();
p3 = new JPanel();
p4 = new JPanel();
p5 = new JPanel();
p6 = new JPanel();
p7 = new JPanel();
this.add(p1);
this.add(p2);
this.add(p3);
this.add(p4);
this.add(p5);
this.add(p6);
this.add(p7);
tf2 = new JTextField(10);
tf3 = new JTextField(10);
tf4 = new JTextField(10);
tf5 = new JTextField(10);
tf6 = new JTextField(10);
l1 = new JLabel("星期数");
l2 = new JLabel("第一节课");
l3 = new JLabel("第二节课");
l4 = new JLabel("第三节课");
l5 = new JLabel("第四节课");
l6 = new JLabel("第五节课");
String [] week = {"星期一","星期二","星期三","星期四","星期五","星期六","星期日"};
cb = new JComboBox(week);
p1.add(l1);p1.add(cb);
p2.add(l2);p2.add(tf2);
p3.add(l3);p3.add(tf3);
p4.add(l4);p4.add(tf4);
p5.add(l5);p5.add(tf5);
p6.add(l6);p6.add(tf6);
b1 = new JButton("确认修改");
b1.addActionListener(this);
p7.add(b1);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
int week=cb.getSelectedIndex();
String lesson1=tf2.getText();
String lesson2=tf3.getText();
String lesson3=tf4.getText();
String lesson4=tf5.getText();
String lesson5=tf6.getText();
Object obj = e.getSource();
if(obj==b1) {
int sign=glg.gaikb(week, lesson1, lesson2, lesson3, lesson4, lesson5);
if(sign==1) {
new Error2();
}
new GlyXiuGai();
dispose();
}
图5-10 管理员添加管理员和老师界面
以添加管理员为例:
public void addgl(String id,String cipher) {
try {
conn=DBUtil.getConnection();
String sql="insert into administrator(id,cipher) values(?,?)";
ps=conn.prepareStatement(sql);
ps.setString(1, id);
ps.setString(2, cipher);
int count=ps.executeUpdate();
} catch (Exception e) {
}finally {
DBUtil.closee(conn, ps, rs);
}
}
图5-10 管理员修改会员课时和消费界面
public class ModifyLessonTime extends JFrame implements ActionListener{
MadeId zzid=new MadeId();
GlCha glc=new GlCha();
GlChange glg=new GlChange();
String[] title = new String[] {"ID","姓名","性别","年龄","电话号码","所选课程","剩余课时","消费金额"};
String[][] course = glc.vip();
private JButton b1;
private JPanel p1,p2;
private JTable t1;
private JScrollPane sp;
private JLabel l1;
private JTextField tf1;
public ModifyLessonTime(){
GridLayout gridLayout = new GridLayout(0, 1, 1, 1);
this.setLayout(gridLayout);
this.setBackground(Color.WHITE);
this.setBounds(600, 400, 600, 500);
this.setTitle("课程时间");
p1 = new JPanel();
p2 = new JPanel();
this.add(p1);
this.add(p2);
tf1 = new JTextField(10);
l1 = new JLabel("会员ID");
t1 = new JTable(course,title);
sp = new JScrollPane(t1){
public Dimension getPreferredSize() {
return new Dimension(550, 200);
}
};
t1.setEnabled(false);
b1 = new JButton("确定");
b1.addActionListener(this);
p1.add(sp);
p2.add(l1);p2.add(tf1);p2.add(b1);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
String id=tf1.getText();
zzid.setzzid(id);
if (obj == b1) {
if(glg.foundid(id)) {
new ModifyLessonTime2();
dispose();
}
else {
new Error1();
}
}
}
}
public boolean foundid(String id) {
boolean sign=false;
try {
conn=DBUtil.getConnection();
String sql="select id from vip where id = ? ";
ps=conn.prepareStatement(sql);
ps.setString(1, id);
rs=ps.executeQuery();
if(rs.next()) {
sign=true;
}
} catch (Exception e) {
}finally {
DBUtil.closee(conn, ps, rs);
}
return sign;
}
public String outname(String id) {
String name=null;
try {
conn=DBUtil.getConnection();
String sql="select name from vip where id = ?";
ps=conn.prepareStatement(sql);
ps.setString(1, id);
rs=ps.executeQuery();
if(rs.next()) {
String nm=rs.getString("name");
name=nm;
}
} catch (Exception e) {
}finally {
DBUtil.closee(conn, ps, rs);
}
return name;
}
6 系统测试
表6-1 用户功能模块测试
编号 |
测试功能 |
输入描述 |
预期结果 |
运行结果 |
01 |
保存/修改信息 |
1.登录管理系统 2.点开保存/修改信息界面 3.输入相应的信息 4.点击确定保存 |
信息保存或被修改 |
正常,与预期结果一致 |
02 |
查看课程表 |
5.1.登录管理系统 2.点开查看课程表 |
以表格形式输出课程表 |
正常,与预期结果一致 |
03 |
查看价目表 |
1.登录管理系统 2.点开查看价目表 |
以表格形式输出价目表 |
正常,与预期结果一致 |
04 |
查看老师信息 |
1.登录管理系统 2.点开查看老师信息 |
以表格形式输出老师信息 |
正常,与预期结果一致 |
05 |
查看个人课时和消费 |
1.登录管理系统 2.点开查看课时 |
输出剩余课时和消费金额 |
正常,与预期结果一致 |
06 |
签到 |
1.登录管理系统 2.点击签到 |
签到,课时减一,并提示 |
正常,与预期结果一致 |
表6-2 管理员功能模块测试
编号 |
测试功能 |
输入描述 |
预期结果 |
运行结果 |
01 |
修改课程表信息 |
1.登录管理员系统界面 2.点开修改课程表信息界面 3.输入相应的信息 4.点击确定保存 |
信息被修改 |
正常,与预期结果一致 |
02 |
修改价目表 |
1.登录管理员系统界面 2.点开修改价目表信息界面 3.输入相应的信息 4.点击确定保存 |
信息被修改 |
正常,与预期结果一致 |
03 |
修改老师信息 |
1.登录管理员系统界面 2.点开修改老师信息界面 3.输入相应的信息 4.点击确定保存 |
信息被修改 |
正常,与预期结果一致 |
04 |
添加管理员或老师 |
1.登录管理员系统界面 2.点开添加管理员或点开添加老师 3.输入相应信息 |
信息添加至数据库 |
正常,与预期结果一致 |
05 |
修改会员课时和消费 |
1..登录管理员系统界面 2.点开修改会员课时和消费 3.输入要修改的会员的id 4.跳转至修改界面,输入相应信息 |
信息被修改 |
正常,与预期结果一致 |
7 结论和心得
刘庆龙:
心得:对一个项目要思考的更全面,在着手于项目时,要先尽可能考虑到将要出现的问题。对面向对象的编程思想也有了进一步的认识。
纪凯文:
心得:经过这次合作,我补充了更多关于Java的新知识也和搭档更加默契了,对Java的学习也更加有信心了。对于程序的设计更加熟练了,想做出一个完美的程序还是需要思考很多地方,既要方便用户,同时也要优化代码。
田炳豪:
心得:出错不能慌,耐心查找错误,学会运用身边资源找出自身不足,并学会新的知识加以运用,经过努力后解决问题的过程总能让人受益匪浅。