| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275 |
- <!DOCTYPE html>
- <html lang="zh-CN">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>工序可视化 · 共 1 条</title>
- <style>
- * { box-sizing: border-box; margin: 0; padding: 0; }
- html { scroll-behavior: smooth; }
- body {
- font-family: -apple-system, BlinkMacSystemFont, "PingFang SC",
- "Microsoft YaHei", "Segoe UI", sans-serif;
- background: #f6f7f9;
- color: #18181b;
- line-height: 1.55;
- padding: 0;
- }
- /* 容器:所有 section / header 共享同一宽度,左右边界整齐对齐 */
- .container { width: 100%; margin: 0 auto; }
- /* ========= 整页布局:左侧 sidebar + 右侧 detail ========= */
- .app-layout {
- display: grid;
- grid-template-columns: 320px minmax(0, 1fr);
- gap: 18px;
- align-items: start;
- padding: 18px 18px 64px 18px;
- }
- .sidebar {
- background: #fff;
- border: 1px solid #e4e4e7;
- border-radius: 10px;
- position: sticky;
- top: 18px;
- max-height: calc(100vh - 36px);
- display: flex;
- flex-direction: column;
- overflow: hidden;
- }
- .sidebar-head {
- display: flex; justify-content: space-between; align-items: center;
- gap: 8px;
- padding: 12px 14px;
- border-bottom: 1px solid #e4e4e7;
- }
- .sidebar-title {
- font-size: 13px; font-weight: 700; color: #18181b;
- letter-spacing: 0.04em; text-transform: uppercase;
- flex: 1; min-width: 0;
- white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
- }
- .sidebar-count {
- font-size: 12px; color: #71717a;
- font-family: "SF Mono", "Menlo", "Consolas", monospace;
- white-space: nowrap;
- }
- .sidebar-toggle {
- flex: 0 0 auto;
- width: 26px; height: 26px;
- border-radius: 5px;
- background: transparent;
- border: 1px solid #e4e4e7;
- color: #52525b;
- cursor: pointer;
- display: inline-flex; align-items: center; justify-content: center;
- padding: 0;
- transition: background 0.15s, color 0.15s, transform 0.2s ease;
- }
- .sidebar-toggle:hover { background: #f4f4f5; color: #18181b; }
- .sidebar-toggle:active { transform: scale(0.94); }
- .sidebar-toggle svg { width: 14px; height: 14px; display: block; }
- /* ========= 折叠态 ========= */
- .app-layout.sidebar-collapsed {
- grid-template-columns: 84px minmax(0, 1fr);
- }
- .app-layout.sidebar-collapsed .sidebar-title,
- .app-layout.sidebar-collapsed .sidebar-count {
- display: none;
- }
- .app-layout.sidebar-collapsed .sidebar-head {
- justify-content: center;
- padding: 10px 8px;
- }
- .app-layout.sidebar-collapsed .sidebar-toggle {
- transform: rotate(180deg); /* 箭头反向 → 指向"展开" */
- }
- .app-layout.sidebar-collapsed .sidebar-toggle:active {
- transform: rotate(180deg) scale(0.94);
- }
- .app-layout.sidebar-collapsed .sidebar-list {
- padding: 6px;
- }
- .app-layout.sidebar-collapsed .sidebar-item {
- justify-content: center;
- padding: 5px;
- gap: 0;
- }
- .app-layout.sidebar-collapsed .sidebar-item .meta {
- display: none;
- }
- .app-layout.sidebar-collapsed .sidebar-item .cover {
- flex: 0 0 60px;
- width: 60px; height: 60px;
- }
- .sidebar-list {
- overflow-y: auto;
- padding: 8px;
- flex: 1;
- scrollbar-width: thin;
- scrollbar-color: #d4d4d8 transparent;
- }
- .sidebar-list::-webkit-scrollbar { width: 8px; }
- .sidebar-list::-webkit-scrollbar-thumb { background: #d4d4d8; border-radius: 4px; }
- .sidebar-list::-webkit-scrollbar-thumb:hover { background: #a1a1aa; }
- .sidebar-item {
- display: flex;
- gap: 10px;
- padding: 9px;
- border-radius: 8px;
- cursor: pointer;
- text-decoration: none;
- color: inherit;
- align-items: flex-start;
- transition: background 0.15s, border-color 0.15s;
- border: 1px solid transparent;
- margin-bottom: 4px;
- }
- .sidebar-item:hover { background: #f4f4f5; }
- .sidebar-item.active {
- background: #eef2ff;
- border-color: #c7d2fe;
- }
- .sidebar-item .cover {
- flex: 0 0 56px;
- width: 56px; height: 56px;
- border-radius: 6px;
- overflow: hidden;
- background: #f4f4f5;
- border: 1px solid #e4e4e7;
- display: flex; align-items: center; justify-content: center;
- color: #a1a1aa;
- font-size: 11px;
- }
- .sidebar-item .cover img {
- width: 100%; height: 100%; object-fit: cover; display: block;
- }
- .sidebar-item .meta {
- flex: 1; min-width: 0;
- display: flex; flex-direction: column; gap: 4px;
- }
- .sidebar-item .item-title {
- font-size: 13px;
- font-weight: 500;
- line-height: 1.4;
- color: #18181b;
- display: -webkit-box;
- -webkit-line-clamp: 2;
- -webkit-box-orient: vertical;
- overflow: hidden;
- word-break: break-word;
- }
- .sidebar-item.active .item-title { color: #3730a3; font-weight: 600; }
- .sidebar-item .item-meta {
- font-size: 11px;
- color: #71717a;
- display: flex; gap: 6px; align-items: center;
- }
- .sidebar-item .item-status {
- padding: 1px 7px;
- border-radius: 4px;
- font-weight: 600;
- font-size: 10px;
- }
- .sidebar-item .item-steps {
- font-family: "SF Mono", "Menlo", "Consolas", monospace;
- }
- .detail {
- min-width: 0; /* 让里面的横向滚动条正确生效 */
- }
- .detail .workflow-panel + .workflow-panel { margin-top: 0; }
- .detail .workflow-panel[hidden] { display: none; }
- @media (max-width: 960px) {
- .app-layout {
- grid-template-columns: 1fr;
- }
- .sidebar {
- position: static;
- max-height: 280px;
- }
- }
- /* 内部长正文需要可读宽度,避免占满整个表格的横向区域 */
- .body-text { max-width: 1100px; }
- .mono { font-family: "SF Mono", "Menlo", "Consolas", monospace; font-size: 0.9em; }
- .dim { color: #71717a; }
- /* 顶部 —— 左 padding 与下方 .card 的内边距对齐,
- * 让 h1 文字与各卡片标题("原始内容" / "完整工序序列" / "工序摘要")左对齐 */
- .page-header { margin-bottom: 22px; padding: 0 28px; }
- .page-header h1 {
- font-size: 24px; font-weight: 700; color: #18181b; margin-bottom: 6px;
- letter-spacing: -0.01em;
- }
- .page-header .meta {
- display: flex; gap: 14px; font-size: 13px; align-items: center; flex-wrap: wrap;
- }
- .status {
- padding: 3px 12px; border-radius: 999px;
- font-weight: 600; font-size: 12px;
- }
- .status-finalized { background: #d1fae5; color: #065f46; }
- .status-in_progress { background: #fef3c7; color: #92400e; }
- /* 卡片 */
- .card {
- background: #fff;
- border: 1px solid #e4e4e7;
- border-radius: 10px;
- padding: 20px 24px;
- margin-bottom: 18px;
- }
- .card h2 {
- font-size: 12px; font-weight: 700;
- color: #71717a; margin-bottom: 14px;
- letter-spacing: 0.08em; text-transform: uppercase;
- }
- /* 原始内容 */
- .source-title { font-size: 16px; font-weight: 500; line-height: 1.5; color: #18181b; }
- .source-body { margin-top: 10px; }
- .source-body summary {
- cursor: pointer; color: #71717a; font-size: 13px; padding: 4px 0; user-select: none;
- }
- .source-body summary:hover { color: #2563eb; }
- .body-text {
- white-space: pre-wrap; background: #f4f4f5; padding: 14px; border-radius: 6px;
- font-size: 13px; margin-top: 8px; max-height: 320px; overflow-y: auto;
- color: #3f3f46; line-height: 1.7;
- }
- .image-strip {
- display: flex;
- flex-wrap: nowrap; /* 强制单行 */
- gap: 8px;
- margin-top: 14px;
- overflow-x: auto; /* 单行 + 横向滚动 */
- overflow-y: hidden;
- padding-bottom: 8px; /* 给滚动条留空 */
- scrollbar-width: thin;
- scrollbar-color: #d4d4d8 transparent;
- }
- .image-strip::-webkit-scrollbar { height: 8px; }
- .image-strip::-webkit-scrollbar-track { background: transparent; }
- .image-strip::-webkit-scrollbar-thumb {
- background: #d4d4d8; border-radius: 4px;
- }
- .image-strip::-webkit-scrollbar-thumb:hover { background: #a1a1aa; }
- .image-strip .thumb {
- flex: 0 0 auto;
- position: relative;
- width: 96px; /* 3:4 → 96 × 128 */
- height: 128px;
- border-radius: 6px;
- overflow: hidden;
- border: 1px solid #e4e4e7;
- background: #f4f4f5;
- cursor: pointer;
- padding: 0;
- transition: transform 0.15s, box-shadow 0.15s, border-color 0.15s;
- }
- .image-strip .thumb:hover {
- transform: translateY(-2px);
- box-shadow: 0 4px 12px rgba(0,0,0,0.10);
- border-color: #a1a1aa;
- }
- .image-strip .thumb:focus-visible {
- outline: 2px solid #2563eb;
- outline-offset: 2px;
- }
- .image-strip .thumb img {
- width: 100%;
- height: 100%;
- object-fit: cover; /* 裁剪以适配 3:4 */
- display: block;
- }
- .thumb-label {
- position: absolute; bottom: 0; left: 0; right: 0;
- background: linear-gradient(transparent, rgba(0,0,0,0.65));
- color: #fff;
- font-size: 10.5px; padding: 8px 4px 3px; text-align: center;
- font-family: "SF Mono", "Menlo", "Consolas", monospace;
- pointer-events: none;
- }
- /* ========== Lightbox ========== */
- .lightbox {
- position: fixed; inset: 0;
- background: rgba(0,0,0,0.88);
- z-index: 1000;
- display: flex; align-items: center; justify-content: center;
- user-select: none;
- -webkit-tap-highlight-color: transparent;
- animation: lb-fade-in 0.18s ease-out;
- }
- .lightbox[hidden] { display: none; }
- @keyframes lb-fade-in {
- from { background: rgba(0,0,0,0); }
- to { background: rgba(0,0,0,0.88); }
- }
- .lb-stage {
- max-width: 92vw;
- max-height: 84vh;
- display: flex; align-items: center; justify-content: center;
- }
- .lb-stage img {
- max-width: 100%;
- max-height: 100%;
- display: block;
- object-fit: contain;
- border-radius: 4px;
- box-shadow: 0 12px 40px rgba(0,0,0,0.5);
- animation: lb-pop 0.2s ease-out;
- }
- @keyframes lb-pop {
- from { opacity: 0; transform: scale(0.97); }
- to { opacity: 1; transform: scale(1); }
- }
- .lb-btn {
- position: absolute;
- background: rgba(255,255,255,0.10);
- color: #fff;
- border: 1px solid rgba(255,255,255,0.18);
- cursor: pointer;
- font-family: -apple-system, sans-serif;
- line-height: 1;
- display: flex; align-items: center; justify-content: center;
- transition: background 0.15s, transform 0.1s;
- padding: 0;
- }
- .lb-btn:hover { background: rgba(255,255,255,0.22); }
- .lb-btn:active { transform: scale(0.96); }
- .lb-close {
- top: 18px; right: 18px;
- width: 42px; height: 42px;
- border-radius: 50%;
- font-size: 22px; font-weight: 300;
- }
- .lb-prev, .lb-next {
- top: 50%;
- transform: translateY(-50%);
- width: 50px; height: 80px;
- border-radius: 8px;
- font-size: 34px;
- font-weight: 200;
- }
- .lb-prev:hover, .lb-next:hover { transform: translateY(-50%) scale(1); }
- .lb-prev:active, .lb-next:active { transform: translateY(-50%) scale(0.96); }
- .lb-prev { left: 18px; }
- .lb-next { right: 18px; }
- .lb-footer {
- position: absolute; bottom: 18px; left: 0; right: 0;
- text-align: center;
- color: rgba(255,255,255,0.75);
- font-size: 13px;
- pointer-events: none;
- display: flex; flex-direction: column; gap: 4px;
- }
- #lb-counter {
- font-family: "SF Mono", "Menlo", "Consolas", monospace;
- font-weight: 600;
- color: #fff;
- }
- .lb-hint { font-size: 11px; color: rgba(255,255,255,0.5); }
- @media (max-width: 720px) {
- .lb-prev, .lb-next { width: 40px; height: 60px; font-size: 26px; }
- .lb-close { top: 12px; right: 12px; width: 36px; height: 36px; }
- .lb-hint { display: none; }
- }
- /* ========= 工序表 ========= */
- .workflow-card { padding: 0; overflow: hidden; }
- .workflow-card .card-head {
- padding: 16px 24px 12px;
- border-bottom: 1px solid #e4e4e7;
- }
- .workflow-card .card-head h2 { margin: 0; }
- .table-wrap { overflow-x: auto; }
- table.workflow {
- width: 100%;
- border-collapse: separate;
- border-spacing: 0;
- font-size: 13px;
- min-width: 1760px;
- background: #fff;
- }
- /* 表头:两层 */
- table.workflow thead th {
- font-weight: 600;
- text-align: center;
- vertical-align: middle;
- padding: 9px 10px;
- background: #1f2937;
- color: #f1f5f9;
- border-right: 1px solid #374151;
- border-bottom: 1px solid #374151;
- position: sticky; top: 0; z-index: 3;
- white-space: nowrap;
- font-size: 12.5px;
- letter-spacing: 0.02em;
- }
- table.workflow thead th:last-child { border-right: none; }
- table.workflow thead .head-l1 th.col-grp-in {
- background: #4338ca;
- color: #eef2ff;
- }
- table.workflow thead .head-l1 th.col-grp-out {
- background: #b45309;
- color: #fef3c7;
- }
- table.workflow thead .head-l2 th {
- top: 38px;
- background: #374151;
- font-weight: 500;
- font-size: 12px;
- }
- table.workflow thead .head-l2 th.col-sub-in { background: #4f46e5; color: #eef2ff; }
- table.workflow thead .head-l2 th.col-sub-out { background: #c2410c; color: #fff7ed; }
- /* 表体单元格 */
- table.workflow tbody td {
- border-right: 1px solid #e4e4e7;
- border-bottom: 1px solid #e4e4e7;
- padding: 10px 12px;
- vertical-align: top;
- background: #fff;
- word-break: break-word;
- font-size: 13px;
- line-height: 1.55;
- }
- table.workflow tbody td:last-child { border-right: none; }
- /* 步骤之间的清晰分割:每组的第一行加粗顶边(着色) */
- table.workflow tbody tr.step-row td {
- border-top: 3px solid var(--c);
- }
- table.workflow tbody tr.step-row-cont td {
- border-top: 1px dashed #e4e4e7;
- }
- table.workflow tbody tr:first-child.step-row td { border-top: none; }
- /* 步骤号单元格:彩色背景小徽章 */
- td.col-step-id {
- text-align: center;
- font-weight: 700;
- font-size: 18px;
- width: 56px;
- color: #fff;
- background: var(--c) !important;
- border-left: none;
- vertical-align: middle;
- }
- td.col-step-name {
- color: #18181b;
- min-width: 130px;
- max-width: 180px;
- }
- /* ========= 左侧 sticky 列:步骤id + 步骤名称 ========= */
- /* tbody:sticky 左侧固定 */
- table.workflow tbody td.col-step-id {
- position: sticky;
- left: 0;
- z-index: 2;
- }
- table.workflow tbody td.col-step-name {
- position: sticky;
- left: 56px; /* 与 col-step-id 的 width 对齐 */
- z-index: 2;
- background: #fff; /* 滚动时遮住底下内容 */
- /* 右侧投影,提示这是 sticky 列边界 */
- box-shadow: 4px 0 6px -4px rgba(0,0,0,0.10);
- }
- /* thead:sticky-left + sticky-top 角落(z-index 高于普通 sticky-top) */
- table.workflow thead .head-l1 th:nth-child(1) {
- left: 0;
- z-index: 4;
- }
- table.workflow thead .head-l1 th:nth-child(2) {
- left: 56px;
- z-index: 4;
- box-shadow: 4px 0 6px -4px rgba(0,0,0,0.18);
- }
- td.col-step-name .step-name-text {
- font-weight: 600;
- font-size: 13.5px;
- line-height: 1.4;
- }
- td.col-step-actions {
- min-width: 100px;
- max-width: 150px;
- vertical-align: top;
- font-size: 12px;
- }
- td.col-step-roles {
- min-width: 100px;
- max-width: 150px;
- vertical-align: top;
- font-size: 12px;
- }
- td.col-step-purposes {
- min-width: 110px;
- max-width: 170px;
- vertical-align: top;
- font-size: 12px;
- }
- td.col-step-source {
- color: #52525b;
- font-size: 12px;
- line-height: 1.55;
- min-width: 180px;
- max-width: 260px;
- background: #fafafa; /* 视觉上从主区分开(已移到最后一列) */
- }
- /* 输入列分组淡背景 */
- td.col-in-modality, td.col-in-category, td.col-in-src, td.col-in-value { background: #fafbfd; }
- td.col-in-modality {
- width: 60px;
- text-align: center;
- vertical-align: middle;
- padding: 6px 4px;
- }
- td.col-in-category {
- width: 110px;
- text-align: center;
- vertical-align: middle;
- padding: 6px 8px;
- font-size: 11.5px;
- color: #475569;
- }
- td.col-in-src {
- width: 130px;
- white-space: nowrap;
- }
- td.col-in-value {
- color: #18181b;
- min-width: 220px;
- }
- /* 工具列:tool_name(粗、产品名)+ tool_method(细、mono、参数) */
- td.col-tool {
- background: #f5f5fa;
- min-width: 160px;
- max-width: 220px;
- word-break: break-word;
- font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", sans-serif;
- }
- td.col-tool .tool-name {
- font-size: 13px;
- font-weight: 600;
- color: #312e81;
- line-height: 1.35;
- }
- td.col-tool .tool-method {
- font-family: "SF Mono", "Menlo", "Consolas", monospace;
- font-size: 11px;
- color: #6366f1;
- line-height: 1.4;
- margin-top: 3px;
- padding-top: 3px;
- border-top: 1px dashed #ddd6fe;
- word-break: break-all;
- }
- td.col-tool .tool-name.empty .empty-val { font-weight: 400; }
- td.col-tool .tool-legacy {
- font-family: "SF Mono", "Menlo", "Consolas", monospace;
- font-size: 12px;
- color: #3730a3;
- word-break: break-all;
- }
- /* 输出列分组淡背景 */
- td.col-out-idx, td.col-out-modality, td.col-out-category, td.col-out-value { background: #fefaf5; }
- td.col-out-idx {
- width: 56px;
- text-align: center;
- vertical-align: middle;
- background: var(--bg) !important;
- }
- td.col-out-modality {
- width: 60px;
- text-align: center;
- vertical-align: middle;
- padding: 6px 4px;
- }
- td.col-out-category {
- width: 110px;
- text-align: center;
- vertical-align: middle;
- padding: 6px 8px;
- font-size: 11.5px;
- color: #475569;
- }
- td.col-out-value {
- color: #18181b;
- min-width: 220px;
- }
- /* ========== 数组字段渲染(actions / roles / purposes) ========== */
- .tag-list {
- display: flex; flex-wrap: wrap; gap: 4px;
- }
- .tag {
- display: inline-block;
- padding: 1px 7px;
- border-radius: 4px;
- font-size: 11px;
- font-weight: 500;
- line-height: 1.5;
- white-space: nowrap;
- }
- .tag-action {
- background: #e0e7ff;
- color: #3730a3;
- border: 1px solid #c7d2fe;
- }
- .tag-role {
- background: #ecfeff;
- color: #155e75;
- border: 1px solid #a5f3fc;
- }
- .tag-purpose {
- background: #f5f3ff;
- color: #6d28d9;
- border: 1px solid #ddd6fe;
- }
- /* 类型 pill(category 单元格用) */
- .category-pill {
- display: inline-block;
- padding: 2px 8px;
- border-radius: 4px;
- background: #f1f5f9;
- border: 1px solid #cbd5e1;
- color: #334155;
- font-size: 11px;
- font-weight: 500;
- line-height: 1.5;
- white-space: nowrap;
- max-width: 100%;
- overflow: hidden;
- text-overflow: ellipsis;
- }
- /* 类型图标(输入类型 / 输出类型 共用) */
- .type-icon {
- display: inline-flex;
- align-items: center;
- justify-content: center;
- width: 30px; height: 30px;
- border-radius: 7px;
- color: var(--c);
- background: var(--bg);
- border: 1px solid var(--bd);
- vertical-align: middle;
- }
- .type-icon svg { width: 17px; height: 17px; display: block; }
- .type-fallback {
- display: inline-block;
- font-size: 11px;
- color: #475569;
- padding: 2px 8px;
- border-radius: 4px;
- background: #f1f5f9;
- border: 1px solid #cbd5e1;
- font-weight: 500;
- max-width: 60px;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
- .sr-only {
- position: absolute; width: 1px; height: 1px;
- padding: 0; margin: -1px; overflow: hidden;
- clip: rect(0,0,0,0); white-space: nowrap; border: 0;
- }
- /* 空单元格 */
- .empty-cell { background: #fafafa !important; }
- .empty-val { color: #d4d4d8; font-style: italic; font-size: 12px; }
- /* ========== Chip ========== */
- .chip {
- display: inline-flex; align-items: center; gap: 5px;
- border-radius: 5px;
- font-size: 11.5px; font-weight: 500;
- text-decoration: none;
- vertical-align: middle;
- line-height: 1.4;
- padding: 2px 6px 2px 8px;
- }
- .chip-tag { font-weight: 600; }
- .chip-idx {
- display: inline-flex; align-items: center; justify-content: center;
- font-size: 13px; line-height: 1;
- }
- .chip-type {
- display: inline-flex; align-items: center; justify-content: center;
- width: 16px; height: 16px;
- border-radius: 3px;
- background: rgba(255,255,255,0.6);
- margin-left: 1px;
- }
- .chip-type svg { width: 11px; height: 11px; display: block; }
- .ref-chip {
- background: var(--bg); color: var(--c);
- border: 1px solid var(--bd);
- cursor: pointer;
- transition: transform 0.1s, box-shadow 0.1s, outline 0.1s;
- outline: 2px solid transparent;
- }
- .ref-chip .chip-type { color: var(--c); }
- .ref-chip:hover {
- transform: translateY(-1px);
- box-shadow: 0 2px 6px rgba(0,0,0,0.10);
- }
- .ref-chip:hover .chip-tag { text-decoration: underline; }
- /* 兄弟联动高亮:同 step 内引用同一 source step 的 chip */
- .ref-chip.hl-sibling {
- outline: 2px solid var(--c);
- outline-offset: 1px;
- }
- .init-chip {
- background: #f4f4f5; color: #52525b;
- border: 1px solid #d4d4d8;
- }
- .orphan-chip {
- background: #fef2f2; color: #b91c1c;
- border: 1px solid #fecaca;
- }
- /* 输入区左侧"来源色条":把同 source step 的连续多行视觉拢起来 */
- td.col-in-type.has-src-stripe {
- position: relative;
- }
- td.col-in-type.has-src-stripe::before {
- content: "";
- position: absolute;
- top: 0; bottom: 0; left: 0;
- width: 3px;
- background: var(--src-c, transparent);
- opacity: 0.85;
- }
- /* 输出# 单元格里的彩色圈号 */
- .out-idx-badge {
- display: inline-flex; align-items: center; justify-content: center;
- font-size: 18px; line-height: 1;
- color: var(--c); font-weight: 700;
- }
- /* ========== 高亮 / 闪烁 ========== */
- td.hl-target {
- outline: 2px solid var(--c);
- outline-offset: -2px;
- background: var(--bg) !important;
- }
- @keyframes cell-flash {
- 0%, 30% {
- outline: 3px solid var(--c);
- outline-offset: -3px;
- background: var(--bg);
- }
- 100% { outline: 2px solid transparent; }
- }
- td.hl-flash {
- animation: cell-flash 1.6s ease-out;
- }
- /* 摘要 */
- .summary-card p { color: #3f3f46; line-height: 1.75; font-size: 13.5px; }
- </style>
- </head>
- <body>
- <div class="app-layout">
- <aside class="sidebar">
- <div class="sidebar-head">
- <div class="sidebar-title">工序列表</div>
- <div class="sidebar-count">1 条</div>
- <button type="button" class="sidebar-toggle" aria-label="收起/展开工序列表"
- title="收起/展开工序列表">
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"
- stroke-linecap="round" stroke-linejoin="round">
- <polyline points="15 18 9 12 15 6"></polyline>
- </svg>
- </button>
- </div>
- <div class="sidebar-list">
- <a class="sidebar-item active" href="#panel-6ee74f95d4aa2c810d32d6cf0f833806" data-wid="6ee74f95d4aa2c810d32d6cf0f833806" title="33万播放!豆包+Seedance 2.0做AI短剧,保姆级教程来了 · 6 步 · in_progress"><span class="cover"><img src="https://res.cybertogether.net/crawler/image/fb6599951a28.jpg" alt="封面" loading="lazy" referrerpolicy="no-referrer" /></span><span class="meta"><span class="item-title">33万播放!豆包+Seedance 2.0做AI短剧,保姆级教程来了</span><span class="item-meta"><span class="item-status status-in_progress">in_progress</span><span class="item-steps">6 步</span></span></span></a>
- </div>
- </aside>
- <main class="detail">
-
- <section class="workflow-panel" data-wid="6ee74f95d4aa2c810d32d6cf0f833806" id="panel-6ee74f95d4aa2c810d32d6cf0f833806">
- <header class="page-header">
- <h1>33万播放!豆包+Seedance 2.0做AI短剧,保姆级教程来了</h1>
- <div class="meta">
- <span class="mono dim">6ee74f95d4aa2c810d32d6cf0f833806</span>
- <span class="status status-in_progress">in_progress</span>
- <span class="dim">共 6 步</span>
- </div>
- </header>
- <section class="card source-card">
- <h2>原始内容</h2>
- <details class="source-body">
- <summary>正文(2779 字)— 点击展开</summary>
- <pre class="body-text">Seedance 2.0 出来后,在 AI 短剧、AI 漫剧的玩法,带来了很多新玩法。
- 很多二创的短视频火了,但是涉及到版权,后面限制了 IP 和真人图片视了。
- 那么还能不能玩?
- 行者一直是用 AI 生成的 虚拟人物在做视频的,虽然也会遇到审核问题,但是链条还是通的。
- 前段时间做了两个短剧小视频,数据还可以。
- 真假千金视频号 21 万播放(抖音11万),退婚那条 12 万播放,完播率都在 40-50%。
- 评论区有不少看官表示15秒看不过瘾,在催更,也有不少人希望行者出一期教程。
- 今天这篇文章,就是把我这套豆包+Seedance 2.0 做 AI 短剧的完整流程。
- Seedance2.0真人照片生成限制
- 首先分享下 seedance2.0 绕开真人照片生成视频限制的方法:
- 1.把你的真人照片,用AI重新生成一遍,可以修改衣服,换背景,AI的图片比较好过审
- 2.使用APP的创建分身,适用真人出境
- 3.把你的图片转成手绘电影分镜插画风格,也可以做成三视图,AI更好识别特征
- 4.群友Chiphen 分享的技巧,用校色A B C来代替
- 豆包+Seedance 2.0
- 豆包在节前上线了Seedance 2.0(Fast模型)。
- 选豆包的一个原因是,Seedance 2.0是很强,但是缺点是只能生成15秒视频,如果从完整的短剧角度来说。
- 还需要剧本、分集、人物设定。
- 豆包刚好派上用场了。
- 它能帮你从生成完整的短剧剧本、分集大纲、人物设定,甚至连每一集的台词都给你写好。
- 关键是——
- 豆包 AI 是免费使用的,
- 每天有免费生成额度。
- 对于想入局 AI 短剧但预算有限的朋友来说,这就是最佳组合。
- 第一步:找爆款题材
- 互联网已经多次印证了,曝过的还会曝。
- 之前行者也自己调试了几个剧本,结果肝了一晚上的视频,完全没人看。
- 所以逻辑是,去找已经曝过的题材,然后让AI来优化。
- 我曝的两条 10W+的视频,一条是霸总题材,一条是真假千金题材。
- 都是抖音、快手上已经验证过的爆款类型。
- 第二步:用豆包生成完整剧本
- 行者拿真假千金这个视频来示范。
- 我们使用豆包中,根据这个题材,生成一个完整的剧本。
- 提炼出这个剧情:豪门恩怨,真假千金梗,极致反转,撕绿茶爽文,高定礼服,美艳御姐风。
- 再豆包AI中,输入我们的剧本创作思路:
- 剧本类型:都市爱情
- 总集数:15 集
- 目标受众:通用(可以选男频或女频)
- 点击生成,豆包很快就生成了剧本大纲以及每一集的剧情。
- 接着再让豆包生成每一集的分镜说明、景别、镜头、人物动作和台词。
- 剧本质量直接决定了后面视频的效果。
- 如果豆包生成的剧本有些地方不满意,可以让它重新生成某一集,或者手动修改调整。
- 确认没问题后,把剧本下载下来,准备进入下一步。
- 第三步:设计核心人物形象
- 剧本有了,接下来最重要的是
- 人物形象设计
- 。
- 短剧能不能吸引人,人物颜值和气质占了一半。
- 我还是用豆包生成人物设定:
- 人物设定有了,接下来就是
- 生成人物形象图
- 。
- 苏晚提示词:
- 一张极具时尚感的高清摄影作品。画面中心是一位气质高雅的年轻亚洲女性,留着精致的深色复古卷发,面带温柔自信的微笑。她身着一件洁白的丝绸改良式晚礼服,设计融合了旗袍元素,领口微低,裙身点缀着精美的金色花卉刺绣和精细的蕾丝边。她优雅地提起宽大且带有细密百褶的裙摆,展现出修长的线条和精致的白色刺绣高跟鞋。背景是深红棕色的活动背景墙,上面印有明显的白色品牌标志。脚下是鲜艳的红地毯。光影明亮且柔和,具有专业的人像摄影质感,整体色彩以纯净的白、沉稳的棕和热情的红为主,展现出奢华、高贵且现代的时尚气息。
- 顾
- 晏辰提
- 示词:
- 一张精致的高端时尚人像摄影,镜头中央是一位英俊的年轻亚洲男性,留着蓬松且略显凌乱的黑发,眼神清冷而深邃。他穿着一套极具质感的黑色三件套西装,包括缎面领口的黑色西服、同色马甲和挺括的白色衬衫,系着黑色领带,胸袋中露出一截精致的花纹口袋巾。背景是黄昏时分的都市街景,深蓝色的天幕下,街道上的汽车尾灯和路灯形成梦幻的虚化圆斑(bokeh)。整体色调偏向冷色系,光线柔和地勾勒出男子的面部轮廓,营造出一种优雅、忧郁且富有电影感的氛围。
- 这一步可以用你习惯的工具:豆包、Seedream 4.5、MJ V7、Nano Banana Pro 都行。
- 我会给每个核心角色生成 2-3 张不同角度、不同表情的参考图,后面做视频时直接用。
- 第四步:生成分镜视频
- 剧本和角色都完成了,接下来就开始生成视频了。
- Seedance 2.0 的人物参考功能和分镜控制能力,能高度还原人物和场景的一致性。
- 操作步骤:
- 打开豆包 APP(网页版只能上传一张参考图,APP 可以上传多张)
- 选择 Seedance 2.0 功能
- 上传人物参考图
- 输入这一集的剧情提示词(从豆包生成的剧本里复制)
- 点击生成,等待几分钟。
- 假千金装可怜、真千金霸气打脸、最后女王加冕,整个剧情流畅自然,口型完美对上,音效也恰到好处。
- 当然,生成过程中也会遇到生成失败的情况,看下提示词有没有违规。
- 第五步:剪辑合成
- 单个 15 秒的视频确实有点短,看得不够过瘾。可以把多个15秒的视频拼接起来。
- 把视频导入到剪映中,调整速度,剪掉一些镜头,添加字幕。
- 我踩过的坑和经验总结
- 行者在关注AI 短剧一段时间了,我也踩过不少坑。这里分享几个关键经验:
- 1.剧本一定要有“钩子”
- 每一集结尾必须留悬念,让观众想看下一集。比如:“就在这时,一个神秘男人出现了……”“她不知道的是,更大的阴谋正在等着她……”
- 2.人物形象要稳定
- 同一个角色,在不同视频里,脸型、发型、穿搭风格要保持一致。
- 3.完播率比播放量更重要
- 我那两条 10W+的视频,完播率都在 40-50%。平台会根据完播率推荐你的视频。所以宁可做短一点,也要保证观众看完。
- 4.多测试,多迭代
- 不要指望一次就爆。我做了十几条视频,才摸索出这套玩法。多测试不同题材、不同风格,看数据反馈,不断优化。
- 5.合规很重要
- 不要用真人 IP 二创,不要用明星脸,不要涉及敏感话题。用 AI 生成的虚拟人物,相对安全很多。
- 最后说两句
- AI 短剧这条赛道,现在还处于红利期。
- 制作门槛确实槛高,想爆也不容易。
- Seedance 2.0出来后,在内容创作方面,是提效很多,流程跑通了,一天做几集小短片完全没问题。
- 豆包+Seedance 2.0 这套组合,我已经验证过了,好用还免费。
- 当然,工具只是辅助,核心还是
- 内容
- 。
- 你得懂什么题材受欢迎,什么剧情能抓住观众,什么节奏能提高完播率。
- 这些都需要你去实战、去测试、去总结。
- 我把我的经验都写在这篇文章里了。接下来,就看你的了。
- #豆包
-
- #AI视频
-
- #
- Seedance
-
- #AI短剧
-
- #AI教程</pre>
- </details>
- <div class="image-strip">
- <button type="button" class="thumb" data-idx="0" aria-label="查看图1(大图)"><img src="https://res.cybertogether.net/crawler/image/fb6599951a28.jpg" alt="图1" loading="lazy" referrerpolicy="no-referrer" /><span class="thumb-label">图1</span></button>
- <button type="button" class="thumb" data-idx="1" aria-label="查看图2(大图)"><img src="https://res.cybertogether.net/crawler/image/342672a2f5e9.jpg" alt="图2" loading="lazy" referrerpolicy="no-referrer" /><span class="thumb-label">图2</span></button>
- <button type="button" class="thumb" data-idx="2" aria-label="查看图3(大图)"><img src="https://res.cybertogether.net/crawler/image/cb4a01876352.jpg" alt="图3" loading="lazy" referrerpolicy="no-referrer" /><span class="thumb-label">图3</span></button>
- <button type="button" class="thumb" data-idx="3" aria-label="查看图4(大图)"><img src="https://res.cybertogether.net/crawler/image/a7759682adca.jpg" alt="图4" loading="lazy" referrerpolicy="no-referrer" /><span class="thumb-label">图4</span></button>
- <button type="button" class="thumb" data-idx="4" aria-label="查看图5(大图)"><img src="https://res.cybertogether.net/crawler/image/1f3a4c926956.jpg" alt="图5" loading="lazy" referrerpolicy="no-referrer" /><span class="thumb-label">图5</span></button>
- <button type="button" class="thumb" data-idx="5" aria-label="查看图6(大图)"><img src="https://res.cybertogether.net/crawler/image/303c46445415.jpg" alt="图6" loading="lazy" referrerpolicy="no-referrer" /><span class="thumb-label">图6</span></button>
- <button type="button" class="thumb" data-idx="6" aria-label="查看图7(大图)"><img src="https://res.cybertogether.net/crawler/image/ad26d612237c.jpg" alt="图7" loading="lazy" referrerpolicy="no-referrer" /><span class="thumb-label">图7</span></button>
- <button type="button" class="thumb" data-idx="7" aria-label="查看图8(大图)"><img src="https://res.cybertogether.net/crawler/image/09f95b406eec.jpg" alt="图8" loading="lazy" referrerpolicy="no-referrer" /><span class="thumb-label">图8</span></button>
- <button type="button" class="thumb" data-idx="8" aria-label="查看图9(大图)"><img src="https://res.cybertogether.net/crawler/image/fbbe2fd07e40.jpg" alt="图9" loading="lazy" referrerpolicy="no-referrer" /><span class="thumb-label">图9</span></button>
- <button type="button" class="thumb" data-idx="9" aria-label="查看图10(大图)"><img src="https://res.cybertogether.net/crawler/image/c5c1fae9591a.jpg" alt="图10" loading="lazy" referrerpolicy="no-referrer" /><span class="thumb-label">图10</span></button>
- </div>
- </section>
- <section class="card workflow-card">
- <div class="card-head"><h2>完整工序序列</h2></div>
- <div class="table-wrap">
- <table class="workflow">
- <thead>
- <tr class="head-l1">
- <th rowspan="2">步骤id</th>
- <th rowspan="2">步骤名称</th>
- <th rowspan="2">动作</th>
- <th rowspan="2">作用</th>
- <th rowspan="2">目的</th>
- <th colspan="4" class="col-grp-in">步骤输入</th>
- <th rowspan="2">工具</th>
- <th colspan="4" class="col-grp-out">步骤输出</th>
- <th rowspan="2">步骤来源</th>
- </tr>
- <tr class="head-l2">
- <th class="col-sub-in">输入模态</th>
- <th class="col-sub-in">输入类型</th>
- <th class="col-sub-in">输入来源</th>
- <th class="col-sub-in">输入value</th>
- <th class="col-sub-out">#</th>
- <th class="col-sub-out">输出模态</th>
- <th class="col-sub-out">输出类型</th>
- <th class="col-sub-out">输出value</th>
- </tr>
- </thead>
- <tbody>
- <tr class="step-row" style="--c: #4f46e5; --bg: #eef2ff;"><td class="col-step-id" rowspan="1" style="--c: #4f46e5; --bg: #eef2ff">1</td><td class="col-step-name" rowspan="1"><div class="step-name-text">分析爆款题材并生成剧本大纲</div></td><td class="col-step-actions" rowspan="1"><div class="tag-list"><span class="tag tag-action">分析</span><span class="tag tag-action">生成</span></div></td><td class="col-step-roles" rowspan="1"><div class="tag-list"><span class="tag tag-role">参考收集</span><span class="tag tag-role">输入准备转大纲生成阶段</span></div></td><td class="col-step-purposes" rowspan="1"><div class="tag-list"><span class="tag tag-purpose">完整性</span></div></td><td class="col-in-modality has-src-stripe" style="--src-c: #9ca3af" data-src-key="init"><span class="type-icon" style="--c: #475569; --bg: #f1f5f9; --bd: #cbd5e1;" title="文本" role="img" aria-label="文本"><span class="sr-only">文本</span><svg viewBox="0 0 24 24" fill="currentColor" stroke="none"><path d="M4 5v3.2h6V19h4V8.2h6V5z"/></svg></span></td><td class="col-in-category"><span class="category-pill">脚本创作思路</span></td><td class="col-in-src"><span class="chip init-chip" data-source-init="1" title="初始输入 #1"><span class="chip-tag">初始</span><span class="chip-idx">①</span></span></td><td class="col-in-value">剧本类型:都市爱情;总集数:15 集;核心故事:真假千金梗等内容。</td><td class="col-tool" rowspan="1"><div class="tool-name">豆包</div><div class="tool-method">帮我写作</div></td><td class="col-out-idx" id="wf-6ee74f95d4aa2c810d32d6cf0f833806-step-1-out-1" style="--c: #4f46e5; --bg: #eef2ff; --bd: #c7d2fe;"><span class="out-idx-badge">①</span></td><td class="col-out-modality"><span class="type-icon" style="--c: #475569; --bg: #f1f5f9; --bd: #cbd5e1;" title="文本" role="img" aria-label="文本"><span class="sr-only">文本</span><svg viewBox="0 0 24 24" fill="currentColor" stroke="none"><path d="M4 5v3.2h6V19h4V8.2h6V5z"/></svg></span></td><td class="col-out-category"><span class="category-pill">剧本大纲</span></td><td class="col-out-value">包含 15 集节奏的剧本大纲。</td><td class="col-step-source" rowspan="1">图5 / 正文“第一步”、“第二步”内容</td></tr>
- <tr class="step-row" style="--c: #0d9488; --bg: #f0fdfa;"><td class="col-step-id" rowspan="1" style="--c: #0d9488; --bg: #f0fdfa">2</td><td class="col-step-name" rowspan="1"><div class="step-name-text">细化生成分集脚本与分镜说明</div></td><td class="col-step-actions" rowspan="1"><div class="tag-list"><span class="tag tag-action">生成</span></div></td><td class="col-step-roles" rowspan="1"><div class="tag-list"><span class="tag tag-role">分镜脚本生成阶段</span></div></td><td class="col-step-purposes" rowspan="1"><div class="tag-list"><span class="tag tag-purpose">详细度</span></div></td><td class="col-in-modality has-src-stripe" style="--src-c: #4f46e5" data-src-key="1"><span class="type-icon" style="--c: #475569; --bg: #f1f5f9; --bd: #cbd5e1;" title="文本" role="img" aria-label="文本"><span class="sr-only">文本</span><svg viewBox="0 0 24 24" fill="currentColor" stroke="none"><path d="M4 5v3.2h6V19h4V8.2h6V5z"/></svg></span></td><td class="col-in-category"><span class="category-pill">剧本大纲</span></td><td class="col-in-src"><a class="chip ref-chip" href="#wf-6ee74f95d4aa2c810d32d6cf0f833806-step-1-out-1" data-target="wf-6ee74f95d4aa2c810d32d6cf0f833806-step-1-out-1" data-source-step="1" style="--c: #4f46e5; --bg: #eef2ff; --bd: #c7d2fe;" title="步骤1「分析爆款题材并生成剧本大纲」· 第 ① 输出(未知类型)
- 包含 15 集节奏的剧本大纲。"><span class="chip-tag">步骤1</span></a></td><td class="col-in-value">15 集剧本大纲。</td><td class="col-tool" rowspan="1"><div class="tool-name">豆包</div><div class="tool-method">帮我写作</div></td><td class="col-out-idx" id="wf-6ee74f95d4aa2c810d32d6cf0f833806-step-2-out-1" style="--c: #0d9488; --bg: #f0fdfa; --bd: #99f6e4;"><span class="out-idx-badge">①</span></td><td class="col-out-modality"><span class="type-icon" style="--c: #475569; --bg: #f1f5f9; --bd: #cbd5e1;" title="文本" role="img" aria-label="文本"><span class="sr-only">文本</span><svg viewBox="0 0 24 24" fill="currentColor" stroke="none"><path d="M4 5v3.2h6V19h4V8.2h6V5z"/></svg></span></td><td class="col-out-category"><span class="category-pill">分镜脚本</span></td><td class="col-out-value">每一集的分镜说明、景别、镜头、人物动作和台词。</td><td class="col-step-source" rowspan="1">图6 / 正文“第二步”结尾内容</td></tr>
- <tr class="step-row" style="--c: #e11d48; --bg: #fff1f2;"><td class="col-step-id" rowspan="1" style="--c: #e11d48; --bg: #fff1f2">3</td><td class="col-step-name" rowspan="1"><div class="step-name-text">基于剧本设定核心人物背景特征</div></td><td class="col-step-actions" rowspan="1"><div class="tag-list"><span class="tag tag-action">提取</span><span class="tag tag-action">生成</span></div></td><td class="col-step-roles" rowspan="1"><div class="tag-list"><span class="tag tag-role">人物设定阶段</span></div></td><td class="col-step-purposes" rowspan="1"><div class="tag-list"><span class="tag tag-purpose">角色一致性</span></div></td><td class="col-in-modality has-src-stripe" style="--src-c: #0d9488" data-src-key="2"><span class="type-icon" style="--c: #475569; --bg: #f1f5f9; --bd: #cbd5e1;" title="文本" role="img" aria-label="文本"><span class="sr-only">文本</span><svg viewBox="0 0 24 24" fill="currentColor" stroke="none"><path d="M4 5v3.2h6V19h4V8.2h6V5z"/></svg></span></td><td class="col-in-category"><span class="category-pill">分镜脚本</span></td><td class="col-in-src"><a class="chip ref-chip" href="#wf-6ee74f95d4aa2c810d32d6cf0f833806-step-2-out-1" data-target="wf-6ee74f95d4aa2c810d32d6cf0f833806-step-2-out-1" data-source-step="2" style="--c: #0d9488; --bg: #f0fdfa; --bd: #99f6e4;" title="步骤2「细化生成分集脚本与分镜说明」· 第 ① 输出(未知类型)
- 每一集的分镜说明、景别、镜头、人物动作和台词。"><span class="chip-tag">步骤2</span></a></td><td class="col-in-value">包含人物动作和台词的脚本。</td><td class="col-tool" rowspan="1"><div class="tool-name">豆包</div><div class="tool-method">帮我写作</div></td><td class="col-out-idx" id="wf-6ee74f95d4aa2c810d32d6cf0f833806-step-3-out-1" style="--c: #e11d48; --bg: #fff1f2; --bd: #fecdd3;"><span class="out-idx-badge">①</span></td><td class="col-out-modality"><span class="type-icon" style="--c: #475569; --bg: #f1f5f9; --bd: #cbd5e1;" title="文本" role="img" aria-label="文本"><span class="sr-only">文本</span><svg viewBox="0 0 24 24" fill="currentColor" stroke="none"><path d="M4 5v3.2h6V19h4V8.2h6V5z"/></svg></span></td><td class="col-out-category"><span class="category-pill">人物描述</span></td><td class="col-out-value">苏晚、顾晏辰等核心人物的身份、人设、核心特征。</td><td class="col-step-source" rowspan="1">图7 / 正文“第三步”开头内容</td></tr>
- <tr class="step-row" style="--c: #7c3aed; --bg: #f5f3ff;"><td class="col-step-id" rowspan="1" style="--c: #7c3aed; --bg: #f5f3ff">4</td><td class="col-step-name" rowspan="1"><div class="step-name-text">根据设定生成核心角色参考图集</div></td><td class="col-step-actions" rowspan="1"><div class="tag-list"><span class="tag tag-action">生成业务图集</span></div></td><td class="col-step-roles" rowspan="1"><div class="tag-list"><span class="tag tag-role">参考图集生成阶段</span></div></td><td class="col-step-purposes" rowspan="1"><div class="tag-list"><span class="tag tag-purpose">角色一致性</span></div></td><td class="col-in-modality has-src-stripe" style="--src-c: #9ca3af" data-src-key="init"><span class="type-icon" style="--c: #475569; --bg: #f1f5f9; --bd: #cbd5e1;" title="文本" role="img" aria-label="文本"><span class="sr-only">文本</span><svg viewBox="0 0 24 24" fill="currentColor" stroke="none"><path d="M4 5v3.2h6V19h4V8.2h6V5z"/></svg></span></td><td class="col-in-category"><span class="category-pill">prompt</span></td><td class="col-in-src"><span class="chip init-chip" data-source-init="2" title="初始输入 #2"><span class="chip-tag">初始</span><span class="chip-idx">②</span></span></td><td class="col-in-value">苏晚、顾晏辰等角色的详细高清人像提示词。</td><td class="col-tool" rowspan="1"><div class="tool-name">豆包</div><div class="tool-method">图像生成</div></td><td class="col-out-idx" id="wf-6ee74f95d4aa2c810d32d6cf0f833806-step-4-out-1" style="--c: #7c3aed; --bg: #f5f3ff; --bd: #ddd6fe;"><span class="out-idx-badge">①</span></td><td class="col-out-modality"><span class="type-icon" style="--c: #047857; --bg: #ecfdf5; --bd: #a7f3d0;" title="图片" role="img" aria-label="图片"><span class="sr-only">图片</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round"><rect x="3" y="4" width="18" height="16" rx="2"/><circle cx="8.5" cy="9.5" r="1.5"/><path d="M21 16l-5-5-9 9"/></svg></span></td><td class="col-out-category"><span class="category-pill">人物参考图</span></td><td class="col-out-value">包含苏晚、顾晏辰、林薇薇等角色的多角度表情参考图集。</td><td class="col-step-source" rowspan="1">图8 / 正文“第三步”角色提示词内容</td></tr>
- <tr class="step-row" style="--c: #0284c7; --bg: #f0f9ff;"><td class="col-step-id" rowspan="2" style="--c: #0284c7; --bg: #f0f9ff">5</td><td class="col-step-name" rowspan="2"><div class="step-name-text">输入脚本与参考图生成分镜视频</div></td><td class="col-step-actions" rowspan="2"><div class="tag-list"><span class="tag tag-action">合成视频</span></div></td><td class="col-step-roles" rowspan="2"><div class="tag-list"><span class="tag tag-role">分镜视频生成阶段</span></div></td><td class="col-step-purposes" rowspan="2"><div class="tag-list"><span class="tag tag-purpose">角色一致性</span><span class="tag tag-purpose">细节还原度</span></div></td><td class="col-in-modality has-src-stripe" style="--src-c: #7c3aed" data-src-key="4"><span class="type-icon" style="--c: #047857; --bg: #ecfdf5; --bd: #a7f3d0;" title="图片" role="img" aria-label="图片"><span class="sr-only">图片</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round"><rect x="3" y="4" width="18" height="16" rx="2"/><circle cx="8.5" cy="9.5" r="1.5"/><path d="M21 16l-5-5-9 9"/></svg></span></td><td class="col-in-category"><span class="category-pill">人物参考图</span></td><td class="col-in-src"><a class="chip ref-chip" href="#wf-6ee74f95d4aa2c810d32d6cf0f833806-step-4-out-1" data-target="wf-6ee74f95d4aa2c810d32d6cf0f833806-step-4-out-1" data-source-step="4" style="--c: #7c3aed; --bg: #f5f3ff; --bd: #ddd6fe;" title="步骤4「根据设定生成核心角色参考图集」· 第 ① 输出(未知类型)
- 包含苏晚、顾晏辰、林薇薇等角色的多角度表情参考图集。"><span class="chip-tag">步骤4</span></a></td><td class="col-in-value">已生成的核心角色形象参考图。</td><td class="col-tool" rowspan="2"><div class="tool-name">Seedance (豆包内)</div><div class="tool-method">2.0 Fast 模型</div></td><td class="col-out-idx" id="wf-6ee74f95d4aa2c810d32d6cf0f833806-step-5-out-1" style="--c: #0284c7; --bg: #f0f9ff; --bd: #bae6fd;"><span class="out-idx-badge">①</span></td><td class="col-out-modality"><span class="type-icon" style="--c: #be123c; --bg: #fff1f2; --bd: #fecdd3;" title="视频" role="img" aria-label="视频"><span class="sr-only">视频</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round"><rect x="3" y="5" width="18" height="14" rx="2"/><polygon points="10,9 10,15 16,12" fill="currentColor" stroke="none"/></svg></span></td><td class="col-out-category"><span class="category-pill">视频片段</span></td><td class="col-out-value">符合剧情设定的单集 15 秒短剧视频片段。</td><td class="col-step-source" rowspan="2">图9 / 正文“第四步”内容</td></tr>
- <tr class="step-row-cont" style="--c: #0284c7; --bg: #f0f9ff;"><td class="col-in-modality has-src-stripe" style="--src-c: #0d9488" data-src-key="2"><span class="type-icon" style="--c: #475569; --bg: #f1f5f9; --bd: #cbd5e1;" title="文本" role="img" aria-label="文本"><span class="sr-only">文本</span><svg viewBox="0 0 24 24" fill="currentColor" stroke="none"><path d="M4 5v3.2h6V19h4V8.2h6V5z"/></svg></span></td><td class="col-in-category"><span class="category-pill">分镜脚本</span></td><td class="col-in-src"><a class="chip ref-chip" href="#wf-6ee74f95d4aa2c810d32d6cf0f833806-step-2-out-1" data-target="wf-6ee74f95d4aa2c810d32d6cf0f833806-step-2-out-1" data-source-step="2" style="--c: #0d9488; --bg: #f0fdfa; --bd: #99f6e4;" title="步骤2「细化生成分集脚本与分镜说明」· 第 ① 输出(未知类型)
- 每一集的分镜说明、景别、镜头、人物动作和台词。"><span class="chip-tag">步骤2</span></a></td><td class="col-in-value">对应分集的剧情、动作及对白口型指导提示词。</td><td class="col-out-idx empty-cell"></td><td class="col-out-modality empty-cell"></td><td class="col-out-category empty-cell"></td><td class="col-out-value empty-cell"></td></tr>
- <tr class="step-row" style="--c: #ca8a04; --bg: #fefce8;"><td class="col-step-id" rowspan="1" style="--c: #ca8a04; --bg: #fefce8">6</td><td class="col-step-name" rowspan="1"><div class="step-name-text">通过拼接与特效合成短剧成品视频</div></td><td class="col-step-actions" rowspan="1"><div class="tag-list"><span class="tag tag-action">拼接剪辑</span></div></td><td class="col-step-roles" rowspan="1"><div class="tag-list"><span class="tag tag-role">成品输出阶段</span></div></td><td class="col-step-purposes" rowspan="1"><div class="tag-list"><span class="tag tag-purpose">叙事完整</span></div></td><td class="col-in-modality has-src-stripe" style="--src-c: #0284c7" data-src-key="5"><span class="type-icon" style="--c: #be123c; --bg: #fff1f2; --bd: #fecdd3;" title="视频" role="img" aria-label="视频"><span class="sr-only">视频</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round"><rect x="3" y="5" width="18" height="14" rx="2"/><polygon points="10,9 10,15 16,12" fill="currentColor" stroke="none"/></svg></span></td><td class="col-in-category"><span class="category-pill">视频片段</span></td><td class="col-in-src"><a class="chip ref-chip" href="#wf-6ee74f95d4aa2c810d32d6cf0f833806-step-5-out-1" data-target="wf-6ee74f95d4aa2c810d32d6cf0f833806-step-5-out-1" data-source-step="5" style="--c: #0284c7; --bg: #f0f9ff; --bd: #bae6fd;" title="步骤5「输入脚本与参考图生成分镜视频」· 第 ① 输出(未知类型)
- 符合剧情设定的单集 15 秒短剧视频片段。"><span class="chip-tag">步骤5</span></a></td><td class="col-in-value">多段单集短剧视频片段。</td><td class="col-tool" rowspan="1"><div class="tool-name">剪映</div><div class="tool-method">剪辑工具</div></td><td class="col-out-idx" id="wf-6ee74f95d4aa2c810d32d6cf0f833806-step-6-out-1" style="--c: #ca8a04; --bg: #fefce8; --bd: #fde68a;"><span class="out-idx-badge">①</span></td><td class="col-out-modality"><span class="type-icon" style="--c: #be123c; --bg: #fff1f2; --bd: #fecdd3;" title="视频" role="img" aria-label="视频"><span class="sr-only">视频</span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round"><rect x="3" y="5" width="18" height="14" rx="2"/><polygon points="10,9 10,15 16,12" fill="currentColor" stroke="none"/></svg></span></td><td class="col-out-category"><span class="category-pill">视频成品</span></td><td class="col-out-value">包含字幕、音效、调速处理后的完整短剧视频。</td><td class="col-step-source" rowspan="1">图10 / 正文“第五步”内容</td></tr>
- </tbody>
- </table>
- </div>
- </section>
- <section class="card summary-card">
- <h2>工序摘要</h2>
- <p><span class="empty-val">—</span></p>
- </section>
- </section>
- </main>
- </div>
- <!-- Lightbox 大图查看器(全局唯一) -->
- <div id="lightbox" class="lightbox" hidden role="dialog" aria-modal="true" aria-label="图片查看">
- <button type="button" class="lb-btn lb-close" aria-label="关闭(Esc)">×</button>
- <button type="button" class="lb-btn lb-prev" aria-label="上一张(←)">‹</button>
- <button type="button" class="lb-btn lb-next" aria-label="下一张(→)">›</button>
- <div class="lb-stage">
- <img id="lb-img" alt="" referrerpolicy="no-referrer" />
- </div>
- <div class="lb-footer">
- <span id="lb-counter"></span>
- <span class="lb-hint">← → 切换 · Esc 关闭 · 移动端可左右滑动</span>
- </div>
- </div>
- <script type="application/json" class="image-data" data-wid="6ee74f95d4aa2c810d32d6cf0f833806">["https://res.cybertogether.net/crawler/image/fb6599951a28.jpg", "https://res.cybertogether.net/crawler/image/342672a2f5e9.jpg", "https://res.cybertogether.net/crawler/image/cb4a01876352.jpg", "https://res.cybertogether.net/crawler/image/a7759682adca.jpg", "https://res.cybertogether.net/crawler/image/1f3a4c926956.jpg", "https://res.cybertogether.net/crawler/image/303c46445415.jpg", "https://res.cybertogether.net/crawler/image/ad26d612237c.jpg", "https://res.cybertogether.net/crawler/image/09f95b406eec.jpg", "https://res.cybertogether.net/crawler/image/fbbe2fd07e40.jpg", "https://res.cybertogether.net/crawler/image/c5c1fae9591a.jpg"]</script>
- <script>
- (function () {
- /* ============================== Sidebar 折叠 ============================== */
- const layout = document.querySelector('.app-layout');
- const toggleBtn = document.querySelector('.sidebar-toggle');
- const COLLAPSE_KEY = 'decode_sidebar_collapsed';
- // 恢复上次的折叠状态
- try {
- if (localStorage.getItem(COLLAPSE_KEY) === '1' && layout) {
- layout.classList.add('sidebar-collapsed');
- }
- } catch (_) {}
- if (toggleBtn && layout) {
- toggleBtn.addEventListener('click', (e) => {
- e.preventDefault();
- e.stopPropagation();
- layout.classList.toggle('sidebar-collapsed');
- try {
- localStorage.setItem(
- COLLAPSE_KEY,
- layout.classList.contains('sidebar-collapsed') ? '1' : '0'
- );
- } catch (_) {}
- });
- }
- /* ============================== Sidebar / Panel 切换 ============================== */
- const panels = Array.from(document.querySelectorAll('.workflow-panel'));
- const items = Array.from(document.querySelectorAll('.sidebar-item'));
- // 收集每个 panel 的图片数据(每个 panel 一份独立的 IMAGES)
- const imagesByWid = {};
- document.querySelectorAll('script.image-data').forEach((s) => {
- try { imagesByWid[s.dataset.wid] = JSON.parse(s.textContent || '[]'); }
- catch (e) { imagesByWid[s.dataset.wid] = []; }
- });
- let IMAGES = [];
- function activate(wid) {
- if (!wid) return;
- panels.forEach((p) => {
- if (p.dataset.wid === wid) p.removeAttribute('hidden');
- else p.setAttribute('hidden', '');
- });
- items.forEach((it) => {
- if (it.dataset.wid === wid) it.classList.add('active');
- else it.classList.remove('active');
- });
- IMAGES = imagesByWid[wid] || [];
- if (lightbox && !lightbox.hasAttribute('hidden')) lbCloseFn();
- }
- items.forEach((it) => {
- it.addEventListener('click', (e) => {
- e.preventDefault();
- const wid = it.dataset.wid;
- activate(wid);
- // 更新 hash 不触发跳转
- try { history.replaceState(null, '', '#panel-' + wid); } catch (_) {}
- window.scrollTo({ top: 0 });
- });
- });
- // 初始 active:URL hash 优先;否则用第一个 panel
- (function initActive() {
- let wid = null;
- const m = /^#panel-(.+)$/.exec(window.location.hash || '');
- if (m && Object.prototype.hasOwnProperty.call(imagesByWid, m[1])) wid = m[1];
- if (!wid && panels.length) wid = panels[0].dataset.wid;
- if (wid) activate(wid);
- })();
- /* ============================== Lightbox ============================== */
- const lightbox = document.getElementById('lightbox');
- const lbImg = document.getElementById('lb-img');
- const lbCounter = document.getElementById('lb-counter');
- const lbPrev = lightbox && lightbox.querySelector('.lb-prev');
- const lbNext = lightbox && lightbox.querySelector('.lb-next');
- const lbClose = lightbox && lightbox.querySelector('.lb-close');
- let lbIndex = 0;
- function lbOpen(idx) {
- if (!lightbox || !IMAGES.length) return;
- lbIndex = ((idx % IMAGES.length) + IMAGES.length) % IMAGES.length;
- lbRender();
- lightbox.removeAttribute('hidden');
- document.body.style.overflow = 'hidden';
- }
- function lbCloseFn() {
- if (!lightbox) return;
- lightbox.setAttribute('hidden', '');
- document.body.style.overflow = '';
- lbImg.src = '';
- }
- function lbGo(delta) {
- if (!IMAGES.length) return;
- lbIndex = ((lbIndex + delta) % IMAGES.length + IMAGES.length) % IMAGES.length;
- lbRender();
- }
- function lbRender() {
- lbImg.src = IMAGES[lbIndex];
- lbImg.alt = '图' + (lbIndex + 1);
- lbCounter.textContent = (lbIndex + 1) + ' / ' + IMAGES.length;
- [-1, 1].forEach((d) => {
- const j = ((lbIndex + d) % IMAGES.length + IMAGES.length) % IMAGES.length;
- const pre = new Image();
- pre.referrerPolicy = 'no-referrer';
- pre.src = IMAGES[j];
- });
- }
- // 事件委托:sidebar 切换后新的 panel 里 thumb 也能响应
- document.addEventListener('click', (e) => {
- const t = e.target.closest('.image-strip .thumb');
- if (!t) return;
- const i = parseInt(t.dataset.idx, 10);
- if (!Number.isNaN(i)) lbOpen(i);
- });
- if (lbPrev) lbPrev.addEventListener('click', (e) => { e.stopPropagation(); lbGo(-1); });
- if (lbNext) lbNext.addEventListener('click', (e) => { e.stopPropagation(); lbGo(1); });
- if (lbClose) lbClose.addEventListener('click', (e) => { e.stopPropagation(); lbCloseFn(); });
- if (lightbox) {
- lightbox.addEventListener('click', (e) => {
- if (e.target === lightbox || e.target.classList.contains('lb-stage')) lbCloseFn();
- });
- }
- // 键盘:Esc 关闭,← → 切换
- document.addEventListener('keydown', (e) => {
- if (!lightbox || lightbox.hasAttribute('hidden')) return;
- if (e.key === 'Escape') { e.preventDefault(); lbCloseFn(); }
- else if (e.key === 'ArrowLeft') { e.preventDefault(); lbGo(-1); }
- else if (e.key === 'ArrowRight') { e.preventDefault(); lbGo(1); }
- });
- // 触屏左右滑动
- let tStartX = 0, tStartY = 0, tTracking = false;
- if (lightbox) {
- lightbox.addEventListener('touchstart', (e) => {
- if (e.touches.length !== 1) { tTracking = false; return; }
- tStartX = e.touches[0].clientX;
- tStartY = e.touches[0].clientY;
- tTracking = true;
- }, { passive: true });
- lightbox.addEventListener('touchend', (e) => {
- if (!tTracking || e.changedTouches.length !== 1) return;
- const dx = e.changedTouches[0].clientX - tStartX;
- const dy = e.changedTouches[0].clientY - tStartY;
- if (Math.abs(dx) > 50 && Math.abs(dx) > Math.abs(dy)) {
- lbGo(dx < 0 ? 1 : -1);
- }
- tTracking = false;
- }, { passive: true });
- }
- /* ============================== Chip 交互 ============================== */
- const flashClass = 'hl-flash';
- const targetClass = 'hl-target';
- const siblingClass = 'hl-sibling';
- function flash(el) {
- el.classList.remove(flashClass);
- void el.offsetWidth;
- el.classList.add(flashClass);
- }
- /**
- * 给定一个 chip,找出"当前 step 内"引用同一 source step 的兄弟 chip。
- *
- * 「当前 step」的定义:chip 所属那个 step-row + 紧随其后所有 step-row-cont
- * 行(直到下一个 step-row)。我们用 DOM 遍历找出这组 tr。
- */
- function collectSiblingsInStep(chip) {
- const srcStep = chip.dataset.sourceStep;
- if (!srcStep) return [];
- const tr = chip.closest('tr');
- if (!tr) return [];
- // 向上找到本 step 的 step-row(自己或前面的兄弟里第一个 .step-row)
- let head = tr;
- while (head && !head.classList.contains('step-row')) {
- head = head.previousElementSibling;
- }
- if (!head) return [];
- // 从 step-row 起,收集这组里所有 chip
- const group = [head];
- let n = head.nextElementSibling;
- while (n && n.classList.contains('step-row-cont')) {
- group.push(n);
- n = n.nextElementSibling;
- }
- const sibs = [];
- group.forEach((row) => {
- row.querySelectorAll(`.ref-chip[data-source-step="${srcStep}"]`).forEach((c) => {
- if (c !== chip) sibs.push(c);
- });
- });
- return sibs;
- }
- document.querySelectorAll('.ref-chip[data-target]').forEach((chip) => {
- const id = chip.dataset.target;
- if (!id) return;
- chip.addEventListener('mouseenter', () => {
- const t = document.getElementById(id);
- if (t) t.classList.add(targetClass);
- // 兄弟联动:当前 step 内引用同一 source step 的所有 chip
- collectSiblingsInStep(chip).forEach((s) => s.classList.add(siblingClass));
- });
- chip.addEventListener('mouseleave', () => {
- const t = document.getElementById(id);
- if (t) t.classList.remove(targetClass);
- collectSiblingsInStep(chip).forEach((s) => s.classList.remove(siblingClass));
- });
- chip.addEventListener('click', (e) => {
- e.preventDefault();
- const t = document.getElementById(id);
- if (!t) return;
- t.scrollIntoView({ behavior: 'smooth', block: 'center' });
- flash(t);
- });
- });
- // 深链接:若 hash 形如 #wf-{wid}-step-N-out-M,则切到对应 panel 并滚到那个 cell
- (function handleDeepHash() {
- const hash = window.location.hash || '';
- const m = /^#wf-(.+)-step-\d+-out-\d+$/.exec(hash);
- if (!m) return;
- const candidateWid = m[1];
- if (!Object.prototype.hasOwnProperty.call(imagesByWid, candidateWid)) return;
- activate(candidateWid);
- setTimeout(() => {
- const t = document.getElementById(hash.slice(1));
- if (t) {
- t.scrollIntoView({ behavior: 'smooth', block: 'center' });
- flash(t);
- }
- }, 100);
- })();
- })();
- </script>
- </body>
- </html>
|