Login.vue 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. <template>
  2. <div class="auth-wrapper auth-v2">
  3. <b-row class="auth-inner m-0">
  4. <!-- Brand logo-->
  5. <b-link class="brand-logo">
  6. <vuexy-logo />
  7. <h2 class="brand-text text-primary ml-1">
  8. Vuexy
  9. </h2>
  10. </b-link>
  11. <!-- /Brand logo-->
  12. <!-- Left Text-->
  13. <b-col lg="8" class="d-none d-lg-flex align-items-center p-5">
  14. <div class="w-100 d-lg-flex align-items-center justify-content-center px-5">
  15. <b-img fluid :src="imgUrl" alt="Login V2" />
  16. </div>
  17. </b-col>
  18. <!-- /Left Text-->
  19. <!-- Login-->
  20. <b-col lg="4" class="d-flex align-items-center auth-bg px-2 p-lg-5">
  21. <b-col sm="8" md="6" lg="12" class="px-xl-2 mx-auto">
  22. <b-card-title title-tag="h2" class="font-weight-bold mb-1">
  23. Welcome to Vuexy! 👋
  24. </b-card-title>
  25. <b-card-text class="mb-2">
  26. Please sign-in to your account and start the adventure
  27. </b-card-text>
  28. <!-- form -->
  29. <validation-observer ref="loginValidation">
  30. <b-form class="auth-login-form mt-2" @submit.prevent>
  31. <!-- email -->
  32. <b-form-group label="Email" label-for="login-email">
  33. <validation-provider #default="{ errors }" name="Email" rules="required|email">
  34. <b-form-input id="login-email" ref="inputEmail" v-model="userEmail"
  35. :state="errors.length > 0 ? false : null" name="login-email" placeholder="john@example.com" />
  36. <small class="text-danger">{{ errors[0] }}</small>
  37. </validation-provider>
  38. </b-form-group>
  39. <!-- forgot password -->
  40. <b-form-group>
  41. <div class="d-flex justify-content-between">
  42. <label for="login-password">Password</label>
  43. <b-link :to="{ name: 'auth-forgot-password-v2' }">
  44. <small>Forgot Password?</small>
  45. </b-link>
  46. </div>
  47. <validation-provider #default="{ errors }" name="Password" rules="required">
  48. <b-input-group class="input-group-merge" :class="errors.length > 0 ? 'is-invalid' : null">
  49. <b-form-input id="login-password" ref="inputPassword" v-model="password"
  50. :state="errors.length > 0 ? false : null" class="form-control-merge" :type="passwordFieldType"
  51. name="login-password" placeholder="············" />
  52. <b-input-group-append is-text>
  53. <feather-icon class="cursor-pointer" :icon="passwordToggleIcon"
  54. @click="togglePasswordVisibility" />
  55. </b-input-group-append>
  56. </b-input-group>
  57. <small class="text-danger">{{ errors[0] }}</small>
  58. </validation-provider>
  59. </b-form-group>
  60. <!-- checkbox -->
  61. <b-form-group>
  62. <b-form-checkbox id="remember-me" v-model="status" name="checkbox-1">
  63. Remember Me
  64. </b-form-checkbox>
  65. </b-form-group>
  66. <!-- submit buttons -->
  67. <b-button type="submit" variant="primary" block @click="validationForm">
  68. Sign in
  69. </b-button>
  70. </b-form>
  71. </validation-observer>
  72. <b-card-text class="text-center mt-2">
  73. <span>New on our platform? </span>
  74. <b-link :to="{ name: 'page-auth-register-v2' }">
  75. <span>&nbsp;Create an account</span>
  76. </b-link>
  77. </b-card-text>
  78. <!-- divider -->
  79. <div class="divider my-2">
  80. <div class="divider-text">
  81. or
  82. </div>
  83. </div>
  84. <!-- social buttons -->
  85. <div class="auth-footer-btn d-flex justify-content-center">
  86. <b-button variant="facebook" href="javascript:void(0)">
  87. <feather-icon icon="FacebookIcon" />
  88. </b-button>
  89. <b-button variant="twitter" href="javascript:void(0)">
  90. <feather-icon icon="TwitterIcon" />
  91. </b-button>
  92. <b-button variant="google" href="javascript:void(0)">
  93. <feather-icon icon="MailIcon" />
  94. </b-button>
  95. <b-button variant="github" href="javascript:void(0)">
  96. <feather-icon icon="GithubIcon" />
  97. </b-button>
  98. </div>
  99. </b-col>
  100. </b-col>
  101. <!-- /Login-->
  102. </b-row>
  103. </div>
  104. </template>
  105. <script>
  106. /* eslint-disable global-require */
  107. import { ValidationProvider, ValidationObserver } from 'vee-validate'
  108. import VuexyLogo from '@core/layouts/components/Logo.vue'
  109. import {
  110. BRow, BCol, BLink, BFormGroup, BFormInput, BInputGroupAppend, BInputGroup, BFormCheckbox, BCardText, BCardTitle, BImg, BForm, BButton,
  111. } from 'bootstrap-vue'
  112. import { required, email } from '@validations'
  113. import { togglePasswordVisibility } from '@core/mixins/ui/forms'
  114. import store from '@/store/index'
  115. import ToastificationContent from '@core/components/toastification/ToastificationContent.vue'
  116. import useJwt from '@/auth/jwt/useJwt'
  117. import { getExistingAbility } from '../libs/acl/ability'
  118. export default {
  119. components: {
  120. BRow,
  121. BCol,
  122. BLink,
  123. BFormGroup,
  124. BFormInput,
  125. BInputGroupAppend,
  126. BInputGroup,
  127. BFormCheckbox,
  128. BCardText,
  129. BCardTitle,
  130. BImg,
  131. BForm,
  132. BButton,
  133. VuexyLogo,
  134. ValidationProvider,
  135. ValidationObserver,
  136. },
  137. mixins: [togglePasswordVisibility],
  138. data() {
  139. return {
  140. status: '',
  141. password: '',
  142. userEmail: '',
  143. sideImg: require('@/assets/images/pages/login-v2.svg'),
  144. // validation rulesimport store from '@/store/index'
  145. required,
  146. email,
  147. }
  148. },
  149. computed: {
  150. passwordToggleIcon() {
  151. return this.passwordFieldType === 'password' ? 'EyeIcon' : 'EyeOffIcon'
  152. },
  153. imgUrl() {
  154. if (store.state.appConfig.layout.skin === 'dark') {
  155. // eslint-disable-next-line vue/no-side-effects-in-computed-properties
  156. this.sideImg = require('@/assets/images/pages/login-v2-dark.svg')
  157. return this.sideImg
  158. }
  159. return this.sideImg
  160. },
  161. },
  162. methods: {
  163. validationForm() {
  164. this.$refs.loginValidation.validate().then(success => {
  165. if (success) {
  166. this.$toast({
  167. component: ToastificationContent,
  168. props: {
  169. title: 'Form Submitted',
  170. icon: 'EditIcon',
  171. variant: 'success',
  172. },
  173. })
  174. useJwt.login({ email: this.$refs.inputEmail.value, password: this.$refs.inputPassword.value })
  175. .then(res => {
  176. useJwt.setToken(res.data.token)
  177. localStorage.setItem('userData', res.data.userData)
  178. this.$ability.update(getExistingAbility(JSON.parse(res.data.userData).ability))
  179. if (this.$route.query.redirect) {
  180. this.$router.push(this.$route.query.redirect)
  181. } else {
  182. this.$router.push('/')
  183. }
  184. })
  185. }
  186. })
  187. },
  188. },
  189. }
  190. </script>
  191. <style lang="scss">
  192. @import '@resources/scss/vue/pages/page-auth.scss';
  193. </style>