• 配置Mysql与注册登录模块(下)


    目录

    实现前端的页面授权功能

    实现注册访问后端API

    不输入密码也能注册的bug

    下一步登录状态持久化

    登录页面闪处理+右上角闪处理


    实现前端的页面授权功能

    当我们未登录的时候所有的页面都会重定向到我们的登录页面
    强行让用户登录一下,我们可以在router里面实现
    API意思,to跳转到哪个页面,from表示从哪个页面跳转过去
    next的表示将页面要不要执行下一步操作,写之前首先要记录每一个未授权界面
    把一些额外信息放到一个额外的域里面,meta信息里面存一下是否要授权
    如果需要授权而且没有登录,重定向到登录页面

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

    1. import { createRouter, createWebHistory } from 'vue-router';
    2. import PkIndexView from '@/views/pk/PkIndexView';
    3. import RankListIndexView from '@/views/ranklist/RankListIndexView';
    4. import RecordIndexView from '@/views/record/RecordIndexView';
    5. import UserBotsIndexView from '@/views/user/userbots/UserBotsIndexView';
    6. import UserInfoIndexView from '@/views/user/userinfo/UserInfoIndexView';
    7. import MiNiChatView from '@/views/chat/MiNiChatView';
    8. import NotFound from '@/views/error/NotFound';
    9. import HomeIndexView from '@/views/home/HomeIndexView';
    10. import UserAccountLoginView from '@/views/user/UserAccountLoginView';
    11. import UserAccountRegisterView from '@/views/user/UserAccountRegisterView';
    12. import { from } from 'core-js/core/array';
    13. import store from '@/store';
    14. // 把一些额外信息放到一个额外的域里面,meta信息里面存一下是否要授权,如果需要授权而且没有登录,重定向到登录页面,重定向到登录界面。
    15. const routes = [
    16. {
    17. path: "/",
    18. name: "home",
    19. component: HomeIndexView,
    20. meta:{
    21. requestAuth: true,
    22. }
    23. },
    24. {
    25. path: "/pk/",
    26. name: "pk_index",
    27. component: PkIndexView,
    28. meta:{
    29. requestAuth: true,
    30. }
    31. },
    32. {
    33. path: "/record/",
    34. name: "record_index",
    35. component: RecordIndexView,
    36. meta:{
    37. requestAuth: true,
    38. }
    39. },
    40. {
    41. path: "/ranklist/",
    42. name: "ranklist_index",
    43. component: RankListIndexView,
    44. },
    45. {
    46. path: "/user/bot/",
    47. name: "user_bot_index",
    48. component: UserBotsIndexView,
    49. meta:{
    50. requestAuth: true,
    51. }
    52. },
    53. {
    54. path: "/user/info/",
    55. name: "user_info_index",
    56. component: UserInfoIndexView,
    57. meta:{
    58. requestAuth: true,
    59. }
    60. },
    61. {
    62. path: "/user/login/",
    63. name: "user_account_login",
    64. component: UserAccountLoginView,
    65. meta:{
    66. requestAuth: false,
    67. }
    68. },
    69. {
    70. path: "/user/register/",
    71. name: "user_account_register",
    72. component: UserAccountRegisterView,
    73. meta:{
    74. requestAuth: false,
    75. }
    76. },
    77. {
    78. path: "/user/chat/",
    79. name: "user_chat_index",
    80. component: MiNiChatView,
    81. meta:{
    82. requestAuth: true,
    83. }
    84. },
    85. {
    86. path: "/404/",
    87. name: "404",
    88. component: NotFound,
    89. meta:{
    90. requestAuth: false,
    91. }
    92. },
    93. {
    94. path: "/:catchAll(.*)",
    95. redirect: "/404/",
    96. }
    97. ]
    98. const router = createRouter({
    99. history: createWebHistory(),
    100. routes
    101. })
    102. // to跳转到哪个页面, from表示从哪个页面跳转过去
    103. // next的表示将页面要不要执行下一步操作,写之前首先要记录每一个未授权界面
    104. router.beforeEach((to,from,next) =>{
    105. //如果要跳转的页面需要登录,但是没有登录,就强制到登录界面
    106. if(to.meta.requestAuth && !store.state.user.is_login){
    107. next({name:"user_account_login"});
    108. }else{
    109. next();
    110. }
    111. });
    112. export default router

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

    实现注册访问后端API

    访问公开的链接不需要加表头,其他的都需要,实现注册页面直接把登录页面的样式复制过来再做修改

    如果是export的default就可以不加括号任意取名
    如果export的时候不加default就必须加上大括号
    提交的时候需要触发register函数,需要自己定义一下
    用let const都可以,当变量不会重新赋值用const可能会重新赋值用let
    我们可以把登录的api抄过来,如果是获取数据不用修改数据你就用get
    一般如果会修改数据库的话就用post,安全性post比get强

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

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

    不输入密码也能注册的bug

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

    下一步登录状态持久化

    当我们的用户重定向到登陆页面的时候,我们可以事先判断一下他们有没有将token存在本地
    如果存在本地就把token取出来,验证一下是否过期
    如果没有过期,用户就不需要重新登陆了,可以直接跳转到首页
    刷新之后其实是一个未登录状态,自动先跳到我们的登录页面
    先从本地把我们的token取出来,发现token存在把token
    更新到我们的内存当中,然后再从云端请求下这个用户的信息
    如果可以请求的信息表示我们的token,是有效的,
    表示用户是登录的,我们就可以跳转到首页

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

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

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

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

    1. const jwt_token = localStorage.getItem("jwt_token");
    2. if(jwt_token){
    3. store.commit("updateToken",jwt_token);
    4. store.dispatch("getinfo",{
    5. success(){
    6. router.push({name:"home"});
    7. store.commit("updatePullingInfo",false);
    8. },
    9. error(){
    10. store.commit("updatePullingInfo",false);
    11. }
    12. })
    13. }else{
    14. store.commit("updatePullingInfo",false);
    15. }

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

    登录页面闪处理+右上角闪处理

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

    1. import $ from 'jquery'
    2. export default{
    3. state:{
    4. id:"",
    5. username:"",
    6. password:"",
    7. photo:"",
    8. token:"",
    9. is_login:false,
    10. pulling_info:true,//是否正在拉取信息
    11. },
    12. getters:{
    13. },
    14. mutations:{//修改state里面的值
    15. updateUser(state,user){
    16. state.id = user.id;
    17. state.username = user.username;
    18. state.photo = user.photo;
    19. state.is_login = user.is_login;
    20. },
    21. updateToken(state,token){
    22. state.token = token;
    23. },
    24. logout(state){
    25. state.id = "",
    26. state.username = "",
    27. state.photo = "",
    28. state.token = "",
    29. state.is_login = false
    30. },
    31. updatePullingInfo(state,pulling_info){
    32. state.pulling_info = pulling_info;
    33. }
    34. },
    35. actions:{
    36. //异步
    37. login(context,data){
    38. // 测试LoginService
    39. $.ajax({
    40. url:"http://127.0.0.1:3000/user/account/token/",
    41. type:"post",
    42. data:{
    43. username:data.username,
    44. password:data.password,
    45. },
    46. success(resp){
    47. if(resp.error_message === "success"){
    48. localStorage.setItem("jwt_token", resp.token);
    49. //调用 mutations里面的函数用commit context上下文调用mutations里面的函数 修改state的内容
    50. context.commit("updateToken",resp.token);
    51. //调用data的成功函数
    52. data.success(resp);
    53. }
    54. },
    55. error(resp){
    56. data.error(resp);
    57. }
    58. });
    59. },
    60. getinfo(context,data){
    61. $.ajax({
    62. url:"http://127.0.0.1:3000/user/account/info/",
    63. type:"get",
    64. headers:{
    65. Authorization:"Bearer "+context.state.token,
    66. },
    67. success(resp){
    68. if(resp.error_message === "success"){
    69. context.commit("updateUser",{
    70. ...resp,
    71. is_login:true,
    72. });
    73. data.success(resp);
    74. }else{
    75. data.error(resp);
    76. }
    77. },
    78. error(resp){
    79. data.error(resp);
    80. }
    81. });
    82. },
    83. logout(context){
    84. localStorage.removeItem("jwt_token");
    85. context.commit("logout");
    86. }
    87. },
    88. modules:{
    89. },
    90. }

    其次 修改 UserAccountLoginView.vue

    最后还需要修改 NavBar.vue。

      • class="navbar-nav" v-else-if="!store.state.user.pulling_info">
    1. <li class="nav-item ">
    2. <router-link class="nav-link " :to="{name:'user_account_login'}" role="button" >
    3. Login
    4. router-link>
    5. li>
    6. <li class="nav-item ">
    7. <router-link class="nav-link " :to="{name:'user_account_register'}" role="button" >
    8. Register
    9. router-link>
    10. li>

完成~

  • 相关阅读:
    自学(网络安全)黑客——高效学习2024
    SSM SpringBoot vue学校办公自动化系统
    安徽省专业技术类职业资格与职称对应表
    HOOPS Commuicator:基于Web的交互式2D/3D图形轻量化引擎
    kafka集群配置
    【例题】逆波兰表达式求值(图解+代码)
    String 创建字符串对象和字符串常量池的联系推理
    最长公共子串LCS
    MySQL性能调优
    认识微服务
  • 原文地址:https://blog.csdn.net/weixin_49884716/article/details/127838660