所谓系统分析就是,管理员通过与用户客户端的沟通,所获取的信息,然后把这些信息通过需求说明书的方式展示给用户和开发人员。在软件功能发展的历史长河中,很长时间,特别是最开始的时候,需求分析的重要性并不被人们所认同,例如当时美国IBM公司为英国电信公司开发一套信息管理系统,在需求不明确的情况下开始开发,最初的工期为一年,由于需求获取不清晰导致工期推迟了半年多,造成巨大损失。我们很多软件公司也存在这种情况,边需求,边开发,甚至与客户没有沟通清楚的情况下,直接照搬同类型的项目进行更改,导致到系统验收的时候,重新更改,造成了人力、物力的极大浪费。而导致这一切后果的原因就是需求获取不及时、不清楚、不全面。
微信小程序的学生选课系统主要目标是实现学生在线选课、查看课程信息等相关信息管理服务。在确定了目标后,我们从以下四方面对能否实现本系统目标进行可行性分析。
3.1.1 技术可行性
学生选课系统主要采用微信小程序技术,java语言,Mysql数据库,对于应用程序的开发要求具备完整功能,使用简单的特点,并建立一个数据完整安全稳定的数据库。微信小程序的学生选课系统的开发技术具有很高可行性,且开发人员掌握了一定的开发技术,所以系统的开发具有可行性。
3.1.2操作可行性
微信小程序的学生选课系统的登录界面简单易于操作,采用常见的界面窗口来登录界面,通过电脑进行访问操作,用户只要平时使用过电脑都能进行访问操作。此系统的开发采用微信小程序开发,后台结合java语言,这些开发环境使系统更加完善。本系统具有易操作、易管理、交互性好的特点,在操作上是非常简单的。因此本系统可以进行开发。
3.1.3 经济可行性
微信小程序的学生选课系统是服务端基于B/S模式、java技术,客户端采用微信小程序、采用Mysql数据库储存数据,所要求的硬件和软件环境,市场上都很容易购买,程序开发主要是管理系统的开发和维护。所以程序在开发人力、财力上要求不高,而且此系统不是很复杂,开发周期短,在经济方面具有较高的可行性。
3.1.4 法律可行性
此微信小程序的学生选课系统是自己设计的管理系统,具有很大的实际意义。因为无论是软件还是数据库,采用的都是开源代码,因此这个系统的开发和设计,并不存在侵权等问题,在法律上完全具有可行性。
综上所述,微信小程序的学生选课系统在技术、经济、操作和法律上都具有很高的可行性,开发此程序是可行的。
3.2.1系统开发流程
微信小程序的学生选课系统开发时,首先进行需求分析,进而对系统进行总体的设计规划,设计系统功能模块,数据库的选择等,本系统的开发流程如图3-1所示
图3-1系统开发流程图
3.2.2 用户登录流程
为了保证系统的安全性,要使用本系统对系统信息进行管理,必须先登陆到系统中。如图3-3所示。
图3-2 登录流程图
3.2.3 系统操作流程
用户打开客户端并进入系统后,会先显示登录界面,输入正确的用户名和密码,系统自动检测信息,若信息无误,则用户会进入系统功能界面,进行操作,否则会提示错误无法登录,操作流程如图3-3所示。
图3-3 系统操作流程图
3.2.4 添加信息流程
管理员可以对用户信息等进行信息的添加、删除、修改,用户也可以对自己权限内的信息进行添加删除、修改等等操作,输入信息后,系统会自行验证输入的信息和数据,若信息正确,会将其添加到数据库内,若信息有误,则会提示重新输入信息,添加信息流程如图3-4所示。
图3-4 添加信息流程图
3.2.5 修改信息流程
管理员可以对选课信息、课程信息、新闻资讯等进行信息的修改,用户也可以对自己权限内的信息进行修改,首先进入修改信息界面,输入修改信息数据,系统进行数据的判断验证,修改信息合法则修改成功,信息更新至数据库,信息不合法则修改失败,重新输入。修改信息流程图如图3-5所示。
图3-5 修改信息流程图
3.2.6 删除信息流程
管理员可以对微信小程序的学生选课系统管理等进行信息的删除,对要删除的信息进行选中后,点击删除按钮,系统会询问是否确定,若点击确定,则系统会删除掉选中的信息,并在数据库内对信息进行删除,删除信息流程图如图3-6所示。
图3-6 删除信息流程图
1.学生用户主要使用系统的微信小程序的学生选课系统查看首页、新闻资讯、交流论坛、课程信息、选课信息、网站公告、基本信息等,下图所示为学生用户的用例图。
图3-1 学生用户用例图
2.讲师用户主要使用系统的微信小程序的学生选课系统查看首页、新闻资讯、交流论坛、课程信息、选课信息、网站公告、基本信息等,下图所示为讲师用户的用例图。
图3-2?讲师用户用例图
3.管理员主要负责首页、轮播图管理、系统公告管理、资源管理(新闻资讯、新闻分类)交流管理(交流论坛、论坛分类)系统用户(管理员、学生用户、讲师用户)模块管理(课程类型、课程信息、选课信息)等功能模块,下图所示描述管理员的用例图。
图3-3?管理员用例图
3.4.1添加信息流程
添加信息,编号系统使用自动编号模式,没有用户填写,用户添加信息输入信息,系统将自动确认的信息和数据,验证的成功是有效的信息添加到数据库,信息无效,重新输入信息。添加信息流程如图3-3所示。
图3-3?添加信息流程图
3.4.2操作流程
用户想进入系统,首先进入系统登录界面,通过正确的用户名、密码,选择登录类型登录,系统会检查登录信息,信息正确,然后输入相应的功能界面,提示信息错误,登录失败。系统操作流程如图3-4所示。
图3-4操作流程图
3.4.3删除信息流程
用户选择要删除的信息并单击Delete按钮。系统提示是否删除信息。如果用户想要删除信息,系统将删除信息。系统数据库删除信息。删除信息流程图如图3-5所示。
图3-5?删除信息流程图
进过系统的分析后,就开始记性系统的设计,系统设计包含总体设计和详细设计。总体设计只是一个大体的设计,经过了总体设计,我们能够划分出系统的一些东西,例如文件、文档、数据等。而且我们通过总体设计,大致可以划分出了程序的模块,以及功能。但是只是一个初步的分类,并没有真正的实现。
整体设计,只是一个初步设计,而且,对于一个项目,我们可以进行多个整体设计,通过对比,包括性能的对比、成本的对比、效益的对比,来最终确定一个最优的设计方案,选择优秀的整体设计可以降低开发成本,增加公司效益,从这一点来讲,整体设计还是非常重要的。
微信小程序的学生选课系统工作原理图如图4-1所示:
图4-1 系统工作原理图
系统架构图属于系统设计阶段,系统架构图只是这个阶段一个产物,系统的总体架构决定了整个系统的模式,是系统的基础。基于微信小程序的学生选课系统的整体结构设计如图4-2所示。
4-2 系统结构图
4.2数据库设计
数据库是计算机信息系统的基础。目前,电脑系统的关键与核心部分就是数据库。数据库开发的优劣对整个系统的质量和速度有着直接影响。
4.2.1 数据库设计原则
概念模式它主要是建立在数据需求分析的基础上,它通常是用概念数据模型来表示各个数据之间的联系,并且对系统用户进行信息的处理和管理,同时建立起E-R图来表示具体的实体、属性和联系的关系。
4.2.2 数据库实体
每个数据库的应用它们都是和区分开的,当运行到一定的程序当中,它就会与自己相关的协议与客户端进行通讯。那么这个系统就会对使这些数据进行连接。当我们选择哪个桥段的时候,接下来就会简单的叙述这个数据库是如何来创建的。当点击完成按钮的时候就会自动在对话框内弹出数据源的名称,在进行点击下一步即可,直接在输入相对应的身份验证和登录密码。?
微信小程序的学生选课系统的数据流程:
图4-4??系统数据流程图
微信小程序的学生选课系统实体E-R图,如图4.5所示。
图4.5实体E-R图
4.3.1?数据库表设计
数据库的表信息属于设计的一部分,下面介绍数据库中的各个表的详细信息。
编号
名称
数据类型
长度
小数位
允许空值
主键
默认值
说明
1
token_id
int
10
0
N
Y
临时访问牌ID
2
token
varchar
64
0
Y
N
临时访问牌
3
info
text
65535
0
Y
N
4
maxage
int
10
0
N
N
2
最大寿命:默认2小时
5
create_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
创建时间:
6
update_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
更新时间:
7
user_id
int
10
0
N
N
0
用户编号:
编号
名称
数据类型
长度
小数位
允许空值
主键
默认值
说明
1
article_id
mediumint
8
0
N
Y
文章id:[0,8388607]
2
title
varchar
125
0
N
Y
标题:[0,125]用于文章和html的title标签中
3
type
varchar
64
0
N
N
0
文章分类:[0,1000]用来搜索指定类型的文章
4
hits
int
10
0
N
N
0
点击数:[0,1000000000]访问这篇文章的人次
5
praise_len
int
10
0
N
N
0
点赞数
6
create_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
创建时间:
7
update_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
更新时间:
8
source
varchar
255
0
Y
N
来源:[0,255]文章的出处
9
url
varchar
255
0
Y
N
来源地址:[0,255]用于跳转到发布该文章的网站
10
tag
varchar
255
0
Y
N
标签:[0,255]用于标注文章所属相关内容,多个标签用空格隔开
11
content
longtext
2147483647
0
Y
N
正文:文章的主体内容
12
img
varchar
255
0
Y
N
封面图
13
description
text
65535
0
Y
N
文章描述
编号
名称
数据类型
长度
小数位
允许空值
主键
默认值
说明
1
type_id
smallint
5
0
N
Y
分类ID:[0,10000]
2
display
smallint
5
0
N
N
100
显示顺序:[0,1000]决定分类显示的先后顺序
3
name
varchar
16
0
N
N
分类名称:[2,16]
4
father_id
smallint
5
0
N
N
0
上级分类ID:[0,32767]
5
description
varchar
255
0
Y
N
描述:[0,255]描述该分类的作用
6
icon
text
65535
0
Y
N
分类图标:
7
url
varchar
255
0
Y
N
外链地址:[0,255]如果该分类是跳转到其他网站的情况下,就在该URL上设置
8
create_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
创建时间:
9
update_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
更新时间:
编号
名称
数据类型
长度
小数位
允许空值
主键
默认值
说明
1
auth_id
int
10
0
N
Y
授权ID:
2
user_group
varchar
64
0
Y
N
用户组:
3
mod_name
varchar
64
0
Y
N
模块名:
4
table_name
varchar
64
0
Y
N
表名:
5
page_title
varchar
255
0
Y
N
页面标题:
6
path
varchar
255
0
Y
N
路由路径:
7
position
varchar
32
0
Y
N
位置:
8
mode
varchar
32
0
N
N
_blank
跳转方式:
9
add
tinyint
3
0
N
N
1
是否可增加:
10
del
tinyint
3
0
N
N
1
是否可删除:
11
set
tinyint
3
0
N
N
1
是否可修改:
12
get
tinyint
3
0
N
N
1
是否可查看:
13
field_add
text
65535
0
Y
N
添加字段:
14
field_set
text
65535
0
Y
N
修改字段:
15
field_get
text
65535
0
Y
N
查询字段:
16
table_nav_name
varchar
500
0
Y
N
跨表导航名称:
17
table_nav
varchar
500
0
Y
N
跨表导航:
18
option
text
65535
0
Y
N
配置:
19
create_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
创建时间:
20
update_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
更新时间:
编号
名称
数据类型
长度
小数位
允许空值
主键
默认值
说明
1
collect_id
int
10
0
N
Y
收藏ID:
2
user_id
int
10
0
N
N
0
收藏人ID:
3
source_table
varchar
255
0
Y
N
来源表:
4
source_field
varchar
255
0
Y
N
来源字段:
5
source_id
int
10
0
N
N
0
来源ID:
6
title
varchar
255
0
Y
N
标题:
7
img
varchar
255
0
Y
N
封面:
8
create_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
创建时间:
9
update_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
更新时间:
编号
名称
数据类型
长度
小数位
允许空值
主键
默认值
说明
1
comment_id
int
10
0
N
Y
评论ID:
2
user_id
int
10
0
N
N
0
评论人ID:
3
reply_to_id
int
10
0
N
N
0
回复评论ID:空为0
4
content
longtext
2147483647
0
Y
N
内容:
5
nickname
varchar
255
0
Y
N
昵称:
6
avatar
varchar
255
0
Y
N
头像地址:[0,255]
7
create_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
创建时间:
8
update_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
更新时间:
9
source_table
varchar
255
0
Y
N
来源表:
10
source_field
varchar
255
0
Y
N
来源字段:
11
source_id
int
10
0
N
N
0
来源ID:
编号
名称
数据类型
长度
小数位
允许空值
主键
默认值
说明
1
course_information_id
int
10
0
N
Y
课程信息ID
2
course_no
varchar
64
0
Y
N
课程编号
3
course_name
varchar
64
0
Y
N
课程名称
4
cover
varchar
255
0
Y
N
封面
5
course_type
varchar
64
0
Y
N
课程类型
6
course_location
varchar
64
0
Y
N
开课地点
7
opening_time
varchar
64
0
Y
N
开课时间
8
lecturer_user
int
10
0
Y
N
0
讲师用户
9
lecturer_name
varchar
64
0
Y
N
讲师姓名
10
course_details
text
65535
0
Y
N
课程详情
11
hits
int
10
0
N
N
0
点击数
12
recommend
int
10
0
N
N
0
智能推荐
13
timer_title
varchar
64
0
Y
N
计时器标题
14
timing_start_time
datetime
19
0
Y
N
计时开始时间
15
timing_end_time
datetime
19
0
Y
N
计时结束时间
16
limit_times
int
10
0
N
N
0
限制次数
17
limit_type
tinyint
4
0
N
N
2
限制次数类型1-每天次,2-总计次
18
create_time
datetime
19
0
N
N
CURRENT_TIMESTAMP
创建时间
19
update_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
更新时间
编号
名称
数据类型
长度
小数位
允许空值
主键
默认值
说明
1
course_selection_information_id
int
10
0
N
Y
选课信息ID
2
course_no
varchar
64
0
Y
N
课程编号
3
course_name
varchar
64
0
Y
N
课程名称
4
cover
varchar
255
0
Y
N
封面
5
course_type
varchar
64
0
Y
N
课程类型
6
course_location
varchar
64
0
Y
N
开课地点
7
opening_time
varchar
64
0
Y
N
开课时间
8
lecturer_user
int
10
0
Y
N
0
讲师用户
9
lecturer_name
varchar
64
0
Y
N
讲师姓名
10
student_users
int
10
0
Y
N
0
学生用户
11
student_id
varchar
64
0
Y
N
学生学号
12
student_name
varchar
64
0
Y
N
学生姓名
13
recommend
int
10
0
N
N
0
智能推荐
14
user_id
int
10
0
N
N
0
用户ID
15
create_time
datetime
19
0
N
N
CURRENT_TIMESTAMP
创建时间
16
update_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
更新时间
编号
名称
数据类型
长度
小数位
允许空值
主键
默认值
说明
1
course_type_id
int
10
0
N
Y
课程类型ID
2
course_type
varchar
64
0
Y
N
课程类型
3
recommend
int
10
0
N
N
0
智能推荐
4
create_time
datetime
19
0
N
N
CURRENT_TIMESTAMP
创建时间
5
update_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
更新时间
编号
名称
数据类型
长度
小数位
允许空值
主键
默认值
说明
1
forum_id
mediumint
8
0
N
Y
论坛id
2
display
smallint
5
0
N
N
100
排序
3
user_id
mediumint
8
0
N
N
0
用户ID
4
nickname
varchar
16
0
Y
N
昵称:[0,16]
5
praise_len
int
10
0
Y
N
0
点赞数
6
hits
int
10
0
N
N
0
访问数
7
title
varchar
125
0
N
N
标题
8
keywords
varchar
125
0
Y
N
关键词
9
description
varchar
255
0
Y
N
描述
10
url
varchar
255
0
Y
N
来源地址
11
tag
varchar
255
0
Y
N
标签
12
img
text
65535
0
Y
N
封面图
13
content
longtext
2147483647
0
Y
N
正文
14
create_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
创建时间:
15
update_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
更新时间:
16
avatar
varchar
255
0
Y
N
发帖人头像:
17
type
varchar
64
0
N
N
0
论坛分类:[0,1000]用来搜索指定类型的论坛帖
编号
名称
数据类型
长度
小数位
允许空值
主键
默认值
说明
1
type_id
smallint
5
0
N
Y
分类ID:[0,10000]
2
name
varchar
16
0
N
N
分类名称:[2,16]
3
description
varchar
255
0
Y
N
描述:[0,255]描述该分类的作用
4
url
varchar
255
0
Y
N
外链地址:[0,255]如果该分类是跳转到其他网站的情况下,就在该URL上设置
5
father_id
smallint
5
0
N
N
0
上级分类ID:[0,32767]
6
icon
varchar
255
0
Y
N
分类图标:
7
create_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
创建时间:
8
update_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
更新时间:
编号
名称
数据类型
长度
小数位
允许空值
主键
默认值
说明
1
hits_id
int
10
0
N
Y
点赞ID:
2
user_id
int
10
0
N
N
0
点赞人:
3
create_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
创建时间:
4
update_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
更新时间:
5
source_table
varchar
255
0
Y
N
来源表:
6
source_field
varchar
255
0
Y
N
来源字段:
7
source_id
int
10
0
N
N
0
来源ID:
编号
名称
数据类型
长度
小数位
允许空值
主键
默认值
说明
1
lecturer_user_id
int
10
0
N
Y
讲师用户ID
2
lecturer_name
varchar
64
0
Y
N
讲师姓名
3
lecturer_gender
varchar
64
0
Y
N
讲师性别
4
examine_state
varchar
16
0
N
N
已通过
审核状态
5
recommend
int
10
0
N
N
0
智能推荐
6
user_id
int
10
0
N
N
0
用户ID
7
create_time
datetime
19
0
N
N
CURRENT_TIMESTAMP
创建时间
8
update_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
更新时间
编号
名称
数据类型
长度
小数位
允许空值
主键
默认值
说明
1
notice_id
mediumint
8
0
N
Y
公告id:
2
title
varchar
125
0
N
N
标题:
3
content
longtext
2147483647
0
Y
N
正文:
4
create_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
创建时间:
5
update_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
更新时间:
编号
名称
数据类型
长度
小数位
允许空值
主键
默认值
说明
1
praise_id
int
10
0
N
Y
点赞ID:
2
user_id
int
10
0
N
N
0
点赞人:
3
create_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
创建时间:
4
update_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
更新时间:
5
source_table
varchar
255
0
Y
N
来源表:
6
source_field
varchar
255
0
Y
N
来源字段:
7
source_id
int
10
0
N
N
0
来源ID:
8
status
bit
1
0
N
N
1
点赞状态:1为点赞,0已取消
编号
名称
数据类型
长度
小数位
允许空值
主键
默认值
说明
1
slides_id
int
10
0
N
Y
轮播图ID:
2
title
varchar
64
0
Y
N
标题:
3
content
varchar
255
0
Y
N
内容:
4
url
varchar
255
0
Y
N
链接:
5
img
varchar
255
0
Y
N
轮播图:
6
hits
int
10
0
N
N
0
点击量:
7
create_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
创建时间:
8
update_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
更新时间:
编号
名称
数据类型
长度
小数位
允许空值
主键
默认值
说明
1
student_users_id
int
10
0
N
Y
学生用户ID
2
student_id
varchar
64
0
N
N
学生学号
3
student_name
varchar
64
0
Y
N
学生姓名
4
student_gender
varchar
64
0
Y
N
学生性别
5
examine_state
varchar
16
0
N
N
已通过
审核状态
6
recommend
int
10
0
N
N
0
智能推荐
7
user_id
int
10
0
N
N
0
用户ID
8
create_time
datetime
19
0
N
N
CURRENT_TIMESTAMP
创建时间
9
update_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
更新时间
编号
名称
数据类型
长度
小数位
允许空值
主键
默认值
说明
1
upload_id
int
10
0
N
Y
上传ID
2
name
varchar
64
0
Y
N
文件名
3
path
varchar
255
0
Y
N
访问路径
4
file
varchar
255
0
Y
N
文件路径
5
display
varchar
255
0
Y
N
显示顺序
6
father_id
int
10
0
Y
N
0
父级ID
7
dir
varchar
255
0
Y
N
文件夹
8
type
varchar
32
0
Y
N
文件类型
编号
名称
数据类型
长度
小数位
允许空值
主键
默认值
说明
1
user_id
mediumint
8
0
N
Y
用户ID:[0,8388607]用户获取其他与用户相关的数据
2
state
smallint
5
0
N
N
1
账户状态:[0,10](1可用|2异常|3已冻结|4已注销)
3
user_group
varchar
32
0
Y
N
所在用户组:[0,32767]决定用户身份和权限
4
login_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
上次登录时间:
5
phone
varchar
11
0
Y
N
手机号码:[0,11]用户的手机号码,用于找回密码时或登录时
6
phone_state
smallint
5
0
N
N
0
手机认证:[0,1](0未认证|1审核中|2已认证)
7
username
varchar
16
0
N
N
用户名:[0,16]用户登录时所用的账户名称
8
nickname
varchar
16
0
Y
N
昵称:[0,16]
9
password
varchar
64
0
N
N
密码:[0,32]用户登录所需的密码,由6-16位数字或英文组成
10
varchar
64
0
Y
N
邮箱:[0,64]用户的邮箱,用于找回密码时或登录时
11
email_state
smallint
5
0
N
N
0
邮箱认证:[0,1](0未认证|1审核中|2已认证)
12
avatar
varchar
255
0
Y
N
头像地址:[0,255]
13
create_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
创建时间:
编号
名称
数据类型
长度
小数位
允许空值
主键
默认值
说明
1
group_id
mediumint
8
0
N
Y
用户组ID:[0,8388607]
2
display
smallint
5
0
N
N
100
显示顺序:[0,1000]
3
name
varchar
16
0
N
N
名称:[0,16]
4
description
varchar
255
0
Y
N
描述:[0,255]描述该用户组的特点或权限范围
5
source_table
varchar
255
0
Y
N
来源表:
6
source_field
varchar
255
0
Y
N
来源字段:
7
source_id
int
10
0
N
N
0
来源ID:
8
register
smallint
5
0
Y
N
0
注册位置:
9
create_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
创建时间:
10
update_time
timestamp
19
0
N
N
CURRENT_TIMESTAMP
更新时间:
管理员输入个人的账号、密码登录系统,这时候系统的数据库就会在进行查找相关的信息,如果我们输入的账号、密码不正确,数据库就会提示出错误的信息提示,同时会提示管理员重新输入自己的账号、密码,直到账号密码输入成功后,会提示登录成功的信息。管理员登录效果图如图5.1所示:
图5.1登录界面
登录代码如下:
????@PostMapping("login")
????public Map<String, Object> login(@RequestBody Map<String, String> data, HttpServletRequest httpServletRequest) {
????????log.info("[执行登录接口]");
????????String username = data.get("username");
????????String email = data.get("email");
????????String phone = data.get("phone");
????????String password = data.get("password");
????????List resultList = null;
????????Map<String, String> map = new HashMap<>();
????????if(username != null && "".equals(username) == false){
????????????map.put("username", username);
????????????resultList = service.select(map, new HashMap<>()).getResultList();
????????}
????????else if(email != null && "".equals(email) == false){
????????????map.put("email", email);
????????????resultList = service.select(map, new HashMap<>()).getResultList();
????????}
????????else if(phone != null && "".equals(phone) == false){
????????????map.put("phone", phone);
????????????resultList = service.select(map, new HashMap<>()).getResultList();
????????}else{
????????????return error(30000, "账号或密码不能为空");
????????}
????????if (resultList == null || password == null) {
????????????return error(30000, "账号或密码不能为空");
????????}
????????//判断是否有这个用户
????????if (resultList.size()<=0){
????????????return error(30000,"用户不存在");
????????}
????????User byUsername = (User) resultList.get(0);
????????Map<String, String> groupMap = new HashMap<>();
????????groupMap.put("name",byUsername.getUserGroup());
????????List groupList = userGroupService.select(groupMap, new HashMap<>()).getResultList();
????????if (groupList.size()<1){
????????????return error(30000,"用户组不存在");
????????}
????????UserGroup userGroup = (UserGroup) groupList.get(0);
????????//查询用户审核状态
????????if (!StringUtils.isEmpty(userGroup.getSourceTable())){
????????????String sql = "select examine_state from "+ userGroup.getSourceTable() +" WHERe user_id = " + byUsername.getUserId();
????????????String res = String.valueOf(service.runCountSql(sql).getSingleResult());
????????????if (res==null){
????????????????return error(30000,"用户不存在");
????????????}
????????????if (!res.equals("已通过")){
????????????????return error(30000,"该用户审核未通过");
????????????}
????????}
????????//查询用户状态
????????if (byUsername.getState()!=1){
????????????return error(30000,"用户非可用状态,不能登录");
????????}
????????String md5password = service.encryption(password);
????????if (byUsername.getPassword().equals(md5password)) {
????????????// 存储Token到数据库
????????????AccessToken accessToken = new AccessToken();
????????????accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", ""));
????????????accessToken.setUser_id(byUsername.getUserId());
????????????tokenService.save(accessToken);
????????????// 返回用户信息
????????????JSonObject user = JSONObject.parseObject(JSONObject.toJSonString(byUsername));
????????????user.put("token", accessToken.getToken());
????????????JSonObject ret = new JSonObject();
????????????ret.put("obj",user);
????????????return success(ret);
????????} else {
????????????return error(30000, "账号或密码不正确");
????????}
}
管理员可以查看后台服务端首页、轮播图管理、系统公告管理、资源管理(新闻资讯、新闻分类)交流管理(论坛列表、论坛分类)模块管理(课程类型、课程信息、选课信息)等功能模块,还可进行相应的操作。管理员服务端效果图如图5.2所示。
图5.2管理员服务端界面图
管理员功能页代码如下:
???@RequestMapping("/get_obj")
????public Map<String, Object> obj(HttpServletRequest request) {
????????Query select = service.select(service.readQuery(request), service.readConfig(request));
????????List resultList = select.getResultList();
????????if (resultList.size() > 0) {
????????????JSonObject jsonObject = new JSonObject();
????????????jsonObject.put("obj",resultList.get(0));
????????????return success(jsonObject);
????????} else {
????????????return success(null);
????????}
}
?public Query select(Map<String,String> query,Map<String,String> config){
????????StringBuffer sql = new StringBuffer("select ");
????????sql.append(config.get(FindConfig.FIELD) == null || "".equals(config.get(FindConfig.FIELD)) ? "*" : config.get(FindConfig.FIELD)).append(" ");
????????sql.append("from ").append("`").append(table).append("`").append(toWhereSql(query, "0".equals(config.get(FindConfig.LIKE))));
????????if (config.get(FindConfig.GROUP_BY) != null && !"".equals(config.get(FindConfig.GROUP_BY))){
????????????sql.append("group by ").append(config.get(FindConfig.GROUP_BY)).append(" ");
????????}
????????if (config.get(FindConfig.ORDER_BY) != null && !"".equals(config.get(FindConfig.ORDER_BY))){
????????????sql.append("order by ").append(config.get(FindConfig.ORDER_BY)).append(" ");
????????}
????????if (config.get(FindConfig.PAGE) != null && !"".equals(config.get(FindConfig.PAGE))){
????????????int page = config.get(FindConfig.PAGE) != null && !"".equals(config.get(FindConfig.PAGE)) ? Integer.parseInt(config.get(FindConfig.PAGE)) : 1;
????????????int limit = config.get(FindConfig.SIZE) != null && !"".equals(config.get(FindConfig.SIZE)) ? Integer.parseInt(config.get(FindConfig.SIZE)) : 10;
????????????sql.append(" limit ").append( (page-1)*limit ).append(" , ").append(limit);
????????}
????????log.info("[{}] - 查询操作,sql: {}",table,sql);
????????return runEntitySql(sql.toString());
????}
系统用户管理
管理员对注册用户进行审核等操作,并可进行进行删除、修改、查看等操作。系统用户管理效果图如图5.3所示。
图5.3系统用户管理界面图
用户管理代码如下:
???@RequestMapping("/get_list")
????public Map<String, Object> getList(HttpServletRequest request) {
????????Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request));
????????return success(map);
}
资源管理
管理员在此页面可查看新闻资讯和新闻分类两个子菜单,可对这两个子菜单进行添加、重置、查询、删除等操作。资源管理如图5.4所示。
图5.4资源管理界面图
资源管理代码如下:
?@PostMapping("/upload")
????public Map<String, Object> upload(@RequestParam("file") MultipartFile file) {
????????log.info("进入方法");
????????if (file.isEmpty()) {
????????????return error(30000, "没有选择文件");
????????}
????????try {
????????????//判断有没路径,没有则创建
????????????String filePath = System.getProperty("user.dir") + "\target\classes\static\upload\";
????????????File targetDir = new File(filePath);
????????????if (!targetDir.exists() && !targetDir.isDirectory()) {
????????????????if (targetDir.mkdirs()) {
????????????????????log.info("创建目录成功");
????????????????} else {
????????????????????log.error("创建目录失败");
????????????????}
????????????}
????????????String fileName = file.getOriginalFilename();
????????????File dest = new File(filePath + fileName);
????????????log.info("文件路径:{}", dest.getPath());
????????????log.info("文件名:{}", dest.getName());
????????????file.transferTo(dest);
????????????JSonObject jsonObject = new JSonObject();
????????????jsonObject.put("url", "/api/upload/" + fileName);
????????????return success(jsonObject);
????????} catch (IOException e) {
????????????log.info("上传失败:{}", e.getMessage());
????????}
????????return error(30000, "上传失败");
}
交流管理
管理员在此页面可看到论坛列表和论坛分类两个子菜单,可对这两个子菜单进行添加、重置、查询、删除等操作。交流管理如图5.5所示。
图5.5交流管理界面图
交流管理代码如下:
?@PostMapping("/add")
????@Transactional
????public Map<String, Object> add(HttpServletRequest request) throws IOException {
????????service.insert(service.readBody(request.getReader()));
????????return success(1);
????}
????@Transactional
????public Map<String, Object> addMap(Map<String,Object> map){
????????service.insert(map);
????????return success(1);
}
????public Map<String,Object> readBody(BufferedReader reader){
????????BufferedReader br = null;
????????StringBuilder sb = new StringBuilder("");
????????try{
????????????br = reader;
????????????String str;
????????????while ((str = br.readLine()) != null){
????????????????sb.append(str);
????????????}
????????????br.close();
????????????String json = sb.toString();
????????????return JSONObject.parseObject(json, Map.class);
????????}catch (IOException e){
????????????e.printStackTrace();
????????}finally{
????????????if (null != br){
????????????????try{
????????????????????br.close();
????????????????}catch (IOException e){
????????????????????e.printStackTrace();
????????????????}
????????????}
????????}
????????return null;
}
????public void insert(Map<String,Object> body){
????????StringBuffer sql = new StringBuffer("INSERT INTO ");
????????sql.append("`").append(table).append("`").append(" (");
????????for (Map.Entry<String,Object> entry:body.entrySet()){
????????????sql.append("`"+humpToLine(entry.getKey())+"`").append(",");
????????}
????????sql.deleteCharAt(sql.length()-1);
????????sql.append(") VALUES (");
????????for (Map.Entry<String,Object> entry:body.entrySet()){
????????????Object value = entry.getValue();
????????????if (value instanceof String){
????????????????sql.append("'").append(entry.getValue()).append("'").append(",");
????????????}else {
????????????????sql.append(entry.getValue()).append(",");
????????????}
????????}
????????sql.deleteCharAt(sql.length() - 1);
????????sql.append(")");
????????log.info("[{}] - 插入操作:{}",table,sql);
????????Query query = runCountSql(sql.toString());
????????query.executeUpdate();
????}
学生用户注册
学生用户注册在登陆页面填写账号、密码、邮箱、昵称、用户姓名、手机号码等信息,进行注册如图5.7所示
图5.7学生用户注册界面图
注册代码如下:
????@PostMapping("register")
????public Map<String, Object> signUp(@RequestBody User user) {
????????// 查询用户
????????Map<String, String> query = new HashMap<>();
????????query.put("username",user.getUsername());
????????List list = service.select(query, new HashMap<>()).getResultList();
????????if (list.size()>0){
????????????return error(30000, "用户已存在");
????????}
????????user.setUserId(null);
????????user.setPassword(service.encryption(user.getPassword()));
????????service.save(user);
????????return success(1);
}
????@Id
????@GeneratedValue(strategy = GenerationType.IDENTITY)
????@Column(name = "user_id")
????private Integer userId;
????
????@Basic
????@Column(name = "state")
????private Integer state;
????
????@Basic
????@Column(name = "user_group")
????private String userGroup;
????
????@Basic
????@Column(name = "login_time")
????private Timestamp loginTime;
????
????@Basic
????@Column(name = "phone")
????private String phone;
????
????@Basic
????@Column(name = "phone_state")
????private Integer phoneState;
????
????@Basic
????@Column(name = "username")
????private String username;
????
????@Basic
????@Column(name = "nickname")
????private String nickname;
????
????@Basic
????@Column(name = "password")
????private String password;
????
????@Basic
????@Column(name = "email")
????private String email;
????
????@Basic
????@Column(name = "email_state")
????private Integer emailState;
????
????@Basic
????@Column(name = "avatar")
????private String avatar;
????
????@Basic
????@Column(name = "create_time")
????@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
????private Timestamp createTime;
????@Basic
????@Transient
????private String code;
}
基本信息
在基本信息页面用户可以进行修改、查看、编辑用户信息、等操作如图5.8所示。
图5.8基本信息界面图
??前台首页
用户对查看首页详情页面,如图5.9所示。
图5.9前台首页功能界面图
??课程信息页面
学生用户在课程信息页面可通过搜索课程类型查看课程名称、封面图、课程类型、开课地点、开课时间、讲师用户、讲师姓名、课程详情、点击次数等详细信息,可进行收藏、评论、选课等操作,如图5.10 5.10.1所示。
5.10课程信息界面图
5.10.1选课界面图
系统公告
学生用户在系统公告页面可查看管理员发布的公告信息,如图5.11所示。
图5.11系统公告界面图
讲师在登陆页面填写账号、密码等信息进行登录,登录界面如图5.14所示
图5.14讲师登录界面图
讲师可以查看后台服务端首页、交流论坛、新闻资讯、课程信息、网站公告、选课信息、基本信息等功能模块,还可进行相应的操作。讲师服务端效果图如图5.15所示。
图5.15讲师功能界面图
课程信息:
讲师用户在课程信息页面可通过搜索课程名称或类型查看课程名称、封面图、课程类型、开课地点、开课时间、讲师用户、讲师姓名、点击数等详细信息,讲师可对课程信息进行添加、重置等操作,如图5.16所示。
图5.16课程信息界面图
图5.16添加课程信息界面图
系统开发的最后一个步骤就是系统测试,系统测试也是整个系统十分重要的一个环节,测试的好坏关系到产品的发展。客户对软件的质量、性能和可靠性等需求就要通过测试来实现。测试过程要必须遵循严谨性、完善性、规范性的原则,测试的主要目的就是看看在系统运行中,是否会出现bug,然后对出现的bug进行调试,直到程序完美运行。但是软件的测试只能尽可能的减少bug,理论上来说是无法达到消除bug。但是bug越少,系统出错的几率就越低,用户使用起来也更方便、更安全。
近年来,软件包含测试从现在的检验当中来看,系统接近预期目标可能出现的问题,并对这些错误做出相应的修正,假如我们不进行早期的测试错误就会延续下去,最后所做出的成品就会有很大的困难。
我们要在这个测试的过程当中找出错误。测试成软件开发的主要一部分,自从有了程序的设计那天开始,它就成为了重要的组成部分。经过统计来看,软件测试可以占据这个系统45%的工作量,而在软件开发的成本当中,对于测试成本来说它包含了很多的测试工作。每个程序测试时都会出现和遇到错误。在整个程序的开发过程当中,人为去查找错误是非常复杂和困难的,所以我们一般都会找一些测试的工具来进行测试
随着现代信息的快速发展,在社会各大领域中已经都开始应用网络信息技术,在应用网络技术的同时人们也开始把软件的质量问题作为了一个重要焦点来关注,因为一个软件的好与坏它决定着这个系统在市场上的生存,所以我们必须要把软件质量来做好,这样才有一定的生存能力。对于用户来说它们首先选用的都是保证这个系统软件的质量问题,因为一个系统的软件质量决定着用户在后期上成本经济的问题。图6-1就是纠错测试流程。
图6-1 测试与纠错信息流程
具体测试方法包括:黑盒测试和白盒测试。
黑盒测试又被人们称作为功能测试,通常是在程序的接口来做一些测试的方法,它一般包括对程序的功能和使用的方法来做出一些数据的接受和输出,同时还可以做出正确的输出信息,并保证与外部信息的完整性。
白盒测试通常被人们称作为结构测试,在整个程序的结构和处理当中它是由程序当中的逻辑测试和检验程序来完成一些正确的工作。
具体的功能测试它是包括:系统的适用性、准确性、安全性等功能测试。
本微信小程序的学生选课系统满足相关信息的管理需求,在设计时借鉴了国内外优秀网站的优点,从界面到系统设计都保证了管理员以及用户能够方便操作。系统的主要特点和优点归纳如下:
(1)本系统用的移置性和针对性都比较高,因为针对性高可以提供更好的服务而移置性可以在多个系统上运行,更给用户带来了极大的方便。
(2)该微信小程序的学生选课系统内容全面,管理方便可以及时的全面的处理各种错误,异常,这样避免了很多因用户的马虎操作而出现的失误,其操作方便,用户界面友好,能够上网的人都可以很好的进行操作。
经过对上述的测试结果分析,所有基本功能齐全,操作简单,系统运行性能良好,系统安全可靠,能促进微信小程序的学生选课系统的发展,发展前景广阔。