JavaWeb - 仿小米商城 (1) : 项目启动
1.案例引述
网上商城介绍
网上商城类似于现实生活中的商店,利用电子商务的各种手段,达成买到卖的物品的过程的虚拟商店. 从而减少中时间环节,消除运输成本和代理中间的差价,造就对普通消费和加大市场带来巨大的发展空间,尽可能的还消费者的利益.
商城类别
| 英文类别 | 介绍 | 典型代表 |
|---|---|---|
| B2B | Business To Business商家对商家 | 阿里巴巴 |
| B2C | Business To Customer商家爱对顾客销售 | 京东商城 |
| C2C | Customer To Customer 客户对客户 | 百度有啊 |
| O2O | Online TO Online线上线下相结合 | 象屿商城 |
商城常见模块
后台常见功能模块
。商品管理:包括后台商品库存管理、上货、出货、编辑管理和商品分类管理、商品品牌管理等。。订单管理:在线订单程序,使消费者能够顺利的通过WEB在线的方式,直接生成购买订单。
。商品促销:一般的购物系统多有商品促销功能,通过商品促销功能,能够迅速的促进商城的消费积极性。
。支付方式:即通过网上钱包、电子支付卡。进行网上资金流转换的业务流程;国内主流支付方式包括:支付宝、财富通、网银在线等。还有部分网上商城支持货到付款,如京东商城、第九大道、鹏程万里贸易商城。
。配送方式:购物系统集成的物流配送方式,从而方便消费者对物流方式进行在线选择。如:EMS、顺丰等等。。会员模块:在购物系统中,集成会员注册是吸引会员进行二次购买和提升转换率的方式。
前端界面功能模块
.模板风格自定义:即通过系统内置的模板引擎,可以方便的通过后台可视化编辑,设计出符合自身需求的风格界面。
。商品多图展示:随着电子商务的发展商品图片成为吸引消资首的弟一妥系,多图展小即据从EI/cy,m消费者的购物欲望。
。自定义广告模块:内置在系统中的广告模块,网站管理员能够顺利的通过操作就可以在前端界面中添加各种广告图片。
。商品展示:通过前端界面,以标准的或者其他个性化的方式向用户展示商品各类信息,完成购物系统内信息流的传递。
。购物车:用户可对想要购买的商品进行网上订购,在购物过程中,随时增删商品。
2. 小米商城项目介绍
开发环境
| 分类 | 名称 | 语种 |
|---|---|---|
| 操作系统 | 开发在Windows10, 上线在Linux CentOs7.0 | 简体中文 |
| 数据库平台 | MySQL5.7+ | – |
| 应用服务器 | Tomcat8+ | |
| Java开发工具 | idea2020+ | |
| 框架 | JavaEE5+ | |
| 项目名称 | 小米商城 mi_shop |
主要功能
| 序号 | 模块 | 主要功能 |
|---|---|---|
| 1 | 商品显示模块 | 分页显示所有商品查看单个商品详细信息搜索商品 |
| 2 | 用户模块 | 新用户注册用户登录退出 |
| 3 | 购物车模块 | 加入商品到购物车修改所购商品数量 |
| 4 | 订单模块 | 提交订单并显示订单信息用户确认后生成订单用户查看历史订单 |
| 5 | 支付莫夸 | 完成在线支付功能 |
| 6 | 收获地址 | 管理收获地址 |
| 7 | 后台模块 | 主要实现商品的增删改查 |

数据库表设计说明
用户模块涉及的表
用户模块主要涉及到用户登录和注册功能以及地址选择功能
所以用户涉及模块涉及两张用户表和
**用户表:tb_user **
存储用户信息标红会员和管理员
| 字段 | 类型 | 主键 | 约束 | 备注 |
|---|---|---|---|---|
id | int() | 是 | 自增 | 主键 |
username | varchar(20) | not null | 用户昵称 | |
password | varchar(32) | not null | 密码使用md5加密 | |
email | varchar(50) | not null | 邮箱 | |
gender | varchar(50) | 性别 | ||
flag | int | 默认值0 | 状态标识:0未激活,1激活,2无效 | |
role | int | 角色:0管理员 , 1 会员 | ||
code | varchar(100) | 激活码 |
`tb_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(20) NOT NULL,
`password` varchar(32) NOT NULL,
`email` varchar(50) NOT NULL,
`gender` varchar(50) NOT NULL,
`flag` int(11) DEFAULT NULL,
`role` int(11) DEFAULT NULL,
`code` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
业务分析:
1.注册后的用户必须激活后才能登录
2.注册后生成一个激活连接给用户进行激活操作
收货地址表:tb_address
存储用户的收获地址
| 字段 | 类型 | 主键 | 约束 | 备注 |
|---|---|---|---|---|
id | int() | 是 | 自增 | 主键 |
detail | varchar(200) | not null | 详细地址 | |
name | varchar(20) | not null | 收件人姓名 | |
phone | varchar(11) | not null | 手机号 | |
uid | int | 外键 | 用户表id | |
level | int | 地址顺序1是最高 | ||
`tb_address` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`detail` varchar(200) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`phone` varchar(20) DEFAULT NULL,
`uid` int(11) NOT NULL,
`level` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_address_id` (`uid`),
CONSTRAINT `fk_address_id` FOREIGN KEY (`uid`) REFERENCES `tb_user` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
业务分析:
1.用户可以有多个收件地址,详细地址不能相同
2.地址排序,通过level的设置排序,而且用户可以设置这个数值
商品模块涉及的表
商品模块 可以对商品的类别进行管理
对商品信息进行管理
商品类别表tb_goods_type
用于管理上商品类别
| 字段 | 类型 | 主键 | 约束 | 备注 |
|---|---|---|---|---|
| id | int | 是 | 自增 | 主键 |
name | varchar(50) | not null | 类型名称 | |
level | int | not null | 类型级别123 | |
Parent | int | not null | 上一级的序号,默认是0 |
CREATE TABLE `tb_goods_type` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`level` int(11) DEFAULT NULL,
`Parent` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
商品表tb_goods
对商城商品管理的数据表
| 字段 | 类型 | 主键 | 约束 | 备注 |
|---|---|---|---|---|
| id | int | 是 | 自增 | 主键 |
name | varchar(100) | not null | 商品名 | |
pubdate | date | 上架时间 | ||
picture | varchar(255) | not null | 商品图片 | |
price | decimal(8,2) | 价格 | ||
star | int | 评分 | ||
intro | text | 商品详情 | ||
typeid | int | 外键 | 商品类型 | |
| gnum | int | 默认100 | 商品数量(库存) | |
| gstart | int | 默认0 | 商品状态:0上架,1下架 |
CREATE TABLE `tb_goods` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`pubdate` date DEFAULT NULL,
`picture` varchar(255) NOT NULL,
`price` decimal(8,2) NOT NULL,
`star` tinyint(4) NOT NULL DEFAULT '0',
`intro` text,
`typeid` int(11) NOT NULL,
`gnum` int(11) DEFAULT NULL,
`gstart` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_typeid` (`typeid`),
CONSTRAINT `fk_typeid` FOREIGN KEY (`typeid`) REFERENCES `tb_goods_type` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
业务分析:
1.商品的上架 只能上架不能下架 商品数量(库存) 这个设计没有
2.评分 , 可以通过评分进行排序
3.通过商品名称或类型进行搜索
…
购物车模块涉及表
**购物车表tb_cart **
| 字段 | 类型 | 主键 | 约束 | 备注 |
|---|---|---|---|---|
| id | int | 是 | 外键 | 用户序号 |
pid | int | 是 | 外键 | 商品序号 |
Num | int | 购买数量(要减少商品库存数) | ||
money | int | 金额 |
CREATE TABLE `tb_cart` (
`id` int(11) NOT NULL,
`pid` int(11) NOT NULL DEFAULT '0',
`Num` int(11) DEFAULT NULL,
`money` int(11) DEFAULT NULL,
PRIMARY KEY (`id`,`pid`),
KEY `fk_cart_pid` (`pid`),
CONSTRAINT `fk_cart_id` FOREIGN KEY (`id`) REFERENCES `tb_user` (`id`),
CONSTRAINT `fk_cart_pid` FOREIGN KEY (`pid`) REFERENCES `tb_goods` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
订单模块涉及表
订单模块涉及的表有订单表和订单详情表
**订单表tb_order **
| 字段 | 类型 | 主键 | 约束 | 备注 |
|---|---|---|---|---|
| id | varchar(100) | 是 | 序号 | |
uid | int | 外键 | 用户序号 | |
money | decimal(8,2) | 订单总金额 | ||
status | varchr(11) | 订单状态:0未支付,1支付失败,2支付成功,3发货,4到货,5评价 | ||
time | datetime | 订单时间 | ||
aid | int | 外键 | 收货地址序号 |
CREATE TABLE `tb_order` (
`id` varchar(100) NOT NULL,
`uid` int(11) DEFAULT NULL,
`money` decimal(8,2) DEFAULT NULL,
`status` varchar(10) DEFAULT NULL,
`time` datetime DEFAULT NULL,
`aid` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_order_uid` (`uid`),
KEY `fk_order_aid` (`aid`),
CONSTRAINT `fk_order_aid` FOREIGN KEY (`aid`) REFERENCES `tb_address` (`id`),
CONSTRAINT `fk_order_uid` FOREIGN KEY (`uid`) REFERENCES `tb_user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
订单详情表tb_orderdetail
| 字段 | 类型 | 主键 | 约束 | 备注 |
|---|---|---|---|---|
id | int | 是 | 自增 | |
pid | int | 外键 | 商品序号 | |
Oid | varchar(100) | 外键 | 订单编号 | |
num | int | 数量 | ||
Money | decimal(8,2) | 金额 |
CREATE TABLE `tb_orderdetail` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`Oid` varchar(100) DEFAULT NULL,
`pid` int(11) DEFAULT NULL,
`num` int(11) DEFAULT NULL,
`Money` decimal(8,2) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_order_pid` (`pid`),
KEY `fk_order_id` (`Oid`),
CONSTRAINT `fk_order_id` FOREIGN KEY (`Oid`) REFERENCES `tb_order` (`id`),
CONSTRAINT `fk_order_pid` FOREIGN KEY (`pid`) REFERENCES `tb_goods` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
4.项目搭建
项目在开发过程中采用经典的三层架构(Web - Service - Dao),且前后端分离。因此,一些实时的前端渲染不再使用 JSP 实现,而通过 AJAX 实现。各层技术选型归纳如下
4.1Web 层
Servlet:前端控制程序
HTML:前端页面(前后端分离架构,不适用JSP)
Filter:过滤器
BeanUtils:数据封装
fastson:json 序列化工具,前后端数据通用传输格式
4.2Service 层
JavaMail:Java 邮件工具
4.3 Dao 层
mysql:关系数据库
druid:数据库连接池
dbutils:数据库简易的工具框架
5 代码文件结构
代码文件结构如下图,以下对 java 文件夹下的不同目录中的代码功能做简要介绍

5.1domain
com.mi.shoping.domain中定义具体的 Bean 封装类,这些类中的私有 fields 与数据库中对应表的字段一一对应。
用户类:

收获地址类:

购物车类:

商品类:

商品分类

订单类

订单详情类

3.2 dao
com.mi.shoping.dao和 com.mi.shoping.mpl 对应项目架构中的 Dao 层,dao 中定义的数据库操作接口,dao.impl 中定义具体的实现类。


3.3 service
com.mi.shoping.service 和 com.mi.shoping.service.impl 对应项目架构中的 Service 层。service 中定义业务逻辑接口,service.impl 中定义具体的业务逻辑实现类,根据不同的业务需求调用不同的 dao 实现类对象对数据库做 CRUD。

3.4 web
com.mi.shoping.web.servlet 和 com.mi.shoping.web.filter 对应项目架构中的 Web 层。根据不同的 Web 应用定义相应的 Servlet 代码。项目中依据不同的执行实体分别定义了对应的 Servlet 类。后续开发还将抽取 Servlet 中的通用功能,并单独封装为一个抽象类 BaseServlet,并作为其它 Servlet 的父类。使得代码结构更加整洁,便于维护和扩展。
BaseServlet类
package com.mi.shoping.web.servlet;
import com.mi.shoping.util.Constants;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;
/**
* 基础的Servlet 用来给其他的控制器继承的
*/
public class BaseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求参数中的标识
String methodStr = req.getParameter(Constants.TAG);
//如果方法中moth当中没有获取到标识 跳转到首页
if (methodStr==null && methodStr.equals("")){
methodStr = Constants.INDEX;
}
Class clazz = this.getClass();
try {
Method method = clazz.getMethod(methodStr, HttpServletRequest.class, HttpServletResponse.class);
//执行对应的方法
Object result = method.invoke(this, req, resp);
//集中处理返回的响应
if (result!=null){
String str = (String) result;
//转发
if (str.startsWith(Constants.FORWARD)){
//http://localhost:8080/forward:login.do
String path = str.substring(str.indexOf(Constants.FLAG)+1);
req.getRequestDispatcher(path).forward(req,resp);
}else if (str.startsWith(Constants.REDIRECT)){
//重定向操作
//http://localhost:8080/user.do?action=rediect:http://www.baidu.com
String path = str.substring(str.indexOf(Constants.INDEX)+1);
resp.sendRedirect(path);
}else {
//既不是转发也不是重定向
resp.getWriter().println(str);
}
}else {
//TODO
}
} catch (Exception e) {
e.printStackTrace();
req.getSession().setAttribute("Msg","程序异常请稍后再试");
//重定向到错误页面
resp.sendRedirect("/erro.html");
}
}
public String index(HttpServletRequest request,HttpServletResponse response){
return Constants.FORWARD+"/index.html";
}
}
UserServlet类
package com.mi.shoping.web.servlet;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(value = "/user.do")
public class UserServlet extends BaseServlet{
/**
* 用户登录
* @param request
* @param response
* @return
*/
public String login(HttpServletRequest request, HttpServletResponse response){
//http://localhost:8080/user.do?action=login
return "TODO这是用户登录功能";
}
}
启动Tomcat查看运行效果,如果默认弹出首页则表示控制器成功
输入地址//http://localhost:8080/user.do?action=login能看到输出返回TODO这是用户登录功能字符串,表示成功
`
本文档介绍了仿小米商城项目的启动,包括项目背景、主要功能、数据库设计和项目架构。项目采用JavaWeb技术,三层架构设计,前端使用HTML,后端使用Servlet、Filter和DAO。开发环境涉及Java、MySQL、Druid和Fastjson等,同时讨论了用户、商品、购物车和订单等模块的数据库表设计。
9575

被折叠的 条评论
为什么被折叠?



