文章目录
- 一.JavaWeb商城项目的促销功能模块【进阶版】开发过程记录
- 1.1 项目背景
- 1.2 需求分析
- 1.3 开发流程/顺序
- 二.促销页面(0.1颗星)
- 2.1 需求介绍
- 2.2 JSP页面
- 2.3效果展示
- 三,商品详情页面(0.2颗星)
- 3.1 需求介绍和效果图
- 3.2 数据库分析
- 3.2 Servlet层
- 3.3 Service层
- 3.4 DAO层
- 3.5 JSP页面
- 四,购物车页面(1颗星)
- 4.1需求介绍和效果图展示
- 4.2 数据库设计
- 4.3 Curriculums类
- 4.4 Servlet层
- 4.5 Order
- 4.6 CurriculumsDao
- 4.7 JSP页面
📗系列专栏: 本文写在上进小菜猪的JavaWeb专栏想要了解更多,请访问本专栏
一.JavaWeb商城项目的促销功能模块【进阶版】开发过程记录
1.1 项目背景
这是内科大2020届计科的JavaWeb的结课大作业。该作业要求设计一个原生的Javaweb项目。
- 本项目类型为:传统商城
- 本项目使用原生JavaWeb采用MVC架构,项目包括前台和后台
- 前台用于用户购买产品
- 后台用于管理
- 本项目数据库采用Mysql
- 本需求难度:0.8颗星
- 本次项目需求:促销模块(基础版)
本需求接上篇文章:JavaWeb商城项目的促销功能模块【基础版】
1.2 需求分析
系统新增功能扩展或优化功能:大家可以在本系统的基础上进行系统新增功能扩展或优化。如:评价,好评,差评,促销,优惠券,分期付款,售后,销售统计分析等等,这些只是一些提示,并不限于此。大家可以上淘宝、京东等网站找找系统新增功能扩展的思路。 11月5日晚7:00检查系统新增功能。
许多读者看完上篇【JavaWeb商城项目的促销功能模块【基础版】】感觉良好,觉得在此基础上可以再次进行完善功能,所以推出此功能的进阶版。
基础版实现了后台的一个促销功能的添加和删除,并且可以在前台新加的栏目——促销当中得以体现。
本文进阶版,在基础班的功能上新增加了打折的功能,类似优惠券的功能,详看下文解析。
1.3 开发流程/顺序
1.更改促销页面的价格显示。
2.增加数据库的商品字段——促销判断。
3.更改商品详情页面的价格显示。
4.更改购物车的价格计算规则。
难度等级介绍:5颗星为极难,1颗星为极易,依次类推。
二.促销页面(0.1颗星)
2.1 需求介绍
本次任务是实现:某一商品在后台设置为促销商品,让其自动的打6折,效果如下:并且保留2位小数。
2.2 JSP页面
涉及页面为:Curriculumsrecommend_list.jsp
1.我们这里如果打6折,无法避免出现小数除不尽的情况,所以我们引入JSP 标准标签库(JSTL)。在本jsp页面的上部加入:
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
下面这行为EL保留2位小数的标签语句:
<fmt:formatNumber type="number" value="${g.price*0.6 }" pattern="0.00" maxFractionDigits="2"/>
2.使用El语句写一个判断显示的逻辑:
<c:choose>
<c:when test="${t==4}"><span class="item_price">¥ <fmt:formatNumber type="number" value="${g.price*0.6 }" pattern="0.00" maxFractionDigits="2"/></span></c:when>
<c:otherwise><span class="item_price">¥ ${g.price}</span></c:otherwise>
</c:choose>
2.3效果展示
三,商品详情页面(0.2颗星)
3.1 需求介绍和效果图
大致样式如下,美化自己调一下。
3.2 数据库分析
我们观察recommend发现,在后台执行完类型的选择之后,会在recommend数据库里执行添加或者删除操作,观察发现,如果a商品添加到1类型会增加一条数据库记录,如果将a商品再添加2类型,又会增加一条数据库记录。
如果将a商品任意的从类型1或者2删除,那么对应的一条就会被删除。
我思考发现,如果写一个筛选语句,将符合的商品id对于的条目拿出来,如果含有类型为4的,就是正在促销的商品,问题也就解决了。
3.2 Servlet层
1.在Servlet层里写下指定类型的对象列表,调用Service。这里的id为商品id。
List<CommentRecommend> listtype= gService1.getCommenttypeById(id);
2.写一个简单的判断器,判断返回的list里的Type类型有没有包含4。
int flag=0;
for (CommentRecommend object : listtype) {
if(object.getType()==4){
flag=1;
}
else {
flag=0;
}
}
3.将上面的判断结果传递给前端进行判断渲染。
request.setAttribute("flag", flag);
3.3 Service层
com = ComDao.getCommenttypeById(id);
3.4 DAO层
1.写sql语句对目标进行筛选。
String sql = "select * from `recommend` where curriculums_id = ?";
- 返回值。
return queryRunner.query(sql, new BeanListHandler<CommentRecommend>(CommentRecommend.class),id);
3.5 JSP页面
本次涉及页面:Curriculums_detail.jsp
1.记得引入JSP 标准标签库(JSTL)。
2.写一个条件渲染。让类型为4的值乘以0.6。然后保留俩位小数。
<c:choose>
<c:when test="${flag==1}"><span class="item_price">促销商品已打六折:<br/>${g.price}X0.6=¥ <fmt:formatNumber type="number" value="${g.price*0.6 }" pattern="0.00" maxFractionDigits="2"/></span> </c:when>
<c:otherwise><span class="item_price">¥ ${g.price}</span></c:otherwise>
</c:choose>
四,购物车页面(1颗星)
4.1需求介绍和效果图展示
4.2 数据库设计
1.在商品的数据库里新增加字段:promotion。
如果promotion为4介绍目标商品:为打折商品。
4.3 Curriculums类
新加字段,Promotion为int类型,添加过程和上篇的isPromotion,方法相同,在这里不详细写了。
private int promotion;
4.4 Servlet层
到下面方法的源码中,添加上面数据库新加的字段。
o.addCurriculums(Curriculums);
4.5 Order
1.在addCurriculums方法中,在else里添加下面判断。
if(cu.getPromotion()==4){
item = new OrderItem((float) (cu.getPrice()*0.6),1,cu,this);
}
2.当然+1操作返回的,也不能拉下:
if(cu.getPromotion()==4){
total = (float) PriceUtils.add(total, cu.getPrice()*0.6);
}
else {
total = PriceUtils.add(total, cu.getPrice());
}
3.到了这一步我们尝试添加到购物车,发现还是不能自动打折,不要慌,因为我们promotion字段的值并没有传入到类对象里。
4.6 CurriculumsDao
1.到商品的Dao层,添加promotion字段。在getCurriculumsById方法中。
public Curriculums getCurriculumsById(int id) throws SQLException {
QueryRunner r = new QueryRunner(DataSourceUtils.getDataSource());
String sql = "select cu.id,cu.name,cu.cover,cu.image1,cu.image2,cu.price,cu.introduction,cu.stock,cu.duration,cu.quantity,cu.promotion,t.id typeid,t.name typename from Curriculums cu,type t where cu.id = ? and cu.type_id=t.id";
return r.query(sql, new BeanHandler<Curriculums>(Curriculums.class),id);
}
问题解决了。最后再解决一下前端页面显示问题就ok!
4.7 JSP页面
为了增加用户友好性,写一个简单的权限渲染,因为我们的原价都是整数,打折之后除了尾数为5的都是小数,时间问题和我原价没有以5结尾的商品,故,直接写了一个item.value.price*10%10==0,判断是否有小数的逻辑。
最后进行一下渲染,问题解决了,虽然不是很完美。
<c:choose>
<c:when test="${item.value.price*10%10==0}"><h3><span>单价: ¥ ${item.value.price}</span></h3></c:when>
<c:otherwise><h3><span>促销商品单价(打折后): ¥ ${item.value.price}</span></c:otherwise>
</c:choose>