index.html 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>AceFlow v2.0 - AI驱动的敏捷开发工作流</title>
  7. <style>
  8. * {
  9. margin: 0;
  10. padding: 0;
  11. box-sizing: border-box;
  12. }
  13. body {
  14. font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;
  15. background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  16. min-height: 100vh;
  17. color: #333;
  18. }
  19. .container {
  20. max-width: 1200px;
  21. margin: 0 auto;
  22. padding: 20px;
  23. }
  24. .header {
  25. text-align: center;
  26. color: white;
  27. margin-bottom: 30px;
  28. }
  29. .header h1 {
  30. font-size: 2.5em;
  31. margin-bottom: 10px;
  32. font-weight: 600;
  33. }
  34. .header p {
  35. font-size: 1.2em;
  36. opacity: 0.9;
  37. }
  38. .dashboard {
  39. display: grid;
  40. grid-template-columns: 1fr 1fr;
  41. gap: 20px;
  42. margin-bottom: 30px;
  43. }
  44. .card {
  45. background: white;
  46. border-radius: 12px;
  47. padding: 25px;
  48. box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
  49. backdrop-filter: blur(10px);
  50. border: 1px solid rgba(255, 255, 255, 0.2);
  51. }
  52. .card h3 {
  53. color: #4a5568;
  54. margin-bottom: 15px;
  55. font-size: 1.3em;
  56. display: flex;
  57. align-items: center;
  58. }
  59. .card h3 .icon {
  60. margin-right: 8px;
  61. font-size: 1.2em;
  62. }
  63. .project-info {
  64. grid-column: 1 / -1;
  65. }
  66. .project-status {
  67. display: grid;
  68. grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  69. gap: 15px;
  70. margin-top: 15px;
  71. }
  72. .status-item {
  73. background: #f7fafc;
  74. padding: 15px;
  75. border-radius: 8px;
  76. text-align: center;
  77. }
  78. .status-item h4 {
  79. color: #2d3748;
  80. margin-bottom: 5px;
  81. }
  82. .status-value {
  83. font-size: 1.5em;
  84. font-weight: bold;
  85. color: #667eea;
  86. }
  87. .progress-bar {
  88. width: 100%;
  89. height: 8px;
  90. background: #e2e8f0;
  91. border-radius: 4px;
  92. overflow: hidden;
  93. margin: 15px 0;
  94. }
  95. .progress-fill {
  96. height: 100%;
  97. background: linear-gradient(90deg, #667eea, #764ba2);
  98. border-radius: 4px;
  99. transition: width 0.3s ease;
  100. }
  101. .flow-modes {
  102. display: grid;
  103. grid-template-columns: repeat(3, 1fr);
  104. gap: 15px;
  105. margin: 20px 0;
  106. }
  107. .mode-card {
  108. background: #f8f9fa;
  109. border: 2px solid #e9ecef;
  110. border-radius: 8px;
  111. padding: 15px;
  112. text-align: center;
  113. cursor: pointer;
  114. transition: all 0.3s ease;
  115. }
  116. .mode-card:hover {
  117. border-color: #667eea;
  118. transform: translateY(-2px);
  119. }
  120. .mode-card.active {
  121. border-color: #667eea;
  122. background: #eef2ff;
  123. }
  124. .mode-title {
  125. font-weight: bold;
  126. color: #2d3748;
  127. margin-bottom: 8px;
  128. }
  129. .mode-desc {
  130. font-size: 0.9em;
  131. color: #718096;
  132. }
  133. .stages-flow {
  134. margin: 20px 0;
  135. }
  136. .stages-container {
  137. display: flex;
  138. align-items: center;
  139. justify-content: space-between;
  140. margin: 15px 0;
  141. }
  142. .stage {
  143. flex: 1;
  144. max-width: 120px;
  145. text-align: center;
  146. position: relative;
  147. }
  148. .stage-circle {
  149. width: 60px;
  150. height: 60px;
  151. border-radius: 50%;
  152. margin: 0 auto 8px;
  153. display: flex;
  154. align-items: center;
  155. justify-content: center;
  156. font-weight: bold;
  157. color: white;
  158. font-size: 1.1em;
  159. }
  160. .stage-circle.completed {
  161. background: #48bb78;
  162. }
  163. .stage-circle.in-progress {
  164. background: #ed8936;
  165. }
  166. .stage-circle.pending {
  167. background: #a0aec0;
  168. }
  169. .stage-name {
  170. font-size: 0.9em;
  171. color: #4a5568;
  172. font-weight: 500;
  173. }
  174. .stage-arrow {
  175. color: #a0aec0;
  176. font-size: 1.5em;
  177. margin: 0 10px;
  178. }
  179. .actions {
  180. display: flex;
  181. gap: 10px;
  182. margin-top: 20px;
  183. flex-wrap: wrap;
  184. }
  185. .btn {
  186. padding: 10px 20px;
  187. border: none;
  188. border-radius: 6px;
  189. font-size: 1em;
  190. cursor: pointer;
  191. transition: all 0.3s ease;
  192. text-decoration: none;
  193. display: inline-flex;
  194. align-items: center;
  195. gap: 8px;
  196. }
  197. .btn-primary {
  198. background: linear-gradient(135deg, #667eea, #764ba2);
  199. color: white;
  200. }
  201. .btn-primary:hover {
  202. transform: translateY(-1px);
  203. box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);
  204. }
  205. .btn-secondary {
  206. background: #e2e8f0;
  207. color: #4a5568;
  208. }
  209. .btn-secondary:hover {
  210. background: #cbd5e0;
  211. }
  212. .ai-suggestions {
  213. background: linear-gradient(135deg, #ffecd2 0%, #fcb69f 100%);
  214. border: none;
  215. }
  216. .suggestions-list {
  217. list-style: none;
  218. margin-top: 15px;
  219. }
  220. .suggestions-list li {
  221. background: rgba(255, 255, 255, 0.7);
  222. margin: 8px 0;
  223. padding: 10px;
  224. border-radius: 6px;
  225. border-left: 4px solid #f6ad55;
  226. }
  227. .memory-pool {
  228. background: linear-gradient(135deg, #d299c2 0%, #fef9d7 100%);
  229. border: none;
  230. }
  231. .memory-items {
  232. display: grid;
  233. grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  234. gap: 10px;
  235. margin-top: 15px;
  236. }
  237. .memory-item {
  238. background: rgba(255, 255, 255, 0.8);
  239. padding: 10px;
  240. border-radius: 6px;
  241. text-align: center;
  242. }
  243. .memory-count {
  244. font-size: 1.5em;
  245. font-weight: bold;
  246. color: #805ad5;
  247. }
  248. .footer {
  249. text-align: center;
  250. color: white;
  251. margin-top: 40px;
  252. opacity: 0.8;
  253. }
  254. @media (max-width: 768px) {
  255. .dashboard {
  256. grid-template-columns: 1fr;
  257. }
  258. .flow-modes {
  259. grid-template-columns: 1fr;
  260. }
  261. .stages-container {
  262. flex-direction: column;
  263. gap: 10px;
  264. }
  265. .stage-arrow {
  266. transform: rotate(90deg);
  267. margin: 5px 0;
  268. }
  269. }
  270. </style>
  271. </head>
  272. <body>
  273. <div class="container">
  274. <header class="header">
  275. <h1>🚀 AceFlow v2.0</h1>
  276. <p>AI驱动的敏捷开发工作流框架</p>
  277. </header>
  278. <div class="dashboard">
  279. <!-- 项目概览 -->
  280. <div class="card project-info">
  281. <h3><span class="icon">📁</span>项目概览</h3>
  282. <div class="project-status">
  283. <div class="status-item">
  284. <h4>项目名称</h4>
  285. <div class="status-value" id="project-name">aceflow-pateoas-framework</div>
  286. </div>
  287. <div class="status-item">
  288. <h4>流程模式</h4>
  289. <div class="status-value" id="flow-mode">轻量级</div>
  290. </div>
  291. <div class="status-item">
  292. <h4>当前阶段</h4>
  293. <div class="status-value" id="current-stage">未开始</div>
  294. </div>
  295. <div class="status-item">
  296. <h4>整体进度</h4>
  297. <div class="status-value" id="overall-progress">0%</div>
  298. </div>
  299. </div>
  300. <div class="progress-bar">
  301. <div class="progress-fill" id="progress-fill" style="width: 0%"></div>
  302. </div>
  303. </div>
  304. <!-- 流程模式选择 -->
  305. <div class="card">
  306. <h3><span class="icon">⚙️</span>流程模式</h3>
  307. <div class="flow-modes">
  308. <div class="mode-card active" data-mode="minimal">
  309. <div class="mode-title">轻量级</div>
  310. <div class="mode-desc">P→D→R<br>2-7天</div>
  311. </div>
  312. <div class="mode-card" data-mode="standard">
  313. <div class="mode-title">标准</div>
  314. <div class="mode-desc">P1→P2→D1→D2→R1<br>1-2周</div>
  315. </div>
  316. <div class="mode-card" data-mode="complete">
  317. <div class="mode-title">完整</div>
  318. <div class="mode-desc">S1→...→S8<br>2-4周</div>
  319. </div>
  320. </div>
  321. <div class="actions">
  322. <button class="btn btn-primary" onclick="switchMode()">
  323. <span>🔄</span>切换模式
  324. </button>
  325. </div>
  326. </div>
  327. <!-- 阶段流程 -->
  328. <div class="card">
  329. <h3><span class="icon">🎯</span>阶段流程</h3>
  330. <div class="stages-flow">
  331. <div class="stages-container" id="stages-container">
  332. <!-- 动态生成阶段 -->
  333. </div>
  334. </div>
  335. <div class="actions">
  336. <button class="btn btn-primary" onclick="startStage()">
  337. <span>🚀</span>开始阶段
  338. </button>
  339. <button class="btn btn-secondary" onclick="updateProgress()">
  340. <span>📈</span>更新进度
  341. </button>
  342. <button class="btn btn-secondary" onclick="completeStage()">
  343. <span>✅</span>完成阶段
  344. </button>
  345. </div>
  346. </div>
  347. <!-- AI建议 -->
  348. <div class="card ai-suggestions">
  349. <h3><span class="icon">🤖</span>AI智能建议</h3>
  350. <ul class="suggestions-list" id="ai-suggestions">
  351. <li>💡 推荐使用轻量级模式,适合当前项目规模</li>
  352. <li>🎯 建议从规划阶段开始,明确核心需求</li>
  353. <li>⚡ 可以启用敏捷集成,提升团队协作效率</li>
  354. </ul>
  355. <div class="actions">
  356. <button class="btn btn-primary" onclick="getAIAdvice()">
  357. <span>🧠</span>获取建议
  358. </button>
  359. </div>
  360. </div>
  361. <!-- 记忆中心 -->
  362. <div class="card memory-pool">
  363. <h3><span class="icon">🧠</span>记忆中心</h3>
  364. <div class="memory-items">
  365. <div class="memory-item">
  366. <div class="memory-count">0</div>
  367. <div>需求记忆</div>
  368. </div>
  369. <div class="memory-item">
  370. <div class="memory-count">0</div>
  371. <div>技术决策</div>
  372. </div>
  373. <div class="memory-item">
  374. <div class="memory-count">0</div>
  375. <div>问题记录</div>
  376. </div>
  377. <div class="memory-item">
  378. <div class="memory-count">0</div>
  379. <div>用户反馈</div>
  380. </div>
  381. </div>
  382. <div class="actions">
  383. <button class="btn btn-primary" onclick="openMemoryCenter()">
  384. <span>🔍</span>浏览记忆
  385. </button>
  386. </div>
  387. </div>
  388. </div>
  389. <footer class="footer">
  390. <p>AceFlow v2.0 - 让AI赋能你的敏捷开发流程 🎉</p>
  391. </footer>
  392. </div>
  393. <script>
  394. // 流程模式配置
  395. const flowModes = {
  396. minimal: {
  397. name: '轻量级',
  398. stages: ['P', 'D', 'R'],
  399. stageNames: { P: '规划', D: '开发', R: '评审' }
  400. },
  401. standard: {
  402. name: '标准',
  403. stages: ['P1', 'P2', 'D1', 'D2', 'R1'],
  404. stageNames: { P1: '需求', P2: '规划', D1: '实现', D2: '测试', R1: '评审' }
  405. },
  406. complete: {
  407. name: '完整',
  408. stages: ['S1', 'S2', 'S3', 'S4', 'S5', 'S6', 'S7', 'S8'],
  409. stageNames: {
  410. S1: '用户故事', S2: '任务拆分', S3: '测试用例', S4: '功能实现',
  411. S5: '测试执行', S6: '代码评审', S7: '演示反馈', S8: '总结归档'
  412. }
  413. }
  414. };
  415. let currentMode = 'minimal';
  416. let currentStage = null;
  417. let stageStates = {};
  418. // 初始化页面
  419. function init() {
  420. loadProjectState();
  421. updateModeSelection();
  422. renderStages();
  423. }
  424. // 加载项目状态
  425. function loadProjectState() {
  426. // 这里应该从后端API加载状态
  427. // 暂时使用模拟数据
  428. const mockState = {
  429. project_name: 'aceflow-pateoas-framework',
  430. flow_mode: 'minimal',
  431. current_stage: null,
  432. overall_progress: 0,
  433. stage_states: {}
  434. };
  435. document.getElementById('project-name').textContent = mockState.project_name;
  436. document.getElementById('flow-mode').textContent = flowModes[mockState.flow_mode].name;
  437. document.getElementById('current-stage').textContent = mockState.current_stage || '未开始';
  438. document.getElementById('overall-progress').textContent = mockState.overall_progress + '%';
  439. document.getElementById('progress-fill').style.width = mockState.overall_progress + '%';
  440. currentMode = mockState.flow_mode;
  441. currentStage = mockState.current_stage;
  442. stageStates = mockState.stage_states;
  443. }
  444. // 更新模式选择
  445. function updateModeSelection() {
  446. document.querySelectorAll('.mode-card').forEach(card => {
  447. card.classList.remove('active');
  448. if (card.dataset.mode === currentMode) {
  449. card.classList.add('active');
  450. }
  451. });
  452. }
  453. // 渲染阶段流程
  454. function renderStages() {
  455. const container = document.getElementById('stages-container');
  456. const mode = flowModes[currentMode];
  457. container.innerHTML = '';
  458. mode.stages.forEach((stage, index) => {
  459. // 阶段圆圈
  460. const stageDiv = document.createElement('div');
  461. stageDiv.className = 'stage';
  462. const circle = document.createElement('div');
  463. circle.className = 'stage-circle';
  464. // 确定阶段状态
  465. let status = 'pending';
  466. if (stageStates[stage]) {
  467. status = stageStates[stage].status;
  468. } else if (stage === currentStage) {
  469. status = 'in-progress';
  470. }
  471. circle.classList.add(status);
  472. circle.textContent = stage;
  473. const name = document.createElement('div');
  474. name.className = 'stage-name';
  475. name.textContent = mode.stageNames[stage];
  476. stageDiv.appendChild(circle);
  477. stageDiv.appendChild(name);
  478. container.appendChild(stageDiv);
  479. // 添加箭头(除了最后一个阶段)
  480. if (index < mode.stages.length - 1) {
  481. const arrow = document.createElement('div');
  482. arrow.className = 'stage-arrow';
  483. arrow.textContent = '→';
  484. container.appendChild(arrow);
  485. }
  486. });
  487. }
  488. // 模式卡片点击事件
  489. document.querySelectorAll('.mode-card').forEach(card => {
  490. card.addEventListener('click', () => {
  491. currentMode = card.dataset.mode;
  492. updateModeSelection();
  493. renderStages();
  494. document.getElementById('flow-mode').textContent = flowModes[currentMode].name;
  495. });
  496. });
  497. // 切换模式
  498. function switchMode() {
  499. alert('模式切换功能开发中...\n将支持智能数据迁移和进度保留');
  500. }
  501. // 开始阶段
  502. function startStage() {
  503. if (!currentStage) {
  504. const firstStage = flowModes[currentMode].stages[0];
  505. currentStage = firstStage;
  506. stageStates[firstStage] = { status: 'in-progress', progress: 0 };
  507. document.getElementById('current-stage').textContent = currentStage;
  508. renderStages();
  509. alert(`🚀 已开始阶段: ${currentStage} - ${flowModes[currentMode].stageNames[currentStage]}`);
  510. } else {
  511. alert(`当前已有活跃阶段: ${currentStage}`);
  512. }
  513. }
  514. // 更新进度
  515. function updateProgress() {
  516. if (!currentStage) {
  517. alert('❌ 没有活跃的阶段');
  518. return;
  519. }
  520. const progress = prompt('请输入当前阶段进度 (0-100):', '50');
  521. if (progress !== null && !isNaN(progress)) {
  522. const progressNum = Math.max(0, Math.min(100, parseInt(progress)));
  523. stageStates[currentStage].progress = progressNum;
  524. // 更新整体进度
  525. updateOverallProgress();
  526. alert(`📈 阶段 ${currentStage} 进度更新为 ${progressNum}%`);
  527. }
  528. }
  529. // 完成阶段
  530. function completeStage() {
  531. if (!currentStage) {
  532. alert('❌ 没有活跃的阶段');
  533. return;
  534. }
  535. stageStates[currentStage].status = 'completed';
  536. stageStates[currentStage].progress = 100;
  537. // 切换到下一阶段
  538. const stages = flowModes[currentMode].stages;
  539. const currentIndex = stages.indexOf(currentStage);
  540. if (currentIndex < stages.length - 1) {
  541. const nextStage = stages[currentIndex + 1];
  542. currentStage = nextStage;
  543. stageStates[nextStage] = { status: 'in-progress', progress: 0 };
  544. document.getElementById('current-stage').textContent = currentStage;
  545. alert(`🎉 阶段完成!自动切换到下一阶段: ${nextStage}`);
  546. } else {
  547. currentStage = null;
  548. document.getElementById('current-stage').textContent = '已完成';
  549. alert('🎊 所有阶段已完成!');
  550. }
  551. updateOverallProgress();
  552. renderStages();
  553. }
  554. // 更新整体进度
  555. function updateOverallProgress() {
  556. const stages = flowModes[currentMode].stages;
  557. let totalProgress = 0;
  558. stages.forEach(stage => {
  559. if (stageStates[stage]) {
  560. totalProgress += stageStates[stage].progress || 0;
  561. }
  562. });
  563. const overallProgress = Math.round(totalProgress / stages.length);
  564. document.getElementById('overall-progress').textContent = overallProgress + '%';
  565. document.getElementById('progress-fill').style.width = overallProgress + '%';
  566. }
  567. // 获取AI建议
  568. function getAIAdvice() {
  569. const suggestions = [
  570. '💡 当前阶段建议:专注核心功能实现,避免过度设计',
  571. '⚡ 性能优化:建议在开发阶段同步进行单元测试',
  572. '🎯 用户体验:建议添加用户反馈收集机制',
  573. '🔧 技术债务:检测到部分代码可以重构优化',
  574. '📈 进度管理:当前进度良好,建议保持开发节奏'
  575. ];
  576. const randomSuggestion = suggestions[Math.floor(Math.random() * suggestions.length)];
  577. const suggestionsList = document.getElementById('ai-suggestions');
  578. const newSuggestion = document.createElement('li');
  579. newSuggestion.textContent = randomSuggestion;
  580. suggestionsList.appendChild(newSuggestion);
  581. // 保持最多5条建议
  582. if (suggestionsList.children.length > 5) {
  583. suggestionsList.removeChild(suggestionsList.firstChild);
  584. }
  585. }
  586. // 打开记忆中心
  587. function openMemoryCenter() {
  588. alert('📚 记忆中心功能开发中...\n将支持智能知识检索和项目经验积累');
  589. }
  590. // 页面加载完成后初始化
  591. document.addEventListener('DOMContentLoaded', init);
  592. </script>
  593. </body>
  594. </html>