基於Java Web的網上圖書商城管理系統——(二)
二、總體設計
1.技術選型——系統架構
本系統架構模式的選擇還是以傳統的MVC模式為主, 採用DAO模式進行設計,選擇web層、service層、dao層的三層結構。選擇的 技術包括JSTL + JSP + Servlet + JavaBean + BeanUtils + FileUpload + JavaMail + DBUtils(JDBC) + C3P0 + MySQL + MyEclipse10+ Tomcat7.0 + JDK6 + Windows等。
2.資料庫設計
本系統存在以下實體:使用者、商品、訂單、購物車,考慮到本系統沒有具體實物的商品,故購物車功能只做簡單的模擬過程,所以不將購物車放入資料庫,而是採用Session或者Cookie實現。
資料庫中的表:
使用者表:
create table users (
id int primary key auto_increment,
username varchar(40),
password varchar(100),
nickname varchar(40),
email varchar(100),
role varchar(100) ,
state int ,
activecode varchar(100),
updatetime timestamp );
商品表:
create table products(
id varchar(100) primary key ,
name varchar(40),
price double,
category varchar(40),
pnum int ,
imgurl varchar(100),
description varchar(255));
訂單表:
create table orders(
id varchar(100) primary key,
money double,
receiverinfo varchar(255),
paystate int,
ordertime timestamp,
user_id int ,
foreign key(user_id) references users(id)
);
確定關係:
訂單與使用者之間存在關係:1 對 多 。要在訂單表中生成一個外來鍵來描述關係。
訂單項:描述的商品與訂單之間的關係:多對多關係。需要一箇中間表來描述它們關係。
訂單項表:
create table orderitem(
order_id varchar(100),
product_id varchar(100),
buynum int ,
primary key(order_id,product_id),
foreign key(order_id) references orders(id),
foreign key(product_id) references products(id)
);
設定資料庫環境
資料庫 :create database estoresystem
3.模組化
(1)註冊模組
1) 一次性驗證碼
原理:在生成驗證碼Servlet程式中,將生成驗證碼儲存Session中,使用者提交驗證碼 與 儲存在Session驗證碼進行比較,如果相同,請求合法
2) 登錄檔單 JS校驗
考慮JS校驗是否可以抽取成框架
3) 處理form亂碼問題 ---- 通用get post 亂碼過濾器
4) 密碼 MD5 加密
5) 啟用郵件傳送
6) 配置通用錯誤處理頁面web.xml
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
500.jsp 顯示錯誤的資訊
404.jsp 自動重新整理跳轉回主頁面
(2)登入模組
原理:使用者輸入正確使用者名稱和密碼,登入成功,使用者資訊將會被儲存Session物件中。 ------ 記住使用者名稱和密碼 、自動登入
1) 登入表單中,新增記住使用者名稱 和 自動登入功能
2) 登入過程中判斷 賬戶是否啟用
3) 在login.jsp 顯示記住使用者名稱
在username 的input項中新增 value="${cookie.username.value}"
在勾選自動登入 checkbox 新增
4) 登入後登出功能
登出Session
關於自動登入:
自動登入功能 對系統所有頁面有效 (例如訪問index.jsp list_product.jsp info_product.jsp 這些頁面在訪問時都將執行自動登入)
* 對於登入相關頁面不會執行自動登入邏輯 (login.jsp 、LoginServlet 、InvalidateServlet )
1) 判斷該請求頁面是否需要自動登入
2) 是否已經登入
3) 是否含有自動登入cookie
4) 自動登入
5) 在LoginServlet 新增對於沒有勾選記住使用者名稱和自動登入處理程式碼 !!!!!!!
6) 在退出功能 InvalidateServlet 清除自動登入資訊
(3)商品新增模組
檔案上傳三個注意事項
1) input輸入框 必須有name屬性
2) 表單form 必須post提交方式
3) 設定form的enctype 為 multipart/form-data
表單提交時,校驗分為兩種 : 客戶端校驗 、伺服器端校驗 ------ 只有伺服器端校驗才能確保資料準確
商品圖片上傳到伺服器端後,儲存在哪個目錄 ??? 必須直接在WebRoot下及其除WEB-INF、META-INF 子目錄外
一般情況下,一張表對應Domain類 --- DAO類 ---- Service類
(4)商品查詢模組
列表中顯示原圖,因為原圖比較大,頁面載入非常緩慢 ,頁面佈局不會很美觀 ---------------- 縮圖
* Java中通過圖形介面技術,生成小圖
在Product類中新增 getImgurl_s方法,用來獲取縮圖路徑
(5)檢視商品詳情模組
通過在列表中點選 商品圖片或者商品名稱 進入詳情檢視頁面
(6)新增到購物車模組
購物車物件,不儲存在資料庫中,使用Session來儲存使用者購物車資料
儲存購物車物件 Map<Product,Integer> key 商品物件 value 商品購買數量
流程 :新增商品到購物車流程,點選新增到購物車,將商品id傳遞Servlet ,從Session中取出購物車物件,判斷商品是否已經在購物車中,如果不在新增商品到購物車數量 1 ,在購物車取出原有數量+1
1) 如果Map的key是一個自定義物件,重寫 hashcode和equals
2) 如果商品不在購物車中,需要根據商品 id 查詢商品所有資訊,新增購物車
3) 新增商品到購物車
Session中資訊在伺服器正常關閉時,會被序列化到硬碟中 ---- Product實現 Serializable介面 完成序列化
(7)檢視購物車模組
購物車資訊儲存在Session中,不需要去查詢資料庫,將Session中資訊顯示出來
在購物車中顯示總價
(8)購物車管理模組
購物車修改 :
清空購物車 : request.getSession().removeAttribute("cart");
刪除購物車中單項商品 : cart.remove(product) ; 注意:刪除一項後,判斷購物車是否為空,如果為空 移除購物車物件
* 刪除確認功能
寫法一:直接在href中 觸發js函式,詢問使用者是否確認,如果確認,location.href 發起刪除請求 ----- <a href="javasript:confirmDel();" >...</a>
寫法二:<a href="/delCart?id=xx" onclick="confirmDel(); "></a> 在連結中新增 onclick事件 ,詢問使用者是否確認,如果使用者取消,通過JS阻止href事件提交
阻止href預設事件 : e.preventDefault() ---- 必須支援事件 FF支援、IE不支援
IE阻止href預設事件
function confirmDel(e){
// 詢問使用者是否確認
var isConfirm = window.confirm("商品不要了嗎?多好的商品啊!");
if(!isConfirm){
// 使用者選擇取消,阻止 a 標籤 預設事件 href發生
if(e&&e.preventDefault){
// e物件存在,preventDefault方法存在 ---- 火狐瀏覽器
e.preventDefault();
}else{
// 不支援e物件,或者沒有preventDefault方法 ---- IE
window.event.returnValue = false;
}
}
}
修改購物車中商品購買數量 ---- JavaScript 控制購物數量修改
(9)生成訂單模組
重點:
1) 向orders表插入訂單資訊後,同時需要向orderitem表插入 訂單中每項資料
2) 多表插入 (資料完整性問題) --- 事務管理
3) 訂單生成後 ,商品數量更新減少
(10)檢視訂單模組
管理查詢訂單 --- 所有人訂單資訊
普通使用者 ---- 只能查詢自己的訂單
在訂單生成後,檢視訂單列表 、也可以通過index.jsp 進入訂單檢視頁面
重點:查詢訂單時,同時查詢訂單專案資訊
1) 查詢訂單基本資訊時,查詢下單使用者暱稱和使用者名稱
在Order類中 新增 使用者的 username 和 nickname欄位
select orders.*,users.username,users.nickname from orders,users where orders.user_id = users.id;
2) 查詢訂單項資訊時,查詢商品的名稱和單價
在OrderItem類中 新增商品的name和price 欄位
select orderitem.*,products.name,products.price from orderitem,products where orderitem.produtct_id = products.id and orderitem.order_id = ?
(11)訂單管理模組
訂單取消 : 刪除訂單表資訊時,同時刪除訂單項資訊 (訂單項資訊依賴 訂單資訊 ,必須先刪除訂單項)
注意事項
1) 可以取消未支付的訂單,如果訂單已經支付,將無法取消
2) 管理員不能取消任何使用者未支付訂單,普通使用者只能取消 自己的未支付的訂單
取消訂單進行事務管理 :刪除訂單項、刪除訂單、恢復商品數量
(12)許可權控制模組
當前系統有三種使用者:
1.遊客----檢視商品
2.user -----檢視商品 生成訂單 檢視訂單
3.admin-----下載榜單 新增商品.
許可權控制---使用annotation + 動態代理完成操作.
資料庫進行修改
users表中的role欄位做為一個外來鍵.
新增一個role表,這個表中有相關使用者角色資訊
create table role(
role varchar(100) primary key
)
users表中的role欄位是一個外來鍵,依賴於role表中的role欄位.
create table privileges(
id int primary key auto_increment,
name varchar(20) 許可權名稱
)
角色與許可權之間存在多對多物件
有一箇中間表
create table userprivilege(
privilege_id int,
role varchar(100),
primary key(privilege_id,role),
foreign key userprivilege(privilege_id) references privileges(id),
foreign key userprivilege(role) references role(role)
)
4.模組間的關係