实现全站历史数据增量图,数据量大会比较卡,待优化

This commit is contained in:
ngfchl
2022-12-07 15:43:46 +08:00
parent aec8a2ff04
commit 7e819edc79
2 changed files with 219 additions and 74 deletions

View File

@@ -414,68 +414,6 @@ def do_update(request):
return JsonResponse(data=pt_site.auto_upgrade().to_dict(), safe=False)
"""
try:
logger.info('开始更新')
pt_site_site_mtime = os.stat('pt_site_site.json').st_mtime
requirements_mtime = os.stat('requirements.txt').st_mtime
update_commands = {
# 'cp db/db.sqlite3 db/db.sqlite3-$(date "+%Y%m%d%H%M%S")',
'强制覆盖本地': 'git reset --hard',
'获取更新信息': 'git fetch --all',
'拉取代码更新': 'git pull origin {}'.format(os.getenv('DEV')),
}
requirements_commands = {
'安装依赖': 'pip install -r requirements.txt',
}
migrate_commands = {
'同步数据库': 'python manage.py migrate',
}
logger.info('拉取最新代码')
result = exec_command(update_commands)
new_requirements_mtime = os.stat('requirements.txt').st_mtime
if new_requirements_mtime > requirements_mtime:
logger.info('更新环境依赖')
result.extend(exec_command(requirements_commands))
new_pt_site_site = os.stat('pt_site_site.json').st_mtime
logger.info('更新前文件最后修改时间')
logger.info(pt_site_site_mtime)
logger.info('更新后文件最后修改时间')
logger.info(new_pt_site_site)
if new_pt_site_site == pt_site_site_mtime:
logger.info('本次无规则更新,跳过!')
result.append({
'command': '本次无更新规则',
'res': 0
})
pass
else:
logger.info('拉取更新完毕开始更新Xpath规则')
p = subprocess.run('cp db/db.sqlite3 db/db.sqlite3-$(date "+%Y%m%d%H%M%S")', shell=True)
logger.info('备份数据库 命令执行结果:\n{}'.format(p))
result.append({
'command': '备份数据库',
'res': p.returncode
})
result.extend(exec_command(migrate_commands))
logger.info('同步数据库 命令执行结果:\n{}'.format(p))
logger.info('更新完毕')
return JsonResponse(data=CommonResponse.success(
msg='更新成功15S后自动刷新页面',
data={
'result': result
}
).to_dict(), safe=False)
except Exception as e:
# raise
msg = '更新失败!{}请初始化Xpath'.format(str(e))
logger.error(msg)
return JsonResponse(data=CommonResponse.error(
msg=msg
).to_dict(), safe=False)
"""
def do_xpath(request):
"""初始化Xpath规则"""
migrate_commands = {
@@ -691,10 +629,120 @@ def site_data_api(request):
my_site_id = request.GET.get('id')
logger.info(f'ID值{type(my_site_id)}')
if int(my_site_id) == 0:
# pt_site.auto_sign_in()
return JsonResponse(data=CommonResponse.error(
msg='全站数据展示功能还未完成,敬请期待!'
my_site_list = MySite.objects.all()
diff_list = []
# 提取日期
date_list = set([
status.created_at.date().strftime('%Y-%m-%d') for status in SiteStatus.objects.all()
])
date_list = list(date_list)
date_list.sort()
print(f'日期列表:{date_list}')
print(f'日期数量:{len(date_list)}')
# for date in date_list:
# status_list = SiteStatus.objects.filter(created_at__date=date)
# diff_list.append({
# 'name': date.strftime('%Y-%m-%d'),
# 'stack': date.strftime('%Y-%m-%d'),
# 'data': [{
# 'name': status.site.site.name,
# 'value': status.uploaded
# } for status in status_list]
#
# })
# print(diff_list)
for my_site in my_site_list:
# 每个站点获取自己站点的所有信息
site_status_list = my_site.sitestatus_set.order_by('created_at').all()
print(f'站点数据条数:{len(site_status_list)}')
info_list = [
{
'uploaded': site_info.uploaded,
'date': site_info.created_at.date().strftime('%Y-%m-%d')
} for site_info in site_status_list
]
print(f'提取完后站点数据条数:{len(info_list)}')
# 生成本站点的增量列表,并标注时间
'''
site_info_list = [{
'name': my_site.site.name,
'type': 'bar',
'stack': info_list[index + 1]['date'],
'value': info_list[index + 1]['uploaded'] - info['uploaded'] if index < len(
info_list) - 1 else 0,
'date': info['date']
} for (index, info) in enumerate(info_list) if index < len(info_list) - 1]
'''
diff_info_list = {
info['date']: info_list[index + 1]['uploaded'] - info['uploaded'] if index < len(
info_list) - 1 else 0 for (index, info) in enumerate(info_list) if index < len(info_list) - 1
}
print(f'处理完后站点数据条数:{len(info_list)}')
for date in date_list:
if not diff_info_list.get(date):
diff_info_list[date] = 0
# print(diff_info_list)
print(len(diff_info_list))
diff_info_list = sorted(diff_info_list.items(), key=lambda x: x[0])
diff_list.append({
'name': my_site.site.name,
'type': 'bar',
'large': 'true',
'stack': 'increment',
'data': [value[1] if value[1] > 0 else 0 for value in diff_info_list]
})
print(diff_list)
# diff_list.append(
# {
# 'name': my_site.site.name,
# 'diff': {info['date']: info_list[index + 1]['uploaded'] - info['uploaded'] if index < len(
# info_list) - 1 else 0 for (index, info) in enumerate(info_list)}
# }¬
# )
info_list = []
# print(diff_list)
# print(len(diff_list))
# 提取日期
# date_list = set([
# diff['date'] for diff in site_status_list
# ])
# date_list = list(date_list)
# date_list.sort()
# print(date_list)
# print(len(date_list))
# 填充数据
data_list = []
# for date in date_list:
# list1 = []
# for diff in diff_list:
# print(date, diff['date'])
# if date == diff['date']:
# list1.append(diff)
# print(list1)
# data_list.append({
# date: list1
# })
# list1 = []
# print(data_list)
#
# x = [{
# 'name': diff['name'],
# 'type': 'bar',
# 'stack': 'diff',
#
# } for diff in diff_list]
return JsonResponse(data=CommonResponse.success(
# msg='全站数据展示功能还未完成,敬请期待!'
data={
'date_list': date_list,
'diff': diff_list
}
).to_dict(), safe=False)
logger.info(f'前端传来的站点ID{my_site_id}')
my_site = MySite.objects.filter(id=my_site_id).first()
if not my_site:
@@ -762,7 +810,7 @@ def sign_in_api(request):
def update_site_api(request):
try:
my_site_id = request.GET.get('id')
logger.info(f'ID值{type(my_site_id)}')
logger.info(f'ID值{my_site_id}')
if int(my_site_id) == 0:
pt_site.auto_get_status()
return JsonResponse(data=CommonResponse.success(

View File

@@ -41,6 +41,10 @@
margin-right: 5px;
}
.el-drawer__header {
height: 35px !important;
}
</style>
</head>
<body>
@@ -84,7 +88,7 @@
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" style="margin-bottom: 10px;">
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" style="margin-bottom: 10px;" v-if="ptData">
<el-card class="box-card info-card">
<div slot="header" class="clearfix">
<div style="text-align: center;line-height: 100%;margin-top: -15px;">
@@ -341,13 +345,17 @@
:visible.sync="showSiteChart"
direction="btt"
size="96%"
append-to-body
:title="site.name + '--历史数据'"
style="background-color: rgba(227, 229, 229, 0.6);">
{# <div slot="title" style="text-align: center;line-height: 35px;">#}
{# <h3><span v-text="site.name"></span>-历史数据</h3>#}
{# </div>#}
<div style="width: 95%;text-align: center;margin: -15px auto 25px;">
<el-row :gutter="20">
<charts ref="history_charts" style="height: 600px;margin-top: 15px;"
v-if="showAllHistory" :option="option"></charts>
<el-row :gutter="20" v-else="showAllHistory">
<el-col :span="24">
<charts ref="seeding_charts" style="height: 420px;margin-top: 15px;" :option="option"></charts>
</el-col>
@@ -379,7 +387,7 @@
data() {
return {
chart: null,
ptData: {},
ptData: null,
site: {},
option: {},
showList: true,
@@ -391,10 +399,10 @@
searchKey: '',
sortStep: 1,
showData: [],
showAllHistory: false,
}
},
beforeMount() {
},
mounted() {
{#this.chart = this.$refs.charts.chart#}
@@ -548,9 +556,8 @@
{#this.ptData = res.data.data#}
{#this.setPie()#}
{#this.setCard()#}
this.setLine(res.data.data)
id == 0 ? this.showAllIncrementHistory(res.data.data) : this.setLine(res.data.data)
} else {
this.$message({
type: 'warning',
message: res.data.msg
@@ -564,6 +571,92 @@
});
})
},
showAllIncrementHistory(data) {
let option = {
//title: {
// text: site.name,
// textStyle: {
// color: 'orangered',
// },
// left: 'center',
// top: '3%',
//},
tooltip: {
show: true,
trigger: 'axis',
axisPointer: {
type: 'shadow'
},
formatter: function (params) {
//console.log(params)
// console.log(params[0].value[1])
let text = ''
params.forEach((param, index) => {
let temp = param.value == 0 ? '' : `
<div style="display: block;height:20px;width: 50%;float:left;">
<i style="width: 10px;height: 10px;display: inline-block;background: ${param.color};border-radius: 10px;"></i>
<span>${param.seriesName}: ${renderSize(param.value)}</span>
</div>
`
text += temp
})
return `<div style="width: 300px;">${text}</div>`
},
//position: function (point, params, dom, rect, size) {
// return [point[1], 0]
//},
order: 'valueDesc',
confine: false,
extraCssText: 'box-shadow: 0 0 3px rgba(0, 0, 0, 0.3);z-index: 9999;', // 附加阴影样式
},
legend: {
show: false,
top: '3%',
left: 'center',
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
toolbox: {
feature: {
saveAsImage: {}
}
},
xAxis: {
type: 'category',
boundaryGap: true,
axisTick: {
{#alignWithLabel: true#}
},
axisLine: {
onZero: false
},
data: data.date_list
},
yAxis: {
type: 'value',
axisLabel: {
formatter: function (value, index) {
return renderSize(value);
}
},
},
series: data.diff,
};
this.showSiteChart = true
this.showAllHistory = true
setTimeout(() => {
this.site.name = '全部站点'
this.chart = this.$refs.history_charts.chart
this.setChartOption(this.chart, option)
}, 15)
},
begInviteMode() {
this.begInvite = !this.begInvite
if (this.begInvite) {
@@ -930,12 +1023,14 @@
name: '上传量',
type: 'bar',
stack: 'Ad',
barMaxWidth: '60%',
data: uploadedList
}
let downloaded = {
name: '下载量',
type: 'bar',
stack: 'Ad',
barMaxWidth: '60%',
data: downloadedList
}
option.series.push(downloaded, uploaded)
@@ -953,7 +1048,6 @@
let ratioList = []
let seedingSizeList = []
let dateList = []
let increment = []
dataList.sort((a, b) => {
return a.info_date - b.info_date
})
@@ -1020,7 +1114,7 @@
},
xAxis: {
type: 'category',
boundaryGap: false,
boundaryGap: true,
data: dateList
},
yAxis: [{
@@ -1089,6 +1183,7 @@
name: '上传增量',
type: 'bar',
yAxisIndex: 0,
barMaxWidth: '60%',
{#stack: 'Total',#}
data: diff
},
@@ -1147,6 +1242,7 @@
]
};
this.showSiteChart = true
this.showAllHistory = false
setTimeout(() => {
this.chart = this.$refs.seeding_charts.chart
this.setChartOption(this.chart, option)
@@ -1154,6 +1250,7 @@
name: '上传增量',
type: 'bar',
{#stack: 'Total',#}
barMaxWidth: '60%',
data: diff
}]
this.setChartOption(this.$refs.diff_charts.chart, option)