fix(router): 修复登录重定向兼容hash路由和普通路由的问题

添加对hash路由的识别处理,优先尝试使用hash路由跳转,失败时回退到普通pathname跳转
docs: 添加Flow架构与执行流程文档
This commit is contained in:
2025-12-03 21:21:24 +08:00
parent 75c6974a35
commit 12830b7cf6
2 changed files with 74 additions and 2 deletions

View File

@ -0,0 +1,61 @@
## 输出物
- 一份详细的 Flow 架构与执行流程文档,包含可视化图示与文字说明
- 以 Mermaid 图(可直接在 IDE/Markdown 预览)呈现;同时提供 ASCII 简版便于纯文本查看
## 文档与图的组织
- 文件:`docs/flow_architecture.md`
- 结构:分章节“模块架构”“请求/运行编排”“引擎执行图”“数据模型”“事件与日志”“DSL 与 Design 转换”“执行器生态”
- 图格式Mermaidflowchart、sequence、class、er每个图下配文字说明与代码引用file:line
## 图示清单与内容要点
1. 模块架构图Graph LR
- 节点:`flow/{dsl,domain,context,engine,task,executors,mappers,log_handler}``services/{flow_service,flow_run_log_service}``routes/{flows,flow_run_logs}``middlewares/{sse,ws,jwt,http_client}``db,redis,models/{flow,flow_run_log}`
- 边:解析→构建→驱动→事件→日志入库;路由→服务→引擎;执行器←上下文补充
2. 请求/运行编排时序图Sequence
- 参与者:客户端、`routes.flows``flow_service``dsl/mappers``FlowEngine``log_handler``middlewares.sse/ws``models`
- 关键步骤:加载流程→解析 YAML/design_json→构造 `ChainDef/ctx``drive(...)`→推送事件→写入运行日志→返回结果
3. 引擎执行图Flowchart
- 图块选起点→合流屏障检查→任务执行Sync/AsyncFireAndForget/Queued/Bounded→分支选择条件 JSON/Rhai→组内追踪与等待BranchExit/FlowEnd→结束与事件推送
- 特别展示:`group` 信号量(队列/限并发与写回策略variable/http/db
4. DSL/Design 转换图Flowchart
- `DesignSyntax` 校验→条件端口兼容→推断 `kind/task/name`→组装 `groups/members/await_policy`→生成 `ChainDef`
- 同时展示 `mappers.ctx_from_design_json` 将节点配置落到 `ctx.nodes.<id>.<executor>`
5. 数据模型图ER/Class
- 表:`flows(id,name,yaml,design_json,code,remark,created_at,updated_at)``flow_run_logs(id,flow_id,flow_code,input,output,ok,logs,user_id,username,started_at,duration_ms,created_at)`
- 关系:`flow_run_logs.flow_id → flows.id`
6. 事件与日志通道图Graph LR
- SSE/WS`engine.push_and_emit → middlewares.sse/ws → client`
- 入库:`FlowLogHandler(Database|Sse)``flow_run_log_service.create`
7. 执行器生态图Graph LR
- 节点:`http/db/variable/script_rhai/script_js/script_python/condition`
- 输入来源:`ctx.nodes.<id>.*` 与顶层 `ctx.*`;输出写回策略与幂等注意点
## 信息来源与代码引用
- DSL/Design`backend/src/flow/dsl.rs:60-93,138-170,172-203,246-303`
- 领域模型:`backend/src/flow/domain.rs:20-28,31-36,39-47,60-68`
- 上下文与事件:`backend/src/flow/context.rs:29-45`
- 引擎:`backend/src/flow/engine.rs:117-209,213-577`
- 服务编排:`backend/src/services/flow_service.rs:285-305,342-349,351-365,366-399`
- 路由:`backend/src/routes/flows.rs:26-35,101-133`
- 日志服务:`backend/src/services/flow_run_log_service.rs:46-63,74-131`
## 实施步骤
1. 生成 `docs/flow_architecture.md` 骨架,按章节填入概要说明
2. 为每个章节插入 Mermaid 图代码块,并补充 2-4 条关键解释
3. 在图下添加代码引用(`file_path:line_number`
4. 预览并调整布局(节点命名统一、边方向一致、避免交叉线)
5. 输出 ASCII 简版(备选)供纯文本环境查看
## 验证
- 在 IDE/Markdown 预览验证所有 Mermaid 图可渲染
- 随机抽取 3 处代码引用跳转验证准确性
## 后续维护
- 当新增执行器或模式,更新“执行器生态图”和“引擎执行图”
- 当模型字段变更,更新 ER 图并在“请求/运行编排时序图”同步最新流程

View File

@ -16,8 +16,19 @@ let pendingQueue: { resolve: () => void; reject: (e: unknown) => void; config: R
function redirectToLogin(msg?: string): Promise<never> {
clearToken()
if (typeof window !== 'undefined' && window.location.pathname !== '/login') {
window.location.href = '/login'
if (typeof window !== 'undefined') {
const isHashRouter = (window.location.hash || '').startsWith('#/')
if (isHashRouter) {
if (window.location.hash !== '#/login') {
window.location.hash = '#/login'
}
} else {
if (window.location.pathname !== '/login') {
// 兼容浏览器路由与生产静态部署:优先使用 hash 入口,无法识别时再回退 pathname
try { window.location.hash = '#/login' } catch {}
try { window.location.href = '/login' } catch {}
}
}
}
return Promise.reject(new Error(msg || '未登录或登录已过期'))
}