浏览代码

Merge branch 'banner_down' into debug

# Conflicts:
#	routers/public.go
zwxi 10 月之前
父节点
当前提交
ebfb22a307
共有 5 个文件被更改,包括 148 次插入9 次删除
  1. 1 0
      config/config.go
  2. 62 8
      controller/public.go
  3. 7 0
      models/request/banner.go
  4. 3 1
      routers/public.go
  5. 75 0
      services/share_poster.go

+ 1 - 0
config/config.go

@@ -10,6 +10,7 @@ type Config struct {
 	AliOss   AliOss   `mapstructure:"ali-oss" json:"ali-oss" yaml:"ali-oss"`
 	EsClient EsClient `mapstructure:"es_client" json:"es_client" yaml:"es_client"`
 	Mongo    Mongo    `mapstructure:"mongo" json:"mongo" yaml:"mongo"`
+	ChromePath string `mapstructure:"chrome-path" json:"chrome-path" yaml:"chrome-path" description:"chrome路径"`
 }
 
 // Serve gin服务配置

+ 62 - 8
controller/public.go

@@ -510,6 +510,29 @@ func BannerHistoryList(c *gin.Context) {
 	response.OkData("获取成功", resp, c)
 }
 
+// BannerList banner图详情
+// @Tags 公共模块
+// @Summary  banner图详情
+// @Description banner图详情
+// @Security ApiKeyAuth
+// @securityDefinitions.basic BasicAuth
+// @Accept  json
+// @Product json
+// @Success 200 {string} string 获取验证码成功
+// @Failure 400 {string} string 请输入邮箱地址
+// @Router /banner/detail [get]
+func BannerDetail(c *gin.Context) {
+	bannerId, _ := strconv.Atoi(c.Query("banner_id"))
+
+	item, err := banner.GetBannerById(bannerId)
+	if err != nil {
+		response.FailMsg("获取失败", "获取banner失败, Err: "+err.Error(), c)
+		return
+	}
+
+	response.OkData("获取成功", item, c)
+}
+
 // BannerGetQRCode banner历史图列表
 // @Tags 公共模块
 // @Summary  banner图列表
@@ -567,14 +590,6 @@ func BannerGetQRCode(c *gin.Context) {
 		f.Close()
 		os.Remove(fpath)
 	}()
-	//err = qrcode.WriteFile(url, qrcode.Medium, 256, filePath)
-	//if err != nil {
-	//	response.FailData("生成二维码失败", "生成二维码失败,Err:"+err.Error(), c)
-	//}
-	//
-	//defer func() {
-	//	os.Remove(filePath)
-	//}()
 
 	//上传到阿里云
 	resourceUrl, err := services.UploadAliyun(fileName, fpath)
@@ -641,3 +656,42 @@ func ResearchSignUp(c *gin.Context) {
 
 	response.Ok("报名成功", c)
 }
+
+// BannerGetQRCode banner调研图下载
+// @Tags 公共模块
+// @Summary  banner调研图下载
+// @Description banner调研图下载
+// @Security ApiKeyAuth
+// @securityDefinitions.basic BasicAuth
+// @Accept  json
+// @Product json
+// @Success 200 {string} string 获取验证码成功
+// @Failure 400 {string} string 请输入邮箱地址
+// @Router /banner/download [get]
+func BannerDowload(c *gin.Context) {
+	var req request.BannerDownloadReq
+	if err := c.Bind(&req); err != nil {
+		response.Fail("参数有误:"+err.Error(), c)
+		return
+	}
+
+	randStr := utils.GetRandStringNoSpecialChar(28)
+	jpegPath := `./static/` + randStr + ".jpeg"
+	err := services.ReportToJpeg(req.BannerUrl, jpegPath)
+
+	dateDir := time.Now().Format("20060102")
+	uploadDir := global.CONFIG.Serve.StaticDir + "hongze/" + dateDir
+	err = os.MkdirAll(uploadDir, 0766)
+	if err != nil {
+		response.FailData("存储目录创建失败", "存储目录创建失败,Err:"+err.Error(), c)
+		return
+	}
+
+	//上传到阿里云
+	resourceUrl, err := services.UploadAliyun(randStr + ".jpeg", jpegPath)
+	if err != nil {
+		response.FailData("文件上传失败", "文件上传失败,Err:"+err.Error(), c)
+		return
+	}
+	response.OkData("获取成功", resourceUrl, c)
+}

+ 7 - 0
models/request/banner.go

@@ -0,0 +1,7 @@
+package request
+
+type BannerDownloadReq struct {
+	BannerUrl string `json:"banner_url"`
+	BannerId  int    `json:"banner_id" description:"图片id"`
+	UserId    int    `json:"user_id" description:"用户 id"`
+}

+ 3 - 1
routers/public.go

@@ -31,8 +31,10 @@ func initPublic(r *gin.Engine) {
 		rGroup.POST("/banner/mark", controller.BannerMark)
 		rGroup.GET("/banner/list", controller.BannerList)
 		rGroup.GET("/banner_history/list", controller.BannerHistoryList)
-		rGroup.GET("/banner/get_qrcode", controller.BannerGetQRCode)
 		rGroup.GET("/banner/signup", controller.ResearchSignUp)
+		rGroup.GET("/banner/get_qrcode", controller.BannerGetQRCode)
+		rGroup.GET("/banner/detail", controller.BannerDetail)
+		rGroup.POST("/banner/download", controller.BannerDowload)
 	}
 
 	rGroup2 := r.Group("api/public")

+ 75 - 0
services/share_poster.go

@@ -16,6 +16,7 @@ import (
 	"io/ioutil"
 	"net/http"
 	"os"
+	"os/exec"
 	"strings"
 	"time"
 )
@@ -422,3 +423,77 @@ func GetDynamicShareImg(source, pars string) (imgUrl string, err error) {
 	imgUrl = res.Data
 	return
 }
+
+func ReportToJpeg(reportUrl, filePath string) (err error) {
+	pyCode := `
+import asyncio
+from pyppeteer import launch, errors
+
+async def main():
+    try:
+        # 启动浏览器
+        browser = await launch({
+            'executablePath': '%s',
+            'headless': True,
+            'args': ['--disable-infobars', '--no-sandbox']
+        })
+        
+        # 新建页面
+        page = await browser.newPage()
+        
+        # 设置视口大小
+        await page.setViewport({
+            'width': 750,
+            'height': 1080
+        })
+        
+        # 导航到页面
+        await page.goto('%s', {
+            'waitUntil': 'networkidle0',
+            'timeout': 1000000  # 设置超时时间为 100 秒
+        })
+        await page.screenshot({
+            'path': "%s",
+            'fullPage': True,
+			'quality':100
+        })
+        
+    except errors.BrowserError as e:
+        print('Browser closed unexpectedly:', e)
+    except Exception as e:
+        print('An error occurred:', e)
+    finally:
+        # 确保浏览器关闭
+        if browser is not None:
+            await browser.close()
+
+# 获取当前事件循环
+loop = asyncio.get_event_loop()
+
+# 运行事件循环直到main协程完成
+try:
+    loop.run_until_complete(main())
+except Exception as e:
+    print('Error during event loop execution:', e)
+finally:
+    # 关闭事件循环
+    loop.close()
+`
+
+	pyCode = fmt.Sprintf(pyCode, global.CONFIG.ChromePath, reportUrl, filePath)
+	global.LOG.Info("jpeg pyCode: \n" + pyCode)
+	cmd := exec.Command("python3", "-c", pyCode)
+
+	output, e := cmd.CombinedOutput()
+	if e != nil {
+		err = e
+		global.LOG.Info("ReportToJpeg failed: , error: \n" + err.Error())
+		global.LOG.Info("Output: %s\n", string(output))
+		go alarm_msg.SendAlarmMsg("ReportToJpeg failed:"+err.Error(), 3)
+		go alarm_msg.SendAlarmMsg("Output :"+string(output), 3)
+	}
+	defer func() {
+		cmd.Process.Kill()
+	}()
+	return
+}