Commit 4fa43f25d81a1a0dc8969cc556198d6249c3105b
1 parent
6c04fa04
feat: url链接对应目录
Showing
1 changed file
with
200 additions
and
44 deletions
components/CategoryList.vue
... | ... | @@ -11,7 +11,8 @@ |
11 | 11 | </div> |
12 | 12 | <v-col class="flex pa-0" cols="12" sm="9"> |
13 | 13 | <span |
14 | - :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] ' + | |
14 | + :class=" | |
15 | + '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] ' + | |
15 | 16 | (categoryStore.selectedCategory === item.categoryDisplayName && |
16 | 17 | 'tw-text-[#fff] tw-bg-[#1e88e5]') |
17 | 18 | " |
... | ... | @@ -31,12 +32,14 @@ |
31 | 32 | </div> |
32 | 33 | <v-col class="pa-0" cols="12" sm="9"> |
33 | 34 | <span |
34 | - :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] ' + | |
35 | - (categoryStore.selectedSubCategory === item.id && 'tw-text-[#fff] tw-bg-[#1e88e5]') | |
35 | + :class=" | |
36 | + '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] ' + | |
37 | + (categoryStore.selectedSubCategory === item.id && | |
38 | + 'tw-text-[#fff] tw-bg-[#1e88e5]') | |
36 | 39 | " |
37 | 40 | v-for="(item, index) in subCategoryList" |
38 | 41 | :key="index" |
39 | - @click="handleSubCategoryClick(item.id)" | |
42 | + @click="handleSubCategoryClick(item)" | |
40 | 43 | > |
41 | 44 | {{ item.name }} |
42 | 45 | </span> |
... | ... | @@ -53,12 +56,14 @@ |
53 | 56 | </div> |
54 | 57 | <v-col class="pa-0" cols="12" sm="9"> |
55 | 58 | <span |
56 | - :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] ' + | |
57 | - (categoryStore.selectedFuncCategory === item.id && 'tw-text-[#fff] tw-bg-[#1e88e5]') | |
59 | + :class=" | |
60 | + '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] ' + | |
61 | + (categoryStore.selectedFuncCategory === item.id && | |
62 | + 'tw-text-[#fff] tw-bg-[#1e88e5]') | |
58 | 63 | " |
59 | 64 | v-for="(item, index) in funcCategoryList" |
60 | 65 | :key="index" |
61 | - @click="handleFuncCategoryClick(item.id)" | |
66 | + @click="handleFuncCategoryClick(item)" | |
62 | 67 | > |
63 | 68 | {{ item.name }} |
64 | 69 | </span> |
... | ... | @@ -69,34 +74,160 @@ |
69 | 74 | </template> |
70 | 75 | |
71 | 76 | <script setup lang="ts"> |
72 | -import { useCategoryStore } from '@/stores/category' | |
73 | -import { useProductListStore } from '@/stores/product_list' | |
74 | -import type { CategoryRootType } from '@/type' | |
75 | -import { computed } from 'vue' | |
76 | -import { useRouter, useRoute } from 'vue-router' | |
77 | +import { useCategoryStore } from "@/stores/category"; | |
78 | +import { useProductListStore } from "@/stores/product_list"; | |
79 | +import type { CategoryRootType } from "@/type"; | |
80 | +import { computed } from "vue"; | |
81 | +import { useRouter, useRoute } from "vue-router"; | |
82 | + | |
83 | +const route = useRoute(); | |
84 | +const router = useRouter(); | |
85 | + | |
86 | +const categoryStore = useCategoryStore(); | |
87 | +const productStore = useProductListStore(); | |
88 | +watchEffect(async () => { | |
89 | + if (route.query.category) { | |
90 | + // 1. 提取 query.category 的内容 | |
91 | + const categories = route.query.category.split(","); | |
92 | + const mainCategory = categories[0].trim(); // 取第一个值 | |
93 | + const subCategoryName = categories[1] ? categories[1].trim() : null; // 取第二个值(如果存在) | |
94 | + | |
95 | + // 2. 更新选中的主分类 | |
96 | + categoryStore.updateCategory(mainCategory); | |
97 | + | |
98 | + // 3. 如果有子分类名称,查找其对应的 ID | |
99 | + if (subCategoryName) { | |
100 | + const subCategoryList = computed(() => { | |
101 | + if (categoryStore.selectedCategory) { | |
102 | + const tmp = categoryStore.list.filter( | |
103 | + (item) => | |
104 | + item.categoryDisplayName === categoryStore.selectedCategory | |
105 | + ); | |
106 | + return tmp?.[0]?.list || []; | |
107 | + } | |
108 | + return []; | |
109 | + }); | |
77 | 110 | |
78 | -const router = useRouter() | |
111 | + // 4. 查找对应的子分类 ID | |
112 | + const foundFuncCategory = subCategoryList.value.find( | |
113 | + (func) => func.name === subCategoryName | |
114 | + ); | |
79 | 115 | |
80 | -const categoryStore = useCategoryStore() | |
81 | -const productStore = useProductListStore() | |
116 | + if (foundFuncCategory) { | |
117 | + const funcCategoryId = foundFuncCategory.id; | |
118 | + // 你可以在这里使用找到的 funcCategoryId | |
119 | + categoryStore.updateSubCategory(funcCategoryId); | |
120 | + } | |
121 | + } | |
122 | + // 5. 判断 query 中是否存在 function,并查找对应的 ID | |
123 | + if (route.query.function) { | |
124 | + const functionName = route.query.function.trim(); | |
125 | + const funcCategoryList = computed(() => { | |
126 | + if (categoryStore.selectedCategory) { | |
127 | + const tmp = categoryStore.list.filter( | |
128 | + (item) => | |
129 | + item.categoryDisplayName === categoryStore.selectedCategory | |
130 | + ); | |
131 | + return tmp?.[0]?.productFunctions || []; | |
132 | + } | |
133 | + return []; | |
134 | + }); | |
135 | + const foundFuncCategory = funcCategoryList.value.find( | |
136 | + (func) => func.name === functionName | |
137 | + ); | |
82 | 138 | |
139 | + if (foundFuncCategory) { | |
140 | + const funcCategoryId = foundFuncCategory.id; | |
141 | + // 你可以在这里使用找到的 funcCategoryId | |
142 | + categoryStore.updateFuncCategory(funcCategoryId); | |
143 | + } | |
144 | + // // 6. 查找对应的功能分类 ID | |
145 | + // const foundFuncCategory = funcCategories.find( | |
146 | + // (func) => func.name === functionName | |
147 | + // ); | |
148 | + | |
149 | + // if (foundFuncCategory) { | |
150 | + // const funcCategoryId = foundFuncCategory.id; | |
151 | + // // 使用找到的 funcCategoryId | |
152 | + // categoryStore.updateFuncCategory(funcCategoryId); | |
153 | + // } | |
154 | + } | |
155 | + } else { | |
156 | + } | |
157 | +}); | |
83 | 158 | const seo = { |
84 | - 'Energy materials': | |
85 | - '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', | |
86 | - 'Laboratory consumables': | |
87 | - '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', | |
88 | - 'Low-dimensional materials': | |
89 | - ',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', | |
159 | + "Energy materials": | |
160 | + "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", | |
161 | + "Laboratory consumables": | |
162 | + "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", | |
163 | + "Low-dimensional materials": | |
164 | + ",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", | |
90 | 165 | Equipment: |
91 | - 'Equipment,Not specified,Equipment,Accessories & fixtures,Fuel cell manufacturing and testing equipment' | |
92 | -} | |
166 | + "Equipment,Not specified,Equipment,Accessories & fixtures,Fuel cell manufacturing and testing equipment", | |
167 | +}; | |
168 | + | |
169 | +onMounted(() => { | |
170 | + if (Object.keys(route.query).length === 0) { | |
171 | + // 检查是否有默认的分类 | |
172 | + const defaultCategory = categoryStore.list[0]; // 假设第一个分类是默认的 | |
173 | + if (defaultCategory) { | |
174 | + const defaultCategoryName = defaultCategory.categoryDisplayName; | |
175 | + const defaultSubCategory = defaultCategory.list[0]; // 假设第一个子分类为默认子分类 | |
176 | + const defaultFuncCategory = defaultCategory.productFunctions[0]; // 假设第一个功能分类为默认功能分类 | |
177 | + | |
178 | + // 更新 store 和 URL | |
179 | + categoryStore.updateCategory(defaultCategoryName); | |
180 | + productStore.updatePageNo(1); | |
181 | + | |
182 | + if (defaultSubCategory) { | |
183 | + categoryStore.updateSubCategory(defaultSubCategory.id); | |
184 | + | |
185 | + // 如果有之前的值则使用之前的值,拼接新的子分类名 | |
186 | + const updatedCategory = | |
187 | + defaultCategoryName + "," + defaultSubCategory.name; | |
188 | + | |
189 | + // 拼接设备类型到 URL | |
190 | + router.push({ | |
191 | + query: { | |
192 | + category: defaultCategoryName + "," + defaultSubCategory.name, | |
193 | + }, | |
194 | + }); | |
195 | + } | |
196 | + | |
197 | + if (defaultFuncCategory) { | |
198 | + categoryStore.updateFuncCategory(defaultFuncCategory.id); | |
199 | + // 拼接功能类型到 URL | |
200 | + router.push({ | |
201 | + query: { | |
202 | + category: defaultCategoryName + "," + defaultSubCategory.name, | |
203 | + function: defaultFuncCategory.name, | |
204 | + }, | |
205 | + }); | |
206 | + } | |
207 | + } | |
208 | + } | |
209 | +}); | |
93 | 210 | |
94 | 211 | const handleCategoryClick = (item: CategoryRootType) => { |
95 | - categoryStore.updateCategory(item.categoryDisplayName) | |
96 | - categoryStore.updateSubCategory(item.list[0].id) | |
97 | - productStore.updatePageNo(1) | |
212 | + categoryStore.updateCategory(item.categoryDisplayName); | |
213 | + categoryStore.updateSubCategory(item.list[0].id); | |
214 | + productStore.updatePageNo(1); | |
215 | + const defaultSubCategory = item.list[0]; // 假设第一个子分类为默认子分类 | |
98 | 216 | |
99 | - router.push({ query: { category: item.categoryDisplayName } }) | |
217 | + if (item.categoryDisplayName === "Energy materials") { | |
218 | + router.push({ | |
219 | + query: { | |
220 | + category: item.categoryDisplayName + "," + defaultSubCategory.name, | |
221 | + function: item.productFunctions[0].name, | |
222 | + }, | |
223 | + }); | |
224 | + } else { | |
225 | + router.push({ | |
226 | + query: { | |
227 | + category: item.categoryDisplayName + "," + defaultSubCategory.name, | |
228 | + }, | |
229 | + }); | |
230 | + } | |
100 | 231 | |
101 | 232 | // const doc = document as any |
102 | 233 | // const head = doc.getElementsByTagName('head') |
... | ... | @@ -106,35 +237,60 @@ const handleCategoryClick = (item: CategoryRootType) => { |
106 | 237 | // .querySelector('meta[name="keywords"]') |
107 | 238 | // .setAttribute('content', seo[item.categoryDisplayName as keyof typeof seo]) |
108 | 239 | // head[0].appendChild(meta) |
109 | -} | |
240 | +}; | |
241 | + | |
242 | +const handleSubCategoryClick = (value: CategoryRootType) => { | |
243 | + categoryStore.updateSubCategory(value.id); | |
244 | + productStore.updatePageNo(1); | |
245 | + | |
246 | + // 获取当前的查询参数 | |
247 | + const currentQuery = router.currentRoute.value.query; | |
248 | + const currentCategory = currentQuery.category || ""; | |
249 | + | |
250 | + // 如果有之前的值则使用之前的值,拼接新的子分类名 | |
251 | + const updatedCategory = currentCategory.split(",")[0] + "," + value.name; | |
252 | + | |
253 | + // 更新路由,保持 handleCategoryClick 的值不变 | |
254 | + // router.push({ query: { category: updatedCategory } }); | |
255 | + // 更新路由,保持 function 参数不变 | |
256 | + router.push({ | |
257 | + query: { category: updatedCategory, function: currentQuery.function }, | |
258 | + }); | |
259 | +}; | |
260 | + | |
261 | +const handleFuncCategoryClick = (value: CategoryRootType) => { | |
262 | + categoryStore.updateFuncCategory(value.id); | |
263 | + productStore.updatePageNo(1); | |
264 | + // 获取当前的查询参数 | |
265 | + const currentQuery = router.currentRoute.value.query; | |
110 | 266 | |
111 | -const handleSubCategoryClick = (value: string) => { | |
112 | - categoryStore.updateSubCategory(value) | |
113 | - productStore.updatePageNo(1) | |
114 | -} | |
267 | + // 将 value.name 作为新的查询参数加入到现有的 query 中 | |
268 | + const updatedQuery = { | |
269 | + ...currentQuery, // 保持当前的查询参数 | |
270 | + function: value.name, // 将 value.name 添加为新的查询参数 funcCategory | |
271 | + }; | |
115 | 272 | |
116 | -const handleFuncCategoryClick = (value: string) => { | |
117 | - categoryStore.updateFuncCategory(value) | |
118 | - productStore.updatePageNo(1) | |
119 | -} | |
273 | + // 更新路由 | |
274 | + router.push({ query: updatedQuery }); | |
275 | +}; | |
120 | 276 | |
121 | 277 | const subCategoryList = computed(() => { |
122 | 278 | if (categoryStore.selectedCategory) { |
123 | 279 | const tmp = categoryStore.list.filter( |
124 | 280 | (item) => item.categoryDisplayName === categoryStore.selectedCategory |
125 | - ) | |
126 | - return tmp?.[0]?.list || [] | |
281 | + ); | |
282 | + return tmp?.[0]?.list || []; | |
127 | 283 | } |
128 | - return [] | |
129 | -}) | |
284 | + return []; | |
285 | +}); | |
130 | 286 | |
131 | 287 | const funcCategoryList = computed(() => { |
132 | 288 | if (categoryStore.selectedCategory) { |
133 | 289 | const tmp = categoryStore.list.filter( |
134 | 290 | (item) => item.categoryDisplayName === categoryStore.selectedCategory |
135 | - ) | |
136 | - return tmp?.[0]?.productFunctions || [] | |
291 | + ); | |
292 | + return tmp?.[0]?.productFunctions || []; | |
137 | 293 | } |
138 | - return [] | |
139 | -}) | |
294 | + return []; | |
295 | +}); | |
140 | 296 | </script> | ... | ... |