Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
加钱居士.
foot
提交
572788f2
F
foot
项目概览
加钱居士.
/
foot
通知
3
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
F
foot
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
572788f2
编写于
4月 11, 2020
作者:
S
shi.zeyuan
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
1.xxx 增加blog
上级
f7e7227e
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
1277 addition
and
0 deletion
+1277
-0
README.md
README.md
+1
-0
blog/go语言robotgo.md
blog/go语言robotgo.md
+584
-0
blog/历年足球数据下载_1.md
blog/历年足球数据下载_1.md
+53
-0
blog/封装go-xorm公共CURD类.md
blog/封装go-xorm公共CURD类.md
+584
-0
link_stat_c4.sql
link_stat_c4.sql
+55
-0
未找到文件。
README.md
浏览文件 @
572788f2
##AI足球大数据爬虫分析一体化GO项目
## 项目地址
*
[
https://github.com/monomania/foot
](
https://github.com/monomania/foot
)
...
...
blog/go语言robotgo.md
0 → 100644
浏览文件 @
572788f2
#go-xorm封装公共CURD类
##$ 前言
*
go-xorm是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作非常简便。
##$ 配置目标
*
封装一个公共的父级操作类,
*
通过继承可让子类带有简单的操作CRUD分页查询数据库的能力
*
可减少很多冗余,重复相似性很高的查询的代码编写
*
提高代码整洁性,可维护性
## app.ini配置
~~~
[mysql]
url=root:abc.123@tcp(localhost:3306)/foot?charset=utf8
maxIdle=10
maxConn=50
~~~
## utils工具类源码(用于读取配置信息)
~~~
package
utils
import
(
"gopkg.in/ini.v1"
"tesou.io/platform/foot-parent/foot-api/common/base"
)
var
(
//
配置信息
iniFile
*
ini
.
File
)
func
init
()
{
file
,
e
:=
ini
.
Load
(
"conf/app.ini"
)
if
e
!= nil {
base
.
Log
.
Info
(
"Fail to load conf/app.ini"
+
e
.
Error
())
return
}
iniFile
=
file
}
func
GetSection
(
sectionName
string
)
*
ini
.
Section
{
section
,
e
:=
iniFile
.
GetSection
(
sectionName
)
if
e
!= nil {
base
.
Log
.
Info
(
"未找到对应的配置信息:"
+
sectionName
+
e
.
Error
())
return
nil
}
return
section
}
func
GetSectionMap
(
sectionName
string
)
map
[
string
]
string
{
section
,
e
:=
iniFile
.
GetSection
(
sectionName
)
if
e
!= nil {
base
.
Log
.
Info
(
"未找到对应的配置信息:"
+
sectionName
+
e
.
Error
())
return
nil
}
section_map
:=
make
(
map
[
string
]
string
,
0
)
for
_
,
e
:=
range
section
.
Keys
()
{
section_map
[
e
.
Name
()]
=
e
.
Value
()
}
return
section_map
}
func
GetVal
(
sectionName
string
,
key
string
)
string
{
var
temp_val
string
section
:=
GetSection
(
sectionName
)
if
nil
!= section {
temp_val
=
section
.
Key
(
key
).
Value
()
}
return
temp_val
;
}
~~~
## Page源码(分页结构体)
~~~
package
pojo
type
Page
struct
{
//
记录总数
Counts
int64
//
每页显示记录数
PageSize
int64
//
总页数
TotalPage
int64
//
当前页
CurPage
int64
//
页面显示开始记录数
FirstResult
int64
//
页面显示最后记录数
LastResult
int64
//
排序类型
OrderType
string
//
排序名称
OrderName
string
}
func
(
this
*
Page
)
Build
(
counts
int64
,
pageSize
int64
)
{
this
.
Counts
=
counts
this
.
PageSize
=
pageSize
if
(
counts
%
pageSize
==
0
)
{
this
.
TotalPage
=
this
.
Counts
/
this
.
PageSize
}
else
{
this
.
TotalPage
=
this
.
Counts
/
this
.
PageSize
+
1
}
}
func
(
this
*
Page
)
GetCounts
()
int64
{
return
this
.
Counts
}
/**
*
Counts
*
the
Counts
to
set
*/
func
(
this
*
Page
)
SetCounts
(
counts
int64
)
{
//
计算所有的页面数
this
.
Counts
=
counts
//
this
.
TotalPage
=
(
int
)
Math
.
ceil
((
this
.
Counts
+
this
.
perPageSize
-
1
)
//
/
this
.
perPageSize
)
if
(
counts
%
this
.
PageSize
==
0
)
{
this
.
TotalPage
=
this
.
Counts
/
this
.
PageSize
}
else
{
this
.
TotalPage
=
this
.
Counts
/
this
.
PageSize
+
1
}
}
func
(
this
*
Page
)
GetPageSize
()
int64
{
return
this
.
PageSize
}
func
(
this
*
Page
)
SetPageSize
(
pageSize
int64
)
{
this
.
PageSize
=
pageSize
}
/**
*
the
TotalPage
*/
func
(
this
*
Page
)
GetTotalPage
()
int64
{
if
this
.
TotalPage
<
1
{
return
1
}
return
this
.
TotalPage
}
/**
*
TotalPage
*
the
TotalPage
to
set
*/
func
(
this
*
Page
)
SetTotalPage
(
totalPage
int64
)
{
this
.
TotalPage
=
totalPage
}
func
(
this
*
Page
)
GetCurPage
()
int64
{
return
this
.
CurPage
}
func
(
this
*
Page
)
SetCurPage
(
curPage
int64
)
{
this
.
CurPage
=
curPage
}
/**
*
the
FirstResult
*/
func
(
this
*
Page
)
GetFirstResult
()
int64
{
temp
:=
this
.
CurPage
-
1
if
(
temp
<=
0
)
{
return
0
}
this
.
FirstResult
=
(
this
.
CurPage
-
1
)
*
this
.
PageSize
return
this
.
FirstResult
}
/**
*
FirstResult
*
the
FirstResult
to
set
*/
func
(
this
*
Page
)
SetFirstResult
(
firstResult
int64
)
{
this
.
FirstResult
=
firstResult
}
/**
*
the
LastResult
*/
func
(
this
*
Page
)
GetLastResult
()
int64
{
this
.
LastResult
=
this
.
FirstResult
+
this
.
PageSize
return
this
.
LastResult
}
/**
*
LastResult
*
the
LastResult
to
set
*/
func
(
this
*
Page
)
SetLastResult
(
lastResult
int64
)
{
this
.
LastResult
=
lastResult
}
/**
*
the
OrderName
*/
func
(
this
*
Page
)
GetOrderName
()
string
{
return
this
.
OrderName
}
/**
*
OrderName
*
the
OrderName
to
set
*/
func
(
this
*
Page
)
SetOrderName
(
orderName
string
)
{
this
.
OrderName
=
orderName
}
/**
*
the
orderBy
*/
func
(
this
*
Page
)
getOrderType
()
string
{
return
this
.
OrderType
}
/**
*
orderBy
*
the
orderBy
to
set
*/
func
(
this
*
Page
)
SetOrderType
(
orderType
string
)
{
this
.
OrderType
=
orderType
}
/**
*
the
orderBy
*/
func
(
this
*
Page
)
GetOrderBy
()
string
{
if
len
(
this
.
GetOrderName
())
<=
0
{
return
""
}
orderBy
:=
" order by "
+
this
.
GetOrderName
()
+
" "
+
this
.
getOrderType
()
return
orderBy
}
~~~
## BaseService源码(公共的CRUD类)
~~~
package
mysql
import
(
"container/list"
_
"github.com/go-sql-driver/mysql"
"github.com/go-xorm/core"
"github.com/go-xorm/xorm"
"gopkg.in/mgo.v2/bson"
"reflect"
"strconv"
"tesou.io/platform/foot-parent/foot-api/common/base"
"tesou.io/platform/foot-parent/foot-api/common/base/pojo"
"tesou.io/platform/foot-parent/foot-core/common/utils"
)
type
BaseService
struct
{
}
var
(
engine
*
xorm
.
Engine
)
func
GetEngine
()
*
xorm
.
Engine
{
if
nil
==
engine
{
setEngine
()
}
return
engine
}
func
ShowSQL
(
show
bool
)
{
engine
:=
GetEngine
()
engine
.
ShowSQL
(
show
)
engine
.
ShowExecTime
(
show
)
}
func
setEngine
()
*
xorm
.
Engine
{
url
:=
utils
.
GetVal
(
"mysql"
,
"url"
)
maxIdle
,
_
:=
strconv
.
Atoi
(
utils
.
GetVal
(
"mysql"
,
"maxIdle"
))
maxConn
,
_
:=
strconv
.
Atoi
(
utils
.
GetVal
(
"mysql"
,
"maxConn"
))
var
err
error
engine
,
err
=
xorm
.
NewEngine
(
"mysql"
,
url
)
if
nil
!= err {
base
.
Log
.
Error
(
"init"
+
err
.
Error
())
}
//
engine
.
ShowExecTime
(
true
)
//
则会在控制台打印出生成的
SQL
语句
//
则会在控制台打印调试及以上的信息
engine
.
ShowSQL
(
true
)
//
engine
.
Logger
().
SetLevel
(
core
.
LOG_DEBUG
)
engine
.
SetMaxIdleConns
(
maxIdle
)
engine
.
SetMaxOpenConns
(
maxConn
)
tbMapper
:=
core
.
NewPrefixMapper
(
core
.
SnakeMapper
{},
"t_"
)
engine
.
SetTableMapper
(
tbMapper
)
engine
.
SetColumnMapper
(
core
.
SameMapper
{})
/**
当使用了
Distinct
,
Having
,
GroupBy
方法将不会使用缓存
在
Get
或者
Find
时使用了
Cols
,
Omit
方法,则在开启缓存后此方法无效,系统仍旧会取出这个表中的所有字段。
在使用
Exec
方法执行了方法之后,可能会导致缓存与数据库不一致的地方。因此如果启用缓存,尽量避免使用
Exec
。
如果必须使用,则需要在使用了
Exec
之后调用
ClearCache
手动做缓存清除的工作。比如:
engine
.
Exec
(
"update user set name = ? where id = ?"
,
"xlw"
,
1
)
engine
.
ClearCache
(
new
(
User
))
*/
//
cacher
:=
xorm
.
NewLRUCacher
(
xorm
.
NewMemoryStore
(),
999
)
//
engine
.
SetDefaultCacher
(
cacher
)
return
engine
}
func
init
()
{
//
设置初始化数据库引擎
setEngine
()
}
func
beforeModify
(
entity
interface
{})
{
//
当前时间
//
current_date
:=
time
.
Now
().
Format
(
"2006-01-02 15:04:05"
)
//
默认更新者
default_user
:=
"100000"
//
对象操作
entity_value
:=
reflect
.
ValueOf
(
entity
).
Elem
()
/*//
设置更新时间
field_ModifyDate
:=
entity_value
.
FieldByName
(
"ModifyTime"
)
if
field_ModifyDate
.
String
()
==
""
{
field_ModifyDate
.
SetString
(
current_date
)
}*/
//
设置更新者
field_ModifyUser
:=
entity_value
.
FieldByName
(
"ModifyUser"
)
if
field_ModifyUser
.
String
()
==
""
{
field_ModifyUser
.
SetString
(
default_user
)
}
}
func
beforeDelete
(
entity
interface
{})
{
//
当前时间
//
current_date
:=
time
.
Now
().
Format
(
"2006-01-02 15:04:05"
)
//
默认删除者
default_user
:=
"100000"
//
对象操作
entity_value
:=
reflect
.
ValueOf
(
entity
).
Elem
()
/*//
设置更新时间
field_ModifyDate
:=
entity_value
.
FieldByName
(
"ModifyTime"
)
if
field_ModifyDate
.
String
()
==
""
{
field_ModifyDate
.
SetString
(
current_date
)
}*/
//
设置删除者
field_DeleteUser
:=
entity_value
.
FieldByName
(
"DeleteUser"
)
if
field_DeleteUser
.
String
()
==
""
{
field_DeleteUser
.
SetString
(
default_user
)
}
}
func
beforeSave
(
entity
interface
{})
interface
{}
{
//
当前时间
//
current_date
:=
time
.
Now
().
Format
(
"2006-01-02 15:04:05"
)
//
默认创建者
default_user
:=
"100000"
//
对象操作
entity_value
:=
reflect
.
ValueOf
(
entity
).
Elem
()
/*
//
设置创建时间
通过
`
xorm
:
"created"
`
配置
field_CreateDate
:=
entity_value
.
FieldByName
(
"CreateTime"
)
if
field_CreateDate
.
String
()
==
""
{
field_CreateDate
.
SetString
(
current_date
)
}*/
//
设置创建者
field_CreateUser
:=
entity_value
.
FieldByName
(
"CreateUser"
)
if
field_CreateUser
.
String
()
==
""
{
field_CreateUser
.
SetString
(
default_user
)
}
beforeModify
(
entity
)
var
id
interface
{}
//
设置
id
field_Id
:=
entity_value
.
FieldByName
(
"Id"
)
if
field_Id
.
String
()
==
""
{
//
使用
bson
.
NewObject
作为主键
id
=
bson
.
NewObjectId
().
Hex
()
field_Id
.
Set
(
reflect
.
ValueOf
(
id
))
}
return
id
}
func
(
this
*
BaseService
)
SaveOrModify
(
entity
interface
{})
{
b
,
err
:=
engine
.
Exist
(
entity
)
if
nil
!= err {
base
.
Log
.
Info
(
"SaveOrModify:"
+
err
.
Error
())
}
if
b
{
this
.
Modify
(
entity
)
}
else
{
this
.
Save
(
entity
)
}
}
func
(
this
*
BaseService
)
Save
(
entity
interface
{})
interface
{}
{
id
:=
beforeSave
(
entity
)
_
,
err
:=
engine
.
InsertOne
(
entity
)
if
nil
!= err {
base
.
Log
.
Info
(
"Save:"
+
err
.
Error
())
}
return
id
}
func
(
this
*
BaseService
)
SaveList
(
entitys
[]
interface
{})
*
list
.
List
{
if
len
(
entitys
)
<=
0
{
return
nil
}
list_ids
:=
list
.
New
()
for
_
,
v
:=
range
entitys
{
id
:=
beforeSave
(
v
)
list_ids
.
PushBack
(
id
)
}
_
,
err
:=
engine
.
Insert
(
entitys
...)
if
nil
!= err {
base
.
Log
.
Info
(
"SaveList:"
+
err
.
Error
())
}
return
list_ids
}
func
(
this
*
BaseService
)
Del
(
entity
interface
{})
int64
{
beforeDelete
(
entity
)
entity_value
:=
reflect
.
ValueOf
(
entity
).
Elem
()
id_field
:=
entity_value
.
FieldByName
(
"Id"
)
i
,
err
:=
engine
.
Id
(
id_field
.
Interface
()).
Delete
(
entity
)
if
err
!= nil {
base
.
Log
.
Info
(
"Del:"
,
err
)
}
return
i
}
func
(
this
*
BaseService
)
Modify
(
entity
interface
{})
int64
{
beforeModify
(
entity
)
entity_value
:=
reflect
.
ValueOf
(
entity
).
Elem
()
id_field
:=
entity_value
.
FieldByName
(
"Id"
)
i
,
err
:=
engine
.
Id
(
id_field
.
Interface
()).
AllCols
().
Update
(
entity
)
if
err
!= nil {
base
.
Log
.
Info
(
"Modify:"
,
err
)
}
return
i
}
func
(
this
*
BaseService
)
ModifyList
(
entitys
[]
interface
{})
int64
{
if
len
(
entitys
)
<=
0
{
return
0
}
//
i
,
err
:=
engine
.
In
(
"id"
,
ids
).
Update
(
entitys
)
for
_
,
v
:=
range
entitys
{
//
entity_value
:=
reflect
.
ValueOf
(
v
).
Elem
()
//
id_field
:=
entity_value
.
FieldByName
(
"Id"
)
this
.
Modify
(
v
)
}
return
1
}
func
(
this
*
BaseService
)
Exist
(
entity
interface
{})
bool
{
//
对象操作
exist
,
err
:=
engine
.
Exist
(
entity
)
if
nil
!= err {
base
.
Log
.
Info
(
"ExistByName:"
+
err
.
Error
())
}
return
exist
}
func
(
this
*
BaseService
)
Find
(
entity
interface
{})
{
engine
.
Find
(
entity
)
}
func
(
this
*
BaseService
)
FindBySQL
(
sql
string
,
entity
interface
{})
{
engine
.
SQL
(
sql
).
Find
(
entity
)
}
func
(
this
*
BaseService
)
FindAll
(
entity
interface
{})
{
err
:=
engine
.
Find
(
entity
)
if
nil
!= err {
base
.
Log
.
Info
(
"FindAll: "
+
err
.
Error
())
}
}
/**
分页查询
*/
func
(
this
*
BaseService
)
Page
(
v
interface
{},
page
*
pojo
.
Page
,
dataList
interface
{})
error
{
tableName
:=
engine
.
TableName
(
v
)
sql
:=
"select t.* from "
+
tableName
+
" t where 1=1 "
return
this
.
PageSql
(
sql
,
page
,
dataList
)
}
/**
分页查询
*/
func
(
this
*
BaseService
)
PageSql
(
sql
string
,
page
*
pojo
.
Page
,
dataList
interface
{})
error
{
//
声明结果变量
var
err
error
var
counts
int64
//
获取总记录数处理
countSql
:=
" select count(1) from ("
+
sql
+
") t"
counts
,
err
=
engine
.
SQL
(
countSql
).
Count
()
if
nil
!= err {
return
err
}
else
{
page
.
SetCounts
(
counts
)
}
//
排序处理
orderBy
:=
page
.
GetOrderBy
()
if
len
(
orderBy
)
>
0
{
sql
+=
orderBy
}
sql
+=
" limit "
+
strconv
.
FormatInt
(
page
.
GetFirstResult
(),
10
)
+
","
+
strconv
.
FormatInt
(
page
.
GetPageSize
(),
10
)
err
=
engine
.
SQL
(
sql
).
Find
(
dataList
)
return
err
}
~~~
## 使用示例
~~~
package
service
import
(
"tesou.io/platform/foot-parent/foot-api/common/base"
"tesou.io/platform/foot-parent/foot-api/module/match/pojo"
"tesou.io/platform/foot-parent/foot-core/common/base/service/mysql"
)
type
MatchHisService
struct
{
//
引入公共类
mysql
.
BaseService
}
func
(
this
*
MatchHisService
)
Exist
(
v
*
pojo
.
MatchHis
)
bool
{
has
,
err
:=
mysql
.
GetEngine
().
Table
(
"`t_match_his`"
).
Where
(
" `Id` = ? "
,
v
.
Id
).
Exist
()
if
err
!= nil {
base
.
Log
.
Error
(
"Exist"
,
err
)
}
return
has
}
func
(
this
*
MatchHisService
)
FindAll
()
[]*
pojo
.
MatchHis
{
dataList
:=
make
([]*
pojo
.
MatchHis
,
0
)
mysql
.
GetEngine
().
OrderBy
(
"MatchDate"
).
Find
(&
dataList
)
return
dataList
}
func
(
this
*
MatchHisService
)
FindById
(
matchId
string
)
*
pojo
.
MatchHis
{
data
:=
new
(
pojo
.
MatchHis
)
data
.
Id
=
matchId
_
,
err
:=
mysql
.
GetEngine
().
Get
(
data
)
if
err
!= nil {
base
.
Log
.
Error
(
"FindById:"
,
err
)
}
return
data
}
func
(
this
*
MatchHisService
)
FindBySeason
(
season
string
)
[]*
pojo
.
MatchLast
{
sql_build
:=
`
SELECT
la
.*
FROM
foot
.
t_match_his
la
WHERE
1
=
1
`
sql_build
=
sql_build
+
" AND la.MatchDate >= '"
+
season
+
"-01-01 00:00:00' AND la.MatchDate <= '"
+
season
+
"-12-31 23:59:59'"
//
结果值
dataList
:=
make
([]*
pojo
.
MatchLast
,
0
)
//
执行查询
this
.
FindBySQL
(
sql_build
,
&
dataList
)
return
dataList
}
~~~
blog/历年足球数据下载_1.md
0 → 100644
浏览文件 @
572788f2
#历年足球数据下载
~~~
足球历年数据,数据的年份范围为:2010-2020. 10年间的数据.没有杯赛,友谊赛,联赛次级的数据.
包含澳门,bet365,威廉,立博等多菠菜公司的欧赔数据.
当前数据提供的有
csv文件,可自行转excel.
sql文件,可自行导入自己的mysql库中.
~~~
##$ Mysql 文件
*
链接:
[
https://pan.baidu.com/s/1DSva_tkTB433iRtmbg7q0w
](
https://pan.baidu.com/s/1DSva_tkTB433iRtmbg7q0w
)
##$ Mysql 表说明
| 表名 | 数据行数| 表说明 |
| ----------- | :--------------:| ---------------------|
| t_asia_track | 2702052 | 亚赔变化表 |
| t_euro_his | 2186160 | 欧赔历史表(只有各家初即数据) |
| t_asia_his | 2039445 | 亚赔历史表(只有各家初即数据) |
| t_b_f_score | 1485341 | 积分榜数据表 |
| t_b_f_future_event | 1000137 | 未来赛事表 |
| t_euro_track | 917214 | 欧赔变化表(部分历史比赛己无法获取) |
| t_b_f_jin | 497977 | 近期战绩表 |
| t_match_his | 397253 | 比赛数据表 |
| t_b_f_battle | 356232 | 主客队对战历史表 |
| t_analy_result | 123793 | 分析预测结果表 |
| t_league_sub | 23953 | 联赛次级表 |
| t_league_season | 9550 | 联赛赛季表 |
| t_match_last | 3056 | 比赛临时表 |
| t_league | 1149 | 联赛表 |
| t_asia_last | 155 | 亚赔临时表 |
| t_comp | 40 | 波菜公司表 |
| t_euro_last | 36 | 欧赔临时表 |
| t_pub | 0 | 无用 |
##$ CSV 20W行版本
*
链接:
[
https://pan.baidu.com/s/1t8RtDtlk38MxZzsnNmrRlg
](
https://pan.baidu.com/s/1t8RtDtlk38MxZzsnNmrRlg
)
##$ CSV 4W行版本
*
链接:
[
https://pan.baidu.com/s/1-70U-_gm26s2RcjWNooebg
](
https://pan.baidu.com/s/1-70U-_gm26s2RcjWNooebg
)
##$ CSV 数据截图
<img
src=
"https://mmbiz.qpic.cn/sz_mmbiz_png/BePaFicK2B5S7uoIx92S3coZD6UJMK4PKVY31wo4Fml9EJNtEHXfO5aHpMPUk3eeIGlz5Qia2oTxsbe21XLofnVA/0?wx_fmt=png"
width=
"90%"
>
<img
src=
"https://mmbiz.qpic.cn/sz_mmbiz_jpg/BePaFicK2B5TMk6YiaklXBhMVfHebGiaToXdcpS6WFbfrOMUerm6EqNibJHEtwFH38esYnXyqdMY8YOWiaTsgFh9iaDQ/0?wx_fmt=jpeg"
width=
"50%"
>
*
关注公众号"AI球探",发送"数据下载",获取提取码.
blog/封装go-xorm公共CURD类.md
0 → 100644
浏览文件 @
572788f2
#go-xorm封装公共CURD类
##$ 前言
*
go-xorm是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作非常简便。
##$ 配置目标
*
封装一个公共的父级操作类,
*
通过继承可让子类带有简单的操作CRUD分页查询数据库的能力
*
可减少很多冗余,重复相似性很高的查询的代码编写
*
提高代码整洁性,可维护性
## app.ini配置
~~~
[mysql]
url=root:abc.123@tcp(localhost:3306)/foot?charset=utf8
maxIdle=10
maxConn=50
~~~
## utils工具类源码(用于读取配置信息)
~~~
package
utils
import
(
"gopkg.in/ini.v1"
"tesou.io/platform/foot-parent/foot-api/common/base"
)
var
(
//
配置信息
iniFile
*
ini
.
File
)
func
init
()
{
file
,
e
:=
ini
.
Load
(
"conf/app.ini"
)
if
e
!= nil {
base
.
Log
.
Info
(
"Fail to load conf/app.ini"
+
e
.
Error
())
return
}
iniFile
=
file
}
func
GetSection
(
sectionName
string
)
*
ini
.
Section
{
section
,
e
:=
iniFile
.
GetSection
(
sectionName
)
if
e
!= nil {
base
.
Log
.
Info
(
"未找到对应的配置信息:"
+
sectionName
+
e
.
Error
())
return
nil
}
return
section
}
func
GetSectionMap
(
sectionName
string
)
map
[
string
]
string
{
section
,
e
:=
iniFile
.
GetSection
(
sectionName
)
if
e
!= nil {
base
.
Log
.
Info
(
"未找到对应的配置信息:"
+
sectionName
+
e
.
Error
())
return
nil
}
section_map
:=
make
(
map
[
string
]
string
,
0
)
for
_
,
e
:=
range
section
.
Keys
()
{
section_map
[
e
.
Name
()]
=
e
.
Value
()
}
return
section_map
}
func
GetVal
(
sectionName
string
,
key
string
)
string
{
var
temp_val
string
section
:=
GetSection
(
sectionName
)
if
nil
!= section {
temp_val
=
section
.
Key
(
key
).
Value
()
}
return
temp_val
;
}
~~~
## Page源码(分页结构体)
~~~
package
pojo
type
Page
struct
{
//
记录总数
Counts
int64
//
每页显示记录数
PageSize
int64
//
总页数
TotalPage
int64
//
当前页
CurPage
int64
//
页面显示开始记录数
FirstResult
int64
//
页面显示最后记录数
LastResult
int64
//
排序类型
OrderType
string
//
排序名称
OrderName
string
}
func
(
this
*
Page
)
Build
(
counts
int64
,
pageSize
int64
)
{
this
.
Counts
=
counts
this
.
PageSize
=
pageSize
if
(
counts
%
pageSize
==
0
)
{
this
.
TotalPage
=
this
.
Counts
/
this
.
PageSize
}
else
{
this
.
TotalPage
=
this
.
Counts
/
this
.
PageSize
+
1
}
}
func
(
this
*
Page
)
GetCounts
()
int64
{
return
this
.
Counts
}
/**
*
Counts
*
the
Counts
to
set
*/
func
(
this
*
Page
)
SetCounts
(
counts
int64
)
{
//
计算所有的页面数
this
.
Counts
=
counts
//
this
.
TotalPage
=
(
int
)
Math
.
ceil
((
this
.
Counts
+
this
.
perPageSize
-
1
)
//
/
this
.
perPageSize
)
if
(
counts
%
this
.
PageSize
==
0
)
{
this
.
TotalPage
=
this
.
Counts
/
this
.
PageSize
}
else
{
this
.
TotalPage
=
this
.
Counts
/
this
.
PageSize
+
1
}
}
func
(
this
*
Page
)
GetPageSize
()
int64
{
return
this
.
PageSize
}
func
(
this
*
Page
)
SetPageSize
(
pageSize
int64
)
{
this
.
PageSize
=
pageSize
}
/**
*
the
TotalPage
*/
func
(
this
*
Page
)
GetTotalPage
()
int64
{
if
this
.
TotalPage
<
1
{
return
1
}
return
this
.
TotalPage
}
/**
*
TotalPage
*
the
TotalPage
to
set
*/
func
(
this
*
Page
)
SetTotalPage
(
totalPage
int64
)
{
this
.
TotalPage
=
totalPage
}
func
(
this
*
Page
)
GetCurPage
()
int64
{
return
this
.
CurPage
}
func
(
this
*
Page
)
SetCurPage
(
curPage
int64
)
{
this
.
CurPage
=
curPage
}
/**
*
the
FirstResult
*/
func
(
this
*
Page
)
GetFirstResult
()
int64
{
temp
:=
this
.
CurPage
-
1
if
(
temp
<=
0
)
{
return
0
}
this
.
FirstResult
=
(
this
.
CurPage
-
1
)
*
this
.
PageSize
return
this
.
FirstResult
}
/**
*
FirstResult
*
the
FirstResult
to
set
*/
func
(
this
*
Page
)
SetFirstResult
(
firstResult
int64
)
{
this
.
FirstResult
=
firstResult
}
/**
*
the
LastResult
*/
func
(
this
*
Page
)
GetLastResult
()
int64
{
this
.
LastResult
=
this
.
FirstResult
+
this
.
PageSize
return
this
.
LastResult
}
/**
*
LastResult
*
the
LastResult
to
set
*/
func
(
this
*
Page
)
SetLastResult
(
lastResult
int64
)
{
this
.
LastResult
=
lastResult
}
/**
*
the
OrderName
*/
func
(
this
*
Page
)
GetOrderName
()
string
{
return
this
.
OrderName
}
/**
*
OrderName
*
the
OrderName
to
set
*/
func
(
this
*
Page
)
SetOrderName
(
orderName
string
)
{
this
.
OrderName
=
orderName
}
/**
*
the
orderBy
*/
func
(
this
*
Page
)
getOrderType
()
string
{
return
this
.
OrderType
}
/**
*
orderBy
*
the
orderBy
to
set
*/
func
(
this
*
Page
)
SetOrderType
(
orderType
string
)
{
this
.
OrderType
=
orderType
}
/**
*
the
orderBy
*/
func
(
this
*
Page
)
GetOrderBy
()
string
{
if
len
(
this
.
GetOrderName
())
<=
0
{
return
""
}
orderBy
:=
" order by "
+
this
.
GetOrderName
()
+
" "
+
this
.
getOrderType
()
return
orderBy
}
~~~
## BaseService源码(公共的CRUD类)
~~~
package
mysql
import
(
"container/list"
_
"github.com/go-sql-driver/mysql"
"github.com/go-xorm/core"
"github.com/go-xorm/xorm"
"gopkg.in/mgo.v2/bson"
"reflect"
"strconv"
"tesou.io/platform/foot-parent/foot-api/common/base"
"tesou.io/platform/foot-parent/foot-api/common/base/pojo"
"tesou.io/platform/foot-parent/foot-core/common/utils"
)
type
BaseService
struct
{
}
var
(
engine
*
xorm
.
Engine
)
func
GetEngine
()
*
xorm
.
Engine
{
if
nil
==
engine
{
setEngine
()
}
return
engine
}
func
ShowSQL
(
show
bool
)
{
engine
:=
GetEngine
()
engine
.
ShowSQL
(
show
)
engine
.
ShowExecTime
(
show
)
}
func
setEngine
()
*
xorm
.
Engine
{
url
:=
utils
.
GetVal
(
"mysql"
,
"url"
)
maxIdle
,
_
:=
strconv
.
Atoi
(
utils
.
GetVal
(
"mysql"
,
"maxIdle"
))
maxConn
,
_
:=
strconv
.
Atoi
(
utils
.
GetVal
(
"mysql"
,
"maxConn"
))
var
err
error
engine
,
err
=
xorm
.
NewEngine
(
"mysql"
,
url
)
if
nil
!= err {
base
.
Log
.
Error
(
"init"
+
err
.
Error
())
}
//
engine
.
ShowExecTime
(
true
)
//
则会在控制台打印出生成的
SQL
语句
//
则会在控制台打印调试及以上的信息
engine
.
ShowSQL
(
true
)
//
engine
.
Logger
().
SetLevel
(
core
.
LOG_DEBUG
)
engine
.
SetMaxIdleConns
(
maxIdle
)
engine
.
SetMaxOpenConns
(
maxConn
)
tbMapper
:=
core
.
NewPrefixMapper
(
core
.
SnakeMapper
{},
"t_"
)
engine
.
SetTableMapper
(
tbMapper
)
engine
.
SetColumnMapper
(
core
.
SameMapper
{})
/**
当使用了
Distinct
,
Having
,
GroupBy
方法将不会使用缓存
在
Get
或者
Find
时使用了
Cols
,
Omit
方法,则在开启缓存后此方法无效,系统仍旧会取出这个表中的所有字段。
在使用
Exec
方法执行了方法之后,可能会导致缓存与数据库不一致的地方。因此如果启用缓存,尽量避免使用
Exec
。
如果必须使用,则需要在使用了
Exec
之后调用
ClearCache
手动做缓存清除的工作。比如:
engine
.
Exec
(
"update user set name = ? where id = ?"
,
"xlw"
,
1
)
engine
.
ClearCache
(
new
(
User
))
*/
//
cacher
:=
xorm
.
NewLRUCacher
(
xorm
.
NewMemoryStore
(),
999
)
//
engine
.
SetDefaultCacher
(
cacher
)
return
engine
}
func
init
()
{
//
设置初始化数据库引擎
setEngine
()
}
func
beforeModify
(
entity
interface
{})
{
//
当前时间
//
current_date
:=
time
.
Now
().
Format
(
"2006-01-02 15:04:05"
)
//
默认更新者
default_user
:=
"100000"
//
对象操作
entity_value
:=
reflect
.
ValueOf
(
entity
).
Elem
()
/*//
设置更新时间
field_ModifyDate
:=
entity_value
.
FieldByName
(
"ModifyTime"
)
if
field_ModifyDate
.
String
()
==
""
{
field_ModifyDate
.
SetString
(
current_date
)
}*/
//
设置更新者
field_ModifyUser
:=
entity_value
.
FieldByName
(
"ModifyUser"
)
if
field_ModifyUser
.
String
()
==
""
{
field_ModifyUser
.
SetString
(
default_user
)
}
}
func
beforeDelete
(
entity
interface
{})
{
//
当前时间
//
current_date
:=
time
.
Now
().
Format
(
"2006-01-02 15:04:05"
)
//
默认删除者
default_user
:=
"100000"
//
对象操作
entity_value
:=
reflect
.
ValueOf
(
entity
).
Elem
()
/*//
设置更新时间
field_ModifyDate
:=
entity_value
.
FieldByName
(
"ModifyTime"
)
if
field_ModifyDate
.
String
()
==
""
{
field_ModifyDate
.
SetString
(
current_date
)
}*/
//
设置删除者
field_DeleteUser
:=
entity_value
.
FieldByName
(
"DeleteUser"
)
if
field_DeleteUser
.
String
()
==
""
{
field_DeleteUser
.
SetString
(
default_user
)
}
}
func
beforeSave
(
entity
interface
{})
interface
{}
{
//
当前时间
//
current_date
:=
time
.
Now
().
Format
(
"2006-01-02 15:04:05"
)
//
默认创建者
default_user
:=
"100000"
//
对象操作
entity_value
:=
reflect
.
ValueOf
(
entity
).
Elem
()
/*
//
设置创建时间
通过
`
xorm
:
"created"
`
配置
field_CreateDate
:=
entity_value
.
FieldByName
(
"CreateTime"
)
if
field_CreateDate
.
String
()
==
""
{
field_CreateDate
.
SetString
(
current_date
)
}*/
//
设置创建者
field_CreateUser
:=
entity_value
.
FieldByName
(
"CreateUser"
)
if
field_CreateUser
.
String
()
==
""
{
field_CreateUser
.
SetString
(
default_user
)
}
beforeModify
(
entity
)
var
id
interface
{}
//
设置
id
field_Id
:=
entity_value
.
FieldByName
(
"Id"
)
if
field_Id
.
String
()
==
""
{
//
使用
bson
.
NewObject
作为主键
id
=
bson
.
NewObjectId
().
Hex
()
field_Id
.
Set
(
reflect
.
ValueOf
(
id
))
}
return
id
}
func
(
this
*
BaseService
)
SaveOrModify
(
entity
interface
{})
{
b
,
err
:=
engine
.
Exist
(
entity
)
if
nil
!= err {
base
.
Log
.
Info
(
"SaveOrModify:"
+
err
.
Error
())
}
if
b
{
this
.
Modify
(
entity
)
}
else
{
this
.
Save
(
entity
)
}
}
func
(
this
*
BaseService
)
Save
(
entity
interface
{})
interface
{}
{
id
:=
beforeSave
(
entity
)
_
,
err
:=
engine
.
InsertOne
(
entity
)
if
nil
!= err {
base
.
Log
.
Info
(
"Save:"
+
err
.
Error
())
}
return
id
}
func
(
this
*
BaseService
)
SaveList
(
entitys
[]
interface
{})
*
list
.
List
{
if
len
(
entitys
)
<=
0
{
return
nil
}
list_ids
:=
list
.
New
()
for
_
,
v
:=
range
entitys
{
id
:=
beforeSave
(
v
)
list_ids
.
PushBack
(
id
)
}
_
,
err
:=
engine
.
Insert
(
entitys
...)
if
nil
!= err {
base
.
Log
.
Info
(
"SaveList:"
+
err
.
Error
())
}
return
list_ids
}
func
(
this
*
BaseService
)
Del
(
entity
interface
{})
int64
{
beforeDelete
(
entity
)
entity_value
:=
reflect
.
ValueOf
(
entity
).
Elem
()
id_field
:=
entity_value
.
FieldByName
(
"Id"
)
i
,
err
:=
engine
.
Id
(
id_field
.
Interface
()).
Delete
(
entity
)
if
err
!= nil {
base
.
Log
.
Info
(
"Del:"
,
err
)
}
return
i
}
func
(
this
*
BaseService
)
Modify
(
entity
interface
{})
int64
{
beforeModify
(
entity
)
entity_value
:=
reflect
.
ValueOf
(
entity
).
Elem
()
id_field
:=
entity_value
.
FieldByName
(
"Id"
)
i
,
err
:=
engine
.
Id
(
id_field
.
Interface
()).
AllCols
().
Update
(
entity
)
if
err
!= nil {
base
.
Log
.
Info
(
"Modify:"
,
err
)
}
return
i
}
func
(
this
*
BaseService
)
ModifyList
(
entitys
[]
interface
{})
int64
{
if
len
(
entitys
)
<=
0
{
return
0
}
//
i
,
err
:=
engine
.
In
(
"id"
,
ids
).
Update
(
entitys
)
for
_
,
v
:=
range
entitys
{
//
entity_value
:=
reflect
.
ValueOf
(
v
).
Elem
()
//
id_field
:=
entity_value
.
FieldByName
(
"Id"
)
this
.
Modify
(
v
)
}
return
1
}
func
(
this
*
BaseService
)
Exist
(
entity
interface
{})
bool
{
//
对象操作
exist
,
err
:=
engine
.
Exist
(
entity
)
if
nil
!= err {
base
.
Log
.
Info
(
"ExistByName:"
+
err
.
Error
())
}
return
exist
}
func
(
this
*
BaseService
)
Find
(
entity
interface
{})
{
engine
.
Find
(
entity
)
}
func
(
this
*
BaseService
)
FindBySQL
(
sql
string
,
entity
interface
{})
{
engine
.
SQL
(
sql
).
Find
(
entity
)
}
func
(
this
*
BaseService
)
FindAll
(
entity
interface
{})
{
err
:=
engine
.
Find
(
entity
)
if
nil
!= err {
base
.
Log
.
Info
(
"FindAll: "
+
err
.
Error
())
}
}
/**
分页查询
*/
func
(
this
*
BaseService
)
Page
(
v
interface
{},
page
*
pojo
.
Page
,
dataList
interface
{})
error
{
tableName
:=
engine
.
TableName
(
v
)
sql
:=
"select t.* from "
+
tableName
+
" t where 1=1 "
return
this
.
PageSql
(
sql
,
page
,
dataList
)
}
/**
分页查询
*/
func
(
this
*
BaseService
)
PageSql
(
sql
string
,
page
*
pojo
.
Page
,
dataList
interface
{})
error
{
//
声明结果变量
var
err
error
var
counts
int64
//
获取总记录数处理
countSql
:=
" select count(1) from ("
+
sql
+
") t"
counts
,
err
=
engine
.
SQL
(
countSql
).
Count
()
if
nil
!= err {
return
err
}
else
{
page
.
SetCounts
(
counts
)
}
//
排序处理
orderBy
:=
page
.
GetOrderBy
()
if
len
(
orderBy
)
>
0
{
sql
+=
orderBy
}
sql
+=
" limit "
+
strconv
.
FormatInt
(
page
.
GetFirstResult
(),
10
)
+
","
+
strconv
.
FormatInt
(
page
.
GetPageSize
(),
10
)
err
=
engine
.
SQL
(
sql
).
Find
(
dataList
)
return
err
}
~~~
## 使用示例
~~~
package
service
import
(
"tesou.io/platform/foot-parent/foot-api/common/base"
"tesou.io/platform/foot-parent/foot-api/module/match/pojo"
"tesou.io/platform/foot-parent/foot-core/common/base/service/mysql"
)
type
MatchHisService
struct
{
//
引入公共类
mysql
.
BaseService
}
func
(
this
*
MatchHisService
)
Exist
(
v
*
pojo
.
MatchHis
)
bool
{
has
,
err
:=
mysql
.
GetEngine
().
Table
(
"`t_match_his`"
).
Where
(
" `Id` = ? "
,
v
.
Id
).
Exist
()
if
err
!= nil {
base
.
Log
.
Error
(
"Exist"
,
err
)
}
return
has
}
func
(
this
*
MatchHisService
)
FindAll
()
[]*
pojo
.
MatchHis
{
dataList
:=
make
([]*
pojo
.
MatchHis
,
0
)
mysql
.
GetEngine
().
OrderBy
(
"MatchDate"
).
Find
(&
dataList
)
return
dataList
}
func
(
this
*
MatchHisService
)
FindById
(
matchId
string
)
*
pojo
.
MatchHis
{
data
:=
new
(
pojo
.
MatchHis
)
data
.
Id
=
matchId
_
,
err
:=
mysql
.
GetEngine
().
Get
(
data
)
if
err
!= nil {
base
.
Log
.
Error
(
"FindById:"
,
err
)
}
return
data
}
func
(
this
*
MatchHisService
)
FindBySeason
(
season
string
)
[]*
pojo
.
MatchLast
{
sql_build
:=
`
SELECT
la
.*
FROM
foot
.
t_match_his
la
WHERE
1
=
1
`
sql_build
=
sql_build
+
" AND la.MatchDate >= '"
+
season
+
"-01-01 00:00:00' AND la.MatchDate <= '"
+
season
+
"-12-31 23:59:59'"
//
结果值
dataList
:=
make
([]*
pojo
.
MatchLast
,
0
)
//
执行查询
this
.
FindBySQL
(
sql_build
,
&
dataList
)
return
dataList
}
~~~
link_stat_c4.sql
0 → 100644
浏览文件 @
572788f2
SELECT
*
FROM
(
SELECT
ar
.
`AlFlag`
AS
'flag'
,
DATE_FORMAT
(
ar
.
`MatchDate`
,
'%w'
)
AS
'week'
,
ar
.
`LetBall`
AS
'letball'
,
COUNT
(
1
)
AS
'total'
,
SUM
(
IF
(
ar
.
`Result`
=
"命中"
,
1
,
0
))
AS
'right'
,
SUM
(
IF
(
ar
.
`Result`
=
"错误"
,
1
,
0
))
AS
'error'
,
SUM
(
IF
(
ar
.
`Result`
=
"走盘"
,
1
,
0
))
AS
'none'
,
SUM
(
IF
(
mh
.
`MainTeamGoals`
>
mh
.
`GuestTeamGoals`
,
1
,
0
)
)
AS
'3'
,
SUM
(
IF
(
mh
.
`MainTeamGoals`
=
mh
.
`GuestTeamGoals`
,
1
,
0
)
)
AS
'1'
,
SUM
(
IF
(
mh
.
`MainTeamGoals`
<
mh
.
`GuestTeamGoals`
,
1
,
0
)
)
AS
'0'
FROM
foot
.
`t_analy_result`
ar
,
foot
.
`t_match_his`
mh
,
foot
.
`t_league`
l
WHERE
ar
.
`MatchId`
=
mh
.
`Id`
AND
mh
.
`LeagueId`
=
l
.
`Id`
AND
ar
.
`TOVoidDesc`
=
''
AND
ar
.
`Result`
!=
"待定"
AND
ar
.
`AlFlag`
IN
(
'C4'
)
#
AND
DATE_FORMAT
(
ar
.
`MatchDate`
,
'%w'
)
=
0
GROUP
BY
ar
.
`AlFlag`
,
DATE_FORMAT
(
ar
.
`MatchDate`
,
'%w'
),
ar
.
`LetBall`
ORDER
BY
ar
.
`AlFlag`
,
DATE_FORMAT
(
ar
.
`MatchDate`
,
'%w'
),
ar
.
`LetBall`
)
t
WHERE
t
.
total
>
10
AND
(
t
.
error
/
t
.
total
>=
0
.
8
OR
t
.
right
/
t
.
total
>=
0
.
8
OR
t
.
none
/
t
.
total
>=
0
.
8
OR
t
.
1
/
t
.
total
>
0
.
5
)
ORDER
BY
t
.
week
ASC
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录