303 lines
7.1 KiB
Markdown
303 lines
7.1 KiB
Markdown
|
|
# HoTime 快速上手指南
|
|||
|
|
|
|||
|
|
5 分钟入门 HoTime 框架。
|
|||
|
|
|
|||
|
|
## 安装
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
go get code.hoteas.com/golang/hotime
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 最小示例
|
|||
|
|
|
|||
|
|
```go
|
|||
|
|
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`:
|
|||
|
|
|
|||
|
|
```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 使用三层路由结构:`模块/控制器/方法`
|
|||
|
|
|
|||
|
|
```go
|
|||
|
|
appIns.Run(Router{
|
|||
|
|
"模块名": {
|
|||
|
|
"控制器名": {
|
|||
|
|
"方法名": func(that *Context) {
|
|||
|
|
// 处理逻辑
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
})
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 获取请求参数
|
|||
|
|
|
|||
|
|
```go
|
|||
|
|
// 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] // 方法
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 响应数据
|
|||
|
|
|
|||
|
|
```go
|
|||
|
|
// 标准 JSON 响应
|
|||
|
|
that.Display(0, Map{"data": "value"}) // 成功 code=0
|
|||
|
|
that.Display(1, "错误信息") // 失败 code=1
|
|||
|
|
|
|||
|
|
// 直接写入
|
|||
|
|
that.Resp.Write([]byte("raw data"))
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 中间件
|
|||
|
|
|
|||
|
|
```go
|
|||
|
|
// 全局中间件(请求拦截)
|
|||
|
|
appIns.SetConnectListener(func(that *Context) bool {
|
|||
|
|
// 检查登录状态
|
|||
|
|
if that.Session("user_id").Data == nil {
|
|||
|
|
that.Display(2, "请先登录")
|
|||
|
|
return true // 返回 true 终止请求
|
|||
|
|
}
|
|||
|
|
return false // 返回 false 继续处理
|
|||
|
|
})
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Session 与缓存
|
|||
|
|
|
|||
|
|
```go
|
|||
|
|
// 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
|
|||
|
|
|
|||
|
|
```go
|
|||
|
|
// 查询列表
|
|||
|
|
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})
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 链式查询
|
|||
|
|
|
|||
|
|
```go
|
|||
|
|
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}` |
|
|||
|
|
|
|||
|
|
### 事务
|
|||
|
|
|
|||
|
|
```go
|
|||
|
|
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 使用说明](HoTimeDB_使用说明.md)
|
|||
|
|
|
|||
|
|
## 扩展功能
|
|||
|
|
|
|||
|
|
| 功能 | 路径 | 说明 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| 微信支付/公众号/小程序 | `dri/wechat/` | 微信全套 SDK |
|
|||
|
|
| 阿里云服务 | `dri/aliyun/` | 企业认证等 |
|
|||
|
|
| 腾讯云服务 | `dri/tencent/` | 企业认证等 |
|
|||
|
|
| 文件上传 | `dri/upload/` | 文件上传处理 |
|
|||
|
|
| 文件下载 | `dri/download/` | 文件下载处理 |
|
|||
|
|
| MongoDB | `dri/mongodb/` | MongoDB 驱动 |
|
|||
|
|
| RSA 加解密 | `dri/rsa/` | RSA 加解密工具 |
|
|||
|
|
|
|||
|
|
## 完整示例
|
|||
|
|
|
|||
|
|
```go
|
|||
|
|
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,
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**下一步**:
|
|||
|
|
- [HoTimeDB 使用说明](HoTimeDB_使用说明.md) - 完整数据库教程
|
|||
|
|
- [HoTimeDB API 参考](HoTimeDB_API参考.md) - API 速查手册
|