项目3-商城-4-首页

话说:

各位读者,下午好,这里总结下首页显示商品。

目录:


1.效果展示
2.数据库设计
3.后端代码
4.首页代码
5.总结


开发工具:IDEA
难度系数:★★☆☆☆
建议用时:1.5~2H

1.效果展示

这里写图片描述

这里写图片描述

2.数据库设计

3张表,商品表、商品大类、商品小类。表之间的关系:商品表里面包含商品小类,商品大类和小类之间是一对多关系,这里就简单显示下。
创建表语句及模拟数据如下:

B 分类表
            #大分类表 tb_superType
            tb_superType
            ID int 
            typeName

#小分类表 tb-subType
            ID 
            superType 
            typeName 

#创建大分类表
            create table tb_superType (
                ID int identity(1,1) not null,
                typeName varchar(50)
            );

#创建小分类表
            create table tb_subType(
                ID int identity(1,1) not null,
                superType int,
                typeName varchar(50)
            );

#为大分类表插入数据
            insert into tb_superType (typeName) values
            ('图书类'),
            ('家电类'),
            ('服装类'),
            ('电子类');

#为小分类表插入数据
            insert into tb_subType (superType,typeName) values 
            (1,'文学'),
            (1,'理财'),
            (1,'哲学'),
            (1,'社会政治'),
            (2,'冰箱'),
            (2,'电视'),
            (2,'洗衣机'),
            (3,'男装'),
            (3,'女装'),
            (3,'童装'),
            (4,'笔记本'),
            (4,'台式机'),
            (4,'音响');



tb_goods
        A 商品表
        ID 商品Id 
        typeID  分类 
        goodsName 商品名称
        introduce 商品简介
        price 原价
        salePrice 售价
        count 库存
        addTime 录入时间
        picture 图片
        newGoods 是否新品 默认1为新品 0 不是
        sale 特价 认1为新品 0 不是
        hit 热门商品(点击次数)

            #创建表:
            create table tb_goods (
            ID int identity(1,1) not null,
            typeId int,
            goodsName varchar(200),
            introduce text,
            price money,
            salePrice money, 
            kuCun int,
            addTime datetime,
            picture varchar(50),
            newGoods int ,
            sale int ,
            hit int
            )--'商品表' ;



#模拟热门商品
            insert into tb_goods (typeId,goodsName,introduce,price,salePrice,kuCun,addTime,picture,newGoods,sale,hit) values 
            (2,'Yamaha/雅马哈 YHT-299','产品名称:Yamaha/雅马哈 YHT-299主机播放碟片格式: 无主机类型: 仅有功放无碟机毛重: 21kg视频连接方式: 无音效模式: DTS Dolby Pro Logic Dolby Pro Logic II音箱箱体材质: 塑料音箱连接方式: HDMI传输 光纤传输 同轴传输颜色分类: 黑色品牌: Yamaha/雅马哈型号: YHT-299声道数: 5.1款式: 卫星/迷你式是否DVD播放机: 不带DVD机输出功率: 601W(含)-800W(含) 最大输出功率: 675W',3356.23,4567.87,234,getdate(),'59.jpg',1,0,29);

    #模拟最新上架
            insert into tb_goods (typeId,goodsName,introduce,price,salePrice,kuCun,addTime,picture,newGoods,sale,hit) values 
            (12,'海尔电脑主机轰天雷X9','证书编号:2014010901684338证书状态:有效申请人名称:海尔信息科技(深圳)有限公司制造商名称:海尔信息科技(深圳)有限公司产品名称:微型计算机 产品名称:Haier/海尔 轰天雷X8-8G...CPU类型: Core/酷睿 i5型号: 4460适用品牌: Intel/英特尔台机Intel型号: 其他/other内存容量: 8GB内存类型: DDR3硬盘容量: 1T显卡类型: 独立显卡显卡型号: GTX950屏幕尺寸: 无显示器显示器类型: 无显示器操作系统: MS-DOS',3356.23,4567.87,234,getdate(),'54.jpg',1,0,0);


    .....       


#模拟打折商品
            insert into tb_goods (typeId,goodsName,introduce,price,salePrice,kuCun,addTime,picture,newGoods,sale,hit) values
            (10,'优贝宜 短袖T恤套装','品牌: Yobeyi/优贝宜安全等级: A类材质成分: 棉96% 聚氨酯弹性纤维(氨纶)4%货号: Y15282101适用性别: 中性颜色分类: 条纹猫头 围巾狗 面具 卡通大眼镜 卡通队长 高帽先生 小小熊 雪糕 小象灰 爆米花 熊 胡子 英文参考身高: 73cm 80cm 90cm 100cm 110cm 120cm 130cm 140cm 150cm 160cm 165cm模特实拍: 实拍无模特适用场景: 爱意表达按关系送礼: 孩子是否带帽子: 无组合形式: 其他面料: 纯棉(95%及以上)厚薄: 薄款适用季节: 夏季风格: 休闲衣门襟: 套头图案: 卡通动漫件数: 2件',3356.23,4567.87,234,getdate(),'42.jpg',0,1,0);

3.后端代码

Pojo GoodsDao GoodsDaoImpl GoodsListServlet

调用DBConn和之前不同的是:底层封装了下获取PreparedStatement的方法getPs()

//定义获取编译好的PreparedStatement 参数已经传进去
public static PreparedStatement getPs(Connection conn,String sql,Object... params) {
    try {
        //直接预编译SQL语句
        PreparedStatement ps = conn.prepareStatement(sql);
        //为参数赋值
        //判断是否给参数 select * from tb_goods;  select * from tb_goods where goodsId = ?
        if(params != null) {
            for(int i=0;i<params.length;i++) {
                ps.setObject((i+1),params[i]);
            }
        }
        return  ps;
    } catch (SQLException e) {
        e.printStackTrace();
        return null;
    }
}

Pojo
省略

GoodsDao

package com.hmc.dao;

import com.hmc.pojo.Goods;

import java.util.List;

public interface GoodsDao {
    //查询商品列表
    List<Goods> goodsList(String sql,Object[] params);

}

GoodsDaoImpl

package com.hmc.dao;

import com.hmc.pojo.Goods;
import com.hmc.utils.DBConn;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * User:Meice
 * 2018/2/27  14:06
 */
public class GoodsDaoImpl implements GoodsDao {
    @Override
    public List<Goods> goodsList(String sql, Object[] params) {
        List<Goods> goodsList = new ArrayList<>();
        Connection conn = DBConn.getConn();
        PreparedStatement ps = DBConn.getPs(conn,sql,params);
        ResultSet rs = DBConn.getRs(sql,ps);
        try {
            while(rs.next()) {
                Goods goods = new Goods();
                goods.setID(rs.getInt("ID"));
                goods.setTypeId(rs.getInt("typeId"));
                goods.setAddTime(rs.getDate("addTime"));
                goods.setGoodsName(rs.getString("goodsName"));
                goods.setIntroduce(rs.getString("introduce"));
                goods.setPrice(rs.getDouble("price"));
                goods.setSalePrice(rs.getDouble("salePrice"));
                goods.setKuCun(rs.getInt("kuCun"));
                goods.setPicture(rs.getString("picture"));
                goods.setNewsGoods(rs.getInt("newGoods"));
                goods.setSale(rs.getInt("sale"));
                goods.setHit(rs.getInt("hit"));
                goodsList.add(goods);
            }
            return goodsList;
        } catch (SQLException e) {
            e.printStackTrace();
            return  null;
        }

    }
}

GoodsListServlet

package com.hmc.servlet;

import com.hmc.dao.GoodsDao;
import com.hmc.dao.GoodsDaoImpl;
import com.hmc.dao.SuperTypeDao;
import com.hmc.dao.SuperTypeDaoImpl;
import com.hmc.pojo.Goods;
import com.hmc.pojo.SuperType;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

/**
 * User:Meice
 * 2018/2/27  11:28
 */
@WebServlet("/front/goodsList")
public class GoodsListServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("查询大分类进来了..");
        //1.接收参数

        //2.调用方法

        //1)显示大分类列表
        SuperTypeDao std = new SuperTypeDaoImpl();
        String sql = "select * from tb_superType";

        List<SuperType> superTypeList = std.superTypeList(sql,null);
        System.out.println("查询到的大分类列表是:"+superTypeList);


        //2)显示热门商品
        GoodsDao gd = new GoodsDaoImpl();
        String sql2 = "select  top 2 * from tb_goods order by hit desc ";
        List<Goods> goodsListByHit =     gd.goodsList(sql2,null);

        //3)最新上架
            String sql3 = "select top 6 * from tb_goods where newGoods = 1 order by addTime desc";
        List<Goods> goodsListByNew = gd.goodsList(sql3,null);

        //4)打折商品
        String sql4 = "select top 6 * from tb_goods where sale = 1 order by addTime desc";
        List<Goods> goodsListBySale = gd.goodsList(sql4,null);

        System.out.println("热门商品"+goodsListByHit+"    打折商品:"+goodsListBySale+"    最新上架:"+goodsListByNew);


        //3.跳转页面
        req.setAttribute("superTypeList",superTypeList);
        req.setAttribute("goodsListByHit",goodsListByHit);
        req.setAttribute("goodsListByNew",goodsListByNew);
        req.setAttribute("goodsListBySale",goodsListBySale);


        req.getRequestDispatcher("index.jsp").forward(req,resp);
    }
}

4.首页代码

<%--
  User: Meice
  Date: 2018/2/24
  Time: 11:43
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java"  isELIgnored="false" %>
<%@ taglib prefix="c"   uri="http://java.sun.com/jsp/jstl/core" %>
<%
    //http://localhost:3306/
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort();
    String pro = request.getContextPath();
    String wholePath = basePath+pro;

%>
<html>
<head>
    <title>小确幸商城</title>
    <%--引入juery--%>
    <script src="js/jquery-1.8.3.js"></script>
    <%--导航栏样式--%>
    <style type="text/css">
        a{
            text-decoration:none;
        }
        #nav ul li{
            list-style: none;
            float: left;
            padding: 17px;
            cursor: pointer;
            //border: 3px red solid;
            //height: 60px;
            //width:70px;
            text-align:center;


        }
        #nav ul  a{
            color:white;
            text-align:center;
           /* font-weight:bolder;*/
            font-size:18px;
        }

        #nav a{
           text-decoration:none;
        }

        .myIn{
            background-color: #9e2626;
        }
        .active{
            background-color: #9e2626;
        }

        /*设置图片样式*/
        #reMen img{
            height: 150px;
            width:150px;
        }

        #newGoods img{
            width:200px;
            height:200px;
        }
        #saleGoods img{
            width:200px;
            height:200px;
        }

    </style>

    <%--设置追加样式--%>
    <script type="text/javascript">
        $(function() {
            //alert("进来了");
            $("#nav ul li").mouseover(function() {

                $(this).addClass("myIn");
            }).mouseout(function() {
                $(this).removeClass("myIn");
            });

            //如果被点击,就追加样式 页面刷新 没效果 通过jsp做
            $("#nav ul li").click(function() {
                //alert("进来了!");
                $(this).addClass("active");

            });


        })

    </script>

    <%--轮播图 bootStrap--%>
    <link rel="stylesheet" href="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/css/bootstrap.min.css">
    <script src="http://cdn.static.runoob.com/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>


    <div id="top" style="height:30px;background-color: #f0f0f0">

        <div style="margin-left: 100px;">
            <span>电话&nbsp;&nbsp;888-88888888</span>
            <a href="login.jsp">登录</a>&nbsp;&nbsp;|
            <a href="register.jsp">注册</a>

        </div>

        <div style="float: right;margin: -10px 20px 0px 0px">
            <a href="#">我的订单</a>&nbsp;&nbsp;|
            <a href="#">我的收藏</a>

        </div>


    </div>



    <div id="search" style="height:45px;padding-top: 20px;">
        <div style="font-size: 35px; margin-left:100px;float:left;width:200px;">
            <font style="color:orange;"></font><font style="color:green;"></font><font style="color:blue;"></font>
            <font style="color:red;">商城</font></td>
        </div>

        <div style="float: right;margin: 0px 330px 0px 0px;">


            <input type="text" style="width:500px;height:45px;border: 1px solid orange;">
            <button type="button"  style="opacity: 1;height: 45px;width:70px;background-color: white;border: 1px solid orange;">
                <span class="glyphicon glyphicon-search"></span>
            </button>
        </div>

        <div style="float: right;margin: -45px 30px 0px 500px;">
            <button type="button" class="btn btn-primary btn-lg" style="background-color: white;color: red;">
                <span class="glyphicon glyphicon-shopping-cart"></span> 我的购物车
            </button>
          <%--  <a>我的购物车</a>--%>
            <%--<img src="">我的购物车--%></div>
    </div>

<div id="nav" style="background-color: #e33737;height:60px;margin: 50px 0px 0px 0px;">
        <ul>


                <a href="goodsList?typeId=10000"><li class="active">首页</li></a>

            <%--<a href="goodsList?typeId=10000"><li class="active">首页</li></a>--%>
            <%--遍历显示商品大分类--%>
            <c:forEach var="superType" items="${superTypeList}">

                    <a href="goodsList?typeId=${superType.ID}"> <li>${superType.typeName}</li></a>

            </c:forEach>

        </ul>

</div>


<div id="content">

    <%--轮播图--%>
        <div id="lunBo" style="width: 800px;height:360px;margin-top: 20px;margin-left: 30px; ">

            <div id="myCarousel" class="carousel slide">
                <!-- 轮播(Carousel)指标 -->
                <ol class="carousel-indicators">
                    <li data-target="#myCarousel" data-slide-to="0" class="active"></li>
                    <li data-target="#myCarousel" data-slide-to="1"></li>
                    <li data-target="#myCarousel" data-slide-to="2"></li>
                    <li data-target="#myCarousel" data-slide-to="3"></li>
                </ol>
                <!-- 轮播(Carousel)项目 -->
                <div class="carousel-inner">
                    <div class="item active">
                        <img src="images/img1.png" alt="First slide">
                    </div>
                    <div class="item">
                        <img src="images/img2.png" alt="Second slide">
                    </div>
                    <div class="item">
                        <img src="images/img3.png" alt="Third slide">
                    </div>
                   <div class="item">
                        <img src="images/img4.png" alt="Third slide">
                    </div>

                </div>
                <!-- 轮播(Carousel)导航 -->
                <a class="carousel-control left" href="#myCarousel"
                   data-slide="prev">&lsaquo;</a>
                <a class="carousel-control right" href="#myCarousel"
                   data-slide="next">&rsaquo;</a>
            </div>

        </div>


    <%--热门商品--%>
        <div id="reMen" style="float:right;height: 360px;width:400px;margin: -350px 90px 0px 0px;">
            <span style="color:red;font-size:15px;font-weight:bolder;">热门商品</span>
            <hr/>

            <table >

                <%--遍历--%>
                <c:forEach var="goods" items="${goodsListByHit}">

                    <tr>
                       <%-- <td><%=wholePath%>/images/goods/${goods.picture}</td>--%>
                        <td><img src="<%=wholePath%>/images/goods/${goods.picture}"></td>
                        <td>${goods.goodsName}</td>
                    </tr>
                </c:forEach>

            </table>

        </div>


        <span style="color:red;font-size:15px;font-weight:bolder;">最新上架</span>
        <hr/>

        <%--最新上架--%>
        <div id="newGoods">

            <table>

                <%--遍历--%>


                    <tr>
                        <c:forEach var="goods" items="${goodsListByNew}">

                                <td><img src="<%=wholePath%>/images/goods/${goods.picture}"></td>
                        </c:forEach>
                    </tr>

                            <tr>
                                <c:forEach var="goods" items="${goodsListByNew}">
                                <td>${goods.goodsName}</td>
                                </c:forEach>
                            </tr>





            </table>

        </div>
    <br/><br/>
    <span style="color:red;font-size:15px;font-weight:bolder;">打折商品</span>
    <hr/>

        <%--打折商品--%>
         <div id="saleGoods">

             <table >

                 <%--遍历--%>


                     <tr>
                     <c:forEach var="goods" items="${goodsListBySale}">

                         <td><img src="<%=wholePath%>/images/goods/${goods.picture}"></td>
                     </c:forEach>
                     </tr>
                         <tr>
                             <c:forEach var="goods" items="${goodsListBySale}">
                                <td>${goods.goodsName}</td>
                             </c:forEach>

                         </tr>

             </table>

         </div>

</div>


<div id="footNav">
    <jsp:include page="foot.jsp"></jsp:include>

</div>


</body>
</html>

5.总结


1.数据库方面没什么,不过显示前多少个可以用关键字top,比如:显示前6个商品:
select top 6 * from tb_goods;

2.首页轮播图及搜索、购物车小图标利用的是BootStrap,方便快捷;

3.首页导航栏,如何实现页面刷新时,被点击的商品大分类,比如图书能换背景色?
前端写搞不定,因为页面会刷新;JSP根据typeId来判断,但是首页没有存在数据库,会出现2个选项卡都
有选中背景色的情况,如何搞定?前端东西,不过多纠结;

4.jstl错误无非是:

1)page标签的url引入错误;
2)包虽然导入到IDEA中了,但是没有手动部署到IDEA的Tomcat下面,这个问题已经遇到很多啦。IDEA不会自动部署外部导入的包,需要手动部署。


哈哈哈,搞定! 再会!

内容概要:本文详细介绍了“秒杀商城”微服务架构的设计与实战全过程,涵盖系统从需求分析、服务拆分、技术选型到核心功能开发、分布式事务处理、容器化部署及监控链路追踪的完整流程。重点解决了高并发场景下的超卖问题,采用Redis预减库存、消息队列削峰、数据库乐观锁等手段保障数据一致性,并通过Nacos实现服务注册发现与配置管理,利用Seata处理跨服务分布式事务,结合RabbitMQ实现异步下单,提升系统吞吐能力。同时,项目支持Docker Compose快速部署和Kubernetes生产级编排,集成Sleuth+Zipkin链路追踪与Prometheus+Grafana监控体系,构建可观测性强的微服务系统。; 适合人群:具备Java基础和Spring Boot开发经验,熟悉微服务基本概念的中高级研发人员,尤其是希望深入理解高并发系统设计、分布式事务、服务治理等核心技术的开发者;适合工作2-5年、有志于转型微服务或提升架构能力的工程师; 使用场景及目标:①学习如何基于Spring Cloud Alibaba构建完整的微服务项目;②掌握秒杀场景下高并发、超卖控制、异步化、削峰填谷等关键技术方案;③实践分布式事务(Seata)、服务熔断降级、链路追踪、统一配置中心等企业级中间件的应用;④完成从本地开发到容器化部署的全流程落地; 阅读建议:建议按照文档提供的七个阶段循序渐进地动手实践,重点关注秒杀流程设计、服务间通信机制、分布式事务实现和系统性能优化部分,结合代码调试与监控工具深入理解各组件协作原理,真正掌握高并发微服务系统的构建能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值