ck 6 years ago
commit a408b44076

3
.gitignore vendored

@ -0,0 +1,3 @@
/.idea/
/target/
/case.iml

@ -10,6 +10,7 @@ import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource; import org.springframework.context.MessageSource;
import org.springframework.context.MessageSourceAware; import org.springframework.context.MessageSourceAware;
import org.springframework.web.bind.annotation.CrossOrigin;
import java.lang.reflect.ParameterizedType; import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type; import java.lang.reflect.Type;

@ -4,6 +4,8 @@ import com.alibaba.fastjson.JSONObject;
import com.bsd.cases.service.CaseCategoryService; import com.bsd.cases.service.CaseCategoryService;
import com.bsd.cases.util.AjaxRequest; import com.bsd.cases.util.AjaxRequest;
import com.bsd.cases.util.AjaxResult; import com.bsd.cases.util.AjaxResult;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -11,6 +13,7 @@ import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@CrossOrigin
@RestController @RestController
@RequestMapping("/case-category") @RequestMapping("/case-category")
public class CaseCategoryController { public class CaseCategoryController {

@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
import com.bsd.cases.service.CaseContentService; import com.bsd.cases.service.CaseContentService;
import com.bsd.cases.util.AjaxRequest; import com.bsd.cases.util.AjaxRequest;
import com.bsd.cases.util.AjaxResult; import com.bsd.cases.util.AjaxResult;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -11,6 +12,7 @@ import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@CrossOrigin
@RestController @RestController
@RequestMapping("/case-content") @RequestMapping("/case-content")
public class CaseContentController { public class CaseContentController {

@ -0,0 +1,32 @@
package com.bsd.cases.controller;
import com.alibaba.fastjson.JSONObject;
import com.bsd.cases.model.CaseRecommend;
import com.bsd.cases.service.CaseRecommendService;
import com.bsd.cases.util.AjaxResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
@RestController
@RequestMapping("/case-recommend")
public class CaseRecommendController {
@Resource
private CaseRecommendService caseRecommendService;
@RequestMapping("/get-case-recommend")
public AjaxResult getAllCategory(HttpServletRequest request) {
AjaxResult ajaxResult = new AjaxResult();
List<CaseRecommend> caseRecommendList = caseRecommendService.getCaseRecommend();
if (null!=caseRecommendList){
ajaxResult.setRetcode(AjaxResult.SUCCESS);
ajaxResult.setData(caseRecommendList);
}else {
ajaxResult.setRetcode(AjaxResult.FAILED);
}
return ajaxResult;
}
}

@ -2,8 +2,13 @@ package com.bsd.cases.mapper;
import com.bsd.cases.model.CaseCategory; import com.bsd.cases.model.CaseCategory;
import com.bsd.cases.util.CommonMapper; import com.bsd.cases.util.CommonMapper;
import com.bsd.cases.vo.CaseSearchVo;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.List;
@Repository @Repository
public interface CaseCategoryMapper extends CommonMapper<CaseCategory> { public interface CaseCategoryMapper extends CommonMapper<CaseCategory> {
List<CaseSearchVo> search(@Param("name") String name);
} }

@ -0,0 +1,9 @@
package com.bsd.cases.mapper;
import com.bsd.cases.model.CaseRecommend;
import com.bsd.cases.util.CommonMapper;
import org.springframework.stereotype.Repository;
@Repository
public interface CaseRecommendMapper extends CommonMapper<CaseRecommend> {
}

@ -15,4 +15,5 @@ public class CaseCategory extends BaseEntity{
private Long parentId; private Long parentId;
private String url;
} }

@ -0,0 +1,18 @@
package com.bsd.cases.model;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("case_recommend")
public class CaseRecommend extends BaseEntity{
private Long contentId;
private String url;
private Integer sort;
}

@ -2,6 +2,7 @@ package com.bsd.cases.service;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.bsd.cases.util.AjaxRequest; import com.bsd.cases.util.AjaxRequest;
import com.bsd.cases.vo.CaseSearchVo;
import java.util.List; import java.util.List;
@ -10,4 +11,6 @@ public interface CaseCategoryService<CaseCategory> extends BaseService<CaseCateg
JSONObject getAllCaseCategory(); JSONObject getAllCaseCategory();
JSONObject getCaseCategoryByParentId(Long parentId,Integer pageNum,Integer pageSize); JSONObject getCaseCategoryByParentId(Long parentId,Integer pageNum,Integer pageSize);
JSONObject search(String name,Integer pageNum,Integer pageSize);
} }

@ -0,0 +1,7 @@
package com.bsd.cases.service;
import java.util.List;
public interface CaseRecommendService<CaseRecommend> extends BaseService<CaseRecommend> {
List<CaseRecommend> getCaseRecommend();
}

@ -1,13 +1,17 @@
package com.bsd.cases.service.impl; package com.bsd.cases.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.bsd.cases.constants.Constants; import com.bsd.cases.constants.Constants;
import com.bsd.cases.mapper.CaseCategoryMapper; import com.bsd.cases.mapper.CaseCategoryMapper;
import com.bsd.cases.model.CaseCategory; import com.bsd.cases.model.CaseCategory;
import com.bsd.cases.model.CaseContent;
import com.bsd.cases.service.CaseCategoryService; import com.bsd.cases.service.CaseCategoryService;
import com.bsd.cases.util.AjaxRequest; import com.bsd.cases.util.AjaxRequest;
import com.bsd.cases.util.AjaxResult; import com.bsd.cases.util.AjaxResult;
import com.bsd.cases.util.PageUtils; import com.bsd.cases.util.PageUtils;
import com.bsd.cases.vo.CaseCategoryVo;
import com.bsd.cases.vo.CaseSearchVo;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -51,15 +55,49 @@ public class CaseCategoryServiceImpl extends BaseServiceImpl<CaseCategoryMapper,
findCaseCategory2.setState(Constants.STATE_VALID); findCaseCategory2.setState(Constants.STATE_VALID);
List<CaseCategory> caseCategoryList2 = caseCategoryMapper.select(findCaseCategory2); List<CaseCategory> caseCategoryList2 = caseCategoryMapper.select(findCaseCategory2);
findCaseCategory.setState(Constants.STATE_VALID); findCaseCategory.setState(Constants.STATE_VALID);
findCaseCategory.setParentId(caseCategoryList2.get(0).getId()); parentId = caseCategoryList2.get(0).getId();
findCaseCategory.setParentId(parentId);
}else { }else {
findCaseCategory.setState(Constants.STATE_VALID); findCaseCategory.setState(Constants.STATE_VALID);
findCaseCategory.setParentId(parentId); findCaseCategory.setParentId(parentId);
} }
List<CaseCategory> caseCategoryList = caseCategoryMapper.select(findCaseCategory); List<CaseCategory> caseCategoryList = caseCategoryMapper.select(findCaseCategory);
JSONObject pageJson = PageUtils.page(caseCategoryList,pageNum,pageSize); JSONObject pageJson = PageUtils.page(caseCategoryList,pageNum,pageSize);
JSONArray jsonArray = pageJson.getJSONArray("list");
caseCategoryList = JSONObject.parseArray(JSONObject.toJSONString(jsonArray), CaseCategory.class);
List<CaseCategoryVo> newCaseCategoryVoList = new ArrayList<>();
for (CaseCategory caseCategory:caseCategoryList){
CaseCategoryVo caseCategoryVo = new CaseCategoryVo();
caseCategoryVo.setName(caseCategory.getName());
caseCategoryVo.setLevel(caseCategory.getLevel());
caseCategoryVo.setParentId(parentId);
caseCategoryVo.setUrl(caseCategory.getUrl());
String parenName = caseCategoryMapper.selectByPrimaryKey(parentId).getName();
caseCategoryVo.setParentName(parenName);
newCaseCategoryVoList.add(caseCategoryVo);
}
JSONObject jsonObject = new JSONObject();
jsonObject.put("list",newCaseCategoryVoList);
jsonObject.put("total",pageJson.getInteger("total"));
jsonObject.put("pageNum",pageNum);
jsonObject.put("pages",(int) Math.ceil(Double.valueOf(pageJson.getInteger("total")) / Double.valueOf(pageSize)));
jsonObject.put("pageSize",pageSize);
return pageJson; return pageJson;
} }
/**
*
* @param name
* @param pageNum
* @param pageSize
* @return
*/
@Override
public JSONObject search(String name, Integer pageNum, Integer pageSize) {
List<CaseSearchVo> caseSearchVoList = caseCategoryMapper.search(name);
JSONObject data = PageUtils.page(caseSearchVoList,pageNum,pageSize);
return data;
}
} }

@ -57,6 +57,7 @@ public class CaseContentServiceImpl extends BaseServiceImpl<CaseContentMapper, C
jsonObject.put("total",pageJson.getInteger("total")); jsonObject.put("total",pageJson.getInteger("total"));
jsonObject.put("pageNum",pageNum); jsonObject.put("pageNum",pageNum);
jsonObject.put("pageSize",pageSize); jsonObject.put("pageSize",pageSize);
jsonObject.put("pages",(int) Math.ceil(Double.valueOf(pageJson.getInteger("total")) / Double.valueOf(pageSize)));
return jsonObject; return jsonObject;
} }
} }

@ -0,0 +1,35 @@
package com.bsd.cases.service.impl;
import com.bsd.cases.constants.Constants;
import com.bsd.cases.mapper.CaseRecommendMapper;
import com.bsd.cases.model.CaseRecommend;
import com.bsd.cases.service.CaseRecommendService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;
import javax.annotation.Resource;
import java.util.List;
@Service("caseRecommendService")
@Transactional
public class CaseRecommendServiceImpl extends BaseServiceImpl<CaseRecommendMapper, CaseRecommend>
implements CaseRecommendService<CaseRecommend> {
@Resource
private CaseRecommendMapper caseRecommendMapper;
/**
* banner
* @return
*/
@Override
public List<CaseRecommend> getCaseRecommend() {
Example example = new Example(CaseRecommend.class);
Example.Criteria criteria = example.createCriteria();
criteria.andEqualTo("state",Constants.STATE_VALID);
example.setOrderByClause("sort asc");
List<CaseRecommend> caseRecommendList = caseRecommendMapper.selectByExample(example);
return caseRecommendList;
}
}

@ -1,236 +0,0 @@
package com.bsd.cases.service.impl;
import com.bsd.cases.service.WxMpConfigStorage;
import com.bsd.cases.util.wx.common.bean.WxAccessToken;
import javax.net.ssl.SSLContext;
import java.io.File;
/**
* provider
* @author chanjarster
*
*/
public class WxMpInMemoryConfigStorage implements WxMpConfigStorage {
protected volatile String appId;
protected volatile String secret;
protected volatile String partnerId;
protected volatile String partnerKey;
protected volatile String token;
protected volatile String accessToken;
protected volatile String aesKey;
protected volatile long expiresTime;
protected volatile String oauth2redirectUri;
protected volatile String http_proxy_host;
protected volatile int http_proxy_port;
protected volatile String http_proxy_username;
protected volatile String http_proxy_password;
protected volatile String jsapiTicket;
protected volatile long jsapiTicketExpiresTime;
/**
*
*/
protected volatile File tmpDirFile;
protected volatile SSLContext sslContext;
public String getAccessToken() {
return this.accessToken;
}
public boolean isAccessTokenExpired() {
return System.currentTimeMillis() > this.expiresTime;
}
public synchronized void updateAccessToken(WxAccessToken accessToken) {
updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn());
}
public synchronized void updateAccessToken(String accessToken, int expiresInSeconds) {
this.accessToken = accessToken;
this.expiresTime = System.currentTimeMillis() + (expiresInSeconds - 200) * 1000l;
}
public void expireAccessToken() {
this.expiresTime = 0;
}
public String getJsapiTicket() {
return jsapiTicket;
}
public void setJsapiTicket(String jsapiTicket) {
this.jsapiTicket = jsapiTicket;
}
public long getJsapiTicketExpiresTime() {
return jsapiTicketExpiresTime;
}
public void setJsapiTicketExpiresTime(long jsapiTicketExpiresTime) {
this.jsapiTicketExpiresTime = jsapiTicketExpiresTime;
}
public boolean isJsapiTicketExpired() {
return System.currentTimeMillis() > this.jsapiTicketExpiresTime;
}
public synchronized void updateJsapiTicket(String jsapiTicket, int expiresInSeconds) {
this.jsapiTicket = jsapiTicket;
// 预留200秒的时间
this.jsapiTicketExpiresTime = System.currentTimeMillis() + (expiresInSeconds - 200) * 1000l;
}
public void expireJsapiTicket() {
this.jsapiTicketExpiresTime = 0;
}
public String getAppId() {
return this.appId;
}
public String getSecret() {
return this.secret;
}
public String getToken() {
return this.token;
}
public long getExpiresTime() {
return this.expiresTime;
}
public void setAppId(String appId) {
this.appId = appId;
}
public void setSecret(String secret) {
this.secret = secret;
}
public void setToken(String token) {
this.token = token;
}
public String getAesKey() {
return aesKey;
}
public void setAesKey(String aesKey) {
this.aesKey = aesKey;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
public void setExpiresTime(long expiresTime) {
this.expiresTime = expiresTime;
}
@Override
public String getOauth2redirectUri() {
return this.oauth2redirectUri;
}
public void setOauth2redirectUri(String oauth2redirectUri) {
this.oauth2redirectUri = oauth2redirectUri;
}
public String getHttp_proxy_host() {
return http_proxy_host;
}
public void setHttp_proxy_host(String http_proxy_host) {
this.http_proxy_host = http_proxy_host;
}
public int getHttp_proxy_port() {
return http_proxy_port;
}
public void setHttp_proxy_port(int http_proxy_port) {
this.http_proxy_port = http_proxy_port;
}
public String getHttp_proxy_username() {
return http_proxy_username;
}
public void setHttp_proxy_username(String http_proxy_username) {
this.http_proxy_username = http_proxy_username;
}
public String getHttp_proxy_password() {
return http_proxy_password;
}
public void setHttp_proxy_password(String http_proxy_password) {
this.http_proxy_password = http_proxy_password;
}
@Override
public String toString() {
return "WxMpInMemoryConfigStorage{" +
"appId='" + appId + '\'' +
", secret='" + secret + '\'' +
", token='" + token + '\'' +
", partnerId='" + partnerId + '\'' +
", partnerKey='" + partnerKey + '\'' +
", accessToken='" + accessToken + '\'' +
", aesKey='" + aesKey + '\'' +
", expiresTime=" + expiresTime +
", http_proxy_host='" + http_proxy_host + '\'' +
", http_proxy_port=" + http_proxy_port +
", http_proxy_username='" + http_proxy_username + '\'' +
", http_proxy_password='" + http_proxy_password + '\'' +
", jsapiTicket='" + jsapiTicket + '\'' +
", jsapiTicketExpiresTime='" + jsapiTicketExpiresTime + '\'' +
", tmpDirFile='" + tmpDirFile + '\'' +
'}';
}
@Override
public String getPartnerId() {
return partnerId;
}
public void setPartnerId(String partnerId) {
this.partnerId = partnerId;
}
@Override
public String getPartnerKey() {
return partnerKey;
}
public void setPartnerKey(String partnerKey) {
this.partnerKey = partnerKey;
}
@Override
public File getTmpDirFile() {
return this.tmpDirFile;
}
public void setTmpDirFile(File tmpDirFile) {
this.tmpDirFile = tmpDirFile;
}
@Override
public SSLContext getSSLContext() {
return sslContext;
}
public void setSSLContext(SSLContext context) {
sslContext = context;
}
}

@ -1,99 +0,0 @@
package com.bsd.cases.service.impl;
import com.bsd.cases.service.WxMpConfigStorage;
import com.bsd.cases.service.WxMpService;
import com.bsd.cases.util.wx.common.bean.WxAccessToken;
import com.bsd.cases.util.wx.common.bean.result.WxError;
import com.bsd.cases.util.wx.common.exception.WxErrorException;
import com.bsd.cases.util.wx.common.session.StandardSessionManager;
import com.bsd.cases.util.wx.common.session.WxSessionManager;
import com.bsd.cases.util.wx.common.util.crypto.SHA1;
import org.apache.http.HttpHost;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
public class WxMpServiceImpl implements WxMpService {
protected final Logger log = LoggerFactory.getLogger(WxMpServiceImpl.class);
/**
* access token
*/
protected final Object globalAccessTokenRefreshLock = new Object();
/**
* jsapi_ticket
*/
protected final Object globalJsapiTicketRefreshLock = new Object();
protected WxMpConfigStorage wxMpConfigStorage;
protected CloseableHttpClient httpClient;
protected HttpHost httpProxy;
private int retrySleepMillis = 1000;
private int maxRetryTimes = 5;
protected WxSessionManager sessionManager = new StandardSessionManager();
public boolean checkSignature(String timestamp, String nonce, String signature) {
try {
return SHA1.gen(wxMpConfigStorage.getToken(), timestamp, nonce).equals(signature);
} catch (Exception e) {
return false;
}
}
public String getAccessToken() throws WxErrorException {
return getAccessToken(false);
}
public String getAccessToken(boolean forceRefresh) throws WxErrorException {
if (forceRefresh) {
wxMpConfigStorage.expireAccessToken();
}
if (wxMpConfigStorage.isAccessTokenExpired()) {
synchronized (globalAccessTokenRefreshLock) {
if (wxMpConfigStorage.isAccessTokenExpired()) {
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential"
+ "&appid=" + wxMpConfigStorage.getAppId()
+ "&secret=" + wxMpConfigStorage.getSecret();
try {
HttpGet httpGet = new HttpGet(url);
if (httpProxy != null) {
RequestConfig config = RequestConfig.custom().setProxy(httpProxy).build();
httpGet.setConfig(config);
}
CloseableHttpResponse response = getHttpclient().execute(httpGet);
String resultContent = new BasicResponseHandler().handleResponse(response);
WxError error = WxError.fromJson(resultContent);
if (error.getErrorCode() != 0) {
throw new WxErrorException(error);
}
WxAccessToken accessToken = WxAccessToken.fromJson(resultContent);
wxMpConfigStorage.updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn());
} catch (ClientProtocolException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
return wxMpConfigStorage.getAccessToken();
}
protected CloseableHttpClient getHttpclient() {
return httpClient;
}
}

@ -25,6 +25,7 @@ public class PageUtils {
jsonObject.put("total",size); jsonObject.put("total",size);
jsonObject.put("pageNum",pageNum); jsonObject.put("pageNum",pageNum);
jsonObject.put("pageSize",pageSize); jsonObject.put("pageSize",pageSize);
jsonObject.put("pages",(int) Math.ceil(Double.valueOf(size) / Double.valueOf(pageSize)));
return jsonObject; return jsonObject;
} }
} }

@ -0,0 +1,17 @@
package com.bsd.cases.vo;
import lombok.Data;
@Data
public class CaseCategoryVo {
private String name;
private Integer level;
private Long parentId;
private String url;
private String parentName;
}

@ -0,0 +1,17 @@
package com.bsd.cases.vo;
import lombok.Data;
@Data
public class CaseSearchVo {
private Long id;
private String name;
private String url;
/**
* type 0 category type 1 content
*/
private Integer type;
}

@ -1,7 +1,5 @@
#服务器端口号配置
server: server:
port: 8080 port: 8080
#数据源配置
spring: spring:
datasource: datasource:
@ -25,7 +23,6 @@ spring:
pool-prepared-statements: true pool-prepared-statements: true
max-open-prepared-statements: 50 max-open-prepared-statements: 50
max-pool-prepared-statement-per-connection-size: 20 max-pool-prepared-statement-per-connection-size: 20
# 页面配置
mvc: mvc:
view: view:
prefix: /templates/ prefix: /templates/
@ -34,12 +31,10 @@ spring:
cache: false cache: false
request-context-attribute: request request-context-attribute: request
#日志配置 log4j2
logging: logging:
config: classpath:log4j2.yml config: classpath:log4j2.yml
#mybatis配置
mybatis: mybatis:
type-aliases-package: com.oceanspot.template.util.model type-aliases-package: com.oceanspot.template.util.model
mapper-locations: classpath:mapper/*.xml mapper-locations: classpath:mapper/*.xml

@ -1,7 +1,5 @@
#服务器端口号配置
server: server:
port: 8080 port: 8080
#数据源配置
spring: spring:
datasource: datasource:
@ -25,7 +23,6 @@ spring:
pool-prepared-statements: true pool-prepared-statements: true
max-open-prepared-statements: 50 max-open-prepared-statements: 50
max-pool-prepared-statement-per-connection-size: 20 max-pool-prepared-statement-per-connection-size: 20
# 页面配置
mvc: mvc:
view: view:
prefix: /templates/ prefix: /templates/
@ -34,12 +31,10 @@ spring:
cache: false cache: false
request-context-attribute: request request-context-attribute: request
#日志配置 log4j2
logging: logging:
config: classpath:log4j2.yml config: classpath:log4j2.yml
#mybatis配置
mybatis: mybatis:
type-aliases-package: com.oceanspot.template.util.model type-aliases-package: com.oceanspot.template.util.model
mapper-locations: classpath:mapper/*.xml mapper-locations: classpath:mapper/*.xml

@ -1,5 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bsd.cases.mapper.CaseCategoryMapper"> <mapper namespace="com.bsd.cases.mapper.CaseCategoryMapper">
<select id="search" resultType="com.bsd.cases.vo.CaseSearchVo">
SELECT id,type,`name`,url FROM (SELECT id , 0 as type,`name`,url FROM case_category
union all
SELECT id ,1 as type,content_title as `name`,url from case_content ) a
WHERE a.`name` LIKE CONCAT('%',#{name},'%')
</select>
</mapper> </mapper>

Loading…
Cancel
Save