当前位置: 首页 > news >正文

Spring Boot + Vue 多级目录的构建详解

1. 背景介绍

1.1 为何选择 Spring Boot + Vue?

在现代 Web 开发中,前后端分离已成为一种标准实践。Spring Boot 提供了强大的后端开发能力,尤其在构建企业级应用时,其轻量级、高效性和丰富的生态系统让开发者如虎添翼。而 Vue.js 则以其简单易学的语法和灵活的组件系统,成为前端开发的热门选择。结合这两个技术栈,我们可以轻松实现复杂的业务逻辑与优秀的用户体验。

1.2 多级目录的应用场景

多级目录广泛应用于后台管理系统、权限管理系统等场景。通过多级目录,用户可以层层递进地访问各个功能模块。想象一下,一个只有一级菜单的管理系统将多么混乱和不可维护,因此,多级目录的设计与实现显得尤为重要。

2. 数据库设计

2.1 数据库表结构设计

在设计多级目录时,数据库的表结构是整个系统的基础。我们需要为目录和菜单设计合理的数据表,以支持树状结构和层级关系。典型的表结构包括 menu 表,用于存储菜单的基本信息和层级关系。

Menu 表设计
CREATE TABLE menu (id BIGINT AUTO_INCREMENT PRIMARY KEY,parent_id BIGINT,  -- 父级菜单的 IDname VARCHAR(100) NOT NULL,  -- 菜单名称url VARCHAR(255),  -- 菜单链接icon VARCHAR(50),  -- 菜单图标order_num INT,  -- 菜单排序level INT,  -- 菜单层级permission VARCHAR(255),  -- 关联的权限标识create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,  -- 创建时间update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP  -- 更新时间
);

在这个表结构中,parent_id 字段用于表示父级菜单,level 字段表示菜单的层级,通过这两个字段,我们可以轻松地实现树状结构。

2.2 多级目录数据的存储方案

为了实现多级目录,我们需要设计一个递归的结构。通过 parent_id 字段,我们可以为每个菜单项指定父级菜单,实现树形结构的存储。这种设计在查询时可能稍显复杂,但在实际应用中能够很好地支持多级目录的展示。

2.3 菜单与权限的关系设计

在实际项目中,菜单往往与权限系统挂钩。我们可以在 menu 表中增加一个 permission 字段,用于存储与该菜单关联的权限标识。这样,我们可以根据用户的权限动态生成菜单,确保用户只能看到自己有权限访问的部分。

3. 后端实现

3.1 Spring Boot 项目结构

在 Spring Boot 项目中,我们通常按照功能模块进行划分。在多级目录的实现中,我们可以创建 menu 模块来专门处理菜单相关的逻辑。项目结构如下:

src
├── main
│   ├── java
│   │   └── com
│   │       └── example
│   │           └── project
│   │               ├── controller  # 控制器层
│   │               ├── service  # 服务层
│   │               ├── repository  # 数据访问层
│   │               └── entity  # 实体类
│   └── resources
│       └── application.yml  # 配置文件

3.2 JPA 实现多级目录的数据操作

在数据访问层,我们使用 JPA 来操作数据库表。为了实现多级目录,我们可以通过递归查询来获取菜单的层级结构。以下是一个简单的 JPA 实现示例:

Menu 实体类
@Entity
@Table(name = "menu")
public class Menu {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(name = "parent_id")private Long parentId;private String name;private String url;private String icon;private Integer orderNum;private Integer level;private String permission;// Getters and Setters
}
MenuRepository 接口
@Repository
public interface MenuRepository extends JpaRepository<Menu, Long> {List<Menu> findByParentId(Long parentId);@Query("SELECT m FROM Menu m WHERE m.permission IN :permissions")List<Menu> findByPermissions(@Param("permissions") List<String> permissions);
}

通过 findByParentId 方法,我们可以递归地查询子菜单,构建完整的目录结构。

3.3 权限管理与目录访问控制

在权限管理中,我们可以通过 permission 字段与用户的权限进行匹配。在实际应用中,可以通过拦截器或注解的方式来控制用户对不同菜单项的访问。以下是一个简单的权限控制实现:

权限拦截器
@Component
public class PermissionInterceptor extends HandlerInterceptorAdapter {@Autowiredprivate MenuRepository menuRepository;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String userId = request.getHeader("UserId");// 获取用户权限List<String> userPermissions = getUserPermissions(userId);// 获取请求路径对应的菜单权限String requestUri = request.getRequestURI();Menu menu = menuRepository.findByUrl(requestUri);if (menu != null && !userPermissions.contains(menu.getPermission())) {response.sendError(HttpServletResponse.SC_FORBIDDEN);return false;}return true;}private List<String> getUserPermissions(String userId) {// 假设从数据库或缓存中获取用户权限return Arrays.asList("MENU_READ", "MENU_WRITE");}
}

4. 前端实现

4.1 Vue 路由与组件设计

在 Vue 中,多级目录的实现主要通过 Vue Router 进行。我们可以利用嵌套路由来实现层级结构,同时通过动态加载路由来提高应用性能。

路由配置示例
const routes = [{path: '/dashboard',component: Dashboard,children: [{path: 'analytics',component: Analytics,},{path: 'reports',component: Reports,},],},
];

4.2 动态菜单生成

为了根据用户权限动态生成菜单,我们需要在 Vuex 中存储用户权限信息,并结合路由配置生成菜单树。以下是一个简单的 Vuex 生成菜单的例子:

export const generateMenu = (routes, permissions) => {const menu = routes.filter(route => {if (route.children) {route.children = generateMenu(route.children, permissions);}return permissions.includes(route.name);});return menu;
};

4.3 用户权限与菜单展示

在前端,我们可以通过 Vue Router 的导航守卫来检查用户的权限,并根据权限动态生成菜单。例如,可以在路由守卫中根据用户权限动态

加载可访问的路由。

5. 前后端联动

5.1 API 设计与数据交互

前后端的联动主要通过 API 实现。在设计 API 时,我们可以通过一个统一的接口来获取用户的菜单数据和权限信息,从而在前端生成动态菜单。

API 示例
@RestController
@RequestMapping("/api/menu")
public class MenuController {@Autowiredprivate MenuService menuService;@GetMapping("/user-menus")public List<Menu> getUserMenus() {String userId = SecurityContextHolder.getContext().getAuthentication().getName();return menuService.getUserMenus(userId);}
}

5.2 JWT 认证与权限校验

为了确保安全性,我们通常会在 API 调用中加入 JWT 认证。在 Spring Boot 中,可以通过配置 JwtTokenFilter 来实现对请求的拦截和权限校验。

JwtTokenFilter 示例
public class JwtTokenFilter extends OncePerRequestFilter {@Autowiredprivate JwtTokenProvider jwtTokenProvider;@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {String token = jwtTokenProvider.resolveToken(request);if (token != null && jwtTokenProvider.validateToken(token)) {Authentication auth = jwtTokenProvider.getAuthentication(token);SecurityContextHolder.getContext().setAuthentication(auth);}filterChain.doFilter(request, response);}
}

5.3 前后端数据一致性

为了保证前后端的数据一致性,我们需要在后端保证菜单数据和权限数据的同步更新,同时在前端根据用户权限动态加载菜单。

6. 总结与反思

一个成功的多级目录系统的实现不仅依赖于技术上的解决方案,还需要在系统设计、性能优化和用户体验之间取得平衡。希望本文的内容能为你在项目开发中提供一些有益的参考和启示。

相关文章:

Spring Boot + Vue 多级目录的构建详解

1. 背景介绍 1.1 为何选择 Spring Boot Vue&#xff1f; 在现代 Web 开发中&#xff0c;前后端分离已成为一种标准实践。Spring Boot 提供了强大的后端开发能力&#xff0c;尤其在构建企业级应用时&#xff0c;其轻量级、高效性和丰富的生态系统让开发者如虎添翼。而 Vue.js…...

Android的Launch

看了一下资料&#xff0c;其实差别并不像一般的bootloader之类那么大。基本上还是和普通的APK程序差不多&#xff0c;基本上是AMS启动的第一个带界面的程序&#xff0c;这个界面也是常规的开发模式。可以设置各种view&#xff0c;可以设置背景。 然后在这个程序中&#xff0c;…...

Deep Ocr

1.圈出内容,文本那里要有内容.然后你保存,并导出数据集. 2.找出deep_ocr_recognition_training_workflow.hdev 文件.修改“DatasetFilename : Test.hdict” 310行 write_deep_ocr (DeepOcrHandle, BestModelDeepOCRFilename) 3.推理test.hdev 但发现很慢&#xff0c;没有mlp…...

图片验证码

导入依赖 <dependencies><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.25</version></dependency> </dependencies> 代码 Service public class ValidateCodeServi…...

004: VTK读入数据---vtkImageData详细说明

VTK医学图像处理---vtkImageData类 目录 VTK医学图像处理---vtkImageData类 简介&#xff1a; 1 Mricro软件的安装和使用 (1) Mricro安装 (2) Mricro转换DICOM为裸数据 2 从硬盘读取数据到vtkImageData 3 vtkImageData转RGB或RGBA格式 4 练习 总结 简介&#xff1a;…...

分割千万级,将大文件分割为小件 csv

依赖 <dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.9.0</version></dependency> package com.topnet.controller;import com.topnet.utils.R; import lombok.extern.slf4j.Slf4…...

SQL COUNT() 函数深入解析

SQL COUNT() 函数深入解析 SQL&#xff08;Structured Query Language&#xff09;是一种用于管理关系数据库管理系统&#xff08;RDBMS&#xff09;的标准编程语言。在SQL中&#xff0c;COUNT() 函数是一个常用的聚合函数&#xff0c;用于计算数据表中的行数或特定列的值数量…...

vue3和vue2的双向绑定原理

Vue 的双向绑定是其核心特性之一&#xff0c;允许数据和视图之间保持同步。在 Vue 2 和 Vue 3 中&#xff0c;双向绑定的实现原理有所不同。以下是两者的原理对比&#xff1a; Vue 2 的双向绑定原理 在 Vue 2 中&#xff0c;双向绑定是通过以下机制实现的&#xff1a; 响应式…...

[C++]刷题

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;C 创作时间 &#xff1a;2024年6月20日 最后&#xff1a; 十分感谢你可以耐着性子把它读完和我可以坚持写到这里&#xff0c;送几句话&#xff0c;对你&#xff0c;也对我&#xff1a; 1.一个冷知识&#xff1a; …...

职称评审中,论文发表要求?

无论是医生、教师或其他等职业&#xff0c;职称评审无疑是一个非常重要的环节。而职称评审中的论文发表则是评定我们专业能力的重要一环&#xff0c;可如何才能让自己辛苦撰写的的论文被发表&#xff0c;达到论文发表都有哪些要求呢&#xff1f; 一、选题要新颖 编辑和审稿人…...

连续信号的matlab表示

复习信号与系统以及matlab 在matlab中连续信号使用较小的采样间隔来表四 1.单位阶跃信号 阶跃信号:一个理想的单位阶跃信号在时间 t 0 之前值为0&#xff0c;在 t 0 及之后值突然变为常数 A&#xff08;通常取 A 1&#xff09; %matlab表示连续信号,是让信号的采样间隔很小…...

centos7.9搭建mysql5.6主从

mysql5.6 搭建数据库配置主从 搭建数据库 官网下载软件包后上传 基于centos7.9搭建mysql5.6.42 [rootmysql02 ~]# ls anaconda-ks.cfg init.sh MySQL-5.6.42-1.el7.x86_64.rpm-bundle.tar解压 tar -xf MySQL-5.6.42-1.el7.x86_64.rpm-bundle.tar -C /opt/[rootmysql02 ~]…...

C#通过ACE OLEDB驱动程序访问 Access和 Excel

ACE 代表 Access Connectivity Engine。它是 Microsoft 提供的一组组件&#xff0c;用于访问和操作 Microsoft Access 数据库以及其他类似的文件格式&#xff0c;如 Excel 工作簿。ACE 主要包括以下几部分&#xff1a; ACE OLEDB 驱动程序&#xff1a;用于通过 OLE DB 提供程序…...

智能新纪元:GPT-Next引领的AI革命及其跨领域应用

GPT-Next&#xff1a;性能的百倍提升 在当今这个科技日新月异的时代&#xff0c;人工智能&#xff08;AI&#xff09;无疑是最具活力和变革性的领域之一。最近&#xff0c;OpenAI在KDDI峰会上宣布了一项激动人心的消息&#xff1a;他们即将推出名为“GPT-Next”的新一代语言模…...

Nexus配置npm私服

1&#xff0c;配置npm-hub 2&#xff0c;配置proxy-npm 3&#xff0c;配置group-npm 4&#xff0c;配置local-npm 5&#xff0c;配置淘宝...

《OpenCV计算机视觉》—— 图像轮廓检测与绘制

文章目录 一、轮廓的检测二、轮廓的绘制图像轮廓检测与绘制的代码实现 三、轮廓的近似 一、轮廓的检测 轮廓检测是指在包含目标和背景的数字图像中&#xff0c;忽略背景和目标内部的纹理以及噪声干扰的影响&#xff0c;采用一定的技术和方法来实现目标轮廓提取的过程注意:做轮…...

Spark-Yarn模式如何配置历史服务器

在Spark程序结束之后我们也想看到运行过程怎么办&#xff1f; Yarn模式下&#xff0c;通过以下步骤配置历史服务器即可: mv spark-defaults.conf.template spark-defaults.conf修改spark-default.conf 文件&#xff0c;配置日志存储路径 spark.eventLog.enabled true spark.…...

Maven的安装

一、安装 压缩包解压完的目录如下所示&#xff08;此处为绿色免安装版&#xff09;&#xff1a; &#xff08;其余三个文件是针对Maven版本&#xff0c;第三方软件等简要介绍&#xff09; 二、环境变量 前提&#xff1a; jdk最低版本为JAVA7&#xff08;即jdk17&#xff09…...

iOS——APP启动流程

APP启动 APP启动主要分为两个阶段&#xff1a;pre-main和main之后&#xff0c;而APP的启动优化也主要是在这两个阶段进行的。 main之后的优化&#xff1a;1. 减少不必要的任务&#xff0c;2.必要的任务延迟执行&#xff0c;例如放在控制器界面等等。 APP启动的大致过程&#…...

LLM模型:代码讲解Transformer运行原理

视频讲解、获取源码&#xff1a;LLM模型&#xff1a;代码讲解Transformer运行原理(1)_哔哩哔哩_bilibili 1 训练保存模型文件 2 模型推理 3 推理代码 import torch import tiktoken from wutenglan_model import WutenglanModelimport pyttsx3# 设置设备为CUDA&#xff08;如果…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...

从实验室到产业:IndexTTS 在六大核心场景的落地实践

一、内容创作&#xff1a;重构数字内容生产范式 在短视频创作领域&#xff0c;IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色&#xff0c;生成的 “各位吴彦祖们大家好” 语音相似度达 97%&#xff0c;单条视频播放量突破百万…...

CTF show 数学不及格

拿到题目先查一下壳&#xff0c;看一下信息 发现是一个ELF文件&#xff0c;64位的 ​ 用IDA Pro 64 打开这个文件 ​ 然后点击F5进行伪代码转换 可以看到有五个if判断&#xff0c;第一个argc ! 5这个判断并没有起太大作用&#xff0c;主要是下面四个if判断 ​ 根据题目…...

深入理解 React 样式方案

React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...

当下AI智能硬件方案浅谈

背景&#xff1a; 现在大模型出来以后&#xff0c;打破了常规的机械式的对话&#xff0c;人机对话变得更聪明一点。 对话用到的技术主要是实时音视频&#xff0c;简称为RTC。下游硬件厂商一般都不会去自己开发音视频技术&#xff0c;开发自己的大模型。商用方案多见为字节、百…...

基于小程序老人监护管理系统源码数据库文档

摘 要 近年来&#xff0c;随着我国人口老龄化问题日益严重&#xff0c;独居和居住养老机构的的老年人数量越来越多。而随着老年人数量的逐步增长&#xff0c;随之而来的是日益突出的老年人问题&#xff0c;尤其是老年人的健康问题&#xff0c;尤其是老年人产生健康问题后&…...