# Generated by Django 4.1.2 on 2025-08-07 22:15 from django.conf import settings from django.db import migrations, models import django.db.models.deletion class Migration(migrations.Migration): initial = True dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='Users', fields=[ ('user_id', models.AutoField(primary_key=True, serialize=False, verbose_name='用户ID')), ('name', models.CharField(max_length=80, verbose_name='姓名')), ('openid', models.CharField(max_length=100, unique=True, verbose_name='OPENID')), ('appid', models.CharField(max_length=100, verbose_name='APPID')), ('roles', models.CharField(choices=[('ADM', '管理员'), ('USR', '普通用户'), ('DEV', '开发者')], default='USR', max_length=10, verbose_name='角色')), ('vip', models.PositiveIntegerField(default=1, verbose_name='VIP等级')), ('vip_time', models.DateTimeField(auto_now_add=True, verbose_name='VIP生效时间')), ('is_delete', models.BooleanField(default=False, verbose_name='删除标记')), ('developer', models.BooleanField(default=False, verbose_name='开发者标记')), ('t_code', models.CharField(max_length=100, unique=True, verbose_name='交易验证码')), ('ip', models.GenericIPAddressField(verbose_name='注册IP')), ('avatar', models.ImageField(blank=True, default='/static/img/user.jpg', null=True, upload_to='avatars/', verbose_name='头像')), ('email', models.EmailField(blank=True, default='email@email.com', max_length=254, null=True, verbose_name='邮箱')), ('phone', models.CharField(blank=True, max_length=20, null=True, verbose_name='手机号')), ('address', models.CharField(blank=True, max_length=200, null=True, verbose_name='地址')), ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')), ('user_name', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='user_profile', to=settings.AUTH_USER_MODEL, verbose_name='关联用户')), ], options={ 'verbose_name': '用户档案', 'verbose_name_plural': '用户档案', 'db_table': 'user_profile', 'ordering': ['-create_time'], }, ), migrations.CreateModel( name='AcademicProfile', fields=[ ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, related_name='user_academic_profile', serialize=False, to='userprofile.users', verbose_name='关联用户')), ('role', models.CharField(choices=[('UG', '本科生'), ('MS', '硕士生'), ('PhD', '博士生'), ('PD', '博士后'), ('FAC', '教职工'), ('RES', '研究员')], default='MS', max_length=10, verbose_name='学术身份')), ('enrollment_year', models.PositiveIntegerField(help_text='格式:YYYY(如2023)', verbose_name='入学年份')), ('graduation_year', models.PositiveIntegerField(blank=True, null=True, verbose_name='预计毕业年份')), ('department', models.CharField(max_length=100, verbose_name='院系/研究所')), ('major', models.CharField(max_length=100, verbose_name='专业方向')), ('research_tags', models.CharField(blank=True, help_text='用逗号分隔多个方向(如:人工智能,教育技术)', max_length=255, verbose_name='研究方向')), ('skill_tags', models.CharField(blank=True, help_text='用逗号分隔多个技能(如:Python,数据分析)', max_length=255, verbose_name='技能标签')), ], options={ 'verbose_name': '学术档案', 'verbose_name_plural': '学术档案', 'db_table': 'user_academic_profile', }, ), migrations.CreateModel( name='ResearchGroup', fields=[ ('group_id', models.AutoField(primary_key=True, serialize=False, verbose_name='小组ID')), ('name', models.CharField(max_length=100, unique=True, verbose_name='小组名称')), ('description', models.TextField(blank=True, verbose_name='小组描述')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), ('is_active', models.BooleanField(default=True, verbose_name='是否活跃')), ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_groups', to='userprofile.users', verbose_name='创建人')), ], options={ 'verbose_name': '教研小组', 'verbose_name_plural': '教研小组', 'db_table': 'user_research_group', 'ordering': ['-created_at'], }, ), migrations.CreateModel( name='GroupMembership', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('role', models.CharField(choices=[('LEAD', '组长'), ('DEP', '副组长'), ('CORE', '核心成员'), ('MEM', '普通成员'), ('ADV', '指导老师'), ('OBS', '观察员')], default='MEM', max_length=20, verbose_name='小组角色')), ('status', models.CharField(choices=[('ACT', '活跃'), ('LV', '请假'), ('INAC', '不活跃'), ('GRAD', '已毕业'), ('TRF', '已转组')], default='ACT', max_length=10, verbose_name='在组状态')), ('joined_at', models.DateTimeField(auto_now_add=True, verbose_name='加入时间')), ('left_at', models.DateTimeField(blank=True, null=True, verbose_name='离开时间')), ('custom_permissions', models.JSONField(blank=True, default=dict, help_text='JSON格式存储额外权限', null=True, verbose_name='特殊权限')), ('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='members', to='userprofile.researchgroup', verbose_name='所属小组')), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='group_memberships', to='userprofile.users', verbose_name='成员')), ], options={ 'verbose_name': '小组成员', 'verbose_name_plural': '小组成员', 'db_table': 'user_group_membership', 'ordering': ['-joined_at'], 'unique_together': {('user', 'group')}, }, ), ]