jtoms 4 éve
szülő
commit
8a28c654b3

+ 233 - 198
src/main/java/com/zhiqiyun/open/core/service/impl/SentimentSpiderEventServiceImpl.java

@@ -4,14 +4,18 @@ import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zhiqiyun.open.core.mapper.sentiment.SentimentSpiderEventMapper;
 import com.zhiqiyun.open.core.models.sentiment.SentimentSpiderEvent;
+import com.zhiqiyun.open.core.models.sentiment.SentimentSpiderResult;
 import com.zhiqiyun.open.core.models.sentiment.SentimentSpiderSiteRule;
 import com.zhiqiyun.open.core.service.SentimentSpiderEventService;
+import com.zhiqiyun.open.core.service.SentimentSpiderResultService;
+import com.zhiqiyun.open.utils.DateUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import us.codecraft.webmagic.*;
 import us.codecraft.webmagic.pipeline.Pipeline;
@@ -28,202 +32,233 @@ import java.util.regex.Pattern;
 @Service
 public class SentimentSpiderEventServiceImpl extends ServiceImpl<SentimentSpiderEventMapper, SentimentSpiderEvent> implements SentimentSpiderEventService {
 
-	private static final ConcurrentHashMap<Long, Spider> SPIDER_RUNNING_MAP = new ConcurrentHashMap<>();
-
-	@Override
-	public void start(SentimentSpiderEvent event) {
-
-		SentimentSpiderSiteRule rule = event.getRule();
-		if (rule == null || StringUtils.isBlank(event.getKeywords()) || StringUtils.isBlank(rule.getStartUrls())) {
-			return;
-		}
-		String[] urlArray = rule.getStartUrls().split("\n");
-
-		Spider spider = Spider.create(new SpiderEventProcessor(rule));
-
-		List<Pipeline> pipelines = new ArrayList<>();
-
-		String[] keywords = event.getKeywords().split(",");
-		pipelines.add(new SpiderEventPipeline(keywords));
-		spider.setPipelines(pipelines);
-		spider.setExitWhenComplete(true);
-		spider.addUrl(urlArray);
-		spider.runAsync();
-
-		SPIDER_RUNNING_MAP.put(event.getId(), spider);
-	}
-
-	@Override
-	public void stop(SentimentSpiderEvent event) {
-		Spider spider = SPIDER_RUNNING_MAP.get(event.getId());
-		if (spider != null && spider.getStatus().equals(Spider.Status.Running)) {
-			spider.stop();
-		}
-	}
-
-	@Override
-	public int getStatus(Long eventId) {
-		Spider spider = SPIDER_RUNNING_MAP.get(eventId);
-		if (spider == null) {
-			return 0;
-		} else if (spider.getStatus().equals(Spider.Status.Running)) {
-			return 1;
-		} else if (spider.getStatus().equals(Spider.Status.Stopped)) {
-			return 2;
-		} else {
-			return 0;
-		}
-	}
-
-	public static class SpiderEventPipeline implements Pipeline {
-
-		private final String[] keywords;
-
-		public SpiderEventPipeline(String[] keywords) {
-			this.keywords = keywords;
-		}
-
-		@Override
-		public void process(ResultItems resultItems, Task task) {
-			Map<String, Object> dataMap = resultItems.getAll();
-
-			String url = resultItems.getRequest().getUrl();
-			String id = DigestUtils.md5Hex(url.replace("http://", "").replace("https://", ""));
-
-			String title = dataMap.getOrDefault("title", "").toString();
-			String keywords = dataMap.getOrDefault("keywords", "").toString();
-			String description = dataMap.getOrDefault("description", "").toString();
-			String bodyText = dataMap.getOrDefault("bodyText", "").toString();
-			String html = dataMap.getOrDefault("html", "").toString();
-			List<String> listFragments = JSON.parseArray(dataMap.getOrDefault("listFragments", "[]").toString(), String.class);
-
-
-			boolean flag = true;
-			for (String keyword : this.keywords) {
-				if (!bodyText.contains(keyword)) {
-					flag = false;
-					break;
-				}
-			}
-
-			listFragments.removeIf(o -> {
-				boolean hasContains = false;
-				for (String keyword : this.keywords) {
-					if (o.contains(keyword)) {
-						hasContains = true;
-						break;
-					}
-				}
-				return !hasContains;
-			});
-
-			log.info("{}>>>>>>>>{}>>>>>>>>{}", flag, listFragments.size(), bodyText);
-		}
-	}
-
-	public static class SpiderEventProcessor implements PageProcessor {
-		private final List<String> LIST_SPIDER_URLS = new ArrayList<>();
-
-		private final Site site;
-
-		private final SentimentSpiderSiteRule rule;
-
-
-		public SpiderEventProcessor(SentimentSpiderSiteRule rule) {
-			this.rule = rule;
-			this.site = Site.me();
-			this.site.setUseGzip(true);
-			this.site.setRetryTimes(3);
-			this.site.setSleepTime(1000);
-		}
-
-		@Override
-		public void process(Page page) {
-			List<String> listUrls = page.getHtml().links().all();
-			listUrls.removeIf(url -> StringUtils.isBlank(url) || LIST_SPIDER_URLS.contains(url));
-
-			String urlPatterns = this.rule.getUrlPatterns();
-			if (StringUtils.isNotBlank(urlPatterns)) {
-				String[] listPatterns = urlPatterns.split("\n");
-				listUrls.removeIf(url -> {
-					boolean hasMatched = false;
-					for (String regex : listPatterns) {
-						hasMatched = Pattern.matches(regex, url);
-						if (hasMatched) {
-							break;
-						}
-					}
-					return !hasMatched;
-				});
-			}
-
-			LIST_SPIDER_URLS.addAll(listUrls);
-
-			page.addTargetRequests(listUrls);
-
-			Document document = page.getHtml().getDocument();
-
-			String title = document.title();
-			String bodyText = "";
-			String html = document.html();
-
-			String keywords = "";
-			String description = "";
-			Elements elements = document.getElementsByTag("meta");
-
-			if (elements != null && elements.size() > 0) {
-				for (Element element : elements) {
-					String metaName = element.attr("name");
-					String metaContent = element.attr("content");
-					if (StringUtils.equalsIgnoreCase("keywords", metaName)) {
-						keywords = metaContent;
-					}
-					if (StringUtils.equalsIgnoreCase("description", metaName)) {
-						description = metaContent;
-					}
-				}
-			}
-
-			Selectable selectable = page.getHtml().xpath(this.rule.getXpath());
-
-			List<String> listFragments = new ArrayList<>();
-			if (selectable.match()) {
-				document.html(selectable.get());
-				bodyText = document.text();
-
-				Elements allElements = document.children().first().children();
-				for (Element element : allElements) {
-					String text = element.text();
-					if (StringUtils.isNotBlank(text)) {
-						listFragments.add(text.trim());
-					}
-				}
-			}
-
-			if (StringUtils.isBlank(bodyText)) {
-				page.setSkip(true);
-			}
-
-
-			if (StringUtils.isBlank(description) && StringUtils.isNotBlank(bodyText)) {
-				description = bodyText.length() >= 200 ? bodyText.substring(0, 200) : bodyText;
-			}
-
-			if (StringUtils.isBlank(keywords) && StringUtils.isNotBlank(description)) {
-				keywords = description;
-			}
-
-			page.putField("title", title);
-			page.putField("bodyText", bodyText);
-			page.putField("html", html);
-			page.putField("keywords", keywords);
-			page.putField("description", description);
-			page.putField("listFragments", JSON.toJSONString(listFragments));
-		}
-
-		@Override
-		public Site getSite() {
-			return this.site;
-		}
-	}
+    private static final ConcurrentHashMap<Long, Spider> SPIDER_RUNNING_MAP = new ConcurrentHashMap<>();
+
+    @Autowired
+    private SentimentSpiderResultService sentimentSpiderResultService;
+
+
+    @Override
+    public void start(SentimentSpiderEvent event) {
+
+        SentimentSpiderSiteRule rule = event.getRule();
+        if (rule == null || StringUtils.isBlank(event.getKeywords()) || StringUtils.isBlank(rule.getStartUrls())) {
+            return;
+        }
+        String[] urlArray = rule.getStartUrls().split("\n");
+
+        Spider spider = Spider.create(new SpiderEventProcessor(rule));
+
+        List<Pipeline> pipelines = new ArrayList<>();
+
+        String[] keywords = event.getKeywords().split(",");
+        pipelines.add(new SpiderEventPipeline(keywords, event.getId(), event.getSiteRuleId(), this.sentimentSpiderResultService));
+        spider.setPipelines(pipelines);
+        spider.setExitWhenComplete(true);
+        spider.addUrl(urlArray);
+        spider.runAsync();
+
+        SPIDER_RUNNING_MAP.put(event.getId(), spider);
+    }
+
+    @Override
+    public void stop(SentimentSpiderEvent event) {
+        Spider spider = SPIDER_RUNNING_MAP.get(event.getId());
+        if (spider != null && spider.getStatus().equals(Spider.Status.Running)) {
+            spider.stop();
+        }
+    }
+
+    @Override
+    public int getStatus(Long eventId) {
+        Spider spider = SPIDER_RUNNING_MAP.get(eventId);
+        if (spider == null) {
+            return 0;
+        } else if (spider.getStatus().equals(Spider.Status.Running)) {
+            return 1;
+        } else if (spider.getStatus().equals(Spider.Status.Stopped)) {
+            return 2;
+        } else {
+            return 0;
+        }
+    }
+
+    public static class SpiderEventPipeline implements Pipeline {
+
+        private final String[] keywords;
+        private final Long eventId;
+        private final Long siteRuleId;
+
+        private final SentimentSpiderResultService sentimentSpiderResultService;
+
+        public SpiderEventPipeline(String[] keywords, Long eventId, Long siteRuleId, SentimentSpiderResultService sentimentSpiderResultService) {
+            this.sentimentSpiderResultService = sentimentSpiderResultService;
+            this.keywords = keywords;
+            this.eventId = eventId;
+            this.siteRuleId = siteRuleId;
+        }
+
+        @Override
+        public void process(ResultItems resultItems, Task task) {
+            Map<String, Object> dataMap = resultItems.getAll();
+
+            String url = resultItems.getRequest().getUrl();
+            String id = DigestUtils.md5Hex(url.replace("http://", "").replace("https://", ""));
+
+            String title = dataMap.getOrDefault("title", "").toString();
+            String keywords = dataMap.getOrDefault("keywords", "").toString();
+            String description = dataMap.getOrDefault("description", "").toString();
+            String bodyText = dataMap.getOrDefault("bodyText", "").toString();
+            String html = dataMap.getOrDefault("html", "").toString();
+            List<String> listFragments = JSON.parseArray(dataMap.getOrDefault("listFragments", "[]").toString(), String.class);
+
+
+            boolean flag = true;
+            for (String keyword : this.keywords) {
+                if (!bodyText.contains(keyword)) {
+                    flag = false;
+                    break;
+                }
+            }
+
+
+            List<String> fragments = new ArrayList<>();
+            for (String s : listFragments) {
+                boolean isContains = false;
+                for (String keyword : this.keywords) {
+                    if (s.contains(keyword)) {
+                        isContains = true;
+                        s = s.replace(keyword, "<em>" + keyword + "</em>");
+                    }
+                }
+                if (isContains) {
+                    fragments.add(s);
+                }
+            }
+
+            log.info("{}>>>>>>>>{}>>>>>>>>{}", flag, listFragments.size(), bodyText);
+            if (flag) {
+                SentimentSpiderResult result = new SentimentSpiderResult();
+                result.setId(id);
+                result.setEventId(eventId);
+                result.setSiteRuleId(siteRuleId);
+                result.setUrl(url);
+                result.setTitle(title);
+                result.setKeywords(keywords);
+                result.setDescription(description);
+                result.setFragments(fragments);
+                result.setBodyText(bodyText);
+                result.setHtml(html);
+                result.setSpiderTime(DateUtil.current());
+                result.setUpdateTime(DateUtil.current());
+                this.sentimentSpiderResultService.saveOrUpdate(result);
+            }
+        }
+    }
+
+    public static class SpiderEventProcessor implements PageProcessor {
+        private final List<String> LIST_SPIDER_URLS = new ArrayList<>();
+
+        private final Site site;
+
+        private final SentimentSpiderSiteRule rule;
+
+
+        public SpiderEventProcessor(SentimentSpiderSiteRule rule) {
+            this.rule = rule;
+            this.site = Site.me();
+            this.site.setUseGzip(true);
+            this.site.setRetryTimes(3);
+            this.site.setSleepTime(1000);
+        }
+
+        @Override
+        public void process(Page page) {
+            List<String> listUrls = page.getHtml().links().all();
+            listUrls.removeIf(url -> StringUtils.isBlank(url) || LIST_SPIDER_URLS.contains(url));
+
+            String urlPatterns = this.rule.getUrlPatterns();
+            if (StringUtils.isNotBlank(urlPatterns)) {
+                String[] listPatterns = urlPatterns.split("\n");
+                listUrls.removeIf(url -> {
+                    boolean hasMatched = false;
+                    for (String regex : listPatterns) {
+                        hasMatched = Pattern.matches(regex, url);
+                        if (hasMatched) {
+                            break;
+                        }
+                    }
+                    return !hasMatched;
+                });
+            }
+
+            LIST_SPIDER_URLS.addAll(listUrls);
+
+            page.addTargetRequests(listUrls);
+
+            Document document = page.getHtml().getDocument();
+
+            String title = document.title();
+            String bodyText = "";
+            String html = document.html();
+
+            String keywords = "";
+            String description = "";
+            Elements elements = document.getElementsByTag("meta");
+
+            if (elements != null && elements.size() > 0) {
+                for (Element element : elements) {
+                    String metaName = element.attr("name");
+                    String metaContent = element.attr("content");
+                    if (StringUtils.equalsIgnoreCase("keywords", metaName)) {
+                        keywords = metaContent;
+                    }
+                    if (StringUtils.equalsIgnoreCase("description", metaName)) {
+                        description = metaContent;
+                    }
+                }
+            }
+
+            Selectable selectable = page.getHtml().xpath(this.rule.getXpath());
+
+            List<String> listFragments = new ArrayList<>();
+            if (selectable.match()) {
+                document.html(selectable.get());
+                bodyText = document.text();
+
+                Elements allElements = document.children().first().children();
+                for (Element element : allElements) {
+                    String text = element.text();
+                    if (StringUtils.isNotBlank(text)) {
+                        listFragments.add(text.trim());
+                    }
+                }
+            }
+
+            if (StringUtils.isBlank(bodyText)) {
+                page.setSkip(true);
+            }
+
+
+            if (StringUtils.isBlank(description) && StringUtils.isNotBlank(bodyText)) {
+                description = bodyText.length() >= 200 ? bodyText.substring(0, 200) : bodyText;
+            }
+
+            if (StringUtils.isBlank(keywords) && StringUtils.isNotBlank(description)) {
+                keywords = description;
+            }
+
+            page.putField("title", title);
+            page.putField("bodyText", bodyText);
+            page.putField("html", html);
+            page.putField("keywords", keywords);
+            page.putField("description", description);
+            page.putField("listFragments", JSON.toJSONString(listFragments));
+        }
+
+        @Override
+        public Site getSite() {
+            return this.site;
+        }
+    }
 }

+ 226 - 186
src/main/java/com/zhiqiyun/open/mvc/controller/SentimentSpiderController.java

@@ -4,21 +4,13 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.OrderItem;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zhiqiyun.open.annotation.Permission;
-import com.zhiqiyun.open.core.models.place.PlaceBaseInfo;
-import com.zhiqiyun.open.core.models.place.PlaceCategory;
 import com.zhiqiyun.open.core.models.sentiment.SentimentSpiderEvent;
+import com.zhiqiyun.open.core.models.sentiment.SentimentSpiderResult;
 import com.zhiqiyun.open.core.models.sentiment.SentimentSpiderSiteRule;
-import com.zhiqiyun.open.core.models.statistics.PopularFeelings;
 import com.zhiqiyun.open.core.models.user.OauthInfo;
-import com.zhiqiyun.open.core.service.OauthService;
-import com.zhiqiyun.open.core.service.SentimentSpiderEventService;
-import com.zhiqiyun.open.core.service.SentimentSpiderRuleService;
-import com.zhiqiyun.open.core.service.SequenceService;
+import com.zhiqiyun.open.core.service.*;
 import com.zhiqiyun.open.mvc.Result;
-import com.zhiqiyun.open.mvc.params.sentiment.QuerySpiderEventParam;
-import com.zhiqiyun.open.mvc.params.sentiment.QuerySpiderSiteRuleParam;
-import com.zhiqiyun.open.mvc.params.sentiment.SaveSpiderEventParam;
-import com.zhiqiyun.open.mvc.params.sentiment.SaveSpiderSiteRuleParam;
+import com.zhiqiyun.open.mvc.params.sentiment.*;
 import com.zhiqiyun.open.utils.DateUtil;
 import com.zhiqiyun.open.utils.ServletContext;
 import lombok.extern.slf4j.Slf4j;
@@ -35,189 +27,237 @@ import java.util.List;
 @RequestMapping("/sentiment/spider")
 public class SentimentSpiderController {
 
-	@Autowired
-	private SentimentSpiderEventService sentimentSpiderEventService;
-
-	@Autowired
-	private SentimentSpiderRuleService sentimentSpiderRuleService;
+    @Autowired
+    private SentimentSpiderEventService sentimentSpiderEventService;
 
-	@Autowired
-	private OauthService oauthService;
+    @Autowired
+    private SentimentSpiderRuleService sentimentSpiderRuleService;
 
-	@Autowired
-	private SequenceService sequenceService;
-
-	@Permission(value = "sentiment.spider.rule.find", tags = "查询采集网站规则")
-	@PostMapping("/rule/findPage")
-	public Result findRulePage(@RequestBody QuerySpiderSiteRuleParam param) {
-		QueryWrapper<SentimentSpiderSiteRule> wrapper = new QueryWrapper<>();
-		if (StringUtils.isNotBlank(param.getSiteName())) {
-			wrapper.like("site_name", param.getSiteName());
-		}
-
-		Page<SentimentSpiderSiteRule> page = param.getPage();
-		page.addOrder(OrderItem.desc("id"));
-
-		Page<SentimentSpiderSiteRule> resultData = this.sentimentSpiderRuleService.page(page, wrapper);
+    @Autowired
+    private SentimentSpiderResultService sentimentSpiderResultService;
 
-		return Result.instance(Result.Code.SUCCESS).setData(resultData);
-	}
+    @Autowired
+    private OauthService oauthService;
 
-	@ResponseBody
-	@Permission(tags = "通过关键词查询采集网站规则", writeLog = false)
-	@PostMapping("/rule/findSelectByKeyword")
-	public Result findSelectByKeyword(String keyword) {
-		QueryWrapper<SentimentSpiderSiteRule> queryWrapper = new QueryWrapper<>();
+    @Autowired
+    private SequenceService sequenceService;
 
-		if (StringUtils.isNotBlank(keyword)) {
-			queryWrapper.like("site_name", keyword);
-			queryWrapper.or();
-			queryWrapper.like("id", keyword);
-		}
-		queryWrapper.last("limit 10");
-		queryWrapper.orderByDesc("id");
+    @Permission(value = "sentiment.spider.rule.find", tags = "查询采集网站规则")
+    @PostMapping("/rule/findPage")
+    public Result findRulePage(@RequestBody QuerySpiderSiteRuleParam param) {
+        QueryWrapper<SentimentSpiderSiteRule> wrapper = new QueryWrapper<>();
+        if (StringUtils.isNotBlank(param.getSiteName())) {
+            wrapper.like("site_name", param.getSiteName());
+        }
+
+        Page<SentimentSpiderSiteRule> page = param.getPage();
+        page.addOrder(OrderItem.desc("id"));
+
+        Page<SentimentSpiderSiteRule> resultData = this.sentimentSpiderRuleService.page(page, wrapper);
+
+        return Result.instance(Result.Code.SUCCESS).setData(resultData);
+    }
+
+    @ResponseBody
+    @Permission(tags = "通过关键词查询采集网站规则", writeLog = false)
+    @PostMapping("/rule/findSelectByKeyword")
+    public Result findSelectRuleByKeyword(String keyword) {
+        QueryWrapper<SentimentSpiderSiteRule> queryWrapper = new QueryWrapper<>();
+
+        if (StringUtils.isNotBlank(keyword)) {
+            queryWrapper.like("site_name", keyword);
+            queryWrapper.or();
+            queryWrapper.like("id", keyword);
+        }
+        queryWrapper.last("limit 10");
+        queryWrapper.orderByDesc("id");
+
+        List<SentimentSpiderSiteRule> listData = this.sentimentSpiderRuleService.list(queryWrapper);
+        return Result.instance(Result.Code.SUCCESS).setData(listData);
+    }
+
+    @ResponseBody
+    @Permission(tags = "通过关键词查询事件规则", writeLog = false)
+    @PostMapping("/event/findSelectByKeyword")
+    public Result findSelectEventByKeyword(String keyword) {
+        QueryWrapper<SentimentSpiderEvent> queryWrapper = new QueryWrapper<>();
+
+        if (StringUtils.isNotBlank(keyword)) {
+            queryWrapper.like("event_title", keyword);
+            queryWrapper.or();
+            queryWrapper.like("keywords", keyword);
+            queryWrapper.or();
+            queryWrapper.like("id", keyword);
+        }
+        queryWrapper.last("limit 10");
+        queryWrapper.orderByDesc("id");
+
+        List<SentimentSpiderEvent> listData = this.sentimentSpiderEventService.list(queryWrapper);
+        return Result.instance(Result.Code.SUCCESS).setData(listData);
+    }
+
+    @Permission(value = "sentiment.spider.rule.add", tags = "添加采集网站规则")
+    @PostMapping("/rule/save")
+    public Result saveRule(@Valid @RequestBody SaveSpiderSiteRuleParam param) {
+
+        SentimentSpiderSiteRule entity = new SentimentSpiderSiteRule();
+        BeanUtils.copyProperties(param, entity);
 
-		List<SentimentSpiderSiteRule> listData = this.sentimentSpiderRuleService.list(queryWrapper);
-		return Result.instance(Result.Code.SUCCESS).setData(listData);
-	}
+        OauthInfo oauthInfo = this.oauthService.getAuth(ServletContext.getAccessToken());
 
-	@Permission(value = "sentiment.spider.rule.add", tags = "添加采集网站规则")
-	@PostMapping("/rule/save")
-	public Result saveRule(@Valid @RequestBody SaveSpiderSiteRuleParam param) {
+        entity.setCreatedTime(DateUtil.current());
+        entity.setCreatedBy(oauthInfo.getId());
 
-		SentimentSpiderSiteRule entity = new SentimentSpiderSiteRule();
-		BeanUtils.copyProperties(param, entity);
+        entity.setUpdatedTime(DateUtil.current());
+        entity.setUpdatedBy(oauthInfo.getId());
+        entity.setId(this.sequenceService.nextId());
+
+        this.sentimentSpiderRuleService.save(entity);
 
-		OauthInfo oauthInfo = this.oauthService.getAuth(ServletContext.getAccessToken());
+        return Result.instance(Result.Code.MESSAGE_SUCCESS);
+    }
 
-		entity.setCreatedTime(DateUtil.current());
-		entity.setCreatedBy(oauthInfo.getId());
-
-		entity.setUpdatedTime(DateUtil.current());
-		entity.setUpdatedBy(oauthInfo.getId());
-		entity.setId(this.sequenceService.nextId());
-
-		this.sentimentSpiderRuleService.save(entity);
-
-		return Result.instance(Result.Code.MESSAGE_SUCCESS);
-	}
-
-	@Permission(value = "sentiment.spider.rule.edit", tags = "修改采集网站规则")
-	@PostMapping("/rule/updateById")
-	public Result updateRuleById(Long id, @Valid @RequestBody SaveSpiderSiteRuleParam param) {
-		SentimentSpiderSiteRule entity = new SentimentSpiderSiteRule();
-		BeanUtils.copyProperties(param, entity);
-
-		OauthInfo oauthInfo = this.oauthService.getAuth(ServletContext.getAccessToken());
-
-		entity.setUpdatedBy(oauthInfo.getId());
-		entity.setUpdatedTime(DateUtil.current());
-		entity.setId(id);
-
-		this.sentimentSpiderRuleService.updateById(entity);
-
-		return Result.instance(Result.Code.MESSAGE_SUCCESS);
-	}
-
-	@Permission(value = "sentiment.spider.rule.delete", tags = "采集网站规则删除")
-	@PostMapping("/rule/deleteByIds")
-	public Result deleteRuleByIds(@RequestBody List<Long> ids) {
-		this.sentimentSpiderRuleService.removeByIds(ids);
-		return Result.instance(Result.Code.MESSAGE_SUCCESS);
-	}
-
-	@Permission(value = "sentiment.spider.event.find", tags = "查询舆情事件")
-	@PostMapping("/event/findPage")
-	public Result findEventPage(@RequestBody QuerySpiderEventParam param) {
-		QueryWrapper<SentimentSpiderEvent> wrapper = new QueryWrapper<>();
-		if (param.getSiteRuleId() != null) {
-			wrapper.eq("site_rule_id", param.getSiteRuleId());
-		}
-		if (StringUtils.isNotBlank(param.getEventTitle())) {
-			wrapper.like("event_title", param.getEventTitle());
-		}
-		if (StringUtils.isNotBlank(param.getKeywords())) {
-			wrapper.like("keywords", param.getKeywords());
-		}
-
-		Page<SentimentSpiderEvent> page = param.getPage();
-		page.addOrder(OrderItem.desc("id"));
-
-		Page<SentimentSpiderEvent> resultData = this.sentimentSpiderEventService.page(page, wrapper);
-		for (SentimentSpiderEvent event : resultData.getRecords()) {
-			SentimentSpiderSiteRule rule = this.sentimentSpiderRuleService.getById(event.getSiteRuleId());
-			event.setRule(rule);
-			event.setStatus(this.sentimentSpiderEventService.getStatus(event.getId()));
-		}
-
-		return Result.instance(Result.Code.SUCCESS).setData(resultData);
-	}
-
-	@Permission(value = "sentiment.spider.event.add", tags = "添加舆情事件")
-	@PostMapping("/event/save")
-	public Result saveEvent(@Valid @RequestBody SaveSpiderEventParam param) throws Exception {
-
-		SentimentSpiderEvent entity = new SentimentSpiderEvent();
-		BeanUtils.copyProperties(param, entity);
-
-		OauthInfo oauthInfo = this.oauthService.getAuth(ServletContext.getAccessToken());
-
-		entity.setCreatedTime(DateUtil.current());
-		entity.setCreatedBy(oauthInfo.getId());
-
-		entity.setUpdatedTime(DateUtil.current());
-		entity.setUpdatedBy(oauthInfo.getId());
-		entity.setId(this.sequenceService.nextId());
-
-		this.sentimentSpiderEventService.save(entity);
-
-		return Result.instance(Result.Code.MESSAGE_SUCCESS);
-	}
-
-	@Permission(value = "sentiment.spider.event.edit", tags = "修改舆情事件")
-	@PostMapping("/event/updateById")
-	public Result updateRuleById(Long id, @Valid @RequestBody SaveSpiderEventParam param) {
-		SentimentSpiderEvent entity = new SentimentSpiderEvent();
-		BeanUtils.copyProperties(param, entity);
-
-		OauthInfo oauthInfo = this.oauthService.getAuth(ServletContext.getAccessToken());
-
-		entity.setUpdatedBy(oauthInfo.getId());
-		entity.setUpdatedTime(DateUtil.current());
-		entity.setId(id);
-
-		this.sentimentSpiderEventService.updateById(entity);
-
-		return Result.instance(Result.Code.MESSAGE_SUCCESS);
-	}
-
-	@Permission(value = "sentiment.spider.event.delete", tags = "删除舆情事件")
-	@PostMapping("/event/deleteByIds")
-	public Result deleteEventByIds(@RequestBody List<Long> ids) {
-		this.sentimentSpiderEventService.removeByIds(ids);
-		return Result.instance(Result.Code.MESSAGE_SUCCESS);
-	}
-
-
-	@Permission(value = "sentiment.spider.event.start", tags = "启动舆情事件监控")
-	@PostMapping("/event/startSpider")
-	public Result startSpider(@RequestBody List<Long> ids) {
-		List<SentimentSpiderEvent> listData = this.sentimentSpiderEventService.listByIds(ids);
-		for (SentimentSpiderEvent event : listData) {
-			SentimentSpiderSiteRule rule = this.sentimentSpiderRuleService.getById(event.getSiteRuleId());
-			event.setRule(rule);
-			this.sentimentSpiderEventService.start(event);
-		}
-		return Result.instance(Result.Code.MESSAGE_SUCCESS);
-	}
-
-	@Permission(value = "sentiment.spider.event.stop", tags = "停止舆情事件监控")
-	@PostMapping("/event/stopSpider")
-	public Result stopSpider(@RequestBody List<Long> ids) {
-		List<SentimentSpiderEvent> listData = this.sentimentSpiderEventService.listByIds(ids);
-		for (SentimentSpiderEvent event : listData) {
-			this.sentimentSpiderEventService.stop(event);
-		}
-		return Result.instance(Result.Code.MESSAGE_SUCCESS);
-	}
+    @Permission(value = "sentiment.spider.rule.edit", tags = "修改采集网站规则")
+    @PostMapping("/rule/updateById")
+    public Result updateRuleById(Long id, @Valid @RequestBody SaveSpiderSiteRuleParam param) {
+        SentimentSpiderSiteRule entity = new SentimentSpiderSiteRule();
+        BeanUtils.copyProperties(param, entity);
+
+        OauthInfo oauthInfo = this.oauthService.getAuth(ServletContext.getAccessToken());
+
+        entity.setUpdatedBy(oauthInfo.getId());
+        entity.setUpdatedTime(DateUtil.current());
+        entity.setId(id);
+
+        this.sentimentSpiderRuleService.updateById(entity);
+
+        return Result.instance(Result.Code.MESSAGE_SUCCESS);
+    }
+
+    @Permission(value = "sentiment.spider.rule.delete", tags = "采集网站规则删除")
+    @PostMapping("/rule/deleteByIds")
+    public Result deleteRuleByIds(@RequestBody List<Long> ids) {
+        this.sentimentSpiderRuleService.removeByIds(ids);
+        return Result.instance(Result.Code.MESSAGE_SUCCESS);
+    }
+
+    @Permission(value = "sentiment.spider.event.find", tags = "查询舆情事件")
+    @PostMapping("/event/findPage")
+    public Result findEventPage(@RequestBody QuerySpiderEventParam param) {
+        QueryWrapper<SentimentSpiderEvent> wrapper = new QueryWrapper<>();
+        if (param.getSiteRuleId() != null) {
+            wrapper.eq("site_rule_id", param.getSiteRuleId());
+        }
+        if (StringUtils.isNotBlank(param.getEventTitle())) {
+            wrapper.like("event_title", param.getEventTitle());
+        }
+        if (StringUtils.isNotBlank(param.getKeywords())) {
+            wrapper.like("keywords", param.getKeywords());
+        }
+
+        Page<SentimentSpiderEvent> page = param.getPage();
+        page.addOrder(OrderItem.desc("id"));
+
+        Page<SentimentSpiderEvent> resultData = this.sentimentSpiderEventService.page(page, wrapper);
+        for (SentimentSpiderEvent event : resultData.getRecords()) {
+            SentimentSpiderSiteRule rule = this.sentimentSpiderRuleService.getById(event.getSiteRuleId());
+            event.setRule(rule);
+            event.setStatus(this.sentimentSpiderEventService.getStatus(event.getId()));
+        }
+
+        return Result.instance(Result.Code.SUCCESS).setData(resultData);
+    }
+
+    @Permission(value = "sentiment.spider.event.add", tags = "添加舆情事件")
+    @PostMapping("/event/save")
+    public Result saveEvent(@Valid @RequestBody SaveSpiderEventParam param) throws Exception {
+
+        SentimentSpiderEvent entity = new SentimentSpiderEvent();
+        BeanUtils.copyProperties(param, entity);
+
+        OauthInfo oauthInfo = this.oauthService.getAuth(ServletContext.getAccessToken());
+
+        entity.setCreatedTime(DateUtil.current());
+        entity.setCreatedBy(oauthInfo.getId());
+
+        entity.setUpdatedTime(DateUtil.current());
+        entity.setUpdatedBy(oauthInfo.getId());
+        entity.setId(this.sequenceService.nextId());
+
+        this.sentimentSpiderEventService.save(entity);
+
+        return Result.instance(Result.Code.MESSAGE_SUCCESS);
+    }
+
+    @Permission(value = "sentiment.spider.event.edit", tags = "修改舆情事件")
+    @PostMapping("/event/updateById")
+    public Result updateEventById(Long id, @Valid @RequestBody SaveSpiderEventParam param) {
+        SentimentSpiderEvent entity = new SentimentSpiderEvent();
+        BeanUtils.copyProperties(param, entity);
+
+        OauthInfo oauthInfo = this.oauthService.getAuth(ServletContext.getAccessToken());
+
+        entity.setUpdatedBy(oauthInfo.getId());
+        entity.setUpdatedTime(DateUtil.current());
+        entity.setId(id);
+
+        this.sentimentSpiderEventService.updateById(entity);
+
+        return Result.instance(Result.Code.MESSAGE_SUCCESS);
+    }
+
+    @Permission(value = "sentiment.spider.event.delete", tags = "删除舆情事件")
+    @PostMapping("/event/deleteByIds")
+    public Result deleteEventByIds(@RequestBody List<Long> ids) {
+        this.sentimentSpiderEventService.removeByIds(ids);
+        return Result.instance(Result.Code.MESSAGE_SUCCESS);
+    }
+
+
+    @Permission(value = "sentiment.spider.event.start", tags = "启动舆情事件监控")
+    @PostMapping("/event/startSpider")
+    public Result startSpider(@RequestBody List<Long> ids) {
+        List<SentimentSpiderEvent> listData = this.sentimentSpiderEventService.listByIds(ids);
+        for (SentimentSpiderEvent event : listData) {
+            SentimentSpiderSiteRule rule = this.sentimentSpiderRuleService.getById(event.getSiteRuleId());
+            event.setRule(rule);
+            this.sentimentSpiderEventService.start(event);
+        }
+        return Result.instance(Result.Code.MESSAGE_SUCCESS);
+    }
+
+    @Permission(value = "sentiment.spider.event.stop", tags = "停止舆情事件监控")
+    @PostMapping("/event/stopSpider")
+    public Result stopSpider(@RequestBody List<Long> ids) {
+        List<SentimentSpiderEvent> listData = this.sentimentSpiderEventService.listByIds(ids);
+        for (SentimentSpiderEvent event : listData) {
+            this.sentimentSpiderEventService.stop(event);
+        }
+        return Result.instance(Result.Code.MESSAGE_SUCCESS);
+    }
+
+
+    @Permission(value = "sentiment.spider.event.find", tags = "查询采集结果")
+    @PostMapping("/result/findPage")
+    public Result findResultPage(@RequestBody QuerySpiderResultParam param) {
+        QueryWrapper<SentimentSpiderResult> wrapper = new QueryWrapper<>();
+        if (param.getEventId() != null) {
+            wrapper.eq("event_id", param.getEventId());
+        }
+        if (param.getSiteRuleId() != null) {
+            wrapper.eq("site_rule_id", param.getSiteRuleId());
+        }
+        if (StringUtils.isNotBlank(param.getTitle())) {
+            wrapper.like("title", param.getTitle());
+        }
+
+        wrapper.select("id", "event_id", "site_rule_id", "url", "title", "keywords", "description", "fragments", "spider_time", "update_time");
+
+        Page<SentimentSpiderResult> page = param.getPage();
+        page.addOrder(OrderItem.desc("update_time"));
+
+        Page<SentimentSpiderResult> resultData = this.sentimentSpiderResultService.page(page, wrapper);
+
+        return Result.instance(Result.Code.SUCCESS).setData(resultData);
+    }
 }

+ 13 - 0
src/main/java/com/zhiqiyun/open/mvc/params/sentiment/QuerySpiderResultParam.java

@@ -0,0 +1,13 @@
+package com.zhiqiyun.open.mvc.params.sentiment;
+
+import com.zhiqiyun.open.mvc.params.QueryPageParams;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class QuerySpiderResultParam extends QueryPageParams {
+    private Long eventId;
+    private Long siteRuleId;
+    private String title;
+}

+ 23 - 24
src/main/resources/db/migration/V1.1.2__sentiment_spider.sql

@@ -1,5 +1,5 @@
 REPLACE
-INTO `authority_info` (`id`, `parent_id`, `name`, `remark`)
+    INTO `authority_info` (`id`, `parent_id`, `name`, `remark`)
 VALUES (2300, 0, 'sentiment.spider', '舆情监控管理'),
        (2301, 2300, 'sentiment.spider.event.find', '舆情事件查询'),
        (2302, 2300, 'sentiment.spider.event.add', '舆情事件添加'),
@@ -7,40 +7,39 @@ VALUES (2300, 0, 'sentiment.spider', '舆情监控管理'),
        (2304, 2300, 'sentiment.spider.event.delete', '舆情事件删除'),
        (2305, 2300, 'sentiment.spider.event.start', '启动事件采集'),
        (2306, 2300, 'sentiment.spider.event.stop', '停止事件采集'),
-       (2307, 2300, 'sentiment.spider.result.find', '采集结果查询'),
-       (2308, 2300, 'sentiment.spider.rule.find', '采集网站规则查询'),
-       (2309, 2300, 'sentiment.spider.rule.add', '采集网站规则添加'),
-       (2310, 2300, 'sentiment.spider.rule.edit', '采集网站规则修改'),
-       (2311, 2300, 'sentiment.spider.rule.delete', '采集网站规则删除');
+       (2307, 2300, 'sentiment.spider.rule.find', '采集网站规则查询'),
+       (2308, 2300, 'sentiment.spider.rule.add', '采集网站规则添加'),
+       (2309, 2300, 'sentiment.spider.rule.edit', '采集网站规则修改'),
+       (2310, 2300, 'sentiment.spider.rule.delete', '采集网站规则删除');
 
 
 DROP TABLE IF EXISTS `sentiment_spider_site_rule`;
 CREATE TABLE `sentiment_spider_site_rule`
 (
-    `id`           BIGINT(20) NOT NULL COMMENT 'ID',
-    `site_name`    VARCHAR(50) NOT NULL COMMENT '网站名称',
-    `url_patterns` text        NOT NULL COMMENT '匹配URL地址',
-    `start_urls`   text        NOT NULL COMMENT '启动地址',
+    `id`           BIGINT(20)   NOT NULL COMMENT 'ID',
+    `site_name`    VARCHAR(50)  NOT NULL COMMENT '网站名称',
+    `url_patterns` text         NOT NULL COMMENT '匹配URL地址',
+    `start_urls`   text         NOT NULL COMMENT '启动地址',
     `xpath`        VARCHAR(200) NOT NULL COMMENT '提取内容的xpath',
-    `created_time` DATETIME    NOT NULL COMMENT '创建时间',
-    `created_by`   BIGINT(20) NOT NULL COMMENT '创建人',
-    `updated_time` DATETIME NULL DEFAULT NULL COMMENT '修改时间',
-    `updated_by`   BIGINT(20) NULL DEFAULT NULL COMMENT '修改人',
+    `created_time` DATETIME     NOT NULL COMMENT '创建时间',
+    `created_by`   BIGINT(20)   NOT NULL COMMENT '创建人',
+    `updated_time` DATETIME     NULL DEFAULT NULL COMMENT '修改时间',
+    `updated_by`   BIGINT(20)   NULL DEFAULT NULL COMMENT '修改人',
     PRIMARY KEY (`id`)
 ) COMMENT ='采集网站规则' ENGINE = InnoDB;
 
 DROP TABLE IF EXISTS `sentiment_spider_event`;
 CREATE TABLE `sentiment_spider_event`
 (
-    `id`           BIGINT(20) NOT NULL COMMENT 'ID',
-    `site_rule_id` BIGINT(20) NOT NULL COMMENT '采集站点ID',
+    `id`           BIGINT(20)   NOT NULL COMMENT 'ID',
+    `site_rule_id` BIGINT(20)   NOT NULL COMMENT '采集站点ID',
     `event_title`  VARCHAR(500) NOT NULL COMMENT '事件名称',
     `keywords`     VARCHAR(500) NOT NULL COMMENT '匹配关键词',
     `created_time` DATETIME     NOT NULL COMMENT '创建时间',
-    `created_by`   BIGINT(20) NOT NULL COMMENT '创建人',
-    `updated_time` DATETIME NULL DEFAULT NULL COMMENT '修改时间',
-    `updated_by`   BIGINT(20) NULL DEFAULT NULL COMMENT '修改人',
-    KEY            `site_rule_id_index` (`site_rule_id`),
+    `created_by`   BIGINT(20)   NOT NULL COMMENT '创建人',
+    `updated_time` DATETIME     NULL DEFAULT NULL COMMENT '修改时间',
+    `updated_by`   BIGINT(20)   NULL DEFAULT NULL COMMENT '修改人',
+    KEY `site_rule_id_index` (`site_rule_id`),
     PRIMARY KEY (`id`)
 ) COMMENT ='舆情事件' ENGINE = InnoDB;
 
@@ -48,8 +47,8 @@ DROP TABLE IF EXISTS `sentiment_spider_result`;
 CREATE TABLE `sentiment_spider_result`
 (
     `id`           VARCHAR(50)  NOT NULL COMMENT 'ID',
-    `event_id`     BIGINT(20) NOT NULL COMMENT '舆情事件ID',
-    `site_rule_id` BIGINT(20) NOT NULL COMMENT '网站规则ID',
+    `event_id`     BIGINT(20)   NOT NULL COMMENT '舆情事件ID',
+    `site_rule_id` BIGINT(20)   NOT NULL COMMENT '网站规则ID',
     `url`          VARCHAR(500) NOT NULL COMMENT 'URL地址',
     `title`        VARCHAR(500) NOT NULL COMMENT '标题',
     `keywords`     VARCHAR(500) NOT NULL COMMENT '关键词',
@@ -59,7 +58,7 @@ CREATE TABLE `sentiment_spider_result`
     `html`         LONGTEXT     NOT NULL COMMENT '全文本HTML',
     `spider_time`  DATETIME     NOT NULL COMMENT '采集时间',
     `update_time`  DATETIME     NOT NULL COMMENT '更新采集时间',
-    KEY            `event_id_index` (`event_id`),
-    KEY            `site_rule_id_index` (`site_rule_id`),
+    KEY `event_id_index` (`event_id`),
+    KEY `site_rule_id_index` (`site_rule_id`),
     PRIMARY KEY (`id`)
 ) COMMENT ='舆情采集结果' ENGINE = InnoDB;