From c257b02017a5e5e10fbf11bdbe45f6720a970ad4 Mon Sep 17 00:00:00 2001 From: 27942 Date: Thu, 5 Mar 2026 23:04:32 +0800 Subject: [PATCH] haha --- manage.py | 13 ++++++ ...osition_keywords_city_salary_experience.py | 41 +++++++++++++++++++ server/models.py | 10 ++++- server/serializers.py | 11 +++++ 4 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 manage.py create mode 100644 server/migrations/0006_filterconfig_position_keywords_city_salary_experience.py diff --git a/manage.py b/manage.py new file mode 100644 index 0000000..f6e0a38 --- /dev/null +++ b/manage.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +"""Django 管理入口(在 boss_dp 根目录执行 python manage.py 即可)。""" +import os +import sys + +if __name__ == "__main__": + _root = os.path.dirname(os.path.abspath(__file__)) + if _root not in sys.path: + sys.path.insert(0, _root) + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "server.settings") + from django.core.management import execute_from_command_line + execute_from_command_line(sys.argv) diff --git a/server/migrations/0006_filterconfig_position_keywords_city_salary_experience.py b/server/migrations/0006_filterconfig_position_keywords_city_salary_experience.py new file mode 100644 index 0000000..56b1ed4 --- /dev/null +++ b/server/migrations/0006_filterconfig_position_keywords_city_salary_experience.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +""" +筛选配置:增加 position_keywords、city、salary_min、salary_max、experience +列表接口需返回:name, position_keywords, city, salary_min, salary_max, experience, education, is_active +""" +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('server', '0005_filterconfig_min_max_amount'), + ] + + operations = [ + migrations.AddField( + model_name='filterconfig', + name='position_keywords', + field=models.CharField(blank=True, default='', max_length=512, verbose_name='岗位关键词列表'), + ), + migrations.AddField( + model_name='filterconfig', + name='city', + field=models.CharField(blank=True, default='', max_length=64, verbose_name='城市'), + ), + migrations.AddField( + model_name='filterconfig', + name='salary_min', + field=models.CharField(blank=True, default='', max_length=32, verbose_name='最低薪资(K)'), + ), + migrations.AddField( + model_name='filterconfig', + name='salary_max', + field=models.CharField(blank=True, default='', max_length=32, verbose_name='最高薪资(K)'), + ), + migrations.AddField( + model_name='filterconfig', + name='experience', + field=models.CharField(blank=True, default='', max_length=64, verbose_name='工作经验'), + ), + ] diff --git a/server/models.py b/server/models.py index 2cdf539..21e8408 100644 --- a/server/models.py +++ b/server/models.py @@ -108,10 +108,17 @@ class AuthToken(models.Model): class FilterConfig(models.Model): """筛选条件配置表。""" name = models.CharField(max_length=128, verbose_name="配置名称") + position_keywords = models.CharField(max_length=512, default="", blank=True, verbose_name="岗位关键词列表") + city = models.CharField(max_length=64, default="", blank=True, verbose_name="城市") + salary_min = models.CharField(max_length=32, default="", blank=True, verbose_name="最低薪资(K)") + salary_max = models.CharField(max_length=32, default="", blank=True, verbose_name="最高薪资(K)") + experience = models.CharField(max_length=64, default="", blank=True, verbose_name="工作经验") + education = models.CharField(max_length=32, default="不限", verbose_name="学历要求") + is_active = models.BooleanField(default=True, verbose_name="是否启用") + # 以下为兼容旧版保留字段 age_min = models.IntegerField(default=18, verbose_name="最小年龄") age_max = models.IntegerField(default=60, verbose_name="最大年龄") gender = models.CharField(max_length=32, default="不限", verbose_name="性别") - education = models.CharField(max_length=32, default="不限", verbose_name="学历要求") activity = models.CharField(max_length=32, default="不限", verbose_name="活跃度") positions = models.JSONField(default=list, blank=True, verbose_name="期望岗位列表") greeting_min = models.IntegerField(default=5, verbose_name="打招呼最少条数/天") @@ -122,7 +129,6 @@ class FilterConfig(models.Model): message_interval = models.IntegerField(default=30, verbose_name="打招呼间隔秒") min_amount = models.IntegerField(null=True, blank=True, verbose_name="最小金额") max_amount = models.IntegerField(null=True, blank=True, verbose_name="最大金额") - is_active = 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="更新时间") diff --git a/server/serializers.py b/server/serializers.py index fa9c400..9fdfdf3 100644 --- a/server/serializers.py +++ b/server/serializers.py @@ -101,11 +101,19 @@ FILTER_AMOUNT_ALIASES = { class FilterConfigSerializer(serializers.ModelSerializer): + """筛选配置:列表/详情返回 name, position_keywords, city, salary_min, salary_max, experience, education, is_active 等。""" + class Meta: model = FilterConfig fields = "__all__" read_only_fields = ["id", "created_at", "updated_at"] + def to_representation(self, instance): + """响应中 is_active 统一为字符串 "true" / "false"。""" + data = super().to_representation(instance) + data["is_active"] = "true" if instance.is_active else "false" + return data + def to_internal_value(self, data): """请求中兼容 minAmount/maxAmount、最小金额/最大金额 等别名,统一为 min_amount/max_amount。""" if isinstance(data, dict): @@ -113,6 +121,9 @@ class FilterConfigSerializer(serializers.ModelSerializer): for alias, canonical in FILTER_AMOUNT_ALIASES.items(): if alias in data and canonical not in data: data[canonical] = data.pop(alias) + # 请求里 is_active 可能是字符串 "true"/"false" + if "is_active" in data and isinstance(data["is_active"], str): + data["is_active"] = data["is_active"].lower() in ("true", "1", "yes", "是") return super().to_internal_value(data)