# tec **Repository Path**: agilecho/tec ## Basic Information - **Project Name**: tec - **Description**: GOLANG框架 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-06-01 - **Last Updated**: 2022-10-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ##1.第三方库 原库已集成至代码库,无须重新安装,部分代码已精简 更新至2022-04-21 github.com/robfig/cron.git github.com/gorilla/websocket.git github.com/stianeikeland/go-rpio.git ##2、安装 go get -u gitee.com/agilecho/tec ##3、项目 创建项目文件夹,例如demo,目录结构如下:
demo
    config
        dev.ini
    static
        静态资源文件
    tpl
        模板文件
    demo.go
    go.mod
dev.ini 全部参数示例:
[app]
name = demo
host = 0.0.0.0
port = 9500
token = token@2020
memory = 1024

[ws]
host = 0.0.0.0
port = 1234
path = /echo
token = token@2019
origin = *
version = 1

[redis]
host = 127.0.0.1
port = 6379
passwd =
database = 0
prefix =
pool = 5
active = 1
logs = LOG_PATH/redis

[cookie]
domain = demo.com
path = /
expire =
secure = false
httponly =
prefix =

[session]
type = file
path = ROOT_PATH/tmp
expire = 86400
prefix =

[template]
path = ROOT_PATH/tpl
extension = .html
define =

[mysql]
host = 127.0.0.1
port = 3306
user = root
passwd =
database = demo
charset = utf8mb4
deploy =
pool = 5
active = 1
timeout = 120
debug = true
logs = LOG_PATH/mysql

[mq]
host = 127.0.0.1
port = 5672
user = guest
passwd = guest
vhost = /
exchange = exchange
logs = LOG_PATH/mq

[cron]
test = */5 * * * * ?

项目中不使用,则删除节点 *WEB方式*
package main

import (
    "gitee.com/agilecho/tec"
    "gitee.com/agilecho/tec/cron"
)

func main() {
    app := tec.New()
    
    // 添加默认路由
    app.Router.Add("", func(ctx *tec.Context) {
        ctx.Text("hello world.")
    })
    // 应用启动时执行
    app.Start(func(app *tec.App) {
        cron.Add(app.Config.Cron.Schedules["test"], func() {
            fmt.Println(tec.Microtime())
        }).Start()
    })
    // 没有发现路由时执行
    app.Empty(func(ctx *tec.Context){
        ctx.Text("not find")
    })
    // 路由执行前过滤器
    app.Before(func(ctx *tec.Context) bool {
        fmt.Println("handler filter")
        return true
    })
    // 路由执行后过滤器
    app.After(func(ctx *tec.Context, method string, data interface{}) {
        fmt.Println("context response")
    })
    
    app.Run()
}

// 路由
app.Router.Add("地址", Handler)
地址规则:/模块/控制器/方法
空 解析结果 /home/index/index
/a/b/c 解析结果 /a/b/c
/a/b 解析结果 /a/b/index
/a 解析结果 /a/index/index

不支持地址变量
打开浏览器访问http://localhost:9500 *WebSocket方式*
package main

import (
    "gitee.com/agilecho/tec"
    "gitee.com/agilecho/tec/ws"
    "fmt"
)

func main() {
    app := tec.New()
    
    // 广播
    app.Bind("push", func(req *ws.Request) {
        fmt.Println("ws push")
    })
    
    // 连接
    app.Bind("connect", func(req *ws.Request) {
        fmt.Println("ws connect")
    })
    
    // 发送消息
    app.Bind("message", func (req *ws.Request, message string) {
        fmt.Println("ws message")
    })
    
    // 断开
    app.Bind("close", func(req *ws.Request) {
        fmt.Println("ws close")
    })
    
    app.RunWS()
}
*CLI方式*
package main

import (
    "fmt"
    "gitee.com/agilecho/tec"
)

func main() {
    tec.Cli(func() {
        fmt.Println("hello world")
    })

    // 如果需要监听
    tec.Notify()
}
##4、工具类 ###4.1.数据库 默认MySQL,支持主从库
// 添加记录
insertid := db.Insert("表名", db.Row{"字段名":"字段值", ...参数})
// 更新记录
affected := db.Update("表名", "SQL语句", db.Row{"字段名":"字段值", ...}, "WHERE条件", ...参数)
// 删除记录
affected := db.Delete("表名", "WHERE条件", ...参数)
// 获取单条记录
row := db.FetchFirst("SQL语句", ...参数)
// 获取多条记录
rows := db.FetchRows("SQL语句", ...参数)

// 事务
tx := db.Trans()
tx.Insert(...)
tx.Update(...)
err := tx.Commit()
if err != nil {
    tx.Rollback()
}

// 表操作
db.Table("表名").Insert(db.Row{})
db.Table("表名").Where("id", "=", 1).Update(db.Row{})
db.Table("表名").Where("id", "=", 1).Delete()
db.Table("表名").Where("id", "=", 1).First()
db.Table("表名").Alias("a").Join("xxx", "").Where("id", ">", 1).Rows()

// Where表达式
Where("id", 1)
Where("id = ?", 1)
Where("id = ?").Bind(1)
Where("id", "=", 1)

// 结构体
user := User{name:""}
users := []User{}

db.Table("表名").Save(&user)
db.Table("表名").Where().Find(&user)
db.Table("表名").Where().Search(&users)

// 自定义连接
database := db.New(&db.Config{
    Host: "127.0.0.1",
    Port: "3306",
    User: "root",
    Passwd: "mysql",
    Database: "test",
    Charset: "utf8mb4",
    Logs: tec.LOG_PATH + "/mysql",
})

// 手动关闭
database.Close()
###4.2.缓存 默认使用Redis
cache.常用方法,如Get、Set、SetNx、Incr

// 自定义连接
redis := cache.New(&cache.Config{
    Host: "127.0.0.1",
    Port: "6379", 
    Database: 0, 
    Prefix: "",
    Logs: tec.LOG_PATH + "/redis",
})

// 手动关闭
redis.Close()
###4.3.消息队列 默认使用RabbitMQ
// 发送
mq.DirectQueue("demo").Put("hello world.")

// 消费
go mq.DirectQueue("demo").Reserve(func(queue *mq.Queue, message *mq.Message) {
    fmt.Println(message.Body)
    queue.Delete(message)
})

// 自定义连接
rabbitMq := mq.New(&mq.Config{
    Host: "127.0.0.1",
    Port: "5672",
    User: "guest",
    Passwd:  "guest",
    VHost: "/",
    Exchange: "exchange",
    Logs: tec.LOG_PATH + "/mq",
})

// 手动关闭
rabbitMq.Close()
###4.4.图片
// 验证码
captcha := image.NewCaptcha(tec.Random(), 100, 10)
captcha.PNG()

// 图片处理
img := image.New("图片路径")
img.Circle(image.Option{Width:100, Height:100, image.Center, Target:"保存路径"})
img.Merge("图片路径", image.Option{})
img.Text("图片路径", image.Option{})
img.Thumb("图片路径", image.Option{})

img.Save()
###4.5.定时任务
// 定时任务
cron.Add("cron表达式", func() {
    fmt.Println("hello world.")
}).Start()
###4.7.Rpio
err := rpio.Open()

pin := rpio.Pin(10)

pin.Output()
pin.High()
pin.Low()
pin.Toggle()

pin.Input()
res := pin.Read()

pin.Mode(rpio.Output)
pin.Write(rpio.High)
pin.PullUp()
pin.PullDown()
pin.PullOff()

pin.Pull(rpio.PullUp)

rpio.Close()
##5、部署 1.编译 go build demo.go 2.打包 ./demo -zip 3.将demo.zip部署到服务器 4.进入服务器目录中执行
unzip demo.zip -d 指定目录

使用本机hostname配置文件ini
./demo >demo.log 2>&1 &

使用prod配置文件ini
./demo prod >demo.log 2>&1 &