大三上的web程序課程設(shè)計(jì)需要做一個(gè)mini學(xué)生成績(jī)管理系統(tǒng)迈螟,完成后有這些體會(huì)忘渔,系統(tǒng)已開(kāi)源至Github
https://github.com/86XIng/Student-Achievement-Management-System
團(tuán)隊(duì)介紹:https://86xing.github.io/6XIng.github.io/deeptech/
- 前期需求分析真的很重要
我們小組有王晨旭和劉俊洲的指導(dǎo)诬烹,他們?cè)谲浖捻?xiàng)目經(jīng)驗(yàn)告訴他們要做好需求分析再編碼溪胶,于是我們?cè)谒麄兊闹笇?dǎo)下開(kāi)了很多次會(huì)阔拳,討論出來(lái)一大堆問(wèn)題壶唤。比如課程表的設(shè)計(jì)雳灵,轉(zhuǎn)專(zhuān)業(yè)學(xué)生如何選課,重修的學(xué)生怎么辦闸盔,公選課沒(méi)有固定的班級(jí)怎么和班級(jí)表形成映射悯辙,教室的分配問(wèn)題等等,我們?cè)诎装迳袭?huà)出了E/R圖迎吵,甚至是表的設(shè)計(jì)圖以及我們能想到的初步的解決方案笑撞,雖然這些需求在這次項(xiàng)目中沒(méi)有用到,但也讓我們感受到想做好一個(gè)完整的項(xiàng)目其實(shí)是很不容易的钓觉。
- 先分工把目錄定好然后整合
第一次展示的時(shí)候茴肥,我們小組的前后臺(tái)沒(méi)有整合到一起,是因?yàn)槲覀兌际欠珠_(kāi)完成的荡灾,在各自電腦上新建的vs項(xiàng)目瓤狐,無(wú)法合并到一起。吃過(guò)這次虧過(guò)后批幌,我把整個(gè)的項(xiàng)目目錄和空文件先搭建了起來(lái)推送到git上础锐,在云端建立數(shù)據(jù)庫(kù),新控件什么的依賴(lài)包先安上荧缘,避免合并時(shí)因?yàn)槊總€(gè)人生成的webconfig文件不同而報(bào)錯(cuò)皆警。
- 每個(gè)人的水平不一樣,一定要多交流
最開(kāi)始說(shuō)要用git倉(cāng)庫(kù)管理的時(shí)候我認(rèn)為git這種東西應(yīng)該是不用特別強(qiáng)調(diào)截粗,看下教程就能滿足我們這次項(xiàng)目需求的信姓,結(jié)果git倉(cāng)庫(kù)的push記錄都是我的,一問(wèn)才知道意推,大家原來(lái)對(duì)這個(gè)東西一頭霧水,光是理解概念就耗費(fèi)了很多時(shí)間珊蟀,于是我在簡(jiǎn)書(shū)上針對(duì)這次項(xiàng)目需要用到的命令給他們做了總結(jié)http://www.reibang.com/p/3ea955d63b7a菊值,效果很好,幾乎每個(gè)人都學(xué)會(huì)了用命令行來(lái)控制git
- Md5算法,session的名稱(chēng)及secretkey什么的腻窒,應(yīng)該盡早定下來(lái)
關(guān)于md5加密昵宇,我們小組前期做的時(shí)候全都是用的明文密碼,我們也知道這肯定是要改的儿子,但是什么時(shí)候改瓦哎,怎么改,很長(zhǎng)一段時(shí)間內(nèi)都沒(méi)人定下來(lái)典徊,可能每個(gè)人寫(xiě)的算法不一樣調(diào)用的函數(shù)不相同導(dǎo)致求出的hash不同什么的,于是寫(xiě)了一個(gè)方法以及使用教程恩够,在我們組內(nèi)統(tǒng)一使用http://www.reibang.com/p/73082e546de6卒落。session這個(gè)最后發(fā)現(xiàn)在.net 里調(diào)用十分方便,統(tǒng)一一下名稱(chēng)即可蜂桶,secretkey儡毕,過(guò)期時(shí)間等等無(wú)需關(guān)心、
- 富文本編輯器js插件上傳圖片問(wèn)題
以前一直以為webpages技術(shù)是后臺(tái)渲染扑媚,不能寫(xiě)接口的腰湾,.net寫(xiě)接口只能使用mvc5,有一段時(shí)間甚至在學(xué)mvc5考慮換一個(gè)疆股,但最后掛念于組員可能來(lái)不及學(xué)就放棄了费坊,但是查閱資料的過(guò)程中我發(fā)現(xiàn)有一個(gè)文件后綴名為ashx的神奇東西好像類(lèi)似于接口的意思,網(wǎng)上的教程也比較少旬痹,利用其它平臺(tái)開(kāi)發(fā)的后臺(tái)知識(shí)利用vs平臺(tái)強(qiáng)大的智能提示功能花了一下午附井,探索出來(lái)在webpages框架下寫(xiě)接口的一套流程,并且根據(jù)wangeditor這個(gè)富文本編輯器的說(shuō)明文檔http://www.wangeditor.com/两残,寫(xiě)了一個(gè)簡(jiǎn)單的接口永毅。寫(xiě)接口的過(guò)程中突然意識(shí)到.net做開(kāi)發(fā)的便捷之處,ashx配合綁定的數(shù)據(jù)集人弓,開(kāi)發(fā)起來(lái)特別方便快捷沼死,甚至一句sql語(yǔ)句都沒(méi)有寫(xiě),調(diào)用自己命名的方法代碼看著也整潔了不少崔赌。
另一個(gè)問(wèn)題是如何獲取富文本編輯器里的內(nèi)容意蛀,富文本編輯器封裝了獲取的方法,但是是放在js代碼里的健芭,通過(guò)后臺(tái)代碼無(wú)法直接取得浸间,想了兩種辦法,一種是用ajax請(qǐng)求吟榴,再寫(xiě)一個(gè)接口魁蒜,通過(guò)ajax向后臺(tái)傳值,但是這就得再寫(xiě)一個(gè)接口,或者是在pageload里加代碼兜看,不優(yōu)雅锥咸,否決。另一種解決方法是在論壇里看到的细移,放置一個(gè)隱藏的輸入框搏予,用js把內(nèi)容獲取到后復(fù)制到這個(gè)隱藏input框的value中去,再加上runat=server就可以在后臺(tái)間接獲取到輸入的值了弧轧,測(cè)試了一下雪侥,這種解決方法比較完美,字?jǐn)?shù)上沒(méi)有限制精绎。
- 幫劉老師解決新控件綁定圖片時(shí)遇到的問(wèn)題
新控件綁定數(shù)據(jù)做一些開(kāi)發(fā)確實(shí)方便速缨,但是迫于網(wǎng)上教程過(guò)少,而且我們接觸的不多代乃,會(huì)遇到很多這樣那樣的問(wèn)題旬牲,比如說(shuō)圖片無(wú)法綁定的問(wèn)題。我們存在數(shù)據(jù)庫(kù)里的圖片僅僅是圖片的名稱(chēng)搁吓,沒(méi)有相對(duì)和絕對(duì)路徑原茅,在要用到的時(shí)候再另行拼接。劉老師的問(wèn)題是堕仔,新控件無(wú)法像拼接字符串一樣拼接文件路徑擂橘,這一點(diǎn)我一開(kāi)始以為是劉老師沒(méi)有嘗試,最后我嘗試了一晚上摩骨,用各種手段也沒(méi)能利用已有知識(shí)在新控件后臺(tái)代碼里拼接上相對(duì)路徑贝室。劉老師問(wèn)了研究生學(xué)長(zhǎng)和軟件所的同學(xué)都沒(méi)能得到滿意的答復(fù),最后我利用jQuery對(duì)每個(gè)td里含有圖片的路徑進(jìn)行拼接仿吞,勉強(qiáng)讓圖片展示了出來(lái)滑频。至于好點(diǎn)的解決方案,我想應(yīng)該是在數(shù)據(jù)庫(kù)或者數(shù)據(jù)集里解決比較好唤冈,但由于時(shí)間緊迫問(wèn)題接踵而至也未能成功嘗試峡迷。
- 幫劉老師解決新控件局部刷新導(dǎo)致密碼框一輸入密碼丟失時(shí)遇到的問(wèn)題
新控件對(duì)密碼框進(jìn)行了封裝,密碼會(huì)由于省市下拉框聯(lián)動(dòng)時(shí)的頁(yè)面刷新而消失你虹,而普通的輸入框則沒(méi)這個(gè)問(wèn)題绘搞,由于軟件所和研究生學(xué)長(zhǎng)從來(lái)沒(méi)在新控件里同時(shí)用到密碼框和聯(lián)動(dòng)效果,這個(gè)問(wèn)題只能自己想辦法解決傅物,用老師上課講的updatapanel的話夯辖,一展開(kāi)編輯欄就會(huì)觸發(fā)postback事件,我想著可能是有更高級(jí)的辦法董饰,讓劉老師都試了其他的update類(lèi)的控件都不行蒿褂,于是便放棄這種思路圆米,轉(zhuǎn)為前端的方法。我的方法和論壇里的很多人類(lèi)似啄栓,藏一個(gè)隱藏的輸入框娄帖,當(dāng)鍵盤(pán)輸入時(shí),把密碼同時(shí)賦值給那個(gè)隱藏的輸入框昙楚,然后頁(yè)面刷新的時(shí)候再把隱藏輸入筐里的值賦值給密碼框近速,單純站在用戶的角度上測(cè)試的時(shí)候也沒(méi)什么問(wèn)題,但是安全性上可能有所損失堪旧。
- 文件名值清零問(wèn)題削葱,本次開(kāi)發(fā)中遇到的最大的坑
public partial class manage_admin_manager_manage_course_change_course_info : System.Web.UI.Page
{
liuchuxiongTableAdapters.課程表TableAdapter CourseTable = new liuchuxiongTableAdapters.課程表TableAdapter();
int index = 0;
string relativePath=null;
……}
在做編輯課程信息的時(shí)候,劉老師遇到了這樣一個(gè)奇怪的問(wèn)題淳梦,讓晨旭和俊洲看析砸,也覺(jué)得沒(méi)毛病,但是就是在插入和刪除的時(shí)候谭跨,圖片的路徑就清零了干厚,這可能是我們這個(gè)項(xiàng)目中遇到的最大的坑李滴,得益于vs強(qiáng)大的調(diào)試功能螃宙,排除了獲取文件名失敗,存儲(chǔ)圖片失敗所坯,相對(duì)路徑錯(cuò)誤谆扎,數(shù)據(jù)庫(kù)插入失敗,數(shù)據(jù)集錯(cuò)誤等等等等一大堆懷疑對(duì)象后我偶然間發(fā)現(xiàn)了問(wèn)題所在芹助,一個(gè)最容易忽視的問(wèn)題堂湖,每次執(zhí)行updata方法或者insert方法后都會(huì)從頭也就是從我貼的代碼開(kāi)始重新對(duì)變量賦值,relativePath也就是在這個(gè)時(shí)候清零的状土,這就涉及到高級(jí)程序語(yǔ)言設(shè)計(jì)的知識(shí)了无蜂,只是這次被劉老師遇到了,我覺(jué)得我們?cè)谝院蟮拈_(kāi)發(fā)中也很可能遇到蒙谓。我的解決方法就是聲明一個(gè)靜態(tài)類(lèi)斥季,類(lèi)中放一個(gè)靜態(tài)成員變量為relativePath,當(dāng)然也可以使用構(gòu)造函數(shù)的辦法累驮。這個(gè)坑比較深酣倾,也暴露出我們對(duì)高級(jí)程序語(yǔ)言的理解還不合格,只知其然而不知其所以然谤专。
- 選課多頁(yè)面同時(shí)開(kāi)啟時(shí)的邏輯問(wèn)題
陳雪做的選課和退課頁(yè)面躁锡,由于我們使用的后臺(tái)系統(tǒng)框架是允許多窗口同時(shí)運(yùn)行的,這就導(dǎo)致了置侍,先同時(shí)打開(kāi)選課和退課頁(yè)面映之,然后在選課后打開(kāi)已經(jīng)開(kāi)啟的退課頁(yè)面拦焚,退課頁(yè)面需要手動(dòng)刷新才能看到新選的課,反之亦然惕医。如何使一個(gè)靜態(tài)頁(yè)面在后臺(tái)數(shù)據(jù)有更新時(shí)刷新耕漱,我想到了用ajax不斷向后臺(tái)請(qǐng)求,后臺(tái)一有更新就立即刷新頁(yè)面抬伺,但是這也有問(wèn)題螟够,如果多名學(xué)生同時(shí)選同一門(mén)課由于后臺(tái)數(shù)據(jù)不斷更新頁(yè)面也會(huì)一直刷新導(dǎo)致無(wú)法正常選課。還有一種可以解決的就是websocket技術(shù)峡钓,參考網(wǎng)頁(yè)股票交易系統(tǒng)妓笙,實(shí)時(shí)更新數(shù)據(jù),但是能力不夠無(wú)法完成能岩,最后折中取巧寞宫,令每當(dāng)鼠標(biāo)移入或移出頁(yè)面時(shí)自動(dòng)刷新一次,雖然體驗(yàn)還是不夠完美拉鹃,但現(xiàn)階段只有這樣才能解決這個(gè)問(wèn)題
- 還有很多很多其它的小問(wèn)題迫于時(shí)間和篇幅便不再贅述辈赋,但正如曾老師暑期實(shí)習(xí)時(shí)所說(shuō),對(duì)于計(jì)算機(jī)這個(gè)專(zhuān)業(yè)的學(xué)生:坑膏燕,只會(huì)越踩越多钥屈。學(xué)海無(wú)涯,只能以此來(lái)勉勵(lì)自己坝辫,雖然這是我們自己做出的第一個(gè)可以用的系統(tǒng)篷就,但功能和業(yè)務(wù)邏輯都還非常簡(jiǎn)單,甚至不能稱(chēng)之為一個(gè)系統(tǒng)近忙,前路還長(zhǎng)竭业,有更多的坑等著我們?nèi)ヌゲ取?/li>