123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- <template>
- <div class="header grid min-h-sm w-full flex flex-col">
- <div class="w-full h-[100px] flex max-w-screen-xl my-0 mx-auto justify-between items-center">
- <div class="logo">
- <a href="https://www.4dkankan.com/#/" target="_blank">
- <img v-if="locale==='zh'" src="@/assets/img/logo_4dge_cn.png" alt="logo" />
- <img v-if="locale==='en'" src="@/assets/img/logo_4dge_en.png" alt="logo" />
- </a>
- </div>
- <div class="menu">
- <n-dropdown :options="options" @select="handleSelect">
- <n-button type="primary" ghost>{{ locale === 'zh' ? $t('zh') : $t('en') }}</n-button>
- </n-dropdown>
- </div>
- </div>
- <div class="search-box w-full flex justify-center items-center flex-col">
- <n-h1 class="font-size-[48px] font-500">{{ $t('helperTip') }}</n-h1>
- <n-auto-complete v-model:value="keySearch" :options="searchOptions" class="search-box max-w-[640px]" size="large"
- round :placeholder="$t('enter_key')" blur-after-select
- @select="(index: number) => handleAutoSelect(index, searchOptions)" @keydown.enter="handleSearch">
- <template #prefix>
- <n-icon :component="SearchOutline" />
- </template>
- </n-auto-complete>
- </div>
- </div>
- </template>
- <script setup lang="ts">
- import { NH1, NIcon, NDropdown, NAutoComplete, NButton } from 'naive-ui'
- import { SearchOutline } from '@vicons/ionicons5'
- import { computedAsync } from '@vueuse/core'
- import { getArticleSearch } from '@/api'
- const { t, locale } = useI18n()
- const keySearch = ref('')
- const router = useRouter()
- const route = useRoute()
- const options = ref([
- {
- label: t('zh'),
- key: 'zh',
- },
- {
- label: t('en'),
- key: 'en',
- },
- ])
- const searchOptions = computedAsync(
- async () => {
- if (keySearch.value) {
- const list = await getArticleSearch(keySearch.value)
- console.log('list', list.data)
- return Array.from(list.data || []).map((suffix) => {
- return {
- label: suffix.title,
- value: suffix.id
- }
- })
- }
- },
- null, // initial state
- )
- const handleSelect = (key: string) => {
- locale.value = key
- localStorage.setItem('locale', key)
- router.replace({
- name: route.name,
- query: {
- lang: key
- }
- })
- setTimeout(() => {
- location.reload();
- }, 50)
- }
- onMounted(() => {
- let localeValue = localStorage.getItem('locale') || 'zh'
- if (route.query.lang) {
- localeValue = String(route.query.lang)
- locale.value = localeValue
- localStorage.setItem('locale', localeValue)
- }
- locale.value = String(localeValue)
- document.title = t('web_title')
- console.log('route', route)
- // route.query.lang = localeValue
- router.replace({
- name: route.name,
- query: {
- lang: localeValue
- }
- })
- })
- const handleAutoSelect = (index: number, list: any[]) => {
- const item = list.find((it) => it.value === index)
- // debugger;
- console.log('handleAutoUpdate', item)
- router.push({ path: `/showdoc/${item.value}` })
- }
- const handleSearch = () => {
- console.log('keySearch', keySearch.value)
- router.push({ path: '/search', query: { key: keySearch.value } })
- }
- </script>
- <style>
- .header {
- background-image: url('@/assets/img/banner_bg1.png');
- background-repeat: no-repeat;
- background-size: cover;
- background-position: top center;
- }
- .search-box .n-input {
- --n-border-radius: 10px !important;
- }
- </style>
|