Browse Source

fix: 招商页面调整

周玉环 1 day ago
parent
commit
cd7b021095
24 changed files with 1355 additions and 949 deletions
  1. 2 0
      xinkeaboard-promotion-portal/components.d.ts
  2. 9 6
      xinkeaboard-promotion-portal/src/App.vue
  3. 950 837
      xinkeaboard-promotion-portal/src/assets/country.json
  4. BIN
      xinkeaboard-promotion-portal/src/assets/images/home/analysis.png
  5. BIN
      xinkeaboard-promotion-portal/src/assets/images/home/competitor.png
  6. BIN
      xinkeaboard-promotion-portal/src/assets/images/home/content-left-1.png
  7. BIN
      xinkeaboard-promotion-portal/src/assets/images/home/content-left-2.png
  8. BIN
      xinkeaboard-promotion-portal/src/assets/images/home/content-left-3.png
  9. BIN
      xinkeaboard-promotion-portal/src/assets/images/home/img-left.png
  10. BIN
      xinkeaboard-promotion-portal/src/assets/images/home/img-right.png
  11. BIN
      xinkeaboard-promotion-portal/src/assets/images/home/keyword.png
  12. BIN
      xinkeaboard-promotion-portal/src/assets/images/home/left.png
  13. BIN
      xinkeaboard-promotion-portal/src/assets/images/home/right.png
  14. 6 25
      xinkeaboard-promotion-portal/src/components/AiAnalysis.vue
  15. 105 0
      xinkeaboard-promotion-portal/src/components/CanDo.vue
  16. 8 5
      xinkeaboard-promotion-portal/src/components/CountrySelct.vue
  17. 213 0
      xinkeaboard-promotion-portal/src/components/RecordHelp.vue
  18. 1 17
      xinkeaboard-promotion-portal/src/components/TopContent.vue
  19. 12 13
      xinkeaboard-promotion-portal/src/components/competitor/TrafficChart.vue
  20. 1 1
      xinkeaboard-promotion-portal/src/components/keyword/search.vue
  21. 36 6
      xinkeaboard-promotion-portal/src/store/index.ts
  22. 0 6
      xinkeaboard-promotion-portal/src/utils/http.ts
  23. 9 25
      xinkeaboard-promotion-portal/src/views/Home.vue
  24. 3 8
      xinkeaboard-promotion-portal/src/views/Record.vue

+ 2 - 0
xinkeaboard-promotion-portal/components.d.ts

@@ -9,6 +9,7 @@ export {}
 declare module 'vue' {
   export interface GlobalComponents {
     AiAnalysis: typeof import('./src/components/AiAnalysis.vue')['default']
+    CanDo: typeof import('./src/components/CanDo.vue')['default']
     ColorLevel: typeof import('./src/components/ColorLevel.vue')['default']
     CommonEmpty: typeof import('./src/components/CommonEmpty.vue')['default']
     CompetitorList: typeof import('./src/components/CompetitorList.vue')['default']
@@ -35,6 +36,7 @@ declare module 'vue' {
     ProductDescription: typeof import('./src/components/ProductDescription.vue')['default']
     RankTable: typeof import('./src/components/competitor/RankTable.vue')['default']
     RecommendTable: typeof import('./src/components/competitor/RecommendTable.vue')['default']
+    RecordHelp: typeof import('./src/components/RecordHelp.vue')['default']
     RouterLink: typeof import('vue-router')['RouterLink']
     RouterView: typeof import('vue-router')['RouterView']
     Search: typeof import('./src/components/keyword/search.vue')['default']

+ 9 - 6
xinkeaboard-promotion-portal/src/App.vue

@@ -1,5 +1,5 @@
 <template>
-  <router-view v-slot="{ Component }" v-if="!clearCache">
+  <router-view v-slot="{ Component }">
     <keep-alive include="Home,Record">
       <component :is="Component"/>
     </keep-alive>
@@ -7,11 +7,10 @@
 </template>
 
 <script setup lang="ts">
-import { onMounted, onBeforeUnmount, computed } from 'vue';
-import { useMainStore } from './store';
+import { onMounted, onBeforeUnmount, watch, computed } from 'vue';
+import { useRouter } from 'vue-router';
 
-const mainStore = useMainStore();
-const clearCache = computed(() => mainStore.getClearCache);
+const router = useRouter();
 
 const handleLinkClick = (e: MouseEvent) => {
   const target = (e.target as HTMLElement).closest("a") as HTMLAnchorElement | null;
@@ -22,6 +21,9 @@ const handleLinkClick = (e: MouseEvent) => {
 }
 
 onMounted(() => {
+  if (location.pathname !== '/') {
+    router.push('/')
+  }
   document.addEventListener('click', handleLinkClick);
 });
 
@@ -37,7 +39,8 @@ onBeforeUnmount(() => {
   /* height: 110px; */
   display: flex;
   flex-direction: column;
-  box-sizing: border-box;
+  /* box-sizing: border-box; */
+  padding: 20px 20px !important;
   .title {
     font-weight: bold;
     font-size: 16px;

+ 950 - 837
xinkeaboard-promotion-portal/src/assets/country.json

@@ -1,839 +1,952 @@
 [
-  {
-    "capital": "Washington, D.C.",
-    "code": "us",
-    "continent": "North America",
-    "flag_1x1": "flags/1x1/us.svg",
-    "flag_4x3": "flags/4x3/us.svg",
-    "iso": true,
-    "name": "United States"
-  },
-  {
-    "capital": "Tirana",
-    "code": "al",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/al.svg",
-    "flag_4x3": "flags/4x3/al.svg",
-    "iso": true,
-    "name": "Albania"
-  },
-  {
-    "capital": "Algiers",
-    "code": "dz",
-    "continent": "Africa",
-    "flag_1x1": "flags/1x1/dz.svg",
-    "flag_4x3": "flags/4x3/dz.svg",
-    "iso": true,
-    "name": "Algeria"
-  },
-  {
-    "capital": "Luanda",
-    "code": "ao",
-    "continent": "Africa",
-    "flag_1x1": "flags/1x1/ao.svg",
-    "flag_4x3": "flags/4x3/ao.svg",
-    "iso": true,
-    "name": "Angola"
-  },
-  {
-    "capital": "Buenos Aires",
-    "code": "ar",
-    "continent": "South America",
-    "flag_1x1": "flags/1x1/ar.svg",
-    "flag_4x3": "flags/4x3/ar.svg",
-    "iso": true,
-    "name": "Argentina"
-  },
-  {
-    "capital": "Yerevan",
-    "code": "am",
-    "continent": "Asia",
-    "flag_1x1": "flags/1x1/am.svg",
-    "flag_4x3": "flags/4x3/am.svg",
-    "iso": true,
-    "name": "Armenia"
-  },
-  {
-    "capital": "Canberra",
-    "code": "au",
-    "continent": "Oceania",
-    "flag_1x1": "flags/1x1/au.svg",
-    "flag_4x3": "flags/4x3/au.svg",
-    "iso": true,
-    "name": "Australia"
-  },
-  {
-    "capital": "Vienna",
-    "code": "at",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/at.svg",
-    "flag_4x3": "flags/4x3/at.svg",
-    "iso": true,
-    "name": "Austria"
-  },
-  {
-    "capital": "Baku",
-    "code": "az",
-    "continent": "Asia",
-    "flag_1x1": "flags/1x1/az.svg",
-    "flag_4x3": "flags/4x3/az.svg",
-    "iso": true,
-    "name": "Azerbaijan"
-  },
-  {
-    "capital": "Manama",
-    "code": "bh",
-    "continent": "Asia",
-    "flag_1x1": "flags/1x1/bh.svg",
-    "flag_4x3": "flags/4x3/bh.svg",
-    "iso": true,
-    "name": "Bahrain"
-  },
-  {
-    "capital": "Dhaka",
-    "code": "bd",
-    "continent": "Asia",
-    "flag_1x1": "flags/1x1/bd.svg",
-    "flag_4x3": "flags/4x3/bd.svg",
-    "iso": true,
-    "name": "Bangladesh"
-  },
-  {
-    "capital": "Brussels",
-    "code": "be",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/be.svg",
-    "flag_4x3": "flags/4x3/be.svg",
-    "iso": true,
-    "name": "Belgium"
-  },
-  {
-    "capital": "Sucre",
-    "code": "bo",
-    "continent": "South America",
-    "flag_1x1": "flags/1x1/bo.svg",
-    "flag_4x3": "flags/4x3/bo.svg",
-    "iso": true,
-    "name": "Bolivia"
-  },
-  {
-    "capital": "Sarajevo",
-    "code": "ba",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/ba.svg",
-    "flag_4x3": "flags/4x3/ba.svg",
-    "iso": true,
-    "name": "Bosnia and Herzegovina"
-  },
-  {
-    "capital": "Brasília",
-    "code": "br",
-    "continent": "South America",
-    "flag_1x1": "flags/1x1/br.svg",
-    "flag_4x3": "flags/4x3/br.svg",
-    "iso": true,
-    "name": "Brazil"
-  },
-  {
-    "capital": "Sofia",
-    "code": "bg",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/bg.svg",
-    "flag_4x3": "flags/4x3/bg.svg",
-    "iso": true,
-    "name": "Bulgaria"
-  },
-  {
-    "capital": "Ouagadougou",
-    "code": "bf",
-    "continent": "Africa",
-    "flag_1x1": "flags/1x1/bf.svg",
-    "flag_4x3": "flags/4x3/bf.svg",
-    "iso": true,
-    "name": "Burkina Faso"
-  },
-  {
-    "capital": "Phnom Penh",
-    "code": "kh",
-    "continent": "Asia",
-    "flag_1x1": "flags/1x1/kh.svg",
-    "flag_4x3": "flags/4x3/kh.svg",
-    "iso": true,
-    "name": "Cambodia"
-  },
-  {
-    "capital": "Yaoundé",
-    "code": "cm",
-    "continent": "Africa",
-    "flag_1x1": "flags/1x1/cm.svg",
-    "flag_4x3": "flags/4x3/cm.svg",
-    "iso": true,
-    "name": "Cameroon"
-  },
-  {
-    "capital": "Ottawa",
-    "code": "ca",
-    "continent": "North America",
-    "flag_1x1": "flags/1x1/ca.svg",
-    "flag_4x3": "flags/4x3/ca.svg",
-    "iso": true,
-    "name": "Canada"
-  },
-  {
-    "capital": "Santiago",
-    "code": "cl",
-    "continent": "South America",
-    "flag_1x1": "flags/1x1/cl.svg",
-    "flag_4x3": "flags/4x3/cl.svg",
-    "iso": true,
-    "name": "Chile"
-  },
-  {
-    "capital": "Bogotá",
-    "code": "co",
-    "continent": "South America",
-    "flag_1x1": "flags/1x1/co.svg",
-    "flag_4x3": "flags/4x3/co.svg",
-    "iso": true,
-    "name": "Colombia"
-  },
-  {
-    "capital": "San José",
-    "code": "cr",
-    "continent": "North America",
-    "flag_1x1": "flags/1x1/cr.svg",
-    "flag_4x3": "flags/4x3/cr.svg",
-    "iso": true,
-    "name": "Costa Rica"
-  },
-  {
-    "capital": "Zagreb",
-    "code": "hr",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/hr.svg",
-    "flag_4x3": "flags/4x3/hr.svg",
-    "iso": true,
-    "name": "Croatia"
-  },
-  {
-    "capital": "Nicosia",
-    "code": "cy",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/cy.svg",
-    "flag_4x3": "flags/4x3/cy.svg",
-    "iso": true,
-    "name": "Cyprus"
-  },
-  {
-    "capital": "Prague",
-    "code": "cz",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/cz.svg",
-    "flag_4x3": "flags/4x3/cz.svg",
-    "iso": true,
-    "name": "Czechia"
-  },
-  {
-    "capital": "Yamoussoukro",
-    "code": "ci",
-    "continent": "Africa",
-    "flag_1x1": "flags/1x1/ci.svg",
-    "flag_4x3": "flags/4x3/ci.svg",
-    "iso": true,
-    "name": "Cote d'Ivoire"
-  },
-  {
-    "capital": "Copenhagen",
-    "code": "dk",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/dk.svg",
-    "flag_4x3": "flags/4x3/dk.svg",
-    "iso": true,
-    "name": "Denmark"
-  },
-  {
-    "capital": "Quito",
-    "code": "ec",
-    "continent": "South America",
-    "flag_1x1": "flags/1x1/ec.svg",
-    "flag_4x3": "flags/4x3/ec.svg",
-    "iso": true,
-    "name": "Ecuador"
-  },
-  {
-    "capital": "Cairo",
-    "code": "eg",
-    "continent": "Africa",
-    "flag_1x1": "flags/1x1/eg.svg",
-    "flag_4x3": "flags/4x3/eg.svg",
-    "iso": true,
-    "name": "Egypt"
-  },
-  {
-    "capital": "San Salvador",
-    "code": "sv",
-    "continent": "North America",
-    "flag_1x1": "flags/1x1/sv.svg",
-    "flag_4x3": "flags/4x3/sv.svg",
-    "iso": true,
-    "name": "El Salvador"
-  },
-  {
-    "capital": "Tallinn",
-    "code": "ee",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/ee.svg",
-    "flag_4x3": "flags/4x3/ee.svg",
-    "iso": true,
-    "name": "Estonia"
-  },
-  {
-    "capital": "Helsinki",
-    "code": "fi",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/fi.svg",
-    "flag_4x3": "flags/4x3/fi.svg",
-    "iso": true,
-    "name": "Finland"
-  },
-  {
-    "capital": "Paris",
-    "code": "fr",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/fr.svg",
-    "flag_4x3": "flags/4x3/fr.svg",
-    "iso": true,
-    "name": "France"
-  },
-  {
-    "capital": "Berlin",
-    "code": "de",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/de.svg",
-    "flag_4x3": "flags/4x3/de.svg",
-    "iso": true,
-    "name": "Germany"
-  },
-  {
-    "capital": "Accra",
-    "code": "gh",
-    "continent": "Africa",
-    "flag_1x1": "flags/1x1/gh.svg",
-    "flag_4x3": "flags/4x3/gh.svg",
-    "iso": true,
-    "name": "Ghana"
-  },
-  {
-    "capital": "Athens",
-    "code": "gr",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/gr.svg",
-    "flag_4x3": "flags/4x3/gr.svg",
-    "iso": true,
-    "name": "Greece"
-  },
-  {
-    "capital": "Guatemala City",
-    "code": "gt",
-    "continent": "North America",
-    "flag_1x1": "flags/1x1/gt.svg",
-    "flag_4x3": "flags/4x3/gt.svg",
-    "iso": true,
-    "name": "Guatemala"
-  },
-  {
-    "capital": "Hong Kong",
-    "code": "hk",
-    "continent": "Asia",
-    "flag_1x1": "flags/1x1/hk.svg",
-    "flag_4x3": "flags/4x3/hk.svg",
-    "iso": true,
-    "name": "Hong Kong"
-  },
-  {
-    "capital": "Budapest",
-    "code": "hu",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/hu.svg",
-    "flag_4x3": "flags/4x3/hu.svg",
-    "iso": true,
-    "name": "Hungary"
-  },
-  {
-    "capital": "New Delhi",
-    "code": "in",
-    "continent": "Asia",
-    "flag_1x1": "flags/1x1/in.svg",
-    "flag_4x3": "flags/4x3/in.svg",
-    "iso": true,
-    "name": "India"
-  },
-  {
-    "capital": "Jakarta",
-    "code": "id",
-    "continent": "Asia",
-    "flag_1x1": "flags/1x1/id.svg",
-    "flag_4x3": "flags/4x3/id.svg",
-    "iso": true,
-    "name": "Indonesia"
-  },
-  {
-    "capital": "Dublin",
-    "code": "ie",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/ie.svg",
-    "flag_4x3": "flags/4x3/ie.svg",
-    "iso": true,
-    "name": "Ireland"
-  },
-  {
-    "capital": "Jerusalem",
-    "code": "il",
-    "continent": "Asia",
-    "flag_1x1": "flags/1x1/il.svg",
-    "flag_4x3": "flags/4x3/il.svg",
-    "iso": true,
-    "name": "Israel"
-  },
-  {
-    "capital": "Rome",
-    "code": "it",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/it.svg",
-    "flag_4x3": "flags/4x3/it.svg",
-    "iso": true,
-    "name": "Italy"
-  },
-  {
-    "capital": "Tokyo",
-    "code": "jp",
-    "continent": "Asia",
-    "flag_1x1": "flags/1x1/jp.svg",
-    "flag_4x3": "flags/4x3/jp.svg",
-    "iso": true,
-    "name": "Japan"
-  },
-  {
-    "capital": "Amman",
-    "code": "jo",
-    "continent": "Asia",
-    "flag_1x1": "flags/1x1/jo.svg",
-    "flag_4x3": "flags/4x3/jo.svg",
-    "iso": true,
-    "name": "Jordan"
-  },
-  {
-    "capital": "Astana",
-    "code": "kz",
-    "continent": "Asia",
-    "flag_1x1": "flags/1x1/kz.svg",
-    "flag_4x3": "flags/4x3/kz.svg",
-    "iso": true,
-    "name": "Kazakhstan"
-  },
-  {
-    "capital": "Nairobi",
-    "code": "ke",
-    "continent": "Africa",
-    "flag_1x1": "flags/1x1/ke.svg",
-    "flag_4x3": "flags/4x3/ke.svg",
-    "iso": true,
-    "name": "Kenya"
-  },
-  {
-    "capital": "Riga",
-    "code": "lv",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/lv.svg",
-    "flag_4x3": "flags/4x3/lv.svg",
-    "iso": true,
-    "name": "Latvia"
-  },
-  {
-    "capital": "Vilnius",
-    "code": "lt",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/lt.svg",
-    "flag_4x3": "flags/4x3/lt.svg",
-    "iso": true,
-    "name": "Lithuania"
-  },
-  {
-    "capital": "Kuala Lumpur",
-    "code": "my",
-    "continent": "Asia",
-    "flag_1x1": "flags/1x1/my.svg",
-    "flag_4x3": "flags/4x3/my.svg",
-    "iso": true,
-    "name": "Malaysia"
-  },
-  {
-    "capital": "Valletta",
-    "code": "mt",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/mt.svg",
-    "flag_4x3": "flags/4x3/mt.svg",
-    "iso": true,
-    "name": "Malta"
-  },
-  {
-    "capital": "Mexico City",
-    "code": "mx",
-    "continent": "North America",
-    "flag_1x1": "flags/1x1/mx.svg",
-    "flag_4x3": "flags/4x3/mx.svg",
-    "iso": true,
-    "name": "Mexico"
-  },
-  {
-    "capital": "Chișinău",
-    "code": "md",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/md.svg",
-    "flag_4x3": "flags/4x3/md.svg",
-    "iso": true,
-    "name": "Moldova"
-  },
-  {
-    "capital": "Monaco",
-    "code": "mc",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/mc.svg",
-    "flag_4x3": "flags/4x3/mc.svg",
-    "iso": true,
-    "name": "Monaco"
-  },
-  {
-    "capital": "Rabat",
-    "code": "ma",
-    "continent": "Africa",
-    "flag_1x1": "flags/1x1/ma.svg",
-    "flag_4x3": "flags/4x3/ma.svg",
-    "iso": true,
-    "name": "Morocco"
-  },
-  {
-    "capital": "Naypyidaw",
-    "code": "mm",
-    "continent": "Asia",
-    "flag_1x1": "flags/1x1/mm.svg",
-    "flag_4x3": "flags/4x3/mm.svg",
-    "iso": true,
-    "name": "Myanmar (Burma)"
-  },
-  {
-    "capital": "Amsterdam",
-    "code": "nl",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/nl.svg",
-    "flag_4x3": "flags/4x3/nl.svg",
-    "iso": true,
-    "name": "Netherlands"
-  },
-  {
-    "capital": "Wellington",
-    "code": "nz",
-    "continent": "Oceania",
-    "flag_1x1": "flags/1x1/nz.svg",
-    "flag_4x3": "flags/4x3/nz.svg",
-    "iso": true,
-    "name": "New Zealand"
-  },
-  {
-    "capital": "Managua",
-    "code": "ni",
-    "continent": "North America",
-    "flag_1x1": "flags/1x1/ni.svg",
-    "flag_4x3": "flags/4x3/ni.svg",
-    "iso": true,
-    "name": "Nicaragua"
-  },
-  {
-    "capital": "Abuja",
-    "code": "ng",
-    "continent": "Africa",
-    "flag_1x1": "flags/1x1/ng.svg",
-    "flag_4x3": "flags/4x3/ng.svg",
-    "iso": true,
-    "name": "Nigeria"
-  },
-  {
-    "capital": "Skopje",
-    "code": "mk",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/mk.svg",
-    "flag_4x3": "flags/4x3/mk.svg",
-    "iso": true,
-    "name": "North Macedonia"
-  },
-  {
-    "capital": "Oslo",
-    "code": "no",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/no.svg",
-    "flag_4x3": "flags/4x3/no.svg",
-    "iso": true,
-    "name": "Norway"
-  },
-  {
-    "capital": "Islamabad",
-    "code": "pk",
-    "continent": "Asia",
-    "flag_1x1": "flags/1x1/pk.svg",
-    "flag_4x3": "flags/4x3/pk.svg",
-    "iso": true,
-    "name": "Pakistan"
-  },
-  {
-    "capital": "Panama City",
-    "code": "pa",
-    "continent": "North America",
-    "flag_1x1": "flags/1x1/pa.svg",
-    "flag_4x3": "flags/4x3/pa.svg",
-    "iso": true,
-    "name": "Panama"
-  },
-  {
-    "capital": "Asunción",
-    "code": "py",
-    "continent": "South America",
-    "flag_1x1": "flags/1x1/py.svg",
-    "flag_4x3": "flags/4x3/py.svg",
-    "iso": true,
-    "name": "Paraguay"
-  },
-  {
-    "capital": "Lima",
-    "code": "pe",
-    "continent": "South America",
-    "flag_1x1": "flags/1x1/pe.svg",
-    "flag_4x3": "flags/4x3/pe.svg",
-    "iso": true,
-    "name": "Peru"
-  },
-  {
-    "capital": "Manila",
-    "code": "ph",
-    "continent": "Asia",
-    "flag_1x1": "flags/1x1/ph.svg",
-    "flag_4x3": "flags/4x3/ph.svg",
-    "iso": true,
-    "name": "Philippines"
-  },
-  {
-    "capital": "Warsaw",
-    "code": "pl",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/pl.svg",
-    "flag_4x3": "flags/4x3/pl.svg",
-    "iso": true,
-    "name": "Poland"
-  },
-  {
-    "capital": "Lisbon",
-    "code": "pt",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/pt.svg",
-    "flag_4x3": "flags/4x3/pt.svg",
-    "iso": true,
-    "name": "Portugal"
-  },
-  {
-    "capital": "Bucharest",
-    "code": "ro",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/ro.svg",
-    "flag_4x3": "flags/4x3/ro.svg",
-    "iso": true,
-    "name": "Romania"
-  },
-  {
-    "capital": "Riyadh",
-    "code": "sa",
-    "continent": "Asia",
-    "flag_1x1": "flags/1x1/sa.svg",
-    "flag_4x3": "flags/4x3/sa.svg",
-    "iso": true,
-    "name": "Saudi Arabia"
-  },
-  {
-    "capital": "Dakar",
-    "code": "sn",
-    "continent": "Africa",
-    "flag_1x1": "flags/1x1/sn.svg",
-    "flag_4x3": "flags/4x3/sn.svg",
-    "iso": true,
-    "name": "Senegal"
-  },
-  {
-    "capital": "Belgrade",
-    "code": "rs",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/rs.svg",
-    "flag_4x3": "flags/4x3/rs.svg",
-    "iso": true,
-    "name": "Serbia"
-  },
-  {
-    "capital": "Singapore",
-    "code": "sg",
-    "continent": "Asia",
-    "flag_1x1": "flags/1x1/sg.svg",
-    "flag_4x3": "flags/4x3/sg.svg",
-    "iso": true,
-    "name": "Singapore"
-  },
-  {
-    "capital": "Bratislava",
-    "code": "sk",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/sk.svg",
-    "flag_4x3": "flags/4x3/sk.svg",
-    "iso": true,
-    "name": "Slovakia"
-  },
-  {
-    "capital": "Ljubljana",
-    "code": "si",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/si.svg",
-    "flag_4x3": "flags/4x3/si.svg",
-    "iso": true,
-    "name": "Slovenia"
-  },
-  {
-    "capital": "Pretoria",
-    "code": "za",
-    "continent": "Africa",
-    "flag_1x1": "flags/1x1/za.svg",
-    "flag_4x3": "flags/4x3/za.svg",
-    "iso": true,
-    "name": "South Africa"
-  },
-  {
-    "capital": "Seoul",
-    "code": "kr",
-    "continent": "Asia",
-    "flag_1x1": "flags/1x1/kr.svg",
-    "flag_4x3": "flags/4x3/kr.svg",
-    "iso": true,
-    "name": "South Korea"
-  },
-  {
-    "capital": "Madrid",
-    "code": "es",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/es.svg",
-    "flag_4x3": "flags/4x3/es.svg",
-    "iso": true,
-    "name": "Spain"
-  },
-  {
-    "capital": "Sri Jayawardenepura Kotte, Colombo",
-    "code": "lk",
-    "continent": "Asia",
-    "flag_1x1": "flags/1x1/lk.svg",
-    "flag_4x3": "flags/4x3/lk.svg",
-    "iso": true,
-    "name": "Sri Lanka"
-  },
-  {
-    "capital": "Stockholm",
-    "code": "se",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/se.svg",
-    "flag_4x3": "flags/4x3/se.svg",
-    "iso": true,
-    "name": "Sweden"
-  },
-  {
-    "capital": "Bern",
-    "code": "ch",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/ch.svg",
-    "flag_4x3": "flags/4x3/ch.svg",
-    "iso": true,
-    "name": "Switzerland"
-  },
-  {
-    "capital": "Bangkok",
-    "code": "th",
-    "continent": "Asia",
-    "flag_1x1": "flags/1x1/th.svg",
-    "flag_4x3": "flags/4x3/th.svg",
-    "iso": true,
-    "name": "Thailand"
-  },
-  {
-    "capital": "Tunis",
-    "code": "tn",
-    "continent": "Africa",
-    "flag_1x1": "flags/1x1/tn.svg",
-    "flag_4x3": "flags/4x3/tn.svg",
-    "iso": true,
-    "name": "Tunisia"
-  },
-  {
-    "capital": "Ankara",
-    "code": "tr",
-    "continent": "Asia",
-    "flag_1x1": "flags/1x1/tr.svg",
-    "flag_4x3": "flags/4x3/tr.svg",
-    "iso": true,
-    "name": "Turkiye"
-  },
-  {
-    "capital": "Kiev",
-    "code": "ua",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/ua.svg",
-    "flag_4x3": "flags/4x3/ua.svg",
-    "iso": true,
-    "name": "Ukraine"
-  },
-  {
-    "capital": "Abu Dhabi",
-    "code": "ae",
-    "continent": "Asia",
-    "flag_1x1": "flags/1x1/ae.svg",
-    "flag_4x3": "flags/4x3/ae.svg",
-    "iso": true,
-    "name": "United Arab Emirates"
-  },
-  {
-    "capital": "London",
-    "code": "gb",
-    "continent": "Europe",
-    "flag_1x1": "flags/1x1/gb.svg",
-    "flag_4x3": "flags/4x3/gb.svg",
-    "iso": true,
-    "name": "United Kingdom"
-  },
-  {
-    "capital": "Montevideo",
-    "code": "uy",
-    "continent": "South America",
-    "flag_1x1": "flags/1x1/uy.svg",
-    "flag_4x3": "flags/4x3/uy.svg",
-    "iso": true,
-    "name": "Uruguay"
-  },
-  {
-    "capital": "Caracas",
-    "code": "ve",
-    "continent": "South America",
-    "flag_1x1": "flags/1x1/ve.svg",
-    "flag_4x3": "flags/4x3/ve.svg",
-    "iso": true,
-    "name": "Venezuela"
-  },
-  {
-    "capital": "Hanoi",
-    "code": "vn",
-    "continent": "Asia",
-    "flag_1x1": "flags/1x1/vn.svg",
-    "flag_4x3": "flags/4x3/vn.svg",
-    "iso": true,
-    "name": "Vietnam"
-  }
+    {
+        "capital": "Washington, D.C.",
+        "code": "us",
+        "continent": "North America",
+        "flag_1x1": "flags/1x1/us.svg",
+        "flag_4x3": "flags/4x3/us.svg",
+        "iso": true,
+        "name": "United States",
+        "chineseName": "美国"
+    },
+    {
+        "capital": "Tirana",
+        "code": "al",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/al.svg",
+        "flag_4x3": "flags/4x3/al.svg",
+        "iso": true,
+        "name": "Albania",
+        "chineseName": "阿尔巴尼亚"
+    },
+    {
+        "capital": "Algiers",
+        "code": "dz",
+        "continent": "Africa",
+        "flag_1x1": "flags/1x1/dz.svg",
+        "flag_4x3": "flags/4x3/dz.svg",
+        "iso": true,
+        "name": "Algeria",
+        "chineseName": "阿尔及利亚"
+    },
+    {
+        "capital": "Luanda",
+        "code": "ao",
+        "continent": "Africa",
+        "flag_1x1": "flags/1x1/ao.svg",
+        "flag_4x3": "flags/4x3/ao.svg",
+        "iso": true,
+        "name": "Angola",
+        "chineseName": "安哥拉"
+    },
+    {
+        "capital": "Buenos Aires",
+        "code": "ar",
+        "continent": "South America",
+        "flag_1x1": "flags/1x1/ar.svg",
+        "flag_4x3": "flags/4x3/ar.svg",
+        "iso": true,
+        "name": "Argentina",
+        "chineseName": "阿根廷"
+    },
+    {
+        "capital": "Yerevan",
+        "code": "am",
+        "continent": "Asia",
+        "flag_1x1": "flags/1x1/am.svg",
+        "flag_4x3": "flags/4x3/am.svg",
+        "iso": true,
+        "name": "Armenia",
+        "chineseName": "亚美尼亚"
+    },
+    {
+        "capital": "Canberra",
+        "code": "au",
+        "continent": "Oceania",
+        "flag_1x1": "flags/1x1/au.svg",
+        "flag_4x3": "flags/4x3/au.svg",
+        "iso": true,
+        "name": "Australia",
+        "chineseName": "澳大利亚"
+    },
+    {
+        "capital": "Vienna",
+        "code": "at",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/at.svg",
+        "flag_4x3": "flags/4x3/at.svg",
+        "iso": true,
+        "name": "Austria",
+        "chineseName": "奥地利"
+    },
+    {
+        "capital": "Baku",
+        "code": "az",
+        "continent": "Asia",
+        "flag_1x1": "flags/1x1/az.svg",
+        "flag_4x3": "flags/4x3/az.svg",
+        "iso": true,
+        "name": "Azerbaijan",
+        "chineseName": "阿塞拜疆"
+    },
+    {
+        "capital": "Manama",
+        "code": "bh",
+        "continent": "Asia",
+        "flag_1x1": "flags/1x1/bh.svg",
+        "flag_4x3": "flags/4x3/bh.svg",
+        "iso": true,
+        "name": "Bahrain",
+        "chineseName": "巴林"
+    },
+    {
+        "capital": "Dhaka",
+        "code": "bd",
+        "continent": "Asia",
+        "flag_1x1": "flags/1x1/bd.svg",
+        "flag_4x3": "flags/4x3/bd.svg",
+        "iso": true,
+        "name": "Bangladesh",
+        "chineseName": "孟加拉国"
+    },
+    {
+        "capital": "Brussels",
+        "code": "be",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/be.svg",
+        "flag_4x3": "flags/4x3/be.svg",
+        "iso": true,
+        "name": "Belgium",
+        "chineseName": "比利时"
+    },
+    {
+        "capital": "Sucre",
+        "code": "bo",
+        "continent": "South America",
+        "flag_1x1": "flags/1x1/bo.svg",
+        "flag_4x3": "flags/4x3/bo.svg",
+        "iso": true,
+        "name": "Bolivia",
+        "chineseName": "玻利维亚"
+    },
+    {
+        "capital": "Sarajevo",
+        "code": "ba",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/ba.svg",
+        "flag_4x3": "flags/4x3/ba.svg",
+        "iso": true,
+        "name": "Bosnia and Herzegovina",
+        "chineseName": "波斯尼亚和黑塞哥维那"
+    },
+    {
+        "capital": "Brasília",
+        "code": "br",
+        "continent": "South America",
+        "flag_1x1": "flags/1x1/br.svg",
+        "flag_4x3": "flags/4x3/br.svg",
+        "iso": true,
+        "name": "Brazil",
+        "chineseName": "巴西"
+    },
+    {
+        "capital": "Sofia",
+        "code": "bg",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/bg.svg",
+        "flag_4x3": "flags/4x3/bg.svg",
+        "iso": true,
+        "name": "Bulgaria",
+        "chineseName": "保加利亚"
+    },
+    {
+        "capital": "Ouagadougou",
+        "code": "bf",
+        "continent": "Africa",
+        "flag_1x1": "flags/1x1/bf.svg",
+        "flag_4x3": "flags/4x3/bf.svg",
+        "iso": true,
+        "name": "Burkina Faso",
+        "chineseName": "布基纳法索"
+    },
+    {
+        "capital": "Phnom Penh",
+        "code": "kh",
+        "continent": "Asia",
+        "flag_1x1": "flags/1x1/kh.svg",
+        "flag_4x3": "flags/4x3/kh.svg",
+        "iso": true,
+        "name": "Cambodia",
+        "chineseName": "柬埔寨"
+    },
+    {
+        "capital": "Yaoundé",
+        "code": "cm",
+        "continent": "Africa",
+        "flag_1x1": "flags/1x1/cm.svg",
+        "flag_4x3": "flags/4x3/cm.svg",
+        "iso": true,
+        "name": "Cameroon",
+        "chineseName": "喀麦隆"
+    },
+    {
+        "capital": "Ottawa",
+        "code": "ca",
+        "continent": "North America",
+        "flag_1x1": "flags/1x1/ca.svg",
+        "flag_4x3": "flags/4x3/ca.svg",
+        "iso": true,
+        "name": "Canada",
+        "chineseName": "加拿大"
+    },
+    {
+        "capital": "Santiago",
+        "code": "cl",
+        "continent": "South America",
+        "flag_1x1": "flags/1x1/cl.svg",
+        "flag_4x3": "flags/4x3/cl.svg",
+        "iso": true,
+        "name": "Chile",
+        "chineseName": "智利"
+    },
+    {
+        "capital": "Taipei",
+        "code": "tw",
+        "continent": "Asia",
+        "flag_1x1": "flags/1x1/tw.svg",
+        "flag_4x3": "flags/4x3/tw.svg",
+        "iso": true,
+        "name": "Taiwan",
+        "chineseName": "中国台湾"
+    },
+    {
+        "capital": "Bogotá",
+        "code": "co",
+        "continent": "South America",
+        "flag_1x1": "flags/1x1/co.svg",
+        "flag_4x3": "flags/4x3/co.svg",
+        "iso": true,
+        "name": "Colombia",
+        "chineseName": "哥伦比亚"
+    },
+    {
+        "capital": "San José",
+        "code": "cr",
+        "continent": "North America",
+        "flag_1x1": "flags/1x1/cr.svg",
+        "flag_4x3": "flags/4x3/cr.svg",
+        "iso": true,
+        "name": "Costa Rica",
+        "chineseName": "哥斯达黎加"
+    },
+    {
+        "capital": "Zagreb",
+        "code": "hr",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/hr.svg",
+        "flag_4x3": "flags/4x3/hr.svg",
+        "iso": true,
+        "name": "Croatia",
+        "chineseName": "克罗地亚"
+    },
+    {
+        "capital": "Nicosia",
+        "code": "cy",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/cy.svg",
+        "flag_4x3": "flags/4x3/cy.svg",
+        "iso": true,
+        "name": "Cyprus",
+        "chineseName": "塞浦路斯"
+    },
+    {
+        "capital": "Prague",
+        "code": "cz",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/cz.svg",
+        "flag_4x3": "flags/4x3/cz.svg",
+        "iso": true,
+        "name": "Czechia",
+        "chineseName": "捷克"
+    },
+    {
+        "capital": "Yamoussoukro",
+        "code": "ci",
+        "continent": "Africa",
+        "flag_1x1": "flags/1x1/ci.svg",
+        "flag_4x3": "flags/4x3/ci.svg",
+        "iso": true,
+        "name": "Cote d'Ivoire",
+        "chineseName": "科特迪瓦"
+    },
+    {
+        "capital": "Copenhagen",
+        "code": "dk",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/dk.svg",
+        "flag_4x3": "flags/4x3/dk.svg",
+        "iso": true,
+        "name": "Denmark",
+        "chineseName": "丹麦"
+    },
+    {
+        "capital": "Quito",
+        "code": "ec",
+        "continent": "South America",
+        "flag_1x1": "flags/1x1/ec.svg",
+        "flag_4x3": "flags/4x3/ec.svg",
+        "iso": true,
+        "name": "Ecuador",
+        "chineseName": "厄瓜多尔"
+    },
+    {
+        "capital": "Cairo",
+        "code": "eg",
+        "continent": "Africa",
+        "flag_1x1": "flags/1x1/eg.svg",
+        "flag_4x3": "flags/4x3/eg.svg",
+        "iso": true,
+        "name": "Egypt",
+        "chineseName": "埃及"
+    },
+    {
+        "capital": "San Salvador",
+        "code": "sv",
+        "continent": "North America",
+        "flag_1x1": "flags/1x1/sv.svg",
+        "flag_4x3": "flags/4x3/sv.svg",
+        "iso": true,
+        "name": "El Salvador",
+        "chineseName": "萨尔瓦多"
+    },
+    {
+        "capital": "Tallinn",
+        "code": "ee",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/ee.svg",
+        "flag_4x3": "flags/4x3/ee.svg",
+        "iso": true,
+        "name": "Estonia",
+        "chineseName": "爱沙尼亚"
+    },
+    {
+        "capital": "Helsinki",
+        "code": "fi",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/fi.svg",
+        "flag_4x3": "flags/4x3/fi.svg",
+        "iso": true,
+        "name": "Finland",
+        "chineseName": "芬兰"
+    },
+    {
+        "capital": "Paris",
+        "code": "fr",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/fr.svg",
+        "flag_4x3": "flags/4x3/fr.svg",
+        "iso": true,
+        "name": "France",
+        "chineseName": "法国"
+    },
+    {
+        "capital": "Berlin",
+        "code": "de",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/de.svg",
+        "flag_4x3": "flags/4x3/de.svg",
+        "iso": true,
+        "name": "Germany",
+        "chineseName": "德国"
+    },
+    {
+        "capital": "Accra",
+        "code": "gh",
+        "continent": "Africa",
+        "flag_1x1": "flags/1x1/gh.svg",
+        "flag_4x3": "flags/4x3/gh.svg",
+        "iso": true,
+        "name": "Ghana",
+        "chineseName": "加纳"
+    },
+    {
+        "capital": "Athens",
+        "code": "gr",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/gr.svg",
+        "flag_4x3": "flags/4x3/gr.svg",
+        "iso": true,
+        "name": "Greece",
+        "chineseName": "希腊"
+    },
+    {
+        "capital": "Guatemala City",
+        "code": "gt",
+        "continent": "North America",
+        "flag_1x1": "flags/1x1/gt.svg",
+        "flag_4x3": "flags/4x3/gt.svg",
+        "iso": true,
+        "name": "Guatemala",
+        "chineseName": "危地马拉"
+    },
+    {
+        "capital": "Hong Kong",
+        "code": "hk",
+        "continent": "Asia",
+        "flag_1x1": "flags/1x1/hk.svg",
+        "flag_4x3": "flags/4x3/hk.svg",
+        "iso": true,
+        "name": "Hong Kong",
+        "chineseName": "中国香港"
+    },
+    {
+        "capital": "Budapest",
+        "code": "hu",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/hu.svg",
+        "flag_4x3": "flags/4x3/hu.svg",
+        "iso": true,
+        "name": "Hungary",
+        "chineseName": "匈牙利"
+    },
+    {
+        "capital": "New Delhi",
+        "code": "in",
+        "continent": "Asia",
+        "flag_1x1": "flags/1x1/in.svg",
+        "flag_4x3": "flags/4x3/in.svg",
+        "iso": true,
+        "name": "India",
+        "chineseName": "印度"
+    },
+    {
+        "capital": "Jakarta",
+        "code": "id",
+        "continent": "Asia",
+        "flag_1x1": "flags/1x1/id.svg",
+        "flag_4x3": "flags/4x3/id.svg",
+        "iso": true,
+        "name": "Indonesia",
+        "chineseName": "印度尼西亚"
+    },
+    {
+        "capital": "Dublin",
+        "code": "ie",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/ie.svg",
+        "flag_4x3": "flags/4x3/ie.svg",
+        "iso": true,
+        "name": "Ireland",
+        "chineseName": "爱尔兰"
+    },
+    {
+        "capital": "Jerusalem",
+        "code": "il",
+        "continent": "Asia",
+        "flag_1x1": "flags/1x1/il.svg",
+        "flag_4x3": "flags/4x3/il.svg",
+        "iso": true,
+        "name": "Israel",
+        "chineseName": "以色列"
+    },
+    {
+        "capital": "Rome",
+        "code": "it",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/it.svg",
+        "flag_4x3": "flags/4x3/it.svg",
+        "iso": true,
+        "name": "Italy",
+        "chineseName": "意大利"
+    },
+    {
+        "capital": "Tokyo",
+        "code": "jp",
+        "continent": "Asia",
+        "flag_1x1": "flags/1x1/jp.svg",
+        "flag_4x3": "flags/4x3/jp.svg",
+        "iso": true,
+        "name": "Japan",
+        "chineseName": "日本"
+    },
+    {
+        "capital": "Amman",
+        "code": "jo",
+        "continent": "Asia",
+        "flag_1x1": "flags/1x1/jo.svg",
+        "flag_4x3": "flags/4x3/jo.svg",
+        "iso": true,
+        "name": "Jordan",
+        "chineseName": "约旦"
+    },
+    {
+        "capital": "Astana",
+        "code": "kz",
+        "continent": "Asia",
+        "flag_1x1": "flags/1x1/kz.svg",
+        "flag_4x3": "flags/4x3/kz.svg",
+        "iso": true,
+        "name": "Kazakhstan",
+        "chineseName": "哈萨克斯坦"
+    },
+    {
+        "capital": "Nairobi",
+        "code": "ke",
+        "continent": "Africa",
+        "flag_1x1": "flags/1x1/ke.svg",
+        "flag_4x3": "flags/4x3/ke.svg",
+        "iso": true,
+        "name": "Kenya",
+        "chineseName": "肯尼亚"
+    },
+    {
+        "capital": "Riga",
+        "code": "lv",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/lv.svg",
+        "flag_4x3": "flags/4x3/lv.svg",
+        "iso": true,
+        "name": "Latvia",
+        "chineseName": "拉脱维亚"
+    },
+    {
+        "capital": "Vilnius",
+        "code": "lt",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/lt.svg",
+        "flag_4x3": "flags/4x3/lt.svg",
+        "iso": true,
+        "name": "Lithuania",
+        "chineseName": "立陶宛"
+    },
+    {
+        "capital": "Kuala Lumpur",
+        "code": "my",
+        "continent": "Asia",
+        "flag_1x1": "flags/1x1/my.svg",
+        "flag_4x3": "flags/4x3/my.svg",
+        "iso": true,
+        "name": "Malaysia",
+        "chineseName": "马来西亚"
+    },
+    {
+        "capital": "Valletta",
+        "code": "mt",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/mt.svg",
+        "flag_4x3": "flags/4x3/mt.svg",
+        "iso": true,
+        "name": "Malta",
+        "chineseName": "马耳他"
+    },
+    {
+        "capital": "Mexico City",
+        "code": "mx",
+        "continent": "North America",
+        "flag_1x1": "flags/1x1/mx.svg",
+        "flag_4x3": "flags/4x3/mx.svg",
+        "iso": true,
+        "name": "Mexico",
+        "chineseName": "墨西哥"
+    },
+    {
+        "capital": "Chișinău",
+        "code": "md",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/md.svg",
+        "flag_4x3": "flags/4x3/md.svg",
+        "iso": true,
+        "name": "Moldova",
+        "chineseName": "摩尔多瓦"
+    },
+    {
+        "capital": "Monaco",
+        "code": "mc",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/mc.svg",
+        "flag_4x3": "flags/4x3/mc.svg",
+        "iso": true,
+        "name": "Monaco",
+        "chineseName": "摩纳哥"
+    },
+    {
+        "capital": "Rabat",
+        "code": "ma",
+        "continent": "Africa",
+        "flag_1x1": "flags/1x1/ma.svg",
+        "flag_4x3": "flags/4x3/ma.svg",
+        "iso": true,
+        "name": "Morocco",
+        "chineseName": "摩洛哥"
+    },
+    {
+        "capital": "Naypyidaw",
+        "code": "mm",
+        "continent": "Asia",
+        "flag_1x1": "flags/1x1/mm.svg",
+        "flag_4x3": "flags/4x3/mm.svg",
+        "iso": true,
+        "name": "Myanmar (Burma)",
+        "chineseName": "缅甸"
+    },
+    {
+        "capital": "Amsterdam",
+        "code": "nl",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/nl.svg",
+        "flag_4x3": "flags/4x3/nl.svg",
+        "iso": true,
+        "name": "Netherlands",
+        "chineseName": "荷兰"
+    },
+    {
+        "capital": "Wellington",
+        "code": "nz",
+        "continent": "Oceania",
+        "flag_1x1": "flags/1x1/nz.svg",
+        "flag_4x3": "flags/4x3/nz.svg",
+        "iso": true,
+        "name": "New Zealand",
+        "chineseName": "新西兰"
+    },
+    {
+        "capital": "Managua",
+        "code": "ni",
+        "continent": "North America",
+        "flag_1x1": "flags/1x1/ni.svg",
+        "flag_4x3": "flags/4x3/ni.svg",
+        "iso": true,
+        "name": "Nicaragua",
+        "chineseName": "尼加拉瓜"
+    },
+    {
+        "capital": "Abuja",
+        "code": "ng",
+        "continent": "Africa",
+        "flag_1x1": "flags/1x1/ng.svg",
+        "flag_4x3": "flags/4x3/ng.svg",
+        "iso": true,
+        "name": "Nigeria",
+        "chineseName": "尼日利亚"
+    },
+    {
+        "capital": "Skopje",
+        "code": "mk",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/mk.svg",
+        "flag_4x3": "flags/4x3/mk.svg",
+        "iso": true,
+        "name": "North Macedonia",
+        "chineseName": "北马其顿"
+    },
+    {
+        "capital": "Oslo",
+        "code": "no",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/no.svg",
+        "flag_4x3": "flags/4x3/no.svg",
+        "iso": true,
+        "name": "Norway",
+        "chineseName": "挪威"
+    },
+    {
+        "capital": "Islamabad",
+        "code": "pk",
+        "continent": "Asia",
+        "flag_1x1": "flags/1x1/pk.svg",
+        "flag_4x3": "flags/4x3/pk.svg",
+        "iso": true,
+        "name": "Pakistan",
+        "chineseName": "巴基斯坦"
+    },
+    {
+        "capital": "Panama City",
+        "code": "pa",
+        "continent": "North America",
+        "flag_1x1": "flags/1x1/pa.svg",
+        "flag_4x3": "flags/4x3/pa.svg",
+        "iso": true,
+        "name": "Panama",
+        "chineseName": "巴拿马"
+    },
+    {
+        "capital": "Asunción",
+        "code": "py",
+        "continent": "South America",
+        "flag_1x1": "flags/1x1/py.svg",
+        "flag_4x3": "flags/4x3/py.svg",
+        "iso": true,
+        "name": "Paraguay",
+        "chineseName": "巴拉圭"
+    },
+    {
+        "capital": "Lima",
+        "code": "pe",
+        "continent": "South America",
+        "flag_1x1": "flags/1x1/pe.svg",
+        "flag_4x3": "flags/4x3/pe.svg",
+        "iso": true,
+        "name": "Peru",
+        "chineseName": "秘鲁"
+    },
+    {
+        "capital": "Manila",
+        "code": "ph",
+        "continent": "Asia",
+        "flag_1x1": "flags/1x1/ph.svg",
+        "flag_4x3": "flags/4x3/ph.svg",
+        "iso": true,
+        "name": "Philippines",
+        "chineseName": "菲律宾"
+    },
+    {
+        "capital": "Warsaw",
+        "code": "pl",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/pl.svg",
+        "flag_4x3": "flags/4x3/pl.svg",
+        "iso": true,
+        "name": "Poland",
+        "chineseName": "波兰"
+    },
+    {
+        "capital": "Lisbon",
+        "code": "pt",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/pt.svg",
+        "flag_4x3": "flags/4x3/pt.svg",
+        "iso": true,
+        "name": "Portugal",
+        "chineseName": "葡萄牙"
+    },
+    {
+        "capital": "Bucharest",
+        "code": "ro",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/ro.svg",
+        "flag_4x3": "flags/4x3/ro.svg",
+        "iso": true,
+        "name": "Romania",
+        "chineseName": "罗马尼亚"
+    },
+    {
+        "capital": "Riyadh",
+        "code": "sa",
+        "continent": "Asia",
+        "flag_1x1": "flags/1x1/sa.svg",
+        "flag_4x3": "flags/4x3/sa.svg",
+        "iso": true,
+        "name": "Saudi Arabia",
+        "chineseName": "沙特阿拉伯"
+    },
+    {
+        "capital": "Dakar",
+        "code": "sn",
+        "continent": "Africa",
+        "flag_1x1": "flags/1x1/sn.svg",
+        "flag_4x3": "flags/4x3/sn.svg",
+        "iso": true,
+        "name": "Senegal",
+        "chineseName": "塞内加尔"
+    },
+    {
+        "capital": "Belgrade",
+        "code": "rs",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/rs.svg",
+        "flag_4x3": "flags/4x3/rs.svg",
+        "iso": true,
+        "name": "Serbia",
+        "chineseName": "塞尔维亚"
+    },
+    {
+        "capital": "Singapore",
+        "code": "sg",
+        "continent": "Asia",
+        "flag_1x1": "flags/1x1/sg.svg",
+        "flag_4x3": "flags/4x3/sg.svg",
+        "iso": true,
+        "name": "Singapore",
+        "chineseName": "新加坡"
+    },
+    {
+        "capital": "Bratislava",
+        "code": "sk",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/sk.svg",
+        "flag_4x3": "flags/4x3/sk.svg",
+        "iso": true,
+        "name": "Slovakia",
+        "chineseName": "斯洛伐克"
+    },
+    {
+        "capital": "Ljubljana",
+        "code": "si",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/si.svg",
+        "flag_4x3": "flags/4x3/si.svg",
+        "iso": true,
+        "name": "Slovenia",
+        "chineseName": "斯洛文尼亚"
+    },
+    {
+        "capital": "Pretoria",
+        "code": "za",
+        "continent": "Africa",
+        "flag_1x1": "flags/1x1/za.svg",
+        "flag_4x3": "flags/4x3/za.svg",
+        "iso": true,
+        "name": "South Africa",
+        "chineseName": "南非"
+    },
+    {
+        "capital": "Seoul",
+        "code": "kr",
+        "continent": "Asia",
+        "flag_1x1": "flags/1x1/kr.svg",
+        "flag_4x3": "flags/4x3/kr.svg",
+        "iso": true,
+        "name": "South Korea",
+        "chineseName": "韩国"
+    },
+    {
+        "capital": "Madrid",
+        "code": "es",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/es.svg",
+        "flag_4x3": "flags/4x3/es.svg",
+        "iso": true,
+        "name": "Spain",
+        "chineseName": "西班牙"
+    },
+    {
+        "capital": "Sri Jayawardenepura Kotte, Colombo",
+        "code": "lk",
+        "continent": "Asia",
+        "flag_1x1": "flags/1x1/lk.svg",
+        "flag_4x3": "flags/4x3/lk.svg",
+        "iso": true,
+        "name": "Sri Lanka",
+        "chineseName": "斯里兰卡"
+    },
+    {
+        "capital": "Stockholm",
+        "code": "se",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/se.svg",
+        "flag_4x3": "flags/4x3/se.svg",
+        "iso": true,
+        "name": "Sweden",
+        "chineseName": "瑞典"
+    },
+    {
+        "capital": "Bern",
+        "code": "ch",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/ch.svg",
+        "flag_4x3": "flags/4x3/ch.svg",
+        "iso": true,
+        "name": "Switzerland",
+        "chineseName": "瑞士"
+    },
+    {
+        "capital": "Taipei",
+        "code": "tw",
+        "continent": "Asia",
+        "flag_1x1": "flags/1x1/tw.svg",
+        "flag_4x3": "flags/4x3/tw.svg",
+        "iso": true,
+        "name": "Taiwan",
+        "chineseName": "中国台湾"
+    },
+    {
+        "capital": "Bangkok",
+        "code": "th",
+        "continent": "Asia",
+        "flag_1x1": "flags/1x1/th.svg",
+        "flag_4x3": "flags/4x3/th.svg",
+        "iso": true,
+        "name": "Thailand",
+        "chineseName": "泰国"
+    },
+    {
+        "capital": "Tunis",
+        "code": "tn",
+        "continent": "Africa",
+        "flag_1x1": "flags/1x1/tn.svg",
+        "flag_4x3": "flags/4x3/tn.svg",
+        "iso": true,
+        "name": "Tunisia",
+        "chineseName": "突尼斯"
+    },
+    {
+        "capital": "Ankara",
+        "code": "tr",
+        "continent": "Asia",
+        "flag_1x1": "flags/1x1/tr.svg",
+        "flag_4x3": "flags/4x3/tr.svg",
+        "iso": true,
+        "name": "Turkiye",
+        "chineseName": "土耳其"
+    },
+    {
+        "capital": "Kiev",
+        "code": "ua",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/ua.svg",
+        "flag_4x3": "flags/4x3/ua.svg",
+        "iso": true,
+        "name": "Ukraine",
+        "chineseName": "乌克兰"
+    },
+    {
+        "capital": "Abu Dhabi",
+        "code": "ae",
+        "continent": "Asia",
+        "flag_1x1": "flags/1x1/ae.svg",
+        "flag_4x3": "flags/4x3/ae.svg",
+        "iso": true,
+        "name": "United Arab Emirates",
+        "chineseName": "阿拉伯联合酋长国"
+    },
+    {
+        "capital": "London",
+        "code": "gb",
+        "continent": "Europe",
+        "flag_1x1": "flags/1x1/gb.svg",
+        "flag_4x3": "flags/4x3/gb.svg",
+        "iso": true,
+        "name": "United Kingdom",
+        "chineseName": "英国"
+    },
+    {
+        "capital": "Montevideo",
+        "code": "uy",
+        "continent": "South America",
+        "flag_1x1": "flags/1x1/uy.svg",
+        "flag_4x3": "flags/4x3/uy.svg",
+        "iso": true,
+        "name": "Uruguay",
+        "chineseName": "乌拉圭"
+    },
+    {
+        "capital": "Caracas",
+        "code": "ve",
+        "continent": "South America",
+        "flag_1x1": "flags/1x1/ve.svg",
+        "flag_4x3": "flags/4x3/ve.svg",
+        "iso": true,
+        "name": "Venezuela",
+        "chineseName": "委内瑞拉"
+    },
+    {
+        "capital": "Hanoi",
+        "code": "vn",
+        "continent": "Asia",
+        "flag_1x1": "flags/1x1/vn.svg",
+        "flag_4x3": "flags/4x3/vn.svg",
+        "iso": true,
+        "name": "Vietnam",
+        "chineseName": "越南"
+    }
 ]

BIN
xinkeaboard-promotion-portal/src/assets/images/home/analysis.png


BIN
xinkeaboard-promotion-portal/src/assets/images/home/competitor.png


BIN
xinkeaboard-promotion-portal/src/assets/images/home/content-left-1.png


BIN
xinkeaboard-promotion-portal/src/assets/images/home/content-left-2.png


BIN
xinkeaboard-promotion-portal/src/assets/images/home/content-left-3.png


BIN
xinkeaboard-promotion-portal/src/assets/images/home/img-left.png


BIN
xinkeaboard-promotion-portal/src/assets/images/home/img-right.png


BIN
xinkeaboard-promotion-portal/src/assets/images/home/keyword.png


BIN
xinkeaboard-promotion-portal/src/assets/images/home/left.png


BIN
xinkeaboard-promotion-portal/src/assets/images/home/right.png


+ 6 - 25
xinkeaboard-promotion-portal/src/components/AiAnalysis.vue

@@ -3,43 +3,24 @@
     <div class="ai-analysis-empty" v-if="loading">
       <Empty :autoFinish="autoFinish" :fail="fail"></Empty>
     </div>
-    <Markdown :source="rawText" v-else />
+    <Markdown :source="data" v-else />
   </div>
 </template>
 
 <script lang="ts" setup>
 import Markdown from 'vue3-markdown-it';
 
-import { ref, computed } from 'vue';
+import { computed } from 'vue';
 import { useMainStore } from '@/store';
 import Empty from '@/components/CommonEmpty.vue';
 
 const mainStore = useMainStore();
-const loading = ref<boolean>(true);
-const autoFinish = ref<boolean>(false);
-const fail = ref<boolean>(false);
 
-const rawText = ref<string>('');
+const loading = computed(() => mainStore.getAiAnalysisData.loading);
+const autoFinish = computed(() => mainStore.getAiAnalysisData.autoFinish);
+const fail = computed(() => mainStore.getAiAnalysisData.fail);
 
-const getQualitativeInfo = () => {
-  return mainStore
-    .getQualitative()
-    .then((res) => {
-      rawText.value = res.msg.replace(/^```[a-zA-Z]*\n?/, '').replace(/```$/, '');
-      autoFinish.value = true;
-      setTimeout(() => {
-        loading.value = false;
-      }, 300);
-    })
-    .catch((err) => {
-      fail.value = true;
-    })
-    .finally(async () => {
-      mainStore.setIsLoadOver(true);
-    });
-};
-
-getQualitativeInfo();
+const data = computed(() => mainStore.getAiAnalysisData.data);
 </script>
 
 <style lang="scss" scoped>

+ 105 - 0
xinkeaboard-promotion-portal/src/components/CanDo.vue

@@ -0,0 +1,105 @@
+<template>
+  <div class="can-do">
+    <div class="can-do-head">
+      <img :src="leftImg" />
+      <div class="can-do-head__center">
+        <span class="title">我们可以帮您做</span>
+      </div>
+      <img :src="rightImg" />
+    </div>
+    <div class="can-do-tip tip-1">全面分析您的产品在目标市场的情况,并可追踪竞争对手的 Google 表现。</div>
+    <div class="can-do-tip tip-2">搜索任何产品,精准定位他们在 Google 上的所有曝光位置</div>
+    <div class="can-do-img">
+      <div class="img-left">
+        <img :src="imgLeft" />
+      </div>
+      <div class="img-right">
+        <img :src="imgRight" />
+      </div>
+    </div>
+  </div>
+</template>
+
+<script lang="ts" setup>
+import { computed, ref } from 'vue';
+import leftImg from '@/assets/images/home/left.png';
+import rightImg from '@/assets/images/home/right.png';
+import imgLeft from '@/assets/images/home/img-left.png';
+import imgRight from '@/assets/images/home/img-right.png';
+</script>
+
+<style lang="scss" scoped>
+.can-do {
+  width: 100%;
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  // justify-content: center;
+  align-items: center;
+  background-color: #f6f8fa;
+  &-head {
+    display: flex;
+    align-items: center;
+    width: 744px;
+    height: 166px;
+
+    img {
+      width: 192px;
+      height: 46px;
+    }
+
+    &__center {
+      display: flex;
+      flex-direction: column;
+      justify-content: center;
+      align-items: center;
+      flex: 1;
+      width: 100%;
+      overflow: hidden;
+      padding: 0 40px;
+
+      .title {
+        font-weight: bold;
+        font-size: 30px;
+        color: #282e30;
+      }
+    }
+  }
+
+  &-tip {
+    font-weight: bold;
+    font-size: 16px;
+    color: #282e30;
+
+    &.tip-1 {
+      margin-top: 20px;
+    }
+
+    &.tip-2 {
+      margin-bottom: 55px;
+    }
+  }
+
+  &-img {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    .img-left {
+      width: 380px;
+      height: 274px;
+      margin-right: 44px;
+    }
+
+    .img-right {
+      width: 882px;
+      height: 384px;
+    }
+
+    img {
+      width: 100%;
+      height: 100%;
+      object-fit: cover;
+    }
+  }
+}
+</style>

+ 8 - 5
xinkeaboard-promotion-portal/src/components/CountrySelct.vue

@@ -27,10 +27,11 @@
                   @click="() => selectCountry(item)"
                 >
                   <img :src="item.flag" />
-                  <span :class="{ 'country-name': true, active: countryInfo.code === item.code }">
+                  <span :title="`${item.chineseName} (${item.name})`" :class="{ 'country-name': true, active: countryInfo.code === item.code }">
                     {{ item.code }}
                     {{ '-' }}
-                    {{ item.name }}
+                    {{ item.chineseName }}
+                    {{ `(${item.name})` }}
                   </span>
                 </el-dropdown-item>
               </el-dropdown-menu>
@@ -53,6 +54,7 @@ interface countryItem {
   code: string;
   name: string;
   flag: any;
+  chineseName: string;
 }
 
 const images = import.meta.glob('@/assets/flags/4x3/*.svg', { eager: true, import: 'default' });
@@ -61,10 +63,11 @@ const search = ref<string>('');
 const countryList: countryItem[] = countryData.map((item) => ({
   code: item.code.toUpperCase(),
   name: item.name,
-  flag: images[`/src/assets/flags/4x3/${item.code}.svg`]
+  flag: images[`/src/assets/flags/4x3/${item.code}.svg`],
+  chineseName: item.chineseName
 }));
 const renderContryList: ComputedRef<countryItem[]> = computed(() => {
-  return countryList.filter((item) => item.name.includes(search.value));
+  return countryList.filter((item) => (item.name + item.chineseName).includes(search.value));
 });
 const countryInfo = ref<countryItem>(JSON.parse(JSON.stringify(countryList[0])));
 const dropdown = ref<DropdownInstance>();
@@ -89,7 +92,7 @@ defineExpose({
   .custom-dropdown {
     display: flex;
     flex-direction: column;
-    width: 280px;
+    width: 320px;
     height: 398px;
     padding-left: 21px;
     box-sizing: border-box;

+ 213 - 0
xinkeaboard-promotion-portal/src/components/RecordHelp.vue

@@ -0,0 +1,213 @@
+<template>
+  <div class="record-help">
+    <div class="record-help-head">
+      <img :src="leftImg" />
+      <div class="record-help-head__center">
+        <span class="title">不懂数据?</span>
+        <span class="title">输入信息,即可马上解锁您的专属报告!</span>
+        <span class="tip">通过 AId 搜索和数据分析,及时了解目标市场及SEM 关键词状态</span>
+      </div>
+      <img :src="rightImg" />
+    </div>
+    <div class="record-help-content">
+      <div class="content-left">
+        <img :src="contentLeftPng" />
+      </div>
+      <div class="content-right">
+        <div
+          :class="{ 'content-right-item': true, active: currentStep === 1 }"
+          @click="currentStep = 1"
+        >
+          <div class="item-left">
+            <span class="item-left-title">关键词洞察</span>
+            <span class="item-left-tip">一键获取高转化关键词数据</span>
+          </div>
+          <div class="item-right">
+            <img :src="kewwordPng" />
+          </div>
+        </div>
+        <div
+          :class="{ 'content-right-item': true, active: currentStep === 2 }"
+          @click="currentStep = 2"
+        >
+          <div class="item-left">
+            <span class="item-left-title">竞品分析</span>
+            <span class="item-left-tip">帮您全面洞察竞品网站</span>
+          </div>
+          <div class="item-right">
+            <img :src="competitorPng" />
+          </div>
+        </div>
+        <div
+          :class="{ 'content-right-item': true, active: currentStep === 3 }"
+          @click="currentStep = 3"
+        >
+          <div class="item-left">
+            <span class="item-left-title">AI深度分析</span>
+            <span class="item-left-tip">让数据驱动您的营销决策</span>
+          </div>
+          <div class="item-right">
+            <img :src="analysisPng" />
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script lang="ts" setup>
+import { computed, ref } from 'vue';
+import leftImg from '@/assets/images/home/left.png';
+import rightImg from '@/assets/images/home/right.png';
+import contentLeft1 from '@/assets/images/home/content-left-1.png';
+import contentLeft2 from '@/assets/images/home/content-left-2.png';
+import contentLeft3 from '@/assets/images/home/content-left-3.png';
+
+import kewwordPng from '@/assets/images/home/keyword.png';
+import competitorPng from '@/assets/images/home/competitor.png';
+import analysisPng from '@/assets/images/home/analysis.png';
+
+const currentStep = ref<number>(1);
+
+const contentLeftPng = computed(() => {
+  if (currentStep.value === 1) return contentLeft1;
+  if (currentStep.value === 2) return contentLeft2;
+  if (currentStep.value === 3) return contentLeft3;
+});
+</script>
+
+<style lang="scss" scoped>
+.record-help {
+  width: 100%;
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  // justify-content: center;
+  align-items: center;
+  background-color: #f6f8fa;
+  &-head {
+    display: flex;
+    align-items: center;
+    width: 1184px;
+    height: 244px;
+
+    img {
+      width: 192px;
+      height: 46px;
+    }
+
+    &__center {
+      display: flex;
+      flex-direction: column;
+      justify-content: center;
+      align-items: center;
+      flex: 1;
+      width: 100%;
+      overflow: hidden;
+      padding: 0 40px;
+
+      .title {
+        font-weight: bold;
+        font-size: 30px;
+        color: #282e30;
+      }
+
+      .tip {
+        font-weight: 400;
+        font-size: 16px;
+        color: #282e30;
+        margin-top: 10px;
+      }
+    }
+  }
+
+  &-content {
+    display: flex;
+    width: 100%;
+    height: 427px;
+    padding: 0 240px;
+    box-sizing: border-box;
+    margin-top: -18px;
+
+    .content-left {
+      display: flex;
+      flex-direction: column;
+      width: 970px;
+      margin-right: 90px;
+      padding-left: 30px;
+      padding-bottom: 27px;
+
+      img {
+        width: 100%;
+        height: 100%;
+        object-fit: cover;
+      }
+    }
+
+    .content-right {
+      width: 380px;
+
+      &-item {
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        width: 380px;
+        height: 120px;
+        margin-bottom: 20px;
+        padding: 0px 20px 0px 20px;
+        box-sizing: border-box;
+        background-color: #fff;
+        cursor: pointer;
+
+        &.active {
+          background: linear-gradient(90deg, #036eb8 0%, #2ea7e0 100%);
+
+          .item-left {
+            &-title {
+              color: #ffffff;
+            }
+
+            &-tip {
+              color: rgba(255, 255, 255, 0.6);
+            }
+          }
+        }
+
+        .item-left {
+          flex: 1;
+          width: 100%;
+          display: flex;
+          flex-direction: column;
+          &-title {
+            font-weight: bold;
+            font-size: 20px;
+            color: #282e30;
+            margin-bottom: 4px;
+          }
+
+          &-tip {
+            font-weight: 400;
+            font-size: 16px;
+            color: rgba(40, 46, 48, 0.6);
+          }
+        }
+
+        .item-right {
+          width: 100px;
+          height: 100px;
+
+          img {
+            width: 100%;
+            height: 100%;
+            object-fit: contain;
+          }
+        }
+
+        &:last-child {
+          margin-bottom: 0;
+        }
+      }
+    }
+  }
+}
+</style>

+ 1 - 17
xinkeaboard-promotion-portal/src/components/TopContent.vue

@@ -36,7 +36,6 @@
 <script lang="ts" setup>
 import { ref, computed, nextTick } from 'vue';
 import { useMainStore } from '../store';
-import { checkLimit, incrementCount } from '@/utils/limit';
 
 import { useRouter } from 'vue-router';
 import CountrySelct from '@/components/CountrySelct.vue';
@@ -125,16 +124,6 @@ const validateCompetitorWebsite = (site: string) => {
 
 const acceptRecod = async () => {
   btnLoading.value = true;
-
-  const { allowed, remaining } = await checkLimit();
-  if (!allowed) {
-    showMessage({
-      type: 'warning',
-      message: `本月次数已用完`
-    });
-    btnLoading.value = false;
-    return;
-  }
   const formData = getFormData();
   const { competitorWebsite } = formData;
   const result = validateCompetitorWebsite(competitorWebsite);
@@ -148,13 +137,8 @@ const acceptRecod = async () => {
     return;
   }
   mainStore.setFormData(formData);
-  mainStore.setClearCache(true);
 
-  nextTick(() => {
-    mainStore.setClearCache(false);
-    router.push('/record');
-    // btnLoading.value = false;
-  });
+  router.push('/record');
 };
 </script>
 

+ 12 - 13
xinkeaboard-promotion-portal/src/components/competitor/TrafficChart.vue

@@ -21,7 +21,6 @@ const initChart = () => {
   chartInstance = echarts.init(chartRef.value);
   const paidsTotal: any = props.paid.reduce((a: any, b: any) => a + b);
   const naturalTotal: any = props.natural.reduce((a: any, b: any) => a + b);
-  console.log('paidsTotal, naturalTotal', paidsTotal, naturalTotal);
   const option = {
     tooltip: {
       trigger: 'axis'
@@ -40,7 +39,7 @@ const initChart = () => {
       textStyle: {
         color: '#282E30', // 图例文字颜色
         fontSize: 16
-      },
+      }
     },
     graphic: [
       // {
@@ -166,22 +165,22 @@ const initChart = () => {
           { value: naturalTotal, name: '自然', itemStyle: { color: '#7ECEF4' } }
         ],
         label: {
-          // show: true,
-          // position: 'center',
-          // // formatter: () => paidsTotal + naturalTotal, // 默认显示总数
-          // fontSize: 16,
+          show: false,
+          position: 'center',
+          fontSize: 16
           // fontWeight: 'bold'
         },
         emphasis: {
-          // label: {
-          //   show: true,
-          //   formatter: '{c}', // 鼠标移入时显示当前数值
-          //   fontSize: 18,
-          //   fontWeight: 'bold'
-          // }
+          label: {
+            show: true, // 悬浮时显示
+            formatter: '{b}流量', // 名称+数值
+            fontSize: 16,
+            fontWeight: 'bold',
+            color: '#282E30'
+          }
         },
         tooltip: {
-          trigger: 'item',
+          trigger: 'item'
           // formatter: '{b}: {c}' // 付费: 120
         },
         z: 10

+ 1 - 1
xinkeaboard-promotion-portal/src/components/keyword/search.vue

@@ -63,7 +63,7 @@ const searchVolume = computed(() => {
   &-value {
     margin-top: 20px;
     font-weight: bold;
-    font-size: 46px;
+    font-size: 30px;
     color: #282e30;
   }
 

+ 36 - 6
xinkeaboard-promotion-portal/src/store/index.ts

@@ -6,7 +6,6 @@ import {
   analysisRival,
   analysisQualitative
 } from '../utils/api';
-import { incrementCount } from '@/utils/limit';
 import type { FormDataInfo, KeywordInfo, RelatedInfoBOItem, CompetitorBOSItem } from '@/types';
 
 export const useMainStore = defineStore('main', {
@@ -24,8 +23,15 @@ export const useMainStore = defineStore('main', {
       data: [] as RelatedInfoBOItem[],
       fail: false
     },
+    aiAnalysisData: {
+      loading: true,
+      autoFinish: false,
+      data: '',
+      fail: false
+    },
     expanded: false,
-    isLoadOver: false
+    isLoadOver: false,
+    isShowCompetitor: false
   }),
   actions: {
     setClearCache(val: boolean) {
@@ -45,9 +51,22 @@ export const useMainStore = defineStore('main', {
       this.formData = data;
     },
     // 获取定性分析
-    getQualitative(): Promise<any> {
+    async getQualitative() {
+      this.aiAnalysisData.loading = true;
       const { productName, description = '' } = this.getFormData;
-      return analysisQualitative(encodeURIComponent(productName + description));
+      return analysisQualitative(encodeURIComponent(productName + description)).then((res: any) => {
+        const rawText = res.msg.replace(/^```[a-zA-Z]*\n?/, '').replace(/```$/, '');
+        this.aiAnalysisData.autoFinish = true;
+        this.aiAnalysisData.data = rawText;
+        setTimeout(() => {
+          this.aiAnalysisData.loading = false;
+          this.aiAnalysisData.autoFinish = false;
+        }, 300);
+      }).catch(() => {
+        this.aiAnalysisData.fail = true;
+      }).finally(() => {
+        this.isLoadOver = true;
+      })
     },
     // 获取竞品
     getRival(website: string): Promise<any> {
@@ -79,13 +98,18 @@ export const useMainStore = defineStore('main', {
         })
         .finally(async () => {
           this.keywordInfo.loading = false;
-          await incrementCount();
         });
     },
     initData() {
       this.getKeywordData();
       this.getSuggestions();
-      // this.getQualitative();
+      // 判断是否输入合法的竞品网站地址
+      const { competitorWebsite } = this.getFormData;
+      const isShowCompetitor = !!(competitorWebsite?.split(',') || []).filter(
+        (item) => item.trim() !== ''
+      ).length;
+      this.isShowCompetitor = isShowCompetitor;
+      this.getQualitative();
     }
   },
   getters: {
@@ -116,6 +140,12 @@ export const useMainStore = defineStore('main', {
     },
     getIsLoadOver(): boolean {
       return this.isLoadOver;
+    },
+    getIsShowCompetitor(): boolean {
+      return this.isShowCompetitor;
+    },
+    getAiAnalysisData(): { loading: boolean; autoFinish: boolean; data: string; fail: boolean} {
+      return this.aiAnalysisData;
     }
   }
 });

+ 0 - 6
xinkeaboard-promotion-portal/src/utils/http.ts

@@ -1,7 +1,5 @@
 import axios from 'axios';
-import router from '@/router'; // 如果需要跳转登录页
 import { generateSign } from '@/utils/hmac';
-import { checkLimit } from './limit';
 import { showMessage } from '@/utils/common';
 
 // 创建 axios 实例
@@ -13,10 +11,6 @@ const http = axios.create({
 // 请求拦截器
 http.interceptors.request.use(
   async (config) => {
-    const { allowed } = await checkLimit();
-    if (!allowed) {
-      return Promise.reject(new Error('本月次数已用完'));
-    }
     const { url } = config;
     const extendParams = {
       msgId: '730d7bbaf1914e8ba60e9c922d58a8c8',

+ 9 - 25
xinkeaboard-promotion-portal/src/views/Home.vue

@@ -5,42 +5,26 @@
         <TopContent></TopContent>
       </div>
     </div>
-    <div class="promotion-portal-tab record" :style="{ backgroundImage: `url(${Tab1})` }"></div>
-    <div class="promotion-portal-tab cando" :style="{ backgroundImage: `url(${Tab2Image})` }"></div>
+    <div class="promotion-portal-tab record">
+      <RecordHelp></RecordHelp>
+    </div>
+    <div class="promotion-portal-tab cando">
+      <CanDo></CanDo>
+    </div>
   </div>
 </template>
 
 <script lang="ts" setup>
-import { computed, onMounted, onUnmounted } from 'vue';
+import { onMounted, onUnmounted } from 'vue';
 import TopContent from '@/components/TopContent.vue';
+import RecordHelp from '@/components/RecordHelp.vue';
+import CanDo from "@/components/CanDo.vue";
 import { useMainStore } from '../store';
-// import AiBgImage from '@/assets/images/ai-bg.png';
-// import Tab2Image from '@/assets/images/cando.png';
-// import Record1 from '@/assets/images/record-1.png';
-// import Record2 from '@/assets/images/record-2.png';
-// import Record3 from '@/assets/images/record-3.png';
 
 const mainStore = useMainStore();
 
 const AiBgImage = 'https://assets.njnaexport.com//images/lookeen/ai-bg.png';
-const Tab2Image = 'https://assets.njnaexport.com//images/lookeen/cando.png';
-const Record1 = 'https://assets.njnaexport.com//images/lookeen/record-1.png';
-const Record2 = 'https://assets.njnaexport.com//images/lookeen/record-2.png';
-const Record3 = 'https://assets.njnaexport.com//images/lookeen/record-3.png';
 
-const currentStep = computed(() => mainStore.getCurrentStep);
-
-const Tab1 = computed(() => {
-  if (currentStep.value === 1) {
-    return Record1;
-  }
-  if (currentStep.value === 2) {
-    return Record2;
-  }
-  if (currentStep.value === 3) {
-    return Record3;
-  }
-});
 onMounted(() => {
   // sessionStorage.removeItem('formData')
 });

+ 3 - 8
xinkeaboard-promotion-portal/src/views/Record.vue

@@ -26,7 +26,7 @@
             </div>
           </div>
         </div>
-        <div class="record-wrap-content__competitor" v-if="competitorWebsiteList.length">
+        <div class="record-wrap-content__competitor" v-if="isShowCompetitor">
           <img :src="CompetitorPng" />
           <div class="list">
             <CompetitorList></CompetitorList>
@@ -59,10 +59,9 @@ import keywordPng from '../assets/images/keyword.png';
 import CompetitorPng from '../assets/images/competitor.png';
 import AiAnalysisPng from '../assets/images/ai-analysis.png';
 import { downloadPDF } from '@/utils/pdf';
-import { showMessage } from '@/utils/common';
 
 const mainStore = useMainStore();
-mainStore.initData();
+// mainStore.initData();
 
 const pdfContent = ref<HTMLElement | null>(null);
 const keywordData = computed(() => mainStore.getKeywordInfo);
@@ -70,11 +69,7 @@ const loading = computed(() => keywordData.value.loading);
 const keywordEn = computed(() => keywordData.value.data?.keywordEn);
 const keywords = computed(() => keywordData.value?.data?.keywords?.join(','));
 const expanded = computed(() => mainStore.getExpanded);
-const formData = computed(() => mainStore.getFormData);
-const competitorWebsiteList = computed(() => {
-  const list = formData.value.competitorWebsite?.split(',') || [];
-  return list.filter((item) => item.trim() !== '');
-});
+const isShowCompetitor = computed(() => mainStore.getIsShowCompetitor);
 
 const download = () => {
   downloadPDF(pdfContent.value!);