TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
1.项目介绍4 O: n" ^1 o- n8 Q3 N4 p
典型电子商务系统(在线购物平台)。模拟了当当系统部分功能。 p( {0 o4 L9 v8 O/ Z& y0 D9 N
2.功能需求
+ e: Q6 g. A: y& C 1)用户管理模块(3天)user, j2 l* c/ Q8 t7 D" E2 m
实现登录、注册功能) D, U3 q/ M+ m
2)产品浏览模块(2天)main
+ |! V& Y3 X" [; r6 ^9 l/ @ 实现主界面和类别浏览功能1 x4 j, e# o$ \, t( {& R; c, S/ r
3)购物车模块(1.5天)cart
: j5 F! s, N7 A# p 实现购买、变更数量、删除等功能+ w( X3 [$ W: q
4)生成订单模块(1.5天)order
) J) F/ U+ m$ L m& ? 订单确认、填写送货地址、生成订单功能" V6 k. H2 l4 ~) n+ J- j# F
3.技术应用& y8 G1 V7 @' o% T/ S
1)技术架构$ p1 o2 w" f8 r t
struts2,JDBC(连接池),jQuery,Ajax4 P/ t K5 w- I& x6 v# g8 i
2)设计思想; s9 C- |1 h0 |5 ?
MVC和分层设计思想; u# Q" w# ~ `. b& B8 c8 @
a.显示层:JSP组件(jQuery,Ajax)& T* U& x$ h3 g% s0 Y8 @7 m8 d# K4 D
b.控制层:Struts2控制器组件、Action组件! W8 y4 u9 A7 @8 b
c.业务层:Bean组件2 s' ^! ]" d6 m" a3 {* S5 ^% v
d.数据访问层:DAO组件(JDBC)
0 {0 M: W/ P; v7 @ D
# U5 x0 X! ?9 I$ w4.数据库设计, p. l" d R' a1 {3 }
1)数据库导入
z& J5 m$ b6 n; x create database dangdang; //创建库$ X' s7 j7 l8 M7 d. E
use dangdang; //进入dangdang库
2 y- @4 O: z5 ?& I; I' @ set names utf8; //设置连接和发送SQL编码. d# N$ N( r8 @( r" W2 u7 `
source 路径/dangdang.sql; //导入sql文件
2 r2 q1 c3 N+ |7 u 2)数据表功能
% x. n1 q0 l/ L; M+ Z- a, | a.d_user(用户信息表)
% ~, D6 `+ M0 E; _ ?. Z% ]3 Y 存储了用户信息,涉及登录和注册功能
5 o) f- ?- Q+ O b.d_receive_address(收货地址信息表)1 ~* h$ @0 s5 E0 |2 _) q: i9 [
存储了收货地址信息,涉及填写送货地址功能3 t+ ~4 l# x; }2 J8 C
c.d_category(类别信息表)
, N) j) g. m3 B$ I& T0 E6 C 存储了图书的类别信息,涉及主界面左侧类别菜单功能, m- {0 X. W! a0 G Z
d.d_book(图书信息表)
) S* ^. J/ R0 v. c/ a7 m5 \ 存储了图书的特有信息,涉及产品浏览等功能$ G0 e' }% r- ^* D* y
e.d_product(产品信息表)7 B" }1 `0 d3 f
存储了各类型产品的共通信息字段。
2 X: t7 K6 U& `( M f.d_category_product(类别和产品对应关系表)
6 c8 E8 z- T s$ R8 y9 p) Y( g 存储了类别和产品之间包含关系,涉及产品浏览功能" l; D" A0 ], j. d: s* X
g. d_order(订单信息表)- C5 v, R. Y9 c
存储了订单信息,涉及创建订单功能; f d0 ] M+ c/ N! |! a
h. d_item(订单明细表)
: E, h6 [/ ^) o+ o 存储了订单中所购买的商品信息,涉及创建订单功能。
4 b" C# K y- `: m6 C4 b$ `6 K. L; X. J3 q) Z$ x! l
5. 搭建工程结构
6 r+ h# N4 n: m 1)引入需要的开发包0 R+ U; c4 v- |% G
struts2开发包
) c7 Q# I7 |0 w jdbc开发包, r, B6 v: Y( k: h; T4 q' v
dbcp连接池开发包1 ?8 F; F5 @% ]5 S' w6 E! p7 h
2)src文件结构. `; o: y8 \9 }5 q3 G- ?
org.tarena.dang.action :控制层+ U* o" D) t4 {* o
org.tarena.dang.action.user :用户模块的action
* s& K9 J' t {2 r5 y& z org.tarena.dang.action.main :产品浏览的action
" B5 E: P0 \ }0 g org.tarena.dang.action.order :订单的action
% t# J K, a6 F( C: I org.tarena.dang.action.cart :购物车的action5 o, m1 @/ j' }) I( v/ ~2 Y# R
org.tarena.dang.service :业务层
) D) B0 D6 n/ K% F+ d org.tarena.dang.dao :数据访问层7 y0 J: f7 M) @1 ^
org.tarena.dang.entity :实体类7 g7 p' {& Y/ O( ~6 b) J* Y& L$ g* D
org.tarena.dang.util :工具类 d/ J0 k1 R5 V) i
org.tarena.dang.interceptor :拦截器2 m# d5 [7 i5 ^! K5 Z
3)struts配置文件结构
* D# o; R( D W8 }0 j web.xml(配置Filter控制器)
6 L D* p5 O5 \. k! Y struts.xml (struts主配置文件)
3 X( `, F5 }5 L2 J. ? struts-user.xml(用户模块配置文件)4 M. Q: }, {! ^6 u) U
struts-main.xml(浏览模块配置文件)
9 l2 J8 C& L" ]" k struts-order.xml(订单模块配置文件)
' U& s m1 R8 }( U4 ~ struts-cart.xml(购物车模块配置文件)# G; X7 V3 \& @7 k/ v
9 l0 a% f! v5 x z 4)WebRoot文件结构" f# j* e) A( ?/ `5 I) L$ S$ q
/user/* :用户管理的JSP
9 R- c0 _. b( G+ N0 Z w /cart/* :购物车的JSP
3 T; Y1 k4 K" V2 q /order/* :订单的JSP
/ w" [% s1 L0 G4 T8 N- G/ L, Q' C* j2 \ /main/* :产品浏览的JSP
* \: f) N; E& K$ P /common/* :页眉、页脚等共同JSP1 h2 L5 {# K7 ^4 e& C v' W
/js/* : 放置js脚本文件
' w& g: S8 q+ s2 i, Q# G: I- _ /css/* :放置css样式文件, r. w0 R- v* z$ R! K
/images/* :放置页面图片文件
' A" m& V% o5 @0 @2 x7 M( W /productImages/* :放置产品图片
* Q: O$ y& m& O) d$ m- n0 r3 t& X. D( ]
-----------------连接池的优点-----------------
. _" f" r5 N! g- ~% s7 b$ Ta.可以管理Connection对象,并且将Connection数量控制在一个安全范围内。提高数据库的访问安全性。; s# D9 D$ k4 @. E+ V5 e" S
b.连接池中的Connection对象与数据库保持连接状态,避免频繁的建立和销毁连接。: L/ U" I! _+ R G7 b
- b& A, L6 G* E( s( N" \
============用户管理模块==============! B! F/ I+ C) J) L5 S8 u
1.注册需求# Y$ C8 i5 e6 p+ Q
1)表单验证(采用js+Ajax)
$ k. }9 Q- e7 t0 ?; X, r3 A( q 邮箱:非空、格式、唯一性(ajax)4 K! i7 l; p, m0 Z. r5 |) H
昵称:非空、格式7 ~- ]5 u4 T" m0 ?$ ?/ g" y
密码:非空、格式, t8 Z8 |6 Q" ~. N# w
确认密码:非空、与密码一致
) W ^! V0 j; ^- u7 l 验证码:非空、正确性(ajax)& f$ r9 r& o; v* U0 O# V+ l
$ `5 R- k9 N5 @7 z- Z H/ j 2)将表单信息写入数据表d_user
2 y& o: _: P$ N! b2 @) Q8 s 编写实体类、DAO、Action
7 w7 u2 O7 C3 m- r5 _' v 3)给用户邮箱发送验证码
% g) o# [- @ H 引入commons-email.jar,email.jar$ Y' k% j9 \. T! o
参考EmailUtil工具类代码
- p) H$ i0 K, o 4)进入邮箱验证页面verify_form.jsp/ q7 O* A \% B
8 n+ B/ B# b0 Z3 B2.邮箱验证
& A) R3 g2 \; y) b+ J. v 1)表单验证
- T2 r9 Z% |0 n" v% w 验证码:非空、正确性(ajax)7 E6 b' T" q& a1 A7 |. z
正确后跳转到成功提示界面:window.location = "register_ok.jsp";8 @% q) _0 Q$ f( Y e8 Y7 i
2)Action逻辑/ Z. _& e; ? F2 }4 Y& p
a.利用验证码去d_user检查7 G O! {2 G, p9 r8 n1 f: \. V6 Y
b.如果正确,将d_user的is_email_verify字段更新成Y;不正确在verify_form.jsp提示“验证失败”
4 B& @' h( ]/ O8 q5 h0 a c.跳转到register_ok.jsp
+ z3 ~' s5 c3 {5 h9 W4 B% [/ \) d" `: _3.用户登录
' w1 T& O2 R; w$ Q5 k! O 1)表单验证
8 N: x4 V+ w) t5 B p 邮箱:非空、格式# ^6 G! F6 F" F. i4 J0 o7 Q
密码:非空- ~$ U& s. w& J' a# R x
2)Action逻辑
3 g+ T" Z; [: N7 K8 p. D8 l a.检测Email和密码是否正确,失败回到login_form.jsp提示% o* h% h* v' |9 P! a& a# B
b.检测is_email_verify邮箱是否通过验证,未通过进入verify_form.jsp1 J' _# I/ j7 p/ M, W( Z
c.更新最后一次登录时间last_login_time和IP地址last_login_ip。
" x1 }: L% l2 s$ m4 V6 |# W9 A d.将用户信息放入session。* u S1 ]( Y7 o; W
e.都正确进入/main/main.jsp
$ z2 J: q9 `7 \" }8 Z, i5 C4.main.jsp页面的页眉部分,显示用户是否登录的状态2 D6 G) I9 Y4 N
如果用户已登录,显示"欢迎XXX,【登出】"( b ]- X; R- X$ [* K5 g
如果用户未登录,显示"【登录】【注册】"
# A. v# H$ a; q2 O( z9 K: Q1 p
" f( T& ?" B6 j数据库 模型 % J8 p8 {6 L+ e$ H
) G+ a/ e4 K% v" Y2 [
3 @* l* w+ ? G* O3 ?效果演示图:
# `0 K$ V9 K% i' a- I7 z9 a& ^首页演示图:0 f* B0 _) O% N1 R C9 r- Q
/ e% m3 n9 R1 S& ~7 c
3 _5 \& ~( h$ j; H
注册页面:
% E# O! T1 A- ?9 \
2 E+ z+ v! ]1 {, _邮箱验证页面:
- N% C6 X7 k. R) _- e' r# ]6 a
' x* P. B k) g: H验证成功:
. p9 D) S: ]' ^
2 ~% m% E3 I" T% A0 J" O( V: \
用户在线状态:8 p, B) M; a& y5 \% l1 g$ v5 Y6 k
2 R' L8 d; Y& q+ W* @用户可以购物了:
* O/ }9 p9 ]4 E5 I
! C! S7 X' m, O7 \/ G5 u$ `! E
! N: k+ V1 }7 H6 L6 T% |3 Y源码下载地址:点击下载
' H$ V* ^1 I8 q5 Q% c! ~
' M" ?: t( w W# R/ |1 z, ^; A1 @) L2 ?& J
数据库下载地址:点击下载
5 a2 K7 A8 W1 g
9 l3 ~, d3 |6 h6 d$ f9 J# |" s1 z8 G; L |
|