- 六协议调试:HTTP/GraphQL/WebSocket/SSE/Socket.IO/MQTT
- 集合树/多标签/多环境变量/历史记录,localStorage 持久化
- 导入:OpenAPI 2/3/3.1、Postman、Apifox、Apipost、cURL、HAR、
Insomnia、Hoppscotch、Markdown(自动识别,21 个单测覆盖)
- 导出:OpenAPI 3.0 JSON/YAML、Postman v2.1、Markdown 文档、
全量备份;单请求生成 cURL/fetch/Python/Go 代码
- Gin 服务:HTTP 代理、NDJSON 流式代理(SSE 透传)、
WebSocket 隧道(浏览器自定义握手 Header)
- 内置产品官网 /home 与用户文档站 /docs(SSR,随二进制交付)
- lucide 图标体系 + 品牌标识(Logo/favicon),明暗双主题
- 环境变量:彩色徽标切换器、管理弹窗、{{ 自动补全
68 lines
1.6 KiB
Go
68 lines
1.6 KiB
Go
// Package site 在 /home(及 /)提供产品官网单页(SSR,资源嵌入二进制)。
|
|
package site
|
|
|
|
import (
|
|
"embed"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
//go:embed template.html assets
|
|
var files embed.FS
|
|
|
|
// Handler 官网服务
|
|
type Handler struct {
|
|
html string
|
|
}
|
|
|
|
func New() *Handler {
|
|
raw, err := files.ReadFile("template.html")
|
|
if err != nil {
|
|
panic("site: template.html 缺失: " + err.Error())
|
|
}
|
|
return &Handler{html: string(raw)}
|
|
}
|
|
|
|
// Register 注册路由:/ 与 /home 均渲染官网
|
|
func (h *Handler) Register(r *gin.Engine) {
|
|
r.GET("/", h.Page)
|
|
r.GET("/home", h.Page)
|
|
r.GET("/index.html", h.Page)
|
|
r.GET("/site/assets/*file", h.Asset)
|
|
}
|
|
|
|
// Page 渲染官网
|
|
func (h *Handler) Page(c *gin.Context) {
|
|
c.Header("Content-Type", "text/html; charset=utf-8")
|
|
c.Header("Cache-Control", "no-cache")
|
|
_, _ = c.Writer.WriteString(h.html)
|
|
}
|
|
|
|
// Asset 静态资源
|
|
func (h *Handler) Asset(c *gin.Context) {
|
|
name := strings.TrimPrefix(c.Param("file"), "/")
|
|
if strings.Contains(name, "..") {
|
|
c.Status(http.StatusBadRequest)
|
|
return
|
|
}
|
|
data, err := files.ReadFile("assets/" + name)
|
|
if err != nil {
|
|
c.Status(http.StatusNotFound)
|
|
return
|
|
}
|
|
switch {
|
|
case strings.HasSuffix(name, ".css"):
|
|
c.Header("Content-Type", "text/css; charset=utf-8")
|
|
case strings.HasSuffix(name, ".js"):
|
|
c.Header("Content-Type", "application/javascript; charset=utf-8")
|
|
case strings.HasSuffix(name, ".svg"):
|
|
c.Header("Content-Type", "image/svg+xml")
|
|
default:
|
|
c.Header("Content-Type", "application/octet-stream")
|
|
}
|
|
c.Header("Cache-Control", "public, max-age=3600")
|
|
c.Data(http.StatusOK, "", data)
|
|
}
|