training.html 45 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333
  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>虚拟陪练舱 - 酒店全员移动工作平台</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: #8ab4f8;
  12. --primary-dark: #0a192f;
  13. --text-dark: #333333;
  14. --text-light: #f8f9fa;
  15. --card-bg: #ffffff;
  16. --border-color: #eaeaea;
  17. --shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
  18. --success: #34a853;
  19. --warning: #f9ab00;
  20. --danger: #ea4335;
  21. --info: #4285f4;
  22. }
  23. * {
  24. margin: 0;
  25. padding: 0;
  26. box-sizing: border-box;
  27. font-family: 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;
  28. }
  29. body {
  30. background-color: #f8fafc;
  31. color: var(--text-dark);
  32. line-height: 1.6;
  33. padding-bottom: 40px;
  34. }
  35. .container {
  36. max-width: 480px;
  37. margin: 0 auto;
  38. padding: 0 16px;
  39. }
  40. /* 头部导航 */
  41. .header {
  42. position: sticky;
  43. top: 0;
  44. background: rgba(255, 255, 255, 0.95);
  45. backdrop-filter: blur(10px);
  46. z-index: 100;
  47. padding: 16px 0;
  48. border-bottom: 1px solid var(--border-color);
  49. }
  50. .nav-top {
  51. display: flex;
  52. justify-content: space-between;
  53. align-items: center;
  54. }
  55. .back-btn {
  56. background: none;
  57. border: none;
  58. font-size: 20px;
  59. color: var(--text-dark);
  60. cursor: pointer;
  61. }
  62. .page-title {
  63. font-size: 18px;
  64. font-weight: 700;
  65. color: var(--primary-dark);
  66. }
  67. /* 场景选择卡 */
  68. .section-title {
  69. font-size: 16px;
  70. font-weight: 600;
  71. margin: 24px 0 12px;
  72. display: flex;
  73. align-items: center;
  74. justify-content: space-between;
  75. }
  76. .section-title i {
  77. margin-right: 8px;
  78. color: var(--primary);
  79. }
  80. .section-title .edit-btn {
  81. background: none;
  82. border: none;
  83. color: var(--primary-dark);
  84. font-size: 14px;
  85. cursor: pointer;
  86. display: flex;
  87. align-items: center;
  88. gap: 4px;
  89. }
  90. .difficulty-tabs {
  91. display: flex;
  92. gap: 12px;
  93. overflow-x: auto;
  94. padding: 8px 0 16px;
  95. -ms-overflow-style: none;
  96. scrollbar-width: none;
  97. }
  98. .difficulty-tabs::-webkit-scrollbar {
  99. display: none;
  100. }
  101. .tab {
  102. flex: 0 0 auto;
  103. padding: 8px 16px;
  104. border-radius: 20px;
  105. background-color: var(--card-bg);
  106. border: 1px solid var(--border-color);
  107. box-shadow: var(--shadow);
  108. font-size: 14px;
  109. cursor: pointer;
  110. transition: all 0.3s ease;
  111. }
  112. .tab.active {
  113. background-color: var(--primary);
  114. color: white;
  115. border-color: var(--primary);
  116. font-weight: 600;
  117. }
  118. .customer-bubbles {
  119. display: flex;
  120. flex-wrap: wrap;
  121. gap: 12px;
  122. margin-top: 8px;
  123. }
  124. .bubble {
  125. padding: 10px 16px;
  126. border-radius: 20px;
  127. background-color: var(--card-bg);
  128. border: 1px solid var(--border-color);
  129. box-shadow: var(--shadow);
  130. font-size: 14px;
  131. cursor: pointer;
  132. transition: all 0.2s ease;
  133. position: relative;
  134. display: flex;
  135. align-items: center;
  136. gap: 6px;
  137. }
  138. .bubble.active {
  139. background-color: var(--primary-dark);
  140. color: white;
  141. border-color: var(--primary-dark);
  142. }
  143. .bubble .delete-btn {
  144. display: none;
  145. background: none;
  146. border: none;
  147. color: rgba(255, 255, 255, 0.7);
  148. font-size: 12px;
  149. cursor: pointer;
  150. }
  151. .bubble.active .delete-btn {
  152. display: block;
  153. }
  154. .add-bubble {
  155. padding: 10px 16px;
  156. border-radius: 20px;
  157. background-color: var(--card-bg);
  158. border: 1px dashed var(--border-color);
  159. font-size: 14px;
  160. cursor: pointer;
  161. display: flex;
  162. align-items: center;
  163. gap: 6px;
  164. color: #94a3b8;
  165. }
  166. /* 对话主界面 - 修改部分 */
  167. .avatar-container {
  168. display: flex;
  169. justify-content: center;
  170. margin: 20px 0;
  171. }
  172. /* 客户头像缩小到100px */
  173. .customer-avatar {
  174. width: 100px;
  175. height: 100px;
  176. border-radius: 50%;
  177. background: linear-gradient(135deg, var(--primary), var(--primary-dark));
  178. display: flex;
  179. align-items: center;
  180. justify-content: center;
  181. position: relative;
  182. overflow: hidden;
  183. box-shadow: var(--shadow);
  184. transition: all 0.3s ease;
  185. }
  186. .customer-avatar::before {
  187. content: "";
  188. position: absolute;
  189. width: 140px;
  190. height: 140px;
  191. background: radial-gradient(circle, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0) 70%);
  192. border-radius: 50%;
  193. }
  194. /* 头像图标缩小到36px */
  195. .customer-avatar i {
  196. font-size: 36px;
  197. color: white;
  198. }
  199. /* 聊天框高度增加到320px */
  200. .conversation-container {
  201. background-color: var(--card-bg);
  202. border-radius: 20px;
  203. box-shadow: var(--shadow);
  204. padding: 16px;
  205. margin: 16px 0;
  206. height: 320px; /* 修改此处 */
  207. overflow-y: auto;
  208. }
  209. .message {
  210. max-width: 80%;
  211. padding: 12px;
  212. margin-bottom: 16px;
  213. border-radius: 18px;
  214. position: relative;
  215. animation: fadeIn 0.3s ease;
  216. }
  217. @keyframes fadeIn {
  218. from { opacity: 0; transform: translateY(10px); }
  219. to { opacity: 1; transform: translateY(0); }
  220. }
  221. .customer-message {
  222. background-color: #f1f5f9;
  223. border-bottom-left-radius: 4px;
  224. align-self: flex-start;
  225. }
  226. .user-message {
  227. background-color: var(--primary);
  228. color: white;
  229. border-bottom-right-radius: 4px;
  230. margin-left: auto;
  231. }
  232. .input-area {
  233. display: flex;
  234. gap: 12px;
  235. align-items: center;
  236. background-color: var(--card-bg);
  237. border-radius: 30px;
  238. padding: 12px 20px;
  239. box-shadow: var(--shadow);
  240. margin-top: 16px;
  241. }
  242. .voice-btn {
  243. width: 48px;
  244. height: 48px;
  245. border-radius: 50%;
  246. background-color: var(--primary);
  247. color: white;
  248. display: flex;
  249. align-items: center;
  250. justify-content: center;
  251. cursor: pointer;
  252. border: none;
  253. font-size: 20px;
  254. transition: all 0.3s ease;
  255. }
  256. .voice-btn.active {
  257. background-color: var(--danger);
  258. color: white;
  259. animation: pulse 1.5s infinite;
  260. }
  261. @keyframes pulse {
  262. 0% { transform: scale(1); }
  263. 50% { transform: scale(1.05); }
  264. 100% { transform: scale(1); }
  265. }
  266. .text-input {
  267. flex: 1;
  268. padding: 12px 16px;
  269. border: 1px solid var(--border-color);
  270. border-radius: 24px;
  271. font-size: 16px;
  272. outline: none;
  273. transition: border-color 0.3s;
  274. }
  275. .text-input:focus {
  276. border-color: var(--primary);
  277. }
  278. .send-btn {
  279. width: 48px;
  280. height: 48px;
  281. border-radius: 50%;
  282. background-color: var(--primary-dark);
  283. color: white;
  284. display: flex;
  285. align-items: center;
  286. justify-content: center;
  287. cursor: pointer;
  288. border: none;
  289. font-size: 20px;
  290. }
  291. /* 能力仪表盘 */
  292. .dashboard {
  293. background-color: var(--card-bg);
  294. border-radius: 20px;
  295. box-shadow: var(--shadow);
  296. padding: 24px;
  297. margin: 24px 0;
  298. text-align: center;
  299. }
  300. .progress-container {
  301. position: relative;
  302. width: 180px;
  303. height: 180px;
  304. margin: 0 auto 20px;
  305. }
  306. .progress-circle {
  307. width: 100%;
  308. height: 100%;
  309. }
  310. .progress-value {
  311. position: absolute;
  312. top: 50%;
  313. left: 50%;
  314. transform: translate(-50%, -50%);
  315. font-size: 32px;
  316. font-weight: 700;
  317. color: var(--primary-dark);
  318. }
  319. .skills-container {
  320. display: flex;
  321. flex-wrap: wrap;
  322. justify-content: center;
  323. gap: 16px;
  324. margin-top: 20px;
  325. }
  326. .skill {
  327. display: flex;
  328. flex-direction: column;
  329. align-items: center;
  330. }
  331. .skill-progress {
  332. width: 80px;
  333. height: 6px;
  334. background-color: #e2e8f0;
  335. border-radius: 3px;
  336. margin-top: 8px;
  337. overflow: hidden;
  338. }
  339. .skill-progress-fill {
  340. height: 100%;
  341. background-color: var(--primary);
  342. border-radius: 3px;
  343. }
  344. .skill-name {
  345. font-size: 12px;
  346. color: var(--text-dark);
  347. margin-top: 4px;
  348. }
  349. /* 存档面板 */
  350. .report-card {
  351. background-color: var(--card-bg);
  352. border-radius: 20px;
  353. box-shadow: var(--shadow);
  354. padding: 20px;
  355. margin-top: 24px;
  356. }
  357. .report-header {
  358. display: flex;
  359. justify-content: space-between;
  360. align-items: center;
  361. margin-bottom: 16px;
  362. }
  363. .report-title {
  364. font-size: 18px;
  365. font-weight: 700;
  366. color: var(--primary-dark);
  367. }
  368. .comparison {
  369. display: flex;
  370. align-items: center;
  371. font-size: 14px;
  372. color: var(--success);
  373. }
  374. .comparison.down {
  375. color: var(--danger);
  376. }
  377. .comparison i {
  378. margin-right: 4px;
  379. }
  380. .report-summary {
  381. font-size: 14px;
  382. line-height: 1.7;
  383. margin-bottom: 20px;
  384. }
  385. .tags-container {
  386. display: flex;
  387. flex-wrap: wrap;
  388. gap: 8px;
  389. margin-bottom: 20px;
  390. }
  391. .tag {
  392. padding: 6px 12px;
  393. background-color: #e2e8f0;
  394. border-radius: 16px;
  395. font-size: 12px;
  396. }
  397. .actions {
  398. display: flex;
  399. gap: 12px;
  400. }
  401. .action-btn {
  402. flex: 1;
  403. padding: 12px;
  404. border-radius: 12px;
  405. border: none;
  406. font-weight: 600;
  407. cursor: pointer;
  408. display: flex;
  409. align-items: center;
  410. justify-content: center;
  411. gap: 8px;
  412. transition: all 0.3s ease;
  413. }
  414. .view-btn {
  415. background-color: var(--primary);
  416. color: white;
  417. }
  418. .history-btn {
  419. background-color: var(--primary-dark);
  420. color: white;
  421. }
  422. /* 弹窗样式 */
  423. .modal-overlay {
  424. position: fixed;
  425. top: 0;
  426. left: 0;
  427. right: 0;
  428. bottom: 0;
  429. background-color: rgba(0, 0, 0, 0.5);
  430. display: flex;
  431. align-items: center;
  432. justify-content: center;
  433. z-index: 1000;
  434. opacity: 0;
  435. pointer-events: none;
  436. transition: opacity 0.3s ease;
  437. }
  438. .modal-overlay.active {
  439. opacity: 1;
  440. pointer-events: all;
  441. }
  442. .modal {
  443. background-color: white;
  444. border-radius: 16px;
  445. width: 90%;
  446. max-width: 500px;
  447. max-height: 90vh;
  448. overflow-y: auto;
  449. padding: 24px;
  450. box-shadow: var(--shadow);
  451. transform: translateY(20px);
  452. transition: transform 0.3s ease;
  453. }
  454. .modal-overlay.active .modal {
  455. transform: translateY(0);
  456. }
  457. .modal-header {
  458. display: flex;
  459. justify-content: space-between;
  460. align-items: center;
  461. margin-bottom: 20px;
  462. padding-bottom: 16px;
  463. border-bottom: 1px solid var(--border-color);
  464. }
  465. .modal-title {
  466. font-size: 18px;
  467. font-weight: 700;
  468. color: var(--primary-dark);
  469. }
  470. .close-modal {
  471. background: none;
  472. border: none;
  473. font-size: 20px;
  474. cursor: pointer;
  475. color: #94a3b8;
  476. }
  477. .modal-content {
  478. margin-bottom: 24px;
  479. }
  480. .report-detail {
  481. background-color: white;
  482. padding: 20px;
  483. border-radius: 16px;
  484. }
  485. .report-info {
  486. display: flex;
  487. justify-content: space-between;
  488. margin-bottom: 20px;
  489. padding-bottom: 15px;
  490. border-bottom: 1px solid var(--border-color);
  491. }
  492. .info-item {
  493. display: flex;
  494. flex-direction: column;
  495. }
  496. .info-label {
  497. font-size: 12px;
  498. color: #64748b;
  499. margin-bottom: 4px;
  500. }
  501. .info-value {
  502. font-size: 14px;
  503. font-weight: 600;
  504. color: var(--text-dark);
  505. }
  506. .section {
  507. margin-bottom: 24px;
  508. }
  509. .section-title {
  510. font-size: 16px;
  511. font-weight: 600;
  512. margin-bottom: 12px;
  513. color: var(--primary-dark);
  514. display: flex;
  515. align-items: center;
  516. gap: 8px;
  517. }
  518. .section-title i {
  519. color: var(--primary);
  520. }
  521. .conversation-history {
  522. background-color: #f8fafc;
  523. border-radius: 12px;
  524. padding: 16px;
  525. max-height: 300px;
  526. overflow-y: auto;
  527. }
  528. .message-history {
  529. padding: 10px 12px;
  530. margin-bottom: 12px;
  531. border-radius: 12px;
  532. font-size: 14px;
  533. }
  534. .customer-message-history {
  535. background-color: #e2e8f0;
  536. align-self: flex-start;
  537. max-width: 80%;
  538. }
  539. .user-message-history {
  540. background-color: var(--primary-light);
  541. color: var(--text-dark);
  542. margin-left: auto;
  543. max-width: 80%;
  544. }
  545. .evaluation-content {
  546. background-color: #f8fafc;
  547. border-radius: 12px;
  548. padding: 16px;
  549. font-size: 14px;
  550. line-height: 1.6;
  551. }
  552. .summary-content {
  553. background-color: #f8fafc;
  554. border-radius: 12px;
  555. padding: 16px;
  556. font-size: 14px;
  557. line-height: 1.6;
  558. }
  559. .tag-list {
  560. display: flex;
  561. flex-wrap: wrap;
  562. gap: 8px;
  563. margin-top: 12px;
  564. }
  565. .history-list {
  566. background-color: #f8fafc;
  567. border-radius: 12px;
  568. padding: 16px;
  569. max-height: 400px;
  570. overflow-y: auto;
  571. }
  572. .history-item {
  573. padding: 12px;
  574. background-color: white;
  575. border-radius: 12px;
  576. margin-bottom: 12px;
  577. box-shadow: var(--shadow);
  578. cursor: pointer;
  579. transition: all 0.2s ease;
  580. }
  581. .history-item:hover {
  582. transform: translateY(-2px);
  583. box-shadow: 0 6px 15px rgba(0, 0, 0, 0.1);
  584. }
  585. .history-header {
  586. display: flex;
  587. justify-content: space-between;
  588. margin-bottom: 8px;
  589. }
  590. .history-date {
  591. font-weight: 600;
  592. color: var(--primary-dark);
  593. }
  594. .history-type {
  595. background-color: var(--primary);
  596. color: white;
  597. padding: 2px 8px;
  598. border-radius: 10px;
  599. font-size: 12px;
  600. }
  601. .history-summary {
  602. font-size: 14px;
  603. color: #64748b;
  604. display: -webkit-box;
  605. -webkit-line-clamp: 2;
  606. -webkit-box-orient: vertical;
  607. overflow: hidden;
  608. }
  609. .no-history {
  610. text-align: center;
  611. padding: 20px;
  612. color: #94a3b8;
  613. }
  614. /* 评分标签 */
  615. .score-tag {
  616. display: inline-block;
  617. padding: 4px 8px;
  618. border-radius: 12px;
  619. font-size: 12px;
  620. font-weight: 600;
  621. margin-top: 8px;
  622. }
  623. .high-score {
  624. background-color: #d1fae5;
  625. color: #065f46;
  626. }
  627. .medium-score {
  628. background-color: #fef3c7;
  629. color: #92400e;
  630. }
  631. .low-score {
  632. background-color: #fee2e2;
  633. color: #b91c1c;
  634. }
  635. /* 新增:修改说明 */
  636. .modification-notice {
  637. position: fixed;
  638. bottom: 20px;
  639. right: 20px;
  640. background: var(--primary);
  641. color: white;
  642. padding: 10px 20px;
  643. border-radius: 30px;
  644. font-size: 14px;
  645. box-shadow: 0 4px 15px rgba(0,0,0,0.2);
  646. z-index: 1000;
  647. animation: slideIn 0.5s ease-out;
  648. }
  649. @keyframes slideIn {
  650. from { transform: translateY(100px); opacity: 0; }
  651. to { transform: translateY(0); opacity: 1; }
  652. }
  653. </style>
  654. </head>
  655. <body>
  656. <div class="container">
  657. <!-- 头部导航 -->
  658. <header class="header">
  659. <div class="nav-top">
  660. <button class="back-btn">
  661. <i class="fas fa-arrow-left"></i>
  662. </button>
  663. <h1 class="page-title">虚拟陪练舱</h1>
  664. <div></div> <!-- 占位元素 -->
  665. </div>
  666. </header>
  667. <!-- 场景选择卡 -->
  668. <section>
  669. <div class="section-title">
  670. <div>
  671. <i class="fas fa-layer-group"></i>
  672. 选择陪练场景
  673. </div>
  674. <button class="edit-btn" id="editCustomerBtn">
  675. <i class="fas fa-edit"></i>
  676. 编辑分类
  677. </button>
  678. </div>
  679. <div class="difficulty-tabs">
  680. <div class="tab active">⭐ 初级</div>
  681. <div class="tab">⭐⭐ 中级</div>
  682. <div class="tab">⭐⭐⭐ 高级</div>
  683. <div class="tab">专家挑战</div>
  684. </div>
  685. <div class="customer-bubbles" id="customerBubbles">
  686. <div class="bubble active">
  687. 商务客户
  688. <button class="delete-btn">
  689. <i class="fas fa-times"></i>
  690. </button>
  691. </div>
  692. <div class="bubble">
  693. 家庭客户
  694. <button class="delete-btn">
  695. <i class="fas fa-times"></i>
  696. </button>
  697. </div>
  698. <div class="bubble">
  699. VIP客户
  700. <button class="delete-btn">
  701. <i class="fas fa-times"></i>
  702. </button>
  703. </div>
  704. <div class="bubble">
  705. 投诉客户
  706. <button class="delete-btn">
  707. <i class="fas fa-times"></i>
  708. </button>
  709. </div>
  710. <div class="bubble">
  711. 团体客户
  712. <button class="delete-btn">
  713. <i class="fas fa-times"></i>
  714. </button>
  715. </div>
  716. <div class="add-bubble" id="addCustomerBtn">
  717. <i class="fas fa-plus"></i>
  718. 添加类型
  719. </div>
  720. </div>
  721. </section>
  722. <!-- 对话主界面 -->
  723. <section>
  724. <div class="avatar-container">
  725. <div class="customer-avatar">
  726. <i class="fas fa-user-tie"></i>
  727. </div>
  728. </div>
  729. <div class="conversation-container" id="conversation">
  730. <div class="message customer-message">
  731. 您好,我想预订下周五的商务套房,你们有什么优惠吗?
  732. </div>
  733. <div class="message user-message">
  734. 感谢您的咨询!我们目前有商务套餐优惠,包含早餐和会议室使用,您需要了解详情吗?
  735. </div>
  736. <div class="message customer-message">
  737. 会议室可以容纳多少人?另外我需要延迟退房到下午4点。
  738. </div>
  739. <div class="message user-message">
  740. 我们的商务套房会议室最多可容纳20人,延迟退房到下午4点需要额外支付50%的房费。
  741. </div>
  742. <div class="message customer-message">
  743. 50%的费用太高了,我是贵酒店的黄金会员,能否提供免费延迟退房?
  744. </div>
  745. <div class="message user-message">
  746. 感谢您的会员支持!根据黄金会员权益,我们可以提供免费延迟退房到下午2点,或者您可以选择支付额外费用延长到4点。
  747. </div>
  748. <div class="message customer-message">
  749. 下午2点可能不太够,我下午3点有个重要会议。有没有折中方案?
  750. </div>
  751. <div class="message user-message">
  752. 我理解您的情况。我们可以为您提供下午3点的延迟退房,只需额外支付25%的房费,这样您看可以接受吗?
  753. </div>
  754. </div>
  755. <div class="input-area">
  756. <button class="voice-btn" id="voiceBtn">
  757. <i class="fas fa-microphone"></i>
  758. </button>
  759. <input type="text" class="text-input" placeholder="输入回复内容...">
  760. <button class="send-btn">
  761. <i class="fas fa-paper-plane"></i>
  762. </button>
  763. </div>
  764. </section>
  765. <!-- 能力仪表盘 -->
  766. <section class="dashboard">
  767. <h2 class="section-title">
  768. <i class="fas fa-chart-line"></i>
  769. 能力评估
  770. </h2>
  771. <div class="progress-container">
  772. <svg class="progress-circle" viewBox="0 0 180 180">
  773. <circle cx="90" cy="90" r="80" stroke="#e2e8f0" stroke-width="10" fill="none" />
  774. <circle cx="90" cy="90" r="80" stroke="#4285f4" stroke-width="10" fill="none"
  775. stroke-dasharray="502" stroke-dashoffset="150" stroke-linecap="round" />
  776. </svg>
  777. <div class="progress-value">86</div>
  778. </div>
  779. <div class="skills-container">
  780. <div class="skill">
  781. <div class="skill-name">反应力</div>
  782. <div class="skill-progress">
  783. <div class="skill-progress-fill" style="width: 90%"></div>
  784. </div>
  785. </div>
  786. <div class="skill">
  787. <div class="skill-name">话术</div>
  788. <div class="skill-progress">
  789. <div class="skill-progress-fill" style="width: 85%"></div>
  790. </div>
  791. </div>
  792. <div class="skill">
  793. <div class="skill-name">说服力</div>
  794. <div class="skill-progress">
  795. <div class="skill-progress-fill" style="width: 75%"></div>
  796. </div>
  797. </div>
  798. <div class="skill">
  799. <div class="skill-name">专业度</div>
  800. <div class="skill-progress">
  801. <div class="skill-progress-fill" style="width: 92%"></div>
  802. </div>
  803. </div>
  804. </div>
  805. </section>
  806. <!-- 存档面板 -->
  807. <section class="report-card">
  808. <div class="report-header">
  809. <h3 class="report-title">本次陪练报告</h3>
  810. <div class="comparison">
  811. <i class="fas fa-arrow-up"></i>
  812. <span>12%</span>
  813. </div>
  814. </div>
  815. <p class="report-summary">
  816. 本次与商务客户的对话中,您展现了优秀的专业知识和反应能力。建议在价格谈判环节采用更积极的策略,成功率可提升15%。
  817. </p>
  818. <div class="tags-container">
  819. <div class="tag">商务场景</div>
  820. <div class="tag">价格谈判</div>
  821. <div class="tag">提升空间</div>
  822. </div>
  823. <div class="actions">
  824. <button class="action-btn view-btn" id="viewReportBtn">
  825. <i class="fas fa-file-alt"></i>
  826. 查看完整报告
  827. </button>
  828. <button class="action-btn history-btn" id="historyReportBtn">
  829. <i class="fas fa-history"></i>
  830. 历史报告
  831. </button>
  832. </div>
  833. </section>
  834. </div>
  835. <!-- 添加客户类型弹窗 -->
  836. <div class="modal-overlay" id="addCustomerModal">
  837. <div class="modal">
  838. <div class="modal-header">
  839. <h3 class="modal-title">添加客户类型</h3>
  840. <button class="close-modal">
  841. <i class="fas fa-times"></i>
  842. </button>
  843. </div>
  844. <div class="modal-content">
  845. <div class="form-group">
  846. <label for="customerType">客户类型名称</label>
  847. <input type="text" id="customerType" placeholder="例如:新婚客户">
  848. </div>
  849. </div>
  850. <div class="modal-actions">
  851. <button class="modal-btn cancel-btn">取消</button>
  852. <button class="modal-btn save-btn">保存</button>
  853. </div>
  854. </div>
  855. </div>
  856. <!-- 完整报告弹窗 -->
  857. <div class="modal-overlay" id="fullReportModal">
  858. <div class="modal">
  859. <div class="modal-header">
  860. <h3 class="modal-title">陪练报告详情</h3>
  861. <button class="close-modal">
  862. <i class="fas fa-times"></i>
  863. </button>
  864. </div>
  865. <div class="modal-content">
  866. <div class="report-detail">
  867. <div class="report-info">
  868. <div class="info-item">
  869. <span class="info-label">日期</span>
  870. <span class="info-value">2023年10月15日</span>
  871. </div>
  872. <div class="info-item">
  873. <span class="info-label">客户类型</span>
  874. <span class="info-value">商务客户</span>
  875. </div>
  876. <div class="info-item">
  877. <span class="info-label">难度</span>
  878. <span class="info-value">⭐⭐ 中级</span>
  879. </div>
  880. </div>
  881. <div class="section">
  882. <div class="section-title">
  883. <i class="fas fa-comments"></i>
  884. 对话内容
  885. </div>
  886. <div class="conversation-history">
  887. <div class="message-history customer-message-history">
  888. 您好,我想预订下周五的商务套房,你们有什么优惠吗?
  889. </div>
  890. <div class="message-history user-message-history">
  891. 感谢您的咨询!我们目前有商务套餐优惠,包含早餐和会议室使用,您需要了解详情吗?
  892. </div>
  893. <div class="message-history customer-message-history">
  894. 会议室可以容纳多少人?另外我需要延迟退房到下午4点。
  895. </div>
  896. <div class="message-history user-message-history">
  897. 我们的商务套房会议室最多可容纳20人,延迟退房到下午4点需要额外支付50%的房费。
  898. </div>
  899. <div class="message-history customer-message-history">
  900. 50%的费用太高了,我是贵酒店的黄金会员,能否提供免费延迟退房?
  901. </div>
  902. </div>
  903. </div>
  904. <div class="section">
  905. <div class="section-title">
  906. <i class="fas fa-star"></i>
  907. 能力评价
  908. </div>
  909. <div class="evaluation-content">
  910. <p>您在本轮陪练中展现了出色的专业素养和服务意识:</p>
  911. <ul style="margin-top: 12px; padding-left: 20px;">
  912. <li>反应速度优秀,对客户需求理解准确</li>
  913. <li>专业知识扎实,准确提供了会议室容量信息</li>
  914. <li>会员政策运用得当,但未能灵活处理客户特殊需求</li>
  915. <li>建议提升价格谈判技巧,提供更多替代方案</li>
  916. </ul>
  917. <div class="score-tag high-score">综合评分: 86/100</div>
  918. </div>
  919. </div>
  920. <div class="section">
  921. <div class="section-title">
  922. <i class="fas fa-lightbulb"></i>
  923. 总结方法
  924. </div>
  925. <div class="summary-content">
  926. <p>针对商务客户的价格敏感需求,建议采用以下策略:</p>
  927. <ol style="margin-top: 12px; padding-left: 20px;">
  928. <li>强调会员权益价值,提供阶梯式延迟退房方案</li>
  929. <li>捆绑销售会议室与客房服务,提高整体收益</li>
  930. <li>准备2-3个替代方案,满足不同预算需求</li>
  931. <li>主动提供增值服务(如免费打印、咖啡服务)提升客户体验</li>
  932. </ol>
  933. <div class="tag-list">
  934. <div class="tag">商务谈判</div>
  935. <div class="tag">会员权益</div>
  936. <div class="tag">价格策略</div>
  937. </div>
  938. </div>
  939. </div>
  940. </div>
  941. </div>
  942. </div>
  943. </div>
  944. <!-- 历史报告弹窗 -->
  945. <div class="modal-overlay" id="historyReportModal">
  946. <div class="modal">
  947. <div class="modal-header">
  948. <h3 class="modal-title">历史陪练报告</h3>
  949. <button class="close-modal">
  950. <i class="fas fa-times"></i>
  951. </button>
  952. </div>
  953. <div class="modal-content">
  954. <div class="history-list">
  955. <div class="history-item" data-id="1">
  956. <div class="history-header">
  957. <span class="history-date">2023年10月15日 14:30</span>
  958. <span class="history-type">商务客户</span>
  959. </div>
  960. <div class="history-summary">
  961. 本次与商务客户的对话中,您展现了优秀的专业知识和反应能力。建议在价格谈判环节采用更积极的策略。
  962. </div>
  963. </div>
  964. <div class="history-item" data-id="2">
  965. <div class="history-header">
  966. <span class="history-date">2023年10月12日 10:15</span>
  967. <span class="history-type">投诉客户</span>
  968. </div>
  969. <div class="history-summary">
  970. 处理客户投诉时展现了良好的同理心,但解决方案不够全面,建议加强问题解决能力训练。
  971. </div>
  972. </div>
  973. <div class="history-item" data-id="3">
  974. <div class="history-header">
  975. <span class="history-date">2023年10月10日 16:45</span>
  976. <span class="history-type">VIP客户</span>
  977. </div>
  978. <div class="history-summary">
  979. 为VIP客户提供了个性化服务方案,展现了出色的服务意识,但在附加服务推荐上略显保守。
  980. </div>
  981. </div>
  982. <div class="history-item" data-id="4">
  983. <div class="history-header">
  984. <span class="history-date">2023年10月8日 09:30</span>
  985. <span class="history-type">家庭客户</span>
  986. </div>
  987. <div class="history-summary">
  988. 为家庭客户推荐了亲子套餐,但未能有效突出套餐价值,建议加强销售话术训练。
  989. </div>
  990. </div>
  991. <div class="history-item" data-id="5">
  992. <div class="history-header">
  993. <span class="history-date">2023年10月5日 11:20</span>
  994. <span class="history-type">团体客户</span>
  995. </div>
  996. <div class="history-summary">
  997. 处理团体预订时展现了良好的组织能力,但在协调不同需求方面还有提升空间。
  998. </div>
  999. </div>
  1000. </div>
  1001. </div>
  1002. </div>
  1003. </div>
  1004. <!-- 修改说明 -->
  1005. <div class="modification-notice" id="modNotice">
  1006. 已优化:聊天框高度增加,客户头像缩小
  1007. </div>
  1008. <script>
  1009. // 语音按钮交互
  1010. const voiceBtn = document.getElementById('voiceBtn');
  1011. voiceBtn.addEventListener('click', function() {
  1012. this.classList.toggle('active');
  1013. if (this.classList.contains('active')) {
  1014. this.innerHTML = '<i class="fas fa-square"></i>';
  1015. } else {
  1016. this.innerHTML = '<i class="fas fa-microphone"></i>';
  1017. }
  1018. });
  1019. // 模拟对话
  1020. const conversation = document.getElementById('conversation');
  1021. // 添加新消息的函数
  1022. function addMessage(text, isCustomer = false) {
  1023. const message = document.createElement('div');
  1024. message.classList.add('message');
  1025. message.classList.add(isCustomer ? 'customer-message' : 'user-message');
  1026. message.textContent = text;
  1027. conversation.appendChild(message);
  1028. conversation.scrollTop = conversation.scrollHeight;
  1029. }
  1030. // 模拟回复
  1031. document.querySelector('.send-btn').addEventListener('click', function() {
  1032. const input = document.querySelector('.text-input');
  1033. if (input.value.trim() !== '') {
  1034. addMessage(input.value);
  1035. input.value = '';
  1036. // 模拟AI回复
  1037. setTimeout(() => {
  1038. addMessage("听起来不错,我会考虑这个方案。能提供一份详细报价吗?", true);
  1039. }, 1000);
  1040. }
  1041. });
  1042. // 按Enter键发送消息
  1043. document.querySelector('.text-input').addEventListener('keypress', function(e) {
  1044. if (e.key === 'Enter') {
  1045. document.querySelector('.send-btn').click();
  1046. }
  1047. });
  1048. // 气泡选择效果
  1049. document.querySelectorAll('.bubble').forEach(bubble => {
  1050. bubble.addEventListener('click', function(e) {
  1051. if (e.target.classList.contains('delete-btn')) return;
  1052. document.querySelectorAll('.bubble').forEach(b => b.classList.remove('active'));
  1053. this.classList.add('active');
  1054. });
  1055. });
  1056. // 难度标签选择效果
  1057. document.querySelectorAll('.tab').forEach(tab => {
  1058. tab.addEventListener('click', function() {
  1059. document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));
  1060. this.classList.add('active');
  1061. });
  1062. });
  1063. // 客户类型编辑功能
  1064. const editBtn = document.getElementById('editCustomerBtn');
  1065. const addBtn = document.getElementById('addCustomerBtn');
  1066. const modal = document.getElementById('addCustomerModal');
  1067. const closeModal = document.querySelector('.close-modal');
  1068. const cancelBtn = document.querySelector('.cancel-btn');
  1069. const saveBtn = document.querySelector('.save-btn');
  1070. const bubblesContainer = document.getElementById('customerBubbles');
  1071. // 显示编辑模式
  1072. editBtn.addEventListener('click', function() {
  1073. const isEditing = this.classList.toggle('editing');
  1074. if (isEditing) {
  1075. this.innerHTML = '<i class="fas fa-check"></i> 完成编辑';
  1076. document.querySelectorAll('.delete-btn').forEach(btn => {
  1077. btn.style.display = 'block';
  1078. });
  1079. } else {
  1080. this.innerHTML = '<i class="fas fa-edit"></i> 编辑分类';
  1081. document.querySelectorAll('.delete-btn').forEach(btn => {
  1082. btn.style.display = 'none';
  1083. });
  1084. }
  1085. });
  1086. // 删除客户类型
  1087. document.querySelectorAll('.delete-btn').forEach(btn => {
  1088. btn.addEventListener('click', function(e) {
  1089. e.stopPropagation();
  1090. const bubble = this.parentElement;
  1091. if (document.querySelectorAll('.bubble').length > 1) {
  1092. bubble.remove();
  1093. } else {
  1094. alert('至少需要保留一个客户类型');
  1095. }
  1096. });
  1097. });
  1098. // 打开添加客户类型弹窗
  1099. addBtn.addEventListener('click', function() {
  1100. modal.classList.add('active');
  1101. });
  1102. // 关闭弹窗
  1103. function closeModalFunc() {
  1104. modal.classList.remove('active');
  1105. document.getElementById('customerType').value = '';
  1106. }
  1107. closeModal.addEventListener('click', closeModalFunc);
  1108. cancelBtn.addEventListener('click', closeModalFunc);
  1109. // 保存新客户类型
  1110. saveBtn.addEventListener('click', function() {
  1111. const typeName = document.getElementById('customerType').value.trim();
  1112. if (typeName) {
  1113. const newBubble = document.createElement('div');
  1114. newBubble.className = 'bubble';
  1115. newBubble.innerHTML = `
  1116. ${typeName}
  1117. <button class="delete-btn">
  1118. <i class="fas fa-times"></i>
  1119. </button>
  1120. `;
  1121. bubblesContainer.insertBefore(newBubble, addBtn);
  1122. // 为新气泡添加事件
  1123. newBubble.addEventListener('click', function(e) {
  1124. if (e.target.classList.contains('delete-btn')) return;
  1125. document.querySelectorAll('.bubble').forEach(b => b.classList.remove('active'));
  1126. this.classList.add('active');
  1127. });
  1128. // 为新删除按钮添加事件
  1129. newBubble.querySelector('.delete-btn').addEventListener('click', function(e) {
  1130. e.stopPropagation();
  1131. const bubble = this.parentElement;
  1132. if (document.querySelectorAll('.bubble').length > 1) {
  1133. bubble.remove();
  1134. } else {
  1135. alert('至少需要保留一个客户类型');
  1136. }
  1137. });
  1138. closeModalFunc();
  1139. } else {
  1140. alert('请输入客户类型名称');
  1141. }
  1142. });
  1143. // 报告弹窗功能
  1144. const viewReportBtn = document.getElementById('viewReportBtn');
  1145. const historyReportBtn = document.getElementById('historyReportBtn');
  1146. const fullReportModal = document.getElementById('fullReportModal');
  1147. const historyReportModal = document.getElementById('historyReportModal');
  1148. // 打开完整报告
  1149. viewReportBtn.addEventListener('click', function() {
  1150. fullReportModal.classList.add('active');
  1151. });
  1152. // 打开历史报告
  1153. historyReportBtn.addEventListener('click', function() {
  1154. historyReportModal.classList.add('active');
  1155. });
  1156. // 关闭报告弹窗
  1157. document.querySelectorAll('.close-modal').forEach(btn => {
  1158. btn.addEventListener('click', function() {
  1159. this.closest('.modal-overlay').classList.remove('active');
  1160. });
  1161. });
  1162. // 点击历史报告项显示详情
  1163. document.querySelectorAll('.history-item').forEach(item => {
  1164. item.addEventListener('click', function() {
  1165. const reportId = this.getAttribute('data-id');
  1166. historyReportModal.classList.remove('active');
  1167. // 模拟加载报告详情
  1168. setTimeout(() => {
  1169. fullReportModal.classList.add('active');
  1170. }, 300);
  1171. });
  1172. });
  1173. // 点击模态框外部关闭弹窗
  1174. document.querySelectorAll('.modal-overlay').forEach(overlay => {
  1175. overlay.addEventListener('click', function(e) {
  1176. if (e.target === this) {
  1177. this.classList.remove('active');
  1178. }
  1179. });
  1180. });
  1181. // 显示修改通知
  1182. setTimeout(() => {
  1183. document.getElementById('modNotice').style.display = 'none';
  1184. }, 3000);
  1185. </script>
  1186. </body>
  1187. </html>