第一版完成

This commit is contained in:
2025-07-29 12:45:07 +08:00
commit 7fd39fb409
83 changed files with 8717 additions and 0 deletions

View File

@@ -0,0 +1,70 @@
package controller
import (
"cms-api/internal/model"
"cms-api/internal/service"
"github.com/gogf/gf/v2/net/ghttp"
)
// 管理员控制器
type cAdmin struct{}
var Admin = &cAdmin{}
// Login 管理员登录
func (c *cAdmin) Login(r *ghttp.Request) {
var req *model.LoginRequest
if err := r.Parse(&req); err != nil {
r.Response.WriteJson(&model.Response{Code: 400, Message: "参数解析失败", Data: err.Error()})
return
}
// 调用管理员服务进行登录验证
adminService := service.Admin()
result, err := adminService.Login(r.Context(), req)
if err != nil {
r.Response.WriteJson(&model.Response{Code: 500, Message: "登录失败", Data: err.Error()})
return
}
r.Response.WriteJson(&model.Response{Code: 200, Message: "登录成功", Data: result})
}
// Logout 管理员登出
func (c *cAdmin) Logout(r *ghttp.Request) {
// 简单的登出处理清除token等
r.Response.WriteJson(&model.Response{Code: 200, Message: "登出成功"})
}
// Detail 获取管理员详情
func (c *cAdmin) Detail(r *ghttp.Request) {
// 调用管理员服务获取当前管理员信息
adminService := service.Admin()
result, err := adminService.Profile(r.Context())
if err != nil {
r.Response.WriteJson(&model.Response{Code: 500, Message: "获取管理员信息失败", Data: err.Error()})
return
}
r.Response.WriteJson(&model.Response{Code: 200, Message: "获取成功", Data: result})
}
// Update 更新管理员信息
func (c *cAdmin) Update(r *ghttp.Request) {
var req *model.UpdateAdminRequest
if err := r.Parse(&req); err != nil {
r.Response.WriteJson(&model.Response{Code: 400, Message: "参数解析失败", Data: err.Error()})
return
}
// 调用管理员服务更新信息
adminService := service.Admin()
err := adminService.UpdateProfile(r.Context(), req)
if err != nil {
r.Response.WriteJson(&model.Response{Code: 500, Message: "更新管理员信息失败", Data: err.Error()})
return
}
r.Response.WriteJson(&model.Response{Code: 200, Message: "更新成功"})
}

View File

@@ -0,0 +1,173 @@
package controller
import (
"cms-api/internal/model"
"cms-api/internal/service"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/util/gconv"
)
// 文章控制器
type cArticle struct{}
var Article = &cArticle{}
// List 获取文章列表(公开接口)
func (c *cArticle) List(r *ghttp.Request) {
var req *model.ArticleListRequest
if err := r.Parse(&req); err != nil {
r.Response.WriteJson(&model.Response{Code: 400, Message: "参数解析失败", Data: err.Error()})
return
}
// 调用文章服务获取列表
articleService := service.Article()
result, err := articleService.List(r.Context(), req)
if err != nil {
r.Response.WriteJson(&model.Response{Code: 500, Message: "获取文章列表失败", Data: err.Error()})
return
}
r.Response.WriteJson(&model.Response{Code: 200, Message: "获取成功", Data: result})
}
// AdminList 获取文章列表(管理后台)
func (c *cArticle) AdminList(r *ghttp.Request) {
var req *model.ArticleListRequest
if err := r.Parse(&req); err != nil {
r.Response.WriteJson(&model.Response{Code: 400, Message: "参数解析失败", Data: err.Error()})
return
}
// 调用文章服务获取管理后台列表
articleService := service.Article()
result, err := articleService.List(r.Context(), req)
if err != nil {
r.Response.WriteJson(&model.Response{Code: 500, Message: "获取文章列表失败", Data: err.Error()})
return
}
r.Response.WriteJson(&model.Response{Code: 200, Message: "获取成功", Data: result})
}
// Create 创建文章
func (c *cArticle) Create(r *ghttp.Request) {
var req *model.CreateArticleRequest
if err := r.Parse(&req); err != nil {
r.Response.WriteJson(&model.Response{Code: 400, Message: "参数解析失败", Data: err.Error()})
return
}
// 调用文章服务创建文章
articleService := service.Article()
err := articleService.Create(r.Context(), req)
if err != nil {
r.Response.WriteJson(&model.Response{Code: 500, Message: "创建文章失败", Data: err.Error()})
return
}
r.Response.WriteJson(&model.Response{Code: 200, Message: "创建文章成功"})
}
// Detail 获取文章详情(公开接口)
func (c *cArticle) Detail(r *ghttp.Request) {
id := gconv.Int(r.Get("id"))
slug := gconv.String(r.Get("slug"))
if id <= 0 && slug == "" {
r.Response.WriteJson(&model.Response{Code: 400, Message: "文章ID或别名无效"})
return
}
// 调用文章服务获取详情
articleService := service.Article()
var result *model.Article
var err error
if id > 0 {
result, err = articleService.GetById(r.Context(), id)
} else {
result, err = articleService.GetBySlug(r.Context(), slug)
}
if err != nil {
r.Response.WriteJson(&model.Response{Code: 500, Message: "获取文章详情失败", Data: err.Error()})
return
}
if result == nil {
r.Response.WriteJson(&model.Response{Code: 404, Message: "文章不存在"})
return
}
r.Response.WriteJson(&model.Response{Code: 200, Message: "获取成功", Data: result})
}
// AdminDetail 获取文章详情(管理后台)
func (c *cArticle) AdminDetail(r *ghttp.Request) {
id := gconv.Int(r.Get("id"))
if id <= 0 {
r.Response.WriteJson(&model.Response{Code: 400, Message: "文章ID无效"})
return
}
// 调用文章服务获取管理后台详情
articleService := service.Article()
result, err := articleService.GetById(r.Context(), id)
if err != nil {
r.Response.WriteJson(&model.Response{Code: 500, Message: "获取文章详情失败", Data: err.Error()})
return
}
if result == nil {
r.Response.WriteJson(&model.Response{Code: 404, Message: "文章不存在"})
return
}
r.Response.WriteJson(&model.Response{Code: 200, Message: "获取成功", Data: result})
}
// Update 更新文章
func (c *cArticle) Update(r *ghttp.Request) {
id := gconv.Int(r.Get("id"))
if id <= 0 {
r.Response.WriteJson(&model.Response{Code: 400, Message: "文章ID无效"})
return
}
var req *model.UpdateArticleRequest
if err := r.Parse(&req); err != nil {
r.Response.WriteJson(&model.Response{Code: 400, Message: "参数解析失败", Data: err.Error()})
return
}
// 调用文章服务更新文章
articleService := service.Article()
err := articleService.Update(r.Context(), id, req)
if err != nil {
r.Response.WriteJson(&model.Response{Code: 500, Message: "更新文章失败", Data: err.Error()})
return
}
r.Response.WriteJson(&model.Response{Code: 200, Message: "更新文章成功"})
}
// Delete 删除文章
func (c *cArticle) Delete(r *ghttp.Request) {
id := gconv.Int(r.Get("id"))
if id <= 0 {
r.Response.WriteJson(&model.Response{Code: 400, Message: "文章ID无效"})
return
}
// 调用文章服务删除文章
articleService := service.Article()
err := articleService.Delete(r.Context(), id)
if err != nil {
r.Response.WriteJson(&model.Response{Code: 500, Message: "删除文章失败", Data: err.Error()})
return
}
r.Response.WriteJson(&model.Response{Code: 200, Message: "删除文章成功"})
}

View File

@@ -0,0 +1,96 @@
package controller
import (
"cms-api/internal/model"
"cms-api/internal/service"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/util/gconv"
)
// 附件控制器
type cAttachment struct{}
var Attachment = &cAttachment{}
// List 获取附件列表
func (c *cAttachment) List(r *ghttp.Request) {
var req *model.AttachmentListRequest
if err := r.Parse(&req); err != nil {
r.Response.WriteJson(&model.Response{Code: 400, Message: "参数解析失败", Data: err.Error()})
return
}
// 调用附件服务获取列表
attachmentService := service.Attachment()
result, err := attachmentService.List(r.Context(), req)
if err != nil {
r.Response.WriteJson(&model.Response{Code: 500, Message: "获取附件列表失败", Data: err.Error()})
return
}
r.Response.WriteJson(&model.Response{Code: 200, Message: "获取成功", Data: result})
}
// Upload 上传附件
func (c *cAttachment) Upload(r *ghttp.Request) {
// 获取上传的文件
file := r.GetUploadFile("file")
if file == nil {
r.Response.WriteJson(&model.Response{Code: 400, Message: "请选择要上传的文件"})
return
}
// 调用附件服务处理上传
attachmentService := service.Attachment()
result, err := attachmentService.Upload(r.Context(), file, "uploads")
if err != nil {
r.Response.WriteJson(&model.Response{Code: 500, Message: "文件上传失败", Data: err.Error()})
return
}
r.Response.WriteJson(&model.Response{Code: 200, Message: "上传成功", Data: result})
}
// Delete 删除附件
func (c *cAttachment) Delete(r *ghttp.Request) {
id := gconv.Int(r.Get("id"))
if id <= 0 {
r.Response.WriteJson(&model.Response{Code: 400, Message: "附件ID无效"})
return
}
// 调用附件服务删除附件
attachmentService := service.Attachment()
err := attachmentService.Delete(r.Context(), id)
if err != nil {
r.Response.WriteJson(&model.Response{Code: 500, Message: "删除附件失败", Data: err.Error()})
return
}
r.Response.WriteJson(&model.Response{Code: 200, Message: "删除附件成功"})
}
// Detail 获取附件详情
func (c *cAttachment) Detail(r *ghttp.Request) {
id := gconv.Int(r.Get("id"))
if id <= 0 {
r.Response.WriteJson(&model.Response{Code: 400, Message: "附件ID无效"})
return
}
// 调用附件服务获取详情
attachmentService := service.Attachment()
result, err := attachmentService.GetById(r.Context(), id)
if err != nil {
r.Response.WriteJson(&model.Response{Code: 500, Message: "获取附件详情失败", Data: err.Error()})
return
}
if result == nil {
r.Response.WriteJson(&model.Response{Code: 404, Message: "附件不存在"})
return
}
r.Response.WriteJson(&model.Response{Code: 200, Message: "获取成功", Data: result})
}

View File

@@ -0,0 +1,71 @@
package controller
import (
"cms-api/internal/model"
"cms-api/internal/service"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/util/gconv"
)
// 网站配置控制器
type cConfig struct{}
var Config = &cConfig{}
// List 获取配置列表
func (c *cConfig) List(r *ghttp.Request) {
var req *model.ConfigListRequest
if err := r.Parse(&req); err != nil {
r.Response.WriteJson(&model.Response{Code: 400, Message: "参数解析失败", Data: err.Error()})
return
}
// 调用配置服务获取列表
configService := service.Config()
result, err := configService.List(r.Context(), req)
if err != nil {
r.Response.WriteJson(&model.Response{Code: 500, Message: "获取配置列表失败", Data: err.Error()})
return
}
r.Response.WriteJson(&model.Response{Code: 200, Message: "获取成功", Data: result})
}
// Update 更新配置
func (c *cConfig) Update(r *ghttp.Request) {
id := gconv.Int(r.Get("id"))
if id <= 0 {
r.Response.WriteJson(&model.Response{Code: 400, Message: "配置ID无效"})
return
}
var req *model.UpdateConfigRequest
if err := r.Parse(&req); err != nil {
r.Response.WriteJson(&model.Response{Code: 400, Message: "参数解析失败", Data: err.Error()})
return
}
// 调用配置服务更新配置
configService := service.Config()
err := configService.Update(r.Context(), gconv.String(id), req)
if err != nil {
r.Response.WriteJson(&model.Response{Code: 500, Message: "更新配置失败", Data: err.Error()})
return
}
r.Response.WriteJson(&model.Response{Code: 200, Message: "更新配置成功"})
}
// Public 获取公开配置
func (c *cConfig) Public(r *ghttp.Request) {
// 调用配置服务获取公开配置
configService := service.Config()
result, err := configService.GetPublicConfigs(r.Context())
if err != nil {
r.Response.WriteJson(&model.Response{Code: 500, Message: "获取公开配置失败", Data: err.Error()})
return
}
r.Response.WriteJson(&model.Response{Code: 200, Message: "获取成功", Data: result})
}

159
internal/controller/news.go Normal file
View File

@@ -0,0 +1,159 @@
package controller
import (
"cms-api/internal/model"
"cms-api/internal/service"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/util/gconv"
)
// 新闻控制器
type cNews struct{}
var News = &cNews{}
// List 获取新闻列表(公开接口)
func (c *cNews) List(r *ghttp.Request) {
var req *model.NewsListRequest
if err := r.Parse(&req); err != nil {
r.Response.WriteJson(&model.Response{Code: 400, Message: "参数解析失败", Data: err.Error()})
return
}
// 调用新闻服务获取列表
newsService := service.News()
result, err := newsService.List(r.Context(), req)
if err != nil {
r.Response.WriteJson(&model.Response{Code: 500, Message: "获取新闻列表失败", Data: err.Error()})
return
}
r.Response.WriteJson(&model.Response{Code: 200, Message: "获取成功", Data: result})
}
// AdminList 获取新闻列表(管理后台)
func (c *cNews) AdminList(r *ghttp.Request) {
var req *model.NewsListRequest
if err := r.Parse(&req); err != nil {
r.Response.WriteJson(&model.Response{Code: 400, Message: "参数解析失败", Data: err.Error()})
return
}
// 调用新闻服务获取列表(暂时使用相同方法)
newsService := service.News()
result, err := newsService.List(r.Context(), req)
if err != nil {
r.Response.WriteJson(&model.Response{Code: 500, Message: "获取新闻列表失败", Data: err.Error()})
return
}
r.Response.WriteJson(&model.Response{Code: 200, Message: "获取成功", Data: result})
}
// Create 创建新闻
func (c *cNews) Create(r *ghttp.Request) {
r.Response.WriteJson(&model.Response{Code: 200, Message: "功能开发中"})
}
// Detail 获取新闻详情(公开接口)
func (c *cNews) Detail(r *ghttp.Request) {
id := gconv.Int(r.Get("id"))
slug := gconv.String(r.Get("slug"))
if id <= 0 && slug == "" {
r.Response.WriteJson(&model.Response{Code: 400, Message: "新闻ID或别名无效"})
return
}
// 调用新闻服务获取详情
newsService := service.News()
var result *model.News
var err error
if id > 0 {
result, err = newsService.GetById(r.Context(), id)
} else {
result, err = newsService.GetBySlug(r.Context(), slug)
}
if err != nil {
r.Response.WriteJson(&model.Response{Code: 500, Message: "获取新闻详情失败", Data: err.Error()})
return
}
if result == nil {
r.Response.WriteJson(&model.Response{Code: 404, Message: "新闻不存在"})
return
}
r.Response.WriteJson(&model.Response{Code: 200, Message: "获取成功", Data: result})
}
// AdminDetail 获取新闻详情(管理后台)
func (c *cNews) AdminDetail(r *ghttp.Request) {
id := gconv.Int(r.Get("id"))
if id <= 0 {
r.Response.WriteJson(&model.Response{Code: 400, Message: "新闻ID无效"})
return
}
// 调用新闻服务获取管理后台详情
newsService := service.News()
result, err := newsService.GetById(r.Context(), id)
if err != nil {
r.Response.WriteJson(&model.Response{Code: 500, Message: "获取新闻详情失败", Data: err.Error()})
return
}
if result == nil {
r.Response.WriteJson(&model.Response{Code: 404, Message: "新闻不存在"})
return
}
r.Response.WriteJson(&model.Response{Code: 200, Message: "获取成功", Data: result})
}
// Update 更新新闻
func (c *cNews) Update(r *ghttp.Request) {
id := gconv.Int(r.Get("id"))
if id <= 0 {
r.Response.WriteJson(&model.Response{Code: 400, Message: "新闻ID无效"})
return
}
var req *model.UpdateNewsRequest
if err := r.Parse(&req); err != nil {
r.Response.WriteJson(&model.Response{Code: 400, Message: "参数解析失败", Data: err.Error()})
return
}
// 调用新闻服务更新新闻
newsService := service.News()
err := newsService.Update(r.Context(), id, req)
if err != nil {
r.Response.WriteJson(&model.Response{Code: 500, Message: "更新新闻失败", Data: err.Error()})
return
}
r.Response.WriteJson(&model.Response{Code: 200, Message: "更新新闻成功"})
}
// Delete 删除新闻
func (c *cNews) Delete(r *ghttp.Request) {
id := gconv.Int(r.Get("id"))
if id <= 0 {
r.Response.WriteJson(&model.Response{Code: 400, Message: "新闻ID无效"})
return
}
// 调用新闻服务删除新闻
newsService := service.News()
err := newsService.Delete(r.Context(), id)
if err != nil {
r.Response.WriteJson(&model.Response{Code: 500, Message: "删除新闻失败", Data: err.Error()})
return
}
r.Response.WriteJson(&model.Response{Code: 200, Message: "删除新闻成功"})
}

View File

@@ -0,0 +1,106 @@
package controller
import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
)
// RegisterRoutes 注册所有路由
func RegisterRoutes(s *ghttp.Server) {
// API v1 路由组
v1 := s.Group("/api/v1")
// 公开API路由 - 不需要认证
public := v1.Group("/public")
{
// 网站配置
public.GET("/configs", Config.Public)
// 文章相关
articles := public.Group("/articles")
{
articles.GET("/", Article.List)
articles.GET("/{id}", Article.Detail)
}
// 新闻相关
news := public.Group("/news")
{
news.GET("/", News.List)
news.GET("/{id}", News.Detail)
}
}
// 用户API路由
user := v1.Group("/user")
{
user.POST("/login", User.Login)
user.POST("/register", User.Create)
user.GET("/profile", User.Detail)
user.PUT("/profile", User.Update)
}
// 管理员API路由
admin := v1.Group("/admin")
{
// 管理员认证
admin.POST("/login", Admin.Login)
admin.POST("/logout", Admin.Logout)
admin.GET("/profile", Admin.Detail)
admin.PUT("/profile", Admin.Update)
// 用户管理
users := admin.Group("/users")
{
users.GET("/", User.List)
users.POST("/", User.Create)
users.GET("/{id}", User.Detail)
users.PUT("/{id}", User.Update)
users.DELETE("/{id}", User.Delete)
}
// 文章管理
articles := admin.Group("/articles")
{
articles.GET("/", Article.List)
articles.POST("/", Article.Create)
articles.GET("/{id}", Article.Detail)
articles.PUT("/{id}", Article.Update)
articles.DELETE("/{id}", Article.Delete)
}
// 新闻管理
news := admin.Group("/news")
{
news.GET("/", News.List)
news.POST("/", News.Create)
news.GET("/{id}", News.Detail)
news.PUT("/{id}", News.Update)
news.DELETE("/{id}", News.Delete)
}
// 附件管理
attachments := admin.Group("/attachments")
{
attachments.GET("/", Attachment.List)
attachments.POST("/upload", Attachment.Upload)
attachments.GET("/{id}", Attachment.Detail)
attachments.DELETE("/{id}", Attachment.Delete)
}
// 系统配置管理
configs := admin.Group("/configs")
{
configs.GET("/", Config.List)
configs.PUT("/{id}", Config.Update)
}
}
// 健康检查
s.BindHandler("/health", func(r *ghttp.Request) {
r.Response.WriteJson(g.Map{
"status": "ok",
"message": "CMS API服务运行正常",
})
})
}

139
internal/controller/user.go Normal file
View File

@@ -0,0 +1,139 @@
package controller
import (
"cms-api/internal/model"
"cms-api/internal/service"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/util/gconv"
)
// 用户控制器
type cUser struct{}
var User = &cUser{}
// List 获取用户列表
func (c *cUser) List(r *ghttp.Request) {
var req *model.UserListRequest
if err := r.Parse(&req); err != nil {
r.Response.WriteJson(&model.Response{Code: 400, Message: "参数解析失败", Data: err.Error()})
return
}
// 调用用户服务获取列表
userService := service.User()
result, err := userService.List(r.Context(), req)
if err != nil {
r.Response.WriteJson(&model.Response{Code: 500, Message: "获取用户列表失败", Data: err.Error()})
return
}
r.Response.WriteJson(&model.Response{Code: 200, Message: "获取成功", Data: result})
}
// Create 创建用户
func (c *cUser) Create(r *ghttp.Request) {
var req *model.CreateUserRequest
if err := r.Parse(&req); err != nil {
r.Response.WriteJson(&model.Response{Code: 400, Message: "参数解析失败", Data: err.Error()})
return
}
// 调用用户服务创建用户
userService := service.User()
err := userService.Create(r.Context(), req)
if err != nil {
r.Response.WriteJson(&model.Response{Code: 500, Message: "创建用户失败", Data: err.Error()})
return
}
r.Response.WriteJson(&model.Response{Code: 200, Message: "创建用户成功"})
}
// Detail 获取用户详情
func (c *cUser) Detail(r *ghttp.Request) {
id := gconv.Int(r.Get("id"))
if id <= 0 {
r.Response.WriteJson(&model.Response{Code: 400, Message: "用户ID无效"})
return
}
// 调用用户服务获取详情
userService := service.User()
result, err := userService.GetById(r.Context(), id)
if err != nil {
r.Response.WriteJson(&model.Response{Code: 500, Message: "获取用户详情失败", Data: err.Error()})
return
}
if result == nil {
r.Response.WriteJson(&model.Response{Code: 404, Message: "用户不存在"})
return
}
r.Response.WriteJson(&model.Response{Code: 200, Message: "获取成功", Data: result})
}
// Update 更新用户
func (c *cUser) Update(r *ghttp.Request) {
id := gconv.Int(r.Get("id"))
if id <= 0 {
r.Response.WriteJson(&model.Response{Code: 400, Message: "用户ID无效"})
return
}
var req *model.UpdateUserRequest
if err := r.Parse(&req); err != nil {
r.Response.WriteJson(&model.Response{Code: 400, Message: "参数解析失败", Data: err.Error()})
return
}
// 调用用户服务更新用户
userService := service.User()
err := userService.Update(r.Context(), id, req)
if err != nil {
r.Response.WriteJson(&model.Response{Code: 500, Message: "更新用户失败", Data: err.Error()})
return
}
r.Response.WriteJson(&model.Response{Code: 200, Message: "更新用户成功"})
}
// Delete 删除用户
func (c *cUser) Delete(r *ghttp.Request) {
id := gconv.Int(r.Get("id"))
if id <= 0 {
r.Response.WriteJson(&model.Response{Code: 400, Message: "用户ID无效"})
return
}
// 调用用户服务删除用户
userService := service.User()
err := userService.Delete(r.Context(), id)
if err != nil {
r.Response.WriteJson(&model.Response{Code: 500, Message: "删除用户失败", Data: err.Error()})
return
}
r.Response.WriteJson(&model.Response{Code: 200, Message: "删除用户成功"})
}
// Login 用户登录
func (c *cUser) Login(r *ghttp.Request) {
var req *model.UserLoginRequest
if err := r.Parse(&req); err != nil {
r.Response.WriteJson(&model.Response{Code: 400, Message: "参数解析失败", Data: err.Error()})
return
}
// 调用用户服务进行登录验证
userService := service.User()
result, err := userService.Login(r.Context(), req)
if err != nil {
r.Response.WriteJson(&model.Response{Code: 500, Message: "登录失败", Data: err.Error()})
return
}
r.Response.WriteJson(&model.Response{Code: 200, Message: "登录成功", Data: result})
}