进行了 GVSDSDK 迁移,可能存在诸多问题
This commit is contained in:
@@ -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 = '员工部门关联'
|
||||
|
||||
Reference in New Issue
Block a user