🎨 增加 Go 后端
This commit is contained in:
@@ -0,0 +1,6 @@
|
||||
package config
|
||||
|
||||
type Server struct {
|
||||
SiteConfig SiteConfig `mapstructure:"siteConfig" json:"siteConfig" yaml:"siteConfig"`
|
||||
Login LoginConfig `mapstructure:"login" json:"login" yaml:"login"`
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package config
|
||||
|
||||
type LoginConfig struct {
|
||||
Username string `mapstructure:"username" json:"username" yaml:"username"`
|
||||
Password string `mapstructure:"password" json:"password" yaml:"password"`
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package config
|
||||
|
||||
type SiteConfig struct {
|
||||
LogoLeftText string `mapstructure:"logoLeftText" json:"logoLeftText" yaml:"logoLeftText"` // Logo左文字
|
||||
LogoRightText string `mapstructure:"logoRightText" json:"logoRightText" yaml:"logoRightText"` // logo右文字
|
||||
DefaultSelectOptions []SelectOptions `mapstructure:"defaultSelectOptions" json:"defaultSelectOptions" yaml:"defaultSelectOptions"` // 默认选择项
|
||||
WhoisServerApi map[string]string `mapstructure:"whoisSeverApi" json:"whoisSeverApi" yaml:"whoisSeverApi"`
|
||||
}
|
||||
|
||||
type SelectOptions struct {
|
||||
Label string `json:"label"`
|
||||
Value string `json:"value"`
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package global
|
||||
|
||||
import "whois-go/internal/config"
|
||||
|
||||
var (
|
||||
// Version is the version of the application.
|
||||
G_Version = "0.1"
|
||||
G_CONFIG config.Server
|
||||
)
|
||||
@@ -0,0 +1,15 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"whois-go/pkg/log"
|
||||
)
|
||||
|
||||
type Handler struct {
|
||||
logger *log.Logger
|
||||
}
|
||||
|
||||
func NewHandler(logger *log.Logger) *Handler {
|
||||
return &Handler{
|
||||
logger: logger,
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"github.com/gin-gonic/gin"
|
||||
"net/http"
|
||||
v1 "whois-go/api/v1"
|
||||
"whois-go/internal/service"
|
||||
)
|
||||
|
||||
type SystemHandler interface {
|
||||
GetWebSiteConfig(ctx *gin.Context)
|
||||
GetWhoisServer(c *gin.Context)
|
||||
GetWhois(c *gin.Context)
|
||||
}
|
||||
|
||||
type systemHandler struct {
|
||||
*Handler
|
||||
systemService service.SystemService
|
||||
}
|
||||
|
||||
func NewSystemHandler(handler *Handler, systemService service.SystemService) SystemHandler {
|
||||
return &systemHandler{
|
||||
Handler: handler,
|
||||
systemService: systemService,
|
||||
}
|
||||
}
|
||||
|
||||
func (h *systemHandler) GetWebSiteConfig(c *gin.Context) {
|
||||
config, err := h.systemService.GetSystemConfig()
|
||||
if err != nil {
|
||||
v1.FailWithMessage("获取失败", c)
|
||||
return
|
||||
}
|
||||
v1.OkWithDetailed(config, "获取成功", c)
|
||||
}
|
||||
|
||||
func (h *systemHandler) GetWhoisServer(c *gin.Context) {
|
||||
var fileConfig v1.FileConfig
|
||||
// 从请求体中绑定JSON数据到configs变量
|
||||
if err := c.BindJSON(&fileConfig); err != nil {
|
||||
// 如果解析出错,返回错误信息
|
||||
v1.FailWithMessage("解析失败", c)
|
||||
return
|
||||
}
|
||||
config, err := h.systemService.GetWhoisJson(fileConfig.Config)
|
||||
if err != nil {
|
||||
v1.FailWithMessage("获取失败", c)
|
||||
return
|
||||
}
|
||||
v1.OkWithDetailed(config, "获取成功", c)
|
||||
}
|
||||
|
||||
func (h *systemHandler) GetWhois(c *gin.Context) {
|
||||
var whoisServer v1.WhoisServer
|
||||
if err := c.BindJSON(&whoisServer); err != nil {
|
||||
// 如果解析出错,返回错误信息
|
||||
v1.FailWithMessage("解析失败", c)
|
||||
return
|
||||
}
|
||||
//判断whoisServer的值来进行不同的函数
|
||||
switch whoisServer.Name {
|
||||
case "whocx":
|
||||
resp := h.systemService.WhoisServerIsWhocx(whoisServer.Domain)
|
||||
v1.OkWithDetailed(resp, "获取成功", c)
|
||||
return
|
||||
case "tianhu":
|
||||
resp, err := h.systemService.WhoisServerIsTianhu(whoisServer.Domain)
|
||||
if err != nil {
|
||||
v1.FailWithMessage("获取失败", c)
|
||||
return
|
||||
}
|
||||
c.JSON(http.StatusOK, resp)
|
||||
return
|
||||
default:
|
||||
v1.FailWithMessage("未知的Whois服务器", c)
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"whois-go/internal/service"
|
||||
)
|
||||
|
||||
type UserHandler interface {
|
||||
}
|
||||
|
||||
type userHandler struct {
|
||||
*Handler
|
||||
userService service.UserService
|
||||
}
|
||||
|
||||
func NewUserHandler(handler *Handler, userService service.UserService) UserHandler {
|
||||
return &userHandler{
|
||||
Handler: handler,
|
||||
userService: userService,
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package middleware
|
||||
|
||||
import (
|
||||
"github.com/gin-gonic/gin"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
func CORSMiddleware() gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
method := c.Request.Method
|
||||
c.Header("Access-Control-Allow-Origin", c.GetHeader("Origin"))
|
||||
c.Header("Access-Control-Allow-Credentials", "true")
|
||||
|
||||
if method == "OPTIONS" {
|
||||
c.Header("Access-Control-Allow-Methods", c.GetHeader("Access-Control-Request-Method"))
|
||||
c.Header("Access-Control-Allow-Headers", c.GetHeader("Access-Control-Request-Headers"))
|
||||
c.Header("Access-Control-Max-Age", "7200")
|
||||
c.AbortWithStatus(http.StatusNoContent)
|
||||
return
|
||||
}
|
||||
c.Next()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"whois-go/pkg/log"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type Repository struct {
|
||||
db *gorm.DB
|
||||
//rdb *redis.Client
|
||||
logger *log.Logger
|
||||
}
|
||||
|
||||
func NewRepository(logger *log.Logger, db *gorm.DB) *Repository {
|
||||
return &Repository{
|
||||
db: db,
|
||||
//rdb: rdb,
|
||||
logger: logger,
|
||||
}
|
||||
}
|
||||
func NewDb() *gorm.DB {
|
||||
// TODO: init db
|
||||
//db, err := gorm.Open(mysql.Open(conf.GetString("data.mysql.user")), &gorm.Config{})
|
||||
//if err != nil {
|
||||
// panic(err)
|
||||
//}
|
||||
//return db
|
||||
return &gorm.DB{}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
package server
|
||||
|
||||
import (
|
||||
"github.com/gin-gonic/gin"
|
||||
"whois-go/internal/handler"
|
||||
"whois-go/internal/middleware"
|
||||
"whois-go/pkg/helper/resp"
|
||||
"whois-go/pkg/log"
|
||||
)
|
||||
|
||||
func NewServerHTTP(
|
||||
logger *log.Logger,
|
||||
systemHandler handler.SystemHandler,
|
||||
) *gin.Engine {
|
||||
gin.SetMode(gin.ReleaseMode)
|
||||
r := gin.Default()
|
||||
r.Use(
|
||||
middleware.CORSMiddleware(),
|
||||
)
|
||||
r.GET("/", func(ctx *gin.Context) {
|
||||
resp.HandleSuccess(ctx, map[string]interface{}{
|
||||
"say": "This is GoLang!",
|
||||
})
|
||||
})
|
||||
|
||||
// 获取配置文件内容
|
||||
api := r.Group("/api")
|
||||
api.POST("/getWebSiteConfig", systemHandler.GetWebSiteConfig)
|
||||
|
||||
api.POST("/getWhoisServer", systemHandler.GetWhoisServer)
|
||||
|
||||
server := api.Group("/server")
|
||||
server.POST("/getWhois", systemHandler.GetWhois)
|
||||
server.POST("/getDns", systemHandler.GetWhois)
|
||||
|
||||
return r
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package service
|
||||
|
||||
import "whois-go/pkg/log"
|
||||
|
||||
type Service struct {
|
||||
logger *log.Logger
|
||||
}
|
||||
|
||||
func NewService(logger *log.Logger) *Service {
|
||||
return &Service{
|
||||
logger: logger,
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"os"
|
||||
v1 "whois-go/api/v1"
|
||||
"whois-go/internal/config"
|
||||
"whois-go/internal/global"
|
||||
"whois-go/internal/utils"
|
||||
"whois-go/pkg/log"
|
||||
)
|
||||
|
||||
type SystemService interface {
|
||||
GetSystemConfig() (config.SiteConfig, error)
|
||||
GetWhoisJson(fileConfig string) ([]v1.WhoisApiInterface, error)
|
||||
WhoisServerIsWhocx(domain string) string
|
||||
WhoisServerIsTianhu(domain string) (v1.TianHuWhoisResponse, error)
|
||||
}
|
||||
|
||||
func NewSystemService(service *Service, logger *log.Logger) SystemService {
|
||||
return &systemService{
|
||||
Service: service,
|
||||
logger: logger,
|
||||
}
|
||||
}
|
||||
|
||||
type systemService struct {
|
||||
*Service
|
||||
logger *log.Logger
|
||||
}
|
||||
|
||||
// GetSystemConfig 读取配置文件
|
||||
func (s *systemService) GetSystemConfig() (config.SiteConfig, error) {
|
||||
return global.G_CONFIG.SiteConfig, nil
|
||||
}
|
||||
|
||||
func (s *systemService) GetWhoisJson(fileConfig string) ([]v1.WhoisApiInterface, error) {
|
||||
file, err := os.Open(fmt.Sprintf("config/json/%s.json", fileConfig))
|
||||
if err != nil {
|
||||
s.logger.Fatal(fmt.Sprintf("Error opening file: %s", err))
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
// 读取文件内容
|
||||
bytes, err := ioutil.ReadAll(file)
|
||||
|
||||
// 反序列化JSON到结构体切片
|
||||
var apis []v1.WhoisApiInterface
|
||||
if err = json.Unmarshal(bytes, &apis); err != nil {
|
||||
s.logger.Fatal(fmt.Sprintf("Error unmarshalling JSON: %s", err))
|
||||
}
|
||||
|
||||
return apis, err
|
||||
}
|
||||
|
||||
func (s *systemService) WhoisServerIsWhocx(domain string) string {
|
||||
whocxURL := global.G_CONFIG.SiteConfig.WhoisServerApi["whocx"]
|
||||
params := url.Values{}
|
||||
params.Set("domain", domain)
|
||||
params.Set("whois", "Domain Name: ")
|
||||
params.Set("lang", "zh")
|
||||
params.Set("time_zone", "8")
|
||||
request, err := utils.SendPostRequest(whocxURL, params)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
return request
|
||||
}
|
||||
|
||||
func (s *systemService) WhoisServerIsTianhu(domain string) (v1.TianHuWhoisResponse, error) {
|
||||
tianhuURL := global.G_CONFIG.SiteConfig.WhoisServerApi["tianhu"]
|
||||
params := url.Values{}
|
||||
//domain=baidu.com&action=searchWhois
|
||||
params.Set("domain", domain)
|
||||
params.Set("action", "searchWhois")
|
||||
var tianhuResp v1.TianHuWhoisResponse
|
||||
// Append query parameters to the URL
|
||||
fullURL := tianhuURL + "?" + params.Encode()
|
||||
// Perform the GET request
|
||||
response, err := http.Get(fullURL)
|
||||
|
||||
defer response.Body.Close()
|
||||
|
||||
// Read the response body
|
||||
body, err := ioutil.ReadAll(response.Body)
|
||||
|
||||
err = json.Unmarshal(body, &tianhuResp)
|
||||
|
||||
return tianhuResp, err
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package service
|
||||
|
||||
type UserService interface {
|
||||
}
|
||||
|
||||
type userService struct {
|
||||
*Service
|
||||
}
|
||||
|
||||
func NewUserService(service *Service) UserService {
|
||||
return &userService{
|
||||
Service: service,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *userService) GetUserById(id int64) {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// FetchData 从给定的URL获取数据
|
||||
func FetchData(url string) ([]byte, error) {
|
||||
// 发起GET请求
|
||||
resp, err := http.Get(url)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("请求失败: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
// 读取响应体
|
||||
body, err := ioutil.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("读取响应体失败: %v", err)
|
||||
}
|
||||
|
||||
return body, nil
|
||||
}
|
||||
|
||||
// SendPostRequest 发送POST请求的函数
|
||||
func SendPostRequest(requestURL string, params url.Values) (string, error) {
|
||||
// 创建POST请求
|
||||
req, err := http.NewRequest("POST", requestURL, strings.NewReader(params.Encode()))
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("创建请求失败: %v", err)
|
||||
}
|
||||
|
||||
// 设置请求头,表明请求体是表单数据
|
||||
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||
|
||||
// 发送请求
|
||||
client := &http.Client{}
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("发送请求失败: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
// 读取响应体
|
||||
body, err := ioutil.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("读取响应体失败: %v", err)
|
||||
}
|
||||
|
||||
return string(body), nil
|
||||
}
|
||||
Reference in New Issue
Block a user