feat: 初始化仓库

This commit is contained in:
2025-02-12 02:38:29 +08:00
commit 46e9e79670
67 changed files with 8960 additions and 0 deletions

7
schemas/__init__.py Normal file
View File

@@ -0,0 +1,7 @@
# _*_ coding : UTF-8 _*_
# @Time : 2025/01/18 02:43
# @UpdateTime : 2025/01/18 02:43
# @Author : sonder
# @File : __init__.py.py
# @Software : PyCharm
# @Comment : 本程序

57
schemas/cache.py Normal file
View File

@@ -0,0 +1,57 @@
# _*_ coding : UTF-8 _*_
# @Time : 2025/02/04 15:20
# @UpdateTime : 2025/02/04 15:20
# @Author : sonder
# @File : cache.py
# @Software : PyCharm
# @Comment : 本程序
from typing import Optional, Any, List
from pydantic import BaseModel, ConfigDict, Field
from pydantic.alias_generators import to_camel
from schemas.common import BaseResponse
class CacheMonitor(BaseModel):
"""
缓存监控信息
"""
model_config = ConfigDict(alias_generator=to_camel)
command_stats: Optional[List] = Field(default=[], description='命令统计')
db_size: Optional[int] = Field(default=None, description='Key数量')
info: Optional[dict] = Field(default={}, description='Redis信息')
class CacheInfo(BaseModel):
"""
缓存信息
"""
model_config = ConfigDict(alias_generator=to_camel)
cache_key: Optional[str] = Field(default=None, description='缓存键名')
cache_name: Optional[str] = Field(default=None, description='缓存名称')
cache_value: Optional[Any] = Field(default=None, description='缓存内容')
remark: Optional[str] = Field(default=None, description='备注')
class GetCacheMonitorResponse(BaseResponse):
"""
获取缓存监控信息响应
"""
data: CacheMonitor = Field(default={}, description="缓存监控信息查询结果")
class GetCacheInfoResponse(BaseResponse):
"""
获取缓存信息响应
"""
data: List[CacheInfo] = Field(default=[], description="缓存信息查询结果")
class GetCacheKeysListResponse(BaseResponse):
"""
获取缓存键名列表
"""
data: List[str] = Field(default=[], description="缓存键名列表")

48
schemas/common.py Normal file
View File

@@ -0,0 +1,48 @@
# _*_ coding : UTF-8 _*_
# @Time : 2025/01/19 01:44
# @UpdateTime : 2025/01/19 01:44
# @Author : sonder
# @File : common.py
# @Software : PyCharm
# @Comment : 本程序
from typing import List
from pydantic import BaseModel, Field
class BaseResponse(BaseModel):
"""
基础响应模型
"""
code: int = Field(default=200, description="响应码")
msg: str = Field(default="操作成功!", description="响应信息")
data: dict = Field(default=None, description="响应数据")
success: bool = Field(default=True, description="操作是否成功")
time: str = Field(default="", description="响应时间")
class ListQueryResult(BaseModel):
"""
列表查询结果
"""
result: List = Field(default=[], description="列表数据")
total: int = Field(default=0, description="总条数")
page: int = Field(default=1, description="当前页码")
class DeleteListParams(BaseModel):
"""
批量删除参数
"""
ids: List[str] = Field(default=[], description="删除ID列表")
class Config:
json_schema_extra = {
"example": {
"ids": [
"1",
"2",
"3"
]
}
}

178
schemas/department.py Normal file
View File

@@ -0,0 +1,178 @@
# _*_ coding : UTF-8 _*_
# @Time : 2025/01/19 02:19
# @UpdateTime : 2025/01/19 02:19
# @Author : sonder
# @File : department.py
# @Software : PyCharm
# @Comment : 本程序
from datetime import datetime
from typing import Optional, List
from pydantic import BaseModel, Field
from schemas.common import BaseResponse, ListQueryResult
class DepartmentInfo(BaseModel):
"""
部门表基础模型。
"""
id: str = Field(..., description="主键")
create_by: str = Field(default="", description="创建者")
create_time: Optional[datetime] = Field(default=None, description="创建时间")
update_by: str = Field(default="", description="更新者")
update_time: Optional[datetime] = Field(default=None, description="更新时间")
name: str = Field(..., max_length=100, description="部门名称")
parent_id: Optional[str] = Field(default=None, max_length=36, description="父部门ID")
sort: int = Field(default=0, description="排序权重0最高")
phone: Optional[str] = Field(default=None, max_length=30, description="部门电话")
principal: str = Field(..., max_length=64, description="部门负责人")
email: Optional[str] = Field(default=None, max_length=128, description="部门邮箱")
remark: Optional[str] = Field(default=None, max_length=255, description="备注信息")
status: Optional[int] = Field(default=None, description="状态")
class Config:
json_schema_extra = {
"example": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"create_by": "admin",
"create_time": "2023-10-01T12:00:00",
"update_by": "admin",
"update_time": "2023-10-01T12:00:00",
"name": "研发部",
"parent_id": "",
"sort": 0,
"phone": "1234567890",
"principal": "张三",
"email": "dev@example.com",
"remark": "研发部门",
"status": 1
}
}
class GetDepartmentInfoResponse(BaseResponse):
"""
获取部门信息响应模型。
"""
data: DepartmentInfo = Field(default=None, description="响应数据")
class AddDepartmentParams(BaseModel):
"""
添加部门参数模型。
"""
name: str = Field(..., max_length=100, description="部门名称")
parent_id: Optional[str] = Field(default=None, max_length=36, description="父部门ID")
sort: int = Field(default=0, description="排序权重0最高")
phone: Optional[str] = Field(default=None, max_length=30, description="部门电话")
principal: str = Field(..., max_length=64, description="部门负责人")
email: Optional[str] = Field(default=None, max_length=128, description="部门邮箱")
remark: Optional[str] = Field(default=None, max_length=255, description="备注信息")
status: Optional[int] = Field(default=None, description="状态")
class Config:
json_schema_extra = {
"example": {
"name": "研发部",
"parent_id": "",
"sort": 0,
"phone": "1234567890",
"principal": "张三",
"email": "dev@example.com",
"remark": "研发部门",
"status": 1
}
}
class DeleteDepartmentListParams(BaseModel):
"""
删除部门参数模型。
"""
ids: List[str] = Field(..., description="部门ID列表")
class GetDepartmentListResult(ListQueryResult):
"""
获取部门列表结果模型。
"""
result: List[DepartmentInfo] = Field(default=[], description="部门列表")
class GetDepartmentListResponse(BaseResponse):
"""
获取部门列表响应模型。
"""
data: GetDepartmentListResult = Field(default=None, description="响应数据")
class AddDepartmentRoleParams(BaseModel):
"""
添加部门角色参数模型。
"""
department_id: str = Field(..., max_length=36, description="部门ID")
role_id: str = Field(..., max_length=36, description="角色ID")
class Config:
json_schema_extra = {
"example": {
"department_id": "550e8400-e29b-41d4-a716-446655440000",
"role_id": "550e8400-e29b-41d4-a716-446655440000"
}
}
class DepartmentRoleInfo(BaseModel):
"""
部门角色信息模型。
"""
id: str = Field(..., max_length=36, description="主键ID")
department_id: str = Field(..., max_length=36, description="部门ID")
department_name: str = Field(..., max_length=100, description="部门名称")
department_phone: str = Field(..., max_length=30, description="部门电话")
department_principal: str = Field(..., max_length=64, description="部门负责人")
department_email: str = Field(..., max_length=128, 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="更新时间")
class Config:
json_schema_extra = {
"example": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"department_id": "550e8400-e29b-41d4-a716-446655440000",
"department_name": "研发部",
"department_phone": "1234567890",
"department_principal": "张三",
"department_email": "dev@example.com",
"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 GetDepartmentRoleInfoResponse(BaseResponse):
"""
获取部门角色信息响应模型。
"""
data: DepartmentRoleInfo = Field(default=None, description="响应数据")
class GetDepartmentRoleListResult(ListQueryResult):
"""
获取部门角色列表结果模型。
"""
result: List[DepartmentRoleInfo] = Field(default=[], description="部门角色列表")
class GetDepartmentRoleListResponse(BaseResponse):
"""
获取部门角色列表响应模型。
"""
data: GetDepartmentRoleListResult = Field(default=None, description="响应数据")

79
schemas/file.py Normal file
View File

@@ -0,0 +1,79 @@
# _*_ coding : UTF-8 _*_
# @Time : 2025/01/26 01:15
# @UpdateTime : 2025/01/26 01:15
# @Author : sonder
# @File : file.py
# @Software : PyCharm
# @Comment : 本程序
from typing import Optional, List
from pydantic import BaseModel, Field
from schemas.common import BaseResponse, ListQueryResult
class FileInfo(BaseModel):
"""
文件信息
"""
id: str = Field(..., title="文件id")
name: str = Field(..., title="文件名")
size: int = Field(..., title="文件大小")
file_type: str = Field(..., title="文件类型")
absolute_path: str = Field(..., title="绝对路径")
relative_path: str = Field(..., title="相对路径")
uploader_id: Optional[str] = Field(..., title="上传者ID")
uploader_username: Optional[str] = Field(..., title="上传者用户名")
uploader_nickname: Optional[str] = Field(..., title="上传者昵称")
uploader_department_id: Optional[str] = Field(..., title="上传者部门ID")
uploader_department_name: Optional[str] = Field(..., title="上传者部门名称")
update_time: str = Field(..., title="更新时间")
create_time: str = Field(..., title="创建时间")
class Config:
json_schema_extra = {
"example": {
"id": "1",
"name": "test.txt",
"size": 1024,
"file_type": "text/plain",
"absolute_path": "/home/test.txt",
"relative_path": "/test.txt",
"uploader_id": "1",
"uploader_username": "test",
"uploader_nickname": "test",
"uploader_department_id": "1",
"uploader_department_name": "test",
"update_time": "2025-01-26 01:15:00",
"create_time": "2025-01-26 01:15:00"
}
}
class UploadFileResponse(BaseResponse):
"""
上传文件响应模型
"""
data: FileInfo = Field(..., title="文件信息")
class GetFileInfoResponse(BaseResponse):
"""
获取文件响应模型
"""
data: FileInfo = Field(..., title="文件信息")
class GetFileListResult(ListQueryResult):
"""
获取文件列表结果模型
"""
result: List[FileInfo] = Field(..., title="文件列表")
class GetFileListResponse(BaseResponse):
"""
获取文件列表响应模型
"""
data: GetFileListResult = Field(..., title="文件列表结果")

121
schemas/i18n.py Normal file
View File

@@ -0,0 +1,121 @@
# _*_ coding : UTF-8 _*_
# @Time : 2025/02/04 15:55
# @UpdateTime : 2025/02/04 15:55
# @Author : sonder
# @File : i18n.py
# @Software : PyCharm
# @Comment : 本程序
from datetime import datetime
from typing import List, Optional
from pydantic import BaseModel, Field, ConfigDict
from pydantic.alias_generators import to_camel
from schemas.common import BaseResponse, ListQueryResult
class LocaleInfo(BaseModel):
"""
语言模型信息
"""
model_config = ConfigDict(alias_generator=to_camel)
id: str = Field(..., description="主键")
create_by: str = Field(default="", description="创建者")
create_time: Optional[datetime] = Field(default=None, description="创建时间")
update_by: str = Field(default="", description="更新者")
update_time: Optional[datetime] = Field(default=None, description="更新时间")
code: str = Field(default="", description="语言代码")
name: str = Field(default="", description="语言名称")
class AddLocaleParams(BaseModel):
"""
添加语言类型参数
"""
code: str = Field(default="", description="语言代码")
name: str = Field(default="", description="语言名称")
class GetLocaleInfoResponse(BaseResponse):
"""
获取语言模型信息响应
"""
data: LocaleInfo = Field(default=None, description="语言模型信息")
class GetLocaleInfoResult(ListQueryResult):
"""
获取语言模型信息结果
"""
result: List[LocaleInfo] = Field(default=[], description="语言模型信息")
class GetLocaleListResponse(BaseResponse):
"""
获取语言模型信息响应
"""
data: GetLocaleInfoResult = Field(default={}, description="语言模型信息")
class I18nInfo(BaseModel):
"""
国际化模型信息
"""
model_config = ConfigDict(alias_generator=to_camel)
id: str = Field(..., description="主键")
create_by: str = Field(default="", description="创建者")
create_time: Optional[datetime] = Field(default=None, description="创建时间")
update_by: str = Field(default="", description="更新者")
update_time: Optional[datetime] = Field(default=None, description="更新时间")
key: str = Field(default="", description="国际化key")
locale_code: str = Field(default="", description="语言代码")
locale_id: str = Field(default="", description="语言ID")
locale_name: str = Field(default="", description="语言名称")
translation: str = Field(default="", description="翻译内容")
class AddI18nParams(BaseModel):
"""
添加国际化参数
"""
key: str = Field(default="", description="国际化key")
locale_id: str = Field(default="", description="语言ID")
translation: str = Field(default="", description="翻译内容")
class GetI18nInfoResponse(BaseResponse):
"""
获取国际化模型信息响应
"""
data: I18nInfo = Field(default=None, description="国际化模型信息")
class GetI18nInfoResult(ListQueryResult):
"""
获取国际化模型信息结果
"""
result: List[I18nInfo] = Field(default=[], description="国际化模型信息")
class GetI18nListResponse(BaseResponse):
"""
获取国际化模型信息响应
"""
data: GetI18nInfoResult = Field(default=None, description="国际化模型信息")
class I18nList(BaseModel):
"""
国际化模型信息
"""
model_config = ConfigDict(alias_generator=to_camel)
locale: str = Field(default="", description="语言名称")
name: str = Field(default="", description="语言名称")
data: dict = Field(default={}, description="国际化模型信息")
class GetI18nInfoListResponse(BaseResponse):
"""
获取国际化模型信息响应
"""
data: I18nList = Field(default=None, description="国际化模型信息")

135
schemas/log.py Normal file
View File

@@ -0,0 +1,135 @@
# _*_ coding : UTF-8 _*_
# @Time : 2025/01/27 21:41
# @UpdateTime : 2025/01/27 21:41
# @Author : sonder
# @File : log.py
# @Software : PyCharm
# @Comment : 本程序
from pydantic import BaseModel, Field
from schemas.common import BaseResponse, ListQueryResult
class LoginLogInfo(BaseModel):
"""
登录日志信息
"""
id: str = Field(default="", description="登录日志ID")
user_id: str = Field(default="", description="用户ID")
username: str = Field(default="", description="用户名")
user_nickname: str = Field(default="", description="用户昵称")
department_id: str = Field(default="", description="部门ID")
department_name: str = Field(default="", description="部门名称")
login_ip: str = Field(default="", description="登录IP")
login_location: str = Field(default="", description="登录地点")
browser: str = Field(default="", description="登录浏览器")
os: str = Field(default="", description="登录操作系统")
status: int = Field(default="", description="登录状态")
login_time: str = Field(default="", description="登录时间")
session_id: str = Field(default="", description="会话ID")
online: bool = Field(default=False, description="是否在线")
create_time: str = Field(default="", description="创建时间")
update_time: str = Field(default="", description="更新时间")
class Config:
json_schema_extra = {
"example": {
"id": "1",
"user_id": "1",
"username": "admin",
"user_nickname": "管理员",
"department_id": "1",
"department_name": "超级管理员",
"login_ip": "127.0.0.1",
"login_location": "中国",
"browser": "Chrome",
"os": "Windows",
"status": 1,
"login_time": "2025-01-27 21:41:00",
"session_id": "1",
"online": True,
"create_time": "2025-01-27 21:41:00",
"update_time": "2025-01-27 21:41:00"
}
}
class LoginLogResult(ListQueryResult):
"""
登录日志查询结果
"""
result: list[LoginLogInfo] = Field(default=[], description="登录日志列表")
class GetLoginLogResponse(BaseResponse):
"""
获取登录日志响应
"""
data: LoginLogResult = Field(default=[], description="登录日志查询结果")
class OperationLogInfo(BaseModel):
"""
操作日志信息
"""
id: str = Field(default="", description="操作日志ID")
operation_name: str = Field(default="", description="操作名称")
operation_type: int = Field(default=1, description="操作类型")
request_path: str = Field(default="", description="请求路径")
request_method: str = Field(default="", description="请求方法")
request_params: str = Field(default="", description="请求参数")
request_result: str = Field(default="", description="请求结果")
host: str = Field(default="", description="请求主机")
location: str = Field(default="", description="请求地址")
browser: str = Field(default="", description="请求浏览器")
os: str = Field(default="", description="请求操作系统")
user_agent: str = Field(default="", description="请求头")
operator_id: str = Field(default="", description="操作人员ID")
operator_name: str = Field(default="", description="操作人员名称")
operator_nickname: str = Field(default="", description="操作人员昵称")
department_id: str = Field(default="", description="操作人员部门ID")
department_name: str = Field(default="", description="操作人员部门名称")
operation_time: str = Field(default="", description="操作时间")
cost_time: float = Field(default=0.0, description="操作耗时")
status: int = Field(default="", description="操作状态")
class Config:
json_schema_extra = {
"example": {
"id": "1",
"operation_name": "登录",
"operation_type": 1,
"request_path": "/login",
"request_method": "POST",
"request_params": "{\"username\": \"admin\", \"password\": \"123456\"}",
"request_result": "{\"code\": 200, \"data\": {\"token\":\"eyJ0eXAiOiJKV1Qi}",
"host": "127.0.0.1",
"location": "中国",
"browser": "Chrome",
"os": "Windows",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36",
"operator_id": "1",
"operator_name": "admin",
"operator_nickname": "管理员",
"department_id": "1",
"department_name": "超级管理员",
"operation_time": "2025-01-27 21:41:00",
"cost_time": 0.123,
"status": 1
}
}
class OperationLogResult(ListQueryResult):
"""
操作日志查询结果
"""
result: list[OperationLogInfo] = Field(default=[], description="操作日志列表")
class GetOperationLogResponse(BaseResponse):
"""
获取操作日志响应
"""
data: OperationLogResult = Field(default=[], description="操作日志查询结果")

185
schemas/login.py Normal file
View File

@@ -0,0 +1,185 @@
# _*_ coding : UTF-8 _*_
# @Time : 2025/01/19 01:35
# @UpdateTime : 2025/01/19 01:35
# @Author : sonder
# @File : login.py
# @Software : PyCharm
# @Comment : 本程序
from typing import Optional
from pydantic import BaseModel, Field
from pydantic_validation_decorator import Network, Size, NotBlank, Xss
from schemas.common import BaseResponse
class LoginParams(BaseModel):
"""
登录请求模型
"""
username: str = Field(default="", description="用户名")
password: str = Field(default="", description="密码")
loginDays: Optional[int] = Field(default=1, description="登录天数")
code: Optional[str] = Field(default="", description="验证码")
uuid: Optional[str] = Field(default="", description="验证码UUID")
class LoginResult(BaseModel):
"""
登录响应模型
"""
accessToken: str = Field(default="", description="访问令牌")
refreshToken: str = Field(default="", description="刷新令牌")
expiresTime: int = Field(default=0, description="令牌过期时间戳")
class LoginResponse(BaseResponse):
"""
登录响应模型
"""
data: LoginResult = Field(default=None, description="响应数据")
class UserInfo(BaseModel):
"""
用户信息模型
"""
id: str = Field(default="", description="用户ID")
username: str = Field(default="", description="用户名")
nickname: str = Field(default="", description="用户昵称")
avatar: str = Field(default="", description="用户头像")
gender: int = Field(default=0, description="用户性别")
email: str = Field(default="", description="用户邮箱")
phone: str = Field(default="", description="用户手机号")
status: int = Field(default=0, description="用户状态")
department_id: str = Field(default="", description="用户部门ID")
department_name: str = Field(default="", description="用户部门名称")
roles: list = Field(default=[], description="用户角色")
permissions: list = Field(default=[], description="用户权限")
create_time: str = Field(default="", description="创建时间")
update_time: str = Field(default="", 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": "1",
"username": "admin",
"nickname": "管理员",
"avatar": "https://www.example.com/avatar.jpg",
"gender": 1,
"email": "admin@example.com",
"phone": "1234567890",
"status": 1,
"department_id": "1",
"department_name": "技术部",
"roles": ["admin"],
"permissions": ["read", "write"],
"create_time": "2022-01-01 00:00:00",
"update_time": "2022-01-01 00:00:00"
}
}
class GetUserInfoResponse(BaseResponse):
"""
获取用户信息响应模型
"""
data: UserInfo = Field(default=None, description="响应数据")
class UpdateUserTokenResponse(BaseResponse):
"""
更新用户令牌响应模型
"""
data: LoginResult = Field(default=None, description="响应数据")
class GetCaptchaResult(BaseModel):
"""
获取验证码结果模型
"""
uuid: str = Field(default="", description="验证码UUID")
captcha: str = Field(default="", description="验证码图片")
class Config:
json_schema_extra = {
"example": {
"uuid": "1234567890",
"captcha": "base64编码的图片"
}
}
class GetEmailCodeParams(BaseModel):
"""
获取邮箱验证码请求模型
"""
username:str=Field(default="", description="用户名")
title: str = Field(default="注册", description="邮件类型")
mail: str = Field(default="", description="邮箱地址")
@Network(field_name='mail', field_type='EmailStr', message='邮箱格式不正确')
@Size(field_name='mail', min_length=0, max_length=50, message='邮箱长度不能超过50个字符')
def get_email(self):
return self.mail
class Config:
json_schema_extra = {
"example": {
"username": "admin",
"title": "注册",
"mail": "admin@example.com"
}
}
class ResetPasswordParams(BaseModel):
"""
重置密码请求模型
"""
username: str = Field(default="", description="用户名")
mail: str = Field(default="", description="邮箱地址")
code: str = Field(default="", description="验证码")
password: str = Field(default="", description="新密码")
@Network(field_name='mail', field_type='EmailStr', message='邮箱格式不正确')
@Size(field_name='mail', min_length=0, max_length=50, message='邮箱长度不能超过50个字符')
def get_email(self):
return self.mail
@Size(field_name='code', min_length=0, max_length=4, message='验证码长度不能超过4个字符')
def get_code(self):
return self.code
class Config:
json_schema_extra = {
"example": {
"username": "admin",
"mail": "admin@example.com",
"code": "1234",
"password": "123456"
}
}
class GetCaptchaResponse(BaseResponse):
"""
获取验证码响应模型
"""
data: GetCaptchaResult = Field(default=None, description="响应数据")

152
schemas/permission.py Normal file
View File

@@ -0,0 +1,152 @@
# _*_ coding : UTF-8 _*_
# @Time : 2025/01/20 20:32
# @UpdateTime : 2025/01/20 20:32
# @Author : sonder
# @File : permission.py
# @Software : PyCharm
# @Comment : 本程序
from datetime import datetime
from typing import Optional, List
from pydantic import BaseModel, Field
from schemas.common import BaseResponse, ListQueryResult
class PermissionInfo(BaseModel):
"""
权限表基础模型。
"""
id: str = Field(..., description="主键")
create_by: str = Field(default="", description="创建者")
create_time: Optional[datetime] = Field(default=None, description="创建时间")
update_by: str = Field(default="", description="更新者")
update_time: Optional[datetime] = Field(default=None, description="更新时间")
menu_type: int = Field(..., description="菜单类型0菜单、1iframe、2外链、3按钮")
parent_id: str = Field(default="", max_length=36, description="父权限ID")
title: str = Field(..., max_length=255, description="菜单名称")
name: Optional[str] = Field(default=None, max_length=255, description="路由名称")
path: Optional[str] = Field(default=None, max_length=255, description="路由路径")
component: Optional[str] = Field(default=None, max_length=255, description="组件路径")
rank: int = Field(default=1, description="菜单排序")
redirect: Optional[str] = Field(default=None, max_length=255, description="路由重定向")
icon: Optional[str] = Field(default=None, max_length=255, description="菜单图标")
extra_icon: Optional[str] = Field(default=None, max_length=255, description="右侧图标")
enter_transition: Optional[str] = Field(default=None, max_length=255, description="进场动画")
leave_transition: Optional[str] = Field(default=None, max_length=255, description="离场动画")
active_path: Optional[str] = Field(default=None, max_length=255, description="菜单激活路径")
auths: Optional[str] = Field(default=None, max_length=255, description="权限标识")
frame_src: Optional[str] = Field(default=None, max_length=255, description="iframe链接地址")
frame_loading: bool = Field(default=True, description="iframe加载动画")
keep_alive: bool = Field(default=False, description="缓存页面")
hidden_tag: bool = Field(default=False, description="隐藏标签页")
fixed_tag: bool = Field(default=False, description="固定标签页")
show_link: bool = Field(default=True, description="显示菜单")
show_parent: bool = Field(default=True, description="显示父级菜单")
class Config:
json_schema_extra = {
"example": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"create_by": "admin",
"create_time": "2023-10-01T12:00:00",
"update_by": "admin",
"update_time": "2023-10-01T12:00:00",
"menu_type": 0,
"parent_id": "",
"title": "首页",
"name": "home",
"path": "/home",
"component": "HomeView",
"rank": 1,
"redirect": None,
"icon": "home",
"extra_icon": None,
"enter_transition": None,
"leave_transition": None,
"active_path": None,
"auths": None,
"frame_src": None,
"frame_loading": True,
"keep_alive": False,
"hidden_tag": False,
"fixed_tag": False,
"show_link": True,
"show_parent": True
}
}
class GetPermissionInfoResponse(BaseResponse):
"""
获取权限信息响应模型。
"""
data: PermissionInfo = Field(default=None, description="响应数据")
class AddPermissionParams(BaseModel):
"""
添加权限参数模型。
"""
name: str = Field(..., max_length=255, description="路由名称")
path: str = Field(..., max_length=255, description="路由路径")
title: str = Field(..., max_length=255, description="菜单名称")
component: Optional[str] = Field(default=None, max_length=255, description="组件路径")
rank: int = Field(default=1, description="菜单排序")
redirect: Optional[str] = Field(default=None, max_length=255, description="路由重定向")
icon: Optional[str] = Field(default=None, max_length=255, description="菜单图标")
extra_icon: Optional[str] = Field(default=None, max_length=255, description="右侧图标")
enter_transition: Optional[str] = Field(default=None, max_length=255, description="进场动画")
leave_transition: Optional[str] = Field(default=None, max_length=255, description="离场动画")
active_path: Optional[str] = Field(default=None, max_length=255, description="菜单激活路径")
auths: Optional[str] = Field(default=None, max_length=255, description="权限标识")
frame_src: Optional[str] = Field(default=None, max_length=255, description="iframe链接地址")
frame_loading: bool = Field(default=True, description="iframe加载动画")
keep_alive: bool = Field(default=False, description="缓存页面")
hidden_tag: bool = Field(default=False, description="隐藏标签页")
fixed_tag: bool = Field(default=False, description="固定标签页")
show_link: bool = Field(default=True, description="显示菜单")
show_parent: bool = Field(default=True, description="显示父级菜单")
parent_id: str = Field(default="", max_length=36, description="父级菜单ID")
menu_type: int = Field(default=0, description="菜单类型")
class Config:
json_schema_extra = {
"example": {
"name": "home",
"path": "/home",
"title": "首页",
"component": "HomeView",
"rank": 1,
"redirect": None,
"icon": "home",
"extra_icon": None,
"enter_transition": None,
"leave_transition": None,
"active_path": None,
"auths": None,
"frame_src": None,
"frame_loading": True,
"keep_alive": False,
"hidden_tag": False,
"fixed_tag": False,
"show_link": True,
"show_parent": True,
"parent_id": "",
"menu_type": 0
}
}
class GetPermissionListResult(ListQueryResult):
"""
获取权限列表结果模型。
"""
result: List[PermissionInfo] = Field(default=[], description="权限列表")
class GetPermissionListResponse(BaseResponse):
"""
获取权限列表响应模型。
"""
data: GetPermissionListResult = Field(default=None, description="响应数据")

169
schemas/role.py Normal file
View File

@@ -0,0 +1,169 @@
# _*_ coding : UTF-8 _*_
# @Time : 2025/01/20 22:40
# @UpdateTime : 2025/01/20 22:40
# @Author : sonder
# @File : role.py
# @Software : PyCharm
# @Comment : 本程序
from datetime import datetime
from typing import Optional, List
from pydantic import BaseModel, Field
from schemas.common import BaseResponse, ListQueryResult
class RoleInfo(BaseModel):
"""
角色表基础模型。
"""
id: str = Field(..., description="主键")
create_by: str = Field(default="", description="创建者")
create_time: Optional[datetime] = Field(default=None, description="创建时间")
update_by: str = Field(default="", description="更新者")
update_time: Optional[datetime] = Field(default=None, description="更新时间")
name: str = Field(..., max_length=255, description="角色名称")
code: str = Field(..., max_length=255, description="角色编码")
status: int = Field(default=1, description="状态")
description: Optional[str] = Field(default=None, max_length=255, description="角色描述")
department_id: Optional[str] = Field(default=None, max_length=36, description="所属部门ID")
department_name: Optional[str] = Field(default=None, max_length=255, description="所属部门名称")
department_phone: Optional[str] = Field(default=None, max_length=255, description="所属部门电话")
department_principal: Optional[str] = Field(default=None, max_length=255, description="所属部门领导人")
department_email: Optional[str] = Field(default=None, max_length=255, description="所属部门邮件")
class Config:
json_schema_extra = {
"example": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"create_by": "admin",
"create_time": "2023-10-01T12:00:00",
"update_by": "admin",
"update_time": "2023-10-01T12:00:00",
"name": "管理员",
"code": "admin",
"status": 1,
"description": "系统管理员角色",
"department_id": "770e8400-e29b-41d4-a716-446655440000",
"department_name": "技术部",
"department_phone": "1234567890",
"department_principal": "张三",
"department_email": "zhangsan@example.com"
}
}
class GetRoleInfoResponse(BaseResponse):
"""
获取角色信息响应模型。
"""
data: RoleInfo = Field(default=None, description="角色信息")
class AddRoleParams(BaseModel):
"""
添加角色请求参数模型。
"""
name: str = Field(..., max_length=255, description="角色名称")
code: str = Field(..., max_length=255, description="角色编码")
description: Optional[str] = Field(default=None, max_length=255, description="角色描述")
department_id: Optional[str] = Field(default=None, max_length=36, description="所属部门ID")
status: Optional[int] = Field(default=1, description="状态")
class Config:
json_schema_extra = {
"example": {
"name": "管理员",
"code": "admin",
"description": "系统管理员角色",
"department_id": "770e8400-e29b-41d4-a716-446655440000",
"status": 1
}
}
class GetRoleListResult(ListQueryResult):
"""
获取角色列表结果模型。
"""
result: List[RoleInfo] = Field(default=None, description="角色列表")
class GetRoleListResponse(BaseResponse):
"""
获取角色列表响应模型。
"""
data: GetRoleListResult = Field(default=None, description="角色列表结果")
class AddRolePermissionParams(BaseModel):
"""
添加角色权限请求参数模型。
"""
permission_ids: List[str] = Field(..., description="权限ID列表")
class Config:
json_schema_extra = {
"example": {
"permission_ids": ["1", "2", "3"]
}
}
class RolePermissionInfo(BaseModel):
"""
角色权限信息模型。
"""
id: str = Field(..., description="主键")
create_by: str = Field(default="", description="创建者")
create_time: Optional[datetime] = Field(default=None, description="创建时间")
update_by: str = Field(default="", description="更新者")
update_time: Optional[datetime] = Field(default=None, description="更新时间")
role_id: str = Field(..., max_length=36, description="角色ID")
role_code: str = Field(..., max_length=255, description="角色编码")
role_name: str = Field(..., max_length=255, description="角色名称")
permission_id: str = Field(..., max_length=36, description="权限ID")
permission__parent_id: str = Field(default="", max_length=36, description="父级权限ID")
permission_name: str = Field(..., max_length=255, description="权限名称")
permission_code: str = Field(..., max_length=255, description="权限编码")
permission_type: str = Field(..., max_length=255, description="权限类型")
class Config:
json_schema_extra = {
"example": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"create_by": "admin",
"create_time": "2023-10-01T12:00:00",
"update_by": "admin",
"update_time": "2023-10-01T12:00:00",
"role_id": "550e8400-e29b-41d4-a716-446655440000",
"role_code": "admin",
"role_name": "管理员",
"permission_id": "550e8400-e29b-41d4-a716-446655440000",
"permission__parent_id": "550e8400-e29b-41d4-a716-446655440000",
"permission_name": "权限名称",
"permission_code": "admin",
"permission_type": "admin"
}
}
class GetRolePermissionInfoResponse(BaseResponse):
"""
获取角色权限信息响应模型。
"""
data: RolePermissionInfo = Field(default=None, description="角色权限信息")
class GetRolePermissionListResult(ListQueryResult):
"""
获取角色权限列表结果模型。
"""
result: List[RolePermissionInfo] = Field(default=None, description="角色权限列表")
class GetRolePermissionListResponse(BaseResponse):
"""
获取角色权限列表响应模型。
"""
data: GetRolePermissionListResult = Field(default=None, description="角色权限列表结果")

98
schemas/server.py Normal file
View File

@@ -0,0 +1,98 @@
# _*_ coding : UTF-8 _*_
# @Time : 2025/02/04 15:26
# @UpdateTime : 2025/02/04 15:26
# @Author : sonder
# @File : server.py
# @Software : PyCharm
# @Comment : 本程序
from typing import Optional, List
from pydantic import BaseModel, ConfigDict, Field
from pydantic.alias_generators import to_camel
from schemas.common import BaseResponse
class CpuInfo(BaseModel):
"""
CPU信息
"""
model_config = ConfigDict(alias_generator=to_camel)
cpu_num: Optional[int] = Field(default=None, description='核心数')
used: Optional[float] = Field(default=None, description='CPU用户使用率')
sys: Optional[float] = Field(default=None, description='CPU系统使用率')
free: Optional[float] = Field(default=None, description='CPU当前空闲率')
class MemoryInfo(BaseModel):
"""
内存信息
"""
model_config = ConfigDict(alias_generator=to_camel)
total: Optional[str] = Field(default=None, description='内存总量')
used: Optional[str] = Field(default=None, description='已用内存')
free: Optional[str] = Field(default=None, description='剩余内存')
usage: Optional[float] = Field(default=None, description='使用率')
class SystemInfo(BaseModel):
"""
系统信息
"""
model_config = ConfigDict(alias_generator=to_camel)
computer_ip: Optional[str] = Field(default=None, description='服务器IP')
computer_name: Optional[str] = Field(default=None, description='服务器名称')
os_arch: Optional[str] = Field(default=None, description='系统架构')
os_name: Optional[str] = Field(default=None, description='操作系统')
user_dir: Optional[str] = Field(default=None, description='项目路径')
class PythonInfo(MemoryInfo):
"""
Python信息
"""
model_config = ConfigDict(alias_generator=to_camel)
name: Optional[str] = Field(default=None, description='Python名称')
version: Optional[str] = Field(default=None, description='Python版本')
start_time: Optional[str] = Field(default=None, description='启动时间')
run_time: Optional[str] = Field(default=None, description='运行时长')
home: Optional[str] = Field(default=None, description='安装路径')
class SystemFiles(BaseModel):
"""
系统磁盘信息
"""
model_config = ConfigDict(alias_generator=to_camel)
dir_name: Optional[str] = Field(default=None, description='盘符路径')
sys_type_name: Optional[str] = Field(default=None, description='盘符类型')
type_name: Optional[str] = Field(default=None, description='文件类型')
total: Optional[str] = Field(default=None, description='总大小')
used: Optional[str] = Field(default=None, description='已经使用量')
free: Optional[str] = Field(default=None, description='剩余大小')
usage: Optional[str] = Field(default=None, description='资源的使用率')
class GetSystemInfoResult(BaseModel):
"""
获取系统信息结果
"""
model_config = ConfigDict(alias_generator=to_camel)
cpu: Optional[CpuInfo] = Field(description='CPU相关信息')
python: Optional[PythonInfo] = Field(description='Python相关信息')
memory: Optional[MemoryInfo] = Field(description='內存相关信息')
system: Optional[SystemInfo] = Field(description='服务器相关信息')
system_files: Optional[List[SystemFiles]] = Field(description='磁盘相关信息')
class GetServerInfoResponse(BaseResponse):
"""
获取服务器信息响应
"""
data: GetSystemInfoResult = Field(default={}, description="服务器信息查询结果")

350
schemas/user.py Normal file
View File

@@ -0,0 +1,350 @@
# _*_ 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"
}
}