|
|
|
@ -0,0 +1,145 @@ |
|
|
|
# 技术部分 |
|
|
|
### 手动编写SQL的方法: |
|
|
|
g.DB().Query(ctx,sql,g.Array{}) //查询sql |
|
|
|
g.DB().Exec(ctx,sql,g.Array{}) //修改的sql |
|
|
|
### Dao代码生成 |
|
|
|
config 中需要配置: |
|
|
|
gfcli: |
|
|
|
gen: |
|
|
|
dao: |
|
|
|
link: |
|
|
|
tables: |
|
|
|
执行gf gen dao命令 //即逆向工程 |
|
|
|
或直接执行gf gen dao -l "link" -t "tables" 可不用改配置 |
|
|
|
|
|
|
|
生成代码: |
|
|
|
entity包 数据库表对应结构体 |
|
|
|
do包 经过包装的结构体,与entity区别是普通字段类型为interface{}而不是基本类型,可用来区分空值和空指针 |
|
|
|
dao包 直接隶属dao包的go文件写自定义业务代码,隶属于internal包的go文件用来存储框架预设代码(再次执行gen命令会被覆盖) |
|
|
|
|
|
|
|
### 级联查询 |
|
|
|
#### 一对一关系 |
|
|
|
结构体中添加字段: Struct *Struct `orm:"with:id=s_id"` //标签指定关联规则 |
|
|
|
查询时使用model.With(entity.Struct{})设置级联的表 |
|
|
|
|
|
|
|
#### 一对多关系 |
|
|
|
结构体中添加字段: Structs []*Struct `orm:"with:id=s_id"` //标签指定关联规则 |
|
|
|
|
|
|
|
#### 多级级联 |
|
|
|
直接在With()中添加多个结构体就行 |
|
|
|
|
|
|
|
### Service和Logic层 |
|
|
|
|
|
|
|
根据logic包生成service接口:gf gen service |
|
|
|
|
|
|
|
#### service |
|
|
|
组成部分: |
|
|
|
接口 |
|
|
|
type IExample interface{ //命名以I开头 |
|
|
|
定义业务函数 |
|
|
|
} |
|
|
|
|
|
|
|
定义接口变量 |
|
|
|
var localExample() IExample //私有化防止外部修改 |
|
|
|
|
|
|
|
定义获取接口方法 |
|
|
|
func Example () IExample{ |
|
|
|
if localExample==nil{ |
|
|
|
panic(".....") |
|
|
|
} |
|
|
|
return localExample |
|
|
|
} |
|
|
|
|
|
|
|
定义注册方法 |
|
|
|
func RegisterExample(i IExample){ |
|
|
|
localExample=i //用接口实现给接口变量赋值 |
|
|
|
} |
|
|
|
|
|
|
|
#### Logic层 |
|
|
|
定义结构体 |
|
|
|
type sExample struct{} //以s开头命名 |
|
|
|
|
|
|
|
初始化方法中注册 |
|
|
|
func init(){ |
|
|
|
service.RegisterExample(&sExample{}) |
|
|
|
} |
|
|
|
|
|
|
|
实现service的接口中的业务方法 |
|
|
|
|
|
|
|
#### 初始化接口 |
|
|
|
在logic.go中统一import logic,然后再在main.go 中import一次logic.go 实现单例初始化服务接口 |
|
|
|
|
|
|
|
### 模板输出 |
|
|
|
1. req.Response.Writef() //其实就是write套了层Sprintf |
|
|
|
2. req.Response.WriteTplContent(string,g.Map{}) //此法是在string中预留{{}}占位符,用g.Map中的value替换占位符 |
|
|
|
3. req.Response.WriteTpl(path string, g.Map{}) //此法与上一个区别是第一个参数是HTML文件路径,在文件路径中可以预留占位符进行替换,形式类似于JSP或Thymeleaf |
|
|
|
4. 模板中的流程控制语句: |
|
|
|
条件判断 |
|
|
|
{{if [compare] variable1 variable2}} |
|
|
|
{{else}} |
|
|
|
{{end}} |
|
|
|
循环遍历切片 |
|
|
|
{{range.slice}} |
|
|
|
{{end}} |
|
|
|
循环遍历map |
|
|
|
{{range $key,$value := .map}} |
|
|
|
{{end}} |
|
|
|
|
|
|
|
### 文件上传 |
|
|
|
file:=req.GetUploadFile("name") |
|
|
|
规范路由写法: |
|
|
|
属性: File *ghttp.UploadFile `p:"name"` |
|
|
|
全局配置文件大小限制: |
|
|
|
config文件中 |
|
|
|
server: |
|
|
|
clientMaxBodySize: "" |
|
|
|
|
|
|
|
局部配置文件大小限制: |
|
|
|
标签:v:"max-size: xxx MB" |
|
|
|
|
|
|
|
### 文件下载 |
|
|
|
req.Response.ServerFile("/path") // 图片会显示在前端而不主动下载 |
|
|
|
req.Response.ServerFileDownload("/path","name") //无论是不是图片都会立刻开始下载 |
|
|
|
|
|
|
|
### Cookie和Session |
|
|
|
req.Cookie.Set("key","value") |
|
|
|
req.Cookie.SetCookie// 有多项设置,自由度较高 |
|
|
|
req.Cookie.Remove("key") //移除cookie |
|
|
|
req.Session.Set("key","value") |
|
|
|
req.Session.Remove("key") |
|
|
|
|
|
|
|
### 时间工具 |
|
|
|
gtime.Now() Date() DateTime() New() Format() TimeStamp().... |
|
|
|
|
|
|
|
### 随机工具 |
|
|
|
grand.Intn() grand.N() grand.S() grand.Letters()..... |
|
|
|
|
|
|
|
### 中间件 |
|
|
|
固定签名格式: |
|
|
|
func 函数名 (r *ghttp.Request){ |
|
|
|
前置中间件业务逻辑 |
|
|
|
r.Middleware.Next() |
|
|
|
后置中间件业务逻辑 |
|
|
|
} |
|
|
|
挂载方法: |
|
|
|
1.全局中间件 2.分组路由中间件 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 业务部分 |
|
|
|
|
|
|
|
## 超级云脑-云脑探秘 功能总结 |
|
|
|
|
|
|
|
首先是可以根据股票代码或名称搜索股票 |
|
|
|
#### 股票估值 |
|
|
|
搜索出具体的股票后,显示当前股票估值和上一收盘日的基本情况 |
|
|
|
#### 安全级别 |
|
|
|
显示六色罗盘,分析支撑和压力情况,据此显示风险分级 |
|
|
|
#### 压力支撑 |
|
|
|
显示支撑位和压力位,根据支撑压力数据显示简短的总结 |
|
|
|
#### 趋势研判 |
|
|
|
显示K线图,并总结趋势 |
|
|
|
#### 庄家成本 |
|
|
|
显示筹码模型,根据筹码模型分析陈本价格 |
|
|
|
#### 情绪价值 |
|
|
|
对该支股票进行简短的总结陈述 |