目录
第一章 前言
1.1 定制化开发背景和意义
近年来,定制化开发在中国市场上KTV定制化开发娱乐业是当今市场化程定制化开发度最高的行业之一,定制化开发伴随着娱乐市场的迅速升温,各大KTV定制化开发商家竞争激烈性不言而喻。定制化开发在竞争的巨大压力下去了解、适应、定制化开发占领和创造市场,不断丰富KTV经营内容,定制化开发革新经营模式,定制化开发提高服务质量,定制化开发开拓新型市场,定制化开发才能在激烈的市场竞争定制化开发中处于不败之地。KTV定制化开发管理系统不仅能解决KTV定制化开发在管理和经营上的一些问题,定制化开发也能更好的为消费者提定制化开发供一个良好的体验环境。
1.2 设计目标
定制化开发本系统设计初衷是希望定制化开发在快节奏的时代,定制化开发不论是家庭,定制化开发还是工作场所,定制化开发亦或是学校,定制化开发在业余时候,定制化开发人们能找到一种释放压定制化开发力疲惫的娱乐方式。顾客来到KTV定制化开发一定会开包房消费,定制化开发但是包房会有大小之分,定制化开发不同类型的包房价格也不同。定制化开发本系统希望可以按照顾定制化开发客的需求进定制化开发行包房分配,定制化开发并且及时知道包房剩余状态,定制化开发更方便服务员快捷的进行包房分配,定制化开发并且服务员可以了解顾定制化开发客的个人信息,定制化开发可以准确地为顾客提供服务。
第2章 定制化开发数据库设计
2.1 需求分析
定制化开发需求分析也称为软件需求分析、定制化开发系统需求分析或需求分析工程等,定制化开发是开发人员经过深入细定制化开发致的调研和分析,定制化开发准确理解用户和项目的功能、性能、定制化开发可靠性等具体要求,定制化开发将用户非形式的需求表定制化开发达转化为完整的需求定义,定制化开发从而确定系统必须做什么的过程。
定制化开发通过实际调查,定制化开发本系统需要具备:
- 定制化开发良好的人机交互界面
- 定制化开发方便用户预定KTV定制化开发房间以及酒水消费等
- 定制化开发如果系统使用用户多,定制化开发有较好的权限管理
- 方便添加、删除、定制化开发修改和查询数据
2.1.1 功能概述
经分析,KTV定制化开发管理系统应具备以下功能模块:
1)用户方面,定制化开发定制化开发定制化开发功能要求如下:
- 定制化开发定制化开发定制化开发可以查看并修改个人信息
- 定制化开发可以查看并预定KTV房间
- 定制化开发可以查看并取消预定情况记录
2)定制化开发服务员方面,功能要求如下:
- 可以查看并修改个人信息
- 定制化开发可以查看并修改顾客预约情况
- 定制化开发可以为顾客安排房间
- 定制化开发可以查看顾客信息
- 可以查看KTV定制化开发房间预约情况
- 定制化开发可以查看顾客历史预约记录表
3)定制化开发管理员方面,功能要求如下:
- 可以查看并修改个人信息
- 定制化开发可以对服务员信息进行维护,定制化开发定制化开发定制化开发包括增删改查
- 可以对KTV定制化开发房间进行维护,包括增删改查
- 定制化开发可以对所有地用户进行管理,包括增删改
定制化开发主要功能模块图如下图2.1所示:
图2.1.1 定制化开发系统总功能模块图
2.1.2 用例图
图2.1.2 用例图
2.1.3 用例描述
表1 定制化开发顾客管理用例描述表
ID | A1 | 名称 | 顾客管理 |
参与者 | 管理员,定制化开发目标是能够管理顾客 | ||
优先级 | 高 | ||
触发条件 | 定制化开发管理员需要管理顾客信息 | ||
前置条件 | 定制化开发用户已登录,定制化开发且身份为管理员 | ||
后置条件 | 无 | ||
正常流程 | 1、定制化开发用户输入顾客信息,查询 2、定制化开发定制化开发定制化开发系统判断数据库内是否定制化开发存在信息相同的顾客 3、系统判断数据库内是否定制化开发存在账号相同的顾客 4、定制化开发系统授权增加 5、定制化开发系统提示增加成功 6、定制化开发系统向管理员表明增加定制化开发顾客信息成功 7、定制化开发用户输入顾客姓名,搜索 8、系统判断数据库内是否定制化开发存在该名字的顾客 9、定制化开发用户修改顾客信息 10、定制化开发系统判断管理员输入信定制化开发息是否合法 11、定制化开发用户删除顾客信息 | ||
扩展流程 | 3a:定制化开发存在账号相同顾客 2a1:定制化开发系统提示该顾客已存在,定制化开发定制化开发并给出解决方案 8a:定制化开发不存在该名字的顾客 8a1:定制化开发系统提示该顾客不存在,并给出解决方案 10a:输入修改信息不合法 10a1:系统提示输入信息不合法,并给出解决方案 | ||
特殊需求 | 给出的提示信息应当足够清晰,提示管理员操作失败的原因,并给出解决方案。 |
表2 服务员管理用例描述表
ID | A2 | 名称 | 服务员管理 |
参与者 | 管理员,目标是能够管理服务员 | ||
优先级 | 高 | ||
触发条件 | 管理员需要管理服务员信息 | ||
前置条件 | 用户已登录,且身份为管理员 | ||
后置条件 | 无 | ||
正常流程 | 1、用户输入新增服务员信息,提交 2、系统判断输入信息是否合法 3、系统增加服务员信息 4、系统提示增加成功 5、用户输入修改信息 6、系统判断修改信息是否合法 7、系统向用户表明修改成功 8、用户删除服务员信息 | ||
扩展流程 | 2a:输入信息不合法 2a1:系统提示输入信息不合法,并给出解决方案 5a:修改信息不合法 5a1:系统提示修改信息不合法,并给出解决方案 | ||
特殊需求 | 给出的提示信息应当足够清晰,提示管理员操作失败的原因,并给出解决方案。 |
表3 KTV房间管理用例描述表
ID | A3 | 名称 | KTV房间管理 |
参与者 | 管理员,目标是能够管理KTV房间 | ||
优先级 | 高 | ||
触发条件 | 管理员需要管理KTV房间信息 | ||
前置条件 | 用户已登录,且身份为管理员 | ||
后置条件 | 无 | ||
正常流程 | 1、用户删除KTV房间 2、系统向用户表明删除成功 3、用户输入修改信息 4、系统判断修改信息是否合法 5、系统向用户表明修改成功 6、用户输入房间号,提交 7、系统判断数据库内是否存在房间号相同的KTV房间 8、系统授权增加 9、系统提示增加成功 | ||
扩展流程 | 4a:修改信息不合法 4a1:系统提示输入信息不合法,并给出解决方案 7a:存在房间号相同的房间 7a1:系统提示该房间已存在,并给出解决方案 | ||
特殊需求 | 给出的提示信息应当足够清晰,提示管理员操作失败的原因,并给出解决方案。 |
表4 房间预约用例描述表
ID | U1 | 名称 | 房间预约 | ||
参与者 | 用户,目标是能够预约房间和时间 | ||||
优先级 | 高 | ||||
触发条件 | 用户需要预约房间 | ||||
前置条件 | 用户已登录 | ||||
后置条件 | 无 | ||||
正常流程 | 1、用户搜索房间 2、系统判断房间是否存在 3、用户选择房间和预约时间 4、用户输入账号和姓名,确认预约 5、系统提示预约成功 6、用户查看预约信息 7、用户取消预约 8、用户查看预约记录 | ||||
扩展流程 | 2a:搜索的房间不存在 2a1:系统提示房间不存在 | ||||
特殊需求 | 给出的提示信息应当足够清晰,提示管理员操作失败的原因,并给出解决方案。 |
表5 房间使用记录信息管理用例描述表
ID | W1 | 名称 | 房间使用记录 | ||
参与者 | 服务员,目标是能够查看顾客情况和预约房间 | ||||
优先级 | 高 | ||||
触发条件 | 服务员需要查看顾客情况和预约房间 | ||||
前置条件 | 用户已登录,且身份为服务员 | ||||
后置条件 | 无 | ||||
正常流程 | 1、用户预约房间 2、系统判断房间是否正在被使用 3、系统提示预约成功 4、用户查看预约房间情况 5、用户修改房间预约信息 6、系统判断修改信息是否合法 7、系统向用户表明修改成功 | ||||
扩展流程 | 2a:房间正在被使用 2a1:系统提示该房间正在被使用 6a:修改信息不合法 6a1:系统提示输入信息不合法,并给出解决方案 | ||||
特殊需求 | 给出的提示信息应当足够清晰,提示管理员操作失败的原因,并给出解决方案。 |
表6 管理个人信息用例描述表
ID | AWU1 | 名称 | 管理个人信息 | ||||
参与者 | 所有身份,目标是修改个人账号和密码 | ||||||
优先级 | 高 | ||||||
触发条件 | 用户需要修改个人信息 | ||||||
前置条件 | 用户已登录 | ||||||
后置条件 | 无 | ||||||
正常流程 | 1、用户输入新的账号 2、系统判断新账号是否与数据库内其余用户账号重复 3、系统提示修改成功 4、用户输入新的密码 5、系统判断新的密码与旧的密码是否一致 6、系统提示修改成功 | ||||||
扩展流程 | 2a:数据库内也已存在同名账号 2a1:系统提示账号重复 5a:新的密码与旧的密码一致 5a1:系统提示密码与之前一致,重新输入 | ||||||
特殊需求 | 给出的提示信息应当足够清晰,提示管理员操作失败的原因,并给出解决方案。 |
2.2 概念结构设计
2.2.1 实体列表
表2.2.1 实体列表
实体 | 描述 |
顾客 | 所有的顾客信息,由顾客账号唯一标识 |
服务员 | 所有的服务员信息,由服务员工号唯一标识 |
KTV房间 | 所有的KTV房间信息,由房间号唯一标识 |
预约单 | 所有的预约信息,由单号唯一标识 |
用户登录 | 所有的用户信息,包含顾客、服务员、管理员,由用户账号唯一标识 |
2.2.2 系统E-R模型
KTV管理系统的E-R模型,如下图所示。其中,重要关系局部E-R图如下图,全局的E-R图如下图。
图2. 2. 1 顾客-预约单E-R图
图2. 2. 2 服务员-KTV房间E-R图
图2. 2. 3 顾客-服务员E-R图
图2. 2. 4 顾客-KTV房间E-R图
图2. 2. 5 KTV管理系统全局E-R图
2.3 逻辑结构设计
本系统的关系模式如下(加粗下划线表示主码,斜体下划线表示外码):
- 顾客信息表(账号,工号,姓名,性别,身份证号,联系电话)
- 服务员信息表(工号,姓名,性别,电话)
- KTV房间表(房间号,账号,工号,房间价格,推荐人数,房间状态)
- 房间预约单表(单号,顾客账号,顾客姓名,房间号,价格)
- 房间使用记录表(账号,房间号,开始使用时间,结束使用时间)
- 用户登录表(账号,密码,身份)
将系统的E-R图转换为数据库模式如下:
图2. 3. 1 顾客信息表
图2. 3. 2 服务员信息表
图2. 3. 3 KTV房间表
图2. 3. 4 房间预约单表
图2. 3. 5 房间使用记录表
图2. 3. 6 用户登录表
2.4 关系模式规范化检查及处理
范式是符合某一种级别的关系模式的集合。关系数据库中的关系必须满足一定的要求,满足不同程度要求的为不同范式。
第一范式(1NF):在任何一个关系数据库中,第一范式是对关系模式的基本要求,不满足第一范式的数据库就不是关系数据库。如果一个关系模式R的所有属性都是不可分的基本数据项,则称该关系模式满足第一范式,记作R∈1NF。
第二范式(2NF):第二范式是在第一范式(1NF)的基础上建立起来的,既满足第二范式必须先满足第一范式。若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于任何一个候选码,则R∈2NF。
第三范式(3NF):满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式要求一个数据库表中不包含已在其他表中已包含的非主关键字的信息。设关系模式R<U,F>∈1NF,如果R中不存在候选码X、属性组Y以及非主属性Z(Z ⊄Y),使得X →Y(反之不可推出),Y→Z成立,则R∈3NF。
BCNF(BC范式):关系模式R<U,F>∈1NF,若X→Y且Y ⊄X时,X必含有码,则R<U,F>∈BCNF。
根据上述的要求,将本数据库的关系模式进行规范化检查,如下:
顾客信息表(账号,姓名,性别,身份证号,联系电话)
该表的码为:账号
函数依赖:账号→姓名,账号→性别,账号→身份证号,账号→联系电话
由该表函数依赖分析可知,不存在对候选码的部分依赖,满足2NF;不存在传递依赖,满足3NF,每一个决定属性因素都包含码,满足BCNF。
服务员信息表(工号,姓名,性别,电话)
该表的码为:工号
函数依赖:工号→姓名,工号→性别,工号→电话
由该表函数依赖分析可知,不存在对候选码的部分依赖,满足2NF;不存在传递依赖,满足3NF,每一个决定属性因素都包含码,满足BCNF。
KTV房间表(房间号,房间价格,推荐人数,房间状态)
该表的码为:房间号
函数依赖:房间号→房间价格,房间号→推荐人数,房间号→房间状态
由该表函数依赖分析可知,不存在对候选码的部分依赖,满足2NF;不存在传递依赖,满足3NF,每一个决定属性因素都包含码,满足BCNF。
房间预约单表(单号,顾客账号,顾客姓名,房间号,价格)
该表的码为:单号
函数依赖:单号→顾客账号,单号→顾客姓名,单号→房间号,单号→价格
由该表函数依赖分析可知,不存在对候选码的部分依赖,满足2NF;不存在传递依赖,满足3NF,每一个决定属性因素都包含码,满足BCNF。
房间使用记录表(账号,房间号,开始使用时间,结束使用时间)
该表的码为:账号,房间号
函数依赖:(账号,房间号)→开始使用时间,(账号,房间号)→结束使用时间
由该表函数依赖分析可知,不存在对候选码的部分依赖,满足2NF;不存在传递依赖,满足3NF,每一个决定属性因素都包含码,满足BCNF。
用户登录表(账号,密码,身份)
该表的码为:账号
函数依赖:账号→密码,账号→身份
由该表函数依赖分析可知,不存在对候选码的部分依赖,满足2NF;不存在传递依赖,满足3NF,每一个决定属性因素都包含码,满足BCNF。
第3章 数据库定义与操作
3.1 数据库及数据表定义
数据库的创建:
- CREATE DATABASE manage
数据表的创建及定义:
- 使用查询语句SHOW CREATE TABLE 表名
- 顾客信息表
- CREATE TABLE `customer` (
-
- `customer_id` varchar(255) NOT NULL,
-
- `customer_name` varchar(255) NOT NULL,
-
- `customer_sex` varchar(255) default NULL,
-
- `customer_idcard` varchar(255) NOT NULL,
-
- `customer_phone` varchar(255) NOT NULL,
-
- PRIMARY KEY (`customer_id`)
-
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8
- 服务员信息表
- CREATE TABLE `waiter` (
-
- `waiter_id` varchar(255) NOT NULL,
-
- `waiter_name` varchar(255) NOT NULL,
-
- `waiter_sex` varchar(255) NOT NULL,
-
- `waiter_phone` varchar(255) NOT NULL,
-
- PRIMARY KEY (`waiter_id`)
-
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8
- KTV房间表
- CREATE TABLE `room` (
- `room_id` varchar(255) NOT NULL,
- `room_price` double(255,0) NOT NULL,
- `room_number` varchar(255) NOT NULL,
- `room_conditon` varchar(255) NOT NULL,
- PRIMARY KEY (`room_id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8
- 房间预约单表
- CREATE TABLE `bill` (
- `bill_id` int(255) NOT NULL auto_increment,
- `bill_user` varchar(255) NOT NULL,
- `bill_name` varchar(255) NOT NULL,
- `bill_room` varchar(255) NOT NULL,
- `bill_price` double(255,0) NOT NULL,
- PRIMARY KEY (`bill_id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=61 DEFAULT CHARSET=utf8
- 房间使用记录表
- CREATE TABLE `record` (
- `record_id` varchar(255) NOT NULL,
- `record_room` varchar(255) NOT NULL,
- `record_firsttime` varchar(255) NOT NULL,
- `record_endtime` varchar(255) NOT NULL,
- PRIMARY KEY (`record_id`,`record_room`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8
- 用户登录表
- CREATE TABLE `login` (
- `user` varchar(255) NOT NULL,
- `password` varchar(255) NOT NULL,
- `identify` varchar(255) NOT NULL,
- PRIMARY KEY (`user`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8
3.2 数据查询操作
由于表名字和属性过长,股灾写关系代数时将部分表名字和属性简写,规则如下:
表3.2.1 名称简写表
原名 | 简写 | 原名 | 简写 |
waiter | w | customer_phone | c_p |
customer | c | customer_id | c_i |
room | r | customer_name | c_n |
record | re | customer_idcard | c_id |
bill_r | b_r | record_firsttime | re_f |
bill_id | b_i | record_endtime | re_e |
bill_user | b_u | record_room | re_r |
bill_price | b_p | room_id | r_i |
room_condition | r_c |
- 查询登录账号为11对应的顾客姓名:
- 查询登录账号为s对应的预约编号:
- 查询预约了房间号为A003的顾客联系方式:
- 查询登录账号为xyr预约的顾客身份证号、房间号以及价格:
- 查询登录账号为xxx预约的房间状态、开始使用时间以及结束时间:
πr_c,re_f,re_e(σuser='xxx'(login)⋈πb_u,b_r(bill)⋈πr_i,r_c(r)⋈πre_r,re_f,re_e(re))
3.2.2 SQL实现
1)
- SELETE customer_name FROM customer
- WHERE customer_id IN (SELETE user FROM login
- WHERE user = ‘11’)
2)
- SELECT bill_id FROM bill
- WHERE bill_user IN (SELETE user FROM login
- WHERE user = ‘s’)
3)
- SELECT customer_phone FROM customer
- WHERE customer_id IN (SELETE bill_user,bill_room FROM bill
- WHERE bill_room = ‘A003’)
4)
- SELECT login.user ,c. c_i, c.id,bill.b_u,b_r,b_p
- FROM login,c,bill
- WHERE login.user = c.c_i AND c.c_i = bill.b_u AND login.user = bill.b_u
- AND login_user = ‘xyr’
-
5)
- SELECT login.user,r.r_c,re.re_i,re.re_r,re.re_f,re.re_e
- FROM login,r,re
- WHERE login.user = re.i AND re.re_r = r.r_id AND login.user = ‘xxx’
4)5)两部分的SQL语句比较多,所以使用了关系代数表格中的简写。
3.3 数据增删改操作
- 数据增加
- (1)INSERT INTO room VALUES(‘A010’, ‘200’, ‘6’, ‘空闲中’)
- (2)INSERT INTO customer VALUES (‘1234’, ’Lily’, ‘女’, ‘330881200111011312’, ‘17816653172’)
- (3)INSERT INTO bill VALUES(?, ‘1234’, ‘Daming’, ‘A004’, ‘200’)
- (4)INSERT INTO login VALUES(‘login’, ‘root’, ‘顾客’)
- (5)INSERT INTO record VALUES(‘123’, ‘A011’, ’12:35’, ’17:55’)
- 数据删除
- (1)DELETE FROM customer
- where customer.customer_id =
- (
- select user from login
- )
- (2)DELETE FROM record
- where record_id =
- (
- selste user from login
- )
- (3)delete from room
- where room_id = ‘A002’
- (4)delete from login
- where identify = ‘顾客’
- (5)delete from login
- where identify = ‘顾客’
- 数据修改
- (1) update room
- set room_number = ‘3’
- where room_id = ‘A001’
- (2) update record
- set record_room = ‘A002’, record_firsttime = ’11:05’, record_endtime = ’13:35’
- where record_id = ‘11’
- (3) update customer
- set customer_name = ?, customer_sex = ?, customer_idcard = ?, customer_phone = ?
- where customer_id =
- (
- selete user from
- login
- )
- (4) update waiter
- set waiter_name = ?, waiter_sex = ?, waiter_phone = ?
- where waiter_id = ?
- (5) update bill
- set bill_name = ?, bill_room = ?, bill_price = ?
- where bill_user = ?
3.4 索引及视图应用
在关系数据库中,索引是一种独立的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或 若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
索引提供指向存储在表的指定列中的数据值的指针,然后根据指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后 顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行的更快,可快速访问数据库表中的特定信息。
当表中有大量记录时,若要对表进行查询,第一种搜索信息方式是全表搜索,是将所有记录——取出,和查询条件进行一一对比,然后返回满足条件的记录,这样做会消耗大量的数据库系统时间,并造成大量磁盘I/O操作;第二种就是在表中建立索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录。
基于第二种搜索信息方式的优点,选取其中一个示例测试索引的用途,操作如下图所示:
- 在test表中插入5万~10万条数据:
图3. 4. 1 数据总数图
- 在未加索引的情况下直接查询某一个数据:
图3. 4. 2 未加索引的查询结果
图3. 4. 3 未加索引需要花费的时间
- 对比前面2)结果可知,查询一条数据需要花费0.048秒,为了提高查询效率,可以创建一个索引,创建索引的语句为:
图3. 4. 4 建立索引语句
- 创建索引后,在表中就有了索引和主键自带的主键索引,如下图所示:
图3. 4. 5 索引图
- 创建好索引后,再次执行与2)相同的语句,结果如下图所示:
图3. 4. 6 添加索引后查询到的结果
- 结论:通过两次对比结果可以发现,在执行相同语句时,建立索引后的查询时间为0.001秒,而未建立索引的时间为0.048秒,提高了查询的效率。本次使用是简单的查询操作以及表的数据不算太大,所以在时间差上并不是很大,但是当实际操作复杂的业务时,会发现索引能大大的提高的效率。
3.4.2 视图的应用
视图是指计算机数据库中的视图,是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
由于有时候需要将多张表的信息结合在一起查看,表的多重连接在一定条件下比较麻烦,所以可以创建视图,将多张表的信息汇总在一张视图表中。比如服务员在查看顾客信息时不能同时查看该顾客预约的房间信息,所以可以创建视图如下:
创建视图语句为:
图3. 4. 7 创建视图语句
建立视图后,想要查询相关需求就会很容易,例如:需要查询姓名为“111111”的顾客是否预约了房间号为“A006”的KTV房间,就可以简单的实现,如下图查询将结果所示:
图3. 4. 8 通过视图查询到的结果
第4章 应用系统实现
本系统采用Java的Swing来完成应用系统的交互功能,数据库采用MySQL来完成数据的操作。Java与MySQL的连接方式是JDBC。本系统通过MVC三层设计模型实现。用Model + View + Controller实现MVC设计模式的流程,如下图所示:
图4. 1 MVC设计模式
4.1 登录窗口
在包com中创建类,命名为LoginWeb.java,将其作为登录界面的窗口。
4.1.1 页面设计
登录界面:首先是创建一个窗体,设置窗体名称(setTitle)。左边创建一个JLabel,设置其Icon属性从而达到插入图片的作用。右边从上往下,首先是创建两个新的JLabel用于登录标题展现。之后创建一个JComboBox用于登录时身份的选择(顾客、服务员、管理员)、一个JTextField用于账号输入框以及一个JPasswordField用于密码输入。最下面使用到两个按钮JButton,一个是登录按钮,一个是注册按钮(用于用户注册)。实现后的效果图如下图所示:
图4. 1. 1 登录界面
4.1.2 功能实现
用户在使用登录界面是,输入账号和密码 ,点击登录按钮。如输入的账号和密码都正确,则根据身份的判断进入相对应的界面,反之,如果输入的账号或密码错误,则系统提示“账号或密码错误”,需要重新输入账号和密码。注册按钮是用于未注册过的用户注册,点击注册按钮会进入注册界面。
首先通过getSelectedItem()获取下拉框的内容以及通过getText()获取文本框和密码框的内容。然后通过建立数据库连接,打开相对应的表(login表)查找表中是否有与输入内容相同的数据记录,若有则查找成功,否则,查找失败。
4.2 注册页面
在包zhuce中创建类,命名为Zhuce1.java和Zhuce2.java,并将其作为注册界面的窗体。
4.2.1 页面设计
注册界面主要是由JLabel、JTextField、JPasswordField、JRadioButton以及JButton四个控件组成。从上往下看,两个JLabel组成注册界面的标题。第一个JLabel设置Icon用于存放图片,第二个JLabel用于存放“欢迎注册”字体。后面都是一些JLabel和JTextField(或JPasswordField)结合组成注册界面行,JRadioButton主要用于性别“男/女”的选择。JButton主要有“确定”按钮和“重置”按钮。如下图实现效果图所示:
图4. 2. 1 注册界面
4.2.2 功能实现
注册功能与登录功能差不多,都是连接数据库,查找相对应的表,使用getTxt()获取文本框以及isSelected()获取JRadioButton控件选择的内容,将对应内容添加进表。
确认按钮主要是在填写完注册内容后“确定”,当注册的账号存在时,提示“此账号已注册”。重置按钮是在点击后清空文本框JTextField以及密码框JPasswordField输入的内容。
管理员由系统给定,不能随便注册,所以当选择身份为管理员时,点击注册按钮会提示“管理员不能注册”。同理,服务员也不能随便注册,服务员登录账号和密码由统一配置。
4.3 普通用户界面窗口
在包customer中创建类,命名为CustomerWeb.java作为顾客登录总体界面。在CustomerWeb.java界面下包含:P1.java作为顾客预约KTV房间以及取消KTV房间预约、查看预约记录的界面;P2.java作为个人信息查看界面,包括查看个人信息、修改个人信息、修改密码。所以在P2.java中下还包含:Myself.java用作个人信息查看界面、Change.java用作修改个人信息界面以及ChangePsw.java作为修改密码的界面。
4.3.1 页面设计
顾客界面主要由三部分组成。KTV房间的预约、个人中心界面以及退出系统。
整体顾客操作界面由JTabbedPane、JToolBar和JButton三个控件组成。按钮Button主要为“KTV房间预约”、“个人中心”、“退出系统”。如下图实现效果图所示:
图4. 3. 1 顾客操作栏
1)KTV房间预约
KTV房间预约从上而下有三个部分,分别是KTV房间的预约、KTV房间预约情况查看以及取消KTV房间预约。
KTV房间预约首先顾客可以通过JRadioButton实现的“使用中/空闲中”来查询KTV房间使用状态。KTV房间情况和KTV房间使用状态都是用JTable来创建的。下面预约KTV房间操作,主要由JLabel、JTextField和JComboBox、JButton组成。JTextField用于输入,JComboBox用于选择需要预约的时间。效果实现图如下图所示:
图4. 3. 2 KTV房间预约界面
我的预约记录可以查看预约的记录,主要由JTable来创建表,取消预约主要由JLabel、JTextField和JButton组成。如下图实现效果图所示:
图4. 3. 3 查看预约记录以及取消KTV房间预约
2)个人信息
个人信息由三部分组成,查看个人信息、修改个人信息以及密码修改。开头部分主要是由两个JTable组成,第一个JTabel设置属性Icon,第二个JTable填写“操作界面”文字。在外部使用一个JTable实现外部框。如下图实现效果图所示:
图4. 3. 4 个人中心操作界面
查看个人界面开头也是由两个JTabel,第一个JLabel设置Icon属性,插入照片;第二个JLabel插入“个人信息”文字作为个人信息界面的标题。下面全部以JTabel作为个人信息设置部分。如下图实现效果如所示:
图4. 3. 5 查看个人信息界面
修改个人信息界面开头与个人信息界面一样,两个JTabel,第一个设置Icon属性插入图标,第二个插入“个人信息修改”的文字作为个人信息修改界面的标题。下面部分主要由JTabel、JTextField、JRadioButton以及JButton控件组成。JTextField用于输入,JRadioButton用于性别选择(男/女),JButton有两个按钮,分别为“修改”按钮和“重置”按钮。如下图效果实现图所示:
图4. 3. 6 个人信息修改界面
密码修改界面与前两个相同,这里就不 重复阐述了。该界面由JTabel、JTextField和JButton三种控件组成。JTextField主要用于信息输入;JButton主要有两个按钮,一个为“确认”,另一个为“重置”按钮。如下图效果实现图所示:
图4. 3. 7 密码修改界面
3)退出系统
退出系统主要由一个JButton组成,当点击按钮时退出界面。
4.3.2 功能实现
主界面的设计是在同一个界面设计的,不存在点击按钮跳出新的界面情况。主界面主要使用JPanel实现在同一个界面跳转。
顾客操作部分:当点击按钮,在下方界面显示相对应的操作界面。
1)KTV房间预约
首先是根据使用状态查询记录部分。当点击“查询”按钮时,通过isSelected()获取选择的状态(使用中/空闲中),从而连接对应数据表(KTV房间表),判断表中房间使用状态是否与获取到的数据相同,相同就输出整条房间记录将其存放在table表中,从而达到查询效果。
然后是预约KTV房间部分。此部分要输入房间号,价格,使用人数以及使用时间比较麻烦,所以我给KTV房间使用状态表(即查询后的表)加入了鼠标监听事件,当点击表中其中一行记录,相对应的信息就可以显示在预约KTV方法相对应的JTextField框中,就不需要那么复杂输入房间号、价格以及推荐人数了,但是预约部分还是需要自己选择时间段。之后是“预约”按钮,当选好要预约的KTV房间后,点击按钮,如果选择的房间状态为使用中或已预约,则提示“该房间不能预约”,如果查询到该房间已被预约,则提示“您已预约该房间!”。反之,如果选择的房间使用状态为空闲中,则提示“预约成功!”,同时需要连接相对应的数据表(房间预约单表),向表中插入一条新的数据;并且需要修改KTV房间表的房间状态为“已预约”。
之后是我的预约记录以及取消预约部分。查看预约记录部分主要是以表格table实现,通过数据库连接查找对应表(房间预约单表),通过登录部分传参,将顾客登录使用时的账号传过来,从而在表中找到该顾客的预约记录。取消预约同样是在预约记录表中建了一个监听事件,当点击表中某一行记录时,可以将对应信息显示在取消预约的textfield、label中。当点击取消“预约”按钮时,提示“预约取消成功!”,同时仍然需要建立数据库连接,查找房间预约单表,删除表中相对应的预约记录;并且修改KTV房间表的使用状态为“空闲中”。
2)个人中心
个人中心界面同样是在同一个界面中实现,左边为操作选择界面,右边为相对应的操作功能界面。当点击查看个人信息按钮,右边跳出个人信息界面的内容,同理,当点击修改个人信息按钮,显示修改界面。如下图效果实现图所示:
图4. 3. 8 个人中心操作总界面
- 查看个人信息
查看个人信息界面主要是由JTabel控件实现,该部分不能进行增删改查,只能查看个人信息。个人信息是通过登录时获取到顾客使用的账号,通过传参将账号作为条件,在连接数据库查找相对应的表,如果表中的账号与登录输入的账号相同,则把表中记录通过setText()将对应数据显示在tabel中。
- 修改个人信息
个人信息修改界面和查看个人信息界面差不多,该界面除了账号是不能修改,姓名、性别、身份证号以及联系方式都可以修改。账号同样是获取登录时使用的账号,通过setText()显示在label中。而其他信息通过输入数据,getText()获取文本框内容,连接数据库,查找相对应的表中记录,修改。
“修改”按钮,当点击时,如果文本框中信息没有填写完整,则提示“请将信息填写完整!”,否则,提示“修改成功!”。“重置”按钮是通过setText(“ ”);将文本框中内容进行情况。
- 密码修改
密码修改和前面操作相同,都是获取文本框内容,建立数据库连接,查询相对应的表,对表中某一条记录进行修改过程。在这里就不重复阐述了。
3)退出系统
退出系统主要是使用按钮事件,当点击退出系统按钮时,关闭界面。主要用到的语句为“System.exit(0);”
4.4 服务员界面窗口
在包waiter中创建类,命名为WaiterWeb.java作为服务员登录总体界面。在WaiterWeb.java界面下包含:P1.java作为服务员查看顾客预约记录、修改顾客预约信息以及为顾客安排KTV房间的界面;P2.java作为查看信息界面(包括查看顾客信息、KTV房间预约信息、顾客预约记录信息)。所以在P2.java中还包含:QueryCustomer.java作为查看顾客信息界面、QueryRoom作为查看KTV预约信息界面、QueryOrder作为查看顾客预约记录信息界面。
4.4.1 页面设计
服务员界面主要是由四个部分组成:顾客预约情况、查看信息、个人中心以及退出系统。
整体服务员操作界面由JTabbedPane、JToolBar和JButton三个控件组成。按钮Button主要为“顾客预约情况”、“查看信息”、“个人中心”、“退出系统”。如下图实现效果图所示:
图4. 4. 1 服务员操作栏
- 1)顾客预约情况
顾客预约情况界面主要由四部分组成:查看顾客预约情况、操作界面、修改顾客预约信息以及为顾客安排KTV房间。
顾客预约情况首先时服务员可以通过JComboBox实现的(通过“顾客姓名查询”/“房间号”)来查询相对应顾客。查询部分主要是通过JComboBox、JTextField、JButton以及JLabel四个控件组成。显示数据部分主要使用JTable实现。JTextField用于输入。如下图实现效果所示:
图4. 4. 2 顾客预约情况界面
操作界面主要用于修改顾客用于信息和安排KTV房间。该界面开头由两个JTabel构成,第一个设置Icon属性插入图标,第二个插入“操作界面”字体作为该界面标题。标题下面由两个JButton组成。如下图实现效果所示:
图4. 4. 3 操作界面
修改顾客信息界面开头和操作界面一样,在这里就不阐述了。该界面主要由JLabel、JTextField、JComboBox以及JButton四种控件组成,JTextField用于输入,JComboBox用于使用KTV房间事件的选择。JButton按钮为“修改”按钮,用于数据的修改。如下图实现效果所示:
图4. 4. 4 修改顾客预约信息界面
安排KTV房间与修改顾客预约信息界面差不多,只不过JButton按钮为“预约”,用于KTV房间的预约。如下图实现效果所示:
图4. 4. 5 为顾客安排KTV房间界面
- 2)查看信息
查看信息界面由四部分组成,操作界面、查看顾客信息界面、查看KTV房间预约信息界面以及查看顾客预约记录界面。
操作界面和前面顾客预约记录界面中的一样,在此就不详细阐述了。如下图效果实现所示:
图4. 4. 6 操作界面
查看顾客信息界面开头以两个JLabel,第一个label设置Icon属性,插入图标;第二个label插入“顾客信息表”文字。然后设置JTable用于存放顾客信息。最后再以JLabel、JComboBox、JTextField、JButton组成查询操作。如下图实现效果图所示:
图4. 4. 7 查看顾客信息界面
查看KTV房间预约界面前面和顾客信息界面一样用到两个JLabel和一个JTable,在此就不详细阐述了。最后是由JLabel、JRadioButton(使用中/已预约/空闲中)以及JButton组成一个房间状态查询功能。如下图实现效果图所示:
图4. 4. 8 KTV房间预约界面
顾客预约记录界面与前面用到的控件一样,在此就不详细阐述了。如下图实现效果所示:
图4. 4. 9 顾客预约历史记录
- 3)个人中心
个人中心界面由三部分组成,查看个人信息以及密码修改。该操作和顾客界面中的个人中心相同,所以就不细说了,直接看实现效果如下:
- 操作界面部分
图4. 4. 10 操作界面
- 查看个人信息部分(JLabel信息在注册时为随意填写)
图4. 4. 11 个人信息界面
- 修改个人信息部分
图4. 4. 12 个人修改信息界面
- 退出系统
退出系统主要由一个JButton组成,当点击按钮时退出界面。
4.4.2 功能实现
主界面的设计是在同一个界面设计的,不存在点击按钮跳出新的界面情况。主界面主要使用JPanel实现在同一个界面跳转。
服务员操作部分:当点击按钮,在下方界面显示相对应的操作界面。
1)顾客预约记录
首先是根据JComboBox(顾客姓名或房间号)以及getText()获取文本框输入的内容,从而查询顾客预约信息记录,通过连接数据库,查找对应表,遍历表中记录,如果存在相同的顾客姓名(或房间号),则将对应记录输出存放在table表中。
然后是操作界面部分的修改顾客预约信息以及安排KTV房间。左边是操作界面,由两个按钮组成,当点击某一个按钮,右边界面会跳转到相应界面中。此部分运用了JPanel,使操作在同一个界面跳转,省去了跳出弹框的复杂。
修改顾客预约信息部分,通过getText()获取输入的文本框信息以及getSelectedItem()获取comboBox信息,之后创建数据库连接,查找对应记录从而实现修改功能。安排KTV房间与修改顾客预约信息差不多,不过该部分在查询表时,需要判断该房间是否被预约或使用中,如果在使用中或已被预约,则提示“不能预约该房间!”,反之,如果空闲中,则在点击“预约”按钮后,提示“预约成功!”。
如下图整体界面实现效果所示:
图4. 4. 13 顾客预约记录整体界面
2)查看信息
查看信息界面主要由上下两部分组成:操作界面、信息展示界面。
首先操作界面主要由三个按钮组成,当点击其中某一个按钮,下面的信息展示部分会在同一个界面切换到对应信息。
信息展示界面主要分为三部分:顾客信息表、KTV房间预约表、顾客预约记录表。
顾客信息表主要是建立数据库连接,然后将对应表中的记录导出到table中,之后有一个查询系统,通过getSelectedItem()获取comboBox信息,查询表中对应记录,如果查询到相对应的记录,使用DefaultTableModel更新table表,然后将符合该条件的记录输出存放在table中。KTV房间预约表和顾客预约记录表与顾客信息表一样,都是将对应数据表导出到table表中。不过KTV房间表有一个查询功能(按房间状态查询:使用中/已预约/空闲中),通过isSeleted()来获取选择的内容,然后查找表中对应记录输出。
查看信息整体界面实现效果如下图所示:
图4. 4. 14 查看信息整体界面
3)个人信息
个人信息界面与顾客界面中的个人信息界面相同,在此就不详细阐述了,直接放置整体实现后的界面,如下图所示:
图4. 4. 15 个人信息整体界面
4)退出系统
退出系统主要是使用按钮事件,当点击退出系统按钮时,关闭界面。主要用到的语句为“System.exit(0);”
4.5 管理员界面窗口
在包admin中创建类,命名为AdminWeb.java作为管理员登录后的总体界面。在AdminWeb.java界面下包含:P1.java作为管理员对KTV房间(KTV.java)、顾客信息(Customer.java)、服务员信息的管理(Waiter.java);P3.java作为个人中心界面(包括个人信息、密码修改)。
4.5.1 页面设计
管理界面主要是由三个部分组成:信息管理、个人中心以及退出系统。
整体管理员操作界面由JTabbedPane、JToolBar和JButton三个控件组成。按钮Button主要为“信息管理”、“个人中心”、“退出系统”。如下图实现效果图所示:
图4. 5. 1 管理员操作界面
- 1)信息管理
信息管理界面主要由三部分组成:KTV房间管理、顾客信息管理以及服务员信息管理。该部分主要是对数据库中表的增删改查操作,所以就不详细阐述。如下图效果实现所示:
- 操作界面
图4. 5. 2 操作界面
- KTV房间管理(增删改查)
图4. 5. 3 KTV房间管理界面
- 顾客信息管理(增删改查)
图4. 5. 4 顾客信息管理界面
- 服务员信息管理(增删改查)
图4. 5. 5 服务员管理界面
- 2)个人中心
个人中心界面与之前顾客或服务员的个人中心界面都有极高的雷同,所以在此就不多详细阐述。个人中心由操作界面、个人信息和密码修改三部分组成。如下实现效果所示:
- 操作界面
图4. 5. 6 操作界面
- 个人信息
图4. 5. 7 个人信息界面
- 密码修改
图4. 5. 8 密码修改界面
4.5.2 功能实现
首先管理员能够操作的是全部人员的全部信息,因为管理信息的操作都差不多,所以以KTV房间管理为例讲解其中功能。
新增KTV房间的功能就是向数据库中的表插入一条数据,需要对输入的信息进行初步判断。首先房间号是每一个KTV房间一个,不能重复,需要调用数据库中所有的记录,查找所有的房间号,再判断输入的房间号是否在表中已经存在,其他信息可以随意输入,全部无误后点击增加。
修改KTV房间的功能是修改数据库中表的某一条记录的内容,需要对输入的房间号进行判断。查找所有的房间号,再判断输入的房间号(除修改前本身的房间号)是否在表中已经存在,若存在,则不能正确修改信息,反之,可以修改,其他信息可以随意输入,全部无误后点击修改。
删除KTV房间的功能是向删除数据库中表的某一条记录,同样需要对输入的房间号进行判断。查找所有的房间号,再判断输入的房间号是否在表中已经存在,若存在,则删除成功,反之,不能正确的删除记录。
个人信息中的查看个人信息和密码修改与之前顾客界面(或服务员界面)中的操作一样,所以就不详细展开阐述。
4.6 统计界面
该统计界面用于统计数据,使用JLabel、JComboBox、JButton以及JTable控件组成,同时绘制统计图。
图4. 6. 1 统计界面
第5章 总结
emm......这部分不给康~
oh~yeah 终于写完了
题外话:这些登录界面排版都是通过打开方式中的WindowBuilder Editor来完成的。
具体如何操作可以去网上查找相关视频学习或可自己探索哦~毕竟自己写Panel、Button、TextField等,还需要调整其位置,在代码量上会大大增加,通过这种绘制方式会轻松很多。
不过一些数据库连接、登录验证等还是需要自己书写判断的哦~
代码部分就不写了,实在太多了。由于课程设计时间紧张,有些功能直接略过,只有外观没有功能,嘻嘻🤭
小可爱们~到底了哦~