diff --git a/dashboard/models.py b/dashboard/models.py index 6de5313..e489b0a 100644 --- a/dashboard/models.py +++ b/dashboard/models.py @@ -3,6 +3,8 @@ from django.contrib.auth.models import User from django.db import models # 权限等级 + + class Level(models.Model): id = models.UUIDField('id', primary_key=True, default=uuid.uuid4) name = models.CharField('等级名', max_length=256, null=True, blank=True) @@ -12,6 +14,8 @@ class Level(models.Model): def __str__(self): return self.name + + class Group_type(models.Model): id = models.UUIDField('id', primary_key=True, default=uuid.uuid4) type = models.CharField('矩阵类型', max_length=256, null=True, blank=True) @@ -19,6 +23,8 @@ class Group_type(models.Model): def __str__(self): return self.type # 矩阵 + + class Group(models.Model): GROUP_STATUS_CHOICES = ( ('0', '关闭'), @@ -37,7 +43,8 @@ class Group(models.Model): district = models.CharField('县', max_length=256, null=True, blank=True) town = models.CharField('乡', max_length=256, null=True, blank=True) village = models.CharField('村', max_length=256, null=True, blank=True) - user = models.ForeignKey(User,on_delete=models.CASCADE,blank=True,null=True) + user = models.ForeignKey( + User, on_delete=models.CASCADE, blank=True, null=True) created = models.DateTimeField('创建时间', auto_now_add=True) updated = models.DateTimeField('更新时间', auto_now=True) @@ -46,6 +53,8 @@ class Group(models.Model): return self.name # 矩阵管理员 + + class Group_admin(models.Model): id = models.UUIDField('id', primary_key=True, default=uuid.uuid4) user = models.ForeignKey( @@ -58,6 +67,8 @@ class Group_admin(models.Model): def __str__(self): return self.group.name # 矩阵成员 + + class Group_user(models.Model): id = models.UUIDField('id', primary_key=True, default=uuid.uuid4) user = models.ForeignKey( @@ -71,6 +82,8 @@ class Group_user(models.Model): return self.user.username # 单位类型 + + class Organizationtype(models.Model): id = models.UUIDField('id', primary_key=True, default=uuid.uuid4) organizationtype = models.CharField( @@ -94,8 +107,9 @@ class Organization(models.Model): district = models.CharField('县', max_length=256, null=True, blank=True) town = models.CharField('乡', max_length=256, null=True, blank=True) village = models.CharField('村', max_length=256, null=True, blank=True) - level = models.ForeignKey(Level,on_delete=models.CASCADE,null=True,blank=True) - directly = models.CharField('直属',max_length=256,null=True,blank=True) + level = models.ForeignKey( + Level, on_delete=models.CASCADE, null=True, blank=True) + directly = models.CharField('直属', max_length=256, null=True, blank=True) created = models.DateTimeField('创建时间', auto_now_add=True) updated = models.DateTimeField('更新时间', auto_now=True) @@ -148,8 +162,8 @@ class NewMedia(models.Model): Organization, on_delete=models.CASCADE, null=True, blank=True) status = models.CharField( '状态', max_length=256, null=True, blank=True, choices=NEWMEDIA_STATUS_CHOICES) - attention = models.CharField('关注量',null=True,blank=True,max_length=256) - remark = models.CharField('备注',null=True,blank=True,max_length=2560) + attention = models.CharField('关注量', null=True, blank=True, max_length=256) + remark = models.CharField('备注', null=True, blank=True, max_length=2560) created = models.DateTimeField('创建时间', auto_now_add=True) updated = models.DateTimeField('更新时间', auto_now=True) @@ -157,16 +171,158 @@ class NewMedia(models.Model): abstract = True ordering = ["-created"] + @classmethod + def category_one_count(cls): + t1 = Weixin.objects.exclude( + organization__province='' + ).filter( + organization__cities='', + organization__district='' + ).count() + t2 = Weibo.objects.exclude( + organization__province='' + ).filter( + organization__cities='', + organization__district='' + ).count() + t3 = Toutiao.objects.exclude( + organization__province='' + ).filter( + organization__cities='', + organization__district='' + ).count() + t4 = Douyin.objects.exclude( + organization__province='' + ).filter( + organization__cities='', + organization__district='' + ).count() + t5 = Qita.objects.exclude( + organization__province='' + ).filter( + organization__cities='', + organization__district='' + ).count() + return t1 + t2 + t3 + t4 + t5 + + @classmethod + def category_two_count(cls): + t1 = Weixin.objects.exclude( + organization__province='', + organization__cities='' + ).filter( + organization__district='' + ).count() + t2 = Weibo.objects.exclude( + organization__province='', + organization__cities='' + ).filter( + organization__district='' + ).count() + t3 = Toutiao.objects.exclude( + organization__province='', + organization__cities='' + ).filter( + organization__district='' + ).count() + t4 = Douyin.objects.exclude( + organization__province='', + organization__cities='' + ).filter( + organization__district='' + ).count() + t5 = Qita.objects.exclude( + organization__province='', + organization__cities='' + ).filter( + organization__district='' + ).count() + return t1 + t2 + t3 + t4 + t5 + + @classmethod + def category_three_count(cls): + t1 = Weixin.objects.exclude( + organization__province='', + organization__cities='', + organization__district='' + ).count() + t2 = Weibo.objects.exclude( + organization__province='', + organization__cities='', + organization__district='' + ).count() + t3 = Toutiao.objects.exclude( + organization__province='', + organization__cities='', + organization__district='' + ).count() + t4 = Douyin.objects.exclude( + organization__province='', + organization__cities='', + organization__district='' + ).count() + t5 = Qita.objects.exclude( + organization__province='', + organization__cities='', + organization__district='' + ).count() + return t1 + t2 + t3 + t4 + t5 + + @classmethod + def media_list(cls, organization_id): + weixin = Weixin.objects.filter(organization_id=organization_id) + weibo = Weibo.objects.filter(organization_id=organization_id) + toutiao = Toutiao.objects.filter(organization_id=organization_id) + douyin = Douyin.objects.filter(organization_id=organization_id) + qita = Qita.objects.filter(organization_id=organization_id) + results = [] + for o in weixin: + result = dict() + result['id'] = o.id + result['code'] = o.code + result['alias'] = o.alias + result['type'] = 'weixin' + results.append(result) + for o in weibo: + result = dict() + result['id'] = o.id + result['code'] = o.code + result['alias'] = o.alias + result['type'] = 'weibo' + results.append(result) + for o in toutiao: + result = dict() + result['id'] = o.id + result['code'] = o.code + result['alias'] = o.alias + result['type'] = 'toutiao' + results.append(result) + for o in douyin: + result = dict() + result['id'] = o.id + result['code'] = o.code + result['alias'] = o.alias + result['type'] = 'douyin' + results.append(result) + for o in qita: + result = dict() + result['id'] = o.id + result['code'] = o.code + result['alias'] = o.alias + result['type'] = 'qita' + results.append(result) + return results + + def __str__(self): return self.code + ':' + self.alias + # 微信公众号 class Weixin(NewMedia): weixinid = models.CharField('微信ID', max_length=256, null=True, blank=True) - - # 微信文章采集 class Weixin_data(models.Model): id = models.UUIDField('id', primary_key=True, default=uuid.uuid4) @@ -349,6 +505,8 @@ class Douyin_data(models.Model): def __str__(self): return self.mewnedia.code # 其他新媒体 + + class Qita(NewMedia): type = models.CharField('新媒体类型', max_length=256, null=True, blank=True) name = models.CharField('新媒体名称', max_length=256, null=True, blank=True) @@ -387,7 +545,9 @@ class Area_code_2020(models.Model): def __str__(self): return self.name -#新闻 +# 新闻 + + class News(models.Model): NEWMEDIA_NEWS_CHOICES = ( ('0', '政策依据'), @@ -396,15 +556,16 @@ class News(models.Model): ('3', '监测通报'), ('4', '舆情热点') ) - id = models.UUIDField('id',primary_key=True,default=uuid.uuid4) - type = models.CharField('文章类型',max_length=256,null=True,blank=True,choices=NEWMEDIA_NEWS_CHOICES) - source = models.CharField('文章来源',max_length=256,null=True,blank=True) - title = models.CharField('文章标题',max_length=256,null=True,blank=True) + id = models.UUIDField('id', primary_key=True, default=uuid.uuid4) + type = models.CharField('文章类型', max_length=256, null=True, + blank=True, choices=NEWMEDIA_NEWS_CHOICES) + source = models.CharField('文章来源', max_length=256, null=True, blank=True) + title = models.CharField('文章标题', max_length=256, null=True, blank=True) image = models.FileField( upload_to='news/%Y/%m/%d/', null=True, blank=True) - author = models.CharField('作者',max_length=256,null=True,blank=True) - date = models.DateField('发表日期',null=True,blank=True,max_length=256) - content = models.TextField('内容',null=True,blank=True) + author = models.CharField('作者', max_length=256, null=True, blank=True) + date = models.DateField('发表日期', null=True, blank=True, max_length=256) + content = models.TextField('内容', null=True, blank=True) def __str__(self): return self.title diff --git a/polls/templates/polls/monitor_statistics.html b/polls/templates/polls/monitor_statistics.html index 4b435bc..0c71189 100644 --- a/polls/templates/polls/monitor_statistics.html +++ b/polls/templates/polls/monitor_statistics.html @@ -4,7 +4,10 @@
-
+
+
+
+
@@ -15,17 +18,20 @@ var myChart = echarts.init(document.getElementById('chart1')); var option = { title: { - text: '新媒体占比', - left: 'center' + text: '政务新媒体种类分布', + left: 'center', + subtext: '总数量'+{{total}}, + subtextStyle: { + fontSize: 16, + } }, tooltip: { trigger: 'item', formatter: '{a}
{b} : {c} ({d}%)' }, legend: { - orient: 'vertical', - left: 'left', - data: ['微博', '公众号', '头条号', '抖音', '其它'] + top: '15%', + data: ['微信', '微博', '头条', '抖音', '其它'] }, series: [ { @@ -33,13 +39,7 @@ type: 'pie', radius: '55%', center: ['50%', '60%'], - data: [ - {value: {{wbc}}, name: '微博'}, - {value: {{wxc}}, name: '公众号'}, - {value: {{ttc}}, name: '头条号'}, - {value: {{dyc}}, name: '抖音'}, - {value: {{qtc}}, name: '其它'} - ], + data: {{chart1_data|safe}}, emphasis: { itemStyle: { shadowBlur: 10, @@ -50,5 +50,42 @@ } ]}; myChart.setOption(option); + + var myChart2 = echarts.init(document.getElementById('chart2')); + var option2 = { + title: { + text: '政务新媒体区域分布', + subtext: '省直总数{{total1}},市州总数{{total2}},县区总数{{total3}}', + subtextStyle: { + fontSize: 16, + }, + left: 'center' + }, + tooltip: { + trigger: 'item', + formatter: '{a}
{b} : {c} ({d}%)' + }, + legend: { + top: '15%', + data: ['兰州市', '兰州新区', '嘉峪关市', '金昌市', '白银市', '天水市', '武威市', '张掖市', '平谅市', '酒泉市', '庆阳市', '定西市', '陇南市', '临夏回族自治州','甘南藏族自治州'] + }, + series: [ + { + name: '总量', + type: 'pie', + radius: '50%', + center: ['50%', '70%'], + data: {{chart2_data|safe}}, + emphasis: { + itemStyle: { + shadowBlur: 10, + shadowOffsetX: 0, + shadowColor: 'rgba(0, 0, 0, 0.5)' + } + } + } + ]}; + + myChart2.setOption(option2); {% endblock %} \ No newline at end of file diff --git a/polls/views/__pycache__/media.cpython-38.pyc b/polls/views/__pycache__/media.cpython-38.pyc index 3e7a7f9..407856a 100644 Binary files a/polls/views/__pycache__/media.cpython-38.pyc and b/polls/views/__pycache__/media.cpython-38.pyc differ diff --git a/polls/views/__pycache__/monitor.cpython-38.pyc b/polls/views/__pycache__/monitor.cpython-38.pyc index f4516e0..406870f 100644 Binary files a/polls/views/__pycache__/monitor.cpython-38.pyc and b/polls/views/__pycache__/monitor.cpython-38.pyc differ diff --git a/polls/views/media.py b/polls/views/media.py index 11d3e2e..a360fca 100644 --- a/polls/views/media.py +++ b/polls/views/media.py @@ -2,7 +2,7 @@ from django.http import HttpResponse, JsonResponse from django.views.decorators.csrf import csrf_exempt from django.core.paginator import Paginator -from dashboard.models import Weixin, Weibo, Toutiao, Qita +from dashboard.models import NewMedia from polls.decorators import polls_login_required @@ -11,32 +11,9 @@ from polls.decorators import polls_login_required def medias(request): if request.method == 'POST': return HttpResponse(status=405) - category = request.POST.get('category', 'weixin') - if category == 'weixin': - q = Weixin.objects.filter(status=1) - elif category == 'weibo': - q = Weibo.objects.filter(status=1) - elif category == 'toutiao': - q = Toutiao.objects.filter(status=1) - else: - q = Qita.objects.filter(status=1) - results = [] - for o in q: - result = dict() - result['id'] = o.id - result['code'] = o.code - if category == 'weixin': - result['media_id'] = o.weixinid - elif category == 'weibo': - result['media_id'] = o.weixinid - elif category == 'toutiao': - result['media_id'] = o.weixinid - else: - result['media_id'] = o.weixinid - result['alias'] = o.alias - result['thumbnail'] = request.build_absolute_uri(o.image.url) - results.append(result) - return JsonResponse(results, safe=False) + organization_id = request.GET.get('organization_id') + new_medias = NewMedia.media_list(organization_id) + return JsonResponse({'status': 'success', 'message': new_medias}, safe=False) @csrf_exempt diff --git a/polls/views/monitor.py b/polls/views/monitor.py index 3312ef8..0202a3f 100644 --- a/polls/views/monitor.py +++ b/polls/views/monitor.py @@ -1,5 +1,24 @@ from django.shortcuts import render -from dashboard.models import Douyin, Qita, Toutiao, Weibo, Weixin +from dashboard.models import Douyin, NewMedia, Qita, Toutiao, Weibo, Weixin +from django.db.models import Count, Sum + +COMPARTMENTS = { + '620100000000': '兰州市', + '620200000000': '嘉峪关市', + '620300000000': '金昌市', + '620400000000': '白银市', + '620500000000': '天水市', + '620600000000': '武威市', + '620700000000': '张掖市', + '620800000000': '平凉市', + '620900000000': '酒泉市', + '621000000000': '庆阳市', + '621100000000': '定西市', + '621200000000': '陇南市', + '622900000000': '临夏回族自治州', + '623000000000': '甘南藏族自治州', + '620171000000': '兰州新区' +} def monitor_statistics(request): @@ -8,4 +27,77 @@ def monitor_statistics(request): ttc = Toutiao.objects.count() qtc = Qita.objects.count() dyc = Douyin.objects.count() - return render(request, 'polls/monitor_statistics.html', {'wbc': wbc, 'wxc': wxc, 'ttc': ttc, 'dyc': dyc, 'qtc': qtc}) + total = wbc+wxc+ttc+qtc+dyc + + chart1_data = [] + chart1_data.append({'name': '微信', 'value': wxc}) + chart1_data.append({'name': '微博', 'value': wbc}) + chart1_data.append({'name': '头条', 'value': ttc}) + chart1_data.append({'name': '抖音', 'value': dyc}) + chart1_data.append({'name': '其它', 'value': qtc}) + + results = dict() + q = Weixin.objects.values('organization__cities').order_by( + 'organization__cities').annotate(num_media=Count('organization__cities')) + for row in q: + code = row['organization__cities'] + compartment = COMPARTMENTS[code] + if code in results: + nums = results[compartment] + nums.append(row['num_media']) + else: + results[compartment] = [row['num_media']] + + q = Weibo.objects.values('organization__cities').order_by( + 'organization__cities').annotate(num_media=Count('organization__cities')) + for row in q: + code = row['organization__cities'] + compartment = COMPARTMENTS[code] + if compartment in results: + nums = results[compartment] + nums.append(row['num_media']) + else: + results[compartment] = [row['num_media']] + + q = Toutiao.objects.values('organization__cities').order_by( + 'organization__cities').annotate(num_media=Count('organization__cities')) + for row in q: + code = row['organization__cities'] + compartment = COMPARTMENTS[code] + if compartment in results: + nums = results[compartment] + nums.append(row['num_media']) + else: + results[compartment] = [row['num_media']] + + q = Douyin.objects.values('organization__cities').order_by( + 'organization__cities').annotate(num_media=Count('organization__cities')) + for row in q: + code = row['organization__cities'] + compartment = COMPARTMENTS[code] + if compartment in results: + nums = results[compartment] + nums.append(row['num_media']) + else: + results[compartment] = [row['num_media']] + + q = Qita.objects.values('organization__cities').order_by( + 'organization__cities').annotate(num_media=Count('organization__cities')) + for row in q: + code = row['organization__cities'] + compartment = COMPARTMENTS[code] + if compartment in results: + nums = results[compartment] + nums.append(row['num_media']) + else: + results[compartment] = [row['num_media']] + + chart2_data = [] + for k in results: + chart2_data.append({'name': k, 'value': sum(results[k])}) + + total1 = NewMedia.category_one_count() + total2 = NewMedia.category_two_count() + total3 = NewMedia.category_three_count() + + return render(request, 'polls/monitor_statistics.html', {'chart1_data': chart1_data, 'total': total, 'chart2_data': chart2_data, 'total1': total1, 'total2': total2, 'total3': total3})