|
@@ -1236,7 +1236,7 @@ func PublishReport(reportId int, reportUrl string, sysUser *system.Admin) (tips
|
|
|
|
|
|
// 生成报告pdf和长图
|
|
|
{
|
|
|
- reportPdfUrl := GetGeneralPdfUrl(reportInfo.ReportCode, reportInfo.ReportLayout)
|
|
|
+ reportPdfUrl := GetGeneralPdfUrl(reportInfo.Id, reportInfo.ReportCode, reportInfo.ReportLayout)
|
|
|
go Report2pdfAndJpeg(reportPdfUrl, reportId, 1)
|
|
|
}
|
|
|
|
|
@@ -1363,7 +1363,7 @@ func PublishChapterReport(reportInfo *models.Report, reportUrl string, sysUser *
|
|
|
|
|
|
// 生成报告pdf和长图
|
|
|
{
|
|
|
- reportPdfUrl := GetGeneralPdfUrl(reportInfo.ReportCode, reportInfo.ReportLayout)
|
|
|
+ reportPdfUrl := GetGeneralPdfUrl(reportInfo.Id, reportInfo.ReportCode, reportInfo.ReportLayout)
|
|
|
go Report2pdfAndJpeg(reportPdfUrl, reportId, 1)
|
|
|
}
|
|
|
|
|
@@ -1524,7 +1524,7 @@ func UpdateReportVideo(reportInfo *models.Report) {
|
|
|
// @param reportCode string
|
|
|
// @param reportLayout int8
|
|
|
// @return pdfUrl string
|
|
|
-func GetGeneralPdfUrl(reportCode string, reportLayout int8) (pdfUrl string) {
|
|
|
+func GetGeneralPdfUrl(reportId int, reportCode string, reportLayout int8) (pdfUrl string) {
|
|
|
conf, e := models.GetBusinessConfByKey("ReportViewUrl")
|
|
|
if e != nil {
|
|
|
return
|
|
@@ -1539,87 +1539,17 @@ func GetGeneralPdfUrl(reportCode string, reportLayout int8) (pdfUrl string) {
|
|
|
pdfUrl = fmt.Sprintf("%s/reportshare_smart_pdf?code=%s", conf.ConfVal, reportCode)
|
|
|
}
|
|
|
|
|
|
- return
|
|
|
-}
|
|
|
-
|
|
|
-// GetReportShareUrlToken 获取报告分享链接token
|
|
|
-func GetReportShareUrlToken(req models.ReportShartUrlReq, adminId int) (linkToken string, err error) {
|
|
|
- cacheLinkKey := utils.CACHE_REPORT_SHARE_SHORT_Url + strconv.Itoa(req.ReportId) + "userId:" + strconv.Itoa(adminId)
|
|
|
- linkToken, _ = utils.Rc.RedisString(cacheLinkKey)
|
|
|
- if linkToken != "" && utils.Rc.IsExist(fmt.Sprint(utils.CACHE_REPORT_SHARE_ORIGIN_Url, utils.MD5(linkToken))) {
|
|
|
- return
|
|
|
- }
|
|
|
- var tokenKey string
|
|
|
-
|
|
|
- var ok bool
|
|
|
- // 冲突检测
|
|
|
- for i := 0; i < 3; i++ {
|
|
|
- linkToken = req.Url
|
|
|
- if i > 0 {
|
|
|
- linkToken += "_" + utils.GetRandDigit(3)
|
|
|
- }
|
|
|
- hashUrl := utils.MurmurHash64([]byte(linkToken))
|
|
|
- linkToken = utils.ConvertNumToBase62(hashUrl)
|
|
|
- // 拼上报告标题
|
|
|
- //linkToken = fmt.Sprintf("%s %s", linkToken, req.Title)
|
|
|
-
|
|
|
- tokenKey = fmt.Sprint(utils.CACHE_REPORT_SHARE_ORIGIN_Url, utils.MD5(linkToken))
|
|
|
- ok = utils.Rc.IsExist(tokenKey)
|
|
|
- if !ok {
|
|
|
- break
|
|
|
- }
|
|
|
- }
|
|
|
- if !ok {
|
|
|
- after := time.Now().AddDate(0, 0, 7)
|
|
|
- err = utils.Rc.Put(cacheLinkKey, linkToken, time.Until(after))
|
|
|
- if err != nil {
|
|
|
- return
|
|
|
- }
|
|
|
- err = utils.Rc.Put(tokenKey, req.Url, time.Until(after))
|
|
|
- if err != nil {
|
|
|
- return
|
|
|
+ if pdfUrl != "" {
|
|
|
+ token := utils.MD5(fmt.Sprint(pdfUrl, time.Now().UnixNano()/1e6))
|
|
|
+ e := generalReportAuthToken(token, ``, reportId)
|
|
|
+ if e == nil {
|
|
|
+ pdfUrl = fmt.Sprintf("%s&authToken=%s", pdfUrl, token)
|
|
|
}
|
|
|
- } else {
|
|
|
- linkToken = ""
|
|
|
- err = errors.New("生成链接失败")
|
|
|
}
|
|
|
- return
|
|
|
-}
|
|
|
|
|
|
-func TransfromToOriginUrl(linkToken string) (originLink string, msg string, err error) {
|
|
|
- cacheLinkKey := fmt.Sprint(utils.CACHE_REPORT_SHARE_ORIGIN_Url, utils.MD5(linkToken))
|
|
|
- originLink, err = utils.Rc.RedisString(cacheLinkKey)
|
|
|
- if err != nil {
|
|
|
- if err == redis.Nil {
|
|
|
- msg = "链接已失效, 请重新获取"
|
|
|
- return
|
|
|
- }
|
|
|
- msg = "获取链接失败"
|
|
|
- return
|
|
|
- }
|
|
|
- if originLink == "" {
|
|
|
- msg = "链接已失效, 请重新获取"
|
|
|
- return
|
|
|
- }
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-func FilterShareUrl() web.FilterFunc {
|
|
|
- return func(c *context.Context) {
|
|
|
- path := c.Input.Context.Request.URL.Path
|
|
|
- tokenArr := strings.Split(path, "/")
|
|
|
- token := tokenArr[len(tokenArr)-1]
|
|
|
-
|
|
|
- newPath := "/v1/report/share/link"
|
|
|
- q := c.Input.Context.Request.URL.Query()
|
|
|
- q.Add("Token", token)
|
|
|
- c.Input.Context.Request.URL.Path = newPath
|
|
|
- c.Input.Context.Request.URL.RawQuery = q.Encode()
|
|
|
-
|
|
|
- utils.ApiLog.Info(fmt.Sprintf("原始请求为:%s, 已修改请求路径为:%s?%s", path, newPath, q.Encode()))
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
// HandleReportContent
|
|
|
// @Description: 处理报告内容(动态图表/表格添加授权token)
|
|
|
// @author: Roc
|
|
@@ -1711,17 +1641,18 @@ func linkAddToken(link string, tokenMap map[string]string) string {
|
|
|
}
|
|
|
|
|
|
// 避免报告里面一个图表/表格重复生成token
|
|
|
+ var token string
|
|
|
key := fmt.Sprint(showType, `:`, code)
|
|
|
if tokenMap != nil {
|
|
|
- if token, ok := tokenMap[key]; ok {
|
|
|
- // 在链接后面添加一个token值
|
|
|
- return link + "&authToken=" + token
|
|
|
- }
|
|
|
+ token = tokenMap[key]
|
|
|
}
|
|
|
|
|
|
- token, err := GeneralChartToken(showType, code, 30*time.Minute)
|
|
|
- if err != nil {
|
|
|
- return link
|
|
|
+ // 如果之前没有token,那么就重新生成token
|
|
|
+ if token == `` {
|
|
|
+ token, err = GeneralChartToken(showType, code, 30*time.Minute)
|
|
|
+ if err != nil {
|
|
|
+ return link
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if tokenMap != nil {
|
|
@@ -1729,7 +1660,12 @@ func linkAddToken(link string, tokenMap map[string]string) string {
|
|
|
}
|
|
|
|
|
|
// 在链接后面添加一个token值
|
|
|
- return link + "&authToken=" + token
|
|
|
+ queryParams.Add("authToken", token)
|
|
|
+
|
|
|
+ // 更新URL的查询参数
|
|
|
+ parsedURL.RawQuery = queryParams.Encode()
|
|
|
+
|
|
|
+ return parsedURL.String()
|
|
|
}
|
|
|
|
|
|
// linkDelToken 链接添加token
|
|
@@ -1775,6 +1711,80 @@ func GeneralChartToken(showType, uniqueCode string, expireTime time.Duration) (t
|
|
|
return
|
|
|
}
|
|
|
|
|
|
+// GeneralReportToken
|
|
|
+// @Description: 生成报告授权token
|
|
|
+// @author: Roc
|
|
|
+// @datetime 2025-01-07 10:41:36
|
|
|
+// @param uniqueCode string
|
|
|
+// @return token string
|
|
|
+// @return err error
|
|
|
+func GeneralReportToken(linkToken string, reportId int) (token string, err error) {
|
|
|
+ // 图表授权token
|
|
|
+ token = utils.MD5(fmt.Sprint(linkToken, time.Now().UnixNano()/1e6))
|
|
|
+
|
|
|
+ // 缓存key
|
|
|
+ reportKey := getReportShareTokenKey(linkToken)
|
|
|
+ err = utils.Rc.Put(reportKey, token, utils.BusinessConfReportChartExpiredTime)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 生成报告的图表授权token
|
|
|
+ err = generalReportAuthToken(token, ``, reportId)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// generalReportAuthToken
|
|
|
+// @Description: 生成报告的图表授权token
|
|
|
+// @author: Roc
|
|
|
+// @datetime 2025-03-17 17:47:07
|
|
|
+// @param token string
|
|
|
+// @param reportId int
|
|
|
+// @return err error
|
|
|
+func generalReportAuthToken(token, source string, reportId int) (err error) {
|
|
|
+ // 缓存key
|
|
|
+ reportTokenKey := getReportTokenKey(token, source)
|
|
|
+ err = utils.Rc.Put(reportTokenKey, reportId, utils.BusinessConfReportChartExpiredTime)
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// getReportShareTokenKey
|
|
|
+// @Description:
|
|
|
+// @author: Roc
|
|
|
+// @datetime 2025-03-17 14:00:14
|
|
|
+// @param linkToken string
|
|
|
+// @return string
|
|
|
+func getReportShareTokenKey(linkToken string) string {
|
|
|
+ return fmt.Sprint(utils.CACHE_REPORT_SHARE_AUTH, utils.MD5(linkToken))
|
|
|
+}
|
|
|
+
|
|
|
+// GetReportAuthToken
|
|
|
+// @Description: 获取报告token
|
|
|
+// @author: Roc
|
|
|
+// @datetime 2025-03-17 16:48:38
|
|
|
+// @param linkToken string
|
|
|
+// @return string
|
|
|
+func GetReportAuthToken(linkToken string) string {
|
|
|
+ key := getReportShareTokenKey(linkToken)
|
|
|
+ return utils.Rc.GetStr(key)
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+// getReportTokenKey
|
|
|
+// @Description:
|
|
|
+// @author: Roc
|
|
|
+// @datetime 2025-03-17 14:00:14
|
|
|
+// @param linkToken string
|
|
|
+// @return string
|
|
|
+func getReportTokenKey(token, source string) string {
|
|
|
+ return fmt.Sprint(utils.CACHE_REPORT_AUTH, source, token)
|
|
|
+}
|
|
|
+
|
|
|
// HandleReportContentStruct
|
|
|
// @Description: 处理内容组件的链接
|
|
|
// @author: Roc
|
|
@@ -1846,3 +1856,92 @@ func processMap(data map[string]interface{}, opType string, tokenMap map[string]
|
|
|
}
|
|
|
return nil
|
|
|
}
|
|
|
+
|
|
|
+// GetReportShareUrlToken 获取报告分享链接token
|
|
|
+func GetReportShareUrlToken(req models.ReportShartUrlReq, adminId int) (linkToken string, err error) {
|
|
|
+ defer func() {
|
|
|
+ if err == nil && linkToken != `` {
|
|
|
+ GeneralReportToken(linkToken, req.ReportId)
|
|
|
+ }
|
|
|
+ }()
|
|
|
+ cacheLinkKey := utils.CACHE_REPORT_SHARE_SHORT_Url + strconv.Itoa(req.ReportId) + "userId:" + strconv.Itoa(adminId)
|
|
|
+ linkToken, _ = utils.Rc.RedisString(cacheLinkKey)
|
|
|
+ if linkToken != "" && utils.Rc.IsExist(fmt.Sprint(utils.CACHE_REPORT_SHARE_ORIGIN_Url, utils.MD5(linkToken))) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ var tokenKey string
|
|
|
+
|
|
|
+ var ok bool
|
|
|
+ // 冲突检测
|
|
|
+ for i := 0; i < 3; i++ {
|
|
|
+ linkToken = req.Url
|
|
|
+ if i > 0 {
|
|
|
+ linkToken += "_" + utils.GetRandDigit(3)
|
|
|
+ }
|
|
|
+ hashUrl := utils.MurmurHash64([]byte(linkToken))
|
|
|
+ linkToken = utils.ConvertNumToBase62(hashUrl)
|
|
|
+ // 拼上报告标题
|
|
|
+ //linkToken = fmt.Sprintf("%s %s", linkToken, req.Title)
|
|
|
+
|
|
|
+ tokenKey = fmt.Sprint(utils.CACHE_REPORT_SHARE_ORIGIN_Url, utils.MD5(linkToken))
|
|
|
+ ok = utils.Rc.IsExist(tokenKey)
|
|
|
+ if !ok {
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if !ok {
|
|
|
+ after := time.Now().AddDate(0, 0, 7)
|
|
|
+ err = utils.Rc.Put(cacheLinkKey, linkToken, time.Until(after))
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ err = utils.Rc.Put(tokenKey, req.Url, time.Until(after))
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ linkToken = ""
|
|
|
+ err = errors.New("生成链接失败")
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func TransfromToOriginUrl(linkToken string) (originLink string, msg string, err error) {
|
|
|
+ cacheLinkKey := fmt.Sprint(utils.CACHE_REPORT_SHARE_ORIGIN_Url, utils.MD5(linkToken))
|
|
|
+ originLink, err = utils.Rc.RedisString(cacheLinkKey)
|
|
|
+ if err != nil {
|
|
|
+ if err == redis.Nil {
|
|
|
+ msg = "链接已失效, 请重新获取"
|
|
|
+ return
|
|
|
+ }
|
|
|
+ msg = "获取链接失败"
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if originLink == "" {
|
|
|
+ msg = "链接已失效, 请重新获取"
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ reportToken := GetReportAuthToken(linkToken)
|
|
|
+ if reportToken != "" {
|
|
|
+ originLink += `&authToken=` + reportToken
|
|
|
+ }
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func FilterShareUrl() web.FilterFunc {
|
|
|
+ return func(c *context.Context) {
|
|
|
+ path := c.Input.Context.Request.URL.Path
|
|
|
+ tokenArr := strings.Split(path, "/")
|
|
|
+ token := tokenArr[len(tokenArr)-1]
|
|
|
+
|
|
|
+ newPath := "/v1/report/share/link"
|
|
|
+ q := c.Input.Context.Request.URL.Query()
|
|
|
+ q.Add("Token", token)
|
|
|
+ c.Input.Context.Request.URL.Path = newPath
|
|
|
+ c.Input.Context.Request.URL.RawQuery = q.Encode()
|
|
|
+
|
|
|
+ utils.ApiLog.Info(fmt.Sprintf("原始请求为:%s, 已修改请求路径为:%s?%s", path, newPath, q.Encode()))
|
|
|
+ }
|
|
|
+}
|