做了疯狂的架构迁移,正在进行测试,不稳定

This commit is contained in:
2026-06-17 02:02:41 +08:00
parent f252fc2aff
commit 461643079b
107 changed files with 3369 additions and 4691 deletions

View File

@@ -1,8 +1,8 @@
# Generated by Django 6.0.5 on 2026-06-13 11:43
# Generated by Django 4.2.27 on 2026-06-17 01:34
import datetime
import gvsdsdk.models
from django.db import migrations, models
import gvsdsdk.models
class Migration(migrations.Migration):
@@ -13,12 +13,40 @@ class Migration(migrations.Migration):
]
operations = [
migrations.CreateModel(
name='User',
fields=[
('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', primary_key=True, serialize=False, verbose_name='用户UUID')),
('UserName', models.CharField(db_column='UserName', max_length=256, unique=True, verbose_name='用户名')),
('UserPassword', models.CharField(db_column='UserPassword', default='', max_length=200, verbose_name='密码')),
('UserPositionStatus', models.SmallIntegerField(db_column='UserPositionStatus', default=0, verbose_name='职位状态')),
('UserPersonalSignature', models.CharField(db_column='UserPersonalSignature', default='', max_length=1024, verbose_name='个人签名')),
('UserEmail', models.CharField(db_column='UserEmail', default='', max_length=256, verbose_name='邮箱')),
('UserEmailVerify', models.SmallIntegerField(db_column='UserEmailVerify', default=0, verbose_name='邮箱验证')),
('UserAccountLicense', models.SmallIntegerField(db_column='UserAccountLicense', default=1, verbose_name='账户许可')),
('UserGender', models.SmallIntegerField(db_column='UserGender', default=-1, verbose_name='性别')),
('UserTele', models.CharField(blank=True, db_column='UserTele', max_length=16, null=True, verbose_name='电话')),
('UserCreateTime', models.DateTimeField(db_column='UserCreateTime', default=datetime.datetime.utcnow, verbose_name='创建时间')),
('UserLastLoginDate', models.DateTimeField(db_column='UserLastLoginDate', default=datetime.datetime.utcnow, verbose_name='最后登录')),
('IsStaff', models.BooleanField(db_column='IsStaff', default=False, verbose_name='是否员工')),
('IsSuperuser', models.BooleanField(db_column='IsSuperuser', default=False, verbose_name='是否超级用户')),
('YonghuID', models.CharField(blank=True, db_column='YonghuID', db_index=True, max_length=7, null=True, unique=True, verbose_name='用户业务ID')),
('UserAvatar', models.CharField(blank=True, db_column='UserAvatar', default='a_long/morentouxiang.jpg', max_length=500, null=True, verbose_name='头像')),
('UserType', models.CharField(choices=[('normal', '普通用户'), ('dashou', '打手'), ('shop', '商家'), ('guanshi', '管事'), ('admin', '管理员'), ('kefu', '客服')], db_column='UserType', default='normal', max_length=10, verbose_name='用户类型')),
],
options={
'verbose_name': '用户',
'verbose_name_plural': '用户',
'db_table': 'User',
'managed': True,
},
),
migrations.CreateModel(
name='AccountActivation',
fields=[
('AccountActivationCode', gvsdsdk.models.FixedBinaryField(binary_length=6, db_column='AccountActivationCode', max_length=6, primary_key=True, serialize=False)),
('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID')),
('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow)),
('AccountActivationCode', gvsdsdk.models.FixedBinaryField(binary_length=6, db_column='AccountActivationCode', max_length=6, primary_key=True, serialize=False, verbose_name='激活码')),
('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', verbose_name='用户UUID')),
('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow, verbose_name='创建时间')),
],
options={
'verbose_name': '账户激活',
@@ -30,13 +58,13 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='EphemeralToken',
fields=[
('ELTUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='ELTUUID', primary_key=True, serialize=False)),
('ELTUserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='ELTUserUUID', db_index=True)),
('ELTCreateTime', models.DateTimeField(db_column='ELTCreateTime', default=datetime.datetime.utcnow)),
('ELTEndTime', models.DateTimeField(db_column='ELTEndTime', default=gvsdsdk.models._elt_end_time_default)),
('ELTType', models.SmallIntegerField(db_column='ELTType', default=0)),
('ELTAllowIP', models.JSONField(db_column='ELTAllowIP', default=list)),
('ELTStatus', models.SmallIntegerField(db_column='ELTStatus', db_index=True, default=1)),
('ELTUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='ELTUUID', primary_key=True, serialize=False, verbose_name='令牌UUID')),
('ELTUserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='ELTUserUUID', db_index=True, verbose_name='用户UUID')),
('ELTCreateTime', models.DateTimeField(db_column='ELTCreateTime', default=datetime.datetime.utcnow, verbose_name='创建时间')),
('ELTEndTime', models.DateTimeField(db_column='ELTEndTime', default=gvsdsdk.models._EltEndTimeDefault, verbose_name='过期时间')),
('ELTType', models.SmallIntegerField(db_column='ELTType', default=0, verbose_name='令牌类型')),
('ELTAllowIP', models.JSONField(db_column='ELTAllowIP', default=list, verbose_name='允许IP')),
('ELTStatus', models.SmallIntegerField(db_column='ELTStatus', db_index=True, default=1, verbose_name='状态')),
],
options={
'verbose_name': '临时令牌',
@@ -48,8 +76,8 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='Password',
fields=[
('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', primary_key=True, serialize=False)),
('Password', models.CharField(db_column='Password', max_length=1024)),
('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', primary_key=True, serialize=False, verbose_name='用户UUID')),
('Password', models.CharField(db_column='Password', max_length=1024, verbose_name='密码哈希')),
],
options={
'verbose_name': '密码',
@@ -61,12 +89,14 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='Permission',
fields=[
('PermUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='PermUUID', primary_key=True, serialize=False)),
('PermName', models.CharField(db_column='PermName', max_length=128)),
('PermCode', models.CharField(db_column='PermCode', max_length=128)),
('RoleUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='RoleUUID')),
('PermStatus', models.SmallIntegerField(db_column='PermStatus', default=1)),
('PermDesc', models.CharField(db_column='PermDesc', default='', max_length=512)),
('PermUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='PermUUID', primary_key=True, serialize=False, verbose_name='权限UUID')),
('TenantUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='TenantUUID', verbose_name='租户UUID')),
('PermName', models.CharField(db_column='PermName', max_length=128, verbose_name='权限名称')),
('PermCode', models.CharField(db_column='PermCode', max_length=128, verbose_name='权限键')),
('PermCategory', models.CharField(db_column='PermCategory', default='', max_length=64, verbose_name='权限分类')),
('PermStatus', models.SmallIntegerField(db_column='PermStatus', default=1, verbose_name='是否启用')),
('PermDesc', models.CharField(db_column='PermDesc', default='', max_length=512, verbose_name='描述')),
('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow, verbose_name='创建时间')),
],
options={
'verbose_name': '权限',
@@ -75,16 +105,72 @@ class Migration(migrations.Migration):
'managed': True,
},
),
migrations.CreateModel(
name='Position',
fields=[
('PositionUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='PositionUUID', primary_key=True, serialize=False, verbose_name='职务UUID')),
('TenantUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='TenantUUID', verbose_name='租户UUID')),
('PositionName', models.CharField(db_column='PositionName', max_length=128, verbose_name='职务名称')),
('PositionCode', models.CharField(db_column='PositionCode', default='', max_length=64, verbose_name='职务编码')),
('PositionLevel', models.SmallIntegerField(db_column='PositionLevel', default=0, verbose_name='职务级别')),
('PositionStatus', models.SmallIntegerField(db_column='PositionStatus', default=1, verbose_name='状态')),
('PositionDesc', models.CharField(db_column='PositionDesc', default='', max_length=512, verbose_name='描述')),
('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow, verbose_name='创建时间')),
('UpdateTime', models.DateTimeField(db_column='UpdateTime', default=datetime.datetime.utcnow, verbose_name='更新时间')),
],
options={
'verbose_name': '人事职务标签',
'verbose_name_plural': '人事职务标签',
'db_table': 'Position',
'managed': True,
},
),
migrations.CreateModel(
name='PositionTemplate',
fields=[
('PositionTemplateUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='PositionTemplateUUID', primary_key=True, serialize=False, verbose_name='岗位模板UUID')),
('TenantUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='TenantUUID', verbose_name='租户UUID')),
('TemplateName', models.CharField(db_column='TemplateName', max_length=128, verbose_name='模板名称')),
('TemplateCode', models.CharField(db_column='TemplateCode', default='', max_length=64, verbose_name='模板编码')),
('TemplateStatus', models.SmallIntegerField(db_column='TemplateStatus', default=1, verbose_name='模板状态')),
('TemplateDesc', models.CharField(db_column='TemplateDesc', default='', max_length=512, verbose_name='模板描述')),
('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow, verbose_name='创建时间')),
('UpdateTime', models.DateTimeField(db_column='UpdateTime', default=datetime.datetime.utcnow, verbose_name='更新时间')),
],
options={
'verbose_name': '岗位模板',
'verbose_name_plural': '岗位模板',
'db_table': 'PositionTemplate',
'managed': True,
},
),
migrations.CreateModel(
name='PositionTemplatePermission',
fields=[
('PTPermUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='PTPermUUID', primary_key=True, serialize=False, verbose_name='关联UUID')),
('PositionTemplateUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='PositionTemplateUUID', verbose_name='岗位模板UUID')),
('PermUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='PermUUID', verbose_name='权限UUID')),
('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow, verbose_name='创建时间')),
],
options={
'verbose_name': '岗位模板权限关联',
'verbose_name_plural': '岗位模板权限关联',
'db_table': 'PositionTemplatePermission',
'managed': True,
},
),
migrations.CreateModel(
name='Role',
fields=[
('RoleUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='RoleUUID', primary_key=True, serialize=False)),
('CompanyUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='CompanyUUID')),
('DeptUUID', gvsdsdk.models.UUIDField(binary_length=16, blank=True, db_column='DeptUUID', null=True)),
('RoleName', models.CharField(db_column='RoleName', max_length=128)),
('RoleType', models.SmallIntegerField(db_column='RoleType', default=2)),
('RoleStatus', models.SmallIntegerField(db_column='RoleStatus', default=1)),
('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow)),
('RoleUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='RoleUUID', primary_key=True, serialize=False, verbose_name='角色UUID')),
('TenantUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='TenantUUID', verbose_name='租户UUID')),
('RoleName', models.CharField(db_column='RoleName', max_length=128, verbose_name='角色名称')),
('RoleType', models.SmallIntegerField(db_column='RoleType', default=2, verbose_name='角色类型')),
('RoleStatus', models.SmallIntegerField(db_column='RoleStatus', default=1, verbose_name='角色状态')),
('AssignScope', models.SmallIntegerField(db_column='AssignScope', default=0, verbose_name='分配可见范围')),
('AssignScopeUUID', gvsdsdk.models.UUIDField(binary_length=16, blank=True, db_column='AssignScopeUUID', null=True, verbose_name='分配范围UUID')),
('RoleDesc', models.CharField(db_column='RoleDesc', default='', max_length=512, verbose_name='角色描述')),
('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow, verbose_name='创建时间')),
],
options={
'verbose_name': '角色',
@@ -94,55 +180,69 @@ class Migration(migrations.Migration):
},
),
migrations.CreateModel(
name='RoleDept',
name='RolePermission',
fields=[
('RoleDeptUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='RoleDeptUUID', primary_key=True, serialize=False)),
('RoleUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='RoleUUID')),
('DeptUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='DeptUUID')),
('IsMainDept', models.SmallIntegerField(db_column='IsMainDept', default=1)),
('RolePermUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='RolePermUUID', primary_key=True, serialize=False, verbose_name='关联UUID')),
('RoleUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='RoleUUID', verbose_name='角色UUID')),
('PermUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='PermUUID', verbose_name='权限UUID')),
('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow, verbose_name='创建时间')),
],
options={
'verbose_name': '角色部门关联',
'verbose_name_plural': '角色部门关联',
'db_table': 'RoleDept',
'verbose_name': '角色权限关联',
'verbose_name_plural': '角色权限关联',
'db_table': 'RolePermission',
'managed': True,
},
),
migrations.CreateModel(
name='User',
name='RoleShop',
fields=[
('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', primary_key=True, serialize=False)),
('UserName', models.CharField(db_column='UserName', max_length=256, unique=True)),
('UserPassword', models.CharField(db_column='UserPassword', default='', max_length=60)),
('UserPositionStatus', models.SmallIntegerField(db_column='UserPositionStatus', default=0)),
('UserPersonalSignature', models.CharField(db_column='UserPersonalSignature', default='', max_length=1024)),
('UserEmail', models.CharField(db_column='UserEmail', default='', max_length=256)),
('UserEmailVerify', models.SmallIntegerField(db_column='UserEmailVerify', default=0)),
('UserAccountLicense', models.SmallIntegerField(db_column='UserAccountLicense', default=1)),
('UserGender', models.SmallIntegerField(db_column='UserGender', default=-1)),
('UserTele', models.CharField(blank=True, db_column='UserTele', max_length=16, null=True)),
('UserCreateTime', models.DateTimeField(db_column='UserCreateTime', default=datetime.datetime.utcnow)),
('UserLastLoginDate', models.DateTimeField(db_column='UserLastLoginDate', default=datetime.datetime.utcnow)),
('IsStaff', models.BooleanField(db_column='IsStaff', default=False)),
('IsSuperuser', models.BooleanField(db_column='IsSuperuser', default=False)),
('RoleShopUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='RoleShopUUID', primary_key=True, serialize=False, verbose_name='关联UUID')),
('RoleUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='RoleUUID', verbose_name='角色UUID')),
('ShopUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='ShopUUID', verbose_name='商铺UUID')),
('IsMainShop', models.SmallIntegerField(db_column='IsMainShop', default=0, verbose_name='主商铺')),
('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow, verbose_name='创建时间')),
],
options={
'verbose_name': '用户',
'verbose_name_plural': '用户',
'db_table': 'User',
'verbose_name': '角色商铺关联',
'verbose_name_plural': '角色商铺关联',
'db_table': 'RoleShop',
'managed': True,
},
),
migrations.CreateModel(
name='Shop',
fields=[
('ShopUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='ShopUUID', primary_key=True, serialize=False, verbose_name='商铺UUID')),
('CompanyUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='CompanyUUID', verbose_name='公司UUID')),
('ShopName', models.CharField(db_column='ShopName', max_length=128, verbose_name='商铺名称')),
('ShopCode', models.CharField(db_column='ShopCode', default='', max_length=64, verbose_name='商铺编码')),
('ShopType', models.SmallIntegerField(db_column='ShopType', default=0, verbose_name='商铺类型')),
('ShopStatus', models.SmallIntegerField(db_column='ShopStatus', default=1, verbose_name='商铺状态')),
('ShopAddress', models.CharField(db_column='ShopAddress', default='', max_length=512, verbose_name='商铺地址')),
('ShopContact', models.CharField(db_column='ShopContact', default='', max_length=128, verbose_name='联系人')),
('ShopPhone', models.CharField(db_column='ShopPhone', default='', max_length=32, verbose_name='联系电话')),
('ShopDesc', models.CharField(db_column='ShopDesc', default='', max_length=512, verbose_name='描述')),
('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow, verbose_name='创建时间')),
('UpdateTime', models.DateTimeField(db_column='UpdateTime', default=datetime.datetime.utcnow, verbose_name='更新时间')),
],
options={
'verbose_name': '商铺',
'verbose_name_plural': '商铺',
'db_table': 'Shop',
'managed': True,
},
),
migrations.CreateModel(
name='User2FA',
fields=[
('User2FAUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='User2FAUUID', primary_key=True, serialize=False)),
('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', db_index=True)),
('SecretKey', models.CharField(db_column='SecretKey', max_length=64)),
('IsEnabled', models.SmallIntegerField(db_column='IsEnabled', default=0)),
('Verified', models.SmallIntegerField(db_column='Verified', default=0)),
('LastUsedAt', models.DateTimeField(blank=True, db_column='LastUsedAt', null=True)),
('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow)),
('User2FAUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='User2FAUUID', primary_key=True, serialize=False, verbose_name='2FA UUID')),
('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', db_index=True, verbose_name='用户UUID')),
('SecretKey', models.CharField(db_column='SecretKey', max_length=64, verbose_name='密钥')),
('IsEnabled', models.SmallIntegerField(db_column='IsEnabled', default=0, verbose_name='是否启用')),
('Verified', models.SmallIntegerField(db_column='Verified', default=0, verbose_name='已验证')),
('LastUsedAt', models.DateTimeField(blank=True, db_column='LastUsedAt', null=True, verbose_name='最后使用')),
('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow, verbose_name='创建时间')),
],
options={
'verbose_name': '双因素认证',
@@ -154,9 +254,9 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='UserABAC',
fields=[
('UserABACUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserABACUUID', primary_key=True, serialize=False)),
('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID')),
('HierarchicalPermissionIdentifiers', models.CharField(db_column='HierarchicalPermissionIdentifiers', max_length=256)),
('UserABACUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserABACUUID', primary_key=True, serialize=False, verbose_name='ABAC UUID')),
('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', verbose_name='用户UUID')),
('HierarchicalPermissionIdentifiers', models.CharField(db_column='HierarchicalPermissionIdentifiers', max_length=256, verbose_name='层级权限标识')),
],
options={
'verbose_name': '用户ABAC',
@@ -168,10 +268,10 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='UserAvatar',
fields=[
('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', primary_key=True, serialize=False)),
('UserAvatar', models.BinaryField(db_column='UserAvatar', editable=True)),
('AvatarUploadTime', models.DateTimeField(db_column='AvatarUploadTime', default=datetime.datetime.utcnow)),
('AvatarFileType', models.CharField(db_column='AvatarFileType', default='png', max_length=16)),
('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', primary_key=True, serialize=False, verbose_name='用户UUID')),
('UserAvatar', models.BinaryField(db_column='UserAvatar', editable=True, verbose_name='头像数据')),
('AvatarUploadTime', models.DateTimeField(db_column='AvatarUploadTime', default=datetime.datetime.utcnow, verbose_name='上传时间')),
('AvatarFileType', models.CharField(db_column='AvatarFileType', default='png', max_length=16, verbose_name='文件类型')),
],
options={
'verbose_name': '用户头像',
@@ -180,16 +280,33 @@ class Migration(migrations.Migration):
'managed': True,
},
),
migrations.CreateModel(
name='UserDept',
fields=[
('UserDeptUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserDeptUUID', primary_key=True, serialize=False, verbose_name='关联UUID')),
('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', verbose_name='用户UUID')),
('DeptUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='DeptUUID', verbose_name='部门UUID')),
('PositionUUID', gvsdsdk.models.UUIDField(binary_length=16, blank=True, db_column='PositionUUID', null=True, verbose_name='职务标签UUID')),
('IsMainDept', models.SmallIntegerField(db_column='IsMainDept', default=1, verbose_name='是否主部门')),
('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow, verbose_name='创建时间')),
],
options={
'verbose_name': '员工部门关联',
'verbose_name_plural': '员工部门关联',
'db_table': 'UserDept',
'managed': True,
},
),
migrations.CreateModel(
name='UserLoginLog',
fields=[
('LogUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='LogUUID', primary_key=True, serialize=False)),
('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', db_index=True)),
('LoginIP', models.CharField(db_column='LoginIP', max_length=39)),
('LoginPlatform', models.CharField(db_column='LoginPlatform', max_length=32)),
('LoginStatus', models.SmallIntegerField(db_column='LoginStatus')),
('LoginTime', models.DateTimeField(db_column='LoginTime', default=datetime.datetime.utcnow)),
('UserAgent', models.CharField(db_column='UserAgent', default='', max_length=512)),
('LogUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='LogUUID', primary_key=True, serialize=False, verbose_name='日志UUID')),
('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', db_index=True, verbose_name='用户UUID')),
('LoginIP', models.CharField(db_column='LoginIP', max_length=39, verbose_name='登录IP')),
('LoginPlatform', models.CharField(db_column='LoginPlatform', max_length=32, verbose_name='登录平台')),
('LoginStatus', models.SmallIntegerField(db_column='LoginStatus', verbose_name='登录状态')),
('LoginTime', models.DateTimeField(db_column='LoginTime', default=datetime.datetime.utcnow, verbose_name='登录时间')),
('UserAgent', models.CharField(db_column='UserAgent', default='', max_length=512, verbose_name='用户代理')),
],
options={
'verbose_name': '登录日志',
@@ -201,10 +318,10 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='UserPending2FA',
fields=[
('PendingUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='PendingUUID', primary_key=True, serialize=False)),
('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', unique=True)),
('SecretKey', models.CharField(db_column='SecretKey', max_length=64)),
('ExpireAt', models.DateTimeField(db_column='ExpireAt')),
('PendingUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='PendingUUID', primary_key=True, serialize=False, verbose_name='待确认UUID')),
('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', unique=True, verbose_name='用户UUID')),
('SecretKey', models.CharField(db_column='SecretKey', max_length=64, verbose_name='密钥')),
('ExpireAt', models.DateTimeField(db_column='ExpireAt', verbose_name='过期时间')),
],
options={
'verbose_name': '2FA待确认',
@@ -216,10 +333,11 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='UserRole',
fields=[
('UserRoleUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserRoleUUID', primary_key=True, serialize=False)),
('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID')),
('RoleUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='RoleUUID')),
('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow)),
('UserRoleUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserRoleUUID', primary_key=True, serialize=False, verbose_name='关联UUID')),
('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', verbose_name='用户UUID')),
('RoleUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='RoleUUID', verbose_name='角色UUID')),
('CompanyUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='CompanyUUID', verbose_name='公司UUID')),
('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow, verbose_name='创建时间')),
],
options={
'verbose_name': '用户角色关联',

View File

@@ -1,90 +0,0 @@
# Generated by Django 6.0.5 on 2026-06-13 12:29
import datetime
import gvsdsdk.models
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('gvsdsdk', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='Position',
fields=[
('PositionUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='PositionUUID', primary_key=True, serialize=False)),
('CompanyUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='CompanyUUID')),
('PositionName', models.CharField(db_column='PositionName', max_length=128)),
('PositionCode', models.CharField(db_column='PositionCode', default='', max_length=64)),
('PositionLevel', models.SmallIntegerField(db_column='PositionLevel', default=0)),
('PositionStatus', models.SmallIntegerField(db_column='PositionStatus', default=1)),
('PositionDesc', models.CharField(db_column='PositionDesc', default='', max_length=512)),
('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow)),
('UpdateTime', models.DateTimeField(db_column='UpdateTime', default=datetime.datetime.utcnow)),
],
options={
'verbose_name': '职务',
'verbose_name_plural': '职务',
'db_table': 'Position',
'managed': True,
},
),
migrations.CreateModel(
name='RolePosition',
fields=[
('RolePositionUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='RolePositionUUID', primary_key=True, serialize=False)),
('RoleUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='RoleUUID')),
('PositionUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='PositionUUID')),
('IsMainPosition', models.SmallIntegerField(db_column='IsMainPosition', default=0)),
('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow)),
],
options={
'verbose_name': '角色职务关联',
'verbose_name_plural': '角色职务关联',
'db_table': 'RolePosition',
'managed': True,
},
),
migrations.CreateModel(
name='RoleShop',
fields=[
('RoleShopUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='RoleShopUUID', primary_key=True, serialize=False)),
('RoleUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='RoleUUID')),
('ShopUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='ShopUUID')),
('IsMainShop', models.SmallIntegerField(db_column='IsMainShop', default=0)),
('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow)),
],
options={
'verbose_name': '角色商铺关联',
'verbose_name_plural': '角色商铺关联',
'db_table': 'RoleShop',
'managed': True,
},
),
migrations.CreateModel(
name='Shop',
fields=[
('ShopUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='ShopUUID', primary_key=True, serialize=False)),
('CompanyUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='CompanyUUID')),
('ShopName', models.CharField(db_column='ShopName', max_length=128)),
('ShopCode', models.CharField(db_column='ShopCode', default='', max_length=64)),
('ShopType', models.SmallIntegerField(db_column='ShopType', default=0)),
('ShopStatus', models.SmallIntegerField(db_column='ShopStatus', default=1)),
('ShopAddress', models.CharField(db_column='ShopAddress', default='', max_length=512)),
('ShopContact', models.CharField(db_column='ShopContact', default='', max_length=128)),
('ShopPhone', models.CharField(db_column='ShopPhone', default='', max_length=32)),
('ShopDesc', models.CharField(db_column='ShopDesc', default='', max_length=512)),
('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow)),
('UpdateTime', models.DateTimeField(db_column='UpdateTime', default=datetime.datetime.utcnow)),
],
options={
'verbose_name': '商铺',
'verbose_name_plural': '商铺',
'db_table': 'Shop',
'managed': True,
},
),
]

View File

@@ -294,62 +294,6 @@ class _CastJsonExpression:
return f'CastJsonExpr({self.field_name}[{self.key!r}]->{type_name})'
class ForeignKeyIdDescriptor:
"""FK 字段描述符:类级别访问返回 FieldExpression实例级别访问/设置委托给原始 Django 字段。"""
def __init__(self, fk_name):
self.fk_name = fk_name
self.id_attr = fk_name + '_id'
self._original_field = None # 延迟绑定原始 Django 字段
def _get_original_field(self, owner):
if self._original_field is None:
try:
self._original_field = owner._meta.get_field(self.fk_name)
except Exception:
pass
return self._original_field
def __get__(self, obj, objtype=None):
if obj is None:
return FieldExpression(objtype, self.id_attr)
return getattr(obj, self.id_attr)
def __set__(self, obj, value):
# 直接写入实例 __dict__避免触发描述符递归
obj.__dict__[self.id_attr] = value
class FieldExpressionDescriptor:
"""普通字段描述符:类级别访问返回 FieldExpression实例级别访问/设置委托给原始 Django 字段。"""
def __init__(self, field_name):
self.field_name = field_name
self._original_field = None # 延迟绑定原始 Django 字段
def _get_original_field(self, owner):
if self._original_field is None:
try:
self._original_field = owner._meta.get_field(self.field_name)
except Exception:
pass
return self._original_field
def __get__(self, obj, objtype=None):
if obj is None:
return FieldExpression(objtype, self.field_name)
# 实例级别:从 __dict__ 获取,或让 Django 字段描述符处理
if self.field_name in obj.__dict__:
return obj.__dict__[self.field_name]
# 委托给原始 Django 字段
orig = self._get_original_field(objtype)
if orig is not None:
return orig.__get__(obj, objtype)
return getattr(obj, self.field_name)
def __set__(self, obj, value):
# 直接写入实例 __dict__避免触发描述符递归
obj.__dict__[self.field_name] = value
class QModelBase(models.base.ModelBase):
def __new__(mcs, name, bases, namespace, **kwargs):
# 不再强制设置 db_column —— Django 会自动处理

View File

@@ -172,11 +172,16 @@ class UserManager(BaseUserManager):
# === 用户表 ===
class User(QModel):
"""用户表——系统核心身份模型(映射 SAAS 主库 User 表)"""
"""用户表——系统核心身份模型
去远程化后存储在本地数据库,作为 AUTH_USER_MODEL。
在 SAAS 主库字段基础上增加本地业务字段YonghuID/UserAvatar/UserType
敏感数据OpenID/支付信息)存放在 users.UserSensitiveData 表。
"""
UserUUID = UUIDField(primary_key=True, db_column='UserUUID', verbose_name='用户UUID')
UserName = models.CharField(max_length=256, unique=True, db_column='UserName', verbose_name='用户名')
UserPassword = models.CharField(max_length=60, default='', db_column='UserPassword', verbose_name='密码')
UserPassword = models.CharField(max_length=200, default='', db_column='UserPassword', verbose_name='密码')
UserPositionStatus = models.SmallIntegerField(default=0, db_column='UserPositionStatus', verbose_name='职位状态')
UserPersonalSignature = models.CharField(max_length=1024, default='', db_column='UserPersonalSignature', verbose_name='个人签名')
UserEmail = models.CharField(max_length=256, default='', db_column='UserEmail', verbose_name='邮箱')
@@ -189,17 +194,261 @@ class User(QModel):
IsStaff = models.BooleanField(default=False, db_column='IsStaff', verbose_name='是否员工')
IsSuperuser = models.BooleanField(default=False, db_column='IsSuperuser', verbose_name='是否超级用户')
# === 本地业务字段(去远程化新增) ===
YonghuID = models.CharField(max_length=7, unique=True, null=True, blank=True, db_index=True, db_column='YonghuID', verbose_name='用户业务ID')
UserAvatar = models.CharField(max_length=500, null=True, blank=True, default='a_long/morentouxiang.jpg', db_column='UserAvatar', verbose_name='头像')
UserType = models.CharField(
max_length=10,
choices=[
('normal', '普通用户'),
('dashou', '打手'),
('shop', '商家'),
('guanshi', '管事'),
('admin', '管理员'),
('kefu', '客服'),
],
default='normal', db_column='UserType', verbose_name='用户类型'
)
objects = UserManager()
# Django auth 框架要求
USERNAME_FIELD = 'YonghuID'
REQUIRED_FIELDS = ['UserName']
class Meta:
managed = False
managed = True
app_label = 'gvsdsdk'
db_table = 'User'
verbose_name = '用户'
verbose_name_plural = '用户'
def __str__(self):
return self.UserName
return self.YonghuID or self.UserName
# === 兼容属性snake_case → PascalCase 映射,保持现有代码兼容) ===
@property
def yonghuid(self):
"""兼容 UserMain.yonghuid"""
return self.YonghuID
@yonghuid.setter
def yonghuid(self, value):
self.YonghuID = value
@property
def avatar(self):
"""兼容 UserMain.avatar"""
return self.UserAvatar
@avatar.setter
def avatar(self, value):
self.UserAvatar = value
@property
def user_type(self):
"""兼容 UserMain.user_type"""
return self.UserType
@user_type.setter
def user_type(self, value):
self.UserType = value
@property
def phone(self):
"""兼容 UserMain.phone"""
return self.UserTele
@phone.setter
def phone(self, value):
self.UserTele = value
@property
def openid(self):
"""兼容 UserMain.openid —— 从 UserSensitiveData 延迟加载"""
if hasattr(self, '_openid_cache'):
return self._openid_cache
try:
from users.models import UserSensitiveData
sd = UserSensitiveData.objects.filter(UserUUID=self.UserUUID).first()
self._openid_cache = sd.OpenID if sd else None
except Exception:
self._openid_cache = None
return self._openid_cache
@openid.setter
def openid(self, value):
"""设置 openid —— 写入 UserSensitiveData"""
from users.models import UserSensitiveData
sd, created = UserSensitiveData.objects.get_or_create(
UserUUID=self.UserUUID,
defaults={'OpenID': value or ''}
)
if not created:
sd.OpenID = value or ''
sd.save(update_fields=['OpenID'])
self._openid_cache = value
@property
def unionid(self):
"""兼容 UserMain.unionid"""
if hasattr(self, '_unionid_cache'):
return self._unionid_cache
try:
from users.models import UserSensitiveData
sd = UserSensitiveData.objects.filter(UserUUID=self.UserUUID).first()
self._unionid_cache = sd.UnionID if sd else None
except Exception:
self._unionid_cache = None
return self._unionid_cache
@unionid.setter
def unionid(self, value):
from users.models import UserSensitiveData
sd, created = UserSensitiveData.objects.get_or_create(
UserUUID=self.UserUUID,
defaults={'UnionID': value or ''}
)
if not created:
sd.UnionID = value or ''
sd.save(update_fields=['UnionID'])
@property
def password(self):
"""兼容 UserMain.password —— 从 UserSensitiveData 加载"""
if hasattr(self, '_password_cache'):
return self._password_cache
try:
from users.models import UserSensitiveData
sd = UserSensitiveData.objects.filter(UserUUID=self.UserUUID).first()
self._password_cache = sd.Password if sd else ''
except Exception:
self._password_cache = ''
return self._password_cache
@password.setter
def password(self, value):
"""设置 password —— 写入 UserSensitiveData"""
from users.models import UserSensitiveData
sd, created = UserSensitiveData.objects.get_or_create(
UserUUID=self.UserUUID,
defaults={'Password': value or ''}
)
if not created:
sd.Password = value or ''
sd.save(update_fields=['Password'])
self._password_cache = value
@property
def zhifu(self):
"""兼容 UserMain.zhifu"""
try:
from users.models import UserSensitiveData
sd = UserSensitiveData.objects.filter(UserUUID=self.UserUUID).first()
return sd.Zhifu if sd else None
except Exception:
return None
@zhifu.setter
def zhifu(self, value):
from users.models import UserSensitiveData
sd, created = UserSensitiveData.objects.get_or_create(
UserUUID=self.UserUUID,
defaults={'Zhifu': value or ''}
)
if not created:
sd.Zhifu = value or ''
sd.save(update_fields=['Zhifu'])
@property
def skzhanghao(self):
"""兼容 UserMain.skzhanghao"""
try:
from users.models import UserSensitiveData
sd = UserSensitiveData.objects.filter(UserUUID=self.UserUUID).first()
return sd.SKZhanghao if sd else None
except Exception:
return None
@skzhanghao.setter
def skzhanghao(self, value):
from users.models import UserSensitiveData
sd, created = UserSensitiveData.objects.get_or_create(
UserUUID=self.UserUUID,
defaults={'SKZhanghao': value or ''}
)
if not created:
sd.SKZhanghao = value or ''
sd.save(update_fields=['SKZhanghao'])
@property
def ip(self):
"""兼容 UserMain.ip"""
try:
from users.models import UserSensitiveData
sd = UserSensitiveData.objects.filter(UserUUID=self.UserUUID).first()
return sd.IP if sd else None
except Exception:
return None
@ip.setter
def ip(self, value):
from users.models import UserSensitiveData
sd, created = UserSensitiveData.objects.get_or_create(
UserUUID=self.UserUUID,
defaults={'IP': value or ''}
)
if not created:
sd.IP = value or ''
sd.save(update_fields=['IP'])
@property
def shoujihao_renzheng(self):
"""兼容 UserMain.shoujihao_renzheng"""
try:
from users.models import UserSensitiveData
sd = UserSensitiveData.objects.filter(UserUUID=self.UserUUID).first()
return sd.PhoneVerified if sd else False
except Exception:
return False
@shoujihao_renzheng.setter
def shoujihao_renzheng(self, value):
from users.models import UserSensitiveData
sd, created = UserSensitiveData.objects.get_or_create(
UserUUID=self.UserUUID,
defaults={'PhoneVerified': value}
)
if not created:
sd.PhoneVerified = value
sd.save(update_fields=['PhoneVerified'])
@property
def last_login_time(self):
"""兼容 UserMain.last_login_time"""
return self.UserLastLoginDate
@last_login_time.setter
def last_login_time(self, value):
self.UserLastLoginDate = value
@property
def create_time(self):
"""兼容 UserMain.create_time"""
return self.UserCreateTime
@property
def id(self):
"""兼容 UserMain.id —— 返回 YonghuID业务主键"""
return self.YonghuID
@property
def pk(self):
"""Django 内部使用 —— 返回 UserUUID"""
return self.UserUUID
# === gvsdsdk 原生方法 ===
@property
def UUIDStr(self):
@@ -254,31 +503,15 @@ class User(QModel):
"""获取电话,空则返回默认文本"""
return self.UserTele or '未填写'
def GetCompanies(self):
"""获取用户所属公司列表"""
# Company 模型不在 gvsdsdk 中,此处返回空 QuerySet
# 如需使用,请在子服务器中自行实现
return []
def GetRoles(self):
"""获取用户角色列表(需在同一 database 连接下使用)"""
"""获取用户角色列表"""
user_role_uuids = UserRole.objects.filter(
UserUUID=self.UserUUID
).values_list('RoleUUID', flat=True)
return Role.objects.filter(RoleUUID__in=user_role_uuids)
def GetDepartments(self):
"""获取用户部门列表"""
# Department 模型不在 gvsdsdk 中,此处返回空列表
# 如需使用,请在子服务器中自行实现
return []
def HasPermission(self, PermCode):
"""检查用户是否拥有指定权限(需在同一 database 连接下使用)
通过 UserRole → RolePermission → Permission 链路查询,
汇总所有角色的操作权限后判断。
"""
"""检查用户是否拥有指定权限"""
user_role_uuids = UserRole.objects.filter(
UserUUID=self.UserUUID
).values_list('RoleUUID', flat=True)
@@ -291,7 +524,7 @@ class User(QModel):
PermStatus=1,
).exists()
# Django auth 框架兼容(内部使用蛇形命名)
# Django auth 框架兼容(蛇形命名)
@property
def is_active(self):
return self.IsActive
@@ -304,14 +537,6 @@ class User(QModel):
def is_authenticated(self):
return self.IsAuthenticated
@property
def pk(self):
return self.PK
@property
def id(self):
return self.ID
def set_password(self, raw_password):
self.SetPassword(raw_password)