主页完善

pull/254/head
xjs 3 years ago
parent 51a6773135
commit 0a527e83a9

@ -2,10 +2,13 @@ package com.xjs.business.webmagic;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.xjs.business.webmagic.domain.CopyWritingNetworkDTO;
import com.xjs.business.webmagic.factory.RemoteWebmagicCopyWritingNetworkFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import java.util.List;
/**
*
*
@ -19,4 +22,7 @@ public interface RemoteWebmagicCopyWritingNetworkFeign {
@GetMapping("copyWritingNetwork/taskForPRC")
R copyWritingNetworkTaskForPRC();
@GetMapping("copyWritingNetwork/showCopyWriting")
public R<List<CopyWritingNetworkDTO>> showCopyWriting();
}

@ -0,0 +1,31 @@
package com.xjs.business.webmagic.domain;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* DTO
* @author xiejs
* @since 2022-02-16
*/
@Data
public class CopyWritingNetworkDTO implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
/** 文案标签 */
private String type;
/** 文案主题 */
private String theme;
/** 文案内容 */
private String content;
/** 创建时间 */
private Date createTime;
}

@ -2,10 +2,13 @@ package com.xjs.business.webmagic.factory;
import com.ruoyi.common.core.domain.R;
import com.xjs.business.webmagic.RemoteWebmagicCopyWritingNetworkFeign;
import com.xjs.business.webmagic.domain.CopyWritingNetworkDTO;
import lombok.extern.log4j.Log4j2;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
import java.util.List;
/**
*
* @author xiejs
@ -22,6 +25,12 @@ public class RemoteWebmagicCopyWritingNetworkFactory implements FallbackFactory<
log.error("文案网 爬虫定时任务 降级------服务可能正在运行");
return R.fail("降级处理------服务可能正在运行");
}
@Override
public R<List<CopyWritingNetworkDTO>> showCopyWriting() {
log.error("文案网 展示文案数据 降级------服务可能正在运行");
return R.fail("降级处理------服务可能正在运行");
}
};
}
}

@ -2,4 +2,18 @@
import request from '@/utils/request'
export function showWbSearch() {
return request({
url: '/openapi/index/showWbSearch',
method: 'get'
})
}
export function showCopyWriting() {
return request({
url: '/openapi/index/showCopyWriting',
method: 'get'
})
}

@ -0,0 +1,238 @@
<template>
<div>
<el-row :gutter="20">
<el-col :span="12">
<div>
<el-card shadow="hover" class="card" ref="renderersChart">
</el-card>
</div>
</el-col>
<el-col :span="12">
<div>
<el-card shadow="hover" class="card">
<!--logo -->
<div style="width: 500px;margin: 0 auto;margin-top: 20px">
<el-image
style="width: 272px; height: 72px;margin-left: 120px"
:src="baiduLogo"
></el-image>
</div>
<!--输入框 -->
<div style="margin-top: 30px">
<el-autocomplete
style="width: 92%"
v-model="searchContent"
@input="getAssociation()"
@keydown.enter.n.native="toRescue"
clearable
@select="handleSelect"
:fetch-suggestions="querySearchAsync"
placeholder="请输入你想要搜索的内容"></el-autocomplete>
<el-button
style="width: 8%"
type="primary" icon="el-icon-search" @click="toRescue"></el-button>
</div>
</el-card>
</div>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<div>
<el-card shadow="hover" class="card">
</el-card>
</div>
</el-col>
<el-col :span="12">
<div>
<el-card shadow="hover" class="card">
</el-card>
</div>
</el-col>
</el-row>
</div>
</template>
<script>
// echarts
var echarts = require('echarts/lib/echarts');
require('echarts/lib/component/tooltip');
require('echarts/lib/chart/gauge');
require('echarts/lib/component/title');
import baiduLogo from "@/assets/images/baidu_logo.png"
import {getAssociation} from "@/api/business/openapi/ai";
export default {
name: "Serach",
data() {
return {
baiduLogo,
//
searchContent: '',
//
associationList: [],
};
},
created() {
},
mounted() {
this.initRenderers();
},
methods: {
//echarts
initRenderers() {
var myDate = new Date();
var s = myDate.getSeconds();
let time = myDate.toLocaleTimeString();
let renderersChart = echarts.init(this.$refs.renderersChart.$el)
renderersChart.setOption({
tooltip: {
formatter: '单位:{a} <br/>当前 : {c}s'
},
title: {
text: time,
textStyle: {
color: '#541264',
fontWeight: '1000',
align: 'center',
},
left: "center",
},
series: [
{
name: '秒',
type: 'gauge',
progress: {
show: true
},
detail: {
valueAnimation: true,
formatter: '{value}'
},
data: [
{
value: s,
name: '单位:秒',
}
],
min: 0,
max: 60,
splitNumber: 6,
}
]
})
//
setInterval(function () {
let myDate = new Date();
let s = myDate.getSeconds();
let time = myDate.toLocaleTimeString();
renderersChart.setOption({
title: {
text: time,
},
series: [
{
data: [
{
value: s,
name: '单位:秒',
}
]
},
]
});
}, 1000);
},
//
getAssociation() {
if (this.searchContent === '' || this.searchContent === null || this.searchContent === undefined) {
return
}
let data = {
content: this.searchContent,
};
getAssociation(data).then(res => {
this.associationList = res.data
})
},
querySearchAsync(queryString, cb) {
let list = this.handleAssociationList(this.associationList);
cb(list);
},
/**
* 处理返回的list
* @param restaurants
*/
handleAssociationList(restaurants) {
let list = []
if (restaurants === null || restaurants === undefined || restaurants === []) {
return list
}
restaurants.forEach(s => {
let obj = {};
let key = "value"
var value = s
obj[key] = value
list.push(obj)
});
return list;
},
//
toRescue() {
//
// window.location.href = 'https://www.baidu.com/s?wd=' + this.searchContent
//
window.open('https://www.baidu.com/s?wd='+ this.searchContent)
},
handleSelect(item) {
console.log(item);
},
},
};
</script>
<style scoped lang="scss">
.card {
width: 100%;
height: 410px;
margin: 0 auto;
}
</style>

@ -1,61 +1,47 @@
<template>
<div>
<el-row :gutter="20">
<el-col :span="12">
<div>
<el-card shadow="hover" class="card" ref="renderersChart">
<div class="app-container">
<el-row :gutter="5">
<el-col :span="8">
<div class="grid-content bg-purple">
<el-card class="box-card" :body-style="{padding:'3px'}" shadow="hover">
<div slot="header" style="font-size: 18px;color: #3A71A8;font-weight: 800;padding: 0">
<span>最新微博热搜</span>
</div>
<div v-for="wb in WbDataList" :key="wb.id" style="color: #8492a6;">
{{ wb.hotword }}
</div>
</el-card>
</div>
</el-col>
<el-col :span="12">
<div>
<el-card shadow="hover" class="card">
<!--logo -->
<div style="width: 500px;margin: 0 auto;margin-top: 20px">
<el-image
style="width: 272px; height: 72px;margin-left: 120px"
:src="baiduLogo"
></el-image>
<el-col :span="16">
<div class="grid-content bg-purple">
<el-card class="box-card" :body-style="{padding:'3px'}" shadow="hover">
<div slot="header" style="font-size: 18px;color: #00BCD4;font-weight: 800;padding: 0">
<span>文案</span>
</div>
<!--输入框 -->
<div style="margin-top: 30px">
<el-autocomplete
style="width: 92%"
v-model="searchContent"
@input="getAssociation()"
@keydown.enter.n.native="toRescue"
clearable
@select="handleSelect"
:fetch-suggestions="querySearchAsync"
placeholder="请输入你想要搜索的内容"></el-autocomplete>
<el-button
style="width: 8%"
type="primary" icon="el-icon-search" @click="toRescue"></el-button>
<div v-for="copyWriting in copyWritingList" :key="copyWriting.id" class="top_content"
style="color: #bfcbd9;">
<el-tooltip effect="light" :content="copyWriting.content+' ——— '+copyWriting.type" placement="top">
<span>{{ copyWriting.content }} <span style="color: #bfcbc5">{{ copyWriting.type }}</span></span>
</el-tooltip>
</div>
</el-card>
</div>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<div>
<el-card shadow="hover" class="card">
</el-card>
</div>
<el-row :gutter="5">
<el-col :span="24">
<div class="grid-content bg-purple"></div>
</el-col>
<el-col :span="12">
<div>
<el-card shadow="hover" class="card">
</el-card>
</div>
</el-row>
<el-row :gutter="5">
<el-col :span="24">
<div class="grid-content bg-purple"></div>
</el-col>
</el-row>
<el-row :gutter="5">
<el-col :span="24">
<div class="grid-content bg-purple"></div>
</el-col>
</el-row>
</div>
@ -63,176 +49,82 @@
<script>
// echarts
var echarts = require('echarts/lib/echarts');
require('echarts/lib/component/tooltip');
require('echarts/lib/chart/gauge');
require('echarts/lib/component/title');
import baiduLogo from "@/assets/images/baidu_logo.png"
import {getAssociation} from "@/api/business/openapi/ai";
import {showCopyWriting, showWbSearch} from "@/api";
export default {
name: "Index",
data() {
return {
baiduLogo,
//
searchContent: '',
//
associationList: [],
WbDataList: {},
copyWritingList: {},
};
},
created() {
this.showWbSearch()
this.showCopyWriting()
},
mounted() {
this.initRenderers();
},
methods: {
//echarts
initRenderers() {
var myDate = new Date();
var s = myDate.getSeconds();
let time = myDate.toLocaleTimeString();
let renderersChart = echarts.init(this.$refs.renderersChart.$el)
renderersChart.setOption({
tooltip: {
formatter: '单位:{a} <br/>当前 : {c}s'
},
title: {
text: time,
textStyle: {
color: '#541264',
fontWeight: '1000',
align: 'center',
},
left: "center",
},
series: [
{
name: '秒',
type: 'gauge',
progress: {
show: true
},
detail: {
valueAnimation: true,
formatter: '{value}'
},
data: [
{
value: s,
name: '单位:秒',
}
],
min: 0,
max: 60,
splitNumber: 6,
}
]
showWbSearch() {
showWbSearch().then(res => {
this.WbDataList = res.data
})
//
setInterval(function () {
let myDate = new Date();
let s = myDate.getSeconds();
let time = myDate.toLocaleTimeString();
renderersChart.setOption({
title: {
text: time,
},
series: [
{
data: [
{
value: s,
name: '单位:秒',
}
]
},
]
});
}, 1000);
},
//
getAssociation() {
if (this.searchContent === '' || this.searchContent === null || this.searchContent === undefined) {
return
}
let data = {
content: this.searchContent,
};
getAssociation(data).then(res => {
this.associationList = res.data
showCopyWriting() {
showCopyWriting().then(res => {
this.copyWritingList = res.data
})
},
},
querySearchAsync(queryString, cb) {
let list = this.handleAssociationList(this.associationList);
cb(list);
},
/**
* 处理返回的list
* @param restaurants
*/
handleAssociationList(restaurants) {
};
</script>
let list = []
<style scoped lang="scss">
if (restaurants === null || restaurants === undefined || restaurants === []) {
return list
}
.top_content {
white-space: nowrap; /*把文本强制显示在一行*/
overflow: hidden; /*隐藏超出部分的文字*/
text-overflow: ellipsis; /*超出显示省略号*/
restaurants.forEach(s => {
let obj = {};
let key = "value"
var value = s
obj[key] = value
list.push(obj)
});
font-size: 14px;
font-weight: 700;
}
return list;
},
//
toRescue() {
//
// window.location.href = 'https://www.baidu.com/s?wd=' + this.searchContent
//
window.open('https://www.baidu.com/s?wd='+ this.searchContent)
},
handleSelect(item) {
console.log(item);
},
},
.el-col {
border-radius: 4px;
}
.bg-purple-dark {
background: #99a9bf;
}
};
</script>
.bg-purple {
background: #d3dce6;
}
<style scoped lang="scss">
.card {
width: 100%;
height: 410px;
margin: 0 auto;
.bg-purple-light {
background: #e5e9f2;
}
.grid-content {
border-radius: 4px;
min-height: 36px;
}
.row-bg {
padding: 10px 0;
background-color: #f9fafc;
}
</style>

@ -0,0 +1,51 @@
package com.xjs.common.controller;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.xjs.business.webmagic.RemoteWebmagicCopyWritingNetworkFeign;
import com.xjs.business.webmagic.domain.CopyWritingNetworkDTO;
import com.xjs.topsearch.domain.ApiTopsearchWeibo;
import com.xjs.topsearch.service.ApiTopsearchWeiboService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.log4j.Log4j2;
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.RestController;
import javax.annotation.Resource;
import java.util.List;
/**
*
* @author xiejs
* @since 2022-06-14
*/
@RestController
@RequestMapping("index")
@Api(tags = "业务模块-主页")
@Log4j2
public class IndexController {
@Autowired
private ApiTopsearchWeiboService apiTopsearchWeiboService;
@Resource
private RemoteWebmagicCopyWritingNetworkFeign remoteWebmagicCopyWritingNetworkFeign;
@GetMapping("showWbSearch")
@ApiOperation("展示微博热搜")
public AjaxResult showWbSearch() {
List<ApiTopsearchWeibo> weiboList = apiTopsearchWeiboService.showWbSearch();
return AjaxResult.success(weiboList);
}
@GetMapping("showCopyWriting")
@ApiOperation("首页展示文案")
public AjaxResult showCopyWriting() {
R<List<CopyWritingNetworkDTO>> data = remoteWebmagicCopyWritingNetworkFeign.showCopyWriting();
return AjaxResult.success(data.getData());
}
}

@ -15,6 +15,8 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import static com.xjs.consts.ApiConst.DEMOTE_ERROR;
@ -50,7 +52,13 @@ public class TianXingTopsearchWeiboFactory implements TopserachFactory<ApiTopsea
ApiTopsearchWeibo apiTopsearchWeibo = new ApiTopsearchWeibo();
JSONObject json = (JSONObject) arrayJson;
apiTopsearchWeibo.setHotword(json.getString("hotword"));
apiTopsearchWeibo.setHotnum(json.getString("hotwordnum"));
//提取热度中的数字
String hotwordnum = json.getString("hotwordnum");
String regEx="[^0-9]";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(hotwordnum);
apiTopsearchWeibo.setHotnum(m.replaceAll("").trim());
apiTopsearchWeibo.setHottag(json.getString("hottag"));
return apiTopsearchWeibo;
}).collect(Collectors.toList());

@ -3,6 +3,8 @@ package com.xjs.topsearch.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xjs.topsearch.domain.ApiTopsearchWeibo;
import java.util.List;
/**
* @author xiejs
* @since 2022-01-12
@ -13,4 +15,11 @@ public interface ApiTopsearchWeiboService extends IService<ApiTopsearchWeibo> {
* @return Integer
*/
Integer deleteRepeatData();
/**
*
* @return ApiTopsearchWeibo
*/
List<ApiTopsearchWeibo> showWbSearch();
}

@ -1,5 +1,6 @@
package com.xjs.topsearch.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xjs.topsearch.domain.ApiTopsearchWeibo;
import com.xjs.topsearch.mapper.ApiTopsearchWeiboMapper;
@ -7,6 +8,7 @@ import com.xjs.topsearch.service.ApiTopsearchWeiboService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* @author xiejs
@ -21,4 +23,15 @@ public class ApiTopsearchWeiboServiceImpl extends ServiceImpl<ApiTopsearchWeiboM
public Integer deleteRepeatData() {
return apiTopsearchWeiboMapper.deleteRepeatData();
}
@Override
public List<ApiTopsearchWeibo> showWbSearch() {
LambdaQueryWrapper<ApiTopsearchWeibo> wrapper = new LambdaQueryWrapper<>();
wrapper.select(ApiTopsearchWeibo::getHotword,ApiTopsearchWeibo::getId);
wrapper.orderByDesc(ApiTopsearchWeibo::getCreateTime);
wrapper.orderByDesc(ApiTopsearchWeibo::getHotnum);
wrapper.last("limit 5");
return apiTopsearchWeiboMapper.selectList(wrapper);
}
}

@ -7,6 +7,7 @@ import com.ruoyi.common.core.web.page.TableDataInfo;
import com.ruoyi.common.log.annotation.Log;
import com.ruoyi.common.log.enums.BusinessType;
import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.xjs.business.webmagic.domain.CopyWritingNetworkDTO;
import com.xjs.copywritingNetwork.pojo.CopyWritingNetwork;
import com.xjs.copywritingNetwork.service.CopyWritingNetworkService;
import com.xjs.copywritingNetwork.task.CopyWritingNetworkTask;
@ -14,12 +15,14 @@ import com.xjs.validation.group.SelectGroup;
import com.xjs.web.MyBaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.stream.Collectors;
/**
* controller
@ -30,7 +33,7 @@ import java.util.List;
@RestController
@RequestMapping("copyWritingNetwork")
@Api(tags = "爬虫模块-文案网")
public class CopyWritingNetworkController extends MyBaseController {
public class CopyWritingNetworkController extends MyBaseController<CopyWritingNetwork> {
@Autowired
private CopyWritingNetworkService copyWritingNetworkService;
@ -55,6 +58,18 @@ public class CopyWritingNetworkController extends MyBaseController {
return R.ok(count);
}
@GetMapping("showCopyWriting")
@ApiOperation("首页展示文案")
public R<List<CopyWritingNetworkDTO>> showCopyWriting() {
List<CopyWritingNetwork> data = copyWritingNetworkService.showCopyWriting();
List<CopyWritingNetworkDTO> collect = data.stream().map(d -> {
CopyWritingNetworkDTO dto = new CopyWritingNetworkDTO();
BeanUtils.copyProperties(d, dto);
return dto;
}).collect(Collectors.toList());
return R.ok(collect);
}
//----------------------------代码生成-----------------------------

@ -50,4 +50,10 @@ public interface CopyWritingNetworkMapper extends BaseMapper<CopyWritingNetwork>
* @return list
*/
List<String> getType();
/**
*
* @return List
*/
List<CopyWritingNetwork> showCopyWriting();
}

@ -52,5 +52,10 @@ public interface CopyWritingNetworkService extends IService<CopyWritingNetwork>
int deleteCopyWritingNetworkById(Long id);
/**
*
* @return List
*/
List<CopyWritingNetwork> showCopyWriting();
}

@ -55,6 +55,10 @@ public class CopyWritingNetworkServiceImpl extends ServiceImpl<CopyWritingNetwor
return this.listObjs(wrapper);
}
@Override
public List<CopyWritingNetwork> showCopyWriting() {
return copyWritingNetworkMapper.showCopyWriting();
}
/**
*
@ -128,4 +132,6 @@ public class CopyWritingNetworkServiceImpl extends ServiceImpl<CopyWritingNetwor
}
}

@ -122,6 +122,11 @@ public class CopyWritingNetworkTask {
String content = copyWritingNetwork.getContent();
boolean matches = pattern.matcher(content).matches();
if (StringUtils.isNotEmpty(content) && !matches) {
//过滤数据
String cont = filterContent(content);
copyWritingNetwork.setContent(cont);
copyWritingNetworks.add(copyWritingNetwork);
}
@ -139,5 +144,50 @@ public class CopyWritingNetworkTask {
return count;
}
/**
*
*
* @param oldStr
* @return newStr
*/
private String filterContent(String oldStr) {
try {
char index0 = oldStr.charAt(0);
char index1 = oldStr.charAt(1);
char index2 = oldStr.charAt(2);
char index3 = oldStr.charAt(3);
boolean matches0 = pattern.matcher(String.valueOf(index0)).matches();
boolean matches1 = pattern.matcher(String.valueOf(index1)).matches();
boolean matches2 = pattern.matcher(String.valueOf(index2)).matches();
// 1、
if (matches0 && index1 == '、') {
return oldStr.substring(2);
}
// 15、
if (matches0 && matches1 && index2 == '、') {
return oldStr.substring(3);
}
//100、
if (matches0 && matches1 && matches2 && index3 == '、') {
return oldStr.substring(4);
}
//1.
if (matches0 && index1 == '.') {
return oldStr.substring(2);
}
//13.
if (matches0 && matches1 && index2 == '.') {
return oldStr.substring(3);
}
//100.
if (matches0 && matches1 && matches2 && index3 == '.') {
return oldStr.substring(4);
}
} catch (Exception e) {
log.error(e.getMessage()+"===="+oldStr);
return oldStr;
}
return oldStr;
}
}

@ -98,6 +98,7 @@ public class OfficialAccountsProcessor implements PageProcessor {
String js = page.getHtml().get();
//解析js中的url地址以及拼接
if (js.contains("window.location.replace(url)")) {
String function = js.substring(js.indexOf("{") + 1, js.indexOf("}"));
//System.out.println("function="+function);

@ -38,6 +38,9 @@
GROUP BY
type
</select>
<select id="showCopyWriting" resultType="com.xjs.copywritingNetwork.pojo.CopyWritingNetwork">
SELECT id,type,content FROM webmagic_copywriting_network ORDER BY RAND() LIMIT 5
</select>
<delete id="deleteRepeatData">
delete from webmagic_copywriting_network where id not in (
@ -58,4 +61,4 @@
#{id}
</foreach>
</delete>
</mapper>
</mapper>

Loading…
Cancel
Save