mcwl-pc/app/pages/model-square.vue

247 lines
6.5 KiB
Vue

<script setup lang="ts">
import { commonApi } from "@/api/common";
import { ArrowBack, ArrowForward } from '@vicons/ionicons5';
import { ref } from "vue";
definePageMeta({
layout: "default",
});
const params = ref({
name: null,
order: null,
type: null
})
// const hotNameList = ref([
// '哪吒',
// '电商',
// '产品',
// '海报',
// '国潮',
// '写真',
// '推文',
// 'XL',
// ])
const listRef = ref(null);
// function handleSearch() {
// onSearch()
// }
const modelCategoryList = ref([]);
async function getDictType() {
try {
const res = await commonApi.dictType({ type: "model_child_category" });
if (res.code === 200) {
modelCategoryList.value = res.data;
}
} catch (error) {
console.log(error);
}
}
getDictType();
//执行搜索的时候
function onSearch() {
if (listRef.value) {
listRef.value?.initPageNUm();
}
}
// 切换类型
function changeCategory(item:any){
params.value.type = item.dictValue
onSearch()
}
// function onHot(name:string){
// params.value.name = name
// onSearch()
// }
</script>
<template>
<div class="p-6">
<div class="header flex h-[150px] border-b border-b-[#ebebeb]">
<div class="flex-1 py-2">
<div class="max-w-4xl mx-auto">
<div class="relative flex items-center w-full">
<!-- 搜索输入框 -->
<input
type="text"
class="w-full py-3 px-6 text-lg text-gray-600 placeholder-gray-400 bg-white border-2 border-blue-500 rounded-full focus:outline-none focus:border-blue-600"
placeholder="搜索模型/图片/创作者寻找灵感"
@keyup.enter="onSearch"
v-model="params.name"
/>
<!-- 相机图标 -->
<button class="absolute right-24 p-2 mr-2 text-gray-400 hover:text-gray-600">
<svg
xmlns="http://www.w3.org/2000/svg"
class="h-6 w-6"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z"
/>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M15 13a3 3 0 11-6 0 3 3 0 016 0z"
/>
</svg>
</button>
<!-- 搜索按钮 -->
<button
class="absolute right-0 px-8 py-3 mr-2 text-white bg-blue-500 rounded-full hover:bg-blue-600 focus:outline-none"
@click="onSearch"
>
搜索
</button>
</div>
</div>
<!-- <div class="flex p-3">
<div v-for="(item, index) in hotNameList" @click="onHot(item)" :key="index" class="mr-3 mb-2 cursor-pointer">
{{ item }}
</div>
</div> -->
</div>
<div class="w-[500px] ml-4">
<!-- <img
class="h-[130px] w-full rounded-lg"
src="https://img.zcool.cn/tubelocation/e41767ac6706cd0109100099e04b.jpg?imageMogr2/format/webp"
alt=""
/> -->
<n-carousel show-arrow autoplay>
<img
class="carousel-img"
src="https://naive-ui.oss-cn-beijing.aliyuncs.com/carousel-img/carousel1.jpeg"
/>
<img
class="carousel-img"
src="https://naive-ui.oss-cn-beijing.aliyuncs.com/carousel-img/carousel2.jpeg"
/>
<img
class="carousel-img"
src="https://naive-ui.oss-cn-beijing.aliyuncs.com/carousel-img/carousel3.jpeg"
/>
<img
class="carousel-img"
src="https://naive-ui.oss-cn-beijing.aliyuncs.com/carousel-img/carousel4.jpeg"
/>
<template #arrow="{ prev, next }">
<div class="custom-arrow">
<button type="button" class="custom-arrow--left" @click="prev">
<n-icon><ArrowBack /></n-icon>
</button>
<button type="button" class="custom-arrow--right" @click="next">
<n-icon><ArrowForward /></n-icon>
</button>
</div>
</template>
<template #dots="{ total, currentIndex, to }">
<ul class="custom-dots">
<li
v-for="index of total"
:key="index"
:class="{ ['is-active']: currentIndex === index - 1 }"
@click="to(index - 1)"
/>
</ul>
</template>
</n-carousel>
</div>
</div>
<div class="flex flex-wrap">
<div class="flex flex-wrap">
<div
v-for="(item, index) in modelCategoryList"
:key="index"
:style="{color: item.dictValue === params.type ? '#000' : '#6f6f6f'}"
@click="changeCategory(item)"
class="pt-4 mr-4 cursor-pointer"
>
{{ item.dictLabel }}
</div>
</div>
</div>
<div class="flex flex-wrap">
<ModelList ref="listRef" :params="params"></ModelList>
</div>
</div>
</template>
<style lang="scss" scoped>
.grid > div {
transition: transform 0.2s;
}
.grid > div:hover {
transform: translateY(-2px);
}
.carousel-img {
width: 100%;
height: 120px;
border-radius: 6px;
object-fit: cover;
}
.custom-arrow {
display: flex;
position: absolute;
bottom: 25px;
right: 10px;
}
.custom-arrow button {
display: inline-flex;
align-items: center;
justify-content: center;
width: 28px;
height: 28px;
margin-right: 12px;
color: #fff;
background-color: rgba(255, 255, 255, 0.1);
border-width: 0;
border-radius: 8px;
transition: background-color 0.3s cubic-bezier(0.4, 0, 0.2, 1);
cursor: pointer;
}
.custom-arrow button:hover {
background-color: rgba(255, 255, 255, 0.2);
}
.custom-arrow button:active {
transform: scale(0.95);
transform-origin: center;
}
.custom-dots {
display: flex;
margin: 0;
padding: 0;
position: absolute;
bottom: 20px;
left: 20px;
}
.custom-dots li {
display: inline-block;
width: 12px;
height: 4px;
margin: 0 3px;
border-radius: 4px;
background-color: rgba(255, 255, 255, 0.4);
transition:
width 0.3s,
background-color 0.3s cubic-bezier(0.4, 0, 0.2, 1);
cursor: pointer;
}
.custom-dots li.is-active {
width: 40px;
background: #fff;
}
</style>