亮点 - v3.2 带宽限速(upload_rate/download_rate,字节/秒,0=不限速;管理端立即生效) - middleware/bandwidth.go 时间窗对齐 sleep 算法 + 单元测试(400KB@100KB/s 4.00s 精度) - 下载:serveFile 包裹 storage.ReadCloser(统一覆盖 local/webdav/s3 代理下载) - 上传:UploadBandwidthMiddleware 包裹 Request.Body(shareFile/chunk/presign proxy) - S3 预签名直传不可服务端限速——UI/文档明示 - 后台 SettingsView 增加 MB/s 友好输入;i18n zh-CN/en-US 双语 - v3.2 文档:新增 docs/api/13-bandwidth.md 专题;10-config 指针;00-overview changelog 与限流表带宽行;openapi.yaml 三处 schema + description 更新 - README.md / web/README.md / server/README.md / deploy/README.md 全部覆盖 品牌(v3.1 收尾) - 文件快递柜 → 文件快传(前端/后端默认值/文档/产物/运行 KV) - 「复制取件码」按钮删除;取件码块点击即复制(保持原尺寸) - 「复制链接」→「复制链接和提取码」(一并复制链接和提取码) 产品修复(v3.1.1) - 文本分享 Content-Type text/plain + urlencoded body:前端显式声明 urlencoded 头根治; 后端 bindJSONOrForm 兜底兼容 text/plain + JSON/urlencoded 嗅探 - Docker 部署文档校对到 v3.1 现状(热切换 + 端口/卷/健康检查)
2 lines
5.1 KiB
JavaScript
2 lines
5.1 KiB
JavaScript
import{d as U,u as I,i as M,I as S,c as u,b as t,t as a,f as l,C as r,Z as w,D as v,w as $,q as x,F as E,r as F,G as q,j as g,R as T,H as R,K as j,e as B,$ as H,s as _,o as c,_ as L}from"./index-D7AAbqvI.js";import{e as O}from"./admin-uFxGdgNa.js";import{_ as G}from"./Pager.vue_vue_type_script_setup_true_lang-g_dGRh7Y.js";const K={class:"toolbar"},P={class:"page-title"},Z={class:"page-sub"},J={value:""},Q={value:"upload"},W={value:"download"},X={value:""},Y={value:"success"},tt={value:"failed"},et={value:"denied"},at={class:"btn",type:"submit"},nt={key:0,class:"loading-block"},lt={key:1,class:"card empty"},st={key:2,class:"table-wrap"},it={class:"table"},ot=["title"],dt={class:"code-cell"},ut={class:"ip-cell"},ct=["title"],rt=U({__name:"AuditView",setup(mt){const{t:n}=I(),z=M(),p=g([]),b=g(0),f=g(!1),o=T({action:"",result:"",ip:"",start:"",end:""}),d=T({page:1,size:20});function h(s,i=!1){if(!s)return"";const e=new Date(s);return Number.isNaN(e.getTime())?"":(i&&e.setHours(23,59,59,999),e.toISOString())}async function m(){f.value=!0;try{const s=await O({page:d.page,size:d.size,action:o.action||void 0,result:o.result||void 0,ip:o.ip.trim()||void 0,startTime:h(o.start)||void 0,endTime:h(o.end,!0)||void 0});p.value=s.data,b.value=s.total}catch(s){z.error(s instanceof R?s.msg:n("admin.audit.loadFailed"))}finally{f.value=!1}}function D(){d.page=1,m()}function V(){o.action="",o.result="",o.ip="",o.start="",o.end="",d.page=1,m()}function k(s,i){d.page=s,d.size=i,m()}function A(s){return s==="upload"?n("admin.audit.actionUpload"):s==="download"?n("admin.audit.actionDownload"):s||"-"}function y(s){return s==="success"?{cls:"badge-success",text:n("common.success")}:s==="denied"?{cls:"badge-warn",text:n("common.denied")}:s==="failed"?{cls:"badge-danger",text:n("common.failed")}:{cls:"badge-muted",text:s||"-"}}function C(s){const i=[s.deviceOs,s.deviceBrowser].filter(Boolean),e=s.deviceType?` · ${s.deviceType}`:"";return i.length?i.join(" · ")+e:"-"}function N(s){const i=s.transferredBytes;if(i==null)return"-";const e=s.sizeBytes;return e!=null&&e!==i?`${_(i)} / ${_(e)}`:_(i)}return S(m),(s,i)=>(c(),u("div",null,[t("div",K,[t("div",null,[t("h2",P,a(l(n)("admin.audit.title")),1),t("p",Z,a(l(n)("admin.audit.subtitle")),1)])]),t("form",{class:"filter-bar",onSubmit:$(D,["prevent"])},[t("label",null,[t("span",null,a(l(n)("admin.audit.action")),1),r(t("select",{"onUpdate:modelValue":i[0]||(i[0]=e=>o.action=e),class:"select"},[t("option",J,a(l(n)("common.all")),1),t("option",Q,a(l(n)("admin.audit.actionUpload")),1),t("option",W,a(l(n)("admin.audit.actionDownload")),1)],512),[[w,o.action]])]),t("label",null,[t("span",null,a(l(n)("admin.audit.result")),1),r(t("select",{"onUpdate:modelValue":i[1]||(i[1]=e=>o.result=e),class:"select"},[t("option",X,a(l(n)("common.all")),1),t("option",Y,a(l(n)("common.success")),1),t("option",tt,a(l(n)("common.failed")),1),t("option",et,a(l(n)("common.denied")),1)],512),[[w,o.result]])]),t("label",null,[t("span",null,a(l(n)("admin.audit.filterIp")),1),r(t("input",{"onUpdate:modelValue":i[2]||(i[2]=e=>o.ip=e),class:"input",placeholder:"10.0.0.1",style:{"max-width":"150px"}},null,512),[[v,o.ip]])]),t("label",null,[t("span",null,a(l(n)("admin.audit.filterStart")),1),r(t("input",{"onUpdate:modelValue":i[3]||(i[3]=e=>o.start=e),class:"input",type:"datetime-local"},null,512),[[v,o.start]])]),t("label",null,[t("span",null,a(l(n)("admin.audit.filterEnd")),1),r(t("input",{"onUpdate:modelValue":i[4]||(i[4]=e=>o.end=e),class:"input",type:"datetime-local"},null,512),[[v,o.end]])]),t("button",at,a(l(n)("common.query")),1),t("button",{class:"btn btn-ghost",type:"button",onClick:V},a(l(n)("common.reset")),1)],32),f.value?(c(),u("div",nt,[i[5]||(i[5]=t("span",{class:"spin","aria-hidden":"true"},null,-1)),x(" "+a(l(n)("common.loading")),1)])):p.value.length?(c(),u("div",st,[t("table",it,[t("thead",null,[t("tr",null,[t("th",null,a(l(n)("admin.audit.colTime")),1),t("th",null,a(l(n)("admin.audit.colAction")),1),t("th",null,a(l(n)("admin.audit.colResult")),1),t("th",null,a(l(n)("admin.audit.colFile")),1),t("th",null,a(l(n)("admin.audit.colCode")),1),t("th",null,a(l(n)("admin.audit.colBytes")),1),t("th",null,a(l(n)("admin.audit.colIp")),1),t("th",null,a(l(n)("admin.audit.colDevice")),1),t("th",null,a(l(n)("admin.audit.colDuration")),1),t("th",null,a(l(n)("admin.audit.colUaError")),1)])]),t("tbody",null,[(c(!0),u(E,null,F(p.value,e=>(c(),u("tr",{key:e.id},[t("td",null,a(l(j)(e.createdAt)),1),t("td",null,[t("span",{class:B(["badge",e.action==="upload"?"":"badge-muted"])},a(A(e.action)),3)]),t("td",null,[t("span",{class:B(["badge",y(e.result).cls])},a(y(e.result).text),3)]),t("td",{class:"wrap",title:e.fileName},a(e.fileName||"-"),9,ot),t("td",dt,a(e.fileCode||"-"),1),t("td",null,a(N(e)),1),t("td",ut,a(e.ip||"-"),1),t("td",null,a(C(e)),1),t("td",null,a(l(H)(e.durationMs)),1),t("td",{class:"wrap ua-cell",title:e.errorMsg||e.userAgent},a(e.errorMsg||e.userAgent||"-"),9,ct)]))),128))])])])):(c(),u("div",lt,[i[6]||(i[6]=t("div",{class:"empty-icon"},"🛡",-1)),x(" "+a(l(n)("admin.audit.empty")),1)])),q(G,{page:d.page,size:d.size,total:b.value,onChange:k},null,8,["page","size","total"])]))}}),gt=L(rt,[["__scopeId","data-v-dcdef1a5"]]);export{gt as default};
|