Compare commits
25 Commits
develop
...
e8ab043be7
Author | SHA1 | Date | |
---|---|---|---|
e8ab043be7 | |||
a212583f41 | |||
90cb23d8c9 | |||
c97a3b3bcb | |||
4652955c2a | |||
9fcae03b02 | |||
64ce45cd0a | |||
82f944f28a | |||
2c436b1a6c | |||
a63f196e0b | |||
cf07d30ca7 | |||
6287bc062f | |||
98ccd35d19 | |||
f9fb6a5b4d | |||
fc605ce397 | |||
9f07e2521e | |||
d424a2fd20 | |||
4d83580f69 | |||
a29a211ee5 | |||
911ff18b5a | |||
d491d147f4 | |||
81fb0900df | |||
a4f6d5af95 | |||
43bd254dde | |||
eaa37708c7 |
42
cmd/define.go
Normal file
42
cmd/define.go
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
// Package cmd...
|
||||||
|
//
|
||||||
|
// Description : cmd...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 2021-11-12 2:18 下午
|
||||||
|
package cmd
|
||||||
|
|
||||||
|
// Config 配置
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 2:19 下午 2021/11/12
|
||||||
|
type Config struct {
|
||||||
|
WorkDir string `json:"work_dir"` // 工作目录
|
||||||
|
Command string `json:"command"` // 指令
|
||||||
|
Script string `json:"script"` // 脚本
|
||||||
|
ParameterList []Parameter `json:"parameter_list"` // 参数列表
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parameter ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 2:21 下午 2021/11/12
|
||||||
|
type Parameter struct {
|
||||||
|
Key string `json:"key"`
|
||||||
|
Value string `json:"value"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Result ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 4:25 下午 2021/11/12
|
||||||
|
type Result struct {
|
||||||
|
WorkDir string `json:"work_dir"`
|
||||||
|
Err error `json:"err"`
|
||||||
|
Output []byte `json:"output"`
|
||||||
|
ExecuteCommand string `json:"execute_command"`
|
||||||
|
}
|
58
cmd/execute.go
Normal file
58
cmd/execute.go
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
// Package cmd...
|
||||||
|
//
|
||||||
|
// Description : cmd...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 2021-11-12 2:21 下午
|
||||||
|
package cmd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os/exec"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"git.zhangdeman.cn/zhangdeman/gopkg/util"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Execute 执行指令
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 2:22 下午 2021/11/12
|
||||||
|
func Execute(cmdConfig Config) *Result {
|
||||||
|
if len(cmdConfig.WorkDir) == 0 {
|
||||||
|
cmdConfig.WorkDir, _ = util.GetProjectPath()
|
||||||
|
}
|
||||||
|
paramList := buildCmdParameter(cmdConfig.Script, cmdConfig.ParameterList)
|
||||||
|
cmdInstance := exec.Command(cmdConfig.Command, paramList...)
|
||||||
|
// 设置指令的工作目录
|
||||||
|
cmdInstance.Dir = cmdConfig.WorkDir
|
||||||
|
result := &Result{
|
||||||
|
Err: nil,
|
||||||
|
Output: nil,
|
||||||
|
WorkDir: cmdConfig.WorkDir,
|
||||||
|
ExecuteCommand: cmdConfig.Command + " " + strings.Join(paramList, " "),
|
||||||
|
}
|
||||||
|
result.Output, result.Err = cmdInstance.CombinedOutput()
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// buildCmdParameter 构建参数列表
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 2:53 下午 2021/11/12
|
||||||
|
func buildCmdParameter(script string, parameterList []Parameter) []string {
|
||||||
|
paramList := make([]string, 0)
|
||||||
|
if len(script) > 0 {
|
||||||
|
paramList = append(paramList, script)
|
||||||
|
}
|
||||||
|
for _, item := range parameterList {
|
||||||
|
if len(item.Key) == 0 {
|
||||||
|
paramList = append(paramList, item.Value)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
paramList = append(paramList, item.Key+"="+item.Value)
|
||||||
|
}
|
||||||
|
return paramList
|
||||||
|
}
|
17
git_hook/abstract.go
Normal file
17
git_hook/abstract.go
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
// Package git_hook...
|
||||||
|
//
|
||||||
|
// Description : git_hook...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 2021-11-11 6:41 下午
|
||||||
|
package git_hook
|
||||||
|
|
||||||
|
import "github.com/gin-gonic/gin"
|
||||||
|
|
||||||
|
// IGitHookEventHandler 接口约束, pkg 内部会提供基础实现
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 6:42 下午 2021/11/11
|
||||||
|
type IGitHookEventHandler func(ctx *gin.Context, hookData *HookData) *ResponseData
|
165
git_hook/define.go
Normal file
165
git_hook/define.go
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
// Package git_hook...
|
||||||
|
//
|
||||||
|
// Description : git_hook...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 2021-11-11 6:23 下午
|
||||||
|
package git_hook
|
||||||
|
|
||||||
|
// HookData hook通知数据
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 6:23 下午 2021/11/11
|
||||||
|
type HookData struct {
|
||||||
|
Repository Repository `json:"repository"` // 仓库信息
|
||||||
|
Sender User `json:"sender"`
|
||||||
|
Ref string `json:"ref"` // 分支,如 : refs/heads/master
|
||||||
|
Before string `json:"before"` // 之前版本号 : e162757f3f4a37786b4118a5346baae5dd24ecde
|
||||||
|
After string `json:"after"` // 当前版本号 : c70a362d850a820704bd374363ea4e7ea810fd1a
|
||||||
|
HeadCommit Commit `json:"head_commit"` // 最近一次提交
|
||||||
|
CompareUrl string `json:"compare_url"` // 两个版本号代码diff的URL, 点击后可查看diff
|
||||||
|
Commits []Commit `json:"commits"` // 提交记录列表
|
||||||
|
Pusher User `json:"pusher"` // 推送人信息
|
||||||
|
}
|
||||||
|
|
||||||
|
// Repository 仓库信息
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 6:24 下午 2021/11/11
|
||||||
|
type Repository struct {
|
||||||
|
Mirror bool `json:"mirror"`
|
||||||
|
OriginalUrl string `json:"original_url"` // original_url
|
||||||
|
StarsCount int64 `json:"stars_count"` // start 数量
|
||||||
|
IgnoreWhitespaceConflicts bool `json:"ignore_whitespace_conflicts"` // 忽略空格的冲突
|
||||||
|
FullName string `json:"full_name"` // 仓库完整名称
|
||||||
|
Fork bool `json:"fork"` // 是否 fork
|
||||||
|
CreatedAt string `json:"created_at"` // 创建时间
|
||||||
|
Internal bool `json:"internal"` // 是否内部仓库
|
||||||
|
AllowRebaseExplicit bool `json:"allow_rebase_explicit"` // 是否允许rebase
|
||||||
|
MirrorInterval string `json:"mirror_interval"` // mirror_interval
|
||||||
|
CloneUrl string `json:"clone_url"` // gi clone 对用的 https 地址
|
||||||
|
WatchersCount int64 `json:"watchers_count"` // 监听器数量
|
||||||
|
OpenIssuesCount int64 `json:"open_issues_count"` // 未解决的issues数量
|
||||||
|
ReleaseCounter int64 `json:"release_counter"` // 发布版本数量
|
||||||
|
InternalTracker RepositoryInternalTracker `json:"internal_tracker"` // 内部跟踪配置
|
||||||
|
Name string `json:"name"` // 仓库名称
|
||||||
|
Empty bool `json:"empty"` // 仓库是否为空
|
||||||
|
SshUrl string `json:"ssh_url"` // git clone 对应的 ssh 地址
|
||||||
|
ForksCount int64 `json:"forks_count"` // fork 次数
|
||||||
|
Permissions RepositoryPermission `json:"permissions"` // 权限配置
|
||||||
|
Private bool `json:"private"` // 是否为私有仓库
|
||||||
|
Size int64 `json:"size"` // 仓库大小 KB
|
||||||
|
HasWiki bool `json:"has_wiki"` // 是否有 wiki
|
||||||
|
HasProjects bool `json:"has_projects"` // 是否有项目
|
||||||
|
AllowMergeCommits bool `json:"allow_merge_commits"` // 是否允许合并提交
|
||||||
|
AvatarUrl string `json:"avatar_url"` // 头像地址
|
||||||
|
ID int64 `json:"id"` // 仓库ID
|
||||||
|
Description string `json:"description"` // 创建仓库时候的描述
|
||||||
|
Website string `json:"website"` // 网站
|
||||||
|
UpdatedAt string `json:"updated_at"` // 更新时间
|
||||||
|
HasPullRequests bool `json:"has_pull_requests"` // 是否有 pull request
|
||||||
|
Parent map[string]interface{} `json:"parent"` // parent
|
||||||
|
OpenPrCounter int64 `json:"open_pr_counter"` // 打开的pr数量
|
||||||
|
HasIssues bool `json:"has_issues"` // 是否有issues
|
||||||
|
AllowRebase bool `json:"allow_rebase"` // 是否允许rebase
|
||||||
|
AllowSquashMerge bool `json:"allow_squash_merge"` // 是否允许 合并 merge (将分支内容合并成一次提交, 合入主干)
|
||||||
|
Owner User `json:"owner"` // 仓库所有者信息
|
||||||
|
Template bool `json:"template"` // 是否是模版
|
||||||
|
HtmlUrl string `json:"html_url"` // 访问仓库的html地址
|
||||||
|
DefaultBranch string `json:"default_branch"` // 默认分支
|
||||||
|
Archived bool `json:"archived"` // 是否已归档
|
||||||
|
DefaultMergeStyle string `json:"default_merge_style"` // 默认的合并方式
|
||||||
|
}
|
||||||
|
|
||||||
|
// RepositoryInternalTracker 内部跟踪器
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 6:28 下午 2021/11/11
|
||||||
|
type RepositoryInternalTracker struct {
|
||||||
|
EnableTimeTracker bool `json:"enable_time_tracker"` // 启用time_tracker
|
||||||
|
AllowOnlyContributorsToTrackTime bool `json:"allow_only_contributors_to_track_time"` // 仅有代码贡献者允许
|
||||||
|
EnableIssueDependencies bool `json:"enable_issue_dependencies"` // 启用 issue_dependencies
|
||||||
|
}
|
||||||
|
|
||||||
|
// RepositoryPermission 仓库权限
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 6:29 下午 2021/11/11
|
||||||
|
type RepositoryPermission struct {
|
||||||
|
Pull bool `json:"pull"` // 是否允许 pull 代码
|
||||||
|
Admin bool `json:"admin"` // 是否是管理员
|
||||||
|
Push bool `json:"push"` // 是否允许push代码
|
||||||
|
}
|
||||||
|
|
||||||
|
// User 用户信息
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 6:30 下午 2021/11/11
|
||||||
|
type User struct {
|
||||||
|
IsAdmin bool `json:"is_admin"` // 是否是管理员
|
||||||
|
Website string `json:"website"` // 网页
|
||||||
|
Email string `json:"email"` // 邮箱
|
||||||
|
AvatarUrl string `json:"avatar_url"` // 头像
|
||||||
|
ProhibitLogin bool `json:"prohibit_login"` // 禁止登录
|
||||||
|
Description string `json:"description"` // 描述
|
||||||
|
FollowingCount int64 `json:"following_count"` // follower数量
|
||||||
|
StarredReposCount int64 `json:"starred_repos_count"` // star仓库数量
|
||||||
|
Username string `json:"username"` // 用户名
|
||||||
|
Login string `json:"login"` // 登录
|
||||||
|
Created string `json:"created"` // 创建时间
|
||||||
|
Visibility string `json:"visibility"` // 是否可见
|
||||||
|
FullName string `json:"full_name"` // 全名
|
||||||
|
LastLogin string `json:"last_login"` // 最近登录时间
|
||||||
|
Restricted bool `json:"restricted"` // 是否受限
|
||||||
|
Active bool `json:"active"` // 是否活跃
|
||||||
|
Location string `json:"location"` // 位置
|
||||||
|
FollowersCount int64 `json:"followers_count"` // follower数量
|
||||||
|
ID int64 `json:"id"` // id
|
||||||
|
Language string `json:"language"` // 语言
|
||||||
|
}
|
||||||
|
|
||||||
|
// Commit 提交记录信息
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 6:25 下午 2021/11/11
|
||||||
|
type Commit struct {
|
||||||
|
Message string `json:"message"` // 提交时带的message
|
||||||
|
Url string `json:"url"` // 浏览此版本代码的地址
|
||||||
|
Author CommitAuthor `json:"author"` // 作者信息
|
||||||
|
Verification map[string]interface{} `json:"verification"` // 验证
|
||||||
|
Timestamp string `json:"timestamp"` // 时间
|
||||||
|
ID string `json:"id"` // 提交的版本号 98ccd35d19d17c8e624a492cc5811fe6f381ca09
|
||||||
|
Committer CommitAuthor `json:"committer"` // 提交人信息
|
||||||
|
Added []string `json:"added"` // 增加的文件列表
|
||||||
|
Removed []string `json:"removed"` // 移除文件列表
|
||||||
|
Modified []string `json:"modified"` // 修改的文件列表
|
||||||
|
}
|
||||||
|
|
||||||
|
// CommitAuthor 提交人的信息
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 6:31 下午 2021/11/11
|
||||||
|
type CommitAuthor struct {
|
||||||
|
Name string `json:"name"` // 昵称
|
||||||
|
Email string `json:"email"` // 邮箱
|
||||||
|
Username string `json:"username"` // 用户名
|
||||||
|
}
|
||||||
|
|
||||||
|
// ResponseData 处理结果的返回值
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 11:37 上午 2021/11/12
|
||||||
|
type ResponseData struct {
|
||||||
|
Code interface{} `json:"code"`
|
||||||
|
Message string `json:"message"`
|
||||||
|
Data interface{} `json:"data"`
|
||||||
|
}
|
45
git_hook/register.go
Normal file
45
git_hook/register.go
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
// Package git_hook...
|
||||||
|
//
|
||||||
|
// Description : git_hook...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 2021-11-11 6:39 下午
|
||||||
|
package git_hook
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
// RegisterGitHookRouter 注册 git hook 回调的路由
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 6:40 下午 2021/11/11
|
||||||
|
func RegisterGitHookRouter(router *gin.Engine, handler IGitHookEventHandler) error {
|
||||||
|
if nil == handler {
|
||||||
|
return errors.New("handler is nil")
|
||||||
|
}
|
||||||
|
router.POST("/git/hook/notice", func(ctx *gin.Context) {
|
||||||
|
var (
|
||||||
|
hookData HookData
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
if err = ctx.ShouldBindJSON(&hookData); nil != err {
|
||||||
|
ctx.JSON(http.StatusBadRequest, gin.H{"code": -1, "message": err.Error()})
|
||||||
|
}
|
||||||
|
responseData := handler(ctx, &hookData)
|
||||||
|
if nil == responseData {
|
||||||
|
responseData = &ResponseData{
|
||||||
|
Code: 100,
|
||||||
|
Message: "处理完成(未设置返回值,系统默认返回此信息)",
|
||||||
|
Data: map[string]interface{}{},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ctx.JSON(http.StatusOK, responseData)
|
||||||
|
})
|
||||||
|
return nil
|
||||||
|
}
|
2
go.mod
2
go.mod
@ -66,7 +66,7 @@ require (
|
|||||||
go.uber.org/multierr v1.6.0 // indirect
|
go.uber.org/multierr v1.6.0 // indirect
|
||||||
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e // indirect
|
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e // indirect
|
||||||
golang.org/x/net v0.0.0-20210614182718-04defd469f4e // indirect
|
golang.org/x/net v0.0.0-20210614182718-04defd469f4e // indirect
|
||||||
golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71 // indirect
|
golang.org/x/sys v0.0.0-20211103235746-7861aae1554b // indirect
|
||||||
google.golang.org/protobuf v1.26.0 // indirect
|
google.golang.org/protobuf v1.26.0 // indirect
|
||||||
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
|
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
|
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
|
||||||
|
3
go.sum
3
go.sum
@ -226,8 +226,9 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71 h1:ikCpsnYR+Ew0vu99XlDp55lGgDJdIMx3f4a18jfse/s=
|
|
||||||
golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20211103235746-7861aae1554b h1:1VkfZQv42XQlA/jchYumAnv1UPo6RgF9rJFkTgZIxO4=
|
||||||
|
golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
|
139
middleware/mysql/wrapper/define.go
Normal file
139
middleware/mysql/wrapper/define.go
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
// Package wrapper...
|
||||||
|
//
|
||||||
|
// Description : wrapper...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 2021-11-15 6:02 下午
|
||||||
|
package wrapper
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git.zhangdeman.cn/zhangdeman/gopkg/middleware/mysql"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
// DBConfig ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 7:00 下午 2021/11/15
|
||||||
|
type DBConfig struct {
|
||||||
|
DBConfig *mysql.DBConfig
|
||||||
|
LogConfig *mysql.LogConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// DBWrapperConfig ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 6:58 下午 2021/11/15
|
||||||
|
type DBWrapperConfig struct {
|
||||||
|
Write *DBConfig
|
||||||
|
Read *DBConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewDBWrapper 获取包装后的数据库实例
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 6:45 下午 2021/11/15
|
||||||
|
func NewDBWrapper(cf *DBWrapperConfig) (*DBWrapper, error) {
|
||||||
|
var (
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
if nil == cf {
|
||||||
|
return nil, errors.New("cf is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
if nil == cf.Write {
|
||||||
|
return nil, errors.New("write cf is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
if nil == cf.Read {
|
||||||
|
return nil, errors.New("read cf is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
wrapperInstance := &DBWrapper{}
|
||||||
|
if wrapperInstance.write, err = mysql.GetDatabaseClient(cf.Write.DBConfig, cf.Write.LogConfig); nil != err {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if wrapperInstance.read, err = mysql.GetDatabaseClient(cf.Read.DBConfig, cf.Read.LogConfig); nil != err {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return wrapperInstance, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DBWrapper 数据库包装
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 6:02 下午 2021/11/15
|
||||||
|
type DBWrapper struct {
|
||||||
|
read *gorm.DB // 读库实例
|
||||||
|
write *gorm.DB // 写库实例
|
||||||
|
}
|
||||||
|
|
||||||
|
// SelectDBOption 数据库实力选择时的选项
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 6:33 下午 2021/11/15
|
||||||
|
type SelectDBOption struct {
|
||||||
|
Table string
|
||||||
|
ForceMaster bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetSelectDBOption 设置选项
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 6:34 下午 2021/11/15
|
||||||
|
type SetSelectDBOption func(o *SelectDBOption)
|
||||||
|
|
||||||
|
// GetWriteInstance 获取主库实例
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 6:31 下午 2021/11/15
|
||||||
|
func (dw *DBWrapper) GetWriteInstance(instanceOptionList ...SetSelectDBOption) *gorm.DB {
|
||||||
|
option := dw.getOption(instanceOptionList...)
|
||||||
|
instance := dw.write
|
||||||
|
if len(option.Table) > 0 {
|
||||||
|
instance.Table(option.Table)
|
||||||
|
}
|
||||||
|
return instance
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetReadInstance 获取读库实例
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 6:32 下午 2021/11/15
|
||||||
|
func (dw *DBWrapper) GetReadInstance(instanceOptionList ...SetSelectDBOption) *gorm.DB {
|
||||||
|
option := dw.getOption(instanceOptionList...)
|
||||||
|
instance := dw.read
|
||||||
|
if option.ForceMaster || nil == dw.read {
|
||||||
|
instance = dw.write
|
||||||
|
}
|
||||||
|
if len(option.Table) > 0 {
|
||||||
|
instance.Table(option.Table)
|
||||||
|
}
|
||||||
|
return instance
|
||||||
|
}
|
||||||
|
|
||||||
|
// getOption 生成option
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 6:35 下午 2021/11/15
|
||||||
|
func (dw *DBWrapper) getOption(instanceOptionList ...SetSelectDBOption) *SelectDBOption {
|
||||||
|
o := &SelectDBOption{
|
||||||
|
Table: "",
|
||||||
|
ForceMaster: false,
|
||||||
|
}
|
||||||
|
for _, f := range instanceOptionList {
|
||||||
|
f(o)
|
||||||
|
}
|
||||||
|
return o
|
||||||
|
}
|
8
middleware/tile38/define.go
Normal file
8
middleware/tile38/define.go
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
// Package tile38 ...
|
||||||
|
//
|
||||||
|
// Description : tile38 ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 2021-11-18 3:45 下午
|
||||||
|
package tile38
|
185
tool/json2go/parser.go
Normal file
185
tool/json2go/parser.go
Normal file
@ -0,0 +1,185 @@
|
|||||||
|
// Package json2go ...
|
||||||
|
//
|
||||||
|
// Description : json2go ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 2021-11-09 3:44 下午
|
||||||
|
package json2go
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"git.zhangdeman.cn/zhangdeman/gopkg/util"
|
||||||
|
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
"github.com/tidwall/gjson"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// structName 结构体名称
|
||||||
|
structName = "Automatic"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewJSON2GO ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 6:13 下午 2021/11/9
|
||||||
|
func NewJSON2GO(name string) *JSON2GO {
|
||||||
|
if len(name) == 0 {
|
||||||
|
name = structName
|
||||||
|
}
|
||||||
|
return &JSON2GO{
|
||||||
|
structName: name,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// JSON2GO ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 6:12 下午 2021/11/9
|
||||||
|
type JSON2GO struct {
|
||||||
|
structName string
|
||||||
|
result string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 3:44 下午 2021/11/9
|
||||||
|
func (jg *JSON2GO) Parse(inputJSON string) (string, error) {
|
||||||
|
if !gjson.Valid(inputJSON) {
|
||||||
|
return "", errors.New("input json is invalid")
|
||||||
|
}
|
||||||
|
parseResult := gjson.Parse(inputJSON)
|
||||||
|
if parseResult.IsArray() {
|
||||||
|
jg.append("type " + jg.structName + " [] \n")
|
||||||
|
jg.parseArray("", parseResult)
|
||||||
|
} else {
|
||||||
|
jg.append("type " + jg.structName + " struct { \n")
|
||||||
|
jg.parseObject("", parseResult)
|
||||||
|
}
|
||||||
|
jg.append("}")
|
||||||
|
return jg.result, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// parseArray 解析array
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 4:37 下午 2021/11/9
|
||||||
|
func (jg *JSON2GO) parseArray(key string, parseResult gjson.Result) {
|
||||||
|
// 先遍历一遍确认所有数据类型都相同
|
||||||
|
dataType := ""
|
||||||
|
if len(parseResult.Array()) > 0 {
|
||||||
|
for _, item := range parseResult.Array() {
|
||||||
|
if len(dataType) == 0 {
|
||||||
|
dataType = jg.getDataType(item)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
currentType := jg.getDataType(item)
|
||||||
|
if currentType != dataType {
|
||||||
|
if (dataType == "int64" && currentType == "float64") || (dataType == "float64" && currentType == "int64") {
|
||||||
|
dataType = "float64"
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// 不是所有数据类型都一致
|
||||||
|
if len(key) == 0 {
|
||||||
|
jg.result += "interface{}"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
jg.append(jg.buildField("[]interface{}", key))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
dataType = "interface{}"
|
||||||
|
}
|
||||||
|
// 对象,重新
|
||||||
|
if dataType == "object" {
|
||||||
|
instance := NewJSON2GO("")
|
||||||
|
r, _ := instance.Parse(parseResult.Array()[0].String())
|
||||||
|
dataType = strings.Replace(strings.Replace(r, "type", "", 1), "Automatic", "", 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 所有数据类型都一致
|
||||||
|
if len(key) == 0 {
|
||||||
|
jg.append("[]" + dataType)
|
||||||
|
} else {
|
||||||
|
jg.append(jg.buildField("[]"+dataType, key))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// parseObject 解析object
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 4:37 下午 2021/11/9
|
||||||
|
func (jg *JSON2GO) parseObject(key string, parseResult gjson.Result) string {
|
||||||
|
if len(key) > 0 {
|
||||||
|
jg.result += util.SnakeCaseToCamel(key) + " struct { \n"
|
||||||
|
}
|
||||||
|
for k, v := range parseResult.Map() {
|
||||||
|
if v.IsObject() {
|
||||||
|
jg.parseObject(k, v)
|
||||||
|
} else if v.IsArray() {
|
||||||
|
jg.parseArray(k, v)
|
||||||
|
} else {
|
||||||
|
jg.append(jg.buildField(jg.getDataType(v), k))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(key) > 0 {
|
||||||
|
jg.append(" } `json:\"" + key + "\"`\n")
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// getDataType 获取数据类型
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 8:14 下午 2021/11/9
|
||||||
|
func (jg *JSON2GO) getDataType(val gjson.Result) string {
|
||||||
|
switch val.Type {
|
||||||
|
case gjson.True:
|
||||||
|
fallthrough
|
||||||
|
case gjson.False:
|
||||||
|
return "bool"
|
||||||
|
case gjson.Null:
|
||||||
|
return "map[string]interface{}"
|
||||||
|
case gjson.String:
|
||||||
|
return "string"
|
||||||
|
case gjson.Number:
|
||||||
|
tmpVal := fmt.Sprintf("%v", val.Num)
|
||||||
|
if strings.Contains(tmpVal, ".") {
|
||||||
|
return "float64"
|
||||||
|
}
|
||||||
|
return "int64"
|
||||||
|
case gjson.JSON:
|
||||||
|
return "object"
|
||||||
|
default:
|
||||||
|
return "interface{}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// buildField 构建字段
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 9:20 下午 2021/11/9
|
||||||
|
func (jq *JSON2GO) buildField(fieldType string, jsonTag string) string {
|
||||||
|
return util.SnakeCaseToCamel(jsonTag) + " " + fieldType + " `json:\"" + jsonTag + "\"`\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
// append 构建result
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 9:19 下午 2021/11/9
|
||||||
|
func (jq *JSON2GO) append(appendStr string) {
|
||||||
|
jq.result += appendStr
|
||||||
|
}
|
59
tool/sql2go/dao_tpl.tpl
Normal file
59
tool/sql2go/dao_tpl.tpl
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
// Package {PACKAGE} ...
|
||||||
|
//
|
||||||
|
// Description : {PACKAGE} ...
|
||||||
|
package {PACKAGE}
|
||||||
|
|
||||||
|
import (
|
||||||
|
"gorm.io/gorm"
|
||||||
|
"errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
// {DATA_STRUCT_NAME} 数据库表的数据结构
|
||||||
|
{DATA_STRUCT}
|
||||||
|
|
||||||
|
// New{DATA_STRUCT_DAO} 获取DAO实例
|
||||||
|
func New{DATA_STRUCT_DAO}() *{DATA_STRUCT_DAO} {
|
||||||
|
return &{DATA_STRUCT_DAO}{
|
||||||
|
table : "{DB_TABLE_NAME}",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// {DATA_STRUCT_DAO} sql2go tool generate
|
||||||
|
type {DATA_STRUCT_DAO} struct {
|
||||||
|
table string
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetDetailBy{PRIMARY_KEY} 根据主键ID获取详情
|
||||||
|
func ({DAO_RECEIVER} *{DATA_STRUCT_DAO}) GetDetailBy{PRIMARY_KEY}(dbInstance *gorm.DB, {PRIMARY_KEY} {PRIMARY_KEY_TYPE}) (*{DATA_STRUCT_NAME}, error) {
|
||||||
|
var (
|
||||||
|
err error
|
||||||
|
detail {DATA_STRUCT_NAME}
|
||||||
|
)
|
||||||
|
if err = dbInstance.Table({DAO_RECEIVER}.table).Where("{PRIMARY_KEY_FIELD} = ?", {PRIMARY_KEY}).Limit(1).First(&detail).Error; nil != err {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &detail, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetList 获取数据列表
|
||||||
|
func ({DAO_RECEIVER} *{DATA_STRUCT_DAO}) GetList(dbInstance *gorm.DB, condition map[string]interface{}, limit int, offset int) ([]{DATA_STRUCT_NAME}, error) {
|
||||||
|
if nil == condition {
|
||||||
|
condition = make(map[string]interface{})
|
||||||
|
}
|
||||||
|
var (
|
||||||
|
err error
|
||||||
|
list []{DATA_STRUCT_NAME}
|
||||||
|
)
|
||||||
|
if err = dbInstance.Table({DAO_RECEIVER}.table).Where(condition).Limit(limit).Offset(offset).Find(&list).Error; nil != err {
|
||||||
|
return make([]{DATA_STRUCT_NAME}, 0), err
|
||||||
|
}
|
||||||
|
return list, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create 创建数据
|
||||||
|
func ({DAO_RECEIVER} *{DATA_STRUCT_DAO}) Create(dbInstance *gorm.DB, data *{DATA_STRUCT_NAME}) error {
|
||||||
|
if nil == data {
|
||||||
|
return errors.New("data is nil")
|
||||||
|
}
|
||||||
|
return dbInstance.Table({DAO_RECEIVER}.table).Create(data).Error
|
||||||
|
}
|
59
tool/sql2go/generate_dao.go
Normal file
59
tool/sql2go/generate_dao.go
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
// Package sql2go...
|
||||||
|
//
|
||||||
|
// Description : sql2go...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 2021-11-17 10:14 上午
|
||||||
|
package sql2go
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"git.zhangdeman.cn/zhangdeman/gopkg/util"
|
||||||
|
)
|
||||||
|
|
||||||
|
// GenerateDao 根据sql自动生成dao
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 10:15 上午 2021/11/17
|
||||||
|
func GenerateDao(sql string, packageName string) (string, error) {
|
||||||
|
if len(packageName) == 0 {
|
||||||
|
packageName = "dao"
|
||||||
|
}
|
||||||
|
dataStruct, basic, err := ParseCreateTableSql(sql)
|
||||||
|
if nil != err {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
// 读入模板
|
||||||
|
tplByte, _ := util.ReadFileContent("dao_tpl.tpl")
|
||||||
|
tpl := string(tplByte)
|
||||||
|
replaceTable := map[string]string{
|
||||||
|
"{PACKAGE}": packageName,
|
||||||
|
"{DATA_STRUCT_DAO}": basic.ModelStruct + "Dao",
|
||||||
|
"{DATA_STRUCT_NAME}": basic.ModelStruct,
|
||||||
|
"{DATA_STRUCT}": dataStruct,
|
||||||
|
"{DAO_RECEIVER}": getDaoReceiver(basic.TableName),
|
||||||
|
"{DB_TABLE_NAME}": basic.TableName,
|
||||||
|
"{PRIMARY_KEY}": "ID",
|
||||||
|
"{PRIMARY_KEY_TYPE}": basic.PrimaryFieldType,
|
||||||
|
}
|
||||||
|
|
||||||
|
for oldVal, newVal := range replaceTable {
|
||||||
|
tpl = strings.ReplaceAll(tpl, oldVal, newVal)
|
||||||
|
}
|
||||||
|
return tpl, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getDaoReceiver(tableName string) string {
|
||||||
|
nameArr := strings.Split(tableName, "_")
|
||||||
|
result := ""
|
||||||
|
for _, item := range nameArr {
|
||||||
|
if len(item) > 0 {
|
||||||
|
result += string([]byte(item)[0])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result += "d"
|
||||||
|
return result
|
||||||
|
}
|
@ -20,23 +20,44 @@ const (
|
|||||||
CreateSQLColumnTPL = "{FIELD} {TYPE} `json:\"{JSON_TAG}\" gorm:\"column:{COLUMN};default:{DEFAULT_VALUE};{NOT_NULL}\"` // {COMMENT}"
|
CreateSQLColumnTPL = "{FIELD} {TYPE} `json:\"{JSON_TAG}\" gorm:\"column:{COLUMN};default:{DEFAULT_VALUE};{NOT_NULL}\"` // {COMMENT}"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// BasicTableInfo ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 11:47 上午 2021/11/17
|
||||||
|
type BasicTableInfo struct {
|
||||||
|
TableName string
|
||||||
|
ModelStruct string
|
||||||
|
PrimaryField string
|
||||||
|
PrimaryFieldType string
|
||||||
|
}
|
||||||
|
|
||||||
// ParseCreateTableSql 解析建表sql
|
// ParseCreateTableSql 解析建表sql
|
||||||
//
|
//
|
||||||
// Author : go_developer@163.com<白茶清欢>
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
//
|
//
|
||||||
// Date : 4:49 下午 2021/10/25
|
// Date : 4:49 下午 2021/10/25
|
||||||
func ParseCreateTableSql(sql string) (string, error) {
|
func ParseCreateTableSql(sql string) (string, *BasicTableInfo, error) {
|
||||||
var (
|
var (
|
||||||
stmt sqlparser.Statement
|
stmt sqlparser.Statement
|
||||||
err error
|
err error
|
||||||
|
basic *BasicTableInfo
|
||||||
)
|
)
|
||||||
sql = strings.ReplaceAll(strings.ToUpper(sql), "CURRENT_TIMESTAMP()", "CURRENT_TIMESTAMP")
|
basic = &BasicTableInfo{
|
||||||
|
TableName: "",
|
||||||
|
ModelStruct: "",
|
||||||
|
PrimaryField: "ID",
|
||||||
|
PrimaryFieldType: "",
|
||||||
|
}
|
||||||
|
sql = strings.ReplaceAll(strings.ReplaceAll(sql, "CURRENT_TIMESTAMP()", "CURRENT_TIMESTAMP"), "current_timestamp()", "CURRENT_TIMESTAMP")
|
||||||
if stmt, err = sqlparser.ParseStrictDDL(sql); nil != err {
|
if stmt, err = sqlparser.ParseStrictDDL(sql); nil != err {
|
||||||
return "", err
|
return "", nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
r := stmt.(*sqlparser.DDL)
|
r := stmt.(*sqlparser.DDL)
|
||||||
structResult := "type " + util.SnakeCaseToCamel(sqlparser.String(r.NewName)) + " struct { \n"
|
basic.TableName = sqlparser.String(r.NewName)
|
||||||
|
basic.ModelStruct = util.SnakeCaseToCamel(basic.TableName)
|
||||||
|
structResult := "type " + basic.ModelStruct + " struct { \n"
|
||||||
|
|
||||||
for _, item := range r.TableSpec.Columns {
|
for _, item := range r.TableSpec.Columns {
|
||||||
data := map[string]string{
|
data := map[string]string{
|
||||||
@ -47,6 +68,9 @@ func ParseCreateTableSql(sql string) (string, error) {
|
|||||||
"{COMMENT}": item.Name.String() + " " + string(item.Type.Comment.Val),
|
"{COMMENT}": item.Name.String() + " " + string(item.Type.Comment.Val),
|
||||||
"{TYPE}": sqlTypeMap[item.Type.Type],
|
"{TYPE}": sqlTypeMap[item.Type.Type],
|
||||||
}
|
}
|
||||||
|
if data["{FIELD}"] == "ID" {
|
||||||
|
basic.PrimaryFieldType = data["{TYPE}"]
|
||||||
|
}
|
||||||
if item.Type.NotNull {
|
if item.Type.NotNull {
|
||||||
data["{NOT_NULL}"] = "NOT NULL"
|
data["{NOT_NULL}"] = "NOT NULL"
|
||||||
}
|
}
|
||||||
@ -60,5 +84,5 @@ func ParseCreateTableSql(sql string) (string, error) {
|
|||||||
structResult += val + "\n"
|
structResult += val + "\n"
|
||||||
}
|
}
|
||||||
structResult = structResult + "}"
|
structResult = structResult + "}"
|
||||||
return structResult, nil
|
return structResult, basic, nil
|
||||||
}
|
}
|
||||||
|
55
util/json.go
55
util/json.go
@ -10,7 +10,10 @@ package util
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"os"
|
||||||
|
"reflect"
|
||||||
)
|
)
|
||||||
|
|
||||||
// JSONUnmarshalWithNumber 解析json
|
// JSONUnmarshalWithNumber 解析json
|
||||||
@ -34,3 +37,55 @@ func JSONUnmarshalWithNumberForIOReader(ioReader io.ReadCloser, receiver interfa
|
|||||||
decoder.UseNumber()
|
decoder.UseNumber()
|
||||||
return decoder.Decode(receiver)
|
return decoder.Decode(receiver)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// JSONConsoleOutput ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 5:45 下午 2021/11/5
|
||||||
|
func JSONConsoleOutput(data interface{}) {
|
||||||
|
var out bytes.Buffer
|
||||||
|
switch reflect.TypeOf(data).Kind() {
|
||||||
|
case reflect.Slice:
|
||||||
|
fallthrough
|
||||||
|
case reflect.Array:
|
||||||
|
fallthrough
|
||||||
|
case reflect.Map:
|
||||||
|
fallthrough
|
||||||
|
case reflect.Ptr:
|
||||||
|
byteData, _ := json.Marshal(data)
|
||||||
|
_ = json.Indent(&out, []byte(string(byteData)+"\n"), "", "\t")
|
||||||
|
_, _ = out.WriteTo(os.Stdout)
|
||||||
|
return
|
||||||
|
case reflect.Int:
|
||||||
|
fallthrough
|
||||||
|
case reflect.Int8:
|
||||||
|
fallthrough
|
||||||
|
case reflect.Int16:
|
||||||
|
fallthrough
|
||||||
|
case reflect.Int32:
|
||||||
|
fallthrough
|
||||||
|
case reflect.Int64:
|
||||||
|
fallthrough
|
||||||
|
case reflect.Uint:
|
||||||
|
fallthrough
|
||||||
|
case reflect.Uint8:
|
||||||
|
fallthrough
|
||||||
|
case reflect.Uint16:
|
||||||
|
fallthrough
|
||||||
|
case reflect.Uint32:
|
||||||
|
fallthrough
|
||||||
|
case reflect.Uint64:
|
||||||
|
fallthrough
|
||||||
|
case reflect.Float32:
|
||||||
|
fallthrough
|
||||||
|
case reflect.Float64:
|
||||||
|
fallthrough
|
||||||
|
case reflect.String:
|
||||||
|
_ = json.Indent(&out, []byte(fmt.Sprintf("%v\n", data)), "", "\t")
|
||||||
|
_, _ = out.WriteTo(os.Stdout)
|
||||||
|
return
|
||||||
|
default:
|
||||||
|
fmt.Println("")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
209
util/map.go
Normal file
209
util/map.go
Normal file
@ -0,0 +1,209 @@
|
|||||||
|
// Package util ...
|
||||||
|
//
|
||||||
|
// Description : 从map中读取数据
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 2021-11-16 4:28 下午
|
||||||
|
package util
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git.zhangdeman.cn/zhangdeman/gopkg/convert"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Exist 检测一个key在map中是否存在
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 4:52 下午 2021/11/16
|
||||||
|
func Exist(source map[interface{}]interface{}, key interface{}) bool {
|
||||||
|
if nil == source {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if _, exist := source[key]; !exist {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetInt 获取int值
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 4:30 下午 2021/11/16
|
||||||
|
func GetInt(source map[interface{}]interface{}, key interface{}, defaultVal int) int {
|
||||||
|
var result int
|
||||||
|
if err := GetDataWithReceiver(source, key, &result); nil != err {
|
||||||
|
return defaultVal
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetInt8 ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 4:59 下午 2021/11/16
|
||||||
|
func GetInt8(source map[interface{}]interface{}, key interface{}, defaultVal int8) int8 {
|
||||||
|
var result int8
|
||||||
|
if err := GetDataWithReceiver(source, key, &result); nil != err {
|
||||||
|
return defaultVal
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetInt16 ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 4:59 下午 2021/11/16
|
||||||
|
func GetInt16(source map[interface{}]interface{}, key interface{}, defaultVal int16) int16 {
|
||||||
|
var result int16
|
||||||
|
if err := GetDataWithReceiver(source, key, &result); nil != err {
|
||||||
|
return defaultVal
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetInt32 ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 5:00 下午 2021/11/16
|
||||||
|
func GetInt32(source map[interface{}]interface{}, key interface{}, defaultVal int32) int32 {
|
||||||
|
var result int32
|
||||||
|
if err := GetDataWithReceiver(source, key, &result); nil != err {
|
||||||
|
return defaultVal
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetInt64 ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 5:00 下午 2021/11/16
|
||||||
|
func GetInt64(source map[interface{}]interface{}, key interface{}, defaultVal int64) int64 {
|
||||||
|
var result int64
|
||||||
|
if err := GetDataWithReceiver(source, key, &result); nil != err {
|
||||||
|
return defaultVal
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUint ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 5:01 下午 2021/11/16
|
||||||
|
func GetUint(source map[interface{}]interface{}, key interface{}, defaultVal uint) uint {
|
||||||
|
var result uint
|
||||||
|
if err := GetDataWithReceiver(source, key, &result); nil != err {
|
||||||
|
return defaultVal
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUint8 ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 5:01 下午 2021/11/16
|
||||||
|
func GetUint8(source map[interface{}]interface{}, key interface{}, defaultVal uint8) uint8 {
|
||||||
|
var result uint8
|
||||||
|
if err := GetDataWithReceiver(source, key, &result); nil != err {
|
||||||
|
return defaultVal
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUint16 ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 5:02 下午 2021/11/16
|
||||||
|
func GetUint16(source map[interface{}]interface{}, key interface{}, defaultVal uint16) uint16 {
|
||||||
|
var result uint16
|
||||||
|
if err := GetDataWithReceiver(source, key, &result); nil != err {
|
||||||
|
return defaultVal
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUint32 ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 5:02 下午 2021/11/16
|
||||||
|
func GetUint32(source map[interface{}]interface{}, key interface{}, defaultVal uint32) uint32 {
|
||||||
|
var result uint32
|
||||||
|
if err := GetDataWithReceiver(source, key, &result); nil != err {
|
||||||
|
return defaultVal
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUint64 ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 5:03 下午 2021/11/16
|
||||||
|
func GetUint64(source map[interface{}]interface{}, key interface{}, defaultVal uint64) uint64 {
|
||||||
|
var result uint64
|
||||||
|
if err := GetDataWithReceiver(source, key, &result); nil != err {
|
||||||
|
return defaultVal
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetFloat32 ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 5:03 下午 2021/11/16
|
||||||
|
func GetFloat32(source map[interface{}]interface{}, key interface{}, defaultVal float32) float32 {
|
||||||
|
var result float32
|
||||||
|
if err := GetDataWithReceiver(source, key, &result); nil != err {
|
||||||
|
return defaultVal
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetFloat64 ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 5:04 下午 2021/11/16
|
||||||
|
func GetFloat64(source map[interface{}]interface{}, key interface{}, defaultVal float64) float64 {
|
||||||
|
var result float64
|
||||||
|
if err := GetDataWithReceiver(source, key, &result); nil != err {
|
||||||
|
return defaultVal
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetString ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 5:07 下午 2021/11/16
|
||||||
|
func GetString(source map[interface{}]interface{}, key interface{}, defaultVal string) string {
|
||||||
|
var result string
|
||||||
|
if err := GetDataWithReceiver(source, key, &result); nil != err {
|
||||||
|
return defaultVal
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetDataWithReceiver 使用制定的数据指针接受结果
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 4:54 下午 2021/11/16
|
||||||
|
func GetDataWithReceiver(source map[interface{}]interface{}, key interface{}, receiver interface{}) error {
|
||||||
|
if !Exist(source, key) {
|
||||||
|
return errors.New("key is not found")
|
||||||
|
}
|
||||||
|
return convert.ConvertAssign(receiver, source[key])
|
||||||
|
}
|
@ -54,6 +54,9 @@ func Md5(str string) string {
|
|||||||
//
|
//
|
||||||
// Date : 4:58 下午 2021/10/25
|
// Date : 4:58 下午 2021/10/25
|
||||||
func SnakeCaseToCamel(str string) string {
|
func SnakeCaseToCamel(str string) string {
|
||||||
|
if len(str) == 0 {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
builder := strings.Builder{}
|
builder := strings.Builder{}
|
||||||
index := 0
|
index := 0
|
||||||
if str[0] >= 'a' && str[0] <= 'z' {
|
if str[0] >= 'a' && str[0] <= 'z' {
|
||||||
@ -68,6 +71,11 @@ func SnakeCaseToCamel(str string) string {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// 将ID转为大写
|
||||||
|
if str[i] == 'd' && i-1 >= 0 && (str[i-1] == 'i' || str[i-1] == 'I') && (i+1 == len(str) || i+1 < len(str) && str[i+1] == '_') {
|
||||||
|
builder.WriteByte('d' - ('a' - 'A'))
|
||||||
|
continue
|
||||||
|
}
|
||||||
builder.WriteByte(str[i])
|
builder.WriteByte(str[i])
|
||||||
}
|
}
|
||||||
return builder.String()
|
return builder.String()
|
||||||
|
89
util/url.go
Normal file
89
util/url.go
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
// Package util...
|
||||||
|
//
|
||||||
|
// Description : util...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 2021-11-04 2:38 下午
|
||||||
|
package util
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/url"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// URLParseResult url解析
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 2:51 下午 2021/11/4
|
||||||
|
type URLParseResult struct {
|
||||||
|
Scheme string `json:"scheme"`
|
||||||
|
Domain string `json:"domain"`
|
||||||
|
URI string `json:"uri"`
|
||||||
|
Parameter map[string]string `json:"parameter"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// URLEncode ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 2:39 下午 2021/11/4
|
||||||
|
func URLEncode(inputURL string) string {
|
||||||
|
return url.QueryEscape(inputURL)
|
||||||
|
}
|
||||||
|
|
||||||
|
// URLDecode ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 2:39 下午 2021/11/4
|
||||||
|
func URLDecode(inputURL string) (string, error) {
|
||||||
|
return url.QueryUnescape(inputURL)
|
||||||
|
}
|
||||||
|
|
||||||
|
// URLParse url解析
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 2:39 下午 2021/11/4
|
||||||
|
func URLParse(inputURL string) (*URLParseResult, error) {
|
||||||
|
var (
|
||||||
|
parseResult *url.URL
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
if parseResult, err = url.Parse(inputURL); nil != err {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
detail := &URLParseResult{
|
||||||
|
Scheme: parseResult.Scheme,
|
||||||
|
Domain: parseResult.Host,
|
||||||
|
URI: parseResult.Path,
|
||||||
|
Parameter: make(map[string]string),
|
||||||
|
}
|
||||||
|
for k, v := range parseResult.Query() {
|
||||||
|
if len(v) > 1 {
|
||||||
|
detail.Parameter[k] = "[" + strings.Join(v, ",") + "]"
|
||||||
|
} else {
|
||||||
|
detail.Parameter[k] = v[0]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return detail, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// BuildQueryURL 构建GET链接
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<白茶清欢>
|
||||||
|
//
|
||||||
|
// Date : 2:43 下午 2021/11/4
|
||||||
|
func BuildQueryURL(apiURL string, parameter map[string]string) string {
|
||||||
|
u := url.Values{}
|
||||||
|
for k, v := range parameter {
|
||||||
|
u.Set(k, v)
|
||||||
|
}
|
||||||
|
apiURL = strings.Trim(apiURL, "?")
|
||||||
|
if strings.Contains(apiURL, "?") {
|
||||||
|
return apiURL + "&" + u.Encode()
|
||||||
|
}
|
||||||
|
return apiURL + "?" + u.Encode()
|
||||||
|
}
|
Reference in New Issue
Block a user