estore简版商城思路

estore简版商城思路

1、设计数据库

遵循多表设计的原则,进行设计:

   1.一对一, 可以合并到一张表

    2. 一对多, 可以在多的一方添加一方的主键作为外键约束

3. 多对多, 需要引入第三张关系表, 会有最基本的两个字段, 分别来自于 两张主体表的主键. 这两个字段同时就是两个外键约束.

 

设计表,一共有四个表。

用户表:user,商品表:product,订单表:order,订单项表(订单和商品的关系表):orderitem

备注:购物车,没有单独设计成一个表,而是将购物车中的东西放到session中进行存储

 

2、注册功能

2.1流程

index.jsp(主页)--> regist.jsp--> RegistServlet-->UserService

--> DaoFactory--> UserDaoImpl(注册流程)

2.2思路

(1)验证码(未实现)

(2)过滤器解决全站请求乱码问题

(3)javabean封装注册时,提交过来的数据(BeanUtils)

(4)解耦合:Dao接口 ,DaoFactory工厂,DaoImpl实现类

(5)dbutils工具类,在java操作数据库时使用

(6)5秒后跳转到页面,(js书写)页面加载时

思路:

1、判断密码和确认密码是否相同,如果不同,则提示两次输入密码不同,请重新输入;相同,则进入2;

2、如果邮箱确认用户是否注册过,如果已经数据库中存在该邮箱号,则说明用户已经注册过,则提示当前邮箱已经注册过,注册失败;如果不存在,则进行注册

3、登录

3.1流程

(1)index.jsp(主页)-->login.jsp--> LoginServlet--> UserService--> UserDao--> DaoFactory--> UserDaoImpl(登录流程)

(2)afterLoginMessage.jsp(登录成功页面)

(3)AutoLoginFilter(登录过滤器)

3.2思路

(1)基本登录

(2)自动登录(cookie实现+过滤器)

   【1】对一些资源进行限制,某些资源,不用走自动登录的逻辑

【2】注销不掉的问题:

解决:在删除session的同时,删除cookie中的信息

   【3】没有勾选,清空cookie(保证用户安全)

   【4】cookie信息被篡改,清空cookie(保证用户安全)

自动登录的三个小注意点:

1. 在注销的时候,要将cookie 清空

因为,如果没有清空,就会出现注销不掉的情况。原因:系统注销后会重定向到index.jsp页面,而过滤器在过滤资源的时候,发现这个页面不属于过滤的范畴,此时系统会走自动登录的逻辑,因此,此时系统又实现了登录。最终,系统无法实现注销。  所以,当把cookie中的信息清除时,才可以避免这个问题的发生

2. 在没有勾选自动登录的时候也要将cookie 清空

estore简版商城思路_第1张图片

如图所示,当多人登录用同一个浏览器登录这个系统,而且登录的前者:小丽勾选了自动登录的选项,这是cookie中会保存他的信息到浏览器中;而当下一个人:柯泉,使用这个浏览器,进行登录系统,他没有勾选自动登录的选项,所以浏览器没有保存他(柯泉)的登录信息到cookie中。至此,浏览器中仍旧记录的是小丽的cookie信息。当柯泉关掉浏览器走开后,然后再回来访问网站的页面时,这时候因为浏览器中还保留着小丽的cookie信息,因此可以实现自动登录,此时,系统中看到的是小丽的信息。这样,就会出现安全隐患。

所以,为了出现这样的安全隐患。当用户没有自动登录时,将cookie信息清空。(因为当用户自动登录时,浏览器会只保存这一个cookie信息)

3. 在发现cookie中信息被篡改的时候也要清空.

cookie中存储的用户名和密码信息出现错误时,说明cookie中信息被篡改,此时,说明cookie中存储的信息是无效的,且不安全,所以,为了安全起见,应该清楚cookie中的信息

4、注销

4.1流程

afterLoginMessage.jsp(登录成功页面)-->LogoutServlet(注销流程)

4.2思路

session的两种方式可以注销

 

5、md5加密

支持正向的加密,不支持解密的(单向)

采用md5 加密算法将 密码加密后保存到数据库中

(1)md5工具类实现(MD5Utils)

(2)在注册,登录保存到数据时,将加密后的数据进行保存。

 

额外说明:

加密都 可以分为如下这两大种 :

第一种: 支持加密, 也支持解密的

Base64

第二种: 支持正向的加密,不支持解密的.

MD5 加密,  支持加密, 不支持解

Md5加密算法 java中已经 集成 进来 .算法是固定, 很多很多 软件 也都集成了 md5 加密.

例如: java, c,c++,c#,  mysql,oracle

6、商品的添加

6.1流程

管理员登录成功后(afterLoginMessage.jsp) --> addproduct.jsp--> AddProductServlet--> ProductService----> DaoFactory--> ProductDaoImpl(商品添加流程)

message2.jsp(添加商品成功页面)

6.2思路

(1)涉及文件上传的知识,这里主要是上传商品的图片问题

使用上传控件:commons-fileupload

(2)BeanUtils封装,提交过来的数据

(3)图片保存路径:不在WEB-INF下保存,因为商品图片,用户要浏览

(4)商品的添加涉及到 文件的上传, 所以这里首先要有一个文件上传的表单,表单要注意如下三点:

第一点:Input 输入项的type=”file”

第二点:表单的 enctype=”multipart/form-data”

第三点:请求的提交方式是post

点击添加后去访问一个servlet ,完成商品的添加

7、商品显示

7.1流程

登录成功后:afterLoginMessage.jsp --> ListProductServlet--> ProductService--> DaoFactory--> ProductDaoImpl(商品显示流程)

listproduct.jsp(商品显示页面)

7.2思路

商品的显示 逻辑很简单, 只需要在 点击 查看商品 后, 去找一个serlvet, 将所有的商品查找后, 返回一个list, 然后 将这个list存到 request域中,然后转发到 jsp 页面去显示即可。

在显示商品的 页面 ,图片 有的大,有的小, 不好看, 所以可以 对图片进行 缩放处理下。

 

(1)如何显示图片?

 思考:使用image标签完成!

(2)图片显示的统一大小问题?

     缩放处理   

【1】设置image标签的宽,高的规格

【2】使用java的api实现:制作图片缩略图

 在存放商品图片的同一存放目录下,生成一个小图

因此,修改的地方,就是在商品添加的时候,生成一个小图,使用工具(PicUtils);因此,在商品类中添加一个字段imageurl_s表示小图存放地址(imageurl是商品原图存放地址)

 

8、添加商品到购物车

8.1流程

商品显示页面listproduct.jsp--> AddToCartServlet-->(1)(2)(3)

(1)【ProductService -->DaoFactory--> ProductDaoImpl  (获取当前商品的全部信息)】

(2)购物车信息保存到map容器中,最终保存到session域中

(3)message2.jsp(添加购物车成功信息页面)

8.2思路

(1)js实现 ,在页面点击进行“添加到购物车”事件触发

(2)购物车,保存到session中,名字为:cart

(3)购物车,里面的内容实际上,保存在一个map容器中,并且map的泛型时这样的:Map ,这个map容器的键:Product(商品),值:Integer(商品的购买数量)。因此,这个map容器就是购物车,而最终这个map容器保存到session中。

(4)在保存到map容器是,首先要进行选择,因为保证有序,所以选择LinkedHashMap< Product,Integer >,而为了保证存入的 map中的元素唯一,需要在Product类中覆盖hashCode和equas方法,通过Product的id来确保元素的唯一。

 

9、权限控制

9.1流程

(1)添加一个过滤器PrivilegeFilter

(2)配置文件user.text    用户有权限访问的资源

配置文件admin.txt  管理员有权限访问的资源

9.2思路

(1)user表中添加role(角色),这个role有两个取值:一个是user(普通用户),另外一个是admin(管理员)

(2)权限认证:先认证,后权限

          认证:我是谁?

                      权限:我能做什么?

(3)谁有什么权限?可以访问什么?不能访问什么?

(4)过滤器PrivilegeFilter+配置文件user.text,admin.txt(书写权限资源,即:有权限访问的资源)

 [1]读文件,获取权限(类加载器或者ServletContext去获取)

[2]用list容器进行保存这些权限

[3]目标资源的路径获取问题(当前请求资源)

[4]判断逻辑

1、当前资源是否需要权限访问,如果不需要,直接放行;如果需要,则进入2,3

    2、没有登录

       只能注册,登录 ,和查看商品   (提醒登录)

    3、 登录

     看看登录角色是user还是admin

     1)角色是user:

          <1>能:  添加购物车,显示购物车, 注销   【 放进有权限的list列表中:userlist】

          <2>不能:添加商品

     2)角色是admin:

          <1>能:添加商品,注销   【 放进有权限的list列表中:adminlist】

          <2>不能:添加购物车,显示购物车

 

10、显示购物车和修改购物车商品数量

10.1流程

登录成功后:afterLoginMessage.jsp --> listcart.jsp(显示购物车)

【修改购物车中商品数量】

listcart.jsp --> UpdateProductServlet--> ProductService--> DaoFactory--> ProductDaoImpl(查找当前商品数量)

修改session域中的cart(购物车)【购物车中的某种商品的数量】

listcart.jsp(修改购物车中的商品数量后,跳转到购物车显示页面)

10.2思路

(1)全选,全不选之js代码(未实现)

(2)遍历map集合之EL表达式(购物车cart的遍历问题)

(3)session使用?(范围,时间)

(4)cart的信息获取,存储时就是全面,前面添加商品到购物车是已经做好了

(5)所有商品总价问题,即:如何使用标签的问题

(6)购物车中商品数量的动态增加,减少问题?js的使用和servlet使用的结合,调用UpdateProductServlet实现修改

(7)文本框的动态改变问题,onblur的使用,实时更新商品数量

(8)文本框的判断数字问题(js实现)

11、去结算(生成订单)

11.1流程

listcart.jsp(购物车页面)-->confirmInfo.jsp(确认订单信息页面)-->GenerateOrderServlet-->OrderService-->(1)(2)(3)

(1)--> DaoFactory -->OrderDaoImpl【生成订单表】

(2)--> DaoFactory--> OrderitemDaoImpl【生成订单项表】

(3)--> DaoFactory--> ProductDaoImpl【修改商品数量】

 

message2.jsp(生成订单成功页面)

11.2思路

注意:生成订单的前一个逻辑是:确认订单信息,订单信息里包括订单金额:money,此外要求用户,填写订单收货人的地址信息:receiveinfo

(1)显示的信息是购物车cart的信息

(2)当前拥有的信息

[1]生成订单的表单中有的信息:订单金额:money,订单收货地址信息:receiveinfo

[2]当前用户的信息,session中loginUser可获得

[3]购物车的信息:session中的cart可获得

(3)订单(orders)与订单中的订单项(orderitem)关联?

     用容器来维护!

     使用list容器,即:在orders表的bean:Orders类中添加一个字段:List

从而,可以在传递参数:一个订单时,把相应的订单项的信息传递过去。

(4)维护多张表中的数据

     关系表:orderitem(订单项表),product:商品表,订单表

设计三张表的操作时,需要进行事务管理。注意:在进行事务管理时,是抛出异常,而不是捕获异常;因为出现异常后,要进行事务回滚!

一个问题:进行事务管理,Service层就会出现Connection类,就会出现耦合现象,为了解决这个问题?

所以使用ThreadLocal(本地线程类),实现解耦合!

TransactionUtil工具类的使用

(5)表的级联工作

[1]生成订单表[2]生成订单项表[3]商品表:修改商品数量

 

12、查看订单信息

12.1流程

登录成功后:afterLoginMessage.jsp --> ListOrderServlet--> OrderService

--> DaoFactory -->OrderDaoImpl(查看订单信息)

listorder.jsp(订单信息显示页面)

12.2思路

(1)用户,管理员。角色不同,查询信息不同

(2)多表查询 【1】用户表,订单表

【2】订单项表(订单和商品之间的关系表),商品表

(3)

订单查询的所有信息:【查询四个表】

订单号 ,下单时间,总价(orders表)商品价格商品名(product表),

购买数量(orderitem表),下单人(user表)

 

为了查询便利,

在Orders类中添加 了 字段: private String username;//下单人名字

在Orderitem类中添加了字段:private int price;//商品价格

private String name;//商品名

添加字段后,查询的表变为:【查询两个表】

订单号 ,下单时间,总价,下单人(orders表)          

商品价格,商品名,购买数量(orderitem表)

(4)取出查询信息

OrderList(所有订单)--> Order(其中的一个订单)--> OrderitemList(一个订单下的所有订单项)-->orderitem(一个订单项)

13、支付

13.1流程

listorder.jsp(订单信息显示页面)--> PayServlet--> OrderService

--> DaoFactory -->OrderDaoImpl(支付订单)

message2(支付订单成功的信息页面)

13.2思路

修改订单的支付状态即可

你可能感兴趣的:(javaWeb学习案例实现)