网上商城系统
- 项目开发流程
- 数据库分析设计
- b/s架构web开发的理解
- web技术回顾练习
- 前端技术加强
- 新技术学习
一、网上商城
- 网上商城介绍
网上商城类似于现实商店,利用电子商务,达成买卖过程。 - 商城类别
英文类别 | 介绍 | 典型代表 |
B2B | 商家对商家 | 中国制造网 |
B2C | 商家对顾客销售 | 京东 |
C2C | 客户和客户 | 淘宝 |
O2O | 线上线下相结合 | 象屿商城 |
- 商城常见模块
3.1 后台常见功能模块:
1、商品管理:商品库存、上货、出货、编辑管理、商品分类管理、商品品牌管理。
2、订单管理:生成购买订单。
3、商品促销:商品促销功能。
4、 支付方式:网上钱包、银行卡(网银在线)、支付宝、微信、货到付款、微信。
5、配送方式:在线选择物流模式,顺丰、邮政、。。。
6、会员模块:集成会员注册,二次购买、提升转化率。
3.2 前端页面功能模块
1、模块风格自定义:通过系统内置引擎,通过后台可视化编辑,设计出客户需求的风格界面。
2、商品多图展示:提供前台多张图片展示。
3、自定义广告模块:内置系统中的广告模块,网站管理员可以通过操作在前端添加各种广告图片。
4、商品展示:通过前端界面,以标准化或者个性化方式展示商品信息。
5、购物车:随时增加、删除商品。
二、软件开发概要
- 周期和阶段
- 起始阶段(Inception):有一个想法
- 细化阶段(Elaboration):计划必要的活动和资源,确定功能设计架构
- 构建阶段(Construction):构建产品,发展最初设想、架构和计划。
- 移交阶段(Translition):移交用户使用,包括:交付、培训、维护。
- 开发流程
2.1 需求分析
1、初步了解
2、深入分析,形成需求文档
3、确认需求
2.2 概要分析
系统基本处理流程、系统组织架构、模块划分、功能分配、接口设计、数据结构、出错设计等。
2.3 详细设计
具体模块所用到的算法、数据结构、类的层次结构及调用关系,各个层次中程序设计考虑。
2.4 编码
2.5 测试
2.6 交付
2.7 验收
2.8 维护
三、EStop项目介绍
- 开发环境
分类 | 名称 | 语种 |
操作系统 | 无要求 | 简体中文 |
数据库平台 | mysql | |
应用服务器 | tomcat | |
java开发工具 | idea | |
框架 | 无 | |
项目名称 |
- 主要功能
序号 | 模块名称 | 主要功能 |
1 | 商品显示模块 | 分页显示所有商品查看 单个商品详细信息搜索商品 |
2 | 用户模块 | 新用户注册 用户登录 用户退出 |
3 | 购物车模块 | 加入商品 修改商品数量 |
4 | 订单模块 | 提交订单 显示订单 用户确认后生成正式订单 查看历史订单 |
5 | 支付模块 | 完成支付 |
6 | 收货地址 | 管理收货地址 |
7 | 后台模块 | 实现商品增删改查 |
- 项目展示
1、导入项目
2、导入数据库
3、运行
4、效果展示
四、数据库设计
- PoweDesigner设计软件介绍
数据库设计软件,开发人员常用数据库建模工具。从概念模型和数据模型两个方面对数据库进行设计。
1.1 概念数据模型cdm
描述实体定义和实体关系定义。用来标识实体的是属性。
1.2 物理数据模型pdm
针对目标数据库管理系统的具体化。
pdm对象:表(table)、表中的列(table column)、主外键(primary 、foreign key)、参照(reference)、索引(index)、试图(view)。
1.3 cdm和pdm比较
cmd:描述存储的实体、属性、实体关系。
pdm:带概念数据库模型进行升级,将实体转化成具有数据库特性的模型!
1.4 数据库设计步骤
1、设计cdm模型
2、生成pdm模型
3、生成dbms脚本 - 用户模块涉及表
2.1 用户表user
字段 | 类型 | 主键 | 约束 | 备注 |
id | int | 是 | 自增 | 序号 |
username | varchar(20) | not null | 用户名称 | |
password | varchar(64) | not null | 密码,使用md5 | |
email | varchar(50) | not null | 邮箱,不可重复 | |
gender | char(1) | 性别 | ||
flag | int | 状态标记:0未激活;1激活;2无效 | ||
role | int | 角色:0管理员;1会员 | ||
code | varchar(100) | 激活码 |
2.2 收货地址表address
字段 | 类型 | 主键 | 约束 | 备注 |
id | int | 是 | 自增 | 序号 |
name | varchar(30) | 地址收件人 | ||
phone | varchar(14) | 收件人手机号 | ||
detail | varchar(200) | 收件人详细地址 | ||
state | int | 默认地址:0-不是;1-是 |
注意:一个用户多个收货地址:用户-收货地址一对多。
- 商品模块涉及表
3.1类别表(类别实体type)
名字 | 字段 | 类型 | 主键 | 约束 | 备注 |
类别主键 | t_id | int | 是 | 自增 | 类别主键 |
类别名称 | t_name | varchar(20) | 类别名称 | ||
类别描述 | t_info | varchar(200) | 类别描述 |
3.1商品表(商品实体product)
名字 | 字段 | 类型 | 主键 | 约束 | 备注 |
商品主键 | p_id | int | 是 | 自增 | 商品唯一标识 |
商品名称 | p_name | varchar(50) | 商品名称 | ||
商品上市时间 | p_time | date | 商品上市时间 | ||
商品图片 | p_image | varchar(100) | 商品图片路径 | ||
商品价格 | p_price | decimal(12,2) | 商品价格 | ||
热门指数 | p_state | int | 商品热门指数 | ||
商品描述 | p_info | varchar(200) | 商品描述 |
注意:一个类别多件商品:类别-商品一对多。
- 购物车模块涉及表
4.1 购物车实体(cart)
名字 | 字段 | 类型 | 主键 | 约束 | 备注 |
购物车主键 | c_id | int | 是 | 自增 | 购物车唯一标识 |
购物车商品的小计 | c_count | decimal(12,2) | 购物车的小计 | ||
购物车商品数量 | c_num | int | 购物车商品数量 |
注意:一个用户多个购物车:用户-购物车一对多;
一个购物车多个商品:购物车-商品一对多。
- 订单模块
5.1 订单实体(orders)
名字 | 字段 | 类型 | 主键 | 约束 | 备注 |
订单编号 | o_id | varchar(64) | 是 | 自增 | 订单编号是字符串类型,也是唯一标识 |
订单金额 | o_count | decimal(12,2) | 订单总金额 | ||
订单时间 | o_time | detetime | 订单详细时间 | ||
订单支付状态 | o_state | int | 状态:0-未付款;1-付款未发货;2-发货未收货;3-收货待评价;4-订单完成;5-退货状态。 | ||
订单收货地址 | o_detail | varchar(200) | 订单收货地址 | ||
订单收件人联系电话 | o_phone | varchar(14) | 订单收件人联系方式 | ||
订单收件人 | o_name | varchar(20) | 订单收件人姓名 |
注意:用户-订单多对一;
地址-订单一对多。
5.2 订单项(item)
名字 | 字段 | 类型 | 主键 | 约束 | 备注 |
订单项主键 | i_id | int | 是 | 自增 | 订单项唯一标识符 |
订单项的小计 | i_count | decimal(12,2) | 订单项小计 | ||
订单项的数量 | i_num | int | 订单项数量 |
注意:商品-订单项一对多;
五、项目搭建和准备工作
- 创建项目
- 导入工具类
- 导入jar包
- 导入配置文件
- 导入页面
- 创建baseServlet
- 创建baseServlet必要性
现在我们只要实现一个功能,我们需要创建一个servlet
例如:用户模块(登录、注册、退出登录、激活、发送邮件等功能)
也就是说,我们必须创建一些系列的servlet:UserServlet——》登录功能
UserRegister——》注册功能
总之想要实现一个功能就需要一个servlet
弊端:
- 创建大量servlet!servlet实例——》web容器(tomcat)管理,有大量的servlet实例必然会占用更大的运行内存,会间接拖慢web容器速度。
- servlet它的是service(doget/dopost)方法是一个多线程方法,,一个servlet可以处理很多次请求,可以并发处理!一个servlet能力很强,但是只对应一个功能会浪费。
BaseServlet简化和优化servlet的创建和数量。
- 实现BaseServlet思路
- 为什么servlet只对应一个功能
一个servlet被访问之后只有一个方法被调用,通常我们习惯一个方法中写一个业务逻辑!
一个servlet对应方法对应一个业务功能。
- 分析Baseservlet实现的思路
- 让一个servlet对应多个方法,每个方法实现一个业务逻辑
- 具体实现思路
步骤1:在servlet声明多个处理业务逻辑方法。
步骤2:在每次访问servlet时在路径上添加一个标识,标识用于判断要访问的具体业务逻辑方法。
步骤3:当每次请求到doget/dopost/servlet方法的时候,判断参数的标识,调用对应的业务逻辑方法。
- 具体BaseServlet实现
- 实现基本的baseservlet
- 优化方法调用
利用标识符的字符串和方法名相同
我们可以利用反射技术,调用对应的执行方法。
避免大量的判断
当有新的方法出现时,也不需要额外添加判断的方法。
service(){
1.获取标识符
2.根据标识符调用对应的逻辑方法
利用反射技术
}
- 优化servlet实现
实现思路:
创建一个BaseServlet类,继承HttpServlet,在BaseServlet中写service方法
在service写获取标识符和反射调用业务逻辑
每个模块对应的Controller只需要集成BaseServlet即可。
HttpServlet——》BaseServlet——》模块的Controller
- 优化返回值问题
每个方法都要进行响应
响应方式固定:转发、 重定向 、返回字符串 、返回字节流
如果每个方法写转发和重定向和返回字符串的语法比较繁琐
我们可以统一在BaseServlet进行处理
操作:步骤1:将方法的返回值改为字符串即可
步骤2:根据约定的内容,添加特殊标志
例如:转发“forword”路径
步骤3:BaseServlet集中处理
执行方法,获取标识符,进行非空判断
截取标识,进行重定向或者写回字符串处理
好处:简化方法响应的处理
注意:没有管返回字节。
返回字节,我们只需要将方法的返回值改成void,只需要使用response对象自己手动操作即可。
- 处理标识符异常情况
/**
* BaseServlet用于集中处理方法的调用!
* 以及返回值处理!
* 以及默认页对应方法!
*/
public class BaseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取请求参数(标识符)
String methodStr = req.getParameter(Constants.TAG);
//2.如果method没有获取到值!我们就跳转到首页!(标识符异常处理)
if (methodStr == null && methodStr.equals("")) {
methodStr = Constants.INDEX;
}
//3.反射调用对应的业务逻辑方法
Class clazz = this.getClass();
try {
Method method = clazz.getMethod(methodStr, HttpServletRequest.class, HttpServletResponse.class);
Object result = method.invoke(this,req,resp);
//4.集中处理返回值响应
if (result != null) {
//转发 重定向 返回字符
String str = (String) result;
if (str.startsWith(Constants.FORWARD)) {
//转发
String path = str.substring(str.indexOf(Constants.FLAG) + 1);
req.getRequestDispatcher(path).forward(req,resp);
}else if (str.startsWith(Constants.REDIRECT)){
//重定向
String path = str.substring(str.indexOf(Constants.FLAG) + 1);
resp.sendRedirect(path);
}else{
resp.getWriter().println(str);
}
}
} catch (Exception e) {
e.printStackTrace();
//controller 和 service dao 有异常都会到此处!
req.getSession().setAttribute("msg", "程序异常!请稍后再试!");
resp.sendRedirect("/message.jsp");
}
}
/**
* 当method标识符‘没有值’ 我们默认赋 index 访问每个controller的index方法!
* 我们将方法提取到baseservlet中即可!
* 默认处理:跳转到程序的首页!
* @param req
* @param resp
* @return
* @throws IOException
* @throws ServletException
*/
public String index(HttpServletRequest req,HttpServletResponse resp) throws IOException, ServletException {
return Constants.FORWARD+"/index.jsp";
}
}
- 运行项目
六、项目编码
- 用户管理模块
用户模块涉及功能:注册,登录,自动登录,退出登录
- 1.1 新用户注册
需求编号 | Shopping_004 |
功能名称 | 新用户注册 |
功能描述 | 1. 用户名Ajax认证 2. 注册功能(未激活状态) 3.发送激活邮件 4.账号激活 |
备注 | 账号需要激活才可以使用(邮箱验证) |
1.2 用户登录
1.3 用户退出
- 商品模块
2.1 商品展示
2.2 查看商品详情 - 购物车模块
3.1 加入商品到购物车
3.2 生成订单并显示 - 收货地址管理
4.1 查看地址 - 后台管理