demo-mobile.html 147 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610
  1. <!DOCTYPE html>
  2. <html lang="zh-CN" class="light">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover">
  6. <title>AI销售培训系统</title>
  7. <script src="https://cdn.tailwindcss.com"></script>
  8. <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
  9. <script>
  10. tailwind.config = {
  11. darkMode: 'class',
  12. theme: {
  13. extend: {
  14. colors: {
  15. primary: '#16a34a',
  16. 'primary-dark': '#15803d',
  17. 'primary-light': '#dcfce7',
  18. },
  19. fontSize: {
  20. 'base': '17px',
  21. },
  22. spacing: {
  23. 'safe-top': 'env(safe-area-inset-top)',
  24. 'safe-bottom': 'env(safe-area-inset-bottom)',
  25. }
  26. }
  27. }
  28. }
  29. </script>
  30. <style>
  31. * {
  32. -webkit-tap-highlight-color: transparent;
  33. -webkit-touch-callout: none;
  34. outline: none !important;
  35. box-shadow: none !important;
  36. }
  37. *:focus {
  38. outline: none !important;
  39. box-shadow: none !important;
  40. }
  41. *:focus-visible {
  42. outline: none !important;
  43. box-shadow: none !important;
  44. }
  45. body {
  46. font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
  47. font-size: 17px;
  48. line-height: 1.5;
  49. overscroll-behavior: none;
  50. }
  51. .safe-top {
  52. padding-top: max(12px, env(safe-area-inset-top));
  53. }
  54. .safe-bottom {
  55. padding-bottom: max(8px, env(safe-area-inset-bottom));
  56. }
  57. .tab-content {
  58. display: none;
  59. }
  60. .tab-content.active {
  61. display: block;
  62. }
  63. .tab-item.active {
  64. color: #16a34a;
  65. }
  66. .tab-item.active i {
  67. color: #16a34a;
  68. }
  69. /* Sheet动画 */
  70. .sheet {
  71. transform: translateY(100%);
  72. transition: transform 0.3s ease-out;
  73. }
  74. .sheet.open {
  75. transform: translateY(0);
  76. }
  77. .sheet-overlay {
  78. opacity: 0;
  79. visibility: hidden;
  80. transition: opacity 0.3s, visibility 0.3s;
  81. }
  82. .sheet-overlay.open {
  83. opacity: 1;
  84. visibility: visible;
  85. }
  86. /* 防止模态框打开时外层滚动 */
  87. .modal-open {
  88. overflow: hidden;
  89. position: fixed;
  90. width: 100%;
  91. height: 100%;
  92. }
  93. /* 模态框滚动容器样式 */
  94. .modal-scrollable {
  95. overflow-y: auto;
  96. -webkit-overflow-scrolling: touch;
  97. }
  98. /* 思考动画 */
  99. @keyframes bounce {
  100. 0%, 60%, 100% { transform: translateY(0); }
  101. 30% { transform: translateY(-6px); }
  102. }
  103. .thinking-dot {
  104. animation: bounce 1.4s infinite ease-in-out both;
  105. }
  106. .thinking-dot:nth-child(1) { animation-delay: -0.32s; }
  107. .thinking-dot:nth-child(2) { animation-delay: -0.16s; }
  108. /* 雷达图 */
  109. .radar-chart {
  110. width: 200px;
  111. height: 200px;
  112. }
  113. /* 进度条动画 */
  114. @keyframes progress {
  115. from { width: 0; }
  116. }
  117. .progress-animate {
  118. animation: progress 1s ease-out forwards;
  119. }
  120. /* 下拉刷新 */
  121. .pull-refresh {
  122. transition: transform 0.3s;
  123. }
  124. .pull-refresh.pulling {
  125. transform: translateY(60px);
  126. }
  127. /* 视频播放器模拟 */
  128. .video-player {
  129. background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
  130. }
  131. /* 评分条 */
  132. .score-bar {
  133. transition: width 0.8s ease-out;
  134. }
  135. /* 隐藏滚动条 */
  136. .no-scrollbar::-webkit-scrollbar {
  137. display: none;
  138. }
  139. .no-scrollbar {
  140. -ms-overflow-style: none;
  141. scrollbar-width: none;
  142. }
  143. /* 问答页面增强样式 */
  144. @keyframes fadeIn {
  145. from { opacity: 0; transform: translateY(10px); }
  146. to { opacity: 1; transform: translateY(0); }
  147. }
  148. @keyframes slideUp {
  149. from { opacity: 0; transform: translateY(20px); }
  150. to { opacity: 1; transform: translateY(0); }
  151. }
  152. @keyframes pulse {
  153. 0%, 100% { opacity: 1; }
  154. 50% { opacity: 0.5; }
  155. }
  156. @keyframes shimmer {
  157. 0% { background-position: -200% 0; }
  158. 100% { background-position: 200% 0; }
  159. }
  160. .animate-fadeIn {
  161. animation: fadeIn 0.4s ease-out forwards;
  162. }
  163. .animate-slideUp {
  164. animation: slideUp 0.5s ease-out forwards;
  165. }
  166. .animate-pulse {
  167. animation: pulse 2s ease-in-out infinite;
  168. }
  169. /* 问答页面消息气泡样式 */
  170. .qa-message-enter {
  171. animation: slideUp 0.3s ease-out forwards;
  172. }
  173. /* 打字机光标效果 */
  174. .typing-cursor::after {
  175. content: '|';
  176. animation: blink 1s step-end infinite;
  177. }
  178. @keyframes blink {
  179. 0%, 50% { opacity: 1; }
  180. 51%, 100% { opacity: 0; }
  181. }
  182. /* 按钮点击涟漪效果 */
  183. .ripple {
  184. position: relative;
  185. overflow: hidden;
  186. }
  187. .ripple::after {
  188. content: '';
  189. position: absolute;
  190. width: 100%;
  191. height: 100%;
  192. top: 0;
  193. left: 0;
  194. pointer-events: none;
  195. background-image: radial-gradient(circle, rgba(255,255,255,0.3) 10%, transparent 10%);
  196. background-repeat: no-repeat;
  197. background-position: 50%;
  198. transform: scale(10);
  199. opacity: 0;
  200. transition: transform 0.5s, opacity 1s;
  201. }
  202. .ripple:active::after {
  203. transform: scale(0);
  204. opacity: 0.3;
  205. transition: 0s;
  206. }
  207. /* 渐变文字效果 */
  208. .gradient-text {
  209. background: linear-gradient(135deg, #00d68f, #3b82f6);
  210. -webkit-background-clip: text;
  211. -webkit-text-fill-color: transparent;
  212. background-clip: text;
  213. }
  214. /* 玻璃态效果 */
  215. .glass {
  216. background: rgba(26, 31, 46, 0.8);
  217. backdrop-filter: blur(12px);
  218. -webkit-backdrop-filter: blur(12px);
  219. }
  220. /* 悬浮提示 */
  221. .tooltip {
  222. position: relative;
  223. }
  224. .tooltip::before {
  225. content: attr(data-tip);
  226. position: absolute;
  227. bottom: 100%;
  228. left: 50%;
  229. transform: translateX(-50%);
  230. padding: 6px 12px;
  231. background: #1a1f2e;
  232. color: white;
  233. font-size: 12px;
  234. border-radius: 6px;
  235. white-space: nowrap;
  236. opacity: 0;
  237. visibility: hidden;
  238. transition: all 0.2s;
  239. pointer-events: none;
  240. }
  241. .tooltip:hover::before {
  242. opacity: 1;
  243. visibility: visible;
  244. transform: translateX(-50%) translateY(-4px);
  245. }
  246. /* 侧边栏滑入动画 */
  247. #qa-sidebar.slide-in {
  248. transform: translateX(0) !important;
  249. }
  250. /* 遮罩层渐变 */
  251. #sidebar-overlay {
  252. transition: opacity 0.3s ease, visibility 0.3s ease;
  253. }
  254. /* 输入框聚焦效果 */
  255. #qa-input:focus {
  256. box-shadow: 0 0 0 2px rgba(0, 214, 143, 0.3);
  257. }
  258. /* 发送按钮悬浮增强 */
  259. #qa-send-btn:hover {
  260. transform: scale(1.05);
  261. }
  262. /* 聊天消息悬浮效果 */
  263. .message-bubble {
  264. transition: transform 0.2s ease;
  265. }
  266. .message-bubble:hover {
  267. transform: scale(1.01);
  268. }
  269. </style>
  270. </head>
  271. <body class="bg-gray-50 dark:bg-gray-900 text-gray-900 dark:text-gray-100">
  272. <!-- 主内容区 -->
  273. <main class="pb-20">
  274. <!-- ==================== 首页Tab ==================== -->
  275. <div id="tab-home" class="tab-content active">
  276. <!-- 欢迎卡片 -->
  277. <div class="px-4 pt-4 pb-6">
  278. <div class="bg-gradient-to-br from-green-500 to-green-600 rounded-2xl p-5 text-white shadow-lg">
  279. <div class="flex items-center justify-between mb-4">
  280. <div class="flex items-center gap-3">
  281. <div class="w-12 h-12 bg-white/20 rounded-full flex items-center justify-center">
  282. <i class="fas fa-user text-xl"></i>
  283. </div>
  284. <div>
  285. <p class="text-sm opacity-90">欢迎回来</p>
  286. <p class="font-semibold text-lg">张小明</p>
  287. </div>
  288. </div>
  289. <div class="text-right">
  290. <p class="text-xs opacity-80">当前等级</p>
  291. <p class="font-bold text-xl">金牌销售</p>
  292. </div>
  293. </div>
  294. <div class="grid grid-cols-3 gap-4 text-center">
  295. <div class="bg-white/10 rounded-xl p-3">
  296. <p class="text-2xl font-bold">12</p>
  297. <p class="text-xs opacity-80">已完成课程</p>
  298. </div>
  299. <div class="bg-white/10 rounded-xl p-3">
  300. <p class="text-2xl font-bold">85%</p>
  301. <p class="text-xs opacity-80">平均得分</p>
  302. </div>
  303. <div class="bg-white/10 rounded-xl p-3">
  304. <p class="text-2xl font-bold">3</p>
  305. <p class="text-xs opacity-80">今日任务</p>
  306. </div>
  307. </div>
  308. </div>
  309. </div>
  310. <!-- 快捷入口 -->
  311. <div class="px-4 mb-6">
  312. <div class="grid grid-cols-4 gap-3">
  313. <div class="flex flex-col items-center gap-2" onclick="switchTab('learning')">
  314. <div class="w-14 h-14 bg-green-50 dark:bg-green-900/30 rounded-2xl flex items-center justify-center">
  315. <i class="fas fa-book-open text-green-600 dark:text-green-400 text-xl"></i>
  316. </div>
  317. <span class="text-sm">课程学习</span>
  318. </div>
  319. <div class="flex flex-col items-center gap-2" onclick="switchTab('practice')">
  320. <div class="w-14 h-14 bg-blue-50 dark:bg-blue-900/30 rounded-2xl flex items-center justify-center">
  321. <i class="fas fa-robot text-blue-600 dark:text-blue-400 text-xl"></i>
  322. </div>
  323. <span class="text-sm">AI陪练</span>
  324. </div>
  325. <div class="flex flex-col items-center gap-2" onclick="switchTab('score')">
  326. <div class="w-14 h-14 bg-purple-50 dark:bg-purple-900/30 rounded-2xl flex items-center justify-center">
  327. <i class="fas fa-chart-line text-purple-600 dark:text-purple-400 text-xl"></i>
  328. </div>
  329. <span class="text-sm">成绩分析</span>
  330. </div>
  331. <div class="flex flex-col items-center gap-2" onclick="switchTab('profile')">
  332. <div class="w-14 h-14 bg-orange-50 dark:bg-orange-900/30 rounded-2xl flex items-center justify-center">
  333. <i class="fas fa-trophy text-orange-600 dark:text-orange-400 text-xl"></i>
  334. </div>
  335. <span class="text-sm">排行榜</span>
  336. </div>
  337. </div>
  338. </div>
  339. <!-- 今日学习任务 -->
  340. <div class="px-4 mb-6">
  341. <div class="flex items-center justify-between mb-3">
  342. <h3 class="font-semibold text-lg">今日学习任务</h3>
  343. <span class="text-sm text-green-600">查看全部</span>
  344. </div>
  345. <div class="space-y-3">
  346. <div class="bg-white dark:bg-gray-800 rounded-xl p-4 shadow-sm border border-gray-100 dark:border-gray-700" onclick="openCourseDetail('course1')">
  347. <div class="flex gap-3">
  348. <div class="w-20 h-14 bg-gradient-to-br from-green-400 to-green-600 rounded-lg flex items-center justify-center flex-shrink-0">
  349. <i class="fas fa-play text-white"></i>
  350. </div>
  351. <div class="flex-1">
  352. <h4 class="font-medium mb-1">产品卖点提炼技巧</h4>
  353. <p class="text-sm text-gray-500 dark:text-gray-400">已学习 60%</p>
  354. <div class="mt-2 h-1.5 bg-gray-200 dark:bg-gray-700 rounded-full overflow-hidden">
  355. <div class="h-full bg-green-500 rounded-full" style="width: 60%"></div>
  356. </div>
  357. </div>
  358. <button class="self-center px-4 py-2 bg-green-500 text-white text-sm rounded-lg">继续</button>
  359. </div>
  360. </div>
  361. <div class="bg-white dark:bg-gray-800 rounded-xl p-4 shadow-sm border border-gray-100 dark:border-gray-700" onclick="openCourseDetail('course2')">
  362. <div class="flex gap-3">
  363. <div class="w-20 h-14 bg-gradient-to-br from-blue-400 to-blue-600 rounded-lg flex items-center justify-center flex-shrink-0">
  364. <i class="fas fa-play text-white"></i>
  365. </div>
  366. <div class="flex-1">
  367. <h4 class="font-medium mb-1">客户需求挖掘方法</h4>
  368. <p class="text-sm text-gray-500 dark:text-gray-400">未开始</p>
  369. <div class="mt-2 h-1.5 bg-gray-200 dark:bg-gray-700 rounded-full overflow-hidden">
  370. <div class="h-full bg-green-500 rounded-full" style="width: 0%"></div>
  371. </div>
  372. </div>
  373. <button class="self-center px-4 py-2 bg-green-500 text-white text-sm rounded-lg">开始</button>
  374. </div>
  375. </div>
  376. </div>
  377. </div>
  378. <!-- 最近学习 -->
  379. <div class="px-4 pb-6">
  380. <h3 class="font-semibold text-lg mb-3">最近学习</h3>
  381. <div class="bg-white dark:bg-gray-800 rounded-xl p-4 shadow-sm border border-gray-100 dark:border-gray-700">
  382. <div class="flex items-center gap-3">
  383. <div class="w-16 h-16 bg-gradient-to-br from-purple-400 to-purple-600 rounded-lg flex items-center justify-center">
  384. <i class="fas fa-check text-white text-xl"></i>
  385. </div>
  386. <div class="flex-1">
  387. <h4 class="font-medium">异议处理实战技巧</h4>
  388. <p class="text-sm text-gray-500 dark:text-gray-400">已完成 · 得分 92分</p>
  389. </div>
  390. <i class="fas fa-chevron-right text-gray-400 dark:text-gray-500"></i>
  391. </div>
  392. </div>
  393. </div>
  394. </div>
  395. <!-- ==================== 学习Tab ==================== -->
  396. <div id="tab-learning" class="tab-content">
  397. <div class="pb-20">
  398. <!-- 学习路线总览 -->
  399. <div class="px-4 pt-4 pb-6">
  400. <div class="bg-gradient-to-r from-blue-500 to-indigo-600 rounded-2xl p-5 text-white shadow-lg">
  401. <div class="flex items-center justify-between mb-4">
  402. <h2 class="font-bold text-xl">学习路线</h2>
  403. <div class="flex items-center gap-2">
  404. <div class="w-10 h-10 bg-white/20 rounded-full flex items-center justify-center">
  405. <i class="fas fa-award"></i>
  406. </div>
  407. </div>
  408. </div>
  409. <!-- 总体进度 -->
  410. <div class="mb-4">
  411. <div class="flex items-center justify-between mb-2">
  412. <span class="text-sm opacity-90">总学习进度</span>
  413. <span class="font-bold text-lg">40%</span>
  414. </div>
  415. <div class="h-2.5 bg-white/20 rounded-full overflow-hidden">
  416. <div class="h-full bg-white rounded-full" style="width: 40%"></div>
  417. </div>
  418. </div>
  419. <!-- 三个阶段 -->
  420. <div class="grid grid-cols-3 gap-2 text-center">
  421. <div class="bg-white/20 rounded-xl p-3">
  422. <div class="w-8 h-8 bg-green-500 rounded-full flex items-center justify-center mx-auto mb-2">
  423. <i class="fas fa-check text-sm"></i>
  424. </div>
  425. <p class="text-xs font-medium">入门阶段</p>
  426. <p class="text-xs opacity-75">3/3 完成</p>
  427. </div>
  428. <div class="bg-white/20 rounded-xl p-3">
  429. <div class="w-8 h-8 bg-yellow-400 rounded-full flex items-center justify-center mx-auto mb-2">
  430. <span class="text-xs font-bold">2/4</span>
  431. </div>
  432. <p class="text-xs font-medium">进阶阶段</p>
  433. <p class="text-xs opacity-75">进行中</p>
  434. </div>
  435. <div class="bg-white/20 rounded-xl p-3">
  436. <div class="w-8 h-8 bg-white/30 rounded-full flex items-center justify-center mx-auto mb-2">
  437. <i class="fas fa-lock text-sm"></i>
  438. </div>
  439. <p class="text-xs font-medium">精通阶段</p>
  440. <p class="text-xs opacity-75">未解锁</p>
  441. </div>
  442. </div>
  443. </div>
  444. </div>
  445. <!-- 当前阶段课程列表 -->
  446. <div class="px-4 mb-6">
  447. <div class="flex items-center justify-between mb-4">
  448. <div>
  449. <h3 class="font-semibold text-lg">进阶阶段 · 方案推荐与价值传递</h3>
  450. <p class="text-sm text-gray-500 dark:text-gray-400">2/4 完成</p>
  451. </div>
  452. <span class="px-3 py-1 bg-yellow-100 dark:bg-yellow-900/30 text-yellow-600 text-xs font-medium rounded-full">进行中</span>
  453. </div>
  454. <!-- 课程卡片网格 -->
  455. <div class="grid grid-cols-2 gap-3">
  456. <!-- 课程1:已完成 -->
  457. <div class="course-card bg-white dark:bg-gray-800 rounded-xl overflow-hidden shadow-sm border border-gray-100 dark:border-gray-700" onclick="openCourseDetail('course1')">
  458. <div class="h-24 bg-gradient-to-br from-green-400 to-green-600 flex items-center justify-center">
  459. <i class="fas fa-bullhorn text-white text-2xl"></i>
  460. </div>
  461. <div class="p-3">
  462. <div class="flex items-center gap-2 mb-1">
  463. <span class="px-1.5 py-0.5 bg-green-100 dark:bg-green-900/30 text-green-600 text-[10px] rounded">营销</span>
  464. <span class="text-[10px] text-gray-400">12课时</span>
  465. </div>
  466. <h4 class="font-medium text-sm mb-1">产品卖点提炼技巧</h4>
  467. <div class="h-1 bg-gray-200 dark:bg-gray-700 rounded-full overflow-hidden mb-1">
  468. <div class="h-full bg-green-500 rounded-full" style="width: 100%"></div>
  469. </div>
  470. <div class="flex items-center justify-between">
  471. <span class="text-[10px] text-green-600 font-medium">已完成</span>
  472. <button class="text-xs text-blue-500 hover:text-blue-600">回看</button>
  473. </div>
  474. </div>
  475. </div>
  476. <!-- 课程2:进行中 -->
  477. <div class="course-card bg-white dark:bg-gray-800 rounded-xl overflow-hidden shadow-sm border-2 border-green-500" onclick="openCourseDetail('course2')">
  478. <div class="relative h-24 bg-gradient-to-br from-blue-400 to-blue-600 flex items-center justify-center">
  479. <i class="fas fa-search text-white text-2xl"></i>
  480. <div class="absolute top-2 right-2 px-2 py-0.5 bg-white/20 rounded-full text-white text-[10px]">进行中</div>
  481. </div>
  482. <div class="p-3">
  483. <div class="flex items-center gap-2 mb-1">
  484. <span class="px-1.5 py-0.5 bg-blue-100 dark:bg-blue-900/30 text-blue-600 text-[10px] rounded">营销</span>
  485. <span class="text-[10px] text-gray-400">8课时</span>
  486. </div>
  487. <h4 class="font-medium text-sm mb-1">SPIN提问法</h4>
  488. <div class="h-1 bg-gray-200 dark:bg-gray-700 rounded-full overflow-hidden mb-1">
  489. <div class="h-full bg-blue-500 rounded-full" style="width: 60%"></div>
  490. </div>
  491. <div class="flex items-center justify-between">
  492. <span class="text-[10px] text-blue-600 font-medium">60%</span>
  493. <button class="px-3 py-1 bg-green-500 text-white text-xs rounded-lg">继续</button>
  494. </div>
  495. </div>
  496. </div>
  497. <!-- 课程3:未开始 -->
  498. <div class="course-card bg-white dark:bg-gray-800 rounded-xl overflow-hidden shadow-sm border border-gray-100 dark:border-gray-700 opacity-70" onclick="openCourseDetail('course3')">
  499. <div class="h-24 bg-gradient-to-br from-purple-400 to-purple-600 flex items-center justify-center relative">
  500. <i class="fas fa-gem text-white text-2xl"></i>
  501. <div class="absolute top-2 right-2 px-2 py-0.5 bg-white/20 rounded-full text-white text-[10px]">
  502. <i class="fas fa-lock text-xs"></i>
  503. </div>
  504. </div>
  505. <div class="p-3">
  506. <div class="flex items-center gap-2 mb-1">
  507. <span class="px-1.5 py-0.5 bg-purple-100 dark:bg-purple-900/30 text-purple-600 text-[10px] rounded">产品</span>
  508. <span class="text-[10px] text-gray-400">15课时</span>
  509. </div>
  510. <h4 class="font-medium text-sm mb-1">产品知识掌握</h4>
  511. <div class="h-1 bg-gray-200 dark:bg-gray-700 rounded-full overflow-hidden mb-1">
  512. <div class="h-full bg-gray-300 rounded-full" style="width: 0%"></div>
  513. </div>
  514. <div class="flex items-center justify-between">
  515. <span class="text-[10px] text-gray-500">未开始</span>
  516. <button class="px-3 py-1 bg-gray-300 text-gray-600 text-xs rounded-lg">开始</button>
  517. </div>
  518. </div>
  519. </div>
  520. <!-- 课程4:未开始 -->
  521. <div class="course-card bg-white dark:bg-gray-800 rounded-xl overflow-hidden shadow-sm border border-gray-100 dark:border-gray-700 opacity-70" onclick="openCourseDetail('course4')">
  522. <div class="h-24 bg-gradient-to-br from-orange-400 to-orange-600 flex items-center justify-center relative">
  523. <i class="fas fa-handshake text-white text-2xl"></i>
  524. <div class="absolute top-2 right-2 px-2 py-0.5 bg-white/20 rounded-full text-white text-[10px]">
  525. <i class="fas fa-lock text-xs"></i>
  526. </div>
  527. </div>
  528. <div class="p-3">
  529. <div class="flex items-center gap-2 mb-1">
  530. <span class="px-1.5 py-0.5 bg-orange-100 dark:bg-orange-900/30 text-orange-600 text-[10px] rounded">营销</span>
  531. <span class="text-[10px] text-gray-400">10课时</span>
  532. </div>
  533. <h4 class="font-medium text-sm mb-1">竞品对比应对</h4>
  534. <div class="h-1 bg-gray-200 dark:bg-gray-700 rounded-full overflow-hidden mb-1">
  535. <div class="h-full bg-gray-300 rounded-full" style="width: 0%"></div>
  536. </div>
  537. <div class="flex items-center justify-between">
  538. <span class="text-[10px] text-gray-500">未开始</span>
  539. <button class="px-3 py-1 bg-gray-300 text-gray-600 text-xs rounded-lg">开始</button>
  540. </div>
  541. </div>
  542. </div>
  543. </div>
  544. <!-- 去陪练按钮 -->
  545. <div class="mt-4 p-4 bg-gradient-to-r from-green-500/10 to-blue-500/10 rounded-xl border border-green-500/20">
  546. <div class="flex items-center justify-between">
  547. <div>
  548. <p class="font-medium text-sm mb-1">学完课程,去AI陪练</p>
  549. <p class="text-xs text-gray-500">实战演练,巩固学习成果</p>
  550. </div>
  551. <button onclick="switchTab('practice')" class="px-4 py-2 bg-green-500 text-white text-sm rounded-lg flex items-center gap-2">
  552. <i class="fas fa-robot"></i>
  553. 开始陪练
  554. </button>
  555. </div>
  556. </div>
  557. </div>
  558. <!-- 全部阶段课程 -->
  559. <div class="px-4">
  560. <div class="flex items-center justify-between mb-4">
  561. <h3 class="font-semibold text-lg">全部学习模块</h3>
  562. </div>
  563. <!-- 入门阶段:客户接待与需求挖掘 -->
  564. <div class="mb-6">
  565. <div class="flex items-center gap-2 mb-3">
  566. <div class="w-6 h-6 bg-green-500 rounded-full flex items-center justify-center">
  567. <i class="fas fa-check text-white text-xs"></i>
  568. </div>
  569. <h4 class="font-medium">入门阶段</h4>
  570. <span class="px-2 py-0.5 bg-green-100 dark:bg-green-900/30 text-green-600 text-xs rounded-full">已完成</span>
  571. </div>
  572. <p class="text-xs text-gray-500 mb-3">客户接待与需求挖掘 · 4门课程</p>
  573. <div class="grid grid-cols-4 gap-2">
  574. <div class="bg-white dark:bg-gray-800 rounded-lg p-2 text-center shadow-sm border border-gray-100 dark:border-gray-700">
  575. <div class="w-8 h-8 bg-green-50 dark:bg-green-900/30 rounded-lg flex items-center justify-center mx-auto mb-1">
  576. <i class="fas fa-user-tag text-green-600 dark:text-green-400 text-xs"></i>
  577. </div>
  578. <p class="text-[10px] font-medium">客户类型识别</p>
  579. <p class="text-[8px] text-green-500">✓ 已完成</p>
  580. </div>
  581. <div class="bg-white dark:bg-gray-800 rounded-lg p-2 text-center shadow-sm border border-gray-100 dark:border-gray-700">
  582. <div class="w-8 h-8 bg-green-50 dark:bg-green-900/30 rounded-lg flex items-center justify-center mx-auto mb-1">
  583. <i class="fas fa-search text-green-600 dark:text-green-400 text-xs"></i>
  584. </div>
  585. <p class="text-[10px] font-medium">需求挖掘</p>
  586. <p class="text-[8px] text-green-500">✓ 已完成</p>
  587. </div>
  588. <div class="bg-white dark:bg-gray-800 rounded-lg p-2 text-center shadow-sm border border-gray-100 dark:border-gray-700">
  589. <div class="w-8 h-8 bg-green-50 dark:bg-green-900/30 rounded-lg flex items-center justify-center mx-auto mb-1">
  590. <i class="fas fa-coins text-green-600 dark:text-green-400 text-xs"></i>
  591. </div>
  592. <p class="text-[10px] font-medium">预算判断</p>
  593. <p class="text-[8px] text-green-500">✓ 已完成</p>
  594. </div>
  595. <div class="bg-white dark:bg-gray-800 rounded-lg p-2 text-center shadow-sm border border-gray-100 dark:border-gray-700">
  596. <div class="w-8 h-8 bg-green-50 dark:bg-green-900/30 rounded-lg flex items-center justify-center mx-auto mb-1">
  597. <i class="fas fa-edit text-green-600 dark:text-green-400 text-xs"></i>
  598. </div>
  599. <p class="text-[10px] font-medium">客户画像</p>
  600. <p class="text-[8px] text-green-500">✓ 已完成</p>
  601. </div>
  602. </div>
  603. </div>
  604. <!-- 进阶阶段:方案推荐与价值传递 -->
  605. <div class="mb-6">
  606. <div class="flex items-center gap-2 mb-3">
  607. <div class="w-6 h-6 bg-yellow-400 rounded-full flex items-center justify-center">
  608. <span class="text-xs font-bold text-white">2/4</span>
  609. </div>
  610. <h4 class="font-medium">进阶阶段</h4>
  611. <span class="px-2 py-0.5 bg-yellow-100 dark:bg-yellow-900/30 text-yellow-600 text-xs rounded-full">进行中</span>
  612. </div>
  613. <p class="text-xs text-gray-500 mb-3">方案推荐与价值传递 · 4门课程</p>
  614. <div class="grid grid-cols-4 gap-2">
  615. <div class="bg-white dark:bg-gray-800 rounded-lg p-2 text-center shadow-sm border border-green-500">
  616. <div class="w-8 h-8 bg-green-50 dark:bg-green-900/30 rounded-lg flex items-center justify-center mx-auto mb-1">
  617. <i class="fas fa-bullhorn text-green-600 dark:text-green-400 text-xs"></i>
  618. </div>
  619. <p class="text-[10px] font-medium">产品卖点</p>
  620. <p class="text-[8px] text-green-500">✓ 已完成</p>
  621. </div>
  622. <div class="bg-white dark:bg-gray-800 rounded-lg p-2 text-center shadow-sm border-2 border-blue-500 relative">
  623. <div class="absolute -top-1 -right-1 w-4 h-4 bg-blue-500 rounded-full flex items-center justify-center">
  624. <span class="text-white text-[8px] font-bold">!</span>
  625. </div>
  626. <div class="w-8 h-8 bg-blue-50 dark:bg-blue-900/30 rounded-lg flex items-center justify-center mx-auto mb-1">
  627. <i class="fas fa-search text-blue-600 dark:text-blue-400 text-xs"></i>
  628. </div>
  629. <p class="text-[10px] font-medium">SPIN提问</p>
  630. <p class="text-[8px] text-blue-500">60% 进行中</p>
  631. </div>
  632. <div class="bg-white dark:bg-gray-800 rounded-lg p-2 text-center shadow-sm border border-gray-100 dark:border-gray-700 opacity-60">
  633. <div class="w-8 h-8 bg-gray-100 dark:bg-gray-700 rounded-lg flex items-center justify-center mx-auto mb-1">
  634. <i class="fas fa-gem text-gray-400 dark:text-gray-300 text-xs"></i>
  635. </div>
  636. <p class="text-[10px] font-medium">产品知识</p>
  637. <p class="text-[8px] text-gray-400">未开始</p>
  638. </div>
  639. <div class="bg-white dark:bg-gray-800 rounded-lg p-2 text-center shadow-sm border border-gray-100 dark:border-gray-700 opacity-60">
  640. <div class="w-8 h-8 bg-gray-100 dark:bg-gray-700 rounded-lg flex items-center justify-center mx-auto mb-1">
  641. <i class="fas fa-handshake text-gray-400 dark:text-gray-300 text-xs"></i>
  642. </div>
  643. <p class="text-[10px] font-medium">竞品应对</p>
  644. <p class="text-[8px] text-gray-400">未开始</p>
  645. </div>
  646. </div>
  647. </div>
  648. <!-- 精通阶段:异议处理与报价成交 -->
  649. <div class="mb-4">
  650. <div class="flex items-center gap-2 mb-3">
  651. <div class="w-6 h-6 bg-gray-300 dark:bg-gray-600 rounded-full flex items-center justify-center">
  652. <i class="fas fa-lock text-gray-500 text-xs"></i>
  653. </div>
  654. <h4 class="font-medium">精通阶段</h4>
  655. <span class="px-2 py-0.5 bg-gray-100 dark:bg-gray-800 text-gray-500 text-xs rounded-full">未解锁</span>
  656. </div>
  657. <p class="text-xs text-gray-500 mb-3">异议处理与报价成交 · 4门课程</p>
  658. <div class="grid grid-cols-4 gap-2 opacity-50">
  659. <div class="bg-white dark:bg-gray-800 rounded-lg p-2 text-center shadow-sm border border-gray-100 dark:border-gray-700">
  660. <div class="w-8 h-8 bg-gray-100 dark:bg-gray-700 rounded-lg flex items-center justify-center mx-auto mb-1">
  661. <i class="fas fa-exclamation-circle text-gray-400 dark:text-gray-300 text-xs"></i>
  662. </div>
  663. <p class="text-[10px] font-medium">异议处理</p>
  664. <p class="text-[8px] text-gray-400">
  665. <i class="fas fa-lock"></i>
  666. </p>
  667. </div>
  668. <div class="bg-white dark:bg-gray-800 rounded-lg p-2 text-center shadow-sm border border-gray-100 dark:border-gray-700">
  669. <div class="w-8 h-8 bg-gray-100 dark:bg-gray-700 rounded-lg flex items-center justify-center mx-auto mb-1">
  670. <i class="fas fa-file-invoice text-gray-400 dark:text-gray-300 text-xs"></i>
  671. </div>
  672. <p class="text-[10px] font-medium">报价技巧</p>
  673. <p class="text-[8px] text-gray-400">
  674. <i class="fas fa-lock"></i>
  675. </p>
  676. </div>
  677. <div class="bg-white dark:bg-gray-800 rounded-lg p-2 text-center shadow-sm border border-gray-100 dark:border-gray-700">
  678. <div class="w-8 h-8 bg-gray-100 dark:bg-gray-700 rounded-lg flex items-center justify-center mx-auto mb-1">
  679. <i class="fas fa-flag text-gray-400 dark:text-gray-300 text-xs"></i>
  680. </div>
  681. <p class="text-[10px] font-medium">成交信号</p>
  682. <p class="text-[8px] text-gray-400">
  683. <i class="fas fa-lock"></i>
  684. </p>
  685. </div>
  686. <div class="bg-white dark:bg-gray-800 rounded-lg p-2 text-center shadow-sm border border-gray-100 dark:border-gray-700">
  687. <div class="w-8 h-8 bg-gray-100 dark:bg-gray-700 rounded-lg flex items-center justify-center mx-auto mb-1">
  688. <i class="fas fa-rocket text-gray-400 dark:text-gray-300 text-xs"></i>
  689. </div>
  690. <p class="text-[10px] font-medium">逼单技巧</p>
  691. <p class="text-[8px] text-gray-400">
  692. <i class="fas fa-lock"></i>
  693. </p>
  694. </div>
  695. </div>
  696. </div>
  697. </div>
  698. </div>
  699. </div>
  700. <!-- ==================== 陪练Tab ==================== -->
  701. <div id="tab-practice" class="tab-content">
  702. <div class="px-4 pt-4 pb-6">
  703. <!-- 陪练记录卡片 -->
  704. <div class="bg-gradient-to-r from-green-500 to-green-600 rounded-2xl p-4 mb-6 shadow-lg">
  705. <div class="flex items-center justify-between">
  706. <div>
  707. <p class="text-green-100 text-sm mb-1">最近陪练</p>
  708. <p class="text-white font-semibold">价格敏感型客户</p>
  709. </div>
  710. <div class="text-right">
  711. <p class="text-2xl font-bold text-white">88</p>
  712. <p class="text-green-100 text-xs">上次得分</p>
  713. </div>
  714. </div>
  715. <div class="mt-3 flex items-center gap-2">
  716. <button class="flex-1 bg-white/20 hover:bg-white/30 text-white text-sm font-medium py-2.5 rounded-xl transition-colors flex items-center justify-center gap-2">
  717. <i class="fas fa-repeat"></i>
  718. <span>继续练习</span>
  719. </button>
  720. <button class="flex-1 bg-white text-green-600 text-sm font-medium py-2.5 rounded-xl hover:bg-green-50 transition-colors flex items-center justify-center gap-2">
  721. <i class="fas fa-history"></i>
  722. <span>查看记录</span>
  723. </button>
  724. </div>
  725. </div>
  726. <!-- 学习进度 -->
  727. <div class="grid grid-cols-3 gap-3 mb-6">
  728. <div class="bg-white dark:bg-gray-800 rounded-xl p-4 shadow-sm border border-gray-100 dark:border-gray-700 text-center">
  729. <div class="w-10 h-10 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mx-auto mb-2">
  730. <i class="fas fa-bullseye text-green-600 dark:text-green-400"></i>
  731. </div>
  732. <p class="text-2xl font-bold">28</p>
  733. <p class="text-xs text-gray-500">陪练次数</p>
  734. </div>
  735. <div class="bg-white dark:bg-gray-800 rounded-xl p-4 shadow-sm border border-gray-100 dark:border-gray-700 text-center">
  736. <div class="w-10 h-10 bg-blue-100 dark:bg-blue-900/30 rounded-full flex items-center justify-center mx-auto mb-2">
  737. <i class="fas fa-trophy text-blue-600 dark:text-blue-400"></i>
  738. </div>
  739. <p class="text-2xl font-bold">85</p>
  740. <p class="text-xs text-gray-500">平均得分</p>
  741. </div>
  742. <div class="bg-white dark:bg-gray-800 rounded-xl p-4 shadow-sm border border-gray-100 dark:border-gray-700 text-center">
  743. <div class="w-10 h-10 bg-purple-100 dark:bg-purple-900/30 rounded-full flex items-center justify-center mx-auto mb-2">
  744. <i class="fas fa-chart-line text-purple-600 dark:text-purple-400"></i>
  745. </div>
  746. <p class="text-2xl font-bold">+12%</p>
  747. <p class="text-xs text-gray-500">进步幅度</p>
  748. </div>
  749. </div>
  750. <!-- 场景选择 -->
  751. <div class="mb-4">
  752. <h2 class="font-semibold text-xl mb-2">选择陪练场景</h2>
  753. <p class="text-gray-500 dark:text-gray-400 text-sm mb-4">选择一种客户类型开始AI陪练</p>
  754. <div class="flex gap-2 overflow-x-auto no-scrollbar pb-2">
  755. <button class="category-btn active px-4 py-2 bg-green-500 text-white rounded-full text-sm whitespace-nowrap" data-category="all">全部</button>
  756. <button class="category-btn px-4 py-2 bg-white dark:bg-gray-800 text-gray-600 dark:text-gray-300 rounded-full text-sm whitespace-nowrap" data-category="reception">初次接待</button>
  757. <button class="category-btn px-4 py-2 bg-white dark:bg-gray-800 text-gray-600 dark:text-gray-300 rounded-full text-sm whitespace-nowrap" data-category="presentation">方案讲解</button>
  758. <button class="category-btn px-4 py-2 bg-white dark:bg-gray-800 text-gray-600 dark:text-gray-300 rounded-full text-sm whitespace-nowrap" data-category="objection">异议处理</button>
  759. <button class="category-btn px-4 py-2 bg-white dark:bg-gray-800 text-gray-600 dark:text-gray-300 rounded-full text-sm whitespace-nowrap" data-category="closing">报价成交</button>
  760. </div>
  761. </div>
  762. <div class="grid grid-cols-2 gap-4">
  763. <div class="scene-card bg-white dark:bg-gray-800 rounded-xl p-5 shadow-sm border border-gray-100 dark:border-gray-700 text-center" data-category="reception" onclick="startPractice('first-visit')">
  764. <div class="w-16 h-16 bg-blue-50 dark:bg-blue-900/30 rounded-2xl flex items-center justify-center mx-auto mb-3">
  765. <i class="fas fa-user-plus text-blue-500 dark:text-blue-400 text-2xl"></i>
  766. </div>
  767. <h3 class="font-semibold mb-1">初次进店</h3>
  768. <p class="text-sm text-gray-500">客户首次到店,建立信任</p>
  769. </div>
  770. <div class="scene-card bg-white dark:bg-gray-800 rounded-xl p-5 shadow-sm border border-gray-100 dark:border-gray-700 text-center" data-category="reception" onclick="startPractice('online-consult')">
  771. <div class="w-16 h-16 bg-green-50 dark:bg-green-900/30 rounded-2xl flex items-center justify-center mx-auto mb-3">
  772. <i class="fas fa-comments text-green-500 dark:text-green-400 text-2xl"></i>
  773. </div>
  774. <h3 class="font-semibold mb-1">线上咨询</h3>
  775. <p class="text-sm text-gray-500">客户在线咨询,需求挖掘</p>
  776. </div>
  777. <div class="scene-card bg-white dark:bg-gray-800 rounded-xl p-5 shadow-sm border border-gray-100 dark:border-gray-700 text-center" data-category="presentation" onclick="startPractice('kitchen-plan')">
  778. <div class="w-16 h-16 bg-orange-50 dark:bg-orange-900/30 rounded-2xl flex items-center justify-center mx-auto mb-3">
  779. <i class="fas fa-utensils text-orange-500 dark:text-orange-400 text-2xl"></i>
  780. </div>
  781. <h3 class="font-semibold mb-1">厨房方案</h3>
  782. <p class="text-sm text-gray-500">讲解厨房设计方案</p>
  783. </div>
  784. <div class="scene-card bg-white dark:bg-gray-800 rounded-xl p-5 shadow-sm border border-gray-100 dark:border-gray-700 text-center" data-category="presentation" onclick="startPractice('wardrobe-plan')">
  785. <div class="w-16 h-16 bg-purple-50 dark:bg-purple-900/30 rounded-2xl flex items-center justify-center mx-auto mb-3">
  786. <i class="fas fa-shirt text-purple-500 dark:text-purple-400 text-2xl"></i>
  787. </div>
  788. <h3 class="font-semibold mb-1">衣柜方案</h3>
  789. <p class="text-sm text-gray-500">讲解衣柜设计方案</p>
  790. </div>
  791. <div class="scene-card bg-white dark:bg-gray-800 rounded-xl p-5 shadow-sm border border-gray-100 dark:border-gray-700 text-center" data-category="objection" onclick="startPractice('price-objection')">
  792. <div class="w-16 h-16 bg-red-50 dark:bg-red-900/30 rounded-2xl flex items-center justify-center mx-auto mb-3">
  793. <i class="fas fa-tag text-red-500 dark:text-red-400 text-2xl"></i>
  794. </div>
  795. <h3 class="font-semibold mb-1">价格异议</h3>
  796. <p class="text-sm text-gray-500">客户觉得价格贵</p>
  797. </div>
  798. <div class="scene-card bg-white dark:bg-gray-800 rounded-xl p-5 shadow-sm border border-gray-100 dark:border-gray-700 text-center" data-category="objection" onclick="startPractice('brand-objection')">
  799. <div class="w-16 h-16 bg-yellow-50 dark:bg-yellow-900/30 rounded-2xl flex items-center justify-center mx-auto mb-3">
  800. <i class="fas fa-question-circle text-yellow-500 dark:text-yellow-400 text-2xl"></i>
  801. </div>
  802. <h3 class="font-semibold mb-1">品牌异议</h3>
  803. <p class="text-sm text-gray-500">客户质疑品牌知名度</p>
  804. </div>
  805. <div class="scene-card bg-white dark:bg-gray-800 rounded-xl p-5 shadow-sm border border-gray-100 dark:border-gray-700 text-center" data-category="objection" onclick="startPractice('quality-objection')">
  806. <div class="w-16 h-16 bg-cyan-50 dark:bg-cyan-900/30 rounded-2xl flex items-center justify-center mx-auto mb-3">
  807. <i class="fas fa-shield text-cyan-500 dark:text-cyan-400 text-2xl"></i>
  808. </div>
  809. <h3 class="font-semibold mb-1">质量顾虑</h3>
  810. <p class="text-sm text-gray-500">客户担心产品质量</p>
  811. </div>
  812. <div class="scene-card bg-white dark:bg-gray-800 rounded-xl p-5 shadow-sm border border-gray-100 dark:border-gray-700 text-center" data-category="closing" onclick="startPractice('price-closing')">
  813. <div class="w-16 h-16 bg-pink-50 dark:bg-pink-900/30 rounded-2xl flex items-center justify-center mx-auto mb-3">
  814. <i class="fas fa-file text-pink-500 dark:text-pink-400 text-2xl"></i>
  815. </div>
  816. <h3 class="font-semibold mb-1">报价签约</h3>
  817. <p class="text-sm text-gray-500">讲解报价并促成签约</p>
  818. </div>
  819. <div class="scene-card bg-white dark:bg-gray-800 rounded-xl p-5 shadow-sm border border-gray-100 dark:border-gray-700 text-center" data-category="closing" onclick="startPractice('hesitate-closing')">
  820. <div class="w-16 h-16 bg-indigo-50 dark:bg-indigo-900/30 rounded-2xl flex items-center justify-center mx-auto mb-3">
  821. <i class="fas fa-clock text-indigo-500 dark:text-indigo-400 text-2xl"></i>
  822. </div>
  823. <h3 class="font-semibold mb-1">犹豫客户</h3>
  824. <p class="text-sm text-gray-500">客户犹豫不决,需要逼单</p>
  825. </div>
  826. <div class="scene-card bg-white dark:bg-gray-800 rounded-xl p-5 shadow-sm border border-gray-100 dark:border-gray-700 text-center" data-category="closing" onclick="startPractice('family-closing')">
  827. <div class="w-16 h-16 bg-teal-50 dark:bg-teal-900/30 rounded-2xl flex items-center justify-center mx-auto mb-3">
  828. <i class="fas fa-users text-teal-500 dark:text-teal-400 text-2xl"></i>
  829. </div>
  830. <h3 class="font-semibold mb-1">全家决策</h3>
  831. <p class="text-sm text-gray-500">家庭成员共同决策</p>
  832. </div>
  833. </div>
  834. </div>
  835. <!-- 对话界面 -->
  836. <div id="chat-interface" class="hidden fixed inset-0 bg-gray-50 dark:bg-[#0f1419] z-[60] flex flex-col">
  837. <!-- 头部 -->
  838. <div class="flex-shrink-0 bg-white dark:bg-[#1a1f2e] px-4 flex items-center justify-between shadow-lg border-b border-gray-200 dark:border-gray-700/50" style="padding-top: calc(env(safe-area-inset-top) + 12px); padding-bottom: 12px;">
  839. <button onclick="closePractice()" class="w-11 h-11 flex items-center justify-center text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition-colors rounded-xl hover:bg-gray-100 dark:hover:bg-white/10">
  840. <i class="fas fa-chevron-left text-lg text-gray-600 dark:text-gray-400"></i>
  841. </button>
  842. <div class="text-center flex-1">
  843. <h3 class="font-semibold text-lg text-gray-900 dark:text-white" id="chat-title">价格敏感型客户</h3>
  844. <p class="text-xs text-gray-500 dark:text-gray-400 mt-0.5">AI陪练中</p>
  845. </div>
  846. <button onclick="endPractice()" class="px-4 py-2 bg-[#00d68f] text-white text-sm rounded-xl hover:opacity-90 transition-opacity">结束</button>
  847. </div>
  848. <!-- 消息区域 -->
  849. <div id="chat-messages" class="flex-1 overflow-y-auto px-4 py-4 space-y-4">
  850. <div class="flex gap-3 animate-fadeIn">
  851. <div class="w-10 h-10 bg-gradient-to-br from-[#00d68f] to-[#00b377] rounded-full flex items-center justify-center flex-shrink-0 shadow-lg shadow-[#00d68f]/20">
  852. <i class="fas fa-robot text-white text-sm"></i>
  853. </div>
  854. <div class="bg-gray-100 dark:bg-[#252d3d] rounded-2xl rounded-tl-sm px-5 py-3.5 max-w-[80%] shadow-lg">
  855. <p class="text-sm text-gray-900 dark:text-gray-100 leading-relaxed">你好,我看了你们的产品,感觉价格有点贵啊。隔壁那家比你们便宜20%呢。</p>
  856. </div>
  857. </div>
  858. </div>
  859. <!-- 快捷回复 -->
  860. <div id="quick-replies" class="px-4 py-3 bg-white dark:bg-[#1a1f2e] border-t border-gray-200 dark:border-gray-700/50">
  861. <div class="flex gap-2 overflow-x-auto">
  862. <button class="quick-reply px-4 py-2 bg-gray-100 dark:bg-[#252d3d] text-gray-700 dark:text-gray-200 rounded-full text-sm whitespace-nowrap hover:bg-gray-200 dark:hover:bg-[#2f3a4a] transition-colors active:scale-95" onclick="sendQuickReply('我们的品质更有保障')">我们的品质更有保障</button>
  863. <button class="quick-reply px-4 py-2 bg-gray-100 dark:bg-[#252d3d] text-gray-700 dark:text-gray-200 rounded-full text-sm whitespace-nowrap hover:bg-gray-200 dark:hover:bg-[#2f3a4a] transition-colors active:scale-95" onclick="sendQuickReply('可以给您申请优惠')">可以给您申请优惠</button>
  864. <button class="quick-reply px-4 py-2 bg-gray-100 dark:bg-[#252d3d] text-gray-700 dark:text-gray-200 rounded-full text-sm whitespace-nowrap hover:bg-gray-200 dark:hover:bg-[#2f3a4a] transition-colors active:scale-95" onclick="sendQuickReply('一分钱一分货')">一分钱一分货</button>
  865. </div>
  866. </div>
  867. <!-- 输入框 -->
  868. <div class="flex-shrink-0 bg-white dark:bg-[#1a1f2e] border-t border-gray-200 dark:border-gray-700/50 shadow-[0_-4px_20px_rgba(0,0,0,0.1)] z-[85]">
  869. <div class="px-4 pb-4 flex items-center gap-3" style="padding-bottom: calc(env(safe-area-inset-bottom) + 16px);">
  870. <button class="w-11 h-11 flex items-center justify-center text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition-colors rounded-xl hover:bg-gray-100 dark:hover:bg-white/10">
  871. <i class="fas fa-microphone text-lg text-gray-600 dark:text-gray-400"></i>
  872. </button>
  873. <div class="flex-1 bg-gray-100 dark:bg-[#252d3d] rounded-full px-5 py-3 shadow-inner">
  874. <input type="text" id="chat-input" placeholder="输入消息..." class="w-full bg-transparent outline-none text-base text-gray-900 dark:text-white placeholder-gray-500" onkeypress="handleEnter(event)">
  875. </div>
  876. <button onclick="sendMessage()" class="w-11 h-11 bg-gradient-to-br from-[#00d68f] to-[#00b377] rounded-full flex items-center justify-center text-white hover:shadow-lg hover:shadow-[#00d68f]/30 transition-all active:scale-95">
  877. <i class="fas fa-paper-plane text-sm text-white"></i>
  878. </button>
  879. </div>
  880. </div>
  881. </div>
  882. </div>
  883. <!-- ==================== 问答Tab ==================== -->
  884. <div id="tab-qa" class="tab-content hidden">
  885. <div class="fixed inset-0 bg-gray-50 dark:bg-[#0f1419] z-[60]">
  886. <!-- 侧边栏遮罩 -->
  887. <div id="sidebar-overlay" class="absolute inset-0 bg-black/70 z-[75] hidden" onclick="toggleSidebar()"></div>
  888. <!-- 侧边栏历史记录 -->
  889. <div id="qa-sidebar" class="absolute left-0 top-0 bottom-0 w-[75vw] bg-white dark:bg-[#1a1f2e] z-[90] transform -translate-x-full transition-transform duration-300 shadow-2xl">
  890. <div class="h-full flex flex-col">
  891. <div class="px-5 py-6 border-b border-gray-200 dark:border-gray-700/50 flex items-center justify-between" style="padding-top: calc(env(safe-area-inset-top) + 16px);">
  892. <h3 class="font-semibold text-lg text-gray-900 dark:text-white">历史记录</h3>
  893. <button onclick="toggleSidebar()" class="w-10 h-10 flex items-center justify-center text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition-colors rounded-full hover:bg-gray-100 dark:hover:bg-white/10">
  894. <i class="fas fa-times text-lg text-gray-600 dark:text-gray-400"></i>
  895. </button>
  896. </div>
  897. <div class="flex-1 overflow-y-auto">
  898. <div class="px-5 py-3 space-y-2" id="history-list">
  899. <!-- 历史记录项将通过JS动态渲染 -->
  900. </div>
  901. </div>
  902. </div>
  903. </div>
  904. <!-- 主内容容器 -->
  905. <div class="h-full flex flex-col">
  906. <!-- 头部 -->
  907. <div class="flex-shrink-0 bg-white dark:bg-[#1a1f2e] px-4 flex items-center justify-between border-b border-gray-200 dark:border-gray-700/50" style="padding-top: calc(env(safe-area-inset-top) + 12px); padding-bottom: 12px;">
  908. <button onclick="toggleSidebar()" class="w-11 h-11 flex items-center justify-center text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition-colors rounded-xl hover:bg-gray-100 dark:hover:bg-white/10">
  909. <i class="fas fa-bars text-lg text-gray-600 dark:text-gray-400"></i>
  910. </button>
  911. <div class="text-center flex-1">
  912. <h2 class="font-semibold text-lg text-gray-900 dark:text-white">AI知识问答</h2>
  913. <p class="text-xs text-gray-500 dark:text-gray-400 mt-0.5">随时随地获取销售知识支持</p>
  914. </div>
  915. <button onclick="switchTab('home')" class="w-11 h-11 flex items-center justify-center text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition-colors rounded-xl hover:bg-gray-100 dark:hover:bg-white/10">
  916. <i class="fas fa-times text-lg text-gray-600 dark:text-gray-400"></i>
  917. </button>
  918. </div>
  919. <!-- 消息区域 -->
  920. <div id="qa-messages" class="flex-1 min-h-0 overflow-y-auto px-4 py-4 space-y-4">
  921. <div class="flex gap-3">
  922. <div class="w-11 h-11 bg-gradient-to-br from-[#00d68f] to-[#00b377] rounded-full flex items-center justify-center flex-shrink-0">
  923. <i class="fas fa-robot text-white text-sm"></i>
  924. </div>
  925. <div class="bg-gray-100 dark:bg-[#252d3d] rounded-2xl rounded-tl-sm px-5 py-3.5 max-w-[80%]">
  926. <p class="text-sm text-gray-900 dark:text-gray-100 leading-relaxed">你好!我是你的AI知识助手。有什么销售问题可以随时问我~</p>
  927. </div>
  928. </div>
  929. </div>
  930. <!-- 底部输入区 -->
  931. <div class="flex-shrink-0 bg-white dark:bg-[#1a1f2e] border-t border-gray-200 dark:border-gray-700/50" style="padding-bottom: env(safe-area-inset-bottom);">
  932. <div class="px-4 py-3 flex items-center gap-3">
  933. <button onclick="newConversation()" class="flex items-center gap-2 px-4 py-2.5 bg-green-50 dark:bg-green-500/15 text-green-600 dark:text-green-400 rounded-full text-sm whitespace-nowrap hover:bg-green-100 dark:hover:bg-green-500/25 transition-colors">
  934. <i class="fas fa-plus text-xs"></i>
  935. <span class="font-medium">新建对话</span>
  936. </button>
  937. <button onclick="confirmClearConversation()" class="flex items-center gap-2 px-4 py-2.5 bg-red-50 dark:bg-red-500/15 text-red-600 dark:text-red-400 rounded-full text-sm whitespace-nowrap hover:bg-red-100 dark:hover:bg-red-500/25 transition-colors">
  938. <i class="fas fa-trash text-xs"></i>
  939. <span class="font-medium">清除当前对话</span>
  940. </button>
  941. </div>
  942. <div class="px-4 pb-4 flex items-center gap-3">
  943. <button class="w-11 h-11 flex items-center justify-center text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition-colors rounded-xl">
  944. <i class="fas fa-microphone text-lg text-gray-600 dark:text-gray-400"></i>
  945. </button>
  946. <div class="flex-1 bg-gray-100 dark:bg-[#252d3d] rounded-full px-5 py-3">
  947. <input type="text" id="qa-input" placeholder="发消息或按住说话" class="w-full bg-transparent outline-none text-base text-gray-900 dark:text-white placeholder-gray-500 dark:placeholder-gray-400 focus:outline-none focus:ring-0">
  948. </div>
  949. <button id="qa-send-btn" onclick="sendQAQuestion()" class="w-11 h-11 bg-gradient-to-br from-[#00d68f] to-[#00b377] rounded-full flex items-center justify-center text-white">
  950. <i class="fas fa-paper-plane text-sm text-white"></i>
  951. </button>
  952. </div>
  953. </div>
  954. </div>
  955. </div>
  956. </div>
  957. <!-- ==================== 成绩Tab ==================== -->
  958. <div id="tab-score" class="tab-content hidden">
  959. <div class="px-4 pt-4 pb-6">
  960. <!-- 能力画像 -->
  961. <div class="bg-white dark:bg-gray-800 rounded-xl p-5 shadow-sm border border-gray-100 dark:border-gray-700 mb-6">
  962. <h3 class="font-semibold text-lg mb-4 text-center">能力画像</h3>
  963. <div class="flex justify-center mb-4">
  964. <canvas id="radarChart" width="220" height="220"></canvas>
  965. </div>
  966. <div class="grid grid-cols-5 gap-2 text-center text-xs">
  967. <div><span class="text-gray-500">产品知识</span><p class="font-semibold text-green-600">85</p></div>
  968. <div><span class="text-gray-500">沟通技巧</span><p class="font-semibold text-green-600">78</p></div>
  969. <div><span class="text-gray-500">异议处理</span><p class="font-semibold text-green-600">82</p></div>
  970. <div><span class="text-gray-500">成交能力</span><p class="font-semibold text-green-600">75</p></div>
  971. <div><span class="text-gray-500">服务意识</span><p class="font-semibold text-green-600">88</p></div>
  972. </div>
  973. </div>
  974. <!-- 学习统计 -->
  975. <div class="grid grid-cols-2 gap-4 mb-6">
  976. <div class="bg-white dark:bg-gray-800 rounded-xl p-4 shadow-sm border border-gray-100 dark:border-gray-700">
  977. <div class="flex items-center gap-2 mb-2">
  978. <div class="w-8 h-8 bg-green-100 dark:bg-green-900/30 rounded-lg flex items-center justify-center">
  979. <i class="fas fa-book text-green-600 dark:text-green-400 text-sm"></i>
  980. </div>
  981. <span class="text-sm text-gray-500">学习时长</span>
  982. </div>
  983. <p class="text-2xl font-bold">24.5<span class="text-sm font-normal text-gray-500">小时</span></p>
  984. </div>
  985. <div class="bg-white dark:bg-gray-800 rounded-xl p-4 shadow-sm border border-gray-100 dark:border-gray-700">
  986. <div class="flex items-center gap-2 mb-2">
  987. <div class="w-8 h-8 bg-blue-100 dark:bg-blue-900/30 rounded-lg flex items-center justify-center">
  988. <i class="fas fa-check-circle text-blue-600 dark:text-blue-400 text-sm"></i>
  989. </div>
  990. <span class="text-sm text-gray-500">完成课程</span>
  991. </div>
  992. <p class="text-2xl font-bold">12<span class="text-sm font-normal text-gray-500">门</span></p>
  993. </div>
  994. <div class="bg-white dark:bg-gray-800 rounded-xl p-4 shadow-sm border border-gray-100 dark:border-gray-700">
  995. <div class="flex items-center gap-2 mb-2">
  996. <div class="w-8 h-8 bg-purple-100 dark:bg-purple-900/30 rounded-lg flex items-center justify-center">
  997. <i class="fas fa-robot text-purple-600 dark:text-purple-400 text-sm"></i>
  998. </div>
  999. <span class="text-sm text-gray-500">AI陪练</span>
  1000. </div>
  1001. <p class="text-2xl font-bold">28<span class="text-sm font-normal text-gray-500">次</span></p>
  1002. </div>
  1003. <div class="bg-white dark:bg-gray-800 rounded-xl p-4 shadow-sm border border-gray-100 dark:border-gray-700">
  1004. <div class="flex items-center gap-2 mb-2">
  1005. <div class="w-8 h-8 bg-orange-100 dark:bg-orange-900/30 rounded-lg flex items-center justify-center">
  1006. <i class="fas fa-star text-orange-600 dark:text-orange-400 text-sm"></i>
  1007. </div>
  1008. <span class="text-sm text-gray-500">平均得分</span>
  1009. </div>
  1010. <p class="text-2xl font-bold">85<span class="text-sm font-normal text-gray-500">分</span></p>
  1011. </div>
  1012. </div>
  1013. <!-- 历史记录 -->
  1014. <div>
  1015. <h3 class="font-semibold text-lg mb-3">学习历史</h3>
  1016. <div class="space-y-3">
  1017. <div class="bg-white dark:bg-gray-800 rounded-xl p-4 shadow-sm border border-gray-100 dark:border-gray-700">
  1018. <div class="flex items-center justify-between">
  1019. <div>
  1020. <p class="font-medium">产品卖点提炼技巧</p>
  1021. <p class="text-sm text-gray-500">2024-01-15</p>
  1022. </div>
  1023. <span class="px-3 py-1 bg-green-100 dark:bg-green-900/30 text-green-600 rounded-full text-sm font-medium">92分</span>
  1024. </div>
  1025. </div>
  1026. <div class="bg-white dark:bg-gray-800 rounded-xl p-4 shadow-sm border border-gray-100 dark:border-gray-700">
  1027. <div class="flex items-center justify-between">
  1028. <div>
  1029. <p class="font-medium">异议处理实战技巧</p>
  1030. <p class="text-sm text-gray-500">2024-01-12</p>
  1031. </div>
  1032. <span class="px-3 py-1 bg-green-100 dark:bg-green-900/30 text-green-600 rounded-full text-sm font-medium">88分</span>
  1033. </div>
  1034. </div>
  1035. <div class="bg-white dark:bg-gray-800 rounded-xl p-4 shadow-sm border border-gray-100 dark:border-gray-700">
  1036. <div class="flex items-center justify-between">
  1037. <div>
  1038. <p class="font-medium">客户需求挖掘方法</p>
  1039. <p class="text-sm text-gray-500">2024-01-10</p>
  1040. </div>
  1041. <span class="px-3 py-1 bg-yellow-100 dark:bg-yellow-900/30 text-yellow-600 rounded-full text-sm font-medium">76分</span>
  1042. </div>
  1043. </div>
  1044. </div>
  1045. </div>
  1046. </div>
  1047. </div>
  1048. <!-- ==================== 我的Tab ==================== -->
  1049. <div id="tab-profile" class="tab-content">
  1050. <div class="px-4 pt-4 pb-6">
  1051. <!-- 个人信息 -->
  1052. <div class="bg-white dark:bg-gray-800 rounded-xl p-5 shadow-sm border border-gray-100 dark:border-gray-700 mb-6">
  1053. <div class="flex items-center gap-4">
  1054. <div class="w-20 h-20 bg-gradient-to-br from-green-400 to-green-600 rounded-full flex items-center justify-center text-white text-3xl">
  1055. <i class="fas fa-user"></i>
  1056. </div>
  1057. <div class="flex-1">
  1058. <h3 class="font-semibold text-xl">张小明</h3>
  1059. <p class="text-gray-500 dark:text-gray-400">销售部 · 金牌销售</p>
  1060. <p class="text-sm text-gray-400 mt-1">工号: S2024001</p>
  1061. </div>
  1062. <button class="w-10 h-10 flex items-center justify-center text-gray-400">
  1063. <i class="fas fa-qrcode text-xl"></i>
  1064. </button>
  1065. </div>
  1066. </div>
  1067. <!-- 等级进度 -->
  1068. <div class="bg-white dark:bg-gray-800 rounded-xl p-5 shadow-sm border border-gray-100 dark:border-gray-700 mb-6">
  1069. <div class="flex items-center justify-between mb-3">
  1070. <h3 class="font-semibold">等级进度</h3>
  1071. <span class="text-sm text-green-600">金牌销售 Lv.3</span>
  1072. </div>
  1073. <div class="h-3 bg-gray-200 dark:bg-gray-700 rounded-full overflow-hidden mb-2">
  1074. <div class="h-full bg-gradient-to-r from-green-400 to-green-600 rounded-full" style="width: 65%"></div>
  1075. </div>
  1076. <div class="flex justify-between text-sm">
  1077. <span class="text-gray-500">当前: 6500/10000 经验</span>
  1078. <span class="text-gray-500">下一级: 铂金销售</span>
  1079. </div>
  1080. </div>
  1081. <!-- 设置列表 -->
  1082. <div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm border border-gray-100 dark:border-gray-700 overflow-hidden mb-6">
  1083. <div class="px-4 py-4 flex items-center justify-between border-b border-gray-100 dark:border-gray-700">
  1084. <div class="flex items-center gap-3">
  1085. <div class="w-9 h-9 bg-gray-100 dark:bg-gray-700 rounded-lg flex items-center justify-center">
  1086. <i class="fas fa-moon text-gray-600 dark:text-gray-400"></i>
  1087. </div>
  1088. <span>深色模式</span>
  1089. </div>
  1090. <button id="theme-toggle" class="w-12 h-6 bg-gray-300 dark:bg-green-500 rounded-full relative transition-colors" onclick="toggleTheme()">
  1091. <span class="absolute top-1 left-1 w-4 h-4 bg-white rounded-full transition-transform dark:translate-x-6"></span>
  1092. </button>
  1093. </div>
  1094. <div class="px-4 py-4 flex items-center justify-between border-b border-gray-100 dark:border-gray-700">
  1095. <div class="flex items-center gap-3">
  1096. <div class="w-9 h-9 bg-gray-100 dark:bg-gray-700 rounded-lg flex items-center justify-center">
  1097. <i class="fas fa-bell text-gray-600 dark:text-gray-400"></i>
  1098. </div>
  1099. <span>消息通知</span>
  1100. </div>
  1101. <i class="fas fa-chevron-right text-gray-400 dark:text-gray-500"></i>
  1102. </div>
  1103. <div class="px-4 py-4 flex items-center justify-between border-b border-gray-100 dark:border-gray-700">
  1104. <div class="flex items-center gap-3">
  1105. <div class="w-9 h-9 bg-gray-100 dark:bg-gray-700 rounded-lg flex items-center justify-center">
  1106. <i class="fas fa-download text-gray-600 dark:text-gray-400"></i>
  1107. </div>
  1108. <span>离线课程</span>
  1109. </div>
  1110. <div class="flex items-center gap-2">
  1111. <span class="text-sm text-gray-500">已下载 3门</span>
  1112. <i class="fas fa-chevron-right text-gray-400 dark:text-gray-500"></i>
  1113. </div>
  1114. </div>
  1115. <div class="px-4 py-4 flex items-center justify-between">
  1116. <div class="flex items-center gap-3">
  1117. <div class="w-9 h-9 bg-gray-100 dark:bg-gray-700 rounded-lg flex items-center justify-center">
  1118. <i class="fas fa-shield-alt text-gray-600 dark:text-gray-400"></i>
  1119. </div>
  1120. <span>隐私设置</span>
  1121. </div>
  1122. <i class="fas fa-chevron-right text-gray-400 dark:text-gray-500"></i>
  1123. </div>
  1124. </div>
  1125. <!-- 其他选项 -->
  1126. <div class="bg-white dark:bg-gray-800 rounded-xl shadow-sm border border-gray-100 dark:border-gray-700 overflow-hidden mb-6">
  1127. <div class="px-4 py-4 flex items-center justify-between border-b border-gray-100 dark:border-gray-700">
  1128. <div class="flex items-center gap-3">
  1129. <div class="w-9 h-9 bg-gray-100 dark:bg-gray-700 rounded-lg flex items-center justify-center">
  1130. <i class="fas fa-question-circle text-gray-600 dark:text-gray-400"></i>
  1131. </div>
  1132. <span>帮助中心</span>
  1133. </div>
  1134. <i class="fas fa-chevron-right text-gray-400 dark:text-gray-500"></i>
  1135. </div>
  1136. <div class="px-4 py-4 flex items-center justify-between">
  1137. <div class="flex items-center gap-3">
  1138. <div class="w-9 h-9 bg-gray-100 dark:bg-gray-700 rounded-lg flex items-center justify-center">
  1139. <i class="fas fa-info-circle text-gray-600 dark:text-gray-400"></i>
  1140. </div>
  1141. <span>关于我们</span>
  1142. </div>
  1143. <div class="flex items-center gap-2">
  1144. <span class="text-sm text-gray-500">v2.1.0</span>
  1145. <i class="fas fa-chevron-right text-gray-400 dark:text-gray-500"></i>
  1146. </div>
  1147. </div>
  1148. </div>
  1149. <!-- 退出登录 -->
  1150. <button onclick="handleLogout()" class="w-full py-3.5 bg-white dark:bg-gray-800 text-red-500 rounded-xl font-medium shadow-sm border border-gray-100 dark:border-gray-700">
  1151. 退出登录
  1152. </button>
  1153. </div>
  1154. </div>
  1155. </main>
  1156. <!-- ==================== 底部Tab导航 ==================== -->
  1157. <nav class="fixed bottom-0 left-0 right-0 bg-white dark:bg-gray-800 border-t border-gray-200 dark:border-gray-700 z-40 safe-bottom">
  1158. <div class="flex items-center justify-around h-14">
  1159. <button class="tab-item active flex-1 flex flex-col items-center justify-center gap-1 py-2" data-tab="home" onclick="switchTab('home')">
  1160. <i class="fas fa-home text-lg dark:text-green-500"></i>
  1161. <span class="text-xs">首页</span>
  1162. </button>
  1163. <button class="tab-item flex-1 flex flex-col items-center justify-center gap-1 py-2 text-gray-500 dark:text-gray-400" data-tab="learning" onclick="switchTab('learning')">
  1164. <i class="fas fa-book-open text-lg"></i>
  1165. <span class="text-xs">学习</span>
  1166. </button>
  1167. <button class="tab-item flex-1 flex flex-col items-center justify-center gap-1 py-2 text-gray-500 dark:text-gray-400" data-tab="practice" onclick="switchTab('practice')">
  1168. <i class="fas fa-robot text-lg"></i>
  1169. <span class="text-xs">陪练</span>
  1170. </button>
  1171. <button class="tab-item flex-1 flex flex-col items-center justify-center gap-1 py-2 text-gray-500 dark:text-gray-400" data-tab="qa" onclick="switchTab('qa')">
  1172. <i class="fas fa-comment-dots text-lg"></i>
  1173. <span class="text-xs">问答</span>
  1174. </button>
  1175. <button class="tab-item flex-1 flex flex-col items-center justify-center gap-1 py-2 text-gray-500 dark:text-gray-400" data-tab="profile" onclick="switchTab('profile')">
  1176. <i class="fas fa-user text-lg"></i>
  1177. <span class="text-xs">我的</span>
  1178. </button>
  1179. </div>
  1180. </nav>
  1181. <!-- ==================== Sheet遮罩层 ==================== -->
  1182. <div id="sheet-overlay" class="sheet-overlay fixed inset-0 bg-black/50 z-40" onclick="closeAllSheets()"></div>
  1183. <!-- ==================== 清除对话确认模态框 ==================== -->
  1184. <div id="clear-conversation-modal" class="fixed inset-0 z-[100] hidden">
  1185. <div class="absolute inset-0 bg-black/50" onclick="closeClearModal()"></div>
  1186. <div class="absolute inset-0 flex items-center justify-center">
  1187. <div class="w-[85vw] max-w-sm bg-white dark:bg-gray-800 rounded-2xl shadow-2xl overflow-hidden">
  1188. <div class="p-6">
  1189. <div class="w-16 h-16 mx-auto mb-4 rounded-full bg-red-100 dark:bg-red-900/30 flex items-center justify-center">
  1190. <i class="fas fa-exclamation-triangle text-3xl text-red-500"></i>
  1191. </div>
  1192. <h3 class="text-lg font-semibold text-center mb-2">确认清除当前对话</h3>
  1193. <p class="text-sm text-gray-500 dark:text-gray-400 text-center leading-relaxed">
  1194. 清除后将无法找回当前对话记录,确定要清除吗?
  1195. </p>
  1196. </div>
  1197. <div class="flex border-t border-gray-200 dark:border-gray-700">
  1198. <button onclick="closeClearModal()" class="flex-1 py-4 text-gray-600 dark:text-gray-400 font-medium border-r border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-white/5 transition-colors">
  1199. 取消
  1200. </button>
  1201. <button onclick="clearCurrentConversation()" class="flex-1 py-4 text-red-500 font-medium hover:bg-red-50 dark:hover:bg-red-500/10 transition-colors">
  1202. 确定清除
  1203. </button>
  1204. </div>
  1205. </div>
  1206. </div>
  1207. </div>
  1208. <!-- ==================== 登录注册Sheet ==================== -->
  1209. <div id="login-sheet" class="sheet fixed inset-0 bg-white dark:bg-gray-800 z-50 overflow-hidden flex flex-col transform translate-y-full">
  1210. <div class="sticky top-0 bg-white dark:bg-gray-800 px-4 py-3 border-b border-gray-200 dark:border-gray-700 flex-shrink-0">
  1211. <div class="w-12 h-1 bg-gray-300 dark:bg-gray-600 rounded-full mx-auto mb-3"></div>
  1212. <div class="flex items-center justify-between">
  1213. <h3 class="font-semibold text-lg">欢迎使用</h3>
  1214. <button onclick="closeLoginSheet()" class="w-8 h-8 flex items-center justify-center">
  1215. <i class="fas fa-times text-gray-500 dark:text-gray-400"></i>
  1216. </button>
  1217. </div>
  1218. </div>
  1219. <div class="flex-1 overflow-y-auto p-6">
  1220. <!-- 登录注册切换标签 -->
  1221. <div class="flex bg-gray-100 dark:bg-gray-700 rounded-xl p-1 mb-6">
  1222. <button id="login-tab-btn" onclick="switchLoginReg('login')" class="flex-1 py-2.5 rounded-lg text-sm font-medium bg-white dark:bg-gray-600 text-green-600 dark:text-green-400 shadow-sm transition-all">登录</button>
  1223. <button id="reg-tab-btn" onclick="switchLoginReg('register')" class="flex-1 py-2.5 rounded-lg text-sm font-medium text-gray-600 dark:text-gray-300 transition-all">注册</button>
  1224. </div>
  1225. <!-- 登录表单 -->
  1226. <div id="login-form">
  1227. <div class="mb-4">
  1228. <label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">手机号</label>
  1229. <div class="relative">
  1230. <input type="tel" id="login-phone" maxlength="11" placeholder="请输入手机号"
  1231. class="w-full px-4 py-3.5 bg-gray-50 dark:bg-gray-700 border border-gray-200 dark:border-gray-600 rounded-xl text-base focus:outline-none focus:ring-2 focus:ring-green-500 dark:focus:ring-green-400 dark:text-white"
  1232. oninput="value=value.replace(/[^0-9]/g,'')">
  1233. </div>
  1234. </div>
  1235. <div class="mb-4">
  1236. <label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">密码</label>
  1237. <div class="relative">
  1238. <input type="password" id="login-password" placeholder="请输入密码"
  1239. class="w-full px-4 py-3.5 bg-gray-50 dark:bg-gray-700 border border-gray-200 dark:border-gray-600 rounded-xl text-base focus:outline-none focus:ring-2 focus:ring-green-500 dark:focus:ring-green-400 dark:text-white pr-12">
  1240. <button type="button" onclick="togglePassword('login-password', this)" class="absolute right-4 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300">
  1241. <i class="fas fa-eye"></i>
  1242. </button>
  1243. </div>
  1244. </div>
  1245. <div class="flex items-center justify-between mb-6">
  1246. <label class="flex items-center gap-2 cursor-pointer">
  1247. <input type="checkbox" id="remember-me" class="w-5 h-5 rounded border-gray-300 dark:border-gray-600 text-green-500 focus:ring-green-500">
  1248. <span class="text-sm text-gray-600 dark:text-gray-400">记住密码</span>
  1249. </label>
  1250. <button class="text-sm text-green-600 dark:text-green-400">忘记密码?</button>
  1251. </div>
  1252. <button onclick="handleLogin()" class="w-full py-4 bg-gradient-to-r from-green-500 to-green-600 text-white font-semibold rounded-xl hover:from-green-600 hover:to-green-700 transition-all">
  1253. 登录
  1254. </button>
  1255. </div>
  1256. <!-- 注册表单 -->
  1257. <div id="register-form" class="hidden">
  1258. <div class="mb-4">
  1259. <label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">手机号</label>
  1260. <div class="relative flex gap-2">
  1261. <input type="tel" id="reg-phone" maxlength="11" placeholder="请输入手机号"
  1262. class="flex-1 px-4 py-3.5 bg-gray-50 dark:bg-gray-700 border border-gray-200 dark:border-gray-600 rounded-xl text-base focus:outline-none focus:ring-2 focus:ring-green-500 dark:focus:ring-green-400 dark:text-white"
  1263. oninput="value=value.replace(/[^0-9]/g,'')">
  1264. <button type="button" id="send-code-btn" onclick="sendVerifyCode()" class="px-4 py-3.5 bg-gray-100 dark:bg-gray-600 text-gray-600 dark:text-gray-300 text-sm rounded-xl whitespace-nowrap">
  1265. 获取验证码
  1266. </button>
  1267. </div>
  1268. </div>
  1269. <div class="mb-4">
  1270. <label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">验证码</label>
  1271. <input type="text" id="reg-code" maxlength="6" placeholder="请输入验证码"
  1272. class="w-full px-4 py-3.5 bg-gray-50 dark:bg-gray-700 border border-gray-200 dark:border-gray-600 rounded-xl text-base focus:outline-none focus:ring-2 focus:ring-green-500 dark:focus:ring-green-400 dark:text-white"
  1273. oninput="value=value.replace(/[^0-9]/g,'')">
  1274. </div>
  1275. <div class="mb-4">
  1276. <label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">设置密码</label>
  1277. <div class="relative">
  1278. <input type="password" id="reg-password" placeholder="请设置密码(6-20位)"
  1279. class="w-full px-4 py-3.5 bg-gray-50 dark:bg-gray-700 border border-gray-200 dark:border-gray-600 rounded-xl text-base focus:outline-none focus:ring-2 focus:ring-green-500 dark:focus:ring-green-400 dark:text-white pr-12">
  1280. <button type="button" onclick="togglePassword('reg-password', this)" class="absolute right-4 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300">
  1281. <i class="fas fa-eye"></i>
  1282. </button>
  1283. </div>
  1284. </div>
  1285. <div class="mb-4">
  1286. <label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">确认密码</label>
  1287. <div class="relative">
  1288. <input type="password" id="reg-confirm-password" placeholder="请再次输入密码"
  1289. class="w-full px-4 py-3.5 bg-gray-50 dark:bg-gray-700 border border-gray-200 dark:border-gray-600 rounded-xl text-base focus:outline-none focus:ring-2 focus:ring-green-500 dark:focus:ring-green-400 dark:text-white pr-12">
  1290. <button type="button" onclick="togglePassword('reg-confirm-password', this)" class="absolute right-4 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300">
  1291. <i class="fas fa-eye"></i>
  1292. </button>
  1293. </div>
  1294. </div>
  1295. <div class="mb-6">
  1296. <label class="flex items-start gap-2 cursor-pointer">
  1297. <input type="checkbox" id="agree-terms" class="w-5 h-5 rounded border-gray-300 dark:border-gray-600 text-green-500 focus:ring-green-500 mt-0.5">
  1298. <span class="text-sm text-gray-600 dark:text-gray-400">我已阅读并同意<a href="#" class="text-green-600 dark:text-green-400">《用户协议》</a>和<a href="#" class="text-green-600 dark:text-green-400">《隐私政策》</a></span>
  1299. </label>
  1300. </div>
  1301. <button onclick="handleRegister()" class="w-full py-4 bg-gradient-to-r from-green-500 to-green-600 text-white font-semibold rounded-xl hover:from-green-600 hover:to-green-700 transition-all">
  1302. 注册
  1303. </button>
  1304. </div>
  1305. </div>
  1306. </div>
  1307. <!-- ==================== 课程详情Sheet ==================== -->
  1308. <div id="course-detail-sheet" class="sheet fixed inset-0 bg-white dark:bg-gray-800 z-50 overflow-hidden flex flex-col">
  1309. <div class="sticky top-0 bg-white dark:bg-gray-800 px-4 py-3 border-b border-gray-200 dark:border-gray-700 flex-shrink-0">
  1310. <div class="w-12 h-1 bg-gray-300 dark:bg-gray-600 rounded-full mx-auto mb-3"></div>
  1311. <div class="flex items-center justify-between">
  1312. <h3 class="font-semibold text-lg">课程详情</h3>
  1313. <button onclick="closeAllSheets()" class="w-8 h-8 flex items-center justify-center">
  1314. <i class="fas fa-times text-gray-500 dark:text-gray-400"></i>
  1315. </button>
  1316. </div>
  1317. </div>
  1318. <div class="flex-1 overflow-y-auto">
  1319. <div class="h-48 bg-gradient-to-br from-green-400 to-green-600 flex items-center justify-center">
  1320. <i class="fas fa-bullhorn text-white text-6xl"></i>
  1321. </div>
  1322. <div class="p-4">
  1323. <h2 class="font-semibold text-xl mb-2" id="detail-title">产品卖点提炼技巧</h2>
  1324. <div class="flex items-center gap-4 mb-4 text-sm text-gray-500">
  1325. <span><i class="fas fa-clock mr-1"></i>45分钟</span>
  1326. <span><i class="fas fa-signal mr-1"></i>初级</span>
  1327. <span><i class="fas fa-user mr-1"></i>1.2万人学习</span>
  1328. </div>
  1329. <p class="text-gray-600 dark:text-gray-300 mb-6 leading-relaxed">
  1330. 本课程将帮助你掌握产品卖点提炼的核心方法,学习如何从客户角度出发,用简洁有力的语言传达产品价值,提升销售转化率。
  1331. </p>
  1332. <h4 class="font-semibold mb-3">课程大纲</h4>
  1333. <div class="space-y-3 mb-6">
  1334. <div class="flex items-center gap-3 p-3 bg-gray-50 dark:bg-gray-700 rounded-lg">
  1335. <div class="w-8 h-8 bg-green-500 text-white rounded-full flex items-center justify-center text-sm">1</div>
  1336. <span class="flex-1">卖点提炼的基本概念</span>
  1337. <i class="fas fa-check-circle text-green-500"></i>
  1338. </div>
  1339. <div class="flex items-center gap-3 p-3 bg-gray-50 dark:bg-gray-700 rounded-lg">
  1340. <div class="w-8 h-8 bg-green-500 text-white rounded-full flex items-center justify-center text-sm">2</div>
  1341. <span class="flex-1">FAB法则实战应用</span>
  1342. <i class="fas fa-check-circle text-green-500"></i>
  1343. </div>
  1344. <div class="flex items-center gap-3 p-3 bg-gray-50 dark:bg-gray-700 rounded-lg">
  1345. <div class="w-8 h-8 bg-gray-300 dark:bg-gray-600 text-white rounded-full flex items-center justify-center text-sm">3</div>
  1346. <span class="flex-1">客户视角的卖点转化</span>
  1347. <span class="text-sm text-gray-400">12:30</span>
  1348. </div>
  1349. <div class="flex items-center gap-3 p-3 bg-gray-50 dark:bg-gray-700 rounded-lg">
  1350. <div class="w-8 h-8 bg-gray-300 dark:bg-gray-600 text-white rounded-full flex items-center justify-center text-sm">4</div>
  1351. <span class="flex-1">实战演练与点评</span>
  1352. <span class="text-sm text-gray-400">15:00</span>
  1353. </div>
  1354. </div>
  1355. </div>
  1356. </div>
  1357. <div class="p-4 border-t border-gray-200 dark:border-gray-700 flex-shrink-0 safe-bottom">
  1358. <button onclick="startLearning()" class="w-full py-4 bg-green-500 text-white font-semibold rounded-xl shadow-lg shadow-green-500/30">
  1359. 开始学习
  1360. </button>
  1361. </div>
  1362. </div>
  1363. <!-- ==================== 视频播放页 ==================== -->
  1364. <div id="video-page" class="hidden fixed inset-0 bg-black z-50 flex flex-col">
  1365. <!-- 视频播放器 -->
  1366. <div class="flex-1 video-player flex items-center justify-center relative">
  1367. <button onclick="closeVideo()" class="absolute top-4 left-4 z-10 w-10 h-10 bg-black/50 rounded-full flex items-center justify-center text-white">
  1368. <i class="fas fa-chevron-down"></i>
  1369. </button>
  1370. <div class="text-center text-white">
  1371. <i class="fas fa-play-circle text-6xl mb-4 opacity-80"></i>
  1372. <p class="text-lg">视频播放中...</p>
  1373. <p class="text-sm opacity-60 mt-2">点击屏幕可暂停/播放</p>
  1374. </div>
  1375. <!-- 进度条 -->
  1376. <div class="absolute bottom-20 left-4 right-4">
  1377. <div class="h-1 bg-white/30 rounded-full overflow-hidden">
  1378. <div class="h-full bg-green-500 rounded-full" style="width: 60%"></div>
  1379. </div>
  1380. <div class="flex justify-between text-white/80 text-sm mt-2">
  1381. <span>18:00</span>
  1382. <span>30:00</span>
  1383. </div>
  1384. </div>
  1385. </div>
  1386. <!-- 底部信息 -->
  1387. <div class="bg-gray-900 text-white p-4 safe-bottom">
  1388. <h3 class="font-semibold mb-2">产品卖点提炼技巧</h3>
  1389. <p class="text-sm text-gray-400 mb-4">第3节:客户视角的卖点转化</p>
  1390. <button onclick="enterQuiz()" class="w-full py-3.5 bg-green-500 rounded-xl font-medium">
  1391. 完成学习,进入答题
  1392. </button>
  1393. </div>
  1394. </div>
  1395. <!-- ==================== 答题页 ==================== -->
  1396. <div id="quiz-page" class="hidden fixed inset-0 bg-gray-50 dark:bg-gray-900 z-50 flex flex-col">
  1397. <!-- 头部 -->
  1398. <div class="bg-white dark:bg-gray-800 px-4 py-3 flex items-center justify-between border-b border-gray-200 dark:border-gray-700 safe-top">
  1399. <button onclick="closeQuiz()" class="w-10 h-10 flex items-center justify-center -ml-2 text-gray-600 dark:text-gray-400">
  1400. <i class="fas fa-times text-lg"></i>
  1401. </button>
  1402. <h3 class="font-semibold">答题闯关</h3>
  1403. <span class="text-sm text-gray-500">1/5</span>
  1404. </div>
  1405. <!-- 题目内容 -->
  1406. <div class="flex-1 overflow-y-auto p-4">
  1407. <div class="bg-white dark:bg-gray-800 rounded-xl p-5 shadow-sm">
  1408. <span class="inline-block px-3 py-1 bg-green-100 dark:bg-green-900/30 text-green-600 text-sm rounded-full mb-4">单选题</span>
  1409. <h4 class="text-lg font-medium mb-6 leading-relaxed">
  1410. 在介绍产品时,以下哪种方式最符合"客户视角"的卖点提炼原则?
  1411. </h4>
  1412. <div class="space-y-3" id="quiz-options">
  1413. <label class="quiz-option flex items-start gap-3 p-4 border-2 border-gray-200 dark:border-gray-700 rounded-xl cursor-pointer hover:border-green-500 transition-colors">
  1414. <input type="radio" name="answer" value="A" class="mt-1 w-5 h-5 text-green-500">
  1415. <span>A. 详细介绍产品的所有技术参数和配置</span>
  1416. </label>
  1417. <label class="quiz-option flex items-start gap-3 p-4 border-2 border-gray-200 dark:border-gray-700 rounded-xl cursor-pointer hover:border-green-500 transition-colors">
  1418. <input type="radio" name="answer" value="B" class="mt-1 w-5 h-5 text-green-500">
  1419. <span>B. 强调产品能为客户解决什么具体问题</span>
  1420. </label>
  1421. <label class="quiz-option flex items-start gap-3 p-4 border-2 border-gray-200 dark:border-gray-700 rounded-xl cursor-pointer hover:border-green-500 transition-colors">
  1422. <input type="radio" name="answer" value="C" class="mt-1 w-5 h-5 text-green-500">
  1423. <span>C. 与竞争对手进行详细对比分析</span>
  1424. </label>
  1425. <label class="quiz-option flex items-start gap-3 p-4 border-2 border-gray-200 dark:border-gray-700 rounded-xl cursor-pointer hover:border-green-500 transition-colors">
  1426. <input type="radio" name="answer" value="D" class="mt-1 w-5 h-5 text-green-500">
  1427. <span>D. 重点介绍产品的生产工艺和原材料</span>
  1428. </label>
  1429. </div>
  1430. </div>
  1431. </div>
  1432. <!-- 底部按钮 -->
  1433. <div class="bg-white dark:bg-gray-800 px-4 py-4 border-t border-gray-200 dark:border-gray-700 safe-bottom">
  1434. <button onclick="submitAnswer()" class="w-full py-4 bg-green-500 text-white font-semibold rounded-xl">
  1435. 提交答案
  1436. </button>
  1437. </div>
  1438. </div>
  1439. <!-- ==================== 答题结果Sheet ==================== -->
  1440. <div id="quiz-result-sheet" class="sheet fixed inset-0 bg-white dark:bg-gray-800 z-50 flex flex-col">
  1441. <div class="sticky top-0 bg-white dark:bg-gray-800 px-4 py-3 border-b border-gray-200 dark:border-gray-700 flex-shrink-0">
  1442. <div class="w-12 h-1 bg-gray-300 dark:bg-gray-600 rounded-full mx-auto mb-3"></div>
  1443. </div>
  1444. <div class="flex-1 overflow-y-auto p-6">
  1445. <div class="text-center mb-6">
  1446. <div class="w-24 h-24 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mx-auto mb-4">
  1447. <span class="text-4xl font-bold text-green-600">100</span>
  1448. </div>
  1449. <h3 class="font-semibold text-xl mb-1">回答正确!</h3>
  1450. <p class="text-gray-500">获得 20 积分</p>
  1451. </div>
  1452. <div class="bg-gray-50 dark:bg-gray-700 rounded-xl p-4 mb-6">
  1453. <h4 class="font-medium mb-3">答案解析</h4>
  1454. <p class="text-gray-600 dark:text-gray-300 text-sm leading-relaxed mb-3">
  1455. 正确答案是 <span class="text-green-600 font-semibold">B</span>
  1456. </p>
  1457. <p class="text-gray-600 dark:text-gray-300 text-sm leading-relaxed">
  1458. "客户视角"的核心是从客户的需求出发,强调产品能为客户带来的价值和解决的问题,而不是单纯介绍产品特性。
  1459. </p>
  1460. </div>
  1461. </div>
  1462. <div class="p-6 border-t border-gray-200 dark:border-gray-700 flex-shrink-0 safe-bottom">
  1463. <div class="flex gap-3">
  1464. <button onclick="closeAllSheets(); showQuizPage()" class="flex-1 py-3.5 border border-gray-300 dark:border-gray-600 rounded-xl font-medium">
  1465. 下一题
  1466. </button>
  1467. <button onclick="closeAllSheets(); switchTab('practice')" class="flex-1 py-3.5 bg-green-500 text-white rounded-xl font-medium">
  1468. 进入AI陪练
  1469. </button>
  1470. </div>
  1471. </div>
  1472. </div>
  1473. <!-- ==================== 评分报告Sheet ==================== -->
  1474. <div id="score-report-sheet" class="sheet fixed inset-0 bg-white dark:bg-gray-800 z-50 flex flex-col">
  1475. <div class="sticky top-0 bg-white dark:bg-gray-800 px-4 py-3 border-b border-gray-200 dark:border-gray-700 flex-shrink-0">
  1476. <div class="w-12 h-1 bg-gray-300 dark:bg-gray-600 rounded-full mx-auto mb-3"></div>
  1477. <div class="flex items-center justify-between">
  1478. <h3 class="font-semibold text-lg">陪练评分报告</h3>
  1479. <button onclick="closeAllSheets()" class="w-8 h-8 flex items-center justify-center">
  1480. <i class="fas fa-times text-gray-500 dark:text-gray-400"></i>
  1481. </button>
  1482. </div>
  1483. </div>
  1484. <div class="flex-1 overflow-y-auto p-4">
  1485. <!-- 总得分 -->
  1486. <div class="text-center mb-6">
  1487. <div class="w-28 h-28 bg-gradient-to-br from-green-400 to-green-600 rounded-full flex items-center justify-center mx-auto mb-4 shadow-lg shadow-green-500/30">
  1488. <div class="text-white text-center">
  1489. <span class="text-5xl font-bold">88</span>
  1490. <p class="text-sm opacity-80">总分</p>
  1491. </div>
  1492. </div>
  1493. <h3 class="font-semibold text-xl">表现优秀!</h3>
  1494. <p class="text-gray-500 mt-1">本次陪练用时 8 分钟</p>
  1495. </div>
  1496. <!-- 五维评分 -->
  1497. <div class="bg-gray-50 dark:bg-gray-700 rounded-xl p-4 mb-6">
  1498. <h4 class="font-medium mb-4">能力维度评分</h4>
  1499. <div class="space-y-4">
  1500. <div>
  1501. <div class="flex justify-between mb-1">
  1502. <span class="text-sm">产品知识运用</span>
  1503. <span class="text-sm font-semibold text-green-600">90</span>
  1504. </div>
  1505. <div class="h-2 bg-gray-200 dark:bg-gray-600 rounded-full overflow-hidden">
  1506. <div class="h-full bg-green-500 rounded-full score-bar" style="width: 90%"></div>
  1507. </div>
  1508. </div>
  1509. <div>
  1510. <div class="flex justify-between mb-1">
  1511. <span class="text-sm">沟通表达能力</span>
  1512. <span class="text-sm font-semibold text-green-600">85</span>
  1513. </div>
  1514. <div class="h-2 bg-gray-200 dark:bg-gray-600 rounded-full overflow-hidden">
  1515. <div class="h-full bg-green-500 rounded-full score-bar" style="width: 85%"></div>
  1516. </div>
  1517. </div>
  1518. <div>
  1519. <div class="flex justify-between mb-1">
  1520. <span class="text-sm">异议处理能力</span>
  1521. <span class="text-sm font-semibold text-yellow-600">78</span>
  1522. </div>
  1523. <div class="h-2 bg-gray-200 dark:bg-gray-600 rounded-full overflow-hidden">
  1524. <div class="h-full bg-yellow-500 rounded-full score-bar" style="width: 78%"></div>
  1525. </div>
  1526. </div>
  1527. <div>
  1528. <div class="flex justify-between mb-1">
  1529. <span class="text-sm">成交引导能力</span>
  1530. <span class="text-sm font-semibold text-green-600">88</span>
  1531. </div>
  1532. <div class="h-2 bg-gray-200 dark:bg-gray-600 rounded-full overflow-hidden">
  1533. <div class="h-full bg-green-500 rounded-full score-bar" style="width: 88%"></div>
  1534. </div>
  1535. </div>
  1536. <div>
  1537. <div class="flex justify-between mb-1">
  1538. <span class="text-sm">服务态度</span>
  1539. <span class="text-sm font-semibold text-green-600">95</span>
  1540. </div>
  1541. <div class="h-2 bg-gray-200 dark:bg-gray-600 rounded-full overflow-hidden">
  1542. <div class="h-full bg-green-500 rounded-full score-bar" style="width: 95%"></div>
  1543. </div>
  1544. </div>
  1545. </div>
  1546. </div>
  1547. <!-- 改进建议 -->
  1548. <div class="bg-gray-50 dark:bg-gray-700 rounded-xl p-4 mb-6">
  1549. <h4 class="font-medium mb-3">改进建议</h4>
  1550. <ul class="space-y-2 text-sm text-gray-600 dark:text-gray-300">
  1551. <li class="flex items-start gap-2">
  1552. <i class="fas fa-lightbulb text-yellow-500 mt-0.5"></i>
  1553. <span>在客户提出价格异议时,可以更多地强调产品的长期价值而非单纯对比价格</span>
  1554. </li>
  1555. <li class="flex items-start gap-2">
  1556. <i class="fas fa-lightbulb text-yellow-500 mt-0.5"></i>
  1557. <span>建议多使用开放式问题引导客户表达真实需求</span>
  1558. </li>
  1559. </ul>
  1560. </div>
  1561. </div>
  1562. <div class="p-4 border-t border-gray-200 dark:border-gray-700 flex-shrink-0 safe-bottom">
  1563. <button onclick="closeAllSheets()" class="w-full py-4 bg-green-500 text-white font-semibold rounded-xl">
  1564. 完成
  1565. </button>
  1566. </div>
  1567. </div>
  1568. <script>
  1569. // ==================== Tab切换 ====================
  1570. function switchTab(tabName) {
  1571. // 隐藏所有tab内容
  1572. document.querySelectorAll('.tab-content').forEach(tab => {
  1573. tab.classList.remove('active');
  1574. });
  1575. // 显示目标tab
  1576. document.getElementById('tab-' + tabName).classList.add('active');
  1577. // 更新底部导航状态
  1578. document.querySelectorAll('.tab-item').forEach(item => {
  1579. item.classList.remove('active');
  1580. item.classList.add('text-gray-500');
  1581. });
  1582. document.querySelector('.tab-item[data-tab="' + tabName + '"]').classList.add('active');
  1583. document.querySelector('.tab-item[data-tab="' + tabName + '"]').classList.remove('text-gray-500');
  1584. // 如果切换到成绩页,绘制雷达图
  1585. if (tabName === 'score') {
  1586. setTimeout(drawRadarChart, 100);
  1587. }
  1588. }
  1589. // ==================== 分类筛选 ====================
  1590. document.querySelectorAll('.category-btn').forEach(btn => {
  1591. btn.addEventListener('click', function() {
  1592. // 更新按钮状态
  1593. document.querySelectorAll('.category-btn').forEach(b => {
  1594. b.classList.remove('bg-green-500', 'text-white');
  1595. b.classList.add('bg-white', 'dark:bg-gray-800', 'text-gray-600', 'dark:text-gray-300');
  1596. });
  1597. this.classList.remove('bg-white', 'dark:bg-gray-800', 'text-gray-600', 'dark:text-gray-300');
  1598. this.classList.add('bg-green-500', 'text-white');
  1599. // 筛选课程
  1600. const category = this.dataset.category;
  1601. document.querySelectorAll('.course-card').forEach(card => {
  1602. if (category === 'all' || card.dataset.category === category) {
  1603. card.style.display = 'block';
  1604. } else {
  1605. card.style.display = 'none';
  1606. }
  1607. });
  1608. // 筛选陪练场景
  1609. const sceneCategoryMap = {
  1610. 'all': 'all',
  1611. 'reception': 'reception',
  1612. 'presentation': 'presentation',
  1613. 'objection': 'objection',
  1614. 'closing': 'closing'
  1615. };
  1616. const sceneCategory = sceneCategoryMap[category] || 'all';
  1617. document.querySelectorAll('.scene-card').forEach(card => {
  1618. if (sceneCategory === 'all' || card.dataset.category === sceneCategory) {
  1619. card.style.display = 'block';
  1620. } else {
  1621. card.style.display = 'none';
  1622. }
  1623. });
  1624. });
  1625. });
  1626. // ==================== Sheet控制 ====================
  1627. function openSheet(sheetId) {
  1628. document.getElementById('sheet-overlay').classList.add('open');
  1629. document.getElementById(sheetId).classList.add('open');
  1630. document.body.classList.add('modal-open');
  1631. }
  1632. function closeAllSheets() {
  1633. document.getElementById('sheet-overlay').classList.remove('open');
  1634. document.querySelectorAll('.sheet').forEach(sheet => {
  1635. sheet.classList.remove('open');
  1636. });
  1637. document.body.classList.remove('modal-open');
  1638. }
  1639. // ==================== 课程详情 ====================
  1640. function openCourseDetail(courseId) {
  1641. openSheet('course-detail-sheet');
  1642. }
  1643. function startLearning() {
  1644. closeAllSheets();
  1645. document.getElementById('video-page').classList.remove('hidden');
  1646. document.body.classList.add('modal-open');
  1647. }
  1648. // ==================== 视频页 ====================
  1649. function closeVideo() {
  1650. document.getElementById('video-page').classList.add('hidden');
  1651. document.body.classList.remove('modal-open');
  1652. }
  1653. function enterQuiz() {
  1654. document.getElementById('video-page').classList.add('hidden');
  1655. document.getElementById('quiz-page').classList.remove('hidden');
  1656. }
  1657. // ==================== 答题页 ====================
  1658. function showQuizPage() {
  1659. document.getElementById('quiz-page').classList.remove('hidden');
  1660. document.body.classList.add('modal-open');
  1661. }
  1662. function closeQuiz() {
  1663. document.getElementById('quiz-page').classList.add('hidden');
  1664. document.body.classList.remove('modal-open');
  1665. }
  1666. function submitAnswer() {
  1667. const selected = document.querySelector('input[name="answer"]:checked');
  1668. if (!selected) {
  1669. alert('请选择答案');
  1670. return;
  1671. }
  1672. document.getElementById('quiz-page').classList.add('hidden');
  1673. openSheet('quiz-result-sheet');
  1674. }
  1675. // ==================== AI陪练 ====================
  1676. let currentScene = '';
  1677. function startPractice(scene) {
  1678. currentScene = scene;
  1679. const titles = {
  1680. 'first-visit': '初次进店客户',
  1681. 'online-consult': '线上咨询客户',
  1682. 'kitchen-plan': '厨房方案讲解',
  1683. 'wardrobe-plan': '衣柜方案讲解',
  1684. 'price-objection': '价格异议处理',
  1685. 'brand-objection': '品牌异议处理',
  1686. 'quality-objection': '质量顾虑处理',
  1687. 'price-closing': '报价签约',
  1688. 'hesitate-closing': '犹豫客户逼单',
  1689. 'family-closing': '全家决策客户'
  1690. };
  1691. document.getElementById('chat-title').textContent = titles[scene] || 'AI陪练';
  1692. document.getElementById('chat-interface').classList.remove('hidden');
  1693. document.body.classList.add('modal-open');
  1694. // 清空消息,添加开场白
  1695. const messagesContainer = document.getElementById('chat-messages');
  1696. const openingLines = {
  1697. 'first-visit': '你好,我是第一次来你们店,想了解一下定制家具。',
  1698. 'online-consult': '你好,我在网上看到你们的产品,想咨询一下定制流程。',
  1699. 'kitchen-plan': '你好,想听听你对我家厨房设计方案的讲解。',
  1700. 'wardrobe-plan': '你好,想了解一下主卧衣柜的设计方案。',
  1701. 'price-objection': '你好,我看了你们的报价,感觉有点贵啊。',
  1702. 'brand-objection': '你好,我之前没听过你们品牌,质量有保障吗?',
  1703. 'quality-objection': '你好,你们用的是什么板材?环保吗?',
  1704. 'price-closing': '你好,方案我挺满意的,现在报价是多少?',
  1705. 'hesitate-closing': '你好,方案我觉得还行,我再考虑考虑。',
  1706. 'family-closing': '你好,我和我爱人一起来的,想听听你们的建议。'
  1707. };
  1708. messagesContainer.innerHTML = `
  1709. <div class="flex gap-3">
  1710. <div class="w-10 h-10 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center flex-shrink-0">
  1711. <i class="fas fa-robot text-green-600 dark:text-green-400"></i>
  1712. </div>
  1713. <div class="bg-white dark:bg-gray-800 rounded-2xl rounded-tl-sm px-4 py-3 max-w-[75%] shadow-sm">
  1714. <p class="text-sm">${openingLines[scene] || '你好,我想咨询一下定制家具。'}</p>
  1715. </div>
  1716. </div>
  1717. `;
  1718. }
  1719. function closePractice() {
  1720. document.getElementById('chat-interface').classList.add('hidden');
  1721. document.body.classList.remove('modal-open');
  1722. }
  1723. function endPractice() {
  1724. document.getElementById('chat-interface').classList.add('hidden');
  1725. openSheet('score-report-sheet');
  1726. }
  1727. function sendMessage() {
  1728. const input = document.getElementById('chat-input');
  1729. const message = input.value.trim();
  1730. if (!message) return;
  1731. // 添加用户消息
  1732. addUserMessage(message);
  1733. input.value = '';
  1734. // 显示思考动画
  1735. showThinking();
  1736. // 模拟AI回复
  1737. setTimeout(() => {
  1738. removeThinking();
  1739. addAIMessage('我理解您的顾虑。让我为您详细说明一下我们产品的价值所在...');
  1740. }, 2000);
  1741. }
  1742. function sendQuickReply(message) {
  1743. addUserMessage(message);
  1744. showThinking();
  1745. setTimeout(() => {
  1746. removeThinking();
  1747. addAIMessage('您说得很对,不过我还想再考虑一下其他方面...');
  1748. }, 2000);
  1749. }
  1750. function addUserMessage(message) {
  1751. const container = document.getElementById('chat-messages');
  1752. container.innerHTML += `
  1753. <div class="flex gap-3 justify-end">
  1754. <div class="bg-green-500 text-white rounded-2xl rounded-tr-sm px-4 py-3 max-w-[75%] shadow-sm">
  1755. <p class="text-sm">${message}</p>
  1756. </div>
  1757. <div class="w-10 h-10 bg-gray-300 rounded-full flex items-center justify-center flex-shrink-0">
  1758. <i class="fas fa-user text-white"></i>
  1759. </div>
  1760. </div>
  1761. `;
  1762. container.scrollTop = container.scrollHeight;
  1763. }
  1764. function addAIMessage(message) {
  1765. const container = document.getElementById('chat-messages');
  1766. container.innerHTML += `
  1767. <div class="flex gap-3">
  1768. <div class="w-10 h-10 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center flex-shrink-0">
  1769. <i class="fas fa-robot text-green-600 dark:text-green-400"></i>
  1770. </div>
  1771. <div class="bg-white dark:bg-gray-800 rounded-2xl rounded-tl-sm px-4 py-3 max-w-[75%] shadow-sm">
  1772. <p class="text-sm">${message}</p>
  1773. </div>
  1774. </div>
  1775. `;
  1776. container.scrollTop = container.scrollHeight;
  1777. }
  1778. function showThinking() {
  1779. const container = document.getElementById('chat-messages');
  1780. container.innerHTML += `
  1781. <div id="thinking-indicator" class="flex gap-3">
  1782. <div class="w-10 h-10 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center flex-shrink-0">
  1783. <i class="fas fa-robot text-green-600"></i>
  1784. </div>
  1785. <div class="bg-white dark:bg-gray-800 rounded-2xl rounded-tl-sm px-4 py-3 shadow-sm">
  1786. <div class="flex items-center gap-2">
  1787. <span class="text-sm text-gray-500">AI正在思考</span>
  1788. <div class="flex gap-1">
  1789. <span class="w-2 h-2 bg-green-500 rounded-full thinking-dot"></span>
  1790. <span class="w-2 h-2 bg-green-500 rounded-full thinking-dot"></span>
  1791. <span class="w-2 h-2 bg-green-500 rounded-full thinking-dot"></span>
  1792. </div>
  1793. </div>
  1794. </div>
  1795. </div>
  1796. `;
  1797. container.scrollTop = container.scrollHeight;
  1798. }
  1799. function removeThinking() {
  1800. const thinking = document.getElementById('thinking-indicator');
  1801. if (thinking) thinking.remove();
  1802. }
  1803. function handleEnter(event) {
  1804. if (event.key === 'Enter') {
  1805. sendMessage();
  1806. }
  1807. }
  1808. // ==================== 主题切换 ====================
  1809. function toggleTheme() {
  1810. const html = document.documentElement;
  1811. if (html.classList.contains('dark')) {
  1812. html.classList.remove('dark');
  1813. html.classList.add('light');
  1814. } else {
  1815. html.classList.remove('light');
  1816. html.classList.add('dark');
  1817. }
  1818. // 重新绘制图表以适配新主题
  1819. drawRadarChart();
  1820. }
  1821. // ==================== 雷达图 ====================
  1822. function drawRadarChart() {
  1823. const canvas = document.getElementById('radarChart');
  1824. if (!canvas) return;
  1825. const ctx = canvas.getContext('2d');
  1826. const centerX = canvas.width / 2;
  1827. const centerY = canvas.height / 2;
  1828. const radius = 70;
  1829. const isDark = document.documentElement.classList.contains('dark');
  1830. // 清空画布
  1831. ctx.clearRect(0, 0, canvas.width, canvas.height);
  1832. // 数据
  1833. const labels = ['产品知识', '沟通技巧', '异议处理', '成交能力', '服务意识'];
  1834. const values = [85, 78, 82, 75, 88];
  1835. const maxValue = 100;
  1836. // 绘制网格
  1837. ctx.strokeStyle = isDark ? '#4b5563' : '#e5e7eb';
  1838. ctx.lineWidth = 1;
  1839. for (let i = 1; i <= 5; i++) {
  1840. ctx.beginPath();
  1841. for (let j = 0; j < 5; j++) {
  1842. const angle = (Math.PI * 2 / 5) * j - Math.PI / 2;
  1843. const r = (radius / 5) * i;
  1844. const x = centerX + r * Math.cos(angle);
  1845. const y = centerY + r * Math.sin(angle);
  1846. if (j === 0) ctx.moveTo(x, y);
  1847. else ctx.lineTo(x, y);
  1848. }
  1849. ctx.closePath();
  1850. ctx.stroke();
  1851. }
  1852. // 绘制轴线
  1853. for (let i = 0; i < 5; i++) {
  1854. const angle = (Math.PI * 2 / 5) * i - Math.PI / 2;
  1855. const x = centerX + radius * Math.cos(angle);
  1856. const y = centerY + radius * Math.sin(angle);
  1857. ctx.beginPath();
  1858. ctx.moveTo(centerX, centerY);
  1859. ctx.lineTo(x, y);
  1860. ctx.stroke();
  1861. // 绘制标签
  1862. const labelX = centerX + (radius + 20) * Math.cos(angle);
  1863. const labelY = centerY + (radius + 20) * Math.sin(angle);
  1864. ctx.fillStyle = isDark ? '#9ca3af' : '#6b7280';
  1865. ctx.font = '12px sans-serif';
  1866. ctx.textAlign = 'center';
  1867. ctx.textBaseline = 'middle';
  1868. ctx.fillText(labels[i], labelX, labelY);
  1869. }
  1870. // 绘制数据区域
  1871. ctx.beginPath();
  1872. for (let i = 0; i < 5; i++) {
  1873. const angle = (Math.PI * 2 / 5) * i - Math.PI / 2;
  1874. const r = (values[i] / maxValue) * radius;
  1875. const x = centerX + r * Math.cos(angle);
  1876. const y = centerY + r * Math.sin(angle);
  1877. if (i === 0) ctx.moveTo(x, y);
  1878. else ctx.lineTo(x, y);
  1879. }
  1880. ctx.closePath();
  1881. ctx.fillStyle = isDark ? 'rgba(34, 197, 94, 0.3)' : 'rgba(22, 163, 74, 0.2)';
  1882. ctx.fill();
  1883. ctx.strokeStyle = isDark ? '#22c55e' : '#16a34a';
  1884. ctx.lineWidth = 2;
  1885. ctx.stroke();
  1886. // 绘制数据点
  1887. for (let i = 0; i < 5; i++) {
  1888. const angle = (Math.PI * 2 / 5) * i - Math.PI / 2;
  1889. const r = (values[i] / maxValue) * radius;
  1890. const x = centerX + r * Math.cos(angle);
  1891. const y = centerY + r * Math.sin(angle);
  1892. ctx.beginPath();
  1893. ctx.arc(x, y, 4, 0, Math.PI * 2);
  1894. ctx.fillStyle = isDark ? '#22c55e' : '#16a34a';
  1895. ctx.fill();
  1896. }
  1897. }
  1898. // ==================== AI知识问答 ====================
  1899. let isQASending = false;
  1900. function toggleSidebar() {
  1901. const sidebar = document.getElementById('qa-sidebar');
  1902. const overlay = document.getElementById('sidebar-overlay');
  1903. sidebar.classList.toggle('-translate-x-full');
  1904. overlay.classList.toggle('hidden');
  1905. if (overlay.classList.contains('hidden')) {
  1906. document.body.classList.remove('modal-open');
  1907. } else {
  1908. document.body.classList.add('modal-open');
  1909. }
  1910. }
  1911. function selectHistory(question) {
  1912. const input = document.getElementById('qa-input');
  1913. input.value = question;
  1914. toggleSidebar();
  1915. sendQAQuestion();
  1916. }
  1917. function sendQAQuestion(presetQuestion) {
  1918. const input = document.getElementById('qa-input');
  1919. const sendBtn = document.getElementById('qa-send-btn');
  1920. if (isQASending) return;
  1921. const question = presetQuestion || input.value.trim();
  1922. if (!question) return;
  1923. // 如果是新对话的第一个问题,创建历史记录
  1924. if (currentConversationId === null) {
  1925. const newId = Date.now();
  1926. conversationHistory.unshift({
  1927. id: newId,
  1928. firstQuestion: question,
  1929. messages: []
  1930. });
  1931. currentConversationId = newId;
  1932. renderHistoryList();
  1933. }
  1934. // 禁用发送按钮
  1935. isQASending = true;
  1936. sendBtn.disabled = true;
  1937. sendBtn.classList.remove('bg-gradient-to-br', 'from-green-500', 'to-green-600');
  1938. sendBtn.classList.add('bg-gray-400');
  1939. addQAMessage(question, 'user');
  1940. if (!presetQuestion) input.value = '';
  1941. setTimeout(() => {
  1942. showQAThinking();
  1943. setTimeout(() => {
  1944. removeQAThinking();
  1945. const answer = getQAAnswer(question);
  1946. addQAMessage(answer, 'ai');
  1947. // 保存当前对话的消息到历史记录
  1948. if (currentConversationId !== null) {
  1949. const currentConv = conversationHistory.find(c => c.id === currentConversationId);
  1950. if (currentConv) {
  1951. currentConv.messages = [...qaMessages];
  1952. }
  1953. }
  1954. // 重新启用发送按钮
  1955. isQASending = false;
  1956. sendBtn.disabled = false;
  1957. sendBtn.classList.remove('bg-gray-400');
  1958. sendBtn.classList.add('bg-gradient-to-br', 'from-green-500', 'to-green-600');
  1959. }, 1000);
  1960. }, 300);
  1961. }
  1962. function getQAAnswer(question) {
  1963. const q = question.toLowerCase();
  1964. if (q.includes('spin') || q.includes('spIN提问')) {
  1965. return 'SPIN提问法是一种系统的需求挖掘技巧,包含四个阶段:\n\n• <span class="text-green-600 font-medium">S-Situation 情境问题</span>:了解客户现状\n如"您现在住的房子是什么情况?"\n\n• <span class="text-green-600 font-medium">P-Problem 问题问题</span>:挖掘客户痛点\n如"现在的厨房使用起来有什么不方便吗?"\n\n• <span class="text-green-600 font-medium">I-Implication 暗示问题</span>:放大痛点影响\n如"收纳不够确实会影响生活品质"\n\n• <span class="text-green-600 font-medium">N-Need-Payoff 需求确认</span>:确认解决方案\n如"所以您最希望解决的是收纳问题,对吗?"';
  1966. }
  1967. if (q.includes('价格异议') || q.includes('太贵')) {
  1968. return '处理价格异议的核心是价值传递:\n\n1. <span class="text-green-600">认同感受</span>:"我理解价格是您关心的问题"\n\n2. <span class="text-green-600">价值分解</span>:"我们采用E0级环保板材,五金质保10年"\n\n3. <span class="text-green-600">长期成本</span>:"使用寿命更长,年均成本更低"\n\n4. <span class="text-green-600">对比优势</span>:"性价比更高"\n\n记住:不要急于降价,先让客户认可价值!';
  1969. }
  1970. if (q.includes('板材') || q.includes('材质')) {
  1971. return '常见板材类型及特点:\n\n• <span class="text-green-600">实木板</span>:天然环保,质感好,但价格高,易变形\n\n• <span class="text-green-600">颗粒板</span>:性价比高,稳定性好,适合柜体\n\n• <span class="text-green-600">多层板</span>:强度高,防水性好,适合潮湿环境\n\n• <span class="text-green-600">环保等级</span>:ENF > E0 > E1,数字越小越环保\n\n推荐话术:"我们全部采用ENF级环保板材,给您和家人更安心的居住环境。"';
  1972. }
  1973. if (q.includes('成交信号') || q.includes('逼单')) {
  1974. return '识别成交信号和逼单技巧:\n\n<span class="text-green-600">成交信号</span>\n• 语言信号:询问细节、确认时间、询问付款方式\n• 行为信号:反复看方案、计算价格、身体前倾\n• 表情信号:点头、微笑、放松\n\n<span class="text-green-600">逼单技巧</span>\n• 假设成交法:"那我们是今天签约还是明天?"\n• 限时优惠法:"本周签约可享受XX优惠"\n• 案例见证法:"同小区的王先生也是选的这款"\n• 损失规避法:"这个优惠名额只剩2个了"';
  1975. }
  1976. if (q.includes('竞品') || q.includes('对比')) {
  1977. return '竞品对比应对话术:\n\n1. <span class="text-green-600">先认同后引导</span>\n"XX品牌确实不错,市场知名度很高"\n"不过选择定制家具,除了品牌,还要看..."\n\n2. <span class="text-green-600">差异化对比</span>\n• 板材对比(环保等级、品牌)\n• 五金对比(品牌、功能、质保年限)\n• 工艺对比(封边、安装细节)\n• 设计对比(个性化程度、专业性)\n• 服务对比(售后、质保、响应速度)\n\n3. <span class="text-green-600">价值强化</span>:强调性价比优势,突出差异化价值';
  1978. }
  1979. if (q.includes('客户类型')) {
  1980. return '五类客户类型及应对策略:\n\n• <span class="text-green-600">刚需型</span>:关注基础功能、性价比\n→ 强调实用性,讲清楚材料品质\n\n• <span class="text-green-600">改善型</span>:关注痛点解决、空间优化\n→ 挖掘痛点,展示解决方案\n\n• <span class="text-green-600">高端型</span>:关注品牌、设计、品质\n→ 展示案例,强调服务\n\n• <span class="text-green-600">强势型</span>:专业对等或尊重认可\n→ 准备好专业知识,尊重客户意见\n\n• <span class="text-green-600">复合型</span>:协调多方需求\n→ 逐一满足,确认最终决策人';
  1981. }
  1982. return '感谢您的提问!关于这个问题,我可以给您一些建议:\n\n1. 建议您先明确客户的核心需求\n2. 参考学习中心的对应课程\n3. 多使用AI陪练进行实战演练\n\n如果您有其他具体问题,欢迎继续问我~';
  1983. }
  1984. // 虚拟滚动实现
  1985. let qaMessages = [];
  1986. let conversationHistory = []; // 历史对话记录
  1987. let currentConversationId = null; // 当前选中的对话ID
  1988. const ITEM_HEIGHT_ESTIMATE = 100; // 估算每条消息高度
  1989. const BUFFER_SIZE = 5; // 缓冲区大小
  1990. function initQAMessages() {
  1991. // 初始化一些示例历史记录(带示例消息)
  1992. if (conversationHistory.length === 0) {
  1993. conversationHistory = [
  1994. {
  1995. id: 1,
  1996. firstQuestion: 'SPIN提问法是什么',
  1997. messages: [
  1998. { id: 1, content: 'SPIN提问法是什么', type: 'user' },
  1999. { id: 2, content: 'SPIN提问法是一种系统的需求挖掘技巧,包含四个阶段:\n\n• S-Situation 情境问题:了解客户现状\n• P-Problem 问题问题:挖掘客户痛点\n• I-Implication 暗示问题:放大痛点影响\n• N-Need-Payoff 需求确认:确认解决方案', type: 'ai' }
  2000. ]
  2001. },
  2002. {
  2003. id: 2,
  2004. firstQuestion: '如何处理价格异议',
  2005. messages: [
  2006. { id: 1, content: '如何处理价格异议', type: 'user' },
  2007. { id: 2, content: '处理价格异议的核心是价值传递:\n\n1. 认同感受\n2. 价值分解\n3. 长期成本\n4. 对比优势', type: 'ai' }
  2008. ]
  2009. },
  2010. {
  2011. id: 3,
  2012. firstQuestion: '板材知识有哪些',
  2013. messages: [
  2014. { id: 1, content: '板材知识有哪些', type: 'user' },
  2015. { id: 2, content: '常见板材类型及特点:\n\n• 实木板:天然环保,质感好\n• 颗粒板:性价比高,稳定性好\n• 多层板:强度高,防水性好', type: 'ai' }
  2016. ]
  2017. },
  2018. {
  2019. id: 4,
  2020. firstQuestion: '成交信号识别',
  2021. messages: [
  2022. { id: 1, content: '成交信号识别', type: 'user' },
  2023. { id: 2, content: '识别成交信号和逼单技巧:\n\n成交信号:\n• 语言信号:询问细节、确认时间\n• 行为信号:反复看方案、计算价格', type: 'ai' }
  2024. ]
  2025. },
  2026. {
  2027. id: 5,
  2028. firstQuestion: '竞品对比话术',
  2029. messages: [
  2030. { id: 1, content: '竞品对比话术', type: 'user' },
  2031. { id: 2, content: '竞品对比应对话术:\n\n1. 先认同后引导\n2. 差异化对比\n3. 价值强化', type: 'ai' }
  2032. ]
  2033. },
  2034. {
  2035. id: 6,
  2036. firstQuestion: '客户类型分析',
  2037. messages: [
  2038. { id: 1, content: '客户类型分析', type: 'user' },
  2039. { id: 2, content: '五类客户类型及应对策略:\n\n• 刚需型:关注基础功能、性价比\n• 改善型:关注痛点解决、空间优化\n• 高端型:关注品牌、设计、品质', type: 'ai' }
  2040. ]
  2041. },
  2042. {
  2043. id: 7,
  2044. firstQuestion: '逼单技巧有哪些',
  2045. messages: [
  2046. { id: 1, content: '逼单技巧有哪些', type: 'user' },
  2047. { id: 2, content: '逼单技巧:\n\n• 假设成交法\n• 限时优惠法\n• 案例见证法\n• 损失规避法', type: 'ai' }
  2048. ]
  2049. }
  2050. ];
  2051. }
  2052. qaMessages = [{
  2053. id: Date.now(),
  2054. content: '你好!我是你的AI知识助手。有什么销售问题可以随时问我~',
  2055. type: 'ai'
  2056. }];
  2057. renderQAMessages();
  2058. renderHistoryList();
  2059. }
  2060. // 文字截断函数:前8个字符+省略号
  2061. function truncateText(text, maxLength = 8) {
  2062. if (!text) return '';
  2063. text = text.trim();
  2064. if (text.length <= maxLength) return text;
  2065. return text.substring(0, maxLength) + '...';
  2066. }
  2067. // 渲染历史记录列表
  2068. function renderHistoryList() {
  2069. const container = document.getElementById('history-list');
  2070. if (!container) return;
  2071. container.innerHTML = conversationHistory.map(item => {
  2072. const isSelected = item.id === currentConversationId;
  2073. return `
  2074. <div class="history-item px-4 py-3 rounded-xl cursor-pointer transition-all active:scale-[0.98]
  2075. ${isSelected
  2076. ? 'bg-green-100 dark:bg-green-900/30 border-2 border-green-500'
  2077. : 'bg-gray-100 dark:bg-[#252d3d] border-2 border-transparent hover:bg-gray-200 dark:hover:bg-[#2f3a4a]'}"
  2078. onclick="selectHistoryItem(${item.id})">
  2079. <p class="text-sm ${isSelected ? 'text-green-700 dark:text-green-300 font-medium' : 'text-gray-900 dark:text-gray-200'}">
  2080. ${truncateText(item.firstQuestion)}
  2081. </p>
  2082. </div>
  2083. `;
  2084. }).join('');
  2085. }
  2086. // 选择历史记录项
  2087. function selectHistoryItem(id) {
  2088. // 先保存当前对话的消息
  2089. if (currentConversationId !== null) {
  2090. const currentConv = conversationHistory.find(c => c.id === currentConversationId);
  2091. if (currentConv) {
  2092. currentConv.messages = [...qaMessages];
  2093. }
  2094. }
  2095. // 切换到新的对话
  2096. currentConversationId = id;
  2097. const targetConv = conversationHistory.find(c => c.id === id);
  2098. if (targetConv && targetConv.messages.length > 0) {
  2099. qaMessages = [...targetConv.messages];
  2100. } else {
  2101. // 如果没有消息,显示初始问候
  2102. qaMessages = [{
  2103. id: Date.now(),
  2104. content: '你好!我是你的AI知识助手。有什么销售问题可以随时问我~',
  2105. type: 'ai'
  2106. }];
  2107. }
  2108. renderQAMessages();
  2109. renderHistoryList();
  2110. toggleSidebar();
  2111. // 滚动到底部
  2112. setTimeout(() => {
  2113. const container = document.getElementById('qa-messages');
  2114. if (container) {
  2115. container.scrollTop = container.scrollHeight;
  2116. }
  2117. }, 100);
  2118. }
  2119. function renderQAMessages() {
  2120. const container = document.getElementById('qa-messages');
  2121. if (!container) return;
  2122. const thinkingEl = document.getElementById('qa-thinking');
  2123. const containerHeight = container.clientHeight || 600;
  2124. const visibleCount = Math.ceil(containerHeight / ITEM_HEIGHT_ESTIMATE) + BUFFER_SIZE * 2;
  2125. const scrollTop = container.scrollTop;
  2126. const startIndex = Math.max(0, Math.floor(scrollTop / ITEM_HEIGHT_ESTIMATE) - BUFFER_SIZE);
  2127. const endIndex = Math.min(qaMessages.length, startIndex + visibleCount);
  2128. let html = '';
  2129. let currentHeight = 0;
  2130. for (let i = 0; i < startIndex; i++) {
  2131. currentHeight += ITEM_HEIGHT_ESTIMATE;
  2132. }
  2133. if (startIndex > 0) {
  2134. html += `<div style="height: ${currentHeight}px;"></div>`;
  2135. }
  2136. for (let i = startIndex; i < endIndex; i++) {
  2137. const msg = qaMessages[i];
  2138. if (msg.type === 'user') {
  2139. html += `
  2140. <div class="flex gap-3 justify-end">
  2141. <div class="bg-[#00d68f] text-white rounded-2xl rounded-tr-sm px-4 py-3 max-w-[75%]">
  2142. <p class="text-sm">${msg.content}</p>
  2143. </div>
  2144. <div class="w-10 h-10 bg-gray-300 dark:bg-[#3b4559] rounded-full flex items-center justify-center flex-shrink-0">
  2145. <i class="fas fa-user text-white dark:text-gray-300"></i>
  2146. </div>
  2147. </div>
  2148. `;
  2149. } else {
  2150. html += `
  2151. <div class="flex gap-3">
  2152. <div class="w-10 h-10 bg-[#00d68f] rounded-full flex items-center justify-center flex-shrink-0">
  2153. <i class="fas fa-robot text-white text-sm"></i>
  2154. </div>
  2155. <div class="bg-gray-100 dark:bg-[#252d3d] rounded-2xl rounded-tl-sm px-4 py-3 max-w-[75%]">
  2156. <p class="text-sm text-gray-900 dark:text-gray-100 whitespace-pre-wrap">${msg.content}</p>
  2157. </div>
  2158. </div>
  2159. `;
  2160. }
  2161. }
  2162. const remainingHeight = (qaMessages.length - endIndex) * ITEM_HEIGHT_ESTIMATE;
  2163. if (remainingHeight > 0) {
  2164. html += `<div style="height: ${remainingHeight}px;"></div>`;
  2165. }
  2166. container.innerHTML = html;
  2167. if (thinkingEl) {
  2168. container.appendChild(thinkingEl);
  2169. }
  2170. }
  2171. function addQAMessage(content, type) {
  2172. qaMessages.push({
  2173. id: Date.now(),
  2174. content,
  2175. type
  2176. });
  2177. renderQAMessages();
  2178. const container = document.getElementById('qa-messages');
  2179. if (container) {
  2180. setTimeout(() => {
  2181. container.scrollTop = container.scrollHeight;
  2182. }, 0);
  2183. }
  2184. }
  2185. function showQAThinking() {
  2186. const container = document.getElementById('qa-messages');
  2187. if (!container) return;
  2188. const thinkingEl = document.createElement('div');
  2189. thinkingEl.id = 'qa-thinking';
  2190. thinkingEl.className = 'flex gap-3';
  2191. thinkingEl.innerHTML = `
  2192. <div class="w-11 h-11 bg-gradient-to-br from-[#00d68f] to-[#00b377] rounded-full flex items-center justify-center flex-shrink-0">
  2193. <i class="fas fa-robot text-white text-sm"></i>
  2194. </div>
  2195. <div class="bg-gray-100 dark:bg-[#252d3d] rounded-2xl rounded-tl-sm px-5 py-3.5">
  2196. <div class="flex items-center gap-3">
  2197. <div class="flex gap-2">
  2198. <span class="w-2 h-2 bg-[#00d68f] rounded-full animate-bounce" style="animation-delay: 0s"></span>
  2199. <span class="w-2 h-2 bg-[#00d68f] rounded-full animate-bounce" style="animation-delay: 0.15s"></span>
  2200. <span class="w-2 h-2 bg-[#00d68f] rounded-full animate-bounce" style="animation-delay: 0.3s"></span>
  2201. </div>
  2202. </div>
  2203. </div>
  2204. `;
  2205. container.appendChild(thinkingEl);
  2206. setTimeout(() => {
  2207. container.scrollTop = container.scrollHeight;
  2208. }, 50);
  2209. }
  2210. function removeQAThinking() {
  2211. const thinking = document.getElementById('qa-thinking');
  2212. if (thinking) thinking.remove();
  2213. }
  2214. // 新建对话
  2215. function newConversation() {
  2216. // 清空输入框
  2217. document.getElementById('qa-input').value = '';
  2218. // 重置发送按钮状态
  2219. isQASending = false;
  2220. const sendBtn = document.getElementById('qa-send-btn');
  2221. sendBtn.disabled = false;
  2222. sendBtn.classList.remove('bg-gray-400');
  2223. sendBtn.classList.add('bg-gradient-to-br', 'from-green-500', 'to-green-600');
  2224. // 重新初始化消息
  2225. currentConversationId = null;
  2226. initQAMessages();
  2227. }
  2228. // 显示清除对话确认模态框
  2229. function confirmClearConversation() {
  2230. document.getElementById('clear-conversation-modal').classList.remove('hidden');
  2231. document.body.classList.add('modal-open');
  2232. }
  2233. // 关闭清除对话确认模态框
  2234. function closeClearModal() {
  2235. document.getElementById('clear-conversation-modal').classList.add('hidden');
  2236. document.body.classList.remove('modal-open');
  2237. }
  2238. // 清除当前对话并新建
  2239. function clearCurrentConversation() {
  2240. closeClearModal();
  2241. newConversation();
  2242. }
  2243. // ==================== 登录注册功能 ====================
  2244. let isLoggedIn = false;
  2245. function openLoginSheet() {
  2246. document.getElementById('login-sheet').classList.add('open');
  2247. document.body.classList.add('modal-open');
  2248. loadSavedCredentials();
  2249. }
  2250. function closeLoginSheet() {
  2251. document.getElementById('login-sheet').classList.remove('open');
  2252. document.body.classList.remove('modal-open');
  2253. }
  2254. function switchLoginReg(tab) {
  2255. const loginTabBtn = document.getElementById('login-tab-btn');
  2256. const regTabBtn = document.getElementById('reg-tab-btn');
  2257. const loginForm = document.getElementById('login-form');
  2258. const registerForm = document.getElementById('register-form');
  2259. if (tab === 'login') {
  2260. loginTabBtn.classList.add('bg-white', 'dark:bg-gray-600', 'text-green-600', 'dark:text-green-400', 'shadow-sm');
  2261. loginTabBtn.classList.remove('text-gray-600', 'dark:text-gray-300');
  2262. regTabBtn.classList.remove('bg-white', 'dark:bg-gray-600', 'text-green-600', 'dark:text-green-400', 'shadow-sm');
  2263. regTabBtn.classList.add('text-gray-600', 'dark:text-gray-300');
  2264. loginForm.classList.remove('hidden');
  2265. registerForm.classList.add('hidden');
  2266. } else {
  2267. regTabBtn.classList.add('bg-white', 'dark:bg-gray-600', 'text-green-600', 'dark:text-green-400', 'shadow-sm');
  2268. regTabBtn.classList.remove('text-gray-600', 'dark:text-gray-300');
  2269. loginTabBtn.classList.remove('bg-white', 'dark:bg-gray-600', 'text-green-600', 'dark:text-green-400', 'shadow-sm');
  2270. loginTabBtn.classList.add('text-gray-600', 'dark:text-gray-300');
  2271. registerForm.classList.remove('hidden');
  2272. loginForm.classList.add('hidden');
  2273. }
  2274. }
  2275. function togglePassword(inputId, btn) {
  2276. const input = document.getElementById(inputId);
  2277. const icon = btn.querySelector('i');
  2278. if (input.type === 'password') {
  2279. input.type = 'text';
  2280. icon.classList.remove('fa-eye');
  2281. icon.classList.add('fa-eye-slash');
  2282. } else {
  2283. input.type = 'password';
  2284. icon.classList.remove('fa-eye-slash');
  2285. icon.classList.add('fa-eye');
  2286. }
  2287. }
  2288. function validatePhone(phone) {
  2289. return /^1[3-9]\d{9}$/.test(phone);
  2290. }
  2291. function handleLogin() {
  2292. const phone = document.getElementById('login-phone').value.trim();
  2293. const password = document.getElementById('login-password').value;
  2294. const rememberMe = document.getElementById('remember-me').checked;
  2295. if (!phone) {
  2296. alert('请输入手机号');
  2297. return;
  2298. }
  2299. if (!validatePhone(phone)) {
  2300. alert('请输入正确的手机号');
  2301. return;
  2302. }
  2303. if (!password) {
  2304. alert('请输入密码');
  2305. return;
  2306. }
  2307. if (rememberMe) {
  2308. localStorage.setItem('savedPhone', phone);
  2309. localStorage.setItem('savedPassword', password);
  2310. } else {
  2311. localStorage.removeItem('savedPhone');
  2312. localStorage.removeItem('savedPassword');
  2313. }
  2314. isLoggedIn = true;
  2315. closeLoginSheet();
  2316. updateUserUI();
  2317. }
  2318. function handleRegister() {
  2319. const phone = document.getElementById('reg-phone').value.trim();
  2320. const code = document.getElementById('reg-code').value.trim();
  2321. const password = document.getElementById('reg-password').value;
  2322. const confirmPassword = document.getElementById('reg-confirm-password').value;
  2323. const agreeTerms = document.getElementById('agree-terms').checked;
  2324. if (!phone) {
  2325. alert('请输入手机号');
  2326. return;
  2327. }
  2328. if (!validatePhone(phone)) {
  2329. alert('请输入正确的手机号');
  2330. return;
  2331. }
  2332. if (!code || code.length !== 6) {
  2333. alert('请输入6位验证码');
  2334. return;
  2335. }
  2336. if (!password || password.length < 6 || password.length > 20) {
  2337. alert('密码长度为6-20位');
  2338. return;
  2339. }
  2340. if (password !== confirmPassword) {
  2341. alert('两次密码输入不一致');
  2342. return;
  2343. }
  2344. if (!agreeTerms) {
  2345. alert('请阅读并同意用户协议和隐私政策');
  2346. return;
  2347. }
  2348. alert('注册成功!');
  2349. switchLoginReg('login');
  2350. document.getElementById('login-phone').value = phone;
  2351. }
  2352. let countdown = 0;
  2353. let countdownTimer = null;
  2354. function sendVerifyCode() {
  2355. const phone = document.getElementById('reg-phone').value.trim();
  2356. const btn = document.getElementById('send-code-btn');
  2357. if (!phone) {
  2358. alert('请输入手机号');
  2359. return;
  2360. }
  2361. if (!validatePhone(phone)) {
  2362. alert('请输入正确的手机号');
  2363. return;
  2364. }
  2365. if (countdown > 0) return;
  2366. countdown = 60;
  2367. btn.textContent = `${countdown}秒后重发`;
  2368. btn.disabled = true;
  2369. countdownTimer = setInterval(() => {
  2370. countdown--;
  2371. if (countdown <= 0) {
  2372. clearInterval(countdownTimer);
  2373. btn.textContent = '获取验证码';
  2374. btn.disabled = false;
  2375. } else {
  2376. btn.textContent = `${countdown}秒后重发`;
  2377. }
  2378. }, 1000);
  2379. alert('验证码已发送');
  2380. }
  2381. function loadSavedCredentials() {
  2382. const savedPhone = localStorage.getItem('savedPhone');
  2383. const savedPassword = localStorage.getItem('savedPassword');
  2384. if (savedPhone) {
  2385. document.getElementById('login-phone').value = savedPhone;
  2386. document.getElementById('remember-me').checked = true;
  2387. }
  2388. if (savedPassword) {
  2389. document.getElementById('login-password').value = savedPassword;
  2390. }
  2391. }
  2392. function updateUserUI() {
  2393. const profileTab = document.getElementById('tab-profile');
  2394. if (isLoggedIn) {
  2395. // 用户已登录,显示用户信息
  2396. }
  2397. }
  2398. function handleLogout() {
  2399. isLoggedIn = false;
  2400. localStorage.removeItem('savedPhone');
  2401. localStorage.removeItem('savedPassword');
  2402. openLoginSheet();
  2403. }
  2404. // ==================== 初始化 ====================
  2405. document.addEventListener('DOMContentLoaded', function() {
  2406. // 检查系统主题偏好
  2407. if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
  2408. document.documentElement.classList.add('dark');
  2409. }
  2410. // 初始化问答消息
  2411. initQAMessages();
  2412. });
  2413. </script>
  2414. </body>
  2415. </html>