diff --git a/.gitignore b/.gitignore index 6143e53..db75790 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,4 @@ # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* +target diff --git a/README.md b/README.md index 95497a2..7b3cb43 100644 --- a/README.md +++ b/README.md @@ -1 +1,15 @@ -# magnetW \ No newline at end of file +## Demo +#### [直接体验](http://bt.xiandan.in) + +## 截屏 +![](screenshots.gif) + +## 其它版本 +#### Mac版:[magnetX](https://github.com/youusername/magnetX) + +## 快速搭建 +#### 进入[releases](https://github.com/dengyuhan/magnetW/releases)下载编译好的war包,发布到tomcat即可 + + +## 免责声明 +#### 仅用于技术交流学习,禁止商用,对此工具的非法使用概不负责。 diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..91d21a6 --- /dev/null +++ b/pom.xml @@ -0,0 +1,94 @@ + + 4.0.0 + com.dyhdyh + magnetw + war + 1.0.1 + magnetW + http://maven.apache.org + + + + org.jsoup + jsoup + 1.11.2 + + + net.sourceforge.htmlcleaner + htmlcleaner + 2.21 + + + + + com.google.code.gson + gson + 2.8.2 + + + + + javax.servlet.jsp.jstl + jstl-api + 1.2 + + + log4j + log4j + 1.2.17 + + + + + javax.el + javax.el-api + 3.0.0 + + + taglibs + standard + 1.1.2 + + + + + + org.springframework + spring-web + 4.3.1.RELEASE + + + org.springframework + spring-webmvc + 4.3.1.RELEASE + + + org.springframework + spring-context-support + 4.3.1.RELEASE + + + + + + net.sf.ehcache + ehcache + 2.10.4 + + + + magnetw + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.6 + 1.6 + + + + + diff --git a/screenshots.gif b/screenshots.gif new file mode 100644 index 0000000..b340448 Binary files /dev/null and b/screenshots.gif differ diff --git a/src/main/java/com/dyhdyh/magnetw/controller/BaseController.java b/src/main/java/com/dyhdyh/magnetw/controller/BaseController.java new file mode 100644 index 0000000..ebeb945 --- /dev/null +++ b/src/main/java/com/dyhdyh/magnetw/controller/BaseController.java @@ -0,0 +1,44 @@ +package com.dyhdyh.magnetw.controller; + +import org.apache.log4j.Logger; +import org.springframework.ui.Model; +import org.springframework.util.StringUtils; + +import java.net.SocketTimeoutException; +import java.net.URLDecoder; + +import javax.servlet.http.HttpServletRequest; + +/** + * author dengyuhan + * created 2018/3/7 14:19 + */ +public class BaseController { + private Logger logger = Logger.getLogger(getClass()); + + protected void logger(HttpServletRequest request) { + String queryString = request.getQueryString(); + if (!StringUtils.isEmpty(queryString)) { + logger.info(request.getRequestURL() + "?" + URLDecoder.decode(queryString)); + } + } + + protected String error(Model model, Throwable e) { + return error(model, null, e); + } + + protected String error(Model model, String message, Throwable e) { + String defaultMessage = "未知错误"; + if (e != null) { + e.printStackTrace(); + if (e instanceof SocketTimeoutException) { + defaultMessage = "请求超时"; + } + } + if (StringUtils.isEmpty(message)) { + message = defaultMessage; + } + model.addAttribute("error_message", message); + return "error"; + } +} diff --git a/src/main/java/com/dyhdyh/magnetw/controller/MagnetWController.java b/src/main/java/com/dyhdyh/magnetw/controller/MagnetWController.java new file mode 100644 index 0000000..1e45a69 --- /dev/null +++ b/src/main/java/com/dyhdyh/magnetw/controller/MagnetWController.java @@ -0,0 +1,133 @@ +package com.dyhdyh.magnetw.controller; + +import com.dyhdyh.magnetw.model.MagnetInfo; +import com.dyhdyh.magnetw.model.MagnetRule; +import com.dyhdyh.magnetw.service.MagnetWService; +import com.dyhdyh.magnetw.util.GsonUtil; +import com.google.gson.reflect.TypeToken; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.io.InputStream; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.servlet.http.HttpServletRequest; + +/** + * author dengyuhan + * created 2018/3/6 16:03 + */ +@Controller +@RequestMapping("") +public class MagnetWController extends BaseController { + + @Autowired + MagnetWService magnetWService; + + private Map magnetRuleMap; + private List sites; + + + /** + * 搜索 + * + * @param model + * @param site + * @param keyword + * @param page + * @return + */ + @RequestMapping(value = {"/", "search"}, method = RequestMethod.GET) + public String submitSearchMagnet(Model model, HttpServletRequest request, @RequestParam(required = false) String site, @RequestParam(required = false) String keyword, @RequestParam(required = false) Integer page) { + logger(request); + try { + List siteNames = getSiteNames(); + if (StringUtils.isEmpty(site)) { + site = siteNames.get(0); + } + int newPage = magnetWService.transformPage(page); + //model.addAttribute("title", String.format("%s - %s", site, keyword)); + model.addAttribute("current_site", site); + model.addAttribute("keyword", keyword); + model.addAttribute("current_page", newPage); + model.addAttribute("site_list", siteNames); + return "search_result"; + } catch (Exception e) { + return error(model, e); + } + } + + + /** + * @param model + * @param site + * @param keyword + * @param page + * @return + */ + @RequestMapping(value = "search-json", method = {RequestMethod.GET, RequestMethod.POST}) + @ResponseBody + public List submitSearchMagnetJson(Model model, HttpServletRequest request, @RequestParam(required = false) String site, @RequestParam(required = false) String keyword, @RequestParam(required = false) Integer page) { + logger(request); + try { + List siteNames = getSiteNames(); + if (StringUtils.isEmpty(site)) { + site = siteNames.get(0); + } + List infos = null; + int newPage = magnetWService.transformPage(page); + if (!StringUtils.isEmpty(keyword)) { + MagnetRule rule = getMagnetRule().get(site); + infos = magnetWService.parser(rule, keyword, newPage); + } + return infos; + } catch (Exception e) { + error(model, e); + return new ArrayList(); + } + + + } + + /** + * 网站的筛选规则 + * + * @return + */ + private Map getMagnetRule() { + if (magnetRuleMap == null) { + magnetRuleMap = new LinkedHashMap(); + + InputStream inputStream = getClass().getResourceAsStream("/rule.json"); + List rules = GsonUtil.fromJson(inputStream, new TypeToken>() { + }); + for (MagnetRule rule : rules) { + magnetRuleMap.put(rule.getSite(), rule); + } + } + return magnetRuleMap; + } + + + private List getSiteNames() { + if (sites == null) { + sites = new ArrayList(); + Set> entries = getMagnetRule().entrySet(); + for (Map.Entry entry : entries) { + sites.add(entry.getKey()); + } + } + return sites; + } +} diff --git a/src/main/java/com/dyhdyh/magnetw/filter/EncodingFilter.java b/src/main/java/com/dyhdyh/magnetw/filter/EncodingFilter.java new file mode 100644 index 0000000..c845787 --- /dev/null +++ b/src/main/java/com/dyhdyh/magnetw/filter/EncodingFilter.java @@ -0,0 +1,75 @@ +package com.dyhdyh.magnetw.filter; + +import org.springframework.cglib.proxy.InvocationHandler; +import org.springframework.cglib.proxy.Proxy; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.lang.reflect.Method; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * author dengyuhan + * created 2018/3/8 18:05 + */ +public class EncodingFilter extends OncePerRequestFilter { + private String encoding; + + public void setEncoding(String encoding) { + this.encoding = encoding; + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) + throws ServletException, IOException { + // 设置请求响应字符编码 + request.setCharacterEncoding(encoding); + response.setCharacterEncoding(encoding); + + // 传递给目标servlet或jsp的实际上是动态代理的对象,而不是原始的HttpServletRequest对象 + request = (HttpServletRequest) Proxy.newProxyInstance(request.getClass().getClassLoader(), request.getClass().getInterfaces(), new MyInvacationHandler(request)); + chain.doFilter(request, response); + } + + class MyInvacationHandler implements InvocationHandler { + private HttpServletRequest request; + MyInvacationHandler(HttpServletRequest request){ + this.request=request; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{ + if (method.getName().equals("getParameter")) { + String value = request.getParameter((String) args[0]); + try { + if (value != null) { + value = new String(value.getBytes("ISO-8859-1"), encoding); + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return value; + } else if (method.getName().equals("getParameterValues")) { + String[] values = request.getParameterValues((String) args[0]); + if (values != null) { + for (int i = 0; i < values.length; i++) { + try { + values[i] = new String(values[i].getBytes("ISO-8859-1"), encoding); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } + } + return values; + } else { + return method.invoke(request, args); + } + } + + } +} \ No newline at end of file diff --git a/src/main/java/com/dyhdyh/magnetw/model/MagnetInfo.java b/src/main/java/com/dyhdyh/magnetw/model/MagnetInfo.java new file mode 100644 index 0000000..5a6d01c --- /dev/null +++ b/src/main/java/com/dyhdyh/magnetw/model/MagnetInfo.java @@ -0,0 +1,66 @@ +package com.dyhdyh.magnetw.model; + +import java.io.Serializable; + +/** + * author dengyuhan + * created 2018/3/7 11:29 + */ +public class MagnetInfo implements Serializable{ + + private String group; + private String magnet; + private String name; + private String size; + private String count; + + private String resolution;//清晰度 + + public String getResolution() { + return resolution; + } + + public void setResolution(String resolution) { + this.resolution = resolution; + } + + public String getGroup() { + return group; + } + + public void setGroup(String group) { + this.group = group; + } + + public String getMagnet() { + return magnet; + } + + public void setMagnet(String magnet) { + this.magnet = magnet; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSize() { + return size; + } + + public void setSize(String size) { + this.size = size; + } + + public String getCount() { + return count; + } + + public void setCount(String count) { + this.count = count; + } +} diff --git a/src/main/java/com/dyhdyh/magnetw/model/MagnetRule.java b/src/main/java/com/dyhdyh/magnetw/model/MagnetRule.java new file mode 100644 index 0000000..052b708 --- /dev/null +++ b/src/main/java/com/dyhdyh/magnetw/model/MagnetRule.java @@ -0,0 +1,35 @@ +package com.dyhdyh.magnetw.model; + +/** + * author dengyuhan + * created 2018/3/7 11:52 + */ +public class MagnetRule extends MagnetInfo{ + private String source; + private String site; + private String waiting; + + public String getSource() { + return source; + } + + public void setSource(String source) { + this.source = source; + } + + public String getSite() { + return site; + } + + public void setSite(String site) { + this.site = site; + } + + public String getWaiting() { + return waiting; + } + + public void setWaiting(String waiting) { + this.waiting = waiting; + } +} diff --git a/src/main/java/com/dyhdyh/magnetw/service/MagnetWService.java b/src/main/java/com/dyhdyh/magnetw/service/MagnetWService.java new file mode 100644 index 0000000..68cd82c --- /dev/null +++ b/src/main/java/com/dyhdyh/magnetw/service/MagnetWService.java @@ -0,0 +1,143 @@ +package com.dyhdyh.magnetw.service; + +import com.dyhdyh.magnetw.model.MagnetInfo; +import com.dyhdyh.magnetw.model.MagnetRule; + +import org.htmlcleaner.CleanerProperties; +import org.htmlcleaner.DomSerializer; +import org.htmlcleaner.HtmlCleaner; +import org.jsoup.Jsoup; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Pattern; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpressionException; +import javax.xml.xpath.XPathFactory; + +/** + * author dengyuhan + * created 2018/3/6 16:04 + */ +@Service +public class MagnetWService { + @Cacheable(value = "magnetList", key = "T(String).format('%s-%s-%d',#rule.source,#keyword,#page)") + public List parser(MagnetRule rule, String keyword, int page) throws IOException, XPathExpressionException, ParserConfigurationException { + return parser(rule.getSource(), keyword, page, rule.getGroup(), rule.getMagnet(), rule.getName(), rule.getSize(), rule.getCount()); + } + + @Cacheable(value = "magnetList", key = "T(String).format('%s-%s-%d',#url,#keyword,#page)") + public List parser(String url, String keyword, int page, String group, String magnet, String name, String size, String count) throws IOException, XPathExpressionException, ParserConfigurationException { + String newUrl = transformUrl(url, keyword, page); + String html = Jsoup.connect(newUrl).get().body().html(); + XPath xPath = XPathFactory.newInstance().newXPath(); + Document dom = new DomSerializer(new CleanerProperties()).createDOM(new HtmlCleaner().clean(html)); + + NodeList result = (NodeList) xPath.evaluate(group, dom, XPathConstants.NODESET); + List infos = new ArrayList(); + for (int i = 0; i < result.getLength(); i++) { + Node node = result.item(i); + if (node != null) { + MagnetInfo info = new MagnetInfo(); + Node magnetNote = (Node) xPath.evaluate(magnet, node, XPathConstants.NODE); + //磁力链 + String magnetValue = magnetNote.getNodeValue(); + info.setMagnet(transformMagnet(magnetValue)); + //名称 + String nameValue = ((Node) xPath.evaluate(name, node, XPathConstants.NODE)).getTextContent(); + info.setName(nameValue); + //大小 + String sizeValue = ((Node) xPath.evaluate(size, node, XPathConstants.NODE)).getTextContent(); + info.setSize(sizeValue); + //时间 + String countValue = ((Node) xPath.evaluate(count, node, XPathConstants.NODE)).getTextContent(); + info.setCount(countValue); + //一些加工的额外信息 + String resolution = transformResolution(nameValue); + info.setResolution(resolution); + + infos.add(info); + } + } + return infos; + } + + + public int transformPage(Integer page) { + return page == null || page <= 0 ? 1 : page; + } + + /** + * 数据源链接转换 + * + * @param url + * @param keyword + * @param page + * @return + */ + private String transformUrl(String url, String keyword, int page) { + return url.replaceFirst("XXX", keyword) + .replaceFirst("PPP", String.valueOf(page)); + } + + /** + * 磁力链转换 + * + * @param url + * @return + */ + private String transformMagnet(String url) { + String regex = "magnet:?[^\\\"]+"; + boolean matches = Pattern.matches(regex, url); + if (matches) { + return url; + } else { + String newMagnet; + try { + StringBuffer sb = new StringBuffer(url); + int htmlIndex = url.lastIndexOf(".html"); + if (htmlIndex != -1) { + sb.delete(htmlIndex, sb.length()); + } + int paramIndex = url.indexOf("&"); + if (paramIndex != -1) { + sb.delete(paramIndex, sb.length()); + } + if (sb.length() >= 40) { + newMagnet = sb.substring(sb.length() - 40, sb.length()); + } else { + newMagnet = url; + } + } catch (Exception e) { + e.printStackTrace(); + newMagnet = url; + } + return String.format("magnet:?xt=urn:btih:%s", newMagnet); + } + } + + + private String transformResolution(String name) { + String regex720 = ".*(1280|720p|720P).*"; + String regex1080 = ".*(1920|1080p|1080P).*"; + boolean matches720 = Pattern.matches(regex720, name); + if (matches720) { + return "720P"; + } + boolean matches1080 = Pattern.matches(regex1080, name); + if (matches1080) { + return "1080P"; + } + return ""; + } + +} diff --git a/src/main/java/com/dyhdyh/magnetw/util/GsonUtil.java b/src/main/java/com/dyhdyh/magnetw/util/GsonUtil.java new file mode 100644 index 0000000..8c72b06 --- /dev/null +++ b/src/main/java/com/dyhdyh/magnetw/util/GsonUtil.java @@ -0,0 +1,19 @@ +package com.dyhdyh.magnetw.util; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.io.InputStream; +import java.io.InputStreamReader; + +/** + * author dengyuhan + * created 2018/3/7 14:00 + */ +public class GsonUtil { + private static Gson gson = new Gson(); + + public static T fromJson(InputStream inputStream, TypeToken token) { + return gson.fromJson(new InputStreamReader(inputStream), token.getType()); + } +} diff --git a/src/main/resources/ehcache.xml b/src/main/resources/ehcache.xml new file mode 100644 index 0000000..8a2f0ee --- /dev/null +++ b/src/main/resources/ehcache.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/rule.json b/src/main/resources/rule.json new file mode 100644 index 0000000..775af91 --- /dev/null +++ b/src/main/resources/rule.json @@ -0,0 +1,92 @@ +[ + { + "site": "种子搜", + "waiting": "0", + "group": "//table[@class='table table-bordered table-striped']", + "magnet": ".//a//@href", + "name": ".//tbody//a", + "size": ".//tbody//tr//td[2]//strong", + "count": ".//tbody//tr//td[1]//strong", + "source": "http://www.zhongziso.com/list/XXX/PPP" + }, + { + "site": "磁力吧", + "waiting": "0", + "group": "//div[@class='search-item']", + "magnet": ".//a//@href", + "name": ".//a", + "size": ".//span[3]//b", + "count": ".//span[2]//b", + "source": "http://www.ciliba.org/s/XXX_rel_PPP.html" + }, + { + "site": "AOYOSO", + "waiting": "0", + "group": "//div[@class='col-md-8']//div[@class='panel panel-default']", + "magnet": ".//a//@href", + "name": ".//a", + "size": ".//table//tr//td[2]", + "count": ".//table//tr//td[1]", + "source": "http://www.aoyoso.com/search/XXX_ctime_PPP.html" + }, + { + "site": "SOBT", + "waiting": "0", + "group": "//div[@class='search-list col-md-8']//div[@class='search-item']", + "magnet": ".//a//@href", + "name": ".//a[@target='_blank']", + "size": ".//div[@class='item-bar']//span[2]//b", + "count": ".//div[@class='item-bar']//span[1]//b", + "source": "http://www.sobt5.org/q/XXX_PPP.html" + }, + { + "site": "BT岛", + "waiting": "0", + "group": "//ul[@class='mlist']//li", + "magnet": ".//a//@href", + "name": ".//a[@target='_blank']", + "size": ".//dt//span[1]", + "count": ".//dt//span[2]", + "source": "http://www.btdao5.com/list/XXX-s1d-PPP.html" + }, + { + "site": "bt177", + "waiting": "0", + "group": "//li", + "magnet": ".//a//@href", + "name": ".//a", + "size": ".//span[1]", + "count": ".//span[2]", + "source": "http://www.bt177.net/word/XXX_PPP.html" + }, + { + "site": "zhongzidi", + "waiting": "0", + "group": "//div[@class='panel-body']//ul", + "magnet": ".//dl[2]/a[1]//@href", + "name": ".//a", + "size": ".//dl[1]/dd[2]", + "count": ".//dl[1]/dd[3]", + "source": "https://m.zhongzidi.com/list/XXX/PPP" + }, + { + "site": "cililiana", + "waiting": "0", + "group": "//ul[@class='mlist']//li", + "magnet": ".//div[2]/a[1]//@href", + "name": ".//div[1]/a", + "size": ".//dl/dt/span[1]", + "count": ".//dl/dt/span[3]", + "source": "http://cililiana.com/list/XXX/PPP.html" + }, + { + "site": "屌丝搜", + "waiting": "0", + "group": "//ul[@class='mlist']//li", + "magnet": ".//div[2]/a[1]//@href", + "name": ".//div[1]/a", + "size": ".//dl/dt/span[1]", + "count": ".//dl/dt/span[3]", + "source": "http://www.diaosisou.org/list/XXX/PPP" + } +] diff --git a/src/main/webapp/WEB-INF/dispatcher-servlet.xml b/src/main/webapp/WEB-INF/dispatcher-servlet.xml new file mode 100644 index 0000000..2381d10 --- /dev/null +++ b/src/main/webapp/WEB-INF/dispatcher-servlet.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/log4j.properties b/src/main/webapp/WEB-INF/log4j.properties new file mode 100644 index 0000000..8e5d393 --- /dev/null +++ b/src/main/webapp/WEB-INF/log4j.properties @@ -0,0 +1,32 @@ +name=magnetw +log_path = ${catalina.home}/logs/${name} +time = %d{yyyy-MM-dd HH:mm:ss:SSS} + +log4j.rootLogger = INFO, console,D,E + +# Disable other log +log4j.logger.org.springframework=OFF +log4j.logger.org.apache.struts2=OFF +log4j.logger.com.opensymphony.xwork2=OFF +log4j.logger.com.ibatis=OFF +log4j.logger.org.hibernate=OFF +log4j.logger.com.cloopen.rest=OFF + +log4j.appender.console = org.apache.log4j.ConsoleAppender +log4j.appender.console.Target = System.out +log4j.appender.console.layout = org.apache.log4j.PatternLayout +log4j.appender.console.layout.ConversionPattern =[%-5p]----[${time}]----[%l]%n%m%n%n + +log4j.appender.D = org.apache.log4j.DailyRollingFileAppender +log4j.appender.D.File = ${log_path}/${name}.log +log4j.appender.D.Append = true +log4j.appender.D.Threshold = INFO +log4j.appender.D.layout = org.apache.log4j.PatternLayout +log4j.appender.D.layout.ConversionPattern =[%-5p]----[${time}]----[%l]----%m%n + +log4j.appender.E = org.apache.log4j.DailyRollingFileAppender +log4j.appender.E.File =${log_path}/${name}.error.log +log4j.appender.E.Append = true +log4j.appender.E.Threshold = ERROR +log4j.appender.E.layout = org.apache.log4j.PatternLayout +log4j.appender.E.layout.ConversionPattern =[%-5p]----[${time}]----[%l]----%m%n \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/error.jsp b/src/main/webapp/WEB-INF/views/error.jsp new file mode 100644 index 0000000..1522c26 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/error.jsp @@ -0,0 +1,17 @@ +<%-- + Created by IntelliJ IDEA. + User: dengyuhan + Date: 2018/3/7 + Time: 14:18 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ page isELIgnored="false" %> + + + 出错了 + + +

${error_message}

+ + diff --git a/src/main/webapp/WEB-INF/views/search_result.jsp b/src/main/webapp/WEB-INF/views/search_result.jsp new file mode 100644 index 0000000..7318a75 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/search_result.jsp @@ -0,0 +1,142 @@ +<%-- + Created by IntelliJ IDEA. + User: dengyuhan + Date: 2018/3/7 + Time: 14:18 + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ page isELIgnored="false" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + <%----%> + + 磁力搜 - ${keyword} + + + + + + + + + + + + +
+
+
+
+
+ +
+
+ +
+
+
+ + + + + + + + + + +
+
+
+ + + + + <%-- + + --%> +
+
+ + +
+ +
+ +
+ +<%--
+ + + + + + + + + +
${info.name}${info.size}${info.resolution}${info.count}
+ +
+ + + + +
+
--%> + + + + + + + + +
+ +
+ + diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..56dc35a --- /dev/null +++ b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,67 @@ + + + + + contextConfigLocation + /WEB-INF/dispatcher-servlet.xml + + + org.springframework.web.context.ContextLoaderListener + + + dispatcher + org.springframework.web.servlet.DispatcherServlet + 1 + + + dispatcher + / + + + + search + + + + + log4jConfigLocation + /WEB-INF/log4j.properties + + + + + log4jRefreshInterval + 10000 + + + + + org.springframework.web.util.Log4jConfigListener + + + + + webAppRootKey + magnetw + + + + characterEncodingFilter + org.springframework.web.filter.CharacterEncodingFilter + + encoding + UTF-8 + + + forceEncoding + true + + + + characterEncodingFilter + /* + + diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp new file mode 100644 index 0000000..c38169b --- /dev/null +++ b/src/main/webapp/index.jsp @@ -0,0 +1,5 @@ + + +

Hello World!

+ + diff --git a/src/main/webapp/resources/css/base.css b/src/main/webapp/resources/css/base.css new file mode 100644 index 0000000..f9a9beb --- /dev/null +++ b/src/main/webapp/resources/css/base.css @@ -0,0 +1,11 @@ +.container-margin-top { + margin-top: 3%; +} + +.td-center { + text-align: center; +} + +.no-padding { + padding: 0px; +} \ No newline at end of file diff --git a/src/main/webapp/resources/css/search_result.css b/src/main/webapp/resources/css/search_result.css new file mode 100644 index 0000000..5c19207 --- /dev/null +++ b/src/main/webapp/resources/css/search_result.css @@ -0,0 +1,49 @@ +.search_form { +} + +.search_result_pager { + float: right +} + +.td-count { + width: 10%; +} + +.td-page-action { + cursor: pointer; +} + +.td-page-number { + margin-left: 10px; + margin-right: 10px; +} + +.search_site { + margin-top: 1.5%; + margin-bottom: 1.5%; +} + +#tr_load_more { + cursor: pointer; +} + +.container-margin-bottom { + margin-bottom: 1.5%; +} + +.loader div { + background-color: #D32F2F; +} + +#footer { + width: 100%; + text-align: center; + height: 60px; + bottom: 0; + background: #eeeeee; +} + +#footer-content{ + font-size: 18px; + padding-top: 20px; +} \ No newline at end of file diff --git a/src/main/webapp/resources/js/search_result.js b/src/main/webapp/resources/js/search_result.js new file mode 100644 index 0000000..0298d12 --- /dev/null +++ b/src/main/webapp/resources/js/search_result.js @@ -0,0 +1,106 @@ +var keyword = getQueryString("keyword"); +var site = getQueryString("site"); +var page = getQueryString("page"); + +$(document).ready(function () { + + $('#keyword').bind('keypress', function (event) { + if (event.keyCode == 13) { + requestSearchPage() + } + }); + + $("#btn_search").click(function () { + requestSearchPage() + }); + + $("#disclaimer").click(function () { + var content="本网站完全开源,仅用于技术交流学习,用户使用本工具进行的任何操作,本服务器均不保存。\n\n" + + "本网站不会存储,不能分享,也不提供任何传播信息与资源的功能, 对此工具的非法使用概不负责。" + alert(content) + }); + + $("input[name='site']").change(function () { + requestSearchPage() + }); + + console.log(keyword) + if (keyword != '') { + requestSearchInit(); + } +}); + +var lastRequest = null; + +function requestSearchPage() { + var from_keyword = $('#keyword').val(); + var form_site = $("input[name='site']:checked").val(); + $('#form_keyword').val(from_keyword); + $('#form_page').val(1); + $('#form_site').val(form_site); + + $('#form_search').submit(); +} + +function requestSearchInit() { + $('#table_content').find("tr[name='content']").remove(); + $('#div_loading').show(); + page = 1; + requestSearch(); +} + +function requestSearch(stopLoading) { + if (lastRequest !== null) { + lastRequest.abort(); + } + lastRequest = $.ajax({ + type: 'get', + url: 'search-json', + data: {site: site, keyword: keyword, page: page}, + dataType: 'json', + success: function (reponse) { + lastRequest = null; + if (stopLoading != undefined) { + stopLoading(); + } + $('#div_loading').hide(); + if (reponse.length > 0) { + $("#div_btn_request_page").show(); + } else { + $("#div_btn_request_page").hide(); + } + page = page + 1; + for (var i = 0; i < reponse.length; i++) { + var html = "" + + "" + reponse[i].name + "" + + "" + + reponse[i].size + "" + + "" + + reponse[i].resolution + "" + + "" + + reponse[i].count + "" + + "" + $("#tr_placeholder").before(html); + } + }, + error: function (xhr, type) { + lastRequest = null; + if (stopLoading != undefined) { + stopLoading(); + } + alert('出错了'); + } + }); +} + +function getQueryString(name) { + var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); + var r = window.location.search.substr(1).match(reg); + var context = ""; + if (r != null) + context = r[2]; + reg = null; + r = null; + var str = context == null || context == "" || context == "undefined" ? "" : context; + return decodeURI(str); +}