当前位置:文档之家› 数据库课程设计-学生宿舍管理系统

数据库课程设计-学生宿舍管理系统

课程设计

课题名称:数据库课程设计

设计课题:学生公寓管理系统

专业:班级:

姓名:学号:

同组人:

指导教师:

1、管理系统设计的背景、意义及目标

●设计背景

●设计意义

●设计目标

2、系统开发环境

3、系统需求分析

●基本功能需求

●功能模块

●数据字典

4、概念结构设计

●概念设计

●E_R模型设计

5、逻辑结构设计

●将E_R图转换为关系模型

●各表关系模型图

6、数据实施和维护

●功能实现代码

●系统实现效果

7、个人实现的功能

8、总结

1、管理系统设计的背景、意义及目标

●设计背景

随着IT事业的发展,如今,我们已经全面跨入信息时代。计算机被广泛的应用于各个行业,人工战略已经转化为信息战略,如何在短时间内获取大量信息并整合信息,成为立足于时代的关键。

为了适应考生人数的急剧增长,当今社会各大高校都在进行扩招政策,学生数量的急剧增加带来信息量的成倍增长,由于信息管理的不善与疏忽,各大高校大小事故时有发生。进行正确的信息管理,对于信息及时处理和反应,能够最大程度的减少学校以及在校学生的损失,减小潜在危机。

学生宿舍是学生生活的基本单位,是同学休息与学习的地方,为了保障同学入住学生宿舍的安全性,信息的处理和管理极为重要。据了解,本校的宿舍信息管理仍然使用传统的手工方式,主要方式是基于文本、表格等纸介质的手工处理,用人工手抄对男女生信宿信息进行处理登记。数据信息处理工作量大,容易出错且不易修改;由于数据繁多,容易丢失,逐条查找记录的方式不易操作,浪费了大量的时间,效率极低。学校的宿舍管理缺乏系统,规范的信息管理手段。

建立学生宿舍管理系统,使宿舍管理工作系统化,规范化,便捷化,程序化,避免宿舍管理的随意性,提高信息处理的速度和准确性,能够及时、准确、有效的查询和修改宿舍情况。

●设计的意义

高校规模的扩大,在校学生的基本情况随之层次化、多样化、复杂化,相应的,学生管理工作面临严峻的挑战。高校学生信息日渐庞大,相应的宿舍管理工作变得复杂而困难。传统的账本化工作模式,手工记录学生信息并存档,这样的人工管理方式费时、费事、费力,信息获取慢,更新滞后,查阅困难,容易出错。为了给学生提供一个安全舒适的工作、生活、学习环境,方便宿舍管理工作的同时为学生、教师提供准确实时的信息至关重要。

本校的宿舍信息管理,主要方式是基于文本、表格等纸介质的手工处理,用人工手抄对男女生信宿信息进行处理登记。数据信息处理工作量大,容易出错且不易修改;由于数据繁多,容易丢失,逐条查找记录的方式不易操作,浪费了大量的时间,效率极低。

以上的管理缺陷对学生宿舍管理造成了相当大的阻力,工作进展困难,问题解决的周期过长,资料整改工作量过大。为了改善学生宿舍管理情况,运用数据库技术对学生信息进行处理和统一管理,在校园内实现宿舍无纸化办公。利用计算机的特点,利用互联网进行远程操作,制定学生客户端,教师客户端,管理员客户端,实现有针对性信息化管理,充分发挥计算机的高效性、可靠性、保密性、大容量、低成本等特点,建立学生宿舍管理系统,对宿舍相关信息进行统一管理。

新型管理方式——学生宿舍管理系统,将帮助宿舍管理人员提高工作效率,全面地掌握宿舍情况,提高宿舍安全系数,快速解决学生入住学生宿舍遇到的问题,帮助管理人员与教师及时掌握学生情况。

●设计目标

开发设计学生宿舍管理系统,运用简单的计算机操作实现快速检索和快速查找,方便信息录入和更新,本系统仅针对管理员进行使用。实现信息查询、日常管理、宿舍管理、信息维护几个方面的系统化管理:

1、信息查询:

a)宿舍信息:包括宿舍楼编号、寝室编号、入住人数、寝室入住人员学号、用水量、用电量、水费、电费。

b)学生信息:包括学生姓名、学号、宿舍号

c)宿舍基本配置:包括床、柜子、灯、风扇、电视机

2、宿舍管理:

学生管理(入住、更换宿舍、);房间管理(增加、删除、查询)

3、信息维护:

学生个人信息更新、宿舍信息更新、宿舍设备信息更新。

2、系统开发环境

开发所使用数据库系统:MySql

开发环境:windows 7

开发工具:Microsoft VisualStudio 2010

开发语言:C++、SQL

3、系统需求分析

●基本功能需求

学生宿舍管理系统为了更好的进行宿舍管理而设计。用户的需求具体体现在各种信息的输入、修改和查询。系统功能实现如下:

1、提供学生的入住信息的录入,更换宿舍信息登记。

提供各宿舍的具体信息,如宿舍楼栋、宿舍号、水费、电费等。并可通过查询宿舍号得到宿舍的具体信息、入住的学生信息、宿舍的设备信息等。

2、提供管理员增加、删除各信息的功能。

●功能模块

本宿舍管理系统的主要功能为:学生管理、宿舍信息管理、宿舍设备信息管理、信息查询、息更新、信息维护。

●数据字典

(1)宿舍设备情况数据字典

(2)宿舍信息情况数据字典

(3)学生信息情况数据字典

4、概念结构设计

●概念设计

(1)学生实体:用于显示学生的属性,包括姓名、学号、宿舍编号。

(2)宿舍实体:用于显示宿舍的属性,包括楼号、宿舍号、入住学生学号、可住人数、已住人数、用水量、水费、用电量、电费。

(3)宿舍设备实体:用于显示宿舍设备的属性,包括床、柜子、风扇、灯、电视机。

●E_R模型设计

(1)学生实体E_R图

(2)宿舍实体E_R图

3)宿舍物品设备实体E_R图

5、逻辑结构设计

●将E-R图转换为关系模型:

(1)Student:(num、name、dormitoryCat);

(2)Room:(dormitoryCat、dormitory、room、studentNum、water、waterCharge、electricity、electricityCharge);

(3)Item:(dormitoryCat、bed、cabinet、light、fan、tv)

●各表关系模型图:

(1)I tem表外键设计:

(2)S tudent表外键设计:

(3)各表之间的关系模型图,Item表与Student表通过外键与Room 联系:

6、数据实施和维护

功能实现的代码

//dbstruct.h

#pragma once

class dbStruct

{

public:

MYSQL my;

char errMsg[300];

//学生表

char StudentNum[9];

char StudentName[20];

//宿舍

char dormitoryCat[6];

char dormitory[3];

char room[4];

double water;

double electricity;

double waterCharge;

double electricityCharge;

unsigned int members;

//物件

bool bed;

bool cabinet;

bool light;

bool fan;

bool tv;

dbStruct();

~dbStruct();

bool Init();

bool GetStruct();

//添加学生表一项

bool InsertStudentTable();

//改变一项

bool SetStudentTable(char num[9]);//主键为num, vachar(8) //获取一项

bool GetStudent(char num[9]);

//******************删除一项

bool DeleteStudent(char num[9]);

//添加宿舍表一项

bool InsertDormitoryTable();

//改变一项

bool SetDormitoryTable(char dormitoryCat[6]);//主键为dormitoryCat, varchar(6) //获得一项

bool GetDormitory(char dormitoryCat[6]);

//删除一项

bool DeleteDormitory(char dormitoryCat[6]);

//添加物品表一项

bool InsertItemTable();

//改变一项

bool SetItemTable(char dormitoryCat[6]);//主键为dormitoryCat, varchar(6)

//获得一项

bool GetItem(char dormitoryCat[6]);

//******************删除一项

bool DeleteItem(char dormitoryCat[6]);

void ErrMB();

};

//dbStruct.cpp

#include "stdafx.h"

dbStruct::dbStruct()

{

this->water = 0.0;

this->electricity = 0.0;

this->waterCharge = 0.0;

this->electricityCharge = 0.0;

this->members = 4;

this->bed = TRUE;

this->cabinet = TRUE;

this->light = TRUE;

this->fan = TRUE;

this->tv = TRUE;

}

dbStruct::~dbStruct()

{

mysql_close(&my);

}

bool dbStruct::Init()

{

mysql_init(&this->my);

if(!mysql_real_connect(&this->my, "localhost", "root", "fast", "dormitory", 0, NULL,

0))

{

StringCchPrintfA(errMsg, 300, "获取寝室物件信息错误: %s\n", mysql_error(&this->my));

return false;

}

mysql_query(&this->my, "SET NAMES gbk");

return true;

}

////////////////////////////////////////////////////////

bool dbStruct::InsertStudentTable()

{

if(this->dormitoryCat == NULL ||

this->StudentName == NULL || this->StudentNum == NULL)

{

StringCchPrintfA(errMsg, 100, "添加学生信息错误: 值不完整\n");

return FALSE;

}

char query[300];

//获得该寝室已住人数数

StringCchPrintfA(query, 300,

"SELECT count(dormitoryCat) FROM student WHERE dormitoryCat = \"19425\"",

this->dormitoryCat);

mysql_query(&this->my, query);//可以确保在数据库工作正常的情况下,能够查询到惟一的一条数据

MYSQL_RES * res;

res = mysql_use_result(&this->my);

MYSQL_ROW row;

int i; //i为已住人数

while((row = mysql_fetch_row(res)) != NULL)

{

i = row[0][0] - '0';

}

mysql_free_result(res);

if(++i > 4)

{

//超过了寝室最大人员数量

StringCchPrintfA(errMsg, 300, "添加学生信息错误: 此寝室已满\n");

//**********是否自动添加宿舍信息

return FALSE;

}

//可以添加学生信息

StringCchPrintfA(query, 300,

"INSERT INTO student(num, name, dormitoryCat) VALUES(\"%s\", \"%s\", \"%s\")",

this->StudentNum, this->StudentName, this->dormitoryCat);

if(mysql_query(&this->my, query) != 0)

{

StringCchPrintfA(errMsg, 300, "添加学生信息错误: %s\n", mysql_error(&this->my));

//**********是否需要自动添加宿舍信息

return FALSE;

}

return TRUE;

}

bool dbStruct::DeleteStudent(char num[9])

{

char query[300];

StringCchPrintfA(query, 300,

"DELETE FROM student WHERE num = \"%s\"", num);

if(mysql_query(&this->my, query) != 0)

{

StringCchPrintfA(errMsg, 300, "删除学生信息错误: %s\n", mysql_error(&this->my));

//**********是否需要自动添加宿舍信息

return FALSE;

}

return TRUE;

}

bool dbStruct::GetStudent(char num[9])

{

char query[300];

StringCchPrintfA(query, 300, "SELECT * FROM student WHERE num = \"%s\"", num);

if(mysql_query(&this->my, query) != NULL)

{

StringCchPrintfA(errMsg, 300, "获取学生信息错误: %s\n", mysql_error(&this->my));

return FALSE;

}

MYSQL_RES * res;

MYSQL_ROW row;

res = mysql_use_result(&this->my);

while((row = mysql_fetch_row(res)) != NULL)

{

StringCchPrintfA(this->StudentNum, 9, row[0]);

StringCchPrintfA(this->StudentName, 20, row[1]);

StringCchPrintfA(this->dormitoryCat, 6, row[2]);

}

mysql_free_result(res);

return TRUE;

}

////////////////////////////////////////////////////////

bool dbStruct::InsertDormitoryTable()

{

if(this->dormitoryCat == NULL || this->room == NULL || this->dormitory == NULL) {

StringCchPrintfA(errMsg, 300, "添加宿舍信息错误: 值不完整\n");

return FALSE;

}

char query[300];

StringCchPrintfA(query, 300,

"INSERT INTO room(dormitoryCat, dormitory, room, \

studentsNum, water, electricity, waterCharge, \

electricityCharge) V ALUES(\"%s\", \"%s\", \"%s\", %d, %.2lf, %.2lf, %.2lf, %.2lf)",

this->dormitoryCat, this->dormitory, this->room,

this->members, this->water, this->electricity,

this->waterCharge, this->electricityCharge);

if(mysql_query(&this->my, query) != 0)

{

StringCchPrintfA(errMsg, 300, "添加宿舍信息错误: %s\n", mysql_error(&this->my));

return FALSE;

}

this->InsertItemTable();

return TRUE;

}

bool dbStruct::DeleteDormitory(char dormitoryCat[6])

{

//由于外键约束,删除此寝室时,相应的student和item表中的此寝室信息自动删除.

char query[300];

StringCchPrintfA(query, 300, "DELETE FROM room WHERE dormitoryCat = \"%s\"", dormitoryCat);

if(mysql_query(&this->my, query) != 0)

{

StringCchPrintfA(errMsg, 300, "删除宿舍信息错误: %s\n", mysql_error(&this->my));

return FALSE;

}

return TRUE;

}

bool dbStruct::GetDormitory(char dormitoryCat[6])

{

char query[300];

StringCchPrintfA(query, 300, "SELECT * FROM room WHERE dormitoryCat = \"%s\"", dormitoryCat);

if(mysql_query(&this->my, query) != NULL)

{

StringCchPrintfA(errMsg, 300, "获取寝室信息错误: %s\n", mysql_error(&this->my));

return FALSE;

}

MYSQL_RES * res;

MYSQL_ROW row;

res = mysql_use_result(&this->my);

while((row = mysql_fetch_row(res)) != NULL)

{

StringCchPrintfA(this->dormitoryCat, 6, row[0]);

StringCchPrintfA(this->dormitory, 3, row[1]);

StringCchPrintfA(this->room, 4, row[2]);

this->members = atoi(row[3]);

this->water = atof(row[4]);

this->electricity = atof(row[5]);

this->waterCharge = atof(row[6]);

this->electricityCharge = atof(row[7]);

}

mysql_free_result(res);

return TRUE;

}

////////////////////////////////////////////////////////

bool dbStruct::InsertItemTable()

{

if(this->dormitoryCat == NULL)

{

StringCchPrintfA(errMsg, 300, "添加宿舍信息错误: 值不完整\n");

return FALSE;

}

char query[300];

StringCchPrintfA(query, 300,

"INSERT INTO item(dormitoryCat,bed, cabinet, light, fan, tv) V ALUES(\"%s\", %d, %d, %d, %d, %d)",

this->dormitoryCat, this->bed, this->cabinet, this->light,

this->fan, this->tv);

if(mysql_query(&this->my, query) != 0)

{

StringCchPrintfA(errMsg, 300, "添加宿舍物件信息错误: %s\n", mysql_error(&this->my));

return FALSE;

}

return TRUE;

}

bool dbStruct::GetItem(char dormitoryCat[6])

{

char query[300];

StringCchPrintfA(query, 300, "SELECT * FROM item WHERE dormitoryCat = \"%s\"", dormitoryCat);

if(mysql_query(&this->my, query) != NULL)

{

StringCchPrintfA(errMsg, 300, "获取寝室物件信息错误: %s\n", mysql_error(&this->my));

return FALSE;

}

MYSQL_RES * res;

MYSQL_ROW row;

res = mysql_use_result(&this->my);

while((row = mysql_fetch_row(res)) != NULL)

{

StringCchPrintfA(this->dormitoryCat, 6, row[0]);

this->bed = (atoi(row[3]) == 1? true: false);

this->cabinet = (atof(row[4]) == 1? true: false);

this->light = (atof(row[5]) == 1? true: false);

this->fan = (atof(row[6]) == 1? true: false);

this->tv = (atof(row[7]) == 1? true: false);

}

mysql_free_result(res);

return TRUE;

}

void dbStruct::ErrMB()

{

MessageBoxA(GetActiveWindow(), this->errMsg, "发生错误!", MB_ICONERROR); }

//stdafx.h

#pragma once

#include "targetver.h"

// Windows 头文件:

#include

#include

#include

#include

// C 运行时头文件

#include

#include

#include

#include

#include

// TODO: 在此处引用程序需要的其他头文件#include "dbStruct.h"

#pragma comment(lib, "libmysql.lib")

#pragma comment(lib, "comctl32.lib")

//stdafx.cpp

// stdafx.cpp : 只包括标准包含文件的源文件// DormitoryMng.pch 将作为预编译头

// stdafx.obj 将包含预编译类型信息

#include "stdafx.h"

//dormitoryMng.h

#pragma once

#include "resource.h"

#define MAX_LOADSTRING 100

//dormitoryMng.cpp(部分代码)

bool QueryStart(bool flag)

{

char query[300];

if(flag == true)//查询寝室信息

{

GetWindowTextA(GetDlgItem(g_hWndQuery, IDC_EDITBUILD), m_db.dormitory, 3);

GetWindowTextA(GetDlgItem(g_hWndQuery, IDC_EDITROOM), m_db.room, 4);

if(strcmp(m_db.dormitory, "") == 0 && strcmp(m_db.room,"") == 0)

{

StringCchCopyA(query, 300,

"SELECT room.dormitoryCat,dormitory, room, studentsNum, \

count(student.dormitoryCat), water, electricity, waterCharge, \

electricityCharge FROM room LEFT JOIN student ON room.dormitoryCat = \

student.dormitoryCat GROUP BY room.dormitoryCat"

);

}

else if(strcmp(m_db.dormitory, "") != 0 && strcmp(m_db.room,"") == 0)

{

StringCchPrintfA(query, 300,

"SELECT room.dormitoryCat,dormitory, room, studentsNum, \

count(student.dormitoryCat), water, electricity, waterCharge, \

electricityCharge FROM room LEFT JOIN student ON room.dormitoryCat = \

student.dormitoryCat WHERE dormitory = \"%s\" GROUP BY room.dormitoryCat",

m_db.dormitory);

}

else if(strcmp(m_db.dormitory, "") == 0 && strcmp(m_db.room,"") != 0)

{

StringCchPrintfA(query, 300,

"SELECT room.dormitoryCat,dormitory, room, studentsNum, \

count(student.dormitoryCat), water, electricity, waterCharge, \

electricityCharge FROM room LEFT JOIN student ON room.dormitoryCat = \

student.dormitoryCat WHERE room = \"%s\" GROUP BY room.dormitoryCat",

m_db.room);

}

else

{

StringCchPrintfA(query, 300,

"SELECT room.dormitoryCat,dormitory, room, studentsNum, \

count(student.dormitoryCat), water, electricity, waterCharge, \

electricityCharge FROM room LEFT JOIN student ON room.dormitoryCat = \

student.dormitoryCat WHERE dormitory = \"%s\" AND room = \"%s\" GROUP BY room.dormitoryCat",

m_db.dormitory, m_db.room);

}

if(true != QueryInput(L"寝室号.楼栋号.寝室号.可住人数.当前人数.用水量.用电量.水费.电费", 9, query))

{

m_db.ErrMB();

}

}

else//查询学生信息

{

GetWindowTextA(GetDlgItem(g_hWndQuery, IDC_EDITSTUNO), m_db.StudentNum, 9);

GetWindowTextA(GetDlgItem(g_hWndQuery, IDC_EDITSTUNAME), m_db.StudentName, 20);

if(strcmp(m_db.StudentNum, "") == 0 && strcmp(m_db.StudentName, "") == 0)

{

StringCchCopyA(query, 300,

"SELECT num, name, dormitoryCat FROM student");

}

else if(strcmp(m_db.StudentNum, "") != 0 && strcmp(m_db.StudentName, "") == 0)

{

StringCchPrintfA(query, 300,

"SELECT num, name, dormitoryCat FROM student WHERE num = \"%s\"",

m_db.StudentNum);

}

else if(strcmp(m_db.StudentNum, "") == 0 && strcmp(m_db.StudentName, "") != 0)

{

StringCchPrintfA(query, 300,

"SELECT num, name, dormitoryCat FROM student WHERE name = \"%s\"",

m_db.StudentName);

}

else

{

StringCchPrintfA(query, 300,

"SELECT num, name, dormitoryCat FROM student WHERE name = \"%s\" AND num = \"%s\"",

m_db.StudentName, m_db.StudentNum);

}

if(true != QueryInput(L"学号.姓名.所住寝室", 3, query))

{

m_db.ErrMB();

}

}

return TRUE;

}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

int wmId, wmEvent;

PAINTSTRUCT ps;

HDC hdc;

switch (message)

{

case WM_CREA TE:

{

if(!m_db.Init())

{

m_db.ErrMB();

//*********填写错误信息

break;

}

//创建列表

CreateList(hWnd);

//查询填充

if(false == QueryInput(L"寝室号.楼栋号.寝室号.可住人数.当前人数.用水量.用电量.水费.电费", 9,

"SELECT room.dormitoryCat,dormitory, room, studentsNum,\

count(student.dormitoryCat),water,electricity, waterCharge,\

electricityCharge FROM room LEFT JOIN student ON room.dormitoryCat \

= student.dormitoryCat GROUP BY room.dormitoryCat"))

{

m_db.ErrMB();

}

}

break;

case WM_NOTIFY:

相关主题
文本预览
相关文档 最新文档