勤工助学管理系统
附件1:
课 程 设 计
题 目 学 院 专 业 班 级 学生姓名 指导教师
实验室勤工俭学管理系统
计信学院 金融信息化
1班 蒋汉 张世勇
2012
年
6
月
24
日
重庆工商大学课程设计成绩评定表
学院:计信学院 班级:金信1班 学生姓名:蒋汉 学号:2012131113
指导教师评定成绩: 2014年 6月 24日
目 录
1 需求分析 ........................................................................................................... 1
1.1 系统目标 ............................................................................................... 1 1.2 业务需求及处理流程 ........................................................................... 1 1.3 功能需求及数据需求分析 ................................................................... 3 1.4 业务规则分析 ....................................................................................... 4 2 概念设计 ........................................................................................................... 5
2.1 命名规范 ............................................................................................... 5 2.2 实体集及属性 ........................................................................................ 6 2.3 联系集及属性 ........................................................................................ 8 2.4 系统总ER 图 .......................................................................................... 8 3 逻辑设计 ......................................................................................................... 10
3.1 数据字典设计 ...................................................................................... 10 3.2 基本数据设计 ...................................................................................... 11 3.3 业务数据设计 ...................................................................................... 14 3.4 其它数据设计 ...................................................................................... 15 3.5 视图设计 .............................................................................................. 15 3.6 触发器设计 .......................................................................................... 16 3.7 存储过程设计 ...................................................................................... 16 4 模式求精 ......................................................................................................... 17
4.1 存在的问题 .......................................................................................... 17 4.2 解决方案 .............................................................................................. 17 5 物理设计 ......................................................................................................... 18
5.1 设计目标 .............................................................................................. 18 5.2 数据分布 .............................................................................................. 18 5.3 索引实现 .............................................................................................. 19 6 安全设计 ......................................................................................................... 20
6.1 设计目标 .............................................................................................. 20 6.2 用户设计 .............................................................................................. 20 6.3 权限设计 .............................................................................................. 20 7 总结...............................................................................................................22 8 附录1 数据库脚本 ...................................................................................... 233 9 附录2 触发器与存储过程 ............................................................................ 31
1 需求分析 1.1 系统目标
随着网络技术的发展和计算机的日益普及,数据库的应用范围越来越广泛,数据库应用的功能也越来越强大,在强调管理,强调信息的现代社会中它变得越来越普及。计算机技术的飞速发展,数据库技术作为数据管理的一个有效的手段,在各行各业中得到越来越广泛的应用。该程序在设计过程中严格遵循软件工程学的方法,用分阶段的生命周期计划严格管理,并主要讲述了程序的总体设计、详细设计阶段,对程序进行需求迭代,不断修正和改进,利用SQL SERVER 2000的强大数据库功能,直到形成一个完善的可行性系统和优美、秀丽的界面,方便实用的查询与维护功能共同构成了“勤工助学管理系统”。 勤工助学是任何一所高校都需要进行的一项工作。因此,开发制作勤工助学管理系统具有较大的社会现实意义。勤工助学管理系统是以Web 作为交流平台。系统管理员将工作的基本信息发布到网站上,所有用户都可查询工作信息,但只有会员才能申请工作并接受工作,获得工作,以使会员实现学习和工作的二者兼得,减轻家庭负担。
该勤工助学管理系统支持3类用户:游客、会员、管理员。游客可以随意浏览管理员发布的工作信息,但是只有在注册为网站会员之后才能申请工作及接受工作。会员登录系统后,可进行的主要操作有:通过不同方式查询工作信息、申请工作、确认工作、发布留言等。系统管理员登陆后,可进行的操作有:维护会员的信息、维护与发布工作信息、处理工作申请、回复留言等。
1.2 业务需求及处理流程
开发勤工助学管理系统的目的主要是为了帮助高校勤工部门提高工作效率,同时满足部分企业用人需求,增加在校学生的社会实践活动并达到减轻家庭负担的目的,实现高校勤工助学管理的系统化、规范化和自动化。故系统最终实现的主要功能如下:
(1) 主要业务包括:工作信息的发布与查询、分配与接受新的工作、工作记录、计算工资、发布或回复留言等。
(2) 工作的相关信息由管理员发布,所有学生会员都可以查找和接受工作。因此,工作的分派是非常方便的。在完成工作之后,可以浏览工作记录,工作记录包括工作信息以及工资等。同时,会员可以发布留言,这样可以及时地提高服务的质量。另外,学校之外的一些公司、机构也能够发布工作信息,但这些工作是不能分派给会员的。
主要业务的处理流程如下:
(1) 勤工助学管理系统功能如图1-1所示:
图1-1 勤工助学管理系统功能模块
(2) 管理员和学生会员的主要操作流程如图1-2所示:
(a) 管理员登陆
(b) 学生会员登陆
图1-2 勤工助学管理系统的主要业务流程
1.3 功能需求及数据需求分析
勤工助学管理系统的主要功能和数据需求包括:
(1) 会员注册管理 ①学生会员(即申请工作的对象)注册。学生会员注册时要求填写基本信息,包括姓名、学号、密码、性别、专业、班级、地址、电话、空闲时间、银行卡号等信息。
②公司会员(即提供工作的对象)注册。公司会员注册时要求填写基本信息,包括公司名称、公司法人姓名、密码、地址、电话、电子邮箱等信息。系统检查所有信息填写正确后提示会员注册成功,并返回会员编号。
(2) 工作信息管理 ①增加工作信息。当公司会员有新工作发布时,管理员负责添加和发布工作信息,包括提供工作的公司会员编号、工作内容、工作时间、工作地点、工资以及所需人数等。
②工作信息查询。所有人都可以查询管理员发布的工作信息及工作内容,但只有学生会员才能接受工作,并查询到自己的工作任务。
③工作信息的更新与删除。工作信息发布后,管理员可随时更新和删除工作信息。
④工作分配。管理员按照学生会员注册时填写的空闲时间来分配工作。但只有当会员确认之后才可以开始工作。
⑤接收工作。当会员登录到界面之后,可以查询自己的工作信息并及时地接收工作,否则,将被视为放弃该工作。
(3) 工作单管理
①工作单查询。学生会员确认工作后,会生成工作单。会员可随时查询工作单的最新状态以及全部历史记录。
②工作单受理。工作单生成之后,管理员对订单进行审核。如发现工作单信息不正确,则返回会员重新填写。如正确无误,则可通知学生会员开始工作。
(4) 用户管理
①会员信息维护。会员可修改、删除和更新自己的信息,管理员可修改、删除和更新所有会员的信息。
②会员等级。系统可对学生会员进行分级,即根据会员接受工作的次数来划分等级。
(5) 留言管理
①发布留言。会员可在网站发表留言或者评论。留言需记录留言人、留言内容、发布时间等信息。
②回复留言。管理员可回复留言,并记录回复人和回复时间及回复内容。
1.4 业务规则分析
(1) 所有用户都可以浏览管理员发布的工作信息,但是只有会员才能申请工作及接受工作。
(2) 只有会员可以申请工作。如果用户想申请工作,则必须注册成为会员。管理员会核查用户的信息,如果符合条件,用户将成为正式会员。
(3) 每位会员由会员编号唯一标识,会员编号由系统按时间顺序自动生成。 (4) 每份工作由工作编号唯一标识,工作编号由系统按时间顺序自动生成。 (5) 只有管理员可以修改、更新和删除由学校或者学校外部提供的工作的相关信息。
(6) 只有管理员可以分配工作。
(7) 工作被分为可分配工作和不可分配工作。可分配工作主要包括学校提供的工作;不可分配工作主要包括一些社会团体、组织等提供的工作
(8) 管理员根据会员的工作次数来分配工作。如果会员没有在规定的时间内确认招聘信息,管理员将认为该会员放弃该工作并将其重新分配。
(9) 只有在会员确认工作信息之后才会生成工作单。 在订单受理之前,会员可以修改相关信息甚至取消该工作单。但是订单深刻通过之后,则不允许再做任何修改。
(10) 每个工作单用工作单编号唯一标识。工作单编号由系统按时间顺序生成,后生成的工作单具有更大的编号。
(11) 当工作完成后,则更新该工作单的状态更新为“已完成”。
(12) 员工可对工资发放提出意见。单位可根据自身实际的情况进行相应的调整。
(13) 在工作完成后,管理员将根据工作反馈记录会员的工作情况,同时,管理员需要完成工作记录表和工资表。
(14) 学生会员的等级分为3类:①正常;②警告,即如果学生会员没有在规定的时间确认工作的次数超过3次,则对其发出警告;③黑名单,即如果学生会员没有在规定的时间确认工作的次数超过5次,系统会自动注销其会员资格,当其再次进行注册时,会谨慎考虑其注册资格。
(15) 所有用户都可以发布留言,一个用户可发表多条留言,一个管理员可回复多条留言。
2 概念设计 2.1 命名规范
在数据库的设计中,尽量不用汉字,最好用英文。
(1) 实体集和联系的命名规则
实体集和联系均以其对应的英文单词命名,且单词首字母要大写。
例如:实体集管理员(Admin)、学生会员(Student)、公司会员(Company)、工作(Job)、留言(Message)、分派(Assign)、确认(Confirm)以及提供(Provide)等。
(2) 属性的命名规则
① 若属性由简单词组成,则直接以其对应的英文单词命名,单词首字母小写。例如:出生年月(birthday)、住址(address)、电话(telephone)、薪水(salary)、邮箱(e-mail)以及银行卡号(bankcard)等。
② 若属性由复合词组成,则采用小驼峰法来命名,即混合使用大小写字母来构成属性的名字,属性名的每一个逻辑断点都由一个大写字母来标记。如果名字过长,可采用英文简写。例如:管理员姓名(adminName)、学号(studentNo)、密码(stuPassword)以及缺席次数(absenceNum)等。
(3) 具体的编码规则如下:
① 管理员编号(adminNo)的编码规则:以字母A 开头加3位数字组成,如A001;
② 学号(studentNo)的编码规则:以江西财经大学学生学号入库,如0082782; ③ 公司编号(companyNo)的编码规则:以字母C 开头加4位数字组成,如C0001;
④ 工作编号(jobNo)的编码规则:以字母J 开头加7位数字组成,数字部分前4位为公司编号的数字部分,如J0001005;
⑤ 意向编号(willNo)的编码规则:以字母W 开头加上学号组成,如W0082782;
⑥ 工作单编号(orderNo)的编码规则:以11位数字组成,前8位为工作单生成的日期,如[1**********];
⑦ 类别编号(sortNo)的编码规则:以字母S 开头加3位数字,如S001; ⑧ 留言编号(messageNo)的编码规则:以字母M 开头加6位数字组成,如M000001;
⑨ 工作单状态(bookState)的编码规则:取值0,1,2。0代表正在进行中,1代表工作已完成,2代表工资已结算。
2.2 实体集及属性
(1) 管理员(Admin)实体集。其属性有管理员编号(adminNo)、登录密码
(adminPassword)、管理员姓名(adminName)、性别(sex)、出生年月(birthday)、住址(address)、电话(telephone)、薪水(salary)以及邮箱(e-mail)等。其E-R 图如图2-1所示。
登录密码
管理员姓名
电话
管理员
性别
工资
生日
邮箱
地址
图2-1 管理员实体集的E-R 图
(2) 学生会员(Student)实体集。其属性有:学号(studentNo)、姓名
(studentName)、密码(stuPassword)、性别(sex)、出生年月(birthday)、专业
(professional)、班级(class)、宿舍(dormitory)、电话(telephone)、邮箱(e-mail)、空闲时间(freetime)、缺席次数(absenceNum)、会员等级(level) 工资(salary)以及银行卡号(bankcard)等。其E-R 图如图2-2所示。
学生姓名
学号电话
学生
空闲时间
专业
邮箱
工资缺席次数
等级
银行账号
宿舍班级
登录密码
性别
生日
图2-2 学生会员实体集的E-R 图
(3) 公司会员(Company)实体集。其属性有:公司编号(companyNo)、公司名
称(companyName)、公司法人姓名(legal)、登陆密码(comPassword)、地址(address)、电话(telephone)以及电子邮箱(e-mail)等。其E-R 图如图2-3所示。
登录密码
电话
公司
公司名称
邮箱地址法人姓名
图2-3 公司会员实体集的E-R 图
(4) 工作(Job)实体集。其属性有:工作编号(jobNo)、工作名称(jobName)、工作属性(jobProperty)、工作类别(sortNo)、工作信息(jobInfo)、所需人数
(personNeed)、开始时间(startime)、截止时间(deadline)、工资(salary)以及公司编号(companyNo)。其E-R 图如图2-4所示。
工作
工资
所需人数
图2-4 工作实体集的E-R 图
(5) 留言(Message)实体集。其属性有:留言编号(messageNo)、内容
(messageContent)以及发布时间(releaseDate)等。注意,留言人和回复人等信息要通过建立会员与留言、管理员与留言之间的联系解决。其E-R 图如图2-5所示。
内容
留言编号
留言
发布日期
图2-5留言实体集的E-R 图
(6) 工作意向(Jobwill)实体集。其属性有:意向编号(willNo)、学号(studentNo)、工作类别(sortNo)、开始时间(startTime)、结束时间(endTime)、备注(note)以及期望工资(salaryWant)。其E-R 图如图2-6所示。
工作类别结束时间
工作意向
学号
备注
开始时间
图2-6 留言实体集的E-R 图
2.3 联系集及属性
基于2.2节设计得到的实体集,可确定如下联系集:
(1) 管理员与工作之间的“分派(Assign)”联系集。它是一个多对多联系,其描述属性是:分派日期(assignDate)。
(2) 学生会员与工作之间的“确认(Confirm) ”联系集。它是一个多对多联系,因为学生会员在确认工作信息后会自动生成工作单,其描述属性是:工作单编号(orderNo)、确认时间(confirmTime)、完成时间(completeTime)、工作单状态(orderState)。
(3) 公司会员与工作之间的“提供(Provide)”联系集。它是一个一对多联系集,其描述属性是:提供日期(provideDate)。
(4) 学生会员与工作意向之间的“提交(Submit)”联系集。它是一个一对一联系集, 其描述属性是:提交日期(submitDate)。
(5) 会员与留言之间的“发布(Release)”联系集。它是一对多联系,其描述
属性是:发布日期(releaseDate)。
(6) 管理员与留言之间的“回复(Reply)”联系集。它是一对多联系,其描述属性是:回复日期(replyDate)和回复内容(replyContent)。
2.4 系统总ER 图
根据2.2与2.3节设计的全部实体集、联系集及其描述属性,得到系统总ER 图。如图2-7所示。
图2-7系统的总E-R 图
3 逻辑设计 3.1 数据字典设计
重庆工商大学勤工助学管理系统中的一些数据的组织结构基本上是一致的,并且在客户界面通常以下拉列表框、列表框和网格形式出现,因此,为了便于管理和查询,设计了该系统的数据字典。
(1) 性别字典(DCsex),如表3-1所示。
(2) 专业字典(DC professional),如表3-2所示。
(4)
(7) 工作属性字典(DCjobProperty),如表3-7所示。
3.2 基本数据设计
重庆工商大学勤工助学管理系统的基本数据主要是由本系统数据库的实体集构成,它将具有相同类型及相同性质的实体集合在一起,便于管理和查询等操作。根据之前的实体集和联系集的定义,该系统的基本数据由以下6个部分构成。
(1) 管理员(Admin)表:由管理员(Admin)强实体集转化而来,如表3-10所示。
(2) 会员(Student)表:由学生会员(Student)强实体集转化而来,如表3-11所
示。
表3-11 学生会员表 Student
(3) 公司会员(Company)表:由公司会员(Company)强实体集转化而来,如表3-12所示。
(4) 工作(Job)表:由工作(Job)强实体集和提供(Provide)联系集共同转化而来,如表3-13所示。由于联系集提供(Provide)为一对多联系,故可合并到工作(Job)表中来。
表3-13 工作表 Job
(5) 留言(Message)表:由留言(Message)强实体集和发布(Release)和回复
(Reply)两个联系集共同转化而来,如表3-14所示。由于联系集发布(Release)和回复(Reply)都是一对多联系,故可合并到留言(Message)表中来。
表3-14 留言表 Message
(6) 工作意向(Workwill)表:由工作意向(Workwill)和提交(Submit)联系集共同转化而来,如表3-15所示。由于联系集提交(Submit)为一对一联系,故可合并到工作意向(Workwill)表中来。
表3-15 工作意向表 Workwill
另外,为了满足系统需求,还设计两种基本数据,即空闲时间(freetime)和工作类别(jobSort)。
(1) 空闲时间(freetime)表,如表3-16所示。
(2) 工作类别(jobSort)表:如表3-17所示。
3.3 业务数据设计
重庆工商大学勤工助学管理系统其他数据主要是联系各个实体集之间的联系集,它是多个实体之间的某种行为需要的反映。本系统涉及的联系集如表3-18所示。
表3-18 联系集
在上述联系中,联系集分派(Assign)和确认(Confirm)均为多对多联系,不能与任一实体集合并,故单独建表。
(1) 分派(Assign)表:由分派(Assign)联系集转化而来,如表3-19所示。
表3-19 分派表 Assign
表3-20 确认表 Confirm
(2) 确认(Confirm)表:由确认(Confirm)联系集转化而来,如表3-20所示。
3.4 其它数据设计
(1) 设计审计表:以学生会员的操作为例,建立一张跟踪(TraceStudent)表。当管理员向学生会员表中插入或删除一天记录以及学生会员完成提交工作意向、确认工作信息等操作时,该操作的名称和操作时间就会被记录在跟踪表中,以便追踪。
(2) 快速汉字输入法:在该系统中为工作名称设计拼音表和五笔表,提供更方便的汉字输入。
(3) 月度工作单统计总表(MonthOrder),用于统计某个月份的工作单和工作单金额,如表3-21。
3.5 视图设计
视图是虚表,其作用是方便数据库的用户进行查询操作。江西财经大学勤工助学管理系统的视图设计如下。
(1) 创建工作视图JobView 。规定管理员可通过该视图查询、更新和删除工作的基本信息,网站的会员以游客可以通过查询该视图得到关于工作的所有信息,便于他们做出选择。
(2) 创建工作单视图OrderView 。规定管理员可通过该视图查询会员的工作记录,以便其更高效的分配工作;学生会员则可通过该视图查询自己的工作记录,包括工作日期、工作次数以及所获得的工资等。
(3) 创建留言视图MessageView 。规定管理员可以一次性看到多条留言,便于回复,而会员以及游客查询时可以看到其他会员对于某份工作的评价,为自己选择工作提供参考。
3.6 触发器设计
触发器是用户定义在关系表上的一类由事件驱动的存储过程,由服务器自动激活。触发器可以进行更为复杂的检查和操作,具有更精细和更强大额数据控制能力。重庆工商大学勤工助学管理系统的触发器要实现的目标主要是与Insert, Update, Delete操作有关的。
(1) 创建插入触发器studentIns ,当管理员向学生(Student)表中插入一条新的工作信息时,触发器就会自动地将该操作着的名称和操作时间记录在一张表中,以便追踪。
(2) 创建更新触发器jobUpd ,当管理员要修改工作(Job)表中的工作编号时,会自动工作单即确认(Confirm)表中的工作编号,确保了高效率。
(3) 创建删除触发器studentDel ,当某学生会员的缺勤次数超过5次时,系统会自动注销其会员资格,并删除该学生会员在学生会员(Student)表中的信息。
3.7 存储过程设计
存储过程设计主要包括数据库中管理员的操作,对会员的操作以及所有人都可以进行的一些查询操作。
(1) 创建存储过程proAdmin ,输入某管理员的编号,统计该管理员分派工作的信息,并返回学号、工作编号以及工作类别。
(2) 创建存储过程proStudent ,输入某学生的姓名,统计该学生的工资,并返回该同学的学号、缺勤次数及会员等级。
(3) 创建存储过程proCompany ,输入某公司编号,统计该公司提供工作的信息,并返回工作编号、工作名称、所需人数以及工资。
4 模式求精 4.1 存在的问题
分析了用户的需求后,可以发现学生会员(Student)关系模式中存在一个对非属性的函数依赖关系:level →absenceNum ,由此导致的问题是数据冗余,即每一个相同等级的会员都要存放absenceNum 信息。该模式不满足BCNF 范式。因此,需要对学生会员(Student)实体集进行分解。
4.2 解决方案
针对上述存在的问题,给出如下解决方案。
基于数据冗余,需要对学生会员(Student)实体集进行分解。依据BCNF 分解算法,学生会员(Student)可以分解成如下两个关系模式:
Student (, stuPassword, studentName, sex, birthday, professional, class, dormitory, telephone, e-mail, freetime, salary, bankcard, level )
Level (可以验证,关系模式Student 和Level 都满足BCNF 要求,且分解是无损分解。
5 物理设计 5.1 设计目标
由于数据库最终都是要存储在物理设备上的,因此,在充分了解了给定的DBMS 和硬件系统的前提下,物理设计就是要为一个给定的逻辑数据模型选取一个最适合应用环境的物理结构的过程。
那么,主要的设计目标是: (1) 提高数据库的性能,以满足应用的性能需求;
(2) 有效利用存储空间,合理存放易变部分、稳定部分、经常存取部分和存取频率较低部分的数据;
(3) 综合考虑存取时间、存储空间利用率和维护代价三方面的因素,在三者之间找到一个权衡点。
5.2 数据分布
数据分布主要是确定数据的存放位置和存储结构,包括确定关系表、索引、数据字典、日志和备份文件等的存储结构和存放位置。
首先,要确保数据存放位置的基本原则:根据应用情况将易变部分与稳定部分、存取频率较高部分与存取频率较低部分分开存放,以提高系统性能。
其次,确定数据库物理结构的内容: (1) 确定数据存放位置 为提高系统性能,数据应根据应用情况将易变部分和稳定部分、经常存取部分和存取频率较低部分分开来存放。
(2) 确定数据库存储结构
影响数据存放位置和存储结构的因素除了硬件环境外,还包括存取时间、存储空间利用率和维护代价三个方面的因素。这三个方面常常是相互矛盾的,比如说消除一切冗余数据虽能够节约存储空间和减少维护代价,但往往会导致检索代价的增加,因此必须将它们综合考虑,权衡利弊,选择一个折中方案。
最后,综合考虑得到该数据库的数据分布:
(1) 数据库数据备份、日志文件备份等由于只在故障恢复时才使用,而且数据量很大,可以考虑存放在磁带上。
(2) 由于目前许多计算机都有多个磁盘, 因此把不需要怎么变动的数据字典存储在D 盘上;而各关系表即前面所提到的基本数据和业务数据,索引和日志存放在E 盘上。
5.3 索引实现
本系统采用的索引是采用B 树索引存储结构,它可以在数据插入和删除的情况下仍能保持较好的执行效率。由于管理员、会员或者游客在查询各类信息时,
+
往往会按照某个搜索码进行查询。所以,应建立文件的B 树索引,使其在物理上按搜索码存储。
B +树索引的一般规则是:
(1) 如果一个(或一组) 属性经常在查询条件中出现,则考虑在这个(或这组) 属性上建立索引(或组合索引) ;
(2) 如果一个属性经常作为最大值和最小值等聚集函数的参数,则考虑在这个属性上建立索引;
(3) 如果一个(或一组) 属性经常在连接操作的连接条件中出现,则考虑在这个(或这组) 属性上建立索引。
因此,我们考虑到该数据库中查询最多的应该是工作信息,且查询条件多为工作类别,故以工作类别为搜索码建立索引,把工作类别在逻辑上按顺序存储。另外,查询工作类别时,希望得到的信息是具体有关的信息,这时候就需要工作类别编号作为连接条件,将工作类别(jobSort)表与工作(Job)表进行连接,所以还需在工作类别编号上建立索引。具体索引实现如图5-1所示。
+
图5-1 jobSort 文件与Job 文件的B 树索引的叶结点结构
+
6 安全设计 6.1 设计目标
重庆工商大学勤工助学管理系统的设计目标是防止不合法的使用所造成的数据泄密、更改或破坏,因为数据库中的数据资源是共享资源,因此必须在数据库系统中建立一套完整的使用规则进行数据库保护。那么就是让被授权的用户访问数据库的相应部分,提高对数据库的安全保护,前提是所有被授权的用户在访问数据库之前都要通过身份验证。
数据库的创建者即管理员可以通过自己设定的账号和密码的认证进入数据,并且可以修改变动的新信息,做到时刻更新数据库,为数据库的访问者提供及时的消息,为他们的准确决策提供方便。如当机场的航班的起飞时间做了调整时,这时候数据库的创建者就要进入数据库去改动相应的时间信息等。
数据库的访问者,可以通过注册成为会员,其中,更具会员身份的不同,分为学生会员和公司会员。当会员要再次访问时,需通过身份认证进入才能对数据库中的某些客体进行访问。如会员能查看他们各自注册时填写的主要信息,并且可以不断完善自己的所有信息,但是会员看不到其他会员的信息,会员可以发布留言等;而管理员可以查看所有的会员的信息,也可以回复各个会员的留言等。
6.2 用户设计
重庆工商大学勤工助学管理系统面向的用户主要分为三类。 第一类是数据库的管理员,通过相应的身份认证后进入数据库,主要的任务就是及时修改数据库中需要改动的新消息并为学生会员分派工作等;
第二类是会员,分为学生会员和公司会员两类,同样都需要通过相应的身份认证。学生会员主要是查询工作的相关信息、申请工作、确认工作等;公司会员主要是查询工作的相关信息以及提供工作。
第三类是游客,主要是查询工作的相关信息,查看各个会员的留言以及管理员的回复等。
6.3 权限设计
重庆工商大学勤工助学管理系统系统面向的对象主要是数据库的管理员、学
生会员、公司会员和游客,每类用户都有各自不同的访问权限。
数据库的管理员在通过账号和密码的认证后,可以对数据库中的主体授予访问权限,并且指定要对其授予权限的用户的名称等。如创建者可以指定数据库的使用者即网站的会员的操作权限,可以及时修改(Alter)数据库中需要改动的实体集等的信息,或者针对某项业务需要进行的添加(Add_in)和删除(Delete)等操作。
本网站会员在通过账号和密码的认证后,只能根据数据库的创建者授予的权限进行操作。如学生会员可以查询自己的信息但不可以查看其他学生会员的信息等。
本网站的游客,可以查询有关工作的所有消息,只需要登录本网站,但是不可以修改网站上的任何信息。
由于数据库的管理员拥有最高的管理权限,除了用户表,其拥有对所有表的操作权限。根据上述的各类数据库的用户,在此创建了四类角色:管理员 (admin)、学生会员 (student)、公司会员(company)和游客(visitor)。各类的角色在数据库中的权限定义如下表6-1所示。
7、总结
通过这次软件工程课程设计,我对于软件工程设计的相关步骤和流程有了更深刻的理解,熟悉并掌握了Microsoft SQL Severe2008数据库使用。在此次课程设计过程中,我发现了自己的许多不足之处,在课堂上学习的知识不能灵活运用,经过多次网上查询才得以解决,在以后的学习过程中还应该多多思考,这样才能真正学习到可用的知识。
8、
8 附录1 数据库脚本
SET NOCOUNT ON SET DATEFORMAT YMD USE MASTER GO
IF NOT EXISTS(SELECT * FROM SYSLOGINS WHERE NAME='USER01') EXEC SP_ADDLOGIN USER01,USER01 GO
/*创建基本表*/
IF EXISTS (SELECT * FROM SYSDATABASES WHERE NAME= 'QgzxDB2782' ) DROP DATABASE QgzxDB2782 GO
CREATE DATABASE QgzxDB2782 ON PRIMARY
(NAME='QgzxDB',
FILENAME='D:\sqlWork\QgzxDB2782.mdf', SIZE=1, MAXSIZE=5, FILEGROWTH=1) LOG ON
(NAME=QgzxDB_log,
FILENAME='E:\sqlWork\QgzxDB2782.ldf', SIZE=1, MAXSIZE=5, FILEGROWTH=1) GO
/*创建基本表*/ USE QgzxDB2782 GO
/* add my user*/
EXEC SP_ADDUSER USER01,USER01 GO
------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------- /*管理员表*/
PRINT 'CREAT TABLE Admin2782'
GO
CREATE TABLE Admin2782(
adminNo2782 char(4) NOT NULL /*管理员编号*/ check(adminNo2782 like '[A][0-9][0-9][0-9]'),
adminPassword2782 char(6) NOT NULL, /*登陆密码*/ adminName2782 varchar(10) NOT NULL, /*管理员姓名*/ sex2782 char(1) NOT NULL, /*性别*/ birthday2782 datetime NULL, /*出生年月*/ address2782 varchar(50) NULL, /*地址*/ telephone2782 char(11) NULL, /*电话*/ salary2782 numeric(8,2) NOT NULL, /*工资*/ email2782 char(30) NULL, /*邮箱*/ CONSTRAINT AdminPK2782 PRIMARY KEY (adminNo2782) ) GO
GRANT ALL ON Admin2782 TO USER01 GO
/*管理员表(Admin2782)数据:*/
INSERT Admin2782 VALUES('A001','111111','程小莹','M','19900929',' 江西财经大学信息管理学院','[1**********]','3200',NULL) GO
------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------- /*学生会员表*/
PRINT 'CREAT TABLE Student2782' GO
CREATE TABLE Student2782(
studentNo2782 char(7) NOT NULL PRIMARY KEY /*学号*/ check(studentNo2782 like '[0-9][0-9][0-9][0-9][0-9][0-9][0-9]'), studentName2782 varchar(10) NOT NULL, /*姓名*/ stuPassword2782 char(6) NOT NULL, /*登陆密码*/ sex2782 char(1) NOT NULL, /*性别*/ birthday2782 datetime NOT NULL, /*出生年月*/ professional2782 varchar(40) NOT NULL, /*专业*/ class2782 varchar(20) NOT NULL, /*班级*/ dormitory2782 varchar(50) NULL, /*宿舍*/ telephone2782 char(11) NOT NULL, /*电话*/ email2782 varchar(30) NULL, /*电子邮箱*/ freetime2782 datetime NULL, /*空闲时间*/ absenceNum2782 int NOT NULL, /*缺勤次数*/
level2782 int NOT NULL, /*等级*/ salary2782 numeric(8,2) NOT NULL, /*工资*/ bankcard2782 char(19) NOT NULL /*银行卡号*/ ) GO
GRANT ALL ON Student2782 TO USER01 GO
/*学生会员表(Student2782)数据:*/
INSERT Student2782 VALUES('0072365','刘文娟','123456','F','19880203',' 人力资源管理', '07(1)', '蛟桥园15-302', '[1**********]', '[email protected]', NULL, '0', '1', '0', '[***********]2')
INSERT Student2782 VALUES('0081956', '陈芳珍', '123456', 'F', '19900419', '会计', '08(3)', '蛟桥园13-201', '[1**********]', '[email protected]', NULL, '0', '1', '0', '[***********]9')
INSERT Student2782 VALUES('0092183','夏利辉','123456','M','19910923',' 广告设计', '09(1)', '麦庐园JB-411', '[1**********]', '[email protected]', NULL, '0', '1', '0', '[***********]0') GO
------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------- /*公司会员表*/
PRINT 'CREAT TABLE Company2782' GO
CREATE TABLE Company2782(
companyNo2782 char(5) NOT NULL PRIMARY KEY /*公司编号*/ check(companyNo2782 like '[C][0-9][0-9][0-9][0-9]'), companyName2782 varchar(20) NOT NULL, /*公司名称*/ legal2782 varchar(10) NOT NULL, /*法人姓名*/ comPassword2782 char(6) NOT NULL, /*登陆密码*/ address2782 varchar(20) NOT NULL, /*地址*/ telephone2782 char(12) NOT NULL, /*电话*/ email2782 varchar(30) NOT NULL /*电子邮箱*/ ) GO
GRANT ALL ON Company2782 TO USER01 GO
/*公司会员表(Company2782)数据:*/
INSERT Company2782 VALUES('C0001','南昌市电脑研制中心',' 陈辉','123456',' 南昌市','0791-4412152','[email protected]')
INSERT Company2782 VALUES('C0002','大地商城',' 陈诗杰','123456',' 南昌市', '0791-3891295','[email protected]') GO
------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------
/*工作类别表*/
PRINT 'CREAT TABLE jobSort2782' GO
CREATE TABLE jobSort2782(
sortNo2782 char(4) NOT NULL PRIMARY KEY, /*类比编号*/ sortName2782 varchar(20) NULL /*类别名称*/ ) GO
GRANT ALL ON jobSort2782 TO USER01 GO
/*工作类别表(jobSort2782)数据:*/ INSERT jobSort2782 VALUES('S001','清扫') INSERT jobSort2782 VALUES('S002','校园代理') INSERT jobSort2782 VALUES('S003','兼职') GO
------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------- /*工作表*/
PRINT 'CREAT TABLE Job2782' GO
CREATE TABLE Job2782(
jobNo2782 char(8) NOT NULL PRIMARY KEY /*工作编号*/ check(jobNo2782 like '[J][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'), jobName2782 varchar(20) NOT NULL, /*工作名称*/ jobProperty2782 varchar(20) NOT NULL, /*工作属性*/ sortNo2782 char(4) NOT NULL, /*工作类别*/ jobInfo2782 varchar(100) NULL, /*工作信息*/ personNeed2782 int NULL, /*所需人数*/ startTime2782 datetime NOT NULL, /*开始时间*/ deadline2782 datetime NULL, /*截止时间*/ salary2782 numeric(8,2) NULL, /*工资(小时)*/ companyNo2782 char(5) NOT NULL, /*公司编号*/ provideDate2782 datetime NOT NULL, /*提供时间*/
CONSTRAINT Job2782FK1 FOREIGN KEY(sortNo2782) REFERENCES jobSort2782(sortNo2782),
CONSTRAINT Job2782FK2 FOREIGN KEY(companyNo2782) REFERENCES Company2782(companyNo2782) ) GO
GRANT ALL ON Job2782 TO USER01 GO
/*工作表(Job2782)数据:*/
INSERT Job2782 VALUES('J0001001','打扫主要办公室',' 可分配','S001',NULL, '5','2010-12-20','2010-12-22','10','C0001','2010-12-18')
INSERT Job2782 VALUES('J0002001','公司产品的校园代理',' 可分配','S002',' 类似于区域经理','1','2010-12-10','2010-12-25','40','C0002','2010-12-07')
INSERT Job2782 VALUES('J0001002','派发传单',' 可分配','S003',' 到市区各大商场派发传单','10','2010-12-22','2010-12-23','15','C0001','2010-12-20') GO
------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------- /*留言表*/
PRINT 'CREAT TABLE Message2782' GO
CREATE TABLE Message2782(
messageNo2782 char(7) NOT NULL PRIMARY KEY, /*留言编号*/ adminNo2782 char(4) NOT NULL, /*管理员编号*/ studentNo2782 char(7) NOT NULL, /*学号*/ releaseDate2782 datetime NOT NULL, /*发布日期*/ messageContent2782 varchar(100) NULL, /*留言内容*/ replyContent2782 varchar(100) NULL, /*回复内容*/ replyDate2782 datetime NOT NULL, /*回复日期*/
CONSTRAINT Message2782FK1 FOREIGN KEY(adminNo2782) REFERENCES Admin2782(adminNo2782),
CONSTRAINT Message2782FK2 FOREIGN KEY(studentNo2782) REFERENCES Student2782(studentNo2782) ) GO
GRANT ALL ON Message2782 TO USER01 GO
/*留言表(Message2782)数据:*/
INSERT Message2782 VALUES('M000001','A001','0092183','2010-12-12','你好,我想
问一下有关工资的问题,谢谢!',' 关于工资,我们这里只能负责根据你的工作时间和每小时工资算出你的工资供你查询。','2010-12-12')
GO
-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
/*工作意向表*/
PRINT 'CREAT TABLE workWill2782'
GO
CREATE TABLE workWill2782(
willNo2782 char(8) NOT NULL PRIMARY KEY, /*意向编号*/ studentNo2782 char(7) NOT NULL, /*学号*/ sortNo2782 char(4) NOT NULL, /*工作类别*/ starTime2782 datetime NOT NULL, /*开始时间*/ endTime2782 datetime NOT NULL, /*结束时间*/ note2782 char(100) NULL, /*备注*/ salarywant2782 numeric(8,2) NULL, /*预期工资*/ submitDate2782 datetime NOT NULL, /*提交时间*/
CONSTRAINT workWill2782FK1 FOREIGN KEY(studentNo2782) REFERENCES Student2782(studentNo2782),
CONSTRAINT workWill2782FK2 FOREIGN KEY(sortNo2782) REFERENCES jobSort2782(sortNo2782)
)
GO
GRANT ALL ON workWill2782 TO USER01
GO
/*工作意向表(workWill2782)数据:*/
INSERT workWill2782 VALUES ('W0072365', '0072365', 'S003', '2010-12-20', '2010-12-24', NULL,'150','2010-12-15')
INSERT workWill2782 VALUES ('W0081956', '0081956', 'S001', '2010-12-15', '2010-12-23', NULL,'120','2010-12-12')
INSERT workWill2782 VALUES ('W0092183' , '0092183', 'S002', '2010-12-08', '2010-12-28', NULL,'500','2010-12-05')
GO
-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
/*空闲时间表*/
PRINT 'CREAT TABLE freetime2782'
GO
CREATE TABLE freetime2782(
studentNo2782 char(7) NOT NULL, /*学号*/
startTime2782 datetime NOT NULL, /*开始时间*/ endTime2782 datetime NOT NULL, /*结束时间*/ CONSTRAINT freetime2782PK PRIMARY KEY CLUSTERED (studentNo2782, startTime2782, endTime2782),
CONSTRAINT freetime2782FK FOREIGN KEY(studentNo2782) REFERENCES Student2782(studentNo2782)
)
GO
GRANT ALL ON freetime2782 TO USER01
GO
/*空闲时间表(freetime2782)数据:*/
INSERT freetime2782 VALUES('0072365','2010-12-20','2010-12-24')
INSERT freetime2782 VALUES('0081956','2010-12-15','2010-12-23')
INSERT freetime2782 VALUES('0092183','2010-12-08','2010-12-28')
GO
-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
/*分派表*/
PRINT 'CREAT TABLE Assign2782'
GO
CREATE TABLE Assign2782(
adminNo2782 char(4) NOT NULL, /*管理员编号*/
studentNo2782 char(7) NOT NULL, /*学号*/
jobNo2782 char(8) NOT NULL, /*工作编号*/
assignDate2782 datetime NOT NULL, /*分派时间*/
CONSTRAINT Assign2782PK PRIMARY KEY CLUSTERED (adminNo2782, studentNo2782,jobNo2782),
CONSTRAINT Assign2782FK1 FOREIGN KEY(adminNo2782) REFERENCES Admin2782(adminNo2782),
CONSTRAINT Assign2782FK2 FOREIGN KEY(studentNo2782) REFERENCES Student2782(studentNo2782),
CONSTRAINT Assign2782FK3 FOREIGN KEY(jobNo2782) REFERENCES Job2782(jobNo2782)
)
GO
GRANT ALL ON Assign2782 TO USER01
GO
/*分派表(Assign2782)数据:*/
INSERT Assign2782 VALUES('A001','0072365','J0001002','2010-12-16')
INSERT Assign2782 VALUES('A001','0081956','J0001001','2010-12-09')
INSERT Assign2782 VALUES('A001','0092183','J0002001','2010-12-21')
GO
-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
/*确认表*/
PRINT 'CREAT TABLE Confirm2782'
GO
create table Confirm2782(
orderNo2782 char(11) NOT NULL, /*工作单编号*/ jobNo2782 char(8) NOT NULL, /*工作编号*/ studentNo2782 char(7) NOT NULL, /*学号*/
confirmTime2782 datetime NULL, /*确认时间*/ completeTime2782 datetime NULL, /*完成时间*/ orderState2782 char(1) NOT NULL, /*工作单状态*/
CONSTRAINT Confirm2782PK PRIMARY KEY CLUSTERED (orderNo2782, jobNo2782,studentNo2782),
CONSTRAINT Confirm2782FK1 FOREIGN KEY(jobNo2782) REFERENCES Job2782(jobNo2782),
CONSTRAINT Confirm2782FK2 FOREIGN KEY(studentNo2782) REFERENCES Student2782(studentNo2782)
)
GO
GRANT ALL ON Confirm2782 TO USER01
GO
/*确认表(Confirm2782)数据:*/
INSERT Confirm2782 VALUES ('[1**********]', 'J0001002', '0072365', '2010-12-21', '2010-12-24','1')
INSERT Confirm2782 VALUES ('[1**********]', 'J0001001', '0081956', '2010-12-18', '2010-12-22','2')
INSERT Confirm2782 VALUES ('[1**********]', 'J0002001', '0092183', '2010-12-10', NULL,'0')
9 附录2 触发器与存储过程
(1) 创建插入触发器studentIns
首先建立一张跟踪表:
CREATE TABLE traceStudent2782(
userid char(10) NOT NULL,
OperateDate datetime NOT NULL,
OperateType char(10) NOT NULL,
CONSTRAINT traceStudent2782PK PRIMARY KEY (userid, OperateDate) )
建立触发器:
CREATE TRIGGER studentIns
ON Student2782
FOR INSERT
AS IF EXISTS(SELECT * FROM Inserted)
INSERT INTO traceStudent2782 VALUES(user,getdate(),'insert')
(2) 创建更新触发器jobUpd
CREATE TRIGGER jobUpd
ON Job2782
FOR UPDATE
AS
DECLARE @oldjobNo char(8),@newjobNo char(8)
IF(SELECT COUNT(*) FROM INSERTED)>1
ROLLBACK
ELSE
BEGIN
SELECT @oldjobNo=jobNo2782 from DELETED
SELECT @newjobNo=jobNo2782 from INSERTED
UPDATE Confirm2782 SET jobNo2782=@newjobNo
WHERE jobNo2782=@oldjobNo
END
(3) 创建删除触发器studentDel
CREATE TRIGGER studentDel
ON Student2782
FOR DELETE
AS
DECLARE @studentNo char(7)
IF(SELECT COUNT(*) FROM INSERTED)>1
ROLLBACK
ELSE
BEGIN
DELETE FROM Student2782
WHERE studentNo2782 IN (SELECT @studentNo FROM deleted) END
(4) 创建存储过程proAdmin
CREATE PROCEDURE proAdmin(@aNo char(4),@sNo char(7) OUTPUT,@jNo char(8) OUTPUT, @sName varchar(20) OUTPUT)
AS
BEGIN
SELECT
@sNo=a.studentNo2782,@jNo=a.jobNo2782,@sName=sortName2782
FROM Assign2782 a,Job2782 b,jobSort2782 c
WHERE adminNo2782=@aNo AND a.jobNo2782=b.jobNo2782 AND b.sortNo2782=c.sortNo2782
END
(5) 创建存储过程proStudent
CREATE PROCEDURE proStudent(@sName varchar(20),@sNo char(7) OUTPUT, @aNum int OUTPUT, @level int OUTPUT)
AS
BEGIN
DECLARE @salary numeric(8,2)
DECLARE myCur CURSOR FOR
SELECT studentNo2782,absenceNum2782,level2782,salary2782 FROM Student2782
WHERE studentName2782=@sName
OPEN myCur
FETCH myCur INTO @sNo,@aNum,@level,@salary
WHILE(@@FETCH_STATUS=0)
BEGIN
SELECT @sNo,@aNum,@level,@salary
FETCH myCur into @sNo,@aNum,@level,@salary
END
CLOSE myCur
DEALLOCATE myCur
END
(6) 创建存储过程proCompany
CREATE PROCEDURE proCompany(@cNo char(5),@jNo char(8) OUTPUT, @jName varchar(20) OUTPUT, @pNeed int OUTPUT,@salary numeric(8,2))
AS
BEGIN
DECLARE myCur CURSOR FOR
SELECT jobNo2782, jobName2782, personNeed2782, salary2782
FROM Company2782 a,Job2782 b
WHERE a.companyNo2782=@cNo
a.companyNo2782=b.companyNo2782
OPEN myCur
FETCH myCur INTO @jNo,@jName,@pNeed,@salary
WHILE(@@FETCH_STATUS=0)
BEGIN
SELECT @jNo,@jName,@pNeed,@salary
FETCH myCur into @jNo,@jName,@pNeed,@salary
END
CLOSE myCur
DEALLOCATE myCur
END
AND