mirror of
https://github.com/ZeroCatDev/Classworks.git
synced 2025-12-08 13:49:37 +00:00
10 lines
145 KiB
JavaScript
10 lines
145 KiB
JavaScript
import{p as Ze,_ as at,V as Yt}from"./index-DtMufIQI.js";import{_ as z,j as f,o as m,w as n,d as t,B as S,aC as je,q as F,t as a,C as k,v as x,z as E,ai as Ue,aA as ze,M as X,l as U,i as w,bp as Zt,L as rt,aJ as ut,W as Xe,ah as Xt,y as p,K as A,a6 as P,a7 as D,aE as K,aF as Z,H as pe,x as H,A as I,F as $,G as le,bq as dt,k as y,s as xe,br as $t,E as Ke,aD as Je,bs as Ne,ag as Fe,aG as Re,S as Ve,bt as en,N as ge,O as Pe,aW as tn,D as nn,g as sn,p as on,$ as ln,bu as an,bv as rn,ba as un,e as $e,P as et,r as dn,aH as cn}from"./index-7IYGOfs0.js";import{V as he}from"./VChip-C6nGT8tD.js";import{V as be,a as ae}from"./VRow-CZv9s28d.js";import{b as hn,c as mn,V as pn,a as wn}from"./VAppBarTitle-BgUJGKoV.js";import{V as ct}from"./VSwitch-D2t2liXZ.js";import{d as ht}from"./filter-DgECVsLP.js";import{V as L}from"./VTextField-TzCBebGx.js";import{V as mt}from"./VMenu-DJWnpkEy.js";import{d as oe,k as fn}from"./dataProvider-DRMTFwsF.js";import{V as ee,a as De}from"./VAlert-Df0K8Bdx.js";import{V as pt}from"./VContainer-CyLU9AUY.js";import{V as wt}from"./VForm-DFhXsbRg.js";import{V as ft,a as gt,b as vt,c as bt}from"./VExpansionPanels-COZa8xEg.js";import{V as yt}from"./VDataTable-Z74c13Nn.js";import{V as Ee}from"./VTextarea-BgizTKUS.js";import{o as gn,b as vn}from"./axios-B7NKhyp9.js";import{e as tt,b as bn,a as ie}from"./VTabsWindowItem-C0o9r3QY.js";import"./VCheckboxBtn-Km17YzJ6.js";const yn={name:"SettingsCard",props:{title:{type:String,required:!0},icon:{type:String,required:!0},loading:{type:Boolean,default:!1}}};function kn(s,e,l,u,i,o){return m(),f(U,{elevation:"2",class:"settings-card rounded-lg"},{default:n(()=>[t(je,null,{prepend:n(()=>[t(x,{icon:l.icon,size:"large",class:"mr-2"},null,8,["icon"])]),default:n(()=>[t(F,{class:"text-h6"},{default:n(()=>[a(k(l.title),1)]),_:1})]),_:1}),t(E,null,{default:n(()=>[l.loading?(m(),f(ze,{key:0,indeterminate:"",color:"primary",class:"mb-4"})):S("",!0),Ue(s.$slots,"default",{},void 0,!0)]),_:3}),s.$slots.actions?(m(),f(X,{key:0,class:"pa-4"},{default:n(()=>[Ue(s.$slots,"actions",{},void 0,!0)]),_:3})):S("",!0)]),_:3})}const R=z(yn,[["render",kn],["__scopeId","data-v-3e8918ff"]]);var xn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Sn(s){return s&&s.__esModule&&Object.prototype.hasOwnProperty.call(s,"default")?s.default:s}var kt={exports:{}};(function(s,e){(function(l,u){s.exports=u()})(typeof self<"u"?self:xn,()=>(()=>{var l={3146:(r,c,h)=>{for(var b=h(3491),_=typeof window>"u"?h.g:window,N=["moz","webkit"],Q="AnimationFrame",J=_["request"+Q],G=_["cancel"+Q]||_["cancelRequest"+Q],re=0;!J&&re<N.length;re++)J=_[N[re]+"Request"+Q],G=_[N[re]+"Cancel"+Q]||_[N[re]+"CancelRequest"+Q];if(!J||!G){var we=0,me=0,te=[],ve=1e3/60;J=function(Y){if(te.length===0){var ne=b(),ue=Math.max(0,ve-(ne-we));we=ue+ne,setTimeout(function(){var fe=te.slice(0);te.length=0;for(var O=0;O<fe.length;O++)if(!fe[O].cancelled)try{fe[O].callback(we)}catch(de){setTimeout(function(){throw de},0)}},Math.round(ue))}return te.push({handle:++me,callback:Y,cancelled:!1}),me},G=function(Y){for(var ne=0;ne<te.length;ne++)te[ne].handle===Y&&(te[ne].cancelled=!0)}}r.exports=function(Y){return J.call(_,Y)},r.exports.cancel=function(){G.apply(_,arguments)},r.exports.polyfill=function(Y){Y||(Y=_),Y.requestAnimationFrame=J,Y.cancelAnimationFrame=G}},3491:function(r){(function(){var c,h,b,_,N,Q;typeof performance<"u"&&performance!==null&&performance.now?r.exports=function(){return performance.now()}:typeof process<"u"&&process!==null&&process.hrtime?(r.exports=function(){return(c()-N)/1e6},h=process.hrtime,_=(c=function(){var J;return 1e9*(J=h())[0]+J[1]})(),Q=1e9*process.uptime(),N=_-Q):Date.now?(r.exports=function(){return Date.now()-b},b=Date.now()):(r.exports=function(){return new Date().getTime()-b},b=new Date().getTime())}).call(this)}},u={};function i(r){var c=u[r];if(c!==void 0)return c.exports;var h=u[r]={exports:{}};return l[r].call(h.exports,h,h.exports,i),h.exports}i.n=r=>{var c=r&&r.__esModule?()=>r.default:()=>r;return i.d(c,{a:c}),c},i.d=(r,c)=>{for(var h in c)i.o(c,h)&&!i.o(r,h)&&Object.defineProperty(r,h,{enumerable:!0,get:c[h]})},i.g=function(){if(typeof globalThis=="object")return globalThis;try{return this||new Function("return this")()}catch{if(typeof window=="object")return window}}(),i.o=(r,c)=>Object.prototype.hasOwnProperty.call(r,c);var o={};return(()=>{i.d(o,{default:()=>Rt});var r=i(3146),c=i.n(r);const h=function(V){return new RegExp(/<[a-z][\s\S]*>/i).test(V)},b=function(V,g){return Math.floor(Math.random()*(g-V+1))+V};var _="TYPE_CHARACTER",N="REMOVE_CHARACTER",Q="REMOVE_ALL",J="REMOVE_LAST_VISIBLE_NODE",G="PAUSE_FOR",re="CALL_FUNCTION",we="ADD_HTML_TAG_ELEMENT",me="CHANGE_DELETE_SPEED",te="CHANGE_DELAY",ve="CHANGE_CURSOR",Y="PASTE_STRING",ne="HTML_TAG";function ue(V){return ue=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(g){return typeof g}:function(g){return g&&typeof Symbol=="function"&&g.constructor===Symbol&&g!==Symbol.prototype?"symbol":typeof g},ue(V)}function fe(V,g){var T=Object.keys(V);if(Object.getOwnPropertySymbols){var C=Object.getOwnPropertySymbols(V);g&&(C=C.filter(function(ce){return Object.getOwnPropertyDescriptor(V,ce).enumerable})),T.push.apply(T,C)}return T}function O(V){for(var g=1;g<arguments.length;g++){var T=arguments[g]!=null?arguments[g]:{};g%2?fe(Object(T),!0).forEach(function(C){M(V,C,T[C])}):Object.getOwnPropertyDescriptors?Object.defineProperties(V,Object.getOwnPropertyDescriptors(T)):fe(Object(T)).forEach(function(C){Object.defineProperty(V,C,Object.getOwnPropertyDescriptor(T,C))})}return V}function de(V){return function(g){if(Array.isArray(g))return Ae(g)}(V)||function(g){if(typeof Symbol<"u"&&g[Symbol.iterator]!=null||g["@@iterator"]!=null)return Array.from(g)}(V)||function(g,T){if(g){if(typeof g=="string")return Ae(g,T);var C={}.toString.call(g).slice(8,-1);return C==="Object"&&g.constructor&&(C=g.constructor.name),C==="Map"||C==="Set"?Array.from(g):C==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(C)?Ae(g,T):void 0}}(V)||function(){throw new TypeError(`Invalid attempt to spread non-iterable instance.
|
||
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}()}function Ae(V,g){(g==null||g>V.length)&&(g=V.length);for(var T=0,C=Array(g);T<g;T++)C[T]=V[T];return C}function Kt(V,g){for(var T=0;T<g.length;T++){var C=g[T];C.enumerable=C.enumerable||!1,C.configurable=!0,"value"in C&&(C.writable=!0),Object.defineProperty(V,Qe(C.key),C)}}function M(V,g,T){return(g=Qe(g))in V?Object.defineProperty(V,g,{value:T,enumerable:!0,configurable:!0,writable:!0}):V[g]=T,V}function Qe(V){var g=function(T){if(ue(T)!="object"||!T)return T;var C=T[Symbol.toPrimitive];if(C!==void 0){var ce=C.call(T,"string");if(ue(ce)!="object")return ce;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(T)}(V);return ue(g)=="symbol"?g:g+""}const Rt=function(){function V(C,ce){var d=this;if(function(v,j){if(!(v instanceof j))throw new TypeError("Cannot call a class as a function")}(this,V),M(this,"state",{cursorAnimation:null,lastFrameTime:null,pauseUntil:null,eventQueue:[],eventLoop:null,eventLoopPaused:!1,reverseCalledEvents:[],calledEvents:[],visibleNodes:[],initialOptions:null,elements:{container:null,wrapper:document.createElement("span"),cursor:document.createElement("span")}}),M(this,"options",{strings:null,cursor:"|",delay:"natural",pauseFor:1500,deleteSpeed:"natural",loop:!1,autoStart:!1,devMode:!1,skipAddStyles:!1,wrapperClassName:"Typewriter__wrapper",cursorClassName:"Typewriter__cursor",stringSplitter:null,onCreateTextNode:null,onRemoveNode:null}),M(this,"setupWrapperElement",function(){d.state.elements.container&&(d.state.elements.wrapper.className=d.options.wrapperClassName,d.state.elements.cursor.className=d.options.cursorClassName,d.state.elements.cursor.innerHTML=d.options.cursor,d.state.elements.container.innerHTML="",d.state.elements.container.appendChild(d.state.elements.wrapper),d.state.elements.container.appendChild(d.state.elements.cursor))}),M(this,"start",function(){return d.state.eventLoopPaused=!1,d.runEventLoop(),d}),M(this,"pause",function(){return d.state.eventLoopPaused=!0,d}),M(this,"stop",function(){return d.state.eventLoop&&((0,r.cancel)(d.state.eventLoop),d.state.eventLoop=null),d}),M(this,"pauseFor",function(v){return d.addEventToQueue(G,{ms:v}),d}),M(this,"typeOutAllStrings",function(){return typeof d.options.strings=="string"?(d.typeString(d.options.strings).pauseFor(d.options.pauseFor),d):(d.options.strings.forEach(function(v){d.typeString(v).pauseFor(d.options.pauseFor).deleteAll(d.options.deleteSpeed)}),d)}),M(this,"typeString",function(v){var j=arguments.length>1&&arguments[1]!==void 0?arguments[1]:null;if(h(v))return d.typeOutHTMLString(v,j);if(v){var W=(d.options||{}).stringSplitter,q=typeof W=="function"?W(v):v.split("");d.typeCharacters(q,j)}return d}),M(this,"pasteString",function(v){var j=arguments.length>1&&arguments[1]!==void 0?arguments[1]:null;return h(v)?d.typeOutHTMLString(v,j,!0):(v&&d.addEventToQueue(Y,{character:v,node:j}),d)}),M(this,"typeOutHTMLString",function(v){var j=arguments.length>1&&arguments[1]!==void 0?arguments[1]:null,W=arguments.length>2?arguments[2]:void 0,q=function(Se){var Ce=document.createElement("div");return Ce.innerHTML=Se,Ce.childNodes}(v);if(q.length>0)for(var B=0;B<q.length;B++){var se=q[B],ke=se.innerHTML;se&&se.nodeType!==3?(se.innerHTML="",d.addEventToQueue(we,{node:se,parentNode:j}),W?d.pasteString(ke,se):d.typeString(ke,se)):se.textContent&&(W?d.pasteString(se.textContent,j):d.typeString(se.textContent,j))}return d}),M(this,"deleteAll",function(){var v=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"natural";return d.addEventToQueue(Q,{speed:v}),d}),M(this,"changeDeleteSpeed",function(v){if(!v)throw new Error("Must provide new delete speed");return d.addEventToQueue(me,{speed:v}),d}),M(this,"changeDelay",function(v){if(!v)throw new Error("Must provide new delay");return d.addEventToQueue(te,{delay:v}),d}),M(this,"changeCursor",function(v){if(!v)throw new Error("Must provide new cursor");return d.addEventToQueue(ve,{cursor:v}),d}),M(this,"deleteChars",function(v){if(!v)throw new Error("Must provide amount of characters to delete");for(var j=0;j<v;j++)d.addEventToQueue(N);return d}),M(this,"callFunction",function(v,j){if(!v||typeof v!="function")throw new Error("Callback must be a function");return d.addEventToQueue(re,{cb:v,thisArg:j}),d}),M(this,"typeCharacters",function(v){var j=arguments.length>1&&arguments[1]!==void 0?arguments[1]:null;if(!v||!Array.isArray(v))throw new Error("Characters must be an array");return v.forEach(function(W){d.addEventToQueue(_,{character:W,node:j})}),d}),M(this,"removeCharacters",function(v){if(!v||!Array.isArray(v))throw new Error("Characters must be an array");return v.forEach(function(){d.addEventToQueue(N)}),d}),M(this,"addEventToQueue",function(v,j){var W=arguments.length>2&&arguments[2]!==void 0&&arguments[2];return d.addEventToStateProperty(v,j,W,"eventQueue")}),M(this,"addReverseCalledEvent",function(v,j){var W=arguments.length>2&&arguments[2]!==void 0&&arguments[2];return d.options.loop?d.addEventToStateProperty(v,j,W,"reverseCalledEvents"):d}),M(this,"addEventToStateProperty",function(v,j){var W=arguments.length>2&&arguments[2]!==void 0&&arguments[2],q=arguments.length>3?arguments[3]:void 0,B={eventName:v,eventArgs:j||{}};return d.state[q]=W?[B].concat(de(d.state[q])):[].concat(de(d.state[q]),[B]),d}),M(this,"runEventLoop",function(){d.state.lastFrameTime||(d.state.lastFrameTime=Date.now());var v=Date.now(),j=v-d.state.lastFrameTime;if(!d.state.eventQueue.length){if(!d.options.loop)return;d.state.eventQueue=de(d.state.calledEvents),d.state.calledEvents=[],d.options=O({},d.state.initialOptions)}if(d.state.eventLoop=c()(d.runEventLoop),!d.state.eventLoopPaused){if(d.state.pauseUntil){if(v<d.state.pauseUntil)return;d.state.pauseUntil=null}var W,q=de(d.state.eventQueue),B=q.shift();if(!(j<=(W=B.eventName===J||B.eventName===N?d.options.deleteSpeed==="natural"?b(40,80):d.options.deleteSpeed:d.options.delay==="natural"?b(120,160):d.options.delay))){var se=B.eventName,ke=B.eventArgs;switch(d.logInDevMode({currentEvent:B,state:d.state,delay:W}),se){case Y:case _:var Se=ke.character,Ce=ke.node,We=document.createTextNode(Se),_e=We;d.options.onCreateTextNode&&typeof d.options.onCreateTextNode=="function"&&(_e=d.options.onCreateTextNode(Se,We)),_e&&(Ce?Ce.appendChild(_e):d.state.elements.wrapper.appendChild(_e)),d.state.visibleNodes=[].concat(de(d.state.visibleNodes),[{type:"TEXT_NODE",character:Se,node:_e}]);break;case N:q.unshift({eventName:J,eventArgs:{removingCharacterNode:!0}});break;case G:var zt=B.eventArgs.ms;d.state.pauseUntil=Date.now()+parseInt(zt);break;case re:var qe=B.eventArgs,Jt=qe.cb,Ft=qe.thisArg;Jt.call(Ft,{elements:d.state.elements});break;case we:var Ge=B.eventArgs,Oe=Ge.node,Me=Ge.parentNode;Me?Me.appendChild(Oe):d.state.elements.wrapper.appendChild(Oe),d.state.visibleNodes=[].concat(de(d.state.visibleNodes),[{type:ne,node:Oe,parentNode:Me||d.state.elements.wrapper}]);break;case Q:var Qt=d.state.visibleNodes,Be=ke.speed,Te=[];Be&&Te.push({eventName:me,eventArgs:{speed:Be,temp:!0}});for(var Ye=0,Ht=Qt.length;Ye<Ht;Ye++)Te.push({eventName:J,eventArgs:{removingCharacterNode:!1}});Be&&Te.push({eventName:me,eventArgs:{speed:d.options.deleteSpeed,temp:!0}}),q.unshift.apply(q,Te);break;case J:var Wt=B.eventArgs.removingCharacterNode;if(d.state.visibleNodes.length){var Le=d.state.visibleNodes.pop(),qt=Le.type,Ie=Le.node,Gt=Le.character;d.options.onRemoveNode&&typeof d.options.onRemoveNode=="function"&&d.options.onRemoveNode({node:Ie,character:Gt}),Ie&&Ie.parentNode.removeChild(Ie),qt===ne&&Wt&&q.unshift({eventName:J,eventArgs:{}})}break;case me:d.options.deleteSpeed=B.eventArgs.speed;break;case te:d.options.delay=B.eventArgs.delay;break;case ve:d.options.cursor=B.eventArgs.cursor,d.state.elements.cursor.innerHTML=B.eventArgs.cursor}d.options.loop&&(B.eventName===J||B.eventArgs&&B.eventArgs.temp||(d.state.calledEvents=[].concat(de(d.state.calledEvents),[B]))),d.state.eventQueue=q,d.state.lastFrameTime=v}}}),C)if(typeof C=="string"){var He=document.querySelector(C);if(!He)throw new Error("Could not find container element");this.state.elements.container=He}else this.state.elements.container=C;ce&&(this.options=O(O({},this.options),ce)),this.state.initialOptions=O({},this.options),this.init()}var g,T;return g=V,(T=[{key:"init",value:function(){var C,ce;this.setupWrapperElement(),this.addEventToQueue(ve,{cursor:this.options.cursor},!0),this.addEventToQueue(Q,null,!0),!window||window.___TYPEWRITER_JS_STYLES_ADDED___||this.options.skipAddStyles||(C=".Typewriter__cursor{-webkit-animation:Typewriter-cursor 1s infinite;animation:Typewriter-cursor 1s infinite;margin-left:1px}@-webkit-keyframes Typewriter-cursor{0%{opacity:0}50%{opacity:1}100%{opacity:0}}@keyframes Typewriter-cursor{0%{opacity:0}50%{opacity:1}100%{opacity:0}}",(ce=document.createElement("style")).appendChild(document.createTextNode(C)),document.head.appendChild(ce),window.___TYPEWRITER_JS_STYLES_ADDED___=!0),this.options.autoStart===!0&&this.options.strings&&this.typeOutAllStrings().start()}},{key:"logInDevMode",value:function(C){this.options.devMode&&console.log(C)}}])&&Kt(g.prototype,T),Object.defineProperty(g,"prototype",{writable:!1}),V}()})(),o.default})())})(kt);var Cn=kt.exports;const nt=Sn(Cn),_n=[{text:"帝高阳之苗裔兮,朕皇考曰伯庸。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"摄提贞于孟陬兮,惟庚寅吾以降。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"皇览揆余初度兮,肇锡余以嘉名。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"名余曰正则兮,字余曰灵均。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"纷吾既有此内美兮,又重之以修能。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"扈江离与辟芷兮,纫秋兰以为佩。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"汩余若将不及兮,恐年岁之不吾与。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"朝搴阰之木兰兮,夕揽洲之宿莽。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"日月忽其不淹兮,春与秋其代序。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"惟草木之零落兮,恐美人之迟暮。(惟 通:唯)",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"不抚壮而弃秽兮,何不改此度?(改此度 一作:改乎此度)",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"乘骐骥以驰骋兮,来吾道夫先路!",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"昔三后之纯粹兮,固众芳之所在。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"杂申椒与菌桂兮,岂惟纫夫蕙茝!",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"彼尧舜之耿介兮,既遵道而得路。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"何桀纣之猖披兮,夫唯捷径以窘步。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"惟夫党人之偷乐兮,路幽昧以险隘。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"岂余身之惮殃兮,恐皇舆之败绩!",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"忽奔走以先后兮,及前王之踵武。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"荃不查余之中情兮,反信谗而齌怒。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"余固知謇謇之为患兮,忍而不能舍也。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"指九天以为正兮,夫唯灵修之故也。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"曰黄昏以为期兮,羌中道而改路!",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"初既与余成言兮,后悔遁而有他。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"余既不难夫离别兮,伤灵修之数化。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"余既滋兰之九畹兮,又树蕙之百亩。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"畦留夷与揭车兮,杂杜衡与芳芷。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"冀枝叶之峻茂兮,愿俟时乎吾将刈。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"虽萎绝其亦何伤兮,哀众芳之芜秽。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"众皆竞进以贪婪兮,凭不厌乎求索。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"羌内恕己以量人兮,各兴心而嫉妒。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"忽驰骛以追逐兮,非余心之所急。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"老冉冉其将至兮,恐修名之不立。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"朝饮木兰之坠露兮,夕餐秋菊之落英。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"苟余情其信姱以练要兮,长顑颔亦何伤。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"掔木根以结茝兮,贯薜荔之落蕊。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"矫菌桂以纫蕙兮,索胡绳之纚纚。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"謇吾法夫前修兮,非世俗之所服。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"虽不周于今之人兮,愿依彭咸之遗则。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"长太息以掩涕兮,哀民生之多艰。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"余虽好修姱以鞿羁兮,謇朝谇而夕替。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"既替余以蕙纕兮,又申之以揽茝。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"亦余心之所善兮,虽九死其犹未悔。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"怨灵修之浩荡兮,终不察夫民心。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"众女嫉余之蛾眉兮,谣诼谓余以善淫。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"固时俗之工巧兮,偭规矩而改错。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"背绳墨以追曲兮,竞周容以为度。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"忳郁邑余侘傺兮,吾独穷困乎此时也。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"宁溘死以流亡兮,余不忍为此态也。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"鸷鸟之不群兮,自前世而固然。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"何方圜之能周兮,夫孰异道而相安?",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"屈心而抑志兮,忍尤而攘诟。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"伏清白以死直兮,固前圣之所厚。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"悔相道之不察兮,延伫乎吾将反。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"回朕车以复路兮,及行迷之未远。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"步余马于兰皋兮,驰椒丘且焉止息。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"进不入以离尤兮,退将复修吾初服。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"制芰荷以为衣兮,集芙蓉以为裳。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"不吾知其亦已兮,苟余情其信芳。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"高余冠之岌岌兮,长余佩之陆离。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"芳与泽其杂糅兮,唯昭质其犹未亏。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"忽反顾以游目兮,将往观乎四荒。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"佩缤纷其繁饰兮,芳菲菲其弥章。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"民生各有所乐兮,余独好修以为常。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"虽体解吾犹未变兮,岂余心之可惩。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"女媭之婵媛兮,申申其詈予,曰:",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"鲧婞直以亡身兮,终然夭乎羽之野。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"汝何博謇而好修兮,纷独有此姱节?",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"薋菉葹以盈室兮,判独离而不服。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"众不可户说兮,孰云察余之中情?",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"世并举而好朋兮,夫何茕独而不予听?",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"依前圣以节中兮,喟凭心而历兹。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"济沅湘以南征兮,就重华而陈词:",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"启《九辩》与《九歌》兮,夏康娱以自纵。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"不顾难以图后兮,五子用失乎家衖。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"羿淫游以佚畋兮,又好射夫封狐。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"固乱流其鲜终兮,浞又贪夫厥家。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"浇身被服强圉兮,纵欲而不忍。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"日康娱而自忘兮,厥首用夫颠陨。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"夏桀之常违兮,乃遂焉而逢殃。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"后辛之菹醢兮,殷宗用而不长。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"汤禹俨而祗敬兮,周论道而莫差。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"举贤才而授能兮,循绳墨而不颇。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"皇天无私阿兮,览民德焉错辅。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"夫维圣哲以茂行兮,苟得用此下土。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"瞻前而顾后兮,相观民之计极。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"夫孰非义而可用兮?孰非善而可服?",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"阽余身而危死兮,览余初其犹未悔。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"不量凿而正枘兮,固前修以菹醢。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"曾歔欷余郁邑兮,哀朕时之不当。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"揽茹蕙以掩涕兮,沾余襟之浪浪。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"跪敷衽以陈辞兮,耿吾既得此中正。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"驷玉虬以椉鹥兮,溘埃风余上征。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"朝发轫于苍梧兮,夕余至乎县圃。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"欲少留此灵琐兮,日忽忽其将暮。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"吾令羲和弭节兮,望崦嵫而勿迫。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"路曼曼其修远兮,吾将上下而求索。(曼曼 一作:漫漫)",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"饮余马于咸池兮,总余辔乎扶桑。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"折若木以拂日兮,聊逍遥以相羊。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"前望舒使先驱兮,后飞廉使奔属。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"鸾皇为余先戒兮,雷师告余以未具。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"吾令凤鸟飞腾兮,继之以日夜。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"飘风屯其相离兮,帅云霓而来御。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"纷总总其离合兮,斑陆离其上下。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"吾令帝阍开关兮,倚阊阖而望予。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"时暧暧其将罢兮,结幽兰而延伫。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"世溷浊而不分兮,好蔽美而嫉妒。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"朝吾将济于白水兮,登阆风而绁马。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"忽反顾以流涕兮,哀高丘之无女。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"溘吾游此春宫兮,折琼枝以继佩。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"及荣华之未落兮,相下女之可诒。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"吾令丰隆乘云兮,求宓妃之所在。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"解佩纕以结言兮,吾令謇修以为理。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"纷总总其离合兮,忽纬繣其难迁。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"夕归次于穷石兮,朝濯发乎洧盘。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"保厥美以骄傲兮,日康娱以淫游。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"虽信美而无礼兮,来违弃而改求。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"览相观于四极兮,周流乎天余乃下。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"望瑶台之偃蹇兮,见有娀之佚女。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"吾令鸩为媒兮,鸩告余以不好。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"雄鸠之鸣逝兮,余犹恶其佻巧。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"心犹豫而狐疑兮,欲自适而不可。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"凤皇既受诒兮,恐高辛之先我。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"欲远集而无所止兮,聊浮游以逍遥。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"及少康之未家兮,留有虞之二姚。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"理弱而媒拙兮,恐导言之不固。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"世溷浊而嫉贤兮,好蔽美而称恶。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"闺中既以邃远兮,哲王又不寤。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"怀朕情而不发兮,余焉能忍而与此终古?",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"索琼茅以筳篿兮,命灵氛为余占之。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"曰:两美其必合兮,孰信修而慕之?",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"思九州之博大兮,岂惟是其有女?",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"曰:勉远逝而无狐疑兮,孰求美而释女?",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"何所独无芳草兮,尔何怀乎故宇?",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"世幽昧以昡曜兮,孰云察余之善恶?",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"民好恶其不同兮,惟此党人其独异!",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"户服艾以盈要兮,谓幽兰其不可佩。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"览察草木其犹未得兮,岂珵美之能当?",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"苏粪壤以充帏兮,谓申椒其不芳。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"欲从灵氛之吉占兮,心犹豫而狐疑。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"巫咸将夕降兮,怀椒糈而要之。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"百神翳其备降兮,九疑缤其并迎。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"皇剡剡其扬灵兮,告余以吉故。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"曰:勉升降以上下兮,求矩矱之所同。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"汤禹俨而求合兮,挚咎繇而能调。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"苟中情其好修兮,又何必用夫行媒?",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"说操筑于傅岩兮,武丁用而不疑。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"吕望之鼓刀兮,遭周文而得举。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"宁戚之讴歌兮,齐桓闻以该辅。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"及年岁之未晏兮,时亦犹其未央。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"恐鹈鴂之先鸣兮,使夫百草为之不芳。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"何琼佩之偃蹇兮,众薆然而蔽之。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"惟此党人之不谅兮,恐嫉妒而折之。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"时缤纷其变易兮,又何可以淹留?",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"兰芷变而不芳兮,荃蕙化而为茅。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"何昔日之芳草兮,今直为此萧艾也?",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"岂其有他故兮,莫好修之害也!",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"余以兰为可恃兮,羌无实而容长。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"委厥美以从俗兮,苟得列乎众芳。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"椒专佞以慢慆兮,樧又欲充夫佩帏。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"既干进而务入兮,又何芳之能祗?",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"固时俗之流从兮,又孰能无变化?",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"览椒兰其若兹兮,又况揭车与江离?",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"惟兹佩之可贵兮,委厥美而历兹。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"芳菲菲而难亏兮,芬至今犹未沬。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"和调度以自娱兮,聊浮游而求女。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"及余饰之方壮兮,周流观乎上下。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"灵氛既告余以吉占兮,历吉日乎吾将行。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"折琼枝以为羞兮,精琼爢以为粻。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"为余驾飞龙兮,杂瑶象以为车。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"何离心之可同兮?吾将远逝以自疏。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"邅吾道夫昆仑兮,路修远以周流。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"扬云霓之晻蔼兮,鸣玉鸾之啾啾。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"朝发轫于天津兮,夕余至乎西极。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"凤皇翼其承旗兮,高翱翔之翼翼。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"忽吾行此流沙兮,遵赤水而容与。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"麾蛟龙使梁津兮,诏西皇使涉予。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"路修远以多艰兮,腾众车使径待。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"路不周以左转兮,指西海以为期。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"屯余车其千乘兮,齐玉轪而并驰。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"驾八龙之婉婉兮,载云旗之委蛇。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"抑志而弭节兮,神高驰之邈邈。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"奏《九歌》而舞《韶》兮,聊假日以媮乐。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"陟升皇之赫戏兮,忽临睨夫旧乡。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"仆夫悲余马怀兮,蜷局顾而不行。",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"乱曰:已矣哉!",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"国无人莫我知兮,又何怀乎故都!",author:"屈原",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"},{text:"既莫足与为美政兮,吾将从彭咸之所居!",author:"离骚",contributor:"Sunwuyuan",link:"https://www.gushiwen.cn/shiwenv.aspx?id=f5714bcd33e3"}],st={quotes:_n},it={text:"点击此处可以查看 Classworks 用户群里沙雕群友们的发言",author:"点击后会复制当前句子到剪贴板中"},ot={main:{delay:50,deleteSpeed:100},source:{delay:10,deleteSpeed:10,cursor:""}},Vn={name:"EchoChamberCard",components:{SettingsCard:R},data:()=>({typewriter:null,sourceWriter:null,currentQuote:it,hasClicked:!1}),mounted(){this.initTypewriters()},methods:{initTypewriters(){this.typewriter=new nt(this.$refs.typewriter,ot.main),this.sourceWriter=new nt(this.$refs.sourceWriter,ot.source),this.typeQuote(it)},typeQuote(s){this.typewriter.deleteAll(30).typeString(s.text).start(),s.author&&this.sourceWriter.deleteAll(20).typeString(s.author).start()},async handleClick(){this.hasClicked||(this.hasClicked=!0),await this.copyToClipboard(),this.currentQuote=this.getRandomQuote(),this.typeQuote(this.currentQuote)},getRandomQuote(){return st.quotes[Math.floor(Math.random()*st.quotes.length)]},async copyToClipboard(){if(!this.currentQuote)return;const{text:s,author:e,contributor:l,link:u}=this.currentQuote,i=[s,e&&`作者:${e}`,l&&`贡献者:${l}`,(u||l)&&`来源:${u||`https://github.com/${l}`}`].filter(Boolean);try{await navigator.clipboard.writeText(i.join(`
|
||
`))}catch(o){console.error("复制失败:",o)}}},beforeUnmount(){[this.typewriter,this.sourceWriter].forEach(s=>s==null?void 0:s.stop())}},Dn={ref:"typewriter",class:"typewriter-text"},Tn={ref:"sourceWriter",class:"source-text"};function In(s,e,l,u,i,o){const r=R;return m(),f(r,{border:"",title:"回声洞",icon:"mdi-thought-bubble",onClick:o.handleClick},{default:n(()=>[t(E,null,{default:n(()=>[w("div",Dn,null,512),w("div",Tn,null,512)]),_:1}),t(Zt,{name:"fade"},{default:n(()=>{var c;return[(c=s.currentQuote)!=null&&c.contributor?(m(),f(he,{key:0,class:"contributor"},{default:n(()=>[t(rt,{start:""},{default:n(()=>[t(ut,{src:`https://github.com/${s.currentQuote.contributor}.png`},null,8,["src"])]),_:1}),a(" "+k(s.currentQuote.contributor),1)]),_:1})):S("",!0)]}),_:1})]),_:1},8,["onClick"])}const xt=z(Vn,[["render",In],["__scopeId","data-v-5c15976c"]]),Nn="classworks",En="module",Un="0.0.0",jn={dev:"vite --host",build:"vite build",preview:"vite preview",lint:"eslint . --fix"},An={"@examaware-cs/core":"^1.0.0","@examaware-cs/player":"^1.0.2","@mdi/font":"7.4.47","@microsoft/clarity":"^1.0.0","@vueuse/core":"^13.9.0",axios:"^1.11.0",idb:"^8.0.3","js-base64":"^3.7.8","js-yaml":"^4.1.0","lucide-vue-next":"^0.545.0",marked:"^16.4.0","pinyin-pro":"^3.27.0","ratelimit-header-parser":"^0.1.0","roboto-fontface":"*","socket.io-client":"^4.8.1","typewriter-effect":"^2.21.0",uuid:"^9.0.1",vue:"^3.5.20","vue-sonner":"^2.0.9",vuetify:"^3.9.6"},On={"@eslint/js":"^9.14.0","@vite-pwa/assets-generator":"^1.0.0","@vitejs/plugin-vue":"^5.2.3",eslint:"^9.14.0","eslint-plugin-import":"^2.29.1","eslint-plugin-n":"^16.6.2","eslint-plugin-node":"^11.1.0","eslint-plugin-promise":"^6.4.0","eslint-plugin-vue":"^9.30.0",pinia:"^3.0.3",sass:"1.86.3","sass-embedded":"^1.86.3","unplugin-auto-import":"^19.1.2","unplugin-fonts":"^1.3.1","unplugin-vue-components":"^28.4.1","unplugin-vue-router":"^0.12.0",vite:"^5.4.17","vite-plugin-pwa":"^1.0.3","vite-plugin-vue-layouts":"^0.11.0","vite-plugin-vuetify":"^2.1.2","vue-router":"^4.5.1"},lt={name:Nn,private:!0,type:En,version:Un,scripts:jn,dependencies:An,devDependencies:On},Mn={name:"AboutCard",setup(){const s=Xe([]),e=Xe(!1),l=()=>{try{const i={...lt.dependencies||{},...lt.devDependencies||{}},o=Object.entries(i).map(([r,c])=>({name:r,version:c.replace(/[\^~]/g,""),description:u(r)}));s.value=o}catch(i){console.error("加载依赖信息失败:",i),s.value=[]}},u=i=>({vue:"渐进式 JavaScript 框架",vuetify:"材料设计组件框架",axios:"Promise 基础的 HTTP 客户端",pinia:"Vue 状态管理库","vue-router":"Vue.js 官方路由管理器","@vitejs/plugin-vue":"Vite 的 Vue 插件"})[i]||"";return Xt(()=>{l()}),{Dependencies:s,showDeps:e}}},Bn={class:"d-flex flex-column align-start"},Ln={class:"d-flex gap-2 flex-wrap mb-6"},Pn={class:"text-caption text-medium-emphasis"};function Kn(s,e,l,u,i,o){return m(),f(U,{border:""},{default:n(()=>[t(je,null,{prepend:n(()=>[t(x,{icon:"mdi-information",size:"large",class:"mr-2"})]),default:n(()=>[t(F,{class:"text-h6"},{default:n(()=>[...e[3]||(e[3]=[a("关于",-1)])]),_:1})]),_:1}),t(E,null,{default:n(()=>[t(be,null,{default:n(()=>[t(ae,{cols:"12",md:"8",class:"mx-auto"},{default:n(()=>[w("div",Bn,[t(rt,{size:"120",class:"mb-4"},{default:n(()=>[t(ut,{src:"https://github.com/SunWuyuan.png",alt:"Sunwuyuan"})]),_:1}),e[20]||(e[20]=w("h2",{class:"text-h5 mb-2"},"Classworks",-1)),e[21]||(e[21]=w("p",{class:"text-body-1 mb-4"},"适用于班级大屏的作业板小工具",-1)),w("div",Ln,[t(p,{color:"red",variant:"tonal",href:"https://github.com/ClassworksDev/Classworks/issues",target:"_blank","prepend-icon":"mdi-bug"},{default:n(()=>[...e[4]||(e[4]=[a(" 报告问题 ",-1)])]),_:1}),t(p,{color:"primary",variant:"tonal",href:"https://qm.qq.com/q/qNBX4ZZVeg",target:"_blank","prepend-icon":"mdi-qqchat"},{default:n(()=>[...e[5]||(e[5]=[a(" QQ 群 ",-1)])]),_:1}),t(p,{variant:"text",href:"https://github.com/ClassworksDev/Classworks",target:"_blank","prepend-icon":"mdi-github"},{default:n(()=>[...e[6]||(e[6]=[a(" 前端 ",-1)])]),_:1}),t(p,{variant:"text",href:"https://github.com/ClassworksDev/ClassworksServer",target:"_blank","prepend-icon":"mdi-github"},{default:n(()=>[...e[7]||(e[7]=[a(" 后端 ",-1)])]),_:1})]),t(A,{class:"mb-4 w-100"}),e[22]||(e[22]=w("h3",{class:"text-h6 mb-2"},"备注与致谢",-1)),t(P,{class:"mb-4 bg-transparent"},{default:n(()=>[t(D,{href:"https://github.com/EnderWolf006/HomeworkBoard",target:"_blank","append-icon":"mdi-link"},{default:n(()=>[t(K,null,{default:n(()=>[...e[8]||(e[8]=[a(" 本项目受到 HomeworkBoard 的启发而开发 ",-1)])]),_:1}),t(Z,null,{default:n(()=>[...e[9]||(e[9]=[a(" 感谢 EnderWolf006 (@EnderWolf) fhzit(@Hellofhz) KeyFac 等人的贡献 ",-1)])]),_:1})]),_:1}),t(D,{href:"https://hlyun.org",target:"_blank","append-icon":"mdi-link"},{default:n(()=>[t(K,null,{default:n(()=>[...e[10]||(e[10]=[a(" Classworks 由",-1),w("strong",null,"厚浪云",-1),a("提供 ",-1)])]),_:1}),t(Z,null,{default:n(()=>[...e[11]||(e[11]=[a(" 长江后浪推前浪 浮事新人换旧人 ",-1)])]),_:1})]),_:1}),t(D,{href:"https://zerocat.houlangs.com",target:"_blank","append-icon":"mdi-link"},{default:n(()=>[t(K,null,{default:n(()=>[...e[12]||(e[12]=[a(" 感谢 ZeroCat 社区的开发者们 ",-1)])]),_:1}),t(Z,null,{default:n(()=>[...e[13]||(e[13]=[a(" 新一代,开源,编程社区 ",-1)])]),_:1})]),_:1}),t(A,{class:"ma-1"}),t(D,{href:"https://github.com/HUSX100/IslandCaller",target:"_blank","append-icon":"mdi-link"},{default:n(()=>[t(K,null,{default:n(()=>[...e[14]||(e[14]=[a(" 本项目与 IslandCaller 没有从属关系 ",-1)])]),_:1}),t(Z,null,{default:n(()=>[...e[15]||(e[15]=[a(" IslandCaller 是由 HUSX100 开发的基于 ClassIsland 提醒服务的轻量级点名器 ",-1)])]),_:1})]),_:1}),t(D,{href:"https://classisland.tech",target:"_blank","append-icon":"mdi-link"},{default:n(()=>[t(K,null,{default:n(()=>[...e[16]||(e[16]=[a(" 本项目与 ClassIsland 没有从属关系 ",-1)])]),_:1}),t(Z,null,{default:n(()=>[...e[17]||(e[17]=[a(" ClassIsland 是由 HelloWRC 开发的适用于班级大屏的课表信息显示工具 ",-1)])]),_:1})]),_:1})]),_:1}),t(p,{variant:"text",class:"mb-4","prepend-icon":"mdi-package-variant",onClick:e[0]||(e[0]=r=>u.showDeps=!0)},{default:n(()=>[...e[18]||(e[18]=[a(" 查看使用的第三方库 ",-1)])]),_:1}),t(pe,{modelValue:u.showDeps,"onUpdate:modelValue":e[2]||(e[2]=r=>u.showDeps=r),transition:"dialog-bottom-transition",fullscreen:""},{default:n(()=>[t(U,null,{default:n(()=>[t(hn,null,{default:n(()=>[t(p,{icon:"mdi-close",onClick:e[1]||(e[1]=r=>u.showDeps=!1)}),t(mn,null,{default:n(()=>[...e[19]||(e[19]=[a("使用的第三方库",-1)])]),_:1}),t(H)]),_:1}),t(E,null,{default:n(()=>[t(P,null,{default:n(()=>[(m(!0),I($,null,le(u.Dependencies,r=>(m(),f(D,{key:r.name,href:"https://www.npmjs.com/package/"+r.name,target:"_blank","append-icon":"mdi-link"},{default:n(()=>[t(K,null,{default:n(()=>[a(k(r.name),1)]),_:2},1024),t(Z,null,{default:n(()=>[a(" v"+k(r.version),1)]),_:2},1024)]),_:2},1032,["href"]))),128))]),_:1})]),_:1})]),_:1})]),_:1},8,["modelValue"]),w("p",Pn," Copyright © "+k(new Date().getFullYear())+" Sunwuyuan ",1)])]),_:1})]),_:1})]),_:1})]),_:1})}const St=z(Mn,[["render",Kn]]),Rn={name:"SettingItem",props:{settingKey:{type:String,required:!0},icon:{type:String,default:null},disabled:{type:Boolean,default:!1},title:{type:String,default:null},description:{type:String,default:null}},data(){return{localValue:null,definition:null,type:null,selectOptions:[],hasOptions:!1,minValue:0,maxValue:100,stepValue:1,showSnackbar:!1,snackbarText:"",fontFamilies:[{title:"Arial",value:"Arial, sans-serif"},{title:"Calibri",value:"Calibri, sans-serif"},{title:"Cambria",value:"Cambria, serif"},{title:"Consolas",value:"Consolas, monospace"},{title:"Courier New",value:"Courier New, monospace"},{title:"Georgia",value:"Georgia, serif"},{title:"Helvetica",value:"Helvetica, sans-serif"},{title:"Segoe UI",value:"Segoe UI, sans-serif"},{title:"Times New Roman",value:"Times New Roman, serif"},{title:"Trebuchet MS",value:"Trebuchet MS, sans-serif"},{title:"Verdana",value:"Verdana, sans-serif"},{title:"Monospace",value:"monospace"},{title:"Sans-serif",value:"sans-serif"},{title:"Serif",value:"serif"}],displayValueMappings:{"display.emptySubjectDisplay":{card:"卡片",button:"按钮"},"theme.mode":{light:"浅色",dark:"深色"},"server.provider":{classworkscloud:"Classworks云端存储","kv-local":"KV本地存储","kv-server":"KV远程服务器"}},defaultIcons:{boolean:"mdi-toggle-switch-outline",number:"mdi-numeric",string:"mdi-form-textbox"}}},computed:{displayTitle(){if(this.title)return this.title;if(this.definition&&this.definition.description)return this.definition.description;const s=this.settingKey.split(".");return s[s.length-1]},displayDescription(){return this.description?this.description:this.settingKey},isFontFamily(){return this.settingKey.toLowerCase().includes("fontfamily")||this.settingKey.toLowerCase().includes("font.family")},isDefaultValue(){return this.definition?typeof this.localValue=="object"&&this.localValue!==null?JSON.stringify(this.localValue)===JSON.stringify(this.definition.default):this.localValue===this.definition.default:!0},settingIcon(){return this.icon?this.icon:this.definition&&this.definition.icon?this.definition.icon:this.defaultIcons[this.type]||"mdi-cog-outline"}},created(){this.loadSetting()},methods:{loadSetting(){if(this.definition=$t(this.settingKey),!this.definition){console.error(`未找到设置项定义: ${this.settingKey}`);return}if(this.type=this.definition.type,this.localValue=y(this.settingKey),this.type==="string"){if(this.isFontFamily)this.selectOptions=this.fontFamilies,this.hasOptions=!0;else if(this.settingKey in this.displayValueMappings){const s=this.displayValueMappings[this.settingKey];this.selectOptions=Object.entries(s).map(([e,l])=>({title:l,value:e})),this.hasOptions=!0}else if(this.definition.validate){const e=this.definition.validate.toString().match(/\[(.*?)\]/);if(e){const u=e[1].split(",").map(i=>{const o=i.trim().replace(/['"]/g,"");return{title:this.getDisplayValue(o)||o,value:o}});u.length>0&&(this.selectOptions=u,this.hasOptions=!0)}}}if(this.type==="number"&&this.definition.validate){const s=this.definition.validate.toString(),e=s.match(/value\s*>=\s*(\d+)/);e&&(this.minValue=Number(e[1]));const l=s.match(/value\s*<=\s*(\d+)/);l&&(this.maxValue=Number(l[1]));const u=this.maxValue-this.minValue;u>100?this.stepValue=10:u>20?this.stepValue=5:u>10?this.stepValue=2:this.stepValue=1}},getDisplayValue(s){return this.settingKey in this.displayValueMappings&&this.displayValueMappings[this.settingKey][s]||s},updateSetting(s){let e=s;this.type==="boolean"?e=!!s:this.type==="number"&&(e=Number(s),e<this.minValue&&(e=this.minValue),e>this.maxValue&&(e=this.maxValue)),xe(this.settingKey,e)?this.$emit("update",this.settingKey,e):(this.localValue=y(this.settingKey),this.$emit("error",this.settingKey))},adjustValue(s){if(this.type!=="number")return;const e=this.localValue+s;e>=this.minValue&&e<=this.maxValue&&(this.localValue=e,this.updateSetting(e))},copySettingId(){navigator.clipboard.writeText(this.settingKey).then(()=>{this.showSnackbarMessage("设置ID已复制到剪贴板")}).catch(s=>{console.error("复制失败:",s)})},copySettingValue(){let s="";typeof this.localValue=="object"&&this.localValue!==null?s=JSON.stringify(this.localValue):s=String(this.localValue),navigator.clipboard.writeText(s).then(()=>{this.showSnackbarMessage("设置值已复制到剪贴板")}).catch(e=>{console.error("复制失败:",e)})},resetToDefault(){this.definition&&(dt(this.settingKey),this.localValue=y(this.settingKey),this.showSnackbarMessage("已重置为默认值"),this.$emit("update",this.settingKey,this.localValue))},showSnackbarMessage(s){this.snackbarText=s,this.showSnackbar=!0}}},zn={class:"text-caption text-grey-darken-1"},Jn={class:"d-flex flex-column flex-sm-row align-center"},Fn={key:0,class:"me-2"},Qn={key:2,class:"d-flex align-center"},Hn={key:0,class:"px-4 pb-2 pt-0"};function Wn(s,e,l,u,i,o){return m(),I($,null,[t(D,{class:"setting-item",disabled:l.disabled},{prepend:n(()=>[t(x,{icon:o.settingIcon},null,8,["icon"])]),append:n(()=>[w("div",Jn,[i.type!=="string"||i.hasOptions?(m(),I("div",Fn,[i.type==="boolean"?(m(),f(ct,{key:0,modelValue:i.localValue,"onUpdate:modelValue":[e[0]||(e[0]=r=>i.localValue=r),o.updateSetting],density:"comfortable","hide-details":"",disabled:l.disabled},null,8,["modelValue","disabled","onUpdate:modelValue"])):i.type==="string"&&i.hasOptions?(m(),f(ht,{key:1,modelValue:i.localValue,"onUpdate:modelValue":[e[1]||(e[1]=r=>i.localValue=r),o.updateSetting],items:i.selectOptions,density:"compact","hide-details":"",disabled:l.disabled,class:"setting-select",variant:"outlined","bg-color":"surface","item-title":"title","item-value":"value"},null,8,["modelValue","items","disabled","onUpdate:modelValue"])):i.type==="number"?(m(),I("div",Qn,[t(p,{icon:"mdi-minus",size:"small",variant:"text",disabled:l.disabled||i.localValue<=i.minValue,onClick:e[2]||(e[2]=r=>o.adjustValue(-i.stepValue))},null,8,["disabled"]),t(L,{modelValue:i.localValue,"onUpdate:modelValue":[e[3]||(e[3]=r=>i.localValue=r),o.updateSetting],modelModifiers:{number:!0},type:"number",density:"compact","hide-details":"",min:i.minValue,max:i.maxValue,step:i.stepValue,disabled:l.disabled,class:"mx-2 setting-number-field",style:{width:"80px"},variant:"outlined","bg-color":"surface"},null,8,["modelValue","min","max","step","disabled","onUpdate:modelValue"]),t(p,{icon:"mdi-plus",size:"small",variant:"text",disabled:l.disabled||i.localValue>=i.maxValue,onClick:e[4]||(e[4]=r=>o.adjustValue(i.stepValue))},null,8,["disabled"])])):S("",!0)])):S("",!0),t(mt,{location:"bottom"},{activator:n(({props:r})=>[t(p,Ke({icon:"mdi-dots-vertical",size:"small",variant:"text"},r,{class:"ml-2",disabled:l.disabled}),null,16,["disabled"])]),default:n(()=>[t(P,{density:"compact"},{default:n(()=>[t(D,{onClick:o.copySettingId},{prepend:n(()=>[t(x,{icon:"mdi-key",size:"small"})]),default:n(()=>[t(K,null,{default:n(()=>[...e[7]||(e[7]=[a("复制设置ID",-1)])]),_:1})]),_:1},8,["onClick"]),t(D,{onClick:o.copySettingValue},{prepend:n(()=>[t(x,{icon:"mdi-content-copy",size:"small"})]),default:n(()=>[t(K,null,{default:n(()=>[...e[8]||(e[8]=[a("复制设置值",-1)])]),_:1})]),_:1},8,["onClick"]),t(A),t(D,{onClick:o.resetToDefault,disabled:o.isDefaultValue},{prepend:n(()=>[t(x,{icon:"mdi-restore",size:"small"})]),default:n(()=>[t(K,null,{default:n(()=>[...e[9]||(e[9]=[a("重置为默认值",-1)])]),_:1})]),_:1},8,["onClick","disabled"])]),_:1})]),_:1})])]),default:n(()=>[t(K,{class:"text-wrap"},{default:n(()=>[a(k(o.displayTitle),1)]),_:1}),t(Z,{class:"d-flex align-center text-wrap"},{default:n(()=>[w("span",zn,k(l.settingKey),1)]),_:1})]),_:1},8,["disabled"]),i.type==="string"&&!i.hasOptions?(m(),I("div",Hn,[t(L,{modelValue:i.localValue,"onUpdate:modelValue":[e[5]||(e[5]=r=>i.localValue=r),o.updateSetting],density:"compact","hide-details":"",disabled:l.disabled,class:"setting-text-field mt-1",variant:"outlined","bg-color":"surface"},null,8,["modelValue","disabled","onUpdate:modelValue"])])):S("",!0),t(Je,{modelValue:i.showSnackbar,"onUpdate:modelValue":e[6]||(e[6]=r=>i.showSnackbar=r),timeout:2e3,color:"success",location:"top"},{default:n(()=>[a(k(i.snackbarText),1)]),_:1},8,["modelValue"])],64)}const ye=z(Rn,[["render",Wn],["__scopeId","data-v-c47b37f3"]]),qn={name:"SettingsExplorer",components:{SettingItem:ye},data(){return{searchQuery:"",currentSettings:{},unwatchFunction:null}},computed:{isDeveloperMode(){return y("developer.enabled")},allSettings(){var e;const s=[];for(const[l,u]of Object.entries(Re))this.searchQuery&&!l.toLowerCase().includes(this.searchQuery.toLowerCase())&&!((e=u.description)!=null&&e.toLowerCase().includes(this.searchQuery.toLowerCase()))||s.push({key:l,...u});return s},formattedSettings(){return JSON.stringify(this.currentSettings,null,2)}},created(){this.updateCurrentSettings(),this.unwatchFunction=Fe(()=>{this.updateCurrentSettings()})},beforeUnmount(){this.unwatchFunction&&this.unwatchFunction()},methods:{updateCurrentSettings(){this.currentSettings=Ne()},onSettingUpdate(s,e){this.$emit("update",s,e),this.updateCurrentSettings()},onSettingError(s){this.$emit("error",s)},copySettingsToClipboard(){navigator.clipboard.writeText(JSON.stringify(this.currentSettings)).then(()=>{this.$emit("message",{type:"success",text:"设置已复制到剪贴板"})}).catch(s=>{console.error("复制到剪贴板失败:",s),this.$emit("message",{type:"error",text:"复制到剪贴板失败"})})}}},Gn={class:"settings-explorer"},Yn={class:"settings-json"};function Zn(s,e,l,u,i,o){const r=ye;return m(),I("div",Gn,[w("div",null,[t(L,{modelValue:i.searchQuery,"onUpdate:modelValue":e[0]||(e[0]=c=>i.searchQuery=c),label:"搜索设置","prepend-inner-icon":"mdi-magnify",clearable:"",variant:"outlined",density:"comfortable",class:"mb-4"},null,8,["modelValue"]),t(P,null,{default:n(()=>[(m(!0),I($,null,le(o.allSettings,c=>(m(),I("div",{key:c.key},[(m(),f(r,{key:c.key,"setting-key":c.key,disabled:c.requireDeveloper&&!o.isDeveloperMode,onUpdate:o.onSettingUpdate,onError:o.onSettingError},null,8,["setting-key","disabled","onUpdate","onError"])),t(A,{class:"my-2"})]))),128))]),_:1}),t(U,{border:""},{default:n(()=>[t(F,{class:"text-subtitle-1"},{default:n(()=>[...e[1]||(e[1]=[a("当前配置",-1)])]),_:1}),t(E,null,{default:n(()=>[w("pre",Yn,k(o.formattedSettings),1)]),_:1}),t(X,null,{default:n(()=>[t(H),t(p,{onClick:o.copySettingsToClipboard},{default:n(()=>[e[3]||(e[3]=a(" 复制到剪贴板 ",-1)),t(x,{right:""},{default:n(()=>[...e[2]||(e[2]=[a("mdi-content-copy",-1)])]),_:1})]),_:1},8,["onClick"])]),_:1})]),_:1})])])}const Ct=z(qn,[["render",Zn],["__scopeId","data-v-da09fd0e"]]),Xn={name:"SettingGroup",props:{title:{type:String,default:null},description:{type:String,default:null},icon:{type:String,default:null},border:{type:Boolean,default:!1}},methods:{onSettingUpdate(s,e){this.$emit("update",s,e)},onSettingError(s){this.$emit("error",s)}}};function $n(s,e,l,u,i,o){return m(),f(U,{border:l.border,class:"setting-group"},{default:n(()=>[l.title?(m(),f(F,{key:0,class:"d-flex align-center"},{default:n(()=>[l.icon?(m(),f(x,{key:0,icon:l.icon,class:"mr-2"},null,8,["icon"])):S("",!0),a(" "+k(l.title),1)]),_:1})):S("",!0),l.description?(m(),f(Ve,{key:1},{default:n(()=>[a(k(l.description),1)]),_:1})):S("",!0),t(E,null,{default:n(()=>[t(P,null,{default:n(()=>[Ue(s.$slots,"default",{},void 0,!0)]),_:3})]),_:3}),s.$slots.actions?(m(),f(X,{key:2},{default:n(()=>[Ue(s.$slots,"actions",{},void 0,!0)]),_:3})):S("",!0)]),_:3},8,["border"])}const _t=z(Xn,[["render",$n],["__scopeId","data-v-ca48ce62"]]),es={subjects:{语文:{books:{课本:["第一单元","第二单元"],练习册:["第一章","第二章"]}},数学:{books:{课本:["第一章","第二章"],习题册:["基础练习","提高练习"]}},英语:{books:{课本:["Unit 1","Unit 2"],练习册:["Chapter 1","Chapter 2"]}}},commonSubject:{books:{试卷:["单元测试","期中测试","期末测试"],假期作业:["必做题","选做题"]}},actions:["写完","下一课","不交","明天交"]},ts={name:"HomeworkTemplateCard",components:{SettingsCard:R,SettingGroup:_t},data(){return{loading:!1,error:null,config:en(JSON.parse(JSON.stringify(es))),originalConfig:null,newSubject:"",newCommonBook:"",newAction:"",newTask:"",editedSubjects:{},editedBookTypes:{},newBookTypes:{},newBooks:{},showSnackbar:!1,snackbarText:"",snackbarColor:"success",isNewConfig:!0,dialog:{show:!1,title:"",nameLabel:"",editedItem:{name:"",type:"",subject:"",bookType:"",originalName:"",tasks:[]}}}},computed:{subjectList(){return Object.keys(this.config.subjects)},hasChanges(){return this.isNewConfig?!0:this.originalConfig&&JSON.stringify(this.config)!==JSON.stringify(this.originalConfig)}},created(){this.loadConfig()},methods:{async loadConfig(){var s,e;this.loading=!0;try{const l=await oe.loadData("classworks-config-homework-template");if(l){const u=l;Object.assign(this.config,u),this.originalConfig=JSON.parse(JSON.stringify(u)),this.isNewConfig=!1,this.showMessage("配置已加载","success")}else if(((s=l.error)==null?void 0:s.code)==="NOT_FOUND")this.showMessage("使用默认配置","info"),this.isNewConfig=!0;else{const u=((e=l.error)==null?void 0:e.message)||"加载失败";this.showMessage(`加载失败: ${u},可继续编辑当前配置`,"warning")}}catch(l){console.error("Failed to load config:",l),this.showMessage("加载失败,可继续编辑当前配置","warning")}this.loading=!1},async saveConfig(){this.loading=!0;try{const s=await oe.saveData("classworks-config-homework-template",this.config);if(s)this.originalConfig=JSON.parse(JSON.stringify(this.config)),this.isNewConfig=!1,this.showMessage("配置已保存","success");else throw new Error(s||"保存失败")}catch(s){console.error("Failed to save config:",s),this.showMessage(`保存失败: ${s.message},请稍后重试`,"error")}this.loading=!1},showMessage(s,e="success"){this.snackbarText=s,this.snackbarColor=e,this.showSnackbar=!0},addSubject(){this.newSubject&&(this.config.subjects[this.newSubject]||(this.config.subjects[this.newSubject]={books:{}}),this.newSubject="")},updateSubject(s){const e=this.editedSubjects[s];if(e&&e!==s){const l=this.config.subjects[s];this.config.subjects[e]=l,delete this.config.subjects[s]}delete this.editedSubjects[s]},deleteSubject(s){delete this.config.subjects[s]},addBookType(s){const e=this.newBookTypes[s];e&&(this.config.subjects[s].books[e]||(this.config.subjects[s].books[e]=[]),this.newBookTypes[s]="")},updateBookType(s,e){const l=`${s}-${e}`,u=this.editedBookTypes[l];if(u&&u!==e){const i=this.config.subjects[s].books[e];this.config.subjects[s].books[u]=i,delete this.config.subjects[s].books[e]}delete this.editedBookTypes[l]},deleteBookType(s,e){s==="common"?delete this.config.commonSubject.books[e]:delete this.config.subjects[s].books[e]},addBook(s,e){const l=`${s}-${e}`,u=this.newBooks[l];u&&(this.config.subjects[s].books[e].includes(u)||this.config.subjects[s].books[e].push(u),this.newBooks[l]="")},removeBook(s,e,l){const u=this.config.subjects[s].books[e],i=u.indexOf(l);i>-1&&u.splice(i,1)},addCommonBook(){this.newCommonBook&&(this.config.commonSubject.books[this.newCommonBook]||(this.config.commonSubject.books[this.newCommonBook]=[]),this.newCommonBook="")},removeCommonBook(s){delete this.config.commonSubject.books[s]},addAction(){this.newAction&&(this.config.actions.includes(this.newAction)||this.config.actions.push(this.newAction),this.newAction="")},removeAction(s){const e=this.config.actions.indexOf(s);e>-1&&this.config.actions.splice(e,1)},openBookDialog(s,e,l){this.dialog.show=!0,this.dialog.title="编辑需完成部分",this.dialog.nameLabel="部分名称",this.dialog.editedItem={name:l,type:"book",subject:s,bookType:e,originalName:l,tasks:this.config.subjects[s].books[e]}},openCommonBookDialog(s){this.dialog.show=!0,this.dialog.title="编辑通用作业本",this.dialog.nameLabel="作业本名称",this.dialog.editedItem={name:s,type:"commonBook",originalName:s,tasks:Array.isArray(this.config.commonSubject.books[s])?[...this.config.commonSubject.books[s]]:[]}},openActionDialog(s){this.dialog={show:!0,title:"编辑操作",nameLabel:"操作名称",editedItem:{name:s,type:"action",originalName:s,tasks:[]}}},addTask(){this.newTask&&(this.dialog.editedItem.tasks||(this.dialog.editedItem.tasks=[]),this.dialog.editedItem.tasks.push(this.newTask),this.newTask="")},removeTask(s){this.dialog.editedItem.tasks.splice(s,1)},openSubjectBookDialog(s,e,l){this.dialog.show=!0,this.dialog.title=s==="common"?"编辑通用作业本":"编辑作业本",this.dialog.nameLabel="作业本名称",this.dialog.editedItem={name:e,type:"subjectBook",subject:s,originalName:e,tasks:Array.isArray(l)?[...l]:[]}},saveDialog(){const{type:s,name:e,subject:l,originalName:u,tasks:i}=this.dialog.editedItem;if(!e){this.showMessage("名称不能为空","error");return}let o;const r=l==="common"?this.config.commonSubject.books:l?this.config.subjects[l].books:null;switch(s){case"subjectBook":r&&(u!==e?(r[e]=i||[],delete r[u]):r[e]=i||[]);break;case"action":o=this.config.actions.indexOf(u),o>-1&&(this.config.actions[o]=e);break}this.closeDialog()},closeDialog(){this.dialog={show:!1,title:"",nameLabel:"",editedItem:{name:"",type:"",subject:"",originalName:"",tasks:[]}},this.newTask=""}}},ns={class:"d-flex justify-space-between align-center mb-6"};function ss(s,e,l,u,i,o){const r=_t,c=R;return m(),f(c,{title:"作业模板配置",icon:"mdi-book-edit",loading:i.loading,border:""},{default:n(()=>[i.error?(m(),f(ee,{key:0,type:"error",variant:"tonal",closable:"",class:"mb-4"},{default:n(()=>[a(k(i.error),1)]),_:1})):S("",!0),w("div",ns,[w("div",null,[t(p,{color:"primary",size:"large","prepend-icon":"mdi-refresh",loading:i.loading,onClick:o.loadConfig,class:"mr-2"},{default:n(()=>[...e[7]||(e[7]=[a(" 重新加载配置 ",-1)])]),_:1},8,["loading","onClick"]),t(p,{color:"success",size:"large","prepend-icon":"mdi-content-save",loading:i.loading,onClick:o.saveConfig},{default:n(()=>[...e[8]||(e[8]=[a(" 保存所有更改 ",-1)])]),_:1},8,["loading","onClick"])]),o.hasChanges?(m(),f(he,{key:0,color:"warning",variant:"elevated"},{default:n(()=>[...e[9]||(e[9]=[a(" 有未保存的更改 ",-1)])]),_:1})):S("",!0)]),t(be,null,{default:n(()=>[t(ae,{cols:"12",md:"6"},{default:n(()=>[t(r,{title:"科目配置",icon:"mdi-book",border:""},{default:n(()=>[t(P,null,{default:n(()=>[t(D,null,{default:n(()=>[t(L,{modelValue:i.newSubject,"onUpdate:modelValue":e[0]||(e[0]=h=>i.newSubject=h),label:"添加新科目",variant:"outlined",density:"comfortable","append-inner-icon":"mdi-plus","onClick:appendInner":o.addSubject,onKeyup:ge(o.addSubject,["enter"])},null,8,["modelValue","onClick:appendInner","onKeyup"])]),_:1}),(m(!0),I($,null,le(o.subjectList,h=>(m(),f(D,{key:h},{default:n(()=>[t(U,{border:"",class:"w-100 mb-2"},{default:n(()=>[t(F,{class:"d-flex align-center"},{default:n(()=>[t(L,{modelValue:i.editedSubjects[h],"onUpdate:modelValue":b=>i.editedSubjects[h]=b,placeholder:h,density:"comfortable",variant:"plain","hide-details":"",onBlur:b=>o.updateSubject(h)},null,8,["modelValue","onUpdate:modelValue","placeholder","onBlur"]),t(H),t(p,{icon:"mdi-delete",variant:"text",color:"error",size:"small",onClick:b=>o.deleteSubject(h)},null,8,["onClick"])]),_:2},1024),t(E,null,{default:n(()=>[t(L,{modelValue:i.newBookTypes[h],"onUpdate:modelValue":b=>i.newBookTypes[h]=b,label:"添加作业本名称",variant:"outlined",density:"comfortable",class:"mb-2","append-inner-icon":"mdi-plus","onClick:appendInner":()=>o.addBookType(h),onKeyup:ge(()=>o.addBookType(h),["enter"])},null,8,["modelValue","onUpdate:modelValue","onClick:appendInner","onKeyup"]),t(P,{density:"compact",border:"",rounded:""},{default:n(()=>[(m(!0),I($,null,le(i.config.subjects[h].books,(b,_)=>(m(),f(D,{key:_,title:_,onClick:N=>o.openSubjectBookDialog(h,_,b)},{prepend:n(()=>[t(x,{icon:"mdi-book-open-variant",class:"mr-2"})]),append:n(()=>[t(he,{size:"small",class:"mr-2",color:"info"},{default:n(()=>[a(k(b.length)+"个部分 ",1)]),_:2},1024),t(p,{icon:"mdi-delete",variant:"text",color:"error",size:"small",onClick:Pe(()=>o.deleteBookType(h,_),["stop"])},null,8,["onClick"])]),_:2},1032,["title","onClick"]))),128))]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:2},1024))),128))]),_:1})]),_:1})]),_:1}),t(ae,{cols:"12",md:"6"},{default:n(()=>[t(r,{title:"通用配置",icon:"mdi-cog",border:""},{default:n(()=>[t(P,null,{default:n(()=>[t(D,null,{default:n(()=>[t(L,{modelValue:i.newCommonBook,"onUpdate:modelValue":e[1]||(e[1]=h=>i.newCommonBook=h),label:"添加作业本名称",variant:"outlined",density:"comfortable","append-inner-icon":"mdi-plus","onClick:appendInner":o.addCommonBook,onKeyup:ge(o.addCommonBook,["enter"])},null,8,["modelValue","onClick:appendInner","onKeyup"])]),_:1}),t(D,null,{default:n(()=>[t(P,{density:"compact",border:"",rounded:""},{default:n(()=>[(m(!0),I($,null,le(i.config.commonSubject.books,(h,b)=>(m(),f(D,{key:b,title:b,onClick:_=>o.openSubjectBookDialog("common",b,h)},{prepend:n(()=>[t(x,{icon:"mdi-book-multiple",class:"mr-2"})]),append:n(()=>[t(he,{size:"small",class:"mr-2",color:"info"},{default:n(()=>[a(k(h.length)+"个部分 ",1)]),_:2},1024),t(p,{icon:"mdi-delete",variant:"text",color:"error",size:"small",onClick:Pe(()=>o.deleteBookType("common",b),["stop"])},null,8,["onClick"])]),_:2},1032,["title","onClick"]))),128))]),_:1})]),_:1}),t(A,{class:"my-2"}),t(D,null,{default:n(()=>[t(L,{modelValue:i.newAction,"onUpdate:modelValue":e[2]||(e[2]=h=>i.newAction=h),label:"添加操作",variant:"outlined",density:"comfortable","append-inner-icon":"mdi-plus","onClick:appendInner":o.addAction,onKeyup:ge(o.addAction,["enter"])},null,8,["modelValue","onClick:appendInner","onKeyup"])]),_:1}),t(D,null,{default:n(()=>[t(P,{density:"compact",border:"",rounded:""},{default:n(()=>[(m(!0),I($,null,le(i.config.actions,h=>(m(),f(D,{key:h,title:h,onClick:b=>o.openActionDialog(h)},{append:n(()=>[t(p,{icon:"mdi-delete",variant:"text",color:"error",size:"small",onClick:Pe(b=>o.removeAction(h),["stop"])},null,8,["onClick"])]),_:2},1032,["title","onClick"]))),128))]),_:1})]),_:1})]),_:1})]),_:1})]),_:1})]),_:1}),t(pe,{modelValue:i.dialog.show,"onUpdate:modelValue":e[5]||(e[5]=h=>i.dialog.show=h),"max-width":"600px"},{default:n(()=>[t(U,null,{default:n(()=>[t(F,{class:"text-h5 pa-4"},{default:n(()=>[a(k(i.dialog.title),1)]),_:1}),t(E,null,{default:n(()=>[t(pt,null,{default:n(()=>[t(be,null,{default:n(()=>[t(ae,{cols:"12"},{default:n(()=>[t(L,{modelValue:i.dialog.editedItem.name,"onUpdate:modelValue":e[3]||(e[3]=h=>i.dialog.editedItem.name=h),label:i.dialog.nameLabel,variant:"outlined",density:"comfortable",rules:[h=>!!h||"名称不能为空"]},null,8,["modelValue","label","rules"])]),_:1}),i.dialog.editedItem.type==="subjectBook"?(m(),f(ae,{key:0,cols:"12"},{default:n(()=>[e[10]||(e[10]=w("div",{class:"text-subtitle-2 mb-2"},"所属科目",-1)),t(he,{color:"primary"},{default:n(()=>[a(k(i.dialog.editedItem.subject),1)]),_:1})]),_:1})):S("",!0),["subjectBook","commonBook"].includes(i.dialog.editedItem.type)?(m(),f(ae,{key:1,cols:"12"},{default:n(()=>[t(U,{variant:"outlined"},{default:n(()=>[t(F,{class:"text-subtitle-1 py-2"},{default:n(()=>[...e[11]||(e[11]=[a("需完成部分",-1)])]),_:1}),t(E,{class:"pt-0"},{default:n(()=>[t(P,{density:"compact",border:"",rounded:"",class:"mb-2"},{default:n(()=>[(m(!0),I($,null,le(i.dialog.editedItem.tasks,(h,b)=>(m(),f(D,{key:b},{prepend:n(()=>[t(x,{icon:"mdi-checkbox-blank-circle-outline",size:"small",class:"mr-2"})]),append:n(()=>[t(p,{icon:"mdi-delete",variant:"text",color:"error",size:"small",onClick:_=>o.removeTask(b)},null,8,["onClick"])]),default:n(()=>[t(L,{modelValue:i.dialog.editedItem.tasks[b],"onUpdate:modelValue":_=>i.dialog.editedItem.tasks[b]=_,variant:"plain",density:"compact","hide-details":""},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024))),128))]),_:1}),t(L,{modelValue:i.newTask,"onUpdate:modelValue":e[4]||(e[4]=h=>i.newTask=h),label:"添加需完成部分",variant:"outlined",density:"comfortable","append-inner-icon":"mdi-plus","onClick:appendInner":o.addTask,onKeyup:ge(o.addTask,["enter"]),class:"mt-2"},null,8,["modelValue","onClick:appendInner","onKeyup"])]),_:1})]),_:1})]),_:1})):S("",!0)]),_:1})]),_:1})]),_:1}),t(X,{class:"pa-4"},{default:n(()=>[t(H),t(p,{color:"primary",variant:"elevated",onClick:o.saveDialog},{default:n(()=>[...e[12]||(e[12]=[a(" 关闭 ",-1)])]),_:1},8,["onClick"]),t(p,{color:"error",variant:"text",onClick:o.closeDialog},{default:n(()=>[...e[13]||(e[13]=[a(" 取消 ",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1})]),_:1},8,["modelValue"]),t(Je,{modelValue:i.showSnackbar,"onUpdate:modelValue":e[6]||(e[6]=h=>i.showSnackbar=h),color:i.snackbarColor,timeout:3e3},{default:n(()=>[a(k(i.snackbarText),1)]),_:1},8,["modelValue","color"])]),_:1},8,["loading"])}const Vt=z(ts,[["render",ss],["__scopeId","data-v-261bf98e"]]),is={name:"SubjectManagementCard",components:{SettingsCard:R},data(){return{loading:!1,error:null,subjects:[],originalSubjects:null,newSubjectName:"",showSnackbar:!1,snackbarText:"",snackbarColor:"success",defaultSubjects:[{name:"语文",order:0},{name:"数学",order:1},{name:"英语",order:2},{name:"物理",order:3},{name:"化学",order:4},{name:"生物",order:5},{name:"政治",order:6},{name:"历史",order:7},{name:"地理",order:8},{name:"其他",order:9}]}},computed:{hasChanges(){return this.originalSubjects&&JSON.stringify(this.subjects)!==JSON.stringify(this.originalSubjects)}},created(){this.loadConfig()},methods:{async loadConfig(){this.loading=!0;try{const s=await oe.loadData("classworks-config-subject");s?(this.subjects=s.map((e,l)=>({name:e.name,order:e.order??l})).sort((e,l)=>e.order-l.order),this.originalSubjects=JSON.parse(JSON.stringify(this.subjects)),this.showMessage("配置已加载","success")):(this.subjects=[],this.originalSubjects=[],this.showMessage("使用默认配置","info"))}catch(s){console.error("Failed to load config:",s),this.showMessage("加载失败,可继续编辑当前配置","warning")}this.loading=!1},async saveConfig(){this.loading=!0;try{const s=await oe.saveData("classworks-config-subject",this.subjects);if(s)this.originalSubjects=JSON.parse(JSON.stringify(this.subjects)),this.showMessage("配置已保存","success");else throw new Error(s||"保存失败")}catch(s){console.error("Failed to save config:",s),this.showMessage(`保存失败: ${s.message},请稍后重试`,"error")}this.loading=!1},showMessage(s,e="success"){this.snackbarText=s,this.snackbarColor=e,this.showSnackbar=!0},addSubject(){if(!this.newSubjectName)return;const s={name:this.newSubjectName,order:this.subjects.length};this.subjects.push(s),this.newSubjectName=""},updateSubject(s){const e=this.subjects.findIndex(l=>l.order===s.order);e>-1&&(this.subjects[e]={...s})},deleteSubject(s){const e=this.subjects.findIndex(l=>l.order===s.order);e>-1&&(this.subjects.splice(e,1),this.subjects.forEach((l,u)=>{l.order=u}))},moveSubject(s,e){const l=s+e;if(l>=0&&l<this.subjects.length){const u=this.subjects[s];this.subjects[s]=this.subjects[l],this.subjects[l]=u,this.subjects.forEach((i,o)=>{i.order=o})}},resetToDefault(){this.subjects=JSON.parse(JSON.stringify(this.defaultSubjects)),this.showMessage("已重置为默认科目列表","info")}}},os={class:"d-flex justify-space-between align-center mb-6"},ls={class:"d-flex flex-column align-center mr-2"};function as(s,e,l,u,i,o){const r=R;return m(),f(r,{title:"科目管理",icon:"mdi-book-multiple",loading:i.loading,border:""},{default:n(()=>[i.error?(m(),f(ee,{key:0,type:"error",variant:"tonal",closable:"",class:"mb-4"},{default:n(()=>[a(k(i.error),1)]),_:1})):S("",!0),w("div",os,[w("div",null,[t(p,{variant:"text",color:"primary",size:"large","prepend-icon":"mdi-refresh",loading:i.loading,onClick:o.loadConfig,class:"mr-2"},{default:n(()=>[...e[2]||(e[2]=[a(" 重新加载 ",-1)])]),_:1},8,["loading","onClick"]),t(p,{color:"success",size:"large","prepend-icon":"mdi-content-save",loading:i.loading,onClick:o.saveConfig},{default:n(()=>[...e[3]||(e[3]=[a(" 保存 ",-1)])]),_:1},8,["loading","onClick"]),t(p,{variant:"text","prepend-icon":"mdi-restore",loading:i.loading,onClick:o.resetToDefault,class:"mr-2"},{default:n(()=>[...e[4]||(e[4]=[a(" 重置为默认 ",-1)])]),_:1},8,["loading","onClick"])]),o.hasChanges?(m(),f(he,{key:0,color:"warning",variant:"elevated"},{default:n(()=>[...e[5]||(e[5]=[a(" 有未保存的更改 ",-1)])]),_:1})):S("",!0)]),t(U,{class:"mb-4",variant:"outlined"},{default:n(()=>[t(E,null,{default:n(()=>[t(be,null,{default:n(()=>[t(ae,{cols:"12",sm:"6"},{default:n(()=>[t(L,{modelValue:i.newSubjectName,"onUpdate:modelValue":e[0]||(e[0]=c=>i.newSubjectName=c),label:"科目名称",variant:"outlined",density:"comfortable",rules:[c=>!!c||"科目名称不能为空"],onKeyup:ge(o.addSubject,["enter"]),"append-inner-icon":"mdi-plus","onClick:appendInner":o.addSubject},null,8,["modelValue","rules","onKeyup","onClick:appendInner"])]),_:1})]),_:1})]),_:1})]),_:1}),t(U,{variant:"outlined"},{default:n(()=>[t(E,{class:"pa-0"},{default:n(()=>[t(P,{lines:"one"},{default:n(()=>[(m(!0),I($,null,le(i.subjects,(c,h)=>(m(),f(D,{key:c.order},{prepend:n(()=>[w("div",ls,[t(p,{icon:"mdi-chevron-up",variant:"text",size:"small",disabled:h===0,onClick:b=>o.moveSubject(h,-1)},null,8,["disabled","onClick"]),t(p,{icon:"mdi-chevron-down",variant:"text",size:"small",disabled:h===i.subjects.length-1,onClick:b=>o.moveSubject(h,1)},null,8,["disabled","onClick"])])]),append:n(()=>[t(p,{icon:"mdi-delete",variant:"text",color:"error",size:"small",onClick:b=>o.deleteSubject(c)},null,8,["onClick"])]),default:n(()=>[t(K,null,{default:n(()=>[t(L,{modelValue:c.name,"onUpdate:modelValue":b=>c.name=b,variant:"plain",density:"compact","hide-details":"",onBlur:b=>o.updateSubject(c)},null,8,["modelValue","onUpdate:modelValue","onBlur"])]),_:2},1024)]),_:2},1024))),128))]),_:1})]),_:1})]),_:1}),t(Je,{modelValue:i.showSnackbar,"onUpdate:modelValue":e[1]||(e[1]=c=>i.showSnackbar=c),color:i.snackbarColor,timeout:3e3},{default:n(()=>[a(k(i.snackbarText),1)]),_:1},8,["modelValue","color"])]),_:1},8,["loading"])}const Dt=z(is,[["render",as],["__scopeId","data-v-7077623d"]]),rs={};function us(s,e,l,u,i,o){const r=ye,c=R;return m(),f(c,{title:"编辑设置",icon:"mdi-cog"},{default:n(()=>[t(P,null,{default:n(()=>[t(r,{"setting-key":"randomPicker.enabled"}),t(A,{class:"my-2"}),t(r,{"setting-key":"randomPicker.mode"}),t(A,{class:"my-2"}),t(r,{"setting-key":"randomPicker.minNumber"}),t(A,{class:"my-2"}),t(r,{"setting-key":"randomPicker.maxNumber"}),t(A,{class:"my-2"}),t(r,{"setting-key":"randomPicker.defaultCount"}),t(A,{class:"my-2"}),t(r,{"setting-key":"randomPicker.animation"})]),_:1})]),_:1})}const Tt=z(rs,[["render",us]]),ds={name:"ThemeSettingsCard",components:{SettingsCard:R},data(){return{localTheme:y("theme.mode")}},watch:{localTheme(s){xe("theme.mode",s),this.updateTheme(s)}},setup(){return{theme:tn()}},methods:{updateTheme(s){this.theme.global.name.value=s}}};function cs(s,e,l,u,i,o){const r=R;return m(),f(r,{title:"主题设置",icon:"mdi-palette"},{default:n(()=>[t(P,null,{default:n(()=>[t(D,null,{prepend:n(()=>[t(x,{icon:"mdi-theme-light-dark",class:"mr-3"})]),append:n(()=>[t(nn,{modelValue:i.localTheme,"onUpdate:modelValue":e[0]||(e[0]=c=>i.localTheme=c),density:"comfortable",color:"primary"},{default:n(()=>[t(p,{value:"light"},{default:n(()=>[t(x,{icon:"mdi-white-balance-sunny",class:"mr-2"}),e[3]||(e[3]=a(" 明亮 ",-1))]),_:1}),t(p,{value:"dark"},{default:n(()=>[t(x,{icon:"mdi-moon-waning-crescent",class:"mr-2"}),e[4]||(e[4]=a(" 暗黑 ",-1))]),_:1})]),_:1},8,["modelValue"])]),default:n(()=>[t(K,null,{default:n(()=>[...e[1]||(e[1]=[a("主题模式",-1)])]),_:1}),t(Z,null,{default:n(()=>[...e[2]||(e[2]=[a("选择明亮或暗黑主题",-1)])]),_:1})]),_:1})]),_:1})]),_:1})}const It=z(ds,[["render",cs]]),hs={name:"DisplaySettingsCard",components:{SettingsCard:R,SettingItem:ye},data(){return{}}};function ms(s,e,l,u,i,o){const r=ye,c=R;return m(),f(c,{title:"显示设置",icon:"mdi-monitor",border:""},{default:n(()=>[t(P,null,{default:n(()=>[t(r,{"setting-key":"display.emptySubjectDisplay"}),t(A,{class:"my-2"}),t(r,{"setting-key":"display.dynamicSort"}),t(A,{class:"my-2"}),t(r,{"setting-key":"display.showRandomButton"}),t(A,{class:"my-2"}),t(r,{"setting-key":"display.showFullscreenButton"}),t(A,{class:"my-2"}),t(r,{"setting-key":"display.cardHoverEffect"}),t(A,{class:"my-2"}),t(r,{"setting-key":"display.enhancedTouchMode"}),t(A,{class:"my-2"}),t(r,{"setting-key":"display.showQuickTools"}),t(A,{class:"my-2"}),t(r,{"setting-key":"display.showAntiScreenBurnCard"}),t(A,{class:"my-2"}),t(r,{"setting-key":"display.showExamScheduleButton"})]),_:1})]),_:1})}const Nt=z(hs,[["render",ms]]),ps={};function ws(s,e,l,u,i,o){const r=ye,c=R;return m(),f(c,{title:"编辑设置",icon:"mdi-cog"},{default:n(()=>[t(P,null,{default:n(()=>[t(r,{"setting-key":"edit.autoSave"}),t(A,{class:"my-2"}),t(r,{"setting-key":"edit.blockNonTodayAutoSave"}),t(A,{class:"my-2"}),t(r,{"setting-key":"edit.confirmNonTodaySave"}),t(A,{class:"my-2"}),t(r,{"setting-key":"edit.refreshBeforeEdit"})]),_:1})]),_:1})}const Et=z(ps,[["render",ws]]),fs={name:"RefreshSettingsCard",components:{SettingsCard:R},data(){return{}}};function gs(s,e,l,u,i,o){const r=ye,c=R;return m(),f(c,{title:"刷新设置",icon:"mdi-refresh-circle"},{default:n(()=>[t(wt,null,{default:n(()=>[t(P,null,{default:n(()=>[t(r,{"setting-key":"refresh.auto",title:"自动刷新"}),e[0]||(e[0]=a()),t(A,{class:"my-2"}),t(r,{"setting-key":"refresh.interval",title:"刷新间隔"})]),_:1})]),_:1})]),_:1})}const Ut=z(fs,[["render",gs]]),vs={name:"SettingsLinkGenerator",data(){return{selectedItems:[],generatedLink:"",linkCopied:!1,search:"",headers:[{title:"",key:"data-table-select"},{title:"设置项",key:"description",sortable:!0},{title:"当前值",key:"value",sortable:!0},{title:"键名",key:"key",class:"d-none d-sm-table-cell",sortable:!0},{title:"状态",key:"isChanged",sortable:!0}]}},computed:{settingItems(){const s=Ne(),e=[];for(const[l,u]of Object.entries(Re)){if(u.requireDeveloper&&!s["developer.enabled"])continue;const i=s[l]!==u.default;e.push({key:l,description:u.description||l,value:s[l],icon:u.icon||"mdi-cog",isChanged:i,defaultValue:u.default})}return e.sort((l,u)=>l.key.localeCompare(u.key))},filteredItems(){if(!this.search)return this.settingItems;const s=this.search.toLowerCase();return s==="已修改"?this.settingItems.filter(e=>e.isChanged):s==="是"||s==="否"?this.settingItems.filter(e=>typeof e.value=="boolean"&&(s==="是"?e.value:!e.value)):this.settingItems.filter(e=>{const l=e.description.toLowerCase(),u=e.key.toLowerCase(),i=String(e.value).toLowerCase(),o=e.isChanged?"已修改":"默认";return l.includes(s)||u.includes(s)||i.includes(s)||o.includes(s)})},hasDisplaySettings(){return this.selectedItems.some(s=>s.startsWith("display."))},hasEditSettings(){return this.selectedItems.some(s=>s.startsWith("edit."))},hasServerSettings(){return this.selectedItems.some(s=>s.startsWith("server."))},hasChangedSettings(){const s=Ne();return this.selectedItems.some(e=>{const l=Re[e];return l&&s[e]!==l.default})}},methods:{handleSelectionChange(s){this.selectedItems=s.map(e=>e.key),this.generateLink()},generateLink(){const s=`${window.location.protocol}//${window.location.host}/`,e=Ne(),l={};for(const u of this.selectedItems)l[u]=e[u];if(Object.keys(l).length===0){this.generatedLink=s;return}try{const u=JSON.stringify(l),o=new TextEncoder().encode(u),c={config:btoa(Array.from(o).map(N=>String.fromCharCode(N)).join(""))},b=new URLSearchParams(window.location.search).get("date");b&&(c.date=b);const _=new URLSearchParams(c).toString();this.generatedLink=`${s}?${_}`}catch(u){console.error("生成链接失败:",u),this.generatedLink="链接生成失败,请重试"}this.linkCopied=!1},async copyLink(){this.generatedLink||this.generateLink();try{await navigator.clipboard.writeText(this.generatedLink),this.linkCopied=!0,setTimeout(()=>{this.linkCopied=!1},3e3)}catch(s){console.error("复制链接失败:",s)}},resetSelection(){this.selectedItems=[],this.generatedLink="",this.linkCopied=!1},selectAll(){this.selectedItems=this.settingItems.map(s=>s.key),this.generateLink()},selectDataSourceSettings(){const s=this.settingItems.filter(e=>e.key.startsWith("server.")).map(e=>e.key);this.selectedItems=s,this.generateLink()},selectChangedSettings(){const s=this.settingItems.filter(e=>e.isChanged).map(e=>e.key);this.selectedItems=s,this.generateLink()},selectByPrefix(s){const e=this.settingItems.filter(l=>l.key.startsWith(`${s}.`)).map(l=>l.key);this.selectedItems=e},autoGenerateLink(){this.selectedItems.length>0?this.generateLink():this.generatedLink=""},getSettingDescription(s){const e=this.settingItems.find(l=>l.key===s);return e?e.description:s}},watch:{selectedItems:{handler(){this.autoGenerateLink()},deep:!0}}},bs={class:"d-flex mb-3 gap-2 flex-wrap"},ys={class:"d-flex align-center mt-3 mb-3 flex-wrap gap-2"},ks={class:"d-flex align-center"},xs={key:0},Ss={key:1},Cs={class:"text-caption text-grey"};function _s(s,e,l,u,i,o){return m(),f(U,{border:"",class:"settings-link-generator mb-4"},{default:n(()=>[t(F,{class:"text-h6"},{default:n(()=>[t(x,{start:"",icon:"mdi-link-variant",class:"mr-2"}),e[3]||(e[3]=a(" 设置分享 ",-1))]),_:1}),t(E,null,{default:n(()=>[w("div",bs,[t(p,{size:"small",variant:"tonal",color:"primary","prepend-icon":"mdi-select-all",onClick:o.selectAll},{default:n(()=>[...e[4]||(e[4]=[a(" 全选 ",-1)])]),_:1},8,["onClick"]),t(p,{size:"small",variant:"tonal",color:"primary","prepend-icon":"mdi-server-network",onClick:o.selectDataSourceSettings},{default:n(()=>[...e[5]||(e[5]=[a(" 数据源设置 ",-1)])]),_:1},8,["onClick"]),t(p,{size:"small",variant:"tonal",color:"primary","prepend-icon":"mdi-compare",onClick:o.selectChangedSettings},{default:n(()=>[...e[6]||(e[6]=[a(" 已变更设置 ",-1)])]),_:1},8,["onClick"]),t(p,{size:"small",variant:"tonal",color:"error","prepend-icon":"mdi-select-remove",onClick:o.resetSelection},{default:n(()=>[...e[7]||(e[7]=[a(" 取消选择 ",-1)])]),_:1},8,["onClick"])]),w("div",ys,[t(he,{color:"primary",class:"mr-2"},{default:n(()=>[a(" 已选 "+k(i.selectedItems.length)+" 项设置 ",1)]),_:1}),i.selectedItems.length>0?(m(!0),I($,{key:0},le(i.selectedItems,r=>(m(),f(he,{key:r,size:"small",class:"mr-1",variant:"text"},{default:n(()=>[a(k(o.getSettingDescription(r)),1)]),_:2},1024))),128)):S("",!0)]),t(L,{modelValue:i.generatedLink,"onUpdate:modelValue":e[0]||(e[0]=r=>i.generatedLink=r),label:"生成的链接",readonly:"",variant:"outlined",class:"mb-2","append-inner-icon":i.linkCopied?"mdi-check":"mdi-content-copy","onClick:appendInner":o.copyLink},null,8,["modelValue","append-inner-icon","onClick:appendInner"]),t(ft,{variant:"accordion"},{default:n(()=>[t(gt,null,{default:n(()=>[t(vt,null,{default:n(()=>[...e[8]||(e[8]=[a(" 显示设置列表详情 ",-1)])]),_:1}),t(bt,null,{default:n(()=>[t(yt,{"items-per-page":o.settingItems.length,headers:i.headers,items:o.filteredItems,"item-value":"key",modelValue:i.selectedItems,"onUpdate:modelValue":e[2]||(e[2]=r=>i.selectedItems=r),"show-select":"",density:"compact",class:"rounded setting-table","onUpdate:selected":o.handleSelectionChange,"sort-by":[{key:"isChanged",order:"desc"}]},{top:n(()=>[t(L,{modelValue:i.search,"onUpdate:modelValue":e[1]||(e[1]=r=>i.search=r),label:"搜索设置","prepend-inner-icon":"mdi-magnify","single-line":"","hide-details":"",class:"mb-4"},null,8,["modelValue"])]),"item.description":n(({item:r})=>[w("div",ks,[t(x,{size:"small",icon:r.icon,class:"mr-2"},null,8,["icon"]),a(" "+k(r.description),1)])]),"item.value":n(({item:r})=>[typeof r.value=="boolean"?(m(),I("span",xs,k(r.value?"是":"否"),1)):(m(),I("span",Ss,k(r.value),1))]),"item.key":n(({item:r})=>[w("span",Cs,k(r.key),1)]),"item.isChanged":n(({item:r})=>[t(he,{size:"x-small",color:r.isChanged?"warning":"success",text:r.isChanged?"已修改":"默认",density:"compact"},null,8,["color","text"])]),_:2},1032,["items-per-page","headers","items","modelValue","onUpdate:selected"])]),_:1})]),_:1})]),_:1})]),_:1})]),_:1})}const jt=z(vs,[["render",_s]]),Vs={name:"UnsavedWarning",props:{show:Boolean,message:{type:String,default:"未保存"}}},Ds={class:"warning-container"};function Ts(s,e,l,u,i,o){return m(),I("div",Ds,[l.show?(m(),f(he,{key:0,color:"warning",size:"small",class:"warning-chip"},{default:n(()=>[a(k(l.message),1)]),_:1})):S("",!0)])}const At=z(Vs,[["render",Ts],["__scopeId","data-v-0668f179"]]),Is=on({disabled:Boolean,modelValue:{type:Boolean,default:null},...rn()},"VHover"),Ns=sn()({name:"VHover",props:Is(),emits:{"update:modelValue":s=>!0},setup(s,e){let{slots:l}=e;const u=ln(s,"modelValue"),{runOpenDelay:i,runCloseDelay:o}=an(s,r=>!s.disabled&&(u.value=r));return()=>{var r;return(r=l.default)==null?void 0:r.call(l,{isHovering:u.value,props:{onMouseenter:i,onMouseleave:o}})}}}),Es={name:"StudentListCard",components:{UnsavedWarning:At},props:{isMobile:Boolean},data(){return{newStudentName:"",editState:{index:-1,name:""},modelValue:{list:[],text:"",advanced:!1},loading:!1,error:null,lastSavedData:null,unsavedChanges:!1}},watch:{modelValue:{handler(s){this.lastSavedData&&(this.unsavedChanges=JSON.stringify(s.list)!==JSON.stringify(this.lastSavedData)),this.modelValue.advanced||(this.modelValue.text=s.list.slice().sort((e,l)=>e.id-l.id).map(e=>e.name).join(`
|
||
`))},deep:!0}},mounted(){this.loadStudents()},methods:{async loadStudents(){var s;this.error=null;try{if(this.loading=!0,!y("server.classNumber"))throw new Error("请先设置班号");try{const l=await oe.loadData("classworks-list-main");if(l.success!=!1&&Array.isArray(l)){this.modelValue.list=l.map((u,i)=>typeof u=="string"?{id:i+1,name:u}:{id:u.id||i+1,name:u.name||u.toString()}),this.modelValue.list.sort((u,i)=>u.id-i.id),this.modelValue.text=this.modelValue.list.map(u=>u.name).join(`
|
||
`),this.lastSavedData=JSON.parse(JSON.stringify(this.modelValue.list)),this.unsavedChanges=!1;return}}catch(l){console.warn("Failed to load student list from dedicated key, falling back to config",l)}}catch(e){console.error("加载学生列表失败:",e),this.error=e.message||"加载失败,请检查设置",(s=this.$message)==null||s.error("加载失败",this.error)}finally{this.loading=!1}},async saveStudents(){var s,e,l;try{if(!y("server.classNumber"))throw new Error("请先设置班号");const i=this.modelValue.list.slice().sort((r,c)=>r.id-c.id).map((r,c)=>({id:c+1,name:r.name})),o=await oe.saveData("classworks-list-main",i);if(o.success===!1)throw new Error(((s=o.error)==null?void 0:s.message)||"保存失败");this.modelValue.list=i,this.lastSavedData=JSON.parse(JSON.stringify(i)),this.unsavedChanges=!1,(e=this.$message)==null||e.success("保存成功","学生列表已更新")}catch(u){console.error("保存学生列表失败:",u),(l=this.$message)==null||l.error("保存失败",u.message||"请重试")}},toggleAdvanced(){this.modelValue.advanced=!this.modelValue.advanced},handleTextInput(s){if(!this.modelValue.advanced)return;const e=s.split(`
|
||
`).filter(o=>o.trim()),l=new Map(this.modelValue.list.map(o=>[o.name,o.id]));let u=Math.max(0,...this.modelValue.list.map(o=>o.id));const i=e.map(o=>(o=o.trim(),l.has(o)?{id:l.get(o),name:o}:{id:++u,name:o}));this.modelValue.list=i},addStudent(){const s=this.newStudentName.trim();if(s&&!this.modelValue.list.some(e=>e.name===s)){const e=Math.max(0,...this.modelValue.list.map(l=>l.id));this.modelValue.list.push({id:e+1,name:s}),this.newStudentName=""}},startEdit(s,e){this.editState.index=s,this.editState.name=e.name},saveEdit(){if(this.editState.index!==-1){const s=this.editState.name.trim();s&&s!==this.modelValue.list[this.editState.index].name&&(this.modelValue.list[this.editState.index].name=s),this.editState.index=-1,this.editState.name=""}},removeStudent(s){s!==void 0&&this.modelValue.list.splice(s,1)},moveStudent(s,e){if(e==="top"){if(s>0){const l=this.modelValue.list[s];this.modelValue.list.splice(s,1),this.modelValue.list.unshift(l),this.modelValue.list.forEach((u,i)=>u.id=i+1)}}else{const l=e==="up"?s-1:s+1;l>=0&&l<this.modelValue.list.length&&([this.modelValue.list[s],this.modelValue.list[l]]=[this.modelValue.list[l],this.modelValue.list[s]],[this.modelValue.list[s].id,this.modelValue.list[l].id]=[this.modelValue.list[l].id,this.modelValue.list[s].id])}},handleClick(s,e){this.isMobile&&this.startEdit(s,e)},sortStudentsByPinyin(){const s=[...this.modelValue.list].sort((e,l)=>{const u=Ze(e.name,{toneType:"none"}),i=Ze(l.name,{toneType:"none"});return u.localeCompare(i)});s.forEach((e,l)=>e.id=l+1),this.modelValue.list=s}}},Us={key:0},js=["onClick"],As={key:1,class:"pt-2"};function Os(s,e,l,u,i,o){const r=At;return m(),f(U,{border:"",color:i.unsavedChanges?"warning-subtle":void 0,class:$e({"unsaved-changes":i.unsavedChanges})},{default:n(()=>[t(je,null,{prepend:n(()=>[t(x,{icon:"mdi-account-group",size:"large",class:"mr-2"})]),append:n(()=>[t(r,{show:i.unsavedChanges,message:"有未保存的更改"},null,8,["show"]),t(p,{"prepend-icon":"mdi-sort-alphabetical-variant",variant:"text",class:"mr-2",onClick:o.sortStudentsByPinyin,disabled:i.modelValue.list.length===0},{default:n(()=>[...e[4]||(e[4]=[a(" 按姓名首字母排序 ",-1)])]),_:1},8,["onClick","disabled"]),t(p,{color:i.modelValue.advanced?"primary":void 0,variant:"text","prepend-icon":"mdi-code-braces",onClick:o.toggleAdvanced},{default:n(()=>[a(k(i.modelValue.advanced?"返回基础编辑":"高级编辑"),1)]),_:1},8,["color","onClick"])]),default:n(()=>[t(F,{class:"text-h6"},{default:n(()=>[...e[3]||(e[3]=[a("学生列表",-1)])]),_:1})]),_:1}),t(E,null,{default:n(()=>[i.loading?(m(),f(ze,{key:0,indeterminate:"",color:"primary",class:"mb-4"})):S("",!0),i.error?(m(),f(ee,{key:1,type:"error",variant:"tonal",closable:"",class:"mb-4"},{default:n(()=>[a(k(i.error),1)]),_:1})):S("",!0),t(un,null,{default:n(()=>[i.modelValue.advanced?(m(),I("div",As,[t(Ee,{modelValue:i.modelValue.text,"onUpdate:modelValue":[e[2]||(e[2]=c=>i.modelValue.text=c),o.handleTextInput],label:"批量编辑学生列表",placeholder:"每行输入一个学生姓名",hint:"使用文本编辑模式批量编辑学生名单,保存时会自动去除空行","persistent-hint":"",variant:"outlined",rows:"10"},null,8,["modelValue","onUpdate:modelValue"])])):(m(),I("div",Us,[t(be,{class:"mb-6"},{default:n(()=>[t(ae,{cols:"12",sm:"6",md:"4"},{default:n(()=>[t(L,{modelValue:i.newStudentName,"onUpdate:modelValue":e[0]||(e[0]=c=>i.newStudentName=c),label:"添加学生",placeholder:"输入学生姓名后回车添加","prepend-inner-icon":"mdi-account-plus",variant:"outlined","hide-details":"",class:"mb-4",onKeyup:ge(o.addStudent,["enter"])},{append:n(()=>[t(p,{icon:"mdi-plus",variant:"text",color:"primary",disabled:!i.newStudentName.trim(),onClick:o.addStudent},null,8,["disabled","onClick"])]),_:1},8,["modelValue","onKeyup"])]),_:1})]),_:1}),t(be,null,{default:n(()=>[(m(!0),I($,null,le(i.modelValue.list,(c,h)=>(m(),f(ae,{key:h,cols:"12",sm:"6",md:"4",lg:"3"},{default:n(()=>[t(Ns,null,{default:n(({isHovering:b,props:_})=>[t(U,Ke({ref_for:!0},_,{elevation:l.isMobile?1:b?4:1,class:"student-card",border:""}),{default:n(()=>[t(E,{class:"d-flex align-center pa-3"},{default:n(()=>[t(mt,{location:"bottom","open-on-hover":!l.isMobile},{activator:n(({props:N})=>[t(p,Ke({variant:"tonal",size:"small",class:"mr-3 font-weight-medium"},{ref_for:!0},N),{default:n(()=>[a(k(h+1),1)]),_:2},1040)]),default:n(()=>[t(P,{density:"compact",nav:""},{default:n(()=>[t(D,{"prepend-icon":"mdi-arrow-up-bold",disabled:h===0,onClick:N=>o.moveStudent(h,"top")},{default:n(()=>[...e[5]||(e[5]=[a(" 置顶 ",-1)])]),_:1},8,["disabled","onClick"]),t(A),t(D,{"prepend-icon":"mdi-arrow-up",disabled:h===0,onClick:N=>o.moveStudent(h,"up")},{default:n(()=>[...e[6]||(e[6]=[a(" 上移 ",-1)])]),_:1},8,["disabled","onClick"]),t(D,{"prepend-icon":"mdi-arrow-down",disabled:h===i.modelValue.list.length-1,onClick:N=>o.moveStudent(h,"down")},{default:n(()=>[...e[7]||(e[7]=[a(" 下移 ",-1)])]),_:1},8,["disabled","onClick"])]),_:2},1024)]),_:2},1032,["open-on-hover"]),i.editState.index===h?(m(),f(L,{key:0,modelValue:i.editState.name,"onUpdate:modelValue":e[1]||(e[1]=N=>i.editState.name=N),density:"compact",variant:"underlined","hide-details":"",class:"flex-grow-1",autofocus:"",onKeyup:ge(o.saveEdit,["enter"]),onBlur:o.saveEdit},null,8,["modelValue","onKeyup","onBlur"])):(m(),I("span",{key:1,class:"text-body-1 flex-grow-1",onClick:N=>o.handleClick(h,c)},k(c.name),9,js)),w("div",{class:$e(["d-flex gap-1 action-buttons",{"opacity-100":b||l.isMobile}])},[t(p,{icon:"mdi-pencil",variant:"text",color:"primary",size:"small",onClick:N=>o.startEdit(h,c)},null,8,["onClick"]),t(p,{icon:"mdi-delete",variant:"text",color:"error",size:"small",onClick:N=>o.removeStudent(h)},null,8,["onClick"])],2)]),_:2},1024)]),_:2},1040,["elevation"])]),_:2},1024)]),_:2},1024))),128))]),_:1})]))]),_:1}),t(be,{class:"mt-6"},{default:n(()=>[t(ae,{cols:"12",class:"d-flex gap-2"},{default:n(()=>[t(p,{color:"primary","prepend-icon":"mdi-content-save",size:"large",loading:i.loading,disabled:i.loading,onClick:o.saveStudents},{default:n(()=>[...e[8]||(e[8]=[a(" 保存名单 ",-1)])]),_:1},8,["loading","disabled","onClick"]),t(p,{color:"error",variant:"outlined","prepend-icon":"mdi-refresh",size:"large",loading:i.loading,disabled:i.loading,onClick:o.loadStudents},{default:n(()=>[...e[9]||(e[9]=[a(" 重载名单 ",-1)])]),_:1},8,["loading","disabled","onClick"])]),_:1})]),_:1})]),_:1})]),_:1},8,["color","class"])}const Ot=z(Es,[["render",Os],["__scopeId","data-v-fe47d12d"]]),Ms={name:"KvDatabaseCard",components:{SettingsCard:R},data(){return{loading:!1,loadingData:!1,savingData:!1,deletingData:!1,kvData:[],searchQuery:"",viewDialog:!1,editDialog:!1,deleteDialog:!1,createDialog:!1,cloudUrlDialog:!1,selectedItem:null,editingItem:null,itemToDelete:null,selectedCloudItem:null,gettingCloudUrl:!1,cloudUrlResult:null,cloudUrlError:null,cloudUrlOptions:{migrateFromLocal:!0,autoConfigureCloud:!0},editingData:"",newKey:"",newData:"",tableHeaders:[{title:"键名",key:"key",sortable:!0},{title:"操作",key:"actions",sortable:!1,width:"120px"}]}},computed:{currentProvider(){return y("server.provider")},isKvProvider(){return this.currentProvider==="kv-local"||this.currentProvider==="kv-server"||this.currentProvider==="classworkscloud"},connectionStatus(){return this.isKvProvider?this.currentProvider==="kv-local"?"本地数据库":"服务器数据库":"当前数据提供者不支持KV数据库管理"},connectionIcon(){return this.isKvProvider?this.currentProvider==="kv-local"?"mdi-database":"mdi-database-sync":"mdi-database-off"},connectionColor(){return this.isKvProvider?"success":"error"},filteredKvData(){return this.searchQuery?this.kvData.filter(s=>s.key.toLowerCase().includes(this.searchQuery.toLowerCase())):this.kvData},isValidJson(){if(!this.editingData)return!0;try{return JSON.parse(this.editingData),!0}catch{return!1}},isValidNewJson(){if(!this.newData)return!0;try{return JSON.parse(this.newData),!0}catch{return!1}},isValidKey(){return!this.newKey||this.newKey.trim()===""?!1:!this.kvData.some(s=>s.key===this.newKey.trim())}},async mounted(){this.isKvProvider&&await this.loadKvData()},methods:{async refreshConnection(){this.loading=!0;try{await new Promise(s=>setTimeout(s,500)),this.$message.success("连接状态已刷新")}catch(s){this.$message.error("刷新失败",s.message)}finally{this.loading=!1}},async loadKvData(){var s;if(!this.isKvProvider){this.$message.warning("当前数据提供者不支持KV数据库管理");return}this.loadingData=!0;try{this.kvData=[];const e=await oe.loadKeys({sortBy:"key",sortDir:"asc",limit:1e3});if(e.success===!1)throw new Error(((s=e.error)==null?void 0:s.message)||"获取键名列表失败");this.kvData=e.keys.map(l=>({key:l,value:null,loaded:!1})),this.$message.success("键名加载完成",`共找到 ${this.kvData.length} 个键,总计 ${e.total_rows} 个键`)}catch(e){this.$message.error("加载数据失败",e.message)}finally{this.loadingData=!1}},async viewItem(s){this.selectedItem=s,this.viewDialog=!0,(!s.loaded||s.value===null)&&await this.loadItemData(s)},async editItem(s){this.editingItem=s,(!s.loaded||s.value===null)&&await this.loadItemData(s),this.editingData=this.formatJsonData(s.value),this.editDialog=!0},async loadItemData(s){try{const e=await oe.loadData(s.key);if(e&&e.success!==!1)s.value=e,s.loaded=!0;else throw new Error("数据加载失败")}catch(e){this.$message.error("加载数据失败",e.message),s.value=null,s.loaded=!1}},closeEditDialog(){this.editDialog=!1,this.editingItem=null,this.editingData=""},createNewItem(){this.newKey="",this.newData=`{
|
||
"example": "value"
|
||
}`,this.createDialog=!0},closeCreateDialog(){this.createDialog=!1,this.newKey="",this.newData=""},async saveNewData(){var s;if(!(!this.isValidKey||!this.isValidNewJson)){this.savingData=!0;try{const e=JSON.parse(this.newData),l=this.newKey.trim(),u=await oe.saveData(l,e);if(u&&!u.error)this.kvData.push({key:l,value:e,loaded:!0}),this.$message.success("数据创建成功"),this.closeCreateDialog();else throw new Error(((s=u.error)==null?void 0:s.message)||"创建失败")}catch(e){this.$message.error("创建失败",e.message)}finally{this.savingData=!1}}},async saveEditedData(){var s;if(!(!this.isValidJson||!this.editingItem)){this.savingData=!0;try{const e=JSON.parse(this.editingData),l=await oe.saveData(this.editingItem.key,e);if(l&&!l.error){const u=this.kvData.findIndex(i=>i.key===this.editingItem.key);u!==-1&&(this.kvData[u].value=e,this.kvData[u].loaded=!0),this.$message.success("数据保存成功"),this.closeEditDialog()}else throw new Error(((s=l.error)==null?void 0:s.message)||"保存失败")}catch(e){this.$message.error("保存失败",e.message)}finally{this.savingData=!1}}},confirmDelete(s){this.itemToDelete=s,this.deleteDialog=!0},async deleteItem(){if(this.itemToDelete){this.deletingData=!0;try{this.currentProvider==="kv-local"?await(await gn("ClassworksDB",2)).transaction("kv","readwrite").objectStore("kv").delete(this.itemToDelete.key):await oe.saveData(this.itemToDelete.key,null);const s=this.kvData.findIndex(e=>e.key===this.itemToDelete.key);s!==-1&&this.kvData.splice(s,1),this.$message.success("数据删除成功"),this.deleteDialog=!1,this.itemToDelete=null}catch(s){this.$message.error("删除失败",s.message)}finally{this.deletingData=!1}}},formatJsonData(s){try{return JSON.stringify(s,null,2)}catch{return String(s)}},async copyToClipboard(s){try{const e=this.formatJsonData(s);await navigator.clipboard.writeText(e),this.$message.success("数据已复制到剪贴板")}catch(e){this.$message.error("复制失败",e.message)}},async getCloudUrl(s){this.selectedCloudItem=s,this.cloudUrlResult=null,this.cloudUrlError=null,this.cloudUrlDialog=!0,await this.fetchCloudUrl()},async fetchCloudUrl(){var s;if(this.selectedCloudItem){this.gettingCloudUrl=!0,this.cloudUrlError=null;try{const e=await oe.getKeyCloudUrl(this.selectedCloudItem.key,this.cloudUrlOptions);e.success?(this.cloudUrlResult=e,this.$message.success("云端地址获取成功")):(this.cloudUrlError=((s=e.error)==null?void 0:s.message)||"获取云端地址失败",this.$message.error("获取失败",this.cloudUrlError))}catch(e){this.cloudUrlError=e.message||"获取云端地址时发生错误",this.$message.error("获取失败",this.cloudUrlError)}finally{this.gettingCloudUrl=!1}}},async refreshCloudUrl(){await this.fetchCloudUrl()},async copyCloudUrl(){var s;if((s=this.cloudUrlResult)!=null&&s.url)try{await navigator.clipboard.writeText(this.cloudUrlResult.url),this.$message.success("云端地址已复制到剪贴板")}catch(e){this.$message.error("复制失败",e.message)}},openCloudUrl(){var s;if((s=this.cloudUrlResult)!=null&&s.url)try{window.open(this.cloudUrlResult.url,"_blank")}catch(e){this.$message.error("打开链接失败",e.message)}}}},Bs={class:"text-primary"},Ls={class:"mt-2"},Ps={key:0,class:"mb-2"},Ks={key:1,class:"mb-2"};function Rs(s,e,l,u,i,o){const r=R;return m(),f(r,{title:"KV数据库管理",icon:"mdi-database-edit",loading:i.loading},{default:n(()=>[t(P,null,{default:n(()=>[t(D,null,{prepend:n(()=>[t(x,{icon:o.connectionIcon,color:o.connectionColor,class:"mr-3"},null,8,["icon","color"])]),append:n(()=>[t(p,{variant:"tonal",onClick:o.refreshConnection,loading:i.loading},{default:n(()=>[...e[18]||(e[18]=[a(" 刷新 ",-1)])]),_:1},8,["onClick","loading"])]),default:n(()=>[t(K,null,{default:n(()=>[...e[17]||(e[17]=[a("数据库状态",-1)])]),_:1}),t(Z,null,{default:n(()=>[a(k(o.connectionStatus),1)]),_:1})]),_:1}),t(A,{class:"my-2"}),t(D,null,{prepend:n(()=>[t(x,{icon:"mdi-format-list-bulleted",class:"mr-3"})]),append:n(()=>[t(et,{variant:"tonal"},{default:n(()=>[t(p,{onClick:o.loadKvData,loading:i.loadingData},{default:n(()=>[...e[20]||(e[20]=[a(" 加载数据 ",-1)])]),_:1},8,["onClick","loading"]),t(p,{onClick:o.createNewItem,disabled:!o.isKvProvider},{default:n(()=>[t(x,{icon:"mdi-plus",class:"mr-1"}),e[21]||(e[21]=a(" 新建 ",-1))]),_:1},8,["onClick","disabled"])]),_:1})]),default:n(()=>[t(K,null,{default:n(()=>[...e[19]||(e[19]=[a("数据条目",-1)])]),_:1}),t(Z,null,{default:n(()=>[a("共 "+k(i.kvData.length)+" 条记录",1)]),_:1})]),_:1})]),_:1}),i.kvData.length>0?(m(),f(U,{key:0,class:"mt-4",variant:"outlined"},{default:n(()=>[t(F,{class:"d-flex align-center"},{default:n(()=>[t(x,{icon:"mdi-table",class:"mr-2"}),e[22]||(e[22]=a(" KV数据列表 ",-1)),t(H),t(L,{modelValue:i.searchQuery,"onUpdate:modelValue":e[0]||(e[0]=c=>i.searchQuery=c),label:"搜索键名","prepend-inner-icon":"mdi-magnify",variant:"outlined",density:"compact","hide-details":"",clearable:"",style:{"max-width":"300px"}},null,8,["modelValue"])]),_:1}),t(yt,{headers:i.tableHeaders,items:o.filteredKvData,loading:i.loadingData,"item-value":"key",class:"elevation-0","items-per-page":10},{"item.key":n(({item:c})=>[w("code",Bs,k(c.key),1)]),"item.actions":n(({item:c})=>[t(et,{variant:"text",density:"compact"},{default:n(()=>[t(p,{icon:"mdi-eye",size:"small",onClick:h=>o.viewItem(c),title:"查看"},null,8,["onClick"]),t(p,{icon:"mdi-pencil",size:"small",onClick:h=>o.editItem(c),title:"编辑"},null,8,["onClick"]),t(p,{icon:"mdi-cloud-download",size:"small",color:"primary",onClick:h=>o.getCloudUrl(c),title:"获取云端地址"},null,8,["onClick"]),t(p,{icon:"mdi-delete",size:"small",color:"error",onClick:h=>o.confirmDelete(c),title:"删除"},null,8,["onClick"])]),_:2},1024)]),_:2},1032,["headers","items","loading"])]),_:1})):S("",!0),t(pe,{modelValue:i.viewDialog,"onUpdate:modelValue":e[4]||(e[4]=c=>i.viewDialog=c),"max-width":"800px"},{default:n(()=>[t(U,null,{default:n(()=>[t(F,{class:"d-flex align-center"},{default:n(()=>[t(x,{icon:"mdi-eye",class:"mr-2"}),e[23]||(e[23]=a(" 查看数据 ",-1)),t(H),t(p,{icon:"mdi-close",variant:"text",onClick:e[1]||(e[1]=c=>i.viewDialog=!1)})]),_:1}),i.selectedItem?(m(),f(Ve,{key:0},{default:n(()=>[e[24]||(e[24]=a(" 键名: ",-1)),w("code",null,k(i.selectedItem.key),1)]),_:1})):S("",!0),t(E,null,{default:n(()=>[i.selectedItem?(m(),f(Ee,{key:0,"model-value":o.formatJsonData(i.selectedItem.value),label:"数据内容",variant:"outlined",readonly:"",rows:"15",class:"font-monospace"},null,8,["model-value"])):S("",!0)]),_:1}),t(X,null,{default:n(()=>[t(H),t(p,{onClick:e[2]||(e[2]=c=>{var h;return o.copyToClipboard((h=i.selectedItem)==null?void 0:h.value)}),variant:"tonal"},{default:n(()=>[t(x,{icon:"mdi-content-copy",class:"mr-1"}),e[25]||(e[25]=a(" 复制数据 ",-1))]),_:1}),t(p,{onClick:e[3]||(e[3]=c=>i.viewDialog=!1),variant:"text"},{default:n(()=>[...e[26]||(e[26]=[a(" 关闭 ",-1)])]),_:1})]),_:1})]),_:1})]),_:1},8,["modelValue"]),t(pe,{modelValue:i.editDialog,"onUpdate:modelValue":e[6]||(e[6]=c=>i.editDialog=c),"max-width":"800px"},{default:n(()=>[t(U,null,{default:n(()=>[t(F,{class:"d-flex align-center"},{default:n(()=>[t(x,{icon:"mdi-pencil",class:"mr-2"}),e[27]||(e[27]=a(" 编辑数据 ",-1)),t(H),t(p,{icon:"mdi-close",variant:"text",onClick:o.closeEditDialog},null,8,["onClick"])]),_:1}),i.editingItem?(m(),f(Ve,{key:0},{default:n(()=>[e[28]||(e[28]=a(" 键名: ",-1)),w("code",null,k(i.editingItem.key),1)]),_:1})):S("",!0),t(E,null,{default:n(()=>[t(Ee,{modelValue:i.editingData,"onUpdate:modelValue":e[5]||(e[5]=c=>i.editingData=c),label:"数据内容 (JSON格式)",variant:"outlined",rows:"15",class:"font-monospace",error:!o.isValidJson,"error-messages":o.isValidJson?[]:["请输入有效的JSON格式"]},null,8,["modelValue","error","error-messages"])]),_:1}),t(X,null,{default:n(()=>[t(H),t(p,{onClick:o.closeEditDialog,variant:"text"},{default:n(()=>[...e[29]||(e[29]=[a(" 取消 ",-1)])]),_:1},8,["onClick"]),t(p,{onClick:o.saveEditedData,variant:"tonal",color:"primary",disabled:!o.isValidJson,loading:i.savingData},{default:n(()=>[...e[30]||(e[30]=[a(" 保存 ",-1)])]),_:1},8,["onClick","disabled","loading"])]),_:1})]),_:1})]),_:1},8,["modelValue"]),t(pe,{modelValue:i.createDialog,"onUpdate:modelValue":e[9]||(e[9]=c=>i.createDialog=c),"max-width":"800px"},{default:n(()=>[t(U,null,{default:n(()=>[t(F,{class:"d-flex align-center"},{default:n(()=>[t(x,{icon:"mdi-plus",class:"mr-2"}),e[31]||(e[31]=a(" 新建数据 ",-1)),t(H),t(p,{icon:"mdi-close",variant:"text",onClick:o.closeCreateDialog},null,8,["onClick"])]),_:1}),t(E,null,{default:n(()=>[t(L,{modelValue:i.newKey,"onUpdate:modelValue":e[7]||(e[7]=c=>i.newKey=c),label:"键名",variant:"outlined",class:"mb-4",error:!o.isValidKey,"error-messages":o.isValidKey?[]:["键名不能为空且不能与现有键重复"],placeholder:"请输入键名,如:my-config"},null,8,["modelValue","error","error-messages"]),t(Ee,{modelValue:i.newData,"onUpdate:modelValue":e[8]||(e[8]=c=>i.newData=c),label:"数据内容 (JSON格式)",variant:"outlined",rows:"15",class:"font-monospace",error:!o.isValidNewJson,"error-messages":o.isValidNewJson?[]:["请输入有效的JSON格式"],placeholder:'请输入JSON数据,如:{"name": "value"}'},null,8,["modelValue","error","error-messages"])]),_:1}),t(X,null,{default:n(()=>[t(H),t(p,{onClick:o.closeCreateDialog,variant:"text"},{default:n(()=>[...e[32]||(e[32]=[a(" 取消 ",-1)])]),_:1},8,["onClick"]),t(p,{onClick:o.saveNewData,variant:"tonal",color:"primary",disabled:!o.isValidKey||!o.isValidNewJson,loading:i.savingData},{default:n(()=>[...e[33]||(e[33]=[a(" 创建 ",-1)])]),_:1},8,["onClick","disabled","loading"])]),_:1})]),_:1})]),_:1},8,["modelValue"]),t(pe,{modelValue:i.cloudUrlDialog,"onUpdate:modelValue":e[14]||(e[14]=c=>i.cloudUrlDialog=c),"max-width":"800px"},{default:n(()=>[t(U,null,{default:n(()=>[t(F,{class:"d-flex align-center"},{default:n(()=>[t(x,{icon:"mdi-cloud-download",class:"mr-2"}),e[34]||(e[34]=a(" 获取云端访问地址 ",-1)),t(H),t(p,{icon:"mdi-close",variant:"text",onClick:e[10]||(e[10]=c=>i.cloudUrlDialog=!1)})]),_:1}),i.selectedCloudItem?(m(),f(Ve,{key:0},{default:n(()=>[e[35]||(e[35]=a(" 键名: ",-1)),w("code",null,k(i.selectedCloudItem.key),1)]),_:1})):S("",!0),t(E,null,{default:n(()=>[i.cloudUrlError?(m(),f(ee,{key:0,type:"error",variant:"tonal",class:"mb-4"},{default:n(()=>[a(k(i.cloudUrlError),1)]),_:1})):S("",!0),i.cloudUrlResult&&i.cloudUrlResult.success?(m(),f(ee,{key:1,type:"success",variant:"tonal",class:"mb-4"},{default:n(()=>[t(De,null,{default:n(()=>[...e[36]||(e[36]=[a("云端地址获取成功",-1)])]),_:1}),w("div",Ls,[i.cloudUrlResult.migrated?(m(),I("div",Ps,[t(x,{icon:"mdi-database-arrow-up",class:"mr-1",color:"success"}),e[37]||(e[37]=a(" 数据已从本地迁移到云端 ",-1))])):S("",!0),i.cloudUrlResult.configured?(m(),I("div",Ks,[t(x,{icon:"mdi-cog",class:"mr-1",color:"info"}),e[38]||(e[38]=a(" 云端配置已自动设置 ",-1))])):S("",!0)])]),_:1})):S("",!0),i.cloudUrlResult&&i.cloudUrlResult.url?(m(),f(L,{key:2,"model-value":i.cloudUrlResult.url,label:"云端访问地址",variant:"outlined",readonly:"",class:"font-monospace","append-inner-icon":"mdi-content-copy","onClick:appendInner":o.copyCloudUrl},null,8,["model-value","onClick:appendInner"])):S("",!0),i.cloudUrlResult&&i.cloudUrlResult.url?(m(),f(ft,{key:3,class:"mt-4"},{default:n(()=>[t(gt,null,{default:n(()=>[t(vt,null,{default:n(()=>[t(x,{icon:"mdi-cog",class:"mr-2"}),e[39]||(e[39]=a(" 高级选项 ",-1))]),_:1}),t(bt,null,{default:n(()=>[t(tt,{modelValue:i.cloudUrlOptions.migrateFromLocal,"onUpdate:modelValue":e[11]||(e[11]=c=>i.cloudUrlOptions.migrateFromLocal=c),label:"从本地迁移数据到云端",density:"compact"},null,8,["modelValue"]),t(tt,{modelValue:i.cloudUrlOptions.autoConfigureCloud,"onUpdate:modelValue":e[12]||(e[12]=c=>i.cloudUrlOptions.autoConfigureCloud=c),label:"自动配置云端默认设置",density:"compact"},null,8,["modelValue"]),t(p,{onClick:o.refreshCloudUrl,variant:"tonal",color:"primary",loading:i.gettingCloudUrl,class:"mt-2"},{default:n(()=>[t(x,{icon:"mdi-refresh",class:"mr-1"}),e[40]||(e[40]=a(" 重新获取 ",-1))]),_:1},8,["onClick","loading"])]),_:1})]),_:1})]),_:1})):S("",!0)]),_:1}),t(X,null,{default:n(()=>[t(H),t(p,{onClick:e[13]||(e[13]=c=>i.cloudUrlDialog=!1),variant:"text"},{default:n(()=>[...e[41]||(e[41]=[a(" 关闭 ",-1)])]),_:1}),i.cloudUrlResult&&i.cloudUrlResult.url?(m(),f(p,{key:0,onClick:o.openCloudUrl,variant:"tonal",color:"primary"},{default:n(()=>[t(x,{icon:"mdi-open-in-new",class:"mr-1"}),e[42]||(e[42]=a(" 在新窗口打开 ",-1))]),_:1},8,["onClick"])):S("",!0)]),_:1})]),_:1})]),_:1},8,["modelValue"]),t(pe,{modelValue:i.deleteDialog,"onUpdate:modelValue":e[16]||(e[16]=c=>i.deleteDialog=c),"max-width":"400px"},{default:n(()=>[t(U,null,{default:n(()=>[t(F,{class:"d-flex align-center text-error"},{default:n(()=>[t(x,{icon:"mdi-alert",class:"mr-2"}),e[43]||(e[43]=a(" 确认删除 ",-1))]),_:1}),t(E,null,{default:n(()=>{var c;return[e[45]||(e[45]=a(" 确定要删除键名为 ",-1)),w("code",null,k((c=i.itemToDelete)==null?void 0:c.key),1),e[46]||(e[46]=a(" 的数据吗? ",-1)),e[47]||(e[47]=w("br",null,null,-1)),e[48]||(e[48]=w("br",null,null,-1)),t(ee,{type:"warning",variant:"tonal",class:"mt-2"},{default:n(()=>[...e[44]||(e[44]=[a(" 此操作不可撤销,请谨慎操作! ",-1)])]),_:1})]}),_:1}),t(X,null,{default:n(()=>[t(H),t(p,{onClick:e[15]||(e[15]=c=>i.deleteDialog=!1),variant:"text"},{default:n(()=>[...e[49]||(e[49]=[a(" 取消 ",-1)])]),_:1}),t(p,{onClick:o.deleteItem,variant:"tonal",color:"error",loading:i.deletingData},{default:n(()=>[...e[50]||(e[50]=[a(" 删除 ",-1)])]),_:1},8,["onClick","loading"])]),_:1})]),_:1})]),_:1},8,["modelValue"])]),_:1},8,["loading"])}const Mt=z(Ms,[["render",Rs],["__scopeId","data-v-8316248f"]]),zs={name:"DataProviderSettingsCard",components:{SettingsCard:R},data(){return{loading:!1,serverchecktime:{},confirmDialog:!1,confirmTitle:"",confirmMessage:"",confirmAction:null,machineId:null,migrateLoading:!1}},computed:{currentProvider(){return y("server.provider")},isKvProvider(){return this.currentProvider==="kv-local"||this.currentProvider==="kv-server"||this.currentProvider==="classworkscloud"}},async created(){this.machineId=y("device.uuid")},methods:{async checkServerConnection(){this.loading=!0,this.serverchecktime=new Date;try{const s=y("server.domain"),e=y("server.siteKey"),l={Accept:"application/json"};if(e&&(l["x-site-key"]=e),(await vn.get(`${s}/check`,{method:"GET",headers:l})).data.status==="success")this.$message.success("连接成功","服务器连接正常 延迟"+(new Date-this.serverchecktime)+"ms");else throw new Error("服务器响应异常")}catch(s){this.$message.error("连接失败",s.message||"无法连接到服务器")}finally{this.loading=!1}},confirmClearLocalStorage(){this.confirmTitle="确认清除",this.confirmMessage="此操作将清除所有本地存储的数据,确定要继续吗?",this.confirmAction=this.clearLocalStorage,this.confirmDialog=!0},clearLocalStorage(){try{localStorage.clear(),this.$message.success("清除成功","本地存储数据已清除"),this.confirmDialog=!1}catch(s){this.$message.error("清除失败",s.message)}},confirmClearIndexedDB(){this.confirmTitle="确认清除",this.confirmMessage="此操作将清除所有IndexedDB中的数据,确定要继续吗?",this.confirmAction=this.clearIndexedDB,this.confirmDialog=!0},async clearIndexedDB(){try{await window.indexedDB.deleteDatabase("ClassworksDB"),this.$message.success("清除成功","数据库缓存已清除"),this.confirmDialog=!1,this.isKvProvider&&setTimeout(()=>{window.location.reload()},1500)}catch(s){this.$message.error("清除失败",s.message)}},async exportData(){try{const s="ClassworksDB",e={indexedDB:{}},l=await new Promise((h,b)=>{const _=window.indexedDB.open(s);_.onerror=()=>b(_.error),_.onsuccess=()=>h(_.result)}),u=Array.from(l.objectStoreNames);for(const h of u){const _=l.transaction(h,"readonly").objectStore(h),N=await new Promise((Q,J)=>{const G=_.getAll();G.onerror=()=>J(G.error),G.onsuccess=()=>Q(G.result)});e.indexedDB[h]=N}const i=new Blob([JSON.stringify(e,null,2)],{type:"application/json"}),o=URL.createObjectURL(i),r=document.createElement("a"),c=new Date().toISOString().split("T")[0];r.href=o,r.download=`homework-indexeddb-${c}.json`,r.click(),URL.revokeObjectURL(o),this.$message.success("导出成功","IndexedDB数据已导出")}catch(s){console.error("导出失败:",s),this.$message.error("导出失败",s.message||"无法导出数据库数据")}},async migrateData(){this.migrateLoading=!0,this.$router.push("/datamigration"),this.migrateLoading=!1},handleConfirm(){this.confirmAction&&this.confirmAction()}}};function Js(s,e,l,u,i,o){const r=R;return m(),f(r,{title:"数据源设置",icon:"mdi-database-cog"},{default:n(()=>[t(P,null,{default:n(()=>[o.currentProvider==="kv-server"||o.currentProvider==="classworkscloud"?(m(),f(D,{key:0},{prepend:n(()=>[t(x,{icon:"mdi-lan-connect",class:"mr-3"})]),append:n(()=>[t(p,{loading:i.loading,variant:"tonal",onClick:o.checkServerConnection},{default:n(()=>[...e[3]||(e[3]=[a(" 测试连接 ",-1)])]),_:1},8,["loading","onClick"])]),default:n(()=>[t(K,null,{default:n(()=>[...e[2]||(e[2]=[a("检查服务器连接",-1)])]),_:1})]),_:1})):S("",!0),o.currentProvider==="kv-local"?(m(),I($,{key:1},[t(D,null,{prepend:n(()=>[t(x,{icon:"mdi-database",class:"mr-3"})]),append:n(()=>[t(p,{color:"error",variant:"tonal",onClick:o.confirmClearIndexedDB},{default:n(()=>[...e[6]||(e[6]=[a(" 清除 ",-1)])]),_:1},8,["onClick"])]),default:n(()=>[t(K,null,{default:n(()=>[...e[4]||(e[4]=[a("清除数据库缓存",-1)])]),_:1}),t(Z,null,{default:n(()=>[...e[5]||(e[5]=[a("这将清除所有本地数据库中的数据",-1)])]),_:1})]),_:1}),t(D,null,{prepend:n(()=>[t(x,{icon:"mdi-database-export",class:"mr-3"})]),append:n(()=>[t(p,{variant:"tonal",onClick:o.exportData},{default:n(()=>[...e[8]||(e[8]=[a(" 导出 ",-1)])]),_:1},8,["onClick"])]),default:n(()=>[t(K,null,{default:n(()=>[...e[7]||(e[7]=[a("导出数据库",-1)])]),_:1})]),_:1})],64)):S("",!0),t(D,null,{prepend:n(()=>[t(x,{icon:"mdi-database-import",class:"mr-3"})]),append:n(()=>[t(p,{loading:i.migrateLoading,variant:"tonal",onClick:o.migrateData},{default:n(()=>[...e[11]||(e[11]=[a(" 迁移 ",-1)])]),_:1},8,["loading","onClick"])]),default:n(()=>[t(K,null,{default:n(()=>[...e[9]||(e[9]=[a("迁移旧数据",-1)])]),_:1}),t(Z,null,{default:n(()=>[...e[10]||(e[10]=[a("将旧的存储格式数据转移到新的KV存储",-1)])]),_:1})]),_:1}),t(D,null,{prepend:n(()=>[t(x,{icon:"mdi-identifier",class:"mr-3"})]),default:n(()=>[t(K,null,{default:n(()=>[...e[12]||(e[12]=[a("本机唯一标识符",-1)])]),_:1}),i.machineId?(m(),f(Z,{key:0},{default:n(()=>[a(k(i.machineId),1)]),_:1})):(m(),f(Z,{key:1},{default:n(()=>[...e[13]||(e[13]=[a("正在加载...",-1)])]),_:1}))]),_:1}),t(D,null,{prepend:n(()=>[t(x,{icon:"mdi-lan-connect",class:"mr-3"})]),append:n(()=>[t(p,{variant:"tonal",to:"/cachemanagement"},{default:n(()=>[...e[15]||(e[15]=[a(" 查看 ",-1)])]),_:1})]),default:n(()=>[t(K,null,{default:n(()=>[...e[14]||(e[14]=[a("查看本地缓存",-1)])]),_:1})]),_:1})]),_:1}),t(pe,{modelValue:i.confirmDialog,"onUpdate:modelValue":e[1]||(e[1]=c=>i.confirmDialog=c),"max-width":"400"},{default:n(()=>[t(U,null,{default:n(()=>[t(F,null,{default:n(()=>[a(k(i.confirmTitle),1)]),_:1}),t(E,null,{default:n(()=>[a(k(i.confirmMessage),1)]),_:1}),t(X,null,{default:n(()=>[t(H),t(p,{color:"grey",variant:"text",onClick:e[0]||(e[0]=c=>i.confirmDialog=!1)},{default:n(()=>[...e[16]||(e[16]=[a("取消",-1)])]),_:1}),t(p,{color:"error",variant:"tonal",onClick:o.handleConfirm},{default:n(()=>[...e[17]||(e[17]=[a("确认",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1})]),_:1},8,["modelValue"])]),_:1})}const Bt=z(zs,[["render",Js]]),Fs={name:"CloudNamespaceInfoCard",props:{visible:{type:Boolean,default:!0}},data(){return{namespaceInfo:{},loading:!1,hasNamespaceInfo:!1,showReinitDialog:!1,defaultAuthServer:y("server.authDomain")}},watch:{visible(s){s===!0&&this.fetchNamespaceInfo()}},mounted(){this.visible&&this.fetchNamespaceInfo()},methods:{formatDate(s){if(!s)return"未知";try{return new Date(s).toLocaleString("zh-CN")}catch{return s}},async fetchNamespaceInfo(){this.loading=!0;try{const s=await fn.loadNamespaceInfo();this.namespaceInfo=s,this.hasNamespaceInfo=!0,this.loading=!1}catch(s){console.error("获取命名空间信息失败:",s),this.hasNamespaceInfo=!1,this.namespaceInfo={}}finally{this.loading=!1}},async reloadInfo(){await this.fetchNamespaceInfo()},confirmReinitialize(){xe("server.kvToken",""),xe("device.uuid",""),this.showReinitDialog=!1,this.$router.push("/")}}},Qs={key:0,class:"d-flex align-center mb-4"},Hs={class:"d-flex flex-column gap-1"},Ws={class:"d-flex align-center"},qs={class:"d-flex align-center"},Gs={class:"d-flex align-center"},Ys={class:"text-truncate"},Zs={class:"d-flex align-center"},Xs={key:0,class:"d-flex align-center"};function $s(s,e,l,u,i,o){return m(),f(U,{class:"my-4",loading:i.loading,disabled:!i.hasNamespaceInfo},{loader:n(()=>[i.loading?(m(),f(ze,{key:0,indeterminate:"",color:"primary"})):S("",!0)]),default:n(()=>[t(F,null,{default:n(()=>[t(x,{class:"me-2"},{default:n(()=>[...e[3]||(e[3]=[a(" mdi-cloud-check ",-1)])]),_:1}),e[4]||(e[4]=a(" 设备信息 ",-1))]),_:1}),i.hasNamespaceInfo?(m(),f(E,{key:0},{default:n(()=>[i.namespaceInfo.account?(m(),I("div",Qs,[t(U,{border:"",hover:"",class:"w-100",variant:"tonal","prepend-avatar":i.namespaceInfo.account.avatarUrl,title:i.namespaceInfo.account.name||"未命名用户",subtitle:"此设备由贵校管理 管理员账号 ID: "+i.namespaceInfo.account.id},{default:n(()=>[t(E,null,{default:n(()=>[...e[5]||(e[5]=[a("此设备由贵校或贵单位管理,该管理员系此空间所有者,如有疑问请咨询他,对于恶意绑定、滥用行为请反馈。",-1)])]),_:1})]),_:1},8,["prepend-avatar","title","subtitle"])])):S("",!0),i.namespaceInfo.device?(m(),f(U,{key:1,variant:"tonal",class:"mb-4",border:"",hover:""},{default:n(()=>[t(F,{class:"pb-1"},{default:n(()=>[...e[6]||(e[6]=[a(" 设备信息 ",-1)])]),_:1}),t(E,null,{default:n(()=>[w("div",Hs,[w("div",Ws,[t(x,{size:"small",class:"me-2"},{default:n(()=>[...e[7]||(e[7]=[a(" mdi-tag ",-1)])]),_:1}),e[8]||(e[8]=w("span",{class:"font-weight-medium me-2"},"设备名称:",-1)),w("span",null,k(i.namespaceInfo.device.name||"未命名设备"),1)]),w("div",qs,[t(x,{size:"small",class:"me-2"},{default:n(()=>[...e[9]||(e[9]=[a(" mdi-identifier ",-1)])]),_:1}),e[10]||(e[10]=w("span",{class:"font-weight-medium me-2"},"设备 ID:",-1)),w("span",null,k(i.namespaceInfo.device.id),1)]),w("div",Gs,[t(x,{size:"small",class:"me-2"},{default:n(()=>[...e[11]||(e[11]=[a(" mdi-uuid ",-1)])]),_:1}),e[12]||(e[12]=w("span",{class:"font-weight-medium me-2"},"UUID:",-1)),w("span",Ys,k(i.namespaceInfo.device.uuid||"未知"),1)]),w("div",Zs,[t(x,{size:"small",class:"me-2"},{default:n(()=>[...e[13]||(e[13]=[a(" mdi-calendar ",-1)])]),_:1}),e[14]||(e[14]=w("span",{class:"font-weight-medium me-2"},"创建时间:",-1)),w("span",null,k(o.formatDate(i.namespaceInfo.device.createdAt)),1)]),i.namespaceInfo.device.updatedAt?(m(),I("div",Xs,[t(x,{size:"small",class:"me-2"},{default:n(()=>[...e[15]||(e[15]=[a(" mdi-calendar-clock ",-1)])]),_:1}),e[16]||(e[16]=w("span",{class:"font-weight-medium me-2"},"更新时间:",-1)),w("span",null,k(o.formatDate(i.namespaceInfo.device.updatedAt)),1)])):S("",!0)])]),_:1})]),_:1})):S("",!0),t(U,{title:"Classworks KV",subtitle:"云原生键值数据库",border:"",hover:""},{default:n(()=>[t(E,null,{default:n(()=>[...e[17]||(e[17]=[a("Classworks KV 是厚浪云推出的云原生键值数据库,其是一个开放的云应用平台,为各种应用提供存储服务。此设备正在使用其服务,如果您希望管理设备信息,请前往 Classworks KV 的网站,如果您在服务推出前就在使用 Classworks,您的数据已被自动迁移。 ",-1),w("br",null,null,-1),w("br",null,null,-1),a("Classworks KV 的全域管理员是 ",-1),w("a",{href:"https://wuyuan.dev",target:"_blank"},"孙悟元",-1)])]),_:1}),t(X,null,{default:n(()=>[t(p,{href:i.defaultAuthServer,class:"text-none","append-icon":"mdi-open-in-new",target:"_blank"},{default:n(()=>[...e[18]||(e[18]=[a("前往 Classworks KV",-1)])]),_:1},8,["href"])]),_:1})]),_:1})]),_:1})):(m(),f(E,{key:1},{default:n(()=>[t(ee,{type:"info",variant:"tonal"},{default:n(()=>[t(De,null,{default:n(()=>[...e[19]||(e[19]=[a("未获取到设备信息",-1)])]),_:1}),e[20]||(e[20]=w("p",null,"您尚未完成云端存储授权或连接失败,请点击下方按钮进行初始化。",-1))]),_:1})]),_:1})),t(X,null,{default:n(()=>[t(H),t(p,{color:"primary",variant:"outlined",loading:i.loading,onClick:o.reloadInfo},{default:n(()=>[...e[21]||(e[21]=[a(" 刷新设备信息 ",-1)])]),_:1},8,["loading","onClick"]),t(p,{color:"error",variant:"outlined",onClick:e[0]||(e[0]=r=>i.showReinitDialog=!0)},{default:n(()=>[...e[22]||(e[22]=[a(" 重新初始化云端存储 ",-1)])]),_:1})]),_:1}),t(pe,{modelValue:i.showReinitDialog,"onUpdate:modelValue":e[2]||(e[2]=r=>i.showReinitDialog=r),"max-width":"500"},{default:n(()=>[t(U,null,{default:n(()=>[t(F,null,{default:n(()=>[...e[23]||(e[23]=[a("确认重新初始化",-1)])]),_:1}),t(E,null,{default:n(()=>[t(ee,{type:"warning",variant:"tonal",class:"mb-3"},{default:n(()=>[t(De,null,{default:n(()=>[...e[24]||(e[24]=[a("警告",-1)])]),_:1}),e[25]||(e[25]=a(" 此操作将清除当前的云端存储配置(包括 Token),您需要重新进行授权。 ",-1))]),_:1}),e[26]||(e[26]=w("p",null,"您确定要重新初始化云端存储吗?",-1))]),_:1}),t(X,null,{default:n(()=>[t(H),t(p,{variant:"text",onClick:e[1]||(e[1]=r=>i.showReinitDialog=!1)},{default:n(()=>[...e[27]||(e[27]=[a("取消",-1)])]),_:1}),t(p,{color:"error",onClick:o.confirmReinitialize},{default:n(()=>[...e[28]||(e[28]=[a("确认",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1})]),_:1},8,["modelValue"])]),_:1},8,["loading","disabled"])}const Lt=z(Fs,[["render",$s]]),ei={name:"ServerSettingsCard",components:{SettingsCard:R,CloudNamespaceInfoCard:Lt},props:{loading:Boolean},data(){return{unwatch:null,serverSettings:{provider:y("server.provider"),domain:y("server.domain"),classNumber:y("server.classNumber"),kvToken:y("server.kvToken")},settingsChangeTimeout:null}},computed:{currentProvider(){return this.serverSettings.provider},isKvProvider(){return this.currentProvider==="kv-local"||this.currentProvider==="kv-server"},isClassworksCloud(){return this.currentProvider==="classworkscloud"},useServer(){return this.currentProvider==="server"||this.currentProvider==="kv-server"||this.currentProvider==="classworkscloud"}},watch:{serverSettings:{handler(){this.settingsChangeTimeout&&clearTimeout(this.settingsChangeTimeout),this.settingsChangeTimeout=setTimeout(()=>{this.saveAllSettings()},100)},deep:!0}},mounted(){this.loadAllSettings(),this.unwatch=Fe(()=>{this.loadAllSettings(),this.$forceUpdate&&this.$forceUpdate()})},beforeUnmount(){this.unwatch&&this.unwatch()},methods:{loadAllSettings(){this.serverSettings={provider:y("server.provider"),domain:y("server.domain"),classNumber:y("server.classNumber"),kvToken:y("server.kvToken")}},saveAllSettings(){Object.entries(this.serverSettings).forEach(([s,e])=>{const l=`server.${s}`,u=y(l);e!==u&&(xe(l,e)?console.log(`设置已更新: ${l} = ${e}`):(console.error(`设置失败: ${l}`),this.serverSettings[s]=u))})}}},ti={key:0},ni={key:2},si={key:3},ii={key:4};function oi(s,e,l,u,i,o){const r=Lt,c=R;return m(),f(c,{title:"数据源设置",icon:"mdi-database",loading:l.loading},{default:n(()=>[t(wt,null,{default:n(()=>[t(ht,{modelValue:i.serverSettings.provider,"onUpdate:modelValue":e[0]||(e[0]=h=>i.serverSettings.provider=h),items:[{title:"Classworks云端存储",value:"classworkscloud"},{title:"KV本地存储",value:"kv-local"},{title:"KV远程服务器",value:"kv-server"}],label:"数据提供者",variant:"outlined",density:"comfortable","item-title":"title","item-value":"value","prepend-icon":"mdi-database",class:"mb-3"},null,8,["modelValue"]),o.isKvProvider?(m(),f(ee,{key:0,type:"info",variant:"tonal",class:"my-2"},{default:n(()=>[t(De,null,{default:n(()=>[...e[5]||(e[5]=[a("KV 存储系统",-1)])]),_:1}),e[7]||(e[7]=w("p",null,"KV存储系统使用本机唯一标识符(UUID)来区分不同设备的数据。",-1)),o.currentProvider==="kv-server"?(m(),I("p",ti,[...e[6]||(e[6]=[a(" 服务器端点格式: ",-1),w("code",null,"http(s)://服务器域名/",-1),w("br",null,null,-1),a(" 在服务器域名处仅填写基础URL,不需要任何路径。 ",-1)])])):S("",!0)]),_:1})):S("",!0),o.isClassworksCloud?(m(),f(ee,{key:1,type:"info",color:"success",variant:"tonal",class:"my-2"},{default:n(()=>[t(De,null,{default:n(()=>[...e[8]||(e[8]=[a("Classworks云端存储",-1)])]),_:1}),e[9]||(e[9]=w("p",null,"Classworks云端存储是官方提供的存储解决方案,自动配置了最优的访问设置。",-1)),e[10]||(e[10]=w("p",null,"使用此选项时,服务器域名和网站令牌将自动配置,无需手动设置。",-1))]),_:1})):S("",!0),t(A,{class:"my-2"}),o.isClassworksCloud?(m(),I("div",ni,[t(L,{modelValue:i.serverSettings.kvToken,"onUpdate:modelValue":e[1]||(e[1]=h=>i.serverSettings.kvToken=h),label:"KV 授权令牌",variant:"outlined",density:"comfortable","prepend-icon":"mdi-shield-key",class:"mb-2",hint:"令牌用于云端存储授权","persistent-hint":""},null,8,["modelValue"]),t(r,{visible:o.isClassworksCloud,class:"mt-4"},null,8,["visible"])])):o.currentProvider==="kv-server"?(m(),I("div",si,[t(L,{modelValue:i.serverSettings.domain,"onUpdate:modelValue":e[2]||(e[2]=h=>i.serverSettings.domain=h),label:"服务器域名",variant:"outlined",density:"comfortable","prepend-icon":"mdi-web",class:"mb-2",hint:"例如: https://example.com (不需要路径)","persistent-hint":""},null,8,["modelValue"]),t(L,{modelValue:i.serverSettings.kvToken,"onUpdate:modelValue":e[3]||(e[3]=h=>i.serverSettings.kvToken=h),label:"KV 授权令牌",variant:"outlined",density:"comfortable","prepend-icon":"mdi-shield-key",class:"mb-2",hint:"令牌用于服务器验证","persistent-hint":""},null,8,["modelValue"])])):o.currentProvider==="kv-local"?(m(),I("div",ii,[t(L,{modelValue:i.serverSettings.classNumber,"onUpdate:modelValue":e[4]||(e[4]=h=>i.serverSettings.classNumber=h),label:"班级编号",variant:"outlined",density:"comfortable","prepend-icon":"mdi-account-group",class:"mb-2",hint:"例如: 高三八班","persistent-hint":""},null,8,["modelValue"])])):S("",!0)]),_:1})]),_:1},8,["loading"])}const Pt=z(ei,[["render",oi]]),li={name:"Settings",components:{ServerSettingsCard:Pt,EditSettingsCard:Et,RefreshSettingsCard:Ut,DisplaySettingsCard:Nt,MessageLog:at,SettingsCard:R,StudentListCard:Ot,AboutCard:St,DataProviderSettingsCard:Bt,ThemeSettingsCard:It,EchoChamberCard:xt,SettingsExplorer:Ct,SettingsLinkGenerator:jt,RandomPickerCard:Tt,HomeworkTemplateCard:Vt,SubjectManagementCard:Dt,KvDatabaseCard:Mt},setup(){const{mobile:s}=cn();return{isMobile:s}},data(){return y("server.provider"),{settings:{server:{domain:y("server.domain"),classNumber:y("server.classNumber"),provider:y("server.provider")},refresh:{auto:y("refresh.auto"),interval:y("refresh.interval")},font:{size:y("font.size")},edit:{autoSave:y("edit.autoSave"),blockNonTodayAutoSave:y("edit.blockNonTodayAutoSave"),confirmNonTodaySave:y("edit.confirmNonTodaySave"),refreshBeforeEdit:y("edit.refreshBeforeEdit")},display:{emptySubjectDisplay:y("display.emptySubjectDisplay"),dynamicSort:y("display.dynamicSort"),showRandomButton:y("display.showRandomButton"),showFullscreenButton:y("display.showFullscreenButton")},developer:{enabled:y("developer.enabled"),showDebugConfig:y("developer.showDebugConfig")},message:{showSidebar:y("message.showSidebar"),maxActiveMessages:y("message.maxActiveMessages"),timeout:y("message.timeout"),saveHistory:y("message.saveHistory")}},dataProviders:[{title:"服务器",value:"server"},{title:"本地数据库",value:"indexedDB"}],studentData:{list:[],text:"",advanced:!1},newStudent:"",editingIndex:-1,editingName:"",deleteDialog:!1,studentToDelete:null,numberDialog:!1,newPosition:"",studentToMove:null,touchStartTime:0,touchTimeout:null,studentsLoading:!1,studentsError:null,debugConfig:"",loading:{server:!1,students:!1},hasUnsavedChanges:!1,lastSavedData:null,settingsTab:"index",settingsTabs:[{title:"首页",icon:"mdi-home",value:"index"},{title:"服务器",icon:"mdi-server",value:"server"},{title:"科目",icon:"mdi-book-edit",value:"subject"},{title:"学生列表",icon:"mdi-account-group",value:"student"},{title:"分享设置",icon:"mdi-share",value:"share"},{title:"刷新",icon:"mdi-refresh",value:"refresh"},{title:"编辑",icon:"mdi-pencil",value:"edit"},{title:"显示",icon:"mdi-eye",value:"display"},{title:"主题",icon:"mdi-theme-light-dark",value:"theme"},{title:"随机点名",icon:"mdi-dice-multiple",value:"randomPicker"},{title:"开发者",icon:"mdi-developer-board",value:"developer"},{title:"关于",icon:"mdi-information",value:"about"}],drawer:!1}},watch:{settings:{handler(s){this.handleSettingsChange(s)},deep:!0},isMobile:{handler(s){this.drawer=!s},immediate:!0},studentData:{handler(s){this.lastSavedData&&(this.hasUnsavedChanges=JSON.stringify(s.list)!==JSON.stringify(this.lastSavedData)),this.studentData.text=s.list.join(`
|
||
`)},deep:!0}},mounted(){this.loadAllSettings(),this.unwatchSettings=Fe(()=>{this.loadAllSettings()}),this.drawer=!this.isMobile},beforeUnmount(){this.unwatchSettings&&this.unwatchSettings()},methods:{openClassworksKV(){window.open(y("server.authDomain"),"_blank")},loadAllSettings(){Object.keys(this.settings).forEach(s=>{Object.keys(this.settings[s]).forEach(e=>{this.settings[s][e]=y(`${s}.${e}`)})})},handleSettingsChange(s){this.settingsChangeTimeout&&clearTimeout(this.settingsChangeTimeout),this.settingsChangeTimeout=setTimeout(()=>{Object.entries(s).forEach(([e,l])=>{Object.entries(l).forEach(([u,i])=>{const o=`${e}.${u}`,r=y(o);i!==r&&(xe(o,i)?this.showMessage("设置已更新",`${o} 已保存`):(this.showError("保存失败",`${o} 设置失败`),this.settings[e][u]=r))})})},100)},showMessage(s,e="",l="success"){this.$message[l](s,e)},showError(s,e=""){this.$message.error(s,e)},saveEdit(){if(this.editingIndex!==-1){const s=this.editingName.trim();s&&s!==this.studentData.list[this.editingIndex]&&(this.studentData.list[this.editingIndex]=s),this.editingIndex=-1,this.editingName=""}},startEdit(s,e){this.editingIndex=s,this.editingName=e},confirmDelete(s){this.studentToDelete={index:s,name:this.studentData.list[s]},this.deleteDialog=!0},moveStudent(s,e){const l=e==="up"?s-1:s+1;l>=0&&l<this.studentData.list.length&&([this.studentData.list[s],this.studentData.list[l]]=[this.studentData.list[l],this.studentData.list[s]])},applyNewPosition(){const s=parseInt(this.newPosition)-1;if(this.studentToMove!==null&&s>=0&&s<this.studentData.list.length&&s!==this.studentToMove){const e=this.studentData.list[this.studentToMove];this.studentData.list.splice(this.studentToMove,1),this.studentData.list.splice(s,0,e)}this.numberDialog=!1,this.studentToMove=null,this.newPosition=""},moveToTop(s){if(s>0){const e=this.studentData.list[s];this.studentData.list.splice(s,1),this.studentData.list.unshift(e)}},addStudent(){const s=this.newStudent.trim();s&&!this.studentData.list.includes(s)&&(this.studentData.list.push(s),this.newStudent="")},removeStudent(s){s!==void 0&&(this.studentData.list.splice(s,1),this.deleteDialog=!1,this.studentToDelete=null)},resetFontSize(){dt("font.size"),this.settings.font.size=y("font.size"),this.showMessage("字体已重置","字体大小已恢复默认值")},handleDeveloperChange(s){s||(this.settings.message={showSidebar:!0,maxActiveMessages:5,timeout:5e3,saveHistory:!0})},resetDeveloperSettings(){this.settings.developer={enabled:!1},this.settings.message={showSidebar:!0,maxActiveMessages:5,timeout:5e3,saveHistory:!0},this.handleSettingsChange(this.settings),this.showMessage("已重置","开发者设置已重置为默认值","warning")},adjustFontSize(s){const l=this.settings.font.size;s==="up"&&l<100?this.settings.font.size=l+2:s==="down"&&l>16&&(this.settings.font.size=l-2),this.handleSettingsChange(this.settings)},onSettingsSaved(){this.showMessage("设置已更新","您的设置已成功保存")},onSettingUpdate(s,e){this.showMessage("设置已更新",`${s} 已保存为 ${e}`)}}},ai={class:"settings-page"},ri={class:"mt-4"};function ui(s,e,l,u,i,o){const r=Pt,c=Bt,h=Mt,b=Ot,_=jt,N=Ut,Q=Et,J=Nt,G=It,re=Tt,we=Dt,me=Vt,te=R,ve=dn("developer-settings-card"),Y=Ct,ne=St,ue=xt,fe=at;return m(),I("div",ai,[t(wn,{elevation:"1"},{prepend:n(()=>[t(p,{icon:"mdi-arrow-left",variant:"text",onClick:e[0]||(e[0]=O=>s.$router.push("/"))}),t(p,{icon:"mdi-menu",variant:"text",onClick:e[1]||(e[1]=O=>i.drawer=!i.drawer)})]),default:n(()=>[t(pn,{class:"text-h6"},{default:n(()=>[...e[5]||(e[5]=[a("设置",-1)])]),_:1})]),_:1}),t(pt,{fluid:""},{default:n(()=>[t(Yt,{modelValue:i.drawer,"onUpdate:modelValue":e[2]||(e[2]=O=>i.drawer=O),permanent:!u.isMobile,temporary:u.isMobile},{default:n(()=>[t(P,null,{default:n(()=>[(m(!0),I($,null,le(i.settingsTabs,O=>(m(),f(D,{key:O.value,onClick:de=>i.settingsTab=O.value,active:i.settingsTab===O.value,"prepend-icon":O.icon,class:"rounded-e-xl",color:i.settingsTab===O.value?"primary":"default"},{default:n(()=>[t(K,null,{default:n(()=>[a(k(O.title),1)]),_:2},1024)]),_:2},1032,["onClick","active","prepend-icon","color"]))),128))]),_:1})]),_:1},8,["modelValue","permanent","temporary"]),t(bn,{modelValue:i.settingsTab,"onUpdate:modelValue":e[4]||(e[4]=O=>i.settingsTab=O),style:{width:"100%"},direction:"vertical"},{default:n(()=>[t(ie,{value:"index"},{default:n(()=>[t(U,{class:"service-card gradient-right clickable",elevation:"8"},{default:n(()=>[t(je,null,{default:n(()=>[...e[6]||(e[6]=[w("div",{class:"card-title"},[w("div",null,[w("div",{class:"text-h6"},"Classworks KV"),w("div",{class:"text-caption text-medium-emphasis"}," 云原生键值数据库 ")])],-1)])]),_:1}),t(E,null,{default:n(()=>[w("div",ri,[t(p,{variant:"text",class:"text-none","append-icon":"mdi-arrow-right",rounded:"xl",onClick:o.openClassworksKV},{default:n(()=>[...e[7]||(e[7]=[a(" 打开 Classworks KV ",-1)])]),_:1},8,["onClick"])])]),_:1})]),_:1}),t(U,{title:"Classworks",subtitle:"设置",class:"rounded-xl",border:""},{default:n(()=>[t(E,null,{default:n(()=>[t(ee,{color:"error",variant:"tonal",icon:"mdi-alert-circle",class:"rounded-xl"},{default:n(()=>[...e[8]||(e[8]=[a("Classworks 是开源免费的软件,官方没有提供任何形式的付费支持服务,源代码仓库地址在 ",-1),w("a",{href:"https://github.com/ZeroCatDev/Classworks",target:"_blank"},"https://github.com/ZeroCatDev/Classworks",-1),a("。如果您通过有偿协助等付费方式取得本应用,在遇到问题时请在与卖家约定的服务框架下,优先向卖家求助。如果卖家没有提供您预期的服务,请退款或通过其它形式积极维护您的合法权益。",-1)])]),_:1}),t(ee,{class:"mt-4 rounded-xl",color:"info",variant:"tonal",icon:"mdi-information"},{default:n(()=>[...e[9]||(e[9]=[a("请不要使用浏览器清除缓存功能,否则会导致配置丢失。",-1),w("del",null,"恶意的操作可能导致您受到贵校教师的处理",-1)])]),_:1}),t(ee,{class:"mt-4 rounded-xl",color:"warning",variant:"tonal",icon:"mdi-information"},{default:n(()=>[e[11]||(e[11]=w("p",null," 请不要使用包括但不限于360极速浏览器、360安全浏览器、夸克浏览器、QQ浏览器等浏览器使用 Classworks ,这些浏览器过时且存在严重的一致性问题。在Windows上,使用新版 Microsoft Edge 浏览器是最推荐的选择。 ",-1)),e[12]||(e[12]=w("p",{style:{color:"#666"}}," 上述浏览器商标为其所属公司所有,Classworks™ 与上述浏览器所属公司暂无竞争关系。 ",-1)),e[13]||(e[13]=w("br",null,null,-1)),t(p,{href:"https://www.microsoft.com/zh-cn/windows/microsoft-edge",target:"_blank",color:"warning",variant:"tonal",class:"text-none rounded-xl","append-icon":"mdi-open-in-new"},{default:n(()=>[...e[10]||(e[10]=[a("下载 Microsoft Edge(微软边缘浏览器)",-1)])]),_:1})]),_:1})]),_:1})]),_:1})]),_:1}),t(ie,{value:"server"},{default:n(()=>[t(r,{border:"",loading:i.loading.server,onSaved:o.onSettingsSaved},null,8,["loading","onSaved"]),t(c,{border:"",class:"mt-4"}),t(h,{border:"",class:"mt-4"})]),_:1}),t(ie,{value:"student"},{default:n(()=>[t(b,{border:"","is-mobile":u.isMobile},null,8,["is-mobile"])]),_:1}),t(ie,{value:"share"},{default:n(()=>[t(_,{border:"",class:"mt-4"})]),_:1}),t(ie,{value:"refresh"},{default:n(()=>[t(N,{border:"",loading:i.loading.refresh,onSaved:o.onSettingsSaved},null,8,["loading","onSaved"])]),_:1}),t(ie,{value:"edit"},{default:n(()=>[t(Q,{border:"",loading:i.loading.edit,onSaved:o.onSettingsSaved},null,8,["loading","onSaved"])]),_:1}),t(ie,{value:"display"},{default:n(()=>[t(J,{border:"",loading:i.loading.display,onSaved:o.onSettingsSaved},null,8,["loading","onSaved"])]),_:1}),t(ie,{value:"theme"},{default:n(()=>[t(G,{border:"",loading:i.loading.theme,onSaved:o.onSettingsSaved},null,8,["loading","onSaved"])]),_:1}),t(ie,{value:"randomPicker"},{default:n(()=>[t(re,{border:"","is-mobile":u.isMobile},null,8,["is-mobile"])]),_:1}),t(ie,{value:"subject"},{default:n(()=>[t(we,{border:""}),e[14]||(e[14]=a()),e[15]||(e[15]=w("br",null,null,-1)),t(me,{border:""})]),_:1}),t(ie,{value:"developer"},{default:n(()=>[t(te,{border:"",title:"开发者选项",icon:"mdi-developer-board"},{default:n(()=>[t(P,null,{default:n(()=>[t(D,null,{prepend:n(()=>[t(x,{icon:"mdi-code-tags",class:"mr-3"})]),append:n(()=>[t(ct,{modelValue:i.settings.developer.enabled,"onUpdate:modelValue":e[3]||(e[3]=O=>i.settings.developer.enabled=O),density:"comfortable","hide-details":"",onChange:o.handleDeveloperChange},null,8,["modelValue","onChange"])]),default:n(()=>[t(K,null,{default:n(()=>[...e[16]||(e[16]=[a("启用开发者选项",-1)])]),_:1}),t(Z,null,{default:n(()=>[...e[17]||(e[17]=[a("启用后可以查看和修改开发者设置",-1)])]),_:1})]),_:1})]),_:1})]),_:1}),t(ve,{border:"",loading:i.loading.developer,onSaved:o.onSettingsSaved},null,8,["loading","onSaved"]),i.settings.developer.enabled?(m(),f(U,{key:0,border:"",class:"mt-4 rounded-lg"},{default:n(()=>[t(F,{class:"d-flex align-center"},{default:n(()=>[t(x,{icon:"mdi-cog-outline",class:"mr-2"}),e[18]||(e[18]=a(" 所有设置 ",-1))]),_:1}),t(Ve,null,{default:n(()=>[...e[19]||(e[19]=[a(" 浏览和修改所有可用设置 ",-1)])]),_:1}),t(E,null,{default:n(()=>[t(Y,{onUpdate:o.onSettingUpdate},null,8,["onUpdate"])]),_:1})]),_:1})):S("",!0),i.settings.developer.enabled?(m(),f(ae,{key:1,cols:"12"})):S("",!0)]),_:1}),t(ie,{value:"about"},{default:n(()=>[t(ne),t(ue,{border:"",class:"mt-4"})]),_:1})]),_:1},8,["modelValue"])]),_:1}),t(fe,{ref:"messageLog"},null,512)])}const Ii=z(li,[["render",ui]]);export{Ii as default};
|