feat(backend): 新增 QuickJS 运行时支持 JavaScript 执行器

refactor(backend): 重构 script_js 执行器实现 JavaScript 文件/内联脚本执行
feat(backend): 变量节点支持表达式/引用快捷语法输入
docs: 添加变量节点使用文档说明快捷语法功能
style(frontend): 调整测试面板样式和布局
fix(frontend): 修复测试面板打开时自动关闭节点编辑侧栏
build(backend): 添加 rquickjs 依赖用于 JavaScript 执行
This commit is contained in:
2025-09-20 17:35:36 +08:00
parent baa787934a
commit 296f0ae9f6
11 changed files with 357 additions and 41 deletions

View File

@ -1,5 +1,5 @@
use axum::{Router, routing::{post, get}, extract::{State, Path, Query}, Json};
use crate::{db::Db, response::ApiResponse, services::flow_service, error::AppError};
use crate::{db::Db, response::ApiResponse, services::{flow_service, log_service}, error::AppError};
use serde::Deserialize;
use tracing::{info, error};
use crate::middlewares::jwt::AuthUser;
@ -27,7 +27,7 @@ struct CreateReq { yaml: Option<String>, name: Option<String>, design_json: Opti
#[derive(Deserialize)]
struct UpdateReq { yaml: Option<String>, design_json: Option<serde_json::Value>, name: Option<String>, code: Option<String>, remark: Option<String> }
async fn create(State(db): State<Db>, Json(req): Json<CreateReq>) -> Result<Json<ApiResponse<flow_service::FlowDoc>>, AppError> {
async fn create(State(db): State<Db>, user: AuthUser, Json(req): Json<CreateReq>) -> Result<Json<ApiResponse<flow_service::FlowDoc>>, AppError> {
info!(target = "udmin", "routes.flows.create: start");
let res = match flow_service::create(&db, flow_service::FlowCreateReq { yaml: req.yaml, name: req.name, design_json: req.design_json, code: req.code, remark: req.remark }).await {
Ok(r) => { info!(target = "udmin", id = %r.id, "routes.flows.create: ok"); r }
@ -37,6 +37,20 @@ struct UpdateReq { yaml: Option<String>, design_json: Option<serde_json::Value>,
return Err(flow_service::ae(e));
}
};
// 新建成功后,补一条 PUT 请求日志,使“最近修改人”默认为创建人
if let Err(e) = log_service::create(&db, log_service::CreateLogInput {
path: format!("/api/flows/{}", res.id),
method: "PUT".to_string(),
request_params: None,
response_params: None,
status_code: 200,
user_id: Some(user.uid),
username: Some(user.username.clone()),
request_time: chrono::Utc::now().with_timezone(&chrono::FixedOffset::east_opt(0).unwrap()),
duration_ms: 0,
}).await {
error!(target = "udmin", error = ?e, "routes.flows.create: write put log failed");
}
Ok(Json(ApiResponse::ok(res)))
}