update:env

This commit is contained in:
lan
2023-08-15 17:23:30 +08:00
parent a4d85bce27
commit d00cef42a1
50 changed files with 224 additions and 80 deletions
+13
View File
@@ -7,6 +7,7 @@ from fastapi import APIRouter
from apps.admin.pydantics import IDData from apps.admin.pydantics import IDData
from apps.base.models import FileCodes from apps.base.models import FileCodes
from core.response import APIResponse from core.response import APIResponse
from core.settings import default_value, settings
from core.storage import file_storage from core.storage import file_storage
admin_api = APIRouter( admin_api = APIRouter(
@@ -32,3 +33,15 @@ async def file_list(page: int = 1, size: int = 10):
'data': data, 'data': data,
'total': await FileCodes.all().count(), '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()
+54
View File
@@ -7,3 +7,57 @@ from pathlib import Path
data_root = Path('./data') data_root = Path('./data')
if not data_root.exists(): if not data_root.exists():
data_root.mkdir(parents=True, exist_ok=True) 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
View File
@@ -8,7 +8,7 @@ import time
import aioboto3 import aioboto3
from fastapi import UploadFile from fastapi import UploadFile
from core.settings import data_root from core.settings import data_root, settings
from apps.base.models import FileCodes from apps.base.models import FileCodes
@@ -45,10 +45,10 @@ class SystemFileStorage:
class S3FileStorage: class S3FileStorage:
def __init__(self): def __init__(self):
self.access_key_id = '' self.access_key_id = settings.s3_access_key_id
self.secret_access_key = '' self.secret_access_key = settings.s3_secret_access_key
self.bucket_name = '' self.bucket_name = settings.s3_bucket_name
self.endpoint_url = '' self.endpoint_url = settings.s3_endpoint_url
self.session = aioboto3.Session( self.session = aioboto3.Session(
aws_access_key_id=self.access_key_id, aws_secret_access_key=self.secret_access_key aws_access_key_id=self.access_key_id, aws_secret_access_key=self.secret_access_key
) )
@@ -69,4 +69,8 @@ class S3FileStorage:
return result return result
file_storage = SystemFileStorage() storages = {
'local': SystemFileStorage,
's3': S3FileStorage
}
file_storage = storages[settings.file_storage]()
+1
View File
@@ -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
View File
@@ -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
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
View File
@@ -1 +0,0 @@
.left-menu{margin-bottom:1rem;cursor:pointer}
+1
View File
@@ -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}
File diff suppressed because one or more lines are too long
-1
View File
@@ -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};
+1
View File
@@ -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};
File diff suppressed because one or more lines are too long
-1
View File
@@ -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
View File
@@ -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
View File
@@ -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 @@
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
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

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 42 KiB

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{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};
+2 -2
View File
@@ -2,13 +2,13 @@
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8"> <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="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="description" content="{{description}}">
<meta name="keywords" content="{{keywords}}" /> <meta name="keywords" content="{{keywords}}" />
<meta name="generator" content="FileCodeBox2.0" /> <meta name="generator" content="FileCodeBox2.0" />
<title>{{title}}</title> <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"> <link rel="stylesheet" href="/assets/index-b9599089.css">
</head> </head>
<body> <body>
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 206 KiB

-1
View File
@@ -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

+6 -7
View File
@@ -1,11 +1,10 @@
<template> <template>
<main> <main style="text-align: center">
<div> <span>本项目开源于Github
<el-row> <em>
<el-col>1</el-col> <a style="color: #333" href="https://github.com/vastsa/FileCodeBox">FileCodeBox</a>
</el-row> </em>
<el-button>1</el-button> </span>
</div>
</main> </main>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
+3 -2
View File
@@ -3,6 +3,7 @@
<el-header> <el-header>
<el-menu mode="horizontal" router :default-active="route.path"> <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 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-menu>
</el-header> </el-header>
<el-main> <el-main>
@@ -11,9 +12,10 @@
</el-container> </el-container>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { useDark } from '@vueuse/core'; import { useDark,useToggle } from '@vueuse/core';
import { ref } from "vue"; import { ref } from "vue";
const isDark = useDark() const isDark = useDark()
const toggleDark = useToggle(isDark)
import { useRoute } from 'vue-router'; import { useRoute } from 'vue-router';
const route = useRoute(); const route = useRoute();
const menus = ref([ const menus = ref([
@@ -30,7 +32,6 @@ const menus = ref([
path: '/admin/about', path: '/admin/about',
} }
]); ]);
console.log(isDark.value);
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
</style> </style>
+70 -16
View File
@@ -9,58 +9,112 @@
<el-form-item size="large" label="关键词" style="letter-spacing: 0.3rem"> <el-form-item size="large" label="关键词" style="letter-spacing: 0.3rem">
<el-input v-model="config.keywords" /> <el-input v-model="config.keywords" />
</el-form-item> </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-form-item size="large" label="文件大小">
<el-input v-model="config.uploadSize" /> <el-input type="number" v-model="config.uploadSize" />
<template #append>Bit</template> <template #append>Bit</template>
<small>最大文件大小单位:bit),1mb=1 * 1024 * 1024</small> <small>最大文件大小单位:bit),1mb=1 * 1024 * 1024</small>
</el-form-item> </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="上传限制"> <el-form-item size="large" label="上传限制">
<span style="display: flex;height: 38px"> <span style="display: flex;height: 38px">
<span style="margin-right: 0.4rem"></span> <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 style="width: 200px;margin-left: 0.4rem">分钟</span>
</span> </span>
<span style="display: flex;height: 38px"> <span style="display: flex;height: 38px">
<span style="width:3rem;margin-right: 0.4rem">上传</span> <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 style="width: 200px;margin-left: 0.4rem">个文件</span>
</span> </span>
</el-form-item> </el-form-item>
<el-form-item size="large" label="错误限制"> <el-form-item size="large" label="错误限制">
<span style="display: flex;height: 38px"> <span style="display: flex;height: 38px">
<span style="margin-right: 0.4rem"></span> <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 style="width: 200px;margin-left: 0.4rem">分钟</span>
</span> </span>
<span style="display: flex;height: 38px"> <span style="display: flex;height: 38px">
<span style="width:3rem;margin-right: 0.4rem">允许</span> <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 style="width: 200px;margin-left: 0.4rem">次错误</span>
</span> </span>
</el-form-item> </el-form-item>
<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-item>
</el-form> </el-form>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import {ref} from "vue"; import {ref} from "vue";
import { request } from "@/utils/request";
import { ElMessage } from "element-plus";
const config = ref({ const config = ref({
name: '', name: '',
description: '', description: '',
file_storage: '',
keywords: '', keywords: '',
openUpload: '1', openUpload: 1,
uploadSize: '1', uploadSize: 1,
uploadMinute: '1', uploadMinute: 1,
uploadCount: '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> </script>
<style lang="scss"> <style lang="scss">
+13 -3
View File
@@ -2,16 +2,20 @@
# @Author : Lan # @Author : Lan
# @File : main.py # @File : main.py
# @Software: PyCharm # @Software: PyCharm
import os
from fastapi import FastAPI from fastapi import FastAPI
from starlette.middleware.cors import CORSMiddleware from starlette.middleware.cors import CORSMiddleware
from starlette.responses import HTMLResponse from starlette.responses import HTMLResponse
from starlette.staticfiles import StaticFiles from starlette.staticfiles import StaticFiles
from tortoise.contrib.fastapi import register_tortoise from tortoise.contrib.fastapi import register_tortoise
from apps.base.views import share_api from apps.base.views import share_api
from apps.admin.views import admin_api from apps.admin.views import admin_api
from core.settings import data_root from core.settings import data_root, settings
app = FastAPI() app = FastAPI()
app.add_middleware( app.add_middleware(
CORSMiddleware, CORSMiddleware,
allow_origins=["*"], allow_origins=["*"],
@@ -19,6 +23,7 @@ app.add_middleware(
allow_methods=["*"], allow_methods=["*"],
allow_headers=["*"], allow_headers=["*"],
) )
app.mount('/assets', StaticFiles(directory='./fcb-fronted/dist/assets'), name="assets") app.mount('/assets', StaticFiles(directory='./fcb-fronted/dist/assets'), name="assets")
register_tortoise( register_tortoise(
@@ -46,10 +51,15 @@ app.include_router(admin_api)
@app.get('/') @app.get('/')
async def index(): 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__': if __name__ == '__main__':
import uvicorn 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)