Merge remote-tracking branch 'origin/master'

# Conflicts:
#	internal/dao/internal/store_desktop_settings.go
#	internal/dao/internal/store_roles.go
#	internal/dao/store_desktop_settings.go
#	internal/dao/store_roles.go
This commit is contained in:
chy
2025-06-13 09:49:03 +08:00
36 changed files with 906 additions and 57 deletions

View File

@ -12,4 +12,9 @@ import (
type IStoreAdminV1 interface { type IStoreAdminV1 interface {
Info(ctx context.Context, req *v1.InfoReq) (res *v1.InfoRes, err error) Info(ctx context.Context, req *v1.InfoReq) (res *v1.InfoRes, err error)
List(ctx context.Context, req *v1.ListReq) (res *v1.ListRes, err error)
Create(ctx context.Context, req *v1.CreateReq) (res *v1.CreateRes, err error)
Update(ctx context.Context, req *v1.UpdateReq) (res *v1.UpdateRes, err error)
EditPassword(ctx context.Context, req *v1.EditPasswordReq) (res *v1.EditPasswordRes, err error)
Delete(ctx context.Context, req *v1.DeleteReq) (res *v1.DeleteRes, err error)
} }

View File

@ -3,10 +3,61 @@ package v1
import "github.com/gogf/gf/v2/frame/g" import "github.com/gogf/gf/v2/frame/g"
type InfoReq struct { type InfoReq struct {
g.Meta `path:"/store/info" method:"get" tags:"StoreAdmin" summary:"(系统、商户门店后台)获取门店管理员信息"` g.Meta `path:"/store/admin/info" method:"get" tags:"StoreAdmin" summary:"(系统、商户门店后台)获取门店管理员信息"`
} }
type InfoRes struct { type InfoRes struct {
Id int64 `json:"id"` Id int64 `json:"id"`
Username string `json:"username"` Username string `json:"username"`
} }
type ListReq struct {
g.Meta `path:"/store/admin" method:"get" tags:"StoreAdmin" summary:"(系统、商户门店后台)门店管理员列表"`
Page int `json:"page" v:"required#页数不能为空"`
Size int `json:"size" v:"required#页大小不能为空"`
StoreId int64 `json:"storeId" v:"required#门店ID不能为空"`
}
type ListRes struct {
List interface{} `json:"list"`
Total int `json:"total"`
}
type CreateReq struct {
g.Meta `path:"/store/admin" method:"post" tags:"StoreAdmin" summary:"(系统、商户门店后台)创建门店管理员"`
Realname string `json:"realname" v:"required#真实姓名不能为空"`
StoreId int64 `json:"storeId" v:"required#门店ID不能为空"`
Username string `json:"username" v:"required#用户名不能为空"`
Password string `json:"password" v:"required#密码不能为空"`
Password2 string `json:"password2" v:"required#确认密码不能为空|same:password"`
Phone string `json:"phone" v:"required#手机号不能为空"`
StoreRoleId int `json:"storeRoleId" v:"required#角色ID不能为空"`
}
type CreateRes struct {
Id int64 `json:"id"`
}
type UpdateReq struct {
g.Meta `path:"/store/admin" method:"put" tags:"StoreAdmin" summary:"(系统、商户门店后台)更新门店管理员"`
Id int64 `json:"id" v:"required#门店管理员ID不能为空"`
Realname string `json:"realname" v:"required#真实姓名不能为空"`
StoreRoleId int `json:"storeRoleId" v:"required#角色ID不能为空"`
Phone string `json:"phone" v:"required#手机号不能为空"`
}
type UpdateRes struct {
Success bool `json:"success"`
}
type EditPasswordReq struct {
g.Meta `path:"/store/admin/password" method:"post" tags:"StoreAdmin" summary:"(系统、商户门店后台)修改门店管理员密码"`
Id int64 `json:"id" v:"required#门店管理员ID不能为空"`
OldPass string `json:"oldPass" v:"required#旧密码不能为空"`
NewPass string `json:"newPass" v:"required#新密码不能为空"`
}
type EditPasswordRes struct {
Success bool `json:"success"`
}
type DeleteReq struct {
g.Meta `path:"/store/admin/{id}" method:"delete" tags:"StoreAdmin" summary:"(系统、商户门店后台)删除门店管理员"`
Id int64 `in:"path" json:"id" v:"required#门店管理员ID不能为空"`
}
type DeleteRes struct {
Success bool `json:"success"`
}

View File

@ -0,0 +1,18 @@
// =================================================================================
// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT.
// =================================================================================
package storeRole
import (
"context"
"server/api/storeRole/v1"
)
type IStoreRoleV1 interface {
List(ctx context.Context, req *v1.ListReq) (res *v1.ListRes, err error)
Create(ctx context.Context, req *v1.CreateReq) (res *v1.CreateRes, err error)
Update(ctx context.Context, req *v1.UpdateReq) (res *v1.UpdateRes, err error)
Delete(ctx context.Context, req *v1.DeleteReq) (res *v1.DeleteRes, err error)
}

View File

@ -0,0 +1,37 @@
package v1
import "github.com/gogf/gf/v2/frame/g"
type ListReq struct {
g.Meta `path:"/store/role" method:"get" tags:"StoreRole" summary:"(系统、商户门店后台)获取门店角色列表"`
StoreId int64 `json:"storeId" v:"required#门店ID不能为空" dc:"门店ID"`
Page int `json:"page" dc:"页数"`
Size int `json:"size" dc:"页大小"`
}
type ListRes struct {
List interface{} `json:"list"`
Total int `json:"total"`
}
type CreateReq struct {
g.Meta `path:"/store/role" method:"post" tags:"StoreRole" summary:"(系统、商户门店后台)创建门店角色"`
StoreId int64 `json:"storeId" v:"required#门店ID不能为空" dc:"门店ID"`
Name string `json:"name" v:"required#角色名称不能为空" dc:"角色名称"`
}
type CreateRes struct {
Id int64 `json:"id"`
}
type UpdateReq struct {
g.Meta `path:"/store/role" method:"put" tags:"StoreRole" summary:"(系统、商户门店后台)更新门店角色"`
Id int64 `json:"id" v:"required#角色ID不能为空" dc:"角色ID"`
Name string `json:"name" v:"required#角色名称不能为空" dc:"角色名称"`
}
type UpdateRes struct {
Success bool `json:"success" dc:"是否成功"`
}
type DeleteReq struct {
g.Meta `path:"/store/role/{id}" method:"delete" tags:"StoreRole" summary:"(系统、商户门店后台)删除门店角色"`
Id int64 `in:"path" json:"id" v:"required#角色ID不能为空" dc:"角色ID"`
}
type DeleteRes struct {
Success bool `json:"success" dc:"是否成功"`
}

View File

@ -15,6 +15,8 @@ import (
"server/internal/controller/rewardType" "server/internal/controller/rewardType"
"server/internal/controller/role" "server/internal/controller/role"
"server/internal/controller/store" "server/internal/controller/store"
"server/internal/controller/storeAdmin"
"server/internal/controller/storeRole"
"server/internal/controller/task" "server/internal/controller/task"
"server/internal/controller/upload" "server/internal/controller/upload"
"server/internal/controller/user" "server/internal/controller/user"
@ -46,6 +48,8 @@ var (
role.NewV1(), role.NewV1(),
merchant.NewV1(), merchant.NewV1(),
store.NewV1(), store.NewV1(),
storeRole.NewV1(),
storeAdmin.NewV1(),
rewardType.NewV1(), rewardType.NewV1(),
feedback.NewV1(), feedback.NewV1(),
user.NewV1(), user.NewV1(),

View File

@ -0,0 +1,17 @@
package storeAdmin
import (
"context"
"server/internal/model"
"server/internal/service"
"server/api/storeAdmin/v1"
)
func (c *ControllerV1) Create(ctx context.Context, req *v1.CreateReq) (res *v1.CreateRes, err error) {
out, err := service.StoreAdmin().Create(ctx, &model.StoreAdminCreateIn{StoreId: req.StoreId, Username: req.Username, Password: req.Password, StoreRoleId: req.StoreRoleId, Phone: req.Phone, RealName: req.Realname})
if err != nil {
return nil, err
}
return &v1.CreateRes{Id: out.Id}, nil
}

View File

@ -0,0 +1,21 @@
package storeAdmin
import (
"context"
"server/internal/model"
"server/internal/service"
"server/api/storeAdmin/v1"
)
func (c *ControllerV1) Delete(ctx context.Context, req *v1.DeleteReq) (res *v1.DeleteRes, err error) {
out, err := service.StoreAdmin().Delete(ctx, &model.StoreAdminDeleteIn{
StoreAdminId: req.Id,
})
if err != nil {
return nil, err
}
return &v1.DeleteRes{
Success: out.Success,
}, nil
}

View File

@ -0,0 +1,21 @@
package storeAdmin
import (
"context"
"server/internal/model"
"server/internal/service"
"server/api/storeAdmin/v1"
)
func (c *ControllerV1) EditPassword(ctx context.Context, req *v1.EditPasswordReq) (res *v1.EditPasswordRes, err error) {
out, err := service.StoreAdmin().EditPassword(ctx, &model.StoreAdminEditPasswordIn{
Password: req.OldPass,
Password2: req.NewPass,
StoreAdminId: req.Id,
})
if err != nil {
return nil, err
}
return &v1.EditPasswordRes{Success: out.Success}, nil
}

View File

@ -0,0 +1,20 @@
package storeAdmin
import (
"context"
"server/internal/model"
"server/internal/service"
"server/api/storeAdmin/v1"
)
func (c *ControllerV1) List(ctx context.Context, req *v1.ListReq) (res *v1.ListRes, err error) {
out, err := service.StoreAdmin().List(ctx, &model.StoreAdminListIn{Page: req.Page, Size: req.Size, StoreId: req.StoreId})
if err != nil {
return nil, err
}
return &v1.ListRes{
List: out.List,
Total: out.Total,
}, nil
}

View File

@ -0,0 +1,22 @@
package storeAdmin
import (
"context"
"server/internal/model"
"server/internal/service"
"server/api/storeAdmin/v1"
)
func (c *ControllerV1) Update(ctx context.Context, req *v1.UpdateReq) (res *v1.UpdateRes, err error) {
out, err := service.StoreAdmin().Update(ctx, &model.StoreAdminUpdateIn{
StoreAdminId: req.Id,
Phone: req.Phone,
RealName: req.Realname,
StoreRoleId: req.StoreRoleId,
})
if err != nil {
return nil, err
}
return &v1.UpdateRes{Success: out.Success}, nil
}

View File

@ -0,0 +1,5 @@
// =================================================================================
// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish.
// =================================================================================
package storeRole

View File

@ -0,0 +1,15 @@
// =================================================================================
// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish.
// =================================================================================
package storeRole
import (
"server/api/storeRole"
)
type ControllerV1 struct{}
func NewV1() storeRole.IStoreRoleV1 {
return &ControllerV1{}
}

View File

@ -0,0 +1,17 @@
package storeRole
import (
"context"
"server/internal/model"
"server/internal/service"
"server/api/storeRole/v1"
)
func (c *ControllerV1) Create(ctx context.Context, req *v1.CreateReq) (res *v1.CreateRes, err error) {
out, err := service.StoreRole().Create(ctx, &model.StoreRoleCreateIn{Name: req.Name, StoreId: req.StoreId})
if err != nil {
return nil, err
}
return &v1.CreateRes{Id: out.Id}, nil
}

View File

@ -0,0 +1,17 @@
package storeRole
import (
"context"
"server/internal/model"
"server/internal/service"
"server/api/storeRole/v1"
)
func (c *ControllerV1) Delete(ctx context.Context, req *v1.DeleteReq) (res *v1.DeleteRes, err error) {
out, err := service.StoreRole().Delete(ctx, &model.StoreRoleDeleteIn{Id: req.Id})
if err != nil {
return nil, err
}
return &v1.DeleteRes{Success: out.Success}, nil
}

View File

@ -0,0 +1,20 @@
package storeRole
import (
"context"
"server/internal/model"
"server/internal/service"
"server/api/storeRole/v1"
)
func (c *ControllerV1) List(ctx context.Context, req *v1.ListReq) (res *v1.ListRes, err error) {
out, err := service.StoreRole().List(ctx, &model.StoreRoleListIn{Page: req.Page, Size: req.Size, StoreId: req.StoreId})
if err != nil {
return nil, err
}
return &v1.ListRes{
List: out.List,
Total: out.Total,
}, nil
}

View File

@ -0,0 +1,19 @@
package storeRole
import (
"context"
"server/internal/model"
"server/internal/service"
"server/api/storeRole/v1"
)
func (c *ControllerV1) Update(ctx context.Context, req *v1.UpdateReq) (res *v1.UpdateRes, err error) {
out, err := service.StoreRole().Update(ctx, &model.StoreRoleUpdateIn{Id: req.Id, Name: req.Name})
if err != nil {
return nil, err
}
return &v1.UpdateRes{
Success: out.Success,
}, nil
}

View File

@ -16,7 +16,6 @@ type StoreDesktopSettingsDao struct {
table string // table is the underlying table name of the DAO. table string // table is the underlying table name of the DAO.
group string // group is the database configuration group name of the current DAO. group string // group is the database configuration group name of the current DAO.
columns StoreDesktopSettingsColumns // columns contains all the column names of Table for convenient usage. columns StoreDesktopSettingsColumns // columns contains all the column names of Table for convenient usage.
handlers []gdb.ModelHandler // handlers for customized model modification.
} }
// StoreDesktopSettingsColumns defines and stores column names for the table store_desktop_settings. // StoreDesktopSettingsColumns defines and stores column names for the table store_desktop_settings.
@ -46,12 +45,11 @@ var storeDesktopSettingsColumns = StoreDesktopSettingsColumns{
} }
// NewStoreDesktopSettingsDao creates and returns a new DAO object for table data access. // NewStoreDesktopSettingsDao creates and returns a new DAO object for table data access.
func NewStoreDesktopSettingsDao(handlers ...gdb.ModelHandler) *StoreDesktopSettingsDao { func NewStoreDesktopSettingsDao() *StoreDesktopSettingsDao {
return &StoreDesktopSettingsDao{ return &StoreDesktopSettingsDao{
group: "default", group: "default",
table: "store_desktop_settings", table: "store_desktop_settings",
columns: storeDesktopSettingsColumns, columns: storeDesktopSettingsColumns,
handlers: handlers,
} }
} }
@ -77,11 +75,7 @@ func (dao *StoreDesktopSettingsDao) Group() string {
// Ctx creates and returns a Model for the current DAO. It automatically sets the context for the current operation. // Ctx creates and returns a Model for the current DAO. It automatically sets the context for the current operation.
func (dao *StoreDesktopSettingsDao) Ctx(ctx context.Context) *gdb.Model { func (dao *StoreDesktopSettingsDao) Ctx(ctx context.Context) *gdb.Model {
model := dao.DB().Model(dao.table) return dao.DB().Model(dao.table).Safe().Ctx(ctx)
for _, handler := range dao.handlers {
model = handler(model)
}
return model.Safe().Ctx(ctx)
} }
// Transaction wraps the transaction logic using function f. // Transaction wraps the transaction logic using function f.

View File

@ -16,7 +16,6 @@ type StoreRolesDao struct {
table string // table is the underlying table name of the DAO. table string // table is the underlying table name of the DAO.
group string // group is the database configuration group name of the current DAO. group string // group is the database configuration group name of the current DAO.
columns StoreRolesColumns // columns contains all the column names of Table for convenient usage. columns StoreRolesColumns // columns contains all the column names of Table for convenient usage.
handlers []gdb.ModelHandler // handlers for customized model modification.
} }
// StoreRolesColumns defines and stores column names for the table store_roles. // StoreRolesColumns defines and stores column names for the table store_roles.
@ -40,12 +39,11 @@ var storeRolesColumns = StoreRolesColumns{
} }
// NewStoreRolesDao creates and returns a new DAO object for table data access. // NewStoreRolesDao creates and returns a new DAO object for table data access.
func NewStoreRolesDao(handlers ...gdb.ModelHandler) *StoreRolesDao { func NewStoreRolesDao() *StoreRolesDao {
return &StoreRolesDao{ return &StoreRolesDao{
group: "default", group: "default",
table: "store_roles", table: "store_roles",
columns: storeRolesColumns, columns: storeRolesColumns,
handlers: handlers,
} }
} }
@ -71,11 +69,7 @@ func (dao *StoreRolesDao) Group() string {
// Ctx creates and returns a Model for the current DAO. It automatically sets the context for the current operation. // Ctx creates and returns a Model for the current DAO. It automatically sets the context for the current operation.
func (dao *StoreRolesDao) Ctx(ctx context.Context) *gdb.Model { func (dao *StoreRolesDao) Ctx(ctx context.Context) *gdb.Model {
model := dao.DB().Model(dao.table) return dao.DB().Model(dao.table).Safe().Ctx(ctx)
for _, handler := range dao.handlers {
model = handler(model)
}
return model.Safe().Ctx(ctx)
} }
// Transaction wraps the transaction logic using function f. // Transaction wraps the transaction logic using function f.

View File

@ -8,15 +8,20 @@ import (
"server/internal/dao/internal" "server/internal/dao/internal"
) )
// internalStoreDesktopSettingsDao is an internal type for wrapping the internal DAO implementation.
type internalStoreDesktopSettingsDao = *internal.StoreDesktopSettingsDao
// storeDesktopSettingsDao is the data access object for the table store_desktop_settings. // storeDesktopSettingsDao is the data access object for the table store_desktop_settings.
// You can define custom methods on it to extend its functionality as needed. // You can define custom methods on it to extend its functionality as needed.
type storeDesktopSettingsDao struct { type storeDesktopSettingsDao struct {
*internal.StoreDesktopSettingsDao internalStoreDesktopSettingsDao
} }
var ( var (
// StoreDesktopSettings is a globally accessible object for table store_desktop_settings operations. // StoreDesktopSettings is a globally accessible object for table store_desktop_settings operations.
StoreDesktopSettings = storeDesktopSettingsDao{internal.NewStoreDesktopSettingsDao()} StoreDesktopSettings = storeDesktopSettingsDao{
internal.NewStoreDesktopSettingsDao(),
}
) )
// Add your custom methods and functionality below. // Add your custom methods and functionality below.

View File

@ -8,15 +8,20 @@ import (
"server/internal/dao/internal" "server/internal/dao/internal"
) )
// internalStoreRolesDao is an internal type for wrapping the internal DAO implementation.
type internalStoreRolesDao = *internal.StoreRolesDao
// storeRolesDao is the data access object for the table store_roles. // storeRolesDao is the data access object for the table store_roles.
// You can define custom methods on it to extend its functionality as needed. // You can define custom methods on it to extend its functionality as needed.
type storeRolesDao struct { type storeRolesDao struct {
*internal.StoreRolesDao internalStoreRolesDao
} }
var ( var (
// StoreRoles is a globally accessible object for table store_roles operations. // StoreRoles is a globally accessible object for table store_roles operations.
StoreRoles = storeRolesDao{internal.NewStoreRolesDao()} StoreRoles = storeRolesDao{
internal.NewStoreRolesDao(),
}
) )
// Add your custom methods and functionality below. // Add your custom methods and functionality below.

View File

@ -15,6 +15,7 @@ import (
_ "server/internal/logic/role" _ "server/internal/logic/role"
_ "server/internal/logic/store" _ "server/internal/logic/store"
_ "server/internal/logic/storeAdmin" _ "server/internal/logic/storeAdmin"
_ "server/internal/logic/storeRole"
_ "server/internal/logic/task" _ "server/internal/logic/task"
_ "server/internal/logic/upload" _ "server/internal/logic/upload"
_ "server/internal/logic/user" _ "server/internal/logic/user"

View File

@ -5,8 +5,6 @@ import (
"fmt" "fmt"
"github.com/gogf/gf/v2/database/gdb" "github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/os/gtime"
"github.com/gogf/gf/v2/util/grand" "github.com/gogf/gf/v2/util/grand"
"server/internal/consts" "server/internal/consts"
"server/internal/dao" "server/internal/dao"
@ -80,13 +78,6 @@ func (s *sMerchantAdmin) Login(ctx context.Context, in *model.MerchantLoginIn) (
out = &model.MerchantLoginOut{ out = &model.MerchantLoginOut{
Token: token, Token: token,
} }
go func(ctx context.Context, merchantAdminId int64) {
// 更新商户管理员登录时间
dao.MerchantAdmins.Ctx(ctx).WherePri(merchantAdminId).Update(do.MerchantAdmins{
LastLoginAt: gtime.Now(),
LastLoginIp: ghttp.RequestFromCtx(ctx).RemoteAddr,
})
}(context.Background(), mAdminId)
return return
} }
func (s *sMerchantAdmin) Info(ctx context.Context, in *model.MerchantAdminInfoIn) (out *model.MerchantAdminInfoOut, err error) { func (s *sMerchantAdmin) Info(ctx context.Context, in *model.MerchantAdminInfoIn) (out *model.MerchantAdminInfoOut, err error) {

View File

@ -3,6 +3,7 @@ package store
import ( import (
"context" "context"
"github.com/gogf/gf/v2/database/gdb" "github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/errors/gerror"
"server/internal/consts" "server/internal/consts"
"server/internal/dao" "server/internal/dao"
"server/internal/model" "server/internal/model"
@ -152,3 +153,77 @@ func (s *sStore) Info(ctx context.Context, in *model.StoreInfoIn) (out *model.St
// TODO 获取门店信息等相关信息 // TODO 获取门店信息等相关信息
return return
} }
func (s *sStore) GetDesktopSetting(ctx context.Context, in *model.StoreGetDesktopSettingIn) (*model.StoreGetDesktopSettingOut, error) {
// 检查门店桌面设置是否存在
exist, err := dao.StoreDesktopSettings.Ctx(ctx).Where(do.StoreDesktopSettings{StoreId: in.StoreId}).Count()
if err != nil {
return nil, gerror.Wrap(ecode.Fail, "查询门店桌面设置出现异常")
}
if exist == 0 {
return &model.StoreGetDesktopSettingOut{}, nil
}
// 查询桌面设置
out := &model.StoreGetDesktopSettingOut{}
err = dao.StoreDesktopSettings.Ctx(ctx).Where(do.StoreDesktopSettings{StoreId: in.StoreId}).Scan(out)
if err != nil {
return nil, gerror.Wrap(ecode.Fail, "查询门店桌面设置出现异常")
}
return out, nil
}
func (s *sStore) SaveDesktopSetting(ctx context.Context, in *model.SaveDesktopSettingIn) (*model.SaveDesktopSettingOut, error) {
out := &model.SaveDesktopSettingOut{}
err := dao.StoreDesktopSettings.Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
// 构建数据,包含所有字段
data := do.StoreDesktopSettings{
Id: in.Id,
StoreId: in.StoreId,
BackgroundUrl: in.BackgroundUrl,
Resolution: in.Resolution,
IsTopWidgetVisible: in.IsTopWidgetVisible,
IsRightWidgetVisible: in.IsRightWidgetVisible,
}
// 检查记录是否存在(基于 store_id
exist, err := dao.StoreDesktopSettings.Ctx(ctx).TX(tx).Where(do.StoreDesktopSettings{StoreId: in.StoreId}).Count()
if err != nil {
return gerror.Wrap(ecode.Fail, "检查门店桌面设置失败")
}
if exist == 0 {
// 新增
result, err := dao.StoreDesktopSettings.Ctx(ctx).TX(tx).Data(data).Insert()
if err != nil {
return gerror.Wrap(ecode.Fail, "新增门店桌面设置失败")
}
id, err := result.LastInsertId()
if err != nil {
return gerror.Wrap(ecode.Fail, "获取新增记录ID失败")
}
out.Id = id
} else {
// 更新(如果提供了 Id则优先使用 Id 作为条件,否则使用 StoreId
updateWhere := do.StoreDesktopSettings{StoreId: in.StoreId}
if in.Id > 0 {
updateWhere = do.StoreDesktopSettings{Id: in.Id}
}
_, err := dao.StoreDesktopSettings.Ctx(ctx).TX(tx).Data(data).Where(updateWhere).Update()
if err != nil {
return gerror.Wrap(ecode.Fail, "更新门店桌面设置失败")
}
id, err := dao.StoreDesktopSettings.Ctx(ctx).TX(tx).Where(updateWhere).Fields(dao.StoreDesktopSettings.Columns().Id).Value()
if err != nil {
return gerror.Wrap(ecode.Fail, "获取更新记录ID失败")
}
out.Id = id.Int64()
}
return nil
})
if err != nil {
return nil, err
}
return out, nil
}

View File

@ -2,6 +2,7 @@ package storeAdmin
import ( import (
"context" "context"
"fmt"
"server/internal/consts" "server/internal/consts"
"server/internal/dao" "server/internal/dao"
"server/internal/model" "server/internal/model"
@ -92,3 +93,132 @@ func (s *sStoreAdmin) Info(ctx context.Context, in *model.StoreAdminInfoIn) (out
} }
return return
} }
func (s *sStoreAdmin) List(ctx context.Context, in *model.StoreAdminListIn) (out *model.StoreAdminListOut, err error) {
list := make([]model.StoreAdmin, 0)
var total int
if err = dao.StoreAdmins.Ctx(ctx).LeftJoin(
dao.StoreRoles.Table(),
fmt.Sprintf("%s.%s = %s.%s", dao.StoreAdmins.Table(), dao.StoreAdmins.Columns().StoreRoleId, dao.StoreRoles.Table(), dao.StoreRoles.Columns().Id),
).Fields(
fmt.Sprintf("%s.*, %s.name as store_role_name", dao.StoreAdmins.Table(), dao.StoreRoles.Table()),
).Page(in.Page, in.Size).Where(do.StoreAdmins{StoreId: in.StoreId}).ScanAndCount(&list, &total, false); err != nil {
return nil, ecode.Fail.Sub("查询门店管理员失败")
}
return &model.StoreAdminListOut{
List: list,
Total: total,
}, nil
}
func (s *sStoreAdmin) Create(ctx context.Context, in *model.StoreAdminCreateIn) (out *model.CreateOut, err error) {
exist, err := dao.StoreAdmins.Ctx(ctx).Where(do.StoreAdmins{Username: in.Username}).Exist()
if err != nil {
return nil, ecode.Fail.Sub("查询商户管理员失败")
}
if exist {
return nil, ecode.Fail.Sub("该用户名已被注册")
}
passwordHash, err := encrypt.EncryptPassword(in.Password)
if err != nil {
return nil, ecode.Fail.Sub("密码加密失败")
}
count, err := dao.StoreRoles.Ctx(ctx).Where(do.StoreRoles{Id: in.StoreRoleId}).Count()
if err != nil {
return nil, ecode.Fail.Sub("查询角色失败")
}
if count == 0 {
return nil, ecode.Params.Sub("角色不存在")
}
value, err := dao.Roles.Ctx(ctx).Where(do.Roles{Code: consts.StoreRoleCode}).Fields(dao.Roles.Columns().Id).Value()
if err != nil {
return nil, ecode.Fail.Sub("查询角色失败")
}
id, err := dao.StoreAdmins.Ctx(ctx).Data(do.StoreAdmins{
Username: in.Username,
RealName: in.RealName,
PasswordHash: passwordHash,
StoreId: in.StoreId,
Phone: in.Phone,
StoreRoleId: in.StoreRoleId,
Status: consts.StoreAdminEnable,
RoleId: value.Int(),
IsPrimary: false,
}).InsertAndGetId()
if err != nil {
return nil, ecode.Fail.Sub("插入商户管理员数据失败")
}
return &model.CreateOut{
Id: id,
}, nil
}
func (s *sStoreAdmin) Update(ctx context.Context, in *model.StoreAdminUpdateIn) (out *model.UpdateOut, err error) {
exist, err := dao.StoreAdmins.Ctx(ctx).WherePri(in.StoreAdminId).Exist()
if err != nil {
return nil, ecode.Fail.Sub("查询商户管理员失败")
}
if !exist {
return nil, ecode.Params.Sub("该用户不存在")
}
if _, err = dao.StoreAdmins.Ctx(ctx).WherePri(in.StoreAdminId).Data(do.StoreAdmins{
RealName: in.RealName,
Phone: in.Phone,
StoreRoleId: in.StoreRoleId,
}).Update(); err != nil {
return nil, ecode.Fail.Sub("更新商户管理员数据失败")
}
return &model.UpdateOut{
Success: true,
}, nil
}
func (s *sStoreAdmin) EditPassword(ctx context.Context, in *model.StoreAdminEditPasswordIn) (out *model.UpdateOut, err error) {
exist, err := dao.StoreAdmins.Ctx(ctx).WherePri(in.StoreAdminId).Exist()
if err != nil {
return nil, ecode.Fail.Sub("查询商户管理员失败")
}
if !exist {
return nil, ecode.Params.Sub("该用户不存在")
}
value, err := dao.StoreAdmins.Ctx(ctx).WherePri(in.StoreAdminId).Fields(dao.StoreAdmins.Columns().PasswordHash).Value()
if err != nil {
return nil, ecode.Fail.Sub("查询商户管理员失败")
}
if !encrypt.ComparePassword(value.String(), in.Password) {
return nil, ecode.Params.Sub("密码错误")
}
newPassHash, err := encrypt.EncryptPassword(in.Password2)
if err != nil {
return nil, ecode.Fail.Sub("密码加密失败")
}
if _, err = dao.StoreAdmins.Ctx(ctx).WherePri(in.StoreAdminId).Data(do.StoreAdmins{
PasswordHash: newPassHash,
}).Update(); err != nil {
return nil, ecode.Fail.Sub("更新商户管理员数据失败")
}
return &model.UpdateOut{
Success: true,
}, nil
}
func (s *sStoreAdmin) Delete(ctx context.Context, in *model.StoreAdminDeleteIn) (out *model.DeleteOut, err error) {
exist, err := dao.StoreAdmins.Ctx(ctx).WherePri(in.StoreAdminId).Exist()
if err != nil {
return nil, ecode.Fail.Sub("查询商户管理员失败")
}
if !exist {
return nil, ecode.Params.Sub("该用户不存在")
}
value, err := dao.StoreAdmins.Ctx(ctx).WherePri(in.StoreAdminId).Fields(dao.StoreAdmins.Columns().IsPrimary).Value()
if err != nil {
return nil, ecode.Fail.Sub("查询商户管理员失败")
}
if value.Bool() {
return nil, ecode.Params.Sub("该用户为门店管理员,不能删除")
}
if _, err = dao.StoreAdmins.Ctx(ctx).WherePri(in.StoreAdminId).Delete(); err != nil {
return nil, ecode.Fail.Sub("删除商户管理员失败")
}
return &model.DeleteOut{
Success: true,
}, nil
}

View File

@ -0,0 +1,143 @@
package storeRole
import (
"context"
"server/internal/dao"
"server/internal/model"
"server/internal/model/do"
"server/internal/service"
"server/utility/ecode"
)
type sStoreRole struct {
}
func New() service.IStoreRole {
return &sStoreRole{}
}
func init() {
service.RegisterStoreRole(New())
}
func (s *sStoreRole) Create(ctx context.Context, in *model.StoreRoleCreateIn) (out *model.StoreRoleCreateOut, err error) {
out = &model.StoreRoleCreateOut{}
// 检查角色名称是否已存在
exist, err := dao.StoreRoles.Ctx(ctx).Where(do.StoreRoles{
StoreId: in.StoreId,
Name: in.Name,
}).Exist()
if err != nil {
return nil, ecode.Fail.Sub("新增角色查重出现异常")
}
if exist {
return nil, ecode.Params.Sub("该门店下角色名称已存在")
}
// 创建角色
id, err := dao.StoreRoles.Ctx(ctx).InsertAndGetId(do.StoreRoles{
StoreId: in.StoreId,
Name: in.Name,
})
if err != nil {
return nil, ecode.Fail.Sub("创建角色失败")
}
out.Id = id
return out, nil
}
func (s *sStoreRole) Update(ctx context.Context, in *model.StoreRoleUpdateIn) (out *model.StoreRoleUpdateOut, err error) {
out = &model.StoreRoleUpdateOut{}
// 检查角色是否存在
exist, err := dao.StoreRoles.Ctx(ctx).WherePri(in.Id).Exist()
if err != nil {
return nil, ecode.Fail.Sub("查询角色失败")
}
if !exist {
return nil, ecode.Params.Sub("角色不存在")
}
// 检查角色名称是否已存在(排除自身)
exist, err = dao.StoreRoles.Ctx(ctx).
Where(do.StoreRoles{
StoreId: in.StoreID,
Name: in.Name,
}).
WhereNot(dao.StoreRoles.Columns().Id, in.Id).
Exist()
if err != nil {
return nil, ecode.Fail.Sub("查询角色名称失败")
}
if exist {
return nil, ecode.Params.Sub("该门店下角色名称已存在")
}
// 更新角色
if _, err = dao.StoreRoles.Ctx(ctx).
Where(do.StoreRoles{Id: in.Id}).
Update(do.StoreRoles{
Name: in.Name,
}); err != nil {
return nil, ecode.Fail.Sub("更新角色失败")
}
out.Success = true
return out, nil
}
func (s *sStoreRole) Delete(ctx context.Context, in *model.StoreRoleDeleteIn) (out *model.StoreRoleDeleteOut, err error) {
out = &model.StoreRoleDeleteOut{}
// 检查角色是否存在
exist, err := dao.StoreRoles.Ctx(ctx).WherePri(in.Id).Exist()
if err != nil {
return nil, ecode.Fail.Sub("查询角色失败")
}
if !exist {
return nil, ecode.Params.Sub("角色不存在")
}
// 检查是否有管理员使用该角色
count, err := dao.StoreAdmins.Ctx(ctx).Where(do.StoreAdmins{RoleId: in.Id}).Count()
if err != nil {
return nil, ecode.Fail.Sub("查询角色使用情况失败")
}
if count > 0 {
return nil, ecode.Params.Sub("该角色下存在管理员,无法删除")
}
// 软删除角色
if _, err = dao.StoreRoles.Ctx(ctx).
Where(do.StoreRoles{Id: in.Id}).
Delete(); err != nil {
return nil, ecode.Fail.Sub("删除角色失败")
}
out.Success = true
return out, nil
}
func (s *sStoreRole) List(ctx context.Context, in *model.StoreRoleListIn) (out *model.StoreRoleListOut, err error) {
out = &model.StoreRoleListOut{}
// 构建查询条件
orm := dao.StoreRoles.Ctx(ctx)
if in.StoreId > 0 {
orm = orm.Where(do.StoreRoles{StoreId: in.StoreId})
}
// 获取分页数据
list := make([]model.StoreRoleListItem, 0)
var total int
if err = orm.Page(in.Page, in.Size).
OrderDesc(dao.StoreRoles.Columns().Id).
ScanAndCount(&list, &total, false); err != nil {
return nil, ecode.Fail.Sub("查询角色列表失败")
}
out.List = list
out.Total = total
return out, nil
}

View File

@ -63,6 +63,10 @@ func (s *sUser) Login(ctx context.Context, in *model.UserLoginIn) (out *model.Us
return nil, ecode.Fail.Sub("查找用户失败") return nil, ecode.Fail.Sub("查找用户失败")
} }
var userId int64 var userId int64
v, err := dao.Stores.Ctx(ctx).Where(do.Stores{StoreCode: in.StoreCode}).Fields(dao.Stores.Columns().Id).Value()
if err != nil {
return nil, ecode.Fail.Sub("查找门店失败")
}
if !exist { if !exist {
// 用户不存在,创建新用户 // 用户不存在,创建新用户
// 生成 username: qy_ + 8位随机字母数字 // 生成 username: qy_ + 8位随机字母数字
@ -94,6 +98,7 @@ func (s *sUser) Login(ctx context.Context, in *model.UserLoginIn) (out *model.Us
WxPopenId: utility.GenerateUserID("WX"), WxPopenId: utility.GenerateUserID("WX"),
QqPopenId: utility.GenerateUserID("QQ"), QqPopenId: utility.GenerateUserID("QQ"),
RoleId: value[dao.Roles.Columns().Id].Int64(), RoleId: value[dao.Roles.Columns().Id].Int64(),
LastLoginStoreId: v.Int64(),
} }
result, err := dao.Users.Ctx(ctx).Insert(user) result, err := dao.Users.Ctx(ctx).Insert(user)
if err != nil { if err != nil {
@ -110,7 +115,7 @@ func (s *sUser) Login(ctx context.Context, in *model.UserLoginIn) (out *model.Us
return nil, ecode.Fail.Sub("查找用户失败") return nil, ecode.Fail.Sub("查找用户失败")
} }
userId = user.Id userId = user.Id
if _, err := dao.Users.Ctx(ctx).Where(do.Users{Id: userId}).Update(do.Users{LastLoginAt: gtime.Now()}); err != nil { if _, err := dao.Users.Ctx(ctx).Where(do.Users{Id: userId}).Update(do.Users{LastLoginAt: gtime.Now(), LastLoginStoreId: v.Int64()}); err != nil {
return nil, ecode.Fail.Sub("更新登录时间失败") return nil, ecode.Fail.Sub("更新登录时间失败")
} }
} }
@ -266,15 +271,15 @@ func (s *sUser) UnBoundUrl(ctx context.Context, in *model.UserBoundUrlIn) (out *
func (s *sUser) BoundInfo(ctx context.Context, in *model.UserBoundInfoIn) (out *model.UserBoundInfoOut, err error) { func (s *sUser) BoundInfo(ctx context.Context, in *model.UserBoundInfoIn) (out *model.UserBoundInfoOut, err error) {
url, err := gamelife.GetGamelifeClient(ctx).GetBound(ctx, in.PopenId) url, err := gamelife.GetGamelifeClient(ctx).GetBound(ctx, in.PopenId)
if err != nil { if err != nil {
return nil, ecode.Fail.Sub("获取绑定信息失败") return nil, ecode.Fail.Sub("获取查询用户绑定信息 url 失败")
} }
var result model.UserBoundResult var result model.UserBoundResult
resp, err := resty.New().R().SetResult(&result).Post(url) resp, err := resty.New().R().SetResult(&result).Post(url)
if err != nil { if err != nil {
return nil, ecode.Fail.Sub("获取绑定信息失败") return nil, ecode.Fail.Sub("调用游戏人生接口出现异常")
} }
if resp.StatusCode() != 200 { if resp.StatusCode() != 200 {
return nil, ecode.Fail.Sub("获取绑定信息失败") return nil, ecode.Fail.Sub("调用游戏人生接口失败")
} }
return &model.UserBoundInfoOut{ return &model.UserBoundInfoOut{

View File

@ -16,3 +16,48 @@ type StoreAdminLoginIn struct {
type StoreAdminLoginOut struct { type StoreAdminLoginOut struct {
Token string Token string
} }
type StoreAdminListIn struct {
Page int
Size int
StoreId int64
}
type StoreAdmin struct {
Id int64 `json:"id" orm:"id" dc:"门店管理员ID"`
StoreId int64 `json:"storeId" orm:"store_id" dc:"所属门店ID"`
Username string `json:"username" orm:"username" dc:"用户名"`
RealName string `json:"realName" orm:"real_name" dc:"真实姓名"`
Phone string `json:"phone" orm:"phone" dc:"手机号"`
Email string `json:"email" orm:"email" dc:"邮箱"`
IsPrimary bool `json:"isPrimary" orm:"is_primary" dc:"是否为主账号true=是false=否)"`
Status int `json:"status" orm:"status" dc:"状态1=正常2=禁用"`
StoreRoleId int64 `json:"storeRoleId" orm:"store_role_id" dc:"门店角色ID"`
StoreRoleName string `json:"storeRoleName" orm:"store_role_name" dc:"门店角色名称"`
}
type StoreAdminListOut struct {
List []StoreAdmin
Total int
}
type StoreAdminCreateIn struct {
StoreId int64
Username string
Password string
Phone string
StoreRoleId int
RealName string
}
type StoreAdminUpdateIn struct {
StoreAdminId int64
Phone string
StoreRoleId int
RealName string
}
type StoreAdminEditPasswordIn struct {
StoreAdminId int64
Password string
Password2 string
}
type StoreAdminDeleteIn struct {
StoreAdminId int64
}

View File

@ -0,0 +1,34 @@
package model
import "github.com/gogf/gf/v2/frame/g"
type StoreDesktopSettings struct {
g.Meta `orm:"table:store_desktop_settings"`
Id int64 `orm:"id" json:"id"` // 主键ID
StoreId int64 `orm:"store_id" json:"store_id"` // 门店ID
BackgroundUrl string `orm:"background_url" json:"background_url"` // 桌面背景图片URL
Resolution string `orm:"resolution" json:"resolution"` // 分辨率例如1920x1080
IsTopWidgetVisible bool `orm:"is_top_widget_visible" json:"is_top_widget_visible"` // 顶部组件是否显示FALSE=隐藏TRUE=显示
IsRightWidgetVisible bool `orm:"is_right_widget_visible" json:"is_right_widget_visible"` // 右侧组件是否显示FALSE=隐藏TRUE=显示
}
type StoreGetDesktopSettingIn struct {
OperatorId int64
OperatorRole string
StoreId int64
}
type StoreGetDesktopSettingOut struct {
StoreDesktopSettings
}
type SaveDesktopSettingIn struct {
Id int64
StoreId int64
BackgroundUrl string
Resolution string
IsTopWidgetVisible bool
IsRightWidgetVisible bool
}
type SaveDesktopSettingOut struct {
Id int64
}

View File

@ -0,0 +1,44 @@
package model
type StoreRoleCreateIn struct {
StoreId int64
Name string
}
type StoreRoleCreateOut struct {
Id int64 `json:"id"`
}
type StoreRoleUpdateIn struct {
Id int64
StoreID int64
Name string
}
type StoreRoleUpdateOut struct {
Success bool `json:"success"`
}
type StoreRoleDeleteIn struct {
Id int64
}
type StoreRoleDeleteOut struct {
Success bool `json:"success"`
}
type StoreRoleListIn struct {
StoreId int64
Page int
Size int
}
type StoreRoleListItem struct {
Id int64 `json:"id"`
StoreID int64 `json:"storeId"`
Name string `json:"name"`
}
type StoreRoleListOut struct {
Total int `json:"total"`
List []StoreRoleListItem `json:"list"`
}

View File

@ -3,6 +3,7 @@ package packed
import ( import (
_ "github.com/gogf/gf/contrib/drivers/mysql/v2" _ "github.com/gogf/gf/contrib/drivers/mysql/v2"
_ "github.com/gogf/gf/contrib/nosql/redis/v2" _ "github.com/gogf/gf/contrib/nosql/redis/v2"
_ "server/utility/gamelife"
_ "server/utility/myCasbin" _ "server/utility/myCasbin"
_ "server/utility/rsa" _ "server/utility/rsa"
_ "server/utility/snowid" _ "server/utility/snowid"

View File

@ -17,6 +17,8 @@ type (
Update(ctx context.Context, in *model.StoreUpdateIn) (out *model.UpdateOut, err error) Update(ctx context.Context, in *model.StoreUpdateIn) (out *model.UpdateOut, err error)
Delete(ctx context.Context, in *model.StoreDeleteIn) (out *model.DeleteOut, err error) Delete(ctx context.Context, in *model.StoreDeleteIn) (out *model.DeleteOut, err error)
Info(ctx context.Context, in *model.StoreInfoIn) (out *model.StoreInfoOut, err error) Info(ctx context.Context, in *model.StoreInfoIn) (out *model.StoreInfoOut, err error)
GetDesktopSetting(ctx context.Context, in *model.StoreGetDesktopSettingIn) (*model.StoreGetDesktopSettingOut, error)
SaveDesktopSetting(ctx context.Context, in *model.SaveDesktopSettingIn) (*model.SaveDesktopSettingOut, error)
} }
) )

View File

@ -14,6 +14,11 @@ type (
IStoreAdmin interface { IStoreAdmin interface {
Login(ctx context.Context, in *model.StoreAdminLoginIn) (out *model.StoreAdminLoginOut, err error) Login(ctx context.Context, in *model.StoreAdminLoginIn) (out *model.StoreAdminLoginOut, err error)
Info(ctx context.Context, in *model.StoreAdminInfoIn) (out *model.StoreAdminInfoOut, err error) Info(ctx context.Context, in *model.StoreAdminInfoIn) (out *model.StoreAdminInfoOut, err error)
List(ctx context.Context, in *model.StoreAdminListIn) (out *model.StoreAdminListOut, err error)
Create(ctx context.Context, in *model.StoreAdminCreateIn) (out *model.CreateOut, err error)
Update(ctx context.Context, in *model.StoreAdminUpdateIn) (out *model.UpdateOut, err error)
EditPassword(ctx context.Context, in *model.StoreAdminEditPasswordIn) (out *model.UpdateOut, err error)
Delete(ctx context.Context, in *model.StoreAdminDeleteIn) (out *model.DeleteOut, err error)
} }
) )

View File

@ -0,0 +1,35 @@
// ================================================================================
// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT.
// You can delete these comments if you wish manually maintain this interface file.
// ================================================================================
package service
import (
"context"
"server/internal/model"
)
type (
IStoreRole interface {
Create(ctx context.Context, in *model.StoreRoleCreateIn) (out *model.StoreRoleCreateOut, err error)
Update(ctx context.Context, in *model.StoreRoleUpdateIn) (out *model.StoreRoleUpdateOut, err error)
Delete(ctx context.Context, in *model.StoreRoleDeleteIn) (out *model.StoreRoleDeleteOut, err error)
List(ctx context.Context, in *model.StoreRoleListIn) (out *model.StoreRoleListOut, err error)
}
)
var (
localStoreRole IStoreRole
)
func StoreRole() IStoreRole {
if localStoreRole == nil {
panic("implement not found for interface IStoreRole, forgot register?")
}
return localStoreRole
}
func RegisterStoreRole(i IStoreRole) {
localStoreRole = i
}

View File

@ -37,3 +37,15 @@ wechat:
rsa: rsa:
publickey: "./manifest/config/public.pem" publickey: "./manifest/config/public.pem"
privatekey: "./manifest/config/private.pem" privatekey: "./manifest/config/private.pem"
#OSS配置
oss:
aliyun:
bucket: "waipretty"
key: "LTAI4FhJV8uQvgSzviJ5tgcP"
secret: "Zc5E5CO4fqsXTIFsq4SHIaaXO4beJm"
endpoint: "oss-us-east-1.aliyuncs.com"
gamelife:
platId: "b1749611654"
mode: "test"

View File

@ -128,6 +128,7 @@ func (s *gamelifeClient) GetUserKeyIV(ctx context.Context, popenId string) (cach
err = ecode.Fail.Sub("解密用户信息失败") err = ecode.Fail.Sub("解密用户信息失败")
return return
} }
gamelifeCache := model.UserGamelifeCache{Aes: aesResult.key, IV: aesResult.iv, Token: result.key} gamelifeCache := model.UserGamelifeCache{Aes: aesResult.key, IV: aesResult.iv, Token: result.key}
// 将用户的 aeskey 和 iv 存储到缓存当中,用于后续请求数据加密, 固定时间 2 小时同时不同用户加上一个随机时间 // 将用户的 aeskey 和 iv 存储到缓存当中,用于后续请求数据加密, 固定时间 2 小时同时不同用户加上一个随机时间
if err = g.Redis().SetEX(ctx, fmt.Sprintf(consts.GameLifeUserKey, popenId), gamelifeCache, int64(consts.GameLifeUserExpire+grand.Intn(1000))); err != nil { if err = g.Redis().SetEX(ctx, fmt.Sprintf(consts.GameLifeUserKey, popenId), gamelifeCache, int64(consts.GameLifeUserExpire+grand.Intn(1000))); err != nil {

View File

@ -58,6 +58,9 @@ func init() {
enforcer.AddPolicy("user", "/x/user/getPhoneCode", "POST", "获取验证码") enforcer.AddPolicy("user", "/x/user/getPhoneCode", "POST", "获取验证码")
enforcer.AddPolicy("user", "/x/user/bindPhone", "POST", "绑定手机号") enforcer.AddPolicy("user", "/x/user/bindPhone", "POST", "绑定手机号")
enforcer.AddPolicy("user", "/x/user/info", "GET", "查询用户个人信息") enforcer.AddPolicy("user", "/x/user/info", "GET", "查询用户个人信息")
enforcer.AddPolicy("user", "/x/user/boundInfo", "GET", "查询用户绑定信息")
enforcer.AddPolicy("user", "/x/user/boundUrl", "GET", "获取用户绑定的URL")
enforcer.AddPolicy("user", "/x/user/unBoundUrl", "GET", "获取用户取消绑定的URL")
// 反馈信息 // 反馈信息
enforcer.AddPolicy("user", "/x/feedback", "GET", "获取反馈信息列表") enforcer.AddPolicy("user", "/x/feedback", "GET", "获取反馈信息列表")
@ -80,6 +83,21 @@ func init() {
// 任务 // 任务
enforcer.AddPolicy("user", "/x/task/getNonLoginTaskList", "GET", "获取任务列表(已登录)") enforcer.AddPolicy("user", "/x/task/getNonLoginTaskList", "GET", "获取任务列表(已登录)")
// 门店角色
enforcer.AddPolicy("store", "/x/store/role", "GET", "获取门店角色列表")
enforcer.AddPolicy("store", "/x/store/role", "POST", "添加门店角色")
enforcer.AddPolicy("store", "/x/store/role", "PUT", "更新门店角色")
enforcer.AddPolicy("store", "/x/store/role/*", "DELETE", "删除门店角色")
// 门店管理员(门店员工)
enforcer.AddPolicy("store", "/x/store/admin/info", "GET", "获取门店管理员信息")
enforcer.AddPolicy("store", "/x/store/admin", "GET", "获取门店管理员列表")
enforcer.AddPolicy("store", "/x/store/admin", "POST", "添加门店管理员")
enforcer.AddPolicy("store", "/x/store/admin", "PUT", "更新门店管理员")
enforcer.AddPolicy("store", "/x/store/admin/*", "DELETE", "删除门店管理员")
enforcer.AddPolicy("store", "/x/store/admin/password", "POST", "修改门店管理员密码")
} }
// 商户 // 商户
{ {