整体优化完善接口与数据权限检查
This commit is contained in:
@@ -1,6 +1,8 @@
|
|||||||
## TODO
|
## TODO
|
||||||
|
|
||||||
增删改数据权限排查
|
用户请求需要检查数据权限
|
||||||
|
|
||||||
|
管理页面查询统一加排序
|
||||||
|
|
||||||
后端默认用户名不能是完整手机号
|
后端默认用户名不能是完整手机号
|
||||||
|
|
||||||
|
|||||||
@@ -433,6 +433,7 @@ create table permission (
|
|||||||
parent_id int,
|
parent_id int,
|
||||||
name text not null,
|
name text not null,
|
||||||
description text,
|
description text,
|
||||||
|
sort int,
|
||||||
created_at timestamptz default current_timestamp,
|
created_at timestamptz default current_timestamp,
|
||||||
updated_at timestamptz default current_timestamp,
|
updated_at timestamptz default current_timestamp,
|
||||||
deleted_at timestamptz
|
deleted_at timestamptz
|
||||||
@@ -447,6 +448,7 @@ comment on column permission.id is '权限ID';
|
|||||||
comment on column permission.parent_id is '父权限ID';
|
comment on column permission.parent_id is '父权限ID';
|
||||||
comment on column permission.name is '权限名称';
|
comment on column permission.name is '权限名称';
|
||||||
comment on column permission.description is '权限描述';
|
comment on column permission.description is '权限描述';
|
||||||
|
comment on column permission.sort is '排序';
|
||||||
comment on column permission.created_at is '创建时间';
|
comment on column permission.created_at is '创建时间';
|
||||||
comment on column permission.updated_at is '更新时间';
|
comment on column permission.updated_at is '更新时间';
|
||||||
comment on column permission.deleted_at is '删除时间';
|
comment on column permission.deleted_at is '删除时间';
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package auth
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
m "platform/web/models"
|
m "platform/web/models"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
)
|
)
|
||||||
@@ -12,7 +13,6 @@ type AuthCtx struct {
|
|||||||
Client *m.Client `json:"client,omitempty"`
|
Client *m.Client `json:"client,omitempty"`
|
||||||
Scopes []string `json:"scopes,omitempty"`
|
Scopes []string `json:"scopes,omitempty"`
|
||||||
Session *m.Session `json:"session,omitempty"`
|
Session *m.Session `json:"session,omitempty"`
|
||||||
smap map[string]struct{}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *AuthCtx) PermitUser(scopes ...string) (*AuthCtx, error) {
|
func (a *AuthCtx) PermitUser(scopes ...string) (*AuthCtx, error) {
|
||||||
@@ -68,15 +68,11 @@ func (a *AuthCtx) checkScopes(scopes ...string) bool {
|
|||||||
if len(scopes) == 0 || len(a.Scopes) == 0 {
|
if len(scopes) == 0 || len(a.Scopes) == 0 {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
if len(a.smap) == 0 && len(a.Scopes) > 0 {
|
|
||||||
a.smap = make(map[string]struct{}, len(a.Scopes))
|
|
||||||
for _, scope := range a.Scopes {
|
|
||||||
a.smap[scope] = struct{}{}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, scope := range scopes {
|
for _, scope := range scopes {
|
||||||
if _, ok := a.smap[scope]; ok {
|
for _, prefix := range a.Scopes {
|
||||||
return true
|
if strings.HasPrefix(scope, prefix) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ type Model struct {
|
|||||||
ID int32 `json:"id" gorm:"column:id;primaryKey"`
|
ID int32 `json:"id" gorm:"column:id;primaryKey"`
|
||||||
CreatedAt time.Time `json:"created_at" gorm:"column:created_at"`
|
CreatedAt time.Time `json:"created_at" gorm:"column:created_at"`
|
||||||
UpdatedAt time.Time `json:"updated_at" gorm:"column:updated_at"`
|
UpdatedAt time.Time `json:"updated_at" gorm:"column:updated_at"`
|
||||||
DeletedAt gorm.DeletedAt `gorm:"column:deleted_at"`
|
DeletedAt gorm.DeletedAt `json:"-" gorm:"column:deleted_at"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Model) GetID() int32 {
|
func (m *Model) GetID() int32 {
|
||||||
|
|||||||
@@ -1,30 +1,55 @@
|
|||||||
package core
|
package core
|
||||||
|
|
||||||
const (
|
const (
|
||||||
ScopePermissionRead = string("permission:read")
|
ScopePermission = string("permission") // 权限
|
||||||
ScopePermissionWrite = string("permission:write")
|
ScopePermissionRead = string("permission:read") // 读取权限列表
|
||||||
|
ScopePermissionWrite = string("permission:write") // 写入权限
|
||||||
|
|
||||||
ScopeAdminRoleRead = string("admin_role:read")
|
ScopeAdminRole = string("admin_role") // 管理员角色
|
||||||
ScopeAdminRoleWrite = string("admin_role:write")
|
ScopeAdminRoleRead = string("admin_role:read") // 读取管理员角色列表
|
||||||
|
ScopeAdminRoleWrite = string("admin_role:write") // 写入管理员角色
|
||||||
|
|
||||||
ScopeAdminRead = string("admin:read")
|
ScopeAdmin = string("admin") // 管理员
|
||||||
ScopeAdminWrite = string("admin:write")
|
ScopeAdminRead = string("admin:read") // 读取管理员列表
|
||||||
|
ScopeAdminWrite = string("admin:write") // 写入管理员
|
||||||
|
|
||||||
ScopeProductRead = string("product:read")
|
ScopeProduct = string("product") // 产品
|
||||||
ScopeProductWrite = string("product:write")
|
ScopeProductRead = string("product:read") // 读取产品列表
|
||||||
|
ScopeProductWrite = string("product:write") // 写入产品
|
||||||
|
|
||||||
ScopeProductSkuRead = string("product_sku:read")
|
ScopeProductSku = string("product_sku") // 产品套餐
|
||||||
ScopeProductSkuWrite = string("product_sku:write")
|
ScopeProductSkuRead = string("product_sku:read") // 读取产品套餐列表
|
||||||
|
ScopeProductSkuWrite = string("product_sku:write") // 写入产品套餐
|
||||||
|
|
||||||
ScopeProductDiscountRead = string("product_discount:read")
|
ScopeDiscount = string("discount") // 折扣
|
||||||
ScopeProductDiscountWrite = string("product_discount:write")
|
ScopeDiscountRead = string("discount:read") // 读取折扣列表
|
||||||
|
ScopeDiscountWrite = string("discount:write") // 写入折扣
|
||||||
|
|
||||||
ScopeResourceRead = string("resource:read")
|
ScopeResource = string("resource") // 用户套餐
|
||||||
ScopeResourceWrite = string("resource:write")
|
ScopeResourceRead = string("resource:read") // 读取用户套餐列表
|
||||||
|
ScopeResourceWrite = string("resource:write") // 写入用户套餐
|
||||||
|
|
||||||
ScopeUserRead = string("user:read")
|
ScopeUser = string("user") // 用户
|
||||||
ScopeUserWrite = string("user:write")
|
ScopeUserRead = string("user:read") // 读取用户列表
|
||||||
|
ScopeUserWrite = string("user:write") // 写入用户
|
||||||
|
|
||||||
ScopeCouponRead = string("coupon:read")
|
ScopeCoupon = string("coupon") // 优惠券
|
||||||
ScopeCouponWrite = string("coupon:write")
|
ScopeCouponRead = string("coupon:read") // 读取优惠券列表
|
||||||
|
ScopeCouponWrite = string("coupon:write") // 写入优惠券
|
||||||
|
|
||||||
|
ScopeBatch = string("batch") // 批次
|
||||||
|
ScopeBatchRead = string("batch:read") // 读取批次列表
|
||||||
|
ScopeBatchWrite = string("batch:write") // 写入批次
|
||||||
|
|
||||||
|
ScopeChannel = string("channel") // IP
|
||||||
|
ScopeChannelRead = string("channel:read") // 读取 IP 列表
|
||||||
|
ScopeChannelWrite = string("channel:write") // 写入 IP
|
||||||
|
|
||||||
|
ScopeTrade = string("trade") // 交易
|
||||||
|
ScopeTradeRead = string("trade:read") // 读取交易列表
|
||||||
|
ScopeTradeWrite = string("trade:write") // 写入交易
|
||||||
|
|
||||||
|
ScopeBill = string("bill") // 账单
|
||||||
|
ScopeBillRead = string("bill:read") // 读取账单列表
|
||||||
|
ScopeBillWrite = string("bill:write") // 写入账单
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import (
|
|||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func PageAdminsByAdmin(c *fiber.Ctx) error {
|
func PageAdminByAdmin(c *fiber.Ctx) error {
|
||||||
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeAdminRead)
|
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeAdminRead)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -37,7 +37,7 @@ type PageAdminsReq struct {
|
|||||||
core.PageReq
|
core.PageReq
|
||||||
}
|
}
|
||||||
|
|
||||||
func ListAdminsByAdmin(c *fiber.Ctx) error {
|
func AllAdminByAdmin(c *fiber.Ctx) error {
|
||||||
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeAdminRead)
|
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeAdminRead)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import (
|
|||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func ListAdminRolesByAdmin(c *fiber.Ctx) error {
|
func AllAdminRoleByAdmin(c *fiber.Ctx) error {
|
||||||
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeAdminRoleRead)
|
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeAdminRoleRead)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -23,7 +23,7 @@ func ListAdminRolesByAdmin(c *fiber.Ctx) error {
|
|||||||
return c.JSON(list)
|
return c.JSON(list)
|
||||||
}
|
}
|
||||||
|
|
||||||
func PageAdminRolesByAdmin(c *fiber.Ctx) error {
|
func PageAdminRoleByAdmin(c *fiber.Ctx) error {
|
||||||
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeAdminRoleRead)
|
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeAdminRoleRead)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
@@ -12,8 +12,8 @@ import (
|
|||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
// PageResourceBatch 分页查询套餐提取记录
|
// PageBatch 分页查询套餐提取记录
|
||||||
func PageResourceBatch(ctx *fiber.Ctx) error {
|
func PageBatch(ctx *fiber.Ctx) error {
|
||||||
// 检查权限
|
// 检查权限
|
||||||
authCtx, err := auth.GetAuthCtx(ctx).PermitUser()
|
authCtx, err := auth.GetAuthCtx(ctx).PermitUser()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -59,7 +59,7 @@ type PageResourceBatchReq struct {
|
|||||||
|
|
||||||
// PageBatchByAdmin 分页查询所有提取记录
|
// PageBatchByAdmin 分页查询所有提取记录
|
||||||
func PageBatchByAdmin(c *fiber.Ctx) error {
|
func PageBatchByAdmin(c *fiber.Ctx) error {
|
||||||
_, err := auth.GetAuthCtx(c).PermitAdmin()
|
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeBatchRead)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import (
|
|||||||
// PageBillByAdmin 分页查询全部账单
|
// PageBillByAdmin 分页查询全部账单
|
||||||
func PageBillByAdmin(c *fiber.Ctx) error {
|
func PageBillByAdmin(c *fiber.Ctx) error {
|
||||||
// 检查权限
|
// 检查权限
|
||||||
_, err := auth.GetAuthCtx(c).PermitAdmin()
|
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeBillRead)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,10 +15,10 @@ import (
|
|||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
// PageChannelsByAdmin 分页查询所有通道
|
// PageChannelByAdmin 分页查询所有通道
|
||||||
func PageChannelsByAdmin(c *fiber.Ctx) error {
|
func PageChannelByAdmin(c *fiber.Ctx) error {
|
||||||
// 检查权限
|
// 检查权限
|
||||||
_, err := auth.GetAuthCtx(c).PermitAdmin()
|
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeChannelRead)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -98,8 +98,8 @@ type PageChannelsByAdminReq struct {
|
|||||||
ExpiredAtEnd *time.Time `json:"expired_at_end"`
|
ExpiredAtEnd *time.Time `json:"expired_at_end"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// 分页查询当前用户通道
|
// ListChannel 分页查询当前用户通道
|
||||||
func ListChannels(c *fiber.Ctx) error {
|
func ListChannel(c *fiber.Ctx) error {
|
||||||
// 检查权限
|
// 检查权限
|
||||||
authContext, err := auth.GetAuthCtx(c).PermitUser()
|
authContext, err := auth.GetAuthCtx(c).PermitUser()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -169,9 +169,15 @@ type ListChannelsReq struct {
|
|||||||
ExpireBefore *time.Time `json:"expire_before"`
|
ExpireBefore *time.Time `json:"expire_before"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// 创建新通道
|
// CreateChannel 创建新通道
|
||||||
func CreateChannel(c *fiber.Ctx) error {
|
func CreateChannel(c *fiber.Ctx) error {
|
||||||
|
|
||||||
|
// 检查权限
|
||||||
|
_, err := auth.GetAuthCtx(c).PermitUser()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// 解析参数
|
// 解析参数
|
||||||
req := new(CreateChannelReq)
|
req := new(CreateChannelReq)
|
||||||
if err := g.Validator.ParseBody(c, req); err != nil {
|
if err := g.Validator.ParseBody(c, req); err != nil {
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ func PageCouponByAdmin(c *fiber.Ctx) error {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func AllCouponsByAdmin(c *fiber.Ctx) error {
|
func AllCouponByAdmin(c *fiber.Ctx) error {
|
||||||
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeCouponRead)
|
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeCouponRead)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import (
|
|||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func ListPermissionsByAdmin(c *fiber.Ctx) error {
|
func AllPermissionByAdmin(c *fiber.Ctx) error {
|
||||||
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopePermissionRead)
|
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopePermissionRead)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import (
|
|||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func AllProductsByAdmin(c *fiber.Ctx) error {
|
func AllProductByAdmin(c *fiber.Ctx) error {
|
||||||
// 检查权限
|
// 检查权限
|
||||||
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeProductRead)
|
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeProductRead)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ import (
|
|||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func PageProductDiscountByAdmin(c *fiber.Ctx) error {
|
func PageDiscountByAdmin(c *fiber.Ctx) error {
|
||||||
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeProductDiscountRead)
|
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeDiscountRead)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -33,8 +33,8 @@ func PageProductDiscountByAdmin(c *fiber.Ctx) error {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func AllProductDiscountsByAdmin(c *fiber.Ctx) error {
|
func AllDiscountByAdmin(c *fiber.Ctx) error {
|
||||||
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeProductDiscountRead)
|
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeDiscountRead)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -47,8 +47,8 @@ func AllProductDiscountsByAdmin(c *fiber.Ctx) error {
|
|||||||
return c.JSON(list)
|
return c.JSON(list)
|
||||||
}
|
}
|
||||||
|
|
||||||
func CreateProductDiscount(c *fiber.Ctx) error {
|
func CreateDiscount(c *fiber.Ctx) error {
|
||||||
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeProductDiscountWrite)
|
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeDiscountWrite)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -66,8 +66,8 @@ func CreateProductDiscount(c *fiber.Ctx) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func UpdateProductDiscount(c *fiber.Ctx) error {
|
func UpdateDiscount(c *fiber.Ctx) error {
|
||||||
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeProductDiscountWrite)
|
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeDiscountWrite)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -85,8 +85,8 @@ func UpdateProductDiscount(c *fiber.Ctx) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func DeleteProductDiscount(c *fiber.Ctx) error {
|
func DeleteDiscount(c *fiber.Ctx) error {
|
||||||
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeProductDiscountWrite)
|
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeDiscountWrite)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -209,7 +209,7 @@ type PageResourceLongReq struct {
|
|||||||
|
|
||||||
// PageResourceShortByAdmin 分页查询全部短效套餐
|
// PageResourceShortByAdmin 分页查询全部短效套餐
|
||||||
func PageResourceShortByAdmin(c *fiber.Ctx) error {
|
func PageResourceShortByAdmin(c *fiber.Ctx) error {
|
||||||
_, err := auth.GetAuthCtx(c).PermitAdmin()
|
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeResourceRead)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -303,7 +303,7 @@ type PageResourceShortByAdminReq struct {
|
|||||||
|
|
||||||
// PageResourceLongByAdmin 分页查询全部长效套餐
|
// PageResourceLongByAdmin 分页查询全部长效套餐
|
||||||
func PageResourceLongByAdmin(c *fiber.Ctx) error {
|
func PageResourceLongByAdmin(c *fiber.Ctx) error {
|
||||||
_, err := auth.GetAuthCtx(c).PermitAdmin()
|
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeResourceRead)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ import (
|
|||||||
// PageTradeByAdmin 分页查询所有订单
|
// PageTradeByAdmin 分页查询所有订单
|
||||||
func PageTradeByAdmin(c *fiber.Ctx) error {
|
func PageTradeByAdmin(c *fiber.Ctx) error {
|
||||||
// 检查权限
|
// 检查权限
|
||||||
_, err := auth.GetAuthCtx(c).PermitAdmin()
|
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeTradeRead)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -193,6 +193,12 @@ type TradeCancelReq struct {
|
|||||||
|
|
||||||
// 检查订单
|
// 检查订单
|
||||||
func TradeCheck(c *fiber.Ctx) error {
|
func TradeCheck(c *fiber.Ctx) error {
|
||||||
|
// 检查权限
|
||||||
|
_, err := auth.GetAuthCtx(c).PermitUser()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// 解析请求参数
|
// 解析请求参数
|
||||||
req := new(TradeCheckReq)
|
req := new(TradeCheckReq)
|
||||||
if err := g.Validator.ParseQuery(c, req); err != nil {
|
if err := g.Validator.ParseQuery(c, req); err != nil {
|
||||||
|
|||||||
@@ -121,7 +121,7 @@ func PageUserByAdmin(c *fiber.Ctx) error {
|
|||||||
|
|
||||||
// 查询用户列表
|
// 查询用户列表
|
||||||
users, total, err := q.User.Debug().
|
users, total, err := q.User.Debug().
|
||||||
Preload(q.User.Admin).
|
Preload(q.User.Admin, q.User.Discount).
|
||||||
Omit(q.User.Password).
|
Omit(q.User.Password).
|
||||||
Where(do).
|
Where(do).
|
||||||
Order(q.User.CreatedAt).
|
Order(q.User.CreatedAt).
|
||||||
@@ -159,7 +159,7 @@ type PageUserByAdminReq struct {
|
|||||||
// 绑定管理员
|
// 绑定管理员
|
||||||
func BindAdmin(c *fiber.Ctx) error {
|
func BindAdmin(c *fiber.Ctx) error {
|
||||||
// 检查权限
|
// 检查权限
|
||||||
authCtx, err := auth.GetAuthCtx(c).PermitAdmin()
|
authCtx, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeUserWrite)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ type Permission struct {
|
|||||||
ParentID *int32 `json:"parent_id,omitempty" gorm:"column:parent_id"` // 父权限ID
|
ParentID *int32 `json:"parent_id,omitempty" gorm:"column:parent_id"` // 父权限ID
|
||||||
Name string `json:"name" gorm:"column:name"` // 权限名称
|
Name string `json:"name" gorm:"column:name"` // 权限名称
|
||||||
Description *string `json:"description,omitempty" gorm:"column:description"` // 权限描述
|
Description *string `json:"description,omitempty" gorm:"column:description"` // 权限描述
|
||||||
|
Sort int `json:"sort" gorm:"column:sort"` // 排序
|
||||||
|
|
||||||
Parent *Permission `json:"parent,omitempty" gorm:"foreignKey:ParentID"`
|
Parent *Permission `json:"parent,omitempty" gorm:"foreignKey:ParentID"`
|
||||||
Children []*Permission `json:"children,omitempty" gorm:"foreignKey:ParentID"`
|
Children []*Permission `json:"children,omitempty" gorm:"foreignKey:ParentID"`
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ func newPermission(db *gorm.DB, opts ...gen.DOOption) permission {
|
|||||||
_permission.ParentID = field.NewInt32(tableName, "parent_id")
|
_permission.ParentID = field.NewInt32(tableName, "parent_id")
|
||||||
_permission.Name = field.NewString(tableName, "name")
|
_permission.Name = field.NewString(tableName, "name")
|
||||||
_permission.Description = field.NewString(tableName, "description")
|
_permission.Description = field.NewString(tableName, "description")
|
||||||
|
_permission.Sort = field.NewInt(tableName, "sort")
|
||||||
_permission.Children = permissionHasManyChildren{
|
_permission.Children = permissionHasManyChildren{
|
||||||
db: db.Session(&gorm.Session{}),
|
db: db.Session(&gorm.Session{}),
|
||||||
|
|
||||||
@@ -72,6 +73,7 @@ type permission struct {
|
|||||||
ParentID field.Int32
|
ParentID field.Int32
|
||||||
Name field.String
|
Name field.String
|
||||||
Description field.String
|
Description field.String
|
||||||
|
Sort field.Int
|
||||||
Children permissionHasManyChildren
|
Children permissionHasManyChildren
|
||||||
|
|
||||||
Parent permissionBelongsToParent
|
Parent permissionBelongsToParent
|
||||||
@@ -98,6 +100,7 @@ func (p *permission) updateTableName(table string) *permission {
|
|||||||
p.ParentID = field.NewInt32(table, "parent_id")
|
p.ParentID = field.NewInt32(table, "parent_id")
|
||||||
p.Name = field.NewString(table, "name")
|
p.Name = field.NewString(table, "name")
|
||||||
p.Description = field.NewString(table, "description")
|
p.Description = field.NewString(table, "description")
|
||||||
|
p.Sort = field.NewInt(table, "sort")
|
||||||
|
|
||||||
p.fillFieldMap()
|
p.fillFieldMap()
|
||||||
|
|
||||||
@@ -114,7 +117,7 @@ func (p *permission) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (p *permission) fillFieldMap() {
|
func (p *permission) fillFieldMap() {
|
||||||
p.fieldMap = make(map[string]field.Expr, 9)
|
p.fieldMap = make(map[string]field.Expr, 10)
|
||||||
p.fieldMap["id"] = p.ID
|
p.fieldMap["id"] = p.ID
|
||||||
p.fieldMap["created_at"] = p.CreatedAt
|
p.fieldMap["created_at"] = p.CreatedAt
|
||||||
p.fieldMap["updated_at"] = p.UpdatedAt
|
p.fieldMap["updated_at"] = p.UpdatedAt
|
||||||
@@ -122,6 +125,7 @@ func (p *permission) fillFieldMap() {
|
|||||||
p.fieldMap["parent_id"] = p.ParentID
|
p.fieldMap["parent_id"] = p.ParentID
|
||||||
p.fieldMap["name"] = p.Name
|
p.fieldMap["name"] = p.Name
|
||||||
p.fieldMap["description"] = p.Description
|
p.fieldMap["description"] = p.Description
|
||||||
|
p.fieldMap["sort"] = p.Sort
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ func ApplyRouters(app *fiber.App) {
|
|||||||
api := app.Group("/api")
|
api := app.Group("/api")
|
||||||
userRouter(api)
|
userRouter(api)
|
||||||
adminRouter(api)
|
adminRouter(api)
|
||||||
|
clientRouter(api)
|
||||||
|
|
||||||
// 回调
|
// 回调
|
||||||
callbacks := app.Group("/callback")
|
callbacks := app.Group("/callback")
|
||||||
@@ -45,7 +46,6 @@ func userRouter(api fiber.Router) {
|
|||||||
auth.Post("/token", auth2.Token)
|
auth.Post("/token", auth2.Token)
|
||||||
auth.Post("/revoke", auth2.Revoke)
|
auth.Post("/revoke", auth2.Revoke)
|
||||||
auth.Post("/introspect", auth2.Introspect)
|
auth.Post("/introspect", auth2.Introspect)
|
||||||
auth.Post("/verify/sms", handlers.SmsCode)
|
|
||||||
|
|
||||||
// 用户
|
// 用户
|
||||||
user := api.Group("/user")
|
user := api.Group("/user")
|
||||||
@@ -67,19 +67,18 @@ func userRouter(api fiber.Router) {
|
|||||||
resource.Post("/list/short", handlers.PageResourceShort)
|
resource.Post("/list/short", handlers.PageResourceShort)
|
||||||
resource.Post("/list/long", handlers.PageResourceLong)
|
resource.Post("/list/long", handlers.PageResourceLong)
|
||||||
resource.Post("/create", handlers.CreateResource)
|
resource.Post("/create", handlers.CreateResource)
|
||||||
resource.Post("/price", handlers.ResourcePrice)
|
|
||||||
resource.Post("/statistics/free", handlers.StatisticResourceFree)
|
resource.Post("/statistics/free", handlers.StatisticResourceFree)
|
||||||
resource.Post("/statistics/usage", handlers.StatisticResourceUsage)
|
resource.Post("/statistics/usage", handlers.StatisticResourceUsage)
|
||||||
|
|
||||||
// 批次
|
// 批次
|
||||||
batch := api.Group("/batch")
|
batch := api.Group("/batch")
|
||||||
batch.Post("/page", handlers.PageResourceBatch)
|
batch.Post("/page", handlers.PageBatch)
|
||||||
|
|
||||||
// 通道
|
// 通道
|
||||||
channel := api.Group("/channel")
|
channel := api.Group("/channel")
|
||||||
channel.Post("/list", handlers.ListChannels)
|
channel.Post("/list", handlers.ListChannel)
|
||||||
channel.Post("/create", handlers.CreateChannel)
|
channel.Post("/create", handlers.CreateChannel)
|
||||||
channel.Post("/remove", handlers.RemoveChannels)
|
|
||||||
|
|
||||||
// 交易
|
// 交易
|
||||||
trade := api.Group("/trade")
|
trade := api.Group("/trade")
|
||||||
@@ -101,7 +100,6 @@ func userRouter(api fiber.Router) {
|
|||||||
proxy.Post("/online", handlers.ProxyReportOnline)
|
proxy.Post("/online", handlers.ProxyReportOnline)
|
||||||
proxy.Post("/offline", handlers.ProxyReportOffline)
|
proxy.Post("/offline", handlers.ProxyReportOffline)
|
||||||
proxy.Post("/update", handlers.ProxyReportUpdate)
|
proxy.Post("/update", handlers.ProxyReportUpdate)
|
||||||
proxy.Post("/register/baidyin", handlers.ProxyRegisterBaiYin)
|
|
||||||
|
|
||||||
// 节点
|
// 节点
|
||||||
edge := api.Group("/edge")
|
edge := api.Group("/edge")
|
||||||
@@ -113,39 +111,60 @@ func userRouter(api fiber.Router) {
|
|||||||
inquiry.Post("/create", handlers.CreateInquiry)
|
inquiry.Post("/create", handlers.CreateInquiry)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 客户端接口路由
|
||||||
|
func clientRouter(api fiber.Router) {
|
||||||
|
client := api
|
||||||
|
|
||||||
|
// 验证短信令牌
|
||||||
|
client.Post("/sms/verify", handlers.SmsCode)
|
||||||
|
|
||||||
|
// 套餐定价查询
|
||||||
|
resource := client.Group("/resource")
|
||||||
|
resource.Post("/price", handlers.ResourcePrice)
|
||||||
|
|
||||||
|
// 通道管理
|
||||||
|
channel := client.Group("/channel")
|
||||||
|
channel.Post("/remove", handlers.RemoveChannels)
|
||||||
|
|
||||||
|
// 代理网关注册
|
||||||
|
proxy := client.Group("/proxy")
|
||||||
|
proxy.Post("/register/baidyin", handlers.ProxyRegisterBaiYin)
|
||||||
|
}
|
||||||
|
|
||||||
// 管理员接口路由
|
// 管理员接口路由
|
||||||
func adminRouter(api fiber.Router) {
|
func adminRouter(api fiber.Router) {
|
||||||
api = api.Group("/admin")
|
api = api.Group("/admin")
|
||||||
|
|
||||||
// permission 权限
|
// admin 管理员
|
||||||
var permission = api.Group("/permission")
|
|
||||||
permission.Post("/list", handlers.ListPermissionsByAdmin)
|
|
||||||
permission.Post("/page", handlers.PagePermissionByAdmin)
|
|
||||||
|
|
||||||
// admin-role 管理员角色
|
|
||||||
var adminRole = api.Group("/admin-role")
|
|
||||||
adminRole.Post("/list", handlers.ListAdminRolesByAdmin)
|
|
||||||
adminRole.Post("/page", handlers.PageAdminRolesByAdmin)
|
|
||||||
adminRole.Post("/create", handlers.CreateAdminRole)
|
|
||||||
adminRole.Post("/update", handlers.UpdateAdminRole)
|
|
||||||
adminRole.Post("/remove", handlers.RemoveAdminRole)
|
|
||||||
|
|
||||||
// admin 管理员账户
|
|
||||||
var admin = api.Group("/admin")
|
var admin = api.Group("/admin")
|
||||||
admin.Post("/page", handlers.PageAdminsByAdmin)
|
admin.Post("/all", handlers.AllAdminByAdmin)
|
||||||
admin.Post("/all", handlers.ListAdminsByAdmin)
|
admin.Post("/page", handlers.PageAdminByAdmin)
|
||||||
admin.Post("/create", handlers.CreateAdmin)
|
admin.Post("/create", handlers.CreateAdmin)
|
||||||
admin.Post("/update", handlers.UpdateAdmin)
|
admin.Post("/update", handlers.UpdateAdmin)
|
||||||
admin.Post("/remove", handlers.RemoveAdmin)
|
admin.Post("/remove", handlers.RemoveAdmin)
|
||||||
|
|
||||||
|
// admin-role 管理员角色
|
||||||
|
var adminRole = api.Group("/admin-role")
|
||||||
|
adminRole.Post("/list", handlers.AllAdminRoleByAdmin)
|
||||||
|
adminRole.Post("/page", handlers.PageAdminRoleByAdmin)
|
||||||
|
adminRole.Post("/create", handlers.CreateAdminRole)
|
||||||
|
adminRole.Post("/update", handlers.UpdateAdminRole)
|
||||||
|
adminRole.Post("/remove", handlers.RemoveAdminRole)
|
||||||
|
|
||||||
|
// permission 权限
|
||||||
|
var permission = api.Group("/permission")
|
||||||
|
permission.Post("/list", handlers.AllPermissionByAdmin)
|
||||||
|
permission.Post("/page", handlers.PagePermissionByAdmin)
|
||||||
|
|
||||||
// user 用户
|
// user 用户
|
||||||
var user = api.Group("/user")
|
var user = api.Group("/user")
|
||||||
user.Post("/page", handlers.PageUserByAdmin)
|
user.Post("/page", handlers.PageUserByAdmin)
|
||||||
user.Post("/bind", handlers.BindAdmin)
|
|
||||||
user.Post("/create", handlers.CreateUserByAdmin)
|
user.Post("/create", handlers.CreateUserByAdmin)
|
||||||
user.Post("/update", handlers.UpdateUserByAdmin)
|
user.Post("/update", handlers.UpdateUserByAdmin)
|
||||||
user.Post("/remove", handlers.RemoveUserByAdmin)
|
user.Post("/remove", handlers.RemoveUserByAdmin)
|
||||||
|
|
||||||
|
user.Post("/bind", handlers.BindAdmin)
|
||||||
|
|
||||||
// resource 套餐
|
// resource 套餐
|
||||||
var resource = api.Group("/resource")
|
var resource = api.Group("/resource")
|
||||||
resource.Post("/short/page", handlers.PageResourceShortByAdmin)
|
resource.Post("/short/page", handlers.PageResourceShortByAdmin)
|
||||||
@@ -153,15 +172,15 @@ func adminRouter(api fiber.Router) {
|
|||||||
resource.Post("/update", handlers.UpdateResourceByAdmin)
|
resource.Post("/update", handlers.UpdateResourceByAdmin)
|
||||||
|
|
||||||
// batch 批次
|
// batch 批次
|
||||||
var usage = api.Group("batch")
|
var batch = api.Group("/batch")
|
||||||
usage.Post("/page", handlers.PageBatchByAdmin)
|
batch.Post("/page", handlers.PageBatchByAdmin)
|
||||||
|
|
||||||
// channel 通道
|
// channel 通道
|
||||||
var channel = api.Group("/channel")
|
var channel = api.Group("/channel")
|
||||||
channel.Post("/page", handlers.PageChannelsByAdmin)
|
channel.Post("/page", handlers.PageChannelByAdmin)
|
||||||
|
|
||||||
// trade 交易
|
// trade 交易
|
||||||
var trade = api.Group("trade")
|
var trade = api.Group("/trade")
|
||||||
trade.Post("/page", handlers.PageTradeByAdmin)
|
trade.Post("/page", handlers.PageTradeByAdmin)
|
||||||
|
|
||||||
// bill 账单
|
// bill 账单
|
||||||
@@ -170,29 +189,31 @@ func adminRouter(api fiber.Router) {
|
|||||||
|
|
||||||
// product 产品
|
// product 产品
|
||||||
var product = api.Group("/product")
|
var product = api.Group("/product")
|
||||||
product.Post("/all", handlers.AllProductsByAdmin)
|
product.Post("/all", handlers.AllProductByAdmin)
|
||||||
product.Post("/create", handlers.CreateProduct)
|
product.Post("/create", handlers.CreateProduct)
|
||||||
product.Post("/update", handlers.UpdateProduct)
|
product.Post("/update", handlers.UpdateProduct)
|
||||||
product.Post("/remove", handlers.DeleteProduct)
|
product.Post("/remove", handlers.DeleteProduct)
|
||||||
|
|
||||||
product.Post("/sku/all", handlers.AllProductSkuByAdmin)
|
product.Post("/sku/all", handlers.AllProductSkuByAdmin)
|
||||||
product.Post("/sku/page", handlers.PageProductSkuByAdmin)
|
product.Post("/sku/page", handlers.PageProductSkuByAdmin)
|
||||||
product.Post("/sku/create", handlers.CreateProductSku)
|
product.Post("/sku/create", handlers.CreateProductSku)
|
||||||
product.Post("/sku/update", handlers.UpdateProductSku)
|
product.Post("/sku/update", handlers.UpdateProductSku)
|
||||||
product.Post("/sku/update/discount/batch", handlers.BatchUpdateProductSkuDiscount)
|
|
||||||
product.Post("/sku/remove", handlers.DeleteProductSku)
|
product.Post("/sku/remove", handlers.DeleteProductSku)
|
||||||
|
|
||||||
|
product.Post("/sku/update/discount/batch", handlers.BatchUpdateProductSkuDiscount)
|
||||||
|
|
||||||
// discount 折扣
|
// discount 折扣
|
||||||
var discount = api.Group("/discount")
|
var discount = api.Group("/discount")
|
||||||
discount.Post("/page", handlers.PageProductDiscountByAdmin)
|
discount.Post("/all", handlers.AllDiscountByAdmin)
|
||||||
discount.Post("/all", handlers.AllProductDiscountsByAdmin)
|
discount.Post("/page", handlers.PageDiscountByAdmin)
|
||||||
discount.Post("/create", handlers.CreateProductDiscount)
|
discount.Post("/create", handlers.CreateDiscount)
|
||||||
discount.Post("/update", handlers.UpdateProductDiscount)
|
discount.Post("/update", handlers.UpdateDiscount)
|
||||||
discount.Post("/remove", handlers.DeleteProductDiscount)
|
discount.Post("/remove", handlers.DeleteDiscount)
|
||||||
|
|
||||||
// coupon 优惠券
|
// coupon 优惠券
|
||||||
var coupon = api.Group("/coupon")
|
var coupon = api.Group("/coupon")
|
||||||
|
coupon.Post("/all", handlers.AllCouponByAdmin)
|
||||||
coupon.Post("/page", handlers.PageCouponByAdmin)
|
coupon.Post("/page", handlers.PageCouponByAdmin)
|
||||||
coupon.Post("/all", handlers.AllCouponsByAdmin)
|
|
||||||
coupon.Post("/create", handlers.CreateCoupon)
|
coupon.Post("/create", handlers.CreateCoupon)
|
||||||
coupon.Post("/update", handlers.UpdateCoupon)
|
coupon.Post("/update", handlers.UpdateCoupon)
|
||||||
coupon.Post("/remove", handlers.DeleteCoupon)
|
coupon.Post("/remove", handlers.DeleteCoupon)
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ var Permission = &permissionService{}
|
|||||||
type permissionService struct{}
|
type permissionService struct{}
|
||||||
|
|
||||||
func (r *permissionService) ListPermissions() (result []*m.Permission, err error) {
|
func (r *permissionService) ListPermissions() (result []*m.Permission, err error) {
|
||||||
return q.Permission.Find()
|
return q.Permission.Order(q.Permission.Sort).Find()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *permissionService) PagePermissions(req core.PageReq) (result []*m.Permission, count int64, err error) {
|
func (p *permissionService) PagePermissions(req core.PageReq) (result []*m.Permission, count int64, err error) {
|
||||||
|
|||||||
Reference in New Issue
Block a user