406 lines
15 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# _*_ coding : UTF-8 _*_
# @Time : 2025/01/19 02:10
# @UpdateTime : 2025/01/19 02:10
# @Author : sonder
# @File : user.py
# @Software : PyCharm
# @Comment : 本程序
from datetime import datetime
from typing import Optional, List
from uuid import UUID
from pydantic import BaseModel, Field
from pydantic_validation_decorator import Xss, NotBlank, Size, Network
from schemas.common import BaseResponse, ListQueryResult
class UserBase(BaseModel):
"""
用户表基础模型。
"""
id: UUID = Field(..., description="主键")
del_flag: int = Field(default=1, description="删除标志 1存在 0删除")
create_by: str = Field(default="", description="创建者")
create_time: str = Field(..., description="创建时间")
update_by: str = Field(default="", description="更新者")
update_time: str = Field(..., description="更新时间")
username: str = Field(..., max_length=255, description="用户名")
password: str = Field(..., max_length=255, description="密码")
email: Optional[str] = Field(default=None, max_length=255, description="邮箱")
phone: Optional[str] = Field(default=None, max_length=30, description="手机号")
nickname: Optional[str] = Field(default=None, max_length=255, description="昵称")
avatar: Optional[str] = Field(default=None, max_length=255, description="头像")
gender: int = Field(default=0, description="性别1男0女")
status: int = Field(default=1, description="用户状态1启用0禁用")
department_id: Optional[str] = Field(default=None, max_length=36, description="所属部门")
@Xss(field_name='username', message='用户账号不能包含脚本字符')
@NotBlank(field_name='username', message='用户账号不能为空')
@Size(field_name='username', min_length=0, max_length=30, message='用户账号长度不能超过30个字符')
def get_user_name(self):
return self.user_name
@Xss(field_name='nickname', message='用户昵称不能包含脚本字符')
@Size(field_name='nickname', min_length=0, max_length=30, message='用户昵称长度不能超过30个字符')
def get_nick_name(self):
return self.nick_name
@Network(field_name='email', field_type='EmailStr', message='邮箱格式不正确')
@Size(field_name='email', min_length=0, max_length=50, message='邮箱长度不能超过50个字符')
def get_email(self):
return self.email
class Config:
json_schema_extra = {
"example": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"del_flag": 1,
"create_by": "admin",
"create_time": "2025-01-19 02:10:00",
"update_by": "admin",
"update_time": "2025-01-19 02:10:00",
"username": "admin",
"password": "admin",
"email": "admin@example.com",
"phone": "13800138000",
"nickname": "管理员",
"gender": 1,
"status": 1,
"department_id": "550e8400-e29b-41d4-a716-446655440000"
}
}
class UserInfo(BaseModel):
"""
用户表基础模型。
"""
id: str = Field(..., description="主键")
create_time: str = Field(..., description="创建时间") # 使用蛇形命名
update_time: str = Field(..., description="更新时间") # 使用蛇形命名
username: str = Field(..., max_length=255, description="用户名")
email: Optional[str] = Field(default=None, max_length=255, description="邮箱")
phone: Optional[str] = Field(default=None, max_length=30, description="手机号")
nickname: Optional[str] = Field(default=None, max_length=255, description="昵称")
avatar: Optional[str] = Field(default=None, max_length=255, description="头像")
gender: int = Field(default=0, description="性别1男0女")
status: int = Field(default=1, description="用户状态1启用0禁用")
department_id: Optional[str] = Field(default=None, max_length=36, description="所属部门")
class Config:
json_schema_extra = {
"example": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"create_time": "2025-01-19 02:10:00",
"update_time": "2025-01-19 02:10:00",
"username": "admin",
"email": "admin@example.com",
"phone": "13800138000",
"nickname": "管理员",
"gender": 1,
"status": 1,
"department_id": "550e8400-e29b-41d4-a716-446655440000"
}
}
class GetUserInfoResponse(BaseResponse):
"""
获取用户信息响应模型。
"""
data: UserInfo = Field(default=None, description="响应数据")
class AddUserParams(BaseModel):
"""
添加用户参数模型。
"""
username: str = Field(..., max_length=255, description="用户名")
password: str = Field(..., max_length=255, description="密码")
email: Optional[str] = Field(default=None, max_length=255, description="邮箱")
phone: Optional[str] = Field(default=None, max_length=30, description="手机号")
nickname: Optional[str] = Field(default=None, max_length=255, description="昵称")
avatar: Optional[str] = Field(default=None, max_length=255, description="头像")
gender: int = Field(default=0, description="性别1男0女")
status: int = Field(default=1, description="用户状态1启用0禁用")
department_id: Optional[str] = Field(default=None, max_length=36, description="所属部门")
@Xss(field_name='username', message='用户账号不能包含脚本字符')
@NotBlank(field_name='username', message='用户账号不能为空')
@Size(field_name='username', min_length=0, max_length=30, message='用户账号长度不能超过30个字符')
def get_user_name(self):
return self.user_name
@Xss(field_name='nickname', message='用户昵称不能包含脚本字符')
@Size(field_name='nickname', min_length=0, max_length=30, message='用户昵称长度不能超过30个字符')
def get_nick_name(self):
return self.nick_name
@Network(field_name='email', field_type='EmailStr', message='邮箱格式不正确')
@Size(field_name='email', min_length=0, max_length=50, message='邮箱长度不能超过50个字符')
def get_email(self):
return self.email
class Config:
json_schema_extra = {
"example": {
"username": "admin",
"password": "admin",
"email": "admin@example.com",
"phone": "13800138000",
"nickname": "管理员",
"gender": 1,
"status": 1,
"department_id": "550e8400-e29b-41d4-a716-446655440000"
}
}
class RegisterUserParams(AddUserParams):
"""
注册用户参数模型。
"""
code: str = Field(..., max_length=10, description="验证码")
class Config:
json_schema_extra = {
"example": {
"username": "admin",
"password": "admin",
"email": "admin@example.com",
"phone": "13800138000",
"nickname": "管理员",
"gender": 1,
"status": 1,
"department_id": "550e8400-e29b-41d4-a716-446655440000",
"code": "123456"
}
}
class UpdateUserParams(BaseModel):
"""
更新用户参数模型。
"""
username: str = Field(..., max_length=255, description="用户名")
email: Optional[str] = Field(default=None, max_length=255, description="邮箱")
phone: Optional[str] = Field(default=None, max_length=30, description="手机号")
nickname: Optional[str] = Field(default=None, max_length=255, description="昵称")
avatar: Optional[str] = Field(default=None, max_length=255, description="头像")
gender: int = Field(default=0, description="性别1男0女")
status: int = Field(default=1, description="用户状态1启用0禁用")
department_id: Optional[str] = Field(default=None, max_length=36, description="所属部门")
@Xss(field_name='username', message='用户账号不能包含脚本字符')
@NotBlank(field_name='username', message='用户账号不能为空')
@Size(field_name='username', min_length=0, max_length=30, message='用户账号长度不能超过30个字符')
def get_user_name(self):
return self.user_name
@Xss(field_name='nickname', message='用户昵称不能包含脚本字符')
@Size(field_name='nickname', min_length=0, max_length=30, message='用户昵称长度不能超过30个字符')
def get_nick_name(self):
return self.nick_name
@Network(field_name='email', field_type='EmailStr', message='邮箱格式不正确')
@Size(field_name='email', min_length=0, max_length=50, message='邮箱长度不能超过50个字符')
def get_email(self):
return self.email
class Config:
json_schema_extra = {
"example": {
"username": "admin",
"email": "admin@example.com",
"phone": "13800138000",
"nickname": "管理员",
"gender": 1,
"status": 1,
"department_id": "550e8400-e29b-41d4-a716-446655440000"
}
}
class GetUserListResult(ListQueryResult):
"""
获取用户列表结果模型。
"""
result: List[UserInfo] = Field(default=[], description="部门列表")
class GetUserListResponse(BaseResponse):
"""
获取用户列表响应模型。
"""
data: GetUserListResult = Field(default=None, description="响应数据")
class AddUserRoleParams(BaseModel):
"""
添加用户角色参数模型。
"""
user_id: str = Field(..., max_length=36, description="用户ID")
role_id: str = Field(default=[], max_length=36, description="角色ID")
class Config:
json_schema_extra = {
"example": {
"user_id": "550e8400-e29b-41d4-a716-446655440000",
"role_ids": "550e8400-e29b-41d4-a716-446655440000"
}
}
class UpdateUserRoleParams(BaseModel):
"""
更新用户角色参数模型。
"""
user_id: str = Field(..., max_length=36, description="用户ID")
role_ids: List[str] = Field(default=[], max_length=36, description="角色ID")
class Config:
json_schema_extra = {
"example": {
"user_id": "550e8400-e29b-41d4-a716-446655440000",
"role_ids": ["550e8400-e29b-41d4-a716-446655440000"]
}
}
class UserRoleInfo(BaseModel):
"""
用户角色信息模型。
"""
id: str = Field(..., max_length=36, description="主键ID")
user_id: str = Field(..., max_length=36, description="用户ID")
user_name: str = Field(..., max_length=100, description="用户账号")
role_name: str = Field(..., max_length=100, description="角色名称")
role_code: str = Field(..., max_length=100, description="角色编码")
role_id: str = Field(..., max_length=36, description="角色ID")
create_time: datetime = Field(..., description="创建时间")
update_time: datetime = Field(..., description="更新时间")
@Xss(field_name='user_name', message='用户账号不能包含脚本字符')
@NotBlank(field_name='user_name', message='用户账号不能为空')
@Size(field_name='user_name', min_length=0, max_length=30, message='用户账号长度不能超过30个字符')
def get_user_name(self):
return self.user_name
@Xss(field_name='role_name', message='角色名称不能包含脚本字符')
@NotBlank(field_name='role_name', message='角色名称不能为空')
@Size(field_name='role_name', min_length=0, max_length=30, message='角色名称长度不能超过30个字符')
def get_role_name(self):
return self.role_name
class Config:
json_schema_extra = {
"example": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"user_id": "550e8400-e29b-41d4-a716-446655440000",
"user_name": "zhangsan",
"role_name": "管理员",
"role_code": "admin",
"role_id": "550e8400-e29b-41d4-a716-446655440000",
"create_time": "2023-10-01T12:00:00",
"update_time": "2023-10-01T12:00:00"
}
}
class GetUserRoleInfoResponse(BaseResponse):
"""
获取用户角色信息响应模型。
"""
data: UserRoleInfo = Field(default=None, description="响应数据")
class GetUserRoleListResult(ListQueryResult):
"""
获取用户角色列表结果模型。
"""
result: List[UserRoleInfo] = Field(default=[], description="用户角色列表")
class GetUserRoleListResponse(BaseResponse):
"""
获取用户角色列表响应模型。
"""
data: GetUserRoleListResult = Field(default=None, description="响应数据")
class GetUserPermissionListResponse(BaseResponse):
"""
获取用户权限列表响应模型。
"""
data: List[str] = Field(default=[], description="响应数据")
class ResetPasswordParams(BaseModel):
"""
重置密码参数模型。
"""
password: str = Field(..., max_length=100, description="新密码")
class Config:
json_schema_extra = {
"example": {
"password": "123456"
}
}
class GetUserStatisticsResult(BaseModel):
"""
用户统计信息模型。
"""
today_count: int = Field(default=0, description="今日查询次数")
this_month_count: int = Field(default=0, description="本月查询次数")
last_month_count: int = Field(default=0, description="上月查询次数")
before_14day_count_success: List[dict] = Field(default=[], description="最近14天成功查询次数")
before_14day_count_fail: List[dict] = Field(default=[], description="最近14天失败查询次数")
class Config:
json_schema_extra = {
"example": {
"today_count": 0,
"this_month_count": 0,
"last_month_count": 0,
"before_14day_count_success": [
{
"date": "2023-10-01",
"count": 0
}
],
"before_14day_count_fail": [
{
"date": "2023-10-01",
"count": 0
}
]
}
}
class GetUserStatisticsResponse(BaseResponse):
"""
获取用户统计信息响应模型。
"""
data: GetUserStatisticsResult = Field(default=None, description="响应数据")
class UpdateBaseUserInfoParams(BaseModel):
"""修改基础信息参数"""
name: str
"""姓名"""
gender: int
"""性别"""
class Config:
json_schema_extra = {
"example": {
"name": "张三",
"gender": 1,
}
}