【計(jì)算機(jī)畢業(yè)設(shè)計(jì)】基于jsp網(wǎng)上書店(源代碼+論文)
網(wǎng)上書店系統(tǒng)
1.需求分析。
參考設(shè)計(jì)要求,及可行性的分析,我們確定了如下的需求:
1.數(shù)據(jù)庫設(shè)計(jì)科學(xué)合理。
2.網(wǎng)站主頁面簡潔美觀,可以天藍(lán)色為主色調(diào)。
3.網(wǎng)站主頁顯示各個(gè)分類的及總的暢銷表、新書榜、推薦榜,顯示論壇新帖。
4.單本圖書的詳細(xì)資料頁面顯示同類圖書的暢銷榜,同一作者的暢銷榜,購買了同一本書的讀者此外還購買的圖書。
5.可按作者,或者書名,或者出版社搜索圖書。
6.用戶注冊登錄后可以使用購物車、訂單等功能,可以修改密碼、個(gè)人資料,還可以在論壇發(fā)表新帖、回復(fù)。
7.具備友好的用戶界面,提供適當(dāng)?shù)牟僮魈崾?,如用戶登錄時(shí)的密碼錯(cuò)誤等。
8.網(wǎng)站管理員可通過后臺管理界面,修改密碼,添加、刪除用戶,添加、刪除、修改圖書的詳細(xì)資料。
2.總的設(shè)計(jì)思想、系統(tǒng)平臺、開發(fā)工具。
團(tuán)隊(duì)工作模式:以組長為核心,充分溝通與交流,保證概念的完整性與進(jìn)度的良好控制。
采用自頂向下的設(shè)計(jì)方法,策略上采取復(fù)用、分而治之。
首先,清晰的結(jié)構(gòu)和表達(dá)方式更容易對需求和模塊功能進(jìn)行精確的描述。其次,模塊分割和模塊獨(dú)立性避免了系統(tǒng)級的bug。另外,細(xì)節(jié)的隱藏使結(jié)構(gòu)上的缺陷更加容易識別。第四,設(shè)計(jì)在每個(gè)精化步驟的層次上是可以測試的,所以測試可以盡早開始,并且每個(gè)步驟的重點(diǎn)可以放在合適的級別上。
一次添加一個(gè)構(gòu)件(功能模塊)。在添加了新的構(gòu)件(功能模塊)之后,用它們來測試子系統(tǒng)。因?yàn)槟切┰瓉砜梢栽谧酉到y(tǒng)上成功運(yùn)行的用例,必須在現(xiàn)有系統(tǒng)上重新運(yùn)行,對系統(tǒng)進(jìn)行回歸測試。
精確、完整地定義接口、功能模塊時(shí),將具有一定集成度并可以重復(fù)使用的模塊抽象出來,經(jīng)驗(yàn)證后發(fā)放給組員以供復(fù)用,盡可能地避免代碼的重復(fù)生產(chǎn),提高代碼的重用率,從而合理化、并簡化開發(fā)過程,減少總的開發(fā)工作量與維護(hù)代價(jià),提高生產(chǎn)率。
通過QQ、郵箱、局域網(wǎng)內(nèi)的共享等,共享調(diào)試記錄。
系統(tǒng)平臺:Windows XP SP2 。
開發(fā)工具:Tomcat,JDK 1.5,Eclipse,Access 2003,Macromedia Dreamweaver MX 2004。
3.數(shù)據(jù)結(jié)構(gòu)。
在 Microsoft Office Access 2003 中建立數(shù)據(jù)庫。
表-1 book ,圖書的詳細(xì)資料。
字段名稱數(shù)據(jù)類型意義說明bookId自動編號圖書編號(主鍵)bookTitle文本書名bookAuthor文本作者bookDate日期/時(shí)間出版日期形如:2007-01-22bookPublish文本出版社bookPrice數(shù)字標(biāo)價(jià)bookStorage數(shù)字庫存bookSold數(shù)字售出數(shù)量bookPhoto備注封面圖片的路徑和文件名bookSort文本類別科技、文藝、管理、經(jīng)濟(jì),等bookIsbn文本ISBN號bookWords數(shù)字字?jǐn)?shù)bookYC數(shù)字印次bookBC數(shù)字版次bookSheet文本紙張bookValue數(shù)字售價(jià)bookSummary備注內(nèi)容提要bookAuthorInformation備注作者簡介bookComment備注評論bookCommend文本推薦方式inAll(全局推薦)、inSort(在其所屬類別內(nèi)推薦)
表-2 user , 用戶的詳細(xì)資料。
字段名稱數(shù)據(jù)類型意義說明userId自動編號用戶編號(主鍵)userName文本用戶名userFigure文本身份總管、讀者userSex文本性別男、女userAge數(shù)字年齡>0 , <150userBirthday日期/時(shí)間出生日期形如:2007-01-22userAddress文本現(xiàn)居住地userHome文本籍貫userPwd文本密碼userNumber文本身份證號
表-3 orderTotal ,訂單的整體屬性資料。
字段名稱數(shù)據(jù)類型意義說明orderId數(shù)字訂單編號(主鍵)userId數(shù)字用戶編號orderDate日期/時(shí)間訂購日期形如:2007-01-22checkDate日期/時(shí)間審核日期形如:2007-01-22totalValue數(shù)字總價(jià)
表-4 orderItem ,訂單中的圖書條目資料。
字段名稱數(shù)據(jù)類型意義說明orderId數(shù)字訂單編號bookId數(shù)字圖書編號buyNum數(shù)字購買數(shù)量bookSta文本圖書狀態(tài)缺書、待審、已發(fā)bookValue數(shù)字圖書售價(jià)
表-5 topic ,論壇的主帖的詳細(xì)資料。
字段名稱數(shù)據(jù)類型意義說明topicId數(shù)字主帖編號(主鍵)topicDate日期/時(shí)間發(fā)表日期形如:2007-01-22topicContent備注內(nèi)容topicTitle備注標(biāo)題userName文本發(fā)表的用戶名followTotal數(shù)字回復(fù)數(shù)userId文本發(fā)表的用戶編號
表-6 topic_follow ,主帖與回帖的對應(yīng)關(guān)系。
字段名稱數(shù)據(jù)類型意義說明followId數(shù)字回帖編號(主鍵)topicId數(shù)字主帖編號followUserId數(shù)字回帖的用戶編號
表-7 follow ,回帖的詳細(xì)資料
字段名稱數(shù)據(jù)類型意義說明followId數(shù)字回帖編號(主鍵)followDate日期/時(shí)間發(fā)表日期followContent備注內(nèi)容followTitle文本標(biāo)題
表-8 hotSearch ,熱門搜索關(guān)鍵詞的詳細(xì)資料。
字段名稱數(shù)據(jù)類型意義說明hotSearchId自動編號編號(主鍵)searchMode文本搜索方式作者、書名、出版社searchWord文本搜索關(guān)鍵詞
4.功能模塊。
4.1首頁 index-main.jsp 部分代碼—1。
變量、函數(shù)的聲明,網(wǎng)頁標(biāo)題的顯示。
<%@ page language="java" contentType="text/html; charset=gb2312"
import="java.sql.*,myPk.*" %>
<% request.setCharacterEncoding("gb2312"); %>
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link rel="stylesheet" type="text/css" href="blue.css">
<%!
//轉(zhuǎn)換字符集
public String toChi(String str)
{
if (str==null)
return "";
try
{
String temp_p=str;
byte[] temp_t=temp_p.getBytes("ISO8859-1");
String temp=new String(temp_t);
return temp;
}
catch(Exception e) { }
return str;
}
%>
<%
String sort=null;
String pageTitle="首頁";//網(wǎng)頁標(biāo)題
String bookHot="";//欄目的標(biāo)題
String sql="select * from book";
Pageable rs=null;
Pageable rsNew=null;
Pageable rsHot=null;
Pageable rsCam=null;
if(request.getParameter("sort")!=null)
{
/*Javascript腳本中頁面跳轉(zhuǎn)時(shí)傳遞的參數(shù),
以及HTML中鏈接(<a href="***.jsp?p1=z1">跳轉(zhuǎn)</a>)時(shí)傳遞的參數(shù),
即使在發(fā)送端用了 request.setCharacterEncoding("GB2312");
接收時(shí),仍然要用自定義的函數(shù)轉(zhuǎn)換字符集,否則參數(shù)中的中文會顯示為亂碼。
*/
sort=toChi(request.getParameter("sort"));
pageTitle="["+sort+"]";
bookHot=pageTitle;
sql=sql+" where bookSort='"+sort+"'";
}
%>
<title><%=pageTitle %>--網(wǎng)上書店</title></head>
4.2首頁 index-main.jsp 部分代碼—2。
顯示全局推薦、類別內(nèi)推薦的書目。
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>
<div id="titleBg">
<div id="titleText"><%=bookHot %>推薦</div><br></div></td></tr>
<tr>
<td align="left">
<%
Conn con=null;
try
{
String comSql="";
if(request.getParameter("sort")!=null)
comSql+=sql+" and bookCommend='inSort'";
else
comSql+=sql+" where bookCommend='inAll'";
comSql+=" order by bookSold desc";
con=new Conn();
Pageable rsCom=con.getRs(comSql);
rsCom.setPageSize(10);
rsCom.gotoPage(1);
for(int i=0;i<rsCom.getPageRowsCount();i++)
{
if(sort==null)
{
%>
<ahref='index-main.jsp?sort=<%=rsCom.getString("bookSort") %>'>[<%=rsCom.getString("bookSort") %>]</a>
<%
}
%>
<ahref='book-information.jsp?id=<%=rsCom.getString("bookId") %>'><%=rsCom.getString("bookTitle")%>
<%=rsCom.getString("bookAuthor")%>
<%=rsCom.getString("bookDate").substring(0,10) %></a><br>
<%
rsCom.next();
}
con.closeRs();
}catch(Exception e) { out.print(e.toString()); }
%>
</td></tr></table>
4.3訂單處理文件 deal-order.jsp 的部分代碼—1。
函數(shù)聲明。
<%@ page language="java" contentType="text/html; charset=gb2312" import="java.sql.*,myPk.*" %>
<% request.setCharacterEncoding("gb2312"); %>
<%!
/*訂單(session) order 形如 -bookId,buyNum-bookId,buyNum- ,
依次為 -圖書編號,購買數(shù)量-圖書編號,購買數(shù)量-*/
/* 如果字符串 str 的長度小于 n ,則在其左邊填充足夠的 * 號,使其長度為 n 。<-左,右-> */
public?String appString(String str,int?n)
{
int?strLen=str.length();
if(strLen>=n)
return?str;
String sTem="";
String sBlank="*";
for(int?i=0;i<(n-strLen);i++)
sTem+=sBlank;
sTem+=str;
return?sTem;
}
/* 將 str 以 - 為標(biāo)志分段,于各小段中再以 , 分為兩段(形如段a,段b),在每個(gè)段a的左邊填充 * 號,使每個(gè)段a的長度均為 n */
public?String appLongStr(String str,int?n){
String[] sTem=str.split("-");
String sRet="";
for(int?i=0;i<sTem.length;i++){
String[] splitByDot=sTem[i].split(",");
splitByDot[0]=appString(splitByDot[0],n);
sTem[i]=splitByDot[0]+","+splitByDot[1];
}
if(sTem.length==1)
return?sTem[0];
for(int?i=0;i<(sTem.length-1);i++)
sRet+=sTem[i]+"-";
sRet+=sTem[sTem.length-1];
return?sRet;
}
%>
4.4訂單處理文件 deal-order.jsp 的部分代碼—2。
放棄購物車中的指定書本。
<%
if(act.equals("del")){
//將某書從購物車中移除
if(sOrderSession.indexOf("-")==-1)
sTem="";//刪除的是 session order 中僅有的一個(gè)記錄項(xiàng)
else{
sSessionLeft=sOrderSession.substring(0,sOrderSession.indexOf(bookId+","));
sSessionRight=sOrderSession.substring(sOrderSession.indexOf(bookId+","));
if((sSessionLeft.indexOf("-")==-1)&&(sSessionRight.indexOf("-")!=-1))
sTem=sSessionRight.substring(sSessionRight.indexOf("-")+1);//刪除的是 session order 中最左的記錄項(xiàng)。
else?if((sSessionLeft.indexOf("-")!=-1)
&&(sSessionRight.indexOf("-")==-1))
sTem=sSessionLeft.substring(0,sSessionLeft.lastIndexOf("-"));//刪除的是 session order 中最右的記錄項(xiàng)
else
sTem=sSessionLeft.substring(0,sSessionLeft.lastIndexOf("-"))+sSessionRight.substring(sSessionRight.indexOf("-"));//刪除的是 session order 中間位置的記錄項(xiàng)
}
}//if(act.equals("del")
%>
5.運(yùn)行結(jié)果。
5.1首頁。
5.2智能圖書搜索。
搜索欄的輸入框的下邊有相應(yīng)搜索方式的熱門搜索關(guān)鍵詞??煞謩e按作者、書名、出版社搜索圖書,同時(shí)支持模糊搜索,如,按“出版社”搜索“長江[空格]人民”可搜索到出版社名字中含有“長江”、“人民”的圖書(全圖)。
5.3購物車。
5.4訂單列表。
5.5論壇。
5.6添加圖書。
5.7管理圖書。
6.總結(jié)。
伴隨著第一場雪的降臨,這個(gè)課程設(shè)計(jì)才接近了尾聲。在這次課程設(shè)計(jì)里,可以說是全身心地投入,――正式開始動工之前,有很多關(guān)于網(wǎng)站架設(shè)的想法,覺得網(wǎng)站無非就是數(shù)據(jù)庫+標(biāo)簽,真正下手后,深刻體會到了其中的艱辛,特別是當(dāng)?shù)谝粓鲅﹪W啦啦地下下來,而我卻不得不坐在電腦前繼續(xù)調(diào)試時(shí)。
雖然沒能趕在第一場雪的時(shí)候去堆雪人,不過現(xiàn)在看著埋頭做了一個(gè)多星期的設(shè)計(jì)結(jié)果,有點(diǎn)苦盡甘來的味道。
這次的課程設(shè)計(jì),有兩個(gè)方面的收獲,一個(gè)是心態(tài),一個(gè)是技術(shù)。
在心態(tài)上,端正了之前的心浮氣躁、眼高手高,更加磨練了韌勁,增強(qiáng)了團(tuán)隊(duì)合作精神,提高了對軟件開發(fā)中的工程設(shè)計(jì)思路的認(rèn)識和理解。
技術(shù)上,在JSP動態(tài)網(wǎng)站開發(fā)方面積累了實(shí)踐經(jīng)驗(yàn)。對CSS有了新的認(rèn)識,提高了對HTML的熟練程度及使用技巧,尤其是與Javascript聯(lián)手打造胖客戶端的一些方法和思路。
在做這個(gè)網(wǎng)上書店系統(tǒng)的論壇時(shí),帖子的發(fā)表功能采用的方法是UBB編輯器,通過開發(fā)UBB編輯器,接觸到正則表達(dá)式并可以靈活運(yùn)用。在開發(fā)的過程中,無意中發(fā)現(xiàn)UBB編輯器的一個(gè)不足之處,它在獲取當(dāng)前激活選中區(qū),即高亮文本塊,或文檔中用戶可執(zhí)行某些操作的其它元素的時(shí)候,用的是document.selection.createRange().duplicate() ,所以當(dāng)選中非編輯區(qū)的文本時(shí)(如同一個(gè)頁面內(nèi)的導(dǎo)航時(shí)),然后單擊UBB編輯器的功能按鈕,非編輯區(qū)的文本會響應(yīng)UBB編輯器,這是開發(fā)人員不想看到的--它會導(dǎo)致頁面凌亂。查找相關(guān)資料也未能找到解決辦法,除非摒棄UBB編輯器,改用HTML在線編輯器。
在實(shí)現(xiàn)購物車、訂單的功能時(shí),一開始想全部用數(shù)據(jù)庫實(shí)現(xiàn)??紤]到購物車中的書本并不一定是讀者最終要購買的,如果用數(shù)據(jù)庫實(shí)現(xiàn),那么購物車的每次變動都要更新數(shù)據(jù)庫,這必然會給數(shù)據(jù)庫增加無謂的負(fù)擔(dān)。思考再三,自定義了一個(gè)固定形式的session來保存購物車的書目,當(dāng)讀者確定支付購買時(shí),再將這個(gè) session“解密”后將購買信息寫入數(shù)據(jù)庫。這個(gè)session的格式為:。。。。。。-圖書編號,購買數(shù)量-圖書編號,購買數(shù)量-。。。。。。 ,當(dāng)對購物車中的書目進(jìn)行添加、更改、刪除時(shí),通過判斷需要添加、更改、刪除的書目在這個(gè)session中的位置(session為空,或是session中僅有的一個(gè)書目,或是session中最左的一個(gè)書目,或是session中最右的一個(gè)書目)來作不同的操作。
在測試中,發(fā)現(xiàn)這樣實(shí)現(xiàn)的購物車功能有bug,原因是一本書的編號(如1)可能跟另一本書的編號(如21)的低位相同,于是我就想到,每次在操作這個(gè)session時(shí)先將其中的圖書編號從左邊用*號填充至10位,操作完成后去除所有*號還原。問題迎刃而解。
整個(gè)網(wǎng)站系統(tǒng)共用一個(gè)信息提示的處理頁面tip.jsp,該頁面通過讀取傳進(jìn)來的tip變量判斷輸出給用戶的友好提示信息,傳進(jìn)來的desPage變量則為tip.jsp頁面3秒倒計(jì)時(shí)后前往的頁面地址。
網(wǎng)頁頭部頁面head.jsp中調(diào)用了包java.text,其中通過實(shí)例化SimpleDateFormat類獲取并格式化日期,所以在Eclipse中加載此項(xiàng)目時(shí),除了正確配置數(shù)據(jù)源,還需要在項(xiàng)目的配置中加載Tomcat\common\lib\servlet-api.jar 。
7.參考資料。
1.電子版網(wǎng)頁制作完全手冊(含DHTML參考、HTML參考、CSS屬性參考),手冊的內(nèi)容全部來自Microsoft MSDN Library,由 lemon 整理編輯,資料從http://clgigi.8u8.com下載。
2.電子版JScript 語言參考手冊(含正則表達(dá)式簡介),手冊的內(nèi)容全部來自Microsoft MSDN Library。
3.《JSP動態(tài)網(wǎng)站開發(fā)實(shí)用教程》,機(jī)械工業(yè)出版社,寶貝工作室 策劃。
4.電子版《JSP 2.0技術(shù)手冊》,林上杰、林康司 著,電子工業(yè)出版社。