golang-buffalo框架
时间:2022-07-25
本文章向大家介绍golang-buffalo框架,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
关于c.value("tx").(*pop.connection)
var s = x.(T) //语法为golang的类型断言, 如果x不为nil,且可以转换为T类型,则断言成功,返回一个T类型的变量 s, 如果T为接口,则要求x实现T,如果断言失败 panic
c.valule() //获取context中的值,关于tx在下面 buffalo.context返回值中说明
结构体中定义文件上传
c.Bind(posts)
//model中处理
type posts struct{
MyFile binding.File `-`
}
//调用AfterCreate方法在创建后上传文件
func (p *posts) AfterCreate(tx *pop.connection){
if !p.MyFile.Valid() {
return nil
}
dir := filepath.Join(".","uploads")
if err := os.MkdirAll(dir,0755);err != nil {
return errors.WithStack(err)
}
f,err := os.Create(fileppaht.join(dir,w.MyFile.Filename))
if err != nil{
return errors.WithStack(err)
}
defer f.Close()
_,err := io.Copy(f,w.MyFile)
return err
}
//eg
func (u *User) AfterSave(tx *pop.Connection) error {
tokened := strings.Split(u.Image, "/")
fileName := tokened[len(tokened)-1]
output, err := os.Create(fileName)
if err != nil {
return err
}
defer output.Close()
response, err := http.Get(u.Image)
if err != nil {
return err
}
defer response.Body.Close()
n, err := io.Copy(output, response.Body)
if err != nil {
return err
}
}
//action中处理
f,err := c.File("MyFile")
if err != nil {
return ...
}
...
定义日志记录器
func JSONLogger(lvl logger.Level) logger.FieldLogger {
f,err := os.OpenFile("./log.txt",os.O_RDWR|os.O_CREATE|os.O_APPEND, 0766)
if err != nil {
log.Fatal(err)
}
l := logrus.New()
l.Level = lvl
l.SetFormatter(&logrus.JSONFormatter{})
l.SetOutput(f)
return logger.Logrus{FieldLogger: l}
}
app = buffalo.New(buffalo.Options{
Env: ENV,
SessionName: "_cxy_session",
Logger: JSONLogger(logger.DebugLevel),
})
buffalo.context
返回值
type : map[string][][string]
return{
app{
name :
addr :
host :
env :
log_level :
log_lvl :
session_name :
worker_off :
prefix :
},
authenticity_token : ,
contentType : ,
current_path : ,
current_route{
method : ,
path : ,
handler : ,
pathName : ,
aliases : ,
},
env : ,
languages{
},
method : ,
request_id : ,
routes{
method : ,
path : ,
handler : ,
pathName : ,
aliases : ,
},
tx{
"ID": "zxNdoFdzFJAZebIzibCdEewkPZDOpG",
"Store": {
"ID": 4641137705029448206,
"Mapper": {}
},
"Dialect": {
"ConnectionDetails": {
"Dialect": "postgres",
"Driver": "",
"Database": "dcmaster",
"Host": "127.0.0.1",
"Port": "5432",
"User": "postgres",
"Password": "postgres",
"Encoding": "",
"URL": "",
"Pool": 5,
"IdlePool": 0,
"ConnMaxLifetime": 0,
"Options": {
"sslmode": "disable"
},
"RawOptions": ""
}
},
"Elapsed": 9000500,
"TX": {
"ID": 4641137705029448206,
"Mapper": {}
}
}
}
自定义验证规则验证create时同名验证及编辑时除本对象外同名的验证
func (d *DevopsModule) Validate(tx *pop.Connection) (*validate.Errors, error) {
field := make(map[string]string)
field["name"] = d.Name
field["code"] = d.Code
field["id"] = d.ID.String()
return validate.Validate(
&validators.StringIsPresent{Field: d.DefaultAction, Name: "DefaultAction", Message: "默认方法不能为空"},
&NameNotTaken{Field: field, Name: "Name", tx: tx},
), nil
}
type NameNotTaken struct {
Name string
Field map[string]string
tx *pop.Connection
}
func (v *NameNotTaken) IsValid(errors *validate.Errors) {
tx := v.tx
module := &DevopsModule{}
if err := tx.Find(module, v.Field["id"]); err == nil {
if err := tx.Where("id != ?", v.Field["id"]).Where("name = ?", v.Field["name"]).First(module); err == nil {
errors.Add(validators.GenerateKey(v.Name), "该名称已存在!")
} else {
if err := tx.Where("id != ?", v.Field["id"]).Where("code = ?", v.Field["code"]).First(module); err == nil {
errors.Add(validators.GenerateKey(v.Name), "该编码已存在!")
}
}
} else {
if err := tx.Where("name = ?", v.Field["name"]).First(module); err == nil {
errors.Add(validators.GenerateKey(v.Name), "该名称已存在!")
} else {
if err := tx.Where("code = ?", v.Field["code"]).First(module); err == nil {
errors.Add(validators.GenerateKey(v.Name), "该编码已存在!")
}
}
}
}
写一个helper函数生成div块
"div":func (opts map[string]interface{},help plush.HelperContext)(template.HTML,error) {
div := tags.New("div",opts)
s,err := help.Block()
if err != nil {
return template.HTML(""),err
}
div.Append(s)
return div.HTML(),nil
},
//页面中使用:
<%= div({class:"row",id:"mydiv"}) {%>
<b>生成的div中的b标签</b>
<%}%>
- 厚土Go学习笔记 | 36. web服务指定路径下的get参数接收与处理
- Java开发Spring笔记第二天
- PHP调用Go服务的正确方式 - Unix Domain Sockets
- 一条看似平常的报警邮件所做的分析(r8笔记第9天)
- 55. 上传文件(Web版) | 厚土Go学习笔记
- R语言与机器学习学习笔记(分类算法
- 54. 心跳的实现 | 厚土Go学习笔记
- 通过错误的sql来测试推理sql的解析过程(二) (r8笔记第7天)
- 53. Socket服务三次握手的示例 | 厚土Go学习笔记
- R分词继续,"不|知道|你在|说|什么"分词添加新词
- Java开发Spring第一天
- 关于R安装中文分词包安装不上的问题install.packages("tm")
- dataguard备库的数据文件的迁移实战(r8笔记第24天)
- Hive的left join、left outer join和left semi join三者的区别
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Windows 技术篇-网卡物理(MAC)地址查看方法
- Go使用工厂方法实例结构体
- Java交互界面实现计算器开发设计【附函数源码】
- Python 技术篇-读取本地文件的字节数
- Golang Flag包的参数格式问题
- Python 技术篇-对音频、图片等文件进行base64编码和解码
- 图片:“给你五十行代码把我变成字符画!” 程序:“太多了,一半都用不完!”
- HTML布局标记和列表标记
- 使用frp搭建内网穿透
- CNS图表复现03—单细胞区分免疫细胞和肿瘤细胞
- C#记事本项目开发,一个可以实现批量操作的记事本!【附源码】
- Python 库引用问题:name 'json' is not defined,原因及解决办法
- Java集合类之Collection接口,集合的“爸爸”接口了解一下?
- Python 微信机器人-下载微信接收到的语音、图片等资源
- Python源文件打包成可执行的exe应用,给你的代码变个身!