# grit-admin **Repository Path**: Liangfactory/grit-admin ## Basic Information - **Project Name**: grit-admin - **Description**: 企业级后台管理系统脚手架,基于 Spring Boot 3 + Vue 3 + Ant Design Vue 4 构建。 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: antdesign-soybean - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-09 - **Last Updated**: 2026-08-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Grit Admin Grit Admin 是一套前后端分离的企业级后台管理系统脚手架,后端基于 **Spring Boot 3 + MyBatis-Flex + Sa-Token**,前端基于 **Vue 3 + Vite + Ant Design Vue(SoybeanAdmin 模板)**。系统提供完整的 RBAC 权限、系统配置、日志审计、即时聊天、WebSocket 实时通信、多主题切换、全局水印等能力,适合作为中后台管理系统快速开发底座。 --- ## 目录 - [功能特性](#功能特性) - [技术栈](#技术栈) - [项目结构](#项目结构) - [环境要求](#环境要求) - [快速开始](#快速开始) - [默认账号](#默认账号) - [配置说明](#配置说明) - [功能模块](#功能模块) - [安全机制](#安全机制) - [接口文档](#接口文档) - [开发指南](#开发指南) - [数据库说明](#数据库说明) --- ## 功能特性 ### 系统管理 - **用户管理** — 用户增删改查、分页搜索、分配角色 - **角色管理** — 角色增删改查、分配权限(权限树) - **菜单管理** — 树形菜单管理,支持菜单/按钮/接口三级类型 - **权限字典** — 权限树形展示,权限码管理 - **系统配置** — 14 个分组 Tab(系统、注册、登录、密码、邮件、邮件模板、短信、文件、推送、第三方、支付、安全、小程序、公众号),后端持久化 ### 组织管理 - **部门管理** — 树形部门结构,增删改查 - **岗位管理** — 岗位分页列表,增删改查 ### 监控管理 - **在线用户** — 在线用户列表,支持强制下线 - **定时任务** — 任务 CRUD + 执行/暂停/恢复 - **缓存监控** — Redis/内存缓存统计、缓存列表、清除 - **服务监控** — CPU、内存、JVM、系统信息实时展示 - **SQL 监控** — 实时 SQL 日志查看 - **服务器管理** — 服务器 CPU/内存/磁盘信息 - **API 统计** — API 调用统计表格 ### 消息管理 - **即时聊天** — WebSocket 实时通信,用户列表、未读角标、在线状态 - **系统通知** — 通知公告增删改查,发布/撤回 ### 文件管理 - **文件列表** — 文件上传、下载、删除 ### 开发工具 - **开发工具集** — 代码生成器等工具导航 ### 仪表盘与日志 - **仪表盘** — 用户/角色/日志统计卡片 + ECharts 饼图(角色分布、日志类型分布) - **操作日志** — AOP 自动记录增删改操作,支持类型筛选和清空 - **登录日志** — 登录成功/失败审计 ### 主题与布局 - **暗色/亮色模式** — 一键切换,主题配置实时生效 - **16 种主题色** — 预设色板,可自定义主色调 - **4 种菜单位置** — 左侧、顶部、右侧、底部菜单布局 - **多页签导航** — 页签栏,支持右键菜单(关闭其他/左侧/右侧/全部) - **全局水印** — Canvas 水印覆盖,支持用户名/时间/站点名/自定义文字 ### 开发体验 - **SQL 日志** — MyBatis-Flex 审计机制,控制台彩色输出 + Web 页面实时查看 - **彩色控制台** — SQL 关键字高亮、性能分级着色(< 500ms 绿色 / 500-1000ms 黄色 / > 1000ms 红色) - **登录验证码** — 算术验证码,可在系统配置中开关 --- ## 技术栈 ### 后端(grit-admin) | 类别 | 技术 | 版本 | |------|------|------| | 基础框架 | Spring Boot | 3.2.5 | | 语言 | Java | 17 | | ORM | MyBatis-Flex | 1.9.7 | | 权限认证 | Sa-Token | 1.39.0 | | WebSocket | Spring WebSocket | — | | 密码加密 | Spring Security Crypto (BCrypt) | — | | 数据库 | MySQL | 8.x | | SQL 日志 | MyBatis-Flex Audit | — | | 工具库 | Lombok、Hutool | — | ### 前端(grit-admin-ui-new) | 类别 | 技术 | 版本 | |------|------|------| | 框架 | Vue | 3.4+ | | 构建 | Vite | 5.x | | 语言 | TypeScript | 5.3 | | UI 组件 | Ant Design Vue | 4.x | | CSS | UnoCSS | — | | 状态管理 | Pinia | 2.x | | 路由 | Elegant Router(文件系统自动路由) | — | | HTTP | @sa/axios | — | | 图表 | ECharts | 6.x | | 图标 | Iconify(@iconify/vue) | — | | 国际化 | vue-i18n | — | --- ## 项目结构 ``` grit-admin/ ├── grit-admin/ # 后端 Spring Boot 项目 │ ├── pom.xml │ ├── sql/ # SQL 脚本目录 │ │ ├── init.sql # 数据库初始化脚本 │ │ ├── system_config.sql # 系统配置表 │ │ ├── sms_record.sql # 短信记录表 │ │ ├── job.sql # 定时任务表 │ │ └── notice.sql # 系统通知表 │ └── src/main/java/com/grit/admin/ │ ├── GritAdminApplication.java # 启动类 │ ├── common/ │ │ ├── base/BaseEntity.java # 实体基类(ID/时间/逻辑删除) │ │ ├── config/ │ │ │ ├── SaTokenConfigure.java # Sa-Token 拦截器 + CORS │ │ │ ├── MyBatisFlexConfig.java # MyBatis-Flex 配置 + SQL 审计 │ │ │ ├── DataInitializer.java # 启动数据初始化(菜单/角色/权限) │ │ │ ├── AspectConfig.java # AOP 操作日志自动记录 │ │ │ └── SqlLogCollector.java # SQL 日志收集器 │ │ ├── exception/ # 全局异常处理 │ │ ├── result/ # 统一响应(Result / PageResult) │ │ └── security/ # 权限认证 + 接口加解密 │ ├── controller/ # 控制器层(21 个) │ │ ├── LoginController.java # 登录认证 │ │ ├── DashboardController.java # 仪表盘统计 │ │ ├── MenuController.java # 动态菜单路由 │ │ ├── UserController.java # 用户管理 │ │ ├── RoleController.java # 角色管理 │ │ ├── PermissionController.java # 权限/菜单管理 │ │ ├── DeptController.java # 部门管理 │ │ ├── PostController.java # 岗位管理 │ │ ├── LogController.java # 日志管理 │ │ ├── SqlLogController.java # SQL 日志查询 │ │ ├── SystemConfigController.java # 系统配置 │ │ ├── SmsRecordController.java # 短信测试 │ │ ├── OnlineUserController.java # 在线用户 │ │ ├── ServerInfoController.java # 服务监控 │ │ ├── MachineInfoController.java # 服务器管理 │ │ ├── CacheController.java # 缓存监控 │ │ ├── ApiStatsController.java # API 统计 │ │ ├── JobController.java # 定时任务 │ │ ├── NoticeController.java # 系统通知 │ │ ├── FileController.java # 文件管理 │ │ └── ChatController.java # 即时聊天 │ ├── ws/ # WebSocket 模块 │ │ ├── ChatWebSocketHandler.java # WebSocket 消息处理 │ │ └── WebSocketConfig.java # WebSocket 配置 + 握手拦截 │ ├── entity/ # 数据实体 │ ├── dto/ # 前端传入参数 │ ├── vo/ # 前端返回封装对象 │ ├── mapper/ # MyBatis-Flex Mapper │ └── service/ # 业务服务层 │ ├── grit-admin-ui-new/ # 前端 Vue 3 项目(SoybeanAdmin) │ ├── package.json │ ├── vite.config.ts # Vite 配置(代理 /api、/auth 到 :8080) │ ├── uno.config.ts # UnoCSS 配置 │ ├── src/ │ │ ├── App.vue # 根组件 │ │ ├── main.ts # 入口文件 │ │ ├── service/api/ # API 接口层(22 个模块) │ │ │ ├── auth.ts # 认证 │ │ │ ├── dashboard.ts # 仪表盘 │ │ │ ├── user.ts # 用户管理 │ │ │ ├── role.ts # 角色管理 │ │ │ ├── permission.ts # 权限管理 │ │ │ ├── dept.ts # 部门管理 │ │ │ ├── post.ts # 岗位管理 │ │ │ ├── log.ts # 日志管理 │ │ │ ├── sql-log.ts # SQL 日志 │ │ │ ├── route.ts # 菜单路由 │ │ │ ├── system-config.ts # 系统配置 │ │ │ ├── sms.ts # 短信测试 │ │ │ ├── online-user.ts # 在线用户 │ │ │ ├── server-info.ts # 服务监控 │ │ │ ├── machine-info.ts # 服务器管理 │ │ │ ├── cache.ts # 缓存监控 │ │ │ ├── api-stats.ts # API 统计 │ │ │ ├── job.ts # 定时任务 │ │ │ ├── notice.ts # 系统通知 │ │ │ ├── file.ts # 文件管理 │ │ │ └── chat.ts # 即时聊天 │ │ ├── store/modules/ # Pinia 模块化状态 │ │ │ ├── auth/ # 认证状态 │ │ │ ├── theme/ # 主题状态 │ │ │ ├── route/ # 路由状态(动态菜单) │ │ │ └── tab/ # 页签状态 │ │ ├── router/ # Elegant Router 自动生成 + 守卫 │ │ ├── layouts/ # 布局组件 │ │ │ └── modules/ │ │ │ ├── global-header/ # 顶栏(用户头像、主题切换) │ │ │ ├── global-menu/ # 菜单(侧边栏) │ │ │ ├── global-sider/ # 侧边栏容器 │ │ │ ├── global-tab/ # 多页签导航 │ │ │ ├── global-footer/ # 页脚 │ │ │ └── theme-drawer/ # 主题面板抽屉 │ │ ├── components/ # 公共组件 │ │ ├── views/ # 页面视图(共 28 个页面) │ │ │ ├── _builtin/login/ # 登录页(左右布局 3:1) │ │ │ ├── dashboard/ # 仪表盘(ECharts 图表) │ │ │ ├── system/ # 系统管理 │ │ │ │ ├── user/ # 用户管理 │ │ │ │ ├── role/ # 角色管理 │ │ │ │ ├── menu/ # 菜单管理 │ │ │ │ ├── permission/ # 权限字典 │ │ │ │ └── config/ # 系统配置 │ │ │ ├── org/ # 组织管理 │ │ │ │ ├── dept/ # 部门管理 │ │ │ │ └── post/ # 岗位管理 │ │ │ ├── log/ # 日志管理 │ │ │ │ ├── operation/ # 操作日志 │ │ │ │ └── login/ # 登录日志 │ │ │ ├── monitor/ # 监控管理 │ │ │ │ ├── online/ # 在线用户 │ │ │ │ ├── job/ # 定时任务 │ │ │ │ ├── cache/ # 缓存监控 │ │ │ │ ├── server/ # 服务监控 │ │ │ │ ├── sql/ # SQL 监控 │ │ │ │ ├── machine/ # 服务器管理 │ │ │ │ └── apiStats/ # API 统计 │ │ │ ├── message/ # 消息管理 │ │ │ │ ├── chat/ # 即时聊天(WebSocket) │ │ │ │ └── notice/ # 系统通知 │ │ │ ├── file/list/ # 文件管理 │ │ │ └── devtools/ # 开发工具 │ │ ├── hooks/ # 组合式函数 │ │ ├── theme/ # 主题设置 │ │ └── locales/ # 国际化 │ └── packages/ # pnpm workspace(@sa/* 内部包) │ ├── axios/ # @sa/axios HTTP 客户端 │ ├── hooks/ # @sa/hooks 组合式函数 │ ├── utils/ # @sa/utils 工具库 │ ├── materials/ # @sa/materials 通用组件 │ ├── color/ # @sa/color 颜色工具 │ └── uno-preset/ # @sa/uno-preset UnoCSS 预设 │ └── sql/ └── grit_admin.sql # 完整数据库初始化脚本 ``` --- ## 环境要求 | 依赖 | 版本要求 | |------|----------| | JDK | 17+ | | Maven | 3.6+ | | Node.js | 18+ | | pnpm | 最新稳定版 | | MySQL | 8.0+ | --- ## 快速开始 ### 1. 初始化数据库 `sql/grit_admin.sql` 是纯表结构 + 数据脚本,**不含建库语句**,需先创建数据库并指定导入目标: ```bash # 1. 创建数据库 mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS grit_admin DEFAULT CHARACTER SET utf8mb4;" # 2. 导入脚本(必须指定库名,避免导入到错误数据库) mysql -u root -p grit_admin < sql/grit_admin.sql ``` > 在 Navicat 等客户端导入时,请先选中 `grit_admin` 数据库再运行 SQL 文件。首次启动时 `DataInitializer` 会填充默认权限数据。 ### 2. 启动后端 ```bash cd grit-admin # 开发环境启动(端口 8080) mvn spring-boot:run # 或打包后运行 mvn clean package -DskipTests java -jar target/grit-admin.jar ``` 后端地址:`http://localhost:8080` ### 3. 启动前端 ```bash cd grit-admin-ui-new pnpm install pnpm dev ``` 前端地址:`http://localhost:3050` 开发模式下,Vite 会将 `/api`、`/auth`、`/ws`、`/uploads` 请求代理到 `http://localhost:8080`(内网穿透/跨设备访问时开启代理模式可避免跨域)。 ### 4. 访问系统 打开浏览器访问 `http://localhost:3050`,使用默认账号登录。 --- ## 默认账号 | 账号 | 密码 | 角色 | |------|------|------| | admin | admin123 | 超级管理员(ROOT) | 首次启动时 `DataInitializer` 会自动创建管理员账号和角色、权限等基础数据。 --- ## 配置说明 ### 后端配置 主要配置在 `application.yml`: ```yaml server: port: 8080 # 服务端口 spring: datasource: url: jdbc:mysql://localhost:3306/grit_admin # 数据库连接 username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver mybatis-flex: configuration: map-underscore-to-camel-case: true # 下划线转驼峰 global-config: logic-delete-column: deleted # 逻辑删除字段 logic-delete-value: 1 # 删除标记值 normal-value-of-logic-delete: 0 # 正常值 sa-token: token-name: Authorization # Token 头名称 timeout: 86400 # Token 有效期(秒,24小时) is-concurrent: true # 允许多端同时登录 is-read-cookie: false # 不从 Cookie 读取 Token ``` > 以上为 `application.yml` 中的默认值。若「系统配置 → 安全配置 → Token 配置(Sa-Token)」在数据库 `system_config` 中配置了对应项,后端启动时及保存配置后会自动覆盖此处默认值,**保存后立即生效、无需重启后端**(tokenName 变更会影响当前已登录会话,变更后需重新登录)。 ### 前端配置 主要配置在 `vite.config.ts`: | 配置 | 值 | 说明 | |------|-----|------| | `server.port` | 3050 | 开发服务器端口 | | `proxy./api` | localhost:8080 | API 代理目标 | | `proxy./auth` | localhost:8080 | 认证接口代理 | --- ## 功能模块 ### 系统配置(/system/config) 14 个配置 Tab,所有配置通过 `PUT /api/system-config` 持久化到数据库 `system_config` 表: | Tab | 配置项 | |-----|--------| | 系统配置 | 站点名称、Logo、描述、版权、ICP、水印开关/内容/透明度 | | 注册配置 | 注册开关、邮箱/手机验证、默认角色、审核 | | 登录配置 | 验证码开关与类型、登录重试次数、锁定时间、记住我 | | 密码配置 | 密码长度、大小写/数字/特殊字符要求、过期天数 | | 邮件配置 | SMTP 服务器、端口、用户名、密码、SSL、测试发送 | | 邮件模板 | 验证码/重置密码/欢迎邮件模板 | | 短信配置 | 阿里云/腾讯云/华为云、AccessKey、签名、模板 ID、测试发送 | | 文件配置 | 本地/OSS/COS/七牛云、大小限制、文件类型、存储路径 | | 推送配置 | 飞书/钉钉/企业微信 Webhook | | 第三方配置 | 微信/支付宝/GitHub OAuth | | 支付配置 | 微信支付/支付宝商户密钥与回调 | | 安全配置 | 接口加密/RSA密钥、前端防调试、Sa-Token 参数 | | 小程序配置 | AppID/AppSecret | | 公众号配置 | AppID/AppSecret/Token/AESKey/回调URL/自定义菜单 | ### 即时聊天(/message/chat) - 基于 WebSocket 的实时通信,消息零延迟送达 - 用户列表搜索、在线/离线状态 - 未读消息角标 - 聊天历史记录持久化 - WebSocket 断线自动重连 - Enter 发送、Shift+Enter 换行 - 发送/接收消息气泡样式区分 ### 权限模型 ``` 用户 ──N:M── 角色 ──N:M── 权限(菜单/按钮/接口) ``` - 后端通过 `@SaCheckPermission` 注解控制接口权限 - 前端通过动态菜单路由控制页面可见性 - `StpInterfaceImpl` 在运行时从数据库加载用户角色和权限码 ### 水印 - Canvas 覆盖层,`position: fixed`,全屏显示 - 内容类型:用户名 / 用户名+时间 / 站点名称 / 自定义文字 - 支持透明度调节 - 在根布局中注入,所有登录后页面可见 ### SQL 日志 - 通过 MyBatis-Flex `AuditManager` 审计机制实现 - 控制台彩色输出:SQL 类型着色、关键字高亮、性能分级 - Web 查看:`GET /api/sql-log` 返回最近 200 条 SQL 记录 - 支持复制(反引号已自动去除) --- ## 安全机制 ### 认证 - 基于 Sa-Token 的 Token 认证 - Token 存储在 `localStorage`,请求时通过 Axios 拦截器自动携带 - Token 默认有效期 24 小时 - BCrypt 密码加密(使用 `BCrypt.hashpw` + `BCrypt.gensalt()`) - WebSocket 握手时通过 URL 参数传递 Token 进行身份验证 ### 权限控制 - 后端:`@SaCheckPermission("user:list")` / `@SaCheckRole("ROOT")` 注解 - 前端:路由守卫 + 动态菜单路由 - 首次启动自动初始化 RBAC 数据 ### 接口加解密 - 支持对接口请求体/响应体进行加密传输:开启后前端自动对请求体 AES 加密、解密响应,后端通过 `ApiDecryptFilter` 解密请求、`ApiEncryptResponseBodyAdvice` 加密响应,前后端由 `CryptoJsAesUtil` / `api-encrypt.ts` 配合完成 - AES 密钥由系统配置中的 RSA 公钥派生,支持一键生成 RSA 密钥对并动态更换 - 可在 系统配置 → 安全配置 → 接口加密 中开关、选择加密范围并配置 RSA 密钥 - 行为说明:关闭「接口加密」开关后所有接口(含登录)均明文传输;开启后,登录/注册/验证码等预授权接口始终使用内置默认密钥加密,其余接口按所选范围(全部接口 / 仅敏感接口,敏感范围覆盖登录认证、个人中心、系统安全配置)加密 ### 前端防调试 - 「系统配置 → 安全配置 → 禁止前端调试」开启后,前端会拦截 F12、Ctrl+Shift+I/J/C/K/S、Ctrl+U 快捷键与右键菜单,并周期性检测开发者工具是否打开,检测到时展示全屏阻断提示 - 配置保存在浏览器 `localStorage`,保存后立即生效,跨标签页自动同步 ### 异常处理 统一的全局异常处理: | 异常 | HTTP 状态码 | 响应 | |------|-------------|------| | `NotLoginException` | 401 | "请先登录" | | `NotPermissionException` | 403 | "没有权限访问" | | `NotRoleException` | 403 | "没有该角色权限" | | `BindException` / `MethodArgumentNotValidException` | 400 | 校验失败信息 | | 其他异常 | 500 | 服务器内部错误 | --- ## 接口文档 ### 认证 | 方法 | 路径 | 说明 | 权限 | |------|------|------|------| | POST | `/auth/login` | 登录 | 公开 | | GET | `/auth/info` | 获取当前用户信息 | 登录 | | GET | `/auth/captcha` | 获取验证码 | 公开 | ### 仪表盘 | 方法 | 路径 | 说明 | 权限 | |------|------|------|------| | GET | `/api/dashboard/stats` | 仪表盘统计数据 | 登录 | ### 菜单 | 方法 | 路径 | 说明 | 权限 | |------|------|------|------| | GET | `/api/menu/routes` | 获取当前用户菜单路由 | 登录 | ### 用户管理 | 方法 | 路径 | 说明 | 权限 | |------|------|------|------| | GET | `/api/user/page` | 用户分页列表 | `user:list` | | GET | `/api/user/{id}` | 用户详情 | 登录 | | POST | `/api/user` | 新增用户 | `user:create` | | PUT | `/api/user/{id}` | 更新用户 | `user:update` | | DELETE | `/api/user/{id}` | 删除用户 | `user:delete` | | GET | `/api/user/{id}/roles` | 获取用户角色 | `user:list` | | PUT | `/api/user/{id}/roles` | 分配角色 | `user:update` | ### 角色管理 | 方法 | 路径 | 说明 | 权限 | |------|------|------|------| | GET | `/api/role/page` | 角色分页列表 | `role:list` | | GET | `/api/role/list` | 角色列表(全部) | `role:list` | | GET | `/api/role/{id}` | 角色详情 | 登录 | | POST | `/api/role` | 新增角色 | `role:create` | | PUT | `/api/role/{id}` | 更新角色 | `role:update` | | DELETE | `/api/role/{id}` | 删除角色 | `role:delete` | | GET | `/api/role/{id}/permissions` | 获取角色权限 | `role:list` | | PUT | `/api/role/{id}/permissions` | 分配权限 | `role:update` | ### 权限/菜单管理 | 方法 | 路径 | 说明 | 权限 | |------|------|------|------| | GET | `/api/permission/tree` | 权限树 | `menu:list` | | GET | `/api/permission/list` | 权限列表 | `menu:list` | | GET | `/api/permission/{id}` | 权限详情 | 登录 | | POST | `/api/permission` | 新增权限 | `menu:create` | | PUT | `/api/permission/{id}` | 更新权限 | `menu:update` | | DELETE | `/api/permission/{id}` | 删除权限 | `menu:delete` | ### 部门管理 | 方法 | 路径 | 说明 | 权限 | |------|------|------|------| | GET | `/api/dept/list` | 部门列表(树形) | 登录 | | GET | `/api/dept/{id}` | 部门详情 | 登录 | | POST | `/api/dept` | 新增部门 | 登录 | | PUT | `/api/dept/{id}` | 更新部门 | 登录 | | DELETE | `/api/dept/{id}` | 删除部门 | 登录 | ### 岗位管理 | 方法 | 路径 | 说明 | 权限 | |------|------|------|------| | GET | `/api/post/page` | 岗位分页列表 | 登录 | | GET | `/api/post/{id}` | 岗位详情 | 登录 | | POST | `/api/post` | 新增岗位 | 登录 | | PUT | `/api/post/{id}` | 更新岗位 | 登录 | | DELETE | `/api/post/{id}` | 删除岗位 | 登录 | ### 日志管理 | 方法 | 路径 | 说明 | 权限 | |------|------|------|------| | GET | `/api/log/page` | 操作日志分页 | `log:list` | | GET | `/api/log/login/page` | 登录日志分页 | `log:list` | | DELETE | `/api/log/{id}` | 删除日志 | `log:delete` | | DELETE | `/api/log/clear` | 清空日志 | `log:delete` | ### SQL 日志 | 方法 | 路径 | 说明 | 权限 | |------|------|------|------| | GET | `/api/sql-log` | SQL 日志列表(最近 200 条) | 登录 | | DELETE | `/api/sql-log/clear` | 清空 SQL 日志 | 登录 | ### 系统配置 | 方法 | 路径 | 说明 | 权限 | |------|------|------|------| | GET | `/api/system-config` | 获取所有配置 | 登录 | | PUT | `/api/system-config` | 批量保存配置 | 登录 | ### 短信测试 | 方法 | 路径 | 说明 | 权限 | |------|------|------|------| | POST | `/api/sms/test` | 发送测试短信 | 登录 | | GET | `/api/sms/records` | 发送记录(最近 20 条) | 登录 | ### 在线用户 | 方法 | 路径 | 说明 | 权限 | |------|------|------|------| | GET | `/api/online-user/list` | 在线用户列表 | 登录 | | POST | `/api/online-user/kick/{id}` | 强制下线 | 登录 | ### 服务监控 | 方法 | 路径 | 说明 | 权限 | |------|------|------|------| | GET | `/api/server-info` | 服务器实时信息 | 登录 | ### 服务器管理 | 方法 | 路径 | 说明 | 权限 | |------|------|------|------| | GET | `/api/machine-info` | CPU/内存/磁盘信息 | 登录 | ### 缓存监控 | 方法 | 路径 | 说明 | 权限 | |------|------|------|------| | GET | `/api/cache/stats` | 缓存统计 | 登录 | | GET | `/api/cache/list` | 缓存键列表 | 登录 | | DELETE | `/api/cache/{key}` | 删除指定缓存 | 登录 | | DELETE | `/api/cache/clear` | 清空所有缓存 | 登录 | ### API 统计 | 方法 | 路径 | 说明 | 权限 | |------|------|------|------| | GET | `/api/api-stats/list` | API 调用统计列表 | 登录 | ### 定时任务 | 方法 | 路径 | 说明 | 权限 | |------|------|------|------| | GET | `/api/job/page` | 任务分页列表 | 登录 | | GET | `/api/job/{id}` | 任务详情 | 登录 | | POST | `/api/job` | 新增任务 | 登录 | | PUT | `/api/job/{id}` | 更新任务 | 登录 | | DELETE | `/api/job/{id}` | 删除任务 | 登录 | | PUT | `/api/job/{id}/run` | 执行任务 | 登录 | | PUT | `/api/job/{id}/pause` | 暂停任务 | 登录 | | PUT | `/api/job/{id}/resume` | 恢复任务 | 登录 | ### 系统通知 | 方法 | 路径 | 说明 | 权限 | |------|------|------|------| | GET | `/api/notice/page` | 通知分页列表 | 登录 | | GET | `/api/notice/{id}` | 通知详情 | 登录 | | POST | `/api/notice` | 新增通知 | 登录 | | PUT | `/api/notice/{id}` | 更新通知 | 登录 | | DELETE | `/api/notice/{id}` | 删除通知 | 登录 | | PUT | `/api/notice/{id}/publish` | 发布通知 | 登录 | ### 文件管理 | 方法 | 路径 | 说明 | 权限 | |------|------|------|------| | GET | `/api/file/list` | 文件列表 | 登录 | | POST | `/api/file/upload` | 上传文件 | 登录 | | DELETE | `/api/file/{id}` | 删除文件 | 登录 | ### 即时聊天 | 方法 | 路径 | 说明 | 权限 | |------|------|------|------| | GET | `/api/chat/users` | 可聊天用户列表(含未读数) | 登录 | | GET | `/api/chat/history/{username}` | 聊天历史记录 | 登录 | | POST | `/api/chat/send` | 发送消息(持久化 + WS 推送) | 登录 | | POST | `/api/chat/read/{username}` | 标记已读 | 登录 | | WebSocket | `/ws/chat?token=xxx` | 实时消息推送 | 登录 | ### 统一响应格式 ```json { "code": 200, "msg": "操作成功", "data": {} } ``` 分页响应: ```json { "code": 200, "msg": "操作成功", "data": { "total": 100, "pageSize": 10, "pageNum": 1, "list": [] } } ``` --- ## 开发指南 ### 后端 ```bash cd grit-admin # 开发运行 mvn spring-boot:run # 打包 mvn clean package -DskipTests ``` **新增模块步骤:** 1. 在 `entity/` 创建实体类(继承 `BaseEntity`) 2. 在 `mapper/` 创建 Mapper 接口(继承 `BaseMapper`) 3. 在 `service/` 创建 Service 接口和实现(继承 `IService` / `ServiceImpl`) 4. 在 `controller/` 创建 Controller,返回 `Result` 统一响应 5. 在 `permission` 表添加菜单与权限码 **注意:** - 逻辑删除已全局配置,查询时自动过滤 `deleted = 1` 的记录 - 操作日志通过 `AspectConfig` AOP 自动记录 POST/PUT/DELETE 操作 - `DataInitializer` 每次启动都会检查并补充缺失菜单 ### 前端 ```bash cd grit-admin-ui-new pnpm dev # 开发(端口 3050) pnpm build # 生产构建 pnpm preview # 预览构建结果 ``` **新增页面步骤:** 1. 在 `src/views/` 创建页面组件(按 Elegant Router 目录约定) 2. 路由由目录结构自动生成,如需守卫在 `src/router/guard.ts` 配置 3. 在 `src/service/api/` 添加 API 接口定义 4. 在后端 `permission` 表添加对应菜单记录 **状态管理:** - `store/modules/auth/` — 用户认证状态(Token、用户信息、登录/登出) - `store/modules/theme/` — 主题配置状态(明暗模式、主题色、布局等) - `store/modules/route/` — 动态路由状态(菜单树、路由生成) - `store/modules/tab/` — 多页签状态 --- ## 数据库说明 核心脚本:`sql/grit_admin.sql` ### 核心表 | 表名 | 说明 | |------|------| | `user` | 系统用户(用户名、密码、昵称、邮箱、手机、状态) | | `role` | 角色(名称、编码、描述、状态) | | `permission` | 权限/菜单(名称、编码、类型、父级、路径、组件、图标、排序) | | `user_role` | 用户-角色关联(userId + roleId 复合键) | | `role_permission` | 角色-权限关联(roleId + permissionId 复合键) | | `log` | 操作/登录日志(类型、内容、操作人、IP、耗时、状态) | | `system_config` | 系统配置(config_key + config_value 键值结构) | | `sms_record` | 短信发送记录(手机号、验证码、状态、时间) | ### 扩展表 | 表名 | 说明 | |------|------| | `dept` | 部门(树形结构,parent_id 自关联) | | `post` | 岗位 | | `job` | 定时任务(任务名、cron 表达式、状态) | | `notice` | 系统通知(标题、内容、类型、发布状态) | ### ER 关系 ``` user ──N:M── user_role ──N:M── role role ──N:M── role_permission ──N:M── permission dept ──1:N── user ``` - 所有核心表均使用逻辑删除(`deleted` 字段,MyBatis-Flex 自动处理) - 时间字段(`create_time`、`update_time`)由数据库自动维护 - 权限表支持树形结构(`parent_id` 自关联) --- ## 致谢 - 后端 RBAC 设计参考 RuoYi 等开源 admin 框架 - 前端基于 SoybeanAdmin 模板搭建 - 前端 UI 基于 Ant Design Vue 组件库 --- ## License MIT