admin.html 319 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>实验室安全教育与考试 — 管理后台</title>
  7. <style>
  8. *{box-sizing:border-box;margin:0;padding:0;}
  9. :root{
  10. --blue:#1857d4;--blue-deep:#0f3ea8;--blue-mid:#2e6fe0;--blue-light:#eef3fd;--blue-xlight:#f5f8ff;
  11. --green:#10a37f;--green-dark:#0d8f6f;--green-light:#edfaf6;
  12. --orange:#e67e22;--orange-light:#fef6ec;
  13. --red:#e53e3e;--red-light:#fff5f5;
  14. --gray:#8896a7;--gray-light:#f4f6fa;--gray-border:#dde3ed;
  15. --text-primary:#1a2233;--text-secondary:#4a5568;--text-hint:#8896a7;
  16. --bg:#f0f4fb;--white:#ffffff;
  17. --radius:8px;--shadow:0 2px 12px rgba(24,87,212,.08);--shadow-md:0 4px 20px rgba(24,87,212,.12);
  18. --sidebar-w:260px;--header-h:64px;
  19. }
  20. body{font-family:-apple-system,"PingFang SC","Microsoft YaHei",sans-serif;background:var(--bg);color:var(--text-primary);font-size:15px;display:flex;flex-direction:column;height:100vh;overflow:hidden;}
  21. /* ===== HEADER ===== */
  22. .admin-header{height:var(--header-h);background:linear-gradient(135deg,#1857d4 0%,#2e6fe0 100%);display:flex;align-items:center;padding:0 28px;gap:20px;flex-shrink:0;z-index:200;box-shadow:0 2px 8px rgba(24,87,212,.2);}
  23. .header-logo{display:flex;align-items:center;gap:12px;color:#fff;font-size:17px;font-weight:700;letter-spacing:.3px;min-width:240px;}
  24. .header-logo-icon{width:36px;height:36px;background:rgba(255,255,255,.2);border-radius:8px;display:flex;align-items:center;justify-content:center;font-size:18px;}
  25. .header-tabs{display:flex;gap:4px;flex:1;}
  26. .header-tab{color:rgba(255,255,255,.75);font-size:14px;padding:7px 18px;border-radius:6px;cursor:pointer;transition:all .18s;font-weight:500;white-space:nowrap;}
  27. .header-tab:hover{color:#fff;background:rgba(255,255,255,.12);}
  28. .header-tab.active{color:#fff;background:rgba(255,255,255,.2);font-weight:600;}
  29. .header-right{display:flex;align-items:center;gap:14px;margin-left:auto;}
  30. .header-avatar{width:36px;height:36px;border-radius:50%;background:rgba(255,255,255,.2);border:2px solid rgba(255,255,255,.35);display:flex;align-items:center;justify-content:center;font-size:15px;cursor:pointer;}
  31. .header-username{color:rgba(255,255,255,.9);font-size:14px;}
  32. /* ===== LAYOUT ===== */
  33. .admin-body{display:flex;flex:1;overflow:hidden;}
  34. .sidebar{width:var(--sidebar-w);background:var(--white);border-right:1px solid var(--gray-border);overflow-y:auto;flex-shrink:0;padding:16px 0;}
  35. .sidebar::-webkit-scrollbar{width:4px;}
  36. .sidebar::-webkit-scrollbar-thumb{background:rgba(24,87,212,.15);border-radius:2px;}
  37. .main-content{flex:1;overflow-y:auto;padding:32px 40px;}
  38. .main-content::-webkit-scrollbar{width:7px;}
  39. .main-content::-webkit-scrollbar-thumb{background:rgba(24,87,212,.15);border-radius:4px;}
  40. /* ===== SIDEBAR ===== */
  41. .nav-group{margin-bottom:6px;}
  42. .nav-group-label{font-size:11px;color:var(--text-hint);font-weight:600;letter-spacing:.8px;padding:10px 20px 4px;text-transform:uppercase;}
  43. .nav-item{display:flex;align-items:center;gap:10px;padding:10px 20px;cursor:pointer;color:var(--text-secondary);font-size:14px;font-weight:500;transition:all .15s;border-left:3px solid transparent;margin:1px 0;}
  44. .nav-item:hover{background:var(--blue-xlight);color:var(--blue);}
  45. .nav-item.active{background:var(--blue-light);color:var(--blue);border-left-color:var(--blue);font-weight:600;}
  46. .nav-item .nav-icon{font-size:16px;width:20px;text-align:center;}
  47. .nav-sub{padding-left:20px;}
  48. .nav-sub .nav-item{font-size:13px;padding:8px 16px;}
  49. /* ===== PAGE SYSTEM ===== */
  50. .page{display:none;}.page.active{display:block;}
  51. /* ===== BREADCRUMB ===== */
  52. .breadcrumb{display:flex;align-items:center;gap:6px;font-size:14px;color:var(--text-hint);margin-bottom:24px;}
  53. .breadcrumb a{color:var(--blue);cursor:pointer;text-decoration:none;}
  54. .breadcrumb a:hover{text-decoration:underline;}
  55. .breadcrumb-sep{color:var(--gray-border);}
  56. /* ===== PAGE HEADER ===== */
  57. .page-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:24px;}
  58. .page-title{font-size:22px;font-weight:700;color:var(--text-primary);}
  59. .page-subtitle{font-size:14px;color:var(--text-hint);margin-top:4px;}
  60. /* ===== CARDS ===== */
  61. .card{background:var(--white);border:1px solid var(--gray-border);border-radius:var(--radius);padding:24px;box-shadow:var(--shadow);}
  62. .card-title{font-size:16px;font-weight:700;color:var(--text-primary);display:flex;align-items:center;gap:8px;margin-bottom:18px;}
  63. .card-title::before{content:'';width:3px;height:16px;background:linear-gradient(180deg,var(--blue-mid),var(--blue-deep));border-radius:2px;display:inline-block;}
  64. /* ===== STAT BOXES ===== */
  65. .stat-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:20px;margin-bottom:24px;}
  66. .stat-box{background:var(--white);border:1px solid var(--gray-border);border-radius:var(--radius);padding:20px 24px;box-shadow:var(--shadow);}
  67. .stat-box-icon{font-size:32px;margin-bottom:10px;}
  68. .stat-box-val{font-size:32px;font-weight:700;color:var(--text-primary);line-height:1;}
  69. .stat-box-label{font-size:13px;color:var(--text-hint);margin-top:8px;}
  70. .stat-box.blue{border-top:3px solid var(--blue);}
  71. .stat-box.green{border-top:3px solid var(--green);}
  72. .stat-box.orange{border-top:3px solid var(--orange);}
  73. .stat-box.red{border-top:3px solid var(--red);}
  74. /* ===== TAGS ===== */
  75. .tag{display:inline-flex;align-items:center;padding:2px 9px;border-radius:20px;font-size:12px;font-weight:500;}
  76. .tag-blue{background:var(--blue-light);color:var(--blue);}
  77. .tag-green{background:var(--green-light);color:var(--green-dark);}
  78. .tag-orange{background:var(--orange-light);color:var(--orange);}
  79. .tag-red{background:var(--red-light);color:var(--red);}
  80. .tag-gray{background:var(--gray-light);color:var(--gray);}
  81. /* ===== BTNS ===== */
  82. .btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;border-radius:6px;font-size:14px;font-weight:500;cursor:pointer;border:none;outline:none;transition:all .18s;padding:0 16px;height:36px;}
  83. .btn:active{opacity:.85;}
  84. .btn-primary{background:linear-gradient(135deg,var(--blue-mid) 0%,var(--blue-deep) 100%);color:#fff;box-shadow:0 2px 8px rgba(24,87,212,.25);}
  85. .btn-green{background:linear-gradient(135deg,#12b48a 0%,var(--green-dark) 100%);color:#fff;}
  86. .btn-outline{background:var(--white);color:var(--blue);border:1px solid rgba(24,87,212,.3);}
  87. .btn-outline-gray{background:var(--white);color:var(--text-secondary);border:1px solid var(--gray-border);}
  88. .btn-sm{height:30px;font-size:12px;padding:0 12px;border-radius:5px;}
  89. .btn-danger{background:var(--white);color:var(--red);border:1px solid rgba(229,62,62,.3);}
  90. .btn-icon{width:30px;height:30px;padding:0;border-radius:5px;}
  91. /* ===== TABLE ===== */
  92. .table-wrap{overflow-x:auto;border-radius:var(--radius);border:1px solid var(--gray-border);}
  93. table{width:100%;border-collapse:collapse;font-size:14px;}
  94. thead tr{background:var(--gray-light);}
  95. th{text-align:left;padding:12px 16px;color:var(--text-hint);font-weight:600;font-size:13px;border-bottom:1px solid var(--gray-border);white-space:nowrap;}
  96. td{padding:14px 16px;border-bottom:1px solid var(--gray-border);color:var(--text-primary);vertical-align:middle;}
  97. tbody tr:last-child td{border-bottom:none;}
  98. tbody tr:hover{background:var(--blue-xlight);}
  99. /* ===== FORM ===== */
  100. .form-grid{display:grid;grid-template-columns:1fr 1fr;gap:20px;}
  101. .form-grid.cols-1{grid-template-columns:1fr;}
  102. .form-grid.cols-3{grid-template-columns:1fr 1fr 1fr;}
  103. .form-item{display:flex;flex-direction:column;gap:7px;}
  104. .form-item.col-2{grid-column:span 2;}
  105. .form-label{font-size:14px;color:var(--text-secondary);font-weight:500;}
  106. .form-label.required::after{content:'*';color:var(--red);margin-left:3px;}
  107. .form-input{width:100%;border:1px solid var(--gray-border);border-radius:6px;padding:9px 14px;font-size:14px;color:var(--text-primary);background:var(--white);outline:none;transition:border-color .2s;}
  108. .form-input:focus{border-color:var(--blue);}
  109. textarea.form-input{min-height:110px;resize:vertical;line-height:1.6;}
  110. .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;}
  111. .form-hint{font-size:12px;color:var(--text-hint);}
  112. /* ===== TOGGLE ===== */
  113. .toggle{position:relative;width:44px;height:24px;cursor:pointer;}
  114. .toggle input{opacity:0;width:0;height:0;}
  115. .toggle-slider{position:absolute;inset:0;background:#ccc;border-radius:24px;transition:.3s;}
  116. .toggle-slider::before{content:'';position:absolute;width:18px;height:18px;left:3px;top:3px;background:white;border-radius:50%;transition:.3s;}
  117. .toggle input:checked+.toggle-slider{background:var(--blue);}
  118. .toggle input:checked+.toggle-slider::before{transform:translateX(20px);}
  119. /* ===== SEARCH BAR ===== */
  120. .search-bar{display:flex;gap:10px;align-items:center;margin-bottom:20px;flex-wrap:wrap;}
  121. .search-input-wrap{position:relative;flex:1;min-width:240px;}
  122. .search-input-wrap .search-icon{position:absolute;left:12px;top:50%;transform:translateY(-50%);color:var(--text-hint);font-size:14px;}
  123. .search-input{width:100%;border:1px solid var(--gray-border);border-radius:6px;padding:8px 14px 8px 36px;font-size:14px;outline:none;background:var(--white);}
  124. .search-input:focus{border-color:var(--blue);}
  125. /* ===== PAGINATION ===== */
  126. .pagination{display:flex;align-items:center;gap:4px;margin-top:20px;justify-content:flex-end;}
  127. .page-btn{min-width:34px;height:34px;border-radius:5px;border:1px solid var(--gray-border);background:var(--white);cursor:pointer;font-size:13px;display:inline-flex;align-items:center;justify-content:center;color:var(--text-secondary);}
  128. .page-btn:hover{border-color:var(--blue);color:var(--blue);}
  129. .page-btn.active{background:var(--blue);color:#fff;border-color:var(--blue);}
  130. .page-info{font-size:13px;color:var(--text-hint);margin-left:10px;}
  131. /* ===== TABS ===== */
  132. .view-tabs{display:flex;gap:0;border-bottom:1px solid var(--gray-border);margin-bottom:24px;}
  133. .view-tab{padding:10px 20px;cursor:pointer;font-size:14px;color:var(--text-hint);border-bottom:2px solid transparent;margin-bottom:-1px;transition:all .15s;font-weight:500;}
  134. .view-tab.active{color:var(--blue);border-bottom-color:var(--blue);font-weight:600;}
  135. /* ===== DETAIL PANEL ===== */
  136. .detail-section{margin-bottom:28px;}
  137. .detail-section-title{font-size:13px;font-weight:600;color:var(--text-hint);text-transform:uppercase;letter-spacing:.6px;margin-bottom:14px;padding-bottom:8px;border-bottom:1px solid var(--gray-border);}
  138. .info-row{display:flex;padding:10px 0;border-bottom:1px solid var(--gray-border);}
  139. .info-row:last-child{border-bottom:none;}
  140. .info-key{width:130px;color:var(--text-hint);font-size:14px;flex-shrink:0;}
  141. .info-val{flex:1;font-size:14px;color:var(--text-primary);font-weight:500;}
  142. /* ===== UPLOAD AREA ===== */
  143. .upload-area{border:2px dashed var(--gray-border);border-radius:8px;padding:28px;text-align:center;cursor:pointer;transition:all .2s;background:var(--gray-light);}
  144. .upload-area:hover{border-color:var(--blue);background:var(--blue-xlight);}
  145. .upload-icon{font-size:36px;margin-bottom:10px;}
  146. .upload-text{font-size:14px;color:var(--text-hint);}
  147. /* ===== RICH TEXT PLACEHOLDER ===== */
  148. .rich-editor{border:1px solid var(--gray-border);border-radius:6px;overflow:hidden;}
  149. .rich-toolbar{background:var(--gray-light);padding:8px 14px;display:flex;gap:6px;border-bottom:1px solid var(--gray-border);flex-wrap:wrap;}
  150. .rich-tool-btn{background:var(--white);border:1px solid var(--gray-border);border-radius:4px;padding:3px 9px;font-size:13px;cursor:pointer;color:var(--text-secondary);}
  151. .rich-tool-btn:hover{background:var(--blue-light);color:var(--blue);border-color:rgba(24,87,212,.3);}
  152. .rich-body{min-height:130px;padding:14px;font-size:14px;color:var(--text-primary);outline:none;line-height:1.7;}
  153. /* ===== QR CODE ===== */
  154. .qr-box{width:80px;height:80px;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:24px;cursor:pointer;transition:all .2s;}
  155. .qr-box:hover{border-color:var(--blue);box-shadow:0 2px 8px rgba(24,87,212,.15);}
  156. /* ===== ATTENDANCE ===== */
  157. .attend-row{display:flex;align-items:center;gap:12px;padding:12px 0;border-bottom:1px solid var(--gray-border);}
  158. .attend-row:last-child{border-bottom:none;}
  159. .attend-avatar{width:38px;height:38px;border-radius:50%;background:var(--blue-light);display:flex;align-items:center;justify-content:center;font-size:17px;flex-shrink:0;}
  160. .attend-info{flex:1;}
  161. .attend-status-yes{color:var(--green);font-size:12px;font-weight:600;}
  162. .attend-status-no{color:var(--red);font-size:12px;font-weight:600;}
  163. .attend-status-late{color:var(--orange);font-size:12px;font-weight:600;}
  164. /* ===== TRAINING EVENT CARD (PC version) ===== */
  165. .training-event-card{background:var(--white);border:1px solid var(--gray-border);border-radius:var(--radius);overflow:hidden;cursor:pointer;transition:all .2s;box-shadow:var(--shadow);}
  166. .training-event-card:hover{box-shadow:var(--shadow-md);border-color:rgba(24,87,212,.2);transform:translateY(-2px);}
  167. .training-event-cover{width:100%;height:160px;background:linear-gradient(135deg,#1857d4,#2e6fe0);display:flex;align-items:center;justify-content:center;font-size:42px;position:relative;overflow:hidden;}
  168. .training-event-body{padding:16px;}
  169. .training-event-title{font-size:15px;font-weight:600;color:var(--text-primary);margin-bottom:10px;line-height:1.4;}
  170. .training-event-meta{font-size:13px;color:var(--text-hint);display:flex;flex-direction:column;gap:5px;}
  171. .training-events-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:20px;}
  172. /* ===== MODAL ===== */
  173. .modal-overlay{display:none;position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:500;align-items:center;justify-content:center;padding:20px;}
  174. .modal-overlay.active{display:flex;}
  175. .modal-box{background:var(--white);border-radius:12px;width:100%;max-width:600px;max-height:90vh;overflow-y:auto;animation:modalIn .22s ease;box-shadow:0 8px 40px rgba(24,87,212,.18);}
  176. .modal-box.modal-lg{max-width:900px;}
  177. .modal-header{padding:22px 28px 18px;border-bottom:1px solid var(--gray-border);display:flex;align-items:center;justify-content:space-between;}
  178. .modal-title{font-size:17px;font-weight:700;color:var(--text-primary);}
  179. .modal-close{cursor:pointer;font-size:20px;color:var(--text-hint);background:none;border:none;line-height:1;padding:4px;}
  180. .modal-close:hover{color:var(--text-primary);}
  181. .modal-body{padding:24px 28px;}
  182. .modal-footer{padding:18px 28px;border-top:1px solid var(--gray-border);display:flex;align-items:center;justify-content:flex-end;gap:10px;}
  183. @keyframes modalIn{from{transform:scale(.93) translateY(10px);opacity:0;}to{transform:scale(1) translateY(0);opacity:1;}}
  184. /* ===== MISC ===== */
  185. .mt8{margin-top:8px;}.mt12{margin-top:12px;}.mt16{margin-top:16px;}.mt20{margin-top:20px;}
  186. .mb8{margin-bottom:8px;}.mb12{margin-bottom:12px;}.mb16{margin-bottom:16px;}
  187. .flex{display:flex;}.flex-col{flex-direction:column;}.items-center{align-items:center;}
  188. .justify-between{justify-content:space-between;}.gap8{gap:8px;}.gap12{gap:12px;}.gap16{gap:16px;}
  189. .text-sm{font-size:13px;}.text-xs{font-size:12px;}.text-bold{font-weight:600;}.text-gray{color:var(--gray);}
  190. .text-blue{color:var(--blue);}.text-green{color:var(--green);}.text-orange{color:var(--orange);}.text-red{color:var(--red);}
  191. .grid-2{display:grid;grid-template-columns:1fr 1fr;gap:20px;}
  192. .divider{height:1px;background:var(--gray-border);margin:20px 0;}
  193. .empty-state{text-align:center;padding:60px 20px;color:var(--text-hint);}
  194. .empty-icon{font-size:52px;margin-bottom:14px;}
  195. .dot{width:8px;height:8px;border-radius:50%;display:inline-block;}
  196. .dot-green{background:var(--green);}.dot-orange{background:var(--orange);}.dot-red{background:var(--red);}.dot-gray{background:#b0bec5;}
  197. .progress-wrap{background:#e8edf6;border-radius:4px;height:6px;overflow:hidden;margin-top:4px;}
  198. .progress-bar{height:100%;border-radius:4px;background:linear-gradient(90deg,var(--blue-mid),var(--blue));transition:width .4s;}
  199. /* ===== PUBLISH TOGGLE (table-safe) ===== */
  200. .pub-slider{position:absolute;inset:0;border-radius:24px;transition:.3s;cursor:pointer;}
  201. .pub-slider::before{content:'';position:absolute;width:18px;height:18px;left:3px;top:3px;background:white;border-radius:50%;transition:.3s;box-shadow:0 1px 3px rgba(0,0,0,.2);}
  202. .pub-on{background:var(--blue);}
  203. .pub-off{background:#ccc;}
  204. .pub-on::before{transform:translateX(20px);}
  205. </style>
  206. </head>
  207. <body>
  208. <!-- ===== HEADER ===== -->
  209. <div class="admin-header">
  210. <div class="header-logo">
  211. <div class="header-logo-icon">🔬</div>
  212. <span>实验室安全教育与考试</span>
  213. </div>
  214. <div class="header-right">
  215. <div onclick="window.open('admin_requirements.html','_blank')" style="cursor:pointer;background:rgba(255,255,255,.18);border:1px solid rgba(255,255,255,.35);border-radius:6px;padding:4px 12px;font-size:13px;color:#fff;white-space:nowrap;">需求说明</div>
  216. <div style="color:rgba(255,255,255,.7);font-size:12px;">2026-07-31</div>
  217. <div class="header-username">管理员</div>
  218. <div class="header-avatar">👤</div>
  219. </div>
  220. </div>
  221. <!-- ===== BODY ===== -->
  222. <div class="admin-body">
  223. <!-- ===== SIDEBAR ===== -->
  224. <div class="sidebar" id="sidebar">
  225. <div class="nav-group">
  226. <div class="nav-group-label">培训活动</div>
  227. <div class="nav-item active" onclick="showPage('page-training-plan')"><span class="nav-icon">📋</span>培训计划</div>
  228. <div class="nav-item" onclick="showPage('page-training-activity-list')"><span class="nav-icon">📅</span>线下培训</div>
  229. </div>
  230. <div class="nav-group">
  231. <div class="nav-group-label">考试管理</div>
  232. <div class="nav-item" onclick="showPage('page-exam-template')"><span class="nav-icon">📋</span>考试模板</div>
  233. </div>
  234. </div>
  235. <!-- ===== MAIN CONTENT ===== -->
  236. <div class="main-content">
  237. <!-- ==================== PAGE: 培训计划 ==================== -->
  238. <div class="page active" id="page-training-plan">
  239. <div class="breadcrumb"><a onclick="showPage('page-workbench');switchMenu('workbench')">工作台</a><span class="breadcrumb-sep">/</span><span>培训活动</span><span class="breadcrumb-sep">/</span><span>培训计划</span></div>
  240. <div class="page-header">
  241. <div><div class="page-title">培训计划</div><div class="page-subtitle">管理所有培训活动的计划与发布状态</div></div>
  242. <button class="btn btn-primary" onclick="showPage('page-training-new')">➕ 新建培训</button>
  243. </div>
  244. <div class="search-bar">
  245. <div class="search-input-wrap"><span class="search-icon">🔍</span><input class="search-input" placeholder="搜索培训名称、主讲人..."></div>
  246. <select class="form-input form-select" style="width:130px;"><option>全部状态</option><option>进行中</option><option>即将开始</option><option>已结束</option></select>
  247. <select class="form-input form-select" style="width:130px;"><option>全部分类</option><option>知识讲座</option><option>应急演练</option></select>
  248. <input class="form-input" type="text" placeholder="组织单位" style="width:140px;">
  249. <div class="flex items-center gap8" style="flex-shrink:0;">
  250. <input class="form-input" type="date" style="width:150px;" title="开始日期">
  251. <span style="color:var(--text-hint);font-size:13px;">至</span>
  252. <input class="form-input" type="date" style="width:150px;" title="结束日期">
  253. </div>
  254. <button class="btn btn-outline">筛选</button>
  255. <button class="btn btn-outline-gray">重置</button>
  256. </div>
  257. <!-- Teacher view -->
  258. <div id="plan-teacher-view">
  259. <div class="table-wrap">
  260. <table>
  261. <thead><tr><th>培训名称</th><th>分类</th><th>培训时间</th><th>组织单位</th><th>学时/积分</th><th>签到人数</th><th>签到状态</th><th>发布</th><th>操作</th></tr></thead>
  262. <tbody>
  263. <tr>
  264. <td><span class="text-blue" style="cursor:pointer;font-weight:500;" onclick="showPage('page-training-plan-detail')">实验室生物安全操作规范培训</span></td>
  265. <td><span class="tag tag-blue">知识讲座</span></td>
  266. <td style="white-space:nowrap;">2026-08-01<br><span class="text-xs text-gray">10:00–12:00</span></td>
  267. <td>生命科学学院</td>
  268. <td><span class="text-green text-bold">2学时 +10分</span></td>
  269. <td><div><span class="text-bold text-blue">42</span> / 60</div><div class="progress-wrap" style="width:80px;margin-top:4px;"><div class="progress-bar" style="width:70%;"></div></div></td>
  270. <td><div class="flex" style="gap:4px;flex-wrap:wrap;"><span class="tag tag-green" style="font-size:10px;">已签到 42</span><span class="tag tag-red" style="font-size:10px;">未到 18</span></div></td>
  271. <td><div style="width:44px;height:24px;position:relative;cursor:pointer;"><div class="pub-slider pub-on"></div></div></td>
  272. <td><div class="flex gap8"><button class="btn btn-sm btn-outline" onclick="showModal('modal-qr')">📷 签到码</button><button class="btn btn-sm btn-outline" onclick="showModal('modal-progress')">📊 进度</button><button class="btn btn-sm btn-outline" onclick="showPage('page-training-new')">编辑</button><button class="btn btn-sm btn-danger" onclick="showModal('modal-confirm-delete')">删除</button></div></td>
  273. </tr>
  274. <tr>
  275. <td><span class="text-blue" style="cursor:pointer;font-weight:500;" onclick="showPage('page-training-plan-detail')">化学品泄漏应急演练2026</span></td>
  276. <td><span class="tag tag-orange">应急演练</span></td>
  277. <td style="white-space:nowrap;">2026-08-05<br><span class="text-xs text-gray">14:00–17:00</span></td>
  278. <td>化学化工学院</td>
  279. <td><span class="text-green text-bold">3学时 +15分</span></td>
  280. <td><div><span class="text-bold text-orange">0</span> / 50</div><div class="progress-wrap" style="width:80px;margin-top:4px;"><div class="progress-bar" style="width:0%;"></div></div></td>
  281. <td><span class="tag tag-gray" style="font-size:10px;">未开始</span></td>
  282. <td><div style="width:44px;height:24px;position:relative;cursor:pointer;"><div class="pub-slider pub-off"></div></div></td>
  283. <td><div class="flex gap8"><button class="btn btn-sm btn-outline" onclick="showModal('modal-qr')">📷 签到码</button><button class="btn btn-sm btn-outline" onclick="showModal('modal-progress')">📊 进度</button><button class="btn btn-sm btn-outline" onclick="showPage('page-training-new')">编辑</button><button class="btn btn-sm btn-danger" onclick="showModal('modal-confirm-delete')">删除</button></div></td>
  284. </tr>
  285. <tr>
  286. <td><span class="text-blue" style="cursor:pointer;font-weight:500;" onclick="showPage('page-training-plan-detail')">辐射安全基础知识讲座</span></td>
  287. <td><span class="tag tag-blue">知识讲座</span></td>
  288. <td style="white-space:nowrap;">2026-07-20<br><span class="text-xs text-gray">14:00–16:00</span></td>
  289. <td>物理学院</td>
  290. <td><span class="text-green text-bold">2学时 +10分</span></td>
  291. <td><div><span class="text-bold text-green">55</span> / 60</div><div class="progress-wrap" style="width:80px;margin-top:4px;"><div class="progress-bar" style="width:92%;background:linear-gradient(90deg,var(--green),var(--green-dark));"></div></div></td>
  292. <td><div class="flex" style="gap:4px;flex-wrap:wrap;"><span class="tag tag-green" style="font-size:10px;">已签到 55</span><span class="tag tag-red" style="font-size:10px;">未到 5</span></div></td>
  293. <td><div style="width:44px;height:24px;position:relative;cursor:pointer;"><div class="pub-slider pub-on"></div></div></td>
  294. <td><div class="flex gap8"><button class="btn btn-sm btn-outline-gray" onclick="showModal('modal-record-detail')">查看记录</button><button class="btn btn-sm btn-outline" onclick="showPage('page-training-new')">编辑</button><button class="btn btn-sm btn-danger" onclick="showModal('modal-confirm-delete')">删除</button></div></td>
  295. </tr>
  296. <tr>
  297. <td><span class="text-blue" style="cursor:pointer;font-weight:500;" onclick="showPage('page-training-plan-detail')">全校实验室安全通识培训2026</span></td>
  298. <td><span class="tag tag-blue">知识讲座</span></td>
  299. <td style="white-space:nowrap;">2026-09-01<br><span class="text-xs text-gray">09:00–11:00</span></td>
  300. <td>测试大学</td>
  301. <td><span class="text-green text-bold">2学时 +10分</span></td>
  302. <td><div><span class="text-bold text-gray">0</span> / —</div><div class="progress-wrap" style="width:80px;margin-top:4px;"><div class="progress-bar" style="width:0%;"></div></div></td>
  303. <td><span class="tag tag-gray" style="font-size:10px;">未开始</span></td>
  304. <td><div style="width:44px;height:24px;position:relative;cursor:pointer;"><div class="pub-slider pub-off"></div></div></td>
  305. <td><div class="flex gap8"><button class="btn btn-sm btn-outline" onclick="showModal('modal-qr')">📷 签到码</button><button class="btn btn-sm btn-outline" onclick="showModal('modal-progress')">📊 进度</button><button class="btn btn-sm btn-outline" onclick="showPage('page-training-new')">编辑</button><button class="btn btn-sm btn-danger" onclick="showModal('modal-confirm-delete')">删除</button></div></td>
  306. </tr>
  307. </tbody>
  308. </table>
  309. </div>
  310. </div>
  311. <div class="pagination">
  312. <button class="page-btn">«</button><button class="page-btn active">1</button><button class="page-btn">2</button><button class="page-btn">3</button><button class="page-btn">»</button>
  313. <span class="page-info">共 18 条</span>
  314. </div>
  315. </div>
  316. <div class="page" id="page-training-new">
  317. <div class="breadcrumb"><span>培训活动</span><span class="breadcrumb-sep">/</span><span>新建培训</span></div>
  318. <div class="page-header">
  319. <div><div class="page-title">新建培训</div><div class="page-subtitle">填写培训活动信息</div></div>
  320. <div class="flex gap8">
  321. <button class="btn btn-outline-gray" onclick="showPage('page-training-plan')">取消</button>
  322. <button class="btn btn-primary">保存</button>
  323. </div>
  324. </div>
  325. <div class="card">
  326. <div class="card-title">基本信息</div>
  327. <div class="form-grid">
  328. <div class="form-item col-2">
  329. <label class="form-label required">活动名称</label>
  330. <input class="form-input" placeholder="请输入培训活动名称">
  331. </div>
  332. <div class="form-item">
  333. <label class="form-label required">活动分类</label>
  334. <select class="form-input form-select"><option value="">请选择</option><option>知识讲座</option><option>应急演练</option></select>
  335. </div>
  336. <div class="form-item">
  337. <label class="form-label required">组织单位</label>
  338. <input class="form-input" placeholder="请输入组织单位">
  339. </div>
  340. <div class="form-item">
  341. <label class="form-label required">培训开始时间</label>
  342. <input class="form-input" type="datetime-local" step="1">
  343. </div>
  344. <div class="form-item">
  345. <label class="form-label required">培训结束时间</label>
  346. <input class="form-input" type="datetime-local" step="1">
  347. </div>
  348. <div class="form-item">
  349. <label class="form-label required">主讲人</label>
  350. <input class="form-input" placeholder="请输入主讲人姓名">
  351. </div>
  352. <div class="form-item">
  353. <label class="form-label required">培训地点</label>
  354. <input class="form-input" placeholder="请输入培训地点">
  355. </div>
  356. <div class="form-item">
  357. <label class="form-label required">可得学时</label>
  358. <input class="form-input" type="number" placeholder="例:2" min="0.5" step="0.5">
  359. </div>
  360. <div class="form-item">
  361. <label class="form-label required">可得积分</label>
  362. <input class="form-input" type="number" placeholder="例:10" min="0" step="1">
  363. </div>
  364. <div class="form-item col-2">
  365. <label class="form-label required">培训学员</label>
  366. <div class="flex gap8" style="margin-bottom:10px;">
  367. <label style="display:flex;align-items:center;gap:6px;cursor:pointer;padding:7px 14px;border:1.5px solid var(--gray-border);border-radius:6px;font-size:13px;transition:all .15s;" id="scope-label-all" onclick="setScopeMode('all')">
  368. <input type="radio" name="training-scope" value="all" checked style="accent-color:var(--blue);"> 全校
  369. </label>
  370. <label style="display:flex;align-items:center;gap:6px;cursor:pointer;padding:7px 14px;border:1.5px solid var(--gray-border);border-radius:6px;font-size:13px;transition:all .15s;" id="scope-label-dept" onclick="setScopeMode('dept')">
  371. <input type="radio" name="training-scope" value="dept" style="accent-color:var(--blue);"> 指定范围
  372. </label>
  373. <label style="display:flex;align-items:center;gap:6px;cursor:pointer;padding:7px 14px;border:1.5px solid var(--gray-border);border-radius:6px;font-size:13px;transition:all .15s;" id="scope-label-person" onclick="setScopeMode('person')">
  374. <input type="radio" name="training-scope" value="person" style="accent-color:var(--blue);"> 指定人员
  375. </label>
  376. </div>
  377. <!-- 指定范围:多维筛选 -->
  378. <div id="scope-dept-section" style="display:none;padding:16px;background:var(--blue-xlight);border-radius:8px;border:1px solid rgba(24,87,212,.12);">
  379. <div style="display:flex;flex-direction:column;gap:14px;">
  380. <!-- 学院单位 -->
  381. <div>
  382. <div style="font-size:12px;font-weight:600;color:var(--text-secondary);margin-bottom:8px;">学院单位</div>
  383. <div style="display:flex;flex-wrap:wrap;gap:8px;">
  384. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">生命科学学院</label>
  385. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">化学化工学院</label>
  386. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">物理学院</label>
  387. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">材料科学学院</label>
  388. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">医学院</label>
  389. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">环境科学学院</label>
  390. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">安全管理处</label>
  391. </div>
  392. </div>
  393. <!-- 学年 -->
  394. <div>
  395. <div style="font-size:12px;font-weight:600;color:var(--text-secondary);margin-bottom:8px;">学年</div>
  396. <div style="display:flex;flex-wrap:wrap;gap:8px;">
  397. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">2026级</label>
  398. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">2025级</label>
  399. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">2024级</label>
  400. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">2023级</label>
  401. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">2022级</label>
  402. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">2021级及以前</label>
  403. </div>
  404. </div>
  405. <!-- 用户类别 -->
  406. <div>
  407. <div style="font-size:12px;font-weight:600;color:var(--text-secondary);margin-bottom:8px;">用户类别</div>
  408. <div style="display:flex;flex-wrap:wrap;gap:8px;">
  409. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">教职工</label>
  410. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">本科生</label>
  411. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">研究生</label>
  412. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">博士生</label>
  413. </div>
  414. </div>
  415. <!-- 专业 -->
  416. <div>
  417. <div style="font-size:12px;font-weight:600;color:var(--text-secondary);margin-bottom:8px;">专业</div>
  418. <div style="display:flex;flex-wrap:wrap;gap:8px;">
  419. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">生物技术</label>
  420. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">化学工程</label>
  421. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">应用化学</label>
  422. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">物理学</label>
  423. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">材料科学</label>
  424. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">临床医学</label>
  425. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">环境工程</label>
  426. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">安全工程</label>
  427. </div>
  428. </div>
  429. </div>
  430. </div>
  431. <!-- 指定人员 -->
  432. <div id="scope-person-section" style="display:none;padding:16px;background:var(--blue-xlight);border-radius:8px;border:1px solid rgba(24,87,212,.12);">
  433. <!-- 搜索栏 -->
  434. <div class="flex gap8" style="margin-bottom:14px;">
  435. <div class="search-input-wrap" style="flex:1;">
  436. <span class="search-icon">🔍</span>
  437. <input class="search-input" placeholder="搜索姓名 / 学工号...">
  438. </div>
  439. <button class="btn btn-outline" style="white-space:nowrap;">📥 批量导入</button>
  440. </div>
  441. <!-- 筛选维度 -->
  442. <div style="display:flex;flex-direction:column;gap:14px;margin-bottom:14px;">
  443. <div>
  444. <div style="font-size:12px;color:var(--text-secondary);font-weight:500;margin-bottom:8px;">学院单位</div>
  445. <div style="display:flex;flex-wrap:wrap;gap:8px;">
  446. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">生命科学学院</label>
  447. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">化学化工学院</label>
  448. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">物理学院</label>
  449. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">材料科学学院</label>
  450. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">医学院</label>
  451. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">环境科学学院</label>
  452. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">安全管理处</label>
  453. </div>
  454. </div>
  455. <div>
  456. <div style="font-size:12px;color:var(--text-secondary);font-weight:500;margin-bottom:8px;">学年</div>
  457. <div style="display:flex;flex-wrap:wrap;gap:8px;">
  458. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">2026级</label>
  459. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">2025级</label>
  460. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">2024级</label>
  461. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">2023级</label>
  462. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">2022级</label>
  463. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">2021级及以前</label>
  464. </div>
  465. </div>
  466. <div>
  467. <div style="font-size:12px;color:var(--text-secondary);font-weight:500;margin-bottom:8px;">用户类别</div>
  468. <div style="display:flex;flex-wrap:wrap;gap:8px;">
  469. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">教职工</label>
  470. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">本科生</label>
  471. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">研究生</label>
  472. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">博士生</label>
  473. </div>
  474. </div>
  475. <div>
  476. <div style="font-size:12px;color:var(--text-secondary);font-weight:500;margin-bottom:8px;">专业</div>
  477. <div style="display:flex;flex-wrap:wrap;gap:8px;">
  478. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">生物技术</label>
  479. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">化学工程</label>
  480. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">应用化学</label>
  481. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">物理学</label>
  482. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">材料科学</label>
  483. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">临床医学</label>
  484. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">环境工程</label>
  485. <label style="display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;padding:4px 10px;border:1px solid var(--gray-border);border-radius:20px;background:var(--white);"><input type="checkbox" style="accent-color:var(--blue);">安全工程</label>
  486. </div>
  487. </div>
  488. </div>
  489. <!-- 查询结果列表 -->
  490. <div style="background:var(--white);border-radius:8px;border:1px solid var(--gray-border);overflow:hidden;">
  491. <table class="data-table" style="margin:0;">
  492. <thead>
  493. <tr>
  494. <th style="width:36px;"><input type="checkbox" style="accent-color:var(--blue);"></th>
  495. <th>姓名</th>
  496. <th>学工号</th>
  497. <th>学院</th>
  498. <th>专业</th>
  499. <th>类别</th>
  500. <th>学年</th>
  501. </tr>
  502. </thead>
  503. <tbody>
  504. <tr>
  505. <td><input type="checkbox" style="accent-color:var(--blue);" checked></td>
  506. <td>张明远</td><td>2024010123</td><td>化学化工学院</td><td>化学工程</td><td>本科生</td><td>2024级</td>
  507. </tr>
  508. <tr>
  509. <td><input type="checkbox" style="accent-color:var(--blue);" checked></td>
  510. <td>李晓燕</td><td>2024010256</td><td>生命科学学院</td><td>生物技术</td><td>本科生</td><td>2024级</td>
  511. </tr>
  512. <tr>
  513. <td><input type="checkbox" style="accent-color:var(--blue);"></td>
  514. <td>王浩然</td><td>2023020078</td><td>材料科学学院</td><td>材料科学</td><td>研究生</td><td>2023级</td>
  515. </tr>
  516. <tr>
  517. <td><input type="checkbox" style="accent-color:var(--blue);"></td>
  518. <td>陈思雨</td><td>2025010312</td><td>物理学院</td><td>物理学</td><td>本科生</td><td>2025级</td>
  519. </tr>
  520. <tr>
  521. <td><input type="checkbox" style="accent-color:var(--blue);"></td>
  522. <td>刘建国</td><td>T20180045</td><td>安全管理处</td><td>—</td><td>教职工</td><td>—</td>
  523. </tr>
  524. </tbody>
  525. </table>
  526. </div>
  527. </div>
  528. </div>
  529. </div>
  530. <div class="divider"></div>
  531. <div class="card-title">封面图片</div>
  532. <div class="upload-area" style="max-width:400px;">
  533. <div class="upload-icon">🖼️</div>
  534. <div class="upload-text">点击或拖拽上传封面图<br><span style="font-size:11px;">推荐尺寸 16:9,支持 JPG / PNG,最大 5MB</span></div>
  535. </div>
  536. <div class="divider"></div>
  537. <div class="card-title">培训详情</div>
  538. <div class="rich-editor">
  539. <div class="rich-toolbar">
  540. <button class="rich-tool-btn">B</button><button class="rich-tool-btn"><i>I</i></button><button class="rich-tool-btn">U</button>
  541. <button class="rich-tool-btn">H1</button><button class="rich-tool-btn">H2</button>
  542. <button class="rich-tool-btn">≡</button><button class="rich-tool-btn">•</button>
  543. <button class="rich-tool-btn">🔗</button><button class="rich-tool-btn">🖼</button><button class="rich-tool-btn">📊</button>
  544. </div>
  545. <div class="rich-body" contenteditable="true">请输入培训详情内容,可包含培训目标、培训内容大纲、注意事项等...</div>
  546. </div>
  547. <div class="divider"></div>
  548. <div class="card-title">附件上传</div>
  549. <div class="upload-area">
  550. <div class="upload-icon">📎</div>
  551. <div class="upload-text">点击上传培训相关文件(PPT、PDF、Word等)<br><span style="font-size:11px;">支持 PDF / PPT / PPTX / DOC / DOCX,单文件最大 50MB</span></div>
  552. </div>
  553. <div class="divider"></div>
  554. <div style="display:flex;flex-direction:column;gap:16px;">
  555. <div class="form-item">
  556. <label class="form-label">发布状态</label>
  557. <div class="flex items-center gap8">
  558. <label class="toggle"><input type="checkbox" id="publish-toggle"><span class="toggle-slider"></span></label>
  559. <span style="font-size:13px;color:var(--text-secondary);">开启后培训学员可见</span>
  560. </div>
  561. </div>
  562. <div class="form-item">
  563. <label class="form-label">颁发证书</label>
  564. <div class="flex items-center gap8" style="margin-bottom:10px;">
  565. <label class="toggle"><input type="checkbox" id="cert-toggle" onchange="toggleCertTemplate(this)"><span class="toggle-slider"></span></label>
  566. <span style="font-size:13px;color:var(--text-secondary);">开启后完成培训的学员可获得培训证书</span>
  567. </div>
  568. <div id="cert-template-section" style="display:none;margin-top:8px;padding:14px;background:var(--blue-xlight);border-radius:8px;border:1px solid rgba(24,87,212,.12);">
  569. <label class="form-label" style="margin-bottom:8px;">证书模板</label>
  570. <select class="form-input form-select" style="max-width:360px;">
  571. <option value="">请选择证书模板</option>
  572. <option>实验室安全培训证书(通用)</option>
  573. <option>生物安全专项培训证书</option>
  574. <option>化学品安全培训证书</option>
  575. <option>应急演练参与证书</option>
  576. </select>
  577. <div class="form-hint" style="margin-top:6px;">证书将自动填入学员姓名、培训名称、培训日期及学时信息</div>
  578. </div>
  579. </div>
  580. </div>
  581. </div>
  582. </div>
  583. <!-- ==================== PAGE: 培训记录 ==================== -->
  584. <div class="page" id="page-training-record">
  585. <div class="breadcrumb"><a onclick="showPage('page-workbench');switchMenu('workbench')">工作台</a><span class="breadcrumb-sep">/</span><span>培训活动</span><span class="breadcrumb-sep">/</span><span>培训记录</span></div>
  586. <div class="page-header">
  587. <div><div class="page-title">培训记录</div><div class="page-subtitle">已结束培训的参与记录与证明</div></div>
  588. <button class="btn btn-outline">📤 导出记录</button>
  589. </div>
  590. <div class="search-bar">
  591. <div class="search-input-wrap"><span class="search-icon">🔍</span><input class="search-input" placeholder="搜索培训名称、学员姓名..."></div>
  592. <select class="form-input form-select" style="width:130px;"><option>全部分类</option><option>知识讲座</option><option>应急演练</option></select>
  593. <input class="form-input" type="month" style="width:160px;" value="2026-07">
  594. <button class="btn btn-outline">筛选</button>
  595. </div>
  596. <div class="card mb16">
  597. <div class="card-title">已结束培训列表</div>
  598. <div class="table-wrap">
  599. <table>
  600. <thead><tr><th>培训名称</th><th>分类</th><th>培训时间</th><th>主讲人</th><th>应到人数</th><th>实到人数</th><th>签到率</th><th>操作</th></tr></thead>
  601. <tbody>
  602. <tr>
  603. <td><span class="text-blue" style="cursor:pointer;font-weight:500;" onclick="showModal('modal-record-detail')">辐射安全基础知识讲座</span></td>
  604. <td><span class="tag tag-blue">知识讲座</span></td>
  605. <td style="white-space:nowrap;">2026-07-20<br><span class="text-xs text-gray">14:00–16:00</span></td>
  606. <td>陈教授</td>
  607. <td>60</td>
  608. <td><span class="text-bold text-green">55</span></td>
  609. <td>
  610. <div>91.7%</div>
  611. <div class="progress-wrap" style="width:80px;"><div class="progress-bar" style="width:92%;background:linear-gradient(90deg,var(--green),var(--green-dark));"></div></div>
  612. </td>
  613. <td><div class="flex gap8"><button class="btn btn-sm btn-outline" onclick="showModal('modal-record-detail')">查看详情</button><button class="btn btn-sm btn-outline-gray">导出</button></div></td>
  614. </tr>
  615. <tr>
  616. <td><span class="text-blue" style="cursor:pointer;font-weight:500;" onclick="showModal('modal-record-detail')">生物安全法规与合规操作</span></td>
  617. <td><span class="tag tag-blue">知识讲座</span></td>
  618. <td style="white-space:nowrap;">2026-07-10<br><span class="text-xs text-gray">09:00–11:00</span></td>
  619. <td>刘研究员</td>
  620. <td>45</td>
  621. <td><span class="text-bold text-green">43</span></td>
  622. <td>
  623. <div>95.6%</div>
  624. <div class="progress-wrap" style="width:80px;"><div class="progress-bar" style="width:96%;background:linear-gradient(90deg,var(--green),var(--green-dark));"></div></div>
  625. </td>
  626. <td><div class="flex gap8"><button class="btn btn-sm btn-outline" onclick="showModal('modal-record-detail')">查看详情</button><button class="btn btn-sm btn-outline-gray">导出</button></div></td>
  627. </tr>
  628. <tr>
  629. <td><span class="text-blue" style="cursor:pointer;font-weight:500;" onclick="showModal('modal-record-detail')">消防疏散应急演练(A区)</span></td>
  630. <td><span class="tag tag-orange">应急演练</span></td>
  631. <td style="white-space:nowrap;">2026-06-25<br><span class="text-xs text-gray">15:00–17:30</span></td>
  632. <td>安全部</td>
  633. <td>120</td>
  634. <td><span class="text-bold text-blue">98</span></td>
  635. <td>
  636. <div>81.7%</div>
  637. <div class="progress-wrap" style="width:80px;"><div class="progress-bar" style="width:82%;"></div></div>
  638. </td>
  639. <td><div class="flex gap8"><button class="btn btn-sm btn-outline" onclick="showModal('modal-record-detail')">查看详情</button><button class="btn btn-sm btn-outline-gray">导出</button></div></td>
  640. </tr>
  641. </tbody>
  642. </table>
  643. </div>
  644. <div class="pagination">
  645. <button class="page-btn">«</button><button class="page-btn active">1</button><button class="page-btn">2</button><button class="page-btn">»</button>
  646. <span class="page-info">共 9 条</span>
  647. </div>
  648. </div>
  649. </div>
  650. <!-- PAGE: 线下培训列表 -->
  651. <div class="page" id="page-training-activity-list">
  652. <div class="breadcrumb"><a onclick="showPage('page-workbench');switchMenu('workbench')">工作台</a><span class="breadcrumb-sep">/</span><span>培训活动</span><span class="breadcrumb-sep">/</span><span>线下培训</span></div>
  653. <div class="page-header">
  654. <div><div class="page-title">线下培训</div><div class="page-subtitle">全部线下培训活动列表</div></div>
  655. <button class="btn btn-primary" onclick="showPage('page-training-new');switchMenu('training-mgmt')">+ 新建培训</button>
  656. </div>
  657. <div class="search-bar">
  658. <div class="search-input-wrap"><span class="search-icon">&#128269;</span><input class="search-input" placeholder="搜索培训名称、主讲人..."></div>
  659. <select class="form-input form-select" style="width:130px;"><option>全部状态</option><option>进行中</option><option>即将开始</option><option>报名中</option><option>已结束</option></select>
  660. <select class="form-input form-select" style="width:130px;"><option>全部分类</option><option>知识讲座</option><option>应急演练</option></select>
  661. <button class="btn btn-outline">筛选</button>
  662. <div style="margin-left:auto;display:flex;gap:8px;">
  663. <button class="btn btn-outline-gray" onclick="setListView('grid')">卡片视图</button>
  664. <button class="btn btn-outline-gray" onclick="setListView('list')">列表视图</button>
  665. </div>
  666. </div>
  667. <div id="activity-grid-view" class="training-events-grid">
  668. <div class="training-event-card" onclick="showPage('page-training-activity-detail')">
  669. <div class="training-event-cover" style="background:linear-gradient(135deg,#1857d4,#2e6fe0);">&#129514;<div style="position:absolute;top:10px;left:10px;"><span class="tag tag-orange" style="background:rgba(230,126,34,.9);color:#fff;">进行中</span></div><div style="position:absolute;bottom:10px;right:10px;background:rgba(255,255,255,.15);border-radius:6px;padding:4px 8px;font-size:11px;color:rgba(255,255,255,.9);">2学时</div></div>
  670. <div class="training-event-body"><div class="training-event-title">实验室生物安全操作规范培训</div><div class="training-event-meta"><div>2026-08-01 10:00-12:00</div><div>生命科学楼 B206</div><div class="flex items-center gap8 mt8"><span class="tag tag-blue">知识讲座</span><span class="text-xs text-gray">42/60人</span><span class="text-xs text-green">+2学时+10积分</span></div></div></div>
  671. </div>
  672. <div class="training-event-card" onclick="showPage('page-training-activity-detail')">
  673. <div class="training-event-cover" style="background:linear-gradient(135deg,#e67e22,#f39c12);">&#128666;<div style="position:absolute;top:10px;left:10px;"><span class="tag" style="background:rgba(229,62,62,.9);color:#fff;">即将开始</span></div><div style="position:absolute;bottom:10px;right:10px;background:rgba(255,255,255,.15);border-radius:6px;padding:4px 8px;font-size:11px;color:rgba(255,255,255,.9);">3学时</div></div>
  674. <div class="training-event-body"><div class="training-event-title">化学品泄漏应急演练2026</div><div class="training-event-meta"><div>2026-08-05 14:00-17:00</div><div>化学实验楼 A101</div><div class="flex items-center gap8 mt8"><span class="tag tag-orange">应急演练</span><span class="text-xs text-gray">28/50人</span><span class="text-xs text-green">+3学时+15积分</span></div></div></div>
  675. </div>
  676. <div class="training-event-card" onclick="showPage('page-training-activity-detail')">
  677. <div class="training-event-cover" style="background:linear-gradient(135deg,#10a37f,#0d8f6f);">&#9889;<div style="position:absolute;top:10px;left:10px;"><span class="tag tag-green" style="background:rgba(16,163,127,.9);color:#fff;">报名中</span></div><div style="position:absolute;bottom:10px;right:10px;background:rgba(255,255,255,.15);border-radius:6px;padding:4px 8px;font-size:11px;color:rgba(255,255,255,.9);">1.5学时</div></div>
  678. <div class="training-event-body"><div class="training-event-title">实验室用电安全与消防知识讲座</div><div class="training-event-meta"><div>2026-08-10 09:30-11:00</div><div>综合楼 3F 多功能厅</div><div class="flex items-center gap8 mt8"><span class="tag tag-blue">知识讲座</span><span class="text-xs text-gray">15/80人</span><span class="text-xs text-green">+1.5学时+8积分</span></div></div></div>
  679. </div>
  680. <div class="training-event-card" onclick="showPage('page-training-activity-detail')">
  681. <div class="training-event-cover" style="background:linear-gradient(135deg,#6f42c1,#5a35a0);">&#9762;<div style="position:absolute;top:10px;left:10px;"><span class="tag tag-gray" style="background:rgba(136,150,167,.9);color:#fff;">已结束</span></div><div style="position:absolute;bottom:10px;right:10px;background:rgba(255,255,255,.15);border-radius:6px;padding:4px 8px;font-size:11px;color:rgba(255,255,255,.9);">2学时</div></div>
  682. <div class="training-event-body"><div class="training-event-title">辐射安全基础知识讲座</div><div class="training-event-meta"><div>2026-07-20 14:00-16:00</div><div>物理楼 C301</div><div class="flex items-center gap8 mt8"><span class="tag tag-blue">知识讲座</span><span class="text-xs text-green text-bold">55/60人签到</span></div></div></div>
  683. </div>
  684. <div class="training-event-card" onclick="showPage('page-training-activity-detail')">
  685. <div class="training-event-cover" style="background:linear-gradient(135deg,#e53e3e,#c53030);">&#128293;<div style="position:absolute;top:10px;left:10px;"><span class="tag tag-gray" style="background:rgba(136,150,167,.9);color:#fff;">已结束</span></div><div style="position:absolute;bottom:10px;right:10px;background:rgba(255,255,255,.15);border-radius:6px;padding:4px 8px;font-size:11px;color:rgba(255,255,255,.9);">2.5学时</div></div>
  686. <div class="training-event-body"><div class="training-event-title">消防疏散应急演练(A区)</div><div class="training-event-meta"><div>2026-06-25 15:00-17:30</div><div>A区操场及实验楼</div><div class="flex items-center gap8 mt8"><span class="tag tag-orange">应急演练</span><span class="text-xs text-blue text-bold">98/120人签到</span></div></div></div>
  687. </div>
  688. </div>
  689. <div id="activity-list-view" style="display:none;">
  690. <div class="table-wrap"><table>
  691. <thead><tr><th>培训名称</th><th>分类</th><th>培训时间</th><th>主讲人</th><th>组织单位</th><th>地点</th><th>学时/积分</th><th>签到</th><th>状态</th><th>操作</th></tr></thead>
  692. <tbody>
  693. <tr><td><span class="text-blue" style="cursor:pointer;font-weight:500;" onclick="showPage('page-training-activity-detail')">实验室生物安全操作规范培训</span></td><td><span class="tag tag-blue">知识讲座</span></td><td>2026-08-01</td><td>李教授</td><td>生命科学学院</td><td>生命科学楼 B206</td><td><span class="text-green text-bold">2学时+10分</span></td><td>42/60</td><td><span class="tag tag-orange">进行中</span></td><td><button class="btn btn-sm btn-outline" onclick="showPage('page-training-activity-detail')">详情</button></td></tr>
  694. <tr><td><span class="text-blue" style="cursor:pointer;font-weight:500;" onclick="showPage('page-training-activity-detail')">化学品泄漏应急演练2026</span></td><td><span class="tag tag-orange">应急演练</span></td><td>2026-08-05</td><td>王老师</td><td>化学化工学院</td><td>化学楼 A101</td><td><span class="text-green text-bold">3学时+15分</span></td><td>28/50</td><td><span class="tag tag-blue">即将开始</span></td><td><button class="btn btn-sm btn-outline" onclick="showPage('page-training-activity-detail')">详情</button></td></tr>
  695. <tr><td><span class="text-blue" style="cursor:pointer;font-weight:500;" onclick="showPage('page-training-activity-detail')">辐射安全基础知识讲座</span></td><td><span class="tag tag-blue">知识讲座</span></td><td>2026-07-20</td><td>陈教授</td><td>物理学院</td><td>物理楼 C301</td><td><span class="text-green text-bold">2学时+10分</span></td><td>55/60</td><td><span class="tag tag-gray">已结束</span></td><td><button class="btn btn-sm btn-outline-gray" onclick="showPage('page-training-record');switchMenu('training-mgmt')">记录</button></td></tr>
  696. </tbody>
  697. </table></div>
  698. </div>
  699. <div class="pagination" style="margin-top:20px;">
  700. <button class="page-btn">«</button><button class="page-btn active">1</button><button class="page-btn">2</button><button class="page-btn">»</button>
  701. <span class="page-info">共 12 条</span>
  702. </div>
  703. </div>
  704. <!-- PAGE: 线下培训详情 -->
  705. <div class="page" id="page-training-activity-detail">
  706. <div class="breadcrumb"><a onclick="showPage('page-training-activity-list');switchMenu('training-activity')">线下培训</a><span class="breadcrumb-sep">/</span><span>培训详情</span></div>
  707. <div style="display:flex;gap:20px;align-items:flex-start;">
  708. <div style="flex:1;">
  709. <div class="card mb16">
  710. <div style="background:linear-gradient(135deg,#1857d4,#2e6fe0);border-radius:8px;height:200px;display:flex;align-items:center;justify-content:center;font-size:64px;margin-bottom:20px;position:relative;">&#129514;<div style="position:absolute;top:14px;left:14px;"><span class="tag tag-orange" style="background:rgba(230,126,34,.9);color:#fff;">进行中</span></div><div style="position:absolute;bottom:14px;right:14px;background:rgba(255,255,255,.15);border-radius:8px;padding:6px 12px;color:rgba(255,255,255,.95);font-size:13px;">2学时</div></div>
  711. <div style="font-size:22px;font-weight:700;margin-bottom:12px;">实验室生物安全操作规范培训</div>
  712. <div style="display:flex;gap:8px;margin-bottom:16px;"><span class="tag tag-blue">知识讲座</span><span class="tag tag-green">+2学时</span><span class="tag tag-orange">+10积分</span></div>
  713. <div class="divider"></div>
  714. <div class="detail-section">
  715. <div class="detail-section-title">活动信息</div>
  716. <div class="info-row"><div class="info-key">培训时间</div><div class="info-val">2026-08-01 10:00 – 12:00</div></div>
  717. <div class="info-row"><div class="info-key">培训地点</div><div class="info-val">生命科学楼 B206 报告厅</div></div>
  718. <div class="info-row"><div class="info-key">主讲人</div><div class="info-val">李教授(生命科学学院)</div></div>
  719. <div class="info-row"><div class="info-key">组织单位</div><div class="info-val">生命科学学院 安全教育办公室</div></div>
  720. <div class="info-row"><div class="info-key">培训时长</div><div class="info-val">2 学时(120分钟)</div></div>
  721. <div class="info-row"><div class="info-key">可获学时</div><div class="info-val"><span class="text-green text-bold">2 学时</span></div></div>
  722. <div class="info-row"><div class="info-key">可获积分</div><div class="info-val"><span class="text-orange text-bold">10 积分</span></div></div>
  723. </div>
  724. <div class="divider"></div>
  725. <div class="detail-section">
  726. <div class="detail-section-title">培训详情</div>
  727. <div style="font-size:14px;color:var(--text-secondary);line-height:1.8;">
  728. <p style="margin-bottom:10px;">本次培训旨在强化实验室人员生物安全意识,规范日常实验操作,降低生物安全风险。</p>
  729. <p style="margin-bottom:8px;font-weight:600;color:var(--text-primary);">培训内容:</p>
  730. <ul style="padding-left:20px;display:flex;flex-direction:column;gap:6px;"><li>生物安全基本概念与法律法规解读</li><li>实验室生物安全等级介绍</li><li>个人防护装备(PPE)的正确使用</li><li>生物危险废弃物的分类处置</li><li>意外事故应急处理流程</li></ul>
  731. </div>
  732. </div>
  733. </div>
  734. </div>
  735. <div style="width:300px;flex-shrink:0;">
  736. <div class="card mb16">
  737. <div class="card-title">签到二维码</div>
  738. <div style="text-align:center;padding:16px 0;">
  739. <div style="width:140px;height:140px;background:var(--gray-light);border:2px solid var(--gray-border);border-radius:8px;display:flex;flex-direction:column;align-items:center;justify-content:center;margin:0 auto 12px;font-size:48px;cursor:pointer;" onclick="showModal('modal-qr')">&#9640;<div style="font-size:11px;color:var(--text-hint);margin-top:4px;">点击放大</div></div>
  740. <button class="btn btn-primary" style="width:100%;margin-bottom:8px;" onclick="showModal('modal-qr')">显示签到码</button>
  741. <button class="btn btn-outline" style="width:100%;">下载二维码</button>
  742. </div>
  743. </div>
  744. <div class="card" style="margin-top:0;">
  745. <div class="card-title">培训证明图片</div>
  746. <div style="font-size:12px;color:var(--text-hint);margin-bottom:12px;">上传培训现场照片、签到表扫描件等作为培训证明,供学员查看下载。</div>
  747. <div style="display:flex;flex-wrap:wrap;gap:10px;margin-bottom:12px;">
  748. <div style="width:90px;height:90px;border-radius:6px;background:var(--gray-light);border:1px solid var(--gray-border);display:flex;align-items:center;justify-content:center;font-size:32px;cursor:pointer;" onclick="showModal('modal-proof-img')">🖼️</div>
  749. <div style="width:90px;height:90px;border-radius:6px;background:var(--gray-light);border:1px solid var(--gray-border);display:flex;align-items:center;justify-content:center;font-size:32px;cursor:pointer;" onclick="showModal('modal-proof-img')">🖼️</div>
  750. <label style="width:90px;height:90px;border-radius:6px;border:1px dashed var(--gray-border);display:flex;flex-direction:column;align-items:center;justify-content:center;cursor:pointer;gap:4px;color:var(--text-hint);font-size:12px;">
  751. <span style="font-size:24px;">+</span>上传图片
  752. <input type="file" accept="image/*" multiple style="display:none;">
  753. </label>
  754. </div>
  755. <div style="font-size:11px;color:var(--text-hint);">支持 JPG / PNG,单张最大 10MB</div>
  756. </div>
  757. </div>
  758. </div>
  759. </div>
  760. <!-- ==================== MODALS ==================== -->
  761. <!-- QR Code Modal -->
  762. <div class="modal-overlay" id="modal-qr">
  763. <div class="modal-box" style="max-width:360px;">
  764. <div class="modal-header">
  765. <div class="modal-title">&#128247; 签到二维码</div>
  766. <button class="modal-close" onclick="hideModal('modal-qr')">&#10005;</button>
  767. </div>
  768. <div class="modal-body" style="text-align:center;">
  769. <div style="font-size:15px;font-weight:600;margin-bottom:4px;">实验室生物安全操作规范培训</div>
  770. <div style="font-size:12px;color:var(--text-hint);margin-bottom:16px;">2026-08-01 10:00–12:00</div>
  771. <div style="width:200px;height:200px;background:var(--gray-light);border:3px solid var(--gray-border);border-radius:12px;display:flex;flex-direction:column;align-items:center;justify-content:center;margin:0 auto 16px;font-size:80px;">&#9640;</div>
  772. <div style="background:var(--blue-xlight);border-radius:8px;padding:10px;font-size:12px;color:var(--text-secondary);margin-bottom:16px;">
  773. 学员扫描此二维码完成签到<br>
  774. <span style="color:var(--orange);font-weight:500;">有效期至 2026-08-01 12:30</span>
  775. </div>
  776. <div class="flex gap8" style="justify-content:center;">
  777. <button class="btn btn-primary">&#11015; 下载二维码</button>
  778. <button class="btn btn-outline" onclick="hideModal('modal-qr')">关闭</button>
  779. </div>
  780. </div>
  781. </div>
  782. </div>
  783. <!-- Progress Modal -->
  784. <div class="modal-overlay" id="modal-progress">
  785. <div class="modal-box modal-lg">
  786. <div class="modal-header">
  787. <div class="modal-title">&#128202; 培训进度详情</div>
  788. <button class="modal-close" onclick="hideModal('modal-progress')">&#10005;</button>
  789. </div>
  790. <div class="modal-body">
  791. <div style="font-size:15px;font-weight:600;margin-bottom:12px;">实验室生物安全操作规范培训</div>
  792. <div style="display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:16px;">
  793. <div style="background:var(--blue-xlight);border-radius:8px;padding:12px;text-align:center;"><div style="font-size:24px;font-weight:700;color:var(--blue);">60</div><div class="text-xs text-gray">计划人数</div></div>
  794. <div style="background:var(--green-light);border-radius:8px;padding:12px;text-align:center;"><div style="font-size:24px;font-weight:700;color:var(--green);">42</div><div class="text-xs text-gray">已签到</div></div>
  795. <div style="background:var(--red-light);border-radius:8px;padding:12px;text-align:center;"><div style="font-size:24px;font-weight:700;color:var(--red);">18</div><div class="text-xs text-gray">未签到</div></div>
  796. <div style="background:var(--orange-light);border-radius:8px;padding:12px;text-align:center;"><div style="font-size:24px;font-weight:700;color:var(--orange);">70%</div><div class="text-xs text-gray">签到率</div></div>
  797. </div>
  798. <div class="progress-wrap" style="height:10px;margin-bottom:20px;"><div class="progress-bar" style="width:70%;"></div></div>
  799. <div class="table-wrap">
  800. <table>
  801. <thead><tr><th>姓名</th><th>学号</th><th>学院单位</th><th>签到状态</th><th>签到时间</th><th>获得学时</th><th>获得积分</th><th>培训证明</th></tr></thead>
  802. <tbody>
  803. <tr><td>张明远</td><td>20231001</td><td>生命科学学院</td><td><span class="tag tag-green">已签到</span></td><td>10:05</td><td>2</td><td>10</td><td><span class="text-blue text-sm" style="cursor:pointer;" onclick="showModal('modal-proof-img')">查看</span></td></tr>
  804. <tr><td>李晓燕</td><td>20221056</td><td>生命科学学院</td><td><span class="tag tag-green">已签到</span></td><td>10:02</td><td>2</td><td>10</td><td><span class="text-blue text-sm" style="cursor:pointer;" onclick="showModal('modal-proof-img')">查看</span></td></tr>
  805. <tr><td>王浩然</td><td>20231089</td><td>化学化工学院</td><td><span class="tag tag-orange">迟到</span></td><td>10:22</td><td>2</td><td>8</td><td><span class="text-blue text-sm" style="cursor:pointer;" onclick="showModal('modal-proof-img')">查看</span></td></tr>
  806. <tr><td>陈思雨</td><td>20241103</td><td>物理学院</td><td><span class="tag tag-red">未签到</span></td><td>—</td><td>0</td><td>0</td><td>—</td></tr>
  807. <tr><td>刘志远</td><td>20231055</td><td>生命科学学院</td><td><span class="tag tag-green">已签到</span></td><td>09:58</td><td>2</td><td>10</td><td><span class="text-blue text-sm" style="cursor:pointer;" onclick="showModal('modal-proof-img')">查看</span></td></tr>
  808. </tbody>
  809. </table>
  810. </div>
  811. </div>
  812. <div class="modal-footer">
  813. <button class="btn btn-outline">&#128196; 导出Excel</button>
  814. <button class="btn btn-outline-gray" onclick="hideModal('modal-progress')">关闭</button>
  815. </div>
  816. </div>
  817. </div>
  818. <!-- Record Detail Modal -->
  819. <div class="modal-overlay" id="modal-record-detail">
  820. <div class="modal-box modal-lg">
  821. <div class="modal-header">
  822. <div class="modal-title">&#128196; 培训记录详情</div>
  823. <button class="modal-close" onclick="hideModal('modal-record-detail')">&#10005;</button>
  824. </div>
  825. <div class="modal-body">
  826. <div style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;margin-bottom:16px;">
  827. <div style="font-size:16px;font-weight:700;">辐射安全基础知识讲座</div>
  828. <span class="tag tag-gray">已结束</span>
  829. <span class="tag tag-blue">知识讲座</span>
  830. </div>
  831. <div style="display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:16px;font-size:13px;">
  832. <div><span style="color:var(--text-hint);">培训时间:</span>2026-07-20 14:00–16:00</div>
  833. <div><span style="color:var(--text-hint);">培训地点:</span>物理楼 C301</div>
  834. <div><span style="color:var(--text-hint);">主讲人:</span>陈教授</div>
  835. <div><span style="color:var(--text-hint);">可得学时:</span><span class="text-green text-bold">2 学时</span></div>
  836. <div><span style="color:var(--text-hint);">可得积分:</span><span class="text-orange text-bold">10 积分</span></div>
  837. <div><span style="color:var(--text-hint);">获得证书:</span>实验室安全培训证书(通用)</div>
  838. </div>
  839. <!-- 签到统计 -->
  840. <div style="display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:16px;">
  841. <div style="background:var(--blue-xlight);border-radius:8px;padding:12px;text-align:center;"><div style="font-size:22px;font-weight:700;color:var(--blue);">60</div><div style="font-size:12px;color:var(--text-hint);margin-top:4px;">计划人数</div></div>
  842. <div style="background:var(--green-light);border-radius:8px;padding:12px;text-align:center;"><div style="font-size:22px;font-weight:700;color:var(--green);">55</div><div style="font-size:12px;color:var(--text-hint);margin-top:4px;">已签到</div></div>
  843. <div style="background:var(--red-light);border-radius:8px;padding:12px;text-align:center;"><div style="font-size:22px;font-weight:700;color:var(--red);">5</div><div style="font-size:12px;color:var(--text-hint);margin-top:4px;">未签到</div></div>
  844. <div style="background:var(--orange-light);border-radius:8px;padding:12px;text-align:center;"><div style="font-size:22px;font-weight:700;color:var(--orange);">91.7%</div><div style="font-size:12px;color:var(--text-hint);margin-top:4px;">签到率</div></div>
  845. </div>
  846. <div class="divider"></div>
  847. <div style="margin-bottom:12px;font-size:13px;font-weight:600;">参与人员签到记录</div>
  848. <div class="table-wrap">
  849. <table>
  850. <thead><tr><th>姓名</th><th>学号</th><th>学院单位</th><th>签到状态</th><th>签到时间</th><th>获得学时</th><th>获得积分</th><th>培训证明</th><th>操作</th></tr></thead>
  851. <tbody>
  852. <tr><td>张明远</td><td>20231001</td><td>生命科学学院</td><td><span class="tag tag-green">已签到</span></td><td>14:02</td><td><span class="text-green text-bold">2</span></td><td><span class="text-orange text-bold">10</span></td><td><span class="text-blue text-sm" style="cursor:pointer;" onclick="showModal('modal-proof-img')">查看</span></td><td><div class="flex gap8"><span class="text-blue text-sm" style="cursor:pointer;" onclick="showModal('modal-cert-preview')">查看证书</span><span class="text-blue text-sm" style="cursor:pointer;">下载</span></div></td></tr>
  853. <tr><td>李晓燕</td><td>20221056</td><td>生命科学学院</td><td><span class="tag tag-green">已签到</span></td><td>14:05</td><td><span class="text-green text-bold">2</span></td><td><span class="text-orange text-bold">10</span></td><td><span class="text-blue text-sm" style="cursor:pointer;" onclick="showModal('modal-proof-img')">查看</span></td><td><div class="flex gap8"><span class="text-blue text-sm" style="cursor:pointer;" onclick="showModal('modal-cert-preview')">查看证书</span><span class="text-blue text-sm" style="cursor:pointer;">下载</span></div></td></tr>
  854. <tr><td>王浩然</td><td>20231089</td><td>化学化工学院</td><td><span class="tag tag-orange">迟到</span></td><td>14:18</td><td><span class="text-green text-bold">2</span></td><td><span class="text-orange text-bold">8</span></td><td><span class="text-blue text-sm" style="cursor:pointer;" onclick="showModal('modal-proof-img')">查看</span></td><td><div class="flex gap8"><span class="text-blue text-sm" style="cursor:pointer;" onclick="showModal('modal-cert-preview')">查看证书</span><span class="text-blue text-sm" style="cursor:pointer;">下载</span></div></td></tr>
  855. <tr><td>陈思雨</td><td>20241103</td><td>物理学院</td><td><span class="tag tag-red">未签到</span></td><td>—</td><td>0</td><td>0</td><td>—</td><td>—</td></tr>
  856. </tbody>
  857. </table>
  858. </div>
  859. </div>
  860. <div class="modal-footer">
  861. <button class="btn btn-outline">&#128196; 导出记录</button>
  862. <button class="btn btn-outline-gray" onclick="hideModal('modal-record-detail')">关闭</button>
  863. </div>
  864. </div>
  865. </div>
  866. <!-- 培训证明图片查看 Modal -->
  867. <div class="modal-overlay" id="modal-proof-img">
  868. <div class="modal-box modal-lg" style="max-width:720px;">
  869. <div class="modal-header">
  870. <div class="modal-title">🖼️ 培训证明图片</div>
  871. <button class="modal-close" onclick="hideModal('modal-proof-img')">&#10005;</button>
  872. </div>
  873. <div class="modal-body">
  874. <div style="font-size:13px;color:var(--text-hint);margin-bottom:16px;">实验室生物安全操作规范培训 · 2026-08-01</div>
  875. <div style="display:grid;grid-template-columns:repeat(3,1fr);gap:12px;">
  876. <div style="border-radius:8px;overflow:hidden;border:1px solid var(--gray-border);background:var(--gray-light);aspect-ratio:4/3;display:flex;align-items:center;justify-content:center;font-size:48px;cursor:pointer;">🖼️</div>
  877. <div style="border-radius:8px;overflow:hidden;border:1px solid var(--gray-border);background:var(--gray-light);aspect-ratio:4/3;display:flex;align-items:center;justify-content:center;font-size:48px;cursor:pointer;">🖼️</div>
  878. <div style="border-radius:8px;overflow:hidden;border:1px solid var(--gray-border);background:var(--gray-light);aspect-ratio:4/3;display:flex;align-items:center;justify-content:center;font-size:48px;cursor:pointer;">🖼️</div>
  879. </div>
  880. </div>
  881. <div class="modal-footer">
  882. <button class="btn btn-outline">📥 下载全部</button>
  883. <button class="btn btn-outline-gray" onclick="hideModal('modal-proof-img')">关闭</button>
  884. </div>
  885. </div>
  886. </div>
  887. <!-- Certificate Preview Modal -->
  888. <div class="modal-overlay" id="modal-cert-preview">
  889. <div class="modal-box" style="max-width:580px;">
  890. <div class="modal-header">
  891. <div class="modal-title">&#127941; 培训证书</div>
  892. <button class="modal-close" onclick="hideModal('modal-cert-preview')">&#10005;</button>
  893. </div>
  894. <div class="modal-body">
  895. <!-- Certificate card -->
  896. <div style="background:linear-gradient(135deg,#1857d4 0%,#0f3ea8 100%);border-radius:12px;padding:32px 28px;color:#fff;position:relative;overflow:hidden;margin-bottom:16px;">
  897. <div style="position:absolute;right:-30px;top:-30px;width:160px;height:160px;background:rgba(255,255,255,.06);border-radius:50%;"></div>
  898. <div style="position:absolute;right:20px;bottom:-40px;width:120px;height:120px;background:rgba(255,255,255,.04);border-radius:50%;"></div>
  899. <div style="text-align:center;margin-bottom:20px;">
  900. <div style="font-size:13px;letter-spacing:2px;opacity:.75;margin-bottom:4px;">实验室安全培训证书</div>
  901. <div style="font-size:11px;opacity:.55;letter-spacing:1px;">LABORATORY SAFETY TRAINING CERTIFICATE</div>
  902. </div>
  903. <div style="text-align:center;margin-bottom:20px;">
  904. <div style="font-size:11px;opacity:.7;margin-bottom:6px;">兹证明</div>
  905. <div style="font-size:26px;font-weight:700;letter-spacing:3px;margin-bottom:6px;">张 明 远</div>
  906. <div style="font-size:11px;opacity:.7;">学号:20231001 &nbsp;·&nbsp; 硕士研究生 &nbsp;·&nbsp; 生命科学学院</div>
  907. </div>
  908. <div style="text-align:center;margin-bottom:20px;font-size:13px;opacity:.85;line-height:1.7;">
  909. 已参加并完成 <strong>辐射安全基础知识讲座</strong> 培训<br>
  910. 培训时间:2026-07-20 &nbsp;·&nbsp; 获得学时:<strong>2 学时</strong> &nbsp;·&nbsp; 获得积分:<strong>10 分</strong>
  911. </div>
  912. <div style="display:flex;justify-content:space-between;align-items:flex-end;border-top:1px solid rgba(255,255,255,.2);padding-top:14px;font-size:11px;opacity:.7;">
  913. <div>证书编号:CERT-2026-0720-001</div>
  914. <div>颁发日期:2026-07-20</div>
  915. <div>颁发单位:实验室安全教育中心</div>
  916. </div>
  917. </div>
  918. <div class="flex gap8" style="justify-content:flex-end;">
  919. <button class="btn btn-primary">&#11015; 下载证书</button>
  920. <button class="btn btn-outline-gray" onclick="hideModal('modal-cert-preview')">关闭</button>
  921. </div>
  922. </div>
  923. </div>
  924. </div>
  925. <!-- Delete Confirm Modal -->
  926. <div class="modal-overlay" id="modal-confirm-delete">
  927. <div class="modal-box" style="max-width:380px;">
  928. <div class="modal-header">
  929. <div class="modal-title">确认删除</div>
  930. <button class="modal-close" onclick="hideModal('modal-confirm-delete')">&#10005;</button>
  931. </div>
  932. <div class="modal-body" style="text-align:center;padding:24px;">
  933. <div style="font-size:40px;margin-bottom:12px;">🗑️</div>
  934. <div style="font-size:15px;font-weight:600;margin-bottom:8px;">确认删除此培训?</div>
  935. <div style="font-size:13px;color:var(--text-hint);">删除后数据将无法恢复,相关签到记录和证书也将一并删除。</div>
  936. </div>
  937. <div class="modal-footer" style="justify-content:center;">
  938. <button class="btn btn-outline-gray" onclick="hideModal('modal-confirm-delete')" style="min-width:90px;">取消</button>
  939. <button class="btn" style="min-width:90px;background:var(--red);color:#fff;" onclick="hideModal('modal-confirm-delete')">确认删除</button>
  940. </div>
  941. </div>
  942. </div>
  943. <!-- 选择试卷 modal -->
  944. <div class="modal-overlay" id="modal-select-paper">
  945. <div class="modal-box modal-lg" style="max-width:960px;">
  946. <div class="modal-header">
  947. <div class="modal-title">选择试卷</div>
  948. <button class="modal-close" onclick="hideModal('modal-select-paper')">&#10005;</button>
  949. </div>
  950. <div class="modal-body" style="padding:20px 28px;">
  951. <!-- 筛选栏 -->
  952. <div style="display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:16px;">
  953. <select class="form-input form-select" style="width:110px;height:34px;font-size:13px;">
  954. <option value="">是否共享</option>
  955. <option>是</option>
  956. <option>否</option>
  957. </select>
  958. <select class="form-input form-select" style="width:110px;height:34px;font-size:13px;">
  959. <option value="">知识点</option>
  960. <option>通识安全</option>
  961. <option>化学安全</option>
  962. <option>生物安全</option>
  963. <option>辐射安全</option>
  964. <option>消防安全</option>
  965. </select>
  966. <select class="form-input form-select" style="width:110px;height:34px;font-size:13px;">
  967. <option value="">专业类别</option>
  968. <option>理工科</option>
  969. <option>医学</option>
  970. <option>文科</option>
  971. </select>
  972. <select class="form-input form-select" style="width:100px;height:34px;font-size:13px;">
  973. <option value="">来源</option>
  974. <option>系统内置</option>
  975. <option>自建</option>
  976. <option>共享</option>
  977. </select>
  978. <select class="form-input form-select" style="width:110px;height:34px;font-size:13px;">
  979. <option value="">组卷方式</option>
  980. <option>固定组卷</option>
  981. <option>随机组卷</option>
  982. </select>
  983. <input class="form-input" placeholder="搜索名称" style="width:140px;height:34px;font-size:13px;">
  984. <button class="btn btn-primary" style="height:34px;padding:0 18px;font-size:13px;">查询</button>
  985. <button class="btn btn-outline-gray" style="height:34px;padding:0 14px;font-size:13px;">重置</button>
  986. </div>
  987. <!-- 结果列表 -->
  988. <div class="table-wrap" style="margin:0;">
  989. <table>
  990. <thead>
  991. <tr>
  992. <th>试卷名称</th>
  993. <th>组卷方式</th>
  994. <th>知识点</th>
  995. <th>专业类别</th>
  996. <th>是否共享</th>
  997. <th>来源</th>
  998. <th style="width:64px;">操作</th>
  999. </tr>
  1000. </thead>
  1001. <tbody>
  1002. <tr>
  1003. <td>实验室安全基础知识</td>
  1004. <td>固定组卷</td>
  1005. <td>通识安全</td>
  1006. <td>通用</td>
  1007. <td>是</td>
  1008. <td>系统内置</td>
  1009. <td><span style="color:var(--blue);cursor:pointer;font-size:13px;font-weight:500;" onclick="selectPaper('实验室安全基础知识')">选定</span></td>
  1010. </tr>
  1011. <tr>
  1012. <td>化工安全专项考试</td>
  1013. <td>随机组卷</td>
  1014. <td>化学安全</td>
  1015. <td>理工科</td>
  1016. <td>否</td>
  1017. <td>自建</td>
  1018. <td><span style="color:var(--blue);cursor:pointer;font-size:13px;font-weight:500;" onclick="selectPaper('化工安全专项考试')">选定</span></td>
  1019. </tr>
  1020. <tr>
  1021. <td>医学实验室安全规范</td>
  1022. <td>固定组卷</td>
  1023. <td>生物安全</td>
  1024. <td>医学</td>
  1025. <td>是</td>
  1026. <td>自建</td>
  1027. <td><span style="color:var(--blue);cursor:pointer;font-size:13px;font-weight:500;" onclick="selectPaper('医学实验室安全规范')">选定</span></td>
  1028. </tr>
  1029. <tr>
  1030. <td>辐射防护基础考核</td>
  1031. <td>随机组卷</td>
  1032. <td>辐射安全</td>
  1033. <td>理工科</td>
  1034. <td>否</td>
  1035. <td>自建</td>
  1036. <td><span style="color:var(--blue);cursor:pointer;font-size:13px;font-weight:500;" onclick="selectPaper('辐射防护基础考核')">选定</span></td>
  1037. </tr>
  1038. <tr>
  1039. <td>消防安全知识测评</td>
  1040. <td>固定组卷</td>
  1041. <td>消防安全</td>
  1042. <td>通用</td>
  1043. <td>是</td>
  1044. <td>系统内置</td>
  1045. <td><span style="color:var(--blue);cursor:pointer;font-size:13px;font-weight:500;" onclick="selectPaper('消防安全知识测评')">选定</span></td>
  1046. </tr>
  1047. </tbody>
  1048. </table>
  1049. </div>
  1050. </div>
  1051. </div>
  1052. </div>
  1053. <div id="page-exam-template" class="page" style="padding:0;">
  1054. <!-- Page Header -->
  1055. <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:24px;">
  1056. <div>
  1057. <div class="page-title">考试模板</div>
  1058. <div class="page-subtitle">管理各类考试的模版配置,包含基本设置、考前配置、防作弊及证书颁发等。</div>
  1059. </div>
  1060. <span class="tag tag-blue" style="font-size:12px;padding:4px 12px;">唯一模版</span>
  1061. </div>
  1062. <!-- Top-level tabs: 开学考试 / 分级考试 / 应知应会 -->
  1063. <div class="view-tabs" id="exam-top-tabs">
  1064. <div class="view-tab active" onclick="switchExamTab('kaixue')">开学考试</div>
  1065. <div class="view-tab" onclick="switchExamTab('fenji')">分级考试</div>
  1066. <div class="view-tab" onclick="switchExamTab('yingzhi')">应知应会</div>
  1067. </div>
  1068. <!-- ══════════════════════════════════════════════════════════
  1069. TAB 1: 开学考试
  1070. ══════════════════════════════════════════════════════════ -->
  1071. <div id="exam-tab-kaixue" class="exam-tab-panel" style="display:flex;gap:0;background:var(--white);border:1px solid var(--gray-border);border-radius:var(--radius);box-shadow:var(--shadow);overflow:hidden;">
  1072. <!-- Left sidebar nav -->
  1073. <div style="width:180px;flex-shrink:0;border-right:1px solid var(--gray-border);background:var(--gray-light);padding:14px 0;">
  1074. <div class="nav-item active" id="kaixue-nav-basic" onclick="switchExamSection('kaixue','basic')">基本配置</div>
  1075. <div class="nav-item" id="kaixue-nav-scope" onclick="switchExamSection('kaixue','scope')">考试范围</div>
  1076. <div class="nav-item" id="kaixue-nav-paper" onclick="switchExamSection('kaixue','paper')">试卷配置</div>
  1077. <div class="nav-item" id="kaixue-nav-preexam" onclick="switchExamSection('kaixue','preexam')">考前配置</div>
  1078. <div class="nav-item" id="kaixue-nav-cert" onclick="switchExamSection('kaixue','cert')">获得证书</div>
  1079. </div>
  1080. <!-- Right content area -->
  1081. <div style="flex:1;padding:28px;overflow-y:auto;max-height:calc(100vh - var(--header-h) - 196px);">
  1082. <!-- 基本设置 section -->
  1083. <div id="kaixue-sec-basic" class="exam-section">
  1084. <div class="card-title">基本配置</div>
  1085. <div style="display:flex;flex-direction:column;gap:16px;">
  1086. <div style="display:flex;align-items:center;gap:16px;">
  1087. <span class="form-label" style="width:80px;flex-shrink:0;">考试类型</span>
  1088. <input class="form-input" style="width:200px;" value="开学考试" disabled>
  1089. <span class="form-hint">系统内置,不可更改</span>
  1090. </div>
  1091. <div style="display:flex;align-items:center;gap:16px;">
  1092. <span class="form-label" style="width:80px;flex-shrink:0;">考试名称</span>
  1093. <input class="form-input" style="width:300px;" placeholder="请输入考试名称">
  1094. </div>
  1095. <div style="display:flex;align-items:center;gap:16px;">
  1096. <span class="form-label" style="width:80px;flex-shrink:0;">可考次数</span>
  1097. <div style="display:flex;align-items:center;gap:8px;">
  1098. <button class="btn btn-outline-gray btn-sm" onclick="stepNum('kaixue-answer-cnt',-1)">-</button>
  1099. <input id="kaixue-answer-cnt" type="number" class="form-input" style="width:60px;text-align:center;" value="2" min="1">
  1100. <button class="btn btn-outline-gray btn-sm" onclick="stepNum('kaixue-answer-cnt',1)">+</button>
  1101. </div>
  1102. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;margin-left:8px;">
  1103. <input type="radio" name="kaixue-answer-mode" value="limit" checked> 限制次数
  1104. </label>
  1105. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;">
  1106. <input type="radio" name="kaixue-answer-mode" value="unlimited"> 无限制
  1107. </label>
  1108. </div>
  1109. <div style="display:flex;align-items:center;gap:16px;">
  1110. <span class="form-label" style="width:80px;flex-shrink:0;">考试时间</span>
  1111. <input type="datetime-local" class="form-input" style="width:190px;" step="1">
  1112. <span style="color:var(--text-hint);font-size:13px;">至</span>
  1113. <input type="datetime-local" class="form-input" style="width:190px;" step="1">
  1114. </div>
  1115. <div style="display:flex;align-items:center;gap:16px;">
  1116. <span class="form-label" style="width:80px;flex-shrink:0;">考试时长</span>
  1117. <div style="display:flex;align-items:center;gap:8px;">
  1118. <button class="btn btn-outline-gray btn-sm" onclick="stepNum('kaixue-duration',-5)">-</button>
  1119. <input id="kaixue-duration" type="number" class="form-input" style="width:70px;text-align:center;" value="60" min="5" step="5">
  1120. <button class="btn btn-outline-gray btn-sm" onclick="stepNum('kaixue-duration',5)">+</button>
  1121. <span style="font-size:13px;color:var(--text-secondary);">分钟</span>
  1122. </div>
  1123. <span class="form-hint">限制答卷最大时长</span>
  1124. </div>
  1125. <div style="display:flex;align-items:center;gap:16px;">
  1126. <span class="form-label" style="width:80px;flex-shrink:0;">启用</span>
  1127. <label class="toggle"><input type="checkbox" checked><span class="toggle-slider"></span></label>
  1128. <span class="form-hint">开启后,每学年按配置时间自动创建执行该考试,无需重复配置</span>
  1129. </div>
  1130. </div><!-- /flex col -->
  1131. <!-- 防作弊配置 subsection -->
  1132. <div style="margin-top:24px;padding-top:20px;border-top:1px solid var(--gray-border);">
  1133. <div style="display:flex;align-items:center;gap:8px;margin-bottom:16px;">
  1134. <span class="card-title" style="margin:0;">防作弊配置</span>
  1135. <span class="form-hint" style="font-size:12px;">(防作弊配置仅适用教育考试一体机)</span>
  1136. </div>
  1137. <div style="display:flex;flex-direction:column;gap:14px;">
  1138. <div style="display:flex;align-items:center;gap:12px;">
  1139. <span class="form-label" style="width:100px;flex-shrink:0;">考前人脸校验</span>
  1140. <label class="toggle"><input type="checkbox"><span class="toggle-slider"></span></label>
  1141. <span style="font-size:13px;color:var(--text-secondary);">开启后,考试前需要进行人脸识别校验</span>
  1142. </div>
  1143. <div style="display:flex;align-items:center;gap:12px;">
  1144. <span class="form-label" style="width:100px;flex-shrink:0;">考后人脸校验</span>
  1145. <label class="toggle"><input type="checkbox"><span class="toggle-slider"></span></label>
  1146. <span style="font-size:13px;color:var(--text-secondary);">开启后,考试结束后需要进行人脸识别校验</span>
  1147. </div>
  1148. <div style="display:flex;align-items:center;gap:12px;">
  1149. <span class="form-label" style="width:100px;flex-shrink:0;">摄像头抓拍</span>
  1150. <label class="toggle"><input type="checkbox"><span class="toggle-slider"></span></label>
  1151. <span style="font-size:13px;color:var(--text-secondary);">开启后,考试过程中摄像头随机抓拍</span>
  1152. </div>
  1153. </div>
  1154. </div>
  1155. <div style="margin-top:24px;display:flex;gap:12px;">
  1156. <button class="btn btn-primary">保存设置</button>
  1157. <button class="btn btn-outline-gray">重置</button>
  1158. </div>
  1159. </div><!-- /kaixue-sec-basic -->
  1160. <!-- 考试范围 section -->
  1161. <div id="kaixue-sec-scope" class="exam-section" style="display:none;">
  1162. <div class="card-title">考试范围</div>
  1163. <!-- 范围类型单选 -->
  1164. <div style="display:flex;align-items:center;gap:20px;margin-bottom:20px;">
  1165. <label style="display:flex;align-items:center;gap:6px;cursor:pointer;font-size:13px;">
  1166. <input type="radio" name="kaixue-scope-type" value="specify" checked onchange="switchKaixueScopeTab('specify')"> 指定范围
  1167. </label>
  1168. <label style="display:flex;align-items:center;gap:6px;cursor:pointer;font-size:13px;">
  1169. <input type="radio" name="kaixue-scope-type" value="person" onchange="switchKaixueScopeTab('person')"> 指定人员
  1170. </label>
  1171. </div>
  1172. <!-- 指定范围 panel -->
  1173. <div id="kaixue-scope-panel-specify">
  1174. <div style="display:flex;flex-direction:column;gap:18px;">
  1175. <!-- 学院单位 multiselect -->
  1176. <div style="display:flex;align-items:flex-start;gap:16px;">
  1177. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:6px;">学院单位</span>
  1178. <div style="flex:1;max-width:600px;">
  1179. <div style="position:relative;margin-bottom:8px;">
  1180. <input class="form-input" style="padding-left:30px;" placeholder="搜索学院单位...">
  1181. <span style="position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--text-hint);font-size:13px;">🔍</span>
  1182. </div>
  1183. <div style="display:flex;flex-wrap:wrap;gap:6px;padding:10px;border:1px solid var(--gray-border);border-radius:var(--radius);min-height:44px;background:var(--white);">
  1184. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">生命科学学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  1185. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">化学化工学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  1186. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">物理学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  1187. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">材料科学与工程学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  1188. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">医学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  1189. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">环境科学学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  1190. <span class="tag" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border:1px dashed var(--gray-border);border-radius:20px;cursor:pointer;color:var(--text-hint);">+ 添加学院</span>
  1191. </div>
  1192. <div style="display:flex;align-items:center;gap:12px;margin-top:8px;">
  1193. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;color:var(--text-secondary);">
  1194. <input type="checkbox" checked style="accent-color:var(--blue);"> 全选
  1195. </label>
  1196. <span style="font-size:12px;color:var(--text-hint);">已全选所有学院单位</span>
  1197. </div>
  1198. </div>
  1199. </div>
  1200. <!-- 考生类别 -->
  1201. <div style="display:flex;align-items:flex-start;gap:16px;">
  1202. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:6px;">考生类别</span>
  1203. <div style="display:flex;flex-direction:column;gap:12px;">
  1204. <!-- 新生 -->
  1205. <div style="display:flex;align-items:center;gap:12px;">
  1206. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;font-weight:500;width:44px;flex-shrink:0;">
  1207. <input type="checkbox" id="kaixue-cat-xinsheng" checked style="accent-color:var(--blue);"> 新生
  1208. </label>
  1209. <div id="kaixue-cat-xinsheng-types" style="position:relative;">
  1210. <div class="multiselect-trigger" onclick="toggleMultiselect('kaixue-xinsheng-dd')" style="display:flex;align-items:center;gap:6px;padding:5px 10px;border:1px solid var(--gray-border);border-radius:var(--radius);cursor:pointer;font-size:13px;min-width:200px;background:var(--white);">
  1211. <span id="kaixue-xinsheng-label" style="flex:1;color:var(--text-primary);">本科生</span>
  1212. <span style="color:var(--text-hint);font-size:11px;">▼</span>
  1213. </div>
  1214. <div id="kaixue-xinsheng-dd" style="display:none;position:absolute;top:100%;left:0;z-index:100;background:var(--white);border:1px solid var(--gray-border);border-radius:var(--radius);box-shadow:var(--shadow);padding:8px 0;min-width:160px;">
  1215. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" checked onchange="updateMultiselectLabel('kaixue-xinsheng-dd','kaixue-xinsheng-label')"> 本科生</label>
  1216. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('kaixue-xinsheng-dd','kaixue-xinsheng-label')"> 研究生</label>
  1217. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('kaixue-xinsheng-dd','kaixue-xinsheng-label')"> 博士生</label>
  1218. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('kaixue-xinsheng-dd','kaixue-xinsheng-label')"> 教职工</label>
  1219. </div>
  1220. </div>
  1221. </div>
  1222. <!-- 老生 -->
  1223. <div style="display:flex;align-items:center;gap:12px;">
  1224. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;font-weight:500;width:44px;flex-shrink:0;">
  1225. <input type="checkbox" id="kaixue-cat-laosheng" style="accent-color:var(--blue);"> 老生
  1226. </label>
  1227. <div id="kaixue-cat-laosheng-types" style="position:relative;">
  1228. <div class="multiselect-trigger" onclick="toggleMultiselect('kaixue-laosheng-dd')" style="display:flex;align-items:center;gap:6px;padding:5px 10px;border:1px solid var(--gray-border);border-radius:var(--radius);cursor:pointer;font-size:13px;min-width:200px;background:var(--white);">
  1229. <span id="kaixue-laosheng-label" style="flex:1;color:var(--text-hint);">请选择类型</span>
  1230. <span style="color:var(--text-hint);font-size:11px;">▼</span>
  1231. </div>
  1232. <div id="kaixue-laosheng-dd" style="display:none;position:absolute;top:100%;left:0;z-index:100;background:var(--white);border:1px solid var(--gray-border);border-radius:var(--radius);box-shadow:var(--shadow);padding:8px 0;min-width:160px;">
  1233. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('kaixue-laosheng-dd','kaixue-laosheng-label')"> 本科生</label>
  1234. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('kaixue-laosheng-dd','kaixue-laosheng-label')"> 研究生</label>
  1235. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('kaixue-laosheng-dd','kaixue-laosheng-label')"> 博士生</label>
  1236. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('kaixue-laosheng-dd','kaixue-laosheng-label')"> 教职工</label>
  1237. </div>
  1238. </div>
  1239. </div>
  1240. </div>
  1241. </div>
  1242. </div>
  1243. <div style="margin-top:24px;display:flex;gap:12px;">
  1244. <button class="btn btn-primary">保存设置</button>
  1245. <button class="btn btn-outline-gray">重置</button>
  1246. </div>
  1247. </div><!-- /specify panel -->
  1248. <!-- 指定人员 panel -->
  1249. <div id="kaixue-scope-panel-person" style="display:none;">
  1250. <div style="display:flex;flex-direction:column;gap:12px;margin-bottom:16px;">
  1251. <!-- 筛选条件 row 1: 学院单位 chip multiselect + 学年 -->
  1252. <div style="display:flex;align-items:flex-start;gap:12px;flex-wrap:wrap;">
  1253. <div style="position:relative;">
  1254. <div class="multiselect-trigger" onclick="toggleMultiselect('person-college-dd')" style="display:flex;align-items:center;gap:6px;padding:5px 10px;border:1px solid var(--gray-border);border-radius:var(--radius);cursor:pointer;font-size:13px;min-width:180px;background:var(--white);">
  1255. <span id="person-college-label" style="flex:1;color:var(--text-hint);">选择学院单位</span>
  1256. <span style="color:var(--text-hint);font-size:11px;">▼</span>
  1257. </div>
  1258. <div id="person-college-dd" style="display:none;position:absolute;top:100%;left:0;z-index:100;background:var(--white);border:1px solid var(--gray-border);border-radius:var(--radius);box-shadow:var(--shadow);padding:8px 0;min-width:180px;">
  1259. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;border-bottom:1px solid var(--gray-border);margin-bottom:4px;"><input type="checkbox" onchange="toggleSelectAll(this,'person-college-dd');updateMultiselectLabel('person-college-dd','person-college-label')"> 全选</label>
  1260. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('person-college-dd','person-college-label')"> 生命科学学院</label>
  1261. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('person-college-dd','person-college-label')"> 化学化工学院</label>
  1262. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('person-college-dd','person-college-label')"> 物理学院</label>
  1263. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('person-college-dd','person-college-label')"> 材料科学学院</label>
  1264. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('person-college-dd','person-college-label')"> 医学院</label>
  1265. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('person-college-dd','person-college-label')"> 环境科学学院</label>
  1266. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('person-college-dd','person-college-label')"> 安全管理处</label>
  1267. </div>
  1268. </div>
  1269. </div>
  1270. <!-- 筛选条件 row 2: 新生/老生 + 类型下拉 + 姓名搜索 -->
  1271. <div style="display:flex;align-items:center;gap:12px;flex-wrap:wrap;">
  1272. <!-- 新生 -->
  1273. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;font-weight:500;">
  1274. <input type="checkbox" id="person-cat-xinsheng" checked style="accent-color:var(--blue);"> 新生
  1275. </label>
  1276. <div style="position:relative;">
  1277. <div class="multiselect-trigger" onclick="toggleMultiselect('person-xinsheng-dd')" style="display:flex;align-items:center;gap:6px;padding:5px 10px;border:1px solid var(--gray-border);border-radius:var(--radius);cursor:pointer;font-size:13px;min-width:140px;background:var(--white);">
  1278. <span id="person-xinsheng-label" style="flex:1;color:var(--text-primary);">本科生</span>
  1279. <span style="color:var(--text-hint);font-size:11px;">▼</span>
  1280. </div>
  1281. <div id="person-xinsheng-dd" style="display:none;position:absolute;top:100%;left:0;z-index:100;background:var(--white);border:1px solid var(--gray-border);border-radius:var(--radius);box-shadow:var(--shadow);padding:8px 0;min-width:140px;">
  1282. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" checked onchange="updateMultiselectLabel('person-xinsheng-dd','person-xinsheng-label')"> 本科生</label>
  1283. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('person-xinsheng-dd','person-xinsheng-label')"> 研究生</label>
  1284. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('person-xinsheng-dd','person-xinsheng-label')"> 博士生</label>
  1285. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('person-xinsheng-dd','person-xinsheng-label')"> 教职工</label>
  1286. </div>
  1287. </div>
  1288. <!-- 老生 -->
  1289. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;font-weight:500;margin-left:8px;">
  1290. <input type="checkbox" id="person-cat-laosheng" style="accent-color:var(--blue);"> 老生
  1291. </label>
  1292. <div style="position:relative;">
  1293. <div class="multiselect-trigger" onclick="toggleMultiselect('person-laosheng-dd')" style="display:flex;align-items:center;gap:6px;padding:5px 10px;border:1px solid var(--gray-border);border-radius:var(--radius);cursor:pointer;font-size:13px;min-width:140px;background:var(--white);">
  1294. <span id="person-laosheng-label" style="flex:1;color:var(--text-hint);">请选择类型</span>
  1295. <span style="color:var(--text-hint);font-size:11px;">▼</span>
  1296. </div>
  1297. <div id="person-laosheng-dd" style="display:none;position:absolute;top:100%;left:0;z-index:100;background:var(--white);border:1px solid var(--gray-border);border-radius:var(--radius);box-shadow:var(--shadow);padding:8px 0;min-width:140px;">
  1298. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('person-laosheng-dd','person-laosheng-label')"> 本科生</label>
  1299. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('person-laosheng-dd','person-laosheng-label')"> 研究生</label>
  1300. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('person-laosheng-dd','person-laosheng-label')"> 博士生</label>
  1301. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('person-laosheng-dd','person-laosheng-label')"> 教职工</label>
  1302. </div>
  1303. </div>
  1304. <input class="form-input" style="width:180px;margin-left:8px;" placeholder="姓名/学号/工号">
  1305. <button class="btn btn-outline btn-sm">搜索</button>
  1306. </div>
  1307. </div>
  1308. <!-- Transfer box -->
  1309. <div style="display:flex;gap:12px;align-items:stretch;">
  1310. <!-- Left: candidate list -->
  1311. <div style="flex:1;border:1px solid var(--gray-border);border-radius:var(--radius);overflow:hidden;display:flex;flex-direction:column;">
  1312. <div style="background:var(--gray-light);padding:8px 12px;font-size:13px;font-weight:600;color:var(--text-secondary);border-bottom:1px solid var(--gray-border);display:flex;justify-content:space-between;align-items:center;">
  1313. <span>待选人员</span>
  1314. <span style="font-size:12px;color:var(--text-hint);">共 248 人</span>
  1315. </div>
  1316. <div style="padding:6px;border-bottom:1px solid var(--gray-border);">
  1317. <input class="form-input" style="font-size:12px;" placeholder="在结果中搜索...">
  1318. </div>
  1319. <div style="flex:1;overflow-y:auto;max-height:280px;">
  1320. <table style="width:100%;border-collapse:collapse;font-size:12px;">
  1321. <thead><tr style="background:var(--gray-light);"><th style="padding:6px 10px;text-align:left;font-weight:500;color:var(--text-secondary);"><input type="checkbox"> 姓名</th><th style="padding:6px 10px;text-align:left;font-weight:500;color:var(--text-secondary);">学号/工号</th><th style="padding:6px 10px;text-align:left;font-weight:500;color:var(--text-secondary);">学院</th><th style="padding:6px 10px;text-align:left;font-weight:500;color:var(--text-secondary);">类别</th></tr></thead>
  1322. <tbody>
  1323. <tr style="border-top:1px solid var(--gray-border);"><td style="padding:6px 10px;"><input type="checkbox"> 张三</td><td style="padding:6px 10px;">2026001</td><td style="padding:6px 10px;">生科院</td><td style="padding:6px 10px;">新生本科</td></tr>
  1324. <tr style="border-top:1px solid var(--gray-border);"><td style="padding:6px 10px;"><input type="checkbox"> 李四</td><td style="padding:6px 10px;">2026002</td><td style="padding:6px 10px;">化工院</td><td style="padding:6px 10px;">新生研究生</td></tr>
  1325. <tr style="border-top:1px solid var(--gray-border);"><td style="padding:6px 10px;"><input type="checkbox"> 王五</td><td style="padding:6px 10px;">2026003</td><td style="padding:6px 10px;">物理院</td><td style="padding:6px 10px;">新生博士</td></tr>
  1326. <tr style="border-top:1px solid var(--gray-border);color:var(--text-hint);"><td colspan="4" style="padding:20px;text-align:center;">显示前 3 条,搜索或筛选查看更多</td></tr>
  1327. </tbody>
  1328. </table>
  1329. </div>
  1330. </div>
  1331. <!-- Transfer buttons -->
  1332. <div style="display:flex;flex-direction:column;justify-content:center;gap:8px;flex-shrink:0;">
  1333. <button class="btn btn-outline btn-sm" style="width:44px;" title="添加选中">›</button>
  1334. <button class="btn btn-outline btn-sm" style="width:44px;" title="添加全部">»</button>
  1335. <button class="btn btn-outline btn-sm" style="width:44px;" title="移除选中">‹</button>
  1336. <button class="btn btn-outline btn-sm" style="width:44px;" title="移除全部">«</button>
  1337. </div>
  1338. <!-- Right: selected list -->
  1339. <div style="flex:1;border:1px solid var(--blue);border-radius:var(--radius);overflow:hidden;display:flex;flex-direction:column;">
  1340. <div style="background:var(--blue-xlight);padding:8px 12px;font-size:13px;font-weight:600;color:var(--blue);border-bottom:1px solid var(--blue);display:flex;justify-content:space-between;align-items:center;">
  1341. <span>已选人员</span>
  1342. <span style="font-size:12px;">已选 2 人</span>
  1343. </div>
  1344. <div style="padding:6px;border-bottom:1px solid var(--gray-border);">
  1345. <input class="form-input" style="font-size:12px;" placeholder="在已选中搜索...">
  1346. </div>
  1347. <div style="flex:1;overflow-y:auto;max-height:280px;">
  1348. <table style="width:100%;border-collapse:collapse;font-size:12px;">
  1349. <thead><tr style="background:var(--gray-light);"><th style="padding:6px 10px;text-align:left;font-weight:500;color:var(--text-secondary);"><input type="checkbox"> 姓名</th><th style="padding:6px 10px;text-align:left;font-weight:500;color:var(--text-secondary);">学号/工号</th><th style="padding:6px 10px;text-align:left;font-weight:500;color:var(--text-secondary);">学院</th><th style="padding:6px 10px;text-align:left;font-weight:500;color:var(--text-secondary);">操作</th></tr></thead>
  1350. <tbody>
  1351. <tr style="border-top:1px solid var(--gray-border);"><td style="padding:6px 10px;"><input type="checkbox"> 陈六</td><td style="padding:6px 10px;">2026010</td><td style="padding:6px 10px;">医学院</td><td style="padding:6px 10px;"><span style="color:var(--red);cursor:pointer;">移除</span></td></tr>
  1352. <tr style="border-top:1px solid var(--gray-border);"><td style="padding:6px 10px;"><input type="checkbox"> 赵七</td><td style="padding:6px 10px;">2026011</td><td style="padding:6px 10px;">材料院</td><td style="padding:6px 10px;"><span style="color:var(--red);cursor:pointer;">移除</span></td></tr>
  1353. </tbody>
  1354. </table>
  1355. </div>
  1356. </div>
  1357. </div><!-- /transfer box -->
  1358. <div style="margin-top:20px;display:flex;gap:12px;">
  1359. <button class="btn btn-primary">保存设置</button>
  1360. <button class="btn btn-outline-gray">重置</button>
  1361. </div>
  1362. </div><!-- /person panel -->
  1363. </div><!-- /kaixue-sec-scope -->
  1364. <!-- 试卷配置 section -->
  1365. <div id="kaixue-sec-paper" class="exam-section" style="display:none;">
  1366. <div class="card-title">试卷配置</div>
  1367. <div style="font-size:13px;color:var(--text-hint);margin-bottom:16px;">根据考试范围,为各学院单位分别指定考试试卷。未单独指定的学院将使用全校默认试卷。</div>
  1368. <div style="display:flex;flex-direction:column;gap:0;border:1px solid var(--gray-border);border-radius:var(--radius);overflow:hidden;">
  1369. <!-- 表头 -->
  1370. <div style="display:grid;grid-template-columns:180px 1fr 140px;background:var(--gray-light);border-bottom:1px solid var(--gray-border);padding:10px 16px;font-size:13px;font-weight:600;color:var(--text-secondary);">
  1371. <span>学院单位</span>
  1372. <span>试卷</span>
  1373. <span>操作</span>
  1374. </div>
  1375. <!-- 全校默认行 -->
  1376. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;border-bottom:1px solid var(--gray-border);background:var(--blue-xlight);">
  1377. <span style="font-size:13px;font-weight:600;color:var(--blue);">全校(默认)</span>
  1378. <div style="display:flex;align-items:center;gap:8px;">
  1379. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;font-size:12px;">实验室安全基础知识<span style="cursor:pointer;margin-left:2px;opacity:.7;">×</span></span>
  1380. </div>
  1381. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">更换试卷</button>
  1382. </div>
  1383. <!-- 生命科学学院 -->
  1384. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;border-bottom:1px solid var(--gray-border);">
  1385. <span style="font-size:13px;color:var(--text-primary);">生命科学学院</span>
  1386. <span style="font-size:12px;color:var(--text-hint);">继承默认试卷</span>
  1387. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">指定试卷</button>
  1388. </div>
  1389. <!-- 化学化工学院 -->
  1390. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;border-bottom:1px solid var(--gray-border);">
  1391. <span style="font-size:13px;color:var(--text-primary);">化学化工学院</span>
  1392. <div style="display:flex;align-items:center;gap:8px;">
  1393. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;font-size:12px;">化工安全专项考试<span style="cursor:pointer;margin-left:2px;opacity:.7;">×</span></span>
  1394. </div>
  1395. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">更换试卷</button>
  1396. </div>
  1397. <!-- 物理学院 -->
  1398. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;border-bottom:1px solid var(--gray-border);">
  1399. <span style="font-size:13px;color:var(--text-primary);">物理学院</span>
  1400. <span style="font-size:12px;color:var(--text-hint);">继承默认试卷</span>
  1401. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">指定试卷</button>
  1402. </div>
  1403. <!-- 材料科学学院 -->
  1404. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;border-bottom:1px solid var(--gray-border);">
  1405. <span style="font-size:13px;color:var(--text-primary);">材料科学学院</span>
  1406. <span style="font-size:12px;color:var(--text-hint);">继承默认试卷</span>
  1407. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">指定试卷</button>
  1408. </div>
  1409. <!-- 医学院 -->
  1410. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;border-bottom:1px solid var(--gray-border);">
  1411. <span style="font-size:13px;color:var(--text-primary);">医学院</span>
  1412. <div style="display:flex;align-items:center;gap:8px;">
  1413. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;font-size:12px;">医学实验室安全规范<span style="cursor:pointer;margin-left:2px;opacity:.7;">×</span></span>
  1414. </div>
  1415. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">更换试卷</button>
  1416. </div>
  1417. <!-- 环境科学学院 -->
  1418. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;border-bottom:1px solid var(--gray-border);">
  1419. <span style="font-size:13px;color:var(--text-primary);">环境科学学院</span>
  1420. <span style="font-size:12px;color:var(--text-hint);">继承默认试卷</span>
  1421. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">指定试卷</button>
  1422. </div>
  1423. <!-- 安全管理处 -->
  1424. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;">
  1425. <span style="font-size:13px;color:var(--text-primary);">安全管理处</span>
  1426. <span style="font-size:12px;color:var(--text-hint);">继承默认试卷</span>
  1427. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">指定试卷</button>
  1428. </div>
  1429. </div>
  1430. <div style="margin-top:24px;display:flex;gap:12px;">
  1431. <button class="btn btn-primary">保存设置</button>
  1432. <button class="btn btn-outline-gray">重置</button>
  1433. </div>
  1434. </div><!-- /kaixue-sec-paper -->
  1435. <!-- 考前配置 section -->
  1436. <div id="kaixue-sec-preexam" class="exam-section" style="display:none;">
  1437. <div class="card-title">考前配置</div>
  1438. <div style="display:flex;flex-direction:column;gap:20px;">
  1439. <!-- 学时要求 -->
  1440. <div style="display:flex;align-items:flex-start;gap:12px;">
  1441. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:4px;">学时要求</span>
  1442. <div style="display:flex;flex-direction:column;gap:10px;flex:1;">
  1443. <label class="toggle"><input type="checkbox" id="kaixue-credit-toggle" checked onchange="document.getElementById('kaixue-credit-detail').style.display=this.checked?'block':'none'"><span class="toggle-slider"></span></label>
  1444. <div id="kaixue-credit-detail">
  1445. <div style="font-size:13px;color:var(--text-hint);margin-bottom:10px;">按照试卷所属知识点配置对应学时要求</div>
  1446. <div class="table-wrap">
  1447. <table>
  1448. <thead>
  1449. <tr>
  1450. <th>知识点</th>
  1451. <th style="width:120px;">所需学时</th>
  1452. </tr>
  1453. </thead>
  1454. <tbody id="kaixue-credit-tbody">
  1455. <tr>
  1456. <td>实验室基础安全</td>
  1457. <td><input type="number" class="form-input" style="width:80px;" value="2" min="1"></td>
  1458. </tr>
  1459. <tr>
  1460. <td>化学品安全</td>
  1461. <td><input type="number" class="form-input" style="width:80px;" value="1" min="1"></td>
  1462. </tr>
  1463. <tr>
  1464. <td>消防安全-应急</td>
  1465. <td><input type="number" class="form-input" style="width:80px;" value="1" min="1"></td>
  1466. </tr>
  1467. </tbody>
  1468. </table>
  1469. </div>
  1470. </div>
  1471. </div>
  1472. </div>
  1473. <!-- 考前学习 -->
  1474. <div style="display:flex;align-items:flex-start;gap:12px;">
  1475. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:4px;">考前学习</span>
  1476. <div style="display:flex;flex-direction:column;gap:8px;">
  1477. <label class="toggle"><input type="checkbox" id="kaixue-prestudy-toggle" onchange="document.getElementById('kaixue-prestudy-detail').style.display=this.checked?'flex':'none'"><span class="toggle-slider"></span></label>
  1478. <div id="kaixue-prestudy-detail" style="display:none;align-items:center;gap:8px;">
  1479. <button class="btn btn-outline btn-sm">选择课程</button>
  1480. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;">实验室安全基础课程<span onclick="this.parentElement.remove()" style="cursor:pointer;margin-left:2px;">×</span></span>
  1481. <span class="form-hint">只可选择一门课程</span>
  1482. </div>
  1483. </div>
  1484. </div>
  1485. <!-- 模拟考试 -->
  1486. <div style="display:flex;align-items:flex-start;gap:12px;">
  1487. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:4px;">模拟考试</span>
  1488. <div style="display:flex;flex-direction:column;gap:10px;">
  1489. <label class="toggle"><input type="checkbox" id="kaixue-mock-toggle" onchange="document.getElementById('kaixue-mock-detail').style.display=this.checked?'block':'none'"><span class="toggle-slider"></span></label>
  1490. <div id="kaixue-mock-detail" style="display:none;">
  1491. <div style="display:flex;gap:16px;margin-bottom:10px;">
  1492. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;">
  1493. <input type="radio" name="kaixue-mock-mode" value="reuse" checked onchange="switchKaixueMockMode('reuse')"> 复用试卷
  1494. </label>
  1495. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;">
  1496. <input type="radio" name="kaixue-mock-mode" value="choose" onchange="switchKaixueMockMode('choose')"> 选择试卷
  1497. </label>
  1498. </div>
  1499. <!-- 复用试卷:显示当前正式考试试卷名称 -->
  1500. <div id="kaixue-mock-reuse-wrap" style="display:flex;align-items:center;gap:8px;">
  1501. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;">实验室安全综合试卷(2026)<span onclick="clearKaixueMockReuse()" style="cursor:pointer;margin-left:2px;">×</span></span>
  1502. <span class="form-hint">复用正式考试试卷作为模拟考试</span>
  1503. </div>
  1504. <!-- 选择试卷:手动选择 -->
  1505. <div id="kaixue-mock-choose-wrap" style="display:none;align-items:center;gap:8px;">
  1506. <button class="btn btn-outline btn-sm" onclick="showModal('modal-select-paper')">选择试卷</button>
  1507. <span id="kaixue-mock-paper-tag" style="display:none;" class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;"></span>
  1508. </div>
  1509. </div>
  1510. </div>
  1511. </div>
  1512. <!-- 考试承诺书 -->
  1513. <div style="display:flex;align-items:flex-start;gap:12px;">
  1514. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:4px;">考试承诺书</span>
  1515. <div style="display:flex;flex-direction:column;gap:8px;flex:1;">
  1516. <label class="toggle"><input type="checkbox" id="kaixue-pledge-toggle" onchange="document.getElementById('kaixue-pledge-editor').style.display=this.checked?'block':'none'"><span class="toggle-slider"></span></label>
  1517. <div id="kaixue-pledge-editor" style="display:none;">
  1518. <div class="rich-editor">
  1519. <div class="rich-toolbar">
  1520. <button class="rich-tool-btn">B</button><button class="rich-tool-btn">I</button>
  1521. <button class="rich-tool-btn">U</button><button class="rich-tool-btn">≡</button>
  1522. <button class="rich-tool-btn">链接</button><button class="rich-tool-btn">图片</button>
  1523. </div>
  1524. <div class="rich-body" contenteditable="true">
  1525. <p><strong>实验室安全承诺书</strong></p>
  1526. <p>本人郑重承诺:在参加实验室安全考试及日常实验操作过程中,严格遵守实验室各项安全规章制度,认真执行安全操作规程,不擅自使用不熟悉的仪器设备,不私自改装或违规操作实验装置。发现安全隐患及时上报,如实反映实验情况,对违规行为承担相应法律及校规责任。</p>
  1527. </div>
  1528. </div>
  1529. <div style="display:flex;align-items:center;gap:20px;margin-top:10px;flex-wrap:wrap;">
  1530. <label style="display:flex;align-items:center;gap:6px;cursor:pointer;font-size:13px;color:var(--text-secondary);">
  1531. <input type="checkbox" style="accent-color:var(--blue);">
  1532. 支持考生打印承诺书
  1533. </label>
  1534. </div>
  1535. </div>
  1536. </div>
  1537. </div>
  1538. </div>
  1539. <div style="margin-top:24px;display:flex;gap:12px;">
  1540. <button class="btn btn-primary">保存设置</button>
  1541. <button class="btn btn-outline-gray">重置</button>
  1542. </div>
  1543. </div><!-- /kaixue-sec-preexam -->
  1544. <!-- 获得证书 section -->
  1545. <div id="kaixue-sec-cert" class="exam-section" style="display:none;">
  1546. <div class="card-title">获得证书</div>
  1547. <div style="display:flex;flex-direction:column;gap:16px;">
  1548. <div style="display:flex;align-items:center;gap:12px;">
  1549. <span class="form-label" style="width:80px;flex-shrink:0;">颁发证书</span>
  1550. <label class="toggle"><input type="checkbox" id="kaixue-cert-toggle" onchange="document.getElementById('kaixue-cert-detail').style.display=this.checked?'block':'none'"><span class="toggle-slider"></span></label>
  1551. </div>
  1552. <div id="kaixue-cert-detail" style="display:none;">
  1553. <div style="display:flex;align-items:flex-start;gap:12px;">
  1554. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:6px;">证书模板</span>
  1555. <div style="display:flex;flex-direction:column;gap:12px;">
  1556. <select class="form-input form-select" style="width:240px;" id="kaixue-cert-tpl" onchange="previewKaixueCert(this)">
  1557. <option value="">请选择证书模板</option>
  1558. <option value="standard">实验室安全教育证书(标准版)</option>
  1559. <option value="elite">实验室安全教育证书(精英版)</option>
  1560. </select>
  1561. <div id="kaixue-cert-preview" style="display:none;border:1px solid var(--gray-border);border-radius:var(--radius);overflow:hidden;width:360px;background:var(--gray-light);">
  1562. <div style="padding:6px 10px;background:var(--blue-light);border-bottom:1px solid var(--gray-border);font-size:12px;color:var(--blue);display:flex;justify-content:space-between;align-items:center;">
  1563. <span id="kaixue-cert-preview-name"></span>
  1564. <span style="cursor:pointer;color:var(--text-hint);" onclick="document.getElementById('kaixue-cert-tpl').value='';previewKaixueCert(document.getElementById('kaixue-cert-tpl'))">×</span>
  1565. </div>
  1566. <div style="padding:24px;display:flex;align-items:center;justify-content:center;min-height:200px;">
  1567. <div id="kaixue-cert-img-wrap" style="text-align:center;"></div>
  1568. </div>
  1569. </div>
  1570. </div>
  1571. </div>
  1572. </div><!-- /kaixue-cert-detail -->
  1573. </div>
  1574. <div style="margin-top:24px;display:flex;gap:12px;">
  1575. <button class="btn btn-primary">保存设置</button>
  1576. <button class="btn btn-outline-gray">重置</button>
  1577. </div>
  1578. </div><!-- /kaixue-sec-cert -->
  1579. </div><!-- /right content -->
  1580. </div><!-- /exam-tab-kaixue -->
  1581. <!-- ══════════════════════════════════════════════════════════
  1582. TAB 2: 分级考试
  1583. ══════════════════════════════════════════════════════════ -->
  1584. <div id="exam-tab-fenji" class="exam-tab-panel" style="display:none;">
  1585. <!-- Grade sub-tabs -->
  1586. <div class="view-tabs" id="fenji-grade-tabs" style="margin-bottom:0;padding:0 24px;background:var(--white);border:1px solid var(--gray-border);border-bottom:none;border-radius:var(--radius) var(--radius) 0 0;">
  1587. <div class="view-tab active" onclick="switchGradeTab('g1')">Ⅰ级(重大风险)</div>
  1588. <div class="view-tab" onclick="switchGradeTab('g2')">Ⅱ级(高风险)</div>
  1589. <div class="view-tab" onclick="switchGradeTab('g3')">Ⅲ级(中风险)</div>
  1590. <div class="view-tab" onclick="switchGradeTab('g4')">Ⅳ级(低风险)</div>
  1591. </div>
  1592. <!-- Each grade panel shares the same two-column layout. We generate g1-g4. -->
  1593. <div id="fenji-grade-g1" class="fenji-grade-panel" style="display:flex;gap:0;background:var(--white);border:1px solid var(--gray-border);border-radius:0 0 var(--radius) var(--radius);box-shadow:var(--shadow);overflow:hidden;">
  1594. <div style="width:180px;flex-shrink:0;border-right:1px solid var(--gray-border);background:var(--gray-light);padding:14px 0;">
  1595. <div class="nav-item active" id="fenji-g1-nav-basic" onclick="switchExamSection('fenji-g1','basic')">基本配置</div>
  1596. <div class="nav-item" id="fenji-g1-nav-scope" onclick="switchExamSection('fenji-g1','scope')">考试范围</div>
  1597. <div class="nav-item" id="fenji-g1-nav-paper" onclick="switchExamSection('fenji-g1','paper')">试卷配置</div>
  1598. <div class="nav-item" id="fenji-g1-nav-preexam" onclick="switchExamSection('fenji-g1','preexam')">考前配置</div>
  1599. <div class="nav-item" id="fenji-g1-nav-cert" onclick="switchExamSection('fenji-g1','cert')">获得证书</div>
  1600. </div>
  1601. <div style="flex:1;padding:28px;overflow-y:auto;max-height:calc(100vh - var(--header-h) - 240px);">
  1602. <!-- 基本配置 -->
  1603. <div id="fenji-g1-sec-basic" class="exam-section">
  1604. <div class="card-title">基本配置</div>
  1605. <div style="display:flex;flex-direction:column;gap:16px;">
  1606. <div style="display:flex;align-items:center;gap:16px;"><span class="form-label" style="width:80px;flex-shrink:0;">考试类型</span><input class="form-input" style="width:200px;" value="Ⅰ级(重大风险)" disabled></div>
  1607. <div style="display:flex;align-items:center;gap:16px;"><span class="form-label" style="width:80px;flex-shrink:0;">考试名称</span><input class="form-input" style="width:300px;" placeholder="请输入考试名称"></div>
  1608. <div style="display:flex;align-items:center;gap:16px;">
  1609. <span class="form-label" style="width:80px;flex-shrink:0;">可考次数</span>
  1610. <div style="display:flex;align-items:center;gap:8px;">
  1611. <button class="btn btn-outline-gray btn-sm" onclick="stepNum('fenji-g1-ans',-1)">-</button>
  1612. <input id="fenji-g1-ans" type="number" class="form-input" style="width:60px;text-align:center;" value="2" min="1">
  1613. <button class="btn btn-outline-gray btn-sm" onclick="stepNum('fenji-g1-ans',1)">+</button>
  1614. </div>
  1615. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;margin-left:8px;"><input type="radio" name="fenji-g1-ans-mode" value="limit" checked> 限制次数</label>
  1616. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;"><input type="radio" name="fenji-g1-ans-mode" value="unlimited"> 无限制</label>
  1617. </div>
  1618. <div style="display:flex;align-items:center;gap:16px;">
  1619. <span class="form-label" style="width:80px;flex-shrink:0;">考试时间</span>
  1620. <input type="datetime-local" class="form-input" style="width:190px;" step="1"><span style="color:var(--text-hint);font-size:13px;margin:0 4px;">至</span><input type="datetime-local" class="form-input" style="width:190px;" step="1">
  1621. </div>
  1622. <div style="display:flex;align-items:center;gap:16px;">
  1623. <span class="form-label" style="width:80px;flex-shrink:0;">考试时长</span>
  1624. <div style="display:flex;align-items:center;gap:8px;">
  1625. <button class="btn btn-outline-gray btn-sm" onclick="stepNum('fenji-g1-dur',-5)">-</button>
  1626. <input id="fenji-g1-dur" type="number" class="form-input" style="width:70px;text-align:center;" value="60" min="5" step="5">
  1627. <button class="btn btn-outline-gray btn-sm" onclick="stepNum('fenji-g1-dur',5)">+</button>
  1628. <span style="font-size:13px;color:var(--text-secondary);">分钟</span>
  1629. </div>
  1630. </div>
  1631. <div style="display:flex;align-items:flex-start;gap:16px;">
  1632. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:4px;">启用</span>
  1633. <div style="display:flex;flex-direction:column;gap:6px;">
  1634. <label class="toggle"><input type="checkbox" checked><span class="toggle-slider"></span></label>
  1635. <span class="form-hint">开启后,每学年按配置时间自动创建执行该考试,无需重复配置</span>
  1636. </div>
  1637. </div>
  1638. <!-- 防作弊配置 -->
  1639. <div style="border-top:1px solid var(--gray-border);padding-top:16px;margin-top:4px;">
  1640. <div style="font-size:13px;font-weight:600;color:var(--text-secondary);margin-bottom:12px;">防作弊配置 <span style="font-weight:400;color:var(--text-hint);">(防作弊配置仅适用教育考试一体机)</span></div>
  1641. <div style="display:flex;flex-direction:column;gap:12px;">
  1642. <div style="display:flex;align-items:center;gap:12px;">
  1643. <span class="form-label" style="width:100px;flex-shrink:0;">考前人脸校验</span>
  1644. <label class="toggle"><input type="checkbox"><span class="toggle-slider"></span></label>
  1645. <span style="font-size:13px;color:var(--text-secondary);">开启后,考试前需要进行人脸识别校验</span>
  1646. </div>
  1647. <div style="display:flex;align-items:center;gap:12px;">
  1648. <span class="form-label" style="width:100px;flex-shrink:0;">考后人脸校验</span>
  1649. <label class="toggle"><input type="checkbox"><span class="toggle-slider"></span></label>
  1650. <span style="font-size:13px;color:var(--text-secondary);">开启后,考试后需要进行人脸识别校验</span>
  1651. </div>
  1652. <div style="display:flex;align-items:center;gap:12px;">
  1653. <span class="form-label" style="width:100px;flex-shrink:0;">摄像头抓拍</span>
  1654. <label class="toggle"><input type="checkbox"><span class="toggle-slider"></span></label>
  1655. <span style="font-size:13px;color:var(--text-secondary);">开启后,考试过程中摄像头随机抓拍</span>
  1656. </div>
  1657. </div>
  1658. </div>
  1659. </div>
  1660. <div style="margin-top:24px;display:flex;gap:12px;"><button class="btn btn-primary">保存设置</button><button class="btn btn-outline-gray">重置</button></div>
  1661. </div>
  1662. <!-- 考试范围 section -->
  1663. <div id="fenji-g1-sec-scope" class="exam-section" style="display:none;">
  1664. <div class="card-title">考试范围</div>
  1665. <div style="display:flex;align-items:center;gap:20px;margin-bottom:20px;">
  1666. <label style="display:flex;align-items:center;gap:6px;cursor:pointer;font-size:13px;"><input type="radio" name="fenji-g1-scope-type" value="specify" checked onchange="switchScopeTab('fenji-g1','specify')"> 指定范围</label>
  1667. <label style="display:flex;align-items:center;gap:6px;cursor:pointer;font-size:13px;"><input type="radio" name="fenji-g1-scope-type" value="person" onchange="switchScopeTab('fenji-g1','person')"> 指定人员</label>
  1668. </div>
  1669. <div id="fenji-g1-scope-panel-specify">
  1670. <div style="display:flex;flex-direction:column;gap:18px;">
  1671. <div style="display:flex;align-items:flex-start;gap:16px;">
  1672. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:6px;">学院单位</span>
  1673. <div style="flex:1;max-width:600px;">
  1674. <div style="position:relative;margin-bottom:8px;"><input class="form-input" style="padding-left:30px;" placeholder="搜索学院单位..."><span style="position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--text-hint);font-size:13px;">🔍</span></div>
  1675. <div style="display:flex;flex-wrap:wrap;gap:6px;padding:10px;border:1px solid var(--gray-border);border-radius:var(--radius);min-height:44px;background:var(--white);">
  1676. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">生命科学学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  1677. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">化学化工学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  1678. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">物理学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  1679. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">材料科学与工程学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  1680. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">医学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  1681. <span class="tag" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border:1px dashed var(--gray-border);border-radius:20px;cursor:pointer;color:var(--text-hint);">+ 添加学院</span>
  1682. </div>
  1683. <div style="display:flex;align-items:center;gap:12px;margin-top:8px;">
  1684. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;color:var(--text-secondary);"><input type="checkbox" checked style="accent-color:var(--blue);"> 全选</label>
  1685. <span style="font-size:12px;color:var(--text-hint);">已全选所有学院单位</span>
  1686. </div>
  1687. </div>
  1688. </div>
  1689. <!-- 考生类别 -->
  1690. <div style="display:flex;align-items:center;gap:16px;flex-wrap:wrap;">
  1691. <span class="form-label" style="width:80px;flex-shrink:0;">考生类别</span>
  1692. <div style="display:flex;align-items:center;gap:10px;flex-wrap:wrap;">
  1693. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;"><input type="checkbox" checked style="accent-color:var(--blue);"> 新生</label>
  1694. <div style="position:relative;">
  1695. <div class="multiselect-trigger" onclick="toggleMultiselect('fenji-g1-xinsheng-dd')" style="display:flex;align-items:center;gap:6px;padding:5px 10px;border:1px solid var(--gray-border);border-radius:var(--radius);cursor:pointer;font-size:13px;min-width:180px;background:var(--white);"><span id="fenji-g1-xinsheng-label" style="flex:1;color:var(--text-primary);">本科生、研究生</span><span style="color:var(--text-hint);font-size:11px;">▼</span></div>
  1696. <div id="fenji-g1-xinsheng-dd" style="display:none;position:absolute;top:100%;left:0;z-index:100;background:var(--white);border:1px solid var(--gray-border);border-radius:var(--radius);box-shadow:var(--shadow);padding:8px 0;min-width:160px;">
  1697. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" checked onchange="updateMultiselectLabel('fenji-g1-xinsheng-dd','fenji-g1-xinsheng-label')"> 本科生</label>
  1698. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g1-xinsheng-dd','fenji-g1-xinsheng-label')" checked> 研究生</label>
  1699. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g1-xinsheng-dd','fenji-g1-xinsheng-label')"> 博士生</label>
  1700. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g1-xinsheng-dd','fenji-g1-xinsheng-label')"> 教职工</label>
  1701. </div>
  1702. </div>
  1703. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;"><input type="checkbox" style="accent-color:var(--blue);"> 老生</label>
  1704. <div style="position:relative;">
  1705. <div class="multiselect-trigger" onclick="toggleMultiselect('fenji-g1-laosheng-dd')" style="display:flex;align-items:center;gap:6px;padding:5px 10px;border:1px solid var(--gray-border);border-radius:var(--radius);cursor:pointer;font-size:13px;min-width:180px;background:var(--white);"><span id="fenji-g1-laosheng-label" style="flex:1;color:var(--text-hint);">请选择类型</span><span style="color:var(--text-hint);font-size:11px;">▼</span></div>
  1706. <div id="fenji-g1-laosheng-dd" style="display:none;position:absolute;top:100%;left:0;z-index:100;background:var(--white);border:1px solid var(--gray-border);border-radius:var(--radius);box-shadow:var(--shadow);padding:8px 0;min-width:160px;">
  1707. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g1-laosheng-dd','fenji-g1-laosheng-label')"> 本科生</label>
  1708. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g1-laosheng-dd','fenji-g1-laosheng-label')"> 研究生</label>
  1709. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g1-laosheng-dd','fenji-g1-laosheng-label')"> 博士生</label>
  1710. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g1-laosheng-dd','fenji-g1-laosheng-label')"> 教职工</label>
  1711. </div>
  1712. </div>
  1713. </div>
  1714. </div>
  1715. </div>
  1716. </div>
  1717. <div id="fenji-g1-scope-panel-person" style="display:none;">
  1718. <div style="display:flex;flex-direction:column;gap:12px;margin-bottom:12px;">
  1719. <div style="display:flex;align-items:center;gap:12px;flex-wrap:wrap;">
  1720. <span class="form-label" style="width:80px;flex-shrink:0;">学院单位</span>
  1721. <div style="position:relative;display:inline-block;">
  1722. <div class="multiselect-trigger" onclick="toggleMultiselect('fenji-g1-person-college-dd')" style="display:flex;align-items:center;gap:6px;padding:6px 12px;border:1px solid var(--gray-border);border-radius:6px;cursor:pointer;background:var(--white);min-width:180px;">
  1723. <span id="fenji-g1-person-college-label" style="font-size:13px;color:var(--text-hint);flex:1;">请选择学院</span><span style="font-size:11px;color:var(--text-hint);">▾</span>
  1724. </div>
  1725. <div id="fenji-g1-person-college-dd" style="display:none;position:absolute;top:100%;left:0;z-index:100;background:var(--white);border:1px solid var(--gray-border);border-radius:6px;box-shadow:var(--shadow-md);padding:8px;min-width:200px;max-height:220px;overflow-y:auto;">
  1726. <label style="display:flex;align-items:center;gap:6px;padding:4px 6px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="toggleSelectAll(this,'fenji-g1-person-college-dd')"> 全选</label>
  1727. <label style="display:flex;align-items:center;gap:6px;padding:4px 6px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g1-person-college-dd','fenji-g1-person-college-label')"> 生命科学学院</label>
  1728. <label style="display:flex;align-items:center;gap:6px;padding:4px 6px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g1-person-college-dd','fenji-g1-person-college-label')"> 化学化工学院</label>
  1729. <label style="display:flex;align-items:center;gap:6px;padding:4px 6px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g1-person-college-dd','fenji-g1-person-college-label')"> 物理学院</label>
  1730. <label style="display:flex;align-items:center;gap:6px;padding:4px 6px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g1-person-college-dd','fenji-g1-person-college-label')"> 材料科学与工程学院</label>
  1731. <label style="display:flex;align-items:center;gap:6px;padding:4px 6px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g1-person-college-dd','fenji-g1-person-college-label')"> 医学院</label>
  1732. </div>
  1733. </div>
  1734. </div>
  1735. <div style="display:flex;align-items:center;gap:12px;flex-wrap:wrap;">
  1736. <span class="form-label" style="width:80px;flex-shrink:0;">姓名搜索</span>
  1737. <input class="form-input" style="width:180px;" placeholder="请输入姓名">
  1738. <button class="btn btn-outline btn-sm">搜索</button>
  1739. </div>
  1740. </div>
  1741. <div style="display:flex;gap:12px;">
  1742. <div style="flex:1;border:1px solid var(--gray-border);border-radius:6px;overflow:hidden;">
  1743. <div style="padding:8px 12px;background:var(--gray-light);border-bottom:1px solid var(--gray-border);font-size:13px;font-weight:600;">待选人员</div>
  1744. <div style="padding:8px;min-height:120px;font-size:13px;color:var(--text-hint);text-align:center;padding-top:40px;">搜索后显示</div>
  1745. </div>
  1746. <div style="display:flex;flex-direction:column;justify-content:center;gap:8px;">
  1747. <button class="btn btn-outline btn-sm">»</button>
  1748. <button class="btn btn-outline btn-sm">«</button>
  1749. </div>
  1750. <div style="flex:1;border:1px solid var(--gray-border);border-radius:6px;overflow:hidden;">
  1751. <div style="padding:8px 12px;background:var(--gray-light);border-bottom:1px solid var(--gray-border);font-size:13px;font-weight:600;">已选人员</div>
  1752. <div style="padding:8px;min-height:120px;"></div>
  1753. </div>
  1754. </div>
  1755. </div>
  1756. <div style="margin-top:24px;display:flex;gap:12px;"><button class="btn btn-primary">保存设置</button><button class="btn btn-outline-gray">重置</button></div>
  1757. </div>
  1758. <!-- 试卷配置 section -->
  1759. <div id="fenji-g1-sec-paper" class="exam-section" style="display:none;">
  1760. <div class="card-title">试卷配置</div>
  1761. <div style="border:1px solid var(--gray-border);border-radius:var(--radius);overflow:hidden;">
  1762. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:10px 16px;background:var(--blue-xlight);border-bottom:1px solid var(--gray-border);font-size:13px;font-weight:600;color:var(--text-secondary);">
  1763. <span>学院单位</span><span>试卷</span><span></span>
  1764. </div>
  1765. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;background:var(--blue-light);border-bottom:1px solid var(--gray-border);">
  1766. <span style="font-size:13px;font-weight:600;color:var(--blue);">全校(默认)</span>
  1767. <span style="font-size:12px;color:var(--text-hint);">实验室安全综合试卷(2026)</span>
  1768. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">更换试卷</button>
  1769. </div>
  1770. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;border-bottom:1px solid var(--gray-border);">
  1771. <span style="font-size:13px;color:var(--text-primary);">生命科学学院</span>
  1772. <span style="font-size:12px;color:var(--text-hint);">继承默认试卷</span>
  1773. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">指定试卷</button>
  1774. </div>
  1775. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;border-bottom:1px solid var(--gray-border);">
  1776. <span style="font-size:13px;color:var(--text-primary);">化学化工学院</span>
  1777. <span style="font-size:12px;color:var(--text-hint);">继承默认试卷</span>
  1778. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">指定试卷</button>
  1779. </div>
  1780. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;">
  1781. <span style="font-size:13px;color:var(--text-primary);">物理学院</span>
  1782. <span style="font-size:12px;color:var(--text-hint);">继承默认试卷</span>
  1783. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">指定试卷</button>
  1784. </div>
  1785. </div>
  1786. <div style="margin-top:24px;display:flex;gap:12px;"><button class="btn btn-primary">保存设置</button><button class="btn btn-outline-gray">重置</button></div>
  1787. </div>
  1788. <!-- 考前配置 section -->
  1789. <div id="fenji-g1-sec-preexam" class="exam-section" style="display:none;">
  1790. <div class="card-title">考前配置</div>
  1791. <div style="display:flex;flex-direction:column;gap:20px;">
  1792. <div style="display:flex;align-items:flex-start;gap:12px;">
  1793. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:4px;">学时要求</span>
  1794. <div style="background:#f4f6fa;border:1px solid #dde3ed;border-radius:6px;padding:12px 16px;font-size:13px;">
  1795. <div style="color:#8896a7;margin-bottom:10px;display:flex;align-items:center;gap:6px;"><span>ℹ️</span>根据考生绑定实验室的分级匹配年度学时要求,当前等级:<span style="font-weight:600;color:#e53e3e;">Ⅰ级(重大风险)</span></div>
  1796. <div style="display:grid;grid-template-columns:1fr 1fr;gap:10px;max-width:360px;">
  1797. <div style="background:#fff;border:1px solid #dde3ed;border-radius:6px;padding:12px 16px;text-align:center;">
  1798. <div style="font-size:11px;color:#8896a7;margin-bottom:4px;">准入学时</div>
  1799. <div style="font-size:24px;font-weight:700;color:#1857d4;">24</div>
  1800. <div style="font-size:12px;color:#8896a7;">学时</div>
  1801. </div>
  1802. <div style="background:#fff;border:1px solid #dde3ed;border-radius:6px;padding:12px 16px;text-align:center;">
  1803. <div style="font-size:11px;color:#8896a7;margin-bottom:4px;">第二年起年度学时</div>
  1804. <div style="font-size:24px;font-weight:700;color:#1857d4;">8</div>
  1805. <div style="font-size:12px;color:#8896a7;">学时</div>
  1806. </div>
  1807. </div>
  1808. </div>
  1809. </div>
  1810. <div style="display:flex;align-items:flex-start;gap:12px;">
  1811. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:4px;">考前学习</span>
  1812. <div style="display:flex;flex-direction:column;gap:8px;">
  1813. <label class="toggle"><input type="checkbox" onchange="this.parentElement.nextElementSibling.style.display=this.checked?'flex':'none'"><span class="toggle-slider"></span></label>
  1814. <div style="display:none;align-items:center;gap:8px;"><button class="btn btn-outline btn-sm">选择课程</button><span class="form-hint">只可选择一门课程</span></div>
  1815. </div>
  1816. </div>
  1817. <div style="display:flex;align-items:flex-start;gap:12px;">
  1818. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:4px;">模拟考试</span>
  1819. <div style="display:flex;flex-direction:column;gap:10px;">
  1820. <label class="toggle"><input type="checkbox" onchange="this.parentElement.nextElementSibling.style.display=this.checked?'block':'none'"><span class="toggle-slider"></span></label>
  1821. <div style="display:none;">
  1822. <div style="display:flex;gap:16px;margin-bottom:10px;">
  1823. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;"><input type="radio" name="fenji-g1-mock-mode" value="reuse" checked> 复用试卷</label>
  1824. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;"><input type="radio" name="fenji-g1-mock-mode" value="choose"> 选择试卷</label>
  1825. </div>
  1826. <div style="display:flex;align-items:center;gap:8px;"><span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;">复用正式考试试卷<span style="cursor:pointer;margin-left:2px;">×</span></span></div>
  1827. </div>
  1828. </div>
  1829. </div>
  1830. <div style="display:flex;align-items:flex-start;gap:12px;">
  1831. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:4px;">考试承诺书</span>
  1832. <div style="display:flex;flex-direction:column;gap:8px;flex:1;">
  1833. <label class="toggle"><input type="checkbox" onchange="this.parentElement.nextElementSibling.style.display=this.checked?'block':'none'"><span class="toggle-slider"></span></label>
  1834. <div style="display:none;">
  1835. <div class="rich-editor"><div class="rich-toolbar"><button class="rich-tool-btn">B</button><button class="rich-tool-btn">I</button><button class="rich-tool-btn">U</button><button class="rich-tool-btn">≡</button><button class="rich-tool-btn">链接</button><button class="rich-tool-btn">图片</button></div><div class="rich-body" contenteditable="true"><p><strong>实验室安全承诺书</strong></p><p>本人郑重承诺:在参加实验室安全考试及日常实验操作过程中,严格遵守实验室各项安全规章制度,认真执行安全操作规程,不擅自使用不熟悉的仪器设备,不私自改装或违规操作实验装置。发现安全隐患及时上报,如实反映实验情况,对违规行为承担相应法律及校规责任。</p></div></div>
  1836. <label style="display:flex;align-items:center;gap:6px;margin-top:10px;cursor:pointer;font-size:13px;color:var(--text-secondary);"><input type="checkbox" style="accent-color:var(--blue);"> 支持考生打印承诺书</label>
  1837. </div>
  1838. </div>
  1839. </div>
  1840. </div>
  1841. <div style="margin-top:24px;display:flex;gap:12px;"><button class="btn btn-primary">保存设置</button><button class="btn btn-outline-gray">重置</button></div>
  1842. </div>
  1843. <!-- 获得证书 section -->
  1844. <div id="fenji-g1-sec-cert" class="exam-section" style="display:none;">
  1845. <div class="card-title">获得证书</div>
  1846. <div style="display:flex;flex-direction:column;gap:16px;">
  1847. <div style="display:flex;align-items:center;gap:12px;">
  1848. <span class="form-label" style="width:80px;flex-shrink:0;">颁发证书</span>
  1849. <label class="toggle"><input type="checkbox" onchange="document.getElementById('fenji-g1-cert-detail').style.display=this.checked?'block':'none'"><span class="toggle-slider"></span></label>
  1850. </div>
  1851. <div id="fenji-g1-cert-detail" style="display:none;">
  1852. <div style="display:flex;align-items:flex-start;gap:12px;">
  1853. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:6px;">证书模板</span>
  1854. <div style="display:flex;flex-direction:column;gap:12px;">
  1855. <select class="form-input form-select" style="width:240px;" onchange="previewCert(this,'fenji-g1-cert-preview','fenji-g1-cert-preview-name','fenji-g1-cert-img-wrap')">
  1856. <option value="">请选择证书模板</option>
  1857. <option value="standard">实验室安全教育证书(标准版)</option>
  1858. <option value="elite">实验室安全教育证书(精英版)</option>
  1859. </select>
  1860. <div id="fenji-g1-cert-preview" style="display:none;border:1px solid var(--gray-border);border-radius:var(--radius);overflow:hidden;width:360px;background:var(--gray-light);">
  1861. <div style="padding:6px 10px;background:var(--blue-light);border-bottom:1px solid var(--gray-border);font-size:12px;color:var(--blue);display:flex;justify-content:space-between;align-items:center;"><span id="fenji-g1-cert-preview-name"></span><span style="cursor:pointer;color:var(--text-hint);" onclick="this.closest('[id$=-cert-preview]').previousElementSibling.value='';this.closest('[id$=-cert-preview]').style.display='none'">×</span></div>
  1862. <div style="padding:24px;display:flex;align-items:center;justify-content:center;min-height:200px;"><div id="fenji-g1-cert-img-wrap"></div></div>
  1863. </div>
  1864. </div>
  1865. </div>
  1866. </div>
  1867. </div>
  1868. <div style="margin-top:24px;display:flex;gap:12px;"><button class="btn btn-primary">保存设置</button><button class="btn btn-outline-gray">重置</button></div>
  1869. </div>
  1870. </div><!-- /right content -->
  1871. </div><!-- /fenji-grade-g1 -->
  1872. <!-- Grades g2, g3, g4 share identical structure, only IDs and type labels differ -->
  1873. <div id="fenji-grade-g2" class="fenji-grade-panel" style="display:none;gap:0;background:var(--white);border:1px solid var(--gray-border);border-radius:0 0 var(--radius) var(--radius);box-shadow:var(--shadow);overflow:hidden;flex-direction:row;">
  1874. <div style="width:180px;flex-shrink:0;border-right:1px solid var(--gray-border);background:var(--gray-light);padding:14px 0;">
  1875. <div class="nav-item active" id="fenji-g2-nav-basic" onclick="switchExamSection('fenji-g2','basic')">基本配置</div>
  1876. <div class="nav-item" id="fenji-g2-nav-scope" onclick="switchExamSection('fenji-g2','scope')">考试范围</div>
  1877. <div class="nav-item" id="fenji-g2-nav-paper" onclick="switchExamSection('fenji-g2','paper')">试卷配置</div>
  1878. <div class="nav-item" id="fenji-g2-nav-preexam" onclick="switchExamSection('fenji-g2','preexam')">考前配置</div>
  1879. <div class="nav-item" id="fenji-g2-nav-cert" onclick="switchExamSection('fenji-g2','cert')">获得证书</div>
  1880. </div>
  1881. <div style="flex:1;padding:28px;overflow-y:auto;max-height:calc(100vh - var(--header-h) - 240px);">
  1882. <!-- 基本配置 section -->
  1883. <div id="fenji-g2-sec-basic" class="exam-section">
  1884. <div class="card-title">基本配置</div>
  1885. <div style="display:flex;flex-direction:column;gap:16px;">
  1886. <div style="display:flex;align-items:center;gap:16px;"><span class="form-label" style="width:80px;flex-shrink:0;">考试类型</span><input class="form-input" style="width:200px;" value="Ⅱ级(高风险)" disabled></div>
  1887. <div style="display:flex;align-items:center;gap:16px;"><span class="form-label" style="width:80px;flex-shrink:0;">考试名称</span><input class="form-input" style="width:300px;" placeholder="请输入考试名称"></div>
  1888. <div style="display:flex;align-items:center;gap:16px;">
  1889. <span class="form-label" style="width:80px;flex-shrink:0;">可考次数</span>
  1890. <div style="display:flex;align-items:center;gap:8px;">
  1891. <button class="btn btn-outline-gray btn-sm" onclick="stepNum('fenji-g2-ans',-1)">-</button>
  1892. <input id="fenji-g2-ans" type="number" class="form-input" style="width:60px;text-align:center;" value="2" min="1">
  1893. <button class="btn btn-outline-gray btn-sm" onclick="stepNum('fenji-g2-ans',1)">+</button>
  1894. </div>
  1895. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;margin-left:8px;"><input type="radio" name="fenji-g2-ans-mode" value="limit" checked> 限制次数</label>
  1896. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;"><input type="radio" name="fenji-g2-ans-mode" value="unlimited"> 无限制</label>
  1897. </div>
  1898. <div style="display:flex;align-items:center;gap:16px;">
  1899. <span class="form-label" style="width:80px;flex-shrink:0;">考试时间</span>
  1900. <input type="datetime-local" class="form-input" style="width:190px;" step="1"><span style="color:var(--text-hint);font-size:13px;margin:0 4px;">至</span><input type="datetime-local" class="form-input" style="width:190px;" step="1">
  1901. </div>
  1902. <div style="display:flex;align-items:center;gap:16px;">
  1903. <span class="form-label" style="width:80px;flex-shrink:0;">考试时长</span>
  1904. <div style="display:flex;align-items:center;gap:8px;">
  1905. <button class="btn btn-outline-gray btn-sm" onclick="stepNum('fenji-g2-dur',-5)">-</button>
  1906. <input id="fenji-g2-dur" type="number" class="form-input" style="width:70px;text-align:center;" value="60" min="5" step="5">
  1907. <button class="btn btn-outline-gray btn-sm" onclick="stepNum('fenji-g2-dur',5)">+</button>
  1908. <span style="font-size:13px;color:var(--text-secondary);">分钟</span>
  1909. </div>
  1910. </div>
  1911. <div style="display:flex;align-items:flex-start;gap:16px;">
  1912. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:4px;">启用</span>
  1913. <div style="display:flex;flex-direction:column;gap:6px;">
  1914. <label class="toggle"><input type="checkbox" checked><span class="toggle-slider"></span></label>
  1915. <span class="form-hint">开启后,每学年按配置时间自动创建执行该考试,无需重复配置</span>
  1916. </div>
  1917. </div>
  1918. <!-- 防作弊配置 -->
  1919. <div style="border-top:1px solid var(--gray-border);padding-top:16px;margin-top:4px;">
  1920. <div style="font-size:13px;font-weight:600;color:var(--text-secondary);margin-bottom:12px;">防作弊配置 <span style="font-weight:400;color:var(--text-hint);">(防作弊配置仅适用教育考试一体机)</span></div>
  1921. <div style="display:flex;flex-direction:column;gap:12px;">
  1922. <div style="display:flex;align-items:center;gap:12px;">
  1923. <span class="form-label" style="width:100px;flex-shrink:0;">考前人脸校验</span>
  1924. <label class="toggle"><input type="checkbox"><span class="toggle-slider"></span></label>
  1925. <span style="font-size:13px;color:var(--text-secondary);">开启后,考试前需要进行人脸识别校验</span>
  1926. </div>
  1927. <div style="display:flex;align-items:center;gap:12px;">
  1928. <span class="form-label" style="width:100px;flex-shrink:0;">考后人脸校验</span>
  1929. <label class="toggle"><input type="checkbox"><span class="toggle-slider"></span></label>
  1930. <span style="font-size:13px;color:var(--text-secondary);">开启后,考试后需要进行人脸识别校验</span>
  1931. </div>
  1932. <div style="display:flex;align-items:center;gap:12px;">
  1933. <span class="form-label" style="width:100px;flex-shrink:0;">摄像头抓拍</span>
  1934. <label class="toggle"><input type="checkbox"><span class="toggle-slider"></span></label>
  1935. <span style="font-size:13px;color:var(--text-secondary);">开启后,考试过程中摄像头随机抓拍</span>
  1936. </div>
  1937. </div>
  1938. </div>
  1939. </div>
  1940. <div style="margin-top:24px;display:flex;gap:12px;"><button class="btn btn-primary">保存设置</button><button class="btn btn-outline-gray">重置</button></div>
  1941. </div>
  1942. <!-- 考试范围 section -->
  1943. <div id="fenji-g2-sec-scope" class="exam-section" style="display:none;">
  1944. <div class="card-title">考试范围</div>
  1945. <div style="display:flex;align-items:center;gap:20px;margin-bottom:20px;">
  1946. <label style="display:flex;align-items:center;gap:6px;cursor:pointer;font-size:13px;"><input type="radio" name="fenji-g2-scope-type" value="specify" checked onchange="switchScopeTab('fenji-g2','specify')"> 指定范围</label>
  1947. <label style="display:flex;align-items:center;gap:6px;cursor:pointer;font-size:13px;"><input type="radio" name="fenji-g2-scope-type" value="person" onchange="switchScopeTab('fenji-g2','person')"> 指定人员</label>
  1948. </div>
  1949. <div id="fenji-g2-scope-panel-specify">
  1950. <div style="display:flex;flex-direction:column;gap:18px;">
  1951. <div style="display:flex;align-items:flex-start;gap:16px;">
  1952. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:6px;">学院单位</span>
  1953. <div style="flex:1;max-width:600px;">
  1954. <div style="position:relative;margin-bottom:8px;"><input class="form-input" style="padding-left:30px;" placeholder="搜索学院单位..."><span style="position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--text-hint);font-size:13px;">🔍</span></div>
  1955. <div style="display:flex;flex-wrap:wrap;gap:6px;padding:10px;border:1px solid var(--gray-border);border-radius:var(--radius);min-height:44px;background:var(--white);">
  1956. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">生命科学学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  1957. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">化学化工学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  1958. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">物理学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  1959. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">材料科学与工程学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  1960. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">医学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  1961. <span class="tag" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border:1px dashed var(--gray-border);border-radius:20px;cursor:pointer;color:var(--text-hint);">+ 添加学院</span>
  1962. </div>
  1963. <div style="display:flex;align-items:center;gap:12px;margin-top:8px;">
  1964. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;color:var(--text-secondary);"><input type="checkbox" checked style="accent-color:var(--blue);"> 全选</label>
  1965. <span style="font-size:12px;color:var(--text-hint);">已全选所有学院单位</span>
  1966. </div>
  1967. </div>
  1968. </div>
  1969. <!-- 考生类别 -->
  1970. <div style="display:flex;align-items:center;gap:16px;flex-wrap:wrap;">
  1971. <span class="form-label" style="width:80px;flex-shrink:0;">考生类别</span>
  1972. <div style="display:flex;align-items:center;gap:10px;flex-wrap:wrap;">
  1973. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;"><input type="checkbox" checked style="accent-color:var(--blue);"> 新生</label>
  1974. <div style="position:relative;">
  1975. <div class="multiselect-trigger" onclick="toggleMultiselect('fenji-g2-xinsheng-dd')" style="display:flex;align-items:center;gap:6px;padding:5px 10px;border:1px solid var(--gray-border);border-radius:var(--radius);cursor:pointer;font-size:13px;min-width:180px;background:var(--white);"><span id="fenji-g2-xinsheng-label" style="flex:1;color:var(--text-primary);">本科生、研究生</span><span style="color:var(--text-hint);font-size:11px;">▼</span></div>
  1976. <div id="fenji-g2-xinsheng-dd" style="display:none;position:absolute;top:100%;left:0;z-index:100;background:var(--white);border:1px solid var(--gray-border);border-radius:var(--radius);box-shadow:var(--shadow);padding:8px 0;min-width:160px;">
  1977. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" checked onchange="updateMultiselectLabel('fenji-g2-xinsheng-dd','fenji-g2-xinsheng-label')"> 本科生</label>
  1978. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g2-xinsheng-dd','fenji-g2-xinsheng-label')" checked> 研究生</label>
  1979. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g2-xinsheng-dd','fenji-g2-xinsheng-label')"> 博士生</label>
  1980. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g2-xinsheng-dd','fenji-g2-xinsheng-label')"> 教职工</label>
  1981. </div>
  1982. </div>
  1983. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;"><input type="checkbox" style="accent-color:var(--blue);"> 老生</label>
  1984. <div style="position:relative;">
  1985. <div class="multiselect-trigger" onclick="toggleMultiselect('fenji-g2-laosheng-dd')" style="display:flex;align-items:center;gap:6px;padding:5px 10px;border:1px solid var(--gray-border);border-radius:var(--radius);cursor:pointer;font-size:13px;min-width:180px;background:var(--white);"><span id="fenji-g2-laosheng-label" style="flex:1;color:var(--text-hint);">请选择类型</span><span style="color:var(--text-hint);font-size:11px;">▼</span></div>
  1986. <div id="fenji-g2-laosheng-dd" style="display:none;position:absolute;top:100%;left:0;z-index:100;background:var(--white);border:1px solid var(--gray-border);border-radius:var(--radius);box-shadow:var(--shadow);padding:8px 0;min-width:160px;">
  1987. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g2-laosheng-dd','fenji-g2-laosheng-label')"> 本科生</label>
  1988. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g2-laosheng-dd','fenji-g2-laosheng-label')"> 研究生</label>
  1989. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g2-laosheng-dd','fenji-g2-laosheng-label')"> 博士生</label>
  1990. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g2-laosheng-dd','fenji-g2-laosheng-label')"> 教职工</label>
  1991. </div>
  1992. </div>
  1993. </div>
  1994. </div>
  1995. </div>
  1996. </div>
  1997. <div id="fenji-g2-scope-panel-person" style="display:none;">
  1998. <div style="display:flex;flex-direction:column;gap:12px;margin-bottom:12px;">
  1999. <div style="display:flex;align-items:center;gap:12px;flex-wrap:wrap;">
  2000. <span class="form-label" style="width:80px;flex-shrink:0;">学院单位</span>
  2001. <div style="position:relative;display:inline-block;">
  2002. <div class="multiselect-trigger" onclick="toggleMultiselect('fenji-g2-person-college-dd')" style="display:flex;align-items:center;gap:6px;padding:6px 12px;border:1px solid var(--gray-border);border-radius:6px;cursor:pointer;background:var(--white);min-width:180px;">
  2003. <span id="fenji-g2-person-college-label" style="font-size:13px;color:var(--text-hint);flex:1;">请选择学院</span><span style="font-size:11px;color:var(--text-hint);">▾</span>
  2004. </div>
  2005. <div id="fenji-g2-person-college-dd" style="display:none;position:absolute;top:100%;left:0;z-index:100;background:var(--white);border:1px solid var(--gray-border);border-radius:6px;box-shadow:var(--shadow-md);padding:8px;min-width:200px;max-height:220px;overflow-y:auto;">
  2006. <label style="display:flex;align-items:center;gap:6px;padding:4px 6px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="toggleSelectAll(this,'fenji-g2-person-college-dd')"> 全选</label>
  2007. <label style="display:flex;align-items:center;gap:6px;padding:4px 6px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g2-person-college-dd','fenji-g2-person-college-label')"> 生命科学学院</label>
  2008. <label style="display:flex;align-items:center;gap:6px;padding:4px 6px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g2-person-college-dd','fenji-g2-person-college-label')"> 化学化工学院</label>
  2009. <label style="display:flex;align-items:center;gap:6px;padding:4px 6px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g2-person-college-dd','fenji-g2-person-college-label')"> 物理学院</label>
  2010. <label style="display:flex;align-items:center;gap:6px;padding:4px 6px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g2-person-college-dd','fenji-g2-person-college-label')"> 材料科学与工程学院</label>
  2011. <label style="display:flex;align-items:center;gap:6px;padding:4px 6px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g2-person-college-dd','fenji-g2-person-college-label')"> 医学院</label>
  2012. </div>
  2013. </div>
  2014. </div>
  2015. <div style="display:flex;align-items:center;gap:12px;flex-wrap:wrap;">
  2016. <span class="form-label" style="width:80px;flex-shrink:0;">姓名搜索</span>
  2017. <input class="form-input" style="width:180px;" placeholder="请输入姓名">
  2018. <button class="btn btn-outline btn-sm">搜索</button>
  2019. </div>
  2020. </div>
  2021. <div style="display:flex;gap:12px;">
  2022. <div style="flex:1;border:1px solid var(--gray-border);border-radius:6px;overflow:hidden;">
  2023. <div style="padding:8px 12px;background:var(--gray-light);border-bottom:1px solid var(--gray-border);font-size:13px;font-weight:600;">待选人员</div>
  2024. <div style="padding:8px;min-height:120px;font-size:13px;color:var(--text-hint);text-align:center;padding-top:40px;">搜索后显示</div>
  2025. </div>
  2026. <div style="display:flex;flex-direction:column;justify-content:center;gap:8px;">
  2027. <button class="btn btn-outline btn-sm">»</button>
  2028. <button class="btn btn-outline btn-sm">«</button>
  2029. </div>
  2030. <div style="flex:1;border:1px solid var(--gray-border);border-radius:6px;overflow:hidden;">
  2031. <div style="padding:8px 12px;background:var(--gray-light);border-bottom:1px solid var(--gray-border);font-size:13px;font-weight:600;">已选人员</div>
  2032. <div style="padding:8px;min-height:120px;"></div>
  2033. </div>
  2034. </div>
  2035. </div>
  2036. <div style="margin-top:24px;display:flex;gap:12px;"><button class="btn btn-primary">保存设置</button><button class="btn btn-outline-gray">重置</button></div>
  2037. </div>
  2038. <!-- 试卷配置 section -->
  2039. <div id="fenji-g2-sec-paper" class="exam-section" style="display:none;">
  2040. <div class="card-title">试卷配置</div>
  2041. <div style="border:1px solid var(--gray-border);border-radius:var(--radius);overflow:hidden;">
  2042. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:10px 16px;background:var(--blue-xlight);border-bottom:1px solid var(--gray-border);font-size:13px;font-weight:600;color:var(--text-secondary);">
  2043. <span>学院单位</span><span>试卷</span><span></span>
  2044. </div>
  2045. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;background:var(--blue-light);border-bottom:1px solid var(--gray-border);">
  2046. <span style="font-size:13px;font-weight:600;color:var(--blue);">全校(默认)</span>
  2047. <span style="font-size:12px;color:var(--text-hint);">实验室安全综合试卷(2026)</span>
  2048. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">更换试卷</button>
  2049. </div>
  2050. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;border-bottom:1px solid var(--gray-border);">
  2051. <span style="font-size:13px;color:var(--text-primary);">生命科学学院</span>
  2052. <span style="font-size:12px;color:var(--text-hint);">继承默认试卷</span>
  2053. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">指定试卷</button>
  2054. </div>
  2055. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;border-bottom:1px solid var(--gray-border);">
  2056. <span style="font-size:13px;color:var(--text-primary);">化学化工学院</span>
  2057. <span style="font-size:12px;color:var(--text-hint);">继承默认试卷</span>
  2058. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">指定试卷</button>
  2059. </div>
  2060. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;">
  2061. <span style="font-size:13px;color:var(--text-primary);">物理学院</span>
  2062. <span style="font-size:12px;color:var(--text-hint);">继承默认试卷</span>
  2063. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">指定试卷</button>
  2064. </div>
  2065. </div>
  2066. <div style="margin-top:24px;display:flex;gap:12px;"><button class="btn btn-primary">保存设置</button><button class="btn btn-outline-gray">重置</button></div>
  2067. </div>
  2068. <!-- 考前配置 section -->
  2069. <div id="fenji-g2-sec-preexam" class="exam-section" style="display:none;">
  2070. <div class="card-title">考前配置</div>
  2071. <div style="display:flex;flex-direction:column;gap:20px;">
  2072. <div style="display:flex;align-items:flex-start;gap:12px;">
  2073. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:4px;">学时要求</span>
  2074. <div style="background:#f4f6fa;border:1px solid #dde3ed;border-radius:6px;padding:12px 16px;font-size:13px;">
  2075. <div style="color:#8896a7;margin-bottom:10px;display:flex;align-items:center;gap:6px;"><span>ℹ️</span>根据考生绑定实验室的分级匹配年度学时要求,当前等级:<span style="font-weight:600;color:#e67e22;">Ⅱ级(高风险)</span></div>
  2076. <div style="display:grid;grid-template-columns:1fr 1fr;gap:10px;max-width:360px;">
  2077. <div style="background:#fff;border:1px solid #dde3ed;border-radius:6px;padding:12px 16px;text-align:center;">
  2078. <div style="font-size:11px;color:#8896a7;margin-bottom:4px;">准入学时</div>
  2079. <div style="font-size:24px;font-weight:700;color:#1857d4;">16</div>
  2080. <div style="font-size:12px;color:#8896a7;">学时</div>
  2081. </div>
  2082. <div style="background:#fff;border:1px solid #dde3ed;border-radius:6px;padding:12px 16px;text-align:center;">
  2083. <div style="font-size:11px;color:#8896a7;margin-bottom:4px;">第二年起年度学时</div>
  2084. <div style="font-size:24px;font-weight:700;color:#1857d4;">4</div>
  2085. <div style="font-size:12px;color:#8896a7;">学时</div>
  2086. </div>
  2087. </div>
  2088. </div>
  2089. </div>
  2090. <div style="display:flex;align-items:flex-start;gap:12px;">
  2091. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:4px;">考前学习</span>
  2092. <div style="display:flex;flex-direction:column;gap:8px;">
  2093. <label class="toggle"><input type="checkbox" onchange="this.parentElement.nextElementSibling.style.display=this.checked?'flex':'none'"><span class="toggle-slider"></span></label>
  2094. <div style="display:none;align-items:center;gap:8px;"><button class="btn btn-outline btn-sm">选择课程</button><span class="form-hint">只可选择一门课程</span></div>
  2095. </div>
  2096. </div>
  2097. <div style="display:flex;align-items:flex-start;gap:12px;">
  2098. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:4px;">模拟考试</span>
  2099. <div style="display:flex;flex-direction:column;gap:10px;">
  2100. <label class="toggle"><input type="checkbox" onchange="this.parentElement.nextElementSibling.style.display=this.checked?'block':'none'"><span class="toggle-slider"></span></label>
  2101. <div style="display:none;">
  2102. <div style="display:flex;gap:16px;margin-bottom:10px;">
  2103. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;"><input type="radio" name="fenji-g2-mock-mode" value="reuse" checked> 复用试卷</label>
  2104. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;"><input type="radio" name="fenji-g2-mock-mode" value="choose"> 选择试卷</label>
  2105. </div>
  2106. <div style="display:flex;align-items:center;gap:8px;"><span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;">复用正式考试试卷<span style="cursor:pointer;margin-left:2px;">×</span></span></div>
  2107. </div>
  2108. </div>
  2109. </div>
  2110. <div style="display:flex;align-items:flex-start;gap:12px;">
  2111. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:4px;">考试承诺书</span>
  2112. <div style="display:flex;flex-direction:column;gap:8px;flex:1;">
  2113. <label class="toggle"><input type="checkbox" onchange="this.parentElement.nextElementSibling.style.display=this.checked?'block':'none'"><span class="toggle-slider"></span></label>
  2114. <div style="display:none;">
  2115. <div class="rich-editor"><div class="rich-toolbar"><button class="rich-tool-btn">B</button><button class="rich-tool-btn">I</button><button class="rich-tool-btn">U</button><button class="rich-tool-btn">≡</button><button class="rich-tool-btn">链接</button><button class="rich-tool-btn">图片</button></div><div class="rich-body" contenteditable="true"><p><strong>实验室安全承诺书</strong></p><p>本人郑重承诺:在参加实验室安全考试及日常实验操作过程中,严格遵守实验室各项安全规章制度,认真执行安全操作规程,不擅自使用不熟悉的仪器设备,不私自改装或违规操作实验装置。发现安全隐患及时上报,如实反映实验情况,对违规行为承担相应法律及校规责任。</p></div></div>
  2116. <label style="display:flex;align-items:center;gap:6px;margin-top:10px;cursor:pointer;font-size:13px;color:var(--text-secondary);"><input type="checkbox" style="accent-color:var(--blue);"> 支持考生打印承诺书</label>
  2117. </div>
  2118. </div>
  2119. </div>
  2120. </div>
  2121. <div style="margin-top:24px;display:flex;gap:12px;"><button class="btn btn-primary">保存设置</button><button class="btn btn-outline-gray">重置</button></div>
  2122. </div>
  2123. <!-- 获得证书 section -->
  2124. <div id="fenji-g2-sec-cert" class="exam-section" style="display:none;">
  2125. <div class="card-title">获得证书</div>
  2126. <div style="display:flex;flex-direction:column;gap:16px;">
  2127. <div style="display:flex;align-items:center;gap:12px;">
  2128. <span class="form-label" style="width:80px;flex-shrink:0;">颁发证书</span>
  2129. <label class="toggle"><input type="checkbox" onchange="document.getElementById('fenji-g2-cert-detail').style.display=this.checked?'block':'none'"><span class="toggle-slider"></span></label>
  2130. </div>
  2131. <div id="fenji-g2-cert-detail" style="display:none;">
  2132. <div style="display:flex;align-items:flex-start;gap:12px;">
  2133. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:6px;">证书模板</span>
  2134. <div style="display:flex;flex-direction:column;gap:12px;">
  2135. <select class="form-input form-select" style="width:240px;" onchange="previewCert(this,'fenji-g2-cert-preview','fenji-g2-cert-preview-name','fenji-g2-cert-img-wrap')">
  2136. <option value="">请选择证书模板</option>
  2137. <option value="standard">实验室安全教育证书(标准版)</option>
  2138. <option value="elite">实验室安全教育证书(精英版)</option>
  2139. </select>
  2140. <div id="fenji-g2-cert-preview" style="display:none;border:1px solid var(--gray-border);border-radius:var(--radius);overflow:hidden;width:360px;background:var(--gray-light);">
  2141. <div style="padding:6px 10px;background:var(--blue-light);border-bottom:1px solid var(--gray-border);font-size:12px;color:var(--blue);display:flex;justify-content:space-between;align-items:center;"><span id="fenji-g2-cert-preview-name"></span><span style="cursor:pointer;color:var(--text-hint);" onclick="this.closest('[id$=-cert-preview]').previousElementSibling.value='';this.closest('[id$=-cert-preview]').style.display='none'">×</span></div>
  2142. <div style="padding:24px;display:flex;align-items:center;justify-content:center;min-height:200px;"><div id="fenji-g2-cert-img-wrap"></div></div>
  2143. </div>
  2144. </div>
  2145. </div>
  2146. </div>
  2147. </div>
  2148. <div style="margin-top:24px;display:flex;gap:12px;"><button class="btn btn-primary">保存设置</button><button class="btn btn-outline-gray">重置</button></div>
  2149. </div>
  2150. </div>
  2151. </div><!-- /fenji-grade-g2 -->
  2152. <div id="fenji-grade-g3" class="fenji-grade-panel" style="display:none;gap:0;background:var(--white);border:1px solid var(--gray-border);border-radius:0 0 var(--radius) var(--radius);box-shadow:var(--shadow);overflow:hidden;flex-direction:row;">
  2153. <div style="width:180px;flex-shrink:0;border-right:1px solid var(--gray-border);background:var(--gray-light);padding:14px 0;">
  2154. <div class="nav-item active" id="fenji-g3-nav-basic" onclick="switchExamSection('fenji-g3','basic')">基本配置</div>
  2155. <div class="nav-item" id="fenji-g3-nav-scope" onclick="switchExamSection('fenji-g3','scope')">考试范围</div>
  2156. <div class="nav-item" id="fenji-g3-nav-paper" onclick="switchExamSection('fenji-g3','paper')">试卷配置</div>
  2157. <div class="nav-item" id="fenji-g3-nav-preexam" onclick="switchExamSection('fenji-g3','preexam')">考前配置</div>
  2158. <div class="nav-item" id="fenji-g3-nav-cert" onclick="switchExamSection('fenji-g3','cert')">获得证书</div>
  2159. </div>
  2160. <div style="flex:1;padding:28px;overflow-y:auto;max-height:calc(100vh - var(--header-h) - 240px);">
  2161. <!-- 基本配置 section -->
  2162. <div id="fenji-g3-sec-basic" class="exam-section">
  2163. <div class="card-title">基本配置</div>
  2164. <div style="display:flex;flex-direction:column;gap:16px;">
  2165. <div style="display:flex;align-items:center;gap:16px;"><span class="form-label" style="width:80px;flex-shrink:0;">考试类型</span><input class="form-input" style="width:200px;" value="Ⅲ级(中风险)" disabled></div>
  2166. <div style="display:flex;align-items:center;gap:16px;"><span class="form-label" style="width:80px;flex-shrink:0;">考试名称</span><input class="form-input" style="width:300px;" placeholder="请输入考试名称"></div>
  2167. <div style="display:flex;align-items:center;gap:16px;">
  2168. <span class="form-label" style="width:80px;flex-shrink:0;">可考次数</span>
  2169. <div style="display:flex;align-items:center;gap:8px;">
  2170. <button class="btn btn-outline-gray btn-sm" onclick="stepNum('fenji-g3-ans',-1)">-</button>
  2171. <input id="fenji-g3-ans" type="number" class="form-input" style="width:60px;text-align:center;" value="2" min="1">
  2172. <button class="btn btn-outline-gray btn-sm" onclick="stepNum('fenji-g3-ans',1)">+</button>
  2173. </div>
  2174. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;margin-left:8px;"><input type="radio" name="fenji-g3-ans-mode" value="limit" checked> 限制次数</label>
  2175. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;"><input type="radio" name="fenji-g3-ans-mode" value="unlimited"> 无限制</label>
  2176. </div>
  2177. <div style="display:flex;align-items:center;gap:16px;">
  2178. <span class="form-label" style="width:80px;flex-shrink:0;">考试时间</span>
  2179. <input type="datetime-local" class="form-input" style="width:190px;" step="1"><span style="color:var(--text-hint);font-size:13px;margin:0 4px;">至</span><input type="datetime-local" class="form-input" style="width:190px;" step="1">
  2180. </div>
  2181. <div style="display:flex;align-items:center;gap:16px;">
  2182. <span class="form-label" style="width:80px;flex-shrink:0;">考试时长</span>
  2183. <div style="display:flex;align-items:center;gap:8px;">
  2184. <button class="btn btn-outline-gray btn-sm" onclick="stepNum('fenji-g3-dur',-5)">-</button>
  2185. <input id="fenji-g3-dur" type="number" class="form-input" style="width:70px;text-align:center;" value="60" min="5" step="5">
  2186. <button class="btn btn-outline-gray btn-sm" onclick="stepNum('fenji-g3-dur',5)">+</button>
  2187. <span style="font-size:13px;color:var(--text-secondary);">分钟</span>
  2188. </div>
  2189. </div>
  2190. <div style="display:flex;align-items:flex-start;gap:16px;">
  2191. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:4px;">启用</span>
  2192. <div style="display:flex;flex-direction:column;gap:6px;">
  2193. <label class="toggle"><input type="checkbox" checked><span class="toggle-slider"></span></label>
  2194. <span class="form-hint">开启后,每学年按配置时间自动创建执行该考试,无需重复配置</span>
  2195. </div>
  2196. </div>
  2197. <!-- 防作弊配置 -->
  2198. <div style="border-top:1px solid var(--gray-border);padding-top:16px;margin-top:4px;">
  2199. <div style="font-size:13px;font-weight:600;color:var(--text-secondary);margin-bottom:12px;">防作弊配置 <span style="font-weight:400;color:var(--text-hint);">(防作弊配置仅适用教育考试一体机)</span></div>
  2200. <div style="display:flex;flex-direction:column;gap:12px;">
  2201. <div style="display:flex;align-items:center;gap:12px;">
  2202. <span class="form-label" style="width:100px;flex-shrink:0;">考前人脸校验</span>
  2203. <label class="toggle"><input type="checkbox"><span class="toggle-slider"></span></label>
  2204. <span style="font-size:13px;color:var(--text-secondary);">开启后,考试前需要进行人脸识别校验</span>
  2205. </div>
  2206. <div style="display:flex;align-items:center;gap:12px;">
  2207. <span class="form-label" style="width:100px;flex-shrink:0;">考后人脸校验</span>
  2208. <label class="toggle"><input type="checkbox"><span class="toggle-slider"></span></label>
  2209. <span style="font-size:13px;color:var(--text-secondary);">开启后,考试后需要进行人脸识别校验</span>
  2210. </div>
  2211. <div style="display:flex;align-items:center;gap:12px;">
  2212. <span class="form-label" style="width:100px;flex-shrink:0;">摄像头抓拍</span>
  2213. <label class="toggle"><input type="checkbox"><span class="toggle-slider"></span></label>
  2214. <span style="font-size:13px;color:var(--text-secondary);">开启后,考试过程中摄像头随机抓拍</span>
  2215. </div>
  2216. </div>
  2217. </div>
  2218. </div>
  2219. <div style="margin-top:24px;display:flex;gap:12px;"><button class="btn btn-primary">保存设置</button><button class="btn btn-outline-gray">重置</button></div>
  2220. </div>
  2221. <!-- 考试范围 section -->
  2222. <div id="fenji-g3-sec-scope" class="exam-section" style="display:none;">
  2223. <div class="card-title">考试范围</div>
  2224. <div style="display:flex;align-items:center;gap:20px;margin-bottom:20px;">
  2225. <label style="display:flex;align-items:center;gap:6px;cursor:pointer;font-size:13px;"><input type="radio" name="fenji-g3-scope-type" value="specify" checked onchange="switchScopeTab('fenji-g3','specify')"> 指定范围</label>
  2226. <label style="display:flex;align-items:center;gap:6px;cursor:pointer;font-size:13px;"><input type="radio" name="fenji-g3-scope-type" value="person" onchange="switchScopeTab('fenji-g3','person')"> 指定人员</label>
  2227. </div>
  2228. <div id="fenji-g3-scope-panel-specify">
  2229. <div style="display:flex;flex-direction:column;gap:18px;">
  2230. <div style="display:flex;align-items:flex-start;gap:16px;">
  2231. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:6px;">学院单位</span>
  2232. <div style="flex:1;max-width:600px;">
  2233. <div style="position:relative;margin-bottom:8px;"><input class="form-input" style="padding-left:30px;" placeholder="搜索学院单位..."><span style="position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--text-hint);font-size:13px;">🔍</span></div>
  2234. <div style="display:flex;flex-wrap:wrap;gap:6px;padding:10px;border:1px solid var(--gray-border);border-radius:var(--radius);min-height:44px;background:var(--white);">
  2235. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">生命科学学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  2236. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">化学化工学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  2237. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">物理学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  2238. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">材料科学与工程学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  2239. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">医学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  2240. <span class="tag" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border:1px dashed var(--gray-border);border-radius:20px;cursor:pointer;color:var(--text-hint);">+ 添加学院</span>
  2241. </div>
  2242. <div style="display:flex;align-items:center;gap:12px;margin-top:8px;">
  2243. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;color:var(--text-secondary);"><input type="checkbox" checked style="accent-color:var(--blue);"> 全选</label>
  2244. <span style="font-size:12px;color:var(--text-hint);">已全选所有学院单位</span>
  2245. </div>
  2246. </div>
  2247. </div>
  2248. <!-- 考生类别 -->
  2249. <div style="display:flex;align-items:center;gap:16px;flex-wrap:wrap;">
  2250. <span class="form-label" style="width:80px;flex-shrink:0;">考生类别</span>
  2251. <div style="display:flex;align-items:center;gap:10px;flex-wrap:wrap;">
  2252. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;"><input type="checkbox" checked style="accent-color:var(--blue);"> 新生</label>
  2253. <div style="position:relative;">
  2254. <div class="multiselect-trigger" onclick="toggleMultiselect('fenji-g3-xinsheng-dd')" style="display:flex;align-items:center;gap:6px;padding:5px 10px;border:1px solid var(--gray-border);border-radius:var(--radius);cursor:pointer;font-size:13px;min-width:180px;background:var(--white);"><span id="fenji-g3-xinsheng-label" style="flex:1;color:var(--text-primary);">本科生、研究生</span><span style="color:var(--text-hint);font-size:11px;">▼</span></div>
  2255. <div id="fenji-g3-xinsheng-dd" style="display:none;position:absolute;top:100%;left:0;z-index:100;background:var(--white);border:1px solid var(--gray-border);border-radius:var(--radius);box-shadow:var(--shadow);padding:8px 0;min-width:160px;">
  2256. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" checked onchange="updateMultiselectLabel('fenji-g3-xinsheng-dd','fenji-g3-xinsheng-label')"> 本科生</label>
  2257. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g3-xinsheng-dd','fenji-g3-xinsheng-label')" checked> 研究生</label>
  2258. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g3-xinsheng-dd','fenji-g3-xinsheng-label')"> 博士生</label>
  2259. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g3-xinsheng-dd','fenji-g3-xinsheng-label')"> 教职工</label>
  2260. </div>
  2261. </div>
  2262. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;"><input type="checkbox" style="accent-color:var(--blue);"> 老生</label>
  2263. <div style="position:relative;">
  2264. <div class="multiselect-trigger" onclick="toggleMultiselect('fenji-g3-laosheng-dd')" style="display:flex;align-items:center;gap:6px;padding:5px 10px;border:1px solid var(--gray-border);border-radius:var(--radius);cursor:pointer;font-size:13px;min-width:180px;background:var(--white);"><span id="fenji-g3-laosheng-label" style="flex:1;color:var(--text-hint);">请选择类型</span><span style="color:var(--text-hint);font-size:11px;">▼</span></div>
  2265. <div id="fenji-g3-laosheng-dd" style="display:none;position:absolute;top:100%;left:0;z-index:100;background:var(--white);border:1px solid var(--gray-border);border-radius:var(--radius);box-shadow:var(--shadow);padding:8px 0;min-width:160px;">
  2266. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g3-laosheng-dd','fenji-g3-laosheng-label')"> 本科生</label>
  2267. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g3-laosheng-dd','fenji-g3-laosheng-label')"> 研究生</label>
  2268. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g3-laosheng-dd','fenji-g3-laosheng-label')"> 博士生</label>
  2269. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g3-laosheng-dd','fenji-g3-laosheng-label')"> 教职工</label>
  2270. </div>
  2271. </div>
  2272. </div>
  2273. </div>
  2274. </div>
  2275. </div>
  2276. <div id="fenji-g3-scope-panel-person" style="display:none;">
  2277. <div style="display:flex;flex-direction:column;gap:12px;margin-bottom:12px;">
  2278. <div style="display:flex;align-items:center;gap:12px;flex-wrap:wrap;">
  2279. <span class="form-label" style="width:80px;flex-shrink:0;">学院单位</span>
  2280. <div style="position:relative;display:inline-block;">
  2281. <div class="multiselect-trigger" onclick="toggleMultiselect('fenji-g3-person-college-dd')" style="display:flex;align-items:center;gap:6px;padding:6px 12px;border:1px solid var(--gray-border);border-radius:6px;cursor:pointer;background:var(--white);min-width:180px;">
  2282. <span id="fenji-g3-person-college-label" style="font-size:13px;color:var(--text-hint);flex:1;">请选择学院</span><span style="font-size:11px;color:var(--text-hint);">▾</span>
  2283. </div>
  2284. <div id="fenji-g3-person-college-dd" style="display:none;position:absolute;top:100%;left:0;z-index:100;background:var(--white);border:1px solid var(--gray-border);border-radius:6px;box-shadow:var(--shadow-md);padding:8px;min-width:200px;max-height:220px;overflow-y:auto;">
  2285. <label style="display:flex;align-items:center;gap:6px;padding:4px 6px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="toggleSelectAll(this,'fenji-g3-person-college-dd')"> 全选</label>
  2286. <label style="display:flex;align-items:center;gap:6px;padding:4px 6px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g3-person-college-dd','fenji-g3-person-college-label')"> 生命科学学院</label>
  2287. <label style="display:flex;align-items:center;gap:6px;padding:4px 6px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g3-person-college-dd','fenji-g3-person-college-label')"> 化学化工学院</label>
  2288. <label style="display:flex;align-items:center;gap:6px;padding:4px 6px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g3-person-college-dd','fenji-g3-person-college-label')"> 物理学院</label>
  2289. <label style="display:flex;align-items:center;gap:6px;padding:4px 6px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g3-person-college-dd','fenji-g3-person-college-label')"> 材料科学与工程学院</label>
  2290. <label style="display:flex;align-items:center;gap:6px;padding:4px 6px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g3-person-college-dd','fenji-g3-person-college-label')"> 医学院</label>
  2291. </div>
  2292. </div>
  2293. </div>
  2294. <div style="display:flex;align-items:center;gap:12px;flex-wrap:wrap;">
  2295. <span class="form-label" style="width:80px;flex-shrink:0;">姓名搜索</span>
  2296. <input class="form-input" style="width:180px;" placeholder="请输入姓名">
  2297. <button class="btn btn-outline btn-sm">搜索</button>
  2298. </div>
  2299. </div>
  2300. <div style="display:flex;gap:12px;">
  2301. <div style="flex:1;border:1px solid var(--gray-border);border-radius:6px;overflow:hidden;">
  2302. <div style="padding:8px 12px;background:var(--gray-light);border-bottom:1px solid var(--gray-border);font-size:13px;font-weight:600;">待选人员</div>
  2303. <div style="padding:8px;min-height:120px;font-size:13px;color:var(--text-hint);text-align:center;padding-top:40px;">搜索后显示</div>
  2304. </div>
  2305. <div style="display:flex;flex-direction:column;justify-content:center;gap:8px;">
  2306. <button class="btn btn-outline btn-sm">»</button>
  2307. <button class="btn btn-outline btn-sm">«</button>
  2308. </div>
  2309. <div style="flex:1;border:1px solid var(--gray-border);border-radius:6px;overflow:hidden;">
  2310. <div style="padding:8px 12px;background:var(--gray-light);border-bottom:1px solid var(--gray-border);font-size:13px;font-weight:600;">已选人员</div>
  2311. <div style="padding:8px;min-height:120px;"></div>
  2312. </div>
  2313. </div>
  2314. </div>
  2315. <div style="margin-top:24px;display:flex;gap:12px;"><button class="btn btn-primary">保存设置</button><button class="btn btn-outline-gray">重置</button></div>
  2316. </div>
  2317. <!-- 试卷配置 section -->
  2318. <div id="fenji-g3-sec-paper" class="exam-section" style="display:none;">
  2319. <div class="card-title">试卷配置</div>
  2320. <div style="border:1px solid var(--gray-border);border-radius:var(--radius);overflow:hidden;">
  2321. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:10px 16px;background:var(--blue-xlight);border-bottom:1px solid var(--gray-border);font-size:13px;font-weight:600;color:var(--text-secondary);">
  2322. <span>学院单位</span><span>试卷</span><span></span>
  2323. </div>
  2324. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;background:var(--blue-light);border-bottom:1px solid var(--gray-border);">
  2325. <span style="font-size:13px;font-weight:600;color:var(--blue);">全校(默认)</span>
  2326. <span style="font-size:12px;color:var(--text-hint);">实验室安全综合试卷(2026)</span>
  2327. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">更换试卷</button>
  2328. </div>
  2329. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;border-bottom:1px solid var(--gray-border);">
  2330. <span style="font-size:13px;color:var(--text-primary);">生命科学学院</span>
  2331. <span style="font-size:12px;color:var(--text-hint);">继承默认试卷</span>
  2332. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">指定试卷</button>
  2333. </div>
  2334. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;border-bottom:1px solid var(--gray-border);">
  2335. <span style="font-size:13px;color:var(--text-primary);">化学化工学院</span>
  2336. <span style="font-size:12px;color:var(--text-hint);">继承默认试卷</span>
  2337. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">指定试卷</button>
  2338. </div>
  2339. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;">
  2340. <span style="font-size:13px;color:var(--text-primary);">物理学院</span>
  2341. <span style="font-size:12px;color:var(--text-hint);">继承默认试卷</span>
  2342. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">指定试卷</button>
  2343. </div>
  2344. </div>
  2345. <div style="margin-top:24px;display:flex;gap:12px;"><button class="btn btn-primary">保存设置</button><button class="btn btn-outline-gray">重置</button></div>
  2346. </div>
  2347. <!-- 考前配置 section -->
  2348. <div id="fenji-g3-sec-preexam" class="exam-section" style="display:none;">
  2349. <div class="card-title">考前配置</div>
  2350. <div style="display:flex;flex-direction:column;gap:20px;">
  2351. <div style="display:flex;align-items:flex-start;gap:12px;">
  2352. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:4px;">学时要求</span>
  2353. <div style="background:#f4f6fa;border:1px solid #dde3ed;border-radius:6px;padding:12px 16px;font-size:13px;">
  2354. <div style="color:#8896a7;margin-bottom:10px;display:flex;align-items:center;gap:6px;"><span>ℹ️</span>根据考生绑定实验室的分级匹配年度学时要求,当前等级:<span style="font-weight:600;color:#1857d4;">Ⅲ级(中风险)</span></div>
  2355. <div style="display:grid;grid-template-columns:1fr 1fr;gap:10px;max-width:360px;">
  2356. <div style="background:#fff;border:1px solid #dde3ed;border-radius:6px;padding:12px 16px;text-align:center;">
  2357. <div style="font-size:11px;color:#8896a7;margin-bottom:4px;">准入学时</div>
  2358. <div style="font-size:24px;font-weight:700;color:#1857d4;">8</div>
  2359. <div style="font-size:12px;color:#8896a7;">学时</div>
  2360. </div>
  2361. <div style="background:#fff;border:1px solid #dde3ed;border-radius:6px;padding:12px 16px;text-align:center;">
  2362. <div style="font-size:11px;color:#8896a7;margin-bottom:4px;">第二年起年度学时</div>
  2363. <div style="font-size:24px;font-weight:700;color:#1857d4;">2</div>
  2364. <div style="font-size:12px;color:#8896a7;">学时</div>
  2365. </div>
  2366. </div>
  2367. </div>
  2368. </div>
  2369. <div style="display:flex;align-items:flex-start;gap:12px;">
  2370. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:4px;">考前学习</span>
  2371. <div style="display:flex;flex-direction:column;gap:8px;">
  2372. <label class="toggle"><input type="checkbox" onchange="this.parentElement.nextElementSibling.style.display=this.checked?'flex':'none'"><span class="toggle-slider"></span></label>
  2373. <div style="display:none;align-items:center;gap:8px;"><button class="btn btn-outline btn-sm">选择课程</button><span class="form-hint">只可选择一门课程</span></div>
  2374. </div>
  2375. </div>
  2376. <div style="display:flex;align-items:flex-start;gap:12px;">
  2377. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:4px;">模拟考试</span>
  2378. <div style="display:flex;flex-direction:column;gap:10px;">
  2379. <label class="toggle"><input type="checkbox" onchange="this.parentElement.nextElementSibling.style.display=this.checked?'block':'none'"><span class="toggle-slider"></span></label>
  2380. <div style="display:none;">
  2381. <div style="display:flex;gap:16px;margin-bottom:10px;">
  2382. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;"><input type="radio" name="fenji-g3-mock-mode" value="reuse" checked> 复用试卷</label>
  2383. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;"><input type="radio" name="fenji-g3-mock-mode" value="choose"> 选择试卷</label>
  2384. </div>
  2385. <div style="display:flex;align-items:center;gap:8px;"><span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;">复用正式考试试卷<span style="cursor:pointer;margin-left:2px;">×</span></span></div>
  2386. </div>
  2387. </div>
  2388. </div>
  2389. <div style="display:flex;align-items:flex-start;gap:12px;">
  2390. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:4px;">考试承诺书</span>
  2391. <div style="display:flex;flex-direction:column;gap:8px;flex:1;">
  2392. <label class="toggle"><input type="checkbox" onchange="this.parentElement.nextElementSibling.style.display=this.checked?'block':'none'"><span class="toggle-slider"></span></label>
  2393. <div style="display:none;">
  2394. <div class="rich-editor"><div class="rich-toolbar"><button class="rich-tool-btn">B</button><button class="rich-tool-btn">I</button><button class="rich-tool-btn">U</button><button class="rich-tool-btn">≡</button><button class="rich-tool-btn">链接</button><button class="rich-tool-btn">图片</button></div><div class="rich-body" contenteditable="true"><p><strong>实验室安全承诺书</strong></p><p>本人郑重承诺:在参加实验室安全考试及日常实验操作过程中,严格遵守实验室各项安全规章制度,认真执行安全操作规程,不擅自使用不熟悉的仪器设备,不私自改装或违规操作实验装置。发现安全隐患及时上报,如实反映实验情况,对违规行为承担相应法律及校规责任。</p></div></div>
  2395. <label style="display:flex;align-items:center;gap:6px;margin-top:10px;cursor:pointer;font-size:13px;color:var(--text-secondary);"><input type="checkbox" style="accent-color:var(--blue);"> 支持考生打印承诺书</label>
  2396. </div>
  2397. </div>
  2398. </div>
  2399. </div>
  2400. <div style="margin-top:24px;display:flex;gap:12px;"><button class="btn btn-primary">保存设置</button><button class="btn btn-outline-gray">重置</button></div>
  2401. </div>
  2402. <!-- 获得证书 section -->
  2403. <div id="fenji-g3-sec-cert" class="exam-section" style="display:none;">
  2404. <div class="card-title">获得证书</div>
  2405. <div style="display:flex;flex-direction:column;gap:16px;">
  2406. <div style="display:flex;align-items:center;gap:12px;">
  2407. <span class="form-label" style="width:80px;flex-shrink:0;">颁发证书</span>
  2408. <label class="toggle"><input type="checkbox" onchange="document.getElementById('fenji-g3-cert-detail').style.display=this.checked?'block':'none'"><span class="toggle-slider"></span></label>
  2409. </div>
  2410. <div id="fenji-g3-cert-detail" style="display:none;">
  2411. <div style="display:flex;align-items:flex-start;gap:12px;">
  2412. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:6px;">证书模板</span>
  2413. <div style="display:flex;flex-direction:column;gap:12px;">
  2414. <select class="form-input form-select" style="width:240px;" onchange="previewCert(this,'fenji-g3-cert-preview','fenji-g3-cert-preview-name','fenji-g3-cert-img-wrap')">
  2415. <option value="">请选择证书模板</option>
  2416. <option value="standard">实验室安全教育证书(标准版)</option>
  2417. <option value="elite">实验室安全教育证书(精英版)</option>
  2418. </select>
  2419. <div id="fenji-g3-cert-preview" style="display:none;border:1px solid var(--gray-border);border-radius:var(--radius);overflow:hidden;width:360px;background:var(--gray-light);">
  2420. <div style="padding:6px 10px;background:var(--blue-light);border-bottom:1px solid var(--gray-border);font-size:12px;color:var(--blue);display:flex;justify-content:space-between;align-items:center;"><span id="fenji-g3-cert-preview-name"></span><span style="cursor:pointer;color:var(--text-hint);" onclick="this.closest('[id$=-cert-preview]').previousElementSibling.value='';this.closest('[id$=-cert-preview]').style.display='none'">×</span></div>
  2421. <div style="padding:24px;display:flex;align-items:center;justify-content:center;min-height:200px;"><div id="fenji-g3-cert-img-wrap"></div></div>
  2422. </div>
  2423. </div>
  2424. </div>
  2425. </div>
  2426. </div>
  2427. <div style="margin-top:24px;display:flex;gap:12px;"><button class="btn btn-primary">保存设置</button><button class="btn btn-outline-gray">重置</button></div>
  2428. </div>
  2429. </div>
  2430. </div><!-- /fenji-grade-g3 -->
  2431. <div id="fenji-grade-g4" class="fenji-grade-panel" style="display:none;gap:0;background:var(--white);border:1px solid var(--gray-border);border-radius:0 0 var(--radius) var(--radius);box-shadow:var(--shadow);overflow:hidden;flex-direction:row;">
  2432. <div style="width:180px;flex-shrink:0;border-right:1px solid var(--gray-border);background:var(--gray-light);padding:14px 0;">
  2433. <div class="nav-item active" id="fenji-g4-nav-basic" onclick="switchExamSection('fenji-g4','basic')">基本配置</div>
  2434. <div class="nav-item" id="fenji-g4-nav-scope" onclick="switchExamSection('fenji-g4','scope')">考试范围</div>
  2435. <div class="nav-item" id="fenji-g4-nav-paper" onclick="switchExamSection('fenji-g4','paper')">试卷配置</div>
  2436. <div class="nav-item" id="fenji-g4-nav-preexam" onclick="switchExamSection('fenji-g4','preexam')">考前配置</div>
  2437. <div class="nav-item" id="fenji-g4-nav-cert" onclick="switchExamSection('fenji-g4','cert')">获得证书</div>
  2438. </div>
  2439. <div style="flex:1;padding:28px;overflow-y:auto;max-height:calc(100vh - var(--header-h) - 240px);">
  2440. <!-- 基本配置 section -->
  2441. <div id="fenji-g4-sec-basic" class="exam-section">
  2442. <div class="card-title">基本配置</div>
  2443. <div style="display:flex;flex-direction:column;gap:16px;">
  2444. <div style="display:flex;align-items:center;gap:16px;"><span class="form-label" style="width:80px;flex-shrink:0;">考试类型</span><input class="form-input" style="width:200px;" value="Ⅳ级(低风险)" disabled></div>
  2445. <div style="display:flex;align-items:center;gap:16px;"><span class="form-label" style="width:80px;flex-shrink:0;">考试名称</span><input class="form-input" style="width:300px;" placeholder="请输入考试名称"></div>
  2446. <div style="display:flex;align-items:center;gap:16px;">
  2447. <span class="form-label" style="width:80px;flex-shrink:0;">可考次数</span>
  2448. <div style="display:flex;align-items:center;gap:8px;">
  2449. <button class="btn btn-outline-gray btn-sm" onclick="stepNum('fenji-g4-ans',-1)">-</button>
  2450. <input id="fenji-g4-ans" type="number" class="form-input" style="width:60px;text-align:center;" value="2" min="1">
  2451. <button class="btn btn-outline-gray btn-sm" onclick="stepNum('fenji-g4-ans',1)">+</button>
  2452. </div>
  2453. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;margin-left:8px;"><input type="radio" name="fenji-g4-ans-mode" value="limit" checked> 限制次数</label>
  2454. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;"><input type="radio" name="fenji-g4-ans-mode" value="unlimited"> 无限制</label>
  2455. </div>
  2456. <div style="display:flex;align-items:center;gap:16px;">
  2457. <span class="form-label" style="width:80px;flex-shrink:0;">考试时间</span>
  2458. <input type="datetime-local" class="form-input" style="width:190px;" step="1"><span style="color:var(--text-hint);font-size:13px;margin:0 4px;">至</span><input type="datetime-local" class="form-input" style="width:190px;" step="1">
  2459. </div>
  2460. <div style="display:flex;align-items:center;gap:16px;">
  2461. <span class="form-label" style="width:80px;flex-shrink:0;">考试时长</span>
  2462. <div style="display:flex;align-items:center;gap:8px;">
  2463. <button class="btn btn-outline-gray btn-sm" onclick="stepNum('fenji-g4-dur',-5)">-</button>
  2464. <input id="fenji-g4-dur" type="number" class="form-input" style="width:70px;text-align:center;" value="60" min="5" step="5">
  2465. <button class="btn btn-outline-gray btn-sm" onclick="stepNum('fenji-g4-dur',5)">+</button>
  2466. <span style="font-size:13px;color:var(--text-secondary);">分钟</span>
  2467. </div>
  2468. </div>
  2469. <div style="display:flex;align-items:flex-start;gap:16px;">
  2470. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:4px;">启用</span>
  2471. <div style="display:flex;flex-direction:column;gap:6px;">
  2472. <label class="toggle"><input type="checkbox" checked><span class="toggle-slider"></span></label>
  2473. <span class="form-hint">开启后,每学年按配置时间自动创建执行该考试,无需重复配置</span>
  2474. </div>
  2475. </div>
  2476. <!-- 防作弊配置 -->
  2477. <div style="border-top:1px solid var(--gray-border);padding-top:16px;margin-top:4px;">
  2478. <div style="font-size:13px;font-weight:600;color:var(--text-secondary);margin-bottom:12px;">防作弊配置 <span style="font-weight:400;color:var(--text-hint);">(防作弊配置仅适用教育考试一体机)</span></div>
  2479. <div style="display:flex;flex-direction:column;gap:12px;">
  2480. <div style="display:flex;align-items:center;gap:12px;">
  2481. <span class="form-label" style="width:100px;flex-shrink:0;">考前人脸校验</span>
  2482. <label class="toggle"><input type="checkbox"><span class="toggle-slider"></span></label>
  2483. <span style="font-size:13px;color:var(--text-secondary);">开启后,考试前需要进行人脸识别校验</span>
  2484. </div>
  2485. <div style="display:flex;align-items:center;gap:12px;">
  2486. <span class="form-label" style="width:100px;flex-shrink:0;">考后人脸校验</span>
  2487. <label class="toggle"><input type="checkbox"><span class="toggle-slider"></span></label>
  2488. <span style="font-size:13px;color:var(--text-secondary);">开启后,考试后需要进行人脸识别校验</span>
  2489. </div>
  2490. <div style="display:flex;align-items:center;gap:12px;">
  2491. <span class="form-label" style="width:100px;flex-shrink:0;">摄像头抓拍</span>
  2492. <label class="toggle"><input type="checkbox"><span class="toggle-slider"></span></label>
  2493. <span style="font-size:13px;color:var(--text-secondary);">开启后,考试过程中摄像头随机抓拍</span>
  2494. </div>
  2495. </div>
  2496. </div>
  2497. </div>
  2498. <div style="margin-top:24px;display:flex;gap:12px;"><button class="btn btn-primary">保存设置</button><button class="btn btn-outline-gray">重置</button></div>
  2499. </div>
  2500. <!-- 考试范围 section -->
  2501. <div id="fenji-g4-sec-scope" class="exam-section" style="display:none;">
  2502. <div class="card-title">考试范围</div>
  2503. <div style="display:flex;align-items:center;gap:20px;margin-bottom:20px;">
  2504. <label style="display:flex;align-items:center;gap:6px;cursor:pointer;font-size:13px;"><input type="radio" name="fenji-g4-scope-type" value="specify" checked onchange="switchScopeTab('fenji-g4','specify')"> 指定范围</label>
  2505. <label style="display:flex;align-items:center;gap:6px;cursor:pointer;font-size:13px;"><input type="radio" name="fenji-g4-scope-type" value="person" onchange="switchScopeTab('fenji-g4','person')"> 指定人员</label>
  2506. </div>
  2507. <div id="fenji-g4-scope-panel-specify">
  2508. <div style="display:flex;flex-direction:column;gap:18px;">
  2509. <div style="display:flex;align-items:flex-start;gap:16px;">
  2510. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:6px;">学院单位</span>
  2511. <div style="flex:1;max-width:600px;">
  2512. <div style="position:relative;margin-bottom:8px;"><input class="form-input" style="padding-left:30px;" placeholder="搜索学院单位..."><span style="position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--text-hint);font-size:13px;">🔍</span></div>
  2513. <div style="display:flex;flex-wrap:wrap;gap:6px;padding:10px;border:1px solid var(--gray-border);border-radius:var(--radius);min-height:44px;background:var(--white);">
  2514. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">生命科学学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  2515. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">化学化工学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  2516. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">物理学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  2517. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">材料科学与工程学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  2518. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">医学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  2519. <span class="tag" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border:1px dashed var(--gray-border);border-radius:20px;cursor:pointer;color:var(--text-hint);">+ 添加学院</span>
  2520. </div>
  2521. <div style="display:flex;align-items:center;gap:12px;margin-top:8px;">
  2522. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;color:var(--text-secondary);"><input type="checkbox" checked style="accent-color:var(--blue);"> 全选</label>
  2523. <span style="font-size:12px;color:var(--text-hint);">已全选所有学院单位</span>
  2524. </div>
  2525. </div>
  2526. </div>
  2527. <!-- 考生类别 -->
  2528. <div style="display:flex;align-items:center;gap:16px;flex-wrap:wrap;">
  2529. <span class="form-label" style="width:80px;flex-shrink:0;">考生类别</span>
  2530. <div style="display:flex;align-items:center;gap:10px;flex-wrap:wrap;">
  2531. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;"><input type="checkbox" checked style="accent-color:var(--blue);"> 新生</label>
  2532. <div style="position:relative;">
  2533. <div class="multiselect-trigger" onclick="toggleMultiselect('fenji-g4-xinsheng-dd')" style="display:flex;align-items:center;gap:6px;padding:5px 10px;border:1px solid var(--gray-border);border-radius:var(--radius);cursor:pointer;font-size:13px;min-width:180px;background:var(--white);"><span id="fenji-g4-xinsheng-label" style="flex:1;color:var(--text-primary);">本科生、研究生</span><span style="color:var(--text-hint);font-size:11px;">▼</span></div>
  2534. <div id="fenji-g4-xinsheng-dd" style="display:none;position:absolute;top:100%;left:0;z-index:100;background:var(--white);border:1px solid var(--gray-border);border-radius:var(--radius);box-shadow:var(--shadow);padding:8px 0;min-width:160px;">
  2535. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" checked onchange="updateMultiselectLabel('fenji-g4-xinsheng-dd','fenji-g4-xinsheng-label')"> 本科生</label>
  2536. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g4-xinsheng-dd','fenji-g4-xinsheng-label')" checked> 研究生</label>
  2537. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g4-xinsheng-dd','fenji-g4-xinsheng-label')"> 博士生</label>
  2538. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g4-xinsheng-dd','fenji-g4-xinsheng-label')"> 教职工</label>
  2539. </div>
  2540. </div>
  2541. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;"><input type="checkbox" style="accent-color:var(--blue);"> 老生</label>
  2542. <div style="position:relative;">
  2543. <div class="multiselect-trigger" onclick="toggleMultiselect('fenji-g4-laosheng-dd')" style="display:flex;align-items:center;gap:6px;padding:5px 10px;border:1px solid var(--gray-border);border-radius:var(--radius);cursor:pointer;font-size:13px;min-width:180px;background:var(--white);"><span id="fenji-g4-laosheng-label" style="flex:1;color:var(--text-hint);">请选择类型</span><span style="color:var(--text-hint);font-size:11px;">▼</span></div>
  2544. <div id="fenji-g4-laosheng-dd" style="display:none;position:absolute;top:100%;left:0;z-index:100;background:var(--white);border:1px solid var(--gray-border);border-radius:var(--radius);box-shadow:var(--shadow);padding:8px 0;min-width:160px;">
  2545. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g4-laosheng-dd','fenji-g4-laosheng-label')"> 本科生</label>
  2546. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g4-laosheng-dd','fenji-g4-laosheng-label')"> 研究生</label>
  2547. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g4-laosheng-dd','fenji-g4-laosheng-label')"> 博士生</label>
  2548. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g4-laosheng-dd','fenji-g4-laosheng-label')"> 教职工</label>
  2549. </div>
  2550. </div>
  2551. </div>
  2552. </div>
  2553. </div>
  2554. </div>
  2555. <div id="fenji-g4-scope-panel-person" style="display:none;">
  2556. <div style="display:flex;flex-direction:column;gap:12px;margin-bottom:12px;">
  2557. <div style="display:flex;align-items:center;gap:12px;flex-wrap:wrap;">
  2558. <span class="form-label" style="width:80px;flex-shrink:0;">学院单位</span>
  2559. <div style="position:relative;display:inline-block;">
  2560. <div class="multiselect-trigger" onclick="toggleMultiselect('fenji-g4-person-college-dd')" style="display:flex;align-items:center;gap:6px;padding:6px 12px;border:1px solid var(--gray-border);border-radius:6px;cursor:pointer;background:var(--white);min-width:180px;">
  2561. <span id="fenji-g4-person-college-label" style="font-size:13px;color:var(--text-hint);flex:1;">请选择学院</span><span style="font-size:11px;color:var(--text-hint);">▾</span>
  2562. </div>
  2563. <div id="fenji-g4-person-college-dd" style="display:none;position:absolute;top:100%;left:0;z-index:100;background:var(--white);border:1px solid var(--gray-border);border-radius:6px;box-shadow:var(--shadow-md);padding:8px;min-width:200px;max-height:220px;overflow-y:auto;">
  2564. <label style="display:flex;align-items:center;gap:6px;padding:4px 6px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="toggleSelectAll(this,'fenji-g4-person-college-dd')"> 全选</label>
  2565. <label style="display:flex;align-items:center;gap:6px;padding:4px 6px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g4-person-college-dd','fenji-g4-person-college-label')"> 生命科学学院</label>
  2566. <label style="display:flex;align-items:center;gap:6px;padding:4px 6px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g4-person-college-dd','fenji-g4-person-college-label')"> 化学化工学院</label>
  2567. <label style="display:flex;align-items:center;gap:6px;padding:4px 6px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g4-person-college-dd','fenji-g4-person-college-label')"> 物理学院</label>
  2568. <label style="display:flex;align-items:center;gap:6px;padding:4px 6px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g4-person-college-dd','fenji-g4-person-college-label')"> 材料科学与工程学院</label>
  2569. <label style="display:flex;align-items:center;gap:6px;padding:4px 6px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('fenji-g4-person-college-dd','fenji-g4-person-college-label')"> 医学院</label>
  2570. </div>
  2571. </div>
  2572. </div>
  2573. <div style="display:flex;align-items:center;gap:12px;flex-wrap:wrap;">
  2574. <span class="form-label" style="width:80px;flex-shrink:0;">姓名搜索</span>
  2575. <input class="form-input" style="width:180px;" placeholder="请输入姓名">
  2576. <button class="btn btn-outline btn-sm">搜索</button>
  2577. </div>
  2578. </div>
  2579. <div style="display:flex;gap:12px;">
  2580. <div style="flex:1;border:1px solid var(--gray-border);border-radius:6px;overflow:hidden;">
  2581. <div style="padding:8px 12px;background:var(--gray-light);border-bottom:1px solid var(--gray-border);font-size:13px;font-weight:600;">待选人员</div>
  2582. <div style="padding:8px;min-height:120px;font-size:13px;color:var(--text-hint);text-align:center;padding-top:40px;">搜索后显示</div>
  2583. </div>
  2584. <div style="display:flex;flex-direction:column;justify-content:center;gap:8px;">
  2585. <button class="btn btn-outline btn-sm">»</button>
  2586. <button class="btn btn-outline btn-sm">«</button>
  2587. </div>
  2588. <div style="flex:1;border:1px solid var(--gray-border);border-radius:6px;overflow:hidden;">
  2589. <div style="padding:8px 12px;background:var(--gray-light);border-bottom:1px solid var(--gray-border);font-size:13px;font-weight:600;">已选人员</div>
  2590. <div style="padding:8px;min-height:120px;"></div>
  2591. </div>
  2592. </div>
  2593. </div>
  2594. <div style="margin-top:24px;display:flex;gap:12px;"><button class="btn btn-primary">保存设置</button><button class="btn btn-outline-gray">重置</button></div>
  2595. </div>
  2596. <!-- 试卷配置 section -->
  2597. <div id="fenji-g4-sec-paper" class="exam-section" style="display:none;">
  2598. <div class="card-title">试卷配置</div>
  2599. <div style="border:1px solid var(--gray-border);border-radius:var(--radius);overflow:hidden;">
  2600. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:10px 16px;background:var(--blue-xlight);border-bottom:1px solid var(--gray-border);font-size:13px;font-weight:600;color:var(--text-secondary);">
  2601. <span>学院单位</span><span>试卷</span><span></span>
  2602. </div>
  2603. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;background:var(--blue-light);border-bottom:1px solid var(--gray-border);">
  2604. <span style="font-size:13px;font-weight:600;color:var(--blue);">全校(默认)</span>
  2605. <span style="font-size:12px;color:var(--text-hint);">实验室安全综合试卷(2026)</span>
  2606. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">更换试卷</button>
  2607. </div>
  2608. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;border-bottom:1px solid var(--gray-border);">
  2609. <span style="font-size:13px;color:var(--text-primary);">生命科学学院</span>
  2610. <span style="font-size:12px;color:var(--text-hint);">继承默认试卷</span>
  2611. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">指定试卷</button>
  2612. </div>
  2613. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;border-bottom:1px solid var(--gray-border);">
  2614. <span style="font-size:13px;color:var(--text-primary);">化学化工学院</span>
  2615. <span style="font-size:12px;color:var(--text-hint);">继承默认试卷</span>
  2616. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">指定试卷</button>
  2617. </div>
  2618. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;">
  2619. <span style="font-size:13px;color:var(--text-primary);">物理学院</span>
  2620. <span style="font-size:12px;color:var(--text-hint);">继承默认试卷</span>
  2621. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">指定试卷</button>
  2622. </div>
  2623. </div>
  2624. <div style="margin-top:24px;display:flex;gap:12px;"><button class="btn btn-primary">保存设置</button><button class="btn btn-outline-gray">重置</button></div>
  2625. </div>
  2626. <!-- 考前配置 section -->
  2627. <div id="fenji-g4-sec-preexam" class="exam-section" style="display:none;">
  2628. <div class="card-title">考前配置</div>
  2629. <div style="display:flex;flex-direction:column;gap:20px;">
  2630. <div style="display:flex;align-items:flex-start;gap:12px;">
  2631. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:4px;">学时要求</span>
  2632. <div style="background:#f4f6fa;border:1px solid #dde3ed;border-radius:6px;padding:12px 16px;font-size:13px;">
  2633. <div style="color:#8896a7;margin-bottom:10px;display:flex;align-items:center;gap:6px;"><span>ℹ️</span>根据考生绑定实验室的分级匹配年度学时要求,当前等级:<span style="font-weight:600;color:#10a37f;">Ⅳ级(低风险)</span></div>
  2634. <div style="display:grid;grid-template-columns:1fr 1fr;gap:10px;max-width:360px;">
  2635. <div style="background:#fff;border:1px solid #dde3ed;border-radius:6px;padding:12px 16px;text-align:center;">
  2636. <div style="font-size:11px;color:#8896a7;margin-bottom:4px;">准入学时</div>
  2637. <div style="font-size:24px;font-weight:700;color:#1857d4;">4</div>
  2638. <div style="font-size:12px;color:#8896a7;">学时</div>
  2639. </div>
  2640. <div style="background:#fff;border:1px solid #dde3ed;border-radius:6px;padding:12px 16px;text-align:center;">
  2641. <div style="font-size:11px;color:#8896a7;margin-bottom:4px;">第二年起年度学时</div>
  2642. <div style="font-size:24px;font-weight:700;color:#8896a7;">0</div>
  2643. <div style="font-size:12px;color:#8896a7;">学时</div>
  2644. </div>
  2645. </div>
  2646. </div>
  2647. </div>
  2648. <div style="display:flex;align-items:flex-start;gap:12px;">
  2649. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:4px;">考前学习</span>
  2650. </div>
  2651. <div style="display:flex;align-items:flex-start;gap:12px;">
  2652. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:4px;">考前学习</span>
  2653. <div style="display:flex;flex-direction:column;gap:8px;">
  2654. <label class="toggle"><input type="checkbox" onchange="this.parentElement.nextElementSibling.style.display=this.checked?'flex':'none'"><span class="toggle-slider"></span></label>
  2655. <div style="display:none;align-items:center;gap:8px;"><button class="btn btn-outline btn-sm">选择课程</button><span class="form-hint">只可选择一门课程</span></div>
  2656. </div>
  2657. </div>
  2658. <div style="display:flex;align-items:flex-start;gap:12px;">
  2659. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:4px;">模拟考试</span>
  2660. <div style="display:flex;flex-direction:column;gap:10px;">
  2661. <label class="toggle"><input type="checkbox" onchange="this.parentElement.nextElementSibling.style.display=this.checked?'block':'none'"><span class="toggle-slider"></span></label>
  2662. <div style="display:none;">
  2663. <div style="display:flex;gap:16px;margin-bottom:10px;">
  2664. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;"><input type="radio" name="fenji-g4-mock-mode" value="reuse" checked> 复用试卷</label>
  2665. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;"><input type="radio" name="fenji-g4-mock-mode" value="choose"> 选择试卷</label>
  2666. </div>
  2667. <div style="display:flex;align-items:center;gap:8px;"><span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;">复用正式考试试卷<span style="cursor:pointer;margin-left:2px;">×</span></span></div>
  2668. </div>
  2669. </div>
  2670. </div>
  2671. <div style="display:flex;align-items:flex-start;gap:12px;">
  2672. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:4px;">考试承诺书</span>
  2673. <div style="display:flex;flex-direction:column;gap:8px;flex:1;">
  2674. <label class="toggle"><input type="checkbox" onchange="this.parentElement.nextElementSibling.style.display=this.checked?'block':'none'"><span class="toggle-slider"></span></label>
  2675. <div style="display:none;">
  2676. <div class="rich-editor"><div class="rich-toolbar"><button class="rich-tool-btn">B</button><button class="rich-tool-btn">I</button><button class="rich-tool-btn">U</button><button class="rich-tool-btn">≡</button><button class="rich-tool-btn">链接</button><button class="rich-tool-btn">图片</button></div><div class="rich-body" contenteditable="true"><p><strong>实验室安全承诺书</strong></p><p>本人郑重承诺:在参加实验室安全考试及日常实验操作过程中,严格遵守实验室各项安全规章制度,认真执行安全操作规程,不擅自使用不熟悉的仪器设备,不私自改装或违规操作实验装置。发现安全隐患及时上报,如实反映实验情况,对违规行为承担相应法律及校规责任。</p></div></div>
  2677. <label style="display:flex;align-items:center;gap:6px;margin-top:10px;cursor:pointer;font-size:13px;color:var(--text-secondary);"><input type="checkbox" style="accent-color:var(--blue);"> 支持考生打印承诺书</label>
  2678. </div>
  2679. </div>
  2680. </div>
  2681. </div>
  2682. <div style="margin-top:24px;display:flex;gap:12px;"><button class="btn btn-primary">保存设置</button><button class="btn btn-outline-gray">重置</button></div>
  2683. </div>
  2684. <!-- 获得证书 section -->
  2685. <div id="fenji-g4-sec-cert" class="exam-section" style="display:none;">
  2686. <div class="card-title">获得证书</div>
  2687. <div style="display:flex;flex-direction:column;gap:16px;">
  2688. <div style="display:flex;align-items:center;gap:12px;">
  2689. <span class="form-label" style="width:80px;flex-shrink:0;">颁发证书</span>
  2690. <label class="toggle"><input type="checkbox" onchange="document.getElementById('fenji-g4-cert-detail').style.display=this.checked?'block':'none'"><span class="toggle-slider"></span></label>
  2691. </div>
  2692. <div id="fenji-g4-cert-detail" style="display:none;">
  2693. <div style="display:flex;align-items:flex-start;gap:12px;">
  2694. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:6px;">证书模板</span>
  2695. <div style="display:flex;flex-direction:column;gap:12px;">
  2696. <select class="form-input form-select" style="width:240px;" onchange="previewCert(this,'fenji-g4-cert-preview','fenji-g4-cert-preview-name','fenji-g4-cert-img-wrap')">
  2697. <option value="">请选择证书模板</option>
  2698. <option value="standard">实验室安全教育证书(标准版)</option>
  2699. <option value="elite">实验室安全教育证书(精英版)</option>
  2700. </select>
  2701. <div id="fenji-g4-cert-preview" style="display:none;border:1px solid var(--gray-border);border-radius:var(--radius);overflow:hidden;width:360px;background:var(--gray-light);">
  2702. <div style="padding:6px 10px;background:var(--blue-light);border-bottom:1px solid var(--gray-border);font-size:12px;color:var(--blue);display:flex;justify-content:space-between;align-items:center;"><span id="fenji-g4-cert-preview-name"></span><span style="cursor:pointer;color:var(--text-hint);" onclick="this.closest('[id$=-cert-preview]').previousElementSibling.value='';this.closest('[id$=-cert-preview]').style.display='none'">×</span></div>
  2703. <div style="padding:24px;display:flex;align-items:center;justify-content:center;min-height:200px;"><div id="fenji-g4-cert-img-wrap"></div></div>
  2704. </div>
  2705. </div>
  2706. </div>
  2707. </div>
  2708. </div>
  2709. <div style="margin-top:24px;display:flex;gap:12px;"><button class="btn btn-primary">保存设置</button><button class="btn btn-outline-gray">重置</button></div>
  2710. </div>
  2711. </div>
  2712. </div><!-- /fenji-grade-g4 -->
  2713. </div><!-- /exam-tab-fenji -->
  2714. <!-- ══════════════════════════════════════════════════════════
  2715. TAB 3: 应知应会
  2716. ══════════════════════════════════════════════════════════ -->
  2717. <div id="exam-tab-yingzhi" class="exam-tab-panel" style="display:none;gap:0;background:var(--white);border:1px solid var(--gray-border);border-radius:var(--radius);box-shadow:var(--shadow);overflow:hidden;flex-direction:row;">
  2718. <!-- Left sidebar nav -->
  2719. <div style="width:180px;flex-shrink:0;border-right:1px solid var(--gray-border);background:var(--gray-light);padding:14px 0;">
  2720. <div class="nav-item active" id="yingzhi-nav-basic" onclick="switchExamSection('yingzhi','basic')">基本配置</div>
  2721. <div class="nav-item" id="yingzhi-nav-scope" onclick="switchExamSection('yingzhi','scope')">考试范围</div>
  2722. <div class="nav-item" id="yingzhi-nav-paper" onclick="switchExamSection('yingzhi','paper')">试卷配置</div>
  2723. <div class="nav-item" id="yingzhi-nav-preexam" onclick="switchExamSection('yingzhi','preexam')">考前配置</div>
  2724. <div class="nav-item" id="yingzhi-nav-cert" onclick="switchExamSection('yingzhi','cert')">获得证书</div>
  2725. </div>
  2726. <!-- Right content area -->
  2727. <div style="flex:1;padding:28px;overflow-y:auto;max-height:calc(100vh - var(--header-h) - 196px);">
  2728. <!-- 基本设置 section -->
  2729. <div id="yingzhi-sec-basic" class="exam-section">
  2730. <div class="card-title">基本配置</div>
  2731. <div style="display:flex;flex-direction:column;gap:16px;">
  2732. <div style="display:flex;align-items:center;gap:16px;">
  2733. <span class="form-label" style="width:80px;flex-shrink:0;">考试类型</span>
  2734. <input class="form-input" style="width:200px;" value="应知应会" disabled>
  2735. <span class="form-hint">系统内置,不可更改</span>
  2736. </div>
  2737. <div style="display:flex;align-items:center;gap:16px;">
  2738. <span class="form-label" style="width:80px;flex-shrink:0;">考试名称</span>
  2739. <input class="form-input" style="width:300px;" placeholder="请输入考试名称">
  2740. </div>
  2741. <div style="display:flex;align-items:center;gap:16px;">
  2742. <span class="form-label" style="width:80px;flex-shrink:0;">可考次数</span>
  2743. <div style="display:flex;align-items:center;gap:8px;">
  2744. <button class="btn btn-outline-gray btn-sm" onclick="stepNum('yingzhi-answer-cnt',-1)">-</button>
  2745. <input id="yingzhi-answer-cnt" type="number" class="form-input" style="width:60px;text-align:center;" value="2" min="1">
  2746. <button class="btn btn-outline-gray btn-sm" onclick="stepNum('yingzhi-answer-cnt',1)">+</button>
  2747. </div>
  2748. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;margin-left:8px;">
  2749. <input type="radio" name="yingzhi-answer-mode" value="limit" checked> 限制次数
  2750. </label>
  2751. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;">
  2752. <input type="radio" name="yingzhi-answer-mode" value="unlimited"> 无限制
  2753. </label>
  2754. </div>
  2755. <div style="display:flex;align-items:center;gap:16px;">
  2756. <span class="form-label" style="width:80px;flex-shrink:0;">考试时间</span>
  2757. <input type="datetime-local" class="form-input" style="width:190px;" step="1">
  2758. <span style="color:var(--text-hint);font-size:13px;">至</span>
  2759. <input type="datetime-local" class="form-input" style="width:190px;" step="1">
  2760. </div>
  2761. <div style="display:flex;align-items:center;gap:16px;">
  2762. <span class="form-label" style="width:80px;flex-shrink:0;">考试时长</span>
  2763. <div style="display:flex;align-items:center;gap:8px;">
  2764. <button class="btn btn-outline-gray btn-sm" onclick="stepNum('yingzhi-duration',-5)">-</button>
  2765. <input id="yingzhi-duration" type="number" class="form-input" style="width:70px;text-align:center;" value="60" min="5" step="5">
  2766. <button class="btn btn-outline-gray btn-sm" onclick="stepNum('yingzhi-duration',5)">+</button>
  2767. <span style="font-size:13px;color:var(--text-secondary);">分钟</span>
  2768. </div>
  2769. <span class="form-hint">限制答卷最大时长</span>
  2770. </div>
  2771. <div style="display:flex;align-items:center;gap:16px;">
  2772. <span class="form-label" style="width:80px;flex-shrink:0;">启用</span>
  2773. <label class="toggle"><input type="checkbox" checked><span class="toggle-slider"></span></label>
  2774. <span class="form-hint">开启后,每学年按配置时间自动创建执行该考试,无需重复配置</span>
  2775. </div>
  2776. </div><!-- /flex col -->
  2777. <!-- 防作弊配置 subsection -->
  2778. <div style="margin-top:24px;padding-top:20px;border-top:1px solid var(--gray-border);">
  2779. <div style="display:flex;align-items:center;gap:8px;margin-bottom:16px;">
  2780. <span class="card-title" style="margin:0;">防作弊配置</span>
  2781. <span class="form-hint" style="font-size:12px;">(防作弊配置仅适用教育考试一体机)</span>
  2782. </div>
  2783. <div style="display:flex;flex-direction:column;gap:14px;">
  2784. <div style="display:flex;align-items:center;gap:12px;">
  2785. <span class="form-label" style="width:100px;flex-shrink:0;">考前人脸校验</span>
  2786. <label class="toggle"><input type="checkbox"><span class="toggle-slider"></span></label>
  2787. <span style="font-size:13px;color:var(--text-secondary);">开启后,考试前需要进行人脸识别校验</span>
  2788. </div>
  2789. <div style="display:flex;align-items:center;gap:12px;">
  2790. <span class="form-label" style="width:100px;flex-shrink:0;">考后人脸校验</span>
  2791. <label class="toggle"><input type="checkbox"><span class="toggle-slider"></span></label>
  2792. <span style="font-size:13px;color:var(--text-secondary);">开启后,考试结束后需要进行人脸识别校验</span>
  2793. </div>
  2794. <div style="display:flex;align-items:center;gap:12px;">
  2795. <span class="form-label" style="width:100px;flex-shrink:0;">摄像头抓拍</span>
  2796. <label class="toggle"><input type="checkbox"><span class="toggle-slider"></span></label>
  2797. <span style="font-size:13px;color:var(--text-secondary);">开启后,考试过程中摄像头随机抓拍</span>
  2798. </div>
  2799. </div>
  2800. </div>
  2801. <div style="margin-top:24px;display:flex;gap:12px;">
  2802. <button class="btn btn-primary">保存设置</button>
  2803. <button class="btn btn-outline-gray">重置</button>
  2804. </div>
  2805. </div><!-- /kaixue-sec-basic -->
  2806. <!-- 考试范围 section -->
  2807. <div id="yingzhi-sec-scope" class="exam-section" style="display:none;">
  2808. <div class="card-title">考试范围</div>
  2809. <!-- 范围类型单选 -->
  2810. <div style="display:flex;align-items:center;gap:20px;margin-bottom:20px;">
  2811. <label style="display:flex;align-items:center;gap:6px;cursor:pointer;font-size:13px;">
  2812. <input type="radio" name="yingzhi-scope-type" value="specify" checked onchange="switchScopeTab('yingzhi','specify')"> 指定范围
  2813. </label>
  2814. <label style="display:flex;align-items:center;gap:6px;cursor:pointer;font-size:13px;">
  2815. <input type="radio" name="yingzhi-scope-type" value="person" onchange="switchScopeTab('yingzhi','person')"> 指定人员
  2816. </label>
  2817. </div>
  2818. <!-- 指定范围 panel -->
  2819. <div id="yingzhi-scope-panel-specify">
  2820. <div style="display:flex;flex-direction:column;gap:18px;">
  2821. <!-- 学院单位 multiselect -->
  2822. <div style="display:flex;align-items:flex-start;gap:16px;">
  2823. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:6px;">学院单位</span>
  2824. <div style="flex:1;max-width:600px;">
  2825. <div style="position:relative;margin-bottom:8px;">
  2826. <input class="form-input" style="padding-left:30px;" placeholder="搜索学院单位...">
  2827. <span style="position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--text-hint);font-size:13px;">🔍</span>
  2828. </div>
  2829. <div style="display:flex;flex-wrap:wrap;gap:6px;padding:10px;border:1px solid var(--gray-border);border-radius:var(--radius);min-height:44px;background:var(--white);">
  2830. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">生命科学学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  2831. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">化学化工学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  2832. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">物理学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  2833. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">材料科学与工程学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  2834. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">医学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  2835. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;">环境科学学院<span style="cursor:pointer;margin-left:2px;">×</span></span>
  2836. <span class="tag" style="display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border:1px dashed var(--gray-border);border-radius:20px;cursor:pointer;color:var(--text-hint);">+ 添加学院</span>
  2837. </div>
  2838. <div style="display:flex;align-items:center;gap:12px;margin-top:8px;">
  2839. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;color:var(--text-secondary);">
  2840. <input type="checkbox" checked style="accent-color:var(--blue);"> 全选
  2841. </label>
  2842. <span style="font-size:12px;color:var(--text-hint);">已全选所有学院单位</span>
  2843. </div>
  2844. </div>
  2845. </div>
  2846. <!-- 考生类别 -->
  2847. <div style="display:flex;align-items:flex-start;gap:16px;">
  2848. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:6px;">考生类别</span>
  2849. <div style="display:flex;flex-direction:column;gap:12px;">
  2850. <!-- 新生 -->
  2851. <div style="display:flex;align-items:center;gap:12px;">
  2852. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;font-weight:500;width:44px;flex-shrink:0;">
  2853. <input type="checkbox" id="yingzhi-cat-xinsheng" checked style="accent-color:var(--blue);"> 新生
  2854. </label>
  2855. <div id="yingzhi-cat-xinsheng-types" style="position:relative;">
  2856. <div class="multiselect-trigger" onclick="toggleMultiselect('yingzhi-xinsheng-dd')" style="display:flex;align-items:center;gap:6px;padding:5px 10px;border:1px solid var(--gray-border);border-radius:var(--radius);cursor:pointer;font-size:13px;min-width:200px;background:var(--white);">
  2857. <span id="yingzhi-xinsheng-label" style="flex:1;color:var(--text-primary);">本科生</span>
  2858. <span style="color:var(--text-hint);font-size:11px;">▼</span>
  2859. </div>
  2860. <div id="yingzhi-xinsheng-dd" style="display:none;position:absolute;top:100%;left:0;z-index:100;background:var(--white);border:1px solid var(--gray-border);border-radius:var(--radius);box-shadow:var(--shadow);padding:8px 0;min-width:160px;">
  2861. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" checked onchange="updateMultiselectLabel('yingzhi-xinsheng-dd','yingzhi-xinsheng-label')"> 本科生</label>
  2862. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('yingzhi-xinsheng-dd','yingzhi-xinsheng-label')"> 研究生</label>
  2863. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('yingzhi-xinsheng-dd','yingzhi-xinsheng-label')"> 博士生</label>
  2864. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('yingzhi-xinsheng-dd','yingzhi-xinsheng-label')"> 教职工</label>
  2865. </div>
  2866. </div>
  2867. </div>
  2868. <!-- 老生 -->
  2869. <div style="display:flex;align-items:center;gap:12px;">
  2870. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;font-weight:500;width:44px;flex-shrink:0;">
  2871. <input type="checkbox" id="yingzhi-cat-laosheng" style="accent-color:var(--blue);"> 老生
  2872. </label>
  2873. <div id="yingzhi-cat-laosheng-types" style="position:relative;">
  2874. <div class="multiselect-trigger" onclick="toggleMultiselect('yingzhi-laosheng-dd')" style="display:flex;align-items:center;gap:6px;padding:5px 10px;border:1px solid var(--gray-border);border-radius:var(--radius);cursor:pointer;font-size:13px;min-width:200px;background:var(--white);">
  2875. <span id="yingzhi-laosheng-label" style="flex:1;color:var(--text-hint);">请选择类型</span>
  2876. <span style="color:var(--text-hint);font-size:11px;">▼</span>
  2877. </div>
  2878. <div id="yingzhi-laosheng-dd" style="display:none;position:absolute;top:100%;left:0;z-index:100;background:var(--white);border:1px solid var(--gray-border);border-radius:var(--radius);box-shadow:var(--shadow);padding:8px 0;min-width:160px;">
  2879. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('yingzhi-laosheng-dd','yingzhi-laosheng-label')"> 本科生</label>
  2880. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('yingzhi-laosheng-dd','yingzhi-laosheng-label')"> 研究生</label>
  2881. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('yingzhi-laosheng-dd','yingzhi-laosheng-label')"> 博士生</label>
  2882. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('yingzhi-laosheng-dd','yingzhi-laosheng-label')"> 教职工</label>
  2883. </div>
  2884. </div>
  2885. </div>
  2886. </div>
  2887. </div>
  2888. </div>
  2889. <div style="margin-top:24px;display:flex;gap:12px;">
  2890. <button class="btn btn-primary">保存设置</button>
  2891. <button class="btn btn-outline-gray">重置</button>
  2892. </div>
  2893. </div><!-- /specify panel -->
  2894. <!-- 指定人员 panel -->
  2895. <div id="yingzhi-scope-panel-person" style="display:none;">
  2896. <div style="display:flex;flex-direction:column;gap:12px;margin-bottom:16px;">
  2897. <!-- 筛选条件 row 1: 学院单位 chip multiselect + 学年 -->
  2898. <div style="display:flex;align-items:flex-start;gap:12px;flex-wrap:wrap;">
  2899. <div style="position:relative;">
  2900. <div class="multiselect-trigger" onclick="toggleMultiselect('yingzhi-person-college-dd')" style="display:flex;align-items:center;gap:6px;padding:5px 10px;border:1px solid var(--gray-border);border-radius:var(--radius);cursor:pointer;font-size:13px;min-width:180px;background:var(--white);">
  2901. <span id="yingzhi-person-college-label" style="flex:1;color:var(--text-hint);">选择学院单位</span>
  2902. <span style="color:var(--text-hint);font-size:11px;">▼</span>
  2903. </div>
  2904. <div id="yingzhi-person-college-dd" style="display:none;position:absolute;top:100%;left:0;z-index:100;background:var(--white);border:1px solid var(--gray-border);border-radius:var(--radius);box-shadow:var(--shadow);padding:8px 0;min-width:180px;">
  2905. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;border-bottom:1px solid var(--gray-border);margin-bottom:4px;"><input type="checkbox" onchange="toggleSelectAll(this,'yingzhi-person-college-dd');updateMultiselectLabel('yingzhi-person-college-dd','yingzhi-person-college-label')"> 全选</label>
  2906. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('yingzhi-person-college-dd','yingzhi-person-college-label')"> 生命科学学院</label>
  2907. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('yingzhi-person-college-dd','yingzhi-person-college-label')"> 化学化工学院</label>
  2908. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('yingzhi-person-college-dd','yingzhi-person-college-label')"> 物理学院</label>
  2909. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('yingzhi-person-college-dd','yingzhi-person-college-label')"> 材料科学学院</label>
  2910. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('yingzhi-person-college-dd','yingzhi-person-college-label')"> 医学院</label>
  2911. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('yingzhi-person-college-dd','yingzhi-person-college-label')"> 环境科学学院</label>
  2912. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('yingzhi-person-college-dd','yingzhi-person-college-label')"> 安全管理处</label>
  2913. </div>
  2914. </div>
  2915. </div>
  2916. <!-- 筛选条件 row 2: 新生/老生 + 类型下拉 + 姓名搜索 -->
  2917. <div style="display:flex;align-items:center;gap:12px;flex-wrap:wrap;">
  2918. <!-- 新生 -->
  2919. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;font-weight:500;">
  2920. <input type="checkbox" id="yingzhi-person-cat-xinsheng" checked style="accent-color:var(--blue);"> 新生
  2921. </label>
  2922. <div style="position:relative;">
  2923. <div class="multiselect-trigger" onclick="toggleMultiselect('yingzhi-person-xinsheng-dd')" style="display:flex;align-items:center;gap:6px;padding:5px 10px;border:1px solid var(--gray-border);border-radius:var(--radius);cursor:pointer;font-size:13px;min-width:140px;background:var(--white);">
  2924. <span id="yingzhi-person-xinsheng-label" style="flex:1;color:var(--text-primary);">本科生</span>
  2925. <span style="color:var(--text-hint);font-size:11px;">▼</span>
  2926. </div>
  2927. <div id="yingzhi-person-xinsheng-dd" style="display:none;position:absolute;top:100%;left:0;z-index:100;background:var(--white);border:1px solid var(--gray-border);border-radius:var(--radius);box-shadow:var(--shadow);padding:8px 0;min-width:140px;">
  2928. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" checked onchange="updateMultiselectLabel('yingzhi-person-xinsheng-dd','yingzhi-person-xinsheng-label')"> 本科生</label>
  2929. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('yingzhi-person-xinsheng-dd','yingzhi-person-xinsheng-label')"> 研究生</label>
  2930. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('yingzhi-person-xinsheng-dd','yingzhi-person-xinsheng-label')"> 博士生</label>
  2931. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('yingzhi-person-xinsheng-dd','yingzhi-person-xinsheng-label')"> 教职工</label>
  2932. </div>
  2933. </div>
  2934. <!-- 老生 -->
  2935. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;font-weight:500;margin-left:8px;">
  2936. <input type="checkbox" id="yingzhi-person-cat-laosheng" style="accent-color:var(--blue);"> 老生
  2937. </label>
  2938. <div style="position:relative;">
  2939. <div class="multiselect-trigger" onclick="toggleMultiselect('yingzhi-person-laosheng-dd')" style="display:flex;align-items:center;gap:6px;padding:5px 10px;border:1px solid var(--gray-border);border-radius:var(--radius);cursor:pointer;font-size:13px;min-width:140px;background:var(--white);">
  2940. <span id="yingzhi-person-laosheng-label" style="flex:1;color:var(--text-hint);">请选择类型</span>
  2941. <span style="color:var(--text-hint);font-size:11px;">▼</span>
  2942. </div>
  2943. <div id="yingzhi-person-laosheng-dd" style="display:none;position:absolute;top:100%;left:0;z-index:100;background:var(--white);border:1px solid var(--gray-border);border-radius:var(--radius);box-shadow:var(--shadow);padding:8px 0;min-width:140px;">
  2944. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('yingzhi-person-laosheng-dd','yingzhi-person-laosheng-label')"> 本科生</label>
  2945. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('yingzhi-person-laosheng-dd','yingzhi-person-laosheng-label')"> 研究生</label>
  2946. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('yingzhi-person-laosheng-dd','yingzhi-person-laosheng-label')"> 博士生</label>
  2947. <label style="display:flex;align-items:center;gap:8px;padding:6px 14px;cursor:pointer;font-size:13px;"><input type="checkbox" onchange="updateMultiselectLabel('yingzhi-person-laosheng-dd','yingzhi-person-laosheng-label')"> 教职工</label>
  2948. </div>
  2949. </div>
  2950. <input class="form-input" style="width:180px;margin-left:8px;" placeholder="姓名/学号/工号">
  2951. <button class="btn btn-outline btn-sm">搜索</button>
  2952. </div>
  2953. </div>
  2954. <!-- Transfer box -->
  2955. <div style="display:flex;gap:12px;align-items:stretch;">
  2956. <!-- Left: candidate list -->
  2957. <div style="flex:1;border:1px solid var(--gray-border);border-radius:var(--radius);overflow:hidden;display:flex;flex-direction:column;">
  2958. <div style="background:var(--gray-light);padding:8px 12px;font-size:13px;font-weight:600;color:var(--text-secondary);border-bottom:1px solid var(--gray-border);display:flex;justify-content:space-between;align-items:center;">
  2959. <span>待选人员</span>
  2960. <span style="font-size:12px;color:var(--text-hint);">共 248 人</span>
  2961. </div>
  2962. <div style="padding:6px;border-bottom:1px solid var(--gray-border);">
  2963. <input class="form-input" style="font-size:12px;" placeholder="在结果中搜索...">
  2964. </div>
  2965. <div style="flex:1;overflow-y:auto;max-height:280px;">
  2966. <table style="width:100%;border-collapse:collapse;font-size:12px;">
  2967. <thead><tr style="background:var(--gray-light);"><th style="padding:6px 10px;text-align:left;font-weight:500;color:var(--text-secondary);"><input type="checkbox"> 姓名</th><th style="padding:6px 10px;text-align:left;font-weight:500;color:var(--text-secondary);">学号/工号</th><th style="padding:6px 10px;text-align:left;font-weight:500;color:var(--text-secondary);">学院</th><th style="padding:6px 10px;text-align:left;font-weight:500;color:var(--text-secondary);">类别</th></tr></thead>
  2968. <tbody>
  2969. <tr style="border-top:1px solid var(--gray-border);"><td style="padding:6px 10px;"><input type="checkbox"> 张三</td><td style="padding:6px 10px;">2026001</td><td style="padding:6px 10px;">生科院</td><td style="padding:6px 10px;">新生本科</td></tr>
  2970. <tr style="border-top:1px solid var(--gray-border);"><td style="padding:6px 10px;"><input type="checkbox"> 李四</td><td style="padding:6px 10px;">2026002</td><td style="padding:6px 10px;">化工院</td><td style="padding:6px 10px;">新生研究生</td></tr>
  2971. <tr style="border-top:1px solid var(--gray-border);"><td style="padding:6px 10px;"><input type="checkbox"> 王五</td><td style="padding:6px 10px;">2026003</td><td style="padding:6px 10px;">物理院</td><td style="padding:6px 10px;">新生博士</td></tr>
  2972. <tr style="border-top:1px solid var(--gray-border);color:var(--text-hint);"><td colspan="4" style="padding:20px;text-align:center;">显示前 3 条,搜索或筛选查看更多</td></tr>
  2973. </tbody>
  2974. </table>
  2975. </div>
  2976. </div>
  2977. <!-- Transfer buttons -->
  2978. <div style="display:flex;flex-direction:column;justify-content:center;gap:8px;flex-shrink:0;">
  2979. <button class="btn btn-outline btn-sm" style="width:44px;" title="添加选中">›</button>
  2980. <button class="btn btn-outline btn-sm" style="width:44px;" title="添加全部">»</button>
  2981. <button class="btn btn-outline btn-sm" style="width:44px;" title="移除选中">‹</button>
  2982. <button class="btn btn-outline btn-sm" style="width:44px;" title="移除全部">«</button>
  2983. </div>
  2984. <!-- Right: selected list -->
  2985. <div style="flex:1;border:1px solid var(--blue);border-radius:var(--radius);overflow:hidden;display:flex;flex-direction:column;">
  2986. <div style="background:var(--blue-xlight);padding:8px 12px;font-size:13px;font-weight:600;color:var(--blue);border-bottom:1px solid var(--blue);display:flex;justify-content:space-between;align-items:center;">
  2987. <span>已选人员</span>
  2988. <span style="font-size:12px;">已选 2 人</span>
  2989. </div>
  2990. <div style="padding:6px;border-bottom:1px solid var(--gray-border);">
  2991. <input class="form-input" style="font-size:12px;" placeholder="在已选中搜索...">
  2992. </div>
  2993. <div style="flex:1;overflow-y:auto;max-height:280px;">
  2994. <table style="width:100%;border-collapse:collapse;font-size:12px;">
  2995. <thead><tr style="background:var(--gray-light);"><th style="padding:6px 10px;text-align:left;font-weight:500;color:var(--text-secondary);"><input type="checkbox"> 姓名</th><th style="padding:6px 10px;text-align:left;font-weight:500;color:var(--text-secondary);">学号/工号</th><th style="padding:6px 10px;text-align:left;font-weight:500;color:var(--text-secondary);">学院</th><th style="padding:6px 10px;text-align:left;font-weight:500;color:var(--text-secondary);">操作</th></tr></thead>
  2996. <tbody>
  2997. <tr style="border-top:1px solid var(--gray-border);"><td style="padding:6px 10px;"><input type="checkbox"> 陈六</td><td style="padding:6px 10px;">2026010</td><td style="padding:6px 10px;">医学院</td><td style="padding:6px 10px;"><span style="color:var(--red);cursor:pointer;">移除</span></td></tr>
  2998. <tr style="border-top:1px solid var(--gray-border);"><td style="padding:6px 10px;"><input type="checkbox"> 赵七</td><td style="padding:6px 10px;">2026011</td><td style="padding:6px 10px;">材料院</td><td style="padding:6px 10px;"><span style="color:var(--red);cursor:pointer;">移除</span></td></tr>
  2999. </tbody>
  3000. </table>
  3001. </div>
  3002. </div>
  3003. </div><!-- /transfer box -->
  3004. <div style="margin-top:20px;display:flex;gap:12px;">
  3005. <button class="btn btn-primary">保存设置</button>
  3006. <button class="btn btn-outline-gray">重置</button>
  3007. </div>
  3008. </div><!-- /person panel -->
  3009. </div><!-- /kaixue-sec-scope -->
  3010. <!-- 试卷配置 section -->
  3011. <div id="yingzhi-sec-paper" class="exam-section" style="display:none;">
  3012. <div class="card-title">试卷配置</div>
  3013. <div style="font-size:13px;color:var(--text-hint);margin-bottom:16px;">根据考试范围,为各学院单位分别指定考试试卷。未单独指定的学院将使用全校默认试卷。</div>
  3014. <div style="display:flex;flex-direction:column;gap:0;border:1px solid var(--gray-border);border-radius:var(--radius);overflow:hidden;">
  3015. <!-- 表头 -->
  3016. <div style="display:grid;grid-template-columns:180px 1fr 140px;background:var(--gray-light);border-bottom:1px solid var(--gray-border);padding:10px 16px;font-size:13px;font-weight:600;color:var(--text-secondary);">
  3017. <span>学院单位</span>
  3018. <span>试卷</span>
  3019. <span>操作</span>
  3020. </div>
  3021. <!-- 全校默认行 -->
  3022. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;border-bottom:1px solid var(--gray-border);background:var(--blue-xlight);">
  3023. <span style="font-size:13px;font-weight:600;color:var(--blue);">全校(默认)</span>
  3024. <div style="display:flex;align-items:center;gap:8px;">
  3025. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;font-size:12px;">实验室安全基础知识<span style="cursor:pointer;margin-left:2px;opacity:.7;">×</span></span>
  3026. </div>
  3027. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">更换试卷</button>
  3028. </div>
  3029. <!-- 生命科学学院 -->
  3030. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;border-bottom:1px solid var(--gray-border);">
  3031. <span style="font-size:13px;color:var(--text-primary);">生命科学学院</span>
  3032. <span style="font-size:12px;color:var(--text-hint);">继承默认试卷</span>
  3033. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">指定试卷</button>
  3034. </div>
  3035. <!-- 化学化工学院 -->
  3036. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;border-bottom:1px solid var(--gray-border);">
  3037. <span style="font-size:13px;color:var(--text-primary);">化学化工学院</span>
  3038. <div style="display:flex;align-items:center;gap:8px;">
  3039. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;font-size:12px;">化工安全专项考试<span style="cursor:pointer;margin-left:2px;opacity:.7;">×</span></span>
  3040. </div>
  3041. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">更换试卷</button>
  3042. </div>
  3043. <!-- 物理学院 -->
  3044. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;border-bottom:1px solid var(--gray-border);">
  3045. <span style="font-size:13px;color:var(--text-primary);">物理学院</span>
  3046. <span style="font-size:12px;color:var(--text-hint);">继承默认试卷</span>
  3047. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">指定试卷</button>
  3048. </div>
  3049. <!-- 材料科学学院 -->
  3050. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;border-bottom:1px solid var(--gray-border);">
  3051. <span style="font-size:13px;color:var(--text-primary);">材料科学学院</span>
  3052. <span style="font-size:12px;color:var(--text-hint);">继承默认试卷</span>
  3053. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">指定试卷</button>
  3054. </div>
  3055. <!-- 医学院 -->
  3056. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;border-bottom:1px solid var(--gray-border);">
  3057. <span style="font-size:13px;color:var(--text-primary);">医学院</span>
  3058. <div style="display:flex;align-items:center;gap:8px;">
  3059. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;font-size:12px;">医学实验室安全规范<span style="cursor:pointer;margin-left:2px;opacity:.7;">×</span></span>
  3060. </div>
  3061. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">更换试卷</button>
  3062. </div>
  3063. <!-- 环境科学学院 -->
  3064. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;border-bottom:1px solid var(--gray-border);">
  3065. <span style="font-size:13px;color:var(--text-primary);">环境科学学院</span>
  3066. <span style="font-size:12px;color:var(--text-hint);">继承默认试卷</span>
  3067. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">指定试卷</button>
  3068. </div>
  3069. <!-- 安全管理处 -->
  3070. <div style="display:grid;grid-template-columns:180px 1fr 140px;align-items:center;padding:12px 16px;">
  3071. <span style="font-size:13px;color:var(--text-primary);">安全管理处</span>
  3072. <span style="font-size:12px;color:var(--text-hint);">继承默认试卷</span>
  3073. <button class="btn btn-outline btn-sm" style="height:28px;font-size:12px;" onclick="showModal('modal-select-paper')">指定试卷</button>
  3074. </div>
  3075. </div>
  3076. <div style="margin-top:24px;display:flex;gap:12px;">
  3077. <button class="btn btn-primary">保存设置</button>
  3078. <button class="btn btn-outline-gray">重置</button>
  3079. </div>
  3080. </div><!-- /kaixue-sec-paper -->
  3081. <!-- 考前配置 section -->
  3082. <div id="yingzhi-sec-preexam" class="exam-section" style="display:none;">
  3083. <div class="card-title">考前配置</div>
  3084. <div style="display:flex;flex-direction:column;gap:20px;">
  3085. <!-- 学时要求 -->
  3086. <div style="display:flex;align-items:flex-start;gap:12px;">
  3087. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:4px;">学时要求</span>
  3088. <div style="display:flex;flex-direction:column;gap:10px;flex:1;">
  3089. <div style="display:flex;align-items:center;gap:12px;">
  3090. <label class="toggle"><input type="checkbox" id="yingzhi-credit-toggle" checked onchange="document.getElementById('yingzhi-credit-detail').style.display=this.checked?'block':'none'"><span class="toggle-slider"></span></label>
  3091. <span style="font-size:13px;color:var(--text-secondary);">开启后,需完成相应学时才能参加考试(学时为0即无学时要求)</span>
  3092. </div>
  3093. <div id="yingzhi-credit-detail">
  3094. <div style="border:1px solid var(--gray-border);border-radius:var(--radius);overflow:hidden;max-width:680px;">
  3095. <!-- header -->
  3096. <div style="display:grid;grid-template-columns:1fr 200px;background:var(--gray-light);padding:10px 16px;font-size:13px;font-weight:600;color:var(--text-secondary);border-bottom:1px solid var(--gray-border);">
  3097. <span>用户类别</span><span style="text-align:right;">学时要求配置</span>
  3098. </div>
  3099. <!-- 研究生 -->
  3100. <div style="border-bottom:1px solid var(--gray-border);">
  3101. <div style="display:grid;grid-template-columns:120px 1fr 200px;align-items:center;padding:12px 16px;border-bottom:1px solid var(--gray-border);">
  3102. <span style="font-size:13px;font-weight:600;color:var(--text-primary);">研究生</span>
  3103. <span style="font-size:13px;color:var(--text-secondary);">新生(无需进入实验室的)</span>
  3104. <div style="display:flex;align-items:center;gap:6px;justify-content:flex-end;">
  3105. <button class="btn btn-outline-gray btn-sm" style="width:28px;height:28px;padding:0;" onclick="stepNum('yc-grad-new',-1)">-</button>
  3106. <input id="yc-grad-new" type="number" class="form-input" style="width:60px;text-align:center;" value="4" min="0">
  3107. <button class="btn btn-outline-gray btn-sm" style="width:28px;height:28px;padding:0;" onclick="stepNum('yc-grad-new',1)">+</button>
  3108. </div>
  3109. </div>
  3110. <div style="display:grid;grid-template-columns:120px 1fr auto;align-items:center;padding:12px 16px;">
  3111. <span></span>
  3112. <span style="font-size:13px;color:var(--text-secondary);">非新生(完成实验室分级年度学时任务)</span>
  3113. <span style="font-size:13px;color:var(--text-hint);background:var(--gray-light);padding:4px 10px;border-radius:4px;white-space:nowrap;">Ⅰ级 24学时 / Ⅱ级 16学时 / Ⅲ级 8学时 / Ⅳ级 4学时</span>
  3114. </div>
  3115. </div>
  3116. <!-- 本科生 -->
  3117. <div style="display:grid;grid-template-columns:120px 1fr 200px;align-items:center;padding:12px 16px;border-bottom:1px solid var(--gray-border);">
  3118. <span style="font-size:13px;font-weight:600;color:var(--text-primary);">本科生</span>
  3119. <span style="font-size:13px;color:var(--text-secondary);">非新生</span>
  3120. <div style="display:flex;align-items:center;gap:6px;justify-content:flex-end;">
  3121. <button class="btn btn-outline-gray btn-sm" style="width:28px;height:28px;padding:0;" onclick="stepNum('yc-undergrad',-1)">-</button>
  3122. <input id="yc-undergrad" type="number" class="form-input" style="width:60px;text-align:center;" value="0" min="0">
  3123. <button class="btn btn-outline-gray btn-sm" style="width:28px;height:28px;padding:0;" onclick="stepNum('yc-undergrad',1)">+</button>
  3124. </div>
  3125. </div>
  3126. <!-- 教职工 -->
  3127. <div>
  3128. <div style="display:grid;grid-template-columns:120px 1fr 200px;align-items:center;padding:12px 16px;border-bottom:1px solid var(--gray-border);">
  3129. <span style="font-size:13px;font-weight:600;color:var(--text-primary);">教职工</span>
  3130. <span style="font-size:13px;color:var(--text-secondary);">新入职</span>
  3131. <div style="display:flex;align-items:center;gap:6px;justify-content:flex-end;">
  3132. <button class="btn btn-outline-gray btn-sm" style="width:28px;height:28px;padding:0;" onclick="stepNum('yc-staff-new',-1)">-</button>
  3133. <input id="yc-staff-new" type="number" class="form-input" style="width:60px;text-align:center;" value="4" min="0">
  3134. <button class="btn btn-outline-gray btn-sm" style="width:28px;height:28px;padding:0;" onclick="stepNum('yc-staff-new',1)">+</button>
  3135. </div>
  3136. </div>
  3137. <div style="display:grid;grid-template-columns:120px 1fr 200px;align-items:center;padding:12px 16px;">
  3138. <span></span>
  3139. <span style="font-size:13px;color:var(--text-secondary);">非新入职</span>
  3140. <div style="display:flex;align-items:center;gap:6px;justify-content:flex-end;">
  3141. <button class="btn btn-outline-gray btn-sm" style="width:28px;height:28px;padding:0;" onclick="stepNum('yc-staff-old',-1)">-</button>
  3142. <input id="yc-staff-old" type="number" class="form-input" style="width:60px;text-align:center;" value="0" min="0">
  3143. <button class="btn btn-outline-gray btn-sm" style="width:28px;height:28px;padding:0;" onclick="stepNum('yc-staff-old',1)">+</button>
  3144. </div>
  3145. </div>
  3146. </div>
  3147. </div>
  3148. </div>
  3149. </div>
  3150. </div>
  3151. <!-- 考前学习 -->
  3152. <div style="display:flex;align-items:flex-start;gap:12px;">
  3153. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:4px;">考前学习</span>
  3154. <div style="display:flex;flex-direction:column;gap:8px;">
  3155. <label class="toggle"><input type="checkbox" id="yingzhi-prestudy-toggle" onchange="document.getElementById('yingzhi-prestudy-detail').style.display=this.checked?'flex':'none'"><span class="toggle-slider"></span></label>
  3156. <div id="yingzhi-prestudy-detail" style="display:none;align-items:center;gap:8px;">
  3157. <button class="btn btn-outline btn-sm">选择课程</button>
  3158. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;">实验室安全基础课程<span onclick="this.parentElement.remove()" style="cursor:pointer;margin-left:2px;">×</span></span>
  3159. <span class="form-hint">只可选择一门课程</span>
  3160. </div>
  3161. </div>
  3162. </div>
  3163. <!-- 模拟考试 -->
  3164. <div style="display:flex;align-items:flex-start;gap:12px;">
  3165. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:4px;">模拟考试</span>
  3166. <div style="display:flex;flex-direction:column;gap:10px;">
  3167. <label class="toggle"><input type="checkbox" id="yingzhi-mock-toggle" onchange="document.getElementById('yingzhi-mock-detail').style.display=this.checked?'block':'none'"><span class="toggle-slider"></span></label>
  3168. <div id="yingzhi-mock-detail" style="display:none;">
  3169. <div style="display:flex;gap:16px;margin-bottom:10px;">
  3170. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;">
  3171. <input type="radio" name="yingzhi-mock-mode" value="reuse" checked onchange="switchYingzhiMockMode('reuse')"> 复用试卷
  3172. </label>
  3173. <label style="display:flex;align-items:center;gap:5px;cursor:pointer;font-size:13px;">
  3174. <input type="radio" name="yingzhi-mock-mode" value="choose" onchange="switchYingzhiMockMode('choose')"> 选择试卷
  3175. </label>
  3176. </div>
  3177. <!-- 复用试卷:显示当前正式考试试卷名称 -->
  3178. <div id="yingzhi-mock-reuse-wrap" style="display:flex;align-items:center;gap:8px;">
  3179. <span class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;">实验室安全综合试卷(2026)<span onclick="clearYingzhiMockReuse()" style="cursor:pointer;margin-left:2px;">×</span></span>
  3180. <span class="form-hint">复用正式考试试卷作为模拟考试</span>
  3181. </div>
  3182. <!-- 选择试卷:手动选择 -->
  3183. <div id="yingzhi-mock-choose-wrap" style="display:none;align-items:center;gap:8px;">
  3184. <button class="btn btn-outline btn-sm" onclick="showModal('modal-select-paper')">选择试卷</button>
  3185. <span id="yingzhi-mock-paper-tag" style="display:none;" class="tag tag-blue" style="display:inline-flex;align-items:center;gap:4px;"></span>
  3186. </div>
  3187. </div>
  3188. </div>
  3189. </div>
  3190. <!-- 考试承诺书 -->
  3191. <div style="display:flex;align-items:flex-start;gap:12px;">
  3192. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:4px;">考试承诺书</span>
  3193. <div style="display:flex;flex-direction:column;gap:8px;flex:1;">
  3194. <label class="toggle"><input type="checkbox" id="yingzhi-pledge-toggle" onchange="document.getElementById('yingzhi-pledge-editor').style.display=this.checked?'block':'none'"><span class="toggle-slider"></span></label>
  3195. <div id="yingzhi-pledge-editor" style="display:none;">
  3196. <div class="rich-editor">
  3197. <div class="rich-toolbar">
  3198. <button class="rich-tool-btn">B</button><button class="rich-tool-btn">I</button>
  3199. <button class="rich-tool-btn">U</button><button class="rich-tool-btn">≡</button>
  3200. <button class="rich-tool-btn">链接</button><button class="rich-tool-btn">图片</button>
  3201. </div>
  3202. <div class="rich-body" contenteditable="true">
  3203. <p><strong>实验室安全承诺书</strong></p>
  3204. <p>本人郑重承诺:在参加实验室安全考试及日常实验操作过程中,严格遵守实验室各项安全规章制度,认真执行安全操作规程,不擅自使用不熟悉的仪器设备,不私自改装或违规操作实验装置。发现安全隐患及时上报,如实反映实验情况,对违规行为承担相应法律及校规责任。</p>
  3205. </div>
  3206. </div>
  3207. <div style="display:flex;align-items:center;gap:20px;margin-top:10px;flex-wrap:wrap;">
  3208. <label style="display:flex;align-items:center;gap:6px;cursor:pointer;font-size:13px;color:var(--text-secondary);">
  3209. <input type="checkbox" style="accent-color:var(--blue);">
  3210. 支持考生打印承诺书
  3211. </label>
  3212. </div>
  3213. </div>
  3214. </div>
  3215. </div>
  3216. </div>
  3217. <div style="margin-top:24px;display:flex;gap:12px;">
  3218. <button class="btn btn-primary">保存设置</button>
  3219. <button class="btn btn-outline-gray">重置</button>
  3220. </div>
  3221. </div><!-- /kaixue-sec-preexam -->
  3222. <!-- 获得证书 section -->
  3223. <div id="yingzhi-sec-cert" class="exam-section" style="display:none;">
  3224. <div class="card-title">获得证书</div>
  3225. <div style="display:flex;flex-direction:column;gap:16px;">
  3226. <div style="display:flex;align-items:center;gap:12px;">
  3227. <span class="form-label" style="width:80px;flex-shrink:0;">颁发证书</span>
  3228. <label class="toggle"><input type="checkbox" id="yingzhi-cert-toggle" onchange="document.getElementById('yingzhi-cert-detail').style.display=this.checked?'block':'none'"><span class="toggle-slider"></span></label>
  3229. </div>
  3230. <div id="yingzhi-cert-detail" style="display:none;">
  3231. <div style="display:flex;align-items:flex-start;gap:12px;">
  3232. <span class="form-label" style="width:80px;flex-shrink:0;padding-top:6px;">证书模板</span>
  3233. <div style="display:flex;flex-direction:column;gap:12px;">
  3234. <select class="form-input form-select" style="width:240px;" id="yingzhi-cert-tpl" onchange="previewYingzhiCert(this)">
  3235. <option value="">请选择证书模板</option>
  3236. <option value="standard">实验室安全教育证书(标准版)</option>
  3237. <option value="elite">实验室安全教育证书(精英版)</option>
  3238. </select>
  3239. <div id="yingzhi-cert-preview" style="display:none;border:1px solid var(--gray-border);border-radius:var(--radius);overflow:hidden;width:360px;background:var(--gray-light);">
  3240. <div style="padding:6px 10px;background:var(--blue-light);border-bottom:1px solid var(--gray-border);font-size:12px;color:var(--blue);display:flex;justify-content:space-between;align-items:center;">
  3241. <span id="yingzhi-cert-preview-name"></span>
  3242. <span style="cursor:pointer;color:var(--text-hint);" onclick="document.getElementById('yingzhi-cert-tpl').value='';previewYingzhiCert(document.getElementById('yingzhi-cert-tpl'))">×</span>
  3243. </div>
  3244. <div style="padding:24px;display:flex;align-items:center;justify-content:center;min-height:200px;">
  3245. <div id="yingzhi-cert-img-wrap" style="text-align:center;"></div>
  3246. </div>
  3247. </div>
  3248. </div>
  3249. </div>
  3250. </div><!-- /kaixue-cert-detail -->
  3251. </div>
  3252. <div style="margin-top:24px;display:flex;gap:12px;">
  3253. <button class="btn btn-primary">保存设置</button>
  3254. <button class="btn btn-outline-gray">重置</button>
  3255. </div>
  3256. </div><!-- /kaixue-sec-cert -->
  3257. </div><!-- /right content -->
  3258. </div><!-- /exam-tab-yingzhi -->
  3259. </div><!-- /page-exam-template -->
  3260. </div><!-- end main-content -->
  3261. </div><!-- end admin-body -->
  3262. <script>
  3263. // ===== PAGE ROUTING =====
  3264. function showPage(id) {
  3265. document.querySelectorAll('.page').forEach(p => p.classList.remove('active'));
  3266. const target = document.getElementById(id);
  3267. if (target) { target.classList.add('active'); window.scrollTo(0,0); }
  3268. // Highlight matching nav item by onclick attr
  3269. document.querySelectorAll('.nav-item').forEach(n => {
  3270. n.classList.remove('active');
  3271. const oc = n.getAttribute('onclick') || '';
  3272. if (oc.includes("'" + id + "'")) n.classList.add('active');
  3273. // detail pages highlight their parent list item
  3274. if (id === 'page-training-activity-detail' && oc.includes("'page-training-activity-list'")) n.classList.add('active');
  3275. });
  3276. }
  3277. // switchMenu kept for backwards compat with any remaining onclick refs — no-op since sidebar is now unified
  3278. function switchMenu() {}
  3279. // ===== CERT TEMPLATE TOGGLE =====
  3280. function toggleCertTemplate(checkbox) {
  3281. document.getElementById('cert-template-section').style.display = checkbox.checked ? 'block' : 'none';
  3282. }
  3283. // ===== TRAINING SCOPE MODE =====
  3284. function setScopeMode(mode) {
  3285. document.getElementById('scope-dept-section').style.display = mode === 'dept' ? 'block' : 'none';
  3286. document.getElementById('scope-person-section').style.display = mode === 'person' ? 'block' : 'none';
  3287. ['all','dept','person'].forEach(function(m) {
  3288. var lbl = document.getElementById('scope-label-' + m);
  3289. if (lbl) {
  3290. lbl.style.borderColor = m === mode ? 'var(--blue)' : 'var(--gray-border)';
  3291. lbl.style.background = m === mode ? 'var(--blue-xlight)' : '';
  3292. lbl.style.color = m === mode ? 'var(--blue)' : '';
  3293. }
  3294. });
  3295. }
  3296. // ===== PUBLISH TOGGLE CLICK =====
  3297. document.addEventListener('click', function(e) {
  3298. const wrap = e.target.closest('.pub-slider');
  3299. if (!wrap) return;
  3300. const isOn = wrap.classList.contains('pub-on');
  3301. wrap.classList.toggle('pub-on', !isOn);
  3302. wrap.classList.toggle('pub-off', isOn);
  3303. });
  3304. // ===== LIST/GRID VIEW =====
  3305. function setListView(mode) {
  3306. const grid = document.getElementById('activity-grid-view');
  3307. const list = document.getElementById('activity-list-view');
  3308. if (!grid || !list) return;
  3309. if (mode === 'grid') { grid.style.display = 'grid'; list.style.display = 'none'; }
  3310. else { grid.style.display = 'none'; list.style.display = 'block'; }
  3311. }
  3312. // ===== MODALS =====
  3313. function showModal(id) {
  3314. const m = document.getElementById(id);
  3315. if (m) m.classList.add('active');
  3316. }
  3317. function hideModal(id) {
  3318. const m = document.getElementById(id);
  3319. if (m) m.classList.remove('active');
  3320. }
  3321. function selectPaper(name) {
  3322. // TODO: wire up to the target cell when a real data model exists
  3323. hideModal('modal-select-paper');
  3324. }
  3325. // Close modal on backdrop click
  3326. document.querySelectorAll('.modal-overlay').forEach(m => {
  3327. m.addEventListener('click', function(e) {
  3328. if (e.target === this) this.classList.remove('active');
  3329. });
  3330. });
  3331. // ===== EXAM TEMPLATE PAGE =====
  3332. function switchExamTab(tab) {
  3333. document.querySelectorAll('.exam-tab-panel').forEach(function(p) { p.style.display = 'none'; });
  3334. var panel = document.getElementById('exam-tab-' + tab);
  3335. if (panel) {
  3336. panel.style.display = tab === 'yingzhi' ? 'flex' : 'flex';
  3337. if (tab === 'fenji') {
  3338. // ensure flex for fenji sub-tab wrapper
  3339. panel.style.display = 'block';
  3340. }
  3341. }
  3342. document.querySelectorAll('#exam-top-tabs .view-tab').forEach(function(t) { t.classList.remove('active'); });
  3343. var tabMap = { kaixue: 0, fenji: 1, yingzhi: 2 };
  3344. var tabs = document.querySelectorAll('#exam-top-tabs .view-tab');
  3345. if (tabs[tabMap[tab]]) tabs[tabMap[tab]].classList.add('active');
  3346. }
  3347. function switchExamSection(prefix, section) {
  3348. // Hide all sections in this prefix's container
  3349. var secs = document.querySelectorAll('#' + prefix + '-sec-basic, #' + prefix + '-sec-scope, #' + prefix + '-sec-paper, #' + prefix + '-sec-preexam, #' + prefix + '-sec-cheat, #' + prefix + '-sec-cert');
  3350. secs.forEach(function(s) { s.style.display = 'none'; });
  3351. var target = document.getElementById(prefix + '-sec-' + section);
  3352. if (target) target.style.display = 'block';
  3353. // Update nav active state - find nav items in same sidebar
  3354. var secContainer = target && target.closest('[style*="overflow:hidden"]');
  3355. if (secContainer) {
  3356. secContainer.querySelectorAll('.nav-item').forEach(function(n) {
  3357. n.classList.remove('active');
  3358. var oc = n.getAttribute('onclick') || '';
  3359. if (oc.includes("'" + section + "'")) n.classList.add('active');
  3360. });
  3361. }
  3362. }
  3363. function switchGradeTab(grade) {
  3364. document.querySelectorAll('.fenji-grade-panel').forEach(function(p) { p.style.display = 'none'; });
  3365. var panel = document.getElementById('fenji-grade-' + grade);
  3366. if (panel) panel.style.display = 'flex';
  3367. document.querySelectorAll('#fenji-grade-tabs .view-tab').forEach(function(t) { t.classList.remove('active'); });
  3368. var gradeMap = { g1: 0, g2: 1, g3: 2, g4: 3 };
  3369. var tabs = document.querySelectorAll('#fenji-grade-tabs .view-tab');
  3370. if (tabs[gradeMap[grade]]) tabs[gradeMap[grade]].classList.add('active');
  3371. }
  3372. function setKaixueScope(mode) {
  3373. document.getElementById('kaixue-scope-table').style.display = (mode === 'specify' || mode === 'student') ? 'block' : 'none';
  3374. document.querySelectorAll('[name="kaixue-scope"]').forEach(function(r) {
  3375. r.checked = (r.value === mode);
  3376. });
  3377. }
  3378. // 证书模板预览
  3379. var kaixueCertTplMap = {
  3380. 'standard': { name: '实验室安全教育证书(标准版)', color: '#1857d4', bg: '#eef3fd' },
  3381. 'elite': { name: '实验室安全教育证书(精英版)', color: '#10a37f', bg: '#edfaf6' }
  3382. };
  3383. function previewKaixueCert(sel) {
  3384. var val = sel.value;
  3385. var preview = document.getElementById('kaixue-cert-preview');
  3386. var nameEl = document.getElementById('kaixue-cert-preview-name');
  3387. var imgWrap = document.getElementById('kaixue-cert-img-wrap');
  3388. if (!val) {
  3389. preview.style.display = 'none';
  3390. return;
  3391. }
  3392. var tpl = kaixueCertTplMap[val];
  3393. nameEl.textContent = tpl.name;
  3394. // Placeholder certificate mockup (replaced with real <img> once backend provides URLs)
  3395. imgWrap.innerHTML =
  3396. '<div style="width:280px;height:198px;border:2px solid ' + tpl.color + ';border-radius:6px;background:' + tpl.bg + ';display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;">' +
  3397. '<div style="font-size:18px;font-weight:700;color:' + tpl.color + ';letter-spacing:2px;">实验室安全教育证书</div>' +
  3398. '<div style="font-size:11px;color:var(--text-hint);">此处为证书样式预览</div>' +
  3399. '<div style="font-size:12px;color:var(--text-secondary);margin-top:4px;">' + tpl.name + '</div>' +
  3400. '</div>';
  3401. preview.style.display = 'block';
  3402. }
  3403. function switchKaixueMockMode(mode) {
  3404. document.getElementById('kaixue-mock-reuse-wrap').style.display = mode === 'reuse' ? 'flex' : 'none';
  3405. document.getElementById('kaixue-mock-choose-wrap').style.display = mode === 'choose' ? 'flex' : 'none';
  3406. }
  3407. function clearKaixueMockReuse() {
  3408. var wrap = document.getElementById('kaixue-mock-reuse-wrap');
  3409. wrap.innerHTML = '<span class="form-hint">暂无复用试卷</span>';
  3410. }
  3411. function switchYingzhiMockMode(mode) {
  3412. document.getElementById('yingzhi-mock-reuse-wrap').style.display = mode === 'reuse' ? 'flex' : 'none';
  3413. document.getElementById('yingzhi-mock-choose-wrap').style.display = mode === 'choose' ? 'flex' : 'none';
  3414. }
  3415. function clearYingzhiMockReuse() {
  3416. var wrap = document.getElementById('yingzhi-mock-reuse-wrap');
  3417. wrap.innerHTML = '<span class="form-hint">暂无复用试卷</span>';
  3418. }
  3419. function previewYingzhiCert(sel) {
  3420. previewCert(sel, 'yingzhi-cert-preview', 'yingzhi-cert-preview-name', 'yingzhi-cert-img-wrap');
  3421. }
  3422. // Generic scope tab switcher for fenji/yingzhi (prefix-based)
  3423. function switchScopeTab(prefix, tab) {
  3424. ['specify','person'].forEach(function(p) {
  3425. var el = document.getElementById(prefix + '-scope-panel-' + p);
  3426. if (el) el.style.display = (p === tab) ? 'block' : 'none';
  3427. });
  3428. }
  3429. // Generic cert preview (shared by fenji/yingzhi grades)
  3430. function previewCert(sel, previewId, nameId, imgId) {
  3431. var val = sel.value;
  3432. var preview = document.getElementById(previewId);
  3433. var nameEl = document.getElementById(nameId);
  3434. var imgWrap = document.getElementById(imgId);
  3435. if (!val) { if (preview) preview.style.display = 'none'; return; }
  3436. var tpl = kaixueCertTplMap[val];
  3437. if (!tpl || !preview) return;
  3438. nameEl.textContent = tpl.name;
  3439. imgWrap.innerHTML =
  3440. '<div style="width:280px;height:198px;border:2px solid ' + tpl.color + ';border-radius:6px;background:' + tpl.bg + ';display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;">' +
  3441. '<div style="font-size:18px;font-weight:700;color:' + tpl.color + ';letter-spacing:2px;">实验室安全教育证书</div>' +
  3442. '<div style="font-size:11px;color:var(--text-hint);">此处为证书样式预览</div>' +
  3443. '<div style="font-size:12px;color:var(--text-secondary);margin-top:4px;">' + tpl.name + '</div>' +
  3444. '</div>';
  3445. preview.style.display = 'block';
  3446. }
  3447. function switchKaixueScopeTab(tab) {
  3448. var panels = ['specify', 'person'];
  3449. panels.forEach(function(p) {
  3450. var panel = document.getElementById('kaixue-scope-panel-' + p);
  3451. if (panel) panel.style.display = (p === tab) ? 'block' : 'none';
  3452. });
  3453. }
  3454. function toggleMultiselect(ddId) {
  3455. var dd = document.getElementById(ddId);
  3456. if (!dd) return;
  3457. var isOpen = dd.style.display !== 'none';
  3458. // Close all open dropdowns first
  3459. document.querySelectorAll('[id$="-dd"]').forEach(function(el) { el.style.display = 'none'; });
  3460. if (!isOpen) dd.style.display = 'block';
  3461. }
  3462. function updateMultiselectLabel(ddId, labelId) {
  3463. var dd = document.getElementById(ddId);
  3464. var label = document.getElementById(labelId);
  3465. if (!dd || !label) return;
  3466. var checked = Array.from(dd.querySelectorAll('input[type=checkbox]:checked')).filter(function(cb) {
  3467. return !cb.closest('label').textContent.trim().startsWith('全选');
  3468. }).map(function(cb) { return cb.parentElement.textContent.trim(); });
  3469. label.textContent = checked.length ? checked.join('、') : '请选择类型';
  3470. label.style.color = checked.length ? 'var(--text-primary)' : 'var(--text-hint)';
  3471. }
  3472. function toggleSelectAll(allCb, ddId) {
  3473. var dd = document.getElementById(ddId);
  3474. if (!dd) return;
  3475. dd.querySelectorAll('input[type=checkbox]').forEach(function(cb) { cb.checked = allCb.checked; });
  3476. }
  3477. // Close multiselect dropdowns on outside click
  3478. document.addEventListener('click', function(e) {
  3479. if (!e.target.closest('.multiselect-trigger') && !e.target.closest('[id$="-dd"]')) {
  3480. document.querySelectorAll('[id$="-dd"]').forEach(function(el) { el.style.display = 'none'; });
  3481. }
  3482. });
  3483. function stepNum(id, delta) {
  3484. var el = document.getElementById(id);
  3485. if (!el) return;
  3486. var val = (parseInt(el.value, 10) || 0) + delta;
  3487. var min = parseInt(el.min, 10);
  3488. if (!isNaN(min) && val < min) val = min;
  3489. el.value = val;
  3490. }
  3491. function updateKaixueHours() {
  3492. // Reflect checked user types in the hours table
  3493. var tbody = document.getElementById('kaixue-hours-tbody');
  3494. if (!tbody) return;
  3495. var types = [
  3496. { id: 'kaixue-user-undergrad', label: '新入学本科生', def: 4 },
  3497. { id: 'kaixue-user-postgrad', label: '新入学研究生', def: 4 },
  3498. { id: 'kaixue-user-staff', label: '新入职教职工', def: 2 }
  3499. ];
  3500. var rows = '';
  3501. types.forEach(function(t) {
  3502. var cb = document.getElementById(t.id);
  3503. if (cb && cb.checked) {
  3504. rows += '<tr><td>' + t.label + '</td><td><input type="number" class="form-input" style="width:80px;" value="' + t.def + '" min="0"></td></tr>';
  3505. }
  3506. });
  3507. tbody.innerHTML = rows || '<tr><td colspan="2" style="text-align:center;color:var(--text-hint);">请先选择用户类别</td></tr>';
  3508. }
  3509. </script>
  3510. </body>
  3511. </html>