constant.py 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804
  1. from enum import Enum
  2. from typing import Protocol
  3. from app.config.setting import settings
  4. class RET(Enum):
  5. """
  6. 系统返回码枚举
  7. 0~200: 成功状态码
  8. 400~600: HTTP标准错误码
  9. 4000+: 自定义业务错误码
  10. """
  11. # 成功状态码
  12. OK = (0, "成功")
  13. SUCCESS = (200, "操作成功")
  14. CREATED = (201, "创建成功")
  15. ACCEPTED = (202, "请求已接受")
  16. NO_CONTENT = (204, "操作成功,无返回数据")
  17. # HTTP标准错误码
  18. ERROR = (1, "请求错误")
  19. BAD_REQUEST = (400, "参数错误")
  20. UNAUTHORIZED = (401, "未授权")
  21. FORBIDDEN = (403, "访问受限")
  22. NOT_FOUND = (404, "资源不存在")
  23. BAD_METHOD = (405, "不支持的请求方法")
  24. NOT_ACCEPTABLE = (406, "不接受的请求")
  25. CONFLICT = (409, "资源冲突")
  26. GONE = (410, "资源已删除")
  27. PRECONDITION_FAILED = (412, "前提条件失败")
  28. UNSUPPORTED_MEDIA_TYPE = (415, "不支持的媒体类型")
  29. UNPROCESSABLE_ENTITY = (422, "无法处理的实体")
  30. TOO_MANY_REQUESTS = (429, "请求过于频繁")
  31. # 服务器错误码
  32. INTERNAL_SERVER_ERROR = (500, "服务器内部错误")
  33. NOT_IMPLEMENTED = (501, "功能未实现")
  34. BAD_GATEWAY = (502, "网关错误")
  35. SERVICE_UNAVAILABLE = (503, "服务不可用")
  36. GATEWAY_TIMEOUT = (504, "网关超时")
  37. HTTP_VERSION_NOT_SUPPORTED = (505, "HTTP版本不支持")
  38. # 自定义业务错误码
  39. EXCEPTION = (-1, "系统异常")
  40. DATAEXIST = (4003, "数据已存在")
  41. DATAERR = (4004, "数据错误")
  42. PARAMERR = (4103, "参数错误")
  43. IOERR = (4302, "IO错误")
  44. SERVERERR = (4500, "服务错误")
  45. UNKOWNERR = (4501, "未知错误")
  46. TIMEOUT = (4502, "请求超时")
  47. RATE_LIMIT_EXCEEDED = (4503, "访问频率超限")
  48. # Token相关错误码
  49. INVALID_TOKEN = (4504, "无效令牌")
  50. EXPIRED_TOKEN = (4505, "令牌过期")
  51. # 认证授权错误码
  52. INVALID_CREDENTIALS = (4506, "无效凭证")
  53. INVALID_REQUEST = (4507, "无效请求")
  54. INVALID_FORMAT = (4508, "格式错误")
  55. INVALID_INPUT = (4509, "输入错误")
  56. INVALID_STATE = (4510, "状态错误")
  57. INVALID_OPERATION = (4511, "操作错误")
  58. INVALID_PERMISSION = (4512, "权限错误")
  59. INVALID_RESOURCE = (4513, "资源错误")
  60. INVALID_CONFIGURATION = (4514, "配置错误")
  61. # 会话安全错误码
  62. INVALID_SESSION = (4515, "会话错误")
  63. INVALID_LICENSE = (4516, "许可证错误")
  64. INVALID_CERTIFICATE = (4517, "证书错误")
  65. INVALID_SIGNATURE = (4518, "签名错误")
  66. INVALID_ENCRYPTION = (4519, "加密错误")
  67. INVALID_DECRYPTION = (4520, "解密错误")
  68. INVALID_COMPRESSION = (4521, "压缩错误")
  69. INVALID_DECOMPRESSION = (4522, "解压错误")
  70. # 权限相关错误码
  71. INVALID_AUTHENTICATION = (4523, "认证错误")
  72. INVALID_AUTHORIZATION = (4524, "授权错误")
  73. INVALID_ACCESS = (4525, "访问错误")
  74. INVALID_SECURITY = (4526, "安全错误")
  75. # 系统组件错误码
  76. INVALID_NETWORK = (4527, "网络错误")
  77. INVALID_DATABASE = (4528, "数据库错误")
  78. INVALID_CACHE = (4529, "缓存错误")
  79. INVALID_QUEUE = (4530, "队列错误")
  80. INVALID_LOCK = (4531, "锁错误")
  81. INVALID_TRANSACTION = (4532, "事务错误")
  82. INVALID_LOG = (4533, "日志错误")
  83. INVALID_MONITORING = (4534, "监控错误")
  84. INVALID_NOTIFICATION = (4535, "通知错误")
  85. # 任务调度错误码
  86. INVALID_SCHEDULING = (4536, "调度错误")
  87. INVALID_TASK = (4537, "任务错误")
  88. INVALID_JOB = (4538, "作业错误")
  89. INVALID_WORKFLOW = (4539, "工作流错误")
  90. # 开发相关错误码
  91. INVALID_SCRIPT = (4540, "脚本错误")
  92. INVALID_PLUGIN = (4541, "插件错误")
  93. INVALID_MODULE = (4542, "模块错误")
  94. INVALID_PACKAGE = (4543, "包错误")
  95. INVALID_CLASS = (4544, "类错误")
  96. INVALID_FUNCTION = (4545, "函数错误")
  97. INVALID_METHOD = (4546, "方法错误")
  98. INVALID_PROPERTY = (4547, "属性错误")
  99. INVALID_VARIABLE = (4548, "变量错误")
  100. INVALID_CONSTANT = (4549, "常量错误")
  101. INVALID_ENUM = (4550, "枚举错误")
  102. INVALID_INTERFACE = (4551, "接口错误")
  103. INVALID_PROTOCOL = (4552, "协议错误")
  104. # 服务相关错误码
  105. INVALID_SERVICE = (4553, "服务错误")
  106. INVALID_CLIENT = (4554, "客户端错误")
  107. INVALID_SERVER = (4555, "服务器错误")
  108. INVALID_SYSTEM = (4556, "系统错误")
  109. # 用户权限错误码
  110. INVALID_USER = (4557, "用户错误")
  111. INVALID_GROUP = (4558, "用户组错误")
  112. INVALID_ROLE = (4559, "角色错误")
  113. INVALID_PERMISSION_GROUP = (4560, "权限组错误")
  114. INVALID_PERMISSION_ROLE = (4561, "权限角色错误")
  115. INVALID_PERMISSION_USER = (4562, "权限用户错误")
  116. INVALID_PERMISSION_RESOURCE = (4563, "权限资源错误")
  117. INVALID_PERMISSION_ACTION = (4564, "权限操作错误")
  118. INVALID_PERMISSION_SCOPE = (4565, "权限范围错误")
  119. INVALID_PERMISSION_LEVEL = (4566, "权限级别错误")
  120. INVALID_PERMISSION_TYPE = (4567, "权限类型错误")
  121. INVALID_PERMISSION_STATUS = (4568, "权限状态错误")
  122. INVALID_PERMISSION_TIME = (4569, "权限时间错误")
  123. INVALID_PERMISSION_CONDITION = (4570, "权限条件错误")
  124. INVALID_PERMISSION_POLICY = (4571, "权限策略错误")
  125. INVALID_PERMISSION_RULE = (4572, "权限规则错误")
  126. INVALID_PERMISSION_EXCEPTION = (4573, "权限异常错误")
  127. INVALID_PERMISSION_VALIDATION = (4574, "权限验证错误")
  128. INVALID_PERMISSION_AUTHENTICATION = (4575, "权限认证错误")
  129. INVALID_PERMISSION_AUTHORIZATION = (4576, "权限授权错误")
  130. INVALID_PERMISSION_ACCESS = (4577, "权限访问错误")
  131. INVALID_PERMISSION_SECURITY = (4578, "权限安全错误")
  132. INVALID_PERMISSION_NETWORK = (4579, "权限网络错误")
  133. INVALID_PERMISSION_DATABASE = (4580, "权限数据库错误")
  134. INVALID_PERMISSION_CACHE = (4581, "权限缓存错误")
  135. INVALID_PERMISSION_QUEUE = (4582, "权限队列错误")
  136. INVALID_PERMISSION_LOCK = (4583, "权限锁错误")
  137. INVALID_PERMISSION_TRANSACTION = (4584, "权限事务错误")
  138. INVALID_PERMISSION_LOG = (4585, "权限日志错误")
  139. INVALID_PERMISSION_MONITORING = (4586, "权限监控错误")
  140. INVALID_PERMISSION_NOTIFICATION = (4587, "权限通知错误")
  141. INVALID_PERMISSION_SCHEDULING = (4588, "权限调度错误")
  142. INVALID_PERMISSION_TASK = (4589, "权限任务错误")
  143. INVALID_PERMISSION_JOB = (4590, "权限作业错误")
  144. INVALID_PERMISSION_WORKFLOW = (4591, "权限工作流错误")
  145. INVALID_PERMISSION_SCRIPT = (4592, "权限脚本错误")
  146. INVALID_PERMISSION_PLUGIN = (4593, "权限插件错误")
  147. INVALID_PERMISSION_MODULE = (4594, "权限模块错误")
  148. INVALID_PERMISSION_PACKAGE = (4595, "权限包错误")
  149. INVALID_PERMISSION_CLASS = (4596, "权限类错误")
  150. INVALID_PERMISSION_FUNCTION = (4597, "权限函数错误")
  151. INVALID_PERMISSION_METHOD = (4598, "权限方法错误")
  152. INVALID_PERMISSION_PROPERTY = (4599, "权限属性错误")
  153. INVALID_PERMISSION_VARIABLE = (4600, "权限变量错误")
  154. INVALID_PERMISSION_CONSTANT = (4601, "权限常量错误")
  155. INVALID_PERMISSION_ENUM = (4602, "权限枚举错误")
  156. INVALID_PERMISSION_INTERFACE = (4603, "权限接口错误")
  157. INVALID_PERMISSION_PROTOCOL = (4604, "权限协议错误")
  158. INVALID_PERMISSION_SERVICE = (4605, "权限服务错误")
  159. INVALID_PERMISSION_CLIENT = (4606, "权限客户端错误")
  160. INVALID_PERMISSION_SERVER = (4607, "权限服务器错误")
  161. INVALID_PERMISSION_SYSTEM = (4608, "权限系统错误")
  162. def __init__(self, code: int, msg: str) -> None:
  163. """
  164. 初始化返回码。
  165. 参数:
  166. - code (int): 错误码。
  167. - msg (str): 错误信息。
  168. 返回:
  169. - None
  170. """
  171. self._code = code
  172. self._msg = msg
  173. @property
  174. def code(self) -> int:
  175. """
  176. 获取错误码。
  177. 返回:
  178. - int: 错误码数值。
  179. """
  180. return self._code
  181. @property
  182. def msg(self) -> str:
  183. """
  184. 获取错误信息。
  185. 返回:
  186. - str: 错误信息文本。
  187. """
  188. return self._msg
  189. class CommonConstant:
  190. """
  191. 常用常量
  192. WWW: www主域名
  193. HTTP: http请求
  194. HTTPS: https请求
  195. LOOKUP_RMI: RMI远程方法调用
  196. LOOKUP_LDAP: LDAP远程方法调用
  197. LOOKUP_LDAPS: LDAPS远程方法调用
  198. YES: 是否为系统默认(是)
  199. NO: 是否为系统默认(否)
  200. DEPT_NORMAL: 部门正常状态
  201. DEPT_DISABLE: 部门停用状态
  202. UNIQUE: 校验是否唯一的返回标识(是)
  203. NOT_UNIQUE: 校验是否唯一的返回标识(否)
  204. """
  205. # 域名相关
  206. WWW = "www."
  207. HTTP = "http://"
  208. HTTPS = "https://"
  209. # 远程调用
  210. LOOKUP_RMI = "rmi:"
  211. LOOKUP_LDAP = "ldap:"
  212. LOOKUP_LDAPS = "ldaps:"
  213. # 系统标识
  214. YES = "Y"
  215. NO = "N"
  216. # 部门状态
  217. DEPT_NORMAL = "0" # 正常
  218. DEPT_DISABLE = "1" # 停用
  219. # 唯一性校验
  220. UNIQUE = True
  221. NOT_UNIQUE = False
  222. class JobConstant:
  223. """
  224. 定时任务常量
  225. JOB_ERROR_LIST: 定时任务禁止调用模块及违规字符串列表
  226. JOB_WHITE_LIST: 定时任务允许调用模块列表
  227. """
  228. JOB_ERROR_LIST = [
  229. "app",
  230. "config",
  231. "exceptions",
  232. "import ",
  233. "middlewares",
  234. "module_admin",
  235. "open(",
  236. "os.",
  237. "server",
  238. "sub_applications",
  239. "subprocess.",
  240. "sys.",
  241. "utils",
  242. "while ",
  243. "__import__",
  244. """,
  245. """,
  246. ",",
  247. "?",
  248. ":",
  249. ";",
  250. "/",
  251. "|",
  252. "+",
  253. "-",
  254. "=",
  255. "~",
  256. "!",
  257. "#",
  258. "$",
  259. "%",
  260. "^",
  261. "&",
  262. "*",
  263. "<",
  264. ">",
  265. "(",
  266. ")",
  267. "[",
  268. "]",
  269. "{",
  270. "}",
  271. " ",
  272. ]
  273. JOB_WHITE_LIST = ["function_task"]
  274. class MenuConstant:
  275. """
  276. 菜单常量
  277. TYPE_DIR: 菜单类型(目录)
  278. TYPE_MENU: 菜单类型(菜单)
  279. TYPE_BUTTON: 菜单类型(按钮)
  280. YES_FRAME: 是否菜单外链(是)
  281. NO_FRAME: 是否菜单外链(否)
  282. LAYOUT: Layout组件标识
  283. PARENT_VIEW: ParentView组件标识
  284. INNER_LINK: InnerLink组件标识
  285. """
  286. TYPE_DIR = "M"
  287. TYPE_MENU = "C"
  288. TYPE_BUTTON = "F"
  289. YES_FRAME = 0
  290. NO_FRAME = 1
  291. LAYOUT = "Layout"
  292. PARENT_VIEW = "ParentView"
  293. INNER_LINK = "InnerLink"
  294. class GenConstant:
  295. """
  296. 代码生成常量
  297. COLUMNTYPE_STR: 数据库字符串类型
  298. COLUMNTYPE_TEXT: 数据库文本类型
  299. COLUMNTYPE_TIME: 数据库时间类型
  300. COLUMNTYPE_GEOMETRY: 数据库字空间类型
  301. COLUMNTYPE_NUMBER: 数据库数字类型
  302. COLUMNNAME_NOT_EDIT: 页面不需要编辑字段
  303. COLUMNNAME_NOT_LIST: 页面不需要显示的列表字段
  304. COLUMNNAME_NOT_QUERY: 页面不需要查询字段
  305. BASE_ENTITY: Entity基类字段
  306. TREE_ENTITY: Tree基类字段
  307. HTML_INPUT: 文本框
  308. HTML_TEXTAREA: 文本域
  309. HTML_SELECT: 下拉框
  310. HTML_RADIO: 单选框
  311. HTML_CHECKBOX: 复选框
  312. HTML_DATETIME: 日期控件
  313. HTML_IMAGE_UPLOAD: 图片上传控件
  314. HTML_FILE_UPLOAD: 文件上传控件
  315. HTML_EDITOR: 富文本控件
  316. TYPE_DECIMAL: 高精度计算类型
  317. TYPE_DATE: 时间类型
  318. QUERY_LIKE: 模糊查询
  319. QUERY_EQ: 相等查询
  320. REQUIRE: 需要
  321. DB_TO_SQLALCHEMY_TYPE_MAPPING: 数据库类型与sqlalchemy类型映射
  322. DB_TO_PYTHON_TYPE_MAPPING: 数据库类型与python类型映射
  323. """
  324. # 数据库字符串类型
  325. COLUMNTYPE_STR = (
  326. ["character varying", "varchar", "character", "char"]
  327. if settings.DATABASE_TYPE == "postgres"
  328. else ["char", "varchar", "nvarchar", "varchar2"]
  329. )
  330. # 数据库文本类型
  331. COLUMNTYPE_TEXT = (
  332. ["text", "citext"]
  333. if settings.DATABASE_TYPE == "postgres"
  334. else ["tinytext", "text", "mediumtext", "longtext"]
  335. )
  336. # 数据库时间类型
  337. COLUMNTYPE_TIME = (
  338. [
  339. "date",
  340. "time",
  341. "time with time zone",
  342. "time without time zone",
  343. "timestamp",
  344. "timestamp with time zone",
  345. "timestamp without time zone",
  346. "interval",
  347. ]
  348. if settings.DATABASE_TYPE == "postgres"
  349. else ["datetime", "time", "date", "timestamp"]
  350. )
  351. # 数据库字空间类型
  352. COLUMNTYPE_GEOMETRY = (
  353. ["point", "line", "lseg", "box", "path", "polygon", "circle"]
  354. if settings.DATABASE_TYPE == "postgres"
  355. else [
  356. "geometry",
  357. "point",
  358. "linestring",
  359. "polygon",
  360. "multipoint",
  361. "multilinestring",
  362. "multipolygon",
  363. "geometrycollection",
  364. ]
  365. )
  366. # 数据库数字类型
  367. COLUMNTYPE_NUMBER = [
  368. "tinyint",
  369. "smallint",
  370. "mediumint",
  371. "int",
  372. "number",
  373. "integer",
  374. "bit",
  375. "bigint",
  376. "float",
  377. "double",
  378. "decimal",
  379. "boolean",
  380. "bool",
  381. ]
  382. # 页面不需要显示的添加字段
  383. COLUMNNAME_NOT_ADD_SHOW = ["created_time", "updated_time"]
  384. # 页面不需要显示的编辑字段
  385. COLUMNNAME_NOT_EDIT_SHOW = ["uuid"]
  386. # 页面不需要编辑字段
  387. COLUMNNAME_NOT_EDIT = ["id", "uuid", "created_time", "updated_time"]
  388. # 页面不需要显示的列表字段
  389. COLUMNNAME_NOT_LIST = ["id", "uuid"]
  390. # 页面不需要查询字段
  391. COLUMNNAME_NOT_QUERY = ["id", "uuid", "description"]
  392. # Crud基类字段
  393. CRUD_COLUMN_NOT_EDIT = [
  394. "create_by",
  395. "description",
  396. "created_time",
  397. "updated_time",
  398. ]
  399. # 实体基类字段
  400. BASE_ENTITY = [
  401. "id",
  402. "uuid",
  403. "status",
  404. "description",
  405. "created_time",
  406. "updated_time",
  407. "created_id",
  408. "updated_id",
  409. ]
  410. # Tree基类字段
  411. TREE_ENTITY = [
  412. "parent_name",
  413. "parent_id",
  414. "order",
  415. "ancestors",
  416. "children",
  417. ]
  418. # 文本框
  419. HTML_INPUT = "input"
  420. # 文本域
  421. HTML_TEXTAREA = "textarea"
  422. # 下拉框
  423. HTML_SELECT = "select"
  424. # 单选框
  425. HTML_RADIO = "radio"
  426. # 复选框
  427. HTML_CHECKBOX = "checkbox"
  428. # 日期控件
  429. HTML_DATETIME = "datetime"
  430. # 图片上传控件
  431. HTML_IMAGE_UPLOAD = "imageUpload"
  432. # 文件上传控件
  433. HTML_FILE_UPLOAD = "fileUpload"
  434. # 富文本控件
  435. HTML_EDITOR = "editor"
  436. # 高精度计算类型
  437. TYPE_DECIMAL = "Decimal"
  438. # 时间类型
  439. TYPE_DATE = ["date", "time", "datetime"]
  440. # 模糊查询
  441. QUERY_LIKE = "LIKE"
  442. # 相等查询
  443. QUERY_EQ = "EQ"
  444. # 需要
  445. REQUIRE = True
  446. # 数据库类型与sqlalchemy类型映射
  447. DB_TO_SQLALCHEMY = (
  448. {
  449. "boolean": "Boolean",
  450. "smallint": "SmallInteger",
  451. "integer": "Integer",
  452. "int4": "Integer",
  453. "bigint": "BigInteger",
  454. "real": "Float",
  455. "double precision": "Float",
  456. "numeric": "Numeric",
  457. "decimal": "Numeric",
  458. "character varying": "String",
  459. "varchar": "String",
  460. "character": "String",
  461. "text": "Text",
  462. "bytea": "LargeBinary",
  463. "date": "Date",
  464. "time": "Time",
  465. "time with time zone": "Time",
  466. "time without time zone": "Time",
  467. "timestamp": "DateTime",
  468. "timestamp with time zone": "DateTime",
  469. "timestamp without time zone": "DateTime",
  470. "interval": "Interval",
  471. "json": "JSON",
  472. "jsonb": "JSONB",
  473. "uuid": "Uuid",
  474. "inet": "INET",
  475. "cidr": "CIDR",
  476. "macaddr": "MACADDR",
  477. "point": "Geometry",
  478. "line": "Geometry",
  479. "lseg": "Geometry",
  480. "box": "Geometry",
  481. "path": "Geometry",
  482. "polygon": "Geometry",
  483. "circle": "Geometry",
  484. "bit": "Bit",
  485. "bit varying": "Bit",
  486. "tsvector": "TSVECTOR",
  487. "tsquery": "TSQUERY",
  488. "xml": "String",
  489. "array": "ARRAY",
  490. "composite": "JSON",
  491. "enum": "Enum",
  492. "range": "Range",
  493. "money": "Numeric",
  494. "pg_lsn": "BigInteger",
  495. "txid_snapshot": "String",
  496. "oid": "BigInteger",
  497. "regproc": "String",
  498. "regclass": "String",
  499. "regtype": "String",
  500. "regrole": "String",
  501. "regnamespace": "String",
  502. "int2vector": "ARRAY",
  503. "oidvector": "ARRAY",
  504. "pg_node_tree": "Text",
  505. }
  506. if settings.DATABASE_TYPE == "postgres"
  507. else {
  508. # 布尔语义仅 tinyint(1),其余 tinyint 在 get_sqlalchemy_type 中映射为 SmallInteger
  509. "TINYINT": "SmallInteger",
  510. # 数值类型
  511. "SMALLINT": "SmallInteger",
  512. "MEDIUMINT": "Integer",
  513. "INT": "Integer",
  514. "INTEGER": "Integer",
  515. "BIGINT": "BigInteger",
  516. "FLOAT": "Float",
  517. "DOUBLE": "Float",
  518. "DECIMAL": "DECIMAL",
  519. "BIT": "Integer",
  520. "NUMERIC": "Numeric",
  521. # 日期和时间类型
  522. "DATE": "Date",
  523. "TIME": "Time",
  524. "DATETIME": "DateTime",
  525. "TIMESTAMP": "TIMESTAMP",
  526. "YEAR": "Integer",
  527. # 字符串类型
  528. "CHAR": "CHAR",
  529. "VARCHAR": "String",
  530. "TINYTEXT": "Text",
  531. "TEXT": "Text",
  532. "MEDIUMTEXT": "Text",
  533. "LONGTEXT": "Text",
  534. "BINARY": "BINARY",
  535. "VARBINARY": "VARBINARY",
  536. "TINYBLOB": "LargeBinary",
  537. "BLOB": "LargeBinary",
  538. "MEDIUMBLOB": "LargeBinary",
  539. "LONGBLOB": "LargeBinary",
  540. # 枚举和集合类型
  541. "ENUM": "Enum",
  542. "SET": "String",
  543. # JSON 类型
  544. "JSON": "JSON",
  545. # 空间数据类型(需要扩展支持,如 GeoAlchemy2)
  546. "GEOMETRY": "Geometry", # 需要安装 geoalchemy2
  547. "POINT": "Geometry",
  548. "LINESTRING": "Geometry",
  549. "POLYGON": "Geometry",
  550. "MULTIPOINT": "Geometry",
  551. "MULTILINESTRING": "Geometry",
  552. "MULTIPOLYGON": "Geometry",
  553. "GEOMETRYCOLLECTION": "Geometry",
  554. # 其他类型
  555. "BOOL": "Boolean",
  556. "UUID": "String",
  557. }
  558. )
  559. # 数据库类型与python类型映射
  560. DB_TO_PYTHON = (
  561. {
  562. # MySQL 整数类型
  563. "tinyint": "int",
  564. "smallint": "int",
  565. "mediumint": "int",
  566. "int": "int",
  567. "integer": "int",
  568. "bigint": "int",
  569. # MySQL 浮点类型
  570. "float": "float",
  571. "double": "float",
  572. "decimal": "Decimal",
  573. "numeric": "Decimal",
  574. # MySQL 字符串类型
  575. "char": "str",
  576. "varchar": "str",
  577. "tinytext": "str",
  578. "text": "str",
  579. "mediumtext": "str",
  580. "longtext": "str",
  581. # MySQL 二进制类型
  582. "binary": "bytes",
  583. "varbinary": "bytes",
  584. "tinyblob": "bytes",
  585. "blob": "bytes",
  586. "mediumblob": "bytes",
  587. "longblob": "bytes",
  588. # MySQL 日期时间类型
  589. "date": "date",
  590. "time": "time",
  591. "datetime": "datetime",
  592. "timestamp": "datetime",
  593. "year": "int",
  594. # MySQL 其他类型
  595. "json": "dict",
  596. "enum": "str",
  597. "set": "str",
  598. "bit": "int",
  599. # MySQL 空间数据类型
  600. "geometry": "bytes",
  601. "linestring": "bytes",
  602. "multipoint": "bytes",
  603. "multilinestring": "bytes",
  604. "multipolygon": "bytes",
  605. "geometrycollection": "bytes",
  606. # PostgreSQL 整数类型
  607. "int2": "int",
  608. "int4": "int",
  609. "int8": "int",
  610. # PostgreSQL 浮点类型
  611. "real": "float",
  612. "double precision": "float",
  613. "float8": "float",
  614. # PostgreSQL 字符串类型
  615. "character": "str",
  616. "character varying": "str",
  617. "citext": "str",
  618. # PostgreSQL 二进制类型
  619. "bytea": "bytes",
  620. # PostgreSQL 日期时间类型
  621. "time with time zone": "time",
  622. "timetz": "time",
  623. "time without time zone": "time",
  624. "timestamptz": "datetime",
  625. "timestamp with time zone": "datetime",
  626. "timestamp without time zone": "datetime",
  627. "interval": "timedelta",
  628. # PostgreSQL 布尔类型
  629. "boolean": "bool",
  630. "bool": "bool",
  631. # PostgreSQL JSON类型
  632. "jsonb": "dict",
  633. # PostgreSQL 其他类型
  634. "uuid": "str",
  635. "inet": "str",
  636. "cidr": "str",
  637. "macaddr": "str",
  638. # PostgreSQL 几何类型(覆盖MySQL的映射)
  639. "point": "list",
  640. "line": "list",
  641. "lseg": "list",
  642. "box": "list",
  643. "path": "list",
  644. "polygon": "list",
  645. "circle": "list",
  646. # PostgreSQL 位类型
  647. "bit varying": "int",
  648. "varbit": "int",
  649. # PostgreSQL 文本搜索类型
  650. "tsvector": "str",
  651. "tsquery": "str",
  652. # PostgreSQL XML类型
  653. "xml": "str",
  654. # PostgreSQL 数组类型
  655. "array": "list",
  656. # PostgreSQL 范围类型
  657. "range": "list",
  658. "int4range": "list",
  659. "int8range": "list",
  660. "tsrange": "list",
  661. "tstzrange": "list",
  662. "daterange": "list",
  663. # PostgreSQL 货币类型
  664. "money": "Decimal",
  665. # PostgreSQL 对象标识符类型
  666. "oid": "int",
  667. "regproc": "str",
  668. "regclass": "str",
  669. "regtype": "str",
  670. "regrole": "str",
  671. "regnamespace": "str",
  672. # PostgreSQL 向量类型
  673. "int2vector": "list",
  674. "oidvector": "list",
  675. # PostgreSQL 其他内部类型
  676. "pg_lsn": "int",
  677. "txid_snapshot": "str",
  678. "pg_node_tree": "str",
  679. }
  680. )
  681. class TypedContextProtocol(Protocol):
  682. """
  683. 请求上下文中与日志/鉴权相关的结构化字段协议(供类型检查使用)。
  684. """
  685. perf_time: float
  686. ip: str
  687. country: str | None
  688. region: str | None
  689. city: str | None
  690. user_agent: str
  691. os: str | None
  692. browser: str | None
  693. device: str | None
  694. permission: str | None
  695. # API 日期 / 时间 / 日期时间统一展示(validator、jsonable_response_content、文档约定一致)
  696. DATE_DISPLAY_FMT = "%Y-%m-%d"
  697. TIME_DISPLAY_FMT = "%H:%M:%S"
  698. DATETIME_DISPLAY_FMT = "%Y-%m-%d %H:%M:%S"
  699. # if __name__ == "__main__":
  700. # print(RET.OK.msg) # 输出: 成功