从权限表中找到当前用户拥有权限的所有目录节点及其所有父节点,然后根据这些数据生成前端需要的树状结构。
directory 表结构:
CREATE TABLE directory (
id INT PRIMARY KEY,
parent_id INT,
name VARCHAR(255)
);
permissions 表结构:
CREATE TABLE permissions (
id INT PRIMARY KEY,
directory_id INT,
user_id INT
);
当前用户的 user_id 为 :user_id。首先,我们需要递归地找到当前用户拥有权限的所有目录节点及其所有父节点。
WITH RECURSIVE DirectoryTree AS (
-- 获取当前用户有权限的目录节点
SELECT d.id, d.parent_id, d.name
FROM directory d
JOIN permissions p ON d.id = p.directory_id
WHERE p.user_id = :user_id
UNION ALL
-- 递归地获取父节点
SELECT d.id, d.parent_id, d.name
FROM directory d
JOIN DirectoryTree dt ON d.id = dt.parent_id
)
SELECT DISTINCT id, parent_id, name
FROM DirectoryTree;
不需要再建一个表。WITH RECURSIVE 是一个CTE(Common Table
Expression),用于临时生成一个结果集,这个结果集可以在后续的SELECT查询中使用。
下面是完整的SQL查询语句,适用于SQL Server,来获取当前用户拥有权限的所有目录节点及其所有父节点:
-- 定义用户ID
DECLARE @user_id INT = 123; -- 替换成实际的用户ID
-- 递归CTE,找到所有有权限的节点及其父节点
WITH DirectoryTree AS (
-- 获取当前用户有权限的目录节点
SELECT d.id, d.parent_id, d.name
FROM directory d
JOIN permissions p ON d.id = p.directory_id
WHERE p.user_id = @user_id
UNION ALL
-- 递归地获取父节点
SELECT d.id, d.parent_id, d.name
FROM directory d
JOIN DirectoryTree dt ON d.id = dt.parent_id
)
-- 获取去重后的结果
SELECT DISTINCT id, parent_id, name
FROM DirectoryTree;
DECLARE @user_id INT = 123;:定义当前用户的ID,你需要将 123 替换为实际的用户ID。
WITH DirectoryTree AS 定义了一个递归CTE,首先从permissions表中获取当前用户有权限的目录节点。
UNION ALL 用于递归地获取这些目录节点的所有父节点。
最终的 SELECT DISTINCT 去重,得到所有相关的目录节点。
这个查询将返回当前用户有权限的所有目录节点及其所有父节点,你可以根据这些数据生成前端需要的树状结构。
在前端使用 element-ui 的 el-tree 组件时,可以将这个查询结果转换成适合 el-tree 组件的格式。