feat: support merchant team roles and permissions

This commit is contained in:
yml2213
2026-08-13 11:41:34 +08:00
parent 6c98fa557e
commit a4791decb0
21 changed files with 969 additions and 201 deletions
+72 -4
View File
@@ -1,6 +1,7 @@
package handler
import (
"sort"
"strconv"
"strings"
"time"
@@ -38,11 +39,21 @@ func (h *MerchantHandler) Current(c *gin.Context) {
return
}
response.OK(c, gin.H{
"merchant": merchant,
"role": middleware.GetMerchantRole(c),
"merchant": merchant,
"role": middleware.GetMerchantRole(c),
"permissions": mapKeys(middleware.GetMerchantPermissions(c)),
})
}
func mapKeys(values map[string]struct{}) []string {
keys := make([]string, 0, len(values))
for key := range values {
keys = append(keys, key)
}
sort.Strings(keys)
return keys
}
func (h *MerchantHandler) ListProducts(c *gin.Context) {
page, size := pageParams(c)
list, total, err := h.merchantSvc.ListMerchantProducts(middleware.GetMerchantID(c), page, size, false)
@@ -398,7 +409,10 @@ func (h *MerchantHandler) ListMembers(c *gin.Context) {
}
type addMemberReq struct {
UserID uint `json:"user_id" binding:"required"`
UserID uint `json:"user_id"`
Username string `json:"username"`
Password string `json:"password"`
Nickname string `json:"nickname"`
Role string `json:"role" binding:"required"`
IsDefault bool `json:"is_default"`
}
@@ -406,11 +420,14 @@ type addMemberReq struct {
func (h *MerchantHandler) AddCurrentMerchantMember(c *gin.Context) {
var req addMemberReq
if err := c.ShouldBindJSON(&req); err != nil {
response.BadRequest(c, "参数错误:user_id 与 role 必填")
response.BadRequest(c, "参数错误:角色必填")
return
}
member, err := h.merchantSvc.AddMember(middleware.GetMerchantID(c), service.AddMemberInput{
UserID: req.UserID,
Username: req.Username,
Password: req.Password,
Nickname: req.Nickname,
Role: req.Role,
IsDefault: req.IsDefault,
}, middleware.GetUserID(c))
@@ -421,6 +438,54 @@ func (h *MerchantHandler) AddCurrentMerchantMember(c *gin.Context) {
response.OK(c, member)
}
func (h *MerchantHandler) ListRoles(c *gin.Context) {
roles, err := h.merchantSvc.ListRoles(middleware.GetMerchantID(c))
if err != nil {
response.ServerError(c, err.Error())
return
}
response.OK(c, roles)
}
type createMerchantRoleReq struct {
Code string `json:"code" binding:"required"`
Name string `json:"name" binding:"required"`
Permissions []string `json:"permissions"`
}
func (h *MerchantHandler) CreateRole(c *gin.Context) {
var req createMerchantRoleReq
if err := c.ShouldBindJSON(&req); err != nil {
response.BadRequest(c, "参数错误:角色编码和名称必填")
return
}
role, err := h.merchantSvc.CreateRole(middleware.GetMerchantID(c), service.MerchantRoleInput{
Code: req.Code, Name: req.Name, Permissions: req.Permissions,
}, middleware.GetUserID(c))
if err != nil {
response.BadRequest(c, err.Error())
return
}
response.OK(c, role)
}
func (h *MerchantHandler) UpdateRole(c *gin.Context) {
roleID, _ := strconv.ParseUint(c.Param("id"), 10, 64)
var req createMerchantRoleReq
if err := c.ShouldBindJSON(&req); err != nil {
response.BadRequest(c, "参数错误:角色名称必填")
return
}
role, err := h.merchantSvc.UpdateRole(middleware.GetMerchantID(c), uint(roleID), service.MerchantRoleInput{
Name: req.Name, Permissions: req.Permissions,
}, middleware.GetUserID(c))
if err != nil {
response.BadRequest(c, err.Error())
return
}
response.OK(c, role)
}
func (h *MerchantHandler) ListPlatformMerchants(c *gin.Context) {
page, size := pageParams(c)
list, total, err := h.merchantSvc.ListMerchants(page, size)
@@ -595,6 +660,9 @@ func (h *MerchantHandler) AddPlatformMerchantMember(c *gin.Context) {
id, _ := strconv.ParseUint(c.Param("id"), 10, 64)
member, err := h.merchantSvc.AddMember(uint(id), service.AddMemberInput{
UserID: req.UserID,
Username: req.Username,
Password: req.Password,
Nickname: req.Nickname,
Role: req.Role,
IsDefault: req.IsDefault,
}, middleware.GetUserID(c))
+41 -1
View File
@@ -19,10 +19,50 @@ func NewDashboardHandler(svc *service.FulfillmentService) *DashboardHandler {
}
func (h *DashboardHandler) Dashboard(c *gin.Context) {
stats, err := h.svc.Dashboard(middleware.GetMerchantID(c), middleware.GetRole(c) == model.RoleAdmin)
isAdmin := middleware.GetRole(c) == model.RoleAdmin
stats, err := h.svc.Dashboard(middleware.GetMerchantID(c), isAdmin)
if err != nil {
response.ServerError(c, err.Error())
return
}
if !isAdmin {
permissions := middleware.GetMerchantPermissions(c)
if _, ok := permissions[model.PermissionProductsManage]; !ok {
stats.CatalogProductCount = 0
stats.ProductCount = 0
stats.ActiveProductCount = 0
}
if _, ok := permissions[model.PermissionMembersManage]; !ok {
stats.UserCount = 0
}
if _, ok := permissions[model.PermissionOrdersManage]; !ok {
stats.OrderCount = 0
stats.TodayOrderCount = 0
stats.PaidOrderCount = 0
stats.DeliveringOrderCount = 0
stats.DeliveredOrderCount = 0
stats.ShipFailedOrderCount = 0
stats.CancelledOrderCount = 0
}
if _, ok := permissions[model.PermissionWalletView]; !ok {
stats.TotalSales = 0
stats.TodaySales = 0
stats.TotalFees = 0
stats.TodayFees = 0
}
if _, ok := permissions[model.PermissionWalletView]; !ok {
stats.WalletAvailableBalance = 0
stats.WalletFrozenBalance = 0
}
if _, ok := permissions[model.PermissionAPIManage]; !ok {
stats.APIClientCount = 0
stats.ActiveAPIClientCount = 0
}
if _, ok := permissions[model.PermissionCallbacksManage]; !ok {
stats.CallbackSubscriptionCount = 0
stats.PendingCallbackCount = 0
stats.FailedCallbackCount = 0
}
}
response.OK(c, stats)
}