login.html 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  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;">
  50. <p class="navtation"><a href="/index.html">首页</a> - {{showLogin?'登录页':'注册页'}}</p>
  51. <div class="addvx" v-if="!showLogin">
  52. 扫码加我微信 <br>
  53. <b>免费领取注册邀请码</b><br>
  54. <img width="200" src="img/logo.jpg" alt=""><br>
  55. 备注“面试邀请码” <br>
  56. 拉你入猿人学 - 面试交流群
  57. </div>
  58. <div class="signup">
  59. <form v-if="!showLogin" class="form reg" >
  60. <label>昵称</label>
  61. <input type="text" v-model="form.nickname" placeholder="昵称将会展示出来">
  62. <label>注册账号</label>
  63. <input type="text" v-model="form.name" placeholder="登录时的账号">
  64. <label>登录密码</label>
  65. <input type="password" v-model="form.password">
  66. <label>确认密码</label>
  67. <input type="password" v-model="form.repassword">
  68. <label>注册邀请码</label>
  69. <input type="text" v-model="form.invitationCode" placeholder="右侧扫码加我微信,免费领取">
  70. <button type="button" @click="submitForm">立即注册</button>
  71. <p align="center"><a style="cursor: pointer;" @click="showLogin=1">去登录</a></p>
  72. </form>
  73. <form v-else class="form reg" style="padding: 30px;">
  74. <label>账号</label>
  75. <input type="text" v-model="loginForm.name" placeholder="账号">
  76. <label>密码</label>
  77. <input type="password" placeholder="密码" v-model="loginForm.password">
  78. <button type="button" @click="login">立即登录</button>
  79. <p align="center"><a style="cursor: pointer;" @click="showLogin=0">去注册</a></p>
  80. </form>
  81. </div>
  82. </div>
  83. </section>
  84. <script src="js/public.js"></script>
  85. <script>
  86. const { createApp } = Vue;
  87. createApp({
  88. data() {
  89. return {
  90. showLogin: true,
  91. form: {
  92. name: "",
  93. nickname: "",
  94. password: "",
  95. repassword: "",
  96. invitationCode: ""
  97. },
  98. loginForm: {
  99. name: "",
  100. password: ""
  101. },
  102. userInfo: {}, // 添加 userInfo 变量
  103. show: 0 // 添加 show 变量
  104. }
  105. },
  106. created() {
  107. const userInfo = JSON.parse(localStorage.getItem('userInfo')); // 获取本地存储的用户信息
  108. this.userInfo = userInfo;
  109. },
  110. methods: {
  111. submitForm() {
  112. if (!this.form.name || !this.form.nickname || !this.form.password || !this.form.repassword || !this.form.invitationCode) {
  113. alert('所有字段都不能为空');
  114. return;
  115. }
  116. if (this.form.password !== this.form.repassword) {
  117. alert('两次输入的密码不一致');
  118. return;
  119. }
  120. axios.post(url + '/api/account/regist', this.form)
  121. .then(res => {
  122. localStorage.setItem('token',res.data.data.token);
  123. this.getUser();
  124. window.location.href = '/index.html';
  125. })
  126. .catch(err => {
  127. alert('提交失败,请重试');
  128. console.error(err);
  129. });
  130. },
  131. login() {
  132. if (!this.loginForm.name || !this.loginForm.password) {
  133. alert('所有字段都不能为空');
  134. return;
  135. }
  136. axios.post(url + '/api/account/login', this.loginForm)
  137. .then(res => {
  138. if(res.data.code==0){
  139. // alert('登录成功');
  140. localStorage.setItem('token',res.data.data.token);
  141. this.getUser();
  142. setTimeout(() => {
  143. window.location.href = '/index.html';
  144. }, 500);
  145. }else{
  146. alert(res.data.message);
  147. }
  148. })
  149. .catch(err => {
  150. alert('登录失败,请重试');
  151. console.error(err);
  152. });
  153. },
  154. getUser(){
  155. // 获取token
  156. const token = localStorage.getItem('token');
  157. axios.get(url + '/api/account/userinfo', {
  158. headers: {
  159. 'Authorization': `${token}`
  160. }
  161. })
  162. .then(res => {
  163. if (res.data.code === 0) {
  164. localStorage.setItem('userInfo', JSON.stringify(res.data.data));
  165. }
  166. })
  167. },
  168. logout() { // 添加 logout 方法
  169. localStorage.removeItem('userInfo');
  170. localStorage.removeItem('token');
  171. this.userInfo = null;
  172. }
  173. }
  174. }).mount('#app');
  175. </script>
  176. </body>
  177. </html>