diff --git a/frontend/dist/assets/index.80d29e01.js b/frontend/dist/assets/index.0581bd6d.js similarity index 96% rename from frontend/dist/assets/index.80d29e01.js rename to frontend/dist/assets/index.0581bd6d.js index ba8f528..e1586a3 100644 --- a/frontend/dist/assets/index.80d29e01.js +++ b/frontend/dist/assets/index.0581bd6d.js @@ -18,4 +18,4 @@ * vue-router v4.5.1 * (c) 2025 Eduardo San Martin Morote * @license MIT - */const Ot=typeof document<"u";function Xo(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function Uc(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&Xo(e.default)}const z=Object.assign;function as(e,t){const n={};for(const s in t){const r=t[s];n[s]=Ne(r)?r.map(e):e(r)}return n}const nn=()=>{},Ne=Array.isArray,Zo=/#/g,Kc=/&/g,Wc=/\//g,qc=/=/g,zc=/\?/g,ei=/\+/g,Gc=/%5B/g,Jc=/%5D/g,ti=/%5E/g,Yc=/%60/g,ni=/%7B/g,Qc=/%7C/g,si=/%7D/g,Xc=/%20/g;function Ws(e){return encodeURI(""+e).replace(Qc,"|").replace(Gc,"[").replace(Jc,"]")}function Zc(e){return Ws(e).replace(ni,"{").replace(si,"}").replace(ti,"^")}function ws(e){return Ws(e).replace(ei,"%2B").replace(Xc,"+").replace(Zo,"%23").replace(Kc,"%26").replace(Yc,"`").replace(ni,"{").replace(si,"}").replace(ti,"^")}function eu(e){return ws(e).replace(qc,"%3D")}function tu(e){return Ws(e).replace(Zo,"%23").replace(zc,"%3F")}function nu(e){return e==null?"":tu(e).replace(Wc,"%2F")}function an(e){try{return decodeURIComponent(""+e)}catch{}return""+e}const su=/\/$/,ru=e=>e.replace(su,"");function fs(e,t,n="/"){let s,r={},o="",l="";const i=t.indexOf("#");let c=t.indexOf("?");return i=0&&(c=-1),c>-1&&(s=t.slice(0,c),o=t.slice(c+1,i>-1?i:t.length),r=e(o)),i>-1&&(s=s||t.slice(0,i),l=t.slice(i,t.length)),s=cu(s!=null?s:t,n),{fullPath:s+(o&&"?")+o+l,path:s,query:r,hash:an(l)}}function ou(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function Rr(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function iu(e,t,n){const s=t.matched.length-1,r=n.matched.length-1;return s>-1&&s===r&&Ht(t.matched[s],n.matched[r])&&ri(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function Ht(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function ri(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!lu(e[n],t[n]))return!1;return!0}function lu(e,t){return Ne(e)?Tr(e,t):Ne(t)?Tr(t,e):e===t}function Tr(e,t){return Ne(t)?e.length===t.length&&e.every((n,s)=>n===t[s]):e.length===1&&e[0]===t}function cu(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),s=e.split("/"),r=s[s.length-1];(r===".."||r===".")&&s.push("");let o=n.length-1,l,i;for(l=0;l1&&o--;else break;return n.slice(0,o).join("/")+"/"+s.slice(l).join("/")}const ct={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};var fn;(function(e){e.pop="pop",e.push="push"})(fn||(fn={}));var sn;(function(e){e.back="back",e.forward="forward",e.unknown=""})(sn||(sn={}));function uu(e){if(!e)if(Ot){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),ru(e)}const au=/^[^#]+#/;function fu(e,t){return e.replace(au,"#")+t}function du(e,t){const n=document.documentElement.getBoundingClientRect(),s=e.getBoundingClientRect();return{behavior:t.behavior,left:s.left-n.left-(t.left||0),top:s.top-n.top-(t.top||0)}}const Zn=()=>({left:window.scrollX,top:window.scrollY});function pu(e){let t;if("el"in e){const n=e.el,s=typeof n=="string"&&n.startsWith("#"),r=typeof n=="string"?s?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!r)return;t=du(r,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function Or(e,t){return(history.state?history.state.position-t:-1)+e}const Cs=new Map;function hu(e,t){Cs.set(e,t)}function gu(e){const t=Cs.get(e);return Cs.delete(e),t}let mu=()=>location.protocol+"//"+location.host;function oi(e,t){const{pathname:n,search:s,hash:r}=t,o=e.indexOf("#");if(o>-1){let i=r.includes(e.slice(o))?e.slice(o).length:1,c=r.slice(i);return c[0]!=="/"&&(c="/"+c),Rr(c,"")}return Rr(n,e)+s+r}function _u(e,t,n,s){let r=[],o=[],l=null;const i=({state:g})=>{const _=oi(e,location),R=n.value,O=t.value;let V=0;if(g){if(n.value=_,t.value=g,l&&l===R){l=null;return}V=O?g.position-O.position:0}else s(_);r.forEach(k=>{k(n.value,R,{delta:V,type:fn.pop,direction:V?V>0?sn.forward:sn.back:sn.unknown})})};function c(){l=n.value}function d(g){r.push(g);const _=()=>{const R=r.indexOf(g);R>-1&&r.splice(R,1)};return o.push(_),_}function a(){const{history:g}=window;!g.state||g.replaceState(z({},g.state,{scroll:Zn()}),"")}function p(){for(const g of o)g();o=[],window.removeEventListener("popstate",i),window.removeEventListener("beforeunload",a)}return window.addEventListener("popstate",i),window.addEventListener("beforeunload",a,{passive:!0}),{pauseListeners:c,listen:d,destroy:p}}function Mr(e,t,n,s=!1,r=!1){return{back:e,current:t,forward:n,replaced:s,position:window.history.length,scroll:r?Zn():null}}function vu(e){const{history:t,location:n}=window,s={value:oi(e,n)},r={value:t.state};r.value||o(s.value,{back:null,current:s.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function o(c,d,a){const p=e.indexOf("#"),g=p>-1?(n.host&&document.querySelector("base")?e:e.slice(p))+c:mu()+e+c;try{t[a?"replaceState":"pushState"](d,"",g),r.value=d}catch(_){console.error(_),n[a?"replace":"assign"](g)}}function l(c,d){const a=z({},t.state,Mr(r.value.back,c,r.value.forward,!0),d,{position:r.value.position});o(c,a,!0),s.value=c}function i(c,d){const a=z({},r.value,t.state,{forward:c,scroll:Zn()});o(a.current,a,!0);const p=z({},Mr(s.value,c,null),{position:a.position+1},d);o(c,p,!1),s.value=c}return{location:s,state:r,push:i,replace:l}}function yu(e){e=uu(e);const t=vu(e),n=_u(e,t.state,t.location,t.replace);function s(o,l=!0){l||n.pauseListeners(),history.go(o)}const r=z({location:"",base:e,go:s,createHref:fu.bind(null,e)},t,n);return Object.defineProperty(r,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(r,"state",{enumerable:!0,get:()=>t.state.value}),r}function bu(e){return typeof e=="string"||e&&typeof e=="object"}function ii(e){return typeof e=="string"||typeof e=="symbol"}const li=Symbol("");var Ir;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(Ir||(Ir={}));function $t(e,t){return z(new Error,{type:e,[li]:!0},t)}function Qe(e,t){return e instanceof Error&&li in e&&(t==null||!!(e.type&t))}const Dr="[^/]+?",xu={sensitive:!1,strict:!1,start:!0,end:!0},Su=/[.+*?^${}()[\]/\\]/g;function wu(e,t){const n=z({},xu,t),s=[];let r=n.start?"^":"";const o=[];for(const d of e){const a=d.length?[]:[90];n.strict&&!d.length&&(r+="/");for(let p=0;pt.length?t.length===1&&t[0]===40+40?1:-1:0}function ci(e,t){let n=0;const s=e.score,r=t.score;for(;n0&&t[t.length-1]<0}const Eu={type:0,value:""},Pu=/[a-zA-Z0-9_]/;function Au(e){if(!e)return[[]];if(e==="/")return[[Eu]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(_){throw new Error(`ERR (${n})/"${d}": ${_}`)}let n=0,s=n;const r=[];let o;function l(){o&&r.push(o),o=[]}let i=0,c,d="",a="";function p(){!d||(n===0?o.push({type:0,value:d}):n===1||n===2||n===3?(o.length>1&&(c==="*"||c==="+")&&t(`A repeatable param (${d}) must be alone in its segment. eg: '/:ids+.`),o.push({type:1,value:d,regexp:a,repeatable:c==="*"||c==="+",optional:c==="*"||c==="?"})):t("Invalid state to consume buffer"),d="")}function g(){d+=c}for(;i{l(N)}:nn}function l(p){if(ii(p)){const g=s.get(p);g&&(s.delete(p),n.splice(n.indexOf(g),1),g.children.forEach(l),g.alias.forEach(l))}else{const g=n.indexOf(p);g>-1&&(n.splice(g,1),p.record.name&&s.delete(p.record.name),p.children.forEach(l),p.alias.forEach(l))}}function i(){return n}function c(p){const g=Iu(p,n);n.splice(g,0,p),p.record.name&&!Lr(p)&&s.set(p.record.name,p)}function d(p,g){let _,R={},O,V;if("name"in p&&p.name){if(_=s.get(p.name),!_)throw $t(1,{location:p});V=_.record.name,R=z(kr(g.params,_.keys.filter(N=>!N.optional).concat(_.parent?_.parent.keys.filter(N=>N.optional):[]).map(N=>N.name)),p.params&&kr(p.params,_.keys.map(N=>N.name))),O=_.stringify(R)}else if(p.path!=null)O=p.path,_=n.find(N=>N.re.test(O)),_&&(R=_.parse(O),V=_.record.name);else{if(_=g.name?s.get(g.name):n.find(N=>N.re.test(g.path)),!_)throw $t(1,{location:p,currentLocation:g});V=_.record.name,R=z({},g.params,p.params),O=_.stringify(R)}const k=[];let M=_;for(;M;)k.unshift(M.record),M=M.parent;return{name:V,path:O,params:R,matched:k,meta:Mu(k)}}e.forEach(p=>o(p));function a(){n.length=0,s.clear()}return{addRoute:o,resolve:d,removeRoute:l,clearRoutes:a,getRoutes:i,getRecordMatcher:r}}function kr(e,t){const n={};for(const s of t)s in e&&(n[s]=e[s]);return n}function Nr(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:Ou(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function Ou(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const s in e.components)t[s]=typeof n=="object"?n[s]:n;return t}function Lr(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Mu(e){return e.reduce((t,n)=>z(t,n.meta),{})}function jr(e,t){const n={};for(const s in e)n[s]=s in t?t[s]:e[s];return n}function Iu(e,t){let n=0,s=t.length;for(;n!==s;){const o=n+s>>1;ci(e,t[o])<0?s=o:n=o+1}const r=Du(e);return r&&(s=t.lastIndexOf(r,s-1)),s}function Du(e){let t=e;for(;t=t.parent;)if(ui(t)&&ci(e,t)===0)return t}function ui({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function Fu(e){const t={};if(e===""||e==="?")return t;const s=(e[0]==="?"?e.slice(1):e).split("&");for(let r=0;ro&&ws(o)):[s&&ws(s)]).forEach(o=>{o!==void 0&&(t+=(t.length?"&":"")+n,o!=null&&(t+="="+o))})}return t}function ku(e){const t={};for(const n in e){const s=e[n];s!==void 0&&(t[n]=Ne(s)?s.map(r=>r==null?null:""+r):s==null?s:""+s)}return t}const Nu=Symbol(""),$r=Symbol(""),qs=Symbol(""),ai=Symbol(""),Es=Symbol("");function qt(){let e=[];function t(s){return e.push(s),()=>{const r=e.indexOf(s);r>-1&&e.splice(r,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function dt(e,t,n,s,r,o=l=>l()){const l=s&&(s.enterCallbacks[r]=s.enterCallbacks[r]||[]);return()=>new Promise((i,c)=>{const d=g=>{g===!1?c($t(4,{from:n,to:t})):g instanceof Error?c(g):bu(g)?c($t(2,{from:t,to:g})):(l&&s.enterCallbacks[r]===l&&typeof g=="function"&&l.push(g),i())},a=o(()=>e.call(s&&s.instances[r],t,n,d));let p=Promise.resolve(a);e.length<3&&(p=p.then(d)),p.catch(g=>c(g))})}function ds(e,t,n,s,r=o=>o()){const o=[];for(const l of e)for(const i in l.components){let c=l.components[i];if(!(t!=="beforeRouteEnter"&&!l.instances[i]))if(Xo(c)){const a=(c.__vccOpts||c)[t];a&&o.push(dt(a,n,s,l,i,r))}else{let d=c();o.push(()=>d.then(a=>{if(!a)throw new Error(`Couldn't resolve component "${i}" at "${l.path}"`);const p=Uc(a)?a.default:a;l.mods[i]=a,l.components[i]=p;const _=(p.__vccOpts||p)[t];return _&&dt(_,n,s,l,i,r)()}))}}return o}function Vr(e){const t=tt(qs),n=tt(ai),s=De(()=>{const c=Ft(e.to);return t.resolve(c)}),r=De(()=>{const{matched:c}=s.value,{length:d}=c,a=c[d-1],p=n.matched;if(!a||!p.length)return-1;const g=p.findIndex(Ht.bind(null,a));if(g>-1)return g;const _=Br(c[d-2]);return d>1&&Br(a)===_&&p[p.length-1].path!==_?p.findIndex(Ht.bind(null,c[d-2])):g}),o=De(()=>r.value>-1&&Vu(n.params,s.value.params)),l=De(()=>r.value>-1&&r.value===n.matched.length-1&&ri(n.params,s.value.params));function i(c={}){if($u(c)){const d=t[Ft(e.replace)?"replace":"push"](Ft(e.to)).catch(nn);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>d),d}return Promise.resolve()}return{route:s,href:De(()=>s.value.href),isActive:o,isExactActive:l,navigate:i}}function Lu(e){return e.length===1?e[0]:e}const ju=wo({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:Vr,setup(e,{slots:t}){const n=qn(Vr(e)),{options:s}=tt(qs),r=De(()=>({[Ur(e.activeClass,s.linkActiveClass,"router-link-active")]:n.isActive,[Ur(e.exactActiveClass,s.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const o=t.default&&Lu(t.default(n));return e.custom?o:Jo("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:r.value},o)}}}),Hu=ju;function $u(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function Vu(e,t){for(const n in t){const s=t[n],r=e[n];if(typeof s=="string"){if(s!==r)return!1}else if(!Ne(r)||r.length!==s.length||s.some((o,l)=>o!==r[l]))return!1}return!0}function Br(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const Ur=(e,t,n)=>e!=null?e:t!=null?t:n,Bu=wo({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const s=tt(Es),r=De(()=>e.route||s.value),o=tt($r,0),l=De(()=>{let d=Ft(o);const{matched:a}=r.value;let p;for(;(p=a[d])&&!p.components;)d++;return d}),i=De(()=>r.value.matched[l.value]);Sn($r,De(()=>l.value+1)),Sn(Nu,i),Sn(Es,r);const c=qi();return wn(()=>[c.value,i.value,e.name],([d,a,p],[g,_,R])=>{a&&(a.instances[p]=d,_&&_!==a&&d&&d===g&&(a.leaveGuards.size||(a.leaveGuards=_.leaveGuards),a.updateGuards.size||(a.updateGuards=_.updateGuards))),d&&a&&(!_||!Ht(a,_)||!g)&&(a.enterCallbacks[p]||[]).forEach(O=>O(d))},{flush:"post"}),()=>{const d=r.value,a=e.name,p=i.value,g=p&&p.components[a];if(!g)return Kr(n.default,{Component:g,route:d});const _=p.props[a],R=_?_===!0?d.params:typeof _=="function"?_(d):_:null,V=Jo(g,z({},R,t,{onVnodeUnmounted:k=>{k.component.isUnmounted&&(p.instances[a]=null)},ref:c}));return Kr(n.default,{Component:V,route:d})||V}}});function Kr(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const Uu=Bu;function Ku(e){const t=Tu(e.routes,e),n=e.parseQuery||Fu,s=e.stringifyQuery||Hr,r=e.history,o=qt(),l=qt(),i=qt(),c=zi(ct);let d=ct;Ot&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const a=as.bind(null,y=>""+y),p=as.bind(null,nu),g=as.bind(null,an);function _(y,T){let P,I;return ii(y)?(P=t.getRecordMatcher(y),I=T):I=y,t.addRoute(I,P)}function R(y){const T=t.getRecordMatcher(y);T&&t.removeRoute(T)}function O(){return t.getRoutes().map(y=>y.record)}function V(y){return!!t.getRecordMatcher(y)}function k(y,T){if(T=z({},T||c.value),typeof y=="string"){const f=fs(n,y,T.path),h=t.resolve({path:f.path},T),b=r.createHref(f.fullPath);return z(f,h,{params:g(h.params),hash:an(f.hash),redirectedFrom:void 0,href:b})}let P;if(y.path!=null)P=z({},y,{path:fs(n,y.path,T.path).path});else{const f=z({},y.params);for(const h in f)f[h]==null&&delete f[h];P=z({},y,{params:p(f)}),T.params=p(T.params)}const I=t.resolve(P,T),q=y.hash||"";I.params=a(g(I.params));const re=ou(s,z({},y,{hash:Zc(q),path:I.path})),u=r.createHref(re);return z({fullPath:re,hash:q,query:s===Hr?ku(y.query):y.query||{}},I,{redirectedFrom:void 0,href:u})}function M(y){return typeof y=="string"?fs(n,y,c.value.path):z({},y)}function N(y,T){if(d!==y)return $t(8,{from:T,to:y})}function D(y){return oe(y)}function Z(y){return D(z(M(y),{replace:!0}))}function ae(y){const T=y.matched[y.matched.length-1];if(T&&T.redirect){const{redirect:P}=T;let I=typeof P=="function"?P(y):P;return typeof I=="string"&&(I=I.includes("?")||I.includes("#")?I=M(I):{path:I},I.params={}),z({query:y.query,hash:y.hash,params:I.path!=null?{}:y.params},I)}}function oe(y,T){const P=d=k(y),I=c.value,q=y.state,re=y.force,u=y.replace===!0,f=ae(P);if(f)return oe(z(M(f),{state:typeof f=="object"?z({},q,f.state):q,force:re,replace:u}),T||P);const h=P;h.redirectedFrom=T;let b;return!re&&iu(s,I,P)&&(b=$t(16,{to:h,from:I}),$e(I,I,!0,!1)),(b?Promise.resolve(b):je(h,I)).catch(v=>Qe(v)?Qe(v,2)?v:lt(v):W(v,h,I)).then(v=>{if(v){if(Qe(v,2))return oe(z({replace:u},M(v.to),{state:typeof v.to=="object"?z({},q,v.to.state):q,force:re}),T||h)}else v=mt(h,I,!0,u,q);return it(h,I,v),v})}function Le(y,T){const P=N(y,T);return P?Promise.reject(P):Promise.resolve()}function ot(y){const T=At.values().next().value;return T&&typeof T.runWithContext=="function"?T.runWithContext(y):y()}function je(y,T){let P;const[I,q,re]=Wu(y,T);P=ds(I.reverse(),"beforeRouteLeave",y,T);for(const f of I)f.leaveGuards.forEach(h=>{P.push(dt(h,y,T))});const u=Le.bind(null,y,T);return P.push(u),Ae(P).then(()=>{P=[];for(const f of o.list())P.push(dt(f,y,T));return P.push(u),Ae(P)}).then(()=>{P=ds(q,"beforeRouteUpdate",y,T);for(const f of q)f.updateGuards.forEach(h=>{P.push(dt(h,y,T))});return P.push(u),Ae(P)}).then(()=>{P=[];for(const f of re)if(f.beforeEnter)if(Ne(f.beforeEnter))for(const h of f.beforeEnter)P.push(dt(h,y,T));else P.push(dt(f.beforeEnter,y,T));return P.push(u),Ae(P)}).then(()=>(y.matched.forEach(f=>f.enterCallbacks={}),P=ds(re,"beforeRouteEnter",y,T,ot),P.push(u),Ae(P))).then(()=>{P=[];for(const f of l.list())P.push(dt(f,y,T));return P.push(u),Ae(P)}).catch(f=>Qe(f,8)?f:Promise.reject(f))}function it(y,T,P){i.list().forEach(I=>ot(()=>I(y,T,P)))}function mt(y,T,P,I,q){const re=N(y,T);if(re)return re;const u=T===ct,f=Ot?history.state:{};P&&(I||u?r.replace(y.fullPath,z({scroll:u&&f&&f.scroll},q)):r.push(y.fullPath,q)),c.value=y,$e(y,T,P,u),lt()}let He;function Vt(){He||(He=r.listen((y,T,P)=>{if(!_n.listening)return;const I=k(y),q=ae(I);if(q){oe(z(q,{replace:!0,force:!0}),I).catch(nn);return}d=I;const re=c.value;Ot&&hu(Or(re.fullPath,P.delta),Zn()),je(I,re).catch(u=>Qe(u,12)?u:Qe(u,2)?(oe(z(M(u.to),{force:!0}),I).then(f=>{Qe(f,20)&&!P.delta&&P.type===fn.pop&&r.go(-1,!1)}).catch(nn),Promise.reject()):(P.delta&&r.go(-P.delta,!1),W(u,I,re))).then(u=>{u=u||mt(I,re,!1),u&&(P.delta&&!Qe(u,8)?r.go(-P.delta,!1):P.type===fn.pop&&Qe(u,20)&&r.go(-1,!1)),it(I,re,u)}).catch(nn)}))}let Et=qt(),ce=qt(),Q;function W(y,T,P){lt(y);const I=ce.list();return I.length?I.forEach(q=>q(y,T,P)):console.error(y),Promise.reject(y)}function Je(){return Q&&c.value!==ct?Promise.resolve():new Promise((y,T)=>{Et.add([y,T])})}function lt(y){return Q||(Q=!y,Vt(),Et.list().forEach(([T,P])=>y?P(y):T()),Et.reset()),y}function $e(y,T,P,I){const{scrollBehavior:q}=e;if(!Ot||!q)return Promise.resolve();const re=!P&&gu(Or(y.fullPath,0))||(I||!P)&&history.state&&history.state.scroll||null;return js().then(()=>q(y,T,re)).then(u=>u&&pu(u)).catch(u=>W(u,y,T))}const ve=y=>r.go(y);let Pt;const At=new Set,_n={currentRoute:c,listening:!0,addRoute:_,removeRoute:R,clearRoutes:t.clearRoutes,hasRoute:V,getRoutes:O,resolve:k,options:e,push:D,replace:Z,go:ve,back:()=>ve(-1),forward:()=>ve(1),beforeEach:o.add,beforeResolve:l.add,afterEach:i.add,onError:ce.add,isReady:Je,install(y){const T=this;y.component("RouterLink",Hu),y.component("RouterView",Uu),y.config.globalProperties.$router=T,Object.defineProperty(y.config.globalProperties,"$route",{enumerable:!0,get:()=>Ft(c)}),Ot&&!Pt&&c.value===ct&&(Pt=!0,D(r.location).catch(q=>{}));const P={};for(const q in ct)Object.defineProperty(P,q,{get:()=>c.value[q],enumerable:!0});y.provide(qs,T),y.provide(ai,ho(P)),y.provide(Es,c);const I=y.unmount;At.add(y),y.unmount=function(){At.delete(y),At.size<1&&(d=ct,He&&He(),He=null,c.value=ct,Pt=!1,Q=!1),I()}}};function Ae(y){return y.reduce((T,P)=>T.then(()=>ot(P)),Promise.resolve())}return _n}function Wu(e,t){const n=[],s=[],r=[],o=Math.max(t.matched.length,e.matched.length);for(let l=0;lHt(d,i))?s.push(i):n.push(i));const c=e.matched[l];c&&(t.matched.find(d=>Ht(d,c))||r.push(c))}return[n,s,r]}const qu={name:"Login",data(){return{loginForm:{username:"",password:""},loading:!1,error:"",success:""}},methods:{async handleLogin(){this.loading=!0,this.error="",this.success="";try{const e=await fetch("/api/v1/user/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.loginForm)}),t=await e.json();e.ok&&t.code===0?(this.success=t.message,localStorage.setItem("authToken",t.data.token),localStorage.setItem("userId",t.data.id),localStorage.setItem("username",t.data.username),setTimeout(()=>{this.$router.push("/dashboard")},500)):this.error=t.message||"\u767B\u5F55\u5931\u8D25"}catch{this.error="\u7F51\u7EDC\u9519\u8BEF\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5"}finally{this.loading=!1}}}},zu={class:"login-container"},Gu={class:"form-group"},Ju={class:"form-group"},Yu=["disabled"],Qu={key:0,class:"error-message"},Xu={key:1,class:"success-message"};function Zu(e,t,n,s,r,o){return U(),K("div",zu,[t[5]||(t[5]=m("div",{class:"logo"},"\u{1F437}",-1)),t[6]||(t[6]=m("h1",null,"\u732A\u573A\u7BA1\u7406\u7CFB\u7EDF",-1)),t[7]||(t[7]=m("p",{class:"subtitle"},"\u8BF7\u767B\u5F55\u60A8\u7684\u8D26\u6237",-1)),m("form",{onSubmit:t[2]||(t[2]=ut((...l)=>o.handleLogin&&o.handleLogin(...l),["prevent"]))},[m("div",Gu,[t[3]||(t[3]=m("label",{for:"username"},"\u7528\u6237\u540D",-1)),Me(m("input",{type:"text",id:"username","onUpdate:modelValue":t[0]||(t[0]=l=>r.loginForm.username=l),required:"",placeholder:"\u8BF7\u8F93\u5165\u7528\u6237\u540D"},null,512),[[xt,r.loginForm.username]])]),m("div",Ju,[t[4]||(t[4]=m("label",{for:"password"},"\u5BC6\u7801",-1)),Me(m("input",{type:"password",id:"password","onUpdate:modelValue":t[1]||(t[1]=l=>r.loginForm.password=l),required:"",placeholder:"\u8BF7\u8F93\u5165\u5BC6\u7801"},null,512),[[xt,r.loginForm.password]])]),m("button",{type:"submit",disabled:r.loading},X(r.loading?"\u767B\u5F55\u4E2D...":"\u767B\u5F55"),9,Yu)],32),r.error?(U(),K("div",Qu,X(r.error),1)):Ie("",!0),r.success?(U(),K("div",Xu,X(r.success),1)):Ie("",!0)])}const ea=mn(qu,[["render",Zu],["__scopeId","data-v-bb5c78dc"]]);const ta={name:"Dashboard",data(){return{username:localStorage.getItem("username")||"\u7BA1\u7406\u5458"}},methods:{logout(){localStorage.removeItem("authToken"),localStorage.removeItem("userId"),localStorage.removeItem("username"),this.$router.push("/")},controlDevice(e,t){alert(`\u6B63\u5728${t==="on"?"\u5F00\u542F":"\u5173\u95ED"}${e==="fan"?"\u98CE\u673A":"\u6C34\u5E18"}`)}}},na={class:"header"},sa={class:"user-info"},ra={class:"nav"},oa={class:"container"},ia={class:"device-control"},la={class:"control-grid"},ca={class:"control-item"},ua={class:"control-buttons"},aa={class:"control-item"},fa={class:"control-buttons"};function da(e,t,n,s,r,o){const l=Jn("router-link");return U(),K("div",null,[m("div",na,[t[5]||(t[5]=m("h1",null,"\u{1F437} \u732A\u573A\u7BA1\u7406\u7CFB\u7EDF",-1)),m("div",sa,[m("span",null,X(r.username),1),m("button",{class:"logout-btn",onClick:t[0]||(t[0]=(...i)=>o.logout&&o.logout(...i))},"\u9000\u51FA\u767B\u5F55")])]),m("div",ra,[m("ul",null,[m("li",null,[ie(l,{to:"/dashboard",class:"active"},{default:We(()=>[...t[6]||(t[6]=[qe("\u63A7\u5236\u53F0",-1)])]),_:1})]),m("li",null,[ie(l,{to:"/device"},{default:We(()=>[...t[7]||(t[7]=[qe("\u8BBE\u5907\u7BA1\u7406",-1)])]),_:1})]),m("li",null,[ie(l,{to:"/feed/plan"},{default:We(()=>[...t[8]||(t[8]=[qe("\u9972\u5582\u8BA1\u5212",-1)])]),_:1})])])]),m("div",oa,[t[12]||(t[12]=m("div",{class:"dashboard-grid"},[m("div",{class:"card"},[m("h3",null,"\u{1F4C8} \u73AF\u5883\u76D1\u63A7"),m("p",null,"\u5B9E\u65F6\u76D1\u63A7\u732A\u820D\u73AF\u5883\u53C2\u6570\uFF0C\u5305\u62EC\u6E29\u5EA6\u3001\u6E7F\u5EA6\u3001\u6C28\u6C14\u6D53\u5EA6\u7B49\u5173\u952E\u6307\u6807\u3002")]),m("div",{class:"card"},[m("h3",null,"\u{1F514} \u544A\u8B66\u4FE1\u606F"),m("p",null,"\u67E5\u770B\u7CFB\u7EDF\u544A\u8B66\u548C\u5F02\u5E38\u60C5\u51B5\uFF0C\u53CA\u65F6\u5904\u7406\u5404\u79CD\u8BBE\u5907\u6545\u969C\u548C\u73AF\u5883\u5F02\u5E38\u3002")]),m("div",{class:"card"},[m("h3",null,"\u{1F4CA} \u6570\u636E\u5206\u6790"),m("p",null,"\u5206\u6790\u5386\u53F2\u6570\u636E\uFF0C\u751F\u6210\u8D8B\u52BF\u56FE\u8868\uFF0C\u4E3A\u517B\u6B96\u51B3\u7B56\u63D0\u4F9B\u6570\u636E\u652F\u6301\u3002")])],-1)),m("div",ia,[t[11]||(t[11]=m("h3",null,"\u2699\uFE0F \u8BBE\u5907\u63A7\u5236",-1)),m("div",la,[m("div",ca,[t[9]||(t[9]=m("h4",null,"\u98CE\u673A\u63A7\u5236",-1)),m("div",ua,[m("button",{class:"control-btn on-btn",onClick:t[1]||(t[1]=i=>o.controlDevice("fan","on"))},"\u5F00\u542F"),m("button",{class:"control-btn off-btn",onClick:t[2]||(t[2]=i=>o.controlDevice("fan","off"))},"\u5173\u95ED")])]),m("div",aa,[t[10]||(t[10]=m("h4",null,"\u6C34\u5E18\u63A7\u5236",-1)),m("div",fa,[m("button",{class:"control-btn on-btn",onClick:t[3]||(t[3]=i=>o.controlDevice("water_curtain","on"))},"\u5F00\u542F"),m("button",{class:"control-btn off-btn",onClick:t[4]||(t[4]=i=>o.controlDevice("water_curtain","off"))},"\u5173\u95ED")])])])])])])}const pa=mn(ta,[["render",da],["__scopeId","data-v-904f2d71"]]);const ha={name:"Device",data(){return{username:localStorage.getItem("username")||"\u7BA1\u7406\u5458",devices:[],showModal:!1,editingDevice:null,deviceForm:{id:null,name:"",type:"",parent_id:null,address:null,bus_number:null,device_address:null},expandedNodes:new Set}},computed:{relayDevices(){return this.devices.filter(e=>e.type==="relay")}},mounted(){this.loadDevices()},methods:{logout(){localStorage.removeItem("authToken"),localStorage.removeItem("userId"),localStorage.removeItem("username"),this.$router.push("/")},toggleNode(e){this.expandedNodes.has(e)?this.expandedNodes.delete(e):this.expandedNodes.add(e)},getControllerDevices(e){return this.devices.filter(t=>t.parent_id===e&&(t.type==="pig_pen_controller"||t.type==="feed_mill_controller"))},getLeafDevices(e){return this.devices.filter(t=>t.parent_id===e&&(t.type==="fan"||t.type==="water_curtain"))},getDeviceTypeText(e){return{relay:"\u4E2D\u7EE7",pig_pen_controller:"\u732A\u820D\u4E3B\u63A7",feed_mill_controller:"\u505A\u6599\u8F66\u95F4\u4E3B\u63A7",fan:"\u98CE\u673A",water_curtain:"\u6C34\u5E18"}[e]||e},getParentDevices(e){return e==="pig_pen_controller"||e==="feed_mill_controller"?this.devices.filter(t=>t.type==="relay"):e==="fan"||e==="water_curtain"?this.devices.filter(t=>t.type==="pig_pen_controller"||t.type==="feed_mill_controller"):[]},getParentDevicesWithDisplayName(e){const t=this.getParentDevices(e);return e==="pig_pen_controller"||e==="feed_mill_controller"?t.map(n=>({...n,display_name:n.name})):e==="fan"||e==="water_curtain"?t.map(n=>{const s=this.devices.find(o=>o.id===n.parent_id),r=s?s.name:"\u672A\u77E5\u4E2D\u7EE7";return{...n,display_name:`${r} - ${n.name}`}}):[]},async loadDevices(){try{const e=await fetch("/api/v1/device/list",{headers:{Authorization:"Bearer "+localStorage.getItem("authToken")}}),t=await e.json();e.ok&&t.code===0?(this.devices=t.data.devices,this.expandAllNodes()):console.error("\u83B7\u53D6\u8BBE\u5907\u5217\u8868\u5931\u8D25:",t.message)}catch(e){console.error("\u83B7\u53D6\u8BBE\u5907\u5217\u8868\u5931\u8D25:",e)}},expandAllNodes(){this.expandedNodes.clear(),this.relayDevices.forEach(e=>{this.expandedNodes.add(e.id),this.getControllerDevices(e.id).forEach(n=>{this.expandedNodes.add(n.id)})})},openAddDeviceModal(){this.editingDevice=null,this.deviceForm={id:null,name:"",type:"",parent_id:null,address:null,bus_number:null,device_address:null},this.showModal=!0},editDevice(e){if(this.editingDevice=e,this.deviceForm={...e},(e.type==="fan"||e.type==="water_curtain")&&e.address){const t=e.address.split(":");t.length===2?(this.deviceForm.bus_number=parseInt(t[0]),this.deviceForm.device_address=t[1]):this.deviceForm.device_address=e.address}this.showModal=!0},initializeDeviceForm(){return{id:null,name:"",type:"",parent_id:null,address:null}},closeDeviceModal(){this.showModal=!1},async saveDevice(){if(!this.deviceForm.name||!this.deviceForm.type){alert("\u8BF7\u586B\u5199\u5FC5\u586B\u5B57\u6BB5");return}if(this.deviceForm.type!=="relay"&&!this.deviceForm.parent_id){alert("\u8BF7\u9009\u62E9\u4E0A\u7EA7\u8BBE\u5907");return}try{let e,t;const n={name:this.deviceForm.name,type:this.deviceForm.type,parent_id:this.deviceForm.parent_id,address:this.deviceForm.address,bus_number:this.deviceForm.bus_number,device_address:this.deviceForm.device_address};this.editingDevice?(e="/api/v1/device/update",t="POST",n.id=this.deviceForm.id):(e="/api/v1/device/create",t="POST");const s=await fetch(e,{method:t,headers:{"Content-Type":"application/json",Authorization:"Bearer "+localStorage.getItem("authToken")},body:JSON.stringify(n)}),r=await s.json();s.ok&&r.code===0?(await this.loadDevices(),this.closeDeviceModal()):alert("\u4FDD\u5B58\u5931\u8D25: "+r.message)}catch(e){console.error("\u4FDD\u5B58\u8BBE\u5907\u5931\u8D25:",e),alert("\u4FDD\u5B58\u8BBE\u5907\u5931\u8D25: "+e.message)}},async deleteDevice(e){if(!!confirm("\u786E\u5B9A\u8981\u5220\u9664\u8FD9\u4E2A\u8BBE\u5907\u5417\uFF1F"))try{const t=await fetch("/api/v1/device/delete",{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+localStorage.getItem("authToken")},body:JSON.stringify({id:e})}),n=await t.json();t.ok&&n.code===0?await this.loadDevices():alert("\u5220\u9664\u5931\u8D25: "+n.message)}catch(t){console.error("\u5220\u9664\u8BBE\u5907\u5931\u8D25:",t),alert("\u5220\u9664\u8BBE\u5907\u5931\u8D25: "+t.message)}},toggleParentField(){this.deviceForm.type==="relay"&&(this.deviceForm.parent_id=null)},toggleNode(e){this.expandedNodes.has(e)?this.expandedNodes.delete(e):this.expandedNodes.add(e)}}},ga={class:"device-management"},ma={class:"header"},_a={class:"user-info"},va={class:"nav"},ya={class:"main-content"},ba={class:"toolbar"},xa={class:"device-tree"},Sa={key:0,class:"no-devices"},wa={key:1},Ca=["onClick"],Ea={class:"node-info"},Pa={class:"toggle-icon"},Aa={class:"node-title"},Ra={class:"node-type relay-type"},Ta={key:0,class:"node-address"},Oa={class:"node-actions"},Ma=["onClick"],Ia=["onClick"],Da={class:"children-container"},Fa=["onClick"],ka={class:"node-info"},Na={class:"toggle-icon"},La={class:"node-title"},ja={class:"node-type controller-type"},Ha={key:0,class:"node-address"},$a={class:"node-actions"},Va=["onClick"],Ba=["onClick"],Ua={class:"children-container"},Ka={class:"node-header"},Wa={class:"node-info"},qa={class:"node-title"},za={class:"node-type device-type"},Ga={key:0,class:"node-address"},Ja={class:"node-actions"},Ya=["onClick"],Qa=["onClick"],Xa={key:0,class:"modal"},Za={class:"modal-content"},ef={class:"modal-header"},tf={class:"modal-body"},nf={class:"form-group"},sf={class:"form-group"},rf={key:0,class:"form-group"},of={key:1,class:"form-group"},lf={key:2,class:"form-group"},cf={key:3,class:"form-group"},uf=["value"],af={class:"modal-footer"};function ff(e,t,n,s,r,o){const l=Jn("router-link");return U(),K("div",ga,[m("header",ma,[t[14]||(t[14]=m("h1",null,"\u8BBE\u5907\u7BA1\u7406",-1)),m("div",_a,[m("span",null,"\u6B22\u8FCE, "+X(r.username),1),m("button",{class:"logout-btn",onClick:t[0]||(t[0]=(...i)=>o.logout&&o.logout(...i))},"\u9000\u51FA")])]),m("nav",va,[m("ul",null,[m("li",null,[ie(l,{to:"/dashboard"},{default:We(()=>[...t[15]||(t[15]=[qe("\u63A7\u5236\u53F0",-1)])]),_:1})]),m("li",null,[ie(l,{to:"/device",class:"active"},{default:We(()=>[...t[16]||(t[16]=[qe("\u8BBE\u5907\u7BA1\u7406",-1)])]),_:1})]),m("li",null,[ie(l,{to:"/feed/plan"},{default:We(()=>[...t[17]||(t[17]=[qe("\u9972\u5582\u8BA1\u5212",-1)])]),_:1})])])]),m("main",ya,[m("div",ba,[m("button",{class:"btn btn-primary",onClick:t[1]||(t[1]=(...i)=>o.openAddDeviceModal&&o.openAddDeviceModal(...i))},"\u6DFB\u52A0\u8BBE\u5907")]),m("div",xa,[r.devices.length===0?(U(),K("div",Sa," \u6682\u65E0\u8BBE\u5907\u6570\u636E ")):(U(),K("div",wa,[(U(!0),K(xe,null,zt(o.relayDevices,i=>(U(),K("div",{key:i.id,class:"tree-node relay-node"},[m("div",{class:"node-header",onClick:c=>o.toggleNode(i.id)},[m("div",Ea,[m("span",Pa,X(r.expandedNodes.has(i.id)?"\u25BC":"\u25BA"),1),m("span",Aa,X(i.name),1),m("span",Ra,X(o.getDeviceTypeText(i.type)),1),i.address?(U(),K("span",Ta,"["+X(i.address)+"]",1)):Ie("",!0),m("span",{class:St(["node-status",{"status-active":i.active,"status-inactive":!i.active}])},X(i.active?"\u5728\u7EBF":"\u79BB\u7EBF"),3)]),m("div",Oa,[m("button",{class:"action-btn edit-btn",onClick:ut(c=>o.editDevice(i),["stop"])},"\u7F16\u8F91",8,Ma),m("button",{class:"action-btn delete-btn",onClick:ut(c=>o.deleteDevice(i.id),["stop"])},"\u5220\u9664",8,Ia)])],8,Ca),Me(m("div",Da,[(U(!0),K(xe,null,zt(o.getControllerDevices(i.id),c=>(U(),K("div",{key:c.id,class:"tree-node controller-node"},[m("div",{class:"node-header",onClick:d=>o.toggleNode(c.id)},[m("div",ka,[m("span",Na,X(r.expandedNodes.has(c.id)?"\u25BC":"\u25BA"),1),m("span",La,X(c.name),1),m("span",ja,X(o.getDeviceTypeText(c.type)),1),c.address?(U(),K("span",Ha,"["+X(c.address)+"]",1)):Ie("",!0),m("span",{class:St(["node-status",{"status-active":c.active,"status-inactive":!c.active}])},X(c.active?"\u5728\u7EBF":"\u79BB\u7EBF"),3)]),m("div",$a,[m("button",{class:"action-btn edit-btn",onClick:ut(d=>o.editDevice(c),["stop"])},"\u7F16\u8F91",8,Va),m("button",{class:"action-btn delete-btn",onClick:ut(d=>o.deleteDevice(c.id),["stop"])},"\u5220\u9664",8,Ba)])],8,Fa),Me(m("div",Ua,[(U(!0),K(xe,null,zt(o.getLeafDevices(c.id),d=>(U(),K("div",{key:d.id,class:"tree-node device-node"},[m("div",Ka,[m("div",Wa,[m("span",qa,X(d.name),1),m("span",za,X(o.getDeviceTypeText(d.type)),1),d.address?(U(),K("span",Ga,"["+X(d.address)+"]",1)):Ie("",!0),m("span",{class:St(["node-status",{"status-active":d.active,"status-inactive":!d.active}])},X(d.active?"\u5728\u7EBF":"\u79BB\u7EBF"),3)]),m("div",Ja,[m("button",{class:"action-btn edit-btn",onClick:ut(a=>o.editDevice(d),["stop"])},"\u7F16\u8F91",8,Ya),m("button",{class:"action-btn delete-btn",onClick:ut(a=>o.deleteDevice(d.id),["stop"])},"\u5220\u9664",8,Qa)])])]))),128))],512),[[gr,r.expandedNodes.has(c.id)]])]))),128))],512),[[gr,r.expandedNodes.has(i.id)]])]))),128))]))])]),r.showModal?(U(),K("div",Xa,[m("div",Za,[m("div",ef,[m("h3",null,X(r.editingDevice?"\u7F16\u8F91\u8BBE\u5907":"\u6DFB\u52A0\u8BBE\u5907"),1),m("button",{class:"close-btn",onClick:t[2]||(t[2]=(...i)=>o.closeDeviceModal&&o.closeDeviceModal(...i))},"\xD7")]),m("div",tf,[m("form",{onSubmit:t[11]||(t[11]=ut((...i)=>o.saveDevice&&o.saveDevice(...i),["prevent"]))},[Me(m("input",{type:"hidden","onUpdate:modelValue":t[3]||(t[3]=i=>r.deviceForm.id=i)},null,512),[[xt,r.deviceForm.id]]),m("div",nf,[t[18]||(t[18]=m("label",{for:"deviceName"},"\u8BBE\u5907\u540D\u79F0",-1)),Me(m("input",{type:"text",id:"deviceName","onUpdate:modelValue":t[4]||(t[4]=i=>r.deviceForm.name=i),required:""},null,512),[[xt,r.deviceForm.name]])]),m("div",sf,[t[20]||(t[20]=m("label",{for:"deviceType"},"\u8BBE\u5907\u7C7B\u578B",-1)),Me(m("select",{id:"deviceType","onUpdate:modelValue":t[5]||(t[5]=i=>r.deviceForm.type=i),required:"",onChange:t[6]||(t[6]=(...i)=>o.toggleParentField&&o.toggleParentField(...i))},[...t[19]||(t[19]=[ec('',6)])],544),[[Er,r.deviceForm.type]])]),(r.deviceForm.type==="fan"||r.deviceForm.type==="water_curtain")&&r.deviceForm.type!==""?(U(),K("div",rf,[t[21]||(t[21]=m("label",{for:"busNumber"},"485\u603B\u7EBF\u53F7",-1)),Me(m("input",{type:"number",id:"busNumber","onUpdate:modelValue":t[7]||(t[7]=i=>r.deviceForm.bus_number=i),placeholder:"\u8BF7\u8F93\u5165485\u603B\u7EBF\u53F7"},null,512),[[xt,r.deviceForm.bus_number,void 0,{number:!0}]])])):Ie("",!0),(r.deviceForm.type==="fan"||r.deviceForm.type==="water_curtain")&&r.deviceForm.type!==""?(U(),K("div",of,[t[22]||(t[22]=m("label",{for:"device485Address"},"485\u8BBE\u5907\u5730\u5740",-1)),Me(m("input",{type:"text",id:"device485Address","onUpdate:modelValue":t[8]||(t[8]=i=>r.deviceForm.device_address=i),placeholder:"\u8BF7\u8F93\u5165485\u8BBE\u5907\u5730\u5740"},null,512),[[xt,r.deviceForm.device_address]])])):Ie("",!0),r.deviceForm.type!=="relay"&&r.deviceForm.type!==""&&r.deviceForm.type!=="fan"&&r.deviceForm.type!=="water_curtain"?(U(),K("div",lf,[t[23]||(t[23]=m("label",{for:"deviceAddress"},"\u8BBE\u5907\u5730\u5740",-1)),Me(m("input",{type:"text",id:"deviceAddress","onUpdate:modelValue":t[9]||(t[9]=i=>r.deviceForm.address=i),placeholder:"\u8BF7\u8F93\u5165\u8BBE\u5907\u5730\u5740"},null,512),[[xt,r.deviceForm.address]])])):Ie("",!0),r.deviceForm.type!=="relay"&&r.deviceForm.type!==""?(U(),K("div",cf,[t[25]||(t[25]=m("label",{for:"parentId"},"\u4E0A\u7EA7\u8BBE\u5907",-1)),Me(m("select",{id:"parentId","onUpdate:modelValue":t[10]||(t[10]=i=>r.deviceForm.parent_id=i)},[t[24]||(t[24]=m("option",{value:""},"\u8BF7\u9009\u62E9\u4E0A\u7EA7\u8BBE\u5907",-1)),(U(!0),K(xe,null,zt(o.getParentDevicesWithDisplayName(r.deviceForm.type),i=>(U(),K("option",{key:i.id,value:i.id},X(i.display_name),9,uf))),128))],512),[[Er,r.deviceForm.parent_id]])])):Ie("",!0)],32)]),m("div",af,[m("button",{class:"btn btn-secondary",onClick:t[12]||(t[12]=(...i)=>o.closeDeviceModal&&o.closeDeviceModal(...i))},"\u53D6\u6D88"),m("button",{class:"btn btn-primary",onClick:t[13]||(t[13]=(...i)=>o.saveDevice&&o.saveDevice(...i))},"\u4FDD\u5B58")])])])):Ie("",!0)])}const df=mn(ha,[["render",ff],["__scopeId","data-v-a2f9bd42"]]);const pf={name:"FeedPlan",data(){return{username:"",plans:[],loading:!0}},mounted(){this.username=localStorage.getItem("username")||"\u7BA1\u7406\u5458",this.loadPlans()},methods:{async loadPlans(){this.loading=!0;try{const e=await fetch("/api/v1/feed/plan/list",{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+localStorage.getItem("authToken")}}),t=await e.json();e.ok&&t.code===0?this.plans=t.data.plans||[]:console.error("\u83B7\u53D6\u9972\u5582\u8BA1\u5212\u5217\u8868\u5931\u8D25:",t.message)}catch(e){console.error("\u83B7\u53D6\u9972\u5582\u8BA1\u5212\u5217\u8868\u5931\u8D25:",e)}finally{this.loading=!1}},viewDetail(e){this.$router.push(`/feed/plan/${e}`)},createPlan(){alert("\u521B\u5EFA\u8BA1\u5212\u529F\u80FD\u5F85\u5B9E\u73B0")},editPlan(e){alert(`\u7F16\u8F91\u8BA1\u5212: ${e.name}`)},async deletePlan(e){if(!!confirm("\u786E\u5B9A\u8981\u5220\u9664\u8FD9\u4E2A\u9972\u5582\u8BA1\u5212\u5417\uFF1F"))try{const t=await fetch(`/api/v1/feed/plan/delete/${e}`,{method:"DELETE",headers:{"Content-Type":"application/json",Authorization:"Bearer "+localStorage.getItem("authToken")}}),n=await t.json();t.ok&&n.code===0?(await this.loadPlans(),alert("\u5220\u9664\u6210\u529F")):alert("\u5220\u9664\u5931\u8D25: "+n.message)}catch(t){console.error("\u5220\u9664\u9972\u5582\u8BA1\u5212\u5931\u8D25:",t),alert("\u5220\u9664\u9972\u5582\u8BA1\u5212\u5931\u8D25: "+t.message)}},logout(){localStorage.removeItem("authToken"),localStorage.removeItem("username"),this.$router.push("/")}}},hf={class:"feed-plan-management"},gf={class:"header"},mf={class:"user-info"},_f={class:"nav"},vf={class:"main-content"},yf={class:"toolbar"},bf={class:"plan-list"},xf={key:0,class:"loading"},Sf={key:1,class:"no-plans"},wf={key:2,class:"plans-container"},Cf={class:"plan-header"},Ef={class:"plan-details"},Pf={class:"plan-description"},Af={class:"plan-meta"},Rf={class:"plan-type"},Tf={key:0,class:"plan-cron"},Of={class:"plan-actions"},Mf=["onClick"],If=["onClick"],Df=["onClick"];function Ff(e,t,n,s,r,o){const l=Jn("router-link");return U(),K("div",hf,[m("div",gf,[t[2]||(t[2]=m("h1",null,"\u9972\u5582\u8BA1\u5212\u7BA1\u7406",-1)),m("div",mf,[m("span",null,"\u6B22\u8FCE, "+X(r.username),1),m("button",{class:"logout-btn",onClick:t[0]||(t[0]=(...i)=>o.logout&&o.logout(...i))},"\u9000\u51FA")])]),m("nav",_f,[m("ul",null,[m("li",null,[ie(l,{to:"/dashboard"},{default:We(()=>[...t[3]||(t[3]=[qe("\u63A7\u5236\u53F0",-1)])]),_:1})]),m("li",null,[ie(l,{to:"/device"},{default:We(()=>[...t[4]||(t[4]=[qe("\u8BBE\u5907\u7BA1\u7406",-1)])]),_:1})]),m("li",null,[ie(l,{to:"/feed/plan",class:"active"},{default:We(()=>[...t[5]||(t[5]=[qe("\u9972\u5582\u8BA1\u5212",-1)])]),_:1})])])]),m("main",vf,[m("div",yf,[m("button",{class:"btn btn-primary",onClick:t[1]||(t[1]=(...i)=>o.createPlan&&o.createPlan(...i))},"\u521B\u5EFA\u8BA1\u5212")]),m("div",bf,[r.loading?(U(),K("div",xf," \u52A0\u8F7D\u4E2D... ")):r.plans.length===0?(U(),K("div",Sf," \u6682\u65E0\u9972\u5582\u8BA1\u5212 ")):(U(),K("div",wf,[(U(!0),K(xe,null,zt(r.plans,i=>(U(),K("div",{key:i.id,class:"plan-card"},[m("div",Cf,[m("h3",null,X(i.name),1),m("span",{class:St(["plan-status",{enabled:i.enabled,disabled:!i.enabled}])},X(i.enabled?"\u5DF2\u542F\u7528":"\u5DF2\u7981\u7528"),3)]),m("div",Ef,[m("p",Pf,X(i.description||"\u6682\u65E0\u63CF\u8FF0"),1),m("div",Af,[m("span",Rf,X(i.type==="manual"?"\u624B\u52A8\u89E6\u53D1":"\u81EA\u52A8\u89E6\u53D1"),1),i.schedule_cron?(U(),K("span",Tf,"\u5B9A\u65F6: "+X(i.schedule_cron),1)):Ie("",!0)])]),m("div",Of,[m("button",{class:"action-btn detail-btn",onClick:c=>o.viewDetail(i.id)},"\u8BE6\u60C5",8,Mf),m("button",{class:"action-btn edit-btn",onClick:c=>o.editPlan(i)},"\u7F16\u8F91",8,If),m("button",{class:"action-btn delete-btn",onClick:c=>o.deletePlan(i.id)},"\u5220\u9664",8,Df)])]))),128))]))])])])}const kf=mn(pf,[["render",Ff],["__scopeId","data-v-f7b44245"]]),Nf=[{path:"/",name:"Login",component:ea},{path:"/dashboard",name:"Dashboard",component:pa,meta:{requiresAuth:!0}},{path:"/device",name:"Device",component:df,meta:{requiresAuth:!0}},{path:"/feed/plan",name:"FeedPlan",component:kf,meta:{requiresAuth:!0}}],fi=Ku({history:yu(),routes:Nf});fi.beforeEach((e,t,n)=>{const s=localStorage.getItem("authToken");e.matched.some(r=>r.meta.requiresAuth)?s?n():n("/"):s&&e.name==="Login"?n("/dashboard"):n()});const di=Nc(Bc);di.use(fi);di.mount("#app"); + */const Ot=typeof document<"u";function Xo(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function Uc(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&Xo(e.default)}const z=Object.assign;function as(e,t){const n={};for(const s in t){const r=t[s];n[s]=Ne(r)?r.map(e):e(r)}return n}const nn=()=>{},Ne=Array.isArray,Zo=/#/g,Kc=/&/g,Wc=/\//g,qc=/=/g,zc=/\?/g,ei=/\+/g,Gc=/%5B/g,Jc=/%5D/g,ti=/%5E/g,Yc=/%60/g,ni=/%7B/g,Qc=/%7C/g,si=/%7D/g,Xc=/%20/g;function Ws(e){return encodeURI(""+e).replace(Qc,"|").replace(Gc,"[").replace(Jc,"]")}function Zc(e){return Ws(e).replace(ni,"{").replace(si,"}").replace(ti,"^")}function ws(e){return Ws(e).replace(ei,"%2B").replace(Xc,"+").replace(Zo,"%23").replace(Kc,"%26").replace(Yc,"`").replace(ni,"{").replace(si,"}").replace(ti,"^")}function eu(e){return ws(e).replace(qc,"%3D")}function tu(e){return Ws(e).replace(Zo,"%23").replace(zc,"%3F")}function nu(e){return e==null?"":tu(e).replace(Wc,"%2F")}function an(e){try{return decodeURIComponent(""+e)}catch{}return""+e}const su=/\/$/,ru=e=>e.replace(su,"");function fs(e,t,n="/"){let s,r={},o="",l="";const i=t.indexOf("#");let c=t.indexOf("?");return i=0&&(c=-1),c>-1&&(s=t.slice(0,c),o=t.slice(c+1,i>-1?i:t.length),r=e(o)),i>-1&&(s=s||t.slice(0,i),l=t.slice(i,t.length)),s=cu(s!=null?s:t,n),{fullPath:s+(o&&"?")+o+l,path:s,query:r,hash:an(l)}}function ou(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function Rr(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function iu(e,t,n){const s=t.matched.length-1,r=n.matched.length-1;return s>-1&&s===r&&Ht(t.matched[s],n.matched[r])&&ri(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function Ht(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function ri(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!lu(e[n],t[n]))return!1;return!0}function lu(e,t){return Ne(e)?Tr(e,t):Ne(t)?Tr(t,e):e===t}function Tr(e,t){return Ne(t)?e.length===t.length&&e.every((n,s)=>n===t[s]):e.length===1&&e[0]===t}function cu(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),s=e.split("/"),r=s[s.length-1];(r===".."||r===".")&&s.push("");let o=n.length-1,l,i;for(l=0;l1&&o--;else break;return n.slice(0,o).join("/")+"/"+s.slice(l).join("/")}const ct={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};var fn;(function(e){e.pop="pop",e.push="push"})(fn||(fn={}));var sn;(function(e){e.back="back",e.forward="forward",e.unknown=""})(sn||(sn={}));function uu(e){if(!e)if(Ot){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),ru(e)}const au=/^[^#]+#/;function fu(e,t){return e.replace(au,"#")+t}function du(e,t){const n=document.documentElement.getBoundingClientRect(),s=e.getBoundingClientRect();return{behavior:t.behavior,left:s.left-n.left-(t.left||0),top:s.top-n.top-(t.top||0)}}const Zn=()=>({left:window.scrollX,top:window.scrollY});function pu(e){let t;if("el"in e){const n=e.el,s=typeof n=="string"&&n.startsWith("#"),r=typeof n=="string"?s?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!r)return;t=du(r,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function Or(e,t){return(history.state?history.state.position-t:-1)+e}const Cs=new Map;function hu(e,t){Cs.set(e,t)}function gu(e){const t=Cs.get(e);return Cs.delete(e),t}let mu=()=>location.protocol+"//"+location.host;function oi(e,t){const{pathname:n,search:s,hash:r}=t,o=e.indexOf("#");if(o>-1){let i=r.includes(e.slice(o))?e.slice(o).length:1,c=r.slice(i);return c[0]!=="/"&&(c="/"+c),Rr(c,"")}return Rr(n,e)+s+r}function _u(e,t,n,s){let r=[],o=[],l=null;const i=({state:g})=>{const _=oi(e,location),R=n.value,O=t.value;let V=0;if(g){if(n.value=_,t.value=g,l&&l===R){l=null;return}V=O?g.position-O.position:0}else s(_);r.forEach(k=>{k(n.value,R,{delta:V,type:fn.pop,direction:V?V>0?sn.forward:sn.back:sn.unknown})})};function c(){l=n.value}function d(g){r.push(g);const _=()=>{const R=r.indexOf(g);R>-1&&r.splice(R,1)};return o.push(_),_}function a(){const{history:g}=window;!g.state||g.replaceState(z({},g.state,{scroll:Zn()}),"")}function p(){for(const g of o)g();o=[],window.removeEventListener("popstate",i),window.removeEventListener("beforeunload",a)}return window.addEventListener("popstate",i),window.addEventListener("beforeunload",a,{passive:!0}),{pauseListeners:c,listen:d,destroy:p}}function Mr(e,t,n,s=!1,r=!1){return{back:e,current:t,forward:n,replaced:s,position:window.history.length,scroll:r?Zn():null}}function vu(e){const{history:t,location:n}=window,s={value:oi(e,n)},r={value:t.state};r.value||o(s.value,{back:null,current:s.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function o(c,d,a){const p=e.indexOf("#"),g=p>-1?(n.host&&document.querySelector("base")?e:e.slice(p))+c:mu()+e+c;try{t[a?"replaceState":"pushState"](d,"",g),r.value=d}catch(_){console.error(_),n[a?"replace":"assign"](g)}}function l(c,d){const a=z({},t.state,Mr(r.value.back,c,r.value.forward,!0),d,{position:r.value.position});o(c,a,!0),s.value=c}function i(c,d){const a=z({},r.value,t.state,{forward:c,scroll:Zn()});o(a.current,a,!0);const p=z({},Mr(s.value,c,null),{position:a.position+1},d);o(c,p,!1),s.value=c}return{location:s,state:r,push:i,replace:l}}function yu(e){e=uu(e);const t=vu(e),n=_u(e,t.state,t.location,t.replace);function s(o,l=!0){l||n.pauseListeners(),history.go(o)}const r=z({location:"",base:e,go:s,createHref:fu.bind(null,e)},t,n);return Object.defineProperty(r,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(r,"state",{enumerable:!0,get:()=>t.state.value}),r}function bu(e){return typeof e=="string"||e&&typeof e=="object"}function ii(e){return typeof e=="string"||typeof e=="symbol"}const li=Symbol("");var Ir;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(Ir||(Ir={}));function $t(e,t){return z(new Error,{type:e,[li]:!0},t)}function Qe(e,t){return e instanceof Error&&li in e&&(t==null||!!(e.type&t))}const Dr="[^/]+?",xu={sensitive:!1,strict:!1,start:!0,end:!0},Su=/[.+*?^${}()[\]/\\]/g;function wu(e,t){const n=z({},xu,t),s=[];let r=n.start?"^":"";const o=[];for(const d of e){const a=d.length?[]:[90];n.strict&&!d.length&&(r+="/");for(let p=0;pt.length?t.length===1&&t[0]===40+40?1:-1:0}function ci(e,t){let n=0;const s=e.score,r=t.score;for(;n0&&t[t.length-1]<0}const Eu={type:0,value:""},Pu=/[a-zA-Z0-9_]/;function Au(e){if(!e)return[[]];if(e==="/")return[[Eu]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(_){throw new Error(`ERR (${n})/"${d}": ${_}`)}let n=0,s=n;const r=[];let o;function l(){o&&r.push(o),o=[]}let i=0,c,d="",a="";function p(){!d||(n===0?o.push({type:0,value:d}):n===1||n===2||n===3?(o.length>1&&(c==="*"||c==="+")&&t(`A repeatable param (${d}) must be alone in its segment. eg: '/:ids+.`),o.push({type:1,value:d,regexp:a,repeatable:c==="*"||c==="+",optional:c==="*"||c==="?"})):t("Invalid state to consume buffer"),d="")}function g(){d+=c}for(;i{l(N)}:nn}function l(p){if(ii(p)){const g=s.get(p);g&&(s.delete(p),n.splice(n.indexOf(g),1),g.children.forEach(l),g.alias.forEach(l))}else{const g=n.indexOf(p);g>-1&&(n.splice(g,1),p.record.name&&s.delete(p.record.name),p.children.forEach(l),p.alias.forEach(l))}}function i(){return n}function c(p){const g=Iu(p,n);n.splice(g,0,p),p.record.name&&!Lr(p)&&s.set(p.record.name,p)}function d(p,g){let _,R={},O,V;if("name"in p&&p.name){if(_=s.get(p.name),!_)throw $t(1,{location:p});V=_.record.name,R=z(kr(g.params,_.keys.filter(N=>!N.optional).concat(_.parent?_.parent.keys.filter(N=>N.optional):[]).map(N=>N.name)),p.params&&kr(p.params,_.keys.map(N=>N.name))),O=_.stringify(R)}else if(p.path!=null)O=p.path,_=n.find(N=>N.re.test(O)),_&&(R=_.parse(O),V=_.record.name);else{if(_=g.name?s.get(g.name):n.find(N=>N.re.test(g.path)),!_)throw $t(1,{location:p,currentLocation:g});V=_.record.name,R=z({},g.params,p.params),O=_.stringify(R)}const k=[];let M=_;for(;M;)k.unshift(M.record),M=M.parent;return{name:V,path:O,params:R,matched:k,meta:Mu(k)}}e.forEach(p=>o(p));function a(){n.length=0,s.clear()}return{addRoute:o,resolve:d,removeRoute:l,clearRoutes:a,getRoutes:i,getRecordMatcher:r}}function kr(e,t){const n={};for(const s of t)s in e&&(n[s]=e[s]);return n}function Nr(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:Ou(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function Ou(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const s in e.components)t[s]=typeof n=="object"?n[s]:n;return t}function Lr(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Mu(e){return e.reduce((t,n)=>z(t,n.meta),{})}function jr(e,t){const n={};for(const s in e)n[s]=s in t?t[s]:e[s];return n}function Iu(e,t){let n=0,s=t.length;for(;n!==s;){const o=n+s>>1;ci(e,t[o])<0?s=o:n=o+1}const r=Du(e);return r&&(s=t.lastIndexOf(r,s-1)),s}function Du(e){let t=e;for(;t=t.parent;)if(ui(t)&&ci(e,t)===0)return t}function ui({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function Fu(e){const t={};if(e===""||e==="?")return t;const s=(e[0]==="?"?e.slice(1):e).split("&");for(let r=0;ro&&ws(o)):[s&&ws(s)]).forEach(o=>{o!==void 0&&(t+=(t.length?"&":"")+n,o!=null&&(t+="="+o))})}return t}function ku(e){const t={};for(const n in e){const s=e[n];s!==void 0&&(t[n]=Ne(s)?s.map(r=>r==null?null:""+r):s==null?s:""+s)}return t}const Nu=Symbol(""),$r=Symbol(""),qs=Symbol(""),ai=Symbol(""),Es=Symbol("");function qt(){let e=[];function t(s){return e.push(s),()=>{const r=e.indexOf(s);r>-1&&e.splice(r,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function dt(e,t,n,s,r,o=l=>l()){const l=s&&(s.enterCallbacks[r]=s.enterCallbacks[r]||[]);return()=>new Promise((i,c)=>{const d=g=>{g===!1?c($t(4,{from:n,to:t})):g instanceof Error?c(g):bu(g)?c($t(2,{from:t,to:g})):(l&&s.enterCallbacks[r]===l&&typeof g=="function"&&l.push(g),i())},a=o(()=>e.call(s&&s.instances[r],t,n,d));let p=Promise.resolve(a);e.length<3&&(p=p.then(d)),p.catch(g=>c(g))})}function ds(e,t,n,s,r=o=>o()){const o=[];for(const l of e)for(const i in l.components){let c=l.components[i];if(!(t!=="beforeRouteEnter"&&!l.instances[i]))if(Xo(c)){const a=(c.__vccOpts||c)[t];a&&o.push(dt(a,n,s,l,i,r))}else{let d=c();o.push(()=>d.then(a=>{if(!a)throw new Error(`Couldn't resolve component "${i}" at "${l.path}"`);const p=Uc(a)?a.default:a;l.mods[i]=a,l.components[i]=p;const _=(p.__vccOpts||p)[t];return _&&dt(_,n,s,l,i,r)()}))}}return o}function Vr(e){const t=tt(qs),n=tt(ai),s=De(()=>{const c=Ft(e.to);return t.resolve(c)}),r=De(()=>{const{matched:c}=s.value,{length:d}=c,a=c[d-1],p=n.matched;if(!a||!p.length)return-1;const g=p.findIndex(Ht.bind(null,a));if(g>-1)return g;const _=Br(c[d-2]);return d>1&&Br(a)===_&&p[p.length-1].path!==_?p.findIndex(Ht.bind(null,c[d-2])):g}),o=De(()=>r.value>-1&&Vu(n.params,s.value.params)),l=De(()=>r.value>-1&&r.value===n.matched.length-1&&ri(n.params,s.value.params));function i(c={}){if($u(c)){const d=t[Ft(e.replace)?"replace":"push"](Ft(e.to)).catch(nn);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>d),d}return Promise.resolve()}return{route:s,href:De(()=>s.value.href),isActive:o,isExactActive:l,navigate:i}}function Lu(e){return e.length===1?e[0]:e}const ju=wo({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:Vr,setup(e,{slots:t}){const n=qn(Vr(e)),{options:s}=tt(qs),r=De(()=>({[Ur(e.activeClass,s.linkActiveClass,"router-link-active")]:n.isActive,[Ur(e.exactActiveClass,s.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const o=t.default&&Lu(t.default(n));return e.custom?o:Jo("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:r.value},o)}}}),Hu=ju;function $u(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function Vu(e,t){for(const n in t){const s=t[n],r=e[n];if(typeof s=="string"){if(s!==r)return!1}else if(!Ne(r)||r.length!==s.length||s.some((o,l)=>o!==r[l]))return!1}return!0}function Br(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const Ur=(e,t,n)=>e!=null?e:t!=null?t:n,Bu=wo({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const s=tt(Es),r=De(()=>e.route||s.value),o=tt($r,0),l=De(()=>{let d=Ft(o);const{matched:a}=r.value;let p;for(;(p=a[d])&&!p.components;)d++;return d}),i=De(()=>r.value.matched[l.value]);Sn($r,De(()=>l.value+1)),Sn(Nu,i),Sn(Es,r);const c=qi();return wn(()=>[c.value,i.value,e.name],([d,a,p],[g,_,R])=>{a&&(a.instances[p]=d,_&&_!==a&&d&&d===g&&(a.leaveGuards.size||(a.leaveGuards=_.leaveGuards),a.updateGuards.size||(a.updateGuards=_.updateGuards))),d&&a&&(!_||!Ht(a,_)||!g)&&(a.enterCallbacks[p]||[]).forEach(O=>O(d))},{flush:"post"}),()=>{const d=r.value,a=e.name,p=i.value,g=p&&p.components[a];if(!g)return Kr(n.default,{Component:g,route:d});const _=p.props[a],R=_?_===!0?d.params:typeof _=="function"?_(d):_:null,V=Jo(g,z({},R,t,{onVnodeUnmounted:k=>{k.component.isUnmounted&&(p.instances[a]=null)},ref:c}));return Kr(n.default,{Component:V,route:d})||V}}});function Kr(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const Uu=Bu;function Ku(e){const t=Tu(e.routes,e),n=e.parseQuery||Fu,s=e.stringifyQuery||Hr,r=e.history,o=qt(),l=qt(),i=qt(),c=zi(ct);let d=ct;Ot&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const a=as.bind(null,y=>""+y),p=as.bind(null,nu),g=as.bind(null,an);function _(y,T){let P,I;return ii(y)?(P=t.getRecordMatcher(y),I=T):I=y,t.addRoute(I,P)}function R(y){const T=t.getRecordMatcher(y);T&&t.removeRoute(T)}function O(){return t.getRoutes().map(y=>y.record)}function V(y){return!!t.getRecordMatcher(y)}function k(y,T){if(T=z({},T||c.value),typeof y=="string"){const f=fs(n,y,T.path),h=t.resolve({path:f.path},T),b=r.createHref(f.fullPath);return z(f,h,{params:g(h.params),hash:an(f.hash),redirectedFrom:void 0,href:b})}let P;if(y.path!=null)P=z({},y,{path:fs(n,y.path,T.path).path});else{const f=z({},y.params);for(const h in f)f[h]==null&&delete f[h];P=z({},y,{params:p(f)}),T.params=p(T.params)}const I=t.resolve(P,T),q=y.hash||"";I.params=a(g(I.params));const re=ou(s,z({},y,{hash:Zc(q),path:I.path})),u=r.createHref(re);return z({fullPath:re,hash:q,query:s===Hr?ku(y.query):y.query||{}},I,{redirectedFrom:void 0,href:u})}function M(y){return typeof y=="string"?fs(n,y,c.value.path):z({},y)}function N(y,T){if(d!==y)return $t(8,{from:T,to:y})}function D(y){return oe(y)}function Z(y){return D(z(M(y),{replace:!0}))}function ae(y){const T=y.matched[y.matched.length-1];if(T&&T.redirect){const{redirect:P}=T;let I=typeof P=="function"?P(y):P;return typeof I=="string"&&(I=I.includes("?")||I.includes("#")?I=M(I):{path:I},I.params={}),z({query:y.query,hash:y.hash,params:I.path!=null?{}:y.params},I)}}function oe(y,T){const P=d=k(y),I=c.value,q=y.state,re=y.force,u=y.replace===!0,f=ae(P);if(f)return oe(z(M(f),{state:typeof f=="object"?z({},q,f.state):q,force:re,replace:u}),T||P);const h=P;h.redirectedFrom=T;let b;return!re&&iu(s,I,P)&&(b=$t(16,{to:h,from:I}),$e(I,I,!0,!1)),(b?Promise.resolve(b):je(h,I)).catch(v=>Qe(v)?Qe(v,2)?v:lt(v):W(v,h,I)).then(v=>{if(v){if(Qe(v,2))return oe(z({replace:u},M(v.to),{state:typeof v.to=="object"?z({},q,v.to.state):q,force:re}),T||h)}else v=mt(h,I,!0,u,q);return it(h,I,v),v})}function Le(y,T){const P=N(y,T);return P?Promise.reject(P):Promise.resolve()}function ot(y){const T=At.values().next().value;return T&&typeof T.runWithContext=="function"?T.runWithContext(y):y()}function je(y,T){let P;const[I,q,re]=Wu(y,T);P=ds(I.reverse(),"beforeRouteLeave",y,T);for(const f of I)f.leaveGuards.forEach(h=>{P.push(dt(h,y,T))});const u=Le.bind(null,y,T);return P.push(u),Ae(P).then(()=>{P=[];for(const f of o.list())P.push(dt(f,y,T));return P.push(u),Ae(P)}).then(()=>{P=ds(q,"beforeRouteUpdate",y,T);for(const f of q)f.updateGuards.forEach(h=>{P.push(dt(h,y,T))});return P.push(u),Ae(P)}).then(()=>{P=[];for(const f of re)if(f.beforeEnter)if(Ne(f.beforeEnter))for(const h of f.beforeEnter)P.push(dt(h,y,T));else P.push(dt(f.beforeEnter,y,T));return P.push(u),Ae(P)}).then(()=>(y.matched.forEach(f=>f.enterCallbacks={}),P=ds(re,"beforeRouteEnter",y,T,ot),P.push(u),Ae(P))).then(()=>{P=[];for(const f of l.list())P.push(dt(f,y,T));return P.push(u),Ae(P)}).catch(f=>Qe(f,8)?f:Promise.reject(f))}function it(y,T,P){i.list().forEach(I=>ot(()=>I(y,T,P)))}function mt(y,T,P,I,q){const re=N(y,T);if(re)return re;const u=T===ct,f=Ot?history.state:{};P&&(I||u?r.replace(y.fullPath,z({scroll:u&&f&&f.scroll},q)):r.push(y.fullPath,q)),c.value=y,$e(y,T,P,u),lt()}let He;function Vt(){He||(He=r.listen((y,T,P)=>{if(!_n.listening)return;const I=k(y),q=ae(I);if(q){oe(z(q,{replace:!0,force:!0}),I).catch(nn);return}d=I;const re=c.value;Ot&&hu(Or(re.fullPath,P.delta),Zn()),je(I,re).catch(u=>Qe(u,12)?u:Qe(u,2)?(oe(z(M(u.to),{force:!0}),I).then(f=>{Qe(f,20)&&!P.delta&&P.type===fn.pop&&r.go(-1,!1)}).catch(nn),Promise.reject()):(P.delta&&r.go(-P.delta,!1),W(u,I,re))).then(u=>{u=u||mt(I,re,!1),u&&(P.delta&&!Qe(u,8)?r.go(-P.delta,!1):P.type===fn.pop&&Qe(u,20)&&r.go(-1,!1)),it(I,re,u)}).catch(nn)}))}let Et=qt(),ce=qt(),Q;function W(y,T,P){lt(y);const I=ce.list();return I.length?I.forEach(q=>q(y,T,P)):console.error(y),Promise.reject(y)}function Je(){return Q&&c.value!==ct?Promise.resolve():new Promise((y,T)=>{Et.add([y,T])})}function lt(y){return Q||(Q=!y,Vt(),Et.list().forEach(([T,P])=>y?P(y):T()),Et.reset()),y}function $e(y,T,P,I){const{scrollBehavior:q}=e;if(!Ot||!q)return Promise.resolve();const re=!P&&gu(Or(y.fullPath,0))||(I||!P)&&history.state&&history.state.scroll||null;return js().then(()=>q(y,T,re)).then(u=>u&&pu(u)).catch(u=>W(u,y,T))}const ve=y=>r.go(y);let Pt;const At=new Set,_n={currentRoute:c,listening:!0,addRoute:_,removeRoute:R,clearRoutes:t.clearRoutes,hasRoute:V,getRoutes:O,resolve:k,options:e,push:D,replace:Z,go:ve,back:()=>ve(-1),forward:()=>ve(1),beforeEach:o.add,beforeResolve:l.add,afterEach:i.add,onError:ce.add,isReady:Je,install(y){const T=this;y.component("RouterLink",Hu),y.component("RouterView",Uu),y.config.globalProperties.$router=T,Object.defineProperty(y.config.globalProperties,"$route",{enumerable:!0,get:()=>Ft(c)}),Ot&&!Pt&&c.value===ct&&(Pt=!0,D(r.location).catch(q=>{}));const P={};for(const q in ct)Object.defineProperty(P,q,{get:()=>c.value[q],enumerable:!0});y.provide(qs,T),y.provide(ai,ho(P)),y.provide(Es,c);const I=y.unmount;At.add(y),y.unmount=function(){At.delete(y),At.size<1&&(d=ct,He&&He(),He=null,c.value=ct,Pt=!1,Q=!1),I()}}};function Ae(y){return y.reduce((T,P)=>T.then(()=>ot(P)),Promise.resolve())}return _n}function Wu(e,t){const n=[],s=[],r=[],o=Math.max(t.matched.length,e.matched.length);for(let l=0;lHt(d,i))?s.push(i):n.push(i));const c=e.matched[l];c&&(t.matched.find(d=>Ht(d,c))||r.push(c))}return[n,s,r]}const qu={name:"Login",data(){return{loginForm:{username:"",password:""},loading:!1,error:"",success:""}},methods:{async handleLogin(){this.loading=!0,this.error="",this.success="";try{const e=await fetch("/api/v1/user/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(this.loginForm)}),t=await e.json();e.ok&&t.code===0?(this.success=t.message,localStorage.setItem("authToken",t.data.token),localStorage.setItem("userId",t.data.id),localStorage.setItem("username",t.data.username),setTimeout(()=>{this.$router.push("/dashboard")},500)):this.error=t.message||"\u767B\u5F55\u5931\u8D25"}catch{this.error="\u7F51\u7EDC\u9519\u8BEF\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5"}finally{this.loading=!1}}}},zu={class:"login-container"},Gu={class:"form-group"},Ju={class:"form-group"},Yu=["disabled"],Qu={key:0,class:"error-message"},Xu={key:1,class:"success-message"};function Zu(e,t,n,s,r,o){return U(),K("div",zu,[t[5]||(t[5]=m("div",{class:"logo"},"\u{1F437}",-1)),t[6]||(t[6]=m("h1",null,"\u732A\u573A\u7BA1\u7406\u7CFB\u7EDF",-1)),t[7]||(t[7]=m("p",{class:"subtitle"},"\u8BF7\u767B\u5F55\u60A8\u7684\u8D26\u6237",-1)),m("form",{onSubmit:t[2]||(t[2]=ut((...l)=>o.handleLogin&&o.handleLogin(...l),["prevent"]))},[m("div",Gu,[t[3]||(t[3]=m("label",{for:"username"},"\u7528\u6237\u540D",-1)),Me(m("input",{type:"text",id:"username","onUpdate:modelValue":t[0]||(t[0]=l=>r.loginForm.username=l),required:"",placeholder:"\u8BF7\u8F93\u5165\u7528\u6237\u540D"},null,512),[[xt,r.loginForm.username]])]),m("div",Ju,[t[4]||(t[4]=m("label",{for:"password"},"\u5BC6\u7801",-1)),Me(m("input",{type:"password",id:"password","onUpdate:modelValue":t[1]||(t[1]=l=>r.loginForm.password=l),required:"",placeholder:"\u8BF7\u8F93\u5165\u5BC6\u7801"},null,512),[[xt,r.loginForm.password]])]),m("button",{type:"submit",disabled:r.loading},X(r.loading?"\u767B\u5F55\u4E2D...":"\u767B\u5F55"),9,Yu)],32),r.error?(U(),K("div",Qu,X(r.error),1)):Ie("",!0),r.success?(U(),K("div",Xu,X(r.success),1)):Ie("",!0)])}const ea=mn(qu,[["render",Zu],["__scopeId","data-v-bb5c78dc"]]);const ta={name:"Dashboard",data(){return{username:localStorage.getItem("username")||"\u7BA1\u7406\u5458"}},methods:{logout(){localStorage.removeItem("authToken"),localStorage.removeItem("userId"),localStorage.removeItem("username"),this.$router.push("/")},controlDevice(e,t){alert(`\u6B63\u5728${t==="on"?"\u5F00\u542F":"\u5173\u95ED"}${e==="fan"?"\u98CE\u673A":"\u6C34\u5E18"}`)}}},na={class:"header"},sa={class:"user-info"},ra={class:"nav"},oa={class:"container"},ia={class:"device-control"},la={class:"control-grid"},ca={class:"control-item"},ua={class:"control-buttons"},aa={class:"control-item"},fa={class:"control-buttons"};function da(e,t,n,s,r,o){const l=Jn("router-link");return U(),K("div",null,[m("div",na,[t[5]||(t[5]=m("h1",null,"\u{1F437} \u732A\u573A\u7BA1\u7406\u7CFB\u7EDF",-1)),m("div",sa,[m("span",null,X(r.username),1),m("button",{class:"logout-btn",onClick:t[0]||(t[0]=(...i)=>o.logout&&o.logout(...i))},"\u9000\u51FA\u767B\u5F55")])]),m("div",ra,[m("ul",null,[m("li",null,[ie(l,{to:"/dashboard",class:"active"},{default:We(()=>[...t[6]||(t[6]=[qe("\u63A7\u5236\u53F0",-1)])]),_:1})]),m("li",null,[ie(l,{to:"/device"},{default:We(()=>[...t[7]||(t[7]=[qe("\u8BBE\u5907\u7BA1\u7406",-1)])]),_:1})]),m("li",null,[ie(l,{to:"/feed/plan"},{default:We(()=>[...t[8]||(t[8]=[qe("\u9972\u5582\u8BA1\u5212",-1)])]),_:1})])])]),m("div",oa,[t[12]||(t[12]=m("div",{class:"dashboard-grid"},[m("div",{class:"card"},[m("h3",null,"\u{1F4C8} \u73AF\u5883\u76D1\u63A7"),m("p",null,"\u5B9E\u65F6\u76D1\u63A7\u732A\u820D\u73AF\u5883\u53C2\u6570\uFF0C\u5305\u62EC\u6E29\u5EA6\u3001\u6E7F\u5EA6\u3001\u6C28\u6C14\u6D53\u5EA6\u7B49\u5173\u952E\u6307\u6807\u3002")]),m("div",{class:"card"},[m("h3",null,"\u{1F514} \u544A\u8B66\u4FE1\u606F"),m("p",null,"\u67E5\u770B\u7CFB\u7EDF\u544A\u8B66\u548C\u5F02\u5E38\u60C5\u51B5\uFF0C\u53CA\u65F6\u5904\u7406\u5404\u79CD\u8BBE\u5907\u6545\u969C\u548C\u73AF\u5883\u5F02\u5E38\u3002")]),m("div",{class:"card"},[m("h3",null,"\u{1F4CA} \u6570\u636E\u5206\u6790"),m("p",null,"\u5206\u6790\u5386\u53F2\u6570\u636E\uFF0C\u751F\u6210\u8D8B\u52BF\u56FE\u8868\uFF0C\u4E3A\u517B\u6B96\u51B3\u7B56\u63D0\u4F9B\u6570\u636E\u652F\u6301\u3002")])],-1)),m("div",ia,[t[11]||(t[11]=m("h3",null,"\u2699\uFE0F \u8BBE\u5907\u63A7\u5236",-1)),m("div",la,[m("div",ca,[t[9]||(t[9]=m("h4",null,"\u98CE\u673A\u63A7\u5236",-1)),m("div",ua,[m("button",{class:"control-btn on-btn",onClick:t[1]||(t[1]=i=>o.controlDevice("fan","on"))},"\u5F00\u542F"),m("button",{class:"control-btn off-btn",onClick:t[2]||(t[2]=i=>o.controlDevice("fan","off"))},"\u5173\u95ED")])]),m("div",aa,[t[10]||(t[10]=m("h4",null,"\u6C34\u5E18\u63A7\u5236",-1)),m("div",fa,[m("button",{class:"control-btn on-btn",onClick:t[3]||(t[3]=i=>o.controlDevice("water_curtain","on"))},"\u5F00\u542F"),m("button",{class:"control-btn off-btn",onClick:t[4]||(t[4]=i=>o.controlDevice("water_curtain","off"))},"\u5173\u95ED")])])])])])])}const pa=mn(ta,[["render",da],["__scopeId","data-v-904f2d71"]]);const ha={name:"Device",data(){return{username:localStorage.getItem("username")||"\u7BA1\u7406\u5458",devices:[],showModal:!1,editingDevice:null,deviceForm:{id:null,name:"",type:"",parent_id:null,address:null,bus_number:null,device_address:null},expandedNodes:new Set}},computed:{relayDevices(){return this.devices.filter(e=>e.type==="relay")}},mounted(){this.loadDevices()},methods:{logout(){localStorage.removeItem("authToken"),localStorage.removeItem("userId"),localStorage.removeItem("username"),this.$router.push("/")},toggleNode(e){this.expandedNodes.has(e)?this.expandedNodes.delete(e):this.expandedNodes.add(e)},getControllerDevices(e){return this.devices.filter(t=>t.parent_id===e&&(t.type==="pig_pen_controller"||t.type==="feed_mill_controller"))},getLeafDevices(e){return this.devices.filter(t=>t.parent_id===e&&(t.type==="fan"||t.type==="water_curtain"))},getDeviceTypeText(e){return{relay:"\u4E2D\u7EE7",pig_pen_controller:"\u732A\u820D\u4E3B\u63A7",feed_mill_controller:"\u505A\u6599\u8F66\u95F4\u4E3B\u63A7",fan:"\u98CE\u673A",water_curtain:"\u6C34\u5E18"}[e]||e},getParentDevices(e){return e==="pig_pen_controller"||e==="feed_mill_controller"?this.devices.filter(t=>t.type==="relay"):e==="fan"||e==="water_curtain"?this.devices.filter(t=>t.type==="pig_pen_controller"||t.type==="feed_mill_controller"):[]},getParentDevicesWithDisplayName(e){const t=this.getParentDevices(e);return e==="pig_pen_controller"||e==="feed_mill_controller"?t.map(n=>({...n,display_name:n.name})):e==="fan"||e==="water_curtain"?t.map(n=>{const s=this.devices.find(o=>o.id===n.parent_id),r=s?s.name:"\u672A\u77E5\u4E2D\u7EE7";return{...n,display_name:`${r} - ${n.name}`}}):[]},async loadDevices(){try{const e=await fetch("/api/v1/device/list",{headers:{Authorization:"Bearer "+localStorage.getItem("authToken")}}),t=await e.json();e.ok&&t.code===0?(this.devices=t.data.devices,this.expandAllNodes()):console.error("\u83B7\u53D6\u8BBE\u5907\u5217\u8868\u5931\u8D25:",t.message)}catch(e){console.error("\u83B7\u53D6\u8BBE\u5907\u5217\u8868\u5931\u8D25:",e)}},expandAllNodes(){this.expandedNodes.clear(),this.relayDevices.forEach(e=>{this.expandedNodes.add(e.id),this.getControllerDevices(e.id).forEach(n=>{this.expandedNodes.add(n.id)})})},openAddDeviceModal(){this.editingDevice=null,this.deviceForm={id:null,name:"",type:"",parent_id:null,address:null,bus_number:null,device_address:null},this.showModal=!0},editDevice(e){if(this.editingDevice=e,this.deviceForm={...e},(e.type==="fan"||e.type==="water_curtain")&&e.address){const t=e.address.split(":");t.length===2?(this.deviceForm.bus_number=parseInt(t[0]),this.deviceForm.device_address=t[1]):this.deviceForm.device_address=e.address}this.showModal=!0},initializeDeviceForm(){return{id:null,name:"",type:"",parent_id:null,address:null}},closeDeviceModal(){this.showModal=!1},async saveDevice(){if(!this.deviceForm.name||!this.deviceForm.type){alert("\u8BF7\u586B\u5199\u5FC5\u586B\u5B57\u6BB5");return}if(this.deviceForm.type!=="relay"&&!this.deviceForm.parent_id){alert("\u8BF7\u9009\u62E9\u4E0A\u7EA7\u8BBE\u5907");return}try{let e,t;const n={name:this.deviceForm.name,type:this.deviceForm.type,parent_id:this.deviceForm.parent_id,address:this.deviceForm.address,bus_number:this.deviceForm.bus_number,device_address:this.deviceForm.device_address};this.editingDevice?(e="/api/v1/device/update",t="POST",n.id=this.deviceForm.id):(e="/api/v1/device/create",t="POST");const s=await fetch(e,{method:t,headers:{"Content-Type":"application/json",Authorization:"Bearer "+localStorage.getItem("authToken")},body:JSON.stringify(n)}),r=await s.json();s.ok&&r.code===0?(await this.loadDevices(),this.closeDeviceModal()):alert("\u4FDD\u5B58\u5931\u8D25: "+r.message)}catch(e){console.error("\u4FDD\u5B58\u8BBE\u5907\u5931\u8D25:",e),alert("\u4FDD\u5B58\u8BBE\u5907\u5931\u8D25: "+e.message)}},async deleteDevice(e){if(!!confirm("\u786E\u5B9A\u8981\u5220\u9664\u8FD9\u4E2A\u8BBE\u5907\u5417\uFF1F"))try{const t=await fetch("/api/v1/device/delete",{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+localStorage.getItem("authToken")},body:JSON.stringify({id:e})}),n=await t.json();t.ok&&n.code===0?await this.loadDevices():alert("\u5220\u9664\u5931\u8D25: "+n.message)}catch(t){console.error("\u5220\u9664\u8BBE\u5907\u5931\u8D25:",t),alert("\u5220\u9664\u8BBE\u5907\u5931\u8D25: "+t.message)}},toggleParentField(){this.deviceForm.type==="relay"&&(this.deviceForm.parent_id=null)},toggleNode(e){this.expandedNodes.has(e)?this.expandedNodes.delete(e):this.expandedNodes.add(e)}}},ga={class:"device-management"},ma={class:"header"},_a={class:"user-info"},va={class:"nav"},ya={class:"main-content"},ba={class:"toolbar"},xa={class:"device-tree"},Sa={key:0,class:"no-devices"},wa={key:1},Ca=["onClick"],Ea={class:"node-info"},Pa={class:"toggle-icon"},Aa={class:"node-title"},Ra={class:"node-type relay-type"},Ta={key:0,class:"node-address"},Oa={class:"node-actions"},Ma=["onClick"],Ia=["onClick"],Da={class:"children-container"},Fa=["onClick"],ka={class:"node-info"},Na={class:"toggle-icon"},La={class:"node-title"},ja={class:"node-type controller-type"},Ha={key:0,class:"node-address"},$a={class:"node-actions"},Va=["onClick"],Ba=["onClick"],Ua={class:"children-container"},Ka={class:"node-header"},Wa={class:"node-info"},qa={class:"node-title"},za={class:"node-type device-type"},Ga={key:0,class:"node-address"},Ja={class:"node-actions"},Ya=["onClick"],Qa=["onClick"],Xa={key:0,class:"modal"},Za={class:"modal-content"},ef={class:"modal-header"},tf={class:"modal-body"},nf={class:"form-group"},sf={class:"form-group"},rf={key:0,class:"form-group"},of={key:1,class:"form-group"},lf={key:2,class:"form-group"},cf={key:3,class:"form-group"},uf=["value"],af={class:"modal-footer"};function ff(e,t,n,s,r,o){const l=Jn("router-link");return U(),K("div",ga,[m("header",ma,[t[14]||(t[14]=m("h1",null,"\u8BBE\u5907\u7BA1\u7406",-1)),m("div",_a,[m("span",null,"\u6B22\u8FCE, "+X(r.username),1),m("button",{class:"logout-btn",onClick:t[0]||(t[0]=(...i)=>o.logout&&o.logout(...i))},"\u9000\u51FA")])]),m("nav",va,[m("ul",null,[m("li",null,[ie(l,{to:"/dashboard"},{default:We(()=>[...t[15]||(t[15]=[qe("\u63A7\u5236\u53F0",-1)])]),_:1})]),m("li",null,[ie(l,{to:"/device",class:"active"},{default:We(()=>[...t[16]||(t[16]=[qe("\u8BBE\u5907\u7BA1\u7406",-1)])]),_:1})]),m("li",null,[ie(l,{to:"/feed/plan"},{default:We(()=>[...t[17]||(t[17]=[qe("\u9972\u5582\u8BA1\u5212",-1)])]),_:1})])])]),m("main",ya,[m("div",ba,[m("button",{class:"btn btn-primary",onClick:t[1]||(t[1]=(...i)=>o.openAddDeviceModal&&o.openAddDeviceModal(...i))},"\u6DFB\u52A0\u8BBE\u5907")]),m("div",xa,[r.devices.length===0?(U(),K("div",Sa," \u6682\u65E0\u8BBE\u5907\u6570\u636E ")):(U(),K("div",wa,[(U(!0),K(xe,null,zt(o.relayDevices,i=>(U(),K("div",{key:i.id,class:"tree-node relay-node"},[m("div",{class:"node-header",onClick:c=>o.toggleNode(i.id)},[m("div",Ea,[m("span",Pa,X(r.expandedNodes.has(i.id)?"\u25BC":"\u25BA"),1),m("span",Aa,X(i.name),1),m("span",Ra,X(o.getDeviceTypeText(i.type)),1),i.address?(U(),K("span",Ta,"["+X(i.address)+"]",1)):Ie("",!0),m("span",{class:St(["node-status",{"status-active":i.active,"status-inactive":!i.active}])},X(i.active?"\u5728\u7EBF":"\u79BB\u7EBF"),3)]),m("div",Oa,[m("button",{class:"action-btn edit-btn",onClick:ut(c=>o.editDevice(i),["stop"])},"\u7F16\u8F91",8,Ma),m("button",{class:"action-btn delete-btn",onClick:ut(c=>o.deleteDevice(i.id),["stop"])},"\u5220\u9664",8,Ia)])],8,Ca),Me(m("div",Da,[(U(!0),K(xe,null,zt(o.getControllerDevices(i.id),c=>(U(),K("div",{key:c.id,class:"tree-node controller-node"},[m("div",{class:"node-header",onClick:d=>o.toggleNode(c.id)},[m("div",ka,[m("span",Na,X(r.expandedNodes.has(c.id)?"\u25BC":"\u25BA"),1),m("span",La,X(c.name),1),m("span",ja,X(o.getDeviceTypeText(c.type)),1),c.address?(U(),K("span",Ha,"["+X(c.address)+"]",1)):Ie("",!0),m("span",{class:St(["node-status",{"status-active":c.active,"status-inactive":!c.active}])},X(c.active?"\u5728\u7EBF":"\u79BB\u7EBF"),3)]),m("div",$a,[m("button",{class:"action-btn edit-btn",onClick:ut(d=>o.editDevice(c),["stop"])},"\u7F16\u8F91",8,Va),m("button",{class:"action-btn delete-btn",onClick:ut(d=>o.deleteDevice(c.id),["stop"])},"\u5220\u9664",8,Ba)])],8,Fa),Me(m("div",Ua,[(U(!0),K(xe,null,zt(o.getLeafDevices(c.id),d=>(U(),K("div",{key:d.id,class:"tree-node device-node"},[m("div",Ka,[m("div",Wa,[m("span",qa,X(d.name),1),m("span",za,X(o.getDeviceTypeText(d.type)),1),d.address?(U(),K("span",Ga,"["+X(d.address)+"]",1)):Ie("",!0),m("span",{class:St(["node-status",{"status-active":d.active,"status-inactive":!d.active}])},X(d.active?"\u5728\u7EBF":"\u79BB\u7EBF"),3)]),m("div",Ja,[m("button",{class:"action-btn edit-btn",onClick:ut(a=>o.editDevice(d),["stop"])},"\u7F16\u8F91",8,Ya),m("button",{class:"action-btn delete-btn",onClick:ut(a=>o.deleteDevice(d.id),["stop"])},"\u5220\u9664",8,Qa)])])]))),128))],512),[[gr,r.expandedNodes.has(c.id)]])]))),128))],512),[[gr,r.expandedNodes.has(i.id)]])]))),128))]))])]),r.showModal?(U(),K("div",Xa,[m("div",Za,[m("div",ef,[m("h3",null,X(r.editingDevice?"\u7F16\u8F91\u8BBE\u5907":"\u6DFB\u52A0\u8BBE\u5907"),1),m("button",{class:"close-btn",onClick:t[2]||(t[2]=(...i)=>o.closeDeviceModal&&o.closeDeviceModal(...i))},"\xD7")]),m("div",tf,[m("form",{onSubmit:t[11]||(t[11]=ut((...i)=>o.saveDevice&&o.saveDevice(...i),["prevent"]))},[Me(m("input",{type:"hidden","onUpdate:modelValue":t[3]||(t[3]=i=>r.deviceForm.id=i)},null,512),[[xt,r.deviceForm.id]]),m("div",nf,[t[18]||(t[18]=m("label",{for:"deviceName"},"\u8BBE\u5907\u540D\u79F0",-1)),Me(m("input",{type:"text",id:"deviceName","onUpdate:modelValue":t[4]||(t[4]=i=>r.deviceForm.name=i),required:""},null,512),[[xt,r.deviceForm.name]])]),m("div",sf,[t[20]||(t[20]=m("label",{for:"deviceType"},"\u8BBE\u5907\u7C7B\u578B",-1)),Me(m("select",{id:"deviceType","onUpdate:modelValue":t[5]||(t[5]=i=>r.deviceForm.type=i),required:"",onChange:t[6]||(t[6]=(...i)=>o.toggleParentField&&o.toggleParentField(...i))},[...t[19]||(t[19]=[ec('',6)])],544),[[Er,r.deviceForm.type]])]),(r.deviceForm.type==="fan"||r.deviceForm.type==="water_curtain")&&r.deviceForm.type!==""?(U(),K("div",rf,[t[21]||(t[21]=m("label",{for:"busNumber"},"485\u603B\u7EBF\u53F7",-1)),Me(m("input",{type:"number",id:"busNumber","onUpdate:modelValue":t[7]||(t[7]=i=>r.deviceForm.bus_number=i),placeholder:"\u8BF7\u8F93\u5165485\u603B\u7EBF\u53F7"},null,512),[[xt,r.deviceForm.bus_number,void 0,{number:!0}]])])):Ie("",!0),(r.deviceForm.type==="fan"||r.deviceForm.type==="water_curtain")&&r.deviceForm.type!==""?(U(),K("div",of,[t[22]||(t[22]=m("label",{for:"device485Address"},"485\u8BBE\u5907\u5730\u5740",-1)),Me(m("input",{type:"text",id:"device485Address","onUpdate:modelValue":t[8]||(t[8]=i=>r.deviceForm.device_address=i),placeholder:"\u8BF7\u8F93\u5165485\u8BBE\u5907\u5730\u5740"},null,512),[[xt,r.deviceForm.device_address]])])):Ie("",!0),r.deviceForm.type!=="relay"&&r.deviceForm.type!==""&&r.deviceForm.type!=="fan"&&r.deviceForm.type!=="water_curtain"?(U(),K("div",lf,[t[23]||(t[23]=m("label",{for:"deviceAddress"},"\u8BBE\u5907\u5730\u5740",-1)),Me(m("input",{type:"text",id:"deviceAddress","onUpdate:modelValue":t[9]||(t[9]=i=>r.deviceForm.address=i),placeholder:"\u8BF7\u8F93\u5165\u8BBE\u5907\u5730\u5740"},null,512),[[xt,r.deviceForm.address]])])):Ie("",!0),r.deviceForm.type!=="relay"&&r.deviceForm.type!==""?(U(),K("div",cf,[t[25]||(t[25]=m("label",{for:"parentId"},"\u4E0A\u7EA7\u8BBE\u5907",-1)),Me(m("select",{id:"parentId","onUpdate:modelValue":t[10]||(t[10]=i=>r.deviceForm.parent_id=i)},[t[24]||(t[24]=m("option",{value:""},"\u8BF7\u9009\u62E9\u4E0A\u7EA7\u8BBE\u5907",-1)),(U(!0),K(xe,null,zt(o.getParentDevicesWithDisplayName(r.deviceForm.type),i=>(U(),K("option",{key:i.id,value:i.id},X(i.display_name),9,uf))),128))],512),[[Er,r.deviceForm.parent_id]])])):Ie("",!0)],32)]),m("div",af,[m("button",{class:"btn btn-secondary",onClick:t[12]||(t[12]=(...i)=>o.closeDeviceModal&&o.closeDeviceModal(...i))},"\u53D6\u6D88"),m("button",{class:"btn btn-primary",onClick:t[13]||(t[13]=(...i)=>o.saveDevice&&o.saveDevice(...i))},"\u4FDD\u5B58")])])])):Ie("",!0)])}const df=mn(ha,[["render",ff],["__scopeId","data-v-a2f9bd42"]]);const pf={name:"FeedPlan",data(){return{username:"",plans:[],loading:!0}},mounted(){this.username=localStorage.getItem("username")||"\u7BA1\u7406\u5458",this.loadPlans()},methods:{async loadPlans(){this.loading=!0;try{const e=await fetch("/api/v1/feed/plan/list",{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+localStorage.getItem("authToken")}}),t=await e.json();e.ok&&t.code===0?this.plans=t.data.plans||[]:console.error("\u83B7\u53D6\u9972\u5582\u8BA1\u5212\u5217\u8868\u5931\u8D25:",t.message)}catch(e){console.error("\u83B7\u53D6\u9972\u5582\u8BA1\u5212\u5217\u8868\u5931\u8D25:",e)}finally{this.loading=!1}},viewDetail(e){this.$router.push(`/feed/plan/${e}`)},createPlan(){alert("\u521B\u5EFA\u8BA1\u5212\u529F\u80FD\u5F85\u5B9E\u73B0")},editPlan(e){alert(`\u7F16\u8F91\u8BA1\u5212: ${e.name}`)},async deletePlan(e){var t,n,s;if(!!confirm("\u786E\u5B9A\u8981\u5220\u9664\u8FD9\u4E2A\u9972\u5582\u8BA1\u5212\u5417\uFF1F"))try{const r=await fetch("/api/v1/feed/plan/delete",{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+localStorage.getItem("authToken")},body:JSON.stringify({id:e})}),o=await r.json();r.ok&&o.code===0?(await this.loadPlans(),(t=this.$message)!=null&&t.success("\u5220\u9664\u6210\u529F")||alert("\u5220\u9664\u6210\u529F")):(n=this.$message)!=null&&n.error("\u5220\u9664\u5931\u8D25: "+o.message)||alert("\u5220\u9664\u5931\u8D25: "+o.message)}catch(r){console.error("\u5220\u9664\u9972\u5582\u8BA1\u5212\u5931\u8D25:",r),(s=this.$message)!=null&&s.error("\u5220\u9664\u9972\u5582\u8BA1\u5212\u5931\u8D25: "+r.message)||alert("\u5220\u9664\u9972\u5582\u8BA1\u5212\u5931\u8D25: "+r.message)}},logout(){localStorage.removeItem("authToken"),localStorage.removeItem("username"),this.$router.push("/")}}},hf={class:"feed-plan-management"},gf={class:"header"},mf={class:"user-info"},_f={class:"nav"},vf={class:"main-content"},yf={class:"toolbar"},bf={class:"plan-list"},xf={key:0,class:"loading"},Sf={key:1,class:"no-plans"},wf={key:2,class:"plans-container"},Cf={class:"plan-header"},Ef={class:"plan-details"},Pf={class:"plan-description"},Af={class:"plan-meta"},Rf={class:"plan-type"},Tf={key:0,class:"plan-cron"},Of={class:"plan-actions"},Mf=["onClick"],If=["onClick"],Df=["onClick"];function Ff(e,t,n,s,r,o){const l=Jn("router-link");return U(),K("div",hf,[m("div",gf,[t[2]||(t[2]=m("h1",null,"\u9972\u5582\u8BA1\u5212\u7BA1\u7406",-1)),m("div",mf,[m("span",null,"\u6B22\u8FCE, "+X(r.username),1),m("button",{class:"logout-btn",onClick:t[0]||(t[0]=(...i)=>o.logout&&o.logout(...i))},"\u9000\u51FA")])]),m("nav",_f,[m("ul",null,[m("li",null,[ie(l,{to:"/dashboard"},{default:We(()=>[...t[3]||(t[3]=[qe("\u63A7\u5236\u53F0",-1)])]),_:1})]),m("li",null,[ie(l,{to:"/device"},{default:We(()=>[...t[4]||(t[4]=[qe("\u8BBE\u5907\u7BA1\u7406",-1)])]),_:1})]),m("li",null,[ie(l,{to:"/feed/plan",class:"active"},{default:We(()=>[...t[5]||(t[5]=[qe("\u9972\u5582\u8BA1\u5212",-1)])]),_:1})])])]),m("main",vf,[m("div",yf,[m("button",{class:"btn btn-primary",onClick:t[1]||(t[1]=(...i)=>o.createPlan&&o.createPlan(...i))},"\u521B\u5EFA\u8BA1\u5212")]),m("div",bf,[r.loading?(U(),K("div",xf," \u52A0\u8F7D\u4E2D... ")):r.plans.length===0?(U(),K("div",Sf," \u6682\u65E0\u9972\u5582\u8BA1\u5212 ")):(U(),K("div",wf,[(U(!0),K(xe,null,zt(r.plans,i=>(U(),K("div",{key:i.id,class:"plan-card"},[m("div",Cf,[m("h3",null,X(i.name),1),m("span",{class:St(["plan-status",{enabled:i.enabled,disabled:!i.enabled}])},X(i.enabled?"\u5DF2\u542F\u7528":"\u5DF2\u7981\u7528"),3)]),m("div",Ef,[m("p",Pf,X(i.description||"\u6682\u65E0\u63CF\u8FF0"),1),m("div",Af,[m("span",Rf,X(i.type==="manual"?"\u624B\u52A8\u89E6\u53D1":"\u81EA\u52A8\u89E6\u53D1"),1),i.schedule_cron?(U(),K("span",Tf,"\u5B9A\u65F6: "+X(i.schedule_cron),1)):Ie("",!0)])]),m("div",Of,[m("button",{class:"action-btn detail-btn",onClick:c=>o.viewDetail(i.id)},"\u8BE6\u60C5",8,Mf),m("button",{class:"action-btn edit-btn",onClick:c=>o.editPlan(i)},"\u7F16\u8F91",8,If),m("button",{class:"action-btn delete-btn",onClick:c=>o.deletePlan(i.id)},"\u5220\u9664",8,Df)])]))),128))]))])])])}const kf=mn(pf,[["render",Ff],["__scopeId","data-v-181c8146"]]),Nf=[{path:"/",name:"Login",component:ea},{path:"/dashboard",name:"Dashboard",component:pa,meta:{requiresAuth:!0}},{path:"/device",name:"Device",component:df,meta:{requiresAuth:!0}},{path:"/feed/plan",name:"FeedPlan",component:kf,meta:{requiresAuth:!0}}],fi=Ku({history:yu(),routes:Nf});fi.beforeEach((e,t,n)=>{const s=localStorage.getItem("authToken");e.matched.some(r=>r.meta.requiresAuth)?s?n():n("/"):s&&e.name==="Login"?n("/dashboard"):n()});const di=Nc(Bc);di.use(fi);di.mount("#app"); diff --git a/frontend/dist/assets/index.398ac6b2.css b/frontend/dist/assets/index.42c8d2d4.css similarity index 80% rename from frontend/dist/assets/index.398ac6b2.css rename to frontend/dist/assets/index.42c8d2d4.css index 6c72ba3..b09bec9 100644 --- a/frontend/dist/assets/index.398ac6b2.css +++ b/frontend/dist/assets/index.42c8d2d4.css @@ -1 +1 @@ -*{margin:0;padding:0;box-sizing:border-box}#app{font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;background-color:#f5f7fa;min-height:100vh}.login-container[data-v-bb5c78dc]{background:rgba(255,255,255,.95);backdrop-filter:blur(10px);border-radius:20px;box-shadow:0 15px 35px #0003;padding:40px;width:100%;max-width:400px;text-align:center;animation:fadeIn-bb5c78dc .5s ease-out;margin:100px auto}@keyframes fadeIn-bb5c78dc{0%{opacity:0;transform:translateY(-20px)}to{opacity:1;transform:translateY(0)}}.logo[data-v-bb5c78dc]{width:80px;height:80px;background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);border-radius:50%;margin:0 auto 20px;display:flex;align-items:center;justify-content:center;color:#fff;font-size:30px;font-weight:700}h1[data-v-bb5c78dc]{color:#333;margin-bottom:10px;font-size:28px}.subtitle[data-v-bb5c78dc]{color:#666;margin-bottom:30px;font-size:14px}.form-group[data-v-bb5c78dc]{margin-bottom:20px;text-align:left}label[data-v-bb5c78dc]{display:block;margin-bottom:8px;color:#555;font-weight:500}input[data-v-bb5c78dc]{width:100%;padding:15px;border:2px solid #e1e1e1;border-radius:10px;font-size:16px;transition:all .3s ease;outline:none}input[data-v-bb5c78dc]:focus{border-color:#667eea;box-shadow:0 0 0 3px #667eea1a}button[data-v-bb5c78dc]{width:100%;padding:15px;background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);border:none;border-radius:10px;color:#fff;font-size:16px;font-weight:600;cursor:pointer;transition:all .3s ease}button[data-v-bb5c78dc]:hover:not(:disabled){transform:translateY(-2px);box-shadow:0 5px 15px #667eea66}button[data-v-bb5c78dc]:disabled{opacity:.7;cursor:not-allowed}.error-message[data-v-bb5c78dc]{color:#dc3545;margin-top:15px;padding:10px;background-color:#f8d7da;border-radius:5px}.success-message[data-v-bb5c78dc]{color:#28a745;margin-top:15px;padding:10px;background-color:#d4edda;border-radius:5px}.header[data-v-904f2d71]{background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);color:#fff;padding:20px;box-shadow:0 2px 10px #0000001a;display:flex;justify-content:space-between;align-items:center}.header h1[data-v-904f2d71]{font-size:24px;display:flex;align-items:center;gap:10px}.user-info[data-v-904f2d71]{display:flex;align-items:center;gap:15px}.logout-btn[data-v-904f2d71]{background:rgba(255,255,255,.2);border:1px solid rgba(255,255,255,.3);color:#fff;padding:8px 15px;border-radius:5px;cursor:pointer;transition:all .3s ease}.logout-btn[data-v-904f2d71]:hover{background:rgba(255,255,255,.3)}.nav[data-v-904f2d71]{background:white;padding:15px 20px;box-shadow:0 2px 5px #0000000d}.nav ul[data-v-904f2d71]{display:flex;list-style:none;gap:20px}.nav a[data-v-904f2d71]{text-decoration:none;color:#666;padding:8px 15px;border-radius:5px;transition:all .3s ease}.nav a[data-v-904f2d71]:hover,.nav a.active[data-v-904f2d71]{background:#667eea;color:#fff}.container[data-v-904f2d71]{max-width:1200px;margin:30px auto;padding:0 20px}.dashboard-grid[data-v-904f2d71]{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:20px;margin-bottom:30px}.card[data-v-904f2d71]{background:white;border-radius:15px;box-shadow:0 5px 15px #00000014;padding:25px;transition:transform .3s ease,box-shadow .3s ease}.card[data-v-904f2d71]:hover{transform:translateY(-5px);box-shadow:0 8px 25px #0000001f}.card h3[data-v-904f2d71]{color:#333;margin-bottom:15px;display:flex;align-items:center;gap:10px}.card p[data-v-904f2d71]{color:#666;line-height:1.6}.device-control[data-v-904f2d71]{background:white;border-radius:15px;box-shadow:0 5px 15px #00000014;padding:25px;margin-bottom:30px}.control-grid[data-v-904f2d71]{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:20px;margin-top:20px}.control-item[data-v-904f2d71]{background:#f8f9fa;border-radius:10px;padding:20px;text-align:center}.control-item h4[data-v-904f2d71]{margin-bottom:15px;color:#333}.control-buttons[data-v-904f2d71]{display:flex;gap:10px;justify-content:center}.control-btn[data-v-904f2d71]{padding:8px 15px;border:none;border-radius:5px;cursor:pointer;font-size:14px;transition:all .3s ease}.on-btn[data-v-904f2d71]{background:#28a745;color:#fff}.off-btn[data-v-904f2d71]{background:#dc3545;color:#fff}.control-btn[data-v-904f2d71]:hover{opacity:.9;transform:translateY(-2px)}@media (max-width: 768px){.dashboard-grid[data-v-904f2d71]{grid-template-columns:1fr}.header[data-v-904f2d71]{flex-direction:column;gap:15px}}.device-management[data-v-a2f9bd42]{height:100vh;display:flex;flex-direction:column;background-color:#f5f7fa}.nav[data-v-a2f9bd42]{background-color:#343a40;padding:0;margin-bottom:20px}.nav ul[data-v-a2f9bd42]{list-style-type:none;margin:0;padding:0;display:flex}.nav li[data-v-a2f9bd42]{margin:0}.nav a[data-v-a2f9bd42]{display:block;padding:15px 20px;color:#fff;text-decoration:none;transition:background-color .3s}.nav a[data-v-a2f9bd42]:hover{background-color:#495057}.nav a.active[data-v-a2f9bd42]{background-color:#007bff}.header[data-v-a2f9bd42]{background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);color:#fff;padding:1rem 2rem;display:flex;justify-content:space-between;align-items:center;box-shadow:0 2px 10px #0000001a}.header h1[data-v-a2f9bd42]{margin:0;font-size:1.5rem;display:flex;align-items:center;gap:10px}.user-info[data-v-a2f9bd42]{display:flex;align-items:center;gap:1rem}.logout-btn[data-v-a2f9bd42]{background:rgba(255,255,255,.2);color:#fff;border:1px solid rgba(255,255,255,.3);padding:.5rem 1rem;border-radius:4px;cursor:pointer;transition:all .3s ease}.logout-btn[data-v-a2f9bd42]:hover{background:rgba(255,255,255,.3)}.main-content[data-v-a2f9bd42]{flex:1;padding:1.5rem;overflow-y:auto}.toolbar[data-v-a2f9bd42]{margin-bottom:1.5rem;display:flex;justify-content:flex-end}.btn[data-v-a2f9bd42]{padding:.75rem 1.5rem;border:none;border-radius:6px;cursor:pointer;font-size:1rem;font-weight:500;transition:all .3s ease;display:inline-flex;align-items:center;gap:8px}.btn-primary[data-v-a2f9bd42]{background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);color:#fff;box-shadow:0 4px 15px #0003}.btn-primary[data-v-a2f9bd42]:hover{transform:translateY(-2px);box-shadow:0 6px 20px #00000040}.btn-secondary[data-v-a2f9bd42]{background:#f5f5f5;color:#333;border:1px solid #ddd}.btn-secondary[data-v-a2f9bd42]:hover{background:#e0e0e0}.device-tree[data-v-a2f9bd42]{background:white;border-radius:10px;box-shadow:0 2px 10px #0000001a;padding:1.5rem;overflow:hidden}.tree-node[data-v-a2f9bd42]{margin-bottom:.75rem;border-radius:8px;transition:all .3s ease;box-shadow:0 1px 3px #0000001a}.tree-node[data-v-a2f9bd42]:hover{box-shadow:0 2px 8px #00000026}.tree-node.relay-node[data-v-a2f9bd42]{background:#fff3e0;border-left:4px solid #ff9800}.tree-node.controller-node[data-v-a2f9bd42]{background:#e3f2fd;border-left:4px solid #2196f3;margin-left:1.5rem}.tree-node.device-node[data-v-a2f9bd42]{background:#e8f5e9;border-left:4px solid #4caf50;margin-left:3rem}.node-header[data-v-a2f9bd42]{display:flex;justify-content:space-between;align-items:center;padding:1rem;cursor:pointer}.node-header[data-v-a2f9bd42]:hover{background-color:#00000005}.node-info[data-v-a2f9bd42]{display:flex;align-items:center;gap:.75rem}.toggle-icon[data-v-a2f9bd42]{width:20px;text-align:center;font-size:.8rem;color:#666}.node-title[data-v-a2f9bd42]{font-weight:600;color:#333;font-size:1.1rem}.node-address[data-v-a2f9bd42]{font-size:.9rem;color:#666;background:rgba(0,0,0,.05);padding:.2rem .5rem;border-radius:4px}.node-type[data-v-a2f9bd42]{font-size:.8rem;padding:.3rem .6rem;border-radius:12px;font-weight:500;text-transform:uppercase}.node-status[data-v-a2f9bd42]{font-size:.8rem;padding:.3rem .6rem;border-radius:12px;font-weight:500}.status-active[data-v-a2f9bd42]{background:#4caf50;color:#fff}.status-inactive[data-v-a2f9bd42]{background:#9e9e9e;color:#fff}.relay-type[data-v-a2f9bd42]{background:#ff9800;color:#fff}.controller-type[data-v-a2f9bd42]{background:#2196f3;color:#fff}.device-type[data-v-a2f9bd42]{background:#4caf50;color:#fff}.node-actions[data-v-a2f9bd42]{display:flex;gap:.5rem}.action-btn[data-v-a2f9bd42]{padding:.4rem .8rem;border:none;border-radius:4px;cursor:pointer;font-size:.85rem;transition:all .2s ease}.edit-btn[data-v-a2f9bd42]{background:#1976d2;color:#fff}.edit-btn[data-v-a2f9bd42]:hover{background:#1565c0;transform:translateY(-1px)}.delete-btn[data-v-a2f9bd42]{background:#d32f2f;color:#fff}.delete-btn[data-v-a2f9bd42]:hover{background:#c62828;transform:translateY(-1px)}.children-container[data-v-a2f9bd42]{padding:.5rem 0 .5rem 1rem;border-left:2px dashed rgba(0,0,0,.1);margin-left:1rem}.modal[data-v-a2f9bd42]{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5);display:flex;justify-content:center;align-items:center;z-index:1000;animation:fadeIn-a2f9bd42 .3s ease}@keyframes fadeIn-a2f9bd42{0%{opacity:0}to{opacity:1}}.modal-content[data-v-a2f9bd42]{background:white;border-radius:10px;width:90%;max-width:500px;box-shadow:0 10px 30px #0000004d;animation:slideIn-a2f9bd42 .3s ease}@keyframes slideIn-a2f9bd42{0%{opacity:0;transform:translateY(-50px)}to{opacity:1;transform:translateY(0)}}.modal-header[data-v-a2f9bd42]{display:flex;justify-content:space-between;align-items:center;padding:1.5rem;border-bottom:1px solid #eee}.modal-header h3[data-v-a2f9bd42]{margin:0;color:#333;font-size:1.3rem}.close-btn[data-v-a2f9bd42]{background:none;border:none;font-size:1.8rem;cursor:pointer;padding:0;width:30px;height:30px;display:flex;align-items:center;justify-content:center;color:#999;transition:color .2s ease}.close-btn[data-v-a2f9bd42]:hover{color:#333}.modal-body[data-v-a2f9bd42]{padding:1.5rem}.form-group[data-v-a2f9bd42]{margin-bottom:1.5rem}.form-group label[data-v-a2f9bd42]{display:block;margin-bottom:.5rem;font-weight:500;color:#333}.form-group input[data-v-a2f9bd42],.form-group select[data-v-a2f9bd42]{width:100%;padding:.8rem;border:1px solid #ddd;border-radius:6px;font-size:1rem;box-sizing:border-box;transition:border-color .2s ease,box-shadow .2s ease}.form-group input[data-v-a2f9bd42]:focus,.form-group select[data-v-a2f9bd42]:focus{outline:none;border-color:#667eea;box-shadow:0 0 0 3px #667eea1a}.modal-footer[data-v-a2f9bd42]{padding:1.5rem;border-top:1px solid #eee;display:flex;justify-content:flex-end;gap:.75rem}.no-devices[data-v-a2f9bd42]{text-align:center;color:#7f8c8d;padding:3rem;font-style:italic;font-size:1.1rem}@media (max-width: 768px){.main-content[data-v-a2f9bd42],.header[data-v-a2f9bd42]{padding:1rem}.node-header[data-v-a2f9bd42]{flex-direction:column;align-items:flex-start;gap:.75rem}.node-actions[data-v-a2f9bd42]{align-self:flex-end}.tree-node.controller-node[data-v-a2f9bd42],.tree-node.device-node[data-v-a2f9bd42]{margin-left:1rem}}.feed-plan-management[data-v-f7b44245]{padding:20px}.header[data-v-f7b44245]{display:flex;justify-content:space-between;align-items:center;margin-bottom:30px;padding-bottom:20px;border-bottom:1px solid #eee}.header h1[data-v-f7b44245]{margin:0;color:#333}.user-info[data-v-f7b44245]{display:flex;align-items:center;gap:15px}.logout-btn[data-v-f7b44245]{padding:8px 16px;background-color:#dc3545;color:#fff;border:none;border-radius:4px;cursor:pointer;transition:background-color .3s}.logout-btn[data-v-f7b44245]:hover{background-color:#c82333}.nav[data-v-f7b44245]{background-color:#343a40;padding:0;margin-bottom:20px}.nav ul[data-v-f7b44245]{list-style-type:none;margin:0;padding:0;display:flex}.nav li[data-v-f7b44245]{margin:0}.nav a[data-v-f7b44245]{display:block;padding:15px 20px;color:#fff;text-decoration:none;transition:background-color .3s}.nav a[data-v-f7b44245]:hover{background-color:#495057}.nav a.active[data-v-f7b44245]{background-color:#007bff}.toolbar[data-v-f7b44245]{margin-bottom:20px}.btn[data-v-f7b44245]{padding:10px 20px;border:none;border-radius:4px;cursor:pointer;font-size:14px;transition:background-color .3s}.btn-primary[data-v-f7b44245]{background-color:#007bff;color:#fff}.btn-primary[data-v-f7b44245]:hover{background-color:#0069d9}.plan-list[data-v-f7b44245]{min-height:400px}.loading[data-v-f7b44245],.no-plans[data-v-f7b44245]{text-align:center;padding:50px;color:#666;font-size:16px}.plans-container[data-v-f7b44245]{display:grid;grid-template-columns:repeat(auto-fill,minmax(350px,1fr));gap:20px}.plan-card[data-v-f7b44245]{border:1px solid #ddd;border-radius:8px;padding:20px;box-shadow:0 2px 4px #0000001a;background-color:#fff;transition:box-shadow .3s,transform .3s}.plan-card[data-v-f7b44245]:hover{box-shadow:0 4px 8px #00000026;transform:translateY(-2px)}.plan-header[data-v-f7b44245]{display:flex;justify-content:space-between;align-items:center;margin-bottom:15px}.plan-header h3[data-v-f7b44245]{margin:0;color:#333;font-size:18px}.plan-status[data-v-f7b44245]{padding:4px 8px;border-radius:4px;font-size:12px;font-weight:700}.plan-status.enabled[data-v-f7b44245]{background-color:#d4edda;color:#155724}.plan-status.disabled[data-v-f7b44245]{background-color:#f8d7da;color:#721c24}.plan-details[data-v-f7b44245]{margin-bottom:20px}.plan-description[data-v-f7b44245]{margin:0 0 15px;color:#666;line-height:1.5}.plan-meta[data-v-f7b44245]{display:flex;flex-wrap:wrap;gap:10px}.plan-type[data-v-f7b44245],.plan-cron[data-v-f7b44245]{padding:4px 8px;background-color:#e9ecef;border-radius:4px;font-size:12px;color:#495057}.plan-actions[data-v-f7b44245]{display:flex;gap:10px;justify-content:flex-end}.action-btn[data-v-f7b44245]{padding:6px 12px;border:none;border-radius:4px;cursor:pointer;font-size:13px;transition:background-color .3s}.detail-btn[data-v-f7b44245]{background-color:#17a2b8;color:#fff}.detail-btn[data-v-f7b44245]:hover{background-color:#138496}.edit-btn[data-v-f7b44245]{background-color:#ffc107;color:#212529}.edit-btn[data-v-f7b44245]:hover{background-color:#e0a800}.delete-btn[data-v-f7b44245]{background-color:#dc3545;color:#fff}.delete-btn[data-v-f7b44245]:hover{background-color:#c82333}@media (max-width: 768px){.plans-container[data-v-f7b44245]{grid-template-columns:1fr}.header[data-v-f7b44245]{flex-direction:column;gap:15px;align-items:flex-start}.nav ul[data-v-f7b44245]{flex-direction:column}} +*{margin:0;padding:0;box-sizing:border-box}#app{font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;background-color:#f5f7fa;min-height:100vh}.login-container[data-v-bb5c78dc]{background:rgba(255,255,255,.95);backdrop-filter:blur(10px);border-radius:20px;box-shadow:0 15px 35px #0003;padding:40px;width:100%;max-width:400px;text-align:center;animation:fadeIn-bb5c78dc .5s ease-out;margin:100px auto}@keyframes fadeIn-bb5c78dc{0%{opacity:0;transform:translateY(-20px)}to{opacity:1;transform:translateY(0)}}.logo[data-v-bb5c78dc]{width:80px;height:80px;background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);border-radius:50%;margin:0 auto 20px;display:flex;align-items:center;justify-content:center;color:#fff;font-size:30px;font-weight:700}h1[data-v-bb5c78dc]{color:#333;margin-bottom:10px;font-size:28px}.subtitle[data-v-bb5c78dc]{color:#666;margin-bottom:30px;font-size:14px}.form-group[data-v-bb5c78dc]{margin-bottom:20px;text-align:left}label[data-v-bb5c78dc]{display:block;margin-bottom:8px;color:#555;font-weight:500}input[data-v-bb5c78dc]{width:100%;padding:15px;border:2px solid #e1e1e1;border-radius:10px;font-size:16px;transition:all .3s ease;outline:none}input[data-v-bb5c78dc]:focus{border-color:#667eea;box-shadow:0 0 0 3px #667eea1a}button[data-v-bb5c78dc]{width:100%;padding:15px;background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);border:none;border-radius:10px;color:#fff;font-size:16px;font-weight:600;cursor:pointer;transition:all .3s ease}button[data-v-bb5c78dc]:hover:not(:disabled){transform:translateY(-2px);box-shadow:0 5px 15px #667eea66}button[data-v-bb5c78dc]:disabled{opacity:.7;cursor:not-allowed}.error-message[data-v-bb5c78dc]{color:#dc3545;margin-top:15px;padding:10px;background-color:#f8d7da;border-radius:5px}.success-message[data-v-bb5c78dc]{color:#28a745;margin-top:15px;padding:10px;background-color:#d4edda;border-radius:5px}.header[data-v-904f2d71]{background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);color:#fff;padding:20px;box-shadow:0 2px 10px #0000001a;display:flex;justify-content:space-between;align-items:center}.header h1[data-v-904f2d71]{font-size:24px;display:flex;align-items:center;gap:10px}.user-info[data-v-904f2d71]{display:flex;align-items:center;gap:15px}.logout-btn[data-v-904f2d71]{background:rgba(255,255,255,.2);border:1px solid rgba(255,255,255,.3);color:#fff;padding:8px 15px;border-radius:5px;cursor:pointer;transition:all .3s ease}.logout-btn[data-v-904f2d71]:hover{background:rgba(255,255,255,.3)}.nav[data-v-904f2d71]{background:white;padding:15px 20px;box-shadow:0 2px 5px #0000000d}.nav ul[data-v-904f2d71]{display:flex;list-style:none;gap:20px}.nav a[data-v-904f2d71]{text-decoration:none;color:#666;padding:8px 15px;border-radius:5px;transition:all .3s ease}.nav a[data-v-904f2d71]:hover,.nav a.active[data-v-904f2d71]{background:#667eea;color:#fff}.container[data-v-904f2d71]{max-width:1200px;margin:30px auto;padding:0 20px}.dashboard-grid[data-v-904f2d71]{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:20px;margin-bottom:30px}.card[data-v-904f2d71]{background:white;border-radius:15px;box-shadow:0 5px 15px #00000014;padding:25px;transition:transform .3s ease,box-shadow .3s ease}.card[data-v-904f2d71]:hover{transform:translateY(-5px);box-shadow:0 8px 25px #0000001f}.card h3[data-v-904f2d71]{color:#333;margin-bottom:15px;display:flex;align-items:center;gap:10px}.card p[data-v-904f2d71]{color:#666;line-height:1.6}.device-control[data-v-904f2d71]{background:white;border-radius:15px;box-shadow:0 5px 15px #00000014;padding:25px;margin-bottom:30px}.control-grid[data-v-904f2d71]{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:20px;margin-top:20px}.control-item[data-v-904f2d71]{background:#f8f9fa;border-radius:10px;padding:20px;text-align:center}.control-item h4[data-v-904f2d71]{margin-bottom:15px;color:#333}.control-buttons[data-v-904f2d71]{display:flex;gap:10px;justify-content:center}.control-btn[data-v-904f2d71]{padding:8px 15px;border:none;border-radius:5px;cursor:pointer;font-size:14px;transition:all .3s ease}.on-btn[data-v-904f2d71]{background:#28a745;color:#fff}.off-btn[data-v-904f2d71]{background:#dc3545;color:#fff}.control-btn[data-v-904f2d71]:hover{opacity:.9;transform:translateY(-2px)}@media (max-width: 768px){.dashboard-grid[data-v-904f2d71]{grid-template-columns:1fr}.header[data-v-904f2d71]{flex-direction:column;gap:15px}}.device-management[data-v-a2f9bd42]{height:100vh;display:flex;flex-direction:column;background-color:#f5f7fa}.nav[data-v-a2f9bd42]{background-color:#343a40;padding:0;margin-bottom:20px}.nav ul[data-v-a2f9bd42]{list-style-type:none;margin:0;padding:0;display:flex}.nav li[data-v-a2f9bd42]{margin:0}.nav a[data-v-a2f9bd42]{display:block;padding:15px 20px;color:#fff;text-decoration:none;transition:background-color .3s}.nav a[data-v-a2f9bd42]:hover{background-color:#495057}.nav a.active[data-v-a2f9bd42]{background-color:#007bff}.header[data-v-a2f9bd42]{background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);color:#fff;padding:1rem 2rem;display:flex;justify-content:space-between;align-items:center;box-shadow:0 2px 10px #0000001a}.header h1[data-v-a2f9bd42]{margin:0;font-size:1.5rem;display:flex;align-items:center;gap:10px}.user-info[data-v-a2f9bd42]{display:flex;align-items:center;gap:1rem}.logout-btn[data-v-a2f9bd42]{background:rgba(255,255,255,.2);color:#fff;border:1px solid rgba(255,255,255,.3);padding:.5rem 1rem;border-radius:4px;cursor:pointer;transition:all .3s ease}.logout-btn[data-v-a2f9bd42]:hover{background:rgba(255,255,255,.3)}.main-content[data-v-a2f9bd42]{flex:1;padding:1.5rem;overflow-y:auto}.toolbar[data-v-a2f9bd42]{margin-bottom:1.5rem;display:flex;justify-content:flex-end}.btn[data-v-a2f9bd42]{padding:.75rem 1.5rem;border:none;border-radius:6px;cursor:pointer;font-size:1rem;font-weight:500;transition:all .3s ease;display:inline-flex;align-items:center;gap:8px}.btn-primary[data-v-a2f9bd42]{background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);color:#fff;box-shadow:0 4px 15px #0003}.btn-primary[data-v-a2f9bd42]:hover{transform:translateY(-2px);box-shadow:0 6px 20px #00000040}.btn-secondary[data-v-a2f9bd42]{background:#f5f5f5;color:#333;border:1px solid #ddd}.btn-secondary[data-v-a2f9bd42]:hover{background:#e0e0e0}.device-tree[data-v-a2f9bd42]{background:white;border-radius:10px;box-shadow:0 2px 10px #0000001a;padding:1.5rem;overflow:hidden}.tree-node[data-v-a2f9bd42]{margin-bottom:.75rem;border-radius:8px;transition:all .3s ease;box-shadow:0 1px 3px #0000001a}.tree-node[data-v-a2f9bd42]:hover{box-shadow:0 2px 8px #00000026}.tree-node.relay-node[data-v-a2f9bd42]{background:#fff3e0;border-left:4px solid #ff9800}.tree-node.controller-node[data-v-a2f9bd42]{background:#e3f2fd;border-left:4px solid #2196f3;margin-left:1.5rem}.tree-node.device-node[data-v-a2f9bd42]{background:#e8f5e9;border-left:4px solid #4caf50;margin-left:3rem}.node-header[data-v-a2f9bd42]{display:flex;justify-content:space-between;align-items:center;padding:1rem;cursor:pointer}.node-header[data-v-a2f9bd42]:hover{background-color:#00000005}.node-info[data-v-a2f9bd42]{display:flex;align-items:center;gap:.75rem}.toggle-icon[data-v-a2f9bd42]{width:20px;text-align:center;font-size:.8rem;color:#666}.node-title[data-v-a2f9bd42]{font-weight:600;color:#333;font-size:1.1rem}.node-address[data-v-a2f9bd42]{font-size:.9rem;color:#666;background:rgba(0,0,0,.05);padding:.2rem .5rem;border-radius:4px}.node-type[data-v-a2f9bd42]{font-size:.8rem;padding:.3rem .6rem;border-radius:12px;font-weight:500;text-transform:uppercase}.node-status[data-v-a2f9bd42]{font-size:.8rem;padding:.3rem .6rem;border-radius:12px;font-weight:500}.status-active[data-v-a2f9bd42]{background:#4caf50;color:#fff}.status-inactive[data-v-a2f9bd42]{background:#9e9e9e;color:#fff}.relay-type[data-v-a2f9bd42]{background:#ff9800;color:#fff}.controller-type[data-v-a2f9bd42]{background:#2196f3;color:#fff}.device-type[data-v-a2f9bd42]{background:#4caf50;color:#fff}.node-actions[data-v-a2f9bd42]{display:flex;gap:.5rem}.action-btn[data-v-a2f9bd42]{padding:.4rem .8rem;border:none;border-radius:4px;cursor:pointer;font-size:.85rem;transition:all .2s ease}.edit-btn[data-v-a2f9bd42]{background:#1976d2;color:#fff}.edit-btn[data-v-a2f9bd42]:hover{background:#1565c0;transform:translateY(-1px)}.delete-btn[data-v-a2f9bd42]{background:#d32f2f;color:#fff}.delete-btn[data-v-a2f9bd42]:hover{background:#c62828;transform:translateY(-1px)}.children-container[data-v-a2f9bd42]{padding:.5rem 0 .5rem 1rem;border-left:2px dashed rgba(0,0,0,.1);margin-left:1rem}.modal[data-v-a2f9bd42]{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5);display:flex;justify-content:center;align-items:center;z-index:1000;animation:fadeIn-a2f9bd42 .3s ease}@keyframes fadeIn-a2f9bd42{0%{opacity:0}to{opacity:1}}.modal-content[data-v-a2f9bd42]{background:white;border-radius:10px;width:90%;max-width:500px;box-shadow:0 10px 30px #0000004d;animation:slideIn-a2f9bd42 .3s ease}@keyframes slideIn-a2f9bd42{0%{opacity:0;transform:translateY(-50px)}to{opacity:1;transform:translateY(0)}}.modal-header[data-v-a2f9bd42]{display:flex;justify-content:space-between;align-items:center;padding:1.5rem;border-bottom:1px solid #eee}.modal-header h3[data-v-a2f9bd42]{margin:0;color:#333;font-size:1.3rem}.close-btn[data-v-a2f9bd42]{background:none;border:none;font-size:1.8rem;cursor:pointer;padding:0;width:30px;height:30px;display:flex;align-items:center;justify-content:center;color:#999;transition:color .2s ease}.close-btn[data-v-a2f9bd42]:hover{color:#333}.modal-body[data-v-a2f9bd42]{padding:1.5rem}.form-group[data-v-a2f9bd42]{margin-bottom:1.5rem}.form-group label[data-v-a2f9bd42]{display:block;margin-bottom:.5rem;font-weight:500;color:#333}.form-group input[data-v-a2f9bd42],.form-group select[data-v-a2f9bd42]{width:100%;padding:.8rem;border:1px solid #ddd;border-radius:6px;font-size:1rem;box-sizing:border-box;transition:border-color .2s ease,box-shadow .2s ease}.form-group input[data-v-a2f9bd42]:focus,.form-group select[data-v-a2f9bd42]:focus{outline:none;border-color:#667eea;box-shadow:0 0 0 3px #667eea1a}.modal-footer[data-v-a2f9bd42]{padding:1.5rem;border-top:1px solid #eee;display:flex;justify-content:flex-end;gap:.75rem}.no-devices[data-v-a2f9bd42]{text-align:center;color:#7f8c8d;padding:3rem;font-style:italic;font-size:1.1rem}@media (max-width: 768px){.main-content[data-v-a2f9bd42],.header[data-v-a2f9bd42]{padding:1rem}.node-header[data-v-a2f9bd42]{flex-direction:column;align-items:flex-start;gap:.75rem}.node-actions[data-v-a2f9bd42]{align-self:flex-end}.tree-node.controller-node[data-v-a2f9bd42],.tree-node.device-node[data-v-a2f9bd42]{margin-left:1rem}}.feed-plan-management[data-v-181c8146]{padding:20px}.header[data-v-181c8146]{display:flex;justify-content:space-between;align-items:center;margin-bottom:30px;padding-bottom:20px;border-bottom:1px solid #eee}.header h1[data-v-181c8146]{margin:0;color:#333}.user-info[data-v-181c8146]{display:flex;align-items:center;gap:15px}.logout-btn[data-v-181c8146]{padding:8px 16px;background-color:#dc3545;color:#fff;border:none;border-radius:4px;cursor:pointer;transition:background-color .3s}.logout-btn[data-v-181c8146]:hover{background-color:#c82333}.nav[data-v-181c8146]{background-color:#343a40;padding:0;margin-bottom:20px}.nav ul[data-v-181c8146]{list-style-type:none;margin:0;padding:0;display:flex}.nav li[data-v-181c8146]{margin:0}.nav a[data-v-181c8146]{display:block;padding:15px 20px;color:#fff;text-decoration:none;transition:background-color .3s}.nav a[data-v-181c8146]:hover{background-color:#495057}.nav a.active[data-v-181c8146]{background-color:#007bff}.toolbar[data-v-181c8146]{margin-bottom:20px}.btn[data-v-181c8146]{padding:10px 20px;border:none;border-radius:4px;cursor:pointer;font-size:14px;transition:background-color .3s}.btn-primary[data-v-181c8146]{background-color:#007bff;color:#fff}.btn-primary[data-v-181c8146]:hover{background-color:#0069d9}.plan-list[data-v-181c8146]{min-height:400px}.loading[data-v-181c8146],.no-plans[data-v-181c8146]{text-align:center;padding:50px;color:#666;font-size:16px}.plans-container[data-v-181c8146]{display:grid;grid-template-columns:repeat(auto-fill,minmax(350px,1fr));gap:20px}.plan-card[data-v-181c8146]{border:1px solid #ddd;border-radius:8px;padding:20px;box-shadow:0 2px 4px #0000001a;background-color:#fff;transition:box-shadow .3s,transform .3s}.plan-card[data-v-181c8146]:hover{box-shadow:0 4px 8px #00000026;transform:translateY(-2px)}.plan-header[data-v-181c8146]{display:flex;justify-content:space-between;align-items:center;margin-bottom:15px}.plan-header h3[data-v-181c8146]{margin:0;color:#333;font-size:18px}.plan-status[data-v-181c8146]{padding:4px 8px;border-radius:4px;font-size:12px;font-weight:700}.plan-status.enabled[data-v-181c8146]{background-color:#d4edda;color:#155724}.plan-status.disabled[data-v-181c8146]{background-color:#f8d7da;color:#721c24}.plan-details[data-v-181c8146]{margin-bottom:20px}.plan-description[data-v-181c8146]{margin:0 0 15px;color:#666;line-height:1.5}.plan-meta[data-v-181c8146]{display:flex;flex-wrap:wrap;gap:10px}.plan-type[data-v-181c8146],.plan-cron[data-v-181c8146]{padding:4px 8px;background-color:#e9ecef;border-radius:4px;font-size:12px;color:#495057}.plan-actions[data-v-181c8146]{display:flex;gap:10px;justify-content:flex-end}.action-btn[data-v-181c8146]{padding:6px 12px;border:none;border-radius:4px;cursor:pointer;font-size:13px;transition:background-color .3s}.detail-btn[data-v-181c8146]{background-color:#17a2b8;color:#fff}.detail-btn[data-v-181c8146]:hover{background-color:#138496}.edit-btn[data-v-181c8146]{background-color:#ffc107;color:#212529}.edit-btn[data-v-181c8146]:hover{background-color:#e0a800}.delete-btn[data-v-181c8146]{background-color:#dc3545;color:#fff}.delete-btn[data-v-181c8146]:hover{background-color:#c82333}@media (max-width: 768px){.plans-container[data-v-181c8146]{grid-template-columns:1fr}.header[data-v-181c8146]{flex-direction:column;gap:15px;align-items:flex-start}.nav ul[data-v-181c8146]{flex-direction:column}} diff --git a/frontend/dist/index.html b/frontend/dist/index.html index ea241b2..33983da 100644 --- a/frontend/dist/index.html +++ b/frontend/dist/index.html @@ -4,8 +4,8 @@ 猪场管理系统 - - + +
diff --git a/frontend/src/pages/FeedPlan.vue b/frontend/src/pages/FeedPlan.vue index 917fe87..a0d6e75 100644 --- a/frontend/src/pages/FeedPlan.vue +++ b/frontend/src/pages/FeedPlan.vue @@ -130,12 +130,13 @@ export default { } try { - const response = await fetch(`/api/v1/feed/plan/delete/${planId}`, { - method: 'DELETE', + const response = await fetch('/api/v1/feed/plan/delete', { + method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + localStorage.getItem('authToken') - } + }, + body: JSON.stringify({ id: planId }) }) const data = await response.json() @@ -143,13 +144,13 @@ export default { if (response.ok && data.code === 0) { // 删除成功,重新加载列表 await this.loadPlans() - alert('删除成功') + this.$message?.success('删除成功') || alert('删除成功') } else { - alert('删除失败: ' + data.message) + this.$message?.error('删除失败: ' + data.message) || alert('删除失败: ' + data.message) } } catch (error) { console.error('删除饲喂计划失败:', error) - alert('删除饲喂计划失败: ' + error.message) + this.$message?.error('删除饲喂计划失败: ' + error.message) || alert('删除饲喂计划失败: ' + error.message) } }, diff --git a/internal/controller/feed/feed.go b/internal/controller/feed/feed.go index 07095ae..f8db099 100644 --- a/internal/controller/feed/feed.go +++ b/internal/controller/feed/feed.go @@ -126,15 +126,17 @@ func (c *Controller) convertToCreateModel(req *CreateRequest) *model.FeedingPlan // Delete 删除饲料计划 func (c *Controller) Delete(ctx *gin.Context) { // 获取路径参数中的计划ID - planIDStr := ctx.Param("id") - planID, err := strconv.ParseUint(planIDStr, 10, 32) - if err != nil { - controller.SendErrorResponse(ctx, controller.InvalidParameterCode, "无效的计划ID") + var req struct { + ID uint `json:"id" binding:"required"` + } + + if err := ctx.ShouldBindJSON(&req); err != nil { + controller.SendErrorResponse(ctx, controller.InvalidParameterCode, "请求参数错误: "+err.Error()) return } // 调用仓库删除计划 - if err := c.feedPlanRepo.DeleteFeedingPlan(uint(planID)); err != nil { + if err := c.feedPlanRepo.DeleteFeedingPlan(uint(req.ID)); err != nil { c.logger.Error("删除计划失败: " + err.Error()) controller.SendErrorResponse(ctx, controller.InternalServerErrorCode, "删除计划失败") return