mirror of
https://github.com/ngfchl/ptools
synced 2023-07-10 13:41:22 +08:00
实现全站历史数据增量图,数据量大会比较卡,待优化
This commit is contained in:
180
auto_pt/views.py
180
auto_pt/views.py
@@ -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(
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user