diff --git a/frontend/dist/assets/index.c407adbd.css b/frontend/dist/assets/index.077c8bec.css similarity index 63% rename from frontend/dist/assets/index.c407adbd.css rename to frontend/dist/assets/index.077c8bec.css index 35d1d56..a4522aa 100644 --- a/frontend/dist/assets/index.c407adbd.css +++ b/frontend/dist/assets/index.077c8bec.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-7c1d0503]{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-7c1d0503]{font-size:24px;display:flex;align-items:center;gap:10px}.user-info[data-v-7c1d0503]{display:flex;align-items:center;gap:15px}.logout-btn[data-v-7c1d0503]{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-7c1d0503]:hover{background:rgba(255,255,255,.3)}.nav[data-v-7c1d0503]{background:white;padding:15px 20px;box-shadow:0 2px 5px #0000000d}.nav ul[data-v-7c1d0503]{display:flex;list-style:none;gap:20px}.nav a[data-v-7c1d0503]{text-decoration:none;color:#666;padding:8px 15px;border-radius:5px;transition:all .3s ease}.nav a[data-v-7c1d0503]:hover,.nav a.active[data-v-7c1d0503]{background:#667eea;color:#fff}.container[data-v-7c1d0503]{max-width:1200px;margin:30px auto;padding:0 20px}.dashboard-grid[data-v-7c1d0503]{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:20px;margin-bottom:30px}.card[data-v-7c1d0503]{background:white;border-radius:15px;box-shadow:0 5px 15px #00000014;padding:25px;transition:transform .3s ease,box-shadow .3s ease}.card[data-v-7c1d0503]:hover{transform:translateY(-5px);box-shadow:0 8px 25px #0000001f}.card h3[data-v-7c1d0503]{color:#333;margin-bottom:15px;display:flex;align-items:center;gap:10px}.card p[data-v-7c1d0503]{color:#666;line-height:1.6}.device-control[data-v-7c1d0503]{background:white;border-radius:15px;box-shadow:0 5px 15px #00000014;padding:25px;margin-bottom:30px}.control-grid[data-v-7c1d0503]{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:20px;margin-top:20px}.control-item[data-v-7c1d0503]{background:#f8f9fa;border-radius:10px;padding:20px;text-align:center}.control-item h4[data-v-7c1d0503]{margin-bottom:15px;color:#333}.control-buttons[data-v-7c1d0503]{display:flex;gap:10px;justify-content:center}.control-btn[data-v-7c1d0503]{padding:8px 15px;border:none;border-radius:5px;cursor:pointer;font-size:14px;transition:all .3s ease}.on-btn[data-v-7c1d0503]{background:#28a745;color:#fff}.off-btn[data-v-7c1d0503]{background:#dc3545;color:#fff}.control-btn[data-v-7c1d0503]:hover{opacity:.9;transform:translateY(-2px)}@media (max-width: 768px){.dashboard-grid[data-v-7c1d0503]{grid-template-columns:1fr}.header[data-v-7c1d0503]{flex-direction:column;gap:15px}}.header[data-v-2590e5dc]{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-2590e5dc]{font-size:24px;display:flex;align-items:center;gap:10px}.user-info[data-v-2590e5dc]{display:flex;align-items:center;gap:15px}.logout-btn[data-v-2590e5dc]{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-2590e5dc]:hover{background:rgba(255,255,255,.3)}.nav[data-v-2590e5dc]{background:white;padding:15px 20px;box-shadow:0 2px 5px #0000000d}.nav ul[data-v-2590e5dc]{display:flex;list-style:none;gap:20px}.nav a[data-v-2590e5dc]{text-decoration:none;color:#666;padding:8px 15px;border-radius:5px;transition:all .3s ease}.nav a[data-v-2590e5dc]:hover,.nav a.active[data-v-2590e5dc]{background:#667eea;color:#fff}.container[data-v-2590e5dc]{max-width:1200px;margin:30px auto;padding:0 20px}.page-header[data-v-2590e5dc]{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px}.page-header h2[data-v-2590e5dc]{color:#333}.btn[data-v-2590e5dc]{padding:10px 20px;border:none;border-radius:5px;cursor:pointer;font-size:14px;transition:all .3s ease}.btn-primary[data-v-2590e5dc]{background:#667eea;color:#fff}.btn-primary[data-v-2590e5dc]:hover{background:#5a6fd8}.device-tree[data-v-2590e5dc]{background:white;border-radius:15px;box-shadow:0 5px 15px #00000014;padding:25px;margin-bottom:30px}.tree-node[data-v-2590e5dc]{margin-bottom:15px;border-left:2px solid #e1e1e1;padding-left:20px}.relay-node[data-v-2590e5dc]{border-left-color:#667eea}.controller-node[data-v-2590e5dc]{border-left-color:#764ba2}.device-node[data-v-2590e5dc]{border-left-color:orange}.node-header[data-v-2590e5dc]{display:flex;justify-content:space-between;align-items:center;padding:10px;background:#f8f9fa;border-radius:5px;margin-bottom:10px}.relay-node>.node-header[data-v-2590e5dc]{background:rgba(102,126,234,.1)}.controller-node>.node-header[data-v-2590e5dc]{background:rgba(118,75,162,.1)}.device-node>.node-header[data-v-2590e5dc]{background:rgba(255,165,0,.1)}.node-title[data-v-2590e5dc]{font-weight:700;display:flex;align-items:center;gap:10px}.node-type[data-v-2590e5dc]{font-size:12px;padding:2px 8px;border-radius:10px;color:#fff}.relay-type[data-v-2590e5dc]{background:#667eea}.controller-type[data-v-2590e5dc]{background:#764ba2}.device-type[data-v-2590e5dc]{background:#ffa500}.node-actions[data-v-2590e5dc]{display:flex;gap:10px}.action-btn[data-v-2590e5dc]{padding:5px 10px;border:none;border-radius:3px;cursor:pointer;font-size:12px}.edit-btn[data-v-2590e5dc]{background:#ffc107;color:#333}.delete-btn[data-v-2590e5dc]{background:#dc3545;color:#fff}.children[data-v-2590e5dc]{margin-left:20px}.modal[data-v-2590e5dc]{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5);z-index:1000;display:flex;justify-content:center;align-items:center}.modal-content[data-v-2590e5dc]{background:white;border-radius:15px;width:100%;max-width:500px;box-shadow:0 10px 30px #0003}.modal-header[data-v-2590e5dc]{padding:20px;border-bottom:1px solid #eee;display:flex;justify-content:space-between;align-items:center}.modal-header h3[data-v-2590e5dc]{margin:0}.close-btn[data-v-2590e5dc]{background:none;border:none;font-size:24px;cursor:pointer;color:#999}.modal-body[data-v-2590e5dc]{padding:20px}.form-group[data-v-2590e5dc]{margin-bottom:20px}.form-group label[data-v-2590e5dc]{display:block;margin-bottom:5px;font-weight:500;color:#333}.form-group input[data-v-2590e5dc],.form-group select[data-v-2590e5dc]{width:100%;padding:10px;border:1px solid #ddd;border-radius:5px;font-size:14px}.modal-footer[data-v-2590e5dc]{padding:20px;border-top:1px solid #eee;display:flex;justify-content:flex-end;gap:10px}.btn-secondary[data-v-2590e5dc]{background:#6c757d;color:#fff}.status-active[data-v-2590e5dc]{color:#28a745;font-weight:700}.status-inactive[data-v-2590e5dc]{color:#dc3545;font-weight:700}@media (max-width: 768px){.dashboard-grid[data-v-2590e5dc]{grid-template-columns:1fr}.header[data-v-2590e5dc]{flex-direction:column;gap:15px}.page-header[data-v-2590e5dc]{flex-direction:column;gap:15px;align-items:flex-start}} +*{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-7c1d0503]{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-7c1d0503]{font-size:24px;display:flex;align-items:center;gap:10px}.user-info[data-v-7c1d0503]{display:flex;align-items:center;gap:15px}.logout-btn[data-v-7c1d0503]{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-7c1d0503]:hover{background:rgba(255,255,255,.3)}.nav[data-v-7c1d0503]{background:white;padding:15px 20px;box-shadow:0 2px 5px #0000000d}.nav ul[data-v-7c1d0503]{display:flex;list-style:none;gap:20px}.nav a[data-v-7c1d0503]{text-decoration:none;color:#666;padding:8px 15px;border-radius:5px;transition:all .3s ease}.nav a[data-v-7c1d0503]:hover,.nav a.active[data-v-7c1d0503]{background:#667eea;color:#fff}.container[data-v-7c1d0503]{max-width:1200px;margin:30px auto;padding:0 20px}.dashboard-grid[data-v-7c1d0503]{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:20px;margin-bottom:30px}.card[data-v-7c1d0503]{background:white;border-radius:15px;box-shadow:0 5px 15px #00000014;padding:25px;transition:transform .3s ease,box-shadow .3s ease}.card[data-v-7c1d0503]:hover{transform:translateY(-5px);box-shadow:0 8px 25px #0000001f}.card h3[data-v-7c1d0503]{color:#333;margin-bottom:15px;display:flex;align-items:center;gap:10px}.card p[data-v-7c1d0503]{color:#666;line-height:1.6}.device-control[data-v-7c1d0503]{background:white;border-radius:15px;box-shadow:0 5px 15px #00000014;padding:25px;margin-bottom:30px}.control-grid[data-v-7c1d0503]{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:20px;margin-top:20px}.control-item[data-v-7c1d0503]{background:#f8f9fa;border-radius:10px;padding:20px;text-align:center}.control-item h4[data-v-7c1d0503]{margin-bottom:15px;color:#333}.control-buttons[data-v-7c1d0503]{display:flex;gap:10px;justify-content:center}.control-btn[data-v-7c1d0503]{padding:8px 15px;border:none;border-radius:5px;cursor:pointer;font-size:14px;transition:all .3s ease}.on-btn[data-v-7c1d0503]{background:#28a745;color:#fff}.off-btn[data-v-7c1d0503]{background:#dc3545;color:#fff}.control-btn[data-v-7c1d0503]:hover{opacity:.9;transform:translateY(-2px)}@media (max-width: 768px){.dashboard-grid[data-v-7c1d0503]{grid-template-columns:1fr}.header[data-v-7c1d0503]{flex-direction:column;gap:15px}}.header[data-v-8db6389a]{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-8db6389a]{font-size:24px;display:flex;align-items:center;gap:10px}.user-info[data-v-8db6389a]{display:flex;align-items:center;gap:15px}.logout-btn[data-v-8db6389a]{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-8db6389a]:hover{background:rgba(255,255,255,.3)}.nav[data-v-8db6389a]{background:white;padding:15px 20px;box-shadow:0 2px 5px #0000000d}.nav ul[data-v-8db6389a]{display:flex;list-style:none;gap:20px}.nav a[data-v-8db6389a]{text-decoration:none;color:#666;padding:8px 15px;border-radius:5px;transition:all .3s ease}.nav a[data-v-8db6389a]:hover,.nav a.active[data-v-8db6389a]{background:#667eea;color:#fff}.container[data-v-8db6389a]{max-width:1200px;margin:30px auto;padding:0 20px}.page-header[data-v-8db6389a]{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px}.page-header h2[data-v-8db6389a]{color:#333}.btn[data-v-8db6389a]{padding:10px 20px;border:none;border-radius:5px;cursor:pointer;font-size:14px;transition:all .3s ease}.btn-primary[data-v-8db6389a]{background:#667eea;color:#fff}.btn-primary[data-v-8db6389a]:hover{background:#5a6fd8}.device-tree[data-v-8db6389a]{background:white;border-radius:15px;box-shadow:0 5px 15px #00000014;padding:25px;margin-bottom:30px}.tree-node[data-v-8db6389a]{margin-bottom:15px;border-left:2px solid #e1e1e1;padding-left:20px}.relay-node[data-v-8db6389a]{border-left-color:#667eea}.controller-node[data-v-8db6389a]{border-left-color:#764ba2}.device-node[data-v-8db6389a]{border-left-color:orange}.node-header[data-v-8db6389a]{display:flex;justify-content:space-between;align-items:center;padding:10px;background:#f8f9fa;border-radius:5px;margin-bottom:10px}.relay-node>.node-header[data-v-8db6389a]{background:rgba(102,126,234,.1)}.controller-node>.node-header[data-v-8db6389a]{background:rgba(118,75,162,.1)}.device-node>.node-header[data-v-8db6389a]{background:rgba(255,165,0,.1)}.node-title[data-v-8db6389a]{font-weight:700;display:flex;align-items:center;gap:10px}.node-type[data-v-8db6389a]{font-size:12px;padding:2px 8px;border-radius:10px;color:#fff}.relay-type[data-v-8db6389a]{background:#667eea}.controller-type[data-v-8db6389a]{background:#764ba2}.device-type[data-v-8db6389a]{background:#ffa500}.node-actions[data-v-8db6389a]{display:flex;gap:10px}.action-btn[data-v-8db6389a]{padding:5px 10px;border:none;border-radius:3px;cursor:pointer;font-size:12px}.edit-btn[data-v-8db6389a]{background:#ffc107;color:#333}.delete-btn[data-v-8db6389a]{background:#dc3545;color:#fff}.children[data-v-8db6389a]{margin-left:20px}.modal[data-v-8db6389a]{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.5);z-index:1000;display:flex;justify-content:center;align-items:center}.modal-content[data-v-8db6389a]{background:white;border-radius:15px;width:100%;max-width:500px;box-shadow:0 10px 30px #0003}.modal-header[data-v-8db6389a]{padding:20px;border-bottom:1px solid #eee;display:flex;justify-content:space-between;align-items:center}.modal-header h3[data-v-8db6389a]{margin:0}.close-btn[data-v-8db6389a]{background:none;border:none;font-size:24px;cursor:pointer;color:#999}.modal-body[data-v-8db6389a]{padding:20px}.form-group[data-v-8db6389a]{margin-bottom:20px}.form-group label[data-v-8db6389a]{display:block;margin-bottom:5px;font-weight:500;color:#333}.form-group input[data-v-8db6389a],.form-group select[data-v-8db6389a]{width:100%;padding:10px;border:1px solid #ddd;border-radius:5px;font-size:14px}.modal-footer[data-v-8db6389a]{padding:20px;border-top:1px solid #eee;display:flex;justify-content:flex-end;gap:10px}.btn-secondary[data-v-8db6389a]{background:#6c757d;color:#fff}.status-active[data-v-8db6389a]{color:#28a745;font-weight:700}.status-inactive[data-v-8db6389a]{color:#dc3545;font-weight:700}@media (max-width: 768px){.dashboard-grid[data-v-8db6389a]{grid-template-columns:1fr}.header[data-v-8db6389a]{flex-direction:column;gap:15px}.page-header[data-v-8db6389a]{flex-direction:column;gap:15px;align-items:flex-start}} diff --git a/frontend/dist/assets/index.390b7904.js b/frontend/dist/assets/index.7bd57931.js similarity index 91% rename from frontend/dist/assets/index.390b7904.js rename to frontend/dist/assets/index.7bd57931.js index 2016177..c8103ad 100644 --- a/frontend/dist/assets/index.390b7904.js +++ b/frontend/dist/assets/index.7bd57931.js @@ -18,4 +18,4 @@ * vue-router v4.5.1 * (c) 2025 Eduardo San Martin Morote * @license MIT - */const Et=typeof document<"u";function Jo(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function Vc(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&Jo(e.default)}const W=Object.assign;function is(e,t){const n={};for(const s in t){const r=t[s];n[s]=Fe(r)?r.map(e):e(r)}return n}const Yt=()=>{},Fe=Array.isArray,Yo=/#/g,Bc=/&/g,Uc=/\//g,Kc=/=/g,Wc=/\?/g,Qo=/\+/g,qc=/%5B/g,Gc=/%5D/g,Xo=/%5E/g,zc=/%60/g,Zo=/%7B/g,Jc=/%7C/g,ei=/%7D/g,Yc=/%20/g;function Bs(e){return encodeURI(""+e).replace(Jc,"|").replace(qc,"[").replace(Gc,"]")}function Qc(e){return Bs(e).replace(Zo,"{").replace(ei,"}").replace(Xo,"^")}function ys(e){return Bs(e).replace(Qo,"%2B").replace(Yc,"+").replace(Yo,"%23").replace(Bc,"%26").replace(zc,"`").replace(Zo,"{").replace(ei,"}").replace(Xo,"^")}function Xc(e){return ys(e).replace(Kc,"%3D")}function Zc(e){return Bs(e).replace(Yo,"%23").replace(Wc,"%3F")}function eu(e){return e==null?"":Zc(e).replace(Uc,"%2F")}function on(e){try{return decodeURIComponent(""+e)}catch{}return""+e}const tu=/\/$/,nu=e=>e.replace(tu,"");function ls(e,t,n="/"){let s,r={},o="",i="";const l=t.indexOf("#");let c=t.indexOf("?");return l=0&&(c=-1),c>-1&&(s=t.slice(0,c),o=t.slice(c+1,l>-1?l:t.length),r=e(o)),l>-1&&(s=s||t.slice(0,l),i=t.slice(l,t.length)),s=iu(s!=null?s:t,n),{fullPath:s+(o&&"?")+o+i,path:s,query:r,hash:on(i)}}function su(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function Cr(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function ru(e,t,n){const s=t.matched.length-1,r=n.matched.length-1;return s>-1&&s===r&&Nt(t.matched[s],n.matched[r])&&ti(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function Nt(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function ti(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!ou(e[n],t[n]))return!1;return!0}function ou(e,t){return Fe(e)?Rr(e,t):Fe(t)?Rr(t,e):e===t}function Rr(e,t){return Fe(t)?e.length===t.length&&e.every((n,s)=>n===t[s]):e.length===1&&e[0]===t}function iu(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,i,l;for(i=0;i1&&o--;else break;return n.slice(0,o).join("/")+"/"+s.slice(i).join("/")}const rt={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};var ln;(function(e){e.pop="pop",e.push="push"})(ln||(ln={}));var Qt;(function(e){e.back="back",e.forward="forward",e.unknown=""})(Qt||(Qt={}));function lu(e){if(!e)if(Et){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),nu(e)}const cu=/^[^#]+#/;function uu(e,t){return e.replace(cu,"#")+t}function fu(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 Jn=()=>({left:window.scrollX,top:window.scrollY});function au(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=fu(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 Tr(e,t){return(history.state?history.state.position-t:-1)+e}const bs=new Map;function du(e,t){bs.set(e,t)}function hu(e){const t=bs.get(e);return bs.delete(e),t}let pu=()=>location.protocol+"//"+location.host;function ni(e,t){const{pathname:n,search:s,hash:r}=t,o=e.indexOf("#");if(o>-1){let l=r.includes(e.slice(o))?e.slice(o).length:1,c=r.slice(l);return c[0]!=="/"&&(c="/"+c),Cr(c,"")}return Cr(n,e)+s+r}function gu(e,t,n,s){let r=[],o=[],i=null;const l=({state:g})=>{const m=ni(e,location),A=n.value,O=t.value;let V=0;if(g){if(n.value=m,t.value=g,i&&i===A){i=null;return}V=O?g.position-O.position:0}else s(m);r.forEach(N=>{N(n.value,A,{delta:V,type:ln.pop,direction:V?V>0?Qt.forward:Qt.back:Qt.unknown})})};function c(){i=n.value}function d(g){r.push(g);const m=()=>{const A=r.indexOf(g);A>-1&&r.splice(A,1)};return o.push(m),m}function f(){const{history:g}=window;!g.state||g.replaceState(W({},g.state,{scroll:Jn()}),"")}function h(){for(const g of o)g();o=[],window.removeEventListener("popstate",l),window.removeEventListener("beforeunload",f)}return window.addEventListener("popstate",l),window.addEventListener("beforeunload",f,{passive:!0}),{pauseListeners:c,listen:d,destroy:h}}function Ar(e,t,n,s=!1,r=!1){return{back:e,current:t,forward:n,replaced:s,position:window.history.length,scroll:r?Jn():null}}function mu(e){const{history:t,location:n}=window,s={value:ni(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,f){const h=e.indexOf("#"),g=h>-1?(n.host&&document.querySelector("base")?e:e.slice(h))+c:pu()+e+c;try{t[f?"replaceState":"pushState"](d,"",g),r.value=d}catch(m){console.error(m),n[f?"replace":"assign"](g)}}function i(c,d){const f=W({},t.state,Ar(r.value.back,c,r.value.forward,!0),d,{position:r.value.position});o(c,f,!0),s.value=c}function l(c,d){const f=W({},r.value,t.state,{forward:c,scroll:Jn()});o(f.current,f,!0);const h=W({},Ar(s.value,c,null),{position:f.position+1},d);o(c,h,!1),s.value=c}return{location:s,state:r,push:l,replace:i}}function vu(e){e=lu(e);const t=mu(e),n=gu(e,t.state,t.location,t.replace);function s(o,i=!0){i||n.pauseListeners(),history.go(o)}const r=W({location:"",base:e,go:s,createHref:uu.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 _u(e){return typeof e=="string"||e&&typeof e=="object"}function si(e){return typeof e=="string"||typeof e=="symbol"}const ri=Symbol("");var Pr;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(Pr||(Pr={}));function kt(e,t){return W(new Error,{type:e,[ri]:!0},t)}function Ge(e,t){return e instanceof Error&&ri in e&&(t==null||!!(e.type&t))}const Or="[^/]+?",yu={sensitive:!1,strict:!1,start:!0,end:!0},bu=/[.+*?^${}()[\]/\\]/g;function Su(e,t){const n=W({},yu,t),s=[];let r=n.start?"^":"";const o=[];for(const d of e){const f=d.length?[]:[90];n.strict&&!d.length&&(r+="/");for(let h=0;ht.length?t.length===1&&t[0]===40+40?1:-1:0}function oi(e,t){let n=0;const s=e.score,r=t.score;for(;n0&&t[t.length-1]<0}const wu={type:0,value:""},Eu=/[a-zA-Z0-9_]/;function Cu(e){if(!e)return[[]];if(e==="/")return[[wu]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(m){throw new Error(`ERR (${n})/"${d}": ${m}`)}let n=0,s=n;const r=[];let o;function i(){o&&r.push(o),o=[]}let l=0,c,d="",f="";function h(){!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:f,repeatable:c==="*"||c==="+",optional:c==="*"||c==="?"})):t("Invalid state to consume buffer"),d="")}function g(){d+=c}for(;l{i(k)}:Yt}function i(h){if(si(h)){const g=s.get(h);g&&(s.delete(h),n.splice(n.indexOf(g),1),g.children.forEach(i),g.alias.forEach(i))}else{const g=n.indexOf(h);g>-1&&(n.splice(g,1),h.record.name&&s.delete(h.record.name),h.children.forEach(i),h.alias.forEach(i))}}function l(){return n}function c(h){const g=Ou(h,n);n.splice(g,0,h),h.record.name&&!Fr(h)&&s.set(h.record.name,h)}function d(h,g){let m,A={},O,V;if("name"in h&&h.name){if(m=s.get(h.name),!m)throw kt(1,{location:h});V=m.record.name,A=W(Ir(g.params,m.keys.filter(k=>!k.optional).concat(m.parent?m.parent.keys.filter(k=>k.optional):[]).map(k=>k.name)),h.params&&Ir(h.params,m.keys.map(k=>k.name))),O=m.stringify(A)}else if(h.path!=null)O=h.path,m=n.find(k=>k.re.test(O)),m&&(A=m.parse(O),V=m.record.name);else{if(m=g.name?s.get(g.name):n.find(k=>k.re.test(g.path)),!m)throw kt(1,{location:h,currentLocation:g});V=m.record.name,A=W({},g.params,h.params),O=m.stringify(A)}const N=[];let M=m;for(;M;)N.unshift(M.record),M=M.parent;return{name:V,path:O,params:A,matched:N,meta:Pu(N)}}e.forEach(h=>o(h));function f(){n.length=0,s.clear()}return{addRoute:o,resolve:d,removeRoute:i,clearRoutes:f,getRoutes:l,getRecordMatcher:r}}function Ir(e,t){const n={};for(const s of t)s in e&&(n[s]=e[s]);return n}function Dr(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:Au(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 Au(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 Fr(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Pu(e){return e.reduce((t,n)=>W(t,n.meta),{})}function Nr(e,t){const n={};for(const s in e)n[s]=s in t?t[s]:e[s];return n}function Ou(e,t){let n=0,s=t.length;for(;n!==s;){const o=n+s>>1;oi(e,t[o])<0?s=o:n=o+1}const r=Mu(e);return r&&(s=t.lastIndexOf(r,s-1)),s}function Mu(e){let t=e;for(;t=t.parent;)if(ii(t)&&oi(e,t)===0)return t}function ii({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function Iu(e){const t={};if(e===""||e==="?")return t;const s=(e[0]==="?"?e.slice(1):e).split("&");for(let r=0;ro&&ys(o)):[s&&ys(s)]).forEach(o=>{o!==void 0&&(t+=(t.length?"&":"")+n,o!=null&&(t+="="+o))})}return t}function Du(e){const t={};for(const n in e){const s=e[n];s!==void 0&&(t[n]=Fe(s)?s.map(r=>r==null?null:""+r):s==null?s:""+s)}return t}const Fu=Symbol(""),Lr=Symbol(""),Us=Symbol(""),li=Symbol(""),Ss=Symbol("");function Vt(){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 lt(e,t,n,s,r,o=i=>i()){const i=s&&(s.enterCallbacks[r]=s.enterCallbacks[r]||[]);return()=>new Promise((l,c)=>{const d=g=>{g===!1?c(kt(4,{from:n,to:t})):g instanceof Error?c(g):_u(g)?c(kt(2,{from:t,to:g})):(i&&s.enterCallbacks[r]===i&&typeof g=="function"&&i.push(g),l())},f=o(()=>e.call(s&&s.instances[r],t,n,d));let h=Promise.resolve(f);e.length<3&&(h=h.then(d)),h.catch(g=>c(g))})}function cs(e,t,n,s,r=o=>o()){const o=[];for(const i of e)for(const l in i.components){let c=i.components[l];if(!(t!=="beforeRouteEnter"&&!i.instances[l]))if(Jo(c)){const f=(c.__vccOpts||c)[t];f&&o.push(lt(f,n,s,i,l,r))}else{let d=c();o.push(()=>d.then(f=>{if(!f)throw new Error(`Couldn't resolve component "${l}" at "${i.path}"`);const h=Vc(f)?f.default:f;i.mods[l]=f,i.components[l]=h;const m=(h.__vccOpts||h)[t];return m&<(m,n,s,i,l,r)()}))}}return o}function jr(e){const t=Qe(Us),n=Qe(li),s=Me(()=>{const c=Ot(e.to);return t.resolve(c)}),r=Me(()=>{const{matched:c}=s.value,{length:d}=c,f=c[d-1],h=n.matched;if(!f||!h.length)return-1;const g=h.findIndex(Nt.bind(null,f));if(g>-1)return g;const m=Hr(c[d-2]);return d>1&&Hr(f)===m&&h[h.length-1].path!==m?h.findIndex(Nt.bind(null,c[d-2])):g}),o=Me(()=>r.value>-1&&Hu(n.params,s.value.params)),i=Me(()=>r.value>-1&&r.value===n.matched.length-1&&ti(n.params,s.value.params));function l(c={}){if(ju(c)){const d=t[Ot(e.replace)?"replace":"push"](Ot(e.to)).catch(Yt);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>d),d}return Promise.resolve()}return{route:s,href:Me(()=>s.value.href),isActive:o,isExactActive:i,navigate:l}}function Nu(e){return e.length===1?e[0]:e}const ku=bo({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:jr,setup(e,{slots:t}){const n=Bn(jr(e)),{options:s}=Qe(Us),r=Me(()=>({[$r(e.activeClass,s.linkActiveClass,"router-link-active")]:n.isActive,[$r(e.exactActiveClass,s.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const o=t.default&&Nu(t.default(n));return e.custom?o:qo("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:r.value},o)}}}),Lu=ku;function ju(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 Hu(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(!Fe(r)||r.length!==s.length||s.some((o,i)=>o!==r[i]))return!1}return!0}function Hr(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const $r=(e,t,n)=>e!=null?e:t!=null?t:n,$u=bo({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const s=Qe(Ss),r=Me(()=>e.route||s.value),o=Qe(Lr,0),i=Me(()=>{let d=Ot(o);const{matched:f}=r.value;let h;for(;(h=f[d])&&!h.components;)d++;return d}),l=Me(()=>r.value.matched[i.value]);_n(Lr,Me(()=>i.value+1)),_n(Fu,l),_n(Ss,r);const c=Ui();return yn(()=>[c.value,l.value,e.name],([d,f,h],[g,m,A])=>{f&&(f.instances[h]=d,m&&m!==f&&d&&d===g&&(f.leaveGuards.size||(f.leaveGuards=m.leaveGuards),f.updateGuards.size||(f.updateGuards=m.updateGuards))),d&&f&&(!m||!Nt(f,m)||!g)&&(f.enterCallbacks[h]||[]).forEach(O=>O(d))},{flush:"post"}),()=>{const d=r.value,f=e.name,h=l.value,g=h&&h.components[f];if(!g)return Vr(n.default,{Component:g,route:d});const m=h.props[f],A=m?m===!0?d.params:typeof m=="function"?m(d):m:null,V=qo(g,W({},A,t,{onVnodeUnmounted:N=>{N.component.isUnmounted&&(h.instances[f]=null)},ref:c}));return Vr(n.default,{Component:V,route:d})||V}}});function Vr(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const Vu=$u;function Bu(e){const t=Tu(e.routes,e),n=e.parseQuery||Iu,s=e.stringifyQuery||kr,r=e.history,o=Vt(),i=Vt(),l=Vt(),c=Ki(rt);let d=rt;Et&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const f=is.bind(null,_=>""+_),h=is.bind(null,eu),g=is.bind(null,on);function m(_,P){let R,I;return si(_)?(R=t.getRecordMatcher(_),I=P):I=_,t.addRoute(I,R)}function A(_){const P=t.getRecordMatcher(_);P&&t.removeRoute(P)}function O(){return t.getRoutes().map(_=>_.record)}function V(_){return!!t.getRecordMatcher(_)}function N(_,P){if(P=W({},P||c.value),typeof _=="string"){const a=ls(n,_,P.path),p=t.resolve({path:a.path},P),b=r.createHref(a.fullPath);return W(a,p,{params:g(p.params),hash:on(a.hash),redirectedFrom:void 0,href:b})}let R;if(_.path!=null)R=W({},_,{path:ls(n,_.path,P.path).path});else{const a=W({},_.params);for(const p in a)a[p]==null&&delete a[p];R=W({},_,{params:h(a)}),P.params=h(P.params)}const I=t.resolve(R,P),K=_.hash||"";I.params=f(g(I.params));const te=su(s,W({},_,{hash:Qc(K),path:I.path})),u=r.createHref(te);return W({fullPath:te,hash:K,query:s===kr?Du(_.query):_.query||{}},I,{redirectedFrom:void 0,href:u})}function M(_){return typeof _=="string"?ls(n,_,c.value.path):W({},_)}function k(_,P){if(d!==_)return kt(8,{from:P,to:_})}function D(_){return ne(_)}function Y(_){return D(W(M(_),{replace:!0}))}function ce(_){const P=_.matched[_.matched.length-1];if(P&&P.redirect){const{redirect:R}=P;let I=typeof R=="function"?R(_):R;return typeof I=="string"&&(I=I.includes("?")||I.includes("#")?I=M(I):{path:I},I.params={}),W({query:_.query,hash:_.hash,params:I.path!=null?{}:_.params},I)}}function ne(_,P){const R=d=N(_),I=c.value,K=_.state,te=_.force,u=_.replace===!0,a=ce(R);if(a)return ne(W(M(a),{state:typeof a=="object"?W({},K,a.state):K,force:te,replace:u}),P||R);const p=R;p.redirectedFrom=P;let b;return!te&&ru(s,I,R)&&(b=kt(16,{to:p,from:I}),je(I,I,!0,!1)),(b?Promise.resolve(b):ke(p,I)).catch(v=>Ge(v)?Ge(v,2)?v:st(v):U(v,p,I)).then(v=>{if(v){if(Ge(v,2))return ne(W({replace:u},M(v.to),{state:typeof v.to=="object"?W({},K,v.to.state):K,force:te}),P||p)}else v=at(p,I,!0,u,K);return nt(p,I,v),v})}function Ne(_,P){const R=k(_,P);return R?Promise.reject(R):Promise.resolve()}function tt(_){const P=St.values().next().value;return P&&typeof P.runWithContext=="function"?P.runWithContext(_):_()}function ke(_,P){let R;const[I,K,te]=Uu(_,P);R=cs(I.reverse(),"beforeRouteLeave",_,P);for(const a of I)a.leaveGuards.forEach(p=>{R.push(lt(p,_,P))});const u=Ne.bind(null,_,P);return R.push(u),Te(R).then(()=>{R=[];for(const a of o.list())R.push(lt(a,_,P));return R.push(u),Te(R)}).then(()=>{R=cs(K,"beforeRouteUpdate",_,P);for(const a of K)a.updateGuards.forEach(p=>{R.push(lt(p,_,P))});return R.push(u),Te(R)}).then(()=>{R=[];for(const a of te)if(a.beforeEnter)if(Fe(a.beforeEnter))for(const p of a.beforeEnter)R.push(lt(p,_,P));else R.push(lt(a.beforeEnter,_,P));return R.push(u),Te(R)}).then(()=>(_.matched.forEach(a=>a.enterCallbacks={}),R=cs(te,"beforeRouteEnter",_,P,tt),R.push(u),Te(R))).then(()=>{R=[];for(const a of i.list())R.push(lt(a,_,P));return R.push(u),Te(R)}).catch(a=>Ge(a,8)?a:Promise.reject(a))}function nt(_,P,R){l.list().forEach(I=>tt(()=>I(_,P,R)))}function at(_,P,R,I,K){const te=k(_,P);if(te)return te;const u=P===rt,a=Et?history.state:{};R&&(I||u?r.replace(_.fullPath,W({scroll:u&&a&&a.scroll},K)):r.push(_.fullPath,K)),c.value=_,je(_,P,R,u),st()}let Le;function Lt(){Le||(Le=r.listen((_,P,R)=>{if(!dn.listening)return;const I=N(_),K=ce(I);if(K){ne(W(K,{replace:!0,force:!0}),I).catch(Yt);return}d=I;const te=c.value;Et&&du(Tr(te.fullPath,R.delta),Jn()),ke(I,te).catch(u=>Ge(u,12)?u:Ge(u,2)?(ne(W(M(u.to),{force:!0}),I).then(a=>{Ge(a,20)&&!R.delta&&R.type===ln.pop&&r.go(-1,!1)}).catch(Yt),Promise.reject()):(R.delta&&r.go(-R.delta,!1),U(u,I,te))).then(u=>{u=u||at(I,te,!1),u&&(R.delta&&!Ge(u,8)?r.go(-R.delta,!1):R.type===ln.pop&&Ge(u,20)&&r.go(-1,!1)),nt(I,te,u)}).catch(Yt)}))}let yt=Vt(),ie=Vt(),J;function U(_,P,R){st(_);const I=ie.list();return I.length?I.forEach(K=>K(_,P,R)):console.error(_),Promise.reject(_)}function We(){return J&&c.value!==rt?Promise.resolve():new Promise((_,P)=>{yt.add([_,P])})}function st(_){return J||(J=!_,Lt(),yt.list().forEach(([P,R])=>_?R(_):P()),yt.reset()),_}function je(_,P,R,I){const{scrollBehavior:K}=e;if(!Et||!K)return Promise.resolve();const te=!R&&hu(Tr(_.fullPath,0))||(I||!R)&&history.state&&history.state.scroll||null;return Fs().then(()=>K(_,P,te)).then(u=>u&&au(u)).catch(u=>U(u,_,P))}const _e=_=>r.go(_);let bt;const St=new Set,dn={currentRoute:c,listening:!0,addRoute:m,removeRoute:A,clearRoutes:t.clearRoutes,hasRoute:V,getRoutes:O,resolve:N,options:e,push:D,replace:Y,go:_e,back:()=>_e(-1),forward:()=>_e(1),beforeEach:o.add,beforeResolve:i.add,afterEach:l.add,onError:ie.add,isReady:We,install(_){const P=this;_.component("RouterLink",Lu),_.component("RouterView",Vu),_.config.globalProperties.$router=P,Object.defineProperty(_.config.globalProperties,"$route",{enumerable:!0,get:()=>Ot(c)}),Et&&!bt&&c.value===rt&&(bt=!0,D(r.location).catch(K=>{}));const R={};for(const K in rt)Object.defineProperty(R,K,{get:()=>c.value[K],enumerable:!0});_.provide(Us,P),_.provide(li,fo(R)),_.provide(Ss,c);const I=_.unmount;St.add(_),_.unmount=function(){St.delete(_),St.size<1&&(d=rt,Le&&Le(),Le=null,c.value=rt,bt=!1,J=!1),I()}}};function Te(_){return _.reduce((P,R)=>P.then(()=>tt(R)),Promise.resolve())}return dn}function Uu(e,t){const n=[],s=[],r=[],o=Math.max(t.matched.length,e.matched.length);for(let i=0;iNt(d,l))?s.push(l):n.push(l));const c=e.matched[i];c&&(t.matched.find(d=>Nt(d,c))||r.push(c))}return[n,s,r]}const Ku={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}}}},Wu={class:"login-container"},qu={class:"form-group"},Gu={class:"form-group"},zu=["disabled"],Ju={key:0,class:"error-message"},Yu={key:1,class:"success-message"};function Qu(e,t,n,s,r,o){return se(),oe("div",Wu,[t[5]||(t[5]=y("div",{class:"logo"},"\u{1F437}",-1)),t[6]||(t[6]=y("h1",null,"\u732A\u573A\u7BA1\u7406\u7CFB\u7EDF",-1)),t[7]||(t[7]=y("p",{class:"subtitle"},"\u8BF7\u767B\u5F55\u60A8\u7684\u8D26\u6237",-1)),y("form",{onSubmit:t[2]||(t[2]=zo((...i)=>o.handleLogin&&o.handleLogin(...i),["prevent"]))},[y("div",qu,[t[3]||(t[3]=y("label",{for:"username"},"\u7528\u6237\u540D",-1)),Ct(y("input",{type:"text",id:"username","onUpdate:modelValue":t[0]||(t[0]=i=>r.loginForm.username=i),required:"",placeholder:"\u8BF7\u8F93\u5165\u7528\u6237\u540D"},null,512),[[Fn,r.loginForm.username]])]),y("div",Gu,[t[4]||(t[4]=y("label",{for:"password"},"\u5BC6\u7801",-1)),Ct(y("input",{type:"password",id:"password","onUpdate:modelValue":t[1]||(t[1]=i=>r.loginForm.password=i),required:"",placeholder:"\u8BF7\u8F93\u5165\u5BC6\u7801"},null,512),[[Fn,r.loginForm.password]])]),y("button",{type:"submit",disabled:r.loading},ae(r.loading?"\u767B\u5F55\u4E2D...":"\u767B\u5F55"),9,zu)],32),r.error?(se(),oe("div",Ju,ae(r.error),1)):gt("",!0),r.success?(se(),oe("div",Yu,ae(r.success),1)):gt("",!0)])}const Xu=zn(Ku,[["render",Qu],["__scopeId","data-v-bb5c78dc"]]);const Zu={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"}`)}}},ef={class:"header"},tf={class:"user-info"},nf={class:"nav"},sf={class:"container"},rf={class:"device-control"},of={class:"control-grid"},lf={class:"control-item"},cf={class:"control-buttons"},uf={class:"control-item"},ff={class:"control-buttons"};function af(e,t,n,s,r,o){const i=Ls("router-link");return se(),oe("div",null,[y("div",ef,[t[5]||(t[5]=y("h1",null,"\u{1F437} \u732A\u573A\u7BA1\u7406\u7CFB\u7EDF",-1)),y("div",tf,[y("span",null,ae(r.username),1),y("button",{class:"logout-btn",onClick:t[0]||(t[0]=(...l)=>o.logout&&o.logout(...l))},"\u9000\u51FA\u767B\u5F55")])]),y("div",nf,[y("ul",null,[y("li",null,[ge(i,{to:"/dashboard",class:"active"},{default:tn(()=>[...t[6]||(t[6]=[sn("\u63A7\u5236\u53F0",-1)])]),_:1})]),y("li",null,[ge(i,{to:"/device"},{default:tn(()=>[...t[7]||(t[7]=[sn("\u8BBE\u5907\u7BA1\u7406",-1)])]),_:1})])])]),y("div",sf,[t[11]||(t[11]=y("div",{class:"dashboard-grid"},[y("div",{class:"card"},[y("h3",null,"\u{1F4C8} \u73AF\u5883\u76D1\u63A7"),y("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")]),y("div",{class:"card"},[y("h3",null,"\u{1F514} \u544A\u8B66\u4FE1\u606F"),y("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")]),y("div",{class:"card"},[y("h3",null,"\u{1F4CA} \u6570\u636E\u5206\u6790"),y("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)),y("div",rf,[t[10]||(t[10]=y("h3",null,"\u2699\uFE0F \u8BBE\u5907\u63A7\u5236",-1)),y("div",of,[y("div",lf,[t[8]||(t[8]=y("h4",null,"\u98CE\u673A\u63A7\u5236",-1)),y("div",cf,[y("button",{class:"control-btn on-btn",onClick:t[1]||(t[1]=l=>o.controlDevice("fan","on"))},"\u5F00\u542F"),y("button",{class:"control-btn off-btn",onClick:t[2]||(t[2]=l=>o.controlDevice("fan","off"))},"\u5173\u95ED")])]),y("div",uf,[t[9]||(t[9]=y("h4",null,"\u6C34\u5E18\u63A7\u5236",-1)),y("div",ff,[y("button",{class:"control-btn on-btn",onClick:t[3]||(t[3]=l=>o.controlDevice("water_curtain","on"))},"\u5F00\u542F"),y("button",{class:"control-btn off-btn",onClick:t[4]||(t[4]=l=>o.controlDevice("water_curtain","off"))},"\u5173\u95ED")])])])])])])}const df=zn(Zu,[["render",af],["__scopeId","data-v-7c1d0503"]]);const hf={name:"Device",data(){return{username:localStorage.getItem("username")||"\u7BA1\u7406\u5458",devices:[],showModal:!1,editingDevice:null,deviceForm:{id:null,name:"",type:"",parent_id:null}}},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("/")},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"):[]},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: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)}},openAddDeviceModal(){this.editingDevice=null,this.deviceForm={id:null,name:"",type:"",parent_id:null},this.showModal=!0},editDevice(e){this.editingDevice=e,this.deviceForm={...e},delete this.deviceForm.status,this.showModal=!0},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;this.editingDevice?e=await fetch("/api/v1/device/update",{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+localStorage.getItem("authToken")},body:JSON.stringify({id:this.deviceForm.id,name:this.deviceForm.name,type:this.deviceForm.type,parent_id:this.deviceForm.parent_id})}):e=await fetch("/api/v1/device/create",{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+localStorage.getItem("authToken")},body:JSON.stringify({name:this.deviceForm.name,type:this.deviceForm.type,parent_id:this.deviceForm.parent_id})});const t=await e.json();e.ok&&t.code===0?(this.closeDeviceModal(),this.loadDevices()):alert("\u64CD\u4F5C\u5931\u8D25: "+t.message)}catch(e){console.error("\u64CD\u4F5C\u5931\u8D25:",e),alert("\u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u67E5\u770B\u63A7\u5236\u53F0\u4E86\u89E3\u8BE6\u60C5")}},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?this.loadDevices():alert("\u5220\u9664\u5931\u8D25: "+n.message)}catch(t){console.error("\u5220\u9664\u5931\u8D25:",t),alert("\u5220\u9664\u5931\u8D25\uFF0C\u8BF7\u67E5\u770B\u63A7\u5236\u53F0\u4E86\u89E3\u8BE6\u60C5")}}}},pf={class:"header"},gf={class:"user-info"},mf={class:"nav"},vf={class:"container"},_f={class:"page-header"},yf={class:"device-tree",id:"deviceTree"},bf={key:0},Sf={class:"node-header"},xf={class:"node-title"},wf={class:"node-actions"},Ef=["onClick"],Cf=["onClick"],Rf={key:0,class:"children"},Tf={class:"node-header"},Af={class:"node-title"},Pf={class:"node-type controller-type"},Of={class:"node-actions"},Mf=["onClick"],If=["onClick"],Df={key:0,class:"children"},Ff={class:"node-header"},Nf={class:"node-title"},kf={class:"node-type device-type"},Lf={class:"node-actions"},jf=["onClick"],Hf=["onClick"],$f={key:0,class:"modal"},Vf={class:"modal-content"},Bf={class:"modal-header"},Uf={class:"modal-body"},Kf={class:"form-group"},Wf={class:"form-group"},qf={key:0,class:"form-group"},Gf=["value"],zf={class:"modal-footer"};function Jf(e,t,n,s,r,o){const i=Ls("router-link");return se(),oe("div",null,[y("div",pf,[t[11]||(t[11]=y("h1",null,"\u{1F437} \u732A\u573A\u7BA1\u7406\u7CFB\u7EDF",-1)),y("div",gf,[y("span",null,ae(r.username),1),y("button",{class:"logout-btn",onClick:t[0]||(t[0]=(...l)=>o.logout&&o.logout(...l))},"\u9000\u51FA\u767B\u5F55")])]),y("div",mf,[y("ul",null,[y("li",null,[ge(i,{to:"/dashboard"},{default:tn(()=>[...t[12]||(t[12]=[sn("\u63A7\u5236\u53F0",-1)])]),_:1})]),y("li",null,[ge(i,{to:"/device",class:"active"},{default:tn(()=>[...t[13]||(t[13]=[sn("\u8BBE\u5907\u7BA1\u7406",-1)])]),_:1})])])]),y("div",vf,[y("div",_f,[t[14]||(t[14]=y("h2",null,"\u8BBE\u5907\u7BA1\u7406",-1)),y("button",{class:"btn btn-primary",onClick:t[1]||(t[1]=(...l)=>o.openAddDeviceModal&&o.openAddDeviceModal(...l))},"\u6DFB\u52A0\u8BBE\u5907")]),y("div",yf,[r.devices.length===0?(se(),oe("div",bf," \u6682\u65E0\u8BBE\u5907\u6570\u636E ")):gt("",!0),(se(!0),oe(Ee,null,mn(o.relayDevices,l=>(se(),oe("div",{key:l.id,class:"tree-node relay-node"},[y("div",Sf,[y("div",xf,[y("span",null,ae(l.name),1),t[15]||(t[15]=y("span",{class:"node-type relay-type"},"\u4E2D\u7EE7",-1)),y("span",{class:At("status-"+l.status)},ae(l.status==="active"?"\u542F\u7528":"\u505C\u7528"),3)]),y("div",wf,[y("button",{class:"action-btn edit-btn",onClick:c=>o.editDevice(l)},"\u7F16\u8F91",8,Ef),y("button",{class:"action-btn delete-btn",onClick:c=>o.deleteDevice(l.id)},"\u5220\u9664",8,Cf)])]),o.getControllerDevices(l.id).length>0?(se(),oe("div",Rf,[(se(!0),oe(Ee,null,mn(o.getControllerDevices(l.id),c=>(se(),oe("div",{key:c.id,class:"tree-node controller-node"},[y("div",Tf,[y("div",Af,[y("span",null,ae(c.name),1),y("span",Pf,ae(o.getDeviceTypeText(c.type)),1),y("span",{class:At("status-"+c.status)},ae(c.status==="active"?"\u542F\u7528":"\u505C\u7528"),3)]),y("div",Of,[y("button",{class:"action-btn edit-btn",onClick:d=>o.editDevice(c)},"\u7F16\u8F91",8,Mf),y("button",{class:"action-btn delete-btn",onClick:d=>o.deleteDevice(c.id)},"\u5220\u9664",8,If)])]),o.getLeafDevices(c.id).length>0?(se(),oe("div",Df,[(se(!0),oe(Ee,null,mn(o.getLeafDevices(c.id),d=>(se(),oe("div",{key:d.id,class:"tree-node device-node"},[y("div",Ff,[y("div",Nf,[y("span",null,ae(d.name),1),y("span",kf,ae(o.getDeviceTypeText(d.type)),1),y("span",{class:At("status-"+d.status)},ae(d.status==="active"?"\u542F\u7528":"\u505C\u7528"),3)]),y("div",Lf,[y("button",{class:"action-btn edit-btn",onClick:f=>o.editDevice(d)},"\u7F16\u8F91",8,jf),y("button",{class:"action-btn delete-btn",onClick:f=>o.deleteDevice(d.id)},"\u5220\u9664",8,Hf)])])]))),128))])):gt("",!0)]))),128))])):gt("",!0)]))),128))])]),r.showModal?(se(),oe("div",$f,[y("div",Vf,[y("div",Bf,[y("h3",null,ae(r.editingDevice?"\u7F16\u8F91\u8BBE\u5907":"\u6DFB\u52A0\u8BBE\u5907"),1),y("button",{class:"close-btn",onClick:t[2]||(t[2]=(...l)=>o.closeDeviceModal&&o.closeDeviceModal(...l))},"\xD7")]),y("div",Uf,[y("form",{onSubmit:t[8]||(t[8]=zo((...l)=>o.saveDevice&&o.saveDevice(...l),["prevent"]))},[Ct(y("input",{type:"hidden","onUpdate:modelValue":t[3]||(t[3]=l=>r.deviceForm.id=l)},null,512),[[Fn,r.deviceForm.id]]),y("div",Kf,[t[16]||(t[16]=y("label",{for:"deviceName"},"\u8BBE\u5907\u540D\u79F0",-1)),Ct(y("input",{type:"text",id:"deviceName","onUpdate:modelValue":t[4]||(t[4]=l=>r.deviceForm.name=l),required:""},null,512),[[Fn,r.deviceForm.name]])]),y("div",Wf,[t[18]||(t[18]=y("label",{for:"deviceType"},"\u8BBE\u5907\u7C7B\u578B",-1)),Ct(y("select",{id:"deviceType","onUpdate:modelValue":t[5]||(t[5]=l=>r.deviceForm.type=l),required:"",onChange:t[6]||(t[6]=(...l)=>e.toggleParentField&&e.toggleParentField(...l))},[...t[17]||(t[17]=[Ql('',6)])],544),[[xr,r.deviceForm.type]])]),r.deviceForm.type!=="relay"&&r.deviceForm.type!==""?(se(),oe("div",qf,[t[20]||(t[20]=y("label",{for:"parentId"},"\u4E0A\u7EA7\u8BBE\u5907",-1)),Ct(y("select",{id:"parentId","onUpdate:modelValue":t[7]||(t[7]=l=>r.deviceForm.parent_id=l)},[t[19]||(t[19]=y("option",{value:""},"\u8BF7\u9009\u62E9\u4E0A\u7EA7\u8BBE\u5907",-1)),(se(!0),oe(Ee,null,mn(o.getParentDevices(r.deviceForm.type),l=>(se(),oe("option",{key:l.id,value:l.id},ae(l.name),9,Gf))),128))],512),[[xr,r.deviceForm.parent_id]])])):gt("",!0)],32)]),y("div",zf,[y("button",{class:"btn btn-secondary",onClick:t[9]||(t[9]=(...l)=>o.closeDeviceModal&&o.closeDeviceModal(...l))},"\u53D6\u6D88"),y("button",{class:"btn btn-primary",onClick:t[10]||(t[10]=(...l)=>o.saveDevice&&o.saveDevice(...l))},"\u4FDD\u5B58")])])])):gt("",!0)])}const Yf=zn(hf,[["render",Jf],["__scopeId","data-v-2590e5dc"]]),Qf=[{path:"/",name:"Login",component:Xu},{path:"/dashboard",name:"Dashboard",component:df,meta:{requiresAuth:!0}},{path:"/device",name:"Device",component:Yf,meta:{requiresAuth:!0}}],ci=Bu({history:vu(),routes:Qf});ci.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 ui=Fc($c);ui.use(ci);ui.mount("#app"); + */const Et=typeof document<"u";function Jo(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function Vc(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&Jo(e.default)}const W=Object.assign;function is(e,t){const n={};for(const s in t){const r=t[s];n[s]=Fe(r)?r.map(e):e(r)}return n}const Yt=()=>{},Fe=Array.isArray,Yo=/#/g,Bc=/&/g,Uc=/\//g,Kc=/=/g,Wc=/\?/g,Qo=/\+/g,qc=/%5B/g,Gc=/%5D/g,Xo=/%5E/g,zc=/%60/g,Zo=/%7B/g,Jc=/%7C/g,ei=/%7D/g,Yc=/%20/g;function Bs(e){return encodeURI(""+e).replace(Jc,"|").replace(qc,"[").replace(Gc,"]")}function Qc(e){return Bs(e).replace(Zo,"{").replace(ei,"}").replace(Xo,"^")}function ys(e){return Bs(e).replace(Qo,"%2B").replace(Yc,"+").replace(Yo,"%23").replace(Bc,"%26").replace(zc,"`").replace(Zo,"{").replace(ei,"}").replace(Xo,"^")}function Xc(e){return ys(e).replace(Kc,"%3D")}function Zc(e){return Bs(e).replace(Yo,"%23").replace(Wc,"%3F")}function eu(e){return e==null?"":Zc(e).replace(Uc,"%2F")}function on(e){try{return decodeURIComponent(""+e)}catch{}return""+e}const tu=/\/$/,nu=e=>e.replace(tu,"");function ls(e,t,n="/"){let s,r={},o="",i="";const l=t.indexOf("#");let c=t.indexOf("?");return l=0&&(c=-1),c>-1&&(s=t.slice(0,c),o=t.slice(c+1,l>-1?l:t.length),r=e(o)),l>-1&&(s=s||t.slice(0,l),i=t.slice(l,t.length)),s=iu(s!=null?s:t,n),{fullPath:s+(o&&"?")+o+i,path:s,query:r,hash:on(i)}}function su(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function Cr(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function ru(e,t,n){const s=t.matched.length-1,r=n.matched.length-1;return s>-1&&s===r&&Nt(t.matched[s],n.matched[r])&&ti(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function Nt(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function ti(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!ou(e[n],t[n]))return!1;return!0}function ou(e,t){return Fe(e)?Rr(e,t):Fe(t)?Rr(t,e):e===t}function Rr(e,t){return Fe(t)?e.length===t.length&&e.every((n,s)=>n===t[s]):e.length===1&&e[0]===t}function iu(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,i,l;for(i=0;i1&&o--;else break;return n.slice(0,o).join("/")+"/"+s.slice(i).join("/")}const rt={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};var ln;(function(e){e.pop="pop",e.push="push"})(ln||(ln={}));var Qt;(function(e){e.back="back",e.forward="forward",e.unknown=""})(Qt||(Qt={}));function lu(e){if(!e)if(Et){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),nu(e)}const cu=/^[^#]+#/;function uu(e,t){return e.replace(cu,"#")+t}function fu(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 Jn=()=>({left:window.scrollX,top:window.scrollY});function au(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=fu(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 Tr(e,t){return(history.state?history.state.position-t:-1)+e}const bs=new Map;function du(e,t){bs.set(e,t)}function hu(e){const t=bs.get(e);return bs.delete(e),t}let pu=()=>location.protocol+"//"+location.host;function ni(e,t){const{pathname:n,search:s,hash:r}=t,o=e.indexOf("#");if(o>-1){let l=r.includes(e.slice(o))?e.slice(o).length:1,c=r.slice(l);return c[0]!=="/"&&(c="/"+c),Cr(c,"")}return Cr(n,e)+s+r}function gu(e,t,n,s){let r=[],o=[],i=null;const l=({state:g})=>{const m=ni(e,location),A=n.value,O=t.value;let V=0;if(g){if(n.value=m,t.value=g,i&&i===A){i=null;return}V=O?g.position-O.position:0}else s(m);r.forEach(N=>{N(n.value,A,{delta:V,type:ln.pop,direction:V?V>0?Qt.forward:Qt.back:Qt.unknown})})};function c(){i=n.value}function d(g){r.push(g);const m=()=>{const A=r.indexOf(g);A>-1&&r.splice(A,1)};return o.push(m),m}function f(){const{history:g}=window;!g.state||g.replaceState(W({},g.state,{scroll:Jn()}),"")}function h(){for(const g of o)g();o=[],window.removeEventListener("popstate",l),window.removeEventListener("beforeunload",f)}return window.addEventListener("popstate",l),window.addEventListener("beforeunload",f,{passive:!0}),{pauseListeners:c,listen:d,destroy:h}}function Ar(e,t,n,s=!1,r=!1){return{back:e,current:t,forward:n,replaced:s,position:window.history.length,scroll:r?Jn():null}}function mu(e){const{history:t,location:n}=window,s={value:ni(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,f){const h=e.indexOf("#"),g=h>-1?(n.host&&document.querySelector("base")?e:e.slice(h))+c:pu()+e+c;try{t[f?"replaceState":"pushState"](d,"",g),r.value=d}catch(m){console.error(m),n[f?"replace":"assign"](g)}}function i(c,d){const f=W({},t.state,Ar(r.value.back,c,r.value.forward,!0),d,{position:r.value.position});o(c,f,!0),s.value=c}function l(c,d){const f=W({},r.value,t.state,{forward:c,scroll:Jn()});o(f.current,f,!0);const h=W({},Ar(s.value,c,null),{position:f.position+1},d);o(c,h,!1),s.value=c}return{location:s,state:r,push:l,replace:i}}function vu(e){e=lu(e);const t=mu(e),n=gu(e,t.state,t.location,t.replace);function s(o,i=!0){i||n.pauseListeners(),history.go(o)}const r=W({location:"",base:e,go:s,createHref:uu.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 _u(e){return typeof e=="string"||e&&typeof e=="object"}function si(e){return typeof e=="string"||typeof e=="symbol"}const ri=Symbol("");var Pr;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(Pr||(Pr={}));function kt(e,t){return W(new Error,{type:e,[ri]:!0},t)}function Ge(e,t){return e instanceof Error&&ri in e&&(t==null||!!(e.type&t))}const Or="[^/]+?",yu={sensitive:!1,strict:!1,start:!0,end:!0},bu=/[.+*?^${}()[\]/\\]/g;function Su(e,t){const n=W({},yu,t),s=[];let r=n.start?"^":"";const o=[];for(const d of e){const f=d.length?[]:[90];n.strict&&!d.length&&(r+="/");for(let h=0;ht.length?t.length===1&&t[0]===40+40?1:-1:0}function oi(e,t){let n=0;const s=e.score,r=t.score;for(;n0&&t[t.length-1]<0}const wu={type:0,value:""},Eu=/[a-zA-Z0-9_]/;function Cu(e){if(!e)return[[]];if(e==="/")return[[wu]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(m){throw new Error(`ERR (${n})/"${d}": ${m}`)}let n=0,s=n;const r=[];let o;function i(){o&&r.push(o),o=[]}let l=0,c,d="",f="";function h(){!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:f,repeatable:c==="*"||c==="+",optional:c==="*"||c==="?"})):t("Invalid state to consume buffer"),d="")}function g(){d+=c}for(;l{i(k)}:Yt}function i(h){if(si(h)){const g=s.get(h);g&&(s.delete(h),n.splice(n.indexOf(g),1),g.children.forEach(i),g.alias.forEach(i))}else{const g=n.indexOf(h);g>-1&&(n.splice(g,1),h.record.name&&s.delete(h.record.name),h.children.forEach(i),h.alias.forEach(i))}}function l(){return n}function c(h){const g=Ou(h,n);n.splice(g,0,h),h.record.name&&!Fr(h)&&s.set(h.record.name,h)}function d(h,g){let m,A={},O,V;if("name"in h&&h.name){if(m=s.get(h.name),!m)throw kt(1,{location:h});V=m.record.name,A=W(Ir(g.params,m.keys.filter(k=>!k.optional).concat(m.parent?m.parent.keys.filter(k=>k.optional):[]).map(k=>k.name)),h.params&&Ir(h.params,m.keys.map(k=>k.name))),O=m.stringify(A)}else if(h.path!=null)O=h.path,m=n.find(k=>k.re.test(O)),m&&(A=m.parse(O),V=m.record.name);else{if(m=g.name?s.get(g.name):n.find(k=>k.re.test(g.path)),!m)throw kt(1,{location:h,currentLocation:g});V=m.record.name,A=W({},g.params,h.params),O=m.stringify(A)}const N=[];let M=m;for(;M;)N.unshift(M.record),M=M.parent;return{name:V,path:O,params:A,matched:N,meta:Pu(N)}}e.forEach(h=>o(h));function f(){n.length=0,s.clear()}return{addRoute:o,resolve:d,removeRoute:i,clearRoutes:f,getRoutes:l,getRecordMatcher:r}}function Ir(e,t){const n={};for(const s of t)s in e&&(n[s]=e[s]);return n}function Dr(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:Au(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 Au(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 Fr(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Pu(e){return e.reduce((t,n)=>W(t,n.meta),{})}function Nr(e,t){const n={};for(const s in e)n[s]=s in t?t[s]:e[s];return n}function Ou(e,t){let n=0,s=t.length;for(;n!==s;){const o=n+s>>1;oi(e,t[o])<0?s=o:n=o+1}const r=Mu(e);return r&&(s=t.lastIndexOf(r,s-1)),s}function Mu(e){let t=e;for(;t=t.parent;)if(ii(t)&&oi(e,t)===0)return t}function ii({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function Iu(e){const t={};if(e===""||e==="?")return t;const s=(e[0]==="?"?e.slice(1):e).split("&");for(let r=0;ro&&ys(o)):[s&&ys(s)]).forEach(o=>{o!==void 0&&(t+=(t.length?"&":"")+n,o!=null&&(t+="="+o))})}return t}function Du(e){const t={};for(const n in e){const s=e[n];s!==void 0&&(t[n]=Fe(s)?s.map(r=>r==null?null:""+r):s==null?s:""+s)}return t}const Fu=Symbol(""),Lr=Symbol(""),Us=Symbol(""),li=Symbol(""),Ss=Symbol("");function Vt(){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 lt(e,t,n,s,r,o=i=>i()){const i=s&&(s.enterCallbacks[r]=s.enterCallbacks[r]||[]);return()=>new Promise((l,c)=>{const d=g=>{g===!1?c(kt(4,{from:n,to:t})):g instanceof Error?c(g):_u(g)?c(kt(2,{from:t,to:g})):(i&&s.enterCallbacks[r]===i&&typeof g=="function"&&i.push(g),l())},f=o(()=>e.call(s&&s.instances[r],t,n,d));let h=Promise.resolve(f);e.length<3&&(h=h.then(d)),h.catch(g=>c(g))})}function cs(e,t,n,s,r=o=>o()){const o=[];for(const i of e)for(const l in i.components){let c=i.components[l];if(!(t!=="beforeRouteEnter"&&!i.instances[l]))if(Jo(c)){const f=(c.__vccOpts||c)[t];f&&o.push(lt(f,n,s,i,l,r))}else{let d=c();o.push(()=>d.then(f=>{if(!f)throw new Error(`Couldn't resolve component "${l}" at "${i.path}"`);const h=Vc(f)?f.default:f;i.mods[l]=f,i.components[l]=h;const m=(h.__vccOpts||h)[t];return m&<(m,n,s,i,l,r)()}))}}return o}function jr(e){const t=Qe(Us),n=Qe(li),s=Me(()=>{const c=Ot(e.to);return t.resolve(c)}),r=Me(()=>{const{matched:c}=s.value,{length:d}=c,f=c[d-1],h=n.matched;if(!f||!h.length)return-1;const g=h.findIndex(Nt.bind(null,f));if(g>-1)return g;const m=Hr(c[d-2]);return d>1&&Hr(f)===m&&h[h.length-1].path!==m?h.findIndex(Nt.bind(null,c[d-2])):g}),o=Me(()=>r.value>-1&&Hu(n.params,s.value.params)),i=Me(()=>r.value>-1&&r.value===n.matched.length-1&&ti(n.params,s.value.params));function l(c={}){if(ju(c)){const d=t[Ot(e.replace)?"replace":"push"](Ot(e.to)).catch(Yt);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>d),d}return Promise.resolve()}return{route:s,href:Me(()=>s.value.href),isActive:o,isExactActive:i,navigate:l}}function Nu(e){return e.length===1?e[0]:e}const ku=bo({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:jr,setup(e,{slots:t}){const n=Bn(jr(e)),{options:s}=Qe(Us),r=Me(()=>({[$r(e.activeClass,s.linkActiveClass,"router-link-active")]:n.isActive,[$r(e.exactActiveClass,s.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const o=t.default&&Nu(t.default(n));return e.custom?o:qo("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:r.value},o)}}}),Lu=ku;function ju(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 Hu(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(!Fe(r)||r.length!==s.length||s.some((o,i)=>o!==r[i]))return!1}return!0}function Hr(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const $r=(e,t,n)=>e!=null?e:t!=null?t:n,$u=bo({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const s=Qe(Ss),r=Me(()=>e.route||s.value),o=Qe(Lr,0),i=Me(()=>{let d=Ot(o);const{matched:f}=r.value;let h;for(;(h=f[d])&&!h.components;)d++;return d}),l=Me(()=>r.value.matched[i.value]);_n(Lr,Me(()=>i.value+1)),_n(Fu,l),_n(Ss,r);const c=Ui();return yn(()=>[c.value,l.value,e.name],([d,f,h],[g,m,A])=>{f&&(f.instances[h]=d,m&&m!==f&&d&&d===g&&(f.leaveGuards.size||(f.leaveGuards=m.leaveGuards),f.updateGuards.size||(f.updateGuards=m.updateGuards))),d&&f&&(!m||!Nt(f,m)||!g)&&(f.enterCallbacks[h]||[]).forEach(O=>O(d))},{flush:"post"}),()=>{const d=r.value,f=e.name,h=l.value,g=h&&h.components[f];if(!g)return Vr(n.default,{Component:g,route:d});const m=h.props[f],A=m?m===!0?d.params:typeof m=="function"?m(d):m:null,V=qo(g,W({},A,t,{onVnodeUnmounted:N=>{N.component.isUnmounted&&(h.instances[f]=null)},ref:c}));return Vr(n.default,{Component:V,route:d})||V}}});function Vr(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const Vu=$u;function Bu(e){const t=Tu(e.routes,e),n=e.parseQuery||Iu,s=e.stringifyQuery||kr,r=e.history,o=Vt(),i=Vt(),l=Vt(),c=Ki(rt);let d=rt;Et&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const f=is.bind(null,_=>""+_),h=is.bind(null,eu),g=is.bind(null,on);function m(_,P){let R,I;return si(_)?(R=t.getRecordMatcher(_),I=P):I=_,t.addRoute(I,R)}function A(_){const P=t.getRecordMatcher(_);P&&t.removeRoute(P)}function O(){return t.getRoutes().map(_=>_.record)}function V(_){return!!t.getRecordMatcher(_)}function N(_,P){if(P=W({},P||c.value),typeof _=="string"){const a=ls(n,_,P.path),p=t.resolve({path:a.path},P),b=r.createHref(a.fullPath);return W(a,p,{params:g(p.params),hash:on(a.hash),redirectedFrom:void 0,href:b})}let R;if(_.path!=null)R=W({},_,{path:ls(n,_.path,P.path).path});else{const a=W({},_.params);for(const p in a)a[p]==null&&delete a[p];R=W({},_,{params:h(a)}),P.params=h(P.params)}const I=t.resolve(R,P),K=_.hash||"";I.params=f(g(I.params));const te=su(s,W({},_,{hash:Qc(K),path:I.path})),u=r.createHref(te);return W({fullPath:te,hash:K,query:s===kr?Du(_.query):_.query||{}},I,{redirectedFrom:void 0,href:u})}function M(_){return typeof _=="string"?ls(n,_,c.value.path):W({},_)}function k(_,P){if(d!==_)return kt(8,{from:P,to:_})}function D(_){return ne(_)}function Y(_){return D(W(M(_),{replace:!0}))}function ce(_){const P=_.matched[_.matched.length-1];if(P&&P.redirect){const{redirect:R}=P;let I=typeof R=="function"?R(_):R;return typeof I=="string"&&(I=I.includes("?")||I.includes("#")?I=M(I):{path:I},I.params={}),W({query:_.query,hash:_.hash,params:I.path!=null?{}:_.params},I)}}function ne(_,P){const R=d=N(_),I=c.value,K=_.state,te=_.force,u=_.replace===!0,a=ce(R);if(a)return ne(W(M(a),{state:typeof a=="object"?W({},K,a.state):K,force:te,replace:u}),P||R);const p=R;p.redirectedFrom=P;let b;return!te&&ru(s,I,R)&&(b=kt(16,{to:p,from:I}),je(I,I,!0,!1)),(b?Promise.resolve(b):ke(p,I)).catch(v=>Ge(v)?Ge(v,2)?v:st(v):U(v,p,I)).then(v=>{if(v){if(Ge(v,2))return ne(W({replace:u},M(v.to),{state:typeof v.to=="object"?W({},K,v.to.state):K,force:te}),P||p)}else v=at(p,I,!0,u,K);return nt(p,I,v),v})}function Ne(_,P){const R=k(_,P);return R?Promise.reject(R):Promise.resolve()}function tt(_){const P=St.values().next().value;return P&&typeof P.runWithContext=="function"?P.runWithContext(_):_()}function ke(_,P){let R;const[I,K,te]=Uu(_,P);R=cs(I.reverse(),"beforeRouteLeave",_,P);for(const a of I)a.leaveGuards.forEach(p=>{R.push(lt(p,_,P))});const u=Ne.bind(null,_,P);return R.push(u),Te(R).then(()=>{R=[];for(const a of o.list())R.push(lt(a,_,P));return R.push(u),Te(R)}).then(()=>{R=cs(K,"beforeRouteUpdate",_,P);for(const a of K)a.updateGuards.forEach(p=>{R.push(lt(p,_,P))});return R.push(u),Te(R)}).then(()=>{R=[];for(const a of te)if(a.beforeEnter)if(Fe(a.beforeEnter))for(const p of a.beforeEnter)R.push(lt(p,_,P));else R.push(lt(a.beforeEnter,_,P));return R.push(u),Te(R)}).then(()=>(_.matched.forEach(a=>a.enterCallbacks={}),R=cs(te,"beforeRouteEnter",_,P,tt),R.push(u),Te(R))).then(()=>{R=[];for(const a of i.list())R.push(lt(a,_,P));return R.push(u),Te(R)}).catch(a=>Ge(a,8)?a:Promise.reject(a))}function nt(_,P,R){l.list().forEach(I=>tt(()=>I(_,P,R)))}function at(_,P,R,I,K){const te=k(_,P);if(te)return te;const u=P===rt,a=Et?history.state:{};R&&(I||u?r.replace(_.fullPath,W({scroll:u&&a&&a.scroll},K)):r.push(_.fullPath,K)),c.value=_,je(_,P,R,u),st()}let Le;function Lt(){Le||(Le=r.listen((_,P,R)=>{if(!dn.listening)return;const I=N(_),K=ce(I);if(K){ne(W(K,{replace:!0,force:!0}),I).catch(Yt);return}d=I;const te=c.value;Et&&du(Tr(te.fullPath,R.delta),Jn()),ke(I,te).catch(u=>Ge(u,12)?u:Ge(u,2)?(ne(W(M(u.to),{force:!0}),I).then(a=>{Ge(a,20)&&!R.delta&&R.type===ln.pop&&r.go(-1,!1)}).catch(Yt),Promise.reject()):(R.delta&&r.go(-R.delta,!1),U(u,I,te))).then(u=>{u=u||at(I,te,!1),u&&(R.delta&&!Ge(u,8)?r.go(-R.delta,!1):R.type===ln.pop&&Ge(u,20)&&r.go(-1,!1)),nt(I,te,u)}).catch(Yt)}))}let yt=Vt(),ie=Vt(),J;function U(_,P,R){st(_);const I=ie.list();return I.length?I.forEach(K=>K(_,P,R)):console.error(_),Promise.reject(_)}function We(){return J&&c.value!==rt?Promise.resolve():new Promise((_,P)=>{yt.add([_,P])})}function st(_){return J||(J=!_,Lt(),yt.list().forEach(([P,R])=>_?R(_):P()),yt.reset()),_}function je(_,P,R,I){const{scrollBehavior:K}=e;if(!Et||!K)return Promise.resolve();const te=!R&&hu(Tr(_.fullPath,0))||(I||!R)&&history.state&&history.state.scroll||null;return Fs().then(()=>K(_,P,te)).then(u=>u&&au(u)).catch(u=>U(u,_,P))}const _e=_=>r.go(_);let bt;const St=new Set,dn={currentRoute:c,listening:!0,addRoute:m,removeRoute:A,clearRoutes:t.clearRoutes,hasRoute:V,getRoutes:O,resolve:N,options:e,push:D,replace:Y,go:_e,back:()=>_e(-1),forward:()=>_e(1),beforeEach:o.add,beforeResolve:i.add,afterEach:l.add,onError:ie.add,isReady:We,install(_){const P=this;_.component("RouterLink",Lu),_.component("RouterView",Vu),_.config.globalProperties.$router=P,Object.defineProperty(_.config.globalProperties,"$route",{enumerable:!0,get:()=>Ot(c)}),Et&&!bt&&c.value===rt&&(bt=!0,D(r.location).catch(K=>{}));const R={};for(const K in rt)Object.defineProperty(R,K,{get:()=>c.value[K],enumerable:!0});_.provide(Us,P),_.provide(li,fo(R)),_.provide(Ss,c);const I=_.unmount;St.add(_),_.unmount=function(){St.delete(_),St.size<1&&(d=rt,Le&&Le(),Le=null,c.value=rt,bt=!1,J=!1),I()}}};function Te(_){return _.reduce((P,R)=>P.then(()=>tt(R)),Promise.resolve())}return dn}function Uu(e,t){const n=[],s=[],r=[],o=Math.max(t.matched.length,e.matched.length);for(let i=0;iNt(d,l))?s.push(l):n.push(l));const c=e.matched[i];c&&(t.matched.find(d=>Nt(d,c))||r.push(c))}return[n,s,r]}const Ku={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}}}},Wu={class:"login-container"},qu={class:"form-group"},Gu={class:"form-group"},zu=["disabled"],Ju={key:0,class:"error-message"},Yu={key:1,class:"success-message"};function Qu(e,t,n,s,r,o){return se(),oe("div",Wu,[t[5]||(t[5]=y("div",{class:"logo"},"\u{1F437}",-1)),t[6]||(t[6]=y("h1",null,"\u732A\u573A\u7BA1\u7406\u7CFB\u7EDF",-1)),t[7]||(t[7]=y("p",{class:"subtitle"},"\u8BF7\u767B\u5F55\u60A8\u7684\u8D26\u6237",-1)),y("form",{onSubmit:t[2]||(t[2]=zo((...i)=>o.handleLogin&&o.handleLogin(...i),["prevent"]))},[y("div",qu,[t[3]||(t[3]=y("label",{for:"username"},"\u7528\u6237\u540D",-1)),Ct(y("input",{type:"text",id:"username","onUpdate:modelValue":t[0]||(t[0]=i=>r.loginForm.username=i),required:"",placeholder:"\u8BF7\u8F93\u5165\u7528\u6237\u540D"},null,512),[[Fn,r.loginForm.username]])]),y("div",Gu,[t[4]||(t[4]=y("label",{for:"password"},"\u5BC6\u7801",-1)),Ct(y("input",{type:"password",id:"password","onUpdate:modelValue":t[1]||(t[1]=i=>r.loginForm.password=i),required:"",placeholder:"\u8BF7\u8F93\u5165\u5BC6\u7801"},null,512),[[Fn,r.loginForm.password]])]),y("button",{type:"submit",disabled:r.loading},ae(r.loading?"\u767B\u5F55\u4E2D...":"\u767B\u5F55"),9,zu)],32),r.error?(se(),oe("div",Ju,ae(r.error),1)):gt("",!0),r.success?(se(),oe("div",Yu,ae(r.success),1)):gt("",!0)])}const Xu=zn(Ku,[["render",Qu],["__scopeId","data-v-bb5c78dc"]]);const Zu={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"}`)}}},ef={class:"header"},tf={class:"user-info"},nf={class:"nav"},sf={class:"container"},rf={class:"device-control"},of={class:"control-grid"},lf={class:"control-item"},cf={class:"control-buttons"},uf={class:"control-item"},ff={class:"control-buttons"};function af(e,t,n,s,r,o){const i=Ls("router-link");return se(),oe("div",null,[y("div",ef,[t[5]||(t[5]=y("h1",null,"\u{1F437} \u732A\u573A\u7BA1\u7406\u7CFB\u7EDF",-1)),y("div",tf,[y("span",null,ae(r.username),1),y("button",{class:"logout-btn",onClick:t[0]||(t[0]=(...l)=>o.logout&&o.logout(...l))},"\u9000\u51FA\u767B\u5F55")])]),y("div",nf,[y("ul",null,[y("li",null,[ge(i,{to:"/dashboard",class:"active"},{default:tn(()=>[...t[6]||(t[6]=[sn("\u63A7\u5236\u53F0",-1)])]),_:1})]),y("li",null,[ge(i,{to:"/device"},{default:tn(()=>[...t[7]||(t[7]=[sn("\u8BBE\u5907\u7BA1\u7406",-1)])]),_:1})])])]),y("div",sf,[t[11]||(t[11]=y("div",{class:"dashboard-grid"},[y("div",{class:"card"},[y("h3",null,"\u{1F4C8} \u73AF\u5883\u76D1\u63A7"),y("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")]),y("div",{class:"card"},[y("h3",null,"\u{1F514} \u544A\u8B66\u4FE1\u606F"),y("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")]),y("div",{class:"card"},[y("h3",null,"\u{1F4CA} \u6570\u636E\u5206\u6790"),y("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)),y("div",rf,[t[10]||(t[10]=y("h3",null,"\u2699\uFE0F \u8BBE\u5907\u63A7\u5236",-1)),y("div",of,[y("div",lf,[t[8]||(t[8]=y("h4",null,"\u98CE\u673A\u63A7\u5236",-1)),y("div",cf,[y("button",{class:"control-btn on-btn",onClick:t[1]||(t[1]=l=>o.controlDevice("fan","on"))},"\u5F00\u542F"),y("button",{class:"control-btn off-btn",onClick:t[2]||(t[2]=l=>o.controlDevice("fan","off"))},"\u5173\u95ED")])]),y("div",uf,[t[9]||(t[9]=y("h4",null,"\u6C34\u5E18\u63A7\u5236",-1)),y("div",ff,[y("button",{class:"control-btn on-btn",onClick:t[3]||(t[3]=l=>o.controlDevice("water_curtain","on"))},"\u5F00\u542F"),y("button",{class:"control-btn off-btn",onClick:t[4]||(t[4]=l=>o.controlDevice("water_curtain","off"))},"\u5173\u95ED")])])])])])])}const df=zn(Zu,[["render",af],["__scopeId","data-v-7c1d0503"]]);const hf={name:"Device",data(){return{username:localStorage.getItem("username")||"\u7BA1\u7406\u5458",devices:[],showModal:!1,editingDevice:null,deviceForm:{id:null,name:"",type:"",parent_id:null}}},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("/")},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").map(t=>({...t,display_name:t.name})):e==="fan"||e==="water_curtain"?this.devices.filter(n=>n.type==="pig_pen_controller"||n.type==="feed_mill_controller").map(n=>{const s=this.devices.find(r=>r.id===n.parent_id);return{...n,display_name:s?`${s.name} -> ${n.name}`: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: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)}},openAddDeviceModal(){this.editingDevice=null,this.deviceForm={id:null,name:"",type:"",parent_id:null},this.showModal=!0},editDevice(e){this.editingDevice=e,this.deviceForm={...e},delete this.deviceForm.status,this.showModal=!0},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;this.editingDevice?e=await fetch("/api/v1/device/update",{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+localStorage.getItem("authToken")},body:JSON.stringify({id:this.deviceForm.id,name:this.deviceForm.name,type:this.deviceForm.type,parent_id:this.deviceForm.parent_id})}):e=await fetch("/api/v1/device/create",{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+localStorage.getItem("authToken")},body:JSON.stringify({name:this.deviceForm.name,type:this.deviceForm.type,parent_id:this.deviceForm.parent_id})});const t=await e.json();e.ok&&t.code===0?(this.closeDeviceModal(),this.loadDevices()):alert("\u64CD\u4F5C\u5931\u8D25: "+t.message)}catch(e){console.error("\u64CD\u4F5C\u5931\u8D25:",e),alert("\u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u67E5\u770B\u63A7\u5236\u53F0\u4E86\u89E3\u8BE6\u60C5")}},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?this.loadDevices():alert("\u5220\u9664\u5931\u8D25: "+n.message)}catch(t){console.error("\u5220\u9664\u5931\u8D25:",t),alert("\u5220\u9664\u5931\u8D25\uFF0C\u8BF7\u67E5\u770B\u63A7\u5236\u53F0\u4E86\u89E3\u8BE6\u60C5")}}}},pf={class:"header"},gf={class:"user-info"},mf={class:"nav"},vf={class:"container"},_f={class:"page-header"},yf={class:"device-tree",id:"deviceTree"},bf={key:0},Sf={class:"node-header"},xf={class:"node-title"},wf={class:"node-actions"},Ef=["onClick"],Cf=["onClick"],Rf={key:0,class:"children"},Tf={class:"node-header"},Af={class:"node-title"},Pf={class:"node-type controller-type"},Of={class:"node-actions"},Mf=["onClick"],If=["onClick"],Df={key:0,class:"children"},Ff={class:"node-header"},Nf={class:"node-title"},kf={class:"node-type device-type"},Lf={class:"node-actions"},jf=["onClick"],Hf=["onClick"],$f={key:0,class:"modal"},Vf={class:"modal-content"},Bf={class:"modal-header"},Uf={class:"modal-body"},Kf={class:"form-group"},Wf={class:"form-group"},qf={key:0,class:"form-group"},Gf=["value"],zf={class:"modal-footer"};function Jf(e,t,n,s,r,o){const i=Ls("router-link");return se(),oe("div",null,[y("div",pf,[t[11]||(t[11]=y("h1",null,"\u{1F437} \u732A\u573A\u7BA1\u7406\u7CFB\u7EDF",-1)),y("div",gf,[y("span",null,ae(r.username),1),y("button",{class:"logout-btn",onClick:t[0]||(t[0]=(...l)=>o.logout&&o.logout(...l))},"\u9000\u51FA\u767B\u5F55")])]),y("div",mf,[y("ul",null,[y("li",null,[ge(i,{to:"/dashboard"},{default:tn(()=>[...t[12]||(t[12]=[sn("\u63A7\u5236\u53F0",-1)])]),_:1})]),y("li",null,[ge(i,{to:"/device",class:"active"},{default:tn(()=>[...t[13]||(t[13]=[sn("\u8BBE\u5907\u7BA1\u7406",-1)])]),_:1})])])]),y("div",vf,[y("div",_f,[t[14]||(t[14]=y("h2",null,"\u8BBE\u5907\u7BA1\u7406",-1)),y("button",{class:"btn btn-primary",onClick:t[1]||(t[1]=(...l)=>o.openAddDeviceModal&&o.openAddDeviceModal(...l))},"\u6DFB\u52A0\u8BBE\u5907")]),y("div",yf,[r.devices.length===0?(se(),oe("div",bf," \u6682\u65E0\u8BBE\u5907\u6570\u636E ")):gt("",!0),(se(!0),oe(Ee,null,mn(o.relayDevices,l=>(se(),oe("div",{key:l.id,class:"tree-node relay-node"},[y("div",Sf,[y("div",xf,[y("span",null,ae(l.name),1),t[15]||(t[15]=y("span",{class:"node-type relay-type"},"\u4E2D\u7EE7",-1)),y("span",{class:At("status-"+l.status)},ae(l.status==="active"?"\u542F\u7528":"\u505C\u7528"),3)]),y("div",wf,[y("button",{class:"action-btn edit-btn",onClick:c=>o.editDevice(l)},"\u7F16\u8F91",8,Ef),y("button",{class:"action-btn delete-btn",onClick:c=>o.deleteDevice(l.id)},"\u5220\u9664",8,Cf)])]),o.getControllerDevices(l.id).length>0?(se(),oe("div",Rf,[(se(!0),oe(Ee,null,mn(o.getControllerDevices(l.id),c=>(se(),oe("div",{key:c.id,class:"tree-node controller-node"},[y("div",Tf,[y("div",Af,[y("span",null,ae(c.name),1),y("span",Pf,ae(o.getDeviceTypeText(c.type)),1),y("span",{class:At("status-"+c.status)},ae(c.status==="active"?"\u542F\u7528":"\u505C\u7528"),3)]),y("div",Of,[y("button",{class:"action-btn edit-btn",onClick:d=>o.editDevice(c)},"\u7F16\u8F91",8,Mf),y("button",{class:"action-btn delete-btn",onClick:d=>o.deleteDevice(c.id)},"\u5220\u9664",8,If)])]),o.getLeafDevices(c.id).length>0?(se(),oe("div",Df,[(se(!0),oe(Ee,null,mn(o.getLeafDevices(c.id),d=>(se(),oe("div",{key:d.id,class:"tree-node device-node"},[y("div",Ff,[y("div",Nf,[y("span",null,ae(d.name),1),y("span",kf,ae(o.getDeviceTypeText(d.type)),1),y("span",{class:At("status-"+d.status)},ae(d.status==="active"?"\u542F\u7528":"\u505C\u7528"),3)]),y("div",Lf,[y("button",{class:"action-btn edit-btn",onClick:f=>o.editDevice(d)},"\u7F16\u8F91",8,jf),y("button",{class:"action-btn delete-btn",onClick:f=>o.deleteDevice(d.id)},"\u5220\u9664",8,Hf)])])]))),128))])):gt("",!0)]))),128))])):gt("",!0)]))),128))])]),r.showModal?(se(),oe("div",$f,[y("div",Vf,[y("div",Bf,[y("h3",null,ae(r.editingDevice?"\u7F16\u8F91\u8BBE\u5907":"\u6DFB\u52A0\u8BBE\u5907"),1),y("button",{class:"close-btn",onClick:t[2]||(t[2]=(...l)=>o.closeDeviceModal&&o.closeDeviceModal(...l))},"\xD7")]),y("div",Uf,[y("form",{onSubmit:t[8]||(t[8]=zo((...l)=>o.saveDevice&&o.saveDevice(...l),["prevent"]))},[Ct(y("input",{type:"hidden","onUpdate:modelValue":t[3]||(t[3]=l=>r.deviceForm.id=l)},null,512),[[Fn,r.deviceForm.id]]),y("div",Kf,[t[16]||(t[16]=y("label",{for:"deviceName"},"\u8BBE\u5907\u540D\u79F0",-1)),Ct(y("input",{type:"text",id:"deviceName","onUpdate:modelValue":t[4]||(t[4]=l=>r.deviceForm.name=l),required:""},null,512),[[Fn,r.deviceForm.name]])]),y("div",Wf,[t[18]||(t[18]=y("label",{for:"deviceType"},"\u8BBE\u5907\u7C7B\u578B",-1)),Ct(y("select",{id:"deviceType","onUpdate:modelValue":t[5]||(t[5]=l=>r.deviceForm.type=l),required:"",onChange:t[6]||(t[6]=(...l)=>e.toggleParentField&&e.toggleParentField(...l))},[...t[17]||(t[17]=[Ql('',6)])],544),[[xr,r.deviceForm.type]])]),r.deviceForm.type!=="relay"&&r.deviceForm.type!==""?(se(),oe("div",qf,[t[20]||(t[20]=y("label",{for:"parentId"},"\u4E0A\u7EA7\u8BBE\u5907",-1)),Ct(y("select",{id:"parentId","onUpdate:modelValue":t[7]||(t[7]=l=>r.deviceForm.parent_id=l)},[t[19]||(t[19]=y("option",{value:""},"\u8BF7\u9009\u62E9\u4E0A\u7EA7\u8BBE\u5907",-1)),(se(!0),oe(Ee,null,mn(o.getParentDevices(r.deviceForm.type),l=>(se(),oe("option",{key:l.id,value:l.id},ae(l.display_name),9,Gf))),128))],512),[[xr,r.deviceForm.parent_id]])])):gt("",!0)],32)]),y("div",zf,[y("button",{class:"btn btn-secondary",onClick:t[9]||(t[9]=(...l)=>o.closeDeviceModal&&o.closeDeviceModal(...l))},"\u53D6\u6D88"),y("button",{class:"btn btn-primary",onClick:t[10]||(t[10]=(...l)=>o.saveDevice&&o.saveDevice(...l))},"\u4FDD\u5B58")])])])):gt("",!0)])}const Yf=zn(hf,[["render",Jf],["__scopeId","data-v-8db6389a"]]),Qf=[{path:"/",name:"Login",component:Xu},{path:"/dashboard",name:"Dashboard",component:df,meta:{requiresAuth:!0}},{path:"/device",name:"Device",component:Yf,meta:{requiresAuth:!0}}],ci=Bu({history:vu(),routes:Qf});ci.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 ui=Fc($c);ui.use(ci);ui.mount("#app"); diff --git a/frontend/dist/index.html b/frontend/dist/index.html index 8b86f0b..a4cdbfe 100644 --- a/frontend/dist/index.html +++ b/frontend/dist/index.html @@ -4,8 +4,8 @@ 猪场管理系统 - - + +
diff --git a/frontend/src/pages/Device.vue b/frontend/src/pages/Device.vue index ce65440..79dbedb 100644 --- a/frontend/src/pages/Device.vue +++ b/frontend/src/pages/Device.vue @@ -119,7 +119,7 @@ :key="parent.id" :value="parent.id" > - {{ parent.name }} + {{ parent.display_name }} @@ -204,12 +204,26 @@ export default { if (currentType === 'pig_pen_controller' || currentType === 'feed_mill_controller') { // 控制器的上级是中继设备 return this.devices.filter(device => device.type === 'relay') + .map(relay => ({ + ...relay, + display_name: relay.name + })); } else if (currentType === 'fan' || currentType === 'water_curtain') { // 设备的上级是控制器 - return this.devices.filter(device => - device.type === 'pig_pen_controller' || device.type === 'feed_mill_controller') + // 找到所有控制器设备,并添加其上级中继设备的名称作为前缀 + const controllers = this.devices.filter(device => + device.type === 'pig_pen_controller' || device.type === 'feed_mill_controller'); + + return controllers.map(controller => { + // 查找控制器的上级中继设备 + const relay = this.devices.find(device => device.id === controller.parent_id); + return { + ...controller, + display_name: relay ? `${relay.name} - ${controller.name}` : controller.name + }; + }); } - return [] + return []; }, // 加载设备列表