超超超超超详细的数据库课设报告-学生公寓管理系统
學生公寓管理系統
摘要: 隨著社會的發展以及教育水平的提高,當今在校生數量越來越多。與此同時,目前還有一些學校還在使用手工的方式對學生的住宿信息進行管理,手工記錄對于規模小的學校來說還可以勉強接受,但對于學生信息量比較龐大,需要記錄存檔的數據比較多的高校來說,人工記錄是相當麻煩的,不但浪費了許多時間,而且效率也低。針對這個情況,設計了一套學生公寓管理系統。學生公寓管理系統采用的是計算機化管理,通過強大的計算機技術給公寓管理人員和學生帶來便利,通過網絡可以在系統上查詢學生公寓狀況,同時管理人員還可以對學生的信息進行增刪改查,最大程度了解所有學生的住宿信息。
關鍵詞:公寓管理系統,數據庫系統,課程設計
1.設計任務
1.1設計目的
不但能夠實現少量的管理人員完成大量的人員安排公寓管理服務,使公寓管理更加規范化、科學化,人性化。而且同時還要實時動態的掌握每個公寓管理的基本信息,以及統計相關數據更新。
1.2設計內容
(1)基本要求
學校有若干公寓,每棟七層,每層16個房間,每個房間4個床位,需要一個公寓管理系統實現管理。
(2)基本功能
①寢室分配:根據系別、年級、班級分配寢。查詢寢室狀態和入住信息。
②學生管理:實現入住學生信息的維護和查詢功能。
③信息查詢:按公寓樓號、學生姓名等查詢住宿信息。
④財產管理:實現對公寓財產的管理功能。
⑤出入登記:實現對學生搬出公寓的貸物進行登記和對外來人員進行登記等功能。
⑥系統管理:參數設置(包括公寓樓號、寢室房號、系別、年級、班級的設置)、權限管理和系統維護( 數據備份、數據恢復)
2.需求分析
2.1 需求分析任務
需求分析的任務是通過詳細調查現實世界要處理的對象,充分了解原系統的工作概況,明確用戶的各種需求,然后在此基礎上確定新系統的功能。調查的重點是“數據”和“處理”,通過調查,收集與分析,獲得用戶對數據庫的信息要求處理要求,安全性與完整性要求。
為了完成需求分析的任務,首先要調查清楚用戶的實際要求,與用戶達成共識,然后分析與表達這些需求。
隨著信息技術的發達和科技的發展,學生數量逐漸增多,對于管理學生住宿信息的需求也逐漸變大,基于這種需求,學生公寓管理系統不但使學校能享受更好的管理效率,還能滿足對學生和宿管的信息管理需求。
2.2 需求分析過程
2.2.1用戶需求分析
隨著社會的發展以及教育水平的提高,當今在校生數量越來越多。與此同時,目前還有一些學校還在使用手工的方式對學生的住宿信息進行管理,手工記錄對于規模小的學校來說還可以勉強接受,但對于學生信息量比較龐大,需要記錄存檔的數據比較多的高校來說,人工記錄是相當麻煩的,不但浪費了許多時間,而且效率也低。針對如此,設計了一套學生宿舍管理系統。
2.2.2處理對象分析
系統要處理的對象包括學生基本信息、宿管基本信息、樓宇基本信息、宿管基本信息、住宿基本信息、超級管理員基本信息等六個方面,各個對象包括信息如下所示:
(1) 學生基本信息(Student):包括學生學號、學生姓名、學生性別、學生密碼等方面的信息,可以方便學生信息的查詢和更新;
(2) 宿管基本信息(Dormitory Manager):包括宿管編號、宿管姓名、宿管性別、宿管密碼等,以方便管理人員對宿舍管理人員的任用、信息查詢及更改;
(3) 樓宇基本信息(Building):包括樓宇名稱、所屬宿管、所屬位置等方面,這樣可以方便管理者對樓宇的管理,提高查詢效率;
(4) 宿舍基本信息(Dormitory):包括宿舍編號、所屬樓宇、所屬樓層、最多可住人數、已住人數;
(5)住宿基本信息(Live):包括學生姓名,宿舍編號,入住日期等,可以方便管理人員對學生進行信息查詢及更改;
(6) 系統管理(Admin):超級管理員編號,超級管理員名字,超級管理員密碼等;
2.2.3功能需求分析
1.登陸功能
已存在數據庫中的用戶輸入自己的信息后可以進行登錄,用戶可以根據提示輸入用ID、密碼,并選擇權限,點擊登陸即可進入相應的管理界面。
2.學生功能
學生登錄系統后權限是最小的,學生只能查看自己的姓名,性別,學號,ID,密碼,繳費信息等信息,或者對自己的信息作出修改。
3.宿管功能
同樣,也只有存在數據庫中的宿管才能登錄該系統。宿管登錄系統后,權限比學生登錄多很多。
(1)學生管理
宿管可以查看其所管理宿舍的學生信息,并可以為學生分配宿舍,甚至可以修改學生的住宿信息;
(2)宿管管理
宿管可登陸系統對自己的姓名,密碼,ID等信息進行增、刪、改,查;
(3)樓宇管理
宿管可以登錄系統查看其所管理的樓宇信息,比如樓宇的位置,名稱,ID等信息。同時也可以對自己所管轄的樓宇進行檢索。此功能是為了方便當一個宿管管轄的樓宇過多時,查看某座樓宇的信息。
(4)宿舍管理
宿管可以登錄系統查看其所管理的宿舍信息,比如宿舍的所屬樓宇,宿舍號, ID,所屬樓層,最大入住人數,已住人數等信息。同時也可以對自己所管轄的宿舍進行添加或者刪除。也可以按要求對自己管轄的宿舍進行檢索。此功能是為了方便當一個宿管管轄的宿舍過多時,查看某宿舍的信息。
(5)住宿管理
宿管可以登錄系統查看其所管理的學生宿舍信息,并能對宿舍信息進行增、刪、改、查。比如添加住宿學生,調整住宿學生的宿舍信息,為學生退宿等。同時宿管還可以按照學生姓名查看學生的宿舍信息,或者按照宿舍信息查看宿舍中的學生入住信息。
4.管理員功能
管理員的權限是最大的,管理員登錄系統后的功能最為全面,用到了前面所涉及的所有數據庫的信息。這里在進行系統設計是將管理員數量預設為一名,預設其姓名為admin,密碼也是admin。
(1)學生管理
管理員不僅可以查看其所管理宿舍的學生信息,并可以為學生分配宿舍,甚至可以修改學生的住宿信息,他擁有最高的權限,可以向數據庫添加一個新的學生信息,或者刪除一個學生信息。
(2)宿管管理
同樣,管理員不僅可以對一個宿管的姓名,密碼,ID等信息進行增、刪、改,查。也可以向數據庫中添加一個宿管的信息,或者在數據庫中刪除一個宿管的信息。
(3)樓宇管理
管理員登錄系統查看所有樓宇信息,包括樓宇的位置,名稱,ID等信息。同時也可以按樓宇的ID或者位置對樓宇進行檢索。同時可以對樓宇信息進行增、刪、改、查。
(4)宿舍管理
管理員可以登錄系統查看所有樓宇的所有宿舍信息,包括宿舍的所屬樓宇,宿舍號, ID,所屬樓層,最大入住人數,已住人數等信息。當然可以所有宿舍進行添加或者刪除。也可以按要求對宿舍進行檢索。或者從數據庫中添加或者刪除一個宿舍的信息。
(5)住宿管理
管理員登錄系統可以查看所有學生的宿舍信息,并能對宿舍信息進行增、刪、改、查。比如添加住宿學生信息,調整住宿學生的宿舍信息,為學生退宿等。同時管理員還可以按照學生姓名查看學生的宿舍信息,或者按照宿舍信息查看宿舍中的學生入住信息。不過管理員主要對住宿信息進行宏觀調控,查看等操作。
(6)系統管理
與學生和宿管登錄該系統一樣,管理員也能對自己的信息進行查看和修改,此外管理員還能查看當前管理員的數量,以及各個管理員的當前狀態(是否可用)。
2.2.4安全性與完整性分析
安全性先通過視圖機制,不同的用戶只能訪問系統授權的視圖,這樣可提供系統數據一定程度上的安全性,再通過用戶授權機制,欲用戶登陸來識別用戶級別,根據這個級別來分配用戶權限,達到數據更高層次的安全保密功能。
完整性要求用于描述學生基本信息、宿管基本信息、樓宇基本信息、宿管基本信息、住宿基本信息、超級管理員基本信息。
3.概念結構設計
3.1 概念結構設計任務
概念結構設計的任務是將需求分析得到的用戶需求抽象為信息結構。
3.2 概念結構設計方法
設計概念結構通常有四類方法:自頂向下,自底向上,逐漸擴張以及混合策略。本次學生公寓管理系統采用的是自底向上的方法,首先定義全局的概念結構的框架,然后逐步細化。根據自頂向上地進行需求分析然后再自底上地進行概念設計。
3.2.1概念結構設計步驟
概念結構的設計可分為兩步:
(1)抽象數據并設計局部視圖。
根據需求分析,總結出該宿舍管理系統中的實體包括:學生,宿管,樓宇,宿舍 ,住宿,管理員等六部分。
(2)集成局部視圖,得到全局的概念結構。
4.邏輯結構設計
4.1 邏輯結構設計任務
邏輯結構設計的任務是把概念結構設計好的基本E-R圖轉換為與選用數據庫管理系統產品所支持的數據模型相符合的邏輯結構。
4.2 E-R圖向關系模型的轉化
(1)學生表(Student):學生學號sn、學生姓名name、學生性別sex、學生密碼password
(2)宿管表(Dormitory Manager):宿管編號sn、宿管姓名name、宿管性別sex、宿管密碼password
(3)樓宇表(Building):樓宇名稱name、所屬宿管dormitoryManagerId、所屬位置location
(4)宿舍表(Dormitory):宿舍編號sn、所屬樓宇buildingId、所屬樓層floor、最多可住人數maxNumber、已住人數liveNumber;
(5)住宿表(Live):學生姓名name,宿舍編號dormitoryId,入住日期liveDate;
(6)系統表(Admin):超級管理員編號id,超級管理員名字name,超級管理員密碼password;
(7)包含:宿舍編號sn,樓宇id
(8)管理:宿管編號sn,樓宇id
(9)入住:學生學號sn,住宿id
(10)包含:樓宇id,宿舍編號sn
5.物理結構設計
根據邏輯設計出的邏輯模式,DBMS及計算機系統所提供的手段和施加的限制,設計數據庫的內模式,即文件結構,各種路徑,控件分配,記錄的存取方式等,為邏輯數據結構選取一個最合適的應用環境的物理結構。
6.數據庫的實施
6.1 系統的設計思想
首先考慮系統安全性,本系統默認管理員已經將學生信息錄入數據庫中,管理員以及宿管都可以增加或者刪除數據庫中學生表的學生信息,但是學生不能自行添加注冊信息,只能登陸管理自己的信息。通過B/S模式實現人員登陸管理,只有存在于數據庫學生表中的學生,以及存在的宿管和管理員才可以登錄本系統,有效避免了非法人員登陸系統。此外本系統還對用戶的權限進行了分級設置,用戶在輸入自己的姓名,密碼以及驗證碼后,需要選擇合適的身份才能登陸系統,用戶級別分為學生、宿管和管理員,不同級別的用戶有不同的操作權限。用戶登錄系統后才可以進行相應權限下的增、刪、改、查操作。
其次,是對數據庫的操作。在用戶成功登錄系統后所做的每一次的增、刪、改、查都動態的對后臺數據庫中相應表中的信息作出了修改,該部分主要應用JSP技術實現對數據庫信息的動態操作。數據庫采用MySQL,能夠清晰的展現大量的數據,能存放和讀取大量的數據。通過JSP技術實現對數據庫信息的動態管理并應用navicat數據庫可視化工具隨時檢驗自己在開發過程中的操作是否有誤。
6.2 主要技術
6.2.1前端
html5 ,css3, jsp,java servlet,EasyUI框架
6.2.2后端
Java基礎,Tomcat簡單使用,MySQL數據庫
6.3 管理頁面
6.3.1 登陸界面–以超級管理員身份登陸
6.3.2 登陸界面–以學生身份登陸
6.3.3 登陸界面–以宿管身份登陸
6.4 系統調試與測試
6.4.1添加頁面
6.4.2修改頁面
6.4.3刪除頁面
6.4.3查詢頁面
6.5 各功能代碼設計
學生宿舍管理系統總體上來講是實現了不同狀態(權限)下,對數據庫中不同信息的增、刪、改、查以及相應的前端頁面設計。下面分別展示不同階段重點部分的代碼:
6.5.1登陸頁面
<title>登錄|學生公寓管理系統</title> <meta name="keywords" content="學生公寓管理系統"> </head> <body> <div class="header" style="padding: 0;"><h2 style="color: white; width: 400px; height: 60px; line-height: 60px; margin: 0 0 0 30px; padding: 0;">學生公寓管理系統</h2> </div> <div class="loginWraper"><div id="loginform" class="loginBox"><form id="form" class="form form-horizontal" method="post"><div class="row cl"><label class="form-label col-3"><i class="Hui-iconfont"></i></label><div class="formControls col-8"><input id="login-name" name="name" type="text" placeholder="賬號" class="input-text size-L"></div></div><div class="row cl"><label class="form-label col-3"><i class="Hui-iconfont"></i></label><div class="formControls col-8"><input id="login-password" name="password" type="password" placeholder="密碼" class="input-text size-L"></div></div><div class="row cl"><div class="formControls col-8 col-offset-3"><input id="login-vcode" class="input-text size-L" name="vcode" type="text" placeholder="請輸入驗證碼" style="width: 200px;"><img title="點擊圖片切換驗證碼" id="vcodeImg" src="CpachaServlet?method=loginCpacha&vl=4&fs=28"></div></div><div class="mt-20 skin-minimal" style="text-align: center; color:white"><div class="radio-box"><input type="radio" id="radio-2" name="type" checked value="2" /><label for="radio-1">學生</label></div><div class="radio-box"><input type="radio" id="radio-3" name="type" value="3" /><label for="radio-2">宿管</label></div><div class="radio-box"><input type="radio" id="radio-1" name="type" value="1" /><label for="radio-3">管理員</label></div></div><div class="row"><div class="formControls col-8 col-offset-3"><input id="submitBtn" type="button" class="btn btn-success radius size-L" value=" 登 錄 "></div></div></form></div> </div> <div class="footer">Copyright artisan @ 【江雪雨】</div> </body> </html>6.5.2數據庫操作基礎類
數據庫操作基礎類, 利用泛型和反射機制來抽象數據庫基本的增刪該查操作。
所有新增插入操作抽象封裝代碼如下:
所有修改操作抽象封裝代碼如下:
public boolean update(T t) {String sql = buildSql(CURD_UPDATE);try {PreparedStatement prepareStatement = con.prepareStatement(sql);Field[] declaredFields = this.t.getDeclaredFields();for( int i=1;i<declaredFields.length;i++) {declaredFields[i].setAccessible(true);prepareStatement.setObject(i,declaredFields[i].get(t));//獲取字段值}declaredFields[0].setAccessible(true);//設置可獲取權限prepareStatement.setObject(declaredFields.length,declaredFields[0].get(t));return prepareStatement.executeUpdate()>0;} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return false;}所有刪除操作抽象封裝代碼如下:
public boolean delete (String[] ids) {String sql = buildSql(CURD_DELETE) + StringUtils.join(ids,",")+")";try {PreparedStatement prepareStatement = con.prepareStatement(sql);return prepareStatement.executeUpdate()>0;} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}return false;}抽象封裝所有的分頁查詢列表操作代碼如下:
public Page<T> findList(Page<T> page) {//獲取查詢語句String sql = buildSql(CURD_SELECT);sql += buildSearchSql(page);sql += " limit " + page.getOffset() + "," + page.getPageSize();//處理sql語句try {PreparedStatement prepareStatement = con.prepareStatement(sql);prepareStatement = setParams(page,prepareStatement);ResultSet executeQuery = prepareStatement.executeQuery();List<T> conten = page.getConten();while(executeQuery.next()) {T entity = t.newInstance();//newInstance() 是java反射框架中類對象(Class)創建新對象的方法Field[] declaredFields = t.getDeclaredFields();for(Field field:declaredFields) {field.setAccessible(true);field.set(entity, executeQuery.getObject(StringUtli.convertToUnderLine(field.getName())));//給實體字段設置值(從數據庫出來的)}conten.add(entity);}page.setConten(conten);}catch(Exception e) {e.printStackTrace();}page.setTotal(getTotal(page));return page;}獲取符合條件的所有記錄數代碼如下:
public int getTotal(Page<T> page) {String sql = buildSql(CURD_COUNT);sql += buildSearchSql(page);try {PreparedStatement prepareStatement = con.prepareStatement(sql);prepareStatement = setParams(page,prepareStatement);ResultSet executeQuery = prepareStatement.executeQuery();if(executeQuery.next()) {return executeQuery.getInt("total");}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}return 0;}構造查詢sql語句代碼如下:
private String buildSearchSql(Page<T> page) {String sql = "";//判斷有沒有條件查詢 進行遍歷List<SearchProperty> searchProperties = page.getSearchProperties();for(SearchProperty searchProperty:searchProperties ) {switch(searchProperty.getOperator()) {case GT:{sql += " and "+ StringUtli.convertToUnderLine(searchProperty.getKey()) +" > ?";// 記得加上占位符break;}case GTE:{sql += " and "+ StringUtli.convertToUnderLine(searchProperty.getKey()) +" >= ?";break;}case EQ:{sql += " and "+ StringUtli.convertToUnderLine(searchProperty.getKey()) +" = ?";break;}case LT:{sql += " and "+ StringUtli.convertToUnderLine(searchProperty.getKey()) +" < ?";break;}case LTE:{sql += " and "+ StringUtli.convertToUnderLine(searchProperty.getKey()) +" <= ?";break;}case LIKE:{sql += " and "+ StringUtli.convertToUnderLine(searchProperty.getKey()) +" like ?";break;}case NEQ:{sql += " and "+ StringUtli.convertToUnderLine(searchProperty.getKey()) +" <> ?";break;}case in:{sql += " and "+ StringUtli.convertToUnderLine(searchProperty.getKey()) +" in ("+searchProperty.getValue()+")";break;}}} sql = sql.replaceFirst("and", "where");System.out.println(sql);return sql;}構造一般查詢語句代碼如下:
private String buildSql(int type) {// TODO Auto-generated method stubString sql = "";switch(type) {case CURD_ADD:{String sql1 = "insert into " + StringUtli.convertToUnderLine(t.getSimpleName())+"(";//表名:類名Field[] declaredFields = t.getDeclaredFields();//getDeclaredFields()返回Class中所有的字段,包括私有字段//循環輸出[反射:Field類--獲取類中public類型的屬性]for(Field fields:declaredFields) {sql1 +=StringUtli.convertToUnderLine(fields.getName())+",";}sql1 = sql1.substring(0, sql1.length()-1) + ")";//截掉一個逗號;String sql2 = "values (null,";String[] params = new String[declaredFields.length-1];Arrays.fill(params, "?");sql2 += StringUtils.join(params,",")+")";sql = sql1 + sql2;break;}case CURD_SELECT:{sql = "select * from " + StringUtli.convertToUnderLine(t.getSimpleName());//獲取數據表的名稱break;}case CURD_COUNT:{sql = "select count(*) as total from " + StringUtli.convertToUnderLine(t.getSimpleName());break;}case CURD_UPDATE:{sql = "update " + StringUtli.convertToUnderLine(t.getSimpleName()) + " set ";Field[] declaredFields = t.getDeclaredFields();for (Field field:declaredFields) {if(!"id".equals(field.getName())) {sql += StringUtli.convertToUnderLine(field.getName()) + "=?,";}}sql = sql.substring(0,sql.length()-1) + " where id = ? ";break;}case CURD_DELETE:{sql = "delete from " + StringUtli.convertToUnderLine(t.getSimpleName()) + " where id in (";break;}default:break;}System.out.println(sql);return sql;}7.總結
在課程設計期間,我遇到了許許多多的問題,一一去請教同學,也不斷查資料去汲取更多的新知識,如防止sql注入,數據庫底層封裝,數據庫的連接失敗,session的使用,登陸頁面的重定位等等,發現問題并解決問題的過程,使得我探索并解決問題的能力有了一個提高。這整個課程設計過程中,使我對程序編寫的整個過程有了一個統籌全局的思想,因為課設的需求分析、程序編寫、程序調試、撰寫報告這些過程是環環相扣的,下面是一些部分收獲:
1.底層數據庫的操作是放在BaseDao中,里面都是對應的增刪改查操作,每個實體都有一個對應的Dao,各實體的Dao繼承BaseDao,在servlet中負責獲取參數,判斷數據的合理性和進行跳轉,當條件符合的時候則調用對應實體的Dao操作進行增刪改查,然接著把結果集傳回頁面,之后便是在頁面進行循環把數據展示出來。但是由于模塊信息的問題,需要用到另外一張表的信息的時候,再把對應實體的Dao進行初始化,再調用它的數據庫操作來獲取數據。
2.數據庫連接,獲得Connection是放在構造函數里的,創建一個對象就獲取一個Connection,一開始沒留意到這個問題,多運行幾次,創建的Dao多了,產生很多沒有關閉的Connection,沒有注意到關閉數據庫。
3.解決了java程序和數據庫的中文亂碼以及程序中文件讀寫、網絡傳輸中中文亂碼的問題。在基于java的編程中,經常會碰到漢字的處里及顯示的問題,比如一大堆亂碼或問號。這是因為java中默認的編碼方式是UNICODE,而我們通常使用的文件和DB都是基于GB2312或者BIG5等編碼,所以會出現這樣的問題。通過設置resp.setCharacterEncoDing(“utf-8”)便可以解決解決問題了。
4.在使用Dbutils 之前,我們Dao層使用的技術是JDBC,JDBC的弊端:
(1)數據庫鏈接對象、sql語句操作對象,封裝結果集對象,這三大對象會重復定義
(2)封裝數據的代碼重復,而且操作復雜,代碼量大
(3)釋放資源的代碼重復
使用使用Dbutils 之后,封裝了JDBC的代碼,簡化開發人員對dao層的操作。
框架的作用:能夠幫助程序員,提高程序的開發效率。
5.java程序都是通過JDBC(Java Data Base Connectivity)來訪問數據庫的。JDBC定義了一系列的接口規范,具體的實現是由各數據庫廠商去實現,是一種典型的橋接模式。
JDBC的工作量大:需要先注冊驅動和數據庫信息、操作Connection、通過statement對象執行SQL,將結果返回給resultSet,然后從resultSet中讀取數據并轉換為pojo對象,最后需要關閉數據庫相關資源。而且還需要自己對JDBC過程的異常進行捕捉和處理。
6.在開始使用EasyUI之前,要認清楚一個原則,因為EasyUI是封裝的CSS及JS庫,所以在修改EasyUI組件的樣式和功能時,最好是采用EasyUI封裝后的CSS樣式和JS方法,而不是自己去寫CSS和JS,這樣不容易引起沖突,樣式統一性也得到了保證。
總結
以上是生活随笔為你收集整理的超超超超超详细的数据库课设报告-学生公寓管理系统的全部內容,希望文章能夠幫你解決所遇到的問題。

- 上一篇: CleanMyMac4.12.2最新免费
- 下一篇: 机器学习——数据降维和相关性分析