开发详情页功能
一:业务介绍
商品详情页,以购物者的角度展现一个sku的详情信息。实现点击购买、放入购物车、切换商品销售属性如颜色,版本等等。
另外一个特点就是该页面的高访问量,虽然只是一个查询操作,但是由于频繁的访问所以我们必须对其性能进行最大程度的优化,提升页面的访问速度。
二:项目搭建
1.修改pom.xml
<parent>
<groupId>com.atguigu.gmall</groupId>
<artifactId>gmall-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>com.atguigu.gmall</groupId>
<artifactId>gmall-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.atguigu.gmall</groupId>
<artifactId>gmall-web-util</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
2.配置application.properties配置文件
spring.thymeleaf.mode=LEGACYHTML5
server.port=8084
spring.thymeleaf.cache=false
spring.dubbo.application.name=item-web
spring.dubbo.registry.protocol=zookeeper
spring.dubbo.registry.address=192.168.67.200:2181
spring.dubbo.base-package=com.atguigu.gmall
spring.dubbo.protocol.name=dubbo
spring.dubbo.consumer.timeout=10000
spring.dubbo.consumer.check=false
3.页面资源导入
4.测试项目是否正常
三:销售属性的处理
思路:
1、查出该商品的spu的所有销售属性和属性值 // 前台传参数skuId,查询出skuInfo,通过skuInfo.getSpuId()获得对应spuId 进而关联查询出该spu所有销售属性和属性值
2、标识出本商品对应的销售属性 // 查询sql语句中添加 IF(skv.sku_id IS NULL,0,1) is_checked 字段
3、点击其他销售属性值的组合,跳转到另外的sku页面
第一二步核心在于SpuSaleAttrMapper执行数据库查询时关联三张表以及添加is_checked 字段
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper SYSTEM "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<!--namespace:表示接口的全路径-->
<mapper namespace="com.atguigu.gmall0218.manage.mapper.SpuSaleAttrMapper">
<!--resultMap:返回结果集
id:表示唯一标识
type:返回结果集数据类型
autoMapping: 自动映射!
-->
<resultMap id="spuSaleAttrMap" type="com.atguigu.gmall0218.bean.SpuSaleAttr" autoMapping="true">
<!--id:表示主键
property:表示实体类的属性名
column:表中的字段名
-->
<id property="id" column="id"></id>
<!--普通字段-->
<!-- <result></result>-->
<!--mybatis 配置一对多-->
<!-- ofType: 返回集合的属性对象-->
<collection property="spuSaleAttrValueList" ofType="com.atguigu.gmall0218.bean.SpuSaleAttrValue" autoMapping="true">
<!--column="sale_attr_value_id",查询语句中字段名,并非一定是表中字段名-->
<id property="id" column="sale_attr_value_id"></id>
</collection>
<!--多对一-->
<!-- <association property=""></association>-->
</resultMap>
<!--id:方法名称-->
<!--#,$-->
<!-- 如果一个参数可以:
单纯只用mybatis 传入多个参数可以使用数字0,1,2代替传递的参数顺序!
-->
<select id="selectSpuSaleAttrList" resultMap="spuSaleAttrMap">
select sa.id ,sa.spu_id, sa.sale_attr_name,sa.sale_attr_id,
sv.id sale_attr_value_id,
sv.sale_attr_value_name
from spu_sale_attr sa inner join spu_sale_attr_value sv
on sa.spu_id=sv.spu_id and sa.sale_attr_id=sv.sale_attr_id
where sa.spu_id=#{0}
</select>
<!--通用mapper 中传递多个从参数的时候,需要使用arg0,arg1-->
<select id="selectSpuSaleAttrListCheckBySku" resultMap="spuSaleAttrMap">
SELECT sa.id ,sa.spu_id, sa.sale_attr_name,sa.sale_attr_id,
sv.id sale_attr_value_id,
sv.sale_attr_value_name,
skv.sku_id,
// 注意 IS NULL 不要写IS NOT NULL,sql优化
IF(skv.sku_id IS NULL,0,1) is_checked
FROM spu_sale_attr sa
INNER JOIN spu_sale_attr_value sv ON sa.spu_id=sv.spu_id AND sa.sale_attr_id=sv.sale_attr_id
LEFT JOIN sku_sale_attr_value skv ON skv.sale_attr_id= sa.sale_attr_id AND skv.sale_attr_value_id=sv.id AND skv.sku_id=#{arg0}
WHERE sa.spu_id=#{arg1}
ORDER BY sv.sale_attr_id,sv.id
</select>
</mapper>