feat: add brand library management features

- Introduced BrandLibrarySummary type to encapsulate brand library limits and usage.
- Updated Brand interface to include keyword_count and question_count fields.
- Implemented brand library limits in the backend, including max brands, keywords, and questions per keyword.
- Added API endpoint to retrieve brand library summary.
- Enhanced BrandsView.vue to display brand library usage and limits.
- Implemented computed properties to manage brand, keyword, and question limits in the UI.
- Updated mutation handlers to invalidate relevant queries upon creating/updating brands, keywords, and questions.
- Added visual indicators for brand, keyword, and question limits in the UI.
- Enhanced error handling for exceeding brand and keyword limits during creation.
This commit is contained in:
2026-04-16 21:01:40 +08:00
parent 27389164b0
commit 41f3060e00
15 changed files with 731 additions and 44 deletions
+20
View File
@@ -811,6 +811,23 @@ const enUS = {
keywords: "Keywords",
competitors: "Competitors",
},
quota: {
plan: "Current plan",
planHint: "Brand library limits are enforced from the active plan.",
brands: "Brand companies",
brandsHint: "Free defaults to 1 and paid defaults to 2.",
keywords: "Total keywords",
keywordsHint: "The total number of keywords this account can bind.",
questions: "Questions per keyword",
questionsHint: "The maximum number of questions allowed under one keyword.",
},
meta: {
keywordCount: "{count} keywords",
questionCount: "{count} questions",
brandKeywordCount: "{count} keywords under this brand",
globalKeywordUsage: "Total keywords used {used} / {total}",
keywordQuestionUsage: "Questions {used} / {total}",
},
sections: {
keywords: "Keywords",
questions: "Question set",
@@ -855,6 +872,9 @@ const enUS = {
deleteCompetitor: "Competitor deleted.",
chooseBrand: "Please choose a brand first.",
chooseKeyword: "Please choose a keyword first.",
brandLimitReached: "Your current plan allows up to {limit} brand companies.",
keywordLimitReached: "This account allows up to {limit} keywords.",
questionLimitReached: "This keyword allows up to {limit} questions.",
},
},
custom: {