实现商户注册、管理员审核商户申请接口
This commit is contained in:
@ -6,6 +6,7 @@ import (
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/os/glog"
|
||||
"github.com/hailaz/gf-casbin-adapter/v2"
|
||||
"server/internal/consts"
|
||||
"sync"
|
||||
)
|
||||
|
||||
@ -33,6 +34,10 @@ func init() {
|
||||
}
|
||||
|
||||
enforcer.LoadPolicy()
|
||||
enforcer.AddGroupingPolicy(consts.UserRoleCode, consts.GuestRoleCode) // 用户继承游客角色权限
|
||||
|
||||
enforcer.AddGroupingPolicy(consts.MerchantRoleCode, consts.StoreRoleCode) // 商户继承门店角色权限
|
||||
enforcer.AddGroupingPolicy(consts.AdminRoleCode, consts.MerchantRoleCode) // 管理员继承商户角色权限
|
||||
// 管理员
|
||||
{
|
||||
// admin
|
||||
@ -45,6 +50,10 @@ func init() {
|
||||
enforcer.AddPolicy("admin", "/x/role", "DELETE", "管理员给角色分配权限")
|
||||
enforcer.AddPolicy("admin", "/x/role/*", "DELETE", "管理员删除单个角色")
|
||||
|
||||
// merchant
|
||||
enforcer.AddPolicy("admin", "/x/merchant", "GET", "管理员获取商户列表")
|
||||
enforcer.AddPolicy("admin", "/x/merchant/audit", "POST", "管理员审核商户申请")
|
||||
|
||||
}
|
||||
instance = &myCasbin{Enforcer: enforcer}
|
||||
|
||||
|
||||
97
utility/oss/aliyun/aliyun.go
Normal file
97
utility/oss/aliyun/aliyun.go
Normal file
@ -0,0 +1,97 @@
|
||||
package aliyun
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/aliyun/aliyun-oss-go-sdk/oss"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/util/grand"
|
||||
"server/internal/model"
|
||||
ioss "server/utility/oss"
|
||||
)
|
||||
|
||||
type aliyunClient struct {
|
||||
bucketName string
|
||||
key string
|
||||
secret string
|
||||
endpoint string
|
||||
}
|
||||
|
||||
// 初始化并注册
|
||||
func init() {
|
||||
ctx := context.Background()
|
||||
client := &aliyunClient{
|
||||
endpoint: g.Config().MustGet(ctx, "oss.aliyun.endpoint").String(),
|
||||
key: g.Config().MustGet(ctx, "oss.aliyun.key").String(),
|
||||
secret: g.Config().MustGet(ctx, "oss.aliyun.secret").String(),
|
||||
bucketName: g.Config().MustGet(ctx, "oss.aliyun.bucket").String(),
|
||||
}
|
||||
ioss.Register("aliyun", client)
|
||||
}
|
||||
|
||||
func (a *aliyunClient) client(ctx context.Context, endpoint, key, sercret string) (*oss.Client, error) {
|
||||
client, err := oss.New(endpoint, key, sercret)
|
||||
return client, err
|
||||
}
|
||||
|
||||
func (a *aliyunClient) bucket(ctx context.Context, client *oss.Client) (*oss.Bucket, error) {
|
||||
bucket, err := client.Bucket(a.bucketName)
|
||||
return bucket, err
|
||||
}
|
||||
func (a *aliyunClient) bytes(ctx context.Context, in *model.OssBytesInput) (*model.OssOutput, error) {
|
||||
client, err := a.client(ctx, a.endpoint, a.key, a.secret)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
bucket, err := a.bucket(ctx, client)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if in.Name == "" {
|
||||
in.Name = grand.Digits(32)
|
||||
}
|
||||
err = bucket.PutObject(in.Name, bytes.NewReader(in.Bytes))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &model.OssOutput{
|
||||
Url: fmt.Sprintf("https://%s.%s/%s", a.bucketName, a.endpoint, in.Name),
|
||||
}, nil
|
||||
}
|
||||
func (a *aliyunClient) UploadFile(ctx context.Context, in *model.OssUploadFileInput) (out *model.OssOutput, err error) {
|
||||
f, err := in.File.Open()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer f.Close()
|
||||
body := make([]byte, in.File.Size)
|
||||
_, err = f.Read(body)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return a.bytes(ctx, &model.OssBytesInput{
|
||||
Name: in.Filename,
|
||||
Bytes: body,
|
||||
})
|
||||
}
|
||||
func (a *aliyunClient) GetFileURL(ctx context.Context, in *model.OssGetFileInput) (out *model.OssOutput, err error) {
|
||||
client, err := a.client(ctx, a.endpoint, a.key, a.secret)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
bucket, err := a.bucket(ctx, client)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if in.Name == "" {
|
||||
in.Name = grand.Digits(32)
|
||||
}
|
||||
err = bucket.PutObjectFromFile(in.Name, in.FilePath)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &model.OssOutput{
|
||||
Url: fmt.Sprintf("https://%s.%s/%s", a.bucketName, a.endpoint, in.Name),
|
||||
}, nil
|
||||
}
|
||||
26
utility/oss/oss.go
Normal file
26
utility/oss/oss.go
Normal file
@ -0,0 +1,26 @@
|
||||
package oss
|
||||
|
||||
import (
|
||||
"context"
|
||||
"server/internal/model"
|
||||
)
|
||||
|
||||
// OssClient 是所有云存储平台要实现的统一接口
|
||||
type OssClient interface {
|
||||
UploadFile(ctx context.Context, in *model.OssUploadFileInput) (out *model.OssOutput, err error)
|
||||
GetFileURL(ctx context.Context, in *model.OssGetFileInput) (out *model.OssOutput, err error)
|
||||
}
|
||||
|
||||
// registry 存储各个平台的实现
|
||||
var clients = make(map[string]OssClient)
|
||||
|
||||
// Register 用于注册平台实现
|
||||
func Register(name string, client OssClient) {
|
||||
clients[name] = client
|
||||
}
|
||||
|
||||
// GetClient 获取指定平台的实现
|
||||
func GetClient(name string) (OssClient, bool) {
|
||||
client, ok := clients[name]
|
||||
return client, ok
|
||||
}
|
||||
4
utility/sms/aliyun/aliyun.go
Normal file
4
utility/sms/aliyun/aliyun.go
Normal file
@ -0,0 +1,4 @@
|
||||
package aliyun
|
||||
|
||||
type aliyunClient struct {
|
||||
}
|
||||
21
utility/sms/sms.go
Normal file
21
utility/sms/sms.go
Normal file
@ -0,0 +1,21 @@
|
||||
package sms
|
||||
|
||||
import (
|
||||
"context"
|
||||
"server/internal/model"
|
||||
)
|
||||
|
||||
type SMSClient interface {
|
||||
UploadFile(ctx context.Context, in *model.OssUploadFileInput) (out *model.OssOutput, err error)
|
||||
GetFileURL(ctx context.Context, in *model.OssGetFileInput) (out *model.OssOutput, err error)
|
||||
}
|
||||
|
||||
var clients = make(map[string]SMSClient)
|
||||
|
||||
func Register(name string, client SMSClient) {
|
||||
clients[name] = client
|
||||
}
|
||||
func GetClient(name string) (SMSClient, bool) {
|
||||
client, ok := clients[name]
|
||||
return client, ok
|
||||
}
|
||||
Reference in New Issue
Block a user