LoginIndex.vue 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. <template>
  2. <!-- 登录 -->
  3. <div class="login">
  4. <s-header :name="sys ? sys.title : $t('public.sysName')" :noback="true"></s-header>
  5. <div class="loginLogoBox l-re">
  6. <div class="loginLogo"></div>
  7. </div>
  8. <div class="loginTitleBox l-flex-center">
  9. <span class="loginTitle">{{ $t("login.title") }}</span>
  10. </div>
  11. <div class="loginFormBox">
  12. <van-form @submit="onSubmit">
  13. <van-field v-model="userPhone" name="userPhone" label="" placeholder="请输入手机号" :rules="[
  14. { required: true, message: '请输入手机号' },
  15. { validator: validatePhone, message: '请输入有效的手机号' }
  16. ]" />
  17. <van-field v-model="userPwd" type="password" name="userPwd" label="" :placeholder="$t('login.passWordInput')"
  18. :rules="[{ required: true, message: $t('login.passWordInput') }]" />
  19. <div class="checkedPasswordBox">
  20. <!-- 记住密码 -->
  21. <van-checkbox icon-size="18px" class="checkedPassWord" v-model="checked">
  22. {{ $t("login.checkedPassWord") }}
  23. </van-checkbox>
  24. <!-- 忘记密码 -->
  25. <span class="forgetPassWord" @click="forgetPassword">{{
  26. $t("login.forgetPassWord")
  27. }}</span>
  28. </div>
  29. <br>
  30. <br>
  31. <div class="buttonBox">
  32. <!-- 点击注册 -->
  33. <van-button round type="primary" class="register" @click="registerClick">{{ $t("login.regusterButton") }}
  34. </van-button>
  35. <!-- 登录 -->
  36. <van-button round type="primary" native-type="submit">{{
  37. $t("login.loginButton")
  38. }}
  39. </van-button>
  40. </div>
  41. </van-form>
  42. </div>
  43. </div>
  44. </template>
  45. <script>
  46. import md5 from "js-md5";
  47. import { onMounted, ref, computed, reactive } from "vue";
  48. import { showSuccessToast, showFailToast, Dialog, Button } from "vant";
  49. // import { login, getSys } from "@/service/login";
  50. import { login } from "@/service/login";
  51. import { setLocal, styleUrl } from "@/common/js/utils";
  52. import sHeader from "@/components/SimpleHeader";
  53. import { useRoute, useRouter } from "vue-router";
  54. import { useI18n } from "vue-i18n";
  55. export default {
  56. setup() {
  57. const { t } = useI18n();
  58. const checked = ref(false); // 是否记住密码状态
  59. const userPhone = ref('');
  60. const userPwd = ref("");
  61. const router = useRouter();
  62. const route = useRoute();
  63. const sys = ref(null);
  64. // 页面初始化
  65. onMounted(() => {
  66. // 加载样式
  67. styleUrl('login');
  68. if (route.query.relation_admin_id) {
  69. // getSysFun();
  70. }
  71. const savedCredentials = localStorage.getItem('savedCredentials');
  72. if (savedCredentials) {
  73. checked.value = true;
  74. const { savedUserPhone, savedPassword } = JSON.parse(savedCredentials);
  75. userPhone.value = savedUserPhone;
  76. userPwd.value = savedPassword;
  77. }
  78. });
  79. // const getSysFun = async () => {
  80. // const { data } = await getSys({
  81. // relationAdminId: route.query.relation_admin_id,
  82. // });
  83. // if (data.code === "00000") {
  84. // data.data.relationAdminId = route.query.relation_admin_id;
  85. // setLocal("loginSys", JSON.stringify(data.data));
  86. // sys.value = data.data;
  87. // }
  88. // };
  89. function validatePhone(value) {
  90. const phoneRegex = /^1[3-9]\d{9}$/;
  91. return phoneRegex.test(value);
  92. }
  93. const showPopover = ref(false);
  94. // 登录
  95. const onSubmit = async (values) => {
  96. let loginParam = {
  97. phone: values.userPhone,
  98. password: md5(values.userPwd),
  99. }
  100. const { data } = await login(loginParam);
  101. console.log("记住密码?", checked.value);
  102. console.log("data.code", data.code);
  103. if (data.code === "00000") {
  104. setLocal("loginUser", JSON.stringify(data.data));
  105. if (checked.value) {
  106. const savedCredentials = JSON.stringify({ savedUserPhone: values.userPhone, savedPassword: values.userPwd });
  107. localStorage.setItem('savedCredentials', savedCredentials);
  108. } else {
  109. const savedCredentials = localStorage.getItem('savedCredentials');
  110. if (savedCredentials) {
  111. localStorage.removeItem('savedCredentials', savedCredentials);
  112. }
  113. }
  114. showSuccessToast(t('login.loginSucess'));
  115. localStorage.setItem('firstLogin', true);
  116. // 需要刷新页面,否则 axios.js 文件里的 token 不会被重置
  117. window.location.href = '/sz-stock/';
  118. setTimeout(() => {
  119. router.push("/home");
  120. }, 200);
  121. } else {
  122. showFailToast(data.message);
  123. }
  124. };
  125. // 跳转注册页面
  126. const registerClick = async () => {
  127. await router.push("/register");
  128. };
  129. // 跳转忘记密码页面
  130. const forgetPassword = async () => {
  131. await router.push("/forgetPassword");
  132. };
  133. const state = reactive({
  134. isLoading: false
  135. })
  136. const isInWeChat = computed(() => {
  137. const ua = window.navigator.userAgent.toLowerCase();
  138. return new RegExp('micromessenger').test(ua);
  139. });
  140. return {
  141. checked,
  142. userPhone,
  143. userPwd,
  144. onSubmit,
  145. registerClick,
  146. forgetPassword,
  147. sys,
  148. isInWeChat,
  149. state,
  150. showPopover,
  151. validatePhone
  152. };
  153. },
  154. components: {
  155. sHeader,
  156. [Button.name]: Button,
  157. [Dialog.name]: Dialog
  158. },
  159. };
  160. </script>
  161. <style lang="less" scoped>
  162. @import "../../common/style/mixin";
  163. </style>