realname-gateway.js 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import { get, post } from '@/core/http/http-client'
  2. import { fetchUploadConfig, uploadImageFile } from '@/features/dynamics/publish-gateway'
  3. import { parseRealnamePayload } from '@/features/mine-panel/realname-bridge'
  4. const ROUTE_CHECK = '/wanlshop/realname/checkIsReal'
  5. const ROUTE_ADD = '/wanlshop/realname/add'
  6. const ROUTE_DELETE = '/wanlshop/realname/del'
  7. const CN_IDCARD_18 =
  8. /^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$/
  9. function pickFields(source) {
  10. if (!source || typeof source !== 'object') {
  11. return {
  12. id: null,
  13. realname: '',
  14. idcard: '',
  15. idcard_front: '',
  16. idcard_back: ''
  17. }
  18. }
  19. return {
  20. id: source.id != null && source.id !== '' ? source.id : null,
  21. realname: source.realname || source.name || '',
  22. idcard: source.idcard || source.id_card || source.id_number || '',
  23. idcard_front: source.idcard_front || source.id_card_front || '',
  24. idcard_back: source.idcard_back || source.id_card_back || ''
  25. }
  26. }
  27. export function pickRealnameFieldsFromPayload(payload) {
  28. const { info } = parseRealnamePayload(payload)
  29. return pickFields(info || payload)
  30. }
  31. export function isValidIdDocumentNumber(raw) {
  32. const s = String(raw || '').trim()
  33. if (!s) return false
  34. if (CN_IDCARD_18.test(s)) return true
  35. if (s.length < 5 || s.length > 48) return false
  36. return /^[A-Za-z0-9\s.\/\-–—()()]+$/.test(s)
  37. }
  38. export function maskIdCard(id) {
  39. if (!id || typeof id !== 'string') return '-'
  40. const s = id.trim()
  41. if (!s) return '-'
  42. if (CN_IDCARD_18.test(s) && s.length >= 10) {
  43. return `${s.slice(0, 6)}********${s.slice(-4)}`
  44. }
  45. const n = s.length
  46. if (n <= 4) return '*'.repeat(n)
  47. if (n <= 8) return `${s.slice(0, 2)}**${s.slice(-2)}`
  48. return `${s.slice(0, 3)}****${s.slice(-3)}`
  49. }
  50. /** @returns {Promise<{ok:true,is_real:number,info:object|null}|{ok:false,reason:'network'|'api'}>} */
  51. export async function fetchRealnameStatus() {
  52. try {
  53. const { data } = await get(ROUTE_CHECK)
  54. const parsed = parseRealnamePayload(data)
  55. return { ok: true, is_real: parsed.is_real, info: parsed.info }
  56. } catch (err) {
  57. if (err && err.kind === 'NETWORK') {
  58. return { ok: false, reason: 'network' }
  59. }
  60. return { ok: false, reason: 'api' }
  61. }
  62. }
  63. export async function submitRealnameApplication(form) {
  64. const { data, msg } = await post(ROUTE_ADD, {
  65. realname: form.realname,
  66. idcard: form.idcard,
  67. idcard_front: form.idcard_front,
  68. idcard_back: form.idcard_back
  69. })
  70. return { data, msg }
  71. }
  72. export async function removeRealnameRecord(id) {
  73. const { data, msg } = await post(ROUTE_DELETE, { id })
  74. return { data, msg }
  75. }
  76. export async function uploadRealnameImage(filePath) {
  77. const config = await fetchUploadConfig()
  78. return uploadImageFile(filePath, config)
  79. }