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}}
测试表单显示

保存分类
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,
}
.
.
.
}
编辑成功

关于 LearnKu
推荐文章: