课程设计
课题名称:数据库课程设计
设计课题:学生公寓管理系统
专业:班级:
姓名:学号:
同组人:
指导教师:
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: