Create & Init Project...

This commit is contained in:
2019-04-22 18:49:16 +08:00
commit fc4fa37393
25440 changed files with 4054998 additions and 0 deletions

6
app/admin/live/OWNERS Normal file
View File

@@ -0,0 +1,6 @@
# See the OWNERS docs at https://go.k8s.io/owners
labels:
- admin
- live
- new-project

View File

@@ -0,0 +1,24 @@
package(default_visibility = ["//visibility:public"])
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [
":package-srcs",
"//app/admin/live/live-admin/api/http/v1:all-srcs",
"//app/admin/live/live-admin/api/http/v2:all-srcs",
"//app/admin/live/live-admin/cmd:all-srcs",
"//app/admin/live/live-admin/conf:all-srcs",
"//app/admin/live/live-admin/dao:all-srcs",
"//app/admin/live/live-admin/model:all-srcs",
"//app/admin/live/live-admin/server/http:all-srcs",
"//app/admin/live/live-admin/service:all-srcs",
],
tags = ["automanaged"],
)

View File

@@ -0,0 +1,24 @@
### v2.4.0
1. 接入 UploadServcie & TokenService 提供运营平台上传图片接口
### v2.3.0
1. 接入 roomService聚合二审后台图片接口
### v2.2.0
1. 接入 user Resource
### v2.0.2
1.增加直播配置中心逻辑
2.fix new client
### V2.0.1
1. 升级 bmgen
### v2.0.0
1.`interface/live/live-admin` 迁移至 `admin/live/live-admin`
2. 重构 resourceService
3. 直播前端接管项目
### v2.0.1
1. 付费直播后台

View File

@@ -0,0 +1,12 @@
# Owner
zhaozhixin
caojunquan
# Author
caojunquan
# Reviewer
zhaozhixin
caojunquan
wangyao
liugang

View File

@@ -0,0 +1,16 @@
# See the OWNERS docs at https://go.k8s.io/owners
approvers:
- caojunquan
- zhaozhixin
labels:
- admin
- admin/live/live-admin
- live
options:
no_parent_owners: true
reviewers:
- caojunquan
- liugang
- wangyao
- zhaozhixin

View File

@@ -0,0 +1,5 @@
# live-admin-admin
## 项目简介
1. 直播后台网关曾

View File

@@ -0,0 +1,72 @@
load(
"@io_bazel_rules_go//proto:def.bzl",
"go_proto_library",
)
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
proto_library(
name = "v1_proto",
srcs = [
"capsule.proto",
"gaea.proto",
"payGoods.proto",
"payLive.proto",
"resource.proto",
"room.proto",
"upload.proto",
],
tags = ["automanaged"],
deps = ["@gogo_special_proto//github.com/gogo/protobuf/gogoproto"],
)
go_proto_library(
name = "v1_go_proto",
compilers = ["@io_bazel_rules_go//proto:gogofast_grpc"],
importpath = "go-common/app/admin/live/live-admin/api/http/v1",
proto = ":v1_proto",
tags = ["automanaged"],
deps = ["@com_github_gogo_protobuf//gogoproto:go_default_library"],
)
go_library(
name = "go_default_library",
srcs = [
"capsule.bm.go",
"gaea.bm.go",
"payGoods.bm.go",
"payLive.bm.go",
"resource.bm.go",
"room.bm.go",
"upload.bm.go",
],
embed = [":v1_go_proto"],
importpath = "go-common/app/admin/live/live-admin/api/http/v1",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//library/net/http/blademaster:go_default_library",
"//library/net/http/blademaster/binding:go_default_library",
"@com_github_gogo_protobuf//gogoproto:go_default_library",
"@com_github_gogo_protobuf//proto:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,253 @@
// Code generated by protoc-gen-bm v0.1, DO NOT EDIT.
// source: capsule.proto
/*
Package v1 is a generated blademaster stub package.
This code was generated with go-common/app/tool/bmgen/protoc-gen-bm v0.1.
It is generated from these files:
capsule.proto
*/
package v1
import (
"context"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/binding"
)
// to suppressed 'imported but not used warning'
var _ *bm.Context
var _ context.Context
var _ binding.StructValidator
var PathCapsuleGetCoinList = "/live.liveadmin.v1.Capsule/get_coin_list"
var PathCapsuleUpdateCoinConfig = "/live.liveadmin.v1.Capsule/update_coin_config"
var PathCapsuleUpdateCoinStatus = "/live.liveadmin.v1.Capsule/update_coin_status"
var PathCapsuleDeleteCoin = "/live.liveadmin.v1.Capsule/delete_coin"
var PathCapsuleGetPoolList = "/live.liveadmin.v1.Capsule/get_pool_list"
var PathCapsuleUpdatePool = "/live.liveadmin.v1.Capsule/update_pool"
var PathCapsuleDeletePool = "/live.liveadmin.v1.Capsule/delete_pool"
var PathCapsuleUpdatePoolStatus = "/live.liveadmin.v1.Capsule/update_pool_status"
var PathCapsuleGetPoolPrize = "/live.liveadmin.v1.Capsule/get_pool_prize"
var PathCapsuleGetPrizeType = "/live.liveadmin.v1.Capsule/get_prize_type"
var PathCapsuleGetPrizeExpire = "/live.liveadmin.v1.Capsule/get_prize_expire"
var PathCapsuleUpdatePoolPrize = "/live.liveadmin.v1.Capsule/update_pool_prize"
var PathCapsuleDeletePoolPrize = "/live.liveadmin.v1.Capsule/delete_pool_prize"
var PathCapsuleGetCouponList = "/live.liveadmin.v1.Capsule/get_coupon_list"
// =================
// Capsule Interface
// =================
type CapsuleBMServer interface {
// `internal:"true"`
GetCoinList(ctx context.Context, req *GetCoinListReqAdmin) (resp *GetCoinListRespAdmin, err error)
// `method:"POST" internal:"true"`
UpdateCoinConfig(ctx context.Context, req *UpdateCoinConfigReqAdmin) (resp *UpdateCoinConfigRespAdmin, err error)
// `method:"POST" internal:"true"`
UpdateCoinStatus(ctx context.Context, req *UpdateCoinStatusReqAdmin) (resp *UpdateCoinStatusRespAdmin, err error)
// `method:"POST" internal:"true"`
DeleteCoin(ctx context.Context, req *DeleteCoinReqAdmin) (resp *DeleteCoinRespAdmin, err error)
// `internal:"true"`
GetPoolList(ctx context.Context, req *GetPoolListReqAdmin) (resp *GetPoolListRespAdmin, err error)
// `method:"POST" internal:"true"`
UpdatePool(ctx context.Context, req *UpdatePoolReqAdmin) (resp *UpdatePoolRespAdmin, err error)
// `method:"POST" internal:"true"`
DeletePool(ctx context.Context, req *DeletePoolReqAdmin) (resp *DeletePoolRespAdmin, err error)
// `method:"POST" internal:"true"`
UpdatePoolStatus(ctx context.Context, req *UpdatePoolStatusReqAdmin) (resp *UpdatePoolStatusRespAdmin, err error)
// `internal:"true"`
GetPoolPrize(ctx context.Context, req *GetPoolPrizeReqAdmin) (resp *GetPoolPrizeRespAdmin, err error)
// `internal:"true"`
GetPrizeType(ctx context.Context, req *GetPrizeTypeReq) (resp *GetPrizeTypeResp, err error)
// `internal:"true"`
GetPrizeExpire(ctx context.Context, req *GetPrizeExpireReq) (resp *GetPrizeExpireResp, err error)
// `method:"POST" internal:"true"`
UpdatePoolPrize(ctx context.Context, req *UpdatePoolPrizeReqAdmin) (resp *UpdatePoolPrizeRespAdmin, err error)
// `method:"POST" internal:"true" `
DeletePoolPrize(ctx context.Context, req *DeletePoolPrizeReqAdmin) (resp *DeletePoolPrizeRespAdmin, err error)
// `internal:"true"`
GetCouponList(ctx context.Context, req *CapsuleGetCouponListReq) (resp *CapsuleGetCouponListResp, err error)
}
var v1CapsuleSvc CapsuleBMServer
func capsuleGetCoinList(c *bm.Context) {
p := new(GetCoinListReqAdmin)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1CapsuleSvc.GetCoinList(c, p)
c.JSON(resp, err)
}
func capsuleUpdateCoinConfig(c *bm.Context) {
p := new(UpdateCoinConfigReqAdmin)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1CapsuleSvc.UpdateCoinConfig(c, p)
c.JSON(resp, err)
}
func capsuleUpdateCoinStatus(c *bm.Context) {
p := new(UpdateCoinStatusReqAdmin)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1CapsuleSvc.UpdateCoinStatus(c, p)
c.JSON(resp, err)
}
func capsuleDeleteCoin(c *bm.Context) {
p := new(DeleteCoinReqAdmin)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1CapsuleSvc.DeleteCoin(c, p)
c.JSON(resp, err)
}
func capsuleGetPoolList(c *bm.Context) {
p := new(GetPoolListReqAdmin)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1CapsuleSvc.GetPoolList(c, p)
c.JSON(resp, err)
}
func capsuleUpdatePool(c *bm.Context) {
p := new(UpdatePoolReqAdmin)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1CapsuleSvc.UpdatePool(c, p)
c.JSON(resp, err)
}
func capsuleDeletePool(c *bm.Context) {
p := new(DeletePoolReqAdmin)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1CapsuleSvc.DeletePool(c, p)
c.JSON(resp, err)
}
func capsuleUpdatePoolStatus(c *bm.Context) {
p := new(UpdatePoolStatusReqAdmin)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1CapsuleSvc.UpdatePoolStatus(c, p)
c.JSON(resp, err)
}
func capsuleGetPoolPrize(c *bm.Context) {
p := new(GetPoolPrizeReqAdmin)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1CapsuleSvc.GetPoolPrize(c, p)
c.JSON(resp, err)
}
func capsuleGetPrizeType(c *bm.Context) {
p := new(GetPrizeTypeReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1CapsuleSvc.GetPrizeType(c, p)
c.JSON(resp, err)
}
func capsuleGetPrizeExpire(c *bm.Context) {
p := new(GetPrizeExpireReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1CapsuleSvc.GetPrizeExpire(c, p)
c.JSON(resp, err)
}
func capsuleUpdatePoolPrize(c *bm.Context) {
p := new(UpdatePoolPrizeReqAdmin)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1CapsuleSvc.UpdatePoolPrize(c, p)
c.JSON(resp, err)
}
func capsuleDeletePoolPrize(c *bm.Context) {
p := new(DeletePoolPrizeReqAdmin)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1CapsuleSvc.DeletePoolPrize(c, p)
c.JSON(resp, err)
}
func capsuleGetCouponList(c *bm.Context) {
p := new(CapsuleGetCouponListReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1CapsuleSvc.GetCouponList(c, p)
c.JSON(resp, err)
}
// RegisterV1CapsuleService Register the blademaster route with middleware map
// midMap is the middleware map, the key is defined in proto
func RegisterV1CapsuleService(e *bm.Engine, svc CapsuleBMServer, midMap map[string]bm.HandlerFunc) {
v1CapsuleSvc = svc
e.GET("/xlive/internal/live-admin/v1/capsule/get_coin_list", capsuleGetCoinList)
e.POST("/xlive/internal/live-admin/v1/capsule/update_coin_config", capsuleUpdateCoinConfig)
e.POST("/xlive/internal/live-admin/v1/capsule/update_coin_status", capsuleUpdateCoinStatus)
e.POST("/xlive/internal/live-admin/v1/capsule/delete_coin", capsuleDeleteCoin)
e.GET("/xlive/internal/live-admin/v1/capsule/get_pool_list", capsuleGetPoolList)
e.POST("/xlive/internal/live-admin/v1/capsule/update_pool", capsuleUpdatePool)
e.POST("/xlive/internal/live-admin/v1/capsule/delete_pool", capsuleDeletePool)
e.POST("/xlive/internal/live-admin/v1/capsule/update_pool_status", capsuleUpdatePoolStatus)
e.GET("/xlive/internal/live-admin/v1/capsule/get_pool_prize", capsuleGetPoolPrize)
e.GET("/xlive/internal/live-admin/v1/capsule/get_prize_type", capsuleGetPrizeType)
e.GET("/xlive/internal/live-admin/v1/capsule/get_prize_expire", capsuleGetPrizeExpire)
e.POST("/xlive/internal/live-admin/v1/capsule/update_pool_prize", capsuleUpdatePoolPrize)
e.POST("/xlive/internal/live-admin/v1/capsule/delete_pool_prize", capsuleDeletePoolPrize)
e.GET("/xlive/internal/live-admin/v1/capsule/get_coupon_list", capsuleGetCouponList)
}
// RegisterCapsuleBMServer Register the blademaster route
func RegisterCapsuleBMServer(e *bm.Engine, server CapsuleBMServer) {
v1CapsuleSvc = server
e.GET("/live.liveadmin.v1.Capsule/get_coin_list", capsuleGetCoinList)
e.POST("/live.liveadmin.v1.Capsule/update_coin_config", capsuleUpdateCoinConfig)
e.POST("/live.liveadmin.v1.Capsule/update_coin_status", capsuleUpdateCoinStatus)
e.POST("/live.liveadmin.v1.Capsule/delete_coin", capsuleDeleteCoin)
e.GET("/live.liveadmin.v1.Capsule/get_pool_list", capsuleGetPoolList)
e.POST("/live.liveadmin.v1.Capsule/update_pool", capsuleUpdatePool)
e.POST("/live.liveadmin.v1.Capsule/delete_pool", capsuleDeletePool)
e.POST("/live.liveadmin.v1.Capsule/update_pool_status", capsuleUpdatePoolStatus)
e.GET("/live.liveadmin.v1.Capsule/get_pool_prize", capsuleGetPoolPrize)
e.GET("/live.liveadmin.v1.Capsule/get_prize_type", capsuleGetPrizeType)
e.GET("/live.liveadmin.v1.Capsule/get_prize_expire", capsuleGetPrizeExpire)
e.POST("/live.liveadmin.v1.Capsule/update_pool_prize", capsuleUpdatePoolPrize)
e.POST("/live.liveadmin.v1.Capsule/delete_pool_prize", capsuleDeletePoolPrize)
e.GET("/live.liveadmin.v1.Capsule/get_coupon_list", capsuleGetCouponList)
}

View File

@@ -0,0 +1,505 @@
<!-- package=live.liveadmin.v1 -->
- [/xlive/internal/live-admin/v1/capsule/get_coin_list](#xliveinternallive-adminv1capsuleget_coin_list)
- [/xlive/internal/live-admin/v1/capsule/update_coin_config](#xliveinternallive-adminv1capsuleupdate_coin_config)
- [/xlive/internal/live-admin/v1/capsule/update_coin_status](#xliveinternallive-adminv1capsuleupdate_coin_status)
- [/xlive/internal/live-admin/v1/capsule/delete_coin](#xliveinternallive-adminv1capsuledelete_coin)
- [/xlive/internal/live-admin/v1/capsule/get_pool_list](#xliveinternallive-adminv1capsuleget_pool_list)
- [/xlive/internal/live-admin/v1/capsule/update_pool](#xliveinternallive-adminv1capsuleupdate_pool)
- [/xlive/internal/live-admin/v1/capsule/delete_pool](#xliveinternallive-adminv1capsuledelete_pool)
- [/xlive/internal/live-admin/v1/capsule/update_pool_status](#xliveinternallive-adminv1capsuleupdate_pool_status)
- [/xlive/internal/live-admin/v1/capsule/get_pool_prize](#xliveinternallive-adminv1capsuleget_pool_prize)
- [/xlive/internal/live-admin/v1/capsule/get_prize_type](#xliveinternallive-adminv1capsuleget_prize_type)
- [/xlive/internal/live-admin/v1/capsule/get_prize_expire](#xliveinternallive-adminv1capsuleget_prize_expire)
- [/xlive/internal/live-admin/v1/capsule/update_pool_prize](#xliveinternallive-adminv1capsuleupdate_pool_prize)
- [/xlive/internal/live-admin/v1/capsule/delete_pool_prize](#xliveinternallive-adminv1capsuledelete_pool_prize)
- [/xlive/internal/live-admin/v1/capsule/get_coupon_list](#xliveinternallive-adminv1capsuleget_coupon_list)
## /xlive/internal/live-admin/v1/capsule/get_coin_list
### 无标题
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|page|是|integer|页码从1开始|
|page_size|是|integer|页面的大小|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"total": 0,
"total_page": 0,
"list": [
{
// 扭蛋ID
"id": 0,
// 名称 普通扭蛋, 梦幻扭蛋
"title": "",
// 转化数量
"change_num": 0,
// 开始时间
"start_time": "",
// 结束时间
"end_time": "",
// 状态 0为下线1为上线
"status": 0,
// 获得方式 1为所有瓜子道具2为所有金瓜子道具3为指定道具ID
"gift_type": 0,
// 道具的ID
"gift_config": "",
// 活动分区
"area_ids": [
{
// 父分区ID
"parent_id": 0,
// 是否全选
"is_all": 0,
// 子分区ID
"list": [
0
]
}
]
}
]
}
}
```
## /xlive/internal/live-admin/v1/capsule/update_coin_config
### 无标题
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|id|否|integer|扭蛋ID|
|title|是|string|名称 普通扭蛋, 梦幻扭蛋|
|change_num|是|integer|转化数量|
|start_time|是|string|开始时间|
|end_time|是|string|结束时间|
|status|是|integer|状态 0为下线1为上线|
|gift_type|是|integer|获得方式 1为所有瓜子道具2为所有金瓜子道具3为指定道具ID|
|gift_config|否|string| 道具的ID|
|area_ids|是|string|里面是父分区ID是否全选分区ID|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
// 状态
"status": true
}
}
```
## /xlive/internal/live-admin/v1/capsule/update_coin_status
### 无标题
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|id|是|integer|扭蛋币id|
|status|否|integer|状态 0为下线1为上线|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
// 状态
"status": true
}
}
```
## /xlive/internal/live-admin/v1/capsule/delete_coin
### 无标题
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|id|是|integer|扭蛋币id|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
// 状态
"status": true
}
}
```
## /xlive/internal/live-admin/v1/capsule/get_pool_list
### 无标题
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|page|是|integer|页码|
|page_size|是|integer|页面的大小|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
// 总数
"total": 0,
// 总页数
"total_page": 0,
"list": [
{
// 奖池id
"id": 0,
// 扭蛋名称
"coin_id": 0,
// 奖池名称
"title": "",
// 奖池名称
"coin_title": "",
// 开始时间
"start_time": "",
// 结束时间
"end_time": "",
// 状态 0为下线1为上线
"status": 0,
// 描述
"rule": ""
}
]
}
}
```
## /xlive/internal/live-admin/v1/capsule/update_pool
### 无标题
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|id|否|integer| 奖池id|
|coin_id|是|integer| 扭蛋名称|
|title|是|string|奖池名称|
|start_time|是|string|开始时间|
|end_time|是|string|结束时间|
|rule|是|string|描述|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
// 状态
"status": true
}
}
```
## /xlive/internal/live-admin/v1/capsule/delete_pool
### 无标题
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|id|是|integer|奖池id|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
// 状态
"status": true
}
}
```
## /xlive/internal/live-admin/v1/capsule/update_pool_status
### 无标题
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|id|是|integer|奖池id|
|status|否|integer|状态 0为未上线1为上线|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
// 状态
"status": true
}
}
```
## /xlive/internal/live-admin/v1/capsule/get_pool_prize
### 无标题
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|pool_id|是|integer|奖池id|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"list": [
{
// 奖励id
"id": 0,
// 奖池id
"pool_id": 0,
// 奖品类型 1为道具2为头衔3为经验原石4为经验曜石5为贤者之石6为小号小电视7为舰长守护8为提督守护9为总督守护
"type": 0,
// 数量
"num": 0,
// 奖品真实id
"object_id": 0,
// web端图片
"web_url": "",
// 移动端图片
"mobile_url": "",
// 奖励描述
"description": "",
// 跳转地址
"jump_url": "",
// 概率类型 1为普通2为固定每天3为固定每周
"pro_type": 0,
// 概率3位小数''为另一种概率模式
"chance": "",
// 循环的数量 0为另一种概率模式
"loop": 0,
// 限制数量 0为另一种概率模式
"limit": 0,
// 奖励名称
"name": "",
// 权重
"weight": 0,
// 白名单用户
"white_uids": "",
// 过期类型
"expire": 0
}
]
}
}
```
## /xlive/internal/live-admin/v1/capsule/get_prize_type
### 无标题
#### 方法GET
#### 请求参数
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"list": [
{
"type": 0,
"name": ""
}
]
}
}
```
## /xlive/internal/live-admin/v1/capsule/get_prize_expire
### 无标题
#### 方法GET
#### 请求参数
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"list": [
{
"expire": 0,
"name": ""
}
]
}
}
```
## /xlive/internal/live-admin/v1/capsule/update_pool_prize
### 无标题
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|id|否|integer|奖励id|
|pool_id|否|integer|奖池id|
|type|是|integer|奖品类型 1为道具2为头衔3为经验原石4为经验曜石5为贤者之石6为小号小电视7为舰长守护8为提督守护9为总督守护|
|num|是|integer|数量|
|object_id|否|integer|奖品真实id|
|expire|否|integer|过期时间|
|web_url|是|string|web端图片|
|mobile_url|是|string|移动端图片|
|description|是|string|奖励描述|
|jump_url|否|string|跳转地址|
|pro_type|是|integer|概率类型 1为普通2为固定每天3为固定每周4位白名单|
|chance|否|string|概率3位小数''为另一种概率模式|
|loop|否|integer|循环的数量 0为另一种概率模式|
|limit|否|integer|限制数量 0为另一种概率模式|
|weight|否|integer| 权重|
|white_uids|否|string| 白名单用户|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
// 状态
"status": true,
// 新增id
"prize_id": 0
}
}
```
## /xlive/internal/live-admin/v1/capsule/delete_pool_prize
### 无标题
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|id|是|integer|奖励id|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
// 状态
"status": true
}
}
```
## /xlive/internal/live-admin/v1/capsule/get_coupon_list
### 无标题
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|uid|是|integer||
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"list": [
{
"uid": 0,
// 中奖时间
"award_time": "",
// 奖品名称
"award_name": "",
// 券码
"award_code": "",
// 0 重试 1 成功
"status": 0,
// 上次重试时间
"retry_time": ""
}
]
}
}
```

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,366 @@
syntax = "proto3";
package live.liveadmin.v1;
option go_package = "v1";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
service Capsule{
// `internal:"true"`
rpc get_coin_list(GetCoinListReqAdmin) returns (GetCoinListRespAdmin);
// `method:"POST" internal:"true"`
rpc update_coin_config(UpdateCoinConfigReqAdmin) returns (UpdateCoinConfigRespAdmin);
// `method:"POST" internal:"true"`
rpc update_coin_status(UpdateCoinStatusReqAdmin) returns (UpdateCoinStatusRespAdmin);
// `method:"POST" internal:"true"`
rpc delete_coin(DeleteCoinReqAdmin) returns (DeleteCoinRespAdmin);
// `internal:"true"`
rpc get_pool_list(GetPoolListReqAdmin) returns (GetPoolListRespAdmin);
// `method:"POST" internal:"true"`
rpc update_pool(UpdatePoolReqAdmin) returns (UpdatePoolRespAdmin);
// `method:"POST" internal:"true"`
rpc delete_pool(DeletePoolReqAdmin) returns (DeletePoolRespAdmin);
// `method:"POST" internal:"true"`
rpc update_pool_status(UpdatePoolStatusReqAdmin) returns (UpdatePoolStatusRespAdmin);
// `internal:"true"`
rpc get_pool_prize(GetPoolPrizeReqAdmin) returns (GetPoolPrizeRespAdmin);
// `internal:"true"`
rpc get_prize_type (GetPrizeTypeReq) returns (GetPrizeTypeResp);
// `internal:"true"`
rpc get_prize_expire (GetPrizeExpireReq) returns (GetPrizeExpireResp);
// `method:"POST" internal:"true"`
rpc update_pool_prize(UpdatePoolPrizeReqAdmin) returns (UpdatePoolPrizeRespAdmin);
// `method:"POST" internal:"true" `
rpc delete_pool_prize(DeletePoolPrizeReqAdmin) returns (DeletePoolPrizeRespAdmin);
// `internal:"true"`
rpc get_coupon_list (CapsuleGetCouponListReq) returns (CapsuleGetCouponListResp);
}
message GetCoinListReqAdmin{
//页码从1开始
int64 page = 1 [(gogoproto.moretags) = 'form:"page" validate:"required"'];
//页面的大小
int64 page_size = 2 [(gogoproto.moretags) = 'form:"page_size" validate:"required"'];
}
message GetCoinListRespAdmin{
int64 total = 1 [(gogoproto.jsontag) = "total"]; //
int64 total_page = 2 [(gogoproto.jsontag) = "total_page"];
repeated List list = 3 [(gogoproto.jsontag) = "list"];
message List{
//扭蛋ID
int64 id = 1 [(gogoproto.jsontag) = "id"];
//名称 普通扭蛋, 梦幻扭蛋
string title = 2 [(gogoproto.jsontag) = "title"];
//转化数量
int64 change_num = 3 [(gogoproto.jsontag) = "change_num"];
//开始时间
string start_time = 4 [(gogoproto.jsontag) = "start_time"];
//结束时间
string end_time = 5 [(gogoproto.jsontag) = "end_time"];
//状态 0为下线1为上线
int64 status = 6 [(gogoproto.jsontag) = "status"];
//获得方式 1为所有瓜子道具2为所有金瓜子道具3为指定道具ID
int64 gift_type = 7 [(gogoproto.jsontag) = "gift_type"];
// 道具的ID
string gift_config = 8 [(gogoproto.jsontag) = "gift_config"];
//活动分区
repeated Area_ids area_ids = 9 [(gogoproto.jsontag) = "area_ids"];
message Area_ids{
// 父分区ID
int64 parent_id = 1 [(gogoproto.jsontag) = "parent_id"];
// 是否全选
int64 is_all = 2 [(gogoproto.jsontag) = "is_all"];
// 子分区ID
repeated int64 list = 3 [(gogoproto.jsontag) = "list"];
}
}
}
message UpdateCoinConfigReqAdmin{
//扭蛋ID
int64 id = 1 [(gogoproto.moretags) = 'form:"id"'];
//名称 普通扭蛋, 梦幻扭蛋
string title = 2 [(gogoproto.moretags) = 'form:"title" validate:"required"'];
//转化数量
int64 change_num = 3 [(gogoproto.moretags) = 'form:"change_num" validate:"required"'];
//开始时间
string start_time = 4 [(gogoproto.moretags) = 'form:"start_time" validate:"required"'];
//结束时间
string end_time = 5 [(gogoproto.moretags) = 'form:"end_time" validate:"required"'];
//状态 0为下线1为上线
int64 status = 6 [(gogoproto.moretags) = 'form:"status" validate:"required"'];
//获得方式 1为所有瓜子道具2为所有金瓜子道具3为指定道具ID
int64 gift_type = 7 [(gogoproto.moretags) = 'form:"gift_type" validate:"required"'];
// 道具的ID
string gift_config = 8 [(gogoproto.moretags) = 'form:"gift_config"'];
//里面是父分区ID是否全选分区ID
string area_ids = 9 [(gogoproto.moretags) = 'form:"area_ids" validate:"required"'];
}
message UpdateCoinConfigRespAdmin{
//状态
bool status = 1 [(gogoproto.jsontag) = "status"];
}
message UpdateCoinStatusReqAdmin{
//扭蛋币id
int64 id = 1 [(gogoproto.moretags) = 'form:"id" validate:"required"'];
//状态 0为下线1为上线
int64 status = 2 [(gogoproto.moretags) = 'form:"status"'];
}
message UpdateCoinStatusRespAdmin{
//状态
bool status = 1 [(gogoproto.jsontag) = "status"];
}
message DeleteCoinReqAdmin{
//扭蛋币id
int64 id = 1 [(gogoproto.moretags) = 'form:"id" validate:"required"'];
}
message DeleteCoinRespAdmin{
//状态
bool status = 1 [(gogoproto.jsontag) = "status"];
}
message GetPoolListReqAdmin{
//页码
int64 page = 1 [(gogoproto.moretags) = 'form:"page" validate:"required"'];
//页面的大小
int64 page_size = 2 [(gogoproto.moretags) = 'form:"page_size" validate:"required"'];
}
message GetPoolListRespAdmin{
//总数
int64 total = 1 [(gogoproto.jsontag) = "total"];
//总页数
int64 total_page = 2 [(gogoproto.jsontag) = "total_page"];
repeated List list = 3 [(gogoproto.jsontag) = "list"];
message List{
// 奖池id
int64 id = 1 [(gogoproto.jsontag) = "id"];
// 扭蛋名称
int64 coin_id = 2 [(gogoproto.jsontag) = "coin_id"];
// 奖池名称
string title = 3 [(gogoproto.jsontag) = "title"];
// 奖池名称
string coin_title = 8 [(gogoproto.jsontag) = "coin_title"];
//开始时间
string start_time = 4 [(gogoproto.jsontag) = "start_time"];
//结束时间
string end_time = 5 [(gogoproto.jsontag) = "end_time"];
//状态 0为下线1为上线
int64 status = 6 [(gogoproto.jsontag) = "status"];
//描述
string rule = 7 [(gogoproto.jsontag) = "rule"];
}
}
message UpdatePoolReqAdmin{
// 奖池id
int64 id = 1 [(gogoproto.moretags) = 'form:"id"'];
// 扭蛋名称
int64 coin_id = 2 [(gogoproto.moretags) = 'form:"coin_id" validate:"required"'];
//奖池名称
string title = 3 [(gogoproto.moretags) = 'form:"title" validate:"required"'];
//开始时间
string start_time = 4 [(gogoproto.moretags) = 'form:"start_time" validate:"required"'];
//结束时间
string end_time = 5 [(gogoproto.moretags) = 'form:"end_time" validate:"required"'];
//描述
string rule = 6 [(gogoproto.moretags) = 'form:"rule" validate:"required"'];
}
message UpdatePoolRespAdmin{
//状态
bool status = 1 [(gogoproto.jsontag) = "status"];
}
message DeletePoolReqAdmin{
//奖池id
int64 id = 1 [(gogoproto.moretags) = 'form:"id" validate:"required"'];
}
message DeletePoolRespAdmin{
//状态
bool status = 1 [(gogoproto.jsontag) = "status"];
}
message UpdatePoolStatusReqAdmin{
//奖池id
int64 id = 1 [(gogoproto.moretags) = 'form:"id" validate:"required"'];
//状态 0为未上线1为上线
int64 status = 2 [(gogoproto.moretags) = 'form:"status"'];
}
message UpdatePoolStatusRespAdmin{
//状态
bool status = 1 [(gogoproto.jsontag) = "status"];
}
message GetPoolPrizeReqAdmin{
//奖池id
int64 pool_id = 1 [(gogoproto.moretags) = 'form:"pool_id" validate:"required"'];
}
message GetPoolPrizeRespAdmin{
repeated List list = 1 [(gogoproto.jsontag) = "list"];
message List{
//奖励id
int64 id = 1 [(gogoproto.jsontag) = "id"];
//奖池id
int64 pool_id = 2 [(gogoproto.jsontag) = "pool_id"];
//奖品类型 1为道具2为头衔3为经验原石4为经验曜石5为贤者之石6为小号小电视7为舰长守护8为提督守护9为总督守护
int64 type = 3 [(gogoproto.jsontag) = "type"];
//数量
int64 num = 4 [(gogoproto.jsontag) = "num"];
//奖品真实id
int64 object_id = 5 [(gogoproto.jsontag) = "object_id"];
//web端图片
string web_url = 6 [(gogoproto.jsontag) = "web_url"];
//移动端图片
string mobile_url = 7 [(gogoproto.jsontag) = "mobile_url"];
//奖励描述
string description = 8 [(gogoproto.jsontag) = "description"];
//跳转地址
string jump_url = 9 [(gogoproto.jsontag) = "jump_url"];
//概率类型 1为普通2为固定每天3为固定每周
int64 pro_type = 10 [(gogoproto.jsontag) = "pro_type"];
//概率3位小数''为另一种概率模式
string chance = 11 [(gogoproto.jsontag) = "chance"];
//循环的数量 0为另一种概率模式
int64 loop = 12 [(gogoproto.jsontag) = "loop"];
//限制数量 0为另一种概率模式
int64 limit = 13 [(gogoproto.jsontag) = "limit"];
// 奖励名称
string name = 14 [(gogoproto.jsontag) = "name"];
// 权重
int64 weight = 15 [(gogoproto.jsontag) = "weight"];
// 白名单用户
string white_uids = 16 [(gogoproto.jsontag) = "white_uids"];
// 过期类型
int64 expire = 17 [(gogoproto.jsontag) = "expire"];
}
}
message UpdatePoolPrizeReqAdmin{
//奖励id
int64 id = 1 [(gogoproto.moretags) = 'form:"id"'];
//奖池id
int64 pool_id = 2 [(gogoproto.moretags) = 'form:"pool_id"'];
//奖品类型 1为道具2为头衔3为经验原石4为经验曜石5为贤者之石6为小号小电视7为舰长守护8为提督守护9为总督守护
int64 type = 3 [(gogoproto.moretags) = 'form:"type" validate:"required"'];
//数量
int64 num = 4 [(gogoproto.moretags) = 'form:"num" validate:"required"'];
//奖品真实id
int64 object_id = 5 [(gogoproto.moretags) = 'form:"object_id"'];
//过期时间
int64 expire = 6 [(gogoproto.moretags) = 'form:"expire"'];
//web端图片
string web_url = 7 [(gogoproto.moretags) = 'form:"web_url" validate:"required"'];
//移动端图片
string mobile_url = 8 [(gogoproto.moretags) = 'form:"mobile_url" validate:"required"'];
//奖励描述
string description = 9 [(gogoproto.moretags) = 'form:"description" validate:"required"'];
//跳转地址
string jump_url = 10 [(gogoproto.moretags) = 'form:"jump_url"'];
//概率类型 1为普通2为固定每天3为固定每周4位白名单
int64 pro_type = 11 [(gogoproto.moretags) = 'form:"pro_type" validate:"required"'];
//概率3位小数''为另一种概率模式
string chance = 12 [(gogoproto.moretags) = 'form:"chance"'];
//循环的数量 0为另一种概率模式
int64 loop = 13 [(gogoproto.moretags) = 'form:"loop"'];
//限制数量 0为另一种概率模式
int64 limit = 14 [(gogoproto.moretags) = 'form:"limit"'];
// 权重
int64 weight = 15 [(gogoproto.moretags) = 'form:"weight"'];
// 白名单用户
string white_uids = 16 [(gogoproto.moretags) = 'form:"white_uids"'];
}
message UpdatePoolPrizeRespAdmin{
//状态
bool status = 1 [(gogoproto.jsontag) = "status"];
//新增id
int64 prize_id = 2 [(gogoproto.jsontag) = "prize_id"];
}
message DeletePoolPrizeReqAdmin{
//奖励id
int64 id = 1 [(gogoproto.moretags) = 'form:"id" validate:"required"'];
}
message DeletePoolPrizeRespAdmin{
//状态
bool status = 1 [(gogoproto.jsontag) = "status"];
}
message GetPrizeTypeReq {
}
message GetPrizeTypeResp {
repeated List list = 3 [(gogoproto.jsontag) = "list"];
message List {
//
int64 type = 1 [(gogoproto.jsontag) = "type"];
//
string name = 2 [(gogoproto.jsontag) = "name"];
}
}
message GetPrizeExpireReq {
}
message GetPrizeExpireResp {
repeated List list = 3 [(gogoproto.jsontag) = "list"];
message List {
//
int64 expire = 1 [(gogoproto.jsontag) = "expire"];
//
string name = 2 [(gogoproto.jsontag) = "name"];
}
}
message CapsuleGetCouponListReq {
//
int64 uid = 1 [(gogoproto.moretags) = 'form:"uid" validate:"required"'];
}
message CapsuleGetCouponListResp {
message List {
//
int64 uid = 1 [(gogoproto.jsontag) = "uid"];
// 中奖时间
string award_time = 2 [(gogoproto.jsontag) = "award_time"];
// 奖品名称
string award_name = 3 [(gogoproto.jsontag) = "award_name"];
// 券码
string award_code = 4 [(gogoproto.jsontag) = "award_code"];
// 0 重试 1 成功
int64 status = 5 [(gogoproto.jsontag) = "status"];
// 上次重试时间
string retry_time = 6 [(gogoproto.jsontag) = "retry_time"];
}
repeated List list = 1 [(gogoproto.jsontag) = "list"];
}

View File

@@ -0,0 +1,133 @@
// Code generated by protoc-gen-bm v0.1, DO NOT EDIT.
// source: gaea.proto
/*
Package v1 is a generated blademaster stub package.
This code was generated with go-common/app/tool/bmgen/protoc-gen-bm v0.1.
It is generated from these files:
gaea.proto
*/
package v1
import (
"context"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/binding"
)
// to suppressed 'imported but not used warning'
var _ *bm.Context
var _ context.Context
var _ binding.StructValidator
var PathGaeaGetConfigByKeyword = "/live.liveadmin.v1.gaea/get_config_by_keyword"
var PathGaeaSetConfigByKeyword = "/live.liveadmin.v1.gaea/set_config_by_keyword"
var PathGaeaGetConfigsByParams = "/live.liveadmin.v1.gaea/get_configs_by_params"
var PathGaeaGetConfigsByTeam = "/live.liveadmin.v1.gaea/get_configs_by_team"
var PathGaeaGetConfigsByKeyword = "/live.liveadmin.v1.gaea/get_configs_by_keyword"
var PathGaeaGetConfigsByTeams = "/live.liveadmin.v1.gaea/get_configs_by_teams"
// ==============
// Gaea Interface
// ==============
type GaeaBMServer interface {
// 获取team下某个keyword的配置 `internal:"true"`
GetConfigByKeyword(ctx context.Context, req *GetConfigReq) (resp *GetConfigResp, err error)
// `method:"POST" internal:"true"` 设置team下某个keyword配置
SetConfigByKeyword(ctx context.Context, req *SetConfigReq) (resp *SetConfigResp, err error)
// 管理后台根据条件获取配置 `internal:"true"`
GetConfigsByParams(ctx context.Context, req *ParamsConfigReq) (resp *ParamsConfigResp, err error)
// 获取单个team的全部配置 `internal:"true"`
GetConfigsByTeam(ctx context.Context, req *TeamConfigReq) (resp *TeamConfigResp, err error)
// 通过keyword获取配置 `internal:"true"`
GetConfigsByKeyword(ctx context.Context, req *GetConfigsReq) (resp *GetConfigsResp, err error)
// 获取多个team下的全部配置 `internal:"true"`
GetConfigsByTeams(ctx context.Context, req *TeamsConfigReq) (resp *TeamsConfigResp, err error)
}
var v1GaeaSvc GaeaBMServer
func gaeaGetConfigByKeyword(c *bm.Context) {
p := new(GetConfigReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1GaeaSvc.GetConfigByKeyword(c, p)
c.JSON(resp, err)
}
func gaeaSetConfigByKeyword(c *bm.Context) {
p := new(SetConfigReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1GaeaSvc.SetConfigByKeyword(c, p)
c.JSON(resp, err)
}
func gaeaGetConfigsByParams(c *bm.Context) {
p := new(ParamsConfigReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1GaeaSvc.GetConfigsByParams(c, p)
c.JSON(resp, err)
}
func gaeaGetConfigsByTeam(c *bm.Context) {
p := new(TeamConfigReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1GaeaSvc.GetConfigsByTeam(c, p)
c.JSON(resp, err)
}
func gaeaGetConfigsByKeyword(c *bm.Context) {
p := new(GetConfigsReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1GaeaSvc.GetConfigsByKeyword(c, p)
c.JSON(resp, err)
}
func gaeaGetConfigsByTeams(c *bm.Context) {
p := new(TeamsConfigReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1GaeaSvc.GetConfigsByTeams(c, p)
c.JSON(resp, err)
}
// RegisterV1GaeaService Register the blademaster route with middleware map
// midMap is the middleware map, the key is defined in proto
func RegisterV1GaeaService(e *bm.Engine, svc GaeaBMServer, midMap map[string]bm.HandlerFunc) {
v1GaeaSvc = svc
e.GET("/xlive/internal/live-admin/v1/gaea/get_config_by_keyword", gaeaGetConfigByKeyword)
e.POST("/xlive/internal/live-admin/v1/gaea/set_config_by_keyword", gaeaSetConfigByKeyword)
e.GET("/xlive/internal/live-admin/v1/gaea/get_configs_by_params", gaeaGetConfigsByParams)
e.GET("/xlive/internal/live-admin/v1/gaea/get_configs_by_team", gaeaGetConfigsByTeam)
e.GET("/xlive/internal/live-admin/v1/gaea/get_configs_by_keyword", gaeaGetConfigsByKeyword)
e.GET("/xlive/internal/live-admin/v1/gaea/get_configs_by_teams", gaeaGetConfigsByTeams)
}
// RegisterGaeaBMServer Register the blademaster route
func RegisterGaeaBMServer(e *bm.Engine, server GaeaBMServer) {
v1GaeaSvc = server
e.GET("/live.liveadmin.v1.gaea/get_config_by_keyword", gaeaGetConfigByKeyword)
e.POST("/live.liveadmin.v1.gaea/set_config_by_keyword", gaeaSetConfigByKeyword)
e.GET("/live.liveadmin.v1.gaea/get_configs_by_params", gaeaGetConfigsByParams)
e.GET("/live.liveadmin.v1.gaea/get_configs_by_team", gaeaGetConfigsByTeam)
e.GET("/live.liveadmin.v1.gaea/get_configs_by_keyword", gaeaGetConfigsByKeyword)
e.GET("/live.liveadmin.v1.gaea/get_configs_by_teams", gaeaGetConfigsByTeams)
}

View File

@@ -0,0 +1,248 @@
<!-- package=live.liveadmin.v1 -->
- [/xlive/internal/live-admin/v1/gaea/get_config_by_keyword](#xliveinternallive-adminv1gaeaget_config_by_keyword)
- [/xlive/internal/live-admin/v1/gaea/set_config_by_keyword](#xliveinternallive-adminv1gaeaset_config_by_keyword)
- [/xlive/internal/live-admin/v1/gaea/get_configs_by_params](#xliveinternallive-adminv1gaeaget_configs_by_params)
- [/xlive/internal/live-admin/v1/gaea/get_configs_by_team](#xliveinternallive-adminv1gaeaget_configs_by_team)
- [/xlive/internal/live-admin/v1/gaea/get_configs_by_keyword](#xliveinternallive-adminv1gaeaget_configs_by_keyword)
- [/xlive/internal/live-admin/v1/gaea/get_configs_by_teams](#xliveinternallive-adminv1gaeaget_configs_by_teams)
## /xlive/internal/live-admin/v1/gaea/get_config_by_keyword
### 无标题
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|team|否|integer|team|
|keyword|否|string|索引名称|
|id|否|integer|id|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
// team
"team": 0,
// 索引名称
"keyword": "",
// 配置值
"value": "",
// 配置解释
"name": "",
// 创建时间
"ctime": "",
// 最近更新时间
"mtime": "",
// 状态
"status": 0,
// id
"id": 0
}
}
```
## /xlive/internal/live-admin/v1/gaea/set_config_by_keyword
### 无标题
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|team|否|integer|team|
|keyword|是|string|索引名称|
|value|是|string|配置值|
|name|否|string|配置解释|
|id|否|integer|编辑时id|
|status|否|integer|状态|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"id": 0
}
}
```
## /xlive/internal/live-admin/v1/gaea/get_configs_by_params
### 无标题
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|team|否|integer||
|keyword|否|string||
|name|否|string||
|status|否|integer||
|page|是|integer||
|page_size|是|integer|页量|
|id|否|integer|id|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"list": [
{
// Id
"id": 0,
// team
"team": 0,
// 索引名称
"keyword": "",
// 配置值
"value": "",
// 配置解释
"name": "",
// 创建时间
"ctime": "",
// 最近更新时间
"mtime": "",
// 状态
"status": 0
}
],
// 记录总数
"total_num": 0
}
}
```
## /xlive/internal/live-admin/v1/gaea/get_configs_by_team
### 无标题
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|team|是|string|team|
|page|是|integer|页码 从1开始|
|page_size|是|integer|页量|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
// 数据列表
"list": [
{
// Id
"id": 0,
// team
"team": 0,
// 索引名称
"keyword": "",
// 配置值
"value": "",
// 配置解释
"name": "",
// 创建时间
"ctime": "",
// 最近更新时间
"mtime": "",
// 状态
"status": 0
}
],
// 记录总数
"total_num": 0
}
}
```
## /xlive/internal/live-admin/v1/gaea/get_configs_by_keyword
### 无标题
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|keyword|是|string|索引名称|
|page|是|integer|页码|
|page_size|是|integer|页量|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
// 数据列表
"list": [
{
// Id
"id": 0,
// team
"team": 0,
// 索引名称
"keyword": "",
// 配置值
"value": "",
// 配置解释
"name": "",
// 创建时间
"ctime": "",
// 最近更新时间
"mtime": "",
// 状态
"status": 0
}
],
// 记录总数
"total_num": 0
}
}
```
## /xlive/internal/live-admin/v1/gaea/get_configs_by_teams
### 无标题
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|team|是|多个integer|team|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"list": ""
}
}
```

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,154 @@
syntax = "proto3";
package live.liveadmin.v1;
option go_package = "v1";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
service gaea {
//获取team下某个keyword的配置 `internal:"true"`
rpc get_config_by_keyword(GetConfigReq) returns (GetConfigResp);
//`method:"POST" internal:"true"` 设置team下某个keyword配置
rpc set_config_by_keyword(SetConfigReq) returns (SetConfigResp);
//管理后台根据条件获取配置 `internal:"true"`
rpc get_configs_by_params(ParamsConfigReq) returns (ParamsConfigResp);
//获取单个team的全部配置 `internal:"true"`
rpc get_configs_by_team(TeamConfigReq) returns (TeamConfigResp);
//通过keyword获取配置 `internal:"true"`
rpc get_configs_by_keyword(GetConfigsReq) returns (GetConfigsResp);
//获取多个team下的全部配置 `internal:"true"`
rpc get_configs_by_teams(TeamsConfigReq) returns (TeamsConfigResp);
}
// 通过参数获取一条记录的信息
message GetConfigReq {
//team
int64 team = 1 [(gogoproto.moretags) = 'form:"team"'];
//索引名称
string keyword = 2 [(gogoproto.moretags) = 'form:"keyword"'];
//id
int64 id = 3 [(gogoproto.moretags) = 'form:"id"'];
}
message GetConfigResp {
//team
int64 team = 1 [(gogoproto.jsontag) = "team"];
//索引名称
string keyword = 2 [(gogoproto.jsontag) = "keyword"];
//配置值
string value = 3 [(gogoproto.jsontag) = "value"];
//配置解释
string name = 4 [(gogoproto.jsontag) = "name"];
//创建时间
string ctime = 5 [(gogoproto.jsontag) = "ctime"];
//最近更新时间
string mtime = 6 [(gogoproto.jsontag) = "mtime"];
//状态
int64 status = 7 [(gogoproto.jsontag) = "status"];
//id
int64 id = 8 [(gogoproto.jsontag) = "id"];
}
// 设置某个key的信息
message SetConfigReq {
//team
int64 team = 1 [(gogoproto.moretags) = 'form:"team"'];
//索引名称
string keyword = 2 [(gogoproto.moretags) = 'form:"keyword" validate:"required"'];
//配置值
string value = 3 [(gogoproto.moretags) = 'form:"value" validate:"required"'];
//配置解释
string name = 4 [(gogoproto.moretags) = 'form:"name"'];
//编辑时id
int64 id = 5 [(gogoproto.moretags) = 'form:"id"'];
//状态
int64 status = 6 [(gogoproto.moretags) = 'form:"status"'];
}
message SetConfigResp {
int64 id = 1 [(gogoproto.jsontag) = "id"];
}
// 管理后台通过参数获取列表
message ParamsConfigReq{
int64 team = 1 [(gogoproto.moretags) = 'form:"team"'];
string keyword = 2 [(gogoproto.moretags) = 'form:"keyword"'];
string name = 3 [(gogoproto.moretags) = 'form:"name"'];
int64 status = 4 [(gogoproto.moretags) = 'form:"status"'];
int64 page = 5 [(gogoproto.moretags) = 'form:"page" validate:"required"'];
//页量
int64 page_size = 6 [(gogoproto.moretags) = 'form:"page_size" validate:"required"'];
//id
int64 id = 7 [(gogoproto.moretags) = 'form:"id"'];
}
message ParamsConfigResp{
repeated List list =1 [(gogoproto.jsontag) = "list"];
//记录总数
int64 total_num = 2 [(gogoproto.jsontag) = "total_num"];
}
message TeamConfigReq{
//team
string team = 1 [(gogoproto.moretags) = 'form:"team" validate:"required"'];
//页码 从1开始
int64 page = 2 [(gogoproto.moretags) = 'form:"page" validate:"required"'];
//页量
int64 page_size = 3 [(gogoproto.moretags) = 'form:"page_size" validate:"required"'];
}
message TeamConfigResp{
//数据列表
repeated List list = 1 [(gogoproto.jsontag) = "list"];
//记录总数
int64 total_num = 2 [(gogoproto.jsontag) = "total_num"];
}
message GetConfigsReq{
//索引名称
string keyword = 1 [(gogoproto.moretags) = 'form:"keyword" validate:"required"'];
//页码
int64 page = 2 [(gogoproto.moretags) = 'form:"page" validate:"required"'];
//页量
int64 page_size = 3 [(gogoproto.moretags) = 'form:"page_size" validate:"required"'];
}
message GetConfigsResp{
//数据列表
repeated List list = 1 [(gogoproto.jsontag) = "list"];
//记录总数
int64 total_num = 2 [(gogoproto.jsontag) = "total_num"];
}
message List {
//Id
int64 id = 1 [(gogoproto.jsontag) = "id"];
//team
int64 team = 2 [(gogoproto.jsontag) = "team"];
//索引名称
string keyword = 3 [(gogoproto.jsontag) = "keyword"];
//配置值
string value = 4 [(gogoproto.jsontag) = "value"];
//配置解释
string name = 5 [(gogoproto.jsontag) = "name"];
//创建时间
string ctime = 6 [(gogoproto.jsontag) = "ctime"];
//最近更新时间
string mtime = 7 [(gogoproto.jsontag) = "mtime"];
//状态
int64 status = 8 [(gogoproto.jsontag) = "status"];
}
message TeamsConfigReq{
//team
repeated int64 team = 1 [(gogoproto.moretags) = 'form:"team" validate:"required"'];
}
message TeamsConfigResp{
string list = 1 [(gogoproto.jsontag) = "list"];
}

View File

@@ -0,0 +1,118 @@
// Code generated by protoc-gen-bm v0.1, DO NOT EDIT.
// source: payGoods.proto
/*
Package v1 is a generated blademaster stub package.
This code was generated with go-common/app/tool/bmgen/protoc-gen-bm v0.1.
It is generated from these files:
payGoods.proto
*/
package v1
import (
"context"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/binding"
)
// to suppressed 'imported but not used warning'
var _ *bm.Context
var _ context.Context
var _ binding.StructValidator
var PathPayGoodsAdd = "/live.liveadmin.v1.PayGoods/add"
var PathPayGoodsUpdate = "/live.liveadmin.v1.PayGoods/update"
var PathPayGoodsGetList = "/live.liveadmin.v1.PayGoods/getList"
var PathPayGoodsClose = "/live.liveadmin.v1.PayGoods/close"
var PathPayGoodsOpen = "/live.liveadmin.v1.PayGoods/open"
// ==================
// PayGoods Interface
// ==================
type PayGoodsBMServer interface {
// `method:"POST" internal:"true"` 生成一张付费直播票
Add(ctx context.Context, req *PayGoodsAddReq) (resp *PayGoodsAddResp, err error)
// `method:"POST" internal:"true"` 更新一张付费直播票
Update(ctx context.Context, req *PayGoodsUpdateReq) (resp *PayGoodsUpdateResp, err error)
// `internal:"true"` 获取付费直播票列表
GetList(ctx context.Context, req *PayGoodsGetListReq) (resp *PayGoodsGetListResp, err error)
// `method:"POST" internal:"true"` 关闭购票
Close(ctx context.Context, req *PayGoodsCloseReq) (resp *PayGoodsCloseResp, err error)
// `method:"POST" internal:"true"` 开启购票
Open(ctx context.Context, req *PayGoodsOpenReq) (resp *PayGoodsOpenResp, err error)
}
var v1PayGoodsSvc PayGoodsBMServer
func payGoodsAdd(c *bm.Context) {
p := new(PayGoodsAddReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1PayGoodsSvc.Add(c, p)
c.JSON(resp, err)
}
func payGoodsUpdate(c *bm.Context) {
p := new(PayGoodsUpdateReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1PayGoodsSvc.Update(c, p)
c.JSON(resp, err)
}
func payGoodsGetList(c *bm.Context) {
p := new(PayGoodsGetListReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1PayGoodsSvc.GetList(c, p)
c.JSON(resp, err)
}
func payGoodsClose(c *bm.Context) {
p := new(PayGoodsCloseReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1PayGoodsSvc.Close(c, p)
c.JSON(resp, err)
}
func payGoodsOpen(c *bm.Context) {
p := new(PayGoodsOpenReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1PayGoodsSvc.Open(c, p)
c.JSON(resp, err)
}
// RegisterV1PayGoodsService Register the blademaster route with middleware map
// midMap is the middleware map, the key is defined in proto
func RegisterV1PayGoodsService(e *bm.Engine, svc PayGoodsBMServer, midMap map[string]bm.HandlerFunc) {
v1PayGoodsSvc = svc
e.POST("/xlive/internal/live-admin/v1/payGoods/add", payGoodsAdd)
e.POST("/xlive/internal/live-admin/v1/payGoods/update", payGoodsUpdate)
e.GET("/xlive/internal/live-admin/v1/payGoods/getList", payGoodsGetList)
e.POST("/xlive/internal/live-admin/v1/payGoods/close", payGoodsClose)
e.POST("/xlive/internal/live-admin/v1/payGoods/open", payGoodsOpen)
}
// RegisterPayGoodsBMServer Register the blademaster route
func RegisterPayGoodsBMServer(e *bm.Engine, server PayGoodsBMServer) {
v1PayGoodsSvc = server
e.POST("/live.liveadmin.v1.PayGoods/add", payGoodsAdd)
e.POST("/live.liveadmin.v1.PayGoods/update", payGoodsUpdate)
e.GET("/live.liveadmin.v1.PayGoods/getList", payGoodsGetList)
e.POST("/live.liveadmin.v1.PayGoods/close", payGoodsClose)
e.POST("/live.liveadmin.v1.PayGoods/open", payGoodsOpen)
}

View File

@@ -0,0 +1,168 @@
<!-- package=live.liveadmin.v1 -->
- [/xlive/internal/live-admin/v1/payGoods/add](#xliveinternallive-adminv1payGoodsadd)
- [/xlive/internal/live-admin/v1/payGoods/update](#xliveinternallive-adminv1payGoodsupdate)
- [/xlive/internal/live-admin/v1/payGoods/getList](#xliveinternallive-adminv1payGoodsgetList)
- [/xlive/internal/live-admin/v1/payGoods/close](#xliveinternallive-adminv1payGoodsclose)
- [/xlive/internal/live-admin/v1/payGoods/open](#xliveinternallive-adminv1payGoodsopen)
## /xlive/internal/live-admin/v1/payGoods/add
### 无标题
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|platform|否|string| 平台|
|title|是|string| 商品名称|
|type|是|integer| 商品类型 2 付费直播门票|
|price|是|integer| 商品价格(分)|
|start_time|是|string| 开始时间|
|end_time|是|string| 结束时间|
|ip_limit|否|integer| ip限制0不限制1仅限大陆2仅限港澳台3大陆+港澳台|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
}
}
```
## /xlive/internal/live-admin/v1/payGoods/update
### 无标题
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|id|否|integer| 购票id|
|platform|否|string| 平台|
|title|否|string| 商品名称|
|type|否|integer| 商品类型 2 付费直播门票|
|price|否|integer| 商品价格(分)|
|start_time|否|string| 开始时间|
|end_time|否|string| 结束时间|
|ip_limit|否|integer| ip限制0不限制1仅限大陆2仅限港澳台3大陆+港澳台|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
}
}
```
## /xlive/internal/live-admin/v1/payGoods/getList
### 无标题
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|id|否|integer| 购票id|
|platform|否|string| 平台|
|title|否|string| 商品名称|
|type|否|integer| 商品类型 2 付费直播门票|
|ip_limit|否|integer| ip限制0不限制1仅限大陆2仅限港澳台3大陆+港澳台|
|page_num|否|integer| 页号0开始|
|page_size|否|integer| 每页个数|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"page_info": {
// 记录总数
"total_count": 0,
// 当前页号
"page_num": 0
},
"goods_info": [
{
// 购票id
"id": 0,
// 标题
"title": "",
// 平台
"platform": "",
// 类型2为付费直播
"type": 0,
// 价格,分
"price": 0,
// 开始购票时间
"start_time": "",
// 结束购票时间
"end_time": "",
// ip限制
"ip_limit": 0,
// 购票状态0关闭1购票中2未开始
"status": 0
}
]
}
}
```
## /xlive/internal/live-admin/v1/payGoods/close
### 无标题
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|id|是|integer| 购票id|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
}
}
```
## /xlive/internal/live-admin/v1/payGoods/open
### 无标题
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|id|是|integer| 购票id|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
}
}
```

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,145 @@
syntax = "proto3";
package live.liveadmin.v1;
option go_package = "v1";
option (gogoproto.goproto_getters_all) = false;
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
service PayGoods {
// `method:"POST" internal:"true"` 生成一张付费直播票
rpc add (PayGoodsAddReq) returns (PayGoodsAddResp);
// `method:"POST" internal:"true"` 更新一张付费直播票
rpc update (PayGoodsUpdateReq) returns (PayGoodsUpdateResp);
// `internal:"true"` 获取付费直播票列表
rpc getList (PayGoodsGetListReq) returns (PayGoodsGetListResp);
// `method:"POST" internal:"true"` 关闭购票
rpc close (PayGoodsCloseReq) returns (PayGoodsCloseResp);
// `method:"POST" internal:"true"` 开启购票
rpc open (PayGoodsOpenReq) returns (PayGoodsOpenResp);
}
message PayGoodsAddReq {
// 平台
string platform = 1 [(gogoproto.moretags) = 'form:"platform"'];
// 商品名称
string title = 2 [(gogoproto.moretags) = 'form:"title" validate:"required"'];
// 商品类型 2 付费直播门票
int64 type = 3 [(gogoproto.moretags) = 'form:"type" validate:"required"'];
// 商品价格(分)
int64 price = 4 [(gogoproto.moretags) = 'form:"price" validate:"required"'];
// 开始时间
string start_time = 5 [(gogoproto.moretags) = 'form:"start_time" validate:"required"'];
// 结束时间
string end_time = 6 [(gogoproto.moretags) = 'form:"end_time" validate:"required"'];
// ip限制0不限制1仅限大陆2仅限港澳台3大陆+港澳台
int64 ip_limit = 7 [(gogoproto.moretags) = 'form:"ip_limit"'];
}
message PayGoodsAddResp {
}
message PayGoodsUpdateReq {
// 购票id
int64 id = 1 [(gogoproto.moretags) = 'form:"id"'];
// 平台
string platform = 2 [(gogoproto.moretags) = 'form:"platform"'];
// 商品名称
string title = 3 [(gogoproto.moretags) = 'form:"title"'];
// 商品类型 2 付费直播门票
int64 type = 4 [(gogoproto.moretags) = 'form:"type"'];
// 商品价格(分)
int64 price = 5 [(gogoproto.moretags) = 'form:"price"'];
// 开始时间
string start_time = 6 [(gogoproto.moretags) = 'form:"start_time"'];
// 结束时间
string end_time = 7 [(gogoproto.moretags) = 'form:"end_time"'];
// ip限制0不限制1仅限大陆2仅限港澳台3大陆+港澳台
int64 ip_limit = 8 [(gogoproto.moretags) = 'form:"ip_limit"'];
}
message PayGoodsUpdateResp {
}
message PayGoodsGetListReq {
// 购票id
int64 id = 1 [(gogoproto.moretags) = 'form:"id"'];
// 平台
string platform = 2 [(gogoproto.moretags) = 'form:"platform"'];
// 商品名称
string title = 3 [(gogoproto.moretags) = 'form:"title"'];
// 商品类型 2 付费直播门票
int64 type = 4 [(gogoproto.moretags) = 'form:"type"'];
// ip限制0不限制1仅限大陆2仅限港澳台3大陆+港澳台
int64 ip_limit = 5 [(gogoproto.moretags) = 'form:"ip_limit"'];
// 页号0开始
int64 page_num = 6 [(gogoproto.moretags) = 'form:"page_num"'];
// 每页个数
int64 page_size = 7 [(gogoproto.moretags) = 'form:"page_size"'];
}
message PayGoodsGetListResp {
message PageInfo {
// 记录总数
int64 total_count = 1 [(gogoproto.jsontag) = "total_count"];
// 当前页号
int64 page_num = 2 [(gogoproto.jsontag) = "page_num"];
}
message GoodsInfo {
// 购票id
int64 id = 1 [(gogoproto.jsontag) = "id"];
// 标题
string title = 2 [(gogoproto.jsontag) = "title"];
// 平台
string platform = 3 [(gogoproto.jsontag) = "platform"];
// 类型2为付费直播
int64 type = 4 [(gogoproto.jsontag) = "type"];
// 价格,分
int64 price = 5 [(gogoproto.jsontag) = "price"];
// 开始购票时间
string start_time = 6 [(gogoproto.jsontag) = "start_time"];
// 结束购票时间
string end_time = 7 [(gogoproto.jsontag) = "end_time"];
// ip限制
int64 ip_limit = 8 [(gogoproto.jsontag) = "ip_limit"];
// 购票状态0关闭1购票中2未开始
int64 status = 9 [(gogoproto.jsontag) = "status"];
}
//
PageInfo page_info = 1 [(gogoproto.jsontag) = "page_info"];
//
repeated GoodsInfo goods_info = 2 [(gogoproto.jsontag) = "goods_info"];
}
message PayGoodsCloseReq {
// 购票id
int64 id = 1 [(gogoproto.moretags) = 'form:"id" validate:"required"'];
}
message PayGoodsCloseResp {
}
message PayGoodsOpenReq {
// 购票id
int64 id = 1 [(gogoproto.moretags) = 'form:"id" validate:"required"'];
}
message PayGoodsOpenResp {
}

View File

@@ -0,0 +1,118 @@
// Code generated by protoc-gen-bm v0.1, DO NOT EDIT.
// source: payLive.proto
/*
Package v1 is a generated blademaster stub package.
This code was generated with go-common/app/tool/bmgen/protoc-gen-bm v0.1.
It is generated from these files:
payLive.proto
*/
package v1
import (
"context"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/binding"
)
// to suppressed 'imported but not used warning'
var _ *bm.Context
var _ context.Context
var _ binding.StructValidator
var PathPayLiveAdd = "/live.liveadmin.v1.PayLive/add"
var PathPayLiveUpdate = "/live.liveadmin.v1.PayLive/update"
var PathPayLiveGetList = "/live.liveadmin.v1.PayLive/getList"
var PathPayLiveClose = "/live.liveadmin.v1.PayLive/close"
var PathPayLiveOpen = "/live.liveadmin.v1.PayLive/open"
// =================
// PayLive Interface
// =================
type PayLiveBMServer interface {
// `method:"POST" internal:"true"` 生成付费直播信息
Add(ctx context.Context, req *PayLiveAddReq) (resp *PayLiveAddResp, err error)
// `method:"POST" internal:"true"` 更新付费直播信息
Update(ctx context.Context, req *PayLiveUpdateReq) (resp *PayLiveUpdateResp, err error)
// `internal:"true"` 获取付费直播列表
GetList(ctx context.Context, req *PayLiveGetListReq) (resp *PayLiveGetListResp, err error)
// `method:"POST" internal:"true"` 关闭鉴权
Close(ctx context.Context, req *PayLiveCloseReq) (resp *PayLiveCloseResp, err error)
// `method:"POST" internal:"true"` 开启鉴权
Open(ctx context.Context, req *PayLiveOpenReq) (resp *PayLiveOpenResp, err error)
}
var v1PayLiveSvc PayLiveBMServer
func payLiveAdd(c *bm.Context) {
p := new(PayLiveAddReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1PayLiveSvc.Add(c, p)
c.JSON(resp, err)
}
func payLiveUpdate(c *bm.Context) {
p := new(PayLiveUpdateReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1PayLiveSvc.Update(c, p)
c.JSON(resp, err)
}
func payLiveGetList(c *bm.Context) {
p := new(PayLiveGetListReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1PayLiveSvc.GetList(c, p)
c.JSON(resp, err)
}
func payLiveClose(c *bm.Context) {
p := new(PayLiveCloseReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1PayLiveSvc.Close(c, p)
c.JSON(resp, err)
}
func payLiveOpen(c *bm.Context) {
p := new(PayLiveOpenReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1PayLiveSvc.Open(c, p)
c.JSON(resp, err)
}
// RegisterV1PayLiveService Register the blademaster route with middleware map
// midMap is the middleware map, the key is defined in proto
func RegisterV1PayLiveService(e *bm.Engine, svc PayLiveBMServer, midMap map[string]bm.HandlerFunc) {
v1PayLiveSvc = svc
e.POST("/xlive/internal/live-admin/v1/payLive/add", payLiveAdd)
e.POST("/xlive/internal/live-admin/v1/payLive/update", payLiveUpdate)
e.GET("/xlive/internal/live-admin/v1/payLive/getList", payLiveGetList)
e.POST("/xlive/internal/live-admin/v1/payLive/close", payLiveClose)
e.POST("/xlive/internal/live-admin/v1/payLive/open", payLiveOpen)
}
// RegisterPayLiveBMServer Register the blademaster route
func RegisterPayLiveBMServer(e *bm.Engine, server PayLiveBMServer) {
v1PayLiveSvc = server
e.POST("/live.liveadmin.v1.PayLive/add", payLiveAdd)
e.POST("/live.liveadmin.v1.PayLive/update", payLiveUpdate)
e.GET("/live.liveadmin.v1.PayLive/getList", payLiveGetList)
e.POST("/live.liveadmin.v1.PayLive/close", payLiveClose)
e.POST("/live.liveadmin.v1.PayLive/open", payLiveOpen)
}

View File

@@ -0,0 +1,190 @@
<!-- package=live.liveadmin.v1 -->
- [/xlive/internal/live-admin/v1/payLive/add](#xliveinternallive-adminv1payLiveadd)
- [/xlive/internal/live-admin/v1/payLive/update](#xliveinternallive-adminv1payLiveupdate)
- [/xlive/internal/live-admin/v1/payLive/getList](#xliveinternallive-adminv1payLivegetList)
- [/xlive/internal/live-admin/v1/payLive/close](#xliveinternallive-adminv1payLiveclose)
- [/xlive/internal/live-admin/v1/payLive/open](#xliveinternallive-adminv1payLiveopen)
## /xlive/internal/live-admin/v1/payLive/add
### 无标题
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|platform|否|string| 平台|
|room_id|是|integer| 商品名称|
|title|是|string| 商品名称|
|status|否|integer| 鉴权状态1开0关|
|start_time|是|string| 开始时间|
|end_time|是|string| 结束时间|
|live_end_time|否|string| 正片结束时间|
|live_pic|是|string| 正片保底图|
|ad_pic|是|string| 广告图|
|goods_link|是|string| 购买链接|
|goods_id|是|string| 门票id逗号分隔|
|ip_limit|否|integer| ip限制0不限制1仅限大陆2仅限港澳台3大陆+港澳台|
|buy_goods_id|是|integer| 购买门票id|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
}
}
```
## /xlive/internal/live-admin/v1/payLive/update
### 无标题
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|live_id|是|integer| id|
|platform|否|string| 平台|
|room_id|是|integer| 商品名称|
|title|是|string| 商品名称|
|status|否|integer| 鉴权状态1开0关|
|start_time|是|string| 开始时间|
|end_time|是|string| 结束时间|
|live_end_time|是|string| 正片结束时间|
|live_pic|是|string| 正片保底图|
|ad_pic|是|string| 广告图|
|goods_link|是|string| 购买链接|
|goods_id|是|string| 门票id逗号分隔|
|ip_limit|否|integer| ip限制0不限制1仅限大陆2仅限港澳台3大陆+港澳台|
|buy_goods_id|是|integer| 购买门票id|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
}
}
```
## /xlive/internal/live-admin/v1/payLive/getList
### 无标题
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|room_id|否|integer| 房间id|
|title|否|string| 商品名称|
|ip_limit|否|integer| ip限制|
|page_num|否|integer| 页号0开始|
|page_size|是|integer| 每页个数|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"page_info": {
// 记录总数
"total_count": 0,
// 当前页号
"page_num": 0
},
"goods_info": [
{
// 房间id
"room_id": 0,
// 付费直播id
"live_id": 0,
// 标题
"title": "",
// 平台
"platform": "",
// 生效状态1生效0未生效
"pay_live_status": 0,
// 开始购票时间
"start_time": "",
// 结束购票时间
"end_time": "",
// 正片结束
"live_end_time": "",
// 正片保底图
"live_pic": "",
// 广告图
"ad_pic": "",
// 购票链接
"goods_link": "",
// 购票id
"goods_id": "",
// ip限制
"ip_limit": 0,
// 鉴权状态0关闭1开启
"status": 0,
// 引导购票id
"buy_goods_id": 0
}
]
}
}
```
## /xlive/internal/live-admin/v1/payLive/close
### 无标题
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|live_id|是|integer| 直播id|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
}
}
```
## /xlive/internal/live-admin/v1/payLive/open
### 无标题
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|live_id|是|integer| 直播id|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
}
}
```

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,177 @@
syntax = "proto3";
package live.liveadmin.v1;
option go_package = "v1";
option (gogoproto.goproto_getters_all) = false;
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
service PayLive {
// `method:"POST" internal:"true"` 生成付费直播信息
rpc add (PayLiveAddReq) returns (PayLiveAddResp);
// `method:"POST" internal:"true"` 更新付费直播信息
rpc update (PayLiveUpdateReq) returns (PayLiveUpdateResp);
// `internal:"true"` 获取付费直播列表
rpc getList (PayLiveGetListReq) returns (PayLiveGetListResp);
// `method:"POST" internal:"true"` 关闭鉴权
rpc close (PayLiveCloseReq) returns (PayLiveCloseResp);
// `method:"POST" internal:"true"` 开启鉴权
rpc open (PayLiveOpenReq) returns (PayLiveOpenResp);
}
message PayLiveAddReq {
// 平台
string platform = 1 [(gogoproto.moretags) = 'form:"platform"'];
// 商品名称
int64 room_id = 2 [(gogoproto.moretags) = 'form:"room_id" validate:"required"'];
// 商品名称
string title = 3 [(gogoproto.moretags) = 'form:"title" validate:"required"'];
// 鉴权状态1开0关
int64 status = 4 [(gogoproto.moretags) = 'form:"status"'];
// 开始时间
string start_time = 5 [(gogoproto.moretags) = 'form:"start_time" validate:"required"'];
// 结束时间
string end_time = 6 [(gogoproto.moretags) = 'form:"end_time" validate:"required"'];
// 正片结束时间
string live_end_time = 7 [(gogoproto.moretags) = 'form:"live_end_time"'];
// 正片保底图
string live_pic = 8 [(gogoproto.moretags) = 'form:"live_pic" validate:"required"'];
// 广告图
string ad_pic = 9 [(gogoproto.moretags) = 'form:"ad_pic" validate:"required"'];
// 购买链接
string goods_link = 10 [(gogoproto.moretags) = 'form:"goods_link" validate:"required"'];
// 门票id逗号分隔
string goods_id = 11 [(gogoproto.moretags) = 'form:"goods_id" validate:"required"'];
// ip限制0不限制1仅限大陆2仅限港澳台3大陆+港澳台
int64 ip_limit = 12 [(gogoproto.moretags) = 'form:"ip_limit"'];
// 购买门票id
int64 buy_goods_id = 13 [(gogoproto.moretags) = 'form:"buy_goods_id" validate:"required"'];
}
message PayLiveAddResp {
}
message PayLiveUpdateReq {
// id
int64 live_id = 1 [(gogoproto.moretags) = 'form:"live_id" validate:"required"'];
// 平台
string platform = 2 [(gogoproto.moretags) = 'form:"platform"'];
// 商品名称
int64 room_id = 3 [(gogoproto.moretags) = 'form:"room_id" validate:"required"'];
// 商品名称
string title = 4 [(gogoproto.moretags) = 'form:"title" validate:"required"'];
// 鉴权状态1开0关
int64 status = 5 [(gogoproto.moretags) = 'form:"status"'];
// 开始时间
string start_time = 6 [(gogoproto.moretags) = 'form:"start_time" validate:"required"'];
// 结束时间
string end_time = 7 [(gogoproto.moretags) = 'form:"end_time" validate:"required"'];
// 正片结束时间
string live_end_time = 8 [(gogoproto.moretags) = 'form:"live_end_time" validate:"required"'];
// 正片保底图
string live_pic = 9 [(gogoproto.moretags) = 'form:"live_pic" validate:"required"'];
// 广告图
string ad_pic = 10 [(gogoproto.moretags) = 'form:"ad_pic" validate:"required"'];
// 购买链接
string goods_link = 11 [(gogoproto.moretags) = 'form:"goods_link" validate:"required"'];
// 门票id逗号分隔
string goods_id = 12 [(gogoproto.moretags) = 'form:"goods_id" validate:"required"'];
// ip限制0不限制1仅限大陆2仅限港澳台3大陆+港澳台
int64 ip_limit = 13 [(gogoproto.moretags) = 'form:"ip_limit"'];
// 购买门票id
int64 buy_goods_id = 14 [(gogoproto.moretags) = 'form:"buy_goods_id" validate:"required"'];
}
message PayLiveUpdateResp {
}
message PayLiveGetListReq {
// 房间id
int64 room_id = 1 [(gogoproto.moretags) = 'form:"room_id"'];
// 商品名称
string title = 2 [(gogoproto.moretags) = 'form:"title"'];
// ip限制
int64 ip_limit = 3 [(gogoproto.moretags) = 'form:"ip_limit"'];
// 页号0开始
int64 page_num = 4 [(gogoproto.moretags) = 'form:"page_num"'];
// 每页个数
int64 page_size = 5 [(gogoproto.moretags) = 'form:"page_size" validate:"required"'];
}
message PayLiveGetListResp {
message PageInfo {
// 记录总数
int64 total_count = 1 [(gogoproto.jsontag) = "total_count"];
// 当前页号
int64 page_num = 2 [(gogoproto.jsontag) = "page_num"];
}
message GoodsInfo {
// 房间id
int64 room_id = 1 [(gogoproto.jsontag) = "room_id"];
// 付费直播id
int64 live_id = 2 [(gogoproto.jsontag) = "live_id"];
// 标题
string title = 3 [(gogoproto.jsontag) = "title"];
// 平台
string platform = 4 [(gogoproto.jsontag) = "platform"];
// 生效状态1生效0未生效
int64 pay_live_status = 5 [(gogoproto.jsontag) = "pay_live_status"];
// 开始购票时间
string start_time = 6 [(gogoproto.jsontag) = "start_time"];
// 结束购票时间
string end_time = 7 [(gogoproto.jsontag) = "end_time"];
// 正片结束
string live_end_time = 8 [(gogoproto.jsontag) = "live_end_time"];
// 正片保底图
string live_pic = 9 [(gogoproto.jsontag) = "live_pic"];
// 广告图
string ad_pic = 10 [(gogoproto.jsontag) = "ad_pic"];
// 购票链接
string goods_link = 11 [(gogoproto.jsontag) = "goods_link"];
// 购票id
string goods_id = 12 [(gogoproto.jsontag) = "goods_id"];
// ip限制
int64 ip_limit = 13 [(gogoproto.jsontag) = "ip_limit"];
// 鉴权状态0关闭1开启
int64 status = 14 [(gogoproto.jsontag) = "status"];
// 引导购票id
int64 buy_goods_id = 15 [(gogoproto.jsontag) = "buy_goods_id"];
}
PageInfo page_info = 1 [(gogoproto.jsontag) = "page_info"];
repeated GoodsInfo goods_info = 2 [(gogoproto.jsontag) = "goods_info"];
}
message PayLiveCloseReq {
// 直播id
int64 live_id = 1 [(gogoproto.moretags) = 'form:"live_id" validate:"required"'];
}
message PayLiveCloseResp {
}
message PayLiveOpenReq {
// 直播id
int64 live_id = 1 [(gogoproto.moretags) = 'form:"live_id" validate:"required"'];
}
message PayLiveOpenResp {
}

View File

@@ -0,0 +1,68 @@
<!-- package=live.liveadmin.v1 -->
- [/xlive/internal/live-admin/v1/banner/getBlinkBanner](#xliveinternallive-adminv1bannergetBlinkBanner) 获取有效banner配置
- [/xlive/internal/live-admin/v1/banner/getBanner](#xliveinternallive-adminv1bannergetBanner) 获取有效banner配置
## /xlive/internal/live-admin/v1/banner/getBlinkBanner
###获取有效banner配置
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|platform|是|string||
|build|是|integer||
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"id": 0,
"title": "",
"jumpPath": "",
"jumpTime": 0,
"jumpPathType": 0,
"imageUrl": ""
}
}
```
## /xlive/internal/live-admin/v1/banner/getBanner
###获取有效banner配置
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|platform|是|string||
|build|是|integer||
|type|是|string||
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"list": [
{
"id": 0,
"title": "",
"jumpPath": "",
"jumpTime": 0,
"jumpPathType": 0,
"imageUrl": ""
}
]
}
}
```

View File

@@ -0,0 +1,243 @@
// Code generated by protoc-gen-bm v0.1, DO NOT EDIT.
// source: resource.proto
/*
Package v1 is a generated blademaster stub package.
This code was generated with go-common/app/tool/bmgen/protoc-gen-bm v0.1.
It is generated from these files:
resource.proto
*/
package v1
import (
"context"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/binding"
)
// to suppressed 'imported but not used warning'
var _ *bm.Context
var _ context.Context
var _ binding.StructValidator
var PathResourceAdd = "/live.liveadmin.v1.Resource/add"
var PathResourceAddEx = "/live.liveadmin.v1.Resource/addEx"
var PathResourceEdit = "/live.liveadmin.v1.Resource/edit"
var PathResourceOffline = "/live.liveadmin.v1.Resource/offline"
var PathResourceGetList = "/live.liveadmin.v1.Resource/getList"
var PathResourceGetPlatformList = "/live.liveadmin.v1.Resource/getPlatformList"
var PathResourceGetListEx = "/live.liveadmin.v1.Resource/getListEx"
var PathSplashGetInfo = "/live.liveadmin.v1.Splash/getInfo"
var PathBannerGetBlinkBanner = "/live.liveadmin.v1.Banner/getBlinkBanner"
var PathBannerGetBanner = "/live.liveadmin.v1.Banner/getBanner"
// ==================
// Resource Interface
// ==================
type ResourceBMServer interface {
// Add 添加资源接口
// `method:"POST" internal:"true" `
Add(ctx context.Context, req *AddReq) (resp *AddResp, err error)
// AddEx 添加资源接口(不限制位置和平台)
// `method:"POST" internal:"true" `
AddEx(ctx context.Context, req *AddReq) (resp *AddResp, err error)
// Edit 编辑资源接口
// `method:"POST" internal:"true" `
Edit(ctx context.Context, req *EditReq) (resp *EditResp, err error)
// Offline 下线资源接口
// `method:"POST" internal:"true" `
Offline(ctx context.Context, req *OfflineReq) (resp *OfflineResp, err error)
// GetList 获取资源列表
// `method:"GET" internal:"true" `
GetList(ctx context.Context, req *GetListReq) (resp *GetListResp, err error)
// 获取平台列表
// `method:"GET" internal:"true" `
GetPlatformList(ctx context.Context, req *GetPlatformListReq) (resp *GetPlatformListResp, err error)
// GetListEx 获取资源列表
// `method:"GET" internal:"true" `
GetListEx(ctx context.Context, req *GetListExReq) (resp *GetListExResp, err error)
}
var v1ResourceSvc ResourceBMServer
func resourceAdd(c *bm.Context) {
p := new(AddReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1ResourceSvc.Add(c, p)
c.JSON(resp, err)
}
func resourceAddEx(c *bm.Context) {
p := new(AddReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1ResourceSvc.AddEx(c, p)
c.JSON(resp, err)
}
func resourceEdit(c *bm.Context) {
p := new(EditReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1ResourceSvc.Edit(c, p)
c.JSON(resp, err)
}
func resourceOffline(c *bm.Context) {
p := new(OfflineReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1ResourceSvc.Offline(c, p)
c.JSON(resp, err)
}
func resourceGetList(c *bm.Context) {
p := new(GetListReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1ResourceSvc.GetList(c, p)
c.JSON(resp, err)
}
func resourceGetPlatformList(c *bm.Context) {
p := new(GetPlatformListReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1ResourceSvc.GetPlatformList(c, p)
c.JSON(resp, err)
}
func resourceGetListEx(c *bm.Context) {
p := new(GetListExReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1ResourceSvc.GetListEx(c, p)
c.JSON(resp, err)
}
// RegisterV1ResourceService Register the blademaster route with middleware map
// midMap is the middleware map, the key is defined in proto
func RegisterV1ResourceService(e *bm.Engine, svc ResourceBMServer, midMap map[string]bm.HandlerFunc) {
v1ResourceSvc = svc
e.POST("/xlive/internal/live-admin/v1/resource/add", resourceAdd)
e.POST("/xlive/internal/live-admin/v1/resource/addEx", resourceAddEx)
e.POST("/xlive/internal/live-admin/v1/resource/edit", resourceEdit)
e.POST("/xlive/internal/live-admin/v1/resource/offline", resourceOffline)
e.GET("/xlive/internal/live-admin/v1/resource/getList", resourceGetList)
e.GET("/xlive/internal/live-admin/v1/resource/getPlatformList", resourceGetPlatformList)
e.GET("/xlive/internal/live-admin/v1/resource/getListEx", resourceGetListEx)
}
// RegisterResourceBMServer Register the blademaster route
func RegisterResourceBMServer(e *bm.Engine, server ResourceBMServer) {
v1ResourceSvc = server
e.POST("/live.liveadmin.v1.Resource/add", resourceAdd)
e.POST("/live.liveadmin.v1.Resource/addEx", resourceAddEx)
e.POST("/live.liveadmin.v1.Resource/edit", resourceEdit)
e.POST("/live.liveadmin.v1.Resource/offline", resourceOffline)
e.GET("/live.liveadmin.v1.Resource/getList", resourceGetList)
e.GET("/live.liveadmin.v1.Resource/getPlatformList", resourceGetPlatformList)
e.GET("/live.liveadmin.v1.Resource/getListEx", resourceGetListEx)
}
// ================
// Splash Interface
// ================
type SplashBMServer interface {
// 获取有效闪屏配置
// `method:"GET" internal:"true" `
GetInfo(ctx context.Context, req *GetInfoReq) (resp *GetInfoResp, err error)
}
var v1SplashSvc SplashBMServer
func splashGetInfo(c *bm.Context) {
p := new(GetInfoReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1SplashSvc.GetInfo(c, p)
c.JSON(resp, err)
}
// RegisterV1SplashService Register the blademaster route with middleware map
// midMap is the middleware map, the key is defined in proto
func RegisterV1SplashService(e *bm.Engine, svc SplashBMServer, midMap map[string]bm.HandlerFunc) {
v1SplashSvc = svc
e.GET("/xlive/internal/live-admin/v1/splash/getInfo", splashGetInfo)
}
// RegisterSplashBMServer Register the blademaster route
func RegisterSplashBMServer(e *bm.Engine, server SplashBMServer) {
v1SplashSvc = server
e.GET("/live.liveadmin.v1.Splash/getInfo", splashGetInfo)
}
// ================
// Banner Interface
// ================
type BannerBMServer interface {
// 获取有效banner配置
// `method:"GET" internal:"true" `
GetBlinkBanner(ctx context.Context, req *GetInfoReq) (resp *GetInfoResp, err error)
// 获取有效banner配置
// `method:"GET" internal:"true" `
GetBanner(ctx context.Context, req *GetBannerReq) (resp *GetBannerResp, err error)
}
var v1BannerSvc BannerBMServer
func bannerGetBlinkBanner(c *bm.Context) {
p := new(GetInfoReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1BannerSvc.GetBlinkBanner(c, p)
c.JSON(resp, err)
}
func bannerGetBanner(c *bm.Context) {
p := new(GetBannerReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1BannerSvc.GetBanner(c, p)
c.JSON(resp, err)
}
// RegisterV1BannerService Register the blademaster route with middleware map
// midMap is the middleware map, the key is defined in proto
func RegisterV1BannerService(e *bm.Engine, svc BannerBMServer, midMap map[string]bm.HandlerFunc) {
v1BannerSvc = svc
e.GET("/xlive/internal/live-admin/v1/banner/getBlinkBanner", bannerGetBlinkBanner)
e.GET("/xlive/internal/live-admin/v1/banner/getBanner", bannerGetBanner)
}
// RegisterBannerBMServer Register the blademaster route
func RegisterBannerBMServer(e *bm.Engine, server BannerBMServer) {
v1BannerSvc = server
e.GET("/live.liveadmin.v1.Banner/getBlinkBanner", bannerGetBlinkBanner)
e.GET("/live.liveadmin.v1.Banner/getBanner", bannerGetBanner)
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,202 @@
syntax = "proto3";
package live.liveadmin.v1;
option go_package = "v1";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
// addReq
message AddReq {
string platform = 1 [(gogoproto.moretags) = 'form:"platform" validate:"required"'];
string title = 2 [(gogoproto.moretags) = 'form:"title" validate:"required"'];
string jumpPath = 3 [(gogoproto.moretags) = 'form:"jumpPath"'];
int64 jumpTime = 4 [(gogoproto.moretags) = 'form:"jumpTime"'];
string type = 5 [(gogoproto.moretags) = 'form:"type" validate:"required"'];
string device = 6 [(gogoproto.moretags) = 'form:"device" validate:"required"'];
string startTime = 7 [(gogoproto.moretags) = 'form:"startTime" validate:"required"'];
string endTime = 8 [(gogoproto.moretags) = 'form:"endTime" validate:"required"'];
string imageUrl = 9 [(gogoproto.moretags) = 'form:"imageUrl" validate:"required"'];
int64 jumpPathType = 10 [(gogoproto.moretags) = 'form:"jumpPathType"'];
}
// addResp
message AddResp {
repeated int64 id = 1 [(gogoproto.jsontag) = "id"];
}
// editReq
message EditReq {
string platform = 1 [(gogoproto.moretags) = 'form:"platform" validate:"required"'];
int64 id = 2 [(gogoproto.moretags) = 'form:"id" validate:"required"'];
string title = 3 [(gogoproto.moretags) = 'form:"title"'];
string jumpPath = 4 [(gogoproto.moretags) = 'form:"jumpPath"'];
int64 jumpTime = 5 [(gogoproto.moretags) = 'form:"jumpTime"'];
string startTime = 7 [(gogoproto.moretags) = 'form:"startTime"'];
string endTime = 8 [(gogoproto.moretags) = 'form:"endTime"'];
string imageUrl = 9 [(gogoproto.moretags) = 'form:"imageUrl"'];
int64 jumpPathType = 10 [(gogoproto.moretags) = 'form:"jumpPathType"'];
}
// editResp
message EditResp {
}
//下线闪屏
message OfflineReq {
string platform = 1 [(gogoproto.moretags) = 'form:"platform" validate:"required"'];
int64 id = 2 [(gogoproto.moretags) = 'form:"id" validate:"required"'];
}
message OfflineResp {
}
//获取闪屏配置列表
message GetListReq {
string platform = 1 [(gogoproto.moretags) = 'form:"platform" validate:"required"'];
int64 page = 2 [(gogoproto.moretags) = 'form:"page"'];
int64 pageSize = 3 [(gogoproto.moretags) = 'form:"pageSize"'];
string type = 4 [(gogoproto.moretags) = 'form:"type" validate:"required"'];
}
message GetListResp {
int64 currentPage = 1 [(gogoproto.jsontag) = "currentPage"];
int64 totalCount = 2 [(gogoproto.jsontag) = "totalCount"];
repeated List list = 3 [(gogoproto.jsontag) = "list"];
message List {
int64 id = 1 [(gogoproto.jsontag) = "id"];
string title = 2 [(gogoproto.jsontag) = "title"];
string jumpPath = 3 [(gogoproto.jsontag) = "jumpPath"];
string device_platform = 4 [(gogoproto.jsontag) = "device_platform"];
int64 device_build = 5 [(gogoproto.jsontag) = "device_build"];
string startTime = 6 [(gogoproto.jsontag) = "startTime"];
string endTime = 7 [(gogoproto.jsontag) = "endTime"];
int64 status = 8 [(gogoproto.jsontag) = "status"];
int64 device_limit =9 [(gogoproto.jsontag) = "device_limit"];
string imageUrl = 10 [(gogoproto.jsontag) = "imageUrl"];
int64 jumpPathType = 11 [(gogoproto.jsontag) = "jumpPathType"];
int64 jumpTime = 12 [(gogoproto.jsontag) = "jumpTime"];
}
}
// 获取当前有效闪屏配置(客户端)
message GetInfoReq {
string platform = 1 [(gogoproto.moretags) = 'form:"platform" validate:"required"'];;
int64 build = 2 [(gogoproto.moretags) = 'form:"build" validate:"required"'];;
}
message GetInfoResp {
int64 id = 1 [(gogoproto.jsontag) = "id"];
string title = 2 [(gogoproto.jsontag) = "title"];
string jumpPath = 3 [(gogoproto.jsontag) = "jumpPath"];
int64 jumpTime = 4 [(gogoproto.jsontag) = "jumpTime"];
int64 jumpPathType = 5 [(gogoproto.jsontag) = "jumpPathType"];
string imageUrl = 6 [(gogoproto.jsontag) = "imageUrl"];
}
// 获取当前有效banner配置(客户端)
message GetBlinkBannerReq {
string platform = 1 [(gogoproto.moretags) = 'form:"platform" validate:"required"'];;
int64 build = 2 [(gogoproto.moretags) = 'form:"build" validate:"required"'];;
}
message GetBlinkBannerResp {
int64 id = 1 [(gogoproto.jsontag) = "id"];
string title = 2 [(gogoproto.jsontag) = "title"];
string jumpPath = 3 [(gogoproto.jsontag) = "jumpPath"];
int64 jumpTime = 4 [(gogoproto.jsontag) = "jumpTime"];
int64 jumpPathType = 5 [(gogoproto.jsontag) = "jumpPathType"];
string imageUrl = 6 [(gogoproto.jsontag) = "imageUrl"];
}
// 获取banner配置(客户端)
message GetBannerReq {
string platform = 1 [(gogoproto.moretags) = 'form:"platform" validate:"required"'];;
int64 build = 2 [(gogoproto.moretags) = 'form:"build" validate:"required"'];;
string type = 3 [(gogoproto.moretags) = 'form:"type" validate:"required"'];;
}
message GetBannerResp {
repeated List list = 1 [(gogoproto.jsontag) = "list"];
message List {
int64 id = 1 [(gogoproto.jsontag) = "id"];
string title = 2 [(gogoproto.jsontag) = "title"];
string jumpPath = 3 [(gogoproto.jsontag) = "jumpPath"];
int64 jumpTime = 4 [(gogoproto.jsontag) = "jumpTime"];
int64 jumpPathType = 5 [(gogoproto.jsontag) = "jumpPathType"];
string imageUrl = 6 [(gogoproto.jsontag) = "imageUrl"];
}
}
message GetPlatformListReq {
int64 type=1 [(gogoproto.jsontag) = "type"];
}
message GetPlatformListResp {
repeated string platform =1 [(gogoproto.jsontag) = "platform"];
}
message GetListExReq {
string platform = 1 [(gogoproto.moretags) = 'form:"platform" validate:"required"'];
int64 page = 2 [(gogoproto.moretags) = 'form:"page"'];
int64 pageSize = 3 [(gogoproto.moretags) = 'form:"pageSize"'];
repeated string type = 4 [(gogoproto.moretags) = 'form:"type" validate:"required"'];
string device_platform = 5 [(gogoproto.moretags) = 'form:"device_platform"'];
string status = 6 [(gogoproto.moretags) = 'form:"status"'];
string startTime = 7 [(gogoproto.moretags) = 'form:"startTime"'];
string endTime = 8 [(gogoproto.moretags) = 'form:"endTime"'];
}
message GetListExResp {
int64 currentPage = 1 [(gogoproto.jsontag) = "currentPage"];
int64 totalCount = 2 [(gogoproto.jsontag) = "totalCount"];
repeated List list = 3 [(gogoproto.jsontag) = "list"];
message List {
int64 id = 1 [(gogoproto.jsontag) = "id"];
string title = 2 [(gogoproto.jsontag) = "title"];
string jumpPath = 3 [(gogoproto.jsontag) = "jumpPath"];
string device_platform = 4 [(gogoproto.jsontag) = "device_platform"];
int64 device_build = 5 [(gogoproto.jsontag) = "device_build"];
string startTime = 6 [(gogoproto.jsontag) = "startTime"];
string endTime = 7 [(gogoproto.jsontag) = "endTime"];
int64 status = 8 [(gogoproto.jsontag) = "status"];
int64 device_limit =9 [(gogoproto.jsontag) = "device_limit"];
string imageUrl = 10 [(gogoproto.jsontag) = "imageUrl"];
int64 jumpPathType = 11 [(gogoproto.jsontag) = "jumpPathType"];
int64 jumpTime = 12 [(gogoproto.jsontag) = "jumpTime"];
string type = 13 [(gogoproto.jsontag) = "type"];
}
}
service Resource {
//Add 添加资源接口
// `method:"POST" internal:"true" `
rpc add(AddReq) returns (AddResp);
//AddEx 添加资源接口(不限制位置和平台)
// `method:"POST" internal:"true" `
rpc addEx(AddReq) returns (AddResp);
//Edit 编辑资源接口
// `method:"POST" internal:"true" `
rpc edit(EditReq) returns (EditResp);
//Offline 下线资源接口
// `method:"POST" internal:"true" `
rpc offline(OfflineReq) returns (OfflineResp);
//GetList 获取资源列表
// `method:"GET" internal:"true" `
rpc getList(GetListReq) returns (GetListResp);
//获取平台列表
// `method:"GET" internal:"true" `
rpc getPlatformList(GetPlatformListReq) returns (GetPlatformListResp);
//GetListEx 获取资源列表
// `method:"GET" internal:"true" `
rpc getListEx(GetListExReq) returns (GetListExResp);
}
service Splash {
//获取有效闪屏配置
// `method:"GET" internal:"true" `
rpc getInfo(GetInfoReq) returns (GetInfoResp);
}
service Banner {
//获取有效banner配置
// `method:"GET" internal:"true" `
rpc getBlinkBanner(GetInfoReq) returns (GetInfoResp);
//获取有效banner配置
// `method:"GET" internal:"true" `
rpc getBanner(GetBannerReq) returns (GetBannerResp);
}

View File

@@ -0,0 +1,252 @@
<!-- package=live.liveadmin.v1 -->
- [/xlive/internal/live-admin/v1/resource/add](#xliveinternallive-adminv1resourceadd) Add 添加资源接口
- [/xlive/internal/live-admin/v1/resource/addEx](#xliveinternallive-adminv1resourceaddEx) AddEx 添加资源接口(不限制位置和平台)
- [/xlive/internal/live-admin/v1/resource/edit](#xliveinternallive-adminv1resourceedit) Edit 编辑资源接口
- [/xlive/internal/live-admin/v1/resource/offline](#xliveinternallive-adminv1resourceoffline) Offline 下线资源接口
- [/xlive/internal/live-admin/v1/resource/getList](#xliveinternallive-adminv1resourcegetList) GetList 获取资源列表
- [/xlive/internal/live-admin/v1/resource/getPlatformList](#xliveinternallive-adminv1resourcegetPlatformList) 获取平台列表
- [/xlive/internal/live-admin/v1/resource/getListEx](#xliveinternallive-adminv1resourcegetListEx) GetListEx 获取资源列表
## /xlive/internal/live-admin/v1/resource/add
###Add 添加资源接口
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|platform|是|string||
|title|是|string||
|jumpPath|否|string||
|jumpTime|否|integer||
|type|是|string||
|device|是|string||
|startTime|是|string||
|endTime|是|string||
|imageUrl|是|string||
|jumpPathType|否|integer||
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"id": [
0
]
}
}
```
## /xlive/internal/live-admin/v1/resource/addEx
###AddEx 添加资源接口(不限制位置和平台)
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|platform|是|string||
|title|是|string||
|jumpPath|否|string||
|jumpTime|否|integer||
|type|是|string||
|device|是|string||
|startTime|是|string||
|endTime|是|string||
|imageUrl|是|string||
|jumpPathType|否|integer||
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"id": [
0
]
}
}
```
## /xlive/internal/live-admin/v1/resource/edit
###Edit 编辑资源接口
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|platform|是|string||
|id|是|integer||
|title|否|string||
|jumpPath|否|string||
|jumpTime|否|integer||
|startTime|否|string||
|endTime|否|string||
|imageUrl|否|string||
|jumpPathType|否|integer||
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
}
}
```
## /xlive/internal/live-admin/v1/resource/offline
###Offline 下线资源接口
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|platform|是|string||
|id|是|integer||
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
}
}
```
## /xlive/internal/live-admin/v1/resource/getList
###GetList 获取资源列表
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|platform|是|string||
|page|否|integer||
|pageSize|否|integer||
|type|是|string||
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"currentPage": 0,
"totalCount": 0,
"list": [
{
"id": 0,
"title": "",
"jumpPath": "",
"device_platform": "",
"device_build": 0,
"startTime": "",
"endTime": "",
"status": 0,
"device_limit": 0,
"imageUrl": "",
"jumpPathType": 0,
"jumpTime": 0
}
]
}
}
```
## /xlive/internal/live-admin/v1/resource/getPlatformList
###获取平台列表
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|type|否|integer||
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"platform": [
""
]
}
}
```
## /xlive/internal/live-admin/v1/resource/getListEx
###GetListEx 获取资源列表
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|platform|是|string||
|page|否|integer||
|pageSize|否|integer||
|type|是|多个string||
|device_platform|否|string||
|status|否|string||
|startTime|否|string||
|endTime|否|string||
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"currentPage": 0,
"totalCount": 0,
"list": [
{
"id": 0,
"title": "",
"jumpPath": "",
"device_platform": "",
"device_build": 0,
"startTime": "",
"endTime": "",
"status": 0,
"device_limit": 0,
"imageUrl": "",
"jumpPathType": 0,
"jumpTime": 0,
"type": ""
}
]
}
}
```

View File

@@ -0,0 +1,32 @@
<!-- package=live.liveadmin.v1 -->
- [/xlive/internal/live-admin/v1/splash/getInfo](#xliveinternallive-adminv1splashgetInfo) 获取有效闪屏配置
## /xlive/internal/live-admin/v1/splash/getInfo
###获取有效闪屏配置
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|platform|是|string||
|build|是|integer||
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"id": 0,
"title": "",
"jumpPath": "",
"jumpTime": 0,
"jumpPathType": 0,
"imageUrl": ""
}
}
```

View File

@@ -0,0 +1,59 @@
// Code generated by protoc-gen-bm v0.1, DO NOT EDIT.
// source: room.proto
/*
Package v1 is a generated blademaster stub package.
This code was generated with go-common/app/tool/bmgen/protoc-gen-bm v0.1.
It is generated from these files:
room.proto
*/
package v1
import (
"context"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/binding"
)
// to suppressed 'imported but not used warning'
var _ *bm.Context
var _ context.Context
var _ binding.StructValidator
var PathRoomMngGetSecondVerifyListWithPics = "/live.liveadmin.v1.roomMng/getSecondVerifyListWithPics"
// =================
// RoomMng Interface
// =================
type RoomMngBMServer interface {
// 获取带有图片地址的二次审核列表
// `method:"GET" internal:"true" `
GetSecondVerifyListWithPics(ctx context.Context, req *RoomMngGetSecondVerifyListReq) (resp *RoomMngGetSecondVerifyListResp, err error)
}
var v1RoomMngSvc RoomMngBMServer
func roomMngGetSecondVerifyListWithPics(c *bm.Context) {
p := new(RoomMngGetSecondVerifyListReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1RoomMngSvc.GetSecondVerifyListWithPics(c, p)
c.JSON(resp, err)
}
// RegisterV1RoomMngService Register the blademaster route with middleware map
// midMap is the middleware map, the key is defined in proto
func RegisterV1RoomMngService(e *bm.Engine, svc RoomMngBMServer, midMap map[string]bm.HandlerFunc) {
v1RoomMngSvc = svc
e.GET("/xlive/internal/live-admin/v1/roomMng/getSecondVerifyListWithPics", roomMngGetSecondVerifyListWithPics)
}
// RegisterRoomMngBMServer Register the blademaster route
func RegisterRoomMngBMServer(e *bm.Engine, server RoomMngBMServer) {
v1RoomMngSvc = server
e.GET("/live.liveadmin.v1.roomMng/getSecondVerifyListWithPics", roomMngGetSecondVerifyListWithPics)
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,64 @@
syntax = "proto3";
package live.liveadmin.v1;
option go_package = "v1";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
message RoomMngGetSecondVerifyListReq {
// 房间id
int64 room_id = 1 [(gogoproto.moretags) = 'form:"room_id"'];
// 分区id多个
string area = 2 [(gogoproto.moretags) = 'form:"area"'];
// 页数
int64 page = 3 [(gogoproto.moretags) = 'form:"page" validate:"required"'];
// 页码
int64 pagesize = 4 [(gogoproto.moretags) = 'form:"pagesize"'];
// 业务0直播监控1直播鉴黄2房间举报
string biz = 5 [(gogoproto.moretags) = 'form:"biz"'];
}
message RoomMngGetSecondVerifyListResp {
message Result {
// 日志id
int64 id = 1 [(gogoproto.jsontag) = "id"];
// 当天切断记录
int64 recent_cut_times = 2 [(gogoproto.jsontag) = "recent_cut_times"];
// 当天警告记录
int64 recent_warn_times = 3 [(gogoproto.jsontag) = "recent_warn_times"];
// 用户名
string uname = 4 [(gogoproto.jsontag) = "uname"];
// 房间号
int64 room_id = 5 [(gogoproto.jsontag) = "room_id"];
// 主播id
int64 uid = 6 [(gogoproto.jsontag) = "uid"];
// 房间标题
string title = 7 [(gogoproto.jsontag) = "title"];
// 分区名
string area_v2_name = 8 [(gogoproto.jsontag) = "area_v2_name"];
// 粉丝数
int64 fc = 9 [(gogoproto.jsontag) = "fc"];
// 警告理由
string warn_reason = 10 [(gogoproto.jsontag) = "warn_reason"];
// 图片列表
repeated string pics = 11 [(gogoproto.jsontag) = "pics"];
// 警告时间
string break_time = 12 [(gogoproto.jsontag) = "break_time"];
// 共计警告时间
int64 warn_times = 13 [(gogoproto.jsontag) = "warn_times"];
}
//
repeated Result result = 1 [(gogoproto.jsontag) = "result"];
// 总数
int64 count = 2 [(gogoproto.jsontag) = "count"];
// 页码
int64 page = 3 [(gogoproto.jsontag) = "page"];
// 分页大小
int64 pagesize = 4 [(gogoproto.jsontag) = "pagesize"];
}
service roomMng{
// 获取带有图片地址的二次审核列表
// `method:"GET" internal:"true" `
rpc getSecondVerifyListWithPics(RoomMngGetSecondVerifyListReq) returns(RoomMngGetSecondVerifyListResp);
}

View File

@@ -0,0 +1,67 @@
<!-- package=live.liveadmin.v1 -->
- [/xlive/internal/live-admin/v1/roomMng/getSecondVerifyListWithPics](#xliveinternallive-adminv1roomMnggetSecondVerifyListWithPics) 获取带有图片地址的二次审核列表
## /xlive/internal/live-admin/v1/roomMng/getSecondVerifyListWithPics
### 获取带有图片地址的二次审核列表
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|room_id|否|integer| 房间id|
|area|否|string| 分区id多个|
|page|是|integer| 页数|
|pagesize|否|integer| 页码|
|biz|否|string| 业务0直播监控1直播鉴黄2房间举报|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"result": [
{
// 日志id
"id": 0,
// 当天切断记录
"recent_cut_times": 0,
// 当天警告记录
"recent_warn_times": 0,
// 用户名
"uname": "",
// 房间号
"room_id": 0,
// 主播id
"uid": 0,
// 房间标题
"title": "",
// 分区名
"area_v2_name": "",
// 粉丝数
"fc": 0,
// 警告理由
"warn_reason": "",
// 图片列表
"pics": [
""
],
// 警告时间
"break_time": "",
// 共计警告时间
"warn_times": 0
}
],
// 总数
"count": 0,
// 页码
"page": 0,
// 分页大小
"pagesize": 0
}
}
```

View File

@@ -0,0 +1,96 @@
// Code generated by protoc-gen-bm v0.1, DO NOT EDIT.
// source: upload.proto
/*
Package v1 is a generated blademaster stub package.
This code was generated with go-common/app/tool/bmgen/protoc-gen-bm v0.1.
It is generated from these files:
upload.proto
*/
package v1
import (
"context"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/binding"
)
// to suppressed 'imported but not used warning'
var _ *bm.Context
var _ context.Context
var _ binding.StructValidator
var PathTokenNew = "/live.liveadmin.v1.Token/new"
var PathUploadFile = "/live.liveadmin.v1.Upload/file"
// ===============
// Token Interface
// ===============
type TokenBMServer interface {
// Request for a token for upload.
// `method:"POST" internal:"true"`
New(ctx context.Context, req *NewTokenReq) (resp *NewTokenResp, err error)
}
var v1TokenSvc TokenBMServer
func tokenNew(c *bm.Context) {
p := new(NewTokenReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1TokenSvc.New(c, p)
c.JSON(resp, err)
}
// RegisterV1TokenService Register the blademaster route with middleware map
// midMap is the middleware map, the key is defined in proto
func RegisterV1TokenService(e *bm.Engine, svc TokenBMServer, midMap map[string]bm.HandlerFunc) {
v1TokenSvc = svc
e.POST("/xlive/internal/live-admin/v1/token/new", tokenNew)
}
// RegisterTokenBMServer Register the blademaster route
func RegisterTokenBMServer(e *bm.Engine, server TokenBMServer) {
v1TokenSvc = server
e.POST("/live.liveadmin.v1.Token/new", tokenNew)
}
// ================
// Upload Interface
// ================
type UploadBMServer interface {
// `method:"POST" content-type:"multipart/form-data" midware:"cors,guest"`
File(ctx context.Context, req *UploadFileReq) (resp *UploadFileResp, err error)
}
var v1UploadSvc UploadBMServer
func uploadFile(c *bm.Context) {
p := new(UploadFileReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v1UploadSvc.File(c, p)
c.JSON(resp, err)
}
// RegisterV1UploadService Register the blademaster route with middleware map
// midMap is the middleware map, the key is defined in proto
func RegisterV1UploadService(e *bm.Engine, svc UploadBMServer, midMap map[string]bm.HandlerFunc) {
cors := midMap["cors"]
guest := midMap["guest"]
v1UploadSvc = svc
e.POST("/xlive/live-admin/v1/upload/file", cors, guest, uploadFile)
}
// RegisterUploadBMServer Register the blademaster route
func RegisterUploadBMServer(e *bm.Engine, server UploadBMServer) {
v1UploadSvc = server
e.POST("/live.liveadmin.v1.Upload/file", uploadFile)
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,70 @@
syntax = "proto3";
package live.liveadmin.v1;
option go_package = "v1";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
service Token {
// Request for a token for upload.
// `method:"POST" internal:"true"`
rpc new (NewTokenReq) returns (NewTokenResp);
}
service Upload {
// `method:"POST" content-type:"multipart/form-data" midware:"cors,guest"`
rpc file (UploadFileReq) returns (UploadFileResp);
}
message NewTokenReq {
// 上传到 BFS 的 bucket
string bucket = 1 [(gogoproto.moretags) = 'form:"bucket" validate:"required"'];
// 上传到指定的 BFS 目录(可以用来区分业务)
string dir = 2 [(gogoproto.moretags) = 'form:"dir"'];
// 操作人mlive通过dashboard授权获取到的操作人
string operator = 3 [(gogoproto.moretags) = 'form:"operator" validate:"required"'];
}
message NewTokenResp {
// 授予的 token
string token = 1 [(gogoproto.jsontag) = "token"];
}
// The file/data part must use Request.FormFile() to retrieve manually.
message UploadFileReq {
// 上传到 BFS 的 bucket
string bucket = 1 [(gogoproto.moretags) = 'form:"bucket" validate:"required"'];
// 上传到指定的 BFS 目录(可以用来区分业务)
string dir = 2 [(gogoproto.moretags) = 'form:"dir"'];
// 上传的到bfs的文件名存储在bfs的文件名不传bfs会根据文件的sha1值生成并返回
string filename = 3 [(gogoproto.moretags) = 'form:"file_name"'];
// 上传的文件的类型(不指定时会自动检测文件类型)
string contentType = 4 [(gogoproto.moretags) = 'form:"content_type"'];
// 图片水印key添加图片水印需要上传该参数, 新业务需要提前向bfs申请
string wmKey = 5 [(gogoproto.moretags) = 'form:"wm_key"'];
// 文字水印限制不超过20个字符
string wmText = 6 [(gogoproto.moretags) = 'form:"wm_text"'];
// 水印位置右下角 到原图右下角 水平距离默认10px
uint32 wmPaddingX = 7 [(gogoproto.moretags) = 'form:"wm_padding_x"'];
// 水印位置右下角 到原图右下角 垂直距离默认10px
uint32 wmPaddingY = 8 [(gogoproto.moretags) = 'form:"wm_padding_y"'];
// 水印宽度占原图高度的比例(0,1) (只支持按照宽度压缩),默认值: 0.035
double wmScale = 9 [(gogoproto.moretags) = 'form:"wm_scale"'];
// 上传 Token通过 obtainToken 接口获取
string token = 10 [(gogoproto.moretags) = 'form:"token" validate:"required"'];
}
message UploadFileResp {
string url = 1 [(gogoproto.jsontag) = "url"];
}

View File

@@ -0,0 +1,29 @@
<!-- package=live.liveadmin.v1 -->
- [/xlive/internal/live-admin/v1/token/new](#xliveinternallive-adminv1tokennew) Request for a token for upload.
## /xlive/internal/live-admin/v1/token/new
### Request for a token for upload.
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|bucket|是|string| 上传到 BFS 的 bucket|
|dir|否|string| 上传到指定的 BFS 目录(可以用来区分业务)|
|operator|是|string| 操作人mlive通过dashboard授权获取到的操作人|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
// 授予的 token
"token": ""
}
}
```

View File

@@ -0,0 +1,35 @@
<!-- package=live.liveadmin.v1 -->
- [/xlive/live-admin/v1/upload/file](#xlivelive-adminv1uploadfile)
## /xlive/live-admin/v1/upload/file
### 无标题
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|bucket|是|string| 上传到 BFS 的 bucket|
|dir|否|string| 上传到指定的 BFS 目录(可以用来区分业务)|
|filename|否|string| 上传的到bfs的文件名存储在bfs的文件名不传bfs会根据文件的sha1值生成并返回|
|contentType|否|string| 上传的文件的类型(不指定时会自动检测文件类型)|
|wmKey|否|string| 图片水印key添加图片水印需要上传该参数, 新业务需要提前向bfs申请|
|wmText|否|string| 文字水印限制不超过20个字符|
|wmPaddingX|否|integer| 水印位置右下角 到原图右下角 水平距离默认10px|
|wmPaddingY|否|integer| 水印位置右下角 到原图右下角 垂直距离默认10px|
|wmScale|否|float| 水印宽度占原图高度的比例(0,1) (只支持按照宽度压缩),默认值: 0.035|
|token|是|string| 上传 Token通过 obtainToken 接口获取|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"url": ""
}
}
```

View File

@@ -0,0 +1,56 @@
load(
"@io_bazel_rules_go//proto:def.bzl",
"go_proto_library",
)
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
proto_library(
name = "v2_proto",
srcs = ["user_resource.proto"],
tags = ["automanaged"],
deps = ["@gogo_special_proto//github.com/gogo/protobuf/gogoproto"],
)
go_proto_library(
name = "v2_go_proto",
compilers = ["@io_bazel_rules_go//proto:gogofast_grpc"],
importpath = "go-common/app/admin/live/live-admin/api/http/v2",
proto = ":v2_proto",
tags = ["automanaged"],
deps = ["@com_github_gogo_protobuf//gogoproto:go_default_library"],
)
go_library(
name = "go_default_library",
srcs = ["user_resource.bm.go"],
embed = [":v2_go_proto"],
importpath = "go-common/app/admin/live/live-admin/api/http/v2",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//library/net/http/blademaster:go_default_library",
"//library/net/http/blademaster/binding:go_default_library",
"@com_github_gogo_protobuf//gogoproto:go_default_library",
"@com_github_gogo_protobuf//proto:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,123 @@
// Code generated by protoc-gen-bm v0.1, DO NOT EDIT.
// source: user_resource.proto
/*
Package v2 is a generated blademaster stub package.
This code was generated with go-common/app/tool/bmgen/protoc-gen-bm v0.1.
It is generated from these files:
user_resource.proto
*/
package v2
import (
"context"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/binding"
)
// to suppressed 'imported but not used warning'
var _ *bm.Context
var _ context.Context
var _ binding.StructValidator
var PathUserResourceAdd = "/live.liveadmin.v2.UserResource/add"
var PathUserResourceEdit = "/live.liveadmin.v2.UserResource/edit"
var PathUserResourceGet = "/live.liveadmin.v2.UserResource/get"
var PathUserResourceSetStatus = "/live.liveadmin.v2.UserResource/setStatus"
var PathUserResourceGetSingle = "/live.liveadmin.v2.UserResource/getSingle"
// ======================
// UserResource Interface
// ======================
type UserResourceBMServer interface {
// Add 添加资源接口
// `method:"POST" internal:"true" `
Add(ctx context.Context, req *UserResourceAddReq) (resp *UserResourceAddResp, err error)
// Edit 编辑现有资源
// `method:"POST" internal:"true" `
Edit(ctx context.Context, req *UserResourceEditReq) (resp *UserResourceEditResp, err error)
// List 获取资源列表
// `method:"GET" internal:"true" `
Get(ctx context.Context, req *UserResourceListReq) (resp *UserResourceListResp, err error)
// SetStatus 更改资源状态
// `method:"POST" internal:"true" `
SetStatus(ctx context.Context, req *UserResourceSetStatusReq) (resp *UserResourceSetStatusResp, err error)
// Query 请求单个资源
// `method:"GET" internal:"true" `
GetSingle(ctx context.Context, req *UserResourceGetSingleReq) (resp *UserResourceGetSingleResp, err error)
}
var v2UserResourceSvc UserResourceBMServer
func userResourceAdd(c *bm.Context) {
p := new(UserResourceAddReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v2UserResourceSvc.Add(c, p)
c.JSON(resp, err)
}
func userResourceEdit(c *bm.Context) {
p := new(UserResourceEditReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v2UserResourceSvc.Edit(c, p)
c.JSON(resp, err)
}
func userResourceGet(c *bm.Context) {
p := new(UserResourceListReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v2UserResourceSvc.Get(c, p)
c.JSON(resp, err)
}
func userResourceSetStatus(c *bm.Context) {
p := new(UserResourceSetStatusReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v2UserResourceSvc.SetStatus(c, p)
c.JSON(resp, err)
}
func userResourceGetSingle(c *bm.Context) {
p := new(UserResourceGetSingleReq)
if err := c.BindWith(p, binding.Default(c.Request.Method, c.Request.Header.Get("Content-Type"))); err != nil {
return
}
resp, err := v2UserResourceSvc.GetSingle(c, p)
c.JSON(resp, err)
}
// RegisterV2UserResourceService Register the blademaster route with middleware map
// midMap is the middleware map, the key is defined in proto
func RegisterV2UserResourceService(e *bm.Engine, svc UserResourceBMServer, midMap map[string]bm.HandlerFunc) {
v2UserResourceSvc = svc
e.POST("/xlive/internal/live-admin/v2/userResource/add", userResourceAdd)
e.POST("/xlive/internal/live-admin/v2/userResource/edit", userResourceEdit)
e.GET("/xlive/internal/live-admin/v2/userResource/get", userResourceGet)
e.POST("/xlive/internal/live-admin/v2/userResource/setStatus", userResourceSetStatus)
e.GET("/xlive/internal/live-admin/v2/userResource/getSingle", userResourceGetSingle)
}
// RegisterUserResourceBMServer Register the blademaster route
func RegisterUserResourceBMServer(e *bm.Engine, server UserResourceBMServer) {
v2UserResourceSvc = server
e.POST("/live.liveadmin.v2.UserResource/add", userResourceAdd)
e.POST("/live.liveadmin.v2.UserResource/edit", userResourceEdit)
e.GET("/live.liveadmin.v2.UserResource/get", userResourceGet)
e.POST("/live.liveadmin.v2.UserResource/setStatus", userResourceSetStatus)
e.GET("/live.liveadmin.v2.UserResource/getSingle", userResourceGetSingle)
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,153 @@
syntax = "proto3";
package live.liveadmin.v2;
option go_package = "v2";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
// 请求创建资源
message UserResourceAddReq {
//资源类型
int32 res_type = 1 [(gogoproto.moretags) = 'form:"res_type" validate:"required"'];
//名称
string title = 2 [(gogoproto.moretags) = 'form:"title" validate:"required"'];
//URL
string url = 3 [(gogoproto.moretags) = 'form:"url" validate:"required"'];
//权重
int32 weight = 4 [(gogoproto.moretags) = 'form:"weight" validate:"required"'];
//创建人
string creator = 5 [(gogoproto.moretags) = 'form:"creator" validate:"required"'];
}
// 返回创建结果
message UserResourceAddResp {
//ID
int32 id = 1 [(gogoproto.jsontag) = "id"];
//资源ID
int32 custom_id = 3 [(gogoproto.jsontag) = "custom_id"];
}
// 请求编辑资源
message UserResourceEditReq {
//资源类型
int32 res_type = 1 [(gogoproto.moretags) = 'form:"res_type" validate:"required"'];
//资源ID
int32 custom_id = 2 [(gogoproto.moretags) = 'form:"custom_id" validate:"required"'];
//名称
string title = 3 [(gogoproto.moretags) = 'form:"title"'];
//URL
string url = 4 [(gogoproto.moretags) = 'form:"url"'];
//权重
int32 weight = 5 [(gogoproto.moretags) = 'form:"weight"'];
}
// 返回编辑结果
message UserResourceEditResp {
}
// 请求资源列表
message UserResourceListReq {
//资源类型
int32 res_type = 1 [(gogoproto.moretags) = 'form:"res_type" validate:"required"'];
//页码
int32 page = 2 [(gogoproto.moretags) = 'form:"page"'];
//每页数据量
int32 page_size = 3 [(gogoproto.moretags) = 'form:"page_size"'];
}
// 返回资源列表
message UserResourceListResp {
int32 currentPage = 1 [(gogoproto.jsontag) = "currentPage"];
int32 totalCount = 2 [(gogoproto.jsontag) = "totalCount"];
repeated List list = 3 [(gogoproto.jsontag) = "list"];
message List {
//ID
int32 id = 1 [(gogoproto.jsontag) = "id"];
//资源类型
int32 res_type = 2 [(gogoproto.jsontag) = "res_type"];
//资源ID
int32 custom_id = 3 [(gogoproto.jsontag) = "custom_id"];
//名称
string title = 4 [(gogoproto.jsontag) = "title"];
//URL
string url = 5 [(gogoproto.jsontag) = "url"];
//权重
int32 weight = 6 [(gogoproto.jsontag) = "weight"];
//创建人
string creator = 7 [(gogoproto.jsontag) = "creator"];
//"状态1.上线中2.下线"
int32 status = 8 [(gogoproto.jsontag) = "status"];
//创建时刻
string ctime = 9 [(gogoproto.jsontag) = "ctime"];
//修改时刻
string mtime = 10 [(gogoproto.jsontag) = "mtime"];
}
}
// 请求变更资源状态
message UserResourceSetStatusReq {
//资源类型
int32 res_type = 1 [(gogoproto.moretags) = 'form:"res_type" validate:"required"'];
//页码
int32 custom_id = 2 [(gogoproto.moretags) = 'form:"custom_id" validate:"required"'];
//每页数据量
int32 status = 3 [(gogoproto.moretags) = 'form:"status" validate:"required"'];
}
// 返回变更结果
message UserResourceSetStatusResp {
}
// 请求单个资源
message UserResourceGetSingleReq {
//资源类型
int32 res_type = 1 [(gogoproto.moretags) = 'form:"res_type" validate:"required"'];
//资源ID
int32 custom_id = 2 [(gogoproto.moretags) = 'form:"custom_id" validate:"required"'];
}
// 返回单个资源
message UserResourceGetSingleResp {
//ID
int32 id = 1 [(gogoproto.jsontag) = "id"];
//资源类型
int32 res_type = 2 [(gogoproto.jsontag) = "res_type"];
//资源ID
int32 custom_id = 3 [(gogoproto.jsontag) = "custom_id"];
//名称
string title = 4 [(gogoproto.jsontag) = "title"];
//URL
string url = 5 [(gogoproto.jsontag) = "url"];
//权重
int32 weight = 6 [(gogoproto.jsontag) = "weight"];
//创建人
string creator = 7 [(gogoproto.jsontag) = "creator"];
//"状态1.上线中2.下线"
int32 status = 8 [(gogoproto.jsontag) = "status"];
//创建时刻
string ctime = 9 [(gogoproto.jsontag) = "ctime"];
//修改时刻
string mtime = 10 [(gogoproto.jsontag) = "mtime"];
}
service UserResource {
//Add 添加资源接口
// `method:"POST" internal:"true" `
rpc add(UserResourceAddReq) returns (UserResourceAddResp);
//Edit 编辑现有资源
// `method:"POST" internal:"true" `
rpc edit(UserResourceEditReq) returns (UserResourceEditResp);
//List 获取资源列表
// `method:"GET" internal:"true" `
rpc get(UserResourceListReq) returns (UserResourceListResp);
//SetStatus 更改资源状态
// `method:"POST" internal:"true" `
rpc setStatus(UserResourceSetStatusReq) returns (UserResourceSetStatusResp);
//Query 请求单个资源
// `method:"GET" internal:"true" `
rpc getSingle(UserResourceGetSingleReq) returns (UserResourceGetSingleResp);
}

View File

@@ -0,0 +1,184 @@
<!-- package=live.liveadmin.v2 -->
- [/xlive/internal/live-admin/v2/userResource/add](#xliveinternallive-adminv2userResourceadd) Add 添加资源接口
- [/xlive/internal/live-admin/v2/userResource/edit](#xliveinternallive-adminv2userResourceedit) Edit 编辑现有资源
- [/xlive/internal/live-admin/v2/userResource/get](#xliveinternallive-adminv2userResourceget) List 获取资源列表
- [/xlive/internal/live-admin/v2/userResource/setStatus](#xliveinternallive-adminv2userResourcesetStatus) SetStatus 更改资源状态
- [/xlive/internal/live-admin/v2/userResource/getSingle](#xliveinternallive-adminv2userResourcegetSingle) Query 请求单个资源
## /xlive/internal/live-admin/v2/userResource/add
###Add 添加资源接口
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|res_type|是|integer|资源类型|
|title|是|string|名称|
|url|是|string|URL|
|weight|是|integer|权重|
|creator|是|string|创建人|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
// ID
"id": 0,
// 资源ID
"custom_id": 0
}
}
```
## /xlive/internal/live-admin/v2/userResource/edit
###Edit 编辑现有资源
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|res_type|是|integer|资源类型|
|custom_id|是|integer|资源ID|
|title|否|string|名称|
|url|否|string|URL|
|weight|否|integer|权重|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
}
}
```
## /xlive/internal/live-admin/v2/userResource/get
###List 获取资源列表
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|res_type|是|integer|资源类型|
|page|否|integer|页码|
|page_size|否|integer|每页数据量|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
"currentPage": 0,
"totalCount": 0,
"list": [
{
// ID
"id": 0,
// 资源类型
"res_type": 0,
// 资源ID
"custom_id": 0,
// 名称
"title": "",
// URL
"url": "",
// 权重
"weight": 0,
// 创建人
"creator": "",
// "状态1.上线中2.下线"
"status": 0,
// 创建时刻
"ctime": "",
// 修改时刻
"mtime": ""
}
]
}
}
```
## /xlive/internal/live-admin/v2/userResource/setStatus
###SetStatus 更改资源状态
#### 方法POST
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|res_type|是|integer|资源类型|
|custom_id|是|integer|页码|
|status|是|integer|每页数据量|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
}
}
```
## /xlive/internal/live-admin/v2/userResource/getSingle
###Query 请求单个资源
#### 方法GET
#### 请求参数
|参数名|必选|类型|描述|
|:---|:---|:---|:---|
|res_type|是|integer|资源类型|
|custom_id|是|integer|资源ID|
#### 响应
```javascript
{
"code": 0,
"message": "ok",
"data": {
// ID
"id": 0,
// 资源类型
"res_type": 0,
// 资源ID
"custom_id": 0,
// 名称
"title": "",
// URL
"url": "",
// 权重
"weight": 0,
// 创建人
"creator": "",
// "状态1.上线中2.下线"
"status": 0,
// 创建时刻
"ctime": "",
// 修改时刻
"mtime": ""
}
}
```

View File

@@ -0,0 +1,44 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_binary",
"go_library",
)
go_binary(
name = "cmd",
embed = [":go_default_library"],
tags = ["automanaged"],
)
go_library(
name = "go_default_library",
srcs = ["main.go"],
data = ["test.toml"],
importpath = "go-common/app/admin/live/live-admin/cmd",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/live/live-admin/conf:go_default_library",
"//app/admin/live/live-admin/server/http:go_default_library",
"//app/admin/live/live-admin/service:go_default_library",
"//library/ecode/tip:go_default_library",
"//library/log:go_default_library",
"//library/net/trace:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,47 @@
package main
import (
"flag"
"os"
"os/signal"
"syscall"
"time"
"go-common/app/admin/live/live-admin/conf"
"go-common/app/admin/live/live-admin/server/http"
"go-common/app/admin/live/live-admin/service"
ecode "go-common/library/ecode/tip"
"go-common/library/log"
"go-common/library/net/trace"
)
func main() {
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
log.Init(conf.Conf.Log)
defer log.Close()
log.Info("live-admin-admin start")
trace.Init(conf.Conf.Tracer)
defer trace.Close()
ecode.Init(conf.Conf.Ecode)
svc := service.New(conf.Conf)
http.Init(conf.Conf, svc)
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT)
for {
s := <-c
log.Info("get a signal %s", s.String())
switch s {
case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT:
svc.Close()
log.Info("live-admin-admin exit")
time.Sleep(time.Second)
return
case syscall.SIGHUP:
default:
return
}
}
}

View File

@@ -0,0 +1,22 @@
[log]
stdout = true
[liverpc]
[liverpc.av]
Addr = "127.0.0.1:20218"
[redis]
name = "live-admin"
proto = "tcp"
addr = "172.18.33.171:6379"
idle = 10
active = 10
dialTimeout = "1s"
readTimeout = "1s"
writeTimeout = "1s"
idleTimeout = "10s"
expire = "1m"
[Bucket.slive]
key = "0dahgnv96o7byxsq"
secret = "x5efzuih903pdytakrol1cvng86jq2"
private = true

View File

@@ -0,0 +1,43 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["conf.go"],
importpath = "go-common/app/admin/live/live-admin/conf",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//library/cache/memcache:go_default_library",
"//library/cache/redis:go_default_library",
"//library/conf:go_default_library",
"//library/database/sql:go_default_library",
"//library/ecode/tip:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/http/blademaster/middleware/auth:go_default_library",
"//library/net/http/blademaster/middleware/verify:go_default_library",
"//library/net/rpc/liverpc:go_default_library",
"//library/net/rpc/warden:go_default_library",
"//library/net/trace:go_default_library",
"//vendor/github.com/BurntSushi/toml:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,105 @@
package conf
import (
"errors"
"flag"
"go-common/library/net/http/blademaster/middleware/auth"
"go-common/library/cache/memcache"
"go-common/library/cache/redis"
"go-common/library/conf"
"go-common/library/database/sql"
ecode "go-common/library/ecode/tip"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/middleware/verify"
"go-common/library/net/rpc/liverpc"
"go-common/library/net/rpc/warden"
"go-common/library/net/trace"
"github.com/BurntSushi/toml"
)
var (
confPath string
client *conf.Client
// Conf config
Conf = &Config{}
)
type BucketConf struct {
Key string
Secret string
Private bool
}
// Config .
type Config struct {
Log *log.Config
BM *bm.ServerConfig
Verify *verify.Config
Tracer *trace.Config
Redis *redis.Config
Memcache *memcache.Config
MySQL *sql.Config
Ecode *ecode.Config
ResourceClient *warden.ClientConfig
CapsuleClient *warden.ClientConfig
RoomMngClient *liverpc.ClientConfig
StreamMngClient *warden.ClientConfig
LiveRpc map[string]*liverpc.ClientConfig
ResourceClientV2 *warden.ClientConfig
Auth *auth.Config
Bucket map[string]*BucketConf
}
func init() {
flag.StringVar(&confPath, "conf", "", "default config path")
}
// Init init conf
func Init() error {
if confPath != "" {
return local()
}
return remote()
}
func local() (err error) {
_, err = toml.DecodeFile(confPath, &Conf)
return
}
func remote() (err error) {
if client, err = conf.New(); err != nil {
return
}
if err = load(); err != nil {
return
}
go func() {
for range client.Event() {
log.Info("config reload")
if load() != nil {
log.Error("config reload error (%v)", err)
}
}
}()
return
}
func load() (err error) {
var (
s string
ok bool
tmpConf *Config
)
if s, ok = client.Toml2(); !ok {
return errors.New("load config center error")
}
if _, err = toml.Decode(s, &tmpConf); err != nil {
return errors.New("could not decode config")
}
*Conf = *tmpConf
return
}

View File

@@ -0,0 +1,40 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"api.go",
"dao.go",
"token.go",
],
importpath = "go-common/app/admin/live/live-admin/dao",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/live/live-admin/conf:go_default_library",
"//app/service/live/av/api/liverpc:go_default_library",
"//app/service/live/relation/api/liverpc:go_default_library",
"//library/cache/redis:go_default_library",
"//library/log:go_default_library",
"//library/net/rpc/liverpc:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,23 @@
package dao
import (
"go-common/app/admin/live/live-admin/conf"
avApi "go-common/app/service/live/av/api/liverpc"
"go-common/library/net/rpc/liverpc"
)
// AvApi liveRpc room-service api
var AvApi *avApi.Client
// InitAPI init all service APIs
func InitAPI() {
AvApi = avApi.New(getConf("av"))
}
func getConf(appName string) *liverpc.ClientConfig {
c := conf.Conf.LiveRpc
if c != nil {
return c[appName]
}
return nil
}

View File

@@ -0,0 +1,54 @@
package dao
import (
"context"
"go-common/library/cache/redis"
"go-common/library/log"
"go-common/app/admin/live/live-admin/conf"
relationApi "go-common/app/service/live/relation/api/liverpc"
)
// Dao dao
type Dao struct {
c *conf.Config
// mc *memcache.Pool
redis *redis.Pool
// db *xsql.DB
Relation *relationApi.Client
}
// New init mysql db
func New(c *conf.Config) (dao *Dao) {
dao = &Dao{
c: c,
// mc: memcache.NewPool(c.Memcache),
redis: redis.NewPool(c.Redis),
// db: xsql.NewMySQL(c.MySQL),
Relation: relationApi.New(getConf("relation")),
}
return
}
// Close close the resource.
func (d *Dao) Close() {
// d.mc.Close()
d.redis.Close()
// d.db.Close()
}
// Ping dao ping
func (d *Dao) Ping(ctx context.Context) (err error) {
if err = d.pingRedis(ctx); err != nil {
log.Error("Failed to ping redis: %v", err)
}
return
}
func (d *Dao) pingRedis(ctx context.Context) (err error) {
conn := d.redis.Get(ctx)
_, err = conn.Do("SET", "PING", "PONG")
conn.Close()
return
}

View File

@@ -0,0 +1,58 @@
package dao
import (
"context"
"crypto/sha1"
"encoding/hex"
"fmt"
"go-common/library/cache/redis"
"go-common/library/log"
)
const (
_defaultExpiration = 10
_tokenNamespace = "upload_token:"
)
// RequestUploadToken generates a token for subsequent upload.
// Token will expire in a specific duration.
func (d *Dao) RequestUploadToken(ctx context.Context, bucket, operator string, now int64) (token string, err error) {
token = genToken(bucket, operator, now)
conn := d.redis.Get(ctx)
defer conn.Close()
nsToken := namespaceToken(token)
if _, err = conn.Do("SETEX", nsToken, _defaultExpiration, "1"); err != nil {
log.Error("conn.Do(SETEX %s %d) failure(%v)", nsToken, _defaultExpiration, err)
}
return
}
// VerifyUploadToken verifies if a token is legal.
func (d *Dao) VerifyUploadToken(ctx context.Context, token string) bool {
conn := d.redis.Get(ctx)
defer conn.Close()
nsToken := namespaceToken(token)
valid, err := redis.Bool(conn.Do("GET", nsToken))
if err != nil && err != redis.ErrNil {
log.Warn("conn.Do(GET %s) failure(%v)", nsToken, err)
return false
}
return valid
}
func genToken(bucket, operator string, now int64) string {
sha := sha1.New()
sha.Write([]byte(fmt.Sprintf("i love bilibili:%s:%s:%d", bucket, operator, now)))
return fmt.Sprintf("%s:%d", hex.EncodeToString(sha.Sum([]byte(""))), now)
}
// Avoid key collision.
func namespaceToken(token string) string {
return _tokenNamespace + token
}

View File

@@ -0,0 +1,32 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"model.go",
"upload.go",
],
importpath = "go-common/app/admin/live/live-admin/model",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = ["//library/database/bfs:go_default_library"],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1 @@
package model

View File

@@ -0,0 +1,26 @@
package model
import "go-common/library/database/bfs"
const (
_defaultPaddingX = 10
_defaultPaddingY = 10
_defaultScale = 0.035
)
// TweakWatermark makes some attributes of watermark default if they are not legal.
func TweakWatermark(req *bfs.Request) {
if req.WMKey != "" || req.WMText != "" {
if req.WMPaddingX == 0 {
req.WMPaddingX = _defaultPaddingX
}
if req.WMPaddingY == 0 {
req.WMPaddingY = _defaultPaddingY
}
if req.WMScale <= 0 || req.WMScale >= 1 {
req.WMScale = _defaultScale
}
}
}

View File

@@ -0,0 +1,41 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["http.go"],
importpath = "go-common/app/admin/live/live-admin/server/http",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/live/live-admin/api/http/v1:go_default_library",
"//app/admin/live/live-admin/api/http/v2:go_default_library",
"//app/admin/live/live-admin/conf:go_default_library",
"//app/admin/live/live-admin/dao:go_default_library",
"//app/admin/live/live-admin/service:go_default_library",
"//app/admin/live/live-admin/service/v1:go_default_library",
"//app/admin/live/live-admin/service/v2:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/http/blademaster/middleware/auth:go_default_library",
"//library/net/http/blademaster/middleware/verify:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,77 @@
package http
import (
"go-common/app/admin/live/live-admin/dao"
"go-common/library/net/http/blademaster/middleware/auth"
"net/http"
v1API "go-common/app/admin/live/live-admin/api/http/v1"
v2API "go-common/app/admin/live/live-admin/api/http/v2"
"go-common/app/admin/live/live-admin/conf"
"go-common/app/admin/live/live-admin/service"
v1Service "go-common/app/admin/live/live-admin/service/v1"
v2Service "go-common/app/admin/live/live-admin/service/v2"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/middleware/verify"
)
var (
vfy *verify.Verify
svc *service.Service
midAuth *auth.Auth
d *dao.Dao
)
// Init init
func Init(c *conf.Config, s *service.Service) {
svc = s
dao.InitAPI()
d = dao.New(c)
vfy = verify.New(c.Verify)
midAuth = auth.New(c.Auth)
engine := bm.DefaultServer(c.BM)
route(engine)
if err := engine.Start(); err != nil {
log.Error("bm Start error(%v)", err)
panic(err)
}
}
func route(e *bm.Engine) {
e.Ping(ping)
e.Register(register)
g := e.Group("/x/live-admin")
{
g.GET("/start", vfy.Verify, howToStart)
}
midMap := map[string]bm.HandlerFunc{
"guest": midAuth.Guest,
"cors": bm.CORS(),
}
v1API.RegisterV1ResourceService(e, v1Service.NewResourceService(conf.Conf), midMap)
v1API.RegisterV1CapsuleService(e, v1Service.NewCapsuleService(conf.Conf), midMap)
v1API.RegisterV1GaeaService(e, v1Service.NewGaeaService(conf.Conf), midMap)
v1API.RegisterV1RoomMngService(e, v1Service.NewRoomMngService(conf.Conf), midMap)
v2API.RegisterV2UserResourceService(e, v2Service.NewUserResourceService(conf.Conf), midMap)
v1API.RegisterV1PayGoodsService(e, v1Service.NewPayGoodsService(conf.Conf), midMap)
v1API.RegisterV1PayLiveService(e, v1Service.NewPayLiveService(conf.Conf), midMap)
v1API.RegisterV1TokenService(e, v1Service.NewTokenService(conf.Conf, d), midMap)
v1API.RegisterV1UploadService(e, v1Service.NewUploadService(conf.Conf, d), midMap)
}
func ping(ctx *bm.Context) {
if err := svc.Ping(ctx); err != nil {
log.Error("ping error(%v)", err)
ctx.AbortWithStatus(http.StatusServiceUnavailable)
}
}
func register(c *bm.Context) {
c.JSON(map[string]interface{}{}, nil)
}
// example for http request handler
func howToStart(c *bm.Context) {
c.String(0, "Golang 大法好 !!!")
}

View File

@@ -0,0 +1,36 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["service.go"],
importpath = "go-common/app/admin/live/live-admin/service",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/live/live-admin/conf:go_default_library",
"//app/admin/live/live-admin/dao:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [
":package-srcs",
"//app/admin/live/live-admin/service/v1:all-srcs",
"//app/admin/live/live-admin/service/v2:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,33 @@
package service
import (
"context"
"go-common/app/admin/live/live-admin/conf"
"go-common/app/admin/live/live-admin/dao"
)
// Service struct
type Service struct {
c *conf.Config
dao *dao.Dao
}
// New init
func New(c *conf.Config) (s *Service) {
s = &Service{
c: c,
dao: dao.New(c),
}
return s
}
// Ping Service
func (s *Service) Ping(ctx context.Context) (err error) {
return s.dao.Ping(ctx)
}
// Close Service
func (s *Service) Close() {
s.dao.Close()
}

View File

@@ -0,0 +1,72 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
"go_test",
)
go_library(
name = "go_default_library",
srcs = [
"banner.go",
"capsule.go",
"gaea.go",
"payGoods.go",
"payLive.go",
"resource.go",
"roomMng.go",
"splash.go",
"token.go",
"upload.go",
],
importpath = "go-common/app/admin/live/live-admin/service/v1",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/live/live-admin/api/http/v1:go_default_library",
"//app/admin/live/live-admin/conf:go_default_library",
"//app/admin/live/live-admin/dao:go_default_library",
"//app/admin/live/live-admin/model:go_default_library",
"//app/service/live/av/api/liverpc/v0:go_default_library",
"//app/service/live/relation/api/liverpc/v1:go_default_library",
"//app/service/live/resource/api/grpc/v1:go_default_library",
"//app/service/live/room/api/liverpc:go_default_library",
"//app/service/live/room/api/liverpc/v1:go_default_library",
"//app/service/live/xlottery/api/grpc/v1:go_default_library",
"//app/service/video/stream-mng/api/v1:go_default_library",
"//library/database/bfs:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/sync/errgroup:go_default_library",
"@org_golang_google_grpc//status:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
go_test(
name = "go_default_test",
srcs = ["token_test.go"],
embed = [":go_default_library"],
tags = ["automanaged"],
deps = [
"//app/admin/live/live-admin/api/http/v1:go_default_library",
"//app/admin/live/live-admin/conf:go_default_library",
"//app/admin/live/live-admin/dao:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)

View File

@@ -0,0 +1,38 @@
package v1
import (
"context"
v1pb "go-common/app/admin/live/live-admin/api/http/v1"
"go-common/app/admin/live/live-admin/conf"
)
// BannerService struct
type BannerService struct {
conf *conf.Config
// optionally add other properties here, such as dao
// dao *dao.Dao
}
//NewBannerService init
func NewBannerService(c *conf.Config) (s *BannerService) {
s = &BannerService{
conf: c,
}
return s
}
// GetBlinkBanner implementation
// 获取有效banner配置
// `method:"GET" internal:"true" `
func (s *BannerService) GetBlinkBanner(ctx context.Context, req *v1pb.GetInfoReq) (resp *v1pb.GetInfoResp, err error) {
resp = &v1pb.GetInfoResp{}
return
}
// GetBanner implementation
// 获取有效banner配置
// `method:"GET" internal:"true" `
func (s *BannerService) GetBanner(ctx context.Context, req *v1pb.GetBannerReq) (resp *v1pb.GetBannerResp, err error) {
resp = &v1pb.GetBannerResp{}
return
}

View File

@@ -0,0 +1,547 @@
package v1
import (
"context"
"encoding/json"
"go-common/library/ecode"
"regexp"
"strconv"
"strings"
"time"
"google.golang.org/grpc/status"
v1pb "go-common/app/admin/live/live-admin/api/http/v1"
"go-common/app/admin/live/live-admin/conf"
rspb "go-common/app/service/live/xlottery/api/grpc/v1"
"go-common/library/log"
)
// CapsuleService struct
type CapsuleService struct {
conf *conf.Config
// optionally add other properties here, such as dao
// dao *dao.Dao
capsuleCli *rspb.Client
}
//NewCapsuleService init
func NewCapsuleService(c *conf.Config) (s *CapsuleService) {
s = &CapsuleService{
conf: c,
}
var svc *rspb.Client
var err error
log.Info("CapsuleService Init: %+v", s.conf.CapsuleClient)
if svc, err = rspb.NewClient(s.conf.CapsuleClient); err != nil {
panic(err)
}
s.capsuleCli = svc
return s
}
// GetCoinList implementation
func (s *CapsuleService) GetCoinList(ctx context.Context, req *v1pb.GetCoinListReqAdmin) (resp *v1pb.GetCoinListRespAdmin, err error) {
var RPCResponse *rspb.GetCoinListResp
RPCReq := &rspb.GetCoinListReq{
Page: req.Page,
PageSize: req.PageSize,
}
if RPCReq.Page < 1 {
RPCReq.Page = 1
}
if RPCReq.PageSize < 1 {
RPCReq.PageSize = 16
}
RPCResponse, err = s.capsuleCli.GetCoinList(ctx, RPCReq)
if err != nil {
return
}
coinListResp := make([]*v1pb.GetCoinListRespAdmin_List, 0)
for _, singleCoinList := range RPCResponse.List {
coinList := &v1pb.GetCoinListRespAdmin_List{}
coinList.Id = singleCoinList.Id
coinList.Status = singleCoinList.Status
coinList.Title = singleCoinList.Title
coinList.GiftConfig = singleCoinList.GiftConfig
coinList.GiftType = singleCoinList.GiftType
coinList.ChangeNum = singleCoinList.ChangeNum
startTimeUnix := time.Unix(singleCoinList.StartTime, 0)
coinList.StartTime = startTimeUnix.Format("2006-01-02 15:04:05")
endTimeUnix := time.Unix(singleCoinList.EndTime, 0)
coinList.EndTime = endTimeUnix.Format("2006-01-02 15:04:05")
areaIds := make([]*v1pb.GetCoinListRespAdmin_List_AreaIds, 0)
for _, areaId := range singleCoinList.AreaIds {
singleAreaId := &v1pb.GetCoinListRespAdmin_List_AreaIds{}
singleAreaId.IsAll = areaId.IsAll
singleAreaId.List = areaId.List
singleAreaId.ParentId = areaId.ParentId
areaIds = append(areaIds, singleAreaId)
}
coinList.AreaIds = areaIds
coinListResp = append(coinListResp, coinList)
}
resp = &v1pb.GetCoinListRespAdmin{
Total: RPCResponse.Total,
TotalPage: RPCResponse.TotalPage,
List: coinListResp,
}
return
}
// UpdateCoinConfig implementation
func (s *CapsuleService) UpdateCoinConfig(ctx context.Context, req *v1pb.UpdateCoinConfigReqAdmin) (resp *v1pb.UpdateCoinConfigRespAdmin, err error) {
var RPCResponse *rspb.UpdateCoinConfigResp
loc, _ := time.LoadLocation("Local")
var endTime, startTime time.Time
startTime, err = time.ParseInLocation("2006-01-02 15:04:05", req.StartTime, loc)
if err != nil {
err = ecode.Error(ecode.InvalidParam, "参数错误")
return nil, err
}
endTime, err = time.ParseInLocation("2006-01-02 15:04:05", req.EndTime, loc)
if err != nil {
err = ecode.Error(ecode.InvalidParam, "参数错误")
return nil, err
}
var areaIds []*rspb.UpdateCoinConfigReq_AreaIds
err = json.Unmarshal([]byte(req.AreaIds), &areaIds)
if err != nil {
err = ecode.Error(ecode.InvalidParam, "参数错误")
return nil, err
}
if len(areaIds) == 0 {
err = ecode.Error(ecode.InvalidParam, "参数错误")
return nil, err
}
var isHasArea bool
for _, areaInfo := range areaIds {
if areaInfo.IsAll == 1 {
isHasArea = true
break
}
if len(areaInfo.List) > 0 {
isHasArea = true
break
}
}
if !isHasArea {
err = ecode.Error(ecode.XLotteryCapsuleAreaParamErr, "必须设置生效分区")
return nil, err
}
var giftIds = make([]int64, 0)
if req.GiftType == 3 {
if req.GiftConfig == "" {
err = ecode.Error(ecode.InvalidParam, "参数错误")
return nil, err
}
giftConfig := strings.Split(req.GiftConfig, ",")
for _, giftStr := range giftConfig {
var giftId int64
giftId, err = strconv.ParseInt(giftStr, 10, 64)
if err != nil {
err = ecode.Error(ecode.InvalidParam, "参数错误")
return nil, err
}
giftIds = append(giftIds, giftId)
}
if len(giftIds) == 0 {
err = ecode.Error(ecode.InvalidParam, "参数错误")
return nil, err
}
match, _ := regexp.Compile("^([0-9]+,)*[0-9]+$")
if !match.MatchString(req.GiftConfig) {
err = ecode.Error(ecode.InvalidParam, "参数错误")
return nil, err
}
}
RPCReq := &rspb.UpdateCoinConfigReq{
Id: req.Id,
Title: req.Title,
ChangeNum: req.ChangeNum,
StartTime: startTime.Unix(),
EndTime: endTime.Unix(),
Status: req.Status,
GiftType: req.GiftType,
GiftIds: giftIds,
AreaIds: areaIds,
}
RPCResponse, err = s.capsuleCli.UpdateCoinConfig(ctx, RPCReq)
if err != nil {
return
}
resp = &v1pb.UpdateCoinConfigRespAdmin{
Status: RPCResponse.Status,
}
return
}
// UpdateCoinStatus implementation
func (s *CapsuleService) UpdateCoinStatus(ctx context.Context, req *v1pb.UpdateCoinStatusReqAdmin) (resp *v1pb.UpdateCoinStatusRespAdmin, err error) {
var RPCResponse *rspb.UpdateCoinStatusResp
RPCReq := &rspb.UpdateCoinStatusReq{
Id: req.Id,
Status: req.Status,
}
if RPCReq.Status != 1 {
RPCReq.Status = 0
}
RPCResponse, err = s.capsuleCli.UpdateCoinStatus(ctx, RPCReq)
if err != nil {
return
}
resp = &v1pb.UpdateCoinStatusRespAdmin{
Status: RPCResponse.Status,
}
return
}
// DeleteCoin implementation
func (s *CapsuleService) DeleteCoin(ctx context.Context, req *v1pb.DeleteCoinReqAdmin) (resp *v1pb.DeleteCoinRespAdmin, err error) {
var RPCResponse *rspb.DeleteCoinResp
RPCReq := &rspb.DeleteCoinReq{
Id: req.Id,
}
RPCResponse, err = s.capsuleCli.DeleteCoin(ctx, RPCReq)
if err != nil {
return
}
resp = &v1pb.DeleteCoinRespAdmin{
Status: RPCResponse.Status,
}
return
}
// GetPoolList implementation
// `internal:"true"`
func (s *CapsuleService) GetPoolList(ctx context.Context, req *v1pb.GetPoolListReqAdmin) (resp *v1pb.GetPoolListRespAdmin, err error) {
var RPCResponse *rspb.GetPoolListResp
RPCReq := &rspb.GetPoolListReq{
Page: req.Page,
PageSize: req.PageSize,
}
if RPCReq.Page < 1 {
RPCReq.Page = 1
}
if RPCReq.PageSize < 1 {
RPCReq.PageSize = 16
}
RPCResponse, err = s.capsuleCli.GetPoolList(ctx, RPCReq)
if err != nil {
return
}
poolList := make([]*v1pb.GetPoolListRespAdmin_List, 0)
for _, singleList := range RPCResponse.List {
poolInfo := &v1pb.GetPoolListRespAdmin_List{}
poolInfo.Id = singleList.Id
startTimeUnix := time.Unix(singleList.StartTime, 0)
poolInfo.StartTime = startTimeUnix.Format("2006-01-02 15:04:05")
endTimeUnix := time.Unix(singleList.EndTime, 0)
poolInfo.EndTime = endTimeUnix.Format("2006-01-02 15:04:05")
poolInfo.Title = singleList.Title
poolInfo.CoinTitle = singleList.CoinTitle
poolInfo.Status = singleList.Status
poolInfo.Rule = singleList.Rule
poolInfo.CoinId = singleList.CoinId
poolList = append(poolList, poolInfo)
}
resp = &v1pb.GetPoolListRespAdmin{
Total: RPCResponse.Total,
TotalPage: RPCResponse.TotalPage,
List: poolList,
}
return
}
// UpdatePool implementation
// `method:"POST" internal:"true"`
func (s *CapsuleService) UpdatePool(ctx context.Context, req *v1pb.UpdatePoolReqAdmin) (resp *v1pb.UpdatePoolRespAdmin, err error) {
var RPCResponse *rspb.UpdatePoolResp
loc, _ := time.LoadLocation("Local")
startTime, err := time.ParseInLocation("2006-01-02 15:04:05", req.StartTime, loc)
if err != nil {
err = ecode.Error(ecode.InvalidParam, "参数错误")
return nil, err
}
endTime, err := time.ParseInLocation("2006-01-02 15:04:05", req.EndTime, loc)
if err != nil {
err = ecode.Error(ecode.InvalidParam, "参数错误")
return nil, err
}
RPCReq := &rspb.UpdatePoolReq{
Id: req.Id,
CoinId: req.CoinId,
Title: req.Title,
StartTime: startTime.Unix(),
EndTime: endTime.Unix(),
Rule: req.Rule,
}
RPCResponse, err = s.capsuleCli.UpdatePool(ctx, RPCReq)
if err != nil {
return
}
resp = &v1pb.UpdatePoolRespAdmin{
Status: RPCResponse.Status,
}
return
}
// DeletePool implementation
func (s *CapsuleService) DeletePool(ctx context.Context, req *v1pb.DeletePoolReqAdmin) (resp *v1pb.DeletePoolRespAdmin, err error) {
var RPCResponse *rspb.DeletePoolResp
RPCReq := &rspb.DeletePoolReq{
Id: req.Id,
}
RPCResponse, err = s.capsuleCli.DeletePool(ctx, RPCReq)
if err != nil {
return
}
resp = &v1pb.DeletePoolRespAdmin{
Status: RPCResponse.Status,
}
return
}
// UpdatePoolStatus implementation
func (s *CapsuleService) UpdatePoolStatus(ctx context.Context, req *v1pb.UpdatePoolStatusReqAdmin) (resp *v1pb.UpdatePoolStatusRespAdmin, err error) {
resp = &v1pb.UpdatePoolStatusRespAdmin{}
data, err := s.capsuleCli.UpdatePoolStatus(ctx, &rspb.UpdatePoolStatusReq{Id: req.Id, Status: req.Status})
if err != nil {
return
}
resp.Status = data.Status
return
}
// GetPoolPrize implementation
// `internal:"true"`
func (s *CapsuleService) GetPoolPrize(ctx context.Context, req *v1pb.GetPoolPrizeReqAdmin) (resp *v1pb.GetPoolPrizeRespAdmin, err error) {
var RPCResponse *rspb.GetPoolPrizeResp
RPCReq := &rspb.GetPoolPrizeReq{
PoolId: req.PoolId,
}
RPCResponse, err = s.capsuleCli.GetPoolPrize(ctx, RPCReq)
if err != nil {
return
}
list := make([]*v1pb.GetPoolPrizeRespAdmin_List, 0)
for _, poolDetail := range RPCResponse.List {
singleDetail := &v1pb.GetPoolPrizeRespAdmin_List{}
singleDetail.Id = poolDetail.Id
singleDetail.Limit = poolDetail.Limit
singleDetail.Loop = poolDetail.Loop
singleDetail.Chance = poolDetail.Chance
singleDetail.ProType = poolDetail.ProType
singleDetail.JumpUrl = poolDetail.JumpUrl
singleDetail.Description = poolDetail.Description
singleDetail.MobileUrl = poolDetail.MobileUrl
singleDetail.WebUrl = poolDetail.WebUrl
singleDetail.Num = poolDetail.Num
singleDetail.Type = poolDetail.Type
singleDetail.ObjectId = poolDetail.ObjectId
singleDetail.Expire = poolDetail.Expire
singleDetail.PoolId = poolDetail.PoolId
singleDetail.Name = poolDetail.Name
singleDetail.Weight = poolDetail.Weight
singleDetail.WhiteUids = ""
wlen := len(poolDetail.WhiteUids)
if wlen > 0 {
wUids := make([]string, wlen)
for ix, uid := range poolDetail.WhiteUids {
wUids[ix] = strconv.FormatInt(uid, 10)
}
singleDetail.WhiteUids = strings.Join(wUids, ",")
}
list = append(list, singleDetail)
}
resp = &v1pb.GetPoolPrizeRespAdmin{
List: list,
}
return
}
// UpdatePoolPrize implementation
// `method:"POST" internal:"true"`
func (s *CapsuleService) UpdatePoolPrize(ctx context.Context, req *v1pb.UpdatePoolPrizeReqAdmin) (resp *v1pb.UpdatePoolPrizeRespAdmin, err error) {
chance, err := strconv.ParseFloat(req.Chance, 64)
if err != nil || chance > 1 {
err = ecode.Error(ecode.InvalidParam, "参数错误")
return
}
chance = chance*10000 + 0.5
whiteUids := make([]int64, 0)
if req.ProType == 1 {
if chance < 1 {
err = ecode.Error(ecode.InvalidParam, "参数错误")
return
}
req.Loop = 0
req.Limit = 0
} else if req.ProType == 2 {
chance = 0
if req.Loop < 1 || req.Limit < 1 {
err = ecode.Error(ecode.InvalidParam, "参数错误")
return
}
} else if req.ProType == 3 {
chance = 0
if req.Loop < 1 || req.Limit < 1 {
err = ecode.Error(ecode.InvalidParam, "参数错误")
return
}
} else if req.ProType == 4 {
chance = 0
req.Loop = 0
req.Limit = 0
if req.WhiteUids == "" {
err = ecode.Error(ecode.InvalidParam, "参数错误")
return
}
wUids := strings.Split(req.WhiteUids, ",")
for _, uidStr := range wUids {
var uid int64
uid, err = strconv.ParseInt(uidStr, 10, 64)
if err != nil {
err = ecode.Error(ecode.InvalidParam, "参数错误")
return nil, err
}
whiteUids = append(whiteUids, uid)
}
wlen := len(whiteUids)
if wlen == 0 || wlen > 1000 {
err = ecode.Error(ecode.InvalidParam, "参数错误")
return nil, err
}
} else {
err = ecode.Error(ecode.InvalidParam, "参数错误")
return
}
var RPCResponse *rspb.UpdatePoolPrizeResp
RPCReq := &rspb.UpdatePoolPrizeReq{
Id: req.Id,
PoolId: req.PoolId,
Type: req.Type,
Num: req.Num,
ObjectId: req.ObjectId,
Expire: req.Expire,
WebUrl: req.WebUrl,
MobileUrl: req.MobileUrl,
Description: req.Description,
JumpUrl: req.JumpUrl,
ProType: req.ProType,
Chance: int64(chance),
Loop: req.Loop,
Limit: req.Limit,
Weight: req.Weight,
WhiteUids: whiteUids,
}
RPCResponse, err = s.capsuleCli.UpdatePoolPrize(ctx, RPCReq)
if err != nil {
return
}
resp = &v1pb.UpdatePoolPrizeRespAdmin{
Status: RPCResponse.Status,
PrizeId: RPCResponse.PrizeId,
}
return
}
// DeletePoolPrize implementation
// `method:"POST" internal:"true" `
func (s *CapsuleService) DeletePoolPrize(ctx context.Context, req *v1pb.DeletePoolPrizeReqAdmin) (resp *v1pb.DeletePoolPrizeRespAdmin, err error) {
var RPCResponse *rspb.DeletePoolPrizeResp
RPCReq := &rspb.DeletePoolPrizeReq{
Id: req.Id,
}
RPCResponse, err = s.capsuleCli.DeletePoolPrize(ctx, RPCReq)
if err != nil {
return
}
resp = &v1pb.DeletePoolPrizeRespAdmin{
Status: RPCResponse.Status,
}
return
}
// GetPrizeType implementation
// `internal:"true"`
func (s *CapsuleService) GetPrizeType(ctx context.Context, req *v1pb.GetPrizeTypeReq) (resp *v1pb.GetPrizeTypeResp, err error) {
resp = &v1pb.GetPrizeTypeResp{}
prizeType, err := s.capsuleCli.GetPrizeType(ctx, &rspb.GetPrizeTypeReq{})
if err != nil || prizeType == nil {
return
}
resp.List = make([]*v1pb.GetPrizeTypeResp_List, len(prizeType.List))
for ix, data := range prizeType.List {
resp.List[ix] = &v1pb.GetPrizeTypeResp_List{Type: data.Type, Name: data.Name}
}
return
}
// GetPrizeExpire implementation
// `internal:"true"`
func (s *CapsuleService) GetPrizeExpire(ctx context.Context, req *v1pb.GetPrizeExpireReq) (resp *v1pb.GetPrizeExpireResp, err error) {
resp = &v1pb.GetPrizeExpireResp{}
prizeExpire, err := s.capsuleCli.GetPrizeExpire(ctx, &rspb.GetPrizeExpireReq{})
if err != nil || prizeExpire == nil {
return
}
resp.List = make([]*v1pb.GetPrizeExpireResp_List, len(prizeExpire.List))
for ix, data := range prizeExpire.List {
resp.List[ix] = &v1pb.GetPrizeExpireResp_List{Expire: data.Expire, Name: data.Name}
}
return
}
// FormatErr format error msg
func (s *CapsuleService) FormatErr(statusCode *status.Status) (code int32, msg string) {
gCode := statusCode.Code()
code = 1
if gCode == 2 {
code, _ := strconv.Atoi(statusCode.Message())
switch code {
case -400:
msg = "参数错误"
case -401:
msg = "上线失败概率设置不为1"
case -402:
msg = "保底奖池的上下线时间不可修改"
case -403:
msg = "保底奖池不可下线"
case -404:
msg = "普通扭蛋币不可更改道具类型"
case -500:
msg = "内部错误"
default:
msg = "内部错误"
}
} else {
msg = "内部错误"
}
return
}
// GetCouponList implementation
// `internal:"true"`
func (s *CapsuleService) GetCouponList(ctx context.Context, req *v1pb.CapsuleGetCouponListReq) (resp *v1pb.CapsuleGetCouponListResp, err error) {
resp = &v1pb.CapsuleGetCouponListResp{}
couponList, err := s.capsuleCli.GetCouponList(ctx, &rspb.CapsuleGetCouponListReq{Uid: req.Uid})
if err != nil || couponList == nil {
return
}
resp.List = make([]*v1pb.CapsuleGetCouponListResp_List, len(couponList.List))
for ix, conpon := range couponList.List {
resp.List[ix] = &v1pb.CapsuleGetCouponListResp_List{}
resp.List[ix].Uid = req.Uid
resp.List[ix].Status = conpon.Status
resp.List[ix].AwardTime = conpon.AwardTime
resp.List[ix].RetryTime = conpon.RetryTime
resp.List[ix].AwardName = conpon.AwardName
resp.List[ix].AwardCode = conpon.AwardCode
}
return
}

View File

@@ -0,0 +1,158 @@
package v1
import (
"context"
"strconv"
"google.golang.org/grpc/status"
v1pb "go-common/app/admin/live/live-admin/api/http/v1"
"go-common/app/admin/live/live-admin/conf"
client "go-common/app/service/live/resource/api/grpc/v1"
"go-common/library/ecode"
)
// GaeaService struct
type GaeaService struct {
conf *conf.Config
client *client.Client
// optionally add other properties here, such as dao
// dao *dao.Dao
}
//NewGaeaService init
func NewGaeaService(c *conf.Config) (s *GaeaService) {
s = &GaeaService{
conf: c,
}
s.client, _ = client.NewClient(c.ResourceClient)
return s
}
// GetConfigByKeyword implementation
// 获取team下某个keyword的配置 `internal:"true"`
func (s *GaeaService) GetConfigByKeyword(ctx context.Context, req *v1pb.GetConfigReq) (resp *v1pb.GetConfigResp, err error) {
resp = &v1pb.GetConfigResp{}
if "" == req.GetKeyword() || 0 == req.GetTeam() {
err = ecode.Error(1, "参数错误")
return
}
ret, err := s.client.GetConfigByKeyword(ctx, &client.GetConfigReq{
Team: req.GetTeam(),
Keyword: req.GetKeyword(),
})
if err != nil {
return
}
resp.Team = ret.Team
resp.Keyword = ret.Keyword
resp.Name = ret.Name
resp.Value = ret.Value
resp.Ctime = ret.Ctime
resp.Mtime = ret.Mtime
resp.Status = ret.Status
resp.Id = ret.Id
return
}
// SetConfigByKeyword implementation
// 设置team下某个keyword配置 `internal:"true"`
func (s *GaeaService) SetConfigByKeyword(ctx context.Context, req *v1pb.SetConfigReq) (resp *v1pb.SetConfigResp, err error) {
resp = &v1pb.SetConfigResp{}
if "" == req.GetKeyword() || len(req.GetKeyword()) > 16 {
err = ecode.Error(1, "参数错误")
return
}
ret, err := s.client.SetConfigByKeyword(ctx, &client.SetConfigReq{
Team: req.GetTeam(),
Keyword: req.GetKeyword(),
Value: req.GetValue(),
Name: req.GetName(),
Id: req.GetId(),
Status: req.GetStatus(),
})
if err != nil {
return
}
resp.Id = ret.Id
return
}
// GetConfigsByParams implementation
// 管理后台根据条件获取配置 `internal:"true"`
func (s *GaeaService) GetConfigsByParams(ctx context.Context, req *v1pb.ParamsConfigReq) (resp *v1pb.ParamsConfigResp, err error) {
resp = &v1pb.ParamsConfigResp{}
clientResp, err := s.client.GetConfigsByParams(ctx, &client.ParamsConfigReq{
Team: req.GetTeam(),
Keyword: req.GetKeyword(),
Name: req.GetName(),
Status: req.GetStatus(),
Page: req.GetPage(),
PageSize: req.GetPageSize(),
Id: req.GetId(),
})
resp.TotalNum = clientResp.TotalNum
resp.List = []*v1pb.List{}
for _, v := range clientResp.List {
detail := &v1pb.List{
Id: v.Id,
Team: v.Team,
Keyword: v.Keyword,
Name: v.Name,
Value: v.Value,
Ctime: v.Ctime,
Mtime: v.Mtime,
Status: v.Status,
}
resp.List = append(resp.List, detail)
}
if err != nil {
return
}
return
}
// FormatErr format error msg
func (s *GaeaService) FormatErr(statusCode *status.Status) (code int32, msg string) {
gCode := statusCode.Code()
code = 1
if gCode == 2 {
code, _ := strconv.Atoi(statusCode.Message())
switch code {
case 1:
msg = "必要参数不正确"
case 11:
msg = "索引名称在分组内冲突"
case -500:
msg = "内部错误"
default:
msg = "内部错误"
}
} else {
msg = "内部错误"
}
return
}
// GetConfigsByTeam implementation
// 获取单个team的全部配置 `internal:"true"`
func (s *GaeaService) GetConfigsByTeam(ctx context.Context, req *v1pb.TeamConfigReq) (resp *v1pb.TeamConfigResp, err error) {
resp = &v1pb.TeamConfigResp{}
return
}
// GetConfigsByKeyword implementation
// 通过keyword获取配置 `internal:"true"`
func (s *GaeaService) GetConfigsByKeyword(ctx context.Context, req *v1pb.GetConfigsReq) (resp *v1pb.GetConfigsResp, err error) {
resp = &v1pb.GetConfigsResp{}
return
}
// GetConfigsByTeams implementation
// 获取多个team下的全部配置 `internal:"true"`
func (s *GaeaService) GetConfigsByTeams(ctx context.Context, req *v1pb.TeamsConfigReq) (resp *v1pb.TeamsConfigResp, err error) {
resp = &v1pb.TeamsConfigResp{}
return
}

View File

@@ -0,0 +1,161 @@
package v1
import (
"context"
v1pb "go-common/app/admin/live/live-admin/api/http/v1"
"go-common/app/admin/live/live-admin/conf"
"go-common/app/admin/live/live-admin/dao"
v0av "go-common/app/service/live/av/api/liverpc/v0"
"go-common/library/ecode"
"go-common/library/log"
)
// PayGoodsService struct
type PayGoodsService struct {
conf *conf.Config
// optionally add other properties here, such as dao
// dao *dao.Dao
}
//NewPayGoodsService init
func NewPayGoodsService(c *conf.Config) (s *PayGoodsService) {
s = &PayGoodsService{
conf: c,
}
return s
}
// Add implementation
// * 生成一张付费直播票
func (s *PayGoodsService) Add(ctx context.Context, req *v1pb.PayGoodsAddReq) (resp *v1pb.PayGoodsAddResp, err error) {
resp = &v1pb.PayGoodsAddResp{}
log.Info("Add params:%v", req)
r, err := dao.AvApi.V0PayGoods.Add(ctx, &v0av.PayGoodsAddReq{
Platform: req.Platform,
Title: req.Title,
Type: req.Type,
Price: req.Price,
StartTime: req.StartTime,
EndTime: req.EndTime,
IpLimit: req.IpLimit,
})
if err != nil {
log.Error("call av error,err:%v", err)
return
}
if r.Code != 0 {
log.Error("call av error,code:%v,msg:%v", r.Code, r.Msg)
err = ecode.Error(ecode.Int(int(r.Code)), r.Msg)
return
}
return
}
// Update implementation
// * 更新一张付费直播票
func (s *PayGoodsService) Update(ctx context.Context, req *v1pb.PayGoodsUpdateReq) (resp *v1pb.PayGoodsUpdateResp, err error) {
resp = &v1pb.PayGoodsUpdateResp{}
log.Info("Update params:%v", req)
r, err := dao.AvApi.V0PayGoods.Update(ctx, &v0av.PayGoodsUpdateReq{
Id: req.Id,
Platform: req.Platform,
Title: req.Title,
Type: req.Type,
Price: req.Price,
StartTime: req.StartTime,
EndTime: req.EndTime,
IpLimit: req.IpLimit,
})
if err != nil {
log.Error("call av error,err:%v", err)
return
}
if r.Code != 0 {
log.Error("call av error,code:%v,msg:%v", r.Code, r.Msg)
err = ecode.Error(ecode.Int(int(r.Code)), r.Msg)
return
}
return
}
// GetList implementation
// * 获取付费直播票列表
func (s *PayGoodsService) GetList(ctx context.Context, req *v1pb.PayGoodsGetListReq) (resp *v1pb.PayGoodsGetListResp, err error) {
resp = &v1pb.PayGoodsGetListResp{}
r, err := dao.AvApi.V0PayGoods.GetList(ctx, &v0av.PayGoodsGetListReq{
Id: req.Id,
Platform: req.Platform,
Title: req.Title,
Type: req.Type,
IpLimit: req.IpLimit,
PageNum: req.PageNum,
PageSize: req.PageSize,
})
if err != nil {
log.Error("call av error,err:%v", err)
return
}
if r.Code != 0 {
log.Error("call av error,code:%v,msg:%v", r.Code, r.Msg)
err = ecode.Error(ecode.Int(int(r.Code)), r.Msg)
return
}
data := r.Data
resp.PageInfo = &v1pb.PayGoodsGetListResp_PageInfo{
TotalCount: data.PageInfo.TotalCount,
PageNum: data.PageInfo.PageNum,
}
for _, v := range r.Data.GoodsInfo {
tmp := &v1pb.PayGoodsGetListResp_GoodsInfo{
Id: v.Id,
Title: v.Title,
Platform: v.Platform,
Type: v.Type,
Price: v.Price,
StartTime: v.StartTime,
EndTime: v.EndTime,
IpLimit: v.IpLimit,
Status: v.Status,
}
resp.GoodsInfo = append(resp.GoodsInfo, tmp)
}
return
}
// Close implementation
// * 关闭购票
func (s *PayGoodsService) Close(ctx context.Context, req *v1pb.PayGoodsCloseReq) (resp *v1pb.PayGoodsCloseResp, err error) {
resp = &v1pb.PayGoodsCloseResp{}
r, err := dao.AvApi.V0PayGoods.Close(ctx, &v0av.PayGoodsCloseReq{
Id: req.Id,
})
if err != nil {
log.Error("call av error,err:%v", err)
return
}
if r.Code != 0 {
log.Error("call av error,code:%v,msg:%v", r.Code, r.Msg)
err = ecode.Error(ecode.Int(int(r.Code)), r.Msg)
return
}
return
}
// Open implementation
// * 开启购票
func (s *PayGoodsService) Open(ctx context.Context, req *v1pb.PayGoodsOpenReq) (resp *v1pb.PayGoodsOpenResp, err error) {
resp = &v1pb.PayGoodsOpenResp{}
r, err := dao.AvApi.V0PayGoods.Open(ctx, &v0av.PayGoodsOpenReq{
Id: req.Id,
})
if err != nil {
log.Error("call av error,err:%v", err)
return
}
if r.Code != 0 {
log.Error("call av error,code:%v,msg:%v", r.Code, r.Msg)
err = ecode.Error(ecode.Int(int(r.Code)), r.Msg)
return
}
return
}

View File

@@ -0,0 +1,177 @@
package v1
import (
"context"
v1pb "go-common/app/admin/live/live-admin/api/http/v1"
"go-common/app/admin/live/live-admin/conf"
"go-common/app/admin/live/live-admin/dao"
v0av "go-common/app/service/live/av/api/liverpc/v0"
"go-common/library/ecode"
"go-common/library/log"
)
// PayLiveService struct
type PayLiveService struct {
conf *conf.Config
// optionally add other properties here, such as dao
// dao *dao.Dao
}
//NewPayLiveService init
func NewPayLiveService(c *conf.Config) (s *PayLiveService) {
s = &PayLiveService{
conf: c,
}
return s
}
// Add implementation
// `method:"POST" internal:"true"` 生成付费直播信息
func (s *PayLiveService) Add(ctx context.Context, req *v1pb.PayLiveAddReq) (resp *v1pb.PayLiveAddResp, err error) {
resp = &v1pb.PayLiveAddResp{}
log.Info("Add params:%v", req)
r, err := dao.AvApi.V0PayLive.Add(ctx, &v0av.PayLiveAddReq{
Platform: req.Platform,
RoomId: req.RoomId,
Title: req.Title,
Status: req.Status,
StartTime: req.StartTime,
EndTime: req.EndTime,
LiveEndTime: req.LiveEndTime,
LivePic: req.LivePic,
AdPic: req.AdPic,
GoodsLink: req.GoodsLink,
GoodsId: req.GoodsId,
IpLimit: req.IpLimit,
BuyGoodsId: req.BuyGoodsId,
})
if err != nil {
log.Error("call av error,err:%v", err)
return
}
if r.Code != 0 {
log.Error("call av error,code:%v,msg:%v", r.Code, r.Msg)
err = ecode.Error(ecode.Int(int(r.Code)), r.Msg)
return
}
return
}
// Update implementation
// `method:"POST" internal:"true"` 更新付费直播信息
func (s *PayLiveService) Update(ctx context.Context, req *v1pb.PayLiveUpdateReq) (resp *v1pb.PayLiveUpdateResp, err error) {
resp = &v1pb.PayLiveUpdateResp{}
log.Info("Update params:%v", req)
r, err := dao.AvApi.V0PayLive.Update(ctx, &v0av.PayLiveUpdateReq{
LiveId: req.LiveId,
Platform: req.Platform,
RoomId: req.RoomId,
Title: req.Title,
Status: req.Status,
StartTime: req.StartTime,
EndTime: req.EndTime,
LiveEndTime: req.LiveEndTime,
LivePic: req.LivePic,
AdPic: req.AdPic,
GoodsLink: req.GoodsLink,
GoodsId: req.GoodsId,
IpLimit: req.IpLimit,
BuyGoodsId: req.BuyGoodsId,
})
if err != nil {
log.Error("call av error,err:%v", err)
return
}
if r.Code != 0 {
log.Error("call av error,code:%v,msg:%v", r.Code, r.Msg)
err = ecode.Error(ecode.Int(int(r.Code)), r.Msg)
return
}
return
}
// GetList implementation
// `method:"POST" internal:"true"` 获取付费直播列表
func (s *PayLiveService) GetList(ctx context.Context, req *v1pb.PayLiveGetListReq) (resp *v1pb.PayLiveGetListResp, err error) {
resp = &v1pb.PayLiveGetListResp{}
r, err := dao.AvApi.V0PayLive.GetList(ctx, &v0av.PayLiveGetListReq{
RoomId: req.RoomId,
Title: req.Title,
IpLimit: req.IpLimit,
PageNum: req.PageNum,
PageSize: req.PageSize,
})
if err != nil {
log.Error("call av error,err:%v", err)
return
}
if r.Code != 0 {
log.Error("call av error,code:%v,msg:%v", r.Code, r.Msg)
err = ecode.Error(ecode.Int(int(r.Code)), r.Msg)
return
}
data := r.Data
resp.PageInfo = &v1pb.PayLiveGetListResp_PageInfo{
TotalCount: data.PageInfo.TotalCount,
PageNum: data.PageInfo.PageNum,
}
for _, v := range r.Data.GoodsInfo {
tmp := &v1pb.PayLiveGetListResp_GoodsInfo{
LiveId: v.LiveId,
Platform: v.Platform,
RoomId: v.RoomId,
Title: v.Title,
Status: v.Status,
PayLiveStatus: v.PayLiveStatus,
StartTime: v.StartTime,
EndTime: v.EndTime,
LiveEndTime: v.LiveEndTime,
LivePic: v.LivePic,
AdPic: v.AdPic,
GoodsLink: v.GoodsLink,
GoodsId: v.GoodsId,
IpLimit: v.IpLimit,
BuyGoodsId: v.BuyGoodsId,
}
resp.GoodsInfo = append(resp.GoodsInfo, tmp)
}
return
}
// Close implementation
// `method:"POST" internal:"true"` 关闭鉴权
func (s *PayLiveService) Close(ctx context.Context, req *v1pb.PayLiveCloseReq) (resp *v1pb.PayLiveCloseResp, err error) {
resp = &v1pb.PayLiveCloseResp{}
r, err := dao.AvApi.V0PayLive.Close(ctx, &v0av.PayLiveCloseReq{
LiveId: req.LiveId,
})
if err != nil {
log.Error("call av error,err:%v", err)
return
}
if r.Code != 0 {
log.Error("call av error,code:%v,msg:%v", r.Code, r.Msg)
err = ecode.Error(ecode.Int(int(r.Code)), r.Msg)
return
}
return
}
// Open implementation
// `method:"POST" internal:"true"` 开启鉴权
func (s *PayLiveService) Open(ctx context.Context, req *v1pb.PayLiveOpenReq) (resp *v1pb.PayLiveOpenResp, err error) {
resp = &v1pb.PayLiveOpenResp{}
r, err := dao.AvApi.V0PayLive.Open(ctx, &v0av.PayLiveOpenReq{
LiveId: req.LiveId,
})
if err != nil {
log.Error("call av error,err:%v", err)
return
}
if err != nil || r.Code != 0 {
log.Error("call av error,code:%v,msg:%v", r.Code, r.Msg)
err = ecode.Error(ecode.Int(int(r.Code)), r.Msg)
return
}
return
}

View File

@@ -0,0 +1,239 @@
package v1
import (
"context"
"strings"
v1pb "go-common/app/admin/live/live-admin/api/http/v1"
"go-common/app/admin/live/live-admin/conf"
rspb "go-common/app/service/live/resource/api/grpc/v1"
"go-common/library/log"
)
// ResourceService struct
type ResourceService struct {
conf *conf.Config
// optionally add other properties here, such as dao
// dao *dao.Dao
rsCli *rspb.Client
}
//NewResourceService init
func NewResourceService(c *conf.Config) (s *ResourceService) {
s = &ResourceService{
conf: c,
}
var svc *rspb.Client
var err error
log.Info("ResourceService Init: %+v", s.conf.ResourceClient)
if svc, err = rspb.NewClient(s.conf.ResourceClient); err != nil {
panic(err)
}
s.rsCli = svc
return s
}
// Add implementation
// Add 添加资源接口
// `method:"POST" internal:"true"
func (s *ResourceService) Add(ctx context.Context, req *v1pb.AddReq) (resp *v1pb.AddResp, err error) {
respRPC, error := s.rsCli.Add(ctx, &rspb.AddReq{
Platform: req.Platform,
Title: req.Title,
JumpPath: req.JumpPath,
JumpPathType: req.JumpPathType,
JumpTime: req.JumpTime,
Type: req.Type,
Device: req.Device,
StartTime: req.StartTime,
EndTime: req.EndTime,
ImageUrl: req.ImageUrl,
})
err = error
if error == nil {
resp = &v1pb.AddResp{
Id: respRPC.Id,
}
}
return
}
// AddEx implementation
// AddEx 添加资源接口
// `method:"POST" internal:"true"
func (s *ResourceService) AddEx(ctx context.Context, req *v1pb.AddReq) (resp *v1pb.AddResp, err error) {
respRPC, error := s.rsCli.AddEx(ctx, &rspb.AddReq{
Platform: req.Platform,
Title: req.Title,
JumpPath: req.JumpPath,
JumpPathType: req.JumpPathType,
JumpTime: req.JumpTime,
Type: req.Type,
Device: req.Device,
StartTime: req.StartTime,
EndTime: req.EndTime,
ImageUrl: req.ImageUrl,
})
err = error
if error == nil {
resp = &v1pb.AddResp{
Id: respRPC.Id,
}
}
return
}
// Edit implementation
// Edit 编辑资源接口
// `method:"POST" internal:"true" `
func (s *ResourceService) Edit(ctx context.Context, req *v1pb.EditReq) (resp *v1pb.EditResp, err error) {
_, err = s.rsCli.Edit(ctx, &rspb.EditReq{
Platform: req.Platform,
Id: req.Id,
Title: req.Title,
JumpPath: req.JumpPath,
JumpTime: req.JumpTime,
StartTime: req.StartTime,
EndTime: req.EndTime,
ImageUrl: req.ImageUrl,
JumpPathType: req.JumpPathType,
})
return
}
// Offline implementation
// Offline 下线资源接口
// `method:"POST" internal:"true" `
func (s *ResourceService) Offline(ctx context.Context, req *v1pb.OfflineReq) (resp *v1pb.OfflineResp, err error) {
_, err = s.rsCli.Offline(ctx, &rspb.OfflineReq{
Platform: req.Platform,
Id: req.Id,
})
if err == nil {
resp = &v1pb.OfflineResp{}
}
return
}
// GetList implementation
// GetList 获取资源列表
// `method:"GET" internal:"true" `
func (s *ResourceService) GetList(ctx context.Context, req *v1pb.GetListReq) (resp *v1pb.GetListResp, err error) {
RPCReq := &rspb.GetListReq{
Platform: req.Platform,
Type: req.Type,
Page: req.Page,
PageSize: req.PageSize,
}
if RPCReq.Page == 0 {
RPCReq.Page = 1
}
if RPCReq.PageSize == 0 {
RPCReq.PageSize = 50
}
var RPCResp *rspb.GetListResp
RPCResp, err = s.rsCli.GetList(ctx, RPCReq)
if err == nil {
resp = &v1pb.GetListResp{
CurrentPage: RPCResp.CurrentPage,
TotalCount: RPCResp.TotalCount,
List: convertRPCList2HttpList(RPCResp.List),
}
}
return
}
// GetPlatformList implementation
// 获取平台列表
// `method:"GET" internal:"true" `
func (s *ResourceService) GetPlatformList(ctx context.Context, req *v1pb.GetPlatformListReq) (resp *v1pb.GetPlatformListResp, err error) {
var RPCResp *rspb.GetPlatformListResp
RPCResp, err = s.rsCli.GetPlatformList(ctx, &rspb.GetPlatformListReq{
Type: req.Type,
})
if err == nil {
resp = &v1pb.GetPlatformListResp{
Platform: RPCResp.Platform,
}
}
return
}
// GetListEx implementation
// GetListEx 获取资源列表
// `method:"GET" internal:"true" `
func (s *ResourceService) GetListEx(ctx context.Context, req *v1pb.GetListExReq) (resp *v1pb.GetListExResp, err error) {
var RPCResp *rspb.GetListExResp
// 默认分页参数
if req.Page == 0 {
req.Page = 1
}
if req.PageSize == 0 {
req.PageSize = 50
}
if len(req.Type) > 0 {
req.Type = strings.Split(req.Type[0], ",")
}
RPCResp, err = s.rsCli.GetListEx(ctx, &rspb.GetListExReq{
Platform: req.Platform,
Page: req.Page,
PageSize: req.PageSize,
Type: req.Type,
DevicePlatform: req.DevicePlatform,
Status: req.Status,
StartTime: req.StartTime,
EndTime: req.EndTime,
})
if err == nil {
resp = &v1pb.GetListExResp{
CurrentPage: RPCResp.CurrentPage,
TotalCount: RPCResp.TotalCount,
List: convertRPCListEx2HttpListEx(RPCResp.List),
}
}
return
}
func convertRPCList2HttpList(RPCList []*rspb.GetListResp_List) (HTTPList []*v1pb.GetListResp_List) {
HTTPList = make([]*v1pb.GetListResp_List, len(RPCList))
for index, RPCRespItem := range RPCList {
HTTPList[index] = &v1pb.GetListResp_List{
Id: RPCRespItem.Id,
Title: RPCRespItem.Title,
JumpPath: RPCRespItem.JumpPath,
DevicePlatform: RPCRespItem.DevicePlatform,
DeviceBuild: RPCRespItem.DeviceBuild,
StartTime: RPCRespItem.StartTime,
EndTime: RPCRespItem.EndTime,
Status: RPCRespItem.Status,
DeviceLimit: RPCRespItem.DeviceLimit,
ImageUrl: RPCRespItem.ImageUrl,
JumpPathType: RPCRespItem.JumpPathType,
JumpTime: RPCRespItem.JumpTime,
}
}
return
}
func convertRPCListEx2HttpListEx(RPCList []*rspb.GetListExResp_List) (HTTPList []*v1pb.GetListExResp_List) {
HTTPList = make([]*v1pb.GetListExResp_List, len(RPCList))
for index, RPCRespItem := range RPCList {
HTTPList[index] = &v1pb.GetListExResp_List{
Id: RPCRespItem.Id,
Title: RPCRespItem.Title,
JumpPath: RPCRespItem.JumpPath,
DevicePlatform: RPCRespItem.DevicePlatform,
DeviceBuild: RPCRespItem.DeviceBuild,
StartTime: RPCRespItem.StartTime,
EndTime: RPCRespItem.EndTime,
Status: RPCRespItem.Status,
DeviceLimit: RPCRespItem.DeviceLimit,
ImageUrl: RPCRespItem.ImageUrl,
JumpPathType: RPCRespItem.JumpPathType,
JumpTime: RPCRespItem.JumpTime,
Type: RPCRespItem.Type,
}
}
return
}

View File

@@ -0,0 +1,175 @@
package v1
import (
"context"
"fmt"
v1pb "go-common/app/admin/live/live-admin/api/http/v1"
"go-common/app/admin/live/live-admin/conf"
"go-common/app/admin/live/live-admin/dao"
relationV1 "go-common/app/service/live/relation/api/liverpc/v1"
liveRPCCli "go-common/app/service/live/room/api/liverpc"
v1liveRPCpb "go-common/app/service/live/room/api/liverpc/v1"
"go-common/library/log"
"go-common/library/sync/errgroup"
"os"
"time"
streamPb "go-common/app/service/video/stream-mng/api/v1"
"go-common/library/ecode"
)
const timeFormat = "2006-01-02 15:04:05"
// RoomMngService struct
type RoomMngService struct {
conf *conf.Config
// optionally add other properties here, such as dao
// dao *dao.Dao
rpcCli *liveRPCCli.Client
streamCli streamPb.StreamClient
dao *dao.Dao
}
//NewRoomMngService init
func NewRoomMngService(c *conf.Config) (s *RoomMngService) {
s = &RoomMngService{
conf: c,
dao: dao.New(c),
}
log.Info("RoomMngLiveRPCClient Init: %+v", s.conf.RoomMngClient)
s.rpcCli = liveRPCCli.New(s.conf.RoomMngClient)
log.Info("Stream Mng Client Init: %+v", s.conf.StreamMngClient)
if svc, err := streamPb.NewClient(s.conf.StreamMngClient); err != nil {
panic(err)
} else {
s.streamCli = svc
}
return s
}
// GetSecondVerifyListWithPics implementation
// 获取带有图片地址的二次审核列表
// `method:"GET" internal:"true" `
func (s *RoomMngService) GetSecondVerifyListWithPics(ctx context.Context, req *v1pb.RoomMngGetSecondVerifyListReq) (resp *v1pb.RoomMngGetSecondVerifyListResp, err error) {
if req.Pagesize == 0 {
req.Pagesize = 30
}
rpcResp, err := s.rpcCli.V1RoomMng.GetSecondVerifyList(ctx, &v1liveRPCpb.RoomMngGetSecondVerifyListReq{
RoomId: req.RoomId,
Area: req.Area,
Page: req.Page,
Pagesize: req.Pagesize,
Biz: req.Biz,
})
if err != nil {
return
}
if rpcResp.Code == 0 {
result, getPicErr := s.getExtraInfo(ctx, rpcResp.Data.Result)
if getPicErr != nil {
err = getPicErr
} else {
resp = &v1pb.RoomMngGetSecondVerifyListResp{
Count: rpcResp.Data.Count,
Page: rpcResp.Data.Page,
Pagesize: rpcResp.Data.Pagesize,
Result: result,
}
}
} else {
err = ecode.Error(ecode.ServerErr, fmt.Sprintf("Room v1 RoomMng LiveRPC 业务错误: { Code: %d ; Msg: %s }", rpcResp.Code, rpcResp.Msg))
}
return
}
func (s *RoomMngService) getExtraInfo(ctx context.Context, list []*v1liveRPCpb.RoomMngGetSecondVerifyListResp_Result) (respList []*v1pb.RoomMngGetSecondVerifyListResp_Result, err error) {
picRes := make([][]string, len(list))
fcRes := make([]int64, len(list))
g, _ := errgroup.WithContext(ctx)
for i := 0; i < len(list); i++ {
x := i
// 获取指定时间内的截图
g.Go(func() error {
picRes[x] = s.getSingleRoomPic(ctx, list[x].RoomId, list[x].BreakTime)
return nil
})
// 获取粉丝计数
g.Go(func() (feedErr error) {
fcRes[x] = s.getUserFC(ctx, list[x].Uid)
return nil
})
}
if err := g.Wait(); err != nil {
log.Error("get ExtraData Error (%+v)", err)
}
respList = make([]*v1pb.RoomMngGetSecondVerifyListResp_Result, len(list))
for index, RPCRespItem := range list {
// 当截图张数大于 0 且有证据图片时,将截图第一张替换为证据图片
if len(picRes[index]) > 0 && RPCRespItem.ProofImg != "" {
picRes[index][0] = RPCRespItem.ProofImg
}
respList[index] = &v1pb.RoomMngGetSecondVerifyListResp_Result{
Id: RPCRespItem.Id,
RecentCutTimes: RPCRespItem.RecentCutTimes,
RecentWarnTimes: RPCRespItem.RecentWarnTimes,
Uname: RPCRespItem.Uname,
RoomId: RPCRespItem.RoomId,
Uid: RPCRespItem.Uid,
Title: RPCRespItem.Title,
AreaV2Name: RPCRespItem.AreaV2Name,
Fc: fcRes[index],
WarnReason: RPCRespItem.WarnReason,
BreakTime: RPCRespItem.BreakTime,
Pics: picRes[index],
WarnTimes: RPCRespItem.WarnTimes,
}
}
return
}
func (s *RoomMngService) getSingleRoomPic(ctx context.Context, roomID int64, breakTime string) (picList []string) {
// uat 环境写死 11891462 房间号
if os.Getenv("DEPLOY_ENV") == "uat" {
roomID = 11891462
}
// 计算结束时间点,规定为 5 分钟后
startTime, _ := time.Parse(timeFormat, breakTime)
endTimeStr := startTime.Add(5 * 60 * 1000 * 1000 * 1000).Format(timeFormat)
RPCResp, err := s.streamCli.GetSingleScreeShot(ctx, &streamPb.GetSingleScreeShotReq{
RoomId: roomID,
StartTime: breakTime,
EndTime: endTimeStr,
})
// log.Info("res: (%+v) err:(%+v) \n", RPCResp, err)
if err != nil {
log.Error("Get Pic Fail: error(%v) roomId(%d) startTime(%s) endTime(%s)", err, roomID, breakTime, endTimeStr)
picList = []string{
"https://static.hdslb.com/error/very_sorry.png",
}
} else {
picList = RPCResp.List
}
return
}
func (s *RoomMngService) getUserFC(ctx context.Context, UID int64) (resp int64) {
feedResp, feedErr := s.dao.Relation.V1Feed.GetUserFc(ctx, &relationV1.FeedGetUserFcReq{Follow: UID})
if feedErr != nil || feedResp.Data == nil {
resp = 0
log.Error("Get FC Error for UID(%d) with Error(%+v)", UID, feedErr)
} else {
resp = feedResp.Data.Fc
}
return
}

View File

@@ -0,0 +1,30 @@
package v1
import (
"context"
v1pb "go-common/app/admin/live/live-admin/api/http/v1"
"go-common/app/admin/live/live-admin/conf"
)
// SplashService struct
type SplashService struct {
conf *conf.Config
// optionally add other properties here, such as dao
// dao *dao.Dao
}
//NewSplashService init
func NewSplashService(c *conf.Config) (s *SplashService) {
s = &SplashService{
conf: c,
}
return s
}
// GetInfo implementation
// 获取有效闪屏配置
// `method:"GET" internal:"true" `
func (s *SplashService) GetInfo(ctx context.Context, req *v1pb.GetInfoReq) (resp *v1pb.GetInfoResp, err error) {
resp = &v1pb.GetInfoResp{}
return
}

View File

@@ -0,0 +1,53 @@
package v1
import (
"context"
"time"
v1pb "go-common/app/admin/live/live-admin/api/http/v1"
"go-common/app/admin/live/live-admin/conf"
"go-common/app/admin/live/live-admin/dao"
"go-common/library/ecode"
"go-common/library/log"
)
// TokenService struct
type TokenService struct {
conf *conf.Config
// optionally add other properties here, such as dao
dao *dao.Dao
}
//NewTokenService init
func NewTokenService(c *conf.Config, d *dao.Dao) (s *TokenService) {
s = &TokenService{
conf: c,
dao: d,
}
return s
}
// New implementation
// Request for a token for upload.
// `method:"POST" internal:"true"`
func (s *TokenService) New(ctx context.Context, req *v1pb.NewTokenReq) (resp *v1pb.NewTokenResp, err error) {
// Must be live's bucket.
_, ok := s.conf.Bucket[req.Bucket]
if !ok {
err = ecode.UploadBucketErr
return
}
var token string
if token, err = s.dao.RequestUploadToken(ctx, req.Bucket, req.Operator, time.Now().Unix()); err != nil {
log.Error("New a upload token failure: %v", err)
err = ecode.UploadTokenGenErr
return
}
resp = &v1pb.NewTokenResp{
Token: token,
}
return
}

View File

@@ -0,0 +1,45 @@
package v1
import (
"context"
"flag"
"go-common/app/admin/live/live-admin/dao"
"testing"
"time"
v1pb "go-common/app/admin/live/live-admin/api/http/v1"
"go-common/app/admin/live/live-admin/conf"
. "github.com/smartystreets/goconvey/convey"
)
var tokenSrv *TokenService
func init() {
flag.Set("conf", "../../cmd/test.toml")
if err := conf.Init(); err != nil {
panic(err)
}
tokenSrv = NewTokenService(conf.Conf, dao.New(conf.Conf))
}
func TestUploadToken(t *testing.T) {
Convey("TestTokenService", t, func() {
req := &v1pb.NewTokenReq{
Bucket: "slive",
Operator: "KC",
}
resp, err := tokenSrv.New(context.TODO(), req)
So(err, ShouldBeNil)
So(resp.Token, ShouldNotBeEmpty)
ok := tokenSrv.dao.VerifyUploadToken(context.TODO(), resp.Token)
So(ok, ShouldBeTrue)
// Test token expiration.
time.Sleep(time.Second * 11)
ok = tokenSrv.dao.VerifyUploadToken(context.TODO(), resp.Token)
So(ok, ShouldBeFalse)
})
}

View File

@@ -0,0 +1,130 @@
package v1
import (
"bytes"
"context"
"crypto/hmac"
"crypto/sha1"
"encoding/base64"
"fmt"
"io"
"net/url"
"strings"
"time"
v1pb "go-common/app/admin/live/live-admin/api/http/v1"
"go-common/app/admin/live/live-admin/conf"
"go-common/app/admin/live/live-admin/dao"
"go-common/app/admin/live/live-admin/model"
"go-common/library/database/bfs"
"go-common/library/ecode"
"go-common/library/log"
"go-common/library/net/http/blademaster"
)
// UploadService struct
type UploadService struct {
conf *conf.Config
// optionally add other properties here, such as dao
dao *dao.Dao
}
//NewUploadService init
func NewUploadService(c *conf.Config, d *dao.Dao) (s *UploadService) {
s = &UploadService{
conf: c,
dao: d,
}
return s
}
// File implementation
// `method:"POST" content-type:"multipart/form-data" midware:"guest"`
func (s *UploadService) File(ctx context.Context, req *v1pb.UploadFileReq) (resp *v1pb.UploadFileResp, err error) {
_, ok := s.conf.Bucket[req.Bucket]
if !ok {
err = ecode.UploadBucketErr
return
}
if !s.verify(ctx, req.Token) {
err = ecode.Error(ecode.InvalidParam, "invalid upload token")
return
}
bmc := ctx.(*blademaster.Context)
file, _, err := bmc.Request.FormFile("file_up")
if err != nil {
log.Error("Parse file part failure: %v", err)
err = ecode.Error(ecode.InvalidParam, "file not found")
return
}
defer file.Close()
fileData := new(bytes.Buffer)
if _, err = io.Copy(fileData, file); err != nil {
log.Error("Read file data failure: %v", err)
err = ecode.UploadUploadErr
return
}
resp = &v1pb.UploadFileResp{}
bfsClient := bfs.New(nil)
bfsReq := &bfs.Request{
Bucket: req.Bucket,
Dir: req.Dir,
ContentType: req.ContentType,
Filename: req.Filename,
File: fileData.Bytes(),
WMKey: req.WmKey,
WMText: req.WmText,
WMPaddingX: req.WmPaddingX,
WMPaddingY: req.WmPaddingY,
WMScale: req.WmScale,
}
model.TweakWatermark(bfsReq)
resp.Url, err = bfsClient.Upload(ctx, bfsReq)
if err != nil {
log.Error("Upload to bfs failure: %v", err)
err = ecode.UploadUploadErr
return
}
resp.Url = s.getPrivateURL(req.Bucket, resp.Url)
return
}
func (s *UploadService) verify(ctx context.Context, token string) bool {
return s.dao.VerifyUploadToken(ctx, token)
}
func (s *UploadService) getPrivateURL(bucket, fileURL string) string {
bucketConf, ok := s.conf.Bucket[bucket]
if !ok || !bucketConf.Private {
return fileURL
}
bucketFindStr := fmt.Sprintf("/%s/", bucket)
bucketIndex := strings.Index(fileURL, bucketFindStr)
if bucketIndex < 0 {
return fileURL
}
filename := fileURL[bucketIndex+len(bucketFindStr):]
now := time.Now().Unix()
mac := hmac.New(sha1.New, []byte(bucketConf.Secret))
salt := fmt.Sprintf("GET\n%s\n%s\n%d\n", bucket, filename, now)
mac.Write([]byte(salt))
sign := base64.StdEncoding.EncodeToString(mac.Sum(nil))
token := fmt.Sprintf("%s:%s:%d", bucketConf.Key, sign, now)
v := url.Values{}
v.Set("token", token)
return fmt.Sprintf("%s?%s", fileURL, v.Encode())
}

View File

@@ -0,0 +1,34 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["userResource.go"],
importpath = "go-common/app/admin/live/live-admin/service/v2",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/live/live-admin/api/http/v2:go_default_library",
"//app/admin/live/live-admin/conf:go_default_library",
"//app/service/live/resource/api/grpc/v2:go_default_library",
"//library/log:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,144 @@
package v2
import (
"context"
v2pb "go-common/app/admin/live/live-admin/api/http/v2"
"go-common/app/admin/live/live-admin/conf"
v2rspb "go-common/app/service/live/resource/api/grpc/v2"
"go-common/library/log"
)
// UserResourceService struct
type UserResourceService struct {
conf *conf.Config
// optionally add other properties here, such as dao
// dao *dao.Dao
v2rsCli *v2rspb.Client
}
//NewUserResourceService init
func NewUserResourceService(c *conf.Config) (s *UserResourceService) {
s = &UserResourceService{
conf: c,
}
var svc *v2rspb.Client
var err error
log.Info("ResourceServiceV2 Init: %+v", s.conf.ResourceClientV2)
if svc, err = v2rspb.NewClient(s.conf.ResourceClientV2); err != nil {
panic(err)
}
s.v2rsCli = svc
return s
}
// Add implementation
// Add 添加资源接口
// `method:"POST" internal:"true" `
func (s *UserResourceService) Add(ctx context.Context, req *v2pb.UserResourceAddReq) (resp *v2pb.UserResourceAddResp, err error) {
respRPC, err := s.v2rsCli.Add(ctx, &v2rspb.AddReq{
ResType: req.ResType,
Title: req.Title,
Url: req.Url,
Weight: req.Weight,
Creator: req.Creator,
})
if err == nil {
resp = &v2pb.UserResourceAddResp{
Id: respRPC.Id,
CustomId: respRPC.CustomId,
}
}
return
}
// Edit implementation
// Edit 编辑现有资源
// `method:"POST" internal:"true" `
func (s *UserResourceService) Edit(ctx context.Context, req *v2pb.UserResourceEditReq) (resp *v2pb.UserResourceEditResp, err error) {
resp = &v2pb.UserResourceEditResp{}
_, err = s.v2rsCli.Edit(ctx, &v2rspb.EditReq{
ResType: req.ResType,
Title: req.Title,
Url: req.Url,
Weight: req.Weight,
CustomId: req.CustomId,
})
return
}
// Get implementation
// Get 获取资源列表
// `method:"GET" internal:"true" `
func (s *UserResourceService) Get(ctx context.Context, req *v2pb.UserResourceListReq) (resp *v2pb.UserResourceListResp, err error) {
respRPC, err := s.v2rsCli.List(ctx, &v2rspb.ListReq{
ResType: req.ResType,
Page: req.Page,
PageSize: req.PageSize,
})
if err == nil {
resp = &v2pb.UserResourceListResp{
CurrentPage: respRPC.CurrentPage,
TotalCount: respRPC.TotalCount,
List: convertRPCListRes(respRPC.List),
}
}
return
}
// SetStatus implementation
// SetStatus 更改资源状态
// `method:"POST" internal:"true" `
func (s *UserResourceService) SetStatus(ctx context.Context, req *v2pb.UserResourceSetStatusReq) (resp *v2pb.UserResourceSetStatusResp, err error) {
resp = &v2pb.UserResourceSetStatusResp{}
_, err = s.v2rsCli.SetStatus(ctx, &v2rspb.SetStatusReq{
ResType: req.ResType,
CustomId: req.CustomId,
Status: req.Status,
})
return
}
// GetSingle implementation
// Query 请求单个资源
func (s *UserResourceService) GetSingle(ctx context.Context, req *v2pb.UserResourceGetSingleReq) (resp *v2pb.UserResourceGetSingleResp, err error) {
respRPC, err := s.v2rsCli.Query(ctx, &v2rspb.QueryReq{
CustomId: req.CustomId,
ResType: req.ResType,
})
if err == nil {
resp = &v2pb.UserResourceGetSingleResp{
Id: respRPC.Id,
ResType: respRPC.ResType,
CustomId: respRPC.CustomId,
Title: respRPC.Title,
Url: respRPC.Url,
Weight: respRPC.Weight,
Creator: respRPC.Creator,
Status: respRPC.Status,
Ctime: respRPC.Ctime,
Mtime: respRPC.Mtime,
}
}
return
}
func convertRPCListRes(RPCList []*v2rspb.ListResp_List) (HTTPList []*v2pb.UserResourceListResp_List) {
HTTPList = make([]*v2pb.UserResourceListResp_List, len(RPCList))
for index, RPCListItem := range RPCList {
HTTPList[index] = &v2pb.UserResourceListResp_List{
Id: RPCListItem.Id,
ResType: RPCListItem.ResType,
CustomId: RPCListItem.CustomId,
Title: RPCListItem.Title,
Url: RPCListItem.Url,
Weight: RPCListItem.Weight,
Creator: RPCListItem.Creator,
Status: RPCListItem.Status,
Ctime: RPCListItem.Ctime,
Mtime: RPCListItem.Mtime,
}
}
return
}