index.vue 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. <template>
  2. <div v-if="status === 0 && info" class="p-account">
  3. <h3 class="ptc-title">Account Information</h3>
  4. <div class="ptc-wrapper">
  5. <div class="ptc-block">
  6. <div class="ptc-inner">
  7. <p class="ptc-label">QR code</p>
  8. <img class="qrcode" />
  9. </div>
  10. </div>
  11. <div v-if="info.from == 1" class="ptc-block">
  12. <div class="ptc-inner">
  13. <div class="ptc-cell">
  14. <p class="ptc-label">Email</p>
  15. <p class="ptc-value">{{ info.email }}</p>
  16. </div>
  17. <div class="ptc-cell">
  18. <p class="ptc-label">Password</p>
  19. <p class="ptc-value">
  20. <span>********</span>
  21. <span
  22. class="primary pointer ml354"
  23. @click="$router.push('/password/change')"
  24. >Edit ></span
  25. >
  26. </p>
  27. </div>
  28. </div>
  29. </div>
  30. <div v-else class="ptc-block">
  31. <div class="ptc-inner">
  32. <div class="ptc-cell">
  33. <p class="ptc-label">Account</p>
  34. <p class="ptc-value flex-ac">
  35. {{ info.email
  36. }}<i
  37. class="account-icon"
  38. :class="{
  39. 'a-facebook': info.from == 2,
  40. 'a-google': info.from == 3,
  41. 'a-apple': info.from == 4,
  42. }"
  43. ></i>
  44. </p>
  45. </div>
  46. </div>
  47. </div>
  48. </div>
  49. <h3 class="ptc-title pr">
  50. Login Detail<button class="stroke-btn" @click="status = 1">Edit</button>
  51. </h3>
  52. <div class="ptc-block">
  53. <div class="ptc-inner">
  54. <div class="ptc-cell">
  55. <p class="ptc-label">Name</p>
  56. <p class="ptc-value">{{ info.name }}</p>
  57. </div>
  58. <div class="ptc-cell">
  59. <p class="ptc-label">Pone number</p>
  60. <p class="ptc-value">{{ info.mobile }}</p>
  61. </div>
  62. <div class="ptc-cell">
  63. <p class="ptc-label">Address</p>
  64. <p class="ptc-value">{{ info.address }}</p>
  65. </div>
  66. </div>
  67. </div>
  68. </div>
  69. <div v-else-if="status === 1" class="p-account">
  70. <h3 class="ptc-title">Modify My profile</h3>
  71. <div class="ptc-wrapper">
  72. <div class="ptc-block">
  73. <div class="ptc-inner">
  74. <div class="ptc-cell">
  75. <p class="ptc-label">Name</p>
  76. <p class="ptc-value">
  77. <input
  78. v-model="values.name"
  79. class="ptc-input"
  80. placeholder="Please enter your real name"
  81. />
  82. </p>
  83. </div>
  84. <div class="ptc-cell">
  85. <p class="ptc-label">Phone Number</p>
  86. <p class="ptc-value">
  87. <input
  88. v-model="values.mobile"
  89. class="ptc-input"
  90. placeholder="Please enter your phone number"
  91. />
  92. </p>
  93. </div>
  94. <div class="ptc-cell">
  95. <p class="ptc-label">Address</p>
  96. <p class="ptc-value">
  97. <input
  98. v-model="address[0]"
  99. class="ptc-input mb24"
  100. placeholder="Road"
  101. />
  102. <input
  103. v-model="address[1]"
  104. class="ptc-input mb24"
  105. placeholder="State"
  106. />
  107. <input
  108. v-model="address[2]"
  109. class="ptc-input"
  110. placeholder="Zip code"
  111. />
  112. </p>
  113. </div>
  114. </div>
  115. </div>
  116. <div class="ptc-button-group">
  117. <div class="ptc-inner">
  118. <button class="ptc-button" @click="handleSubmit(applyUpdate)">
  119. SUBMIT
  120. </button>
  121. <button class="ptc-button ptc-button--stroke" @click="status = 0">
  122. BACK
  123. </button>
  124. </div>
  125. </div>
  126. </div>
  127. </div>
  128. </template>
  129. <script setup lang="ts">
  130. import { ref, computed, watch } from 'vue'
  131. import { state, updateUserInfo } from '@/store'
  132. import useForm from '@/hooks/useForm'
  133. import { string } from 'yup'
  134. import Toast from '@/components/toast'
  135. const status = ref(0)
  136. const address = ref<string[]>([])
  137. const info = computed(() => state.userInfo)
  138. const { values, handleSubmit } = useForm<ApiUser.Update.Request>({
  139. initialValues: {
  140. name: state.userInfo?.name,
  141. mobile: state.userInfo?.mobile,
  142. },
  143. schema: {
  144. name: string().required(),
  145. mobile: string().required(),
  146. },
  147. })
  148. watch(status, () => window.scrollTo(0, 0))
  149. async function applyUpdate() {
  150. values.address = address.value.filter(Boolean).join(',')
  151. await updateUserInfo(values as any)
  152. Toast('success')
  153. status.value = 0
  154. }
  155. </script>
  156. <style lang="scss">
  157. .p-account {
  158. .qrcode {
  159. width: 212px;
  160. height: 212px;
  161. background: #efefef;
  162. }
  163. .stroke-btn {
  164. position: absolute;
  165. top: 50%;
  166. transform: translateY(-50%);
  167. left: 310px;
  168. width: 132px;
  169. height: 56px;
  170. border-radius: 8px;
  171. border: 2px solid $primary-color;
  172. font-size: 32px;
  173. font-weight: bold;
  174. color: $primary-color;
  175. }
  176. .primary {
  177. margin-left: 48px;
  178. }
  179. .account-icon {
  180. margin-left: 24px;
  181. width: 56px;
  182. height: 56px;
  183. background-size: contain;
  184. }
  185. .a-google {
  186. background-image: url(@img/a-google.png);
  187. }
  188. .a-apple {
  189. background-image: url(@img/a-apple.png);
  190. }
  191. .a-facebook {
  192. background-image: url(@img/a-facebook.png);
  193. }
  194. .mb24 {
  195. margin-bottom: 24px;
  196. }
  197. .ml354 {
  198. margin-left: 354px;
  199. }
  200. }
  201. </style>