diff --git a/.gitignore b/.gitignore index d5f7b82..ff769fb 100644 --- a/.gitignore +++ b/.gitignore @@ -59,3 +59,4 @@ htmlcov/ .ruff_cache/ .sass-cache/ +.gitignore \ No newline at end of file diff --git a/src/backend/=3.1.5 b/src/backend/=3.1.5 deleted file mode 100644 index e69de29..0000000 diff --git a/src/backend/email_notice/migrations/0001_initial.py b/src/backend/email_notice/migrations/0001_initial.py deleted file mode 100644 index 188ceb7..0000000 --- a/src/backend/email_notice/migrations/0001_initial.py +++ /dev/null @@ -1,44 +0,0 @@ -# Generated by Django 5.2.8 on 2025-11-12 13:01 - -import django.core.validators -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='NotificationEmail', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('email', models.EmailField(max_length=254, unique=True, validators=[django.core.validators.EmailValidator()], verbose_name='邮箱地址')), - ('is_enabled', models.BooleanField(default=True, verbose_name='是否启用')), - ('description', models.CharField(blank=True, max_length=200, null=True, 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='NotificationSettings', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('email_notification_enabled', models.BooleanField(default=True, 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': '通知设置', - }, - ), - ] diff --git a/src/backend/email_notice/migrations/__init__.py b/src/backend/email_notice/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/backend/evaluation/migrations/0001_initial.py b/src/backend/evaluation/migrations/0001_initial.py deleted file mode 100644 index e8f2a6a..0000000 --- a/src/backend/evaluation/migrations/0001_initial.py +++ /dev/null @@ -1,40 +0,0 @@ -# Generated by Django 5.2.8 on 2025-11-12 13:33 - -import django.db.models.deletion -import django.utils.timezone -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('finance', '0001_initial'), - ('personnel', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='EvaluationRecord', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('item_description', models.CharField(max_length=255, verbose_name='加/扣分事项说明')), - ('bonus_score', models.DecimalField(decimal_places=2, default=0, max_digits=8, verbose_name='加分数值')), - ('deduction_score', models.DecimalField(decimal_places=2, default=0, max_digits=8, verbose_name='扣分数值')), - ('remarks', models.CharField(blank=True, max_length=255, verbose_name='备注')), - ('total_score', models.DecimalField(decimal_places=2, default=0, max_digits=8, verbose_name='总计分数')), - ('evaluation_date', models.DateField(default=django.utils.timezone.now, verbose_name='考评日期')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新时间')), - ('department', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='evaluation_records', to='finance.department', verbose_name='所属部门')), - ('personnel', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='evaluation_records', to='personnel.personnel', verbose_name='人员')), - ], - options={ - 'verbose_name': '考评记录', - 'verbose_name_plural': '考评记录', - 'ordering': ['-evaluation_date', '-created_at'], - 'indexes': [models.Index(fields=['department', 'evaluation_date'], name='evaluation__departm_69a30f_idx'), models.Index(fields=['personnel', 'evaluation_date'], name='evaluation__personn_7ee639_idx')], - }, - ), - ] diff --git a/src/backend/evaluation/migrations/__init__.py b/src/backend/evaluation/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/backend/items/migrations/0001_initial.py b/src/backend/items/migrations/0001_initial.py deleted file mode 100644 index 36943cc..0000000 --- a/src/backend/items/migrations/0001_initial.py +++ /dev/null @@ -1,107 +0,0 @@ -# Generated by Django 5.2.8 on 2025-11-12 12:47 - -import django.db.models.deletion -import items.models -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Category', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=50, unique=True, verbose_name='类别名称')), - ('description', models.TextField(blank=True, verbose_name='类别描述')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ], - options={ - 'verbose_name': '物品类别', - 'verbose_name_plural': '物品类别', - 'ordering': ['name'], - }, - ), - migrations.CreateModel( - name='Item', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=100, verbose_name='物品名称')), - ('description', models.TextField(blank=True, verbose_name='物品描述')), - ('serial_number', models.CharField(max_length=50, unique=True, verbose_name='序列号')), - ('category', models.CharField(max_length=50, verbose_name='物品类别')), - ('status', models.CharField(choices=[('available', '可用'), ('in_use', '使用中'), ('maintenance', '维护中'), ('damaged', '损坏'), ('lost', '丢失'), ('abandoned', '已弃用'), ('prohibited', '禁止借用')], default='available', max_length=20, verbose_name='物品状态')), - ('location', models.CharField(blank=True, max_length=100, verbose_name='存放位置')), - ('owner', models.CharField(blank=True, max_length=100, null=True, verbose_name='所有者')), - ('purchase_date', models.DateField(blank=True, null=True, verbose_name='购买日期')), - ('value', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, 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='ItemImage', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('image', models.ImageField(upload_to=items.models.get_item_image_path, verbose_name='图片')), - ('description', models.CharField(blank=True, max_length=200, verbose_name='图片描述')), - ('is_primary', models.BooleanField(default=False, verbose_name='是否为主图')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='上传时间')), - ('item', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='images', to='items.item', verbose_name='物品')), - ], - options={ - 'verbose_name': '物品图片', - 'verbose_name_plural': '物品图片', - 'ordering': ['-is_primary', '-created_at'], - }, - ), - migrations.CreateModel( - name='ItemUsage', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('user', models.CharField(max_length=100, verbose_name='借用人姓名')), - ('borrower_contact', models.CharField(default='NONE', max_length=100, verbose_name='借用人联系方式')), - ('expected_return_time', models.DateTimeField(blank=True, null=True, verbose_name='预计归还时间')), - ('start_time', models.DateTimeField(verbose_name='开始使用时间')), - ('end_time', models.DateTimeField(blank=True, null=True, verbose_name='结束使用时间')), - ('purpose', models.CharField(max_length=200, verbose_name='使用目的')), - ('notes', models.TextField(blank=True, verbose_name='使用备注')), - ('is_returned', models.BooleanField(default=False, verbose_name='是否已归还')), - ('condition_before', models.CharField(blank=True, max_length=200, verbose_name='使用前状况')), - ('condition_after', models.CharField(blank=True, max_length=200, verbose_name='使用后状况')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='记录创建时间')), - ('item', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='items.item', verbose_name='物品')), - ], - options={ - 'verbose_name': '使用记录', - 'verbose_name_plural': '使用记录', - 'ordering': ['-start_time'], - }, - ), - migrations.CreateModel( - name='UsageImage', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('image', models.ImageField(upload_to='usage_images/', verbose_name='图片')), - ('image_type', models.CharField(choices=[('borrow', '借用时'), ('return', '归还时')], max_length=10, verbose_name='图片类型')), - ('description', models.CharField(blank=True, max_length=200, verbose_name='图片描述')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='上传时间')), - ('usage', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='images', to='items.itemusage', verbose_name='使用记录')), - ], - options={ - 'verbose_name': '使用记录图片', - 'verbose_name_plural': '使用记录图片', - 'ordering': ['-created_at'], - }, - ), - ] diff --git a/src/backend/items/migrations/__init__.py b/src/backend/items/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/backend/memo/migrations/0001_initial.py b/src/backend/memo/migrations/0001_initial.py deleted file mode 100644 index 8a81854..0000000 --- a/src/backend/memo/migrations/0001_initial.py +++ /dev/null @@ -1,48 +0,0 @@ -# Generated by Django 5.2.8 on 2025-11-12 13:01 - -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='Memo', - 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(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='是否启用')), - ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='创建者')), - ], - options={ - 'verbose_name': '备忘录', - 'verbose_name_plural': '备忘录', - 'ordering': ['-updated_at'], - }, - ), - migrations.CreateModel( - name='MemoImage', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('image', models.ImageField(upload_to='memo_images/', verbose_name='图片')), - ('uploaded_at', models.DateTimeField(auto_now_add=True, verbose_name='上传时间')), - ('alt_text', models.CharField(blank=True, max_length=200, verbose_name='图片描述')), - ('memo', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='images', to='memo.memo', verbose_name='备忘录')), - ], - options={ - 'verbose_name': '备忘录图片', - 'verbose_name_plural': '备忘录图片', - }, - ), - ] diff --git a/src/backend/memo/migrations/__init__.py b/src/backend/memo/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/backend/personnel/migrations/0001_initial.py b/src/backend/personnel/migrations/0001_initial.py deleted file mode 100644 index eff7282..0000000 --- a/src/backend/personnel/migrations/0001_initial.py +++ /dev/null @@ -1,60 +0,0 @@ -# Generated by Django 5.2.8 on 2025-11-12 13:01 - -import django.core.validators -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('finance', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='ProjectGroup', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=100, verbose_name='项目组名称')), - ('description', models.TextField(blank=True, null=True, verbose_name='项目组描述')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('departments', models.ManyToManyField(related_name='project_groups', to='finance.department', verbose_name='所属部门')), - ], - options={ - 'verbose_name': '项目组', - 'verbose_name_plural': '项目组', - 'ordering': ['name'], - }, - ), - migrations.CreateModel( - name='Personnel', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=50, verbose_name='姓名')), - ('student_id', models.CharField(max_length=20, validators=[django.core.validators.RegexValidator(message='学号应为8-12位数字', regex='^\\d{8,12}$')], verbose_name='学号')), - ('gender', models.CharField(choices=[('male', '男'), ('female', '女')], max_length=10, verbose_name='性别')), - ('grade_major', models.CharField(max_length=100, verbose_name='年级专业')), - ('position', models.CharField(max_length=50, verbose_name='职位')), - ('start_date', models.DateField(verbose_name='任职开始时间')), - ('end_date', models.DateField(blank=True, null=True, verbose_name='任职结束时间')), - ('is_active', models.BooleanField(default=True, verbose_name='是否在职')), - ('phone', models.CharField(max_length=11, validators=[django.core.validators.RegexValidator(message='请输入有效的手机号码', regex='^1[3-9]\\d{9}$')], verbose_name='手机号')), - ('qq', models.CharField(max_length=15, validators=[django.core.validators.RegexValidator(message='QQ号应为5-15位数字', regex='^\\d{5,15}$')], verbose_name='QQ号')), - ('email', models.EmailField(max_length=254, verbose_name='邮箱')), - ('description', models.TextField(blank=True, null=True, verbose_name='备注信息')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新时间')), - ('department', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='finance.department', verbose_name='所属部门')), - ('project_group', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='personnel.projectgroup', verbose_name='项目组')), - ], - options={ - 'verbose_name': '人员信息', - 'verbose_name_plural': '人员信息', - 'ordering': ['-is_active', 'department', 'position', 'name'], - 'indexes': [models.Index(fields=['department', 'is_active'], name='personnel_p_departm_c45b4b_idx'), models.Index(fields=['student_id'], name='personnel_p_student_5d98b3_idx')], - }, - ), - ] diff --git a/src/backend/personnel/migrations/__init__.py b/src/backend/personnel/migrations/__init__.py deleted file mode 100644 index e69de29..0000000