initial commit
This commit is contained in:
0
apps/system/__init__.py
Normal file
0
apps/system/__init__.py
Normal file
BIN
apps/system/__pycache__/__init__.cpython-313.pyc
Normal file
BIN
apps/system/__pycache__/__init__.cpython-313.pyc
Normal file
Binary file not shown.
BIN
apps/system/__pycache__/__init__.cpython-38.pyc
Normal file
BIN
apps/system/__pycache__/__init__.cpython-38.pyc
Normal file
Binary file not shown.
BIN
apps/system/__pycache__/admin.cpython-313.pyc
Normal file
BIN
apps/system/__pycache__/admin.cpython-313.pyc
Normal file
Binary file not shown.
BIN
apps/system/__pycache__/admin.cpython-38.pyc
Normal file
BIN
apps/system/__pycache__/admin.cpython-38.pyc
Normal file
Binary file not shown.
BIN
apps/system/__pycache__/apps.cpython-313.pyc
Normal file
BIN
apps/system/__pycache__/apps.cpython-313.pyc
Normal file
Binary file not shown.
BIN
apps/system/__pycache__/apps.cpython-38.pyc
Normal file
BIN
apps/system/__pycache__/apps.cpython-38.pyc
Normal file
Binary file not shown.
BIN
apps/system/__pycache__/models.cpython-313.pyc
Normal file
BIN
apps/system/__pycache__/models.cpython-313.pyc
Normal file
Binary file not shown.
BIN
apps/system/__pycache__/models.cpython-38.pyc
Normal file
BIN
apps/system/__pycache__/models.cpython-38.pyc
Normal file
Binary file not shown.
3
apps/system/admin.py
Normal file
3
apps/system/admin.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
5
apps/system/apps.py
Normal file
5
apps/system/apps.py
Normal file
@@ -0,0 +1,5 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
class SystemConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'apps.system'
|
||||
4
apps/system/controllers/__init__.py
Normal file
4
apps/system/controllers/__init__.py
Normal file
@@ -0,0 +1,4 @@
|
||||
# 导入下面的控制器
|
||||
from apps.system.controllers.log import LogController
|
||||
# 暴露控制器变量
|
||||
__all__ = ['LogController']
|
||||
BIN
apps/system/controllers/__pycache__/__init__.cpython-313.pyc
Normal file
BIN
apps/system/controllers/__pycache__/__init__.cpython-313.pyc
Normal file
Binary file not shown.
BIN
apps/system/controllers/__pycache__/__init__.cpython-38.pyc
Normal file
BIN
apps/system/controllers/__pycache__/__init__.cpython-38.pyc
Normal file
Binary file not shown.
BIN
apps/system/controllers/__pycache__/log.cpython-313.pyc
Normal file
BIN
apps/system/controllers/__pycache__/log.cpython-313.pyc
Normal file
Binary file not shown.
BIN
apps/system/controllers/__pycache__/log.cpython-38.pyc
Normal file
BIN
apps/system/controllers/__pycache__/log.cpython-38.pyc
Normal file
Binary file not shown.
78
apps/system/controllers/log.py
Normal file
78
apps/system/controllers/log.py
Normal file
@@ -0,0 +1,78 @@
|
||||
from typing import List
|
||||
from datetime import datetime, timedelta
|
||||
from ninja_extra import api_controller, ControllerBase, route
|
||||
from ninja_jwt.authentication import JWTAuth
|
||||
from ninja_extra.permissions import IsAuthenticated
|
||||
from django.db.transaction import atomic
|
||||
from apps.system.models import LoginLog, OperationLog
|
||||
from utils.chen_pagination import MyPagination
|
||||
from ninja.pagination import paginate
|
||||
from ninja import Query
|
||||
from utils.chen_response import ChenResponse
|
||||
# 导入schemas
|
||||
from apps.system.schemas.log import LogOutSchema, OperationLogOutSchema, LoginLogOutSchema, DeleteInputSchema
|
||||
|
||||
@api_controller("/system/log", auth=JWTAuth(), permissions=[IsAuthenticated], tags=['日志相关'])
|
||||
class LogController(ControllerBase):
|
||||
@route.get('/list', response=List[LogOutSchema])
|
||||
@atomic
|
||||
def get_login_log(self):
|
||||
"""获取当前用户的登录日志"""
|
||||
user = self.context.request.user
|
||||
log_qs = LoginLog.objects.filter(creator=user)
|
||||
logs = log_qs[:5]
|
||||
return logs
|
||||
|
||||
@route.get('/operations', response=List[OperationLogOutSchema])
|
||||
@atomic
|
||||
def get_operations(self):
|
||||
"""获取当前用户操作日志"""
|
||||
user = self.context.request.user
|
||||
log_qs = OperationLog.objects.filter(creator=user)
|
||||
return log_qs[:5]
|
||||
|
||||
# 操作日志:查询
|
||||
@route.get('/operationsPagination', response=List[OperationLogOutSchema])
|
||||
@atomic
|
||||
@paginate(MyPagination)
|
||||
def get_operations_pagination(self, request_username: str = None):
|
||||
logs = OperationLog.objects.all()
|
||||
if request_username is None:
|
||||
request_username = ''
|
||||
qs = logs.filter(request_username__icontains=request_username)
|
||||
return qs
|
||||
|
||||
# 操作日志:根据请求参数天数删除
|
||||
@route.get('/operationsDel')
|
||||
@atomic
|
||||
def operation_delete_log(self, payload: DeleteInputSchema = Query(...)):
|
||||
time = datetime.now() - timedelta(days=payload.day)
|
||||
log_qs = OperationLog.objects.filter(create_datetime__lt=time)
|
||||
log_qs.delete()
|
||||
if payload.day > 0:
|
||||
return ChenResponse(message=f'删除{payload.day}天前数据成功')
|
||||
else:
|
||||
return ChenResponse(message='全部日志删除成功')
|
||||
|
||||
# 登录日志:查询
|
||||
@route.get('/loginLogsList', response=List[LoginLogOutSchema])
|
||||
@atomic
|
||||
@paginate(MyPagination)
|
||||
def get_login_logs(self, username: str = None):
|
||||
logs = LoginLog.objects.all()
|
||||
if username is None:
|
||||
username = ''
|
||||
qs = logs.filter(username__icontains=username)
|
||||
return qs
|
||||
|
||||
# 登录日志:根据请求参数天数删除
|
||||
@route.get('/loginLogsDel')
|
||||
@atomic
|
||||
def login_logs_delete(self, payload: DeleteInputSchema = Query(...)):
|
||||
time = datetime.now() - timedelta(days=payload.day)
|
||||
log_qs = LoginLog.objects.filter(create_datetime__lt=time)
|
||||
log_qs.delete()
|
||||
if payload.day > 0:
|
||||
return ChenResponse(message=f'删除{payload.day}天前数据成功')
|
||||
else:
|
||||
return ChenResponse(message='全部日志删除成功')
|
||||
72
apps/system/migrations/0001_initial.py
Normal file
72
apps/system/migrations/0001_initial.py
Normal file
@@ -0,0 +1,72 @@
|
||||
# Generated by Django 4.2.13 on 2024-07-03 10:38
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='OperationLog',
|
||||
fields=[
|
||||
('id', models.BigAutoField(help_text='Id', primary_key=True, serialize=False, verbose_name='Id')),
|
||||
('remark', models.CharField(blank=True, help_text='描述', max_length=255, null=True, verbose_name='描述')),
|
||||
('modifier', models.CharField(blank=True, help_text='修改人', max_length=255, null=True, verbose_name='修改人')),
|
||||
('request_username', models.CharField(blank=True, help_text='请求用户', max_length=50, null=True, verbose_name='请求用户')),
|
||||
('request_modular', models.CharField(blank=True, help_text='请求模块', max_length=64, null=True, verbose_name='请求模块')),
|
||||
('request_path', models.CharField(blank=True, help_text='请求地址', max_length=400, null=True, verbose_name='请求地址')),
|
||||
('request_body', models.TextField(blank=True, help_text='请求参数', null=True, verbose_name='请求参数')),
|
||||
('request_method', models.CharField(blank=True, help_text='请求方式', max_length=8, null=True, verbose_name='请求方式')),
|
||||
('request_msg', models.TextField(blank=True, help_text='操作说明', null=True, verbose_name='操作说明')),
|
||||
('request_ip', models.CharField(blank=True, help_text='请求ip地址', max_length=32, null=True, verbose_name='请求ip地址')),
|
||||
('request_browser', models.CharField(blank=True, help_text='请求浏览器', max_length=64, null=True, verbose_name='请求浏览器')),
|
||||
('response_code', models.CharField(blank=True, help_text='响应状态码', max_length=32, null=True, verbose_name='响应状态码')),
|
||||
('request_os', models.CharField(blank=True, help_text='操作系统', max_length=64, null=True, verbose_name='操作系统')),
|
||||
('json_result', models.TextField(blank=True, help_text='返回信息', null=True, verbose_name='返回信息')),
|
||||
('status', models.BooleanField(default=False, help_text='响应状态', verbose_name='响应状态')),
|
||||
('update_datetime', models.DateTimeField(auto_now=True, help_text='修改时间', null=True, verbose_name='修改时间')),
|
||||
('create_datetime', models.DateTimeField(auto_now_add=True, help_text='创建时间', null=True, verbose_name='创建时间')),
|
||||
('sort', models.IntegerField(blank=True, default=1, help_text='显示排序', null=True, verbose_name='显示排序')),
|
||||
('creator', models.ForeignKey(db_constraint=False, help_text='创建人', null=True, on_delete=django.db.models.deletion.SET_NULL, related_query_name='creator_query', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '操作日志',
|
||||
'verbose_name_plural': '操作日志',
|
||||
'db_table': 'system_operation_log',
|
||||
'ordering': ('-create_datetime',),
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='LoginLog',
|
||||
fields=[
|
||||
('id', models.BigAutoField(help_text='Id', primary_key=True, serialize=False, verbose_name='Id')),
|
||||
('remark', models.CharField(blank=True, help_text='描述', max_length=255, null=True, verbose_name='描述')),
|
||||
('modifier', models.CharField(blank=True, help_text='修改人', max_length=255, null=True, verbose_name='修改人')),
|
||||
('username', models.CharField(blank=True, help_text='登录用户名', max_length=32, null=True, verbose_name='登录用户名')),
|
||||
('ip', models.CharField(blank=True, help_text='登录ip', max_length=32, null=True, verbose_name='登录ip')),
|
||||
('agent', models.TextField(blank=True, help_text='agent信息', null=True, verbose_name='agent信息')),
|
||||
('browser', models.CharField(blank=True, help_text='浏览器名', max_length=200, null=True, verbose_name='浏览器名')),
|
||||
('os', models.CharField(blank=True, help_text='操作系统', max_length=200, null=True, verbose_name='操作系统')),
|
||||
('country', models.CharField(blank=True, help_text='国家', max_length=50, null=True, verbose_name='国家')),
|
||||
('login_type', models.IntegerField(choices=[(1, '普通登录')], default=1, help_text='登录类型', verbose_name='登录类型')),
|
||||
('update_datetime', models.DateTimeField(auto_now=True, help_text='修改时间', null=True, verbose_name='修改时间')),
|
||||
('create_datetime', models.DateTimeField(auto_now_add=True, help_text='创建时间', null=True, verbose_name='创建时间')),
|
||||
('sort', models.IntegerField(blank=True, default=1, help_text='显示排序', null=True, verbose_name='显示排序')),
|
||||
('creator', models.ForeignKey(db_constraint=False, help_text='创建人', null=True, on_delete=django.db.models.deletion.SET_NULL, related_query_name='creator_query', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '登录日志',
|
||||
'verbose_name_plural': '登录日志',
|
||||
'db_table': 'system_login_log',
|
||||
'ordering': ('-create_datetime',),
|
||||
},
|
||||
),
|
||||
]
|
||||
0
apps/system/migrations/__init__.py
Normal file
0
apps/system/migrations/__init__.py
Normal file
BIN
apps/system/migrations/__pycache__/0001_initial.cpython-313.pyc
Normal file
BIN
apps/system/migrations/__pycache__/0001_initial.cpython-313.pyc
Normal file
Binary file not shown.
BIN
apps/system/migrations/__pycache__/0001_initial.cpython-38.pyc
Normal file
BIN
apps/system/migrations/__pycache__/0001_initial.cpython-38.pyc
Normal file
Binary file not shown.
BIN
apps/system/migrations/__pycache__/__init__.cpython-313.pyc
Normal file
BIN
apps/system/migrations/__pycache__/__init__.cpython-313.pyc
Normal file
Binary file not shown.
BIN
apps/system/migrations/__pycache__/__init__.cpython-38.pyc
Normal file
BIN
apps/system/migrations/__pycache__/__init__.cpython-38.pyc
Normal file
Binary file not shown.
66
apps/system/models.py
Normal file
66
apps/system/models.py
Normal file
@@ -0,0 +1,66 @@
|
||||
from django.db import models
|
||||
from cdtestplant_v1 import settings
|
||||
|
||||
class LoginLog(models.Model):
|
||||
id = models.BigAutoField(primary_key=True, help_text="Id", verbose_name="Id")
|
||||
remark = models.CharField(max_length=255, verbose_name="描述", null=True, blank=True, help_text="描述")
|
||||
creator = models.ForeignKey(to=settings.AUTH_USER_MODEL, related_query_name='creator_query', null=True,
|
||||
verbose_name='创建人', help_text="创建人", on_delete=models.SET_NULL, db_constraint=False)
|
||||
modifier = models.CharField(max_length=255, null=True, blank=True, help_text="修改人", verbose_name="修改人")
|
||||
LOGIN_TYPE_CHOICES = (
|
||||
(1, '普通登录'),
|
||||
)
|
||||
username = models.CharField(max_length=32, verbose_name="登录用户名", null=True, blank=True, help_text="登录用户名")
|
||||
ip = models.CharField(max_length=32, verbose_name="登录ip", null=True, blank=True, help_text="登录ip")
|
||||
agent = models.TextField(verbose_name="agent信息", null=True, blank=True, help_text="agent信息")
|
||||
browser = models.CharField(max_length=200, verbose_name="浏览器名", null=True, blank=True, help_text="浏览器名")
|
||||
os = models.CharField(max_length=200, verbose_name="操作系统", null=True, blank=True, help_text="操作系统")
|
||||
country = models.CharField(max_length=50, verbose_name="国家", null=True, blank=True, help_text="国家")
|
||||
login_type = models.IntegerField(default=1, choices=LOGIN_TYPE_CHOICES, verbose_name="登录类型",
|
||||
help_text="登录类型")
|
||||
update_datetime = models.DateTimeField(auto_now=True, null=True, blank=True, help_text="修改时间", verbose_name="修改时间")
|
||||
create_datetime = models.DateTimeField(auto_now_add=True, null=True, blank=True, help_text="创建时间",
|
||||
verbose_name="创建时间")
|
||||
sort = models.IntegerField(default=1, null=True, blank=True, verbose_name="显示排序", help_text="显示排序")
|
||||
|
||||
class Meta:
|
||||
db_table = 'system_login_log'
|
||||
verbose_name = '登录日志'
|
||||
verbose_name_plural = verbose_name
|
||||
ordering = ('-create_datetime',)
|
||||
|
||||
class OperationLog(models.Model):
|
||||
id = models.BigAutoField(primary_key=True, help_text="Id", verbose_name="Id")
|
||||
remark = models.CharField(max_length=255, verbose_name="描述", null=True, blank=True, help_text="描述")
|
||||
creator = models.ForeignKey(to=settings.AUTH_USER_MODEL, related_query_name='creator_query', null=True,
|
||||
verbose_name='创建人', help_text="创建人", on_delete=models.SET_NULL, db_constraint=False)
|
||||
modifier = models.CharField(max_length=255, null=True, blank=True, help_text="修改人", verbose_name="修改人")
|
||||
request_username = models.CharField(max_length=50, blank=True, null=True, verbose_name="请求用户",
|
||||
help_text="请求用户")
|
||||
request_modular = models.CharField(max_length=64, verbose_name="请求模块", null=True, blank=True,
|
||||
help_text="请求模块")
|
||||
request_path = models.CharField(max_length=400, verbose_name="请求地址", null=True, blank=True,
|
||||
help_text="请求地址")
|
||||
request_body = models.TextField(verbose_name="请求参数", null=True, blank=True, help_text="请求参数")
|
||||
request_method = models.CharField(max_length=8, verbose_name="请求方式", null=True, blank=True,
|
||||
help_text="请求方式")
|
||||
request_msg = models.TextField(verbose_name="操作说明", null=True, blank=True, help_text="操作说明")
|
||||
request_ip = models.CharField(max_length=32, verbose_name="请求ip地址", null=True, blank=True,
|
||||
help_text="请求ip地址")
|
||||
request_browser = models.CharField(max_length=64, verbose_name="请求浏览器", null=True, blank=True,
|
||||
help_text="请求浏览器")
|
||||
response_code = models.CharField(max_length=32, verbose_name="响应状态码", null=True, blank=True,
|
||||
help_text="响应状态码")
|
||||
request_os = models.CharField(max_length=64, verbose_name="操作系统", null=True, blank=True, help_text="操作系统")
|
||||
json_result = models.TextField(verbose_name="返回信息", null=True, blank=True, help_text="返回信息")
|
||||
status = models.BooleanField(default=False, verbose_name="响应状态", help_text="响应状态")
|
||||
update_datetime = models.DateTimeField(auto_now=True, null=True, blank=True, help_text="修改时间", verbose_name="修改时间")
|
||||
create_datetime = models.DateTimeField(auto_now_add=True, null=True, blank=True, help_text="创建时间",
|
||||
verbose_name="创建时间")
|
||||
sort = models.IntegerField(default=1, null=True, blank=True, verbose_name="显示排序", help_text="显示排序")
|
||||
|
||||
class Meta:
|
||||
db_table = 'system_operation_log'
|
||||
verbose_name = '操作日志'
|
||||
verbose_name_plural = verbose_name
|
||||
ordering = ('-create_datetime',)
|
||||
0
apps/system/schemas/__init__.py
Normal file
0
apps/system/schemas/__init__.py
Normal file
BIN
apps/system/schemas/__pycache__/__init__.cpython-313.pyc
Normal file
BIN
apps/system/schemas/__pycache__/__init__.cpython-313.pyc
Normal file
Binary file not shown.
BIN
apps/system/schemas/__pycache__/__init__.cpython-38.pyc
Normal file
BIN
apps/system/schemas/__pycache__/__init__.cpython-38.pyc
Normal file
Binary file not shown.
BIN
apps/system/schemas/__pycache__/log.cpython-313.pyc
Normal file
BIN
apps/system/schemas/__pycache__/log.cpython-313.pyc
Normal file
Binary file not shown.
BIN
apps/system/schemas/__pycache__/log.cpython-38.pyc
Normal file
BIN
apps/system/schemas/__pycache__/log.cpython-38.pyc
Normal file
Binary file not shown.
24
apps/system/schemas/log.py
Normal file
24
apps/system/schemas/log.py
Normal file
@@ -0,0 +1,24 @@
|
||||
from ninja import ModelSchema, Field, Schema
|
||||
from apps.system.models import LoginLog, OperationLog
|
||||
|
||||
# 1.登录日志输出schema - 前五条
|
||||
class LogOutSchema(ModelSchema):
|
||||
class Meta:
|
||||
model = LoginLog
|
||||
fields = ['id', 'username', 'agent', 'ip', 'browser', 'os', 'create_datetime']
|
||||
|
||||
# 2.操作日志输出shcema - 前五条
|
||||
class OperationLogOutSchema(ModelSchema):
|
||||
class Meta:
|
||||
model = OperationLog
|
||||
exclude = ['remark', 'modifier', 'request_modular', 'request_msg', 'sort', 'creator']
|
||||
|
||||
# 3.登录日志输出schema
|
||||
class LoginLogOutSchema(ModelSchema):
|
||||
class Meta:
|
||||
model = LoginLog
|
||||
exclude = ['remark', 'modifier', 'country', 'sort', 'creator']
|
||||
|
||||
# 4.删除日志的Schema
|
||||
class DeleteInputSchema(Schema):
|
||||
day: int = Field(7, ge=0)
|
||||
3
apps/system/tests.py
Normal file
3
apps/system/tests.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
3
apps/system/views.py
Normal file
3
apps/system/views.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.shortcuts import render
|
||||
|
||||
# Create your views here.
|
||||
Reference in New Issue
Block a user