|
|
@@ -1,7 +1,7 @@
|
|
|
# -*- coding: utf-8 -*-
|
|
|
# @Author : YY
|
|
|
|
|
|
-from typing import List, Optional
|
|
|
+from typing import List, Optional
|
|
|
from flask import g
|
|
|
from sqlalchemy import and_, or_, func, insert, select, update
|
|
|
|
|
|
@@ -12,23 +12,23 @@ from ruoyi_common.sqlalchemy.transaction import Transactional
|
|
|
from ruoyi_system.domain.po import SysDeptPo, SysRolePo, SysUserPo, \
|
|
|
SysUserRolePo
|
|
|
from ruoyi_admin.ext import db
|
|
|
+from ruoyi_common.utils import security_util as SecurityUtil
|
|
|
|
|
|
|
|
|
class SysUserMapper:
|
|
|
-
|
|
|
"""
|
|
|
用户数据访问层
|
|
|
"""
|
|
|
|
|
|
default_fields = {
|
|
|
"user_id", "dept_id", "user_name", "nick_name", "email", "phonenumber",
|
|
|
- "avatar", "status", "password", "sex", "del_flag", "login_ip",
|
|
|
+ "avatar", "status", "password", "sex", "del_flag", "login_ip",
|
|
|
"login_date", "create_by", "create_time", "update_by", "update_time",
|
|
|
"remark"
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
default_columns = ColumnEntityList(SysUserPo, default_fields, False)
|
|
|
-
|
|
|
+
|
|
|
@classmethod
|
|
|
def select_user_list(cls, user: SysUser) -> List[SysUser]:
|
|
|
"""
|
|
|
@@ -40,45 +40,52 @@ class SysUserMapper:
|
|
|
Returns:
|
|
|
用户信息列表
|
|
|
"""
|
|
|
- dept_vo_fields = {"dept_name","leader"}
|
|
|
+ print(user)
|
|
|
+ dept_vo_fields = {"dept_name", "leader"}
|
|
|
user_columns = ColumnEntityList(SysUserPo, cls.default_fields)
|
|
|
dept_columns = ColumnEntityList(SysDeptPo, dept_vo_fields)
|
|
|
-
|
|
|
- criterions = [SysUserPo.del_flag=="0"]
|
|
|
+
|
|
|
+ criterions = [SysUserPo.del_flag == "0"]
|
|
|
if user.user_id is not None and user.user_id != 0:
|
|
|
- criterions.append(SysUserPo.user_id==user.user_id)
|
|
|
+ criterions.append(SysUserPo.user_id == user.user_id)
|
|
|
if user.user_name is not None and user.user_name != '':
|
|
|
criterions.append(SysUserPo.user_name.like(f"%{user.user_name}%"))
|
|
|
if user.status is not None and user.status != 0:
|
|
|
- criterions.append(SysUserPo.status==user.status)
|
|
|
+ criterions.append(SysUserPo.status == user.status)
|
|
|
if user.phonenumber is not None and user.phonenumber != '':
|
|
|
criterions.append(SysUserPo.phonenumber.like(f"%{user.phonenumber}%"))
|
|
|
if user.dept_id is not None and user.dept_id != 0:
|
|
|
subquery = select(SysUserPo.dept_id).where(or_(
|
|
|
- SysUserPo.dept_id==user.dept_id,
|
|
|
+ SysUserPo.dept_id == user.dept_id,
|
|
|
func.find_in_set(user.dept_id, SysDeptPo.ancestors)
|
|
|
)).subquery()
|
|
|
criterions.append(SysUserPo.dept_id.in_(subquery))
|
|
|
if g.criterian_meta.extra:
|
|
|
- extra:ExtraModel = g.criterian_meta.extra
|
|
|
+ extra: ExtraModel = g.criterian_meta.extra
|
|
|
if extra.start_time and extra.end_time:
|
|
|
criterions.append(SysUserPo.create_time >= extra.start_time)
|
|
|
criterions.append(SysUserPo.create_time <= extra.end_time)
|
|
|
- if g.criterian_meta.scope:
|
|
|
+ # 检查是否需要应用数据范围过滤
|
|
|
+ # 只有当用户不是超级管理员时才应用数据范围过滤
|
|
|
+ login_user = SecurityUtil.get_login_user()
|
|
|
+ if g.criterian_meta.scope and (not login_user or not SecurityUtil.is_user_admin(login_user.user)):
|
|
|
criterions.append(g.criterian_meta.scope)
|
|
|
-
|
|
|
+
|
|
|
stmt = select(*user_columns, *dept_columns) \
|
|
|
- .join(SysDeptPo,SysUserPo.dept_id==SysDeptPo.dept_id) \
|
|
|
+ .join(SysDeptPo, SysUserPo.dept_id == SysDeptPo.dept_id) \
|
|
|
.where(*criterions)
|
|
|
+ print("Generated SQL:")
|
|
|
+ print(stmt.compile(db.session.bind, compile_kwargs={"literal_binds": True}))
|
|
|
+
|
|
|
if g.criterian_meta.page:
|
|
|
- g.criterian_meta.page.stmt = stmt
|
|
|
+ g.criterian_meta.page.stmt = stmt
|
|
|
|
|
|
rows = db.session.execute(stmt).all()
|
|
|
-
|
|
|
+
|
|
|
eos = list()
|
|
|
for row in rows:
|
|
|
- user = user_columns.cast(row,SysUser)
|
|
|
- user.dept = dept_columns.cast(row,SysDept)
|
|
|
+ user = user_columns.cast(row, SysUser)
|
|
|
+ user.dept = dept_columns.cast(row, SysDept)
|
|
|
eos.append(user)
|
|
|
return eos
|
|
|
|
|
|
@@ -94,25 +101,27 @@ class SysUserMapper:
|
|
|
List[SysUser]: 用户信息列表
|
|
|
"""
|
|
|
fields = {"user_id", "dept_id", "user_name", "nick_name", "email", \
|
|
|
- "phonenumber", "status", "create_time"}
|
|
|
+ "phonenumber", "status", "create_time"}
|
|
|
columns = ColumnEntityList(SysUserPo, fields, alia_prefix=False)
|
|
|
-
|
|
|
- criterions = [SysUserPo.del_flag=="0"]
|
|
|
+
|
|
|
+ criterions = [SysUserPo.del_flag == "0"]
|
|
|
if user.user_name:
|
|
|
criterions.append(SysUserPo.user_name.like(f"%{user.user_name}%"))
|
|
|
if user.phonenumber:
|
|
|
criterions.append(SysUserPo.phonenumber.like(f"%{user.phonenumber}%"))
|
|
|
- if "criterian_meta" in g and g.criterian_meta.scope:
|
|
|
+ # 检查是否需要应用数据范围过滤
|
|
|
+ login_user = SecurityUtil.get_login_user()
|
|
|
+ if "criterian_meta" in g and g.criterian_meta.scope and (not login_user or not SecurityUtil.is_user_admin(login_user.user)):
|
|
|
criterions.append(g.criterian_meta.scope)
|
|
|
-
|
|
|
+
|
|
|
stmt = select(*columns).distinct() \
|
|
|
- .join(SysDeptPo, SysUserPo.dept_id==SysDeptPo.dept_id) \
|
|
|
- .join(SysUserRolePo, SysUserPo.user_id==SysUserRolePo.user_id) \
|
|
|
- .join(SysRolePo, SysUserRolePo.role_id==SysRolePo.role_id) \
|
|
|
+ .join(SysDeptPo, SysUserPo.dept_id == SysDeptPo.dept_id) \
|
|
|
+ .join(SysUserRolePo, SysUserPo.user_id == SysUserRolePo.user_id) \
|
|
|
+ .join(SysRolePo, SysUserRolePo.role_id == SysRolePo.role_id) \
|
|
|
.where(*criterions)
|
|
|
rows = db.session.execute(stmt).all()
|
|
|
-
|
|
|
- return [columns.cast(row,SysUser) for row in rows]
|
|
|
+
|
|
|
+ return [columns.cast(row, SysUser) for row in rows]
|
|
|
|
|
|
@classmethod
|
|
|
def select_unallocated_list(cls, user: SysUser) -> List[SysUser]:
|
|
|
@@ -130,16 +139,16 @@ class SysUserMapper:
|
|
|
"phonenumber", "status", "create_time"
|
|
|
}
|
|
|
columns = ColumnEntityList(SysUserPo, fields, False)
|
|
|
-
|
|
|
- criterions = [SysUserPo.del_flag=="0"]
|
|
|
+
|
|
|
+ criterions = [SysUserPo.del_flag == "0"]
|
|
|
subquery = select(SysUserPo.user_id) \
|
|
|
.join(SysUserRolePo, and_(
|
|
|
- SysUserPo.user_id==SysUserRolePo.user_id,
|
|
|
- SysUserRolePo.role_id==user.role_id
|
|
|
- )) \
|
|
|
+ SysUserPo.user_id == SysUserRolePo.user_id,
|
|
|
+ SysUserRolePo.role_id == user.role_id
|
|
|
+ )) \
|
|
|
.subquery()
|
|
|
criterions.append(or_(
|
|
|
- SysRolePo.role_id!=user.role_id,
|
|
|
+ SysRolePo.role_id != user.role_id,
|
|
|
SysRolePo.role_id.is_(None)
|
|
|
))
|
|
|
criterions.append(SysUserPo.user_id.notin_(subquery))
|
|
|
@@ -147,17 +156,19 @@ class SysUserMapper:
|
|
|
criterions.append(SysUserPo.user_name.like(f"%{user.user_name}%"))
|
|
|
if user.phonenumber:
|
|
|
criterions.append(SysUserPo.phonenumber.like(f"%{user.phonenumber}%"))
|
|
|
- if "criterian_meta" in g and g.criterian_meta.scope:
|
|
|
+ # 检查是否需要应用数据范围过滤
|
|
|
+ login_user = SecurityUtil.get_login_user()
|
|
|
+ if "criterian_meta" in g and g.criterian_meta.scope and (not login_user or not SecurityUtil.is_user_admin(login_user.user)):
|
|
|
criterions.append(g.criterian_meta.scope)
|
|
|
-
|
|
|
+
|
|
|
stmt = select(*columns).distinct() \
|
|
|
- .join(SysDeptPo, SysUserPo.dept_id==SysDeptPo.dept_id) \
|
|
|
- .join(SysUserRolePo, SysUserPo.user_id==SysUserRolePo.user_id) \
|
|
|
- .join(SysRolePo, SysUserRolePo.role_id==SysRolePo.role_id) \
|
|
|
+ .join(SysDeptPo, SysUserPo.dept_id == SysDeptPo.dept_id) \
|
|
|
+ .join(SysUserRolePo, SysUserPo.user_id == SysUserRolePo.user_id) \
|
|
|
+ .join(SysRolePo, SysUserRolePo.role_id == SysRolePo.role_id) \
|
|
|
.where(*criterions)
|
|
|
rows = db.session.execute(stmt).all()
|
|
|
|
|
|
- return [columns.cast(row,SysUser) for row in rows]
|
|
|
+ return [columns.cast(row, SysUser) for row in rows]
|
|
|
|
|
|
@classmethod
|
|
|
def select_user_by_user_name(cls, user_name: str) -> Optional[SysUser]:
|
|
|
@@ -184,13 +195,13 @@ class SysUserMapper:
|
|
|
Optional[SysUser]: 用户信息
|
|
|
"""
|
|
|
return cls.select_user_by_unique_map("user_id", user_id)
|
|
|
-
|
|
|
+
|
|
|
@classmethod
|
|
|
def select_user_by_unique_map(
|
|
|
- cls,
|
|
|
- key: str,
|
|
|
- value: int|str
|
|
|
- ) -> Optional[SysUser]:
|
|
|
+ cls,
|
|
|
+ key: str,
|
|
|
+ value: int | str
|
|
|
+ ) -> Optional[SysUser]:
|
|
|
"""
|
|
|
通过含有唯一键的条件,查询用户
|
|
|
|
|
|
@@ -202,36 +213,36 @@ class SysUserMapper:
|
|
|
Optional[SysUser]: 用户信息
|
|
|
"""
|
|
|
dept_vo_fields = {
|
|
|
- "dept_id", "parent_id", "dept_name", "order_num", "leader",
|
|
|
+ "dept_id", "parent_id", "dept_name", "order_num", "leader",
|
|
|
"status"
|
|
|
}
|
|
|
role_vo_fields = {
|
|
|
- "role_id", "role_name", "role_key", "role_sort", "data_scope",
|
|
|
+ "role_id", "role_name", "role_key", "role_sort", "data_scope",
|
|
|
"status"
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
user_columns = ColumnEntityList(SysUserPo, cls.default_fields)
|
|
|
dept_columns = ColumnEntityList(SysDeptPo, dept_vo_fields)
|
|
|
role_columns = ColumnEntityList(SysRolePo, role_vo_fields)
|
|
|
-
|
|
|
+
|
|
|
column = getattr(SysUserPo, key)
|
|
|
- stmt = select(*user_columns,*dept_columns,*role_columns).distinct() \
|
|
|
- .join(SysDeptPo, SysUserPo.dept_id==SysDeptPo.dept_id) \
|
|
|
- .join(SysUserRolePo, SysUserPo.user_id==SysUserRolePo.user_id) \
|
|
|
- .join(SysRolePo, SysUserRolePo.role_id==SysRolePo.role_id) \
|
|
|
- .where(column==value)
|
|
|
+ stmt = select(*user_columns, *dept_columns, *role_columns).distinct() \
|
|
|
+ .join(SysDeptPo, SysUserPo.dept_id == SysDeptPo.dept_id) \
|
|
|
+ .join(SysUserRolePo, SysUserPo.user_id == SysUserRolePo.user_id) \
|
|
|
+ .join(SysRolePo, SysUserRolePo.role_id == SysRolePo.role_id) \
|
|
|
+ .where(column == value)
|
|
|
rows = db.session.execute(stmt).all()
|
|
|
-
|
|
|
+
|
|
|
eo_tmp = {}
|
|
|
for row in rows:
|
|
|
if key in eo_tmp:
|
|
|
user = eo_tmp[key]
|
|
|
else:
|
|
|
- user = user_columns.cast(row,SysUser)
|
|
|
- user.dept = dept_columns.cast(row,SysDept)
|
|
|
+ user = user_columns.cast(row, SysUser)
|
|
|
+ user.dept = dept_columns.cast(row, SysDept)
|
|
|
eo_tmp[key] = user
|
|
|
- user.roles.append(role_columns.cast(row,SysRole))
|
|
|
-
|
|
|
+ user.roles.append(role_columns.cast(row, SysRole))
|
|
|
+
|
|
|
return eo_tmp[key] if rows else None
|
|
|
|
|
|
@classmethod
|
|
|
@@ -273,14 +284,14 @@ class SysUserMapper:
|
|
|
"""
|
|
|
fields = {
|
|
|
"dept_id", "user_name", "nick_name", "email", "avatar", "login_ip",
|
|
|
- "phonenumber", "sex", "password", "login_date", "status", "update_by",
|
|
|
+ "phonenumber", "sex", "password", "login_date", "status", "update_by",
|
|
|
"remark"
|
|
|
}
|
|
|
data = user.model_dump(
|
|
|
- include=fields,exclude_unset=True,exclude_none=True
|
|
|
+ include=fields, exclude_unset=True, exclude_none=True
|
|
|
)
|
|
|
stmt = update(SysUserPo) \
|
|
|
- .where(SysUserPo.user_id==user.user_id) \
|
|
|
+ .where(SysUserPo.user_id == user.user_id) \
|
|
|
.values(data)
|
|
|
return db.session.execute(stmt).rowcount
|
|
|
|
|
|
@@ -298,10 +309,10 @@ class SysUserMapper:
|
|
|
int: 修改数量
|
|
|
"""
|
|
|
stmt = update(SysUserPo) \
|
|
|
- .where(SysUserPo.user_name==user_name) \
|
|
|
+ .where(SysUserPo.user_name == user_name) \
|
|
|
.values(**{'avatar': avatar})
|
|
|
return db.session.execute(stmt).rowcount
|
|
|
-
|
|
|
+
|
|
|
@classmethod
|
|
|
@Transactional(db.session)
|
|
|
def reset_user_pwd(cls, user_name: str, password: str) -> int:
|
|
|
@@ -316,7 +327,7 @@ class SysUserMapper:
|
|
|
int: 修改数量
|
|
|
"""
|
|
|
stmt = update(SysUserPo) \
|
|
|
- .where(SysUserPo.user_name==user_name) \
|
|
|
+ .where(SysUserPo.user_name == user_name) \
|
|
|
.values(password=password)
|
|
|
return db.session.execute(stmt).rowcount
|
|
|
|
|
|
@@ -332,11 +343,11 @@ class SysUserMapper:
|
|
|
Returns:
|
|
|
int: 删除数量
|
|
|
"""
|
|
|
- stmt = update(SysUserPo).where(SysUserPo.user_id==user_id) \
|
|
|
+ stmt = update(SysUserPo).where(SysUserPo.user_id == user_id) \
|
|
|
.values(del_flag="2")
|
|
|
num = db.session.execute(stmt).rowcount
|
|
|
return num
|
|
|
-
|
|
|
+
|
|
|
@classmethod
|
|
|
@Transactional(db.session)
|
|
|
def delete_user_by_ids(cls, user_ids: List[int]) -> int:
|
|
|
@@ -366,7 +377,7 @@ class SysUserMapper:
|
|
|
int: 0-唯一,大于0-已存在
|
|
|
"""
|
|
|
stmt = select(func.count()).select_from(SysUserPo) \
|
|
|
- .where(SysUserPo.user_name==user_name)
|
|
|
+ .where(SysUserPo.user_name == user_name)
|
|
|
return db.session.execute(stmt).scalar() or 0
|
|
|
|
|
|
@classmethod
|
|
|
@@ -380,15 +391,15 @@ class SysUserMapper:
|
|
|
Returns:
|
|
|
Optional[SysUser]: 用户信息
|
|
|
"""
|
|
|
- fields = {"user_id","phonenumber"}
|
|
|
+ fields = {"user_id", "phonenumber"}
|
|
|
columns = ColumnEntityList(
|
|
|
SysUserPo, fields, alia_prefix=False
|
|
|
- )
|
|
|
-
|
|
|
+ )
|
|
|
+
|
|
|
stmt = select(*columns) \
|
|
|
- .where(SysUserPo.phonenumber==phone_number)
|
|
|
+ .where(SysUserPo.phonenumber == phone_number)
|
|
|
row = db.session.execute(stmt).one_or_none()
|
|
|
- return columns.cast(row,SysUser) if row else None
|
|
|
+ return columns.cast(row, SysUser) if row else None
|
|
|
|
|
|
@classmethod
|
|
|
def check_email_unique(cls, email: str) -> Optional[SysUser]:
|
|
|
@@ -401,11 +412,11 @@ class SysUserMapper:
|
|
|
Returns:
|
|
|
Optional[SysUser]: 用户信息
|
|
|
"""
|
|
|
- fields = {"user_id","email"}
|
|
|
+ fields = {"user_id", "email"}
|
|
|
columns = ColumnEntityList(
|
|
|
SysUserPo, fields, alia_prefix=False
|
|
|
- )
|
|
|
-
|
|
|
- stmt = select(*columns).where(SysUserPo.email==email)
|
|
|
+ )
|
|
|
+
|
|
|
+ stmt = select(*columns).where(SysUserPo.email == email)
|
|
|
row = db.session.execute(stmt).one_or_none()
|
|
|
- return columns.cast(row,SysUser) if row else None
|
|
|
+ return columns.cast(row, SysUser) if row else None
|