本地 Mock 服务 /mock + 限流 20QPS/60QPM + 服务条款

- Go Mock 引擎(与前端同语法 @cname/@integer/... 每次请求随机生成,JSON 叶子保持类型)
- mock_endpoints 表 + 发布 API(PUT /api/workspaces/:id/mock,全量替换,单空间 200 个)
- 路由 /mock/:wsid/*path:状态码/延迟(≤5s)/?_method 覆盖;未发布 404
- 限流(IP+空间 滑动窗口):20 QPS / 60 QPM → 429 + Retry-After + 条款提示
- 官网 /terms 服务条款(七节:含禁止滥用——未经授权或滥用有权采取措施、技术手段规避限流属违规)
- UI:HTTP 编辑器「Mock 链接」弹窗(发布/状态码/延迟/模板预览/复制/试一试);
  发布自动烘焙智能 Mock 表达式;集合端点去重 + INSERT OR REPLACE
- docs:14-mock 增本地 Mock 服务与限流章节;页脚/429 响应均指向 /terms
- 单测:mocksrv 引擎/限流/路径 5 用例;curl E2E(随机×2、201+延迟、404、连发 30 次触发 429);浏览器发布+试一试通过
This commit is contained in:
logan committed 2026-09-18 12:29:49 +08:00
1 parent 522e5d6300
commit d9ccccd280
17 files changed
+1070 -6

No files matched your search

+16 -3
View File
@@ -9,12 +9,13 @@ import (
"github.com/gin-gonic/gin"
)
//go:embed template.html assets
//go:embed template.html terms.html assets
var files embed.FS
// Handler 官网服务
type Handler struct {
html string
html string
terms string
}
func New() *Handler {
@@ -22,7 +23,11 @@ func New() *Handler {
if err != nil {
panic("site: template.html 缺失: " + err.Error())
}
return &Handler{html: string(raw)}
terms, err := files.ReadFile("terms.html")
if err != nil {
panic("site: terms.html 缺失: " + err.Error())
}
return &Handler{html: string(raw), terms: string(terms)}
}
// Register 注册路由:/ 与 /home 均渲染官网
@@ -31,6 +36,14 @@ func (h *Handler) Register(r *gin.Engine) {
r.GET("/home", h.Page)
r.GET("/index.html", h.Page)
r.GET("/site/assets/*file", h.Asset)
r.GET("/terms", h.Terms)
}
// Terms 渲染服务条款
func (h *Handler) Terms(c *gin.Context) {
c.Header("Content-Type", "text/html; charset=utf-8")
c.Header("Cache-Control", "no-cache")
_, _ = c.Writer.WriteString(h.terms)
}
// Page 渲染官网