进行了 GVSDSDK 迁移,可能存在诸多问题

This commit is contained in:
2026-06-17 20:37:47 +08:00
parent 72770ad73b
commit d00f0d08e5
132 changed files with 161593 additions and 4827 deletions

View File

@@ -186,17 +186,33 @@ class User(QModel):
UserTele = models.CharField(max_length=16, null=True, blank=True, db_column='UserTele', verbose_name='电话')
UserCreateTime = models.DateTimeField(default=_datetime.datetime.utcnow, db_column='UserCreateTime', verbose_name='创建时间')
UserLastLoginDate = models.DateTimeField(default=_datetime.datetime.utcnow, db_column='UserLastLoginDate', verbose_name='最后登录')
# === 本地业务字段(去远程化后新增) ===
UserUID = models.CharField(max_length=7, unique=True, db_column='UserUID', verbose_name='用户业务ID', null=True, blank=True)
OpenID = models.CharField(max_length=64, unique=True, db_column='OpenID', verbose_name='微信OpenID', null=True, blank=True)
UnionID = models.CharField(max_length=64, db_column='UnionID', verbose_name='微信UnionID', null=True, blank=True)
Avatar = models.CharField(max_length=500, default='a_long/morentouxiang.jpg', db_column='Avatar', verbose_name='头像')
Phone = models.CharField(max_length=11, db_column='Phone', verbose_name='手机号', null=True, blank=True)
PhoneVerified = models.BooleanField(default=False, db_column='PhoneVerified', verbose_name='手机号是否已认证')
IP = models.CharField(max_length=50, db_column='IP', verbose_name='来访用户IP', null=True, blank=True)
IsStaff = models.BooleanField(default=False, db_column='IsStaff', verbose_name='是否员工')
IsSuperuser = models.BooleanField(default=False, db_column='IsSuperuser', verbose_name='是否超级用户')
objects = UserManager()
# Django auth 框架必需
USERNAME_FIELD = 'UserName'
REQUIRED_FIELDS = ['UserUID']
class Meta:
managed = False
managed = True # 将由 QModelBase.__new__ 根据 GVSDSDK_MANAGE_TABLES 动态设置
app_label = 'gvsdsdk'
db_table = 'User'
verbose_name = '用户'
verbose_name_plural = '用户'
indexes = [
models.Index(fields=['UserUID']),
models.Index(fields=['OpenID']),
]
def __str__(self):
return self.UserName
@@ -304,6 +320,66 @@ class User(QModel):
def is_authenticated(self):
return self.IsAuthenticated
@property
def yonghuid(self):
"""兼容旧代码的 yonghuid 属性"""
return self.UserUID
@property
def openid(self):
"""兼容旧代码的 openid 属性"""
return self.OpenID
@property
def user_type(self):
"""兼容旧代码的 user_type 属性 — 通过 UserRole 推断(带实例缓存)"""
# 实例缓存:同一请求内只查一次
if hasattr(self, '_cached_user_type'):
return self._cached_user_type
try:
# 单次查询获取所有角色名
role_uuids = UserRole.objects.filter(
UserUUID=self.UserUUID
).values_list('RoleUUID', flat=True)
role_names = set(
Role.objects.filter(RoleUUID__in=role_uuids)
.values_list('RoleName', flat=True)
)
# 优先级:管理员 > 客服 > 负责人 > 组长 > 审核官 > 商家 > 打手
for rn in role_names:
if '管理员' in rn or 'admin' in rn.lower():
self._cached_user_type = 'admin'
return 'admin'
for rn in role_names:
if '客服' in rn or 'kefu' in rn.lower():
self._cached_user_type = 'kefu'
return 'kefu'
for rn in role_names:
if '负责人' in rn or '管事' in rn or 'guanshi' in rn.lower():
self._cached_user_type = 'guanshi'
return 'guanshi'
for rn in role_names:
if '组长' in rn or 'zuzhang' in rn.lower():
self._cached_user_type = 'zuzhang'
return 'zuzhang'
for rn in role_names:
if '审核' in rn or 'shenheguan' in rn.lower():
self._cached_user_type = 'shenheguan'
return 'shenheguan'
for rn in role_names:
if '商家' in rn or 'shangjia' in rn.lower():
self._cached_user_type = 'shop'
return 'shop'
for rn in role_names:
if '打手' in rn or 'dashou' in rn.lower():
self._cached_user_type = 'dashou'
return 'dashou'
self._cached_user_type = 'normal'
return 'normal'
except Exception:
self._cached_user_type = 'normal'
return 'normal'
@property
def pk(self):
return self.PK
@@ -318,6 +394,73 @@ class User(QModel):
def check_password(self, raw_password):
return self.CheckPassword(raw_password)
@property
def dashou_profile(self):
"""兼容旧代码"""
from users.models import UserDashou
return UserDashou.objects.filter(user=self).first()
@property
def shop_profile(self):
"""兼容旧代码"""
from users.models import UserShangjia
return UserShangjia.objects.filter(user=self).first()
@property
def guanshi_profile(self):
"""兼容旧代码"""
from users.models import UserGuanshi
return UserGuanshi.objects.filter(user=self).first()
@property
def boss_profile(self):
"""兼容旧代码"""
from users.models import UserBoss
return UserBoss.objects.filter(user=self).first()
@property
def admin_profile(self):
"""兼容旧代码"""
from users.models import AdminProfile
return AdminProfile.objects.filter(user=self).first()
@property
def kefu_profile(self):
"""兼容旧代码"""
from users.models import UserKefu
return UserKefu.objects.filter(user=self).first()
@property
def zuzhang_profile(self):
"""兼容旧代码"""
from users.models import UserZuzhang
return UserZuzhang.objects.filter(user=self).first()
@property
def shenheguan_profile(self):
"""兼容旧代码"""
from users.models import UserShenheguan
return UserShenheguan.objects.filter(user=self).first()
def has_role(self, role_code):
"""检查用户是否拥有指定角色(支持角色名或旧 user_type 值)"""
# 角色名映射:旧 user_type → 角色名
ROLE_CODE_MAP = {
'admin': '管理员', 'kefu': '客服', 'guanshi': '负责人',
'zuzhang': '组长', 'shenheguan': '审核官', 'shop': '商家',
'dashou': '打手', 'normal': '消费者',
}
target = ROLE_CODE_MAP.get(role_code, role_code)
try:
role_uuids = UserRole.objects.filter(
UserUUID=self.UserUUID
).values_list('RoleUUID', flat=True)
return Role.objects.filter(
RoleUUID__in=role_uuids, RoleName=target
).exists()
except Exception:
return False
# === 用户头像表 ===
@@ -330,7 +473,7 @@ class UserAvatar(QModel):
AvatarFileType = models.CharField(max_length=16, default='png', db_column='AvatarFileType', verbose_name='文件类型')
class Meta:
managed = False
managed = True
app_label = 'gvsdsdk'
db_table = 'UserAvatar'
verbose_name = '用户头像'
@@ -351,7 +494,7 @@ class User2FA(QModel):
CreateTime = models.DateTimeField(default=_datetime.datetime.utcnow, db_column='CreateTime', verbose_name='创建时间')
class Meta:
managed = False
managed = True
app_label = 'gvsdsdk'
db_table = 'User2FA'
verbose_name = '双因素认证'
@@ -369,7 +512,7 @@ class UserPending2FA(QModel):
ExpireAt = models.DateTimeField(db_column='ExpireAt', verbose_name='过期时间')
class Meta:
managed = False
managed = True
app_label = 'gvsdsdk'
db_table = 'UserPending2FA'
verbose_name = '2FA待确认'
@@ -396,7 +539,7 @@ class EphemeralToken(QModel):
ELTStatus = models.SmallIntegerField(default=1, db_index=True, db_column='ELTStatus', verbose_name='状态')
class Meta:
managed = False
managed = True
app_label = 'gvsdsdk'
db_table = 'EphemeralToken'
verbose_name = '临时令牌'
@@ -425,7 +568,7 @@ class UserLoginLog(QModel):
UserAgent = models.CharField(max_length=512, default='', db_column='UserAgent', verbose_name='用户代理')
class Meta:
managed = False
managed = True
app_label = 'gvsdsdk'
db_table = 'UserLoginLog'
verbose_name = '登录日志'
@@ -442,7 +585,7 @@ class AccountActivation(QModel):
CreateTime = models.DateTimeField(default=_datetime.datetime.utcnow, db_column='CreateTime', verbose_name='创建时间')
class Meta:
managed = False
managed = True
app_label = 'gvsdsdk'
db_table = 'AccountActivation'
verbose_name = '账户激活'
@@ -472,7 +615,7 @@ class Role(QModel):
CreateTime = models.DateTimeField(default=_datetime.datetime.utcnow, db_column='CreateTime', verbose_name='创建时间')
class Meta:
managed = False
managed = True
app_label = 'gvsdsdk'
db_table = 'Role'
verbose_name = '角色'
@@ -516,7 +659,7 @@ class Permission(QModel):
CreateTime = models.DateTimeField(default=_datetime.datetime.utcnow, db_column='CreateTime', verbose_name='创建时间')
class Meta:
managed = False
managed = True
app_label = 'gvsdsdk'
db_table = 'Permission'
verbose_name = '权限'
@@ -555,7 +698,7 @@ class UserRole(QModel):
CreateTime = models.DateTimeField(default=_datetime.datetime.utcnow, db_column='CreateTime', verbose_name='创建时间')
class Meta:
managed = False
managed = True
app_label = 'gvsdsdk'
db_table = 'UserRole'
verbose_name = '用户角色关联'
@@ -577,7 +720,7 @@ class RolePermission(QModel):
CreateTime = models.DateTimeField(default=_datetime.datetime.utcnow, db_column='CreateTime', verbose_name='创建时间')
class Meta:
managed = False
managed = True
app_label = 'gvsdsdk'
db_table = 'RolePermission'
verbose_name = '角色权限关联'
@@ -594,7 +737,7 @@ class UserABAC(QModel):
HierarchicalPermissionIdentifiers = models.CharField(max_length=256, db_column='HierarchicalPermissionIdentifiers', verbose_name='层级权限标识')
class Meta:
managed = False
managed = True
app_label = 'gvsdsdk'
db_table = 'UserABAC'
verbose_name = '用户ABAC'
@@ -610,7 +753,7 @@ class Password(QModel):
Password = models.CharField(max_length=1024, db_column='Password', verbose_name='密码哈希')
class Meta:
managed = False
managed = True
app_label = 'gvsdsdk'
db_table = 'Password'
verbose_name = '密码'
@@ -639,7 +782,7 @@ class Shop(QModel):
UpdateTime = models.DateTimeField(default=_datetime.datetime.utcnow, db_column='UpdateTime', verbose_name='更新时间')
class Meta:
managed = False
managed = True
app_label = 'gvsdsdk'
db_table = 'Shop'
verbose_name = '商铺'
@@ -671,7 +814,7 @@ class RoleShop(QModel):
CreateTime = models.DateTimeField(default=_datetime.datetime.utcnow, db_column='CreateTime', verbose_name='创建时间')
class Meta:
managed = False
managed = True
app_label = 'gvsdsdk'
db_table = 'RoleShop'
verbose_name = '角色商铺关联'
@@ -700,7 +843,7 @@ class PositionTemplate(QModel):
UpdateTime = models.DateTimeField(default=_datetime.datetime.utcnow, db_column='UpdateTime', verbose_name='更新时间')
class Meta:
managed = False
managed = True
app_label = 'gvsdsdk'
db_table = 'PositionTemplate'
verbose_name = '岗位模板'
@@ -750,7 +893,7 @@ class PositionTemplatePermission(QModel):
CreateTime = models.DateTimeField(default=_datetime.datetime.utcnow, db_column='CreateTime', verbose_name='创建时间')
class Meta:
managed = False
managed = True
app_label = 'gvsdsdk'
db_table = 'PositionTemplatePermission'
verbose_name = '岗位模板权限关联'
@@ -778,7 +921,7 @@ class Position(QModel):
UpdateTime = models.DateTimeField(default=_datetime.datetime.utcnow, db_column='UpdateTime', verbose_name='更新时间')
class Meta:
managed = False
managed = True
app_label = 'gvsdsdk'
db_table = 'Position'
verbose_name = '人事职务标签'
@@ -806,7 +949,7 @@ class UserDept(QModel):
CreateTime = models.DateTimeField(default=_datetime.datetime.utcnow, db_column='CreateTime', verbose_name='创建时间')
class Meta:
managed = False
managed = True
app_label = 'gvsdsdk'
db_table = 'UserDept'
verbose_name = '员工部门关联'