feat: 城市手册后端完成 - 用户/区域/内容/服务/审核系统

This commit is contained in:
root
2026-04-10 12:12:41 +00:00
committed by maoshen
parent c866e74ece
commit 432345c249
120 changed files with 3186 additions and 0 deletions

View File

@@ -0,0 +1,88 @@
# Generated by Django 4.2.11 on 2026-04-10 12:05
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Article',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=200, verbose_name='标题')),
('content', models.TextField(verbose_name='内容')),
('content_type', models.CharField(choices=[('city_info', '城市信息'), ('history', '历史'), ('culture', '文化'), ('practical', '实用信息'), ('life', '生活指南')], max_length=20, verbose_name='内容类型')),
('moderator_reviewed_at', models.DateTimeField(blank=True, null=True, verbose_name='版主审核时间')),
('moderator_status', models.CharField(choices=[('pending', '待审核'), ('approved', '通过'), ('rejected', '拒绝')], default='pending', max_length=20, verbose_name='版主审核状态')),
('moderator_comment', models.TextField(blank=True, verbose_name='版主审核意见')),
('ai_status', models.CharField(choices=[('pending', '待审核'), ('approved', '通过'), ('rejected', '拒绝')], default='pending', max_length=20, verbose_name='AI 审核状态')),
('ai_reviewed_at', models.DateTimeField(blank=True, null=True, verbose_name='AI 审核时间')),
('ai_comment', models.TextField(blank=True, verbose_name='AI 审核意见')),
('publish_status', models.CharField(choices=[('draft', '未发布'), ('published', '已发布')], default='draft', max_length=20, verbose_name='发布状态')),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
],
options={
'verbose_name': '文章',
'verbose_name_plural': '文章',
'ordering': ['-created_at'],
},
),
migrations.CreateModel(
name='Comment',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('content', models.TextField(verbose_name='评论内容')),
('ai_status', models.CharField(choices=[('pending', '待审核'), ('approved', '通过'), ('rejected', '拒绝')], default='pending', max_length=20, verbose_name='AI 审核状态')),
('ai_reviewed_at', models.DateTimeField(blank=True, null=True, verbose_name='AI 审核时间')),
('is_visible', models.BooleanField(default=False, verbose_name='是否显示')),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
],
options={
'verbose_name': '评论',
'verbose_name_plural': '评论',
'ordering': ['-created_at'],
},
),
migrations.CreateModel(
name='Favorite',
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='Like',
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='Rating',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('score', models.PositiveSmallIntegerField(choices=[(1, '1星'), (2, '2星'), (3, '3星'), (4, '4星'), (5, '5星')], verbose_name='评分')),
('comment', models.TextField(blank=True, verbose_name='评价')),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
],
options={
'verbose_name': '评分',
'verbose_name_plural': '评分',
},
),
]

View File

@@ -0,0 +1,22 @@
# 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 = [
('regions', '0001_initial'),
('content', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='rating',
name='region',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ratings', to='regions.region'),
),
]

View File

@@ -0,0 +1,22 @@
# 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 = [
('services', '0001_initial'),
('content', '0002_initial'),
]
operations = [
migrations.AddField(
model_name='rating',
name='service',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ratings', to='services.featuredservice'),
),
]

View File

@@ -0,0 +1,97 @@
# 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'),
('services', '0001_initial'),
('content', '0003_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AddField(
model_name='rating',
name='user',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ratings', to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='like',
name='article',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='likes', to='content.article'),
),
migrations.AddField(
model_name='like',
name='service',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='likes', to='services.featuredservice'),
),
migrations.AddField(
model_name='like',
name='user',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='likes', to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='favorite',
name='region',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='favorited_by', to='regions.region'),
),
migrations.AddField(
model_name='favorite',
name='service',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='favorited_by', to='services.featuredservice'),
),
migrations.AddField(
model_name='favorite',
name='user',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='favorites', to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='comment',
name='article',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='comments', to='content.article', verbose_name='文章'),
),
migrations.AddField(
model_name='comment',
name='author',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='comments', to=settings.AUTH_USER_MODEL, verbose_name='评论者'),
),
migrations.AddField(
model_name='comment',
name='service',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='comments', to='services.featuredservice', verbose_name='特色服务'),
),
migrations.AddField(
model_name='article',
name='author',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='articles', to=settings.AUTH_USER_MODEL, verbose_name='作者'),
),
migrations.AddField(
model_name='article',
name='moderator_reviewer',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='reviewed_articles', to=settings.AUTH_USER_MODEL, verbose_name='版主审核人'),
),
migrations.AddField(
model_name='article',
name='region',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='articles', to='regions.region', verbose_name='所属区域'),
),
migrations.AlterUniqueTogether(
name='rating',
unique_together={('user', 'region', 'service')},
),
migrations.AlterUniqueTogether(
name='like',
unique_together={('user', 'article', 'service')},
),
migrations.AlterUniqueTogether(
name='favorite',
unique_together={('user', 'region', 'service')},
),
]