CategoryList.vue 11.4 KB
<template>
  <v-container>
    <div class="tw-border tw-border-solid tw-border-[#1f88e5]">
      <v-row
        class="ma-0 pl-4 bg-grey-lighten-3 tw-border-0 tw-border-b tw-border-solid tw-border-[#1f88e5] md:tw-leading-[64px]"
      >
        <div
          class="tw-pr-0 tw-font-bold tw-w-[160px] tw-h-[36px] tw-leading-[64px] text-grey-darken-3"
        >
          CATEGORY:
        </div>
        <v-col class="flex pa-0" cols="12" sm="9">
          <span
            :class="
              'tw-leading-[50px] tw-inline-flex tw-cursor-pointer px-4 mb-1 mr-1 tw-font-medium rounded hover:tw-text-[#fff] hover:tw-bg-[#1e88e5] ' +
              (categoryStore.selectedCategory === item.categoryDisplayName &&
                'tw-text-[#fff] tw-bg-[#1e88e5]')
            "
            v-for="(item, index) in categoryStore.list"
            :key="index"
            @click="handleCategoryClick(item)"
          >
            <b class="tw-m-0 tw-inline">{{ item.categoryDisplayName }}</b>
          </span>
        </v-col>
      </v-row>
      <v-row class="pa-4 ma-0 bg-grey-lighten-4">
        <div
          class="tw-pr-0 tw-font-bold tw-w-[130px] tw-h-[36px] tw-leading-[36px] text-grey-darken-3"
        >
          DEVICE TYPE:
        </div>
        <v-col class="pa-0" cols="12" sm="9">
          <span
            :class="
              'px-4 py-1 mb-1 mr-1 tw-font-medium  rounded  tw-inline-flex tw-cursor-pointer hover:tw-text-[#fff] hover:tw-bg-[#1e88e5] ' +
              (categoryStore.selectedSubCategory === item.id &&
                'tw-text-[#fff] tw-bg-[#1e88e5]')
            "
            v-for="(item, index) in subCategoryList"
            :key="index"
            @click="handleSubCategoryClick(item)"
          >
            {{ item.name }}
          </span>
        </v-col>
      </v-row>
      <v-row
        v-if="funcCategoryList.length"
        class="pa-4 ma-0 bg-grey-lighten-4 tw-border-0 tw-border-t tw-border-dashed tw-border-[rgb(178, 178, 178)]"
      >
        <div
          class="tw-pr-0 tw-font-bold tw-w-[210px] tw-h-[36px] tw-leading-[36px] text-grey-darken-3"
        >
          MATERIAL FUNCTION:
        </div>
        <v-col class="pa-0" cols="12" sm="9">
          <span
            :class="
              'px-4 py-1 mb-1  mr-1  tw-font-medium rounded tw-inline-flex tw-cursor-pointer hover:tw-text-[#fff] hover:tw-bg-[#1e88e5] ' +
              (categoryStore.selectedFuncCategory === item.id &&
                'tw-text-[#fff] tw-bg-[#1e88e5]')
            "
            v-for="(item, index) in funcCategoryList"
            :key="index"
            @click="handleFuncCategoryClick(item)"
          >
            {{ item.name }}
          </span>
        </v-col>
      </v-row>
    </div>
  </v-container>
</template>

<script setup lang="ts">
import { useCategoryStore } from "@/stores/category";
import { useProductListStore } from "@/stores/product_list";
import type { CategoryRootType } from "@/type";
import { computed } from "vue";
import { useRouter, useRoute } from "vue-router";
import { useRouteQuery } from "@/stores/route_query";

const routeQuery = useRouteQuery();
const route = useRoute();
const router = useRouter();

const categoryStore = useCategoryStore();
const productStore = useProductListStore();
watchEffect(async () => {
  if (route.query.categories) {
    // 1. 提取 query.category 的内容
    productStore.updateKeyword("");
    const categories = route.query.categories.split(",");
    const mainCategory = categories[0].trim(); // 取第一个值
    const subCategoryName = ref("Not specified");
    subCategoryName.value = categories[1]
      ? categories[1].trim()
      : "Not specified"; // 取第二个值(如果存在)

    // 2. 更新选中的主分类
    categoryStore.updateCategory(mainCategory);
    routeQuery.updateCategories(mainCategory + "," + subCategoryName.value);
    // 3. 如果有子分类名称,查找其对应的 ID
    if (subCategoryName.value) {
      const subCategoryList = computed(() => {
        if (categoryStore.selectedCategory) {
          const tmp = categoryStore.list.filter(
            (item) =>
              item.categoryDisplayName === categoryStore.selectedCategory
          );
          return tmp?.[0]?.list || [];
        }
        return [];
      });

      // 4. 查找对应的子分类 ID
      const foundFuncCategory = subCategoryList.value.find(
        (func) => func.name === subCategoryName.value
      );

      if (foundFuncCategory) {
        const funcCategoryId = foundFuncCategory.id;
        // 你可以在这里使用找到的 funcCategoryId
        categoryStore.updateSubCategory(funcCategoryId);
      }
    }
    // 5. 判断 query 中是否存在 function,并查找对应的 ID
    if (route.query.function) {
      const functionName = route.query.function.trim();
      routeQuery.updateFunction(functionName);
      const funcCategoryList = computed(() => {
        if (categoryStore.selectedCategory) {
          const tmp = categoryStore.list.filter(
            (item) =>
              item.categoryDisplayName === categoryStore.selectedCategory
          );
          return tmp?.[0]?.productFunctions || [];
        }
        return [];
      });
      const foundFuncCategory = funcCategoryList.value.find(
        (func) => func.name === functionName
      );

      if (foundFuncCategory) {
        const funcCategoryId = foundFuncCategory.id;
        // 你可以在这里使用找到的 funcCategoryId
        categoryStore.updateFuncCategory(funcCategoryId);
      }
      // // 6. 查找对应的功能分类 ID
      // const foundFuncCategory = funcCategories.find(
      //   (func) => func.name === functionName
      // );

      // if (foundFuncCategory) {
      //   const funcCategoryId = foundFuncCategory.id;
      //   // 使用找到的 funcCategoryId
      //   categoryStore.updateFuncCategory(funcCategoryId);
      // }
    } else if (route.query.categories.includes("Energy materials")) {
      const defaultCategory = categoryStore.list[1];
      const defaultFuncCategory = defaultCategory.productFunctions[1];
      if (defaultFuncCategory) {
        categoryStore.updateFuncCategory(defaultFuncCategory.id);
      }
      router.push({
        query: {
          categories: route.query.categories,
          function: defaultFuncCategory.name,
        },
      });
    }
  } else if (
    Object.keys(route.query).length === 0 &&
    !route.path.includes("/products/detail")
  ) {
    // 检查是否有默认的分类
    const defaultCategory = categoryStore.list[0]; // 假设第一个分类是默认的

    if (defaultCategory) {
      const defaultCategoryName = defaultCategory.categoryDisplayName;
      const defaultSubCategory = defaultCategory.list[1]; // 假设第一个子分类为默认子分类
      const defaultFuncCategory = defaultCategory.productFunctions[1]; // 假设第一个功能分类为默认功能分类

      // 更新 store 和 URL
      categoryStore.updateCategory(defaultCategoryName);
      productStore.updatePageNo(1);

      if (defaultSubCategory) {
        categoryStore.updateSubCategory(defaultSubCategory.id);

        // 如果有之前的值则使用之前的值,拼接新的子分类名
        const updatedCategory =
          defaultCategoryName + "," + defaultSubCategory.name;

        // 拼接设备类型到 URL
        router.push({
          query: {
            categories: defaultCategoryName + "," + defaultSubCategory.name,
          },
        });
      }

      if (defaultFuncCategory) {
        categoryStore.updateFuncCategory(defaultFuncCategory.id);
        // 拼接功能类型到 URL
        router.push({
          query: {
            categories: defaultCategoryName + "," + defaultSubCategory.name,
            function: defaultFuncCategory.name,
          },
        });
      }
    }
  }
});
const seo = {
  "Energy materials":
    "Energy materials,Not specified,Battery accessories,Lithium-ion batteries,Capacitors,Sodium-ion batteries,Lithium-sulfur batteries,Potassium/magnesium/aluminum/zinc batteries,Air/fuel/solar,Analytical electrodes,Complete battery accessories",
  "Laboratory consumables":
    "Laboratory consumables,Not specified,Glass materials,Plastic materials,Metal materials,Ceramic materials,Paper film materials,Chemical materials,Tetrafluoro materials,Safety protection,Office supplies,Tools,Others",
  "Low-dimensional materials":
    ",Low-dimensional materialsNot specified,Zero-dimensional carbon materials,One-dimensional carbon materials,Two-dimensional carbon materials,Three-dimensional carbon materials,Inorganic nanomaterials,Organic nanomaterials,Metal nanomaterials,Others",
  Equipment:
    "Equipment,Not specified,Equipment,Accessories & fixtures,Fuel cell manufacturing and testing equipment",
};

const handleCategoryClick = (item: CategoryRootType) => {
  categoryStore.updateCategory(item.categoryDisplayName);
  categoryStore.updateSubCategory(item.list[0].id);
  productStore.updatePageNo(1);
  const defaultSubCategory = item.list[0]; // 假设第一个子分类为默认子分类

  if (item.categoryDisplayName === "Energy materials") {
    router.push({
      query: {
        categories: item.categoryDisplayName + "," + defaultSubCategory.name,
        function: item.productFunctions[0].name,
      },
    });
  } else {
    router.push({
      query: {
        categories: item.categoryDisplayName + "," + defaultSubCategory.name,
      },
    });
  }

  // const doc = document as any
  // const head = doc.getElementsByTagName('head')
  // const meta = doc.createElement('meta')
  // document.title = seo[item.categoryDisplayName as keyof typeof seo]
  // doc
  //   .querySelector('meta[name="keywords"]')
  //   .setAttribute('content', seo[item.categoryDisplayName as keyof typeof seo])
  // head[0].appendChild(meta)
};

const handleSubCategoryClick = (value: CategoryRootType) => {
  categoryStore.updateSubCategory(value.id);
  productStore.updatePageNo(1);

  // 获取当前的查询参数
  const currentQuery = router.currentRoute.value.query;
  const currentCategory = currentQuery.categories || "";

  // 如果有之前的值则使用之前的值,拼接新的子分类名
  const updatedCategory = currentCategory.split(",")[0] + "," + value.name;

  // 更新路由,保持 handleCategoryClick 的值不变
  // router.push({ query: { category: updatedCategory } });
  // 更新路由,保持 function 参数不变
  router.push({
    query: { categories: updatedCategory, function: currentQuery.function },
  });
};

const handleFuncCategoryClick = (value: CategoryRootType) => {
  categoryStore.updateFuncCategory(value.id);
  productStore.updatePageNo(1);
  // 获取当前的查询参数
  const currentQuery = router.currentRoute.value.query;

  // 将 value.name 作为新的查询参数加入到现有的 query 中
  const updatedQuery = {
    ...currentQuery, // 保持当前的查询参数
    function: value.name, // 将 value.name 添加为新的查询参数 funcCategory
  };

  // 更新路由
  router.push({ query: updatedQuery });
};

const subCategoryList = computed(() => {
  if (categoryStore.selectedCategory) {
    const tmp = categoryStore.list.filter(
      (item) => item.categoryDisplayName === categoryStore.selectedCategory
    );
    return tmp?.[0]?.list || [];
  }
  return [];
});

const funcCategoryList = computed(() => {
  if (categoryStore.selectedCategory) {
    const tmp = categoryStore.list.filter(
      (item) => item.categoryDisplayName === categoryStore.selectedCategory
    );
    return tmp?.[0]?.productFunctions || [];
  }
  return [];
});
</script>