基于Java Web的网上图书商城管理系统——(二)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xu_benjamin/article/details/83785751

二、总体设计

1.技术选型——系统架构

        本系统架构模式的选择还是以传统的MVC模式为主, 采用DAO模式进行设计,选择web层、service层、dao层的三层结构。选择的 技术包括JSTL + JSP + Servlet + JavaBean + BeanUtils + FileUpload + JavaMail + DBUtils(JDBC) + C3P0 +  MySQL + MyEclipse10+ Tomcat7.0 + JDK6  + Windows等。

2.数据库设计

        本系统存在以下实体:用户、商品、订单、购物车,考虑到本系统没有具体实物的商品,故购物车功能只做简单的模拟过程,所以不将购物车放入数据库,而是采用Session或者Cookie实现。

数据库中的表:

用户表:

create table users (

   id int primary key auto_increment,

   username varchar(40),

   password varchar(100),

   nickname varchar(40),

   email varchar(100),

   role varchar(100) ,

   state int ,

   activecode varchar(100),

   updatetime timestamp  );

商品表:

create table products(

   id varchar(100) primary key ,

   name varchar(40),

   price double,

   category varchar(40),

   pnum int ,

   imgurl varchar(100),

   description varchar(255));

订单表:

create table orders(

   id varchar(100) primary key,

   money double,

   receiverinfo varchar(255),

   paystate int,

   ordertime timestamp,

   user_id int ,

   foreign key(user_id) references users(id)

);

确定关系:

订单与用户之间存在关系:1 对 多  。要在订单表中生成一个外键来描述关系。

订单项:描述的商品与订单之间的关系:多对多关系。需要一个中间表来描述它们关系。

订单项表:

create table orderitem(

   order_id varchar(100), 

   product_id varchar(100),

   buynum int ,

   primary key(order_id,product_id),

   foreign key(order_id) references orders(id),

   foreign key(product_id) references products(id)

);

设置数据库环境

数据库 :create database estoresystem

3.模块化

(1)注册模块

1) 一次性验证码

原理:在生成验证码Servlet程序中,将生成验证码保存Session中,用户提交验证码 与 保存在Session验证码进行比较,如果相同,请求合法 

2) 注册表单 JS校验

考虑JS校验是否可以抽取成框架

3) 处理form乱码问题 ---- 通用get post 乱码过滤器

4) 密码 MD5 加密 

5) 激活邮件发送

6) 配置通用错误处理页面web.xml

  <error-page>

       <error-code>500</error-code>

       <location>/500.jsp</location>

  </error-page>

  <error-page>

       <error-code>404</error-code>

       <location>/404.jsp</location>

  </error-page>

500.jsp 显示错误的信息

404.jsp 自动刷新跳转回主页面

(2)登录模块

原理:用户输入正确用户名和密码,登录成功,用户信息将会被保存Session对象中。 ------ 记住用户名和密码 、自动登录

1) 登录表单中,添加记住用户名 和 自动登录功能

2) 登录过程中判断 账户是否激活

3) 在login.jsp 显示记住用户名

在username 的input项中添加  value="${cookie.username.value}"

在勾选自动登录 checkbox 添加

4) 登录后注销功能

注销Session 

 

关于自动登录:

自动登录功能 对系统所有页面有效 (例如访问index.jsp  list_product.jsp  info_product.jsp 这些页面在访问时都将执行自动登录)

* 对于登录相关页面不会执行自动登录逻辑 (login.jsp 、LoginServlet 、InvalidateServlet )

1) 判断该请求页面是否需要自动登录

2) 是否已经登录

3) 是否含有自动登录cookie

4) 自动登录

5) 在LoginServlet 添加对于没有勾选记住用户名和自动登录处理代码 !!!!!!!

6) 在退出功能 InvalidateServlet 清除自动登录信息

(3)商品添加模块

文件上传三个注意事项

1) input输入框 必须有name属性

2) 表单form 必须post提交方式

3) 设置form的enctype 为 multipart/form-data

表单提交时,校验分为两种 : 客户端校验 、服务器端校验  ------ 只有服务器端校验才能确保数据准确

商品图片上传到服务器端后,保存在哪个目录 ???  必须直接在WebRoot下及其除WEB-INF、META-INF 子目录外

一般情况下,一张表对应Domain类 --- DAO类 ---- Service类

(4)商品查询模块

列表中显示原图,因为原图比较大,页面加载非常缓慢 ,页面布局不会很美观 ---------------- 缩略图

* Java中通过图形界面技术,生成小图

在Product类中添加 getImgurl_s方法,用来获取缩略图路径

(5)查看商品详情模块

通过在列表中点击 商品图片或者商品名称 进入详情查看页面

(6)添加到购物车模块

购物车对象,不保存在数据库中,使用Session来保存用户购物车数据

保存购物车对象 Map<Product,Integer>  key 商品对象 value 商品购买数量

流程 :添加商品到购物车流程,点击添加到购物车,将商品id传递Servlet ,从Session中取出购物车对象,判断商品是否已经在购物车中,如果不在添加商品到购物车数量 1 ,在购物车取出原有数量+1 

1) 如果Map的key是一个自定义对象,重写 hashcode和equals

2) 如果商品不在购物车中,需要根据商品 id 查询商品所有信息,添加购物车

3) 添加商品到购物车

Session中信息在服务器正常关闭时,会被序列化到硬盘中  ---- Product实现 Serializable接口 完成序列化

(7)查看购物车模块

购物车信息保存在Session中,不需要去查询数据库,将Session中信息显示出来

 在购物车中显示总价 

(8)购物车管理模块

购物车修改 : 

清空购物车 : request.getSession().removeAttribute("cart");

删除购物车中单项商品 : cart.remove(product) ;  注意:删除一项后,判断购物车是否为空,如果为空 移除购物车对象

* 删除确认功能

写法一:直接在href中 触发js函数,询问用户是否确认,如果确认,location.href 发起删除请求  ----- <a href="javasript:confirmDel();" >...</a>

写法二:<a href="/delCart?id=xx" οnclick="confirmDel(); "></a> 在链接中添加 onclick事件 ,询问用户是否确认,如果用户取消,通过JS阻止href事件提交

阻止href默认事件 : e.preventDefault() ---- 必须支持事件 FF支持、IE不支持

IE阻止href默认事件

         function confirmDel(e){

                   // 询问用户是否确认

                   var isConfirm = window.confirm("商品不要了吗?多好的商品啊!");

                   if(!isConfirm){

                            // 用户选择取消,阻止 a 标签 默认事件 href发生

                            if(e&&e.preventDefault){

                                     // e对象存在,preventDefault方法存在 ---- 火狐浏览器

                                     e.preventDefault();

                            }else{

                                     // 不支持e对象,或者没有preventDefault方法 ---- IE

                                     window.event.returnValue = false;

                            }

                  }

         }

修改购物车中商品购买数量  ---- JavaScript 控制购物数量修改

(9)生成订单模块

重点:

1) 向orders表插入订单信息后,同时需要向orderitem表插入 订单中每项数据

2) 多表插入 (数据完整性问题)  --- 事务管理     

3) 订单生成后 ,商品数量更新减少

(10)查看订单模块

管理查询订单 --- 所有人订单信息

普通用户 ---- 只能查询自己的订单

在订单生成后,查看订单列表 、也可以通过index.jsp 进入订单查看页面

重点:查询订单时,同时查询订单项目信息

1) 查询订单基本信息时,查询下单用户昵称和用户名

在Order类中 添加 用户的 username 和 nickname字段

select orders.*,users.username,users.nickname from orders,users where orders.user_id = users.id;

2) 查询订单项信息时,查询商品的名称和单价

在OrderItem类中 添加商品的name和price 字段

select orderitem.*,products.name,products.price from orderitem,products where orderitem.produtct_id = products.id and orderitem.order_id = ?

(11)订单管理模块

订单取消 : 删除订单表信息时,同时删除订单项信息 (订单项信息依赖 订单信息 ,必须先删除订单项)

注意事项

1) 可以取消未支付的订单,如果订单已经支付,将无法取消

2) 管理员不能取消任何用户未支付订单,普通用户只能取消 自己的未支付的订单

取消订单进行事务管理 :删除订单项、删除订单、恢复商品数量

(12)权限控制模块

当前系统有三种用户:
        1.游客----查看商品
        2.user -----查看商品  生成订单  查看订单  
        3.admin-----下载榜单  添加商品.
   
    权限控制---使用annotation  + 动态代理完成操作.

    数据库进行修改
        users表中的role字段做为一个外键.
        添加一个role表,这个表中有相关用户角色信息
        create table role(
            role varchar(100) primary key
        )
        users表中的role字段是一个外键,依赖于role表中的role字段.
        create table privileges(
            id int primary key auto_increment,  
            name varchar(20)  权限名称
        )
        角色与权限之间存在多对多对象
        有一个中间表
        create table userprivilege(
            privilege_id int,
            role varchar(100),
            primary key(privilege_id,role),
            foreign key userprivilege(privilege_id) references privileges(id),
            foreign key userprivilege(role) references role(role)
        )

 

4.模块间的关系

 

展开阅读全文

没有更多推荐了,返回首页