TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
1.项目介绍, N& I+ Q; ?9 B6 @- u
典型电子商务系统(在线购物平台)。模拟了当当系统部分功能。3 \% y* q/ Q* Y8 Y- f/ {* x b' I
2.功能需求1 N3 K$ m. o2 m, }8 m1 C
1)用户管理模块(3天)user
9 _( R( j% \. n6 x y1 S 实现登录、注册功能8 I3 Q. p7 I0 v
2)产品浏览模块(2天)main
( k4 u, M4 t( Y; `2 L/ W) D3 q 实现主界面和类别浏览功能
2 p) M5 r0 h' s 3)购物车模块(1.5天)cart
, J/ ^" r0 x6 [" M6 }% J) m3 A 实现购买、变更数量、删除等功能
! E. q. b" e. s* O. z6 W( l 4)生成订单模块(1.5天)order
3 o* K+ s9 U2 O6 e3 J 订单确认、填写送货地址、生成订单功能) }: e: i$ k: c- ?4 d+ P
3.技术应用
2 S7 A/ J' q7 n1 \. ^( B/ U3 m$ \4 q/ \ 1)技术架构1 G2 P+ L B! j5 z
struts2,JDBC(连接池),jQuery,Ajax. C( z: E$ m; f& `* |2 B
2)设计思想
5 F' E1 T1 E; s4 v6 f' p) b MVC和分层设计思想2 a% y! I* P9 f; ~/ W4 z5 {% p
a.显示层:JSP组件(jQuery,Ajax)
+ a# o, M% D6 S' o b.控制层:Struts2控制器组件、Action组件: C6 u9 W! L6 p
c.业务层:Bean组件
+ o8 H; U5 z$ v U( d3 i/ _4 b* V# b, F d.数据访问层:DAO组件(JDBC)
) b3 r+ d9 `* q. g7 b/ Z( U- _9 F$ Y. T2 s& i
4.数据库设计
`* s; G1 Z! y% ?- \ 1)数据库导入
: o3 t6 Q$ j2 ], E7 X create database dangdang; //创建库
/ s) t' T! _8 f3 ?: j* |/ g use dangdang; //进入dangdang库
; C4 g2 j1 ?. L1 J set names utf8; //设置连接和发送SQL编码% X0 A& a4 e- a7 H% \" B5 [
source 路径/dangdang.sql; //导入sql文件5 r- U% K! }: z& u
2)数据表功能/ c0 b: s. j: D3 I* {; a+ Z1 o
a.d_user(用户信息表)
! O% S) T4 b/ l" |- i U8 `1 J 存储了用户信息,涉及登录和注册功能1 `7 d& t9 M" X& `: ~
b.d_receive_address(收货地址信息表)( O2 @3 r6 i g3 `+ D& G8 z' v) w
存储了收货地址信息,涉及填写送货地址功能/ N6 C% C# n1 B0 @5 U
c.d_category(类别信息表): \9 K) X/ A6 g/ E0 H5 @. Z G
存储了图书的类别信息,涉及主界面左侧类别菜单功能0 H1 h) p1 }, F, s
d.d_book(图书信息表)
7 H3 l' J4 w$ f* Q" P6 k7 S | 存储了图书的特有信息,涉及产品浏览等功能
' j c: f' X9 B B e.d_product(产品信息表)
' H- g. H' Z! I) o7 q0 y 存储了各类型产品的共通信息字段。( ?: x; ?8 s& X9 z
f.d_category_product(类别和产品对应关系表)
% f F2 B% K0 D. T, W5 G( I' Y 存储了类别和产品之间包含关系,涉及产品浏览功能9 n8 `( G; m0 Z6 M& R1 l
g. d_order(订单信息表)( L. h: P' a- U" s
存储了订单信息,涉及创建订单功能# G# B h3 A: p# p+ e e
h. d_item(订单明细表)" s2 M, q/ c7 J# a% e
存储了订单中所购买的商品信息,涉及创建订单功能。
' r& R' S9 T" K T+ e- ?6 R/ z6 Y' f# ]
5. 搭建工程结构8 T& C7 D3 M* ]$ A# i' C8 n, {
1)引入需要的开发包% Z0 v) U- a' e& R
struts2开发包+ R6 V0 j( I' [6 l0 g, `: V5 D$ Q
jdbc开发包
& W5 t0 m$ p1 z' V5 s% m dbcp连接池开发包) U4 d9 r% u- t- w
2)src文件结构
1 N! g h. c) ]9 |# Z& K" J3 f+ z org.tarena.dang.action :控制层
+ v, F# D, n a) ^1 d org.tarena.dang.action.user :用户模块的action
% A) j3 C6 F# \1 H org.tarena.dang.action.main :产品浏览的action/ O% T6 l, R# S* ? g% b
org.tarena.dang.action.order :订单的action6 ?' D V0 q. y) r
org.tarena.dang.action.cart :购物车的action' e! p1 V+ q# i/ g% B5 Y
org.tarena.dang.service :业务层+ H, Z( e- H0 M' t0 @
org.tarena.dang.dao :数据访问层
2 `* {! G+ a: |6 ~3 r* x! Q% V org.tarena.dang.entity :实体类
. V- Q& s# r# l' O9 ]: O; ?% y. ?8 K org.tarena.dang.util :工具类
! v6 l- _/ @& K& K0 U# C. K org.tarena.dang.interceptor :拦截器
% F- s; k, z. Z6 E" _" ^ 3)struts配置文件结构
" Q9 S6 @/ ]# O0 g web.xml(配置Filter控制器)
5 h& ^/ c$ b7 m9 Y struts.xml (struts主配置文件)7 Y7 P2 o, ^6 k$ Y
struts-user.xml(用户模块配置文件)
! G L' X7 P, n struts-main.xml(浏览模块配置文件)7 a) q) A& V' A" c" n' A/ L
struts-order.xml(订单模块配置文件)+ g3 G+ |6 T- U0 o
struts-cart.xml(购物车模块配置文件) }: f9 q2 l" Z0 z, d4 f# m
4 Y/ F. f7 K2 E, U 4)WebRoot文件结构
2 v0 x3 J+ A Z /user/* :用户管理的JSP
) e; t; P! \' A0 o" [ x$ ~ /cart/* :购物车的JSP
2 m! w) L7 P5 g* L8 Z) \9 p! N v& w /order/* :订单的JSP( ~) B9 V4 A) l( n
/main/* :产品浏览的JSP" N! X8 j: \9 D- u5 ]% {
/common/* :页眉、页脚等共同JSP9 e4 H6 b) U2 F. D& S" u
/js/* : 放置js脚本文件* g) _ ?4 p U9 F; y
/css/* :放置css样式文件2 {; ^$ F- i1 T' t3 x
/images/* :放置页面图片文件
( ^* P9 r. F1 K: ~% X& h /productImages/* :放置产品图片
- v/ t6 ~( ~# x$ u' Z* b
, A) `5 F( i5 x V4 t/ g3 H2 B-----------------连接池的优点-----------------# U b- G; z1 h0 k* ^
a.可以管理Connection对象,并且将Connection数量控制在一个安全范围内。提高数据库的访问安全性。2 d4 @* A- V& ^5 }/ i8 M
b.连接池中的Connection对象与数据库保持连接状态,避免频繁的建立和销毁连接。
( x/ |: o; k/ _2 k7 z8 y
0 X" t4 L; w W============用户管理模块==============
( h# t& j8 Z4 Q% _1.注册需求0 Q R9 r: i' [8 Q8 c, l$ d$ ]5 G c
1)表单验证(采用js+Ajax); x) b, N7 j! q+ K4 z
邮箱:非空、格式、唯一性(ajax)
9 U: z% d" c2 G7 W% B7 g" x. S. l 昵称:非空、格式- v0 ]; c: I$ p) _ K: a
密码:非空、格式+ A; x+ n2 ^$ ]* R& U+ w4 ]
确认密码:非空、与密码一致% |, h4 w8 m w5 I: }1 ^0 J) n+ {
验证码:非空、正确性(ajax), p; { I4 E [2 o5 ~6 X% l
6 H, U2 g% Z% C8 r& _" W j
2)将表单信息写入数据表d_user# @& \- a2 Y! u; `) D
编写实体类、DAO、Action6 X5 P9 r K4 z) x, c' C. q
3)给用户邮箱发送验证码
& @+ F( U$ z9 q% u( [- p- ~+ ^ 引入commons-email.jar,email.jar
5 ^: G8 y+ Z4 A+ g& o 参考EmailUtil工具类代码
t e: O4 @, r3 m7 } 4)进入邮箱验证页面verify_form.jsp
z8 t+ \) V1 x" X5 p1 `) c7 r/ {% a' v5 W# R4 E0 O+ p
2.邮箱验证5 ~. J8 @: t, d( f/ r" l
1)表单验证# V$ Z/ p# U* t" [ ~, Q" L
验证码:非空、正确性(ajax)
$ ^4 |* h% }! Q) q) Y 正确后跳转到成功提示界面:window.location = "register_ok.jsp";! W' O, Y: }' W- e7 K6 S# l
2)Action逻辑( P4 b, {, J: r' `1 o5 p5 ~9 r
a.利用验证码去d_user检查6 i- Z8 E5 ]; ]+ \7 p1 n6 ]
b.如果正确,将d_user的is_email_verify字段更新成Y;不正确在verify_form.jsp提示“验证失败”! |& q, o7 ?- R1 |
c.跳转到register_ok.jsp
; Q& ~$ j. G2 c3.用户登录; h9 L1 E6 A! d, y0 p" m4 \
1)表单验证. r) A% d/ W* k
邮箱:非空、格式
! t$ j9 j: e7 }1 R; ]& j 密码:非空% z5 A3 l$ I' L) ^/ R( \" Q! I
2)Action逻辑6 T c$ I! N7 @) T
a.检测Email和密码是否正确,失败回到login_form.jsp提示3 w: M- `8 |8 X6 P& @, M/ z0 Y8 q
b.检测is_email_verify邮箱是否通过验证,未通过进入verify_form.jsp6 k6 `4 v& h& a: m
c.更新最后一次登录时间last_login_time和IP地址last_login_ip。; u# I5 Q# P5 \; F: Z. {0 j% j
d.将用户信息放入session。( ?: p, U$ M1 ]! \, u: d2 ^
e.都正确进入/main/main.jsp2 t: }* s9 v2 X0 Y8 G/ u8 |! q# x
4.main.jsp页面的页眉部分,显示用户是否登录的状态
( }: k+ A6 p$ _ 如果用户已登录,显示"欢迎XXX,【登出】"2 g5 a' V5 q+ I+ ~
如果用户未登录,显示"【登录】【注册】"1 H5 [; p) @; t: C; K$ m! j/ o
/ Z* M, i+ M d8 @3 e, R* [数据库 模型
- P6 y, {: N& R$ b' Z; H; e
! k; O4 \6 W. N1 {3 f' Y' E0 Y0 f# Y
效果演示图:7 s+ c! a/ b- F! y2 l3 M9 V
首页演示图:
. \ P% r/ h. N: L! E
/ O' ` o4 n2 `% Z/ C, P
: o d) R. _7 J2 }5 h
注册页面:
% T2 c* H9 r/ C/ f& w" ]! C) e8 ^+ r- n
; |( c- [# X% l9 Q
邮箱验证页面:' e' a9 J+ ]/ A7 d7 i4 d4 q
; {- S0 L& h1 [& ]0 \验证成功:
. I* ]# B4 R5 e& b" R
7 U$ s/ t7 ?1 C( E. C/ e
用户在线状态:' x7 m' P; b8 Z7 i% Q
A/ {4 T, U) n h0 m2 f
用户可以购物了:
- {/ h; I7 H: e6 L- ~$ G* L
, ^' n( [5 ?9 r* {4 }. W
6 t1 L# e& G5 x% J9 M/ ^源码下载地址:点击下载6 R& l% d4 B# @
0 y, F* x. u9 Q7 a/ |0 x1 H( }' c+ H1 E2 m3 J7 U
数据库下载地址:点击下载
/ A: z; @$ e% m$ Z. Y# [9 L/ T1 f4 w4 }" i# S n4 M' M0 L
|
|