<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>FLY的狐狸</title><description>我听到的，我会忘记。我看到的，我会记住。我实践的，我会理解。</description><link>https://www.jflyfox.com/</link><language>zh_CN</language><item><title>GoFrame 基础教程 - Go 语言 Web 开发快速入门</title><link>https://www.jflyfox.com/posts/gfstudy/</link><guid isPermaLink="true">https://www.jflyfox.com/posts/gfstudy/</guid><description>GoFrame 是 Go 语言的一款模块化 Web 开发框架，本文介绍 GoFrame 的基本概念、环境搭建和快速入门指南。</description><pubDate>Thu, 11 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;GoFrame 基础教程 - Go 语言 Web 开发快速入门&lt;/h1&gt;
&lt;p&gt;GoFrame 是一款 Go 语言开发的模块化、高性能 Web 开发框架，提供了丰富的功能模块和工具，帮助开发者快速构建 Web 应用。&lt;/p&gt;
&lt;h2&gt;一、GoFrame 简介&lt;/h2&gt;
&lt;p&gt;GoFrame 提供了完整的 Web 开发解决方案，包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Web 服务&lt;/strong&gt;：HTTP 服务器、路由、中间件&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;请求与响应&lt;/strong&gt;：参数解析、数据验证、响应格式化&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置管理&lt;/strong&gt;：多环境配置、热加载&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;日志管理&lt;/strong&gt;：结构化日志、日志级别控制&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据库&lt;/strong&gt;：MySQL、PostgreSQL 等关系型数据库支持&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缓存&lt;/strong&gt;：Redis 连接与操作&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工具库&lt;/strong&gt;：字符串处理、JSON 解析、类型转换等&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;二、环境搭建&lt;/h2&gt;
&lt;h3&gt;安装 Go&lt;/h3&gt;
&lt;p&gt;确保已安装 Go 1.18+ 版本：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;go version
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;创建项目&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;mkdir myapp
cd myapp
go mod init myapp
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;安装 GoFrame&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;go get github.com/gogf/gf/v2
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;三、Web 服务介绍&lt;/h2&gt;
&lt;h3&gt;基础 HTTP 服务器&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;package main

import (
    &quot;github.com/gogf/gf/v2/frame/g&quot;
    &quot;github.com/gogf/gf/v2/os/gctx&quot;
)

func main() {
    s := g.Server()
    s.BindHandler(&quot;/&quot;, func(r *g.Request) {
        r.Response.Write(&quot;Hello World!&quot;)
    })
    s.Run()
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;路由注册&lt;/h3&gt;
&lt;p&gt;GoFrame 支持多种路由注册方式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 基础路由
s.BindHandler(&quot;/user&quot;, GetUser)

// RESTful 风格
s.BindHandler(&quot;GET:/user/list&quot;, ListUsers)
s.BindHandler(&quot;POST:/user/create&quot;, CreateUser)
s.BindHandler(&quot;PUT:/user/update&quot;, UpdateUser)
s.BindHandler(&quot;DELETE:/user/delete&quot;, DeleteUser)

// 带参数路由
s.BindHandler(&quot;/user/:id&quot;, GetUserByID)
s.BindHandler(&quot;/article/{category}/{id}&quot;, GetArticle)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;四、请求与响应&lt;/h2&gt;
&lt;h3&gt;获取请求参数&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;func Handler(r *g.Request) {
    // 获取查询参数
    id := r.Get(&quot;id&quot;).Int()
    name := r.Get(&quot;name&quot;).String()
    
    // 获取 POST 参数
    data := r.Parse()
    
    // 获取 JSON 请求体
    var user User
    r.Parse(&amp;amp;user)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;响应数据&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;func Handler(r *g.Request) {
    // JSON 响应
    r.Response.WriteJson(g.Map{
        &quot;code&quot;:    0,
        &quot;message&quot;: &quot;success&quot;,
        &quot;data&quot;:    result,
    })
    
    // 重定向
    r.Response.Redirect(&quot;/new-path&quot;)
    
    // 设置 Header
    r.Response.Header().Set(&quot;Content-Type&quot;, &quot;application/json&quot;)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;五、中间件&lt;/h2&gt;
&lt;p&gt;中间件用于处理请求前后的通用逻辑，如认证、日志、CORS 等：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 注册中间件
s.Use(CORS, Auth, Logger)

// 中间件函数
func CORS(r *g.Request) {
    r.Response.CORSDefault()
    r.ExitAll()
}

func Auth(r *g.Request) {
    token := r.Get(&quot;token&quot;).String()
    if !validateToken(token) {
        r.Response.WriteJson(g.Map{
            &quot;code&quot;:    401,
            &quot;message&quot;: &quot;unauthorized&quot;,
        })
        r.ExitAll()
    }
    r.ExitAll()
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;六、配置管理&lt;/h2&gt;
&lt;h3&gt;配置文件格式&lt;/h3&gt;
&lt;p&gt;GoFrame 支持多种配置文件格式（YAML、TOML、JSON、INI）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# config.yaml
server:
  address: &quot;:8080&quot;
  serverRoot: &quot;./public&quot;

database:
  default:
    link: &quot;mysql:user:pass@tcp(127.0.0.1:3306)/dbname&quot;
    debug: true

redis:
  default:
    address: &quot;127.0.0.1:6379&quot;
    db: 0
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;读取配置&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;import &quot;github.com/gogf/gf/v2/frame/g&quot;

// 读取配置
address := g.Cfg().Get(context.Background(), &quot;server.address&quot;).String()
dbLink := g.Cfg().Get(context.Background(), &quot;database.default.link&quot;).String()
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;七、日志管理&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;import (
    &quot;github.com/gogf/gf/v2/frame/g&quot;
    &quot;github.com/gogf/gf/v2/os/gctx&quot;
)

func main() {
    ctx := gctx.New()
    
    // 不同级别日志
    g.Log().Info(ctx, &quot;info message&quot;)
    g.Log().Debug(ctx, &quot;debug message&quot;)
    g.Log().Warning(ctx, &quot;warning message&quot;)
    g.Log().Error(ctx, &quot;error message&quot;)
    
    // 带字段日志
    g.Log().Infof(ctx, &quot;user %s logged in&quot;, username)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;八、数据库操作&lt;/h2&gt;
&lt;h3&gt;MySQL 连接&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;import (
    &quot;github.com/gogf/gf/v2/database/gdb&quot;
    &quot;github.com/gogf/gf/v2/frame/g&quot;
)

// 查询
func GetUser(id int) (*gdb.Record, error) {
    result, err := g.DB().Table(&quot;user&quot;).Where(&quot;id&quot;, id).One()
    if err != nil {
        return nil, err
    }
    return result, nil
}

// 插入
func InsertUser(data gdb.Map) (int64, error) {
    result, err := g.DB().Table(&quot;user&quot;).Data(data).Insert()
    if err != nil {
        return 0, err
    }
    return result.LastInsertId()
}

// 更新
func UpdateUser(id int, data gdb.Map) (int64, error) {
    result, err := g.DB().Table(&quot;user&quot;).Data(data).Where(&quot;id&quot;, id).Update()
    if err != nil {
        return 0, err
    }
    return result.RowsAffected()
}

// 删除
func DeleteUser(id int) (int64, error) {
    result, err := g.DB().Table(&quot;user&quot;).Where(&quot;id&quot;, id).Delete()
    if err != nil {
        return 0, err
    }
    return result.RowsAffected()
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;九、Redis 操作&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;import (
    &quot;github.com/gogf/gf/v2/frame/g&quot;
    &quot;github.com/gogf/gf/v2/os/gctx&quot;
)

func main() {
    ctx := gctx.New()
    
    // 设置
    g.Redis().Set(ctx, &quot;key&quot;, &quot;value&quot;)
    
    // 获取
    value, _ := g.Redis().Get(ctx, &quot;key&quot;)
    
    // 删除
    g.Redis().Del(ctx, &quot;key&quot;)
    
    // 哈希操作
    g.Redis().HSet(ctx, &quot;user:1&quot;, &quot;name&quot;, &quot;John&quot;)
    g.Redis().HGet(ctx, &quot;user:1&quot;, &quot;name&quot;)
    
    // 列表操作
    g.Redis().LPush(ctx, &quot;list&quot;, &quot;item1&quot;, &quot;item2&quot;)
    g.Redis().LRange(ctx, &quot;list&quot;, 0, -1)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;十、常用工具&lt;/h2&gt;
&lt;p&gt;GoFrame 提供了丰富的工具函数：&lt;/p&gt;
&lt;h3&gt;字符串处理 (gstr)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;import &quot;github.com/gogf/gf/v2/util/gstr&quot;

// 包含判断
gstr.Contains(&quot;hello world&quot;, &quot;world&quot;)

// 分割
gstr.Split(&quot;a,b,c&quot;, &quot;,&quot;)

// 替换
gstr.Replace(&quot;hello world&quot;, &quot;world&quot;, &quot;Go&quot;)

// 大小写转换
gstr.ToLower(&quot;HELLO&quot;)
gstr.ToUpper(&quot;hello&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;类型转换 (gconv)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;import &quot;github.com/gogf/gf/v2/util/gconv&quot;

// 转换为字符串
gconv.String(123)

// 转换为整数
gconv.Int(&quot;456&quot;)

// 转换为浮点数
gconv.Float64(&quot;3.14&quot;)

// 转换为切片
gconv.Ints(&quot;1,2,3&quot;)

// 转换为 Map
gconv.Map(jsonStr)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;JSON 处理 (gjson)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;import &quot;github.com/gogf/gf/v2/encoding/gjson&quot;

// 解析 JSON
j, _ := gjson.DecodeToJson(jsonBytes)

// 获取值
name := j.Get(&quot;user.name&quot;).String()
age := j.Get(&quot;user.age&quot;).Int()

// 转换为 Map
data := j.Map()
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;并发 Map (gmap)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;import &quot;github.com/gogf/gf/v2/container/gmap&quot;

// 创建线程安全 Map
m := gmap.New()

// 设置
m.Set(&quot;key&quot;, &quot;value&quot;)

// 获取
value := m.Get(&quot;key&quot;)

// 删除
m.Remove(&quot;key&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;MD5 加密&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;import &quot;github.com/gogf/gf/v2/crypto/gmd5&quot;

// MD5 加密
hash := gmd5.EncryptString(&quot;password&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;十一、项目资源&lt;/h2&gt;
&lt;h3&gt;代码仓库&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: https://github.com/goflyfox/gfstudy&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gitee&lt;/strong&gt;: https://gitee.com/goflyfox/gfstudy&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;教程目录&lt;/h3&gt;
&lt;p&gt;gfstudy 项目提供了完整的 GoFrame 基础教程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;GoFrame 介绍&lt;/li&gt;
&lt;li&gt;GoFrame 环境搭建&lt;/li&gt;
&lt;li&gt;GoFrame 的 Web 服务介绍&lt;/li&gt;
&lt;li&gt;GoFrame 请求与响应&lt;/li&gt;
&lt;li&gt;GoFrame 路由注册&lt;/li&gt;
&lt;li&gt;GoFrame 中间件&lt;/li&gt;
&lt;li&gt;GoFrame 的 HTTP 客户端&lt;/li&gt;
&lt;li&gt;GoFrame 配置管理&lt;/li&gt;
&lt;li&gt;GoFrame 日志管理&lt;/li&gt;
&lt;li&gt;GoFrame 数据库&lt;/li&gt;
&lt;li&gt;GoFrame Redis&lt;/li&gt;
&lt;li&gt;GoFrame 常用工具&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;视频教程&lt;/h3&gt;
&lt;p&gt;Bilibili 教程：GoFrame 基础教程 - 快速入门&lt;/p&gt;
&lt;h3&gt;交流方式&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;QQ 交流群&lt;/strong&gt;: 479196644&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;GoFrame 作为一款成熟的 Go Web 框架，提供了从基础 HTTP 服务到数据库操作、缓存管理、日志记录等全方位的支持。通过模块化的设计和丰富的工具库，开发者可以快速搭建高性能的 Web 应用。&lt;/p&gt;
&lt;p&gt;本文介绍了 GoFrame 的核心功能和使用方法，更多详细内容可以参考 gfstudy 项目的完整教程和示例代码。&lt;/p&gt;
</content:encoded></item><item><title>GManager - 基于 GoFrame V2 的后台管理系统</title><link>https://www.jflyfox.com/posts/gmanager/</link><guid isPermaLink="true">https://www.jflyfox.com/posts/gmanager/</guid><description>介绍 GManager，一个基于 GoFrame V2 框架的后台管理系统，支持登录认证、用户角色权限管理、菜单配置、日志记录等功能</description><pubDate>Wed, 13 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;项目简介&lt;/h2&gt;
&lt;p&gt;GManager 是一个基于 GoFrame V2 框架开发的后台管理系统。后端采用 Go 语言结合 GoFrame 框架，前端基于 Vue3 + Vite + TypeScript + Element-Plus 构建，是一个完整的前后端分离的管理平台解决方案。&lt;/p&gt;
&lt;h3&gt;核心特性&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;后端框架&lt;/strong&gt;: GoFrame V2&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;前端技术栈&lt;/strong&gt;: Vue3 + Vite + TypeScript + Element-Plus&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;认证方式&lt;/strong&gt;: 使用 gtoken 支持集群部署&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据库&lt;/strong&gt;: MySQL&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;功能模块&lt;/h2&gt;
&lt;h3&gt;1. 部门管理&lt;/h3&gt;
&lt;p&gt;配置系统组织机构信息，支持多层级部门结构管理。&lt;/p&gt;
&lt;h3&gt;2. 用户管理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;用户添加与配置&lt;/li&gt;
&lt;li&gt;用户权限分配&lt;/li&gt;
&lt;li&gt;帐号状态管理&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. 角色管理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;角色菜单权限分配&lt;/li&gt;
&lt;li&gt;支持菜单权限和按钮权限设置&lt;/li&gt;
&lt;li&gt;灵活的角色权限配置&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. 菜单管理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;配置系统菜单&lt;/li&gt;
&lt;li&gt;按钮权限管理&lt;/li&gt;
&lt;li&gt;动态菜单加载&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5. 配置管理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;系统参数动态配置&lt;/li&gt;
&lt;li&gt;数据字典配置&lt;/li&gt;
&lt;li&gt;运行时配置更新&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6. 日志管理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;登录日志记录&lt;/li&gt;
&lt;li&gt;登出日志记录&lt;/li&gt;
&lt;li&gt;业务增删改操作记录&lt;/li&gt;
&lt;li&gt;操作审计追踪&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7. 其他功能&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;用户登录/认证/登出&lt;/li&gt;
&lt;li&gt;访问统计&lt;/li&gt;
&lt;li&gt;权限验证&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;快速开始&lt;/h2&gt;
&lt;h3&gt;环境要求&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Go 1.18+&lt;/li&gt;
&lt;li&gt;Node.js 20+&lt;/li&gt;
&lt;li&gt;pnpm 9+&lt;/li&gt;
&lt;li&gt;MySQL 5.7+&lt;/li&gt;
&lt;li&gt;Hugo (可选，用于文档)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;后端部署&lt;/h3&gt;
&lt;h4&gt;1. 克隆项目&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/goflyfox/gmanager
cd gmanager
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;2. 数据库配置&lt;/h4&gt;
&lt;p&gt;安装 MySQL 数据库并运行初始化脚本：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 运行 SQL 脚本
mysql -u root -p &amp;lt; resource/sql/gmanager.sql
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;3. 配置文件&lt;/h4&gt;
&lt;p&gt;复制配置文件并修改数据库连接：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd server
cp manifest/config/config.example.yaml manifest/config/config.yaml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编辑 &lt;code&gt;config.yaml&lt;/code&gt;，修改数据库配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 数据库配置
database:
  default:
    link: &quot;mysql:root:123456@tcp(127.0.0.1:3306)/gmanager&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;4. 启动后端服务&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;cd server
go mod tidy
go run main.go
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;访问 &lt;code&gt;http://localhost:8000/ping&lt;/code&gt; 验证后端服务，返回 &lt;code&gt;pong&lt;/code&gt; 表示部署成功。&lt;/p&gt;
&lt;h3&gt;前端部署&lt;/h3&gt;
&lt;h4&gt;1. 安装依赖&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;cd web
pnpm install
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;2. 启动开发服务器&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;pnpm run dev
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;3. 访问系统&lt;/h4&gt;
&lt;p&gt;浏览器访问 &lt;code&gt;http://localhost:3000&lt;/code&gt;，使用默认账号登录：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;账号&lt;/strong&gt;: admin&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;密码&lt;/strong&gt;: 123456&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;项目结构&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;gmanager/
├── server/                 # 后端 Go 代码
│   ├── manifest/
│   │   └── config/        # 配置文件
│   ├── api/               # API 接口
│   ├── logic/             # 业务逻辑
│   └── model/             # 数据模型
├── web/                   # 前端 Vue3 代码
│   ├── src/
│   │   ├── api/          # API 调用
│   │   ├── components/   # 组件
│   │   ├── views/        # 页面
│   │   └── utils/        # 工具函数
└── resource/
    └── sql/              # 数据库脚本
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;技术亮点&lt;/h2&gt;
&lt;h3&gt;1. GoFrame V2 框架&lt;/h3&gt;
&lt;p&gt;GoFrame 是一款模块化、高性能的 Go 语言开发框架，提供了丰富的基础组件和工具函数，大大提升了开发效率。&lt;/p&gt;
&lt;h3&gt;2. gtoken 认证&lt;/h3&gt;
&lt;p&gt;使用 gtoken 实现用户认证，支持集群部署，解决了分布式环境下的会话共享问题。&lt;/p&gt;
&lt;h3&gt;3. 前后端分离&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;后端&lt;/strong&gt;: 提供 RESTful API 接口&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;前端&lt;/strong&gt;: Vue3 + TypeScript 构建响应式界面&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;通信&lt;/strong&gt;: Axios 进行 HTTP 通信&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. 权限管理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;RBAC（基于角色的访问控制）模型&lt;/li&gt;
&lt;li&gt;菜单权限和按钮权限双重控制&lt;/li&gt;
&lt;li&gt;动态权限加载&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;演示地址&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;在线演示&lt;/strong&gt;: &lt;a href=&quot;https://gmanager.jflyfox.com/&quot;&gt;https://gmanager.jflyfox.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;演示账号&lt;/strong&gt;: admin / 123456&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;项目地址&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href=&quot;https://github.com/goflyfox/gmanager&quot;&gt;https://github.com/goflyfox/gmanager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gitee&lt;/strong&gt;: &lt;a href=&quot;https://gitee.com/goflyfox/gmanager&quot;&gt;https://gitee.com/goflyfox/gmanager&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;开源协议&lt;/h2&gt;
&lt;p&gt;本项目采用 Apache License 2.0 开源协议。&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;GManager 是一个功能完善的后台管理系统，适合学习和实际项目使用。项目代码结构清晰，注释完善，非常适合学习 GoFrame 框架和 Vue3 开发。如果你正在寻找一个后台管理系统的起点，或者想学习 Go 语言全栈开发，GManager 是一个不错的选择。&lt;/p&gt;
&lt;h2&gt;参考资源&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://goframe.org/&quot;&gt;GoFrame 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://vuejs.org/&quot;&gt;Vue3 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://element-plus.org/&quot;&gt;Element-Plus 组件库&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>GToken 介绍 - 基于 GoFrame 的 Token 认证插件</title><link>https://www.jflyfox.com/posts/gtoken/</link><guid isPermaLink="true">https://www.jflyfox.com/posts/gtoken/</guid><description>GToken 是一个基于 GoFrame 框架的 token 插件，通过服务端验证方式实现 token 认证，支持集群模式，适用于企业生产级使用。</description><pubDate>Tue, 22 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;什么是 GToken？&lt;/h2&gt;
&lt;p&gt;GToken 是一个基于 GoFrame 框架开发的 token 认证插件，通过服务端验证方式实现 token 认证。它已经完全可以支撑线上 token 认证，并通过 Redis 支持集群模式。&lt;/p&gt;
&lt;h3&gt;版本适配&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GoFrame v2.X.X&lt;/strong&gt;：使用 gtoken v2.x 版本&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GoFrame v1.X.X&lt;/strong&gt;：使用 gtoken v1.4.x 版本&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;GToken 的优势&lt;/h2&gt;
&lt;p&gt;相比传统的 JWT 方案，GToken 具有以下显著优势：&lt;/p&gt;
&lt;h3&gt;1. 支持服务端退出&lt;/h3&gt;
&lt;p&gt;有效的避免了 JWT 服务端无法退出问题。在 JWT 方案中，一旦令牌颁发，在过期前都无法主动使其失效，而 GToken 通过服务端存储，可以随时销毁令牌。&lt;/p&gt;
&lt;h3&gt;2. 令牌可作废&lt;/h3&gt;
&lt;p&gt;解决 JWT 无法作废已颁布的令牌，只能等到令牌过期问题。通过服务端存储，可以随时调用 &lt;code&gt;Destroy&lt;/code&gt; 方法使令牌立即失效。&lt;/p&gt;
&lt;h3&gt;3. 高效的扩展信息存储&lt;/h3&gt;
&lt;p&gt;通过用户扩展信息存储在服务端，有效规避了 JWT 携带大量用户扩展信息导致降低传输效率问题。JWT 需要在每个请求的 token 中携带用户信息，而 GToken 只在服务端存储，客户端只保存 token 本身。&lt;/p&gt;
&lt;h3&gt;4. 自动续期&lt;/h3&gt;
&lt;p&gt;有效避免 JWT 需要客户端实现续签功能，增加客户端复杂度。GToken 支持服务端自动续期，客户端不需要关心续签逻辑。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 通过 MaxRefresh 配置，默认当用户第五天访问时，自动续期
// 超时时间 默认 10 天
Timeout int
// 缓存刷新时间 默认为超时时间的一半
MaxRefresh int
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;特性说明&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;支持 token 认证&lt;/strong&gt;：不强依赖于 session 和 cookie，适用 JWT 和 session 认证所有场景&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多种缓存模式&lt;/strong&gt;：支持单机 gcache 和集群 gredis 模式&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// 缓存模式 1 gcache 2 gredis 3 fileCache
CacheMode = 2
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;安装&lt;/h2&gt;
&lt;p&gt;获取最新版本：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;go get -u -v github.com/goflyfox/gtoken/v2
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;快速开始&lt;/h2&gt;
&lt;h3&gt;1. 初始化配置&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;import (
    &quot;github.com/goflyfox/gtoken/v2&quot;
)

// 创建 gtoken 对象
gfToken := gtoken.NewDefaultToken(gtoken.Options{
    CacheMode:    2,              // 1 gcache 2 gredis 3 fileCache
    CachePreKey:  &quot;GToken:&quot;,      // 缓存 key 前缀
    Timeout:      10 * 24 * 3600, // 超时时间 10 天（秒）
    MaxRefresh:   5 * 24 * 3600,  // 缓存刷新时间 5 天（秒）
    TokenDelimiter: &quot;_&quot;,          // Token 分隔符
    EncryptKey:   &quot;12345678912345678912345678912345&quot;, // Token 加密 key
    MultiLogin:   false,          // 是否支持多端登录
    AuthExcludePaths: []string{&quot;/login&quot;, &quot;/register&quot;}, // 拦截排除地址
})
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 注册认证中间件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;s := ghttp.NewServer()
s.SetPort(8199)

s.Group(&quot;/&quot;, func(group *ghttp.RouterGroup) {
    group.Middleware(CORS)
    // 注册 GfToken 中间件
    group.Middleware(gtoken.NewDefaultMiddleware(gfToken).Auth)
    
    // 需要认证的路由
    group.ALL(&quot;/system/data&quot;, func(r *ghttp.Request) {
        // 获取登陆信息
        ctx := r.Context()
        userKey := r.GetCtxVar(gtoken.KeyUserKey).String()
        _, data, err := gfToken.Get(ctx, userKey)
        if err != nil {
            r.Response.WriteJson(g.Map{&quot;code&quot;: 500, &quot;msg&quot;: err.Error()})
            return
        }
        r.Response.WriteJson(g.Map{&quot;code&quot;: 0, &quot;data&quot;: data})
    })
    
    // 登出路由
    group.ALL(&quot;/user/logout&quot;, func(r *ghttp.Request) {
        ctx := r.Context()
        userKey := r.GetCtxVar(gtoken.KeyUserKey).String()
        _ = gfToken.Destroy(ctx, userKey)
        r.Response.WriteJson(g.Map{&quot;code&quot;: 0, &quot;msg&quot;: &quot;user logout&quot;})
    })
})
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 登录生成 Token&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;s.BindHandler(&quot;/login&quot;, func(r *ghttp.Request) {
    ctx := r.Context()
    username := r.Get(&quot;username&quot;).String()
    password := r.Get(&quot;password&quot;).String()
    
    // 验证用户名密码（这里省略验证逻辑）
    if !validateUser(username, password) {
        r.Response.WriteJson(g.Map{&quot;code&quot;: 401, &quot;msg&quot;: &quot;invalid credentials&quot;})
        return
    }
    
    // 认证成功调用 Generate 生成 Token
    token, err := gfToken.Generate(ctx, username, &quot;1&quot;)
    if err != nil {
        r.Response.WriteJson(g.Map{&quot;code&quot;: 500, &quot;msg&quot;: err.Error()})
        r.ExitAll()
        return
    }
    
    r.Response.WriteJson(g.Map{
        &quot;code&quot;: 0,
        &quot;data&quot;: g.Map{
            gtoken.KeyUserKey: username,
            gtoken.KeyToken:   token,
        },
    })
})

func validateUser(username, password string) bool {
    // 实现用户验证逻辑
    return true
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;配置项说明&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;配置字段&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;缓存模式&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CacheMode&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1 gcache 2 gredis 3 fileCache 默认 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;缓存 key&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CachePreKey&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;默认缓存前缀 GToken:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;超时时间&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Timeout&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;默认 10 天（秒）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;缓存刷新时间&lt;/td&gt;
&lt;td&gt;&lt;code&gt;MaxRefresh&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;默认为超时时间的一半（秒）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Token 分隔符&lt;/td&gt;
&lt;td&gt;&lt;code&gt;TokenDelimiter&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;默认 &lt;code&gt;_&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Token 加密 key&lt;/td&gt;
&lt;td&gt;&lt;code&gt;EncryptKey&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;默认 12345678912345678912345678912345&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;是否支持多端登录&lt;/td&gt;
&lt;td&gt;&lt;code&gt;MultiLogin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;默认 false&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;拦截排除地址&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AuthExcludePaths&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;此路径列表不进行认证&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;拦截返回函数&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ResFun&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;认证失败返回函数，默认返回 Code：300&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;使用建议&lt;/h2&gt;
&lt;p&gt;由于中间件采用洋葱模型，注册 &lt;code&gt;MiddlewareAuth&lt;/code&gt; 认证中间件时，建议放在：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;在 &lt;code&gt;MiddlewareCORS&lt;/code&gt; 之后&lt;/strong&gt;：确保跨域处理优先&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;在用户权限 &lt;code&gt;MiddlewareUserPermissions&lt;/code&gt; 认证之前&lt;/strong&gt;：确保先认证再授权&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;在 Response 处理 &lt;code&gt;MiddlewareHandlerResponse&lt;/code&gt; 之前&lt;/strong&gt;：确保响应处理正确&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;s.Group(&quot;/&quot;, func(group *ghttp.RouterGroup) {
    group.Middleware(CORS)                    // 1. CORS 中间件
    group.Middleware(gtoken.NewDefaultMiddleware(gfToken).Auth) // 2. Token 认证
    group.Middleware(MiddlewareUserPermissions) // 3. 权限验证
    // ... 业务路由
})
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;项目扩展&lt;/h2&gt;
&lt;h3&gt;GToken-JWT&lt;/h3&gt;
&lt;p&gt;如果需要短期 token 场景，可以使用 &lt;a href=&quot;https://github.com/goflyfox/gtoken-jwt&quot;&gt;gtoken-jwt&lt;/a&gt;，这是基于 gtoken 的 JWT 扩展。&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;GToken 是一个功能完善、适用于企业生产级的 token 认证插件。它通过服务端存储的方式，有效解决了 JWT 的多个痛点问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ 支持服务端主动退出&lt;/li&gt;
&lt;li&gt;✅ 令牌可随时作废&lt;/li&gt;
&lt;li&gt;✅ 高效的扩展信息存储&lt;/li&gt;
&lt;li&gt;✅ 服务端自动续期&lt;/li&gt;
&lt;li&gt;✅ 支持单机和集群模式&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你的项目基于 GoFrame 框架，并且需要可靠的 token 认证方案，GToken 是一个值得考虑的选择。&lt;/p&gt;
&lt;h2&gt;参考资源&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gitee&lt;/strong&gt;: https://gitee.com/goflyfox/gtoken&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: https://github.com/goflyfox/gtoken&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GoFrame&lt;/strong&gt;: https://github.com/gogf/gf&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Gostudy - Golang 基础教程快速入门</title><link>https://www.jflyfox.com/posts/gostudy/</link><guid isPermaLink="true">https://www.jflyfox.com/posts/gostudy/</guid><description>推荐一个优质的 Go 语言学习资源：gostudy 基础教程，包含完整的视频教程和代码示例，适合快速入门 Go 语言</description><pubDate>Tue, 13 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;项目介绍&lt;/h2&gt;
&lt;p&gt;今天给大家推荐一个优质的 Go 语言学习资源：&lt;strong&gt;gostudy&lt;/strong&gt;，这是一个 golang 基础教程项目，旨在帮助开发者快速入门 Go 语言。&lt;/p&gt;
&lt;h3&gt;项目地址&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gitee&lt;/strong&gt;: &lt;a href=&quot;https://gitee.com/goflyfox/gostudy&quot;&gt;https://gitee.com/goflyfox/gostudy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href=&quot;https://github.com/goflyfox/gostudy&quot;&gt;https://github.com/goflyfox/gostudy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开源协议&lt;/strong&gt;: Apache-2.0&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;教程内容&lt;/h2&gt;
&lt;p&gt;教程涵盖了 Go 语言的核心知识点，从入门到进阶，内容包括：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Go 语言介绍&lt;/strong&gt; - 语言特性、应用场景&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安装部署&lt;/strong&gt; - 环境配置、第一个程序&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开发工具&lt;/strong&gt; - Goland、VSCode 等工具介绍&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Go Modules&lt;/strong&gt; - 包管理工具使用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;基础语法&lt;/strong&gt; - 变量、常量、控制结构&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;常用数据结构&lt;/strong&gt; - 数组、切片、Map&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;函数&lt;/strong&gt; - 函数定义、返回值、可变参数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;指针与结构体&lt;/strong&gt; - 指针操作、结构体定义&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;接口&lt;/strong&gt; - 接口定义与实现&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;错误处理&lt;/strong&gt; - error 处理机制&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;协程与通道&lt;/strong&gt; - Goroutine、Channel、Select&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;常用工具函数&lt;/strong&gt; - 标准库常用函数&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;教程视频&lt;/h2&gt;
&lt;p&gt;项目提供了多个平台的视频教程，方便不同习惯的学习者：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;平台&lt;/th&gt;
&lt;th&gt;地址&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;腾讯课堂&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://ke.qq.com/course/2585401&quot;&gt;golang 基础教程 - 快速入门 go 语言&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bilibili&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.bilibili.com/video/av94410029&quot;&gt;golang 基础教程 - 快速入门 go 语言&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;西瓜视频&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.ixigua.com/pseries/6809291194665796100/&quot;&gt;golang 基础教程 - 快速入门 go 语言&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;学习建议&lt;/h2&gt;
&lt;h3&gt;1. 循序渐进&lt;/h3&gt;
&lt;p&gt;按照教程目录顺序学习，每个章节的源码都放在对应编号前缀的目录中：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gostudy/
├── 03.hello/          # Hello World 示例
├── 04.goland/         # Goland 配置
├── 05.modules/        # Go Modules 示例
├── 06.basic/          # 基础语法
├── 07.data/           # 数据结构
├── 08.func/           # 函数示例
├── 09.ptrAndStruct/   # 指针与结构体
├── 10.errors/         # 错误处理
├── 11.goRoutines/     # 协程示例
└── 12.tools/          # 常用工具
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 动手实践&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;观看视频教程理解概念&lt;/li&gt;
&lt;li&gt;下载源码本地运行&lt;/li&gt;
&lt;li&gt;修改代码尝试不同场景&lt;/li&gt;
&lt;li&gt;完成课后练习巩固知识&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. 参考文档&lt;/h3&gt;
&lt;p&gt;学习过程中可以参考官方文档：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://golang.org/doc/&quot;&gt;Go 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://studygolang.com/pkgdoc&quot;&gt;Go 中文文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gobyexample.com/&quot;&gt;Go by Example&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;项目特色&lt;/h2&gt;
&lt;p&gt;✨ &lt;strong&gt;内容丰富&lt;/strong&gt;: 涵盖 Go 语言核心知识点&lt;br /&gt;
🎯 &lt;strong&gt;快速入门&lt;/strong&gt;: 适合零基础学习者&lt;br /&gt;
📺 &lt;strong&gt;视频教程&lt;/strong&gt;: 多平台视频资源&lt;br /&gt;
💻 &lt;strong&gt;代码示例&lt;/strong&gt;: 每个章节都有配套源码&lt;br /&gt;
📖 &lt;strong&gt;持续更新&lt;/strong&gt;: 维护活跃的开源项目&lt;br /&gt;
👥 &lt;strong&gt;社区支持&lt;/strong&gt;: QQ 交流群 47919644&lt;/p&gt;
&lt;h2&gt;适合人群&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;✅ 想学习 Go 语言的开发者&lt;/li&gt;
&lt;li&gt;✅ 有其他语言基础想转 Go 的程序员&lt;/li&gt;
&lt;li&gt;✅ 计算机相关专业学生&lt;/li&gt;
&lt;li&gt;✅ 对后端开发感兴趣的初学者&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;gostudy 是一个非常适合 Go 语言初学者的入门教程，内容系统全面，配有详细的视频教程和丰富的代码示例。无论你是零基础入门，还是有其他语言基础想学习 Go，这个教程都能帮助你快速上手。&lt;/p&gt;
&lt;p&gt;推荐大家收藏学习，边看视频边动手实践，相信很快就能掌握 Go 语言的核心技能！&lt;/p&gt;
</content:encoded></item><item><title>JFinal CMS - 基于 JFinal 的功能强大的信息咨询网站</title><link>https://www.jflyfox.com/posts/jfinalcms/</link><guid isPermaLink="true">https://www.jflyfox.com/posts/jfinalcms/</guid><description>JFinal CMS 是一个 Java 开发的功能强大的信息咨询网站，采用 JFinal 框架、Beetl 模板引擎和 Bootstrap 前端框架，支持多种实用功能。</description><pubDate>Wed, 13 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;JFinal CMS - 基于 JFinal 的功能强大的信息咨询网站&lt;/h1&gt;
&lt;p&gt;JFinal CMS 是一个使用 Java 开发的功能强大的信息咨询网站（CMS），采用了简洁强大的 JFinal 作为 Web 框架，模板引擎使用的是 Beetl，数据库采用 MySQL，前端使用 Bootstrap 框架。&lt;/p&gt;
&lt;h2&gt;项目简介&lt;/h2&gt;
&lt;p&gt;JFinal CMS 不仅是一个简单的内容管理系统，更是一个功能完善的企业级网站解决方案。它支持 OAuth2 认证、用户注册、密码加密、评论及回复、消息提示、网站访问量统计、文章评论数和浏览量统计等功能。&lt;/p&gt;
&lt;h3&gt;技术栈&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Web 框架&lt;/strong&gt;: JFinal - 简洁强大的 Java Web 框架&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模板引擎&lt;/strong&gt;: Beetl - 高性能 Java 模板引擎&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据库&lt;/strong&gt;: MySQL - 关系型数据库&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;前端框架&lt;/strong&gt;: Bootstrap - 响应式前端框架&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;认证方式&lt;/strong&gt;: OAuth2、本地账号认证&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;核心功能&lt;/h2&gt;
&lt;h3&gt;用户功能&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OAuth2 认证&lt;/strong&gt;: 支持第三方登录&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;账号注册&lt;/strong&gt;: 用户自主注册功能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;密码加密&lt;/strong&gt;: 保障用户账号安全&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多端登录&lt;/strong&gt;: 支持多设备同时在线&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;内容管理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;文章管理&lt;/strong&gt;: 文章的增删改查、草稿、发布&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;评论系统&lt;/strong&gt;: 支持文章评论及回复功能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;消息通知&lt;/strong&gt;: 实时消息提示&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据统计&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;网站访问量统计&lt;/li&gt;
&lt;li&gt;文章评论数统计&lt;/li&gt;
&lt;li&gt;文章浏览量统计&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;后台管理模块&lt;/h3&gt;
&lt;p&gt;JFinal CMS 的后台管理功能非常丰富，包含以下模块：&lt;/p&gt;
&lt;h4&gt;内容管理&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;栏目管理&lt;/strong&gt;: 网站栏目的创建、编辑、删除&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;栏目公告&lt;/strong&gt;: 每个栏目的公告管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;栏目滚动图片&lt;/strong&gt;: 栏目轮播图管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文章管理&lt;/strong&gt;: 文章内容管理、审核、发布&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回复管理&lt;/strong&gt;: 用户评论回复管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;意见反馈&lt;/strong&gt;: 用户反馈收集与管理&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;多媒体管理&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;我的相册&lt;/strong&gt;: 个人相册管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;相册管理&lt;/strong&gt;: 系统相册分类管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;图片管理&lt;/strong&gt;: 图片上传、分类、管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;专辑管理&lt;/strong&gt;: 内容专辑管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;视频管理&lt;/strong&gt;: 视频内容管理&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;系统管理&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;缓存更新&lt;/strong&gt;: 系统缓存管理与更新&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;友情链接&lt;/strong&gt;: 友情链接管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;访问统计&lt;/strong&gt;: 网站访问数据统计分析&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;联系人管理&lt;/strong&gt;: 联系人信息管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模板管理&lt;/strong&gt;: 网站模板管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;组织机构管理&lt;/strong&gt;: 组织架构管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用户管理&lt;/strong&gt;: 系统用户管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;角色管理&lt;/strong&gt;: 角色权限管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;菜单管理&lt;/strong&gt;: 系统菜单配置&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据字典管理&lt;/strong&gt;: 系统数据字典维护&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;项目特点&lt;/h2&gt;
&lt;h3&gt;1. 简洁高效的架构&lt;/h3&gt;
&lt;p&gt;采用 JFinal 框架，遵循&quot;简洁即强大&quot;的设计理念，代码量少，易于理解和维护。&lt;/p&gt;
&lt;h3&gt;2. 高性能模板引擎&lt;/h3&gt;
&lt;p&gt;使用 Beetl 模板引擎，具有以下优势：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;高性能：渲染速度快&lt;/li&gt;
&lt;li&gt;易学易用：语法简洁&lt;/li&gt;
&lt;li&gt;功能强大：支持自定义函数&lt;/li&gt;
&lt;li&gt;错误提示友好&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. 响应式设计&lt;/h3&gt;
&lt;p&gt;前端采用 Bootstrap 框架，实现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;响应式布局，适配多种设备&lt;/li&gt;
&lt;li&gt;丰富的 UI 组件&lt;/li&gt;
&lt;li&gt;良好的用户体验&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. 完善的安全机制&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;密码加密存储&lt;/li&gt;
&lt;li&gt;OAuth2 认证支持&lt;/li&gt;
&lt;li&gt;权限管理&lt;/li&gt;
&lt;li&gt;SQL 注入防护&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5. 数据统计与分析&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;实时访问量统计&lt;/li&gt;
&lt;li&gt;用户行为分析&lt;/li&gt;
&lt;li&gt;内容热度统计&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;快速开始&lt;/h2&gt;
&lt;h3&gt;环境要求&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;JDK 1.8+&lt;/li&gt;
&lt;li&gt;MySQL 5.7+&lt;/li&gt;
&lt;li&gt;Maven 3.6+&lt;/li&gt;
&lt;li&gt;Tomcat 8.0+（或其他 Java Web 服务器）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;项目结构&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;jfinal_cms/
├── src/
│   ├── main/
│   │   ├── java/          # Java 源代码
│   │   ├── resources/     # 配置文件
│   │   └── webapp/        # Web 资源
│   │       ├── WEB-INF/
│   │       │   └── view/  # Beetl 模板
│   │       ├── static/    # 静态资源
│   │       └── assets/    # 前端资源
│   └── test/              # 测试代码
├── pom.xml                # Maven 配置
└── README.md              # 项目说明
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;配置步骤&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;克隆项目&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;git clone https://gitee.com/jflyfox/jfinal_cms.git
cd jfinal_cms
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;创建数据库&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;CREATE DATABASE jfinal_cms DEFAULT CHARACTER SET utf8mb4;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;导入 SQL 脚本&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;导入项目中的 SQL 初始化脚本到 MySQL 数据库。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;修改配置&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;修改 &lt;code&gt;src/main/resources/config.properties&lt;/code&gt; 配置文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 数据库配置
db.url=jdbc:mysql://localhost:3306/jfinal_cms?useUnicode=true&amp;amp;characterEncoding=utf8
db.user=root
db.password=your_password

# 应用配置
app.name=JFinal CMS
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;运行项目&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;mvn clean package
# 部署到 Tomcat 或使用 IDE 运行
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;访问系统&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;打开浏览器访问：&lt;code&gt;http://localhost:8080/jfinal_cms&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;功能演示&lt;/h2&gt;
&lt;h3&gt;前台功能&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;首页展示&lt;/li&gt;
&lt;li&gt;文章列表&lt;/li&gt;
&lt;li&gt;文章详情&lt;/li&gt;
&lt;li&gt;评论互动&lt;/li&gt;
&lt;li&gt;用户中心&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;后台功能&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;仪表盘：数据统计概览&lt;/li&gt;
&lt;li&gt;内容管理：栏目、文章、评论管理&lt;/li&gt;
&lt;li&gt;用户管理：用户、角色、权限管理&lt;/li&gt;
&lt;li&gt;系统管理：配置、字典、模板管理&lt;/li&gt;
&lt;li&gt;多媒体管理：图片、视频、相册管理&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;技术亮点&lt;/h2&gt;
&lt;h3&gt;1. JFinal 框架特性&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// 简洁的 Controller 定义
public class ArticleController extends Controller {
    public void index() {
        List&amp;lt;Article&amp;gt; articles = Article.dao.find(&quot;select * from article&quot;);
        setAttr(&quot;articles&quot;, articles);
        render(&quot;article_list.html&quot;);
    }
    
    public void detail() {
        Integer id = getParaToInt();
        Article article = Article.dao.findById(id);
        setAttr(&quot;article&quot;, article);
        render(&quot;article_detail.html&quot;);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. Beetl 模板示例&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;${article.title}&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;${article.title}&amp;lt;/h1&amp;gt;
    &amp;lt;div class=&quot;content&quot;&amp;gt;
        ${article.content}
    &amp;lt;/div&amp;gt;
    
    &amp;lt;!-- 评论列表 --&amp;gt;
    &amp;lt;% for(comment in comments) { %&amp;gt;
        &amp;lt;div class=&quot;comment&quot;&amp;gt;
            &amp;lt;p&amp;gt;${comment.content}&amp;lt;/p&amp;gt;
            &amp;lt;span&amp;gt;${comment.createTime}&amp;lt;/span&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;% } %&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 数据库操作&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// 使用 JFinal 的 ActiveRecord 插件
public class Article extends Model&amp;lt;Article&amp;gt; {
    public static final Article dao = new Article().dao();
    
    // 查询文章列表
    public List&amp;lt;Article&amp;gt; findLatest(int limit) {
        return find(&quot;select * from article order by create_time desc limit ?&quot;, limit);
    }
    
    // 增加浏览量
    public void incrementViews() {
        update(&quot;update article set views = views + 1 where id = ?&quot;, getId());
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;部署说明&lt;/h2&gt;
&lt;h3&gt;生产环境部署&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;打包项目&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;mvn clean package -DskipTests
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;部署到服务器&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;将生成的 WAR 包部署到 Tomcat 或其他 Web 服务器。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;配置生产数据库&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;修改数据库连接配置，使用生产环境数据库。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;配置域名和 SSL&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;配置 Nginx 反向代理和 HTTPS 证书。&lt;/p&gt;
&lt;h3&gt;Docker 部署&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;FROM tomcat:8.0-jre8
COPY target/jfinal_cms.war /usr/local/tomcat/webapps/
EXPOSE 8080
CMD [&quot;catalina.sh&quot;, &quot;run&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;项目优势&lt;/h2&gt;
&lt;h3&gt;对比其他 CMS&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;特性&lt;/th&gt;
&lt;th&gt;JFinal CMS&lt;/th&gt;
&lt;th&gt;WordPress&lt;/th&gt;
&lt;th&gt;Drupal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;技术栈&lt;/td&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;性能&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习曲线&lt;/td&gt;
&lt;td&gt;中等&lt;/td&gt;
&lt;td&gt;低&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;扩展性&lt;/td&gt;
&lt;td&gt;强&lt;/td&gt;
&lt;td&gt;强&lt;/td&gt;
&lt;td&gt;强&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;企业级支持&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;适用场景&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;✅ 企业官网&lt;/li&gt;
&lt;li&gt;✅ 资讯门户&lt;/li&gt;
&lt;li&gt;✅ 博客系统&lt;/li&gt;
&lt;li&gt;✅ 内容管理平台&lt;/li&gt;
&lt;li&gt;✅ 信息发布系统&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;开发建议&lt;/h2&gt;
&lt;h3&gt;1. 代码规范&lt;/h3&gt;
&lt;p&gt;遵循 Java 编码规范，保持代码整洁和可读性。&lt;/p&gt;
&lt;h3&gt;2. 性能优化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用缓存减少数据库查询&lt;/li&gt;
&lt;li&gt;静态资源使用 CDN 加速&lt;/li&gt;
&lt;li&gt;数据库查询添加索引&lt;/li&gt;
&lt;li&gt;启用 Gzip 压缩&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. 安全加固&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;定期更新依赖&lt;/li&gt;
&lt;li&gt;使用 HTTPS&lt;/li&gt;
&lt;li&gt;实施 CSRF 防护&lt;/li&gt;
&lt;li&gt;定期备份数据&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;项目资源&lt;/h2&gt;
&lt;h3&gt;代码仓库&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gitee&lt;/strong&gt;: https://gitee.com/jflyfox/jfinal_cms&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: https://github.com/jflyfox/jfinal_cms&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;相关技术文档&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;JFinal 官方文档&lt;/strong&gt;: http://www.jfinal.com/&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Beetl 官方文档&lt;/strong&gt;: http://ibeetl.com/&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bootstrap 官方文档&lt;/strong&gt;: https://getbootstrap.com/&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;交流方式&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;QQ 交流群&lt;/strong&gt;: 479196644&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;JFinal CMS 是一个功能完善、性能优秀的 Java CMS 系统。它采用简洁强大的 JFinal 框架，配合高性能的 Beetl 模板引擎和流行的 Bootstrap 前端框架，为企业和个人提供了一个优秀的网站建设解决方案。&lt;/p&gt;
&lt;p&gt;无论是用于学习 Java Web 开发，还是用于实际的企业项目建设，JFinal CMS 都是一个值得考虑的选择。其丰富的功能模块、清晰的代码结构和完善的文档，都能帮助开发者快速上手并构建高质量的网站系统。&lt;/p&gt;
</content:encoded></item></channel></rss>