hotime/docs/QUICKSTART.md
hoteas cf64276ab1 refactor(db): 重命名批量插入方法并更新文档
- 将 BatchInsert 方法重命名为 Inserts,以更好地反映其功能
- 更新示例代码和文档,确保使用新方法名
- 删除过时的文档文件,整合 HoTimeDB 使用说明和 API 参考
- 优化 README.md,增强框架特性和安装说明的清晰度
2026-01-22 20:32:29 +08:00

7.1 KiB
Raw Permalink Blame History

HoTime 快速上手指南

5 分钟入门 HoTime 框架。

安装

go get code.hoteas.com/golang/hotime

最小示例

package main

import (
    . "code.hoteas.com/golang/hotime"
    . "code.hoteas.com/golang/hotime/common"
)

func main() {
    appIns := Init("config/config.json")
    
    appIns.Run(Router{
        "app": {
            "test": {
                "hello": func(that *Context) {
                    that.Display(0, Map{"message": "Hello World"})
                },
            },
        },
    })
}

访问: http://localhost:8081/app/test/hello

配置文件

创建 config/config.json:

{
    "port": "8081",
    "mode": 2,
    "sessionName": "HOTIME",
    "tpt": "tpt",
    "defFile": ["index.html", "index.htm"],
    "db": {
        "mysql": {
            "host": "localhost",
            "port": "3306",
            "name": "your_database",
            "user": "root",
            "password": "your_password"
        }
    },
    "cache": {
        "memory": {
            "db": true,
            "session": true,
            "timeout": 7200
        }
    }
}
配置项 说明
port 服务端口
mode 0=生产, 1=测试, 2=开发(输出SQL)
tpt 静态文件目录
db 数据库配置
cache 缓存配置

路由系统

HoTime 使用三层路由结构:模块/控制器/方法

appIns.Run(Router{
    "模块名": {
        "控制器名": {
            "方法名": func(that *Context) {
                // 处理逻辑
            },
        },
    },
})

获取请求参数

// GET/POST 参数
name := that.Req.FormValue("name")

// JSON Body
that.Req.ParseForm()
data := that.Req.PostForm

// 获取路径参数
module := that.RouterPath[0]    // 模块
controller := that.RouterPath[1] // 控制器
action := that.RouterPath[2]     // 方法

响应数据

// 标准 JSON 响应
that.Display(0, Map{"data": "value"})  // 成功 code=0
that.Display(1, "错误信息")              // 失败 code=1

// 直接写入
that.Resp.Write([]byte("raw data"))

中间件

// 全局中间件(请求拦截)
appIns.SetConnectListener(func(that *Context) bool {
    // 检查登录状态
    if that.Session("user_id").Data == nil {
        that.Display(2, "请先登录")
        return true  // 返回 true 终止请求
    }
    return false  // 返回 false 继续处理
})

Session 与缓存

// Session 操作
that.Session("user_id", 123)          // 设置
userId := that.Session("user_id")     // 获取
that.Session("user_id", nil)          // 删除

// 通用缓存
that.Cache("key", "value")            // 设置
data := that.Cache("key")             // 获取
that.Cache("key", nil)                // 删除

三级缓存自动运作:Memory → Redis → Database

数据库操作(简要)

基础 CRUD

// 查询列表
users := that.Db.Select("user", "*", Map{"status": 1})

// 查询单条
user := that.Db.Get("user", "*", Map{"id": 1})

// 插入
id := that.Db.Insert("user", Map{"name": "test", "age": 18})

// 更新
rows := that.Db.Update("user", Map{"name": "new"}, Map{"id": 1})

// 删除
rows := that.Db.Delete("user", Map{"id": 1})

链式查询

users := that.Db.Table("user").
    LeftJoin("order", "user.id=order.user_id").
    Where("status", 1).
    And("age[>]", 18).
    Order("id DESC").
    Page(1, 10).
    Select("*")

条件语法速查

语法 说明 示例
key 等于 "id": 1
key[>] 大于 "age[>]": 18
key[<] 小于 "age[<]": 60
key[>=] 大于等于 "age[>=]": 18
key[<=] 小于等于 "age[<=]": 60
key[!] 不等于 "status[!]": 0
key[~] LIKE "name[~]": "test"
key[<>] BETWEEN "age[<>]": Slice{18, 60}
key IN "id": Slice{1, 2, 3}

事务

success := that.Db.Action(func(tx db.HoTimeDB) bool {
    tx.Update("user", Map{"balance[#]": "balance - 100"}, Map{"id": 1})
    tx.Insert("order", Map{"user_id": 1, "amount": 100})
    return true  // 返回 true 提交false 回滚
})

更多数据库操作:参见 HoTimeDB 使用说明

扩展功能

功能 路径 说明
微信支付/公众号/小程序 dri/wechat/ 微信全套 SDK
阿里云服务 dri/aliyun/ 企业认证等
腾讯云服务 dri/tencent/ 企业认证等
文件上传 dri/upload/ 文件上传处理
文件下载 dri/download/ 文件下载处理
MongoDB dri/mongodb/ MongoDB 驱动
RSA 加解密 dri/rsa/ RSA 加解密工具

完整示例

package main

import (
    . "code.hoteas.com/golang/hotime"
    . "code.hoteas.com/golang/hotime/common"
)

func main() {
    appIns := Init("config/config.json")
    
    // 登录检查中间件
    appIns.SetConnectListener(func(that *Context) bool {
        // 放行登录接口
        if that.RouterPath[2] == "login" {
            return false
        }
        if that.Session("user_id").Data == nil {
            that.Display(2, "请先登录")
            return true
        }
        return false
    })

    appIns.Run(Router{
        "api": {
            "user": {
                "login": func(that *Context) {
                    phone := that.Req.FormValue("phone")
                    password := that.Req.FormValue("password")
                    
                    user := that.Db.Get("user", "*", Map{
                        "phone": phone,
                        "password": password,
                    })
                    
                    if user == nil {
                        that.Display(1, "账号或密码错误")
                        return
                    }
                    
                    that.Session("user_id", user.GetInt64("id"))
                    that.Display(0, Map{"user": user})
                },
                
                "info": func(that *Context) {
                    userId := that.Session("user_id").ToInt64()
                    user := that.Db.Get("user", "*", Map{"id": userId})
                    that.Display(0, Map{"user": user})
                },
                
                "list": func(that *Context) {
                    page := that.Req.FormValue("page")
                    if page == "" {
                        page = "1"
                    }
                    
                    users := that.Db.Table("user").
                        Where("status", 1).
                        Order("id DESC").
                        Page(ObjToInt(page), 10).
                        Select("id,name,phone,created_at")
                    
                    total := that.Db.Count("user", Map{"status": 1})
                    
                    that.Display(0, Map{
                        "list":  users,
                        "total": total,
                    })
                },
            },
        },
    })
}

下一步