From fc07641fa2f9f3d64e45ca94bb66145c58d05a90 Mon Sep 17 00:00:00 2001 From: kanade <3136520963@qq.com> Date: Tue, 27 Oct 2020 18:00:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=83=A8=E5=88=86=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/constant/redis.go | 5 ++ app/controller/goods/goods.go | 13 +++++ app/controller/live/live.go | 75 ++++++++++++++------------- app/controller/topic/topic.go | 23 ++++++++ app/lib/aliyun/client.go | 36 +++++++++++++ app/lib/aliyun/text.go | 62 ++++++++++++++++++++++ app/lib/asset/asset.go | 8 +-- app/lib/db/redis.go | 52 +++++++++++++++++++ app/lib/page.go | 2 +- app/lib/recook/user.go | 7 +-- app/lib/tencent/im.go | 15 ++++++ app/lib/tencent/short.go | 2 +- app/logic/goods/goods.go | 52 +++++++++++++++++++ app/logic/live/live.go | 14 +++++ app/logic/topic/topic.go | 26 ++++++++++ app/model/promotion/promotionGoods.go | 28 ++++++++++ app/model/topic/topic.go | 9 ++++ app/router/router.go | 6 ++- app/task/live.go | 14 ++--- config/app.prod.ini | 3 ++ config/app.test.ini | 3 ++ go.mod | 1 + go.sum | 2 + 23 files changed, 404 insertions(+), 54 deletions(-) create mode 100644 app/constant/redis.go create mode 100644 app/lib/aliyun/client.go create mode 100644 app/lib/aliyun/text.go create mode 100755 app/lib/db/redis.go create mode 100644 app/model/promotion/promotionGoods.go diff --git a/app/constant/redis.go b/app/constant/redis.go new file mode 100644 index 0000000..0d964fd --- /dev/null +++ b/app/constant/redis.go @@ -0,0 +1,5 @@ +package constant + +const ( + RedisKeyPromotionGoodsList = "lists:promotion:goods" +) diff --git a/app/controller/goods/goods.go b/app/controller/goods/goods.go index d3f6fac..45fc209 100644 --- a/app/controller/goods/goods.go +++ b/app/controller/goods/goods.go @@ -65,3 +65,16 @@ func (g *Goods) BrandGoodsList(c *gin.Context) { list := (&goods.Goods{}).GoodsListByBrandId(argsBrandGoodsList.BrandId, argsBrandGoodsList.Page) back.Suc(c, "操作成功", list) } + +func (g *Goods) Hot(c *gin.Context) { + args := lib.Page{} + if err := tools.ParseParams(&args, c); err != nil { + back.Fail(c, err.Error()) + return + } + list, total := (&goods.Goods{}).HotGoods(args) + back.Suc(c, "操作成功", gin.H{ + "total": total, + "list": list, + }) +} diff --git a/app/controller/live/live.go b/app/controller/live/live.go index 69fadec..aa52643 100644 --- a/app/controller/live/live.go +++ b/app/controller/live/live.go @@ -294,19 +294,20 @@ type argsLiveId struct { } type replyLiveInfo struct { - Nickname string `json:"nickname"` - HeadImgUrl string `json:"headImgUrl"` - PlayUrl string `json:"playUrl"` - UserId uint `json:"userId"` - Id uint `json:"id"` - IsFollow int `json:"isFollow"` - IsPraise int `json:"isPraise"` - Praise int `json:"praise"` - GoodsLists []GoodsItem `json:"goodsLists"` - GroupId string `json:"groupId"` - Topic uint `json:"topic"` - Title string `json:"title"` - Cover string `json:"cover"` + Nickname string `json:"nickname"` + HeadImgUrl string `json:"headImgUrl"` + PlayUrl string `json:"playUrl"` + UserId uint `json:"userId"` + Id uint `json:"id"` + IsFollow int `json:"isFollow"` + IsPraise int `json:"isPraise"` + Praise int `json:"praise"` + GoodsLists []GoodsItem `json:"goodsLists"` + GroupId string `json:"groupId"` + Topic uint `json:"topic"` + Title string `json:"title"` + Cover string `json:"cover"` + InvitationNo string `json:"invitationNo"` } type GoodsItem struct { @@ -385,19 +386,20 @@ func (l *Live) LiveInfo(c *gin.Context) { topicInfo := (&topic.Topic{}).GetById(liveItem.Topic) reply := replyLiveInfo{ - Nickname: (*users)[0].Nickname, - HeadImgUrl: (*users)[0].HeadImgUrl, - PlayUrl: tencent.Live.GetPlayUrl(liveRoom.StreamName, liveItem.Id), - GroupId: liveRoom.GroupId, - UserId: liveItem.UserId, - Id: liveItem.Id, - Cover: liveItem.Cover, - IsFollow: isFollow, - IsPraise: isPraise, - Praise: liveData.Praise, - GoodsLists: goodsList, - Topic: liveItem.Topic, - Title: topicInfo.Title, + Nickname: (*users)[0].Nickname, + HeadImgUrl: (*users)[0].HeadImgUrl, + InvitationNo: (*users)[0].InvitationNo, + PlayUrl: tencent.Live.GetPlayUrl(liveRoom.StreamName, liveItem.Id), + GroupId: liveRoom.GroupId, + UserId: liveItem.UserId, + Id: liveItem.Id, + Cover: liveItem.Cover, + IsFollow: isFollow, + IsPraise: isPraise, + Praise: liveData.Praise, + GoodsLists: goodsList, + Topic: liveItem.Topic, + Title: topicInfo.Title, } back.Suc(c, "操作成功", reply) } @@ -467,16 +469,17 @@ func (l *Live) VideoInfo(c *gin.Context) { } reply := replyLiveInfo{ - Nickname: (*users)[0].Nickname, - HeadImgUrl: (*users)[0].HeadImgUrl, - PlayUrl: liveItem.VideoUrl, - UserId: liveItem.UserId, - Id: liveItem.Id, - Cover: liveItem.Cover, - IsFollow: isFollow, - IsPraise: isPraise, - Praise: liveData.Praise, - GoodsLists: goodsList, + Nickname: (*users)[0].Nickname, + HeadImgUrl: (*users)[0].HeadImgUrl, + InvitationNo: (*users)[0].InvitationNo, + PlayUrl: liveItem.VideoUrl, + UserId: liveItem.UserId, + Id: liveItem.Id, + Cover: liveItem.Cover, + IsFollow: isFollow, + IsPraise: isPraise, + Praise: liveData.Praise, + GoodsLists: goodsList, } back.Suc(c, "操作成功", reply) } diff --git a/app/controller/topic/topic.go b/app/controller/topic/topic.go index c5d787e..237a145 100644 --- a/app/controller/topic/topic.go +++ b/app/controller/topic/topic.go @@ -37,6 +37,29 @@ func (t *Topic) List(c *gin.Context) { }) } +type argsAdd struct { + Title string `json:"title" form:"title"` +} + +// @Title 添加话题 +func (t *Topic) Add(c *gin.Context) { + args := argsAdd{} + if err := tools.ParseParams(&args, c); err != nil { + back.Fail(c, err.Error()) + return + } + if args.Title == "" { + back.Fail(c, "参数错误") + return + } + + if err := (&topic.Topic{}).Add(args.Title); err != nil { + back.Fail(c, err.Error()) + return + } + back.Suc(c, "操作成功", "") +} + // @Title 话题列表 func (t *Topic) Hot(c *gin.Context) { list := (&topic.Topic{}).Hot() diff --git a/app/lib/aliyun/client.go b/app/lib/aliyun/client.go new file mode 100644 index 0000000..477b965 --- /dev/null +++ b/app/lib/aliyun/client.go @@ -0,0 +1,36 @@ +package aliyun + +import ( + "io/ioutil" + "live/app/lib/config" + "net/http" + "strings" +) + +var ( + client = &http.Client{} + appCode = config.Config.Section("aliyun").Key("appCode").String() +) + +// @Title 请求 +func request(method, url, data string, headers ...map[string]string) ([]byte, error) { + reqest, err := http.NewRequest(method, url, strings.NewReader(data)) + if err != nil { + return nil, err + } + if len(headers) > 0 { + for key, value := range headers[0] { + reqest.Header.Add(key, value) + } + } + response, err := client.Do(reqest) + if err != nil { + return nil, err + } + defer response.Body.Close() + result, err := ioutil.ReadAll(response.Body) + if err != nil { + return nil, err + } + return result, nil +} diff --git a/app/lib/aliyun/text.go b/app/lib/aliyun/text.go new file mode 100644 index 0000000..2370e04 --- /dev/null +++ b/app/lib/aliyun/text.go @@ -0,0 +1,62 @@ +package aliyun + +// @Title 文本检测 +import ( + "encoding/json" + "net/url" +) + +const ( + actionTextUrl = "http://monitoring.market.alicloudapi.com/neirongjiance" +) + +type text struct { +} + +var ( + Text = &text{} +) + +type textResult struct { + Success bool `json:"success"` + Status int `json:"status"` + Data struct { + Out []CheckText `json:"out"` + } `json:"data"` +} + +type CheckText struct { + Politics []string `json:"政治敏感监测"` + Contraband []string `json:"违禁品监测"` + Irrigation []bool `json:"恶意灌水监测"` + Salacity []string `json:"色情监测"` + Abuse []string `json:"辱骂监测"` +} + +// @Title 敏感词检测 +func (o *text) CheckText(text string) (result CheckText, err error) { + data := url.Values{ + "in": []string{text}, + } + resByte, err := o.exec(actionTextUrl, data.Encode()) + if err != nil { + return + } + res := textResult{} + err = json.Unmarshal(resByte, &res) + if err != nil { + return + } + if len(res.Data.Out) > 0 { + result = res.Data.Out[0] + } + return +} + +// @Title 执行请求 +func (o *text) exec(action, data string) ([]byte, error) { + return request("POST", action, data, map[string]string{ + "Authorization": "APPCODE " + appCode, + "Content-Type": "application/x-www-form-urlencoded", + }) +} diff --git a/app/lib/asset/asset.go b/app/lib/asset/asset.go index 39deadc..d3cef86 100644 --- a/app/lib/asset/asset.go +++ b/app/lib/asset/asset.go @@ -99,7 +99,7 @@ func configAppIni() (*asset, error) { return a, nil } -var _configAppProdIni = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x56\xc7\xce\xb3\x4a\x90\xdd\xfb\x55\xd0\x7c\x34\xd1\x70\x25\x2f\xc8\x0e\x18\x8c\x6d\x6c\xc3\xd5\xaf\x5f\xd0\xdd\x04\x93\x73\x78\xfa\xd1\x17\x6e\x9a\xd5\xec\xba\x9a\x43\x9d\x73\xaa\x0a\x15\x08\x87\x43\xbc\x8b\x82\xbc\xc3\x9b\xcd\x9f\xc5\xd2\x35\xf9\xaf\x0d\x0a\x93\xaa\xeb\x77\x6d\xf1\x3f\x43\xc4\x73\x00\xf3\x11\xcb\x32\x62\x34\x4f\x1c\xfb\xf1\x05\xf9\x68\x51\xf7\x11\xe4\xe9\x32\x94\xb0\xfb\x80\x55\xb1\x41\x61\x5d\xb5\xfd\x8e\x61\x00\xbf\x41\xe1\xd0\xe1\x76\x87\xc2\xdf\x2d\x86\x55\x95\xfd\xee\x86\x1a\xb7\x9f\x90\xa0\xeb\xa6\xaa\x45\xbb\x0e\x0d\x5a\x28\x9e\xef\xb7\xb4\x49\x26\xfc\x32\xea\x39\x00\x1b\x14\x96\x41\x81\xff\x79\x6d\x53\xb7\x38\x4a\xe7\xdd\x4f\x92\x3c\x1d\xf1\xef\x4d\x11\xcc\x07\x94\xe3\x1d\x05\x3e\x8f\x76\x8d\xcb\x1d\x07\xc0\x66\xf3\x67\x8f\x4b\x88\xcb\xfe\xd7\xa6\x43\x99\x54\xd7\x07\xb4\xa3\x58\x00\x58\x86\xe3\x78\x7e\x93\x22\x5c\xf6\x69\x94\xe2\x76\x17\xa0\x22\x2d\x37\x78\xae\xd3\x16\xef\x78\x00\x36\x19\x5e\x76\x9c\x88\x38\x40\x07\x2c\x66\x41\x20\x70\xcc\x96\xdd\x72\x30\x80\x4c\x04\x21\x1b\xb2\x50\x08\xa3\x00\x45\xa1\x48\x45\x02\x43\x63\x5a\xa4\x19\x84\x58\x5e\xa4\x03\x16\x6e\x21\x0e\x38\x96\xdf\x74\x18\xb6\xb8\x3f\xa0\x9d\x74\x3a\xa8\x91\x60\xee\xa7\xc9\x19\xfa\x48\xba\x94\x63\x78\xad\x97\xc6\x70\x6f\xa2\x57\xbc\x2f\x65\xd3\x3a\xe5\x0f\xfa\x84\x97\x9d\xa6\xd7\x82\xc4\xbd\xf9\x4a\xbf\x1c\x27\xe3\x18\x60\xca\xe1\x1f\x75\x87\xe4\xab\xb3\x8d\xe7\x25\xd9\x04\xdf\x56\x18\xc0\xd0\x8c\x20\xd2\xd4\xdf\x46\x3f\x3e\xeb\xf1\x6b\x53\x0f\x5d\x72\x6f\x71\xd0\x2f\xbb\xb6\x2f\xea\xaf\x58\xfb\x36\x27\xf0\x2c\x00\x5f\x17\x9f\x4c\x11\xbf\x05\x38\x8c\x00\x86\x30\x64\x70\xc4\x43\x91\x0f\xf9\x20\xd8\x46\x94\x88\x99\x28\xd8\x7e\x01\xd5\xaa\x08\xd2\x72\xf7\x99\xfa\x33\xfc\x68\xf1\x57\xed\x3f\x60\xb9\xa9\xf3\x60\xf9\x0f\x51\x1e\x2c\xff\x25\xca\x83\xe5\xff\x47\x94\x07\xcb\x0f\xd1\xe7\xf1\xff\x92\xdc\x86\xe8\xb3\xeb\x3f\x2d\xba\xa7\xc5\x5f\x04\xff\x71\xfe\x91\xa7\x10\x97\x1d\xfe\xf5\xdd\xbf\x80\xc5\x22\x0f\x42\x14\x32\x28\x8c\x98\x80\x89\x44\xc8\xe2\x80\x66\x18\x0a\x62\x41\x84\x9b\x1f\xb4\xdb\xe6\xbb\xa4\xef\xeb\x3f\x48\xf2\xe7\xe6\x63\xac\x10\xfd\x51\x2c\x0d\xcc\xab\x01\x7d\x8e\xf2\x5f\x4f\xc8\x91\x22\xa3\x30\x8c\x00\x23\xc0\x08\x21\xcc\xb1\x80\xe5\x69\x1a\x22\x4a\x04\x0c\x00\xec\x96\x63\x68\xf2\xfe\x32\xd3\x11\xdf\xd4\xd3\xb7\x1e\x88\xff\x51\xd9\x25\x55\xdb\xff\xfa\xf7\xa4\x55\xe5\x97\x9d\x47\x90\xa7\x68\x47\x7d\x09\x87\x4c\xb9\x18\x99\x0a\xab\x5e\x08\x5e\x27\x18\xbb\xbe\xf9\xf9\x1d\x7e\x8f\xfc\xaf\xcd\xf0\xa3\xb7\xfb\x83\x24\x83\x3a\xfd\x57\xa9\x3e\x43\x72\xa4\x36\x75\x9b\x8e\x41\x8f\x7f\x7f\x26\x3b\x1f\x0e\x5a\x35\x1d\x64\x49\x3a\x29\x92\xa3\x49\xab\xf5\x5c\xde\x1e\x66\x9a\x9e\xf5\xae\x77\x75\x92\xac\x59\xbd\x58\xa6\x74\x14\xef\xbe\x3c\xec\xbb\x5b\x73\x7b\x1f\xcf\x9c\xcc\x70\x91\x24\x4f\x16\x13\x4f\x05\xe7\x90\x37\x65\x25\xf9\x2c\x3e\xdd\x1b\x7c\x8b\x95\xc7\x45\xf7\x12\x9b\x5c\x6d\x95\x37\x84\xd3\x56\x3b\x9a\xf1\x2c\x72\xfe\x01\x4b\xb2\xa8\x65\x4f\x62\x6e\x13\x5d\x55\xfb\xc4\xf5\xa5\x4c\x02\xcc\xba\x3f\xda\xfc\x2d\xd3\x4f\x36\x4c\x4d\xfd\x91\x8a\xac\x8c\x14\x64\xe4\x96\x9e\x97\x81\x2c\x37\x12\x21\xbc\x46\xa5\x56\xa9\x87\xa0\xea\x90\x14\x61\x1d\x72\x29\xf4\xc7\x32\x1e\x84\x51\xcb\xa6\x2c\xf4\x20\x56\x5e\x27\xf7\x6c\xcd\xd5\xcb\x23\x35\x1a\xea\x58\x88\xe8\xfe\xa1\x5f\xb9\xfa\x9a\x39\xf1\xd5\x0c\xcf\x5b\xf0\xee\xd9\x45\x36\x6c\x55\xa8\xc3\x21\xe3\x23\x58\xaa\xdb\x38\x31\x9e\xf1\x7a\x6e\x48\x81\xe5\x2c\x66\x3a\xdc\x6e\xf7\x9a\x8c\x25\x27\x16\x58\xc0\xe8\x19\x21\x48\x95\x49\xe8\xa7\x78\x76\xb3\xb7\x6b\xd7\x97\x03\xfd\x6a\x61\xed\x14\x40\xab\x93\x41\x7a\xb1\x47\xf0\x1a\x2b\x66\x3f\xf0\x77\xed\xe2\x7b\x4b\xe3\x9a\xda\xcb\xb8\xd3\xc7\x21\x2b\x12\x60\xdd\x32\xcb\x06\x3a\x23\xce\xd3\x41\x95\x1c\x49\x96\xaa\x83\x2c\x39\x8a\xd4\x5c\xbd\xcb\x33\xc9\xf0\xec\x39\xe4\x29\x14\x0c\x82\xb2\xba\x54\x92\xdd\xf9\x98\x5c\x23\xda\xf5\xb1\x7f\x74\xb5\x89\x53\xe1\x49\xf3\x92\x86\x9c\xf9\x44\xa9\x27\xce\x34\x4d\xbb\xb1\x2c\x36\x7f\x0b\xcd\xe9\xec\xe6\xb2\xd6\x28\x58\x9a\x38\x3a\x63\x72\xa3\xed\xfa\x6e\xcf\xa5\xa9\xc0\xf0\xc5\xc8\x7b\x59\x17\x2e\xf2\x7e\xe5\x15\xe7\x2a\x06\xa5\x66\xfa\x67\x40\x94\x45\xab\xb3\x92\xc9\xcd\x0f\x63\x2d\x62\xf6\xd1\xef\x4b\xa8\xa6\x42\xda\xab\x44\xfd\x82\x2a\x13\xbe\xde\x6b\x04\x75\xe2\x36\x0c\x67\xbe\x25\x9c\x4e\x59\xb2\xf8\x0e\xc9\xf7\x44\x5c\x79\xa3\xb1\xf7\xa3\xca\x0a\x85\xeb\x28\x07\x40\xbe\x26\xfe\xfd\x96\x9e\xae\x9b\x80\xf7\xf5\x45\xcb\xa3\xe9\x4c\x10\xc2\xa0\xe4\x7c\xc5\x57\x19\x65\x7b\x16\x62\x63\xb8\xea\x36\x3d\xb6\x42\xae\xe7\xa9\x33\x2d\xba\x15\x4f\x6d\xad\x11\x61\x6b\xe2\xb3\x85\xcd\xfd\x4a\xdd\xf8\xf1\x3c\x45\x4d\xcb\xb4\xec\xb9\xd9\x0a\xd3\x3d\x4d\xaa\x15\x13\x4c\x76\xe8\xb8\x1e\x69\xc0\xbb\x66\xc7\x3a\xb8\x98\x08\x2b\xdd\xe8\x08\xa9\x1e\xa9\x62\x19\xf4\xdb\xa9\xb4\xf6\x31\x74\x64\x97\x60\x64\xe2\xf4\xb6\x8f\x8a\x2f\x55\x86\x2c\xd9\x0f\x45\x90\x3c\xa1\x01\x2e\xbe\xeb\x2d\xae\x58\x56\x8f\x51\x20\x1e\x63\x42\xee\xae\xc0\x9d\xee\xeb\x7d\x5e\xab\x15\x4d\xb7\x73\x72\x88\xd6\x90\xaf\xd4\x80\xef\x9f\x48\x78\xd8\xe0\xc1\xeb\x41\x73\x22\xdc\x76\x7e\xf3\xee\x85\x39\x76\x89\xe4\xdc\x85\xa4\x6b\xf8\x7d\x22\xf4\x5a\xe1\xce\x4c\x3b\xd7\x4e\xf9\xf4\xb9\x10\xe9\x47\x95\x16\xa9\xa0\x3e\x4d\xf7\x47\xac\xae\x30\xda\x16\xd5\x76\xeb\xd5\xef\x3a\xab\x08\x8f\xb5\x63\x66\xc2\xae\x61\x97\x67\x22\xb9\xa3\x4b\x7a\xaf\xdc\x22\xf3\xc7\xad\x60\x5f\xe2\xf0\x7a\x25\x86\x1e\x7d\xeb\xbd\x71\x90\x89\xb6\x31\x8a\x10\x0f\x8a\x5c\x92\x2f\x87\xb8\xde\x3b\x10\x06\xf7\x45\x8b\x19\xaf\x52\x9c\x4a\xa6\xaa\xd7\xfd\x9c\x09\x02\x35\xae\x0a\x3f\x09\xf3\xe4\x5d\x41\x5c\x9f\x8c\x37\x4f\x8e\x86\xa8\x63\xad\x8e\x3d\x33\x25\x16\xf4\x4c\xad\x72\xdd\x0b\x7e\x56\x5e\x52\x49\xf1\x7c\x3e\xa6\x04\x65\xcd\x15\x17\xee\x5d\x83\xba\xf8\xc9\xa9\xea\xa9\x35\x7e\x39\x96\x48\x3e\xa5\xf1\xfd\xf4\x79\xda\x2b\x58\x1d\x5e\x5a\x2d\xd0\x19\x62\x10\x84\xcb\xfb\x4d\x6f\x47\x47\xe3\xce\xaa\x2d\xd8\xf4\xf0\xb8\x3a\xd3\xc1\x78\x25\xe2\x2a\x55\x86\x64\x98\x6f\x63\xbf\x7a\x56\x8e\x45\x0a\xe5\xdd\xb1\x8b\xa2\x58\xa5\xcd\xea\xd8\xbd\x9a\xb0\xb0\xd0\x7b\x5a\xc2\xb3\x92\xf0\xef\x44\xd2\xc8\x8a\x24\x0a\x76\x98\x58\x7f\xcf\x07\x79\x0e\x91\x4e\x7a\xf5\xb0\xa7\x74\xc9\x30\xf4\x41\x8b\xe9\x32\x6b\xef\x24\xc7\x38\x37\x85\x76\x2e\x07\x6b\x42\x4e\x63\x34\xba\x3b\x0b\xf0\xe6\x32\xac\xf7\x9a\x74\xd2\x65\xa5\x87\x3f\xa1\x23\x51\x3c\xb3\x4b\x7c\x7f\xe5\xd1\x90\x70\xae\xd4\x29\x7b\x6e\xe9\xe7\x26\xa4\x6c\xe2\x28\x92\x97\xaa\x75\xe9\x1a\xde\x80\xc2\x76\x69\xb9\xd8\xee\xc9\x32\x5d\x25\xf6\x64\xfd\x68\x75\xfb\x47\xb9\xd2\xa7\xeb\x6c\x0a\x73\x61\xb0\xde\x89\x79\x46\xb2\x69\x6f\x0b\xc1\x5e\x0e\x07\x69\xab\xbc\xbb\x15\xf8\xef\x0b\xcb\x28\xa7\xcc\x3a\x1a\x59\x20\xdd\xd6\xf6\xc5\xbf\xc2\xbe\x71\xd5\x1a\x94\x47\x82\xf7\xc6\xfb\x1a\xe6\xc3\x4b\x10\x13\xc9\x53\xd5\xad\x08\x5c\x45\xb9\x2a\xbd\xec\xea\x27\xed\x76\x9e\x68\xa8\x2d\x69\x71\xe8\x0d\x34\x82\x4e\xd8\x36\x19\x15\xf9\x99\x14\x98\xca\x5e\x4e\x45\x88\x88\xba\xa5\xb8\xbe\x21\x92\xdb\xa8\x82\x88\xdb\x3f\x4e\xe3\xf3\xec\x4b\x66\x9d\x53\xac\x27\x68\x76\xa8\xdc\x52\xe7\x24\xc7\x4a\x7a\x3b\x9d\xbb\x72\xfb\xe4\xb0\xf1\xb8\xb2\x70\x6f\x73\x96\x23\x5c\xf8\x07\x0d\x7c\xdb\x38\x9c\x46\xb7\x3b\xba\x7d\xbe\x5e\xfb\x12\x1f\xb5\x6b\xf3\x78\xf9\xcd\xa3\x16\xcf\xb0\xaf\xcd\xd5\xca\x07\xe7\x6c\xac\xf7\x2b\x85\xb4\x32\x46\xa5\x1d\xd0\x9d\x17\x23\x24\x48\x77\x6f\x01\x96\x91\xfa\x83\xac\x9e\x25\x26\x01\x11\x08\x1e\x9d\x33\x84\xf9\x25\x72\x0d\x02\x38\x7b\x92\x69\xda\xc5\x3a\xdc\x9e\x16\x51\x08\x6a\xa9\xf4\x59\x9d\xb9\x06\x65\x1c\x38\x12\xcc\xa2\xff\x78\xe4\xb7\x25\x3c\x8c\xeb\x76\x2f\x58\x79\x7f\x98\x5f\x2d\xb9\x81\x25\xfa\x7b\xc5\x40\x54\xfe\x7b\xc5\x74\x7d\xd0\xa7\x70\xb3\xf9\xf3\xfb\x57\xa3\x08\xe6\x4b\x1b\xa4\x1d\xde\x31\x00\x80\xff\x0d\x00\x00\xff\xff\x49\x5a\x4a\x99\x39\x0a\x00\x00") +var _configAppProdIni = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x56\x47\x8f\xe3\x3c\x12\xbd\xfb\xaf\x08\xdb\xa2\x32\xf5\x01\x3e\x28\x3b\xca\x96\x6d\xd9\x96\x07\x83\x81\x44\x52\xc1\xca\x39\xfc\xfa\x45\x4f\xf7\x97\xf6\xb4\x37\x16\xf5\xc4\x57\xaf\x1e\x0b\x45\x4c\x82\x3e\x5a\x87\x7e\xd6\x92\xd5\xea\x47\x3e\xb7\x75\xf6\x73\x85\x83\xb8\x6c\xbb\x75\x93\xff\xa7\x0f\x45\x01\x10\x31\xe4\x79\x4e\x0e\xa7\x51\xe0\x3f\x7e\x43\x3e\x1a\xdc\x7e\xf8\x59\x32\xf7\x05\x6a\x3f\x50\x99\xaf\x70\x50\x95\x4d\xb7\xe6\x38\x20\xae\x70\xd0\xb7\xa4\x59\xe3\xe0\x57\x43\x50\x59\xa6\xbf\xda\xbe\x22\xcd\x27\xc4\x6f\xdb\xb1\x6c\xf0\xba\xc5\xbd\x11\xc8\xc7\xdb\x35\xa9\xe3\x91\x3c\xad\x6a\xf2\xc1\x0a\x07\x85\x9f\x93\xbf\x7f\x5b\x55\x0d\x09\x93\x69\xfd\x7d\x48\x96\x0c\xe4\xd7\x2a\xf7\xa7\x2d\xce\xc8\x9a\x01\x9f\xcb\x53\x45\x8a\xb5\x00\xc0\x6a\xf5\xa3\x23\x05\x22\x45\xf7\x73\xd5\xe2\x54\xa9\xaa\x2d\x5e\x33\x3c\x00\x3c\x27\x08\xa2\xb8\x4a\x30\x29\xba\x24\x4c\x48\xb3\xf6\x71\x9e\x14\x2b\x32\x55\x49\x43\xd6\x22\x00\xab\x94\xcc\x6b\x41\xc6\x02\x60\x7d\x9e\xf0\xc0\x87\x02\x27\xf1\x92\x80\x7c\xc4\x85\x08\xf1\x01\x8f\x60\x10\xfa\x38\x0c\x64\x26\x84\x1c\x4b\x58\x99\xe5\x30\xe6\x45\x99\xf5\x79\x24\x21\xe2\x0b\xbc\xb8\x6a\x09\x6a\x48\xb7\xc5\x6b\x65\xbf\xd5\x43\x78\xd8\x8c\xa3\xd3\x77\xa1\x72\x2e\x86\xe0\x52\xcd\xb5\xe5\x5e\x65\x2f\x7f\x9f\x8b\xba\x71\x8a\x6f\xf4\x9e\xcc\x6b\xc3\xac\xa0\x22\xbc\xc5\xd2\x3c\xef\x46\x6b\xe7\x13\xc6\x11\xef\x55\x8b\xd5\x8b\x23\x45\xd3\x1c\xaf\xfc\x2f\x29\x1c\xe0\x58\x0e\xca\x2c\xf3\x97\xd0\x8f\xcf\x7a\xfc\x5c\x55\x7d\x1b\xdf\x1a\xe2\x77\xf3\xba\xe9\xf2\xea\x77\x6c\x7c\x89\x83\x22\x0f\xc0\xef\x8d\x4f\xa6\x50\x94\x00\x09\x42\x40\x10\x0a\x38\x12\x8a\x48\x16\x03\xd1\xf7\xa5\x90\x91\x09\x17\xfa\xd2\x6f\xa0\x5e\xe6\x7e\x52\xac\x3f\x8f\xfe\x0c\x3f\x1a\xf2\xbb\xf6\x1f\xa8\x58\x55\x99\x3f\xff\x8b\x28\xf3\xe7\x7f\x13\x65\xfe\xfc\xff\x11\x65\xfe\xfc\x4d\xf4\xb9\xfc\x5f\x92\x6b\x1f\x7e\xba\xfe\x6d\xd1\x2d\xc9\xff\x24\xf8\x97\xf2\x8f\x2c\x41\xa4\x68\xc9\xcf\x2f\xff\x7c\x9e\xc8\x22\x08\x70\xc0\xe1\x20\xe4\x7c\x2e\x94\x11\x4f\x7c\x96\xe3\x18\x44\xa0\x8c\x56\xdf\x68\xb7\xc9\xd6\x71\xd7\x55\x7f\xd0\xf4\xf7\xce\xc7\x50\x62\xf6\x23\x9f\x6b\x94\x95\x3d\xfe\xbc\xca\x7f\x7e\xa1\x07\x86\x0e\x83\x20\x04\x1c\x44\x21\xc6\x44\xe0\x01\x2f\xb2\x2c\xc2\x8c\x0c\x38\x00\x78\x49\xe0\x58\xfa\xf6\x3c\x24\x03\xb9\xea\xfb\xaf\x7c\x10\xf9\x3b\xcb\x36\x2e\x9b\xee\xe7\x3f\x6f\x5a\x59\xfc\x96\x73\xf7\xb3\x04\xaf\x99\xdf\x89\x23\xae\x98\xad\x54\x47\x65\x07\xfd\xe7\x1e\x45\xee\xeb\xf0\xd9\x87\x5f\xad\xf5\xf3\xd3\x7d\xad\xc4\x64\xcd\x40\x0e\x84\xb2\xc0\x89\x02\x0a\x78\x89\x87\x50\x14\x25\xe4\x33\x24\x94\x7d\x5f\x0e\x45\xbc\x5a\xfd\xf8\xea\x92\x9f\xab\xfe\x5b\x62\xfb\x07\x4d\xfb\x55\xf2\x8f\xea\x7e\x86\xf4\xc0\xac\xaa\x26\x19\xfc\x8e\xfc\xfa\xe4\x3f\x6e\xb7\x46\x39\x6e\x55\x45\xd9\x6b\x8a\x63\x28\x8b\xfd\x98\xdf\x1e\xe1\xea\x8e\xf7\x2e\x37\x7d\x54\xec\x49\x3f\xdb\x07\x65\x27\xdf\x5e\x6a\xbf\x69\xaf\xf5\xf5\xbd\x3b\x0a\x2a\x27\x84\x8a\x3a\xda\x5c\x34\xe6\x82\x43\x5f\xb5\x85\x16\xd3\x68\x7f\xab\xc9\x35\xd2\xee\x67\xd3\x8b\x4f\xf4\x72\xd2\x45\x0b\xee\x25\x63\x77\x88\x26\x59\x78\x6d\x89\xa2\xca\x46\xfa\xa0\xa6\x26\x36\x75\xbd\x8b\xdd\x97\x92\x2a\x80\x5b\x36\xbb\x93\x78\x4d\xcd\xfd\x09\x25\x07\xf3\x9e\xc8\xbc\x8a\x35\x6c\x65\xb6\x99\x15\xbe\xaa\xd6\x0a\x05\x9f\x83\x56\xe9\xcc\x1d\xea\x26\xa2\x65\x54\x05\x42\x82\x5e\x43\x11\xf5\x70\x30\xd2\x31\x0d\x3c\x44\xb4\xe7\xde\x3d\xda\x53\xf9\xf4\x68\x83\x45\x26\x81\x21\xdb\xdd\xcd\x8b\x50\x5d\x52\x27\xba\x1c\x82\xa3\x04\xde\x1d\x3f\xab\xd6\x49\x87\x55\xd0\xa7\x62\x88\x0a\x5d\x8a\x62\xeb\x11\x2d\xc7\x9a\x86\xbc\x60\x73\xe3\xf6\x7a\xbd\x55\x74\xa4\x38\x11\xe4\x01\x67\xa6\x14\x54\xca\x03\x65\xee\xa3\xc9\x4d\xdf\xee\xa9\x3a\x6f\xd9\x67\x83\x2a\x27\x07\x46\x15\xf7\xca\x93\xdf\x81\xe7\x50\x72\x9b\x5e\xbc\x19\xe7\x97\x37\xd7\xee\xc1\x78\x5a\x37\x76\xd7\xa7\x79\x0c\xec\x6b\x6a\x9f\x80\xc9\xc9\xd3\xb8\xd5\x15\x47\x51\x95\x72\xab\x2a\x8e\xa6\xd4\x17\xef\xfc\x88\x53\x32\x79\x0e\xbd\x0f\xa0\x45\x31\x76\x9b\x28\xaa\x3b\xed\xe2\x4b\xc8\xba\x2f\xf2\xda\xb9\xc6\x28\xe8\x68\x6f\x78\x71\x4d\x4f\x62\xac\x55\xa3\x70\x38\x1c\x4e\xb5\x6d\xf3\xd9\x1b\xd6\xfb\xa3\x9b\xa9\x46\xad\x11\x65\x14\xd8\x94\xcb\xac\xa6\xed\xda\x8d\x90\x24\x90\x13\xf3\x41\xf4\xd2\x36\x98\xd5\xcd\x22\x6a\xce\x45\xf6\x0b\xe3\xf0\x3a\x02\xaa\xc8\x1b\x93\x57\x0e\xc2\x74\xb7\x96\x3c\xe2\xef\xdd\xa6\x40\x7a\x02\x93\x4e\xa7\xaa\x27\xd2\xb9\xe0\xf9\x5e\x42\x64\x52\xd7\xbe\x3f\x8a\x0d\xe5\xb4\xda\x9c\x46\x37\x44\xbf\x47\xea\x22\x5a\xf5\x69\x33\xe8\x3c\xcc\x5d\x47\xdb\x02\xfa\x39\x8a\xef\xb7\xf2\x70\xdd\x18\xbc\x2f\x4f\x56\x1d\x0e\xce\x88\x10\xf2\x0b\xe1\xa5\xbd\x74\x4e\x93\x8e\x30\xb2\xfa\x8b\x79\x62\x87\x06\x66\x66\x96\x38\xe3\x6c\xda\xd1\xd8\x54\x06\x15\x34\x07\x72\xb4\xc9\x61\xb3\x30\x57\x71\x38\x8e\x61\xdd\x70\x0d\x7f\xac\x25\x38\xde\x92\xb8\x5c\x08\xc5\xa5\xdb\x56\xe8\xb0\x01\xbc\x4b\xba\xab\xfc\xf3\x01\x13\xad\x1d\x1c\x98\x98\xa1\x2e\x17\x7e\x27\x8d\x85\xbd\x89\x90\xa3\xba\x14\xa7\x52\xfb\xf7\x69\xa7\xbd\x94\xd2\x52\x95\xd3\x5d\x83\x8a\x07\x6b\xe0\x92\x9b\xd9\x90\x92\xe7\xcd\x08\xfb\xf2\x2e\xa2\xd4\xf6\x02\xdc\xf1\xb6\xdc\xa6\xa5\x5c\xf0\x78\x3d\xc6\xdb\x70\x09\xc4\x52\xf7\xc5\xee\x81\xe1\xfd\x04\xee\xa2\xe9\xd7\x7b\xca\x6d\xa6\xb7\xe8\x9e\xb9\x5d\x1b\x2b\xce\x0d\xc6\x6d\x2d\x6e\x62\xd8\x19\xb9\x3b\x71\xcd\x54\x39\xc5\xe3\x25\x04\xd8\xdc\xe9\xac\xcc\xf8\xd5\x7e\xbc\xdd\x23\x7d\x41\xa1\x94\x97\x92\xe4\x55\xef\x2a\x2d\x29\x8f\x3f\x45\xdc\x48\x5c\xeb\x54\x1c\xa9\xf8\x86\xcf\xc9\xad\x74\xf3\xf4\x35\x48\xf0\x74\x8e\x82\xcb\x85\xea\x3b\xfc\x95\xef\x55\x40\x5c\x28\x45\x38\xc4\x22\xc8\x33\x45\x3d\x6f\xa3\x6a\xe3\x20\xe4\xdf\x66\x23\xe2\xbc\x52\x73\x4a\x95\x29\x9f\xb7\x63\x0a\x21\x33\x2c\x9a\x38\xc2\x69\xf4\x2e\x20\xaa\xf6\xd6\x5b\xa4\x07\x4b\x36\x89\x51\x45\xde\x21\xa1\x66\xfc\x48\xec\x62\xd9\xc0\x57\x5a\x9c\x13\x45\xf3\x5e\x62\xc4\x40\x6d\xc9\x34\x17\x6d\x5c\x8b\x39\xbf\xe2\x7d\xd9\x31\x4b\xf4\x74\x6c\x99\x7e\x28\xc3\xfb\xf1\x12\x59\x2f\xe7\x4d\x74\x6e\x0c\xdf\xe4\xa8\x1e\xc2\xf3\xfb\xcd\x4a\x83\x63\x08\x47\xfd\x04\x4f\x6c\x7f\xbf\x38\xe3\xd6\x7a\xc6\xf2\xa2\x94\x96\x62\x1d\xde\xd6\x66\xf1\xec\x8c\xc8\x0c\xce\xda\x5d\x1b\x86\x91\xce\x1e\xca\x5d\xfb\xac\x83\xdc\xc6\xef\x71\x0e\x8e\x5a\x2c\xbe\x63\xc5\xa0\x4b\x9a\xca\xf9\x7e\xe4\x5f\x1b\xd1\xcf\x32\x84\x4d\xda\xab\xfa\x0d\x63\x2a\x96\x65\xf6\x46\xc4\x16\x69\x73\xa3\x05\xce\xb9\x6a\xac\x73\xde\xda\x23\x76\x6a\xab\x36\xdd\x09\xa2\xab\xcb\xf1\xde\x73\x34\x69\x97\x57\xee\xaf\x11\xef\xa8\xfc\x91\x9e\xa3\xdb\x33\x0b\xfb\x58\x70\x95\x56\xdb\x08\x73\x37\xd5\x01\x73\xa2\x76\x32\x7d\x2e\x1b\x97\xad\xd0\x15\x68\x7c\x9b\x14\xf3\xc9\xdd\xdb\x07\x57\x8b\x3c\xd5\xdc\xd9\xed\xe6\x5e\x2c\xec\xfe\x32\x1d\xe0\x94\x5b\xbc\xb7\xe7\x1e\xa1\x7a\x38\x49\x39\x3c\xcd\xdb\xad\x22\x69\xef\x76\x01\xaf\xf7\x99\xe7\xb4\x7d\x6a\xef\xac\xd4\x57\xae\x4b\xf3\x14\x9f\x41\x57\xbb\x7a\x05\x8a\x1d\x25\x7a\xc3\x6d\x09\xb2\xfe\x09\xe5\x58\xf1\x74\x5d\x92\x81\xab\x69\x17\xad\x53\x5d\x73\x6f\x5c\x8f\x23\x8b\x8c\x39\xc9\xb7\x9d\x85\x07\xd0\x42\xa9\x4e\x99\xf0\x95\x2a\xfe\x41\xdb\xa8\x89\x8c\x30\x55\x35\x8c\xd0\xd5\x54\x7c\x1d\x74\x10\x0a\x9b\xfb\x7e\x78\x1c\x5f\xca\xa1\xca\x18\xde\x83\xc6\x29\xd0\xae\x89\xb3\x57\x23\x2d\xb9\xee\x8f\x6d\x21\x3d\x04\x62\xdd\x2f\x3c\xda\x9c\x04\xdb\x81\x67\xf1\xce\x82\xd7\xc9\xda\xee\x07\xb7\xdd\xb9\x5d\xb6\x5c\xba\x82\xec\x8c\x4b\x7d\x7f\xbe\xea\x7b\x25\x1f\x51\x57\x1d\x16\x3b\xeb\x9d\xa3\xb5\xdc\x2e\x0c\x36\x8a\x08\x17\x27\x9f\x6d\xbd\x08\x63\xa8\xdc\xbc\x19\xd8\x56\xf2\xea\x55\xfd\xa8\x70\x31\x08\x81\x7f\x6f\x9d\x3e\xc8\xce\xa1\x6b\x51\xc0\xd9\xd0\x5c\xdd\xcc\xf6\xf6\xfa\xb0\xa9\x1c\xea\x85\xd6\xa5\x55\xea\x5a\x8c\xb5\x15\x68\x30\xc9\xaf\xfb\x3d\xbb\xce\xc1\x76\x58\xa4\x0d\xb4\xb3\x6e\x3b\x3d\x1b\x7a\x85\x0a\xfc\xd7\x88\x41\xb8\xf8\xe7\x88\x69\x3b\xbf\x4b\xd0\x6a\xf5\xe3\xeb\x75\x92\xfb\xd3\xb9\xf1\x93\x96\xac\x39\x00\xc0\x7f\x03\x00\x00\xff\xff\x51\x9a\x7b\xb4\x6c\x0a\x00\x00") func configAppProdIniBytes() ([]byte, error) { return bindataRead( @@ -114,12 +114,12 @@ func configAppProdIni() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "config/app.prod.ini", size: 2617, mode: os.FileMode(420), modTime: time.Unix(1603700126, 0)} + info := bindataFileInfo{name: "config/app.prod.ini", size: 2668, mode: os.FileMode(420), modTime: time.Unix(1603761179, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _configAppTestIni = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x56\x49\x8f\xa3\x48\x16\xbe\xfb\xaf\x20\x25\xc1\x6a\x68\xc9\x07\x76\xdb\x60\x30\x36\xd8\x86\x56\xa9\x04\x41\xb0\x98\x7d\x5f\x7e\xfd\x28\x33\xab\xa7\xab\xe6\x34\xb7\x88\xe0\x23\xbe\xe5\x3d\xf4\x88\x50\x38\x26\x87\xa1\x1b\xd1\x6e\xf7\x77\xb9\xf6\x6d\xf1\x63\x17\x85\x69\xdd\x0f\x07\x82\x20\x3f\x08\x92\xfe\x20\x01\xf8\x20\x01\xbb\x8b\xc2\xa6\xee\x86\x03\x45\x7d\xad\xc7\x1e\x75\x87\x28\xfc\xd9\x21\x58\xd7\xf9\xcf\x7e\x6c\x50\xf7\x09\x09\xfa\x7e\xae\xbb\xe8\xd0\x47\xa3\x12\xf2\x17\xe7\x9e\xb5\xe9\x8c\x5e\x5a\xb3\x04\x60\x17\x85\x55\x50\xa2\x7f\x5f\xdb\x35\x1d\x8a\xb3\xe5\xf0\xeb\x92\x22\x9b\xd0\xcf\x5d\x19\x2c\xa7\xa8\x40\x07\x02\x7c\x2e\xad\x06\x55\x07\x06\xec\x76\x7f\x0f\xa8\x82\xa8\x1a\x7e\xec\xfa\x28\x17\x9a\xe6\x14\x1d\x08\x1a\x00\x9a\x62\x18\x96\xdd\x65\x11\xaa\x86\x2c\xce\x50\x77\x08\xa2\x32\xab\x76\x68\x69\xb2\x0e\x1d\x58\x00\x76\x39\x5a\x0f\x0c\x1f\x31\x80\x0c\x68\x44\x83\x80\x63\xa8\x3d\xbd\x67\x60\x00\xa9\x18\x42\x3a\xa4\x21\x17\xc6\x41\x14\x87\x3c\x11\x73\x14\x89\x48\x9e\xa4\xa2\x88\x66\x79\x32\xa0\xe1\x1e\xa2\x80\xa1\xd9\x5d\x8f\x60\x87\x86\x53\x74\x10\xf4\x93\x1c\x73\xc6\x71\x9e\xed\x71\x88\x85\x6b\x35\x85\xb7\x66\x6d\x35\xf7\xce\x7b\xe5\xfb\x5a\xb5\x9d\x5d\xfd\x42\xeb\x68\x3d\x28\x6a\xc3\x09\xcc\x9b\xad\xd5\xeb\x79\xd6\xce\x01\x22\x6c\xf6\xd1\xf4\x91\x78\xb3\xf7\xc9\xb2\xa6\xbb\xe0\xdb\x0a\x05\x28\x92\xe2\x78\x92\xf8\xaf\xd1\x8f\xcf\x38\x7e\xec\x9a\xb1\x4f\x9d\x0e\x05\xc3\x7a\xe8\x86\xb2\xf9\xda\x2b\xdf\xe6\x38\x96\x06\xe0\xeb\xe0\x93\x29\x66\xf7\x00\x85\x31\x40\x10\x86\x14\x8a\x59\xc8\xb3\x21\x1b\x04\xfb\x98\xe0\x11\x15\x07\xfb\x2f\xa0\x5c\x97\x41\x56\x1d\x06\xd4\x0f\x9f\xdb\x8f\x0e\x7d\x45\xff\x01\xab\x5d\x53\x04\xeb\x1f\x44\x45\xb0\xfe\x49\x54\x04\xeb\xff\x47\x54\x04\xeb\xef\x44\x45\xb0\xfe\x2f\xd1\x7d\x8c\x3f\x0b\xff\xab\x4c\x4e\x56\xfe\x43\xf2\x87\xfb\x8f\x22\x83\xa8\xea\xd1\x8f\xef\x1a\x06\x34\xe2\x59\x10\x46\x21\x15\x85\x31\x15\x50\x31\x0f\x69\x14\x90\x14\x45\x40\xc4\xf1\x70\xf7\x0b\xed\x76\xc5\x21\x1d\x86\xe6\x2f\x1c\xff\x75\xf2\x31\xd5\x11\xf9\x51\xae\x2d\x2c\xea\x31\xfa\x80\x75\xf9\xcf\x13\x7c\x22\xf0\x38\x0c\x63\x40\x71\x30\x8e\x22\xc4\xd0\x80\x66\x49\x12\x46\x04\x0f\x28\x00\xe8\x3d\x43\x91\xb8\xf3\x32\xb2\x09\xdd\x65\xfd\x5b\x0f\x44\xff\xaa\xec\xd3\xba\x1b\x7e\xfc\xde\x6d\x75\xf5\x65\xe7\x11\x14\x59\x74\x20\xbe\x84\x43\xaa\x5a\xb5\x5c\x86\xf5\xc0\x05\x2f\x1d\x26\xae\x6f\x7c\x7e\x6e\xdf\x5d\xff\x63\x37\xfe\xd2\xdb\xff\x85\xe3\x9f\x79\x05\x4d\xf6\x5b\x5c\x78\xd0\x64\xf8\x44\xec\x9a\x2e\x9b\x82\x01\xfd\xfc\xbc\xf0\x72\x3a\x29\xf5\x7c\x12\x05\x41\x97\x04\x5b\x11\x36\xf3\xb9\xbe\x3d\x44\xb5\x03\xed\xdd\x1c\x79\x16\xcc\x45\xbe\x9a\x86\x70\xe6\x1d\x5f\x1c\x8f\xfd\xbd\xbd\xbf\xcf\x17\x46\xa4\x98\x58\x10\x67\x93\x4a\xe6\x92\xb1\xf1\xbb\xb4\xe1\x6c\x9e\xe8\x4e\x8b\xee\x89\xf4\xb8\xaa\x5e\x6a\xe1\x9b\x25\xb3\x1a\xa7\xef\x95\xb3\x91\x2c\x3c\xe3\x9f\x90\x20\xf2\x4a\xfe\xc4\x96\x2e\x55\x65\x79\x48\x5d\x5f\xc8\x05\x40\x6d\xc7\xb3\xc5\xde\x73\x55\xb7\x60\x66\xa8\x8f\x8c\xa7\xc5\x48\x8a\xb4\xc2\x54\x8b\x2a\x10\xc5\x56\xc0\xb8\xd7\x24\x35\x32\xf1\xe0\x64\x15\xe2\x3c\x6c\x42\x26\x83\xfe\x54\x25\x23\x37\x29\xf9\x9c\x87\x1e\x44\xd2\x4b\x77\x2f\xe6\x52\xbf\x3c\x5c\x21\xa1\x8a\xb8\x98\x1c\x1e\xea\x8d\x69\x6e\xb9\x9d\xdc\x8c\xf0\xb2\x07\xef\x81\x5e\x45\xcd\x92\xb9\x26\x1c\x73\x36\x86\x95\xbc\x4f\x52\xed\x99\x6c\x97\x16\xe7\x68\xc6\xa4\xe6\xd3\xfd\xee\x34\x78\x22\xd8\x09\x47\x03\x4a\xcd\x31\x4e\xa8\x0d\x4c\xd5\x93\xc5\xcd\xdf\xae\xd5\x5c\x4f\xe4\xab\x83\x8d\x5d\x02\xa5\x49\x47\xe1\x45\x9f\xc1\x6b\xaa\xa9\xe3\xc8\x3a\xca\xd5\xf7\xd6\xd6\x35\x94\x97\xe6\x90\xe7\x31\x2f\x53\x60\xde\x73\xd3\x02\x2a\xc5\x2f\xf3\x49\x16\x6c\x41\x14\xea\x93\x28\xd8\x92\xd0\xde\xbc\xeb\x33\xcd\xd1\xe2\xd9\xb8\x1e\x72\x1a\x46\x98\x7d\x26\x88\xee\x72\x4e\x6f\x31\xe9\xfa\xc8\x3f\xbb\xca\xcc\xc8\x50\x57\xbc\xb4\xc5\x17\x36\x95\x9a\x99\x31\x0c\xc3\x6a\x4d\x93\x2e\xde\x5c\xab\x5f\xdc\x42\x54\x5a\x09\x09\x33\x43\xe6\x54\xa1\x75\xfd\xd0\x1f\x99\x2c\xe3\x28\xb6\x9c\x58\x2f\xef\xc3\x55\x3c\x6e\xac\x64\xdf\xf8\xa0\x52\x0c\xff\x02\xb0\xaa\xec\x54\x5a\x30\x98\xe5\xa1\x6d\x65\x42\x3f\x86\x63\x05\xe5\x8c\xcb\x06\x19\x6b\x5e\x50\xa6\xc2\xd7\x7b\x8b\xa1\x8a\xdd\xc7\xf1\xc2\x76\x98\xdd\x4b\x6b\x9e\x38\x10\x7f\xcf\xd8\x8d\xd5\x5a\xeb\x38\xc9\x34\x57\xba\xb6\x74\x02\xf8\x6b\x66\xdf\x6f\xe1\xe9\xba\x29\x78\xdf\x5e\xa4\x38\x19\xf6\x0c\x21\x0c\x2a\xc6\x97\x7c\x99\x92\xf6\x17\x2e\xd1\xc6\x9b\x6a\x91\x53\xc7\x15\x6a\x91\xd9\xf3\xaa\x9a\xc9\xdc\x35\x0a\x16\x76\x06\xba\x98\xc8\x38\x6e\xc4\x9d\x9d\x2e\x73\xdc\x76\x54\x47\x5f\xda\x3d\x37\x3b\x59\x5a\x6f\x08\xa3\xf2\x53\xcf\x0c\x91\x02\xbc\x5b\x7e\x6e\x82\xab\x11\x21\xa9\x9f\x6c\x2e\x53\x63\x99\xaf\x82\x61\x3f\x57\xe6\x31\x81\xb6\xe8\x62\x94\x88\xe9\x6f\xeb\x2c\xf9\x42\xad\x89\x82\xf5\x90\x38\xc1\xe3\x5a\xe0\x22\x47\xed\x50\x4d\xd3\x6a\x12\x05\xfc\x39\xc1\xc4\xfe\x06\xdc\xd9\xd9\x9c\x65\xab\xb7\x68\xbe\x5f\xd2\x53\xbc\x85\x6c\x2d\x07\xec\xf0\x8c\xb8\x87\x05\x1e\xac\x1a\xb4\x3a\xe6\x76\xcb\x9b\x75\xaf\xd4\xb9\x4f\x05\xdb\xe1\xd2\xbe\x65\x8f\x29\x37\x28\xa5\xbb\x50\xdd\xd2\xd8\xd5\xd3\x67\xc2\x48\x3d\xcb\x24\x4f\x04\x8d\x3e\x3b\x8f\x44\xde\x60\xbc\x2f\xeb\xfd\xde\x6b\xde\x4d\x5e\x63\x1e\x6d\x25\xd4\x8c\x5c\xcd\xaa\x2e\x58\xea\x44\xd7\xcc\xa9\xdd\x32\xf7\xa7\x3d\x67\x5d\x93\xf0\x76\xc3\xc6\x21\xfa\xd6\x7b\x67\x20\x15\xef\x93\x28\x8e\x58\x50\x16\x82\x78\x3d\x25\xcd\xd1\x86\x30\x70\x56\x25\xa1\xbc\x5a\xb2\x6b\x91\xa8\x5f\xce\x25\xe7\x38\x62\xda\x24\x76\xe6\x96\xd9\xbb\x81\xa4\xd1\xb5\x37\x8b\x4f\x1a\xaf\x22\xa5\x49\x3c\x23\xc3\xd6\xe8\x99\x99\xd5\x76\xe4\xfc\xbc\xba\x66\x82\xe4\xf9\x6c\x42\x70\xd2\x56\x48\x2e\x3c\xba\x1a\x71\xf5\x53\xbd\x1e\x88\x2d\x79\xd9\x26\x8f\x3f\x85\xe9\xfd\xf4\x59\xd2\x2b\x69\x15\x5e\x3b\x25\x50\x29\x6c\xe4\xb8\xeb\xfb\x4d\xee\x27\x5b\x61\x2e\xb2\xc5\x59\xe4\xf8\xb8\xd9\xf3\x49\x7b\xa5\xfc\x26\xd4\x9a\xa0\x19\x6f\xed\xb8\x79\x66\x81\x78\x22\x2a\xfa\x73\x1f\xc7\x89\x4c\x1a\xf5\xb9\x7f\xb5\x61\x69\x46\xef\x79\x0d\x2f\x52\xca\xbe\x53\x41\xc1\x6b\x1c\x2b\xe9\x71\xa6\xfd\x23\x1b\x14\x05\x8c\x54\xdc\x6b\xc6\x23\xa1\x0a\x9a\xa6\x8e\x4a\x42\x56\x79\xe7\xe0\x0c\x65\xdf\x25\xd2\xbe\x9e\xcc\x39\xb2\x5b\xad\x55\xdd\x85\x83\x77\x97\xa2\xbd\xd7\xac\xe2\x2e\x2d\x3c\xfc\x39\x3a\x63\xe5\x33\xbf\x26\xce\xab\x88\xc7\x94\x71\x85\x5e\x3a\x32\xeb\xb0\xb4\x21\x61\x61\x67\x1e\xbf\xd6\x9d\x4b\x36\xf0\x0e\x24\xba\xcf\xaa\xd5\x72\x75\xd3\x70\xa5\xc4\x13\xd5\xb3\xd9\x1f\x1f\xd5\x46\xea\xb7\xc5\xe0\x96\x52\xa3\x3d\x9d\x7a\xc6\xa2\x61\xed\x4b\xce\x5a\x4f\x27\x61\x2f\xbd\xfb\x0d\xf8\xef\x2b\x4d\x49\x7a\x6e\x9e\xb5\x3c\x10\xee\x5b\xf7\x62\x5f\xe1\xd0\xba\x72\x03\xaa\x33\xc6\x7a\x93\xb3\x85\xc5\xf8\xe2\xf8\x54\xf0\x64\x79\xcf\x03\x57\x92\x6e\xd2\x20\xba\xaa\xae\xdc\x2f\x33\x09\x95\x35\x2b\x4f\x83\x16\x4d\xa0\xe7\xf6\x6d\x4e\xc4\x7e\x2e\x04\x86\x74\x14\x33\x1e\x46\x58\xd3\x11\xcc\xd0\x62\xe9\x7d\x92\x41\xcc\x1c\x1f\xfa\xf4\xbc\xf8\x82\xd1\x14\x04\xed\x71\x8a\x15\x4a\xf7\xcc\xd6\xc5\x44\xca\xee\xfa\xa5\xaf\xf6\x4f\x06\x69\x8f\x1b\x0d\x8f\x16\x63\xda\xdc\x95\x7d\x90\xc0\xb7\xb4\x93\x3e\xb9\xfd\xd9\x1d\x8a\xed\x36\x54\xe8\xac\xdc\xda\xc7\xcb\x6f\x1f\x0d\x7f\x81\x43\x63\x6c\x66\x31\xda\x17\x6d\x73\x6e\x44\xa4\x54\x49\x54\x59\x01\xd9\x7b\x49\x14\x71\x82\xe3\xad\xc0\xd4\x32\x7f\x14\xe5\x8b\x40\xa5\x20\x06\xc1\xa3\xb7\xc7\xb0\xb8\xc6\xae\x86\x01\xfb\x88\x53\x6d\xb7\x9a\xa7\xfb\xd3\xc4\x4a\x4e\xae\xa4\x21\x6f\x72\x57\x23\xb4\x13\x83\x83\x85\xf7\x1f\x8f\xe2\xbe\x86\xa7\x69\xdb\x1f\x39\xb3\x18\x4e\xcb\xab\xc3\x77\xb0\x8a\xfe\x18\x33\x30\xaa\x7e\x1f\x33\xfd\x10\x0c\x19\xdc\xed\xfe\xfe\xfe\xed\x28\x83\xe5\xda\x05\x59\x8f\x0e\x14\x00\xe0\x3f\x01\x00\x00\xff\xff\x88\xf8\xd1\xbf\x27\x0a\x00\x00") +var _configAppTestIni = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x56\x57\xaf\xa3\x3a\xb4\x7e\xcf\x5f\x41\xda\x98\x6e\x8e\x94\x07\x7a\x2a\x09\x49\x48\x42\x46\xa3\x11\xd8\xa6\x84\xde\xcb\xaf\xbf\xda\x7b\xcf\xb9\x67\xe6\x3e\xdd\x37\xdb\x7c\xf0\x95\xe5\xa5\x05\x26\x41\x1f\xad\xbb\xa6\x27\xab\xd5\x8f\x7c\x6e\xeb\xec\xe7\x0a\x07\x71\xd9\x76\x6b\x86\x61\x3f\x18\x96\xff\x60\x01\xf8\x60\x81\xb8\xc2\x41\x55\x36\xdd\x9a\xe3\xbe\xd6\x7d\x4b\x9a\x35\x0e\x7e\x35\x04\x95\x65\xfa\xab\xed\x2b\xd2\x7c\x42\xfc\xb6\x1d\xcb\x06\xaf\x5b\xdc\x1b\x81\x7c\xbc\x5d\x93\x3a\x1e\xc9\xd3\xaa\x26\x1f\xac\x70\x50\xf8\x39\xf9\xef\xb5\x55\xd5\x90\x30\x99\xd6\xbf\x3f\x92\x25\x03\xf9\xb5\xca\xfd\x69\x8b\x33\xb2\x66\xc0\xe7\xf2\x54\x91\x62\x2d\x80\xd5\xea\x47\x47\x0a\x44\x8a\xee\xe7\xaa\xc5\xa9\x52\x55\x5b\xbc\x66\x78\x00\x78\x4e\x10\x44\x71\x95\x60\x52\x74\x49\x98\x90\x66\xed\xe3\x3c\x29\x56\x64\xaa\x92\x86\xac\x45\x00\x56\x29\x99\xd7\x82\x8c\x05\xc0\xfa\x3c\xe1\x81\x0f\x05\x4e\xe2\x25\x01\xf9\x88\x0b\x11\xe2\x03\x1e\xc1\x20\xf4\x71\x18\xc8\x4c\x08\x39\x96\xb0\x32\xcb\x61\xcc\x8b\x32\xeb\xf3\x48\x42\xc4\x17\x78\x71\xd5\x12\xd4\x90\x6e\x8b\xd7\xca\x7e\xab\x87\xf0\xb0\x19\x47\xa7\xef\x42\xe5\x5c\x0c\xc1\xa5\x9a\x6b\xcb\xbd\xca\x5e\xfe\x3e\x17\x75\xe3\x14\xbf\xd1\x7b\x32\xaf\x0d\xb3\x82\x8a\xf0\x16\x4b\xf3\xbc\x1b\xad\x9d\x4f\x18\x47\xbc\x57\x2d\x56\x2f\x8e\x14\x4d\x73\xbc\xf2\xbf\xad\x70\x80\x63\x39\x28\xb3\xcc\xff\x1a\xfd\xf8\x8c\xe3\xe7\xaa\xea\xdb\xf8\xd6\x10\xbf\x9b\xd7\x4d\x97\x57\x5f\x7b\xe3\xdb\x1c\x14\x79\x00\xbe\x0e\x3e\x99\x42\x51\x02\x24\x08\x01\x41\x28\xe0\x48\x28\x22\x59\x0c\x44\xdf\x97\x42\x46\x26\x5c\xe8\x4b\x5f\x40\xbd\xcc\xfd\xa4\x58\x77\xa4\xed\x3e\xb7\x1f\x0d\xf9\x8a\xfe\x03\x15\xab\x2a\xf3\xe7\xbf\x88\x32\x7f\xfe\x9b\x28\xf3\xe7\xff\x1f\x51\xe6\xcf\x7f\x12\x65\xfe\xfc\x7f\x89\xae\x7d\xf8\x59\xf8\xdf\x65\xba\x25\xf9\xbf\x24\x7f\xb9\xff\xc8\x12\x44\x8a\x96\xfc\xfc\xae\xa1\xcf\x13\x59\x04\x01\x0e\x38\x1c\x84\x9c\xcf\x85\x32\xe2\x89\xcf\x72\x1c\x83\x08\x94\xd1\xea\x37\xda\x6d\xb2\x75\xdc\x75\xd5\x3f\x34\xfd\xfb\xe4\x63\x28\x31\xfb\x91\xcf\x35\xca\xca\x1e\x7f\xa0\x32\xff\xf7\x09\x3d\x30\x74\x18\x04\x21\xe0\x20\x0a\x31\x26\x02\x0f\x78\x91\x65\x11\x66\x64\xc0\x01\xc0\x4b\x02\xc7\xd2\xb7\xe7\x21\x19\xc8\x55\xdf\x7f\xeb\x41\xe4\x3f\x95\x6d\x5c\x36\xdd\xcf\x3f\x6f\x5b\x59\x7c\xd9\xb9\xfb\x59\x82\xd7\xcc\x97\x70\xc4\x15\xb3\x95\xea\xa8\xec\xa0\xff\xdc\xa3\xc8\x7d\x1d\x3e\xdb\xcd\xcf\x92\xb9\x2f\x7e\x7e\xde\x00\xad\xc4\x64\xcd\x40\x0e\x84\xb2\xc0\x89\x02\x0a\x78\x89\x87\x50\x14\x25\xe4\x33\x24\x94\x7d\x5f\x0e\x45\xbc\x5a\xfd\xf8\x6e\x94\x9f\xab\xfe\xb7\xc5\xf6\x1f\x9a\xfe\x8c\xd8\xaf\x92\x3f\x12\xa6\xfd\x2a\xa1\x07\x66\x55\x35\xc9\xe0\x77\xe4\xd7\xa7\x86\xe3\x76\x6b\x94\xe3\x56\x55\x94\xbd\xa6\x38\x86\xb2\xd8\x8f\xf9\xed\x11\xae\xee\x78\xef\x72\xd3\x47\xc5\x9e\xf4\xb3\x7d\x50\x76\xf2\xed\xa5\xf6\x9b\xf6\x5a\x5f\xdf\xbb\xa3\xa0\x72\x42\xa8\xa8\xa3\xcd\x45\x63\x2e\x38\xf4\x55\x5b\x68\x31\x8d\xf6\xb7\x9a\x5c\x23\xed\x7e\x36\xbd\xf8\x44\x2f\x27\x5d\xb4\xe0\x5e\x32\x76\x87\x68\x92\x85\xd7\x96\x28\xaa\x6c\xa4\x0f\x6a\x6a\x62\x53\xd7\xbb\xd8\x7d\x29\xa9\x02\xb8\x65\xb3\x3b\x89\xd7\xd4\xdc\x9f\x50\x72\x30\xef\x89\xcc\xab\x58\xc3\x56\x66\x9b\x59\xe1\xab\x6a\xad\x50\xf0\x39\x68\x95\xce\xdc\xa1\x6e\x22\x5a\x46\x55\x20\x24\xe8\x35\x14\x51\x0f\x07\x23\x1d\xd3\xc0\x43\x44\x7b\xee\xdd\xa3\x3d\x95\x4f\x8f\x36\x58\x64\x12\x18\xb2\xdd\xdd\xbc\x08\xd5\x25\x75\xa2\xcb\x21\x38\x4a\xe0\xdd\xf1\xb3\x6a\x9d\x74\x58\x05\x7d\x2a\x86\xa8\xd0\xa5\x28\xb6\x1e\xd1\x72\xac\x69\xc8\x0b\x36\x37\x6e\xaf\xd7\x5b\x45\x47\x8a\x13\x41\x1e\x70\x66\x4a\x41\xa5\x3c\x50\xe6\x3e\x9a\xdc\xf4\xed\x9e\xaa\xf3\x96\x7d\x36\xa8\x72\x72\x60\x54\x71\xaf\x3c\xf9\x1d\x78\x0e\x25\xb7\xe9\xc5\x9b\x71\x7e\x79\x73\xed\x1e\x8c\xa7\x75\x63\x77\x7d\x9a\xc7\xc0\xbe\xa6\xf6\x09\x98\x9c\x3c\x8d\x5b\x5d\x71\x14\x55\x29\xb7\xaa\xe2\x68\x4a\x7d\xf1\xce\x8f\x38\x25\x93\xe7\xd0\xfb\x00\x5a\x14\x63\xb7\x89\xa2\xba\xd3\x2e\xbe\x84\xac\xfb\x22\xaf\x9d\x6b\x8c\x82\x8e\xf6\x86\x17\xd7\xf4\x24\xc6\x5a\x35\x0a\x87\xc3\xe1\x54\xdb\x36\x9f\xbd\x61\xbd\x3f\xba\x99\x6a\xd4\x1a\x51\x46\x81\x4d\xb9\xcc\x6a\xda\xae\xdd\x08\x49\x02\x39\x31\x1f\x44\x2f\x6d\x83\x59\xdd\x2c\xa2\xe6\x5c\x64\xbf\x30\x0e\xaf\x23\xa0\x8a\xbc\x31\x79\xe5\x20\x4c\x77\x6b\xc9\x23\xfe\xde\x6d\x0a\xa4\x27\x30\xe9\x74\xaa\x7a\x22\x9d\x0b\x9e\xef\x25\x44\x26\x75\xed\xfb\xa3\xd8\x50\x4e\xab\xcd\x69\x74\x43\xf4\x7b\xa4\x2e\xa2\x55\x9f\x36\x83\xce\xc3\xdc\x75\xb4\x2d\xa0\x9f\xa3\xf8\x7e\x2b\x0f\xd7\x8d\xc1\xfb\xf2\x64\xd5\xe1\xe0\x8c\x08\x21\xbf\x10\x5e\xda\x4b\xe7\x34\xe9\x08\x23\xab\xbf\x98\x27\x76\x68\x60\x66\x66\x89\x33\xce\xa6\x1d\x8d\x4d\x65\x50\x41\x73\x20\x47\x9b\x1c\x36\x0b\x73\x15\x87\xe3\x18\xd6\x0d\xd7\xf0\xc7\x5a\x82\xe3\x2d\x89\xcb\x85\x50\x5c\xba\x6d\x85\x0e\x1b\xc0\xbb\xa4\xbb\xca\x3f\x1f\x30\xd1\xda\xc1\x81\x89\x19\xea\x72\xe1\x77\xd2\x58\xd8\x9b\x08\x39\xaa\x4b\x71\x2a\xb5\x7f\x9f\x76\xda\x4b\x29\x2d\x55\x39\xdd\x35\xa8\x78\xb0\x06\x2e\xb9\x99\x0d\x29\x79\xde\x8c\xb0\x2f\xef\x22\x4a\x6d\x2f\xc0\x1d\x6f\xcb\x6d\x5a\xca\x05\x8f\xd7\x63\xbc\x0d\x97\x40\x2c\x75\x5f\xec\x1e\x18\xde\x4f\xe0\x2e\x9a\x7e\xbd\xa7\xdc\x66\x7a\x8b\xee\x99\xdb\xb5\xb1\xe2\xdc\x60\xdc\xd6\xe2\x26\x86\x9d\x91\xbb\x13\xd7\x4c\x95\x53\x3c\x5e\x42\x80\xcd\x9d\xce\xca\x8c\x5f\xed\xc7\xdb\x3d\xd2\x17\x14\x4a\x79\x29\x49\x5e\xf5\xae\xd2\x92\xf2\xf8\x53\xc4\x8d\xc4\xb5\x4e\xc5\x91\x8a\x6f\xf8\x9c\xdc\x4a\x37\x4f\x5f\x83\x04\x4f\xe7\x28\xb8\x5c\xa8\xbe\xc3\xdf\x7a\xaf\x02\xe2\x42\x29\xc2\x21\x16\x41\x9e\x29\xea\x79\x1b\x55\x1b\x07\x21\xff\x36\x1b\x11\xe7\x95\x9a\x53\xaa\x4c\xf9\xbc\x1d\x53\x08\x99\x61\xd1\xc4\x11\x4e\xa3\x77\x01\x51\xb5\xb7\xde\x22\x3d\x58\xb2\x49\x8c\x2a\xf2\x0e\x09\x35\xe3\x47\x62\x17\xcb\x06\xbe\xd2\xe2\x9c\x28\x9a\xf7\x12\x23\x06\x6a\x4b\xa6\xb9\x68\xe3\x5a\xcc\xf9\x15\xef\xcb\x8e\x59\xa2\xa7\x63\xcb\xf4\x43\x19\xde\x8f\x97\xc8\x7a\x39\x6f\xa2\x73\x63\xf8\x26\x47\xf5\x10\x9e\xdf\x6f\x56\x1a\x1c\x43\x38\xea\x27\x78\x62\xfb\xfb\xc5\x19\xb7\xd6\x33\x96\x17\xa5\xb4\x14\xeb\xf0\xb6\x36\x8b\x67\x67\x44\x66\x70\xd6\xee\xda\x30\x8c\x74\xf6\x50\xee\xda\x67\x1d\xe4\x36\x7e\x8f\x73\x70\xd4\x62\xf1\x1d\x2b\x06\x5d\xd2\x54\xce\xf7\x23\xff\xda\x88\x7e\x96\x21\x6c\xd2\x5e\xd5\x6f\x18\x53\xb1\x2c\xb3\x37\x22\xb6\x48\x9b\x1b\x2d\x70\xce\x55\x63\x9d\xf3\xd6\x1e\xb1\x53\x5b\xb5\xe9\x4e\x10\x5d\x5d\x8e\xf7\x9e\xa3\x49\xbb\xbc\x72\x7f\x8d\x78\x47\xe5\x8f\xf4\x1c\xdd\x9e\x59\xd8\xc7\x82\xab\xb4\xda\x46\x98\xbb\xa9\x0e\x98\x13\xb5\x93\xe9\x73\xd9\xb8\x6c\x85\xae\x40\xe3\xdb\xa4\x98\x4f\xee\xde\x3e\xb8\x5a\xe4\xa9\xe6\xce\x6e\x37\xf7\x62\x61\xf7\x97\xe9\x00\xa7\xdc\xe2\xbd\x3d\xf7\x08\xd5\xc3\x49\xca\xe1\x69\xde\x6e\x15\x49\x7b\xb7\x0b\x78\xbd\xcf\x3c\xa7\xed\x53\x7b\x67\xa5\xbe\x72\x5d\x9a\xa7\xf8\x0c\xba\xda\xd5\x2b\x50\xec\x28\xd1\x1b\x6e\x4b\x90\xf5\x4f\x28\xc7\x8a\xa7\xeb\x92\x0c\x5c\x4d\xbb\x68\x9d\xea\x9a\x7b\xe3\x7a\x1c\x59\x64\xcc\x49\xbe\xed\x2c\x3c\x80\x16\x4a\x75\xca\x84\xaf\x54\xf1\x0f\xda\x46\x4d\x64\x84\xa9\xaa\x61\x84\xae\xa6\xe2\xeb\xa0\x83\x50\xd8\xdc\xf7\xc3\xe3\xf8\x52\x0e\x55\xc6\xf0\x1e\x34\x4e\x81\x76\x4d\x9c\xbd\x1a\x69\xc9\x75\x7f\x6c\x0b\xe9\x21\x10\xeb\x7e\xe1\xd1\xe6\x24\xd8\x0e\x3c\x8b\x77\x16\xbc\x4e\xd6\x76\x3f\xb8\xed\xce\xed\xb2\xe5\xd2\x15\x64\x67\x5c\xea\xfb\xf3\x55\xdf\x2b\xf9\x88\xba\xea\xb0\xd8\x59\xef\x1c\xad\xe5\x76\x61\xb0\x51\x44\xb8\x38\xf9\x6c\xeb\x45\x18\x43\xe5\xe6\xcd\xc0\xb6\x92\x57\xaf\xea\x47\x85\x8b\x41\x08\xfc\x7b\xeb\xf4\x41\x76\x0e\x5d\x8b\x02\xce\x86\xe6\xea\x66\xb6\xb7\xd7\x87\x4d\xe5\x50\x2f\xb4\x2e\xad\x52\xd7\x62\xac\xad\x40\x83\x49\x7e\xdd\xef\xd9\x75\x0e\xb6\xc3\x22\x6d\xa0\x9d\x75\xdb\xe9\xd9\xd0\x2b\x54\xe0\xbf\xc6\x0c\xc2\xc5\x9f\x63\xa6\xed\xfc\x2e\x41\xab\xd5\x8f\xef\x3f\x95\xdc\x9f\xce\x8d\x9f\xb4\x64\xcd\x01\x00\xfe\x27\x00\x00\xff\xff\x51\x62\xb7\x52\x5a\x0a\x00\x00") func configAppTestIniBytes() ([]byte, error) { return bindataRead( @@ -134,7 +134,7 @@ func configAppTestIni() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "config/app.test.ini", size: 2599, mode: os.FileMode(420), modTime: time.Unix(1603700294, 0)} + info := bindataFileInfo{name: "config/app.test.ini", size: 2650, mode: os.FileMode(420), modTime: time.Unix(1603761184, 0)} a := &asset{bytes: bytes, info: info} return a, nil } diff --git a/app/lib/db/redis.go b/app/lib/db/redis.go new file mode 100755 index 0000000..7df9c84 --- /dev/null +++ b/app/lib/db/redis.go @@ -0,0 +1,52 @@ +package db + +import ( + "github.com/go-redis/redis" + "live/app/lib/config" + "time" +) + +type RedisConfig struct { + Name string `toml:"name"` + Proto string `toml:"proto"` + Addr string `toml:"addr"` + Idle int `toml:"idle"` + Active int `toml:"active"` + DialTimeout int `toml:"dialTimeout"` + ReadTimeout int `toml:"readTimeout"` + WriteTimeout int `toml:"writeTimeout"` + IdleTimeout int `toml:"idleTimeout"` +} + +var ( + Redis *redis.Client +) + +func init() { + addr := config.Config.Section("redis").Key("addr").String() + password := config.Config.Section("redis").Key("password").String() + + c := &RedisConfig{ + Name: "recook.redis", + Addr: addr, + Idle: 10, + Active: 10, + DialTimeout: 1, + ReadTimeout: 1, + WriteTimeout: 1, + IdleTimeout: 10, + } + + Redis = redis.NewClient(&redis.Options{ + Addr: c.Addr, + Password: password, + DB: 0, // use default DB + ReadTimeout: time.Duration(c.ReadTimeout) * time.Second, + WriteTimeout: time.Duration(c.WriteTimeout) * time.Second, + }) + + _, err := Redis.Ping().Result() + if err != nil { + panic(err) + } +} diff --git a/app/lib/page.go b/app/lib/page.go index ba13ed1..fbf36be 100644 --- a/app/lib/page.go +++ b/app/lib/page.go @@ -15,7 +15,7 @@ func (p *Page) GetPage() int { } func (p *Page) GetLimit() int { - if p.Limit >= config.Config.Section("page").Key("minLimit").MustInt(1) || p.Limit < config.Config.Section("page").Key("maxLimit").MustInt(100) { + if p.Limit >= config.Config.Section("page").Key("minLimit").MustInt(1) && p.Limit < config.Config.Section("page").Key("maxLimit").MustInt(100) { return p.Limit } return config.Config.Section("page").Key("defaultLimit").MustInt(15) diff --git a/app/lib/recook/user.go b/app/lib/recook/user.go index cf93dca..4785c0b 100644 --- a/app/lib/recook/user.go +++ b/app/lib/recook/user.go @@ -35,9 +35,10 @@ func (u *user) GetUserId(id uint, token string) uint { } type ReplyUserItem struct { - UserId uint `json:"userId" mapstructure:"id"` - Nickname string `json:"nickname" mapstructure:"nickname"` - HeadImgUrl string `json:"headImgUrl" mapstructure:"headImgUrl"` + UserId uint `json:"userId" mapstructure:"id"` + Nickname string `json:"nickname" mapstructure:"nickname"` + HeadImgUrl string `json:"headImgUrl" mapstructure:"headImgUrl"` + InvitationNo string `json:"invitationNo" mapstructure:"invitationNo"` } // @Title 批量获取会员基础信息 diff --git a/app/lib/tencent/im.go b/app/lib/tencent/im.go index ea78b00..9652829 100644 --- a/app/lib/tencent/im.go +++ b/app/lib/tencent/im.go @@ -21,6 +21,7 @@ const ( action_useradd = "v4/im_open_login_svc/account_import" // 会员添加 action_userprofile = "v4/profile/portrait_set" // 会员资料信息修改 action_groupadd = "v4/group_open_http_svc/create_group" // 群组添加 + action_groupdel = "v4/group_open_http_svc/destroy_group" // 群组解散 action_groupmessage = "v4/group_open_http_svc/send_group_system_notification" // 群组系统消息 ) @@ -110,6 +111,20 @@ func (i *im) AddLiveGroup(userId, name, groupId string) error { return i.Exec(action_groupadd, string(jsonData)) } +// @Title 解散直播群 +// @Param userId string true "im会员id" +// @Param name string true "直播群名称" +// @Param groupId string true "直播群id" +func (i *im) DelLiveGroup(groupId string) error { + jsonData, err := json.Marshal(map[string]string{ + "GroupId": groupId, + }) + if err != nil { + return err + } + return i.Exec(action_groupdel, string(jsonData)) +} + // @Title 直播群发送消息 // @Param groupId string true "直播群id" // @Param message string true "消息内容" diff --git a/app/lib/tencent/short.go b/app/lib/tencent/short.go index fbaf1ff..a0f9f20 100644 --- a/app/lib/tencent/short.go +++ b/app/lib/tencent/short.go @@ -48,7 +48,7 @@ func (s *short) Sign() string { random := Worker.Rander() randomStr := strconv.FormatUint(uint64(random), 10) - original := "secretId=" + s.secretId + "¤tTimeStamp=" + timestampStr + "&expireTime=" + expireTimeStr + "&random=" + randomStr + original := "secretId=" + s.secretId + "¤tTimeStamp=" + timestampStr + "&expireTime=" + expireTimeStr + "&random=" + randomStr + "&procedure=recook" // 单次有效 if s.oneTimeValid { original += "&oneTimeValid=1" diff --git a/app/logic/goods/goods.go b/app/logic/goods/goods.go index ff21e86..24dfa03 100644 --- a/app/logic/goods/goods.go +++ b/app/logic/goods/goods.go @@ -1,8 +1,13 @@ package goods import ( + "encoding/json" + "live/app/constant" "live/app/lib" + "live/app/lib/db" "live/app/lib/recook" + "live/app/model/promotion" + "time" ) type Goods struct { @@ -28,3 +33,50 @@ func (g *Goods) GoodsListByBrandId(brandId uint, page lib.Page) *recook.GoodsLis list, _ := recook.Goods.GetListByBrandId(brandId, page.GetPage(), page.GetLimit()) return list } + +// @Title 指定品牌商品列表 +func (g *Goods) HotGoods(page lib.Page) (result []recook.GoodsInfo, dataLen int) { + data := db.Redis.Get(constant.RedisKeyPromotionGoodsList).Val() + promotionGoods := []promotion.PromotionGoods{} + json.Unmarshal([]byte(data), &promotionGoods) + day := time.Now().Format("2006-01-02") + if len(promotionGoods) == 0 || promotionGoods[0].PromotionStartDate.Time.Format("2006-01-02") != day { + promotionGoodsModel := &promotion.PromotionGoods{} + lists := promotionGoodsModel.GetDayAll() + data := []promotion.PromotionGoods{} + index := 0 + lastId := uint(0) + for _, list := range lists { + if lastId != list.PromotionTimeItemId { + index = 1 + lastId = list.PromotionTimeItemId + } + if index > 5 { + continue + } + data = append(data, list) + index++ + } + dataStr, _ := json.Marshal(data) + db.Redis.Set(constant.RedisKeyPromotionGoodsList, string(dataStr), time.Hour*24) + promotionGoods = data + } + dataLen = len(promotionGoods) + start := page.GetStart() + if dataLen >= start { + end := page.GetLimit() + start + if end > dataLen { + end = dataLen + } + goodsIds := []uint{} + for _, goods := range promotionGoods[start:end] { + goodsIds = append(goodsIds, goods.GoodsId) + } + ids, err := recook.Goods.GetListByIds(goodsIds) + if err != nil { + return + } + result = *ids + } + return +} diff --git a/app/logic/live/live.go b/app/logic/live/live.go index e982abc..3773c8f 100644 --- a/app/logic/live/live.go +++ b/app/logic/live/live.go @@ -57,6 +57,13 @@ func (l live) Start(userId uint, title, cover string, topic uint, goodsIds []uin GroupId: groupId, } liveModel.Create(&liveRoom) + } else { + err, info := ImLogic.LoginUserInfo(userId) + if err != nil { + return LiveInfo{}, err + } + if err = tencent.Im.AddLiveGroup(info.Identifier, "直播群", liveRoom.GroupId); err != nil { + } } userAllFins := (&user.UserFollow{}).GetCountAll(userId) liveItemModel := &live2.LiveItem{} @@ -145,6 +152,13 @@ func (l *live) Stop(userId, liveItemId uint) error { liveDataModel := &live2.LiveData{} liveData := liveDataModel.GetByLiveItemId(liveItemId) + // 解散直播群 + liveRoom := live2.LiveRoom{} + userLiveRoom := liveRoom.GetLiveById(liveItem.RoomId) + if err := tencent.Im.DelLiveGroup(userLiveRoom.GroupId); err != nil { + log.Println(err) + } + return liveItemModel.Transaction(func(tx *gorm.DB) error { // 完成直播 liveItemModel.SetDb(tx) diff --git a/app/logic/topic/topic.go b/app/logic/topic/topic.go index da5df29..6a1b457 100644 --- a/app/logic/topic/topic.go +++ b/app/logic/topic/topic.go @@ -1,7 +1,9 @@ package topic import ( + "errors" "live/app/lib" + "live/app/lib/aliyun" "live/app/lib/config" "live/app/model/topic" ) @@ -24,6 +26,30 @@ func (t *Topic) List(keyword string, page lib.Page) (result *[]topic.Topic, coun return } +// @Title 添加话题 +func (t *Topic) Add(title string) error { + topicModel := &topic.Topic{} + topicInfo := topicModel.GetByTitle(title) + if topicInfo.Id >= 0 { + return nil + } + text, err := aliyun.Text.CheckText(title) + if err != nil { + return err + } + if len(text.Politics) > 0 || len(text.Contraband) > 0 || len(text.Salacity) > 0 || len(text.Abuse) > 0 { + return errors.New("包含敏感词汇") + } + data := topic.Topic{ + Title: title, + } + topicModel.Create(&data) + if data.Id <= 0 { + return errors.New("网络异常") + } + return nil +} + // @Title 获取热门话题 func (t *Topic) Hot() []topic.Topic { topicModel := &topic.Topic{} diff --git a/app/model/promotion/promotionGoods.go b/app/model/promotion/promotionGoods.go new file mode 100644 index 0000000..28d043e --- /dev/null +++ b/app/model/promotion/promotionGoods.go @@ -0,0 +1,28 @@ +package promotion + +import ( + "github.com/golangkit/formatime" + "live/app/lib/db" + "time" +) + +type PromotionGoods struct { + db.BaseModel + Id uint `gorm:"column:id" json:"id"` + PromotionTimeItemId uint `gorm:"column:promotion_time_item_id" json:"promotionTimeItemId"` + GoodsId uint `gorm:"column:goods_id" json:"goodsId"` + PromotionStartDate formatime.Date `gorm:"column:promotion_start_date" json:"promotionStartDate"` + Order uint `gorm:"column:order" json:"order"` +} + +func (p *PromotionGoods) TableName() string { + return "recook_promotion_goods" +} + +// @Title 获取当日所有数据 +func (p *PromotionGoods) GetDayAll() (result []PromotionGoods) { + day := time.Now().Format("2006-01-02") + day = "2020-09-19" + p.GetDb().Model(p).Where("promotion_start_date = ?", day).Order("promotion_time_item_id,`order`").Find(&result) + return +} diff --git a/app/model/topic/topic.go b/app/model/topic/topic.go index 1a9251e..716fed8 100644 --- a/app/model/topic/topic.go +++ b/app/model/topic/topic.go @@ -80,3 +80,12 @@ func (t *Topic) AddPartake(topicId uint) int64 { } return t.GetDb().Model(t).Where(Topic{Id: topicId}).Update("partake", gorm.Expr("partake + ?", 1)).RowsAffected } + +// @Title 获取话题 +func (t *Topic) GetByTitle(title string) (result Topic) { + if title == "" { + return + } + t.GetDb().Model(t).Where("title = ?", title).First(&result) + return +} diff --git a/app/router/router.go b/app/router/router.go index d20ca82..69719fd 100644 --- a/app/router/router.go +++ b/app/router/router.go @@ -41,6 +41,7 @@ func Router(router *gin.Engine) { goodsR.POST("list", goodsC.List) // 商品列表 goodsR.POST("brandlist", goodsC.BrandList) // 品牌列表 goodsR.POST("brandgoodslist", goodsC.BrandGoodsList) // 品牌商品列表 + goodsR.POST("hot", goodsC.Hot) // 热门商品列表 } // 会员 userR := liveRouter.Group("/user") @@ -88,8 +89,9 @@ func Router(router *gin.Engine) { topicR := liveRouter.Group("/topic") { topicC := &topic.Topic{} - topicR.POST("list", topicC.List) // 话题列表 - topicR.POST("hot", topicC.Hot) // 热门话题 + topicR.POST("list", topicC.List) // 话题列表 + topicR.POST("add", auth, topicC.Add) // 话题列表 + topicR.POST("hot", topicC.Hot) // 热门话题 topicR.POST("info", bothAuth, topicC.Info) // 话题基础信息 topicR.POST("content/list", bothAuth, topicC.ContentList) // 话题内容列表 diff --git a/app/task/live.go b/app/task/live.go index e2672e7..685b019 100644 --- a/app/task/live.go +++ b/app/task/live.go @@ -29,13 +29,13 @@ func (live *Live) Run() { request1 := vod.NewConfirmEventsRequest() for { response, err := client.PullEvents(request) - if _, ok := err.(*errors.TencentCloudSDKError); ok { - log.Println("回调错误,err:", err) - continue - } - if err != nil { - log.Println("回调错误,err:", err) - continue + if sdkErr, ok := err.(*errors.TencentCloudSDKError); ok { + if sdkErr.GetCode() == "ResourceNotFound" { + continue + } else { + log.Println("回调错误,err:", err) + continue + } } handle := []string{} for _, event := range response.Response.EventSet { diff --git a/config/app.prod.ini b/config/app.prod.ini index 783c7c9..8ba81e2 100644 --- a/config/app.prod.ini +++ b/config/app.prod.ini @@ -37,6 +37,9 @@ expire=600 oneTimeValid=1 key=c3nyGkDcot8aXKcgUZLe +[aliyun] +appCode=1830f95365cb47488667ca1ef9aa9f6d + [recook] url=https://api.reecook.cn/api/v1 private_key=MIIEowIBAAKCAQEAzNWyjYe3qt4YRTDwANxDPNLAJ9TZBuHsSqSjJM5B35fABwN3gwm5Q/SCz/6kgKTqeSgCVPFYhO/zOD6G8K7EJLgx95ZIeAB9EkW+xrhFDDthUZAkA03zHJO6SkFKOciLFVi94BdCdGlNFlnaBBqA+8XvCpD1V8DFc/9cpb5icZvngu8vEkwkbYceCXKUMNxoXY/E2cFe8f2tVFR5pRkQgRLbM70jt4yBGOD8pbuk6fcnD7ghGWgzMq/845N3wISSTp/gAQg8403Fk+8AoL+FKgxUkjUOpPI2XrcpQm0EphuAX4J0Xvo3Hu6TEPZYyqULEXGT2Jukmh0NSkNO0F39xwIDAQABAoIBAQCAqRYPWhkexYQ/Kb8G+1NsiABUxJhRf2UZeZJUEw5DcKEYhq/x6hCpw5LLLOqNN4lj8qKMUlBEqCeAw52k3lGrstsH5ii836mv6YksbyBHz6CQR9anELZM0+nmrF4AL5xVGzmg4VtHncDi8itD+pXcD3bXjzfcF+SuuM6r+QsCykgTc/jw+R6GqOHvD48mUQCI0/Xw6jjAWUUh0jRX2BvLQwcccan5ZCZD3C7M8gGuRFO2vr8lFliQwyFNgwrpE+brLeMNeLHz1S6vMwfqr3r4Mq78wTihoze+3kIs5tdE0YRkJpaPLdeCsvQ8iFfD9nat7wnNHgcQBU+3B+KjOJCZAoGBAOVC8AY8q0UeTFreo44Fgda9Jg+BsR0UwTzTxzozdwSMhIfzb6oDa6tWd8VO0V6FaqK+Urxj6UP3JshAQT8hsq6Hh8tEmUx3rxpQnWZ5bdFJD291apKwTVgDzcf7mo77Ypjpko+Y4Og3weUGOnM+hTdPiToUmkZv78OPgbRR+utdAoGBAOS5c3f7gdfd60mlABPIgpHQccaTyEg3YoCQoB1oXTMk881vzC6w8xwYR0gpKGj6/vG9FeEpgYLi+ydWiNnzH8ZknPiACYZ6g18CzlCUcHUG1PZhKot1zgXQN9/WAvjWZ62Ym4FcPrEaF3+u88Pjj27vQE5MDO8O2uVRQwIGXh9zAoGAGLjGHzYNle91dlsJsffgD2LoJsXqbmNdjwybMCh6jhAE/o/+m4uw4ZH6allcdF/YpuH1FAGGFuEg2nkrT/53QSC2QPINwdQqGqFUx8cSU34YXwF/U4AVZwdJ+mWkPgTXlfuh5UAsCH5ytxqb1O+J9/PorU2pcS0C4sinyOUKNLUCgYBFJNsHVnz2KRxL8xmG4YK3WfBLO7m8OyIIA7Cjsz0ZjP43CKkNJGkaASzrX6XbtqUDp0nJ+6YvTzbluX89hAYDD790UCCRCtBUFKESMw2cEyimItGdv0s87qk1fZkAaLCHBi9cd+pr15tq+hSvD0f5HVKvWMZALpl14Y8EObCSiQKBgCiSKMsn7W5eGVR4cHO5NQ8P6V20ZOGIKvUsJUtlzRtneJERqVXZqVp9MctpLzNluQMGzTR1dEngdnOa2sYgdd8ATYy0NGiZuBDMA3h0f0aVsQublPfUG+0QH/3qryNISWN+m8DnCtkpkUG1GI5/0x9ZVVlSybIvz7H8NltIxXr/ diff --git a/config/app.test.ini b/config/app.test.ini index 6e5d692..f98cdda 100644 --- a/config/app.test.ini +++ b/config/app.test.ini @@ -37,6 +37,9 @@ expire=600 oneTimeValid=1 key=c3nyGkDcot8aXKcgUZLe +[aliyun] +appCode=1830f95365cb47488667ca1ef9aa9f6d + [recook] url=https://testapi.reecook.cn/api/v1 private_key=MIIEowIBAAKCAQEAzNWyjYe3qt4YRTDwANxDPNLAJ9TZBuHsSqSjJM5B35fABwN3gwm5Q/SCz/6kgKTqeSgCVPFYhO/zOD6G8K7EJLgx95ZIeAB9EkW+xrhFDDthUZAkA03zHJO6SkFKOciLFVi94BdCdGlNFlnaBBqA+8XvCpD1V8DFc/9cpb5icZvngu8vEkwkbYceCXKUMNxoXY/E2cFe8f2tVFR5pRkQgRLbM70jt4yBGOD8pbuk6fcnD7ghGWgzMq/845N3wISSTp/gAQg8403Fk+8AoL+FKgxUkjUOpPI2XrcpQm0EphuAX4J0Xvo3Hu6TEPZYyqULEXGT2Jukmh0NSkNO0F39xwIDAQABAoIBAQCAqRYPWhkexYQ/Kb8G+1NsiABUxJhRf2UZeZJUEw5DcKEYhq/x6hCpw5LLLOqNN4lj8qKMUlBEqCeAw52k3lGrstsH5ii836mv6YksbyBHz6CQR9anELZM0+nmrF4AL5xVGzmg4VtHncDi8itD+pXcD3bXjzfcF+SuuM6r+QsCykgTc/jw+R6GqOHvD48mUQCI0/Xw6jjAWUUh0jRX2BvLQwcccan5ZCZD3C7M8gGuRFO2vr8lFliQwyFNgwrpE+brLeMNeLHz1S6vMwfqr3r4Mq78wTihoze+3kIs5tdE0YRkJpaPLdeCsvQ8iFfD9nat7wnNHgcQBU+3B+KjOJCZAoGBAOVC8AY8q0UeTFreo44Fgda9Jg+BsR0UwTzTxzozdwSMhIfzb6oDa6tWd8VO0V6FaqK+Urxj6UP3JshAQT8hsq6Hh8tEmUx3rxpQnWZ5bdFJD291apKwTVgDzcf7mo77Ypjpko+Y4Og3weUGOnM+hTdPiToUmkZv78OPgbRR+utdAoGBAOS5c3f7gdfd60mlABPIgpHQccaTyEg3YoCQoB1oXTMk881vzC6w8xwYR0gpKGj6/vG9FeEpgYLi+ydWiNnzH8ZknPiACYZ6g18CzlCUcHUG1PZhKot1zgXQN9/WAvjWZ62Ym4FcPrEaF3+u88Pjj27vQE5MDO8O2uVRQwIGXh9zAoGAGLjGHzYNle91dlsJsffgD2LoJsXqbmNdjwybMCh6jhAE/o/+m4uw4ZH6allcdF/YpuH1FAGGFuEg2nkrT/53QSC2QPINwdQqGqFUx8cSU34YXwF/U4AVZwdJ+mWkPgTXlfuh5UAsCH5ytxqb1O+J9/PorU2pcS0C4sinyOUKNLUCgYBFJNsHVnz2KRxL8xmG4YK3WfBLO7m8OyIIA7Cjsz0ZjP43CKkNJGkaASzrX6XbtqUDp0nJ+6YvTzbluX89hAYDD790UCCRCtBUFKESMw2cEyimItGdv0s87qk1fZkAaLCHBi9cd+pr15tq+hSvD0f5HVKvWMZALpl14Y8EObCSiQKBgCiSKMsn7W5eGVR4cHO5NQ8P6V20ZOGIKvUsJUtlzRtneJERqVXZqVp9MctpLzNluQMGzTR1dEngdnOa2sYgdd8ATYy0NGiZuBDMA3h0f0aVsQublPfUG+0QH/3qryNISWN+m8DnCtkpkUG1GI5/0x9ZVVlSybIvz7H8NltIxXr/ diff --git a/go.mod b/go.mod index b243ac6..ed915bd 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/gin-gonic/gin v1.6.3 github.com/go-playground/locales v0.13.0 github.com/go-playground/universal-translator v0.17.0 + github.com/go-redis/redis v6.15.9+incompatible github.com/golangkit/formatime v0.0.0-20191104073810-5264c15ae8ec github.com/gorilla/websocket v1.4.2 github.com/json-iterator/go v1.1.10 diff --git a/go.sum b/go.sum index 649d62e..404bdbb 100644 --- a/go.sum +++ b/go.sum @@ -21,6 +21,8 @@ github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD87 github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg= +github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY=