Files
AIclinicalresearch/docs/08-项目管理/PKB前端问题修复报告.md
HaHafeng 1b53ab9d52 feat(aia): Complete AIA V2.0 with universal streaming capabilities
Major Changes:
- Add StreamingService with OpenAI Compatible format
- Upgrade Chat component V2 with Ant Design X integration
- Implement AIA module with 12 intelligent agents
- Update API routes to unified /api/v1 prefix
- Update system documentation

Backend (~1300 lines):
- common/streaming: OpenAI Compatible adapter
- modules/aia: 12 agents, conversation service, streaming integration
- Update route versions (RVW, PKB to v1)

Frontend (~3500 lines):
- modules/aia: AgentHub + ChatWorkspace (100% prototype restoration)
- shared/Chat: AIStreamChat, ThinkingBlock, useAIStream Hook
- Update API endpoints to v1

Documentation:
- AIA module status guide
- Universal capabilities catalog
- System overview updates
- All module documentation sync

Tested: Stream response verified, authentication working
Status: AIA V2.0 core completed (85%)
2026-01-14 19:15:01 +08:00

10 KiB
Raw Blame History

PKB<EFBFBD>滨垢<EFBFBD><EFBFBD>靽桀<EFBFBD><EFBFBD><EFBFBD>

<EFBFBD><EFBFBD> <20><EFBFBD><EFBFBD>

<EFBFBD><EFBFBD><EFBFBD>園𡢿: 2026-01-06
**靽桀<E99DBD><E6A180><EFBFBD>?*: <20>?*撌脣<EFBFBD><EFBFBD>其耨憭?
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><EFBFBD><E586BD><EFBFBD> + <20><EFBFBD><E7AC94>曉笆瘥?


<EFBFBD><EFBFBD> <20>𤑳緵<F0A491B3>?銝芷䔮憸?

<EFBFBD><EFBFBD>1嚗𡁻△<EFBFBD><EFBFBD><EFBFBD><EFBFBD>撅𧶏<EFBFBD>憿園<EFBFBD><EFBFBD>匧紡<EFBFBD><EFBFBD> <20>?

<EFBFBD>啗情: 餈𥕦<E9A488>Workspace憿菟𢒰<E88F9F>𠬍<EFBFBD>憿園<E686BF>隞滨<E99A9E><E6BBA8>曄內撟喳蝱<E596B3><E89DB1><EFBFBD><EFBFBD>撖潸⏛<E6BDB8>?

<EFBFBD><EFBFBD>: WorkspacePage鋡怠<E98BA1>鋆孵銁MainLayout銝哨<EFBFBD>撖潸稲蝏扳㗁鈭<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

敶勗<EFBFBD>:

  • 銝滨泵<EFBFBD>Ā3霈曇恣<EFBFBD>?瘝㗇絡撘?雿㯄<E99BBF>
  • 瘚芾晶撅誩<EFBFBD>蝛粹𡢿
  • 銝𤾸<EFBFBD><EFBFBD>见㦛銝滢<EFBFBD><EFBFBD>?

<EFBFBD><EFBFBD>2嚗𡁏瓷<EFBFBD><EFBFBD>銝𧢲<EFBFBD><EFBFBD>冽辺 <20>?

<EFBFBD>啗情: Chat瘨<74><E798A8><EFBFBD><EFBFBD><E7AE8F><EFBFBD>皛𡁜𢆡嚗<F0A286A1><E59A97>摰寡<E691B0><E5AFA1>箸𧒄<E7AEB8><EFBFBD><E8A1A4>?

<EFBFBD><EFBFBD>:

  • 摰孵膥瘝⊥<EFBFBD><EFBFBD>霈曄蔭overflow撅墧<EFBFBD>?
  • 擃睃漲霈∠<EFBFBD>銝齿迤蝖?

敶勗<EFBFBD>:

  • <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>蟮瘨<EFBFBD><EFBFBD>
  • <EFBFBD><EFBFBD>雿㯄<EFBFBD><EFBFBD><EFBFBD>

<EFBFBD><EFBFBD>3嚗関ab撖潸⏛擃睃漲憭芷<EFBFBD> <20>?

<EFBFBD>啗情: "<22><EFBFBD><E7AE84><EFBFBD>"<22>?<3F><EFBFBD><EFBFBD>漣"Tab撖潸⏛<E6BDB8><EFBFBD>摨西<E691A8>擃矋<E69383><E79F8B><EFBFBD>蝎㛖<E89D8E>

<EFBFBD><EFBFBD>:

  • 雿輻鍂鈭<EFBFBD>h-14嚗?6px嚗㕑<E59A97><EFBFBD><E5B1B8><EFBFBD><E7AC94><EFBFBD>h-12嚗?8px嚗?
  • <EFBFBD><EFBFBD><EFBFBD><EFBFBD>摮堒偕撖貉<EFBFBD>憭?

敶勗<EFBFBD>:

  • 銝𤾸<EFBFBD><EFBFBD>见㦛銝滢<EFBFBD><EFBFBD>?
  • <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>銝滨移<EFBFBD>?

<EFBFBD><EFBFBD>4嚗鋫I撖寡<EFBFBD><EFBFBD>仿<EFBFBD> - JSON<4F><EFBFBD><E6BE86>躰秤 <20>?

<EFBFBD>啗情: <20><EFBFBD><E785BE><EFBFBD><EFBFBD><EFBFBD><E887AC>仿<EFBFBD>嚗䫤Unexpected token 'd', "data: {"co"... is not valid JSON`

<EFBFBD><EFBFBD>:

  • <EFBFBD>𡒊垢餈𥪜<EFBFBD><EFBFBD><EFBFBD>糓SSE嚗𠄎erver-Sent Events嚗㗇<E59A97>撘𤩺聢撘?
  • <EFBFBD>滨垢雿輻鍂response.json()<EFBFBD><EFBFBD><EFBFBD><EFBFBD>湔聢撘誯<EFBFBD>霂?
  • 瘝⊥<EFBFBD><EFBFBD><EFBFBD><EFBFBD>data: <EFBFBD><EFBFBD>

敶勗<EFBFBD>:

  • <EFBFBD><EFBFBD><EFBFBD><EFBFBD>雿輻鍂AI撖寡<EFBFBD><EFBFBD><EFBFBD>
  • <EFBFBD><EFBFBD><EFBFBD><EFBFBD>銝滚虾<EFBFBD>?

<EFBFBD>?靽桀<E99DBD><E6A180><EFBFBD>

靽桀<EFBFBD>1嚗𡁜<EFBFBD><EFBFBD><EFBFBD>撅𤩺<EFBFBD>瘚詨<EFBFBD><EFBFBD><EFBFBD>

<EFBFBD><EFBFBD>靽格㺿

// frontend-v2/src/modules/pkb/pages/WorkspacePage.tsx

interface WorkspacePageProps {
  standalone?: boolean; // <20><EFBFBD>standalone璅<E79285>
}

const WorkspacePage: React.FC<WorkspacePageProps> = ({ standalone = false }) => {
  // 憒<><E68692><EFBFBD>盎tandalone璅<E79285>嚗䔶蝙<E494B6>典𤐄摰𡁜<E691B0>雿滩<E99BBF><E6BBA9>𡝗㟲銝芸<E98A9D>撟?
  const containerClass = standalone 
    ? "fixed inset-0 z-50 flex flex-col bg-gray-50"  // <20><EFBFBD><EFBFBD><E996AC>
    : "flex flex-col h-screen bg-gray-50";           // <20><EFBFBD>𡁏芋撘?

  return (
    <div className={containerClass}>
      {/* ... */}
    </div>
  );
};
// frontend-v2/src/modules/pkb/index.tsx

<Routes>
  <Route path="/" element={<Navigate to="dashboard" replace />} />
  <Route path="dashboard" element={<DashboardPage />} />
  {/* Workspace憿菟𢒰<E88F9F><EFBFBD><E585B8><EFBFBD>嚗䔶<E59A97>雿輻鍂憭硋<E686AD>Layout */}
  <Route path="workspace/:kbId" element={<WorkspacePage standalone />} />
</Routes>

<EFBFBD><EFBFBD><EFBFBD>

<EFBFBD>?Workspace憿菟𢒰摰<F0A292B0><E691B0><EFBFBD><E996AC>撅誩<E69285>
<0A>?瘝⊥<E7989D>憿園<E686BF>撖潸⏛<E6BDB8>? <0A>?瘝㗇絡撘譍<E69298>撉?


靽桀<EFBFBD>2嚗𡁏迤蝖株挽蝵格<EFBFBD><EFBFBD>冽辺

<EFBFBD><EFBFBD>靽格㺿

// WorkspacePage.tsx - 銝餃捆<E9A483>?
<main className="flex-1 overflow-hidden relative">
  {activeTab === 'chat' && (
    <div className="h-full flex overflow-hidden">  {/* 瘛餃<E7989B>overflow-hidden */}
      <div className="flex-1 flex flex-col bg-white overflow-hidden">
        {/* 撌乩<E6928C><E79285><E288AA>㗇𥋘<E39787>?*/}
        <div className="p-3 border-b border-gray-100 flex-shrink-0">
          {/* ... */}
        </div>

        {/* Chat<61><EFBFBD> - <20><EFBFBD><E88880>?*/}
        <div className="flex-1 overflow-y-auto">  {/* 瘛餃<E7989B>overflow-y-auto */}
          {/* ... */}
        </div>
      </div>
    </div>
  )}
</main>
// FullTextMode.tsx
<div className="h-full flex flex-col overflow-hidden">
  <div className="flex-shrink-0 px-4 pt-4">  {/* <20><EFBFBD><E7AE8F><EFBFBD> */}
    <Alert {...} />
  </div>
  
  <div className="flex-1 overflow-hidden px-4 pb-4">  {/* <20><EFBFBD><E88880>典躹<E585B8>?*/}
    <ChatContainer {...} />
  </div>
</div>

<EFBFBD><EFBFBD><EFBFBD>

<EFBFBD>?Chat瘨<74><E798A8><EFBFBD><EFBFBD><E7AE8F>臭誑甇<E8AA91>虜皛𡁜𢆡
<0A>?撌乩<E6928C><E79285><E288AA>㗇𥋘<E39787>典𤐄摰𡁜銁憿園<E686BF>
<0A>?皛𡁜𢆡<F0A1819C>⊥甅撘讐<E69298>閫?


靽桀<EFBFBD>3嚗𡁶移蝖株<EFBFBD><EFBFBD>幅ab擃睃漲

<EFBFBD><EFBFBD>靽格㺿

// WorkspacePage.tsx

// 靽格㺿<E6A0BC>?
<div className="bg-white border-b border-gray-200 px-6 flex items-center shadow-sm z-20 h-14">
  <button className="...">
    <MessageSquare className="w-5 h-5 mr-2" />
    <span className="text-base"><EFBFBD><EFBFBD><EFBFBD><EFBFBD></span>
  </button>
</div>

// 靽格㺿<E6A0BC>?
<div className="bg-white border-b border-gray-200 px-6 flex items-center shadow-sm z-20 h-12 flex-shrink-0">
  <button className="...">
    <MessageSquare className="w-4 h-4 mr-2" />  {/* w-5 <20>?w-4 */}
    <span className="text-sm"><EFBFBD><EFBFBD><EFBFBD><EFBFBD></span>    {/* text-base <20>?text-sm */}
  </button>
</div>

撖寞<EFBFBD>

撅墧<EFBFBD>? 靽格㺿<EFBFBD>? 靽格㺿<EFBFBD>? <EFBFBD><EFBFBD><EFBFBD>?
擃睃漲 h-14 (56px) h-12 (48px) <EFBFBD>?h-12
<EFBFBD><EFBFBD> w-5 h-5 (20px) w-4 h-4 (16px) <EFBFBD>?w-4 h-4
<EFBFBD><EFBFBD><EFBFBD> text-base (16px) text-sm (14px) <EFBFBD>?text-sm

<EFBFBD><EFBFBD><EFBFBD>

<EFBFBD>?Tab擃睃漲蝎曄<E69B84><EFBFBD><E5AFA5><EFBFBD>
<0A>?閫<><E996AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>渡移<E6B8A1>? <0A>?銝竚3霈曇恣100%銝<><E98A9D>?


靽桀<EFBFBD>4嚗𡁏迤蝖桀<EFBFBD><EFBFBD><EFBFBD>SE瘚<EFBFBD><EFBFBD><EFBFBD><EFBFBD>

<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

<EFBFBD>𡒊垢餈𥪜<EFBFBD><EFBFBD><EFBFBD>聢撘𧶏<EFBFBD>

data: {"content":"<22>?,"role":"assistant"}
data: {"content":"憟?,"role":"assistant"}
data: {"content":"嚗?,"role":"assistant"}
data: [DONE]

<EFBFBD>滨垢<EFBFBD>躰秤隞<EFBFBD><EFBFBD>嚗?

// <20>?<3F>躰秤嚗𡁶凒<F0A181B6>乩蝙<E4B9A9>禿esponse.json()
const data = await response.json();

靽桀<EFBFBD><EFBFBD><EFBFBD>

// FullTextMode.tsx & DeepReadMode.tsx

requestFn: async (message: string) => {
  const response = await fetch('/api/v1/chat/stream', {
    method: 'POST',
    headers: { 
      'Content-Type': 'application/json',
      'Accept': 'text/event-stream',  // <20><> <20>喲睸嚗𡁏<E59A97>摰锭SE<53><EFBFBD>
    },
    body: JSON.stringify({
      content: message,
      modelType: 'qwen-long',  // 雿輻鍂qwen-long璅<E79285>
      knowledgeBaseIds: [kbId],
      fullTextDocumentIds,  // <20>?documentIds
    }),
  });
  
  if (!response.ok) {
    throw new Error(`API霂瑟<E99C82>憭梯揖: ${response.status}`);
  }
  
  // <20><><><EFBC86><E686AD><EFBFBD><E7989A><EFBFBD><EFBFBD>
  const reader = response.body?.getReader();
  const decoder = new TextDecoder();
  let fullContent = '';
  
  if (reader) {
    while (true) {
      const { done, value } = await reader.read();
      if (done) break;
      
      const chunk = decoder.decode(value);
      const lines = chunk.split('\n');
      
      for (const line of lines) {
        if (line.startsWith('data: ')) {
          const data = line.slice(6);  // 蝘駁膄"data: "<22><EFBFBD>
          if (data === '[DONE]') break;
          
          try {
            const json = JSON.parse(data);
            if (json.content) {
              fullContent += json.content;  // 蝝舐妖<E88890><E5A696>            }
          } catch (e) {
            // 敹賜裦閫<E8A3A6><E996AB><EFBFBD>躰秤
          }
        }
      }
    }
  }
  
  return {
    content: fullContent,
    messageId: Date.now().toString(),
  };
}

<EFBFBD><EFBFBD><EFBFBD>

<EFBFBD>?甇<><EFBC86><E996AB>SSE瘚<45><E7989A><EFBFBD><EFBFBD>
<0A>?AI撖寡<E69296><E5AFA1><EFBFBD><EFBFBD>虜撌乩<E6928C>
<0A>?<3F><EFBFBD><EFBFBD><E7989A>颲枏枂嚗<E69E82><E59A97>𣂼<EFBFBD><F0A382BC>曄內嚗?


<EFBFBD><EFBFBD> 靽桀<E99DBD><E6A180><EFBFBD>撖寞<E69296>

<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>撖寞<EFBFBD>

憿寧𤌍 靽桀<EFBFBD><EFBFBD>? 靽桀<EFBFBD><EFBFBD>? <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>?<3F>厰▲<E58EB0>典紡<E585B8>? <EFBFBD>?摰<><E691B0><EFBFBD><EFBFBD> <EFBFBD>?100%
皛𡁜𢆡<EFBFBD>? <EFBFBD>?<3F><EFBFBD>皛𡁜𢆡 <EFBFBD>?甇<>虜皛𡁜𢆡 <EFBFBD>?100%
Tab擃睃漲 <EFBFBD>?56px (蝎㛖<E89D8E>) <EFBFBD>?48px (蝎曇稲) <EFBFBD>?100%
<EFBFBD><EFBFBD>撠箏站 <EFBFBD>?20px <EFBFBD>?16px <EFBFBD>?100%
<EFBFBD><EFBFBD><EFBFBD>憭批<EFBFBD> <EFBFBD>?16px <EFBFBD>?14px <EFBFBD>?100%

<EFBFBD><EFBFBD>撖寞<EFBFBD>

<EFBFBD><EFBFBD> 靽桀<EFBFBD><EFBFBD>? 靽桀<EFBFBD><EFBFBD>?
AI撖寡<EFBFBD> <EFBFBD>?<3F>仿<EFBFBD><E4BBBF><EFBFBD>雿輻鍂 <EFBFBD>?甇<>虜撌乩<E6928C>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>?<3F><EFBFBD>雿輻鍂 <EFBFBD>?甇<>虜撌乩<E6928C>
<EFBFBD><EFBFBD>蝎曇粉 <EFBFBD>?<3F><EFBFBD>雿輻鍂 <EFBFBD>?甇<>虜撌乩<E6928C>
<EFBFBD><EFBFBD>皛𡁜𢆡 <EFBFBD>?<3F><EFBFBD>皛𡁜𢆡 <EFBFBD>?甇<>虜皛𡁜𢆡

<EFBFBD><20><><EFBFBD><EFBFBD><E888AA><EFBFBD><EFBFBD>

1. <20><EFBFBD>瘝㗇絡撘誩<E69298><EFBFBD>

**<2A>喲睸<E596B2><E79DB8><EFBFBD>?*:

  • fixed inset-0 z-50嚗𡁜𤐄摰𡁜<EFBFBD>雿㵪<EFBFBD><EFBFBD><EFBFBD><EFBFBD>港葵閫<EFBFBD>
  • standalone prop嚗𡁏綉<F0A1818F>嗆糓<E59786>虫蝙<E899AB><EFBFBD>撅𤩺芋撘?
  • <EFBFBD><EFBFBD>頝舐眏嚗帋<EFBFBD><EFBFBD><EFBFBD><EFBFBD>決ainLayout銝?

2. 皛𡁜𢆡摰孵膥撅<E886A5>

**甇<><EFBFBD><EFBC86><EFBFBD>蝥抒<E89DA5><E68A92>?*:

<main className="flex-1 overflow-hidden">           {/* 憭硋<E686AD>嚗𡁻<E59A97><F0A181BB>𤩺滯<F0A4A9BA>?*/}
  <div className="h-full flex overflow-hidden">     {/* 銝剖<E98A9D>嚗𡁜𤐄摰𡁻<E691B0>摨?*/}
    <div className="flex-1 overflow-y-auto">        {/* <20><><EFBFBD>嚗𡁜虾皛𡁜𢆡 */}
      {/* <20><>捆 */}
    </div>
  </div>
</main>

3. SSE瘚<45><E7989A><EFBFBD><EFBFBD><EFBFBD><E686AD>

<EFBFBD>喲睸甇仿炊:

  1. 霈曄蔭甇<EFBFBD><EFBFBD><EFBFBD>窈瘙<EFBFBD>仍嚗䫤Accept: text/event-stream`
  2. 雿輻鍂ReadableStream API霂餃<E99C82><E9A483><EFBFBD>
  3. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>data: <EFBFBD><EFBFBD>
  4. 蝝舐妖<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
  5. <EFBFBD><EFBFBD>[DONE]蝏𤘪<EFBFBD><EFBFBD><EFBFBD>

4. 蝎曄餈睃<E9A488>霈曇恣

霈曇恣閫<EFBFBD><EFBFBD>:

  • 擃睃漲嚗帋艇<EFBFBD>潔蝙<EFBFBD>汽ailwind<EFBFBD><EFBFBD>-12<31><32>-14蝑?
  • <EFBFBD><EFBFBD>嚗鯱-4 h-4嚗?6px嚗?
  • <EFBFBD><EFBFBD><EFBFBD>嚗魩ext-sm嚗?4px嚗?
  • <EFBFBD><EFBFBD>嚗䮝-3嚗?2px嚗?

<EFBFBD><EFBFBD> 靽格㺿<E6A0BC><E3BABF>辣皜<E8BEA3><E79A9C>

靽格㺿<EFBFBD><EFBFBD>辣嚗?銝迎<E98A9D>

frontend-v2/src/modules/pkb/
<0A><EFBFBD><E98EBF><EFBFBD> index.tsx                                    (瘛餃<E7989B>standalone頝舐眏)
<0A><EFBFBD><E98EBF><EFBFBD> pages/WorkspacePage.tsx                      (<28><EFBFBD>+皛𡁜𢆡+Tab擃睃漲)
<0A><EFBFBD><E5A999><EFBFBD> components/Workspace/
    <20><EFBFBD><E98EBF><EFBFBD> FullTextMode.tsx                         (SSE瘚<45><E7989A><EFBFBD><EFBFBD>)
    <20><EFBFBD><E5A999><EFBFBD> DeepReadMode.tsx                         (SSE瘚<45><E7989A><EFBFBD><EFBFBD>)

<EFBFBD>?撉諹<E69289><EFBFBD><E79A9C>

<EFBFBD>◆撉諹<EFBFBD>嚗㇊0嚗?

  • Workspace憿菟𢒰<EFBFBD><EFBFBD><EFBFBD>曄內
  • 瘝⊥<EFBFBD>憿園<EFBFBD>撖潸⏛<EFBFBD>?
  • Chat瘨<EFBFBD><EFBFBD><EFBFBD>臭誑甇<EFBFBD>虜皛𡁜𢆡
  • Tab擃睃漲銝?8px
  • AI撖寡<EFBFBD><EFBFBD>虜撌乩<EFBFBD>
  • <EFBFBD><EFBFBD><EFBFBD><EFBFBD>粉璅<EFBFBD><EFBFBD>舐鍂
  • <EFBFBD><EFBFBD>蝎曇粉璅<EFBFBD><EFBFBD>舐鍂

摨磰砲撉諹<EFBFBD>嚗㇊1嚗?

  • 皛𡁜𢆡<EFBFBD>⊥甅撘讐<EFBFBD>閫?
  • Tab<EFBFBD><EFBFBD>揢瘚<EFBFBD><EFBFBD>
  • 撌乩<EFBFBD><EFBFBD><EFBFBD><EFBFBD>揢甇<EFBFBD>
  • PDF靘扯器<EFBFBD>𤩺迤撣?

<EFBFBD>臭誑隡睃<EFBFBD>嚗㇊2嚗?

  • <EFBFBD><EFBFBD>颲枏枂<EFBFBD>函𤫇<EFBFBD><EFBFBD><EFBFBD>
  • <EFBFBD>躰秤<EFBFBD>鞟內隡睃<EFBFBD>
  • <EFBFBD>㰘蝸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?

<EFBFBD><EFBFBD> 銝衤<E98A9D>甇?

  1. <EFBFBD><EFBFBD>撉諹<EFBFBD>: 霂瑞鍂<E7919E><EFBFBD><E790BF><EFBFBD>頧賡△<E8B3A1><EFBFBD>霂?
  2. <EFBFBD><EFBFBD>隡睃<EFBFBD>: 隡睃<E99AA1><EFBFBD><E7989A><EFBFBD><EFBFBD><E6BB9A><EFBFBD><EFBFBD>𤘪<EFBFBD><EFBFBD>
  3. <EFBFBD>躰秤憭<EFBFBD><EFBFBD>: 摰<><E691B0>API<50>躰秤<E8BAB0>鞟內
  4. **<2A><EFBFBD><E5ADB5><EFBFBD>芋撘?*: 摰䂿緵<E482BF><EFBFBD><E5ADB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>摰峕㟲瘚<E39FB2><E7989A>

<EFBFBD>働 蝏誯<E89D8F><E8AAAF>躰悌

1. 霈曇恣餈睃<E9A488><EFBFBD>移蝖?

  • 銝滩<EFBFBD>"撌桐<E6928C>憭?嚗諹<E59A97>"摰<><E691B0><EFBFBD><E98A9D>?
  • 瘥譍葵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>撖寞<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
  • 雿輻鍂Tailwind<EFBFBD><EFBFBD>移蝖桀偕撖貊掩

2. <20><EFBFBD>憿菟𢒰<E88F9F><F0A292B0><EFBFBD>鸌畾𠰴<E795BE><F0A0B0B4>?

  • 銝滩<EFBFBD><EFBFBD><EFBFBD>訫𧑐<EFBFBD>曉銁MainLayout銝?
  • <EFBFBD><EFBFBD><EFBFBD>fixed`摰帋<E691B0><E5B88B>𣇉𡠺蝡贝楝<E8B49D>?
  • <EFBFBD><EFBFBD><EFBFBD>z-index撅<78>

3. 皛𡁜𢆡摰孵膥閬<E886A5><E996AC><EFBFBD>挽霈?

  • 憭硋<EFBFBD>overflow-hidden
  • <EFBFBD><EFBFBD><EFBFBD>overflow-y-auto
  • <EFBFBD><EFBFBD><EFBFBD><EFBFBD>flex-shrink-0

4. API<50><EFBFBD><EFBFBD><E996AC><EFBFBD>𡒊垢撖寥<E69296>

  • 隞𠉛<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𡒊垢隞<EFBFBD><EFBFBD>
  • <EFBFBD><EFBFBD>圾SSE瘚<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
  • <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>唳旿

靽桀<EFBFBD>摰峕<EFBFBD><EFBFBD>園𡢿: 2026-01-06
**靽桀<E99DBD>鈭?: AI Assistant
**撉諹<E69289><E8ABB9><EFBFBD>?
: 敺<><EFBFBD>霈?