fix:
This commit is contained in:
parent
ff5bcb1c8c
commit
688a2173dc
|
@ -4151,6 +4151,12 @@ func (qs GameCardQuerySet) OrderAscByStockCount() GameCardQuerySet {
|
||||||
return qs.w(qs.db.Order("stock_count ASC"))
|
return qs.w(qs.db.Order("stock_count ASC"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// OrderAscByStockState is an autogenerated method
|
||||||
|
// nolint: dupl
|
||||||
|
func (qs GameCardQuerySet) OrderAscByStockState() GameCardQuerySet {
|
||||||
|
return qs.w(qs.db.Order("stock_state ASC"))
|
||||||
|
}
|
||||||
|
|
||||||
// OrderAscByTotalCount is an autogenerated method
|
// OrderAscByTotalCount is an autogenerated method
|
||||||
// nolint: dupl
|
// nolint: dupl
|
||||||
func (qs GameCardQuerySet) OrderAscByTotalCount() GameCardQuerySet {
|
func (qs GameCardQuerySet) OrderAscByTotalCount() GameCardQuerySet {
|
||||||
|
@ -4351,6 +4357,12 @@ func (qs GameCardQuerySet) OrderDescByStockCount() GameCardQuerySet {
|
||||||
return qs.w(qs.db.Order("stock_count DESC"))
|
return qs.w(qs.db.Order("stock_count DESC"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// OrderDescByStockState is an autogenerated method
|
||||||
|
// nolint: dupl
|
||||||
|
func (qs GameCardQuerySet) OrderDescByStockState() GameCardQuerySet {
|
||||||
|
return qs.w(qs.db.Order("stock_state DESC"))
|
||||||
|
}
|
||||||
|
|
||||||
// OrderDescByTotalCount is an autogenerated method
|
// OrderDescByTotalCount is an autogenerated method
|
||||||
// nolint: dupl
|
// nolint: dupl
|
||||||
func (qs GameCardQuerySet) OrderDescByTotalCount() GameCardQuerySet {
|
func (qs GameCardQuerySet) OrderDescByTotalCount() GameCardQuerySet {
|
||||||
|
@ -4705,6 +4717,62 @@ func (qs GameCardQuerySet) StockCountNotIn(stockCount ...uint32) GameCardQuerySe
|
||||||
return qs.w(qs.db.Where("stock_count NOT IN (?)", stockCount))
|
return qs.w(qs.db.Where("stock_count NOT IN (?)", stockCount))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// StockStateEq is an autogenerated method
|
||||||
|
// nolint: dupl
|
||||||
|
func (qs GameCardQuerySet) StockStateEq(stockState uint32) GameCardQuerySet {
|
||||||
|
return qs.w(qs.db.Where("stock_state = ?", stockState))
|
||||||
|
}
|
||||||
|
|
||||||
|
// StockStateGt is an autogenerated method
|
||||||
|
// nolint: dupl
|
||||||
|
func (qs GameCardQuerySet) StockStateGt(stockState uint32) GameCardQuerySet {
|
||||||
|
return qs.w(qs.db.Where("stock_state > ?", stockState))
|
||||||
|
}
|
||||||
|
|
||||||
|
// StockStateGte is an autogenerated method
|
||||||
|
// nolint: dupl
|
||||||
|
func (qs GameCardQuerySet) StockStateGte(stockState uint32) GameCardQuerySet {
|
||||||
|
return qs.w(qs.db.Where("stock_state >= ?", stockState))
|
||||||
|
}
|
||||||
|
|
||||||
|
// StockStateIn is an autogenerated method
|
||||||
|
// nolint: dupl
|
||||||
|
func (qs GameCardQuerySet) StockStateIn(stockState ...uint32) GameCardQuerySet {
|
||||||
|
if len(stockState) == 0 {
|
||||||
|
qs.db.AddError(errors.New("must at least pass one stockState in StockStateIn"))
|
||||||
|
return qs.w(qs.db)
|
||||||
|
}
|
||||||
|
return qs.w(qs.db.Where("stock_state IN (?)", stockState))
|
||||||
|
}
|
||||||
|
|
||||||
|
// StockStateLt is an autogenerated method
|
||||||
|
// nolint: dupl
|
||||||
|
func (qs GameCardQuerySet) StockStateLt(stockState uint32) GameCardQuerySet {
|
||||||
|
return qs.w(qs.db.Where("stock_state < ?", stockState))
|
||||||
|
}
|
||||||
|
|
||||||
|
// StockStateLte is an autogenerated method
|
||||||
|
// nolint: dupl
|
||||||
|
func (qs GameCardQuerySet) StockStateLte(stockState uint32) GameCardQuerySet {
|
||||||
|
return qs.w(qs.db.Where("stock_state <= ?", stockState))
|
||||||
|
}
|
||||||
|
|
||||||
|
// StockStateNe is an autogenerated method
|
||||||
|
// nolint: dupl
|
||||||
|
func (qs GameCardQuerySet) StockStateNe(stockState uint32) GameCardQuerySet {
|
||||||
|
return qs.w(qs.db.Where("stock_state != ?", stockState))
|
||||||
|
}
|
||||||
|
|
||||||
|
// StockStateNotIn is an autogenerated method
|
||||||
|
// nolint: dupl
|
||||||
|
func (qs GameCardQuerySet) StockStateNotIn(stockState ...uint32) GameCardQuerySet {
|
||||||
|
if len(stockState) == 0 {
|
||||||
|
qs.db.AddError(errors.New("must at least pass one stockState in StockStateNotIn"))
|
||||||
|
return qs.w(qs.db)
|
||||||
|
}
|
||||||
|
return qs.w(qs.db.Where("stock_state NOT IN (?)", stockState))
|
||||||
|
}
|
||||||
|
|
||||||
// TotalCountEq is an autogenerated method
|
// TotalCountEq is an autogenerated method
|
||||||
// nolint: dupl
|
// nolint: dupl
|
||||||
func (qs GameCardQuerySet) TotalCountEq(totalCount uint32) GameCardQuerySet {
|
func (qs GameCardQuerySet) TotalCountEq(totalCount uint32) GameCardQuerySet {
|
||||||
|
@ -5000,6 +5068,13 @@ func (u GameCardUpdater) SetStockCount(stockCount uint32) GameCardUpdater {
|
||||||
return u
|
return u
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetStockState is an autogenerated method
|
||||||
|
// nolint: dupl
|
||||||
|
func (u GameCardUpdater) SetStockState(stockState uint32) GameCardUpdater {
|
||||||
|
u.fields[string(GameCardDBSchema.StockState)] = stockState
|
||||||
|
return u
|
||||||
|
}
|
||||||
|
|
||||||
// SetTotalCount is an autogenerated method
|
// SetTotalCount is an autogenerated method
|
||||||
// nolint: dupl
|
// nolint: dupl
|
||||||
func (u GameCardUpdater) SetTotalCount(totalCount uint32) GameCardUpdater {
|
func (u GameCardUpdater) SetTotalCount(totalCount uint32) GameCardUpdater {
|
||||||
|
@ -5060,6 +5135,7 @@ var GameCardDBSchema = struct {
|
||||||
NewProducts GameCardDBSchemaField
|
NewProducts GameCardDBSchemaField
|
||||||
Status GameCardDBSchemaField
|
Status GameCardDBSchemaField
|
||||||
StockCount GameCardDBSchemaField
|
StockCount GameCardDBSchemaField
|
||||||
|
StockState GameCardDBSchemaField
|
||||||
TotalCount GameCardDBSchemaField
|
TotalCount GameCardDBSchemaField
|
||||||
GameTypeId GameCardDBSchemaField
|
GameTypeId GameCardDBSchemaField
|
||||||
GoodsGalleryUrl GameCardDBSchemaField
|
GoodsGalleryUrl GameCardDBSchemaField
|
||||||
|
@ -5086,6 +5162,7 @@ var GameCardDBSchema = struct {
|
||||||
NewProducts: GameCardDBSchemaField("new_products"),
|
NewProducts: GameCardDBSchemaField("new_products"),
|
||||||
Status: GameCardDBSchemaField("status"),
|
Status: GameCardDBSchemaField("status"),
|
||||||
StockCount: GameCardDBSchemaField("stock_count"),
|
StockCount: GameCardDBSchemaField("stock_count"),
|
||||||
|
StockState: GameCardDBSchemaField("stock_state"),
|
||||||
TotalCount: GameCardDBSchemaField("total_count"),
|
TotalCount: GameCardDBSchemaField("total_count"),
|
||||||
GameTypeId: GameCardDBSchemaField("game_type_id"),
|
GameTypeId: GameCardDBSchemaField("game_type_id"),
|
||||||
GoodsGalleryUrl: GameCardDBSchemaField("goods_gallery_url"),
|
GoodsGalleryUrl: GameCardDBSchemaField("goods_gallery_url"),
|
||||||
|
@ -5116,6 +5193,7 @@ func (o *GameCard) Update(db *gorm.DB, fields ...GameCardDBSchemaField) error {
|
||||||
"new_products": o.NewProducts,
|
"new_products": o.NewProducts,
|
||||||
"status": o.Status,
|
"status": o.Status,
|
||||||
"stock_count": o.StockCount,
|
"stock_count": o.StockCount,
|
||||||
|
"stock_state": o.StockState,
|
||||||
"total_count": o.TotalCount,
|
"total_count": o.TotalCount,
|
||||||
"game_type_id": o.GameTypeId,
|
"game_type_id": o.GameTypeId,
|
||||||
"goods_gallery_url": o.GoodsGalleryUrl,
|
"goods_gallery_url": o.GoodsGalleryUrl,
|
||||||
|
|
|
@ -21,6 +21,7 @@ type GameCard struct {
|
||||||
NewProducts uint8 `json:"new_products"` // 新品: 1-新品 2-非新品
|
NewProducts uint8 `json:"new_products"` // 新品: 1-新品 2-非新品
|
||||||
Status uint8 `json:"status"` // 状态: 1-上架 2-下架
|
Status uint8 `json:"status"` // 状态: 1-上架 2-下架
|
||||||
StockCount uint32 `json:"stock_count"` // 库存
|
StockCount uint32 `json:"stock_count"` // 库存
|
||||||
|
StockState uint32 `json:"stock_state"` // 1-库存 2-门店库存 3-无库存
|
||||||
TotalCount uint32 `json:"total_count"` // 总量
|
TotalCount uint32 `json:"total_count"` // 总量
|
||||||
GameTypeId uint32 `json:"game_type_id"` // 游戏类型
|
GameTypeId uint32 `json:"game_type_id"` // 游戏类型
|
||||||
GoodsGalleryUrl string `json:"goods_gallery_url" gorm:"type:text;comment:'轮播图'"` // 轮播图
|
GoodsGalleryUrl string `json:"goods_gallery_url" gorm:"type:text;comment:'轮播图'"` // 轮播图
|
||||||
|
@ -81,6 +82,8 @@ func (m *User) IsMember() bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//var GameCardListUpdateTime = time.Time{}
|
||||||
|
|
||||||
func GetGameCardList(sortType, page, pageSize int, gameTypeIds []uint64, storeId, uid uint32) ([]GameCard, uint32, error) {
|
func GetGameCardList(sortType, page, pageSize int, gameTypeIds []uint64, storeId, uid uint32) ([]GameCard, uint32, error) {
|
||||||
var (
|
var (
|
||||||
cards []GameCard = make([]GameCard, 0)
|
cards []GameCard = make([]GameCard, 0)
|
||||||
|
@ -103,7 +106,8 @@ func GetGameCardList(sortType, page, pageSize int, gameTypeIds []uint64, storeId
|
||||||
switch sortType {
|
switch sortType {
|
||||||
case 1:
|
case 1:
|
||||||
// 排序类型 1-默认
|
// 排序类型 1-默认
|
||||||
//qs = qs.OrderDescByCreatedAt()
|
qs = qs.OrderDescByCreatedAt()
|
||||||
|
//qs = qs.OrderAscByStockState()
|
||||||
case 2:
|
case 2:
|
||||||
// 排序类型 2-新品
|
// 排序类型 2-新品
|
||||||
qs = qs.NewProductsEq(1)
|
qs = qs.NewProductsEq(1)
|
||||||
|
@ -132,65 +136,141 @@ func GetGameCardList(sortType, page, pageSize int, gameTypeIds []uint64, storeId
|
||||||
return cards, 0, err
|
return cards, 0, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if storeId != 0 {
|
|
||||||
var cardStocks []GameCardGoodsStock
|
|
||||||
err := NewGameCardGoodsStockQuerySet(DB).StoreIdEq(uint64(storeId)).RentStockGt(0).All(&cardStocks)
|
|
||||||
if err != nil {
|
|
||||||
logger.Error("GetGameIdByType err:", err)
|
|
||||||
return cards, 0, err
|
|
||||||
}
|
|
||||||
if len(cardStocks) <= 0 {
|
|
||||||
return cards, 0, nil
|
|
||||||
}
|
|
||||||
gameIds := make([]uint32, 0)
|
|
||||||
for i, _ := range cardStocks {
|
|
||||||
gameIds = append(gameIds, uint32(cardStocks[i].GameCardId))
|
|
||||||
}
|
|
||||||
if len(gameIds) <= 0 {
|
|
||||||
return cards, 0, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
qs = qs.IDIn(gameIds...)
|
if sortType == 1 {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
hideGamePrice := uint32(30000)
|
||||||
var user *User
|
var user *User
|
||||||
if uid != 0 {
|
if uid != 0 {
|
||||||
user = GetUserByUid(uid)
|
user = GetUserByUid(uid)
|
||||||
if user.MemberExpire.After(time.Now()) &&
|
if user.MemberExpire.After(time.Now()) &&
|
||||||
user.MemberExpire.AddDate(0, 0, -14).Before(time.Now()) {
|
user.MemberExpire.AddDate(0, 0, -14).Before(time.Now()) {
|
||||||
qs = qs.RealPriceLte(30000)
|
qs = qs.RealPriceLte(hideGamePrice)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
gameIds := make([]uint32, 0)
|
||||||
|
gameIdMap := make(map[uint32]uint32)
|
||||||
|
if storeId != 0 {
|
||||||
|
//gameIds := make([]uint32, 0)
|
||||||
|
////gameIdMap := make(map[uint32]int)
|
||||||
|
//var cardStocks []GameCardGoodsStock
|
||||||
|
//err := NewGameCardGoodsStockQuerySet(DB).StoreIdEq(uint64(storeId)).RentStockGt(0).OrderDescByRentStock().All(&cardStocks)
|
||||||
|
//if err != nil {
|
||||||
|
// logger.Error("GetGameIdByType err:", err)
|
||||||
|
// return cards, 0, err
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//for i, _ := range cardStocks {
|
||||||
|
// gameIds = append(gameIds, uint32(cardStocks[i].GameCardId))
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//if len(gameIds) <= 0 {
|
||||||
|
// return cards, 0, nil
|
||||||
|
//}
|
||||||
|
//qs = qs.IDIn(gameIds...)
|
||||||
|
|
||||||
|
var cardStocks []GameCardGoodsStock
|
||||||
|
err := NewGameCardGoodsStockQuerySet(DB).StoreIdEq(uint64(storeId)).RentStockGt(0).OrderDescByRentStock().All(&cardStocks)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error("GetGameIdByType err:", err)
|
||||||
|
return cards, 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, _ := range cardStocks {
|
||||||
|
_, ok := gameIdMap[uint32(cardStocks[i].GameCardId)]
|
||||||
|
if !ok {
|
||||||
|
gameIds = append(gameIds, uint32(cardStocks[i].GameCardId))
|
||||||
|
gameIdMap[uint32(cardStocks[i].GameCardId)] = 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err = NewGameCardGoodsStockQuerySet(DB).StoreIdNe(uint64(storeId)).RentStockGt(0).OrderDescByRentStock().All(&cardStocks)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error("GetGameIdByType err:", err)
|
||||||
|
return cards, 0, err
|
||||||
|
}
|
||||||
|
for i, _ := range cardStocks {
|
||||||
|
_, ok := gameIdMap[uint32(cardStocks[i].GameCardId)]
|
||||||
|
if !ok {
|
||||||
|
gameIds = append(gameIds, uint32(cardStocks[i].GameCardId))
|
||||||
|
gameIdMap[uint32(cardStocks[i].GameCardId)] = 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err = NewGameCardGoodsStockQuerySet(DB).StoreIdNe(uint64(storeId)).RentStockEq(0).All(&cardStocks)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error("GetGameIdByType err:", err)
|
||||||
|
return cards, 0, err
|
||||||
|
}
|
||||||
|
for i, _ := range cardStocks {
|
||||||
|
_, ok := gameIdMap[uint32(cardStocks[i].GameCardId)]
|
||||||
|
if !ok {
|
||||||
|
gameIds = append(gameIds, uint32(cardStocks[i].GameCardId))
|
||||||
|
gameIdMap[uint32(cardStocks[i].GameCardId)] = 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
qs = qs.IDIn(gameIds...)
|
||||||
|
}
|
||||||
|
|
||||||
if count == 0 {
|
if count == 0 {
|
||||||
count, err = qs.Count()
|
count, err = qs.Count()
|
||||||
}
|
}
|
||||||
|
totalPage = uint32(count/pageSize + 1)
|
||||||
err = qs.OrderDescByCreatedAt().Offset(page * pageSize).Limit(pageSize).All(&cards)
|
//err = qs.OrderDescByCreatedAt().Offset(page * pageSize).Limit(pageSize).All(&cards)
|
||||||
|
if storeId == 0 {
|
||||||
|
err = qs.Offset(page * pageSize).Limit(pageSize).All(&cards)
|
||||||
if err != nil && err != RecordNotFound {
|
if err != nil && err != RecordNotFound {
|
||||||
logger.Error("err:", err)
|
logger.Error("err:", err)
|
||||||
return cards, 0, err
|
return cards, 0, err
|
||||||
}
|
}
|
||||||
totalPage = uint32(count/pageSize + 1)
|
} else {
|
||||||
|
err = qs.All(&cards)
|
||||||
cardIds := make([]uint64, 0)
|
if err != nil && err != RecordNotFound {
|
||||||
|
logger.Error("list err:", err)
|
||||||
|
return cards, 0, err
|
||||||
|
}
|
||||||
|
//fmt.Println("page:", page, totalPage)
|
||||||
|
list := make([]GameCard, 0, len(cards))
|
||||||
|
cardMap := make(map[uint32]GameCard, 0)
|
||||||
for i, _ := range cards {
|
for i, _ := range cards {
|
||||||
cardIds = append(cardIds, uint64(cards[i].ID))
|
cardMap[cards[i].ID] = cards[i]
|
||||||
|
}
|
||||||
|
for i, _ := range gameIds {
|
||||||
|
v, ok1 := cardMap[gameIds[i]]
|
||||||
|
v2, _ := gameIdMap[gameIds[i]]
|
||||||
|
v.StockState = v2
|
||||||
|
if ok1 {
|
||||||
|
list = append(list, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if uint32(page) < totalPage && totalPage != 1 {
|
||||||
|
cards = list[page*pageSize : (page+1)*pageSize]
|
||||||
|
} else {
|
||||||
|
cards = list[page*pageSize:]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var cardStocks []GameCardGoodsStock
|
//cardIds := make([]uint64, 0)
|
||||||
err = NewGameCardGoodsStockQuerySet(DB).GameCardIdIn(cardIds...).All(&cardStocks)
|
//for i, _ := range cards {
|
||||||
if err != nil {
|
// cardIds = append(cardIds, uint64(cards[i].ID))
|
||||||
logger.Error("err:", err)
|
//}
|
||||||
return cards, totalPage, nil
|
|
||||||
}
|
//var cardStocks []GameCardGoodsStock
|
||||||
cardStockMap := make(map[uint64]uint32, 0)
|
//err = NewGameCardGoodsStockQuerySet(DB).GameCardIdIn(cardIds...).All(&cardStocks)
|
||||||
for i, _ := range cardStocks {
|
//if err != nil {
|
||||||
cardStockMap[cardStocks[i].GameCardId] += cardStocks[i].RentStock
|
// logger.Error("err:", err)
|
||||||
}
|
// return cards, totalPage, nil
|
||||||
|
//}
|
||||||
|
//cardStockMap := make(map[uint64]uint32, 0)
|
||||||
|
//for i, _ := range cardStocks {
|
||||||
|
// cardStockMap[cardStocks[i].GameCardId] += cardStocks[i].RentStock
|
||||||
|
//}
|
||||||
for i, _ := range cards {
|
for i, _ := range cards {
|
||||||
stock, ok := cardStockMap[uint64(cards[i].ID)]
|
//stock, ok := cardStockMap[uint64(cards[i].ID)]
|
||||||
if ok {
|
//if ok {
|
||||||
cards[i].StockCount = stock
|
// cards[i].StockCount = stock
|
||||||
}
|
//}
|
||||||
if user != nil && user.IsMember() {
|
if user != nil && user.IsMember() {
|
||||||
cards[i].RealPrice = 0
|
cards[i].RealPrice = 0
|
||||||
}
|
}
|
||||||
|
|
|
@ -105,16 +105,19 @@ func InitTestDB() {
|
||||||
//&CooperativeDeductSettle{},
|
//&CooperativeDeductSettle{},
|
||||||
//&XcxRole{},
|
//&XcxRole{},
|
||||||
|
|
||||||
&Goods{},
|
// 商城
|
||||||
&GoodsCat{},
|
//&Goods{},
|
||||||
&GoodsAttribute{},
|
//&GoodsCat{},
|
||||||
&GoodsAttributeCombo{},
|
//&GoodsAttribute{},
|
||||||
&Spec{},
|
//&GoodsAttributeCombo{},
|
||||||
&SpecValue{},
|
//&Spec{},
|
||||||
&GoodsOrder{},
|
//&SpecValue{},
|
||||||
&OperationLog{},
|
//&GoodsOrder{},
|
||||||
&DeliverTask{},
|
//&OperationLog{},
|
||||||
&DeliverTaskSub{},
|
//&DeliverTask{},
|
||||||
|
//&DeliverTaskSub{},
|
||||||
|
|
||||||
|
&GameCard{},
|
||||||
)
|
)
|
||||||
|
|
||||||
fmt.Println("DB init success")
|
fmt.Println("DB init success")
|
||||||
|
@ -197,16 +200,17 @@ func InitDBProd() {
|
||||||
//&CooperativeDeductSettle{},
|
//&CooperativeDeductSettle{},
|
||||||
//&XcxRole{},
|
//&XcxRole{},
|
||||||
|
|
||||||
&Goods{},
|
// 商城
|
||||||
&GoodsCat{},
|
//&Goods{},
|
||||||
&GoodsAttribute{},
|
//&GoodsCat{},
|
||||||
&GoodsAttributeCombo{},
|
//&GoodsAttribute{},
|
||||||
&Spec{},
|
//&GoodsAttributeCombo{},
|
||||||
&SpecValue{},
|
//&Spec{},
|
||||||
&GoodsOrder{},
|
//&SpecValue{},
|
||||||
&OperationLog{},
|
//&GoodsOrder{},
|
||||||
&DeliverTask{},
|
//&OperationLog{},
|
||||||
&DeliverTaskSub{},
|
//&DeliverTask{},
|
||||||
|
//&DeliverTaskSub{},
|
||||||
)
|
)
|
||||||
|
|
||||||
if err := DBProd.DB().Ping(); err != nil {
|
if err := DBProd.DB().Ping(); err != nil {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user