Data.html 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232
  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>AI实验室 - 数据训练中心</title>
  7. <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
  8. <style>
  9. :root {
  10. --primary: #4285f4;
  11. --primary-light: rgba(66, 133, 244, 0.1);
  12. --primary-dark: #3367d6;
  13. --text-dark: #0a192f;
  14. --text-medium: #333333;
  15. --text-light: #8898aa;
  16. --background: #ffffff;
  17. --card-bg: #f8f9fa;
  18. --border: #e6e9ed;
  19. --success: #34a853;
  20. --warning: #fbbc05;
  21. --error: #ea4335;
  22. --shadow: 0 8px 24px rgba(0, 0, 0, 0.05);
  23. }
  24. * {
  25. margin: 0;
  26. padding: 0;
  27. box-sizing: border-box;
  28. font-family: 'Segoe UI', 'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif;
  29. }
  30. body {
  31. background-color: #f5f8ff;
  32. background-image: linear-gradient(135deg, #f5f8ff 0%, #e8ecff 100%);
  33. color: var(--text-medium);
  34. line-height: 1.6;
  35. padding: 16px;
  36. max-width: 500px;
  37. margin: 0 auto;
  38. position: relative;
  39. min-height: 100vh;
  40. overflow-x: hidden;
  41. }
  42. /* 头部导航 */
  43. .header {
  44. display: flex;
  45. justify-content: space-between;
  46. align-items: center;
  47. padding: 16px 0;
  48. margin-bottom: 20px;
  49. position: sticky;
  50. top: 0;
  51. background: transparent;
  52. z-index: 100;
  53. }
  54. .back-btn {
  55. width: 40px;
  56. height: 40px;
  57. border-radius: 50%;
  58. display: flex;
  59. align-items: center;
  60. justify-content: center;
  61. background: var(--background);
  62. border: none;
  63. color: var(--text-dark);
  64. font-size: 18px;
  65. cursor: pointer;
  66. transition: all 0.3s ease;
  67. box-shadow: var(--shadow);
  68. }
  69. .back-btn:hover {
  70. background: var(--primary-light);
  71. color: var(--primary);
  72. }
  73. .title {
  74. font-size: 24px;
  75. font-weight: 700;
  76. color: var(--text-dark);
  77. text-align: center;
  78. flex-grow: 1;
  79. text-shadow: 0 2px 4px rgba(0,0,0,0.05);
  80. }
  81. /* 卡片样式 */
  82. .card {
  83. background: var(--background);
  84. border-radius: 20px;
  85. padding: 24px;
  86. margin-bottom: 20px;
  87. box-shadow: var(--shadow);
  88. position: relative;
  89. overflow: hidden;
  90. border: 1px solid rgba(66, 133, 244, 0.1);
  91. transition: transform 0.3s ease, box-shadow 0.3s ease;
  92. }
  93. .card:hover {
  94. transform: translateY(-5px);
  95. box-shadow: 0 12px 30px rgba(66, 133, 244, 0.15);
  96. }
  97. .card-header {
  98. display: flex;
  99. justify-content: space-between;
  100. align-items: center;
  101. margin-bottom: 20px;
  102. }
  103. .card-title {
  104. font-size: 18px;
  105. font-weight: 700;
  106. color: var(--text-dark);
  107. }
  108. .card-subtitle {
  109. font-size: 14px;
  110. color: var(--text-light);
  111. margin-top: 4px;
  112. }
  113. /* 上传控制台 */
  114. .upload-console {
  115. position: relative;
  116. min-height: 220px;
  117. }
  118. .source-tags {
  119. display: flex;
  120. gap: 10px;
  121. margin-top: 20px;
  122. flex-wrap: wrap;
  123. }
  124. .source-tag {
  125. background: #f0f4f8;
  126. padding: 8px 16px;
  127. border-radius: 20px;
  128. font-size: 14px;
  129. color: var(--text-dark);
  130. transition: all 0.2s ease;
  131. border: 1px solid transparent;
  132. cursor: pointer;
  133. box-shadow: 0 2px 5px rgba(0,0,0,0.05);
  134. }
  135. .source-tag.active {
  136. border-color: var(--primary);
  137. box-shadow: 0 0 0 2px rgba(66, 133, 244, 0.3);
  138. color: var(--primary);
  139. font-weight: 600;
  140. background: rgba(66, 133, 244, 0.08);
  141. }
  142. /* 自定义标签区域 */
  143. .custom-tag-form {
  144. display: flex;
  145. margin-top: 25px;
  146. gap: 10px;
  147. align-items: center;
  148. }
  149. .custom-tag-input {
  150. flex: 1;
  151. padding: 12px 18px;
  152. border-radius: 20px;
  153. border: 1px solid var(--border);
  154. outline: none;
  155. font-size: 14px;
  156. transition: border-color 0.3s;
  157. background: var(--card-bg);
  158. box-shadow: inset 0 2px 4px rgba(0,0,0,0.03);
  159. }
  160. .custom-tag-input:focus {
  161. border-color: var(--primary);
  162. box-shadow: 0 0 0 2px rgba(66, 133, 244, 0.2);
  163. }
  164. .add-tag-btn {
  165. background: var(--primary);
  166. color: white;
  167. border: none;
  168. border-radius: 20px;
  169. padding: 12px 24px;
  170. font-size: 14px;
  171. font-weight: 600;
  172. cursor: pointer;
  173. transition: background 0.3s;
  174. display: flex;
  175. align-items: center;
  176. gap: 8px;
  177. box-shadow: 0 4px 10px rgba(66, 133, 244, 0.3);
  178. }
  179. .add-tag-btn:hover {
  180. background: var(--primary-dark);
  181. transform: translateY(-2px);
  182. box-shadow: 0 6px 15px rgba(66, 133, 244, 0.4);
  183. }
  184. /* 数据看板 */
  185. .stats-container {
  186. display: flex;
  187. justify-content: space-between;
  188. gap: 15px;
  189. margin-top: 15px;
  190. }
  191. .stat-item {
  192. flex: 1;
  193. text-align: center;
  194. padding: 15px;
  195. border-radius: 16px;
  196. background: var(--background);
  197. position: relative;
  198. box-shadow: 0 4px 10px rgba(0,0,0,0.03);
  199. border: 1px solid rgba(66, 133, 244, 0.08);
  200. }
  201. .stat-value {
  202. font-size: 24px;
  203. font-weight: 700;
  204. color: var(--text-dark);
  205. margin: 10px 0;
  206. }
  207. .stat-label {
  208. font-size: 13px;
  209. color: var(--text-light);
  210. }
  211. .progress-ring {
  212. position: relative;
  213. width: 80px;
  214. height: 80px;
  215. margin: 0 auto;
  216. }
  217. .progress-bg {
  218. width: 100%;
  219. height: 100%;
  220. border-radius: 50%;
  221. background: conic-gradient(var(--primary) 0% 75%, var(--border) 75% 100%);
  222. display: flex;
  223. align-items: center;
  224. justify-content: center;
  225. }
  226. .progress-inner {
  227. width: 70px;
  228. height: 70px;
  229. border-radius: 50%;
  230. background: var(--card-bg);
  231. display: flex;
  232. align-items: center;
  233. justify-content: center;
  234. font-size: 18px;
  235. font-weight: 700;
  236. color: var(--text-dark);
  237. }
  238. .quality-bar {
  239. height: 8px;
  240. background: var(--border);
  241. border-radius: 4px;
  242. margin-top: 15px;
  243. overflow: hidden;
  244. position: relative;
  245. }
  246. .quality-fill {
  247. height: 100%;
  248. width: 85%;
  249. background: linear-gradient(90deg, var(--primary), var(--primary-dark));
  250. border-radius: 4px;
  251. position: relative;
  252. }
  253. .quality-fill::after {
  254. content: '';
  255. position: absolute;
  256. top: 0;
  257. left: 0;
  258. right: 0;
  259. bottom: 0;
  260. background: linear-gradient(90deg,
  261. transparent,
  262. rgba(255, 255, 255, 0.5),
  263. transparent);
  264. animation: wave 2s linear infinite;
  265. }
  266. @keyframes wave {
  267. 0% { transform: translateX(-100%); }
  268. 100% { transform: translateX(100%); }
  269. }
  270. .alert-badge {
  271. position: absolute;
  272. top: -8px;
  273. right: -8px;
  274. width: 24px;
  275. height: 24px;
  276. border-radius: 50%;
  277. background: var(--error);
  278. display: flex;
  279. align-items: center;
  280. justify-content: center;
  281. color: white;
  282. font-size: 12px;
  283. font-weight: bold;
  284. animation: pulse 1.5s infinite;
  285. }
  286. @keyframes pulse {
  287. 0% { box-shadow: 0 0 0 0 rgba(234, 67, 53, 0.7); }
  288. 70% { box-shadow: 0 0 0 8px rgba(234, 67, 53, 0); }
  289. 100% { box-shadow: 0 0 0 0 rgba(234, 67, 53, 0); }
  290. }
  291. /* 训练结果展示 */
  292. .training-results {
  293. margin-top: 25px;
  294. }
  295. .result-item {
  296. display: flex;
  297. align-items: center;
  298. padding: 15px 0;
  299. border-bottom: 1px solid var(--border);
  300. transition: all 0.2s ease;
  301. }
  302. .result-item:hover {
  303. background: rgba(66, 133, 244, 0.03);
  304. border-radius: 12px;
  305. padding: 15px;
  306. }
  307. .result-item:last-child {
  308. border-bottom: none;
  309. }
  310. .result-icon {
  311. width: 40px;
  312. height: 40px;
  313. border-radius: 12px;
  314. background: var(--primary-light);
  315. display: flex;
  316. align-items: center;
  317. justify-content: center;
  318. color: var(--primary);
  319. margin-right: 15px;
  320. font-size: 18px;
  321. }
  322. .result-content {
  323. flex: 1;
  324. }
  325. .result-title {
  326. font-weight: 600;
  327. color: var(--text-dark);
  328. margin-bottom: 4px;
  329. }
  330. .result-meta {
  331. display: flex;
  332. font-size: 13px;
  333. color: var(--text-light);
  334. flex-wrap: wrap;
  335. gap: 10px;
  336. }
  337. .result-date {
  338. display: flex;
  339. align-items: center;
  340. gap: 5px;
  341. }
  342. .result-status {
  343. padding: 4px 10px;
  344. border-radius: 20px;
  345. font-size: 12px;
  346. font-weight: 600;
  347. }
  348. .status-completed {
  349. background: rgba(52, 168, 83, 0.1);
  350. color: var(--success);
  351. }
  352. .status-training {
  353. background: rgba(251, 188, 5, 0.1);
  354. color: var(--warning);
  355. }
  356. .status-error {
  357. background: rgba(234, 67, 53, 0.1);
  358. color: var(--error);
  359. }
  360. /* 数据记录部分 */
  361. .data-record {
  362. margin-top: 25px;
  363. }
  364. .record-header {
  365. display: flex;
  366. justify-content: space-between;
  367. align-items: center;
  368. margin-bottom: 15px;
  369. }
  370. .view-all {
  371. color: var(--primary);
  372. font-size: 14px;
  373. text-decoration: none;
  374. cursor: pointer;
  375. display: flex;
  376. align-items: center;
  377. gap: 5px;
  378. }
  379. .record-list {
  380. display: grid;
  381. grid-template-columns: repeat(2, 1fr);
  382. gap: 15px;
  383. }
  384. .record-item {
  385. background: var(--card-bg);
  386. border-radius: 16px;
  387. padding: 15px;
  388. box-shadow: 0 4px 10px rgba(0, 0, 0, 0.03);
  389. border: 1px solid rgba(66, 133, 244, 0.08);
  390. transition: all 0.3s ease;
  391. }
  392. .record-item:hover {
  393. transform: translateY(-3px);
  394. box-shadow: 0 6px 15px rgba(66, 133, 244, 0.15);
  395. }
  396. .record-title {
  397. font-size: 14px;
  398. font-weight: 600;
  399. color: var(--text-dark);
  400. margin-bottom: 10px;
  401. display: flex;
  402. align-items: center;
  403. gap: 5px;
  404. }
  405. .record-value {
  406. font-size: 22px;
  407. font-weight: 700;
  408. color: var(--primary);
  409. }
  410. .record-trend {
  411. display: flex;
  412. align-items: center;
  413. font-size: 12px;
  414. margin-top: 5px;
  415. }
  416. .trend-up {
  417. color: var(--success);
  418. }
  419. .trend-down {
  420. color: var(--error);
  421. }
  422. .trend-icon {
  423. margin-right: 4px;
  424. }
  425. /* 历史数据记录 */
  426. .history-list {
  427. max-height: 200px;
  428. overflow-y: auto;
  429. padding-right: 8px;
  430. }
  431. .history-item {
  432. display: flex;
  433. align-items: center;
  434. padding: 12px 0;
  435. border-bottom: 1px solid var(--border);
  436. transition: all 0.2s ease;
  437. }
  438. .history-item:hover {
  439. background: rgba(66, 133, 244, 0.03);
  440. border-radius: 12px;
  441. padding: 12px;
  442. }
  443. .history-icon {
  444. width: 36px;
  445. height: 36px;
  446. border-radius: 10px;
  447. background: var(--primary-light);
  448. display: flex;
  449. align-items: center;
  450. justify-content: center;
  451. color: var(--primary);
  452. margin-right: 12px;
  453. font-size: 16px;
  454. }
  455. .history-content {
  456. flex: 1;
  457. }
  458. .history-name {
  459. font-weight: 500;
  460. margin-bottom: 4px;
  461. }
  462. .history-meta {
  463. display: flex;
  464. font-size: 12px;
  465. color: var(--text-light);
  466. gap: 15px;
  467. }
  468. .history-size {
  469. display: flex;
  470. align-items: center;
  471. gap: 3px;
  472. }
  473. .history-date {
  474. color: var(--text-medium);
  475. display: flex;
  476. align-items: center;
  477. gap: 3px;
  478. }
  479. /* 页面标题装饰 */
  480. .page-header {
  481. text-align: center;
  482. margin-bottom: 25px;
  483. }
  484. .page-title {
  485. font-size: 28px;
  486. font-weight: 800;
  487. color: var(--text-dark);
  488. margin-bottom: 8px;
  489. background: linear-gradient(90deg, #3367d6, #4285f4);
  490. -webkit-background-clip: text;
  491. -webkit-text-fill-color: transparent;
  492. position: relative;
  493. display: inline-block;
  494. }
  495. .page-subtitle {
  496. color: var(--text-light);
  497. font-size: 16px;
  498. max-width: 300px;
  499. margin: 0 auto;
  500. }
  501. /* 装饰元素 */
  502. .decor-circle {
  503. position: absolute;
  504. width: 200px;
  505. height: 200px;
  506. border-radius: 50%;
  507. background: linear-gradient(135deg, rgba(66, 133, 244, 0.1) 0%, rgba(66, 133, 244, 0.05) 100%);
  508. z-index: -1;
  509. }
  510. .circle-1 {
  511. top: 10%;
  512. left: -50px;
  513. }
  514. .circle-2 {
  515. bottom: 10%;
  516. right: -50px;
  517. }
  518. /* 新增搜索框样式 */
  519. .search-container {
  520. margin-bottom: 20px;
  521. position: relative;
  522. }
  523. .search-box {
  524. display: flex;
  525. align-items: center;
  526. background: var(--card-bg);
  527. border-radius: 30px;
  528. padding: 8px 16px;
  529. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
  530. border: 1px solid var(--border);
  531. }
  532. .search-box i {
  533. color: var(--text-light);
  534. margin-right: 10px;
  535. font-size: 18px;
  536. }
  537. .search-input {
  538. flex: 1;
  539. border: none;
  540. background: transparent;
  541. padding: 10px 0;
  542. font-size: 15px;
  543. color: var(--text-dark);
  544. outline: none;
  545. }
  546. .search-input::placeholder {
  547. color: var(--text-light);
  548. }
  549. /* 上传控制台新样式 */
  550. .upload-method-selector {
  551. margin: 25px 0;
  552. }
  553. .method-title {
  554. font-size: 16px;
  555. font-weight: 600;
  556. margin-bottom: 12px;
  557. color: var(--text-dark);
  558. }
  559. .method-options {
  560. display: flex;
  561. gap: 15px;
  562. flex-wrap: wrap;
  563. }
  564. .method-option {
  565. flex: 1;
  566. min-width: 100px;
  567. padding: 15px;
  568. background: var(--card-bg);
  569. border-radius: 16px;
  570. text-align: center;
  571. cursor: pointer;
  572. transition: all 0.3s ease;
  573. border: 1px solid var(--border);
  574. }
  575. .method-option:hover {
  576. transform: translateY(-3px);
  577. box-shadow: 0 6px 15px rgba(66, 133, 244, 0.1);
  578. }
  579. .method-option.active {
  580. border-color: var(--primary);
  581. background: var(--primary-light);
  582. color: var(--primary);
  583. font-weight: 600;
  584. }
  585. .method-icon {
  586. font-size: 24px;
  587. margin-bottom: 10px;
  588. color: var(--primary);
  589. }
  590. .upload-action {
  591. display: flex;
  592. justify-content: center;
  593. margin-top: 15px;
  594. }
  595. .upload-button {
  596. background: var(--primary);
  597. color: white;
  598. border: none;
  599. border-radius: 30px;
  600. padding: 15px 40px;
  601. font-size: 16px;
  602. font-weight: 600;
  603. cursor: pointer;
  604. transition: all 0.3s ease;
  605. display: flex;
  606. align-items: center;
  607. gap: 10px;
  608. box-shadow: 0 6px 15px rgba(66, 133, 244, 0.3);
  609. }
  610. .upload-button:hover {
  611. background: var(--primary-dark);
  612. transform: translateY(-2px);
  613. box-shadow: 0 8px 20px rgba(66, 133, 244, 0.4);
  614. }
  615. .upload-button:active {
  616. transform: translateY(0);
  617. }
  618. /* 上传状态指示器 */
  619. .upload-status {
  620. margin-top: 20px;
  621. padding: 15px;
  622. border-radius: 16px;
  623. background: rgba(52, 168, 83, 0.1);
  624. color: var(--success);
  625. text-align: center;
  626. display: none;
  627. }
  628. .upload-status.error {
  629. background: rgba(234, 67, 53, 0.1);
  630. color: var(--error);
  631. }
  632. .upload-progress {
  633. height: 6px;
  634. background: var(--border);
  635. border-radius: 3px;
  636. margin-top: 10px;
  637. overflow: hidden;
  638. }
  639. .progress-bar {
  640. height: 100%;
  641. width: 0%;
  642. background: linear-gradient(90deg, var(--primary), var(--primary-dark));
  643. border-radius: 3px;
  644. transition: width 0.3s ease;
  645. }
  646. </style>
  647. </head>
  648. <body>
  649. <div class="decor-circle circle-1"></div>
  650. <div class="decor-circle circle-2"></div>
  651. <!-- 顶部导航 -->
  652. <div class="header">
  653. <button class="back-btn">
  654. <i class="fas fa-arrow-left"></i>
  655. </button>
  656. <h1 class="title">数据训练中心</h1>
  657. </div>
  658. <div class="page-header">
  659. <h1 class="page-title">AI数据训练中心</h1>
  660. <p class="page-subtitle">上传数据、训练模型、优化结果</p>
  661. </div>
  662. <!-- 上传控制台 -->
  663. <div class="card upload-console">
  664. <div class="card-header">
  665. <div>
  666. <div class="card-title">上传控制台</div>
  667. <div class="card-subtitle">选择数据类型和输入方式</div>
  668. </div>
  669. </div>
  670. <div class="source-tags" id="sourceTags">
  671. <div class="source-tag active">会议记录</div>
  672. <div class="source-tag">客户合同</div>
  673. <div class="source-tag">反馈表</div>
  674. <div class="source-tag">培训资料</div>
  675. </div>
  676. <div class="custom-tag-form">
  677. <input type="text" class="custom-tag-input" id="customTagInput" placeholder="输入新数据类型...">
  678. <button class="add-tag-btn" id="addTagBtn">
  679. 添加标签
  680. </button>
  681. </div>
  682. <div class="upload-method-selector">
  683. <div class="method-title">选择输入方式</div>
  684. <div class="method-options" id="methodOptions">
  685. <div class="method-option" data-method="camera">
  686. <div class="method-icon">
  687. <i class="fas fa-camera"></i>
  688. </div>
  689. <div>拍照</div>
  690. </div>
  691. <div class="method-option" data-method="file">
  692. <div class="method-icon">
  693. <i class="fas fa-file"></i>
  694. </div>
  695. <div>文件</div>
  696. </div>
  697. <div class="method-option" data-method="mic">
  698. <div class="method-icon">
  699. <i class="fas fa-microphone"></i>
  700. </div>
  701. <div>录音</div>
  702. </div>
  703. <div class="method-option" data-method="text">
  704. <div class="method-icon">
  705. <i class="fas fa-keyboard"></i>
  706. </div>
  707. <div>文本</div>
  708. </div>
  709. </div>
  710. </div>
  711. <div class="upload-action">
  712. <button class="upload-button" id="uploadButton">
  713. <i class="fas fa-cloud-upload-alt"></i> 上传数据
  714. </button>
  715. </div>
  716. <div class="upload-status" id="uploadStatus">
  717. <div>数据上传中...</div>
  718. <div class="upload-progress">
  719. <div class="progress-bar" id="progressBar"></div>
  720. </div>
  721. </div>
  722. </div>
  723. <!-- 数据看板 -->
  724. <div class="card">
  725. <div class="card-header">
  726. <div>
  727. <div class="card-title">数据看板</div>
  728. <div class="card-subtitle">今日处理状态</div>
  729. </div>
  730. <div class="alert-badge">3</div>
  731. </div>
  732. <div class="stats-container">
  733. <div class="stat-item">
  734. <div class="progress-ring">
  735. <div class="progress-bg">
  736. <div class="progress-inner">128</div>
  737. </div>
  738. </div>
  739. <div class="stat-label">处理量</div>
  740. </div>
  741. <div class="stat-item">
  742. <div class="stat-value">85%</div>
  743. <div class="stat-label">质量评分</div>
  744. <div class="quality-bar">
  745. <div class="quality-fill"></div>
  746. </div>
  747. </div>
  748. </div>
  749. <!-- 每日数据记录 -->
  750. <div class="data-record">
  751. <div class="record-header">
  752. <div class="card-title">每日数据记录</div>
  753. <a class="view-all">
  754. 查看全部 <i class="fas fa-arrow-right"></i>
  755. </a>
  756. </div>
  757. <div class="record-list">
  758. <div class="record-item">
  759. <div class="record-title"><i class="fas fa-file-medical"></i> 新增数据</div>
  760. <div class="record-value">42</div>
  761. <div class="record-trend trend-up">
  762. <i class="fas fa-arrow-up trend-icon"></i> 12%
  763. </div>
  764. </div>
  765. <div class="record-item">
  766. <div class="record-title"><i class="fas fa-cogs"></i> 处理中</div>
  767. <div class="record-value">18</div>
  768. <div class="record-trend trend-down">
  769. <i class="fas fa-arrow-down trend-icon"></i> 5%
  770. </div>
  771. </div>
  772. <div class="record-item">
  773. <div class="record-title"><i class="fas fa-clock"></i> 训练时间</div>
  774. <div class="record-value">1.8h</div>
  775. <div class="record-trend trend-up">
  776. <i class="fas fa-arrow-up trend-icon"></i> 23%
  777. </div>
  778. </div>
  779. <div class="record-item">
  780. <div class="record-title"><i class="fas fa-check-circle"></i> 完成率</div>
  781. <div class="record-value">76%</div>
  782. <div class="record-trend trend-up">
  783. <i class="fas fa-arrow-up trend-icon"></i> 8%
  784. </div>
  785. </div>
  786. </div>
  787. </div>
  788. </div>
  789. <!-- 历史数据上传记录 -->
  790. <div class="card">
  791. <div class="card-header">
  792. <div>
  793. <div class="card-title">历史数据上传记录</div>
  794. <div class="card-subtitle">最近上传的文件</div>
  795. </div>
  796. </div>
  797. <!-- 搜索区域 -->
  798. <div class="search-container">
  799. <div class="search-box">
  800. <i class="fas fa-search"></i>
  801. <input type="text" class="search-input" id="searchInput" placeholder="搜索文件名、类型或日期...">
  802. </div>
  803. </div>
  804. <div class="history-list" id="historyList">
  805. <div class="history-item">
  806. <div class="history-icon">
  807. <i class="fas fa-file-pdf"></i>
  808. </div>
  809. <div class="history-content">
  810. <div class="history-name">Q3销售报告.pdf</div>
  811. <div class="history-meta">
  812. <div class="history-size">
  813. <i class="fas fa-database"></i> 4.2MB
  814. </div>
  815. <div class="history-date">
  816. <i class="far fa-calendar"></i> 2023-10-15
  817. </div>
  818. </div>
  819. </div>
  820. </div>
  821. <div class="history-item">
  822. <div class="history-icon">
  823. <i class="fas fa-file-excel"></i>
  824. </div>
  825. <div class="history-content">
  826. <div class="history-name">客户数据.xlsx</div>
  827. <div class="history-meta">
  828. <div class="history-size">
  829. <i class="fas fa-database"></i> 3.1MB
  830. </div>
  831. <div class="history-date">
  832. <i class="far fa-calendar"></i> 2023-10-14
  833. </div>
  834. </div>
  835. </div>
  836. </div>
  837. <div class="history-item">
  838. <div class="history-icon">
  839. <i class="fas fa-file-word"></i>
  840. </div>
  841. <div class="history-content">
  842. <div class="history-name">会议纪要.docx</div>
  843. <div class="history-meta">
  844. <div class="history-size">
  845. <i class="fas fa-database"></i> 1.7MB
  846. </div>
  847. <div class="history-date">
  848. <i class="far fa-calendar"></i> 2023-10-13
  849. </div>
  850. </div>
  851. </div>
  852. </div>
  853. <div class="history-item">
  854. <div class="history-icon">
  855. <i class="fas fa-file-csv"></i>
  856. </div>
  857. <div class="history-content">
  858. <div class="history-name">用户反馈.csv</div>
  859. <div class="history-meta">
  860. <div class="history-size">
  861. <i class="fas fa-database"></i> 2.3MB
  862. </div>
  863. <div class="history-date">
  864. <i class="far fa-calendar"></i> 2023-10-12
  865. </div>
  866. </div>
  867. </div>
  868. </div>
  869. </div>
  870. </div>
  871. <!-- 训练结果展示 -->
  872. <div class="card">
  873. <div class="card-header">
  874. <div>
  875. <div class="card-title">训练结果展示</div>
  876. <div class="card-subtitle">模型训练状态与结果</div>
  877. </div>
  878. </div>
  879. <div class="training-results">
  880. <div class="result-item">
  881. <div class="result-icon">
  882. <i class="fas fa-brain"></i>
  883. </div>
  884. <div class="result-content">
  885. <div class="result-title">销售预测模型</div>
  886. <div class="result-meta">
  887. <div class="result-date">
  888. <i class="far fa-clock"></i> 训练时间: 2.3小时
  889. </div>
  890. <div class="result-status status-completed">已完成</div>
  891. </div>
  892. </div>
  893. </div>
  894. <div class="result-item">
  895. <div class="result-icon">
  896. <i class="fas fa-comments"></i>
  897. </div>
  898. <div class="result-content">
  899. <div class="result-title">情感分析模型</div>
  900. <div class="result-meta">
  901. <div class="result-date">
  902. <i class="far fa-clock"></i> 训练时间: 1.5小时
  903. </div>
  904. <div class="result-status status-training">训练中</div>
  905. </div>
  906. </div>
  907. </div>
  908. <div class="result-item">
  909. <div class="result-icon">
  910. <i class="fas fa-chart-line"></i>
  911. </div>
  912. <div class="result-content">
  913. <div class="result-title">趋势预测模型</div>
  914. <div class="result-meta">
  915. <div class="result-date">
  916. <i class="far fa-clock"></i> 训练时间: 3.1小时
  917. </div>
  918. <div class="result-status status-completed">已完成</div>
  919. </div>
  920. </div>
  921. </div>
  922. <div class="result-item">
  923. <div class="result-icon">
  924. <i class="fas fa-robot"></i>
  925. </div>
  926. <div class="result-content">
  927. <div class="result-title">客户服务模型</div>
  928. <div class="result-meta">
  929. <div class="result-date">
  930. <i class="far fa-clock"></i> 训练时间: 4.2小时
  931. </div>
  932. <div class="result-status status-error">失败</div>
  933. </div>
  934. </div>
  935. </div>
  936. </div>
  937. </div>
  938. <script>
  939. // 标签选择交互
  940. const tags = document.querySelectorAll('.source-tag');
  941. tags.forEach(tag => {
  942. tag.addEventListener('click', function() {
  943. tags.forEach(t => t.classList.remove('active'));
  944. this.classList.add('active');
  945. });
  946. });
  947. // 添加自定义标签
  948. const addTagBtn = document.getElementById('addTagBtn');
  949. const customTagInput = document.getElementById('customTagInput');
  950. const sourceTags = document.getElementById('sourceTags');
  951. addTagBtn.addEventListener('click', function() {
  952. const tagText = customTagInput.value.trim();
  953. if (tagText) {
  954. const newTag = document.createElement('div');
  955. newTag.className = 'source-tag';
  956. newTag.textContent = tagText;
  957. // 添加点击事件
  958. newTag.addEventListener('click', function() {
  959. tags.forEach(t => t.classList.remove('active'));
  960. this.classList.add('active');
  961. });
  962. sourceTags.appendChild(newTag);
  963. customTagInput.value = '';
  964. // 添加动画效果
  965. newTag.style.opacity = '0';
  966. newTag.style.transform = 'scale(0.8)';
  967. setTimeout(() => {
  968. newTag.style.transition = 'all 0.3s ease';
  969. newTag.style.opacity = '1';
  970. newTag.style.transform = 'scale(1)';
  971. }, 10);
  972. }
  973. });
  974. // 按Enter键添加标签
  975. customTagInput.addEventListener('keypress', function(e) {
  976. if (e.key === 'Enter') {
  977. addTagBtn.click();
  978. }
  979. });
  980. // 输入方式选择
  981. const methodOptions = document.querySelectorAll('.method-option');
  982. methodOptions.forEach(option => {
  983. option.addEventListener('click', function() {
  984. methodOptions.forEach(opt => opt.classList.remove('active'));
  985. this.classList.add('active');
  986. });
  987. });
  988. // 上传按钮功能
  989. const uploadButton = document.getElementById('uploadButton');
  990. const uploadStatus = document.getElementById('uploadStatus');
  991. const progressBar = document.getElementById('progressBar');
  992. uploadButton.addEventListener('click', function() {
  993. // 获取选中的标签
  994. const selectedTag = document.querySelector('.source-tag.active').textContent;
  995. // 获取选中的输入方式
  996. const selectedMethod = document.querySelector('.method-option.active');
  997. const methodName = selectedMethod ? selectedMethod.querySelector('div:last-child').textContent : '未选择';
  998. // 显示上传状态
  999. uploadStatus.style.display = 'block';
  1000. uploadStatus.innerHTML = `<div>正在上传: ${selectedTag} (方式: ${methodName})</div>
  1001. <div class="upload-progress">
  1002. <div class="progress-bar" id="progressBar"></div>
  1003. </div>`;
  1004. // 模拟上传进度
  1005. let progress = 0;
  1006. const interval = setInterval(() => {
  1007. progress += Math.floor(Math.random() * 10);
  1008. if (progress >= 100) {
  1009. progress = 100;
  1010. clearInterval(interval);
  1011. // 上传完成
  1012. setTimeout(() => {
  1013. uploadStatus.innerHTML = `<div><i class="fas fa-check-circle"></i> 上传成功: ${selectedTag} (方式: ${methodName})</div>`;
  1014. // 添加新项目到历史记录
  1015. const historyList = document.getElementById('historyList');
  1016. const newItem = document.createElement('div');
  1017. newItem.className = 'history-item';
  1018. newItem.innerHTML = `
  1019. <div class="history-icon">
  1020. <i class="fas fa-file-alt"></i>
  1021. </div>
  1022. <div class="history-content">
  1023. <div class="history-name">${selectedTag}.${getFileExtension(methodName)}</div>
  1024. <div class="history-meta">
  1025. <div class="history-size">
  1026. <i class="fas fa-database"></i> ${(Math.random() * 5).toFixed(1)}MB
  1027. </div>
  1028. <div class="history-date">
  1029. <i class="far fa-calendar"></i> ${getCurrentDate()}
  1030. </div>
  1031. </div>
  1032. </div>
  1033. `;
  1034. historyList.insertBefore(newItem, historyList.firstChild);
  1035. // 3秒后隐藏状态
  1036. setTimeout(() => {
  1037. uploadStatus.style.display = 'none';
  1038. }, 3000);
  1039. }, 500);
  1040. }
  1041. // 更新进度条
  1042. progressBar.style.width = `${progress}%`;
  1043. }, 200);
  1044. });
  1045. // 获取文件扩展名
  1046. function getFileExtension(method) {
  1047. switch(method) {
  1048. case '拍照': return 'jpg';
  1049. case '文件': return 'pdf';
  1050. case '录音': return 'mp3';
  1051. case '文本': return 'txt';
  1052. default: return 'dat';
  1053. }
  1054. }
  1055. // 获取当前日期
  1056. function getCurrentDate() {
  1057. const now = new Date();
  1058. const year = now.getFullYear();
  1059. const month = String(now.getMonth() + 1).padStart(2, '0');
  1060. const day = String(now.getDate()).padStart(2, '0');
  1061. return `${year}-${month}-${day}`;
  1062. }
  1063. // 历史记录搜索功能
  1064. const searchInput = document.getElementById('searchInput');
  1065. const historyItems = document.querySelectorAll('.history-item');
  1066. searchInput.addEventListener('input', function() {
  1067. const searchTerm = this.value.toLowerCase();
  1068. historyItems.forEach(item => {
  1069. const fileName = item.querySelector('.history-name').textContent.toLowerCase();
  1070. if (fileName.includes(searchTerm)) {
  1071. item.style.display = 'flex';
  1072. } else {
  1073. item.style.display = 'none';
  1074. }
  1075. });
  1076. });
  1077. // 模拟每日数据更新
  1078. setInterval(() => {
  1079. const valueElements = document.querySelectorAll('.record-value');
  1080. valueElements.forEach(el => {
  1081. const currentValue = parseInt(el.textContent) || 0;
  1082. const change = Math.floor(Math.random() * 5) - 2; // -2 到 2 之间的随机数
  1083. const newValue = Math.max(0, currentValue + change);
  1084. el.textContent = newValue;
  1085. });
  1086. }, 5000);
  1087. </script>
  1088. </body>
  1089. </html>