TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
1.项目介绍5 ]% a9 i& k6 ?- g; V
典型电子商务系统(在线购物平台)。模拟了当当系统部分功能。1 Q% n" I$ t+ c# Q7 D% C6 x
2.功能需求
1 d/ x+ {" V+ I: J/ o+ s 1)用户管理模块(3天)user
5 {9 \5 n) n# e9 o1 V. a W 实现登录、注册功能9 q D( P+ Q. j8 o- i! H% X
2)产品浏览模块(2天)main
1 T: i# }) k: s) y* I/ {* ?6 t 实现主界面和类别浏览功能; _4 C# d+ M+ `5 X- i# X) E6 R
3)购物车模块(1.5天)cart0 w9 v$ I9 w9 W) }4 l
实现购买、变更数量、删除等功能
, a7 Q7 M" m& K$ \1 ^" u 4)生成订单模块(1.5天)order6 T( x* o& E- e" T7 L
订单确认、填写送货地址、生成订单功能
/ [+ l7 `1 E4 I; T+ f# m3.技术应用
- J; m' T9 R: V4 |1 J6 H 1)技术架构5 J$ }- h' M( U T& S4 f3 M
struts2,JDBC(连接池),jQuery,Ajax4 T+ m! Y" U# [: z T( z2 ?
2)设计思想
. q0 [1 |: J/ o" [* B8 a N" T MVC和分层设计思想3 `1 Q4 O; n& L
a.显示层:JSP组件(jQuery,Ajax)& _/ |3 _: [7 Y% t
b.控制层:Struts2控制器组件、Action组件; w4 j, v9 e3 o" J: w- I8 s$ u
c.业务层:Bean组件2 a/ U$ O. U( {/ q
d.数据访问层:DAO组件(JDBC)
* E1 T Y" K, j* U
5 }( a. Y1 f+ O# Z: }4 g3 J4.数据库设计
$ s- V# }8 B8 u3 s, E 1)数据库导入
z/ S+ X1 V, h! s" [1 f create database dangdang; //创建库 G0 W Q0 a* D4 k, t A0 m. N5 X* p& i
use dangdang; //进入dangdang库1 S+ F0 q0 r) E3 L# _& | X8 n
set names utf8; //设置连接和发送SQL编码+ y- {' n! h8 W9 Z) M1 q. [ }" N
source 路径/dangdang.sql; //导入sql文件; ~, M" o9 o! F# O
2)数据表功能
* r/ Y) q1 k; I- M1 n6 k9 O a.d_user(用户信息表)
7 U. k; w; @/ q+ ?1 Y3 F 存储了用户信息,涉及登录和注册功能1 }3 F. ~" Q9 p3 ]
b.d_receive_address(收货地址信息表)
v7 B! C% _2 R, `# V! H% y' K& ` 存储了收货地址信息,涉及填写送货地址功能1 l. y; k4 Z' J- g6 t
c.d_category(类别信息表)7 D$ E7 n# Q6 B3 ?! X/ U, t
存储了图书的类别信息,涉及主界面左侧类别菜单功能
5 I$ u$ g4 _1 j d.d_book(图书信息表)
& B' P& T& r' `8 r7 a0 t3 ~+ V 存储了图书的特有信息,涉及产品浏览等功能
& j8 \6 B' o7 w7 B e.d_product(产品信息表)* p# T; i8 W F, f5 q
存储了各类型产品的共通信息字段。2 ?) c5 i3 n; c( N3 p7 A! c5 C
f.d_category_product(类别和产品对应关系表)
! h+ F/ c- @+ c4 h( V3 H3 R. `# X4 q, ~ 存储了类别和产品之间包含关系,涉及产品浏览功能- Y: W; N, |0 { y9 {' B
g. d_order(订单信息表)% s; x8 q: d6 C. i: `% g
存储了订单信息,涉及创建订单功能# j0 `- W2 \7 J3 H' b- x3 ]1 ]
h. d_item(订单明细表)
$ [! |; @4 h% a- A8 N( w 存储了订单中所购买的商品信息,涉及创建订单功能。. C8 J2 W* r6 w$ Z ~- s
/ x3 O& v' z# x1 s
5. 搭建工程结构
/ v! U U0 E7 O! X; g 1)引入需要的开发包+ \) V( v/ \3 h9 C
struts2开发包
, {" H- t! s+ C8 @5 J jdbc开发包
' h& O2 }: g- [ E, a$ D9 z dbcp连接池开发包' D; u* t9 V5 R' D( C$ `
2)src文件结构
L9 U/ P6 x$ j: A5 n& j0 @$ j org.tarena.dang.action :控制层
6 P; R1 X1 z2 H% E* |$ a org.tarena.dang.action.user :用户模块的action( p% ?2 G3 z& Z: C, ?: h
org.tarena.dang.action.main :产品浏览的action- z( b* l3 b- ^! A" `8 ]8 f
org.tarena.dang.action.order :订单的action8 s, Q% C8 w$ R9 G& @
org.tarena.dang.action.cart :购物车的action
4 I1 U2 d8 |( p% N/ [ org.tarena.dang.service :业务层
0 {% M% h$ j+ x org.tarena.dang.dao :数据访问层% ~! u6 S% E# p5 c9 m8 `& o/ Z
org.tarena.dang.entity :实体类
9 G# `9 X/ M$ h org.tarena.dang.util :工具类$ I7 k {1 Q" o
org.tarena.dang.interceptor :拦截器: ]' S0 t; e3 P3 |- j
3)struts配置文件结构
& u' a7 B5 n8 q/ T1 R9 |( A2 C: J& u web.xml(配置Filter控制器)
( y3 X! p% K% ^+ v struts.xml (struts主配置文件)
% s/ r2 U7 v1 h' \0 a$ p struts-user.xml(用户模块配置文件)
' D: Z; |3 R6 E, u4 w: o+ Z9 D0 d8 ^ struts-main.xml(浏览模块配置文件)
8 s$ ^& G8 M+ Q v" e9 x struts-order.xml(订单模块配置文件)2 d& r I: D1 G6 W2 j0 ]3 A8 ~
struts-cart.xml(购物车模块配置文件)) r3 \* A# G$ y- \
0 g3 k- o3 |4 A4 W8 p- A0 O+ H0 ~
4)WebRoot文件结构
5 G3 o* X0 j+ |& h+ l /user/* :用户管理的JSP% m: E2 @0 o/ {; ]9 E
/cart/* :购物车的JSP$ r. W9 i( A* E% V5 I
/order/* :订单的JSP |' Y7 A6 f+ F, S6 A7 B
/main/* :产品浏览的JSP
1 g r2 v" `$ I4 j8 H- D /common/* :页眉、页脚等共同JSP
8 Z- t# r6 R* i/ |3 e. W1 f- l! a /js/* : 放置js脚本文件6 {9 Q( M1 B5 J2 r9 ]+ P! i
/css/* :放置css样式文件
" I1 m( S: S6 f& ?% O$ L$ k /images/* :放置页面图片文件# c! m) }3 Q1 C; S
/productImages/* :放置产品图片
: p2 Y( I3 H3 r- b' _( M4 K% k- ^5 l7 Z
-----------------连接池的优点-----------------# ^. x. ]( P2 ]8 A+ a8 D
a.可以管理Connection对象,并且将Connection数量控制在一个安全范围内。提高数据库的访问安全性。( t5 E1 D1 U* n6 X
b.连接池中的Connection对象与数据库保持连接状态,避免频繁的建立和销毁连接。) |8 }9 x% {. z J; t C& U/ Y% u
/ }% S. B: f8 O1 Z* L
============用户管理模块==============
8 [* I" P6 @" C3 j! E1.注册需求
+ B3 r. n& K* g 1)表单验证(采用js+Ajax)
/ j% B' k# e5 T4 E0 P: y# } 邮箱:非空、格式、唯一性(ajax)3 W4 B9 ]# V) s& x! W* b
昵称:非空、格式 B; k5 `; {, Y* P2 ^# D
密码:非空、格式
( k4 T# k' i5 M I$ B9 w 确认密码:非空、与密码一致/ @, g( i& O6 Q
验证码:非空、正确性(ajax)
: Z* e$ b; _5 l7 w r' ]9 S$ W7 L% }7 i
2)将表单信息写入数据表d_user. I' n0 ]& m9 o( p
编写实体类、DAO、Action4 Q% z0 d6 t* a! o
3)给用户邮箱发送验证码0 `8 R+ c; C- f. |1 F3 r
引入commons-email.jar,email.jar& `) b4 v( \) _" ~- J/ j
参考EmailUtil工具类代码+ _( W- ^9 z; f9 k4 F' w, [
4)进入邮箱验证页面verify_form.jsp
: h7 F3 [( q- C# K3 x3 d. t0 i: O8 g% C. P/ i6 k& B4 X" W
2.邮箱验证
+ {/ R# [2 M% T) M 1)表单验证
+ |1 S0 {' N9 Q* R 验证码:非空、正确性(ajax)8 D1 m% [7 c( H. _! O% W
正确后跳转到成功提示界面:window.location = "register_ok.jsp";$ {6 L; V7 D8 w# [0 a1 {: |' [
2)Action逻辑& @! P9 W9 U) K3 f- ?: A8 `
a.利用验证码去d_user检查% |5 y8 S. O9 C: g3 a# f |2 l. R
b.如果正确,将d_user的is_email_verify字段更新成Y;不正确在verify_form.jsp提示“验证失败”
- Q' \- X7 Y# }( Z* E- i; g c.跳转到register_ok.jsp
5 P& `5 z9 i, q- A# |5 W; A3.用户登录4 G( ~, Q$ Y3 l' P
1)表单验证1 W9 ]5 ?8 X9 _/ ?$ B7 v
邮箱:非空、格式* G9 k- `) S$ V4 c- j0 W
密码:非空1 }, m2 e* |/ l8 A
2)Action逻辑+ e1 e* R( O6 S$ M# Y
a.检测Email和密码是否正确,失败回到login_form.jsp提示; J/ I9 |$ o" k& v& G" L
b.检测is_email_verify邮箱是否通过验证,未通过进入verify_form.jsp6 T+ c8 A3 S7 e6 e2 J
c.更新最后一次登录时间last_login_time和IP地址last_login_ip。
4 B) v$ ~! P; v7 L d.将用户信息放入session。- D# ~4 v5 K0 A3 |! ~
e.都正确进入/main/main.jsp- d, _' B( p) H: L) G& X
4.main.jsp页面的页眉部分,显示用户是否登录的状态
# Z% s, T; _. l 如果用户已登录,显示"欢迎XXX,【登出】"
0 ?$ f7 |% j: n4 }! b$ j7 i+ H 如果用户未登录,显示"【登录】【注册】"9 f/ {' g8 r/ x
+ x' _+ F0 N9 Y
数据库 模型
7 _: X! `" K/ E6 z: X
1 k: x3 l: O. \- Q' U9 C% ?3 c% Z
! T, ]: ~& `* P' T) ~) x效果演示图:- \$ m9 K# ^- J* d
首页演示图:
: t' e9 h; J3 [/ U( l
/ {& M* O: x0 f# n+ ?* f
. V: l3 T7 }( L! f* @: W8 n注册页面:& m* n, M- g% t Y) b: k
8 ]$ [: D1 q! ] b7 q3 n邮箱验证页面:" A- c- r/ `, \$ F# a5 B/ ^2 v
9 P, ]: B8 g" e @- K* P/ ]- z
验证成功:! k: n' ]7 W% | H) i
7 C% R$ E& I, q9 {/ s( Q2 O用户在线状态:% }$ R- ~# v. Z
$ O! ^0 U3 D- [5 H( C
用户可以购物了:
# r, ] w5 F% X3 c! s) H' ~
) I7 o7 U% F8 D* a0 L) n/ E
0 C& E6 G; P" J' s: [源码下载地址:点击下载
* z' S0 X! J6 ^$ b; A- ?! S4 ^+ O& }& M7 Y Q# x ~5 D, t
$ s: r6 w2 q! n( y# Z9 n数据库下载地址:点击下载, f4 [5 s) y- O+ e e C% h/ p
6 C; V$ h2 ?! \/ b/ ` |
|