彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-模板与数据库EP02

本文涉及的产品
RDS Agent(兼容OpenClaw),2核4GB
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 书接上回,上次我们搭建好了项目入口文件,同时配置了路由体系,接着就可以配置项目的模板了,这里我们采用Iris内置的模板引擎,事实上,采用模板引擎并不意味着前后端耦合,模板中的数据保持其独立性即可,也就是说模板的数据操作交互方式采用http接口请求的形式,Iris并不参与模板逻辑,只返回Json格式的数据即可。前端集成数据双向绑定机制的框架Vue.js。

书接上回,上次我们搭建好了项目入口文件,同时配置了路由体系,接着就可以配置项目的模板了,这里我们采用Iris内置的模板引擎,事实上,采用模板引擎并不意味着前后端耦合,模板中的数据保持其独立性即可,也就是说模板的数据操作交互方式采用http接口请求的形式,Iris并不参与模板逻辑,只返回Json格式的数据即可。前端集成数据双向绑定机制的框架Vue.js。

配置模板

Iris支持但不限于下面几种模板引擎:

#    Name    Parser  
1    HTML    html/template  
2    Blocks    kataras/blocks  
3    Django    flosch/pongo2  
4    Pug    Joker/jade  
5    Handlebars    aymerick/raymond  
6    Amber    eknkc/amber  
7    Jet    CloudyKit/jet  
8    Ace    yosssi/ace

这里我们使用默认的引擎html/template,参见模板语法文档示例:https://github.com/kataras/iris/tree/master/\_examples/view

编写main.go文件:

tmpl := iris.HTML("./views", ".html")

这里声明并赋值tmpl变量,传入模板文件夹以及模板文件后缀两个参数。

随后在项目根目录创建views文件夹:

mkdir views  
cd views

接着建立模板文件test.html:

<html>  
<head>  
    <title>首页</title>  
</head>  
<body>  
    <h1>${.message}</h1>  
</body>  
</html>

这是一个简单的测试模板,打印变量.message。

随后添加模板配置:

tmpl.Delims("${", "}")  
  
tmpl.Reload(true)  
  
app.RegisterView(tmpl)

这里添加模板的通配符,采用${},避免和Vue的打印模板语法{{}}冲突,然后开启修改后重新加载的模式,防止模板被缓存,最后注册模板。

最后,在路由函数内解析模板:

app.Get("/", func(ctx iris.Context) {  
          
        ctx.ViewData("message", "你好,女神")  
      
        ctx.View("test.html")  
    })

编译后访问http://localhost:5000

这里通过ctx.ViewData函数将message变量传递给模板,然后渲染.message

这只是最简单的模板解析,我们还需要让Iris提供静态文件的服务支持,否则模板将无法加载样式文件或者是Js文件:

app.HandleDir("/assets", iris.Dir("./assets"))

这里将根目录的assets文件作为静态文件目录进行解析。

随后将项目的css文件和js文件放入assets对应目录,接着编写index.html首页模板:

<!DOCTYPE html>  
<html lang="zh-CN">  
  <head>  
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">  
    <meta http-equiv="X-UA-Compatible" content="IE=edge">  
    <meta name="viewport" content="width=device-width, initial-scale=1">  
    <meta name="applicable-device" content="pc,mobile" />  
  <title>刘悦-刘悦分享-刘悦的技术博客-讲师刘悦-刘悦简历</title>  
<meta content="刘悦的技术博客,刘悦简历,python编程,git,mac,centos,ruby编程,linux,golang编程,vue.js,Docker容器技术" name="keywords">  
<meta content="刘悦-刘悦分享-刘悦的技术博客-讲师刘悦-刘悦简历" name="description">  
<meta content="index,follow" name="robots">  
<meta content="index,follow" name="GOOGLEBOT">  
<meta content="刘悦"  name="Author">  
  
  <meta http-equiv="expires" content="4500"/>  
  
   <link rel="stylesheet" href="../assets/css/style.css"  />  
  
   <script src="../assets/js/axios.js"></script>  
    <script src="../assets/js/vue.js"></script>  
  
  
  </head>

这里通过link和script标签将需要的样式和Js标准库引入:分别是style.css、Vue.js和axios.js文件

随后,添加id标识:

<div id="app">

接着在body标签外侧添加Vue初始化逻辑:

<script>  
  
  
const App = {  
            data() {  
                return {  
                    message: "Hello Tornado",  
                };  
            },  
            created: function() {  
  
                console.log("你好,女神");  
  
            },  
            methods: {  
            },  
        };  
const app = Vue.createApp(App);  
app.config.globalProperties.axios = axios;  
app.mount("#app");  
  
  
  
</script>

这里当Iris模板渲染时,自动初始化Vue框架,前端交互留给Vue.js。

如果愿意,网站的icon也可以交给Iris渲染:

app.Favicon("./favicon.ico")

接着修改main.go逻辑,改为渲染首页模板:

app.Get("/", func(ctx iris.Context) {  
      
        ctx.ViewData("message", "你好,女神")  
          
        ctx.View("index.html")  
    })

访问http://localhost:5000:

如此,Iris模板和静态服务就配置好了。

配置数据库

Iris项目需要将数据存储在数据库中,这里使用Gorm包,安装方式详见:百亿数据百亿花, 库若恒河沙复沙,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang数据库操作实践EP12

随后修改main.go文件:



db, err := gorm.Open("mysql", "root:root@(localhost)/irisblog?charset=utf8mb4&parseTime=True&loc=Local")  
  
    if err != nil {  
        fmt.Println(err)  
        panic("无法连接数据库")  
    }  
    fmt.Println("连接数据库成功")  
  
    //单数模式  
    db.SingularTable(true)  
  
    // 创建默认表  
    db.AutoMigrate(&model.User{})  
  
    // 逻辑结束后关闭数据库  
    defer func() {  
        _ = db.Close()  
    }()

这里通过mysql驱动连接数据库,注意默认启动会通过结构体创建用户表。

随后在根目录创建模型包:

mkdir model  
cd model

接着创建数据模型包:

package model  
  
import (  
    "time"  
    "github.com/jinzhu/gorm"  
)  
  
type Model struct {  
    ID        uint `gorm:"primary_key"`  
    CreatedAt time.Time  
    UpdatedAt time.Time  
    DeletedAt *time.Time  
}  
  
type User struct {  
    gorm.Model  
    Username string  
    Password string  
}

这里通过结构体的属性传递,可以让User结构体具备Gorm内置的Model结构体的字段,类似“继承”的方式。

最后,封装Iris结构体,将db变量传递进去:

package main  
  
import (  
    "IrisBlog/model"  
    "fmt"  
  
    "github.com/jinzhu/gorm"  
    _ "github.com/jinzhu/gorm/dialects/mysql"  
    "github.com/kataras/iris/v12"  
)  
  
func main() {  
  
    db, err := gorm.Open("mysql", "root:root@(localhost)/irisblog?charset=utf8mb4&parseTime=True&loc=Local")  
  
    if err != nil {  
        fmt.Println(err)  
        panic("无法连接数据库")  
    }  
    fmt.Println("连接数据库成功")  
  
    //单数模式  
    db.SingularTable(true)  
  
    // 创建默认表  
    db.AutoMigrate(&model.User{})  
  
    // 逻辑结束后关闭数据库  
    defer func() {  
        _ = db.Close()  
    }()  
  
    app := newApp(db)  
  
    app.HandleDir("/assets", iris.Dir("./assets"))  
    app.Favicon("./favicon.ico")  
    app.Listen(":5000")  
}  
  
func newApp(db *gorm.DB) *iris.Application {  
  
    app := iris.New()  
  
    tmpl := iris.HTML("./views", ".html")  
    // Set custom delimeters.  
    tmpl.Delims("${", "}")  
    // Enable re-build on local template files changes.  
    tmpl.Reload(true)  
  
    app.RegisterView(tmpl)  
  
    app.Get("/", func(ctx iris.Context) {  
  
        ctx.ViewData("message", "你好,女神")  
  
        ctx.View("index.html")  
    })  
  
    return app  
  
}

如此,数据库就配置好了,当前的项目结构如下:

IrisBlog  
├── assets  
│ ├── css  
│ │ └── style.css  
│ └── js  
│     ├── axios.js  
│     └── vue.js  
├── favicon.ico  
├── go.mod  
├── go.sum  
├── main.go  
├── model  
│ └── model.go  
├── tmp  
│ └── runner-build  
└── views  
    ├── index.html  
    └── test.html

结语

本次我们完成了项目模板和数据库的配置,并且在战略层面重新规划了项目结构,正道是:雄关漫道真如铁,而今迈步从头越,该项目已开源在Github:https://github.com/zcxey2911/IrisBlog ,与君共觞,和君共勉。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
8月前
|
存储 NoSQL Redis
阿里云高性能数据库Tair(兼容 Redis)收费价格,稳定可靠成本低
阿里云高性能云数据库Tair兼容Redis,提供Redis开源版和Tair企业版,支持多种存储介质与灵活扩展,适用于高并发场景。Tair具备亚毫秒级稳定延迟,保障业务连续性。价格方面,Redis开源版年费从72元起,Tair企业版年费从1224元起,具体费用根据配置不同有所变化。
|
前端开发 算法 API
构建高性能图像处理Web应用:Next.js与TailwindCSS实践
本文分享了构建在线图像黑白转换工具的技术实践,涵盖技术栈选择、架构设计与性能优化。项目采用Next.js提供优秀的SSR性能和SEO支持,TailwindCSS加速UI开发,WebAssembly实现高性能图像处理算法。通过渐进式处理、WebWorker隔离及内存管理等策略,解决大图像处理性能瓶颈,并确保跨浏览器兼容性和移动设备优化。实际应用案例展示了其即时处理、高质量输出和客户端隐私保护等特点。未来计划引入WebGPU加速、AI增强等功能,进一步提升用户体验。此技术栈为Web图像处理应用提供了高效可行的解决方案。
|
8月前
|
监控 Java 关系型数据库
HikariCP 高性能数据库连接池技术详解与实践指南
本文档全面介绍 HikariCP 高性能数据库连接池的核心概念、架构设计和实践应用。作为目前性能最优异的 Java 数据库连接池实现,HikariCP 以其轻量级、高性能和可靠性著称,已成为 Spring Boot 等主流框架的默认连接池选择。本文将深入探讨其连接管理机制、性能优化策略、监控配置以及与各种框架的集成方式,帮助开发者构建高性能的数据访问层。
941 8
|
8月前
|
监控 Java 关系型数据库
HikariCP 高性能数据库连接池技术详解与实践指南
本文档全面介绍 HikariCP 高性能数据库连接池的核心概念、架构设计和实践应用。作为目前性能最优异的 Java 数据库连接池实现,HikariCP 以其轻量级、高性能和可靠性著称,已成为 Spring Boot 等主流框架的默认连接池选择。本文将深入探讨其连接管理机制、性能优化策略、监控配置以及与各种框架的集成方式,帮助开发者构建高性能的数据访问层。
609 1
|
8月前
|
安全 关系型数据库 数据管理
阿里云数据库:构建高性能与安全的数据管理系统
阿里云数据库提供RDS、PolarDB、Tair等核心产品,具备高可用、弹性扩展、安全合规及智能运维等技术优势,广泛应用于电商、游戏、金融等行业,助力企业高效管理数据,提升业务连续性与竞争力。
|
11月前
|
安全 关系型数据库 数据库
瀚高股份与 Anolis OS 完成适配,龙蜥获数据库场景高性能与稳定性认证
Anolis OS 能够为用户提供更加高效、安全的数据处理与管理体验。
|
11月前
|
存储 关系型数据库 数据库
高性能云盘:一文解析RDS数据库存储架构升级
性能、成本、弹性,是客户实际使用数据库过程中关注的三个重要方面。RDS业界率先推出的高性能云盘(原通用云盘),是PaaS层和IaaS层的深度融合的技术最佳实践,通过使用不同的存储介质,为客户提供同时满足低成本、低延迟、高持久性的体验。
|
存储 缓存 Java
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
2337 3
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
|
Rust 物联网 数据处理
Rust +时序数据库 TDengine:打造高性能时序数据处理利器
TDengine 是一款专为物联网、车联网、工业互联网等时序数据场景优化设计的开源时序数据库,支持高并发写入、高效查询及流式计算,通过“一个数据采集点一张表”与“超级表”的概念显著提升性能。 Rust 作为一门系统级编程语言,近年来在数据库、嵌入式系统、分布式服务等领域迅速崛起,以其内存安全、高性能著称,与 TDengine 的高效特性天然契合,适合构建高可靠、高性能的数据处理系统。
658 2
|
存储 人工智能 固态存储
软硬联合创新:打造极致压缩比的高性能瑶池数据库
本文介绍了阿里云瑶池数据库的软硬联合创新,旨在打造极致压缩比和高性能的数据库系统。内容涵盖五个方面:1) AMD EPC赋能阿里云数据库,提升计算性能;2) AMD EPYC全面支持阿里云数据库及AI应用;3) 小盈科技分享Polar DB的最佳实践,解决业务发展中的挑战;4) 基于阿里云新硬件完成存储规模拓展和性能演进,实现大规模数据处理;5) 阿里云资源存储部件的应用历史与演进,展示自研硬件的进步。通过这些创新,瑶池数据库实现了延迟降低30%、存储成本降低40%,并提供更高的安全性和灵活性。
355 5