文档库 最新最全的文档下载
当前位置:文档库 › 淘淘商城第九天笔记

淘淘商城第九天笔记

淘淘商城第九天笔记
淘淘商城第九天笔记

淘淘商城第九天1第八天内容回顾

1、搜索系统的实现

a)发布搜索服务,pc、移动端都可以调用。

b)在portal中调用服务,实现搜索功能。

2、Solr提供的搜索服务。

a)Solr的集群

b)Solr集群的使用。

c)单机版使用HttpSolrServer。

d)集群版使用CloudSolrServer。

2课程计划

1、商品详情页面的展示

a)伪静态化(使用jsp动态展示)

b)添加缓存,redis

2、网页静态化freemaker+nginx

3商品详情页面展示

3.1 分析

在搜索结果中点击商品图片或者title打开商品详情页面。

在Controller中从url中把商品id取出来,根据商品id查询对应的商品详细信息。

商品信息应该是调用服务来获得。需要在taotao-rest中发布服务。

Taotao-rest服务中根据商品id查询商品信息。

需要用到的表:

商品表:tb_item

商品详细信息:tb_item_desc

商品的规格参数:tb_item_param_item

应该发布三个服务:商品基本信息、取商品详情、取商品的规格参数。

3.2 发布服务

3.2.1商品基本信息服务

根据商品id取数据。商品表:tb_item

3.2.1.1 D ao层

使用逆向工程

3.2.1.2 S ervice层

接收商品id,根据商品id查询商品基本信息。返回商品基本信息的pojo——TbItem。

为了减轻数据库的压力,需要添加缓存。由于商品数据比较多,需要把用户访问的数据添加缓存中,同时需要设置商品数据的过期时间,根据时间情况调整,需要把过期时间放到配置文件中。

要设置过期时间redis中只能在key上设置。

使用String数据类型,为了便于分组可以使用“:”分隔的命名方式。

REDIS_ITEM:BASE_INFO:{ITEM_ID}

@Service

publicclass ItemServiceImpl implements ItemService {

@Autowired

private TbItemMapper itemMapper;

@Autowired

private JedisClient jedisClient;

@Value("${REDIS_ITEM_KEY}")

private String REDIS_ITEM_KEY;

@Value("${ITEM_BASE_INFO_KEY}")

private String ITEM_BASE_INFO_KEY;

@Value("${ITEM_EXPIRE_SECOND}")

private Integer ITEM_EXPIRE_SECOND;

@Override

public TbItem getItemById(Long itemId) {

//查询缓存,如果有缓存,直接返回

try {

String json= jedisClient.get(REDIS_ITEM_KEY+ ":"+ ITEM_BASE_INFO_KEY + ":"+ itemId);

//判断数据是否存在

if (StringUtils.isNotBlank(json)) {

// 把json数据转换成java对象

TbItem item = JsonUtils.jsonToPojo(json, TbItem.class);

return item;

}

} catch (Exception e) {

e.printStackTrace();

}

//根据商品id查询商品基本信息

TbItem item = itemMapper.selectByPrimaryKey(itemId);

//向redis中添加缓存。

//添加缓存原则是不能影响正常的业务逻辑

try {

//向redis中添加缓存

jedisClient.set(REDIS_ITEM_KEY + ":" + ITEM_BASE_INFO_KEY + ":" + itemId

, JsonUtils.objectToJson(item));

//设置key的过期时间

jedisClient.expire(REDIS_ITEM_KEY + ":" + ITEM_BASE_INFO_KEY + ":" + itemId,

ITEM_EXPIRE_SECOND);

} catch (Exception e) {

e.printStackTrace();

}

return item;

}

}

3.2.1.3 C ontroller

接收商品id,根据商品id查询商品基本信息,调用Service查询。直接响应json数据。返回结果:使用TaotaoResult包装TbItem对象。

请求的url:/rest/item/base/{itemId}

@Controller

@RequestMapping("/item")

publicclass ItemController {

@Autowired

private ItemService itemService;

/**

* 查询商品基本信息

*

Title: getItemById

*

Description:

* @param itemId

* @return

*/

@RequestMapping("/base/{itemId}")

@ResponseBody

public TaotaoResult getItemById(@PathVariable Long itemId) {

try {

TbItem item = itemService.getItemById(itemId);

return TaotaoResult.ok(item);

} catch (Exception e) {

e.printStackTrace();

return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));

}

}

}

3.2.2商品详情信息查询服务

根据商品id查询商品详情。tb_item_desc

3.2.2.1 D ao层

可以使用逆向工程

3.2.2.2 S ervice层

接收商品id,根据商品id查询商品详情,返回TbItemDesc对象。

需要添加缓存,需要设置过期时间。

@Override

public TbItemDesc getItemDescById(Long itemId) {

//查询缓存

//查询缓存,如果有缓存,直接返回

try {

String json = jedisClient.get(REDIS_ITEM_KEY + ":" + itemId + ":" + ITEM_DESC_KEY);

//判断数据是否存在

if (StringUtils.isNotBlank(json)) {

// 把json数据转换成java对象

TbItemDesc itemDesc = JsonUtils.jsonToPojo(json, TbItemDesc.class);

return itemDesc;

}

} catch (Exception e) {

e.printStackTrace();

}

//根据商品id查询商品详情

TbItemDesc itemDesc = itemDescMapper.selectByPrimaryKey(itemId);

//添加缓存

try {

//向redis中添加缓存

jedisClient.set(REDIS_ITEM_KEY + ":" + itemId + ":" + ITEM_DESC_KEY

, JsonUtils.objectToJson(itemDesc));

//设置key的过期时间

jedisClient.expire(REDIS_ITEM_KEY + ":" + itemId + ":" + ITEM_DESC_KEY,

ITEM_EXPIRE_SECOND);

} catch (Exception e) {

e.printStackTrace();

}

return itemDesc;

}

3.2.2.3 C ontroller层

接收商品id,调用Service查询商品详情。返回json数据。使用TaotaoResult包装一个商品详情pojo返回。

请求的url:/rest/item/desc/{itemId}

@RequestMapping("/desc/{itemId}")

@ResponseBody

public TaotaoResult getItemDescById(@PathVariable Long itemId) {

try {

TbItemDesc itemDesc = itemService.getItemDescById(itemId);

return TaotaoResult.ok(itemDesc);

} catch (Exception e) {

e.printStackTrace();

return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));

}

}

3.2.3商品规格参数查询服务

根据商品id查询规格参数,响应的是json数据。同样需要添加缓存,设置缓存的过期时间。tb_item_param_item

3.2.3.1 D ao层

可以使用逆向工程

3.2.3.2 S ervice层

根据商品id查询规格参数,添加缓存。

参数:itemId

返回值:TbItemParamItem

@Override

public TbItemParamItem getItemParamById(Long itemId) {

//添加缓存逻辑

//查询缓存

//查询缓存,如果有缓存,直接返回

try {

String json = jedisClient.get(REDIS_ITEM_KEY + ":" + itemId + ":" + ITEM_PARAM_KEY);

//判断数据是否存在

if (StringUtils.isNotBlank(json)) {

// 把json数据转换成java对象

TbItemParamItem itemParamitem= JsonUtils.jsonToPojo(json, TbItemParamItem.class);

return itemParamitem;

}

} catch (Exception e) {

e.printStackTrace();

}

// 根据商品id查询规格参数

TbItemParamItemExample example = new TbItemParamItemExample();

Criteria criteria = example.createCriteria();

criteria.andItemIdEqualTo(itemId);

Listlist = itemParamItemMapper.selectByExampleWithBLOBs(example);

//取规格参数

if (list != null&&list.size() > 0) {

TbItemParamItem itemParamItem = list.get(0);

//添加缓存

try {

//向redis中添加缓存

jedisClient.set(REDIS_ITEM_KEY + ":" + itemId + ":" + ITEM_PARAM_KEY

, JsonUtils.objectToJson(itemParamItem));

//设置key的过期时间

jedisClient.expire(REDIS_ITEM_KEY + ":" + itemId + ":" + ITEM_PARAM_KEY, ITEM_EXPIRE_SECOND);

} catch (Exception e) {

e.printStackTrace();

}

return itemParamItem;

}

returnnull;

}

3.2.3.3 C ontroller层

接收商品id,调用Service查询规格参数,返回json数据。

请求的url:/rest/item/param/{itemId}

@RequestMapping("/param/{itemId}")

@ResponseBody

public TaotaoResult getItemParamById(@PathVariable Long itemId) {

try {

TbItemParamItem itemParamItem = itemService.getItemParamById(itemId);

return TaotaoResult.ok(itemParamItem);

} catch (Exception e) {

e.printStackTrace();

return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));

}

}

3.3 商品详情页面展示

3.3.1分析

请求的url:/item/{itemId}.html

根据商品id查询商品的信息,需要调用taotao-rest发布的服务。

把获得商品数据传递给jsp。

1、先取商品的基本信息展示给用户

2、当页面加载完成后使用ajax调用服务查询商品的详情。延迟1秒加载。

3、商品规格参数按需加载,当用户点击规格参数tab页时加载。

3.3.2展示商品基本信息

3.3.2.1 S ervice层

根据商品id调用服务获得商品基本信息数据。需要把数据转换成java对象。返回TbItem对象。

参数:itemId

返回值:TbItem

服务的url:服务url+/rest/item/base/{itemId}

@Service

publicclass ItemServiceImpl implements ItemService {

@Value("${REST_BASE_URL}")

private String REST_BASE_URL;

@Value("${REST_ITEM_BASE_URL}")

private String REST_ITEM_BASE_URL;

@Override

public TbItem getItemById(Long itemId) {

// 根据商品id查询商品基本信息

String json = HttpClientUtil.doGet(REST_BASE_URL + REST_ITEM_BASE_URL + itemId);

//转换成java对象

TaotaoResult taotaoResult = TaotaoResult.formatToPojo(json, TbItem.class);

//取商品对象

TbItem item = (TbItem) taotaoResult.getData();

return item;

}

}

3.3.2.2 C ontroller层

接收商品id,从url取。调用Service,把查询结果传递给jsp。

请求的url:http://localhost:8082/item/{itemId}.html

把TbItem对象传递给jsp。Key就是“item”

3.3.3展示商品描述

请求的url:/item/desc/{itemId}.html

响应的内容就是商品描述的html片段。

参数:商品ID

3.3.3.1 S ervice层

@Override

public String getItemDescById(Long itemId) {

//根据商品id调用taotao-rest的服务获得数据

//http://localhost:8081/rest/item/desc/144766336139977

String json = HttpClientUtil.doGet(REST_BASE_URL + REST_ITEM_DESC_URL + itemId);

//转换成java对象

TaotaoResult taotaoResult = TaotaoResult.formatToPojo(json, TbItemDesc.class);

//取商品描述

TbItemDesc itemDesc = (TbItemDesc) taotaoResult.getData();

String desc = itemDesc.getItemDesc();

return desc;

}

3.3.3.2 C ontroller层

接收商品id,从url中获得,调用Service获得商品描述数据,响应给浏览器。响应一个字符串。

参数:商品id

返回值:String(html片段)

@RequestMapping(value="/item/desc/{itemId}", produces=MediaType.TEXT_HTML_VALUE+";charset=utf-8") @ResponseBody

public String getItemDesc(@PathVariable Long itemId) {

String desc = itemService.getItemDescById(itemId);

return desc;

}

3.3.4展示规格参数

当点击tab标签时,触发一个单击事件。Js做ajax请求,请求规格参数的数据。把响应的内容展示到页面。

请求的url:/item/param/{itemId}.html

响应的内容:响应一个html片段。在java代码中生成。

参数:商品id。

3.3.

4.1 S ervice

接收商品id,调用taotao-rest的服务,获得规格参数数据。转换成java对象,转换成html 片段,返回。

@Override

public String getItemParamById(Long itemId) {

// 根据商品id获得对应的规格参数

String json = HttpClientUtil.doGet(REST_BASE_URL + REST_ITEM_PARAM_URL + itemId);

// 转换成java对象

TaotaoResult taotaoResult = TaotaoResult.formatToPojo(json, TbItemParamItem.class);

// 取规格参数

TbItemParamItem itemParamItem = (TbItemParamItem) taotaoResult.getData();

String paramJson = itemParamItem.getParamData();

// 把规格参数的json数据转换成java对象

// 转换成java对象

ListmapList = JsonUtils.jsonToList(paramJson, Map.class);

// 遍历list生成html

StringBuffer sb = new StringBuffer();

sb.append("

class=\"Ptable\">\n");

sb.append("

\n");

for (Map map : mapList) {

sb.append("

\n");

sb.append("

\n");

sb.append("

\n");

// 取规格项

ListmapList2 = (List) map.get("params");

for (Map map2 : mapList2) {

sb.append("

\n");

sb.append("

\n");

sb.append("

\n");

sb.append("

\n");

}

}

sb.append("

\n");

sb.append("

" + map.get("group") + "
" + map2.get("k") + "" + map2.get("v") + "
");

return sb.toString();

}

3.3.

4.2 C ontroller层

接收商品id,调用Service获得规格参数的html片段,直接响应。

参数:商品id

返回值:String

@RequestMapping(value="/item/param/{itemId}", produces=MediaType.TEXT_HTML_VALUE+";charset=utf-8") @ResponseBody

public String getItemParam(@PathVariable Long itemId) {

String paramHtml = itemService.getItemParamById(itemId);

return paramHtml;

}

4网页静态化

4.1 分析

每个商品要对应生成一个html文件,保存到磁盘,访问文件就不一定使用tomcat,可以使用nginx访问。

可以使用freemaker工具生成。

4.2 Freemarker

4.2.1什么是freemarker

FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker 与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java 等。

4.2.2Freemarker的使用方法

第一步:把freemarker的jar包添加到工程中

第二步:freemarker的运行不依赖web容器,可以在java工程中运行。创建一个测试方法进行测试。

第三步:创建一个Configration对象

第四步:告诉config对象模板文件存放的路径。

第五步:设置config的默认字符集。一般是utf-8

第六步:从config对象中获得模板对象。需要制定一个模板文件的名字。

第七步:创建模板需要的数据集。可以是一个map对象也可以是一个pojo,把模板需要的数据都放入数据集。

第八步:创建一个Writer对象,指定生成的文件保存的路径及文件名。

第九步:调用模板对象的process方法生成静态文件。需要两个参数数据集和writer对象。第十步:关闭writer对象。

4.2.3代码实现

publicclass FreeMarkerTest {

@Test

publicvoid testFreeMarker() throws Exception {

// 第一步:把freemarker的jar包添加到工程中

// 第二步:freemarker的运行不依赖web容器,可以在java工程中运行。创建一个测试方法进行测试。

// 第三步:创建一个Configuration对象

Configuration configuration = new Configuration(Configuration.getVersion());

// 第四步:告诉config对象模板文件存放的路径。

configuration.setDirectoryForTemplateLoading(new

File("D:\\workspaces-itcast\\JaveEE18\\taotao-portal\\src\\main\\webapp\\WEB-INF\\ftl"));

// 第五步:设置config的默认字符集。一般是utf-8

configuration.setDefaultEncoding("utf-8");

// 第六步:从config对象中获得模板对象。需要制定一个模板文件的名字。

Template template = configuration.getTemplate("first.ftl");

// 第七步:创建模板需要的数据集。可以是一个map对象也可以是一个pojo,把模板需要的数据都放入数据集。

Map root = new HashMap<>();

root.put("hello", "hello freemarker");

// 第八步:创建一个Writer对象,指定生成的文件保存的路径及文件名。

Writer out = new FileWriter(new File("D:\\temp\\html\\hello.html"));

// 第九步:调用模板对象的process方法生成静态文件。需要两个参数数据集和writer对象。

template.process(root, out);

// 第十步:关闭writer对象。

out.flush();

out.close();

}

}

模板:

${hello}

4.2.4Freemarker模板的写法4.2.4.1 取简单数据类型数据

使用EL表达式。

${hello}

4.2.4.2 包装数据类型

模板:

${title}

${student.id}

${https://www.wendangku.net/doc/b79546343.html,}

${student.address}

4.2.4.3 历遍集合/数组

List persons = new ArrayList(); 省略….

页面中内容

<#list persons as p>

${p.id}/${https://www.wendangku.net/doc/b79546343.html,}

4.2.4.4 获得当前迭代的索引

List list = new ArrayList();

获取当前选代的索引:

<#list persons as p>

${p_index}

4.2.4.5 模板中判断条件

<#if 判断条件>

<#else>

逻辑运算符(== != || &&)

4.2.4.6 日期类型格式化

默认格式

1:date

${cur_time?date}

2:datetime

${cur_time?datetime}

3:time

${cur_time?time}

自定义格式

${cur_time?string("yyyy-MM-dd HH:mm:ss")}

4.2.4.7 处理null值

root.put(“val”,null);

解决办法

1:null 变空串

${val!} ${val!"这里是空"}

2:为Null时给默认值

${val!“我是默认值"}

3、<#if curdate ??>

当前日期:${curdate?string("yyyy/MM/dd HH:mm:ss")}

<#else>

curdate属性为null

4.2.4.8 I nclude

将另一个页面引入本页面时可用以下命令完成

<#include "/include/head.html">

4.3 项目中使用freemarker

使用freemarker整合spring。把Configuration交给spring容器管理。依赖的jar包:

org.springframework

spring-context-support

4.1.3.RELEASE

org.freemarker

freemarker

2.3.23

4.3.1Spring配置文件

class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">

4.3.2静态文件生成的时机

1、当用户第一次访问时生成静态文件。不推荐使用。

2、当后台添加、编辑商品时生成静态网页。

此时,需要taotao-portal发布服务,供后台系统调用,当后台添加或者修改商品时调用此服务。此时taotao-portal的功能就是生成静态页面。

4.3.3发布生成页面的服务

1、获得数据的方式还是通过调用rest发布的服务获得数据。

2、生成静态页面。

3、响应生成成功。

4.3.4Service

获得参数:商品id,根据商品id调用rest发布的服务,获得商品数据(商品基本信息、商品描述、商品规格参数),生成静态页面。返回成功。

参数:商品id

返回值:TaotaoResult

@Service

publicclass StaticPageServiceImpl implements StaticPageService {

@Autowired

private ItemService itemService;

@Autowired

private FreeMarkerConfigurer freeMarkerConfigurer;

@Value("${STATIC_PAGE_PATH}")

private String STATIC_PAGE_PATH;

@Override

public TaotaoResult genItemHtml(Long itemId) throws Exception {

//商品基本信息

TbItem tbItem = itemService.getItemById(itemId);

//商品描述

String itemDesc = itemService.getItemDescById(itemId);

//规格参数

String itemParam = itemService.getItemParamById(itemId);

//生成静态页面

Configuration configuration = freeMarkerConfigurer.getConfiguration();

Template template = configuration.getTemplate("item.ftl");

//创建一个数据集

Map root = new HashMap<>();

//向数据集中添加属性

root.put("item", tbItem);

root.put("itemDesc", itemDesc);

root.put("itemParam", itemParam);

//创建一个Writer对象

Writer out = new FileWriter(new File(STATIC_PAGE_PATH + itemId + ".html"));

//生成静态文件

template.process(root, out);

out.flush();

out.close();

return TaotaoResult.ok();

}

}

4.3.5Freemarker模板

4.3.6Controller

接收商品id,调用Service生成静态页面。返回json数据。

参数:商品id

返回值:TaotaoResult

@Controller

publicclass StaticPageController {

@Autowired

private StaticPageService staticPageService;

@RequestMapping("/gen/item/{itemId}")

@ResponseBody

public TaotaoResult genItemPage(@PathVariable Long itemId) {

try {

TaotaoResult result = staticPageService.genItemHtml(itemId);

return result;

} catch (Exception e) {

e.printStackTrace();

return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));

}

}

}

4.4 解决请求406问题

由于请求的url的后缀为.html导致406问题。解决方法:不要使用*.html的后缀。

淘淘商城第六天笔记

淘淘商城第六天1内容复习 1、前台系统的搭建 a)服务层 b)表现层 2、首页的展示 3、商品类目展示 a)使用ajax跨域调用服务。 b)使用jsonp实现 2课程计划 1、首页的内容展示:轮播图展示。 2、Cms系统的实现。 3、Taotao-rest发布服务。 4、表现层调用服务,展示轮播图。 3首页轮播图展示 3.1 首页内容管理思路 首页展示的内容都应该可以通过后台来管理。 1、内容的分组 2、分组下还可以有小组 3、广告项目中有图片 4、标题 5、价格 6、链接 7、内容 第一块:内容的分组管理,应该是一个树形结构。 第二块:内容管理。 图片、链接、标题、价格、内容。 使用两个表来保存内容数据: 1、内容分类表:

2、内容表: Cms系统:内容管理系统。

4内容分类管理 4.1 展示分类列表 4.1.1分析 初始化easyUI的tree控件url:/content/category/list 请求的参数:id,父节点id 返回结果:json数据(EasyUITreeNode列表) 是一个列表,列表中每个元素包含三个属性: 1、Id 2、Text 3、state 4.1.2Dao层 从tb_content_category表中取数据,根据parentid查询分类列表。可以使用逆向工程生成的代码。 4.1.3Service层 接收一个parentId,根据parentID查询节点列表。创建一个EasyUITreeNode列表。返回。参数: Long parentId 返回值:

List @Service publicclass ContentCatgoryServiceImpl implements ContentCatgoryService { @Autowired private TbContentCategoryMapper contentCategoryMapper; @Override public List getContentCatList(Long parentId) { //根据parentId查询子节点列表 TbContentCategoryExample example = new TbContentCategoryExample(); Criteria criteria = example.createCriteria(); criteria.andParentIdEqualTo(parentId); //执行查询 Listlist = contentCategoryMapper.selectByExample(example); //转换成EasyUITreeNode列表 ListresultList = new ArrayList<>(); for (TbContentCategory tbContentCategory : list) { //创建一EasyUITreeNode节点 EasyUITreeNode node = new EasyUITreeNode(); node.setId(tbContentCategory.getId()); node.setText(tbContentCategory.getName()); node.setState(tbContentCategory.getIsParent()?"closed":"open"); //添加到列表 resultList.add(node); } return resultList; } } 4.1.4Controller层 接收parentId调用Service查询节点列表,返回节点列表。返回json数据,需要使用@ResponseBody @Controller @RequestMapping("/content/category") publicclass ContentCategoryController { @Autowired private ContentCatgoryService contentCatgoryService; @RequestMapping("/list") @ResponseBody public List getContentCatList(@RequestParam(value="id", defaultValue="0")Long

广州服装批发内幕全攻略

[转] 广州服装批发内幕全攻略 广州服装货源进货内幕全攻略 众所周知,广州是全球闻名的服装和小商品批发地之一。但是在这块寸土寸金之地,同样有着不同的价格,作为一个生意人,一个长期的优质货源有多么重要不言而喻。我接触过许多外地来的朋友都抱怨:广州这么大,好货源哪里找呢?确实,即使是广州市内,也有很多挂羊头卖狗肉的地方,举个例子,我曾经在广园新村看见一个箱子40元,在一德路就卖180,还声称广州最低价!这是这两天亲眼看到的。同时,一笔经济账将外来的朋友压的喘不过气来,多数朋友选择在广州火车站商圈住宿,每天的住宿费动辄两三百元,加上其他费用,每天三百元是打不住的。就算如此,也很难清楚火车站商圈的货源,更别说更多有优质货源的其他地方了,好多朋友来了两天就草草的结束广州的“打货”之旅,不但没有找到优质的货源,反而要因此经常往返于广州真是得不偿失。根据我在广州1年的工作经验和同事朋友的帮助,加之我一直非常想跳出来做生意,可以说将广州各大批发市场跑的烂熟。今天就来整理一下广州服装货源,希望对寻找货源的新手们有所帮助,不敢说价格全国最低的,毕竟别人做生意也要赚钱,但是绝对全国绝大多数市场打货的主流集散地,为什么我敢这么说呢,因为我是武汉人,武汉有个华中批发重镇,天下第一街汉正街,相信各位也有所耳闻吧,但是相对这里的货源,价格还是不是一个档次的,我有些朋友做汉正街的都是跑到广州来拿货,有的甚至在白马拿货(白马的价格是比较高的),所以对于个体散户,今天列举的货源优势不言而喻。如果是大批发人士还是去中山的一些小镇小作坊拿货吧,1W件起打包不选款的那种,价格相当便宜。 1.广州火车站商圈 广州白马商圈:以火车站为依托,以外贸为旗号(当然确实不少外贸精品,这里老外也多嘿嘿。但我可以爆个内幕,俺朋友家里是做服装的,白马附近好多服装是沙河或者十三行的低档货,常常拿10来块的货在这边卖50,80甚至更多的也有),也包括往站西那边走的路上几个纯外贸服装的商城和火车站的地五大道,地下错综复杂的服装档口网络延续了数站路,出口有数十个之多,新手真的会在里面迷路,可惜这里面多是做老外的生意,中国人去了常常会被冷眼相待。这边的老板真的不愁生意,统一的特点就是有现货,他们囤积了大量的货,你在这边很难讲价的原因就是附近好多家都是一个老板的产业,他们将价格规定死了,我姨妈的朋友,她女儿就是这里的老板,每年从广州沙河拿几千万的货去澳大利亚卖,同时在这边有6间连着的档口,货源都是来自日本韩国,但是人家采取保密的态度也不太好打听。 这个商圈是许多学生卖家和年轻人喜欢打货的地点,因为一是离火车站进,没理由舍近求远的心理在作祟,还有就是这里的服装真的很吸引人,再加上穿着火辣态度热情的辣妹,很容易就敞开腰包认她们宰你温柔一刀了!每次看着一个个热火朝天在挑选衣物的靓妹们我都不禁从心底发出一声慧慈常用的惊叹:OH~MY GOD!~~~~很多人也许来广州好多次才能发现,这边的货回去跟当地的服装在价格上并没有很明显的优势,甚至价格上有过之而无不及,因为这边的货普遍特点就是靓而贵,而且基本上都是采取一个大店铺请许多靓妹的形式,所以也很难讲价。适合高档地段,目标人群起码是公司白领,对生活品质有一定追求的受众群体。如果是一些普通的地段,中低或者大众化群体消费的服装,真的不推荐在这里拿货。其实做生意的老手想想就知道了,火车站这种黄金地段,那种商业氛围下租金多少不言而喻,每年租金十几万甚至几十万的”小“店并不在少数。 作者评级:★★★ 理由:价格偏高并有少量以次充好 适合人群:以外贸为旗号,针对高中端,注重商品质量,销路十分通畅的卖家 普遍价格区间:100左右或以上每件 这里就是白马了,go,卡按靓女去咯

淘淘商城的第一天笔记

淘淘商城的第一天 1课程计划 一共14天课程 1、第一天:电商行业的背景。淘淘商城的介绍。搭建项目工程。Svn的使用。 2、第二天:框架的整合。后台管理商品列表的实现。分页插件。 3、第三天:后台管理。商品添加。商品类目的选择、图片上传、富文本编辑器的使用。 4、第四天:商品规格的实现。 5、第五天:商城前台系统的搭建。首页商品分类的展示。Jsonp。 6、第六天:cms系统的实现。前台大广告位的展示。 7、第七天:cms系统添加缓存。Redis。缓存同步。 8、第八天:搜索功能的实现。使用solr实现搜索。 9、第九天:商品详情页面的展示。 10、第十天:单点登录系统。Session共享。 11、第十一天:购物车订单系统的实现。 12、第十二天:nginx。反向代理工具。 13、第十三天:redis集群的搭建、solr集群的搭建。系统的部署。 14、项目总结。 今天的内容: 1、电商行业的背景。 2、淘淘商城的介绍。 3、工程项目的搭建。 4、Svn的使用。 2电商行业介绍 2.1 电商行业发展 近年来,中国的电子商务快速发展,交易额连创新高,电子商务在各领域的应用不断拓展和深化、相关服务业蓬勃发展、支撑体系不断健全完善、创新的动力和能力不断增强。电子商务正在与实体经济深度融合,进入规模性发展阶段,对经济社会生活的影响不断增大,正成为我国经济发展的新引擎。 中国电子商务研究中心数据显示,截止到2012年底,中国电子商务市场交易规模达7.85万亿人民币,同比增长30.83%。其中,B2B电子商务交易额达6.25万亿,同比增长27%。而2011年全年,中国电子商务市场交易额达6万亿人民币,同比增长33%,占GDP比重上

淘淘商城第四天笔记

淘淘商城第四天 1第三天内容 1、nginx的反向代理、负载均衡 2、fastDFS,分布式文件系统。图片服务器。访问图片使用nginx+fastDFS的插件。 3、使用FastDFS的客户端上传图片。 4、图片上传功能实现。 5、Springmvc和spring父子容器。 2课程计划 1、富文本编辑器的使用KindEditor。 2、商品添加功能的实现。 3、规格参数的实现 3富文本编辑器的使用 3.1 使用方法 第一步:从KindEditor的官方网站下载源码。https://www.wendangku.net/doc/b79546343.html,/demo.php 第二步:解压缩,把js源码添加到工程中。

第三步:把kindeditor-all-min.js引入到jsp中 第四步:把kindEditor的语言包引入到jsp 第五步:创建一个textArea控件,作为富文本编辑器的数据源。 第六步:编写js代码初始化KindEditor控件。需要指定textArea控件。 第七步:在提交表单之前,先把富文本编辑器中的内容同步到textArea控件中。

Sync()方法实现。 3.2 流行的编辑器 1、KindEditor 2、https://www.wendangku.net/doc/b79546343.html,/website/ 3、Ckeditor https://www.wendangku.net/doc/b79546343.html,/ 4商品添加的实现 4.1 分析 4.1.1数据库 相关的表:tb_item、tb_item_desc 执行insert操作,可以使用逆向工程生成的代码。商品id应该是一串数字。 可以使用毫秒+两位随机数生成一个id。 使用工具类:

4.1.2页面 提交请求的url:/item/save 请求的参数:表单中的内容。 可以生成如下格式的字符串: Name=zhangsan&password=123&id=szfda2313as 返回值: Json数据,应该包含一个status属性,代码状态码200正常。TaotaoResult 4.2 Dao层 可以使用逆向工程生成的代码。 4.3 Service层 1、接收TbItem对象,String desc 商品描述两个参数。 2、在TbItem对象中补全属性,包括id、status、create、update。 3、调用Mapper的insert方法插入数据。

淘淘商城第二天笔记

淘淘商城第二天 1课程计划 商品列表的查询 1、框架整合springmvc+spring+mybatis 2、创建数据库 3、使用mybatis的逆向工程生成代码 4、商品列表功能实现 2创建数据库 使用mysql数据库。 在互联网行业的项目中尽可能的减少表的管理查询。使用冗余解决表的关联问题。有利于分库分表。 商品表:

Sku:最小库存量单位。就是商品id。就是商品最细力度的划分。每个sku都唯一对应一款商品,商品的颜色、配置都已经唯一确定。 3逆向工程 Mybatis的逆向工程。根据数据库表生成java代码。 注意:如果想再次生成代码,必须先将已经生成的代码删除,否则会在原文件中追加。

4Ssm框架整合 4.1 整合的思路 4.1.1Dao层 使用mybatis框架。创建SqlMapConfig.xml。 创建一个applicationContext-dao.xml 1、配置数据源 2、需要让spring容器管理SqlsessionFactory,单例存在。 3、把mapper的代理对象放到spring容器中。使用扫描包的方式加载mapper的代理对象。 4.1.2Service层 1、事务管理 2、需要把service实现类对象放到spring容器中管理。 4.1.3表现层 1、配置注解驱动 2、配置视图解析器 3、需要扫描controller 4.1.4Web.xml 1、spring容器的配置 2、Springmvc前端控制器的配置 3、Post乱码过滤器 4.2 框架整合 需要把配置文件放到taotao-manager-web工程下。因为此工程为war工程,其他的工程只是一个jar包。

淘淘商城第十一天笔记

淘淘商城第十一天 1第十天内容回顾 1、单点登录系统 a)分布式环境下session共享。 b)Session放到redis中。 c)使用uuid生成一个token d)Token放到cookie中。 e)根据token或用户信息。 2、sso系统集成portal a)用户登录注册功能都跳转到sso系统。 b)登录完成后跳转首页。 c)首页需要在加载完成后,需要从cookie中取token,调用sso系统的服务(jsonp) 根据token查询用户信息,把用户名显示到首页。 d)使用拦截器实现用户强制登录。 e)回调页面的实现 2课程计划 1、购物车的实现 2、订单系统的实现。 3购物车 3.1 分析 1、添加购物车不需要用户登录。购物车的数据应该放到cookie中。 2、当向购物车添加同一款商品时,购物车中商品的数量增加。 3、购物车中可以删除商品 4、购物车中可以修改商品数量。商品的总价需要重新计算。 5、点击“结算”按钮要求用户登录。 3.2 添加购物车 3.2.1分析 请求的url:/cart/add/${itemId}.html 1、接收商品id,根据商品id取商品的图片、title、单价,需要包含商品的数量。并且把数据保存到列表中。 2、把商品数据转换成json数据,保存到cookie中。对购物车数据进行转码。 3、展示添加购物车成功页面。

3.2.2Service 参数: 1、商品id 2、商品数量 业务逻辑: 1、接收商品id 2、从cookie中购物车商品列表 3、从商品列表中查询列表是否存在此商品 4、如果存在商品的数量加上参数中的商品数量 5、如果不存在,调用rest服务,根据商品id获得商品数据。 6、把商品数据添加到列表中 7、把购物车商品列表写入cookie 8、返回TaotaoResult 返回值:TaotaoResult 购物车商品POJO: publicclass CartItem { private Long id; private String title; private Long price; private Integer num; private String image; } @Service publicclass CartServiceImpl implements CartService { @Autowired private ItemService itemService; @Value("${COOKIE_EXPIRE}") private Integer COOKIE_EXPIRE; @Override public TaotaoResult addCart(Long itemId, Integer num, HttpServletRequest request, HttpServletResponse response) { // 1、接收商品id

淘淘商城第九天笔记

淘淘商城第九天1第八天内容回顾 1、搜索系统的实现 a)发布搜索服务,pc、移动端都可以调用。 b)在portal中调用服务,实现搜索功能。 2、Solr提供的搜索服务。 a)Solr的集群 b)Solr集群的使用。 c)单机版使用HttpSolrServer。 d)集群版使用CloudSolrServer。 2课程计划 1、商品详情页面的展示 a)伪静态化(使用jsp动态展示) b)添加缓存,redis 2、网页静态化freemaker+nginx 3商品详情页面展示 3.1 分析 在搜索结果中点击商品图片或者title打开商品详情页面。

在Controller中从url中把商品id取出来,根据商品id查询对应的商品详细信息。 商品信息应该是调用服务来获得。需要在taotao-rest中发布服务。 Taotao-rest服务中根据商品id查询商品信息。 需要用到的表: 商品表:tb_item 商品详细信息:tb_item_desc 商品的规格参数:tb_item_param_item 应该发布三个服务:商品基本信息、取商品详情、取商品的规格参数。 3.2 发布服务 3.2.1商品基本信息服务 根据商品id取数据。商品表:tb_item 3.2.1.1 D ao层 使用逆向工程 3.2.1.2 S ervice层 接收商品id,根据商品id查询商品基本信息。返回商品基本信息的pojo——TbItem。 为了减轻数据库的压力,需要添加缓存。由于商品数据比较多,需要把用户访问的数据添加缓存中,同时需要设置商品数据的过期时间,根据时间情况调整,需要把过期时间放到配置文件中。 要设置过期时间redis中只能在key上设置。 使用String数据类型,为了便于分组可以使用“:”分隔的命名方式。 REDIS_ITEM:BASE_INFO:{ITEM_ID} @Service publicclass ItemServiceImpl implements ItemService {

相关文档