Go 语言实现的简单 CMS Web
Go 语言实现的简单 CMS Web
以下是一个使用 Go 语言实现的简单 CMS Web 演示代码示例,
包含基本的内容管理功能:
项目结构
### 项目结构
```
cms-demo/
├── main.go
├── handlers/
├── models/
├── views/
│ ├── home.html
│ ├── article.html
│ ├── admin.html
│ └── base.html
├── static/
│ └── css/
└── go.mod
1. 依赖管理
```
### (go.mod)
```go
module cms-demo
go 1.21
require (
github.com/gin-gonic/gin v1.9.1
gorm.io/gorm v1.25.7
gorm.io/driver/sqlite v1.5.4
)
2. 数据模型
###(models/article.go)
```go
package models
import (
"time"
"gorm.io/gorm"
)
type ArticleStatus int
const (
Draft ArticleStatus = iota
Published
)
type Article struct {
gorm.Model
Title string
Slug string `gorm:"uniqueIndex"`
Content string `gorm:"type:text"`
PublishAt time.Time
Status ArticleStatus
}
```
3. 主程序 (main.go)
```go
package main
import (
_ "net/http"
"cms-demo/handlers"
"cms-demo/models"
"github.com/gin-gonic/gin"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
func main() {
// 初始化数据库
db, err := gorm.Open(sqlite.Open("cms.db"), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
// 自动迁移模型
db.AutoMigrate(&models.Article{})
// 初始化 Gin
r := gin.Default()
// 设置静态文件
r.Static("/static", "./static")
// 设置模板
r.LoadHTMLGlob("views/*.html")
// 注册路由
r.GET("/", handlers.HomeHandler(db))
r.GET("/article/:slug", handlers.ArticleHandler(db))
// 后台路由组
admin := r.Group("/admin")
{
admin.GET("/", handlers.AdminHandler(db))
admin.POST("/save", handlers.SaveArticleHandler(db))
}
// 启动服务
r.Run(":8080")
}
4. 处理程序
```
### (handlers/handlers.go)
```go
package handlers
import (
"net/http"
"cms-demo/models"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
)
func HomeHandler(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
var articles []models.Article
db.Where("status = ? AND publish_at <= ?",
models.Published, time.Now()).Find(&articles)
c.HTML(http.StatusOK, "home.html", gin.H{
"articles": articles,
})
}
}
func ArticleHandler(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
slug := c.Param("slug")
var article models.Article
if err := db.Where("slug = ?", slug).First(&article).Error; err != nil {
c.AbortWithStatus(http.StatusNotFound)
return
}
c.HTML(http.StatusOK, "article.html", gin.H{
"article": article,
})
}
}
func AdminHandler(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
var articles []models.Article
db.Find(&articles)
c.HTML(http.StatusOK, "admin.html", gin.H{
"articles": articles,
})
}
}
func SaveArticleHandler(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
var article models.Article
if err := c.ShouldBind(&article); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
// 创建或更新文章
if article.ID != 0 {
db.Model(&article).Updates(article)
} else {
db.Create(&article)
}
c.Redirect(http.StatusFound, "/admin")
}
}
5. 模板示例
### 5. 模板示例 (views/home.html)
```html
{{ define "base" }}
<!DOCTYPE html>
<html>
<head>
<title>{{ template "title" }}</title>
<link rel="stylesheet" href="/static/css/style.css">
</head>
<body>
<header>
<nav>
<a href="/">Home</a>
<a href="/admin">Admin</a>
</nav>
</header>
<main>
{{ template "content" . }}
</main>
</body>
</html>
后面会介绍一个python版本的芯片测试工具系统
用户想要用Python制作一个芯片测试工具系统的demo。首先,我需要理解用户的具体需求。芯片测试工具可能涉及到硬件通信、数据分析、用户界面等方面。但用户可能只是需要一个简单的demo,所以不需要太复杂的功能。
首先,确定这个demo的范围。用户可能希望有一个命令行界面或者简单的图形界面,能够模拟测试流程,比如连接芯片、运行测试用例、显示结果。考虑到Python的库,可能用Tkinter做GUI,或者直接用命令行。但图形界面更直观,可能更适合demo。
接下来,硬件通信部分。真实的芯片测试可能需要通过串口、USB或者其他接口,但demo可能只需要模拟这部分。可以创建一个虚拟的芯片类,模拟连接、发送指令、接收响应。这样不需要实际硬件,用户也能运行。
然后,测试用例的管理。需要设计几个简单的测试用例,比如检查电压、电流、通信功能。每个测试用例应该有名称、描述、执行方法和预期结果。可以用类或字典来管理这些用例。
数据处理和日志记录也是重要的部分。测试结果需要保存,可能用CSV或文本文件记录,方便后续查看。同时,实时显示测试结果,让用户知道测试进度和状态。
异常处理需要考虑,比如连接失败、测试失败的情况,给出相应的提示信息。用户体验方面,需要清晰的步骤提示和结果展示,可能用颜色区分成功和失败。
代码结构方面,可能需要分成几个模块:硬件接口模拟、测试用例管理、用户界面、日志记录。但作为demo,可能先写在一个文件里更简单。
然后,验证整个流程是否合理。用户启动程序,连接芯片,选择或运行测试用例,查看结果,生成报告。需要考虑各个步骤之间的衔接,比如先连接再测试,处理测试中的异常。
最后,确保代码简洁,有注释,方便用户理解和扩展。可能还需要提供一些扩展思路,比如集成真实硬件、添加更多测试用例、使用数据库等。
现在,把这些思路整理成一个简单的代码框架。使用面向对象的方式,创建虚拟芯片类、测试管理器、GUI或命令行界面。模拟连接过程,添加几个测试用例,处理结果并记录日志。
测试时,确保各个功能模块正常工作,比如连接成功/失败的反馈,测试用例的执行和结果判断,日志是否正确生成。如果有问题,调整代码逻辑或异常处理部分。
总结,这个demo需要展示芯片测试的基本流程,包括连接、测试、结果处理和日志记录,同时保持代码简单易懂,方便用户在此基础上进行扩展。
相关文章:
Go 语言实现的简单 CMS Web
Go 语言实现的简单 CMS Web 以下是一个使用 Go 语言实现的简单 CMS Web 演示代码示例, 包含基本的内容管理功能: 项目结构 ### 项目结构 cms-demo/ ├── main.go ├── handlers/ ├── models/ ├── views/ │ ├── home.html │ ├─…...
《MySQL基础:了解MySQL周边概念》
1.登录选项的认识 -h:指明登录部署了mysql服务的主机,默认为127.0.0.1-P:指明要访问的端口号,默认为3306-u:指明登录用户-p:指明登录密码 2.什么是数据库 2.1认识数据库 第一点理解。 mysql是数据库的客户…...
Spring boot 知识整理
一、SpringBoot 背景内容梳理 SpringBoot是一个基于Spring框架的开源框架,用于简化Spring应用程序的初始搭建和开发过程。它通过提供约定优于配置的方式,尽可能减少开发者的工作量,使得开发Spring应用变得更加快速、便捷和高效。 SpringBoot…...
transformer 规范化层
目标 了解规范化层的作用掌握规范化层的实现过程 作用 所有的深层网络模型都需要标准网络层, 因为随着网络层数量的增加, 通过多层的计算后参数可能出现过大或者过小的情况, 这样可能导致在学习过程出现异常, 模型可能收敛比较慢,因此都会在一定的层数后接规范化层进行数值的…...
RCL谐振电压增益曲线
谐振电路如何通过调频实现稳压? 为什么要做谐振? 在谐振状态实现ZVS导通,小电流关断 电压增益GVo/Vin,相当于产出投入比 当ff0时,G1时,输出电压输入电压 当G<1时,输出电压<输入电压 …...
JavaScript:表单及正则表达式验证
今天我要介绍的是在JavaScript中关于表单验证内容的知识点介绍: 关于表单验证,我接下来则直接将内容以及效果显示出来并作注解,这样可以清晰看见这个表达验证的妙用: <form id"ff" action"https://www.baidu.…...
一、Appium环境安装
找了一圈操作手机的工具或软件,踩了好多坑,最后决定用这个工具(影刀RPA手机用的也是这个),目前最新的版本是v2.17.1,是基于nodejs环境的,有两种方式,我只试了第一种方式,第二种方式应该是比较简…...
精益数据分析(3/126):用数据驱动企业发展的深度解析
精益数据分析(3/126):用数据驱动企业发展的深度解析 大家好!一直以来,我都坚信在当今竞争激烈的商业环境中,数据是企业获得竞争优势的关键。最近深入研究《精益数据分析》这本书,收获颇丰&…...
暂存一下等会写
#include<easyx.h> IMAGE SNOW 图形变量 struct MOVE生存结构体 {int x0;int y0; bool livefalse;}; initgraph(800, 800);初始化图形界面 MOVE snowflake[5000];目标数量 loadimage(&SNOW, "snow.png");加载图片 BeginBatchDraw(); 开始批量绘图。…...
【c++深入系列】:new和delete运算符详解
🔥 本文专栏:c 🌸作者主页:努力努力再努力wz 💪 今日博客励志语录: “生活不会向你许诺什么,尤其不会向你许诺成功。它只会给你挣扎、痛苦和煎熬的过程。但只要你坚持下去,终有一天&…...
正弦波有效值和平均值(学习笔记)
一个周期的正弦波在坐标轴上围的面积有多大? 一般正弦波以 y Asin(wx)表示,其中A为振幅,W为角速度。周期T 2π/w; 确定积分区间是x 0,到x 2π。 计算绝对值积分: 变量代还:wx θ,dx dθ…...
《分布式软总线架构下,设备虚拟化技术的深度剖析与优化策略》
设备之间的互联互通和协同工作已成为一种趋势。分布式软总线架构作为实现这一目标的关键技术,为不同设备之间的通信和协作提供了基础。而设备虚拟化技术则是在分布式软总线架构下,进一步提升设备资源利用效率的重要手段。本文将深入探讨在分布式软总线架…...
首次打蓝桥杯总结(c/c++B组)
目录 一、对每个题进行总结 1.填空题 2.第一个大题---可分解的正整数(10--3) 3.第二道大题---产值调整(10--3) 4.第三道大题---画展部署(15--7) 5.第四道大题---水质检测(15--3&#x…...
第八天 开始Unity Shader的学习之Blinn-Phong光照模型
Unity Shader的学习笔记 第八天 开始Unity Shader的学习之Blinn-Phong光照模型 文章目录 Unity Shader的学习笔记前言一、Blinn-Phong光照模型①计算高光反射部分效果展示 二、召唤神龙:使用Unity内置的函数总结 前言 今天我们编写另一种高光反射的实现方法 – Blinn光照模型…...
游戏NPC对话AI生成的管理调用系统设计
系统概述 游戏与故事人物对话模拟系统 此系统旨在模拟游戏或故事场景里人物的对话。它具备创建游戏与人物信息的功能,并且能借助输入游戏、人物、时间、地点、场景等信息,调用 OpenAI 格式的接口(通过One Api支持DeepSeek之类的其他AI)得到人物的对话内容…...
Go:使用共享变量实现并发
竞态 在串行程序中,步骤执行顺序由程序逻辑决定;而在有多个 goroutine 的并发程序中,不同 goroutine 的事件先后顺序不确定,若无法确定两个事件先后,它们就是并发的。若一个函数在并发调用时能正确工作,称…...
豆瓣图书数据采集与可视化分析
文章目录 一、适用题目二、豆瓣图书数据采集1. 图书分类采集2. 爬取不同分类的图书数据3. 各个分类数据整合 三、豆瓣图书数据清洗四、数据分析五、数据可视化1. 数据可视化大屏展示 源码获取看下方名片 一、适用题目 基于Python的豆瓣图书数据采集与分析基于Python的豆瓣图书…...
常见的爬虫算法
1.base64加密 base64是什么 Base64编码,是由64个字符组成编码集:26个大写字母AZ,26个小写字母az,10个数字0~9,符号“”与符号“/”。Base64编码的基本思路是将原始数据的三个字节拆分转化为四个字节,然后…...
Numpy常用库方法总结
numpy的底层是ndarray,也就是矩阵结构 对于ndarray结构来说,里面所有的元素必须是同一类型的 如果不是的话,会自动的向下进行转换 list [1,2,3,4,5] array np.array(list) array输出:array([1, 2, 3, 4, 5]) 1.1 ndarray基本…...
YOLOV8 OBB 海思3516训练流程
YOLOV8 OBB 海思3516训练流程 目录 1、 下载带GPU版本的torch(可选) 1 2、 安装 ultralytics 2 3、 下载pycharm 社区版 2 4、安装pycharm 3 5、新建pycharm 工程 3 6、 添加conda 环境 4 7、 训练代码 5 9、配置Ymal 文件 6 10、修改网络结构 9 11、运行train.py 开始训练模…...
[MySQL] 事务管理(二) 事务的隔离性底层
事务的隔离性底层 1.数据库并发的场景2.读-写2.1MVCC三个变量2.1.1 3个记录隐藏列字段2.1.2 undo日志 模拟MVCCselect 的读取2.1.3 Read View(读视图) 3.RR与RC的区别 1.数据库并发的场景 读-读:不存在问题,也不需要并发控制读-写…...
20、.NET SDK概述
.NET SDK(Software Development Kit) 是微软提供的一套开发工具包,用于构建、运行和管理基于 .NET 平台的应用程序。它包含了一组丰富的工具、库和运行时环境,支持开发者在多种操作系统(如 Windows、Linux 和 macOS&am…...
Go:包和 go 工具
引言 通过对关联特性分类,组成便于理解和修改的单元,使包与程序其他包保持独立,助力大型程序的设计与维护 。模块化让包可在不同项目共享、复用、发布及全球范围使用。 每个包定义不同命名空间作为标识符,关联具体包,…...
18-21源码剖析——Mybatis整体架构设计、核心组件调用关系、源码环境搭建
学习视频资料来源:https://www.bilibili.com/video/BV1R14y1W7yS 文章目录 1. 架构设计2. 核心组件及调用关系3. 源码环境搭建3.1 测试类3.2 实体类3.3 核心配置文件3.4 映射配置文件3.5 遇到的问题 1. 架构设计 Mybatis整体架构分为4层: 接口层&#…...
冒泡排序、插入排序、快速排序、堆排序、希尔排序、归并排序
目录 冒泡排序插入排序快速排序(未优化版本)快速排序(优化版本)堆排序希尔排序归并排序各排序时间消耗对比 冒泡排序 冒泡排序核心逻辑就是对数组从第一个位置开始进行遍历,如果发现该元素比下一个元素大,则交换位置,如果不大,就…...
Docker Compose 中配置 Host 网络模式
在 Docker Compose 中配置 Host 网络模式时,需通过 network_mode 参数直接指定容器使用宿主机的网络栈。以下是具体配置方法及注意事项: 1. 基础配置示例 在 docker-compose.yml 文件中,为需要启用 Host 模式的服务添加 network_mode: "…...
HTML、CSS 和 JavaScript 常见用法及使用规范
一、HTML 深度剖析 1. 文档类型声明 HTML 文档开头的 <!DOCTYPE html> 声明告知浏览器当前文档使用的是 HTML5 标准。它是文档的重要元信息,能确保浏览器以标准模式渲染页面,避免怪异模式下的兼容性问题。 2. 元数据标签 <meta> 标签&am…...
Elasticsearch 索引数据量激增的应对与优化:从原理到部署实践
Elasticsearch(ES)作为一款强大的分布式搜索和分析引擎,广泛应用于日志分析、全文搜索和实时数据处理等场景。然而,随着数据量激增,索引可能面临性能瓶颈,如写入变慢、查询延迟高或存储成本上升。如何有效应…...
CD27.【C++ Dev】类和对象 (18)友元和内部类
目录 1.友元 友元函数 几个特点 友元类 格式 代码示例 2.内部类(了解即可) 计算有内部类的类的大小 分析 注意:内部类不能直接定义 内部类是外部类的友元类 3.练习 承接CD21.【C Dev】类和对象(12) 流插入运算符的重载文章 1.友元 友元函数 在CD21.【C Dev】类和…...
QT安装详细步骤
下载 清华源 : 清华源 1. 2. 3. 4....
