199 lines
5.2 KiB
Go
199 lines
5.2 KiB
Go
package web
|
|
|
|
import (
|
|
"net/http"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"git.iioio.com/freefire/jiang13-forum/modules/webctx"
|
|
"git.iioio.com/freefire/jiang13-forum/services"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
type adminPageRow struct {
|
|
ID uint
|
|
Title string
|
|
Slug string
|
|
Published bool
|
|
SortOrder int
|
|
ShowInNav bool
|
|
ShowInFooter bool
|
|
}
|
|
|
|
type adminPageForm struct {
|
|
ID uint
|
|
Title string
|
|
Slug string
|
|
Content string
|
|
Published bool
|
|
SortOrder int
|
|
ShowInNav bool
|
|
ShowInFooter bool
|
|
IsEdit bool
|
|
}
|
|
|
|
type adminPagesData struct {
|
|
AdminChrome
|
|
Pages []adminPageRow
|
|
Form adminPageForm
|
|
}
|
|
|
|
// AdminPagesGet 站点单页列表
|
|
func (d Deps) AdminPagesGet(c *gin.Context) {
|
|
ctx := d.ctx(c)
|
|
d.renderAdminPages(ctx, "", adminPageForm{})
|
|
}
|
|
|
|
func (d Deps) renderAdminPages(ctx *webctx.Context, errMsg string, form adminPageForm) {
|
|
chrome := d.adminChrome(ctx, "站点单页", "pages")
|
|
chrome.Error = errMsg
|
|
data := adminPagesData{AdminChrome: chrome, Form: form}
|
|
if d.SitePage != nil {
|
|
list, _ := d.SitePage.ListAll()
|
|
data.Pages = make([]adminPageRow, 0, len(list))
|
|
for _, p := range list {
|
|
data.Pages = append(data.Pages, adminPageRow{
|
|
ID: p.ID, Title: p.Title, Slug: p.Slug, Published: p.Published,
|
|
SortOrder: p.SortOrder, ShowInNav: p.ShowInNav, ShowInFooter: p.ShowInFooter,
|
|
})
|
|
}
|
|
}
|
|
ctx.HTML(http.StatusOK, "admin/pages", data)
|
|
}
|
|
|
|
// AdminPageCreate 新建单页
|
|
func (d Deps) AdminPageCreate(c *gin.Context) {
|
|
ctx := d.ctx(c)
|
|
form := adminPageFormFrom(c)
|
|
if !ctx.CheckCSRF() {
|
|
d.renderAdminPages(ctx, "无效请求,请重试", form)
|
|
return
|
|
}
|
|
if d.SitePage == nil {
|
|
d.renderAdminPages(ctx, "单页服务未就绪", form)
|
|
return
|
|
}
|
|
if _, err := d.SitePage.Create(adminPageInputFrom(form)); err != nil {
|
|
d.renderAdminPages(ctx, err.Error(), form)
|
|
return
|
|
}
|
|
ctx.SetFlash("单页已创建")
|
|
ctx.Redirect("/admin/pages")
|
|
}
|
|
|
|
// AdminPageEditGet 编辑表单
|
|
func (d Deps) AdminPageEditGet(c *gin.Context) {
|
|
ctx := d.ctx(c)
|
|
if d.SitePage == nil {
|
|
d.renderAdminPages(ctx, "单页服务未就绪", adminPageForm{})
|
|
return
|
|
}
|
|
id, _ := strconv.ParseUint(c.Param("id"), 10, 64)
|
|
page, err := d.SitePage.GetByID(uint(id))
|
|
if err != nil {
|
|
ctx.SetFlash(err.Error())
|
|
ctx.Redirect("/admin/pages")
|
|
return
|
|
}
|
|
d.renderAdminPages(ctx, "", adminPageForm{
|
|
ID: page.ID, Title: page.Title, Slug: page.Slug, Content: page.Content,
|
|
Published: page.Published, SortOrder: page.SortOrder,
|
|
ShowInNav: page.ShowInNav, ShowInFooter: page.ShowInFooter, IsEdit: true,
|
|
})
|
|
}
|
|
|
|
// AdminPageUpdate 更新单页
|
|
func (d Deps) AdminPageUpdate(c *gin.Context) {
|
|
ctx := d.ctx(c)
|
|
id, _ := strconv.ParseUint(c.Param("id"), 10, 64)
|
|
form := adminPageFormFrom(c)
|
|
form.ID = uint(id)
|
|
form.IsEdit = true
|
|
if !ctx.CheckCSRF() {
|
|
d.renderAdminPages(ctx, "无效请求,请重试", form)
|
|
return
|
|
}
|
|
if d.SitePage == nil {
|
|
d.renderAdminPages(ctx, "单页服务未就绪", form)
|
|
return
|
|
}
|
|
if err := d.SitePage.Update(uint(id), adminPageInputFrom(form)); err != nil {
|
|
d.renderAdminPages(ctx, err.Error(), form)
|
|
return
|
|
}
|
|
ctx.SetFlash("单页已保存")
|
|
ctx.Redirect("/admin/pages")
|
|
}
|
|
|
|
// AdminPageDelete 删除
|
|
func (d Deps) AdminPageDelete(c *gin.Context) {
|
|
ctx := d.ctx(c)
|
|
if !ctx.CheckCSRF() {
|
|
ctx.SetFlash("无效请求,请重试")
|
|
ctx.Redirect("/admin/pages")
|
|
return
|
|
}
|
|
if d.SitePage == nil {
|
|
ctx.SetFlash("单页服务未就绪")
|
|
ctx.Redirect("/admin/pages")
|
|
return
|
|
}
|
|
id, _ := strconv.ParseUint(c.Param("id"), 10, 64)
|
|
if err := d.SitePage.Delete(uint(id)); err != nil {
|
|
ctx.SetFlash(err.Error())
|
|
ctx.Redirect("/admin/pages")
|
|
return
|
|
}
|
|
ctx.SetFlash("单页已删除")
|
|
ctx.Redirect("/admin/pages")
|
|
}
|
|
|
|
// AdminPagePublishPost 快捷发布/下架
|
|
func (d Deps) AdminPagePublishPost(c *gin.Context) {
|
|
ctx := d.ctx(c)
|
|
if !ctx.CheckCSRF() {
|
|
ctx.SetFlash("无效请求,请重试")
|
|
ctx.Redirect("/admin/pages")
|
|
return
|
|
}
|
|
if d.SitePage == nil {
|
|
ctx.SetFlash("单页服务未就绪")
|
|
ctx.Redirect("/admin/pages")
|
|
return
|
|
}
|
|
id, _ := strconv.ParseUint(c.Param("id"), 10, 64)
|
|
published := c.PostForm("published") == "1" || c.PostForm("published") == "on"
|
|
if err := d.SitePage.SetPublished(uint(id), published); err != nil {
|
|
ctx.SetFlash(err.Error())
|
|
ctx.Redirect("/admin/pages")
|
|
return
|
|
}
|
|
if published {
|
|
ctx.SetFlash("已发布")
|
|
} else {
|
|
ctx.SetFlash("已下架")
|
|
}
|
|
ctx.Redirect("/admin/pages")
|
|
}
|
|
|
|
func adminPageFormFrom(c *gin.Context) adminPageForm {
|
|
sort, _ := strconv.Atoi(c.PostForm("sort_order"))
|
|
return adminPageForm{
|
|
Title: strings.TrimSpace(c.PostForm("title")),
|
|
Slug: strings.TrimSpace(c.PostForm("slug")),
|
|
Content: c.PostForm("content"),
|
|
Published: c.PostForm("published") == "1" || c.PostForm("published") == "on",
|
|
SortOrder: sort,
|
|
ShowInNav: c.PostForm("show_in_nav") == "1" || c.PostForm("show_in_nav") == "on",
|
|
ShowInFooter: c.PostForm("show_in_footer") == "1" || c.PostForm("show_in_footer") == "on",
|
|
}
|
|
}
|
|
|
|
func adminPageInputFrom(form adminPageForm) services.SitePageInput {
|
|
return services.SitePageInput{
|
|
Title: form.Title, Slug: form.Slug, Content: form.Content,
|
|
Published: form.Published, SortOrder: form.SortOrder,
|
|
ShowInNav: form.ShowInNav, ShowInFooter: form.ShowInFooter,
|
|
}
|
|
}
|