PageSourceSearch

https://www.szumao.com/src/api/content.js

js szumao.com collected 2026-10-09 00:48:45 UTC 33,373 bytes, 1,132 lines download raw bytes

1import apiAddress from '../constant/apiAddress.js'
2
3// import { timestampToTime } from '../function.js'
4// export function calcDataList(items, config) {
5//   items = items || []
6//   if (!Array.isArray(items)) items = []
7//   return items.map(item => calcDataItem(item, config))
8// }
9// export function calcDataItem(item, config) {
10//   let { children, subtitle, img, content_type } = config || {}
11//   subtitle = subtitle || 'subtitle'
12//   children = children || 'children'
13//   img = img || 'thumb'
14//   item.price = item.price || {}
15//   item.discount = item.discount || Array.isArray(item.discount) || {}
16//   let date_time = timestampToTime(item.show_time || item.add_time)
17//   // 处理product_attr_value格式为字符串,虽然不一定会用到
18//   if (item.product_attr_value && item.product_attr_value instanceof Object) {
19//     let key = Object.keys(item.product_attr_value)[0]
20//     item.product_attr_value = item.product_attr_value[key]
21//   }
22//   let data = {
23//     href: item.page_url_suffix || item.page_url || '',
24//     alt: item.title || '',
25//     title: item.title || '',
26//     subtitle: item[subtitle] || '',
27//     description: item.summary || '',
28//     img: item[img] || '',
29//     price_max: item.price.cost_min || 0,
30//     price_min: item.price.selling_min || 0,
31//     reads: item.reads || 0,
32//     children: item[children] || [],
33//     is_hot: item.is_hot || 0,
34//     is_new: item.is_new || 0,
35//     is_recommend: item.is_recommend || 0,
36//     discount_end_time: item.discount_end_time || 0,
37//     discount_start_time: item.discount_start_time || 0,
38//     max_discount: item.max_discount || 0,
39//     content_type: content_type || item.content_type || 'default',
40//     content_id: item.id || 0,
41//     id: item.id || 0,
42//   }
43//   // 限时折扣
44//   if (item.discount.start_time || item.discount.end_time) {
45//     data.discount_end_time = item.discount.end_time || 0
46//     data.discount_start_time = item.discount.start_time || 0
47//     if (item.discount.max_discount > 0) data.max_discount = item.discount.max_discount
48//     // const maxDiscountObj = item.price.price_list ? item.price.price_list.find(obj => obj.id === item.discount.max_discount_price_id) || {} : {}
49//     // data.price_min = maxDiscountObj.selling_price || data.price_min
50//     // data.price_max = maxDiscountObj.cost_price || data.price_max
51//   }
52//   // 价格处理为小数
53//   if (item.price_max) data.price_max = item.price_max
54//   else data.price_max = (data.price_max / 100).toFixed(2)
55//   if (item.price_min) data.price_min = item.price_min
56//   else data.price_min = (data.price_min / 100).toFixed(2)
57//   if (item.max_discount) data.max_discount = item.max_discount
58//   else data.max_discount = (1000 - data.max_discount) / 10
59//   // children
60//   data.children = data.children.map(son => calcDataItem(son, config))
61//   // return
62//   return data
63// }
64
65/** 站点地图-获取标签列表 */
66export async function getSitemapTagsList(ctx, params) {
67  return new Promise((resolve, reject) => {
68    ctx.state.request(ctx, {
69      name: '标签列表',
70      prefix: '/qqt',
71      url: apiAddress.contentTagsList,
72      method: 'GET',
73      params
74    })
75      .then(res => {
76        if (res.code === 0) resolve(res.data)
77        else console.error(res.msg)
78      })
79      .catch(error => reject(error))
80  })
81}
82
83/** 站点地图-获取站点栏目 */
84export async function getPageCategoryList(ctx, params) {
85  return new Promise((resolve, reject) => {
86    ctx.state.request(ctx, {
87      name: '页面栏目',
88      url: apiAddress.pageCategory,
89      method: 'GET',
90      params
91    })
92      .then(res => {
93        if (res.code === 0) resolve(res.data)
94        else console.error(res.msg)
95      })
96      .catch(error => reject(error))
97  })
98}
99
100/**
101 * 文章分页列表
102 */
103export function getArticleListPageBySearch(ctx, params) {
104  return new Promise((resolve, reject) => {
105    ctx.state.request(ctx, {
106      name: '站点文章',
107      url: apiAddress.articleListPageBySearch,
108      method: 'POST',
109      params
110    })
111      .then(res => resolve(res.data))
112      .catch(error => reject(error))
113  })
114}
115
116/**
117 * 视频分页列表
118 */
119export function getVideoListPageBySearch(ctx, params) {
120  return new Promise((resolve, reject) => {
121    ctx.state.request(ctx, {
122      name: '站点视频',
123      prefix: '/qqt',
124      url: apiAddress.videoListPageBySearch,
125      method: 'POST',
126      params
127    })
128      .then(res => resolve(res.data))
129      .catch(error => reject(error))
130  })
131}
132
133/**
134 * 聚合分页列表
135 */
136export function getPolymerizeList(ctx, params) {
137  return new Promise((resolve, reject) => {
138    ctx.state.request(ctx, {
139      name: '聚合列表',
140      url: apiAddress.polymerizeListPage,
141      method: 'POST',
142      params
143    })
144      .then(res => resolve(res.data))
145      .catch(error => reject(error))
146  })
147}
148
149/**
150 * 产品分页列表
151 */
152export function getProductListPageBySearch(ctx, params) {
153  return new Promise((resolve, reject) => {
154    ctx.state.request(ctx, {
155      url: apiAddress.productListPageBySearch,
156      method: 'POST',
157      params
158    })
159      .then(res => resolve(res.data))
160      .catch(error => reject(error))
161  })
162}
163
164export function getFAQListPageBySearch(ctx,params) {
165  return new Promise((resolve, reject) => {
166    ctx.state.request(ctx, {
167      name: '站点faq',
168      url: apiAddress.faqListPageBySearch,
169      method: 'POST',
170      params
171    })
172      .then(res => resolve(res.data))
173      .catch(error => reject(error))
174  })
175}
176
177export const getContent = {
178
179  /**
180   * 获取推荐内链
181   * @param ctx
182   * @param params
183   * @returns {Promise<unknown>}
184   */
185  'get-recommendLinks': function (ctx, params) {
186    return new Promise((resolve, reject) => {
187      const cacheParams = {
188        site_id: params.site_id,
189        page_type: params.page_type,
190        language_code: params.language_code
191      }
192      if (ctx.state.cache) {
193        const cache = ctx.state.cache.getApiData('content_internal_link', cacheParams)
194        if (cache) {
195          resolve(cache.data)
196          return
197        }
198      }
199      ctx.state.request(ctx, {
200        url: apiAddress.recommendLinks,
201        prefix: '/qqt',
202        method: 'GET',
203        params
204      }).then(res => {
205        if (ctx.state.cache) ctx.state.cache.fillApiData(res, 'content_internal_link', cacheParams)
206        resolve(res.data)
207      }).catch(error => reject(error))
208    })
209  },
210  /**
211   * 分类内容
212   * @param {string} ids 分类ID 多个用逗号隔开 1,2,3
213   * @param {int} page_size 列表数量
214   * 有children
215   */
216  // 'get-page_category': function (ctx, params) {
217  //   return new Promise((resolve, reject) => {
218  //     ctx.state.request(ctx, {
219  //       name: '分类内容',
220  //       url: apiAddress.categoryContent,
221  //       method: 'GET',
222  //       params
223  //     })
224  //       .then(res => resolve(calcDataList(res.data, { children: 'list' })))
225  //       .catch(error => reject(error))
226  //   })
227  // },
228  /**
229   * 更多产品
230   * @param {int} page_size 列表数量
231   * 有children
232   */
233  'get-moreProducts': function (ctx, params) {
234    return new Promise((resolve, reject) => {
235      ctx.state.request(ctx, {
236        name: '更多产品',
237        url: apiAddress.productMore,
238        method: 'GET',
239        params
240      })
241        .then(res => {
242          const contentList = new globalThis.Server.ContentList().product(
243            res.data,
244            { children: 'product' }
245          )
246          resolve(contentList)
247        })
248        .catch(error => reject(error))
249    })
250  },
251  /**
252   * 推荐栏目(右上角)
253   * @param {int} site_id	站点ID
254   * @param {int} relate_type	关联类型,2产品,3文章
255   * 只有栏目
256   */
257  'get-recommendCategory': function (ctx, params) {
258    return new Promise((resolve, reject) => {
259      const cacheParams = {
260        site_id: params.site_id,
261        content_type: params.content_type,
262        language_code: params.language_code,
263        list_length: params.page_size
264      }
265      if (ctx.query.force && ctx.query.force === 'html' && ctx.state.cache) {
266        const cache = ctx.state.cache.getApiData('content_recommend_category', cacheParams)
267        if (cache) {
268          resolve(new globalThis.Server.ContentList().product(cache.data))
269          return
270        }
271      }
272      ctx.state.request(ctx, {
273        name: '推荐栏目(右上角)',
274        url: apiAddress.recommendCategory,
275        method: 'GET',
276        params
277      })
278        .then(res => {
279          if (ctx.query.force && ctx.query.force === 'html' && ctx.state.cache) ctx.state.cache.fillApiData(res, 'content_recommend_category', cacheParams)
280          resolve(new globalThis.Server.ContentList().link(res.data))
281        })
282        .catch(error => reject(error))
283    })
284  },
285  /**
286   * 猜你喜欢
287   * @param {int} id 产品id
288   * @param {int} page_size 列表数量
289   */
290  'get-youMightLike': function (ctx, params) {
291    return new Promise((resolve, reject) => {
292      ctx.state.request(ctx, {
293        name: '猜你喜欢',
294        url: apiAddress.mightLike,
295        method: 'GET',
296        params
297      })
298        .then(res => {
299          const contentList = new globalThis.Server.ContentList().product(
300            res.data,
301            { subtitle: 'product_attr_value' }
302          )
303          resolve(contentList)
304        })
305        .catch(error => reject(error))
306    })
307  },
308  /**
309   * 推荐阅读
310   * @param {int} id 文章id
311   * @param {int} page_size 列表数量
312   */
313  'get-recommendReading': function (ctx, params) {
314    return new Promise((resolve, reject) => {
315      ctx.state.request(ctx, {
316        name: '推荐阅读',
317        url: apiAddress.recommendArticle,
318        method: 'GET',
319        params
320      })
321        .then(res => {
322          if (res.data.length > 0) {
323            let first = {}
324            for (var i = 0; i < res.data.length; i++) {
325              if (res.data[i].thumb) {
326                first = res.data[i]
327                res.data.splice(i, 1)
328                break
329              }
330            }
331            if (Object.keys(first).length > 0) res.data.unshift(first)
332          }
333          const contentList = new globalThis.Server.ContentList().article
333(
334            res.data
335          )
336          resolve(contentList)
337        })
338        .catch(error => reject(error))
339    })
340  },
341  /**
342   * 最新产品
343   * @param {int} page_size 列表数量
344   */
345  'get-latestProducts': function (ctx, params) {
346    return new Promise((resolve, reject) => {
347      const cacheParams = {
348        exclude_ai: params.exclude_ai,
349        content_type: params.content_type,
350        exclude_ids: [params.content_id],
351        list_length: params.page_size
352      }
353      if (ctx.state.cache) {
354        const cache = ctx.state.cache.getApiData('content_latest_products', cacheParams)
355        if (cache) {
356          resolve(new globalThis.Server.ContentList().product(cache.data))
357          return
358        }
359      }
360      // 取多一个做缓存
361      params.page_size ++
362
363      ctx.state.request(ctx, {
364        name: '最新产品',
365        url: apiAddress.latestProducts,
366        method: 'GET',
367        params
368      })
369        .then(res => {
370          if (ctx.state.cache) ctx.state.cache.fillApiData(res, 'content_latest_products', cacheParams)
371          resolve(new globalThis.Server.ContentList().product(res.data.length === params.page_size ? res.data.slice(0, -1) : res.data))
372        })
373        .catch(error => reject(error))
374    })
375  },
376  /**
377   * 热门文章
378   * @param {int} page_size 列表数量
379   */
380  'get-hotArticles': function (ctx, params) {
381    return new Promise((resolve, reject) => {
382      ctx.state.request(ctx, {
383        name: '热门文章',
384        url: apiAddress.hotArticle,
385        method: 'GET',
386        params
387      })
388        .then(res => {
389          const contentList = new globalThis.Server.ContentList().article
389(
390            res.data
391          )
392          resolve(contentList)
393        })
394        .catch(error => reject(error))
395    })
396  },
397  /**
398   * 热门专题
399   * @param {int} page_size 列表数量
400   */
401  'get-hotSpecial': function (ctx, params) {
402    return new Promise((resolve, reject) => {
403      ctx.state.request(ctx, {
404        name: '热门专题',
405        url: apiAddress.polymerizeSpecial,
406        method: 'GET',
407        params
408      })
409        .then(res => {
410          const contentList = new globalThis.Server.ContentList().polymerize(
411            res.data
412          )
413          resolve(contentList)
414        })
415        .catch(error => reject(error))
416    })
417  },
418  /**
419   * 最新专题
420   * @param {int} page_size 列表数量
421   */
422  'get-newSpecial': function (ctx, params) {
423    return new Promise((resolve, reject) => {
424      ctx.state.request(ctx, {
425        name: '最新专题',
426        url: apiAddress.polymerizeNew,
427        method: 'GET',
428        params
429      })
430        .then(res => {
431          const contentList = new globalThis.Server.ContentList().polymerize(res.data)
432          resolve(contentList)
433        })
434        .catch(error => reject(error))
435    })
436  },
437  /**
438  * 推荐视频
439   * @param {int} content_id 视频id
440  */
441  'get-recommendVideo': function (ctx, params) {
442    return new Promise((resolve, reject) => {
443      ctx.state.request(ctx, {
444        name: '推荐视频',
445        url: apiAddress.recommendVideo,
446        prefix: '/qqt',
447        method: 'GET',
448        params: {
449          site_id: params.site_id,
450          page_size: params.page_size,
451          content_id: params.content_id,
452          language_code: params.language_code,
453        }
454      })
455        .then(res => {
456          const contentList = new globalThis.Server.ContentList().video(
457            res.data,
458            { img: 'thumb_prefix' }
459          )
460          resolve(contentList)
461        })
462        .catch(error => reject(error))
463    })
464  },
465  /**
466   * 获取新版热卖产品-装修用
467   */
468  'get-products-hot': function (ctx, params) {
469    return new Promise((resolve, reject) => {
470      ctx.state.request(ctx, {
471        name: '热卖产品',
472        url: apiAddress.filterProduct,
473        method: 'GET',
474        params
475      })
476        .then(res => {
477          const contentList = new globalThis.Server.ContentList().product(
478            res.data
479          )
480          resolve(contentList)
481        })
482        .catch(error => reject(error))
483    })
484  },
485  /**
486   * 获取新版最新产品-装修用
487   */
488  'get-products-new': function (ctx, params) {
489    return new Promise((resolve, reject) => {
490      ctx.state.request(ctx, {
491        name: '最新产品',
492        url: apiAddress.filterProduct,
493        method: 'GET',
494        params
495      })
496        .then(res => {
497          const contentList = new globalThis.Server.ContentList().product(
498            res.data
499          )
500          resolve(contentList)
501        })
502        .catch(error => reject(error))
503    })
504  },
505  /**
506   * 获取新版推荐产品-装修用
507   */
508  'get-products-recommend': function (ctx, params) {
509    return new Promise((resolve, reject) => {
510      ctx.state.request(ctx, {
511        name: '推荐产品',
512        url: apiAddress.filterProduct,
513        method: 'GET',
514        params
515      })
516        .then(res => {
517          const contentList = new globalThis.Server.ContentList().product(
518            res.data
519          )
520          resolve(contentList)
521        })
522        .catch(error => reject(error))
523    })
524  },
525  /**
526   * 获取新版产品浏览历史-装修用
527   */
528  'get-products-history': function (ctx, params) {
529    return new Promise((resolve, reject) => {
530      ctx.state.request(ctx, {
531        name: '产品浏览历史',
532        url: apiAddress.filterProduct,
533        method: 'GET',
534        params
535      })
536        .then(res => {
537          const contentList = new globalThis.Server.ContentList().product(
538            res.data
539          )
540          resolve(contentList)
541        })
542        .catch(error => reject(error))
543    })
544  },
545  /**
546   * 获取栏目产品数据
547   */
548  'get-products-column': function (ctx, params) {
549    return new Promise((resolve, reject) => {
550      const cacheParams = {
551        site_id: params.site_id,
552        language_code: params.language_code,
553        page_type: params.page_type,
554        content_type: params.content_type,
555        page_category_id: params.page_category_id,
556        columns: params.columns,
557      }
558      const temp = {}
559      for (const [key, value] of Object.entries(params)) {
560        if (value !== '' && !['page_size', 'content_id'].includes(key)) {
561            temp[key] = value
562        }
563      }
564      const cacheValid = ctx.query.force && ctx.query.force === 'html' && ctx.state.cache && JSON.stringify(temp, Object.keys(temp).sort()) === JSON.stringify(cacheParams, Object.keys(cacheParams).sort())
565      if (cacheValid) {
566        cacheParams['list_length'] = params.page_size
567        const cache = ctx.state.cache.getApiData('content_products_column', cacheParams)
568        if (cache) {
569          resolve(new globalThis.Server.ContentList().product(cache.data))
570          return
571        }
572      }
573      ctx.state.request(ctx, {
574        name: '栏目产品',
575        url: apiAddress.filterProduct,
576        method: 'GET',
577        params
578      })
579        .then(res => {
580          if (cacheValid) ctx.state.cache.fillApiData(res, 'content_products_column', cacheParams)
581          resolve(new globalThis.Server.ContentList().product(res.data))
582        })
583        .catch(error => reject(error))
584    })
585  },
586  /**
587   * 获取相似产品
588   */
589  'get-products-similar': function (ctx, params) {
590    return new Promise((resolve, reject) => {
591      if (!params.tag_ids) {
592        resolve([])
593        return
594      }
595      ctx.state.request(ctx, {
596        name: '相似产品',
597        url: apiAddress.filterProduct,
598        method: 'GET',
599        params
600      })
601        .then(res => {
602          const contentList = new globalThis.Server.ContentList().product(
603            res.data
604          )
605          resolve(contentList)
606        })
607        .catch(error => reject(error))
608    })
609  },
610  /**
611  * 获取正在进行的限时折扣列表-装修用
612  */
613  'get-products-discount-now': function (ctx, params) {
614    return new Promise((resolve, reject) => {
615      ctx.state.request(ctx, {
616        name: '正在进行的限时折扣',
617        url: apiAddress.filterProduct,
618        method: 'GET',
619        params
620      })
621        .then(res => {
622          const contentList = new globalThis.Server.ContentList().product(
623            res.data
624          )
625          resolve(contentList)
626        })
627        .catch(error => reject(error))
628    })
629  },
630  /**
631  * 获取即将进行的限时折扣列表-装修用
632  */
633  'get-products-discount-upcoming': function (ctx, params) {
634    return new Promise((resolve, reject) => {
635      ctx.state.request(ctx, {
636        name: '即将进行的限时折扣列表',
637        url: apiAddress.filterProduct,
638        method: 'GET',
639        params
640      })
641        .then(res => {
642          const contentList = new globalThis.Server.ContentList().product(
643            res.data
644          )
645          resolve(contentList)
646        })
647        .catch(error => reject(error))
648    })
649  },
650  /** ai文章侧边用到的,阅读量最高的产品 */
651  'get-products-most-reads': function (ctx, params) {
652    return new Promise((resolve, reject) => {
653      ctx.state.request(ctx, {
654        name: '阅读量最高的产品',
655        url: apiAddress.filterProduct,
656        method: 'GET',
657        params
658      })
659        .then(res => {
660          const contentList = new globalThis.Server.ContentList().product(
661            res.data,
662            { subtitle: 'product_attr_value' }
663          )
664          resolve(contentList)
665        })
666        .catch(error => reject(error))
667    })
668  },
669  /**
670   * 获取新版关联产品
671   */
672  'get-products-related': function(ctx, params) {
673    return new Promise((resolve, reject) => {
674      const cacheParams = {
675        page_category_id: params.page_category_id,
676        content_type: params.content_type,
677        exclude_ids: [params.content_id],
678        list_length: params.page_size
679      }
680      if (ctx.query.force && ctx.query.force === 'html' && ctx.state.cache) {
681        const cache = ctx.state.cache.getApiData('content_products_related', cacheParams)
682        if (cache) {
683          resolve(new globalThis.Server.ContentList().product(cache.data))
684          return
685        }
686      }
687      // 取多一个做缓存
688      params.page_size ++
689
690      ctx.state.request(ctx, {
691        name: '关联产品',
692        url: apiAddress.relatedProduct,
693        method: 'GET',
694        params
695      })
696        .then(res => {
697          res.data = res.data || []
698          if (ctx.query.force && ctx.query.force === 'html' && ctx.state.cache) ctx.state.cache.fillApiData(res, 'content_products_related', cacheParams)
699          resolve(new globalThis.Server.ContentList().product(res.data.length === params.page_size ? res.data.slice(0, -1) : res.data))
700        })
701        .catch(error => reject(error))
702    })
703  },
704  /**
705   * 猜你喜欢的推荐栏目(产品)
706   */
707  'get-product-recommendCategory': function (ctx, params) {
708    return new Promise((resolve, reject) => {
709      ctx.state.request(ctx, {
710        name: '猜你喜欢-推荐栏目',
711        url: apiAddress.recommendCategory,
712        method: 'GET',
713        params: {
714          ...params,
715          content_type: '2,6'
716        }
717      })
718        .then(res => {
719          const contentList = new globalThis.Server.ContentList().link(
720            res.data
721          )
722          resolve(contentList)
723        })
724        .catch(error => reject(error))
725    })
726  },
727  /** 获取文章栏目列表 */
728  'get-article-category': function (ctx, params) {
729    return new Promise((resolve, reject) => {
730      ctx.state.request(ctx, {
731        name: '文章栏目列表',
732        url: apiAddress.articleListPageBySearch,
733        method: 'POST',
734        params
735      })
736        .then(res => {
737          const contentList = new globalThis.Server.ContentList().article(
738            res.data.list || res.data
739          )
740          resolve(contentList)
741        })
742        .catch(error => reject(error))
743    })
744  },
745  /** 获取文章栏目列表 */
746  'get-article-column': function (ctx, params) {
747    return new Promise((resolve, reject) => {
748      ctx.state.request(ctx, {
749        name: '文章栏目列表',
750        url: apiAddress.articleListPageBySearch,
751        method: 'POST',
752        params
753      })
754        .then(res => {
755          const contentList = new globalThis.Server.ContentList().article(
756            res.data.list || res.data
757          )
758          resolve(contentList)
759        })
760        .catch(error => reject(error))
761    })
762  },
763  /** 获取视频栏目列表 */
764  'get-video-column': function (ctx, params) {
765    return new Promise((resolve, reject) => {
766      ctx.state.request(ctx, {
767        name: '视频栏目列表',
768        prefix: '/qqt',
769        url: apiAddress.videoListPageBySearch,
770        method: 'POST',
771        params
772      })
773        .then(res => {
774          const contentList = new globalThis.Server.ContentList().video(
775            res.data.list || res.data
776          )
777          resolve(contentList)
778        })
779        .catch(error => reject(error))
780    })
781  },
782  /** 获取faq栏目列表 */
783  'get-faq-column': function (ctx, params) {
784    return new Promise((resolve, reject) => {
785      ctx.state.request(ctx, {
786        name: 'faq栏目列表',
787        url: apiAddress.faqListPageBySearch,
788        method: 'POST',
789        params: {
790          page_category_id: params.ids,
791          site_id: params.site_id,
792          language_code: params.language_code,
793          page_size: params.page_size
794        }
795      })
796        .then(res => {
797          const contentList = new globalThis.Server.ContentList().faq(
798            res.data.list || res.data
799          )
800          resolve(contentList)
801        })
802        .catch(error => reject(error))
803    })
804  },
805  /** 获取下载栏目列表 */
806  'get-download-column': function (ctx, params) {
807    return new Promise((resolve, reject) => {
808      ctx.state.request(ctx, {
809        name: '下载栏目列表',
810        prefix: '/jmc',
811        url: apiAddress.downloadListPage,
812        params
813      })
814        .then(res => {
815          const contentList = new globalThis.Server.ContentList().download(
816            res.data.list || res.data
817          )
818          resolve(contentList)
819        })
820        .catch(error => reject(error))
821    })
822  },
823  /** * 关联文章 */
824  'get-article-related': function (ctx, params) {
825    return new Promise((resolve, reject) => {
826      ctx.state.request(ctx, {
827        name: '关联文章',
828        url: apiAddress.relatedArticle,
829        method: 'GET',
830        params
831      })
832        .then(res => {
833          resolve(new globalThis.Server.ContentList().article(res.data))
834        })
835        .catch(error => reject(error))
836    })
837  },
838  /** 关联栏目的文章 */
839  'get-article-related-column': function (ctx, params) {
840    return new Promise((resolve, reject) => {
841      const cacheParams = {
842        page_category_id: params.page_category_id,
843        content_type: params.content_type,
844        exclude_ids: [params.content_id],
845        list_length: params.page_size
846      }
847      if (ctx.query.force && ctx.query.force === 'html' && ctx.state.cache) {
848        const cache = ctx.state.cache.getApiData('content_related_article_column', cacheParams)
849        if (cache) {
850          resolve(new globalThis.Server.ContentList().article(cache.data))
851          return
852        }
853      }
854      // 取多一个做缓存
855      params.page_size ++
856
857      ctx.state.request(ctx, {
858        name: '关联文章',
859        url: apiAddress.relatedColumnArticle,
860        method: 'GET',
861        params
862      })
863        .then(res => {
864          if (ctx.query.force && ctx.query.force === 'html' && ctx.state.cache) ctx.state.cache.fillApiData(res, 'content_related_article_column', cacheParams)
865          resolve(new globalThis.Server.ContentList().article(res.data.length === params.page_size ? res.data.slice(0, -1) : res.data))
866        })
867        .catch(error => reject(error))
868    })
869  },
870  /** 最新文章 */
871  'get-latestArticles': function (ctx, params) {
872    return new Promise((resolve, reject) => {
873      ctx.state.request(ctx, {
874        name: '最新文章',
875        url: apiAddress.latestArticles,
876        method: 'GET',
877        params
878      })
879        .then(res => {
880          const contentList = new globalThis.Server.ContentList().article(res.data)
881          resolve(contentList)
882        })
883        .catch(error => reject(error))
884    })
885  },
886  /** 最新视频 发布时间 */
887  'get-latestVideos': function (ctx, params) {
888    return new Promise((resolve, reject) => {
889      console.log('params', params)
890      ctx.state.request(ctx, {
891        name: '最新视频',
892        url: apiAddress.latestVideos,
893        method: 'POST',
894        prefix: '/qqt',
895        params
896      })
897        .then(res => {
898          const contentList = new globalThis.Server.ContentList().video(
899            res.data.list || res.data
900          )
901          resolve(contentList)
902        })
903        .catch(error => reject(error))
904    })
905  },
906  /** 最新视频 播放数量 */
907  'get-popularVideos': function (ctx, params) {
908    return new Promise((resolve, reject) => {
909      ctx.state.request(ctx, {
910        name: '最新视频',
911        url: apiAddress.latestVideos,
912        method: 'POST',
913        prefix: '/qqt',
914        params
915      })
916        .then(res => {
917          const contentList = new globalThis.Server.ContentList().video(
918            res.data.list || res.data
919          )
920          resolve(contentList)
921        })
922        .catch(error => reject(error))
923    })
924  },
925  /**
926   * 推荐栏目(文章)
927   */
928  'get-article-recommendCategory': function (ctx, params) {
929    return new Promise((resolve, reject) => {
930      ctx.state.request(ctx, {
931        name: '推荐栏目(文章)',
932        url: apiAddress.recommendCategory,
933        method: 'GET',
934        params: {
935          ...params,
936          content_type: '3,7'
937        }
938      })
939        .then(res => {
940          const contentList = new globalThis.Server.ContentList().link(
941            res.data
942          )
943          resolve(contentList)
944        })
945        .catch(error => reject(error))
946    })
947  },
948  /** 获取热门搜索 */
949  'get-search-hot': function (ctx, params) {
950    return new Promise((resolve, reject) => {
951      ctx.state.request(ctx, {
952        name: '热门搜索',
953        url: apiAddress.hotSearch,
954        method: 'GET',
955        params
956      })
957        .then(res => {
958          const contentList = new globalThis.Server.ContentList().link(
959            res.data.list || res.data
960          )
961          resolve(contentList)
962        })
963        .catch(error => reject(error))
964    })
965  },
966  /** 获取相关搜索 */
967  'get-search-related': function (ctx, params) {
968    return new Promise((resolve, reject) => {
969      ctx.state.request(ctx, {
970        name: '相关搜索',
971        url: apiAddress.relatedeSearch,
972        method: 'GET',
973        params
974      })
975        .then(res => {
976          const contentList = new globalThis.Server.ContentList().link(
977            res.data.list || res.data
978          )
979          resolve(contentList)
980        })
981        .catch(error => reject(error))
982    })
983  },
984  /** 获取站点文章 */
985  'get-article-list': function (ctx,params) {
986    return new Promise((resolve, reject) => {
987      ctx.state.request(ctx, {
988        name: '站点文章',
989        url: apiAddress.articleListPageBySearch,
990        method: 'POST',
991        params: {
992          status: 1,
993          ...params
994        }
995      })
996        .then(res => resolve(res.data.list || []))
997        .catch(error => reject(error))
998    })
999  },
1000  /**
1001   * 获取门店列表
1002   * @param {*} ctx
1003   * @param {*} params
1004   * @returns
1005   */
1006  'get-store-list': function (ctx,params) {
1007    return new Promise((resolve, reject) => {
1008      ctx.state.request(ctx, {
1009        name: '门店列表',
1010        prefix: '/qqt',
1011        url: apiAddress.storeListPageBySearch,
1012        method: 'POST',
1013        params: {
1014          status: 1,
1015          // ...params,
1016          content_type: 17,
1017          site_id: params.site_id,
1018          language_code: params.language_code
1019        }
1020      })
1021        .then(res => resolve(res.data?.list || []))
1022        .catch(error => reject(error))
1023    })
1024  },
1025  /** 获取faq列表 */
1026  'get-faq-list': function (ctx,params) {
1027    return new Promise((resolve, reject) => {
1028      ctx.state.request(ctx, {
1029        name: '站点faq',
1030        url: apiAddress.faqListPageBySearch,
1031        method: 'POST',
1032        params
1033      })
1034        .then(res => {
1035          const list = res.data?.list || []
1036          const page_number = res?.data?.page_number || 1
1037          const page_size = res?.data?.page_size || list.length
1038          list.forEach((item, i) => {
1039            list[i].seq = Math.max((page_number - 1) * page_size, 0) + i + 1
1040          })
1041          resolve(list)
1042        })
1043        .catch(error => reject(error))
1044    })
1045  },
1046
1047  /** 获取聚合标签关联列表 */
1048  'get-polymerize-relate-tag': function (ctx, params) {
1049    return new Promise((resolve, reject) => {
1050      ctx.state.request(ctx, {
1051        name: '聚合关联标签列表',
1052        url: apiAddress.polymerizeRelateTag,
1053        method: 'GET',
1054        params
1055      })
1056      .then(res => {
1057        const contentList = res.data || []
1058        contentList.map(item => {
1059          item.title = item.keywords
1060          return item
1061        })
1062        resolve(contentList)
1063      })
1064        .catch(error => reject(error))
1065    })
1066  },
1067  /** 获取栏目内容倒序列表 */
1068  'get-page-content-desc': function (ctx, params) {
1069    return new Promise((resolve, reject) => {
1070      ctx.state.request(ctx, {
1071        name: '栏目内容倒序列表',
1072        url: apiAddress.contentListPage,
1073        method: 'GET',
1074        params
1075      })
1076        .then(res => resolve(res.data.list || []))
1077        .catch(error => reject(error))
1078    })
1079  },
1080  /** 获取子级栏目列表 */
1081  'get-child-category': function (ctx, params) {
1082    return new Promise((resolve, reject) => {
1083      ctx.state.request(ctx, {
1084        name: '子级栏目列表',
1085        url: apiAddress.pageCategoryListPage,
1086        method: 'GET',
1087        params
1088      })
1089        .then(res => {
1090          const contentList = new globalThis.Server.ContentList().default(
1091            res.data.list.map(item => {
1092              item.thumb = 'https://img.yfisher.com/' + item.thumb
1093              return item
1094            })
1095          )
1096          resolve(contentList)
1097        })
1098        .catch(error => reject(error))
1099    })
1100  },
1101  /** FAQ分类 */
1102  'get-faq-type': function (ctx, params) {
1103    return new Promise((resolve, reject) => {
1104      ctx.state.request(ctx, {
1105        name: 'FAQ类型',
1106        prefix: '/jmc',
1107        url: apiAddress.faqType,
1108        method: 'GET',
1109        params
1110      })
1111        .then(res => {
1112          resolve(res.data)
1113        })
1114        .catch(error => reject(error))
1115    })
1116  }
1117}
1118
1119/**
1120 * 黑马页面获取默认简介
1121 */
1122export function getMediaIntroduction(ctx, params) {
1123  return new Promise((resolve, reject) => {
1124    ctx.state.request(ctx, {
1125      url: apiAddress.mediaIntroduction,
1126      method: 'GET',
1127      params
1128    })
1129      .then(res => resolve(res.data))
1130      .catch(error => reject(error))
1131  })
1132}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.