forget.vue 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. <template>
  2. <div class="sld_login">
  3. <div class="sld_login_header">
  4. <div class="content">
  5. <nuxt-link tag="a" class="l_logo" :to="`/`">
  6. <img
  7. class="img"
  8. :src="filtersStore.getSiteLogo"
  9. :onerror="defaultImg"
  10. alt
  11. />
  12. </nuxt-link>
  13. <div class="r_register_wrap">
  14. {{ L["想起密码?"] }}
  15. <a
  16. href="javascript:void(0)"
  17. class="go_register_btn"
  18. @click="goToPage('/login')"
  19. >
  20. {{ L["去登录"] }}
  21. </a>
  22. </div>
  23. </div>
  24. </div>
  25. <div class="sld_login_content">
  26. <img
  27. class="bg"
  28. :src="ImgBG? ImgBG : configInfo.main_user_forget_password_bg + ''"
  29. :onerror="defaultBgImg"
  30. alt
  31. />
  32. <div class="login">
  33. <div class="login_box">
  34. <div class="top">
  35. <div class="item1">{{ L["找回密码"] }}</div>
  36. </div>
  37. <div class="center">
  38. <div class="item account">
  39. <span
  40. style="color: #bbb; font-size: 21px; padding-top: 7px"
  41. class="icon iconfont icon-wode"
  42. ></span>
  43. <input
  44. type="text"
  45. v-model="memberEmail"
  46. :placeholder="L['请输入邮箱']"
  47. class="input"
  48. />
  49. <div
  50. data-type="userName"
  51. class="cancel"
  52. @click="clearInputVal('memberEmail')"
  53. >
  54. <span style="color: #bbb" class="iconfont icon-cuowu"></span>
  55. </div>
  56. </div>
  57. <div class="item password">
  58. <span
  59. style="color: #bbb; font-size: 18px; padding-top: 8px"
  60. class="icon iconfont icon-yanzhengma2"
  61. ></span>
  62. <input
  63. type="text"
  64. v-model="imgCode"
  65. :placeholder="L['请输入图形验证码']"
  66. class="input"
  67. />
  68. <img :src="showCodeImg" class="img_code" @click="getImgCode" />
  69. </div>
  70. <div class="error">
  71. <span
  72. v-if="errorMsg"
  73. style="color: #e1251b; font-size: 14px"
  74. class="iconfont icon-jubao"
  75. ></span>
  76. {{ errorMsg }}
  77. </div>
  78. <a href="javascript:void(0)" @click="forgetPwd" class="login_btn">{{
  79. L["找回密码"]
  80. }}</a>
  81. </div>
  82. </div>
  83. </div>
  84. </div>
  85. </div>
  86. </template>
  87. <script setup>
  88. import { ElMessage,ElMessageBox } from "element-plus";
  89. import { useUserInfo } from "@/store/user.js";
  90. // import { lang_zn } from "@/assets/language/zh";
  91. import { getCurLanguage } from '@/composables/common.js';
  92. import { useFiltersStore } from "@/store/filter.js";
  93. const filtersStore = useFiltersStore();
  94. // const L = lang_zn;
  95. const L = getCurLanguage();
  96. const configInfo = useUserInfo();
  97. const memberEmail = ref(""); //用户邮箱
  98. const errorMsg = ref(); //错误提示
  99. const router = useRouter();
  100. const { proxy } = getCurrentInstance();
  101. const showCodeImg = ref(""); //图形验证码图片
  102. const imgCodeKey = ref(""); //图形验证码的key
  103. const imgCode = ref(""); //图形验证码
  104. const defaultImg = ref("/common_top_logo.png");
  105. const defaultBgImg = ref("/forget_pwd_bg.png");
  106. const ImgBG = ref('')
  107. useHead({
  108. title: 'Forget Password',
  109. meta: [
  110. {
  111. name: "description",
  112. content: 'Forget Password',
  113. },
  114. {
  115. name: "keywords",
  116. content: 'Forget Password',
  117. },
  118. ],
  119. });
  120. //获取背景图
  121. const getBg = () => {
  122. get('v3/system/front/setting/getSettings?names=main_user_forget_password_bg').then(res=>{
  123. ImgBG.value = res.data[0]
  124. })
  125. }
  126. getBg()
  127. const forgetPwd = () => {
  128. let param = {};
  129. param.email = memberEmail.value;
  130. param.verifyCode = imgCode.value;
  131. param.verifyKey = imgCodeKey.value;
  132. //邮箱验证
  133. if (!param.email) {
  134. errorMsg.value = L["请输入邮箱"];
  135. return false;
  136. } else {
  137. let checkEmail2 = checkEmail(param.email);
  138. if (checkEmail2 !== true) {
  139. errorMsg.value = checkEmail2;
  140. return;
  141. } else {
  142. errorMsg.value = "";
  143. }
  144. }
  145. //验证码校验
  146. let checkImgCode2 = checkImgCode(param.verifyCode);
  147. if (checkImgCode2 !== true) {
  148. errorMsg.value = checkImgCode2;
  149. return false;
  150. }
  151. post("v3/member/front/active/forget/pwd", param).then((res) => {
  152. if (res.state == 200) {
  153. //成功提示,并返回到登录页面
  154. // ElMessage.success(res.msg + param.email);
  155. // let msg = "<p style='color: #000;'><b>" + L["我们已经发邮件到"] + "</b> " + "<font color='#e13841'>"+param.email+"</font></p>" +
  156. let msg = "<p style='color: #000;'><b>" + L["我们已经发邮件到"] + " " +param.email+"</b></p>" +
  157. "<p>" + L["请按照邮件中的说明重新设置密码。"] + "</p>" +
  158. "<p style='margin-top: 10px;color: #00985e;'>" + L["邮件可能需要几分钟才能到达。如果您没有收到,请检查您的垃圾邮件文件夹或请求另一封邮件。"] + "</p>";
  159. ElMessageBox.alert(msg, L["温馨提示"], {dangerouslyUseHTMLString: true, confirmButtonText: L["好的"],});
  160. setTimeout(() => {
  161. router.back();
  162. }, 500);
  163. } else {
  164. //提示错误
  165. errorMsg.value = res.msg;
  166. }
  167. });
  168. };
  169. //清空输入框内容
  170. const clearInputVal = (type) => {
  171. if (type == "memberEmail") {
  172. memberEmail.value = "";
  173. }
  174. };
  175. watch([memberEmail, imgCode], () => {
  176. imgCode.value = imgCode.value.substring(0, 4);
  177. if (imgCode.value || memberEmail.value) {
  178. errorMsg.value = "";
  179. }
  180. });
  181. //获取图形验证码
  182. const getImgCode = () => {
  183. get("v3/captcha/common/getCaptcha", {}).then((res) => {
  184. if (res.state == 200) {
  185. showCodeImg.value = "data:image/png;base64," + res.data.captcha;
  186. imgCodeKey.value = res.data.key;
  187. }
  188. });
  189. };
  190. //通过replace方式跳转页面
  191. const goToPage = (type) => {
  192. router.replace({
  193. path: type,
  194. });
  195. };
  196. onMounted(() => {
  197. getImgCode(); //获取图形验证码
  198. document.body.classList.remove("el-popup-parent--hidden");
  199. });
  200. </script>
  201. <style lang="scss" scoped>
  202. @use "@/assets/style/register.scss" as *;
  203. .el-popup-parent--hidden {
  204. overflow: visible;
  205. }
  206. input[type="number"] {
  207. -moz-appearance: textfield;
  208. }
  209. input[type="number"]::-webkit-inner-spin-button,
  210. input[type="number"]::-webkit-outer-spin-button {
  211. -webkit-appearance: none;
  212. margin: 0;
  213. }
  214. </style>