水电管理系统登陆子系统方案.docx
《水电管理系统登陆子系统方案.docx》由会员分享,可在线阅读,更多相关《水电管理系统登陆子系统方案.docx(11页珍藏版)》请在冰豆网上搜索。
![水电管理系统登陆子系统方案.docx](https://file1.bdocx.com/fileroot1/2023-1/28/a83d2a76-77c1-47cd-83d7-9803b9c645c1/a83d2a76-77c1-47cd-83d7-9803b9c645c11.gif)
水电管理系统登陆子系统方案
数据库课程实验周设计说明书
水电管理系统
学生:
施杰明学号:
1206034240
学院:
计算机与控制工程
专业:
计算机科学与技术
指导教师:
熊风光
2014年6月27日
1.需求分析
1.1目标设计
以宿舍水电费为背景,实现水电费管理。
本系统可以分为四个子系统:
1.统计子系统:
统计水电用量,水电费用计算,扣除水电费。
2.登陆子系统:
实现密码验证,不同身份的用户具有不同的权限。
3.管理子系统:
增加,删除,修改用户,设置水电价格。
4.缴费子系统:
实现查询余额,缴费功能
1.2开发和运行环境
Eclipse、SQLserver2008
Window7,window8
1.3数据流分析
图1顶层数据流图
图2登陆子系统图
1.4功能模块设计
图3系统功能模块图
1.5本人主要工作
登陆子系统
2.水电管理系统登陆子系统数据库概要设计
2.1概念结构设计
图4登陆子系统ER图
2.2模式转换
学生(学号,学生账号,,性别,宿舍号)
账号(账号,密码,权限)
管理员(管理员编号,管理员账号,管理员身份)
2.3式分析
学生(学号,学生账号,,性别,宿舍号)
学号作为主码,学生账号,,性别,宿舍号完全函数依赖于主码学生,满足2NF。
其他属性不存在对主码的传递依赖,满足3NF。
学生中除了学号没有其他决定因素,满足BCNF。
账号(账号,密码,权限)
账号作为主码,密码,权限完全函数依赖于主码账号,满足2NF。
其他属性不存在对主码的传递依赖,满足3NF。
账号中除了账号没有其他决定因素,满足BCNF。
管理员(管理员编号,管理员账号,管理员身份)
管理员编号作为主码,管理员账号,管理员身份完全函数依赖于主码管理员编号,满足2NF。
其他属性不存在对主码的传递依赖,满足3NF。
管理员中除了管理员编号没有其他决定因素,满足BCNF。
3.登陆子系统物理设计
3.1数据库中表的定义
3.1.1学生表的定义
CREATETABLE[dbo].[学生](
[学号][varchar](20)NOTNULL,
[学生账号][varchar](20)NOTNULL,
[][varchar](20)NULL,
[性别][nchar]
(1)NULL,
[宿舍号][varchar](20)NOTNULL,
CONSTRAINT[PK_学生_1]PRIMARYKEYCLUSTERED
(
[学号]ASC
)WITH(PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON)ON[PRIMARY],
CONSTRAINT[IX_学生]UNIQUENONCLUSTERED
(
[学号]ASC
)WITH(PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON)ON[PRIMARY]
)ON[PRIMARY]
3.1.2管理员表的定义
CREATETABLE[dbo].[管理员](
[管理员编号][varchar](20)NOTNULL,
[账号][varchar](20)NOTNULL,
[身份][varchar](20)NOTNULL,
[][nchar](10)NULL,
CONSTRAINT[PK_管理员]PRIMARYKEYNONCLUSTERED
(
[管理员编号]ASC
)WITH(PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON)ON[PRIMARY]
)ON[PRIMARY]
3.1.3账号表的定义
CREATETABLE[dbo].[账号](
[账号][varchar](20)NOTNULL,
[密码][varchar](20)NOTNULL,
[权限][varchar](20)NOTNULL,
CONSTRAINT[PK_账号]PRIMARYKEYNONCLUSTERED
(
[账号]ASC
)WITH(PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON)ON[PRIMARY]
)ON[PRIMARY]
3.2视图、存储过程、触发器的结构和定义
3.2.1账号视图定义
CREATEVIEW[dbo].[accontnumber]
AS
SELECT账号,密码,权限
FROMdbo.账号
3.2.2登陆存储器:
实现登陆后权限控制
ALTERprocedure[dbo].[login](zhanghaovarchar(20),passwordvarchar(20),resultvarchar(20)=nulloutput)
ASDECLARE
密码varchar(20),权限varchar(20)=null,uservarchar(20)=null,passvarchar(20)=null;
begin
select密码=密码from账号where账号=zhanghao;
if密码!
=password
begin
setresult='0';
end;
else
begin
select权限=权限from账号where账号=zhanghao;
if权限='学生'
begin
setuser=权限;
setpass='1206034240';
end
if权限='管理'
begin
setuser=权限;
setpass='654321';
end
end
3.3安全性实施
用户CREATEUSER[aa]FORLOGIN[aa]WITHDEFAULT_SCHEMA=[dbo]
应用程序角色USE[水电管理系统]
GO
/******Object:
ApplicationRole[学生]ScriptDate:
06/27/201410:
46:
31******/
/*Toavoiddisclosureofpasswords,thepasswordisgeneratedinscript.*/
declareidxasint
declarerandomPwdasnvarchar(64)
declarerndasfloat
selectidx=0
selectrandomPwd=N''
selectrnd=rand((CPU_BUSY%100)+((IDLE%100)*100)+
(DATEPART(ss,GETDATE())*10000)+((cast(DATEPART(ms,GETDATE())asint)%100)*1000000))
whileidx<64
begin
selectrandomPwd=randomPwd+char((cast((rnd*83)asint)+43))
selectidx=idx+1
selectrnd=rand()
end
declarestatementnvarchar(4000)
selectstatement=N'CREATEAPPLICATIONROLE[学生]WITHDEFAULT_SCHEMA=[dbo],'+N'PASSWORD=N'+QUOTENAME(randomPwd,'''')
EXECdbo.sp_executesqlstatement
GO
4.登陆子系统程序设计与实现
4.1登陆验证及获取返回参数
CallableStatementc=Assist.conn.prepareCall("{calllogin(?
?
?
)}");
//给存储过程的第一个和第二个参数设置值
c.setString(2,Assist.passwrod);
c.setString(1,Assist.user);
c.registerOutParameter(3,java.sql.Types.VARCHAR);
//注册存储过程的第三个参数
//执行存储过程
c.execute();
b=c.getString(3);
a=b.charAt(0);
Assist.userName=b.substring(1,3);
Assist.passwrod=b.substring(4);//获取返回参数并处理
Assist.conn.close();
4.2检测账号是否存在:
Assist.smt=Assist.conn.createStatement();
Assist.rs = Assist.smt.executeQuery("select 账号 from number where 账号 = " + id);
if(Assist.rs.next())
{
Sno.setText("");
JOptionPane.showMessageDialog(null, "已存在该账号", "提示", JOptionPane.ERROR_MESSAGE);
}
4.3学生账号注册:
CallableStatement c=Assist.conn.prepareCall("{call zhanghao (?
?
)}");
c.setString(1,Sno.getText());
c.setString(2, Sname.getText());
c.execute();
c=Assist.conn.prepareCall("{call student1 (?
?
?
?
?
)}");
c.setString(1,Ssex.getText());
c.setString(2, Sno.getText());
c.setString(3, Sclas.getText());
c.setString(4, Sbirth.getText());
c.setString(5, Snation.getText());
c.execute();
5.登陆子系统子系统测试
登陆测试用例账号:
1206034240密码:
654321
图5登陆界面图6登陆成功
图7注册账号
图8注册成功
注册用例账号:
12060333
6.个人体会
这次实验,我学会了在数据库里面去使用触发器,存储过程,以及视图。
用触发器去进行复杂的约束条件,用存储过程和视图作为对外的接口,实现对数据库部结构的。
存储过程可以进行增删改操作,视图进行查询操作。
外部程序访问数据库的时候,首先通过默认的用户访问的登陆的存储过程,在登陆的存储过程进行密码匹配。
通过匹配结果判断是否登陆成功,返回结果值。
如果是成功的,同时返回账号权限所对应的的应用程序角色的账号密码。
目前根据用户定义了三个应用程序角色,分别为学生,统计员,管理员,每个应用程序角色对应一定的权限。
通过用户的登录验证的应用程序将用返回的应用程序角色的账号密码个去激活应用程序与数据库之间的临时。
实现了不同的账号对数据库访问的不同权限,增加了数据库的安全性。
系统还有不足的地方,在对一些数据约束还做的不到位,在输入框的输入的值,也应该进行相应的检验,不能把所有数据都都给数据库处理。