Files

9.9 KiB
Raw Permalink Blame History

状态机 / 生命周期图模板

⚠️ 本模板生成的是位图(PNG),不是 mermaid / xstate 可编辑状态机。 需要可编辑请用 mermaid stateDiagram / xstate visualizer。

本文件用于生成"工程感状态机 / 生命周期图":

  • 订单状态机(待支付 / 已支付 / 已发货 / 已完成 / 已取消 / 已退款)
  • 连接 / 会话状态(idle / connecting / connected / closing / closed)
  • 工作流状态(draft / submitted / approved / rejected)
  • UI 组件状态(hover / active / disabled / loading)
  • 协议状态机(TCP 状态、WebSocket 状态、HTTP 缓存状态)

特征:

  • 圆角矩形 = 状态节点
  • 实心圆 = 起始伪状态;靶心 / 双圆 = 终止状态
  • 有向边 = 转换 transition,标"事件 / 条件"
  • 自循环 = 状态自身保持
  • 暗色 grid + 等宽字体(沿用视觉系统)

适用范围

  • 业务对象生命周期(订单 / 文档 / 工单)
  • 协议 / 连接状态
  • 工作流 / 审批状态
  • UI 组件 / 交互状态
  • 设备 / 会话 / 任务状态

何时使用

  • 用户提到 "状态机 / state machine / 生命周期 / lifecycle / state diagram / 状态转移"
  • 用户希望「state + transition」UML 状态图样式
  • 用户接受位图

不要使用:

  • 用户要的是「业务流程图(含决策、动作)」 → 用 technical-diagrams/flowchart-decision.md
  • 用户要的是「时序图」 → 用 technical-diagrams/sequence-diagram.md

缺失信息优先提问顺序

  1. 状态机名称("订单状态机 / TCP 状态机")
  2. 起始状态(一般唯一)+ 终止状态(可多个)
  3. 中间状态列表(建议 4-12 个,超过考虑分子状态机)
  4. 转换:每条转换的"源状态 → 目标状态 + 触发事件 + 守卫条件 + action"
  5. 是否有自循环
  6. 是否需要 composite state(嵌套状态)
  7. 比例(默认 4:3 或 16:9 横版)

主模板:标准 UML 状态机图

📖 描述

整张图以起始伪状态(实心圆)开始,经过若干状态节点(圆角矩形)和转换箭头(标事件)流转,最终到终止状态(靶心)。状态节点可有自循环(如 "retry" 自循环)。

📝 提示词

{
  "type": "工程感状态机 / 生命周期图(UML state diagram)",
  "goal": "生成一张状态机图作为业务文档 / 协议规范 / 教学配图",
  "canvas": {
    "aspect_ratio": "{argument name=\"aspect_ratio\" default=\"16:9\"}",
    "background": "deep slate #0F172A with subtle 1px grid #1E293B at 32px spacing",
    "outer_padding": "60px"
  },
  "title_strip": {
    "title": "{argument name=\"title\" default=\"Order Lifecycle State Machine\"}",
    "subtitle": "{argument name=\"subtitle\" default=\"e-commerce order from creation to completion\"}",
    "position": "top-left, JetBrains Mono / SF Mono, light gray"
  },
  "states": {
    "count": "{argument name=\"state_count\" default=\"7\"}",
    "items": [
      { "id": "S0", "type": "initial", "label": "" },
      { "id": "S1", "type": "state", "label": "Pending\\nPayment", "category": "active" },
      { "id": "S2", "type": "state", "label": "Paid", "category": "active" },
      { "id": "S3", "type": "state", "label": "Shipped", "category": "active" },
      { "id": "S4", "type": "state", "label": "Completed", "category": "success_terminal" },
      { "id": "S5", "type": "state", "label": "Cancelled", "category": "fail_terminal" },
      { "id": "S6", "type": "state", "label": "Refunded", "category": "fail_terminal" },
      { "id": "ST", "type": "final", "label": "" }
    ]
  },
  "state_style": {
    "initial": {
      "shape": "filled solid circle, ~16px diameter",
      "color": "cyan #22D3EE solid"
    },
    "final": {
      "shape": "concentric double circle (bullseye), outer ~18px, inner solid 10px",
      "color": "rose #FB7185"
    },
    "state": {
      "shape": "rounded rectangle, corner radius 12px (more rounded than process), 160×72px typical",
      "fill": "category color × 12% opacity",
      "border": "1.5px solid in category color",
      "label": "state name in mono 12pt, centered, light text on dark fill",
      "optional_internal_label": "可在 state 内部底部加小字 'entry / action' / 'do / activity' / 'exit / cleanup'(UML extension)"
    }
  },
  "category_color_map": {
    "active": "emerald #34D399",
    "waiting": "amber #FBBF24",
    "success_terminal": "blue #60A5FA",
    "fail_terminal": "rose #FB7185",
    "error": "rose #FB7185",
    "neutral": "slate #94A3B8"
  },
  "transitions": {
    "items": [
      { "from": "S0", "to": "S1", "label": "create()" },
      { "from": "S1", "to": "S2", "label": "pay() [valid card]" },
      { "from": "S1", "to": "S5", "label": "timeout / cancel()" },
      { "from": "S2", "to": "S3", "label": "ship()" },
      { "from": "S2", "to": "S6", "label": "refund() [user request]" },
      { "from": "S3", "to": "S4", "label": "deliver() [confirmed]" },
      { "from": "S3", "to": "S6", "label": "return() [defect]" },
      { "from": "S4", "to": "ST", "label": "" },
      { "from": "S5", "to": "ST", "label": "" },
      { "from": "S6", "to": "ST", "label": "" },
      { "from": "S1", "to": "S1", "label": "retry_payment", "self_loop": true }
    ],
    "transition_style": {
      "default": "thin solid arrow 1.5px slate #94A3B8 with filled triangle arrowhead",
      "self_loop": "small loop curving above the state, returning to itself",
      "label_format": "<event> [guard] / <action>,例如 'pay() [valid card] / lock_inventory()',mono 9-10pt 标在边的中间,背景与 canvas 融合避免重叠"
    },
    "rule_routing": "尽量正交或 ≤ 30° 斜线,避免边穿过节点"
  },
  "composite_states": {
    "enabled": "{argument name=\"composite_enabled\" default=\"false\"}",
    "rule": "if true, can group sub-states inside a larger rounded rectangle labeled 'Active' / 'Suspended' etc.; sub-states are 'state' type nested within the composite border"
  },
  "legend": {
    "enabled": true,
    "position": "bottom-right",
    "content": "category color → meaning (active / terminal-success / terminal-fail / error),shape → role (initial filled circle / final bullseye / state rectangle),self-loop notation",
    "style": "small panel, semi-transparent bg, mono 10pt"
  },
  "constraints": {
    "must_keep": [
      "initial 是实心圆 / final 是靶心,不混用",
      "状态节点统一形状(圆角矩形)和尺寸基线",
      "transitions 必有 label(除非进 final)",
      "guard 条件用 [...] 括起来",
      "action 用 / 分隔",
      "自循环用 loop 形而非直线",
      "category 颜色一致(不要把 success 用红、fail 用绿)",
      "暗色 grid + 等宽字体",
      "legend 必画"
    ],
    "avoid": [
      "用菱形 / 平行四边形当 state(混淆为流程图)",
      "transitions 没有 label",
      "把 final 状态画成普通圆角矩形",
      "guard / action 语法不规范(漏 [] 或 /)",
      "状态 > 12 个(拥挤;考虑 composite state 或拆分)",
      "用 emoji 当 state 图标",
      "用 3D / 渐变 / 玻璃质感",
      "声称这是可编辑 SVG"
    ]
  }
}

参数策略

  • 必问:title、起始状态、终止状态、中间状态列表、所有 transitions(含 from/to/label)
  • 可默认:background(暗色 grid)、category_color_map、legend_enabled(true)
  • 可随机:状态节点摆放位置(基于状态间转换关系自动布局,使边交叉最少)

自动补全策略

  • 用户给"订单状态机"但没给细节 → 用 default 7 状态版(待支付 / 已支付 / 已发货 / 已完成 / 已取消 / 已退款)
  • 用户没说 guard / action → label 仅写 event 名
  • 用户给状态但没给 transitions → 反问关键转换(不能瞎编业务规则)
  • 用户说"状态太多" → 启用 composite_enabled + 用 composite 包围相关状态
  • 用户说要 light 模式 → 用变体 1

变体 1:浅色 Light 状态机

{
  "modify": {
    "background": "warm off-white #F8FAFC + faint grid #E2E8F0",
    "state_fill": "category color × 8% opacity",
    "state_border": "1.5px solid (deeper shade for white bg)",
    "label_color": "deep slate #0F172A",
    "transition_color": "slate #475569",
    "vibe": "白底文档 / 印刷版"
  }
}

变体 2:协议状态机(TCP / WebSocket / HTTP cache)

{
  "modify": {
    "title_format": "<protocol> State Machine(如 TCP State Machine)",
    "state_label_emphasis": "用大写 / 协议规范术语(如 LISTEN / SYN_SENT / ESTABLISHED / TIME_WAIT)",
    "transition_label_emphasis": "用'触发包 / 发送包'格式:例如 'recv: SYN / send: SYN+ACK'",
    "use_case": "网络协议教学、规范文档、面试准备资料"
  }
}

适用:TCP / UDP / WebSocket / HTTP / OAuth 状态描述。

变体 3:UI 组件状态(按钮 / 输入 / 弹窗)

{
  "modify": {
    "title_format": "<Component> Interaction States",
    "state_label_emphasis": "用 UI 状态术语:default / hover / active / focus / disabled / loading / error / success",
    "transition_label_emphasis": "用 UI 事件:mouseenter / click / focus / blur / API resolve / API reject",
    "category_color_map_extra": "default = slate, hover = cyan, active = emerald, disabled = slate desaturated, loading = amber, error = rose, success = blue",
    "use_case": "设计系统文档、组件库 README、设计师 / 开发对齐"
  }
}

适用:设计系统、组件库文档、UI / UX 状态规范。

避免事项

  • 状态节点用菱形 / 平行四边形 → 与流程图混淆
  • transition 没有 event label → 完全失去状态机语义
  • final 状态用普通矩形 → 不符合 UML
  • guard 条件没用 [] → 不规范
  • 用 emoji 当状态图标
  • 状态 > 12 个 → 拥挤,必须拆分或用 composite
  • 自循环画成直线 → 视觉错误
  • success / fail 颜色搞反
  • 把"状态机"做成"流程图"(节点应该是状态,不是动作)
  • 节点 / 边过多导致互相穿透