Bladeren bron

feat: 新增音乐管理模块(歌单/歌曲 CRUD)

- 新增 DtMusicGroup、DtMusic 数据模型
- 新增歌单分组、歌曲的路由和服务(Get/Find/Create/Update/Delete)
- 歌单删除时校验是否存在关联歌曲,防止误删
- 注册音乐模块到 router/enter.go 和 service/enter.go
urban 2 weken geleden
bovenliggende
commit
d068577e0a
6 gewijzigde bestanden met toevoegingen van 272 en 0 verwijderingen
  1. 2 0
      README.md
  2. 43 0
      model/biz_modules/daytask/dt_music.go
  3. 40 0
      router/daytask/dt_music.go
  4. 3 0
      router/daytask/enter.go
  5. 180 0
      service/daytask/dt_music.go
  6. 4 0
      service/daytask/enter.go

+ 2 - 0
README.md

@@ -55,3 +55,5 @@ task -l  # 列出所有可用的 task
 
 
 ```
+### 编译打包
+GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o day_task_admin -tags='!include'

+ 43 - 0
model/biz_modules/daytask/dt_music.go

@@ -0,0 +1,43 @@
+package daytask
+
+// DtMusicGroup 歌单分组表
+type DtMusicGroup struct {
+	Id        int64  `json:"id" gorm:"column:id;type:bigint;primarykey;comment:歌单ID"`
+	Name      string `json:"name" gorm:"column:name;type:varchar(64);not null;comment:歌单名称"`
+	Cover     string `json:"cover" gorm:"column:cover;type:varchar(255);comment:封面图"`
+	Sort      int    `json:"sort" gorm:"column:sort;type:int;default:0;comment:排序"`
+	Status    int8   `json:"status" gorm:"column:status;type:tinyint;default:1;comment:状态: 0=禁用 1=启用"`
+	CreatedAt int64  `json:"createdAt" gorm:"column:created_at;type:bigint;autoCreateTime;comment:创建时间"`
+	UpdatedAt int64  `json:"updatedAt" gorm:"column:updated_at;type:bigint;autoUpdateTime;comment:更新时间"`
+}
+
+func (*DtMusicGroup) TableName() string {
+	return "dt_music_group"
+}
+
+func NewDtMusicGroup() *DtMusicGroup {
+	return &DtMusicGroup{}
+}
+
+// DtMusic 歌曲表
+type DtMusic struct {
+	Id        int64  `json:"id" gorm:"column:id;type:bigint;primarykey;comment:歌曲ID"`
+	GroupId   int64  `json:"groupId" gorm:"column:group_id;type:bigint;index:idx_group_id;comment:歌单ID"`
+	Title     string `json:"title" gorm:"column:title;type:varchar(100);not null;comment:歌曲名称"`
+	Artist    string `json:"artist" gorm:"column:artist;type:varchar(100);comment:歌手"`
+	Url       string `json:"url" gorm:"column:url;type:varchar(500);not null;comment:音频文件地址"`
+	CoverUrl  string `json:"coverUrl" gorm:"column:cover_url;type:varchar(500);comment:封面图"`
+	Duration  int    `json:"duration" gorm:"column:duration;type:int;default:0;comment:时长(秒)"`
+	Sort      int    `json:"sort" gorm:"column:sort;type:int;default:0;comment:排序"`
+	Status    int8   `json:"status" gorm:"column:status;type:tinyint;default:1;comment:状态: 0=禁用 1=启用"`
+	CreatedAt int64  `json:"createdAt" gorm:"column:created_at;type:bigint;autoCreateTime;comment:创建时间"`
+	UpdatedAt int64  `json:"updatedAt" gorm:"column:updated_at;type:bigint;autoUpdateTime;comment:更新时间"`
+}
+
+func (*DtMusic) TableName() string {
+	return "dt_music"
+}
+
+func NewDtMusic() *DtMusic {
+	return &DtMusic{}
+}

+ 40 - 0
router/daytask/dt_music.go

@@ -0,0 +1,40 @@
+package daytask
+
+import (
+	"github.com/gin-gonic/gin"
+	"go_server/service"
+)
+
+// DtMusicGroupRouter 歌单分组路由
+type DtMusicGroupRouter struct{}
+
+func (DtMusicGroupRouter) Route() string {
+	return "/music_group"
+}
+
+var dtMusicGroupService = service.RealizationLayer.DaytaskServiceGroup.DtMusicGroupService
+
+func (h DtMusicGroupRouter) Register(group *gin.RouterGroup) {
+	group.GET("get", dtMusicGroupService.Get)
+	group.GET("find", dtMusicGroupService.Find)
+	group.POST("create", dtMusicGroupService.Create)
+	group.POST("update", dtMusicGroupService.Update)
+	group.POST("delete", dtMusicGroupService.Delete)
+}
+
+// DtMusicRouter 歌曲路由
+type DtMusicRouter struct{}
+
+func (DtMusicRouter) Route() string {
+	return "/music"
+}
+
+var dtMusicService = service.RealizationLayer.DaytaskServiceGroup.DtMusicService
+
+func (h DtMusicRouter) Register(group *gin.RouterGroup) {
+	group.GET("get", dtMusicService.Get)
+	group.GET("find", dtMusicService.Find)
+	group.POST("create", dtMusicService.Create)
+	group.POST("update", dtMusicService.Update)
+	group.POST("delete", dtMusicService.Delete)
+}

+ 3 - 0
router/daytask/enter.go

@@ -30,6 +30,9 @@ var (
 		// 素材模块
 		DtMaterialRouter{},
 		DtMaterialGroupRouter{},
+		// 音乐模块
+		DtMusicGroupRouter{},
+		DtMusicRouter{},
 		// 系统模块
 		DtAdminRouter{},
 		DtRoleRouter{},

+ 180 - 0
service/daytask/dt_music.go

@@ -0,0 +1,180 @@
+package daytask
+
+import (
+	model "go_server/model/biz_modules/daytask"
+	"go_server/model/common/response"
+	"go_server/service/base"
+
+	"github.com/gin-gonic/gin"
+)
+
+// DtMusicGroupService 歌单分组服务
+type DtMusicGroupService struct {
+	base.BizCommonService
+}
+
+func (s *DtMusicGroupService) Get(c *gin.Context) {
+	s.SetDbAlias("daytask")
+	base.NewBaseHandler(model.NewDtMusicGroup()).Get(c, s.DB())
+}
+
+func (s *DtMusicGroupService) Find(c *gin.Context) {
+	s.SetDbAlias("daytask")
+	type request[T any] struct {
+		base.ListRequest[T]
+		Id     *int64  `form:"id"`
+		Name   *string `form:"name"`
+		Status *int8   `form:"status"`
+	}
+	req := new(request[model.DtMusicGroup])
+	if err := c.BindQuery(req); err != nil {
+		response.Resp(c, err.Error())
+		return
+	}
+	db := s.DB()
+	if db == nil {
+		response.Resp(c, "数据库连接失败")
+		return
+	}
+	if req.Id != nil && *req.Id != 0 {
+		db = db.Where("id", req.Id)
+	}
+	if req.Name != nil && *req.Name != "" {
+		db = db.Where("name LIKE ?", "%"+*req.Name+"%")
+	}
+	if req.Status != nil {
+		db = db.Where("status", req.Status)
+	}
+	db = db.Order("sort ASC, id ASC")
+
+	colInfo := s.GetColumnCommentFromStruct(model.DtMusicGroup{})
+	resp, err := base.NewQueryBaseHandler(model.NewDtMusicGroup()).List(db, req)
+	if err != nil {
+		response.Resp(c, err.Error())
+		return
+	}
+	response.Resp(c, map[string]interface{}{
+		"cols":   colInfo,
+		"list":   resp.List,
+		"paging": resp.Paging,
+	})
+}
+
+func (s *DtMusicGroupService) Create(c *gin.Context) {
+	s.SetDbAlias("daytask")
+	base.NewBaseHandler(model.NewDtMusicGroup()).Create(c, s.DB())
+}
+
+func (s *DtMusicGroupService) Update(c *gin.Context) {
+	s.SetDbAlias("daytask")
+	base.NewBaseHandler(model.NewDtMusicGroup()).UpdateOne(c, s.DB())
+}
+
+func (s *DtMusicGroupService) Delete(c *gin.Context) {
+	s.SetDbAlias("daytask")
+	db := s.DB()
+	if db == nil {
+		response.Resp(c, "数据库连接失败")
+		return
+	}
+	var req base.BaseRequest
+	if err := c.ShouldBindJSON(&req); err != nil {
+		response.Resp(c, err.Error())
+		return
+	}
+	if req.Id == 0 {
+		response.Resp(c, "id is zero")
+		return
+	}
+	var count int64
+	db.Model(&model.DtMusic{}).Where("group_id = ?", req.Id).Count(&count)
+	if count > 0 {
+		response.Resp(c, "该歌单下还有歌曲,请先删除歌曲")
+		return
+	}
+	var group model.DtMusicGroup
+	if err := db.First(&group, req.Id).Error; err != nil {
+		response.Resp(c, err.Error())
+		return
+	}
+	if err := db.Delete(&group).Error; err != nil {
+		response.Resp(c, err.Error())
+		return
+	}
+	response.Resp(c, "删除成功")
+}
+
+// DtMusicService 歌曲服务
+type DtMusicService struct {
+	base.BizCommonService
+}
+
+func (s *DtMusicService) Get(c *gin.Context) {
+	s.SetDbAlias("daytask")
+	base.NewBaseHandler(model.NewDtMusic()).Get(c, s.DB())
+}
+
+func (s *DtMusicService) Find(c *gin.Context) {
+	s.SetDbAlias("daytask")
+	type request[T any] struct {
+		base.ListRequest[T]
+		Id      *int64  `form:"id"`
+		GroupId *int64  `form:"groupId"`
+		Title   *string `form:"title"`
+		Artist  *string `form:"artist"`
+		Status  *int8   `form:"status"`
+	}
+	req := new(request[model.DtMusic])
+	if err := c.BindQuery(req); err != nil {
+		response.Resp(c, err.Error())
+		return
+	}
+	db := s.DB()
+	if db == nil {
+		response.Resp(c, "数据库连接失败")
+		return
+	}
+	if req.Id != nil && *req.Id != 0 {
+		db = db.Where("id", req.Id)
+	}
+	if req.GroupId != nil && *req.GroupId != 0 {
+		db = db.Where("group_id", req.GroupId)
+	}
+	if req.Title != nil && *req.Title != "" {
+		db = db.Where("title LIKE ?", "%"+*req.Title+"%")
+	}
+	if req.Artist != nil && *req.Artist != "" {
+		db = db.Where("artist LIKE ?", "%"+*req.Artist+"%")
+	}
+	if req.Status != nil {
+		db = db.Where("status", req.Status)
+	}
+	db = db.Order("sort ASC, id ASC")
+
+	colInfo := s.GetColumnCommentFromStruct(model.DtMusic{})
+	resp, err := base.NewQueryBaseHandler(model.NewDtMusic()).List(db, req)
+	if err != nil {
+		response.Resp(c, err.Error())
+		return
+	}
+	response.Resp(c, map[string]interface{}{
+		"cols":   colInfo,
+		"list":   resp.List,
+		"paging": resp.Paging,
+	})
+}
+
+func (s *DtMusicService) Create(c *gin.Context) {
+	s.SetDbAlias("daytask")
+	base.NewBaseHandler(model.NewDtMusic()).Create(c, s.DB())
+}
+
+func (s *DtMusicService) Update(c *gin.Context) {
+	s.SetDbAlias("daytask")
+	base.NewBaseHandler(model.NewDtMusic()).UpdateOne(c, s.DB())
+}
+
+func (s *DtMusicService) Delete(c *gin.Context) {
+	s.SetDbAlias("daytask")
+	base.NewBaseHandler(model.NewDtMusic()).DeleteOne(c, s.DB())
+}

+ 4 - 0
service/daytask/enter.go

@@ -28,6 +28,10 @@ type ServiceGroup struct {
 	DtMaterialService
 	DtMaterialGroupService
 
+	// 音乐模块
+	DtMusicGroupService
+	DtMusicService
+
 	// 系统模块
 	DtAdminService
 	DtRoleService