wangkaiyue пре 1 година
родитељ
комит
edcdf3cfea

+ 2 - 0
internal/cmd/cmd.go

@@ -31,6 +31,8 @@ var (
 				group.GET("/tags/industry/all.html", controller.IndustryIndexHandler)                                                         //行业首页
 				group.GET("/tags/industry/{industryClassId}_{areaCode}_{sTypeId}_{keyWordId}.html", controller.IndustryListHandler)           //行业列表
 				group.GET("/tags/industry/{industryClassId}_{areaCode}_{sTypeId}_{keyWordId}_{pageNum}.html", controller.IndustryListHandler) //行业列表
+
+				group.GET("/tags/area/{areaCode}_{siteCode}.html", controller.STypePageHandler) //信息类型
 			})
 			s.AddStaticPath("/jyseo", "/resource/staticres") //静态资源
 			s.Run()

+ 20 - 0
internal/consts/vars.go

@@ -0,0 +1,20 @@
+package consts
+
+import (
+	"context"
+	"github.com/gogf/gf/v2/frame/g"
+)
+
+var (
+	SettingPageSize           = g.Cfg().MustGet(context.Background(), "listPageSetting.pageSize").Int()
+	BiddingListMaxTotal       = g.Cfg().MustGet(context.Background(), "listPageSetting.maxBidSize", 5000).Int()
+	IndustryWordsListMaxTotal = g.Cfg().MustGet(context.Background(), "listPageSetting.keywordSize", 200).Int()
+	KeyWordSiteMaxTotal       = g.Cfg().MustGet(context.Background(), "listPageSetting.KeyWordSiteMaxTotal", 300).Int()
+	SettingBidCacheTime       = g.Cfg().MustGet(context.Background(), "listPageSetting.cacheTime").Int64()
+	TopTypeMap                = map[string]string{
+		"招标预告":   "预告",
+		"招标公告":   "招标",
+		"招标结果":   "结果",
+		"招标信用信息": "其它",
+	}
+)

+ 2 - 1
internal/controller/area.go

@@ -5,6 +5,7 @@ import (
 	"github.com/gogf/gf/v2/frame/g"
 	"github.com/gogf/gf/v2/net/ghttp"
 	"github.com/gogf/gf/v2/util/gconv"
+	"jyseo/internal/consts"
 	"jyseo/internal/service"
 	"jyseo/utility"
 )
@@ -43,7 +44,7 @@ func AreaPageHandler(r *ghttp.Request) {
 		return
 	}
 	// 查询数据
-	rData, err := service.NewBiddingQuery().EquipArea(areaNode).EquipSType(sTypeNode).GetBidListList(r.Context(), pageNum, service.BiddingListMaxTotal)
+	rData, err := service.NewBiddingQuery().EquipArea(areaNode).EquipSType(sTypeNode).GetBidListList(r.Context(), pageNum, consts.BiddingListMaxTotal)
 	if err != nil {
 		g.Log().Errorf(r.Context(), err.Error())
 		service.HtmlRender.RenderError(r, fmt.Errorf("获取列表数据异常"))

+ 2 - 1
internal/controller/industry.go

@@ -5,6 +5,7 @@ import (
 	"github.com/gogf/gf/v2/frame/g"
 	"github.com/gogf/gf/v2/net/ghttp"
 	"github.com/gogf/gf/v2/util/gconv"
+	"jyseo/internal/consts"
 	"jyseo/internal/service"
 	"jyseo/utility"
 )
@@ -30,7 +31,7 @@ func IndustryListHandler(r *ghttp.Request) {
 		service.HtmlRender.RenderError(r, fmt.Errorf("页面不存在"))
 		return
 	}
-	rData, err := service.NewBiddingQuery().EquipKeyWord(keyWordStruct.KeyWord).GetBidListList(r.Context(), pageNum, service.KeyWordsListMaxTotal)
+	rData, err := service.NewBiddingQuery().EquipKeyWord(keyWordStruct.KeyWord).GetBidListList(r.Context(), pageNum, consts.IndustryWordsListMaxTotal)
 	if err != nil {
 		g.Log().Errorf(r.Context(), err.Error())
 		service.HtmlRender.RenderError(r, fmt.Errorf("获取列表数据异常"))

+ 39 - 0
internal/controller/keywordSite.go

@@ -0,0 +1,39 @@
+package controller
+
+import (
+	"fmt"
+	"github.com/gogf/gf/v2/frame/g"
+	"github.com/gogf/gf/v2/net/ghttp"
+	"jyseo/internal/consts"
+	"jyseo/internal/service"
+	"jyseo/utility"
+)
+
+// SiteHandler 地区站首页
+func SiteHandler(r *ghttp.Request) {
+	areaCode := r.Get("areaCode").String()
+	siteCode := r.Get("siteCode").String()
+
+	areaNode := service.JySeoAreaRoot.GetNodeByCode(areaCode)
+	siteNode := service.JySeoKeyWordSiteRoot.GetAllSiteNodeByCode(siteCode)
+
+	if areaNode == nil || siteNode == nil {
+		service.HtmlRender.RenderError(r, fmt.Errorf("页面不存在"))
+		return
+	}
+
+	rData, err := service.NewBiddingQuery().EquipKeyWord(siteNode.KeyWord).GetBidListList(r.Context(), 1, consts.KeyWordSiteMaxTotal)
+	if err != nil {
+		g.Log().Errorf(r.Context(), err.Error())
+		service.HtmlRender.RenderError(r, fmt.Errorf("获取列表数据异常"))
+		return
+	}
+
+	service.HtmlRender.Render(r, utility.GetCommonRenderPatch(r.Request.UserAgent(), "keywordSite_list.html"),
+		g.Map{
+			"list":     rData.List,
+			"siteNode": siteNode,
+			"areaNode": areaNode,
+			"tdk":      service.JySeoTdk.GetKeyWordSiteListTdk(r.Context(), siteNode.Code, areaNode.Name),
+		})
+}

+ 2 - 1
internal/controller/stype.go

@@ -5,6 +5,7 @@ import (
 	"github.com/gogf/gf/v2/frame/g"
 	"github.com/gogf/gf/v2/net/ghttp"
 	"github.com/gogf/gf/v2/util/gconv"
+	"jyseo/internal/consts"
 	"jyseo/internal/service"
 	"jyseo/utility"
 )
@@ -18,7 +19,7 @@ func STypePageHandler(r *ghttp.Request) {
 		return
 	}
 	// 查询数据
-	rData, err := service.NewBiddingQuery().EquipSType(sNode).GetBidListList(r.Context(), pageNum, service.BiddingListMaxTotal)
+	rData, err := service.NewBiddingQuery().EquipSType(sNode).GetBidListList(r.Context(), pageNum, consts.BiddingListMaxTotal)
 	if err != nil {
 		g.Log().Errorf(r.Context(), err.Error())
 		service.HtmlRender.RenderError(r, fmt.Errorf("获取列表数据异常"))

+ 54 - 0
internal/service/keyWordSiteStruct.go

@@ -0,0 +1,54 @@
+package service
+
+import (
+	"context"
+	"github.com/gogf/gf/v2/frame/g"
+	"github.com/gogf/gf/v2/os/gctx"
+	"github.com/gogf/gf/v2/util/gconv"
+)
+
+var (
+	JySeoKeyWordSiteRoot *KeyWordSiteRoot = &KeyWordSiteRoot{}
+)
+
+type (
+	KeyWordSiteRoot struct {
+		SiteCodeMap map[string]*KeyWordSiteNode //省份直辖市简称对照
+		SiteArr     []*KeyWordSiteNode
+	}
+
+	KeyWordSiteNode struct {
+		Code    string `json:"code" doc:"代码"`
+		Name    string `json:"name" doc:"名称"`
+		KeyWord string `json:"keyWord" doc:"对应关键词"`
+	}
+)
+
+func init() {
+	JySeoKeyWordSiteRoot.LoadSiteFromConf(gctx.New())
+}
+
+func (sRoot *KeyWordSiteRoot) LoadSiteFromConf(ctx context.Context) {
+	siteCodeMap := map[string]*KeyWordSiteNode{}
+	var siteArr []*KeyWordSiteNode
+	for _, m := range g.Cfg("global").MustGet(context.Background(), "KeyWordSiteModule").Maps() {
+		node := &KeyWordSiteNode{
+			Code:    gconv.String(m["code"]),
+			Name:    gconv.String(m["name"]),
+			KeyWord: gconv.String(m["keyWord"]),
+		}
+		siteArr = append(siteArr, node)
+		siteCodeMap[node.Code] = node
+	}
+
+	sRoot.SiteArr = siteArr
+	sRoot.SiteCodeMap = siteCodeMap
+}
+
+func (sRoot *KeyWordSiteRoot) GetAllSiteNode() []*KeyWordSiteNode {
+	return sRoot.SiteArr
+}
+
+func (sRoot *KeyWordSiteRoot) GetAllSiteNodeByCode(code string) *KeyWordSiteNode {
+	return sRoot.SiteCodeMap[code]
+}

+ 2 - 1
internal/service/paging.go

@@ -2,6 +2,7 @@ package service
 
 import (
 	"fmt"
+	"jyseo/internal/consts"
 	"strconv"
 )
 
@@ -39,7 +40,7 @@ func GetLetterPaging(currentPage, totalPage int, href string) (pagingMap *Pagina
 		PagingHtml: PaggingHtml(currentPage, totalPage, href),
 		PageNum:    currentPage,
 		PageCount:  totalPage,
-		PageSize:   SettingPageSize,
+		PageSize:   consts.SettingPageSize,
 		UrlFormat:  href,
 	}
 

+ 8 - 20
internal/service/queryStruct.go

@@ -7,6 +7,7 @@ import (
 	"github.com/gogf/gf/v2/container/gvar"
 	"github.com/gogf/gf/v2/frame/g"
 	"github.com/gogf/gf/v2/util/gconv"
+	"jyseo/internal/consts"
 	"jyseo/utility"
 )
 
@@ -37,19 +38,6 @@ type (
 	}
 )
 
-var (
-	SettingPageSize      = g.Cfg().MustGet(context.Background(), "listPageSetting.pageSize").Int()
-	KeyWordsListMaxTotal = g.Cfg().MustGet(context.Background(), "listPageSetting.keywordSize", 200).Int()
-	BiddingListMaxTotal  = g.Cfg().MustGet(context.Background(), "listPageSetting.maxBidSize", 5000).Int()
-	SettingBidCacheTime  = g.Cfg().MustGet(context.Background(), "listPageSetting.cacheTime").Int64()
-	topTypeMap           = map[string]string{
-		"招标预告":   "预告",
-		"招标公告":   "招标",
-		"招标结果":   "结果",
-		"招标信用信息": "其它",
-	}
-)
-
 func NewBiddingQuery() *SeoBiddingQuery {
 	return &SeoBiddingQuery{}
 }
@@ -97,7 +85,7 @@ func (query *SeoBiddingQuery) getResult(ctx context.Context, total int) (int, []
 	}
 
 	if query.topType != "" {
-		if val, _ := topTypeMap[query.topType]; val != "" {
+		if val, _ := consts.TopTypeMap[query.topType]; val != "" {
 			sql += " AND b.toptype=? "
 			values = append(values, val)
 		} else {
@@ -176,7 +164,7 @@ func (query *SeoBiddingQuery) dataFormat(data []map[string]interface{}) (bList [
 
 // getBidListCacheKey 获取列表缓存
 func (query *SeoBiddingQuery) getBidListCacheKey(pageNum, maxTotal int) string {
-	return fmt.Sprintf("JySeoListCache_%d_%d/%d_%s_%s_%s_%s_%s", SettingPageSize, pageNum, maxTotal, query.keys, query.area, query.city, query.topType, query.subType)
+	return fmt.Sprintf("JySeoListCache_%d_%d/%d_%s_%s_%s_%s_%s", consts.SettingPageSize, pageNum, maxTotal, query.keys, query.area, query.city, query.topType, query.subType)
 }
 
 // GetBidListList 列表页查询
@@ -199,12 +187,12 @@ func (query *SeoBiddingQuery) GetBidListList(ctx context.Context, pageNum, maxTo
 			count = maxTotal
 		}
 		if data != nil && len(data) > 0 && gconv.Int(count) == len(data) {
-			totalPage, formatData := count/SettingPageSize, query.dataFormat(data)
-			if count%SettingPageSize != 0 {
+			totalPage, formatData := count/consts.SettingPageSize, query.dataFormat(data)
+			if count%consts.SettingPageSize != 0 {
 				totalPage++
 			}
 			for i := 1; i <= gconv.Int(totalPage); i++ {
-				start, end := (i-1)*SettingPageSize, (i)*SettingPageSize
+				start, end := (i-1)*consts.SettingPageSize, (i)*consts.SettingPageSize
 				if end > count {
 					end = count
 				}
@@ -215,7 +203,7 @@ func (query *SeoBiddingQuery) GetBidListList(ctx context.Context, pageNum, maxTo
 				if i == pageNum {
 					res = pageTmp
 				}
-				if err := g.Redis().SetEX(ctx, query.getBidListCacheKey(i, maxTotal), pageTmp, SettingBidCacheTime); err != nil {
+				if err := g.Redis().SetEX(ctx, query.getBidListCacheKey(i, maxTotal), pageTmp, consts.SettingBidCacheTime); err != nil {
 					g.Log().Errorf(ctx, "第%d页数据 存储redis err:%v", err)
 				}
 			}
@@ -248,7 +236,7 @@ func (query *SeoBiddingQuery) GetTabData(ctx context.Context, total int) (res []
 		if data != nil && len(data) > 0 {
 			res = query.dataFormat(data)
 		}
-		if err := g.Redis().SetEX(ctx, cacheKey, res, SettingBidCacheTime); err != nil {
+		if err := g.Redis().SetEX(ctx, cacheKey, res, consts.SettingBidCacheTime); err != nil {
 			g.Log().Errorf(ctx, "GetTabData 存储redis err:%v", err)
 		}
 	} else {

+ 2 - 1
internal/service/strategy.go

@@ -6,6 +6,7 @@ import (
 	"fmt"
 	"github.com/gogf/gf/v2/frame/g"
 	"html/template"
+	"jyseo/internal/consts"
 	"jyseo/utility"
 	"time"
 
@@ -118,6 +119,6 @@ func GetStrategyList(num int) (res []*InfoList) {
 			v["_id"] = se.EncodeString(gconv.String(v["_id"]))
 		}
 	}
-	_ = g.Redis().SetEX(ctx, cacheKey, res, SettingBidCacheTime)
+	_ = g.Redis().SetEX(ctx, cacheKey, res, consts.SettingBidCacheTime)
 	return res
 }

+ 12 - 0
internal/service/tdk.go

@@ -80,3 +80,15 @@ func (*jySeoTdk) GetIndustryTdk(ctx context.Context, name string) *TDK {
 		Description: fmt.Sprintf("剑鱼标讯%s专栏,是%s招标采购的免费信息平台,免费提供%s招标采购信息、招标公告,中标结果等所有%s相关的招投标信息,寻找优质免费%s招标信息网站,就用剑鱼标讯!", area_name, area_name, area_name, area_name, area_name),
 	}
 }
+
+// GetKeyWordSiteListTdk 获取聚合页面TDK
+func (*jySeoTdk) GetKeyWordSiteListTdk(ctx context.Context, code, areaName string) *TDK {
+	title := g.Cfg("tdk").MustGet(ctx, fmt.Sprintf("keywordSiteTdk.%s.TITLE", code)).String()
+	keywords := g.Cfg("tdk").MustGet(ctx, fmt.Sprintf("keywordSiteTdk.%s.KEYWORDS", code)).String()
+	description := g.Cfg("tdk").MustGet(ctx, fmt.Sprintf("keywordSiteTdk.%s.DESCRIPTION", code)).String()
+	return &TDK{
+		Title:       strings.ReplaceAll(title, "{地区}", areaName),
+		KeyWords:    strings.ReplaceAll(keywords, "{地区}", areaName),
+		Description: strings.ReplaceAll(description, "{地区}", areaName),
+	}
+}

+ 15 - 0
manifest/config/global.yaml

@@ -1532,3 +1532,18 @@ allSTypeTree:
 #    id: "05"
 #    alias: "拟建项目"
 #    code: NJXM
+
+
+KeyWordSiteModule:
+  - name: 公共资源交易中心
+    code: "1"
+    keyWord: 公共资源交易中心
+  - name: 工程造价信息网
+    code: "2"
+    keyWord: 造价
+  - name: 政府采购网
+    code: "3"
+    keyWord: 政府采购
+  - name: 建筑工程信息网
+    code: "4"
+    keyWord: 工程信息

+ 18 - 0
manifest/config/tdk.yaml

@@ -123,3 +123,21 @@ areaSTypeTdk:
     TITLE: '{地区}招标采购拟建项目信息查询网-剑鱼标讯'
     KEYWORDS: '{地区}招标拟建项目,{地区}投标拟建项目,{地区}采购拟建项目查询'
     DESCRIPTION: '剑鱼标讯{地区}招标拟建项目查询专栏,免费提供{地区}招标拟建项目信息内容,寻找优质免费{地区}招标拟建项目查询网站,就用剑鱼标讯!'
+
+keywordSiteTdk:
+  "公共资源交易中心":
+    TITLE: '{地区}公共资源交易信息网_{地区}公共交易资源平台中心-剑鱼标讯官网'
+    KEYWORDS: '{地区}公共资源交易网,{地区}公共交易资源平台,{地区}公共资源交易信息,{地区}公共交易资源中心'
+    DESCRIPTION: '剑鱼标讯官网{地区}公共资源交易专栏,提供最新的{地区}免费公共交易资源信息、相关招标公告、中标公告和招标采购等内容,免费进行信息搜索查询、订阅推送和数据定制化服务,每天实时更新{地区}公共资源交易信息,随时随地免费查看。'
+  "造价中心":
+    TITLE: '{地区}造价信息网_{地区}造价信息查询中心-剑鱼标讯官网'
+    KEYWORDS: '{地区}造价信息,{地区}造价信息网,{地区}造价信息中心,{地区}造价信息查询'
+    DESCRIPTION: '剑鱼标讯官网{地区}造价信息专栏,提供最新的{地区}免费造价信息、相关公告、结果等内容,免费进行信息搜索查询、订阅推送和数据定制化服务,每天实时更新{地区}造价信息,随时随地免费查看。'
+  "政府采购网":
+    TITLE: '{地区}政府采购信息网_{地区}政府采购招标查询平台中心-剑鱼标讯官网'
+    KEYWORDS: '{地区}政府采购网,{地区}政府采购信息,{地区}政府采购查询,{地区}政府采购平台'
+    DESCRIPTION: '剑鱼标讯官网{地区}政府采购信息专栏,提供最新的{地区}免费政府采购信息、相关招标公告、采购结果等内容,免费进行信息搜索查询、订阅推送和数据定制化服务,每天实时更新{地区}政府采购信息,随时随地免费查看。'
+  "建筑工程信息网":
+    TITLE: '{地区}建筑工程信息网_{地区}建筑工程信息交易平台-剑鱼标讯官网'
+    KEYWORDS: '{地区}建筑工程信息网,{地区}建筑工程招标,{地区}工程信息交易平台'
+    DESCRIPTION: '剑鱼标讯官网{地区}建筑工程信息网专栏,提供最新的{地区}免费建筑工程信息、相关招标公告、中标公告和招标采购等内容,免费进行信息搜索查'