import{s as rn,b as un,a as dt,_ as xt,V as dn}from"./index-ChfJo6Ei.js";import{_ as Y,j as g,o as c,w as n,d as t,B as k,aC as Fe,q as O,t as l,C as v,v as w,z as E,az as Re,aA as Ze,M as ae,l as U,i as m,bu as cn,L as Xe,aG as St,bv as Ct,k as _,s as xe,bw as mn,A,a3 as L,a4 as se,y as h,P as F,Q as D,K as B,E as Le,aD as $e,F as ie,bx as Me,ac as et,aE as We,G as he,x as $,Y as Pe,$ as fn,N as _e,O as Ae,H as ge,aa as _t,bi as pn,D as hn,g as gn,p as wn,ai as vn,by as bn,bz as yn,bg as kn,e as ct,Z as fe,an as mt,ar as xn,R as ft,aJ as Sn,a0 as je,a1 as Cn,a_ as _n,r as Vn,X as Dn}from"./index-1qA4vOSi.js";import{V as ee}from"./VChip-Du8LEclp.js";import{V as Vt}from"./VSwitch-C9_Rv21o.js";import{e as Ke,V as Dt}from"./filter-BPUQ38Jb.js";import{V as R}from"./VTextField-FQUF6Pvv.js";import{d as pe,a as qe,c as pt,b as An,o as In,k as Tn}from"./dataProvider-CQZWL-q1.js";import{V as te,a as Ie}from"./VAlert-DDFXpgDP.js";import{V as ve,a as H}from"./VRow-B38ghAfM.js";import{V as tt}from"./VContainer-C7OIoecX.js";import{a as Ve}from"./VPagination-RUHGm5oL.js";import{V as Be}from"./VTextarea-qlbQTXAT.js";import{V as At}from"./VForm-DT2jG6br.js";import{V as nt,a as st,b as It,c as it}from"./VExpansionPanels-Bni8WFfK.js";import{e as Tt,b as En,a as me}from"./VTabsWindowItem-CBJqmdx7.js";import{V as ht}from"./VCheckboxBtn-Tsq1D_WS.js";import{V as gt,a as wt,b as Un,c as jn}from"./VAppBarTitle-Dyqz9qNq.js";import{V as Nn}from"./VSheet-BEr9wS9D.js";const Mn={name:"SettingsCard",props:{title:{type:String,required:!0},icon:{type:String,required:!0},loading:{type:Boolean,default:!1}}};function Pn(s,e,a,d,i,o){return c(),g(U,{class:"settings-card rounded-lg",elevation:"2"},{default:n(()=>[t(Fe,null,{prepend:n(()=>[t(w,{icon:a.icon,class:"mr-2",size:"large"},null,8,["icon"])]),default:n(()=>[t(O,{class:"text-h6"},{default:n(()=>[l(v(a.title),1)]),_:1})]),_:1}),t(E,null,{default:n(()=>[a.loading?(c(),g(Ze,{key:0,class:"mb-4",color:"primary",indeterminate:""})):k("",!0),Re(s.$slots,"default",{},void 0,!0)]),_:3}),s.$slots.actions?(c(),g(ae,{key:0,class:"pa-4"},{default:n(()=>[Re(s.$slots,"actions",{},void 0,!0)]),_:3})):k("",!0)]),_:3})}const X=Y(Mn,[["render",Pn],["__scopeId","data-v-9c035df1"]]);var Bn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Ln(s){return s&&s.__esModule&&Object.prototype.hasOwnProperty.call(s,"default")?s.default:s}var Et={exports:{}};(function(s,e){(function(a,d){s.exports=d()})(typeof self<"u"?self:Bn,()=>(()=>{var a={3146:(r,p,u)=>{for(var y=u(3491),I=typeof window>"u"?u.g:window,j=["moz","webkit"],W="AnimationFrame",Q=I["request"+W],q=I["cancel"+W]||I["cancelRequest"+W],de=0;!Q&&de{var p=r&&r.__esModule?()=>r.default:()=>r;return i.d(p,{a:p}),p},i.d=(r,p)=>{for(var u in p)i.o(p,u)&&!i.o(r,u)&&Object.defineProperty(r,u,{enumerable:!0,get:p[u]})},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,p)=>Object.prototype.hasOwnProperty.call(r,p);var o={};return(()=>{i.d(o,{default:()=>Xt});var r=i(3146),p=i.n(r);const u=function(N){return new RegExp(/<[a-z][\s\S]*>/i).test(N)},y=function(N,x){return Math.floor(Math.random()*(x-N+1))+N};var I="TYPE_CHARACTER",j="REMOVE_CHARACTER",W="REMOVE_ALL",Q="REMOVE_LAST_VISIBLE_NODE",q="PAUSE_FOR",de="CALL_FUNCTION",ce="ADD_HTML_TAG_ELEMENT",re="CHANGE_DELETE_SPEED",ne="CHANGE_DELAY",be="CHANGE_CURSOR",C="PASTE_STRING",b="HTML_TAG";function V(N){return V=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(x){return typeof x}:function(x){return x&&typeof Symbol=="function"&&x.constructor===Symbol&&x!==Symbol.prototype?"symbol":typeof x},V(N)}function M(N,x){var P=Object.keys(N);if(Object.getOwnPropertySymbols){var T=Object.getOwnPropertySymbols(N);x&&(T=T.filter(function(ke){return Object.getOwnPropertyDescriptor(N,ke).enumerable})),P.push.apply(P,T)}return P}function Z(N){for(var x=1;xN.length)&&(x=N.length);for(var P=0,T=Array(x);P1&&arguments[1]!==void 0?arguments[1]:null;if(u(S))return f.typeOutHTMLString(S,K);if(S){var oe=(f.options||{}).stringSplitter,le=typeof oe=="function"?oe(S):S.split("");f.typeCharacters(le,K)}return f}),z(this,"pasteString",function(S){var K=arguments.length>1&&arguments[1]!==void 0?arguments[1]:null;return u(S)?f.typeOutHTMLString(S,K,!0):(S&&f.addEventToQueue(C,{character:S,node:K}),f)}),z(this,"typeOutHTMLString",function(S){var K=arguments.length>1&&arguments[1]!==void 0?arguments[1]:null,oe=arguments.length>2?arguments[2]:void 0,le=function(Te){var Ee=document.createElement("div");return Ee.innerHTML=Te,Ee.childNodes}(S);if(le.length>0)for(var J=0;J0&&arguments[0]!==void 0?arguments[0]:"natural";return f.addEventToQueue(W,{speed:S}),f}),z(this,"changeDeleteSpeed",function(S){if(!S)throw new Error("Must provide new delete speed");return f.addEventToQueue(re,{speed:S}),f}),z(this,"changeDelay",function(S){if(!S)throw new Error("Must provide new delay");return f.addEventToQueue(ne,{delay:S}),f}),z(this,"changeCursor",function(S){if(!S)throw new Error("Must provide new cursor");return f.addEventToQueue(be,{cursor:S}),f}),z(this,"deleteChars",function(S){if(!S)throw new Error("Must provide amount of characters to delete");for(var K=0;K1&&arguments[1]!==void 0?arguments[1]:null;if(!S||!Array.isArray(S))throw new Error("Characters must be an array");return S.forEach(function(oe){f.addEventToQueue(I,{character:oe,node:K})}),f}),z(this,"removeCharacters",function(S){if(!S||!Array.isArray(S))throw new Error("Characters must be an array");return S.forEach(function(){f.addEventToQueue(j)}),f}),z(this,"addEventToQueue",function(S,K){var oe=arguments.length>2&&arguments[2]!==void 0&&arguments[2];return f.addEventToStateProperty(S,K,oe,"eventQueue")}),z(this,"addReverseCalledEvent",function(S,K){var oe=arguments.length>2&&arguments[2]!==void 0&&arguments[2];return f.options.loop?f.addEventToStateProperty(S,K,oe,"reverseCalledEvents"):f}),z(this,"addEventToStateProperty",function(S,K){var oe=arguments.length>2&&arguments[2]!==void 0&&arguments[2],le=arguments.length>3?arguments[3]:void 0,J={eventName:S,eventArgs:K||{}};return f.state[le]=oe?[J].concat(ue(f.state[le])):[].concat(ue(f.state[le]),[J]),f}),z(this,"runEventLoop",function(){f.state.lastFrameTime||(f.state.lastFrameTime=Date.now());var S=Date.now(),K=S-f.state.lastFrameTime;if(!f.state.eventQueue.length){if(!f.options.loop)return;f.state.eventQueue=ue(f.state.calledEvents),f.state.calledEvents=[],f.options=Z({},f.state.initialOptions)}if(f.state.eventLoop=p()(f.runEventLoop),!f.state.eventLoopPaused){if(f.state.pauseUntil){if(S({typewriter:null,sourceWriter:null,currentQuote:yt,hasClicked:!1}),mounted(){this.initTypewriters()},methods:{initTypewriters(){this.typewriter=new vt(this.$refs.typewriter,kt.main),this.sourceWriter=new vt(this.$refs.sourceWriter,kt.source),this.typeQuote(yt)},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 bt.quotes[Math.floor(Math.random()*bt.quotes.length)]},async copyToClipboard(){if(!this.currentQuote)return;const{text:s,author:e,contributor:a,link:d}=this.currentQuote,i=[s,e&&`作者:${e}`,a&&`贡献者:${a}`,(d||a)&&`来源:${d||`https://github.com/${a}`}`].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())}},Kn={ref:"typewriter",class:"typewriter-text"},Fn={ref:"sourceWriter",class:"source-text"};function Qn(s,e,a,d,i,o){const r=X;return c(),g(r,{border:"",icon:"mdi-thought-bubble",title:"回声洞",onClick:o.handleClick},{default:n(()=>[t(E,null,{default:n(()=>[m("div",Kn,null,512),m("div",Fn,null,512)]),_:1}),t(cn,{name:"fade"},{default:n(()=>{var p;return[(p=s.currentQuote)!=null&&p.contributor?(c(),g(ee,{key:0,class:"contributor"},{default:n(()=>[t(Xe,{start:""},{default:n(()=>[t(St,{src:`https://github.com/${s.currentQuote.contributor}.png`},null,8,["src"])]),_:1}),l(" "+v(s.currentQuote.contributor),1)]),_:1})):k("",!0)]}),_:1})]),_:1},8,["onClick"])}const Ut=Y(Rn,[["render",Qn],["__scopeId","data-v-a6a55e27"]]),Jn={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=mn(this.settingKey),!this.definition){console.error(`未找到设置项定义: ${this.settingKey}`);return}if(this.type=this.definition.type,this.localValue=_(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,a])=>({title:a,value:e})),this.hasOptions=!0}else if(this.definition.validate){const e=this.definition.validate.toString().match(/\[(.*?)\]/);if(e){const d=e[1].split(",").map(i=>{const o=i.trim().replace(/['"]/g,"");return{title:this.getDisplayValue(o)||o,value:o}});d.length>0&&(this.selectOptions=d,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 a=s.match(/value\s*<=\s*(\d+)/);a&&(this.maxValue=Number(a[1]));const d=this.maxValue-this.minValue;d>100?this.stepValue=10:d>20?this.stepValue=5:d>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),ethis.maxValue&&(e=this.maxValue)),xe(this.settingKey,e)?this.$emit("update",this.settingKey,e):(this.localValue=_(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&&(Ct(this.settingKey),this.localValue=_(this.settingKey),this.showSnackbarMessage("已重置为默认值"),this.$emit("update",this.settingKey,this.localValue))},showSnackbarMessage(s){this.snackbarText=s,this.showSnackbar=!0}}},Hn={class:"text-caption text-grey-darken-1"},Gn={class:"d-flex flex-column flex-sm-row align-center"},Yn={key:0,class:"me-2"},Wn={key:2,class:"d-flex align-center"},qn={key:0,class:"px-4 pb-2 pt-0"};function Zn(s,e,a,d,i,o){return c(),A(ie,null,[t(D,{disabled:a.disabled,class:"setting-item"},{prepend:n(()=>[t(w,{icon:o.settingIcon},null,8,["icon"])]),append:n(()=>[m("div",Gn,[i.type!=="string"||i.hasOptions?(c(),A("div",Yn,[i.type==="boolean"?(c(),g(Vt,{key:0,modelValue:i.localValue,"onUpdate:modelValue":[e[0]||(e[0]=r=>i.localValue=r),o.updateSetting],disabled:a.disabled,density:"comfortable","hide-details":""},null,8,["modelValue","disabled","onUpdate:modelValue"])):i.type==="string"&&i.hasOptions?(c(),g(Ke,{key:1,modelValue:i.localValue,"onUpdate:modelValue":[e[1]||(e[1]=r=>i.localValue=r),o.updateSetting],disabled:a.disabled,items:i.selectOptions,"bg-color":"surface",class:"setting-select",density:"compact","hide-details":"","item-title":"title","item-value":"value",variant:"outlined"},null,8,["modelValue","disabled","items","onUpdate:modelValue"])):i.type==="number"?(c(),A("div",Wn,[t(h,{disabled:a.disabled||i.localValue<=i.minValue,icon:"mdi-minus",size:"small",variant:"text",onClick:e[2]||(e[2]=r=>o.adjustValue(-i.stepValue))},null,8,["disabled"]),t(R,{modelValue:i.localValue,"onUpdate:modelValue":[e[3]||(e[3]=r=>i.localValue=r),o.updateSetting],modelModifiers:{number:!0},disabled:a.disabled,max:i.maxValue,min:i.minValue,step:i.stepValue,"bg-color":"surface",class:"mx-2 setting-number-field",density:"compact","hide-details":"",style:{width:"80px"},type:"number",variant:"outlined"},null,8,["modelValue","disabled","max","min","step","onUpdate:modelValue"]),t(h,{disabled:a.disabled||i.localValue>=i.maxValue,icon:"mdi-plus",size:"small",variant:"text",onClick:e[4]||(e[4]=r=>o.adjustValue(i.stepValue))},null,8,["disabled"])])):k("",!0)])):k("",!0),t(Dt,{location:"bottom"},{activator:n(({props:r})=>[t(h,Le({disabled:a.disabled,class:"ml-2",icon:"mdi-dots-vertical",size:"small"},r,{variant:"text"}),null,16,["disabled"])]),default:n(()=>[t(F,{density:"compact"},{default:n(()=>[t(D,{onClick:o.copySettingId},{prepend:n(()=>[t(w,{icon:"mdi-key",size:"small"})]),default:n(()=>[t(L,null,{default:n(()=>[...e[7]||(e[7]=[l("复制设置ID",-1)])]),_:1})]),_:1},8,["onClick"]),t(D,{onClick:o.copySettingValue},{prepend:n(()=>[t(w,{icon:"mdi-content-copy",size:"small"})]),default:n(()=>[t(L,null,{default:n(()=>[...e[8]||(e[8]=[l("复制设置值",-1)])]),_:1})]),_:1},8,["onClick"]),t(B),t(D,{disabled:o.isDefaultValue,onClick:o.resetToDefault},{prepend:n(()=>[t(w,{icon:"mdi-restore",size:"small"})]),default:n(()=>[t(L,null,{default:n(()=>[...e[9]||(e[9]=[l("重置为默认值",-1)])]),_:1})]),_:1},8,["disabled","onClick"])]),_:1})]),_:1})])]),default:n(()=>[t(L,{class:"text-wrap"},{default:n(()=>[l(v(o.displayTitle),1)]),_:1}),t(se,{class:"d-flex align-center text-wrap"},{default:n(()=>[m("span",Hn,v(a.settingKey),1)]),_:1})]),_:1},8,["disabled"]),i.type==="string"&&!i.hasOptions?(c(),A("div",qn,[t(R,{modelValue:i.localValue,"onUpdate:modelValue":[e[5]||(e[5]=r=>i.localValue=r),o.updateSetting],disabled:a.disabled,"bg-color":"surface",class:"setting-text-field mt-1",density:"compact","hide-details":"",variant:"outlined"},null,8,["modelValue","disabled","onUpdate:modelValue"])])):k("",!0),t($e,{modelValue:i.showSnackbar,"onUpdate:modelValue":e[6]||(e[6]=r=>i.showSnackbar=r),timeout:2e3,color:"success",location:"top"},{default:n(()=>[l(v(i.snackbarText),1)]),_:1},8,["modelValue"])],64)}const Ce=Y(Jn,[["render",Zn],["__scopeId","data-v-08b49b47"]]),Xn={name:"SettingsExplorer",components:{SettingItem:Ce},data(){return{searchQuery:"",currentSettings:{},unwatchFunction:null}},computed:{isDeveloperMode(){return _("developer.enabled")},allSettings(){var e;const s=[];for(const[a,d]of Object.entries(We))this.searchQuery&&!a.toLowerCase().includes(this.searchQuery.toLowerCase())&&!((e=d.description)!=null&&e.toLowerCase().includes(this.searchQuery.toLowerCase()))||s.push({key:a,...d});return s},formattedSettings(){return JSON.stringify(this.currentSettings,null,2)}},created(){this.updateCurrentSettings(),this.unwatchFunction=et(()=>{this.updateCurrentSettings()})},beforeUnmount(){this.unwatchFunction&&this.unwatchFunction()},methods:{updateCurrentSettings(){this.currentSettings=Me()},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:"复制到剪贴板失败"})})}}},$n={class:"settings-explorer"},es={class:"settings-json"};function ts(s,e,a,d,i,o){const r=Ce;return c(),A("div",$n,[m("div",null,[t(R,{modelValue:i.searchQuery,"onUpdate:modelValue":e[0]||(e[0]=p=>i.searchQuery=p),class:"mb-4",clearable:"",density:"comfortable",label:"搜索设置","prepend-inner-icon":"mdi-magnify",variant:"outlined"},null,8,["modelValue"]),t(F,null,{default:n(()=>[(c(!0),A(ie,null,he(o.allSettings,p=>(c(),A("div",{key:p.key},[(c(),g(r,{key:p.key,disabled:p.requireDeveloper&&!o.isDeveloperMode,"setting-key":p.key,onError:o.onSettingError,onUpdate:o.onSettingUpdate},null,8,["disabled","setting-key","onError","onUpdate"])),t(B,{class:"my-2"})]))),128))]),_:1}),t(U,{border:""},{default:n(()=>[t(O,{class:"text-subtitle-1"},{default:n(()=>[...e[1]||(e[1]=[l("当前配置",-1)])]),_:1}),t(E,null,{default:n(()=>[m("pre",es,v(o.formattedSettings),1)]),_:1}),t(ae,null,{default:n(()=>[t($),t(h,{onClick:o.copySettingsToClipboard},{default:n(()=>[e[3]||(e[3]=l(" 复制到剪贴板 ",-1)),t(w,{right:""},{default:n(()=>[...e[2]||(e[2]=[l("mdi-content-copy",-1)])]),_:1})]),_:1},8,["onClick"])]),_:1})]),_:1})])])}const jt=Y(Xn,[["render",ts],["__scopeId","data-v-4d032f99"]]),ns={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 ss(s,e,a,d,i,o){return c(),g(U,{border:a.border,class:"setting-group"},{default:n(()=>[a.title?(c(),g(O,{key:0,class:"d-flex align-center"},{default:n(()=>[a.icon?(c(),g(w,{key:0,icon:a.icon,class:"mr-2"},null,8,["icon"])):k("",!0),l(" "+v(a.title),1)]),_:1})):k("",!0),a.description?(c(),g(Pe,{key:1},{default:n(()=>[l(v(a.description),1)]),_:1})):k("",!0),t(E,null,{default:n(()=>[t(F,null,{default:n(()=>[Re(s.$slots,"default",{},void 0,!0)]),_:3})]),_:3}),s.$slots.actions?(c(),g(ae,{key:2},{default:n(()=>[Re(s.$slots,"actions",{},void 0,!0)]),_:3})):k("",!0)]),_:3},8,["border"])}const Qe=Y(ns,[["render",ss],["__scopeId","data-v-9af32ae4"]]),is={subjects:{语文:{books:{课本:["第一单元","第二单元"],练习册:["第一章","第二章"]}},数学:{books:{课本:["第一章","第二章"],习题册:["基础练习","提高练习"]}},英语:{books:{课本:["Unit 1","Unit 2"],练习册:["Chapter 1","Chapter 2"]}}},commonSubject:{books:{试卷:["单元测试","期中测试","期末测试"],假期作业:["必做题","选做题"]}},actions:["写完","下一课","不交","明天交"]},os={name:"HomeworkTemplateCard",components:{SettingsCard:X,SettingGroup:Qe},data(){return{loading:!1,error:null,config:fn(JSON.parse(JSON.stringify(is))),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 a=await pe.loadData("classworks-config-homework-template");if(a){const d=a;Object.assign(this.config,d),this.originalConfig=JSON.parse(JSON.stringify(d)),this.isNewConfig=!1,this.showMessage("配置已加载","success")}else if(((s=a.error)==null?void 0:s.code)==="NOT_FOUND")this.showMessage("使用默认配置","info"),this.isNewConfig=!0;else{const d=((e=a.error)==null?void 0:e.message)||"加载失败";this.showMessage(`加载失败: ${d},可继续编辑当前配置`,"warning")}}catch(a){console.error("Failed to load config:",a),this.showMessage("加载失败,可继续编辑当前配置","warning")}this.loading=!1},async saveConfig(){this.loading=!0;try{const s=await pe.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 a=this.config.subjects[s];this.config.subjects[e]=a,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 a=`${s}-${e}`,d=this.editedBookTypes[a];if(d&&d!==e){const i=this.config.subjects[s].books[e];this.config.subjects[s].books[d]=i,delete this.config.subjects[s].books[e]}delete this.editedBookTypes[a]},deleteBookType(s,e){s==="common"?delete this.config.commonSubject.books[e]:delete this.config.subjects[s].books[e]},addBook(s,e){const a=`${s}-${e}`,d=this.newBooks[a];d&&(this.config.subjects[s].books[e].includes(d)||this.config.subjects[s].books[e].push(d),this.newBooks[a]="")},removeBook(s,e,a){const d=this.config.subjects[s].books[e],i=d.indexOf(a);i>-1&&d.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,a){this.dialog.show=!0,this.dialog.title="编辑需完成部分",this.dialog.nameLabel="部分名称",this.dialog.editedItem={name:a,type:"book",subject:s,bookType:e,originalName:a,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,a){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(a)?[...a]:[]}},saveDialog(){const{type:s,name:e,subject:a,originalName:d,tasks:i}=this.dialog.editedItem;if(!e){this.showMessage("名称不能为空","error");return}let o;const r=a==="common"?this.config.commonSubject.books:a?this.config.subjects[a].books:null;switch(s){case"subjectBook":r&&(d!==e?(r[e]=i||[],delete r[d]):r[e]=i||[]);break;case"action":o=this.config.actions.indexOf(d),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=""}}},ls={class:"d-flex justify-space-between align-center mb-6"};function as(s,e,a,d,i,o){const r=Qe,p=X;return c(),g(p,{loading:i.loading,border:"",icon:"mdi-book-edit",title:"作业模板配置"},{default:n(()=>[i.error?(c(),g(te,{key:0,class:"mb-4",closable:"",type:"error",variant:"tonal"},{default:n(()=>[l(v(i.error),1)]),_:1})):k("",!0),m("div",ls,[m("div",null,[t(h,{loading:i.loading,class:"mr-2",color:"primary","prepend-icon":"mdi-refresh",size:"large",onClick:o.loadConfig},{default:n(()=>[...e[7]||(e[7]=[l(" 重新加载配置 ",-1)])]),_:1},8,["loading","onClick"]),t(h,{loading:i.loading,color:"success","prepend-icon":"mdi-content-save",size:"large",onClick:o.saveConfig},{default:n(()=>[...e[8]||(e[8]=[l(" 保存所有更改 ",-1)])]),_:1},8,["loading","onClick"])]),o.hasChanges?(c(),g(ee,{key:0,color:"warning",variant:"elevated"},{default:n(()=>[...e[9]||(e[9]=[l(" 有未保存的更改 ",-1)])]),_:1})):k("",!0)]),t(ve,null,{default:n(()=>[t(H,{cols:"12",md:"6"},{default:n(()=>[t(r,{border:"",icon:"mdi-book",title:"科目配置"},{default:n(()=>[t(F,null,{default:n(()=>[t(D,null,{default:n(()=>[t(R,{modelValue:i.newSubject,"onUpdate:modelValue":e[0]||(e[0]=u=>i.newSubject=u),"append-inner-icon":"mdi-plus",density:"comfortable",label:"添加新科目",variant:"outlined","onClick:appendInner":o.addSubject,onKeyup:_e(o.addSubject,["enter"])},null,8,["modelValue","onClick:appendInner","onKeyup"])]),_:1}),(c(!0),A(ie,null,he(o.subjectList,u=>(c(),g(D,{key:u},{default:n(()=>[t(U,{border:"",class:"w-100 mb-2"},{default:n(()=>[t(O,{class:"d-flex align-center"},{default:n(()=>[t(R,{modelValue:i.editedSubjects[u],"onUpdate:modelValue":y=>i.editedSubjects[u]=y,placeholder:u,density:"comfortable","hide-details":"",variant:"plain",onBlur:y=>o.updateSubject(u)},null,8,["modelValue","onUpdate:modelValue","placeholder","onBlur"]),t($),t(h,{color:"error",icon:"mdi-delete",size:"small",variant:"text",onClick:y=>o.deleteSubject(u)},null,8,["onClick"])]),_:2},1024),t(E,null,{default:n(()=>[t(R,{modelValue:i.newBookTypes[u],"onUpdate:modelValue":y=>i.newBookTypes[u]=y,"append-inner-icon":"mdi-plus",class:"mb-2",density:"comfortable",label:"添加作业本名称",variant:"outlined","onClick:appendInner":()=>o.addBookType(u),onKeyup:_e(()=>o.addBookType(u),["enter"])},null,8,["modelValue","onUpdate:modelValue","onClick:appendInner","onKeyup"]),t(F,{border:"",density:"compact",rounded:""},{default:n(()=>[(c(!0),A(ie,null,he(i.config.subjects[u].books,(y,I)=>(c(),g(D,{key:I,title:I,onClick:j=>o.openSubjectBookDialog(u,I,y)},{prepend:n(()=>[t(w,{class:"mr-2",icon:"mdi-book-open-variant"})]),append:n(()=>[t(ee,{class:"mr-2",color:"info",size:"small"},{default:n(()=>[l(v(y.length)+"个部分 ",1)]),_:2},1024),t(h,{color:"error",icon:"mdi-delete",size:"small",variant:"text",onClick:Ae(()=>o.deleteBookType(u,I),["stop"])},null,8,["onClick"])]),_:2},1032,["title","onClick"]))),128))]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:2},1024))),128))]),_:1})]),_:1})]),_:1}),t(H,{cols:"12",md:"6"},{default:n(()=>[t(r,{border:"",icon:"mdi-cog",title:"通用配置"},{default:n(()=>[t(F,null,{default:n(()=>[t(D,null,{default:n(()=>[t(R,{modelValue:i.newCommonBook,"onUpdate:modelValue":e[1]||(e[1]=u=>i.newCommonBook=u),"append-inner-icon":"mdi-plus",density:"comfortable",label:"添加作业本名称",variant:"outlined","onClick:appendInner":o.addCommonBook,onKeyup:_e(o.addCommonBook,["enter"])},null,8,["modelValue","onClick:appendInner","onKeyup"])]),_:1}),t(D,null,{default:n(()=>[t(F,{border:"",density:"compact",rounded:""},{default:n(()=>[(c(!0),A(ie,null,he(i.config.commonSubject.books,(u,y)=>(c(),g(D,{key:y,title:y,onClick:I=>o.openSubjectBookDialog("common",y,u)},{prepend:n(()=>[t(w,{class:"mr-2",icon:"mdi-book-multiple"})]),append:n(()=>[t(ee,{class:"mr-2",color:"info",size:"small"},{default:n(()=>[l(v(u.length)+"个部分 ",1)]),_:2},1024),t(h,{color:"error",icon:"mdi-delete",size:"small",variant:"text",onClick:Ae(()=>o.deleteBookType("common",y),["stop"])},null,8,["onClick"])]),_:2},1032,["title","onClick"]))),128))]),_:1})]),_:1}),t(B,{class:"my-2"}),t(D,null,{default:n(()=>[t(R,{modelValue:i.newAction,"onUpdate:modelValue":e[2]||(e[2]=u=>i.newAction=u),"append-inner-icon":"mdi-plus",density:"comfortable",label:"添加操作",variant:"outlined","onClick:appendInner":o.addAction,onKeyup:_e(o.addAction,["enter"])},null,8,["modelValue","onClick:appendInner","onKeyup"])]),_:1}),t(D,null,{default:n(()=>[t(F,{border:"",density:"compact",rounded:""},{default:n(()=>[(c(!0),A(ie,null,he(i.config.actions,u=>(c(),g(D,{key:u,title:u,onClick:y=>o.openActionDialog(u)},{append:n(()=>[t(h,{color:"error",icon:"mdi-delete",size:"small",variant:"text",onClick:Ae(y=>o.removeAction(u),["stop"])},null,8,["onClick"])]),_:2},1032,["title","onClick"]))),128))]),_:1})]),_:1})]),_:1})]),_:1})]),_:1})]),_:1}),t(ge,{modelValue:i.dialog.show,"onUpdate:modelValue":e[5]||(e[5]=u=>i.dialog.show=u),"max-width":"600px"},{default:n(()=>[t(U,null,{default:n(()=>[t(O,{class:"text-h5 pa-4"},{default:n(()=>[l(v(i.dialog.title),1)]),_:1}),t(E,null,{default:n(()=>[t(tt,null,{default:n(()=>[t(ve,null,{default:n(()=>[t(H,{cols:"12"},{default:n(()=>[t(R,{modelValue:i.dialog.editedItem.name,"onUpdate:modelValue":e[3]||(e[3]=u=>i.dialog.editedItem.name=u),label:i.dialog.nameLabel,rules:[u=>!!u||"名称不能为空"],density:"comfortable",variant:"outlined"},null,8,["modelValue","label","rules"])]),_:1}),i.dialog.editedItem.type==="subjectBook"?(c(),g(H,{key:0,cols:"12"},{default:n(()=>[e[10]||(e[10]=m("div",{class:"text-subtitle-2 mb-2"},"所属科目",-1)),t(ee,{color:"primary"},{default:n(()=>[l(v(i.dialog.editedItem.subject),1)]),_:1})]),_:1})):k("",!0),["subjectBook","commonBook"].includes(i.dialog.editedItem.type)?(c(),g(H,{key:1,cols:"12"},{default:n(()=>[t(U,{variant:"outlined"},{default:n(()=>[t(O,{class:"text-subtitle-1 py-2"},{default:n(()=>[...e[11]||(e[11]=[l("需完成部分",-1)])]),_:1}),t(E,{class:"pt-0"},{default:n(()=>[t(F,{border:"",class:"mb-2",density:"compact",rounded:""},{default:n(()=>[(c(!0),A(ie,null,he(i.dialog.editedItem.tasks,(u,y)=>(c(),g(D,{key:y},{prepend:n(()=>[t(w,{class:"mr-2",icon:"mdi-checkbox-blank-circle-outline",size:"small"})]),append:n(()=>[t(h,{color:"error",icon:"mdi-delete",size:"small",variant:"text",onClick:I=>o.removeTask(y)},null,8,["onClick"])]),default:n(()=>[t(R,{modelValue:i.dialog.editedItem.tasks[y],"onUpdate:modelValue":I=>i.dialog.editedItem.tasks[y]=I,density:"compact","hide-details":"",variant:"plain"},null,8,["modelValue","onUpdate:modelValue"])]),_:2},1024))),128))]),_:1}),t(R,{modelValue:i.newTask,"onUpdate:modelValue":e[4]||(e[4]=u=>i.newTask=u),"append-inner-icon":"mdi-plus",class:"mt-2",density:"comfortable",label:"添加需完成部分",variant:"outlined","onClick:appendInner":o.addTask,onKeyup:_e(o.addTask,["enter"])},null,8,["modelValue","onClick:appendInner","onKeyup"])]),_:1})]),_:1})]),_:1})):k("",!0)]),_:1})]),_:1})]),_:1}),t(ae,{class:"pa-4"},{default:n(()=>[t($),t(h,{color:"primary",variant:"elevated",onClick:o.saveDialog},{default:n(()=>[...e[12]||(e[12]=[l(" 关闭 ",-1)])]),_:1},8,["onClick"]),t(h,{color:"error",variant:"text",onClick:o.closeDialog},{default:n(()=>[...e[13]||(e[13]=[l(" 取消 ",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1})]),_:1},8,["modelValue"]),t($e,{modelValue:i.showSnackbar,"onUpdate:modelValue":e[6]||(e[6]=u=>i.showSnackbar=u),color:i.snackbarColor,timeout:3e3},{default:n(()=>[l(v(i.snackbarText),1)]),_:1},8,["modelValue","color"])]),_:1},8,["loading"])}const Nt=Y(os,[["render",as],["__scopeId","data-v-67769fa2"]]),rs={name:"SubjectManagementCard",components:{SettingsCard:X},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 pe.loadData("classworks-config-subject");s?(this.subjects=s.map((e,a)=>({name:e.name,order:e.order??a})).sort((e,a)=>e.order-a.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 pe.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(a=>a.order===s.order);e>-1&&(this.subjects[e]={...s})},deleteSubject(s){const e=this.subjects.findIndex(a=>a.order===s.order);e>-1&&(this.subjects.splice(e,1),this.subjects.forEach((a,d)=>{a.order=d}))},moveSubject(s,e){const a=s+e;if(a>=0&&a{i.order=o})}},resetToDefault(){this.subjects=JSON.parse(JSON.stringify(this.defaultSubjects)),this.showMessage("已重置为默认科目列表","info")}}},us={class:"d-flex justify-space-between align-center mb-6"},ds={class:"d-flex flex-column align-center mr-2"};function cs(s,e,a,d,i,o){const r=X;return c(),g(r,{loading:i.loading,border:"",icon:"mdi-book-multiple",title:"科目管理"},{default:n(()=>[i.error?(c(),g(te,{key:0,class:"mb-4",closable:"",type:"error",variant:"tonal"},{default:n(()=>[l(v(i.error),1)]),_:1})):k("",!0),m("div",us,[m("div",null,[t(h,{loading:i.loading,class:"mr-2",color:"primary","prepend-icon":"mdi-refresh",size:"large",variant:"text",onClick:o.loadConfig},{default:n(()=>[...e[2]||(e[2]=[l(" 重新加载 ",-1)])]),_:1},8,["loading","onClick"]),t(h,{loading:i.loading,color:"success","prepend-icon":"mdi-content-save",size:"large",onClick:o.saveConfig},{default:n(()=>[...e[3]||(e[3]=[l(" 保存 ",-1)])]),_:1},8,["loading","onClick"]),t(h,{loading:i.loading,class:"mr-2","prepend-icon":"mdi-restore",variant:"text",onClick:o.resetToDefault},{default:n(()=>[...e[4]||(e[4]=[l(" 重置为默认 ",-1)])]),_:1},8,["loading","onClick"])]),o.hasChanges?(c(),g(ee,{key:0,color:"warning",variant:"elevated"},{default:n(()=>[...e[5]||(e[5]=[l(" 有未保存的更改 ",-1)])]),_:1})):k("",!0)]),t(U,{class:"mb-4",variant:"outlined"},{default:n(()=>[t(E,null,{default:n(()=>[t(ve,null,{default:n(()=>[t(H,{cols:"12",sm:"6"},{default:n(()=>[t(R,{modelValue:i.newSubjectName,"onUpdate:modelValue":e[0]||(e[0]=p=>i.newSubjectName=p),rules:[p=>!!p||"科目名称不能为空"],"append-inner-icon":"mdi-plus",density:"comfortable",label:"科目名称",variant:"outlined",onKeyup:_e(o.addSubject,["enter"]),"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(F,{lines:"one"},{default:n(()=>[(c(!0),A(ie,null,he(i.subjects,(p,u)=>(c(),g(D,{key:p.order},{prepend:n(()=>[m("div",ds,[t(h,{disabled:u===0,icon:"mdi-chevron-up",size:"small",variant:"text",onClick:y=>o.moveSubject(u,-1)},null,8,["disabled","onClick"]),t(h,{disabled:u===i.subjects.length-1,icon:"mdi-chevron-down",size:"small",variant:"text",onClick:y=>o.moveSubject(u,1)},null,8,["disabled","onClick"])])]),append:n(()=>[t(h,{color:"error",icon:"mdi-delete",size:"small",variant:"text",onClick:y=>o.deleteSubject(p)},null,8,["onClick"])]),default:n(()=>[t(L,null,{default:n(()=>[t(R,{modelValue:p.name,"onUpdate:modelValue":y=>p.name=y,density:"compact","hide-details":"",variant:"plain",onBlur:y=>o.updateSubject(p)},null,8,["modelValue","onUpdate:modelValue","onBlur"])]),_:2},1024)]),_:2},1024))),128))]),_:1})]),_:1})]),_:1}),t($e,{modelValue:i.showSnackbar,"onUpdate:modelValue":e[1]||(e[1]=p=>i.showSnackbar=p),color:i.snackbarColor,timeout:3e3},{default:n(()=>[l(v(i.snackbarText),1)]),_:1},8,["modelValue","color"])]),_:1},8,["loading"])}const Mt=Y(rs,[["render",cs],["__scopeId","data-v-f87674cf"]]),ms={};function fs(s,e,a,d,i,o){const r=Ce,p=X;return c(),g(p,{icon:"mdi-cog",title:"编辑设置"},{default:n(()=>[t(F,null,{default:n(()=>[t(r,{"setting-key":"randomPicker.enabled"}),t(B,{class:"my-2"}),t(r,{"setting-key":"randomPicker.mode"}),t(B,{class:"my-2"}),t(r,{"setting-key":"randomPicker.minNumber"}),t(B,{class:"my-2"}),t(r,{"setting-key":"randomPicker.maxNumber"}),t(B,{class:"my-2"}),t(r,{"setting-key":"randomPicker.defaultCount"}),t(B,{class:"my-2"}),t(r,{"setting-key":"randomPicker.animation"})]),_:1})]),_:1})}const Pt=Y(ms,[["render",fs]]),ps={name:"HitokotoSettings",components:{SettingGroup:Qe,SettingItem:Ce},data(){return{kvConfig:{sources:["zhaoyu"],sensitiveWords:"",jinrishiciToken:null},loading:!1,testLoading:!1,testMessage:"",testColor:"info",testResultDialog:!1,testResultData:null,enableCloudSensitiveWords:!0}},mounted(){this.loadKvSettings()},methods:{async loadKvSettings(){this.loading=!0;try{const s=await pe.loadData("sentence-info");let e=s;s&&s.data&&(e=s.data),e&&(this.kvConfig={sources:Array.isArray(e.sources)?e.sources:["zhaoyu"],sensitiveWords:e.sensitiveWords||"",jinrishiciToken:e.jinrishiciToken})}catch(s){console.error("Failed to load sentence-info",s)}finally{this.loading=!1}},async saveKvSettings(){this.loading=!0;try{if(this.kvConfig.sources.includes("jinrishici")&&!this.kvConfig.jinrishiciToken)try{const s=await qe.get("https://v2.jinrishici.com/token");s.data.status==="success"&&(this.kvConfig.jinrishiciToken=s.data.data)}catch(s){console.error("Failed to get jinrishici token",s)}await pe.saveData("sentence-info",this.kvConfig)}catch(s){console.error("Failed to save sentence-info",s)}finally{this.loading=!1}},async testJinrishici(){var s,e;this.testLoading=!0,this.testMessage="",this.testColor="info";try{const a={};this.kvConfig.jinrishiciToken&&(a["X-User-Token"]=this.kvConfig.jinrishiciToken);const d=await qe.get("https://v2.jinrishici.com/info?X-User-Token="+encodeURIComponent(this.kvConfig.jinrishiciToken));if(d.data&&d.data.status==="success"){this.testResultData=d.data,this.testResultDialog=!0;const i=(s=d.data.data)==null?void 0:s.token,o=(e=d.data.data)==null?void 0:e.region,r=this.kvConfig.jinrishiciToken?i===this.kvConfig.jinrishiciToken:!0;this.testColor=r?"success":"warning",this.testMessage=r?`接口正常,Token 一致:${i}${o?`,地区:${o}`:""}`:`接口返回 Token 与当前设置不一致:${i}${o?`,地区:${o}`:""}`}else this.testColor="error",this.testMessage="接口返回非 success,请检查网络或 Token 配置。"}catch(a){console.error("Failed to test jinrishici info",a),this.testColor="error",this.testMessage="接口测试失败,请检查网络或 Token。"}finally{this.testLoading=!1}}}},hs={class:"d-flex flex-wrap gap-2"},gs={class:"text-caption text-orange mt-2"},ws={class:"d-flex flex-column flex-sm-row align-center w-100"},vs={key:2,class:"text-center pb-4"},bs={class:"d-flex align-center mb-2"},ys={class:"text-body-1 font-weight-medium"},ks={class:"d-flex align-center mb-2"},xs={class:"text-body-1 font-weight-medium"},Ss={class:"d-flex align-center mb-2"},Cs={class:"text-body-1 font-weight-medium"},_s={class:"d-flex align-center mb-2"},Vs={class:"text-body-2 font-weight-medium"},Ds={class:"d-flex align-center mb-2"},As={class:"text-body-1 font-weight-medium"},Is={class:"d-flex align-center mb-2"},Ts={class:"text-body-1 font-weight-medium"},Es={class:"px-4 py-3"},Us={class:"d-flex flex-wrap gap-2"};function js(s,e,a,d,i,o){const r=Ce,p=Qe;return c(),A("div",null,[t(p,{title:"一言设置",icon:"mdi-comment-quote"},{default:n(()=>[t(r,{"setting-key":"hitokoto.enabled"}),t(r,{"setting-key":"hitokoto.refreshInterval"})]),_:1}),t(p,{title:"数据源配置",icon:"mdi-cloud-sync",class:"mt-4"},{default:n(()=>[e[13]||(e[13]=m("div",{class:"text-caption text-grey px-4 pt-2 pb-2"},"以下配置将同步到云端,对所有连接此班级的设备生效。",-1)),t(D,null,{default:n(()=>[t(L,{class:"mb-2"},{default:n(()=>[...e[7]||(e[7]=[l("启用数据源",-1)])]),_:1}),m("div",hs,[t(Ve,{modelValue:i.kvConfig.sources,"onUpdate:modelValue":[e[0]||(e[0]=u=>i.kvConfig.sources=u),o.saveKvSettings],label:"一言 (Hitokoto)",value:"hitokoto","hide-details":"",density:"compact",class:"mr-4",disabled:i.loading},null,8,["modelValue","disabled","onUpdate:modelValue"]),t(Ve,{modelValue:i.kvConfig.sources,"onUpdate:modelValue":[e[1]||(e[1]=u=>i.kvConfig.sources=u),o.saveKvSettings],label:"诏预 (Zhaoyu)",value:"zhaoyu","hide-details":"",density:"compact",class:"mr-4",disabled:i.loading},null,8,["modelValue","disabled","onUpdate:modelValue"]),t(Ve,{modelValue:i.kvConfig.sources,"onUpdate:modelValue":[e[2]||(e[2]=u=>i.kvConfig.sources=u),o.saveKvSettings],label:"今日诗词 (Jinrishici)",value:"jinrishici","hide-details":"",density:"compact",disabled:i.loading},null,8,["modelValue","disabled","onUpdate:modelValue"])]),m("div",gs,[t(w,{size:"x-small",color:"orange",class:"mr-1"},{default:n(()=>[...e[8]||(e[8]=[l("mdi-alert",-1)])]),_:1}),e[9]||(e[9]=l(" 一言(Hitokoto)数据源已收到关于存在负面内容的大量反馈,请用户谨慎启用。 ",-1))])]),_:1}),i.kvConfig.sources.includes("jinrishici")?(c(),g(D,{key:0},{default:n(()=>[t(R,{modelValue:i.kvConfig.jinrishiciToken,"onUpdate:modelValue":e[3]||(e[3]=u=>i.kvConfig.jinrishiciToken=u),label:"今日诗词 Token",variant:"outlined",density:"comfortable",disabled:i.loading,hint:"留空则自动获取,也可以手动输入已有 Token","persistent-hint":"",class:"mt-2",onChange:o.saveKvSettings},null,8,["modelValue","disabled","onChange"])]),_:1})):k("",!0),i.kvConfig.sources.includes("jinrishici")?(c(),g(D,{key:1},{default:n(()=>[m("div",ws,[t(h,{loading:i.testLoading,color:"primary",variant:"outlined",class:"mr-sm-4 mb-2 mb-sm-0",onClick:o.testJinrishici},{default:n(()=>[...e[10]||(e[10]=[l(" 测试今日诗词接口 ",-1)])]),_:1},8,["loading","onClick"]),i.testMessage?(c(),g(te,{key:0,type:i.testColor,density:"comfortable",border:"start",class:"flex-grow-1"},{default:n(()=>[l(v(i.testMessage),1)]),_:1},8,["type"])):k("",!0)])]),_:1})):k("",!0),t(D,null,{default:n(()=>[t(Be,{modelValue:i.kvConfig.sensitiveWords,"onUpdate:modelValue":e[4]||(e[4]=u=>i.kvConfig.sensitiveWords=u),disabled:i.loading,label:"敏感词过滤 (用逗号分隔)",variant:"outlined",rows:"3","auto-grow":"","hide-details":"",class:"mt-2 mb-2",onChange:o.saveKvSettings},null,8,["modelValue","disabled","onChange"])]),_:1}),t(D,null,{default:n(()=>[t(Ve,{label:"启用云端敏感词列表","hide-details":"",modelValue:i.enableCloudSensitiveWords,"onUpdate:modelValue":e[5]||(e[5]=u=>i.enableCloudSensitiveWords=u),density:"compact",disabled:"",class:"mb-2"},null,8,["modelValue"]),e[11]||(e[11]=m("div",{class:"text-caption text-grey"},[l(" 已启用的数据源将在获取一言时随机尝试,直到成功获取内容为止。"),m("br"),l(" 敏感词过滤会将包含任意敏感词的句子过滤掉,避免显示不当内容。"),m("br")],-1))]),_:1}),i.loading?(c(),A("div",vs,[t(_t,{indeterminate:"",size:"24",color:"primary"}),e[12]||(e[12]=m("span",{class:"ml-2 text-caption"},"正在同步配置...",-1))])):k("",!0)]),_:1}),t(ge,{modelValue:i.testResultDialog,"onUpdate:modelValue":e[6]||(e[6]=u=>i.testResultDialog=u),"max-width":"600"},{default:n(()=>[i.testResultData?(c(),g(U,{key:0,class:"rounded-lg"},{default:n(()=>[t(E,{class:"pa-0"},{default:n(()=>[t(F,{lines:"two",class:"py-0"},{default:n(()=>[t(D,{class:"px-4 py-3"},{prepend:n(()=>[t(Xe,{color:"primary",variant:"tonal",class:"mr-2"},{default:n(()=>[t(w,{icon:"mdi-key-variant"})]),_:1})]),default:n(()=>[t(L,{class:"text-subtitle-2 font-weight-bold mb-1"},{default:n(()=>[...e[14]||(e[14]=[l("Token",-1)])]),_:1}),t(se,{class:"text-body-2 text-high-emphasis",style:{"word-break":"break-all"}},{default:n(()=>[l(v(i.testResultData.data.token),1)]),_:1})]),_:1}),t(B),t(ve,{"no-gutters":""},{default:n(()=>[t(H,{cols:"6"},{default:n(()=>[t(D,{class:"px-4 py-2"},{prepend:n(()=>[t(w,{icon:"mdi-ip-network",color:"grey-darken-1",class:"mr-2"})]),default:n(()=>[t(L,{class:"text-caption text-grey-darken-1"},{default:n(()=>[...e[15]||(e[15]=[l("IP 地址",-1)])]),_:1}),t(se,{class:"text-body-2"},{default:n(()=>[l(v(i.testResultData.data.ip),1)]),_:1})]),_:1})]),_:1}),t(H,{cols:"6"},{default:n(()=>[t(D,{class:"px-4 py-2"},{prepend:n(()=>[t(w,{icon:"mdi-map-marker-radius",color:"grey-darken-1",class:"mr-2"})]),default:n(()=>[t(L,{class:"text-caption text-grey-darken-1"},{default:n(()=>[...e[16]||(e[16]=[l("地区",-1)])]),_:1}),t(se,{class:"text-body-2"},{default:n(()=>[l(v(i.testResultData.data.region),1)]),_:1})]),_:1})]),_:1})]),_:1}),t(B),t(tt,{class:"px-4 py-3"},{default:n(()=>[t(ve,{dense:""},{default:n(()=>[t(H,{cols:"6",sm:"4"},{default:n(()=>[m("div",bs,[t(w,{icon:"mdi-thermometer",color:"orange",class:"mr-2"}),m("div",null,[e[17]||(e[17]=m("div",{class:"text-caption text-grey"},"温度",-1)),m("div",ys,v(i.testResultData.data.weatherData.temperature)+"°C",1)])])]),_:1}),t(H,{cols:"6",sm:"4"},{default:n(()=>[m("div",ks,[t(w,{icon:"mdi-weather-cloudy",color:"blue-grey",class:"mr-2"}),m("div",null,[e[18]||(e[18]=m("div",{class:"text-caption text-grey"},"天气",-1)),m("div",xs,v(i.testResultData.data.weatherData.weather),1)])])]),_:1}),t(H,{cols:"6",sm:"4"},{default:n(()=>[m("div",Ss,[t(w,{icon:"mdi-water-percent",color:"blue",class:"mr-2"}),m("div",null,[e[19]||(e[19]=m("div",{class:"text-caption text-grey"},"湿度",-1)),m("div",Cs,v(i.testResultData.data.weatherData.humidity)+"%",1)])])]),_:1}),t(H,{cols:"6",sm:"4"},{default:n(()=>[m("div",_s,[t(w,{icon:"mdi-weather-windy",color:"teal",class:"mr-2"}),m("div",null,[e[20]||(e[20]=m("div",{class:"text-caption text-grey"},"风向/风力",-1)),m("div",Vs,v(i.testResultData.data.weatherData.windDirection)+" "+v(i.testResultData.data.weatherData.windPower)+"级 ",1)])])]),_:1}),t(H,{cols:"6",sm:"4"},{default:n(()=>[m("div",Ds,[t(w,{icon:"mdi-blur",color:"grey",class:"mr-2"}),m("div",null,[e[21]||(e[21]=m("div",{class:"text-caption text-grey"},"PM2.5",-1)),m("div",As,v(i.testResultData.data.weatherData.pm25),1)])])]),_:1}),t(H,{cols:"6",sm:"4"},{default:n(()=>[m("div",Is,[t(w,{icon:"mdi-eye",color:"indigo",class:"mr-2"}),m("div",null,[e[22]||(e[22]=m("div",{class:"text-caption text-grey"},"能见度",-1)),m("div",Ts,v(i.testResultData.data.weatherData.visibility),1)])])]),_:1})]),_:1})]),_:1}),t(B),m("div",Es,[e[23]||(e[23]=m("div",{class:"text-caption text-grey mb-2"},"环境标签",-1)),m("div",Us,[(c(!0),A(ie,null,he(i.testResultData.data.tags,u=>(c(),g(ee,{key:u,size:"small",color:"primary",variant:"tonal",class:"mr-1 mb-1"},{default:n(()=>[l(v(u),1)]),_:2},1024))),128))])]),t(B),t(D,{class:"px-4 py-2"},{prepend:n(()=>[t(w,{icon:"mdi-clock-outline",size:"small",class:"mr-2"})]),default:n(()=>[t(L,{class:"text-caption text-grey-darken-1"},{default:n(()=>[l(" 北京时间: "+v(new Date(i.testResultData.data.beijingTime).toLocaleString()),1)]),_:1})]),_:1})]),_:1})]),_:1})]),_:1})):k("",!0)]),_:1},8,["modelValue"])])}const Bt=Y(ps,[["render",js]]),Ns={name:"NotificationSoundSettings",data(){return{singleSound:"",urgentSound:"",currentAudio:null,showAutoplayWarning:!0}},computed:{soundOptions(){return un.map(s=>({title:s.replace(".mp3",""),value:s}))}},mounted(){this.loadSettings()},beforeUnmount(){this.stopPreview()},methods:{loadSettings(){this.singleSound=_("notification.singleSound"),this.urgentSound=_("notification.urgentSound")},onSingleSoundChange(s){var e;xe("notification.singleSound",s),(e=this.$message)==null||e.success("设置已保存",`单次通知铃声: ${s}`)},onUrgentSoundChange(s){var e;xe("notification.urgentSound",s),(e=this.$message)==null||e.success("设置已保存",`紧急通知铃声: ${s}`)},async previewSound(s){var e,a;this.showAutoplayWarning=!1,this.stopPreview();try{const d=await this.playSoundWithPromise(s,!1);this.currentAudio=d,this.currentAudio&&this.currentAudio.addEventListener("ended",()=>{this.currentAudio=null},{once:!0})}catch(d){console.error("播放音频失败:",d),d.name==="NotAllowedError"?(e=this.$message)==null||e.warning("无法播放音频","浏览器阻止了自动播放,请再次点击试听按钮"):(a=this.$message)==null||a.error("播放失败","音频文件加载失败,请稍后重试")}},playSoundWithPromise(s,e=!1){return new Promise((a,d)=>{const i=this.getSoundPath(s);if(!i){d(new Error("音频文件不存在"));return}try{const o=new Audio(i);o.loop=e,o.play().then(()=>{a(o)}).catch(r=>{d(r)})}catch(o){d(o)}})},getSoundPath(s){if(!s)return null;try{return`/src/assets/sounds/${s}`}catch{return null}},stopPreview(){this.currentAudio&&(rn(this.currentAudio),this.currentAudio=null)},resetSingleSound(){var s;this.singleSound="Teams 默认.mp3",xe("notification.singleSound",this.singleSound),(s=this.$message)==null||s.success("已恢复单次通知铃声默认设置")},resetUrgentSound(){var s;this.urgentSound="Teams 默认通话铃.mp3",xe("notification.urgentSound",this.urgentSound),(s=this.$message)==null||s.success("已恢复紧急通知铃声默认设置")}}},Ms={class:"d-flex align-center"},Ps={class:"mt-3 d-flex gap-2"},Bs={class:"mt-3 d-flex gap-2"};function Ls(s,e,a,d,i,o){return c(),g(U,{class:"notification-sound-settings"},{default:n(()=>[t(O,null,{default:n(()=>[...e[5]||(e[5]=[l(" 通知铃声设置 ",-1)])]),_:1}),t(E,null,{default:n(()=>[i.showAutoplayWarning?(c(),g(te,{key:0,type:"info",variant:"tonal",closable:"",class:"mb-4","onClick:close":e[0]||(e[0]=r=>i.showAutoplayWarning=!1)},{default:n(()=>[m("div",Ms,[t(w,{class:"mr-2"},{default:n(()=>[...e[6]||(e[6]=[l("mdi-information",-1)])]),_:1}),e[7]||(e[7]=m("span",null,"首次使用请点击试听按钮测试音频播放是否正常",-1))])]),_:1})):k("",!0),t(ve,null,{default:n(()=>[t(H,{cols:"12"},{default:n(()=>[t(U,{border:""},{default:n(()=>[t(O,{class:"text-subtitle-1"},{default:n(()=>[t(w,{left:""},{default:n(()=>[...e[8]||(e[8]=[l("mdi-bell-ring",-1)])]),_:1}),e[9]||(e[9]=l(" 单次通知铃声 ",-1))]),_:1}),t(E,null,{default:n(()=>[t(Ke,{modelValue:i.singleSound,"onUpdate:modelValue":[e[1]||(e[1]=r=>i.singleSound=r),o.onSingleSoundChange],items:o.soundOptions,label:"选择铃声","prepend-icon":"mdi-music-note",variant:"outlined",density:"comfortable"},{item:n(({props:r,item:p})=>[t(D,Le(r,{onClick:u=>o.previewSound(p.value)}),{prepend:n(()=>[t(w,null,{default:n(()=>[...e[10]||(e[10]=[l("mdi-music-note",-1)])]),_:1})]),append:n(()=>[t(h,{icon:"",size:"small",variant:"text",onClick:Ae(u=>o.previewSound(p.value),["stop"])},{default:n(()=>[t(w,null,{default:n(()=>[...e[11]||(e[11]=[l("mdi-play",-1)])]),_:1})]),_:1},8,["onClick"])]),_:2},1040,["onClick"])]),_:1},8,["modelValue","items","onUpdate:modelValue"]),m("div",Ps,[t(h,{color:"primary",variant:"tonal",onClick:e[2]||(e[2]=r=>o.previewSound(i.singleSound))},{default:n(()=>[t(w,{left:""},{default:n(()=>[...e[12]||(e[12]=[l("mdi-play",-1)])]),_:1}),e[13]||(e[13]=l(" 试听 ",-1))]),_:1}),t(h,{onClick:o.resetSingleSound},{default:n(()=>[t(w,{left:""},{default:n(()=>[...e[14]||(e[14]=[l("mdi-restore",-1)])]),_:1}),e[15]||(e[15]=l(" 恢复 ",-1))]),_:1},8,["onClick"])])]),_:1})]),_:1})]),_:1}),t(H,{cols:"12"},{default:n(()=>[t(U,{border:""},{default:n(()=>[t(O,{class:"text-subtitle-1"},{default:n(()=>[t(w,{left:"",color:"error"},{default:n(()=>[...e[16]||(e[16]=[l("mdi-bell-alert",-1)])]),_:1}),e[17]||(e[17]=l(" 紧急通知铃声 ",-1))]),_:1}),t(E,null,{default:n(()=>[t(Ke,{modelValue:i.urgentSound,"onUpdate:modelValue":[e[3]||(e[3]=r=>i.urgentSound=r),o.onUrgentSoundChange],items:o.soundOptions,label:"选择铃声","prepend-icon":"mdi-music-note",variant:"outlined",density:"comfortable"},{item:n(({props:r,item:p})=>[t(D,Le(r,{onClick:u=>o.previewSound(p.value)}),{prepend:n(()=>[t(w,null,{default:n(()=>[...e[18]||(e[18]=[l("mdi-music-note",-1)])]),_:1})]),append:n(()=>[t(h,{icon:"",size:"small",variant:"text",onClick:Ae(u=>o.previewSound(p.value),["stop"])},{default:n(()=>[t(w,null,{default:n(()=>[...e[19]||(e[19]=[l("mdi-play",-1)])]),_:1})]),_:1},8,["onClick"])]),_:2},1040,["onClick"])]),_:1},8,["modelValue","items","onUpdate:modelValue"]),m("div",Bs,[t(h,{color:"error",variant:"tonal",onClick:e[4]||(e[4]=r=>o.previewSound(i.urgentSound))},{default:n(()=>[t(w,{left:""},{default:n(()=>[...e[20]||(e[20]=[l("mdi-play",-1)])]),_:1}),e[21]||(e[21]=l(" 试听 ",-1))]),_:1}),t(h,{onClick:o.resetUrgentSound},{default:n(()=>[t(w,{left:""},{default:n(()=>[...e[22]||(e[22]=[l("mdi-restore",-1)])]),_:1}),e[23]||(e[23]=l(" 恢复 ",-1))]),_:1},8,["onClick"])])]),_:1})]),_:1})]),_:1})]),_:1})]),_:1})]),_:1})}const Lt=Y(Ns,[["render",Ls],["__scopeId","data-v-0027fd4d"]]),zs={name:"ThemeSettingsCard",components:{SettingsCard:X},data(){return{localTheme:_("theme.mode")}},watch:{localTheme(s){xe("theme.mode",s),this.updateTheme(s)}},setup(){return{theme:pn()}},methods:{updateTheme(s){this.theme.global.name.value=s}}};function Os(s,e,a,d,i,o){const r=X;return c(),g(r,{icon:"mdi-palette",title:"主题设置"},{default:n(()=>[t(F,null,{default:n(()=>[t(D,null,{prepend:n(()=>[t(w,{class:"mr-3",icon:"mdi-theme-light-dark"})]),append:n(()=>[t(hn,{modelValue:i.localTheme,"onUpdate:modelValue":e[0]||(e[0]=p=>i.localTheme=p),color:"primary",density:"comfortable"},{default:n(()=>[t(h,{value:"light"},{default:n(()=>[t(w,{class:"mr-2",icon:"mdi-white-balance-sunny"}),e[3]||(e[3]=l(" 明亮 ",-1))]),_:1}),t(h,{value:"dark"},{default:n(()=>[t(w,{class:"mr-2",icon:"mdi-moon-waning-crescent"}),e[4]||(e[4]=l(" 暗黑 ",-1))]),_:1})]),_:1},8,["modelValue"])]),default:n(()=>[t(L,null,{default:n(()=>[...e[1]||(e[1]=[l("主题模式",-1)])]),_:1}),t(se,null,{default:n(()=>[...e[2]||(e[2]=[l("选择明亮或暗黑主题",-1)])]),_:1})]),_:1})]),_:1})]),_:1})}const zt=Y(zs,[["render",Os]]),Rs={name:"DisplaySettingsCard",components:{SettingsCard:X,SettingItem:Ce},data(){return{}}};function Ks(s,e,a,d,i,o){const r=Ce,p=X;return c(),g(p,{border:"",icon:"mdi-monitor",title:"显示设置"},{default:n(()=>[t(F,null,{default:n(()=>[t(r,{"setting-key":"display.emptySubjectDisplay"}),t(B,{class:"my-2"}),t(r,{"setting-key":"display.dynamicSort"}),t(B,{class:"my-2"}),t(r,{"setting-key":"display.showRandomButton"}),t(B,{class:"my-2"}),t(r,{"setting-key":"display.showFullscreenButton"}),t(B,{class:"my-2"}),t(r,{"setting-key":"display.cardHoverEffect"}),t(B,{class:"my-2"}),t(r,{"setting-key":"display.enhancedTouchMode"}),t(B,{class:"my-2"}),t(r,{"setting-key":"display.showQuickTools"}),t(B,{class:"my-2"}),t(r,{"setting-key":"display.showAntiScreenBurnCard"}),t(B,{class:"my-2"}),t(r,{"setting-key":"display.showExamScheduleButton"}),t(B,{class:"my-2"}),t(r,{"setting-key":"display.forceDesktopMode"})]),_:1})]),_:1})}const Ot=Y(Rs,[["render",Ks]]),Fs={};function Qs(s,e,a,d,i,o){const r=Ce,p=X;return c(),g(p,{icon:"mdi-cog",title:"编辑设置"},{default:n(()=>[t(F,null,{default:n(()=>[t(r,{"setting-key":"edit.autoSave"}),t(B,{class:"my-2"}),t(r,{"setting-key":"edit.blockNonTodayAutoSave"}),t(B,{class:"my-2"}),t(r,{"setting-key":"edit.confirmNonTodaySave"}),t(B,{class:"my-2"}),t(r,{"setting-key":"edit.refreshBeforeEdit"}),t(B,{class:"my-2"}),t(r,{"setting-key":"edit.autoSavePromptText"}),t(B,{class:"my-2"}),t(r,{"setting-key":"edit.manualSavePromptText"})]),_:1})]),_:1})}const Rt=Y(Fs,[["render",Qs]]),Js={name:"RefreshSettingsCard",components:{SettingsCard:X},data(){return{}}};function Hs(s,e,a,d,i,o){const r=Ce,p=X;return c(),g(p,{icon:"mdi-refresh-circle",title:"刷新设置"},{default:n(()=>[t(At,null,{default:n(()=>[t(F,null,{default:n(()=>[t(r,{"setting-key":"refresh.auto",title:"自动刷新"}),t(B,{class:"my-2"}),t(r,{"setting-key":"refresh.interval",title:"刷新间隔"})]),_:1})]),_:1})]),_:1})}const Kt=Y(Js,[["render",Hs]]),Gs={name:"SettingsLinkGenerator",data(){return{selectedItems:[],generatedLink:"",linkCopied:!1,search:"",preconfigForm:{namespace:"",authCode:"",autoExecute:!1},unifiedLink:"",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=Me(),e=[];for(const[a,d]of Object.entries(We)){if(d.requireDeveloper&&!s["developer.enabled"])continue;const i=s[a]!==d.default;e.push({key:a,description:d.description||a,value:s[a],icon:d.icon||"mdi-cog",isChanged:i,defaultValue:d.default})}return e.sort((a,d)=>a.key.localeCompare(d.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 a=e.description.toLowerCase(),d=e.key.toLowerCase(),i=String(e.value).toLowerCase(),o=e.isChanged?"已修改":"默认";return a.includes(s)||d.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=Me();return this.selectedItems.some(e=>{const a=We[e];return a&&s[e]!==a.default})}},methods:{handleSelectionChange(s){this.selectedItems=s.map(e=>e.key),this.generateLink()},generateLink(){const s=`${window.location.protocol}//${window.location.host}/`,e=Me(),a={};for(const d of this.selectedItems)a[d]=e[d];if(Object.keys(a).length===0){this.generatedLink=s;return}try{const d=JSON.stringify(a),o=new TextEncoder().encode(d),p={config:btoa(Array.from(o).map(j=>String.fromCharCode(j)).join(""))},y=new URLSearchParams(window.location.search).get("date");y&&(p.date=y);const I=new URLSearchParams(p).toString();this.generatedLink=`${s}?${I}`}catch(d){console.error("生成链接失败:",d),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.")&&e.key!=="server.kvToken").map(e=>e.key);this.selectedItems=s,this.generateLink()},selectChangedSettings(){const s=this.settingItems.filter(e=>e.isChanged&&e.key!=="server.kvToken").map(e=>e.key);this.selectedItems=s,this.generateLink()},selectByPrefix(s){const e=this.settingItems.filter(a=>a.key.startsWith(`${s}.`)).map(a=>a.key);this.selectedItems=e},autoGenerateLink(){this.selectedItems.length>0?this.generateLink():this.generatedLink=""},getSettingDescription(s){const e=this.settingItems.find(a=>a.key===s);return e?e.description:s},generateUnifiedLink(){if(this.preconfigForm.namespace.trim())try{const s=`${window.location.protocol}//${window.location.host}/`,e=new URLSearchParams;if(e.append("namespace",this.preconfigForm.namespace.trim()),this.preconfigForm.authCode.trim()&&e.append("authCode",this.preconfigForm.authCode.trim()),this.preconfigForm.autoExecute&&e.append("autoExecute","true"),this.selectedItems.length>0){const a=Me(),d={};for(const u of this.selectedItems)d[u]=a[u];const i=JSON.stringify(d),r=new TextEncoder().encode(i),p=btoa(Array.from(r).map(u=>String.fromCharCode(u)).join(""));e.append("config",p)}this.unifiedLink=`${s}?${e.toString()}`,this.linkCopied=!1,console.log("生成统一链接:",this.unifiedLink),console.log("包含预配置:",!!this.preconfigForm.namespace),console.log("包含设置数量:",this.selectedItems.length)}catch(s){console.error("生成统一链接失败:",s),this.unifiedLink="链接生成失败,请重试"}},async copyUnifiedLink(){if(this.unifiedLink||this.generateUnifiedLink(),!(!this.unifiedLink||this.unifiedLink.includes("失败")))try{await navigator.clipboard.writeText(this.unifiedLink),this.linkCopied=!0,setTimeout(()=>{this.linkCopied=!1},3e3)}catch(s){console.error("复制统一链接失败:",s)}},openTestLink(){this.unifiedLink&&!this.unifiedLink.includes("失败")&&window.open(this.unifiedLink,"_blank")},clearAll(){this.preconfigForm={namespace:"",authCode:"",autoExecute:!1},this.selectedItems=[],this.unifiedLink="",this.generatedLink="",this.linkCopied=!1}},watch:{selectedItems:{handler(){this.preconfigForm.namespace.trim()&&this.generateUnifiedLink()},deep:!0},"preconfigForm.namespace":{handler(){this.preconfigForm.namespace.trim()?this.generateUnifiedLink():this.unifiedLink=""}},"preconfigForm.authCode":{handler(){this.preconfigForm.namespace.trim()&&this.generateUnifiedLink()}},"preconfigForm.autoExecute":{handler(){this.preconfigForm.namespace.trim()&&this.generateUnifiedLink()}}}},Ys={class:"d-flex mb-3 gap-2 flex-wrap"},Ws={class:"d-flex align-center mb-3 flex-wrap gap-2"},qs={class:"d-flex align-center"},Zs={class:"d-flex align-center"},Xs={key:0},$s={key:1},ei={key:2},ti={class:"text-caption text-grey"},ni={class:"d-flex mb-3 gap-2 flex-wrap"},si={class:"d-flex flex-wrap gap-1"};function ii(s,e,a,d,i,o){return c(),A("div",null,[t(U,{border:"",class:"unified-link-generator"},{default:n(()=>[t(O,{class:"text-h6"},{default:n(()=>[t(w,{class:"mr-2",icon:"mdi-link-variant",start:""}),e[6]||(e[6]=l(" 统一链接生成器 ",-1))]),_:1}),t(E,null,{default:n(()=>[e[35]||(e[35]=m("div",{class:"text-body-2 text-medium-emphasis mb-4"}," 生成包含预配置认证信息和设置的统一链接。可以同时预配置设备认证和应用设置。 ",-1)),t(U,{class:"mb-4",variant:"tonal"},{default:n(()=>[t(O,{class:"text-subtitle-1"},{default:n(()=>[t(w,{start:""},{default:n(()=>[...e[7]||(e[7]=[l("mdi-account-key",-1)])]),_:1}),e[8]||(e[8]=l(" 预配置认证信息 ",-1))]),_:1}),t(E,null,{default:n(()=>[t(ve,null,{default:n(()=>[t(H,{cols:"12",md:"6"},{default:n(()=>[t(R,{modelValue:i.preconfigForm.namespace,"onUpdate:modelValue":e[0]||(e[0]=r=>i.preconfigForm.namespace=r),hint:"设备的命名空间标识符",label:"命名空间","persistent-hint":"",placeholder:"例如: classroom-001","prepend-inner-icon":"mdi-identifier",variant:"outlined"},null,8,["modelValue"])]),_:1}),t(H,{cols:"12",md:"6"},{default:n(()=>[t(R,{modelValue:i.preconfigForm.authCode,"onUpdate:modelValue":e[1]||(e[1]=r=>i.preconfigForm.authCode=r),hint:"留空则需要用户手动输入",label:"认证码","persistent-hint":"",placeholder:"设备认证码(可选)","prepend-inner-icon":"mdi-lock-outline",variant:"outlined"},null,8,["modelValue"])]),_:1})]),_:1}),t(ve,{class:"mt-2"},{default:n(()=>[t(H,{cols:"12"},{default:n(()=>[t(Ve,{modelValue:i.preconfigForm.autoExecute,"onUpdate:modelValue":e[2]||(e[2]=r=>i.preconfigForm.autoExecute=r),density:"compact",hint:"启用后会自动尝试认证,即使没有认证码也会尝试",label:"自动执行认证","persistent-hint":""},null,8,["modelValue"])]),_:1})]),_:1}),i.preconfigForm.namespace?(c(),g(te,{key:0,class:"mt-3",type:"info",variant:"tonal"},{default:n(()=>[e[13]||(e[13]=m("div",{class:"text-subtitle-2 mb-2"},"预配置信息:",-1)),t(ee,{class:"mr-2 mb-1",size:"small"},{default:n(()=>[t(w,{size:"small",start:""},{default:n(()=>[...e[9]||(e[9]=[l("mdi-identifier",-1)])]),_:1}),l(" 命名空间: "+v(i.preconfigForm.namespace),1)]),_:1}),i.preconfigForm.authCode?(c(),g(ee,{key:0,class:"mr-2 mb-1",color:"warning",size:"small"},{default:n(()=>[t(w,{size:"small",start:""},{default:n(()=>[...e[10]||(e[10]=[l("mdi-lock",-1)])]),_:1}),l(" 认证码: "+v(i.preconfigForm.authCode.length>8?i.preconfigForm.authCode.substring(0,8)+"...":i.preconfigForm.authCode),1)]),_:1})):(c(),g(ee,{key:1,class:"mr-2 mb-1",color:"grey",size:"small"},{default:n(()=>[t(w,{size:"small",start:""},{default:n(()=>[...e[11]||(e[11]=[l("mdi-lock-open",-1)])]),_:1}),e[12]||(e[12]=l(" 无认证码 ",-1))]),_:1})),t(ee,{color:i.preconfigForm.autoExecute?"success":"orange",class:"mr-2 mb-1",size:"small"},{default:n(()=>[t(w,{size:"small",start:""},{default:n(()=>[l(v(i.preconfigForm.autoExecute?"mdi-play-circle":"mdi-hand-back-left"),1)]),_:1}),l(" "+v(i.preconfigForm.autoExecute?"自动认证":"手动认证"),1)]),_:1},8,["color"])]),_:1})):k("",!0)]),_:1})]),_:1}),t(U,{class:"mb-4",variant:"tonal"},{default:n(()=>[t(O,{class:"text-subtitle-1"},{default:n(()=>[t(w,{start:""},{default:n(()=>[...e[14]||(e[14]=[l("mdi-cog-transfer",-1)])]),_:1}),e[15]||(e[15]=l(" 设置分享(可选) ",-1))]),_:1}),t(E,null,{default:n(()=>[e[22]||(e[22]=m("div",{class:"text-body-2 text-medium-emphasis mb-3"}," 选择需要包含在链接中的设置项。如果不选择任何设置,将只生成预配置认证链接。 ",-1)),m("div",Ys,[t(h,{color:"primary","prepend-icon":"mdi-server-network",size:"small",variant:"tonal",onClick:o.selectDataSourceSettings},{default:n(()=>[...e[16]||(e[16]=[l(" 数据源设置 ",-1)])]),_:1},8,["onClick"]),t(h,{color:"primary","prepend-icon":"mdi-compare",size:"small",variant:"tonal",onClick:o.selectChangedSettings},{default:n(()=>[...e[17]||(e[17]=[l(" 已变更设置 ",-1)])]),_:1},8,["onClick"]),t(h,{color:"success","prepend-icon":"mdi-select-all",size:"small",variant:"tonal",onClick:o.selectAll},{default:n(()=>[...e[18]||(e[18]=[l(" 全选 ",-1)])]),_:1},8,["onClick"]),t(h,{color:"error","prepend-icon":"mdi-select-remove",size:"small",variant:"tonal",onClick:o.resetSelection},{default:n(()=>[...e[19]||(e[19]=[l(" 清除选择 ",-1)])]),_:1},8,["onClick"])]),m("div",Ws,[t(ee,{class:"mr-2",color:"primary"},{default:n(()=>[l(" 已选 "+v(i.selectedItems.length)+" 项设置 ",1)]),_:1}),i.selectedItems.length>0?(c(),A(ie,{key:0},[(c(!0),A(ie,null,he(i.selectedItems.slice(0,3),r=>(c(),g(ee,{key:r,class:"mr-1",size:"small",variant:"text"},{default:n(()=>[l(v(o.getSettingDescription(r)),1)]),_:2},1024))),128)),i.selectedItems.length>3?(c(),g(ee,{key:0,color:"grey",size:"small",variant:"text"},{default:n(()=>[l(" +"+v(i.selectedItems.length-3)+" 更多 ",1)]),_:1})):k("",!0)],64)):k("",!0)]),t(nt,{variant:"accordion"},{default:n(()=>[t(st,null,{default:n(()=>[t(It,null,{default:n(({expanded:r})=>[m("div",qs,[t(w,{class:"mr-2"},{default:n(()=>[l(v(r?"mdi-chevron-up":"mdi-chevron-down"),1)]),_:2},1024),e[20]||(e[20]=l(" 显示设置列表详情 ",-1))])]),_:1}),t(it,null,{default:n(()=>[t(R,{modelValue:i.search,"onUpdate:modelValue":e[3]||(e[3]=r=>i.search=r),class:"mb-4",clearable:"","hide-details":"",label:"搜索设置","prepend-inner-icon":"mdi-magnify","single-line":""},null,8,["modelValue"]),t(Tt,{modelValue:i.selectedItems,"onUpdate:modelValue":e[4]||(e[4]=r=>i.selectedItems=r),headers:i.headers,items:o.filteredItems,"items-per-page":o.settingItems.length,"sort-by":[{key:"isChanged",order:"desc"}],class:"rounded setting-table",density:"compact","item-value":"key","show-select":"","onUpdate:selected":o.handleSelectionChange},{"item.description":n(({item:r})=>[m("div",Zs,[t(w,{icon:r.icon,class:"mr-2",size:"small"},null,8,["icon"]),l(" "+v(r.description)+" ",1),r.key==="server.kvToken"?(c(),g(ee,{key:0,class:"ml-2",color:"error",size:"x-small"},{default:n(()=>[...e[21]||(e[21]=[l(" 敏感 ",-1)])]),_:1})):k("",!0)])]),"item.value":n(({item:r})=>[typeof r.value=="boolean"?(c(),A("span",Xs,v(r.value?"是":"否"),1)):r.key==="server.kvToken"&&r.value?(c(),A("span",$s,v(r.value.substring(0,8))+"... ",1)):(c(),A("span",ei,v(r.value),1))]),"item.key":n(({item:r})=>[m("span",ti,v(r.key),1)]),"item.isChanged":n(({item:r})=>[t(ee,{color:r.isChanged?"warning":"success",text:r.isChanged?"已修改":"默认",density:"compact",size:"x-small"},null,8,["color","text"])]),_:2},1032,["modelValue","headers","items","items-per-page","onUpdate:selected"])]),_:1})]),_:1})]),_:1})]),_:1})]),_:1}),t(U,{class:"mb-4",variant:"outlined"},{default:n(()=>[t(O,{class:"text-subtitle-1"},{default:n(()=>[t(w,{start:""},{default:n(()=>[...e[23]||(e[23]=[l("mdi-link",-1)])]),_:1}),e[24]||(e[24]=l(" 生成的统一链接 ",-1))]),_:1}),t(E,null,{default:n(()=>[m("div",ni,[t(h,{disabled:!i.preconfigForm.namespace.trim(),color:"primary","prepend-icon":"mdi-auto-fix",variant:"flat",onClick:o.generateUnifiedLink},{default:n(()=>[...e[25]||(e[25]=[l(" 生成统一链接 ",-1)])]),_:1},8,["disabled","onClick"]),t(h,{disabled:!i.unifiedLink,color:"success","prepend-icon":"mdi-test-tube",variant:"tonal",onClick:o.openTestLink},{default:n(()=>[...e[26]||(e[26]=[l(" 测试链接 ",-1)])]),_:1},8,["disabled","onClick"]),t(h,{color:"error","prepend-icon":"mdi-delete",variant:"tonal",onClick:o.clearAll},{default:n(()=>[...e[27]||(e[27]=[l(" 清空所有 ",-1)])]),_:1},8,["onClick"])]),t(R,{modelValue:i.unifiedLink,"onUpdate:modelValue":e[5]||(e[5]=r=>i.unifiedLink=r),"append-inner-icon":i.linkCopied?"mdi-check":"mdi-content-copy",placeholder:i.preconfigForm.namespace?"点击「生成统一链接」按钮":"请先输入命名空间",class:"mb-3",label:"统一链接",readonly:"",variant:"outlined","onClick:appendInner":o.copyUnifiedLink},null,8,["modelValue","append-inner-icon","placeholder","onClick:appendInner"]),i.unifiedLink?(c(),g(te,{key:0,class:"mb-3",type:"success",variant:"tonal"},{default:n(()=>[e[33]||(e[33]=m("div",{class:"text-subtitle-2 mb-2"},"链接包含内容:",-1)),m("div",si,[t(ee,{color:"primary",size:"small"},{default:n(()=>[t(w,{size:"small",start:""},{default:n(()=>[...e[28]||(e[28]=[l("mdi-account-key",-1)])]),_:1}),e[29]||(e[29]=l(" 预配置认证 ",-1))]),_:1}),i.selectedItems.length>0?(c(),g(ee,{key:0,color:"secondary",size:"small"},{default:n(()=>[t(w,{size:"small",start:""},{default:n(()=>[...e[30]||(e[30]=[l("mdi-cog",-1)])]),_:1}),l(" "+v(i.selectedItems.length)+" 项设置 ",1)]),_:1})):(c(),g(ee,{key:1,color:"grey",size:"small"},{default:n(()=>[t(w,{size:"small",start:""},{default:n(()=>[...e[31]||(e[31]=[l("mdi-cog-off",-1)])]),_:1}),e[32]||(e[32]=l(" 无额外设置 ",-1))]),_:1}))])]),_:1})):k("",!0)]),_:1})]),_:1}),t(te,{type:"warning",variant:"tonal"},{default:n(()=>[...e[34]||(e[34]=[m("div",{class:"text-subtitle-2 mb-2"},"⚠️ 安全提醒",-1),m("ul",{class:"text-body-2 pl-4"},[m("li",null,"认证码和设置信息会在URL中传输,请谨慎分发"),m("li",null,"建议仅在受信任的网络环境中使用"),m("li",null,"生产环境建议使用HTTPS协议"),m("li",null,"数据源设置和已变更设置默认不包含敏感Token信息")],-1)])]),_:1})]),_:1})]),_:1})])}const Ft=Y(Gs,[["render",ii]]),oi={name:"UnsavedWarning",props:{show:Boolean,message:{type:String,default:"未保存"}}},li={class:"warning-container"};function ai(s,e,a,d,i,o){return c(),A("div",li,[a.show?(c(),g(ee,{key:0,class:"warning-chip",color:"warning",size:"small"},{default:n(()=>[l(v(a.message),1)]),_:1})):k("",!0)])}const Qt=Y(oi,[["render",ai],["__scopeId","data-v-0f36b655"]]),ri=wn({disabled:Boolean,modelValue:{type:Boolean,default:null},...yn()},"VHover"),ui=gn()({name:"VHover",props:ri(),emits:{"update:modelValue":s=>!0},setup(s,e){let{slots:a}=e;const d=vn(s,"modelValue"),{runOpenDelay:i,runCloseDelay:o}=bn(s,r=>!s.disabled&&(d.value=r));return()=>{var r;return(r=a.default)==null?void 0:r.call(a,{isHovering:d.value,props:{onMouseenter:i,onMouseleave:o}})}}}),di={name:"StudentListCard",components:{UnsavedWarning:Qt},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,a)=>e.id-a.id).map(e=>e.name).join(` `))},deep:!0}},mounted(){this.loadStudents()},methods:{async loadStudents(){var s;this.error=null;try{if(this.loading=!0,!_("server.classNumber"))throw new Error("请先设置班号");try{const a=await pe.loadData("classworks-list-main");a.success!=!1&&Array.isArray(a)&&(this.modelValue.list=a.map((d,i)=>typeof d=="string"?{id:i+1,name:d}:{id:d.id||i+1,name:d.name||d.toString()}),this.modelValue.list.sort((d,i)=>d.id-i.id),this.modelValue.text=this.modelValue.list.map(d=>d.name).join(` `),this.lastSavedData=JSON.parse(JSON.stringify(this.modelValue.list)),this.unsavedChanges=!1)}catch(a){console.warn("Failed to load student list from dedicated key, falling back to config",a)}}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,a;try{if(!_("server.classNumber"))throw new Error("请先设置班号");const i=this.modelValue.list.slice().sort((r,p)=>r.id-p.id).map((r,p)=>({id:p+1,name:r.name})),o=await pe.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(d){console.error("保存学生列表失败:",d),(a=this.$message)==null||a.error("保存失败",d.message||"请重试")}},toggleAdvanced(){this.modelValue.advanced=!this.modelValue.advanced},handleTextInput(s){if(!this.modelValue.advanced)return;const e=s.split(` `).filter(o=>o.trim()),a=new Map(this.modelValue.list.map(o=>[o.name,o.id]));let d=Math.max(0,...this.modelValue.list.map(o=>o.id));const i=e.map(o=>(o=o.trim(),a.has(o)?{id:a.get(o),name:o}:{id:++d,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(a=>a.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 a=this.modelValue.list[s];this.modelValue.list.splice(s,1),this.modelValue.list.unshift(a),this.modelValue.list.forEach((d,i)=>d.id=i+1)}}else{const a=e==="up"?s-1:s+1;a>=0&&a{const d=dt(e.name,{toneType:"none"}),i=dt(a.name,{toneType:"none"});return d.localeCompare(i)});s.forEach((e,a)=>e.id=a+1),this.modelValue.list=s}}},ci={key:0},mi=["onClick"],fi={key:1,class:"pt-2"};function pi(s,e,a,d,i,o){const r=Qt;return c(),g(U,{class:ct({"unsaved-changes":i.unsavedChanges}),color:i.unsavedChanges?"warning-subtle":void 0,border:""},{default:n(()=>[t(Fe,null,{prepend:n(()=>[t(w,{class:"mr-2",icon:"mdi-account-group",size:"large"})]),append:n(()=>[t(r,{show:i.unsavedChanges,message:"有未保存的更改"},null,8,["show"]),t(h,{disabled:i.modelValue.list.length===0,class:"mr-2","prepend-icon":"mdi-sort-alphabetical-variant",variant:"text",onClick:o.sortStudentsByPinyin},{default:n(()=>[...e[4]||(e[4]=[l(" 按姓名首字母排序 ",-1)])]),_:1},8,["disabled","onClick"]),t(h,{color:i.modelValue.advanced?"primary":void 0,"prepend-icon":"mdi-code-braces",variant:"text",onClick:o.toggleAdvanced},{default:n(()=>[l(v(i.modelValue.advanced?"返回基础编辑":"高级编辑"),1)]),_:1},8,["color","onClick"])]),default:n(()=>[t(O,{class:"text-h6"},{default:n(()=>[...e[3]||(e[3]=[l("学生列表",-1)])]),_:1})]),_:1}),t(E,null,{default:n(()=>[i.loading?(c(),g(Ze,{key:0,class:"mb-4",color:"primary",indeterminate:""})):k("",!0),i.error?(c(),g(te,{key:1,class:"mb-4",closable:"",type:"error",variant:"tonal"},{default:n(()=>[l(v(i.error),1)]),_:1})):k("",!0),t(kn,null,{default:n(()=>[i.modelValue.advanced?(c(),A("div",fi,[t(Be,{modelValue:i.modelValue.text,"onUpdate:modelValue":[e[2]||(e[2]=p=>i.modelValue.text=p),o.handleTextInput],hint:"使用文本编辑模式批量编辑学生名单,保存时会自动去除空行",label:"批量编辑学生列表","persistent-hint":"",placeholder:"每行输入一个学生姓名",rows:"10",variant:"outlined"},null,8,["modelValue","onUpdate:modelValue"])])):(c(),A("div",ci,[t(ve,{class:"mb-6"},{default:n(()=>[t(H,{cols:"12",md:"4",sm:"6"},{default:n(()=>[t(R,{modelValue:i.newStudentName,"onUpdate:modelValue":e[0]||(e[0]=p=>i.newStudentName=p),class:"mb-4","hide-details":"",label:"添加学生",placeholder:"输入学生姓名后回车添加","prepend-inner-icon":"mdi-account-plus",variant:"outlined",onKeyup:_e(o.addStudent,["enter"])},{append:n(()=>[t(h,{disabled:!i.newStudentName.trim(),color:"primary",icon:"mdi-plus",variant:"text",onClick:o.addStudent},null,8,["disabled","onClick"])]),_:1},8,["modelValue","onKeyup"])]),_:1})]),_:1}),t(ve,null,{default:n(()=>[(c(!0),A(ie,null,he(i.modelValue.list,(p,u)=>(c(),g(H,{key:u,cols:"12",lg:"3",md:"4",sm:"6"},{default:n(()=>[t(ui,null,{default:n(({isHovering:y,props:I})=>[t(U,Le({elevation:a.isMobile?1:y?4:1,border:"",class:"student-card"},{ref_for:!0},I),{default:n(()=>[t(E,{class:"d-flex align-center pa-3"},{default:n(()=>[t(Dt,{"open-on-hover":!a.isMobile,location:"bottom"},{activator:n(({props:j})=>[t(h,Le({class:"mr-3 font-weight-medium",size:"small"},{ref_for:!0},j,{variant:"tonal"}),{default:n(()=>[l(v(u+1),1)]),_:2},1040)]),default:n(()=>[t(F,{density:"compact",nav:""},{default:n(()=>[t(D,{disabled:u===0,"prepend-icon":"mdi-arrow-up-bold",onClick:j=>o.moveStudent(u,"top")},{default:n(()=>[...e[5]||(e[5]=[l(" 置顶 ",-1)])]),_:1},8,["disabled","onClick"]),t(B),t(D,{disabled:u===0,"prepend-icon":"mdi-arrow-up",onClick:j=>o.moveStudent(u,"up")},{default:n(()=>[...e[6]||(e[6]=[l(" 上移 ",-1)])]),_:1},8,["disabled","onClick"]),t(D,{disabled:u===i.modelValue.list.length-1,"prepend-icon":"mdi-arrow-down",onClick:j=>o.moveStudent(u,"down")},{default:n(()=>[...e[7]||(e[7]=[l(" 下移 ",-1)])]),_:1},8,["disabled","onClick"])]),_:2},1024)]),_:2},1032,["open-on-hover"]),i.editState.index===u?(c(),g(R,{key:0,modelValue:i.editState.name,"onUpdate:modelValue":e[1]||(e[1]=j=>i.editState.name=j),autofocus:"",class:"flex-grow-1",density:"compact","hide-details":"",variant:"underlined",onBlur:o.saveEdit,onKeyup:_e(o.saveEdit,["enter"])},null,8,["modelValue","onBlur","onKeyup"])):(c(),A("span",{key:1,class:"text-body-1 flex-grow-1",onClick:j=>o.handleClick(u,p)},v(p.name),9,mi)),m("div",{class:ct([{"opacity-100":y||a.isMobile},"d-flex gap-1 action-buttons"])},[t(h,{color:"primary",icon:"mdi-pencil",size:"small",variant:"text",onClick:j=>o.startEdit(u,p)},null,8,["onClick"]),t(h,{color:"error",icon:"mdi-delete",size:"small",variant:"text",onClick:j=>o.removeStudent(u)},null,8,["onClick"])],2)]),_:2},1024)]),_:2},1040,["elevation"])]),_:2},1024)]),_:2},1024))),128))]),_:1})]))]),_:1}),t(ve,{class:"mt-6"},{default:n(()=>[t(H,{class:"d-flex gap-2",cols:"12"},{default:n(()=>[t(h,{disabled:i.loading,loading:i.loading,color:"primary","prepend-icon":"mdi-content-save",size:"large",onClick:o.saveStudents},{default:n(()=>[...e[8]||(e[8]=[l(" 保存名单 ",-1)])]),_:1},8,["disabled","loading","onClick"]),t(h,{disabled:i.loading,loading:i.loading,color:"error","prepend-icon":"mdi-refresh",size:"large",variant:"outlined",onClick:o.loadStudents},{default:n(()=>[...e[9]||(e[9]=[l(" 重载名单 ",-1)])]),_:1},8,["disabled","loading","onClick"])]),_:1})]),_:1})]),_:1})]),_:1},8,["class","color"])}const Jt=Y(di,[["render",pi],["__scopeId","data-v-7e220985"]]),hi={key:0,class:"d-flex justify-center align-center fill-height"},gi={key:1,class:"d-flex justify-center align-center fill-height"},wi={key:2},vi={class:"text-caption ml-4 text-medium-emphasis"},bi={key:0},yi={key:1},ki={class:"text-error"},Ht={__name:"CloudMigrationDialog",props:{modelValue:Boolean},emits:["update:modelValue"],setup(s,{emit:e}){const a=s,d=e,i=fe(!1),o=fe(!1),r=fe(!1),p=fe([]),u=fe([]),y=fe(!1),I=fe(null),j=fe(null),W=[{id:"student-list",label:"学生列表",description:"classworks-list-main",matcher:C=>C==="classworks-list-main"||C.startsWith("classworks-list-main")},{id:"homework-data",label:"作业数据",description:"classworks-data-*",matcher:C=>C.startsWith("classworks-data-")},{id:"lists",label:"列表",description:"classworks-list-*",matcher:C=>C.startsWith("classworks-list-")},{id:"other",label:"其他",description:"所有其他键",matcher:C=>!C.startsWith("classworks-data-")&&!C.startsWith("classworks-list-")}];mt(()=>a.modelValue,C=>{i.value=C,C&&Q()}),mt(i,C=>{d("update:modelValue",C)});const Q=async()=>{o.value=!0;try{const C=await pt.loadKeys({limit:1e3});p.value=C.keys||[],u.value=[]}catch(C){console.error(C)}finally{o.value=!1}},q=C=>p.value.filter(C.matcher),de=C=>q(C).length,ce=C=>{const b=q(C);return b.length===0?!1:b.filter(M=>u.value.includes(M)).length===b.length},re=C=>{const b=q(C);if(b.length===0)return!1;const V=b.filter(M=>u.value.includes(M)).length;return V>0&&V{const b=q(C);if(b.length===0)return;const V=ce(C),M=new Set(u.value);V?b.forEach(Z=>M.delete(Z)):b.forEach(Z=>M.add(Z)),u.value=Array.from(M)},be=async()=>{var C,b,V;r.value=!0,j.value=null,I.value=null;try{const M={};for(const z of u.value){const Se=await pt.loadData(z);if(Se){if(Se&&Se.success===!1&&Se.error){console.warn(`Skipping key ${z} due to load error`,Se.error);continue}M[z]=Se}}const Z=_("server.domain"),ue=_("server.kvToken");if(!Z||!ue)throw new Error("请先配置服务器地址和 Token");const G=Z.replace(/\/$/,""),ye=await An.post(`${G}/kv/_batchimport`,M,{headers:{Authorization:`Bearer ${ue}`,"Content-Type":"application/json"}});if(ye.data&&ye.data.code===200)I.value=ye.data.data,y.value=!0,i.value=!1;else throw new Error(((C=ye.data)==null?void 0:C.message)||"迁移失败")}catch(M){console.error(M),j.value=((V=(b=M.response)==null?void 0:b.data)==null?void 0:V.message)||M.message||"发生未知错误",y.value=!0}finally{r.value=!1}};return(C,b)=>(c(),A(ie,null,[t(ge,{modelValue:i.value,"onUpdate:modelValue":b[2]||(b[2]=V=>i.value=V),"max-width":"600",scrollable:""},{default:n(()=>[t(U,null,{default:n(()=>[t(O,null,{default:n(()=>[...b[5]||(b[5]=[l("迁移到云端",-1)])]),_:1}),t(E,{style:{height:"400px"}},{default:n(()=>[o.value?(c(),A("div",hi,[t(_t,{indeterminate:"",color:"primary"})])):p.value.length===0?(c(),A("div",gi," 没有找到本地数据 ")):(c(),A("div",wi,[t(F,{"select-strategy":"classic",class:"mb-4"},{default:n(()=>[t(xn,null,{default:n(()=>[...b[6]||(b[6]=[l("选择数据类型",-1)])]),_:1}),(c(),A(ie,null,he(W,V=>t(D,{key:V.id,onClick:M=>ne(V)},{prepend:n(()=>[t(ht,{"model-value":ce(V),indeterminate:re(V),onClick:Ae(M=>ne(V),["stop"])},null,8,["model-value","indeterminate","onClick"])]),default:n(()=>[t(L,null,{default:n(()=>[l(v(V.label),1)]),_:2},1024),t(se,null,{default:n(()=>[l(v(V.description)+" ("+v(de(V))+" 项)",1)]),_:2},1024)]),_:2},1032,["onClick"])),64))]),_:1}),t(B,{class:"mb-4"}),t(nt,null,{default:n(()=>[t(st,{title:"详细数据列表"},{default:n(()=>[t(it,null,{default:n(()=>[t(F,{"select-strategy":"classic",density:"compact"},{default:n(()=>[(c(!0),A(ie,null,he(p.value,V=>(c(),g(D,{key:V,value:V},{prepend:n(()=>[t(ht,{modelValue:u.value,"onUpdate:modelValue":b[0]||(b[0]=M=>u.value=M),value:V},null,8,["modelValue","value"])]),default:n(()=>[t(L,null,{default:n(()=>[l(v(V),1)]),_:2},1024)]),_:2},1032,["value"]))),128))]),_:1})]),_:1})]),_:1})]),_:1})]))]),_:1}),t(B),t(ae,null,{default:n(()=>[m("div",vi," 已选择 "+v(u.value.length)+" 项 ",1),t($),t(h,{variant:"text",onClick:b[1]||(b[1]=V=>i.value=!1)},{default:n(()=>[...b[7]||(b[7]=[l("取消",-1)])]),_:1}),t(h,{color:"primary",onClick:be,loading:r.value,disabled:u.value.length===0},{default:n(()=>[...b[8]||(b[8]=[l(" 开始迁移 ",-1)])]),_:1},8,["loading","disabled"])]),_:1})]),_:1})]),_:1},8,["modelValue"]),t(ge,{modelValue:y.value,"onUpdate:modelValue":b[4]||(b[4]=V=>y.value=V),"max-width":"500"},{default:n(()=>[t(U,null,{default:n(()=>[t(O,null,{default:n(()=>[...b[9]||(b[9]=[l("迁移结果",-1)])]),_:1}),t(E,null,{default:n(()=>[I.value?(c(),A("div",bi,[m("p",null,"总计: "+v(I.value.summary.total),1),m("p",null,"成功: "+v(I.value.summary.successful),1),m("p",null,"失败: "+v(I.value.summary.failed),1)])):j.value?(c(),A("div",yi,[m("p",ki,v(j.value),1)])):k("",!0)]),_:1}),t(ae,null,{default:n(()=>[t($),t(h,{color:"primary",onClick:b[3]||(b[3]=V=>y.value=!1)},{default:n(()=>[...b[10]||(b[10]=[l("关闭",-1)])]),_:1})]),_:1})]),_:1})]),_:1},8,["modelValue"])],64))}},xi={name:"KvDatabaseCard",components:{SettingsCard:X,CloudMigrationDialog:Ht},data(){return{loading:!1,loadingData:!1,savingData:!1,deletingData:!1,kvData:[],searchQuery:"",viewDialog:!1,editDialog:!1,deleteDialog:!1,createDialog:!1,cloudUrlDialog:!1,showMigrationDialog:!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 _("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 pe.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(a=>({key:a,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 pe.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),a=this.newKey.trim(),d=await pe.saveData(a,e);if(d&&!d.error)this.kvData.push({key:a,value:e,loaded:!0}),this.$message.success("数据创建成功"),this.closeCreateDialog();else throw new Error(((s=d.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),a=await pe.saveData(this.editingItem.key,e);if(a&&!a.error){const d=this.kvData.findIndex(i=>i.key===this.editingItem.key);d!==-1&&(this.kvData[d].value=e,this.kvData[d].loaded=!0),this.$message.success("数据保存成功"),this.closeEditDialog()}else throw new Error(((s=a.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 In("ClassworksDB",2)).transaction("kv","readwrite").objectStore("kv").delete(this.itemToDelete.key):await pe.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 pe.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)}}}},Si={class:"text-primary"},Ci={class:"mt-2"},_i={key:0,class:"mb-2"},Vi={key:1,class:"mb-2"};function Di(s,e,a,d,i,o){const r=Ht,p=X;return c(),g(p,{loading:i.loading,icon:"mdi-database-edit",title:"KV数据库管理"},{default:n(()=>[t(F,null,{default:n(()=>[t(D,null,{prepend:n(()=>[t(w,{color:o.connectionColor,icon:o.connectionIcon,class:"mr-3"},null,8,["color","icon"])]),append:n(()=>[t(h,{loading:i.loading,variant:"tonal",onClick:o.refreshConnection},{default:n(()=>[...e[20]||(e[20]=[l(" 刷新 ",-1)])]),_:1},8,["loading","onClick"])]),default:n(()=>[t(L,null,{default:n(()=>[...e[19]||(e[19]=[l("数据库状态",-1)])]),_:1}),t(se,null,{default:n(()=>[l(v(o.connectionStatus),1)]),_:1})]),_:1}),t(B,{class:"my-2"}),t(D,null,{prepend:n(()=>[t(w,{class:"mr-3",icon:"mdi-format-list-bulleted"})]),append:n(()=>[t(ft,{variant:"tonal"},{default:n(()=>[t(h,{loading:i.loadingData,onClick:o.loadKvData},{default:n(()=>[...e[22]||(e[22]=[l(" 加载数据 ",-1)])]),_:1},8,["loading","onClick"]),t(h,{disabled:!o.isKvProvider,onClick:o.createNewItem},{default:n(()=>[t(w,{class:"mr-1",icon:"mdi-plus"}),e[23]||(e[23]=l(" 新建 ",-1))]),_:1},8,["disabled","onClick"]),t(h,{onClick:e[0]||(e[0]=u=>i.showMigrationDialog=!0)},{default:n(()=>[t(w,{class:"mr-1",icon:"mdi-cloud-upload"}),e[24]||(e[24]=l(" 从本地迁移 ",-1))]),_:1})]),_:1})]),default:n(()=>[t(L,null,{default:n(()=>[...e[21]||(e[21]=[l("数据条目",-1)])]),_:1}),t(se,null,{default:n(()=>[l("共 "+v(i.kvData.length)+" 条记录",1)]),_:1})]),_:1})]),_:1}),i.kvData.length>0?(c(),g(U,{key:0,class:"mt-4",variant:"outlined"},{default:n(()=>[t(O,{class:"d-flex align-center"},{default:n(()=>[t(w,{class:"mr-2",icon:"mdi-table"}),e[25]||(e[25]=l(" KV数据列表 ",-1)),t($),t(R,{modelValue:i.searchQuery,"onUpdate:modelValue":e[1]||(e[1]=u=>i.searchQuery=u),clearable:"",density:"compact","hide-details":"",label:"搜索键名","prepend-inner-icon":"mdi-magnify",style:{"max-width":"300px"},variant:"outlined"},null,8,["modelValue"])]),_:1}),t(Tt,{headers:i.tableHeaders,items:o.filteredKvData,"items-per-page":10,loading:i.loadingData,class:"elevation-0","item-value":"key"},{"item.key":n(({item:u})=>[m("code",Si,v(u.key),1)]),"item.actions":n(({item:u})=>[t(ft,{density:"compact",variant:"text"},{default:n(()=>[t(h,{icon:"mdi-eye",size:"small",title:"查看",onClick:y=>o.viewItem(u)},null,8,["onClick"]),t(h,{icon:"mdi-pencil",size:"small",title:"编辑",onClick:y=>o.editItem(u)},null,8,["onClick"]),t(h,{color:"primary",icon:"mdi-cloud-download",size:"small",title:"获取云端地址",onClick:y=>o.getCloudUrl(u)},null,8,["onClick"]),t(h,{color:"error",icon:"mdi-delete",size:"small",title:"删除",onClick:y=>o.confirmDelete(u)},null,8,["onClick"])]),_:2},1024)]),_:2},1032,["headers","items","loading"])]),_:1})):k("",!0),t(ge,{modelValue:i.viewDialog,"onUpdate:modelValue":e[5]||(e[5]=u=>i.viewDialog=u),"max-width":"800px"},{default:n(()=>[t(U,null,{default:n(()=>[t(O,{class:"d-flex align-center"},{default:n(()=>[t(w,{class:"mr-2",icon:"mdi-eye"}),e[26]||(e[26]=l(" 查看数据 ",-1)),t($),t(h,{icon:"mdi-close",variant:"text",onClick:e[2]||(e[2]=u=>i.viewDialog=!1)})]),_:1}),i.selectedItem?(c(),g(Pe,{key:0},{default:n(()=>[e[27]||(e[27]=l(" 键名: ",-1)),m("code",null,v(i.selectedItem.key),1)]),_:1})):k("",!0),t(E,null,{default:n(()=>[i.selectedItem?(c(),g(Be,{key:0,"model-value":o.formatJsonData(i.selectedItem.value),class:"font-monospace",label:"数据内容",readonly:"",rows:"15",variant:"outlined"},null,8,["model-value"])):k("",!0)]),_:1}),t(ae,null,{default:n(()=>[t($),t(h,{variant:"tonal",onClick:e[3]||(e[3]=u=>{var y;return o.copyToClipboard((y=i.selectedItem)==null?void 0:y.value)})},{default:n(()=>[t(w,{class:"mr-1",icon:"mdi-content-copy"}),e[28]||(e[28]=l(" 复制数据 ",-1))]),_:1}),t(h,{variant:"text",onClick:e[4]||(e[4]=u=>i.viewDialog=!1)},{default:n(()=>[...e[29]||(e[29]=[l(" 关闭 ",-1)])]),_:1})]),_:1})]),_:1})]),_:1},8,["modelValue"]),t(ge,{modelValue:i.editDialog,"onUpdate:modelValue":e[7]||(e[7]=u=>i.editDialog=u),"max-width":"800px"},{default:n(()=>[t(U,null,{default:n(()=>[t(O,{class:"d-flex align-center"},{default:n(()=>[t(w,{class:"mr-2",icon:"mdi-pencil"}),e[30]||(e[30]=l(" 编辑数据 ",-1)),t($),t(h,{icon:"mdi-close",variant:"text",onClick:o.closeEditDialog},null,8,["onClick"])]),_:1}),i.editingItem?(c(),g(Pe,{key:0},{default:n(()=>[e[31]||(e[31]=l(" 键名: ",-1)),m("code",null,v(i.editingItem.key),1)]),_:1})):k("",!0),t(E,null,{default:n(()=>[t(Be,{modelValue:i.editingData,"onUpdate:modelValue":e[6]||(e[6]=u=>i.editingData=u),error:!o.isValidJson,"error-messages":o.isValidJson?[]:["请输入有效的JSON格式"],class:"font-monospace",label:"数据内容 (JSON格式)",rows:"15",variant:"outlined"},null,8,["modelValue","error","error-messages"])]),_:1}),t(ae,null,{default:n(()=>[t($),t(h,{variant:"text",onClick:o.closeEditDialog},{default:n(()=>[...e[32]||(e[32]=[l(" 取消 ",-1)])]),_:1},8,["onClick"]),t(h,{disabled:!o.isValidJson,loading:i.savingData,color:"primary",variant:"tonal",onClick:o.saveEditedData},{default:n(()=>[...e[33]||(e[33]=[l(" 保存 ",-1)])]),_:1},8,["disabled","loading","onClick"])]),_:1})]),_:1})]),_:1},8,["modelValue"]),t(ge,{modelValue:i.createDialog,"onUpdate:modelValue":e[10]||(e[10]=u=>i.createDialog=u),"max-width":"800px"},{default:n(()=>[t(U,null,{default:n(()=>[t(O,{class:"d-flex align-center"},{default:n(()=>[t(w,{class:"mr-2",icon:"mdi-plus"}),e[34]||(e[34]=l(" 新建数据 ",-1)),t($),t(h,{icon:"mdi-close",variant:"text",onClick:o.closeCreateDialog},null,8,["onClick"])]),_:1}),t(E,null,{default:n(()=>[t(R,{modelValue:i.newKey,"onUpdate:modelValue":e[8]||(e[8]=u=>i.newKey=u),error:!o.isValidKey,"error-messages":o.isValidKey?[]:["键名不能为空且不能与现有键重复"],class:"mb-4",label:"键名",placeholder:"请输入键名,如:my-config",variant:"outlined"},null,8,["modelValue","error","error-messages"]),t(Be,{modelValue:i.newData,"onUpdate:modelValue":e[9]||(e[9]=u=>i.newData=u),error:!o.isValidNewJson,"error-messages":o.isValidNewJson?[]:["请输入有效的JSON格式"],class:"font-monospace",label:"数据内容 (JSON格式)",placeholder:'请输入JSON数据,如:{"name": "value"}',rows:"15",variant:"outlined"},null,8,["modelValue","error","error-messages"])]),_:1}),t(ae,null,{default:n(()=>[t($),t(h,{variant:"text",onClick:o.closeCreateDialog},{default:n(()=>[...e[35]||(e[35]=[l(" 取消 ",-1)])]),_:1},8,["onClick"]),t(h,{disabled:!o.isValidKey||!o.isValidNewJson,loading:i.savingData,color:"primary",variant:"tonal",onClick:o.saveNewData},{default:n(()=>[...e[36]||(e[36]=[l(" 创建 ",-1)])]),_:1},8,["disabled","loading","onClick"])]),_:1})]),_:1})]),_:1},8,["modelValue"]),t(ge,{modelValue:i.cloudUrlDialog,"onUpdate:modelValue":e[15]||(e[15]=u=>i.cloudUrlDialog=u),"max-width":"800px"},{default:n(()=>[t(U,null,{default:n(()=>[t(O,{class:"d-flex align-center"},{default:n(()=>[t(w,{class:"mr-2",icon:"mdi-cloud-download"}),e[37]||(e[37]=l(" 获取云端访问地址 ",-1)),t($),t(h,{icon:"mdi-close",variant:"text",onClick:e[11]||(e[11]=u=>i.cloudUrlDialog=!1)})]),_:1}),i.selectedCloudItem?(c(),g(Pe,{key:0},{default:n(()=>[e[38]||(e[38]=l(" 键名: ",-1)),m("code",null,v(i.selectedCloudItem.key),1)]),_:1})):k("",!0),t(E,null,{default:n(()=>[i.cloudUrlError?(c(),g(te,{key:0,class:"mb-4",type:"error",variant:"tonal"},{default:n(()=>[l(v(i.cloudUrlError),1)]),_:1})):k("",!0),i.cloudUrlResult&&i.cloudUrlResult.success?(c(),g(te,{key:1,class:"mb-4",type:"success",variant:"tonal"},{default:n(()=>[t(Ie,null,{default:n(()=>[...e[39]||(e[39]=[l("云端地址获取成功",-1)])]),_:1}),m("div",Ci,[i.cloudUrlResult.migrated?(c(),A("div",_i,[t(w,{class:"mr-1",color:"success",icon:"mdi-database-arrow-up"}),e[40]||(e[40]=l(" 数据已从本地迁移到云端 ",-1))])):k("",!0),i.cloudUrlResult.configured?(c(),A("div",Vi,[t(w,{class:"mr-1",color:"info",icon:"mdi-cog"}),e[41]||(e[41]=l(" 云端配置已自动设置 ",-1))])):k("",!0)])]),_:1})):k("",!0),i.cloudUrlResult&&i.cloudUrlResult.url?(c(),g(R,{key:2,"model-value":i.cloudUrlResult.url,"append-inner-icon":"mdi-content-copy",class:"font-monospace",label:"云端访问地址",readonly:"",variant:"outlined","onClick:appendInner":o.copyCloudUrl},null,8,["model-value","onClick:appendInner"])):k("",!0),i.cloudUrlResult&&i.cloudUrlResult.url?(c(),g(nt,{key:3,class:"mt-4"},{default:n(()=>[t(st,null,{default:n(()=>[t(It,null,{default:n(()=>[t(w,{class:"mr-2",icon:"mdi-cog"}),e[42]||(e[42]=l(" 高级选项 ",-1))]),_:1}),t(it,null,{default:n(()=>[t(Ve,{modelValue:i.cloudUrlOptions.migrateFromLocal,"onUpdate:modelValue":e[12]||(e[12]=u=>i.cloudUrlOptions.migrateFromLocal=u),density:"compact",label:"从本地迁移数据到云端"},null,8,["modelValue"]),t(Ve,{modelValue:i.cloudUrlOptions.autoConfigureCloud,"onUpdate:modelValue":e[13]||(e[13]=u=>i.cloudUrlOptions.autoConfigureCloud=u),density:"compact",label:"自动配置云端默认设置"},null,8,["modelValue"]),t(h,{loading:i.gettingCloudUrl,class:"mt-2",color:"primary",variant:"tonal",onClick:o.refreshCloudUrl},{default:n(()=>[t(w,{class:"mr-1",icon:"mdi-refresh"}),e[43]||(e[43]=l(" 重新获取 ",-1))]),_:1},8,["loading","onClick"])]),_:1})]),_:1})]),_:1})):k("",!0)]),_:1}),t(ae,null,{default:n(()=>[t($),t(h,{variant:"text",onClick:e[14]||(e[14]=u=>i.cloudUrlDialog=!1)},{default:n(()=>[...e[44]||(e[44]=[l(" 关闭 ",-1)])]),_:1}),i.cloudUrlResult&&i.cloudUrlResult.url?(c(),g(h,{key:0,color:"primary",variant:"tonal",onClick:o.openCloudUrl},{default:n(()=>[t(w,{class:"mr-1",icon:"mdi-open-in-new"}),e[45]||(e[45]=l(" 在新窗口打开 ",-1))]),_:1},8,["onClick"])):k("",!0)]),_:1})]),_:1})]),_:1},8,["modelValue"]),t(ge,{modelValue:i.deleteDialog,"onUpdate:modelValue":e[17]||(e[17]=u=>i.deleteDialog=u),"max-width":"400px"},{default:n(()=>[t(U,null,{default:n(()=>[t(O,{class:"d-flex align-center text-error"},{default:n(()=>[t(w,{class:"mr-2",icon:"mdi-alert"}),e[46]||(e[46]=l(" 确认删除 ",-1))]),_:1}),t(E,null,{default:n(()=>{var u;return[e[48]||(e[48]=l(" 确定要删除键名为 ",-1)),m("code",null,v((u=i.itemToDelete)==null?void 0:u.key),1),e[49]||(e[49]=l(" 的数据吗? ",-1)),e[50]||(e[50]=m("br",null,null,-1)),e[51]||(e[51]=m("br",null,null,-1)),t(te,{class:"mt-2",type:"warning",variant:"tonal"},{default:n(()=>[...e[47]||(e[47]=[l(" 此操作不可撤销,请谨慎操作! ",-1)])]),_:1})]}),_:1}),t(ae,null,{default:n(()=>[t($),t(h,{variant:"text",onClick:e[16]||(e[16]=u=>i.deleteDialog=!1)},{default:n(()=>[...e[52]||(e[52]=[l(" 取消 ",-1)])]),_:1}),t(h,{loading:i.deletingData,color:"error",variant:"tonal",onClick:o.deleteItem},{default:n(()=>[...e[53]||(e[53]=[l(" 删除 ",-1)])]),_:1},8,["loading","onClick"])]),_:1})]),_:1})]),_:1},8,["modelValue"]),t(r,{modelValue:i.showMigrationDialog,"onUpdate:modelValue":e[18]||(e[18]=u=>i.showMigrationDialog=u)},null,8,["modelValue"])]),_:1},8,["loading"])}const Gt=Y(xi,[["render",Di],["__scopeId","data-v-67879974"]]),Ai={name:"DataProviderSettingsCard",components:{SettingsCard:X},data(){return{loading:!1,serverchecktime:{},confirmDialog:!1,confirmTitle:"",confirmMessage:"",confirmAction:null,machineId:null,migrateLoading:!1}},computed:{currentProvider(){return _("server.provider")},isKvProvider(){return this.currentProvider==="kv-local"||this.currentProvider==="kv-server"||this.currentProvider==="classworkscloud"}},async created(){this.machineId=_("device.uuid")},methods:{async checkServerConnection(){this.loading=!0,this.serverchecktime=new Date;try{const s=_("server.domain"),e=_("server.siteKey"),a={Accept:"application/json"};if(e&&(a["x-site-key"]=e),(await qe.get(`${s}/check`,{method:"GET",headers:a})).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:{}},a=await new Promise((u,y)=>{const I=window.indexedDB.open(s);I.onerror=()=>y(I.error),I.onsuccess=()=>u(I.result)}),d=Array.from(a.objectStoreNames);for(const u of d){const I=a.transaction(u,"readonly").objectStore(u),j=await new Promise((W,Q)=>{const q=I.getAll();q.onerror=()=>Q(q.error),q.onsuccess=()=>W(q.result)});e.indexedDB[u]=j}const i=new Blob([JSON.stringify(e,null,2)],{type:"application/json"}),o=URL.createObjectURL(i),r=document.createElement("a"),p=new Date().toISOString().split("T")[0];r.href=o,r.download=`homework-indexeddb-${p}.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 Ii(s,e,a,d,i,o){const r=X;return c(),g(r,{icon:"mdi-database-cog",title:"数据源设置"},{default:n(()=>[t(F,null,{default:n(()=>[o.currentProvider==="kv-server"||o.currentProvider==="classworkscloud"?(c(),g(D,{key:0},{prepend:n(()=>[t(w,{class:"mr-3",icon:"mdi-lan-connect"})]),append:n(()=>[t(h,{loading:i.loading,variant:"tonal",onClick:o.checkServerConnection},{default:n(()=>[...e[3]||(e[3]=[l(" 测试连接 ",-1)])]),_:1},8,["loading","onClick"])]),default:n(()=>[t(L,null,{default:n(()=>[...e[2]||(e[2]=[l("检查服务器连接",-1)])]),_:1})]),_:1})):k("",!0),o.currentProvider==="kv-local"?(c(),A(ie,{key:1},[t(D,null,{prepend:n(()=>[t(w,{class:"mr-3",icon:"mdi-database"})]),append:n(()=>[t(h,{color:"error",variant:"tonal",onClick:o.confirmClearIndexedDB},{default:n(()=>[...e[6]||(e[6]=[l(" 清除 ",-1)])]),_:1},8,["onClick"])]),default:n(()=>[t(L,null,{default:n(()=>[...e[4]||(e[4]=[l("清除数据库缓存",-1)])]),_:1}),t(se,null,{default:n(()=>[...e[5]||(e[5]=[l("这将清除所有本地数据库中的数据 ",-1)])]),_:1})]),_:1}),t(D,null,{prepend:n(()=>[t(w,{class:"mr-3",icon:"mdi-database-export"})]),append:n(()=>[t(h,{variant:"tonal",onClick:o.exportData},{default:n(()=>[...e[8]||(e[8]=[l(" 导出",-1)])]),_:1},8,["onClick"])]),default:n(()=>[t(L,null,{default:n(()=>[...e[7]||(e[7]=[l("导出数据库",-1)])]),_:1})]),_:1})],64)):k("",!0),t(D,null,{prepend:n(()=>[t(w,{class:"mr-3",icon:"mdi-lan-connect"})]),append:n(()=>[t(h,{to:"/cachemanagement",variant:"tonal"},{default:n(()=>[...e[10]||(e[10]=[l(" 查看",-1)])]),_:1})]),default:n(()=>[t(L,null,{default:n(()=>[...e[9]||(e[9]=[l("查看本地缓存",-1)])]),_:1})]),_:1})]),_:1}),t(ge,{modelValue:i.confirmDialog,"onUpdate:modelValue":e[1]||(e[1]=p=>i.confirmDialog=p),"max-width":"400"},{default:n(()=>[t(U,null,{default:n(()=>[t(O,null,{default:n(()=>[l(v(i.confirmTitle),1)]),_:1}),t(E,null,{default:n(()=>[l(v(i.confirmMessage),1)]),_:1}),t(ae,null,{default:n(()=>[t($),t(h,{color:"grey",variant:"text",onClick:e[0]||(e[0]=p=>i.confirmDialog=!1)},{default:n(()=>[...e[11]||(e[11]=[l("取消 ",-1)])]),_:1}),t(h,{color:"error",variant:"tonal",onClick:o.handleConfirm},{default:n(()=>[...e[12]||(e[12]=[l("确认 ",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1})]),_:1},8,["modelValue"])]),_:1})}const Yt=Y(Ai,[["render",Ii]]),Ti={name:"CloudNamespaceInfoCard",props:{visible:{type:Boolean,default:!0}},data(){return{namespaceInfo:{},loading:!1,hasNamespaceInfo:!1,showReinitDialog:!1,defaultAuthServer:_("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 Tn.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()},getBindAccountUrl(){var e,a;const s=(a=(e=this.namespaceInfo)==null?void 0:e.device)==null?void 0:a.uuid;return s?`${this.defaultAuthServer}?uuid=${encodeURIComponent(s)}&tolinktoaccount=true`:this.defaultAuthServer},confirmReinitialize(){xe("server.kvToken",""),xe("device.uuid",""),this.showReinitDialog=!1,this.$router.push("/")}}},Ei={key:0,class:"mb-4"},Ui={key:1,class:"d-flex align-center mb-4"},ji={class:"d-flex flex-column gap-1"},Ni={class:"d-flex align-center"},Mi={class:"d-flex align-center"},Pi={key:0,class:"d-flex align-center"},Bi={class:"text-truncate"},Li={class:"d-flex align-center"},zi={key:1,class:"d-flex align-center"};function Oi(s,e,a,d,i,o){return c(),g(U,{disabled:!i.hasNamespaceInfo,loading:i.loading,class:"my-4"},{loader:n(()=>[i.loading?(c(),g(Ze,{key:0,color:"primary",indeterminate:""})):k("",!0)]),default:n(()=>[t(O,null,{default:n(()=>[t(w,{class:"me-2"},{default:n(()=>[...e[3]||(e[3]=[l(" mdi-cloud-check ",-1)])]),_:1}),e[4]||(e[4]=l(" 设备信息 ",-1))]),_:1}),i.hasNamespaceInfo?(c(),g(E,{key:0},{default:n(()=>[i.namespaceInfo.hasAccount===!1?(c(),A("div",Ei,[t(te,{border:"",type:"warning",variant:"tonal"},{default:n(()=>[t(Ie,null,{default:n(()=>[...e[5]||(e[5]=[l("设备未绑定账号",-1)])]),_:1}),e[7]||(e[7]=m("div",null,"当前设备尚未绑定账号,部分功能可能受限。请前往绑定账号以获得完整体验。",-1)),t(h,{href:o.getBindAccountUrl(),"append-icon":"mdi-open-in-new",class:"mt-3",target:"_blank",variant:"outlined"},{default:n(()=>[...e[6]||(e[6]=[l(" 前往绑定账号 ",-1)])]),_:1},8,["href"])]),_:1})])):k("",!0),i.namespaceInfo.hasAccount&&i.namespaceInfo.account?(c(),A("div",Ui,[t(U,{"prepend-avatar":i.namespaceInfo.account.avatarUrl,subtitle:"此设备由贵校管理 管理员账号 ID: "+i.namespaceInfo.account.id,title:i.namespaceInfo.account.name||"未命名用户",border:"",class:"w-100",hover:"",variant:"tonal"},{default:n(()=>[t(E,null,{default:n(()=>[...e[8]||(e[8]=[l(" 此设备由贵校或贵单位管理,该管理员系此空间所有者,如有疑问请咨询他,对于恶意绑定、滥用行为请反馈。 ",-1)])]),_:1})]),_:1},8,["prepend-avatar","subtitle","title"])])):k("",!0),i.namespaceInfo.device?(c(),g(U,{key:2,border:"",class:"mb-4",hover:"",variant:"tonal"},{default:n(()=>[t(O,{class:"pb-1"},{default:n(()=>[...e[9]||(e[9]=[l(" 设备信息 ",-1)])]),_:1}),t(E,null,{default:n(()=>[m("div",ji,[m("div",Ni,[t(w,{class:"me-2",size:"small"},{default:n(()=>[...e[10]||(e[10]=[l(" mdi-tag ",-1)])]),_:1}),e[11]||(e[11]=m("span",{class:"font-weight-medium me-2"},"设备名称:",-1)),m("span",null,v(i.namespaceInfo.device.name||"未命名设备"),1)]),m("div",Mi,[t(w,{class:"me-2",size:"small"},{default:n(()=>[...e[12]||(e[12]=[l(" mdi-identifier ",-1)])]),_:1}),e[13]||(e[13]=m("span",{class:"font-weight-medium me-2"},"设备 ID:",-1)),m("span",null,v(i.namespaceInfo.device.id),1)]),i.namespaceInfo.hasAccount===!1&&i.namespaceInfo.device.uuid?(c(),A("div",Pi,[t(w,{class:"me-2",size:"small"},{default:n(()=>[...e[14]||(e[14]=[l(" mdi-uuid ",-1)])]),_:1}),e[15]||(e[15]=m("span",{class:"font-weight-medium me-2"},"UUID:",-1)),m("span",Bi,v(i.namespaceInfo.device.uuid),1)])):k("",!0),m("div",Li,[t(w,{class:"me-2",size:"small"},{default:n(()=>[...e[16]||(e[16]=[l(" mdi-calendar ",-1)])]),_:1}),e[17]||(e[17]=m("span",{class:"font-weight-medium me-2"},"创建时间:",-1)),m("span",null,v(o.formatDate(i.namespaceInfo.device.createdAt)),1)]),i.namespaceInfo.device.updatedAt?(c(),A("div",zi,[t(w,{class:"me-2",size:"small"},{default:n(()=>[...e[18]||(e[18]=[l(" mdi-calendar-clock ",-1)])]),_:1}),e[19]||(e[19]=m("span",{class:"font-weight-medium me-2"},"更新时间:",-1)),m("span",null,v(o.formatDate(i.namespaceInfo.device.updatedAt)),1)])):k("",!0)])]),_:1})]),_:1})):k("",!0),t(U,{border:"",hover:"",subtitle:"文档形键值数据库",title:"Classworks KV"},{default:n(()=>[t(E,null,{default:n(()=>[...e[20]||(e[20]=[l(" Classworks KV 是厚浪云推出的文档形键值数据库,其是一个开放的云应用平台,为各种应用提供存储服务。此设备正在使用其服务,如果您希望管理设备信息,请前往 Classworks KV 的网站,如果您在服务推出前就在使用 Classworks,您的数据已被自动迁移。 ",-1),m("br",null,null,-1),m("br",null,null,-1),l(" Classworks KV 的全域管理员是 ",-1),m("a",{href:"https://wuyuan.dev",target:"_blank"}," 孙悟元 ",-1)])]),_:1}),t(ae,null,{default:n(()=>[t(h,{href:i.defaultAuthServer,"append-icon":"mdi-open-in-new",class:"text-none",target:"_blank"},{default:n(()=>[...e[21]||(e[21]=[l(" 前往 Classworks KV ",-1)])]),_:1},8,["href"])]),_:1})]),_:1})]),_:1})):(c(),g(E,{key:1},{default:n(()=>[t(te,{type:"info",variant:"tonal"},{default:n(()=>[t(Ie,null,{default:n(()=>[...e[22]||(e[22]=[l("未获取到设备信息",-1)])]),_:1}),e[23]||(e[23]=m("p",null,"您尚未完成云端存储授权或连接失败,请点击下方按钮进行初始化。",-1))]),_:1})]),_:1})),t(ae,null,{default:n(()=>[t($),t(h,{loading:i.loading,color:"primary",variant:"outlined",onClick:o.reloadInfo},{default:n(()=>[...e[24]||(e[24]=[l(" 刷新设备信息 ",-1)])]),_:1},8,["loading","onClick"]),t(h,{color:"error",variant:"outlined",onClick:e[0]||(e[0]=r=>i.showReinitDialog=!0)},{default:n(()=>[...e[25]||(e[25]=[l(" 重新初始化云端存储 ",-1)])]),_:1})]),_:1}),t(ge,{modelValue:i.showReinitDialog,"onUpdate:modelValue":e[2]||(e[2]=r=>i.showReinitDialog=r),"max-width":"500"},{default:n(()=>[t(U,null,{default:n(()=>[t(O,null,{default:n(()=>[...e[26]||(e[26]=[l("确认重新初始化",-1)])]),_:1}),t(E,null,{default:n(()=>[t(te,{class:"mb-3",type:"warning",variant:"tonal"},{default:n(()=>[t(Ie,null,{default:n(()=>[...e[27]||(e[27]=[l("警告",-1)])]),_:1}),e[28]||(e[28]=l(" 此操作将清除当前的云端存储配置(包括 Token),您需要重新进行授权。 ",-1))]),_:1}),e[29]||(e[29]=m("p",null,"您确定要重新初始化云端存储吗?",-1))]),_:1}),t(ae,null,{default:n(()=>[t($),t(h,{variant:"text",onClick:e[1]||(e[1]=r=>i.showReinitDialog=!1)},{default:n(()=>[...e[30]||(e[30]=[l(" 取消 ",-1)])]),_:1}),t(h,{color:"error",onClick:o.confirmReinitialize},{default:n(()=>[...e[31]||(e[31]=[l(" 确认 ",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1})]),_:1},8,["modelValue"])]),_:1},8,["disabled","loading"])}const Wt=Y(Ti,[["render",Oi]]),Ri={name:"ServerSettingsCard",components:{SettingsCard:X,CloudNamespaceInfoCard:Wt},props:{loading:Boolean},data(){return{unwatch:null,serverSettings:{provider:_("server.provider"),domain:_("server.domain"),classNumber:_("server.classNumber"),kvToken:_("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=et(()=>{this.loadAllSettings(),this.$forceUpdate&&this.$forceUpdate()})},beforeUnmount(){this.unwatch&&this.unwatch()},methods:{loadAllSettings(){this.serverSettings={provider:_("server.provider"),domain:_("server.domain"),classNumber:_("server.classNumber"),kvToken:_("server.kvToken")}},saveAllSettings(){Object.entries(this.serverSettings).forEach(([s,e])=>{const a=`server.${s}`,d=_(a);e!==d&&(xe(a,e)?console.log(`设置已更新: ${a} = ${e}`):(console.error(`设置失败: ${a}`),this.serverSettings[s]=d))})}}},Ki={key:0},Fi={key:2},Qi={key:3},Ji={key:4};function Hi(s,e,a,d,i,o){const r=Wt,p=X;return c(),g(p,{loading:a.loading,icon:"mdi-database",title:"数据源设置"},{default:n(()=>[t(At,null,{default:n(()=>[t(Ke,{modelValue:i.serverSettings.provider,"onUpdate:modelValue":e[0]||(e[0]=u=>i.serverSettings.provider=u),items:[{title:"Classworks云端存储",value:"classworkscloud"},{title:"KV本地存储",value:"kv-local"},{title:"KV远程服务器",value:"kv-server"}],class:"mb-3",density:"comfortable","item-title":"title","item-value":"value",label:"数据提供者","prepend-icon":"mdi-database",variant:"outlined"},null,8,["modelValue"]),o.isKvProvider?(c(),g(te,{key:0,class:"my-2",type:"info",variant:"tonal"},{default:n(()=>[t(Ie,null,{default:n(()=>[...e[5]||(e[5]=[l("KV 存储系统",-1)])]),_:1}),e[7]||(e[7]=m("p",null,"KV存储系统使用本机唯一标识符(UUID)来区分不同设备的数据。",-1)),o.currentProvider==="kv-server"?(c(),A("p",Ki,[...e[6]||(e[6]=[l(" 服务器端点格式: ",-1),m("code",null,"http(s)://服务器域名/",-1),m("br",null,null,-1),l(" 在服务器域名处仅填写基础URL,不需要任何路径。 ",-1)])])):k("",!0)]),_:1})):k("",!0),o.isClassworksCloud?(c(),g(te,{key:1,class:"my-2",color:"success",type:"info",variant:"tonal"},{default:n(()=>[t(Ie,null,{default:n(()=>[...e[8]||(e[8]=[l("Classworks云端存储",-1)])]),_:1}),e[9]||(e[9]=m("p",null,"Classworks云端存储是官方提供的存储解决方案,自动配置了最优的访问设置。",-1)),e[10]||(e[10]=m("p",null,"使用此选项时,服务器域名和网站令牌将自动配置,无需手动设置。",-1))]),_:1})):k("",!0),t(B,{class:"my-2"}),o.isClassworksCloud?(c(),A("div",Fi,[t(R,{modelValue:i.serverSettings.kvToken,"onUpdate:modelValue":e[1]||(e[1]=u=>i.serverSettings.kvToken=u),class:"mb-2",density:"comfortable",hint:"令牌用于云端存储授权",label:"KV 授权令牌","persistent-hint":"","prepend-icon":"mdi-shield-key",variant:"outlined"},null,8,["modelValue"]),t(r,{visible:o.isClassworksCloud,class:"mt-4"},null,8,["visible"])])):o.currentProvider==="kv-server"?(c(),A("div",Qi,[t(R,{modelValue:i.serverSettings.domain,"onUpdate:modelValue":e[2]||(e[2]=u=>i.serverSettings.domain=u),class:"mb-2",density:"comfortable",hint:"例如: https://example.com (不需要路径)",label:"服务器域名","persistent-hint":"","prepend-icon":"mdi-web",variant:"outlined"},null,8,["modelValue"]),t(R,{modelValue:i.serverSettings.kvToken,"onUpdate:modelValue":e[3]||(e[3]=u=>i.serverSettings.kvToken=u),class:"mb-2",density:"comfortable",hint:"令牌用于服务器验证",label:"KV 授权令牌","persistent-hint":"","prepend-icon":"mdi-shield-key",variant:"outlined"},null,8,["modelValue"])])):o.currentProvider==="kv-local"?(c(),A("div",Ji,[t(R,{modelValue:i.serverSettings.classNumber,"onUpdate:modelValue":e[4]||(e[4]=u=>i.serverSettings.classNumber=u),class:"mb-2",density:"comfortable",hint:"例如: 高三八班",label:"班级编号","persistent-hint":"","prepend-icon":"mdi-account-group",variant:"outlined"},null,8,["modelValue"])])):k("",!0)]),_:1})]),_:1},8,["loading"])}const qt=Y(Ri,[["render",Hi]]),Gi="classworks",Yi="module",Wi="0.0.0",qi={dev:"vite --host",build:"vite build",preview:"vite preview",lint:"eslint . --fix",prebuild:"node scripts/generate-sound-list.js"},Zi={"@fingerprintjs/fingerprintjs":"^5.0.1","@mdi/font":"7.4.47","@microsoft/clarity":"^1.0.2","@vueuse/core":"^14.1.0",axios:"^1.13.2",idb:"^8.0.3","js-base64":"^3.7.8","js-yaml":"^4.1.1","lucide-vue-next":"^0.555.0",marked:"^17.0.1","pinyin-pro":"^3.27.0","ratelimit-header-parser":"^0.1.0","roboto-fontface":"*","socket.io-client":"^4.8.1","typewriter-effect":"^2.22.0",uuid:"^13.0.0",vue:"^3.5.25","vue-sonner":"^2.0.9",vuetify:"^3.11.0"},Xi={"@eslint/js":"^9.39.1","@vite-pwa/assets-generator":"^1.0.2","@vitejs/plugin-vue":"^6.0.2",eslint:"^9.39.1","eslint-plugin-import":"^2.32.0","eslint-plugin-n":"^17.23.1","eslint-plugin-node":"^11.1.0","eslint-plugin-promise":"^7.2.1","eslint-plugin-vue":"^10.6.2",pinia:"^3.0.4",sass:"1.94.2","sass-embedded":"^1.93.3","unplugin-auto-import":"^20.3.0","unplugin-fonts":"^1.4.0","unplugin-vue-components":"^30.0.0","unplugin-vue-router":"^0.18.0",vite:"^5.4.11","vite-plugin-pwa":"^1.2.0","vite-plugin-vue-devtools":"^7.6.8","vite-plugin-vue-layouts":"^0.11.0","vite-plugin-vuetify":"^2.1.2","vue-router":"^4.6.3"},Ne={name:Gi,private:!0,type:Yi,version:Wi,scripts:qi,dependencies:Zi,devDependencies:Xi},$i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAAa9SURBVHic7dY9jlxVFIXRY8SsCEDyMCAjgRFBYokARoGQQII5EDIJYhNgyb9td9euqvfu3WuN4CTf1nn2958/vRyg0mdHHwAcxwBAMQMAxQwAFDMAUMwAQDEDAMUMABQzAFDMAEAxAwDFDAAUMwBQzABAMQMAxQwAFDMAUMwAQDEDAMUMABQzAFDMAEAxAwDFDAAUMwBQzABAMQMAxQwAFDMAUMwAQDEDAMUMABQzAFDMAEAxAwDFDAAUMwBQzABAMQMAxQwAFDMAUMwAQDEDAMUMABQzAFDMAEAxAwDFPj/6AI7z2+9/zW9//HX0Gct6/uUX8/yrL44+I+IDKCX+zA7xzxiASuLP7BL/jAGoI/7MTvHPGIAq4s/sFv+MAagh/syO8c8YgAriz+wa/4wB2J74MzvHP2MAtib+zO7xzxiAbYk/0xD/jAHYkvgzLfHPGIDtiD/TFP+MAdiK+DNt8c8YgG2IP9MY/4wB2IL4M63xzxiA5Yk/0xz/jAFYmvgz7fHPGIBliT8j/v8ZgAWJPyP+1wzAYsSfEf/bDMBCxJ8R//sMwCLEnxH/hxmABYg/I/6HGYCTE39G/B9nAE5M/Bnxf5oBOCnxZ8T/OAbghMSfEf/jGYCTEX9G/E9jAE5E/BnxP50BOAnxZ8R/GQNwAuLPiP9yBuBg4s+IP2MADiT+jPhzBuAg4s+I/zoMwAHEnxH/9RiAOxN/RvzXZQDuSPwZ8V+fAbgT8WfEfxsG4A7EnxH/7RiAGxN/Rvy3ZQBuSPwZ8d+eAbgR8WfEfx8G4AbEnxH//RiAKxN/Rvz3ZQCuSPwZ8d+fAbgS8WfEfwwDcAXiz4j/OAYgJP6M+I9lAALiz4j/eAbgQuLPiP8cDMAFxJ8R/3kYgCcSf0b852IAnkD8GfGfjwF4JPFnxH9OBuARxJ8R/3kZgE8Qf0b852YAPkL8GfGfnwF4gPgz4l+DAfgA8WfEvw4D8A7xZ8S/FgPwBvFnxL8eA/CK+DPiX5MBGPGnxL+u+gEQf0b8a6seAPFnxL++2gEQf0b8e6gcAPFnxL+PugEQf0b8e6kaAPFnxL+fmgEQf0b8e6oYAPFnxL+v7QdA/Bnx723rARB/Rvz723YAxJ8Rf4ctB0D8GfH32G4AxJ8Rf5etBkD8GfH32WYAxJ8Rf6ctBkD8GfH3Wn4AxJ8Rf7dn//7z68ujj+AYP774ZX548fPRZyzr+2+/me++/froMyLLfwBcRvyZHeKfMQCVxJ/ZJf4ZA1BH/Jmd4p8xAFXEn9kt/hkDUEP8mR3jnzEAFcSf2TX+GQOwPfFndo5/xgBsTfyZ3eOfMQDbEn+mIf4ZA7Al8Wda4p8xANsRf6Yp/hkDsBXxZ9rinzEA2xB/pjH+GQOwBfFnWuOfMQDLE3+mOf4ZA7A08Wfa458xAMsSf0b8/zMACxJ/RvyvGYDFiD8j/rcZgIWIPyP+9xmARYg/I/4PMwALEH9G/A8zACcn/oz4P84AnJj4M+L/NANwUuLPiP9xDMAJiT8j/sczACcj/oz4n8YAnIj4M+J/OgNwEuLPiP8yBuAExJ8R/+UMwMHEnxF/xgAcSPwZ8ecMwEHEnxH/dRiAA4g/I/7rMQB3Jv6M+K/LANyR+DPivz4DcCfiz4j/NgzAHYg/I/7bMQA3Jv6M+G/LANyQ+DPivz0DcCPiz4j/PgzADYg/I/77MQBXJv6M+O/LAFyR+DPivz8DcCXiz4j/GAbgCsSfEf9xDEBI/BnxH8sABMSfEf/xDMCFxJ8R/zkYgAuIPyP+8zAATyT+jPjPxQA8gfgz4j8fA/BI4s+I/5wMwCOIPyP+8zIAnyD+jPjPzQB8hPgz4j8/A/AA8WfEvwYD8AHiz4h/HQbgHeLPiH8tBuAN4s+Ifz0G4BXxZ8S/JgMw4k+Jf131AyD+jPjXVj0A4s+If321AyD+jPj3UDkA4s+Ifx91AyD+jPj3UjUA4s+Ifz81AyD+jPj3VDEA4s+If1/bD4D4M+Lf29YDIP6M+Pe37QCIPyP+DlsOgPgz4u+x3QCIPyP+LlsNgPgz4u+zzQCIPyP+TlsMgPgz4u+1/ACIPyP+bs/+/efXl0cfARxj+Q8AuJwBgGIGAIoZAChmAKCYAYBiBgCKGQAoZgCgmAGAYgYAihkAKGYAoJgBgGIGAIoZAChmAKCYAYBiBgCKGQAoZgCgmAGAYgYAihkAKGYAoJgBgGIGAIoZAChmAKCYAYBiBgCKGQAoZgCgmAGAYgYAihkAKGYAoJgBgGIGAIoZAChmAKCYAYBiBgCKGQAoZgCgmAGAYgYAiv0Hs2PMhrt8KlMAAAAASUVORK5CYII=",eo={name:"AboutCard",setup(){const s=fe([]),e=fe(!1),a=fe(!1),d=fe(""),i=fe(!1),o=fe(!1),r="964979747",p="https://qm.qq.com/q/T6qImKJjGi",u=Sn(),y=()=>{try{const b={...Ne.dependencies||{},...Ne.devDependencies||{}},V=Object.entries(b).map(([M,Z])=>({name:M,version:Z.replace(/[\^~]/g,""),description:I(M)}));s.value=V}catch(b){console.error("加载依赖信息失败:",b),s.value=[]}},I=b=>({vue:"渐进式 JavaScript 框架",vuetify:"材料设计组件框架",axios:"Promise 基础的 HTTP 客户端",pinia:"Vue 状态管理库","vue-router":"Vue.js 官方路由管理器","@vitejs/plugin-vue":"Vite 的 Vue 插件"})[b]||"",j=()=>{u.push("/debug")},W=async()=>{i.value=!0;try{const b=await _n();d.value=b||""}catch(b){console.error("获取访客ID失败",b)}finally{i.value=!1}},Q=()=>W(),q=async()=>{a.value=!0,d.value||await W()},de=async()=>{try{await navigator.clipboard.writeText(re.value),o.value=!0,setTimeout(()=>o.value=!1,1800)}catch(b){console.error("复制失败",b)}},ce=je(()=>{var G,ye;const b=navigator||{},V=typeof Intl<"u"&&Intl.DateTimeFormat?Intl.DateTimeFormat().resolvedOptions():{},M=V&&V.timeZone?V.timeZone:"",Z=((ye=(G=u.currentRoute)==null?void 0:G.value)==null?void 0:ye.fullPath)||location.pathname;return[`App 版本: v${Ne==null?void 0:Ne.version}`,`URL: ${location.href}`,`路由: ${Z}`,`UserAgent: ${b.userAgent||""}`,`语言: ${b.language||""}`,`时区: ${M}`,`平台: ${b.platform||""}`,`在线: ${String(b.onLine)}`,`屏幕: ${(screen==null?void 0:screen.width)||"-"}x${(screen==null?void 0:screen.height)||"-"}`,`视口: ${window.innerWidth||"-"}x${window.innerHeight||"-"}`].join(` `)}),re=je(()=>`调试ID: ${d.value||"获取失败"} 浏览器/环境信息: ${ce.value}`),ne=je(()=>["问题描述:","1. 期望行为:","2. 实际行为:","3. 复现步骤:","",re.value].join(` `)),be=je(()=>{const b="https://github.com/ZeroCatDev/Classworks/issues/new",V=encodeURIComponent("问题报告"),M=encodeURIComponent(ne.value);return`${b}?title=${V}&body=${M}`}),C=je(()=>{const b=encodeURIComponent("Classworks 问题报告"),V=encodeURIComponent(ne.value);return`mailto:sun@wuyuan.dev?subject=${b}&body=${V}`});return Cn(()=>{y()}),{Dependencies:s,showDeps:e,showReportDialog:a,debugIdInput:d,visitorLoading:i,copyOk:o,qqGroupNumber:r,qqGroupLink:p,goToDebug:j,reloadVisitorId:Q,openReportDialog:q,copyEnvInfo:de,envBoxText:re,envInfo:ce,reportBody:ne,githubIssueUrl:be,mailtoLink:C}}},to={class:"d-flex flex-column align-start"},no={class:"d-flex gap-2 flex-wrap mb-6"},so={class:"text-body-2",style:{"white-space":"pre-wrap",margin:"0"}},io={class:"d-flex gap-2 flex-wrap mb-4"},oo={class:"text-caption text-medium-emphasis"};function lo(s,e,a,d,i,o){return c(),g(U,{border:"",hover:"",rounded:"xl"},{default:n(()=>[t(Fe,null,{prepend:n(()=>[t(w,{class:"mr-2",icon:"mdi-information",size:"large"})]),default:n(()=>[t(O,{class:"text-h6"},{default:n(()=>[...e[6]||(e[6]=[l("关于",-1)])]),_:1})]),_:1}),t(E,null,{default:n(()=>[t(ve,null,{default:n(()=>[t(H,{class:"mx-auto",cols:"12",md:"8"},{default:n(()=>[m("div",to,[t(Xe,{class:"mb-4",size:"120"},{default:n(()=>[t(St,{alt:"Classworks",src:$i})]),_:1}),e[36]||(e[36]=m("h2",{class:"text-h5 mb-2"},"Classworks",-1)),e[37]||(e[37]=m("p",{class:"text-body-1 mb-4"},"适用于班级大屏的作业板小工具",-1)),m("div",no,[t(h,{color:"red","prepend-icon":"mdi-bug",variant:"tonal",onClick:d.openReportDialog},{default:n(()=>[...e[7]||(e[7]=[l(" 报告问题 ",-1)])]),_:1},8,["onClick"]),t(h,{color:"primary",href:"https://qm.qq.com/q/qNBX4ZZVeg","prepend-icon":"mdi-qqchat",target:"_blank",variant:"tonal"},{default:n(()=>[...e[8]||(e[8]=[l(" QQ 群 ",-1)])]),_:1}),t(h,{href:"https://github.com/ClassworksDev/Classworks","prepend-icon":"mdi-github",target:"_blank",variant:"text"},{default:n(()=>[...e[9]||(e[9]=[l(" 前端 ",-1)])]),_:1}),t(h,{href:"https://github.com/ClassworksDev/ClassworksServer","prepend-icon":"mdi-github",target:"_blank",variant:"text"},{default:n(()=>[...e[10]||(e[10]=[l(" 后端 ",-1)])]),_:1})]),t(B,{class:"mb-4 w-100"}),e[38]||(e[38]=m("h3",{class:"text-h6 mb-2"},"备注与致谢",-1)),t(F,{class:"mb-4 bg-transparent"},{default:n(()=>[t(D,{"append-icon":"mdi-link",href:"https://github.com/EnderWolf006/HomeworkBoard",target:"_blank"},{default:n(()=>[t(L,null,{default:n(()=>[...e[11]||(e[11]=[l(" 本项目受到 HomeworkBoard 的启发而开发 ",-1)])]),_:1}),t(se,null,{default:n(()=>[...e[12]||(e[12]=[l(" 感谢 EnderWolf006 (@EnderWolf) fhzit(@Hellofhz) KeyFac 等人的贡献 ",-1)])]),_:1})]),_:1}),t(D,{"append-icon":"mdi-link",href:"https://hlyun.org",target:"_blank"},{default:n(()=>[t(L,null,{default:n(()=>[...e[13]||(e[13]=[l(" Classworks 由",-1),m("strong",null,"厚浪云",-1),l("提供 ",-1)])]),_:1}),t(se,null,{default:n(()=>[...e[14]||(e[14]=[l(" 长江后浪推前浪 浮事新人换旧人 ",-1)])]),_:1})]),_:1}),t(D,{"append-icon":"mdi-link",href:"https://zerocat.houlangs.com",target:"_blank"},{default:n(()=>[t(L,null,{default:n(()=>[...e[15]||(e[15]=[l(" 感谢 ZeroCat 社区的开发者们 ",-1)])]),_:1}),t(se,null,{default:n(()=>[...e[16]||(e[16]=[l(" 新一代,开源,编程社区 ",-1)])]),_:1})]),_:1}),t(B,{class:"ma-1"}),t(D,{"append-icon":"mdi-link",href:"https://github.com/HUSX100/IslandCaller",target:"_blank"},{default:n(()=>[t(L,null,{default:n(()=>[...e[17]||(e[17]=[l(" 本项目与 IslandCaller 没有从属关系 ",-1)])]),_:1}),t(se,null,{default:n(()=>[...e[18]||(e[18]=[l(" IslandCaller 是由 HUSX100 开发的基于 ClassIsland 提醒服务的轻量级点名器 ",-1)])]),_:1})]),_:1}),t(D,{"append-icon":"mdi-link",href:"https://classisland.tech",target:"_blank"},{default:n(()=>[t(L,null,{default:n(()=>[...e[19]||(e[19]=[l(" 本项目与 ClassIsland 没有从属关系 ",-1)])]),_:1}),t(se,null,{default:n(()=>[...e[20]||(e[20]=[l(" ClassIsland 是由 HelloWRC 开发的适用于班级大屏的课表信息显示工具 ",-1)])]),_:1})]),_:1})]),_:1}),t(h,{class:"mb-4","prepend-icon":"mdi-package-variant",variant:"text",onClick:e[0]||(e[0]=r=>d.showDeps=!0)},{default:n(()=>[...e[21]||(e[21]=[l(" 查看使用的第三方库 ",-1)])]),_:1}),t(ge,{modelValue:d.showDeps,"onUpdate:modelValue":e[2]||(e[2]=r=>d.showDeps=r),fullscreen:"",transition:"dialog-bottom-transition"},{default:n(()=>[t(U,null,{default:n(()=>[t(gt,null,{default:n(()=>[t(h,{icon:"mdi-close",onClick:e[1]||(e[1]=r=>d.showDeps=!1)}),t(wt,null,{default:n(()=>[...e[22]||(e[22]=[l("使用的第三方库",-1)])]),_:1}),t($)]),_:1}),t(E,null,{default:n(()=>[t(F,null,{default:n(()=>[(c(!0),A(ie,null,he(d.Dependencies,r=>(c(),g(D,{key:r.name,href:"https://www.npmjs.com/package/"+r.name,"append-icon":"mdi-link",target:"_blank"},{default:n(()=>[t(L,null,{default:n(()=>[l(v(r.name),1)]),_:2},1024),t(se,null,{default:n(()=>[l(" v"+v(r.version),1)]),_:2},1024)]),_:2},1032,["href"]))),128))]),_:1})]),_:1})]),_:1})]),_:1},8,["modelValue"]),t(ge,{modelValue:d.showReportDialog,"onUpdate:modelValue":e[5]||(e[5]=r=>d.showReportDialog=r),"max-width":"640"},{default:n(()=>[t(U,null,{default:n(()=>[t(gt,{density:"compact"},{default:n(()=>[t(h,{icon:"mdi-close",onClick:e[3]||(e[3]=r=>d.showReportDialog=!1)}),t(wt,null,{default:n(()=>[...e[23]||(e[23]=[l("报告问题",-1)])]),_:1}),t($)]),_:1}),t(E,null,{default:n(()=>[e[33]||(e[33]=m("p",{class:"mb-4"}," 调试ID与下方的浏览器环境信息将帮助我们快速定位问题,请在反馈中一并附上。 ",-1)),t(Nn,{class:"mb-3 pa-3 bg-grey-lighten-4 rounded",style:{"max-height":"260px",overflow:"auto"}},{default:n(()=>[m("pre",so,v(d.envBoxText),1)]),_:1}),m("div",io,[t(h,{size:"small",variant:"text","prepend-icon":"mdi-refresh",onClick:d.reloadVisitorId,loading:d.visitorLoading},{default:n(()=>[...e[24]||(e[24]=[l("刷新",-1)])]),_:1},8,["onClick","loading"]),t(h,{size:"small",variant:"text","prepend-icon":"mdi-content-copy",onClick:d.copyEnvInfo},{default:n(()=>[...e[25]||(e[25]=[l("复制信息",-1)])]),_:1},8,["onClick"]),t(h,{size:"small",variant:"text","prepend-icon":"mdi-open-in-new",onClick:d.goToDebug},{default:n(()=>[...e[26]||(e[26]=[l("查看 /debug 页面",-1)])]),_:1},8,["onClick"])]),d.copyOk?(c(),g(te,{key:0,type:"success",density:"compact",class:"mb-4"},{default:n(()=>[...e[27]||(e[27]=[l("已复制到剪贴板",-1)])]),_:1})):k("",!0),e[34]||(e[34]=m("h4",{class:"text-subtitle-1 mb-2"},"反馈渠道",-1)),t(F,{lines:"one",class:"bg-transparent"},{default:n(()=>[t(D,{href:d.qqGroupLink,target:"_blank","prepend-icon":"mdi-qqchat"},{default:n(()=>[t(L,null,{default:n(()=>[l("QQ群 ("+v(d.qqGroupNumber)+")",1)]),_:1}),t(se,null,{default:n(()=>[...e[28]||(e[28]=[l("964979747",-1)])]),_:1})]),_:1},8,["href"]),t(D,{href:d.githubIssueUrl,target:"_blank","prepend-icon":"mdi-github"},{default:n(()=>[t(L,null,{default:n(()=>[...e[29]||(e[29]=[l("GitHub Issue",-1)])]),_:1}),t(se,null,{default:n(()=>[...e[30]||(e[30]=[l("ZeroCatDev/Classworks",-1)])]),_:1})]),_:1},8,["href"]),t(D,{href:d.mailtoLink,target:"_blank","prepend-icon":"mdi-email"},{default:n(()=>[t(L,null,{default:n(()=>[...e[31]||(e[31]=[l("邮件",-1)])]),_:1}),t(se,null,{default:n(()=>[...e[32]||(e[32]=[l("sun@wuyuan.dev",-1)])]),_:1})]),_:1},8,["href"])]),_:1})]),_:1}),t(ae,null,{default:n(()=>[t($),t(h,{variant:"text",onClick:e[4]||(e[4]=r=>d.showReportDialog=!1)},{default:n(()=>[...e[35]||(e[35]=[l("关闭",-1)])]),_:1})]),_:1})]),_:1})]),_:1},8,["modelValue"]),m("p",oo," Copyright © "+v(new Date().getFullYear())+" Sunwuyuan ",1)])]),_:1})]),_:1})]),_:1})]),_:1})}const Zt=Y(eo,[["render",lo]]),ao={name:"Settings",components:{ServerSettingsCard:qt,EditSettingsCard:Rt,RefreshSettingsCard:Kt,DisplaySettingsCard:Ot,MessageLog:xt,SettingsCard:X,StudentListCard:Jt,AboutCard:Zt,DataProviderSettingsCard:Yt,ThemeSettingsCard:zt,EchoChamberCard:Ut,SettingsExplorer:jt,SettingsLinkGenerator:Ft,RandomPickerCard:Pt,HomeworkTemplateCard:Nt,SubjectManagementCard:Mt,KvDatabaseCard:Gt,HitokotoSettings:Bt,NotificationSoundSettings:Lt},setup(){const{mobile:s}=Dn();return{isMobile:s}},data(){return _("server.provider"),{settings:{server:{domain:_("server.domain"),classNumber:_("server.classNumber"),provider:_("server.provider")},refresh:{auto:_("refresh.auto"),interval:_("refresh.interval")},font:{size:_("font.size")},edit:{autoSave:_("edit.autoSave"),blockNonTodayAutoSave:_("edit.blockNonTodayAutoSave"),confirmNonTodaySave:_("edit.confirmNonTodaySave"),refreshBeforeEdit:_("edit.refreshBeforeEdit")},display:{emptySubjectDisplay:_("display.emptySubjectDisplay"),dynamicSort:_("display.dynamicSort"),showRandomButton:_("display.showRandomButton"),showFullscreenButton:_("display.showFullscreenButton")},developer:{enabled:_("developer.enabled"),showDebugConfig:_("developer.showDebugConfig")},message:{showSidebar:_("message.showSidebar"),maxActiveMessages:_("message.maxActiveMessages"),timeout:_("message.timeout"),saveHistory:_("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-bell-ring",value:"notification"},{title:"一言",icon:"mdi-comment-quote",value:"hitokoto"},{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=et(()=>{this.loadAllSettings()}),this.drawer=!this.isMobile},beforeUnmount(){this.unwatchSettings&&this.unwatchSettings()},methods:{openClassworksKV(){window.open(_("server.authDomain"),"_blank")},loadAllSettings(){Object.keys(this.settings).forEach(s=>{Object.keys(this.settings[s]).forEach(e=>{this.settings[s][e]=_(`${s}.${e}`)})})},handleSettingsChange(s){this.settingsChangeTimeout&&clearTimeout(this.settingsChangeTimeout),this.settingsChangeTimeout=setTimeout(()=>{Object.entries(s).forEach(([e,a])=>{Object.entries(a).forEach(([d,i])=>{const o=`${e}.${d}`,r=_(o);i!==r&&(xe(o,i)?this.showMessage("设置已更新",`${o} 已保存`):(this.showError("保存失败",`${o} 设置失败`),this.settings[e][d]=r))})})},100)},showMessage(s,e="",a="success"){this.$message[a](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 a=e==="up"?s-1:s+1;a>=0&&a=0&&s0){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(){Ct("font.size"),this.settings.font.size=_("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 a=this.settings.font.size;s==="up"&&a<100?this.settings.font.size=a+2:s==="down"&&a>16&&(this.settings.font.size=a-2),this.handleSettingsChange(this.settings)},onSettingsSaved(){this.showMessage("设置已更新","您的设置已成功保存")},onSettingUpdate(s,e){this.showMessage("设置已更新",`${s} 已保存为 ${e}`)}}},ro={class:"settings-page"},uo={class:"mt-4"};function co(s,e,a,d,i,o){const r=Zt,p=qt,u=Yt,y=Gt,I=Jt,j=Ft,W=Kt,Q=Rt,q=Ot,de=zt,ce=Lt,re=Bt,ne=Pt,be=Mt,C=Nt,b=X,V=Vn("developer-settings-card"),M=jt,Z=Ut,ue=xt;return c(),A("div",ro,[t(jn,{elevation:"1"},{prepend:n(()=>[t(h,{icon:"mdi-arrow-left",variant:"text",onClick:e[0]||(e[0]=G=>s.$router.push("/"))}),t(h,{icon:"mdi-menu",variant:"text",onClick:e[1]||(e[1]=G=>i.drawer=!i.drawer)})]),default:n(()=>[t(Un,{class:"text-h6"},{default:n(()=>[...e[5]||(e[5]=[l("设置",-1)])]),_:1})]),_:1}),t(tt,{fluid:""},{default:n(()=>[t(dn,{modelValue:i.drawer,"onUpdate:modelValue":e[2]||(e[2]=G=>i.drawer=G),permanent:!d.isMobile,temporary:d.isMobile},{default:n(()=>[t(F,null,{default:n(()=>[(c(!0),A(ie,null,he(i.settingsTabs,G=>(c(),g(D,{key:G.value,active:i.settingsTab===G.value,color:i.settingsTab===G.value?"primary":"default","prepend-icon":G.icon,class:"rounded-e-xl",onClick:ye=>i.settingsTab=G.value},{default:n(()=>[t(L,null,{default:n(()=>[l(v(G.title),1)]),_:2},1024)]),_:2},1032,["active","color","prepend-icon","onClick"]))),128))]),_:1})]),_:1},8,["modelValue","permanent","temporary"]),t(En,{modelValue:i.settingsTab,"onUpdate:modelValue":e[4]||(e[4]=G=>i.settingsTab=G),direction:"vertical",style:{width:"100%"}},{default:n(()=>[t(me,{value:"index"},{default:n(()=>[t(U,{border:"",class:"service-card gradient-right clickable mb-4",color:"primary",elevation:"8",hover:"",rounded:"xl",variant:"tonal",onClick:o.openClassworksKV},{default:n(()=>[t(Fe,null,{default:n(()=>[...e[6]||(e[6]=[m("div",{class:"card-title"},[m("div",null,[m("div",{class:"text-h6"},"在寻找 Classworks KV ?"),m("div",{class:"text-caption text-medium-emphasis"}," 文档形键值数据库 ")])],-1)])]),_:1}),t(E,null,{default:n(()=>[m("div",uo,[t(h,{"append-icon":"mdi-arrow-right",class:"text-none",rounded:"xl",variant:"text",onClick:o.openClassworksKV},{default:n(()=>[...e[7]||(e[7]=[l(" 打开 Classworks KV ",-1)])]),_:1},8,["onClick"])])]),_:1})]),_:1},8,["onClick"]),t(U,{border:"",class:"rounded-xl mb-4",subtitle:"设置",title:"Classworks"},{default:n(()=>[t(E,null,{default:n(()=>[t(te,{class:"rounded-xl",color:"error",icon:"mdi-alert-circle",variant:"tonal"},{default:n(()=>[...e[8]||(e[8]=[l("Classworks 是开源免费的软件,官方没有提供任何形式的付费支持服务,源代码仓库地址在 ",-1),m("a",{href:"https://github.com/ZeroCatDev/Classworks",target:"_blank"},"https://github.com/ZeroCatDev/Classworks",-1),l("。如果您通过有偿协助等付费方式取得本应用,在遇到问题时请在与卖家约定的服务框架下,优先向卖家求助。如果卖家没有提供您预期的服务,请退款或通过其它形式积极维护您的合法权益。 ",-1)])]),_:1}),t(te,{class:"mt-4 rounded-xl",color:"info",icon:"mdi-information",variant:"tonal"},{default:n(()=>[...e[9]||(e[9]=[l("请不要使用浏览器清除缓存功能,否则会导致配置丢失。 ",-1),m("del",null,"恶意的操作可能导致您受到贵校教师的处理 ",-1)])]),_:1}),t(te,{class:"mt-4 rounded-xl",color:"warning",icon:"mdi-information",variant:"tonal"},{default:n(()=>[e[11]||(e[11]=m("p",null," 请不要使用包括但不限于360极速浏览器、360安全浏览器、夸克浏览器、QQ浏览器等浏览器使用 Classworks ,这些浏览器过时且存在严重的一致性问题。在Windows上,使用新版 Microsoft Edge 浏览器是最推荐的选择。 ",-1)),e[12]||(e[12]=m("p",{style:{color:"#666"}}," 上述浏览器商标为其所属公司所有,Classworks™ 与上述浏览器所属公司无竞争关系。 ",-1)),e[13]||(e[13]=m("br",null,null,-1)),t(h,{"append-icon":"mdi-open-in-new",class:"text-none rounded-xl",color:"warning",href:"https://www.microsoft.com/zh-cn/windows/microsoft-edge",target:"_blank",variant:"tonal"},{default:n(()=>[...e[10]||(e[10]=[l("下载 Microsoft Edge(微软边缘浏览器) ",-1)])]),_:1})]),_:1})]),_:1})]),_:1}),t(r)]),_:1}),t(me,{value:"server"},{default:n(()=>[t(p,{loading:i.loading.server,border:"",onSaved:o.onSettingsSaved},null,8,["loading","onSaved"]),t(u,{border:"",class:"mt-4"}),t(y,{border:"",class:"mt-4"})]),_:1}),t(me,{value:"student"},{default:n(()=>[t(I,{"is-mobile":d.isMobile,border:""},null,8,["is-mobile"])]),_:1}),t(me,{value:"share"},{default:n(()=>[t(j,{border:"",class:"mt-4"})]),_:1}),t(me,{value:"refresh"},{default:n(()=>[t(W,{loading:i.loading.refresh,border:"",onSaved:o.onSettingsSaved},null,8,["loading","onSaved"])]),_:1}),t(me,{value:"edit"},{default:n(()=>[t(Q,{loading:i.loading.edit,border:"",onSaved:o.onSettingsSaved},null,8,["loading","onSaved"])]),_:1}),t(me,{value:"display"},{default:n(()=>[t(q,{loading:i.loading.display,border:"",onSaved:o.onSettingsSaved},null,8,["loading","onSaved"])]),_:1}),t(me,{value:"theme"},{default:n(()=>[t(de,{loading:i.loading.theme,border:"",onSaved:o.onSettingsSaved},null,8,["loading","onSaved"])]),_:1}),t(me,{value:"notification"},{default:n(()=>[t(ce,{border:""})]),_:1}),t(me,{value:"hitokoto"},{default:n(()=>[t(re,{border:""})]),_:1}),t(me,{value:"randomPicker"},{default:n(()=>[t(ne,{"is-mobile":d.isMobile,border:""},null,8,["is-mobile"])]),_:1}),t(me,{value:"subject"},{default:n(()=>[t(be,{border:""}),e[14]||(e[14]=m("br",null,null,-1)),t(C,{border:""})]),_:1}),t(me,{value:"developer"},{default:n(()=>[t(b,{border:"",icon:"mdi-developer-board",title:"开发者选项"},{default:n(()=>[t(F,null,{default:n(()=>[t(D,null,{prepend:n(()=>[t(w,{class:"mr-3",icon:"mdi-code-tags"})]),append:n(()=>[t(Vt,{modelValue:i.settings.developer.enabled,"onUpdate:modelValue":e[3]||(e[3]=G=>i.settings.developer.enabled=G),density:"comfortable","hide-details":"",onChange:o.handleDeveloperChange},null,8,["modelValue","onChange"])]),default:n(()=>[t(L,null,{default:n(()=>[...e[15]||(e[15]=[l("启用开发者选项",-1)])]),_:1}),t(se,null,{default:n(()=>[...e[16]||(e[16]=[l("启用后可以查看和修改开发者设置 ",-1)])]),_:1})]),_:1})]),_:1})]),_:1}),t(V,{loading:i.loading.developer,border:"",onSaved:o.onSettingsSaved},null,8,["loading","onSaved"]),i.settings.developer.enabled?(c(),g(U,{key:0,border:"",class:"mt-4 rounded-lg"},{default:n(()=>[t(O,{class:"d-flex align-center"},{default:n(()=>[t(w,{class:"mr-2",icon:"mdi-cog-outline"}),e[17]||(e[17]=l(" 所有设置 ",-1))]),_:1}),t(Pe,null,{default:n(()=>[...e[18]||(e[18]=[l(" 浏览和修改所有可用设置",-1)])]),_:1}),t(E,null,{default:n(()=>[t(M,{onUpdate:o.onSettingUpdate},null,8,["onUpdate"])]),_:1})]),_:1})):k("",!0),i.settings.developer.enabled?(c(),g(H,{key:1,cols:"12"})):k("",!0)]),_:1}),t(me,{value:"about"},{default:n(()=>[t(r),t(Z,{border:"",class:"mt-4"})]),_:1})]),_:1},8,["modelValue"])]),_:1}),t(ue,{ref:"messageLog"},null,512)])}const To=Y(ao,[["render",co]]);export{To as default};