TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
1.项目介绍
# I, ~5 m& \. B) L0 R: W" X 典型电子商务系统(在线购物平台)。模拟了当当系统部分功能。/ v% T0 ^- _% s! O% W
2.功能需求9 {% i; l. U8 [& S
1)用户管理模块(3天)user
& C. `( G4 b% I4 A' N v% _ 实现登录、注册功能
7 {8 a- L) f# T0 ?* n2 ]0 r 2)产品浏览模块(2天)main
9 Z) J7 t+ }2 R, C) [ 实现主界面和类别浏览功能9 S# h# i0 W; |* I6 B8 f# G1 v. G. N" H
3)购物车模块(1.5天)cart
9 o- K" ?$ ^: l 实现购买、变更数量、删除等功能6 Y8 _/ U! r, [
4)生成订单模块(1.5天)order
4 l0 Q( J+ C: W( O$ l 订单确认、填写送货地址、生成订单功能+ i7 v8 n/ b9 L6 v; d& f6 ^
3.技术应用
1 p* I: J1 N; ? 1)技术架构
$ z0 D; O. C: _5 o7 U9 C, @) D5 } struts2,JDBC(连接池),jQuery,Ajax' h2 J# Z5 C0 ~9 ^' z
2)设计思想/ X% E; J G! g; F8 N0 s, {4 G1 p" I
MVC和分层设计思想# n" B1 @& Y0 x. E; o( Z* I
a.显示层:JSP组件(jQuery,Ajax)+ o1 c* k( c K6 P+ j% c' U, p {3 s
b.控制层:Struts2控制器组件、Action组件
$ E( W( _7 O6 M c.业务层:Bean组件
0 e% R/ A. m) r# ^8 }0 s3 r7 g) n d.数据访问层:DAO组件(JDBC)
7 Z; e% L$ L( K$ ?5 l8 k4 d( B* T. d( y) y: `1 j2 c
4.数据库设计
; [' {$ u3 p( N. \* O2 e 1)数据库导入2 a' |& ^6 G5 I0 b/ R
create database dangdang; //创建库
0 p2 Z# }) G& `9 ? use dangdang; //进入dangdang库
+ w4 C$ H4 E/ \3 a set names utf8; //设置连接和发送SQL编码
( Z+ I5 b# u" J3 `% F( n) f- Q! u& F source 路径/dangdang.sql; //导入sql文件% o. R* m3 _( U4 J
2)数据表功能
5 o; Q# P7 T. S a.d_user(用户信息表)# J/ h; S6 E. G0 z4 A0 I( @
存储了用户信息,涉及登录和注册功能
2 U0 c; V- s+ R- q- _ b.d_receive_address(收货地址信息表)3 u$ d4 Q6 z0 M+ m2 r
存储了收货地址信息,涉及填写送货地址功能
1 ~6 S" o* W' N7 J% y- G7 h: T( ^0 P4 b c.d_category(类别信息表)
/ o, H6 z. K1 d( C) r# _0 W 存储了图书的类别信息,涉及主界面左侧类别菜单功能
( s! e/ A$ m \ d.d_book(图书信息表)
4 n' U) Z+ q* e9 U8 }% ] 存储了图书的特有信息,涉及产品浏览等功能+ L2 `# B) R) a
e.d_product(产品信息表)
4 e( I. s3 E$ _" \* t. v- A 存储了各类型产品的共通信息字段。. S( w1 W }) @% G2 K
f.d_category_product(类别和产品对应关系表)9 _- E9 K3 U# a. C$ C8 M
存储了类别和产品之间包含关系,涉及产品浏览功能
0 x2 N$ x6 p3 O% H8 P" M g. d_order(订单信息表)
" ~" y5 U6 A( [- I- K: N0 j6 T* J 存储了订单信息,涉及创建订单功能
4 G- I7 T+ `8 G h. d_item(订单明细表)+ \% x2 Y! o0 m
存储了订单中所购买的商品信息,涉及创建订单功能。
u7 [/ v0 r& V" F; t" K8 H
8 F5 m: u) I0 K/ Q+ l5. 搭建工程结构
! x( X% L6 v& H$ F% I+ d 1)引入需要的开发包# Z" T3 S" L3 n* `1 L6 k) p2 Q1 P! ]
struts2开发包1 w8 h; x$ ~6 [
jdbc开发包
7 m T5 P" N& Z7 X* K dbcp连接池开发包
+ E; x8 `- ~6 P8 |+ i3 f 2)src文件结构 ?0 y9 [- [3 j& @( z4 U' P
org.tarena.dang.action :控制层, t! T( g9 m" s
org.tarena.dang.action.user :用户模块的action
+ ?( g; j( F* p g org.tarena.dang.action.main :产品浏览的action
0 V' f; ] N( c. T6 N3 @! r0 c+ Q org.tarena.dang.action.order :订单的action
& M) V1 A( U/ P& `, ? org.tarena.dang.action.cart :购物车的action2 M Q6 }" M( z7 R9 K6 Q
org.tarena.dang.service :业务层
' ~2 z; R6 x) e d org.tarena.dang.dao :数据访问层! P$ R; W0 y& z; I! n$ ]2 y
org.tarena.dang.entity :实体类, Q) r8 h9 \- \# m- K b
org.tarena.dang.util :工具类
, A0 C- g, ^( f$ c org.tarena.dang.interceptor :拦截器
# i6 J# V. n2 h) m3 P* K1 e/ f 3)struts配置文件结构/ o; Y5 B) l! w% a2 t9 w
web.xml(配置Filter控制器)
* c5 Z' S& ^7 _( H+ G4 ?; t$ R8 V6 ` struts.xml (struts主配置文件)& b' ^2 z ^# J( Y9 A; [
struts-user.xml(用户模块配置文件)
7 R' s2 u3 ^! i( S8 [. m7 j struts-main.xml(浏览模块配置文件)
/ K3 G5 z9 c8 V struts-order.xml(订单模块配置文件)
3 c0 r3 N3 p' F& n5 S. s* @ struts-cart.xml(购物车模块配置文件)
; q( r( H3 g$ c0 m( j- w; ~( k3 [0 z- T: U/ w9 U. Y, C+ h+ u/ r
4)WebRoot文件结构9 ^4 m# L, \, Z4 ~
/user/* :用户管理的JSP, u* u( v }8 D! _+ b5 t Q) N3 U2 _
/cart/* :购物车的JSP1 ?" n/ |, p8 J, m
/order/* :订单的JSP" Z9 Z1 n2 s7 d6 _
/main/* :产品浏览的JSP
) {0 }, `' [) J4 P, a /common/* :页眉、页脚等共同JSP8 T! F' l4 s( k% s r m) C
/js/* : 放置js脚本文件* h% q7 L% O9 B) U0 @4 A
/css/* :放置css样式文件
- b: Y! G, }1 |0 U /images/* :放置页面图片文件
: S! o3 f2 b1 j \) i" m /productImages/* :放置产品图片
* d! J! P( T# k6 @4 w* [7 N5 p! n. o1 u Z2 d, z" _' i- ^
-----------------连接池的优点-----------------" J2 X- F% f2 y+ M/ P$ y
a.可以管理Connection对象,并且将Connection数量控制在一个安全范围内。提高数据库的访问安全性。4 q7 O* O4 l6 ^" A
b.连接池中的Connection对象与数据库保持连接状态,避免频繁的建立和销毁连接。7 K5 X+ s! h) D3 g" n
$ V6 {$ J" c2 m7 c4 s8 x============用户管理模块==============* T9 X' J* f1 x5 n2 L" h8 S3 O
1.注册需求. ? g$ y+ [9 L! E: R
1)表单验证(采用js+Ajax)
7 a" y2 J! j+ b$ V+ `7 A/ g 邮箱:非空、格式、唯一性(ajax)
4 t1 Z3 M5 B7 [' u* Z& X& N 昵称:非空、格式; A2 d/ H, k! ]7 {, X$ k* w7 e
密码:非空、格式9 D4 ]& o% l" c2 l+ y
确认密码:非空、与密码一致
t: {6 Q! P( h" P# H 验证码:非空、正确性(ajax)
1 F; {9 o3 O2 ]5 w! V. O- Z1 ~* j0 C
2)将表单信息写入数据表d_user
( F) g- {: Y* V) c 编写实体类、DAO、Action; J `: g. @% h
3)给用户邮箱发送验证码
. u2 v# o. f, c* S0 } 引入commons-email.jar,email.jar
L" a; N+ d$ N- } 参考EmailUtil工具类代码
9 S$ Y7 o# b3 y. x) W) V, S 4)进入邮箱验证页面verify_form.jsp
9 L; a) ^0 f1 O, U V1 t. Y H6 y ~. {: j8 q& P, i+ r
2.邮箱验证
$ Z3 A& F6 d) |# P% k6 Q# ^5 B 1)表单验证
5 R; G( P$ l/ Y' _ p }" p& w 验证码:非空、正确性(ajax)# U* @ }' }: n: g( W' o( ?- p: @
正确后跳转到成功提示界面:window.location = "register_ok.jsp";, O6 d! C! K R
2)Action逻辑& K5 g5 d; `' \: }; U
a.利用验证码去d_user检查
6 I& n8 y, G j: T! t b.如果正确,将d_user的is_email_verify字段更新成Y;不正确在verify_form.jsp提示“验证失败”! u7 u/ n/ Y6 ]; t# L
c.跳转到register_ok.jsp$ e# z( c. n1 O8 U0 T3 T. A' P
3.用户登录
8 J5 c9 T/ c# a. E 1)表单验证
+ e) L ~' J1 Q( x2 g 邮箱:非空、格式
' f$ z, [! d1 k' F \, P 密码:非空6 O$ V: Q( l+ Z" U
2)Action逻辑/ L" f _5 ~$ R' F
a.检测Email和密码是否正确,失败回到login_form.jsp提示
+ W( R0 T. ?$ u. U b.检测is_email_verify邮箱是否通过验证,未通过进入verify_form.jsp% n6 \$ H7 R9 F" K2 }9 q
c.更新最后一次登录时间last_login_time和IP地址last_login_ip。
, E: h3 p6 h, a6 a- ?9 ` d.将用户信息放入session。
6 [1 T% I0 r2 k; J( ^: a e.都正确进入/main/main.jsp+ F. W9 y) |, I' f& {3 O W
4.main.jsp页面的页眉部分,显示用户是否登录的状态 j% p9 Q* O! v# s7 g9 I; H! S
如果用户已登录,显示"欢迎XXX,【登出】"! g4 S9 _: l* h- u0 ~1 Z8 l# u
如果用户未登录,显示"【登录】【注册】"
* P8 d4 t+ c1 z
% D' m/ |; e% p, H/ \* q数据库 模型 : W# ^0 e; t( S; A
0 Z' ?5 f5 k: t) ^4 B
0 u3 r6 S6 H' t6 q: N2 I效果演示图:) U, V6 ?/ F# v* B# [
首页演示图:
! Q, c4 B P/ l# G% I
: a) N7 m) i. k& t$ D
$ R* u/ }- f5 l- I& V: w1 H
注册页面:8 a, G$ h& d3 l5 r* h
/ Z7 y" ?3 ~6 h' m) M- ?7 h5 U邮箱验证页面:% k/ w. C# d7 |
/ l% H4 \- w, z* O
验证成功:
+ w4 M, }2 E2 P/ Z; y+ f, T/ _% ]4 S
+ X! A5 V& s+ W( J. a! {用户在线状态:: q) N6 _1 V0 Q+ w. v ^
% y. Z9 y3 }& ?2 y用户可以购物了:* }( Q) q! I% R
! a% d1 L. z/ z1 k) X0 p7 L8 t. A* P" w, z0 O* J/ `
源码下载地址:点击下载
) A5 m, J1 k) N/ Q6 P8 N; C
% b) F6 [$ r- w1 Y7 i4 P4 H4 [1 [
" ^2 v7 I; H" A9 O7 A! t数据库下载地址:点击下载: b d+ w% I2 y; c9 N
* M, p Z- X$ U& K) F
|
|