|
|
@@ -8,13 +8,14 @@ import ( |
|
|
|
"applet/app/utils" |
|
|
|
"code.fnuoos.com/EggPlanet/egg_models.git/src/implement" |
|
|
|
"code.fnuoos.com/EggPlanet/egg_models.git/src/model" |
|
|
|
"errors" |
|
|
|
"fmt" |
|
|
|
"github.com/gin-gonic/gin" |
|
|
|
"strings" |
|
|
|
) |
|
|
|
|
|
|
|
// UserManagementGetUserList |
|
|
|
// @Summary 制度中心-会员中心-用户信息管理(获取) |
|
|
|
// @Summary 制度中心-会员中心-用户管理-用户信息管理(获取) |
|
|
|
// @Tags 会员中心 |
|
|
|
// @Description 用户信息管理(获取) |
|
|
|
// @Accept json |
|
|
@@ -85,7 +86,7 @@ func UserManagementGetUserList(c *gin.Context) { |
|
|
|
Nickname: user.Nickname, |
|
|
|
Phone: user.Phone, |
|
|
|
IsRealName: user.IsRealName, |
|
|
|
Level: levelsMap[user.Level], |
|
|
|
LevelName: levelsMap[user.Level], |
|
|
|
InviteCode: user.SystemInviteCode, |
|
|
|
ParentID: user.ParentUid, |
|
|
|
ParentInviteCode: user.ParentSystemInviteCode, |
|
|
@@ -109,7 +110,7 @@ func UserManagementGetUserList(c *gin.Context) { |
|
|
|
} |
|
|
|
|
|
|
|
// UserManagementUpdateUserInfo |
|
|
|
// @Summary 制度中心-会员中心-用户信息管理(更新) |
|
|
|
// @Summary 制度中心-会员中心-用户管理-用户信息管理(更新) |
|
|
|
// @Tags 会员中心 |
|
|
|
// @Description 用户信息管理(更新) |
|
|
|
// @Accept json |
|
|
@@ -125,67 +126,92 @@ func UserManagementUpdateUserInfo(c *gin.Context) { |
|
|
|
e.OutErr(c, e.ERR_INVALID_ARGS, err.Error()) |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
session := db.Db.NewSession() |
|
|
|
defer session.Close() |
|
|
|
session.Begin() |
|
|
|
userDb := implement.NewUserDb(db.Db) |
|
|
|
|
|
|
|
var affected int64 |
|
|
|
var err1 error |
|
|
|
forceColumns := make([]string, 0) |
|
|
|
user := model.User{ |
|
|
|
Id: req.UID, |
|
|
|
Id: req.UID, |
|
|
|
Phone: req.Phone, |
|
|
|
UnionId: req.UnionId, |
|
|
|
Nickname: req.Nickname, |
|
|
|
Avatar: req.Avatar, |
|
|
|
LastLoginIp: req.LastLoginIp, |
|
|
|
Memo: req.Memo, |
|
|
|
} |
|
|
|
if req.Memo != "" { |
|
|
|
user.Memo = req.Memo |
|
|
|
forceColumns = append(forceColumns, "memo") |
|
|
|
if req.Level != "" { |
|
|
|
user.Level = utils.StrToInt(req.Level) |
|
|
|
} |
|
|
|
if req.Disable != false { |
|
|
|
user.State = 2 |
|
|
|
forceColumns = append(forceColumns, "state") |
|
|
|
if req.State != "" { |
|
|
|
user.State = utils.StrToInt(req.State) |
|
|
|
} |
|
|
|
if req.LastLoginIp != "" { |
|
|
|
user.LastLoginIp = req.LastLoginIp |
|
|
|
forceColumns = append(forceColumns, "last_login_ip") |
|
|
|
if req.Sex != "" { |
|
|
|
user.Sex = utils.StrToInt(req.Sex) |
|
|
|
} |
|
|
|
if req.Avatar != "" { |
|
|
|
user.Avatar = req.Avatar |
|
|
|
forceColumns = append(forceColumns, "avatar") |
|
|
|
if req.ParentUid != "" { |
|
|
|
user.ParentUid = utils.StrToInt64(req.ParentUid) |
|
|
|
} else { |
|
|
|
user.ParentUid = 0 |
|
|
|
} |
|
|
|
if len(forceColumns) > 0 { |
|
|
|
affected, err1 = userDb.UserUpdate(req.UID, &user) |
|
|
|
if err1 != nil { |
|
|
|
e.OutErr(c, e.ERR_DB_ORM, err1.Error()) |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
forceColumns = []string{"sex", "parent_uid"} |
|
|
|
affected, err1 = userDb.UserUpdateBySession(session, req.UID, &user, forceColumns...) |
|
|
|
if err1 != nil { |
|
|
|
session.Rollback() |
|
|
|
e.OutErr(c, e.ERR_DB_ORM, err1.Error()) |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
relateDb := implement.NewUserRelateDb(db.Db) |
|
|
|
relateForceColumns := []string{"sex", "parent_uid"} |
|
|
|
relate := &model.UserRelate{ |
|
|
|
ParentUid: user.ParentUid, |
|
|
|
} |
|
|
|
affected, err1 = relateDb.UpdateUserRelateBySession(session, req.UID, relate, relateForceColumns...) |
|
|
|
if err1 != nil { |
|
|
|
session.Rollback() |
|
|
|
e.OutErr(c, e.ERR_DB_ORM, err1.Error()) |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
var err2 error |
|
|
|
if req.Tag != 0 { |
|
|
|
if req.Tag != "" { |
|
|
|
record := model.UserTagRecords{ |
|
|
|
TagId: req.Tag, |
|
|
|
TagId: utils.StrToInt(req.Tag), |
|
|
|
} |
|
|
|
recordsDb := implement.NewUserTagRecordsDb(db.Db) |
|
|
|
affected, err2 = recordsDb.UserTagRecordsUpdate(req.UID, &record, "tag_id") |
|
|
|
affected, err2 = recordsDb.UserTagRecordsUpdateBySession(session, req.UID, &record, "tag_id") |
|
|
|
if err2 != nil { |
|
|
|
session.Rollback() |
|
|
|
e.OutErr(c, e.ERR_DB_ORM, err2.Error()) |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
err3 := session.Commit() |
|
|
|
if err3 != nil { |
|
|
|
session.Rollback() |
|
|
|
e.OutErr(c, e.ERR_DB_ORM, err3.Error()) |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
e.OutSuc(c, affected, nil) |
|
|
|
} |
|
|
|
|
|
|
|
// UserManagementGetOneBasic |
|
|
|
// @Summary 制度中心-会员中心-会员明细概况(获取) |
|
|
|
// @Summary 制度中心-会员中心-用户管理-会员明细概况(获取) |
|
|
|
// @Tags 会员中心 |
|
|
|
// @Description 会员明细概况(获取) |
|
|
|
// @Accept json |
|
|
|
// @Produce json |
|
|
|
// @param Authorization header string true "验证参数Bearer和token空格拼接" |
|
|
|
// @Param uid query int true "用户 ID" |
|
|
|
// @Param uid query string true "用户 ID" |
|
|
|
// @Success 200 {object} md.UserManagementGetOneBasicResp "会员明细概况具体数据" |
|
|
|
// @Failure 400 {object} md.Response "具体错误" |
|
|
|
// @Router /api/memberCenter/userManagement/getOneBasicInfo [get] |
|
|
|
// @Router /api/memberCenter/userManagement/userData [get] |
|
|
|
func UserManagementGetOneBasic(c *gin.Context) { |
|
|
|
uid := c.Query("uid") |
|
|
|
userDb := implement.NewUserDb(db.Db) |
|
|
@@ -232,24 +258,7 @@ func UserManagementGetOneBasic(c *gin.Context) { |
|
|
|
tagsMap[tag.Id] = tag.TagName |
|
|
|
} |
|
|
|
|
|
|
|
//3. 查询货币列表 |
|
|
|
coinDb := implement.NewVirtualCoinDb(db.Db) |
|
|
|
coins, err3 := coinDb.VirtualCoinFindAll() |
|
|
|
if err3 != nil { |
|
|
|
e.OutErr(c, e.ERR_DB_ORM, err3.Error()) |
|
|
|
return |
|
|
|
} |
|
|
|
coinsList := make([]map[string]interface{}, 0) |
|
|
|
coinsMap := make(map[int]string) |
|
|
|
for _, coin := range coins { |
|
|
|
coinsList = append(coinsList, map[string]interface{}{ |
|
|
|
"id": coin.Id, |
|
|
|
"name": coin.Name, |
|
|
|
}) |
|
|
|
coinsMap[coin.Id] = coin.Name |
|
|
|
} |
|
|
|
|
|
|
|
//4. 查询父用户信息 |
|
|
|
//3. 查询父用户信息 |
|
|
|
parent, err := userDb.UserGetOneByParams(map[string]interface{}{ |
|
|
|
"key": "id", |
|
|
|
"value": user.ParentUid, |
|
|
@@ -259,87 +268,60 @@ func UserManagementGetOneBasic(c *gin.Context) { |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
//5. 查询用户标签 |
|
|
|
//4. 查询用户标签 |
|
|
|
recordsDb := implement.NewUserTagRecordsDb(db.Db) |
|
|
|
userTagRecord, err := recordsDb.UserTagRecordsGetOneByParams(map[string]interface{}{ |
|
|
|
"key": "uid", |
|
|
|
"value": uid, |
|
|
|
}) |
|
|
|
if err != nil { |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
//6. 查询用户虚拟钱包 |
|
|
|
amountDb := implement.NewUserVirtualAmountDb(db.Db) |
|
|
|
virtualWallets, err := amountDb.GetUserVirtualAllWallets(utils.AnyToInt64(uid)) |
|
|
|
if err != nil { |
|
|
|
e.OutErr(c, e.ERR_DB_ORM, err.Error()) |
|
|
|
return |
|
|
|
} |
|
|
|
virtualAmountList := make([]md.VirtualAmountInfoNode, 0) |
|
|
|
for _, virtualWallet := range *virtualWallets { |
|
|
|
virtualAmountList = append(virtualAmountList, md.VirtualAmountInfoNode{ |
|
|
|
CoinName: coinsMap[virtualWallet.CoinId], |
|
|
|
Amount: virtualWallet.Amount, |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
//7. 查询用户钱包余额 |
|
|
|
userWalletDb := implement.NewUserWalletDb(db.Db) |
|
|
|
wallet, err := userWalletDb.GetUserVirtualWallet(utils.StrToInt64(uid)) |
|
|
|
if err != nil { |
|
|
|
e.OutErr(c, e.ERR_DB_ORM, err.Error()) |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
resp := md.UserManagementGetOneBasicResp{ |
|
|
|
TagsList: tagsList, |
|
|
|
LevelsList: levelsList, |
|
|
|
CoinsList: coinsList, |
|
|
|
VirtualAmountInfo: virtualAmountList, |
|
|
|
TagsList: tagsList, |
|
|
|
LevelsList: levelsList, |
|
|
|
BasicInfo: md.BasicInfoNode{ |
|
|
|
Avatar: user.Avatar, |
|
|
|
Sex: user.Sex, |
|
|
|
Nickname: user.Nickname, |
|
|
|
TagID: userTagRecord.TagId, |
|
|
|
Phone: user.Phone, |
|
|
|
UnionId: user.UnionId, |
|
|
|
Password: user.Password, |
|
|
|
Passcode: user.Passcode, |
|
|
|
State: user.State, |
|
|
|
Memo: user.Memo, |
|
|
|
ParentUid: parent.Id, |
|
|
|
ParentName: parent.Nickname, |
|
|
|
ParentPhone: parent.Phone, |
|
|
|
SystemInviteCode: user.SystemInviteCode, |
|
|
|
CustomInviteCode: user.CustomInviteCode, |
|
|
|
Level: levelsMap[user.Level], |
|
|
|
}, |
|
|
|
WalletInfo: md.WalletNode{ |
|
|
|
Amount: wallet.Amount, |
|
|
|
Avatar: user.Avatar, |
|
|
|
Sex: user.Sex, |
|
|
|
Nickname: user.Nickname, |
|
|
|
LevelName: levelsMap[user.Level], |
|
|
|
Phone: user.Phone, |
|
|
|
UnionId: user.UnionId, |
|
|
|
Password: user.Password, |
|
|
|
State: user.State, |
|
|
|
Memo: user.Memo, |
|
|
|
}, |
|
|
|
OtherInfo: md.OtherNode{ |
|
|
|
LastLoginIp: user.LastLoginIp, |
|
|
|
LastLoginAt: user.UpdateAt, |
|
|
|
CreateAt: user.CreateAt, |
|
|
|
RegisterType: user.RegisterType, |
|
|
|
LastLoginIp: user.LastLoginIp, |
|
|
|
LastLoginAt: user.UpdateAt, |
|
|
|
CreateAt: user.CreateAt, |
|
|
|
}, |
|
|
|
} |
|
|
|
if userTagRecord != nil { |
|
|
|
resp.BasicInfo.TagName = tagsMap[userTagRecord.TagId] |
|
|
|
} |
|
|
|
if parent != nil { |
|
|
|
resp.BasicInfo.ParentUid = parent.Id |
|
|
|
resp.BasicInfo.ParentName = parent.Nickname |
|
|
|
resp.BasicInfo.ParentPhone = parent.Phone |
|
|
|
} |
|
|
|
|
|
|
|
e.OutSuc(c, resp, nil) |
|
|
|
} |
|
|
|
|
|
|
|
// UserManagementGetFans |
|
|
|
// @Summary 制度中心-会员中心-会员明细粉丝情况(获取) |
|
|
|
// @Summary 制度中心-会员中心-用户管理-会员明细粉丝情况(获取) |
|
|
|
// @Tags 会员中心 |
|
|
|
// @Description 会员明细粉丝情况(获取) |
|
|
|
// @Accept json |
|
|
|
// @Produce json |
|
|
|
// @param Authorization header string true "验证参数Bearer和token空格拼接" |
|
|
|
// @Param uid query int true "用户 ID" |
|
|
|
// @Param type query int true "粉丝类型(1.全部 2.直推 3.二代 4.二代以后)" |
|
|
|
// @Param limit query int true "每页大小" |
|
|
|
// @Param page query int true "页数" |
|
|
|
// @Param uid query string true "用户 ID" |
|
|
|
// @Param type query string true "粉丝类型(1.全部 2.直推 3.二代 4.二代以后)" |
|
|
|
// @Param limit query string true "每页大小" |
|
|
|
// @Param page query string true "页数" |
|
|
|
// @Success 200 {object} md.UserManagementGetFansResp "具体数据" |
|
|
|
// @Failure 400 {object} md.Response "具体错误" |
|
|
|
// @Router /api/memberCenter/userManagement/getFans [get] |
|
|
@@ -387,7 +369,7 @@ func UserManagementGetFans(c *gin.Context) { |
|
|
|
levelTotalMap[levelTotal.Uid] = levelTotal.LevelTotal |
|
|
|
} |
|
|
|
|
|
|
|
//3. 查询可体现余额 |
|
|
|
//3. 查询可提现余额 |
|
|
|
walletDb := implement.NewUserWalletDb(db.Db) |
|
|
|
wallets, err := walletDb.FindUserWalletByParams(map[string]interface{}{ |
|
|
|
"key": uid, |
|
|
@@ -403,19 +385,21 @@ func UserManagementGetFans(c *gin.Context) { |
|
|
|
} |
|
|
|
|
|
|
|
//4. 查询累计收益 |
|
|
|
userIDStrs := make([]string, len(*relates)) |
|
|
|
for i, id := range userIDs { |
|
|
|
userIDStrs[i] = utils.Int64ToStr(id) |
|
|
|
} |
|
|
|
sql := "SELECT SUM(amount) as total, uid FORM `user_wallet_flow` WHERE uid in (%s) AND direction = 1 Group BY uid" |
|
|
|
results, err := db.QueryNativeString(db.Db, fmt.Sprintf(sql, strings.Join(userIDStrs, ","))) |
|
|
|
if err != nil { |
|
|
|
e.OutErr(c, e.ERR_DB_ORM, err.Error()) |
|
|
|
return |
|
|
|
} |
|
|
|
var incomeMap = map[int64]string{} |
|
|
|
for _, res := range results { |
|
|
|
incomeMap[utils.StrToInt64(res["uid"])] = res["total"] |
|
|
|
if len(*relates) > 0 { |
|
|
|
userIDStrs := make([]string, len(*relates)) |
|
|
|
for i, id := range userIDs { |
|
|
|
userIDStrs[i] = utils.Int64ToStr(id) |
|
|
|
} |
|
|
|
sql := "SELECT SUM(amount) as total, uid FROM `user_wallet_flow` WHERE uid in (%s) AND direction = 1 Group BY uid" |
|
|
|
results, err := db.QueryNativeString(db.Db, fmt.Sprintf(sql, strings.Join(userIDStrs, ","))) |
|
|
|
if err != nil { |
|
|
|
e.OutErr(c, e.ERR_DB_ORM, err.Error()) |
|
|
|
return |
|
|
|
} |
|
|
|
for _, res := range results { |
|
|
|
incomeMap[utils.StrToInt64(res["uid"])] = res["total"] |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
//5. 查询用户信息 |
|
|
@@ -432,13 +416,16 @@ func UserManagementGetFans(c *gin.Context) { |
|
|
|
list := make([]md.FansNode, len(users)) |
|
|
|
for i, user := range users { |
|
|
|
list[i] = md.FansNode{ |
|
|
|
ID: user.Id, |
|
|
|
Nickname: user.Nickname, |
|
|
|
Phone: user.Phone, |
|
|
|
LevelTotal: levelTotalMap[user.Id], |
|
|
|
Amount: walletMap[user.Id], |
|
|
|
TotalIncome: incomeMap[user.Id], |
|
|
|
RegisterAt: user.CreateAt, |
|
|
|
ID: user.Id, |
|
|
|
Nickname: user.Nickname, |
|
|
|
Phone: user.Phone, |
|
|
|
LevelTotal: levelTotalMap[user.Id], |
|
|
|
Amount: walletMap[user.Id], |
|
|
|
RegisterAt: user.CreateAt, |
|
|
|
} |
|
|
|
val, ok := incomeMap[user.Id] |
|
|
|
if ok { |
|
|
|
list[i].TotalIncome = val |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@@ -455,22 +442,22 @@ func UserManagementGetFans(c *gin.Context) { |
|
|
|
} |
|
|
|
|
|
|
|
// UserManagementGetBalanceDetail |
|
|
|
// @Summary 制度中心-会员中心-会员明细余额(获取) |
|
|
|
// @Summary 制度中心-会员中心-用户管理-会员明细(余额获取) |
|
|
|
// @Tags 会员中心 |
|
|
|
// @Description 会员明细余额(获取) |
|
|
|
// @Description 会员明细(余额获取) |
|
|
|
// @Accept json |
|
|
|
// @Produce json |
|
|
|
// @param Authorization header string true "验证参数Bearer和token空格拼接" |
|
|
|
// @Param uid query int true "用户 ID" |
|
|
|
// @Param limit query int true "每页大小" |
|
|
|
// @Param page query int true "页数" |
|
|
|
// @Param uid query string true "用户 ID" |
|
|
|
// @Param limit query string true "每页大小" |
|
|
|
// @Param page query string true "页数" |
|
|
|
// @Success 200 {object} md.UserManagementGetBalanceDetailResp "具体数据" |
|
|
|
// @Failure 400 {object} md.Response "具体错误" |
|
|
|
// @Router /api/memberCenter/userManagement/balanceDetail [get] |
|
|
|
func UserManagementGetBalanceDetail(c *gin.Context) { |
|
|
|
uid := c.Query("uid") |
|
|
|
page := c.Query("page") |
|
|
|
limit := c.Query("limit") |
|
|
|
page := c.DefaultQuery("page", "1") |
|
|
|
limit := c.DefaultQuery("limit", "10") |
|
|
|
|
|
|
|
walletFlowDb := implement.NewUserWalletFlowDb(db.Db) |
|
|
|
walletFlows, total, err := walletFlowDb.UserWalletFlowFindByParams(map[string]interface{}{ |
|
|
@@ -482,16 +469,6 @@ func UserManagementGetBalanceDetail(c *gin.Context) { |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
userDb := implement.NewUserDb(db.Db) |
|
|
|
user, err := userDb.UserGetOneByParams(map[string]interface{}{ |
|
|
|
"key": "uid", |
|
|
|
"value": uid, |
|
|
|
}) |
|
|
|
if err != nil { |
|
|
|
e.OutErr(c, e.ERR_DB_ORM, err.Error()) |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
kindMap := map[int]string{ |
|
|
|
1: "管理员操作增加余额", |
|
|
|
2: "管理员操作扣除余额", |
|
|
@@ -503,17 +480,12 @@ func UserManagementGetBalanceDetail(c *gin.Context) { |
|
|
|
for i, flow := range *walletFlows { |
|
|
|
list[i] = md.BalanceDetailNode{ |
|
|
|
ID: flow.Id, |
|
|
|
Uid: user.Id, |
|
|
|
Nickname: user.Nickname, |
|
|
|
Phone: user.Phone, |
|
|
|
Amount: flow.Amount, |
|
|
|
AfterAmount: flow.AfterAmount, |
|
|
|
Kind: kindMap[flow.Kind], |
|
|
|
OrdID: flow.OrdId, |
|
|
|
CreateAt: flow.CreateAt, |
|
|
|
} |
|
|
|
} |
|
|
|
// todo增加总数、支出总数 |
|
|
|
|
|
|
|
resp := md.UserManagementGetBalanceDetailResp{ |
|
|
|
List: list, |
|
|
@@ -526,10 +498,23 @@ func UserManagementGetBalanceDetail(c *gin.Context) { |
|
|
|
e.OutSuc(c, resp, nil) |
|
|
|
} |
|
|
|
|
|
|
|
// UserManagementGetVirtualCoinDetail todo 补充s wag 注释 |
|
|
|
// UserManagementGetVirtualCoinDetail |
|
|
|
// @Summary 制度中心-会员中心-用户管理-会员明细(积分明细获取) |
|
|
|
// @Tags 会员中心 |
|
|
|
// @Description 会员明细(积分明细获取) |
|
|
|
// @Accept json |
|
|
|
// @Produce json |
|
|
|
// @param Authorization header string true "验证参数Bearer和token空格拼接" |
|
|
|
// @Param uid query string true "用户 ID" |
|
|
|
// @Param coinId query string true "货币 ID" |
|
|
|
// @Param limit query string true "每页大小" |
|
|
|
// @Param page query string true "页数" |
|
|
|
// @Success 200 {object} md.UserManagementGetVirtualCoinDetailResp "具体数据" |
|
|
|
// @Failure 400 {object} md.Response "具体错误" |
|
|
|
// @Router /api/memberCenter/userManagement/getVirtualCoinDetail [get] |
|
|
|
func UserManagementGetVirtualCoinDetail(c *gin.Context) { |
|
|
|
page := c.Query("page") |
|
|
|
limit := c.Query("limit") |
|
|
|
page := c.DefaultQuery("page", "1") |
|
|
|
limit := c.DefaultQuery("limit", "10") |
|
|
|
uid := c.Query("uid") |
|
|
|
coinID := c.Query("coinId") |
|
|
|
coinDb := implement.NewVirtualCoinDb(db.Db) |
|
|
@@ -538,6 +523,10 @@ func UserManagementGetVirtualCoinDetail(c *gin.Context) { |
|
|
|
e.OutErr(c, e.ERR_DB_ORM, err.Error()) |
|
|
|
return |
|
|
|
} |
|
|
|
if coins == nil { |
|
|
|
e.OutErr(c, e.ERR_NO_DATA, errors.New("未初始化货币")) |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
coinsList := make([]map[string]interface{}, len(coins)) |
|
|
|
coinsMap := map[int]string{} |
|
|
|