diff --git a/dist-release/content/index.js b/dist-release/content/index.js index ee2c3ad..50d27ce 100644 --- a/dist-release/content/index.js +++ b/dist-release/content/index.js @@ -107,7 +107,7 @@ ]; var RATE_COLUMNS = [ { - header: "\u5355\u89C6\u9891\u770B\u540E\u641C\u7387", + header: "\u5546\u5355\u89C6\u9891\u770B\u540E\u641C\u7387", readValue: (record) => record.rates?.singleVideoAfterSearchRate ? normalizeRateDisplay(record.rates.singleVideoAfterSearchRate) : "" }, { @@ -2008,7 +2008,7 @@ } const selectionHeader = ensureSyntheticHeaderCell(header, SELECTION_COLUMN_KEY, ""); const headerSelectionCheckbox = ensureSelectionHeaderControl(selectionHeader); - ensureSyntheticHeaderCell(header, SINGLE_COLUMN_KEY, "\u5355\u89C6\u9891\u770B\u540E\u641C\u7387"); + ensureSyntheticHeaderCell(header, SINGLE_COLUMN_KEY, "\u5546\u5355\u89C6\u9891\u770B\u540E\u641C\u7387"); ensureSyntheticHeaderCell(header, PERSONAL_COLUMN_KEY, "\u4E2A\u4EBA\u89C6\u9891\u770B\u540E\u641C\u7387"); BACKEND_METRIC_COLUMNS2.forEach(({ field, label }) => { ensureSyntheticHeaderCell(header, field, label); @@ -2185,7 +2185,7 @@ pluginHeaderSection, headerTemplateCell, SINGLE_COLUMN_KEY, - "\u5355\u89C6\u9891\u770B\u540E\u641C\u7387" + "\u5546\u5355\u89C6\u9891\u770B\u540E\u641C\u7387" ); ensureDivHeaderCell( pluginHeaderSection, @@ -2836,7 +2836,7 @@ function shouldExportColumn(label) { const excludedBackendLabels = new Set(BACKEND_METRIC_COLUMNS2.map((column) => column.label)); return Boolean( - label && label !== ACTION_HEADER_TEXT && label !== BACKEND_HEADER_TEXT && !excludedBackendLabels.has(label) && label !== "\u5355\u89C6\u9891\u770B\u540E\u641C\u7387" && label !== "\u4E2A\u4EBA\u89C6\u9891\u770B\u540E\u641C\u7387" + label && label !== ACTION_HEADER_TEXT && label !== BACKEND_HEADER_TEXT && !excludedBackendLabels.has(label) && label !== "\u5546\u5355\u89C6\u9891\u770B\u540E\u641C\u7387" && label !== "\u4E2A\u4EBA\u89C6\u9891\u770B\u540E\u641C\u7387" ); } function syncSortableHeaderCell(cell, options) { @@ -3577,23 +3577,28 @@ const exportButton = document2.createElement("button"); exportButton.type = "button"; exportButton.dataset.pluginExport = "button"; - exportButton.textContent = "\u5BFC\u51FACSV"; + exportButton.textContent = "\u5BFC\u51FA\u5217\u8868CSV"; + exportButton.title = "\u5BFC\u51FA\u5F53\u524D\u8FBE\u4EBA\u5217\u8868\u4E2D\u7684\u57FA\u7840\u5B57\u6BB5\u548C\u79D2\u601D\u6307\u6807"; const audienceProfileExportButton = document2.createElement("button"); audienceProfileExportButton.type = "button"; audienceProfileExportButton.dataset.pluginExportAudienceProfile = "button"; - audienceProfileExportButton.textContent = "\u5BFC\u51FA\u753B\u50CFCSV"; + audienceProfileExportButton.textContent = "\u5BFC\u51FA\u9009\u4E2D\u8FBE\u4EBA\u753B\u50CF"; + audienceProfileExportButton.title = "\u4EC5\u5BFC\u51FA\u5DF2\u52FE\u9009\u8FBE\u4EBA\uFF0C\u5305\u542B\u753B\u50CF\u3001\u5185\u5BB9\u6570\u636E\u3001\u6548\u679C\u9884\u4F30\u7B49\u5B57\u6BB5"; const audienceProfileByIdExportButton = document2.createElement("button"); audienceProfileByIdExportButton.type = "button"; audienceProfileByIdExportButton.dataset.pluginExportAudienceProfileById = "button"; - audienceProfileByIdExportButton.textContent = "\u6309ID\u5BFC\u51FA\u753B\u50CFCSV"; + audienceProfileByIdExportButton.textContent = "\u6309\u661F\u56FEID\u5BFC\u51FA\u753B\u50CF"; + audienceProfileByIdExportButton.title = "\u7C98\u8D34\u8FBE\u4EBA\u661F\u56FEID\u540E\u6279\u91CF\u5BFC\u51FA\u753B\u50CF\u6570\u636E\uFF0C\u4E0D\u4F9D\u8D56\u5F53\u524D\u5217\u8868\u52FE\u9009"; const audienceProfileFieldButton = document2.createElement("button"); audienceProfileFieldButton.type = "button"; audienceProfileFieldButton.dataset.pluginAudienceProfileFields = "button"; - audienceProfileFieldButton.textContent = "\u753B\u50CF\u5B57\u6BB5"; + audienceProfileFieldButton.textContent = "\u9009\u62E9\u753B\u50CF\u5B57\u6BB5"; + audienceProfileFieldButton.title = "\u52FE\u9009\u672C\u6B21\u753B\u50CFCSV\u9700\u8981\u5BFC\u51FA\u7684\u5B57\u6BB5\uFF0C\u8BBE\u7F6E\u4F1A\u81EA\u52A8\u4FDD\u5B58"; const batchSubmitButton = document2.createElement("button"); batchSubmitButton.type = "button"; batchSubmitButton.dataset.pluginBatchSubmit = "button"; batchSubmitButton.textContent = "\u63D0\u4EA4\u6279\u6B21"; + batchSubmitButton.title = "\u5C06\u5F53\u524D\u9009\u4E2D\u7684\u8FBE\u4EBA\u63D0\u4EA4\u5230\u540E\u7EED\u4E1A\u52A1\u6279\u6B21"; const exportStatusText = document2.createElement("span"); exportStatusText.dataset.pluginExportStatus = "text"; applyStatusStyles(exportStatusText); diff --git a/docs/aigc-user-guide.md b/docs/aigc-user-guide.md index 2d24c25..7deb452 100644 --- a/docs/aigc-user-guide.md +++ b/docs/aigc-user-guide.md @@ -191,14 +191,14 @@ https://xingtu.cn/ad/creator/market 在星图页面中,插件会新增一组自己的操作区,常见元素包括: - 导出范围下拉框 -- `导出CSV` 按钮 +- `导出列表CSV` 按钮 - `提交批次` 按钮 - 状态提示文字 - 每一行达人前面的勾选框 其中: -- `导出CSV`:把当前选择的数据导出为表格文件 +- `导出列表CSV`:把当前选择的数据导出为表格文件 - `提交批次`:把当前选择的数据提交为批次 --- @@ -243,7 +243,7 @@ https://xingtu.cn/ad/creator/market 点击: -- `导出CSV` +- `导出列表CSV` ### 4. 等待导出完成 @@ -281,7 +281,7 @@ https://xingtu.cn/ad/creator/market 如果只想导出一部分画像字段,点击: -- `画像字段` +- `选择画像字段` 在弹出的窗口里: @@ -302,11 +302,11 @@ https://xingtu.cn/ad/creator/market 勾选达人后,点击: -- `导出画像CSV` +- `导出选中达人画像` 如果已经有达人星图 ID 列表,也可以点击: -- `按ID导出画像CSV` +- `按星图ID导出画像` 然后把达人 ID 粘贴进去,每行一个。 @@ -518,7 +518,7 @@ https://xingtu.cn/ad/creator/market 4. 打开星图达人市场页 5. 等待页面数据加载完成 6. 先勾选需要的人,或直接选择范围 -7. 需要表格时点 `导出CSV` +7. 需要表格时点 `导出列表CSV` 8. 需要进入后续流程时点 `提交批次` --- diff --git a/docs/【超简单版】插件安装使用指南.md b/docs/【超简单版】插件安装使用指南.md index 76b0ed7..5e075f8 100644 --- a/docs/【超简单版】插件安装使用指南.md +++ b/docs/【超简单版】插件安装使用指南.md @@ -76,7 +76,7 @@ https://xingtu.cn/ad/creator/market - 勾选你想导出的达人(不勾就选全部) - 选择范围:当前页 / 前5页 / 全部 -- 点击 **"导出CSV"** +- 点击 **"导出列表CSV"** - 文件自动下载到电脑的"下载"文件夹 ### 2️⃣ 导出画像数据(画像CSV) @@ -85,7 +85,7 @@ https://xingtu.cn/ad/creator/market - 先勾选你想导出画像的达人 - 选择范围:当前页 / 前5页 / 全部 -- 点击 **"导出画像CSV"** +- 点击 **"导出选中达人画像"** - 等待下载完成 - 文件自动下载到电脑的"下载"文件夹 @@ -98,10 +98,10 @@ https://xingtu.cn/ad/creator/market - 秒思api数据:看后搜率、看后搜数、新增A3数、新增A3率、CPA3、cp_search **只导出部分字段**: -- 点击 **"画像字段"** +- 点击 **"选择画像字段"** - 勾选你需要的字段,取消不需要的字段 - 点击 **"保存"** -- 再点击 **"导出画像CSV"** 或 **"按ID导出画像CSV"** +- 再点击 **"导出选中达人画像"** 或 **"按星图ID导出画像"** 说明:达人ID、达人名称、导出状态、失败原因等基础字段会固定保留;你保存过一次后,下次导出会自动沿用这次勾选结果,不需要重新勾选。 @@ -109,7 +109,7 @@ https://xingtu.cn/ad/creator/market 当你想批量查询特定达人ID的画像数据时使用: -- 点击 **"按ID导出画像CSV"** +- 点击 **"按星图ID导出画像"** - 在弹出的对话框中输入达人ID(每行一个) - 点击确认 - 等待下载完成 diff --git a/release/star-chart-search-enhancer-internal.zip b/release/star-chart-search-enhancer-internal.zip index dab936d..49e052c 100644 Binary files a/release/star-chart-search-enhancer-internal.zip and b/release/star-chart-search-enhancer-internal.zip differ diff --git a/src/content/market/csv-exporter.ts b/src/content/market/csv-exporter.ts index 00718b0..191c096 100644 --- a/src/content/market/csv-exporter.ts +++ b/src/content/market/csv-exporter.ts @@ -28,7 +28,7 @@ const FALLBACK_BASE_COLUMNS: CsvColumn[] = [ const RATE_COLUMNS: CsvColumn[] = [ { - header: "单视频看后搜率", + header: "商单视频看后搜率", readValue: (record: MarketRecord) => record.rates?.singleVideoAfterSearchRate ? normalizeRateDisplay(record.rates.singleVideoAfterSearchRate) diff --git a/src/content/market/dom-sync.ts b/src/content/market/dom-sync.ts index 6e0f176..b6ced14 100644 --- a/src/content/market/dom-sync.ts +++ b/src/content/market/dom-sync.ts @@ -298,7 +298,7 @@ function syncSyntheticMarketTable(root: ParentNode): MarketTableDom | null { const selectionHeader = ensureSyntheticHeaderCell(header, SELECTION_COLUMN_KEY, ""); const headerSelectionCheckbox = ensureSelectionHeaderControl(selectionHeader); - ensureSyntheticHeaderCell(header, SINGLE_COLUMN_KEY, "单视频看后搜率"); + ensureSyntheticHeaderCell(header, SINGLE_COLUMN_KEY, "商单视频看后搜率"); ensureSyntheticHeaderCell(header, PERSONAL_COLUMN_KEY, "个人视频看后搜率"); BACKEND_METRIC_COLUMNS.forEach(({ field, label }) => { ensureSyntheticHeaderCell(header, field, label); @@ -532,7 +532,7 @@ function syncDivGridRoot(root: HTMLElement): MarketTableDom | null { pluginHeaderSection, headerTemplateCell, SINGLE_COLUMN_KEY, - "单视频看后搜率" + "商单视频看后搜率" ); ensureDivHeaderCell( pluginHeaderSection, @@ -1428,7 +1428,7 @@ function shouldExportColumn(label: string): boolean { label !== ACTION_HEADER_TEXT && label !== BACKEND_HEADER_TEXT && !excludedBackendLabels.has(label) && - label !== "单视频看后搜率" && + label !== "商单视频看后搜率" && label !== "个人视频看后搜率" ); } diff --git a/src/content/market/plugin-toolbar.ts b/src/content/market/plugin-toolbar.ts index 97c9e18..f93dafd 100644 --- a/src/content/market/plugin-toolbar.ts +++ b/src/content/market/plugin-toolbar.ts @@ -79,27 +79,35 @@ export function ensurePluginToolbar( const exportButton = document.createElement("button"); exportButton.type = "button"; exportButton.dataset.pluginExport = "button"; - exportButton.textContent = "导出CSV"; + exportButton.textContent = "导出列表CSV"; + exportButton.title = "导出当前达人列表中的基础字段和秒思指标"; const audienceProfileExportButton = document.createElement("button"); audienceProfileExportButton.type = "button"; audienceProfileExportButton.dataset.pluginExportAudienceProfile = "button"; - audienceProfileExportButton.textContent = "导出画像CSV"; + audienceProfileExportButton.textContent = "导出选中达人画像"; + audienceProfileExportButton.title = + "仅导出已勾选达人,包含画像、内容数据、效果预估等字段"; const audienceProfileByIdExportButton = document.createElement("button"); audienceProfileByIdExportButton.type = "button"; audienceProfileByIdExportButton.dataset.pluginExportAudienceProfileById = "button"; - audienceProfileByIdExportButton.textContent = "按ID导出画像CSV"; + audienceProfileByIdExportButton.textContent = "按星图ID导出画像"; + audienceProfileByIdExportButton.title = + "粘贴达人星图ID后批量导出画像数据,不依赖当前列表勾选"; const audienceProfileFieldButton = document.createElement("button"); audienceProfileFieldButton.type = "button"; audienceProfileFieldButton.dataset.pluginAudienceProfileFields = "button"; - audienceProfileFieldButton.textContent = "画像字段"; + audienceProfileFieldButton.textContent = "选择画像字段"; + audienceProfileFieldButton.title = + "勾选本次画像CSV需要导出的字段,设置会自动保存"; const batchSubmitButton = document.createElement("button"); batchSubmitButton.type = "button"; batchSubmitButton.dataset.pluginBatchSubmit = "button"; batchSubmitButton.textContent = "提交批次"; + batchSubmitButton.title = "将当前选中的达人提交到后续业务批次"; const exportStatusText = document.createElement("span"); exportStatusText.dataset.pluginExportStatus = "text"; diff --git a/tests/csv-exporter.test.ts b/tests/csv-exporter.test.ts index d9c1fb2..e2ee017 100644 --- a/tests/csv-exporter.test.ts +++ b/tests/csv-exporter.test.ts @@ -14,7 +14,7 @@ describe("csv-exporter", () => { "达人名称", "地区", "21-60s报价", - "单视频看后搜率", + "商单视频看后搜率", "个人视频看后搜率", "秒思api-看后搜率", "秒思api-看后搜数", @@ -59,7 +59,7 @@ describe("csv-exporter", () => { "达人信息", "粉丝数", "21-60s报价", - "单视频看后搜率", + "商单视频看后搜率", "个人视频看后搜率", "秒思api-看后搜率", "秒思api-看后搜数", @@ -94,7 +94,7 @@ describe("csv-exporter", () => { [ "达人信息", "粉丝数", - "单视频看后搜率", + "商单视频看后搜率", "个人视频看后搜率", "秒思api-看后搜率", "秒思api-看后搜数", diff --git a/tests/market-content-entry.test.ts b/tests/market-content-entry.test.ts index 4750a1a..91bf605 100644 --- a/tests/market-content-entry.test.ts +++ b/tests/market-content-entry.test.ts @@ -347,6 +347,24 @@ describe("market-content-entry", () => { const audienceProfileByIdExportButton = document.querySelector( '[data-plugin-export-audience-profile-by-id="button"]' ) as HTMLButtonElement | null; + const audienceProfileFieldButton = document.querySelector( + '[data-plugin-audience-profile-fields="button"]' + ) as HTMLButtonElement | null; + expect(exportButton?.textContent).toBe("导出列表CSV"); + expect(exportButton?.title).toBe("导出当前达人列表中的基础字段和秒思指标"); + expect(audienceProfileExportButton?.textContent).toBe("导出选中达人画像"); + expect(audienceProfileExportButton?.title).toBe( + "仅导出已勾选达人,包含画像、内容数据、效果预估等字段" + ); + expect(audienceProfileByIdExportButton?.textContent).toBe("按星图ID导出画像"); + expect(audienceProfileByIdExportButton?.title).toBe( + "粘贴达人星图ID后批量导出画像数据,不依赖当前列表勾选" + ); + expect(audienceProfileFieldButton?.textContent).toBe("选择画像字段"); + expect(audienceProfileFieldButton?.title).toBe( + "勾选本次画像CSV需要导出的字段,设置会自动保存" + ); + expect(batchSubmitButton?.title).toBe("将当前选中的达人提交到后续业务批次"); expect(exportButton?.style.backgroundColor).toBe("rgb(127, 29, 45)"); expect(batchSubmitButton?.style.backgroundColor).toBe("rgb(127, 29, 45)"); expect(audienceProfileExportButton?.style.backgroundColor).toBe("rgb(127, 29, 45)"); diff --git a/tests/market-dom-sync.test.ts b/tests/market-dom-sync.test.ts index 5e804ec..0db3c55 100644 --- a/tests/market-dom-sync.test.ts +++ b/tests/market-dom-sync.test.ts @@ -181,7 +181,7 @@ describe("market-dom-sync", () => { expect(readSelectionHeaderText()).toBe("全选"); expect(readSelectionRowCheckboxCount()).toBe(2); expect(readPluginHeaderTexts()).toEqual([ - "单视频看后搜率", + "商单视频看后搜率", "个人视频看后搜率", "看后搜率", "看后搜数",