1
0
forked from erp-dev/erp

feat: added ApiAuditLog

This commit is contained in:
2026-01-12 11:52:41 +08:00
parent 3036cbdc5b
commit 5741a8cdef
7 changed files with 435 additions and 4 deletions

View File

@@ -113,12 +113,12 @@ class DataSync(ModelBase):
class MDYPlateOrderStaging(ModelBase):
"""明道云“开版数据表”同步暂存表(不影响 printing.PlateOrder
"""明道云"开版数据表"同步暂存表(不影响 printing.PlateOrder
设计目标:
- 与现有业务模型完全隔离,避免影响业务数据与流程
- 仅保留 rowid 便于检索排查,其余信息全部落在 raw(JSON) 中
- 随着同步深入再逐步“属性化”字段(从 raw 实时提取/映射)
- 随着同步深入再逐步"属性化"字段(从 raw 实时提取/映射)
"""
mdy_rowid = models.CharField(
@@ -161,7 +161,7 @@ class MDYPlateOrderStaging(ModelBase):
verbose_name_plural = '明道云开版暂存'
ordering = ['-created_at']
indexes = [
# 明道云字段62d52f4b8d2972284492dd0e开版表订单id/设计编号
# 明道云字段62d52f4b8d2972284492dd0e开版表"订单id/设计编号"
# 用于在暂存表中按该字段快速检索
models.Index(
KeyTextTransform('62d52f4b8d2972284492dd0e', 'raw'),
@@ -171,3 +171,69 @@ class MDYPlateOrderStaging(ModelBase):
def __str__(self):
return f'{self.mdy_rowid}'
class ApiAuditLog(models.Model):
"""API审计日志 - 记录创建操作的历史现场
用于保存特定模块的POST请求记录"创建"操作的完整请求信息。
通过Celery异步写入避免影响API响应性能。
"""
url = models.CharField(
max_length=500,
verbose_name='请求URL',
help_text='完整的请求路径'
)
method = models.CharField(
max_length=10,
verbose_name='请求方法',
help_text='HTTP方法如POST'
)
request_data = models.JSONField(
default=dict,
verbose_name='请求体数据',
help_text='POST请求的body数据JSON格式'
)
query_params = models.JSONField(
default=dict,
verbose_name='查询参数',
help_text='URL查询参数'
)
user_id = models.IntegerField(
null=True,
blank=True,
db_index=True,
verbose_name='用户ID',
help_text='操作用户的ID'
)
username = models.CharField(
max_length=150,
blank=True,
default='',
verbose_name='用户名',
help_text='操作用户的用户名快照'
)
response_status = models.IntegerField(
null=True,
blank=True,
verbose_name='响应状态码',
help_text='HTTP响应状态码'
)
created_at = models.DateTimeField(
auto_now_add=True,
db_index=True,
verbose_name='创建时间'
)
class Meta:
db_table = 'api_audit_log'
verbose_name = 'API审计日志'
verbose_name_plural = 'API审计日志'
ordering = ['-created_at']
indexes = [
models.Index(fields=['user_id', 'created_at']),
models.Index(fields=['url', 'created_at']),
]
def __str__(self):
return f'{self.method} {self.url} ({self.username or "anonymous"}) - {self.response_status}'