【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(3)路由导航卫士、主页实现

项目笔记为项目总结笔记,若有错误欢迎指出哟~

【项目专栏】
【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(1)spring boot项目搭建、vue项目搭建、微信小程序项目搭建
【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(2)后端跨域、登录模块、springboot分层架构、IDEA修改快捷键、vue代码风格
【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(3)路由导航卫士、主页实现

【java+vue+微信小程序项目】从零开始搭建——健身房管理平台

  • 路由导航守卫
    • 全局前置守卫
  • 主页实现
    • 界面设计
    • 主页前端
    • 菜单路径存储在mysql数据库
    • 菜单栏前端
    • 菜单栏后端
      • 1.数据访问层
        • (1)子菜单实体SubMenu.java
        • (2)主菜单实体MainMenu.java
        • (3)MenuDao.java
        • (4)MenuMapper.xml
      • 2.业务逻辑层
        • (1)MenuService.java
        • (2)MenuServiceImpl.java
      • 3.表现层
        • (1)MenuController.java
    • 菜单栏前端添加图标
      • 1.修改Home.vue(template标签)
      • 2.修改Home.vue(script标签)
    • 主页前端子页面(默认页面)
      • 1.新建Welcome.vue
      • 2.修改Home.vue
      • 3.修改路由
    • 主页前端子页面(其他页面)
      • 1.新建组件
        • UserList.vue
        • CoachList.vue
        • CourseList.vue
        • PrivateList.vue
        • CalorieList.vue
        • NoticeList.vue
        • DietList.vue
        • ExerciseList.vue
      • 2.修改路由

路由导航守卫

路由导航守卫(Route Navigation Guards)是 Vue Router 提供的一种机制,用于在路由切换时进行一些逻辑控制和操作。

路由导航守卫分为三种:

  1. 全局前置守卫:router.beforeEach
    在路由切换开始前进行的一些验证、拦截或处理,如用户权限验证、登录状态判断、页面跳转等。
  2. 全局后置守卫:router.afterEach
    在路由切换完成后进行的一些操作,如页面统计、数据收集、动画效果等。
  3. 组件内守卫:beforeRouteEnterbeforeRouteUpdatebeforeRouteLeave
    在组件内部定义的守卫,可以通过这些守卫来进行组件级别的验证与处理。

使用路由导航守卫,可以方便地控制用户访问页面的权限,并且在路由切换时执行一些必要的操作,增强应用程序的稳定性和用户体验。

全局前置守卫

router——>index.js

const router = new VueRouter({
   
  routes,
});

// 挂载路由导航守卫
router.beforeEach((to, from, next) => {
   
  if (to.path == '/login') return next();
  // 获取user
  const userFlag = window.sessionStorage.getItem("user");
  if (!userFlag) return next('/login');
  next(); 
})
// 出现问题的时候使用
const originalPush = VueRouter.prototype.push
VueRouter.prototype.push = function push(location, onResolve, onReject) {
   
  if (onResolve || onReject) return originalPush.call(this, location, onResolve, onReject)
  return originalPush.call(this, location).catch(err => err)
}

export default router;
  1. router.beforeEach 方法用于注册一个全局前置守卫,会在路由切换前进行验证。当用户尝试访问任何路径时,都会先执行这个函数。
  2. beforeEach 函数中,判断即将访问的路径是否为 /login,如果是,则直接放行,不进行后续验证。
  3. 通过 window.sessionStorage.getItem("user") 获取当前用户信息。如果不存在用户信息,说明用户未登录,强制跳转到登录页。
  4. 如果存在用户信息,表示用户已登录,直接放行。
  5. 下面的代码是对 Vue Router 的 push 方法进行了一些处理,以解决编程式导航时可能出现的问题,例如没有捕获到错误导致的报错。
    这段代码是对 Vue Router 的 push 方法进行了一些处理,主要是为了解决在编程式导航时可能出现的问题。
  • 首先,通过 const originalPush = VueRouter.prototype.push 将原始的 push 方法保存到 originalPush 变量中,以便后续调用。

  • 然后,重新定义了 VueRouter.prototype.push 方法。此时,当我们在代码中使用 router.push() 进行页面跳转时,实际上会执行重新定义后的方法。

  • 在重新定义的方法中,首先判断了两个参数 onResolveonReject 是否存在。这两个参数通常在使用 Promise API 时才会传入,用于处理异步操作的回调。

    • 如果 onResolveonReject 存在,说明是使用了 Promise API,并且传入了相应的回调函数。则直接调用原始的 push 方法,并将参数传递过去,同时返回其返回值(Promise)。
    • 如果 onResolveonReject 都不存在,则说明没有传入回调函数,此时调用原始的 push 方法,并使用 .catch(err => err) 捕获可能的错误,以避免出现未捕获的异常错误。

    这样做的目的是为了确保在编程式导航时能够正常捕获错误。如果在路由跳转过程中发生了错误,通过这段代码的处理,程序不会抛出异常,而是将错误信息返回给调用者,避免导致程序崩溃。

主页实现

界面设计

在这里插入图片描述
实现:
在这里插入图片描述

主页前端

element-ui Layout 布局:https://element.eleme.cn/#/zh-CN/component/layout

components——>Home.vue

<template>
  <!-- 引入container布局 -->
  <el-container class="home-container">
    <!-- 头部 -->
    <el-header>
      <div>
        <img src="../assets/logo.jpg" alt class="logo_img" />
        <span>Power健身房管理平台</span>
      </div>
      <el-button type="info" @click="logout">安全退出</el-button>
    </el-header>
    <!-- 主体 -->
    <el-container>
      <!-- 侧边栏 -->
      <el-aside width="200px">
        
      </el-aside>
      <!-- 主体内容 -->
      <el-main>
        
      </el-main>
    </el-container>
  </el-container>
</template>
  
<script>
</script>
  
  
<style lang="less" scoped>
.home-container {
     
  height: 100%;
}

// 头部样式
.el-header {
     
  background-color: #373d41;
  display: flex;
  justify-content: space-between; // 左右贴边
  padding-left: 0%; // 左边界
  align-items: center; // 水平
  color: #fff;
  font-size: 20px;
  > div {
     
    //左侧div加布局
    display: flex;
    align-items: center;
    span {
     
      margin-left: 15px;
    }
  }
}
// 侧边栏样式
.el-aside {
     
  background-color: #333744;
  .el-menu {
     
    border-right: none;
  }
}
// 主体样式
.el-main {
     
  background-color: #eaedf1;
}

.logo_img {
     
  width: 55px;
  height: 55px;
  border-radius: 50%; // 加圆角
}

//按钮样式
.toggle-button {
     
  background-color: #4a5064;
  font-size: 10px;
  line-height: 24px;
  color: #fff;
  text-align: center;
  letter-spacing: 0.2em;
  cursor: pointer; // 显示鼠标指针为:小手
}
</style>

在这里插入图片描述

菜单路径存储在mysql数据库

drop table if exists mainmenu;
-- 主菜单表
create table mainmenu(
	id bigint(20) not null primary key comment '主键',
	title varchar(100) comment '菜单名称',
	path varchar(100) comment '菜单路径'
);

drop table if exists submenu;
-- 子菜单表
create table submenu(
	id bigint(20) not null primary key comment '主键',
	title varchar(100) comment '菜单名称',
	path varchar(100) comment '菜单路径',
	mid bigint(20) comment '主菜单id',
	foreign key (mid) references fitness_center.mainmenu(id)
);

在这里插入图片描述

-- 主菜单
insert into mainmenu values(100,'业务管理','/admin');
insert into mainmenu values(200,'资讯管理','/use');

-- 子菜单
insert into submenu values(101,'用户列表','/user',100);
insert into submenu values(102,'教练列表','/coach',100);
insert into submenu values(103,'课程列表','/course',100);
insert into submenu values(104,'私教预约列表','/private',100);
insert into submenu values(201,'通知公告','/notice',200);
insert into submenu values(202,'卡路里','/calorie',200);
insert into submenu values(203,'饮食记录','/diet',200);
insert into submenu values(204,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/213764.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode | 101. 对称二叉树

LeetCode | 101. 对称二叉树 OJ链接 在本函数里不好进行判断&#xff0c;我们另外定义一个函数来如果两个都相等为空&#xff0c;就返回true一个为空&#xff0c;一个不为空都不为空,就比较值然后递归1的左&#xff0c;2的右&#xff0c;1的右&#xff0c;2的左 bool _isSymm…

Gateway网关--java

网关是建立于请求到服务之前的,可以用网关限制访问量,添加过滤等 创建网关模块,引入相关pome依赖 配置yml 具体相关的作用可以参考 Spring Cloud Gateway 这样就可以了 基础的网关配置,我们的实现效果 我们可以通过10010端口访问,通过转发到nacos,再找到相应的模块,实现…

54.多级缓存

目录 一、传统缓存的问题、多级缓存方案。 二、JVM进程缓存。 1&#xff09;进程缓存和缓存。 2&#xff09;导入商品案例。 1.安装MySQL 2.导入SQL 3.导入Demo工程 4.导入商品查询页面 3&#xff09;初识Caffeine&#xff08;就是在springboot学过的注解方式的cache&…

掌握视频剪辑技巧:批量置入视频封面,提升视频品质

在当今数字化时代&#xff0c;视频已成为生活的重要组成部分。无论是观看电影、电视剧、综艺节目&#xff0c;还是分享个人生活、工作成果&#xff0c;视频都以其独特的魅力吸引着大众的视线。视频封面是视频内容的缩影&#xff0c;是观众对视频的第一印象。一个好的封面能吸引…

【计算机组成原理】存储器知识

目录 1、存储器分类 1.1、按存储介质分类 1.2、按存取方式分类 1.3、按信息的可改写性分类 1.4、按信息的可保存性分类 1.5、按功能和存取速度分类 2、存储器技术指标 2.1、存储容量 2.2、存取速度 3、存储系统层次结构 4、主存的基本结构 5、主存中数据的存放 5.…

LabVIEW远程监控

LabVIEW远程监控 远程监控的应用场景 从办公室远程监控工厂车间的测试设备。 在世界另一端的偏远地区监控客户现场的发电设备。 从公司远程监控外场的产品。 技术更新与方法 自2018年以来&#xff0c;NI对基于Web的应用程序支持大幅增长。一些最初的方法&#xff08;如Lab…

搭建CIG容器重量级监控平台

CIG简介 CIG监控平台是基于CAdvisor、InfluxDB和Granfana构建的一个容器重量级监控系统&#xff0c;用于监控容器的各项性能指标&#xff0c;通过三者的结合&#xff0c;CIG监控平台可以实现对容器性能的全面监控和可视化展示&#xff0c;为容器的性能和运行状态提供了一个全面…

React如何检查组件性能

可以使用Profiler来查看组件的渲染速度 Profiler的基本使用 需要将<Profiler>标签包裹在需要检查渲染速度的组件外部需要绑定id属性&#xff0c;该属性是唯一标识&#xff0c;用于区分其他Profiler需要onRender函数&#xff0c;该函数一共有六个参数&#xff0c;分别为…

数据结构入门————树(C语言/零基础/小白/新手+模拟实现+例题讲解)

目录 1. 树的概念及其结构 1.1 树的概念&#xff1a; 1.2 树的相关概念&#xff1a; 1.3 树的表示方法&#xff1a; ​编辑 1.4 树的应用&#xff1a; 2. 二叉树的概念及其结构 2.1 概念: 2.2 特点&#xff1a; 2.3 特殊二叉树&#xff1a; 2.4 二叉树的性质&#xf…

【文献阅读笔记】基于自监督的异常检测和定位:SSM

2022 IEEE TRANSACTIONS ON MULTIMEDIA 领域&#xff1a;异常检测 目标&#xff1a;图像输入数据 文章目录 1、模型2、方法2.1、random masking2.2、restoration network2.3、损失函数2.4、推理时的渐进细化 3、实验4、引用5、想法 1、模型 训练&#xff1a; 每个图像实时生成随…

MySQL索引优化实战二

分页查询优化 很多时候我们业务中实现分页功能时可能会用如下SQL来实现&#xff1a; select * from employees LIMIT 10000,10表示从表中中区从10001行开始的10行记录&#xff0c;看似只查了10条记录&#xff0c;但是这条SQL是先读取10010条记录&#xff0c;然后抛弃前10000条…

[MySQL]日期和时间函数

文章目录 1 获取日期、时间 CURDATE() &#xff0c;CURRENT_DATE()CURTIME() &#xff0c; CURRENT_TIME()NOW() / SYSDATE() / CURRENT_TIMESTAMP() / LOCALTIME() / LOCALTIMESTAMP()UTC_DATE()UTC_TIME()代码示例2 日期与时间戳的转换 UNIX_TIMESTAMP()UNIX_TIMESTAMP(date)…

ArcGIS制作某村土地利用现状图

1. 根据坐落单位名称属性选择并提取作图数据 (1) 将“作图线状地物”、“作图图班”和“村庄”图层加入ARCGIS&#xff08;右键Layers-Add data&#xff09;&#xff0c;选择相应路径下的文件加载即可。 (2) 按属性来提取作图村庄的地类图班、线状地物和村界文件&#xff08;…

Flutter PK jetpack compose区别和选择

Flutter诞生于Chrome团队&#xff0c;是一帮做Web的开发做的跨平台框架&#xff0c;从最开始的设计初衷&#xff0c;就是指向了跨平台这条路&#xff0c;而Compose&#xff0c;则是诞生于Android团队&#xff0c;是为了解决当前View的架构体系不能再继续适应申明式编程的范式而…

【BLE基础知识】--Slave latency设置流程及空中包解析

1、Slave latency基本概念 当BLE从设备对耗电量要求较高时&#xff0c;若需要节省耗电量&#xff0c;则可以通过设置Slave Latency参数来减少BLE从设备的耗电。 Slave Latency&#xff1a;允许Slave&#xff08;从设备&#xff09;在没有数据要发的情况下&#xff0c;跳过一定…

SCAU:分期还款(加强版)

分期还款(加强版) Time Limit:1000MS Memory Limit:65535K 题型: 编程题 语言: G;GCC;VC 描述 从银行贷款金额为d&#xff0c;准备每月还款额为p&#xff0c;月利率为r。请编写程序输入这三个数值&#xff0c;计算并输出多少个月能够还清贷款&#xff0c;输出时保留1位小…

【iOS控件】—— UIPickerView的使用

【iOS控件】—— UIPickerView的使用 一. 简述UIPickerView1. 什么是UIPickerView2. UIPickerView遵守的协议 二. 测试Demo三. 总结 一. 简述UIPickerView 先看一下UIPickerView的效果图&#xff1a; 1. 什么是UIPickerView UIPickerView是iOS平台上的一个用户界面元素&am…

百马百担c语言编程

以下是一个百马百担问题的C语言编程实现&#xff1a; #include <stdio.h>int main() { int n, m, k; scanf("%d%d%d", &n, &m, &k); int a[n], b[m], c[k]; for (int i 0; i < n; i) { scanf("%d", &a[i]);…

CSS——复合选择器、CSS特性、背景属性、显示模式

1、复合选择器 复合选择器&#xff1a;由两个或多个基础选择器&#xff0c;通过不同的方式组合而成。 作用&#xff1a;更准确、更高效的选择目标元素&#xff08;标签&#xff09; 1.1 后代选择器 后代选择器&#xff1a;选中某元素的后代元素 选择器写法&#xff1a;父选…