TA的每日心情 | 衰 2021-2-2 11:21 |
|---|
签到天数: 36 天 [LV.5]常住居民I
|
1.项目介绍
' |" e) i( b# I, r 典型电子商务系统(在线购物平台)。模拟了当当系统部分功能。
9 m7 `1 G( w* W3 d. K2.功能需求$ O- b% q- n, y5 M; Q
1)用户管理模块(3天)user
H6 _+ a" J3 r1 p f0 U 实现登录、注册功能
* `7 o) {- P6 T: y* j- V 2)产品浏览模块(2天)main
8 S" l" F2 @. S# N* k 实现主界面和类别浏览功能
9 K; Q9 u ]0 E8 b+ A 3)购物车模块(1.5天)cart
, l4 s2 m; ~ U% z2 H7 w 实现购买、变更数量、删除等功能
. O' Z3 f9 D+ k/ B: a' E 4)生成订单模块(1.5天)order) }; |% d8 k2 _0 w
订单确认、填写送货地址、生成订单功能* S+ `5 v" @) c) W: y4 X' ~
3.技术应用+ N8 G! |7 b# S# ^
1)技术架构, x- U. |. Y4 ]5 j) Y$ h* ?
struts2,JDBC(连接池),jQuery,Ajax
1 h! T4 R1 ]+ Z9 S& S0 _' E 2)设计思想! W" g- h, c x1 R9 C
MVC和分层设计思想8 x, Q+ F$ v* d+ x/ b' e
a.显示层:JSP组件(jQuery,Ajax)
- S8 H5 }# C3 M; Z) W, T( G b.控制层:Struts2控制器组件、Action组件% Z" G/ W- f9 W4 v) p' M4 S5 U" A
c.业务层:Bean组件
$ w5 R4 w. `" e3 f0 u! i. z' n d.数据访问层:DAO组件(JDBC)4 U+ G) x# a, p5 ~+ y4 Q1 [+ x! H
4 k: q$ X# w a: W: \& a
4.数据库设计
; R$ R1 v: K6 ]; F' M( n 1)数据库导入
9 f# I+ L3 N: @3 A create database dangdang; //创建库
. H) S$ Y: J" @9 H/ P: C) g7 ` use dangdang; //进入dangdang库
% G" J# u! q& k set names utf8; //设置连接和发送SQL编码
* X8 d* D( ]2 l. u source 路径/dangdang.sql; //导入sql文件3 R8 @ C/ J3 n5 o+ l
2)数据表功能% b2 W* V7 x9 y" ^; Z
a.d_user(用户信息表)0 v& v' Y# P6 `& }, y( ?
存储了用户信息,涉及登录和注册功能
' x# G( N6 N* A8 X b.d_receive_address(收货地址信息表)
7 g0 @7 w' ~/ T, h) ^% w' F" l 存储了收货地址信息,涉及填写送货地址功能
4 I0 q* i$ a2 J; S! m& i) y c.d_category(类别信息表)
, m$ @$ o- x, d. y 存储了图书的类别信息,涉及主界面左侧类别菜单功能
# |/ J/ d+ h/ w- ^- E l; |0 i h; Z. B d.d_book(图书信息表)' l, T0 Z# e" ^4 g9 v
存储了图书的特有信息,涉及产品浏览等功能9 ] t/ Y5 h, b0 Y5 l
e.d_product(产品信息表)8 m& R" n: i3 Z5 M) j; Q
存储了各类型产品的共通信息字段。4 o M7 p" d9 F v: c. \7 o/ k5 d0 J
f.d_category_product(类别和产品对应关系表)$ c. c( Z: `/ G
存储了类别和产品之间包含关系,涉及产品浏览功能
+ F8 _; {9 u7 L$ t/ a g. d_order(订单信息表), z8 O6 K. s1 t$ l9 k( U8 ~ O
存储了订单信息,涉及创建订单功能1 T! j6 a4 w8 \. F
h. d_item(订单明细表)
7 I. V6 }* @. [# _3 j7 ?: g 存储了订单中所购买的商品信息,涉及创建订单功能。
% I1 T, B; a2 |+ j( N( p
1 F+ k: M! Q1 M* V5 Y5. 搭建工程结构
( ]& X: U& l$ D 1)引入需要的开发包+ F, B, ~& E; n+ |( V
struts2开发包: A( g" k2 G6 p& [. B
jdbc开发包
! Z4 k$ g# ~; V- f% V dbcp连接池开发包
9 R6 E& K2 O8 L( _* l" l$ l; A 2)src文件结构4 W# P9 o6 w3 R) r L/ c
org.tarena.dang.action :控制层7 U( Z R4 F; n( Y5 p: `, W
org.tarena.dang.action.user :用户模块的action4 `* I$ k6 @: P# r1 r ^
org.tarena.dang.action.main :产品浏览的action0 v. x8 C) F/ |% g( V/ H. D3 F0 z
org.tarena.dang.action.order :订单的action
0 [& W0 {5 F& a0 B$ D; i7 v D org.tarena.dang.action.cart :购物车的action# W* n$ b" n, ]. ~
org.tarena.dang.service :业务层
: s; ~% ^+ I: d4 K0 V! h- A org.tarena.dang.dao :数据访问层
' O. a* O% A0 v7 Z+ D! g7 K- c org.tarena.dang.entity :实体类
: M2 C# P% b: H3 i* X0 v org.tarena.dang.util :工具类2 e" ?+ m# k6 }
org.tarena.dang.interceptor :拦截器* O! C3 o! v6 F: C7 ?% O
3)struts配置文件结构
) \: t# {& H. V3 u) @ web.xml(配置Filter控制器)* H1 T/ T$ H. {! `
struts.xml (struts主配置文件)2 m+ C9 o* T# m4 k" Z# G2 Y3 s0 c' c
struts-user.xml(用户模块配置文件)
" f3 o4 R: p6 l8 n" _+ x struts-main.xml(浏览模块配置文件)
8 A+ g8 H& l6 v) j: y struts-order.xml(订单模块配置文件)
7 ]$ a c7 F3 l" R5 c struts-cart.xml(购物车模块配置文件)- m% g# l* O b
, N; t2 m7 g6 p( _! R: I: j: l 4)WebRoot文件结构
; ]3 G2 S" l/ W- p /user/* :用户管理的JSP W: s$ [4 O2 F1 h7 V
/cart/* :购物车的JSP
' v: E2 a5 S3 |# L /order/* :订单的JSP! B" I* w) ~7 l! M# g9 R9 A! b
/main/* :产品浏览的JSP
, y, F) N. j( M5 N /common/* :页眉、页脚等共同JSP9 ?0 s9 C6 ^8 r2 P7 q9 t
/js/* : 放置js脚本文件
. \0 c( i' @; d/ |& | /css/* :放置css样式文件& _: V9 W! X0 @! f: \
/images/* :放置页面图片文件
2 f8 Z: m v$ j) t. C u% k /productImages/* :放置产品图片
. E" ?; O5 d7 s7 v- Q
- D+ i2 i r, V+ e+ Z' v" V-----------------连接池的优点-----------------
6 h- w4 P, h! J$ k( B _% O, wa.可以管理Connection对象,并且将Connection数量控制在一个安全范围内。提高数据库的访问安全性。( ?* G/ |: z j% f; P8 S& D3 o" d
b.连接池中的Connection对象与数据库保持连接状态,避免频繁的建立和销毁连接。' u' g) X) w) F& `. s1 y+ j
1 E) ^/ B4 W0 O$ P; h============用户管理模块==============
% M! [9 b0 l# W5 b7 m$ a" s0 r1.注册需求
% N0 {5 Y. k& r4 g9 ] 1)表单验证(采用js+Ajax)# {0 Y+ j$ s) L& {3 m
邮箱:非空、格式、唯一性(ajax)2 ^9 s6 p, ]* Q
昵称:非空、格式. ^4 s* l% H1 H5 s
密码:非空、格式
( \3 X8 C3 d8 h2 n6 X; K4 r 确认密码:非空、与密码一致/ ?' g: _4 C. _% i( ]2 A' p: k
验证码:非空、正确性(ajax)% d6 F i6 d/ e' U# O5 ~
& o, Z# D3 d0 x2 u; g; K 2)将表单信息写入数据表d_user4 H4 t) p- e5 T
编写实体类、DAO、Action
4 q S( Z _# k 3)给用户邮箱发送验证码2 \+ d0 h4 {0 b4 W1 E8 R; \
引入commons-email.jar,email.jar
; m% g( g& j4 ?* f8 L 参考EmailUtil工具类代码
9 ^: V$ d9 y! A4 k* T9 S1 L 4)进入邮箱验证页面verify_form.jsp
: Z* N T4 |2 Q& v; d# \; W
" u4 v! O& j) ?4 M: v2.邮箱验证! O+ j7 L% f2 O
1)表单验证+ z2 M4 [) ^% {- K
验证码:非空、正确性(ajax)
5 r- F" `! I3 _1 U2 E4 z) o 正确后跳转到成功提示界面:window.location = "register_ok.jsp";+ \- N& W |3 a4 M& m! [. }4 [4 r5 U
2)Action逻辑
) M0 l Z0 E7 N a.利用验证码去d_user检查/ E0 n9 R' `+ q3 @& a% k
b.如果正确,将d_user的is_email_verify字段更新成Y;不正确在verify_form.jsp提示“验证失败”
. }9 A$ e1 b; W c.跳转到register_ok.jsp
8 R v( k( S0 G6 e5 _5 e$ ]! K3.用户登录 y1 B# k: H9 _; }! k& B
1)表单验证
& d$ O; N4 u1 Z& g5 t# `# M' L 邮箱:非空、格式/ `1 Y# Y# C9 s+ _" b) H4 Y
密码:非空$ Y+ g2 d) w( c/ j5 e
2)Action逻辑
, i. J! c* s$ I5 p1 B8 n a.检测Email和密码是否正确,失败回到login_form.jsp提示4 q" W1 t: R. V+ ?6 m
b.检测is_email_verify邮箱是否通过验证,未通过进入verify_form.jsp
. d8 x9 F; ^6 H7 P c.更新最后一次登录时间last_login_time和IP地址last_login_ip。; w E5 p; A. M# v* l
d.将用户信息放入session。# d7 \- n+ z+ a7 [2 X5 \3 ~8 o; p
e.都正确进入/main/main.jsp+ g( Y, W- D8 z" f4 x; \; b1 f t
4.main.jsp页面的页眉部分,显示用户是否登录的状态
* |8 a4 p9 G1 D9 @ 如果用户已登录,显示"欢迎XXX,【登出】"
4 x3 w3 O) s$ m2 S/ F 如果用户未登录,显示"【登录】【注册】"" o0 k2 f& }; L1 n0 b
" n4 N/ p B2 y" s: [2 f9 K数据库 模型 / L3 { T6 r( V" c; w& I
. H: I* r# ]9 @5 v; t9 {3 O* T/ [& H: C/ F% M6 Y2 Z: ^4 u
效果演示图:
3 f* G- h$ @( v& x5 K: G, k首页演示图:
4 @; Z8 n5 u7 O9 E. g( O
+ J) U" w8 G6 _1 M: }$ [9 P/ ?- o
$ l. y: E4 `/ S9 D注册页面:& h4 }9 t, l% ? ]' d
7 S* ~+ Z2 l' X: g, a* w邮箱验证页面:3 j( r! S2 [3 }* d0 S1 V% a
$ x7 j2 n' j+ [3 l: z/ v! l验证成功:
* v# [. l! r" {0 @4 _
) M( X- H; K3 D! _7 P+ L+ ^
用户在线状态:1 U. e4 V6 i& ?; t4 J& v: u1 h- g
! I3 Y* K2 I. X9 @( K
用户可以购物了:
! P& s+ D, H0 o. J5 l
+ |2 j: ~/ B" S
- N1 H& e( k/ O. d: x' H源码下载地址:点击下载
6 \! x: j9 ^2 Y
1 V8 [- z' E( D N) q& b; v1 t" |4 g @* Y- m
数据库下载地址:点击下载
* m1 [6 t( q6 D, E2 W' @1 ?# y- d/ O$ f) N7 b
|
|