diff --git a/go.mod b/go.mod index 0647cac..90a8fa3 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,10 @@ require ( git.oa00.com/go/mysql v1.0.0 github.com/360EntSecGroup-Skylar/excelize/v2 v2.3.0 github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 + github.com/alibabacloud-go/opensearch-util v1.0.1 + github.com/alibabacloud-go/tea-utils v1.4.3 github.com/aliyun/alibaba-cloud-sdk-go v1.61.454 + github.com/aliyun/credentials-go v1.1.3 github.com/antchfx/htmlquery v1.2.3 github.com/astaxie/beego v1.12.2 github.com/corona10/goimagehash v1.0.3 diff --git a/go.sum b/go.sum index 1f9ca19..d549c88 100644 --- a/go.sum +++ b/go.sum @@ -45,12 +45,25 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafo github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68 h1:NqugFkGxx1TXSh/pBcU00Y6bljgDPaFdh5MUSeJ7e50= +github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68/go.mod h1:6pb/Qy8c+lqua8cFpEy7g39NRRqOWc3rOwAy8m5Y2BY= +github.com/alibabacloud-go/opensearch-util v1.0.1 h1:6WYmmFv0qTc3YHVJ9CEqrJPaOa+dJmeKehM9VwcfER8= +github.com/alibabacloud-go/opensearch-util v1.0.1/go.mod h1:jrHw5mkOJKinzpMoSKZCBwmdsdoVdPMejgE0cYj1TAs= +github.com/alibabacloud-go/tea v1.1.0/go.mod h1:IkGyUSX4Ba1V+k4pCtJUc6jDpZLFph9QMy2VUPTwukg= +github.com/alibabacloud-go/tea v1.1.7 h1:Wi3mcBU/oZistg85rmoJc6aiJ+MagsB+AeiF3Zwx6Tg= +github.com/alibabacloud-go/tea v1.1.7/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4= +github.com/alibabacloud-go/tea v1.1.8 h1:vFF0707fqjGiQTxrtMnIXRjOCvQXf49CuDVRtTopmwU= +github.com/alibabacloud-go/tea v1.1.8/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4= +github.com/alibabacloud-go/tea-utils v1.4.3 h1:8SzwmmRrOnQ09Hf5a9GyfJc0d7Sjv6fmsZoF4UDbFjo= +github.com/alibabacloud-go/tea-utils v1.4.3/go.mod h1:KNcT0oXlZZxOXINnZBs6YvgOd5aYp9U67G+E3R8fcQw= github.com/alicebob/gopher-json v0.0.0-20180125190556-5a6b3ba71ee6/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= github.com/alicebob/miniredis v2.5.0+incompatible/go.mod h1:8HZjEj4yU0dwhYHky+DxYx+6BMjkBbe5ONFIF1MXffk= github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190808125512-07798873deee/go.mod h1:myCDvQSzCW+wB1WAlocEru4wMGJxy+vlxHdhegi1CDQ= github.com/aliyun/alibaba-cloud-sdk-go v1.61.454 h1:wffgSxm22EnmFYlnWX8Laogj6PKXEBggBwcpH7I33WM= github.com/aliyun/alibaba-cloud-sdk-go v1.61.454/go.mod h1:pUKYbK5JQ+1Dfxk80P0qxGqe5dkxDoabbZS7zOcouyA= github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20190307165228-86c17b95fcd5/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= +github.com/aliyun/credentials-go v1.1.3 h1:flDToYthFtmi2vrgnX8/uyFnctrt9pjyxlz6xD7Bsxg= +github.com/aliyun/credentials-go v1.1.3/go.mod h1:ozcZaMR5kLM7pwtCMEpVmQ242suV6qTJya2bDq4X1Tw= github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antchfx/htmlquery v1.2.3 h1:sP3NFDneHx2stfNXCKbhHFo8XgNjCACnU/4AO5gWz6M= @@ -265,6 +278,7 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m github.com/gophercloud/gophercloud v0.3.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= @@ -509,8 +523,10 @@ github.com/smartwalle/crypto4go v1.0.2 h1:9DUEOOsPhmp00438L4oBdcL8EZG1zumecft5bW github.com/smartwalle/crypto4go v1.0.2/go.mod h1:LQ7vCZIb7BE5+MuMtJBuO8ORkkQ01m4DXDBWPzLbkMY= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v1.1.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a h1:pa8hGb/2YqsZKovtsgrwcDH1RZhVbTKCjLp47XpqCDs= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE= @@ -566,6 +582,8 @@ github.com/xuri/efp v0.0.0-20191019043341-b7dc4fe9aa91 h1:gp02YctZuIPTk0t7qI+wvg github.com/xuri/efp v0.0.0-20191019043341-b7dc4fe9aa91/go.mod h1:uBiSUepVYMhGTfDeBKKasV4GpgBlzJ46gXUBAqV8qLk= github.com/ylywyn/jpush-api-go-client v0.0.0-20190906031852-8c4466c6e369 h1:g95WlXTqXFLM36fhvDKcZWHTUnBb2KCEn4tuSizk/d8= github.com/ylywyn/jpush-api-go-client v0.0.0-20190906031852-8c4466c6e369/go.mod h1:Nv7wKD2/bCdKUFNKcJRa99a+1+aSLlCRJFriFYdjz/I= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.30/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/gopher-lua v0.0.0-20171031051903-609c9cd26973/go.mod h1:aEV29XrmTYFr3CiRxZeGHpkvbwq+prZduBqMaascyCU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -604,6 +622,7 @@ golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191108234033-bd318be0434a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e h1:gsTQYXdTw2Gq7RBsWvlQ91b+aEQ6bXFUngBGuR8sPpI= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -619,6 +638,7 @@ golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180611182652-db08ff08e862/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -645,6 +665,7 @@ golang.org/x/net v0.0.0-20190930134127-c5a3c61f89f3/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20191011234655-491137f69257/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191109021931-daa7c04131f5/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= @@ -659,6 +680,7 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180622082034-63fc586f45fe/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -695,6 +717,7 @@ golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200509044756-6aff5f38e54f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 h1:SrN+KX8Art/Sf4HNj6Zcz06G7VEz+7w9tdXTPOZ7+l4= @@ -727,8 +750,10 @@ golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDq golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200117065230-39095c1d176c h1:FodBYPZKH5tAN2O60HlglMwXGAeV/4k+NKbli79M/2c= golang.org/x/tools v0.0.0-20200117065230-39095c1d176c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= @@ -784,6 +809,8 @@ gopkg.in/h2non/gock.v1 v1.0.15/go.mod h1:sX4zAkdYX1TRGJ2JY156cFspQn4yRWn6p9EMdOD gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.44.0 h1:YRJzTUp0kSYWUVFF5XAbDFfyiqwsl0Vb9R8TVP5eRi0= gopkg.in/ini.v1 v1.44.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.56.0 h1:DPMeDvGTM54DXbPkVIZsp19fp/I2K7zwA/itHYHKo8Y= +gopkg.in/ini.v1 v1.56.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/ns1/ns1-go.v2 v2.0.0-20190730140822-b51389932cbc/go.mod h1:VV+3haRsgDiVLxyifmMBrBIuCWFBPYKbRssXB9z67Hw= gopkg.in/resty.v1 v1.9.1/go.mod h1:vo52Hzryw9PnPHcJfPsBiFW62XhNx5OczbV9y+IMpgc= diff --git a/internal/v2/controller/task/goods.go b/internal/v2/controller/task/goods.go index 5fc23eb..045a8d8 100644 --- a/internal/v2/controller/task/goods.go +++ b/internal/v2/controller/task/goods.go @@ -238,7 +238,13 @@ func (g *Goods) Sync(c *gin.Context) { } func (g *Goods) Fix(c *gin.Context) { - go SyncJDImage() + brand := c.Query("brand") + if brand == "" { + c.String(200, "brand") + return + } + id, _ := strconv.Atoi(brand) + go SyncJDImage(id) c.String(200, "suc") } diff --git a/internal/v2/controller/task/jcook.go b/internal/v2/controller/task/jcook.go index 4dc48de..72ecdc2 100644 --- a/internal/v2/controller/task/jcook.go +++ b/internal/v2/controller/task/jcook.go @@ -4,7 +4,6 @@ import ( "errors" "fmt" "log" - "recook/internal/v2/lib/downloader" "recook/internal/v2/lib/jcook" "recook/internal/v2/model/recook/goods" "recook/tools" @@ -428,18 +427,22 @@ func SyncPageData(page, size uint, brand string, categories []RecookJCookCategor return nil } -func SyncJDImage() { +func SyncJDImage(id int) { var gs []goods.RecookGoodsInfoModel - sub := mysql2.Db.Select("goods_id"). - Table((&goods.RecookGoodsDetailPhotoModel{}).TableName()).Group("goods_id") - mysql2.Db.Find(&gs, "id not in (?) AND third_party_type = 3", sub) + mysql2.Db.Find(&gs, "brand_id = ?", id) - do := downloader.New(nil, "/jcook", 10) - do.Start() - client := jcook.GetClient() + ids := make([]uint, 0) for _, v := range gs { + ids = append(ids, v.Id) + } + var gsk []goods.RecookGoodsSkuModel + mysql2.Db.Find(&gsk, "id in (?)", ids) + + client := jcook.GetClient() + for _, v := range gsk { + skuId, _ := strconv.Atoi(v.ThirdPartySkuId) rq := jcook.SkuDetailReq{ - SkuIDSet: []uint{v.ThirdPartyId}, + SkuIDSet: []uint{uint(skuId)}, } var res []jcook.SkuDetailResp if err := client.Exec(rq, &res); err != nil { @@ -465,11 +468,9 @@ func SyncJDImage() { if !strings.HasPrefix(kt, "http") && !strings.HasPrefix(kt, "https") { kt = "http:" + kt } - do.AddTask(kt) - name := do.GetPath(kt) dp = append(dp, goods.RecookGoodsDetailPhotoModel{ GoodsID: v.Id, - Url: name, + Url: kt, Name: "api", OrderNo: ki, Width: 0, @@ -481,5 +482,4 @@ func SyncJDImage() { }) } - do.Wait() } diff --git a/internal/v2/model/search_ali/search.go b/internal/v2/model/search_ali/search.go new file mode 100644 index 0000000..7a65374 --- /dev/null +++ b/internal/v2/model/search_ali/search.go @@ -0,0 +1,295 @@ +package search_ali + +import ( + opensearchutil "github.com/alibabacloud-go/opensearch-util/service" + util "github.com/alibabacloud-go/tea-utils/service" + "github.com/alibabacloud-go/tea/tea" + credential "github.com/aliyun/credentials-go/credentials" +) + +type Config struct { + Endpoint *string `json:"endpoint,omitempty" xml:"endpoint,omitempty"` + Protocol *string `json:"protocol,omitempty" xml:"protocol,omitempty"` + Type *string `json:"type,omitempty" xml:"type,omitempty"` + SecurityToken *string `json:"securityToken,omitempty" xml:"securityToken,omitempty"` + AccessKeyId *string `json:"accessKeyId,omitempty" xml:"accessKeyId,omitempty"` + AccessKeySecret *string `json:"accessKeySecret,omitempty" xml:"accessKeySecret,omitempty"` + UserAgent *string `json:"userAgent,omitempty" xml:"userAgent,omitempty"` +} + +func (s Config) String() string { + return tea.Prettify(s) +} + +func (s Config) GoString() string { + return s.String() +} + +func (s *Config) SetEndpoint(v string) *Config { + s.Endpoint = &v + return s +} + +func (s *Config) SetProtocol(v string) *Config { + s.Protocol = &v + return s +} + +func (s *Config) SetType(v string) *Config { + s.Type = &v + return s +} + +func (s *Config) SetSecurityToken(v string) *Config { + s.SecurityToken = &v + return s +} + +func (s *Config) SetAccessKeyId(v string) *Config { + s.AccessKeyId = &v + return s +} + +func (s *Config) SetAccessKeySecret(v string) *Config { + s.AccessKeySecret = &v + return s +} + +func (s *Config) SetUserAgent(v string) *Config { + s.UserAgent = &v + return s +} + +type Client struct { + Endpoint *string + Protocol *string + UserAgent *string + Credential credential.Credential +} + +func NewClient(config *Config) (*Client, error) { + client := new(Client) + err := client.Init(config) + return client, err +} + +func (client *Client) Init(config *Config) (_err error) { + if tea.BoolValue(util.IsUnset(tea.ToMap(config))) { + _err = tea.NewSDKError(map[string]interface{}{ + "name": "ParameterMissing", + "message": "'config' can not be unset", + }) + return _err + } + + if tea.BoolValue(util.Empty(config.Type)) { + config.Type = tea.String("access_key") + } + + credentialConfig := &credential.Config{ + AccessKeyId: config.AccessKeyId, + Type: config.Type, + AccessKeySecret: config.AccessKeySecret, + SecurityToken: config.SecurityToken, + } + client.Credential, _err = credential.NewCredential(credentialConfig) + if _err != nil { + return _err + } + + client.Endpoint = config.Endpoint + client.Protocol = config.Protocol + client.UserAgent = config.UserAgent + return nil +} + +func (client *Client) Request(method *string, pathname *string, query map[string]interface{}, headers map[string]*string, body interface{}, runtime *util.RuntimeOptions) (_result map[string]interface{}, _err error) { + _err = tea.Validate(runtime) + if _err != nil { + return _result, _err + } + _runtime := map[string]interface{}{ + "timeouted": "retry", + "readTimeout": tea.IntValue(runtime.ReadTimeout), + "connectTimeout": tea.IntValue(runtime.ConnectTimeout), + "httpProxy": tea.StringValue(runtime.HttpProxy), + "httpsProxy": tea.StringValue(runtime.HttpsProxy), + "noProxy": tea.StringValue(runtime.NoProxy), + "maxIdleConns": tea.IntValue(runtime.MaxIdleConns), + "retry": map[string]interface{}{ + "retryable": tea.BoolValue(runtime.Autoretry), + "maxAttempts": tea.IntValue(util.DefaultNumber(runtime.MaxAttempts, tea.Int(3))), + }, + "backoff": map[string]interface{}{ + "policy": tea.StringValue(util.DefaultString(runtime.BackoffPolicy, tea.String("no"))), + "period": tea.IntValue(util.DefaultNumber(runtime.BackoffPeriod, tea.Int(1))), + }, + "ignoreSSL": tea.BoolValue(runtime.IgnoreSSL), + } + + _resp := make(map[string]interface{}) + for _retryTimes := 0; tea.BoolValue(tea.AllowRetry(_runtime["retry"], tea.Int(_retryTimes))); _retryTimes++ { + if _retryTimes > 0 { + _backoffTime := tea.GetBackoffTime(_runtime["backoff"], tea.Int(_retryTimes)) + if tea.IntValue(_backoffTime) > 0 { + tea.Sleep(_backoffTime) + } + } + + _resp, _err = func() (map[string]interface{}, error) { + request_ := tea.NewRequest() + accesskeyId, _err := client.GetAccessKeyId() + if _err != nil { + return _result, _err + } + + accessKeySecret, _err := client.GetAccessKeySecret() + if _err != nil { + return _result, _err + } + + request_.Protocol = util.DefaultString(client.Protocol, tea.String("HTTP")) + request_.Method = method + request_.Pathname = pathname + request_.Headers = tea.Merge(map[string]*string{ + "user-agent": client.GetUserAgent(), + "Date": opensearchutil.GetDate(), + "host": util.DefaultString(client.Endpoint, tea.String("opensearch-cn-hangzhou.aliyuncs.com")), + "X-Opensearch-Nonce": util.GetNonce(), + }, headers) + if !tea.BoolValue(util.IsUnset(query)) { + request_.Query = util.StringifyMapValue(query) + } + + if !tea.BoolValue(util.IsUnset(body)) { + reqBody := util.ToJSONString(body) + request_.Headers["Content-MD5"] = opensearchutil.GetContentMD5(reqBody) + request_.Headers["Content-Type"] = tea.String("application/json") + request_.Body = tea.ToReader(reqBody) + } + + request_.Headers["Authorization"] = opensearchutil.GetSignature(request_, accesskeyId, accessKeySecret) + response_, _err := tea.DoRequest(request_, _runtime) + if _err != nil { + return _result, _err + } + objStr, _err := util.ReadAsString(response_.Body) + if _err != nil { + return _result, _err + } + + if tea.BoolValue(util.Is4xx(response_.StatusCode)) || tea.BoolValue(util.Is5xx(response_.StatusCode)) { + _err = tea.NewSDKError(map[string]interface{}{ + "message": tea.StringValue(response_.StatusMessage), + "data": tea.StringValue(objStr), + "code": tea.IntValue(response_.StatusCode), + }) + return _result, _err + } + + obj := util.ParseJSON(objStr) + res := util.AssertAsMap(obj) + _result = make(map[string]interface{}) + _err = tea.Convert(map[string]interface{}{ + "body": res, + "headers": response_.Headers, + }, &_result) + return _result, _err + }() + if !tea.BoolValue(tea.Retryable(_err)) { + break + } + } + + return _resp, _err +} + +func (client *Client) SetUserAgent(userAgent *string) { + client.UserAgent = userAgent +} + +func (client *Client) AppendUserAgent(userAgent *string) { + client.UserAgent = tea.String(tea.StringValue(client.UserAgent) + " " + tea.StringValue(userAgent)) +} + +func (client *Client) GetUserAgent() (_result *string) { + userAgent := util.GetUserAgent(client.UserAgent) + _result = userAgent + return _result +} + +func (client *Client) GetAccessKeyId() (_result *string, _err error) { + if tea.BoolValue(util.IsUnset(client.Credential)) { + return _result, _err + } + + accessKeyId, _err := client.Credential.GetAccessKeyId() + if _err != nil { + return _result, _err + } + + _result = accessKeyId + return _result, _err +} + +func (client *Client) GetAccessKeySecret() (_result *string, _err error) { + if tea.BoolValue(util.IsUnset(client.Credential)) { + return _result, _err + } + + secret, _err := client.Credential.GetAccessKeySecret() + if _err != nil { + return _result, _err + } + + _result = secret + return _result, _err +} + +type RecookSearchModel struct { + Body struct { + Errors []interface{} `json:"errors"` + OpsRequestMisc string `json:"ops_request_misc"` + RequestId string `json:"request_id"` + Result struct { + ComputeCost []struct { + IndexName string `json:"index_name"` + Value float64 `json:"value"` + } `json:"compute_cost"` + Facet []interface{} `json:"facet"` + Items []struct { + Attribute struct { + } `json:"attribute"` + Fields struct { + Id string `json:"id"` + IndexName string `json:"index_name"` + } `json:"fields"` + Property struct { + } `json:"property"` + SortExprValues []string `json:"sortExprValues"` + VariableValue struct { + } `json:"variableValue"` + } `json:"items"` + Num int `json:"num"` + Searchtime float64 `json:"searchtime"` + Total uint `json:"total"` + Viewtotal int `json:"viewtotal"` + } `json:"result"` + Status string `json:"status"` + Tracer string `json:"tracer"` + } `json:"body"` + Headers struct { + Connection string `json:"connection"` + ContentLength string `json:"content-length"` + ContentType string `json:"content-type"` + Date string `json:"date"` + KeepAlive string `json:"keep-alive"` + RequestId string `json:"request-id"` + Server string `json:"server"` + XActionName string `json:"x-action-name"` + XAliyunUserId string `json:"x-aliyun-user-id"` + XAppId string `json:"x-app-id"` + XAppName string `json:"x-app-name"` + XAppgroupId string `json:"x-appgroup-id"` + } `json:"headers"` +} diff --git a/internal/v2/model/search_ali/searchByAliES.go b/internal/v2/model/search_ali/searchByAliES.go new file mode 100644 index 0000000..e21e5cf --- /dev/null +++ b/internal/v2/model/search_ali/searchByAliES.go @@ -0,0 +1,77 @@ +package search_ali + +import ( + "encoding/json" + "errors" + "fmt" + util "github.com/alibabacloud-go/tea-utils/service" + "github.com/alibabacloud-go/tea/tea" + "strconv" +) + +func SearchByAliES(keyWords string, limit, page int) (goodsList []uint, total uint, err error) { + // 创建请求用客户端实例 + // Endpoint 为 要访问服务的区域域名. + // AccessKeyId 及AccessKeySecret 用于构造鉴权信息. + config := &Config{ + Endpoint: tea.String("opensearch-cn-shanghai.aliyuncs.com"), + AccessKeyId: tea.String("LTAI5tBeJdJBq2R9quhwGeQH"), + AccessKeySecret: tea.String("sKvHrPwNWbVeDgUARAiGTluW06AQ4c"), + } + + // New 一个client, 用以发送请求. + client, _clientErr := NewClient(config) + + // 如果 NewClient 过程中出现异常. 则 返回 _clientErr 且输出 错误信息. + if _clientErr != nil { + fmt.Println(_clientErr) + return + } + + // requestParams 信息 + requestParams := map[string]interface{}{ + "query": fmt.Sprintf("config=start:%v,hit:%v,format:fulljson&&query=default:'%s'&&filter=publish_status=1", int(20*(page-1)), limit, keyWords), + } + + // 请求发送的配置参数. 用以请求配置及连接池配置. + runtime := &util.RuntimeOptions{ + ConnectTimeout: tea.Int(5000), + ReadTimeout: tea.Int(10000), + Autoretry: tea.Bool(false), + IgnoreSSL: tea.Bool(false), + MaxIdleConns: tea.Int(50), + } + + // 搜索接口需要提供 appName. + // App 可以是 app 的版本信息. 也可以是 app 名称. + appName := "recook" + + // 发送请求的方法调用. + response, _requestErr := client.Request( + tea.String("GET"), + tea.String("/v3/openapi/apps/"+appName+"/search"), + requestParams, + nil, + nil, + runtime) + + // 如果 发送请求 过程中出现异常. 则 返回 _requestErr 且输出 错误信息. + if _requestErr != nil { + fmt.Println(_requestErr) + return []uint{}, 0, errors.New("网络异常") + } + + // 输出正常返回的 response 内容. + body, _ := json.MarshalIndent(response, "", " ") + var gl RecookSearchModel + err = json.Unmarshal(body, &gl) + if err != nil { + return []uint{}, 0, errors.New("网络异常2") + } + for _, item := range gl.Body.Result.Items { + n, _ := strconv.Atoi(item.Fields.Id) + goodsList = append(goodsList, uint(n)) + } + total = gl.Body.Result.Total + return +}