admin管理员组文章数量:1535045
多线程异步任务的问题
例如a,b,c三个异步任务,不是随机运行就可以,它们还有一定的关系,c需要等待a的返回结果,b不需要等待谁的结果。
当异步任务产生一些关系和顺序之后,我们要编排好它们的关系进行调用,又是一个复杂的过程。
我们可以用CompletableFuture
来解决这个问题。
业务场景
查询商品详情页的逻辑比较复杂,有些数据还需要远程调用,必然需要花费更多的时间。
假如商品详情页的每个查询,需要如下标注的时间才能完成。
那么,用户需要 5.5s 后才能看到商品详情页的内容。很显然是不能接受的。
如果有多个线程同时完成这 6 步操作,也许只需要 1.5s 即可完成响应。
sku的所有信息异步查询是可以的,但是sku对应的spu的信息是需要获取到sku的基本信息之后才能获取。
CompletableFuture 异步编排
- CompletableFuture是java.util.concurrent包里面类
- 作用:原来使用串行执行的变为并行方式执行,提高代码执行速度
- CompletableFuture提供操作方法,多一个参数,用来传递自定义线程池,如果不进行传递使用默认线程池
静态方法创建
// runAsync函数都是没返回值的
public static CompletableFuture<Void> runAsync(Runnable runnable)
// executor 指定线程池
public static CompletableFuture<Void> runAsync(Runnable runnable,
Executor executor)
// supplyAsync 函数都是有返回值的
public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier)
public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier,
Executor executor)
package com.atlinxi.gulimall.search.thread;
import java.util.concurrent.*;
public class ThreadTest {
// 用Executors或new ThreadPoolExecutor()创建线程池实际上都是实现ExecutorService
// newFixedThreadPool 一个固定数量的线程池
// 这个线程池不应该是每一个异步任务都创建一个线程池
// 而是应该整个系统一个线程池,大家都把自己的任务交给这个池里执行
// 当前系统中池只有一两个,可能有核心业务的或者非核心业务的
// 每个异步任务,直接提交给线程池,让它自己去执行
public static ExecutorService executor = Executors.newFixedThreadPool(10);
public static void main(String[] args) throws ExecutionException, InterruptedException {
System.out.println("main...start...");
// CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
//
// System.out.println("当前线程:" + Thread.currentThread().getId());
//
// int i = 10 / 2;
//
// System.out.println("运行结果:" + i);
//
// }, executor);
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
System.out.println("当前线程:" + Thread.currentThread().getId());
int i = 10 / 2;
System.out.println("运行结果:" + i);
return i;
}, executor);
System.out.println("main...end..." + future.get());
}
以下方法只对CompletableFuture启动的异步任务有效
回调感知与异常处理 whenComplete()
whenComplete只能处理异常,不能处理(修改)返回值
// 与上一个函数,
// 也就是任务完成之后调用回调函数的那个函数用同一个线程
public CompletableFuture<T> whenComplete(
BiConsumer<? super T, ? super Throwable> action)
// 回调函数依然是异步的
// 从线程池中再取一个线程
// BiConsumer param1 结果,param2 异常
public CompletableFuture<T> whenCompleteAsync(
BiConsumer<? super T, ? super Throwable> action)
public CompletableFuture<T> whenCompleteAsync(
BiConsumer<? super T, ? super Throwable> action, Executor executor)
public CompletableFuture<T> exceptionally(
Function<Throwable, ? extends T> fn)
package com.atlinxi.gulimall.search.thread;
import java.util.concurrent.*;
public class ThreadTest {
// 用Executors或new ThreadPoolExecutor()创建线程池实际上都是实现ExecutorService
// newFixedThreadPool 一个固定数量的线程池
// 这个线程池不应该是每一个异步任务都创建一个线程池
// 而是应该整个系统一个线程池,大家都把自己的任务交给这个池里执行
// 当前系统中池只有一两个,可能有核心业务的或者非核心业务的
// 每个异步任务,直接提交给线程池,让它自己去执行
public static ExecutorService executor = Executors.newFixedThreadPool(10);
public static void main(String[] args) throws ExecutionException, InterruptedException {
System.out.println("main...start...");
// CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
//
// System.out.println("当前线程:" + Thread.currentThread().getId());
//
// int i = 10 / 2;
//
// System.out.println("运行结果:" + i);
//
// }, executor);
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
System.out.println("当前线程:" + Thread.currentThread().getId());
int i = 10 / 0;
System.out.println("运行结果:" + i);
return i;
}, executor).whenComplete((res,exception)->{
// 虽然能得到异常信息,但是没法修改返回数据
System.out.println("异步任务完成了。。。结果是:" + res + ";异常是:" + exception);
// 感知异常,同时返回默认值
}).exceptionally(throwable -> 10);
// 10
System.out.println("main...end..." + future.get());
}
回调处理与异常处理 handle()
handle()可以处理返回值,也可以处理异常
public <U> CompletableFuture<U> handle(
BiFunction<? super T, Throwable, ? extends U> fn)
public <U> CompletableFuture<U> handleAsync(
BiFunction<? super T, Throwable, ? extends U> fn)
public <U> CompletableFuture<U> handleAsync(
BiFunction<? super T, Throwable, ? extends U> fn, Executor executor)
/**
* 方法执行完成后的处理
*/
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
System.out.println("当前线程:" + Thread.currentThread().getId());
int i = 10 / 2;
System.out.println("运行结果:" + i);
return i;
}, executor).handle((res,exception)->{
if (res!=null){
return res * 2;
}
if (exception!=null){
return 0;
}
return 0;
});
线程串行化
// 启动线程后的异步任务完成后再启动一个线程任务,
// 可以感知到上一个线程的结果和这个线程任务的结果
public <U> CompletableFuture<U> thenApply(
Function<? super T,? extends U> fn)
public <U> CompletableFuture<U> thenApplyAsync(
Function<? super T,? extends U> fn)
public <U> CompletableFuture<U> thenApplyAsync(
Function<? super T,? extends U> fn, Executor executor)
// 启动线程后的异步任务完成后再启动一个线程任务,可以感知到上一个线程的结果
public CompletableFuture<Void> thenAccept(Consumer<? super T> action)
public CompletableFuture<Void> thenAcceptAsync(Consumer<? super T> action)
public CompletableFuture<Void> thenAcceptAsync(Consumer<? super T> action,
Executor executor)
// 启动线程后的异步任务完成后再启动一个线程任务,不能感知上一个线程的结果
public CompletableFuture<Void> thenRun(Runnable action)
public CompletableFuture<Void> thenRunAsync(Runnable action)
public CompletableFuture<Void> thenRunAsync(Runnable action,
Executor executor)
CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> {
System.out.println("当前线程:" + Thread.currentThread().getId());
int i = 10 / 2;
System.out.println("运行结果:" + i);
return i;
}, executor).thenApplyAsync((res)->{
System.out.println("任务2启动了" + res);
return res * 10;
},executor);
System.out.println("main...end..." + future1.get());
两任务组合 - 都要完成
两个任务都完成以后,再触发这个任务
// CompletableFuture 实现了 CompletionStage
// 就相当于传一个CompletableFuture
// 异步任务启动后再执行一个线程任务,两个任务都完成之后再执行other
// 三个任务均有返回值
// 组合两个futre的返回结果,并且返回当前任务的返回值
public <U,V> CompletableFuture<V> thenCombine(
CompletionStage<? extends U> other,
BiFunction<? super T,? super U,? extends V> fn)
public <U,V> CompletableFuture<V> thenCombineAsync(
CompletionStage<? extends U> other,
BiFunction<? super T,? super U,? extends V> fn)
public <U,V> CompletableFuture<V> thenCombineAsync(
CompletionStage<? extends U> other,
BiFunction<? super T,? super U,? extends V> fn, Executor executor)
// 异步任务启动后再执行一个线程任务,两个任务都完成之后再执行other
// 前两个任务均有返回值,该任务没有返回值
public <U> CompletableFuture<Void> thenAcceptBoth(
CompletionStage<? extends U> other,
BiConsumer<? super T, ? super U> action)
public <U> CompletableFuture<Void> thenAcceptBothAsync(
CompletionStage<? extends U> other,
BiConsumer<? super T, ? super U> action)
public <U> CompletableFuture<Void> thenAcceptBothAsync(
CompletionStage<? extends U> other,
BiConsumer<? super T, ? super U> action, Executor executor)
// 异步任务启动后再执行一个线程任务,两个任务都完成之后再执行action
// 三个任务均无返回值
public CompletableFuture<Void> runAfterBoth(CompletionStage<?> other,
Runnable action)
public CompletableFuture<Void> runAfterBothAsync(CompletionStage<?> other,
Runnable action)
public CompletableFuture<Void> runAfterBothAsync(CompletionStage<?> other,
Runnable action,
Executor executor)
CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> {
System.out.println("当前线程:" + Thread.currentThread().getId());
int i = 10 / 2;
System.out.println("运行结果:" + i);
return i;
}, executor);
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
return "hello";
}, executor);
CompletableFuture<String> future3 = future1.thenCombineAsync(future2, (res1, res2) -> {
return res1 + res2;
},executor);
System.out.println("main...end..." + future3.get());
两任务组合 - 一个完成
// 和上面的所有函数一样,有异步的,有可以指定线程池的
// 都是执行完其中任何一个任务就可以执行action
// 等待的任务不阻塞
// 两个任务均无返回值
public CompletableFuture<Void> runAfterEither(CompletionStage<?> other,
Runnable action)
// 上一个任务有返回值,这个任务无返回值
public CompletableFuture<Void> acceptEither(
CompletionStage<? extends T> other, Consumer<? super T> action)
// 两个任务都有返回值
public <U> CompletableFuture<U> applyToEitherAsync(
CompletionStage<? extends T> other, Function<? super T, U> fn,
Executor executor)
多任务组合
// 等待所有任务完成
public static CompletableFuture<Void> allOf(CompletableFuture<?>... cfs)
// 只要有一个任务完成
public static CompletableFuture<Object> anyOf(CompletableFuture<?>... cfs)
CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> {
System.out.println("future1:" + Thread.currentThread().getId());
int i = 10 / 2;
System.out.println("运行结果:" + i);
return i;
}, executor);
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
System.out.println("future2");
return "hello";
}, executor);
CompletableFuture<String> future3 = future1.thenCombineAsync(future2, (res1, res2) -> {
System.out.println("future3");
return res1 + res2;
},executor);
CompletableFuture<Void> future = CompletableFuture.allOf(future1, future2, future3);
// main...start...
// future1:22
// 运行结果:5
// future2
// future3
// main...end...
future.get(); // 等待所有结果完成
System.out.println("main...end...");
获取返回值
相同点
- get和join都是用来等待获取CompletableFuture执行异步的返回,都可以阻塞线程 —— 等所有任务都执行完了再执行后续代码
不同点
- get() :阻塞线程:主要可以: ①获取线程中的异常然后处理异常、②设置等待时间
- join() :阻塞线程:推荐使用 join() 方法,因为它没有受到 interrupt 的干扰,不需要捕获异常,也不需要强制类型转换。他自己会抛出异常。
join()方法抛出的是uncheckException异常(即RuntimeException),不会强制开发者抛出
/**
* Returns the result value when complete, or throws an
* (unchecked) exception if completed exceptionally. To better
* conform with the use of common functional forms, if a
* computation involved in the completion of this
* CompletableFuture threw an exception, this method throws an
* (unchecked) {@link CompletionException} with the underlying
* exception as its cause.
*
* @return the result value
* @throws CancellationException if the computation was cancelled
* @throws CompletionException if this future completed
* exceptionally or a completion computation threw an exception
*/
@SuppressWarnings("unchecked")
public T join() {
Object r;
if ((r = result) == null)
r = waitingGet(false);
return (T) reportJoin(r);
}
如上是join的备注,及对应的代码。会抛出异常 CancellationException | CompletionException ,但是join是unchecked的
private void testSupplyJoin() {
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
int i = 1 / 0;
return "test";
});
String result = future.join();
}
如上的调用所示:不需要是使用try-catch或者throws来对异常捕获或者抛出
- get()方法抛出的是经过检查的异常,ExecutionException, InterruptedException 需要用户手动处理(抛出或者 try catch)
/**
* Waits if necessary for this future to complete, and then
* returns its result.
*
* @return the result value
* @throws CancellationException if this future was cancelled
* @throws ExecutionException if this future completed exceptionally
* @throws InterruptedException if the current thread was interrupted
* while waiting
*/
@SuppressWarnings("unchecked")
public T get() throws InterruptedException, ExecutionException {
Object r;
if ((r = result) == null)
r = waitingGet(true);
return (T) reportGet(r);
}
如上的get代码所示:get会抛出InterruptedException, ExecutionException,那么外部就需要做对应的捕获操作,如下所示使用try-catch的方式
private void testSupplyGet() {
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
int i = 1 / 0;
return "test";
});
try {
String result = future.get();
} catch (ExecutionException | InterruptedException e) {
System.out.println(e);
}
}
商品详情
可以讲的点,确定sku销售属性
如上图,需要根据颜色和内存这两个销售属性的值确定sku,
思路是可以求出各销售属性的值分别被哪些sku所拥有,然后所有销售属性都拥有的那个sku就是被选中的sku
# pms_sku_info 求出spu所对应的sku
# 然后通过连接pms_sku_sale_attr_value,分组得到各属性值的所有sku
SELECT pss.attr_id attrId,
pss.attr_name attrName,
pss.attr_value attrValue,
GROUP_CONCAT(DISTINCT ps.sku_id) skuIds
FROM pms_sku_info ps
LEFT JOIN pms_sku_sale_attr_value pss ON ps.sku_id = pss.sku_id
WHERE spu_id = 6
GROUP BY pss.attr_id, pss.attr_name, pss.attr_value;
SELECT sku_id,spu_id FROM pms_sku_info;
SELECT attr_id,attr_name,attr_value,sku_id FROM pms_sku_sale_attr_value;
修改hots和gateway
修改windows本地hosts
192.168.56.10 gulimall.com
192.168.56.10 search.gulimall.com
192.168.56.10 item.gulimall.com
修改gateway路由
- id: gulimall_host_route
uri: lb://gulimall-product
predicates:
- Host=gulimall.com,item.gulimall.com
在linux宿主机/mydata/nginx/html/static/item上传item的静态文件,修改item.html文件的静态资源路径。
修改search模块的list.html
<p class="da">
<a th:href="|http://item.gulimall/${product.skuId}.html|">
<img th:src="${product.skuImg}" class="dim">
</a>
</p>
controller
package com.atlinxi.gulimall.product.web;
import com.atlinxi.gulimall.product.service.SkuInfoService;
import com.atlinxi.gulimall.product.vo.SkuItemVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import java.util.concurrent.ExecutionException;
@Controller
public class ItemController {
@Autowired
SkuInfoService skuInfoService;
/**
* 展示当前sku的详情
* @param skuId
* @return
*/
@GetMapping("/{skuId}.html")
public String skuItem(@PathVariable("skuId") Long skuId, Model model) throws ExecutionException, InterruptedException {
SkuItemVo skuItemVo = skuInfoService.item(skuId);
model.addAttribute("item",skuItemVo);
return "item";
}
}
service
SkuInfoServiceImpl
@Override
public SkuItemVo item(Long skuId) throws ExecutionException, InterruptedException {
SkuItemVo skuItemVo = new SkuItemVo();
CompletableFuture<SkuInfoEntity> infoFuture = CompletableFuture.supplyAsync(() -> {
// 1. sku基本信息获取 pms_sku_info
SkuInfoEntity info = getById(skuId);
skuItemVo.setInfo(info);
return info;
}, executor);
// 不后面直接.thenAcceptAsync的原因是
// thenAcceptAsync 是需要等待上一个任务完成后才启动下一个,就失去了异步的意义
CompletableFuture<Void> saleAttrFuture = infoFuture.thenAcceptAsync((res) -> {
// Long catalogId = res.getCatalogId();
// Long spuId = res.getSpuId();
// 3. 获取spu的销售属性组合
List<SkuItemSaleAttrVo> saleAttrVos = skuSaleAttrValueService.getSaleAttrsBySpuId(res.getSpuId());
skuItemVo.setSaleAttr(saleAttrVos);
}, executor);
CompletableFuture<Void> descFuture = infoFuture.thenAcceptAsync((res) -> {
// // 4. 获取spu的介绍 pms_spu_info_desc
SpuInfoDescEntity spuInfoDescEntity = spuInfoDescService.getById(res.getSpuId());
skuItemVo.setDesp(spuInfoDescEntity);
}, executor);
CompletableFuture<Void> baseAttrFuture = infoFuture.thenAcceptAsync((res) -> {
// // 5. 获取spu的规格参数信息
List<SpuItemAttrGroupVo> attrGroupVos = attrGroupService.getAttrGroupWithAttrsBySpuId(res.getSpuId(), res.getCatalogId());
skuItemVo.setGroupAttrs(attrGroupVos);
}, executor);
// 2. sku图片信息 pms_sku_images
// 这个和上面的没什么关系,也没有返回值,所以再创建一个异步任务就可以了
CompletableFuture<Void> imageFuture = CompletableFuture.runAsync(() -> {
List<SkuImagesEntity> images = imagesService.getImagesBySkuId(skuId);
skuItemVo.setImages(images);
}, executor);
// 等到所有任务都完成
// infoFuture 不写的原因是,其他异步任务需要关联它,其他的异步任务完了,它肯定就完了
CompletableFuture.allOf(saleAttrFuture, descFuture, baseAttrFuture, imageFuture).get();
return skuItemVo;
}
@Override
public List<SkuItemSaleAttrVo> getSaleAttrsBySpuId(Long spuId) {
SkuSaleAttrValueDao dao = this.baseMapper;
List<SkuItemSaleAttrVo> saleAttrVos = dao.getSaleAttrsBySpuId(spuId);
return saleAttrVos;
}
@Override
public List<SpuItemAttrGroupVo> getAttrGroupWithAttrsBySpuId(Long spuId, Long catalogId) {
// 1. 查出当前spu对应的所有属性的分组信息以及当前分组下的所有属性对应的值
AttrGroupDao baseMapper = this.getBaseMapper();
List<SpuItemAttrGroupVo> vos = baseMapper.getAttrGroupWithAttrsBySpuId(spuId,catalogId);
return vos;
}
@Override
public List<SkuImagesEntity> getImagesBySkuId(Long skuId) {
SkuImagesDao baseMapper = this.baseMapper;
List<SkuImagesEntity> imagesEntities = baseMapper.selectList(new QueryWrapper<SkuImagesEntity>().eq("sku_id", skuId));
return imagesEntities;
}
dao
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis//DTD Mapper 3.0//EN" "http://mybatis/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.atlinxi.gulimall.product.dao.SkuSaleAttrValueDao">
<!-- 可根据自己的需求,是否要使用 -->
<resultMap type="com.atlinxi.gulimall.product.entity.SkuSaleAttrValueEntity" id="skuSaleAttrValueMap">
<result property="id" column="id"/>
<result property="skuId" column="sku_id"/>
<result property="attrId" column="attr_id"/>
<result property="attrName" column="attr_name"/>
<result property="attrValue" column="attr_value"/>
<result property="attrSort" column="attr_sort"/>
</resultMap>
<resultMap id="SkuItemSaleAttrVo" type="com.atlinxi.gulimall.product.vo.SkuItemSaleAttrVo">
<result property="attrId" column="attrId"></result>
<result property="attrName" column="attrName"></result>
<collection property="attrValues" ofType="com.atlinxi.gulimall.product.vo.AttrValueWithSkuIdVo">
<result property="skuIds" column="skuIds"></result>
<result property="attrValue" column="attrValue"></result>
</collection>
</resultMap>
<select id="getSaleAttrsBySpuId" resultMap="SkuItemSaleAttrVo">
<!-- SELECT pss.attr_name attrName,pss.attr_id attrId,GROUP_CONCAT(DISTINCT pss.attr_value) attrValues
FROM pms_sku_info ps LEFT JOIN pms_sku_sale_attr_value pss ON ps.sku_id=pss.sku_id
WHERE spu_id = #{spuId} GROUP BY pss.attr_name,pss.attr_id -->
SELECT pss.attr_id attrId,
pss.attr_name attrName,
pss.attr_value attrValue,
GROUP_CONCAT(DISTINCT ps.sku_id) skuIds
FROM pms_sku_info ps
LEFT JOIN pms_sku_sale_attr_value pss ON ps.sku_id = pss.sku_id
WHERE spu_id = #{spuId}
GROUP BY pss.attr_id, pss.attr_name, pss.attr_value
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis//DTD Mapper 3.0//EN" "http://mybatis/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.atlinxi.gulimall.product.dao.AttrGroupDao">
<!-- 可根据自己的需求,是否要使用 -->
<resultMap type="com.atlinxi.gulimall.product.entity.AttrGroupEntity" id="attrGroupMap">
<result property="attrGroupId" column="attr_group_id"/>
<result property="attrGroupName" column="attr_group_name"/>
<result property="sort" column="sort"/>
<result property="descript" column="descript"/>
<result property="icon" column="icon"/>
<result property="catelogId" column="catelog_id"/>
</resultMap>
<!-- 自定义结果集,因为SkuItemVo.SpuItemAttrGroupVo里还有个对象,所以resultType不够用了
只要有嵌套属性就要封装自定义结果
-->
<resultMap id="SpuItemAttrGroupVo" type="com.atlinxi.gulimall.product.vo.SpuItemAttrGroupVo">
<result property="groupName" column="attr_group_name"></result>
<collection property="attrs" ofType="com.atlinxi.gulimall.product.vo.Attr">
<result column="attr_name" property="attrName"></result>
<result column="attr_value" property="attrValue"></result>
</collection>
</resultMap>
<select id="getAttrGroupWithAttrsBySpuId" resultMap="SpuItemAttrGroupVo">
select pav.spu_id,ag.attr_group_name,ag.attr_group_id,aar.attr_id,
attr.attr_name,pav.attr_value
from pms_attr_group ag
left join pms_attr_attrgroup_relation aar on aar.attr_group_id = ag.attr_group_id
left join pms_attr attr on attr.attr_id = aar.attr_id
left join pms_product_attr_value pav on pav.attr_id=attr.attr_id
where ag.catelog_id=#{catalogId} and pav.spu_id = #{spuId}
</select>
</mapper>
实体类
package com.atlinxi.gulimall.product.vo;
import com.atlinxi.gulimall.product.entity.SkuImagesEntity;
import com.atlinxi.gulimall.product.entity.SkuInfoEntity;
import com.atlinxi.gulimall.product.entity.SpuInfoDescEntity;
import lombok.Data;
import java.util.List;
@Data
public class SkuItemVo {
// 1. sku基本信息获取 pms_sku_info
private SkuInfoEntity info;
private boolean hasStock = true;
// 2. sku图片信息 pms_sku_images
private List<SkuImagesEntity> images;
// 3. 获取spu的销售属性组合
private List<SkuItemSaleAttrVo> saleAttr;
// 4. 获取spu的介绍
private SpuInfoDescEntity desp;
// 5. 获取spu的规格参数信息
private List<SpuItemAttrGroupVo> groupAttrs;
}
package com.atlinxi.gulimall.product.vo;
import lombok.Data;
import lombok.ToString;
import java.util.List;
@Data
@ToString
public class SkuItemSaleAttrVo {
private Long attrId;
private String attrName;
private List<AttrValueWithSkuIdVo> attrValues;
}
package com.atlinxi.gulimall.product.vo;
import lombok.Data;
@Data
public class AttrValueWithSkuIdVo {
private String attrValue;
private String skuIds;
}
package com.atlinxi.gulimall.product.vo;
import lombok.Data;
import lombok.ToString;
import java.util.List;
@Data
@ToString
public class SpuItemAttrGroupVo {
private String groupName;
private List<Attr> attrs;
}
maven
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache/POM/4.0.0" xmlns:xsi="http://www.w3/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache/POM/4.0.0 https://maven.apache/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.atlinxi.gulimall</groupId>
<artifactId>gulimall-product</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>gulimall-product</name>
<description>谷粒商城-商品服务</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2020.0.4</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>com.atlinxi.gulimall</groupId>
<artifactId>gulimall-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 由于SpringCloud Feign高版本不使用Ribbon而是使用spring-cloud-loadbalancer,
所以需要引用spring-cloud-loadbalancer或者降版本-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 页面渲染我们使用thymeleaf,这应该和freemarker是差不多的,都是模板引擎-->
<!-- 优点:它是一个自然化语言,编写的语言前端可以直接使用,方便前后人员的分工合作-->
<!-- 缺点:性能比其他模板引擎要低一点,但是我们在生产环境开启了它的缓存功能,性能也是很高的-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--
spring元数据处理器,加了就有提示了,不加也没任何问题
optional 依赖不会被传递
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- 解决thymeleaf页面修改必须得重启服务器的问题,页面修改之后,需要重新build修改的页面-->
<!-- 前提是需要关闭thymeleaf的缓存-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!-- 以后使用redisson作为所有分布式锁,分布式对象等功能框架-->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.12.0</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
线程池配置
package com.atlinxi.gulimall.product.config;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
// ThreadPoolConfigProperties 已经被注入容器了,就不需要这样配置了
//@EnableConfigurationProperties(ThreadPoolConfigProperties.class)
@Configuration
public class MyThreadConfig {
@Bean
public ThreadPoolExecutor threadPoolExecutor(ThreadPoolConfigProperties pool){
return new ThreadPoolExecutor(pool.getCoreSize(),pool.getMaxSize(),
pool.getKeepAliveTime(), TimeUnit.SECONDS,
new LinkedBlockingQueue<>(100000),
Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy()
);
}
}
package com.atlinxi.gulimall.product.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties("gulimall.thread")
@Component
@Data
public class ThreadPoolConfigProperties {
private Integer coreSize;
private Integer maxSize;
private Integer keepAliveTime;
}
// application.properties
#�Զ���������Щ
#CacheAutoConfiguration�ᵼ��RedisCacheConfiguration
#�Զ�����˻�������� RedisCacheManager
spring.cache.type=redis
# redis key ttl msΪ��λ
spring.cache.redis.time-to-live=3600000
# �����ǰ�����ָ����ǰ��������ָ����ǰ�����û�У���Ĭ��ʹ�û����������Ϊǰ
# @Cacheable(value = {"category"},key = "#root.method.name")
# category::getLevel1Categorys
# ��������ָ���ˣ�����
# CACHE_getLevel1Categorys
#spring.cache.redis.key-prefix=CACHE_
# �����ʹ��ǰ����ôע���к������ļ��еĶ�������Ч
# getLevel1Categorys
spring.cache.redis.use-key-prefix=true
# �Ƿ���ã���ֹ���洩
spring.cache.redis.cache-null-values=true
gulimall.thread.core-size=20
gulimall.thread.keep-alive-time=10
gulimall.thread.max-size=200
item.html
<!DOCTYPE html>
<!-- 添加thymeleaf名称空间,就可以用它的语法了-->
<html lang="en" xmlns:th="http://www.thymeleaf">
<html>
<head>
<meta charset="UTF-8">
<title></title>
<link rel="stylesheet" type="text/css" href="/static/item/scss/shop.css"/>
<link rel="stylesheet" type="text/css" href="/static/item/scss/jd.css"/>
<link rel="stylesheet" href="/static/item/scss/header.css"/>
<link rel="stylesheet" type="text/css" href="/static/item/bootstrap/css/bootstrap.css"/>
</head>
<body>
<div id="max">
<header>
<!--品牌官方网站-->
<div class="min">
<ul class="header_ul_left">
<li class="glyphicon glyphicon-home"><a href="/static/item/shouye.html" class="aa">京东首页</a></li>
<li class="glyphicon glyphicon-map-marker"><a href="/static/item/javascript:;">北京</a>
<ol id="beijing">
<li style="background: red;"><a href="/static/item/javascript:;" style="color: white;">北京</a>
</li>
<li><a href="/static/item/javascript:;">上海</a></li>
<li><a href="/static/item/javascript:;">天津</a></li>
<li><a href="/static/item/javascript:;">重庆</a></li>
<li><a href="/static/item/javascript:;">河北</a></li>
<li><a href="/static/item/javascript:;">山西</a></li>
<li><a href="/static/item/javascript:;">河南</a></li>
<li><a href="/static/item/javascript:;">辽宁</a></li>
<li><a href="/static/item/javascript:;">吉林</a></li>
<li><a href="/static/item/javascript:;">黑龙江</a></li>
<li><a href="/static/item/javascript:;">内蒙古</a></li>
<li><a href="/static/item/javascript:;">江苏</a></li>
<li><a href="/static/item/javascript:;">山东</a></li>
<li><a href="/static/item/javascript:;">安徽</a></li>
<li><a href="/static/item/javascript:;">浙江</a></li>
<li><a href="/static/item/javascript:;">福建</a></li>
<li><a href="/static/item/javascript:;">湖北</a></li>
<li><a href="/static/item/javascript:;">湖南</a></li>
<li><a href="/static/item/javascript:;">广东</a></li>
<li><a href="/static/item/javascript:;">广西</a></li>
<li><a href="/static/item/javascript:;">江西</a></li>
<li><a href="/static/item/javascript:;">四川</a></li>
<li><a href="/static/item/javascript:;">海南</a></li>
<li><a href="/static/item/javascript:;">贵州</a></li>
<li><a href="/static/item/javascript:;">云南</a></li>
<li><a href="/static/item/javascript:;">西藏</a></li>
<li><a href="/static/item/javascript:;">陕西</a></li>
<li><a href="/static/item/javascript:;">甘肃</a></li>
<li><a href="/static/item/javascript:;">青海</a></li>
<li><a href="/static/item/javascript:;">宁夏</a></li>
<li><a href="/static/item/javascript:;">新疆</a></li>
<li><a href="/static/item/javascript:;">港澳</a></li>
<li><a href="/static/item/javascript:;">台湾</a></li>
<li><a href="/static/item/javascript:;">钓鱼岛</a></li>
<li><a href="/static/item/javascript:;">海外</a></li>
</ol>
</li>
</ul>
<ul class="header_ul_right">
<li style="border: 0;"><a href="/static/item/../登录页面\index.html" class="aa">你好,请登录</a></li>
<li><a href="/static/item/../注册页面\index.html" style="color: red;">免费注册</a> |</li>
<li><a href="/static/item/javascript:;" class="aa">我的订单</a> |</li>
<li class="jingdong"><a href="/static/item/javascript:;">我的京东</a><span
class="glyphicon glyphicon-menu-down">|</span>
<ol class="jingdong_ol">
<li><a href="/static/item/javascript:;">待处理订单</a></li>
<li><a href="/static/item/javascript:;">消息</a></li>
<li><a href="/static/item/javascript:;">返修退换货</a></li>
<li><a href="/static/item/javascript:;">我的回答</a></li>
<li><a href="/static/item/javascript:;">降价商品</a></li>
<li><a href="/static/item/javascript:;">我的关注</a></li>
<li style="width: 100%;height: 1px;background: lavender;margin-top: 15px;"></li>
<li style="margin-top: 0;"><a href="/static/item/javascript:;">我的京豆</a></li>
<li style="margin-top: 0;"><a href="/static/item/javascript:;">我的优惠券</a></li>
<li style="margin-bottom: 10px;"><a href="/static/item/javascript:;">我的白条</a></li>
</ol>
</li>
<li><a href="/static/item/javascript:;" class="aa">京东会员</a> |</li>
<li><a href="/static/item/javascript:;" class="aa">企业采购</a> |</li>
<li class="fuwu"><a href="/static/item/javascript:;">客户服务</a><span
class="glyphicon glyphicon-menu-down"></span> |
<ol class="fuwu_ol">
<h6>客户</h6>
<li><a href="/static/item/javascript:;">帮助中心</a></li>
<li><a href="/static/item/javascript:;">售后服务</a></li>
<li><a href="/static/item/javascript:;">在线客服</a></li>
<li><a href="/static/item/javascript:;">意见建议</a></li>
<li><a href="/static/item/javascript:;">电话客服</a></li>
<li><a href="/static/item/javascript:;">客服邮箱</a></li>
<li style="margin-bottom: -5px;"><a href="/static/item/javascript:;">金融咨询</a></li>
<li style="margin-bottom: -5px;"><a href="/static/item/javascript:;">售全球客服</a></li>
<h6 style="border-top: 1px dashed darkgray;height: 30px;line-height: 30px;">商户</h6>
<li style="margin-top: -5px;"><a href="/static/item/javascript:;">合作招商</a></li>
<li style="margin-top: -5px;"><a href="/static/item/javascript:;">学习中心</a></li>
<li><a href="/static/item/javascript:;">商家后台</a></li>
<li><a href="/static/item/javascript:;">京麦工作台</a></li>
<li><a href="/static/item/javascript:;">商家帮助</a></li>
<li><a href="/static/item/javascript:;">规则平台</a></li>
</ol>
</li>
<li class="daohang"><a href="/static/item/javascript:;">网站导航</a><span
class="glyphicon glyphicon-menu-down"></span> |
<ol class="daohang_ol">
<li style="width: 34%;">
<h5>特色主题</h5>
<p>
<a href="/static/item/javascript:;">京东试用</a>
<a href="/static/item/javascript:;">京东金融</a>
<a href="/static/item/javascript:;">全球售</a>
<a href="/static/item/javascript:;">国际站</a>
</p>
<p>
<a href="/static/item/javascript:;">京东会员</a>
<a href="/static/item/javascript:;">京东预售</a>
<a href="/static/item/javascript:;">买什么</a>
<a href="/static/item/javascript:;">俄语站</a>
</p>
<p>
<a href="/static/item/javascript:;">装机大师</a>
<a href="/static/item/javascript:;">0元评测</a>
<a href="/static/item/javascript:;">定期送</a>
<a href="/static/item/javascript:;">港澳售</a>
</p>
<p>
<a href="/static/item/javascript:;">优惠券</a>
<a href="/static/item/javascript:;">秒杀</a>
<a href="/static/item/javascript:;">闪购</a>
<a href="/static/item/javascript:;">印尼站</a>
</p>
<p>
<a href="/static/item/javascript:;">京东金融科技</a>
<a href="/static/item/javascript:;">In货推荐</a>
<a href="/static/item/javascript:;">陪伴计划</a>
<a href="/static/item/javascript:;">出海招商</a>
</p>
</li>
<li>
<h5>行业频道</h5>
<p>
<a href="/static/item/javascript:;" class="aa_2">手机</a>
<a href="/static/item/javascript:;" class="aa_2">智能数码</a>
<a href="/static/item/javascript:;" class="aa_2">玩3C</a>
</p>
<p>
<a href="/static/item/javascript:;" class="aa_2">电脑办公</a>
<a href="/static/item/javascript:;" class="aa_2">家用电器</a>
<a href="/static/item/javascript:;" class="aa_2">京东智能</a>
</p>
<p>
<a href="/static/item/javascript:;" class="aa_2">服装城</a>
<a href="/static/item/javascript:;" class="aa_2">美妆馆</a>
<a href="/static/item/javascript:;" class="aa_2">家装城</a>
</p>
<p>
<a href="/static/item/javascript:;" class="aa_2">母婴</a>
<a href="/static/item/javascript:;" class="aa_2">食品</a>
<a href="/static/item/javascript:;" class="aa_2">运动户外</a>
</p>
<p>
<a href="/static/item/javascript:;" class="aa_2">农资频道</a>
<a href="/static/item/javascript:;" class="aa_2">整车</a>
<a href="/static/item/javascript:;" class="aa_2">图书</a>
</p>
</li>
<li>
<h5>生活服务</h5>
<p>
<a href="/static/item/javascript:;" class="aa_2">京东众筹</a>
<a href="/static/item/javascript:;" class="aa_2">白条</a>
<a href="/static/item/javascript:;" class="aa_2">京东金融APP</a>
</p>
<p>
<a href="/static/item/javascript:;" class="aa_2">京东小金库</a>
<a href="/static/item/javascript:;" class="aa_2">理财</a>
<a href="/static/item/javascript:;" class="aa_2">智能家电</a>
</p>
<p>
<a href="/static/item/javascript:;" class="aa_2">话费</a>
<a href="/static/item/javascript:;" class="aa_2">水电煤</a>
<a href="/static/item/javascript:;" class="aa_2">彩票</a>
</p>
<p>
<a href="/static/item/javascript:;" class="aa_2">旅行</a>
<a href="/static/item/javascript:;" class="aa_2">机票酒店</a>
<a href="/static/item/javascript:;" class="aa_2">电影票</a>
</p>
<p>
<a href="/static/item/javascript:;" class="aa_2">京东到家</a>
<a href="/static/item/javascript:;" class="aa_2">京东众测</a>
<a href="/static/item/javascript:;" class="aa_2">游戏</a>
</p>
</li>
<li style="border: 0;">
<h5>更多精选</h5>
<p>
<a href="/static/item/javascript:;" class="aa_2">合作招商</a>
<a href="/static/item/javascript:;" class="aa_2">京东通信</a>
<a href="/static/item/javascript:;" class="aa_2">京东E卡</a>
</p>
<p>
<a href="/static/item/javascript:;" class="aa_2">企业采购</a>
<a href="/static/item/javascript:;" class="aa_2">服务市场</a>
<a href="/static/item/javascript:;" class="aa_2">办公生活馆</a>
</p>
<p>
<a href="/static/item/javascript:;" class="aa_2">乡村招募</a>
<a href="/static/item/javascript:;" class="aa_2">校园加盟</a>
<a href="/static/item/javascript:;" class="aa_2">京友邦</a>
</p>
<p>
<a href="/static/item/javascript:;" class="aa_2">京东社区</a>
<a href="/static/item/javascript:;" class="aa_2">智能社区</a>
<a href="/static/item/javascript:;" class="aa_2">游戏社区</a>
</p>
<p>
<a href="/static/item/javascript:;" class="aa_2">知识产权维权</a>
<a href="/static/item/javascript:;" class="aa_2"></a>
<a href="/static/item/javascript:;" class="aa_2"></a>
</p>
</li>
</ol>
</li>
<li class="sjjd" style="border: 0;"><a href="/static/item/javascript:;" class="aa">手机京东</a>
<div class="er">
<div class="er_1">
<div class="er_1_1">
<h6><a href="/static/item/#">手机京东</a></h6>
<p>新人专享大礼包</p>
</div>
</div>
<div class="er_1">
<div class="er_1_1">
<h6><a href="/static/item/#">关注京东微信</a></h6>
<p>微信扫一扫关注新粉最高180元惊喜礼包</p>
</div>
</div>
<!--我的理财-->
<div class="er_1" style="border: 0;">
<img src="/static/item//static/item/img/5874a555Ne8192324.jpg"/>
<div class="er_1_1">
<h6><a href="/static/item/#">京东金融客户端</a></h6>
<p>新人专享大礼包</p>
<div><a href="/static/item/#"><img src="/static/item/img/11.png"/></a><a
href="/static/item/#"><img src="/static/item/img/22.png"/></a></div>
</div>
</div>
</div>
</li>
</ul>
</div>
</header>
<nav>
<div class="nav_min">
<div class="nav_top">
<div class="nav_top_one"><a href="/static/item/#"><img src="/static/item/img/111.png"/></a></div>
<div class="nav_top_two"><input type="text"/>
<button>搜索</button>
</div>
<div class="nav_top_three"><a href="/static/item/../JD_Shop/One_JDshop.html">我的购物车</a><span
class="glyphicon glyphicon-shopping-cart"></span>
<div class="nav_top_three_1">
<img src="/static/item/img/44.png"/>购物车还没有商品,赶紧选购吧!
</div>
</div>
</div>
<div class="nav_down">
<ul class="nav_down_ul">
<li class="nav_down_ul_1" style="width: 24%;float: left;"><a
href="/static/item/javascript:;">全部商品分类</a>
</li>
<li class="ul_li"><a href="/static/item/javascript:;">服装城</a></li>
<li class="ul_li"><a href="/static/item/javascript:;">美妆馆</a></li>
<li class="ul_li"><a href="/static/item/javascript:;">超市</a></li>
<li class="ul_li" style="border-right: 1px solid lavender;"><a
href="/static/item/javascript:;">生鲜</a></li>
<li class="ul_li"><a href="/static/item/javascript:;">全球购</a></li>
<li class="ul_li"><a href="/static/item/javascript:;">闪购</a></li>
<li class="ul_li" style="border-right: 1px solid lavender;"><a
href="/static/item/javascript:;">拍卖</a></li>
<li class="ul_li"><a href="/static/item/javascript:;">金融</a></li>
</ul>
</div>
</div>
</nav>
</div>
<div class="crumb-wrap">
<div class="w">
<div class="crumb">
<div class="crumb-item">
<a href="/static/item/">手机</a>
</div>
<div class="crumb-item sep">></div>
<div class="crumb-item">
<a href="/static/item/">手机通讯</a>
</div>
<div class="crumb-item sep">></div>
<div class="crumb-item">
<a href="/static/item/">手机</a>
</div>
<div class="crumb-item sep">></div>
<div class="crumb-item">
<div class="crumb-item-one">
华为 (HUAWEI)
<img src="/static/item/img/4a79b87a68623d4e8a73aff3e25fa99b.png" alt="" class="img"/>
<div class="crumb-item-two ">
<div class="crumb-item-con clear">
<ul class="con-ul">
<li>
<img src="/static/item/img/5825a5a6Nde8ecb75.jpg" alt=""/>
</li>
<li>
<p>
荣耀8青春版 全网通标配 3GB+32GB 幻海蓝
</p>
<p>
¥1099.00
</p>
</li>
</ul>
<ul class="con-ul">
<li>
<img src="/static/item/img/5919637aN271a1301.jpg" alt=""/>
</li>
<li>
<p>
荣耀8青春版 全网通标配 3GB+32GB 幻海蓝
</p>
<p>
¥1099.00
</p>
</li>
</ul>
<ul class="con-ul">
<li>
<img src="/static/item/img/599a806bN9d829c1c.jpg" alt=""/>
</li>
<li>
<p>
荣耀8青春版 全网通标配 3GB+32GB 幻海蓝
</p>
<p>
¥1099.00
</p>
</li>
</ul>
</div>
<div class="crumb-item-cons clear">
<ul>
<li>华为(huawei)</li>
<li>小米(xiaomi)</li>
<li>APPle</li>
<li>魅族(meizu)</li>
<li>锤子</li>
</ul>
<ul>
<li>三星</li>
<li>vivo</li>
<li>飞利浦</li>
<li>360</li>
<li>更多>></li>
</ul>
</div>
</div>
</div>
</div>
<div class="crumb-item sep">></div>
<div class="crumb-item">
华为Mate 10
</div>
</div>
<div class="contact">
<ul class="contact-ul">
<li>
<a href="/static/item/#">
华为京东自营官方旗舰店
</a>
<span class="contact-sp">
<span class="contact-sp1">
JD
</span>
<span class="contact-sp2">
自营
</span>
</span>
</li>
<li>
<a href="/static/item/#">
<img src="/static/item/img/f5831b9848b32440b381bcd30a3d96c7.png" alt=""/> 联系供应商
</a>
</li>
<li>
<a href="/static/item/#">
<img src="/static/item/img/81a6326edc82d343a5a8860a6970f93b.png" alt=""/> JIMI
</a>
</li>
<li>
<a href="/static/item/#">
<img src="/static/item/img/a400e3d61d5645459f769b00d9f431e7.png" alt=""/> 关注店铺
</a>
</li>
</ul>
<div class="contact-one">
<ul>
<li>客服</li>
<li><img src="/static/item/img/f5831b9848b32440b381bcd30a3d96c7.png" alt=""/>留言</li>
<li><img src="/static/item/img/81a6326edc82d343a5a8860a6970f93b.png" alt=""/>JIMI智能</li>
<li>
<img src="/static/item/img/1466134037230.jpg" class="contact-img"/>
<p>手机下单</p>
</li>
</ul>
<div class="contact-two">
<span><img src="/static/item/img/a400e3d61d5645459f769b00d9f431e7.png" alt=""/>进店逛逛</span>
<span><img src="/static/item/img/a400e3d61d5645459f769b00d9f431e7.png" alt=""/>关注店铺</span>
</div>
</div>
</div>
</div>
</div>
<div class="Shop">
<div class="box">
<div class="box-one ">
<div class="boxx">
<div class="imgbox">
<div class="probox">
<img class="img1" alt="" th:src="${item.info.skuDefaultImg}">
<div class="hoverbox"></div>
</div>
<div class="showbox">
<img class="img1" alt="" th:src="${item.info.skuDefaultImg}">
</div>
</div>
<div class="box-lh">
<div class="box-lh-one">
<ul>
<li th:each="img:${item.images}"><img th:src="${img.imgUrl}"/></li>
</ul>
</div>
<div id="left">
<
</div>
<div id="right">
>
</div>
</div>
<div class="boxx-one">
<ul>
<li>
<span>
<img src="/static/item/img/b769782fe4ecca40913ad375a71cb92d.png" alt=""/>关注
</span>
<span>
<img src="/static/item/img/9224fcea62bfff479a6712ba3a6b47cc.png" alt=""/>
对比
</span>
</li>
<li>
</li>
</ul>
</div>
</div>
<div class="box-two">
<div class="box-name" th:text="${item.info.skuTitle}">
</div>
<div class="box-hide" th:text="${item.info.skuSubtitle}">
<a href="/static/item/"><u></u></a>
</div>
<div class="box-yuyue">
<div class="yuyue-one">
<img src="/static/item/img/7270ffc3baecdd448958f9f5e69cf60f.png" alt=""/> 预约抢购
</div>
<div class="yuyue-two">
<ul>
<li>
<img src="/static/item/img/f64963b63d6e5849977ddd6afddc1db5.png"/>
<span>190103</span> 人预约
</li>
<li>
<img src="/static/item/img/36860afb69afa241beeb33ae86678093.png"/> 预约剩余
<span id="timer">
</span>
</li>
</ul>
</div>
</div>
<div class="box-summary clear">
<ul>
<li>京东价</li>
<li>
<span>¥</span>
<span th:text="${#numbers.formatDecimal(item.info.price,3,2)}"></span>
</li>
<li>
预约享资格
</li>
<li>
<a href="/static/item/">
预约说明
</a>
</li>
</ul>
</div>
<div class="box-wrap clear">
<div class="box-wrap-one clear">
<ul>
<li>增值业务</li>
<li><img src="/static/item/img/90a6fa41d0d46b4fb0ff6907ca17c478.png"/></li>
<li><img src="/static/item/img/2e19336b961586468ef36dc9f7199d4f.png"/></li>
<li><img src="/static/item/img/1f80c3d6fabfd3418e54b005312c00b5.png"/></li>
</ul>
</div>
</div>
<div class="box-stock">
<ul class="box-ul">
<li>配送至</li>
<li class="box-stock-li">
<div class="box-stock-one">
北京朝阳区管庄
<img src="/static/item/img/4a79b87a68623d4e8a73aff3e25fa99b.png" alt="" class="img"/>
</div>
<div class="box-stock-two">
<dl>
<dt>
<a>选择新地址</a>
<img src="/static/item/img/4a79b87a68623d4e8a73aff3e25fa99b.png" alt=""
class="box-stock-two-img"/>
</dt>
<dd>
<div class="box-stock-dd">
<div class="box-stock-top">
<div class="box-stock-div">北京</div>
<div class="box-stock-div">朝阳区</div>
<div class="box-stock-div">管庄</div>
</div>
<div class="box-stock-fot">
<div class="box-stock-con" style="display: block;">
<ul>
<li>北京</li>
<li>上海</li>
<li>天津</li>
<li>重庆</li>
</ul>
</div>
<div class="box-stock-con">
<ul>
<li>朝阳区</li>
<li>海淀区</li>
<li>东城区</li>
<li>西城区</li>
</ul>
</div>
<div class="box-stock-con">
<ul>
<li>4环到5环之内</li>
<li>管庄</li>
<li>北苑</li>
</ul>
</div>
</div>
</div>
</dd>
</dl>
</div>
</li>
<li>
<span th:text="${item.hasStock?'有货':'无货'}"></span>, 此商品暂时售完
</li>
</ul>
</div>
<div class="box-supply">
<ul class="box-ul">
<li></li>
<li>
由<span>京东</span> 发货,并提供售后服务
</li>
</ul>
</div>
<div class="box-attr-3">
<div class="box-attr clear" th:each="attr:${item.saleAttr}">
<dl>
<dt th:text="${attr.attrName}"></dt>
<dd th:each="vals:${attr.attrValues}">
<a th:href="${'#'}"
th:attr="skus=${vals.skuIds},class=${#lists.contains(#strings.listSplit(vals.skuIds,','),item.info.skuId.toString())?'sku_attr_value checked':'sku_attr_value'}">
[[${vals.attrValue}]]
<!-- <img src="/static/item/img/59ddfcb1Nc3edb8f1.jpg" />-->
</a>
</dd>
</dl>
</div>
</div>
<div class="box-btns clear">
<div class="box-btns-one">
<input type="text" name="" id="" value="1"/>
<div class="box-btns-one1">
<div>
<button id="jia">
+
</button>
</div>
<div>
<button id="jian">
-
</button>
</div>
</div>
</div>
<div class="box-btns-two">
<a href="/static/item/../商品分类\index.html">
立即预约
</a>
</div>
<div class="box-btns-three">
<img src="/static/item/img/e4ed3606843f664591ff1f68f7fda12d.png" alt=""/> 分享
</div>
</div>
<div class="box-footer-zo">
<div class="box-footer clear">
<dl>
<dt>本地活动</dt>
<dd>
<a href="/static/item/">
·1元500MB激活到账30元 >>
</a>
</dd>
</dl>
</div>
<div class="box-footer">
<dl>
<dt>温馨提示</dt>
<dd>·本商品不能使用 东券 京券</dd>
<dd>·请完成预约后及时抢购!</dd>
</dl>
</div>
</div>
</div>
</div>
</div>
<!--欲约抢购流程-->
<div class="qianggoulioucheng">
<div class="lioucheng">
<h3>欲约抢购流程</h3>
</div>
<!--抢购步骤-->
<ul class="qianggoubuzhao">
<li>
<img src="/static/item/img/shop_03.png"/>
<dl class="buzhou">
<dt>1.等待预约</dt>
<dl>预约即将开始</dl>
</dl>
</li>
<li>
<img src="/static/item/img/shop_04.png"/>
<dl class="buzhou">
<dt>2.预约中</dt>
<dl>2017-11-15 10:35 2017-11-15 23:59</dl>
</dl>
</li>
<li>
<img src="/static/item/img/shop_05.png"/>
<dl class="buzhou">
<dt>3.等待抢购</dt>
<dl>抢购即将开始</dl>
</dl>
</li>
<li>
<img src="/static/item/img/shop_06.png"/>
<dl class="buzhou">
<dt>4.抢购中</dt>
<dl></dl>
</dl>
</li>
</ul>
</div>
<div class="ShopXiangqing">
<div class="allLeft">
<!--火热预约-->
<div class="huoreyuyue">
<h3>火热预约</h3>
</div>
<div class="dangeshopxingqing">
<ul class="shopdange">
<li>
<a href="/static/item/##"><img src="/static/item/img/5a0afeddNb34732af.jpg"/></a>
<p>
<a href="/static/item/##">OPPO R11s Plus 双卡双待全面屏拍照手机香槟色 全网通(6G RAM+64G ROM)标配</a>
</p>
<p><strong class="J-p-20015341974">¥3699.00</strong></p>
</li>
<li>
<a href="/static/item/##"><img src="/static/item/img/5a12873eN41754123.jpg"/></a>
<p>
<a target="_blank" title="詹姆士(GEMRY) R19plus全网通4G 智能手机 双卡双待 6+128GB 鳄鱼纹雅致版(新品预约)"
href="/static/item///item.jd/20348283521.html">詹姆士(GEMRY) R19plus全网通4G 智能手机 双卡双待
6+128GB 鳄鱼纹雅致版(新品预约)</a>
</p>
<p><strong class="J-p-20348283521">¥13999.00</strong></p>
</li>
<li>
<a href="/static/item/##"><img src="/static/item/img/59ec0131Nf239df75.jpg"/></a>
<p>
<a target="_blank" title="斐纳(TOMEFON) 德国家用无线无绳手持立式充电吸尘器 静音大吸力吸尘器TF-X60"
href="/static/item///item.jd/16683419775.html">斐纳(TOMEFON) 德国家用无线无绳手持立式充电吸尘器
静音大吸力吸尘器TF-X60</a>
</p>
<p><strong class="J-p-16683419775">¥1599.00</strong></p>
</li>
<li>
<a href="/static/item/##"><img src="/static/item/img/59015444N27317512.jpg"/></a>
<p>
<a target="_blank" title="斐纳(TOMEFON) 扫地机器人德国智能导航规划全自动超薄扫地机器人吸尘器TF-D60 香槟金"
href="/static/item///item.jd/12187770381.html">斐纳(TOMEFON)
扫地机器人德国智能导航规划全自动超薄扫地机器人吸尘器TF-D60 香槟金</a>
</p>
<p><strong class="J-p-12187770381">¥2599.00</strong></p>
</li>
</ul>
</div>
<!--看了又看-->
<div class="huoreyuyue">
<h3>看了又看</h3>
</div>
<div class="dangeshopxingqing">
<ul class="shopdange">
<li>
<a href="/static/item/##"><img src="/static/item/img/59e55e01N369f98f2.jpg"/></a>
<p>
<a target="_blank" title="华为(HUAWEI) 华为 Mate10 4G手机 双卡双待 亮黑色 全网通(6GB RAM+128GB ROM)"
href="/static/item///item.jd/17931625443.html">华为(HUAWEI) 华为 Mate10 4G手机 双卡双待 亮黑色
全网通(6GB RAM+128GB ROM)</a>
<p><strong class="J-p-17931625443">¥4766.00</strong></p>
</li>
<li>
<a href="/static/item/##"><img src="/static/item/img/584fcc3eNdb0ab94c.jpg"/></a>
<p>
<a target="_blank" title="华为 Mate 9 Pro 6GB+128GB版 琥珀金 移动联通电信4G手机 双卡双待"
href="/static/item///item.jd/3749093.html">华为 Mate 9 Pro 6GB+128GB版 琥珀金 移动联通电信4G手机
双卡双待</a>
</p>
<p><strong class="J-p-3749093">¥4899.00</strong></p>
</li>
<li>
<!--shopjieshao-->
<a href="/static/item/##"><img src="/static/item/img/59eb0df9Nd66d7585.jpg"/></a>
<p>
<a target="_blank" title="华为(HUAWEI) 华为 Mate10 手机 亮黑色 全网通(4+64G)标准版"
href="/static/item///item.jd/12306211773.html">华为(HUAWEI) 华为 Mate10 手机 亮黑色
全网通(4+64G)标准版</a>
</p>
<p><strong class="J-p-12306211773">¥4088.00</strong></p>
</li>
<li>
<a href="/static/item/##"><img src="/static/item/img/5a002ba3N126c2f73.jpg"/></a>
<p>
<a target="_blank" title="斐纳(TOMEFON) 扫地机器人德国智能导航规划全自动超薄扫地机器人吸尘器TF-D60 香槟金"
href="/static/item///item.jd/12187770381.html">斐纳(TOMEFON)
扫地机器人德国智能导航规划全自动超薄扫地机器人吸尘器TF-D60 香槟金</a>
</p>
<p><strong class="J-p-12187770381">¥2599.00</strong></p>
</li>
</ul>
<img src="/static/item/img/5a084a1aNa1aa0a71.jpg"/>
</div>
</div>
<!--商品介绍-->
<div class="allquanbushop">
<ul class="shopjieshao">
<li class="jieshoa" style="background: #e4393c;">
<a href="/static/item/##" style="color: white;">商品介绍</a>
</li>
<li class="baozhuang">
<a href="/static/item/##">规格与包装</a>
</li>
<li class="baozhang">
<a href="/static/item/##">售后保障</a>
</li>
<li class="pingjia">
<a href="/static/item/##">商品评价(4万+)</a>
</li>
<li class="shuoming">
<a href="/static/item/##">预约说明</a>
</li>
</ul>
<button class="Lijiyuyuessss">
立即预约
</button>
<ul class="shopjieshaos posi" style="display: none;">
<li class="jieshoa" style="background: #e4393c;">
<a href="/static/item/#li1" style="color: white;">商品介绍</a>
</li>
<li class="baozhuang">
<a href="/static/item/#li2">规格与包装</a>
</li>
<li class="baozhang">
<a href="/static/item/#li3">售后保障</a>
</li>
<li class="pingjia">
<a href="/static/item/#li4">商品评价(4万+)</a>
</li>
<li class="shuoming">
<a href="/static/item/#li5">预约说明</a>
</li>
</ul>
<!--商品详情-->
<div class="huawei">
<ul class="xuanxiangka">
<li class="jieshoa actives" id="li1">
<div class="shanpinsssss">
<p>
<a href="/static/item/#">品牌:华为(HUAWEI)</a>
</p>
<table>
<tr>
<td>
<a href="/static/item/##">商品名称:华为Mate 10</a>
</td>
<td>
<a href="/static/item/##">商品毛重:0.58kg</a>
</td>
<td>
<a href="/static/item/##">商品编号:5544038</a>
</td>
<td>
<a href="/static/item/##">商品产地:中国大陆</a>
</td>
</tr>
<tr>
<td>
<a href="/static/item/##">系统:安卓(Android)</a>
</td>
<td>
<a href="/static/item/##">前置摄像头像素:800万-1599万</a>
</td>
<td>
<a href="/static/item/##">后置摄像头像素:2000万及以上,1200万-1999万</a>
</td>
<td>
<a href="/static/item/##">机身内存:128GB</a>
</td>
</tr>
<tr>
<td colspan="4">
<a href="/static/item/##">全面屏,双卡双待,指纹识别,Type-C,VoLTE,2K屏,拍照神器,支持NFC,商务手机,安全手机,分辨率10</a>
</td>
</tr>
</table>
<img class="xiaoguo" src="/static/item/img/5a0d4181Nf70c5ebf.jpg"/>
<div class="guiGebox guiGebox1">
<div class="guiGe">
<h3>主体</h3>
<dl>
<dt>品牌</dt>
<dd>华为(HUAWEI)</dd>
<dt>型号</dt>
<dd class="Ptable-tips">
<a href="/static/item/#"><i>?</i></a>
</dd>
<dd>ALP-AL00</dd>
<dt>入网型号</dt>
<dd class="Ptable-tips">
<a href="/static/item/#"><i>?</i></a>
</dd>
<dd>ALP-AL00</dd>
<dt>上市年份</dt>
<dd>2017年</dd>
<dt>上市时间</dt>
<dd>10月</dd>
</dl>
</div>
<div class="guiGe">
<h3>基本信息</h3>
<dl>
<dt>机身颜色</dt>
<dd>亮黑色</dd>
<dt>机身长度(mm)</dt>
<dd>150.5</dd>
<dt>机身宽度(mm)</dt>
<dd>77.8</dd>
<dt>机身厚度(mm)</dt>
<dd>8.2</dd>
<dt>机身重量(g)</dt>
<dd>约186g(含电池)</dd>
<dt>输入方式</dt>
<dd>触控</dd>
<dt>运营商标志与内容</dt>
<dd class="Ptable-tips">
<a href="/static/item/#"><i>?</i></a>
</dd>
<dd>无</dd>
<dt>机身材质分类</dt>
<dd>金属边框;玻璃后盖</dd>
<dt>机身材质工艺</dt>
<dd>四曲面玻璃后壳</dd>
</dl>
</div>
<div class="guiGe">
<h3>操作系统</h3>
<dl>
<dt>操作系统</dt>
<dd>Android</dd>
<dt>操作系统版本</dt>
<dd>华为 EMUI 8.0</dd>
</dl>
</div>
<div class="guiGe">
<h3>主芯片</h3>
<dl>
<dt>CPU品牌</dt>
<dd>海思(Hisilicon)</dd>
<dt>CPU频率</dt>
<dd>4*Cortex A73 2.36GHz + 4*Cortex A53 1.8GHz</dd>
<dt>CPU核数</dt>
<dd>八核</dd>
<dt>CPU型号</dt>
<dd>麒麟970</dd>
</dl>
</div>
<div class="guiGe">
<h3>网络支持</h3>
<dl>
<dt>双卡机类型</dt>
<dd>双卡双待单通</dd>
<dt>最大支持SIM卡数量</dt>
<dd>2个</dd>
<dt>SIM卡类型</dt>
<dd class="Ptable-tips">
<a href="/static/item/#"><i>?</i></a>
</dd>
<dd>Nano SIM</dd>
<dt>4G网络</dt>
<dd class="Ptable-tips">
<a href="/static/item/#"><i>?</i></a>
</dd>
<dd>4G:移动(TD-LTE);4G:联通(FDD-LTE);4G:电信(FDD-LTE);4G:联通(TD-LTE)</dd>
<dt>3G/2G网络</dt>
<dd>3G:移动(TD-LTE);4G:联通(WCDMA);3G:电信(CDMA2000);2G:移动联通(GSM)+ 电信(CDMA)</dd>
<dt>副SIM卡类型</dt>
<dd class="Ptable-tips">
<a href="/static/item/#"><i>?</i></a>
</dd>
<dd>副SIM卡与存储卡二选一</dd>
<dt>副SIM卡4G网络</dt>
<dd class="Ptable-tips">
<a href="/static/item/#"><i>?</i></a>
</dd>
<dd>4G:移动(TD-LTE);4G:联通(FDD-LTE);4G:电信(FDD-LTE);4G:联通(TD-LTE)</dd>
<dt>副SIM卡3G/2G网络</dt>
<dd>不支持主副卡同时使用电信卡;3G联通(WCDMA);3G:电信(CDMA2000);2G:移动联通(GSM)+电信(CDMA)</dd>
<dt>网络频率(2G/3G)</dt>
<dd>2G:GSM 850/900/1800/1900;2G:CDMA 800;3G:TD-SCDMA 1900/2000;3G:WCDMA
850/900/1900/2100;3G
</dd>
<dd>CDMA2000;3G:CDMA 800MHz 1X&EVDO ;3G:WCDMA:850/900/1700/1900/2100MHz</dd>
</dl>
</div>
<div class="guiGe">
<h3>存储</h3>
<dl>
<dt>ROM</dt>
<dd class="Ptable-tips">
<a href="/static/item/#"><i>?</i></a>
</dd>
<dd>128GB</dd>
<dt>RAM</dt>
<dd class="Ptable-tips">
<a href="/static/item/#"><i>?</i></a>
</dd>
<dd>6GB</dd>
<dt>存储卡</dt>
<dd>支持MicroSD(TF)</dd>
<dt>最大存储扩展容量</dt>
<dd>256GB</dd>
</dl>
</div>
<div class="guiGe">
<h3>屏幕</h3>
<dl>
<dt>主屏幕尺寸(英寸)</dt>
<dd>5.9英寸</dd>
<dt>分辨率</dt>
<dd>2560X1400(Quad HD/2k)</dd>
<dt>屏幕材质类型</dt>
<dd>TFT</dd>
</dl>
</div>
<div class="guiGe">
<h3>前置摄像头</h3>
<dl>
<dt>前置摄像头</dt>
<dd>800万像素</dd>
<dt>前摄光圈大小</dt>
<dd>f/2.0</dd>
<dt>美颜技术</dt>
<dd>支持</dd>
</dl>
</div>
<!--nav-->
<div class="guiGe">
<h3>后置摄像头</h3>
<dl>
<dt>摄像头数量</dt>
<dd class="Ptable-tips">
<a href="/static/item/#"><i>?</i></a>
</dd>
<dd>2个</dd>
<dt>后置摄像头</dt>
<dd>1200万像素;2000万像素</dd>
<dt>摄像头光圈大小</dt>
<dd>其他</dd>
<dt>闪光灯</dt>
<dd>双色温双LED闪光灯</dd>
<dt>美颜技术</dt>
<dd>支持</dd>
<dt>副摄像头光圈大小</dt>
<dd>其他</dd>
<dt>照片最大分辨率</dt>
<dd>5120X3840</dd>
<dt>拍照特点</dt>
<dd>数码变焦;自动对焦;防抖;美颜;连拍;微距;全景;滤镜;场景模式;HDR;PDAF;夜间拍摄;微信小视频;有声照片;</dd>
<dd>水印;美肤录像;全像素双核激光对焦拍摄</dd>
</dl>
</div>
<div class="guiGe">
<h3>电池信息</h3>
<dl>
<dt>电池容量(mAh)</dt>
<dd>4000(典型值)</dd>
<dt>电池类型</dt>
<dd>锂聚合物电池</dd>
<dt>电池是否可拆卸</dt>
<dd class="Ptable-tips">
<a href="/static/item/#"><i>?</i></a>
</dd>
<dd>否</dd>
<dt>充电器</dt>
<dd>5V/4.5A</dd>
<dt>快速充电</dt>
<dd>华为超级快充</dd>
</dl>
</div>
<div class="guiGe">
<h3>娱乐功能</h3>
<dl>
<dt>mic数量</dt>
<dd>3个</dd>
</dl>
</div>
<div class="guiGe">
<h3>数据接口</h3>
<dl>
<dt>数据传输接口</dt>
<dd>红外;WIFI;NFC;蓝牙;WiFi热点</dd>
<dt>NFC/NFC模式</dt>
<dd>支持(点对点模式);支持(读卡器模式);支持卡模拟</dd>
<dt>耳机接口类型</dt>
<dd>3.5mm</dd>
<dt>充电接口类型</dt>
<dd>Type-C</dd>
<dt>数据线</dt>
<dd>其他</dd>
</dl>
</div>
<div class="guiGe">
<h3>手机特性</h3>
<dl>
<dt>指纹识别</dt>
<dd>支持</dd>
<dt>语音识别</dt>
<dd>支持</dd>
<dt>GPS</dt>
<dd>支持</dd>
<dt>电子罗盘</dt>
<dd>支持</dd>
<dt>霍尔感应器</dt>
<dd>支持</dd>
<dt>陀螺仪</dt>
<dd>支持</dd>
<dt>红外遥控</dt>
<dd>支持</dd>
<dt>适配VR</dt>
<dd>支持</dd>
<dt>其他</dt>
<dd>呼气灯;多麦降噪技术;光线感应</dd>
</dl>
</div>
<div class="guiGe">
<h3>辅助功能</h3>
<dl>
<dt>常用功能</dt>
<dd>录音;手势识别;便签;超大字体;SOS功能;重礼感应</dd>
<dt>其他1</dt>
<dd>智能识屏</dd>
<dt>其他特性</dt>
<dd>手套模式</dd>
<dt>其他2</dt>
<dd>单手操作</dd>
</dl>
</div>
<div class="package-list">
<h3>包装清单</h3>
<p>手机(含内置电池) X 1、5A大电流华为SuperCharge充电器X 1、5A USB数据线 X 1、半入耳式线控耳机 X 1、快速指南X 1、三包凭证 X
1、取卡针 X 1、保护壳 X 1</p>
</div>
</div>
</div>
</li>
<li class="baozhuang actives" id="li2">
<div class="guiGebox">
<div class="guiGe">
<h3>主体</h3>
<dl>
<dt>品牌</dt>
<dd>华为(HUAWEI)</dd>
<dt>型号</dt>
<dd class="Ptable-tips">
<a href="/static/item/#"><i>?</i></a>
</dd>
<dd>ALP-AL00</dd>
<dt>入网型号</dt>
<dd class="Ptable-tips">
<a href="/static/item/#"><i>?</i></a>
</dd>
<dd>ALP-AL00</dd>
<dt>上市年份</dt>
<dd>2017年</dd>
<dt>上市时间</dt>
<dd>10月</dd>
</dl>
</div>
<div class="guiGe">
<h3>基本信息</h3>
<dl>
<dt>机身颜色</dt>
<dd>亮黑色</dd>
<dt>机身长度(mm)</dt>
<dd>150.5</dd>
<dt>机身宽度(mm)</dt>
<dd>77.8</dd>
<dt>机身厚度(mm)</dt>
<dd>8.2</dd>
<dt>机身重量(g)</dt>
<dd>约186g(含电池)</dd>
<dt>输入方式</dt>
<dd>触控</dd>
<dt>运营商标志与内容</dt>
<dd class="Ptable-tips">
<a href="/static/item/#"><i>?</i></a>
</dd>
<dd>无</dd>
<dt>机身材质分类</dt>
<dd>金属边框;玻璃后盖</dd>
<dt>机身材质工艺</dt>
<dd>四曲面玻璃后壳</dd>
</dl>
</div>
<div class="guiGe">
<h3>操作系统</h3>
<dl>
<dt>操作系统</dt>
<dd>Android</dd>
<dt>操作系统版本</dt>
<dd>华为 EMUI 8.0</dd>
</dl>
</div>
<div class="guiGe">
<h3>主芯片</h3>
<dl>
<dt>CPU品牌</dt>
<dd>海思(Hisilicon)</dd>
<dt>CPU频率</dt>
<dd>4*Cortex A73 2.36GHz + 4*Cortex A53 1.8GHz</dd>
<dt>CPU核数</dt>
<dd>八核</dd>
<dt>CPU型号</dt>
<dd>麒麟970</dd>
</dl>
</div>
<div class="guiGe">
<h3>网络支持</h3>
<dl>
<dt>双卡机类型</dt>
<dd>双卡双待单通</dd>
<dt>最大支持SIM卡数量</dt>
<dd>2个</dd>
<dt>SIM卡类型</dt>
<dd class="Ptable-tips">
<a href="/static/item/#"><i>?</i></a>
</dd>
<dd>Nano SIM</dd>
<dt>4G网络</dt>
<dd class="Ptable-tips">
<a href="/static/item/#"><i>?</i></a>
</dd>
<dd>4G:移动(TD-LTE);4G:联通(FDD-LTE);4G:电信(FDD-LTE);4G:联通(TD-LTE)</dd>
<dt>3G/2G网络</dt>
<dd>3G:移动(TD-LTE);4G:联通(WCDMA);3G:电信(CDMA2000);2G:移动联通(GSM)+ 电信(CDMA)</dd>
<dt>副SIM卡类型</dt>
<dd class="Ptable-tips">
<a href="/static/item/#"><i>?</i></a>
</dd>
<dd>副SIM卡与存储卡二选一</dd>
<dt>副SIM卡4G网络</dt>
<dd class="Ptable-tips">
<a href="/static/item/#"><i>?</i></a>
</dd>
<dd>4G:移动(TD-LTE);4G:联通(FDD-LTE);4G:电信(FDD-LTE);4G:联通(TD-LTE)</dd>
<dt>副SIM卡3G/2G网络</dt>
<dd>不支持主副卡同时使用电信卡;3G联通(WCDMA);3G:电信(CDMA2000);2G:移动联通(GSM)+电信(CDMA)</dd>
<dt>网络频率(2G/3G)</dt>
<dd>2G:GSM 850/900/1800/1900;2G:CDMA 800;3G:TD-SCDMA 1900/2000;3G:WCDMA
850/900/1900/2100;3G
</dd>
<dd>CDMA2000;3G:CDMA 800MHz 1X&EVDO ;3G:WCDMA:850/900/1700/1900/2100MHz</dd>
</dl>
</div>
<div class="guiGe">
<h3>存储</h3>
<dl>
<dt>ROM</dt>
<dd class="Ptable-tips">
<a href="/static/item/#"><i>?</i></a>
</dd>
<dd>128GB</dd>
<dt>RAM</dt>
<dd class="Ptable-tips">
<a href="/static/item/#"><i>?</i></a>
</dd>
<dd>6GB</dd>
<dt>存储卡</dt>
<dd>支持MicroSD(TF)</dd>
<dt>最大存储扩展容量</dt>
<dd>256GB</dd>
</dl>
</div>
<div class="guiGe">
<h3>屏幕</h3>
<dl>
<dt>主屏幕尺寸(英寸)</dt>
<dd>5.9英寸</dd>
<dt>分辨率</dt>
<dd>2560X1400(Quad HD/2k)</dd>
<dt>屏幕材质类型</dt>
<dd>TFT</dd>
</dl>
</div>
<div class="guiGe">
<h3>前置摄像头</h3>
<dl>
<dt>前置摄像头</dt>
<dd>800万像素</dd>
<dt>前摄光圈大小</dt>
<dd>f/2.0</dd>
<dt>美颜技术</dt>
<dd>支持</dd>
</dl>
</div>
<div class="guiGe">
<h3>后置摄像头</h3>
<dl>
<dt>摄像头数量</dt>
<dd class="Ptable-tips">
<a href="/static/item/#"><i>?</i></a>
</dd>
<dd>2个</dd>
<dt>后置摄像头</dt>
<dd>1200万像素;2000万像素</dd>
<dt>摄像头光圈大小</dt>
<dd>其他</dd>
<dt>闪光灯</dt>
<dd>双色温双LED闪光灯</dd>
<dt>美颜技术</dt>
<dd>支持</dd>
<dt>副摄像头光圈大小</dt>
<dd>其他</dd>
<dt>照片最大分辨率</dt>
<dd>5120X3840</dd>
<dt>拍照特点</dt>
<dd>数码变焦;自动对焦;防抖;美颜;连拍;微距;全景;滤镜;场景模式;HDR;PDAF;夜间拍摄;微信小视频;有声照片;</dd>
<dd>水印;美肤录像;全像素双核激光对焦拍摄</dd>
</dl>
</div>
<div class="guiGe">
<h3>电池信息</h3>
<dl>
<dt>电池容量(mAh)</dt>
<dd>4000(典型值)</dd>
<dt>电池类型</dt>
<dd>锂聚合物电池</dd>
<dt>电池是否可拆卸</dt>
<dd class="Ptable-tips">
<a href="/static/item/#"><i>?</i></a>
</dd>
<dd>否</dd>
<dt>充电器</dt>
<dd>5V/4.5A</dd>
<dt>快速充电</dt>
<dd>华为超级快充</dd>
</dl>
</div>
<div class="guiGe">
<h3>娱乐功能</h3>
<dl>
<dt>mic数量</dt>
<dd>3个</dd>
</dl>
</div>
<div class="guiGe">
<h3>数据接口</h3>
<dl>
<dt>数据传输接口</dt>
<dd>红外;WIFI;NFC;蓝牙;WiFi热点</dd>
<dt>NFC/NFC模式</dt>
<dd>支持(点对点模式);支持(读卡器模式);支持卡模拟</dd>
<dt>耳机接口类型</dt>
<dd>3.5mm</dd>
<dt>充电接口类型</dt>
<dd>Type-C</dd>
<dt>数据线</dt>
<dd>其他</dd>
</dl>
</div>
<div class="guiGe">
<h3>手机特性</h3>
<dl>
<dt>指纹识别</dt>
<dd>支持</dd>
<dt>语音识别</dt>
<dd>支持</dd>
<dt>GPS</dt>
<dd>支持</dd>
<dt>电子罗盘</dt>
<dd>支持</dd>
<dt>霍尔感应器</dt>
<dd>支持</dd>
<dt>陀螺仪</dt>
<dd>支持</dd>
<dt>红外遥控</dt>
<dd>支持</dd>
<dt>适配VR</dt>
<dd>支持</dd>
<dt>其他</dt>
<dd>呼气灯;多麦降噪技术;光线感应</dd>
</dl>
</div>
<div class="guiGe">
<h3>辅助功能</h3>
<dl>
<dt>常用功能</dt>
<dd>录音;手势识别;便签;超大字体;SOS功能;重礼感应</dd>
<dt>其他1</dt>
<dd>智能识屏</dd>
<dt>其他特性</dt>
<dd>手套模式</dd>
<dt>其他2</dt>
<dd>单手操作</dd>
</dl>
</div>
<div class="package-list">
<h3>包装清单</h3>
<p>手机(含内置电池) X 1、5A大电流华为SuperCharge充电器X 1、5A USB数据线 X 1、半入耳式线控耳机 X 1、快速指南X 1、三包凭证 X
1、取卡针 X 1、保护壳 X 1</p>
</div>
</div>
</li>
<!--包装-->
<li class="baozhang actives" id="li3">
<div class="oBox">
<div class="shuoHou">
<div class="baoZhang">
<h2>售后保障</h2>
</div>
</div>
<!--厂家服务-->
<div class="changJia">
<div class="lianBao">
<span class="oImg">
<img src="/static/item/img/2017.jpg" alt=""/>
<h3>厂家服务</h3>
</span>
<div class="wenZi">
本产品全国联保,享受三包服务,质保期为:一年保<br/>
如因质量问题或故障,凭厂商维修中心或特约维修点的质量检测证明,享受7日内退货,15日内换货,15日以上在保质期内享受免费保修等安保服务!<br/>
(注:如厂家在商品介绍中有售后保障的说明,则此商品按照厂家说明执行售后保障服务。)您可以查询本品牌在各地售后服务中心的练习方式<a
href="/static/item/#">请点击这儿查询...</a><br/><br/>
</div>
</div>
<div class="lianBao oCn">
<span class="oImg">
<img src="/static/item/img/2017.jpg" alt=""/>
<h3>京东承诺</h3>
</span>
<div class="wenZi">
本产品全国联保,享受三包服务,质保期为:一年保<br/>
如因质量问题或故障,凭厂商维修中心或特约维修点的质量检测证明,享受7日内退货,15日内换货,15日以上在保质期内享受免费保修等安保服务!<br/>
(注:如厂家在商品介绍中有售后保障的说明,则此商品按照厂家说明执行售后保障服务。)您可以查询本品牌在各地售后服务中心的练习方式<a
href="/static/item/#">请点击这儿查询...</a><br/><br/><br/>
</div>
</div>
<div class="lianBao ">
<span class="oImg">
<img src="/static/item/img/2017.jpg" alt=""/>
<h3>正品行货</h3>
</span>
<div class="wenZi hangHuo">
京东商城向您保证所售商品均为正品行货,京东自营商品开具机打发票或电子发票。
</div>
</div>
<div class="lianBao quanGuo">
<span class="oImg">
<img src="/static/item/img/2017-1.jpg" alt=""/>
<h3>全国联保</h3>
</span>
<div class="wenZi">
凭质保证书及京东商城发票,可享受全国联保服务(奢侈品、钟表除外;奢侈品、钟表由京东联系保修,享受法定三包售后服务),与您亲临商场选购的商品享受相同的质量保证。京东商城还为您提供具有竞争力的商品价格和运费政策,请您放心购买!
<br/>
注:因厂家会在没有任何提前通知的情况下更改产品包装、产地或者一些附件,本司不能确保客户收到的货物与商城图片、产地、附件说明完全一致。只能确保为原厂正货!并且保证与当时市场上同样主流新品一致。若本商城没有及时更新,请大家谅解!
</div>
</div>
<!--权利声明-->
<div class="quanLi">
<h4>权利声明:</h4>
<div class="jingDong">
京东上的所有商品信息、客户评价、商品咨询、网友讨论等内容,是京东重要的经营资源,未经许可,禁止非法转载使用。<br/>
<span class="oZhu">注</span>:本站商品信息均来自于合作方,其真实性、准确性和合法性由信息拥有者(合作方)负责。本站不提供任何保证,并不承担任何法律责任。
</div>
</div>
<div class="quanLi jiaGe">
<h4>价格说明:</h4>
<div class="jingDong">
<span class="oZhu">京东价</span>:京东价为商品的销售价,是您最终决定是否购买商品的依据。<br/>
<span class="oZhu">划线价</span>:商品展示的划横线价格为参考价,该价格可能是品牌专柜标价、商品吊牌价或由品牌供应商提供的正品零售价(如厂商指导价、建议零售价等)或该商品在京东平台上曾经展示过的销售价;由于地区、时间的差异性和市场行情波动,品牌专柜标价、商品吊牌价等可能会与您购物时展示的不一致,该价格仅供您参考。<br/>
<span class="oZhu">折扣</span>:如无特殊说明,折扣指销售商在原价、或划线价(如品牌专柜标价、商品吊牌价、厂商指导价、厂商建议零售价)等某一价格基础上计算出的优惠比例或优惠金额;如有疑问,您可在购买前联系销售商进行咨询。<br/>
<span class="oZhu">异常问题</span>:商品促销信息以商品详情页“促销”栏中的信息为准;商品的具体售价以订单结算页价格为准;如您发现活动商品售价或促销信息有异常,建议购买前先联系销售商咨询。
</div>
</div>
</div>
</div>
</li>
<!--评价-->
<li class="PINgjia actives" id="li4">
<div class="h3">
<h3>商品评价</h3>
</div>
<div class="nav">
<div class="left">
<p class="haoping">好评度</p>
<p><span>100%</span></p>
</div>
<div class="right">
<ul>
<li>
<a href="/static/item/##">就是快(424)</a>
</li>
<li>
<a href="/static/item/##">物流很快(254) </a>
</li>
<li>
<a href="/static/item/##">货真价实(168)</a>
</li>
<li>
<a href="/static/item/##">有档次(158)</a>
</li>
<li>
<a href="/static/item/##">国产品牌(133)</a>
</li>
<li>
<a href="/static/item/##">外形美观(103)</a>
</li>
<li>
<a href="/static/item/##">很给力(75)</a>
</li>
<li>
<a href="/static/item/##">反应灵敏(68)</a>
</li>
<li>
<a href="/static/item/##">性价比高(60)</a>
</li>
<li>
<a href="/static/item/##">价格优惠(50)</a>
</li>
<li>
<a href="/static/item/##">功能齐全(49)</a>
</li>
<li style="background: gainsboro;">
<a href="/static/item/##">速度太慢(5)</a>
</ul>
</div>
</div>
<!--全部评价-->
<div class="allpingjia">
<ul>
<li><a href="/static/item/##">全部评价(4.2万)</a></li>
<li><a href="/static/item/##">晒图(500)</a></li>
<li><a href="/static/item/##">追拼(200+)</a></li>
<li><a href="/static/item/##">好评(4.1万)</a></li>
<li><a href="/static/item/##">中评(100+)</a></li>
<li><a href="/static/item/##">差评(100+)</a></li>
<li><a href="/static/item/##"><input type="checkbox"/>只看当前商品价格</a></li>
<li class="imga" style="float: right;"><a href="/static/item/##">推荐排序 <img
src="/static/item/img/animaite.png"/> </a>
</li>
</ul>
</div>
</li>
<li class="shuoming actives" id="li5"></li>
</ul>
</div>
</div>
</div>
</div>
<div class="headera">
<div class="Logo-tu">
<span><img src="/static/item/img/service_items_1.png"/></span>
<span><img src="/static/item/img/service_items_2.png"/></span>
<span><img src="/static/item/img/service_items_3.png"/></span>
<span><img src="/static/item/img/service_items_4.png"/></span>
</div>
<div class="table">
<dl>
<dt><a href="/static/item/##">购物指南</a></dt>
<dd>
<a href="/static/item/##">购物流程</a>
</dd>
<dd>
<a href="/static/item/##">会员介绍</a>
</dd>
<dd>
<a href="/static/item/##">生活旅行/团购</a>
</dd>
<dd>
<a href="/static/item/##">常见问题</a>
</dd>
<dd>
<a href="/static/item/##">大家电</a>
</dd>
<dd>
<a href="/static/item/##">练习客服</a>
</dd>
</dl>
<dl>
<dt><a href="/static/item/##">配送方式</a></dt>
<dd>
<a href="/static/item/##">上门自提</a>
</dd>
<dd>
<a href="/static/item/##">211限时达</a>
</dd>
<dd>
<a href="/static/item/##">配送服务查询</a>
</dd>
<dd>
<a href="/static/item/##"></a>
</dd>
<dd>
<a href="/static/item/##">海外配送</a>
</dd>
<dd></dd>
</dl>
<dl>
<dt><a href="/static/item/##">支付方式</a></dt>
<dd>
<a href="/static/item/##">货到付款</a>
</dd>
<dd>
<a href="/static/item/##">在线支付</a>
</dd>
<dd>
<a href="/static/item/##">分期付款</a>
</dd>
<dd>
<a href="/static/item/##">邮局汇款</a>
</dd>
<dd>
<a href="/static/item/##">公司转账</a>
</dd>
<dd></dd>
</dl>
<dl>
<dt><a href="/static/item/##">售后服务</a></dt>
<dd>
<a href="/static/item/##">售后政策</a>
</dd>
<dd>
<a href="/static/item/##">价格保护</a>
</dd>
<dd>
<a href="/static/item/##">退款说明</a>
</dd>
<dd>
<a href="/static/item/##">返修/退换货</a>
</dd>
<dd>
<a href="/static/item/##">取消订单</a>
</dd>
<dd></dd>
</dl>
<dl class="dls">
<dt><a href="/static/item/##">特色服务</a></dt>
<dd>
<a href="/static/item/##">夺宝岛</a>
</dd>
<dd>
<a href="/static/item/##">DIY装机</a>
</dd>
<dd>
<a href="/static/item/##">延保服务</a>
</dd>
<dd>
<a href="/static/item/##">京东E卡</a>
</dd>
<dd>
<a href="/static/item/##">京东通信</a>
</dd>
<dd>
<a href="/static/item/##">京东JD+</a>
</dd>
</dl>
</div>
<!--关于我们-->
<div class="guanyuwomen">
<ul>
<li>
<a href="/static/item/##">关于我们</a>
</li>
<li>|</li>
<li>
<a href="/static/item/##">联系我们</a>
</li>
<li>|</li>
<li>
<a href="/static/item/##">联系客服</a>
</li>
<li>|</li>
<li>
<a href="/static/item/##">合作招商</a>
</li>
<li>|</li>
<li>
<a href="/static/item/##">商家帮助</a>
</li>
<li>|</li>
<li>
<a href="/static/item/##">营销中心</a>
</li>
<li>|</li>
<li>
<a href="/static/item/##">手机京东</a>
</li>
<li>|</li>
<li>
<a href="/static/item/##">友情链接</a>
</li>
<li>|</li>
<li>
<a href="/static/item/##">销售联盟</a>
</li>
<li>|</li>
<li>
<a href="/static/item/##">京东社区</a>
</li>
<li>|</li>
<li>
<a href="/static/item/##">风险检测</a>
</li>
<li>|</li>
<li>
<a href="/static/item/##">隐私政策</a>
</li>
<li>|</li>
<li>
<a href="/static/item/##">京东公益</a>
</li>
<li>|</li>
<li>
<a href="/static/item/##">English Site</a>
</li>
<li>|</li>
<li>
<a href="/static/item/##">Mdeila $ IR</a>
</li>
</ul>
</div>
<!--jieshoa-->
<p class="p1"><img src="/static/item/img/56a0a994Nf1b662dc.png"/>
<a href="/static/item/##"> 京公网安备 11000002000088号</a>|
<a href="/static/item/##"> 京ICP证070359号</a>|
<a href="/static/item/##"> 互联网药品信息服务资格证编号(京)-经营性-2014-0008 </a>|
<a href="/static/item/##">新出发京零 字第大120007号</a>
</p>
<p class="p1">
<a href="/static/item/##"> 互联网出版许可证编号新出网证(京)字150号</a>|
<a href="/static/item/##"> 出版物经营许可证</a>|
<a href="/static/item/##"> 网络文化经营许可证京网文 </a>|
<a href="/static/item/##">[2014]2148-348号 </a>|
<a href="/static/item/##"> 违法和不良信息举报电话 </a>|
<a href="/static/item/##">:4006561155 </a>
</p>
<p class="p1">
<a href="/static/item/##"> Copyright © 2004-2017 京东JD 版权所有</a>|
<a href="/static/item/##"> 消费者维权热线:4006067733 经营证照</a>|
</p>
<p class="p1">
<a href="/static/item/##"> 京东旗下网站:京东支付</a>|
<a href="/static/item/##"> 京东云</a>
</p>
<p class="p3">
<img src="/static/item/img/54b8871eNa9a7067e.png"/>
<img src="/static/item/img/54b8872dNe37a9860.png"/>
<img src="/static/item/img/54b8875fNad1e0c4c.png"/>
<img src="/static/item/img/5698dc03N23f2e3b8.jpg"/>
<img src="/static/item/img/5698dc16Nb2ab99df.jpg"/>
<img src="/static/item/img/56a89b8fNfbaade9a.jpg"/>
</p>
</div>
<div class="Fixedbian">
<ul>
<li class="li1"><a class="aaa" href="/static/item/##">顶部</a></li>
</ul>
</div>
<div class="gouwuchexiaguo">
<img src="/static/item/img/44.png"/>
<span>购物车还没有商品,赶紧选购吧!</span>
</div>
</body>
<script src="/static/item/js/jquery1.9.js" type="text/javascript" charset="utf-8"></script>
<script src="/static/item/js/js.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
$(function () {
$(".sku_attr_value").parent().css({"border": "solid 1px #CCC"})
$("a[class='sku_attr_value checked']").parent().css({"border": "solid 1px red"})
})
$(".sku_attr_value").click(function () {
// 1. 点击的元素先添加上自定义的属性,为了识别我们是刚才被点击的
var skus = new Array();
$(this).addClass("clicked");
var curr = $(this).attr("skus").split(",");
// 当前被点击的所有sku组合数组放进去
skus.push(curr)
// 去掉同一行的所有的checked
$(this).parent().parent().find(".sku_attr_value").removeClass("checked");
$("a[class='sku_attr_value checked']").each(function () {
skus.push($(this).attr("skus").split(","));
});
// skus
// 颜色 ['9', '10']
// 内存 ['6', '8', '10']
// 这都是该颜色的所有sku,该内存的所有sku,交集就是那个确定的sku
console.log(skus);
// 2. 获取到另外一个选中的属性的组合
var filterEle = skus[0];
for (var i=1;i<skus.length;i++){
filterEle = $(filterEle).filter(skus[i])
}
console.log(filterEle[0])
// 3. 取出他们的交集,得到skuId
location.href = "http://item.gulimall/" + filterEle[0] + ".html"
// 4. 跳转
}
)
</script>
</html>
部分内容转载自:https://wwwblogs/czwlinux/p/17630284.html
她们喜欢被当成大人,更喜欢当大人一阵子后变回小孩。
房思琪的初恋乐园
林奕含
本文标签: 谷粒详情商城商品CompletableFuture
版权声明:本文标题:谷粒商城十五商品详情CompletableFuture异步编排 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1726894638a1089043.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论