Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 
 

99 rindas
3.1 KiB

  1. import md5 from '~/utils/md5'
  2. export function useIdPhoto() {
  3. const tokenCookie = useCookie('token', { path: '/' })
  4. const macCookie = useCookie('mac', { maxAge: 365 * 24 * 3600, path: '/' })
  5. const openIdCookie = useCookie('open_id', { path: '/' })
  6. const sourceCookie = useCookie('source', { path: '/' })
  7. const tokenState = useState('auth_token', () => tokenCookie.value || '')
  8. const openIdState = useState('auth_open_id', () => openIdCookie.value || '')
  9. if (import.meta.client && !macCookie.value) {
  10. macCookie.value = createUuid()
  11. }
  12. function createUuid() {
  13. if (globalThis.crypto?.randomUUID) return globalThis.crypto.randomUUID()
  14. return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (char) => {
  15. const random = Math.floor(Math.random() * 16)
  16. const value = char === 'x' ? random : (random & 0x3) | 0x8
  17. return value.toString(16)
  18. })
  19. }
  20. function getNonce() {
  21. const timeStr = Date.now().toString()
  22. return {
  23. timeStr,
  24. nonce: md5(timeStr).substring(4, 14),
  25. }
  26. }
  27. async function create(file, settings) {
  28. if (!file) throw new Error('请选择一张照片')
  29. const token = tokenState.value || tokenCookie.value || ''
  30. const { timeStr, nonce } = getNonce()
  31. const formData = new FormData()
  32. // ThinkJS 2 会先读取公共参数,必须将普通字段放在文件字段之前。
  33. formData.append('token', token)
  34. formData.append('uid', openIdState.value || openIdCookie.value || '')
  35. formData.append('mac', macCookie.value || 'pc-id-photo')
  36. formData.append('base_timestamp', String(Math.floor(Date.now() / 1000)))
  37. formData.append('client', '1')
  38. formData.append('source', sourceCookie.value || '')
  39. formData.append('client_ios', '0')
  40. formData.append('version', '1.0.0')
  41. formData.append('version_code', '1')
  42. formData.append('request_id', settings.request_id || createUuid())
  43. formData.append('spec_key', settings.spec_key)
  44. formData.append('background', settings.background)
  45. formData.append('beauty', settings.beauty)
  46. formData.append('scale', String(settings.scale))
  47. formData.append('offset_x', String(settings.offset_x))
  48. formData.append('offset_y', String(settings.offset_y))
  49. formData.append('file', file)
  50. let result
  51. try {
  52. result = await $fetch('/api/idphoto/create', {
  53. method: 'POST',
  54. headers: {
  55. token,
  56. timestr: timeStr,
  57. nonce,
  58. },
  59. body: formData,
  60. })
  61. } catch (error) {
  62. const data = error?.data
  63. if (data && typeof data === 'object' && data.msg) {
  64. const normalized = new Error(data.msg)
  65. normalized.code = data.code || 1000
  66. normalized.data = data.data || {}
  67. throw normalized
  68. }
  69. throw error
  70. }
  71. if (result.code === 1009) {
  72. const { logout, showLogin } = useUser()
  73. logout()
  74. showLogin.value = true
  75. }
  76. if (result.code !== 0) {
  77. const error = new Error(result.msg || '证件照制作失败')
  78. error.code = result.code || 1000
  79. error.data = result.data || {}
  80. throw error
  81. }
  82. return result
  83. }
  84. return {
  85. create,
  86. createRequestId: createUuid,
  87. }
  88. }