Files
chunyu_project/logs/migrations/0001_initial.py
T
2026-08-05 23:59:15 +08:00

91 lines
7.3 KiB
Python

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