当前位置:文档之家› 水电管理系统登陆子系统方案

水电管理系统登陆子系统方案

数据库课程实验周设计说明书水电管理系统学生:施杰明学号: 1206034240学院:计算机与控制工程专业:计算机科学与技术指导教师:熊风光2014年 6 月 27日1. 需求分析1.1目标设计以宿舍水电费为背景,实现水电费管理。

本系统可以分为四个子系统:1.统计子系统:统计水电用量,水电费用计算,扣除水电费。

2.登陆子系统:实现密码验证,不同身份的用户具有不同的权限。

3.管理子系统:增加,删除,修改用户,设置水电价格。

4.缴费子系统:实现查询余额,缴费功能1.2 开发和运行环境Eclipse、SQL server 2008Window 7,window 81.3 数据流分析图1 顶层数据流图图2 登陆子系统图 1.4 功能模块设计图3 系统功能模块图1.5 本人主要工作登陆子系统2. 水电管理系统登陆子系统数据库概要设计2.1 概念结构设计学生学号学生账号姓名性别宿舍号<pi>Variable characters (20)Variable characters (20)Variable characters (20)Variable characters (2)Variable characters (20)<M>学号...<pi>账号账号密码权限<pi>Variable characters (20)Variable characters (20)Variable characters (20)<M>账号...<pi>管理员管理员编号管理员账号身份<pi>Variable characters (20)Variable characters (20)Variable characters (20)<M>管理员编号...<pi>图4登陆子系统ER图2.2 模式转换学生(学号,学生账号,,性别,宿舍号)账号(账号,密码,权限)管理员(管理员编号,管理员账号,管理员身份)2.3 式分析学生(学号,学生账号,,性别,宿舍号)学号作为主码,学生账号,,性别,宿舍号完全函数依赖于主码学生,满足2NF。

其他属性不存在对主码的传递依赖,满足3NF。

学生中除了学号没有其他决定因素,满足BCNF。

账号(账号,密码,权限)账号作为主码,密码,权限完全函数依赖于主码账号,满足2NF。

其他属性不存在对主码的传递依赖,满足3NF。

账号中除了账号没有其他决定因素,满足BCNF。

管理员(管理员编号,管理员账号,管理员身份)管理员编号作为主码,管理员账号,管理员身份完全函数依赖于主码管理员编号,满足2NF。

其他属性不存在对主码的传递依赖,满足3NF。

管理员中除了管理员编号没有其他决定因素,满足BCNF。

3.登陆子系统物理设计3.1 数据库中表的定义3.1.1学生表的定义CREATE TABLE [dbo].[学生]([学号] [varchar](20) NOT NULL,[学生账号] [varchar](20) NOT NULL,[] [varchar](20) NULL,[性别] [nchar](1) NULL,[宿舍号] [varchar](20) NOT NULL,CONSTRAINT [PK_学生_1] PRIMARY KEY CLUSTERED([学号] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],CONSTRAINT [IX_学生] UNIQUE NONCLUSTERED([学号] 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管理员表的定义CREATE TABLE [dbo].[管理员]([管理员编号] [varchar](20) NOT NULL,[账号] [varchar](20) NOT NULL,[身份] [varchar](20) NOT NULL,[] [nchar](10) NULL,CONSTRAINT [PK_管理员] PRIMARY KEY NONCLUSTERED([管理员编号] 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账号表的定义CREATE TABLE [dbo].[账号]([账号] [varchar](20) NOT NULL,[密码] [varchar](20) NOT NULL,[权限] [varchar](20) NOT NULL,CONSTRAINT [PK_账号] PRIMARY KEY NONCLUSTERED([账号] 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账号视图定义CREATE VIEW [dbo].[accont number]ASSELECT 账号, 密码, 权限FROM dbo.账号3.2.2登陆存储器:实现登陆后权限控制ALTER procedure [dbo].[login] (zhanghao varchar(20),password varchar(20),result varchar(20) = null output)AS DECLARE密码 varchar(20),权限 varchar(20) = null,user varchar(20) =null,pass varchar(20) = null;beginselect 密码 = 密码 from 账号 where 账号 = zhanghao;if 密码 != passwordbeginset result = '0';end;elsebeginselect 权限 = 权限 from 账号 where 账号 = zhanghao;if 权限 = '学生'beginset user = 权限;set pass = '1206034240';endif 权限 = '管理'beginset user = 权限;set pass = '654321';endend3.3安全性实施用户 CREATE USER [aa] FOR LOGIN [aa] WITH DEFAULT_SCHEMA=[dbo]应用程序角色 USE [水电管理系统]GO/****** Object: ApplicationRole [学生] Script Date: 06/27/2014 10:46:31 ******//* To avoid disclosure of passwords, the password is generated in script. */declare idx as intdeclare randomPwd as nvarchar(64)declare rnd as floatselect idx = 0select randomPwd = N''select rnd = rand((CPU_BUSY % 100) + ((IDLE % 100) * 100) +(DATEPART(ss, GETDATE()) * 10000) + ((cast(DATEPART(ms,GETDATE()) as int) % 100) * 1000000))while idx < 64beginselect randomPwd = randomPwd + char((cast((rnd * 83) as int) +43))select idx = idx + 1select rnd = rand()enddeclare statement nvarchar(4000)select statement = N'CREATE APPLICATION ROLE [学生] WITHDEFAULT_SCHEMA = [dbo], ' + N'PASSWORD = N' +QUOTENAME(randomPwd,'''')EXEC dbo.sp_executesql statementGO4.登陆子系统程序设计与实现4.1 登陆验证及获取返回参数CallableStatement c=Assist.conn.prepareCall("{call login (?,?,?)}");//给存储过程的第一个和第二个参数设置值c.setString(2, Assist.passwrod);c.setString(1, er);c.registerOutParameter(3,java.sql.Types.VARCHAR);//注册存储过程的第三个参数//执行存储过程c.execute();b =c.getString(3);a = b.charAt(0);erName = 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 注册成功注册用例账号:120603336.个人体会这次实验,我学会了在数据库里面去使用触发器,存储过程,以及视图。

相关主题