TA的每日心情 | 衰 2021-2-2 11:21 |
|---|
签到天数: 36 天 [LV.5]常住居民I
|
1.项目介绍% E( b4 n: {/ H9 H2 @
典型电子商务系统(在线购物平台)。模拟了当当系统部分功能。) W( X9 F4 T! e, J K$ j5 f2 ^
2.功能需求) Z( K' j' g( U' }
1)用户管理模块(3天)user/ `. S3 t$ D2 A( Y3 ]) l
实现登录、注册功能
- x+ `# B. I* l( g% | 2)产品浏览模块(2天)main3 W* J# B2 v* z' ?% }. W
实现主界面和类别浏览功能
# }& ~3 U3 W, J7 d* F! E- f 3)购物车模块(1.5天)cart I, P+ |' f+ C9 H, |0 E) ^5 ^2 n
实现购买、变更数量、删除等功能/ B/ d5 h: a& E# L" s) o9 i) N
4)生成订单模块(1.5天)order# y q; g1 F. h# B; s2 X+ G
订单确认、填写送货地址、生成订单功能5 P: s! ~6 n% A7 ~% o2 O" \, V
3.技术应用
0 [' n% y& l2 T0 p7 C 1)技术架构
& f0 V6 U! z/ K struts2,JDBC(连接池),jQuery,Ajax
4 Q: O$ E0 P* T& V 2)设计思想
/ z* n' Y) j- `, G: a7 M5 m MVC和分层设计思想
9 U/ x: h- q5 ~; w a.显示层:JSP组件(jQuery,Ajax)6 P& @' T: Z) `
b.控制层:Struts2控制器组件、Action组件& |0 t% m# C( t+ `
c.业务层:Bean组件" p$ g! R3 w6 d( T# j) G8 F" I
d.数据访问层:DAO组件(JDBC)2 Q. A5 p. X8 _; k
3 ~) D* ~6 m- Z7 ^* Z$ J% _
4.数据库设计
v0 A1 a! ^5 M0 M7 j' L 1)数据库导入
7 {0 y4 q6 }' m6 g5 _% {" o$ ~4 ^9 U create database dangdang; //创建库8 m+ d* f9 P* M9 W* Z1 A2 t
use dangdang; //进入dangdang库
; Y5 u+ c- `, y* A- L( P set names utf8; //设置连接和发送SQL编码
6 y, r0 @8 w0 i( Q/ u source 路径/dangdang.sql; //导入sql文件% l- P3 q- \% ]3 e5 S
2)数据表功能9 f$ @( P6 ]8 k5 j
a.d_user(用户信息表)
1 L( f" y, o7 W1 e 存储了用户信息,涉及登录和注册功能
* A8 z2 O' w+ E" L- q+ F, ?8 Q; M b.d_receive_address(收货地址信息表); J2 s0 T6 B; }0 U/ ~
存储了收货地址信息,涉及填写送货地址功能
]7 j' `$ t" R; h } c.d_category(类别信息表), ~8 H: l6 u! J+ ^" e6 z7 h4 s' v
存储了图书的类别信息,涉及主界面左侧类别菜单功能
' Z5 O+ ?6 y: ]+ q5 K$ ~9 l d.d_book(图书信息表)- y d' q/ Q$ I9 S" w+ T7 s7 E6 q
存储了图书的特有信息,涉及产品浏览等功能
6 M2 a7 g" U; i' Y* f e.d_product(产品信息表)
4 x0 Z9 u; c& O a6 S8 O4 ` 存储了各类型产品的共通信息字段。5 p9 t2 K# \! W: T6 a. W
f.d_category_product(类别和产品对应关系表)
; r( D5 L" ~- }, F. u& |- i 存储了类别和产品之间包含关系,涉及产品浏览功能9 @. L1 q$ A; b4 V1 r; \
g. d_order(订单信息表)5 @- k' z* }3 N8 T- a' r
存储了订单信息,涉及创建订单功能6 g0 o* {% [% t
h. d_item(订单明细表)
7 | o5 W" @( n9 V0 n G 存储了订单中所购买的商品信息,涉及创建订单功能。6 [ t: A R' ^8 C, f
& P1 | ^7 K* g: R5. 搭建工程结构
' B( V8 \8 N: x* S) V! s, L4 f 1)引入需要的开发包' m ?5 Y6 _0 g& |- H7 I! D
struts2开发包0 l: S; H+ h4 k; d* U
jdbc开发包% X" P, H# Z! \, x- v
dbcp连接池开发包
$ L6 ?8 O1 |" _: w9 g* A 2)src文件结构5 E7 }3 ?5 H" w) C/ L0 D# {
org.tarena.dang.action :控制层6 B' @! k$ a+ O
org.tarena.dang.action.user :用户模块的action
4 A0 W j1 T! I. H- j org.tarena.dang.action.main :产品浏览的action, e( j, D3 v8 ~
org.tarena.dang.action.order :订单的action
& a7 h+ K* X* H" x+ Q0 q org.tarena.dang.action.cart :购物车的action+ X/ A1 `, b2 b# |' g- P: Y Y. M
org.tarena.dang.service :业务层
, J U4 h; R% q3 }' R- H5 s org.tarena.dang.dao :数据访问层
( X& `8 E' E: U, @2 L+ r$ c- a org.tarena.dang.entity :实体类+ [# Z9 X" K* E& F" E
org.tarena.dang.util :工具类
: |0 H5 W7 U4 b) ` org.tarena.dang.interceptor :拦截器
; |3 D) L9 R; N$ r! m9 j" @' R 3)struts配置文件结构1 e7 `/ { Q2 W* o* p# {1 v
web.xml(配置Filter控制器)
1 _1 R2 m8 T8 M0 u% t6 {8 V struts.xml (struts主配置文件)
& H% n' w e+ r2 u. @, G struts-user.xml(用户模块配置文件)
7 d2 S5 |9 K8 k1 ^ struts-main.xml(浏览模块配置文件)
$ O* ?# C3 F% |0 C& [ struts-order.xml(订单模块配置文件)# T; h }5 M# |, P/ ]7 Z$ ?& k
struts-cart.xml(购物车模块配置文件)
4 R4 q% o* h' k/ i, Q% ], I2 Z! U. g9 P. Y2 A6 A
4)WebRoot文件结构
2 i6 F0 `( G( L3 t /user/* :用户管理的JSP
$ y9 X( _; y5 M" }4 _2 r g' N /cart/* :购物车的JSP
0 X( `1 B4 `8 T- u X# P3 | /order/* :订单的JSP# L$ H+ K4 ? P* B! ?6 a- s8 L
/main/* :产品浏览的JSP
1 g) X# ^2 @5 A0 F /common/* :页眉、页脚等共同JSP
0 u8 k5 F" E1 Z /js/* : 放置js脚本文件 ?" U: X: J/ i! P7 B. I8 Q
/css/* :放置css样式文件
0 C0 f8 y8 b8 q; _1 T /images/* :放置页面图片文件- A/ h4 N- X* ]& b! G% A
/productImages/* :放置产品图片
; h1 s' U( U) {. h$ c6 E3 t
4 Y! J* j. D8 u2 i-----------------连接池的优点-----------------3 Z; |3 Z& `: W; G, T: |
a.可以管理Connection对象,并且将Connection数量控制在一个安全范围内。提高数据库的访问安全性。9 W% A+ \2 [. H4 O8 S
b.连接池中的Connection对象与数据库保持连接状态,避免频繁的建立和销毁连接。
/ E0 Q( I* I/ v" J4 r
/ L- H! a$ [8 r! I( j: a& i! n============用户管理模块==============1 J- j6 g# l& W* y' X
1.注册需求" b n% D* Z' w; C6 W
1)表单验证(采用js+Ajax)5 h7 {2 B4 Q4 f0 V( C- Y4 W6 S* B/ m
邮箱:非空、格式、唯一性(ajax)
6 [2 F2 t7 v" h; R: h8 C2 w9 v1 O0 q' [ 昵称:非空、格式/ g) K2 q9 l! L0 L
密码:非空、格式( |3 F( u" N/ J) ]' O8 R
确认密码:非空、与密码一致3 a# S4 H, V8 l, V. O( x; |0 U: A
验证码:非空、正确性(ajax)1 Y, p! L( R- r3 l) O- |
$ Q# ^: [8 u5 d9 P+ v+ v
2)将表单信息写入数据表d_user2 X$ q( j, A; {; B1 g8 p. ]
编写实体类、DAO、Action7 R/ W$ [ E! ~) g. T/ i
3)给用户邮箱发送验证码4 q7 G+ W5 O2 E
引入commons-email.jar,email.jar
7 ^- c) D! h$ c- t. i 参考EmailUtil工具类代码) C7 n" p1 d4 Q
4)进入邮箱验证页面verify_form.jsp
* U, v/ [( d0 f q$ e9 z& [% [: z! V/ B9 y. R/ k
2.邮箱验证
+ u% ^( T% k$ N 1)表单验证2 x9 v& G9 ]/ L2 z. I+ d! N' h5 C
验证码:非空、正确性(ajax)1 f9 E0 F9 m9 Z
正确后跳转到成功提示界面:window.location = "register_ok.jsp";
7 s S' d; B( u/ T5 P$ O9 t0 H 2)Action逻辑
2 x" L" U3 O. F1 B, i a.利用验证码去d_user检查
/ V! U0 T6 X2 ?% X/ N- O1 d W b.如果正确,将d_user的is_email_verify字段更新成Y;不正确在verify_form.jsp提示“验证失败”+ t* b' o. a' w8 T0 K* D( H
c.跳转到register_ok.jsp" D! q! y# l5 j7 h8 t( |
3.用户登录
3 ^. e5 S8 A8 G+ k 1)表单验证
. L* _) l5 A9 \1 f 邮箱:非空、格式( a8 D% F. c8 z
密码:非空- G3 s- O0 `1 ?- d
2)Action逻辑0 j4 V, j7 h6 @9 n' z, m, e9 \
a.检测Email和密码是否正确,失败回到login_form.jsp提示
$ q- H7 U& A: N# e( [$ S b.检测is_email_verify邮箱是否通过验证,未通过进入verify_form.jsp: | y; s h Z( \5 ?
c.更新最后一次登录时间last_login_time和IP地址last_login_ip。
0 |# @# ^ }8 r2 r) F d.将用户信息放入session。. N# g3 i6 m. d) C' q# i- O3 a' C% I
e.都正确进入/main/main.jsp& m; i3 r1 V$ r, \5 G
4.main.jsp页面的页眉部分,显示用户是否登录的状态8 _* i8 L$ t5 _7 J, n) i
如果用户已登录,显示"欢迎XXX,【登出】"
* O" g( `; x% K( X" C3 C1 s9 W 如果用户未登录,显示"【登录】【注册】"
4 }" R! x) R. l! D6 [, j% L* F4 j' N( z" ~& B' J0 r1 f" o
数据库 模型
) ~6 ?$ w5 t U/ Q6 V# ]3 V
' e" z4 R3 v6 ]# k) M0 n; J: z* C( |- J7 K3 d' ?' y/ K8 @8 f
效果演示图:
$ u `" r7 e- r: M首页演示图:
- n+ Z. l8 _# M, H/ l
! Q) U* ]8 O" }8 T7 D
5 @% q& p2 V: @% }) n
注册页面:. L# P/ J" k6 E' \1 Y
) w) p3 v j& M" s邮箱验证页面:
/ h% L: e) v0 s" [! s/ F
1 G& o2 \$ L: k/ n9 }$ c% _* s( G
验证成功:; b" g1 K" H; V. f3 I6 H
- Q& g. @7 R( R+ p7 ?
用户在线状态:/ g h0 v6 g' q
' t4 S4 q3 |' o4 h) e' F; O
用户可以购物了:
8 x$ A4 B. W# K
# Z+ }9 W- F! Q! [0 \" m* B$ r+ _) \/ J+ s( C9 q- a) T. A* p/ [. x. A
源码下载地址:点击下载
2 f* ]% x8 }3 S
1 p2 z8 ~& \* H8 `* X/ k; m9 q" c4 t3 S* r/ u0 k
数据库下载地址:点击下载* u* S1 G, A( z7 g/ C [5 a1 u7 n8 j
8 r! i0 C$ \5 w& `) V) f, v$ d& O
|
|