图片 标题 Base属性直接装配到model中,然后使用themeleaf取值即可。说一下saleAttr
思路
- 通过session
一晚上解决跨域和序列化无效后,发现如果这个对象放到sesssion中,那么每个请求session的服务都需要有这个VO,然而这个VO是和product包下的entity关联的,最后失败,至少VO不应该装在公共类下 - 参考拼多多
在点击属性后不刷新页面,只有点击购买后在将数据提交。
问题1:第一次需要的数据太多,一个spu下的图片很多,响应时间过长,用户体验不好
问题2: 只发现手机端使用了这种方式,点击时刷新的还有标题,以我前端的水平,没有想到好方法 - 参考京东
第一次加载就为每一个属性添加一个data_id属性,来装载skuId,之后请求时只需要取出属性,来做简单的页面跳转,这里主要的难点就是如何取出data_id
已有条件:
- 一对多的属性表
- 当前sku的所有信息
- spuid
需求
- 获取每个销售属性,且每一个属性的属性值都要附带一个skuid信息,方便跳转
设计
sql
针对一个属性:
传入其他属性的属性值,得到这个属性的所有属性值和对应的skuId
思路就是其他属性传进去用or连接,如果一个值满足其他属性值,那么它出现的次数等于出现传入属性的个数,count一下。
select attr_id, attr_name, attr_value, sku_id
from pms_sku_sale_attr_value
where sku_id in (select sku_id
from pms_sku_sale_attr_value
where (attr_name = '颜色' and attr_value = '金色')
or (attr_name = '外存' and attr_value = '128G')
group by sku_id
having count(sku_id) = 2)
and attr_name != '颜色'
and attr_name != '外存'
and sku_id in (spu下的所有skuId)
这里如果关闭sql严格模式,可以省去一次子查询
mybatis映射
- 传入的属性为map,可以用foreach取值
- 最后结果集映射,value使用collection
<resultMap id="SaleAttrItemVO" type="com.chen.product.vo.SaleAttrItemVO">
<result property="attrId" column="attr_id"/>
<result property="attrName" column="attr_name"/>
<collection property="attrValues" ofType="com.chen.product.vo.AttrValue">
<result property="value" column="attr_value"/>
<result property="skuId" column="sku_id"/>
</collection>
</resultMap>
<select id="getAttrAllValuesBySpuId" parameterType="map" resultMap="SaleAttrItemVO">
select attr_id,attr_name,attr_value,sku_id from pms_sku_sale_attr_value where sku_id in (
select sku_id from pms_sku_sale_attr_value
where
<foreach collection="map.entrySet()" item="value" index="key" separator="or">
( attr_name = #{key}and attr_value = #{value})
</foreach>
group by sku_id
having count(sku_id) = ${map.size}
)
<foreach collection="map.entrySet()" item="value" index="key">
and attr_name != #{key}
</foreach>
and sku_id in
<foreach collection="list" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
</select>