From 80b1aa9b917917bc90ab1889b8dc172a81f993a4 Mon Sep 17 00:00:00 2001 From: denghui <1016848185@qq.com> Date: Thu, 12 Jun 2025 17:13:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=BA=86=E9=97=A8=E5=BA=97?= =?UTF-8?q?=E5=91=98=E5=B7=A5=E3=80=81=E5=91=98=E5=B7=A5=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E7=9A=84=E6=8E=A5=E5=8F=A3=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/storeAdmin/storeAdmin.go | 5 + api/storeAdmin/v1/storeAdmin.go | 53 ++++++- api/storeRole/storeRole.go | 18 +++ api/storeRole/v1/storeRole.go | 37 +++++ internal/cmd/cmd.go | 4 + .../storeAdmin/storeAdmin_v1_create.go | 17 +++ .../storeAdmin/storeAdmin_v1_delete.go | 21 +++ .../storeAdmin/storeAdmin_v1_edit_password.go | 21 +++ .../storeAdmin/storeAdmin_v1_list.go | 20 +++ .../storeAdmin/storeAdmin_v1_update.go | 22 +++ internal/controller/storeRole/storeRole.go | 5 + .../controller/storeRole/storeRole_new.go | 15 ++ .../storeRole/storeRole_v1_create.go | 17 +++ .../storeRole/storeRole_v1_delete.go | 17 +++ .../controller/storeRole/storeRole_v1_list.go | 20 +++ .../storeRole/storeRole_v1_update.go | 19 +++ internal/dao/internal/roles.go | 2 + internal/dao/internal/store_admins.go | 2 + .../dao/internal/store_desktop_settings.go | 89 +++++++++++ internal/dao/internal/store_roles.go | 83 ++++++++++ internal/dao/store_desktop_settings.go | 27 ++++ internal/dao/store_roles.go | 27 ++++ internal/logic/logic.go | 1 + internal/logic/merchantAdmin/merchantAdmin.go | 9 -- internal/logic/store/store.go | 75 +++++++++ internal/logic/storeAdmin/storeAdmin.go | 130 ++++++++++++++++ internal/logic/storeRole/storeRole.go | 143 ++++++++++++++++++ internal/logic/user/user.go | 33 ++-- internal/model/do/roles.go | 1 + internal/model/do/store_admins.go | 1 + internal/model/do/store_desktop_settings.go | 24 +++ internal/model/do/store_roles.go | 21 +++ internal/model/entity/roles.go | 1 + internal/model/entity/store_admins.go | 1 + .../model/entity/store_desktop_settings.go | 22 +++ internal/model/entity/store_roles.go | 19 +++ internal/model/storeAdmin.go | 45 ++++++ internal/model/storeDesktopSetting.go | 34 +++++ internal/model/storeRole.go | 44 ++++++ internal/packed/packed.go | 1 + internal/service/store.go | 2 + internal/service/store_admin.go | 5 + internal/service/store_role.go | 35 +++++ manifest/config/config.yaml | 14 +- utility/gamelife/gamelife.go | 1 + utility/myCasbin/casbin.go | 18 +++ 46 files changed, 1196 insertions(+), 25 deletions(-) create mode 100644 api/storeRole/storeRole.go create mode 100644 api/storeRole/v1/storeRole.go create mode 100644 internal/controller/storeAdmin/storeAdmin_v1_create.go create mode 100644 internal/controller/storeAdmin/storeAdmin_v1_delete.go create mode 100644 internal/controller/storeAdmin/storeAdmin_v1_edit_password.go create mode 100644 internal/controller/storeAdmin/storeAdmin_v1_list.go create mode 100644 internal/controller/storeAdmin/storeAdmin_v1_update.go create mode 100644 internal/controller/storeRole/storeRole.go create mode 100644 internal/controller/storeRole/storeRole_new.go create mode 100644 internal/controller/storeRole/storeRole_v1_create.go create mode 100644 internal/controller/storeRole/storeRole_v1_delete.go create mode 100644 internal/controller/storeRole/storeRole_v1_list.go create mode 100644 internal/controller/storeRole/storeRole_v1_update.go create mode 100644 internal/dao/internal/store_desktop_settings.go create mode 100644 internal/dao/internal/store_roles.go create mode 100644 internal/dao/store_desktop_settings.go create mode 100644 internal/dao/store_roles.go create mode 100644 internal/logic/storeRole/storeRole.go create mode 100644 internal/model/do/store_desktop_settings.go create mode 100644 internal/model/do/store_roles.go create mode 100644 internal/model/entity/store_desktop_settings.go create mode 100644 internal/model/entity/store_roles.go create mode 100644 internal/model/storeDesktopSetting.go create mode 100644 internal/model/storeRole.go create mode 100644 internal/service/store_role.go diff --git a/api/storeAdmin/storeAdmin.go b/api/storeAdmin/storeAdmin.go index d98287a..00de00f 100644 --- a/api/storeAdmin/storeAdmin.go +++ b/api/storeAdmin/storeAdmin.go @@ -12,4 +12,9 @@ import ( type IStoreAdminV1 interface { 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) } diff --git a/api/storeAdmin/v1/storeAdmin.go b/api/storeAdmin/v1/storeAdmin.go index 518ded2..3fd2b6d 100644 --- a/api/storeAdmin/v1/storeAdmin.go +++ b/api/storeAdmin/v1/storeAdmin.go @@ -3,10 +3,61 @@ package v1 import "github.com/gogf/gf/v2/frame/g" 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 { Id int64 `json:"id"` 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"` +} diff --git a/api/storeRole/storeRole.go b/api/storeRole/storeRole.go new file mode 100644 index 0000000..8b4de3f --- /dev/null +++ b/api/storeRole/storeRole.go @@ -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) +} diff --git a/api/storeRole/v1/storeRole.go b/api/storeRole/v1/storeRole.go new file mode 100644 index 0000000..8463f45 --- /dev/null +++ b/api/storeRole/v1/storeRole.go @@ -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:"是否成功"` +} diff --git a/internal/cmd/cmd.go b/internal/cmd/cmd.go index 7c56438..62442a5 100644 --- a/internal/cmd/cmd.go +++ b/internal/cmd/cmd.go @@ -15,6 +15,8 @@ import ( "server/internal/controller/rewardType" "server/internal/controller/role" "server/internal/controller/store" + "server/internal/controller/storeAdmin" + "server/internal/controller/storeRole" "server/internal/controller/task" "server/internal/controller/upload" "server/internal/controller/user" @@ -46,6 +48,8 @@ var ( role.NewV1(), merchant.NewV1(), store.NewV1(), + storeRole.NewV1(), + storeAdmin.NewV1(), rewardType.NewV1(), feedback.NewV1(), user.NewV1(), diff --git a/internal/controller/storeAdmin/storeAdmin_v1_create.go b/internal/controller/storeAdmin/storeAdmin_v1_create.go new file mode 100644 index 0000000..0a87d7a --- /dev/null +++ b/internal/controller/storeAdmin/storeAdmin_v1_create.go @@ -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 +} diff --git a/internal/controller/storeAdmin/storeAdmin_v1_delete.go b/internal/controller/storeAdmin/storeAdmin_v1_delete.go new file mode 100644 index 0000000..458c739 --- /dev/null +++ b/internal/controller/storeAdmin/storeAdmin_v1_delete.go @@ -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 +} diff --git a/internal/controller/storeAdmin/storeAdmin_v1_edit_password.go b/internal/controller/storeAdmin/storeAdmin_v1_edit_password.go new file mode 100644 index 0000000..04e47a1 --- /dev/null +++ b/internal/controller/storeAdmin/storeAdmin_v1_edit_password.go @@ -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 +} diff --git a/internal/controller/storeAdmin/storeAdmin_v1_list.go b/internal/controller/storeAdmin/storeAdmin_v1_list.go new file mode 100644 index 0000000..c4306e0 --- /dev/null +++ b/internal/controller/storeAdmin/storeAdmin_v1_list.go @@ -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 +} diff --git a/internal/controller/storeAdmin/storeAdmin_v1_update.go b/internal/controller/storeAdmin/storeAdmin_v1_update.go new file mode 100644 index 0000000..0f8a649 --- /dev/null +++ b/internal/controller/storeAdmin/storeAdmin_v1_update.go @@ -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 +} diff --git a/internal/controller/storeRole/storeRole.go b/internal/controller/storeRole/storeRole.go new file mode 100644 index 0000000..04607ef --- /dev/null +++ b/internal/controller/storeRole/storeRole.go @@ -0,0 +1,5 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package storeRole diff --git a/internal/controller/storeRole/storeRole_new.go b/internal/controller/storeRole/storeRole_new.go new file mode 100644 index 0000000..5aba78a --- /dev/null +++ b/internal/controller/storeRole/storeRole_new.go @@ -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{} +} diff --git a/internal/controller/storeRole/storeRole_v1_create.go b/internal/controller/storeRole/storeRole_v1_create.go new file mode 100644 index 0000000..ffdcac8 --- /dev/null +++ b/internal/controller/storeRole/storeRole_v1_create.go @@ -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 +} diff --git a/internal/controller/storeRole/storeRole_v1_delete.go b/internal/controller/storeRole/storeRole_v1_delete.go new file mode 100644 index 0000000..3b9e3e6 --- /dev/null +++ b/internal/controller/storeRole/storeRole_v1_delete.go @@ -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 +} diff --git a/internal/controller/storeRole/storeRole_v1_list.go b/internal/controller/storeRole/storeRole_v1_list.go new file mode 100644 index 0000000..90a6ca5 --- /dev/null +++ b/internal/controller/storeRole/storeRole_v1_list.go @@ -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 +} diff --git a/internal/controller/storeRole/storeRole_v1_update.go b/internal/controller/storeRole/storeRole_v1_update.go new file mode 100644 index 0000000..025976f --- /dev/null +++ b/internal/controller/storeRole/storeRole_v1_update.go @@ -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 +} diff --git a/internal/dao/internal/roles.go b/internal/dao/internal/roles.go index c8c80b4..9eab304 100644 --- a/internal/dao/internal/roles.go +++ b/internal/dao/internal/roles.go @@ -29,6 +29,7 @@ type RolesColumns struct { UpdatedAt string // 更新时间 DeletedAt string // 软删除时间戳 IsDeletable string // 是否可删除:0=不可删除,1=可删除 + StoreId string // 门店ID } // rolesColumns holds the columns for the table roles. @@ -42,6 +43,7 @@ var rolesColumns = RolesColumns{ UpdatedAt: "updated_at", DeletedAt: "deleted_at", IsDeletable: "is_deletable", + StoreId: "store_id", } // NewRolesDao creates and returns a new DAO object for table data access. diff --git a/internal/dao/internal/store_admins.go b/internal/dao/internal/store_admins.go index 7ab00ec..7bcffcc 100644 --- a/internal/dao/internal/store_admins.go +++ b/internal/dao/internal/store_admins.go @@ -34,6 +34,7 @@ type StoreAdminsColumns struct { UpdatedAt string // 更新时间 DeletedAt string // 软删除时间戳 RoleId string // 角色ID + StoreRoleId string // 门店角色ID } // storeAdminsColumns holds the columns for the table store_admins. @@ -52,6 +53,7 @@ var storeAdminsColumns = StoreAdminsColumns{ UpdatedAt: "updated_at", DeletedAt: "deleted_at", RoleId: "role_id", + StoreRoleId: "store_role_id", } // NewStoreAdminsDao creates and returns a new DAO object for table data access. diff --git a/internal/dao/internal/store_desktop_settings.go b/internal/dao/internal/store_desktop_settings.go new file mode 100644 index 0000000..d6469fa --- /dev/null +++ b/internal/dao/internal/store_desktop_settings.go @@ -0,0 +1,89 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// StoreDesktopSettingsDao is the data access object for the table store_desktop_settings. +type StoreDesktopSettingsDao struct { + table string // table is the underlying table name of the 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. +} + +// StoreDesktopSettingsColumns defines and stores column names for the table store_desktop_settings. +type StoreDesktopSettingsColumns struct { + Id string // 主键ID + StoreId string // 门店ID + BackgroundUrl string // 桌面背景图片URL + Resolution string // 分辨率,例如1920x1080 + IsTopWidgetVisible string // 顶部组件是否显示:FALSE=隐藏,TRUE=显示 + IsRightWidgetVisible string // 右侧组件是否显示:FALSE=隐藏,TRUE=显示 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 软删除时间戳 +} + +// storeDesktopSettingsColumns holds the columns for the table store_desktop_settings. +var storeDesktopSettingsColumns = StoreDesktopSettingsColumns{ + Id: "id", + StoreId: "store_id", + BackgroundUrl: "background_url", + Resolution: "resolution", + IsTopWidgetVisible: "is_top_widget_visible", + IsRightWidgetVisible: "is_right_widget_visible", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewStoreDesktopSettingsDao creates and returns a new DAO object for table data access. +func NewStoreDesktopSettingsDao() *StoreDesktopSettingsDao { + return &StoreDesktopSettingsDao{ + group: "default", + table: "store_desktop_settings", + columns: storeDesktopSettingsColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of the current DAO. +func (dao *StoreDesktopSettingsDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of the current DAO. +func (dao *StoreDesktopSettingsDao) Table() string { + return dao.table +} + +// Columns returns all column names of the current DAO. +func (dao *StoreDesktopSettingsDao) Columns() StoreDesktopSettingsColumns { + return dao.columns +} + +// Group returns the database configuration group name of the current DAO. +func (dao *StoreDesktopSettingsDao) Group() string { + return dao.group +} + +// 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 { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rolls back the transaction and returns the error if function f returns a non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note: Do not commit or roll back the transaction in function f, +// as it is automatically handled by this function. +func (dao *StoreDesktopSettingsDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/dao/internal/store_roles.go b/internal/dao/internal/store_roles.go new file mode 100644 index 0000000..8528459 --- /dev/null +++ b/internal/dao/internal/store_roles.go @@ -0,0 +1,83 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// StoreRolesDao is the data access object for the table store_roles. +type StoreRolesDao struct { + table string // table is the underlying table name of the 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. +} + +// StoreRolesColumns defines and stores column names for the table store_roles. +type StoreRolesColumns struct { + Id string // 门店角色ID + StoreId string // 所属门店ID + Name string // 门店角色名称 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 软删除时间戳 +} + +// storeRolesColumns holds the columns for the table store_roles. +var storeRolesColumns = StoreRolesColumns{ + Id: "id", + StoreId: "store_id", + Name: "name", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewStoreRolesDao creates and returns a new DAO object for table data access. +func NewStoreRolesDao() *StoreRolesDao { + return &StoreRolesDao{ + group: "default", + table: "store_roles", + columns: storeRolesColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of the current DAO. +func (dao *StoreRolesDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of the current DAO. +func (dao *StoreRolesDao) Table() string { + return dao.table +} + +// Columns returns all column names of the current DAO. +func (dao *StoreRolesDao) Columns() StoreRolesColumns { + return dao.columns +} + +// Group returns the database configuration group name of the current DAO. +func (dao *StoreRolesDao) Group() string { + return dao.group +} + +// 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 { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rolls back the transaction and returns the error if function f returns a non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note: Do not commit or roll back the transaction in function f, +// as it is automatically handled by this function. +func (dao *StoreRolesDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/dao/store_desktop_settings.go b/internal/dao/store_desktop_settings.go new file mode 100644 index 0000000..64dec92 --- /dev/null +++ b/internal/dao/store_desktop_settings.go @@ -0,0 +1,27 @@ +// ================================================================================= +// This file is auto-generated by the GoFrame CLI tool. You may modify it as needed. +// ================================================================================= + +package dao + +import ( + "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. +// You can define custom methods on it to extend its functionality as needed. +type storeDesktopSettingsDao struct { + internalStoreDesktopSettingsDao +} + +var ( + // StoreDesktopSettings is a globally accessible object for table store_desktop_settings operations. + StoreDesktopSettings = storeDesktopSettingsDao{ + internal.NewStoreDesktopSettingsDao(), + } +) + +// Add your custom methods and functionality below. diff --git a/internal/dao/store_roles.go b/internal/dao/store_roles.go new file mode 100644 index 0000000..c32920e --- /dev/null +++ b/internal/dao/store_roles.go @@ -0,0 +1,27 @@ +// ================================================================================= +// This file is auto-generated by the GoFrame CLI tool. You may modify it as needed. +// ================================================================================= + +package dao + +import ( + "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. +// You can define custom methods on it to extend its functionality as needed. +type storeRolesDao struct { + internalStoreRolesDao +} + +var ( + // StoreRoles is a globally accessible object for table store_roles operations. + StoreRoles = storeRolesDao{ + internal.NewStoreRolesDao(), + } +) + +// Add your custom methods and functionality below. diff --git a/internal/logic/logic.go b/internal/logic/logic.go index ee63395..eeea66b 100644 --- a/internal/logic/logic.go +++ b/internal/logic/logic.go @@ -15,6 +15,7 @@ import ( _ "server/internal/logic/role" _ "server/internal/logic/store" _ "server/internal/logic/storeAdmin" + _ "server/internal/logic/storeRole" _ "server/internal/logic/task" _ "server/internal/logic/upload" _ "server/internal/logic/user" diff --git a/internal/logic/merchantAdmin/merchantAdmin.go b/internal/logic/merchantAdmin/merchantAdmin.go index bbf0f8a..59c8f4c 100644 --- a/internal/logic/merchantAdmin/merchantAdmin.go +++ b/internal/logic/merchantAdmin/merchantAdmin.go @@ -5,8 +5,6 @@ import ( "fmt" "github.com/gogf/gf/v2/database/gdb" "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" "server/internal/consts" "server/internal/dao" @@ -80,13 +78,6 @@ func (s *sMerchantAdmin) Login(ctx context.Context, in *model.MerchantLoginIn) ( out = &model.MerchantLoginOut{ 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 } func (s *sMerchantAdmin) Info(ctx context.Context, in *model.MerchantAdminInfoIn) (out *model.MerchantAdminInfoOut, err error) { diff --git a/internal/logic/store/store.go b/internal/logic/store/store.go index 1037b01..a355312 100644 --- a/internal/logic/store/store.go +++ b/internal/logic/store/store.go @@ -3,6 +3,7 @@ package store import ( "context" "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/errors/gerror" "server/internal/consts" "server/internal/dao" "server/internal/model" @@ -152,3 +153,77 @@ func (s *sStore) Info(ctx context.Context, in *model.StoreInfoIn) (out *model.St // TODO 获取门店信息等相关信息 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 +} diff --git a/internal/logic/storeAdmin/storeAdmin.go b/internal/logic/storeAdmin/storeAdmin.go index 929ca18..977af5f 100644 --- a/internal/logic/storeAdmin/storeAdmin.go +++ b/internal/logic/storeAdmin/storeAdmin.go @@ -2,6 +2,7 @@ package storeAdmin import ( "context" + "fmt" "server/internal/consts" "server/internal/dao" "server/internal/model" @@ -92,3 +93,132 @@ func (s *sStoreAdmin) Info(ctx context.Context, in *model.StoreAdminInfoIn) (out } 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 +} diff --git a/internal/logic/storeRole/storeRole.go b/internal/logic/storeRole/storeRole.go new file mode 100644 index 0000000..fb94ea6 --- /dev/null +++ b/internal/logic/storeRole/storeRole.go @@ -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 +} diff --git a/internal/logic/user/user.go b/internal/logic/user/user.go index 3ddb1dc..fcdc640 100644 --- a/internal/logic/user/user.go +++ b/internal/logic/user/user.go @@ -63,6 +63,10 @@ func (s *sUser) Login(ctx context.Context, in *model.UserLoginIn) (out *model.Us return nil, ecode.Fail.Sub("查找用户失败") } 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 { // 用户不存在,创建新用户 // 生成 username: qy_ + 8位随机字母数字 @@ -84,16 +88,17 @@ func (s *sUser) Login(ctx context.Context, in *model.UserLoginIn) (out *model.Us return nil, ecode.Fail.Sub("加密密码失败") } user := &entity.Users{ - WxOpenId: in.OpenId, - Username: username, - Nickname: username, - PasswordHash: password, - Avatar: "adssssssssssssss", // FIXME 后续替换成默认头像的 oss 链接 - FirstVisitAt: gtime.Now(), - LastLoginAt: gtime.Now(), - WxPopenId: utility.GenerateUserID("WX"), - QqPopenId: utility.GenerateUserID("QQ"), - RoleId: value[dao.Roles.Columns().Id].Int64(), + WxOpenId: in.OpenId, + Username: username, + Nickname: username, + PasswordHash: password, + Avatar: "adssssssssssssss", // FIXME 后续替换成默认头像的 oss 链接 + FirstVisitAt: gtime.Now(), + LastLoginAt: gtime.Now(), + WxPopenId: utility.GenerateUserID("WX"), + QqPopenId: utility.GenerateUserID("QQ"), + RoleId: value[dao.Roles.Columns().Id].Int64(), + LastLoginStoreId: v.Int64(), } result, err := dao.Users.Ctx(ctx).Insert(user) 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("查找用户失败") } 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("更新登录时间失败") } } @@ -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) { url, err := gamelife.GetGamelifeClient(ctx).GetBound(ctx, in.PopenId) if err != nil { - return nil, ecode.Fail.Sub("获取绑定信息失败") + return nil, ecode.Fail.Sub("获取查询用户绑定信息 url 失败") } var result model.UserBoundResult resp, err := resty.New().R().SetResult(&result).Post(url) if err != nil { - return nil, ecode.Fail.Sub("获取绑定信息失败") + return nil, ecode.Fail.Sub("调用游戏人生接口出现异常") } if resp.StatusCode() != 200 { - return nil, ecode.Fail.Sub("获取绑定信息失败") + return nil, ecode.Fail.Sub("调用游戏人生接口失败") } return &model.UserBoundInfoOut{ diff --git a/internal/model/do/roles.go b/internal/model/do/roles.go index f2a347f..9ba381d 100644 --- a/internal/model/do/roles.go +++ b/internal/model/do/roles.go @@ -21,4 +21,5 @@ type Roles struct { UpdatedAt *gtime.Time // 更新时间 DeletedAt *gtime.Time // 软删除时间戳 IsDeletable interface{} // 是否可删除:0=不可删除,1=可删除 + StoreId interface{} // 门店ID } diff --git a/internal/model/do/store_admins.go b/internal/model/do/store_admins.go index e1e78d6..125922f 100644 --- a/internal/model/do/store_admins.go +++ b/internal/model/do/store_admins.go @@ -26,4 +26,5 @@ type StoreAdmins struct { UpdatedAt *gtime.Time // 更新时间 DeletedAt *gtime.Time // 软删除时间戳 RoleId interface{} // 角色ID + StoreRoleId interface{} // 门店角色ID } diff --git a/internal/model/do/store_desktop_settings.go b/internal/model/do/store_desktop_settings.go new file mode 100644 index 0000000..28132b0 --- /dev/null +++ b/internal/model/do/store_desktop_settings.go @@ -0,0 +1,24 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// StoreDesktopSettings is the golang structure of table store_desktop_settings for DAO operations like Where/Data. +type StoreDesktopSettings struct { + g.Meta `orm:"table:store_desktop_settings, do:true"` + Id interface{} // 主键ID + StoreId interface{} // 门店ID + BackgroundUrl interface{} // 桌面背景图片URL + Resolution interface{} // 分辨率,例如1920x1080 + IsTopWidgetVisible interface{} // 顶部组件是否显示:FALSE=隐藏,TRUE=显示 + IsRightWidgetVisible interface{} // 右侧组件是否显示:FALSE=隐藏,TRUE=显示 + CreatedAt *gtime.Time // 创建时间 + UpdatedAt *gtime.Time // 更新时间 + DeletedAt *gtime.Time // 软删除时间戳 +} diff --git a/internal/model/do/store_roles.go b/internal/model/do/store_roles.go new file mode 100644 index 0000000..34383f9 --- /dev/null +++ b/internal/model/do/store_roles.go @@ -0,0 +1,21 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// StoreRoles is the golang structure of table store_roles for DAO operations like Where/Data. +type StoreRoles struct { + g.Meta `orm:"table:store_roles, do:true"` + Id interface{} // 门店角色ID + StoreId interface{} // 所属门店ID + Name interface{} // 门店角色名称 + CreatedAt *gtime.Time // 创建时间 + UpdatedAt *gtime.Time // 更新时间 + DeletedAt *gtime.Time // 软删除时间戳 +} diff --git a/internal/model/entity/roles.go b/internal/model/entity/roles.go index b473ed3..6edd445 100644 --- a/internal/model/entity/roles.go +++ b/internal/model/entity/roles.go @@ -19,4 +19,5 @@ type Roles struct { UpdatedAt *gtime.Time `json:"updatedAt" orm:"updated_at" description:"更新时间"` // 更新时间 DeletedAt *gtime.Time `json:"deletedAt" orm:"deleted_at" description:"软删除时间戳"` // 软删除时间戳 IsDeletable bool `json:"isDeletable" orm:"is_deletable" description:"是否可删除:0=不可删除,1=可删除"` // 是否可删除:0=不可删除,1=可删除 + StoreId int64 `json:"storeId" orm:"store_id" description:"门店ID"` // 门店ID } diff --git a/internal/model/entity/store_admins.go b/internal/model/entity/store_admins.go index f05dfe3..dc0050e 100644 --- a/internal/model/entity/store_admins.go +++ b/internal/model/entity/store_admins.go @@ -24,4 +24,5 @@ type StoreAdmins struct { UpdatedAt *gtime.Time `json:"updatedAt" orm:"updated_at" description:"更新时间"` // 更新时间 DeletedAt *gtime.Time `json:"deletedAt" orm:"deleted_at" description:"软删除时间戳"` // 软删除时间戳 RoleId int64 `json:"roleId" orm:"role_id" description:"角色ID"` // 角色ID + StoreRoleId int64 `json:"storeRoleId" orm:"store_role_id" description:"门店角色ID"` // 门店角色ID } diff --git a/internal/model/entity/store_desktop_settings.go b/internal/model/entity/store_desktop_settings.go new file mode 100644 index 0000000..0b679d5 --- /dev/null +++ b/internal/model/entity/store_desktop_settings.go @@ -0,0 +1,22 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// StoreDesktopSettings is the golang structure for table store_desktop_settings. +type StoreDesktopSettings struct { + Id int64 `json:"id" orm:"id" description:"主键ID"` // 主键ID + StoreId int64 `json:"storeId" orm:"store_id" description:"门店ID"` // 门店ID + BackgroundUrl string `json:"backgroundUrl" orm:"background_url" description:"桌面背景图片URL"` // 桌面背景图片URL + Resolution string `json:"resolution" orm:"resolution" description:"分辨率,例如1920x1080"` // 分辨率,例如1920x1080 + IsTopWidgetVisible int `json:"isTopWidgetVisible" orm:"is_top_widget_visible" description:"顶部组件是否显示:FALSE=隐藏,TRUE=显示"` // 顶部组件是否显示:FALSE=隐藏,TRUE=显示 + IsRightWidgetVisible int `json:"isRightWidgetVisible" orm:"is_right_widget_visible" description:"右侧组件是否显示:FALSE=隐藏,TRUE=显示"` // 右侧组件是否显示:FALSE=隐藏,TRUE=显示 + CreatedAt *gtime.Time `json:"createdAt" orm:"created_at" description:"创建时间"` // 创建时间 + UpdatedAt *gtime.Time `json:"updatedAt" orm:"updated_at" description:"更新时间"` // 更新时间 + DeletedAt *gtime.Time `json:"deletedAt" orm:"deleted_at" description:"软删除时间戳"` // 软删除时间戳 +} diff --git a/internal/model/entity/store_roles.go b/internal/model/entity/store_roles.go new file mode 100644 index 0000000..c26e9a1 --- /dev/null +++ b/internal/model/entity/store_roles.go @@ -0,0 +1,19 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// StoreRoles is the golang structure for table store_roles. +type StoreRoles struct { + Id int64 `json:"id" orm:"id" description:"门店角色ID"` // 门店角色ID + StoreId int64 `json:"storeId" orm:"store_id" description:"所属门店ID"` // 所属门店ID + Name string `json:"name" orm:"name" description:"门店角色名称"` // 门店角色名称 + CreatedAt *gtime.Time `json:"createdAt" orm:"created_at" description:"创建时间"` // 创建时间 + UpdatedAt *gtime.Time `json:"updatedAt" orm:"updated_at" description:"更新时间"` // 更新时间 + DeletedAt *gtime.Time `json:"deletedAt" orm:"deleted_at" description:"软删除时间戳"` // 软删除时间戳 +} diff --git a/internal/model/storeAdmin.go b/internal/model/storeAdmin.go index 73314df..23e55e4 100644 --- a/internal/model/storeAdmin.go +++ b/internal/model/storeAdmin.go @@ -16,3 +16,48 @@ type StoreAdminLoginIn struct { type StoreAdminLoginOut struct { 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 +} diff --git a/internal/model/storeDesktopSetting.go b/internal/model/storeDesktopSetting.go new file mode 100644 index 0000000..bf4b1fb --- /dev/null +++ b/internal/model/storeDesktopSetting.go @@ -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 +} diff --git a/internal/model/storeRole.go b/internal/model/storeRole.go new file mode 100644 index 0000000..e898e88 --- /dev/null +++ b/internal/model/storeRole.go @@ -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"` +} diff --git a/internal/packed/packed.go b/internal/packed/packed.go index 6663497..cb37c1d 100644 --- a/internal/packed/packed.go +++ b/internal/packed/packed.go @@ -3,6 +3,7 @@ package packed import ( _ "github.com/gogf/gf/contrib/drivers/mysql/v2" _ "github.com/gogf/gf/contrib/nosql/redis/v2" + _ "server/utility/gamelife" _ "server/utility/myCasbin" _ "server/utility/rsa" _ "server/utility/snowid" diff --git a/internal/service/store.go b/internal/service/store.go index 72f4f2d..c80a1da 100644 --- a/internal/service/store.go +++ b/internal/service/store.go @@ -17,6 +17,8 @@ type ( Update(ctx context.Context, in *model.StoreUpdateIn) (out *model.UpdateOut, 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) + GetDesktopSetting(ctx context.Context, in *model.StoreGetDesktopSettingIn) (*model.StoreGetDesktopSettingOut, error) + SaveDesktopSetting(ctx context.Context, in *model.SaveDesktopSettingIn) (*model.SaveDesktopSettingOut, error) } ) diff --git a/internal/service/store_admin.go b/internal/service/store_admin.go index 982cef5..5088e77 100644 --- a/internal/service/store_admin.go +++ b/internal/service/store_admin.go @@ -14,6 +14,11 @@ type ( IStoreAdmin interface { Login(ctx context.Context, in *model.StoreAdminLoginIn) (out *model.StoreAdminLoginOut, 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) } ) diff --git a/internal/service/store_role.go b/internal/service/store_role.go new file mode 100644 index 0000000..dbb7623 --- /dev/null +++ b/internal/service/store_role.go @@ -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 +} diff --git a/manifest/config/config.yaml b/manifest/config/config.yaml index bab9a75..e840458 100644 --- a/manifest/config/config.yaml +++ b/manifest/config/config.yaml @@ -36,4 +36,16 @@ wechat: rsa: publickey: "./manifest/config/public.pem" - privatekey: "./manifest/config/private.pem" \ No newline at end of file + 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" diff --git a/utility/gamelife/gamelife.go b/utility/gamelife/gamelife.go index c2674f8..269115e 100644 --- a/utility/gamelife/gamelife.go +++ b/utility/gamelife/gamelife.go @@ -128,6 +128,7 @@ func (s *gamelifeClient) GetUserKeyIV(ctx context.Context, popenId string) (cach err = ecode.Fail.Sub("解密用户信息失败") return } + gamelifeCache := model.UserGamelifeCache{Aes: aesResult.key, IV: aesResult.iv, Token: result.key} // 将用户的 aeskey 和 iv 存储到缓存当中,用于后续请求数据加密, 固定时间 2 小时同时不同用户加上一个随机时间 if err = g.Redis().SetEX(ctx, fmt.Sprintf(consts.GameLifeUserKey, popenId), gamelifeCache, int64(consts.GameLifeUserExpire+grand.Intn(1000))); err != nil { diff --git a/utility/myCasbin/casbin.go b/utility/myCasbin/casbin.go index 75d8ef4..8b969cd 100644 --- a/utility/myCasbin/casbin.go +++ b/utility/myCasbin/casbin.go @@ -58,6 +58,9 @@ func init() { enforcer.AddPolicy("user", "/x/user/getPhoneCode", "POST", "获取验证码") enforcer.AddPolicy("user", "/x/user/bindPhone", "POST", "绑定手机号") 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", "获取反馈信息列表") @@ -80,6 +83,21 @@ func init() { // 任务 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", "修改门店管理员密码") + } // 商户 {