add ai models

This commit is contained in:
xie7654
2025-07-11 15:55:49 +08:00
parent ec30340b43
commit 62bba7d23f
9 changed files with 1541 additions and 407 deletions

View File

@@ -173,11 +173,9 @@ class Command(BaseCommand):
field_config = self.generate_grid_form_field(field)
if field_config:
grid_form_fields.append(field_config)
# 生成 useColumns
columns = []
for field in business_fields + core_fields:
columns.append(f" {{\n field: '{field.name}',\n title: '{getattr(field, 'verbose_name', field.name)}',\n }},")
columns = self.get_columns_code(business_fields + core_fields)
context = get_context(app_name, model_name, model, model_name_snake)
context['form_fields'] = '\n'.join(form_fields)
context['grid_form_fields'] = '\n'.join(grid_form_fields)
@@ -218,28 +216,41 @@ class Command(BaseCommand):
return 'any'
def generate_form_field(self, field):
"""生成表单字段配置"""
field_name = field.name
field_label = getattr(field, 'verbose_name', field_name)
if field_name == 'status':
return "{ component: 'RadioGroup', componentProps: { buttonStyle: 'solid', options: [{ label: $t('common.enabled'), value: 1 }, { label: $t('common.disabled'), value: 0 }], optionType: 'button' }, defaultValue: 1, fieldName: 'status', label: $t('system.status') },"
if isinstance(field, models.CharField):
return f''' {{\n component: 'Input',\n fieldName: '{field_name}',\n label: '{field_label}',\n rules: z\n .string()\n .min(1, $t('ui.formRules.required', ['{field_label}']))\n .max(100, $t('ui.formRules.maxLength', ['{field_label}', 100])),\n }},'''
return f"{{ component: 'Input', fieldName: '{field_name}', label: '{field_label}', rules: z.string().min(1, $t('ui.formRules.required', ['{field_label}'])).max(100, $t('ui.formRules.maxLength', ['{field_label}', 100])) }},"
elif isinstance(field, models.TextField):
return f''' {{\n component: 'Input',\n componentProps: {{\n rows: 3,\n showCount: true,\n }},\n fieldName: '{field_name}',\n label: '{field_label}',\n rules: z\n .string()\n .max(500, $t('ui.formRules.maxLength', ['{field_label}', 500]))\n .optional(),\n }},'''
return f"{{ component: 'Input', componentProps: {{ rows: 3, showCount: true }}, fieldName: '{field_name}', label: '{field_label}', rules: z.string().max(500, $t('ui.formRules.maxLength', ['{field_label}', 500])).optional() }},"
elif isinstance(field, models.IntegerField):
return f''' {{\n component: 'InputNumber',\n fieldName: '{field_name}',\n label: '{field_label}',\n }},'''
return f"{{ component: 'InputNumber', fieldName: '{field_name}', label: '{field_label}' }},"
elif isinstance(field, models.BooleanField):
return f''' {{\n component: 'RadioGroup',\n componentProps: {{\n buttonStyle: 'solid',\n options: [\n {{ label: '开启', value: 1 }},\n {{ label: '关闭', value: 0 }},\n ],\n optionType: 'button',\n }},\n defaultValue: 1,\n fieldName: '{field_name}',\n label: '{field_label}',\n }},'''
return f"{{ component: 'RadioGroup', componentProps: {{ buttonStyle: 'solid', options: [{{ label: '开启', value: 1 }}, {{ label: '关闭', value: 0 }}], optionType: 'button' }}, defaultValue: 1, fieldName: '{field_name}', label: '{field_label}' }},"
else:
return f''' {{\n component: 'Input',\n fieldName: '{field_name}',\n label: '{field_label}',\n }},'''
return f"{{ component: 'Input', fieldName: '{field_name}', label: '{field_label}' }},"
def generate_grid_form_field(self, field):
field_name = field.name
field_label = getattr(field, 'verbose_name', field_name)
# 查询表单一般只需要 component/fieldName/label不需要 rules
if field_name == 'status':
return "{ component: 'Select', fieldName: 'status', label: '状态', componentProps: { allowClear: true, options: [{ label: '启用', value: 1 }, { label: '禁用', value: 0 }] } },"
if isinstance(field, models.CharField):
return f''' {{\n component: 'Input',\n fieldName: '{field_name}',\n label: '{field_label}',\n }},'''
return f"{{ component: 'Input', fieldName: '{field_name}', label: '{field_label}' }},"
elif isinstance(field, models.IntegerField):
return f''' {{\n component: 'InputNumber',\n fieldName: '{field_name}',\n label: '{field_label}',\n }},'''
# 其他类型同理
return f"{{ component: 'InputNumber', fieldName: '{field_name}', label: '{field_label}' }},"
else:
return f''' {{\n component: 'Input',\n fieldName: '{field_name}',\n label: '{field_label}',\n }},'''
return f"{{ component: 'Input', fieldName: '{field_name}', label: '{field_label}' }},"
def get_columns_code(self, fields):
columns = []
for field in fields:
if field.name == 'status':
columns.append("{ field: 'status', title: '状态', cellRender: { name: 'CellTag' } },")
continue
if isinstance(field, (models.DateField, models.DateTimeField)):
columns.append(f"{{ field: '{field.name}', title: '{getattr(field, 'verbose_name', field.name)}', width: 150, formatter: ({{ cellValue }}) => format_datetime(cellValue) }},")
continue
columns.append(f"{{ field: '{field.name}', title: '{getattr(field, 'verbose_name', field.name)}' }},")
return columns

View File

@@ -1,5 +1,7 @@
# Generated by Django 5.2.1 on 2025-07-10 04:07
# Generated by Django 5.2.1 on 2025-07-11 07:44
import django.contrib.auth.validators
import django.utils.timezone
from django.db import migrations, models
@@ -572,6 +574,45 @@ class Migration(migrations.Migration):
verbose_name="创建人",
),
),
migrations.AlterField(
model_name="user",
name="date_joined",
field=models.DateTimeField(
db_comment="date joined",
default=django.utils.timezone.now,
verbose_name="date joined",
),
),
migrations.AlterField(
model_name="user",
name="email",
field=models.EmailField(
blank=True,
db_comment="email address",
max_length=254,
verbose_name="email address",
),
),
migrations.AlterField(
model_name="user",
name="first_name",
field=models.CharField(
blank=True,
db_comment="first name",
max_length=150,
verbose_name="first name",
),
),
migrations.AlterField(
model_name="user",
name="is_active",
field=models.BooleanField(
db_comment="active",
default=True,
help_text="Designates whether this user should be treated as active. Unselect this instead of deleting accounts.",
verbose_name="active",
),
),
migrations.AlterField(
model_name="user",
name="is_deleted",
@@ -579,6 +620,46 @@ class Migration(migrations.Migration):
db_comment="是否软删除", default=False, verbose_name="是否软删除"
),
),
migrations.AlterField(
model_name="user",
name="is_staff",
field=models.BooleanField(
db_comment="staff status",
default=False,
help_text="Designates whether the user can log into this admin site.",
verbose_name="staff status",
),
),
migrations.AlterField(
model_name="user",
name="is_superuser",
field=models.BooleanField(
db_comment="superuser status",
default=False,
help_text="Designates that this user has all permissions without explicitly assigning them.",
verbose_name="superuser status",
),
),
migrations.AlterField(
model_name="user",
name="last_login",
field=models.DateTimeField(
blank=True,
db_comment="last login",
null=True,
verbose_name="last login",
),
),
migrations.AlterField(
model_name="user",
name="last_name",
field=models.CharField(
blank=True,
db_comment="last name",
max_length=150,
verbose_name="last name",
),
),
migrations.AlterField(
model_name="user",
name="modifier",
@@ -591,6 +672,13 @@ class Migration(migrations.Migration):
verbose_name="修改人",
),
),
migrations.AlterField(
model_name="user",
name="password",
field=models.CharField(
db_comment="password", max_length=128, verbose_name="password"
),
),
migrations.AlterField(
model_name="user",
name="remark",
@@ -614,4 +702,17 @@ class Migration(migrations.Migration):
verbose_name="修改时间",
),
),
migrations.AlterField(
model_name="user",
name="username",
field=models.CharField(
db_comment="username",
error_messages={"unique": "A user with that username already exists."},
help_text="Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.",
max_length=150,
unique=True,
validators=[django.contrib.auth.validators.UnicodeUsernameValidator()],
verbose_name="username",
),
),
]