Skip to content

Commit faeee1b

Browse files
authored
feat: log management (#3189)
1 parent d92fdb9 commit faeee1b

File tree

5 files changed

+171
-1
lines changed

5 files changed

+171
-1
lines changed

apps/common/log/log.py

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
# coding=utf-8
2+
"""
3+
@project: MaxKB
4+
@Author:虎虎
5+
@file: log.py
6+
@date:2025/6/4 14:13
7+
@desc:
8+
"""
9+
10+
from system_manage.models.log_management import Log
11+
12+
13+
def _get_ip_address(request):
14+
"""
15+
获取ip地址
16+
@param request:
17+
@return:
18+
"""
19+
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
20+
if x_forwarded_for:
21+
ip = x_forwarded_for.split(',')[0]
22+
else:
23+
ip = request.META.get('REMOTE_ADDR')
24+
return ip
25+
26+
27+
def _get_user(request):
28+
"""
29+
获取用户
30+
@param request:
31+
@return:
32+
"""
33+
user = request.user
34+
if user is None:
35+
return {
36+
37+
}
38+
return {
39+
"id": str(user.id),
40+
"email": user.email,
41+
"phone": user.phone,
42+
"nick_name": user.nick_name,
43+
"username": user.username,
44+
"role": user.role,
45+
}
46+
47+
48+
def _get_details(request):
49+
path = request.path
50+
body = request.data
51+
query = request.query_params
52+
return {
53+
'path': path,
54+
'body': body,
55+
'query': query
56+
}
57+
58+
59+
def log(menu: str, operate, get_user=_get_user, get_ip_address=_get_ip_address, get_details=_get_details,
60+
get_operation_object=None):
61+
"""
62+
记录审计日志
63+
@param menu: 操作菜单 str
64+
@param operate: 操作 str|func 如果是一个函数 入参将是一个request 响应为str def operate(request): return "操作菜单"
65+
@param get_user: 获取用户
66+
@param get_ip_address:获取IP地址
67+
@param get_details: 获取执行详情
68+
@param get_operation_object: 获取操作对象
69+
@return:
70+
"""
71+
72+
def inner(func):
73+
def run(view, request, **kwargs):
74+
status = 200
75+
operation_object = {}
76+
try:
77+
if get_operation_object is not None:
78+
operation_object = get_operation_object(request, kwargs)
79+
except Exception as e:
80+
pass
81+
try:
82+
return func(view, request, **kwargs)
83+
except Exception as e:
84+
status = 500
85+
raise e
86+
finally:
87+
ip = get_ip_address(request)
88+
user = get_user(request)
89+
details = get_details(request)
90+
_operate = operate
91+
if callable(operate):
92+
_operate = operate(request)
93+
# 插入审计日志
94+
Log(menu=menu, operate=_operate, user=user, status=status, ip_address=ip, details=details,
95+
operation_object=operation_object).save()
96+
97+
return run
98+
99+
return inner

apps/maxkb/conf.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ def get_db_setting(self) -> dict:
6161
}
6262
}
6363

64-
@staticmethod
6564
def get_cache_setting(self):
6665
return {
6766
'default': {
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# Generated by Django 5.2 on 2025-06-04 06:17
2+
3+
import common.encoder.encoder
4+
import uuid
5+
from django.db import migrations, models
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
('system_manage', '0003_workspaceuserresourcepermission_and_more'),
12+
]
13+
14+
operations = [
15+
migrations.CreateModel(
16+
name='Log',
17+
fields=[
18+
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
19+
('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')),
20+
('id', models.UUIDField(default=uuid.uuid1, editable=False, primary_key=True, serialize=False, verbose_name='主键id')),
21+
('menu', models.CharField(max_length=128, verbose_name='操作菜单')),
22+
('operate', models.CharField(max_length=128, verbose_name='操作')),
23+
('operation_object', models.JSONField(default=dict, encoder=common.encoder.encoder.SystemEncoder, verbose_name='操作对象')),
24+
('user', models.JSONField(default=dict, verbose_name='用户信息')),
25+
('status', models.IntegerField(verbose_name='状态')),
26+
('ip_address', models.CharField(max_length=128, verbose_name='ip地址')),
27+
('details', models.JSONField(default=dict, encoder=common.encoder.encoder.SystemEncoder, verbose_name='详情')),
28+
],
29+
options={
30+
'db_table': 'log',
31+
},
32+
),
33+
]

apps/system_manage/models/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@
88
"""
99
from .workspace_user_permission import *
1010
from .system_setting import *
11+
from .log_management import *
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# coding=utf-8
2+
"""
3+
@project: MaxKB
4+
@Author:虎虎
5+
@file: log_management.py
6+
@date:2025/6/4 14:15
7+
@desc:
8+
"""
9+
import uuid
10+
11+
from django.db import models
12+
13+
from common.encoder.encoder import SystemEncoder
14+
from common.mixins.app_model_mixin import AppModelMixin
15+
16+
17+
class Log(AppModelMixin):
18+
"""
19+
审计日志
20+
"""
21+
id = models.UUIDField(primary_key=True, max_length=128, default=uuid.uuid1, editable=False, verbose_name="主键id")
22+
23+
menu = models.CharField(max_length=128, verbose_name="操作菜单")
24+
25+
operate = models.CharField(max_length=128, verbose_name="操作")
26+
27+
operation_object = models.JSONField(verbose_name="操作对象", default=dict, encoder=SystemEncoder)
28+
29+
user = models.JSONField(verbose_name="用户信息", default=dict)
30+
31+
status = models.IntegerField(verbose_name="状态")
32+
33+
ip_address = models.CharField(max_length=128, verbose_name="ip地址")
34+
35+
details = models.JSONField(verbose_name="详情", default=dict, encoder=SystemEncoder)
36+
37+
class Meta:
38+
db_table = "log"

0 commit comments

Comments
 (0)