Files
crawler-plugin/frontend-vue/src/shared/country-options.ts
T
huangzd1997 417a2bf831
Build Backend JAR / build (push) Has been cancelled
后台店铺数据记录页新增 Tab 切换与重复 ASIN 分析;task-169/170 HTTP 客户端配置接入;dedupe/brand 相关改造
- 管理后台:店铺数据记录改为列表分页展示(去任务号/文件列/累计标题,'最新'改'更新时间'),新增'重复 ASIN' Tab 按跨店聚合展示 ASIN/店铺/分组/国家/日期/价格;修复失败/进行中任务被过滤不显示的问题
- task-169: BrandCheckHttpConfigResolver 从 aiimage.http-client.* 读取品牌检查超时/重试(默认同现状、钳制),附 8 条测试
- task-170: surefire 内存调整为 1536m
- dedupe: DedupeRunService 重构(事务边界/进度)、新增 DedupeRunProgressVo、Controller 与结果 VO 调整,PermissionMenuService 相应适配
- brand/dedupe 前端:BrandDedupeTab/BrandPatrolDeleteTab 改造、新增 CountrySelector 组件与 country-options、类型与接口端对齐、测试更新
- 移除无引用文件:backend/static/logo.jpg、prompts/
2026-09-03 01:57:41 +08:00

44 lines
1.5 KiB
TypeScript

/**
* 各功能页共用的欧洲五国选项。
*
* code 用于接口参数与本地存储(和店铺数据抓取 / 跟价 / 商品风险等页面的
* country_codes 保持一致),label 用于界面展示;巡店删除的模板结构直接以
* 中文国家名作为 key,取 label 即可。
*/
export interface CountryOption {
code: string
label: string
}
export const EU_COUNTRY_OPTIONS: readonly CountryOption[] = [
{ code: 'DE', label: '德国' },
{ code: 'UK', label: '英国' },
{ code: 'FR', label: '法国' },
{ code: 'IT', label: '意大利' },
{ code: 'ES', label: '西班牙' },
]
export const EU_COUNTRY_CODES: readonly string[] = EU_COUNTRY_OPTIONS.map((row) => row.code)
export function countryLabel(code: string) {
return EU_COUNTRY_OPTIONS.find((row) => row.code === code)?.label || code
}
/**
* 过滤出合法国家代码并去重,用于校验本地缓存或接口返回的顺序。
* 结果为空时回落到 fallback,避免出现「一个国家都没有」导致任务空转。
*/
export function sanitizeCountryCodes(
raw: unknown,
fallback: readonly string[] = EU_COUNTRY_CODES,
): string[] {
if (!Array.isArray(raw)) return [...fallback]
const valid = new Set(EU_COUNTRY_CODES)
const result: string[] = []
for (const item of raw) {
const code = String(item ?? '').trim().toUpperCase()
if (valid.has(code) && !result.includes(code)) result.push(code)
}
return result.length ? result : [...fallback]
}