# ruoyi-rust **Repository Path**: rustdev/ruoyi-rust ## Basic Information - **Project Name**: ruoyi-rust - **Description**: RuoYi-Rust(tokio,axum)是一个雄心勃勃的项目,旨在通过现代、高性能的 Rust 语言及其强大的生态系统,完整重写主流Ruoyi的Java Web 框架 后端服务 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 121 - **Forks**: 43 - **Created**: 2025-09-09 - **Last Updated**: 2026-07-25 ## Categories & Tags **Categories**: backend **Tags**: None ## README # RuoYi-Rust — 高性能 Rust 重构后端 #### 丰盛辉煌 [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![Rust Version](https://img.shields.io/badge/rust-1.88%2B-orange.svg)](https://www.rust-lang.org/) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md) --- > 有任何需求,请直接在 Issues 中提出,有时间会慢慢补充完善。 --- **RuoYi-Rust** 是一个雄心勃勃的项目,始于 2025-08-28,旨在通过现代、高性能的 Rust 语言及其强大的生态系统,完整重写主流 Java Web 框架 [RuoYi](https://gitee.com/y_project/RuoYi) 的后端服务。我们追求的目标不仅是功能对等,更是在性能、资源占用、安全性及现代化开发体验上实现全面超越,为 Rust 生态提供一个可复用的企业级管理系统方案。 🔗 **在线演示:[http://212.129.155.221:9081](http://212.129.155.221:9081)** | 账号:`admin` 密码:`admin123` ### 2026-07-21 功能扩展 - **工作流引擎**:新增基于 LogicFlow 的可视化工作流模块,支持流程定义、发起审批、任务审批/驳回/转办、抄送通知、审批历史追踪,内置请假审批示例。 - **Dify AI 智能问答**:集成 Dify AI 平台,支持 SSE 流式对话、多轮会话、思考过程展示,前端打字机效果实时渲染。 - **文件管理增强**:对象存储模块升级,新增大文件分片上传、多存储后端运行时管理、批量文件操作、自动识别存储厂商。 - **实时通信**:新增 WebSocket 双向消息推送和 SSE 服务端推送能力。 - **邮件/短信服务**:内置 SMTP 邮件发送(SSL/STARTTLS)和多供应商短信服务(阿里云、旦米等)。 ### 2026-06-29 新版发布 - **前端全面升级**:配套前端从 RuoYi-Vue3 升级为基于 **Vue Vben Admin v5.7.0** 的 [ruoyi-rust-ui-plus](https://gitee.com/rustdev/ruoyi-rust-ui-plus.git),采用 Vue 3 + TypeScript + Element Plus + Tailwind CSS v4 + UnoCSS,开发体验更佳。 - **代码生成工具增强**:新增完整的代码生成前端页面(导入表、创建表、预览代码、编辑配置、拖拽排序、批量下载),前后端全链路打通。 - **AI 协作新范式**:**所有新业务优先使用代码生成工具产出统一规范的项目骨架,保证架构一致、减少低级 bug;剩余业务细节交由 AI 自动填充,整体提升研发效率**。 ## 🎯 配套项目 | 项目 | 说明 | |------|------| | **后端** | [ruoyi-rust](https://gitee.com/rustdev/ruoyi-rust.git) — 本项目,Rust 后端服务 | | **前端(推荐)** | [ruoyi-rust-ui-plus](https://gitee.com/rustdev/ruoyi-rust-ui-plus.git) — 基于 Vue Vben Admin v5.7.0 + Element Plus + TypeScript | | **前端(旧版)** | [ruo-yi-vue3](https://gitee.com/rustdev/ruo-yi-vue3.git) — RuoYi-Vue3 微调版(已停止维护) | ## ✨ 核心亮点 (Why RuoYi-Rust?) - 🚀 **极致性能**: 基于 `Tokio` 和 `Axum` 框架,原生异步,无 GC 延迟。提供比原生 JVM 应用更快的 API 响应速度和显著降低的内存占用。 - 🔒 **内存安全**: 借助 Rust 强大的所有权和借用检查机制,从编译层面根除空指针、数据竞争等常见的运行时安全隐患,构建坚如磐石的系统。 - 📦 **极简部署**: 整个后端项目可编译为单个可执行文件(内置缓存系统),不依赖 JRE、Tomcat、Nginx 等任何外部运行时。部署过程从未如此简单:上传文件,启动,仅此而已。 - 🗄️ **多数据库支持**: 内置 **MySQL / PostgreSQL / SQLite** 适配,可通过 URL 或 host/port/database 结构化配置切换数据库,连接池大小、连接/空闲超时等参数均可配置。 - ⚡ **多级权限缓存**: 权限数据支持 **moka 本地缓存 (L1)**、**Redis 缓存 (L2)** 或两级混合模式,角色/菜单/用户授权变更时自动失效对应缓存,显著降低高频鉴权的数据库压力。 - 🛡️ **声明式数据脱敏**: 内置基于 `serde + schemars` 的字段脱敏能力,支持手机号、身份证、邮箱、姓名、AK/SK 等敏感信息按规则输出;既支持 `#[serde(with = "mask_phone")]` 这类开箱即用预设,也支持按字段通过参数化序列化器自定义保留位数与掩码策略,兼顾接口安全与 OpenAPI/JSON Schema 文档一致性。 - 🛠️ **现代化开发体验**: - **类型安全的数据库访问**: 采用 **SeaORM** 作为数据库访问层,遵循"数据库 Schema 为唯一真实来源"原则。不仅支持 MySQL / PostgreSQL / SQLite,还能在编译期发现大量不符合数据库表结构的查询错误。 - **声明式权限控制**: 通过自定义过程宏实现类型安全的声明式 API 权限校验,将权限元数据与业务逻辑高度内聚,彻底告别手写权限字符串带来的风险。 - **模块化设计**: 采用清晰的 Cargo Workspace 结构和分层架构,实现高内聚、低耦合,便于维护与扩展。 - **数据库迁移**: 内置 `sea-orm-migration` 数据库迁移模块,Schema 变更通过版本化迁移脚本管理,告别手工维护 SQL。 ## 📊 项目状态 我们正在逐步实现 RuoYi 的全部功能。当前已完成的核心模块如下: - [x] **核心框架** - [x] 配置加载 (`config-rs`) - [x] 结构化日志 (`tracing`) - [x] 数据库连接池 (SeaORM,支持 MySQL / PostgreSQL / SQLite) - [x] 统一响应 (`AjaxResult`) 与错误处理 (`AppError`) - [x] JWT 认证中间件 (`jwt-simple`) - [x] 高性能本地缓存 (`moka`),可选 Redis 二级缓存 - [x] 数据库迁移 (`sea-orm-migration`) - [x] 客户端登录扩展:登录支持透传 `client_id`,可按客户端配置解析设备类型、固定超时与活跃超时 - [x] 单端登录控制:支持按 `user_id + device_type` 维度顶号;当 `security.concurrent_login = false` 时,同账号同端新登录会挤掉旧会话 - [x] 在线会话增强:在线用户记录已保存 `device_type`、`client_id`、活跃超时与固定过期上限,便于区分 Web / App 等登录来源 - [x] WebSocket 实时通信(双向消息推送,心跳保活) - [x] SSE 服务端推送(Server-Sent Events,实时通知广播) - [x] 邮件服务(SMTP,支持 SSL / STARTTLS) - [x] 短信服务(多供应商适配:阿里云、旦米、Mock、固定验证码模式) - [x] API 请求/响应加密(RSA + AES-256-ECB,敏感接口自动加密) - [x] 雪花 ID 生成器(可配置 worker_id / datacenter_id / epoch) - [x] Excel 导入导出(基于过程宏 `#[derive(ExcelSchema)]`) - [x] 字段翻译(字典翻译、OSS ID → URL,基于 `#[TranslateFill]` 宏) - [x] 数据脱敏(基于 `serde_mask` 工具,支持 `mask_phone` / `mask_id_card` / `mask_email` / `mask_name` / `mask_ak_sk` / `mask_full`) - [x] **系统模块 (`system`)** - [x] 登录、获取用户信息、动态路由 (`/login`, `/getInfo`, `/getRouters`) - [x] 菜单管理 - [x] 部门管理 - [x] 字典管理 - [x] 参数管理 - [x] 角色管理 - [x] 用户管理(CRUD、导入导出、数据权限) - [x] 系统通知(支持 SSE 广播推送) - [x] 岗位管理 - [x] 客户端管理 - [x] API Token 管理(签发/撤销/Signer 鉴权) - [x] WebSocket 实时消息 - [x] SSE 实时推送 - [x] **权限体系** - [x] 声明式权限校验过程宏 (`ruoyi-macros`) - [x] 数据权限(全部 / 本部门 / 本部门及以下 / 自定义 / 仅本人) - [x] **监控模块 (`monitor`)** - [x] 操作日志 - [x] 登录日志 - [x] 在线用户 - [x] 定时任务 - [x] 服务监控(CPU / 内存 / 磁盘) - [x] 缓存监控 - [x] **对象存储 (`oss`)** - [x] 文件上传 / 下载 - [x] 大文件分片上传(>5MB 自动分片,自动管理 Part) - [x] AWS S3 协议兼容(推荐 [RustFS](https://github.com/rustfs/rustfs),同时兼容 MinIO、阿里云 OSS、腾讯云 COS、华为云 OBS、AWS S3 等) - [x] 多存储后端配置(运行时切换默认存储后端,支持多 Bucket 管理) - [x] 文件管理列表(按 ID 批量查询、URL 获取、删除) - [x] 自动识别存储厂商(根据 endpoint 自动判断 path-style / virtual-hosted-style) - [x] **工作流模块 (`workflow`)** - [x] 流程定义管理(CRUD、发布/取消发布、版本管理) - [x] 流程实例管理(发起流程、终止流程、我的发起、进度查看) - [x] 任务管理(我的待办/已办、审批/驳回、任务转办) - [x] 可视化流程设计器(基于 LogicFlow JSON 格式) - [x] 审批节点类型:审批人节点(`approver`)、条件分支(`condition`)、抄送节点(`cc`) - [x] 审批人解析策略:指定用户 / 指定角色 / 指定部门 / 发起人自己 - [x] 会签 / 或签审批模式 - [x] 抄送通知记录 - [x] 审批历史轨迹记录 - [x] 请假管理(示例业务流程,演示工作流接入) - [x] **AI 智能问答 (`agents`)** - [x] Dify AI 平台对接(SSE 流式代理) - [x] 多轮对话支持(conversation_id 会话续接) - [x] 流式事件透传:`message` / `agent_message` / `message_end` / `reasoning_chunk` - [x] 思考过程展示(reasoning_chunk 事件透传) - [x] 前端 SSE 流式渲染(打字机效果) - [x] **代码生成工具 (`code-tool`)** - [x] 数据库元数据自动提取 (MySQL / PostgreSQL / SQLite) - [x] Rust 后端全栈生成 (Model, Service, Handler, Mod, Router) - [x] Vue 前端全栈生成 (index.vue, api.ts) - [x] **自动化权限宏注入**: 自动生成 `#[require_permission("...")]`,无需手动维护 Enum - [x] 结构化 ZIP 下载 (自动分类 backend / frontend / sql 文件夹) - [x] 在线预览生成代码(左侧文件树 + 右侧代码展示) - [x] 导入已有表 / SQL 创建表 / 同步数据库结构 - [x] 可视化编辑表配置(字段属性、查询方式、显示类型、字典绑定、拖拽排序) - [x] 菜单 SQL 自动生成 ## 📌 当前能力补充说明 ### 🛡️ 数据脱敏(`serde_mask`) 项目内置基于 `serde + schemars` 的声明式数据脱敏工具,适用于 `VO / DTO / API 返回对象` 中的敏感字段控制。当前已提供以下开箱即用模块: - `mask_phone`:手机号,保留前 3 后 4 - `mask_id_card`:身份证,保留前 6 后 4 - `mask_email`:邮箱,保留本地部分首字符与完整域名 - `mask_name`:姓名,保留首字符 - `mask_ak_sk`:AK/SK,保留首尾各 1 位 - `mask_full`:全打码(例如 `******`) #### 基础用法 ```rust use common::utils::serde_mask::{mask_ak_sk, mask_full, mask_phone}; use schemars::JsonSchema; use serde::Serialize; #[derive(Serialize, JsonSchema)] pub struct UserAndOssConfigVo { #[schemars(with = "Option")] #[serde(with = "mask_phone")] pub phone: Option, #[schemars(with = "Option")] #[serde(with = "mask_ak_sk")] pub access_key: Option, #[schemars(with = "Option")] #[serde(with = "mask_full")] pub secret_key: Option, pub bucket_name: String, } ``` #### 为什么有时需要 `#[schemars(with = "Option")]` 如果边界对象同时派生了 `JsonSchema`,并且字段使用了 `#[serde(with = "mask_xxx")]`,建议同时补上: ```rust #[schemars(with = "Option")] ``` 原因是: - `serde(with = "...")` 负责序列化/反序列化逻辑; - `schemars` 负责 OpenAPI / JSON Schema 类型推导; - 对 `Option` 这类字段,显式标注后可以稳定告诉 schema 生成器:该字段对外仍然是“可空字符串”,避免把脱敏模块误判成类型本身。 #### 自定义参数化能力 除预设模块外,`common::utils::serde_mask` 还提供底层可参数化函数: - `serialize_keep_head_tail(value, serializer, start, end, mask_char)` - `serialize_full(value, serializer, fixed)` - `serialize_middle(value, serializer, mask_char)` - `serialize_email(value, serializer, mask_char)` 适合在具体业务字段上按需封装自己的脱敏规则。 ### 🔄 工作流引擎 (`workflow`) 内置轻量级工作流引擎,基于 **LogicFlow** 可视化流程设计器,支持常见的审批流转场景。 #### 核心能力 | 能力 | 说明 | |------|------| | **流程定义** | 基于 LogicFlow JSON 格式定义流程,支持发布/取消发布、版本管理 | | **节点类型** | 开始节点(`start`)、审批人节点(`approver`)、条件分支(`condition`)、抄送节点(`cc`)、结束节点(`end`) | | **审批人解析** | 支持 4 种策略:指定用户(`user`)、指定角色(`role`)、指定部门(`dept`)、发起人自己(`initiator`) | | **审批模式** | 会签(所有人同意才通过)/ 或签(任一人同意即通过) | | **流程操作** | 发起流程、审批同意、驳回、终止、转办任务 | | **抄送通知** | 流程节点可配置抄送人,自动生成只读抄送记录 | | **进度追踪** | 查看流程实例的所有任务节点和审批历史记录 | | **示例业务** | 内置请假审批(`oa_leave`),演示工作流接入方式 | #### 流程引擎工作原理 1. **流程定义**:前端通过 LogicFlow 设计器绘制流程图,导出 JSON 存入 `wf_process_def` 2. **发起流程**:解析 JSON,BFS 遍历节点图,创建流程实例(`wf_process_instance`) 3. **任务派发**:根据节点 `assigneeType` 和 `assigneeIds` 解析审批人,创建待办任务(`wf_task`) 4. **审批流转**:审批通过后自动推进到下一节点,条件分支按规则路由 5. **流程结束**:到达 `end` 节点时流程完成,记录审批历史(`wf_approval_record`) #### 数据表 | 表名 | 用途 | |------|------| | `wf_process_def` | 流程定义(JSON 格式) | | `wf_process_instance` | 流程实例 | | `wf_task` | 任务节点 | | `wf_task_assign` | 任务审批人 | | `wf_ins_variable` | 流程实例变量 | | `wf_cc_record` | 抄送记录 | | `wf_approval_record` | 审批历史记录 | | `oa_leave` | 请假业务表(示例) | #### 后续规划 - [ ] 条件分支表达式求值(当前取第一个分支) - [ ] 自由流转(加签、减签、回退到任意节点) - [ ] 多实例并行网关(`parallel`) - [ ] 子流程嵌套 - [ ] 超时自动处理 --- ### 🤖 Dify AI 智能问答 (`agents`) 集成 [Dify](https://dify.ai) AI 平台,提供 SSE 流式智能问答能力。 #### 核心能力 | 能力 | 说明 | |------|------| | **流式对话** | 通过 SSE(Server-Sent Events)实时推送 AI 回复,打字机效果 | | **多轮会话** | 支持 `conversation_id` 续接上下文,实现多轮对话 | | **思考过程** | 透传 `reasoning_chunk` 事件,展示 AI 推理过程 | | **事件协议** | 兼容 Dify 原生事件:`message`、`agent_message`、`message_end`、`reasoning_chunk` | | **认证保护** | 接口需登录态,401 自动跳转登录页 | #### 配置方式 在 `config/local.toml` 中配置 Dify 连接信息: ```toml [dify] enabled = true base_url = "http://your-dify-host/v1" api_key = "app-xxxxxxxxxxxxxx" ``` #### 接口说明 - **`POST /prod-api/agents/chat`** — 发送聊天消息,返回 SSE 流式响应 - 请求体:`{ "message": "你的问题", "conversationId": "可选,续接会话" }` - 前端通过 `fetch` + `ReadableStream` 解析 SSE 事件流 --- ### 📁 文件管理 (`oss`) 基于 S3 协议的对象存储管理模块,支持多种云存储后端。 #### 核心能力 | 能力 | 说明 | |------|------| | **文件上传** | 支持普通上传(≤50MB)和大文件分片上传(>5MB 自动分片) | | **文件下载** | 生成预签名 URL,支持直接下载或在线预览 | | **文件管理** | 列表查询、按 ID 批量查询、批量删除、URL 获取 | | **多存储后端** | 运行时管理多个存储配置,支持切换默认后端 | | **自动识别厂商** | 根据 endpoint 自动选择 path-style 或 virtual-hosted-style | #### 支持的存储后端 | 存储 | 推荐度 | 说明 | |------|--------|------| | **RustFS** | ⭐⭐⭐⭐⭐ | Rust 原生,性能 2.3x MinIO,推荐本地部署 | | **MinIO** | ⭐⭐⭐⭐ | 成熟的开源对象存储 | | **阿里云 OSS** | ⭐⭐⭐⭐ | 国内云存储首选 | | **腾讯云 COS** | ⭐⭐⭐⭐ | 腾讯云生态 | | **华为云 OBS** | ⭐⭐⭐⭐ | 华为云生态 | | **AWS S3** | ⭐⭐⭐⭐ | 国际标准 | #### 配置示例 ```toml [oss] enabled = true endpoint = "http://127.0.0.1:9000" access_key = "rustfsadmin" secret_key = "rustfsadmin" bucket = "ruoyi" region = "us-east-1" prefix = "ruoyi" path_style = true # RustFS / MinIO 必须开启 ``` #### 接口列表 | 接口 | 方法 | 说明 | |------|------|------| | `/oss/upload` | POST | 文件上传(multipart/form-data) | | `/oss/download/{ossId}` | GET | 文件下载(302 重定向到预签名 URL) | | `/oss/list` | GET | 文件列表(分页) | | `/oss/listByIds` | GET | 按 ID 批量查询 | | `/oss/urlByIds` | GET | 按 ID 获取文件 URL | | `/oss/{ossId}` | DELETE | 删除文件 | | `/oss/config/list` | GET | 存储配置列表 | | `/oss/config` | POST/PUT | 新增/修改存储配置 | | `/oss/config/changeDefault` | PUT | 切换默认存储后端 | --- ### ⏰ 定时任务当前状态与使用说明(2026-07 第四阶段收口) 当前 `monitor` 模块中的定时任务能力,已经完成本轮 scheduler capability 升级收口,**定位为:单机场景可生产使用**。为了避免误解,这里把当前能力边界、推荐使用方式和暂未承诺范围一次说明清楚。 #### 当前可用能力 - 支持三种执行后端: - `direct` - `memory` - `redis` - 支持任务管理基础能力: - 新增 / 修改 / 删除 / 启停 - 手动执行一次(run once) - 日志查询 - 支持 builtin 任务模板与 `invokeTarget` 方式执行内置任务 - 支持 `concurrent`(当前前端展示为“触发策略”)与最小化 `misfire_policy` 语义落地 - `redis` backend 已具备最小运维闭环: - retry - dead-letter - replay - delete - 已提供后端运维概览接口: - `GET /prod-api/monitor/job/backendOpsOverview` #### 当前推荐使用方式 ##### 1. 单机生产推荐 backend 如果是当前这轮能力直接上线,推荐优先使用: - **`redis` backend**:适合单机生产、链路可观察性更完整 - `memory` backend:适合单机轻量场景或过渡验证 - `direct` backend:适合最简单的即时执行场景,但对长任务的人工 run once 观察要更谨慎 ##### 2. run once 结果如何理解 - `direct`:更接近立即执行链路 - `memory / redis`:接口成功优先表示**已派发 / 已入队成功**,不代表最终已经执行完成 - `redis` dead-letter 的 `replay` 成功:表示**已重放回主队列成功**,不代表最终业务执行成功 因此,最终执行结果统一建议结合以下信息判断: - `sys_job_log` - worker 日志 - 业务侧实际结果 ##### 3. 当前前端字段如何理解 目前前端任务表单里,已按当前后端真实语义做过一轮收口: - `concurrent` 当前更适合理解为: - `重复排队` - `冲突跳过` - `misfire_policy` 当前只在“冲突跳过”路径下才有实际意义 - 当前后端对: - `1 = 立即执行` - `2 = 执行一次` 还没有拆成真正不同的两套运行逻辑;前端当前统一只保留“执行一次”展示 ##### 4. direct / memory / redis 的当前区别 ###### `direct` - 不走队列 - 更接近立即执行 - 当前主要承载: - 手动执行 - 并发冲突直接跳过 - 不承载 queued backend 的 retry / dead-letter / replay 语义 ###### `memory` - 先入当前进程内存队列 - 当前是**单 worker 串行消费** - 支持 queued 冲突控制与最小单票补偿语义 - 不提供 dead-letter / replay ###### `redis` - 先入 Redis 队列 - 当前同样按**单 worker 串行消费**的单机模型收口 - 支持: - retry - dead-letter - replay - delete - backend 运维概览 #### 当前明确承诺的边界 本轮升级完成后,可以明确承诺: - **单机部署可用** - `redis` 可作为当前推荐的单机生产 backend - `run once` / queued dispatch / retry / dead-letter / replay / delete 的产品语义已收口 - 应用重启后,**启用状态任务会重新注册进 scheduler** - `backendOpsOverview` 可用于查看: - 当前 backend - 是否 queued backend - Redis 主队列 key - dead-letter 队列 key - 当前恢复边界 - 安全清理提示 #### 当前明确不承诺的范围 以下能力**不属于本轮已经完成的范围**: - 多实例严格一致性 - 分布式唯一消费保障 - leader / distributed lock / claim 模型 - in-flight 任务在进程中断后的自动续跑 - 完整 durable dispatch state machine - Quartz / XXL-JOB 级完整 misfire / backlog 恢复终态 - exactly-once 分布式保障 也就是说: > 当前定时任务能力适合**单机生产落地**,不应直接理解为“已经完成多实例调度平台化”。 #### Redis 队列清理说明 若使用 `redis` backend,只有在确认: - 当前没有任务仍在执行 - 也不再需要观察上一轮 retry / dead-letter / replay 结果 时,才建议清理 Redis 主队列或 dead-letter 队列。否则会破坏排障证据。 #### 后续升级方向 如果后续要继续往上做,可在本轮单机稳定基础上继续推进: - 多实例最小可运行 - 多实例生产可用 - 更完整的一致性 / claim / ack / in-flight 恢复模型 但这些已经属于**下一条新专题**,不再是当前这轮 scheduler capability 收尾的一部分。 ## 🕒 后端统一时间约定 为避免业务时间、日志时间、在线会话时间在不同时区/宿主机设置下出现偏差,项目约定: - **业务当前时间一律走 `common::utils::time` 提供的统一方法** - 需要 `DateTime` 时使用 `cst_now()` - 需要 `NaiveDateTime`(写库字段、审计字段等)时使用 `cst_naive_now()` - 需要标准字符串时使用 `cst_now_string()` - **禁止在业务代码中直接使用以下方式生成当前时间** - `chrono::Local::now()` - `Utc::now().naive_utc()` - 任何自行拼 offset / `with_timezone(...)` 的临时写法 - **适用范围** - 系统管理 / 监控模块的 create_time、update_time、login_time、job_log、在线会话时间 - 认证、鉴权、SSE、WebSocket、缓存过期判断中由后端自行解释的“当前时间” - 导出文件名、日志展示时间、业务层生成的时间戳/时间字符串 - **允许保留 UTC 的场景** - 第三方协议或签名明确要求 UTC / ISO8601 Zulu 时间 - 例如短信供应商、云厂商签名字段、外部 API 协议时间窗 - 这类场景应优先遵循第三方协议要求,不要强改为东八区 ### 给开发者 / AI 协作者的直接规则 - 看到“当前时间”需求,默认先选 `cst_now()` / `cst_naive_now()`,不要先写 `Local::now()` 或 `Utc::now().naive_utc()` - 如果是对外协议签名时间,先查协议是否明确要求 UTC;只有明确要求 UTC 时才保留 `Utc::now()` - 若拿不准,应先按“业务时间用东八区统一方法,协议时间按第三方要求”判断,不要混用 ### 🔐 框架认证 / 客户端能力当前状态说明 #### 当前已实现 - [x] 登录接口支持传入 `client_id`,并根据 `sys_client` 读取客户端配置 - [x] 可基于客户端配置控制: - [x] `device_type`(设备类型隔离) - [x] `timeout`(token 固定超时) - [x] `active_timeout`(在线会话活跃超时 / 滑动续期) - [x] 单端登录已接入主登录流程:可按同账号、同设备类型执行顶号 - [x] 已提供后台客户端管理能力:维护 `client_id`、`client_key`、`client_secret`、`grant_type`、`device_type`、超时配置、状态等字段 - [x] 客户端停用后,登录时会拒绝该客户端发起的请求 - [x] 已落地三条登录主链路: - [x] `POST /login`:账号密码登录 - [x] `POST /login/email` + `POST /login/email/code`:邮箱验证码登录 - [x] `POST /login/sms` + `POST /login/sms/code`:短信验证码登录 - [x] `grant_type` 已接入现有登录准入校验: - [x] `password`:限制账号密码登录 - [x] `email`:限制邮箱验证码发送与邮箱验证码登录 - [x] `sms`:限制短信验证码发送与短信验证码登录 - [x] 邮箱 / 短信登录除客户端 `grant_type` 外,还会继续校验系统参数与基础能力是否开启: - [x] 邮箱:`sys.account.emailEnabled` + 实际 SMTP 配置 - [x] 短信:`sys.account.smsEnabled` + 实际短信配置(支持 mock / provider / fixed code) - [x] `/captchaImage` 当前会返回登录页基础开关: - [x] `captchaEnabled` - [x] `emailEnabled` - [x] `smsEnabled` #### 当前边界 / 尚未完成 - [ ] 还**不是完整 OAuth2 / OIDC 授权中心** - 当前的 `grant_type` 更接近“本项目登录方式开关 / 客户端准入配置”,不是标准 OAuth2 授权服务器的完整协议实现 - 标准意义上的 `authorization_code`、`client_credentials`、`refresh_token`、OIDC、第三方社交授权回调等能力,当前均未完整落地 - [ ] `social` / `xcx` 等授权类型目前主要停留在字典与客户端配置层 - `sys_client.grant_type` 可以先存这些值 - 但对应的后端认证处理器、回调链路、令牌交换流程目前还没有完成 - [ ] `/captchaImage` **当前仍是全局登录开关接口,不是按客户端裁剪后的登录能力契约** - 当前 handler 只接收 `theme` 查询参数,不接收 `client_id` - 返回的 `captchaEnabled`、`emailEnabled`、`smsEnabled` 反映的是系统级能力是否开启 - 它**不会**直接告诉前端“这个客户端是否允许 `password / email / sms`” - [ ] 客户端维度的登录方式限制,当前主要体现在**实际登录/发码接口校验**上 - `POST /login`:当传入 `client_id` 时,会校验该客户端是否允许 `grant_type=password` - `POST /login/email` / `POST /login/email/code`:要求 `client_id`,并校验客户端是否允许 `grant_type=email` - `POST /login/sms` / `POST /login/sms/code`:要求 `client_id`,并校验客户端是否允许 `grant_type=sms` - [ ] 密码登录对 `grant_type=password` 的限制,当前仍建立在**前端稳定传入 `client_id`** 的前提下 - 如果前端不传 `client_id`,仍会走传统账号密码登录主链路 - 因此,若要真正落实“按客户端限制登录方式”,前端登录入口需要稳定传递 `client_id` - [ ] 前端登录页与后端客户端能力的联动还没有完全收口 - 后端三条登录接口和客户端准入校验已经具备 - 但“前端先拿到某个 client 的完整登录能力视图,再按能力动态裁剪登录方式”这层契约,目前还没有单独收口成一个标准接口 #### 更准确的现阶段理解 当前这套认证 / 客户端能力,已经具备: - **后端实际登录校验层面的客户端准入控制** - **账号密码 / 邮箱验证码 / 短信验证码三条主链路** - **客户端 + 设备类型 + 超时配置联动** 但还没有完全补成: - **前端先读取客户端登录能力,再动态渲染登录入口的完整契约层** 也就是说: > 现在“后端真实限制已经有了”,但“前端一次性拿到客户端登录能力画像”的接口契约还没有完全产品化。 ## 🛠️ 技术栈 (Tech Stack) ### 后端 | 领域 | 技术选型 | 理由 | |------|----------|------| | **语言/运行时** | Rust (Stable) / Tokio | 性能、安全、现代化的异步生态 | | **Web 框架** | Axum | 模块化、符合人体工程学、与 `tower` 生态无缝集成 | | **数据库交互** | SeaORM | 异步 ORM,支持 MySQL / PostgreSQL / SQLite,提供类型安全的数据库访问 | | **数据库迁移** | sea-orm-migration | Schema 版本化迁移,与 SeaORM 深度集成 | | **序列化** | Serde | Rust 生态的事实标准,性能卓越,功能强大 | | **配置管理** | `config-rs` | 支持多种格式,支持环境覆盖,简单易用 | | **日志系统** | `tracing` | 结构化日志,与 `tokio` 和 `axum` 深度集成 | | **认证/授权** | `argon2` / `jwt-simple` | 现代密码哈希标准;纯 Rust 实现的 JWT 库,轻量安全 | | **缓存** | `moka` / Redis | 高性能本地缓存,可选 Redis 二级缓存,灵活应对单机或分布式部署 | | **权限宏** | `syn` / `quote` | 自定义过程宏,实现声明式、编译时安全的权限校验 | | **对象存储** | AWS SDK S3 | 兼容 S3 协议,推荐 [RustFS](https://github.com/rustfs/rustfs)(Rust 原生,性能 2.3x MinIO),同时兼容 MinIO、阿里云 OSS、腾讯云 COS、华为云 OBS、AWS S3 | | **工作流引擎** | 自研(LogicFlow JSON) | 轻量级流程引擎,基于 BFS 遍历解析 LogicFlow 可视化设计器导出的流程定义 | | **AI 集成** | Dify API (SSE) | 对接 Dify AI 平台,通过 SSE 流式代理实现实时智能问答 | | **实时通信** | WebSocket / SSE | 双向实时消息推送(WebSocket)+ 服务端单向推送(SSE) | | **邮件服务** | `lettre` | 纯 Rust SMTP 客户端,支持 SSL / STARTTLS | | **短信服务** | 自研多供应商适配 | 支持阿里云、旦米等多供应商,业务场景枚举 + 配置映射 | | **OpenAPI** | aide / schemars | 自动生成 Swagger/OpenAPI 文档 | ### 旧前端(原若依框架前端) 当前旧版前端仓库为 [ruo-yi-vue3](https://gitee.com/rustdev/ruo-yi-vue3.git),仅保留作对照与过渡参考,**已停止维护**。 ### 新前端(ruoyi-rust-ui-plus) | 领域 | 技术选型 | 说明 | |------|----------|------| | **框架** | Vue 3.5 + TypeScript 6 | Composition API + `