django-vue-admin/backend/dvadmin/system/views/datav.py

128 lines
5.5 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2023/4/14 15:49
# @Author : harry
import datetime
import json
import re
import time
from django.db.models import Count
from rest_framework.decorators import action
from rest_framework.permissions import IsAuthenticated
from rest_framework.viewsets import GenericViewSet
from conf.env import DATABASE_USER, DATABASE_NAME
from dvadmin.system.models import Users, LoginLog, FileList
from dvadmin.system.views.login_log import LoginLogSerializer
from dvadmin.utils.json_response import DetailResponse
from django.db import connection
def jx_timestamp():
cur_time = datetime.datetime.now()
a = datetime.datetime.strftime(cur_time, '%Y-%m-%d %H:%M:%S')
timeStamp = int(time.mktime(time.strptime(a, "%Y-%m-%d %H:%M:%S")))
timeArray = time.localtime(timeStamp)
otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
return otherStyleTime
class DataVViewSet(GenericViewSet):
queryset = LoginLog.objects.all()
serializer_class = LoginLogSerializer
extra_filter_backends = []
ordering_fields = ['create_datetime']
@action(methods=["GET"], detail=False, permission_classes=[IsAuthenticated])
def homepage_statistics(self, request):
# Users 新增
# LoginLog # 最后登录
timestr = jx_timestamp().split(" ")
min_time = datetime.datetime.strptime(timestr[0] + " " + "00:00:00", "%Y-%m-%d %H:%M:%S")
max_time = datetime.datetime.strptime(timestr[0] + " " + "23:59:59", "%Y-%m-%d %H:%M:%S")
# 今日注册
today_register = Users.objects.filter(create_datetime__gte=min_time, is_superuser=0).count()
# 今日登录
today_login = len(set(LoginLog.objects.filter(create_datetime__gte=min_time).values_list('username')))
# 三日新增
Three_days_register = Users.objects.filter(
create_datetime__gte=min_time - datetime.timedelta(days=3), is_superuser=0).count()
# 七日新增
Seven_days_register = Users.objects.filter(
create_datetime__gte=min_time - datetime.timedelta(days=7), is_superuser=0).count()
# 七日活跃
Seven_days_login = len(set(LoginLog.objects.filter(
create_datetime__gte=min_time - datetime.timedelta(days=7)).values_list('username')))
# 月活跃
month_login = len(set(LoginLog.objects.filter(
create_datetime__gte=min_time - datetime.timedelta(days=30)).values_list('username')))
# 七日用户登录数
sum_days_login_list = []
for i in range(7):
sum_days_login_list.append({"time": (min_time + datetime.timedelta(days=-i)).strftime("%Y-%m-%d"),
"count": len(set(LoginLog.objects.filter(
create_datetime__lte=max_time - datetime.timedelta(days=i),
create_datetime__gte=min_time - datetime.timedelta(days=i)).values_list(
'username')))})
# 七日注册用户数
sum_days_register_list = []
for i in range(7):
sum_days_register_list.append(
{"time": (min_time + datetime.timedelta(days=-i)).strftime("%Y-%m-%d"), "count": Users.objects.filter(
create_datetime__lte=max_time - datetime.timedelta(days=i),
create_datetime__gte=min_time - datetime.timedelta(days=i), is_superuser=0).count()})
# 用户总数
sum_register = Users.objects.filter(is_superuser=0).count()
# FileList 附件
today_f_l = FileList.objects.filter(create_datetime__gte=min_time).count()
sum_f_l = FileList.objects.all().count()
# 今日附件
today_file = {'count': today_f_l, "occupy_space": 0}
# 总附件
sum_file = {'count': sum_f_l, "occupy_space": 0}
# 获取游标对象
cursor = connection.cursor()
# 拿到游标对象后执行sql语句
cursor.execute("show tables;")
# 获取所有的数据
rows = cursor.fetchall()
tables_list = []
for row in rows:
tables_list.append(row)
# cursor.execute(
# "select table_schema as db, table_name as tb, table_rows as data_rows, index_length / 1024 as 'storage(KB)' from information_schema.tables where table_schema='{}';".format(
# DATABASE_NAME))
cursor.execute(
"select table_schema as table_db, sum(index_length) as storage,count(table_name ) as tables from information_schema.tables group by table_schema having table_db='{}';".format(
DATABASE_NAME))
rows = cursor.fetchall()
count = 0
space = 0
for row in rows:
count = row[2]
space = round(row[1] / 1024 / 1024, 2)
database_info = {"count": count, "space": space}
data = {
"today_register": today_register,
"today_login": today_login,
"Three_days_register": Three_days_register,
"Seven_days_register": Seven_days_register,
"Seven_days_login": Seven_days_login,
"month_login": month_login,
"sum_days_login_list": sum_days_login_list,
"sum_days_register_list": sum_days_register_list,
"sum_register": sum_register,
"today_file": today_file,
"sum_file": sum_file,
"database_info": database_info,
}
return DetailResponse(data=data, msg="获取成功")