Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
Zhu yizheng
intern_project_frontend_backend
Commits
80ac27b3
Commit
80ac27b3
authored
Jun 26, 2025
by
Zhu yizheng
Browse files
完成跨域
parent
e5a34ae1
Changes
3
Show whitespace changes
Inline
Side-by-side
db/init.go
View file @
80ac27b3
...
...
@@ -6,24 +6,28 @@ import (
"gorm.io/gorm"
)
// DB 全局数据库实例
// DB 全局数据库实例
(保持不变)
var
DB
*
gorm
.
DB
// InitDB 初始化 PostgreSQL 数据库
func
InitDB
()
{
// PostgreSQL 连接字符串
// 替换为你的实际配置:host、port、user、password、dbname
dsn
:=
"host=localhost port=5432 user=go_zyz password=zyz757605 dbname=mygo sslmode=disable"
// InitDB 初始化 PostgreSQL 数据库(修改:返回error类型)
func
InitDB
()
error
{
// 关键:添加error返回值
// PostgreSQL 连接字符串(替换为你的实际配置)
dsn
:=
"host=localhost port=5432 user=go_zyz password=zyz757605 dbname=mygo sslmode=disable client_encoding=utf8"
var
err
error
// 连接数据库
DB
,
err
=
gorm
.
Open
(
postgres
.
Open
(
dsn
),
&
gorm
.
Config
{})
if
err
!=
nil
{
logrus
.
WithError
(
err
)
.
Fatal
(
"数据库连接失败"
)
logrus
.
WithError
(
err
)
.
Error
(
"数据库连接失败"
)
// 改为Error(不退出)
return
err
// 返回错误
}
// 自动迁移
,
创建/更新
Comment
表
// 自动迁移
表(
创建/更新Comment表
)
if
err
:=
DB
.
AutoMigrate
(
&
Comment
{});
err
!=
nil
{
logrus
.
WithError
(
err
)
.
Fatal
(
"数据库迁移失败"
)
logrus
.
WithError
(
err
)
.
Error
(
"数据库迁移失败"
)
// 改为Error(不退出)
return
err
// 返回错误
}
logrus
.
Info
(
"PostgreSQL 数据库初始化成功"
)
return
nil
// 成功返回nil
}
main.go
View file @
80ac27b3
...
...
@@ -3,28 +3,65 @@ package main
import
(
"net/http"
"github.com/zyz/comment-api/db"
"github.com/sirupsen/logrus"
"github.com/zyz/comment-api/db"
// 保留数据库包导入(正确)
)
// ------------------------------
// CORS中间件(保持不变,解决跨域问题)
// ------------------------------
func
corsMiddleware
(
next
http
.
Handler
)
http
.
Handler
{
return
http
.
HandlerFunc
(
func
(
w
http
.
ResponseWriter
,
r
*
http
.
Request
)
{
// 允许的前端Origin(修改为你的前端实际地址,如http://localhost:5500)
allowedOrigins
:=
[]
string
{
"http://localhost:5500"
,
// 保留原有的localhost
"http://127.0.0.1:5500"
,
// 添加前端实际的Origin(Live Server的地址)
}
origin
:=
r
.
Header
.
Get
(
"Origin"
)
for
_
,
o
:=
range
allowedOrigins
{
if
o
==
origin
{
w
.
Header
()
.
Set
(
"Access-Control-Allow-Origin"
,
origin
)
break
}
}
w
.
Header
()
.
Set
(
"Access-Control-Allow-Methods"
,
"GET, POST, OPTIONS"
)
w
.
Header
()
.
Set
(
"Access-Control-Allow-Headers"
,
"Content-Type"
)
if
r
.
Method
==
http
.
MethodOptions
{
w
.
WriteHeader
(
http
.
StatusOK
)
return
}
next
.
ServeHTTP
(
w
,
r
)
})
}
func
main
()
{
// 初始化日志
// 初始化日志
(保持不变)
logrus
.
SetFormatter
(
&
logrus
.
JSONFormatter
{})
logrus
.
Info
(
"启动服务器..."
)
// 初始化数据库
db
.
InitDB
()
// 初始化数据库(修改:接收error并处理)
if
err
:=
db
.
InitDB
();
err
!=
nil
{
// 现在db.InitDB()返回error,可正确接收
logrus
.
WithError
(
err
)
.
Fatal
(
"数据库初始化失败"
)
// 这里用Fatal退出程序
}
logrus
.
Info
(
"PostgreSQL 数据库初始化成功"
)
// 注册路由(直接使用main包中的函数,无需前缀)
mux
:=
http
.
NewServeMux
()
mux
.
HandleFunc
(
"/comment/get"
,
GetCommentsHandler
)
// 直接使用GetCommentsHandler(来自server.go)
mux
.
HandleFunc
(
"/comment/add"
,
AddCommentHandler
)
// 直接使用AddCommentHandler(来自server.go)
mux
.
HandleFunc
(
"/comment/delete"
,
DeleteCommentHandler
)
// 直接使用DeleteCommentHandler(来自server.go)
// 注册路由
http
.
HandleFunc
(
"/comment/get"
,
getCommentsHandler
)
http
.
HandleFunc
(
"/comment/add"
,
addCommentHandler
)
http
.
HandleFunc
(
"/comment/delete"
,
deleteCommentHandler
)
// 应用CORS中间件(保持不变)
handler
:=
corsMiddleware
(
mux
)
// 启动服务器
// 启动服务器
(保持不变)
addr
:=
":8080"
logrus
.
WithField
(
"address"
,
addr
)
.
Info
(
"服务器启动"
)
if
err
:=
http
.
ListenAndServe
(
addr
,
nil
);
err
!=
nil
{
if
err
:=
http
.
ListenAndServe
(
addr
,
handler
);
err
!=
nil
{
logrus
.
WithError
(
err
)
.
Fatal
(
"服务器启动失败"
)
}
}
server.go
View file @
80ac27b3
package
main
package
main
// 必须是main包,和main.go同目录
import
(
"encoding/json"
"net/http"
"strconv"
"github.com/zyz/comment-api/db"
"github.com/sirupsen/logrus"
"github.com/zyz/comment-api/db"
"gorm.io/gorm"
)
// Response 统一响应格式
// Response 统一响应格式
(保持不变)
type
Response
struct
{
Code
int
`json:"code"`
Msg
string
`json:"msg"`
Data
interface
{}
`json:"data"`
}
// GetCommentsResponse 获取评论响应
// GetCommentsResponse 获取评论响应
(保持不变)
type
GetCommentsResponse
struct
{
Total
int64
`json:"total"`
Comments
[]
db
.
Comment
`json:"comments"`
}
func
getCommentsHandler
(
w
http
.
ResponseWriter
,
r
*
http
.
Request
)
{
// ------------------------------
// 导出函数(首字母大写,main包中可直接使用)
// ------------------------------
func
GetCommentsHandler
(
w
http
.
ResponseWriter
,
r
*
http
.
Request
)
{
// 首字母大写,导出
log
:=
logrus
.
WithFields
(
logrus
.
Fields
{
"method"
:
r
.
Method
,
"path"
:
r
.
URL
.
Path
,
...
...
@@ -35,21 +37,18 @@ func getCommentsHandler(w http.ResponseWriter, r *http.Request) {
return
}
// 解析分页参数
page
,
size
:=
parsePaginationParams
(
r
)
log
=
log
.
WithFields
(
logrus
.
Fields
{
"page"
:
page
,
"size"
:
size
,
})
// 查询数据库
comments
,
total
,
err
:=
db
.
GetComments
(
page
,
size
)
if
err
!=
nil
{
respondError
(
w
,
http
.
StatusInternalServerError
,
"查询评论失败"
,
nil
,
log
.
WithError
(
err
))
return
}
// 准备响应
data
:=
GetCommentsResponse
{
Total
:
total
,
Comments
:
comments
,
...
...
@@ -57,7 +56,7 @@ func getCommentsHandler(w http.ResponseWriter, r *http.Request) {
respondSuccess
(
w
,
data
,
log
)
}
func
a
ddCommentHandler
(
w
http
.
ResponseWriter
,
r
*
http
.
Request
)
{
func
A
ddCommentHandler
(
w
http
.
ResponseWriter
,
r
*
http
.
Request
)
{
// 首字母大写,导出
log
:=
logrus
.
WithFields
(
logrus
.
Fields
{
"method"
:
r
.
Method
,
"path"
:
r
.
URL
.
Path
,
...
...
@@ -68,7 +67,6 @@ func addCommentHandler(w http.ResponseWriter, r *http.Request) {
return
}
// 解析请求体
var
req
struct
{
Name
string
`json:"name"`
Content
string
`json:"content"`
...
...
@@ -78,13 +76,11 @@ func addCommentHandler(w http.ResponseWriter, r *http.Request) {
return
}
// 验证输入
if
req
.
Name
==
""
||
req
.
Content
==
""
{
respondError
(
w
,
http
.
StatusBadRequest
,
"姓名和内容为必填项"
,
nil
,
log
)
return
}
// 创建评论
comment
,
err
:=
db
.
CreateComment
(
req
.
Name
,
req
.
Content
)
if
err
!=
nil
{
respondError
(
w
,
http
.
StatusInternalServerError
,
"创建评论失败"
,
nil
,
log
.
WithError
(
err
))
...
...
@@ -94,7 +90,7 @@ func addCommentHandler(w http.ResponseWriter, r *http.Request) {
respondSuccess
(
w
,
comment
,
log
)
}
func
d
eleteCommentHandler
(
w
http
.
ResponseWriter
,
r
*
http
.
Request
)
{
func
D
eleteCommentHandler
(
w
http
.
ResponseWriter
,
r
*
http
.
Request
)
{
// 首字母大写,导出
log
:=
logrus
.
WithFields
(
logrus
.
Fields
{
"method"
:
r
.
Method
,
"path"
:
r
.
URL
.
Path
,
...
...
@@ -105,7 +101,6 @@ func deleteCommentHandler(w http.ResponseWriter, r *http.Request) {
return
}
// 解析评论 ID
idStr
:=
r
.
URL
.
Query
()
.
Get
(
"id"
)
id
,
err
:=
strconv
.
Atoi
(
idStr
)
if
err
!=
nil
||
id
<=
0
{
...
...
@@ -113,7 +108,6 @@ func deleteCommentHandler(w http.ResponseWriter, r *http.Request) {
return
}
// 删除评论
if
err
:=
db
.
DeleteComment
(
id
);
err
!=
nil
{
if
err
==
gorm
.
ErrRecordNotFound
{
respondError
(
w
,
http
.
StatusNotFound
,
"评论不存在"
,
nil
,
log
)
...
...
@@ -126,7 +120,7 @@ func deleteCommentHandler(w http.ResponseWriter, r *http.Request) {
respondSuccess
(
w
,
nil
,
log
)
}
// parsePaginationParams 解析分页参数
// parsePaginationParams 解析分页参数
(保持不变)
func
parsePaginationParams
(
r
*
http
.
Request
)
(
page
,
size
int
)
{
pageStr
:=
r
.
URL
.
Query
()
.
Get
(
"page"
)
sizeStr
:=
r
.
URL
.
Query
()
.
Get
(
"size"
)
...
...
@@ -144,7 +138,7 @@ func parsePaginationParams(r *http.Request) (page, size int) {
return
page
,
size
}
// respondSuccess 发送成功响应
// respondSuccess 发送成功响应
(保持不变)
func
respondSuccess
(
w
http
.
ResponseWriter
,
data
interface
{},
log
*
logrus
.
Entry
)
{
resp
:=
Response
{
Code
:
0
,
...
...
@@ -154,7 +148,7 @@ func respondSuccess(w http.ResponseWriter, data interface{}, log *logrus.Entry)
sendResponse
(
w
,
http
.
StatusOK
,
resp
,
log
)
}
// respondError 发送错误响应
// respondError 发送错误响应
(保持不变)
func
respondError
(
w
http
.
ResponseWriter
,
status
int
,
msg
string
,
data
interface
{},
log
*
logrus
.
Entry
)
{
resp
:=
Response
{
Code
:
status
,
...
...
@@ -168,9 +162,10 @@ func respondError(w http.ResponseWriter, status int, msg string, data interface{
sendResponse
(
w
,
status
,
resp
,
log
)
}
// sendResponse 发送
JSON
响应
// sendResponse 发送JSON响应
(保持不变)
func
sendResponse
(
w
http
.
ResponseWriter
,
status
int
,
resp
Response
,
log
*
logrus
.
Entry
)
{
w
.
Header
()
.
Set
(
"Content-Type"
,
"application/json"
)
// 关键:添加charset=utf-8
w
.
Header
()
.
Set
(
"Content-Type"
,
"application/json; charset=utf-8"
)
w
.
WriteHeader
(
status
)
if
err
:=
json
.
NewEncoder
(
w
)
.
Encode
(
resp
);
err
!=
nil
{
log
.
WithError
(
err
)
.
Error
(
"发送响应失败"
)
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment