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