initial commit

This commit is contained in:
2025-04-29 18:09:00 +08:00
commit 4faed52de5
690 changed files with 13481 additions and 0 deletions

0
apps/system/__init__.py Normal file
View File

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

3
apps/system/admin.py Normal file
View File

@@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

5
apps/system/apps.py Normal file
View File

@@ -0,0 +1,5 @@
from django.apps import AppConfig
class SystemConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.system'

View File

@@ -0,0 +1,4 @@
# 导入下面的控制器
from apps.system.controllers.log import LogController
# 暴露控制器变量
__all__ = ['LogController']

Binary file not shown.

View 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='全部日志删除成功')

View 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',),
},
),
]

View File

66
apps/system/models.py Normal file
View 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',)

View File

Binary file not shown.

Binary file not shown.

View 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
View File

@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

3
apps/system/views.py Normal file
View File

@@ -0,0 +1,3 @@
from django.shortcuts import render
# Create your views here.