🎨 增加 Go 后端

This commit is contained in:
江西小徐
2024-04-07 11:08:05 +08:00
parent 04c82ab25d
commit 61275be2bf
165 changed files with 7043 additions and 3599 deletions
+6
View File
@@ -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"`
}
+6
View File
@@ -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"`
}
+13
View File
@@ -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"`
}
+9
View File
@@ -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
)
+15
View File
@@ -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,
}
}
+78
View File
@@ -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
}
}
+20
View File
@@ -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,
}
}
+23
View File
@@ -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()
}
}
+29
View File
@@ -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{}
}
+37
View File
@@ -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
}
+13
View File
@@ -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,
}
}
+94
View File
@@ -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
}
+18
View File
@@ -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) {
}
+55
View File
@@ -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
}