• 项目实战——实现注册与登录模块(结尾)


    目录

    一、整体框架

     二、前端页面授权

    三、实现注册页面

     四、实现登录状态的持久化


    一、整体框架

    框架1

     二、前端页面授权

    当我们登录网站的时候,如果没有登录,强制让用户重定向到 登录界面

    在 router 目录下的 index.js 文件下实现。 router -> index.js:

    1. import store from '../store/index'
    2. // 把一些额外信息放到一个额外的域里面,meta信息里面存一下是否要授权,如果需要授权而且没有登录,重定向到登录页面,重定向到登录界面。
    3. const routes = [
    4. {
    5. path: "/",
    6. name: "home",
    7. redirect: "/pk/",
    8. meta: {
    9. requestAuth: true,
    10. }
    11. },
    12. {
    13. path: "/pk/",
    14. name: "pk_index",
    15. component: PkIndexView,
    16. meta: {
    17. requestAuth: true,
    18. }
    19. },
    20. {
    21. path: "/record/",
    22. name: "record_index",
    23. component: RecordIndexView,
    24. meta: {
    25. requestAuth: true,
    26. }
    27. },
    28. {
    29. path: "/ranklist/",
    30. name: "ranklist_index",
    31. component: RanklistIndexView,
    32. meta: {
    33. requestAuth: true,
    34. }
    35. },
    36. {
    37. path: "/user/bot/",
    38. name: "user_bot_index",
    39. component: UserBotIndexView,
    40. meta: {
    41. requestAuth: true,
    42. }
    43. },
    44. {
    45. path: "/user/account/login",
    46. name: "user_account_login",
    47. component: UserAccountLoginView,
    48. meta: {
    49. requestAuth: false,
    50. }
    51. },
    52. {
    53. path: "/user/account/register",
    54. name: "user_account_register",
    55. component: UserAccountRegisterView,
    56. meta: {
    57. requestAuth: false,
    58. }
    59. },
    60. {
    61. path: "/404/",
    62. name: "404",
    63. component: NotFound,
    64. meta: {
    65. requestAuth: false,
    66. }
    67. },
    68. {
    69. path: "/:catchAll(.*)",
    70. redirect: "/404/",
    71. }
    72. ]
    73. // to跳转到哪个页面, from表示从哪个页面跳转过去
    74. // next的表示将页面要不要执行下一步操作,写之前首先要记录每一个未授权界面
    75. router.beforeEach((to, from, next) => {
    76. if (to.meta.requestAuth && !store.state.user.is_login) {
    77. next({name: "user_account_login"});
    78. } else {
    79. next();
    80. }
    81. })

    前端页面重定向

    最终效果: 如果处于未登录状态,点击 除注册之外的按钮 页面会跳转到 登录界面。

    三、实现注册页面

    在 view -> user -> account 下的 UserAccountRegisterView.vue 文件实现,实现方式类似于同目录下的 UserAccountLoginView.vue

    可以直接把登录页面的样式复制过来再做修改

    1. <template>
    2. <ContentField>
    3. <div class="row justify-content-md-center">
    4. <div class="col-3">
    5. <form @submit.prevent="register">
    6. <div class="mb-3">
    7. <label for="username" class="form-label">用户名label>
    8. <input v-model="username" type="text" class="form-control" id="username" placeholder="请输入用户名">
    9. div>
    10. <div class="mb-3">
    11. <label for="password" class="form-label">密码label>
    12. <input v-model="password" type="password" class="form-control" id="password" placeholder="请输入密码">
    13. div>
    14. <div class="mb-3">
    15. <label for="confirmedpassword" class="form-label">密码label>
    16. <input v-model="confirmedpassword" type="password" class="form-control" id="confirmedpassword" placeholder="请再次输入密码">
    17. div>
    18. <div class="error-message">{{ error_message }}div>
    19. <button type="submit" class="btn btn-primary">提交button>
    20. form>
    21. div>
    22. div>
    23. ContentField>
    24. template>
    25. <script>
    26. import ContentField from '../../../components/ContentField.vue'
    27. import { ref } from 'vue'
    28. import router from '../../../router/index'
    29. import $ from 'jquery'
    30. export default {
    31. components: {
    32. ContentField
    33. },
    34. setup() {
    35. let username = ref('');
    36. let password = ref('');
    37. let confirmedPassword = ref('');
    38. let error_message = ref('');
    39. const register = () => {
    40. $.ajax({
    41. url: "http://127.0.0.1:8080/user/account/register/",
    42. type: "post",
    43. data: {
    44. username: username.value,
    45. password: password.value,
    46. confirmedPassword: confirmedPassword.value,
    47. },
    48. success(resp) {
    49. // 成功直接返回登录界面
    50. if (resp.error_message === "success") {
    51. router.push({name: "user_account_login"});
    52. } else {
    53. error_message.value = resp.error_message;
    54. }
    55. },
    56. });
    57. }
    58. return {
    59. username,
    60. password,
    61. confirmedPassword,
    62. error_message,
    63. register,
    64. }
    65. }
    66. }
    67. script>
    68. <style scoped>
    69. button {
    70. width: 100%;
    71. }
    72. div.error-message {
    73. color: red;
    74. justify-content: center;
    75. }
    76. style>

    注册页面

     注册界面成功

     在测试的时候可以会遇到不输入密码也可以注册成功的 bug, 在 RegisterServiceImpl.java 下 修改一下就可以了:

    bug

     四、实现登录状态的持久化

    当我们的用户重定向到登陆页面的时候,我们需要把用户的 token 存储到浏览器的 local storage,这样就可以实现登录状态持久化。

    首先 修改 store 目录下的 -> user.js 文件,在合适的位置添加下列两行。

    1. localStorage.setItem("jwt_token", resp.token);
    2. localStorage.removeItem("jwt_token");

    localstorage

     其次 修改 view -> user -> account 下的 UserAccountLoginView.vue 文件

    1. <script>
    2. import ContentField from '../../../components/ContentField.vue'
    3. import { useStore } from 'vuex'
    4. import { ref } from 'vue'
    5. import router from '../../../router/index'
    6. export default {
    7. components: {
    8. ContentField
    9. },
    10. setup() {
    11. const store = useStore();
    12. let username = ref('');
    13. let password = ref('');
    14. let error_message = ref('');
    15. const jwt_token = localStorage.getItem("jwt_token");
    16. if (jwt_token) {
    17. store.commit("updateToken", jwt_token);
    18. store.dispatch("getinfo", {
    19. success() {
    20. router.push({ name: "home" });
    21. },
    22. error() {
    23. }
    24. })
    25. }else {
    26. }
    27. const login = () => {
    28. error_message.value = "";
    29. store.dispatch("login", {
    30. username: username.value,
    31. password: password.value,
    32. success() {
    33. store.dispatch("getinfo", {
    34. success() {
    35. router.push({ name: 'home' });
    36. console.log(store.state.user);
    37. }
    38. })
    39. },
    40. error() {
    41. error_message.value = "用户名或密码错误";
    42. }
    43. })
    44. }
    45. return {
    46. username,
    47. password,
    48. error_message,
    49. login,
    50. }
    51. }
    52. }
    53. script>

    在这里插入图片描述

    优化前端
    在实现前端登录状态持久化之后,刷新页面可能会存在明显的转换,所以下面对前端页面进行优化。

    首先 在 store 目录下的 user.js 中添加全局变量和下拉函数。

    1. state: {
    2. id: "",
    3. username: "",
    4. password: "",
    5. photo: "",
    6. token: "",
    7. is_login: false,
    8. pulling_info: true, //是否正在拉取信息
    9. },
    10. mutations: {
    11. updateUser(state, user) {
    12. state.id = user.id;
    13. state.username = user.username;
    14. state.photo = user.photo;
    15. state.is_login = user.is_login;
    16. },
    17. updateToken(state, token) {
    18. state.token = token;
    19. },
    20. logout(state) {
    21. state.id = "";
    22. state.username = "";
    23. state.photo = "";
    24. state.token = "";
    25. state.is_login = false;
    26. },
    27. updatePullingInfo(state, pulling_info) {
    28. state.pulling_info = pulling_info;
    29. }
    30. },

    在这里插入图片描述

     其次 修改 UserAccountLoginView.vue

    1. <template>
    2. <ContentField v-if="!$store.state.user.pulling_info">
    3. <div class="row justify-content-md-center">
    4. <div class="col-3">
    5. <form @submit.prevent="login">
    6. <div class="mb-3">
    7. <label for="username" class="form-label">用户名label>
    8. <input v-model="username" type="text" class="form-control" id="username" placeholder="请输入用户名">
    9. div>
    10. <div class="mb-3">
    11. <label for="password" class="form-label">密码label>
    12. <input v-model="password" type="password" class="form-control" id="password" placeholder="请输入密码">
    13. div>
    14. <div class="error-message">{{ error_message }}div>
    15. <button type="submit" class="btn btn-primary">提交button>
    16. form>
    17. div>
    18. div>
    19. ContentField>
    20. template>
    21. <script>
    22. setup() {
    23. const store = useStore();
    24. let username = ref('');
    25. let password = ref('');
    26. let error_message = ref('');
    27. const jwt_token = localStorage.getItem("jwt_token");
    28. if (jwt_token) {
    29. store.commit("updateToken", jwt_token);
    30. store.dispatch("getinfo", {
    31. success() {
    32. router.push({ name: "home" });
    33. store.commit("updatePullingInfo", false);
    34. },
    35. error() {
    36. store.commit("updatePullingInfo", false);
    37. }
    38. })
    39. }else {
    40. store.commit("updatePullingInfo", false);
    41. }
    42. }
    43. script>

    在这里插入图片描述

     在这里插入图片描述

     最后还需要修改 NavBar.vue。

    1. <ul class="navbar-nav" v-else-if="!$store.state.user.pulling_info">
    2. <li class="nav-item">
    3. <router-link class="nav-link" :to="{name: 'user_account_login' }" role="button">
    4. 登录
    5. router-link>
    6. li>
    7. <li class="nav-item">
    8. <router-link class="nav-link" :to="{name: 'user_account_register'}" role="button">
    9. 注册
    10. router-link>
    11. li>
    12. ul>

    在这里插入图片描述

    记得 git 维护~ 

     

  • 相关阅读:
    go 通过hash,查币安链交易代码
    风景区服务热线系统:智能化时代的旅游新选择
    C# ref用法,实现引用传递(地址传递)
    深度估计论文梳理
    服务器配置Java开发环境(三)之安装mysql
    大一新生HTML期末作业 个人旅游图片博客HTML5 用DIV+CSS技术设计的个人网站(web前端网页制作课作业)
    【经验之谈·高频PCB电路设计常见的66个问题】
    合成孔径雷达干涉测量InSAR数据处理、地形三维重建、形变信息提取、监测等应用
    verilog 并行块实现
    Redis源码篇(7)——哨兵模式
  • 原文地址:https://blog.csdn.net/qq_59539549/article/details/127873357