Browse Source

推荐系统

May1145 1 năm trước cách đây
mục cha
commit
9547bf073d

+ 3 - 1
trading-go/config/config.yml

@@ -13,4 +13,6 @@ redis:
   db: 1
   poolsize: 20
 time:
-  time: 2023-8-16
+  time: 2023-8-16
+gorse:
+  addr: "http://localhost:8086"

+ 29 - 13
trading-go/controller/goodscontroller.go

@@ -45,7 +45,7 @@ func CreatGoods(c *gin.Context) {
 	}
 	goods := goodsJson.Change()
 	id, err := goods.Create()
-	util.NewIndex(id, goodsJson.Desc+goodsJson.Title)
+	go util.NewIndex(id, goodsJson.Desc+goodsJson.Title)
 	err = category.Save(id, goodsJson.Categories)
 	if err != nil {
 		msg := err.Error()
@@ -72,7 +72,7 @@ func DGoods(c *gin.Context) {
 	}
 	goods.Id = uint(id)
 	err = goods.Delete()
-	util.DelIndex(goods.Id)
+	go util.DelIndex(goods.Id)
 	if err != nil {
 		msg := err.Error()
 		response.Fail(c.Writer, msg, 500)
@@ -123,17 +123,26 @@ func GetGoodsPage(c *gin.Context) {
 // @Summary 分页获取推荐商品
 // @Produce application/json
 // @Param id query int64 true "用户id"
-// @Param page path int true "页数"
-// @Param pageSize path int true "一页的大小"
+// @Param size query int true "推荐的数目"
 // @Success 200 {object} response.Response
-// @Router /goods/recommend/{page}/{pageSize} [get]
+// @Router /goods/recommend [get]
 func GetRecommend(c *gin.Context) {
-	var goods []model.GoodsSurface
-	var rsp response.PageResponse
-	goods = append(goods, model.GoodsSurface{})
-	goods = append(goods, model.GoodsSurface{})
+	var goods model.GoodsSurface
+	ids := c.Param("id")
+	s := c.Query("size")
+	id, err := strconv.Atoi(ids)
+	size, err := strconv.Atoi(s)
+	if err != nil {
+		response.Fail(c.Writer, err.Error(), 500)
+		return
+	}
+	data, err := goods.GetRecommend(uint(id), size)
+	if err != nil {
+		response.Fail(c.Writer, err.Error(), 500)
+		return
+	}
 	//rsp.Data = goods
-	response.Success(c.Writer, "success", rsp)
+	response.Success(c.Writer, "success", data)
 }
 
 // ReviseGoods
@@ -151,9 +160,9 @@ func ReviseGoods(c *gin.Context) {
 		response.Fail(c.Writer, msg, 500)
 		return
 	}
-	util.DelIndex(goods.Id)
+	go util.DelIndex(goods.Id)
 	err = goods.Revise()
-	util.NewIndex(goods.Id, goods.Desc+goods.Title)
+	go util.NewIndex(goods.Id, goods.Desc+goods.Title)
 	if err != nil {
 		msg := err.Error()
 		response.Fail(c.Writer, msg, 500)
@@ -167,12 +176,18 @@ func ReviseGoods(c *gin.Context) {
 // @Summary  获取商品详细信息
 // @Produce application/json
 // @Param id path int64 true "商品id"
+// @Param uid query int64 true "访问的用户id"
+// @Param date query int64 true "访问时间的时间戳"
 // @Success 200 {object} response.Response
 // @Router /goods/detail/{id} [get]
 func GetGoodDetail(c *gin.Context) {
 	var goods model.Goods
 	ids := c.Param("id")
+	uids := c.Query("uid")
+	ts := c.Query("date")
 	id, err := strconv.Atoi(ids)
+	uid, err := strconv.Atoi(uids)
+	date, err := strconv.Atoi(ts)
 	if err != nil {
 		response.Fail(c.Writer, err.Error(), 500)
 		return
@@ -183,7 +198,8 @@ func GetGoodDetail(c *gin.Context) {
 		response.Fail(c.Writer, err.Error(), 500)
 		return
 	}
-	response.Success(c.Writer, "success", model.Goods{})
+	go util.Recommend(uint(uid), uint(id), uint(date))
+	response.Success(c.Writer, "success", goods)
 }
 
 // GetUserGoods

+ 18 - 11
trading-go/docs/docs.go

@@ -468,6 +468,20 @@ const docTemplate = `{
                         "name": "id",
                         "in": "path",
                         "required": true
+                    },
+                    {
+                        "type": "integer",
+                        "description": "访问的用户id",
+                        "name": "uid",
+                        "in": "query",
+                        "required": true
+                    },
+                    {
+                        "type": "integer",
+                        "description": "访问时间的时间戳",
+                        "name": "date",
+                        "in": "query",
+                        "required": true
                     }
                 ],
                 "responses": {
@@ -480,7 +494,7 @@ const docTemplate = `{
                 }
             }
         },
-        "/goods/recommend/{page}/{pageSize}": {
+        "/goods/recommend": {
             "get": {
                 "produces": [
                     "application/json"
@@ -499,16 +513,9 @@ const docTemplate = `{
                     },
                     {
                         "type": "integer",
-                        "description": "页数",
-                        "name": "page",
-                        "in": "path",
-                        "required": true
-                    },
-                    {
-                        "type": "integer",
-                        "description": "一页的大小",
-                        "name": "pageSize",
-                        "in": "path",
+                        "description": "推荐的数目",
+                        "name": "size",
+                        "in": "query",
                         "required": true
                     }
                 ],

+ 18 - 11
trading-go/docs/swagger.json

@@ -461,6 +461,20 @@
                         "name": "id",
                         "in": "path",
                         "required": true
+                    },
+                    {
+                        "type": "integer",
+                        "description": "访问的用户id",
+                        "name": "uid",
+                        "in": "query",
+                        "required": true
+                    },
+                    {
+                        "type": "integer",
+                        "description": "访问时间的时间戳",
+                        "name": "date",
+                        "in": "query",
+                        "required": true
                     }
                 ],
                 "responses": {
@@ -473,7 +487,7 @@
                 }
             }
         },
-        "/goods/recommend/{page}/{pageSize}": {
+        "/goods/recommend": {
             "get": {
                 "produces": [
                     "application/json"
@@ -492,16 +506,9 @@
                     },
                     {
                         "type": "integer",
-                        "description": "页数",
-                        "name": "page",
-                        "in": "path",
-                        "required": true
-                    },
-                    {
-                        "type": "integer",
-                        "description": "一页的大小",
-                        "name": "pageSize",
-                        "in": "path",
+                        "description": "推荐的数目",
+                        "name": "size",
+                        "in": "query",
                         "required": true
                     }
                 ],

+ 14 - 9
trading-go/docs/swagger.yaml

@@ -456,6 +456,16 @@ paths:
         name: id
         required: true
         type: integer
+      - description: 访问的用户id
+        in: query
+        name: uid
+        required: true
+        type: integer
+      - description: 访问时间的时间戳
+        in: query
+        name: date
+        required: true
+        type: integer
       produces:
       - application/json
       responses:
@@ -466,7 +476,7 @@ paths:
       summary: 获取商品详细信息
       tags:
       - 商品模块
-  /goods/recommend/{page}/{pageSize}:
+  /goods/recommend:
     get:
       parameters:
       - description: 用户id
@@ -474,14 +484,9 @@ paths:
         name: id
         required: true
         type: integer
-      - description: 页数
-        in: path
-        name: page
-        required: true
-        type: integer
-      - description: 一页的大小
-        in: path
-        name: pageSize
+      - description: 推荐的数目
+        in: query
+        name: size
         required: true
         type: integer
       produces:

+ 10 - 2
trading-go/go.mod

@@ -32,6 +32,7 @@ require (
 	github.com/dgraph-io/ristretto v0.0.2 // indirect
 	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
 	github.com/dustin/go-humanize v1.0.0 // indirect
+	github.com/felixge/httpsnoop v1.0.3 // indirect
 	github.com/fsnotify/fsnotify v1.6.0 // indirect
 	github.com/gabriel-vasile/mimetype v1.4.2 // indirect
 	github.com/gin-contrib/sse v0.1.0 // indirect
@@ -39,6 +40,8 @@ require (
 	github.com/go-ego/gpy v0.31.0 // indirect
 	github.com/go-ego/gse v0.50.3 // indirect
 	github.com/go-ego/murmur v0.10.0 // indirect
+	github.com/go-logr/logr v1.2.3 // indirect
+	github.com/go-logr/stdr v1.2.2 // indirect
 	github.com/go-ole/go-ole v1.2.4 // indirect
 	github.com/go-openapi/jsonpointer v0.20.0 // indirect
 	github.com/go-openapi/jsonreference v0.20.2 // indirect
@@ -51,7 +54,7 @@ require (
 	github.com/go-vgo/gt/info v0.0.0-20200606140533-a397c46789df // indirect
 	github.com/goccy/go-json v0.10.2 // indirect
 	github.com/golang/protobuf v1.5.3 // indirect
-	github.com/golang/snappy v0.0.1 // indirect
+	github.com/golang/snappy v0.0.4 // indirect
 	github.com/hashicorp/hcl v1.0.0 // indirect
 	github.com/jinzhu/inflection v1.0.0 // indirect
 	github.com/jinzhu/now v1.1.5 // indirect
@@ -65,7 +68,7 @@ require (
 	github.com/mitchellh/mapstructure v1.5.0 // indirect
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 	github.com/modern-go/reflect2 v1.0.2 // indirect
-	github.com/pelletier/go-toml v1.8.0 // indirect
+	github.com/pelletier/go-toml v1.9.5 // indirect
 	github.com/pelletier/go-toml/v2 v2.0.9 // indirect
 	github.com/pkg/errors v0.9.1 // indirect
 	github.com/shirou/gopsutil v2.20.5+incompatible // indirect
@@ -77,7 +80,12 @@ require (
 	github.com/syndtr/goleveldb v1.0.0 // indirect
 	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
 	github.com/ugorji/go/codec v1.2.11 // indirect
+	github.com/zhenghaoz/gorse v0.5.0-alpha.0.20230905121337-24d69b1426a0 // indirect
 	go.etcd.io/bbolt v1.3.4 // indirect
+	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.36.4 // indirect
+	go.opentelemetry.io/otel v1.11.1 // indirect
+	go.opentelemetry.io/otel/metric v0.33.0 // indirect
+	go.opentelemetry.io/otel/trace v1.11.1 // indirect
 	golang.org/x/arch v0.4.0 // indirect
 	golang.org/x/crypto v0.11.0 // indirect
 	golang.org/x/net v0.12.0 // indirect

+ 22 - 0
trading-go/go.sum

@@ -111,6 +111,8 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m
 github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
 github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk=
+github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
 github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
@@ -141,6 +143,11 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2
 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
+github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
 github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
 github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI=
 github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM=
@@ -220,6 +227,8 @@ github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu
 github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
 github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
+github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
@@ -304,6 +313,7 @@ github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q=
 github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
 github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0=
 github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/lib/pq v1.10.6 h1:jbk+ZieJ0D7EVGJYpL9QTz7/YW6UHbmdnZWYyK5cdBs=
 github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
 github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
 github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
@@ -343,6 +353,8 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9
 github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE=
 github.com/pelletier/go-toml v1.8.0 h1:Keo9qb7iRJs2voHvunFtuuYFsbWeOBh8/P9v/kVMFtw=
 github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs=
+github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
+github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
 github.com/pelletier/go-toml/v2 v2.0.9 h1:uH2qQXheeefCCkuBBSLi7jCiSmj3VRh2+Goq2N7Xxu0=
 github.com/pelletier/go-toml/v2 v2.0.9/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -436,6 +448,8 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
 github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+github.com/zhenghaoz/gorse v0.5.0-alpha.0.20230905121337-24d69b1426a0 h1:F2EDo6P92f6+wiYpP4N+g/w+Q3s2KE1AvT3Mdnf3E0s=
+github.com/zhenghaoz/gorse v0.5.0-alpha.0.20230905121337-24d69b1426a0/go.mod h1:JJucbAUvBHFPRoIJ+EOaStQsbn9NRPfx7dXh4jH1AEU=
 go.etcd.io/bbolt v1.3.4 h1:hi1bXHMVrlQh6WwxAy+qZCV/SYIlqo+Ushwdpa4tAKg=
 go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
 go.etcd.io/etcd v3.3.10+incompatible/go.mod h1:yaeTdrJi5lOmYerz05bd8+V7KubZs8YSFZfzsF9A6aI=
@@ -445,6 +459,14 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
 go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
 go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
 go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.36.4 h1:aUEBEdCa6iamGzg6fuYxDA8ThxvOG240mAvWDU+XLio=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.36.4/go.mod h1:l2MdsbKTocpPS5nQZscqTR9jd8u96VYZdcpF8Sye7mA=
+go.opentelemetry.io/otel v1.11.1 h1:4WLLAmcfkmDk2ukNXJyq3/kiz/3UzCaYq6PskJsaou4=
+go.opentelemetry.io/otel v1.11.1/go.mod h1:1nNhXBbWSD0nsL38H6btgnFN2k4i0sNLHNNMZMSbUGE=
+go.opentelemetry.io/otel/metric v0.33.0 h1:xQAyl7uGEYvrLAiV/09iTJlp1pZnQ9Wl793qbVvED1E=
+go.opentelemetry.io/otel/metric v0.33.0/go.mod h1:QlTYc+EnYNq/M2mNk1qDDMRLpqCOj2f/r5c7Fd5FYaI=
+go.opentelemetry.io/otel/trace v1.11.1 h1:ofxdnzsNrGBYXbP7t7zpUK281+go5rF7dvdIZXF8gdQ=
+go.opentelemetry.io/otel/trace v1.11.1/go.mod h1:f/Q9G7vzk5u91PhbmKbg1Qn0rzH1LJ4vbPHFGkTPtOk=
 go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
 go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=

+ 2 - 0
trading-go/main.go

@@ -1,6 +1,7 @@
 package main
 
 import (
+	"fmt"
 	"github.com/spf13/viper"
 	_ "trading-go/common"
 	"trading-go/routine"
@@ -19,5 +20,6 @@ import (
 func main() {
 	r := routine.GetRoutine()
 	port := viper.GetString("web.port")
+	fmt.Println("[api文档] =====>>> http://124.222.126.172:8084/swagger/index.html#/")
 	r.Run(port)
 }

+ 18 - 0
trading-go/model/goods.go

@@ -196,3 +196,21 @@ func (g *GoodsSurface) SearchPaged(key string, page, pageSize int) (rsp response
 	}
 	return
 }
+
+func (g *GoodsSurface) GetRecommend(id uint, size int) (goods []GoodsSurface, err error) {
+	ids, err := util.GetRecommend(id, size)
+	db := common.DB
+	if err != nil {
+		return nil, err
+	}
+	if len(ids) == 0 {
+		return nil, util.NoRecommendError
+	}
+	query, args, err := sqlx.In("SELECT * FROM goods_surfaces WHERE id IN (?)", ids)
+	if err != nil {
+		return nil, err
+	}
+	query = db.Rebind(query)
+	err = db.Select(&goods, query, args...)
+	return
+}

+ 3 - 3
trading-go/model/message.go

@@ -28,7 +28,7 @@ func init() {
 func (m Message) Save() error {
 	rds := common.Redis
 	jsonData, err := json.Marshal(m)
-	ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
+	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
 	defer cancel()
 
 	key := fmt.Sprintf("%d:%d:%d", m.From, m.To, m.Time)
@@ -45,7 +45,7 @@ func (m Message) GetFrom(uid uint, page, pageSize int) (ms response.PageResponse
 		fromIndex[uid] = "0"
 	}
 	rds := common.Redis
-	ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
+	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
 	defer cancel()
 	key := fmt.Sprintf("%d:*", uid)
 	result, err := rds.Do(ctx, "scan", fromIndex[uid], "match", key, "count", pageSize).Result()
@@ -82,7 +82,7 @@ func (m Message) GetTo(uid uint, page, pageSize int) (ms response.PageResponse,
 		toIndex[uid] = "0"
 	}
 	rds := common.Redis
-	ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
+	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
 	defer cancel()
 	key := fmt.Sprintf("*:%d:*", uid)
 	result, err := rds.Do(ctx, "scan", toIndex[uid], "match", key, "count", pageSize).Result()

+ 1 - 1
trading-go/routine/routine.go

@@ -65,7 +65,7 @@ func GetRoutine() *gin.Engine {
 		goods.POST("create", controller.CreatGoods)
 		goods.DELETE("delete/:id", controller.DGoods)
 		goods.GET("/:page/:pageSize", controller.GetGoodsPage)
-		goods.GET("recommend/:page/:pageSize", controller.GetRecommend)
+		goods.GET("recommend", controller.GetRecommend)
 		goods.POST("revise", controller.ReviseGoods)
 		goods.GET("detail/:id", controller.GetGoodDetail)
 		goods.GET("user/:id", controller.GetUserGoods)

+ 1 - 0
trading-go/util/error.go

@@ -9,4 +9,5 @@ var (
 	UpdateFailError  = errors.New("fail to update")
 	PhoneFormatError = errors.New("phone format error")
 	NoSuchGoodsError = errors.New("no such goods")
+	NoRecommendError = errors.New("no recommend")
 )

+ 39 - 0
trading-go/util/recommend.go

@@ -0,0 +1,39 @@
+package util
+
+import (
+	"context"
+	"fmt"
+	"github.com/spf13/viper"
+	"github.com/zhenghaoz/gorse/client"
+	"time"
+)
+
+var gorse *client.GorseClient
+
+func init() {
+	gorse = client.NewGorseClient(viper.GetString("gorse.addr"), "")
+
+}
+
+func Recommend(uid, goodsId, tie uint) {
+	ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
+	defer cancel()
+	t := time.Unix(int64(tie), 0)
+	date := t.Format("2006-01-02")
+	_, err := gorse.InsertFeedback(ctx, []client.Feedback{
+		{FeedbackType: "star",
+			UserId:    fmt.Sprintf("%d", uid),
+			ItemId:    fmt.Sprintf("%d", goodsId),
+			Timestamp: date},
+	})
+	if err != nil {
+		fmt.Println(err.Error())
+	}
+}
+
+func GetRecommend(uid uint, cnt int) (goods []string, err error) {
+	ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
+	defer cancel()
+	category, err := gorse.GetItemRecommendWithCategory(ctx, fmt.Sprintf("%d", uid), "", "", "", 0, cnt)
+	return category, err
+}