提交 7a059ddb authored 作者: zhengfg's avatar zhengfg

提交代码

上级 fafabd5d
...@@ -10,29 +10,40 @@ ...@@ -10,29 +10,40 @@
</parent> </parent>
<groupId>com.diaoyun</groupId> <groupId>com.diaoyun</groupId>
<artifactId>zion</artifactId> <artifactId>zion</artifactId>
<version>0.0.1-SNAPSHOT</version> <version>0.1.1-SNAPSHOT</version>
<name>zion</name> <name>zion</name>
<description>逐渐把项目完善</description> <description>逐渐把项目完善</description>
<packaging>jar</packaging>
<properties> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version> <java.version>1.8</java.version>
<skipTests>true</skipTests>
</properties> </properties>
<dependencies> <dependencies>
<!--springframework.boot--> <!--springframework.boot-->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId> <artifactId>spring-boot-starter-web</artifactId>
<!-- 移除嵌入式tomcat插件 --> <!-- 移除嵌入式tomcat插件 -->
<exclusions> <!--<exclusions>
<exclusion> <exclusion>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId> <artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion> </exclusion>
</exclusions> </exclusions>-->
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<!--<version>2.8.5</version>-->
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId> <artifactId>spring-boot-starter-test</artifactId>
...@@ -44,7 +55,7 @@ ...@@ -44,7 +55,7 @@
<dependency> <dependency>
<groupId>javax.servlet</groupId> <groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId> <artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version> <!--<version>3.1.0</version>-->
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<!--部署tomcat所需--> <!--部署tomcat所需-->
...@@ -76,7 +87,7 @@ ...@@ -76,7 +87,7 @@
<dependency> <dependency>
<groupId>joda-time</groupId> <groupId>joda-time</groupId>
<artifactId>joda-time</artifactId> <artifactId>joda-time</artifactId>
<version>2.10.3</version> <!-- <version>2.10.3</version>-->
</dependency> </dependency>
<!--swagger2--> <!--swagger2-->
<dependency> <dependency>
...@@ -95,7 +106,7 @@ ...@@ -95,7 +106,7 @@
<dependency> <dependency>
<groupId>org.apache.commons</groupId> <groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId> <artifactId>commons-lang3</artifactId>
<version>3.8</version> <!--<version>3.8</version>-->
</dependency> </dependency>
<!--apache.commons--> <!--apache.commons-->
<!-- https://mvnrepository.com/artifact/net.sf.json-lib/json-lib --> <!-- https://mvnrepository.com/artifact/net.sf.json-lib/json-lib -->
...@@ -110,10 +121,70 @@ ...@@ -110,10 +121,70 @@
<dependency> <dependency>
<groupId>org.apache.httpcomponents</groupId> <groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId> <artifactId>httpclient</artifactId>
<version>4.5.2</version> <!--<version>4.5.2</version>-->
</dependency> </dependency>
<!--apache httpclient--> <!--apache httpclient-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!-- spring-context-support FreeMarkerConfigurationFactoryBean-->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<!--<version>5.1.5.RELEASE</version>-->
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-email -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-email</artifactId>
<version>1.5</version>
</dependency>
<!--发邮件 END-->
<!--复制属性 vo2po-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<!--<version>5.1.6.RELEASE</version>-->
</dependency>
<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup 解析html-->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.12.1</version>
</dependency>
<!--解码-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.6</version>
</dependency>
<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>
...@@ -125,4 +196,5 @@ ...@@ -125,4 +196,5 @@
</plugins> </plugins>
</build> </build>
</project> </project>
...@@ -2,17 +2,19 @@ package com.diaoyun.zion; ...@@ -2,17 +2,19 @@ package com.diaoyun.zion;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.cache.annotation.EnableCaching;
@SpringBootApplication @SpringBootApplication
@EnableCaching
public class ZionApplication extends SpringBootServletInitializer { public class ZionApplication extends SpringBootServletInitializer {
@Override //tomcat 设置
/*@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
// 注意这里要指向原先用main方法执行的Application启动类 // 注意这里要指向原先用main方法执行的Application启动类
return builder.sources(ZionApplication.class); return builder.sources(ZionApplication.class);
} }*/
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(ZionApplication.class, args); SpringApplication.run(ZionApplication.class, args);
} }
......
package com.diaoyun.zion.chinafrica.controller; package com.diaoyun.zion.chinafrica.api;
import com.alibaba.druid.support.json.JSONUtils; import com.alibaba.druid.support.json.JSONUtils;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
...@@ -6,6 +6,7 @@ import io.swagger.annotations.ApiOperation; ...@@ -6,6 +6,7 @@ import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
...@@ -17,9 +18,9 @@ import java.util.Map; ...@@ -17,9 +18,9 @@ import java.util.Map;
* @author G * @author G
* *
*/ */
@Api(value = "ThirdPartyController|提供给第三方api") @Api(tags = "提供给第三方api")
@RestController @RestController
@RequestMapping("/chinafrica") @RequestMapping("/chinafrica/api")
public class ThirdPartyController { public class ThirdPartyController {
private static Logger logger= LoggerFactory.getLogger(ThirdPartyController.class); private static Logger logger= LoggerFactory.getLogger(ThirdPartyController.class);
...@@ -57,6 +58,32 @@ public class ThirdPartyController { ...@@ -57,6 +58,32 @@ public class ThirdPartyController {
return JSONUtils.toJSONString(returnList); return JSONUtils.toJSONString(returnList);
} }
/**
*根据订单号获取详细订单数据
*/
@ApiOperation(value = "获取某段时间已发货订单数据")
@GetMapping(value ="/order/detail/{orderId}")
public String getOrderDetailById(@PathVariable("orderId")String orderId) {
Map<String,Object> map=new HashMap<>();
map.put("orderId","订单Id8848");
map.put("deliveryName","收货人");
map.put("deliveryPhone","收货人手机");
map.put("deliveryAddress","收货人地址");
List<Map<String,Object>> itemList=new ArrayList<>();
Map<String,Object> itemMap=new HashMap<>();
itemMap.put("itemCategory","品名");
itemMap.put("itemPrice","单价");
itemMap.put("itemNum","数量");
Map<String,Object> itemMap2=new HashMap<>();
itemMap2.put("itemCategory","品名2");
itemMap2.put("itemPrice","单价2");
itemMap2.put("itemNum","数量2");
itemList.add(itemMap);
itemList.add(itemMap2);
map.put("itemList",itemList);
return JSONUtils.toJSONString(map);
}
......
package com.diaoyun.zion.chinafrica.bis;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.Map;
import java.util.concurrent.ExecutionException;
/**
* 商品爬虫接口
*/
public interface IItemSpider {
/**
* 爬取商品数据
* @param targetUrl
* @return
*/
Map<String,Object> captureItem(String targetUrl) throws URISyntaxException, IOException, ExecutionException, InterruptedException;
}
package com.diaoyun.zion.chinafrica.bis.impl;
import com.diaoyun.zion.chinafrica.bis.IItemSpider;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
/**
* 空的数据爬虫
*/
@Component("emptyItemSpider")
public class EmptyItemSpider implements IItemSpider {
@Override
public Map<String, Object> captureItem(String targetUrl) {
Map<String, Object> resultMap=new HashMap<>();
resultMap.put("code","-1");
resultMap.put("message","找不到此类网址的数据爬虫!");
return resultMap;
}
}
package com.diaoyun.zion.chinafrica.bis.impl;
import com.diaoyun.zion.chinafrica.bis.IItemSpider;
import com.diaoyun.zion.master.bo.TecentTranslateParam;
import com.diaoyun.zion.master.thread.TaskLimitSemaphore;
import com.diaoyun.zion.master.thread.TranslateCallable;
import com.diaoyun.zion.master.util.HttpClientUtil;
import com.diaoyun.zion.master.util.JsoupUtil;
import com.diaoyun.zion.master.util.ValidateUtils;
import net.sf.json.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.text.StringEscapeUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.message.BasicHeader;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
/**
* 淘宝网数据爬虫
*/
@Component("tbItemSpider")
public class TbItemSpider implements IItemSpider {
private static Logger logger = LoggerFactory.getLogger(TbItemSpider.class);
//默认20条线程跑翻译
private final TaskLimitSemaphore taskLimitSemaphore=new TaskLimitSemaphore(20);
private final List<Map<String, Object>> futureList= new ArrayList<>();
@Override
public Map<String, Object> captureItem(String targetUrl) throws URISyntaxException, IOException, ExecutionException, InterruptedException {
Long a=System.currentTimeMillis();
//构建URI
URI uri=new URIBuilder(targetUrl).build();
//创建一个HttpContext对象,用来保存Cookie
//HttpClientContext httpClientContext = HttpClientContext.create();
//构造自定义的HttpClient对象
CloseableHttpClient httpClient = HttpClientUtil.createBrowserClient();
/* 构造请求对象 */
HttpUriRequest httpUriRequest = RequestBuilder.get().setUri(uri).build();
/* ****************获取商品详情链接******************* */
//执行请求,传入HttpContext,将会得到请求结果的信息
//httpClient.execute(httpUriRequest,httpClientContext)
HttpResponse httpResponse=httpClient.execute(httpUriRequest);
//拿到返回的HttpResponse的"实体"
HttpEntity result = httpResponse.getEntity();
String content = EntityUtils.toString(result);
//获取商品详情url
String usableSibUrl= JsoupUtil.getSibUrl(content);
//解析商品sku信息
Map<String,Object> propMap=JsoupUtil.getPropMap(content);
//关闭连接
httpClient.close();
Long b=System.currentTimeMillis();
logger.info("获取淘宝数据,第一段时间(毫秒):"+(b-a));
//调用腾讯ai,翻译规格
translateProp(propMap);
//等待翻译结果
for(Map<String,Object> futureMap:futureList) {
Future<Map<String,Object>> future= (Future<Map<String, Object>>) futureMap.get("future");
Map<String,Object> valeMap = (Map<String,Object> ) futureMap.get("value");
while(!future.isDone());//Future返回如果没有完成,则一直循环等待,直到Future返回完成
Map<String,Object> resultMap=future.get();
String targetText="unknow";
if(resultMap!=null&&(int)resultMap.get("ret")==0) {
Map<String,Object> dataMap=(Map<String,Object>)resultMap.get("data");
targetText= (String) dataMap.get("target_text");
valeMap.put("translate",targetText);
} else {
logger.error("翻译出错");
}
}
//关闭线程池 不能关闭,否则下次调用不了
//taskLimitSemaphore.shutdown();
Long c=System.currentTimeMillis();
logger.info("翻译时间(毫秒):"+(c-b));
/* ****************获取商品详情******************* */
//删除需要登录的模块
usableSibUrl=deleteLoginModule(usableSibUrl);
URI sibUri=new URIBuilder(usableSibUrl).build();
//构造请求对象
HttpUriRequest sibUriRequest = RequestBuilder.get().setUri(sibUri).build();
BasicHeader basicHeader=new BasicHeader("referer", targetUrl);
//构造自定义的HttpClient对象
CloseableHttpClient sibClient = HttpClientUtil.createBrowserClient(basicHeader);
//创建一个HttpContext对象,用来保存Cookie
//HttpClientContext sibClientContext = HttpClientContext.create();
//执行请求,传入HttpContext,将会得到请求结果的信息
HttpResponse sibResponse=sibClient.execute(sibUriRequest);
//拿到返回的HttpResponse的"实体"
HttpEntity sibResult = sibResponse.getEntity();
String sibContent = EntityUtils.toString(sibResult);
//unicode 解码
sibContent= StringEscapeUtils.unescapeJava(sibContent);
Map sibMap= JSONObject.fromObject(sibContent);
sibMap.put("Jprop",propMap);
logger.info(sibMap.toString());
//从请求结果中获取Cookie,此时的Cookie已经带有登录信息了
//CookieStore store = httpClientContext.getCookieStore();
sibClient.close();
Long d=System.currentTimeMillis();
logger.info("获取详情时间(毫秒):"+(d-c));
logger.info("爬取数据总共耗费时间(毫秒):"+(d-a));
return sibMap;
}
/**
* 翻译规格属性
* @param propMap 规格属性MAP
* @throws ExecutionException
* @throws InterruptedException
*/
private void translateProp(Map<String, Object> propMap) throws ExecutionException, InterruptedException {
/*腾讯翻译*/
for(Map.Entry<String,Object>entry : propMap.entrySet()) {
String key=entry.getKey();
Map <String,Object> value= (Map<String, Object>) entry.getValue();
//翻译属性名
if(ValidateUtils.isChinese(key)) {
translateText(value,key);
}
//翻译sku title
if(value!=null&&value.size()>0) {
translateTitle(value);
}
}
}
/**
* 翻译规格说明
* @param skuMap
* @throws ExecutionException
* @throws InterruptedException
*/
private void translateTitle(Map<String, Object> skuMap) throws ExecutionException, InterruptedException {
for(Map.Entry<String,Object>entry : skuMap.entrySet()) {
String key=entry.getKey();
if(entry.getValue() instanceof Map) {
Map<String, Object> value = (Map<String, Object>) entry.getValue();
String title = (String) value.get("title");
if (StringUtils.isNotBlank(title)) {
//翻译属性名
if (ValidateUtils.isContainChinese(title)) {
translateText(value,title);
//value.put("translate", translate);
}
}
}
}
}
/**
* 翻译文本
* @param valeMap
* @param text
* @throws ExecutionException
* @throws InterruptedException
*/
private void translateText(Map<String,Object> valeMap,String text) throws ExecutionException, InterruptedException {
TecentTranslateParam tecentTranslateParam=new TecentTranslateParam(text);
Future<Map<String,Object>> future = null;
try {
future = taskLimitSemaphore.submit(new TranslateCallable(tecentTranslateParam));
Map<String,Object> map=new HashMap<>();
map.put("future",future);
map.put("value",valeMap);
futureList.add(map);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 去除需要登录或者不需要返回的参数
* @param usableSibUrl
* @return
*/
private String deleteLoginModule(String usableSibUrl) {
usableSibUrl=usableSibUrl.replaceAll("couponActivity,","");
usableSibUrl=usableSibUrl.replaceAll("soldQuantity,","");
usableSibUrl=usableSibUrl.replaceAll("tradeContract,","");
usableSibUrl=usableSibUrl.replaceAll("upp,","");
// TODO 运费格式有问题,暂去除
usableSibUrl=usableSibUrl.replaceAll("deliveryFee,","");
usableSibUrl=usableSibUrl.replaceAll("delivery,","");
return usableSibUrl;
}
}
package com.diaoyun.zion.chinafrica.client;
import org.springframework.http.HttpStatus;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* Filter基类
*
* @author Joe
*/
public abstract class ClientFilter extends ParamFilter implements Filter {
public abstract boolean isAccessAllowed(HttpServletRequest request, HttpServletResponse response)
throws IOException;
protected boolean isAjaxRequest(HttpServletRequest request) {
String requestedWith = request.getHeader("X-Requested-With");
return requestedWith != null ? "XMLHttpRequest".equals(requestedWith) : false;
}
protected void responseJson(HttpServletResponse response, int code, String message) throws IOException {
response.setContentType("application/json;charset=UTF-8");
response.setStatus(HttpStatus.OK.value());
PrintWriter writer = response.getWriter();
writer.write(new StringBuilder().append("{\"code\":").append(code).append(",\"message\":\"").append(message)
.append("\"}").toString());
writer.flush();
writer.close();
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException {
}
@Override
public void destroy() {
}
}
\ No newline at end of file
package com.diaoyun.zion.chinafrica.client;
import com.diaoyun.zion.chinafrica.rpc.AuthenticationRpcService;
/**
* 参数注入Filter
*
* @author Joe
*/
public class ParamFilter {
// 单点登录服务端URL TODO 改为配置
protected String ssoServerUrl="/zion";
// 单点登录服务端提供的RPC服务,由Spring容器注入
protected AuthenticationRpcService authenticationRpcService;
public void setSsoServerUrl(String ssoServerUrl) {
this.ssoServerUrl = ssoServerUrl;
}
public String getSsoServerUrl() {
return ssoServerUrl;
}
public void setAuthenticationRpcService(AuthenticationRpcService authenticationRpcService) {
this.authenticationRpcService = authenticationRpcService;
}
public AuthenticationRpcService getAuthenticationRpcService() {
return authenticationRpcService;
}
}
\ No newline at end of file
package com.diaoyun.zion.chinafrica.client;
import java.io.Serializable;
/**
* 已登录用户信息
*
* @author Joe
*/
public class SessionUser implements Serializable {
private static final long serialVersionUID = 1764365572138947234L;
// 登录用户访问Token
private String token;
// 登录名
private String account;
public SessionUser() {
super();
}
public SessionUser(String token, String account) {
super();
this.token = token;
this.account = account;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
}
package com.diaoyun.zion.chinafrica.client;
import org.springframework.web.util.WebUtils;
import javax.servlet.http.HttpServletRequest;
/**
* 当前已登录用户Session工具
*
* @author Joe
*/
public class SessionUtils {
/**
* 用户信息
*/
public static final String SESSION_USER = "_sessionUser";
/**
* 用户权限
*/
public static final String SESSION_USER_PERMISSION = "_sessionUserPermission";
public static SessionUser getSessionUser(HttpServletRequest request) {
return (SessionUser) WebUtils.getSessionAttribute(request, SESSION_USER);
}
public static void setSessionUser(HttpServletRequest request, SessionUser sessionUser) {
WebUtils.setSessionAttribute(request, SESSION_USER, sessionUser);
}
/*public static SessionPermission getSessionPermission(HttpServletRequest request) {
return (SessionPermission) WebUtils.getSessionAttribute(request, SESSION_USER_PERMISSION);
}*/
/*public static void setSessionPermission(HttpServletRequest request, SessionPermission sessionPermission) {
WebUtils.setSessionAttribute(request, SESSION_USER_PERMISSION, sessionPermission);
}*/
public static void invalidate(HttpServletRequest request){
setSessionUser(request, null);
//setSessionPermission(request, null);
}
}
\ No newline at end of file
package com.diaoyun.zion.chinafrica.client;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
/**
* 登录及Token验证Filter
* 没做完,暂时不开启
* @author Joe
*/
/*@WebFilter(filterName = "SsoFilter",urlPatterns = {"/*"})*/
public class SsoFilter extends ClientFilter {
// sso授权回调参数token名称
public static final String SSO_TOKEN_NAME = "__vt_param__";
@Override
public boolean isAccessAllowed(HttpServletRequest request, HttpServletResponse response) throws IOException {
String token = getLocalToken(request);
if (token == null) {
token = request.getParameter(SSO_TOKEN_NAME);
if (token != null) {
invokeAuthInfoInSession(request, token);
// 再跳转一次当前URL,以便去掉URL中token参数
response.sendRedirect(getRemoveTokenBackUrl(request));
return false;
}
}
else if (authenticationRpcService.validate(token)) {// 验证token是否有效
return true;
}
redirectLogin(request, response);
return false;
}
/**
* 获取Session中token
*
* @param request
* @return
*/
private String getLocalToken(HttpServletRequest request) {
SessionUser sessionUser = SessionUtils.getSessionUser(request);
return sessionUser == null ? null : sessionUser.getToken();
}
/**
* 存储sessionUser
*
* @param request
* @return
* @throws IOException
*/
private void invokeAuthInfoInSession(HttpServletRequest request, String token) throws IOException {
SessionUser sessionUser = authenticationRpcService.findAuthInfo(token);
if (sessionUser != null) {
SessionUtils.setSessionUser(request, new SessionUser(token, sessionUser.getAccount()));
}
}
/**
* 跳转登录
*
* @param request
* @param response
* @throws IOException
*/
private void
redirectLogin(HttpServletRequest request, HttpServletResponse response) throws IOException {
if (isAjaxRequest(request)) {
responseJson(response, SsoResultCode.SSO_TOKEN_ERROR, "未登录或已超时");
}
else {
SessionUtils.invalidate(request);
String backUrl=getBackUrl(request);
String ssoLoginUrl = new StringBuilder().append(ssoServerUrl)
.append("/login?backUrl=").append(URLEncoder.encode(backUrl, "utf-8")).toString();
response.sendRedirect(ssoLoginUrl);
}
}
/**
* 去除返回地址中的token参数
* @param request
* @return
*/
private String getRemoveTokenBackUrl(HttpServletRequest request) {
String backUrl = getBackUrl(request);
return backUrl.substring(0, backUrl.indexOf(SSO_TOKEN_NAME) - 1);
}
/**
* 返回地址
* @param request
* @return
*/
private String getBackUrl(HttpServletRequest request) {
return new StringBuilder().append(request.getRequestURL())
.append(request.getQueryString() == null ? "" : "?" + request.getQueryString()).toString();
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
String path = ((HttpServletRequest) request).getRequestURI();
if (path.contains("/login")||path.contains("/css/")||path.contains("/js/")) {
try {
chain.doFilter(request, response); // 排除的url
} catch (ServletException e) {
e.printStackTrace();
}
} else {
isAccessAllowed(httpRequest,httpResponse);
}
}
@Override
public void destroy() {
}
}
\ No newline at end of file
package com.diaoyun.zion.chinafrica.client;
/**
* 单点登录权限返回码
*
* @author Joe
*/
public class SsoResultCode {
// SSO 用户授权出错
public final static int SSO_TOKEN_ERROR = 1001; // TOKEN未授权或已过期
public final static int SSO_PERMISSION_ERROR = 1002; // 没有访问权限
}
package com.diaoyun.zion.chinafrica.constant;
/**
* 发送email所用的模板文件
*/
public class EmailTemplateConstant {
//注册
public static String REGISTER="email-template.ftl";
}
package com.diaoyun.zion.chinafrica.constant;
/**
* 各种key
*/
public class KeyConstant {
//验证码
public static String IDENTIFY_CODE="identifyCode";
//登录用户
public static String LOGIN_USER="loginUser";
}
package com.diaoyun.zion.chinafrica.controller;
import com.diaoyun.zion.chinafrica.client.SessionUser;
import com.diaoyun.zion.chinafrica.client.SessionUtils;
import com.diaoyun.zion.chinafrica.client.SsoFilter;
import com.diaoyun.zion.chinafrica.constant.KeyConstant;
import com.diaoyun.zion.chinafrica.entity.TbCfUserInfoEntity;
import com.diaoyun.zion.chinafrica.service.TbCfUserInfoService;
import com.diaoyun.zion.chinafrica.vo.TbCfUserInfoVo;
import com.diaoyun.zion.master.base.BaseController;
import com.diaoyun.zion.master.base.Result;
import com.diaoyun.zion.master.base.ResultCode;
import com.diaoyun.zion.master.base.StateConstant;
import com.diaoyun.zion.master.common.TokenManager;
import com.diaoyun.zion.master.enums.UserTypeEnum;
import com.diaoyun.zion.master.util.CookieUtils;
import com.diaoyun.zion.master.util.IdUtil;
import com.diaoyun.zion.master.util.PasswordProvider;
import com.diaoyun.zion.master.validator.Validator;
import com.diaoyun.zion.master.validator.annotation.ValidateParam;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 用户登录
*
* @author G
*/
@Api(tags = "用户登录")
@RestController
@RequestMapping("/login")
public class LoginController extends BaseController {
private static Logger logger = LoggerFactory.getLogger(LoginController.class);
// 登录页 TODO 改为配置
private static final String LOGIN_PATH = "page/login.html";
@Autowired
private HttpServletRequest request; //自动注入request
@Autowired
private HttpServletResponse response;
@Autowired
private TbCfUserInfoService tbCfUserInfoService;
@Resource(name="redisTokenManager")
private TokenManager tokenManager;
@ApiOperation(value = "注册并登录")
@PostMapping(value = "/register")
@ResponseBody
public Result registerAndLogin(@ApiParam @RequestBody TbCfUserInfoVo tbCfUserInfoVo) {
Result result = new Result();
Integer identifyCode = (Integer) request.getSession().getAttribute(KeyConstant.IDENTIFY_CODE);
if (identifyCode == null || identifyCode.intValue() != tbCfUserInfoVo.getCaptcha().intValue()) {
result = new Result(ResultCode.VALIDATE_ERROR);
result.setMessage("验证码错误");
} else {
//目前有验证码的都是邮箱类型
tbCfUserInfoVo.setUserType(UserTypeEnum.EMAIL.getCode());
tbCfUserInfoVo.setEnableFlag(StateConstant.VALID);
TbCfUserInfoVo loginUser = tbCfUserInfoService.registerAndLogin(tbCfUserInfoVo);
//注册成功 创建token
String token = createToken(loginUser);
addTokenInCookie(token, request, response);
SessionUtils.setSessionUser(request, new SessionUser(token, loginUser.getAccount()));
//request.getSession().setAttribute(KeyConstant.LOGIN_USER, loginUser);
result.setMessage("注册成功!");
result.setData(loginUser);
}
return result;
}
@ApiOperation("登录页")
@RequestMapping(method = RequestMethod.GET)
public void login(
@ApiParam(value = "返回链接", required = true) @ValidateParam({ Validator.NOT_BLANK }) String backUrl,
HttpServletRequest request) throws IOException {
String token = CookieUtils.getCookie(request, TokenManager.TOKEN);
if (StringUtils.isNotBlank(token) && tokenManager.validate(token) != null) {
response.sendRedirect(authBackUrl(backUrl, token));
//return "redirect:" + authBackUrl(backUrl, token);
}
else {
response.sendRedirect(goLoginPath(backUrl, request));
//return goLoginPath(backUrl, request);
}
}
@ApiOperation(value = "登录")
@GetMapping("/form")
@ResponseBody
public Result login(@ApiParam(value = "登录名") @RequestParam(required = false) String account,
@ApiParam(value = "密码") @RequestParam(required = false) String password) {
Result result;
String token = CookieUtils.getCookie(request, TokenManager.TOKEN);
if (StringUtils.isNotBlank(token)) {// 有cookies的情况
TbCfUserInfoVo tbCfUserInfoVo = tokenManager.validate(token);
if(tbCfUserInfoVo==null) {
CookieUtils.removeCookie(response, TokenManager.TOKEN,"/",null);
result=new Result().setCode(ResultCode.ERROR).setMessage("请重新登录");
} else {
result = tbCfUserInfoService.login(getIpAddr(request), tbCfUserInfoVo.getAccount(), tbCfUserInfoVo.getPassword());
SessionUtils.setSessionUser(request, new SessionUser(token, tbCfUserInfoVo.getAccount()));
}
} else {
Validator.NOT_BLANK.validate("登录名",account);
Validator.NOT_BLANK.validate("密码",password);
result = tbCfUserInfoService.login(getIpAddr(request), account, PasswordProvider.encrypt(password));
if (result.getCode()!=ResultCode.SUCCESS) {
//登录错误
} else {
TbCfUserInfoEntity user = (TbCfUserInfoEntity) result.getData();
TbCfUserInfoVo loginUser = new TbCfUserInfoVo();
BeanUtils.copyProperties(user, loginUser);
token = createToken(loginUser);
addTokenInCookie(token, request, response);
SessionUtils.setSessionUser(request, new SessionUser(token, loginUser.getAccount()));
}
}
return result;
}
private String createToken(TbCfUserInfoVo loginUser) {
// 生成token
String token = IdUtil.createIdbyUUID();
// 缓存中添加token对应User
tokenManager.addToken(token, loginUser);
return token;
}
private void addTokenInCookie(String token, HttpServletRequest request, HttpServletResponse response) {
// Cookie添加token
Cookie cookie = new Cookie(TokenManager.TOKEN, token);
cookie.setPath("/");
if ("https".equals(request.getScheme())) {
cookie.setSecure(true);
}
cookie.setHttpOnly(true);
response.addCookie(cookie);
}
private String authBackUrl(String backUrl, String token) {
StringBuilder sbf = new StringBuilder(backUrl);
if (backUrl.indexOf("?") > 0) {
sbf.append("&");
}
else {
sbf.append("?");
}
sbf.append(SsoFilter.SSO_TOKEN_NAME).append("=").append(token);
return sbf.toString();
}
private String goLoginPath(String backUrl, HttpServletRequest request) {
request.setAttribute("backUrl", backUrl);
return LOGIN_PATH;
}
}
package com.diaoyun.zion.chinafrica.controller;
import com.diaoyun.zion.chinafrica.client.SessionUtils;
import com.diaoyun.zion.chinafrica.service.TbCfUserInfoService;
import com.diaoyun.zion.master.base.Result;
import com.diaoyun.zion.master.common.TokenManager;
import com.diaoyun.zion.master.util.CookieUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
/**
* @author Joe
*/
@Api(tags = "单点登出")
@RestController
@RequestMapping("/logout")
public class LogoutController {
@Autowired
private HttpServletRequest request;
@Autowired
private TbCfUserInfoService tbCfUserInfoService;
@ApiOperation("登出")
@GetMapping
@ResponseBody
public Result logout() {
Result result=tbCfUserInfoService.logout(request);
return result;
}
}
\ No newline at end of file
package com.diaoyun.zion.chinafrica.controller;
import com.diaoyun.zion.chinafrica.service.SpiderService;
import com.diaoyun.zion.master.base.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.Map;
import java.util.concurrent.ExecutionException;
/**
* 爬取网络相关数据Controller
*
* @author G
* @date 2019-08-22 15:51:16
*/
@Api
@Controller
@RequestMapping("/spider")
public class SpiderController {
@Autowired
private SpiderService spiderService;
@ApiOperation("获取用户所有地址")
@GetMapping("/item/detail")
@ResponseBody
public Result getItemDetail(@ApiParam @RequestBody Map<String,String> targetMap) throws InterruptedException, ExecutionException, URISyntaxException, IOException {
String targetUrl=targetMap.get("targetUrl");
Map<String,Object> itemMap=spiderService.getItemDetail(targetUrl);
Result result=new Result(itemMap,"商品规格信息");
return result;
}
}
package com.diaoyun.zion.chinafrica.controller;
import com.diaoyun.zion.chinafrica.service.TbCfAddressService;
import com.diaoyun.zion.chinafrica.vo.TbCfAddressVo;
import com.diaoyun.zion.master.base.Result;
import com.diaoyun.zion.master.validator.Validator;
import com.diaoyun.zion.master.validator.annotation.ValidateParam;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 地址相关api
*
* @author G
*/
@Api(tags = "地址相关")
@RestController
@RequestMapping("/address")
public class TbCfAddressController {
@Autowired
private TbCfAddressService tbCfAddressService;
@ApiOperation("获取用户所有地址")
@GetMapping(value="/{userId}")
@ResponseBody
public Result getUserInfoList(@ApiParam @PathVariable("userId")String userId) {
List<TbCfAddressVo> TbCfAddressVoList=tbCfAddressService.queryListByUserId(userId);
return new Result(TbCfAddressVoList,"获取成功");
}
@ApiOperation("增加用户地址信息")
@PostMapping(value="/{userId}")
@ResponseBody
public Result addUserInfo(@ApiParam @PathVariable("userId")String userId,@ApiParam @RequestBody TbCfAddressVo tbCfAddressVo) {
tbCfAddressVo.setUserId(userId);
tbCfAddressVo=tbCfAddressService.saveAddress(tbCfAddressVo);
return new Result(tbCfAddressVo,"新增成功");
}
@ApiOperation("修改用户地址信息")
@PutMapping(value="/{addressId}")
@ResponseBody
public Result updateUserInfo(@ApiParam @PathVariable("addressId")String addressId, @ApiParam @RequestBody TbCfAddressVo tbCfAddressVo) {
tbCfAddressVo=tbCfAddressService.updateAddress(tbCfAddressVo);
return new Result(tbCfAddressVo,"修改成功");
}
@ApiOperation("删除用户地址信息")
@DeleteMapping(value="/{addressId}")
@ResponseBody
public Result deleteUserInfo(@ApiParam @PathVariable("addressId")String addressId) {
int res=tbCfAddressService.delete(addressId);
return new Result(res,"删除成功");
}
@ApiOperation("设置为默认地址")
@PostMapping(value="/default")
@ResponseBody
public Result configDefaultAddress(@ApiParam @RequestParam("userId")@ValidateParam({Validator.NOT_BLANK})String userId,
@ApiParam @RequestParam("addressId")@ValidateParam({Validator.NOT_BLANK})String addressId) {
int res=tbCfAddressService.configDefaultAddress(userId,addressId);
return new Result(res,"设置成功");
}
}
package com.diaoyun.zion.chinafrica.controller;
import com.diaoyun.zion.chinafrica.service.TbCfCartRecordRService;
import com.diaoyun.zion.master.base.Result;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* 购物车记录表Controller
*
* @author lipengjun
* @date 2019-08-16 15:51:16
*/
@Controller
@RequestMapping("tbcfcartrecordr")
public class TbCfCartRecordRController {
@Autowired
private TbCfCartRecordRService tbCfCartRecordRService;
//public Result addItemToCart(@ApiParam @)
}
package com.diaoyun.zion.chinafrica.controller;
import com.diaoyun.zion.chinafrica.service.TbCfItemDetailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
import java.util.Map;
/**
* 商品详情Controller
*
* @author lipengjun
* @date 2019-08-16 15:51:16
*/
@Controller
@RequestMapping("tbcfitemdetail")
public class TbCfItemDetailController {
@Autowired
private TbCfItemDetailService tbCfItemDetailService;
}
package com.diaoyun.zion.chinafrica.controller;
import com.diaoyun.zion.chinafrica.constant.KeyConstant;
import com.diaoyun.zion.chinafrica.entity.TbCfUserInfoEntity;
import com.diaoyun.zion.chinafrica.service.TbCfUserInfoService;
import com.diaoyun.zion.chinafrica.vo.TbCfUserInfoVo;
import com.diaoyun.zion.master.base.BaseController;
import com.diaoyun.zion.master.base.Result;
import com.diaoyun.zion.master.base.ResultCode;
import com.diaoyun.zion.master.util.PasswordProvider;
import com.diaoyun.zion.master.validator.Validator;
import com.diaoyun.zion.master.validator.annotation.ValidateParam;
import freemarker.template.TemplateException;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.commons.mail.EmailException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
* 用户相关api
*
* @author G
*/
@Api(tags = "用户相关")
@RestController
@RequestMapping("/user")
public class TbCfUserInfoController extends BaseController {
private static Logger logger = LoggerFactory.getLogger(TbCfUserInfoController.class);
@Autowired
private HttpServletRequest request; //自动注入request
@Autowired
private TbCfUserInfoService tbCfUserInfoService;
/**
* 获取邮箱验证码
*/
@ApiOperation(value = "获取邮箱验证码")
@GetMapping(value = "/register/identifyCode/{nick}/{email}")
@ResponseBody
public Result getUserIdentifyCode(@ApiParam @PathVariable("email") @ValidateParam({Validator.NOT_BLANK}) String email,
@ApiParam @PathVariable("nick") @ValidateParam({Validator.NOT_BLANK}) String nick) throws EmailException, TemplateException, IOException {
Integer identifyCode = tbCfUserInfoService.sendRegisterIdentifyCode(email, nick);
request.getSession().setAttribute(KeyConstant.IDENTIFY_CODE, identifyCode);
return new Result(identifyCode, "验证码");
}
/**
* 获取存在session中的验证码
*/
/*@ApiOperation(value = "获取存在session中的验证码")
@GetMapping(value ="/register/identifyCode/old")
public String getDeliveryList() {
String identifyCode= (int) request.getSession().getAttribute(KeyConstant.IDENTIFY_CODE);
return identifyCode;
}
*/
@ApiOperation("修改用户信息")
@PutMapping(value="/{userId}")
@ResponseBody
public Result updateUserInfo(@ApiParam @PathVariable("userId")String userId,@RequestBody TbCfUserInfoVo tbCfUserInfoVo) {
TbCfUserInfoEntity tbCfUserInfoEntity = new TbCfUserInfoEntity();
BeanUtils.copyProperties(tbCfUserInfoEntity,tbCfUserInfoVo);
int res=tbCfUserInfoService.update(tbCfUserInfoEntity);
return new Result(res, "修改成功");
}
@ApiOperation("修改用户密码")
@PutMapping(value="/password/{userId}/{newPassword}/{oldPassword}")
@ResponseBody
public Result updatePassWord(@ApiParam @PathVariable @ValidateParam({Validator.NOT_BLANK}) String userId,
@ApiParam @PathVariable @ValidateParam({Validator.NOT_BLANK}) String newPassword
,@ApiParam @PathVariable @ValidateParam({Validator.NOT_BLANK}) String oldPassword) {
Result result =tbCfUserInfoService.updatePassWord(userId,PasswordProvider.encrypt(newPassword),PasswordProvider.encrypt(oldPassword));
int code=result.getCode();
if(code==ResultCode.SUCCESS) {
tbCfUserInfoService.logout(request);
}
return result;
}
}
package com.diaoyun.zion.chinafrica.dao;
import com.diaoyun.zion.chinafrica.entity.TbCfAddressEntity;
import com.diaoyun.zion.master.dao.BaseDao;
import java.util.List;
/**
* Dao
*
* @author lipengjun
* @date 2019-08-16 15:51:16
*/
public interface TbCfAddressDao extends BaseDao<TbCfAddressEntity> {
/**
* 根据用户获取用户地址
* @param userId
* @return
*/
List<TbCfAddressEntity> queryListByUserId(String userId);
/*重置用户全部地址的默认地址Flag*/
int resetDefaulFlag(String userId);
}
package com.diaoyun.zion.chinafrica.dao;
import com.diaoyun.zion.chinafrica.entity.TbCfCartRecordREntity;
import com.diaoyun.zion.master.dao.BaseDao;
/**
* 购物车记录表Dao
*
* @author lipengjun
* @date 2019-08-16 15:51:16
*/
public interface TbCfCartRecordRDao extends BaseDao<TbCfCartRecordREntity> {
}
package com.diaoyun.zion.chinafrica.dao;
import com.diaoyun.zion.chinafrica.entity.TbCfItemDetailEntity;
import com.diaoyun.zion.master.dao.BaseDao;
/**
* 商品详情Dao
*
* @author lipengjun
* @date 2019-08-16 15:51:16
*/
public interface TbCfItemDetailDao extends BaseDao<TbCfItemDetailEntity> {
}
package com.diaoyun.zion.chinafrica.dao;
import com.diaoyun.zion.chinafrica.entity.TbCfUserInfoEntity;
import com.diaoyun.zion.master.dao.BaseDao;
/**
* 用户表Dao
*
* @author G
* @date 2019-08-14 09:11:47
*/
public interface TbCfUserInfoDao extends BaseDao<TbCfUserInfoEntity> {
/**
* 根据nickname获取用户信息
* @param nickname
* @return
*/
TbCfUserInfoEntity getByNickname(String nickname);
/**
* 根据用户名、昵称查找
* @param account
* @return
*/
TbCfUserInfoEntity findByAccount(String account);
/**
* 更改用户密码
* @param userId
* @param newPassword
* @param oldPassword
* @return
*/
int updatePassWord(String userId, String newPassword, String oldPassword);
}
package com.diaoyun.zion.chinafrica.entity;
import java.io.Serializable;
import java.util.Date;
/**
* 实体
* 表名 tb_cf_address
*
* @author lipengjun
* @date 2019-08-16 15:51:16
*/
public class TbCfAddressEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 地址id
*/
private String addressId;
/**
* 用户id
*/
private String userId;
/**
* 收货人
*/
private String deliveryName;
/**
* 联系电话
*/
private String phone;
/**
* 是否为默认地址
*/
private Integer defaultFlag;
/**
* 地址详情
*/
private String addressDetail;
/**
* 所在国家code
*/
private String addressCountryCode;
/**
* 所在国家
*/
private String addressCountryName;
/**
* 所在州code
*/
private String addressStateCode;
/**
* 所在州
*/
private String addressStateName;
/**
* 所在区code
*/
private String addressAreaCode;
/**
* 所在区
*/
private String addressAreaName;
/**
* 标签code
*/
private String labelCode;
/**
* 创建时间
*/
private Date createTime;
/**
* 修改时间
*/
private Date updateTime;
/**
* 设置:地址id
*/
public void setAddressId(String addressId) {
this.addressId = addressId;
}
/**
* 获取:地址id
*/
public String getAddressId() {
return addressId;
}
/**
* 设置:用户id
*/
public void setUserId(String userId) {
this.userId = userId;
}
/**
* 获取:用户id
*/
public String getUserId() {
return userId;
}
/**
* 设置:收货人
*/
public void setDeliveryName(String deliveryName) {
this.deliveryName = deliveryName;
}
/**
* 获取:收货人
*/
public String getDeliveryName() {
return deliveryName;
}
/**
* 设置:联系电话
*/
public void setPhone(String phone) {
this.phone = phone;
}
/**
* 获取:联系电话
*/
public String getPhone() {
return phone;
}
/**
* 设置:是否为默认地址
*/
public void setDefaultFlag(Integer defaultFlag) {
this.defaultFlag = defaultFlag;
}
/**
* 获取:是否为默认地址
*/
public Integer getDefaultFlag() {
return defaultFlag;
}
/**
* 设置:地址详情
*/
public void setAddressDetail(String addressDetail) {
this.addressDetail = addressDetail;
}
/**
* 获取:地址详情
*/
public String getAddressDetail() {
return addressDetail;
}
/**
* 设置:所在国家code
*/
public void setAddressCountryCode(String addressCountryCode) {
this.addressCountryCode = addressCountryCode;
}
/**
* 获取:所在国家code
*/
public String getAddressCountryCode() {
return addressCountryCode;
}
/**
* 设置:所在国家
*/
public void setAddressCountryName(String addressCountryName) {
this.addressCountryName = addressCountryName;
}
/**
* 获取:所在国家
*/
public String getAddressCountryName() {
return addressCountryName;
}
/**
* 设置:所在州code
*/
public void setAddressStateCode(String addressStateCode) {
this.addressStateCode = addressStateCode;
}
/**
* 获取:所在州code
*/
public String getAddressStateCode() {
return addressStateCode;
}
/**
* 设置:所在州
*/
public void setAddressStateName(String addressStateName) {
this.addressStateName = addressStateName;
}
/**
* 获取:所在州
*/
public String getAddressStateName() {
return addressStateName;
}
/**
* 设置:所在区code
*/
public void setAddressAreaCode(String addressAreaCode) {
this.addressAreaCode = addressAreaCode;
}
/**
* 获取:所在区code
*/
public String getAddressAreaCode() {
return addressAreaCode;
}
/**
* 设置:所在区
*/
public void setAddressAreaName(String addressAreaName) {
this.addressAreaName = addressAreaName;
}
/**
* 获取:所在区
*/
public String getAddressAreaName() {
return addressAreaName;
}
/**
* 设置:标签code
*/
public void setLabelCode(String labelCode) {
this.labelCode = labelCode;
}
/**
* 获取:标签code
*/
public String getLabelCode() {
return labelCode;
}
/**
* 设置:创建时间
*/
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
/**
* 获取:创建时间
*/
public Date getCreateTime() {
return createTime;
}
/**
* 设置:修改时间
*/
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
/**
* 获取:修改时间
*/
public Date getUpdateTime() {
return updateTime;
}
}
package com.diaoyun.zion.chinafrica.entity;
import java.io.Serializable;
import java.util.Date;
/**
* 购物车记录表实体
* 表名 tb_cf_cart_record_r
*
* @author lipengjun
* @date 2019-08-16 15:51:16
*/
public class TbCfCartRecordREntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 购物车记录id
*/
private String cartRecordId;
/**
* 商品id
*/
private String itemId;
/**
* 用户id
*/
private String userId;
/**
* 是否已经被勾选,0未勾选,1勾选
*/
private Integer checkFlag;
/**
* 是否有效
*/
private Integer enableFlag;
/**
* 设置:购物车记录id
*/
public void setCartRecordId(String cartRecordId) {
this.cartRecordId = cartRecordId;
}
/**
* 获取:购物车记录id
*/
public String getCartRecordId() {
return cartRecordId;
}
/**
* 设置:商品id
*/
public void setItemId(String itemId) {
this.itemId = itemId;
}
/**
* 获取:商品id
*/
public String getItemId() {
return itemId;
}
/**
* 设置:用户id
*/
public void setUserId(String userId) {
this.userId = userId;
}
/**
* 获取:用户id
*/
public String getUserId() {
return userId;
}
/**
* 设置:是否已经被勾选,0未勾选,1勾选
*/
public void setCheckFlag(Integer checkFlag) {
this.checkFlag = checkFlag;
}
/**
* 获取:是否已经被勾选,0未勾选,1勾选
*/
public Integer getCheckFlag() {
return checkFlag;
}
/**
* 设置:是否有效
*/
public void setEnableFlag(Integer enableFlag) {
this.enableFlag = enableFlag;
}
/**
* 获取:是否有效
*/
public Integer getEnableFlag() {
return enableFlag;
}
}
package com.diaoyun.zion.chinafrica.entity;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 商品详情实体
* 表名 tb_cf_item_detail
*
* @author lipengjun
* @date 2019-08-16 15:51:16
*/
public class TbCfItemDetailEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 商品id
*/
private String itemId;
/**
* 来源站点id
*/
private String stationId;
/**
* 站点类型
*/
private Integer stationType;
/**
* 商品名称
*/
private String itemTitle;
/**
* 商品数量
*/
private Integer itemNum;
/**
* 商品主图
*/
private String itemImg;
/**
* 商品价格
*/
private BigDecimal itemPrice;
/**
* 商品分类
*/
private String itemCategory;
/**
* 商品skus
*/
private String itemSku;
/**
* 所属商铺名
*/
private String shopName;
/**
* 所属商铺链接
*/
private String shopUrl;
/**
* 设置:商品id
*/
public void setItemId(String itemId) {
this.itemId = itemId;
}
/**
* 获取:商品id
*/
public String getItemId() {
return itemId;
}
/**
* 设置:来源站点id
*/
public void setStationId(String stationId) {
this.stationId = stationId;
}
/**
* 获取:来源站点id
*/
public String getStationId() {
return stationId;
}
/**
* 设置:站点类型
*/
public void setStationType(Integer stationType) {
this.stationType = stationType;
}
/**
* 获取:站点类型
*/
public Integer getStationType() {
return stationType;
}
/**
* 设置:商品名称
*/
public void setItemTitle(String itemTitle) {
this.itemTitle = itemTitle;
}
/**
* 获取:商品名称
*/
public String getItemTitle() {
return itemTitle;
}
/**
* 设置:商品数量
*/
public void setItemNum(Integer itemNum) {
this.itemNum = itemNum;
}
/**
* 获取:商品数量
*/
public Integer getItemNum() {
return itemNum;
}
/**
* 设置:商品主图
*/
public void setItemImg(String itemImg) {
this.itemImg = itemImg;
}
/**
* 获取:商品主图
*/
public String getItemImg() {
return itemImg;
}
/**
* 设置:商品价格
*/
public void setItemPrice(BigDecimal itemPrice) {
this.itemPrice = itemPrice;
}
/**
* 获取:商品价格
*/
public BigDecimal getItemPrice() {
return itemPrice;
}
/**
* 设置:商品分类
*/
public void setItemCategory(String itemCategory) {
this.itemCategory = itemCategory;
}
/**
* 获取:商品分类
*/
public String getItemCategory() {
return itemCategory;
}
/**
* 设置:商品skus
*/
public void setItemSku(String itemSku) {
this.itemSku = itemSku;
}
/**
* 获取:商品skus
*/
public String getItemSku() {
return itemSku;
}
/**
* 设置:所属商铺名
*/
public void setShopName(String shopName) {
this.shopName = shopName;
}
/**
* 获取:所属商铺名
*/
public String getShopName() {
return shopName;
}
/**
* 设置:所属商铺链接
*/
public void setShopUrl(String shopUrl) {
this.shopUrl = shopUrl;
}
/**
* 获取:所属商铺链接
*/
public String getShopUrl() {
return shopUrl;
}
}
package com.diaoyun.zion.chinafrica.entity;
import java.io.Serializable;
import java.util.Date;
/**
* 用户表实体
* 表名 tb_cf_user_info
*
* @author lipengjun
* @date 2019-08-14 09:11:47
*/
public class TbCfUserInfoEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 用户id
*/
private String userId;
/**
* 用户编号
*/
private String userNo;
/**
* 用户类型(1邮箱、2facebook、3手机、4推特)
*/
private Integer userType;
/**
* 账号
*/
private String account;
/**
* 用户头像地址
*/
private String avatar;
/**
* 用户名
*/
private String nick;
/**
* 电话号码
*/
private String phone;
/**
* 是否绑定手机
*/
private Integer phoneFlag;
/**
* 密码
*/
private String password;
/**
* 上一次登录时间
*/
private Date lastLoginTime;
/**
* 上一次登录IP
*/
private String lastLoginIp;
/**
* 登录次数
*/
private Integer loginCount;
/**
* 邮箱
*/
private String email;
/**
* facebook账号
*/
private String facebook;
/**
* 创建时间
*/
private Date createTime;
/**
* 性别
*/
private Integer sex;
/**
* 默认地址id
*/
private String defaultAddressId;
/**
* 发出邀请的用户
*/
private String invitedUserId;
/**
* 总共邀请数量
*/
private Integer invitedCount;
/**
* 是否有效
*/
private Integer enableFlag;
/**
* 邮箱验证 0未验证,1已验证
*/
private Integer emailFlag;
/**
* 设置:用户id
*/
public void setUserId(String userId) {
this.userId = userId;
}
/**
* 获取:用户id
*/
public String getUserId() {
return userId;
}
/**
* 设置:用户编号
*/
public void setUserNo(String userNo) {
this.userNo = userNo;
}
/**
* 获取:用户编号
*/
public String getUserNo() {
return userNo;
}
/**
* 设置:用户类型(1邮箱、2facebook、3手机)
*/
public void setUserType(Integer userType) {
this.userType = userType;
}
/**
* 获取:用户类型(1邮箱、2facebook、3手机)
*/
public Integer getUserType() {
return userType;
}
/**
* 设置:账号
*/
public void setAccount(String account) {
this.account = account;
}
/**
* 获取:账号
*/
public String getAccount() {
return account;
}
/**
* 设置:用户头像地址
*/
public void setAvatar(String avatar) {
this.avatar = avatar;
}
/**
* 获取:用户头像地址
*/
public String getAvatar() {
return avatar;
}
/**
* 设置:用户名
*/
public void setNick(String nick) {
this.nick = nick;
}
/**
* 获取:用户名
*/
public String getNick() {
return nick;
}
/**
* 设置:电话号码
*/
public void setPhone(String phone) {
this.phone = phone;
}
/**
* 获取:电话号码
*/
public String getPhone() {
return phone;
}
/**
* 设置:是否绑定手机
*/
public void setPhoneFlag(Integer phoneFlag) {
this.phoneFlag = phoneFlag;
}
/**
* 获取:是否绑定手机
*/
public Integer getPhoneFlag() {
return phoneFlag;
}
/**
* 设置:密码
*/
public void setPassword(String password) {
this.password = password;
}
/**
* 获取:密码
*/
public String getPassword() {
return password;
}
/**
* 设置:上一次登录时间
*/
public void setLastLoginTime(Date lastLoginTime) {
this.lastLoginTime = lastLoginTime;
}
/**
* 获取:上一次登录时间
*/
public Date getLastLoginTime() {
return lastLoginTime;
}
/**
* 设置:上一次登录IP
*/
public void setLastLoginIp(String lastLoginIp) {
this.lastLoginIp = lastLoginIp;
}
/**
* 获取:上一次登录IP
*/
public String getLastLoginIp() {
return lastLoginIp;
}
/**
* 设置:登录次数
*/
public void setLoginCount(Integer loginCount) {
this.loginCount = loginCount;
}
/**
* 获取:登录次数
*/
public Integer getLoginCount() {
return loginCount;
}
/**
* 设置:邮箱
*/
public void setEmail(String email) {
this.email = email;
}
/**
* 获取:邮箱
*/
public String getEmail() {
return email;
}
/**
* 设置:facebook账号
*/
public void setFacebook(String facebook) {
this.facebook = facebook;
}
/**
* 获取:facebook账号
*/
public String getFacebook() {
return facebook;
}
/**
* 设置:创建时间
*/
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
/**
* 获取:创建时间
*/
public Date getCreateTime() {
return createTime;
}
/**
* 设置:性别
*/
public void setSex(Integer sex) {
this.sex = sex;
}
/**
* 获取:性别
*/
public Integer getSex() {
return sex;
}
/**
* 设置:默认地址id
*/
public void setDefaultAddressId(String defaultAddressId) {
this.defaultAddressId = defaultAddressId;
}
/**
* 获取:默认地址id
*/
public String getDefaultAddressId() {
return defaultAddressId;
}
/**
* 设置:发出邀请的用户
*/
public void setInvitedUserId(String invitedUserId) {
this.invitedUserId = invitedUserId;
}
/**
* 获取:发出邀请的用户
*/
public String getInvitedUserId() {
return invitedUserId;
}
/**
* 设置:总共邀请数量
*/
public void setInvitedCount(Integer invitedCount) {
this.invitedCount = invitedCount;
}
/**
* 获取:总共邀请数量
*/
public Integer getInvitedCount() {
return invitedCount;
}
/**
* 设置:是否有效
*/
public void setEnableFlag(Integer enableFlag) {
this.enableFlag = enableFlag;
}
/**
* 获取:是否有效
*/
public Integer getEnableFlag() {
return enableFlag;
}
public Integer getEmailFlag() {
return emailFlag;
}
public void setEmailFlag(Integer emailFlag) {
this.emailFlag = emailFlag;
}
}
package com.diaoyun.zion.chinafrica.enums;
import com.diaoyun.zion.master.enums.EnumItemable;
/**
* 平台类型
*
* @author G
*/
public enum PlatformEnum implements EnumItemable<PlatformEnum> {
TB("淘宝", "tb"),
TM("天猫", "tm"),
UN("未知", "un");
private String label;
private String value;
PlatformEnum(String label, String value) {
this.label = label;
this.value = value;
}
public String getLabel() {
return this.label;
}
public String getValue() {
return this.value;
}
}
package com.diaoyun.zion.chinafrica.factory;
import com.diaoyun.zion.chinafrica.bis.IItemSpider;
import com.diaoyun.zion.chinafrica.enums.PlatformEnum;
import com.diaoyun.zion.master.util.SpringContextUtil;
/**
* 商品爬虫
*/
public class ItemSpiderFactory {
public static IItemSpider getSpider(PlatformEnum platformEnum) {
IItemSpider iItemSpider;
switch (platformEnum.getValue()) {
case "tb":{
iItemSpider= (IItemSpider) SpringContextUtil.getBean("tbItemSpider");
break;
}
default:{
iItemSpider= (IItemSpider) SpringContextUtil.getBean("emptyItemSpider");
break;
}
}
return iItemSpider;
}
}
package com.diaoyun.zion.chinafrica.rpc;
import com.diaoyun.zion.chinafrica.client.SessionUser;
import com.diaoyun.zion.chinafrica.vo.TbCfUserInfoVo;
import java.util.List;
/**
* 身份认证授权服务接口
*
* @author Joe
*/
public interface AuthenticationRpcService {
/**
* 验证是否已经登录
*
* @param token
* 授权码
* @return
*/
boolean validate(String token);
/**
* 根据登录的Token和应用编码获取授权用户信息
*
* @param token
* 授权码
* @return
*/
SessionUser findAuthInfo(String token);
}
package com.diaoyun.zion.chinafrica.rpc.impl;
import com.diaoyun.zion.chinafrica.client.SessionUser;
import com.diaoyun.zion.chinafrica.rpc.AuthenticationRpcService;
import com.diaoyun.zion.chinafrica.vo.TbCfUserInfoVo;
import com.diaoyun.zion.master.common.TokenManager;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service("authenticationRpcService")
public class AuthenticationRpcServiceImpl implements AuthenticationRpcService {
@Resource(name="redisTokenManager")
private TokenManager tokenManager;
@Override
public boolean validate(String token) {
return tokenManager.validate(token) != null;
}
@Override
public SessionUser findAuthInfo(String token) {
TbCfUserInfoVo user = tokenManager.validate(token);
if (user != null) {
return new SessionUser(token,user.getAccount());
}
return null;
}
}
package com.diaoyun.zion.chinafrica.service;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.Map;
import java.util.concurrent.ExecutionException;
public interface SpiderService {
/**
* 爬取数据获取商品详情
* @param targetUrl
* @return
*/
Map<String, Object> getItemDetail(String targetUrl) throws InterruptedException, IOException, ExecutionException, URISyntaxException;
}
package com.diaoyun.zion.chinafrica.service;
import com.diaoyun.zion.chinafrica.entity.TbCfAddressEntity;
import com.diaoyun.zion.chinafrica.vo.TbCfAddressVo;
import java.util.List;
import java.util.Map;
/**
* Service接口
*
* @author lipengjun
* @date 2019-08-16 15:51:16
*/
public interface TbCfAddressService {
/**
* 根据主键查询实体
*
* @param addressId 主键
* @return 实体
*/
TbCfAddressEntity queryObject(String addressId);
/**
* 分页查询
*
* @param map 参数
* @return list
*/
List<TbCfAddressEntity> queryList(Map<String, Object> map);
/**
* 分页统计总数
*
* @param map 参数
* @return 总数
*/
int queryTotal(Map<String, Object> map);
/**
* 保存实体
*
* @param tbCfAddress 实体
* @return 保存条数
*/
int save(TbCfAddressEntity tbCfAddress);
/**
* 根据主键更新实体
*
* @param tbCfAddress 实体
* @return 更新条数
*/
int update(TbCfAddressEntity tbCfAddress);
/**
* 根据主键删除
*
* @param addressId
* @return 删除条数
*/
int delete(String addressId);
/**
* 根据主键批量删除
*
* @param addressIds
* @return 删除条数
*/
int deleteBatch(String[] addressIds);
/**
* 新增地址
* @param tbCfAddressVo
* @return
*/
TbCfAddressVo saveAddress(TbCfAddressVo tbCfAddressVo);
/**
* 修改地址
* @param tbCfAddressVo
* @return
*/
TbCfAddressVo updateAddress(TbCfAddressVo tbCfAddressVo);
/**
* 根据用户获取用户地址列表
* @param userId
* @return
*/
List<TbCfAddressVo> queryListByUserId(String userId);
/**
* 设置为默认地址
* @param userId
* @param addressId
* @return
*/
int configDefaultAddress(String userId, String addressId);
}
package com.diaoyun.zion.chinafrica.service;
import com.diaoyun.zion.chinafrica.entity.TbCfCartRecordREntity;
import java.util.List;
import java.util.Map;
/**
* 购物车记录表Service接口
*
* @author lipengjun
* @date 2019-08-16 15:51:16
*/
public interface TbCfCartRecordRService {
/**
* 根据主键查询实体
*
* @param cartRecordId 主键
* @return 实体
*/
TbCfCartRecordREntity queryObject(String cartRecordId);
/**
* 分页查询
*
* @param map 参数
* @return list
*/
List<TbCfCartRecordREntity> queryList(Map<String, Object> map);
/**
* 分页统计总数
*
* @param map 参数
* @return 总数
*/
int queryTotal(Map<String, Object> map);
/**
* 保存实体
*
* @param tbCfCartRecordR 实体
* @return 保存条数
*/
int save(TbCfCartRecordREntity tbCfCartRecordR);
/**
* 根据主键更新实体
*
* @param tbCfCartRecordR 实体
* @return 更新条数
*/
int update(TbCfCartRecordREntity tbCfCartRecordR);
/**
* 根据主键删除
*
* @param cartRecordId
* @return 删除条数
*/
int delete(String cartRecordId);
/**
* 根据主键批量删除
*
* @param cartRecordIds
* @return 删除条数
*/
int deleteBatch(String[] cartRecordIds);
}
package com.diaoyun.zion.chinafrica.service;
import com.diaoyun.zion.chinafrica.entity.TbCfItemDetailEntity;
import java.util.List;
import java.util.Map;
/**
* 商品详情Service接口
*
* @author lipengjun
* @date 2019-08-16 15:51:16
*/
public interface TbCfItemDetailService {
/**
* 根据主键查询实体
*
* @param itemId 主键
* @return 实体
*/
TbCfItemDetailEntity queryObject(String itemId);
/**
* 分页查询
*
* @param map 参数
* @return list
*/
List<TbCfItemDetailEntity> queryList(Map<String, Object> map);
/**
* 分页统计总数
*
* @param map 参数
* @return 总数
*/
int queryTotal(Map<String, Object> map);
/**
* 保存实体
*
* @param tbCfItemDetail 实体
* @return 保存条数
*/
int save(TbCfItemDetailEntity tbCfItemDetail);
/**
* 根据主键更新实体
*
* @param tbCfItemDetail 实体
* @return 更新条数
*/
int update(TbCfItemDetailEntity tbCfItemDetail);
/**
* 根据主键删除
*
* @param itemId
* @return 删除条数
*/
int delete(String itemId);
/**
* 根据主键批量删除
*
* @param itemIds
* @return 删除条数
*/
int deleteBatch(String[] itemIds);
}
package com.diaoyun.zion.chinafrica.service;
import com.diaoyun.zion.chinafrica.entity.TbCfUserInfoEntity;
import com.diaoyun.zion.chinafrica.vo.TbCfUserInfoVo;
import com.diaoyun.zion.master.base.Result;
import freemarker.template.TemplateException;
import org.apache.commons.mail.EmailException;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.List;
import java.util.Map;
/**
* 用户表Service接口
*
* @author lipengjun
* @date 2019-08-14 09:11:47
*/
public interface TbCfUserInfoService {
/**
* 根据主键查询实体
*
* @param userId 主键
* @return 实体
*/
TbCfUserInfoEntity queryObject(String userId);
/**
* 分页查询
*
* @param map 参数
* @return list
*/
List<TbCfUserInfoEntity> queryList(Map<String, Object> map);
/**
* 分页统计总数
*
* @param map 参数
* @return 总数
*/
int queryTotal(Map<String, Object> map);
/**
* 保存实体
*
* @param tbCfUserInfo 实体
* @return 保存条数
*/
int save(TbCfUserInfoEntity tbCfUserInfo);
/**
* 根据主键更新实体
*
* @param tbCfUserInfo 实体
* @return 更新条数
*/
int update(TbCfUserInfoEntity tbCfUserInfo);
/**
* 根据主键删除
*
* @param userId
* @return 删除条数
*/
int delete(String userId);
/**
* 根据主键批量删除
*
* @param userIds
* @return 删除条数
*/
int deleteBatch(String[] userIds);
/**
* 发送注册验证码
* @param email
* @return
*/
Integer sendRegisterIdentifyCode(String email,String nick) throws EmailException, TemplateException, IOException;
/**
* 注册和登录
* @param tbCfUserInfoVo
* @return
*/
TbCfUserInfoVo registerAndLogin(TbCfUserInfoVo tbCfUserInfoVo);
/**
* 用户登录
* @param ipAddr
* @param account
* @param password
* @return
*/
Result login(String ipAddr, String account, String password);
/**
* 根据用户名、昵称 userId 查找
* @param account
* @return
*/
TbCfUserInfoEntity findByAccount(String account);
/**
* 更改用户密码
* @param userId
* @param newPassword
* @param oldPassword
* @return
*/
Result updatePassWord(String userId, String newPassword, String oldPassword);
/**
* 退出登录
* @param request
* @return
*/
Result logout(HttpServletRequest request);
}
package com.diaoyun.zion.chinafrica.service.impl;
import com.diaoyun.zion.chinafrica.bis.IItemSpider;
import com.diaoyun.zion.chinafrica.enums.PlatformEnum;
import com.diaoyun.zion.chinafrica.factory.ItemSpiderFactory;
import com.diaoyun.zion.chinafrica.service.SpiderService;
import org.apache.http.NameValuePair;
import org.apache.http.client.utils.URLEncodedUtils;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.*;
import java.util.concurrent.ExecutionException;
@Service("spiderService")
public class SpiderServiceImpl implements SpiderService {
private static final String taobaoUrl="https://item.taobao.com/item.htm?";
@Override
public Map<String, Object> getItemDetail(String targetUrl) throws InterruptedException, IOException, ExecutionException, URISyntaxException {
//主要是判断淘宝的url是手机端还是PC端,如果是手机端,那么还需要提取相关参数,组成新的url;还有去除链接中一些会引起请求错误的参数
targetUrl=processUrl(targetUrl);
//判断链接属于哪个平台
PlatformEnum platformEnum=judgeUrlType(targetUrl);
IItemSpider iItemSpider=ItemSpiderFactory.getSpider(platformEnum);
Map<String,Object> itemMap=iItemSpider.captureItem(targetUrl);
return itemMap;
}
/**
* 主要是提取相关参数,组成新的url
*
* @param targetUrl
* @return
*/
private String processUrl(String targetUrl) throws URISyntaxException {
String newUrl=taobaoUrl;
//if(targetUrl.contains("h5.m.taobao.com")) {
Map<String,String> paramMap=getParamMap(targetUrl);
//目前淘宝需要四个参数 spm id scm pvid
//引起错误的 参数 ali_refid
StringBuffer paramBuffer=new StringBuffer();
for(Map.Entry<String,String> entry:paramMap.entrySet()) {
if("ali_refid".equals(entry.getKey())) {
} else {
paramBuffer.append(entry.getKey()+"="+entry.getValue()+"&");
}
}
return newUrl+paramBuffer.toString();
}
/**
* 获取连接中的参数
* @param targetUrl
* @return
*/
private Map<String, String> getParamMap(String targetUrl) throws URISyntaxException {
List<NameValuePair> params = URLEncodedUtils.parse(new URI(targetUrl),"UTF-8");
Map<String,String> paramMap=new HashMap<>();
for (NameValuePair param : params) {
paramMap.put(param.getName(),param.getValue());
}
return paramMap;
}
private PlatformEnum judgeUrlType(String targetUrl) {
PlatformEnum platformEnum = PlatformEnum.UN;
if(targetUrl.contains("taobao.com")) {
platformEnum=PlatformEnum.TB;
}
return platformEnum;
}
}
package com.diaoyun.zion.chinafrica.service.impl;
import com.diaoyun.zion.chinafrica.dao.TbCfAddressDao;
import com.diaoyun.zion.chinafrica.dao.TbCfUserInfoDao;
import com.diaoyun.zion.chinafrica.entity.TbCfAddressEntity;
import com.diaoyun.zion.chinafrica.entity.TbCfUserInfoEntity;
import com.diaoyun.zion.chinafrica.service.TbCfAddressService;
import com.diaoyun.zion.chinafrica.vo.TbCfAddressVo;
import com.diaoyun.zion.master.base.StateConstant;
import com.diaoyun.zion.master.util.IdUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* Service实现类
*
* @author lipengjun
* @date 2019-08-16 15:51:16
*/
@Service("tbCfAddressService")
public class TbCfAddressServiceImpl implements TbCfAddressService {
@Autowired
private TbCfAddressDao tbCfAddressDao;
@Autowired
private TbCfUserInfoDao tbCfUserInfoDao;
@Override
public TbCfAddressEntity queryObject(String addressId) {
return tbCfAddressDao.queryObject(addressId);
}
@Override
public List<TbCfAddressEntity> queryList(Map<String, Object> map) {
return tbCfAddressDao.queryList(map);
}
@Override
public int queryTotal(Map<String, Object> map) {
return tbCfAddressDao.queryTotal(map);
}
@Override
public int save(TbCfAddressEntity tbCfAddress) {
tbCfAddress.setAddressId(IdUtil.createIdbyUUID());
return tbCfAddressDao.save(tbCfAddress);
}
@Override
public int update(TbCfAddressEntity tbCfAddress) {
return tbCfAddressDao.update(tbCfAddress);
}
@Override
public int delete(String addressId) {
return tbCfAddressDao.delete(addressId);
}
@Override
public int deleteBatch(String[] addressIds) {
return tbCfAddressDao.deleteBatch(addressIds);
}
@Override
public TbCfAddressVo saveAddress(TbCfAddressVo tbCfAddressVo) {
/**
* 新增地址必要信息
*/
fillNewAddressInfo(tbCfAddressVo);
TbCfAddressEntity tbCfAddressEntity = new TbCfAddressEntity();
BeanUtils.copyProperties(tbCfAddressVo,tbCfAddressEntity);
this.save(tbCfAddressEntity);
return tbCfAddressVo;
}
@Override
public TbCfAddressVo updateAddress(TbCfAddressVo tbCfAddressVo) {
/**
* 修改地址必要信息
*/
fillUpdateAddressInfo(tbCfAddressVo);
TbCfAddressEntity tbCfAddressEntity = new TbCfAddressEntity();
BeanUtils.copyProperties(tbCfAddressVo,tbCfAddressEntity);
this.update(tbCfAddressEntity);
return tbCfAddressVo;
}
@Override
public List<TbCfAddressVo> queryListByUserId(String userId) {
List<TbCfAddressEntity> TbCfAddressList=tbCfAddressDao.queryListByUserId(userId);
List<TbCfAddressVo> TbCfAddressVoList=new ArrayList<>();
if(TbCfAddressList!=null) {
for(TbCfAddressEntity tbCfAddress:TbCfAddressList) {
TbCfAddressVo tbCfAddressVo = new TbCfAddressVo();
BeanUtils.copyProperties(tbCfAddress,tbCfAddressVo);
TbCfAddressVoList.add(tbCfAddressVo);
}
}
return TbCfAddressVoList;
}
@Override
public int configDefaultAddress(String userId, String addressId) {
//更新用户默认地址
TbCfUserInfoEntity user = new TbCfUserInfoEntity();
user.setUserId(userId);
user.setDefaultAddressId(addressId);
int userCount=tbCfUserInfoDao.update(user);
//重置用户地址
int resetCount=tbCfAddressDao.resetDefaulFlag(userId);
//更新地址默认标志
TbCfAddressEntity tbCfAddressEntity = new TbCfAddressEntity();
tbCfAddressEntity.setAddressId(addressId);
tbCfAddressEntity.setDefaultFlag(StateConstant.VALID);
int addressCount=tbCfAddressDao.update(tbCfAddressEntity);
return userCount*addressCount;
}
/**
* 新增地址必要信息
*/
private void fillNewAddressInfo(TbCfAddressVo tbCfAddressVo) {
tbCfAddressVo.setAddressId(IdUtil.createIdbyUUID());
tbCfAddressVo.setCreateTime(new Date());
tbCfAddressVo.setUpdateTime(new Date());
}
/**
* 修改地址必要信息
*/
private void fillUpdateAddressInfo(TbCfAddressVo tbCfAddressVo) {
tbCfAddressVo.setUpdateTime(new Date());
}
}
package com.diaoyun.zion.chinafrica.service.impl;
import com.diaoyun.zion.chinafrica.dao.TbCfCartRecordRDao;
import com.diaoyun.zion.chinafrica.entity.TbCfCartRecordREntity;
import com.diaoyun.zion.chinafrica.service.TbCfCartRecordRService;
import com.diaoyun.zion.master.util.IdUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
* 购物车记录表Service实现类
*
* @author lipengjun
* @date 2019-08-16 15:51:16
*/
@Service("tbCfCartRecordRService")
public class TbCfCartRecordRServiceImpl implements TbCfCartRecordRService {
@Autowired
private TbCfCartRecordRDao tbCfCartRecordRDao;
@Override
public TbCfCartRecordREntity queryObject(String cartRecordId) {
return tbCfCartRecordRDao.queryObject(cartRecordId);
}
@Override
public List<TbCfCartRecordREntity> queryList(Map<String, Object> map) {
return tbCfCartRecordRDao.queryList(map);
}
@Override
public int queryTotal(Map<String, Object> map) {
return tbCfCartRecordRDao.queryTotal(map);
}
@Override
public int save(TbCfCartRecordREntity tbCfCartRecordR) {
tbCfCartRecordR.setCartRecordId(IdUtil.createIdbyUUID());
return tbCfCartRecordRDao.save(tbCfCartRecordR);
}
@Override
public int update(TbCfCartRecordREntity tbCfCartRecordR) {
return tbCfCartRecordRDao.update(tbCfCartRecordR);
}
@Override
public int delete(String cartRecordId) {
return tbCfCartRecordRDao.delete(cartRecordId);
}
@Override
public int deleteBatch(String[] cartRecordIds) {
return tbCfCartRecordRDao.deleteBatch(cartRecordIds);
}
}
package com.diaoyun.zion.chinafrica.service.impl;
import com.diaoyun.zion.chinafrica.dao.TbCfItemDetailDao;
import com.diaoyun.zion.chinafrica.entity.TbCfItemDetailEntity;
import com.diaoyun.zion.chinafrica.service.TbCfItemDetailService;
import com.diaoyun.zion.master.util.IdUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
* 商品详情Service实现类
*
* @author lipengjun
* @date 2019-08-16 15:51:16
*/
@Service("tbCfItemDetailService")
public class TbCfItemDetailServiceImpl implements TbCfItemDetailService {
@Autowired
private TbCfItemDetailDao tbCfItemDetailDao;
@Override
public TbCfItemDetailEntity queryObject(String itemId) {
return tbCfItemDetailDao.queryObject(itemId);
}
@Override
public List<TbCfItemDetailEntity> queryList(Map<String, Object> map) {
return tbCfItemDetailDao.queryList(map);
}
@Override
public int queryTotal(Map<String, Object> map) {
return tbCfItemDetailDao.queryTotal(map);
}
@Override
public int save(TbCfItemDetailEntity tbCfItemDetail) {
tbCfItemDetail.setItemId(IdUtil.createIdbyUUID());
return tbCfItemDetailDao.save(tbCfItemDetail);
}
@Override
public int update(TbCfItemDetailEntity tbCfItemDetail) {
return tbCfItemDetailDao.update(tbCfItemDetail);
}
@Override
public int delete(String itemId) {
return tbCfItemDetailDao.delete(itemId);
}
@Override
public int deleteBatch(String[] itemIds) {
return tbCfItemDetailDao.deleteBatch(itemIds);
}
}
package com.diaoyun.zion.chinafrica.service.impl;
import com.diaoyun.zion.chinafrica.client.SessionUtils;
import com.diaoyun.zion.chinafrica.constant.EmailTemplateConstant;
import com.diaoyun.zion.chinafrica.dao.TbCfUserInfoDao;
import com.diaoyun.zion.chinafrica.entity.TbCfUserInfoEntity;
import com.diaoyun.zion.chinafrica.service.TbCfUserInfoService;
import com.diaoyun.zion.chinafrica.vo.TbCfUserInfoVo;
import com.diaoyun.zion.master.base.Result;
import com.diaoyun.zion.master.base.ResultCode;
import com.diaoyun.zion.master.base.StateConstant;
import com.diaoyun.zion.master.bo.EmailTemplateBo;
import com.diaoyun.zion.master.common.TokenManager;
import com.diaoyun.zion.master.config.DomainProperties;
import com.diaoyun.zion.master.enums.SexEnum;
import com.diaoyun.zion.master.enums.TrueFalseEnum;
import com.diaoyun.zion.master.exception.ValidateException;
import com.diaoyun.zion.master.util.*;
import com.diaoyun.zion.master.validator.Validator;
import freemarker.template.TemplateException;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.mail.EmailException;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* 用户表Service实现类
*
* @author lipengjun
* @date 2019-08-14 09:11:47
*/
@Service("tbCfUserInfoService")
public class TbCfUserInfoServiceImpl implements TbCfUserInfoService {
@Autowired
private TbCfUserInfoDao tbCfUserInfoDao;
@Resource(name="redisTokenManager")
private TokenManager tokenManager;
@Autowired
private EmailHelper emailHelper;
@Autowired
private DomainProperties domainProperties;
@Override
public TbCfUserInfoEntity queryObject(String userId) {
return tbCfUserInfoDao.queryObject(userId);
}
@Override
public List<TbCfUserInfoEntity> queryList(Map<String, Object> map) {
return tbCfUserInfoDao.queryList(map);
}
@Override
public int queryTotal(Map<String, Object> map) {
return tbCfUserInfoDao.queryTotal(map);
}
@Override
public int save(TbCfUserInfoEntity tbCfUserInfo) {
tbCfUserInfo.setUserId(IdUtil.createIdbyUUID());
return tbCfUserInfoDao.save(tbCfUserInfo);
}
@Override
public int update(TbCfUserInfoEntity tbCfUserInfo) {
return tbCfUserInfoDao.update(tbCfUserInfo);
}
@Override
public int delete(String userId) {
return tbCfUserInfoDao.delete(userId);
}
@Override
public int deleteBatch(String[] userIds) {
return tbCfUserInfoDao.deleteBatch(userIds);
}
@Override
public Integer sendRegisterIdentifyCode(String email,String nick) throws EmailException, TemplateException, IOException {
EmailTemplateBo emailTemplateBo = new EmailTemplateBo();
Integer randomCode = RandomCodeHelper.producedRandomCode(6);
emailTemplateBo.setNick(nick);
emailTemplateBo.setIdentifyCode(randomCode);
Integer identifyCode= emailHelper.sendIdentifyEmail(email, EmailTemplateConstant.REGISTER,emailTemplateBo);
return identifyCode;
}
@Override
public TbCfUserInfoVo registerAndLogin(TbCfUserInfoVo tbCfUserInfoVo) {
Validator.NOT_BLANK.validate("邮箱",tbCfUserInfoVo.getEmail());
TbCfUserInfoEntity existUser=findByAccount(tbCfUserInfoVo.getEmail());
if(existUser==null) {
TbCfUserInfoEntity tbCfUserInfoEntity =new TbCfUserInfoEntity();
/**
* 填充必要信息
*/
fillUserNecessayInfo(tbCfUserInfoVo);
//加密密码
String password= PasswordProvider.encrypt(tbCfUserInfoVo.getPassword());
tbCfUserInfoVo.setPassword(password);
BeanUtils.copyProperties(tbCfUserInfoVo,tbCfUserInfoEntity);
tbCfUserInfoDao.save(tbCfUserInfoEntity);
} else {
throw new ValidateException("邮箱已被注册!");
}
return tbCfUserInfoVo;
}
@Override
public Result login(String ip, String account, String password) {
Result result = new Result();
TbCfUserInfoEntity user = findByAccount(account);
if (user == null) {
result.setCode(ResultCode.ERROR).setMessage("登录名不存在");
}
else if (!user.getPassword().equals(password)) {
result.setCode(ResultCode.ERROR).setMessage("密码不正确");
}
else if (TrueFalseEnum.FALSE.getValue().equals(user.getEnableFlag())) {
result.setCode(ResultCode.ERROR).setMessage("已被用户禁用");
}
else {
user.setLastLoginIp(ip);
user.setLoginCount(user.getLoginCount() + 1);
user.setLastLoginTime(new Date());
tbCfUserInfoDao.update(user);
result.setData(user);
}
return result;
}
@Override
public TbCfUserInfoEntity findByAccount(String account) {
TbCfUserInfoEntity tbCfUserInfoEntity=tbCfUserInfoDao.findByAccount(account);
return tbCfUserInfoEntity;
}
@Override
public Result updatePassWord(String userId, String newPassword, String oldPassword) {
Result result= new Result();
int res=tbCfUserInfoDao.updatePassWord(userId,newPassword,oldPassword);
if(res>0) {
result.setMessage("修改成功");
} else {
result.setCode(ResultCode.ERROR).setMessage("旧密码错误");
}
return result;
}
@Override
public Result logout(HttpServletRequest request) {
String token = CookieUtils.getCookie(request, TokenManager.TOKEN);
if (StringUtils.isNotBlank(token)) {
tokenManager.remove(token);
}
SessionUtils.invalidate(request);
return new Result("已退出登录");
}
private void fillUserNecessayInfo(TbCfUserInfoVo tbCfUserInfoVo) {
tbCfUserInfoVo.setUserId(IdUtil.createIdbyUUID());
tbCfUserInfoVo.setUserNo(IdUtil.createIdByDate());
tbCfUserInfoVo.setAvatar(domainProperties.getProperty("user.avatar"));
tbCfUserInfoVo.setPhoneFlag(StateConstant.INVALID);
tbCfUserInfoVo.setLoginCount(0);
tbCfUserInfoVo.setCreateTime(new Date());
tbCfUserInfoVo.setSex(SexEnum.UNKNOW.getCode());
tbCfUserInfoVo.setInvitedCount(0);
tbCfUserInfoVo.setEnableFlag(StateConstant.VALID);
}
}
package com.diaoyun.zion.chinafrica.vo;
import java.io.Serializable;
import java.util.Date;
/**
* 实体
* 表名 tb_cf_address
*
* @author lipengjun
* @date 2019-08-16 15:51:16
*/
public class TbCfAddressVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 地址id
*/
private String addressId;
/**
* 用户id
*/
private String userId;
/**
* 收货人
*/
private String deliveryName;
/**
* 联系电话
*/
private String phone;
/**
* 是否为默认地址
*/
private Integer defaultFlag;
/**
* 地址详情
*/
private String addressDetail;
/**
* 所在国家code
*/
private String addressCountryCode;
/**
* 所在国家
*/
private String addressCountryName;
/**
* 所在州code
*/
private String addressStateCode;
/**
* 所在州
*/
private String addressStateName;
/**
* 所在区code
*/
private String addressAreaCode;
/**
* 所在区
*/
private String addressAreaName;
/**
* 标签code
*/
private String labelCode;
/**
* 创建时间
*/
private Date createTime;
/**
* 修改时间
*/
private Date updateTime;
/**
* 设置:地址id
*/
public void setAddressId(String addressId) {
this.addressId = addressId;
}
/**
* 获取:地址id
*/
public String getAddressId() {
return addressId;
}
/**
* 设置:用户id
*/
public void setUserId(String userId) {
this.userId = userId;
}
/**
* 获取:用户id
*/
public String getUserId() {
return userId;
}
/**
* 设置:收货人
*/
public void setDeliveryName(String deliveryName) {
this.deliveryName = deliveryName;
}
/**
* 获取:收货人
*/
public String getDeliveryName() {
return deliveryName;
}
/**
* 设置:联系电话
*/
public void setPhone(String phone) {
this.phone = phone;
}
/**
* 获取:联系电话
*/
public String getPhone() {
return phone;
}
/**
* 设置:是否为默认地址
*/
public void setDefaultFlag(Integer defaultFlag) {
this.defaultFlag = defaultFlag;
}
/**
* 获取:是否为默认地址
*/
public Integer getDefaultFlag() {
return defaultFlag;
}
/**
* 设置:地址详情
*/
public void setAddressDetail(String addressDetail) {
this.addressDetail = addressDetail;
}
/**
* 获取:地址详情
*/
public String getAddressDetail() {
return addressDetail;
}
/**
* 设置:所在国家code
*/
public void setAddressCountryCode(String addressCountryCode) {
this.addressCountryCode = addressCountryCode;
}
/**
* 获取:所在国家code
*/
public String getAddressCountryCode() {
return addressCountryCode;
}
/**
* 设置:所在国家
*/
public void setAddressCountryName(String addressCountryName) {
this.addressCountryName = addressCountryName;
}
/**
* 获取:所在国家
*/
public String getAddressCountryName() {
return addressCountryName;
}
/**
* 设置:所在州code
*/
public void setAddressStateCode(String addressStateCode) {
this.addressStateCode = addressStateCode;
}
/**
* 获取:所在州code
*/
public String getAddressStateCode() {
return addressStateCode;
}
/**
* 设置:所在州
*/
public void setAddressStateName(String addressStateName) {
this.addressStateName = addressStateName;
}
/**
* 获取:所在州
*/
public String getAddressStateName() {
return addressStateName;
}
/**
* 设置:所在区code
*/
public void setAddressAreaCode(String addressAreaCode) {
this.addressAreaCode = addressAreaCode;
}
/**
* 获取:所在区code
*/
public String getAddressAreaCode() {
return addressAreaCode;
}
/**
* 设置:所在区
*/
public void setAddressAreaName(String addressAreaName) {
this.addressAreaName = addressAreaName;
}
/**
* 获取:所在区
*/
public String getAddressAreaName() {
return addressAreaName;
}
/**
* 设置:标签code
*/
public void setLabelCode(String labelCode) {
this.labelCode = labelCode;
}
/**
* 获取:标签code
*/
public String getLabelCode() {
return labelCode;
}
/**
* 设置:创建时间
*/
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
/**
* 获取:创建时间
*/
public Date getCreateTime() {
return createTime;
}
/**
* 设置:修改时间
*/
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
/**
* 获取:修改时间
*/
public Date getUpdateTime() {
return updateTime;
}
}
package com.diaoyun.zion.chinafrica.vo;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 商品详情实体
* 表名 tb_cf_item_detail
*
* @author lipengjun
* @date 2019-08-16 15:51:16
*/
public class TbCfItemDetailVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 商品id
*/
private String itemId;
/**
* 来源站点id
*/
private String stationId;
/**
* 站点类型
*/
private Integer stationType;
/**
* 商品名称
*/
private String itemTitle;
/**
* 商品数量
*/
private Integer itemNum;
/**
* 商品主图
*/
private String itemImg;
/**
* 商品价格
*/
private BigDecimal itemPrice;
/**
* 商品分类
*/
private String itemCategory;
/**
* 商品skus
*/
private String itemSku;
/**
* 所属商铺名
*/
private String shopName;
/**
* 所属商铺链接
*/
private String shopUrl;
/**
* 设置:商品id
*/
public void setItemId(String itemId) {
this.itemId = itemId;
}
/**
* 获取:商品id
*/
public String getItemId() {
return itemId;
}
/**
* 设置:来源站点id
*/
public void setStationId(String stationId) {
this.stationId = stationId;
}
/**
* 获取:来源站点id
*/
public String getStationId() {
return stationId;
}
/**
* 设置:站点类型
*/
public void setStationType(Integer stationType) {
this.stationType = stationType;
}
/**
* 获取:站点类型
*/
public Integer getStationType() {
return stationType;
}
/**
* 设置:商品名称
*/
public void setItemTitle(String itemTitle) {
this.itemTitle = itemTitle;
}
/**
* 获取:商品名称
*/
public String getItemTitle() {
return itemTitle;
}
/**
* 设置:商品数量
*/
public void setItemNum(Integer itemNum) {
this.itemNum = itemNum;
}
/**
* 获取:商品数量
*/
public Integer getItemNum() {
return itemNum;
}
/**
* 设置:商品主图
*/
public void setItemImg(String itemImg) {
this.itemImg = itemImg;
}
/**
* 获取:商品主图
*/
public String getItemImg() {
return itemImg;
}
/**
* 设置:商品价格
*/
public void setItemPrice(BigDecimal itemPrice) {
this.itemPrice = itemPrice;
}
/**
* 获取:商品价格
*/
public BigDecimal getItemPrice() {
return itemPrice;
}
/**
* 设置:商品分类
*/
public void setItemCategory(String itemCategory) {
this.itemCategory = itemCategory;
}
/**
* 获取:商品分类
*/
public String getItemCategory() {
return itemCategory;
}
/**
* 设置:商品skus
*/
public void setItemSku(String itemSku) {
this.itemSku = itemSku;
}
/**
* 获取:商品skus
*/
public String getItemSku() {
return itemSku;
}
/**
* 设置:所属商铺名
*/
public void setShopName(String shopName) {
this.shopName = shopName;
}
/**
* 获取:所属商铺名
*/
public String getShopName() {
return shopName;
}
/**
* 设置:所属商铺链接
*/
public void setShopUrl(String shopUrl) {
this.shopUrl = shopUrl;
}
/**
* 获取:所属商铺链接
*/
public String getShopUrl() {
return shopUrl;
}
}
package com.diaoyun.zion.chinafrica.vo;
import java.io.Serializable;
import java.util.Date;
/**
* 用户表实体
* 表名 tb_cf_user_info
*
* @author lipengjun
* @date 2019-08-14 09:11:47
*/
public class TbCfUserInfoVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 用户id
*/
private String userId;
/**
* 用户编号
*/
private String userNo;
/**
* 用户类型(1邮箱、2facebook、3手机)
*/
private Integer userType;
/**
* 账号
*/
private String account;
/**
* 用户头像地址
*/
private String avatar;
/**
* 用户名
*/
private String nick;
/**
* 电话号码
*/
private String phone;
/**
* 是否绑定手机
*/
private Integer phoneFlag;
/**
* 密码
*/
private String password;
/**
* 上一次登录时间
*/
private Date lastLoginTime;
/**
* 上一次登录IP
*/
private String lastLoginIp;
/**
* 登录次数
*/
private Integer loginCount;
/**
* 邮箱
*/
private String email;
/**
* 邮箱验证 0未验证,1已验证
*/
private Integer emailFlag;
/**
* facebook账号
*/
private String facebook;
/**
* 创建时间
*/
private Date createTime;
/**
* 性别
*/
private Integer sex;
/**
* 默认地址id
*/
private String defaultAddressId;
/**
* 发出邀请的用户
*/
private String invitedUserId;
/**
* 总共邀请数量
*/
private Integer invitedCount;
/**
* 是否有效
*/
private Integer enableFlag;
/**
* 验证码
*/
private Integer captcha;
/**
* 设置:用户id
*/
public void setUserId(String userId) {
this.userId = userId;
}
/**
* 获取:用户id
*/
public String getUserId() {
return userId;
}
/**
* 设置:用户编号
*/
public void setUserNo(String userNo) {
this.userNo = userNo;
}
/**
* 获取:用户编号
*/
public String getUserNo() {
return userNo;
}
/**
* 设置:用户类型(1邮箱、2facebook、3手机)
*/
public void setUserType(Integer userType) {
this.userType = userType;
}
/**
* 获取:用户类型(1邮箱、2facebook、3手机)
*/
public Integer getUserType() {
return userType;
}
/**
* 设置:账号
*/
public void setAccount(String account) {
this.account = account;
}
/**
* 获取:账号
*/
public String getAccount() {
return account;
}
/**
* 设置:用户头像地址
*/
public void setAvatar(String avatar) {
this.avatar = avatar;
}
/**
* 获取:用户头像地址
*/
public String getAvatar() {
return avatar;
}
/**
* 设置:用户名
*/
public void setNick(String nick) {
this.nick = nick;
}
/**
* 获取:用户名
*/
public String getNick() {
return nick;
}
/**
* 设置:电话号码
*/
public void setPhone(String phone) {
this.phone = phone;
}
/**
* 获取:电话号码
*/
public String getPhone() {
return phone;
}
/**
* 设置:是否绑定手机
*/
public void setPhoneFlag(Integer phoneFlag) {
this.phoneFlag = phoneFlag;
}
/**
* 获取:是否绑定手机
*/
public Integer getPhoneFlag() {
return phoneFlag;
}
/**
* 设置:密码
*/
public void setPassword(String password) {
this.password = password;
}
/**
* 获取:密码
*/
public String getPassword() {
return password;
}
/**
* 设置:上一次登录时间
*/
public void setLastLoginTime(Date lastLoginTime) {
this.lastLoginTime = lastLoginTime;
}
/**
* 获取:上一次登录时间
*/
public Date getLastLoginTime() {
return lastLoginTime;
}
/**
* 设置:上一次登录IP
*/
public void setLastLoginIp(String lastLoginIp) {
this.lastLoginIp = lastLoginIp;
}
/**
* 获取:上一次登录IP
*/
public String getLastLoginIp() {
return lastLoginIp;
}
/**
* 设置:登录次数
*/
public void setLoginCount(Integer loginCount) {
this.loginCount = loginCount;
}
/**
* 获取:登录次数
*/
public Integer getLoginCount() {
return loginCount;
}
/**
* 设置:邮箱
*/
public void setEmail(String email) {
this.email = email;
}
/**
* 获取:邮箱
*/
public String getEmail() {
return email;
}
/**
* 设置:facebook账号
*/
public void setFacebook(String facebook) {
this.facebook = facebook;
}
/**
* 获取:facebook账号
*/
public String getFacebook() {
return facebook;
}
/**
* 设置:创建时间
*/
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
/**
* 获取:创建时间
*/
public Date getCreateTime() {
return createTime;
}
/**
* 设置:性别
*/
public void setSex(Integer sex) {
this.sex = sex;
}
/**
* 获取:性别
*/
public Integer getSex() {
return sex;
}
/**
* 设置:默认地址id
*/
public void setDefaultAddressId(String defaultAddressId) {
this.defaultAddressId = defaultAddressId;
}
/**
* 获取:默认地址id
*/
public String getDefaultAddressId() {
return defaultAddressId;
}
/**
* 设置:发出邀请的用户
*/
public void setInvitedUserId(String invitedUserId) {
this.invitedUserId = invitedUserId;
}
/**
* 获取:发出邀请的用户
*/
public String getInvitedUserId() {
return invitedUserId;
}
/**
* 设置:总共邀请数量
*/
public void setInvitedCount(Integer invitedCount) {
this.invitedCount = invitedCount;
}
/**
* 获取:总共邀请数量
*/
public Integer getInvitedCount() {
return invitedCount;
}
/**
* 设置:是否有效
*/
public void setEnableFlag(Integer enableFlag) {
this.enableFlag = enableFlag;
}
/**
* 获取:是否有效
*/
public Integer getEnableFlag() {
return enableFlag;
}
public Integer getCaptcha() {
return captcha;
}
public void setCaptcha(Integer captcha) {
this.captcha = captcha;
}
public Integer getEmailFlag() {
return emailFlag;
}
public void setEmailFlag(Integer emailFlag) {
this.emailFlag = emailFlag;
}
}
package com.diaoyun.zion.master.base;
import org.apache.commons.lang3.StringUtils;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Controller基类
*
* @author Joe
*/
public class BaseController {
private Integer[] getAjaxIds(final String str, final String separator) {
Integer[] ids = null;
if (str != null) {
String[] strs = str.split(separator);
ids = new Integer[strs.length];
for (int i = 0, length = strs.length; i < length; i++) {
ids[i] = Integer.valueOf(strs[i]);
}
}
return ids;
}
protected List<Integer> getAjaxIds(final String ids) {
return StringUtils.isBlank(ids) ? new ArrayList<Integer>(0) : Arrays.asList(getAjaxIds(ids, ","));
}
/**
* 获取IP地址
* @param request
* @return
*/
protected String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("X-Real-IP");
if (!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) {
return ip;
}
ip = request.getHeader("X-Forwarded-For");
if (!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) {
// 多次反向代理后会有多个IP值,第一个为真实IP。
int index = ip.indexOf(',');
if (index != -1) {
return ip.substring(0, index);
}
else {
return ip;
}
}
else {
return request.getRemoteAddr();
}
}
}
\ No newline at end of file
package com.diaoyun.zion.master.base;
import java.io.Serializable;
/**
* 返回结果
*
* @author Joe
*/
public class Result<T> implements Serializable {
/**
* 结果体
*/
protected T data;
/**
* 状态码
*/
protected Integer code;
/**
* 信息
*/
protected String message;
/**
* code 默认成功
*/
public Result() {
this.code = ResultCode.SUCCESS;
}
public Result(Integer code) {
this.code = code;
}
/**
* code 默认成功
* @param message
*/
public Result(String message) {
this.code = ResultCode.SUCCESS;
this.message = message;
}
/**
* code 默认成功
* @param data
*/
public Result(T data) {
this.code = ResultCode.SUCCESS;
this.data = data;
}
public Result(Integer code, String message) {
this.code = code;
this.message = message;
}
/**
* code 默认成功
* @param data
* @param message
*/
public Result(T data, String message) {
this.code = ResultCode.SUCCESS;
this.data = data;
this.message = message;
}
/**
*
* @param data
* @param code ResultCode
* @param message
*/
public Result(T data, Integer code, String message) {
this.data = data;
this.code = code;
this.message = message;
}
public T getData() {
return data;
}
public Result setData(T data) {
this.data = data;
return this;
}
public Integer getCode() {
return code;
}
public Result setCode(Integer code) {
this.code = code;
return this;
}
public String getMessage() {
return message;
}
public Result setMessage(String message) {
this.message = message;
return this;
}
}
package com.diaoyun.zion.master.base;
/**
* 基础返回码,具体业务返回码可继承ResultCode
*
* @author Joe
*/
public class ResultCode {
public final static int SUCCESS = 1;// 成功
// 通用错误以9开头
public final static int ERROR = 9999;// 未知错误
public final static int APPLICATION_ERROR = 9000;// 应用级错误
public final static int VALIDATE_ERROR = 9001;// 参数验证错误
public final static int SERVICE_ERROR = 9002;// 业务逻辑验证错误
public final static int CACHE_ERROR = 9003;// 缓存访问错误
public final static int DAO_ERROR = 9004;// 数据访问错误
}
package com.diaoyun.zion.master.base;
import com.diaoyun.zion.master.enums.ResponseCodeEnum;
//import com.fasterxml.jackson.annotation.JsonIgnore;
import java.io.Serializable;
//保证序列化json的时候,如果是null的对象,key也会消失
/*
这里加这个的原因是:
当登陆失败的话返回的是{
status : 1
msg : 密码错误
而data是一个有key的空节点,即value = null
}
这样的话data将不会出现在json之中了。
补充:
将该标记放在属性上,如果该属性为NULL则不参与序列化
如果放在类上边,那对这个类的全部属性起作用
Include.Include.ALWAYS 默认
Include.NON_DEFAULT 属性为默认值不序列化
Include.NON_EMPTY 属性为 空(“”) 或者为 NULL 都不序列化
Include.NON_NULL 属性为NULL 不序列化 。
*/
//@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class ServerResponse<T> implements Serializable {
private int status; //状态
private String msg; //信息
private T data; //数据
//定义4个构造方法
//1
private ServerResponse(int status) {
this.status = status;
}
//2
private ServerResponse(int status,T data){
this.status = status;
this.data = data;
}
//3
private ServerResponse(int status,String msg,T data){
this.status = status;
this.msg = msg;
this.data = data;
}
//4
private ServerResponse(int status,String msg){
this.status = status;
this.msg = msg;
}
//@JsonIgnore
//使之不在json序列化结果当中
//即json里面不会出现这个
public boolean isSuccess(){
//如果status == 0 则返回true
//SUCCESS的枚举值为0
return this.status == ResponseCodeEnum.SUCCESS.getCode();
}
//返回状态
public int getStatus(){
return status;
}
public T getData(){
return data;
}
public String getMsg(){
return msg;
}
//调用status构造器
public static <T> ServerResponse<T> createBySuccess(){
return new ServerResponse<T>(ResponseCodeEnum.SUCCESS.getCode());
}
//调用4号构造器
public static <T> ServerResponse<T> createBySuccessMessage(String msg){
return new ServerResponse<T>(ResponseCodeEnum.SUCCESS.getCode(),msg);
}
public static <T> ServerResponse<T> createBySuccess(T data){
return new ServerResponse<T>(ResponseCodeEnum.SUCCESS.getCode(),data);
}
public static <T> ServerResponse<T> createBySuccess(String msg,T data){
return new ServerResponse<T>(ResponseCodeEnum.SUCCESS.getCode(),msg,data);
}
public static <T> ServerResponse<T> createByError(){
return new ServerResponse<T>(ResponseCodeEnum.ERROR.getCode(),ResponseCodeEnum.ERROR.getDesc());
}
public static <T> ServerResponse<T> createByErrorMessage(String errorMessage){
return new ServerResponse<T>(ResponseCodeEnum.ERROR.getCode(),errorMessage);
}
public static <T> ServerResponse<T> createByErrorCodeMessage(int errorCode,String errorMessage){
return new ServerResponse<T>(errorCode,errorMessage);
}
}
package com.diaoyun.zion.master.base;
/**
* 状态常数
*/
public class StateConstant {
//有效
public static Integer VALID=1;
//无效
public static Integer INVALID=0;
}
package com.diaoyun.zion.master.bo;
/**
* templates/email-template.ftl 对应的参数
*/
public class EmailTemplateBo {
//用户名
private String nick;
//验证码
private Integer identifyCode;
public String getNick() {
return nick;
}
public void setNick(String nick) {
this.nick = nick;
}
public Integer getIdentifyCode() {
return identifyCode;
}
public void setIdentifyCode(Integer identifyCode) {
this.identifyCode = identifyCode;
}
}
package com.diaoyun.zion.master.bo;
/*腾讯翻译接口参数
* 基于翻译君 https://api.ai.qq.com/fcgi-bin/nlp/nlp_texttranslate
* */
public class TecentTranslateParam {
private Integer app_id;
private Long time_stamp;
private String nonce_str;
private String sign;
private String text;
private String source;
private String target;
/**
* 默认中文转英文
* @param text 待翻译文本
*/
public TecentTranslateParam(String text) {
this.text = text;
}
/**
*
* @param text 待翻译文本
* @param source 源语言缩写 zh
* @param target 目标语言缩写 en
*/
public TecentTranslateParam(String text, String source, String target) {
this.text = text;
this.source = source;
this.target = target;
}
public TecentTranslateParam(Integer app_id, Long time_stamp, String nonce_str, String sign, String text, String source, String target) {
this.app_id = app_id;
this.time_stamp = time_stamp;
this.nonce_str = nonce_str;
this.sign = sign;
this.text = text;
this.source = source;
this.target = target;
}
public Integer getApp_id() {
return app_id;
}
public void setApp_id(Integer app_id) {
this.app_id = app_id;
}
public Long getTime_stamp() {
return time_stamp;
}
public void setTime_stamp(Long time_stamp) {
this.time_stamp = time_stamp;
}
public String getNonce_str() {
return nonce_str;
}
public void setNonce_str(String nonce_str) {
this.nonce_str = nonce_str;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public String getSource() {
return source;
}
public void setSource(String source) {
this.source = source;
}
public String getTarget() {
return target;
}
public void setTarget(String target) {
this.target = target;
}
}
package com.diaoyun.zion.master.captcha;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
/**
* 验证码生成器
*
* @author Joe
*/
public abstract class Captcha {
private Random random = new Random();
private String randString = "023456789ABCDEFGHJKLMNPQRSTUVWXYZ";// 随机产生的字符串
private int width = 80;// 图片宽
private int height = 34;// 图片高
private int lineSize = 40;// 干扰线数量
private int stringNum = 4;// 随机产生字符数量
/*
* 获得字体
*/
private Font getFont() {
return new Font("Fixedsys", Font.CENTER_BASELINE, 18);
}
/*
* 获得颜色
*/
private Color getRandColor(int fc, int bc) {
if (fc > 255)
fc = 255;
if (bc > 255)
bc = 255;
int r = fc + random.nextInt(bc - fc - 16);
int g = fc + random.nextInt(bc - fc - 14);
int b = fc + random.nextInt(bc - fc - 18);
return new Color(r, g, b);
}
/**
* 生成随机图片
*
* @throws IOException
*/
public BufferedImage generate() throws IOException {
// BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
g.fillRect(0, 0, width, height);
g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18));
g.setColor(getRandColor(110, 133));
// 绘制干扰线
for (int i = 0; i <= lineSize; i++) {
drowLine(g);
}
// 绘制随机字符
String randomString = "";
for (int i = 1; i <= stringNum; i++) {
randomString = drowString(g, randomString, i);
}
setInCache(randomString);
g.dispose();
return image;
}
protected abstract void setInCache(String captcha);
/*
* 绘制字符串
*/
private String drowString(Graphics g, String randomString, int i) {
g.setFont(getFont());
g.setColor(new Color(random.nextInt(101), random.nextInt(111), random.nextInt(121)));
String rand = String.valueOf(getRandomString(random.nextInt(randString.length())));
randomString += rand;
g.translate(random.nextInt(3), random.nextInt(3));
g.drawString(rand, 13 * i, 20);
return randomString;
}
/*
* 绘制干扰线
*/
private void drowLine(Graphics g) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(13);
int yl = random.nextInt(15);
g.drawLine(x, y, x + xl, y + yl);
}
/*
* 获取随机的字符
*/
public String getRandomString(int num) {
return String.valueOf(randString.charAt(num));
}
}
\ No newline at end of file
package com.diaoyun.zion.master.captcha;
/**
* 验证码异常
*
* @author Joe
*/
public class CaptchaException extends RuntimeException {
private static final long serialVersionUID = -6834765632942616744L;
public CaptchaException() {
super();
}
public CaptchaException(String message) {
super(message);
}
public CaptchaException(Throwable cause) {
super(cause);
}
public CaptchaException(String message, Throwable cause) {
super(message, cause);
}
}
package com.diaoyun.zion.master.captcha;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 用于web.xml生成验证码
*
* @author Joe
*/
public class CaptchaFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.setDateHeader("Expires", 0L);
httpResponse.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
httpResponse.addHeader("Cache-Control", "post-check=0, pre-check=0");
httpResponse.setHeader("Pragma", "no-cache");
httpResponse.setContentType("image/jpeg");
CaptchaHelper.setInCache(httpRequest, httpResponse);
}
@Override
public void destroy() {
}
}
\ No newline at end of file
package com.diaoyun.zion.master.captcha;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.IOException;
/**
* 验证码缓存工具类
*
* @author Joe
*/
public class CaptchaHelper {
public static final String CACHE_CAPTCHA = "_captcha";
public static void setInCache(final HttpServletRequest request, HttpServletResponse response) throws IOException {
BufferedImage image = new Captcha() {
protected void setInCache(String captcha) {
request.getSession().setAttribute(CACHE_CAPTCHA, captcha);
}
}.generate();
ServletOutputStream out = response.getOutputStream();
ImageIO.write(image, "jpg", out);
try {
out.flush();
}
finally {
out.close();
}
}
public static boolean validate(HttpServletRequest request, String captcha) {
String sessionCaptcha = request.getSession().getAttribute(CaptchaHelper.CACHE_CAPTCHA).toString();
return sessionCaptcha == null ? false : sessionCaptcha.equalsIgnoreCase(captcha);
}
}
\ No newline at end of file
package com.diaoyun.zion.master.common;
import com.diaoyun.zion.chinafrica.vo.TbCfUserInfoVo;
import com.diaoyun.zion.master.config.DomainProperties;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
/**
* 单实例环境令牌管理
*
* @author Joe
*/
@Component("localTokenManager")
public class LocalTokenManager extends TokenManager {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private DomainProperties domainProperties;
// 令牌存储结构 TODO 放到 redis 中
private final ConcurrentHashMap<String, DummyUser> tokenMap = new ConcurrentHashMap<String, DummyUser>();
@Override
public void verifyExpired() {
Date now = new Date();
for (Entry<String, DummyUser> entry : tokenMap.entrySet()) {
String token = entry.getKey();
DummyUser dummyUser = entry.getValue();
// 当前时间大于过期时间
if (now.compareTo(dummyUser.expired) > 0) {
// 已过期,清除对应token
if (now.compareTo(dummyUser.expired) > 0) {
tokenMap.remove(token);
logger.debug("token : " + token + "已失效");
}
}
}
}
public void addToken(String token, TbCfUserInfoVo loginUser) {
DummyUser dummyUser = new DummyUser();
dummyUser.loginUser = loginUser;
extendExpiredTime(dummyUser);
tokenMap.putIfAbsent(token, dummyUser);
}
public TbCfUserInfoVo validate(String token) {
DummyUser dummyUser = tokenMap.get(token);
if (dummyUser == null) {
return null;
}
extendExpiredTime(dummyUser);
return dummyUser.loginUser;
}
public void remove(String token) {
tokenMap.remove(token);
}
/**
* 扩展过期时间
*
* @param dummyUser
*/
private void extendExpiredTime(DummyUser dummyUser) {
String expiredTime=domainProperties.getProperty("token.expiredTime");
Integer expired=1800;
if(StringUtils.isNotBlank(expiredTime)) {
expired=Integer.valueOf(expiredTime);
}
dummyUser.expired = new Date(new Date().getTime() + tokenTimeout * expired);
}
// 复合结构体,含loginUser与过期时间expried两个成员
private class DummyUser {
private TbCfUserInfoVo loginUser;
private Date expired; // 过期时间
}
}
package com.diaoyun.zion.master.common;
import com.diaoyun.zion.chinafrica.vo.TbCfUserInfoVo;
import com.diaoyun.zion.master.config.DomainProperties;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* 分布式环境令牌管理
* @author G
*/
@Component("redisTokenManager")
public class RedisTokenManager extends TokenManager {
@Autowired
private DomainProperties domainProperties;
@Resource
private RedisCache<TbCfUserInfoVo> redisCache;
@Override
public void addToken(String token, TbCfUserInfoVo loginUser) {
String timeStr=domainProperties.getProperty("token.expiredTime");
long expiredTime=tokenTimeout;
if(StringUtils.isNotBlank(timeStr)) {
expiredTime=Long.valueOf(timeStr);
}
redisCache.set(token, loginUser, expiredTime);
}
@Override
public TbCfUserInfoVo validate(String token) {
TbCfUserInfoVo loginUser = redisCache.get(token);
if (loginUser != null ) {
addToken(token, loginUser);
}
return loginUser;
}
@Override
public void remove(String token) {
redisCache.delete(token);
}
@Override
public void verifyExpired() {
}
}
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论