创建项目

This commit is contained in:
RZY 2024-06-07 11:11:04 +08:00
commit 32a7e74aed
44 changed files with 4146 additions and 0 deletions

20
.gitignore vendored Normal file
View File

@ -0,0 +1,20 @@
/.idea
/.vscode
/vendor
/runtime
*.log
.env
app/.DS_Store
.DS_Store
composer_test.lock
.phpunit.result.cache
config/pem
config/bale
config/alipaycash
config/wechatcash
config/wechat_cert.pem
config/wechat_private_key.pem
/app/api/ForExample.php
/route/test.php
/public/data/
/app/api/Test.php

73
Makefile Executable file
View File

@ -0,0 +1,73 @@
GOHOSTOS:=$(shell go env GOHOSTOS)
GOPATH:=$(shell go env GOPATH)
VERSION=$(shell git describe --tags --always)
ifeq ($(GOHOSTOS), windows)
#the `find.exe` is different from `find` in bash/shell.
#to see https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/find.
#changed to use git-bash.exe to run find cli or other cli friendly, caused of every developer has a Git.
#Git_Bash= $(subst cmd\,bin\bash.exe,$(dir $(shell where git)))
Git_Bash=$(subst \,/,$(subst cmd\,bin\bash.exe,$(dir $(shell where git))))
INTERNAL_PROTO_FILES=$(shell $(Git_Bash) -c "find internal -name *.proto")
API_PROTO_FILES=$(shell $(Git_Bash) -c "find api -name *.proto")
else
INTERNAL_PROTO_FILES=$(shell find internal -name *.proto)
API_PROTO_FILES=$(shell find api -name *.proto)
endif
.PHONY: apigen
# 根据api创建http文件
apigen:
cd cmd/api/desc && goctl api go -api *.api -dir ../ --style=goZero
.PHONY: rpcgen
# 根据protoc创建rpc文件
rpcgen:
cd cmd/rpc/pb && goctl rpc protoc *.proto --go_out=../pb --go-grpc_out=../pb --zrpc_out=../ --client=false --style=goZero
.PHONY: apiinitrpc
# api端生成rpc
apiinitrpc:
cd cmd/api/pb && goctl rpc protoc *.proto --go_out=../ --go-grpc_out=../ --zrpc_out=../ --client=false --style=goZero
.PHONY: rpcrun
# 运行rpc
rpcrun:
cd cmd/rpc && go run transfer.go
.PHONY: apirun
# 运行rpc
apirun:
cd cmd/api && go run transfer.go
.PHONY: apivalidate
# 运行rpc
apivalidate:
cd cmd/api/desc && goctl api validate --api *.api
.PHONY: apiformat
# 运行rpc
apiformat:
cd cmd/api/desc && goctl api format --dir ./
.PHONY: apitodoc
# 运行rpc
apitodoc:
cd cmd/api/desc && goctl api doc --dir ./
.PHONY: templateUpdate
# rpcdocker
templateUpdate:
cd template && goctl template update --home ./
.PHONY: rpcdocker
# rpcdocker
rpcdocker:
goctl docker -go ./cmd/rpc/transfer.go

12
cmd/rpc/etc/config.go Executable file
View File

@ -0,0 +1,12 @@
package etc
type ExtraConfig struct {
Nacos NacosConf
}
type NacosConf struct {
Hosts []string
NameSpace string
TimeOut uint64
ServiceName string
}

View File

@ -0,0 +1,28 @@
package config
import (
"github.com/zeromicro/go-zero/core/stores/cache"
"github.com/zeromicro/go-zero/zrpc"
"trasfer_middleware/cmd/rpc/etc"
"trasfer_middleware/cmd/rpc/internal/logic/po/zltx/types"
)
type Config struct {
zrpc.RpcServerConf
etc.ExtraConfig
DB struct {
Master struct {
DataSource string
}
Slave struct {
DataSource string
}
MarketReseller struct {
DataSource string
}
}
Cache cache.CacheConf
ZLTX types.ZLTXConf
}

View File

@ -0,0 +1,36 @@
package logic
import (
"context"
"github.com/pkg/errors"
"trasfer_middleware/pkg/xerr"
"github.com/jinzhu/copier"
"github.com/zeromicro/go-zero/core/logx"
"trasfer_middleware/cmd/rpc/internal/svc"
"trasfer_middleware/cmd/rpc/pb/transfer"
)
type GetResellerByAppIdLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewGetResellerByAppIdLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetResellerByAppIdLogic {
return &GetResellerByAppIdLogic{
ctx: ctx,
svcCtx: svcCtx,
Logger: logx.WithContext(ctx),
}
}
func (l *GetResellerByAppIdLogic) GetResellerByAppId(in *transfer.GetResellerByAppIdReq) (*transfer.GetResellerByAppIdRes, error) {
var res transfer.GetResellerByAppIdRes
reseller, err := l.svcCtx.DbReseller.ResellerMerchant.FindOneByAppId(l.ctx, in.AppId)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrMsg(l.ctx, "未找到分销商信息"), "temp in : %+v", err, in.AppId)
}
_ = copier.Copy(&res, &reseller)
return &res, nil
}

View File

@ -0,0 +1,20 @@
package types
type PublicRecharge struct {
MerchantId int
TimeStamp int
Sign string
}
type ExtendParameter struct {
ExtendParameter string
}
type ZLTXConf struct {
Host string
}
type BaseRes struct {
Code string `json:"code"`
Message string `json:"message"`
}

View File

@ -0,0 +1,23 @@
package types
type CardParam struct {
OutTradeNo string
ProductId int
Mobile string
AccountType int
Number int
NotifyUrl string
}
type CardRes struct {
Code string `json:"code"`
Message string `json:"message"`
}
type CardQueryRes struct {
Code string `json:"code"`
Message string `json:"message"`
Status string `json:"status"`
OutTradeNo string `json:"outTradeNo"`
CardCode string `json:"cardCode"`
}

View File

@ -0,0 +1,12 @@
package types
type OrderSmsParam struct {
OutTradeNo string
}
type OrderSmsRes struct {
Code string `json:"code"`
Message string `json:"message"`
Status string `json:"status"`
OutTradeNo string `json:"outTradeNo"`
}

View File

@ -0,0 +1,17 @@
package types
type RechargeParam struct {
OutTradeNo string
ProductId int
RechargeAccount string
AccountType int
Number int
NotifyUrl string
}
type RechargeQueryRes struct {
Code string `json:"code"`
Message string `json:"message"`
Status string `json:"status"`
OutTradeNo string `json:"outTradeNo"`
}

View File

@ -0,0 +1,9 @@
package types
type RechargeInfoParam struct {
}
type RechargeInfoRes struct {
Code string `json:"code"`
Balance string `json:"balance"`
}

View File

@ -0,0 +1,16 @@
package types
type RechargeProductParam struct {
}
type RechargeProductRes struct {
Code string `json:"code"`
Products []RechargeProduct `json:"products"`
}
type RechargeProduct struct {
ProductId int `json:"product_id"`
ChannelPrice string `json:"channel_price"`
ItemName string `json:"item_name"`
OriginalPrice string `json:"original_price"`
}

View File

@ -0,0 +1,126 @@
package zltx
import (
"encoding/json"
"fmt"
"time"
"trasfer_middleware/cmd/rpc/internal/logic/po/zltx/types"
"trasfer_middleware/cmd/rpc/internal/logic/vo"
"trasfer_middleware/cmd/rpc/pb/transfer"
"trasfer_middleware/pkg/common"
"trasfer_middleware/pkg/request"
)
type ZltxOrder struct {
Conf *types.ZLTXConf
RequestBody map[string]string
}
type ZltxOrderRequest struct {
*ZltxOrder
RequestBody map[string]string
}
func NewZltxOrder(conf types.ZLTXConf) *ZltxOrder {
return &ZltxOrder{
Conf: &conf,
}
}
func (r *ZltxOrder) SetData(data map[string]interface{}) *ZltxOrderRequest {
data["timeStamp"] = time.Now().Unix()
a := data
delete(a, "extendParameter")
delete(a, "sign")
data["sign"] = common.ZltxSign(a, "8db16e8cc8363ed4eb4c14f9520bcc32")
//data := common.MergeMaps(common.ToMap(p), common.ToMap(r), common.ToMap(e))*/
requestBody := make(map[string]string, len(data))
for key, value := range data {
requestBody[key] = fmt.Sprintf("%v", value)
}
return &ZltxOrderRequest{
ZltxOrder: r,
RequestBody: requestBody,
}
}
func (r *ZltxOrderRequest) request(url string) (*request.Response, error) {
req := request.Request{
Method: "POST",
Url: fmt.Sprintf("%s%s", r.Conf.Host, url),
Data: r.RequestBody,
}
resp, _ := req.Send()
return &resp, nil
}
func (r *ZltxOrderRequest) RechargeOrder() (*transfer.DefaultRes, error) {
var res transfer.DefaultRes
req, err := r.request(vo.ZLTX_RECHARGE)
if err != nil {
return nil, err
}
_ = json.Unmarshal([]byte(req.Text), &res)
return &res, nil
}
func (r *ZltxOrderRequest) RechargeQuery() (*transfer.ZltxOrderCardQueryRes, error) {
var res transfer.ZltxOrderCardQueryRes
req, err := r.request(vo.ZLTX_RECHARGE_QUERY)
if err != nil {
return nil, err
}
_ = json.Unmarshal([]byte(req.Text), &res)
return &res, nil
}
func (r *ZltxOrderRequest) CardOrder() (*transfer.DefaultRes, error) {
var res transfer.DefaultRes
req, err := r.request(vo.ZLTX_CARD)
if err != nil {
return nil, err
}
_ = json.Unmarshal([]byte(req.Text), &res)
return &res, nil
}
func (r *ZltxOrderRequest) CardQuery() (*transfer.ZltxOrderCardQueryRes, error) {
var res transfer.ZltxOrderCardQueryRes
req, err := r.request(vo.ZLTX_CARD_QUERY)
if err != nil {
return nil, err
}
_ = json.Unmarshal([]byte(req.Text), &res)
return &res, nil
}
func (r *ZltxOrderRequest) OrderSendSms() (*transfer.ZltxOrderSmsRes, error) {
var res transfer.ZltxOrderSmsRes
req, err := r.request(vo.ZLTX_CARD_ISSUE)
if err != nil {
return nil, err
}
_ = json.Unmarshal([]byte(req.Text), &res)
return &res, nil
}
func (r *ZltxOrderRequest) RechargeProduct() (*types.RechargeProductRes, error) {
var res types.RechargeProductRes
req, err := r.request(vo.ZLTX_RECHARGE_PRODUCT)
if err != nil {
return nil, err
}
_ = json.Unmarshal([]byte(req.Text), &res)
return &res, nil
}
func (r *ZltxOrderRequest) RechargeInfo() (*transfer.ZltxRechargeInfoRes, error) {
var res transfer.ZltxRechargeInfoRes
req, err := r.request(vo.ZLTX_RECHARGE_INFO)
if err != nil {
return nil, err
}
_ = json.Unmarshal([]byte(req.Text), &res)
return &res, nil
}

View File

@ -0,0 +1,12 @@
package vo
const (
//券码生成
KEY_SEND = "openApi/v1/market/key/send"
//券码作废
KEY_DISCARD = "openApi/v1/market/key/discard"
//券码详情
KEY_QUERY = "openApi/v1/market/key/query"
)

View File

@ -0,0 +1,24 @@
package vo
const (
// 直充下单
ZLTX_RECHARGE = "recharge/order"
// 直充查询
ZLTX_RECHARGE_QUERY = "recharge/query"
// 卡密下单
ZLTX_CARD = "card/order"
// 卡密查询
ZLTX_CARD_QUERY = "card/query"
// 卡密重发短信
ZLTX_CARD_ISSUE = "card/issue"
// 获取商品列表
ZLTX_RECHARGE_PRODUCT = "recharge/product"
// 余额查询
ZLTX_RECHARGE_INFO = "recharge/info"
)

View File

@ -0,0 +1,35 @@
package logic
import (
"context"
"trasfer_middleware/pkg/common"
"trasfer_middleware/cmd/rpc/internal/svc"
"trasfer_middleware/cmd/rpc/pb/transfer"
"github.com/zeromicro/go-zero/core/logx"
)
type ZltxOrderCardLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewZltxOrderCardLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ZltxOrderCardLogic {
return &ZltxOrderCardLogic{
ctx: ctx,
svcCtx: svcCtx,
Logger: logx.WithContext(ctx),
}
}
func (l *ZltxOrderCardLogic) ZltxOrderCard(in *transfer.ZltxOrderCardReq) (*transfer.DefaultRes, error) {
res, err := l.svcCtx.ZltxOrder.SetData(common.StructToMap(in)).CardOrder()
return &transfer.DefaultRes{
Code: res.Code,
Message: res.Message,
}, err
}

View File

@ -0,0 +1,36 @@
package logic
import (
"context"
"trasfer_middleware/cmd/rpc/internal/svc"
"trasfer_middleware/cmd/rpc/pb/transfer"
"trasfer_middleware/pkg/common"
"github.com/zeromicro/go-zero/core/logx"
)
type ZltxOrderCardQueryLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewZltxOrderCardQueryLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ZltxOrderCardQueryLogic {
return &ZltxOrderCardQueryLogic{
ctx: ctx,
svcCtx: svcCtx,
Logger: logx.WithContext(ctx),
}
}
func (l *ZltxOrderCardQueryLogic) ZltxOrderCardQuery(in *transfer.ZltxOrderCardQueryReq) (*transfer.ZltxOrderCardQueryRes, error) {
res, err := l.svcCtx.ZltxOrder.SetData(common.StructToMap(in)).CardQuery()
return &transfer.ZltxOrderCardQueryRes{
Code: res.Code,
Message: res.Message,
Status: res.Status,
OutTradeNo: res.OutTradeNo,
}, err
}

View File

@ -0,0 +1,33 @@
package logic
import (
"context"
"trasfer_middleware/pkg/common"
"trasfer_middleware/cmd/rpc/internal/svc"
"trasfer_middleware/cmd/rpc/pb/transfer"
"github.com/zeromicro/go-zero/core/logx"
)
type ZltxOrderRechargeLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewZltxOrderRechargeLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ZltxOrderRechargeLogic {
return &ZltxOrderRechargeLogic{
ctx: ctx,
svcCtx: svcCtx,
Logger: logx.WithContext(ctx),
}
}
func (l *ZltxOrderRechargeLogic) ZltxOrderRecharge(in *transfer.ZltxOrderRechargeReq) (*transfer.DefaultRes, error) {
res, err := l.svcCtx.ZltxOrder.SetData(common.StructToMap(in)).RechargeOrder()
return &transfer.DefaultRes{
Code: res.Code,
Message: res.Message,
}, err
}

View File

@ -0,0 +1,34 @@
package logic
import (
"context"
"trasfer_middleware/cmd/rpc/internal/svc"
"trasfer_middleware/cmd/rpc/pb/transfer"
"trasfer_middleware/pkg/common"
"github.com/zeromicro/go-zero/core/logx"
)
type ZltxOrderRechargeQueryLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewZltxOrderRechargeQueryLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ZltxOrderRechargeQueryLogic {
return &ZltxOrderRechargeQueryLogic{
ctx: ctx,
svcCtx: svcCtx,
Logger: logx.WithContext(ctx),
}
}
func (l *ZltxOrderRechargeQueryLogic) ZltxOrderRechargeQuery(in *transfer.ZltxOrderRechargeQueryReq) (*transfer.ZltxOrderRechargeQueryRes, error) {
res, err := l.svcCtx.ZltxOrder.SetData(common.StructToMap(in)).RechargeQuery()
return &transfer.ZltxOrderRechargeQueryRes{
Code: res.Code,
Message: res.Message,
Status: res.Status,
OutTradeNo: res.OutTradeNo,
}, err
}

View File

@ -0,0 +1,33 @@
package logic
import (
"context"
"github.com/jinzhu/copier"
"trasfer_middleware/pkg/common"
"trasfer_middleware/cmd/rpc/internal/svc"
"trasfer_middleware/cmd/rpc/pb/transfer"
"github.com/zeromicro/go-zero/core/logx"
)
type ZltxOrderSmsLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewZltxOrderSmsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ZltxOrderSmsLogic {
return &ZltxOrderSmsLogic{
ctx: ctx,
svcCtx: svcCtx,
Logger: logx.WithContext(ctx),
}
}
func (l *ZltxOrderSmsLogic) ZltxOrderSms(in *transfer.ZltxOrderSmsReq) (*transfer.ZltxOrderSmsRes, error) {
var result = &transfer.ZltxOrderSmsRes{}
res, err := l.svcCtx.ZltxOrder.SetData(common.StructToMap(in)).OrderSendSms()
_ = copier.Copy(result, &res)
return result, err
}

View File

@ -0,0 +1,32 @@
package logic
import (
"context"
"trasfer_middleware/pkg/common"
"trasfer_middleware/cmd/rpc/internal/svc"
"trasfer_middleware/cmd/rpc/pb/transfer"
"github.com/zeromicro/go-zero/core/logx"
)
type ZltxRechargeInfoLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewZltxRechargeInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ZltxRechargeInfoLogic {
return &ZltxRechargeInfoLogic{
ctx: ctx,
svcCtx: svcCtx,
Logger: logx.WithContext(ctx),
}
}
func (l *ZltxRechargeInfoLogic) ZltxRechargeInfo(in *transfer.DefaultReq) (*transfer.ZltxRechargeInfoRes, error) {
res, err := l.svcCtx.ZltxOrder.SetData(common.StructToMap(in)).RechargeInfo()
//_ = copier.Copy(result, &res)
return res, err
}

View File

@ -0,0 +1,33 @@
package logic
import (
"context"
"github.com/jinzhu/copier"
"trasfer_middleware/pkg/common"
"trasfer_middleware/cmd/rpc/internal/svc"
"trasfer_middleware/cmd/rpc/pb/transfer"
"github.com/zeromicro/go-zero/core/logx"
)
type ZltxRechargeProductLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewZltxRechargeProductLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ZltxRechargeProductLogic {
return &ZltxRechargeProductLogic{
ctx: ctx,
svcCtx: svcCtx,
Logger: logx.WithContext(ctx),
}
}
func (l *ZltxRechargeProductLogic) ZltxRechargeProduct(in *transfer.DefaultReq) (*transfer.ZltxRechargeProductRes, error) {
var result = &transfer.ZltxRechargeProductRes{}
res, err := l.svcCtx.ZltxOrder.SetData(common.StructToMap(in)).RechargeProduct()
_ = copier.Copy(result, &res)
return result, err
}

View File

@ -0,0 +1,63 @@
// Code generated by goctl. DO NOT EDIT.
// Source: transfer.proto
package server
import (
"context"
"trasfer_middleware/cmd/rpc/internal/logic"
"trasfer_middleware/cmd/rpc/internal/svc"
"trasfer_middleware/cmd/rpc/pb/transfer"
)
type TransferServer struct {
svcCtx *svc.ServiceContext
transfer.UnimplementedTransferServer
}
func NewTransferServer(svcCtx *svc.ServiceContext) *TransferServer {
return &TransferServer{
svcCtx: svcCtx,
}
}
func (s *TransferServer) GetResellerByAppId(ctx context.Context, in *transfer.GetResellerByAppIdReq) (*transfer.GetResellerByAppIdRes, error) {
l := logic.NewGetResellerByAppIdLogic(ctx, s.svcCtx)
return l.GetResellerByAppId(in)
}
func (s *TransferServer) ZltxOrderRecharge(ctx context.Context, in *transfer.ZltxOrderRechargeReq) (*transfer.DefaultRes, error) {
l := logic.NewZltxOrderRechargeLogic(ctx, s.svcCtx)
return l.ZltxOrderRecharge(in)
}
func (s *TransferServer) ZltxOrderRechargeQuery(ctx context.Context, in *transfer.ZltxOrderRechargeQueryReq) (*transfer.ZltxOrderRechargeQueryRes, error) {
l := logic.NewZltxOrderRechargeQueryLogic(ctx, s.svcCtx)
return l.ZltxOrderRechargeQuery(in)
}
func (s *TransferServer) ZltxOrderCard(ctx context.Context, in *transfer.ZltxOrderCardReq) (*transfer.DefaultRes, error) {
l := logic.NewZltxOrderCardLogic(ctx, s.svcCtx)
return l.ZltxOrderCard(in)
}
func (s *TransferServer) ZltxOrderCardQuery(ctx context.Context, in *transfer.ZltxOrderCardQueryReq) (*transfer.ZltxOrderCardQueryRes, error) {
l := logic.NewZltxOrderCardQueryLogic(ctx, s.svcCtx)
return l.ZltxOrderCardQuery(in)
}
func (s *TransferServer) ZltxOrderSms(ctx context.Context, in *transfer.ZltxOrderSmsReq) (*transfer.ZltxOrderSmsRes, error) {
l := logic.NewZltxOrderSmsLogic(ctx, s.svcCtx)
return l.ZltxOrderSms(in)
}
func (s *TransferServer) ZltxRechargeInfo(ctx context.Context, in *transfer.DefaultReq) (*transfer.ZltxRechargeInfoRes, error) {
l := logic.NewZltxRechargeInfoLogic(ctx, s.svcCtx)
return l.ZltxRechargeInfo(in)
}
func (s *TransferServer) ZltxRechargeProduct(ctx context.Context, in *transfer.DefaultReq) (*transfer.ZltxRechargeProductRes, error) {
l := logic.NewZltxRechargeProductLogic(ctx, s.svcCtx)
return l.ZltxRechargeProduct(in)
}

View File

@ -0,0 +1,57 @@
package svc
import (
"github.com/zeromicro/go-zero/core/stores/redis"
"github.com/zeromicro/go-zero/core/stores/sqlx"
"trasfer_middleware/cmd/rpc/internal/config"
"trasfer_middleware/cmd/rpc/internal/logic/po/zltx"
"trasfer_middleware/genModel"
"trasfer_middleware/genModel/marketReseller"
)
type ServiceContext struct {
Config config.Config
RedisClient *redis.Redis
DbRead *Model
DbWrite *Model
DbReseller *MarkerReseller
ZltxOrder *zltx.ZltxOrder
}
func NewServiceContext(c config.Config) *ServiceContext {
return &ServiceContext{
Config: c,
RedisClient: redis.MustNewRedis(redis.RedisConf{
Host: c.Redis.Host,
Type: c.Redis.Type,
Pass: c.Redis.Pass,
}),
DbRead: DbModel(c.DB.Master.DataSource, c),
DbWrite: DbModel(c.DB.Slave.DataSource, c),
DbReseller: ResellerModel(c.DB.MarketReseller.DataSource, c),
ZltxOrder: zltx.NewZltxOrder(c.ZLTX),
}
}
func DbModel(datasource string, c config.Config) *Model {
sqlConn := sqlx.NewMysql(datasource)
return &Model{
ClientModel: genModel.NewServerClientModel(sqlConn, c.Cache),
}
}
type Model struct {
ClientModel genModel.ServerClientModel
}
func ResellerModel(datasource string, c config.Config) *MarkerReseller {
sqlConn := sqlx.NewMysql(datasource)
return &MarkerReseller{
ResellerMerchant: marketReseller.NewResellerMerchantModel(sqlConn, c.Cache),
}
}
type MarkerReseller struct {
ResellerMerchant marketReseller.ResellerMerchantModel
}

151
cmd/rpc/pb/transfer.proto Executable file
View File

@ -0,0 +1,151 @@
syntax = "proto3";
package transfer;
option go_package="./transfer";
message DefaultRes {
string code=1;
string message=2;
}
message DefaultReq {
string merchantId = 1;
uint64 timeStamp = 2;
string sign = 3;
}
service Zltx {
rpc zltxOrderRecharge(ZltxOrderRechargeReq) returns(DefaultRes);
rpc zltxOrderRechargeQuery(ZltxOrderRechargeQueryReq) returns(ZltxOrderRechargeQueryRes);
rpc zltxOrderCard(ZltxOrderCardReq) returns(DefaultRes);
rpc zltxOrderCardQuery(ZltxOrderCardQueryReq) returns(ZltxOrderCardQueryRes);
rpc zltxOrderSms(ZltxOrderSmsReq) returns(ZltxOrderSmsRes);
rpc zltxRechargeInfo(DefaultReq) returns(ZltxRechargeInfoRes);
rpc zltxRechargeProduct(DefaultReq) returns(ZltxRechargeProductRes);
}
service Market {
rpc zltxOrderRecharge(ZltxOrderRechargeReq) returns(DefaultRes);
rpc zltxOrderRechargeQuery(ZltxOrderRechargeQueryReq) returns(ZltxOrderRechargeQueryRes);
rpc zltxOrderCard(ZltxOrderCardReq) returns(DefaultRes);
rpc zltxOrderCardQuery(ZltxOrderCardQueryReq) returns(ZltxOrderCardQueryRes);
rpc zltxOrderSms(ZltxOrderSmsReq) returns(ZltxOrderSmsRes);
rpc zltxRechargeInfo(DefaultReq) returns(ZltxRechargeInfoRes);
rpc zltxRechargeProduct(DefaultReq) returns(ZltxRechargeProductRes);
}
message ZltxRechargeProductRes {
string code=1;
repeated Product products=2;
message Product{
int64 productId=1;
string channelPrice=2;
string itemName=3;
string originalPrice=4;
}
}
message ZltxRechargeInfoRes {
string code=1;
string balance=2;
}
message ZltxOrderSmsRes {
string code=1;
string message=2;
string status = 3;
string outTradeNo=4;
}
message ZltxOrderSmsReq {
string merchantId = 1;
uint64 timeStamp = 2;
string sign = 3;
string outTradeNo = 4;
}
message ZltxOrderCardQueryRes {
string code=1;
string message=2;
string status = 3;
string outTradeNo=4;
}
message ZltxOrderCardQueryReq {
string merchantId = 1;
uint64 timeStamp = 2;
string sign = 3;
string outTradeNo = 4;
}
message ZltxOrderCardReq {
string merchantId = 1;
string sign = 2;
uint64 timeStamp = 3;
string outTradeNo = 4;
int64 productId=5;
string mobile=6;
uint32 accountType=7;
int32 number=8;
string notifyUrl=9;
string extendParameter=10;
}
message ZltxOrderRechargeQueryRes {
string code=1;
string message=2;
string status = 3;
string outTradeNo=4;
}
message ZltxOrderRechargeQueryReq {
string merchantId = 1;
uint64 timeStamp = 2;
string sign = 3;
string outTradeNo = 4;
}
message ZltxOrderRechargeReq {
string merchantId = 1;
string sign = 2;
uint64 timeStamp = 3;
string outTradeNo = 4;
int64 productId=5;
string mobile=6;
uint32 accountType=7;
int32 number=8;
string notifyUrl=9;
string extendParameter=10;
}
message GetResellerByAppIdReq {
string appId = 1;
}
message GetResellerByAppIdRes {
int64 id=1;
string merchantId=2;
string resellerId=3;
string appId=4;
string posId=5;
string storeId=6;
int32 apiMod=7;
string publicKey=8;
string privateKey=9;
string merchantPublicKey=10;
string secretKey=11;
string notifyUrl=12;
string subscribeEvent=13;
int32 status=14;
string createTime=15;
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,368 @@
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
// versions:
// - protoc-gen-go-grpc v1.3.0
// - protoc v3.6.1
// source: transfer.proto
package transfer
import (
context "context"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
)
// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
// Requires gRPC-Go v1.32.0 or later.
const _ = grpc.SupportPackageIsVersion7
const (
Transfer_GetResellerByAppId_FullMethodName = "/transfer.Transfer/getResellerByAppId"
Transfer_ZltxOrderRecharge_FullMethodName = "/transfer.Transfer/zltxOrderRecharge"
Transfer_ZltxOrderRechargeQuery_FullMethodName = "/transfer.Transfer/zltxOrderRechargeQuery"
Transfer_ZltxOrderCard_FullMethodName = "/transfer.Transfer/zltxOrderCard"
Transfer_ZltxOrderCardQuery_FullMethodName = "/transfer.Transfer/zltxOrderCardQuery"
Transfer_ZltxOrderSms_FullMethodName = "/transfer.Transfer/zltxOrderSms"
Transfer_ZltxRechargeInfo_FullMethodName = "/transfer.Transfer/zltxRechargeInfo"
Transfer_ZltxRechargeProduct_FullMethodName = "/transfer.Transfer/zltxRechargeProduct"
)
// TransferClient is the client API for Transfer service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
type TransferClient interface {
GetResellerByAppId(ctx context.Context, in *GetResellerByAppIdReq, opts ...grpc.CallOption) (*GetResellerByAppIdRes, error)
ZltxOrderRecharge(ctx context.Context, in *ZltxOrderRechargeReq, opts ...grpc.CallOption) (*DefaultRes, error)
ZltxOrderRechargeQuery(ctx context.Context, in *ZltxOrderRechargeQueryReq, opts ...grpc.CallOption) (*ZltxOrderRechargeQueryRes, error)
ZltxOrderCard(ctx context.Context, in *ZltxOrderCardReq, opts ...grpc.CallOption) (*DefaultRes, error)
ZltxOrderCardQuery(ctx context.Context, in *ZltxOrderCardQueryReq, opts ...grpc.CallOption) (*ZltxOrderCardQueryRes, error)
ZltxOrderSms(ctx context.Context, in *ZltxOrderSmsReq, opts ...grpc.CallOption) (*ZltxOrderSmsRes, error)
ZltxRechargeInfo(ctx context.Context, in *DefaultReq, opts ...grpc.CallOption) (*ZltxRechargeInfoRes, error)
ZltxRechargeProduct(ctx context.Context, in *DefaultReq, opts ...grpc.CallOption) (*ZltxRechargeProductRes, error)
}
type transferClient struct {
cc grpc.ClientConnInterface
}
func NewTransferClient(cc grpc.ClientConnInterface) TransferClient {
return &transferClient{cc}
}
func (c *transferClient) GetResellerByAppId(ctx context.Context, in *GetResellerByAppIdReq, opts ...grpc.CallOption) (*GetResellerByAppIdRes, error) {
out := new(GetResellerByAppIdRes)
err := c.cc.Invoke(ctx, Transfer_GetResellerByAppId_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *transferClient) ZltxOrderRecharge(ctx context.Context, in *ZltxOrderRechargeReq, opts ...grpc.CallOption) (*DefaultRes, error) {
out := new(DefaultRes)
err := c.cc.Invoke(ctx, Transfer_ZltxOrderRecharge_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *transferClient) ZltxOrderRechargeQuery(ctx context.Context, in *ZltxOrderRechargeQueryReq, opts ...grpc.CallOption) (*ZltxOrderRechargeQueryRes, error) {
out := new(ZltxOrderRechargeQueryRes)
err := c.cc.Invoke(ctx, Transfer_ZltxOrderRechargeQuery_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *transferClient) ZltxOrderCard(ctx context.Context, in *ZltxOrderCardReq, opts ...grpc.CallOption) (*DefaultRes, error) {
out := new(DefaultRes)
err := c.cc.Invoke(ctx, Transfer_ZltxOrderCard_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *transferClient) ZltxOrderCardQuery(ctx context.Context, in *ZltxOrderCardQueryReq, opts ...grpc.CallOption) (*ZltxOrderCardQueryRes, error) {
out := new(ZltxOrderCardQueryRes)
err := c.cc.Invoke(ctx, Transfer_ZltxOrderCardQuery_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *transferClient) ZltxOrderSms(ctx context.Context, in *ZltxOrderSmsReq, opts ...grpc.CallOption) (*ZltxOrderSmsRes, error) {
out := new(ZltxOrderSmsRes)
err := c.cc.Invoke(ctx, Transfer_ZltxOrderSms_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *transferClient) ZltxRechargeInfo(ctx context.Context, in *DefaultReq, opts ...grpc.CallOption) (*ZltxRechargeInfoRes, error) {
out := new(ZltxRechargeInfoRes)
err := c.cc.Invoke(ctx, Transfer_ZltxRechargeInfo_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *transferClient) ZltxRechargeProduct(ctx context.Context, in *DefaultReq, opts ...grpc.CallOption) (*ZltxRechargeProductRes, error) {
out := new(ZltxRechargeProductRes)
err := c.cc.Invoke(ctx, Transfer_ZltxRechargeProduct_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// TransferServer is the server API for Transfer service.
// All implementations must embed UnimplementedTransferServer
// for forward compatibility
type TransferServer interface {
GetResellerByAppId(context.Context, *GetResellerByAppIdReq) (*GetResellerByAppIdRes, error)
ZltxOrderRecharge(context.Context, *ZltxOrderRechargeReq) (*DefaultRes, error)
ZltxOrderRechargeQuery(context.Context, *ZltxOrderRechargeQueryReq) (*ZltxOrderRechargeQueryRes, error)
ZltxOrderCard(context.Context, *ZltxOrderCardReq) (*DefaultRes, error)
ZltxOrderCardQuery(context.Context, *ZltxOrderCardQueryReq) (*ZltxOrderCardQueryRes, error)
ZltxOrderSms(context.Context, *ZltxOrderSmsReq) (*ZltxOrderSmsRes, error)
ZltxRechargeInfo(context.Context, *DefaultReq) (*ZltxRechargeInfoRes, error)
ZltxRechargeProduct(context.Context, *DefaultReq) (*ZltxRechargeProductRes, error)
mustEmbedUnimplementedTransferServer()
}
// UnimplementedTransferServer must be embedded to have forward compatible implementations.
type UnimplementedTransferServer struct {
}
func (UnimplementedTransferServer) GetResellerByAppId(context.Context, *GetResellerByAppIdReq) (*GetResellerByAppIdRes, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetResellerByAppId not implemented")
}
func (UnimplementedTransferServer) ZltxOrderRecharge(context.Context, *ZltxOrderRechargeReq) (*DefaultRes, error) {
return nil, status.Errorf(codes.Unimplemented, "method ZltxOrderRecharge not implemented")
}
func (UnimplementedTransferServer) ZltxOrderRechargeQuery(context.Context, *ZltxOrderRechargeQueryReq) (*ZltxOrderRechargeQueryRes, error) {
return nil, status.Errorf(codes.Unimplemented, "method ZltxOrderRechargeQuery not implemented")
}
func (UnimplementedTransferServer) ZltxOrderCard(context.Context, *ZltxOrderCardReq) (*DefaultRes, error) {
return nil, status.Errorf(codes.Unimplemented, "method ZltxOrderCard not implemented")
}
func (UnimplementedTransferServer) ZltxOrderCardQuery(context.Context, *ZltxOrderCardQueryReq) (*ZltxOrderCardQueryRes, error) {
return nil, status.Errorf(codes.Unimplemented, "method ZltxOrderCardQuery not implemented")
}
func (UnimplementedTransferServer) ZltxOrderSms(context.Context, *ZltxOrderSmsReq) (*ZltxOrderSmsRes, error) {
return nil, status.Errorf(codes.Unimplemented, "method ZltxOrderSms not implemented")
}
func (UnimplementedTransferServer) ZltxRechargeInfo(context.Context, *DefaultReq) (*ZltxRechargeInfoRes, error) {
return nil, status.Errorf(codes.Unimplemented, "method ZltxRechargeInfo not implemented")
}
func (UnimplementedTransferServer) ZltxRechargeProduct(context.Context, *DefaultReq) (*ZltxRechargeProductRes, error) {
return nil, status.Errorf(codes.Unimplemented, "method ZltxRechargeProduct not implemented")
}
func (UnimplementedTransferServer) mustEmbedUnimplementedTransferServer() {}
// UnsafeTransferServer may be embedded to opt out of forward compatibility for this service.
// Use of this interface is not recommended, as added methods to TransferServer will
// result in compilation errors.
type UnsafeTransferServer interface {
mustEmbedUnimplementedTransferServer()
}
func RegisterTransferServer(s grpc.ServiceRegistrar, srv TransferServer) {
s.RegisterService(&Transfer_ServiceDesc, srv)
}
func _Transfer_GetResellerByAppId_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(GetResellerByAppIdReq)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(TransferServer).GetResellerByAppId(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: Transfer_GetResellerByAppId_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(TransferServer).GetResellerByAppId(ctx, req.(*GetResellerByAppIdReq))
}
return interceptor(ctx, in, info, handler)
}
func _Transfer_ZltxOrderRecharge_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ZltxOrderRechargeReq)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(TransferServer).ZltxOrderRecharge(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: Transfer_ZltxOrderRecharge_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(TransferServer).ZltxOrderRecharge(ctx, req.(*ZltxOrderRechargeReq))
}
return interceptor(ctx, in, info, handler)
}
func _Transfer_ZltxOrderRechargeQuery_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ZltxOrderRechargeQueryReq)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(TransferServer).ZltxOrderRechargeQuery(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: Transfer_ZltxOrderRechargeQuery_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(TransferServer).ZltxOrderRechargeQuery(ctx, req.(*ZltxOrderRechargeQueryReq))
}
return interceptor(ctx, in, info, handler)
}
func _Transfer_ZltxOrderCard_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ZltxOrderCardReq)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(TransferServer).ZltxOrderCard(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: Transfer_ZltxOrderCard_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(TransferServer).ZltxOrderCard(ctx, req.(*ZltxOrderCardReq))
}
return interceptor(ctx, in, info, handler)
}
func _Transfer_ZltxOrderCardQuery_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ZltxOrderCardQueryReq)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(TransferServer).ZltxOrderCardQuery(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: Transfer_ZltxOrderCardQuery_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(TransferServer).ZltxOrderCardQuery(ctx, req.(*ZltxOrderCardQueryReq))
}
return interceptor(ctx, in, info, handler)
}
func _Transfer_ZltxOrderSms_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ZltxOrderSmsReq)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(TransferServer).ZltxOrderSms(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: Transfer_ZltxOrderSms_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(TransferServer).ZltxOrderSms(ctx, req.(*ZltxOrderSmsReq))
}
return interceptor(ctx, in, info, handler)
}
func _Transfer_ZltxRechargeInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(DefaultReq)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(TransferServer).ZltxRechargeInfo(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: Transfer_ZltxRechargeInfo_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(TransferServer).ZltxRechargeInfo(ctx, req.(*DefaultReq))
}
return interceptor(ctx, in, info, handler)
}
func _Transfer_ZltxRechargeProduct_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(DefaultReq)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(TransferServer).ZltxRechargeProduct(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: Transfer_ZltxRechargeProduct_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(TransferServer).ZltxRechargeProduct(ctx, req.(*DefaultReq))
}
return interceptor(ctx, in, info, handler)
}
// Transfer_ServiceDesc is the grpc.ServiceDesc for Transfer service.
// It's only intended for direct use with grpc.RegisterService,
// and not to be introspected or modified (even as a copy)
var Transfer_ServiceDesc = grpc.ServiceDesc{
ServiceName: "transfer.Transfer",
HandlerType: (*TransferServer)(nil),
Methods: []grpc.MethodDesc{
{
MethodName: "getResellerByAppId",
Handler: _Transfer_GetResellerByAppId_Handler,
},
{
MethodName: "zltxOrderRecharge",
Handler: _Transfer_ZltxOrderRecharge_Handler,
},
{
MethodName: "zltxOrderRechargeQuery",
Handler: _Transfer_ZltxOrderRechargeQuery_Handler,
},
{
MethodName: "zltxOrderCard",
Handler: _Transfer_ZltxOrderCard_Handler,
},
{
MethodName: "zltxOrderCardQuery",
Handler: _Transfer_ZltxOrderCardQuery_Handler,
},
{
MethodName: "zltxOrderSms",
Handler: _Transfer_ZltxOrderSms_Handler,
},
{
MethodName: "zltxRechargeInfo",
Handler: _Transfer_ZltxRechargeInfo_Handler,
},
{
MethodName: "zltxRechargeProduct",
Handler: _Transfer_ZltxRechargeProduct_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "transfer.proto",
}

65
cmd/rpc/transfer.go Executable file
View File

@ -0,0 +1,65 @@
package main
import (
"flag"
"fmt"
"github.com/nacos-group/nacos-sdk-go/v2/common/constant"
"github.com/zeromicro/zero-contrib/zrpc/registry/nacos"
"strconv"
"strings"
"trasfer_middleware/cmd/rpc/internal/config"
"trasfer_middleware/cmd/rpc/internal/server"
"trasfer_middleware/cmd/rpc/internal/svc"
"trasfer_middleware/cmd/rpc/pb/transfer"
"github.com/zeromicro/go-zero/core/conf"
"github.com/zeromicro/go-zero/core/service"
"github.com/zeromicro/go-zero/zrpc"
"google.golang.org/grpc"
"google.golang.org/grpc/reflection"
)
var configFile = flag.String("f", "../../config/transfer.yaml", "the config file")
func main() {
flag.Parse()
var c config.Config
conf.MustLoad(*configFile, &c)
ctx := svc.NewServiceContext(c)
s := zrpc.MustNewServer(c.RpcServerConf, func(grpcServer *grpc.Server) {
transfer.RegisterTransferServer(grpcServer, server.NewTransferServer(ctx))
if c.Mode == service.DevMode || c.Mode == service.TestMode {
reflection.Register(grpcServer)
}
})
registerNacos(&c)
defer s.Stop()
fmt.Printf("Starting rpc server at %s...\n", c.ListenOn)
s.Start()
}
func registerNacos(c *config.Config) {
sc := []constant.ServerConfig{}
for _, v := range c.Nacos.Hosts {
splitSlice := strings.Split(v, ":")
port, _ := strconv.Atoi(splitSlice[1])
sc = append(sc, *constant.NewServerConfig(splitSlice[0], uint64(port)))
}
cc := &constant.ClientConfig{
NamespaceId: c.Nacos.NameSpace,
TimeoutMs: c.Nacos.TimeOut,
NotLoadCacheAtStart: true,
LogDir: "/tmp/nacos/log",
CacheDir: "/tmp/nacos/cache",
LogLevel: "debug",
}
opts := nacos.NewNacosConfig(c.Nacos.ServiceName, c.ListenOn, sc, cc)
err := nacos.RegisterService(opts)
if err != nil {
panic(err)
}
}

View File

@ -0,0 +1,27 @@
package marketReseller
import (
"github.com/zeromicro/go-zero/core/stores/cache"
"github.com/zeromicro/go-zero/core/stores/sqlx"
)
var _ ResellerMerchantModel = (*customResellerMerchantModel)(nil)
type (
// ResellerMerchantModel is an interface to be customized, add more methods here,
// and implement the added methods in customResellerMerchantModel.
ResellerMerchantModel interface {
resellerMerchantModel
}
customResellerMerchantModel struct {
*defaultResellerMerchantModel
}
)
// NewResellerMerchantModel returns a model for the database table.
func NewResellerMerchantModel(conn sqlx.SqlConn, c cache.CacheConf, opts ...cache.Option) ResellerMerchantModel {
return &customResellerMerchantModel{
defaultResellerMerchantModel: newResellerMerchantModel(conn, c, opts...),
}
}

View File

@ -0,0 +1,208 @@
// Code generated by goctl. DO NOT EDIT.
package marketReseller
import (
"context"
"database/sql"
"fmt"
"strings"
"time"
"github.com/zeromicro/go-zero/core/stores/builder"
"github.com/zeromicro/go-zero/core/stores/cache"
"github.com/zeromicro/go-zero/core/stores/sqlc"
"github.com/zeromicro/go-zero/core/stores/sqlx"
"github.com/zeromicro/go-zero/core/stringx"
)
var (
resellerMerchantFieldNames = builder.RawFieldNames(&ResellerMerchant{})
resellerMerchantRows = strings.Join(resellerMerchantFieldNames, ",")
resellerMerchantRowsExpectAutoSet = strings.Join(stringx.Remove(resellerMerchantFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), ",")
resellerMerchantRowsWithPlaceHolder = strings.Join(stringx.Remove(resellerMerchantFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), "=?,") + "=?"
cacheResellerResellerMerchantIdPrefix = "cache:reseller:resellerMerchant:id:"
cacheResellerResellerMerchantAppIdPrefix = "cache:reseller:resellerMerchant:appId:"
cacheResellerResellerMerchantMerchantIdPrefix = "cache:reseller:resellerMerchant:merchantId:"
cacheResellerResellerMerchantPosIdPrefix = "cache:reseller:resellerMerchant:posId:"
)
type (
resellerMerchantModel interface {
Insert(ctx context.Context, data *ResellerMerchant) (sql.Result, error)
FindOne(ctx context.Context, id uint64) (*ResellerMerchant, error)
FindOneByAppId(ctx context.Context, appId string) (*ResellerMerchant, error)
FindOneByMerchantId(ctx context.Context, merchantId string) (*ResellerMerchant, error)
FindOneByPosId(ctx context.Context, posId string) (*ResellerMerchant, error)
Update(ctx context.Context, data *ResellerMerchant) error
Delete(ctx context.Context, id uint64) error
}
defaultResellerMerchantModel struct {
sqlc.CachedConn
table string
}
ResellerMerchant struct {
Id uint64 `db:"id"`
MerchantId string `db:"merchant_id"` // 商户号
ResellerId uint64 `db:"reseller_id"` // 分销商id
PosId string `db:"pos_id"` // 平台id 目前都是单平台
AppId string `db:"app_id"` // appid。目前都是单应用 通知地址 事件地址都针对于这一个应用配置
StoreId string `db:"store_id"` // 没有门店,兴业银行需求。 当作后期的扩展字段
ApiMode int64 `db:"api_mode"` // 对接类型 1-RSA+标准接口返回【默认】2-兴业银行模式
PublicKey sql.NullString `db:"public_key"` // 公钥
PrivateKey sql.NullString `db:"private_key"` // 私钥
MerchantPublicKey sql.NullString `db:"merchant_public_key"` // 客户侧公钥
SecretKey string `db:"secret_key"` // body加解密密钥
NotifyUrl sql.NullString `db:"notify_url"` // 通知地址配置
SubscribeEvent sql.NullString `db:"subscribe_event"` // 订阅事件
Status uint64 `db:"status"` // 状态 1正常 2禁用
UpdateTime sql.NullTime `db:"update_time"` // 编辑时间
CreateTime time.Time `db:"create_time"` // 创建时间
}
)
func newResellerMerchantModel(conn sqlx.SqlConn, c cache.CacheConf, opts ...cache.Option) *defaultResellerMerchantModel {
return &defaultResellerMerchantModel{
CachedConn: sqlc.NewConn(conn, c, opts...),
table: "`reseller_merchant`",
}
}
func (m *defaultResellerMerchantModel) Delete(ctx context.Context, id uint64) error {
data, err := m.FindOne(ctx, id)
if err != nil {
return err
}
resellerResellerMerchantAppIdKey := fmt.Sprintf("%s%v", cacheResellerResellerMerchantAppIdPrefix, data.AppId)
resellerResellerMerchantIdKey := fmt.Sprintf("%s%v", cacheResellerResellerMerchantIdPrefix, id)
resellerResellerMerchantMerchantIdKey := fmt.Sprintf("%s%v", cacheResellerResellerMerchantMerchantIdPrefix, data.MerchantId)
resellerResellerMerchantPosIdKey := fmt.Sprintf("%s%v", cacheResellerResellerMerchantPosIdPrefix, data.PosId)
_, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) {
query := fmt.Sprintf("delete from %s where `id` = ?", m.table)
return conn.ExecCtx(ctx, query, id)
}, resellerResellerMerchantAppIdKey, resellerResellerMerchantIdKey, resellerResellerMerchantMerchantIdKey, resellerResellerMerchantPosIdKey)
return err
}
func (m *defaultResellerMerchantModel) FindOne(ctx context.Context, id uint64) (*ResellerMerchant, error) {
resellerResellerMerchantIdKey := fmt.Sprintf("%s%v", cacheResellerResellerMerchantIdPrefix, id)
var resp ResellerMerchant
err := m.QueryRowCtx(ctx, &resp, resellerResellerMerchantIdKey, func(ctx context.Context, conn sqlx.SqlConn, v any) error {
query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", resellerMerchantRows, m.table)
return conn.QueryRowCtx(ctx, v, query, id)
})
switch err {
case nil:
return &resp, nil
case sqlc.ErrNotFound:
return nil, ErrNotFound
default:
return nil, err
}
}
func (m *defaultResellerMerchantModel) FindOneByAppId(ctx context.Context, appId string) (*ResellerMerchant, error) {
resellerResellerMerchantAppIdKey := fmt.Sprintf("%s%v", cacheResellerResellerMerchantAppIdPrefix, appId)
var resp ResellerMerchant
err := m.QueryRowIndexCtx(ctx, &resp, resellerResellerMerchantAppIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v any) (i any, e error) {
query := fmt.Sprintf("select %s from %s where `app_id` = ? limit 1", resellerMerchantRows, m.table)
if err := conn.QueryRowCtx(ctx, &resp, query, appId); err != nil {
return nil, err
}
return resp.Id, nil
}, m.queryPrimary)
switch err {
case nil:
return &resp, nil
case sqlc.ErrNotFound:
return nil, ErrNotFound
default:
return nil, err
}
}
func (m *defaultResellerMerchantModel) FindOneByMerchantId(ctx context.Context, merchantId string) (*ResellerMerchant, error) {
resellerResellerMerchantMerchantIdKey := fmt.Sprintf("%s%v", cacheResellerResellerMerchantMerchantIdPrefix, merchantId)
var resp ResellerMerchant
err := m.QueryRowIndexCtx(ctx, &resp, resellerResellerMerchantMerchantIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v any) (i any, e error) {
query := fmt.Sprintf("select %s from %s where `merchant_id` = ? limit 1", resellerMerchantRows, m.table)
if err := conn.QueryRowCtx(ctx, &resp, query, merchantId); err != nil {
return nil, err
}
return resp.Id, nil
}, m.queryPrimary)
switch err {
case nil:
return &resp, nil
case sqlc.ErrNotFound:
return nil, ErrNotFound
default:
return nil, err
}
}
func (m *defaultResellerMerchantModel) FindOneByPosId(ctx context.Context, posId string) (*ResellerMerchant, error) {
resellerResellerMerchantPosIdKey := fmt.Sprintf("%s%v", cacheResellerResellerMerchantPosIdPrefix, posId)
var resp ResellerMerchant
err := m.QueryRowIndexCtx(ctx, &resp, resellerResellerMerchantPosIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v any) (i any, e error) {
query := fmt.Sprintf("select %s from %s where `pos_id` = ? limit 1", resellerMerchantRows, m.table)
if err := conn.QueryRowCtx(ctx, &resp, query, posId); err != nil {
return nil, err
}
return resp.Id, nil
}, m.queryPrimary)
switch err {
case nil:
return &resp, nil
case sqlc.ErrNotFound:
return nil, ErrNotFound
default:
return nil, err
}
}
func (m *defaultResellerMerchantModel) Insert(ctx context.Context, data *ResellerMerchant) (sql.Result, error) {
resellerResellerMerchantAppIdKey := fmt.Sprintf("%s%v", cacheResellerResellerMerchantAppIdPrefix, data.AppId)
resellerResellerMerchantIdKey := fmt.Sprintf("%s%v", cacheResellerResellerMerchantIdPrefix, data.Id)
resellerResellerMerchantMerchantIdKey := fmt.Sprintf("%s%v", cacheResellerResellerMerchantMerchantIdPrefix, data.MerchantId)
resellerResellerMerchantPosIdKey := fmt.Sprintf("%s%v", cacheResellerResellerMerchantPosIdPrefix, data.PosId)
ret, err := m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) {
query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, resellerMerchantRowsExpectAutoSet)
return conn.ExecCtx(ctx, query, data.MerchantId, data.ResellerId, data.PosId, data.AppId, data.StoreId, data.ApiMode, data.PublicKey, data.PrivateKey, data.MerchantPublicKey, data.SecretKey, data.NotifyUrl, data.SubscribeEvent, data.Status)
}, resellerResellerMerchantAppIdKey, resellerResellerMerchantIdKey, resellerResellerMerchantMerchantIdKey, resellerResellerMerchantPosIdKey)
return ret, err
}
func (m *defaultResellerMerchantModel) Update(ctx context.Context, newData *ResellerMerchant) error {
data, err := m.FindOne(ctx, newData.Id)
if err != nil {
return err
}
resellerResellerMerchantAppIdKey := fmt.Sprintf("%s%v", cacheResellerResellerMerchantAppIdPrefix, data.AppId)
resellerResellerMerchantIdKey := fmt.Sprintf("%s%v", cacheResellerResellerMerchantIdPrefix, data.Id)
resellerResellerMerchantMerchantIdKey := fmt.Sprintf("%s%v", cacheResellerResellerMerchantMerchantIdPrefix, data.MerchantId)
resellerResellerMerchantPosIdKey := fmt.Sprintf("%s%v", cacheResellerResellerMerchantPosIdPrefix, data.PosId)
_, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) {
query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, resellerMerchantRowsWithPlaceHolder)
return conn.ExecCtx(ctx, query, newData.MerchantId, newData.ResellerId, newData.PosId, newData.AppId, newData.StoreId, newData.ApiMode, newData.PublicKey, newData.PrivateKey, newData.MerchantPublicKey, newData.SecretKey, newData.NotifyUrl, newData.SubscribeEvent, newData.Status, newData.Id)
}, resellerResellerMerchantAppIdKey, resellerResellerMerchantIdKey, resellerResellerMerchantMerchantIdKey, resellerResellerMerchantPosIdKey)
return err
}
func (m *defaultResellerMerchantModel) formatPrimary(primary any) string {
return fmt.Sprintf("%s%v", cacheResellerResellerMerchantIdPrefix, primary)
}
func (m *defaultResellerMerchantModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary any) error {
query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", resellerMerchantRows, m.table)
return conn.QueryRowCtx(ctx, v, query, primary)
}
func (m *defaultResellerMerchantModel) tableName() string {
return m.table
}

View File

@ -0,0 +1,27 @@
package marketReseller
import (
"github.com/zeromicro/go-zero/core/stores/cache"
"github.com/zeromicro/go-zero/core/stores/sqlx"
)
var _ ResellerModel = (*customResellerModel)(nil)
type (
// ResellerModel is an interface to be customized, add more methods here,
// and implement the added methods in customResellerModel.
ResellerModel interface {
resellerModel
}
customResellerModel struct {
*defaultResellerModel
}
)
// NewResellerModel returns a model for the database table.
func NewResellerModel(conn sqlx.SqlConn, c cache.CacheConf, opts ...cache.Option) ResellerModel {
return &customResellerModel{
defaultResellerModel: newResellerModel(conn, c, opts...),
}
}

View File

@ -0,0 +1,134 @@
// Code generated by goctl. DO NOT EDIT.
package marketReseller
import (
"context"
"database/sql"
"fmt"
"strings"
"time"
"github.com/zeromicro/go-zero/core/stores/builder"
"github.com/zeromicro/go-zero/core/stores/cache"
"github.com/zeromicro/go-zero/core/stores/sqlc"
"github.com/zeromicro/go-zero/core/stores/sqlx"
"github.com/zeromicro/go-zero/core/stringx"
)
var (
resellerFieldNames = builder.RawFieldNames(&Reseller{})
resellerRows = strings.Join(resellerFieldNames, ",")
resellerRowsExpectAutoSet = strings.Join(stringx.Remove(resellerFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), ",")
resellerRowsWithPlaceHolder = strings.Join(stringx.Remove(resellerFieldNames, "`id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), "=?,") + "=?"
cacheResellerResellerIdPrefix = "cache:reseller:reseller:id:"
)
type (
resellerModel interface {
Insert(ctx context.Context, data *Reseller) (sql.Result, error)
FindOne(ctx context.Context, id uint64) (*Reseller, error)
Update(ctx context.Context, data *Reseller) error
Delete(ctx context.Context, id uint64) error
}
defaultResellerModel struct {
sqlc.CachedConn
table string
}
Reseller struct {
Id uint64 `db:"id"` // 主键
Creator int64 `db:"creator"` // 操作人员
Code string `db:"code"` // 分销商编号
Name string `db:"name"` // 分销商名称
Subject string `db:"subject"` // 分销商主体
Account string `db:"account"` // 登录账号
Password string `db:"password"` // 登录密码
Status uint64 `db:"status"` // 分销商账号状态
HeadImg string `db:"head_img"` // 头像
SalesmanId uint64 `db:"salesman_id"` // 销售人员ID,后台用户表ID
SalesmanName string `db:"salesman_name"` // 销售人员名称
CompanyId uint64 `db:"company_id"` // 所属公司公司表ID
CompanyName string `db:"company_name"` // 公司名称
IdentityType uint64 `db:"identity_type"` // 身份类型
Balance float64 `db:"balance"` // 分销商余额
BalanceWarning float64 `db:"balance_warning"` // 余额预警
FrozenAmount float64 `db:"frozen_amount"` // 冻结金额
CreditAmount float64 `db:"credit_amount"` // 授信金额
TotalConsumption float64 `db:"total_consumption"` // 累计消费
ContactName string `db:"contact_name"` // 联系人名称
ContactPhone string `db:"contact_phone"` // 联系人电话
ContactEmail string `db:"contact_email"` // 联系人Email多个逗号(,)用逗号分开
CreateTime time.Time `db:"create_time"` // 创建时间
UpdateTime sql.NullTime `db:"update_time"` // 编辑时间
DeleteTime sql.NullTime `db:"delete_time"` // 删除时间
DirectResellerId uint64 `db:"direct_reseller_id"` // 直连天下分销商映射ID
MapTime sql.NullTime `db:"map_time"` // 映射时间
}
)
func newResellerModel(conn sqlx.SqlConn, c cache.CacheConf, opts ...cache.Option) *defaultResellerModel {
return &defaultResellerModel{
CachedConn: sqlc.NewConn(conn, c, opts...),
table: "`reseller`",
}
}
func (m *defaultResellerModel) Delete(ctx context.Context, id uint64) error {
resellerResellerIdKey := fmt.Sprintf("%s%v", cacheResellerResellerIdPrefix, id)
_, err := m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) {
query := fmt.Sprintf("delete from %s where `id` = ?", m.table)
return conn.ExecCtx(ctx, query, id)
}, resellerResellerIdKey)
return err
}
func (m *defaultResellerModel) FindOne(ctx context.Context, id uint64) (*Reseller, error) {
resellerResellerIdKey := fmt.Sprintf("%s%v", cacheResellerResellerIdPrefix, id)
var resp Reseller
err := m.QueryRowCtx(ctx, &resp, resellerResellerIdKey, func(ctx context.Context, conn sqlx.SqlConn, v any) error {
query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", resellerRows, m.table)
return conn.QueryRowCtx(ctx, v, query, id)
})
switch err {
case nil:
return &resp, nil
case sqlc.ErrNotFound:
return nil, ErrNotFound
default:
return nil, err
}
}
func (m *defaultResellerModel) Insert(ctx context.Context, data *Reseller) (sql.Result, error) {
resellerResellerIdKey := fmt.Sprintf("%s%v", cacheResellerResellerIdPrefix, data.Id)
ret, err := m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) {
query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, resellerRowsExpectAutoSet)
return conn.ExecCtx(ctx, query, data.Creator, data.Code, data.Name, data.Subject, data.Account, data.Password, data.Status, data.HeadImg, data.SalesmanId, data.SalesmanName, data.CompanyId, data.CompanyName, data.IdentityType, data.Balance, data.BalanceWarning, data.FrozenAmount, data.CreditAmount, data.TotalConsumption, data.ContactName, data.ContactPhone, data.ContactEmail, data.DeleteTime, data.DirectResellerId, data.MapTime)
}, resellerResellerIdKey)
return ret, err
}
func (m *defaultResellerModel) Update(ctx context.Context, data *Reseller) error {
resellerResellerIdKey := fmt.Sprintf("%s%v", cacheResellerResellerIdPrefix, data.Id)
_, err := m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) {
query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, resellerRowsWithPlaceHolder)
return conn.ExecCtx(ctx, query, data.Creator, data.Code, data.Name, data.Subject, data.Account, data.Password, data.Status, data.HeadImg, data.SalesmanId, data.SalesmanName, data.CompanyId, data.CompanyName, data.IdentityType, data.Balance, data.BalanceWarning, data.FrozenAmount, data.CreditAmount, data.TotalConsumption, data.ContactName, data.ContactPhone, data.ContactEmail, data.DeleteTime, data.DirectResellerId, data.MapTime, data.Id)
}, resellerResellerIdKey)
return err
}
func (m *defaultResellerModel) formatPrimary(primary any) string {
return fmt.Sprintf("%s%v", cacheResellerResellerIdPrefix, primary)
}
func (m *defaultResellerModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary any) error {
query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", resellerRows, m.table)
return conn.QueryRowCtx(ctx, v, query, primary)
}
func (m *defaultResellerModel) tableName() string {
return m.table
}

View File

@ -0,0 +1,5 @@
package marketReseller
import "github.com/zeromicro/go-zero/core/stores/sqlx"
var ErrNotFound = sqlx.ErrNotFound

27
genModel/serverClientModel.go Executable file
View File

@ -0,0 +1,27 @@
package genModel
import (
"github.com/zeromicro/go-zero/core/stores/cache"
"github.com/zeromicro/go-zero/core/stores/sqlx"
)
var _ ServerClientModel = (*customServerClientModel)(nil)
type (
// ServerClientModel is an interface to be customized, add more methods here,
// and implement the added methods in customServerClientModel.
ServerClientModel interface {
serverClientModel
}
customServerClientModel struct {
*defaultServerClientModel
}
)
// NewServerClientModel returns a model for the database table.
func NewServerClientModel(conn sqlx.SqlConn, c cache.CacheConf, opts ...cache.Option) ServerClientModel {
return &customServerClientModel{
defaultServerClientModel: newServerClientModel(conn, c, opts...),
}
}

134
genModel/serverClientModel_gen.go Executable file
View File

@ -0,0 +1,134 @@
// Code generated by goctl. DO NOT EDIT.
package genModel
import (
"context"
"database/sql"
"fmt"
"strings"
"time"
"github.com/zeromicro/go-zero/core/stores/builder"
"github.com/zeromicro/go-zero/core/stores/cache"
"github.com/zeromicro/go-zero/core/stores/sqlc"
"github.com/zeromicro/go-zero/core/stores/sqlx"
"github.com/zeromicro/go-zero/core/stringx"
)
var (
serverClientFieldNames = builder.RawFieldNames(&ServerClient{})
serverClientRows = strings.Join(serverClientFieldNames, ",")
serverClientRowsExpectAutoSet = strings.Join(stringx.Remove(serverClientFieldNames, "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), ",")
serverClientRowsWithPlaceHolder = strings.Join(stringx.Remove(serverClientFieldNames, "`client_id`", "`create_at`", "`create_time`", "`created_at`", "`update_at`", "`update_time`", "`updated_at`"), "=?,") + "=?"
cacheTransferServerClientClientIdPrefix = "cache:transfer:serverClient:clientId:"
cacheTransferServerClientClientIndexPrefix = "cache:transfer:serverClient:clientIndex:"
)
type (
serverClientModel interface {
Insert(ctx context.Context, data *ServerClient) (sql.Result, error)
FindOne(ctx context.Context, clientId int64) (*ServerClient, error)
Update(ctx context.Context, data *ServerClient) error
Delete(ctx context.Context, clientId int64) error
FindOneByIndex(ctx context.Context, index string) (*ServerClient, error)
}
defaultServerClientModel struct {
sqlc.CachedConn
table string
}
ServerClient struct {
ClientId int64 `db:"client_id"`
ClientName string `db:"client_name"` // 客户名称
ClientIndex string `db:"client_index"` // 客户索引
ZltxMerchantId int64 `db:"zltx_merchant_id"`
ZltxSecret string `db:"zltx_secret"`
CreateTime time.Time `db:"create_time"`
UpdateTime time.Time `db:"update_time"`
Status int64 `db:"status"`
}
)
func newServerClientModel(conn sqlx.SqlConn, c cache.CacheConf, opts ...cache.Option) *defaultServerClientModel {
return &defaultServerClientModel{
CachedConn: sqlc.NewConn(conn, c, opts...),
table: "`server_client`",
}
}
func (m *defaultServerClientModel) Delete(ctx context.Context, clientId int64) error {
transferServerClientClientIdKey := fmt.Sprintf("%s%v", cacheTransferServerClientClientIdPrefix, clientId)
_, err := m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) {
query := fmt.Sprintf("delete from %s where `client_id` = ?", m.table)
return conn.ExecCtx(ctx, query, clientId)
}, transferServerClientClientIdKey)
return err
}
func (m *defaultServerClientModel) FindOne(ctx context.Context, clientId int64) (*ServerClient, error) {
transferServerClientClientIdKey := fmt.Sprintf("%s%v", cacheTransferServerClientClientIdPrefix, clientId)
var resp ServerClient
err := m.QueryRowCtx(ctx, &resp, transferServerClientClientIdKey, func(ctx context.Context, conn sqlx.SqlConn, v any) error {
query := fmt.Sprintf("select %s from %s where `client_id` = ? limit 1", serverClientRows, m.table)
return conn.QueryRowCtx(ctx, v, query, clientId)
})
switch err {
case nil:
return &resp, nil
case sqlc.ErrNotFound:
return nil, ErrNotFound
default:
return nil, err
}
}
func (m *defaultServerClientModel) FindOneByIndex(ctx context.Context, index string) (*ServerClient, error) {
transferServerClientClientIndexKey := fmt.Sprintf("%s%v", cacheTransferServerClientClientIdPrefix, index)
var resp ServerClient
err := m.QueryRowCtx(ctx, &resp, transferServerClientClientIndexKey, func(ctx context.Context, conn sqlx.SqlConn, v any) error {
query := fmt.Sprintf("select %s from %s where `client_id` = ? limit 1", serverClientRows, m.table)
return conn.QueryRowCtx(ctx, v, query, index)
})
switch err {
case nil:
return &resp, nil
case sqlc.ErrNotFound:
return nil, ErrNotFound
default:
return nil, err
}
}
func (m *defaultServerClientModel) Insert(ctx context.Context, data *ServerClient) (sql.Result, error) {
transferServerClientClientIdKey := fmt.Sprintf("%s%v", cacheTransferServerClientClientIdPrefix, data.ClientId)
ret, err := m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) {
query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?)", m.table, serverClientRowsExpectAutoSet)
return conn.ExecCtx(ctx, query, data.ClientId, data.ClientName, data.ClientIndex, data.ZltxMerchantId, data.ZltxSecret, data.Status)
}, transferServerClientClientIdKey)
return ret, err
}
func (m *defaultServerClientModel) Update(ctx context.Context, data *ServerClient) error {
transferServerClientClientIdKey := fmt.Sprintf("%s%v", cacheTransferServerClientClientIdPrefix, data.ClientId)
_, err := m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) {
query := fmt.Sprintf("update %s set %s where `client_id` = ?", m.table, serverClientRowsWithPlaceHolder)
return conn.ExecCtx(ctx, query, data.ClientName, data.ClientIndex, data.ZltxMerchantId, data.ZltxSecret, data.Status, data.ClientId)
}, transferServerClientClientIdKey)
return err
}
func (m *defaultServerClientModel) formatPrimary(primary any) string {
return fmt.Sprintf("%s%v", cacheTransferServerClientClientIdPrefix, primary)
}
func (m *defaultServerClientModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary any) error {
query := fmt.Sprintf("select %s from %s where `client_id` = ? limit 1", serverClientRows, m.table)
return conn.QueryRowCtx(ctx, v, query, primary)
}
func (m *defaultServerClientModel) tableName() string {
return m.table
}

5
genModel/vars.go Normal file
View File

@ -0,0 +1,5 @@
package genModel
import "github.com/zeromicro/go-zero/core/stores/sqlx"
var ErrNotFound = sqlx.ErrNotFound

103
go.mod Executable file
View File

@ -0,0 +1,103 @@
module trasfer_middleware
go 1.21
require (
github.com/zeromicro/go-zero v1.6.5
github.com/zeromicro/zero-contrib/zrpc/registry/nacos v0.0.0-20231030135404-af9ae855016f
google.golang.org/grpc v1.63.2
google.golang.org/protobuf v1.34.1
)
require (
filippo.io/edwards25519 v1.1.0 // indirect
github.com/aliyun/alibaba-cloud-sdk-go v1.61.1704 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/buger/jsonparser v1.1.1 // indirect
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/coreos/go-semver v0.3.1 // indirect
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
github.com/fatih/color v1.16.0 // indirect
github.com/go-logr/logr v1.3.0 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-openapi/jsonpointer v0.19.6 // indirect
github.com/go-openapi/jsonreference v0.20.2 // indirect
github.com/go-openapi/swag v0.22.4 // indirect
github.com/go-sql-driver/mysql v1.8.1 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/mock v1.6.0 // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/google/gnostic-models v0.6.8 // indirect
github.com/google/go-cmp v0.6.0 // indirect
github.com/google/gofuzz v1.2.0 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 // indirect
github.com/jinzhu/copier v0.4.0 // indirect
github.com/jmespath/go-jmespath v0.4.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/nacos-group/nacos-sdk-go/v2 v2.2.3 // indirect
github.com/openzipkin/zipkin-go v0.4.2 // indirect
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/prometheus/client_golang v1.18.0 // indirect
github.com/prometheus/client_model v0.5.0 // indirect
github.com/prometheus/common v0.45.0 // indirect
github.com/prometheus/procfs v0.12.0 // indirect
github.com/redis/go-redis/v9 v9.4.0 // indirect
github.com/spaolacci/murmur3 v1.1.0 // indirect
go.etcd.io/etcd/api/v3 v3.5.13 // indirect
go.etcd.io/etcd/client/pkg/v3 v3.5.13 // indirect
go.etcd.io/etcd/client/v3 v3.5.13 // indirect
go.opentelemetry.io/otel v1.19.0 // indirect
go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 // indirect
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0 // indirect
go.opentelemetry.io/otel/exporters/zipkin v1.19.0 // indirect
go.opentelemetry.io/otel/metric v1.19.0 // indirect
go.opentelemetry.io/otel/sdk v1.19.0 // indirect
go.opentelemetry.io/otel/trace v1.19.0 // indirect
go.opentelemetry.io/proto/otlp v1.0.0 // indirect
go.uber.org/atomic v1.10.0 // indirect
go.uber.org/automaxprocs v1.5.3 // indirect
go.uber.org/multierr v1.9.0 // indirect
go.uber.org/zap v1.24.0 // indirect
golang.org/x/net v0.25.0 // indirect
golang.org/x/oauth2 v0.17.0 // indirect
golang.org/x/sync v0.6.0 // indirect
golang.org/x/sys v0.20.0 // indirect
golang.org/x/term v0.20.0 // indirect
golang.org/x/text v0.15.0 // indirect
golang.org/x/time v0.5.0 // indirect
google.golang.org/appengine v1.6.8 // indirect
google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/ini.v1 v1.66.2 // indirect
gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
k8s.io/api v0.29.3 // indirect
k8s.io/apimachinery v0.29.4 // indirect
k8s.io/client-go v0.29.3 // indirect
k8s.io/klog/v2 v2.110.1 // indirect
k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect
k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
sigs.k8s.io/yaml v1.3.0 // indirect
)

63
pkg/common/func.go Normal file
View File

@ -0,0 +1,63 @@
package common
import (
"crypto/md5"
"encoding/hex"
"reflect"
"strings"
)
func GetMD5Hash(input string) string {
hash := md5.Sum([]byte(input))
return hex.EncodeToString(hash[:])
}
// toMap 将结构体转换为map[string]interface{}
// StructToMap 将一个struct转换为map[string]interface{}
func StructToMap(obj interface{}) map[string]interface{} {
// 获取obj的类型
val := reflect.ValueOf(obj)
if val.Kind() == reflect.Ptr {
val = val.Elem()
}
// 确保obj是一个struct
if val.Kind() != reflect.Struct {
return nil
}
// 创建一个map来保存结果
data := make(map[string]interface{})
// 遍历struct的字段
for i := 0; i < val.NumField(); i++ {
// 获取字段的类型和值
valueField := val.Field(i)
typeField := val.Type().Field(i)
jsonTag := typeField.Tag.Get("json")
if idx := strings.Index(jsonTag, ","); idx != -1 {
// 如果有逗号,则取逗号之前的部分
jsonTag = jsonTag[:idx]
}
// 忽略未导出的字段(字段名首字母小写)
if !typeField.IsExported() {
continue
}
// 将字段名和值添加到map中
data[jsonTag] = valueField.Interface()
}
return data
}
// mergeMaps 合并任意数量的map
func MergeMaps(maps ...map[string]interface{}) map[string]interface{} {
merged := make(map[string]interface{})
for _, m := range maps {
for k, v := range m {
merged[k] = v
}
}
return merged
}

29
pkg/common/zltx.go Normal file
View File

@ -0,0 +1,29 @@
package common
import (
"fmt"
"sort"
"strings"
)
func ZltxSign(postData map[string]interface{}, secret string) string {
// 第一步把key升序
keys := make([]string, 0, len(postData))
for key := range postData {
keys = append(keys, key)
}
sort.Strings(keys)
// 第二步:生成签名
// 拼接用于生成签名的原始字符串
rawStr := ""
for _, key := range keys {
value := fmt.Sprintf("%v", postData[key])
if rawStr != "" {
rawStr += "&"
}
rawStr += fmt.Sprintf("%s=%s", key, value)
}
rawStr += "&key=" + secret
return strings.ToUpper(GetMD5Hash(rawStr))
}

58
pkg/log/log.go Executable file
View File

@ -0,0 +1,58 @@
package pkg
import (
"context"
"fmt"
"github.com/zeromicro/go-zero/core/logx"
"os"
"time"
)
func ErrLog(ctx context.Context, errContent ...any) {
path, _ := errLogFile()
// 创建一个文件对象
file, err := os.OpenFile(path, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
logx.Error(err)
return
}
defer file.Close()
// 创建一个日志写入器,将日志写入文件
writer := logx.NewWriter(file)
// 使用该写入器记录日志
logx.SetWriter(writer)
logx.WithContext(ctx).WithCallerSkip(2).Errorf("errlog:", errContent)
}
func errLogFile() (string, error) {
logPath, err := runtimePath()
if err != nil {
return "", err
}
path := fmt.Sprintf("%s/%s", logPath, "err")
err = CheckDir(path)
if err != nil {
return "", err
}
return fmt.Sprintf("%s/%s", path, time.Now().Format(time.DateOnly)), nil
}
func runtimePath() (string, error) {
path, err := os.Getwd()
return fmt.Sprintf("../%s/%s", path, "runtime"), err
}
func CheckDir(path string) error {
// 判断目录是否存在
if _, err := os.Stat(path); os.IsNotExist(err) {
// 如果目录不存在,则创建它
err = os.MkdirAll(path, os.ModePerm)
if err != nil {
return err
}
} else if err != nil {
// 如果Stat返回了其他错误比如权限问题
return err
}
return nil
}

130
pkg/request/request.go Executable file
View File

@ -0,0 +1,130 @@
package request
import (
"encoding/json"
"io"
"net/http"
"net/url"
"strings"
"time"
)
// 请求结构体
type Request struct {
Method string `json:"method"` // 请求方法
Url string `json:"url"` // 请求url
Params map[string]string `json:"params"` // Query参数
Headers map[string]string `json:"headers"` // 请求头
Cookies map[string]string `json:"cookies"` // todo 处理 Cookies
Data map[string]string `json:"data"` // 表单格式请求数据
Json map[string]string `json:"json"` // JSON格式请求数据 todo 多层 嵌套
Files map[string]string `json:"files"` // todo 处理 Files
Raw string `json:"raw"` // 原始请求数据
JsonByte []byte `json:"json_raw"` // JSON格式请求数据 todo 多层 嵌套
}
// 响应结构体
type Response struct {
StatusCode int `json:"status_code"` // 状态码
Reason string `json:"reason"` // 状态码说明
Elapsed float64 `json:"elapsed"` // 请求耗时(秒)
Content []byte `json:"content"` // 响应二进制内容
Text string `json:"text"` // 响应文本
Headers map[string]string `json:"headers"` // 响应头
Cookies map[string]string `json:"cookies"` // todo 添加响应Cookies
Request *Request `json:"request"` // 原始请求
}
// 处理请求方法
func (r *Request) getMethod() string {
return strings.ToUpper(r.Method) // 必须转为全部大写
}
// 组装URL
func (r *Request) getUrl() string {
if r.Params != nil {
urlValues := url.Values{}
Url, _ := url.Parse(r.Url) // todo 处理err
for key, value := range r.Params {
urlValues.Set(key, value)
}
Url.RawQuery = urlValues.Encode()
return Url.String()
}
return r.Url
}
// 组装请求数据
func (r *Request) getData() io.Reader {
var reqBody string
if r.Headers == nil {
r.Headers = make(map[string]string, 1)
}
if r.Raw != "" {
reqBody = r.Raw
} else if r.Data != nil {
urlValues := url.Values{}
for key, value := range r.Data {
urlValues.Add(key, value)
}
reqBody = urlValues.Encode()
r.Headers["Content-Type"] = "application/x-www-form-urlencoded"
} else if r.Json != nil {
bytesData, _ := json.Marshal(r.Json)
reqBody = string(bytesData)
r.Headers["Content-Type"] = "application/json"
} else if r.JsonByte != nil {
reqBody = string(r.JsonByte)
r.Headers["Content-Type"] = "application/json"
}
return strings.NewReader(reqBody)
}
// 添加请求头-需要在getData后使用
func (r *Request) addHeaders(req *http.Request) {
if r.Headers != nil {
for key, value := range r.Headers {
req.Header.Add(key, value)
}
}
}
// 准备请求
func (r *Request) prepare() *http.Request {
Method := r.getMethod()
Url := r.getUrl()
Data := r.getData()
req, _ := http.NewRequest(Method, Url, Data)
r.addHeaders(req)
return req
}
// 组装响应对象
func (r *Request) packResponse(res *http.Response, elapsed float64) Response {
var resp Response
resBody, _ := io.ReadAll(res.Body)
resp.Content = resBody
resp.Text = string(resBody)
resp.StatusCode = res.StatusCode
resp.Reason = strings.Split(res.Status, " ")[1]
resp.Elapsed = elapsed
resp.Headers = map[string]string{}
for key, value := range res.Header {
resp.Headers[key] = strings.Join(value, ";")
}
return resp
}
// 发送请求
func (r *Request) Send() (Response, error) {
req := r.prepare()
client := &http.Client{}
start := time.Now()
res, err := client.Do(req)
if err != nil {
return Response{}, err
}
defer res.Body.Close()
elapsed := time.Since(start).Seconds()
return r.packResponse(res, elapsed), nil
}

83
pkg/request/test/wxbiz_test.go Executable file
View File

@ -0,0 +1,83 @@
package test
import (
"fmt"
"msgc/pkg/request"
"testing"
)
// 发送GET 请求
func TestGet(t *testing.T) {
r := request.Request{
Method: "GET",
Url: "https://httpbin.org/get?name=张三&age=12",
Headers: map[string]string{"Cookie": "abc", "Token": "123"}}
resp, _ := r.Send()
fmt.Printf("状态码: %d\n", resp.StatusCode)
fmt.Printf("原因: %s\n", resp.Reason)
fmt.Printf("响应时间: %f秒\n", resp.Elapsed)
fmt.Printf("响应文本: %s\n", resp.Text)
}
// 发送GET 带单独Query参数请求
func TestWAccessToken(t *testing.T) {
appid := "wx381e6a04ab7f69b6"
secret := "16f6152c216c07fdff4c0ecaf1a173ed"
r := request.Request{
Method: "GET",
Url: "https://api.weixin.qq.com/cgi-bin/token",
Params: map[string]string{"grant_type": "client_credential", "appid": appid, "secret": secret},
}
resp, err := r.Send()
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("状态码: %d\n", resp.StatusCode)
fmt.Printf("原因: %s\n", resp.Reason)
fmt.Printf("响应时间: %f秒\n", resp.Elapsed)
fmt.Printf("响应文本: %s\n", resp.Text)
}
func TestDtalkBlackBard(t *testing.T) {
r := request.Request{
Method: "POST",
Url: "https://httpbin.org/post",
Data: map[string]string{"name": "张三", "age": "12"},
Headers: map[string]string{"Cookie": "abc", "Token": "123"}}
resp, _ := r.Send()
fmt.Printf("状态码: %d\n", resp.StatusCode)
fmt.Printf("原因: %s\n", resp.Reason)
fmt.Printf("响应时间: %f秒\n", resp.Elapsed)
fmt.Printf("响应文本: %s\n", resp.Text)
}
// 发送POST 表单请求
func TestPostForm(t *testing.T) {
r := request.Request{
Method: "POST",
Url: "https://httpbin.org/post",
Data: map[string]string{"name": "张三", "age": "12"},
Headers: map[string]string{"Cookie": "abc", "Token": "123"}}
resp, _ := r.Send()
fmt.Printf("状态码: %d\n", resp.StatusCode)
fmt.Printf("原因: %s\n", resp.Reason)
fmt.Printf("响应时间: %f秒\n", resp.Elapsed)
fmt.Printf("响应文本: %s\n", resp.Text)
}
// 发送POST JSON请求
func TestPostJson(t *testing.T) {
r := request.Request{
Method: "POST",
Url: "https://httpbin.org/post",
Json: map[string]string{"name": "张三", "age": "12"},
Headers: map[string]string{"Cookie": "abc", "Token": "123"}}
resp, _ := r.Send()
fmt.Printf("状态码: %d\n", resp.StatusCode)
fmt.Printf("原因: %s\n", resp.Reason)
fmt.Printf("响应时间: %f秒\n", resp.Elapsed)
fmt.Printf("响应文本: %s\n", resp.Text)
}

17
pkg/xerr/errCode.go Executable file
View File

@ -0,0 +1,17 @@
package xerr
// 成功返回
const OK uint32 = 200
/**(前3位代表业务,后三位代表具体功能)**/
// 全局错误码
const SERVER_AUTH_ERROR uint32 = 100007
const SERVER_COMMON_ERROR uint32 = 100001
const REUQEST_PARAM_ERROR uint32 = 100002
const TOKEN_EXPIRE_ERROR uint32 = 100003
const TOKEN_GENERATE_ERROR uint32 = 100004
const DB_ERROR uint32 = 100005
const DB_UPDATE_AFFECTED_ZERO_ERROR uint32 = 100006
//用户模块

32
pkg/xerr/errMsg.go Executable file
View File

@ -0,0 +1,32 @@
package xerr
var message map[uint32]string
func init() {
message = make(map[uint32]string)
message[OK] = "SUCCESS"
message[SERVER_AUTH_ERROR] = "鉴权失败"
message[SERVER_COMMON_ERROR] = "服务器开小差啦,稍后再来试一试"
message[REUQEST_PARAM_ERROR] = "参数错误"
message[TOKEN_EXPIRE_ERROR] = "token失效请重新登陆"
message[TOKEN_GENERATE_ERROR] = "生成token失败"
message[DB_ERROR] = "数据库繁忙,请稍后再试"
message[DB_UPDATE_AFFECTED_ZERO_ERROR] = "更新数据影响行数为0"
message[SERVER_AUTH_ERROR] = "身份验证失败"
}
func MapErrMsg(errcode uint32) string {
if msg, ok := message[errcode]; ok {
return msg
} else {
return "服务器开小差啦,稍后再来试一试"
}
}
func IsCodeErr(errcode uint32) bool {
if _, ok := message[errcode]; ok {
return true
} else {
return false
}
}

42
pkg/xerr/errors.go Executable file
View File

@ -0,0 +1,42 @@
package xerr
import (
"context"
"fmt"
pkg "trasfer_middleware/pkg/log"
)
/**
常用通用固定错误
*/
type CodeError struct {
errCode uint32
errMsg string
}
// 返回给前端的错误码
func (e *CodeError) GetErrCode() uint32 {
return e.errCode
}
// 返回给前端显示端错误信息
func (e *CodeError) GetErrMsg() string {
return e.errMsg
}
func (e *CodeError) Error() string {
return fmt.Sprintf("ErrCode:%dErrMsg:%s", e.errCode, e.errMsg)
}
func NewErrCodeMsg(errCode uint32, errMsg string) *CodeError {
return &CodeError{errCode: errCode, errMsg: errMsg}
}
func NewErrCode(errCode uint32) *CodeError {
return &CodeError{errCode: errCode, errMsg: MapErrMsg(errCode)}
}
func NewErrMsg(ctx context.Context, errMsg string) *CodeError {
pkg.ErrLog(ctx, errMsg)
return &CodeError{errCode: SERVER_COMMON_ERROR, errMsg: errMsg}
}