constant.py 21 KB

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