146 lines
3.9 KiB
Go
146 lines
3.9 KiB
Go
package main
|
||
|
||
import (
|
||
"database/sql"
|
||
"fmt"
|
||
"log"
|
||
"net/http"
|
||
"os"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
_ "github.com/lib/pq"
|
||
)
|
||
|
||
// DeleteAccountRequest 删除账号请求参数
|
||
type DeleteAccountRequest struct {
|
||
UserID string `json:"user_id" binding:"required"`
|
||
}
|
||
|
||
// DeleteAccountResponse 删除账号响应结构
|
||
type DeleteAccountResponse struct {
|
||
Success bool `json:"success"`
|
||
Message string `json:"message"`
|
||
}
|
||
|
||
var db *sql.DB
|
||
|
||
func main() {
|
||
log.Println("开始初始化应用程序")
|
||
|
||
// 初始化Gin引擎
|
||
r := gin.Default()
|
||
log.Println("Gin引擎初始化完成")
|
||
|
||
// 从环境变量获取数据库配置
|
||
dbHost := os.Getenv("DB_HOST")
|
||
dbPort := os.Getenv("DB_PORT")
|
||
dbUser := os.Getenv("DB_USER")
|
||
dbPassword := os.Getenv("DB_PASSWORD")
|
||
dbName := os.Getenv("DB_NAME")
|
||
log.Printf("加载数据库配置: host=%s, port=%s, user=%s, dbname=%s",
|
||
dbHost, dbPort, dbUser, dbName)
|
||
|
||
// 构建数据库连接字符串
|
||
connStr := fmt.Sprintf(
|
||
"host=%s port=%s user=%s password=%s dbname=%s sslmode=disable",
|
||
dbHost, dbPort, dbUser, dbPassword, dbName,
|
||
)
|
||
log.Println("数据库连接字符串构建完成")
|
||
|
||
var err error
|
||
db, err = sql.Open("postgres", connStr)
|
||
if err != nil {
|
||
log.Panicf("无法连接数据库: %v", err)
|
||
}
|
||
defer func() {
|
||
log.Println("关闭数据库连接")
|
||
if err := db.Close(); err != nil {
|
||
log.Printf("关闭数据库连接出错: %v", err)
|
||
}
|
||
}()
|
||
log.Println("数据库连接对象创建成功")
|
||
|
||
// 验证数据库连接
|
||
if err := db.Ping(); err != nil {
|
||
log.Panicf("数据库连接失败: %v", err)
|
||
}
|
||
log.Println("数据库连接验证成功")
|
||
|
||
// 注册删除账号接口
|
||
r.POST("/user/delete/account", deleteAccountHandler)
|
||
log.Println("已注册删除账号接口: POST /user/delete/account")
|
||
|
||
// 启动服务,监听80端口
|
||
log.Println("服务启动在80端口")
|
||
if err := r.Run(":80"); err != nil {
|
||
log.Panicf("服务启动失败: %v", err)
|
||
}
|
||
}
|
||
|
||
// deleteAccountHandler 处理账号删除逻辑(逻辑删除)
|
||
func deleteAccountHandler(c *gin.Context) {
|
||
reqID := c.Request.Header.Get("X-Request-ID")
|
||
if reqID == "" {
|
||
reqID = fmt.Sprintf("req-%d", gin.Mode())
|
||
}
|
||
log.Printf("[%s] 收到删除账号请求,客户端IP: %s", reqID, c.ClientIP())
|
||
|
||
var req DeleteAccountRequest
|
||
// 绑定并验证请求参数
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
log.Printf("[%s] 请求参数绑定失败: %v", reqID, err)
|
||
c.JSON(http.StatusBadRequest, DeleteAccountResponse{
|
||
Success: false,
|
||
Message: "请求参数错误: " + err.Error(),
|
||
})
|
||
return
|
||
}
|
||
log.Printf("[%s] 请求参数绑定成功,用户ID: %s", reqID, req.UserID)
|
||
|
||
// 更新用户表中的deleted字段为true
|
||
updateQuery := `
|
||
UPDATE "user"
|
||
SET deleted = true
|
||
WHERE id = $1 AND deleted = false
|
||
`
|
||
log.Printf("[%s] 执行更新SQL: %s,参数: %s", reqID, updateQuery, req.UserID)
|
||
|
||
result, err := db.Exec(updateQuery, req.UserID)
|
||
if err != nil {
|
||
log.Printf("[%s] 执行更新操作失败: %v", reqID, err)
|
||
c.JSON(http.StatusInternalServerError, DeleteAccountResponse{
|
||
Success: false,
|
||
Message: "删除账号失败: " + err.Error(),
|
||
})
|
||
return
|
||
}
|
||
log.Printf("[%s] 更新操作执行完成", reqID)
|
||
|
||
// 检查是否有记录被更新
|
||
rowsAffected, err := result.RowsAffected()
|
||
if err != nil {
|
||
log.Printf("[%s] 获取影响行数失败: %v", reqID, err)
|
||
c.JSON(http.StatusInternalServerError, DeleteAccountResponse{
|
||
Success: false,
|
||
Message: "检查删除结果失败: " + err.Error(),
|
||
})
|
||
return
|
||
}
|
||
log.Printf("[%s] 更新操作影响行数: %d", reqID, rowsAffected)
|
||
|
||
if rowsAffected == 0 {
|
||
log.Printf("[%s] 未找到可删除的用户记录,用户ID: %s", reqID, req.UserID)
|
||
c.JSON(http.StatusOK, DeleteAccountResponse{
|
||
Success: false,
|
||
Message: "用户不存在或已被删除",
|
||
})
|
||
return
|
||
}
|
||
|
||
// 删除成功
|
||
log.Printf("[%s] 账号删除成功,用户ID: %s", reqID, req.UserID)
|
||
c.JSON(http.StatusOK, DeleteAccountResponse{
|
||
Success: true,
|
||
Message: "账号删除成功。",
|
||
})
|
||
} |