完善主题创建/删除

This commit is contained in:
Shikong 2022-11-26 20:22:38 +08:00
parent 7392e4c26a
commit 5a74dae08a
9 changed files with 215 additions and 9 deletions

View File

@ -11,6 +11,7 @@ import (
"gofiber.study.skcks.cn/common/utils" "gofiber.study.skcks.cn/common/utils"
"gofiber.study.skcks.cn/controller" "gofiber.study.skcks.cn/controller"
"gofiber.study.skcks.cn/global" "gofiber.study.skcks.cn/global"
"gofiber.study.skcks.cn/middleware"
"gofiber.study.skcks.cn/services" "gofiber.study.skcks.cn/services"
) )
@ -32,6 +33,7 @@ func Run() {
reloadNanoId(global.Config) reloadNanoId(global.Config)
global.App = reloadApp(global.Config) global.App = reloadApp(global.Config)
middleware.NewCasbin(global.App, global.DataSources)
if err := global.App.Listen(global.Config.Server.Addr); err != nil { if err := global.App.Listen(global.Config.Server.Addr); err != nil {
logger.Log.Fatalf("[x] [Fiber] 致命错误: %s", err) logger.Log.Fatalf("[x] [Fiber] 致命错误: %s", err)

View File

@ -6,7 +6,6 @@ import (
"gofiber.study.skcks.cn/common/logger" "gofiber.study.skcks.cn/common/logger"
"gofiber.study.skcks.cn/common/utils" "gofiber.study.skcks.cn/common/utils"
"gofiber.study.skcks.cn/global" "gofiber.study.skcks.cn/global"
"gofiber.study.skcks.cn/middleware"
"xorm.io/xorm" "xorm.io/xorm"
) )
@ -29,6 +28,4 @@ func reloadDataSources(c *config.BasicConfig) {
if c.Mysql.AutoSync && !fiber.IsChild() { if c.Mysql.AutoSync && !fiber.IsChild() {
global.SyncModelToDataSource() global.SyncModelToDataSource()
} }
middleware.NewCasbin(global.DataSources)
} }

View File

@ -52,6 +52,38 @@ func (c *Controller) CreateTopical() {
return ctx.JSON(errorx.ParseError(err)) return ctx.JSON(errorx.ParseError(err))
} }
return ctx.JSON(response.NewResponse("")) return ctx.JSON(response.NewResponse("主题创建成功"))
})
}
// DeleteTopical 删除主题
//
// @Summary 删除主题
// @Description 删除主题
// @Tags Topical
// @Accept json
// @Produce json
// @Param vo query topical.DeleteTopicalDTO true "DeleteTopicalDTO"
// @Success 200 {object} response.Response{data=string}
// @Failure default {object} errorx.CodeErrorResponse
// @Router /topical/delete [delete]
// @Security Token
func (c *Controller) DeleteTopical() {
c.Router.Delete("/delete", func(ctx *fiber.Ctx) error {
var dto = &topical2.DeleteTopicalDTO{}
_ = ctx.QueryParser(dto)
err := global.ValidateStruct(dto)
if err != nil {
return ctx.JSON(errorx.ParseError(err))
}
err = topical.Services.DeleteTopical(*dto)
if err != nil {
return ctx.JSON(errorx.ParseError(err))
}
return ctx.JSON(response.NewResponse("主题删除成功"))
}) })
} }

View File

@ -865,6 +865,59 @@ const docTemplate = `{
} }
} }
}, },
"/topical/delete": {
"delete": {
"security": [
{
"Token": []
}
],
"description": "删除主题",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Topical"
],
"summary": "删除主题",
"parameters": [
{
"type": "string",
"name": "id",
"in": "query"
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.Response"
},
{
"type": "object",
"properties": {
"data": {
"type": "string"
}
}
}
]
}
},
"default": {
"description": "",
"schema": {
"$ref": "#/definitions/errorx.CodeErrorResponse"
}
}
}
}
},
"/user/account": { "/user/account": {
"get": { "get": {
"security": [ "security": [

View File

@ -857,6 +857,59 @@
} }
} }
}, },
"/topical/delete": {
"delete": {
"security": [
{
"Token": []
}
],
"description": "删除主题",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Topical"
],
"summary": "删除主题",
"parameters": [
{
"type": "string",
"name": "id",
"in": "query"
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"allOf": [
{
"$ref": "#/definitions/response.Response"
},
{
"type": "object",
"properties": {
"data": {
"type": "string"
}
}
}
]
}
},
"default": {
"description": "",
"schema": {
"$ref": "#/definitions/errorx.CodeErrorResponse"
}
}
}
}
},
"/user/account": { "/user/account": {
"get": { "get": {
"security": [ "security": [

View File

@ -654,6 +654,36 @@ paths:
summary: 创建主题 summary: 创建主题
tags: tags:
- Topical - Topical
/topical/delete:
delete:
consumes:
- application/json
description: 删除主题
parameters:
- in: query
name: id
type: string
produces:
- application/json
responses:
"200":
description: OK
schema:
allOf:
- $ref: '#/definitions/response.Response'
- properties:
data:
type: string
type: object
default:
description: ""
schema:
$ref: '#/definitions/errorx.CodeErrorResponse'
security:
- Token: []
summary: 删除主题
tags:
- Topical
/user/account: /user/account:
get: get:
consumes: consumes:

View File

@ -20,7 +20,7 @@ const (
CasBinSeparator = "::" CasBinSeparator = "::"
) )
func NewCasbin(engine *xorm.EngineGroup) { func NewCasbin(app *fiber.App, engine *xorm.EngineGroup) {
casbinModels := make([]models.CasbinModel, 0) casbinModels := make([]models.CasbinModel, 0)
err := engine.Find(&casbinModels) err := engine.Find(&casbinModels)
if err != nil { if err != nil {
@ -48,7 +48,7 @@ func NewCasbin(engine *xorm.EngineGroup) {
} }
// 初始化 role::root 组权限 // 初始化 role::root 组权限
initRootGroupPermission(e) initRootGroupPermission(app, e)
global.Enforcer = e global.Enforcer = e
@ -57,10 +57,15 @@ func NewCasbin(engine *xorm.EngineGroup) {
}) })
} }
func initRootGroupPermission(e *casbin.Enforcer) { func initRootGroupPermission(app *fiber.App, e *casbin.Enforcer) {
// 添加/修改 组策略 // 添加/修改 组策略
// role::root 组 继承 root 的权限 // role::root 组 继承 root 的权限
_, _ = e.AddGroupingPolicy("role::root", "user::root") _, _ = e.AddGroupingPolicy("role::root", "user::root")
for _, routes := range app.Stack() {
for _, route := range routes {
_, _ = e.AddPolicy("role::root", DefaultSystem, route.Path, route.Method)
}
}
} }
func CasbinMiddleWare(c *fiber.Ctx) error { func CasbinMiddleWare(c *fiber.Ctx) error {

View File

@ -1,6 +1,10 @@
package topical package topical
type CreateTopicalDTO struct { type CreateTopicalDTO struct {
Title string Title string `json:"title" validate:"required"`
Content string Content string `json:"content" validate:"required"`
}
type DeleteTopicalDTO struct {
Id string `json:"id" example:"123456" validate:"required"`
} }

View File

@ -1,7 +1,9 @@
package topical package topical
import ( import (
"errors"
"gofiber.study.skcks.cn/global" "gofiber.study.skcks.cn/global"
"gofiber.study.skcks.cn/logger"
"gofiber.study.skcks.cn/model/generic/models" "gofiber.study.skcks.cn/model/generic/models"
"gofiber.study.skcks.cn/model/topical" "gofiber.study.skcks.cn/model/topical"
"strconv" "strconv"
@ -16,6 +18,10 @@ func InitService() {
Services = &Service{} Services = &Service{}
} }
var (
NotExist = errors.New("主题不存在")
)
func (s *Service) CreateTopical(dto topical.CreateTopicalDTO, userId string) error { func (s *Service) CreateTopical(dto topical.CreateTopicalDTO, userId string) error {
id, _ := global.SonyFlake.NextID() id, _ := global.SonyFlake.NextID()
_, err := global.DataSources.Insert(&models.Topical{ _, err := global.DataSources.Insert(&models.Topical{
@ -33,3 +39,27 @@ func (s *Service) CreateTopical(dto topical.CreateTopicalDTO, userId string) err
return nil return nil
} }
func (s *Service) DeleteTopical(dto topical.DeleteTopicalDTO) error {
t := &models.Topical{
Id: dto.Id,
}
logger.Logger().Infof("%#v", t)
exist, err := global.DataSources.Get(t)
if err != nil {
return err
}
if !exist {
return NotExist
}
_, err = global.DataSources.Limit(1).Delete(t)
if err != nil {
return err
}
return nil
}