目录
1.系统的受众说明
1 在校学习的学生,可用于日常学习使用或是毕业设计使用
2 毕业一到两年的开发人员,用于锻炼自己的独立功能模块设计能力,增强代码编写能力。
3 亦可以部署为商化项目使用。
4 需要完整资料及源码,请在文末获取联系方式领取。
2.需求分析
2.1需求描述
2.1.1系统管理员需求描述
①用户管理
- 注册用户账户
当一个新用户注册时,用户填写基本信息并上传。用户基本信息包括账号、
姓名、密码、手机、地址等信息。
- 用户信息管理
管理员可以查看系统所有用户的基本信息,并修改和删除。
②社团管理
- 创建社团
社团由管理员创建,创建社团需填写社团名称,社团类型和社团社长。
b. 社团信息管理
管理员可以查看使用该系统的所有社团基本信息,修改和删除该社团。由于需要处理的信息可能更多,为了使页面更简洁,减少数据库查询的压力,并使管理员能够更快地找到需要处理的社团信息,添加社团名称字段的查询功能。
2.1.2用户的功能需求
①用户管理
- 个人信息管理
用户可以查看自己的个人信息,也可以修改、删除操作自己不满意的信息。
- 申请加入社团
用户可以浏览所有社团,并向喜欢的社团提交申请。
- 加入活动
用户可以浏览加入社团的全部活动,并选择加入到感兴趣的活动中。
- 缴费信息管理
用户可以收到缴费通知,并进行缴费
2.1.3社团管理员功能需求
①社团管理
a. 活动信息管理
社团管理员可以向所有社员发布活动信息,可以对参与活动的社员进行审核。
- 社团成员信息管理
社团管理员可以对社员进行删除,对入团申请者进行审核。
- 缴费信息管理
社团管理员可以根据社员编号发布缴费信息
2.2用例分析
2.2.1管理员模块
如图2-2-1所示,具体模块如下:
系统用户管理:可以查看系统所有用户的基本信息,并修改和删除。
社团类型管理:可以对社团类型进行修改,删除,查询操作,并且可以根据需求增添社团类型。
社团信息管理:可以对社团进行查询,删除,创建社团,修改社团信息。
活动信息管理:可以查询,删除社团活动。
通知信息管理:可以查询,删除,发布社团活动。
查询缴费记录:可以查询各个社团的缴费记录。
图2-2-1 管理员用例图
2.2.2用户管理模块
如图2-2-2所示,具体模块如下:
浏览社团信息:可以浏览所有社团及其基本信息。
活动信息管理:实现向所有社员发布活动信息,可以对参与活动的社员进行审核的功能。
用户信息管理:实现修改个人信息和密码的功能。
通知信息查询:可以查询发布的通知信息。
缴费信息管理:实现缴费查询和缴费缴纳功能。
图2-2-2 用户用例图
2.2.3社长管理模块
如图2-2-3所示,具体模块如下:
入团申请处理:可以对提交社团申请的用户进行审核。
社团成员管理:实现对社团的成员查询和删除功能。
社团活动管理:可以查看和发布社团活动。
社团通知管理:可以查看,发布社团活动,删除本社团发布的通知
社团费用管理:可以查看,删除,根据社员编号发布缴费通知。
图2-2-3社长用例图
2.3静态分析
2.3.1系统静态类图:
如图 2-3-1 所示,系统的用户分为系统管理员、普通用户和社团管理员。
用户管理个人信息并申请加入社团;系统管理员管理用户信息、社团信息和通知,社团管理员审核用户申请,发布通知。一个用户可以有多个社团,用户可以提交多个申请,民宿管理者可以处理多个申请。
图2-3-1系统静态类图
2.3.2基本信息管理类图
如图2-3-2所示,基本信息类包括用户信息类、入团信息类、活动信息、缴费信息类
社团信息类、通知信息类。
图2-3-2基本信息管理类图
2.4功能分析
如图2-4-1所示,系统功能包括系统通用功能,社团管理运营功能和基础信息管理功能。
图2-4-1系统总体功能模块图
图2-4-1系统总体功能模块图
3 系统设计
3.1系统总体结构
如图 3-1-1 所示,总体结构共有用户层、服务接口层、业务逻辑层、数据访问层和数据层五个层次。用户层通过系统管理员、用户和社团管理员三个登录身份登录到相应的身份界面。 一旦服务接口层通过服务访问接口进行了统一授权认证, 只有身份认证用户才能访问数据,服务接口层通过调用业务逻辑层中的数据查询组件来处理数据,业务逻辑层中的数据通过调用数据访问层中的数据访问组件来获得数据库中的数据库数据。
图3-1-1 社团管理系统总体结构
3.2模块设计
3.2.1登录模块
如图 3-2-1 所示,系统用户在输入账户和密码登录信息后,服务器对用户信息进行验证,验证正确,根据用户身份进入不同界面。
图3-2-1 登录时序图
3.2.2加入社团模块
如图 3-2-2所示,用户进入社团申请界面提交申请,用户信息将上传到服务器,社长同意后,数据库社团成员信息表更新。
图3-2-2 加入社团时序图
3.2.3修改密码模块
如图3-2-3所示,用户修改密码时,需要在密码修改页面输入原密码和新密码,通过服务器验证账号和密码信息,确定原密码是否正确,新密码是否一致。 验证后,更新数据库中的数据。 最后,返回提示,成功更改密码。
图3-2-3 修改密码时序图
4 数据库设计
4.1概念结构设计
如图4-1-1所示,如图 4-5-1 所示,本系统的实体有九个实体,分别是用户、社团、管理员、活动、通知、缴费记录、报名记录、社团类型、社团成员;用户的属性有账户、密码、姓名、性别、地址、电话号码;社团的属性有社团编号、社团名、社团创建时间、社长ID、社团类型和社团人数;活动的属性有活动编号、活动名称、报名时间、报名人数、活动概述、活动详情、发布社团、活动要求。
图4-1-1系统设计E-R图
4.2逻辑结构设计
用户(ID,用户账号,用户密码,用户姓名,用户性别,用户年龄,联系电话,联系地址,信息状态,创建时间,用户身份)
社团(ID,社团名称,建立时间,社团人数,社团团长,社团编号)
社团类型(ID,类型名称,创建时间)
缴费(ID,缴费时间,缴纳费用,收费社团,缴费用户)
通知(ID,通知标题,通知详情,创建时间,发布时间)
社团成员(ID,入团时间,加入社团,申请用户)
申请(ID,处理状态,申请时间,申请社团,申请用户)
活动(ID,活动名称,活动概述,活动详情,活动要求,报名人数,活动时间,发布社团)
活动日志(ID,报名时间,活动编号,报名用户)
4.3物理设计
表4-3-1 用户表 (users)
字段名 | 字段类型 | 长度 | 主键或外键 | 字段值约束 | 对应中文属性名 |
id | char | 13 | 主键 | NOT NULL | 记录ID |
user_name | varchar | 32 | NOT NULL | 用户账号 | |
pass_word | varchar | 32 | NOT NULL | 用户密码 | |
name | varchar | 20 | 用户姓名 | ||
gender | char | 2 | 用户性别 | ||
age | int | 11 | 用户年龄 | ||
phone | char | 11 | 联系电话 | ||
address | varchar | 64 | 联系地址 | ||
status | int | 11 | NOT NULL | 信息状态 | |
create_time | char | 19 | NOT NULL | 创建时间 | |
type | int | 11 | NOT NULL | 用户身份 |
表4-3-2社团表(team)
字段名 | 字段类型 | 长度 | 主键或外键 | 字段值约束 | 对应中文属性名 |
id | char | 13 | 主键 | NOT NULL | 记录ID |
name | varchar | 20 | NOT NULL | 社团名称 | |
create_time | char | 10 | NOT NULL | 创建时间 | |
total | int | 11 | NOT NULL | 社团人数 | |
manager | char | 13 | NOT NULL | 社团团长 | |
type_id | char | 13 | NOT NULL | 社团编号 |
表4-3-3 社团类型表 (team_types)
字段名 | 字段类型 | 长度 | 主键或外键 | 字段值约束 | 对应中文属性名 |
id | char | 13 | 主键 | NOT NULL | 记录ID |
name | varchar | 20 | NOT NULL | 类型名称 | |
create_time | char | 19 | NOT NULL | 创建时间 |
表4-3-4 缴费表 (pay_logs)
字段名 | 字段类型 | 长度 | 主键或外键 | 字段值约束 | 对应中文属性名 |
id | char | 13 | 主键 | NOT NULL | 记录ID |
create_time | char | 19 | NOT NULL | 缴费时间 | |
total | double | 0 | NOT NULL | 缴纳费用 | |
team_id | char | 13 | NOT NULL | 收费社团 | |
user_id | char | 13 | NOT NULL | 缴费用户 |
表4-3-5 通知表(notices)
字段名 | 字段类型 | 长度 | 主键或外键 | 字段值约束 | 对应中文属性名 |
id | char | 13 | 主键 | NOT NULL | 记录ID |
title | varchar | 20 | NOT NULL | 通知标题 | |
detail | varchar | 125 | NOT NULL | 通知详情 | |
create_time | char | 10 | NOT NULL | 创建时间 | |
team_id | char | 13 | 发布社团 |
表4-3-6 社团成员表 (members)
字段名 | 字段类型 | 长度 | 主键或外键 | 字段值约束 | 对应中文属性名 |
id | char | 13 | 主键 | NOT NULL | 记录ID |
create_time | varchar | 20 | NOT NULL | 入团时间 | |
team_id | varchar | 125 | NOT NULL | 加入社团 | |
user_id | char | 10 | NOT NULL | 申请用户 |
表4-3-7 申请表 (apply_logs)
字段名 | 字段类型 | 长度 | 主键或外键 | 字段值约束 | 对应中文属性名 |
id | char | 13 | 主键 | NOT NULL | 记录ID |
status | int | 11 | NOT NULL | 处理状态 | |
create_time | char | 19 | NOT NULL | 申请时间 | |
team_id | char | 13 | NOT NULL | 申请社团 | |
user_id | char | 13 | NOT NULL | 申请用户 |
表4-3-8 活动表 (activities)
字段名 | 字段类型 | 长度 | 主键或外键 | 字段值约束 | 对应中文属性名 |
id | char | 13 | 主键 | NOT NULL | 记录ID |
name | varchar | 20 | NOT NULL | 活动名称 | |
comm | varchar | 60 | NOT NULL | 活动概述 | |
detail | varchar | 256 | NOT NULL | 活动详情 | |
ask | varchar | 125 | NOT NULL | 活动要求 | |
total | int | 11 | NOT NULL | 报名人数 | |
active_time | char | 19 | NOT NULL | 活动时间 | |
team_id | char | 13 | NOT NULL | 发布社团 |
表4-3-9 活动日志(active_logs)
字段名 | 字段类型 | 长度 | 主键或外键 | 字段值约束 | 对应中文属性名 |
id | char | 13 | 主键 | NOT NULL | 记录ID |
create_time | char | 19 | NOT NULL | 报名时间 | |
active_id | char | 13 | NOT NULL | 活动编号 | |
user_id | char | 13 | NOT NULL | 报名用户 |
4.4 数据库实施
4-4-1创建用户表 (users):
CREATE TABLE `users` (
`id` char(13) NOT NULL COMMENT '记录ID',
`user_name` varchar(32) NOT NULL COMMENT '用户账号',
`pass_word` varchar(32) NOT NULL COMMENT '用户密码',
`name` varchar(20) DEFAULT NULL COMMENT '用户姓名',
`gender` char(2) DEFAULT NULL COMMENT '用户性别',
`age` int(11) DEFAULT NULL COMMENT '用户年龄',
`phone` char(11) DEFAULT NULL COMMENT '联系电话',
`address` varchar(64) DEFAULT NULL COMMENT '联系地址',
`status` int(11) NOT NULL COMMENT '信息状态',
`create_time` char(19) NOT NULL COMMENT '添加时间',
`type` int(11) NOT NULL COMMENT '用户身份',
PRIMARY KEY (`id`) ,
) ;
4-4-2创建社团表(team):
CREATE TABLE `teams` (
`id` char(13) NOT NULL COMMENT '记录ID',
`name` varchar(20) NOT NULL COMMENT '社团名称',
`create_time` char(10) NOT NULL COMMENT '建立时间',
`total` int(11) NOT NULL COMMENT '社团人数',
`manager` char(13) NOT NULL COMMENT '社团团长',
`type_id` char(13) NOT NULL COMMENT '社团编号',
PRIMARY KEY (`id`) ,
);
4-4-3创建社团类型表 (team_types):
CREATE TABLE `team_types` (
`id` char(13) NOT NULL COMMENT '记录ID',
`name` varchar(20) NOT NULL COMMENT '类型名称',
`create_time` char(19) NOT NULL COMMENT '创建时间',
PRIMARY KEY (`id`),
) ;
4-4-4创建缴费表 (pay_logs):
CREATE TABLE `pay_logs` (
`id` char(13) NOT NULL COMMENT '记录ID',
`create_time` char(19) NOT NULL COMMENT '缴费时间',
`total` double NOT NULL COMMENT '缴纳费用',
`team_id` char(13) NOT NULL COMMENT '收费社团',
`user_id` char(13) NOT NULL COMMENT '缴费用户',
PRIMARY KEY (`id`) ,
) ;
4-4-5创建通知表(notices):
CREATE TABLE `notices` (
`id` char(13) NOT NULL COMMENT '记录ID',
`title` varchar(20) NOT NULL COMMENT '通知标题',
`detail` varchar(125) NOT NULL COMMENT '通知详情',
`create_time` char(10) NOT NULL COMMENT '发布时间',
`team_id` char(13) DEFAULT NULL COMMENT '发布社团',
PRIMARY KEY (`id`) ,
) ;
4-4-6创建社团成员表 (members):
CREATE TABLE `members` (
`id` char(13) NOT NULL COMMENT '记录ID',
`create_time` char(19) NOT NULL COMMENT '入团时间',
`team_id` char(13) NOT NULL COMMENT '加入社团',
`user_id` char(13) NOT NULL COMMENT '成员ID',
PRIMARY KEY (`id`),
);
4-4-7 创建申请表 (apply_logs):
CREATE TABLE `apply_logs` (
`id` char(13) NOT NULL COMMENT '记录ID',
`status` int(11) NOT NULL COMMENT '处理状态',
`create_time` char(19) NOT NULL COMMENT '申请时间',
`team_id` char(13) NOT NULL COMMENT '申请社团',
`user_id` char(13) NOT NULL COMMENT '申请用户',
PRIMARY KEY (`id`) USING BTREE,
KEY `team_id` (`team_id`) USING BTREE,
KEY `user_id` (`user_id`) USING BTREE,
);
4-4-8创建活动表 (activities):
CREATE TABLE `activities` (
`id` char(13) NOT NULL COMMENT '记录ID',
`name` varchar(20) NOT NULL COMMENT '活动名称',
`comm` varchar(60) NOT NULL COMMENT '活动概述',
`detail` varchar(256) NOT NULL COMMENT '活动详情',
`ask` varchar(125) NOT NULL COMMENT '活动要求',
`total` int(11) NOT NULL COMMENT '报名人数',
`active_time` char(19) NOT NULL COMMENT '活动时间',
`team_id` char(13) NOT NULL COMMENT '发布社团',
PRIMARY KEY (`id`) ,
) ;
4-4-9创建活动日志表(active_logs):
CREATE TABLE `active_logs` (
`id` char(13) NOT NULL COMMENT '记录ID',
`create_time` char(19) NOT NULL COMMENT '报名时间',
`active_id` char(13) NOT NULL COMMENT '活动编号',
`user_id` char(13) NOT NULL COMMENT '报名用户',
PRIMARY KEY (`id`),
);
5 系统实现及测试
5.1系统实现
5.1.1用户注册功能实现:
用户注册功能是通过浏览器渲染一个表单,需要提供用户账号、密码、姓名、年龄、性别、电话、地址等信息。将数据传入后台,通过后台实现对用户的新增。
后台实现主要代码:
public R addInfo(Users users) {
if(usersService.getUserByUserName(users.getUserName()) == null){
users.setId(IDUtils.makeIDByCurrent());
users.setCreateTime(DateUtils.getNowDate());
Log.info("添加系统用户,传入参数:{}", users);
usersService.add(users);
return R.success();
}else{
return R.warn("用户账号已存在,请重新输入");
}
}
用户注册界面实现,如图5-1-1所示:
图5-1-1用户注册界面
5.1.2用户登录功能实现:
用户登录需要提供用户名、密码;当用户名和密码匹配时才能登录进入系统。关键(伪)代码如下:
public R login(String userName, String passWord, HttpSession session){
Log.info("用户登录,用户名:{}, 用户密码:{}", userName, passWord);
Users user = usersService.getUserByUserName(userName);
if(user == null) {
return R.error("输入的用户名不存在");
}else {
if(passWord.equals(user.getPassWord().trim())) {
String token = IDUtils.makeIDByUUID();
cacheHandle.addUserCache(token, user.getId());
return R.success("登录成功", token);
}else {
return R.error("输入的密码错误");
}
}
}
用户登录界面实现,如图5-1-2所示:
图5-1-2用户登录界面
5.1.3用户密码修改功能实现:
通过前端渲染一个对话窗口,验证用户输入的原始密码是否正确,并将新密码传入后台进行密码修改。
后台主要代码:
public R pwd(String token, String password) {
Log.info("修改用户密码,{}", password);
Users user = usersService.getOne(cacheHandle.getUserInfoCache(token));
user.setPassWord(password);
usersService.update(user);
return R.success();
}
修改密码界面,如图5-1-3所示:
图5-1-3修改密码界面
5.1.4系统用户信息修改功能实现:
通过前面的信息查询之后,可对用户信息进行修改。
后台主要代码:
public R updInfo(Users users) {
Log.info("修改系统用户,传入参数:{}", users);
usersService.update(users);
return R.success();
}
修改信息界面,如图5-1-4:
图5-1-4修改信息界面
5.1.5社团类型管理功能实现:
此功能可对社团类型进行查询、新增、修改、删除
public R getPageInfos(Long pageIndex, Long pageSize,
TeamTypes teamTypes) {
Log.info("分页查找社团类型,当前页码:{},"
+ "每页数据量:{}, 模糊查询,附加参数:{}", pageIndex,
pageSize, teamTypes);
PageData page = teamTypesService.getPageInfo(pageIndex, pageSize, teamTypes);
return R.successData(page);
}
@PostMapping("/add")
@ResponseBody
public R addInfo(TeamTypes teamTypes) {
teamTypes.setId(IDUtils.makeIDByCurrent());
teamTypes.setCreateTime(DateUtils.getNowDate());
Log.info("添加社团类型,传入参数:{}", teamTypes);
teamTypesService.add(teamTypes);
return R.success();
}
@PostMapping("/upd")
@ResponseBody
public R updInfo(TeamTypes teamTypes) {
Log.info("修改社团类型,传入参数:{}", teamTypes);
teamTypesService.update(teamTypes);
return R.success();
}
@PostMapping("/del")
@ResponseBody
public R delInfo(String id) {
if(teamTypesService.isRemove(id)){
Log.info("删除社团类型, ID:{}", id);
TeamTypes teamTypes = teamTypesService.getOne(id);
teamTypesService.delete(teamTypes);
return R.success();
}else{
return R.warn("存在关联社团,无法移除");
}
}
社团类型管理界面,如图:
图5-1-5社团类型管理界面
5.1.6入团申请功能实现:
用户可以选择喜欢的社团,点击申请,由社长审核后,将用户加入到社团
后台主要代码:
@GetMapping("/info")
@ResponseBody
public R getInfo(String id) {
Log.info("查找指定申请记录,ID:{}", id);
ApplyLogs applyLogs = applyLogsService.getOne(id);
return R.successData(applyLogs);
}
@GetMapping("/page")
@ResponseBody
public R getPageInfos(Long pageIndex, Long pageSize,
String token, String teamName, String userName) {
Users user = usersService.getOne(cacheHandle.getUserInfoCache(token));
if (user.getType() == 0) {
Log.info("分页查看全部申请记录,当前页码:{},"
+ "每页数据量:{}, 模糊查询,团队名称:{},用户姓名:{}", pageIndex,
pageSize, teamName, userName);
PageData page = applyLogsService.getPageInfo(pageIndex, pageSize, null, teamName, userName);
return R.successData(page);
} else if (user.getType() == 1) {
Log.info("团队管理员查看申请记录,当前页码:{},"
+ "每页数据量:{}, 模糊查询,团队名称:{},用户姓名:{}", pageIndex,
pageSize, teamName, userName);
PageData page = applyLogsService.getManPageInfo(pageIndex, pageSize, user.getId(), teamName, userName);
return R.successData(page);
} else {
Log.info("分页用户相关申请记录,当前页码:{},"
+ "每页数据量:{}, 模糊查询,团队名称:{},用户姓名:{}", pageIndex,
pageSize, teamName, userName);
PageData page = applyLogsService.getPageInfo(pageIndex, pageSize, user.getId(), teamName, null);
return R.successData(page);
}
}
@PostMapping("/add")
@ResponseBody
public R addInfo(String token, ApplyLogs applyLogs) {
Users user = usersService.getOne(cacheHandle.getUserInfoCache(token));
if(applyLogsService.isApply(user.getId(), applyLogs.getTeamId())){
applyLogs.setId(IDUtils.makeIDByCurrent());
applyLogs.setUserId(user.getId());
applyLogs.setCreateTime(DateUtils.getNowDate());
Log.info("添加申请记录,传入参数:{}", applyLogs);
applyLogsService.add(applyLogs);
return R.success();
}else{
return R.warn("申请审核中,请耐心等待");
}
}
@PostMapping("/upd")
@ResponseBody
public R updInfo(ApplyLogs applyLogs) {
Log.info("修改申请记录,传入参数:{}", applyLogs);
applyLogsService.update(applyLogs);
return R.success();
}
@PostMapping("/del")
@ResponseBody
public R delInfo(String id) {
Log.info("删除申请记录, ID:{}", id);
ApplyLogs applyLogs = applyLogsService.getOne(id);
applyLogsService.delete(applyLogs);
return R.success();
}
入团申请管理界面,如图5-1-6所示:
图5-1-6入团申请管理界面
5.1.7 活动信息功能实现
社长可以发布,删除,修改活动,用户在活动浏览界面可以查看到相关信息。
后台主要代码:
@PostMapping("/add")
@ResponseBody
public R addInfo(Activities activities) {
activities.setId(IDUtils.makeIDByCurrent());
Log.info("添加活动信息,传入参数:{}", activities);
activitiesService.add(activities);
return R.success();
}
@PostMapping("/upd")
@ResponseBody
public R updInfo(Activities activities) {
Log.info("修改活动信息,传入参数:{}", activities);
activitiesService.update(activities);
return R.success();
}
@PostMapping("/del")
@ResponseBody
public R delInfo(String id) {
Log.info("删除活动信息, ID:{}", id);
Activities activities = activitiesService.getOne(id);
activitiesService.delete(activities);
return R.success();
}
活动信息浏览界面,如图5-1-7所示
图5-1-7活动信息浏览界面
5.1.8费用记录功能实现
后台主要代码:
@Controller
@RequestMapping("/payLogs")
public class PayLogsController extends BaseController {
protected static final Logger Log = LoggerFactory.getLogger(PayLogsController.class);
@Autowired
private CacheHandle cacheHandle;
@Autowired
private UsersService usersService;
@Autowired
private PayLogsService payLogsService;
@RequestMapping("")
public String index() {
return "pages/PayLogs";
}
@GetMapping("/info")
@ResponseBody
public R getInfo(String id) {
Log.info("查找指定缴费记录,ID:{}", id);
PayLogs payLogs = payLogsService.getOne(id);
return R.successData(payLogs);
}
@PostMapping("/add")
@ResponseBody
public R addInfo( PayLogs payLogs) {
payLogs.setId(IDUtils.makeIDByCurrent());
payLogs.setCreateTime(DateUtils.getNowDate());
Log.info("添加缴费记录,传入参数:{}", payLogs);
payLogsService.add(payLogs);
return R.success();
}
@PostMapping("/upd")
@ResponseBody
public R updInfo(PayLogs payLogs) {
Log.info("修改缴费记录,传入参数:{}", payLogs);
payLogsService.update(payLogs);
return R.success();
}
@PostMapping("/del")
@ResponseBody
public R delInfo(String id) {
Log.info("删除缴费记录, ID:{}", id);
PayLogs payLogs = payLogsService.getOne(id);
payLogsService.delete(payLogs);
return R.success();
}
费用记录管理界面,如图5-1-8所示:
图5-1-8费用记录管理
5.2 系统测试
测试工作是系统的最后一个工作环节,用以检验系统的各项功能是否实现及性能是否优良,对软件的质量和使用方便度做出正确评价[5]。软件测试从方法上可以分为黑盒测试和白盒测试,黑盒测试就是把系统封闭起来,从行为出发进行测试,而白盒测试更加注重内部结构,更关注程序编写的正确和规范与否[6]。