From ea574905f9af6742420206770905c786a0f04bb9 Mon Sep 17 00:00:00 2001 From: chy <2463300564@qq.com> Date: Tue, 24 Jun 2025 10:36:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=97=A8=E5=BA=97=20ip?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/store/store.go | 4 + api/store/v1/store.go | 44 +++++++++ internal/controller/store/store_v1_add_ip.go | 23 +++++ .../controller/store/store_v1_delete_ip.go | 20 ++++ .../controller/store/store_v1_get_ip_list.go | 25 +++++ .../controller/store/store_v1_update_ip.go | 22 +++++ internal/dao/internal/store_ips.go | 91 +++++++++++++++++++ internal/dao/store_ips.go | 22 +++++ internal/logic/store/store.go | 90 ++++++++++++++++++ internal/model/do/store_ips.go | 22 +++++ internal/model/entity/store_ips.go | 20 ++++ internal/model/store.go | 51 +++++++++++ internal/service/store.go | 4 + utility/myCasbin/casbin.go | 10 +- 14 files changed, 446 insertions(+), 2 deletions(-) create mode 100644 internal/controller/store/store_v1_add_ip.go create mode 100644 internal/controller/store/store_v1_delete_ip.go create mode 100644 internal/controller/store/store_v1_get_ip_list.go create mode 100644 internal/controller/store/store_v1_update_ip.go create mode 100644 internal/dao/internal/store_ips.go create mode 100644 internal/dao/store_ips.go create mode 100644 internal/model/do/store_ips.go create mode 100644 internal/model/entity/store_ips.go diff --git a/api/store/store.go b/api/store/store.go index 4286374..1e57984 100644 --- a/api/store/store.go +++ b/api/store/store.go @@ -15,4 +15,8 @@ type IStoreV1 interface { 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) + AddIp(ctx context.Context, req *v1.AddIpReq) (res *v1.AddIpRes, err error) + DeleteIp(ctx context.Context, req *v1.DeleteIpReq) (res *v1.DeleteIpRes, err error) + UpdateIp(ctx context.Context, req *v1.UpdateIpReq) (res *v1.UpdateIpRes, err error) + GetIpList(ctx context.Context, req *v1.GetIpListReq) (res *v1.GetIpListRes, err error) } diff --git a/api/store/v1/store.go b/api/store/v1/store.go index cc822ec..0757355 100644 --- a/api/store/v1/store.go +++ b/api/store/v1/store.go @@ -42,3 +42,47 @@ type DeleteReq struct { type DeleteRes struct { Success bool `json:"success" dc:"是否成功"` } + +type AddIpReq struct { + g.Meta `path:"/store/addIp" method:"post" tags:"Store" summary:"(系统、商户门店后台)添加门店IP"` + StoreId int64 `json:"storeId" v:"required" dc:"门店ID"` + Ip string `json:"ip" v:"required" dc:"IP"` + Remark string `json:"remark" dc:"备注"` +} + +type AddIpRes struct { + Success bool `json:"success" dc:"是否成功"` +} + +type DeleteIpReq struct { + g.Meta `path:"/store/del/{id}" method:"delete" tags:"Store" summary:"(系统、商户门店后台)删除门店IP"` + Id int64 `json:"id" v:"required" dc:"id"` +} + +type DeleteIpRes struct { + Success bool `json:"success" dc:"是否成功"` +} + +type UpdateIpReq struct { + g.Meta `path:"/store/updateIp" method:"put" tags:"Store" summary:"(系统、商户门店后台)更新门店IP"` + Id int64 `json:"id" v:"required" dc:"id"` + //StoreId int64 `json:"storeId" v:"required" dc:"storeId"` + Ip string `json:"ip" v:"required" dc:"IP"` + Remark string `json:"remark" dc:"备注"` +} + +type UpdateIpRes struct { + Success bool `json:"success" dc:"是否成功"` +} + +type GetIpListReq struct { + g.Meta `path:"/store/getIpList" method:"get" tags:"Store" summary:"(系统、商户门店后台)获取门店IP列表"` + StoreId int64 `json:"storeId" dc:"门店ID"` + Page int `json:"page" v:"required" dc:"页数"` + Size int `json:"size" v:"required" dc:"每页数量"` +} + +type GetIpListRes struct { + List interface{} `json:"list" dc:"IP列表"` + Total int64 `json:"total" dc:"总数"` +} diff --git a/internal/controller/store/store_v1_add_ip.go b/internal/controller/store/store_v1_add_ip.go new file mode 100644 index 0000000..2b90dc0 --- /dev/null +++ b/internal/controller/store/store_v1_add_ip.go @@ -0,0 +1,23 @@ +package store + +import ( + "context" + "server/internal/model" + "server/internal/service" + + "server/api/store/v1" +) + +func (c *ControllerV1) AddIp(ctx context.Context, req *v1.AddIpReq) (res *v1.AddIpRes, err error) { + + out, err := service.Store().CreateIP(ctx, &model.IPCreateIn{ + Ip: req.Ip, + Remark: req.Remark, + StoreId: int(req.StoreId), + }) + + if err != nil { + return nil, err + } + return &v1.AddIpRes{Success: out.Success}, nil +} diff --git a/internal/controller/store/store_v1_delete_ip.go b/internal/controller/store/store_v1_delete_ip.go new file mode 100644 index 0000000..714889e --- /dev/null +++ b/internal/controller/store/store_v1_delete_ip.go @@ -0,0 +1,20 @@ +package store + +import ( + "context" + "server/internal/model" + "server/internal/service" + + "server/api/store/v1" +) + +func (c *ControllerV1) DeleteIp(ctx context.Context, req *v1.DeleteIpReq) (res *v1.DeleteIpRes, err error) { + + out, err := service.Store().DeleteIP(ctx, &model.IPDeleteIn{ + Id: req.Id, + }) + if err != nil { + return nil, err + } + return &v1.DeleteIpRes{Success: out.Success}, nil +} diff --git a/internal/controller/store/store_v1_get_ip_list.go b/internal/controller/store/store_v1_get_ip_list.go new file mode 100644 index 0000000..cec85a7 --- /dev/null +++ b/internal/controller/store/store_v1_get_ip_list.go @@ -0,0 +1,25 @@ +package store + +import ( + "context" + "server/internal/model" + "server/internal/service" + + "server/api/store/v1" +) + +func (c *ControllerV1) GetIpList(ctx context.Context, req *v1.GetIpListReq) (res *v1.GetIpListRes, err error) { + + list, err := service.Store().GetIPList(ctx, &model.IPListIn{ + Page: req.Page, + Size: req.Size, + StoreId: req.StoreId, + }) + if err != nil { + return nil, err + } + return &v1.GetIpListRes{ + List: list.List, + Total: list.Total, + }, nil +} diff --git a/internal/controller/store/store_v1_update_ip.go b/internal/controller/store/store_v1_update_ip.go new file mode 100644 index 0000000..fb11a89 --- /dev/null +++ b/internal/controller/store/store_v1_update_ip.go @@ -0,0 +1,22 @@ +package store + +import ( + "context" + "server/internal/model" + "server/internal/service" + + "server/api/store/v1" +) + +func (c *ControllerV1) UpdateIp(ctx context.Context, req *v1.UpdateIpReq) (res *v1.UpdateIpRes, err error) { + out, err := service.Store().UpdateIP(ctx, &model.IPUpdateIn{ + Id: req.Id, + Ip: req.Ip, + Remark: req.Remark, + //StoreId: int(req.StoreId), + }) + if err != nil { + return nil, err + } + return &v1.UpdateIpRes{Success: out.Success}, nil +} diff --git a/internal/dao/internal/store_ips.go b/internal/dao/internal/store_ips.go new file mode 100644 index 0000000..dfdfd58 --- /dev/null +++ b/internal/dao/internal/store_ips.go @@ -0,0 +1,91 @@ +// ========================================================================== +// 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" +) + +// StoreIpsDao is the data access object for the table store_ips. +type StoreIpsDao 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 StoreIpsColumns // columns contains all the column names of Table for convenient usage. + handlers []gdb.ModelHandler // handlers for customized model modification. +} + +// StoreIpsColumns defines and stores column names for the table store_ips. +type StoreIpsColumns struct { + Id string // 主键ID + StoreId string // 关联门店ID + IpAddress string // IP地址(支持IPv4或IPv6) + Remark string // 备注 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 软删除时间戳 +} + +// storeIpsColumns holds the columns for the table store_ips. +var storeIpsColumns = StoreIpsColumns{ + Id: "id", + StoreId: "store_id", + IpAddress: "ip_address", + Remark: "remark", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewStoreIpsDao creates and returns a new DAO object for table data access. +func NewStoreIpsDao(handlers ...gdb.ModelHandler) *StoreIpsDao { + return &StoreIpsDao{ + group: "default", + table: "store_ips", + columns: storeIpsColumns, + handlers: handlers, + } +} + +// DB retrieves and returns the underlying raw database management object of the current DAO. +func (dao *StoreIpsDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of the current DAO. +func (dao *StoreIpsDao) Table() string { + return dao.table +} + +// Columns returns all column names of the current DAO. +func (dao *StoreIpsDao) Columns() StoreIpsColumns { + return dao.columns +} + +// Group returns the database configuration group name of the current DAO. +func (dao *StoreIpsDao) 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 *StoreIpsDao) Ctx(ctx context.Context) *gdb.Model { + model := dao.DB().Model(dao.table) + for _, handler := range dao.handlers { + model = handler(model) + } + return model.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 *StoreIpsDao) 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_ips.go b/internal/dao/store_ips.go new file mode 100644 index 0000000..e13e343 --- /dev/null +++ b/internal/dao/store_ips.go @@ -0,0 +1,22 @@ +// ================================================================================= +// This file is auto-generated by the GoFrame CLI tool. You may modify it as needed. +// ================================================================================= + +package dao + +import ( + "server/internal/dao/internal" +) + +// storeIpsDao is the data access object for the table store_ips. +// You can define custom methods on it to extend its functionality as needed. +type storeIpsDao struct { + *internal.StoreIpsDao +} + +var ( + // StoreIps is a globally accessible object for table store_ips operations. + StoreIps = storeIpsDao{internal.NewStoreIpsDao()} +) + +// Add your custom methods and functionality below. diff --git a/internal/logic/store/store.go b/internal/logic/store/store.go index c730dd3..4c8a9ad 100644 --- a/internal/logic/store/store.go +++ b/internal/logic/store/store.go @@ -173,3 +173,93 @@ func (s *sStore) GetDesktopSetting(ctx context.Context, in *model.StoreGetDeskto return out, nil } + +func (s *sStore) GetIPList(ctx context.Context, in *model.IPListIn) (*model.IPListout, error) { + + m := dao.StoreIps.Ctx(ctx) + if in.StoreId > 0 { + m = m.Where(do.StoreIps{ + StoreId: in.StoreId, + }) + } + + var list []model.StoreIps + var total int + + err := m.Page(in.Page, in.Size).ScanAndCount(&list, &total, false) + if err != nil { + return nil, ecode.Fail.Sub("IP列表获取失败") + } + + return &model.IPListout{ + List: list, + Total: int64(total), + }, nil +} + +func (s *sStore) CreateIP(ctx context.Context, in *model.IPCreateIn) (*model.IPCreateOut, error) { + + exist, err := dao.StoreIps.Ctx(ctx).Where(do.StoreIps{StoreId: in.StoreId, IpAddress: in.Ip}).Exist() + + if err != nil { + return nil, ecode.Fail.Sub("门店IP创建失败") + } + + if exist { + return nil, ecode.Params.Sub("门店IP已存在") + } + + _, err = dao.StoreIps.Ctx(ctx).Insert(do.StoreIps{ + IpAddress: in.Ip, + Remark: in.Remark, + StoreId: in.StoreId, + }) + if err != nil { + return nil, ecode.Fail.Sub("门店IP创建失败") + } + return &model.IPCreateOut{ + Success: true, + }, nil +} + +func (s *sStore) UpdateIP(ctx context.Context, in *model.IPUpdateIn) (*model.IPUpdateOut, error) { + + //exist, err := dao.StoreIps.Ctx(ctx).Where(do.StoreIps{StoreId: in.StoreId, IpAddress: in.Ip}).Exist() + // + //if err != nil { + // return nil, ecode.Fail.Sub("门店IP更新失败") + //} + // + //if exist { + // return nil, ecode.Params.Sub("门店IP已存在") + //} + + _, err := dao.StoreIps.Ctx(ctx).Where(do.StoreIps{Id: in.Id}).Data(do.StoreIps{IpAddress: in.Ip, Remark: in.Remark}).Update() + if err != nil { + return nil, ecode.Fail.Sub("门店IP更新失败") + } + return &model.IPUpdateOut{ + Success: true, + }, nil +} + +func (s *sStore) DeleteIP(ctx context.Context, in *model.IPDeleteIn) (*model.IPDeleteOut, error) { + + exist, err := dao.StoreIps.Ctx(ctx).Where(do.StoreIps{Id: in.Id}).Exist() + + if err != nil { + return nil, ecode.Fail.Sub("门店IP查询失败") + } + + if !exist { + return nil, ecode.Params.Sub("门店不已存在") + } + + _, err = dao.StoreIps.Ctx(ctx).Where(do.StoreIps{Id: in.Id}).Delete() + if err != nil { + return nil, ecode.Fail.Sub("删除门店IP失败") + } + return &model.IPDeleteOut{ + Success: true, + }, nil +} diff --git a/internal/model/do/store_ips.go b/internal/model/do/store_ips.go new file mode 100644 index 0000000..21d8e70 --- /dev/null +++ b/internal/model/do/store_ips.go @@ -0,0 +1,22 @@ +// ================================================================================= +// 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" +) + +// StoreIps is the golang structure of table store_ips for DAO operations like Where/Data. +type StoreIps struct { + g.Meta `orm:"table:store_ips, do:true"` + Id interface{} // 主键ID + StoreId interface{} // 关联门店ID + IpAddress interface{} // IP地址(支持IPv4或IPv6) + Remark interface{} // 备注 + CreatedAt *gtime.Time // 创建时间 + UpdatedAt *gtime.Time // 更新时间 + DeletedAt *gtime.Time // 软删除时间戳 +} diff --git a/internal/model/entity/store_ips.go b/internal/model/entity/store_ips.go new file mode 100644 index 0000000..039606e --- /dev/null +++ b/internal/model/entity/store_ips.go @@ -0,0 +1,20 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// StoreIps is the golang structure for table store_ips. +type StoreIps struct { + Id int64 `json:"id" orm:"id" description:"主键ID"` // 主键ID + StoreId int64 `json:"storeId" orm:"store_id" description:"关联门店ID"` // 关联门店ID + IpAddress string `json:"ipAddress" orm:"ip_address" description:"IP地址(支持IPv4或IPv6)"` // IP地址(支持IPv4或IPv6) + Remark string `json:"remark" orm:"remark" 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/store.go b/internal/model/store.go index 2cb973c..d03c9d7 100644 --- a/internal/model/store.go +++ b/internal/model/store.go @@ -2,6 +2,7 @@ package model import ( "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" ) type Store struct { @@ -17,6 +18,16 @@ type Store struct { NetbarAccount string `json:"netbarAccount" orm:"netbar_account" dc:"网吧网关账号"` } +type StoreIps struct { + Id int64 `json:"id" orm:"id" description:"主键ID"` // 主键ID + StoreId int64 `json:"storeId" orm:"store_id" description:"关联门店ID"` // 关联门店ID + IpAddress string `json:"ipAddress" orm:"ip_address" description:"IP地址(支持IPv4或IPv6)"` // IP地址(支持IPv4或IPv6) + Remark string `json:"remark" orm:"remark" 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:"软删除时间戳"` // 软删除时间戳 +} + type StoreCreateIn struct { OperatorId int64 OperatorRole string @@ -59,3 +70,43 @@ type StoreDeleteIn struct { OperatorId int OperatorRole string } + +type IPListIn struct { + StoreId int64 `json:"storeId" dc:"IP列表ID"` + Page int `json:"page"` + Size int `json:"size"` +} + +type IPListout struct { + List interface{} `json:"list"` + Total int64 `json:"total"` +} + +type IPUpdateIn struct { + Id int64 `json:"id" dc:"IP列表ID"` + Ip string `json:"ip" dc:"IP地址"` + StoreId int `json:"storeId" dc:"门店ID"` + Remark string `json:"remark" dc:"备注"` +} + +type IPUpdateOut struct { + Success bool `json:"success"` +} + +type IPDeleteIn struct { + Id int64 +} + +type IPDeleteOut struct { + Success bool `json:"success"` +} + +type IPCreateIn struct { + Ip string `json:"ip" dc:"IP地址"` + StoreId int `json:"storeId" dc:"门店ID"` + Remark string `json:"remark" dc:"备注"` +} + +type IPCreateOut struct { + Success bool `json:"success"` +} diff --git a/internal/service/store.go b/internal/service/store.go index cf7f093..76b2aab 100644 --- a/internal/service/store.go +++ b/internal/service/store.go @@ -18,6 +18,10 @@ type ( 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) + GetIPList(ctx context.Context, in *model.IPListIn) (*model.IPListout, error) + CreateIP(ctx context.Context, in *model.IPCreateIn) (*model.IPCreateOut, error) + UpdateIP(ctx context.Context, in *model.IPUpdateIn) (*model.IPUpdateOut, error) + DeleteIP(ctx context.Context, in *model.IPDeleteIn) (*model.IPDeleteOut, error) } ) diff --git a/utility/myCasbin/casbin.go b/utility/myCasbin/casbin.go index 200295e..5e791b3 100644 --- a/utility/myCasbin/casbin.go +++ b/utility/myCasbin/casbin.go @@ -43,7 +43,7 @@ func init() { // 任务 enforcer.AddPolicy("guest", "/x/task/ranking", "GET", "获取排行榜") enforcer.AddPolicy("guest", "/x/task/getNonLoginTaskList", "GET", "未登录获取任务列表") - enforcer.AddPolicy("guest", "/x/reward/callback", "POST", "") + enforcer.AddPolicy("guest", "/x/reward/callback", "POST", "tencent回调") // 游戏列表 enforcer.AddPolicy("guest", "/x/game", "GET", "获取游戏列表") @@ -127,6 +127,12 @@ func init() { enforcer.AddPolicy("guest", "/x/task/completed/list", "GET", "获取游戏列表") + // 获取门店 ip信息 + enforcer.AddPolicy("store", "/x/store/getIpList", "GET", "获取门店 ip信息列表") + enforcer.AddPolicy("store", "/x/store/addIp", "POST", "添加ip信息") + enforcer.AddPolicy("store", "/x/store/del/*", "DELETE", "删除门店 ip信息") + enforcer.AddPolicy("store", "/x/store/updateIp", "PUT", "修改门店 ip信息") + } // 商户 { @@ -159,7 +165,7 @@ func init() { enforcer.AddPolicy("admin", "/x/task/selector", "GET", "管理员获取任务列表二级选择器") // 用户:删除 - enforcer.AddPolicy("admin", "/x/user/del/{id}", "DELETE", "删除用户") + enforcer.AddPolicy("admin", "/x/user/del/*", "DELETE", "删除用户") } instance = &myCasbin{Enforcer: enforcer}