login.html 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>登录</title>
  7. <link rel="stylesheet" href="css/index.css">
  8. <link rel="stylesheet" href="css/login.css">
  9. <script src="js/axios.min.js"></script>
  10. <script src="js/vue.js"></script>
  11. </head>
  12. <body>
  13. <section id="app">
  14. <header>
  15. <div class="left_nav">
  16. <img @click="show=!show" class="phone" width="30" src="img/menu.png" alt="">
  17. <img class="logo" src="img/logo.jpg" alt="logo">
  18. </div>
  19. <div class="nav">
  20. <a class="act" href="/index.html">猿人学面试</a>
  21. <a href="">爬虫比赛</a>
  22. <a href="">关于猿人学</a>
  23. </div>
  24. <div class="login">
  25. <div class="pc">
  26. <img width="30px" src="img/logo.jpg" alt="logo">
  27. <div v-if="userInfo" class="menu">
  28. {{userInfo.name}}
  29. <ul>
  30. <li><a href="/record.html">我的刷题记录</a></li>
  31. <li @click="logout"><a>退出登录</a></li>
  32. </ul>
  33. </div>
  34. <a v-else href="/login.html">请先登录</a>
  35. </div>
  36. <div class="phone">
  37. <span v-if="userInfo">{{userInfo.name}}</span>
  38. <a v-else href="/login.html">请先登录</a>
  39. </div>
  40. </div>
  41. </header>
  42. <transition name="slide">
  43. <div class="slide" v-if="show">
  44. <a class="act" href="/index.html">猿人学面试</a>
  45. <a href="">爬虫比赛</a>
  46. <a href="">关于猿人学</a>
  47. </div>
  48. </transition>
  49. <div class="content" style="justify-content: center;width: 930px;">
  50. <p class="navtation"><a href="/index.html">首页</a> - {{showLogin?'登录页':'注册页'}}</p>
  51. <div class="top_bg">
  52. <div class="signup">
  53. <form v-if="!showLogin" class="form reg" >
  54. <label>昵称</label>
  55. <input type="text" v-model="form.nickname" placeholder="昵称将会展示出来">
  56. <label>注册账号</label>
  57. <input type="text" v-model="form.name" placeholder="登录时的账号">
  58. <label>登录密码</label>
  59. <input type="password" v-model="form.password">
  60. <label>确认密码</label>
  61. <input type="password" v-model="form.repassword">
  62. <label>注册邀请码</label>
  63. <input type="text" v-model="form.invitationCode" placeholder="右侧扫码加我微信,免费领取">
  64. <button type="button" @click="submitForm">立即注册</button>
  65. <p align="center"><a style="cursor: pointer;" @click="showLogin=1">去登录</a></p>
  66. </form>
  67. <form v-else class="form reg" style="padding: 30px;">
  68. <label>账号</label>
  69. <input type="text" v-model="loginForm.name" placeholder="账号">
  70. <label>密码</label>
  71. <input type="password" placeholder="密码" v-model="loginForm.password">
  72. <button type="button" @click="login">立即登录</button>
  73. <p align="center"><a style="cursor: pointer;" @click="showLogin=0">去注册</a></p>
  74. </form>
  75. </div>
  76. <div class="addvx">
  77. 扫码加我微信 <br>
  78. <b>免费领取注册邀请码</b><br>
  79. <img width="50%" src="img/wx.jpg" alt=""><br>
  80. 备注“面试邀请码” <br>
  81. 拉你入猿人学 - 面试交流群
  82. </div>
  83. </div>
  84. </div>
  85. </section>
  86. <script src="js/public.js"></script>
  87. <script>
  88. const { createApp } = Vue;
  89. createApp({
  90. data() {
  91. return {
  92. showLogin: false,
  93. form: {
  94. name: "",
  95. nickname: "",
  96. password: "",
  97. repassword: "",
  98. invitationCode: ""
  99. },
  100. loginForm: {
  101. name: "",
  102. password: ""
  103. },
  104. userInfo: {}, // 添加 userInfo 变量
  105. show: 0 // 添加 show 变量
  106. }
  107. },
  108. created() {
  109. const userInfo = JSON.parse(localStorage.getItem('userInfo')); // 获取本地存储的用户信息
  110. this.userInfo = userInfo;
  111. },
  112. methods: {
  113. submitForm() {
  114. if (!this.form.name || !this.form.nickname || !this.form.password || !this.form.repassword || !this.form.invitationCode) {
  115. alert('所有字段都不能为空');
  116. return;
  117. }
  118. if (this.form.password !== this.form.repassword) {
  119. alert('两次输入的密码不一致');
  120. return;
  121. }
  122. axios.post(url + '/api/account/regist', this.form)
  123. .then(res => {
  124. localStorage.setItem('token',res.data.data.token);
  125. this.getUser();
  126. window.location.href = '/index.html';
  127. })
  128. .catch(err => {
  129. alert('提交失败,请重试');
  130. console.error(err);
  131. });
  132. },
  133. login() {
  134. if (!this.loginForm.name || !this.loginForm.password) {
  135. alert('所有字段都不能为空');
  136. return;
  137. }
  138. axios.post(url + '/api/account/login', this.loginForm)
  139. .then(res => {
  140. if(res.data.code==0){
  141. // alert('登录成功');
  142. localStorage.setItem('token',res.data.data.token);
  143. this.getUser();
  144. setTimeout(() => {
  145. window.location.href = '/index.html';
  146. }, 500);
  147. }else{
  148. alert(res.data.message);
  149. }
  150. })
  151. .catch(err => {
  152. alert('登录失败,请重试');
  153. console.error(err);
  154. });
  155. },
  156. getUser(){
  157. // 获取token
  158. const token = localStorage.getItem('token');
  159. axios.get(url + '/api/account/userinfo', {
  160. headers: {
  161. 'Authorization': `${token}`
  162. }
  163. })
  164. .then(res => {
  165. if (res.data.code === 0) {
  166. localStorage.setItem('userInfo', JSON.stringify(res.data.data));
  167. }
  168. })
  169. },
  170. logout() { // 添加 logout 方法
  171. localStorage.removeItem('userInfo');
  172. localStorage.removeItem('token');
  173. this.userInfo = null;
  174. }
  175. }
  176. }).mount('#app');
  177. </script>
  178. </body>
  179. </html>