系统总体设计
14.2.1 功能结构设计
1.系统功能描述
基于上述需求分析,本系统主要完成以下功能:
(1) 学生信息管理模块
学生信息管理模块完成学生信息的管理功能,包括用户的登录、用户的退出、用户的个人信息录入、修改、查询、删除等
(2) 课程信息管理模块
课程信息管理模块主要是为系统管理员提供了课程管理功能,主要包括课程信息的录入、课程的增加、课程的修改、课程的删除等功能。
(3) 成绩管理模块
成绩管理模块主要实现学生成绩的管理功能,包括成绩的输入、成绩的查询、修改、删除等基本操作。
(4) 综合考评数据管理
综合考评数据管理模块主要实现了自动评语库的管理、自动生成评语、手工修改评语。
(5) 家庭报告书打印模块
家庭报告书打印模块主要是为了方便班主任将家庭报告书邮寄给家长而设计的。
(6) 系统维护
系统维护主页完成数据备份与恢复,账号及权限的管理。为了确保信息安全,需要对重要数据进行备份,必要的时候再从备份的数据中恢复数据。系统管理员可以添加、修改或删除管理员账号,分配管理职责和权限。
2.系统功能结构图
根据上面功能模块分析,系统功能结构图如图14-3所示。限于篇幅,本书只介绍信息管理、数据维护和报表输出三个功能模块。
图14-3 系统功能结构图
14.2.2 数据库设计
通过对上述需求分析中的数据需求进行总结,综合测评管理系统主要有以下数据结构及其数据项:
(1) 管理员:管理员编号、姓名、密码
(2) 班级:班级代码、班级名称、学院名称、毕业时间
(3) 职务:班级代码、管理员编号、职务、权限
(4) 学生:学号、密码、姓名、班级代码、出生年月、籍贯、家庭住址、邮政编码、宿舍、照片、简历
(5) 科目:科目编号、课程名称、学时、学分
(6) 选课:学号、科目编号、学年、学期、成绩
(7) 测评:学号、学年、名次、等级、奖惩情况、综合评语
3.数据库概念结构设计
数据库概念结构设计通过对用户进行综合、归纳与抽象,形成一个独立与具体DBMS的概念模型,既是整个数据库设计的关键,又是进行数据库逻辑结构设计的基础。在概念结构设计中主要采用实体联系(E-R)图作为描述工具,将实际应用抽象为实体与实体之间的关系,生成数据库的整体概念结构设计模型。
根据上面的实际规划出的实体有:用户信息实体、查询实体、课程实体、综合考评实体,课程成绩实体,家庭报告书实体。系统总体E-R图如图14-4所示。
图14-4 系统总体E-R图
4.数据库逻辑结构设计
数据库逻辑结构设计是指将数据库概念结构中抽象的E-R图转换为特定DBMS所支持的数据模型的过程,通常是转换成关系模型。
本设计中的DBMS采用Visual FoxPro 9.0来实现,作为关系数据库,数据库逻辑结构设计体现在其中即为数据表。数据库中各表的结构设计结果如表14-1至表14-8所示。
表14-1 管理员表(Admins)
标题 | 英文解释 | 字段名 | 字段属性 | 说明 |
管理员编号 | AdminID | AdID | C(5) | 主键 |
姓名 | AdminName | AdName | C(8) | |
密码 | Password | Psword |
表14-2 班级表(classes)
标题 | 英文解释 | 字段名 | 字段属性 | 说明 |
班级代码 | *ClassID | ClsID | C(8) | 主键 |
班级名称 | ClassName | ClsName | C(50) | |
学院名称 | SchoolName | SchName | C(50) | |
毕业时间 | GraduateDate | Gdate | D(8) |
表14-3 职务表(Adclass)
标题 | 英文解释 | 字段名 | 字段属性 | 说明 |
班级代码 | ClassID | ClsID | C(8) | |
管理员编号 | AdminID | AdID | C(5) | |
职务 | Adminduty | Adduty | C(10) | |
权限 | AdminPower | Adpower | N(1) |
表14-4 学生表 students
标题 | 英文解释 | 字段名 | 字段属性 | 说明 |
班级代号 | ClassID | ClsID | C(8) | |
学号 | *StudentID | SID | C(9) | 主键 |
姓名 | StudentName | SName | C(8) | |
性别 | Sex | Sex | C(2) | |
是否党员 | PartMember | Pmember | L(1) | |
出生日期 | Birthdate/Birthday | Birthday | D(8) | |
籍贯 | NativePlace | Native | C(14) | |
家庭地址 | Address | Address | C(50) | |
邮政编码 | PostCode | PCode | C(6) | |
照片 | Photo | Photo | G(4) | |
简历 | StudentNote | SNote | M(4) |
表14-5 科目表(courses)
标题 | 英文解释 | 字段名 | 字段属性 | 说明 |
科目代码 | *CourseID | CID | C(8) | 主键 |
科目名称 | CourseName | CName | C(30) | |
学时 | Period | Period | N(3) | |
学分 | CreditHour | Credit | N(5.2) |
表14-6 选课表(sc)
标题 | 英文解释 | 字段名 | 字段属性 | 说明 |
学号 | StudentID | SID | C(9) | |
科目代码 | CourseID | CID | C(8) | |
学年 | AcademicYear | AYear | C(9) | |
学期 | Term | Term | N(1) | |
成绩 | Score/results | Score1 | N(6) | |
绩点 | Score/Point | Score2 | N(3.1) |
表14-7 测评结果表(grade)
标题 | 英文解释 | 字段名 | 字段属性 | 说明 |
学号 | StudentID | SID | C(9) | |
学年 | AcademicYear | AYear | C(9) | |
名次 | Order/rank | Rank | N(3) | |
等级 | Grade | Grade | C(6) | |
奖惩情况 | Note | Note | M(4) | |
综合评语 | Remark | Remark | M(4) |
表14-8 自动评语表(Remarks)
标题 | 英文解释 | 字段名 | 字段属性 | 说明 |
编号 | RemarkID | RemID | N(3) | 主键 |
主题 | Title | Title | C(50) | |
综合评语 | Remark | Remark | M(4) |
5.数据库的实现
分析设计好数据库的逻辑结构之后,通过VFP数据库设计器来完成数据库的设计工作,设置表间关联关系以及参照完整性,如图14-5所示。
图14-5 数据库表及其关系图
在查询或报表输出时,需要多个表联合查询。为方便数据处理,通过VFP的视图设计器把多个相关联的表组合后生成视图文件,视图作为数据库的虚表,使用方式和数据一样,这样就可以大大简化查询或报表输出的设计过程。以下是本系统需要的视图:
(1) 学生成绩:班级代号、学年、学期、学号、姓名、课程代号、课程名称、成绩、学时、学分
(2) 综合测评结果:学院代号、学院名称、班级代号、班级名称、学号、姓名、学年、评定等级、名次、奖惩情况、评语
(3) 职责管理:班级代号、班级名称、管理代号、管理员姓名、权限
三个视图所涉及的查询代码为:
(1) 学生成绩
SELECT Students.clsid, Students.sid, Students.sname, Sc.ayear, Sc.term,;
Sc.score1, Sc.score2, Sc.cid, Courses.cname, Courses.period, Courses.credit;
FROM sdb!students INNER JOIN sdb!sc ;
ON Students.sid = Sc.sid ;
INNER JOIN sdb!courses ;
ON Courses.cid = Sc.cid;
ORDER BY Students.clsid, Students.sid, Sc.ayear, Sc.term
(2) 综合测评
SELECT Students.sname, Grade.ayear, Classes.schname, Classes.clsid,;
Classes.clsname, Grade.sid, Grade.rank, Grade.grade, Grade.note,;
Grade.remark;
FROM sdb!students ;
INNER JOIN sdb!grade ;
ON Students.sid = Grade.sid ;
INNER JOIN sdb!classes ;
ON Classes.clsid = Students.clsid;
WHERE Grade.ayear = ( "2008-2009" );
ORDER BY Students.clsid, Students.sid
(3) 职责管理
SELECT Admins.adid, Admins.adname, Adclass.adpower, Adclass.clsid, Classes.clsname;
FROM sdb!admins ;
INNER JOIN sdb!adclass ;
ON Admins.adid = Adclass.adid ;
INNER JOIN sdb!classes ;
ON Classes.clsid = Adclass.clsid;
ORDER BY Admins.adpower, Admins.adid
以上视图可以在数据库中通过视图设计器实现,也可以在程序中通过上述查询语句实现。
14.2.3系统主体框架设计
1.建立系统项目文件
采用VFP开发应用系统,项目管理器是必不可少的文档管理工具。有关项目管理器的概念及操作请参阅本书第二章,在此不再介绍。本系统项目名称是SIM(学生信息管理系统),选择“D:\SIM”作为默认工作目录。并建立如图14-6所示的目录结构。
图中文件夹Data、DataBack、ExcelFiles、Images、
Temp Wizards分别用于存储系统数据、数据备份、导出的Excel文件、图像文件、向导文件。
根据数据库表逻辑结构以及数据库表关联关系,在项目管理中实现数据库。详细操作请读者参阅图14-5以及本书第四章。
2.建立主程序文件
一般地,对于VFP应用系统而言都有一个主程序文件。在SIM中,主程序作为系统默认的起始运行程序,用于对系统进行初始化,并调用登录表单,开起事件循环。在项目管理器中新建程序文件main.prg,其代码如下:
CLEAR ALL
SET DATE LONG && 设置日期为长格式(9999年99月99日)
SET TALK OFF
SET SAFETY OFF && 覆盖时不要确认
application.Visible=.f. && 隐藏VFP系统主窗口
DO FORM Logon && 运行登录表单
READ EVENTS && 读取循环事件,否则程序不会驻留内存
主菜单出现在单文档界面(SDI)窗口中,在设计主菜单时,要把它创建为SDI菜单,打开菜单设计器,从View菜单中选择General Options,然后选择Top-Level Form。
菜单栏包括档案管理、课程管理、成绩查询、综合测评、打印输出、系统维护、帮助、退出八个一级菜单,每个一级菜单包含若干菜单项,每个菜单项对应调用一个表单。不同的菜单项授予的访问权限不一样,其中班级档案管理、课程信息维护以及系统维护的全部功能只能被系统管理员访问,对应的“跳过”表达式设置为Power_ID<>1。综合评语部分只能被系统管理员或班主任访问,所以“跳过”表达式设置为Power_ID>3 or Power_ID<=0
主菜单menusim.mpr的结构如表4-9所示。
表4-9 主菜单menusim.mpr的结构
菜单栏 | 菜单项 | 命令 | “跳过”表达式 |
档案管理(\<S) | 班级档案管理 | do form 11ClassMana | Power_ID<>1 |
学生档案管理 | do form 12StuMana | ||
学生信息浏览 | do form 13StuBrow | ||
课程管理(\<C) | 课程信息浏览 | do form 21CourseBrow | |
课程信息维护 | do form 22CourseMana | Power_ID<>1 | |
成绩查询(\<T) | 班级成绩浏览 | do form 31ClassScore | |
个人成绩查询 | do form 32StuScore | ||
综合测评(\<G) | 自动写评语 | do form 41AutoRemark | Power_ID>3 or Power_ID<=0 |
评语库维护 | do form 42Remark | Power_ID>3 or Power_ID<=0 | |
综合测评管理 | do form 43StuGrade | Power_ID>3 or Power_ID<=0 | |
打印输出(\<P) | 学生名册 | do form 51StuList | |
学生成绩单 | do form 52Score | ||
信封打印 | do form 53FamAddr | ||
家庭报告书 | do form 54FamData | ||
系统维护(\<M) | 账户管理 | do form 61Count | Power_ID<>1 |
职责管理 | do form 62duty | Power_ID<>1 | |
\- | BAR# | ||
数据备份 | do form 63backup | Power_ID<>1 | |
数据恢复 | do form 64Restore | Power_ID<>1 | |
帮助(\<H) | 关于本系统 | do form about | |
退出(\<Q) | 退出系统 | quit |
登录表单的主要功能是验证用户身份,获取用户权限。本系统用户权限根据不同的管理职责分为三个级别:班主任、辅导员、系统管理员。班主任只能管理本班学生的相关信息,辅导员可以管理本学院学生的相关信息,系统管理员可以管理全部学生的相关信息。经过用户身份验证通过后,根据用户权限生成对应的学生班级信息,产生一个临时文件,存放于Temp文件夹中。
登录表单由三个标签、两个文本框、两个命令按钮和两个线条控件组成。表单运行效果如果图14-7所示。
表单初始化过程中,需要定义三个变量,用于存储用户登录次数、用户ID和管理权限,表单Init过程的代码如下:
PUBLIC LogonTimes,User_ID,Power_ID
LogonTimes=0
命令按钮【确定】的Click事件代码如下:
SET EXACT ON &&改为精确比较
LogonTimes=LogonTimes+1 &&将登录次数加1
SELECT Admins
mps=THISFORM.txt密码.VALUE
mpswd=pswd(mps) &&调用自定义函数转换密码
LOCATE FOR ALLTRIM(AdID)=THISFORM.txt帐号.VALUE &&查找帐号
IF FOUND() AND ALLTRIM(PsWord)=mpswd &&如果找到并且密码相同
User_ID=ALLTRIM(THISFORM.TXT帐号.VALUE) &&将登录帐号值赋给全局变量User_ID
Power_ID=AdPower
SET EXACT OFF &&改为模糊比较
PUBLIC Class_ID,Class_Name,Sch_Name && 定义班级相关的三个公用变量
SELECT AdClass
SET ORDER TO ADPOWER && 选择索引顺序为ADPOWER(权限)
LOCATE FOR AdID=User_ID
IF NOT EOF()
Class_ID=ClsID
Power_ID=AdPower
ELSE
Class_ID='No duty'
** Power_ID='Default AdPower ' && 默认的权限在登录时确定
ENDIF
SET SAFETY OFF
DO CASE
CASE Power_ID=1 && 如果是管理员,查询全部学生
SELECT * FROM Classes ORDER BY ClsID INTO TABLE Temp\Cur_Class
CASE Power_ID=2 && 如果是辅导员,查询属于自己管理的学院的全部学生
SELECT * FROM Classes WHERE LEFT(ClsID,2)=LEFT(Class_ID,2);
ORDER BY ClsID INTO TABLE Temp\Cur_Class
CASE Power_ID>=3 && 如果是班主任或班长,查询属于自己管理的班级的学生
SELECT * FROM Classes WHERE ClsID=Class_ID ;
ORDER BY ClsID INTO TABLE Temp\Cur_Class
ENDCASE
SELECT Cur_Class && 查询生成的表默认打开,并设置为当前工作区
GO TOP
Class_ID=Cur_Class.ClsID
Class_Name=Cur_Class.ClsName
Sch_Name=Cur_Class.SchName
DO FORM Main
THISFORM.RELEASE
ELSE &&如果帐号和密码不对
IF LogonTimes<3 &&如果次数小于3次
MESSAGEBOX("帐号或密码错误!",48,"警告窗口") &&弹出错误窗口
THISFORM.txt帐号.VALUE="" &&清空帐号和密码栏
THISFORM.txt密码.VALUE=""
THISFORM.txt帐号.SETFOCUS
ELSE &&如果次数已到3次
MESSAGEBOX("系统无法启动 ……",48,"警告窗口")
CLEAR ALL
THISFORM.RELEASE
ENDIF
ENDIF
命令按钮【取消】的Click事件代码如下:
YN=MESSAGEBOX("放弃登录,确定退出系统? ",4+32,"信息窗口")
IF YN=6
CLOSE ALL
SET SAFETY ON && 覆盖时要确认
SET STAT BAR ON && 将状态栏打开
SET SYSMENU ON && 打开VFP系统菜单之区域(Band)
SET SYSMENU TO DEFAULT && 打开系统菜单
SET DATE LONG && 设置日期为长日期格式(9999年99月99日)
THISFORM.RELEASE
ENDIF
登录系统或进行账号维护时,需要多次使用密码转换程序,本系统采用字符映射简单加密算法进行明码与密码的转换。密码转换程序pswd.prg代码如下:
FUNCTION pswd
PARAMETERS mps
mps=ALLTRIM(mps)
mpswd=""
FOR i=1 TO LEN(mps))
mpswd=mpswd+CHR(ASC(SUBSTR(mps,i,1))+131-3*i) && 密码转换
ENDFOR
RETURN MPSWD
ENDFUNC
其他的定制服务 下方联系卡片↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 或者私信作者