sync from local backup
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
# Generated by Django 5.2.12 on 2026-06-15 20:07
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='ErrorLog',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('timestamp', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='发生时间')),
|
||||
('level', models.CharField(choices=[('DEBUG', 'DEBUG'), ('INFO', 'INFO'), ('WARNING', 'WARNING'), ('ERROR', 'ERROR'), ('CRITICAL', 'CRITICAL')], db_index=True, default='ERROR', max_length=20, verbose_name='日志级别')),
|
||||
('message', models.TextField(verbose_name='日志消息')),
|
||||
('module', models.CharField(blank=True, db_index=True, default='', max_length=100, verbose_name='发生模块')),
|
||||
('function', models.CharField(blank=True, default='', max_length=100, verbose_name='发生函数')),
|
||||
('line_number', models.IntegerField(blank=True, null=True, verbose_name='行号')),
|
||||
('exception_type', models.CharField(blank=True, default='', max_length=200, verbose_name='异常类型')),
|
||||
('traceback', models.TextField(blank=True, default='', verbose_name='堆栈信息')),
|
||||
('ip_address', models.GenericIPAddressField(blank=True, null=True, verbose_name='IP地址')),
|
||||
('path', models.CharField(blank=True, default='', max_length=255, verbose_name='请求路径')),
|
||||
('request_data', models.TextField(blank=True, default='', verbose_name='请求数据')),
|
||||
('is_resolved', models.BooleanField(db_index=True, default=False, verbose_name='是否已处理')),
|
||||
('resolved_at', models.DateTimeField(blank=True, null=True, verbose_name='处理时间')),
|
||||
('hash_key', models.CharField(db_index=True, max_length=64, unique=True, verbose_name='错误Hash')),
|
||||
('occurrence_count', models.IntegerField(default=1, verbose_name='出现次数')),
|
||||
('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='error_logs', to=settings.AUTH_USER_MODEL, verbose_name='用户')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '错误日志',
|
||||
'verbose_name_plural': '错误日志',
|
||||
'ordering': ['-timestamp'],
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='SystemEventLog',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('timestamp', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='事件时间')),
|
||||
('event_type', models.CharField(choices=[('login', '用户登录'), ('logout', '用户登出'), ('register', '用户注册'), ('password_reset', '密码重置'), ('password_change', '密码修改'), ('profile_update', '资料更新'), ('phone_bind', '手机绑定'), ('email_bind', '邮箱绑定'), ('avatar_upload', '头像上传'), ('checkin', '每日签到'), ('points_change', '积分变动'), ('coins_change', 'y币变动'), ('article_create', '文章创建'), ('article_update', '文章更新'), ('article_delete', '文章删除'), ('comment_create', '评论创建'), ('favorite_add', '收藏添加'), ('favorite_remove', '收藏取消'), ('blacklist_add', '拉黑用户'), ('blacklist_remove', '取消拉黑'), ('admin_action', '管理员操作'), ('system_error', '系统错误'), ('other', '其他')], db_index=True, max_length=50, verbose_name='事件类型')),
|
||||
('description', models.CharField(blank=True, default='', max_length=500, verbose_name='描述')),
|
||||
('metadata', models.JSONField(blank=True, default=dict, verbose_name='额外数据')),
|
||||
('ip_address', models.GenericIPAddressField(blank=True, null=True, verbose_name='IP地址')),
|
||||
('user_agent', models.CharField(blank=True, default='', max_length=500, verbose_name='User-Agent')),
|
||||
('result', models.CharField(choices=[('success', '成功'), ('failed', '失败'), ('partial', '部分成功')], db_index=True, default='success', max_length=20, verbose_name='结果')),
|
||||
('target_user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='targeted_event_logs', to=settings.AUTH_USER_MODEL, verbose_name='目标用户')),
|
||||
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='system_event_logs', to=settings.AUTH_USER_MODEL, verbose_name='操作用户')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '系统事件日志',
|
||||
'verbose_name_plural': '系统事件日志',
|
||||
'ordering': ['-timestamp'],
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='ApiRequestLog',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('timestamp', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='请求时间')),
|
||||
('username', models.CharField(blank=True, default='', max_length=150, verbose_name='用户名')),
|
||||
('ip_address', models.GenericIPAddressField(blank=True, db_index=True, null=True, verbose_name='IP地址')),
|
||||
('user_agent', models.CharField(blank=True, default='', max_length=500, verbose_name='User-Agent')),
|
||||
('method', models.CharField(db_index=True, max_length=10, verbose_name='HTTP方法')),
|
||||
('path', models.CharField(db_index=True, max_length=255, verbose_name='请求路径')),
|
||||
('query_string', models.TextField(blank=True, default='', verbose_name='查询参数')),
|
||||
('request_body', models.TextField(blank=True, default='', verbose_name='请求体')),
|
||||
('status_code', models.IntegerField(db_index=True, verbose_name='状态码')),
|
||||
('response_size', models.IntegerField(default=0, verbose_name='响应大小(字节)')),
|
||||
('duration_ms', models.FloatField(db_index=True, verbose_name='耗时(毫秒)')),
|
||||
('app_name', models.CharField(blank=True, db_index=True, default='', max_length=50, verbose_name='应用模块')),
|
||||
('is_error', models.BooleanField(db_index=True, default=False, verbose_name='是否错误')),
|
||||
('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='api_request_logs', to=settings.AUTH_USER_MODEL, verbose_name='用户')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'API请求日志',
|
||||
'verbose_name_plural': 'API请求日志',
|
||||
'ordering': ['-timestamp'],
|
||||
'indexes': [models.Index(fields=['timestamp', '-duration_ms'], name='idx_request_time_duration'), models.Index(fields=['status_code', 'timestamp'], name='idx_request_status_time')],
|
||||
},
|
||||
),
|
||||
]
|
||||
Reference in New Issue
Block a user