index.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <template>
  2. <div v-if="!showSurprise" class="p-login">
  3. <router-link class="nav-home" to="/">
  4. <i class="icon"></i><span class="text">HOME</span>
  5. </router-link>
  6. <div class="logo"></div>
  7. <div class="container">
  8. <div class="ptc-form">
  9. <div class="title">Sign in to PTC Care Plus</div>
  10. <div class="ptc-form-item">
  11. <input
  12. v-model="values.email"
  13. class="ptc-input"
  14. placeholder="email address"
  15. />
  16. </div>
  17. <div class="ptc-form-item">
  18. <input
  19. v-model="values.password"
  20. class="ptc-input"
  21. type="password"
  22. placeholder="password"
  23. @keydown="$event.keyCode === 13 && handleSubmit(handleLogin)"
  24. />
  25. </div>
  26. <div class="ptc-form-item" style="font-size: 0">
  27. <router-link class="tip primary" to="/password/reset"
  28. >Forgot password?</router-link
  29. >
  30. </div>
  31. <div class="ptc-form-item">
  32. <button class="ptc-button" @click="handleSubmit(handleLogin)">
  33. SIGN IN
  34. </button>
  35. </div>
  36. <div class="ptc-form-item">
  37. <p class="tip">
  38. Don’t have an account?
  39. <router-link class="primary" to="/register">Create one</router-link>
  40. </p>
  41. </div>
  42. </div>
  43. <div class="alternative">
  44. <div class="delimiter">Or sign in with</div>
  45. <ul class="list">
  46. <li class="item" name="google"></li>
  47. <li class="item" name="facebook"></li>
  48. <li class="item" name="apple"></li>
  49. </ul>
  50. </div>
  51. <div class="policy">
  52. By clicking “Sign in” you agree to PTC’s
  53. <span class="primary">terms of use</span> and confirm that you’ve read
  54. and acknowledged PTC’s <span class="primary">privacy policy</span>
  55. </div>
  56. </div>
  57. </div>
  58. </template>
  59. <script setup lang="ts">
  60. import { ref, reactive } from 'vue'
  61. import { useRouter, useRoute } from 'vue-router'
  62. import { login } from '@/service/user'
  63. import useForm from '@/hooks/useForm'
  64. import { string } from 'yup'
  65. import { getUserInfo } from '@/store'
  66. import Toast from '@/components/toast'
  67. const router = useRouter()
  68. const { from } = useRoute().query as any
  69. const showSurprise = ref(false)
  70. const { values, handleSubmit } = useForm<ApiUser.Login.Request>({
  71. schema: {
  72. email: string().required().email(),
  73. password: string().required(),
  74. },
  75. })
  76. async function handleLogin() {
  77. const { message } = await login(values as any)
  78. Toast(message)
  79. const { need_change } = await getUserInfo()
  80. router.replace(need_change ? '/password/change' : from || '/')
  81. }
  82. </script>
  83. <style lang="scss">
  84. .surprise {
  85. .ptc-form {
  86. padding: 96px 80px 0;
  87. }
  88. .title {
  89. line-height: 56px;
  90. font-size: 40px;
  91. font-weight: 600;
  92. color: #333;
  93. }
  94. }
  95. </style>