Files
logan 2bb4ef7a95 桌面 GUI 外链修复 + 主题顺序调整(含结构扁平化进行中的工作区基线)
- 集成 tauri-plugin-opener:Cargo/lib.rs/capabilities/npm 四处接线,新增 src/openExternal.ts(桌面走 opener,浏览器回退 window.open,相对路径绝对化)
- 关于页 4 个链接、活动栏官网菜单、代理错误横幅 2 处健康检查链接全部改走 openExternal,桌面端可正常跳转
- 设置→外观 主题顺序调整为 深色/浅色/跟随系统
- release 二进制重编并验证(浏览器实测关于页链接可开文档页)
- 附带工作区中未提交的扁平化重构现状(另一会话进行中)
- homepage 落地页与文档终检通过(8787 / 与 /docs 双 200)
2026-10-16 03:03:36 +08:00

70 lines
2.0 KiB
Go

package api
import (
"encoding/json"
"io"
"net/http"
"strings"
"github.com/gin-gonic/gin"
)
func (a *API) localDocs(c *gin.Context) {
if !isLoopbackRequest(c) {
c.JSON(403, gin.H{"error": "仅允许本机管理文档"})
return
}
docs, err := a.store.PublishedDocs()
if err != nil {
c.JSON(500, gin.H{"error": "文档读取失败"})
return
}
c.JSON(200, gin.H{"projects": docs})
}
func (a *API) publishLocalDocs(c *gin.Context) {
if !isLoopbackRequest(c) {
c.JSON(403, gin.H{"error": "仅允许本机发布文档"})
return
}
var req struct {
ProjectID string `json:"projectId"`
Name string `json:"name"`
Endpoints []json.RawMessage `json:"endpoints"`
}
data, err := io.ReadAll(io.LimitReader(c.Request.Body, 2<<20+1))
if err != nil || len(data) > 2<<20 || json.Unmarshal(data, &req) != nil || len(req.Endpoints) > 500 || len(req.Endpoints) == 0 || len(req.ProjectID) > 128 || len(req.Name) > 200 || strings.TrimSpace(req.ProjectID) == "" || strings.TrimSpace(req.Name) == "" {
c.JSON(400, gin.H{"error": "文档无效或超过限制(2 MB / 500 个接口)"})
return
}
for _, endpoint := range req.Endpoints {
var item struct {
Method string `json:"method"`
Path string `json:"path"`
Name string `json:"name"`
}
if json.Unmarshal(endpoint, &item) != nil || item.Name == "" || item.Method == "" || !strings.HasPrefix(item.Path, "/") {
c.JSON(400, gin.H{"error": "接口方法、名称或路径无效"})
return
}
}
doc, err := a.store.PublishDoc(req.ProjectID, req.Name, string(data))
if err != nil {
c.JSON(500, gin.H{"error": "文档发布失败"})
return
}
c.JSON(200, doc)
}
func (a *API) revokeLocalDocs(c *gin.Context) {
if !isLoopbackRequest(c) {
c.JSON(403, gin.H{"error": "仅允许本机管理文档"})
return
}
if err := a.store.RevokeDoc(c.Param("projectId")); err != nil {
c.JSON(500, gin.H{"error": "撤销文档失败"})
return
}
c.JSON(http.StatusOK, gin.H{"ok": true})
}