update:env
This commit is contained in:
@@ -7,6 +7,7 @@ from fastapi import APIRouter
|
||||
from apps.admin.pydantics import IDData
|
||||
from apps.base.models import FileCodes
|
||||
from core.response import APIResponse
|
||||
from core.settings import default_value, settings
|
||||
from core.storage import file_storage
|
||||
|
||||
admin_api = APIRouter(
|
||||
@@ -32,3 +33,15 @@ async def file_list(page: int = 1, size: int = 10):
|
||||
'data': data,
|
||||
'total': await FileCodes.all().count(),
|
||||
})
|
||||
|
||||
|
||||
@admin_api.get('/config/get')
|
||||
async def get_config():
|
||||
return APIResponse(detail=settings.__dict__)
|
||||
|
||||
|
||||
@admin_api.patch('/config/update')
|
||||
async def update_config(data: dict):
|
||||
for k, v in data.items():
|
||||
settings.__setattr__(k, v)
|
||||
return APIResponse()
|
||||
|
||||
@@ -7,3 +7,57 @@ from pathlib import Path
|
||||
data_root = Path('./data')
|
||||
if not data_root.exists():
|
||||
data_root.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
default_value = {
|
||||
'file_storage': 'SystemFileStorage',
|
||||
'name': '文件快递柜-FileCodeBox',
|
||||
'description': '开箱即用的文件快传系统',
|
||||
'keywords': 'FileCodeBox,文件快递柜,口令传送箱,匿名口令分享文本,文件',
|
||||
's3_access_key_id': '',
|
||||
's3_secret_access_key': '',
|
||||
's3_bucket_name': '',
|
||||
's3_endpoint_url': '',
|
||||
'openUpload': 1,
|
||||
'uploadSize': 1024 * 1024 * 10,
|
||||
'uploadMinute': 1,
|
||||
'uploadCount': 10,
|
||||
'errorMinute': 1,
|
||||
'errorCount': 1,
|
||||
}
|
||||
|
||||
|
||||
class Settings:
|
||||
__instance = None
|
||||
|
||||
def __init__(self):
|
||||
# 读取.env
|
||||
if not (data_root / '.env').exists():
|
||||
with open(data_root / '.env', 'w', encoding='utf-8') as f:
|
||||
for key, value in default_value.items():
|
||||
f.write(f'{key}={value}\n')
|
||||
# 更新default_value
|
||||
with open(data_root / '.env', 'r', encoding='utf-8') as f:
|
||||
for line in f.readlines():
|
||||
key, value = line.strip().split('=')
|
||||
# 将字符串转换为原本的类型
|
||||
if value.isdigit():
|
||||
value = int(value)
|
||||
default_value[key] = value
|
||||
|
||||
# 更新self
|
||||
for key, value in default_value.items():
|
||||
self.__setattr__(key, value)
|
||||
|
||||
def __new__(cls, *args, **kwargs):
|
||||
if not cls.__instance:
|
||||
cls.__instance = super(Settings, cls).__new__(cls, *args, **kwargs)
|
||||
return cls.__instance
|
||||
|
||||
def __setattr__(self, key, value):
|
||||
self.__dict__[key] = value
|
||||
with open(data_root / '.env', 'w', encoding='utf-8') as f:
|
||||
for key, value in self.__dict__.items():
|
||||
f.write(f'{key}={value}\n')
|
||||
|
||||
|
||||
settings = Settings()
|
||||
|
||||
+10
-6
@@ -8,7 +8,7 @@ import time
|
||||
|
||||
import aioboto3
|
||||
from fastapi import UploadFile
|
||||
from core.settings import data_root
|
||||
from core.settings import data_root, settings
|
||||
from apps.base.models import FileCodes
|
||||
|
||||
|
||||
@@ -45,10 +45,10 @@ class SystemFileStorage:
|
||||
|
||||
class S3FileStorage:
|
||||
def __init__(self):
|
||||
self.access_key_id = ''
|
||||
self.secret_access_key = ''
|
||||
self.bucket_name = ''
|
||||
self.endpoint_url = ''
|
||||
self.access_key_id = settings.s3_access_key_id
|
||||
self.secret_access_key = settings.s3_secret_access_key
|
||||
self.bucket_name = settings.s3_bucket_name
|
||||
self.endpoint_url = settings.s3_endpoint_url
|
||||
self.session = aioboto3.Session(
|
||||
aws_access_key_id=self.access_key_id, aws_secret_access_key=self.secret_access_key
|
||||
)
|
||||
@@ -69,4 +69,8 @@ class S3FileStorage:
|
||||
return result
|
||||
|
||||
|
||||
file_storage = SystemFileStorage()
|
||||
storages = {
|
||||
'local': SystemFileStorage,
|
||||
's3': S3FileStorage
|
||||
}
|
||||
file_storage = storages[settings.file_storage]()
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
import"./base-3569949a.js";import{E as c}from"./el-button-cb4d7ad5.js";import{a as r,E as s}from"./el-col-6cef30e9.js";import{an as _,m,p as u,y as f,e,w as o,x as t}from"./index-4cf91ffb.js";const p={};function d(i,x){const n=s,a=r,l=c;return m(),u("main",null,[f("div",null,[e(a,null,{default:o(()=>[e(n,null,{default:o(()=>[t("1")]),_:1})]),_:1}),e(l,null,{default:o(()=>[t("1")]),_:1})])])}const N=_(p,[["render",d]]);export{N as default};
|
||||
@@ -1 +0,0 @@
|
||||
import"./base-c9c53ef4.js";import{E as c}from"./el-button-c013d252.js";import{a as r,E as s}from"./el-col-2bb883a2.js";import{an as _,m,p as u,y as p,e,w as o,x as t}from"./index-bded577e.js";import"./index-1ab675c3.js";const f={};function i(d,x){const n=s,a=r,l=c;return m(),u("main",null,[p("div",null,[e(a,null,{default:o(()=>[e(n,null,{default:o(()=>[t("1")]),_:1})]),_:1}),e(l,null,{default:o(()=>[t("1")]),_:1})])])}const b=_(f,[["render",i]]);export{b 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
+11
File diff suppressed because one or more lines are too long
-11
File diff suppressed because one or more lines are too long
Vendored
+3
-3
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 +0,0 @@
|
||||
.left-menu{margin-bottom:1rem;cursor:pointer}
|
||||
@@ -0,0 +1 @@
|
||||
.el-form{--el-form-label-font-size:var(--el-font-size-base);--el-form-inline-content-width:220px}.el-form--label-left .el-form-item__label{justify-content:flex-start}.el-form--label-top .el-form-item{display:block}.el-form--label-top .el-form-item .el-form-item__label{display:block;height:auto;text-align:left;margin-bottom:8px;line-height:22px}.el-form--inline .el-form-item{display:inline-flex;vertical-align:middle;margin-right:32px}.el-form--inline.el-form--label-top{display:flex;flex-wrap:wrap}.el-form--inline.el-form--label-top .el-form-item{display:block}.el-form--large.el-form--label-top .el-form-item .el-form-item__label{margin-bottom:12px;line-height:22px}.el-form--default.el-form--label-top .el-form-item .el-form-item__label{margin-bottom:8px;line-height:22px}.el-form--small.el-form--label-top .el-form-item .el-form-item__label{margin-bottom:4px;line-height:20px}.el-form-item{display:flex;--font-size:14px;margin-bottom:18px}.el-form-item .el-form-item{margin-bottom:0}.el-form-item .el-input__validateIcon{display:none}.el-form-item--large{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:22px}.el-form-item--large .el-form-item__label{height:40px;line-height:40px}.el-form-item--large .el-form-item__content{line-height:40px}.el-form-item--large .el-form-item__error{padding-top:4px}.el-form-item--default{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--default .el-form-item__label{height:32px;line-height:32px}.el-form-item--default .el-form-item__content{line-height:32px}.el-form-item--default .el-form-item__error{padding-top:2px}.el-form-item--small{--font-size:12px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--small .el-form-item__label{height:24px;line-height:24px}.el-form-item--small .el-form-item__content{line-height:24px}.el-form-item--small .el-form-item__error{padding-top:2px}.el-form-item__label-wrap{display:flex}.el-form-item__label{display:inline-flex;justify-content:flex-end;align-items:flex-start;flex:0 0 auto;font-size:var(--el-form-label-font-size);color:var(--el-text-color-regular);height:32px;line-height:32px;padding:0 12px 0 0;box-sizing:border-box}.el-form-item__content{display:flex;flex-wrap:wrap;align-items:center;flex:1;line-height:32px;position:relative;font-size:var(--font-size);min-width:0}.el-form-item__content .el-input-group{vertical-align:top}.el-form-item__error{color:var(--el-color-danger);font-size:12px;line-height:1;padding-top:2px;position:absolute;top:100%;left:0}.el-form-item__error--inline{position:relative;top:auto;left:auto;display:inline-block;margin-left:10px}.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label-wrap>.el-form-item__label:before,.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label:before{content:"*";color:var(--el-color-danger);margin-right:4px}.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label-wrap>.el-form-item__label:after,.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label:after{content:"*";color:var(--el-color-danger);margin-left:4px}.el-form-item.is-error .el-select-v2__wrapper.is-focused{border-color:transparent}.el-form-item.is-error .el-select-v2__wrapper,.el-form-item.is-error .el-select-v2__wrapper:focus,.el-form-item.is-error .el-textarea__inner,.el-form-item.is-error .el-textarea__inner:focus{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-form-item.is-error .el-input__wrapper{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-form-item.is-error .el-input-group__append .el-input__wrapper,.el-form-item.is-error .el-input-group__prepend .el-input__wrapper{box-shadow:0 0 0 1px transparent inset}.el-form-item.is-error .el-input__validateIcon{color:var(--el-color-danger)}.el-form-item--feedback .el-input__validateIcon{display:inline-flex}.left-menu{margin-bottom:1rem;cursor:pointer;text-align:center;font-weight:700;font-size:1rem;letter-spacing:.4rem}
|
||||
+12
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
import"./base-c9c53ef4.js";import{a as c,E as s}from"./el-col-2bb883a2.js";import{E as r}from"./el-card-ad43cf4b.js";import{an as l,m as f,J as m,w as e,e as t,x as a}from"./index-bded577e.js";const p={};function d(i,u){const _=r,o=s,n=c;return f(),m(n,{gutter:10},{default:e(()=>[t(o,{span:4},{default:e(()=>[t(_,{class:"left-menu"},{default:e(()=>[a("1")]),_:1})]),_:1}),t(o,{span:20},{default:e(()=>[a(" 1 ")]),_:1})]),_:1})}const V=l(p,[["render",d]]);export{V as default};
|
||||
@@ -0,0 +1 @@
|
||||
import{h as T,k as F,j,t as B,u as _,d as N,g as v,v as K,w as C,p as R,x as p,y as u,z as E,n as q,l as W,o as Y,q as H,S as J,A as Q}from"./el-select-d7305d7d.js";import{S as m,n as x,j as V,m as X,B as Z}from"./el-button-cb4d7ad5.js";function z(t,e){for(var n=-1,o=t==null?0:t.length;++n<o&&e(t[n],n,t)!==!1;);return t}function k(t,e){return t&&T(e,F(e),t)}function tt(t,e){return t&&T(e,j(e),t)}function et(t,e){return T(t,B(t),e)}var rt=Object.getOwnPropertySymbols,nt=rt?function(t){for(var e=[];t;)N(e,B(t)),t=v(t);return e}:_;const M=nt;function at(t,e){return T(t,M(t),e)}function ot(t){return K(t,j,M)}var st=Object.prototype,ct=st.hasOwnProperty;function it(t){var e=t.length,n=new t.constructor(e);return e&&typeof t[0]=="string"&&ct.call(t,"index")&&(n.index=t.index,n.input=t.input),n}function gt(t,e){var n=e?C(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.byteLength)}var ft=/\w*$/;function bt(t){var e=new t.constructor(t.source,ft.exec(t));return e.lastIndex=t.lastIndex,e}var w=m?m.prototype:void 0,I=w?w.valueOf:void 0;function yt(t){return I?Object(I.call(t)):{}}var ut="[object Boolean]",Tt="[object Date]",lt="[object Map]",jt="[object Number]",pt="[object RegExp]",At="[object Set]",dt="[object String]",St="[object Symbol]",$t="[object ArrayBuffer]",mt="[object DataView]",wt="[object Float32Array]",It="[object Float64Array]",Ot="[object Int8Array]",ht="[object Int16Array]",Ft="[object Int32Array]",Bt="[object Uint8Array]",Ct="[object Uint8ClampedArray]",Et="[object Uint16Array]",xt="[object Uint32Array]";function Mt(t,e,n){var o=t.constructor;switch(e){case $t:return C(t);case ut:case Tt:return new o(+t);case mt:return gt(t,n);case wt:case It:case Ot:case ht:case Ft:case Bt:case Ct:case Et:case xt:return R(t,n);case lt:return new o;case jt:case dt:return new o(t);case pt:return bt(t);case At:return new o;case St:return yt(t)}}var Lt="[object Map]";function Ut(t){return x(t)&&p(t)==Lt}var O=u&&u.isMap,Pt=O?E(O):Ut;const Dt=Pt;var Gt="[object Set]";function _t(t){return x(t)&&p(t)==Gt}var h=u&&u.isSet,Nt=h?E(h):_t;const vt=Nt;var Kt=1,Rt=2,qt=4,L="[object Arguments]",Wt="[object Array]",Yt="[object Boolean]",Ht="[object Date]",Jt="[object Error]",U="[object Function]",Qt="[object GeneratorFunction]",Vt="[object Map]",Xt="[object Number]",P="[object Object]",Zt="[object RegExp]",zt="[object Set]",kt="[object String]",te="[object Symbol]",ee="[object WeakMap]",re="[object ArrayBuffer]",ne="[object DataView]",ae="[object Float32Array]",oe="[object Float64Array]",se="[object Int8Array]",ce="[object Int16Array]",ie="[object Int32Array]",ge="[object Uint8Array]",fe="[object Uint8ClampedArray]",be="[object Uint16Array]",ye="[object Uint32Array]",r={};r[L]=r[Wt]=r[re]=r[ne]=r[Yt]=r[Ht]=r[ae]=r[oe]=r[se]=r[ce]=r[ie]=r[Vt]=r[Xt]=r[P]=r[Zt]=r[zt]=r[kt]=r[te]=r[ge]=r[fe]=r[be]=r[ye]=!0;r[Jt]=r[U]=r[ee]=!1;function l(t,e,n,o,f,s){var a,b=e&Kt,y=e&Rt,D=e&qt;if(n&&(a=f?n(t,o,f,s):n(t)),a!==void 0)return a;if(!V(t))return t;var A=X(t);if(A){if(a=it(t),!b)return q(t,a)}else{var g=p(t),d=g==U||g==Qt;if(W(t))return Y(t,b);if(g==P||g==L||d&&!f){if(a=y||d?{}:H(t),!b)return y?at(t,tt(a,t)):et(t,k(a,t))}else{if(!r[g])return f?t:{};a=Mt(t,g,b)}}s||(s=new J);var S=s.get(t);if(S)return S;s.set(t,a),vt(t)?t.forEach(function(c){a.add(l(c,e,n,c,t,s))}):Dt(t)&&t.forEach(function(c,i){a.set(i,l(c,e,n,i,t,s))});var G=D?y?ot:Q:y?j:F,$=A?void 0:G(t);return z($||t,function(c,i){$&&(i=c,c=t[i]),Z(a,i,l(c,e,n,i,t,s))}),a}export{l as b};
|
||||
+1
File diff suppressed because one or more lines are too long
-1
@@ -1 +0,0 @@
|
||||
import{i as V,f as g,a9 as y,aq as b,N as w,a0 as O,A as B,r as _,B as E,s as I}from"./index-bded577e.js";function K(s){for(var n=-1,e=s==null?0:s.length,r={};++n<e;){var c=s[n];r[c[0]]=c[1]}return r}const T=s=>s===void 0,D=s=>typeof s=="boolean",F=s=>typeof s=="number",G=s=>typeof Element>"u"?!1:s instanceof Element,U=s=>V(s)?!Number.isNaN(Number(s)):!1,h="__epPropKey",z=s=>s,j=s=>g(s)&&!!s[h],q=(s,n)=>{if(!g(s)||j(s))return s;const{values:e,required:r,default:c,type:l,validator:d}=s,p={type:l,required:!!r,validator:e||d?m=>{let u=!1,f=[];if(e&&(f=Array.from(e),y(s,"default")&&f.push(c),u||(u=f.includes(m))),d&&(u||(u=d(m))),!u&&f.length>0){const $=[...new Set(f)].map(N=>JSON.stringify(N)).join(", ");b(`Invalid prop: validation failed${n?` for prop "${n}"`:""}. Expected one of [${$}], got value ${JSON.stringify(m)}.`)}return u}:void 0,[h]:!0};return y(s,"default")&&(p.default=c),p},H=s=>K(Object.entries(s).map(([n,e])=>[n,q(e,n)])),L=(s,n)=>{if(s.install=e=>{for(const r of[s,...Object.values(n??{})])e.component(r.name,r)},n)for(const[e,r]of Object.entries(n))s[e]=r;return s},M=(s,n)=>(s.install=e=>{s._context=e._context,e.config.globalProperties[n]=s},s),Q=s=>(s.install=w,s),R=s=>s,v="el",x="is-",i=(s,n,e,r,c)=>{let l=`${s}-${n}`;return e&&(l+=`-${e}`),r&&(l+=`__${r}`),c&&(l+=`--${c}`),l},C=Symbol("namespaceContextKey"),A=s=>{const n=s||(O()?B(C,_(v)):_(v));return E(()=>I(n)||v)},W=(s,n)=>{const e=A(n);return{namespace:e,b:(t="")=>i(e.value,s,t,"",""),e:t=>t?i(e.value,s,"",t,""):"",m:t=>t?i(e.value,s,"","",t):"",be:(t,a)=>t&&a?i(e.value,s,t,a,""):"",em:(t,a)=>t&&a?i(e.value,s,"",t,a):"",bm:(t,a)=>t&&a?i(e.value,s,t,"",a):"",bem:(t,a,o)=>t&&a&&o?i(e.value,s,t,a,o):"",is:(t,...a)=>{const o=a.length>=1?a[0]:!0;return t&&o?`${x}${t}`:""},cssVar:t=>{const a={};for(const o in t)t[o]&&(a[`--${e.value}-${o}`]=t[o]);return a},cssVarName:t=>`--${e.value}-${t}`,cssVarBlock:t=>{const a={};for(const o in t)t[o]&&(a[`--${e.value}-${s}-${o}`]=t[o]);return a},cssVarBlockName:t=>`--${e.value}-${s}-${t}`}};var X=(s,n)=>{const e=s.__vccOpts||s;for(const[r,c]of n)e[r]=c;return e};export{X as _,D as a,H as b,Q as c,z as d,v as e,T as f,G as g,K as h,F as i,M as j,q as k,A as l,R as m,C as n,U as o,W as u,L as w};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
.el-card{--el-card-border-color:var(--el-border-color-light);--el-card-border-radius:4px;--el-card-padding:20px;--el-card-bg-color:var(--el-fill-color-blank)}.el-card{border-radius:var(--el-card-border-radius);border:1px solid var(--el-card-border-color);background-color:var(--el-card-bg-color);overflow:hidden;color:var(--el-text-color-primary);transition:var(--el-transition-duration)}.el-card.is-always-shadow{box-shadow:var(--el-box-shadow-light)}.el-card.is-hover-shadow:focus,.el-card.is-hover-shadow:hover{box-shadow:var(--el-box-shadow-light)}.el-card__header{padding:calc(var(--el-card-padding) - 2px) var(--el-card-padding);border-bottom:1px solid var(--el-card-border-color);box-sizing:border-box}.el-card__body{padding:var(--el-card-padding)}
|
||||
-1
@@ -1 +0,0 @@
|
||||
import{b as n,d as p,u as c,_ as i,w as m}from"./base-c9c53ef4.js";import{d as l,m as o,p as t,D as r,s,E as d,L as u,y,H as f,x as h,z as v}from"./index-bded577e.js";const w=n({header:{type:String,default:""},bodyStyle:{type:p([String,Object,Array]),default:""},shadow:{type:String,values:["always","hover","never"],default:"always"}}),S=l({name:"ElCard"}),_=l({...S,props:w,setup(C){const a=c("card");return(e,g)=>(o(),t("div",{class:r([s(a).b(),s(a).is(`${e.shadow}-shadow`)])},[e.$slots.header||e.header?(o(),t("div",{key:0,class:r(s(a).e("header"))},[d(e.$slots,"header",{},()=>[h(v(e.header),1)])],2)):u("v-if",!0),y("div",{class:r(s(a).e("body")),style:f(e.bodyStyle)},[d(e.$slots,"default")],6)],2))}});var b=i(_,[["__file","/home/runner/work/element-plus/element-plus/packages/components/card/src/card.vue"]]);const N=m(b);export{N as E};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{b as g,u as _,_ as w,w as $,d as r,m as u,i as b}from"./base-c9c53ef4.js";import{d as p,B as o,I as O,m as h,J as v,w as j,E as N,D as C,s as c,H as x,$ as E,A as S,f as k}from"./index-bded577e.js";const R=Symbol("rowContextKey"),K=["start","center","end","space-around","space-between","space-evenly"],B=["top","middle","bottom"],P=g({tag:{type:String,default:"div"},gutter:{type:Number,default:0},justify:{type:String,values:K,default:"start"},align:{type:String,values:B}}),A=p({name:"ElRow"}),D=p({...A,props:P,setup(f){const t=f,l=_("row"),a=o(()=>t.gutter);O(R,{gutter:a});const i=o(()=>{const e={};return t.gutter&&(e.marginRight=e.marginLeft=`-${t.gutter/2}px`),e}),m=o(()=>[l.b(),l.is(`justify-${t.justify}`,t.justify!=="start"),l.is(`align-${t.align}`,!!t.align)]);return(e,d)=>(h(),v(E(e.tag),{class:C(c(m)),style:x(c(i))},{default:j(()=>[N(e.$slots,"default")]),_:3},8,["class","style"]))}});var I=w(D,[["__file","/home/runner/work/element-plus/element-plus/packages/components/row/src/row.vue"]]);const M=$(I),J=g({tag:{type:String,default:"div"},span:{type:Number,default:24},offset:{type:Number,default:0},pull:{type:Number,default:0},push:{type:Number,default:0},xs:{type:r([Number,Object]),default:()=>u({})},sm:{type:r([Number,Object]),default:()=>u({})},md:{type:r([Number,Object]),default:()=>u({})},lg:{type:r([Number,Object]),default:()=>u({})},xl:{type:r([Number,Object]),default:()=>u({})}}),L=p({name:"ElCol"}),H=p({...L,props:J,setup(f){const t=f,{gutter:l}=S(R,{gutter:o(()=>0)}),a=_("col"),i=o(()=>{const e={};return l.value&&(e.paddingLeft=e.paddingRight=`${l.value/2}px`),e}),m=o(()=>{const e=[];return["span","offset","pull","push"].forEach(s=>{const n=t[s];b(n)&&(s==="span"?e.push(a.b(`${t[s]}`)):n>0&&e.push(a.b(`${s}-${t[s]}`)))}),["xs","sm","md","lg","xl"].forEach(s=>{b(t[s])?e.push(a.b(`${s}-${t[s]}`)):k(t[s])&&Object.entries(t[s]).forEach(([n,y])=>{e.push(n!=="span"?a.b(`${s}-${n}-${y}`):a.b(`${s}-${y}`))})}),l.value&&e.push(a.is("guttered")),[a.b(),e]});return(e,d)=>(h(),v(E(e.tag),{class:C(c(m)),style:x(c(i))},{default:j(()=>[N(e.$slots,"default")]),_:3},8,["class","style"]))}});var T=w(H,[["__file","/home/runner/work/element-plus/element-plus/packages/components/col/src/col.vue"]]);const Q=$(T);export{Q as E,M as a};
|
||||
import{b as g,e as _,_ as w,w as $,j as r,m as u,c as b}from"./base-3569949a.js";import{d as p,B as o,I as O,m as h,J as v,w as j,E as N,D as C,s as c,H as x,$ as E,A as S,f as k}from"./index-4cf91ffb.js";const R=Symbol("rowContextKey"),K=["start","center","end","space-around","space-between","space-evenly"],B=["top","middle","bottom"],P=g({tag:{type:String,default:"div"},gutter:{type:Number,default:0},justify:{type:String,values:K,default:"start"},align:{type:String,values:B}}),A=p({name:"ElRow"}),D=p({...A,props:P,setup(f){const t=f,l=_("row"),a=o(()=>t.gutter);O(R,{gutter:a});const i=o(()=>{const e={};return t.gutter&&(e.marginRight=e.marginLeft=`-${t.gutter/2}px`),e}),m=o(()=>[l.b(),l.is(`justify-${t.justify}`,t.justify!=="start"),l.is(`align-${t.align}`,!!t.align)]);return(e,d)=>(h(),v(E(e.tag),{class:C(c(m)),style:x(c(i))},{default:j(()=>[N(e.$slots,"default")]),_:3},8,["class","style"]))}});var I=w(D,[["__file","/home/runner/work/element-plus/element-plus/packages/components/row/src/row.vue"]]);const M=$(I),J=g({tag:{type:String,default:"div"},span:{type:Number,default:24},offset:{type:Number,default:0},pull:{type:Number,default:0},push:{type:Number,default:0},xs:{type:r([Number,Object]),default:()=>u({})},sm:{type:r([Number,Object]),default:()=>u({})},md:{type:r([Number,Object]),default:()=>u({})},lg:{type:r([Number,Object]),default:()=>u({})},xl:{type:r([Number,Object]),default:()=>u({})}}),L=p({name:"ElCol"}),H=p({...L,props:J,setup(f){const t=f,{gutter:l}=S(R,{gutter:o(()=>0)}),a=_("col"),i=o(()=>{const e={};return l.value&&(e.paddingLeft=e.paddingRight=`${l.value/2}px`),e}),m=o(()=>{const e=[];return["span","offset","pull","push"].forEach(s=>{const n=t[s];b(n)&&(s==="span"?e.push(a.b(`${t[s]}`)):n>0&&e.push(a.b(`${s}-${t[s]}`)))}),["xs","sm","md","lg","xl"].forEach(s=>{b(t[s])?e.push(a.b(`${s}-${t[s]}`)):k(t[s])&&Object.entries(t[s]).forEach(([n,y])=>{e.push(n!=="span"?a.b(`${s}-${n}-${y}`):a.b(`${s}-${y}`))})}),l.value&&e.push(a.is("guttered")),[a.b(),e]});return(e,d)=>(h(),v(E(e.tag),{class:C(c(m)),style:x(c(i))},{default:j(()=>[N(e.$slots,"default")]),_:3},8,["class","style"]))}});var T=w(H,[["__file","/home/runner/work/element-plus/element-plus/packages/components/col/src/col.vue"]]);const Q=$(T);export{Q as E,M as a};
|
||||
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
+9
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
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
+3
File diff suppressed because one or more lines are too long
-11
File diff suppressed because one or more lines are too long
+1
-1
@@ -1 +1 @@
|
||||
import{O as A,a6 as N}from"./index-bded577e.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{O as A,a6 as N}from"./index-4cf91ffb.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};
|
||||
Vendored
+2
-2
@@ -2,13 +2,13 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="icon" href="/logo_small.png">
|
||||
<link rel="icon" href="/assets/logo_small.png">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
|
||||
<meta name="description" content="{{description}}">
|
||||
<meta name="keywords" content="{{keywords}}" />
|
||||
<meta name="generator" content="FileCodeBox2.0" />
|
||||
<title>{{title}}</title>
|
||||
<script type="module" crossorigin src="/assets/index-bded577e.js"></script>
|
||||
<script type="module" crossorigin src="/assets/index-4cf91ffb.js"></script>
|
||||
<link rel="stylesheet" href="/assets/index-b9599089.css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
Vendored
BIN
Binary file not shown.
|
Before Width: | Height: | Size: 206 KiB |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 261.76 226.69"><path d="M161.096.001l-30.225 52.351L100.647.001H-.005l130.877 226.688L261.749.001z" fill="#41b883"/><path d="M161.096.001l-30.225 52.351L100.647.001H52.346l78.526 136.01L209.398.001z" fill="#34495e"/></svg>
|
||||
|
Before Width: | Height: | Size: 276 B |
Binary file not shown.
|
Before Width: | Height: | Size: 42 KiB |
@@ -1,11 +1,10 @@
|
||||
<template>
|
||||
<main>
|
||||
<div>
|
||||
<el-row>
|
||||
<el-col>1</el-col>
|
||||
</el-row>
|
||||
<el-button>1</el-button>
|
||||
</div>
|
||||
<main style="text-align: center">
|
||||
<span>本项目开源于Github:
|
||||
<em>
|
||||
<a style="color: #333" href="https://github.com/vastsa/FileCodeBox">FileCodeBox</a>
|
||||
</em>
|
||||
</span>
|
||||
</main>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
<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)">颜色模式</el-menu-item>
|
||||
</el-menu>
|
||||
</el-header>
|
||||
<el-main>
|
||||
@@ -11,9 +12,10 @@
|
||||
</el-container>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { useDark } from '@vueuse/core';
|
||||
import { useDark,useToggle } from '@vueuse/core';
|
||||
import { ref } from "vue";
|
||||
const isDark = useDark()
|
||||
const toggleDark = useToggle(isDark)
|
||||
import { useRoute } from 'vue-router';
|
||||
const route = useRoute();
|
||||
const menus = ref([
|
||||
@@ -30,7 +32,6 @@ const menus = ref([
|
||||
path: '/admin/about',
|
||||
}
|
||||
]);
|
||||
console.log(isDark.value);
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
</style>
|
||||
@@ -9,58 +9,112 @@
|
||||
<el-form-item size="large" label="关键词" style="letter-spacing: 0.3rem">
|
||||
<el-input v-model="config.keywords" />
|
||||
</el-form-item>
|
||||
<el-form-item size="large" label="开启上传">
|
||||
<el-select v-model="config.openUpload">
|
||||
<el-option label="开启游客上传" value="1" />
|
||||
<el-option label="关闭游客上传" value="0" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item size="large" label="文件大小">
|
||||
<el-input v-model="config.uploadSize" />
|
||||
<el-input type="number" v-model="config.uploadSize" />
|
||||
<template #append>Bit</template>
|
||||
<small>最大文件大小,单位:(bit),1mb=1 * 1024 * 1024</small>
|
||||
</el-form-item>
|
||||
<el-form-item size="large" label="开启上传">
|
||||
<el-select v-model="config.openUpload">
|
||||
<el-option label="开启游客上传" :value="1" />
|
||||
<el-option label="关闭游客上传" :value="0" />
|
||||
</el-select>
|
||||
<small style="margin-left: 0.4rem">关闭之后需要登录后台方可上传</small>
|
||||
</el-form-item>
|
||||
<el-form-item size="large" label="存储引擎">
|
||||
<el-select v-model="config.file_storage">
|
||||
<el-option label="本地存储" value="local" />
|
||||
<el-option label="S3存储" value="s3" />
|
||||
</el-select>
|
||||
<small style="margin-left: 0.4rem">更新后需要重启FileCodeBox</small>
|
||||
</el-form-item>
|
||||
<div v-if="config.file_storage==='s3'">
|
||||
<el-form-item size="large" label="S3 AccessKeyId">
|
||||
<el-input v-model="config.s3_access_key_id" />
|
||||
</el-form-item>
|
||||
<el-form-item size="large" label="S3 SecretAccessKey">
|
||||
<el-input v-model="config.s3_secret_access_key" />
|
||||
</el-form-item>
|
||||
<el-form-item size="large" label="S3 BucketName">
|
||||
<el-input v-model="config.s3_bucket_name" />
|
||||
</el-form-item>
|
||||
<el-form-item size="large" label="S3 EndpointUrl">
|
||||
<el-input v-model="config.s3_endpoint_url" />
|
||||
</el-form-item>
|
||||
</div>
|
||||
<el-form-item size="large" label="上传限制">
|
||||
<span style="display: flex;height: 38px">
|
||||
<span style="margin-right: 0.4rem">每</span>
|
||||
<el-input v-model="config.uploadMinute" />
|
||||
<el-input type="number" v-model="config.uploadMinute" />
|
||||
<span style="width: 200px;margin-left: 0.4rem">分钟</span>
|
||||
</span>
|
||||
<span style="display: flex;height: 38px">
|
||||
<span style="width:3rem;margin-right: 0.4rem">上传</span>
|
||||
<el-input v-model="config.uploadCount" />
|
||||
<el-input type="number" v-model="config.uploadCount" />
|
||||
<span style="width: 200px;margin-left: 0.4rem">个文件</span>
|
||||
</span>
|
||||
</el-form-item>
|
||||
<el-form-item size="large" label="错误限制">
|
||||
<span style="display: flex;height: 38px">
|
||||
<span style="margin-right: 0.4rem">每</span>
|
||||
<el-input v-model="config.uploadMinute" />
|
||||
<el-input type="number" v-model="config.errorMinute" />
|
||||
<span style="width: 200px;margin-left: 0.4rem">分钟</span>
|
||||
</span>
|
||||
<span style="display: flex;height: 38px">
|
||||
<span style="width:3rem;margin-right: 0.4rem">允许</span>
|
||||
<el-input v-model="config.uploadCount" />
|
||||
<el-input type="number" v-model="config.errorCount" />
|
||||
<span style="width: 200px;margin-left: 0.4rem">次错误</span>
|
||||
</span>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" style="margin: auto">保存</el-button>
|
||||
<el-button @click="submitSave" type="primary" style="margin: auto">保存</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import {ref} from "vue";
|
||||
import { request } from "@/utils/request";
|
||||
import { ElMessage } from "element-plus";
|
||||
|
||||
const config = ref({
|
||||
name: '',
|
||||
description: '',
|
||||
file_storage: '',
|
||||
keywords: '',
|
||||
openUpload: '1',
|
||||
uploadSize: '1',
|
||||
uploadMinute: '1',
|
||||
uploadCount: '1',
|
||||
openUpload: 1,
|
||||
uploadSize: 1,
|
||||
uploadMinute: 1,
|
||||
s3_access_key_id: '',
|
||||
s3_secret_access_key: '',
|
||||
s3_bucket_name: '',
|
||||
s3_endpoint_url: '',
|
||||
uploadCount: 1,
|
||||
errorMinute: 1,
|
||||
errorCount: 1,
|
||||
});
|
||||
const refreshData = ()=>{
|
||||
request({
|
||||
url: '/admin/config/get',
|
||||
method: 'get'
|
||||
}).then((res: any) => {
|
||||
config.value = res.detail;
|
||||
});
|
||||
}
|
||||
refreshData();
|
||||
const submitSave = () => {
|
||||
|
||||
request({
|
||||
url: '/admin/config/update',
|
||||
method: 'patch',
|
||||
data: config.value
|
||||
}).then((res: any) => {
|
||||
if (res.code == 200) {
|
||||
ElMessage.success('保存成功');
|
||||
} else {
|
||||
ElMessage.error(res.message);
|
||||
}
|
||||
});
|
||||
};
|
||||
</script>
|
||||
<style lang="scss">
|
||||
|
||||
|
||||
@@ -2,16 +2,20 @@
|
||||
# @Author : Lan
|
||||
# @File : main.py
|
||||
# @Software: PyCharm
|
||||
import os
|
||||
|
||||
from fastapi import FastAPI
|
||||
from starlette.middleware.cors import CORSMiddleware
|
||||
from starlette.responses import HTMLResponse
|
||||
from starlette.staticfiles import StaticFiles
|
||||
from tortoise.contrib.fastapi import register_tortoise
|
||||
|
||||
from apps.base.views import share_api
|
||||
from apps.admin.views import admin_api
|
||||
from core.settings import data_root
|
||||
from core.settings import data_root, settings
|
||||
|
||||
app = FastAPI()
|
||||
|
||||
app.add_middleware(
|
||||
CORSMiddleware,
|
||||
allow_origins=["*"],
|
||||
@@ -19,6 +23,7 @@ app.add_middleware(
|
||||
allow_methods=["*"],
|
||||
allow_headers=["*"],
|
||||
)
|
||||
|
||||
app.mount('/assets', StaticFiles(directory='./fcb-fronted/dist/assets'), name="assets")
|
||||
|
||||
register_tortoise(
|
||||
@@ -46,10 +51,15 @@ app.include_router(admin_api)
|
||||
|
||||
@app.get('/')
|
||||
async def index():
|
||||
return HTMLResponse(content=open('./fcb-fronted/dist/index.html', 'r', encoding='utf-8').read().replace('{{title}}', 'FileCodeBox'), status_code=200)
|
||||
return HTMLResponse(
|
||||
content=open('./fcb-fronted/dist/index.html', 'r', encoding='utf-8').read()
|
||||
.replace('{{title}}', settings.name)
|
||||
.replace('{{description}}', settings.description)
|
||||
.replace('{{keywords}}', settings.keywords)
|
||||
, media_type='text/html', headers={'Cache-Control': 'no-cache'})
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
import uvicorn
|
||||
|
||||
uvicorn.run(app='main:app', host="0.0.0.0", port=12345, reload=False, workers=3)
|
||||
uvicorn.run(app='main:app', host="0.0.0.0", port=12345, reload=False, workers=1)
|
||||
|
||||
Reference in New Issue
Block a user