src/main/java/com/ks/tool/bkz/controller/ParseController.java
@@ -1,19 +1,35 @@ package com.ks.tool.bkz.controller; import com.alibaba.fastjson.JSONObject; import com.ks.tool.bkz.dto.FirstOrderSubParseResult; import com.ks.tool.bkz.entity.FirstOrderSubInfo; import com.ks.tool.bkz.service.FirstOrderSubInfoService; import com.ks.tool.bkz.service.manager.RedisManager; import com.ks.tool.bkz.util.FirstOrderSubDataUtil; import com.ks.tool.bkz.util.JsonUtil; import com.ks.tool.bkz.util.UrlUtil; import org.omg.CORBA.PUBLIC_MEMBER; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; import java.util.List; import java.util.Map; @Controller @RequestMapping("parse") public class ParseController { String cookie = null; @Resource private RedisManager redisManager; @Resource private FirstOrderSubInfoService firstOrderSubInfoService; @RequestMapping("getRequestUrl") @ResponseBody @@ -21,24 +37,35 @@ String host = UrlUtil.getHost(baseUrl); Map<String, String> params = UrlUtil.getParamsMap(baseUrl); params.put("t", System.currentTimeMillis() + ""); cookie = redisManager.get("cookie"); String token = FirstOrderSubDataUtil.getTokenFromCookie(cookie); String data = params.get("data"); try { data = URLDecoder.decode(data, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } JSONObject dataJSON = JSONObject.parseObject(data); String paramsStr = dataJSON.getString("params"); dataJSON = JSONObject.parseObject(paramsStr); int pageNo = dataJSON.getInteger("pageNo"); dataJSON.put("pageNo", pageNo + 1); JSONObject paramsJSON = new JSONObject(); paramsJSON.put("params", dataJSON.toJSONString()); data = paramsJSON.toJSONString(); String sign = FirstOrderSubDataUtil.getSign(token, params.get("t"), params.get("appKey"), data); params.put("data", data); params.put("sign", sign); String requestUrl = UrlUtil.getRequestUrl(host, params); return requestUrl; if (pageNo < 30) { dataJSON.put("pageNo", pageNo + 1); JSONObject paramsJSON = new JSONObject(); paramsJSON.put("params", dataJSON.toJSONString()); data = paramsJSON.toJSONString(); String sign = FirstOrderSubDataUtil.getSign(token, params.get("t"), params.get("appKey"), data); params.put("data", data); params.put("sign", sign); String requestUrl = UrlUtil.getRequestUrl(host, params); JSONObject root = new JSONObject(); root.put("url", requestUrl); System.out.println(requestUrl); return JsonUtil.loadTrueResult(root); } else { return JsonUtil.loadFalseResult(1, ""); } } @@ -52,8 +79,40 @@ @ResponseBody public String uploadCookie(String cookies) { this.cookie = cookies; redisManager.save("cookie", cookies, 60 * 60); return cookies; } @RequestMapping("getLoginUrl") public void getLoginUrl(PrintWriter out) { JSONObject data = new JSONObject(); data.put("loginUrl", String.format("http://login.taobao.com/member/login.jhtml?style=mini&newMini2=true&redirectURL=%s&full_redirect=true&disableQuickLogin=true", URLEncoder.encode("https://m.tb.cn/h.VN61jro?sm=9ed9c4"))); out.print(JsonUtil.loadTrueResult(data)); } @RequestMapping("getCookie") @ResponseBody public String getCookie() { return redisManager.get("cookie"); } @RequestMapping("uploadContent") @ResponseBody public String uploadContent(String content) { FirstOrderSubParseResult result = FirstOrderSubDataUtil.parseOrderSubData(content); if (result != null && result.isHasNextPage()) { if (result.getGoodsList() != null) for (FirstOrderSubInfo info : result.getGoodsList()) { firstOrderSubInfoService.add(info); System.out.println(info.getId() + "-" + info.getTitle()); } System.out.println("----------------------------"); return JsonUtil.loadTrueResult(null); } else { return JsonUtil.loadFalseResult(1, "无更多数据"); } } } src/main/java/com/ks/tool/bkz/dao/FirstOrderSubInfoDao.java
New file @@ -0,0 +1,19 @@ package com.ks.tool.bkz.dao; import com.ks.tool.bkz.entity.FirstOrderSubInfo; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.stereotype.Repository; import javax.annotation.Resource; @Repository public class FirstOrderSubInfoDao { @Resource private MongoTemplate mongoTemplate; public void save(FirstOrderSubInfo info) { mongoTemplate.save(info); } } src/main/java/com/ks/tool/bkz/dao/MongodbBaseDao.java
New file @@ -0,0 +1,102 @@ package com.ks.tool.bkz.dao; import java.lang.reflect.ParameterizedType; import java.util.List; import javax.annotation.Resource; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import org.springframework.stereotype.Repository; @Repository public abstract class MongodbBaseDao<T> { @Resource protected MongoTemplate mongoTemplate; /** * 插入数据 * * @param bean * @return */ public T save(T bean) { mongoTemplate.save(bean); return bean; } /** * 根据主键更新数据 * * @param query * @param update */ public void update(Query query, Update update) { mongoTemplate.upsert(query, update, this.getEntityClass()); } /** * 查询一个数据 * * @param query * @return */ public T findOne(Query query) { return (T) mongoTemplate.findOne(query, this.getEntityClass()); } /** * 查询多个数据 * * @param query * @return */ public List<T> findList(Query query) { return mongoTemplate.find(query, this.getEntityClass()); } /** * 统计数量 * * @param query * @return */ public long count(Query query) { return mongoTemplate.count(query, this.getEntityClass()); } /** * 主键查询 * * @param id * @return */ public T get(Object id) { return (T) mongoTemplate.findById(id, this.getEntityClass()); } /** * 通过主键删除 * * @param id */ public void delete(Object id) { Query query = Query.query(Criteria.where("id").is(id)); mongoTemplate.remove(query, getEntityClass()); } public void delete(Query query) { mongoTemplate.remove(query, getEntityClass()); } @SuppressWarnings("unchecked") protected Class<T> getEntityClass() { Class<T> tClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()) .getActualTypeArguments()[0]; return tClass; } } src/main/java/com/ks/tool/bkz/dto/FirstOrderSubParseResult.java
New file @@ -0,0 +1,33 @@ package com.ks.tool.bkz.dto; import com.ks.tool.bkz.entity.FirstOrderSubInfo; import java.util.List; public class FirstOrderSubParseResult { private boolean hasNextPage;//是否有下一页 private List<FirstOrderSubInfo> goodsList;//商品列表 public FirstOrderSubParseResult(boolean hasNextPage, List<FirstOrderSubInfo> goodsList) { this.hasNextPage = hasNextPage; this.goodsList = goodsList; } public boolean isHasNextPage() { return hasNextPage; } public void setHasNextPage(boolean hasNextPage) { this.hasNextPage = hasNextPage; } public List<FirstOrderSubInfo> getGoodsList() { return goodsList; } public void setGoodsList(List<FirstOrderSubInfo> goodsList) { this.goodsList = goodsList; } } src/main/java/com/ks/tool/bkz/entity/FirstOrderSubInfo.java
File was renamed from src/main/java/com/ks/tool/bkz/dto/FirstOrderSubInfoDTO.java @@ -1,39 +1,92 @@ package com.ks.tool.bkz.dto; package com.ks.tool.bkz.entity; public class FirstOrderSubInfoDTO { private String activityPrice; import com.ks.tool.bkz.dto.FirstOrderSubInfoRecommendTitleDTO; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; import java.math.BigDecimal; import java.util.Date; @Document(collation = "tbFirstOrderSubInfo") public class FirstOrderSubInfo { @Field private Integer activityPrice; @Field private String brandLogo; @Field private String brandName; @Field private String entitySource; @Id private String id; private String itemActPrice; @Field private BigDecimal itemActPrice; @Field private String itemDesc; @Field private String itemId; @Field private String itemImg; @Field private String itemPrice; @Field private String itemType; @Field private String itemUrl; private String materials; @Field private String monthSellNum; @Field private String npcCnt; @Field private String promotionAmount; private String promotionDisplayAmount; private String promotionPrice; @Field private int promotionDisplayAmount; @Field private BigDecimal promotionPrice; @Field private String promotionTag; @Field private String promotionValue; @Field private String remainStock; @Field private String sellerUrl; @Field private String shopTitle; @Field private String shortTitle; @Field private String title; @Field private Date createTime; @Field private Date updateTime; @Field private FirstOrderSubInfoRecommendTitleDTO recommendTitle; public Date getCreateTime() { return createTime; } public String getActivityPrice() { public void setCreateTime(Date createTime) { this.createTime = createTime; } public Date getUpdateTime() { return updateTime; } public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; } public Integer getActivityPrice() { return activityPrice; } public void setActivityPrice(String activityPrice) { public void setActivityPrice(Integer activityPrice) { this.activityPrice = activityPrice; } @@ -69,11 +122,11 @@ this.id = id; } public String getItemActPrice() { public BigDecimal getItemActPrice() { return itemActPrice; } public void setItemActPrice(String itemActPrice) { public void setItemActPrice(BigDecimal itemActPrice) { this.itemActPrice = itemActPrice; } @@ -125,14 +178,6 @@ this.itemUrl = itemUrl; } public String getMaterials() { return materials; } public void setMaterials(String materials) { this.materials = materials; } public String getMonthSellNum() { return monthSellNum; } @@ -157,19 +202,19 @@ this.promotionAmount = promotionAmount; } public String getPromotionDisplayAmount() { public int getPromotionDisplayAmount() { return promotionDisplayAmount; } public void setPromotionDisplayAmount(String promotionDisplayAmount) { public void setPromotionDisplayAmount(int promotionDisplayAmount) { this.promotionDisplayAmount = promotionDisplayAmount; } public String getPromotionPrice() { public BigDecimal getPromotionPrice() { return promotionPrice; } public void setPromotionPrice(String promotionPrice) { public void setPromotionPrice(BigDecimal promotionPrice) { this.promotionPrice = promotionPrice; } src/main/java/com/ks/tool/bkz/service/FirstOrderSubInfoService.java
New file @@ -0,0 +1,7 @@ package com.ks.tool.bkz.service; import com.ks.tool.bkz.entity.FirstOrderSubInfo; public interface FirstOrderSubInfoService { public void add(FirstOrderSubInfo info); } src/main/java/com/ks/tool/bkz/service/impl/FirstOrderSubInfoServiceImpl.java
New file @@ -0,0 +1,24 @@ package com.ks.tool.bkz.service.impl; import com.ks.tool.bkz.dao.FirstOrderSubInfoDao; import com.ks.tool.bkz.entity.FirstOrderSubInfo; import com.ks.tool.bkz.service.FirstOrderSubInfoService; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.Date; @Service public class FirstOrderSubInfoServiceImpl implements FirstOrderSubInfoService { @Resource private FirstOrderSubInfoDao firstOrderSubInfoDao; @Override public void add(FirstOrderSubInfo info) { if (info.getCreateTime() == null) info.setCreateTime(new Date()); if (info.getUpdateTime() == null) info.setUpdateTime(new Date()); firstOrderSubInfoDao.save(info); } } src/main/java/com/ks/tool/bkz/util/FirstOrderSubDataUtil.java
@@ -4,7 +4,8 @@ import com.alibaba.fastjson.JSONObject; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.ks.tool.bkz.dto.FirstOrderSubInfoDTO; import com.ks.tool.bkz.dto.FirstOrderSubParseResult; import com.ks.tool.bkz.entity.FirstOrderSubInfo; import java.lang.reflect.Type; import java.util.HashMap; @@ -20,18 +21,24 @@ * @param data * @return */ public static List<FirstOrderSubInfoDTO> parseOrderSubData(String data) { public static FirstOrderSubParseResult parseOrderSubData(String data) { data = data.trim().substring(data.indexOf("(")); if (data.endsWith(")")) data = data.substring(0, data.length() - 1); JSONObject dataJSON = JSONObject.parseObject(data); JSONObject resultValue = dataJSON.getJSONObject("data").getJSONObject("resultValue"); for (Iterator<String> its = resultValue.keySet().iterator(); its.hasNext(); ) { String key = its.next(); if (NumberUtil.isNumeric(key)) { JSONArray array = resultValue.getJSONObject(key).getJSONObject("data").getJSONArray("entity").getJSONObject(0).getJSONArray("model"); Type type = new TypeToken<List<FirstOrderSubInfoDTO>>() { JSONObject entity = resultValue.getJSONObject(key).getJSONObject("data").getJSONArray("entity").getJSONObject(0); boolean hasNextPage = entity.getBoolean("hasNextPage"); JSONArray array = entity.getJSONArray("model"); Type type = new TypeToken<List<FirstOrderSubInfo>>() { }.getType(); List<FirstOrderSubInfoDTO> list = new Gson().fromJson(array.toString(), type); return list; List<FirstOrderSubInfo> list = new Gson().fromJson(array.toString(), type); return new FirstOrderSubParseResult(hasNextPage, list); } } return null; @@ -53,6 +60,7 @@ /** * 获取token * * @param cookie * @return */ src/main/java/com/ks/tool/bkz/util/JsonUtil.java
New file @@ -0,0 +1,22 @@ package com.ks.tool.bkz.util; import com.alibaba.fastjson.JSONObject; public class JsonUtil { public static String loadTrueResult(JSONObject data) { JSONObject root = new JSONObject(); root.put("code", 0); root.put("data", data); return root.toJSONString(); } public static String loadFalseResult(int code, String msg) { JSONObject root = new JSONObject(); root.put("code", code); root.put("msg", msg); return root.toJSONString(); } } src/main/java/com/ks/tool/bkz/util/UrlUtil.java
@@ -29,7 +29,7 @@ */ public static Map<String, String> getParamsMap(String url) { if (url.indexOf("?") > -1) { String params = url.substring(url.indexOf("?"), url.length()); String params = url.substring(url.indexOf("?")+1, url.length()); String[] sts = params.split("&"); Map<String, String> paramsMap = new HashMap<>(); for (String st : sts) { @@ -49,7 +49,7 @@ * @return */ public static String getRequestUrl(String url, Map<String, String> params) { String URL = url; String URL = url+"?"; for (Iterator<String> its = params.keySet().iterator(); its.hasNext(); ) { String key = its.next(); src/main/resources/application.yml
@@ -1,7 +1,14 @@ server: port: 8082 tomcat: uri-encoding: UTF-8 spring: http: encoding: force: true charset: UTF-8 enabled: true datasource: url: jdbc:mysql://gz-cdb-r13d0yi9.sql.tencentcdb.com:62929/test username: root @@ -28,12 +35,13 @@ data: mongodb: username: admin password: Yeshi2016@ host: 193.112.35.168 port: 27016 database: flq password: '123456' host: 192.168.1.253 port: 27017 database: tbtool authentication-database: admin redis: host: 127.0.0.1 host: 192.168.1.253 port: 6379 password: 123456 timeout: 5000 @@ -42,6 +50,7 @@ max-wait: 10000 max-idle: 200 max-active: 1024 database: 2 mybatis: mapper-locations: classpath:mapper/*.xml src/test/java/com/ks/tool/bkz/BkzApplicationTests.java
@@ -12,7 +12,7 @@ @Resource private RedisManager redisManager; @Test // @Test void contextLoads() { redisManager.save("test","123",10); System.out.println(redisManager.get("test"));