返回

从零开始,带你玩转前端RBAC权限管理

前端

引言

在现代化应用中,RBAC权限管理是必不可少的一环。它能够帮助我们灵活地控制不同用户对不同功能的访问权限,从而保护数据的安全和隐私。在本指南中,我们将从头开始构建一个完整的RBAC权限管理系统,帮助您轻松管理用户权限、角色管理,以及数据权限,打造一个更加安全可靠的前端应用。

前提知识

在开始构建RBAC权限管理系统之前,您需要具备以下知识:

  • HTML和CSS的基础知识
  • JavaScript的基础知识
  • React或Vue等前端框架的基础知识
  • Node.js的基础知识
  • MySQL或PostgreSQL等数据库的基础知识

系统架构

我们的RBAC权限管理系统将由以下几个部分组成:

  • 前端:负责用户界面的展示和交互
  • 后端:负责数据的存储和处理
  • 数据库:负责数据的持久化存储

前端开发

前端部分将使用React框架来构建。我们将使用React Router来管理路由,并使用Redux来管理状态。

路由配置

在index.js中,我们将配置路由:

import React from "react";
import { Router, Route } from "react-router-dom";
import history from "./history";

import Login from "./pages/Login";
import Home from "./pages/Home";
import UserManagement from "./pages/UserManagement";
import RoleManagement from "./pages/RoleManagement";
import DataPermission from "./pages/DataPermission";

const App = () => {
  return (
    <Router history={history}>
      <Route exact path="/" component={Login} />
      <Route path="/home" component={Home} />
      <Route path="/user-management" component={UserManagement} />
      <Route path="/role-management" component={RoleManagement} />
      <Route path="/data-permission" component={DataPermission} />
    </Router>
  );
};

export default App;

状态管理

在store.js中,我们将使用Redux来管理状态:

import { createStore, applyMiddleware } from "redux";
import thunk from "redux-thunk";

const initialState = {
  user: null,
  roles: [],
  permissions: [],
  data: []
};

const reducer = (state = initialState, action) => {
  switch (action.type) {
    case "SET_USER":
      return { ...state, user: action.payload };
    case "SET_ROLES":
      return { ...state, roles: action.payload };
    case "SET_PERMISSIONS":
      return { ...state, permissions: action.payload };
    case "SET_DATA":
      return { ...state, data: action.payload };
    default:
      return state;
  }
};

const store = createStore(reducer, applyMiddleware(thunk));

export default store;

用户界面

在各组件中,我们将使用React组件库来构建用户界面。

import React, { useState } from "react";
import { Form, Input, Button } from "antd";

const Login = () => {
  const [username, setUsername] = useState("");
  const [password, setPassword] = useState("");

  const handleSubmit = () => {
    // 此处省略登录逻辑
  };

  return (
    <Form onFinish={handleSubmit}>
      <Input placeholder="用户名" value={username} onChange={e => setUsername(e.target.value)} />
      <Input placeholder="密码" value={password} onChange={e => setPassword(e.target.value)} />
      <Button type="primary" htmlType="submit">登录</Button>
    </Form>
  );
};

export default Login;

后端开发

后端部分将使用Node.js框架来构建。我们将使用Express框架来构建API,并使用MySQL数据库来存储数据。

API开发

在app.js中,我们将使用Express框架来构建API:

const express = require("express");
const app = express();

app.use(express.json());

// 此处省略API路由配置

app.listen(3000, () => {
  console.log("Server is listening on port 3000");
});

数据库设计

在数据库中,我们将使用以下表结构:

  • users表:存储用户信息
  • roles表:存储角色信息
  • permissions表:存储权限信息
  • user_roles表:存储用户和角色的对应关系
  • role_permissions表:存储角色和权限的对应关系

系统集成

在集成前端和后端时,我们将使用axios库来发送HTTP请求。

import axios from "axios";

const api = axios.create({
  baseURL: "http://localhost:3000/api",
});

export const login = (username, password) => {
  return api.post("/login", { username, password });
};

export const getUserInfo = () => {
  return api.get("/user-info");
};

export const getRoles = () => {
  return api.get("/roles");
};

export const getPermissions = () => {
  return api.get("/permissions");
};

export const getData = () => {
  return api.get("/data");
};

测试

在开发完成后,我们将使用Jest框架来测试系统。

import React from "react";
import { render, fireEvent } from "@testing-library/react";

import Login from "./Login";

describe("Login", () => {
  it("should render correctly", () => {
    const { getByPlaceholderText } = render(<Login />);

    expect(getByPlaceholderText("用户名")).toBeInTheDocument();
    expect(getByPlaceholderText("密码")).toBeInTheDocument();
  });

  it("should submit the form", () => {
    const { getByPlaceholderText, getByText } = render(<Login />);

    fireEvent.change(getByPlaceholderText("用户名"), { target: { value: "admin" } });
    fireEvent.change(getByPlaceholderText("密码"), { target: { value: "password" } });
    fireEvent.click(getByText("登录"));

    expect(getByText("欢迎回来,admin!")).toBeInTheDocument();
  });
});

部署

在系统开发完成后,我们将使用Docker来部署系统。

# Dockerfile
FROM node:16

WORKDIR /app

COPY package.json ./

RUN npm install

COPY . ./

CMD ["node", "app.js"]
# docker-compose.yml
version: "3.7"

services:
  app:
    build: .
    ports:
      - "3000:3000"

总结

在本指南中,我们从头开始构建了一个完整的RBAC权限管理系统。我们介绍了系统架构、前端开发、后端开发、系统集成、测试和部署等各个方面的知识。希望本指南能够帮助您快速构建自己的权限管理系统。