feat: 城市手册后端完成 - 用户/区域/内容/服务/审核系统
This commit is contained in:
93
city-manual/backend/regions/migrations/0001_initial.py
Normal file
93
city-manual/backend/regions/migrations/0001_initial.py
Normal file
@@ -0,0 +1,93 @@
|
||||
# Generated by Django 4.2.11 on 2026-04-10 12:05
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='ModeratorApplication',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('application_reason', models.TextField(blank=True, verbose_name='申请理由')),
|
||||
('support_count', models.PositiveIntegerField(default=0, verbose_name='支持人数')),
|
||||
('required_support', models.PositiveIntegerField(default=10, verbose_name='所需支持人数')),
|
||||
('deadline', models.DateTimeField(verbose_name='截止时间')),
|
||||
('status', models.CharField(choices=[('pending', '待审核'), ('approved', '已通过'), ('rejected', '已拒绝'), ('cancelled', '已取消')], default='pending', max_length=20, verbose_name='状态')),
|
||||
('reviewed_at', models.DateTimeField(blank=True, null=True, verbose_name='审核时间')),
|
||||
('review_comment', models.TextField(blank=True, verbose_name='审核意见')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='申请时间')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '版主申请',
|
||||
'verbose_name_plural': '版主申请',
|
||||
'ordering': ['-created_at'],
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='ModeratorPermission',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('rank', models.CharField(choices=[('general', '将军'), ('colonel', '校官'), ('lieutenant', '尉官'), ('soldier', '士兵')], max_length=20, verbose_name='军衔')),
|
||||
('status', models.CharField(choices=[('active', '正常'), ('restricted', '限制'), ('revoked', '取消')], default='active', max_length=20, verbose_name='状态')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='授权时间')),
|
||||
('restricted_until', models.DateTimeField(blank=True, null=True, verbose_name='限制截止时间')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '版主权限',
|
||||
'verbose_name_plural': '版主权限',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='ModeratorSupport',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='支持时间')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '支持记录',
|
||||
'verbose_name_plural': '支持记录',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='PermissionRestriction',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('restriction_type', models.CharField(choices=[('partial', '部分限制'), ('full', '完全限制')], max_length=20, verbose_name='限制类型')),
|
||||
('started_at', models.DateTimeField(auto_now_add=True, verbose_name='限制开始时间')),
|
||||
('ended_at', models.DateTimeField(blank=True, null=True, verbose_name='限制结束时间')),
|
||||
('reason', models.TextField(blank=True, verbose_name='限制原因')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '权限限制',
|
||||
'verbose_name_plural': '权限限制',
|
||||
'ordering': ['-started_at'],
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Region',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('name', models.CharField(max_length=100, verbose_name='名称')),
|
||||
('level', models.CharField(choices=[('province', '省级'), ('city', '市级'), ('county', '县级'), ('town', '镇级'), ('village', '村级')], max_length=20, verbose_name='级别')),
|
||||
('code', models.CharField(blank=True, max_length=20, verbose_name='行政区划代码')),
|
||||
('description', models.TextField(blank=True, verbose_name='描述')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
||||
('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
|
||||
('is_active', models.BooleanField(default=True, verbose_name='是否启用')),
|
||||
('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='regions.region', verbose_name='上级区域')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '区域',
|
||||
'verbose_name_plural': '区域',
|
||||
'ordering': ['level', 'name'],
|
||||
},
|
||||
),
|
||||
]
|
||||
71
city-manual/backend/regions/migrations/0002_initial.py
Normal file
71
city-manual/backend/regions/migrations/0002_initial.py
Normal file
@@ -0,0 +1,71 @@
|
||||
# Generated by Django 4.2.11 on 2026-04-10 12:05
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
('regions', '0001_initial'),
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='permissionrestriction',
|
||||
name='operator',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='permission_restrictions_made', to=settings.AUTH_USER_MODEL, verbose_name='操作者'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='permissionrestriction',
|
||||
name='restricted_moderator',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='permission_restrictions', to=settings.AUTH_USER_MODEL, verbose_name='被限制版主'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='moderatorsupport',
|
||||
name='application',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='supports', to='regions.moderatorapplication', verbose_name='申请'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='moderatorsupport',
|
||||
name='supporter',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='moderator_supports', to=settings.AUTH_USER_MODEL, verbose_name='支持者'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='moderatorpermission',
|
||||
name='moderator',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='moderator_permissions', to=settings.AUTH_USER_MODEL, verbose_name='版主'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='moderatorpermission',
|
||||
name='region',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='moderator_permissions', to='regions.region', verbose_name='管辖区域'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='moderatorapplication',
|
||||
name='applicant',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='moderator_applications', to=settings.AUTH_USER_MODEL, verbose_name='申请者'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='moderatorapplication',
|
||||
name='region',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='moderator_applications', to='regions.region', verbose_name='申请区域'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='moderatorapplication',
|
||||
name='reviewer',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='reviewed_applications', to=settings.AUTH_USER_MODEL, verbose_name='审核人'),
|
||||
),
|
||||
migrations.AlterUniqueTogether(
|
||||
name='moderatorsupport',
|
||||
unique_together={('supporter', 'application')},
|
||||
),
|
||||
migrations.AlterUniqueTogether(
|
||||
name='moderatorpermission',
|
||||
unique_together={('moderator', 'region')},
|
||||
),
|
||||
]
|
||||
0
city-manual/backend/regions/migrations/__init__.py
Normal file
0
city-manual/backend/regions/migrations/__init__.py
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user