test/custom-admin-ui #3

Merged
orion merged 673 commits from test/custom-admin-ui into master 2026-06-05 17:20:58 +08:00
27 changed files with 59 additions and 39 deletions
Showing only changes of commit 98721b7587 - Show all commits
+17 -10
View File
@@ -11,6 +11,7 @@ import time
from core.settings import settings
from apps.admin.services import FileService, ConfigService, LocalFileService
def create_token(data: dict, expires_in: int = 3600 * 24) -> str:
"""
创建JWT token
@@ -22,16 +23,17 @@ def create_token(data: dict, expires_in: int = 3600 * 24) -> str:
**data,
"exp": int(time.time()) + expires_in
}).encode()).decode()
signature = hmac.new(
settings.admin_token.encode(),
f"{header}.{payload}".encode(),
'sha256'
).digest()
signature = base64.b64encode(signature).decode()
return f"{header}.{payload}.{signature}"
def verify_token(token: str) -> dict:
"""
验证JWT token
@@ -40,7 +42,7 @@ def verify_token(token: str) -> dict:
"""
try:
header_b64, payload_b64, signature_b64 = token.split('.')
# 验证签名
expected_signature = hmac.new(
settings.admin_token.encode(),
@@ -48,21 +50,22 @@ def verify_token(token: str) -> dict:
'sha256'
).digest()
expected_signature_b64 = base64.b64encode(expected_signature).decode()
if signature_b64 != expected_signature_b64:
raise ValueError("无效的签名")
# 解码payload
payload = json.loads(base64.b64decode(payload_b64))
# 检查是否过期
if payload.get("exp", 0) < time.time():
raise ValueError("token已过期")
return payload
except Exception as e:
raise ValueError(f"token验证失败: {str(e)}")
async def admin_required(authorization: str = Header(default=None), request: Request = None):
"""
验证管理员权限
@@ -71,9 +74,12 @@ async def admin_required(authorization: str = Header(default=None), request: Req
if not authorization or not authorization.startswith("Bearer "):
is_admin = False
else:
token = authorization.split(" ")[1]
payload = verify_token(token)
is_admin = payload.get("is_admin", False)
try:
token = authorization.split(" ")[1]
payload = verify_token(token)
is_admin = payload.get("is_admin", False)
except ValueError as e:
is_admin = False
if request.url.path.startswith('/share/'):
if not settings.openUpload and not is_admin:
@@ -85,6 +91,7 @@ async def admin_required(authorization: str = Header(default=None), request: Req
except ValueError as e:
raise HTTPException(status_code=401, detail=str(e))
async def get_file_service():
return FileService()
+2
View File
@@ -90,6 +90,8 @@ class ConfigService:
class LocalFileService:
async def list_files(self):
files = []
if not os.path.exists(data_root / 'local'):
os.makedirs(data_root / 'local')
for file in os.listdir(data_root / 'local'):
files.append(LocalFileClass(file))
return files
+5
View File
@@ -35,6 +35,11 @@ DEFAULT_CONFIG = {
'onedrive_password': '',
'onedrive_root_path': 'filebox_storage',
'onedrive_proxy': 0,
'webdav_hostname': '',
'webdav_username': '',
'webdav_password': '',
'webdav_root_path': 'filebox_storage',
'webdav_proxy': 0,
'admin_token': 'FileCodeBox2023',
'openUpload': 1,
'uploadSize': 1024 * 1024 * 10,

Before

Width:  |  Height:  |  Size: 92 KiB

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

+3 -1
View File
@@ -3,9 +3,11 @@ import {ref} from "vue";
export const useAdminData = defineStore('adminData', () => {
const adminPassword = ref(localStorage.getItem('adminPassword') || '');
const isAdmin = ref(!!localStorage.getItem('adminPassword'));
function updateAdminPwd(pwd: string) {
adminPassword.value = pwd;
isAdmin.value = true;
localStorage.setItem('adminPassword', pwd);
}
return { adminPassword,updateAdminPwd };
return { adminPassword,updateAdminPwd,isAdmin };
});
+2 -1
View File
@@ -8,7 +8,7 @@ const instance = axios.create({
instance.interceptors.request.use(
(config: any) => {
config.headers= {
'Authorization': localStorage.getItem('adminPassword') || '',
'Authorization': 'Bearer '+ localStorage.getItem('adminPassword') || '',
}
return config;
});
@@ -24,6 +24,7 @@ instance.interceptors.response.use(
return Promise.reject(response.data);
}
}, (error:any) => {
localStorage.clear()
ElMessage.error(error.response.data.detail);
return Promise.reject(error);
});
+10 -7
View File
@@ -1,10 +1,10 @@
<template>
<el-container v-if="isLogin" style="height: 100vh;width: 100vw;position: relative;user-select: none">
<el-container v-if="adminData.isAdmin" style="height: 100vh;width: 100vw;position: relative;user-select: none">
<el-header>
<el-menu mode="horizontal" router :default-active="route.path">
<el-menu-item v-for="menu in menus" :index="menu.path" :key="menu.path">{{menu.name}}</el-menu-item>
<el-menu-item style="float: right" @click="toggleDark(!isDark)">{{ t('admin.menu.color') }}</el-menu-item>
<el-menu-item style="float: right" @click="adminData.updateAdminPwd('');isLogin=false">{{ t('admin.menu.signout') }}</el-menu-item>
<el-menu-item style="float: right" @click="logout()">{{ t('admin.menu.signout') }}</el-menu-item>
</el-menu>
</el-header>
<el-main>
@@ -29,7 +29,6 @@
import { useDark, useToggle } from '@vueuse/core';
import { ref } from "vue";
const isDark = useDark()
const isLogin = ref(false);
const toggleDark = useToggle(isDark)
import { useRoute } from 'vue-router';
import { useAdminData } from "@/stores/adminData";
@@ -71,19 +70,23 @@ const refreshLoginStatus = () => {
request({
url: '/admin/login',
method: 'post',
data: {
password: adminData.adminPassword,
},
}).then((res: any) => {
if (res.code === 200) {
isLogin.value = true;
adminData.updateAdminPwd(res.detail.token);
ElMessage.success(t('admin.login.loginSuccess'));
} else {
localStorage.clear();
ElMessage.error(t('admin.login.loginError'));
}
});
};
if (adminData.adminPassword !== '') {
refreshLoginStatus();
}
const logout = () => {
localStorage.clear();
};
</script>
<style lang="scss" scoped>
</style>
@@ -1 +1 @@
import{d as s,a8 as n,Y as c,W as e,a1 as r,$ as a,g as o,o as i}from"./index-BdLVKrzu.js";const l={style:{"text-align":"center"}},u={style:{color:"#333"},href:"https://github.com/vastsa/FileCodeBox"},f=s({__name:"AboutView",setup(_){const{t}=n();return(m,d)=>(i(),c("main",l,[e("span",null,[r(a(o(t)("admin.about.source1"))+" ",1),e("em",null,[e("a",u,a(o(t)("admin.about.source2")),1)])])]))}});export{f as default};
import{d as s,a8 as n,Y as c,W as e,a1 as r,$ as a,g as o,o as i}from"./index-CVeK0dPI.js";const l={style:{"text-align":"center"}},u={style:{color:"#333"},href:"https://github.com/vastsa/FileCodeBox"},f=s({__name:"AboutView",setup(_){const{t}=n();return(m,d)=>(i(),c("main",l,[e("span",null,[r(a(o(t)("admin.about.source1"))+" ",1),e("em",null,[e("a",u,a(o(t)("admin.about.source2")),1)])])]))}});export{f as default};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{c as y,k as F,a as l,m as C,s as _,g as v,n as N,o as E,h as K,p as j,q as u,r as B,e as R,b as q,f as W,j as Y,S as H,t as J}from"./el-popper-CiRxPHiQ.js";import{bs as S,b2 as x,a$ as Q,b5 as V,bt as X}from"./index-BdLVKrzu.js";import{v as Z}from"./el-button-CDy8odqo.js";function z(e,r){for(var n=-1,s=e==null?0:e.length;++n<s&&r(e[n],n,e)!==!1;);return e}function k(e,r){return e&&y(r,F(r),e)}function ee(e,r){return e&&y(r,l(r),e)}function re(e,r){return y(e,C(e),r)}var te=Object.getOwnPropertySymbols,L=te?function(e){for(var r=[];e;)Z(r,C(e)),e=v(e);return r}:_;function ne(e,r){return y(e,L(e),r)}function ae(e){return N(e,l,L)}var oe=Object.prototype,se=oe.hasOwnProperty;function ce(e){var r=e.length,n=new e.constructor(r);return r&&typeof e[0]=="string"&&se.call(e,"index")&&(n.index=e.index,n.input=e.input),n}function ie(e,r){var n=r?E(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.byteLength)}var be=/\w*$/;function fe(e){var r=new e.constructor(e.source,be.exec(e));return r.lastIndex=e.lastIndex,r}var O=S?S.prototype:void 0,w=O?O.valueOf:void 0;function ge(e){return w?Object(w.call(e)):{}}var ue="[object Boolean]",ye="[object Date]",Te="[object Map]",le="[object Number]",je="[object RegExp]",pe="[object Set]",Ae="[object String]",me="[object Symbol]",de="[object ArrayBuffer]",$e="[object DataView]",Se="[object Float32Array]",Oe="[object Float64Array]",we="[object Int8Array]",Ie="[object Int16Array]",he="[object Int32Array]",Fe="[object Uint8Array]",Ce="[object Uint8ClampedArray]",Ee="[object Uint16Array]",Be="[object Uint32Array]";function xe(e,r,n){var s=e.constructor;switch(r){case de:return E(e);case ue:case ye:return new s(+e);case $e:return ie(e,n);case Se:case Oe:case we:case Ie:case he:case Fe:case Ce:case Ee:case Be:return K(e,n);case Te:return new s;case le:case Ae:return new s(e);case je:return fe(e);case pe:return new s;case me:return ge(e)}}var Le="[object Map]";function Me(e){return x(e)&&j(e)==Le}var I=u&&u.isMap,Ue=I?B(I):Me,Pe="[object Set]";function De(e){return x(e)&&j(e)==Pe}var h=u&&u.isSet,Ge=h?B(h):De,_e=1,ve=2,Ne=4,M="[object Arguments]",Ke="[object Array]",Re="[object Boolean]",qe="[object Date]",We="[object Error]",U="[object Function]",Ye="[object GeneratorFunction]",He="[object Map]",Je="[object Number]",P="[object Object]",Qe="[object RegExp]",Ve="[object Set]",Xe="[object String]",Ze="[object Symbol]",ze="[object WeakMap]",ke="[object ArrayBuffer]",er="[object DataView]",rr="[object Float32Array]",tr="[object Float64Array]",nr="[object Int8Array]",ar="[object Int16Array]",or="[object Int32Array]",sr="[object Uint8Array]",cr="[object Uint8ClampedArray]",ir="[object Uint16Array]",br="[object Uint32Array]",t={};t[M]=t[Ke]=t[ke]=t[er]=t[Re]=t[qe]=t[rr]=t[tr]=t[nr]=t[ar]=t[or]=t[He]=t[Je]=t[P]=t[Qe]=t[Ve]=t[Xe]=t[Ze]=t[sr]=t[cr]=t[ir]=t[br]=!0;t[We]=t[U]=t[ze]=!1;function T(e,r,n,s,p,c){var a,f=r&_e,g=r&ve,D=r&Ne;if(a!==void 0)return a;if(!Q(e))return e;var A=V(e);if(A){if(a=ce(e),!f)return R(e,a)}else{var b=j(e),m=b==U||b==Ye;if(q(e))return W(e,f);if(b==P||b==M||m&&!p){if(a=g||m?{}:Y(e),!f)return g?ne(e,ee(a,e)):re(e,k(a,e))}else{if(!t[b])return p?e:{};a=xe(e,b,f)}}c||(c=new H);var d=c.get(e);if(d)return d;c.set(e,a),Ge(e)?e.forEach(function(o){a.add(T(o,r,n,o,e,c))}):Ue(e)&&e.forEach(function(o,i){a.set(i,T(o,r,n,i,e,c))});var G=D?g?ae:J:g?l:F,$=A?void 0:G(e);return z($||e,function(o,i){$&&(i=o,o=e[i]),X(a,i,T(o,r,n,i,e,c))}),a}export{T as b};
import{c as y,k as F,a as l,m as C,s as _,g as v,n as N,o as E,h as K,p as j,q as u,r as B,e as R,b as q,f as W,j as Y,S as H,t as J}from"./el-popper-CwdMC8HJ.js";import{bs as S,b2 as x,a$ as Q,b5 as V,bt as X}from"./index-CVeK0dPI.js";import{v as Z}from"./el-button-CIFg-IwZ.js";function z(e,r){for(var n=-1,s=e==null?0:e.length;++n<s&&r(e[n],n,e)!==!1;);return e}function k(e,r){return e&&y(r,F(r),e)}function ee(e,r){return e&&y(r,l(r),e)}function re(e,r){return y(e,C(e),r)}var te=Object.getOwnPropertySymbols,L=te?function(e){for(var r=[];e;)Z(r,C(e)),e=v(e);return r}:_;function ne(e,r){return y(e,L(e),r)}function ae(e){return N(e,l,L)}var oe=Object.prototype,se=oe.hasOwnProperty;function ce(e){var r=e.length,n=new e.constructor(r);return r&&typeof e[0]=="string"&&se.call(e,"index")&&(n.index=e.index,n.input=e.input),n}function ie(e,r){var n=r?E(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.byteLength)}var be=/\w*$/;function fe(e){var r=new e.constructor(e.source,be.exec(e));return r.lastIndex=e.lastIndex,r}var O=S?S.prototype:void 0,w=O?O.valueOf:void 0;function ge(e){return w?Object(w.call(e)):{}}var ue="[object Boolean]",ye="[object Date]",Te="[object Map]",le="[object Number]",je="[object RegExp]",pe="[object Set]",Ae="[object String]",me="[object Symbol]",de="[object ArrayBuffer]",$e="[object DataView]",Se="[object Float32Array]",Oe="[object Float64Array]",we="[object Int8Array]",Ie="[object Int16Array]",he="[object Int32Array]",Fe="[object Uint8Array]",Ce="[object Uint8ClampedArray]",Ee="[object Uint16Array]",Be="[object Uint32Array]";function xe(e,r,n){var s=e.constructor;switch(r){case de:return E(e);case ue:case ye:return new s(+e);case $e:return ie(e,n);case Se:case Oe:case we:case Ie:case he:case Fe:case Ce:case Ee:case Be:return K(e,n);case Te:return new s;case le:case Ae:return new s(e);case je:return fe(e);case pe:return new s;case me:return ge(e)}}var Le="[object Map]";function Me(e){return x(e)&&j(e)==Le}var I=u&&u.isMap,Ue=I?B(I):Me,Pe="[object Set]";function De(e){return x(e)&&j(e)==Pe}var h=u&&u.isSet,Ge=h?B(h):De,_e=1,ve=2,Ne=4,M="[object Arguments]",Ke="[object Array]",Re="[object Boolean]",qe="[object Date]",We="[object Error]",U="[object Function]",Ye="[object GeneratorFunction]",He="[object Map]",Je="[object Number]",P="[object Object]",Qe="[object RegExp]",Ve="[object Set]",Xe="[object String]",Ze="[object Symbol]",ze="[object WeakMap]",ke="[object ArrayBuffer]",er="[object DataView]",rr="[object Float32Array]",tr="[object Float64Array]",nr="[object Int8Array]",ar="[object Int16Array]",or="[object Int32Array]",sr="[object Uint8Array]",cr="[object Uint8ClampedArray]",ir="[object Uint16Array]",br="[object Uint32Array]",t={};t[M]=t[Ke]=t[ke]=t[er]=t[Re]=t[qe]=t[rr]=t[tr]=t[nr]=t[ar]=t[or]=t[He]=t[Je]=t[P]=t[Qe]=t[Ve]=t[Xe]=t[Ze]=t[sr]=t[cr]=t[ir]=t[br]=!0;t[We]=t[U]=t[ze]=!1;function T(e,r,n,s,p,c){var a,f=r&_e,g=r&ve,D=r&Ne;if(a!==void 0)return a;if(!Q(e))return e;var A=V(e);if(A){if(a=ce(e),!f)return R(e,a)}else{var b=j(e),m=b==U||b==Ye;if(q(e))return W(e,f);if(b==P||b==M||m&&!p){if(a=g||m?{}:Y(e),!f)return g?ne(e,ee(a,e)):re(e,k(a,e))}else{if(!t[b])return p?e:{};a=xe(e,b,f)}}c||(c=new H);var d=c.get(e);if(d)return d;c.set(e,a),Ge(e)?e.forEach(function(o){a.add(T(o,r,n,o,e,c))}):Ue(e)&&e.forEach(function(o,i){a.set(i,T(o,r,n,i,e,c))});var G=D?g?ae:J:g?l:F,$=A?void 0:G(e);return z($||e,function(o,i){$&&(i=o,o=e[i]),X(a,i,T(o,r,n,i,e,c))}),a}export{T as b};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{G as S,b as M,c as V,d as B,u as W,a as P,o as p,Y as $,W as m,r as v,f as i,g as l,e as h,w as g,C as b,as as k,X as C,M as w,Z as T,h as _,T as H,_ as I,j as R}from"./index-BdLVKrzu.js";import{c as j}from"./el-button-CDy8odqo.js";let u;const A=o=>{var a;if(!S)return 0;if(u!==void 0)return u;const t=document.createElement("div");t.className=`${o}-scrollbar__wrap`,t.style.visibility="hidden",t.style.width="100px",t.style.position="absolute",t.style.top="-9999px",document.body.appendChild(t);const n=t.offsetWidth;t.style.overflow="scroll";const e=document.createElement("div");e.style.width="100%",t.appendChild(e);const c=e.offsetWidth;return(a=t.parentNode)==null||a.removeChild(t),u=n-c,u};function D(o,a){if(!S)return;if(!a){o.scrollTop=0;return}const t=[];let n=a.offsetParent;for(;n!==null&&o!==n&&o.contains(n);)t.push(n),n=n.offsetParent;const e=a.offsetTop+t.reduce((f,s)=>f+s.offsetTop,0),c=e+a.offsetHeight,r=o.scrollTop,d=r+o.clientHeight;e<r?o.scrollTop=e:c>d&&(o.scrollTop=c-o.clientHeight)}const F=M({type:{type:String,values:["primary","success","info","warning","danger"],default:"primary"},closable:Boolean,disableTransitions:Boolean,hit:Boolean,color:String,size:{type:String,values:V},effect:{type:String,values:["dark","light","plain"],default:"light"},round:Boolean}),G={close:o=>o instanceof MouseEvent,click:o=>o instanceof MouseEvent},K=B({name:"ElTag"}),X=B({...K,props:F,emits:G,setup(o,{emit:a}){const t=o,n=j(),e=W("tag"),c=P(()=>{const{type:s,hit:y,effect:E,closable:N,round:z}=t;return[e.b(),e.is("closable",N),e.m(s||"primary"),e.m(n.value),e.m(E),e.is("hit",y),e.is("round",z)]}),r=s=>{a("close",s)},d=s=>{a("click",s)},f=s=>{s.component.subTree.component.bum=null};return(s,y)=>s.disableTransitions?(p(),$("span",{key:0,class:i(l(c)),style:_({backgroundColor:s.color}),onClick:d},[m("span",{class:i(l(e).e("content"))},[v(s.$slots,"default")],2),s.closable?(p(),h(l(w),{key:0,class:i(l(e).e("close")),onClick:C(r,["stop"])},{default:g(()=>[b(l(k))]),_:1},8,["class","onClick"])):T("v-if",!0)],6)):(p(),h(H,{key:1,name:`${l(e).namespace.value}-zoom-in-center`,appear:"",onVnodeMounted:f},{default:g(()=>[m("span",{class:i(l(c)),style:_({backgroundColor:s.color}),onClick:d},[m("span",{class:i(l(e).e("content"))},[v(s.$slots,"default")],2),s.closable?(p(),h(l(w),{key:0,class:i(l(e).e("close")),onClick:C(r,["stop"])},{default:g(()=>[b(l(k))]),_:1},8,["class","onClick"])):T("v-if",!0)],6)]),_:3},8,["name"]))}});var Y=I(X,[["__file","tag.vue"]]);const J=R(Y);export{J as E,A as g,D as s,F as t};
import{G as S,b as M,c as V,d as B,u as W,a as P,o as p,Y as $,W as m,r as v,f as i,g as l,e as h,w as g,C as b,as as k,X as C,M as w,Z as T,h as _,T as H,_ as I,j as R}from"./index-CVeK0dPI.js";import{c as j}from"./el-button-CIFg-IwZ.js";let u;const A=o=>{var a;if(!S)return 0;if(u!==void 0)return u;const t=document.createElement("div");t.className=`${o}-scrollbar__wrap`,t.style.visibility="hidden",t.style.width="100px",t.style.position="absolute",t.style.top="-9999px",document.body.appendChild(t);const n=t.offsetWidth;t.style.overflow="scroll";const e=document.createElement("div");e.style.width="100%",t.appendChild(e);const c=e.offsetWidth;return(a=t.parentNode)==null||a.removeChild(t),u=n-c,u};function D(o,a){if(!S)return;if(!a){o.scrollTop=0;return}const t=[];let n=a.offsetParent;for(;n!==null&&o!==n&&o.contains(n);)t.push(n),n=n.offsetParent;const e=a.offsetTop+t.reduce((f,s)=>f+s.offsetTop,0),c=e+a.offsetHeight,r=o.scrollTop,d=r+o.clientHeight;e<r?o.scrollTop=e:c>d&&(o.scrollTop=c-o.clientHeight)}const F=M({type:{type:String,values:["primary","success","info","warning","danger"],default:"primary"},closable:Boolean,disableTransitions:Boolean,hit:Boolean,color:String,size:{type:String,values:V},effect:{type:String,values:["dark","light","plain"],default:"light"},round:Boolean}),G={close:o=>o instanceof MouseEvent,click:o=>o instanceof MouseEvent},K=B({name:"ElTag"}),X=B({...K,props:F,emits:G,setup(o,{emit:a}){const t=o,n=j(),e=W("tag"),c=P(()=>{const{type:s,hit:y,effect:E,closable:N,round:z}=t;return[e.b(),e.is("closable",N),e.m(s||"primary"),e.m(n.value),e.m(E),e.is("hit",y),e.is("round",z)]}),r=s=>{a("close",s)},d=s=>{a("click",s)},f=s=>{s.component.subTree.component.bum=null};return(s,y)=>s.disableTransitions?(p(),$("span",{key:0,class:i(l(c)),style:_({backgroundColor:s.color}),onClick:d},[m("span",{class:i(l(e).e("content"))},[v(s.$slots,"default")],2),s.closable?(p(),h(l(w),{key:0,class:i(l(e).e("close")),onClick:C(r,["stop"])},{default:g(()=>[b(l(k))]),_:1},8,["class","onClick"])):T("v-if",!0)],6)):(p(),h(H,{key:1,name:`${l(e).namespace.value}-zoom-in-center`,appear:"",onVnodeMounted:f},{default:g(()=>[m("span",{class:i(l(c)),style:_({backgroundColor:s.color}),onClick:d},[m("span",{class:i(l(e).e("content"))},[v(s.$slots,"default")],2),s.closable?(p(),h(l(w),{key:0,class:i(l(e).e("close")),onClick:C(r,["stop"])},{default:g(()=>[b(l(k))]),_:1},8,["class","onClick"])):T("v-if",!0)],6)]),_:3},8,["name"]))}});var Y=I(X,[["__file","tag.vue"]]);const J=R(Y);export{J as E,A as g,D as s,F as t};
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{al as A,a2 as N}from"./index-BdLVKrzu.js";var o=(E=>(E[E.TEXT=1]="TEXT",E[E.CLASS=2]="CLASS",E[E.STYLE=4]="STYLE",E[E.PROPS=8]="PROPS",E[E.FULL_PROPS=16]="FULL_PROPS",E[E.HYDRATE_EVENTS=32]="HYDRATE_EVENTS",E[E.STABLE_FRAGMENT=64]="STABLE_FRAGMENT",E[E.KEYED_FRAGMENT=128]="KEYED_FRAGMENT",E[E.UNKEYED_FRAGMENT=256]="UNKEYED_FRAGMENT",E[E.NEED_PATCH=512]="NEED_PATCH",E[E.DYNAMIC_SLOTS=1024]="DYNAMIC_SLOTS",E[E.HOISTED=-1]="HOISTED",E[E.BAIL=-2]="BAIL",E))(o||{});const e=E=>{const _=A(E)?E:[E],S=[];return _.forEach(T=>{var r;A(T)?S.push(...e(T)):N(T)&&A(T.children)?S.push(...e(T.children)):(S.push(T),N(T)&&((r=T.component)!=null&&r.subTree)&&S.push(...e(T.component.subTree)))}),S};export{o as P,e as f};
import{al as A,a2 as N}from"./index-CVeK0dPI.js";var o=(E=>(E[E.TEXT=1]="TEXT",E[E.CLASS=2]="CLASS",E[E.STYLE=4]="STYLE",E[E.PROPS=8]="PROPS",E[E.FULL_PROPS=16]="FULL_PROPS",E[E.HYDRATE_EVENTS=32]="HYDRATE_EVENTS",E[E.STABLE_FRAGMENT=64]="STABLE_FRAGMENT",E[E.KEYED_FRAGMENT=128]="KEYED_FRAGMENT",E[E.UNKEYED_FRAGMENT=256]="UNKEYED_FRAGMENT",E[E.NEED_PATCH=512]="NEED_PATCH",E[E.DYNAMIC_SLOTS=1024]="DYNAMIC_SLOTS",E[E.HOISTED=-1]="HOISTED",E[E.BAIL=-2]="BAIL",E))(o||{});const e=E=>{const _=A(E)?E:[E],S=[];return _.forEach(T=>{var r;A(T)?S.push(...e(T)):N(T)&&A(T.children)?S.push(...e(T.children)):(S.push(T),N(T)&&((r=T.component)!=null&&r.subTree)&&S.push(...e(T.component.subTree)))}),S};export{o as P,e as f};
+1 -1
View File
@@ -8,7 +8,7 @@
<meta name="keywords" content="{{keywords}}" />
<meta name="generator" content="FileCodeBox2.1" />
<title>{{title}}</title>
<script type="module" crossorigin src="/assets/index-BdLVKrzu.js"></script>
<script type="module" crossorigin src="/assets/index-CVeK0dPI.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-DAmnn45j.css">
</head>
<body style="background: url('{{background}}') no-repeat center center fixed;background-size: cover;">