merchant.schema.ts 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import { z } from '@hono/zod-openapi';
  2. export const MerchantSchema = z.object({
  3. id: z.number().int().positive().openapi({ description: '商户ID' }),
  4. name: z.string().min(1, '商户名称不能为空').max(255, '商户名称最多255个字符').nullable().openapi({
  5. description: '商户名称',
  6. example: '商户A'
  7. }),
  8. username: z.string().min(1, '用户名不能为空').max(20, '用户名最多20个字符').openapi({
  9. description: '用户名',
  10. example: 'merchant001'
  11. }),
  12. password: z.string().min(6, '密码至少6位').max(255, '密码最多255位').openapi({
  13. description: '密码',
  14. example: 'password123'
  15. }),
  16. phone: z.string().regex(/^1[3-9]\d{9}$/, '请输入正确的手机号').nullable().optional().openapi({
  17. description: '手机号码',
  18. example: '13800138000'
  19. }),
  20. realname: z.string().max(20, '姓名最多20个字符').nullable().optional().openapi({
  21. description: '姓名',
  22. example: '李四'
  23. }),
  24. loginNum: z.number().int().nonnegative('登录次数必须为非负数').default(0).openapi({
  25. description: '登录次数',
  26. example: 0
  27. }),
  28. loginTime: z.number().int().nonnegative('登录时间必须为非负数').default(0).openapi({
  29. description: '登录时间',
  30. example: 0
  31. }),
  32. loginIp: z.string().max(15, 'IP地址最多15个字符').nullable().optional().openapi({
  33. description: '登录IP',
  34. example: '192.168.1.1'
  35. }),
  36. lastLoginTime: z.number().int().nonnegative('上次登录时间必须为非负数').default(0).openapi({
  37. description: '上次登录时间',
  38. example: 0
  39. }),
  40. lastLoginIp: z.string().max(15, 'IP地址最多15个字符').nullable().optional().openapi({
  41. description: '上次登录IP',
  42. example: '192.168.1.1'
  43. }),
  44. state: z.number().int().min(1).max(2).default(2).openapi({
  45. description: '状态 1启用 2禁用',
  46. example: 1
  47. }),
  48. rsaPublicKey: z.string().max(2000, '公钥最多2000个字符').nullable().optional().openapi({
  49. description: '公钥',
  50. example: '-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...\n-----END PUBLIC KEY-----'
  51. }),
  52. aesKey: z.string().max(32, 'aes秘钥最多32个字符').nullable().optional().openapi({
  53. description: 'aes秘钥',
  54. example: 'a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6'
  55. }),
  56. createdAt: z.coerce.date().openapi({
  57. description: '创建时间',
  58. example: '2024-01-01T12:00:00Z'
  59. }),
  60. updatedAt: z.coerce.date().openapi({
  61. description: '更新时间',
  62. example: '2024-01-01T12:00:00Z'
  63. }),
  64. createdBy: z.number().int().positive().nullable().openapi({
  65. description: '创建用户ID',
  66. example: 1
  67. }),
  68. updatedBy: z.number().int().positive().nullable().openapi({
  69. description: '更新用户ID',
  70. example: 1
  71. })
  72. });
  73. export const CreateMerchantDto = z.object({
  74. name: z.string().min(1, '商户名称不能为空').max(255, '商户名称最多255个字符').nullable().optional().openapi({
  75. description: '商户名称',
  76. example: '商户A'
  77. }),
  78. username: z.string().min(1, '用户名不能为空').max(20, '用户名最多20个字符').openapi({
  79. description: '用户名',
  80. example: 'merchant001'
  81. }),
  82. password: z.string().min(6, '密码至少6位').max(255, '密码最多255位').openapi({
  83. description: '密码',
  84. example: 'password123'
  85. }),
  86. phone: z.string().regex(/^1[3-9]\d{9}$/, '请输入正确的手机号').nullable().optional().openapi({
  87. description: '手机号码',
  88. example: '13800138000'
  89. }),
  90. realname: z.string().max(20, '姓名最多20个字符').nullable().optional().openapi({
  91. description: '姓名',
  92. example: '李四'
  93. }),
  94. state: z.number().int().min(1).max(2).default(2).openapi({
  95. description: '状态 1启用 2禁用',
  96. example: 1
  97. }),
  98. rsaPublicKey: z.string().max(2000, '公钥最多2000个字符').nullable().optional().openapi({
  99. description: '公钥',
  100. example: '-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...\n-----END PUBLIC KEY-----'
  101. }),
  102. aesKey: z.string().max(32, 'aes秘钥最多32个字符').nullable().optional().openapi({
  103. description: 'aes秘钥',
  104. example: 'a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6'
  105. })
  106. });
  107. export const UpdateMerchantDto = z.object({
  108. name: z.string().min(1, '商户名称不能为空').max(255, '商户名称最多255个字符').nullable().optional().openapi({
  109. description: '商户名称',
  110. example: '商户A'
  111. }),
  112. username: z.string().min(1, '用户名不能为空').max(20, '用户名最多20个字符').optional().openapi({
  113. description: '用户名',
  114. example: 'merchant001'
  115. }),
  116. password: z.string().min(6, '密码至少6位').max(255, '密码最多255位').optional().openapi({
  117. description: '密码',
  118. example: 'password123'
  119. }),
  120. phone: z.string().regex(/^1[3-9]\d{9}$/, '请输入正确的手机号').nullable().optional().openapi({
  121. description: '手机号码',
  122. example: '13800138000'
  123. }),
  124. realname: z.string().max(20, '姓名最多20个字符').nullable().optional().openapi({
  125. description: '姓名',
  126. example: '李四'
  127. }),
  128. state: z.number().int().min(1).max(2).optional().openapi({
  129. description: '状态 1启用 2禁用',
  130. example: 1
  131. }),
  132. rsaPublicKey: z.string().max(2000, '公钥最多2000个字符').nullable().optional().openapi({
  133. description: '公钥',
  134. example: '-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...\n-----END PUBLIC KEY-----'
  135. }),
  136. aesKey: z.string().max(32, 'aes秘钥最多32个字符').nullable().optional().openapi({
  137. description: 'aes秘钥',
  138. example: 'a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6'
  139. })
  140. });