13.5总结和任务 之任务二(分类编辑功能j及授权策略)

注册路由

routes/web.go

.
.
.

// RegisterWebRoutes 注册网页相关路由
func RegisterWebRoutes(r *mux.Router) {
    .
    .
    .
    r.HandleFunc("/articles/{id:[0-9]+}/delete", middlewares.Auth(ac.Delete)).Methods("POST").Name("articles.delete")

    // 文章分类
    cc := new(controllers.CategoriesController)
  .
  .
  .
    r.HandleFunc("/categories/{id:[0-9]+}/edit", middlewares.Auth(cc.Edit)).Methods("GET").Name("categories.edit")
    r.HandleFunc("/categories/{id:[0-9]+}", middlewares.Auth(cc.Update)).Methods("POST").Name("categories.update")
    .
    .
    .
}

控制器CategoriesController里增加edit

app/http/controllers/categories_controller.go

package controllers

import (
    "fmt"
    "net/http"

    "/goblog/app/models/article"
    "/goblog/app/models/category"
    "/goblog/app/policies"
    "/goblog/app/requests"
    "/goblog/pkg/auth"
    "/goblog/pkg/flash"
    "/goblog/pkg/logger"
    "/goblog/pkg/route"
    "/goblog/pkg/view"
)

type CategoriesController struct {
    BaseController
}
.
.
.
func (cc *CategoriesController) Edit(w http.ResponseWriter, r *http.Request) {
    id := route.GetRouteVariable("id", r)
    _category, err := category.Get(id)
    if err != nil {
        cc.ResponseForSQLError(w, err)
    } else {

        if !policies.CanModifyCategory(_category) {
            cc.ResponseForUnauthorized(w, r)
        } else {
            // 4. 读取成功,显示编辑文章表单
            view.Render(w, view.D{
                "Category": _category,
                "Errors":   view.D{},
            }, "categories.edit")
        }
    }
}

创建表单
resources/views/categories/edit.gohtml

{{define "title"}}
编辑文章分类
{{end}}

{{define "main"}}
<div class="col-md-9 blog-main">
  <div class="blog-post bg-white p-5 rounded shadow mb-4">

    <h3>编辑文章分类</h3>

    <form action="{{ RouteName2URL "categories.update" "id" .Category.GetStringID}}" method="post">

      <div class="form-group mt-3">
        <label for="title">分类名称</label>
        <input type="text" class="form-control {{if .Errors.name }}is-invalid {{end}}" name="name" value="{{ .Category.Name }}" required>
        {{ with .Errors.name }}
          <div class="invalid-feedback">
            {{ . }}
          </div>
        {{ end }}
      </div>

      <button type="submit" class="btn btn-primary mt-3">提交</button>

    </form>

  </div><!-- /.blog-post -->
</div>

{{end}}

测试表单显示

13.5总结和任务 之任务二(分类编辑功能)

保存分类

app/http/controllers/categories_controller.go

package controllers

import (
    "fmt"
    "net/http"

    "/goblog/app/models/article"
    "/goblog/app/models/category"
    "/goblog/app/policies"
    "/goblog/app/requests"
    "/goblog/pkg/auth"
    "/goblog/pkg/flash"
    "/goblog/pkg/logger"
    "/goblog/pkg/route"
    "/goblog/pkg/view"
)

type CategoriesController struct {
    BaseController
}
.
.
.

func (cc *CategoriesController) Update(w http.ResponseWriter, r *http.Request) {
    id := route.GetRouteVariable("id", r)
    _category, err := category.Get(id)

    if err != nil {
        cc.ResponseForSQLError(w, err)
    } else {
        _category.Name = r.PostFormValue("name")
        errors := requests.ValidateCategoryForm(_category)
        if !policies.CanModifyCategory(_category) {
            cc.ResponseForUnauthorized(w, r)
        } else {
            if len(errors) == 0 {
                rowsAffected, err := _category.Update()

                if err != nil {
                    logger.LogError(err)
                    w.WriteHeader(http.StatusInternalServerError)
                    fmt.Fprint(w, "500服务器内部错误")
                }
                // √ 更新成功,跳转到文章详情页
                if rowsAffected > 0 {
                    flash.Success("分类更新成功")
                    showURL := route.Name2URL("articles.index")
                    http.Redirect(w, r, showURL, http.StatusFound)
                } else {
                    fmt.Fprint(w, "您没有做任何更改!")
                }
            } else {
                view.Render(w, view.D{
                    "Category": _category,
                    "Errors":   errors,
                }, "categories.edit")
            }
        }
    }
}

分类模型里增加字段

app/models/category/category.go

package category

import (
    "/goblog/app/models/user"

    "/goblog/app/models"
    "/goblog/pkg/model"
    "/goblog/pkg/route"
    "/goblog/pkg/types"
)

// Category 文章分类
type Category struct {
    models.BaseModel

    Name   string `gorm:"type:varchar(255);not null;" valid:"name"`
    UserID uint64 `gorm:"not null;index"`
    User   user.User
}

接下来是分类更新方法:

app/models/category/crud.go

package category

import (
    "6/goblog/pkg/logger"
    "/goblog/pkg/model"
)

.
.
.

// Update 更新分类
func (category *Category) Update() (rowsAffected int64, err error) {
    result := model.DB.Save(&category)
    if err = result.Error; err != nil {
        logger.LogError(err)
        return 0, err
    }

    return result.RowsAffected, nil
}
.
.
.

授权策略

只有授权用户才能编辑分类
以下是文章分类的权限判断:

app/policies/topic_policy.go

package policies

import (
    "/goblog/app/models/article"
    "/goblog/app/models/category"
    "/goblog/pkg/auth"
)

.
.
.
func CanModifyCategory(_category category.Category) bool {
    return auth.User().ID == _category.UserID
}

在用户添加分类关联用户ID

// Store 保存文章分类
func (*CategoriesController) Store(w http.ResponseWriter, r *http.Request) {

    // 1. 初始化数据
    currentUser := auth.User()
    _category := category.Category{
        Name:   r.PostFormValue("name"),
        UserID: currentUser.ID,
    }
    .
    .
    .
}

编辑成功

13.5总结和任务 之任务二(分类编辑功能)

于江
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!