feat: 实现后端业务逻辑和Inertia.js管理后台

- 实现数据库连接和自动迁移
- 实现用户服务(登录、资料、JWT认证)
- 实现许愿服务(创建、列表、机器人许愿)
- 实现订单服务(创建、支付、状态管理)
- 实现JWT认证中间件
- 实现管理后台API(仪表盘、用户、订单、许愿、设置)
- 创建Inertia.js前端页面(Vue3 + Tailwind CSS)
- 修复Go模块依赖问题
This commit is contained in:
gouki
2026-08-06 13:11:59 +00:00
parent 11bfc15141
commit 48255faa5b
19 changed files with 1627 additions and 85 deletions
+25 -19
View File
@@ -2,25 +2,28 @@ package main
import (
"log"
"os"
"github.com/gin-gonic/gin"
"github.com/joho/godotenv"
"github.com/gouki/lunar-server/internal/config"
"github.com/gouki/lunar-server/internal/handler"
"github.com/gouki/lunar-server/internal/middleware"
"github.com/gouki/lunar-server/internal/service"
)
func main() {
// 加载环境变量
if err := godotenv.Load("../.env.local"); err != nil {
log.Println("No .env.local file found, using system environment")
}
// 初始化配置
// 加载配置
cfg := config.Load()
// 设置 Gin 模式
// 初始化数据库
if err := config.InitDB(cfg); err != nil {
log.Fatalf("Failed to initialize database: %v", err)
}
// 启动机器人许愿定时任务
wishService := service.NewWishService()
wishService.StartRobotWishJob()
// 设置运行模式
if cfg.Server.Env == "production" {
gin.SetMode(gin.ReleaseMode)
}
@@ -32,9 +35,9 @@ func main() {
r.Use(middleware.CORS())
r.Use(middleware.Logger())
// 静态文件Inertia.js 前端构建产物)
r.Static("/build", "./web/public/build")
r.LoadHTMLGlob("web/*.html")
// 静态文件
r.Static("/static", "./web/static")
r.StaticFile("/", "./web/index.html")
// API 路由
api := r.Group("/api")
@@ -54,31 +57,34 @@ func main() {
{
pay.POST("/create", middleware.Auth(), handler.CreateOrder)
pay.POST("/notify", handler.PayNotify)
pay.GET("/status/:orderId", middleware.Auth(), handler.GetPayStatus)
pay.GET("/status/:orderId", handler.GetPayStatus)
}
// 订单管理
// 订单相关
order := api.Group("/order")
{
order.GET("/list", middleware.Auth(), handler.GetOrderList)
order.GET("/detail/:id", middleware.Auth(), handler.GetOrderDetail)
order.GET("/:id", middleware.Auth(), handler.GetOrderDetail)
order.POST("/cancel/:id", middleware.Auth(), handler.CancelOrder)
}
// 许愿
// 许愿相关
wish := api.Group("/wish")
{
wish.GET("/tree", handler.GetWishTree)
wish.POST("/create", middleware.Auth(), handler.CreateWish)
wish.GET("/list", handler.GetWishList)
wish.GET("/:id", handler.GetWishDetail)
wish.DELETE("/:id", middleware.Auth(), handler.DeleteWish)
wish.GET("/products", handler.GetWishProducts)
}
}
// 管理后台(Inertia.js
// 管理后台路由Inertia.js
admin := r.Group("/admin")
admin.Use(middleware.AdminAuth())
{
admin.GET("/", handler.AdminIndex)
admin.GET("/", handler.AdminDashboard)
admin.GET("/users", handler.AdminUsers)
admin.GET("/orders", handler.AdminOrders)
admin.GET("/wishes", handler.AdminWishes)
@@ -89,6 +95,6 @@ func main() {
addr := ":" + cfg.Server.Port
log.Printf("Server starting on %s", addr)
if err := r.Run(addr); err != nil {
log.Fatal("Failed to start server:", err)
log.Fatalf("Failed to start server: %v", err)
}
}