package controllers
import (
"fmt"
"goblog/app/models/article"
"goblog/app/policies"
"goblog/app/requests"
"goblog/pkg/auth"
"goblog/pkg/route"
"goblog/pkg/view"
"net/http"
)
// ArticlesController 处理静态页面
type ArticlesController struct {
BaseController
}
// Show 文章详情页面
func (ac *ArticlesController) Show(w http.ResponseWriter, r *http.Request) {
// 1. 获取 URL 参数
id := route.GetRouteVariable("id", r)
// 2. 读取对应的文章数据
article, err := article.Get(id)
// 3. 如果出现错误
if err != nil {
ac.ResposeForSQLError(w, err)
} else {
// --- 4. 读取成功,显示文章 ---
view.Render(w, view.D{
"Article": article,
"CanModifyArticle": policies.CanModifyArticle(article),
}, "articles.show", "articles._article_meta")
}
}
// Index 文章列表页
func (ac *ArticlesController) Index(w http.ResponseWriter, r *http.Request) {
// 1. 获取结果集
articles, pagerData, err := article.GetAll(r, 2)
if err != nil {
ac.ResposeForSQLError(w, err)
} else {
// --- 2. 加载模板 ---
view.Render(w, view.D{
"Articles": articles,
"PagerData": pagerData,
}, "articles.index", "articles._article_meta")
}
}
// Create 文章创建页面
func (*ArticlesController) Create(w http.ResponseWriter, r *http.Request) {
view.Render(w, view.D{}, "articles.create", "articles._form_field")
}
// Store 文章创建页面
func (*ArticlesController) Store(w http.ResponseWriter, r *http.Request) {
// 1. 初始化数据
currentUser := auth.User()
_article := article.Article{
Title: r.PostFormValue("title"),
Body: r.PostFormValue("body"),
UserID: currentUser.ID,
}
// 2. 表单验证
errors := requests.ValidateArticleForm(_article)
// 3. 检测错误
if len(errors) == 0 {
// 创建文章
_article.Create()
if _article.ID > 0 {
indexURL := route.Name2URL("articles.show", "id", _article.GetStringID())
http.Redirect(w, r, indexURL, http.StatusFound)
} else {
w.WriteHeader(http.StatusInternalServerError)
fmt.Fprint(w, "创建文章失败,请联系管理员")
}
} else {
view.Render(w, view.D{
"Article": _article,
"Errors": errors,
}, "articles.create", "articles._form_field")
}
}
// Edit 文章更新页面
func (ac *ArticlesController) Edit(w http.ResponseWriter, r *http.Request) {
// 1. 获取 URL 参数
id := route.GetRouteVariable("id", r)
// 2. 读取对应的文章数据
_article, err := article.Get(id)
// 3. 如果出现错误
if err != nil {
ac.ResposeForSQLError(w, err)
} else {
// 检查权限
if !policies.CanModifyArticle(_article) {
ac.ResposeForUnauthorized(w, r)
} else {
// 4. 读取成功,显示编辑文章表单
view.Render(w, view.D{
"Article": _article,
"Errors": view.D{},
}, "articles.edit", "articles._form_field")
}
}
}
// Update 更新文章
func (ac *ArticlesController) Update(w http.ResponseWriter, r *http.Request) {
// 1. 获取 URL 参数
id := route.GetRouteVariable("id", r)
// 2. 读取对应的文章数据
_article, err := article.Get(id)
// 3. 如果出现错误
if err != nil {
ac.ResposeForSQLError(w, err)
} else {
// 4. 未出现错误
// 检查权限
if !policies.CanModifyArticle(_article) {
ac.ResposeForUnauthorized(w, r)
} else {
// 4.1 表单验证
_article.Title = r.PostFormValue("title")
_article.Body = r.PostFormValue("body")
errors := requests.ValidateArticleForm(_article)
if len(errors) == 0 {
// 4.2 表单验证通过,更新数据
rowsAffected, err := _article.Update()
if err != nil {
// 数据库错误
w.WriteHeader(http.StatusInternalServerError)
fmt.Fprint(w, "500 服务器内部错误")
return
}
// √ 更新成功,跳转到文章详情页
if rowsAffected > 0 {
showURL := route.Name2URL("articles.show", "id", id)
http.Redirect(w, r, showURL, http.StatusFound)
} else {
fmt.Fprint(w, "您没有做任何更改!")
}
} else {
// 4.3 表单验证不通过,显示理由
view.Render(w, view.D{
"Article": _article,
"Errors": errors,
}, "articles.edit", "articles._form_field")
}
}
}
}
// Delete 删除文章
func (ac *ArticlesController) Delete(w http.ResponseWriter, r *http.Request) {
// 1. 获取 URL 参数
id := route.GetRouteVariable("id", r)
// 2. 读取对应的文章数据
_article, err := article.Get(id)
// 3. 如果出现错误
if err != nil {
ac.ResposeForSQLError(w, err)
} else {
// 检查权限
if !policies.CanModifyArticle(_article) {
ac.ResposeForUnauthorized(w, r)
} else {
// 4. 未出现错误,执行删除操作
rowsAffected, err := _article.Delete()
// 4.1 发生错误
if err != nil {
// 应该是 SQL 报错了
w.WriteHeader(http.StatusInternalServerError)
fmt.Fprint(w, "500 服务器内部错误")
} else {
// 4.2 未发生错误
if rowsAffected > 0 {
// 重定向到文章列表页
indexURL := route.Name2URL("articles.index")
http.Redirect(w, r, indexURL, http.StatusFound)
} else {
// Edge case
w.WriteHeader(http.StatusNotFound)
fmt.Fprint(w, "404 文章未找到")
}
}
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
Goblog 是一个基于 Go 标准库构建的博客系统。此项目非常适合作为 Go 新手的第一个上手项目。.zip
共72个文件
go:47个
gohtml:15个
css:2个
需积分: 5 0 下载量 85 浏览量
2024-05-23
17:16:36
上传
评论
收藏 91KB ZIP 举报
温馨提示
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
资源推荐
资源详情
资源评论
收起资源包目录
Goblog 是一个基于 Go 标准库构建的博客系统。此项目非常适合作为 Go 新手的第一个上手项目。.zip (72个子文件)
content
.editorconfig 252B
.DS_Store 6KB
go.mod 1KB
go.sum 32KB
resources
views
categories
create.gohtml 760B
articles
show.gohtml 829B
_form_field.gohtml 683B
create.gohtml 419B
_article_meta.gohtml 253B
edit.gohtml 446B
index.gohtml 751B
layouts
simple.gohtml 466B
_messages.gohtml 658B
sidebar.gohtml 2KB
_pagination.gohtml 691B
_form_error_feedback.gohtml 141B
app.gohtml 462B
auth
register.gohtml 2KB
login.gohtml 1KB
.env.example 315B
app
http
controllers
auth_controller.go 2KB
pages_controller.go 761B
base_controller.go 823B
categories_controller.go 2KB
user_controller.go 940B
articles_controller.go 5KB
middlewares
guest.go 420B
auth.go 377B
force_html.go 349B
start_session.go 364B
remove_trailing_slash.go 475B
middleware.go 176B
requests
request.go 2KB
user_registration.go 2KB
article_form.go 971B
category_form.go 894B
models
category
crud.go 763B
category.go 344B
model.go 500B
user
user.go 856B
crud.go 747B
hooks.go 282B
article
article.go 796B
crud.go 2KB
policies
topic_policy.go 222B
bootstrap
route.go 261B
db.go 899B
tests
pages_test.go 1KB
public
.DS_Store 6KB
js
bootstrap.min.js 62KB
css
bootstrap.min.css 144KB
app.css 40B
routes
web.go 2KB
pkg
route
router.go 666B
database
database.go 1KB
logger
logger.go 141B
view
view.go 2KB
types
converter.go 627B
model
model.go 1KB
flash
flash.go 1KB
password
password.go 749B
auth
auth.go 1KB
pagination
pagination.go 5KB
session
session.go 1KB
config
config.go 2KB
.gitignore 8B
config
session.go 278B
database.go 677B
app.go 632B
config.go 133B
pagination.go 211B
main.go 401B
共 72 条
- 1
资源评论
生瓜蛋子
- 粉丝: 3925
- 资源: 7441
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 白色简洁风的行政文化企业司网站模板下载.zip
- 白色简洁风的设计企业网站模板下载.zip
- 白色简洁风的新闻杂志类企业网站模板下载.zip
- 白色简洁风的运动鞋商城网站模板下载.zip
- 白色简洁风格的8种表单信息源码下载.zip
- 白色简洁风格的App后台管理源码下载.zip
- 白色简洁风格的APP设计公司企业网站模板.rar
- 白色简洁风格的APP介绍整站网站源码下载.zip
- 白色简洁风格的app手机应用整站网站模板.zip
- 白色简洁风格的HTML设计企业网站模板.zip
- 白色简洁风格的APP展示动态源码下载.zip
- 白色简洁风格的IT研发团队商务模板.zip
- 白色简洁风格的SPA香薰美容整站网站源码下载.zip
- 白色简洁风格的暗夜登录框源码下载.zip
- 白色简洁风格的UIDesign设计公司企业网站模板.rar
- 白色简洁风格的安卓游戏卡通动漫人物整站网站模板.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功