diff --git a/backend/system/migrations/0003_alter_dictdata_status_alter_dicttype_status_and_more.py b/backend/system/migrations/0003_alter_dictdata_status_alter_dicttype_status_and_more.py new file mode 100644 index 0000000..949cbe9 --- /dev/null +++ b/backend/system/migrations/0003_alter_dictdata_status_alter_dicttype_status_and_more.py @@ -0,0 +1,55 @@ +# Generated by Django 5.2.1 on 2025-07-01 04:57 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("system", "0002_post_alter_dept_creator_alter_dept_is_deleted_and_more"), + ] + + operations = [ + migrations.AlterField( + model_name="dictdata", + name="status", + field=models.IntegerField( + choices=[(0, "禁用"), (1, "启用")], default=1, verbose_name="状态" + ), + ), + migrations.AlterField( + model_name="dicttype", + name="status", + field=models.IntegerField( + choices=[(0, "禁用"), (1, "启用")], default=1, verbose_name="状态" + ), + ), + migrations.AlterField( + model_name="menu", + name="status", + field=models.IntegerField( + choices=[(0, "禁用"), (1, "启用")], default=1, verbose_name="状态" + ), + ), + migrations.AlterField( + model_name="post", + name="status", + field=models.IntegerField( + choices=[(0, "禁用"), (1, "启用")], default=1, verbose_name="状态" + ), + ), + migrations.AlterField( + model_name="role", + name="status", + field=models.IntegerField( + choices=[(0, "禁用"), (1, "启用")], default=1, verbose_name="角色状态" + ), + ), + migrations.AlterField( + model_name="user", + name="status", + field=models.IntegerField( + choices=[(0, "禁用"), (1, "启用")], default=1, verbose_name="状态" + ), + ), + ] diff --git a/backend/system/models.py b/backend/system/models.py index c75d4bb..57c4eb0 100644 --- a/backend/system/models.py +++ b/backend/system/models.py @@ -2,14 +2,37 @@ from django.contrib.auth.models import AbstractUser from django.db import models from backend import settings -from utils.models import CoreModel +from utils.models import CoreModel, CommonStatus from utils.utils import validate_mobile -# 定义状态枚举(可根据实际业务扩展) -class DepartmentStatus(models.IntegerChoices): - DISABLED = 0, "禁用" # 对应数据中的 status: 0 - ENABLED = 1, "启用" # 对应数据中的 status: 1 +# 菜单类型枚举 +class MenuType(models.TextChoices): + CATALOG = 'catalog', '目录' + MENU = 'menu', '菜单' + BUTTON = 'button', '按钮' + EMBEDDED = 'embedded', '内嵌页面' + LINK = 'link', '外部链接' + +# 菜单元数据模型(单独存储元数据,避免 JSONField) +class MenuMeta(CoreModel): + title = models.CharField(max_length=200, verbose_name='标题') + icon = models.CharField(max_length=100, blank=True, verbose_name='图标') + order = models.IntegerField(default=0, verbose_name='排序') + affix_tab = models.BooleanField(default=False, verbose_name='固定标签页') + badge = models.CharField(max_length=50, blank=True, verbose_name='徽章文本') + badge_type = models.CharField(max_length=20, blank=True, verbose_name='徽章类型') + badge_variants = models.CharField(max_length=20, blank=True, verbose_name='徽章样式') + iframe_src = models.URLField(blank=True, verbose_name='内嵌页面URL') + link = models.URLField(blank=True, verbose_name='外部链接') + + def __str__(self): + return self.title + + class Meta: + db_table = 'system_menu_meta' + verbose_name = '菜单元数据' + verbose_name_plural = '菜单元数据' class Dept(CoreModel): pid = models.ForeignKey( @@ -22,8 +45,8 @@ class Dept(CoreModel): ) name = models.CharField(max_length=100, verbose_name="部门名称") status = models.SmallIntegerField( - choices=DepartmentStatus.choices, - default=DepartmentStatus.DISABLED, + choices=CommonStatus.choices, + default=CommonStatus.DISABLED, verbose_name="部门状态" ) create_time = models.DateTimeField( @@ -61,39 +84,6 @@ class Dept(CoreModel): verbose_name_plural = verbose_name ordering = ["-create_time"] # 按创建时间倒序排列 -# 菜单类型枚举 -class MenuType(models.TextChoices): - CATALOG = 'catalog', '目录' - MENU = 'menu', '菜单' - BUTTON = 'button', '按钮' - EMBEDDED = 'embedded', '内嵌页面' - LINK = 'link', '外部链接' - -# 菜单状态枚举 -class MenuStatus(models.IntegerChoices): - ENABLED = 1, '启用' - DISABLED = 0, '禁用' - -# 菜单元数据模型(单独存储元数据,避免 JSONField) -class MenuMeta(CoreModel): - title = models.CharField(max_length=200, verbose_name='标题') - icon = models.CharField(max_length=100, blank=True, verbose_name='图标') - order = models.IntegerField(default=0, verbose_name='排序') - affix_tab = models.BooleanField(default=False, verbose_name='固定标签页') - badge = models.CharField(max_length=50, blank=True, verbose_name='徽章文本') - badge_type = models.CharField(max_length=20, blank=True, verbose_name='徽章类型') - badge_variants = models.CharField(max_length=20, blank=True, verbose_name='徽章样式') - iframe_src = models.URLField(blank=True, verbose_name='内嵌页面URL') - link = models.URLField(blank=True, verbose_name='外部链接') - - def __str__(self): - return self.title - - class Meta: - db_table = 'system_menu_meta' - verbose_name = '菜单元数据' - verbose_name_plural = '菜单元数据' - # 主菜单模型 class Menu(CoreModel): pid = models.ForeignKey( @@ -105,7 +95,7 @@ class Menu(CoreModel): verbose_name='父菜单' ) name = models.CharField(max_length=100, verbose_name='菜单名称') - status = models.IntegerField(choices=MenuStatus.choices, default=MenuStatus.ENABLED, verbose_name='状态') + status = models.IntegerField(choices=CommonStatus.choices, default=CommonStatus.ENABLED, verbose_name='状态') type = models.CharField(choices=MenuType.choices, max_length=20, verbose_name='菜单类型') path = models.CharField(max_length=200, blank=True, verbose_name='路由路径') component = models.CharField(max_length=200, blank=True, verbose_name='组件路径') @@ -120,19 +110,14 @@ class Menu(CoreModel): verbose_name_plural = '菜单管理' ordering = ['meta__order', 'id'] -# 角色状态枚举 -class RoleStatus(models.IntegerChoices): - ENABLED = 1, '启用' - DISABLED = 0, '禁用' - class Role(CoreModel): name = models.CharField( max_length=100, verbose_name='角色名称' ) status = models.IntegerField( - choices=RoleStatus.choices, - default=RoleStatus.ENABLED, + choices=CommonStatus.choices, + default=CommonStatus.ENABLED, verbose_name='角色状态' ) sort = models.IntegerField( @@ -186,7 +171,11 @@ class DictType(CoreModel): """字典类型表""" name = models.CharField(max_length=100, default='', verbose_name='字典名称') type = models.CharField(max_length=100, default='', verbose_name='字典类型', db_index=True) - status = models.BooleanField(default=True) + status = models.IntegerField( + choices=CommonStatus.choices, + default=CommonStatus.ENABLED, + verbose_name='状态' + ) deleted_time = models.DateTimeField(null=True, blank=True, verbose_name='删除时间') class Meta: @@ -210,7 +199,11 @@ class DictData(CoreModel): related_name='dict_data', verbose_name='字典类型' ) - status = models.BooleanField(default=True) + status = models.IntegerField( + choices=CommonStatus.choices, + default=CommonStatus.ENABLED, + verbose_name='状态' + ) color_type = models.CharField(max_length=100, blank=True, default='', verbose_name='颜色类型') css_class = models.CharField(max_length=100, blank=True, default='', verbose_name='css 样式') @@ -228,7 +221,11 @@ class Post(CoreModel): code = models.CharField(max_length=64, db_comment='岗位编码') name = models.CharField(max_length=50, db_comment='岗位名称') sort = models.IntegerField(default=0, db_comment='显示顺序') - status = models.BooleanField(default=False, db_comment='状态') + status = models.IntegerField( + choices=CommonStatus.choices, + default=CommonStatus.ENABLED, + verbose_name='状态' + ) class Meta: db_table = 'system_post' @@ -257,7 +254,11 @@ class User(AbstractUser, CoreModel): 'Post', blank=True, verbose_name='岗位', db_constraint=False, related_name='users' ) - status = models.BooleanField(default=False, verbose_name='<帐号状态>(1正常 0停用)', db_comment="帐号状态") + status = models.IntegerField( + choices=CommonStatus.choices, + default=CommonStatus.ENABLED, + verbose_name='状态' + ) login_date = models.DateTimeField("<最后登录时间>", blank=True, null=True, db_comment="最后登录时间") login_ip = models.GenericIPAddressField(blank=True, null=True, db_comment="最后登录IP") diff --git a/backend/system/views/post.py b/backend/system/views/post.py index b356e50..1b766ee 100644 --- a/backend/system/views/post.py +++ b/backend/system/views/post.py @@ -16,9 +16,9 @@ class PostViewSet(CustomModelViewSet): """ 岗位信息表 视图集 """ - queryset = Post.objects.filter(is_deleted=False).order_by('-id') + queryset = Post.objects.filter(is_deleted=False) serializer_class = PostSerializer filterset_fields = ['id', 'remark', 'creator', 'modifier', 'is_deleted', 'code', 'name', 'sort', 'status'] search_fields = ['name'] # 根据实际字段调整 - ordering_fields = ['create_time', 'id'] - ordering = ['-create_time'] + ordering_fields = ['create_time', 'id', 'sort'] + ordering = ['sort'] diff --git a/backend/utils/models.py b/backend/utils/models.py index 053caa7..e9619d7 100644 --- a/backend/utils/models.py +++ b/backend/utils/models.py @@ -5,6 +5,10 @@ """ from django.db import models +class CommonStatus(models.IntegerChoices): + DISABLED = 0, '禁用' + ENABLED = 1, '启用' + class CoreModel(models.Model): remark = models.CharField(max_length=256, db_comment="备注", null=True, blank=True, help_text="备注") creator = models.CharField(max_length=64, null=True, blank=True, help_text="创建人", db_comment="创建人") diff --git a/web/apps/web-antd/src/views/system/dict_data/data.ts b/web/apps/web-antd/src/views/system/dict_data/data.ts index 3b801f5..913e398 100644 --- a/web/apps/web-antd/src/views/system/dict_data/data.ts +++ b/web/apps/web-antd/src/views/system/dict_data/data.ts @@ -100,8 +100,8 @@ export function useSchema(): VbenFormSchema[] { componentProps: { buttonStyle: 'solid', options: [ - { label: '开启', value: true }, - { label: '关闭', value: false }, + { label: '开启', value: 1 }, + { label: '关闭', value: 0 }, ], optionType: 'button', }, @@ -166,10 +166,6 @@ export function useColumns( { cellRender: { name: 'CellTag', - options: [ - { label: $t('common.enabled'), value: true }, - { label: $t('common.disabled'), value: false }, - ], }, field: 'status', title: '状态', diff --git a/web/apps/web-antd/src/views/system/dict_type/data.ts b/web/apps/web-antd/src/views/system/dict_type/data.ts index 0ccc9fd..1ac5fc4 100644 --- a/web/apps/web-antd/src/views/system/dict_type/data.ts +++ b/web/apps/web-antd/src/views/system/dict_type/data.ts @@ -42,8 +42,8 @@ export function useSchema(): VbenFormSchema[] { componentProps: { buttonStyle: 'solid', options: [ - { label: '开启', value: true }, - { label: '关闭', value: false }, + { label: '开启', value: 1 }, + { label: '关闭', value: 0 }, ], optionType: 'button', }, @@ -97,10 +97,7 @@ export function useColumns( { cellRender: { name: 'CellTag', - options: [ - { label: $t('common.enabled'), value: true }, - { label: $t('common.disabled'), value: false }, - ], + }, field: 'status', title: '状态', diff --git a/web/apps/web-antd/src/views/system/post/data.ts b/web/apps/web-antd/src/views/system/post/data.ts index f974011..c063399 100644 --- a/web/apps/web-antd/src/views/system/post/data.ts +++ b/web/apps/web-antd/src/views/system/post/data.ts @@ -75,13 +75,13 @@ export function useColumns( field: 'code', title: '岗位编码', }, + { + field: 'sort', + title: '排序', + }, { cellRender: { name: 'CellTag', - options: [ - { label: $t('common.enabled'), value: true }, - { label: $t('common.disabled'), value: false }, - ], }, field: 'status', title: '状态',