This commit is contained in:
27942
2026-03-05 23:04:32 +08:00
parent 0def03f3cb
commit c257b02017
4 changed files with 73 additions and 2 deletions

13
manage.py Normal file
View File

@@ -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)

View File

@@ -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='工作经验'),
),
]

View File

@@ -108,10 +108,17 @@ class AuthToken(models.Model):
class FilterConfig(models.Model): class FilterConfig(models.Model):
"""筛选条件配置表。""" """筛选条件配置表。"""
name = models.CharField(max_length=128, verbose_name="配置名称") 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_min = models.IntegerField(default=18, verbose_name="最小年龄")
age_max = models.IntegerField(default=60, verbose_name="最大年龄") age_max = models.IntegerField(default=60, verbose_name="最大年龄")
gender = models.CharField(max_length=32, default="不限", 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="活跃度") activity = models.CharField(max_length=32, default="不限", verbose_name="活跃度")
positions = models.JSONField(default=list, blank=True, verbose_name="期望岗位列表") positions = models.JSONField(default=list, blank=True, verbose_name="期望岗位列表")
greeting_min = models.IntegerField(default=5, 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="打招呼间隔秒") message_interval = models.IntegerField(default=30, verbose_name="打招呼间隔秒")
min_amount = models.IntegerField(null=True, blank=True, verbose_name="最小金额") min_amount = models.IntegerField(null=True, blank=True, verbose_name="最小金额")
max_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="创建时间") created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间") updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间")

View File

@@ -101,11 +101,19 @@ FILTER_AMOUNT_ALIASES = {
class FilterConfigSerializer(serializers.ModelSerializer): class FilterConfigSerializer(serializers.ModelSerializer):
"""筛选配置:列表/详情返回 name, position_keywords, city, salary_min, salary_max, experience, education, is_active 等。"""
class Meta: class Meta:
model = FilterConfig model = FilterConfig
fields = "__all__" fields = "__all__"
read_only_fields = ["id", "created_at", "updated_at"] 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): def to_internal_value(self, data):
"""请求中兼容 minAmount/maxAmount、最小金额/最大金额 等别名,统一为 min_amount/max_amount。""" """请求中兼容 minAmount/maxAmount、最小金额/最大金额 等别名,统一为 min_amount/max_amount。"""
if isinstance(data, dict): if isinstance(data, dict):
@@ -113,6 +121,9 @@ class FilterConfigSerializer(serializers.ModelSerializer):
for alias, canonical in FILTER_AMOUNT_ALIASES.items(): for alias, canonical in FILTER_AMOUNT_ALIASES.items():
if alias in data and canonical not in data: if alias in data and canonical not in data:
data[canonical] = data.pop(alias) 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) return super().to_internal_value(data)