TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
1.项目介绍2 ] F. K+ Z% c7 _0 \& D8 `/ D s
典型电子商务系统(在线购物平台)。模拟了当当系统部分功能。
/ R+ a D& g8 _; ` K2.功能需求
. e9 G- v9 v8 Y( h0 N! X& B 1)用户管理模块(3天)user
9 Q, Q7 x1 ~5 { 实现登录、注册功能
1 B5 E' j$ f7 X, Q( M 2)产品浏览模块(2天)main! ~5 a6 H+ k$ c9 O/ ?
实现主界面和类别浏览功能% \. F2 v5 w8 i, G
3)购物车模块(1.5天)cart
! D7 L7 K( p9 M& y 实现购买、变更数量、删除等功能" L0 H) G3 y6 @" |5 w7 c
4)生成订单模块(1.5天)order4 U; k9 a- F1 u* E/ c: i0 K
订单确认、填写送货地址、生成订单功能
: Y" Y% o9 c( ^; P$ I0 h. a9 [: x. g3.技术应用
/ G5 U) r( a! Z' B b 1)技术架构
! F, V2 K/ |8 ^0 K struts2,JDBC(连接池),jQuery,Ajax
0 I$ D6 s' F1 Q/ Z# v 2)设计思想& @4 J* |5 i& l
MVC和分层设计思想6 r# L- r4 y9 T: F
a.显示层:JSP组件(jQuery,Ajax)
) C" h# T: M6 @- U b.控制层:Struts2控制器组件、Action组件+ f5 O2 N4 k" Y( l/ W
c.业务层:Bean组件. S; x3 q- n0 K% e6 ~
d.数据访问层:DAO组件(JDBC), H4 U/ G( Z( @5 l
+ u: x% D$ ]! z* n
4.数据库设计
( _; Z, V9 o2 w 1)数据库导入
. x( S3 [0 {! V/ r, g create database dangdang; //创建库* u1 t0 O! s: T$ z
use dangdang; //进入dangdang库1 S- d6 H) r# ^/ I7 Q+ e: {
set names utf8; //设置连接和发送SQL编码# O1 [- x4 f: _/ e ^# D& }
source 路径/dangdang.sql; //导入sql文件
- l$ C: U6 N2 S+ I 2)数据表功能
! b# r3 K, d( s) C* c5 t6 Q a.d_user(用户信息表): c" ?- j: [3 ]" ~' }3 ^
存储了用户信息,涉及登录和注册功能
6 _' M$ o5 |7 i2 @! Z, d b.d_receive_address(收货地址信息表)/ q3 E" n) l* X9 Y4 `
存储了收货地址信息,涉及填写送货地址功能7 {! y$ w/ E& P$ L e, ~
c.d_category(类别信息表)
+ ?2 Q. x- ~/ G0 z# U) s$ i, s5 N+ c 存储了图书的类别信息,涉及主界面左侧类别菜单功能# Y- F2 \* V2 V
d.d_book(图书信息表)
; @( ]8 M/ x d5 Z% g# I 存储了图书的特有信息,涉及产品浏览等功能0 D, T( e+ p/ N
e.d_product(产品信息表)9 p( U1 j6 G* q: n, c! v
存储了各类型产品的共通信息字段。
, g1 k( g5 w" K8 `( \5 `( _ f.d_category_product(类别和产品对应关系表)) `( l! j, T P7 h V7 p) E: x$ ?
存储了类别和产品之间包含关系,涉及产品浏览功能
6 j9 K* b% w' s4 t9 [0 W; l g. d_order(订单信息表)/ S' Y. B2 u/ n+ i' n/ r( F
存储了订单信息,涉及创建订单功能* k( t6 }. N2 d- s) Q
h. d_item(订单明细表)5 ?' b) z+ @& P8 V, x6 w
存储了订单中所购买的商品信息,涉及创建订单功能。
; v5 ?- ~6 G: j) ~* Q& @' \/ v# X) M* n% |9 O7 j7 O! L
5. 搭建工程结构
- h, p# a& Z$ R3 V% D 1)引入需要的开发包& D! V) {2 A) K1 X3 J+ Z; [8 X
struts2开发包
0 d8 N3 S6 w; F% K jdbc开发包
% `. u \: z5 ]/ _. s7 |( V dbcp连接池开发包
% {; w; z9 s3 {0 G 2)src文件结构- A) V- l- `8 k' b; D% \8 R
org.tarena.dang.action :控制层
: ^& g3 G3 `4 Q! C* S4 |: x; i7 M org.tarena.dang.action.user :用户模块的action
$ D7 E/ G; U- d$ C9 p% j+ z" b org.tarena.dang.action.main :产品浏览的action
4 h+ P) C1 M9 o/ G org.tarena.dang.action.order :订单的action
) G2 M) e9 t5 `/ s& ^5 N org.tarena.dang.action.cart :购物车的action
- j: C1 X( y5 d6 M& L# D$ h& E org.tarena.dang.service :业务层, ]; q! M! P- O: b1 m# {
org.tarena.dang.dao :数据访问层* y( v1 G4 ?1 U2 `5 M, b9 P
org.tarena.dang.entity :实体类
* }5 H/ T+ {2 j! P/ `+ _ org.tarena.dang.util :工具类
& W% [# P: b( b& `& f3 g org.tarena.dang.interceptor :拦截器
- i+ M- |; {0 h% p' U 3)struts配置文件结构
$ a( G, b# n I7 k! E( L' R/ l web.xml(配置Filter控制器)' ^2 M" z& _0 c( G
struts.xml (struts主配置文件)0 D) X5 C+ M' @. u! p7 O- s W; S
struts-user.xml(用户模块配置文件)) e B: Q+ E# [( e; x
struts-main.xml(浏览模块配置文件)
8 C* a# n1 S& h% P3 t3 } struts-order.xml(订单模块配置文件)# g" c& I3 Q8 ]
struts-cart.xml(购物车模块配置文件)
. t& A) M' ?+ l( z
5 S& e% m$ Q2 p4 T1 @( I 4)WebRoot文件结构
) ~" g, A, v" h- u$ k! U+ W) ? /user/* :用户管理的JSP' L7 T" b& @0 s
/cart/* :购物车的JSP
, w6 b3 H$ P6 L5 F: h4 G1 M, [ E1 ? /order/* :订单的JSP
* c3 H; i3 c; M* U% }/ t /main/* :产品浏览的JSP
; h' B+ F. L+ }* ^ /common/* :页眉、页脚等共同JSP, }0 ^6 V; X, D0 [8 b1 n$ F: s
/js/* : 放置js脚本文件4 d m% u; \1 Q6 U8 _* ^& r
/css/* :放置css样式文件
- l( Z4 Q& h7 s: H /images/* :放置页面图片文件
' B: Z- T" x% ]& k /productImages/* :放置产品图片2 M! ^# }5 f5 D
* `& v, z* R1 }' U( Y
-----------------连接池的优点-----------------. g" i9 J: B! V6 n4 k
a.可以管理Connection对象,并且将Connection数量控制在一个安全范围内。提高数据库的访问安全性。1 |. x( s% F0 M2 ]3 V# F; I9 a+ C' ]
b.连接池中的Connection对象与数据库保持连接状态,避免频繁的建立和销毁连接。
$ t0 E5 Y& I) @" f9 r, L
/ c5 e, K6 _) x- v( y============用户管理模块==============
- w+ ?9 M2 J/ h1.注册需求4 t, ^1 E6 j5 S; M) m
1)表单验证(采用js+Ajax)
6 k9 P) l, _) Z) B2 f) u- v8 s 邮箱:非空、格式、唯一性(ajax)
, ?& E9 ^( C0 E, ?6 v 昵称:非空、格式$ M, U u3 ?" z& q1 S; @
密码:非空、格式8 Q* w' ?) L R; z8 s+ K& {; E
确认密码:非空、与密码一致$ r# y% {2 H( K3 j I8 f1 E
验证码:非空、正确性(ajax); L4 N- z9 y7 ^* K6 Y
' k. q' E) y2 n7 z o
2)将表单信息写入数据表d_user, n* B0 N% A1 ^
编写实体类、DAO、Action) y& Q, ~/ k' _, ~0 n! d
3)给用户邮箱发送验证码
$ v M# U [+ }3 f9 T- ~) c6 ~* t 引入commons-email.jar,email.jar
}- K7 R( V: T$ x% d- s/ r 参考EmailUtil工具类代码# w) d$ B& f* J6 V, o
4)进入邮箱验证页面verify_form.jsp2 J; O l9 \7 O$ t% b6 C8 @ b
# D( U* C. U7 I# I2.邮箱验证& |' p" j8 _- g' E
1)表单验证
( Z& {' [, U" _9 m% S 验证码:非空、正确性(ajax). o9 C" g$ k6 D! H- ?5 |. R
正确后跳转到成功提示界面:window.location = "register_ok.jsp";
Z) F" \1 k8 U, e3 g/ i 2)Action逻辑% d% W, g: t" R0 U& G
a.利用验证码去d_user检查- R6 N: B0 h+ @. ?0 v
b.如果正确,将d_user的is_email_verify字段更新成Y;不正确在verify_form.jsp提示“验证失败”
8 F5 L; F( |4 u( a8 x, [& T, n c.跳转到register_ok.jsp+ X U7 \7 ^: Z0 _
3.用户登录) x" Y$ ?# _, g) K
1)表单验证! R. \* {: J4 n" Z, E) Y6 N; W
邮箱:非空、格式
2 b. \' y, \% y, O: W4 [ 密码:非空
, x/ Q. b' i+ m) ?* U7 {+ V; m. N 2)Action逻辑7 V& F3 d+ f3 F9 g. b
a.检测Email和密码是否正确,失败回到login_form.jsp提示
% |' x6 \' _1 ` b.检测is_email_verify邮箱是否通过验证,未通过进入verify_form.jsp, _4 ~% G& C% `0 |% S
c.更新最后一次登录时间last_login_time和IP地址last_login_ip。& ~" k( _0 m; v7 e
d.将用户信息放入session。# V/ Y0 v0 A2 Y9 m. ~: o; L \
e.都正确进入/main/main.jsp
9 W1 ^* {( _9 x& x# x4.main.jsp页面的页眉部分,显示用户是否登录的状态' j8 c1 @; T' W: I
如果用户已登录,显示"欢迎XXX,【登出】"2 c. r# X8 [4 D" J+ o7 Z3 [% W {2 v
如果用户未登录,显示"【登录】【注册】"
7 N, ]: e% Q9 D2 ?2 G
+ { }) H% Q3 O) U& {+ p' u/ D- t数据库 模型 8 _3 U Y( V' ~2 A$ \! V
( J, _: ]* K. ?6 j
8 @: {# L5 Q* n V8 T
效果演示图:
: e* f/ ~5 Q* K6 t2 s$ {+ {首页演示图:
: P7 _0 T5 f8 m
8 |$ T/ V' v5 ~" ?! S8 n1 q, |5 @% ~
: b( u$ w4 H- g" X- M/ \4 U/ S注册页面:2 U% `- b! _9 A
! g, z v& d) h4 a: t2 ]邮箱验证页面:
( C- g- {" v& H" }6 D1 L
! }2 ? a' H2 c5 `2 z/ M验证成功:( B/ B5 B0 j) _/ V
1 M0 n9 M, u7 N, _( M# S- d
用户在线状态:
' `7 D3 P& U7 d& c* I
) X* B7 W8 k+ X% W2 ?用户可以购物了:2 C1 F- g" H. }- J
7 @- ?6 z0 I2 k* N* a
/ U# U9 ]# f9 G3 A" e源码下载地址:点击下载
! U+ `$ H, g, ^3 q! b) ]. X% v p1 D4 g* i' T! A- _. r5 l% k% [
. P( A# ?( \% U5 H8 F数据库下载地址:点击下载
& f }# H6 f& E( j" p
, s2 ~6 }. K( x2 n+ w& G. D( U |
|