Compare commits

...

121 Commits

Author SHA1 Message Date
huangsimin@fusen.cn
8008fd4ddb Merge branch 'master' of ssh://gitlab.fusenpack.com/backend/proto 2024-01-24 11:04:11 +08:00
huangsimin@fusen.cn
40e17a3939 删除多余的proto 2024-01-24 11:03:04 +08:00
menghaiwen@fusen.cn
77243bf29e logo算法裁剪去背景 2024-01-24 10:04:50 +08:00
menghaiwen@fusen.cn
b79c053e00 logo算法信息提取 2024-01-23 17:40:10 +08:00
menghaiwen@fusen.cn
83e598caa2 logo算法信息提取 2024-01-23 17:05:17 +08:00
menghaiwen@fusen.cn
9ae8afd49e logo算法信息提取 2024-01-23 14:23:46 +08:00
menghaiwen@fusen.cn
d8779d5c08 logo算法信息提取 2024-01-22 16:44:07 +08:00
menghaiwen@fusen.cn
138bcb304d logo算法信息提取 2024-01-22 16:42:00 +08:00
menghaiwen@fusen.cn
e4c7d23772 logo算法信息提取 2024-01-22 16:23:36 +08:00
menghaiwen@fusen.cn
256443f963 logo算法信息提取 2024-01-22 16:19:53 +08:00
menghaiwen@fusen.cn
545785561b logo算法信息提取 2024-01-22 16:13:31 +08:00
menghaiwen@fusen.cn
02453beceb Merge branch 'master' of gitlab.fusenpack.com:backend/proto 2024-01-22 16:02:52 +08:00
menghaiwen@fusen.cn
665047fdbc logo算法信息提取 2024-01-22 16:02:38 +08:00
laodaming@fusen.cn
65c1397855 Merge branch 'master' of gitlab.fusenpack.com:backend/proto 2024-01-22 15:10:43 +08:00
laodaming@fusen.cn
c096c2625a fix 2024-01-22 15:10:17 +08:00
menghaiwen@fusen.cn
c67f47eddc Merge branch 'master' of gitlab.fusenpack.com:backend/proto 2024-01-22 15:02:46 +08:00
menghaiwen@fusen.cn
d4d8c66ee4 logo算法信息提取 2024-01-22 15:02:31 +08:00
laodaming@fusen.cn
a8273ad6ad fix 2024-01-22 14:54:07 +08:00
laodaming@fusen.cn
05744cee77 fix 2024-01-22 14:44:26 +08:00
menghaiwen@fusen.cn
5980a39330 调整 2024-01-19 19:03:13 +08:00
menghaiwen@fusen.cn
818405eb58 Merge branch 'master' of gitlab.fusenpack.com:backend/proto 2024-01-19 18:21:41 +08:00
menghaiwen@fusen.cn
7b3228b6df 调整 2024-01-19 18:21:00 +08:00
huangsimin@fusen.cn
62333bb488 删除老的测试代码启动nacos 2024-01-19 17:02:09 +08:00
huangsimin@fusen.cn
e9a16ee7a2 再次 2024-01-19 16:23:47 +08:00
menghaiwen@fusen.cn
ce53f9caa3 调整 2024-01-19 11:54:14 +08:00
menghaiwen@fusen.cn
353a21d4f9 新增资源管理服务 2024-01-19 10:32:29 +08:00
menghaiwen@fusen.cn
b3025607fd 新增资源管理服务 2024-01-19 10:28:06 +08:00
menghaiwen@fusen.cn
66bdeaee44 新增资源管理 2024-01-18 18:23:36 +08:00
huangsimin@fusen.cn
2b5688587b 修复序列化的多余引用 2024-01-18 17:38:17 +08:00
huangsimin@fusen.cn
70ebc9ca9e 更新grpc 2024-01-18 17:26:14 +08:00
huangsimin@fusen.cn
08bbc62d28 把groupName更新回来 2024-01-18 17:02:13 +08:00
huangsimin@fusen.cn
06d3b56e27 更新proto 添加RPC域 2024-01-18 16:53:36 +08:00
huangsimin@fusen.cn
2fe7ad3cfb 修改run_latest模板 2024-01-17 17:30:06 +08:00
huangsimin@fusen.cn
65812bc2e0 添加全局utc设置方法 2024-01-17 17:26:13 +08:00
huangsimin@fusen.cn
519f5cd197 修改 proto 说明 2024-01-17 17:01:09 +08:00
huangsimin@fusen.cn
adcc051317 更新说明 2024-01-17 14:47:43 +08:00
menghaiwen@fusen.cn
46b16ebc29 权限组 2024-01-17 14:32:27 +08:00
menghaiwen@fusen.cn
8b8bfc1a2b 权限组调整 2024-01-17 10:37:09 +08:00
huangsimin@fusen.cn
e0ce2951b3 删除model 2024-01-16 16:35:50 +08:00
menghaiwen@fusen.cn
4fcc059dad 新增权限组 2024-01-15 17:42:00 +08:00
menghaiwen@fusen.cn
b33f6b66d7 新增权限组 2024-01-15 17:39:47 +08:00
laodaming@fusen.cn
041e95c50a fix 2024-01-15 15:53:42 +08:00
laodaming@fusen.cn
a8e75109b7 增加 ldap proto 2024-01-12 15:55:04 +08:00
laodaming@fusen.cn
ebf1be84e6 Merge branch 'master' of gitlab.fusenpack.com:backend/proto 2024-01-12 10:29:17 +08:00
laodaming@fusen.cn
3c37a46f50 删除之前测试的产品相关代码] 2024-01-12 10:29:05 +08:00
huangsimin@fusen.cn
4029426e6f 更新最新 2024-01-10 10:32:02 +08:00
huangsimin@fusen.cn
0beabb590f ok 2024-01-09 18:39:52 +08:00
huangsimin@fusen.cn
cc1c14b86d Merge branch 'master' of ssh://gitlab.fusenpack.com/backend/proto 2024-01-09 18:27:58 +08:00
huangsimin@fusen.cn
5093ca325c 添加新的notify接口 2024-01-09 18:26:05 +08:00
huangsimin@fusen.cn
1ac21ecf7f 删除没必要的问题 2023-12-20 10:39:35 +08:00
huangsimin@fusen.cn
2ff371bbb9 删除没必要的服务 2023-12-20 10:28:40 +08:00
huangsimin@fusen.cn
ab2cdf5921 添加自动更新子模块 2023-12-19 17:06:09 +08:00
huangsimin@fusen.cn
decff6f2e6 update 2023-12-15 18:34:20 +08:00
huangsimin@fusen.cn
580e32c223 update 2023-12-13 17:49:07 +08:00
huangsimin@fusen.cn
7a8f45b518 update 2023-12-13 17:10:37 +08:00
huangsimin@fusen.cn
ac925c3424 修改自动grpc不需要在项目配置 2023-12-13 17:08:50 +08:00
huangsimin@fusen.cn
702248cc8f 为fusenapi兼容准备 2023-12-08 18:09:54 +08:00
menghaiwen@fusen.cn
0a820d9c03 Merge branch 'master' of gitlab.fusenpack.com:backend/proto 2023-12-07 17:38:26 +08:00
menghaiwen@fusen.cn
7842d7c3d1 新增 2023-12-07 17:38:04 +08:00
huangsimin@fusen.cn
3facd54499 完善序列化的格式 2023-12-07 17:29:33 +08:00
huangsimin@fusen.cn
72c2c7b221 Merge branch 'master' of ssh://gitlab.fusenpack.com/backend/proto 2023-12-07 17:22:30 +08:00
huangsimin@fusen.cn
44edea6b51 更新handler的返回值 2023-12-07 17:22:05 +08:00
menghaiwen@fusen.cn
22ddf1ce13 新增 2023-12-07 16:35:16 +08:00
menghaiwen@fusen.cn
32a243afab Merge branch 'master' of gitlab.fusenpack.com:backend/proto 2023-12-07 16:25:36 +08:00
menghaiwen@fusen.cn
0cb6f65187 新增 2023-12-07 16:25:22 +08:00
huangsimin@fusen.cn
61c10dab23 修复stream中的错误 2023-12-07 16:20:19 +08:00
huangsimin@fusen.cn
76a781d006 Merge branch 'master' of ssh://gitlab.fusenpack.com/backend/proto 2023-12-07 15:52:30 +08:00
huangsimin@fusen.cn
998783d1d6 update 2023-12-07 15:52:05 +08:00
menghaiwen@fusen.cn
eaf2ed3b73 Merge branch 'master' of gitlab.fusenpack.com:backend/proto 2023-12-07 15:49:28 +08:00
menghaiwen@fusen.cn
2fb38a42a1 新增 2023-12-07 15:49:16 +08:00
huangsimin@fusen.cn
6605238003 Merge branch 'master' of ssh://gitlab.fusenpack.com/backend/proto 2023-12-07 15:35:19 +08:00
huangsimin@fusen.cn
2ed4499221 支持 stream 序列化 删除gateway的一些垃圾代码 2023-12-07 15:34:40 +08:00
menghaiwen@fusen.cn
47317af003 Merge branch 'master' of gitlab.fusenpack.com:backend/proto 2023-12-06 18:34:26 +08:00
menghaiwen@fusen.cn
11cf17ef9e 新增 2023-12-06 18:34:22 +08:00
huangsimin@fusen.cn
a2873f273b 改名 2023-12-06 17:28:01 +08:00
huangsimin@fusen.cn
a20f76c009 update 2023-12-06 17:21:07 +08:00
huangsimin@fusen.cn
c5df2b6478 修改为纯grpc 2023-12-06 17:13:51 +08:00
huangsimin@fusen.cn
310a02d7f5 Merge branch 'master' of ssh://gitlab.fusenpack.com/backend/proto 2023-12-06 17:13:45 +08:00
menghaiwen@fusen.cn
43b7ba0929 新增 2023-12-06 16:18:22 +08:00
laodaming@fusen.cn
2031059ec2 update 2023-12-06 12:12:56 +08:00
huangsimin@fusen.cn
e8083abe94 Merge branch 'master' of ssh://gitlab.fusenpack.com/backend/proto 2023-12-06 12:08:28 +08:00
huangsimin@fusen.cn
e2eb5ad78c 测试 2023-12-06 12:08:20 +08:00
laodaming@fusen.cn
0dc3cc97e0 update 2023-12-06 11:33:49 +08:00
laodaming@fusen.cn
656c14c640 update 2023-12-06 10:41:27 +08:00
laodaming@fusen.cn
30bf1bddea fix 2023-12-05 18:02:04 +08:00
laodaming@fusen.cn
dddd8f4a29 update 2023-12-05 17:43:04 +08:00
menghaiwen@fusen.cn
2604613981 Merge branch 'master' of gitlab.fusenpack.com:backend/proto 2023-12-05 17:31:41 +08:00
menghaiwen@fusen.cn
557a2331b3 新增 2023-12-05 17:31:28 +08:00
laodaming@fusen.cn
6070cd8097 Merge branch 'master' of gitlab.fusenpack.com:backend/proto 2023-12-05 16:57:15 +08:00
laodaming@fusen.cn
47cafe7c6d update 2023-12-05 16:56:48 +08:00
menghaiwen@fusen.cn
c09b26bc8b 新增 2023-12-05 16:19:54 +08:00
menghaiwen@fusen.cn
c467d31915 新增 2023-12-05 16:12:13 +08:00
menghaiwen@fusen.cn
2c936c6536 新增 2023-12-05 15:40:46 +08:00
menghaiwen@fusen.cn
a6f87e75b8 update 2023-12-05 15:20:02 +08:00
laodaming@fusen.cn
2695460f82 update 2023-12-05 15:04:25 +08:00
huangsimin@fusen.cn
8c268d9a47 Merge branch 'master' of gitlab.fusenpack.com:backend/proto 2023-12-05 15:02:31 +08:00
huangsimin@fusen.cn
eea47ad72c 修复 2023-12-05 15:02:13 +08:00
menghaiwen@fusen.cn
7eeabb0b9d Merge branch 'master' of gitlab.fusenpack.com:backend/proto 2023-12-05 14:47:02 +08:00
menghaiwen@fusen.cn
b1eb47103b fix 2023-12-05 14:46:45 +08:00
laodaming@fusen.cn
47191d5c25 fix 2023-12-05 14:39:15 +08:00
laodaming@fusen.cn
a530630f38 fix 2023-12-05 14:30:49 +08:00
huangsimin@fusen.cn
6074bb8e44 修复response 2023-12-05 13:05:23 +08:00
huangsimin@fusen.cn
cd93fa05f7 完善序列化的问题 2023-12-05 10:41:26 +08:00
menghaiwen@fusen.cn
32e5d9424f Merge branch 'master' of gitlab.fusenpack.com:backend/proto 2023-12-04 18:29:05 +08:00
menghaiwen@fusen.cn
99d37a5ef2 新增服务:resource 2023-12-04 18:21:07 +08:00
laodaming@fusen.cn
066595618a fix 2023-12-04 18:20:02 +08:00
laodaming@fusen.cn
2025743dbe Merge branch 'master' of gitlab.fusenpack.com:backend/proto 2023-12-04 17:17:03 +08:00
laodaming@fusen.cn
78336ab410 fix 2023-12-04 17:16:28 +08:00
huangsimin@fusen.cn
4cfab40419 测试 2023-12-04 17:15:41 +08:00
laodaming@fusen.cn
75f76f7be5 fix 2023-12-04 16:45:41 +08:00
laodaming@fusen.cn
0eafcfd3e2 update 2023-12-04 16:26:44 +08:00
huangsimin@fusen.cn
1879f71f76 测试 2023-12-04 16:00:09 +08:00
laodaming@fusen.cn
748e0daffc update 2023-12-04 15:10:18 +08:00
laodaming@fusen.cn
624b492db1 update 2023-12-04 14:56:42 +08:00
huangsimin@fusen.cn
572b6e198a 修改公司内部gitlab的模块地址 2023-12-04 14:20:43 +08:00
huangsimin@fusen.cn
0e721f4bd6 添加说明 2023-12-04 14:19:43 +08:00
huangsimin@fusen.cn
9b4b82cb83 更新说明 2023-12-04 12:26:57 +08:00
huangsimin@fusen.cn
34d9e79764 update 2023-12-01 18:01:03 +08:00
huangsimin@fusen.cn
7632831762 修复 改名的问题 2023-11-30 11:05:42 +08:00
huangsimin@fusen.cn
57fd3eb516 更新 2023-11-29 17:41:30 +08:00
huangsimin@fusen.cn
4f231d545b 修改序列化的projectName的判断 2023-11-28 17:19:02 +08:00
23 changed files with 1241 additions and 504 deletions

40
.gitignore vendored
View File

@ -4,3 +4,43 @@ __debug_*
*.tar
*.zip
*.gz
# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib
bin/
# Test binary, built with `go test -c`
*.test
# Output of the go coverage tool, specifically when used with LiteIDE
*.out
# Dependency directories (remove the comment below to include it)
# vendor/
#vscode
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
!.vscode/*.code-snippets
# Local History for Visual Studio Code
.history/
# Built Visual Studio Code Extensions
*.vsix
__debug_bin
__debug_bin*
.idea
.vscode
screenlog.*

View File

@ -3,16 +3,33 @@
#### 介绍
公共协议, 每个服务需要git submodule 拉 xxx/proto 目录下. 然后使用序列.
```
安装protoc protoc-25.0-linux-x86_64.zip
```
```bash
git submodule add https://gitee.com/fusenpack/proto
# 去掉SUMDB的验证
go env -w GOSUMDB="off"
git submodule add git@gitlab.fusenpack.com:backend/proto.git
```
然后执行
```bash
go install \
github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway \
github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2 \
google.golang.org/protobuf/cmd/protoc-gen-go \
google.golang.org/grpc/cmd/protoc-gen-go-grpc
go run proto/goutils/proto_build/main.go
或者
在proto/goutils/proto_build/main_test.go执行测试 TestMain
./update_fspkg_master.sh # 执行更新最新的包
```
#### 软件架构
软件架构说明

View File

@ -54,10 +54,10 @@ func main() {
if len(args) == 0 || args[0] == "service" {
ServiceMain()
} else if args[0] == "gateway" {
GatewayMain()
} else if args[0] == "client" {
GenClientMain()
} else {
log.Println("Invalid argument. Usage: go run main.go [service|gateway]")
log.Println("Invalid argument. Usage: go run main.go [service|client]")
}
}
@ -83,6 +83,10 @@ func ServiceMain() {
defer createFileNotExists("protoc.sh", 0755, func(f io.Writer) error {
shellstr := `#! /bin/bash
if [ ! -d "proto" ] || [ -z "$(ls -A proto)" ]; then
git submodule init
git submodule update
fi
go run -gcflags="-N" proto/goutils/proto_build/main.go`
f.Write([]byte(shellstr))
return nil
@ -104,35 +108,26 @@ go run -gcflags="-N" proto/goutils/proto_build/main.go`
// log.Println("Found proto folder at:", workerSpaceDir, ServiceNames, projectLastName, projectName)
}
func GatewayMain() {
func GenClientMain() {
log.Println("项目目录:", workspaceDir)
checkProtoMessageName(workspaceDir + "/" + "proto/service")
packageName := "service"
ServerCodePath := "server"
genDir := "gen/go"
ServiceName, projectName, projectLastName := getServiceNameAndProjectName(ServerCodePath)
if ServiceName == "" {
err := os.MkdirAll("server", 0755)
if err != nil {
log.Println(err)
}
createFileWithPermNotExists("server/service_config.ini", func(f io.Writer) error {
return tpl.ExecuteTemplate(f, "service_config.tpl", nil)
})
panic("必须填写server/service_config.ini文件的项目名称与proto对应名称")
}
defer createFileNotExists("protoc.sh", 0755, func(f io.Writer) error {
shellstr := `#! /bin/bash
go run -gcflags="-N" proto/goutils/proto_build/main.go gateway`
if [ ! -d "proto" ] || [ -z "$(ls -A proto)" ]; then
git submodule init
git submodule update
fi
go run -gcflags="-N" proto/goutils/proto_build/main.go client`
f.Write([]byte(shellstr))
return nil
})
// genDir := fmt.Sprintf("gen/go/%s", PackageName)
serviceProtoDir := fmt.Sprintf("proto/%s", packageName)
err := os.MkdirAll(genDir+"/"+packageName, 0755)
@ -140,10 +135,16 @@ go run -gcflags="-N" proto/goutils/proto_build/main.go gateway`
log.Println(err)
}
projectName := "gitlab.fusenpack.com/backend/grpc"
CheckGomodBasicPackage()
ExecProtoc(workspaceDir, serviceProtoDir, genDir, packageName, projectName)
GitignoreGenCheck()
ExecCreateAutoGrpc(genDir, packageName)
ExecCreateConfig(ServiceName, projectLastName)
ExecCreateGatewayAutoGrpc(genDir, packageName, projectLastName)
createFileNotExists("update_fspkg_master.sh", 0755, func(f io.Writer) error {
return tpl.ExecuteTemplate(f, "update_fspkg_master.tpl", nil)
})
}
func ExecCreateConfig(ServiceName, ProjectName string) {
@ -190,16 +191,11 @@ func CheckGomodBasicPackage() {
if !regexp.MustCompile(`fusen-basic `).Match(data) {
log.Println(isRewrite, len(content))
isRewrite = true
content += "\n\nreplace fusen-basic v0.0.0 => gitee.com/fusenpack/fusen-basic v0.0.1"
}
if !regexp.MustCompile(`fusen-model `).Match(data) {
isRewrite = true
content += "\n\nreplace fusen-model v0.0.0 => gitee.com/fusenpack/fusen-model v0.0.1"
content += "\n\nreplace fusen-basic v0.0.0 => gitlab.fusenpack.com/backend/basic v0.0.1"
}
if isRewrite {
log.Println("rewrite go.mod => add <fusen-basic> <fusen-model>")
log.Println("rewrite go.mod => add <fusen-basic>")
err = os.WriteFile("./go.mod", []byte(content), 0644)
if err != nil {
panic(err)
@ -212,7 +208,7 @@ func ExecProtoc(workerSpaceDir, serviceProtoDir, genDir, packageName string, pro
allServiceNames := getAllServiceName()
protoCmdStr := fmt.Sprintf(`protoc -I %s --go_out %s --go_opt paths=source_relative --go-grpc_out %s --go-grpc_opt paths=source_relative --grpc-gateway_out %s --grpc-gateway_opt paths=source_relative`, "proto", genDir, genDir, genDir)
protoCmdStr := fmt.Sprintf(`protoc -I %s --go_out %s --go_opt paths=source_relative --go-grpc_out %s --go-grpc_opt paths=source_relative `, "proto", genDir, genDir)
for _, sname := range allServiceNames {
protoCmdStr += importFileCmdStr(serviceNameEncode(packageName, sname), projectName)
}
@ -267,6 +263,12 @@ func ExecCreateAutoLogic(workerSpaceDir string, ServiceName string, genDir, pack
// 处理main.go文件
defer func() {
// name := underscoreToLowerCamelCase(ServiceName)
// name := underscoreToLowerCamelCase(ServiceName)
createFile("server/main_gen.go", func(f io.Writer) error {
return tpl.ExecuteTemplate(f, "main_gen.tpl", mtpl)
})
createFileWithPermNotExists("server/main.go", func(f io.Writer) error {
return tpl.ExecuteTemplate(f, "main.tpl", mtpl)
})
@ -292,15 +294,41 @@ func ExecCreateAutoLogic(workerSpaceDir string, ServiceName string, genDir, pack
for _, info := range infos {
// logicStructNames = append(logicStructNames, info.StructName)
var methods []map[string]string
var methods []map[string]interface{}
for _, met := range info.Method {
var dup map[string]bool = make(map[string]bool)
methodMap := map[string]string{
var paramsName []string
var paramsAndType []string
for i, param := range met.Params {
var p string
if param == "context.Context" {
dup["ctx"] = true
p = "ctx"
} else {
plist := strings.Split(param, ".")
lowerName := strings.ToLower(plist[len(plist)-1])
if strings.Contains(lowerName, "req") {
if _, ok := dup["ctx"]; ok {
p = "req"
}
}
if _, ok := dup[p]; ok {
p = fmt.Sprintf("param%d", i)
}
}
param = p + " " + param
paramsAndType = append(paramsAndType, param)
paramsName = append(paramsName, p)
}
methodMap := map[string]interface{}{
"StructName": info.StructName,
"MethodType": met.MethodType,
"MethodName": met.MethodName,
"ParamCtx": met.Params[0],
"ParamReq": met.Params[1],
"ParamsName": paramsName,
"Params": paramsAndType,
"MethodReturn": met.Returns[0],
"MethodResponse": met.Returns[0][1:],
}
@ -341,8 +369,9 @@ func ExecCreateAutoLogic(workerSpaceDir string, ServiceName string, genDir, pack
// log.Println(genTypesBuffer.String())
formatted, err := format.Source(genTypesBuffer.Bytes())
if err != nil {
log.Printf("格式化代码失败:%v\n", err)
return
log.Println(genTypesBuffer.String())
// panic(fmt.Sprintf("格式化代码失败:%v\n", err))
formatted = genTypesBuffer.Bytes()
}
_, err = f.Write(formatted)
@ -363,7 +392,7 @@ func ExecCreateAutoLogic(workerSpaceDir string, ServiceName string, genDir, pack
ss.StructServiceName = info.ServiceName
for _, method := range methods {
fileName := convertToSnakeCase(method["MethodName"])
fileName := convertToSnakeCase(method["MethodName"].(string))
method["ProjectName"] = projectName
method["PackageName"] = logicPackageName
createFileWithPermNotExists(fmt.Sprintf("%s/%s_logic.go", logicPath, fileName), func(f io.Writer) error {
@ -384,15 +413,15 @@ func ExecCreateTest(genDir, projectName, packageName, serviceName string) {
genDir = genDir + "/" + packageName
var struCollection []*HttpGrpcMethodTest
for _, gwPath := range getSuffixFilesPath(genDir, strings.ToLower(serviceName)+".pb.gw.go") {
var struCollection []*GrpcMethodTest
for _, gwPath := range getSuffixFilesPath(genDir, strings.ToLower(serviceName)+"_grpc.pb.go") {
struCollection = append(struCollection, genGatewayTestFunction(gwPath)...)
}
var buf bytes.Buffer
err := tpl.ExecuteTemplate(&buf, "http_grpc_method_test.tpl", map[string]any{
"ProjectName": projectName,
"HttpGrpcTestStructs": struCollection,
"ProjectName": projectName,
"GrpcTestStructs": struCollection,
})
if err != nil {
panic(err)
@ -705,16 +734,15 @@ func genGatewayWithNacosFunction(grpcPath string, gatewayBuf *bytes.Buffer) (fun
return
}
type HttpGrpcMethodTest struct {
type GrpcMethodTest struct {
RequestVar string
RequestStruct string
Params []string
MethodName string
HttpMethod string
UrlPath string
ServiceName string
}
func genGatewayTestFunction(grpcPath string) (createdCollection []*HttpGrpcMethodTest) {
func genGatewayTestFunction(grpcPath string) (createdCollection []*GrpcMethodTest) {
// workerSpaceDir+"/gen/go/service/auth_grpc.pb.go"
// 解析Go源文件
fset := token.NewFileSet()
@ -724,73 +752,71 @@ func genGatewayTestFunction(grpcPath string) (createdCollection []*HttpGrpcMetho
os.Exit(1)
}
// var i = 0
for _, decl := range node.Decls {
// 检查是否是接口声明
if fdec, ok := decl.(*ast.FuncDecl); ok && fdec.Name.IsExported() && strings.HasSuffix(fdec.Name.Name, "HandlerServer") {
if fdec, ok := decl.(*ast.GenDecl); ok && fdec.Tok == token.TYPE {
// ast.Print(fset, fdec)
for _, spec := range fdec.Specs {
if typeSpec, ok := spec.(*ast.TypeSpec); ok && strings.HasSuffix(typeSpec.Name.Name, "Server") && !strings.HasPrefix(typeSpec.Name.Name, "Unsafe") && !strings.Contains(typeSpec.Name.Name, "_") {
created := &HttpGrpcMethodTest{}
// 修改函数执行内容
ast.Inspect(fdec.Body, func(n ast.Node) bool {
serviceName := typeSpec.Name.Name
serviceName = serviceName[:len(serviceName)-6]
ast.Inspect(typeSpec, func(interfaceNode ast.Node) bool {
if callExpr, ok := n.(*ast.CallExpr); ok {
if methodDecl, ok := interfaceNode.(*ast.Ident); ok && methodDecl.IsExported() {
// log.Println(ftype.)
if methodDecl.Obj != nil {
if methodDecl.Obj.Kind == ast.Fun {
// log.Println(typeSpec.Name.Name)
// log.Println(methodDecl.Name)
if expr, ok := callExpr.Fun.(*ast.Ident); ok && strings.HasPrefix(expr.Name, "local_request") {
// log.Println(expr.Obj.Decl.(*ast.FuncDecl))
created := GrpcMethodTest{}
created.ServiceName = strings.Split(expr.Name, "_")[2]
ast.Inspect(expr.Obj.Decl.(*ast.FuncDecl).Body, func(n ast.Node) bool {
if protoValue, ok := n.(*ast.ValueSpec); ok && protoValue.Names[0].Name == "protoReq" {
// log.Println(getTypeString(protoValue.Type))
created.RequestStruct = getTypeString(protoValue.Type)
}
if expr, ok := n.(*ast.SelectorExpr); ok {
if exprServer, ok := expr.X.(*ast.Ident); ok && exprServer.Name == "server" {
// log.Println(expr.Sel.Name, expr.X)
created.MethodName = expr.Sel.Name
createdCollection = append(createdCollection, created)
created.ServiceName = serviceName
created.MethodName = methodDecl.Name
created.RequestVar = "var" + created.MethodName + "Req"
field := methodDecl.Obj.Decl.(*ast.Field)
ftype := field.Type.(*ast.FuncType)
if len(ftype.Params.List) == 2 {
if reqstruct, ok := ftype.Params.List[1].Type.(*ast.StarExpr); ok {
rname := reqstruct.X.(*ast.Ident)
created.RequestStruct = rname.Name
createdCollection = append(createdCollection, &created)
}
}
// ast.Print(fset, ftype)
created = &HttpGrpcMethodTest{}
return false
}
}
return true
})
return true
}
// log.Println(callExpr.Fun)
// getTypeString(callExpr.Fun)
if expr, ok := callExpr.Fun.(*ast.SelectorExpr); ok && expr.Sel.Name == "Handle" {
var x = callExpr.Args[0].(*ast.BasicLit)
// log.Println(x, x.Value)
created.HttpMethod = x.Value
ast.Inspect(callExpr, func(n ast.Node) bool {
if callExprHandler, ok := n.(*ast.CallExpr); ok {
if expr, ok := callExprHandler.Fun.(*ast.SelectorExpr); ok && expr.Sel.Name == "WithHTTPPathPattern" {
var x = callExprHandler.Args[0].(*ast.BasicLit)
created.UrlPath = x.Value
}
}
return true
})
}
// ast.Print(fset, n)
// i++
// log.Println(i)
// if i == 7 {
// log.Println()
// }
// printer.Fprint(os.Stdout, fset, n)
// io.WriteString(os.Stdout, "\n")
// if ftype, ok := n.(*ast.FuncType); ok {
// log.Println(getTypeString(ftype))
// ast.Print(fset, ftype)
// }
return true
}
})
}
return true
})
}
// created.RequestVar = "var" + created.MethodName + "Req"
// 修改函数执行内容
}
}
return
@ -842,7 +868,7 @@ func getGrpcFileClientNames(genDir string) (result []*ClientParam) {
}
func importFileCmdStr(importFile string, projectName string) string {
shellStr := " {{.ImportFile}} --go_opt=M{{.ImportFile}}={{.ProjectName}} --go-grpc_opt=M{{.ImportFile}}={{.ProjectName}} --grpc-gateway_opt=M{{.ImportFile}}={{.ProjectName}} "
shellStr := " {{.ImportFile}} --go_opt=M{{.ImportFile}}={{.ProjectName}} --go-grpc_opt=M{{.ImportFile}}={{.ProjectName}}"
tmpl, err := template.New("shell").Parse(shellStr)
if err != nil {
@ -864,6 +890,7 @@ func importFileCmdStr(importFile string, projectName string) string {
log.Printf("模板执行失败:%v\n", err)
return ""
}
// log.Println(buf.String())
return buf.String()
}
@ -917,13 +944,15 @@ func getAllServiceName() (result []string) {
panic(err)
}
for _, e := range dirEntrys {
result = append(result, e.Name()[0:len(e.Name())-6])
if filepath.Ext(e.Name()) == ".proto" {
result = append(result, e.Name()[0:len(e.Name())-6])
}
}
return
}
// 获取项目的参数
func getServiceNameAndProjectName(dir string) (serviceName string, projectName string, projectLastName string) {
func getServiceNameAndProjectName(dir string) (serviceName string, projectName string, goModeName string) {
ifile, err := ini.Load(dir + "/service_config.ini")
if err != nil {
@ -960,7 +989,18 @@ func getServiceNameAndProjectName(dir string) (serviceName string, projectName s
}
paths := strings.Split(projectName, "/")
projectLastName = paths[len(paths)-1]
goModeName = paths[len(paths)-1]
moddata, err := os.ReadFile("go.mod")
if err != nil {
panic(err)
}
result := regexp.MustCompile(`module\s+([a-zA-Z_\-]+)`).FindAllStringSubmatch(string(moddata), 1)
if len(result) == 0 {
panic("无法找到go.mod 获取 module信息")
}
goModeName = result[0][1]
return
}
@ -1038,9 +1078,23 @@ func parseGoFile(filePath string) (ClientParams []*ClientParam) {
// fieldName := field.Names[0].Name
// log.Println("Field:", fieldName)
}
} else if _, ok := typeSpec.Type.(*ast.InterfaceType); ok {
} else if iface, ok := typeSpec.Type.(*ast.InterfaceType); ok {
interfaceName := typeSpec.Name.Name
if len(iface.Methods.List) >= 3 {
if len(iface.Methods.List[2].Names) == 0 {
// log.Println(name0, name1)
if getTypeString(iface.Methods.List[2].Type) == "grpc.ClientStream" {
// MethodType = "stream"
// log.Println(interfaceName)
continue
}
}
}
if strings.HasSuffix(interfaceName, "Client") {
Param.ClientName = interfaceName[0 : len(interfaceName)-6]
}
@ -1067,6 +1121,7 @@ func parseGoFile(filePath string) (ClientParams []*ClientParam) {
type GrpcServerMethod struct {
MethodName string
MethodType string
Params []string
Returns []string
}
@ -1106,10 +1161,30 @@ func ParseGrpcServerInfo(grpcPath string) (infos []*GrpcServerInfo) {
continue
}
if strings.Contains(ifaceSpec.Name.Name, "_") {
continue
}
if strings.HasPrefix(ifaceSpec.Name.Name, "Unsafe") {
continue
}
if len(ifaceType.Methods.List) == 3 {
if len(ifaceType.Methods.List[0].Names) == 1 && len(ifaceType.Methods.List[1].Names) == 1 {
name0 := ifaceType.Methods.List[0].Names[0].Name
name1 := ifaceType.Methods.List[1].Names[0].Name
if name0 == "SendAndClose" && name1 == "Recv" {
// log.Println(name0, name1)
if getTypeString(ifaceType.Methods.List[2].Type) == "grpc.ServerStream" {
// MethodType = "stream"
continue
}
}
}
}
ServiceName := ifaceSpec.Name.Name[0 : len(ifaceSpec.Name.Name)-6]
info := &GrpcServerInfo{
ServiceName: ServiceName,
@ -1122,29 +1197,40 @@ func ParseGrpcServerInfo(grpcPath string) (infos []*GrpcServerInfo) {
// 打印接口方法
for _, method := range ifaceType.Methods.List {
if len(method.Names) == 0 {
continue
}
if !isUpper(method.Names[0].Name) {
continue
}
m := &GrpcServerMethod{}
m := &GrpcServerMethod{
MethodType: "rpc",
}
info.Method = append(info.Method, m)
// 方法名称
// log.Println("方法名:", method.Names[0].Name)
// MethodName := method.Names[0].Name
m.MethodName = method.Names[0].Name
// 方法参数
if len(method.Type.(*ast.FuncType).Params.List) > 0 {
// log.Println("参数:")
// params := method.Type.(*ast.FuncType).Params
// log.Println(params.NumFields(), params.List)
// log.Println(string(src[method.Pos()-1 : method.End()-1]))
for _, field := range method.Type.(*ast.FuncType).Params.List {
mparams := method.Type.(*ast.FuncType).Params.List
switch len(mparams) {
case 2:
for _, field := range mparams {
// log.Printf("%s %s\n", field.Names, getTypeString(field.Type, packageName, 0))
m.Params = append(m.Params, getTypeString(field.Type, packageName))
}
} else {
case 1:
m.MethodType = "stream"
for _, field := range mparams {
// log.Printf("%s %s\n", field.Names, getTypeString(field.Type, packageName, 0))
m.Params = append(m.Params, getTypeString(field.Type, packageName))
}
case 0:
log.Println("无参数")
default:
panic("诡异的结构")
}
// 方法返回值
@ -1235,6 +1321,34 @@ func _getTypeString(expr ast.Expr, packageName *string, level int) string {
}
}
func createFile(filename string, do func(f io.Writer) error) error {
// 检测文件是否存在
file, err := os.OpenFile(filename, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644)
if err != nil {
return err
}
defer file.Close()
var buf = bytes.NewBuffer(nil)
err = do(buf)
if err != nil {
panic(err)
}
data, err := format.Source(buf.Bytes())
if err != nil {
_, err = file.Write(buf.Bytes())
} else {
_, err = file.Write(data)
}
if err != nil {
panic(err)
}
return nil
}
func createFileWithPermNotExists(filename string, do func(f io.Writer) error) error {
// 检测文件是否存在
_, err := os.Stat(filename)
@ -1423,3 +1537,28 @@ func getGrpcFileServiceName(decl ast.Decl) (string, string, bool) {
}
return "", "", false
}
// 检测gitignore gen是否存在
func GitignoreGenCheck() {
gitignoreFile := "./.gitignore"
data, err := os.ReadFile(gitignoreFile)
if err != nil {
log.Println(err.Error())
return
}
for _, line := range strings.Split(string(data), "\n") {
if strings.Trim(line, " ") == "gen" {
return
}
}
data = append(data, []byte("\ngen\n")...)
err = os.WriteFile(gitignoreFile, data, 0644)
if err != nil {
panic(err)
}
}

View File

@ -9,5 +9,5 @@ func TestMain(t *testing.T) {
}
func TestGateway(t *testing.T) {
GatewayMain()
GenClientMain()
}

View File

@ -1,10 +0,0 @@
package service
import (
"context"
"net/http"
"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
"google.golang.org/grpc"
)

View File

@ -1,20 +0,0 @@
package logic
import (
"context"
"{{.ProjectName}}/gen/go/service"
"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
"google.golang.org/grpc"
)
func AutoRegisterHandler(ctx context.Context, mux *runtime.ServeMux, opts ...grpc.DialOption) error {
var err error
{{range .FuncNames}}
err = service.{{.}}(ctx, mux, opts...)
if err != nil {
return err
}
{{end}}
return nil
}

View File

@ -4,6 +4,7 @@ import (
"fmt"
"log"
"reflect"
"fusen-basic/env"
"github.com/nacos-group/nacos-sdk-go/v2/clients/naming_client"
"github.com/nacos-group/nacos-sdk-go/v2/vo"
@ -14,6 +15,10 @@ import (
var namingClient naming_client.INamingClient
var groupName string
func init() {
AutoGrpcInit(env.StartAutoGrpc())
}
// AutoGrpcInit auto grpc 必须调用初始化
func AutoGrpcInit(obj any) {
value := reflect.ValueOf(obj)
@ -49,18 +54,23 @@ func Auto{{.ClientName}}Client(ctx context.Context) {{.ClientName}}Client {
GroupName: groupName,
}
insService, err := namingClient.SelectOneHealthyInstance(sel)
if err != nil {
log.Println(err)
return nil
}
for i := 0; i < 10; i++ {
insService, err := namingClient.SelectOneHealthyInstance(sel)
if err != nil {
log.Println(err)
return nil
}
if insService.Enable && insService.Healthy {
conn, err := grpc.DialContext(ctx, fmt.Sprintf("%s:%d", insService.Ip, insService.Port), grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
log.Println(err)
return nil
conn, err := grpc.DialContext(ctx, fmt.Sprintf("%s:%d", insService.Ip, insService.Port), grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
log.Println(err)
return nil
}
return New{{.ClientName}}Client(conn)
}
}
return New{{.ClientName}}Client(conn)
return nil
}
@ -75,16 +85,21 @@ func Auto{{.ClientName}}ClientEx(ctx context.Context, opts ...grpc.DialOption) (
GroupName: groupName,
}
insService, err := namingClient.SelectOneHealthyInstance(sel)
if err != nil {
return nil, err
for i := 0; i < 10; i++ {
insService, err := namingClient.SelectOneHealthyInstance(sel)
if err != nil {
return nil, err
}
if insService.Enable && insService.Healthy {
conn, err := grpc.DialContext(ctx, fmt.Sprintf("%s:%d", insService.Ip, insService.Port), opts...)
if err != nil {
return nil, err
}
return New{{.ClientName}}Client(conn), nil
}
}
conn, err := grpc.DialContext(ctx, fmt.Sprintf("%s:%d", insService.Ip, insService.Port), opts...)
if err != nil {
return nil, err
}
return New{{.ClientName}}Client(conn), nil
return nil, fmt.Errorf("no healthy with times 10")
}
{{end}}

View File

@ -11,14 +11,6 @@ func init() {
{{.RequestVar}} = &service.{{.RequestStruct}}{}
}
func Test{{.MethodName}}HTTP(t *testing.T) {
// 构建请求体
resp, err := {{.MethodName}}Http(nil)
if err != nil {
t.Error(err)
}
log.Println(resp)
}
func Test{{.MethodName}}RPC(t *testing.T) {
resp, err := {{.MethodName}}RPC()

View File

@ -2,31 +2,19 @@ package test
import (
"context"
"net/http"
"{{.ProjectName}}/gen/go/service"
"{{.ProjectName}}/server/config"
"fusen-basic/env"
)
{{range .HttpGrpcTestStructs}}
{{range .GrpcTestStructs}}
var {{.RequestVar}} *service.{{.RequestStruct}}
func {{.MethodName}}Http(reqHandler func(*http.Request) error) (any, error) {
resp, err := HttpRequest({{.HttpMethod}}, gatewayAddrress+{{.UrlPath}}, {{.RequestVar}}, reqHandler)
if err != nil {
// t.Error(err)
return nil, err
}
return resp, nil
}
func {{.MethodName}}RPC() (any, error) {
if fusen == nil {
fusen := env.NewFusenTest[config.Config]()
fusen.StartNacos(nil)
service.AutoGrpcInit(fusen)
}
resp, err := service.Auto{{.ServiceName}}Client(context.TODO()).{{.MethodName}}(context.TODO(), {{.RequestVar}})

View File

@ -1,103 +1,9 @@
package test
import (
"bytes"
"encoding/json"
"fmt"
"{{.ProjectName}}/server/config"
"fusen-basic/env"
"fusen-basic/utils/log"
"net/http"
"net/url"
"reflect"
"strings"
)
var fusen *env.Fusen[config.Config]
var gatewayAddrress = "http://localhost:9900"
func HttpRequest(method, urlStr string, body interface{}, reqHandler func(*http.Request) error) (map[string]interface{}, error) {
var jsonBody *bytes.Buffer
var queryParams url.Values
if method == "GET" {
queryParams = JsonTagToURLValues(body)
jsonBody = bytes.NewBuffer(nil)
} else {
// 将请求体转换为JSON格式
jsonData, err := json.Marshal(body)
if err != nil {
log.Printf("Failed to marshal request body: %s\n", err.Error())
return nil, err
}
jsonBody = bytes.NewBuffer(jsonData)
log.Println(string(jsonData))
}
// 创建URL对象并添加查询参数
u, err := url.Parse(urlStr)
if err != nil {
fmt.Printf("Failed to parse URL: %s\n", err.Error())
return nil, err
}
u.RawQuery = queryParams.Encode()
// 创建HTTP请求
req, err := http.NewRequest(method, u.String(), jsonBody)
if err != nil {
fmt.Printf("Failed to create HTTP request: %s\n", err.Error())
return nil, err
}
// 设置请求头
req.Header.Set("Content-Type", "application/json")
if reqHandler != nil {
reqHandler(req)
}
// 发送HTTP请求
client := http.DefaultClient
client.Timeout = time.Second * 60
resp, err := client.Do(req)
if err != nil {
fmt.Printf("HTTP request failed: %s\n", err.Error())
return nil, err
}
if resp.StatusCode != 200 {
return nil, fmt.Errorf("%s", resp.Status)
}
defer resp.Body.Close()
// 解析响应体
var response map[string]interface{}
err = json.NewDecoder(resp.Body).Decode(&response)
if err != nil {
fmt.Printf("Failed to decode response body: %s\n", err.Error())
return nil, err
}
return response, nil
}
func JsonTagToURLValues(body interface{}) url.Values {
values := url.Values{}
v := reflect.ValueOf(body)
if v.Kind() == reflect.Ptr {
v = v.Elem()
}
t := v.Type()
for i := 0; i < t.NumField(); i++ {
field := t.Field(i)
if field.IsExported() {
if jsonTag, ok := field.Tag.Lookup("json"); ok {
jtag := strings.Split(jsonTag, ",")[0]
value := v.Field(i).String()
values.Set(jtag, value)
}
}
}
return values
}

View File

@ -1,16 +1,24 @@
package {{.PackageName}}
import (
"fusen-basic/basic"
{{if eq .MethodType "rpc"}}
"context"
{{end}}
"{{.ProjectName}}/gen/go/service"
)
func (l *{{.StructName}}) {{.MethodName}}Logic(req {{.ParamReq}}, userinfo *basic.UserInfo) (resp *basic.Response[{{.MethodResponse}}]) {
return resp.Set(basic.CodeOK)
{{if eq .MethodType "rpc"}}
func (l *{{.StructName}}) {{.MethodName}}Logic({{range $index, $param := .Params}}{{if $index}}, {{end}}{{$param}}{{end}}) (resp {{.MethodReturn}},err error) {
resp = &{{.MethodResponse}}{}
return resp, nil
}
{{else if eq .MethodType "stream"}}
func (l *{{.StructName}}) {{.MethodName}}Logic(stream {{range $index, $param := .Params}}{{if $index}}, {{end}}{{$param}}{{end}}) (err error) {
return nil
}
{{end}}
// 自定义验证校验方法 VaildUserInfoHandler
// func (h *{{.MethodName}}Handler) VaildUserInfoHandler(ctx context.Context) *basic.UserInfo {
// return basic.ValidUserInfo(ctx)
// }

View File

@ -3,17 +3,13 @@ package {{.PackageName}}
import (
"context"
"strings"
"sync"
"fmt"
"fusen-basic/basic"
"fusen-basic/env"
"fusen-basic/utils/log"
"{{.ProjectName}}/gen/go/service"
"{{.ProjectName}}/server/config"
"google.golang.org/grpc/metadata"
)
@ -50,77 +46,30 @@ type {{.MethodName}}Handler struct {
type {{.MethodName}}HandlerMust struct{}
func (must *{{.MethodName}}HandlerMust) ValidUserInfoHandler(ctx context.Context) *basic.UserInfo {
return defaultValidUserInfoHandler(ctx)
{{if eq .MethodType "rpc"}}
func (lgrpc *{{.StructName}}Grpc) {{.MethodName}}({{range $index, $param := .Params}}{{if $index}}, {{end}}{{$param}}{{end}}) (_resp {{.MethodReturn}},_err error) {
defer func() {
if _recoverErr := recover(); _recoverErr != nil {
_resp = nil
_err = fmt.Errorf("%v", _recoverErr)
}
}()
return New{{.StructName}}(ctx).{{.MethodName}}Logic({{range $index, $param := .ParamsName}}{{if $index}}, {{end}}{{$param}}{{end}})
}
var __hide_handler{{.MethodName}} *{{.MethodName}}Handler = &{{.MethodName}}Handler{}
{{else if eq .MethodType "stream"}}
func (lgrpc *{{.StructName}}Grpc) {{.MethodName}}(ctx {{.ParamCtx}}, req {{.ParamReq}}) ({{.MethodReturn}}, error) {
return New{{.StructName}}(ctx).{{.MethodName}}Logic(req, __hide_handler{{.MethodName}}.ValidUserInfoHandler(ctx)).PassMetaResponse(ctx)
func (lgrpc *{{.StructName}}Grpc) {{.MethodName}}(stream {{range $index, $param := .Params}}{{if $index}}, {{end}}{{$param}}{{end}}) (_err error) {
defer func() {
if _recoverErr := recover(); _recoverErr != nil {
_err = fmt.Errorf("%v", _recoverErr)
}
}()
return New{{.StructName}}(stream.Context()).{{.MethodName}}Logic(stream)
}
{{end}}
func DefaultValidToken(ctx context.Context) *basic.UserInfo {
var (
err error
ui = &basic.UserInfo{}
)
// log.Println(ctx)
if md, ok := metadata.FromIncomingContext(ctx); ok {
var authtoken, debugtoken *string
var vresult *service.ValidTokenResponse
if a, ok := md["authorization"]; ok {
token := a[0]
if len(token) > 15 {
if strings.HasPrefix(token[1:], "earer ") {
token = token[7:]
}
authtoken = &token
{{end}}
defer func() {
if vresult != nil {
userinfo := vresult.UserInfo.AsMap()
ui.UserId = int64(userinfo["user_id"].(float64))
ui.GuestId = int64(userinfo["guest_id"].(float64))
ui.Exp = int64(userinfo["exp"].(float64))
}
}()
}
}
if a, ok := md["debug-token"]; ok {
token := a[0]
if len(token) > 15 {
if strings.HasPrefix(token[1:], "earer ") {
token = token[7:]
}
debugtoken = &token
defer func() {
if vresult != nil {
debug := vresult.DebugInfo.AsMap()
ui.Debug = &basic.Debug{}
if dexp, ok := debug["exp"]; ok {
dexpint64 := int64(dexp.(float64))
ui.Debug.Exp = &dexpint64
}
ui.Debug.IsAllTemplateTag = int64(debug["is_all_template_tag"].(float64))
ui.Debug.IsCache = int64(debug["is_cache"].(float64))
}
}()
}
}
vresult, err = service.AutoAuthClient(ctx).ValidToken(context.TODO(), &service.ValidTokenRequest{
UserToken: authtoken,
DebugToken: debugtoken,
})
if err != nil {
log.Println(err.Error())
}
}
return ui
}

View File

@ -3,16 +3,12 @@ package {{.PackageName}}
import (
"context"
"fusen-basic/basic"
"fusen-model/dbutils"
"fusen-model/gmodel"
"fusen-basic/dbutils"
"fusen-basic/gmodel"
"{{.ProjectName}}/server/config"
)
// 统一的验证入口
var defaultValidUserInfoHandler func(context.Context) *basic.UserInfo = DefaultValidToken
// 处理共享数据的上下文
type SharedContext struct {
models *gmodel.Models

View File

@ -6,22 +6,15 @@ import (
"fusen-basic/env"
"fusen-basic/utils/log"
"{{.ProjectName}}/gen/go/service"
"{{.ProjectName}}/server/config"
{{range .LogicDirNames}}
"{{$.ProjectName}}/{{.}}"
{{- end}}
"google.golang.org/grpc"
)
func main() {
fusen := env.NewFusen[config.Config]()
fusen.StartNacos(nil)
service.AutoGrpcInit(fusen)
fusen.StartNacosGRPC(nil)
sopt := grpc.UnaryInterceptor(fusen.Interceptor())
@ -30,9 +23,8 @@ func main() {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer(sopt) //新建一个grpc服务
{{range .StructServiceNames}}
service.Register{{.StructServiceName}}Server(s, &{{.LogicPackageName}}.{{.StructServiceName}}LogicGrpc{}) // {{.LogicPackageName}} 服务注册
{{- end}}
MainRegisterServer(s) // 注册所有的service
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)

View File

@ -0,0 +1,21 @@
package main
import (
"{{.ProjectName}}/gen/go/service"
{{range .StructServiceNames}}
"{{$.ProjectName}}/server/logics/{{.LogicPackageName}}"
{{- end}}
"time"
"google.golang.org/grpc"
)
func init() {
time.Local = time.UTC
}
func MainRegisterServer(s *grpc.Server) {
{{range .StructServiceNames}}
service.Register{{.StructServiceName}}Server(s, &{{.LogicPackageName}}.{{.StructServiceName}}LogicGrpc{}) // {{.LogicPackageName}} 服务注册
{{- end}}
}

View File

@ -27,8 +27,15 @@ echo "service name: $service_name"
cd $script_dir/proto
git pull origin master
cd $script_dir
go mod tidy
go mod vendor
go run -gcflags="-N" proto/goutils/proto_build/main.go
go mod tidy
go mod vendor
run_server() {
# 导航到相应的目录
cd $script_dir/server

View File

@ -9,9 +9,9 @@ package goutils
// google.golang.org/protobuf/cmd/protoc-gen-go \
// google.golang.org/grpc/cmd/protoc-gen-go-grpc
import (
_ "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway"
_ "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2"
_ "google.golang.org/grpc/cmd/protoc-gen-go-grpc"
_ "google.golang.org/protobuf/cmd/protoc-gen-go"
)
// import (
// _ "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway"
// _ "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2"
// _ "google.golang.org/grpc/cmd/protoc-gen-go-grpc"
// _ "google.golang.org/protobuf/cmd/protoc-gen-go"
// )

View File

@ -1,124 +1,37 @@
syntax = "proto3"; //使v3版本
package auth;
option go_package = "gitee.com/fusenpack/fusen-auth;service";
option go_package = "gitlab.fusenpack.com/backend/auth;service";
// google/api/annotations.proto
import "google/api/annotations.proto";
import "service/basic.proto";
import "google/protobuf/struct.proto";
import "google/protobuf/any.proto";
//
service auth {
//
rpc ValidToken(ValidTokenRequest) returns (ValidTokenResponse) {
// HTTP POST
option (google.api.http) = {
post: "/api/auth/valid/token"
body: "*"
};
}
//
rpc Login(UserLoginRequest) returns (UserLoginResponse) {
// HTTP POST
option (google.api.http) = {
post: "/api/auth/login"
body: "*"
};
}
//
rpc Register(UserRegisterRequest) returns (basic.Response) {
// HTTP POST
option (google.api.http) = {
post: "/api/auth/register"
body: "*"
};
}
rpc ValidToken(ValidTokenRequest) returns (ValidTokenResponse) {}
// Cookie
rpc AcceptCookie(basic.Request) returns (GuestResponse) {
// HTTP POST
option (google.api.http) = {
post: "/api/auth/accept-cookie"
body: "*"
};
}
rpc CreateAcceptCookie(basic.Request) returns (GuestResponse) {}
//
rpc CreateDebugToken(UserDebugRequest) returns (DebugTokenResponse) {
// HTTP POST
option (google.api.http) = {
post: "/api/auth/debug/token/create"
body: "*"
};
}
rpc CreateDebugToken(UserDebugRequest) returns (DebugTokenResponse) {}
// Google
rpc GoogleLogin(GoogleLoginRequest) returns (basic.Response) {
// HTTP GET
option (google.api.http) = {
get: "/api/auth/oauth2/login/google"
};
}
}
//
rpc EmailConfirmation(EmailConfirmationRequest) returns (basic.Response) {
// HTTP GET
option (google.api.http) = {
post: "/api/auth/email/confirmation"
body: "*"
};
}
// 使
rpc EmailRegister(EmailRegisterRequest) returns (basic.Response) {
// HTTP POST
option (google.api.http) = {
post: "/api/auth/oauth2/register"
body: "*"
};
}
//
rpc ResetToken(UserResetTokenRequest) returns (basic.Response) {
// HTTP POST
option (google.api.http) = {
post: "/api/auth/reset/token"
body: "*"
};
}
//
rpc ResetPassword(UserResetPasswordRequest) returns (basic.Response) {
// HTTP POST
option (google.api.http) = {
post: "/api/auth/reset/password"
body: "*"
};
}
// HTML
rpc ResetPasswordHtml(UserResetHtmlRequest) returns (basic.Response) {
// HTTP GET
option (google.api.http) = {
get: "/api/auth/reset/password/html"
};
}
//
rpc DebugDelete(AuthDeleteRequest) returns (basic.Response) {
// HTTP POST
option (google.api.http) = {
post: "/api/auth/debug/delete"
body: "*"
};
}
message Debug {
int64 exp = 1;
int64 is_cache = 2;
int64 is_all_template_tag = 3;
}
message UserInfo {
int64 user_id = 1;
int64 guest_id = 2;
int64 exp = 3;
Debug debug = 4;
}
// token的请求
@ -130,8 +43,7 @@ message ValidTokenRequest {
// token的请求
message ValidTokenResponse {
google.protobuf.Struct user_info = 1;
google.protobuf.Struct debug_info = 2;
UserInfo user_info = 1;
}

View File

@ -3,7 +3,6 @@ syntax = "proto3"; //版本声明使用v3版本
package basic;
option go_package = ".;service";
import "google/protobuf/any.proto";
import "google/protobuf/struct.proto";
// .
@ -17,4 +16,23 @@ message Response {
}
message ResourceInfo{
string resource_id = 1;
int64 guest_id =2;
int64 user_id =3;
string resource_type = 4;
string resource_url = 5;
string version = 6;
int64 api_type = 7;
string bucket_name = 8;
string source = 9;
string uploaded_at = 10;
google.protobuf.Struct metadata = 11;
}
message Meta {
int64 total_count =1;
int64 page_count=2;
int64 current_page=3;
int64 per_page=4;
}

View File

@ -9,15 +9,6 @@ import "service/basic.proto";
import "google/protobuf/struct.proto";
import "google/protobuf/any.proto";
//
service notify {
rpc Hello(basic.Request) returns (basic.Response) {
option (google.api.http) = {
post: "/api/notify/hello"
body: "*"
};
}
}
//
service info {
@ -221,5 +212,3 @@ message ContactUsRequest {
string phone = 3; //
string message = 4; //
}

305
service/ldap.proto Normal file
View File

@ -0,0 +1,305 @@
syntax = "proto3"; //使v3版本
package ldap;
option go_package = "gitlab.fusenpack.com/backend/ldap;service";
// google/api/annotations.proto
import "service/basic.proto";
//
service ldap {
//
rpc Ping(basic.Request) returns (basic.Response) {}
//ldap部门列表
rpc GetLdapOrganizations(basic.Request) returns(GetLdapOrganizationsRsp){}
//ldap部门
rpc CreateLdapOrganization(CreateLdapOrganizationReq)returns(basic.Response){}
//ldap部门
rpc DeleteLdapOrganization(DeleteLdapOrganizationReq) returns(basic.Response){}
//ldap部门
rpc UpdateLdapOrganization(UpdateLdapOrganizationReq) returns(basic.Response){}
//ldap用户帐号
rpc CreateLdapUser(CreateLdapUserReq) returns(basic.Response){}
//ldap用户信息
rpc UpdateLdapUser(UpdateLdapUserReq) returns(basic.Response){}
//ldap用户密码
rpc UpdateLdapUserPwd(UpdateLdapUserPwdReq) returns(basic.Response){}
//ldap用户帐号
rpc DisableLdapUser(DisableLdapUserReq) returns(basic.Response){}
//
rpc GetLdapUserInfo(GetLdapUserInfoReq) returns(GetLdapUserInfoRsp){}
//ldap部门添加成员
rpc AddLdapOrganizationMember(AddLdapOrganizationMemberReq) returns(basic.Response){}
//ldap部门移除成员
rpc RemoveLdapOrganizationMember(RemoveLdapOrganizationMemberReq) returns(basic.Response){}
//ldap组织成员列表
rpc GetLdapOrganizationMembers(GetLdapOrganizationMembersReq) returns(GetLdapOrganizationMembersRsp){}
//
rpc CreateLdapUserBaseGroup(basic.Request) returns (basic.Response) {}
//
rpc GetLdapUsers(GetLdapUsersReq) returns (GetLdapUsersRsp) {}
//
rpc LdapUserLogin(LdapUserLoginReq) returns (LdapUserLoginRsp) {}
//token
rpc LdapParseToken(LdapParseTokenReq) returns (LdapParseTokenRsp) {}
//
rpc GetLdapGroups(GetLdapGroupsReq) returns (GetLdapGroupsRsp);
//
rpc GetLdapGroupDetail(GetLdapGroupDetailReq) returns (GetLdapGroupDetailRsp);
//
rpc SaveLdapGroup(SaveLdapGroupReq) returns (SaveLdapGroupRsp);
//
rpc DeleteLdapGroup(DeleteLdapGroupReq) returns (DeleteLdapGroupRsp);
//--
rpc SetLdapGroupAuth(SetLdapGroupAuthReq) returns (SetLdapGroupAuthRsp);
//--
rpc RemoveLdapGroupAuth(RemoveLdapGroupAuthReq) returns (RemoveLdapGroupAuthRsp);
}
message GetLdapGroupsReq {
LdapGroupFilter filter = 1;
int64 current_page = 101;
int64 per_page = 102;
string order_by = 103;
}
message GetLdapGroupsRsp {
repeated LdapGroup list = 1;
basic.Meta meta = 2;
}
message GetLdapGroupDetailReq {
LdapGroupFilter filter = 1;
}
message GetLdapGroupDetailRsp {
LdapGroup info = 1;
}
message SaveLdapGroupReq {
LdapGroupFilter filter = 1;
LdapGroupFilter save = 2;
}
message SaveLdapGroupRsp {
LdapGroup info = 1;
}
message DeleteLdapGroupReq {
LdapGroupFilter filter = 1;
}
message DeleteLdapGroupRsp {
}
message SetLdapGroupAuthReq {
int64 group_id = 1;
GroupAuth group_auth = 2;
}
message SetLdapGroupAuthRsp {
int64 group_id = 1;
}
message RemoveLdapGroupAuthReq {
int64 group_id = 1;
GroupAuth group_auth = 2;
}
message RemoveLdapGroupAuthRsp {
int64 group_id = 1;
}
message GroupAuth {
int64 id = 1;
string name = 2;
string type = 3;
}
message LdapGroup {
int64 id = 1;
string type = 2;
string name = 3;
string keyword = 4;
string remark = 5;
int64 status = 6;
int64 sort = 7;
bytes metadata = 101;
string ctime = 102;
string utime = 103;
}
message LdapGroupFilter {
optional int64 id = 1;
optional string type = 2;
optional string name = 3;
optional string keyword = 4;
optional string remark = 5;
optional int64 status = 6;
optional int64 sort = 7;
optional bytes other_filter = 101; //
repeated int64 ldap_grouop_ids = 102; // ID列表
optional bytes metadata = 103;
}
//ldap部门列表
message GetLdapOrganizationsRsp{
repeated LdapOrganization list = 1;
}
message LdapOrganization {
int32 member_count = 1; //
string organization_name = 2; //
string organization_dn = 3; //dn
string owner_name = 4; //
string owner_dn = 5; //dn
int32 level = 6; //
string parent_organization_dn = 7;//dn
int32 sort = 8; //
repeated LdapOrganization child = 9;//
}
//ldap部门
message CreateLdapOrganizationReq{
string organization_name = 1; //
string parent_organization_dn = 2; //dn
string owner_dn = 3 ; //dn
}
//ldap部门
message DeleteLdapOrganizationReq{
repeated string organization_dns = 1;//dn集合
}
//ldap部门
message UpdateLdapOrganizationReq{
string organization_dn = 1; //dn
string organization_name = 2; //
string organization_owner_dn = 3; //dn
}
//ldap用户帐号
message CreateLdapUserReq{
string user_name = 1; //
string email = 2; //
string password = 3; //
string mobile = 4; //
string avatar = 5; //
int64 employee_type = 6; //1 2 3
int64 group_id = 7; //id
int64 gender = 8; // 1 2 3
string birthday = 9; //
int64 status = 10; // 10
}
//ldap用户信息
message UpdateLdapUserReq{
string user_dn = 1; //dn
string user_name = 2; //
string mobile = 3; //
string avatar = 4; //
int64 status = 5; // 10
int64 employee_type = 6; //1 2 3
int64 group_id = 7; //id
int64 gender = 8; // 1 2 3
string birthday = 9; //
}
//ldap用户密码
message UpdateLdapUserPwdReq{
string user_dn = 1; //dn
string new_password = 2;//
string old_password = 3;//
}
//ldap用户帐号
message DisableLdapUserReq{
string user_dn = 1;//dn
}
//
message GetLdapUserInfoReq{
string user_dn = 1;//dn
}
message GetLdapUserInfoRsp{
int64 user_id = 1; //id
string user_dn = 2; //dn
string user_name = 3; //
string email = 4; //
string mobile = 5; //
string avatar = 6; //
int64 employee_type = 7;// 1 2 3
int64 gender = 8; // 1 2 3
string birthday = 9; //
repeated string belong_organization = 10;//
repeated string manage_organization = 11; //
int64 status = 12 ; // 10
}
//ldap部门添加成员
message AddLdapOrganizationMemberReq{
string organization_dn = 1 ; //DN
string user_dn = 2; //DN
}
//ldap部门移除成员
message RemoveLdapOrganizationMemberReq{
string organization_dn = 1; //DN
string user_dn = 2; //DN
}
//ldap组织成员列表
message GetLdapOrganizationMembersReq{
string organization_dn = 1; //dn
string user_name = 2; //
}
message GetLdapOrganizationMembersRsp {
repeated GetLdapOrganizationMembersItem list = 1;
}
message GetLdapOrganizationMembersItem {
int64 userId = 1; //id
string user_dn = 2 ; //dn
string user_name = 3 ; //
string email = 4 ; //
string mobile = 5; //
string avatar = 6; //
int64 employee_type = 7 ; //
int64 gender = 8 ; // 1 2 3
string birthday = 9 ; //
repeated string belong_organizations = 10; //
repeated string manage_organizations = 11 ;//
int64 status = 12 ; // 10
int64 group_id = 13; //id
}
//
message GetLdapUsersReq{
string page_cookie = 1; ///
string user_name = 2 ; //
int64 gender = 3; // 0 1 2 3
int64 employee_type = 4;//0 1 2 3
}
message GetLdapUsersRsp{
repeated GetLdapUsersItem list = 1;
string paging_cookie = 2;
}
message GetLdapUsersItem {
int64 user_id = 1; //id
string user_dn = 2; //dn
string user_name = 3; //
string email = 4; //
string mobile = 5; //
string avatar = 6; //
int64 employee_type = 7; // 1 2 3
int64 gender = 8; // 1 2 3
string birthday = 9; //
repeated string belong_organizations = 10 ;//
repeated string manage_organizations = 11 ;//
int64 status = 12 ; // 10
int64 group_id = 13; //id
}
//
message LdapUserLoginReq{
string email = 1; //
string password = 2;//
}
message LdapUserLoginRsp{
string token = 1;
}
//token
message LdapParseTokenReq{
string token = 1;
}
message LdapParseTokenRsp{
string UserDn = 1;
int64 UserId = 2;
string UserEmail = 3;
}

166
service/notify.proto Normal file
View File

@ -0,0 +1,166 @@
syntax = "proto3"; //使v3版本
package notify;
option go_package = "gitlab.fusenpack.com/backend/notify;service";
// google/api/annotations.proto
import "service/basic.proto";
import "google/protobuf/struct.proto";
import "google/protobuf/timestamp.proto";
//
service notify {
//
rpc Ping(basic.Request) returns (basic.Response) {}
//
rpc EmailSend(EmailSendReq) returns (EmailSendRes) {}
//
rpc EmailRegisterConfirm( EmailRegisterReq) returns ( EmailRegisterResp) {}
//
rpc EmailResetPasswordHtml( EmailResetHtmlReq) returns (EmailResetHtmlResp) {}
//
rpc EmailResetConfirm( EmailResetConfirmReq) returns (EmailResetConfirmResp) {}
//
rpc OrderPaymentDetails( OrderPaymentDetailsReq) returns (OrderPaymentDetailsResp) {}
//
rpc OrderStatusTransition( OrderStatusTransitionReq) returns (OrderStatusTransitionResp) {}
//
rpc OrderPayArrears( OrderPayArrearsReq) returns (OrderPayArrearsResp) {}
}
message Operator {
//
enum Type {
immediate_resend = 0; // (,)
normal_send = 1; // ()
cancel_send = 2; // ()
}
message Retry {
int64 retry_count = 1; //
int64 interval_time = 2; // sec
}
Type type = 1; //
optional Retry retry = 2; //
optional google.protobuf.Timestamp start_time = 3; //
optional google.protobuf.Timestamp last_send_time = 4; //
}
message EmailNotifyBasic {
optional string notify_id = 1; // , 256, uuid
string sender = 2; //
string target_email = 3; // email
}
// type email
message EmailSendReq {
EmailNotifyBasic basic_email = 1;
string title = 2; //
string content = 3; //
Operator operator = 4; //
optional google.protobuf.Struct metadata = 5; //
}
//
enum NotifyType {
email = 0; // email
feishu = 1; //
wechat = 2; //
}
//
enum EmailStatus {
ok = 0; //
running = 1; //
error = 2; //
cancel = 3; //
finish = 4; //
}
message EmailSendRes {
EmailStatus status = 1;
string msg = 2;
}
message EmailRegisterReq {
EmailNotifyBasic basic_email = 1;
string confirmation_link = 2;
}
message EmailRegisterResp {
int64 code = 1; // 0
string notify_id = 2; // id
}
message EmailResetHtmlReq {
EmailNotifyBasic basic_email = 1;
string confirmation_link = 4;
}
message EmailResetHtmlResp {
int64 code = 1; // 0
string notify_id = 2; // id
}
message EmailResetConfirmReq {
string reset_password_link = 1;
string reset_token = 2;
}
message EmailResetConfirmResp {
int64 code = 1; // 0
bytes content = 2; //
}
message OrderPaymentDetailsReq {
EmailNotifyBasic basic_email = 1;
string payment_details_link = 2;
}
message OrderPaymentDetailsResp {
int64 code = 1; // 0
string notify_id = 2; // id
}
message OrderStatusTransitionReq {
EmailNotifyBasic basic_email = 1;
string last_status = 2; //
string current_status = 3; //
string check_status_link = 4; //
}
message OrderStatusTransitionResp {
int64 code = 1; // 0
string notify_id = 2; // id
}
message OrderPayArrearsReq {
EmailNotifyBasic basic_email = 1;
string pay_arrears_link = 2; //
}
message OrderPayArrearsResp {
int64 code = 1; // 0
string notify_id = 2; // id
}

307
service/resource.proto Normal file
View File

@ -0,0 +1,307 @@
syntax = "proto3"; //使v3版本
package resource;
option go_package = "gitlab.fusenpack.com/backend/resource;service";
// google/api/annotations.proto
import "service/basic.proto";
import "service/auth.proto";
//
service resource {
//
rpc ResourceDelete(ResourceDeleteReq) returns (ResourceDeleteRes) {}
//
rpc ResourceSave(ResourceSaveReq) returns (ResourceSaveRes) {}
//
rpc ResourceInfo(ResourceInfoReq) returns (ResourceInfoRes) {}
//
rpc ResourceList(ResourceListReq) returns (ResourceListRes) {}
// --
rpc UploadFileBackend(UploadFileBackendReq) returns (UploadFileBackendRes) {}
// --
rpc UploadFileBackendFragment(UploadFileBackendFragmentReq) returns (UploadFileBackendFragmentRes) {}
// logo合图
rpc LogoAiCombine(LogoAiCombineReq) returns (LogoAiCombineRes) {}
// logo基础信息
rpc LogoInfoSet(LogoInfoSetReq) returns (LogoInfoSetRes) {}
// logo裁剪处理
rpc LogoAiCropping(LogoAiCroppingReq) returns (LogoAiCroppingRes) {}
// logo缩略处理
rpc LogoResize(LogoResizeReq) returns (LogoResizeRes) {}
// logo算法信息提取
rpc LogoAiInfoGet(LogoAiInfoGetReq) returns (LogoAiInfoGetRes) {}
// logo
rpc SetExampleLogo(SetExampleLogoReq) returns (SetExampleLogoRes) {}
}
/* 设置示例logo */
message SetExampleLogoReq {
int64 is_example = 1;
int64 logo_id = 2;
}
message SetExampleLogoRes {
}
/* 设置示例logo */
/* logo算法信息提取 */
message LogoAiInfoGetReq {
string logo_url = 1;// logo地址
optional int64 logo_id = 2;// logoID
optional string version = 3;//
optional string is_reverse = 4; //
optional string logo_crop_type = 5; //
optional int64 is_all_template = 7; //
repeated string recommend_templates = 6; //
bytes preprocess_logo_metadata = 8; // logo数据库额外参数
optional int64 user_id = 101; // ID
optional int64 guest_id = 102; // 访ID
optional string get_type = 103; // user_material= temporary =
}
message LogoAiInfoGetRes {
bytes metadata =1; // AI返回基础信息--logo
bytes metadata_preprocess_logo =2; // AI返回基础信息--logo数据库
}
/* logo算法信息提取 */
/* logo缩略处理 */
message LogoResizeReq{
string resource_id=1; // ID
int64 width=2; //
int64 height=3;//
int64 handle_type = 100; // 1= 2= 3=
int64 user_id = 101; // ID
int64 guest_id = 102; // 访ID
}
message LogoResizeRes{
string resource_id=1;// ID
string resource_url=2;//
}
/* logo缩略处理 */
/* 更新资源详情 */
message ResourceSaveReq {
ResourceFilter filter=1;//
ResourceFilter save=2;//
}
message ResourceSaveRes {}
/* 更新资源详情 */
/* 删除资源详情 */
message ResourceDeleteReq {
ResourceFilter filter=1;//
int64 delete_type = 12; // 1= 2=s3 3=+s3
int64 delete_limit = 13; //
}
message ResourceDeleteRes {}
/* 删除资源详情 */
/* logo裁剪处理 */
message LogoAiCroppingReq {
string is_remove_bg=1; //
string logo_file=2; //
string width=3; //
string height=4; //
string proportion=5; //
int64 handle_type = 100; // 1= 2= 3=
int64 user_id = 101; // ID
int64 guest_id = 102; // 访ID
}
message LogoAiCroppingRes {
string resource_id=1;// ID
string resource_url=2;//
bool ismax_proportion=3; //
repeated string img_color=4; //
}
/* logo裁剪处理 */
/* logo基础信息 */
message LogoInfoSetReq {
string logo_url=1;// logo链接
string version=2; //
int64 is_all_template=3; //
}
message LogoInfoSetRes {
string info =1; //
}
/* logo基础信息 */
/* logo合图 */
message LogoAiCombineReq {
optional string logo_url = 1; // logo资源链接
optional int64 logo_material_id = 2; // logo素材ID
optional bytes logo_material_metadata = 3; // logo素材额外参数
optional int64 preprocess_logo_id = 4; // logo数据库ID
optional string template_tag = 5; //
optional bytes template_tag_color = 6; //
optional bytes product_template_v2_info = 7; //
optional bytes product_template_tag_groups = 8; //
optional string resolution = 9; //
optional string slogan = 10; // Slogan
optional string website = 11; //
optional string address = 12; //
optional string phone = 13; //
optional string qrcode = 14; //
auth.Debug debug = 100; //
int64 handle_type = 101; // 1= 2= 3=
int64 user_id = 102; // ID
int64 guest_id = 103; // 访ID
string trace_id = 104; //
string resource_source = 105; //
}
message TemplateTagColor {
repeated Color color =1;
int64 index = 2;
}
message Color {
repeated string names = 1;
}
message TemplateTagGroups {
string tag =1;
string name =2;
string value =3;
int64 fixed =4;
}
message LogoAiCombineRes {
string resource_id = 4; // ID
string resource_url = 6; //
int64 diff_time_logo_combine=15; //
int64 diff_time_upload_file=16; //
}
/* logo合图 */
/* 后端上传--分片上传 */
message UploadFileBackendFragmentReq {
string file_name = 1; //
string file_type = 2; //
bytes file_content = 3; //
bytes file_header = 4; //
string file_data = 5; // base64
string file_key = 6; //
int64 chunk_number = 7; // :123
int64 total_chunks = 8; // :3
int64 upload_bucket = 10; // 1=2=
string upload_type = 11; // s3
string upload_id = 12; // id
int64 api_type = 13; // 1=2=
string source = 14;//
int64 refresh = 15; //
string resource_id = 16; // ID
string backup_type = 17; // oss
bytes metadata = 18; // json格式
int64 content_length = 19; // json格式
int64 cache_type = 100; // 0= 1=
int64 user_id = 101;
int64 guest_id = 102;
}
message UploadFileBackendFragmentRes {
string upload_id = 1; // id
string resource_type = 2; //
string resource_id = 3;// ID
string resource_url = 4;//
}
/* 后端上传--分片上传 */
/* 后端上传--单文件 */
message UploadFileBackendReq {
string file_name = 1; //
string file_type = 2; //
bytes file_content = 3; //
bytes file_header = 4; //
string file_data = 6; // base64
int64 api_type = 10; // 1=2=
int64 upload_bucket = 11; // 1=2=
string file_key = 12; //
string source = 13;//
bytes metadata = 14; // json格式
int64 refresh = 15; //
string resource_id = 16; // ID
string backup_type = 17; // oss
string upload_type = 18; // s3
int64 cache_type = 100; // 0= 1=
int64 user_id = 101; // ID
int64 guest_id = 102;// 访ID
}
message UploadFileBackendRes{
string resource_type = 5;//
string resource_id = 4;// ID
string resource_url = 6;//
}
/* 后端上传--文件流--单文件 */
/* 获取资源列表 */
message ResourceListReq{
ResourceFilter filter=1;//
int64 current_page =101; //
int64 per_page =102; //
string order_by = 103; //
}
message ResourceListRes{
repeated basic.ResourceInfo list=1; //
basic.Meta meta =2; //
}
/* 获取资源列表 */
/* 获取资源详情 */
message ResourceInfoReq{
ResourceFilter filter=1; //
}
message ResourceInfoRes{
basic.ResourceInfo info =1;//
}
message ResourceFilter {
optional string resource_id = 1; // ID
optional int64 guest_id =2; // ID
optional int64 user_id =3; // 访ID
optional string resource_type = 4; //
optional string resource_url = 5; //
optional string version = 6; //
optional int64 api_type = 7; //
optional string bucket_name = 8; //
optional string source = 9; //
optional bytes metadata = 10; //
optional string trace_id = 11; // ID
optional bytes other_filter = 101; //
repeated string resource_ids = 102; // IDs
}
message ResourceIds {
repeated string resource_ids = 1;
}
/* 获取资源详情 */