mobile_exam.html 216 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
  6. <title>实验室安全教育考试系统</title>
  7. <style>
  8. * { box-sizing: border-box; margin: 0; padding: 0; -webkit-tap-highlight-color: transparent; }
  9. :root {
  10. --blue: #1857d4;
  11. --blue-deep: #0f3ea8;
  12. --blue-mid: #2e6fe0;
  13. --blue-light: #eef3fd;
  14. --blue-xlight: #f5f8ff;
  15. --green: #10a37f;
  16. --green-dark: #0d8f6f;
  17. --green-light: #edfaf6;
  18. --orange: #e67e22;
  19. --orange-light: #fef6ec;
  20. --red: #e53e3e;
  21. --red-light: #fff5f5;
  22. --gray: #8896a7;
  23. --gray-light: #f4f6fa;
  24. --gray-border: #dde3ed;
  25. --text-primary: #1a2233;
  26. --text-secondary: #4a5568;
  27. --text-hint: #8896a7;
  28. --bg: #f0f4fb;
  29. --white: #ffffff;
  30. --radius: 12px;
  31. --shadow: 0 2px 12px rgba(24,87,212,.08);
  32. --shadow-md: 0 4px 20px rgba(24,87,212,.12);
  33. --header-bg: linear-gradient(135deg, #1857d4 0%, #2e6fe0 100%);
  34. }
  35. body { font-family: -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif; background: var(--bg); color: var(--text-primary); font-size: 14px; overflow-x: hidden; }
  36. /* ===== SCREEN SYSTEM ===== */
  37. .screen { display: none; flex-direction: column; height: 100vh; position: relative; overflow: hidden; background: var(--bg); }
  38. .screen.active { display: flex; }
  39. /* ===== TOP NAV ===== */
  40. .topbar { background: var(--white); padding: 13px 16px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid var(--gray-border); flex-shrink: 0; z-index: 100; box-shadow: 0 1px 6px rgba(24,87,212,.07); }
  41. .topbar-title { font-size: 16px; font-weight: 700; color: var(--text-primary); letter-spacing: .3px; }
  42. .topbar-back { display: flex; align-items: center; gap: 4px; color: var(--blue); font-size: 13px; cursor: pointer; padding: 5px 10px; border: 1px solid rgba(24,87,212,.25); border-radius: 8px; background: var(--blue-xlight); font-weight: 500; }
  43. /* ===== BOTTOM TAB ===== */
  44. .bottom-tab { background: var(--white); display: flex; border-top: 1px solid var(--gray-border); flex-shrink: 0; z-index: 100; box-shadow: 0 -1px 8px rgba(24,87,212,.06); }
  45. .tab-item { flex: 1; display: flex; flex-direction: column; align-items: center; padding: 8px 4px; cursor: pointer; color: var(--text-hint); font-size: 10px; gap: 2px; transition: color .2s; }
  46. .tab-item.active { color: var(--blue); }
  47. .tab-icon { font-size: 20px; }
  48. /* ===== SCROLL CONTENT ===== */
  49. .scroll-content { flex: 1; overflow-y: auto; padding-bottom: 16px; }
  50. .scroll-content::-webkit-scrollbar { width: 3px; }
  51. .scroll-content::-webkit-scrollbar-thumb { background: rgba(24,87,212,.2); border-radius: 2px; }
  52. /* ===== CARDS ===== */
  53. .card { background: var(--white); border: 1px solid var(--gray-border); border-radius: var(--radius); padding: 16px; margin: 0 12px 12px; box-shadow: var(--shadow); }
  54. .card-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; }
  55. .card-title { font-size: 15px; font-weight: 700; color: var(--text-primary); display: flex; align-items: center; gap: 8px; }
  56. .card-title::before { content: ''; width: 3px; height: 15px; background: linear-gradient(180deg, var(--blue-mid), var(--blue-deep)); border-radius: 2px; display: inline-block; }
  57. .more-link { color: var(--blue); font-size: 12px; cursor: pointer; font-weight: 500; }
  58. /* ===== TAGS ===== */
  59. .tag { display: inline-flex; align-items: center; padding: 2px 8px; border-radius: 20px; font-size: 11px; font-weight: 500; }
  60. .tag-blue { background: var(--blue-light); color: var(--blue); }
  61. .tag-green { background: var(--green-light); color: var(--green-dark); }
  62. .tag-orange { background: var(--orange-light); color: var(--orange); }
  63. .tag-red { background: var(--red-light); color: var(--red); }
  64. .tag-gray { background: var(--gray-light); color: var(--gray); }
  65. .tag-risk-1 { background: var(--blue-light); color: var(--blue); border: 1px solid rgba(24,87,212,.2); }
  66. .tag-risk-2 { background: var(--orange-light); color: var(--orange); border: 1px solid rgba(230,126,34,.2); }
  67. .tag-risk-3 { background: var(--red-light); color: var(--red); border: 1px solid rgba(229,62,62,.2); }
  68. /* ===== BTNs ===== */
  69. .btn { display: inline-flex; align-items: center; justify-content: center; border-radius: 8px; font-size: 14px; font-weight: 600; cursor: pointer; border: none; outline: none; transition: all .18s; padding: 0 16px; height: 36px; }
  70. .btn:active { opacity: .85; transform: scale(.97); }
  71. .btn-primary { background: linear-gradient(135deg, var(--blue-mid) 0%, var(--blue-deep) 100%); color: #fff; box-shadow: 0 3px 12px rgba(24,87,212,.3); }
  72. .btn-green { background: linear-gradient(135deg, #12b48a 0%, var(--green-dark) 100%); color: #fff; box-shadow: 0 3px 12px rgba(16,163,127,.25); }
  73. .btn-orange { background: linear-gradient(135deg, #f39c12 0%, var(--orange) 100%); color: #fff; box-shadow: 0 3px 12px rgba(230,126,34,.25); }
  74. .btn-outline { background: var(--blue-xlight); color: var(--blue); border: 1px solid rgba(24,87,212,.3); }
  75. .btn-sm { height: 28px; font-size: 12px; padding: 0 10px; border-radius: 6px; }
  76. .btn-block { width: 100%; height: 44px; font-size: 15px; border-radius: 10px; }
  77. /* ===== PROGRESS BAR ===== */
  78. .progress-wrap { background: #e8edf6; border-radius: 4px; height: 7px; overflow: hidden; }
  79. .progress-bar { height: 100%; border-radius: 4px; background: linear-gradient(90deg, var(--blue-mid), var(--blue)); transition: width .4s; }
  80. /* ===== DIVIDER ===== */
  81. .divider { height: 8px; background: var(--bg); margin: 0; }
  82. /* ===== STATUS DOT ===== */
  83. .dot { width: 7px; height: 7px; border-radius: 50%; display: inline-block; }
  84. .dot-green { background: var(--green); }
  85. .dot-orange { background: var(--orange); }
  86. .dot-red { background: var(--red); }
  87. .dot-gray { background: #b0bec5; }
  88. /* ===== BADGE ===== */
  89. .badge { background: var(--red); color: white; font-size: 10px; min-width: 16px; height: 16px; border-radius: 8px; display: inline-flex; align-items: center; justify-content: center; padding: 0 4px; }
  90. /* ===== MODAL OVERLAY ===== */
  91. .modal-overlay { display: none; position: fixed; inset: 0; background: rgba(0,0,0,.5); z-index: 500; align-items: center; justify-content: center; padding: 20px; }
  92. .modal-overlay.active { display: flex; }
  93. .modal-box { background: var(--white); border-radius: 16px; padding: 24px 20px; width: 100%; max-width: 340px; animation: modalIn .25s ease; box-shadow: 0 8px 40px rgba(24,87,212,.15); }
  94. @keyframes modalIn { from { transform: scale(.9); opacity: 0; } to { transform: scale(1); opacity: 1; } }
  95. @keyframes slideUp { from { transform: translateY(100%); } to { transform: translateY(0); } }
  96. @keyframes scanAnim { 0%{top:0} 100%{top:calc(100% - 2px)} }
  97. @keyframes marquee { 0%{transform:translateX(100%)} 100%{transform:translateX(-100%)} }
  98. .modal-title { font-size: 17px; font-weight: 700; color: var(--text-primary); margin-bottom: 8px; text-align: center; }
  99. .modal-desc { font-size: 13px; color: var(--text-secondary); margin-bottom: 20px; text-align: center; line-height: 1.7; }
  100. .modal-btns { display: flex; gap: 10px; }
  101. .modal-btns .btn { flex: 1; }
  102. /* ===== FORM ===== */
  103. .form-item { margin-bottom: 14px; }
  104. .form-label { font-size: 13px; color: var(--text-secondary); margin-bottom: 6px; }
  105. .form-input { width: 100%; border: 1px solid var(--gray-border); border-radius: 8px; padding: 10px 12px; font-size: 14px; color: var(--text-primary); background: var(--gray-light); outline: none; transition: border-color .2s; }
  106. .form-input:focus { border-color: var(--blue); }
  107. .form-select { appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%238c8c8c' d='M6 8L1 3h10z'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 10px center; }
  108. /* ===== ROW ===== */
  109. .row { display: flex; align-items: center; gap: 8px; }
  110. .row-between { display: flex; align-items: center; justify-content: space-between; }
  111. /* ===== QUESTION CARD ===== */
  112. .q-header { background: var(--blue-xlight); border-left: 3px solid var(--blue); padding: 10px 14px; border-radius: 8px; margin-bottom: 14px; }
  113. .q-type-badge { background: var(--blue); color: white; font-size: 12px; padding: 2px 8px; border-radius: 4px; margin-right: 8px; }
  114. .diff-easy { font-size:11px;padding:2px 7px;border-radius:4px;background:#f6ffed;color:#52c41a;border:1px solid #b7eb8f; }
  115. .diff-normal { font-size:11px;padding:2px 7px;border-radius:4px;background:#e6f4ff;color:#1677ff;border:1px solid #91caff; }
  116. .diff-hard { font-size:11px;padding:2px 7px;border-radius:4px;background:#fff7e6;color:#fa8c16;border:1px solid #ffd591; }
  117. .diff-extreme { font-size:11px;padding:2px 7px;border-radius:4px;background:#fff1f0;color:#f5222d;border:1px solid #ffa39e; }
  118. .q-content { font-size: 14px; line-height: 1.7; color: var(--text-primary); margin-top: 8px; }
  119. .q-options { display: flex; flex-direction: column; gap: 10px; }
  120. .q-option { display: flex; align-items: flex-start; gap: 10px; border: 1.5px solid var(--gray-border); border-radius: 8px; padding: 12px; cursor: pointer; transition: all .18s; background: var(--white); }
  121. .q-option.selected { border-color: var(--blue); background: var(--blue-light); }
  122. .q-option.correct { border-color: var(--green); background: var(--green-light); }
  123. .q-option.wrong { border-color: var(--red); background: var(--red-light); }
  124. .q-opt-key { color: var(--blue); font-weight: 600; font-size: 14px; flex-shrink: 0; }
  125. .q-radio { width: 18px; height: 18px; border-radius: 50%; border: 2px solid var(--gray-border); flex-shrink: 0; margin-top: 1px; transition: all .2s; }
  126. .q-option.selected .q-radio { border-color: var(--blue); background: var(--blue); box-shadow: inset 0 0 0 3px white; }
  127. /* ===== ANSWER BOX ===== */
  128. .answer-box { background: var(--gray-light); border-radius: 8px; padding: 12px; margin-top: 12px; }
  129. .answer-label { display: inline-flex; align-items: center; padding: 2px 10px; background: var(--green); color: white; border-radius: 6px; font-size: 12px; margin-bottom: 8px; }
  130. .answer-analysis { font-size: 13px; color: var(--text-secondary); line-height: 1.7; margin-top: 8px; }
  131. /* ===== QUESTION NAV ===== */
  132. .q-nav { display: flex; flex-wrap: wrap; gap: 8px; padding: 12px 0; }
  133. .q-num { width: 36px; height: 36px; border-radius: 6px; display: flex; align-items: center; justify-content: center; font-size: 13px; font-weight: 500; cursor: pointer; border: 1.5px solid var(--gray-border); color: var(--text-secondary); background: var(--white); position: relative; }
  134. .q-num.current { background: var(--blue); color: white; border-color: var(--blue); }
  135. .q-num.answered { background: var(--blue-light); color: var(--blue); border-color: var(--blue); }
  136. .q-num.wrong-q { background: var(--orange-light); color: var(--orange); border-color: var(--orange); }
  137. .q-num .q-badge { position: absolute; top: -5px; right: -5px; background: var(--orange); color: white; font-size: 9px; min-width: 14px; height: 14px; border-radius: 7px; display: flex; align-items: center; justify-content: center; }
  138. /* ===== EXAM BOTTOM BAR ===== */
  139. .exam-bottom { background: var(--white); border-top: 1px solid var(--gray-border); padding: 12px 16px; display: flex; align-items: center; gap: 8px; flex-shrink: 0; z-index: 50; box-shadow: 0 -2px 8px rgba(24,87,212,.06); }
  140. .time-display { flex: 1; background: var(--gray-light); border-radius: 8px; padding: 8px 12px; text-align: center; font-size: 13px; color: var(--text-secondary); }
  141. .time-display span { color: var(--red); font-weight: 600; font-size: 15px; }
  142. /* ===== STAT ROW ===== */
  143. .stat-row { display: flex; background: var(--blue-xlight); border-radius: 8px; padding: 10px; gap: 4px; margin-bottom: 14px; font-size: 13px; border: 1px solid rgba(24,87,212,.1); }
  144. .stat-item { flex: 1; text-align: center; }
  145. .stat-item + .stat-item { border-left: 1px solid var(--gray-border); }
  146. .stat-val { font-weight: 600; font-size: 15px; }
  147. .stat-val.correct-c { color: var(--green); }
  148. .stat-val.wrong-c { color: var(--red); }
  149. /* ===== LIST ITEMS ===== */
  150. .list-item { display: flex; align-items: center; padding: 12px 0; border-bottom: 1px solid var(--gray-border); cursor: pointer; }
  151. .list-item:last-child { border-bottom: none; }
  152. .list-left { flex: 1; }
  153. .list-right { flex-shrink: 0; color: var(--text-hint); font-size: 12px; }
  154. /* ===== CERT CARD ===== */
  155. .cert-card { background: linear-gradient(135deg, #1677ff 0%, #0958d9 100%); border-radius: 12px; padding: 20px; color: white; margin-bottom: 12px; position: relative; overflow: hidden; }
  156. .cert-card::after { content: ''; position: absolute; right: -20px; top: -20px; width: 100px; height: 100px; background: rgba(255,255,255,.08); border-radius: 50%; }
  157. .cert-name { font-size: 16px; font-weight: 700; margin-bottom: 8px; }
  158. .cert-no { font-size: 12px; opacity: .8; margin-bottom: 12px; }
  159. .cert-meta { font-size: 11px; opacity: .75; display: flex; gap: 12px; flex-wrap: wrap; }
  160. /* ===== TRAINING CARD ===== */
  161. .training-card { background: linear-gradient(135deg, #fff8f0 0%, #fffbf0 100%); border: 1px solid rgba(230,126,34,.25); border-radius: 12px; padding: 14px; }
  162. .qr-placeholder { width: 64px; height: 64px; background: var(--white); border: 2px solid var(--gray-border); border-radius: 8px; display: flex; flex-direction: column; align-items: center; justify-content: center; font-size: 18px; flex-shrink: 0; }
  163. /* ===== KNOWLEDGE ITEM ===== */
  164. .know-item { display: flex; align-items: center; padding: 12px 0; border-bottom: 1px solid var(--gray-border); gap: 10px; cursor: pointer; }
  165. .know-item:last-child { border-bottom: none; }
  166. .know-icon { width: 38px; height: 38px; background: var(--blue-light); border-radius: 10px; display: flex; align-items: center; justify-content: center; font-size: 18px; flex-shrink: 0; border: 1px solid rgba(24,87,212,.12); }
  167. /* ===== VIDEO GRID ===== */
  168. .video-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
  169. .video-card { border-radius: 10px; overflow: hidden; background: var(--white); border: 1px solid var(--gray-border); cursor: pointer; box-shadow: 0 2px 8px rgba(24,87,212,.06); }
  170. .video-thumb { width: 100%; aspect-ratio: 16/9; background: #d0d0d0; display: flex; align-items: center; justify-content: center; font-size: 28px; color: white; position: relative; }
  171. .video-thumb-bg { position: absolute; inset: 0; background: linear-gradient(to bottom, rgba(0,0,0,.1), rgba(0,0,0,.3)); }
  172. .video-play { font-size: 28px; z-index: 1; }
  173. .video-info { padding: 8px; }
  174. .video-title { font-size: 12px; font-weight: 500; color: var(--text-primary); margin-bottom: 4px; line-height: 1.4; }
  175. .video-meta { font-size: 10px; color: var(--text-hint); }
  176. /* ===== PRACTICE CARD ===== */
  177. .practice-card { border: 1px solid var(--gray-border); border-radius: 10px; padding: 14px; cursor: pointer; }
  178. .practice-ring { width: 56px; height: 56px; flex-shrink: 0; }
  179. /* ===== EXAM TASK CARD ===== */
  180. .exam-task-card { border: 1px solid var(--gray-border); border-radius: 10px; padding: 14px; cursor: pointer; margin-bottom: 10px; }
  181. .exam-task-card.active-exam { border-color: var(--blue); background: var(--blue-xlight); }
  182. .task-row { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; }
  183. .task-label { font-size: 12px; color: var(--text-hint); }
  184. .task-val { font-size: 13px; font-weight: 500; }
  185. /* ===== STUDY DETAIL ===== */
  186. .material-viewer { background: #d4d4d4; border-radius: 10px; margin-bottom: 14px; aspect-ratio: 4/3; display: flex; align-items: center; justify-content: center; color: var(--text-hint); font-size: 16px; }
  187. /* ===== COURSE LIST ITEM ===== */
  188. .course-item { border: 1.5px solid var(--gray-border); border-radius: 10px; padding: 14px; margin-bottom: 10px; cursor: pointer; }
  189. .course-item.current-course { border-color: var(--blue); background: var(--blue-xlight); }
  190. /* ===== MY SCORES ===== */
  191. .score-card { border: 1px solid var(--gray-border); border-radius: 10px; padding: 14px; margin-bottom: 10px; }
  192. .score-result-pass { color: var(--green); font-weight: 600; }
  193. .score-result-fail { color: var(--red); font-weight: 600; }
  194. .score-result-sup { color: var(--blue); font-weight: 600; }
  195. /* ===== APPROVAL LIST ===== */
  196. .approval-card { border: 1px solid var(--gray-border); border-radius: 10px; padding: 14px; margin-bottom: 10px; }
  197. .approval-status-pending { color: var(--orange); font-weight: 600; }
  198. .approval-status-pass { color: var(--green); font-weight: 600; }
  199. .approval-status-reject { color: var(--red); font-weight: 600; }
  200. /* ===== TAG SCROLL ===== */
  201. .tag-scroll { display: flex; gap: 8px; overflow-x: auto; padding: 0 12px 8px; scrollbar-width: none; }
  202. .tag-scroll::-webkit-scrollbar { display: none; }
  203. .tag-scroll .tag { flex-shrink: 0; cursor: pointer; padding: 5px 12px; }
  204. .tag-scroll .tag.active { background: var(--blue); color: white; box-shadow: 0 2px 8px rgba(24,87,212,.3); }
  205. /* ===== FLOATING MY BTN ===== */
  206. .float-btn { position: fixed; right: 16px; bottom: 80px; width: 52px; height: 52px; background: var(--blue); border-radius: 50%; display: flex; align-items: center; justify-content: center; box-shadow: 0 4px 16px rgba(22,119,255,.45); cursor: pointer; z-index: 200; flex-direction: column; gap: 1px; }
  207. .float-btn span { color: white; font-size: 10px; }
  208. .float-btn .float-icon { font-size: 20px; }
  209. /* ===== EMPTY STATE ===== */
  210. .empty-state { text-align: center; padding: 40px 20px; color: var(--text-hint); }
  211. .empty-state .empty-icon { font-size: 48px; margin-bottom: 12px; }
  212. /* ===== SECTION TOP PADDING ===== */
  213. .section-top { padding-top: 0; }
  214. /* ===== YEAR DATA CARD ===== */
  215. .year-row { display: flex; align-items: center; justify-content: space-between; padding: 10px 0; border-bottom: 1px solid var(--gray-border); }
  216. .year-row:last-child { border-bottom: none; }
  217. .year-label { font-size: 14px; color: var(--text-primary); font-weight: 500; }
  218. .year-status-going { color: var(--blue); font-size: 13px; }
  219. .year-status-pass { color: var(--green); font-size: 13px; font-weight: 600; }
  220. /* ===== HELP TEXT ===== */
  221. .help-text { font-size: 12px; color: var(--text-hint); line-height: 1.6; }
  222. /* ===== CHIP ROW ===== */
  223. .chip-row { display: flex; gap: 6px; flex-wrap: wrap; }
  224. /* ===== INLINE ICON ===== */
  225. .icon-sm { font-size: 13px; vertical-align: middle; }
  226. /* ===== LAB SEARCH ===== */
  227. .lab-result-item:hover { background: var(--blue-light); }
  228. .lab-result-item:last-child { border-bottom: none !important; }
  229. /* ===== FILTER ROW ===== */
  230. .filter-row { display: flex; align-items: center; gap: 8px; padding: 10px 12px; background: var(--white); border-bottom: 1px solid var(--gray-border); overflow-x: auto; box-shadow: 0 1px 4px rgba(24,87,212,.05); }
  231. .filter-row::-webkit-scrollbar { display: none; }
  232. /* ===== INFO TABLE ===== */
  233. .info-table { width: 100%; font-size: 13px; }
  234. .info-table tr td:first-child { color: var(--text-hint); width: 90px; padding: 5px 0; }
  235. .info-table tr td:last-child { color: var(--text-primary); font-weight: 500; }
  236. /* ===== STAR DIFFICULTY ===== */
  237. .star-row { display: flex; gap: 2px; }
  238. .star { font-size: 14px; }
  239. .star.filled { color: #faad14; }
  240. .star.empty { color: #d9d9d9; }
  241. /* ===== ANSWER REVEAL ===== */
  242. .see-answer-btn { color: var(--blue); font-size: 13px; cursor: pointer; float: right; margin-top: -2px; }
  243. /* ===== MISC ===== */
  244. .mt4 { margin-top: 4px; }
  245. .mt8 { margin-top: 8px; }
  246. .mt12 { margin-top: 12px; }
  247. .mt16 { margin-top: 16px; }
  248. .mb4 { margin-bottom: 4px; }
  249. .mb8 { margin-bottom: 8px; }
  250. .mb12 { margin-bottom: 12px; }
  251. .text-sm { font-size: 12px; }
  252. .text-xs { font-size: 11px; }
  253. .text-blue { color: var(--blue); }
  254. .text-green { color: var(--green); }
  255. .text-orange { color: var(--orange); }
  256. .text-red { color: var(--red); }
  257. .text-gray { color: var(--gray); }
  258. .text-bold { font-weight: 600; }
  259. .fw500 { font-weight: 500; }
  260. .inline-block { display: inline-block; }
  261. .flex-center { display: flex; align-items: center; justify-content: center; }
  262. .side-panel { background: var(--gray-light); border-right: 1px solid var(--gray-border); width: 110px; flex-shrink: 0; padding: 14px 10px; overflow-y: auto; }
  263. .split-layout { display: flex; flex: 1; overflow: hidden; }
  264. .main-panel { flex: 1; overflow-y: auto; padding: 14px; }
  265. .exam-screen.active { height: 100vh; flex-direction: column; }
  266. </style>
  267. </head>
  268. <body>
  269. <!-- ==================== SCREEN: 工作台主页 ==================== -->
  270. <div class="screen active" id="screen-home">
  271. <div class="topbar" style="background:linear-gradient(135deg,#1857d4 0%,#2e6fe0 100%);border-bottom:none;padding:14px 16px;">
  272. <div style="visibility:hidden;width:40px;"></div>
  273. <div class="topbar-title" style="color:#fff;font-size:17px;letter-spacing:.5px;">安全教育考试</div>
  274. <div onclick="window.open('requirements.html','_blank')" style="cursor:pointer;background:rgba(255,255,255,.18);border:1px solid rgba(255,255,255,.35);border-radius:8px;padding:4px 10px;font-size:12px;color:#fff;white-space:nowrap;">需求说明</div>
  275. </div>
  276. <div class="scroll-content">
  277. <div class="section-top">
  278. <!-- ===== 用户信息卡 ===== -->
  279. <div style="background:linear-gradient(135deg,#1857d4 0%,#2e6fe0 100%);margin:0 0 0 0;padding:16px 16px 32px;">
  280. <div style="display:flex;align-items:center;gap:12px;">
  281. <div style="width:48px;height:48px;border-radius:50%;background:rgba(255,255,255,.2);display:flex;align-items:center;justify-content:center;font-size:24px;border:2px solid rgba(255,255,255,.35);">👤</div>
  282. <div style="flex:1;">
  283. <div style="display:flex;align-items:center;gap:8px;margin-bottom:4px;">
  284. <span style="color:#fff;font-size:17px;font-weight:700;">张明远</span>
  285. <span style="background:rgba(255,215,0,.2);color:#ffe066;font-size:11px;padding:2px 8px;border-radius:20px;border:1px solid rgba(255,215,0,.35);">奖励分 128</span>
  286. <span style="background:rgba(0,210,140,.18);color:#7fffd4;font-size:11px;padding:2px 8px;border-radius:20px;border:1px solid rgba(0,210,140,.4);">信用分 95</span>
  287. </div>
  288. <div style="color:rgba(255,255,255,.8);font-size:12px;">硕士研究生 · 20231001 · 生命科学学院</div>
  289. </div>
  290. <span style="background:rgba(0,210,140,.18);color:#7fffd4;font-size:11px;padding:3px 10px;border-radius:20px;border:1px solid rgba(0,210,140,.4);">● 正常</span>
  291. </div>
  292. </div>
  293. <div class="card" style="margin-top:-18px;border-top-left-radius:16px;border-top-right-radius:16px;">
  294. <div style="background:var(--blue-light);border-radius:8px;padding:10px;margin-bottom:14px;">
  295. <div class="text-xs text-gray mb4">绑定实验室</div>
  296. <div style="display:flex;align-items:center;gap:6px;">
  297. <span class="dot dot-green"></span>
  298. <span class="fw500 text-blue">分子生物学实验室(B206)</span>
  299. <span class="tag tag-green text-xs" style="padding:1px 6px;">已通过</span>
  300. </div>
  301. </div>
  302. <!-- 学年进度 -->
  303. <div style="background:var(--gray-light);border-radius:10px;padding:14px;margin-bottom:12px;">
  304. <div class="row-between mb8">
  305. <div style="display:flex;align-items:center;gap:6px;">
  306. <span class="tag tag-blue">2025-2026 学年</span>
  307. <span class="tag tag-risk-2">Ⅱ级实验室</span>
  308. <span class="tag tag-gray">生物类</span>
  309. </div>
  310. </div>
  311. <div class="row-between mb4">
  312. <span class="text-sm text-gray">当前学年学时完成进度</span>
  313. <span class="text-blue text-bold">6 / 8 学时</span>
  314. </div>
  315. <div class="progress-wrap mb8">
  316. <div class="progress-bar" style="width:75%"></div>
  317. </div>
  318. <div class="row-between text-sm">
  319. <div><span class="text-gray">学时完成度</span> <span class="text-bold text-blue">75%</span></div>
  320. <div><span class="text-gray">目标考试</span> <span onclick="goto('screen-exam-detail')" style="color:var(--blue);font-weight:600;background:var(--blue-light);padding:2px 8px;border-radius:6px;border:1px solid rgba(24,87,212,.25);cursor:pointer;display:inline-flex;align-items:center;gap:3px;">应知应会考试 ›</span></div>
  321. </div>
  322. </div>
  323. <!-- 任务状态 -->
  324. <div>
  325. <div class="text-sm text-gray mb8 text-bold">当前学年任务状态</div>
  326. <div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px;">
  327. <div style="border:1px solid var(--gray-border);border-radius:8px;padding:10px;text-align:center;">
  328. <div class="text-xs text-gray mb4">考试状态</div>
  329. <span class="tag tag-gray">暂无</span>
  330. </div>
  331. <div style="border:1px solid var(--gray-border);border-radius:8px;padding:10px;text-align:center;">
  332. <div class="text-xs text-gray mb4">证书状态</div>
  333. <span class="tag tag-gray">暂无</span>
  334. </div>
  335. <div style="border:1px solid var(--green) solid;border-radius:8px;padding:10px;text-align:center;background:#f6ffed;">
  336. <div class="text-xs text-gray mb4">审批状态</div>
  337. <span class="tag tag-green">已通过</span>
  338. </div>
  339. </div>
  340. </div>
  341. </div>
  342. <!-- 通知滚动条 -->
  343. <div onclick="goto('screen-notice-list')" style="background:#fffbe6;border:1px solid #ffe58f;border-radius:8px;padding:8px 12px;margin-bottom:10px;display:flex;align-items:center;gap:8px;overflow:hidden;cursor:pointer;">
  344. <span style="font-size:13px;flex-shrink:0;">📢</span>
  345. <div style="flex:1;overflow:hidden;">
  346. <div id="noticeScroll" style="white-space:nowrap;font-size:12px;color:#d48806;animation:marquee 22s linear infinite;">
  347. 【实验室绑定审批】您申请绑定"生命科学学院-A301实验室"正在审批中,请耐心等待负责人处理 &nbsp;&nbsp;&nbsp; 【在线考试】应知应会考试将于2026-08-05截止,请尽快完成 &nbsp;&nbsp;&nbsp; 【学习培训】2026年春季实验室安全知识讲座已开始报名,请及时参加
  348. </div>
  349. </div>
  350. <span style="font-size:11px;color:#d48806;flex-shrink:0;border-left:1px solid #ffe58f;padding-left:8px;">全部 ›</span>
  351. </div>
  352. <!-- ===== 实验室审批入口卡片 ===== -->
  353. <div class="card" style="margin-bottom:12px;border-radius:12px;padding:0;overflow:hidden;" onclick="goto('screen-approval')">
  354. <div style="display:flex;align-items:center;padding:14px 16px;gap:12px;cursor:pointer;">
  355. <div style="width:40px;height:40px;border-radius:10px;background:#e6f4ff;display:flex;align-items:center;justify-content:center;font-size:20px;flex-shrink:0;">🏛️</div>
  356. <div style="flex:1;">
  357. <div style="font-size:14px;font-weight:600;color:var(--text-primary);">实验室绑定申请</div>
  358. <div style="font-size:12px;color:var(--text-hint);margin-top:2px;">待审批申请需及时处理</div>
  359. </div>
  360. <div style="display:flex;align-items:center;gap:6px;">
  361. <span style="background:#ff4d4f;color:#fff;font-size:11px;font-weight:600;padding:2px 7px;border-radius:10px;min-width:20px;text-align:center;">3</span>
  362. <span style="font-size:16px;color:var(--text-hint);">›</span>
  363. </div>
  364. </div>
  365. </div>
  366. <!-- 学年数据统计 -->
  367. <div class="card" style="padding:0;overflow:hidden;">
  368. <div style="background:var(--gray-light);padding:10px 14px;display:flex;justify-content:space-between;align-items:center;">
  369. <span class="text-sm text-bold">📊 学年数据统计</span>
  370. <button class="btn btn-outline btn-sm" onclick="showReportModal()">毕业报告</button>
  371. </div>
  372. <div style="padding:8px 14px;">
  373. <div class="year-row">
  374. <span class="year-label">2025-2026</span>
  375. <span class="year-status-going">进行中</span>
  376. </div>
  377. <div class="year-row">
  378. <span class="year-label">2024-2025</span>
  379. <span class="year-status-pass">通过 · 90 分</span>
  380. </div>
  381. <div class="year-row">
  382. <span class="year-label">2023-2024</span>
  383. <span class="year-status-pass">通过 · 85 分</span>
  384. </div>
  385. </div>
  386. </div>
  387. <!-- 学习任务 -->
  388. <div class="card" style="padding:0;overflow:hidden;">
  389. <div style="background:var(--gray-light);padding:10px 14px;display:flex;justify-content:space-between;align-items:center;">
  390. <div><span class="text-sm text-bold">📚 学习任务 <span class="badge">2</span></span>
  391. <span class="text-xs text-gray" style="margin-left:6px;">待完成的学习任务</span></div>
  392. <span onclick="goto('screen-knowledge-list');switchLxTab(2);" style="font-size:12px;color:var(--blue);cursor:pointer;">更多 ›</span>
  393. </div>
  394. <div style="padding:8px 14px;">
  395. <div class="list-item" onclick="goto('screen-study-detail')">
  396. <div class="list-left">
  397. <div class="fw500 mb4">实验室安全基础知识</div>
  398. <div class="text-xs text-gray">生命科学学院下发 · <span style="color:var(--orange)">待完成</span></div>
  399. </div>
  400. <span style="font-size:16px;color:var(--text-hint)">›</span>
  401. </div>
  402. <div class="list-item" onclick="goto('screen-study-detail')">
  403. <div class="list-left">
  404. <div class="fw500 mb4">生物安全操作规范</div>
  405. <div class="text-xs text-gray">生命科学学院下发 · <span style="color:var(--orange)">待完成</span></div>
  406. </div>
  407. <span style="font-size:16px;color:var(--text-hint)">›</span>
  408. </div>
  409. </div>
  410. </div>
  411. <!-- 模拟考试 -->
  412. <div class="card" style="padding:0;overflow:hidden;">
  413. <div style="background:var(--gray-light);padding:10px 14px;display:flex;justify-content:space-between;align-items:center;">
  414. <div><span class="text-sm text-bold">📝 模拟考试 <span class="badge">1</span></span>
  415. <span class="text-xs text-gray" style="margin-left:6px;">待完成的模拟练习</span></div>
  416. <span onclick="goto('screen-exam-list');switchExTab(1);" style="font-size:12px;color:var(--blue);cursor:pointer;">更多 ›</span>
  417. </div>
  418. <div style="padding:8px 14px;">
  419. <div class="list-item" onclick="goto('screen-mock-detail')">
  420. <div class="list-left">
  421. <div class="fw500 mb4">新生入学安全知识模拟卷 A</div>
  422. <div class="text-xs text-gray">最高成绩: <span class="text-orange">60 分</span> &nbsp;·&nbsp; 及格: 70分</div>
  423. </div>
  424. <span style="font-size:16px;color:var(--text-hint)">›</span>
  425. </div>
  426. </div>
  427. </div>
  428. <!-- 培训活动 -->
  429. <div class="card" style="padding:0;overflow:hidden;background:linear-gradient(135deg,#fff0f6,#fff7e6);border:1px solid #ffadd2;">
  430. <div style="padding:10px 14px;border-bottom:1px solid #ffcce8;display:flex;justify-content:space-between;align-items:center;">
  431. <div><span class="text-sm text-bold" style="color:#c41d7f;">🎯 培训活动 <span class="badge" style="background:#eb2f96;">1</span></span>
  432. <span class="text-xs text-gray" style="margin-left:6px;">待完成的线下培训活动</span></div>
  433. <span onclick="goto('screen-knowledge-list')" style="font-size:12px;color:#c41d7f;cursor:pointer;">更多 ›</span>
  434. </div>
  435. <div style="padding:12px 14px;">
  436. <!-- 角色演示切换 -->
  437. <div style="display:flex;gap:6px;margin-bottom:10px;">
  438. <button onclick="setTrainingRole('student')" id="trole-student" style="font-size:11px;padding:3px 12px;border-radius:20px;border:1px solid #eb2f96;background:#eb2f96;color:#fff;cursor:pointer;">学员</button>
  439. <button onclick="setTrainingRole('teacher')" id="trole-teacher" style="font-size:11px;padding:3px 12px;border-radius:20px;border:1px solid #ffadd2;background:transparent;color:#c41d7f;cursor:pointer;">管理</button>
  440. </div>
  441. <div class="training-card" onclick="openTrainingDetail('active')" style="cursor:pointer;">
  442. <div class="row-between" style="align-items:flex-start;gap:8px;">
  443. <div style="flex:1;">
  444. <div class="fw500 mb4" style="font-size:14px;">2026年春季实验室安全知识讲座</div>
  445. <div class="text-xs text-gray">2026-03-01 &nbsp; 10:00 – 11:00</div>
  446. <div class="text-xs text-gray mt4">📍 学术报告厅 A201</div>
  447. <div class="text-xs text-gray mt4">🏢 组织单位:生命科学学院</div>
  448. </div>
  449. <!-- 学员:扫码签到按钮 -->
  450. <div id="training-student-qr" style="flex-shrink:0;display:flex;flex-direction:column;align-items:center;gap:4px;" onclick="event.stopPropagation()">
  451. <button onclick="openScanModal()" style="width:66px;height:66px;border-radius:10px;border:1.5px solid #eb2f96;background:#fff0f6;color:#c41d7f;cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;padding:0;">
  452. <span style="font-size:24px;line-height:1;">📷</span>
  453. <span style="font-size:10px;font-weight:500;">扫码签到</span>
  454. </button>
  455. <div class="text-xs fw500" id="trainingSignStatus" style="color:#fa8c16;text-align:center;">● 未签到</div>
  456. </div>
  457. <!-- 老师端:签到二维码 -->
  458. <div id="training-teacher-qr" style="flex-shrink:0;display:none;flex-direction:column;align-items:center;" onclick="event.stopPropagation()">
  459. <div onclick="openQrModal()" style="width:66px;height:66px;border-radius:10px;border:1.5px solid #ffadd2;background:#fff;padding:5px;cursor:pointer;position:relative;box-sizing:border-box;">
  460. <svg viewBox="0 0 21 21" width="54" height="54" xmlns="http://www.w3.org/2000/svg" shape-rendering="crispEdges" style="display:block;">
  461. <rect width="21" height="21" fill="#fff"/>
  462. <rect x="0" y="0" width="7" height="1" fill="#222"/><rect x="0" y="6" width="7" height="1" fill="#222"/>
  463. <rect x="0" y="1" width="1" height="5" fill="#222"/><rect x="6" y="1" width="1" height="5" fill="#222"/>
  464. <rect x="2" y="2" width="3" height="3" fill="#222"/>
  465. <rect x="14" y="0" width="7" height="1" fill="#222"/><rect x="14" y="6" width="7" height="1" fill="#222"/>
  466. <rect x="14" y="1" width="1" height="5" fill="#222"/><rect x="20" y="1" width="1" height="5" fill="#222"/>
  467. <rect x="16" y="2" width="3" height="3" fill="#222"/>
  468. <rect x="0" y="14" width="7" height="1" fill="#222"/><rect x="0" y="20" width="7" height="1" fill="#222"/>
  469. <rect x="0" y="15" width="1" height="5" fill="#222"/><rect x="6" y="15" width="1" height="5" fill="#222"/>
  470. <rect x="2" y="16" width="3" height="3" fill="#222"/>
  471. <rect x="8" y="6" width="1" height="1" fill="#222"/><rect x="10" y="6" width="1" height="1" fill="#222"/><rect x="12" y="6" width="1" height="1" fill="#222"/>
  472. <rect x="6" y="8" width="1" height="1" fill="#222"/><rect x="6" y="10" width="1" height="1" fill="#222"/><rect x="6" y="12" width="1" height="1" fill="#222"/>
  473. <rect x="8" y="0" width="1" height="1" fill="#222"/><rect x="10" y="0" width="1" height="1" fill="#222"/><rect x="12" y="0" width="1" height="1" fill="#222"/>
  474. <rect x="8" y="2" width="2" height="1" fill="#222"/><rect x="11" y="1" width="1" height="1" fill="#222"/><rect x="12" y="3" width="1" height="1" fill="#222"/>
  475. <rect x="8" y="8" width="2" height="2" fill="#222"/><rect x="11" y="8" width="1" height="1" fill="#222"/><rect x="13" y="9" width="2" height="1" fill="#222"/>
  476. <rect x="8" y="11" width="1" height="2" fill="#222"/><rect x="10" y="10" width="2" height="1" fill="#222"/><rect x="12" y="11" width="1" height="1" fill="#222"/>
  477. <rect x="9" y="13" width="2" height="1" fill="#222"/><rect x="8" y="14" width="1" height="1" fill="#222"/>
  478. <rect x="10" y="15" width="2" height="1" fill="#222"/><rect x="9" y="16" width="1" height="1" fill="#222"/>
  479. <rect x="11" y="17" width="2" height="1" fill="#222"/><rect x="8" y="18" width="1" height="2" fill="#222"/>
  480. <rect x="15" y="8" width="1" height="1" fill="#222"/><rect x="17" y="9" width="1" height="1" fill="#222"/>
  481. <rect x="19" y="8" width="1" height="2" fill="#222"/><rect x="15" y="11" width="2" height="1" fill="#222"/>
  482. <rect x="16" y="16" width="5" height="1" fill="#222"/><rect x="16" y="20" width="5" height="1" fill="#222"/>
  483. <rect x="16" y="17" width="1" height="3" fill="#222"/><rect x="20" y="17" width="1" height="3" fill="#222"/>
  484. <rect x="18" y="18" width="1" height="1" fill="#222"/>
  485. </svg>
  486. <div style="position:absolute;bottom:2px;left:0;right:0;text-align:center;font-size:8px;color:#c41d7f;">点击放大</div>
  487. </div>
  488. <div style="font-size:9px;color:#c41d7f;margin-top:3px;text-align:center;">签到二维码</div>
  489. <!-- 老师:签到人数统计(已移至培训详情页) -->
  490. </div>
  491. </div>
  492. </div>
  493. </div>
  494. </div>
  495. <!-- 在线考试 -->
  496. <div class="card" style="padding:0;overflow:hidden;">
  497. <div style="background:var(--gray-light);padding:10px 14px;display:flex;justify-content:space-between;align-items:center;">
  498. <div><span class="text-sm text-bold">🎓 在线考试</span>
  499. <span class="text-xs text-gray" style="margin-left:6px;">待完成的在线考试</span></div>
  500. <span onclick="goto('screen-exam-list');switchExTab(0);" style="font-size:12px;color:var(--blue);cursor:pointer;">更多 ›</span>
  501. </div>
  502. <div style="padding:8px 14px;">
  503. <!-- 新生入学考试 -->
  504. <div class="exam-task-card active-exam" onclick="goto('screen-exam-detail')">
  505. <div class="row-between mb8">
  506. <div class="row">
  507. <span class="tag tag-blue text-xs">新生入学考试</span>
  508. <span class="dot dot-orange" style="margin-left:6px;"></span>
  509. <span class="text-xs text-orange" style="margin-left:2px;">进行中</span>
  510. </div>
  511. <span style="font-size:16px;color:var(--blue)">›</span>
  512. </div>
  513. <div class="text-sm fw500 mb8">2025级新生实验室安全入学考试</div>
  514. <div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:6px;">
  515. <div style="background:var(--white);border-radius:6px;padding:6px 8px;border:1px solid var(--gray-border);">
  516. <div class="text-xs text-gray mb4">学时要求</div>
  517. <div class="text-xs fw500">6/8 学时 <span class="text-orange">未达标</span></div>
  518. </div>
  519. <div style="background:var(--white);border-radius:6px;padding:6px 8px;border:1px solid var(--gray-border);">
  520. <div class="text-xs text-gray mb4">学习任务</div>
  521. <div class="text-xs fw500 text-orange">待完成</div>
  522. </div>
  523. <div style="background:var(--white);border-radius:6px;padding:6px 8px;border:1px solid var(--gray-border);">
  524. <div class="text-xs text-gray mb4">模拟考试</div>
  525. <div class="text-xs fw500 text-orange">待完成</div>
  526. </div>
  527. </div>
  528. </div>
  529. <!-- 应知应会考试 -->
  530. <div class="exam-task-card" onclick="goto('screen-exam-detail')">
  531. <div class="row-between mb8">
  532. <div class="row">
  533. <span class="tag tag-orange text-xs">应知应会考试</span>
  534. <span class="dot dot-orange" style="margin-left:6px;"></span>
  535. <span class="text-xs text-orange" style="margin-left:2px;">进行中</span>
  536. </div>
  537. <span style="font-size:16px;color:var(--text-hint)">›</span>
  538. </div>
  539. <div class="text-sm fw500 mb8">2025-2026学年应知应会安全考试</div>
  540. <div style="display:grid;grid-template-columns:1fr 1fr;gap:6px;">
  541. <div style="background:var(--gray-light);border-radius:6px;padding:6px 8px;">
  542. <div class="text-xs text-gray mb4">学时要求</div>
  543. <div class="text-xs fw500">无</div>
  544. </div>
  545. <div style="background:var(--gray-light);border-radius:6px;padding:6px 8px;">
  546. <div class="text-xs text-gray mb4">考试状态</div>
  547. <div class="text-xs fw500 text-gray">待确认</div>
  548. </div>
  549. </div>
  550. </div>
  551. </div>
  552. </div>
  553. </div><!-- end section-top -->
  554. </div><!-- end scroll-content -->
  555. <!-- 线下培训历史记录弹窗 -->
  556. <div id="modal-training-history" style="display:none;position:fixed;inset:0;z-index:600;background:rgba(0,0,0,.5);flex-direction:column;justify-content:flex-end;" onclick="if(event.target===this)hideTrainingHistory()">
  557. <div style="background:var(--white);border-radius:16px 16px 0 0;max-height:75vh;display:flex;flex-direction:column;animation:slideUp .25s ease;">
  558. <div style="display:flex;align-items:center;justify-content:space-between;padding:16px 16px 12px;border-bottom:1px solid var(--gray-border);flex-shrink:0;">
  559. <span style="font-size:16px;font-weight:700;">历史培训记录</span>
  560. <span onclick="hideTrainingHistory()" style="font-size:22px;color:var(--text-hint);cursor:pointer;line-height:1;">×</span>
  561. </div>
  562. <div style="overflow-y:auto;padding:12px;">
  563. <!-- 历史记录:已完成 -->
  564. <div class="card" onclick="openTrainingDetail('done')" style="margin:0 0 10px;cursor:pointer;padding:0;overflow:hidden;">
  565. <div style="width:100%;height:80px;background:linear-gradient(135deg,#95de64,#52c41a);display:flex;align-items:center;justify-content:center;font-size:32px;">🧯</div>
  566. <div style="padding:10px 12px;">
  567. <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:6px;">
  568. <span class="fw500">2025年秋季消防安全知识培训</span>
  569. <span style="font-size:11px;background:#f6ffed;color:#52c41a;border:1px solid #b7eb8f;border-radius:10px;padding:2px 8px;flex-shrink:0;">已完成</span>
  570. </div>
  571. <div class="text-xs text-gray mb4">2025-10-20 &nbsp; 09:00 – 10:30</div>
  572. <div class="text-xs text-gray mb4">📍 综合楼报告厅</div>
  573. <div style="display:flex;align-items:center;justify-content:space-between;">
  574. <div class="text-xs text-gray">🏢 生命科学学院</div>
  575. <span style="font-size:12px;color:#52c41a;font-weight:500;">✅ 已签到</span>
  576. </div>
  577. </div>
  578. </div>
  579. <!-- 历史记录:已结束未签到 -->
  580. <div class="card" style="margin:0;padding:0;overflow:hidden;opacity:.75;">
  581. <div style="width:100%;height:80px;background:linear-gradient(135deg,#d9d9d9,#bfbfbf);display:flex;align-items:center;justify-content:center;font-size:32px;">🔬</div>
  582. <div style="padding:10px 12px;">
  583. <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:6px;">
  584. <span class="fw500" style="color:#595959;">2025年春季实验室安全知识讲座</span>
  585. <span style="font-size:11px;background:#f5f5f5;color:#999;border:1px solid #d9d9d9;border-radius:10px;padding:2px 8px;flex-shrink:0;">已结束</span>
  586. </div>
  587. <div class="text-xs text-gray mb4">2025-03-10 &nbsp; 10:00 – 11:00</div>
  588. <div class="text-xs text-gray mb4">📍 学术报告厅 A201</div>
  589. <div style="display:flex;align-items:center;justify-content:space-between;">
  590. <div class="text-xs text-gray">🏢 生命科学学院</div>
  591. <span style="font-size:12px;color:#ff4d4f;font-weight:500;">❌ 未签到</span>
  592. </div>
  593. </div>
  594. </div>
  595. </div>
  596. </div>
  597. </div>
  598. <!-- 毕业报告弹窗 -->
  599. <div id="reportModal" style="display:none;position:fixed;inset:0;z-index:600;background:rgba(0,0,0,.7);flex-direction:column;">
  600. <!-- 顶部工具栏 -->
  601. <div style="display:flex;align-items:center;justify-content:space-between;padding:12px 16px;background:rgba(10,18,40,.95);flex-shrink:0;">
  602. <span style="color:#fff;font-size:15px;font-weight:600;">📄 毕业报告</span>
  603. <div style="display:flex;gap:10px;align-items:center;">
  604. <button onclick="downloadReport()" style="display:flex;align-items:center;gap:5px;background:var(--blue);color:#fff;border:none;border-radius:8px;padding:7px 14px;font-size:13px;font-weight:600;cursor:pointer;">
  605. ⬇ 保存下载
  606. </button>
  607. <button onclick="closeReportModal()" style="width:32px;height:32px;border-radius:50%;background:rgba(255,255,255,.15);border:none;color:#fff;font-size:18px;cursor:pointer;display:flex;align-items:center;justify-content:center;">✕</button>
  608. </div>
  609. </div>
  610. <!-- 图片区域 -->
  611. <div style="flex:1;overflow:auto;display:flex;align-items:flex-start;justify-content:center;padding:16px;">
  612. <img id="reportImg" src="img/毕业报告.png" alt="毕业报告"
  613. style="max-width:100%;border-radius:10px;box-shadow:0 8px 40px rgba(0,0,0,.5);"
  614. onerror="this.style.display='none';document.getElementById('reportImgFallback').style.display='flex';">
  615. <div id="reportImgFallback" style="display:none;flex-direction:column;align-items:center;justify-content:center;min-height:300px;color:rgba(255,255,255,.5);text-align:center;gap:12px;">
  616. <div style="font-size:56px;">📋</div>
  617. <div style="font-size:14px;">毕业报告.png</div>
  618. <div style="font-size:12px;opacity:.6;">图片文件未找到</div>
  619. </div>
  620. </div>
  621. </div>
  622. <!-- 扫一扫签到弹窗 -->
  623. <div id="scanModal" style="display:none;position:fixed;inset:0;z-index:700;background:rgba(0,0,0,.9);flex-direction:column;align-items:center;justify-content:center;">
  624. <div style="position:absolute;top:0;left:0;right:0;padding:16px 16px 0;display:flex;align-items:center;justify-content:space-between;">
  625. <span style="color:#fff;font-size:16px;font-weight:600;">扫一扫</span>
  626. <button onclick="closeScanModal()" style="width:32px;height:32px;border-radius:50%;background:rgba(255,255,255,.15);border:none;color:#fff;font-size:18px;cursor:pointer;display:flex;align-items:center;justify-content:center;">✕</button>
  627. </div>
  628. <div style="position:relative;width:240px;height:240px;margin-bottom:24px;">
  629. <div style="position:absolute;top:0;left:0;width:28px;height:28px;border-top:3px solid #eb2f96;border-left:3px solid #eb2f96;border-radius:4px 0 0 0;"></div>
  630. <div style="position:absolute;top:0;right:0;width:28px;height:28px;border-top:3px solid #eb2f96;border-right:3px solid #eb2f96;border-radius:0 4px 0 0;"></div>
  631. <div style="position:absolute;bottom:0;left:0;width:28px;height:28px;border-bottom:3px solid #eb2f96;border-left:3px solid #eb2f96;border-radius:0 0 0 4px;"></div>
  632. <div style="position:absolute;bottom:0;right:0;width:28px;height:28px;border-bottom:3px solid #eb2f96;border-right:3px solid #eb2f96;border-radius:0 0 4px 0;"></div>
  633. <div id="scanLine" style="position:absolute;left:4px;right:4px;height:2px;background:linear-gradient(90deg,transparent,#eb2f96,transparent);top:0;animation:scanAnim 1.8s linear infinite;"></div>
  634. <div onclick="completeScan()" style="position:absolute;inset:0;cursor:pointer;display:flex;align-items:center;justify-content:center;">
  635. <span style="color:rgba(255,255,255,.25);font-size:11px;">点击模拟扫码</span>
  636. </div>
  637. </div>
  638. <div style="color:rgba(255,255,255,.6);font-size:14px;text-align:center;">对准签到二维码进行扫描</div>
  639. </div>
  640. <!-- 绑定实验室弹窗 -->
  641. <div id="bindLabModal" style="display:flex;position:fixed;inset:0;z-index:800;background:rgba(0,0,0,.5);align-items:center;justify-content:center;padding:16px;">
  642. <div style="background:#fff;border-radius:12px;width:100%;max-width:420px;max-height:90vh;overflow-y:auto;box-shadow:0 8px 32px rgba(0,0,0,.18);">
  643. <!-- 标题栏 -->
  644. <div style="display:flex;align-items:center;justify-content:space-between;padding:16px 20px 12px;">
  645. <span style="font-size:17px;font-weight:700;color:#1a1a1a;">绑定实验室</span>
  646. <span onclick="closeBindLabModal()" style="font-size:20px;color:#999;cursor:pointer;line-height:1;">×</span>
  647. </div>
  648. <div style="padding:0 20px 16px;">
  649. <!-- 搜索框 -->
  650. <div style="position:relative;margin-bottom:8px;">
  651. <input id="bindLabSearch" type="text" placeholder="输入实验室名称、房号或楼栋关键词搜索…"
  652. oninput="onBindLabSearch(this.value)"
  653. style="width:100%;box-sizing:border-box;padding:10px 36px 10px 12px;border:1px solid #d9d9d9;border-radius:8px;font-size:13px;color:#333;outline:none;background:#fafafa;" />
  654. <span style="position:absolute;right:10px;top:50%;transform:translateY(-50%);color:#bbb;font-size:15px;pointer-events:none;">⌄</span>
  655. </div>
  656. <!-- 搜索提示 -->
  657. <div style="font-size:11px;color:#1677ff;margin-bottom:12px;line-height:1.5;">
  658. 此处请选择需要后续进入的科研实验室的名称,输入实验室名称、房号或楼栋关键词,再从检索结果中选择目标实验室。
  659. </div>
  660. <!-- 搜索结果下拉 -->
  661. <div id="bindLabDropdown" style="display:none;border:1px solid #e8e8e8;border-radius:8px;margin-bottom:12px;overflow:hidden;background:#fff;box-shadow:0 2px 8px rgba(0,0,0,.08);">
  662. <div class="bind-lab-option" onclick="selectLab(0)" style="padding:10px 14px;font-size:13px;color:#333;cursor:pointer;border-bottom:1px solid #f0f0f0;">化学与化工学院-有机化学实验室(A301)-理学楼A栋3层</div>
  663. <div class="bind-lab-option" onclick="selectLab(1)" style="padding:10px 14px;font-size:13px;color:#333;cursor:pointer;border-bottom:1px solid #f0f0f0;">生命科学学院-细胞生物学实验室(B202)-生命楼B栋2层</div>
  664. <div class="bind-lab-option" onclick="selectLab(2)" style="padding:10px 14px;font-size:13px;color:#333;cursor:pointer;">机电工程学院-机械加工实验室(C105)-工程楼C栋1层</div>
  665. </div>
  666. <!-- 实验室信息表格 -->
  667. <div id="bindLabInfo" style="display:none;border:1px solid #e8e8e8;border-radius:8px;overflow:hidden;margin-bottom:14px;">
  668. <table style="width:100%;border-collapse:collapse;font-size:12px;">
  669. <tr style="border-bottom:1px solid #f0f0f0;">
  670. <td style="padding:9px 12px;color:#888;background:#fafafa;width:28%;white-space:nowrap;">实验室名称</td>
  671. <td id="blab-name" style="padding:9px 12px;color:#333;font-weight:500;"></td>
  672. <td style="padding:9px 12px;color:#888;background:#fafafa;width:24%;white-space:nowrap;">所在位置</td>
  673. <td id="blab-loc" style="padding:9px 12px;color:#333;font-weight:700;"></td>
  674. </tr>
  675. <tr style="border-bottom:1px solid #f0f0f0;">
  676. <td style="padding:9px 12px;color:#888;background:#fafafa;">负责人</td>
  677. <td id="blab-head" style="padding:9px 12px;color:#333;"></td>
  678. <td style="padding:9px 12px;color:#888;background:#fafafa;">所属单位</td>
  679. <td id="blab-dept" style="padding:9px 12px;color:#333;"></td>
  680. </tr>
  681. <tr style="border-bottom:1px solid #f0f0f0;">
  682. <td style="padding:9px 12px;color:#888;background:#fafafa;">安全分级</td>
  683. <td id="blab-level" style="padding:9px 12px;"></td>
  684. <td style="padding:9px 12px;color:#888;background:#fafafa;">安全分类</td>
  685. <td id="blab-cat" style="padding:9px 12px;color:#333;"></td>
  686. </tr>
  687. <tr>
  688. <td style="padding:9px 12px;color:#888;background:#fafafa;">实验室类型</td>
  689. <td id="blab-type" style="padding:9px 12px;color:#333;" colspan="3"></td>
  690. </tr>
  691. </table>
  692. </div>
  693. <!-- 无需进入实验室 -->
  694. <div style="background:#f6f8ff;border-radius:8px;padding:12px 14px;margin-bottom:14px;">
  695. <label style="display:flex;align-items:flex-start;gap:8px;cursor:pointer;">
  696. <input type="checkbox" id="bindNoLabCheck" style="margin-top:2px;accent-color:#1677ff;flex-shrink:0;" />
  697. <span style="font-size:13px;font-weight:600;color:#1a1a1a;">无需进入实验室</span>
  698. </label>
  699. <div style="font-size:11px;color:#888;margin-top:5px;line-height:1.6;padding-left:20px;">
  700. 人文、体育等相关学院,无需进入实验室的新研究生可选择此项,选择后学时要求为4小时,需通过应知应会考试。
  701. </div>
  702. </div>
  703. <!-- 阅读协议 -->
  704. <label style="display:flex;align-items:center;gap:8px;cursor:pointer;margin-bottom:18px;">
  705. <input type="checkbox" id="bindAgreeCheck" style="accent-color:#1677ff;flex-shrink:0;" />
  706. <span style="font-size:12px;color:#555;">我已阅读并同意<span style="color:#1677ff;font-weight:500;">《新生绑定实验室须知及责任说明》</span></span>
  707. </label>
  708. <!-- 底部按钮 -->
  709. <div style="display:flex;gap:10px;justify-content:flex-end;">
  710. <button onclick="closeBindLabModal()" style="padding:8px 22px;border-radius:6px;border:1px solid #d9d9d9;background:#fff;color:#555;font-size:13px;cursor:pointer;">取消</button>
  711. <button onclick="confirmBindLab()" style="padding:8px 22px;border-radius:6px;border:none;background:#1677ff;color:#fff;font-size:13px;font-weight:600;cursor:pointer;">确认绑定</button>
  712. </div>
  713. </div>
  714. </div>
  715. </div>
  716. <!-- QR放大弹窗(老师端)-->
  717. <div id="qrModal" style="display:none;position:fixed;inset:0;z-index:700;background:rgba(0,0,0,.88);flex-direction:column;align-items:center;justify-content:center;">
  718. <div style="position:absolute;top:16px;left:0;right:0;padding:0 16px;display:flex;align-items:center;justify-content:space-between;">
  719. <span style="color:#fff;font-size:15px;font-weight:600;">📱 签到二维码</span>
  720. <button onclick="closeQrModal()" style="width:32px;height:32px;border-radius:50%;background:rgba(255,255,255,.15);border:none;color:#fff;font-size:18px;cursor:pointer;display:flex;align-items:center;justify-content:center;">✕</button>
  721. </div>
  722. <div style="background:#fff;border-radius:16px;padding:20px 24px;display:flex;flex-direction:column;align-items:center;gap:10px;">
  723. <svg viewBox="0 0 21 21" width="220" height="220" xmlns="http://www.w3.org/2000/svg" shape-rendering="crispEdges">
  724. <rect width="21" height="21" fill="#fff"/>
  725. <rect x="0" y="0" width="7" height="1" fill="#222"/><rect x="0" y="6" width="7" height="1" fill="#222"/>
  726. <rect x="0" y="1" width="1" height="5" fill="#222"/><rect x="6" y="1" width="1" height="5" fill="#222"/>
  727. <rect x="2" y="2" width="3" height="3" fill="#222"/>
  728. <rect x="14" y="0" width="7" height="1" fill="#222"/><rect x="14" y="6" width="7" height="1" fill="#222"/>
  729. <rect x="14" y="1" width="1" height="5" fill="#222"/><rect x="20" y="1" width="1" height="5" fill="#222"/>
  730. <rect x="16" y="2" width="3" height="3" fill="#222"/>
  731. <rect x="0" y="14" width="7" height="1" fill="#222"/><rect x="0" y="20" width="7" height="1" fill="#222"/>
  732. <rect x="0" y="15" width="1" height="5" fill="#222"/><rect x="6" y="15" width="1" height="5" fill="#222"/>
  733. <rect x="2" y="16" width="3" height="3" fill="#222"/>
  734. <rect x="8" y="6" width="1" height="1" fill="#222"/><rect x="10" y="6" width="1" height="1" fill="#222"/><rect x="12" y="6" width="1" height="1" fill="#222"/>
  735. <rect x="6" y="8" width="1" height="1" fill="#222"/><rect x="6" y="10" width="1" height="1" fill="#222"/><rect x="6" y="12" width="1" height="1" fill="#222"/>
  736. <rect x="8" y="0" width="1" height="1" fill="#222"/><rect x="10" y="0" width="1" height="1" fill="#222"/><rect x="12" y="0" width="1" height="1" fill="#222"/>
  737. <rect x="8" y="2" width="2" height="1" fill="#222"/><rect x="11" y="1" width="1" height="1" fill="#222"/><rect x="12" y="3" width="1" height="1" fill="#222"/>
  738. <rect x="8" y="8" width="2" height="2" fill="#222"/><rect x="11" y="8" width="1" height="1" fill="#222"/><rect x="13" y="9" width="2" height="1" fill="#222"/>
  739. <rect x="8" y="11" width="1" height="2" fill="#222"/><rect x="10" y="10" width="2" height="1" fill="#222"/><rect x="12" y="11" width="1" height="1" fill="#222"/>
  740. <rect x="9" y="13" width="2" height="1" fill="#222"/><rect x="8" y="14" width="1" height="1" fill="#222"/>
  741. <rect x="10" y="15" width="2" height="1" fill="#222"/><rect x="9" y="16" width="1" height="1" fill="#222"/>
  742. <rect x="11" y="17" width="2" height="1" fill="#222"/><rect x="8" y="18" width="1" height="2" fill="#222"/>
  743. <rect x="15" y="8" width="1" height="1" fill="#222"/><rect x="17" y="9" width="1" height="1" fill="#222"/>
  744. <rect x="19" y="8" width="1" height="2" fill="#222"/><rect x="15" y="11" width="2" height="1" fill="#222"/>
  745. <rect x="16" y="16" width="5" height="1" fill="#222"/><rect x="16" y="20" width="5" height="1" fill="#222"/>
  746. <rect x="16" y="17" width="1" height="3" fill="#222"/><rect x="20" y="17" width="1" height="3" fill="#222"/>
  747. <rect x="18" y="18" width="1" height="1" fill="#222"/>
  748. </svg>
  749. <div style="font-size:14px;color:#333;font-weight:600;">请学员扫码签到</div>
  750. <div style="font-size:12px;color:#999;">2026年春季实验室安全知识讲座</div>
  751. </div>
  752. </div>
  753. <!-- 底部导航 -->
  754. <div class="bottom-tab">
  755. <div class="tab-item active">
  756. <span class="tab-icon">🏠</span>
  757. <span>工作台</span>
  758. </div>
  759. <div class="tab-item">
  760. <span class="tab-icon">📚</span>
  761. <span>学习培训</span>
  762. </div>
  763. <div class="tab-item">
  764. <span class="tab-icon">🎓</span>
  765. <span>在线考试</span>
  766. </div>
  767. <div class="tab-item">
  768. <span class="tab-icon">✏️</span>
  769. <span>刷题练习</span>
  770. </div>
  771. </div>
  772. </div>
  773. <!-- SCREEN: 知识学习详情 -->
  774. <div class='screen' id='screen-knowledge-detail'>
  775. <div class='topbar'>
  776. <div class='topbar-back' onclick='goBack()'>&#8249; 返回</div>
  777. <div class='topbar-title'>知识学习</div>
  778. <div></div>
  779. </div>
  780. <div class='scroll-content'>
  781. <div class='card' style='margin-top:12px;'>
  782. <div class='chip-row mb8'>
  783. <span class='tag tag-blue text-xs'>文档课件</span>
  784. <span class='tag tag-orange text-xs'>学习中</span>
  785. </div>
  786. <div style='font-size:17px;font-weight:700;margin-bottom:8px;'>实验室生物安全防护规范</div>
  787. <div class='text-xs text-gray mb12'>知识点:生物类安全 | 要求时长:20分钟 | 可获:1学时 + 3积分</div>
  788. <div class='row-between mb4'><span class='text-sm text-gray'>学习进度</span><span class='text-blue fw500'>55%</span></div>
  789. <div class='progress-wrap mb12'><div class='progress-bar' style='width:55%'></div></div>
  790. <div class='material-viewer'><div style='text-align:center;'><div style='font-size:48px;margin-bottom:8px;'>&#x1F4C4;</div><div style='font-size:14px;color:var(--text-hint);'>生物安全防护规范.PDF</div><div class='text-xs text-gray mt4'>第2页 / 共18页</div></div></div>
  791. <div style='display:flex;gap:8px;'>
  792. <button class='btn btn-primary' style='flex:1;'>继续学习</button>
  793. <button class='btn btn-outline btn-sm' onclick='goto("screen-posttest")'>课后考核</button>
  794. </div>
  795. </div>
  796. </div>
  797. </div>
  798. <!-- SCREEN: 在线考试(底部Tab根页面) -->
  799. <div class="screen" id="screen-exam-list">
  800. <div style="background:var(--white);border-bottom:1px solid var(--gray-border);flex-shrink:0;">
  801. <div class="topbar" style="border-bottom:none;">
  802. <div style="visibility:hidden;width:40px;"></div>
  803. <div class="topbar-title">在线考试</div>
  804. <div></div>
  805. </div>
  806. <!-- 3个子Tab -->
  807. <div style="display:flex;padding:0 4px;">
  808. <div id="extab-0" onclick="switchExTab(0)" style="flex:1;text-align:center;padding:9px 4px 8px;font-size:13px;font-weight:600;color:#1677ff;border-bottom:2px solid #1677ff;cursor:pointer;">考试任务</div>
  809. <div id="extab-1" onclick="switchExTab(1)" style="flex:1;text-align:center;padding:9px 4px 8px;font-size:13px;color:#888;border-bottom:2px solid transparent;cursor:pointer;">模拟考试</div>
  810. <div id="extab-2" onclick="switchExTab(2)" style="flex:1;text-align:center;padding:9px 4px 8px;font-size:13px;color:#888;border-bottom:2px solid transparent;cursor:pointer;">我的成绩</div>
  811. </div>
  812. </div>
  813. <div class="scroll-content">
  814. <!-- 考试任务 -->
  815. <div id="expanel-0" style="padding:12px;">
  816. <!-- 新生入学考试 -->
  817. <div class="card" style="margin:0 0 10px;cursor:pointer;" onclick="goto('screen-exam-detail')">
  818. <div class="row-between mb8">
  819. <div class="row">
  820. <span class="tag tag-blue text-xs">新生入学考试</span>
  821. <span class="dot dot-orange" style="margin-left:6px;"></span>
  822. <span class="text-xs text-orange" style="margin-left:2px;">进行中</span>
  823. </div>
  824. <span style="font-size:16px;color:var(--blue)">›</span>
  825. </div>
  826. <div class="text-sm fw500 mb8">2025级新生实验室安全入学考试</div>
  827. <div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:6px;">
  828. <div style="background:var(--gray-light);border-radius:6px;padding:6px 8px;">
  829. <div class="text-xs text-gray mb4">学时要求</div>
  830. <div class="text-xs fw500">6/8 <span class="text-orange">未达标</span></div>
  831. </div>
  832. <div style="background:var(--gray-light);border-radius:6px;padding:6px 8px;">
  833. <div class="text-xs text-gray mb4">学习任务</div>
  834. <div class="text-xs fw500 text-orange">待完成</div>
  835. </div>
  836. <div style="background:var(--gray-light);border-radius:6px;padding:6px 8px;">
  837. <div class="text-xs text-gray mb4">模拟考试</div>
  838. <div class="text-xs fw500 text-orange">待完成</div>
  839. </div>
  840. </div>
  841. </div>
  842. <!-- 应知应会考试 -->
  843. <div class="card" style="margin:0 0 10px;cursor:pointer;" onclick="goto('screen-exam-detail')">
  844. <div class="row-between mb8">
  845. <div class="row">
  846. <span class="tag tag-orange text-xs">应知应会考试</span>
  847. <span class="dot dot-orange" style="margin-left:6px;"></span>
  848. <span class="text-xs text-orange" style="margin-left:2px;">进行中</span>
  849. </div>
  850. <span style="font-size:16px;color:var(--text-hint)">›</span>
  851. </div>
  852. <div class="text-sm fw500 mb8">2025-2026学年应知应会安全考试</div>
  853. <div style="display:grid;grid-template-columns:1fr 1fr;gap:6px;">
  854. <div style="background:var(--gray-light);border-radius:6px;padding:6px 8px;">
  855. <div class="text-xs text-gray mb4">满分/及格</div>
  856. <div class="text-xs fw500">100 / 70 分</div>
  857. </div>
  858. <div style="background:var(--gray-light);border-radius:6px;padding:6px 8px;">
  859. <div class="text-xs text-gray mb4">可考次数</div>
  860. <div class="text-xs fw500 text-gray">3 次</div>
  861. </div>
  862. </div>
  863. </div>
  864. <!-- 常规考试 -->
  865. <div class="card" style="margin:0;cursor:pointer;" onclick="goto('screen-regular-exam-detail')">
  866. <div class="row-between mb8">
  867. <div class="row">
  868. <span class="tag tag-blue text-xs" style="background:#e6f4ff;color:#0958d9;border-color:#91caff;">常规考试</span>
  869. <span class="dot dot-gray" style="margin-left:6px;"></span>
  870. <span class="text-xs text-gray" style="margin-left:2px;">未开始</span>
  871. </div>
  872. <span style="font-size:16px;color:var(--text-hint)">›</span>
  873. </div>
  874. <div class="text-sm fw500 mb8">2025-2026学年实验室安全常规考试</div>
  875. <div style="display:grid;grid-template-columns:1fr 1fr;gap:6px;">
  876. <div style="background:var(--gray-light);border-radius:6px;padding:6px 8px;">
  877. <div class="text-xs text-gray mb4">满分/及格</div>
  878. <div class="text-xs fw500">100 / 60 分</div>
  879. </div>
  880. <div style="background:var(--gray-light);border-radius:6px;padding:6px 8px;">
  881. <div class="text-xs text-gray mb4">可考次数</div>
  882. <div class="text-xs fw500 text-gray">2 次</div>
  883. </div>
  884. </div>
  885. </div>
  886. </div>
  887. <!-- 模拟考试 -->
  888. <div id="expanel-1" style="display:none;padding:12px;">
  889. <div class="card" style="margin:0 0 10px;cursor:pointer;" onclick="goto('screen-mock-detail')">
  890. <div class="row-between mb8">
  891. <div class="row">
  892. <span class="tag tag-blue text-xs">新生入学考试</span>
  893. <span class="tag tag-orange text-xs" style="margin-left:4px;">模拟卷</span>
  894. </div>
  895. <span style="font-size:16px;color:var(--text-hint)">›</span>
  896. </div>
  897. <div class="text-sm fw500 mb4">新生入学安全知识模拟卷 A</div>
  898. <div class="row-between text-xs text-gray">
  899. <span>最高成绩: <span class="text-orange fw500">60 分</span></span>
  900. <span>及格线: 70 分</span>
  901. </div>
  902. </div>
  903. <div class="card" style="margin:0;cursor:pointer;" onclick="goto('screen-mock-detail')">
  904. <div class="row-between mb8">
  905. <div class="row">
  906. <span class="tag tag-blue text-xs">新生入学考试</span>
  907. <span class="tag tag-orange text-xs" style="margin-left:4px;">模拟卷</span>
  908. </div>
  909. <span style="font-size:16px;color:var(--text-hint)">›</span>
  910. </div>
  911. <div class="text-sm fw500 mb4">新生入学安全知识模拟卷 B</div>
  912. <div class="row-between text-xs text-gray">
  913. <span>最高成绩: <span class="text-green fw500">75 分</span></span>
  914. <span>及格线: 70 分</span>
  915. </div>
  916. </div>
  917. </div>
  918. <!-- 我的成绩 -->
  919. <div id="expanel-2" style="display:none;">
  920. <div class="filter-row">
  921. <select class="form-input form-select" style="width:auto;padding:6px 28px 6px 10px;font-size:13px;">
  922. <option>全部</option><option>通过</option><option>未通过</option>
  923. </select>
  924. <input type="date" class="form-input" style="width:120px;padding:6px 8px;font-size:12px;" value="2025-09-01">
  925. <span class="text-xs text-gray">至</span>
  926. <input type="date" class="form-input" style="width:120px;padding:6px 8px;font-size:12px;" value="2026-07-01">
  927. </div>
  928. <div class="tag-scroll" style="padding-top:10px;">
  929. <span class="tag tag-gray active" onclick="setKnowTag(this)">全部</span>
  930. <span class="tag tag-gray" onclick="setKnowTag(this)">新生入学</span>
  931. <span class="tag tag-gray" onclick="setKnowTag(this)">应知应会</span>
  932. <span class="tag tag-gray" onclick="setKnowTag(this)">分级分类</span>
  933. <span class="tag tag-gray" onclick="setKnowTag(this)">负面清单</span>
  934. </div>
  935. <div style="padding:8px 12px;">
  936. <div class="score-card" style="cursor:pointer;" onclick="goto('screen-score-detail')">
  937. <div class="row-between mb8">
  938. <span class="tag tag-blue text-xs">新生入学考试</span>
  939. <span class="score-result-pass">通过</span>
  940. </div>
  941. <div style="font-size:15px;font-weight:700;margin-bottom:8px;">2025级新生实验室安全入学考试</div>
  942. <div style="display:grid;grid-template-columns:1fr 1fr;gap:6px;margin-bottom:10px;font-size:13px;">
  943. <div><span class="text-gray">考试时间:</span>2026-01-10</div>
  944. <div><span class="text-gray">时长:</span>90 分钟</div>
  945. <div><span class="text-gray">满分/及格:</span>100 / 70</div>
  946. <div><span class="text-gray">考次:</span>2 / 3</div>
  947. <div><span class="text-gray">用时:</span>37分22秒</div>
  948. <div><span class="text-gray">最高成绩:</span><span class="text-blue fw500">78 分</span></div>
  949. <div><span class="text-gray">获得积分:</span><span class="text-orange fw500">+15分</span></div>
  950. <div><span class="text-gray">考试结果:</span><span class="text-green fw500">通过</span></div>
  951. </div>
  952. <div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:6px;margin-bottom:10px;">
  953. <div style="background:var(--gray-light);border-radius:6px;padding:6px 8px;">
  954. <div class="text-xs text-gray mb4">完成学时</div>
  955. <div class="text-xs fw500 text-green">24 学时</div>
  956. </div>
  957. <div style="background:var(--gray-light);border-radius:6px;padding:6px 8px;">
  958. <div class="text-xs text-gray mb4">完成学习</div>
  959. <div class="text-xs fw500 text-green">已完成</div>
  960. </div>
  961. <div style="background:var(--gray-light);border-radius:6px;padding:6px 8px;">
  962. <div class="text-xs text-gray mb4">模拟得分</div>
  963. <div class="text-xs fw500 text-blue">92 分</div>
  964. </div>
  965. </div>
  966. <div style="display:flex;gap:8px;">
  967. <button class="btn btn-sm" style="background:#fff7e6;color:#d46b08;border:1px solid #ffd591;border-radius:6px;font-size:12px;padding:5px 10px;cursor:pointer;" onclick="goto('screen-certs')">查看证书</button>
  968. </div>
  969. </div>
  970. <div class="score-card" style="cursor:pointer;" onclick="goto('screen-score-detail')">
  971. <div class="row-between mb8">
  972. <span class="tag tag-orange text-xs">应知应会考试</span>
  973. <span class="score-result-fail">未通过</span>
  974. </div>
  975. <div style="font-size:15px;font-weight:700;margin-bottom:8px;">2024-2025学年应知应会安全考试</div>
  976. <div style="display:grid;grid-template-columns:1fr 1fr;gap:6px;margin-bottom:10px;font-size:13px;">
  977. <div><span class="text-gray">考试时间:</span>2025-06-05</div>
  978. <div><span class="text-gray">时长:</span>60 分钟</div>
  979. <div><span class="text-gray">满分/及格:</span>100 / 70</div>
  980. <div><span class="text-gray">考次:</span>3 / 3</div>
  981. <div><span class="text-gray">用时:</span>52分08秒</div>
  982. <div><span class="text-gray">最高成绩:</span><span class="text-red fw500">65 分</span></div>
  983. <div><span class="text-gray">获得积分:</span><span class="text-gray">无</span></div>
  984. <div><span class="text-gray">考试结果:</span><span class="text-red fw500">未通过</span></div>
  985. </div>
  986. <div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:6px;margin-bottom:10px;">
  987. <div style="background:var(--gray-light);border-radius:6px;padding:6px 8px;">
  988. <div class="text-xs text-gray mb4">完成学时</div>
  989. <div class="text-xs fw500 text-orange">12/16 学时</div>
  990. </div>
  991. <div style="background:var(--gray-light);border-radius:6px;padding:6px 8px;">
  992. <div class="text-xs text-gray mb4">完成学习</div>
  993. <div class="text-xs fw500 text-green">已完成</div>
  994. </div>
  995. <div style="background:var(--gray-light);border-radius:6px;padding:6px 8px;">
  996. <div class="text-xs text-gray mb4">模拟得分</div>
  997. <div class="text-xs fw500 text-orange">58 分</div>
  998. </div>
  999. </div>
  1000. </div>
  1001. </div>
  1002. </div>
  1003. </div>
  1004. <div class="bottom-tab">
  1005. <div class="tab-item"><span class="tab-icon">🏠</span><span>工作台</span></div>
  1006. <div class="tab-item"><span class="tab-icon">📚</span><span>学习培训</span></div>
  1007. <div class="tab-item active"><span class="tab-icon">🎓</span><span>在线考试</span></div>
  1008. <div class="tab-item"><span class="tab-icon">✏️</span><span>刷题练习</span></div>
  1009. </div>
  1010. </div>
  1011. <!-- SCREEN: 我的 -->
  1012. <div class="screen" id="screen-my">
  1013. <div class="topbar">
  1014. <div class="topbar-title" style="display:flex;align-items:center;gap:6px;"><span>👤</span> 我的</div>
  1015. <div></div>
  1016. </div>
  1017. <div class="scroll-content">
  1018. <div style="background:linear-gradient(135deg,#1677ff 0%,#0958d9 100%);padding:24px 20px 20px;">
  1019. <div style="display:flex;align-items:center;gap:14px;margin-bottom:16px;">
  1020. <div style="position:relative;">
  1021. <div style="width:56px;height:56px;border-radius:50%;background:rgba(255,255,255,0.25);display:flex;align-items:center;justify-content:center;font-size:28px;">&#x1F464;</div>
  1022. <!-- 用户状态图标 -->
  1023. <div style="position:absolute;bottom:0;right:0;width:18px;height:18px;border-radius:50%;background:#52c41a;border:2px solid #1677ff;display:flex;align-items:center;justify-content:center;">
  1024. <span style="font-size:9px;color:#fff;font-weight:700;line-height:1;">✓</span>
  1025. </div>
  1026. </div>
  1027. <div>
  1028. <div style="display:flex;align-items:center;gap:6px;">
  1029. <span style="color:white;font-size:18px;font-weight:700;">张明远</span>
  1030. <span style="font-size:10px;background:rgba(82,196,26,0.25);color:#b7eb8f;border:1px solid rgba(82,196,26,0.4);border-radius:10px;padding:1px 7px;">已认证</span>
  1031. </div>
  1032. <div style="color:rgba(255,255,255,0.8);font-size:13px;">硕士研究生 &middot; 20231001</div>
  1033. <div style="color:rgba(255,255,255,0.7);font-size:12px;margin-top:2px;">生命科学学院</div>
  1034. </div>
  1035. </div>
  1036. <div style="display:grid;grid-template-columns:1fr 1fr 1fr 1fr;gap:8px;">
  1037. <div style="background:rgba(255,255,255,0.15);border-radius:8px;padding:10px;text-align:center;">
  1038. <div style="color:white;font-size:20px;font-weight:700;">6</div>
  1039. <div style="color:rgba(255,255,255,0.75);font-size:11px;">学时</div>
  1040. </div>
  1041. <div style="background:rgba(255,255,255,0.15);border-radius:8px;padding:10px;text-align:center;">
  1042. <div style="color:white;font-size:20px;font-weight:700;">2</div>
  1043. <div style="color:rgba(255,255,255,0.75);font-size:11px;">证书</div>
  1044. </div>
  1045. <div style="background:rgba(255,255,255,0.15);border-radius:8px;padding:10px;text-align:center;">
  1046. <div style="color:#ffd666;font-size:20px;font-weight:700;">128</div>
  1047. <div style="color:rgba(255,255,255,0.75);font-size:11px;">奖励分</div>
  1048. </div>
  1049. <div style="background:rgba(255,255,255,0.15);border-radius:8px;padding:10px;text-align:center;">
  1050. <div style="color:#95de64;font-size:20px;font-weight:700;">100</div>
  1051. <div style="color:rgba(255,255,255,0.75);font-size:11px;">信用分</div>
  1052. </div>
  1053. </div>
  1054. </div>
  1055. <!-- 实验室审批 独立卡片 -->
  1056. <div class="card" style="margin-top:12px;">
  1057. <div class="list-item" onclick="goto('screen-approval')">
  1058. <span style="font-size:20px;margin-right:10px;">&#x1F6E1;&#xFE0F;</span>
  1059. <div class="list-left"><div class="fw500">实验室审批</div><div class="text-xs text-gray mt4">审批实验室绑定申请</div></div>
  1060. <span class="badge" style="margin-right:6px;">3</span>
  1061. <span style="font-size:16px;color:var(--text-hint)">&#8250;</span>
  1062. </div>
  1063. </div>
  1064. <!-- 我的成绩 & 证书 -->
  1065. <div class="card">
  1066. <div class="list-item" onclick="goto('screen-scores')">
  1067. <span style="font-size:20px;margin-right:10px;">&#x1F4CA;</span>
  1068. <div class="list-left"><div class="fw500">我的成绩</div><div class="text-xs text-gray mt4">查看所有考试记录与成绩</div></div>
  1069. <span style="font-size:16px;color:var(--text-hint)">&#8250;</span>
  1070. </div>
  1071. <div class="list-item" onclick="goto('screen-certs')">
  1072. <span style="font-size:20px;margin-right:10px;">&#x1F3C6;</span>
  1073. <div class="list-left"><div class="fw500">我的证书</div><div class="text-xs text-gray mt4">查看已获得的所有证书</div></div>
  1074. <span style="font-size:16px;color:var(--text-hint)">&#8250;</span>
  1075. </div>
  1076. </div>
  1077. </div>
  1078. <div class="bottom-tab">
  1079. <div class="tab-item"><span class="tab-icon">🏠</span><span>工作台</span></div>
  1080. <div class="tab-item"><span class="tab-icon">📚</span><span>学习培训</span></div>
  1081. <div class="tab-item"><span class="tab-icon">🎓</span><span>在线考试</span></div>
  1082. <div class="tab-item"><span class="tab-icon">✏️</span><span>刷题练习</span></div>
  1083. </div>
  1084. </div>
  1085. <!-- SCREEN: 我的成绩 -->
  1086. <div class="screen" id="screen-scores">
  1087. <div class="topbar">
  1088. <div class="topbar-back" onclick="goBack()">&#8249; 返回</div>
  1089. <div class="topbar-title">我的成绩</div>
  1090. <div></div>
  1091. </div>
  1092. <div class="filter-row">
  1093. <select class="form-input form-select" style="width:auto;padding:6px 28px 6px 10px;font-size:13px;">
  1094. <option>全部</option><option>通过</option><option>未通过</option>
  1095. </select>
  1096. <input type="date" class="form-input" style="width:120px;padding:6px 8px;font-size:12px;" value="2025-09-01">
  1097. <span class="text-xs text-gray">至</span>
  1098. <input type="date" class="form-input" style="width:120px;padding:6px 8px;font-size:12px;" value="2026-07-01">
  1099. </div>
  1100. <div class="tag-scroll" style="padding-top:10px;">
  1101. <span class="tag tag-gray active" onclick="setKnowTag(this)">全部</span>
  1102. <span class="tag tag-gray" onclick="setKnowTag(this)">新生入学</span>
  1103. <span class="tag tag-gray" onclick="setKnowTag(this)">应知应会</span>
  1104. <span class="tag tag-gray" onclick="setKnowTag(this)">分级分类</span>
  1105. <span class="tag tag-gray" onclick="setKnowTag(this)">负面清单</span>
  1106. </div>
  1107. <div class="scroll-content" style="padding:8px 0;">
  1108. <div style="padding:0 12px;">
  1109. <div class="score-card" style="cursor:pointer;" onclick="goto('screen-score-detail')">
  1110. <div class="row-between mb8">
  1111. <span class="tag tag-blue text-xs">新生入学考试</span>
  1112. <span class="score-result-pass">通过</span>
  1113. </div>
  1114. <div style="font-size:15px;font-weight:700;margin-bottom:8px;">2025级新生实验室安全入学考试</div>
  1115. <div style="display:grid;grid-template-columns:1fr 1fr;gap:6px;margin-bottom:10px;font-size:13px;">
  1116. <div><span class="text-gray">考试时间:</span>2026-01-10</div>
  1117. <div><span class="text-gray">时长:</span>90 分钟</div>
  1118. <div><span class="text-gray">满分/及格:</span>100 / 70</div>
  1119. <div><span class="text-gray">考次:</span>2 / 3</div>
  1120. <div><span class="text-gray">用时:</span>37分22秒</div>
  1121. <div><span class="text-gray">最高成绩:</span><span class="text-blue fw500">78 分</span></div>
  1122. <div><span class="text-gray">获得积分:</span><span class="text-orange fw500">+15分</span></div>
  1123. <div><span class="text-gray">考试结果:</span><span class="text-green fw500">通过</span></div>
  1124. </div>
  1125. <div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:6px;margin-bottom:10px;">
  1126. <div style="background:var(--gray-light);border-radius:6px;padding:6px 8px;">
  1127. <div class="text-xs text-gray mb4">完成学时</div>
  1128. <div class="text-xs fw500 text-green">24 学时</div>
  1129. </div>
  1130. <div style="background:var(--gray-light);border-radius:6px;padding:6px 8px;">
  1131. <div class="text-xs text-gray mb4">完成学习</div>
  1132. <div class="text-xs fw500 text-green">已完成</div>
  1133. </div>
  1134. <div style="background:var(--gray-light);border-radius:6px;padding:6px 8px;">
  1135. <div class="text-xs text-gray mb4">模拟得分</div>
  1136. <div class="text-xs fw500 text-blue">92 分</div>
  1137. </div>
  1138. </div>
  1139. <div style="display:flex;gap:8px;">
  1140. <button class="btn btn-sm" style="background:#fff7e6;color:#d46b08;border:1px solid #ffd591;border-radius:6px;font-size:12px;padding:5px 10px;cursor:pointer;" onclick="goto('screen-certs')">查看证书</button>
  1141. </div>
  1142. </div>
  1143. <div class="score-card" style="cursor:pointer;" onclick="goto('screen-score-detail')">
  1144. <div class="row-between mb8">
  1145. <span class="tag tag-orange text-xs">应知应会考试</span>
  1146. <span class="score-result-fail">未通过</span>
  1147. </div>
  1148. <div style="font-size:15px;font-weight:700;margin-bottom:8px;">2024-2025学年应知应会安全考试</div>
  1149. <div style="display:grid;grid-template-columns:1fr 1fr;gap:6px;margin-bottom:10px;font-size:13px;">
  1150. <div><span class="text-gray">考试时间:</span>2025-06-05</div>
  1151. <div><span class="text-gray">时长:</span>60 分钟</div>
  1152. <div><span class="text-gray">满分/及格:</span>100 / 70</div>
  1153. <div><span class="text-gray">考次:</span>3 / 3</div>
  1154. <div><span class="text-gray">用时:</span>52分08秒</div>
  1155. <div><span class="text-gray">最高成绩:</span><span class="text-red fw500">65 分</span></div>
  1156. <div><span class="text-gray">获得积分:</span><span class="text-gray">无</span></div>
  1157. <div><span class="text-gray">考试结果:</span><span class="text-red fw500">未通过</span></div>
  1158. </div>
  1159. <div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:6px;margin-bottom:10px;">
  1160. <div style="background:var(--gray-light);border-radius:6px;padding:6px 8px;">
  1161. <div class="text-xs text-gray mb4">完成学时</div>
  1162. <div class="text-xs fw500 text-orange">12/16 学时</div>
  1163. </div>
  1164. <div style="background:var(--gray-light);border-radius:6px;padding:6px 8px;">
  1165. <div class="text-xs text-gray mb4">完成学习</div>
  1166. <div class="text-xs fw500 text-green">已完成</div>
  1167. </div>
  1168. <div style="background:var(--gray-light);border-radius:6px;padding:6px 8px;">
  1169. <div class="text-xs text-gray mb4">模拟得分</div>
  1170. <div class="text-xs fw500 text-orange">58 分</div>
  1171. </div>
  1172. </div>
  1173. </div>
  1174. </div>
  1175. </div>
  1176. </div>
  1177. <!-- SCREEN: 我的证书 -->
  1178. <div class="screen" id="screen-certs">
  1179. <div class="topbar">
  1180. <div class="topbar-back" onclick="goBack()">&#8249; 返回</div>
  1181. <div class="topbar-title">我的证书</div>
  1182. <div></div>
  1183. </div>
  1184. <div class="scroll-content" style="background:#f0f2f5;">
  1185. <div style="padding:16px 12px;">
  1186. <!-- 证书完整预览图 -->
  1187. <div style="background:#fff;border-radius:12px;overflow:hidden;box-shadow:0 4px 20px rgba(0,0,0,.1);">
  1188. <!-- 证书顶部装饰带 -->
  1189. <div style="background:linear-gradient(135deg,#1857d4 0%,#2e6fe0 100%);padding:4px 0;"></div>
  1190. <!-- 证书主体 -->
  1191. <div style="padding:28px 24px 24px;text-align:center;background:linear-gradient(180deg,#f8faff 0%,#fff 60%);">
  1192. <!-- 学校徽标占位 -->
  1193. <div style="width:64px;height:64px;border-radius:50%;background:linear-gradient(135deg,#1857d4,#2e6fe0);display:flex;align-items:center;justify-content:center;margin:0 auto 14px;font-size:28px;box-shadow:0 4px 12px rgba(24,87,212,.25);">🎓</div>
  1194. <div style="font-size:11px;color:#888;letter-spacing:2px;margin-bottom:6px;">XX大学</div>
  1195. <div style="font-size:20px;font-weight:800;color:#1857d4;letter-spacing:1px;margin-bottom:4px;">实验室安全教育证书</div>
  1196. <div style="font-size:12px;color:#aaa;margin-bottom:24px;">Laboratory Safety Education Certificate</div>
  1197. <!-- 分隔线 -->
  1198. <div style="display:flex;align-items:center;gap:8px;margin-bottom:20px;">
  1199. <div style="flex:1;height:1px;background:linear-gradient(90deg,transparent,#d4b96a);"></div>
  1200. <span style="color:#d4b96a;font-size:14px;">✦</span>
  1201. <div style="flex:1;height:1px;background:linear-gradient(90deg,#d4b96a,transparent);"></div>
  1202. </div>
  1203. <!-- 获证人信息 -->
  1204. <div style="font-size:13px;color:#666;margin-bottom:6px;">兹证明</div>
  1205. <div style="font-size:22px;font-weight:700;color:#1a1a1a;margin-bottom:6px;">张明远</div>
  1206. <div style="font-size:12px;color:#888;margin-bottom:18px;">硕士研究生 · 生命科学学院 · 20231001</div>
  1207. <div style="font-size:13px;color:#444;line-height:1.8;margin-bottom:20px;">
  1208. 已完成实验室安全通识教育培训<br>考核成绩合格,特颁发此证书
  1209. </div>
  1210. <!-- 证书信息 -->
  1211. <div style="background:#f8faff;border-radius:8px;padding:12px 16px;text-align:left;margin-bottom:20px;border:1px solid #e8edf6;">
  1212. <div style="display:flex;justify-content:space-between;font-size:12px;color:#666;margin-bottom:6px;">
  1213. <span>证书编号</span><span style="color:#333;font-weight:500;">CERT-2026-001-20231001</span>
  1214. </div>
  1215. <div style="display:flex;justify-content:space-between;font-size:12px;color:#666;margin-bottom:6px;">
  1216. <span>颁发日期</span><span style="color:#333;font-weight:500;">2026年01月10日</span>
  1217. </div>
  1218. <div style="display:flex;justify-content:space-between;font-size:12px;color:#666;">
  1219. <span>有效期限</span><span style="color:#333;font-weight:500;">长期有效</span>
  1220. </div>
  1221. </div>
  1222. <!-- 印章区 -->
  1223. <div style="display:flex;justify-content:flex-end;align-items:flex-end;gap:16px;margin-bottom:8px;">
  1224. <div style="text-align:center;">
  1225. <div style="width:60px;height:60px;border-radius:50%;border:2px solid #c41d7f;display:flex;align-items:center;justify-content:center;margin:0 auto 4px;opacity:.7;">
  1226. <span style="font-size:10px;color:#c41d7f;font-weight:600;text-align:center;line-height:1.3;">安全<br>管理处</span>
  1227. </div>
  1228. <div style="font-size:10px;color:#aaa;">(公章)</div>
  1229. </div>
  1230. </div>
  1231. </div>
  1232. <!-- 证书底部装饰带 -->
  1233. <div style="background:linear-gradient(135deg,#1857d4 0%,#2e6fe0 100%);padding:4px 0;"></div>
  1234. </div>
  1235. <!-- 操作按钮 -->
  1236. <div style="margin-top:16px;">
  1237. <button class="btn btn-primary" style="width:100%;">下载保存</button>
  1238. </div>
  1239. </div>
  1240. </div>
  1241. </div>
  1242. <!-- SCREEN: 实验室审批 -->
  1243. <div class="screen" id="screen-approval">
  1244. <div class="topbar">
  1245. <div class="topbar-back" onclick="goBack()">&#8249; 返回</div>
  1246. <div class="topbar-title">实验室审批</div>
  1247. <div class="text-sm text-blue">待审批 <span class="badge">3</span></div>
  1248. </div>
  1249. <div class="tag-scroll" style="padding-top:10px;">
  1250. <span class="tag tag-gray active" onclick="setKnowTag(this)">全部</span>
  1251. <span class="tag tag-gray" onclick="setKnowTag(this)">待审批</span>
  1252. <span class="tag tag-gray" onclick="setKnowTag(this)">已通过</span>
  1253. <span class="tag tag-gray" onclick="setKnowTag(this)">已驳回</span>
  1254. </div>
  1255. <div class="scroll-content" style="padding:8px 0;">
  1256. <div style="padding:0 12px;">
  1257. <div class="approval-card">
  1258. <div class="row-between mb8">
  1259. <div class="fw500" style="font-size:15px;">李小明</div>
  1260. <span class="approval-status-pending">待审批</span>
  1261. </div>
  1262. <div style="display:grid;grid-template-columns:1fr 1fr;gap:4px;font-size:13px;margin-bottom:10px;">
  1263. <div><span class="text-gray">学工号:</span>20240023</div>
  1264. <div><span class="text-gray">类别:</span>本科生</div>
  1265. <div><span class="text-gray">所属单位:</span>生命科学学院</div>
  1266. <div><span class="text-gray">提交时间:</span>2026-09-02</div>
  1267. </div>
  1268. <div style="background:var(--gray-light);border-radius:8px;padding:10px;margin-bottom:10px;font-size:13px;">
  1269. <div class="mb4"><span class="text-gray">申请实验室:</span><span class="fw500">分子生物学实验室(B206)</span></div>
  1270. <div class="mb4"><span class="text-gray">风险等级:</span><span class="tag tag-risk-2 text-xs">II级</span> <span class="text-gray" style="margin-left:6px;">安全类别:</span><span class="fw500">生物类</span></div>
  1271. <div><span class="text-gray">进入原因:</span>参与导师科研项目,需使用生物安全柜进行细胞培养实验</div>
  1272. </div>
  1273. <div style="display:flex;gap:8px;">
  1274. <button class="btn btn-green btn-sm" style="flex:1;" onclick="approveItem(this,'pass')">通过</button>
  1275. <button class="btn btn-sm" style="flex:1;background:var(--red-light);color:var(--red);border:1px solid var(--red);" onclick="approveItem(this,'reject')">驳回</button>
  1276. </div>
  1277. </div>
  1278. <div class="approval-card">
  1279. <div class="row-between mb8">
  1280. <div class="fw500" style="font-size:15px;">王芳</div>
  1281. <span class="approval-status-pending">待审批</span>
  1282. </div>
  1283. <div style="display:grid;grid-template-columns:1fr 1fr;gap:4px;font-size:13px;margin-bottom:10px;">
  1284. <div><span class="text-gray">学工号:</span>20240187</div>
  1285. <div><span class="text-gray">类别:</span>硕士研究生</div>
  1286. <div><span class="text-gray">所属单位:</span>化学学院</div>
  1287. <div><span class="text-gray">提交时间:</span>2026-09-01</div>
  1288. </div>
  1289. <div style="background:var(--gray-light);border-radius:8px;padding:10px;margin-bottom:10px;font-size:13px;">
  1290. <div class="mb4"><span class="text-gray">申请实验室:</span><span class="fw500">有机合成实验室(C302)</span></div>
  1291. <div class="mb4"><span class="text-gray">风险等级:</span><span class="tag tag-risk-3 text-xs">III级</span> <span class="text-gray" style="margin-left:6px;">安全类别:</span><span class="fw500">化学类</span></div>
  1292. <div><span class="text-gray">进入原因:</span>硕士论文研究方向为有机功能材料合成</div>
  1293. </div>
  1294. <div style="display:flex;gap:8px;">
  1295. <button class="btn btn-green btn-sm" style="flex:1;" onclick="approveItem(this,'pass')">通过</button>
  1296. <button class="btn btn-sm" style="flex:1;background:var(--red-light);color:var(--red);border:1px solid var(--red);" onclick="approveItem(this,'reject')">驳回</button>
  1297. </div>
  1298. </div>
  1299. <div class="approval-card" style="opacity:0.85;">
  1300. <div class="row-between mb8">
  1301. <div class="fw500" style="font-size:15px;">陈晓宇</div>
  1302. <span class="approval-status-pass">已通过</span>
  1303. </div>
  1304. <div style="display:grid;grid-template-columns:1fr 1fr;gap:4px;font-size:13px;margin-bottom:10px;">
  1305. <div><span class="text-gray">学工号:</span>20230056</div>
  1306. <div><span class="text-gray">类别:</span>博士研究生</div>
  1307. <div><span class="text-gray">所属单位:</span>生命科学学院</div>
  1308. <div><span class="text-gray">通过时间:</span>2026-08-30</div>
  1309. </div>
  1310. <div style="background:#f6ffed;border-radius:8px;padding:10px;font-size:13px;">
  1311. <div class="mb4"><span class="text-gray">申请实验室:</span><span class="fw500">分子生物学实验室(B206)</span></div>
  1312. <div><span class="text-gray">进入原因:</span>博士课题组成员,长期使用该实验室</div>
  1313. </div>
  1314. </div>
  1315. </div>
  1316. </div>
  1317. </div>
  1318. <!-- SCREEN: 考试记录 -->
  1319. <div class="screen" id="screen-exam-records">
  1320. <div class="topbar">
  1321. <div class="topbar-back" onclick="goBack()">&#8249; 返回</div>
  1322. <div class="topbar-title">考试记录</div>
  1323. <div></div>
  1324. </div>
  1325. <div class="scroll-content">
  1326. <div class="card" style="margin-top:12px;">
  1327. <div style="font-size:15px;font-weight:700;margin-bottom:4px;">2025级新生实验室安全入学考试</div>
  1328. <div class="text-xs text-gray mb12">2026-01-10 | 用时 37分22秒 | 最终成绩: <span class="text-blue fw500">78分(通过)</span></div>
  1329. <div style="background:var(--gray-light);border-radius:8px;padding:12px;margin-bottom:14px;">
  1330. <div class="text-sm fw500 mb8">答题统计</div>
  1331. <div style="display:grid;grid-template-columns:1fr 1fr 1fr 1fr;gap:8px;text-align:center;">
  1332. <div><div style="font-size:18px;font-weight:700;color:var(--blue);">100</div><div class="text-xs text-gray">总题数</div></div>
  1333. <div><div style="font-size:18px;font-weight:700;color:var(--green);">78</div><div class="text-xs text-gray">正确</div></div>
  1334. <div><div style="font-size:18px;font-weight:700;color:var(--red);">22</div><div class="text-xs text-gray">错误</div></div>
  1335. <div><div style="font-size:18px;font-weight:700;color:var(--blue);">78%</div><div class="text-xs text-gray">正确率</div></div>
  1336. </div>
  1337. </div>
  1338. <div class="text-sm fw500 mb8">章节得分</div>
  1339. <div style="font-size:13px;">
  1340. <div class="row-between" style="padding:8px 0;border-bottom:1px solid var(--gray-border);"><span>实验室安全概论</span><span class="text-green fw500">20/20</span></div>
  1341. <div class="row-between" style="padding:8px 0;border-bottom:1px solid var(--gray-border);"><span>危险化学品管理</span><span class="text-orange fw500">16/20</span></div>
  1342. <div class="row-between" style="padding:8px 0;border-bottom:1px solid var(--gray-border);"><span>生物安全操作规范</span><span class="text-green fw500">18/20</span></div>
  1343. <div class="row-between" style="padding:8px 0;border-bottom:1px solid var(--gray-border);"><span>消防与应急处置</span><span class="text-orange fw500">15/20</span></div>
  1344. <div class="row-between" style="padding:8px 0;"><span>个人防护与职业健康</span><span class="text-red fw500">9/20</span></div>
  1345. </div>
  1346. </div>
  1347. </div>
  1348. </div>
  1349. <!-- SCREEN: 历史错题 -->
  1350. <div class="screen" id="screen-wrong-questions">
  1351. <div class="topbar">
  1352. <div class="topbar-back" onclick="goBack()">&#8249; 返回</div>
  1353. <div class="topbar-title">历史错题</div>
  1354. <div></div>
  1355. </div>
  1356. <div class="tag-scroll" style="padding-top:10px;">
  1357. <span class="tag tag-gray active" onclick="setKnowTag(this)">全部</span>
  1358. <span class="tag tag-gray" onclick="setKnowTag(this)">新生入学</span>
  1359. <span class="tag tag-gray" onclick="setKnowTag(this)">应知应会</span>
  1360. </div>
  1361. <div class="scroll-content" style="padding:8px 0;">
  1362. <div style="padding:0 12px;">
  1363. <div style="background:var(--white);border-radius:10px;padding:14px;margin-bottom:10px;border:1px solid var(--gray-border);">
  1364. <div class="row-between mb8">
  1365. <div><span class="q-type-badge">单选题</span><span class="text-xs text-gray" style="margin-left:6px;">2025级新生入学考试</span></div>
  1366. <span class="tag tag-orange text-xs">答错2次</span>
  1367. </div>
  1368. <div class="text-sm" style="line-height:1.7;margin-bottom:10px;">以下哪种废液可以直接倒入普通下水道排放?</div>
  1369. <div style="background:var(--gray-light);border-radius:8px;padding:10px;margin-bottom:10px;">
  1370. <div class="text-xs text-gray mb4">我的答案:<span class="text-red fw500">A. 含汞废液(错误)</span></div>
  1371. <div class="text-xs text-gray">正确答案:<span class="text-green fw500">D. 少量洗涤蒸馏水</span></div>
  1372. </div>
  1373. <div style="background:#f6ffed;border-radius:8px;padding:10px;font-size:13px;color:var(--text-secondary);line-height:1.7;">
  1374. 解析:含汞废液属于危险废物,必须进行无害化处理,不能直接排放。少量洗涤蒸馏水危害极小,可直接排放。
  1375. </div>
  1376. </div>
  1377. <div style="background:var(--white);border-radius:10px;padding:14px;margin-bottom:10px;border:1px solid var(--gray-border);">
  1378. <div class="row-between mb8">
  1379. <div><span class="q-type-badge">判断题</span><span class="text-xs text-gray" style="margin-left:6px;">2025级新生入学考试</span></div>
  1380. <span class="tag tag-red text-xs">答错3次</span>
  1381. </div>
  1382. <div class="text-sm" style="line-height:1.7;margin-bottom:10px;">实验室发生化学品泄漏时,第一步应立即拨打119报警。( )</div>
  1383. <div style="background:var(--gray-light);border-radius:8px;padding:10px;margin-bottom:10px;">
  1384. <div class="text-xs text-gray mb4">我的答案:<span class="text-red fw500">A. 正确(错误)</span></div>
  1385. <div class="text-xs text-gray">正确答案:<span class="text-green fw500">B. 错误</span></div>
  1386. </div>
  1387. <div style="background:#f6ffed;border-radius:8px;padding:10px;font-size:13px;color:var(--text-secondary);line-height:1.7;">
  1388. 解析:发生化学品泄漏时,第一步应先疏散人员并撤离危险区域,再根据泄漏情况判断是否需要拨打119。
  1389. </div>
  1390. </div>
  1391. <div style="background:var(--white);border-radius:10px;padding:14px;border:1px solid var(--gray-border);">
  1392. <div class="row-between mb8">
  1393. <div><span class="q-type-badge">多选题</span><span class="text-xs text-gray" style="margin-left:6px;">应知应会考试</span></div>
  1394. <span class="tag tag-orange text-xs">答错1次</span>
  1395. </div>
  1396. <div class="text-sm" style="line-height:1.7;margin-bottom:10px;">下列属于个人防护装备(PPE)的是?(多选)</div>
  1397. <div style="background:var(--gray-light);border-radius:8px;padding:10px;margin-bottom:10px;">
  1398. <div class="text-xs text-gray mb4">我的答案:<span class="text-red fw500">A C(部分正确)</span></div>
  1399. <div class="text-xs text-gray">正确答案:<span class="text-green fw500">A B C D</span></div>
  1400. </div>
  1401. <div style="background:#f6ffed;border-radius:8px;padding:10px;font-size:13px;color:var(--text-secondary);line-height:1.7;">
  1402. 解析:防护眼镜(A)、实验手套(B)、防护口罩(C)、实验室防护服(D)均属于个人防护装备。
  1403. </div>
  1404. </div>
  1405. </div>
  1406. </div>
  1407. </div>
  1408. <!-- SCREEN: 考试答题中 -->
  1409. <div class="screen exam-screen" id="screen-exam-doing">
  1410. <div class="topbar">
  1411. <div class="topbar-back" onclick="submitExam()">&#8249; 交卷</div>
  1412. <div class="topbar-title">应知应会考试中</div>
  1413. <div class="text-sm text-blue" onclick="toggleQNav()">题号</div>
  1414. </div>
  1415. <!-- 醒目剩余时间 -->
  1416. <div id="examTimerBar" style="background:linear-gradient(90deg,#1677ff,#0958d9);padding:6px 16px;display:flex;align-items:center;justify-content:center;gap:8px;flex-shrink:0;">
  1417. <span style="color:rgba(255,255,255,.8);font-size:12px;">剩余时间</span>
  1418. <span id="examTimer" style="color:#fff;font-size:22px;font-weight:700;letter-spacing:2px;font-variant-numeric:tabular-nums;">52:14</span>
  1419. <span style="color:rgba(255,255,255,.6);font-size:11px;">请合理安排答题时间</span>
  1420. </div>
  1421. <div style="flex:1;overflow-y:auto;padding:12px;">
  1422. <div style="background:var(--white);border-radius:10px;padding:14px;margin-bottom:12px;">
  1423. <div class="stat-row" style="margin-bottom:0;">
  1424. <div class="stat-item"><div class="text-xs text-gray">已答</div><div class="stat-val text-blue">7</div></div>
  1425. <div class="stat-item"><div class="text-xs text-gray">未答</div><div class="stat-val">43</div></div>
  1426. <div class="stat-item"><div class="text-xs text-gray">总题</div><div class="stat-val">50</div></div>
  1427. </div>
  1428. </div>
  1429. <div id="qNavPanel" style="display:none;background:var(--white);border-radius:10px;padding:12px;margin-bottom:12px;">
  1430. <div class="text-sm fw500 mb8">题目列表</div>
  1431. <div class="q-nav">
  1432. <div class="q-num answered" onclick="jumpToQ(1)">1</div><div class="q-num answered" onclick="jumpToQ(2)">2</div><div class="q-num answered" onclick="jumpToQ(3)">3</div>
  1433. <div class="q-num answered" onclick="jumpToQ(4)">4</div><div class="q-num answered" onclick="jumpToQ(5)">5</div><div class="q-num answered" onclick="jumpToQ(6)">6</div>
  1434. <div class="q-num answered" onclick="jumpToQ(7)">7</div><div class="q-num current" id="qnum-8" onclick="jumpToQ(8)">8</div><div class="q-num" onclick="jumpToQ(9)">9</div>
  1435. <div class="q-num" onclick="jumpToQ(10)">10</div><div class="q-num" onclick="jumpToQ(11)">11</div><div class="q-num" onclick="jumpToQ(12)">12</div>
  1436. </div>
  1437. </div>
  1438. <div style="background:var(--white);border-radius:10px;padding:14px;">
  1439. <div class="q-header">
  1440. <span class="q-type-badge">单选题</span>
  1441. <span class="text-sm fw500" id="qLabel">第 8 题 (2分)</span>
  1442. <span class="diff-hard" style="margin-left:6px;">很难</span>
  1443. <div class="q-content" id="qContent">以下哪种操作违反了实验室生物安全操作规范?</div>
  1444. </div>
  1445. <div class="q-options" id="qOptions">
  1446. <div class="q-option" onclick="selectOption(this)"><div class="q-radio"></div><span class="q-opt-key">A.</span><span>使用生物安全柜处理高危病原体样本</span></div>
  1447. <div class="q-option" onclick="selectOption(this)"><div class="q-radio"></div><span class="q-opt-key">B.</span><span>在实验台上脱除手套后用手触摸脸部</span></div>
  1448. <div class="q-option" onclick="selectOption(this)"><div class="q-radio"></div><span class="q-opt-key">C.</span><span>实验完成后对工作区域进行消毒处理</span></div>
  1449. <div class="q-option" onclick="selectOption(this)"><div class="q-radio"></div><span class="q-opt-key">D.</span><span>感染性废弃物放入专用生物安全袋中</span></div>
  1450. </div>
  1451. <div style="display:flex;justify-content:space-between;margin-top:16px;">
  1452. <button class="btn btn-outline btn-sm" onclick="jumpToQ(currentQ-1)">上一题</button>
  1453. <button class="btn btn-primary btn-sm" onclick="jumpToQ(currentQ+1)">下一题</button>
  1454. </div>
  1455. </div>
  1456. </div>
  1457. <div class="exam-bottom">
  1458. <button class="btn btn-primary" onclick="goto('screen-exam-result')">提交试卷</button>
  1459. </div>
  1460. </div>
  1461. <!-- SCREEN: 考试结果 -->
  1462. <div class="screen" id="screen-exam-result">
  1463. <div class="topbar">
  1464. <div class="topbar-back" onclick="goto('screen-home')">&#8249; 返回</div>
  1465. <div class="topbar-title">考试结果</div>
  1466. <div></div>
  1467. </div>
  1468. <div class="scroll-content">
  1469. <div class="card" style="margin-top:12px;text-align:center;">
  1470. <div style="font-size:56px;font-weight:900;color:var(--blue);margin-bottom:4px;">78</div>
  1471. <div class="text-gray text-sm mb8">本次考试成绩</div>
  1472. <div style="display:inline-flex;align-items:center;gap:6px;background:#f6ffed;border-radius:20px;padding:6px 20px;margin-bottom:16px;">
  1473. <span style="color:var(--green);font-weight:700;font-size:16px;">考试通过</span>
  1474. </div>
  1475. <div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px;margin-bottom:16px;">
  1476. <div style="background:var(--gray-light);border-radius:8px;padding:10px;"><div class="text-xs text-gray mb4">满分</div><div class="fw500">100</div></div>
  1477. <div style="background:var(--gray-light);border-radius:8px;padding:10px;"><div class="text-xs text-gray mb4">及格分</div><div class="fw500 text-orange">70</div></div>
  1478. <div style="background:var(--gray-light);border-radius:8px;padding:10px;"><div class="text-xs text-gray mb4">用时</div><div class="fw500">37'22"</div></div>
  1479. </div>
  1480. <div style="background:var(--gray-light);border-radius:8px;padding:12px;margin-bottom:16px;">
  1481. <div class="row-between text-sm mb6"><span>正确题数</span><span class="text-green fw500">78 题</span></div>
  1482. <div class="row-between text-sm mb6"><span>错误题数</span><span class="text-red fw500">22 题</span></div>
  1483. <div class="row-between text-sm"><span>正确率</span><span class="text-blue fw500">78%</span></div>
  1484. </div>
  1485. <div style="display:flex;gap:8px;">
  1486. <button class="btn btn-outline" style="flex:1;" onclick="goto('screen-wrong-questions')">查看错题</button>
  1487. <button class="btn btn-primary" style="flex:1;" onclick="goto('screen-home')">返回工作台</button>
  1488. </div>
  1489. </div>
  1490. <div class="card">
  1491. <div style="display:flex;align-items:center;gap:10px;">
  1492. <span style="font-size:32px;">&#x1F3C6;</span>
  1493. <div>
  1494. <div class="fw500 mb4">您已获得证书!</div>
  1495. <div class="text-sm text-gray">实验室安全通识培训合格证书</div>
  1496. <button class="btn btn-primary btn-sm mt8" onclick="goto('screen-certs')">查看证书</button>
  1497. </div>
  1498. </div>
  1499. </div>
  1500. </div>
  1501. </div>
  1502. <!-- SCREEN: 知识学习详情 -->
  1503. <div class="screen" id="screen-knowledge-detail">
  1504. <div class="topbar">
  1505. <div class="topbar-back" onclick="goBack()">&#8249; 返回</div>
  1506. <div class="topbar-title">知识学习</div>
  1507. <div></div>
  1508. </div>
  1509. <div class="scroll-content">
  1510. <div class="card" style="margin-top:12px;">
  1511. <div class="chip-row mb8">
  1512. <span class="tag tag-blue text-xs">文档课件</span>
  1513. <span class="tag tag-orange text-xs">学习中</span>
  1514. </div>
  1515. <div style="font-size:17px;font-weight:700;margin-bottom:8px;">实验室生物安全防护规范</div>
  1516. <div class="text-xs text-gray mb12">知识点:生物类安全 | 要求时长:20分钟 | 可获:1学时 + 3积分</div>
  1517. <div class="row-between mb4"><span class="text-sm text-gray">学习进度</span><span class="text-blue fw500">55%</span></div>
  1518. <div class="progress-wrap mb12"><div class="progress-bar" style="width:55%"></div></div>
  1519. <div class="material-viewer">
  1520. <div style="text-align:center;">
  1521. <div style="font-size:48px;margin-bottom:8px;">&#x1F4C4;</div>
  1522. <div style="font-size:14px;color:var(--text-hint);">生物安全防护规范.PDF</div>
  1523. <div class="text-xs text-gray mt4">第2页 / 共18页</div>
  1524. </div>
  1525. </div>
  1526. <div style="display:flex;gap:8px;">
  1527. <button class="btn btn-primary" style="flex:1;">继续学习</button>
  1528. <button class="btn btn-outline btn-sm" onclick="goto('screen-posttest')">课后考核</button>
  1529. </div>
  1530. </div>
  1531. </div>
  1532. </div>
  1533. <!-- SCREEN: 课后考核 -->
  1534. <div class="screen" id="screen-posttest">
  1535. <div class="topbar">
  1536. <div class="topbar-back" onclick="goBack()">&#8249; 返回</div>
  1537. <div class="topbar-title">课后考核</div>
  1538. <div class="text-sm text-gray">1 / 5</div>
  1539. </div>
  1540. <div class="scroll-content">
  1541. <div class="card" style="margin-top:12px;">
  1542. <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:12px;">
  1543. <div>
  1544. <div class="fw500 mb4">第1章 实验室安全概论 - 课后考核</div>
  1545. <div class="text-xs text-gray">共 5 题 | 满分 100 分 | 及格 60 分</div>
  1546. </div>
  1547. <span class="tag tag-orange">待完成</span>
  1548. </div>
  1549. <div class="progress-wrap"><div class="progress-bar" style="width:20%;background:var(--orange)"></div></div>
  1550. </div>
  1551. <div class="card">
  1552. <div class="q-header">
  1553. <span class="q-type-badge">单选题</span><span class="text-sm fw500">第 1 题 (20分)</span><span class="diff-normal" style="margin-left:6px;">一般</span>
  1554. <div class="q-content">下列哪种化学品属于易燃液体,储存时需远离火源?</div>
  1555. </div>
  1556. <div class="q-options">
  1557. <div class="q-option" onclick="selectOption(this)"><div class="q-radio"></div><span class="q-opt-key">A.</span><span>蒸馏水</span></div>
  1558. <div class="q-option selected" onclick="selectOption(this)"><div class="q-radio"></div><span class="q-opt-key">B.</span><span>乙醇(酒精)</span></div>
  1559. <div class="q-option" onclick="selectOption(this)"><div class="q-radio"></div><span class="q-opt-key">C.</span><span>氯化钠</span></div>
  1560. <div class="q-option" onclick="selectOption(this)"><div class="q-radio"></div><span class="q-opt-key">D.</span><span>碳酸钠溶液</span></div>
  1561. </div>
  1562. </div>
  1563. <div style="padding:0 12px 16px;">
  1564. <button class="btn btn-primary btn-block" onclick="goBack()">提交本题</button>
  1565. </div>
  1566. </div>
  1567. </div>
  1568. <!-- SCREEN: 学习培训(底部Tab根页面) -->
  1569. <div class="screen" id="screen-knowledge-list">
  1570. <div style="background:var(--white);border-bottom:1px solid var(--gray-border);flex-shrink:0;">
  1571. <div class="topbar" style="border-bottom:none;">
  1572. <div style="visibility:hidden;width:40px;"></div>
  1573. <div class="topbar-title">学习培训</div>
  1574. <div></div>
  1575. </div>
  1576. <!-- 4个子Tab -->
  1577. <div style="display:flex;padding:0 4px;">
  1578. <div id="lxtab-0" onclick="switchLxTab(0)" style="flex:1;text-align:center;padding:9px 4px 8px;font-size:13px;font-weight:600;color:#1677ff;border-bottom:2px solid #1677ff;cursor:pointer;">线下培训</div>
  1579. <div id="lxtab-1" onclick="switchLxTab(1)" style="flex:1;text-align:center;padding:9px 4px 8px;font-size:13px;color:#888;border-bottom:2px solid transparent;cursor:pointer;">学时任务</div>
  1580. <div id="lxtab-2" onclick="switchLxTab(2)" style="flex:1;text-align:center;padding:9px 4px 8px;font-size:13px;color:#888;border-bottom:2px solid transparent;cursor:pointer;">考前课程</div>
  1581. <div id="lxtab-3" onclick="switchLxTab(3)" style="flex:1;text-align:center;padding:9px 4px 8px;font-size:13px;color:#888;border-bottom:2px solid transparent;cursor:pointer;">知识学习</div>
  1582. </div>
  1583. </div>
  1584. <!-- Tab内容容器 -->
  1585. <div class="scroll-content">
  1586. <!-- 线下培训 -->
  1587. <div id="lxpanel-0" style="padding:12px;">
  1588. <!-- 发布状态筛选(老师身份时显示) -->
  1589. <div id="lx-publish-filter" style="display:none;margin-bottom:10px;">
  1590. <div style="display:flex;gap:0;border:1px solid #e8e8e8;border-radius:8px;overflow:hidden;background:#fafafa;">
  1591. <button onclick="filterTrainingPublish('all',this)" id="lx-filter-all" style="flex:1;padding:7px 0;font-size:12px;font-weight:600;border:none;background:#1677ff;color:#fff;cursor:pointer;">全部</button>
  1592. <button onclick="filterTrainingPublish('published',this)" id="lx-filter-pub" style="flex:1;padding:7px 0;font-size:12px;border:none;background:transparent;color:#888;cursor:pointer;border-left:1px solid #e8e8e8;">已发布</button>
  1593. <button onclick="filterTrainingPublish('unpublished',this)" id="lx-filter-unpub" style="flex:1;padding:7px 0;font-size:12px;border:none;background:transparent;color:#888;cursor:pointer;border-left:1px solid #e8e8e8;">未发布</button>
  1594. </div>
  1595. </div>
  1596. <!-- 老师/学员 角色切换 -->
  1597. <div style="display:flex;gap:6px;margin-bottom:12px;align-items:center;">
  1598. <span style="font-size:12px;color:#888;">身份:</span>
  1599. <button onclick="setTrainingRole('student')" id="lx-trole-student" style="font-size:11px;padding:3px 12px;border-radius:20px;border:1px solid #eb2f96;background:#eb2f96;color:#fff;cursor:pointer;">学员</button>
  1600. <button onclick="setTrainingRole('teacher')" id="lx-trole-teacher" style="font-size:11px;padding:3px 12px;border-radius:20px;border:1px solid #ffadd2;background:transparent;color:#c41d7f;cursor:pointer;">管理</button>
  1601. </div>
  1602. <!-- 卡片1:进行中(已发布) -->
  1603. <div class="card lx-training-card" data-publish="1" onclick="openTrainingDetail('active')" style="margin:0 0 10px;cursor:pointer;padding:0;overflow:hidden;position:relative;">
  1604. <div style="width:100%;height:100px;background:linear-gradient(135deg,#ff7875,#ffa940);display:flex;align-items:center;justify-content:center;font-size:36px;">🏫</div>
  1605. <div style="padding:10px 12px;">
  1606. <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:6px;">
  1607. <span class="fw500">2026年春季实验室安全知识讲座</span>
  1608. <span style="font-size:11px;background:#fff7e6;color:#fa8c16;border:1px solid #ffd591;border-radius:10px;padding:2px 8px;flex-shrink:0;">进行中</span>
  1609. </div>
  1610. <div class="text-xs text-gray mb4">2026-03-01 &nbsp; 10:00 – 11:00</div>
  1611. <div class="text-xs text-gray mb4">📍 学术报告厅 A201</div>
  1612. <div style="display:flex;align-items:center;justify-content:space-between;">
  1613. <div class="text-xs text-gray">🏢 生命科学学院</div>
  1614. <button onclick="event.stopPropagation();openScanModal()" style="padding:4px 12px;border-radius:6px;border:1px solid #eb2f96;background:#fff0f6;color:#c41d7f;font-size:12px;cursor:pointer;">📷 扫码签到</button>
  1615. </div>
  1616. </div>
  1617. <!-- 老师端:发布开关(已发布) -->
  1618. <div class="training-teacher-ctrl" onclick="event.stopPropagation()" style="display:none;position:absolute;top:8px;right:8px;align-items:center;gap:6px;background:rgba(255,255,255,.92);border-radius:20px;padding:4px 10px;box-shadow:0 1px 6px rgba(0,0,0,.12);">
  1619. <span style="font-size:11px;color:#52c41a;font-weight:500;">已发布</span>
  1620. <div onclick="toggleTrainingPublish(this,true)" class="publish-toggle published" style="width:36px;height:20px;border-radius:10px;background:#52c41a;cursor:pointer;position:relative;flex-shrink:0;transition:background .2s;">
  1621. <div style="position:absolute;top:3px;right:3px;width:14px;height:14px;border-radius:50%;background:#fff;transition:right .2s;"></div>
  1622. </div>
  1623. </div>
  1624. </div>
  1625. <!-- 卡片2:未开始(已发布) -->
  1626. <div class="card lx-training-card" data-publish="1" onclick="openTrainingDetail('active')" style="margin:0 0 10px;cursor:pointer;padding:0;overflow:hidden;position:relative;">
  1627. <div style="width:100%;height:100px;background:linear-gradient(135deg,#69b1ff,#4096ff);display:flex;align-items:center;justify-content:center;font-size:36px;">⚗️</div>
  1628. <div style="padding:10px 12px;">
  1629. <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:6px;">
  1630. <span class="fw500">2026年危化品安全应急演练</span>
  1631. <span style="font-size:11px;background:#f5f5f5;color:#999;border:1px solid #d9d9d9;border-radius:10px;padding:2px 8px;flex-shrink:0;">未开始</span>
  1632. </div>
  1633. <div class="text-xs text-gray mb4">2026-04-15 &nbsp; 14:00 – 16:00</div>
  1634. <div class="text-xs text-gray mb4">📍 化学楼一楼广场</div>
  1635. <div class="text-xs text-gray">🏢 化学与化工学院</div>
  1636. </div>
  1637. <!-- 老师端:发布开关(已发布) -->
  1638. <div class="training-teacher-ctrl" onclick="event.stopPropagation()" style="display:none;position:absolute;top:8px;right:8px;align-items:center;gap:6px;background:rgba(255,255,255,.92);border-radius:20px;padding:4px 10px;box-shadow:0 1px 6px rgba(0,0,0,.12);">
  1639. <span style="font-size:11px;color:#52c41a;font-weight:500;">已发布</span>
  1640. <div onclick="toggleTrainingPublish(this,true)" class="publish-toggle published" style="width:36px;height:20px;border-radius:10px;background:#52c41a;cursor:pointer;position:relative;flex-shrink:0;transition:background .2s;">
  1641. <div style="position:absolute;top:3px;right:3px;width:14px;height:14px;border-radius:50%;background:#fff;transition:right .2s;"></div>
  1642. </div>
  1643. </div>
  1644. </div>
  1645. <!-- 卡片3:已完成(历史记录中展示,主列表隐藏) -->
  1646. <div class="card lx-training-card" data-publish="1" data-done="1" onclick="openTrainingDetail('done')" style="display:none;margin:0 0 10px;cursor:pointer;padding:0;overflow:hidden;position:relative;">
  1647. <div style="width:100%;height:100px;background:linear-gradient(135deg,#95de64,#52c41a);display:flex;align-items:center;justify-content:center;font-size:36px;">🧯</div>
  1648. <div style="padding:10px 12px;">
  1649. <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:6px;">
  1650. <span class="fw500">2025年秋季消防安全知识培训</span>
  1651. <span style="font-size:11px;background:#f6ffed;color:#52c41a;border:1px solid #b7eb8f;border-radius:10px;padding:2px 8px;flex-shrink:0;">已完成</span>
  1652. </div>
  1653. <div class="text-xs text-gray mb4">2025-10-20 &nbsp; 09:00 – 10:30</div>
  1654. <div class="text-xs text-gray mb4">📍 综合楼报告厅</div>
  1655. <div style="display:flex;align-items:center;justify-content:space-between;">
  1656. <div class="text-xs text-gray">🏢 生命科学学院</div>
  1657. <span style="font-size:12px;color:#52c41a;font-weight:500;">✅ 已签到</span>
  1658. </div>
  1659. </div>
  1660. <!-- 老师端:发布开关(已发布) -->
  1661. <div class="training-teacher-ctrl" onclick="event.stopPropagation()" style="display:none;position:absolute;top:8px;right:8px;align-items:center;gap:6px;background:rgba(255,255,255,.92);border-radius:20px;padding:4px 10px;box-shadow:0 1px 6px rgba(0,0,0,.12);">
  1662. <span style="font-size:11px;color:#52c41a;font-weight:500;">已发布</span>
  1663. <div onclick="toggleTrainingPublish(this,true)" class="publish-toggle published" style="width:36px;height:20px;border-radius:10px;background:#52c41a;cursor:pointer;position:relative;flex-shrink:0;transition:background .2s;">
  1664. <div style="position:absolute;top:3px;right:3px;width:14px;height:14px;border-radius:50%;background:#fff;transition:right .2s;"></div>
  1665. </div>
  1666. </div>
  1667. </div>
  1668. <!-- 卡片4:未发布(草稿)——仅老师可见 -->
  1669. <div class="card lx-training-card training-unpublished-card" data-publish="0" onclick="openTrainingDetail('unpublished')" style="margin:0;cursor:pointer;padding:0;overflow:hidden;position:relative;display:none;opacity:.85;">
  1670. <div style="width:100%;height:100px;background:linear-gradient(135deg,#d9d9d9,#bfbfbf);display:flex;align-items:center;justify-content:center;font-size:36px;">🔬</div>
  1671. <div style="padding:10px 12px;">
  1672. <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:6px;">
  1673. <span class="fw500" style="color:#595959;">2026年生物安全专项技能培训</span>
  1674. <span style="font-size:11px;background:#f5f5f5;color:#8c8c8c;border:1px solid #d9d9d9;border-radius:10px;padding:2px 8px;flex-shrink:0;">未发布</span>
  1675. </div>
  1676. <div class="text-xs text-gray mb4">2026-05-10 &nbsp; 14:00 – 16:00</div>
  1677. <div class="text-xs text-gray mb4">📍 生命楼实验中心</div>
  1678. <div class="text-xs text-gray">🏢 生命科学学院</div>
  1679. </div>
  1680. <!-- 老师端:发布开关(未发布) -->
  1681. <div class="training-teacher-ctrl" onclick="event.stopPropagation()" style="display:none;position:absolute;top:8px;right:8px;align-items:center;gap:6px;background:rgba(255,255,255,.92);border-radius:20px;padding:4px 10px;box-shadow:0 1px 6px rgba(0,0,0,.12);">
  1682. <span style="font-size:11px;color:#8c8c8c;font-weight:500;">未发布</span>
  1683. <div onclick="toggleTrainingPublish(this,false)" class="publish-toggle unpublished" style="width:36px;height:20px;border-radius:10px;background:#d9d9d9;cursor:pointer;position:relative;flex-shrink:0;transition:background .2s;">
  1684. <div style="position:absolute;top:3px;left:3px;width:14px;height:14px;border-radius:50%;background:#fff;transition:left .2s;"></div>
  1685. </div>
  1686. </div>
  1687. </div>
  1688. </div>
  1689. <!-- 学时任务 -->
  1690. <div id="lxpanel-1" style="display:none;">
  1691. <div class="tag-scroll" style="padding-top:10px;">
  1692. <span class="tag tag-gray active" onclick="setKnowTag(this)">全部</span>
  1693. <span class="tag tag-gray" onclick="setKnowTag(this)">通识安全</span>
  1694. <span class="tag tag-gray" onclick="setKnowTag(this)">生物类</span>
  1695. <span class="tag tag-gray" onclick="setKnowTag(this)">辐射类</span>
  1696. <span class="tag tag-gray" onclick="setKnowTag(this)">化学</span>
  1697. <span class="tag tag-gray" onclick="setKnowTag(this)">应急</span>
  1698. </div>
  1699. <div style="padding:10px 12px;">
  1700. <div class="card" onclick="goto('screen-knowledge-detail')" style="margin:0 0 10px;cursor:pointer;padding:0;overflow:hidden;">
  1701. <div style="width:100%;height:90px;background:linear-gradient(135deg,#ffd666,#fa8c16);display:flex;align-items:center;justify-content:center;font-size:32px;">🔬</div>
  1702. <div style="padding:10px 12px;">
  1703. <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;">
  1704. <span class="fw500">实验室安全基础知识</span>
  1705. <span class="tag tag-orange text-xs">未达标</span>
  1706. </div>
  1707. <div class="text-xs text-gray">30分钟 | 8学时 | 5积分</div>
  1708. </div>
  1709. </div>
  1710. <div class="card" onclick="goto('screen-knowledge-detail')" style="margin:0;cursor:pointer;padding:0;overflow:hidden;">
  1711. <div style="width:100%;height:90px;background:linear-gradient(135deg,#b37feb,#722ed1);display:flex;align-items:center;justify-content:center;font-size:32px;">🧬</div>
  1712. <div style="padding:10px 12px;">
  1713. <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;">
  1714. <span class="fw500">生物安全专项学习</span>
  1715. <span class="tag tag-gray text-xs">未开始</span>
  1716. </div>
  1717. <div class="text-xs text-gray">20分钟 | 4学时 | 3积分</div>
  1718. </div>
  1719. </div>
  1720. </div>
  1721. </div>
  1722. <!-- 学习任务 -->
  1723. <div id="lxpanel-2" style="display:none;padding:12px;">
  1724. <div class="card" onclick="goto('screen-study-detail')" style="margin:0 0 10px;cursor:pointer;padding:0;overflow:hidden;">
  1725. <div style="width:100%;height:90px;background:linear-gradient(135deg,#ff9c6e,#f5222d);display:flex;align-items:center;justify-content:center;font-size:32px;">📋</div>
  1726. <div style="padding:10px 12px;">
  1727. <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;">
  1728. <span class="fw500">实验室安全基础知识</span>
  1729. <span class="tag tag-orange text-xs">待完成</span>
  1730. </div>
  1731. <div class="text-xs text-gray">生命科学学院下发</div>
  1732. </div>
  1733. </div>
  1734. <div class="card" onclick="goto('screen-study-detail')" style="margin:0 0 10px;cursor:pointer;padding:0;overflow:hidden;">
  1735. <div style="width:100%;height:90px;background:linear-gradient(135deg,#5cdbd3,#13c2c2);display:flex;align-items:center;justify-content:center;font-size:32px;">🧫</div>
  1736. <div style="padding:10px 12px;">
  1737. <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;">
  1738. <span class="fw500">生物安全操作规范</span>
  1739. <span class="tag tag-orange text-xs">待完成</span>
  1740. </div>
  1741. <div class="text-xs text-gray">生命科学学院下发</div>
  1742. </div>
  1743. </div>
  1744. </div>
  1745. <!-- 知识学习 -->
  1746. <div id="lxpanel-3" style="display:none;">
  1747. <!-- 知识点分类筛选 -->
  1748. <div class="tag-scroll" style="padding-top:10px;border-bottom:1px solid var(--gray-border);">
  1749. <span class="tag tag-gray active" onclick="setKnowTag(this)">全部</span>
  1750. <span class="tag tag-gray" onclick="setKnowTag(this)">通识安全</span>
  1751. <span class="tag tag-gray" onclick="setKnowTag(this)">生物类</span>
  1752. <span class="tag tag-gray" onclick="setKnowTag(this)">辐射类</span>
  1753. <span class="tag tag-gray" onclick="setKnowTag(this)">化学</span>
  1754. <span class="tag tag-gray" onclick="setKnowTag(this)">应急</span>
  1755. </div>
  1756. <!-- 子 Tab:视频资源 / 文章资料 -->
  1757. <div style="display:flex;padding:0 12px;border-bottom:1px solid var(--gray-border);background:var(--white);">
  1758. <div id="kxtab-0" onclick="switchKxTab(0)" style="flex:1;text-align:center;padding:10px 4px 9px;font-size:13px;font-weight:600;color:#1677ff;border-bottom:2px solid #1677ff;cursor:pointer;">视频资源</div>
  1759. <div id="kxtab-1" onclick="switchKxTab(1)" style="flex:1;text-align:center;padding:10px 4px 9px;font-size:13px;color:#888;border-bottom:2px solid transparent;cursor:pointer;">文章资料</div>
  1760. </div>
  1761. <!-- 视频资源面板 -->
  1762. <div id="kxpanel-0" style="padding:12px;">
  1763. <div class="video-grid">
  1764. <div class="video-card" onclick="goto('screen-knowledge-detail')">
  1765. <div class="video-thumb" style="background:linear-gradient(135deg,#1857d4,#5b8af0);">
  1766. <div class="video-thumb-bg"></div>
  1767. <div class="video-play">▶️</div>
  1768. </div>
  1769. <div class="video-info">
  1770. <div class="video-title">生物安全柜操作演示</div>
  1771. <div class="video-meta">20分钟 | 1学时 | 3积分</div>
  1772. <div class="mt4"><span class="tag tag-blue text-xs">未学习</span></div>
  1773. </div>
  1774. </div>
  1775. <div class="video-card" onclick="goto('screen-knowledge-detail')">
  1776. <div class="video-thumb" style="background:linear-gradient(135deg,#10a37f,#34d399);">
  1777. <div class="video-thumb-bg"></div>
  1778. <div class="video-play">▶️</div>
  1779. </div>
  1780. <div class="video-info">
  1781. <div class="video-title">化学品应急处置流程</div>
  1782. <div class="video-meta">20分钟 | 1学时 | 3积分</div>
  1783. <div class="mt4"><span class="tag tag-orange text-xs">学习中</span></div>
  1784. </div>
  1785. </div>
  1786. <div class="video-card" onclick="goto('screen-knowledge-detail')">
  1787. <div class="video-thumb" style="background:linear-gradient(135deg,#6c63ff,#a78bfa);">
  1788. <div class="video-thumb-bg"></div>
  1789. <div class="video-play">▶️</div>
  1790. </div>
  1791. <div class="video-info">
  1792. <div class="video-title">个人防护装备穿戴</div>
  1793. <div class="video-meta">20分钟 | 1学时 | 3积分</div>
  1794. <div class="mt4"><span class="tag tag-gray text-xs">未学习</span></div>
  1795. </div>
  1796. </div>
  1797. </div>
  1798. </div>
  1799. <!-- 文章资料面板 -->
  1800. <div id="kxpanel-1" style="display:none;">
  1801. <div style="padding:10px 12px 0;">
  1802. <div style="padding:10px 12px;">
  1803. <div class="card" onclick="goto('screen-knowledge-detail')" style="margin:0 0 10px;cursor:pointer;padding:0;overflow:hidden;">
  1804. <div style="width:100%;height:90px;background:linear-gradient(135deg,#b37feb,#722ed1);display:flex;align-items:center;justify-content:center;font-size:32px;">🧬</div>
  1805. <div style="padding:10px 12px;">
  1806. <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;">
  1807. <span class="fw500">实验室生物安全防护规范</span>
  1808. <span class="tag tag-orange text-xs">学习中</span>
  1809. </div>
  1810. <div class="text-xs text-gray">20分钟 | 1学时 | 3积分</div>
  1811. </div>
  1812. </div>
  1813. <div class="card" onclick="goto('screen-knowledge-detail')" style="margin:0 0 10px;cursor:pointer;padding:0;overflow:hidden;">
  1814. <div style="width:100%;height:90px;background:linear-gradient(135deg,#ff9c6e,#cf1322);display:flex;align-items:center;justify-content:center;font-size:32px;">⚗️</div>
  1815. <div style="padding:10px 12px;">
  1816. <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;">
  1817. <span class="fw500">化学品安全使用手册</span>
  1818. <span class="tag tag-blue text-xs">未学习</span>
  1819. </div>
  1820. <div class="text-xs text-gray">20分钟 | 1学时 | 3积分</div>
  1821. </div>
  1822. </div>
  1823. <div class="card" onclick="goto('screen-knowledge-detail')" style="margin:0 0 10px;cursor:pointer;padding:0;overflow:hidden;">
  1824. <div style="width:100%;height:90px;background:linear-gradient(135deg,#ff7875,#fa541c);display:flex;align-items:center;justify-content:center;font-size:32px;">🧯</div>
  1825. <div style="padding:10px 12px;">
  1826. <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;">
  1827. <span class="fw500">消防安全知识手册</span>
  1828. <span class="tag tag-gray text-xs">未学习</span>
  1829. </div>
  1830. <div class="text-xs text-gray">20分钟 | 1学时 | 3积分</div>
  1831. </div>
  1832. </div>
  1833. <div class="card" onclick="goto('screen-knowledge-detail')" style="margin:0;cursor:pointer;padding:0;overflow:hidden;">
  1834. <div style="width:100%;height:90px;background:linear-gradient(135deg,#95de64,#237804);display:flex;align-items:center;justify-content:center;font-size:32px;">🦺</div>
  1835. <div style="padding:10px 12px;">
  1836. <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;">
  1837. <span class="fw500">个人防护装备使用指南</span>
  1838. <span class="tag tag-gray text-xs">未学习</span>
  1839. </div>
  1840. <div class="text-xs text-gray">15分钟 | 1学时 | 2积分</div>
  1841. </div>
  1842. </div>
  1843. </div>
  1844. </div>
  1845. </div>
  1846. </div>
  1847. </div>
  1848. <div class="bottom-tab">
  1849. <div class="tab-item"><span class="tab-icon">🏠</span><span>工作台</span></div>
  1850. <div class="tab-item active"><span class="tab-icon">📚</span><span>学习培训</span></div>
  1851. <div class="tab-item"><span class="tab-icon">🎓</span><span>在线考试</span></div>
  1852. <div class="tab-item"><span class="tab-icon">✏️</span><span>刷题练习</span></div>
  1853. </div>
  1854. </div>
  1855. <!-- SCREEN: 通知列表 -->
  1856. <div class="screen" id="screen-notice-list">
  1857. <div class="topbar">
  1858. <div class="topbar-back" onclick="goBack()">&#8249; 返回</div>
  1859. <div class="topbar-title">消息通知</div>
  1860. <div></div>
  1861. </div>
  1862. <div class="tag-scroll" style="background:var(--white);border-bottom:1px solid var(--gray-border);padding:8px 12px;flex-shrink:0;">
  1863. <span class="tag tag-gray active" onclick="setKnowTag(this)">全部</span>
  1864. <span class="tag tag-gray" onclick="setKnowTag(this)">实验室审批</span>
  1865. <span class="tag tag-gray" onclick="setKnowTag(this)">在线考试</span>
  1866. <span class="tag tag-gray" onclick="setKnowTag(this)">学习培训</span>
  1867. </div>
  1868. <div class="scroll-content" style="padding:12px;">
  1869. <!-- 实验室审批 -->
  1870. <div class="card" style="margin:0 0 10px;padding:14px;">
  1871. <div style="display:flex;align-items:flex-start;gap:10px;">
  1872. <div style="width:36px;height:36px;border-radius:8px;background:#e6f4ff;display:flex;align-items:center;justify-content:center;font-size:18px;flex-shrink:0;">🏛️</div>
  1873. <div style="flex:1;">
  1874. <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;">
  1875. <span class="fw500" style="font-size:13px;">实验室绑定审批</span>
  1876. <span class="text-xs text-gray">刚刚</span>
  1877. </div>
  1878. <div class="text-xs text-gray" style="line-height:1.6;">您申请绑定"生命科学学院-A301实验室"正在审批中,请耐心等待负责人处理。</div>
  1879. <div style="margin-top:6px;"><span class="tag tag-orange text-xs">待审批</span></div>
  1880. </div>
  1881. </div>
  1882. </div>
  1883. <!-- 在线考试 -->
  1884. <div class="card" style="margin:0 0 10px;padding:14px;">
  1885. <div style="display:flex;align-items:flex-start;gap:10px;">
  1886. <div style="width:36px;height:36px;border-radius:8px;background:#fff7e6;display:flex;align-items:center;justify-content:center;font-size:18px;flex-shrink:0;">🎓</div>
  1887. <div style="flex:1;">
  1888. <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;">
  1889. <span class="fw500" style="font-size:13px;">在线考试提醒</span>
  1890. <span class="text-xs text-gray">10分钟前</span>
  1891. </div>
  1892. <div class="text-xs text-gray" style="line-height:1.6;">应知应会考试将于2026-08-05截止,请尽快完成考试,避免影响学年成绩。</div>
  1893. <div style="margin-top:6px;"><span class="tag tag-blue text-xs" onclick="goto('screen-exam-detail')" style="cursor:pointer;">去考试 ›</span></div>
  1894. </div>
  1895. </div>
  1896. </div>
  1897. <!-- 学习培训 -->
  1898. <div class="card" style="margin:0 0 10px;padding:14px;">
  1899. <div style="display:flex;align-items:flex-start;gap:10px;">
  1900. <div style="width:36px;height:36px;border-radius:8px;background:#f6ffed;display:flex;align-items:center;justify-content:center;font-size:18px;flex-shrink:0;">📚</div>
  1901. <div style="flex:1;">
  1902. <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;">
  1903. <span class="fw500" style="font-size:13px;">学习培训通知</span>
  1904. <span class="text-xs text-gray">1小时前</span>
  1905. </div>
  1906. <div class="text-xs text-gray" style="line-height:1.6;">2026年春季实验室安全知识讲座已开始报名,活动时间:2026-03-01 10:00,地点:学术报告厅A201,请及时参加。</div>
  1907. <div style="margin-top:6px;"><span class="tag tag-green text-xs" onclick="goto('screen-training-detail')" style="cursor:pointer;">查看详情 ›</span></div>
  1908. </div>
  1909. </div>
  1910. </div>
  1911. <!-- 学习培训2 -->
  1912. <div class="card" style="margin:0 0 10px;padding:14px;">
  1913. <div style="display:flex;align-items:flex-start;gap:10px;">
  1914. <div style="width:36px;height:36px;border-radius:8px;background:#f6ffed;display:flex;align-items:center;justify-content:center;font-size:18px;flex-shrink:0;">📚</div>
  1915. <div style="flex:1;">
  1916. <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;">
  1917. <span class="fw500" style="font-size:13px;">学习任务提醒</span>
  1918. <span class="text-xs text-gray">昨天</span>
  1919. </div>
  1920. <div class="text-xs text-gray" style="line-height:1.6;">您有2项学习任务待完成:实验室安全基础知识、生物安全操作规范,请及时完成。</div>
  1921. <div style="margin-top:6px;"><span class="tag tag-blue text-xs" onclick="goto('screen-knowledge-list')" style="cursor:pointer;">去学习 ›</span></div>
  1922. </div>
  1923. </div>
  1924. </div>
  1925. <!-- 在线考试2 -->
  1926. <div class="card" style="margin:0;padding:14px;">
  1927. <div style="display:flex;align-items:flex-start;gap:10px;">
  1928. <div style="width:36px;height:36px;border-radius:8px;background:#fff7e6;display:flex;align-items:center;justify-content:center;font-size:18px;flex-shrink:0;">🎓</div>
  1929. <div style="flex:1;">
  1930. <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;">
  1931. <span class="fw500" style="font-size:13px;">模拟考试开放通知</span>
  1932. <span class="text-xs text-gray">2天前</span>
  1933. </div>
  1934. <div class="text-xs text-gray" style="line-height:1.6;">应知应会模拟考试已开放,建议在正式考试前完成模拟练习,熟悉题型。</div>
  1935. <div style="margin-top:6px;"><span class="tag tag-blue text-xs" onclick="goto('screen-exam-list')" style="cursor:pointer;">去练习 ›</span></div>
  1936. </div>
  1937. </div>
  1938. </div>
  1939. </div>
  1940. </div>
  1941. <!-- SCREEN: 线下培训详情 -->
  1942. <div class="screen" id="screen-training-detail">
  1943. <div class="topbar">
  1944. <div class="topbar-back" onclick="goBack()">&#8249; 返回</div>
  1945. <div class="topbar-title">培训详情</div>
  1946. <!-- 老师端:顶栏发布开关 -->
  1947. <div id="td-teacher-topbar" style="display:none;align-items:center;gap:6px;padding-right:4px;">
  1948. <span id="td-publish-label" style="font-size:11px;color:#52c41a;font-weight:500;white-space:nowrap;">已发布</span>
  1949. <div id="td-publish-toggle" onclick="toggleDetailPublish()" style="width:40px;height:22px;border-radius:11px;background:#52c41a;cursor:pointer;position:relative;transition:background .2s;flex-shrink:0;">
  1950. <div id="td-publish-knob" style="position:absolute;top:4px;right:4px;width:14px;height:14px;border-radius:50%;background:#fff;transition:right .2s,left .2s;"></div>
  1951. </div>
  1952. </div>
  1953. </div>
  1954. <div class="scroll-content" style="padding:12px;">
  1955. <!-- 状态标签(动态) -->
  1956. <div id="td-status-bar" style="display:flex;align-items:center;gap:8px;margin-bottom:12px;">
  1957. <span id="td-status-tag" style="font-size:11px;background:#fff7e6;color:#fa8c16;border:1px solid #ffd591;border-radius:10px;padding:3px 10px;font-weight:500;">● 进行中</span>
  1958. <span class="tag tag-blue text-xs" id="td-type-tag">知识讲座</span>
  1959. </div>
  1960. <!-- 标题 -->
  1961. <div id="td-title" style="font-size:17px;font-weight:700;color:#1a1a1a;margin-bottom:16px;">2026年春季实验室安全知识讲座</div>
  1962. <!-- 信息卡片 -->
  1963. <div style="border:1px solid #f0f0f0;border-radius:10px;overflow:hidden;margin-bottom:14px;">
  1964. <table style="width:100%;border-collapse:collapse;font-size:13px;">
  1965. <tr style="border-bottom:1px solid #f5f5f5;">
  1966. <td style="padding:10px 14px;color:#888;background:#fafafa;width:30%;white-space:nowrap;">培训时间</td>
  1967. <td id="td-time" style="padding:10px 14px;color:#333;font-weight:500;">2026-03-01 &nbsp; 10:00 – 11:00</td>
  1968. </tr>
  1969. <tr style="border-bottom:1px solid #f5f5f5;">
  1970. <td style="padding:10px 14px;color:#888;background:#fafafa;">培训地点</td>
  1971. <td id="td-location" style="padding:10px 14px;color:#333;">📍 学术报告厅 A201</td>
  1972. </tr>
  1973. <tr style="border-bottom:1px solid #f5f5f5;">
  1974. <td style="padding:10px 14px;color:#888;background:#fafafa;">组织单位</td>
  1975. <td id="td-org" style="padding:10px 14px;color:#333;">🏢 生命科学学院</td>
  1976. </tr>
  1977. <tr style="border-bottom:1px solid #f5f5f5;">
  1978. <td style="padding:10px 14px;color:#888;background:#fafafa;">主讲人</td>
  1979. <td id="td-lecturer" style="padding:10px 14px;color:#333;">李明教授</td>
  1980. </tr>
  1981. <tr style="border-bottom:1px solid #f5f5f5;">
  1982. <td style="padding:10px 14px;color:#888;background:#fafafa;">培训时长</td>
  1983. <td id="td-duration" style="padding:10px 14px;color:#333;">60 分钟</td>
  1984. </tr>
  1985. <tr style="border-bottom:1px solid #f5f5f5;">
  1986. <td style="padding:10px 14px;color:#888;background:#fafafa;">可得学时</td>
  1987. <td style="padding:10px 14px;color:#1677ff;font-weight:600;">+ 1 学时</td>
  1988. </tr>
  1989. <tr>
  1990. <td style="padding:10px 14px;color:#888;background:#fafafa;">可得积分</td>
  1991. <td style="padding:10px 14px;color:#fa8c16;font-weight:600;">+ 10 奖励分</td>
  1992. </tr>
  1993. </table>
  1994. </div>
  1995. <!-- 未发布提示横幅(老师端草稿状态) -->
  1996. <div id="td-unpublished-banner" style="display:none;border:1px dashed #faad14;border-radius:10px;padding:10px 14px;background:#fffbe6;margin-bottom:14px;">
  1997. <div style="display:flex;align-items:center;gap:8px;">
  1998. <span style="font-size:16px;">⚠️</span>
  1999. <div>
  2000. <div style="font-size:13px;font-weight:600;color:#d48806;">草稿 · 未发布</div>
  2001. <div style="font-size:12px;color:#ad8b00;margin-top:2px;">此培训尚未对学员可见,请发布后学员才能参与报名。</div>
  2002. </div>
  2003. </div>
  2004. </div>
  2005. <!-- 签到人数统计(管理端显示) -->
  2006. <div id="td-signin-stats" style="display:none;margin-bottom:14px;">
  2007. <div style="font-size:13px;font-weight:600;color:#1a1a1a;margin-bottom:8px;">签到统计</div>
  2008. <div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px;">
  2009. <div style="background:linear-gradient(135deg,#e6f4ff,#bae0ff);border-radius:12px;padding:14px 10px;text-align:center;border:1px solid #91caff;">
  2010. <div style="font-size:28px;font-weight:800;color:#0958d9;line-height:1.1;">32</div>
  2011. <div style="font-size:11px;color:#4096ff;margin-top:4px;font-weight:500;">总人数</div>
  2012. </div>
  2013. <div style="background:linear-gradient(135deg,#f6ffed,#d9f7be);border-radius:12px;padding:14px 10px;text-align:center;border:1px solid #b7eb8f;">
  2014. <div style="font-size:28px;font-weight:800;color:#389e0d;line-height:1.1;">18</div>
  2015. <div style="font-size:11px;color:#52c41a;margin-top:4px;font-weight:500;">已签到</div>
  2016. </div>
  2017. <div style="background:linear-gradient(135deg,#fff7e6,#ffe7ba);border-radius:12px;padding:14px 10px;text-align:center;border:1px solid #ffd591;">
  2018. <div style="font-size:28px;font-weight:800;color:#d46b08;line-height:1.1;">14</div>
  2019. <div style="font-size:11px;color:#fa8c16;margin-top:4px;font-weight:500;">未签到</div>
  2020. </div>
  2021. </div>
  2022. <!-- 进度条 -->
  2023. <div style="margin-top:10px;background:#f0f0f0;border-radius:20px;height:8px;overflow:hidden;">
  2024. <div style="width:56.25%;height:100%;background:linear-gradient(90deg,#52c41a,#73d13d);border-radius:20px;transition:width .4s;"></div>
  2025. </div>
  2026. <div style="font-size:11px;color:#888;margin-top:4px;text-align:right;">签到率 56.25%</div>
  2027. </div>
  2028. <!-- 签到区域(进行中时显示) -->
  2029. <div id="td-signin-section" style="border:1px solid #ffadd2;border-radius:10px;padding:14px;background:linear-gradient(135deg,#fff0f6,#fff7e6);text-align:center;margin-bottom:14px;">
  2030. <div style="font-size:13px;font-weight:600;color:#c41d7f;margin-bottom:10px;">现场签到</div>
  2031. <button onclick="openScanModal()" style="width:72px;height:72px;border-radius:12px;border:1.5px solid #eb2f96;background:#fff;color:#c41d7f;cursor:pointer;display:inline-flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;margin-bottom:6px;">
  2032. <span style="font-size:28px;line-height:1;">📷</span>
  2033. <span style="font-size:10px;font-weight:500;">扫码签到</span>
  2034. </button>
  2035. <div class="text-xs fw500" id="td-sign-status" style="color:#fa8c16;">● 未签到</div>
  2036. </div>
  2037. <!-- 培训证明上传区域(进行中时显示) -->
  2038. <div id="td-upload-section" style="border:1px solid #91caff;border-radius:10px;padding:14px;background:linear-gradient(135deg,#e6f4ff,#f0f9ff);margin-bottom:14px;">
  2039. <div style="display:flex;align-items:center;gap:6px;margin-bottom:10px;">
  2040. <span style="font-size:15px;">🖼️</span>
  2041. <span style="font-size:13px;font-weight:600;color:#1677ff;">上传培训证明</span>
  2042. <span style="font-size:11px;color:#999;margin-left:2px;">(如签到截图、现场照片等)</span>
  2043. </div>
  2044. <!-- 已选图片预览区 -->
  2045. <div id="td-upload-preview" style="display:flex;flex-wrap:wrap;gap:8px;margin-bottom:10px;"></div>
  2046. <!-- 上传按钮区 -->
  2047. <div style="display:flex;align-items:center;gap:10px;">
  2048. <label id="td-upload-btn" style="display:inline-flex;align-items:center;gap:6px;padding:8px 16px;border-radius:8px;border:1.5px dashed #4096ff;background:#fff;color:#1677ff;font-size:13px;font-weight:500;cursor:pointer;">
  2049. <span style="font-size:16px;">+</span> 选择图片
  2050. <input type="file" id="td-file-input" accept="image/*" multiple style="display:none;" onchange="onTrainingProofSelect(this)" />
  2051. </label>
  2052. <button id="td-submit-proof-btn" onclick="submitTrainingProof()" style="display:none;padding:8px 20px;border-radius:8px;border:none;background:#1677ff;color:#fff;font-size:13px;font-weight:500;cursor:pointer;">提交证明</button>
  2053. </div>
  2054. <div style="font-size:11px;color:#aaa;margin-top:8px;">支持 JPG、PNG 格式,单张不超过 10MB,最多上传 5 张</div>
  2055. </div>
  2056. <!-- 已上传图片展示区域(已完成时显示) -->
  2057. <div id="td-done-section" style="display:none;">
  2058. <!-- 完成状态提示 -->
  2059. <div style="border:1px solid #b7eb8f;border-radius:10px;padding:12px 14px;background:#f6ffed;display:flex;align-items:center;gap:10px;margin-bottom:14px;">
  2060. <span style="font-size:22px;">✅</span>
  2061. <div>
  2062. <div style="font-size:13px;font-weight:600;color:#389e0d;">培训已完成</div>
  2063. <div style="font-size:12px;color:#73d13d;margin-top:2px;">已签到并获得 1 学时 · +10 奖励分</div>
  2064. </div>
  2065. </div>
  2066. <!-- 已上传培训证明图片 -->
  2067. <div style="border:1px solid #f0f0f0;border-radius:10px;padding:14px;background:#fff;">
  2068. <div style="display:flex;align-items:center;gap:6px;margin-bottom:12px;">
  2069. <span style="font-size:15px;">🖼️</span>
  2070. <span style="font-size:13px;font-weight:600;color:#1a1a1a;">培训证明图片</span>
  2071. </div>
  2072. <div id="td-done-images" style="display:flex;flex-wrap:wrap;gap:8px;">
  2073. <!-- 示例:已上传图片(静态示意) -->
  2074. <div style="position:relative;width:80px;height:80px;border-radius:8px;overflow:hidden;border:1px solid #f0f0f0;background:linear-gradient(135deg,#e6f4ff,#bae0ff);display:flex;align-items:center;justify-content:center;cursor:pointer;" onclick="openProofImageViewer(0)">
  2075. <span style="font-size:28px;">📄</span>
  2076. <div style="position:absolute;bottom:0;left:0;right:0;background:rgba(0,0,0,.4);color:#fff;font-size:9px;text-align:center;padding:2px;">证明1.jpg</div>
  2077. </div>
  2078. <div style="position:relative;width:80px;height:80px;border-radius:8px;overflow:hidden;border:1px solid #f0f0f0;background:linear-gradient(135deg,#fff7e6,#ffd591);display:flex;align-items:center;justify-content:center;cursor:pointer;" onclick="openProofImageViewer(1)">
  2079. <span style="font-size:28px;">🏅</span>
  2080. <div style="position:absolute;bottom:0;left:0;right:0;background:rgba(0,0,0,.4);color:#fff;font-size:9px;text-align:center;padding:2px;">证明2.jpg</div>
  2081. </div>
  2082. </div>
  2083. <div style="font-size:11px;color:#bbb;margin-top:10px;">共 2 张 · 上传于 2025-10-20</div>
  2084. </div>
  2085. </div>
  2086. <!-- 签到名单(管理端显示) -->
  2087. <div id="td-roster-section" style="display:none;margin-top:14px;">
  2088. <!-- Tab 切换 -->
  2089. <div style="display:flex;border-bottom:2px solid var(--gray-border);margin-bottom:12px;">
  2090. <div id="roster-tab-0" onclick="switchRosterTab(0)" style="flex:1;text-align:center;padding:9px 4px 8px;font-size:13px;font-weight:600;color:#1677ff;border-bottom:2px solid #1677ff;margin-bottom:-2px;cursor:pointer;">已签到 <span style="background:#52c41a;color:#fff;border-radius:10px;padding:1px 7px;font-size:11px;font-weight:600;">18</span></div>
  2091. <div id="roster-tab-1" onclick="switchRosterTab(1)" style="flex:1;text-align:center;padding:9px 4px 8px;font-size:13px;color:#888;border-bottom:2px solid transparent;margin-bottom:-2px;cursor:pointer;">未签到 <span style="background:#fa8c16;color:#fff;border-radius:10px;padding:1px 7px;font-size:11px;font-weight:600;">14</span></div>
  2092. </div>
  2093. <!-- 已签到名单 -->
  2094. <div id="roster-panel-0">
  2095. <div style="display:flex;flex-direction:column;gap:8px;">
  2096. <div style="display:flex;align-items:center;gap:10px;background:#f6ffed;border:1px solid #d9f7be;border-radius:10px;padding:10px 12px;">
  2097. <div style="width:36px;height:36px;border-radius:50%;background:linear-gradient(135deg,#52c41a,#73d13d);display:flex;align-items:center;justify-content:center;color:#fff;font-size:15px;font-weight:700;flex-shrink:0;">张</div>
  2098. <div style="flex:1;">
  2099. <div style="font-size:13px;font-weight:600;">张伟</div>
  2100. <div style="font-size:11px;color:#888;margin-top:2px;">2021030045 · 化学与化工学院</div>
  2101. </div>
  2102. <div style="text-align:right;"><div style="font-size:11px;color:#52c41a;font-weight:500;">✓ 已签到</div><div style="font-size:10px;color:#aaa;margin-top:2px;">10:03</div></div>
  2103. </div>
  2104. <div style="display:flex;align-items:center;gap:10px;background:#f6ffed;border:1px solid #d9f7be;border-radius:10px;padding:10px 12px;">
  2105. <div style="width:36px;height:36px;border-radius:50%;background:linear-gradient(135deg,#1677ff,#4096ff);display:flex;align-items:center;justify-content:center;color:#fff;font-size:15px;font-weight:700;flex-shrink:0;">李</div>
  2106. <div style="flex:1;">
  2107. <div style="font-size:13px;font-weight:600;">李娜</div>
  2108. <div style="font-size:11px;color:#888;margin-top:2px;">2022150112 · 生命科学学院</div>
  2109. </div>
  2110. <div style="text-align:right;"><div style="font-size:11px;color:#52c41a;font-weight:500;">✓ 已签到</div><div style="font-size:10px;color:#aaa;margin-top:2px;">10:07</div></div>
  2111. </div>
  2112. <div style="display:flex;align-items:center;gap:10px;background:#f6ffed;border:1px solid #d9f7be;border-radius:10px;padding:10px 12px;">
  2113. <div style="width:36px;height:36px;border-radius:50%;background:linear-gradient(135deg,#eb2f96,#ff85c2);display:flex;align-items:center;justify-content:center;color:#fff;font-size:15px;font-weight:700;flex-shrink:0;">王</div>
  2114. <div style="flex:1;">
  2115. <div style="font-size:13px;font-weight:600;">王芳</div>
  2116. <div style="font-size:11px;color:#888;margin-top:2px;">2023080067 · 物理学院</div>
  2117. </div>
  2118. <div style="text-align:right;"><div style="font-size:11px;color:#52c41a;font-weight:500;">✓ 已签到</div><div style="font-size:10px;color:#aaa;margin-top:2px;">10:12</div></div>
  2119. </div>
  2120. <div style="display:flex;align-items:center;gap:10px;background:#f6ffed;border:1px solid #d9f7be;border-radius:10px;padding:10px 12px;">
  2121. <div style="width:36px;height:36px;border-radius:50%;background:linear-gradient(135deg,#722ed1,#9254de);display:flex;align-items:center;justify-content:center;color:#fff;font-size:15px;font-weight:700;flex-shrink:0;">刘</div>
  2122. <div style="flex:1;">
  2123. <div style="font-size:13px;font-weight:600;">刘洋</div>
  2124. <div style="font-size:11px;color:#888;margin-top:2px;">2020040089 · 材料学院</div>
  2125. </div>
  2126. <div style="text-align:right;"><div style="font-size:11px;color:#52c41a;font-weight:500;">✓ 已签到</div><div style="font-size:10px;color:#aaa;margin-top:2px;">10:15</div></div>
  2127. </div>
  2128. <div style="text-align:center;padding:8px 0;color:var(--text-hint);font-size:12px;">…… 共18人已签到 ……</div>
  2129. </div>
  2130. </div>
  2131. <!-- 未签到名单 -->
  2132. <div id="roster-panel-1" style="display:none;">
  2133. <div style="display:flex;flex-direction:column;gap:8px;">
  2134. <div style="display:flex;align-items:center;gap:10px;background:#fff7e6;border:1px solid #ffe7ba;border-radius:10px;padding:10px 12px;">
  2135. <div style="width:36px;height:36px;border-radius:50%;background:linear-gradient(135deg,#fa8c16,#ffa940);display:flex;align-items:center;justify-content:center;color:#fff;font-size:15px;font-weight:700;flex-shrink:0;">赵</div>
  2136. <div style="flex:1;">
  2137. <div style="font-size:13px;font-weight:600;">赵磊</div>
  2138. <div style="font-size:11px;color:#888;margin-top:2px;">2022060033 · 计算机学院</div>
  2139. </div>
  2140. <div style="text-align:right;"><div style="font-size:11px;color:#fa8c16;font-weight:500;">● 未签到</div></div>
  2141. </div>
  2142. <div style="display:flex;align-items:center;gap:10px;background:#fff7e6;border:1px solid #ffe7ba;border-radius:10px;padding:10px 12px;">
  2143. <div style="width:36px;height:36px;border-radius:50%;background:linear-gradient(135deg,#13c2c2,#36cfc9);display:flex;align-items:center;justify-content:center;color:#fff;font-size:15px;font-weight:700;flex-shrink:0;">陈</div>
  2144. <div style="flex:1;">
  2145. <div style="font-size:13px;font-weight:600;">陈静</div>
  2146. <div style="font-size:11px;color:#888;margin-top:2px;">2023110024 · 环境学院</div>
  2147. </div>
  2148. <div style="text-align:right;"><div style="font-size:11px;color:#fa8c16;font-weight:500;">● 未签到</div></div>
  2149. </div>
  2150. <div style="display:flex;align-items:center;gap:10px;background:#fff7e6;border:1px solid #ffe7ba;border-radius:10px;padding:10px 12px;">
  2151. <div style="width:36px;height:36px;border-radius:50%;background:linear-gradient(135deg,#f5222d,#ff4d4f);display:flex;align-items:center;justify-content:center;color:#fff;font-size:15px;font-weight:700;flex-shrink:0;">孙</div>
  2152. <div style="flex:1;">
  2153. <div style="font-size:13px;font-weight:600;">孙浩</div>
  2154. <div style="font-size:11px;color:#888;margin-top:2px;">2021070056 · 机械学院</div>
  2155. </div>
  2156. <div style="text-align:right;"><div style="font-size:11px;color:#fa8c16;font-weight:500;">● 未签到</div></div>
  2157. </div>
  2158. <div style="display:flex;align-items:center;gap:10px;background:#fff7e6;border:1px solid #ffe7ba;border-radius:10px;padding:10px 12px;">
  2159. <div style="width:36px;height:36px;border-radius:50%;background:linear-gradient(135deg,#08979c,#13c2c2);display:flex;align-items:center;justify-content:center;color:#fff;font-size:15px;font-weight:700;flex-shrink:0;">周</div>
  2160. <div style="flex:1;">
  2161. <div style="font-size:13px;font-weight:600;">周梅</div>
  2162. <div style="font-size:11px;color:#888;margin-top:2px;">2022030078 · 化学与化工学院</div>
  2163. </div>
  2164. <div style="text-align:right;"><div style="font-size:11px;color:#fa8c16;font-weight:500;">● 未签到</div></div>
  2165. </div>
  2166. <div style="text-align:center;padding:8px 0;color:var(--text-hint);font-size:12px;">…… 共14人未签到 ……</div>
  2167. </div>
  2168. </div>
  2169. </div>
  2170. </div>
  2171. </div>
  2172. <div class="screen" id="screen-practice-list">
  2173. <div style="background:var(--white);border-bottom:1px solid var(--gray-border);flex-shrink:0;">
  2174. <div class="topbar" style="border-bottom:none;">
  2175. <div style="visibility:hidden;width:40px;"></div>
  2176. <div class="topbar-title">刷题练习</div>
  2177. <div></div>
  2178. </div>
  2179. <div class="tag-scroll" style="padding:8px 12px 10px;">
  2180. <span class="tag tag-gray active" onclick="setPracticeTag(this,'all')">全部</span>
  2181. <span class="tag tag-gray" onclick="setPracticeTag(this,'通识安全')">通识安全</span>
  2182. <span class="tag tag-gray" onclick="setPracticeTag(this,'生物类')">生物类</span>
  2183. <span class="tag tag-gray" onclick="setPracticeTag(this,'辐射类')">辐射类</span>
  2184. <span class="tag tag-gray" onclick="setPracticeTag(this,'化学')">化学</span>
  2185. <span class="tag tag-gray" onclick="setPracticeTag(this,'应急')">应急</span>
  2186. <span class="tag tag-gray" onclick="setPracticeTag(this,'机电类')">机电类</span>
  2187. </div>
  2188. </div>
  2189. <div class="scroll-content" style="padding:12px;">
  2190. <div class="card practice-item" data-cat="通识安全" style="margin:0 0 10px;cursor:pointer;" onclick="goto('screen-practice-detail')">
  2191. <div class="row-between mb8">
  2192. <div><span class="tag tag-blue text-xs">通识安全</span></div>
  2193. <span style="font-size:12px;color:var(--blue);">500 题</span>
  2194. </div>
  2195. <div class="fw500 mb4">通识安全知识点</div>
  2196. <div class="text-xs text-gray mb8">已答 150 题 · 正确率 82%</div>
  2197. <div style="display:flex;align-items:center;gap:8px;">
  2198. <div class="progress-wrap" style="flex:1;"><div class="progress-bar" style="width:30%"></div></div>
  2199. <span style="font-size:12px;font-weight:700;color:var(--blue);width:32px;text-align:right;">30%</span>
  2200. </div>
  2201. </div>
  2202. <div class="card practice-item" data-cat="生物类" style="margin:0 0 10px;cursor:pointer;" onclick="goto('screen-practice-detail')">
  2203. <div class="row-between mb8">
  2204. <div><span class="tag tag-green text-xs">生物类</span></div>
  2205. <span style="font-size:12px;color:var(--green);">369 题</span>
  2206. </div>
  2207. <div class="fw500 mb4">生物安全知识点</div>
  2208. <div class="text-xs text-gray mb8">已答 33 题 · 正确率 96%</div>
  2209. <div style="display:flex;align-items:center;gap:8px;">
  2210. <div class="progress-wrap" style="flex:1;"><div class="progress-bar" style="width:9%;background:var(--green)"></div></div>
  2211. <span style="font-size:12px;font-weight:700;color:var(--green);width:32px;text-align:right;">9%</span>
  2212. </div>
  2213. </div>
  2214. <div class="card practice-item" data-cat="化学" style="margin:0 0 10px;cursor:pointer;" onclick="goto('screen-practice-detail')">
  2215. <div class="row-between mb8">
  2216. <div><span class="tag tag-orange text-xs">化学</span></div>
  2217. <span style="font-size:12px;color:var(--text-hint);">280 题</span>
  2218. </div>
  2219. <div class="fw500 mb4">化学品安全知识点</div>
  2220. <div class="text-xs text-gray mb8">未开始</div>
  2221. <div style="display:flex;align-items:center;gap:8px;">
  2222. <div class="progress-wrap" style="flex:1;"><div class="progress-bar" style="width:0%"></div></div>
  2223. <span style="font-size:12px;font-weight:700;color:var(--text-hint);width:32px;text-align:right;">0%</span>
  2224. </div>
  2225. </div>
  2226. <div class="card practice-item" data-cat="辐射类" style="margin:0 0 10px;cursor:pointer;" onclick="goto('screen-practice-detail')">
  2227. <div class="row-between mb8">
  2228. <div><span class="tag tag-blue text-xs">辐射类</span></div>
  2229. <span style="font-size:12px;color:var(--text-hint);">180 题</span>
  2230. </div>
  2231. <div class="fw500 mb4">辐射安全知识点</div>
  2232. <div class="text-xs text-gray mb8">未开始</div>
  2233. <div style="display:flex;align-items:center;gap:8px;">
  2234. <div class="progress-wrap" style="flex:1;"><div class="progress-bar" style="width:0%"></div></div>
  2235. <span style="font-size:12px;font-weight:700;color:var(--text-hint);width:32px;text-align:right;">0%</span>
  2236. </div>
  2237. </div>
  2238. <div class="card practice-item" data-cat="应急" style="margin:0 0 10px;cursor:pointer;" onclick="goto('screen-practice-detail')">
  2239. <div class="row-between mb8">
  2240. <div><span class="tag tag-orange text-xs">应急</span></div>
  2241. <span style="font-size:12px;color:var(--text-hint);">220 题</span>
  2242. </div>
  2243. <div class="fw500 mb4">应急处置知识点</div>
  2244. <div class="text-xs text-gray mb8">已答 12 题 · 正确率 75%</div>
  2245. <div style="display:flex;align-items:center;gap:8px;">
  2246. <div class="progress-wrap" style="flex:1;"><div class="progress-bar" style="width:5%;background:#fa8c16"></div></div>
  2247. <span style="font-size:12px;font-weight:700;color:#fa8c16;width:32px;text-align:right;">5%</span>
  2248. </div>
  2249. </div>
  2250. <div class="card practice-item" data-cat="机电类" style="margin:0;cursor:pointer;" onclick="goto('screen-practice-detail')">
  2251. <div class="row-between mb8">
  2252. <div><span class="tag tag-gray text-xs">机电类</span></div>
  2253. <span style="font-size:12px;color:var(--text-hint);">150 题</span>
  2254. </div>
  2255. <div class="fw500 mb4">机电安全知识点</div>
  2256. <div class="text-xs text-gray mb8">未开始</div>
  2257. <div style="display:flex;align-items:center;gap:8px;">
  2258. <div class="progress-wrap" style="flex:1;"><div class="progress-bar" style="width:0%"></div></div>
  2259. <span style="font-size:12px;font-weight:700;color:var(--text-hint);width:32px;text-align:right;">0%</span>
  2260. </div>
  2261. </div>
  2262. </div>
  2263. <div class="bottom-tab">
  2264. <div class="tab-item"><span class="tab-icon">🏠</span><span>工作台</span></div>
  2265. <div class="tab-item"><span class="tab-icon">📚</span><span>学习培训</span></div>
  2266. <div class="tab-item"><span class="tab-icon">🎓</span><span>在线考试</span></div>
  2267. <div class="tab-item active"><span class="tab-icon">✏️</span><span>刷题练习</span></div>
  2268. </div>
  2269. </div>
  2270. <!-- SCREEN: 开始答题 -->
  2271. <div class="screen exam-screen" id="screen-practice-detail">
  2272. <div class="topbar">
  2273. <div class="topbar-back" onclick="goBack()">&#8249; 退出</div>
  2274. <div class="topbar-title">生物安全知识点</div>
  2275. <div class="text-sm text-blue" onclick="togglePracticeNav()">题号</div>
  2276. </div>
  2277. <!-- 醒目剩余时间(练习模式显示已用时) -->
  2278. <div style="background:linear-gradient(90deg,#52c41a,#389e0d);padding:6px 16px;display:flex;align-items:center;justify-content:center;gap:8px;flex-shrink:0;">
  2279. <span style="color:rgba(255,255,255,.8);font-size:12px;">练习用时</span>
  2280. <span id="practiceTimer" style="color:#fff;font-size:22px;font-weight:700;letter-spacing:2px;font-variant-numeric:tabular-nums;">08:45</span>
  2281. <span style="color:rgba(255,255,255,.6);font-size:11px;">刷题练习模式</span>
  2282. </div>
  2283. <div style="flex:1;overflow-y:auto;padding:12px;">
  2284. <div class="stat-row">
  2285. <div class="stat-item"><div class="text-xs text-gray">已答</div><div class="stat-val text-blue">33</div></div>
  2286. <div class="stat-item"><div class="text-xs text-gray">正确</div><div class="stat-val correct-c">30</div></div>
  2287. <div class="stat-item"><div class="text-xs text-gray">错误</div><div class="stat-val wrong-c">3</div></div>
  2288. <div class="stat-item"><div class="text-xs text-gray">正确率</div><div class="stat-val text-blue">91%</div></div>
  2289. </div>
  2290. <div id="practiceQNav" style="display:none;background:var(--white);border-radius:10px;padding:12px;margin-bottom:12px;">
  2291. <div class="text-sm fw500 mb8">答题记录</div>
  2292. <div class="q-nav">
  2293. <div class="q-num answered" onclick="jumpToPQ(1)">1</div><div class="q-num answered" onclick="jumpToPQ(2)">2</div><div class="q-num answered" onclick="jumpToPQ(3)">3</div>
  2294. <div class="q-num wrong-q" onclick="jumpToPQ(4)">4</div><div class="q-num answered" onclick="jumpToPQ(5)">5</div><div class="q-num answered" onclick="jumpToPQ(6)">6</div>
  2295. <div class="q-num answered" onclick="jumpToPQ(7)">7</div><div class="q-num wrong-q" onclick="jumpToPQ(8)">8</div><div class="q-num answered" onclick="jumpToPQ(9)">9</div>
  2296. <div class="q-num answered" onclick="jumpToPQ(10)">10</div><div class="q-num current" id="pqnum-34" onclick="jumpToPQ(34)">34</div>
  2297. </div>
  2298. <div style="display:flex;gap:8px;margin-top:10px;flex-wrap:wrap;">
  2299. <div style="display:flex;align-items:center;gap:4px;font-size:11px;"><div class="q-num answered" style="width:20px;height:20px;font-size:10px;"></div>已答</div>
  2300. <div style="display:flex;align-items:center;gap:4px;font-size:11px;"><div class="q-num wrong-q" style="width:20px;height:20px;font-size:10px;"></div>答错</div>
  2301. <div style="display:flex;align-items:center;gap:4px;font-size:11px;"><div class="q-num current" style="width:20px;height:20px;font-size:10px;"></div>当前</div>
  2302. </div>
  2303. </div>
  2304. <div style="background:var(--white);border-radius:10px;padding:14px;">
  2305. <div class="q-header">
  2306. <span class="q-type-badge">判断题</span>
  2307. <span class="text-sm fw500" id="pqLabel">第 34 题</span>
  2308. <span class="diff-easy" style="margin-left:6px;">简单</span>
  2309. <span id="toggleAnswerBtn2" class="see-answer-btn" onclick="toggleAnswer()">查看答案</span>
  2310. <div class="q-content" id="pqContent">实验室废液可以直接倒入普通下水道排放,不需要进行无害化处理。</div>
  2311. </div>
  2312. <div class="q-options" style="margin-top:14px;" id="pqOptions">
  2313. <div class="q-option" onclick="selectOption(this)"><div class="q-radio"></div><span class="q-opt-key">A.</span><span>正确</span></div>
  2314. <div class="q-option" onclick="selectOption(this)"><div class="q-radio"></div><span class="q-opt-key">B.</span><span>错误</span></div>
  2315. </div>
  2316. <div class="answer-box" id="answerBox" style="display:none;">
  2317. <span class="answer-label">正确答案:B(错误)</span>
  2318. <div class="answer-analysis">实验室废液必须经过无害化处理后才能排放,直接排入下水道会造成环境污染,违反危险废物污染防治相关规定。</div>
  2319. </div>
  2320. <div style="display:flex;justify-content:space-between;margin-top:16px;">
  2321. <button class="btn btn-outline btn-sm" onclick="jumpToPQ(currentPQ-1)">上一题</button>
  2322. <button class="btn btn-primary btn-sm" onclick="jumpToPQ(currentPQ+1)">下一题</button>
  2323. </div>
  2324. </div>
  2325. </div>
  2326. </div>
  2327. <script>
  2328. // ===== NAVIGATION =====
  2329. var history_stack = [];
  2330. function goto(screenId) {
  2331. var current = document.querySelector('.screen.active');
  2332. if (current) {
  2333. if (current.id !== screenId) history_stack.push(current.id);
  2334. current.classList.remove('active');
  2335. }
  2336. var next = document.getElementById(screenId);
  2337. if (!next) return;
  2338. next.classList.add('active');
  2339. window.scrollTo(0, 0);
  2340. var sc = next.querySelector('.scroll-content');
  2341. if (sc) sc.scrollTop = 0;
  2342. syncBottomTab(screenId);
  2343. }
  2344. function goBack() {
  2345. if (history_stack.length > 0) {
  2346. var prev = history_stack.pop();
  2347. var current = document.querySelector('.screen.active');
  2348. if (current) current.classList.remove('active');
  2349. var prevEl = document.getElementById(prev);
  2350. if (prevEl) {
  2351. prevEl.classList.add('active');
  2352. syncBottomTab(prevEl.id);
  2353. }
  2354. } else {
  2355. goto('screen-home');
  2356. }
  2357. }
  2358. // ===== BOTTOM TAB SYNC =====
  2359. var tabScreenMap = {
  2360. 'screen-home': 0,
  2361. 'screen-knowledge-list': 1,
  2362. 'screen-exam-list': 2,
  2363. 'screen-practice-list': 3,
  2364. 'screen-my': 4
  2365. };
  2366. function syncBottomTab(screenId) {
  2367. var idx = tabScreenMap[screenId];
  2368. // Update the tab bar inside the now-active screen
  2369. var activeScreen = document.getElementById(screenId);
  2370. if (!activeScreen) return;
  2371. var tabs = activeScreen.querySelectorAll('.bottom-tab .tab-item');
  2372. if (!tabs.length) return;
  2373. if (idx === undefined) return; // sub-page, no bottom tab to sync
  2374. tabs.forEach(function(t, i) {
  2375. t.classList.toggle('active', i === idx);
  2376. });
  2377. }
  2378. // ===== TOAST =====
  2379. function showToast(msg, duration) {
  2380. var existing = document.getElementById('__toast');
  2381. if (existing) existing.remove();
  2382. var t = document.createElement('div');
  2383. t.id = '__toast';
  2384. t.textContent = msg;
  2385. t.style.cssText = 'position:fixed;bottom:90px;left:50%;transform:translateX(-50%);background:rgba(0,0,0,0.72);color:#fff;padding:9px 22px;border-radius:20px;font-size:14px;z-index:9999;pointer-events:none;opacity:1;transition:opacity 0.4s;';
  2386. document.body.appendChild(t);
  2387. setTimeout(function() {
  2388. t.style.opacity = '0';
  2389. setTimeout(function() { t.remove(); }, 400);
  2390. }, duration || 2000);
  2391. }
  2392. // ===== KNOWLEDGE TAG =====
  2393. function setKnowTag(el) {
  2394. var parent = el.parentElement;
  2395. parent.querySelectorAll('.tag').forEach(function(t) {
  2396. t.classList.remove('active');
  2397. t.style.background = '';
  2398. t.style.color = '';
  2399. });
  2400. el.classList.add('active');
  2401. el.style.background = 'var(--blue)';
  2402. el.style.color = 'white';
  2403. }
  2404. // ===== PRACTICE TAG =====
  2405. function setPracticeTag(el, cat) {
  2406. var parent = el.parentElement;
  2407. parent.querySelectorAll('.tag').forEach(function(t) {
  2408. t.classList.remove('active');
  2409. t.style.background = '';
  2410. t.style.color = '';
  2411. });
  2412. el.classList.add('active');
  2413. el.style.background = 'var(--blue)';
  2414. el.style.color = 'white';
  2415. document.querySelectorAll('.practice-item').forEach(function(item) {
  2416. if (cat === 'all' || item.dataset.cat === cat) {
  2417. item.style.display = '';
  2418. } else {
  2419. item.style.display = 'none';
  2420. }
  2421. });
  2422. }
  2423. // ===== Q OPTION SELECT =====
  2424. function selectOption(el) {
  2425. var container = el.closest('.q-options');
  2426. if (!container) return;
  2427. container.querySelectorAll('.q-option').forEach(function(o) {
  2428. o.classList.remove('selected');
  2429. });
  2430. el.classList.add('selected');
  2431. }
  2432. // ===== QUESTION JUMP =====
  2433. var currentQ = 8;
  2434. var examQData = {
  2435. 1:{l:'第 1 题 (2分)',c:'实验室安全管理的核心目标是什么?',diff:'简单'},
  2436. 2:{l:'第 2 题 (2分)',c:'以下哪项属于一级生物安全防护设施?',diff:'一般'},
  2437. 3:{l:'第 3 题 (2分)',c:'化学品安全数据表(SDS)的主要作用是?',diff:'简单'},
  2438. 4:{l:'第 4 题 (2分)',c:'实验室发生化学品泄漏时,正确的第一步处理方式是?',diff:'一般'},
  2439. 5:{l:'第 5 题 (2分)',c:'下列哪种废液属于危险废物,必须单独收集处理?',diff:'一般'},
  2440. 6:{l:'第 6 题 (2分)',c:'使用高压灭菌锅时,以下哪项操作是不正确的?',diff:'很难'},
  2441. 7:{l:'第 7 题 (2分)',c:'实验室电气安全规范中,禁止在实验室内进行哪种行为?',diff:'简单'},
  2442. 8:{l:'第 8 题 (2分)',c:'以下哪种操作违反了实验室生物安全操作规范?',diff:'很难'},
  2443. 9:{l:'第 9 题 (2分)',c:'辐射防护的三要素是?',diff:'极难'},
  2444. 10:{l:'第 10 题 (2分)',c:'实验室个人防护装备(PPE)选择的依据是?',diff:'一般'},
  2445. 11:{l:'第 11 题 (2分)',c:'消防器材应至少每隔多长时间进行一次检查?',diff:'简单'},
  2446. 12:{l:'第 12 题 (2分)',c:'下列关于实验室安全标志的说法,正确的是?',diff:'一般'}
  2447. };
  2448. var diffClass = {简单:'diff-easy',一般:'diff-normal',很难:'diff-hard',极难:'diff-extreme'};
  2449. function jumpToQ(n) {
  2450. if (n < 1 || n > 12) return;
  2451. currentQ = n;
  2452. var d = examQData[n] || {l:'第 '+n+' 题 (2分)',c:'题目内容加载中...',diff:'一般'};
  2453. document.getElementById('qLabel').textContent = d.l;
  2454. document.getElementById('qContent').textContent = d.c;
  2455. var diffEl = document.getElementById('qLabel').nextElementSibling;
  2456. if (diffEl) { diffEl.className = diffClass[d.diff] || 'diff-normal'; diffEl.textContent = d.diff; }
  2457. document.querySelectorAll('#qNavPanel .q-num').forEach(function(el) {
  2458. el.classList.remove('current');
  2459. if (parseInt(el.textContent) === n) el.classList.add('current');
  2460. });
  2461. toggleQNav(); toggleQNav(); // close nav after jump
  2462. }
  2463. var currentPQ = 34;
  2464. function jumpToPQ(n) {
  2465. if (n < 1) return;
  2466. currentPQ = n;
  2467. document.getElementById('pqLabel').textContent = '第 ' + n + ' 题';
  2468. document.querySelectorAll('#practiceQNav .q-num').forEach(function(el) {
  2469. el.classList.remove('current');
  2470. if (parseInt(el.textContent) === n) el.classList.add('current');
  2471. });
  2472. var ab = document.getElementById('answerBox');
  2473. if (ab) ab.style.display = 'none';
  2474. var btn2 = document.getElementById('toggleAnswerBtn2');
  2475. if (btn2) btn2.textContent = '查看答案';
  2476. togglePracticeNav(); togglePracticeNav();
  2477. }
  2478. // ===== TOGGLE PANELS =====
  2479. function toggleQNav() {
  2480. var el = document.getElementById('qNavPanel');
  2481. if (el) el.style.display = el.style.display === 'none' ? 'block' : 'none';
  2482. }
  2483. function togglePracticeNav() {
  2484. var el = document.getElementById('practiceQNav');
  2485. if (el) el.style.display = el.style.display === 'none' ? 'block' : 'none';
  2486. }
  2487. function toggleAnswer() {
  2488. var el = document.getElementById('answerBox');
  2489. var btn = document.getElementById('toggleAnswerBtn') || document.getElementById('toggleAnswerBtn2');
  2490. if (!el) return;
  2491. var shown = el.style.display !== 'none';
  2492. el.style.display = shown ? 'none' : 'block';
  2493. if (btn) btn.textContent = shown ? '查看答案' : '收起答案';
  2494. }
  2495. // ===== APPROVE ITEM =====
  2496. function approveItem(btn, action) {
  2497. var card = btn.closest('.approval-card');
  2498. var statusEl = card.querySelector('.approval-status-pending');
  2499. var btnsEl = card.querySelector('div[style*="display:flex;gap:8px"]');
  2500. if (action === 'pass') {
  2501. if (statusEl) { statusEl.textContent = '已通过'; statusEl.className = 'approval-status-pass'; }
  2502. card.style.background = '#f6ffed';
  2503. card.style.border = '1px solid var(--green)';
  2504. } else {
  2505. if (statusEl) { statusEl.textContent = '已驳回'; statusEl.className = 'approval-status-reject'; }
  2506. card.style.background = '#fff1f0';
  2507. card.style.border = '1px solid var(--red)';
  2508. }
  2509. if (btnsEl) btnsEl.style.display = 'none';
  2510. }
  2511. // ===== EXAM TIMER =====
  2512. var timerInterval = null;
  2513. var timerSeconds = 52 * 60 + 14;
  2514. function startTimer() {
  2515. if (timerInterval) clearInterval(timerInterval);
  2516. timerInterval = setInterval(function() {
  2517. timerSeconds--;
  2518. if (timerSeconds <= 0) {
  2519. timerSeconds = 0;
  2520. clearInterval(timerInterval);
  2521. submitExam();
  2522. }
  2523. var m = Math.floor(timerSeconds / 60);
  2524. var s = timerSeconds % 60;
  2525. var el = document.getElementById('examTimer');
  2526. if (el) el.textContent = (m < 10 ? '0' : '') + m + ':' + (s < 10 ? '0' : '') + s;
  2527. // 剩余10分钟以内变红色警告
  2528. var bar = document.getElementById('examTimerBar');
  2529. if (bar) bar.style.background = timerSeconds <= 600 ? 'linear-gradient(90deg,#f5222d,#cf1322)' : 'linear-gradient(90deg,#1677ff,#0958d9)';
  2530. }, 1000);
  2531. }
  2532. // ===== SUBMIT EXAM =====
  2533. function submitExam() {
  2534. if (confirm('确认交卷吗?')) {
  2535. clearInterval(timerInterval);
  2536. goto('screen-exam-result');
  2537. }
  2538. }
  2539. // ===== TRAINING ROLE / SCAN / QR =====
  2540. function openTrainingDetail(state) {
  2541. // state: 'active' | 'done' | 'unpublished'
  2542. var isTeacher = window._trainingRole === 'teacher';
  2543. var isDone = state === 'done';
  2544. var isUnpublished = state === 'unpublished';
  2545. var statusTag = document.getElementById('td-status-tag');
  2546. var signinSection = document.getElementById('td-signin-section');
  2547. var uploadSection = document.getElementById('td-upload-section');
  2548. var doneSection = document.getElementById('td-done-section');
  2549. var titleEl = document.getElementById('td-title');
  2550. var timeEl = document.getElementById('td-time');
  2551. var locationEl = document.getElementById('td-location');
  2552. var orgEl = document.getElementById('td-org');
  2553. var lecturerEl = document.getElementById('td-lecturer');
  2554. var durationEl = document.getElementById('td-duration');
  2555. var teacherTopbar = document.getElementById('td-teacher-topbar');
  2556. var publishLabel = document.getElementById('td-publish-label');
  2557. var publishToggle = document.getElementById('td-publish-toggle');
  2558. var publishKnob = document.getElementById('td-publish-knob');
  2559. var unpublishedBanner = document.getElementById('td-unpublished-banner');
  2560. var signinStats = document.getElementById('td-signin-stats');
  2561. var rosterSection = document.getElementById('td-roster-section');
  2562. // Teacher topbar toggle
  2563. if (teacherTopbar) teacherTopbar.style.display = isTeacher ? 'flex' : 'none';
  2564. if (isDone) {
  2565. if (statusTag) { statusTag.textContent = '✓ 已完成'; statusTag.style.cssText = 'font-size:11px;background:#f6ffed;color:#52c41a;border:1px solid #b7eb8f;border-radius:10px;padding:3px 10px;font-weight:500;'; }
  2566. if (titleEl) titleEl.textContent = '2025年秋季消防安全知识培训';
  2567. if (timeEl) timeEl.textContent = '2025-10-20 09:00 – 10:30';
  2568. if (locationEl) locationEl.innerHTML = '📍 综合楼报告厅';
  2569. if (orgEl) orgEl.innerHTML = '🏢 生命科学学院';
  2570. if (lecturerEl) lecturerEl.textContent = '王刚教授';
  2571. if (durationEl) durationEl.textContent = '90 分钟';
  2572. if (signinSection) signinSection.style.display = 'none';
  2573. if (uploadSection) uploadSection.style.display = 'none';
  2574. if (doneSection) doneSection.style.display = 'block';
  2575. if (unpublishedBanner) unpublishedBanner.style.display = 'none';
  2576. if (signinStats) signinStats.style.display = isTeacher ? 'block' : 'none';
  2577. if (rosterSection) rosterSection.style.display = isTeacher ? 'block' : 'none';
  2578. setDetailPublishUI(true);
  2579. } else if (isUnpublished) {
  2580. if (statusTag) { statusTag.textContent = '● 未发布'; statusTag.style.cssText = 'font-size:11px;background:#f5f5f5;color:#8c8c8c;border:1px solid #d9d9d9;border-radius:10px;padding:3px 10px;font-weight:500;'; }
  2581. if (titleEl) titleEl.textContent = '2026年生物安全专项技能培训';
  2582. if (timeEl) timeEl.textContent = '2026-05-10 14:00 – 16:00';
  2583. if (locationEl) locationEl.innerHTML = '📍 生命楼实验中心';
  2584. if (orgEl) orgEl.innerHTML = '🏢 生命科学学院';
  2585. if (lecturerEl) lecturerEl.textContent = '陈华教授';
  2586. if (durationEl) durationEl.textContent = '120 分钟';
  2587. if (signinSection) signinSection.style.display = 'none';
  2588. if (uploadSection) uploadSection.style.display = 'none';
  2589. if (doneSection) doneSection.style.display = 'none';
  2590. if (unpublishedBanner) unpublishedBanner.style.display = 'block';
  2591. if (signinStats) signinStats.style.display = 'none';
  2592. if (rosterSection) rosterSection.style.display = 'none';
  2593. setDetailPublishUI(false);
  2594. } else {
  2595. if (statusTag) { statusTag.textContent = '● 进行中'; statusTag.style.cssText = 'font-size:11px;background:#fff7e6;color:#fa8c16;border:1px solid #ffd591;border-radius:10px;padding:3px 10px;font-weight:500;'; }
  2596. if (titleEl) titleEl.textContent = '2026年春季实验室安全知识讲座';
  2597. if (timeEl) timeEl.innerHTML = '2026-03-01 &nbsp; 10:00 – 11:00';
  2598. if (locationEl) locationEl.innerHTML = '📍 学术报告厅 A201';
  2599. if (orgEl) orgEl.innerHTML = '🏢 生命科学学院';
  2600. if (lecturerEl) lecturerEl.textContent = '李明教授';
  2601. if (durationEl) durationEl.textContent = '60 分钟';
  2602. if (signinSection) signinSection.style.display = isTeacher ? 'none' : 'block';
  2603. if (uploadSection) uploadSection.style.display = isTeacher ? 'none' : 'block';
  2604. if (doneSection) doneSection.style.display = 'none';
  2605. if (unpublishedBanner) unpublishedBanner.style.display = 'none';
  2606. if (signinStats) signinStats.style.display = isTeacher ? 'block' : 'none';
  2607. if (rosterSection) rosterSection.style.display = isTeacher ? 'block' : 'none';
  2608. setDetailPublishUI(true);
  2609. if (!isTeacher) {
  2610. trainingProofFiles = [];
  2611. renderTrainingProofPreviews();
  2612. }
  2613. }
  2614. goto('screen-training-detail');
  2615. }
  2616. function setDetailPublishUI(isPublished) {
  2617. var label = document.getElementById('td-publish-label');
  2618. var toggle = document.getElementById('td-publish-toggle');
  2619. var knob = document.getElementById('td-publish-knob');
  2620. if (!label) return;
  2621. if (isPublished) {
  2622. label.textContent = '已发布'; label.style.color = '#52c41a';
  2623. if (toggle) toggle.style.background = '#52c41a';
  2624. if (knob) { knob.style.right = '4px'; knob.style.left = 'auto'; }
  2625. toggle.dataset.published = '1';
  2626. } else {
  2627. label.textContent = '未发布'; label.style.color = '#8c8c8c';
  2628. if (toggle) toggle.style.background = '#d9d9d9';
  2629. if (knob) { knob.style.left = '4px'; knob.style.right = 'auto'; }
  2630. toggle.dataset.published = '0';
  2631. }
  2632. }
  2633. var _currentTrainingFilter = 'all';
  2634. function filterTrainingPublish(type, btnEl) {
  2635. _currentTrainingFilter = type;
  2636. // 更新按钮选中样式
  2637. ['lx-filter-all','lx-filter-pub','lx-filter-unpub'].forEach(function(id) {
  2638. var b = document.getElementById(id);
  2639. if (b) { b.style.background = 'transparent'; b.style.color = '#888'; b.style.fontWeight = 'normal'; }
  2640. });
  2641. if (btnEl) { btnEl.style.background = '#1677ff'; btnEl.style.color = '#fff'; btnEl.style.fontWeight = '600'; }
  2642. reapplyTrainingFilter();
  2643. }
  2644. function reapplyTrainingFilter() {
  2645. var cards = document.querySelectorAll('.lx-training-card');
  2646. var isTeacher = window._trainingRole === 'teacher';
  2647. cards.forEach(function(card) {
  2648. var pub = card.dataset.publish; // '1' or '0'
  2649. var isDone = card.dataset.done === '1';
  2650. var isUnpub = card.classList.contains('training-unpublished-card') || pub === '0';
  2651. // 已完成的卡片始终隐藏(学员和老师均不显示)
  2652. if (isDone) { card.style.display = 'none'; return; }
  2653. // 学员视角:未发布卡片始终隐藏
  2654. if (!isTeacher && isUnpub) { card.style.display = 'none'; return; }
  2655. // 老师视角:按筛选条件决定
  2656. if (_currentTrainingFilter === 'published') { card.style.display = (pub === '1') ? 'block' : 'none'; }
  2657. else if (_currentTrainingFilter === 'unpublished') { card.style.display = (pub === '0') ? 'block' : 'none'; }
  2658. else { card.style.display = 'block'; } // 全部
  2659. });
  2660. }
  2661. function toggleTrainingPublish(knobEl, currentlyPublished) {
  2662. var ctrlWrap = knobEl.parentElement; // .training-teacher-ctrl
  2663. var labelEl = ctrlWrap.querySelector('span'); // "已发布/未发布" 文字
  2664. var card = ctrlWrap.closest('.card');
  2665. var cover = card ? card.children[0] : null; // 第一个子元素:封面图 div
  2666. var body = card ? card.children[1] : null; // 第二个子元素:内容区 div
  2667. // 状态标签:内容区第一行右侧的 span
  2668. var statusSpan = body ? body.querySelector('div:first-child span:last-child') : null;
  2669. if (currentlyPublished) {
  2670. // --- 取消发布 ---
  2671. // 开关变灰
  2672. knobEl.style.background = '#d9d9d9';
  2673. var knob = knobEl.querySelector('div');
  2674. if (knob) { knob.style.right = 'auto'; knob.style.left = '3px'; }
  2675. if (labelEl) { labelEl.textContent = '未发布'; labelEl.style.color = '#8c8c8c'; }
  2676. knobEl.setAttribute('onclick', 'toggleTrainingPublish(this,false)');
  2677. // 封面图置灰
  2678. if (cover) cover.style.filter = 'grayscale(1) brightness(.82)';
  2679. // 文字区降透明
  2680. if (body) body.style.opacity = '.5';
  2681. // 状态标签改为"未发布"
  2682. if (statusSpan) {
  2683. statusSpan.dataset.origText = statusSpan.textContent;
  2684. statusSpan.dataset.origStyle = statusSpan.getAttribute('style') || '';
  2685. statusSpan.textContent = '未发布';
  2686. statusSpan.style.cssText = 'font-size:11px;background:#f5f5f5;color:#8c8c8c;border:1px solid #d9d9d9;border-radius:10px;padding:2px 8px;flex-shrink:0;';
  2687. }
  2688. if (card) card.dataset.publish = '0';
  2689. reapplyTrainingFilter();
  2690. showToast('培训已取消发布');
  2691. } else {
  2692. // --- 重新发布 ---
  2693. // 开关变绿
  2694. knobEl.style.background = '#52c41a';
  2695. var knob = knobEl.querySelector('div');
  2696. if (knob) { knob.style.left = 'auto'; knob.style.right = '3px'; }
  2697. if (labelEl) { labelEl.textContent = '已发布'; labelEl.style.color = '#52c41a'; }
  2698. knobEl.setAttribute('onclick', 'toggleTrainingPublish(this,true)');
  2699. // 还原封面图
  2700. if (cover) cover.style.filter = '';
  2701. // 还原文字区透明度
  2702. if (body) body.style.opacity = '1';
  2703. // 还原状态标签
  2704. if (statusSpan && statusSpan.dataset.origText) {
  2705. statusSpan.textContent = statusSpan.dataset.origText;
  2706. statusSpan.setAttribute('style', statusSpan.dataset.origStyle);
  2707. }
  2708. if (card) card.dataset.publish = '1';
  2709. reapplyTrainingFilter();
  2710. showToast('培训已发布,学员可见');
  2711. }
  2712. }
  2713. function toggleDetailPublish() {
  2714. var toggle = document.getElementById('td-publish-toggle');
  2715. var banner = document.getElementById('td-unpublished-banner');
  2716. var statusTag = document.getElementById('td-status-tag');
  2717. var signinSection = document.getElementById('td-signin-section');
  2718. var uploadSection = document.getElementById('td-upload-section');
  2719. if (!toggle) return;
  2720. var nowPublished = toggle.dataset.published === '1';
  2721. if (nowPublished) {
  2722. setDetailPublishUI(false);
  2723. if (banner) banner.style.display = 'block';
  2724. if (statusTag) { statusTag.textContent = '● 未发布'; statusTag.style.cssText = 'font-size:11px;background:#f5f5f5;color:#8c8c8c;border:1px solid #d9d9d9;border-radius:10px;padding:3px 10px;font-weight:500;'; }
  2725. if (signinSection) signinSection.style.display = 'none';
  2726. if (uploadSection) uploadSection.style.display = 'none';
  2727. showToast('培训已取消发布');
  2728. } else {
  2729. setDetailPublishUI(true);
  2730. if (banner) banner.style.display = 'none';
  2731. if (statusTag) { statusTag.textContent = '● 进行中'; statusTag.style.cssText = 'font-size:11px;background:#fff7e6;color:#fa8c16;border:1px solid #ffd591;border-radius:10px;padding:3px 10px;font-weight:500;'; }
  2732. showToast('培训已发布,学员可见');
  2733. }
  2734. }
  2735. function setTrainingRole(role) {
  2736. var isTeacher = role === 'teacher';
  2737. var sq = document.getElementById('training-student-qr');
  2738. var tq = document.getElementById('training-teacher-qr');
  2739. if (sq) sq.style.display = isTeacher ? 'none' : 'flex';
  2740. if (tq) tq.style.display = isTeacher ? 'flex' : 'none';
  2741. var bs = document.getElementById('trole-student');
  2742. var bt = document.getElementById('trole-teacher');
  2743. if (bs) { bs.style.background = isTeacher ? 'transparent' : '#eb2f96'; bs.style.color = isTeacher ? '#c41d7f' : '#fff'; }
  2744. if (bt) { bt.style.background = isTeacher ? '#eb2f96' : 'transparent'; bt.style.color = isTeacher ? '#fff' : '#c41d7f'; }
  2745. // sync list-page teacher overlays
  2746. var teacherOverlays = document.querySelectorAll('.training-teacher-ctrl');
  2747. teacherOverlays.forEach(function(el) { el.style.display = isTeacher ? 'flex' : 'none'; });
  2748. // update list role buttons
  2749. var lbs = document.getElementById('lx-trole-student');
  2750. var lbt = document.getElementById('lx-trole-teacher');
  2751. if (lbs) { lbs.style.background = isTeacher ? 'transparent' : '#eb2f96'; lbs.style.color = isTeacher ? '#c41d7f' : '#fff'; }
  2752. if (lbt) { lbt.style.background = isTeacher ? '#eb2f96' : 'transparent'; lbt.style.color = isTeacher ? '#fff' : '#c41d7f'; }
  2753. // store current role globally
  2754. window._trainingRole = role;
  2755. // 筛选栏随老师身份显示/隐藏,切回学员时重置为"全部"
  2756. var filterBar = document.getElementById('lx-publish-filter');
  2757. if (filterBar) filterBar.style.display = isTeacher ? 'block' : 'none';
  2758. if (!isTeacher) filterTrainingPublish('all', document.getElementById('lx-filter-all'));
  2759. // Show/hide unpublished card (teacher-only)
  2760. var unpubCard = document.querySelector('.training-unpublished-card');
  2761. if (unpubCard) unpubCard.style.display = isTeacher ? 'block' : 'none';
  2762. }
  2763. function showModal(id) {
  2764. var m = document.getElementById(id);
  2765. if (m) m.style.display = 'flex';
  2766. }
  2767. function hideTrainingHistory() {
  2768. var m = document.getElementById('modal-training-history');
  2769. if (m) m.style.display = 'none';
  2770. }
  2771. function openScanModal() {
  2772. var m = document.getElementById('scanModal');
  2773. m.style.display = 'flex';
  2774. }
  2775. function closeScanModal() {
  2776. document.getElementById('scanModal').style.display = 'none';
  2777. }
  2778. function completeScan() {
  2779. closeScanModal();
  2780. var el = document.getElementById('trainingSignStatus');
  2781. if (el) { el.textContent = '✓ 已签到'; el.style.color = '#52c41a'; }
  2782. showToast('签到成功!');
  2783. }
  2784. function openQrModal() {
  2785. var m = document.getElementById('qrModal');
  2786. m.style.display = 'flex';
  2787. }
  2788. function closeQrModal() {
  2789. document.getElementById('qrModal').style.display = 'none';
  2790. }
  2791. // ===== TRAINING PROOF IMAGE UPLOAD =====
  2792. var trainingProofFiles = [];
  2793. function onTrainingProofSelect(input) {
  2794. var files = Array.from(input.files);
  2795. var MAX = 5;
  2796. var remaining = MAX - trainingProofFiles.length;
  2797. if (remaining <= 0) { showToast('最多上传 5 张图片'); input.value = ''; return; }
  2798. files = files.slice(0, remaining);
  2799. var oversized = files.filter(function(f) { return f.size > 10 * 1024 * 1024; });
  2800. if (oversized.length) { showToast('图片大小不能超过 10MB'); input.value = ''; return; }
  2801. trainingProofFiles = trainingProofFiles.concat(files);
  2802. renderTrainingProofPreviews();
  2803. input.value = '';
  2804. }
  2805. function renderTrainingProofPreviews() {
  2806. var container = document.getElementById('td-upload-preview');
  2807. var submitBtn = document.getElementById('td-submit-proof-btn');
  2808. var uploadBtn = document.getElementById('td-upload-btn');
  2809. if (!container) return;
  2810. container.innerHTML = '';
  2811. trainingProofFiles.forEach(function(file, idx) {
  2812. var url = URL.createObjectURL(file);
  2813. var wrap = document.createElement('div');
  2814. wrap.style.cssText = 'position:relative;width:80px;height:80px;border-radius:8px;overflow:hidden;border:1px solid #91caff;flex-shrink:0;';
  2815. var img = document.createElement('img');
  2816. img.src = url;
  2817. img.style.cssText = 'width:100%;height:100%;object-fit:cover;display:block;cursor:pointer;';
  2818. img.onclick = (function(u) { return function() { openProofImageViewerUrl(u); }; })(url);
  2819. var del = document.createElement('button');
  2820. del.innerHTML = '×';
  2821. del.style.cssText = 'position:absolute;top:2px;right:2px;width:20px;height:20px;border-radius:50%;border:none;background:rgba(0,0,0,.5);color:#fff;font-size:14px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0;';
  2822. del.onclick = (function(i) { return function(e) { e.stopPropagation(); trainingProofFiles.splice(i,1); renderTrainingProofPreviews(); }; })(idx);
  2823. wrap.appendChild(img);
  2824. wrap.appendChild(del);
  2825. container.appendChild(wrap);
  2826. });
  2827. if (submitBtn) submitBtn.style.display = trainingProofFiles.length ? 'inline-block' : 'none';
  2828. if (uploadBtn) uploadBtn.style.display = trainingProofFiles.length >= 5 ? 'none' : 'inline-flex';
  2829. }
  2830. function submitTrainingProof() {
  2831. if (!trainingProofFiles.length) { showToast('请先选择图片'); return; }
  2832. showToast('培训证明已提交,等待审核');
  2833. // Move submitted images to done view
  2834. var doneImages = document.getElementById('td-done-images');
  2835. if (doneImages) {
  2836. doneImages.innerHTML = '';
  2837. trainingProofFiles.forEach(function(file, idx) {
  2838. var url = URL.createObjectURL(file);
  2839. var wrap = document.createElement('div');
  2840. wrap.style.cssText = 'position:relative;width:80px;height:80px;border-radius:8px;overflow:hidden;border:1px solid #f0f0f0;cursor:pointer;';
  2841. var img = document.createElement('img');
  2842. img.src = url;
  2843. img.style.cssText = 'width:100%;height:100%;object-fit:cover;display:block;';
  2844. img.onclick = (function(u) { return function() { openProofImageViewerUrl(u); }; })(url);
  2845. var label = document.createElement('div');
  2846. label.style.cssText = 'position:absolute;bottom:0;left:0;right:0;background:rgba(0,0,0,.4);color:#fff;font-size:9px;text-align:center;padding:2px;';
  2847. label.textContent = '证明' + (idx+1) + '.jpg';
  2848. wrap.appendChild(img);
  2849. wrap.appendChild(label);
  2850. doneImages.appendChild(wrap);
  2851. });
  2852. }
  2853. }
  2854. function openProofImageViewer(idx) {
  2855. // For static demo images
  2856. showToast('查看图片 ' + (idx + 1));
  2857. }
  2858. function openProofImageViewerUrl(url) {
  2859. var overlay = document.getElementById('proofImageOverlay');
  2860. if (!overlay) {
  2861. overlay = document.createElement('div');
  2862. overlay.id = 'proofImageOverlay';
  2863. overlay.style.cssText = 'position:fixed;inset:0;z-index:900;background:rgba(0,0,0,.92);display:flex;align-items:center;justify-content:center;cursor:pointer;';
  2864. overlay.onclick = function() { overlay.style.display = 'none'; };
  2865. var img = document.createElement('img');
  2866. img.id = 'proofImageOverlayImg';
  2867. img.style.cssText = 'max-width:95vw;max-height:90vh;border-radius:8px;object-fit:contain;';
  2868. overlay.appendChild(img);
  2869. document.body.appendChild(overlay);
  2870. }
  2871. document.getElementById('proofImageOverlayImg').src = url;
  2872. overlay.style.display = 'flex';
  2873. }
  2874. // ===== SIGN-IN =====
  2875. function doSignIn(btn) {
  2876. if (btn.dataset.signed) return;
  2877. btn.dataset.signed = '1';
  2878. btn.textContent = '已签到';
  2879. btn.style.background = 'var(--green)';
  2880. btn.style.borderColor = 'var(--green)';
  2881. showToast('签到成功!');
  2882. }
  2883. // ===== RIPPLE =====
  2884. document.addEventListener('click', function(e) {
  2885. var card = e.target.closest('.card');
  2886. if (!card) return;
  2887. if (e.target.tagName === 'BUTTON' || e.target.closest('button')) return;
  2888. var r = document.createElement('span');
  2889. r.style.cssText = 'position:absolute;border-radius:50%;background:rgba(0,112,255,0.12);pointer-events:none;transform:scale(0);animation:rippleAnim 0.5s linear;';
  2890. var size = Math.max(card.offsetWidth, card.offsetHeight);
  2891. var rect = card.getBoundingClientRect();
  2892. r.style.width = r.style.height = size + 'px';
  2893. r.style.left = (e.clientX - rect.left - size/2) + 'px';
  2894. r.style.top = (e.clientY - rect.top - size/2) + 'px';
  2895. if (getComputedStyle(card).position === 'static') card.style.position = 'relative';
  2896. card.style.overflow = 'hidden';
  2897. card.appendChild(r);
  2898. setTimeout(function() { r.remove(); }, 500);
  2899. });
  2900. var rippleStyle = document.createElement('style');
  2901. rippleStyle.textContent = '@keyframes rippleAnim{to{transform:scale(2.5);opacity:0}}';
  2902. document.head.appendChild(rippleStyle);
  2903. // ===== REPORT MODAL =====
  2904. function showReportModal() {
  2905. var m = document.getElementById('reportModal');
  2906. m.style.display = 'flex';
  2907. }
  2908. function closeReportModal() {
  2909. document.getElementById('reportModal').style.display = 'none';
  2910. }
  2911. function downloadReport() {
  2912. var a = document.createElement('a');
  2913. a.href = 'img/毕业报告.png';
  2914. a.download = '毕业报告.png';
  2915. document.body.appendChild(a);
  2916. a.click();
  2917. document.body.removeChild(a);
  2918. showToast('开始下载…');
  2919. }
  2920. // ===== BIND LAB MODAL =====
  2921. var labData = [
  2922. { name:'有机化学实验室(A301)', loc:'理学楼A栋3层', head:'张教授', dept:'化学与化工学院', level:'Ⅱ', levelColor:'#fa8c16', cat:'化学类', type:'科研实验室', label:'化学与化工学院-有机化学实验室(A301)-理学楼A栋3层' },
  2923. { name:'细胞生物学实验室(B202)', loc:'生命楼B栋2层', head:'李教授', dept:'生命科学学院', level:'Ⅲ', levelColor:'#f5222d', cat:'生物类', type:'科研实验室', label:'生命科学学院-细胞生物学实验室(B202)-生命楼B栋2层' },
  2924. { name:'机械加工实验室(C105)', loc:'工程楼C栋1层', head:'王教授', dept:'机电工程学院', level:'Ⅰ', levelColor:'#52c41a', cat:'机电类', type:'科研实验室', label:'机电工程学院-机械加工实验室(C105)-工程楼C栋1层' }
  2925. ];
  2926. var selectedLabIdx = -1;
  2927. function onBindLabSearch(val) {
  2928. var dd = document.getElementById('bindLabDropdown');
  2929. dd.style.display = val.trim() ? 'block' : 'none';
  2930. }
  2931. function selectLab(idx) {
  2932. selectedLabIdx = idx;
  2933. var lab = labData[idx];
  2934. var inp = document.getElementById('bindLabSearch');
  2935. inp.value = lab.label;
  2936. document.getElementById('bindLabDropdown').style.display = 'none';
  2937. document.getElementById('blab-name').textContent = lab.name;
  2938. document.getElementById('blab-loc').textContent = lab.loc;
  2939. document.getElementById('blab-head').textContent = lab.head;
  2940. document.getElementById('blab-dept').textContent = lab.dept;
  2941. var lvl = document.getElementById('blab-level');
  2942. lvl.innerHTML = '<span style="color:' + lab.levelColor + ';font-weight:600;border:1px solid ' + lab.levelColor + ';border-radius:4px;padding:1px 6px;">' + lab.level + '级</span>';
  2943. document.getElementById('blab-cat').textContent = lab.cat;
  2944. document.getElementById('blab-type').textContent = lab.type;
  2945. document.getElementById('bindLabInfo').style.display = 'block';
  2946. }
  2947. function closeBindLabModal() {
  2948. document.getElementById('bindLabModal').style.display = 'none';
  2949. }
  2950. function confirmBindLab() {
  2951. var noLab = document.getElementById('bindNoLabCheck').checked;
  2952. var agreed = document.getElementById('bindAgreeCheck').checked;
  2953. if (!noLab && selectedLabIdx < 0) { showToast('请先搜索并选择实验室'); return; }
  2954. if (!agreed) { showToast('请阅读并勾选须知及责任说明'); return; }
  2955. closeBindLabModal();
  2956. showToast('已提交申请,请等待负责人审批');
  2957. }
  2958. // ===== ROSTER TAB SWITCH =====
  2959. function switchRosterTab(idx) {
  2960. for (var i = 0; i < 2; i++) {
  2961. var tab = document.getElementById('roster-tab-' + i);
  2962. var panel = document.getElementById('roster-panel-' + i);
  2963. if (tab) {
  2964. tab.style.color = i === idx ? '#1677ff' : '#888';
  2965. tab.style.fontWeight = i === idx ? '600' : '400';
  2966. tab.style.borderBottom = i === idx ? '2px solid #1677ff' : '2px solid transparent';
  2967. }
  2968. if (panel) panel.style.display = i === idx ? 'block' : 'none';
  2969. }
  2970. }
  2971. // ===== EXAM TAB SWITCH =====
  2972. function switchExTab(idx) {
  2973. for (var i = 0; i < 3; i++) {
  2974. var tab = document.getElementById('extab-' + i);
  2975. var panel = document.getElementById('expanel-' + i);
  2976. if (tab) {
  2977. tab.style.color = i === idx ? '#1677ff' : '#888';
  2978. tab.style.fontWeight = i === idx ? '600' : '400';
  2979. tab.style.borderBottom = i === idx ? '2px solid #1677ff' : '2px solid transparent';
  2980. }
  2981. if (panel) panel.style.display = i === idx ? 'block' : 'none';
  2982. }
  2983. }
  2984. // ===== LEARNING TAB SWITCH =====
  2985. function switchLxTab(idx) {
  2986. for (var i = 0; i < 4; i++) {
  2987. var tab = document.getElementById('lxtab-' + i);
  2988. var panel = document.getElementById('lxpanel-' + i);
  2989. if (tab) {
  2990. tab.style.color = i === idx ? '#1677ff' : '#888';
  2991. tab.style.fontWeight = i === idx ? '600' : '400';
  2992. tab.style.borderBottom = i === idx ? '2px solid #1677ff' : '2px solid transparent';
  2993. }
  2994. if (panel) panel.style.display = i === idx ? 'block' : 'none';
  2995. }
  2996. }
  2997. // ===== KNOWLEDGE SUB-TAB SWITCH =====
  2998. function switchKxTab(idx) {
  2999. for (var i = 0; i < 2; i++) {
  3000. var tab = document.getElementById('kxtab-' + i);
  3001. var panel = document.getElementById('kxpanel-' + i);
  3002. if (tab) {
  3003. tab.style.color = i === idx ? '#1677ff' : '#888';
  3004. tab.style.fontWeight = i === idx ? '600' : '400';
  3005. tab.style.borderBottom = i === idx ? '2px solid #1677ff' : '2px solid transparent';
  3006. }
  3007. if (panel) panel.style.display = i === idx ? 'block' : 'none';
  3008. }
  3009. }
  3010. // ===== INIT =====
  3011. window.addEventListener('DOMContentLoaded', function() {
  3012. // Wire bottom-tab clicks — each screen has its own .bottom-tab
  3013. var tabTargets = ['screen-home', 'screen-knowledge-list', 'screen-exam-list', 'screen-practice-list', 'screen-my'];
  3014. document.querySelectorAll('.bottom-tab').forEach(function(bar) {
  3015. bar.querySelectorAll('.tab-item').forEach(function(tab, i) {
  3016. tab.addEventListener('click', function() {
  3017. if (tabTargets[i]) goto(tabTargets[i]);
  3018. });
  3019. });
  3020. });
  3021. startTimer();
  3022. // 进入系统后显示绑定实验室弹窗
  3023. setTimeout(function() {
  3024. document.getElementById('bindLabModal').style.display = 'flex';
  3025. }, 400);
  3026. });
  3027. </script>
  3028. <div class="screen" id="screen-study-detail">
  3029. <div class="topbar"><div class="topbar-back" onclick="goBack()">&#8249; 返回</div><div class="topbar-title">学习任务详情</div><div></div></div>
  3030. <div class="scroll-content"><div class="card" style="margin-top:12px;">
  3031. <div style="font-size:17px;font-weight:700;margin-bottom:6px;">实验室安全基础知识</div>
  3032. <div class="chip-row mb8"><span class="tag tag-blue text-xs">学习任务</span><span class="tag tag-orange text-xs">待完成</span></div>
  3033. <div class="text-xs text-gray mb4">来源:生命科学学院 | 要求:20分钟</div>
  3034. <div class="text-xs text-gray">可获:<span class="text-blue fw500">1学时</span> + <span class="text-orange fw500">3积分</span></div>
  3035. <div class="row-between mt12 mb4"><span class="text-sm text-gray">学习进度</span><span class="text-blue fw500">40%</span></div>
  3036. <div class="progress-wrap mb12"><div class="progress-bar" style="width:40%"></div></div>
  3037. <div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px;margin-bottom:14px;">
  3038. <div style="text-align:center;border:1px solid var(--gray-border);border-radius:8px;padding:10px;"><div class="text-xs text-gray mb4">已学</div><div class="text-blue fw500">8 分钟</div></div>
  3039. <div style="text-align:center;border:1px solid var(--gray-border);border-radius:8px;padding:10px;"><div class="text-xs text-gray mb4">要求</div><div class="fw500">20 分钟</div></div>
  3040. <div style="text-align:center;border:1px solid var(--gray-border);border-radius:8px;padding:10px;"><div class="text-xs text-gray mb4">剩余</div><div class="text-orange fw500">12 分钟</div></div>
  3041. </div></div>
  3042. <div class="card"><div class="card-title mb12">课件目录</div>
  3043. <div class="course-item current-course"><div class="row-between mb6"><div class="fw500">第1章 实验室安全概论</div><span class="tag tag-orange text-xs">学习中</span></div><div class="text-xs text-gray mb8">文档课件 · 8分钟</div><div style="display:flex;gap:8px;"><button class="btn btn-primary btn-sm">继续学习</button><button class="btn btn-outline btn-sm" onclick="goto('screen-posttest')">课后考核</button></div></div>
  3044. <div class="course-item"><div class="row-between mb6"><div class="fw500">第2章 危险化学品管理</div><span class="tag tag-gray text-xs">未学习</span></div><div class="text-xs text-gray mb8">视频课件 · 12分钟</div><button class="btn btn-outline btn-sm">开始学习</button></div>
  3045. </div></div></div>
  3046. <div class="screen" id="screen-mock-detail">
  3047. <div class="topbar"><div class="topbar-back" onclick="goBack()">&#8249; 返回</div><div class="topbar-title">模拟考试</div><div></div></div>
  3048. <div class="scroll-content"><div class="card" style="margin-top:12px;">
  3049. <div style="font-size:17px;font-weight:700;margin-bottom:8px;">新生入学安全知识模拟卷 A</div>
  3050. <div class="chip-row mb12"><span class="tag tag-blue text-xs">新生入学考试</span><span class="tag tag-orange text-xs">模拟卷</span></div>
  3051. <div style="display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:14px;">
  3052. <div style="border:1px solid var(--gray-border);border-radius:8px;padding:10px;"><div class="text-xs text-gray mb4">题目总数</div><div class="text-blue fw500">50 题</div></div>
  3053. <div style="border:1px solid var(--gray-border);border-radius:8px;padding:10px;"><div class="text-xs text-gray mb4">考试时长</div><div class="fw500">60 分钟</div></div>
  3054. <div style="border:1px solid var(--gray-border);border-radius:8px;padding:10px;"><div class="text-xs text-gray mb4">满分</div><div class="fw500">100 分</div></div>
  3055. <div style="border:1px solid var(--gray-border);border-radius:8px;padding:10px;"><div class="text-xs text-gray mb4">及格分数</div><div class="text-orange fw500">70 分</div></div>
  3056. </div>
  3057. <div style="background:var(--gray-light);border-radius:8px;padding:12px;margin-bottom:14px;"><div class="text-sm fw500 mb8">历次模拟成绩</div><div class="row-between mb4"><span class="text-sm text-gray">第1次 2026-02-10</span><span class="text-sm text-red fw500">60 分(未通过)</span></div><div class="text-xs text-gray">还需提高 10 分达到及格线</div></div>
  3058. <div style="background:var(--orange-light);border-radius:8px;padding:10px;margin-bottom:14px;font-size:13px;color:var(--orange);">模拟考试需达到及格分数(70分)方可参加正式在线考试。</div>
  3059. <button class="btn btn-primary btn-block" onclick="goto('screen-exam-doing')">开始模拟考试</button>
  3060. </div></div></div>
  3061. <div class="screen" id="screen-exam-detail">
  3062. <div class="topbar"><div class="topbar-back" onclick="goBack()">&#8249; 返回</div><div class="topbar-title">考试详情</div><div></div></div>
  3063. <div class="scroll-content" style="padding-bottom:80px;"><div class="card" style="margin-top:12px;">
  3064. <div class="chip-row mb8"><span class="tag tag-orange text-xs">应知应会考试</span><span class="tag tag-orange text-xs">进行中</span></div>
  3065. <div style="font-size:17px;font-weight:700;margin-bottom:12px;">2025-2026学年应知应会安全考试</div>
  3066. <div style="display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:14px;">
  3067. <div style="border:1px solid var(--gray-border);border-radius:8px;padding:10px;"><div class="text-xs text-gray mb4">题目总数</div><div class="text-blue fw500">100 题</div></div>
  3068. <div style="border:1px solid var(--gray-border);border-radius:8px;padding:10px;"><div class="text-xs text-gray mb4">考试时长</div><div class="fw500">90 分钟</div></div>
  3069. <div style="border:1px solid var(--gray-border);border-radius:8px;padding:10px;"><div class="text-xs text-gray mb4">满分/及格</div><div class="fw500">100/70 分</div></div>
  3070. <div style="border:1px solid var(--gray-border);border-radius:8px;padding:10px;"><div class="text-xs text-gray mb4">可考次数</div><div class="fw500">3 次</div></div>
  3071. </div>
  3072. <div class="text-sm fw500 mb8">考前任务状态</div>
  3073. <div style="border-radius:10px;border:1px solid var(--gray-border);overflow:hidden;margin-bottom:14px;">
  3074. <div style="display:flex;align-items:center;justify-content:space-between;padding:12px;border-bottom:1px solid var(--gray-border);"><span class="fw500 text-sm">学时要求</span><span class="tag tag-green text-xs">✓ 达标</span></div>
  3075. <div style="display:flex;align-items:center;justify-content:space-between;padding:12px;"><span class="fw500 text-sm">学习任务</span><span class="tag tag-green text-xs">✓ 完成</span></div>
  3076. </div>
  3077. <div style="background:#f6ffed;border:1px solid #b7eb8f;border-radius:8px;padding:12px;margin-bottom:16px;font-size:13px;color:#52c41a;">已完成全部考前任务,请点击开始考试。</div>
  3078. </div></div>
  3079. <!-- 悬浮按钮 -->
  3080. <div style="position:absolute;bottom:0;left:0;right:0;padding:12px 16px;background:#fff;border-top:1px solid var(--gray-border);box-shadow:0 -2px 8px rgba(0,0,0,.06);">
  3081. <button class="btn btn-primary btn-block" onclick="goto('screen-exam-doing')">开始考试</button>
  3082. </div>
  3083. </div>
  3084. <div class="screen" id="screen-regular-exam-detail">
  3085. <div class="topbar"><div class="topbar-back" onclick="goBack()">&#8249; 返回</div><div class="topbar-title">考试详情</div><div></div></div>
  3086. <div class="scroll-content" style="padding-bottom:80px;">
  3087. <div class="card" style="margin-top:12px;">
  3088. <div class="chip-row mb8">
  3089. <span class="tag tag-blue text-xs" style="background:#e6f4ff;color:#0958d9;border-color:#91caff;">常规考试</span>
  3090. <span class="tag tag-gray text-xs">未开始</span>
  3091. </div>
  3092. <div style="font-size:17px;font-weight:700;margin-bottom:12px;">2025-2026学年实验室安全常规考试</div>
  3093. <div style="display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:14px;">
  3094. <div style="border:1px solid var(--gray-border);border-radius:8px;padding:10px;"><div class="text-xs text-gray mb4">题目总数</div><div class="text-blue fw500">80 题</div></div>
  3095. <div style="border:1px solid var(--gray-border);border-radius:8px;padding:10px;"><div class="text-xs text-gray mb4">考试时长</div><div class="fw500">60 分钟</div></div>
  3096. <div style="border:1px solid var(--gray-border);border-radius:8px;padding:10px;"><div class="text-xs text-gray mb4">满分/及格</div><div class="fw500">100/60 分</div></div>
  3097. <div style="border:1px solid var(--gray-border);border-radius:8px;padding:10px;"><div class="text-xs text-gray mb4">可考次数</div><div class="fw500">2 次</div></div>
  3098. </div>
  3099. <div style="background:var(--gray-light);border-radius:8px;padding:12px;font-size:13px;color:var(--text-secondary);line-height:1.7;">
  3100. 本次考试为年度常规安全考试,请认真作答。考试结果将记入个人安全档案。
  3101. </div>
  3102. </div>
  3103. </div>
  3104. <!-- 悬浮按钮 -->
  3105. <div style="position:absolute;bottom:0;left:0;right:0;padding:12px 16px;background:#fff;border-top:1px solid var(--gray-border);box-shadow:0 -2px 8px rgba(0,0,0,.06);">
  3106. <button class="btn btn-primary btn-block" onclick="goto('screen-exam-doing')">立即考试</button>
  3107. </div>
  3108. </div>
  3109. <!-- SCREEN: 答题详情 -->
  3110. <div class="screen" id="screen-score-detail">
  3111. <div class="topbar">
  3112. <div class="topbar-back" onclick="goBack()">&#8249; 返回</div>
  3113. <div class="topbar-title">答题详情</div>
  3114. <div></div>
  3115. </div>
  3116. <div class="scroll-content">
  3117. <!-- 考试概览 -->
  3118. <div class="card" style="margin-top:12px;">
  3119. <div class="row-between mb8">
  3120. <span class="tag tag-blue text-xs">新生入学考试</span>
  3121. <span class="score-result-pass">通过</span>
  3122. </div>
  3123. <div style="font-size:16px;font-weight:700;margin-bottom:10px;">2025级新生实验室安全入学考试</div>
  3124. <div style="display:grid;grid-template-columns:1fr 1fr;gap:6px;font-size:13px;margin-bottom:14px;">
  3125. <div><span class="text-gray">考试时间:</span>2026-01-10</div>
  3126. <div><span class="text-gray">用时:</span>37分22秒</div>
  3127. <div><span class="text-gray">满分/及格:</span>100 / 70</div>
  3128. <div><span class="text-gray">考次:</span>2 / 3</div>
  3129. <div><span class="text-gray">最高成绩:</span><span class="text-blue fw500">78 分</span></div>
  3130. <div><span class="text-gray">考试结果:</span><span class="text-green fw500">通过</span></div>
  3131. </div>
  3132. <!-- 答题统计 -->
  3133. <div style="background:var(--gray-light);border-radius:8px;padding:12px;margin-bottom:14px;">
  3134. <div class="text-sm fw500 mb8">答题统计</div>
  3135. <div style="display:grid;grid-template-columns:1fr 1fr 1fr 1fr;gap:8px;text-align:center;">
  3136. <div><div style="font-size:20px;font-weight:700;color:var(--blue);">100</div><div class="text-xs text-gray">总题数</div></div>
  3137. <div><div style="font-size:20px;font-weight:700;color:var(--green);">78</div><div class="text-xs text-gray">正确</div></div>
  3138. <div><div style="font-size:20px;font-weight:700;color:var(--red);">22</div><div class="text-xs text-gray">错误</div></div>
  3139. <div><div style="font-size:20px;font-weight:700;color:var(--blue);">78%</div><div class="text-xs text-gray">正确率</div></div>
  3140. </div>
  3141. </div>
  3142. </div>
  3143. <!-- 答题详情 -->
  3144. <div style="padding:0 12px 12px;">
  3145. <div class="text-sm fw500" style="padding:14px 0 10px;">答题详情 <span class="text-gray" style="font-weight:400;">(共100题)</span></div>
  3146. <!-- 第1题 正确 -->
  3147. <div style="background:var(--white);border-radius:10px;padding:14px;margin-bottom:10px;border:1px solid var(--gray-border);">
  3148. <div class="row-between mb8">
  3149. <div><span class="q-type-badge">单选题</span><span class="text-xs text-gray" style="margin-left:6px;">第 1 题</span><span style="margin-left:6px;font-size:10px;padding:1px 6px;border-radius:4px;background:#f6ffed;color:#52c41a;border:1px solid #b7eb8f;">简单</span></div>
  3150. <span class="tag tag-green text-xs">答对</span>
  3151. </div>
  3152. <div class="text-sm" style="line-height:1.7;margin-bottom:10px;">实验室废液应如何处理?</div>
  3153. <div style="background:#f6ffed;border:1px solid #b7eb8f;border-radius:8px;padding:10px;margin-bottom:10px;">
  3154. <div class="text-xs text-gray mb4">我的答案:<span class="text-green fw500">C. 分类收集,交专业机构处理(正确)</span></div>
  3155. <div class="text-xs text-gray">正确答案:<span class="text-green fw500">C. 分类收集,交专业机构处理</span></div>
  3156. </div>
  3157. <div style="background:#f6ffed;border-radius:8px;padding:10px;font-size:13px;color:var(--text-secondary);line-height:1.7;">解析:实验室废液必须按化学性质分类收集,贴上标签,交由有资质的专业机构统一处理,严禁直接倒入下水道。</div>
  3158. </div>
  3159. <!-- 第2题 正确 -->
  3160. <div style="background:var(--white);border-radius:10px;padding:14px;margin-bottom:10px;border:1px solid var(--gray-border);">
  3161. <div class="row-between mb8">
  3162. <div><span class="q-type-badge">判断题</span><span class="text-xs text-gray" style="margin-left:6px;">第 2 题</span><span style="margin-left:6px;font-size:10px;padding:1px 6px;border-radius:4px;background:#f6ffed;color:#52c41a;border:1px solid #b7eb8f;">简单</span></div>
  3163. <span class="tag tag-green text-xs">答对</span>
  3164. </div>
  3165. <div class="text-sm" style="line-height:1.7;margin-bottom:10px;">实验室工作人员在操作危险化学品时必须佩戴相应个人防护装备。( )</div>
  3166. <div style="background:#f6ffed;border:1px solid #b7eb8f;border-radius:8px;padding:10px;margin-bottom:10px;">
  3167. <div class="text-xs text-gray mb4">我的答案:<span class="text-green fw500">A. 正确(正确)</span></div>
  3168. <div class="text-xs text-gray">正确答案:<span class="text-green fw500">A. 正确</span></div>
  3169. </div>
  3170. <div style="background:#f6ffed;border-radius:8px;padding:10px;font-size:13px;color:var(--text-secondary);line-height:1.7;">解析:操作危险化学品时,必须根据化学品危险性佩戴防护手套、护目镜、防毒口罩等相应个人防护装备。</div>
  3171. </div>
  3172. <!-- 第3题 错误 -->
  3173. <div style="background:var(--white);border-radius:10px;padding:14px;margin-bottom:10px;border:1px solid var(--gray-border);">
  3174. <div class="row-between mb8">
  3175. <div><span class="q-type-badge">单选题</span><span class="text-xs text-gray" style="margin-left:6px;">第 3 题</span><span style="margin-left:6px;font-size:10px;padding:1px 6px;border-radius:4px;background:#fff7e6;color:#fa8c16;border:1px solid #ffd591;">一般</span></div>
  3176. <span class="tag tag-orange text-xs">答错</span>
  3177. </div>
  3178. <div class="text-sm" style="line-height:1.7;margin-bottom:10px;">以下哪种废液可以直接倒入普通下水道排放?</div>
  3179. <div style="background:var(--gray-light);border-radius:8px;padding:10px;margin-bottom:10px;">
  3180. <div class="text-xs text-gray mb4">我的答案:<span class="text-red fw500">A. 含汞废液(错误)</span></div>
  3181. <div class="text-xs text-gray">正确答案:<span class="text-green fw500">D. 少量洗涤蒸馏水</span></div>
  3182. </div>
  3183. <div style="background:#f6ffed;border-radius:8px;padding:10px;font-size:13px;color:var(--text-secondary);line-height:1.7;">解析:含汞废液属于危险废物,必须进行无害化处理,不能直接排放。少量洗涤蒸馏水危害极小,可直接排放。</div>
  3184. </div>
  3185. <!-- 第4题 正确 -->
  3186. <div style="background:var(--white);border-radius:10px;padding:14px;margin-bottom:10px;border:1px solid var(--gray-border);">
  3187. <div class="row-between mb8">
  3188. <div><span class="q-type-badge">多选题</span><span class="text-xs text-gray" style="margin-left:6px;">第 4 题</span><span style="margin-left:6px;font-size:10px;padding:1px 6px;border-radius:4px;background:#fff7e6;color:#fa8c16;border:1px solid #ffd591;">一般</span></div>
  3189. <span class="tag tag-green text-xs">答对</span>
  3190. </div>
  3191. <div class="text-sm" style="line-height:1.7;margin-bottom:10px;">以下属于实验室一级危险源的有?(多选)</div>
  3192. <div style="background:#f6ffed;border:1px solid #b7eb8f;border-radius:8px;padding:10px;margin-bottom:10px;">
  3193. <div class="text-xs text-gray mb4">我的答案:<span class="text-green fw500">A B D(正确)</span></div>
  3194. <div class="text-xs text-gray">正确答案:<span class="text-green fw500">A B D</span></div>
  3195. </div>
  3196. <div style="background:#f6ffed;border-radius:8px;padding:10px;font-size:13px;color:var(--text-secondary);line-height:1.7;">解析:爆炸物(A)、剧毒品(B)、强氧化剂(D)均属于一级危险源,需严格管控存储和使用。</div>
  3197. </div>
  3198. <!-- 第5题 正确 -->
  3199. <div style="background:var(--white);border-radius:10px;padding:14px;margin-bottom:10px;border:1px solid var(--gray-border);">
  3200. <div class="row-between mb8">
  3201. <div><span class="q-type-badge">判断题</span><span class="text-xs text-gray" style="margin-left:6px;">第 5 题</span><span style="margin-left:6px;font-size:10px;padding:1px 6px;border-radius:4px;background:#f6ffed;color:#52c41a;border:1px solid #b7eb8f;">简单</span></div>
  3202. <span class="tag tag-green text-xs">答对</span>
  3203. </div>
  3204. <div class="text-sm" style="line-height:1.7;margin-bottom:10px;">实验室消防通道可临时堆放物品,只需保留60cm宽度即可。( )</div>
  3205. <div style="background:#f6ffed;border:1px solid #b7eb8f;border-radius:8px;padding:10px;margin-bottom:10px;">
  3206. <div class="text-xs text-gray mb4">我的答案:<span class="text-green fw500">B. 错误(正确)</span></div>
  3207. <div class="text-xs text-gray">正确答案:<span class="text-green fw500">B. 错误</span></div>
  3208. </div>
  3209. <div style="background:#f6ffed;border-radius:8px;padding:10px;font-size:13px;color:var(--text-secondary);line-height:1.7;">解析:消防通道必须保持畅通,严禁堆放任何物品,通道宽度不得小于1.2米。</div>
  3210. </div>
  3211. <!-- 省略中间题目提示 -->
  3212. <div style="text-align:center;padding:10px 0;color:var(--text-hint);font-size:12px;">…… 共100题,展示部分代表性题目 ……</div>
  3213. <!-- 第11题 错误 -->
  3214. <div style="background:var(--white);border-radius:10px;padding:14px;margin-bottom:10px;border:1px solid var(--gray-border);">
  3215. <div class="row-between mb8">
  3216. <div><span class="q-type-badge">判断题</span><span class="text-xs text-gray" style="margin-left:6px;">第 11 题</span><span style="margin-left:6px;font-size:10px;padding:1px 6px;border-radius:4px;background:#fff2f0;color:#f5222d;border:1px solid #ffccc7;">很难</span></div>
  3217. <span class="tag tag-orange text-xs">答错</span>
  3218. </div>
  3219. <div class="text-sm" style="line-height:1.7;margin-bottom:10px;">实验室发生化学品泄漏时,第一步应立即拨打119报警。( )</div>
  3220. <div style="background:var(--gray-light);border-radius:8px;padding:10px;margin-bottom:10px;">
  3221. <div class="text-xs text-gray mb4">我的答案:<span class="text-red fw500">A. 正确(错误)</span></div>
  3222. <div class="text-xs text-gray">正确答案:<span class="text-green fw500">B. 错误</span></div>
  3223. </div>
  3224. <div style="background:#f6ffed;border-radius:8px;padding:10px;font-size:13px;color:var(--text-secondary);line-height:1.7;">解析:发生化学品泄漏时,第一步应先疏散人员并撤离危险区域,再根据泄漏情况判断是否需要拨打119。</div>
  3225. </div>
  3226. <!-- 第27题 错误 -->
  3227. <div style="background:var(--white);border-radius:10px;padding:14px;margin-bottom:10px;border:1px solid var(--gray-border);">
  3228. <div class="row-between mb8">
  3229. <div><span class="q-type-badge">多选题</span><span class="text-xs text-gray" style="margin-left:6px;">第 27 题</span><span style="margin-left:6px;font-size:10px;padding:1px 6px;border-radius:4px;background:#f9f0ff;color:#722ed1;border:1px solid #d3adf7;">极难</span></div>
  3230. <span class="tag tag-orange text-xs">答错</span>
  3231. </div>
  3232. <div class="text-sm" style="line-height:1.7;margin-bottom:10px;">下列属于个人防护装备(PPE)的是?(多选)</div>
  3233. <div style="background:var(--gray-light);border-radius:8px;padding:10px;margin-bottom:10px;">
  3234. <div class="text-xs text-gray mb4">我的答案:<span class="text-red fw500">A C(部分正确)</span></div>
  3235. <div class="text-xs text-gray">正确答案:<span class="text-green fw500">A B C D</span></div>
  3236. </div>
  3237. <div style="background:#f6ffed;border-radius:8px;padding:10px;font-size:13px;color:var(--text-secondary);line-height:1.7;">解析:防护眼镜(A)、实验手套(B)、防护口罩(C)、实验室防护服(D)均属于个人防护装备。</div>
  3238. </div>
  3239. </div>
  3240. </div>
  3241. </div>
  3242. </body>
  3243. </html>