diff --git a/auto_pt/views.py b/auto_pt/views.py index ce2550a..75f5e37 100644 --- a/auto_pt/views.py +++ b/auto_pt/views.py @@ -563,7 +563,69 @@ def download_tasks(): def site_status_api(request): - my_site_list = MySite.objects.all() + # my_site_list = MySite.objects.all() + # uploaded = 0 + # downloaded = 0 + # seeding = 0 + # seeding_size = 0 + # status_list = [] + # now = datetime.now() + # for my_site in my_site_list: + # site_info = my_site.sitestatus_set.order_by('-pk').first() + # if not site_info: + # continue + # downloaded += site_info.downloaded + # uploaded += site_info.uploaded + # seeding += my_site.seed + # seeding_size += site_info.seed_vol + # weeks = (now - my_site.time_join).days // 7 + # days = (now - my_site.time_join).days % 7 + # site_info = { + # 'name': my_site.site.name, + # 'icon': my_site.site.logo, + # 'class': my_site.my_level, + # 'invite': my_site.invitation, + # 'sp_hour': my_site.sp_hour, + # 'seeding': my_site.seed, + # 'time_join': f'{weeks}周 {days}天', + # 'hr': my_site.my_hr, + # 'mail': my_site.mail, + # 'sp': site_info.my_sp, + # 'bonus': site_info.my_bonus, + # # 'uploaded': FileSizeConvert.parse_2_file_size(site_info.uploaded), + # # 'downloaded': FileSizeConvert.parse_2_file_size(site_info.downloaded), + # # 'seeding_size': FileSizeConvert.parse_2_file_size(site_info.seed_vol), + # 'uploaded': site_info.uploaded, + # 'downloaded': site_info.downloaded, + # 'seeding_size': site_info.seed_vol, + # } + # status_list.append(site_info) + # # 按上传量排序 + # # status_list.sort(key=lambda x: x['uploaded'], reverse=False) + # # sorted(status_list, key=lambda x: x['uploaded']) + # # 随机乱序 + # random.shuffle(status_list) + # total_data = { + # # 'uploaded': FileSizeConvert.parse_2_file_size(uploaded), + # # 'downloaded': FileSizeConvert.parse_2_file_size(downloaded), + # # 'seeding_size': FileSizeConvert.parse_2_file_size(seeding_size), + # 'uploaded': uploaded, + # 'downloaded': downloaded, + # 'seeding_size': seeding_size, + # 'seeding': seeding, + # 'ratio': round(uploaded / downloaded, 3), + # } + # return render(request, 'auto_pt/status.html') + return JsonResponse(data=CommonResponse.success( + data=get_status() + ).to_dict(), safe=False) + + +def get_status(ids: list = None): + if ids is None: + my_site_list = MySite.objects.all() + else: + my_site_list = MySite.objects.filter(pk__in=ids).all() uploaded = 0 downloaded = 0 seeding = 0 @@ -583,11 +645,16 @@ def site_status_api(request): site_info = { 'name': my_site.site.name, 'icon': my_site.site.logo, + 'url': my_site.site.url, 'class': my_site.my_level, 'invite': my_site.invitation, 'sp_hour': my_site.sp_hour, + 'sp_hour_full': '{:.2%}'.format( + float(my_site.sp_hour) / my_site.site.sp_full) if my_site.site.sp_full != 0 else 0, 'seeding': my_site.seed, - 'time_join': f'{weeks}周 {days}天', + 'leeching': my_site.leech, + 'weeks': f'{weeks}周 {days}天', + 'time_join': my_site.time_join, 'hr': my_site.my_hr, 'mail': my_site.mail, 'sp': site_info.my_sp, @@ -601,10 +668,10 @@ def site_status_api(request): } status_list.append(site_info) # 按上传量排序 - # status_list.sort(key=lambda x: x['uploaded'], reverse=False) + status_list.sort(key=lambda x: x['uploaded'], reverse=False) # sorted(status_list, key=lambda x: x['uploaded']) # 随机乱序 - random.shuffle(status_list) + # random.shuffle(status_list) total_data = { # 'uploaded': FileSizeConvert.parse_2_file_size(uploaded), # 'downloaded': FileSizeConvert.parse_2_file_size(downloaded), @@ -616,13 +683,18 @@ def site_status_api(request): 'ratio': round(uploaded / downloaded, 3), } # return render(request, 'auto_pt/status.html') - return JsonResponse(data=CommonResponse.success( - data={ - 'total_data': total_data, 'status_list': status_list - } - ).to_dict(), safe=False) + return { + 'total_data': total_data, + 'status_list': status_list + } @login_required def site_status(request): return render(request, 'auto_pt/status.html') + + +def user_data(request): + my_site_list = MySite.objects.all() + + return render(request, 'auto_pt/userdata.html') diff --git a/templates/auto_pt/status.html b/templates/auto_pt/status.html index f7dad20..0889f6e 100644 --- a/templates/auto_pt/status.html +++ b/templates/auto_pt/status.html @@ -13,8 +13,7 @@ } .box-card { - background-color: #130f2c; - color: #ffefef; + {#background-color: rgba(88, 200, 233, 80%);#}{#color: #ffefef;#} } .chart-button { @@ -27,7 +26,7 @@
- 数据总量 + 站点数据 柱状图 饼图 - - - - + 列表 +
+ + + +
+{# #} +{# #} +{# #} +{# #} +{# #} +{# #}
- + +
+ + + +
+ + +   + + +
+ + +
+ +
+ {# #} + {# #} + {# 更新#} +
+
+
+ / + + +
+ 数据量 +
+ +
+ +
+ 魔力积分 +
+ / + / + +
+ 实时数据 + {#
#} + {# H&R#} +
+
+
+ +
+ +
+
@@ -77,6 +163,10 @@ return size + ' ' + unitArr[index]; } + function shuffle() { + return Math.random() > 0.5 ? -1 : 1; + } + const vm = new Vue({ el: '#status', data() { @@ -87,6 +177,8 @@ begInvite: false, showLogo: false, showLegend: false, + showList: false, + shuffle: false, } }, beforeMount() { @@ -109,6 +201,7 @@ methods: { setChartOption(option) { this.option = option + this.showList = false this.$refs.charts.chart.clear() this.$refs.charts.chart.setOption(this.option) window.addEventListener("resize", () => { @@ -117,12 +210,29 @@ } }) }, + setCard() { + if (this.chart) { + this.$refs.charts.chart.clear() + } + if (this.shuffle) { + this.ptData.status_list.sort(shuffle) + } else { + this.ptData.status_list.sort((a, b) => { + return b.uploaded - a.uploaded + }) + } + this.showList = true + }, setPie() { let uploadedList = [] let siteList = [] let ptData = this.ptData let begInvite = !this.begInvite - ptData.status_list.forEach((site, index) => { + let status_list = ptData.status_list + if (this.shuffle) { + status_list.sort(shuffle) + } + status_list.forEach((site, index) => { uploadedList.push({ 'value': site.uploaded, 'path': 'uploaded/' + site.name, @@ -143,20 +253,20 @@ text: 'PT站点数据', subtext: `上传量:${renderSize(ptData.total_data.uploaded)}\n做种量:${renderSize(ptData.total_data.seeding_size)}\n下载量:${renderSize(ptData.total_data.downloaded)}\n分享率:${ptData.total_data.ratio}`, subtextStyle: { - color: '#969696', + color: 'orange', fontWeight: 'bold', fontFamily: '黑体', fontSize: '16', lineHeight: 32, }, left: '5%', - top: '10%', + top: '2%', }, tooltip: { show: true, - //formatter: function (params) { - // return params.name + '\t' + renderSize(params.data.value) - //} + formatter: function (params) { + return params.name + '\t' + renderSize(params.data.value) + }, valueFormatter: function (value) { return renderSize(value) } @@ -176,6 +286,8 @@ {#type: 'scroll',#} {#top: 'bottom',#} right: '2%', + top: '5%', + bottom: '5%', orient: 'vertical', data: [], }, @@ -190,9 +302,9 @@ }, series: [ { - name: 'PT数据展示', + name: '站点数据', type: 'pie', - bottom: '7%', + bottom: '2%', radius: '55%', {#visualDimension: 1,#} center: ['45%', '50%'], @@ -420,7 +532,8 @@ console.log(res.data.data) {#this.ptData = res.data.data#} this.ptData = res.data.data - this.setPie() + {#this.setPie()#} + this.setCard() } else { this.loading = false this.$message({