init
24
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
# Nuxt dev/build outputs
|
||||
.output
|
||||
.data
|
||||
.nuxt
|
||||
.nitro
|
||||
.cache
|
||||
dist
|
||||
|
||||
# Node dependencies
|
||||
node_modules
|
||||
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
|
||||
# Misc
|
||||
.DS_Store
|
||||
.fleet
|
||||
.idea
|
||||
|
||||
# Local env files
|
||||
.env
|
||||
.env.*
|
||||
!.env.example
|
||||
75
README.md
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
# Nuxt Minimal Starter
|
||||
|
||||
Look at the [Nuxt documentation](https://nuxt.com/docs/getting-started/introduction) to learn more.
|
||||
|
||||
## Setup
|
||||
|
||||
Make sure to install dependencies:
|
||||
|
||||
```bash
|
||||
# npm
|
||||
npm install
|
||||
|
||||
# pnpm
|
||||
pnpm install
|
||||
|
||||
# yarn
|
||||
yarn install
|
||||
|
||||
# bun
|
||||
bun install
|
||||
```
|
||||
|
||||
## Development Server
|
||||
|
||||
Start the development server on `http://localhost:3000`:
|
||||
|
||||
```bash
|
||||
# npm
|
||||
npm run dev
|
||||
|
||||
# pnpm
|
||||
pnpm dev
|
||||
|
||||
# yarn
|
||||
yarn dev
|
||||
|
||||
# bun
|
||||
bun run dev
|
||||
```
|
||||
|
||||
## Production
|
||||
|
||||
Build the application for production:
|
||||
|
||||
```bash
|
||||
# npm
|
||||
npm run build
|
||||
|
||||
# pnpm
|
||||
pnpm build
|
||||
|
||||
# yarn
|
||||
yarn build
|
||||
|
||||
# bun
|
||||
bun run build
|
||||
```
|
||||
|
||||
Locally preview production build:
|
||||
|
||||
```bash
|
||||
# npm
|
||||
npm run preview
|
||||
|
||||
# pnpm
|
||||
pnpm preview
|
||||
|
||||
# yarn
|
||||
yarn preview
|
||||
|
||||
# bun
|
||||
bun run preview
|
||||
```
|
||||
|
||||
Check out the [deployment documentation](https://nuxt.com/docs/getting-started/deployment) for more information.
|
||||
32
app/app.config.ts
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
export default defineAppConfig({
|
||||
ui: {
|
||||
header: {
|
||||
slots: {
|
||||
root: 'bg-default/75 backdrop-blur border-b border-default h-(--ui-header-height) sticky top-0 z-50',
|
||||
container: 'flex items-center justify-between gap-3 h-full',
|
||||
left: 'lg:flex-1 flex items-center gap-1.5',
|
||||
center: 'hidden lg:flex',
|
||||
right: 'flex items-center justify-end lg:flex-1 gap-1.5',
|
||||
title: 'shrink-0 font-bold text-xl text-highlighted flex items-end gap-1.5',
|
||||
toggle: 'lg:hidden',
|
||||
content: 'lg:hidden',
|
||||
overlay: 'lg:hidden',
|
||||
header: 'px-4 sm:px-6 h-(--ui-header-height) shrink-0 flex items-center justify-between gap-3',
|
||||
body: 'p-4 sm:p-6 overflow-y-auto'
|
||||
},
|
||||
variants: {
|
||||
toggleSide: {
|
||||
left: {
|
||||
toggle: '-ms-1.5'
|
||||
},
|
||||
right: {
|
||||
toggle: '-me-1.5'
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
colors: {
|
||||
primary: 'blue',
|
||||
}
|
||||
}
|
||||
})
|
||||
27
app/app.vue
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
<template>
|
||||
<UApp>
|
||||
<NuxtLayout>
|
||||
<Upagae>
|
||||
|
||||
<UPageSection
|
||||
:ui="{container:'py-9 lg:px-0' }">
|
||||
|
||||
<img src="/img/banner.png" alt="" class="w-full">
|
||||
<img src="/img/1.jpg" alt="" class="w-full">
|
||||
<img src="/img/2.jpg" alt="" class="w-full">
|
||||
<img src="/img/3.jpg" alt="" class="w-full">
|
||||
<img src="/img/4.jpg" alt="" class="w-full">
|
||||
<img src="/img/5.jpg" alt="" class="w-full">
|
||||
<img src="/img/6.jpg" alt="" class="w-full">
|
||||
<img src="/img/7.jpg" alt="" class="w-full">
|
||||
<img src="/img/8.jpg" alt="" class="w-full">
|
||||
<img src="/img/9.jpg" alt="" class="w-full">
|
||||
|
||||
</UPageSection>
|
||||
|
||||
</Upagae>
|
||||
</NuxtLayout>
|
||||
</UApp>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
</script>
|
||||
17
app/assets/css/main.css
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
@import "tailwindcss";
|
||||
@import "@nuxt/ui";
|
||||
|
||||
|
||||
|
||||
|
||||
/*:root {*/
|
||||
/* --ui-container: var(--container-4xl);*/
|
||||
|
||||
/* !*::selection {*!*/
|
||||
/* !* color: #282a30;*!*/
|
||||
/* !* background-color: #c8c8c8;*!*/
|
||||
/* !*}*!*/
|
||||
/*}*/
|
||||
/*:root {*/
|
||||
/* --ui-header-height: --spacing(24);*/
|
||||
/*}*/
|
||||
80
app/components/AppFooter.vue
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
<script lang="ts" setup>
|
||||
|
||||
|
||||
const contacts = [
|
||||
{
|
||||
label: '电话',
|
||||
value: '15280659990',
|
||||
icon: 'i-heroicons-phone',
|
||||
|
||||
},
|
||||
{
|
||||
label: '邮箱',
|
||||
value: '564737095@qq.com',
|
||||
icon: 'i-heroicons-envelope',
|
||||
|
||||
},
|
||||
{
|
||||
label: '地址',
|
||||
value: '福建省福鼎市太姥山镇海埕路13号',
|
||||
icon: 'i-heroicons-map-pin',
|
||||
|
||||
}
|
||||
]
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div
|
||||
:style="{ backgroundImage: `url('/img/index/footer_bg.png')` , }"
|
||||
class="bg-cover bg-no-repeat bg-center w-full ">
|
||||
<UFooter>
|
||||
<template #left>
|
||||
<p class="text-bold text-sm">Copyright © 闽ICP备2023022186号-2</p>
|
||||
</template>
|
||||
|
||||
<div class="grid grid-cols-1 md:flex gap-4">
|
||||
<div
|
||||
v-for="(item, index) in contacts"
|
||||
:key="index"
|
||||
|
||||
class="flex items-center rounded-xl transition-all hover:scale-[1.02] md:flex-row"
|
||||
>
|
||||
<UIcon :name="item.icon" class="w-6 h-6 text-current"/>
|
||||
|
||||
<div class="font-medium">{{ item.label }}:</div>
|
||||
<div class="mt-1 text-sm">{{ item.value }}</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<template #right>
|
||||
<!-- <UButton-->
|
||||
<!-- aria-label="Discord"-->
|
||||
<!-- color="neutral"-->
|
||||
<!-- icon="i-simple-icons-discord"-->
|
||||
<!-- target="_blank"-->
|
||||
<!-- to="https://go.nuxt.com/discord"-->
|
||||
<!-- variant="ghost"-->
|
||||
<!-- />-->
|
||||
<UButton
|
||||
|
||||
color="neutral"
|
||||
icon="simple-icons-alibabadotcom"
|
||||
target="_blank"
|
||||
to="https://chuangtewulian.1688.com/page/index.html"
|
||||
|
||||
/>
|
||||
<UButton
|
||||
|
||||
color="neutral"
|
||||
icon="i-simple-icons-tiktok"
|
||||
target="_blank"
|
||||
to="https://www.douyin.com/user/MS4wLjABAAAAdPkGyADnJFLrZBwDM9U7faUJs-wmmyEU9L34SS0CKhs"
|
||||
|
||||
/>
|
||||
</template>
|
||||
</UFooter>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
45
app/components/AppHeader.vue
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
<script lang="ts" setup>
|
||||
|
||||
const isScrolled = ref(false)
|
||||
const headerUI = ref({
|
||||
root: 'fixed top-0 left-0 right-0 z-50 bg-green-600/25 backdrop-filter-none h-8 lg:h-16'
|
||||
})
|
||||
|
||||
const handleScroll = () => {
|
||||
isScrolled.value = window.scrollY > 10
|
||||
headerUI.value.root = isScrolled.value
|
||||
? 'fixed top-0 left-0 right-0 z-50 bg-green-700 h-8 lg:h-16' // 不透明
|
||||
: 'fixed top-0 left-0 right-0 z-50 bg-green-600/25 backdrop-filter-none h-8 lg:h-16' // 半透明
|
||||
}
|
||||
|
||||
onMounted(() => window.addEventListener('scroll', handleScroll))
|
||||
onUnmounted(() => window.removeEventListener('scroll', handleScroll))
|
||||
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<UHeader
|
||||
:ui="{root:'fixed right-0 left-0 h-8 lg:h-16'}"
|
||||
|
||||
|
||||
>
|
||||
<!-- 标题部分 -->
|
||||
<template #title>
|
||||
<view class="h-6 w-auto text-primary">
|
||||
小鹿骑行
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<!-- 右侧区域 -->
|
||||
<template #right/>
|
||||
|
||||
|
||||
</UHeader>
|
||||
</template>
|
||||
//:ui="headerUI"
|
||||
//:ui="{link: 'text-white text-lg font-bold '}"
|
||||
|
||||
|
||||
22
app/components/ContactFloatingButton.vue
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
<!-- components/ContactFloatingButton.vue -->
|
||||
<template>
|
||||
<div class="fixed right-6 top-1/2 transform -translate-y-1/2 z-50 flex items-center">
|
||||
<UPopover mode="hover">
|
||||
<UButton
|
||||
|
||||
class="bg-green-500 hover:bg-green-600 text-white px-4 py-3 rounded-l-lg shadow-lg transition-all duration-300"
|
||||
color="neutral" label="联系客服"
|
||||
variant="subtle"/>
|
||||
<template #content>
|
||||
<div class="w-64 overflow-hidden transition-all duration-300 ease-out;">
|
||||
<img
|
||||
alt="QRCode"
|
||||
class="w-full h-auto border-4 border-white rounded-lg shadow-xl"
|
||||
src="/img/QRCode.png"
|
||||
>
|
||||
</div>
|
||||
</template>
|
||||
</UPopover>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
25
app/components/TitleSection.vue
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
<!-- components/TitleSection.vue -->
|
||||
<template>
|
||||
<view class="flex flex-col items-center">
|
||||
<view class="text-sm mt-4 lg:mt-20 text-primary font-bold">
|
||||
{{ subtitle }}
|
||||
</view>
|
||||
<view class="text-4xl my-6 font-bold">
|
||||
{{ title }}
|
||||
</view>
|
||||
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
defineProps({
|
||||
title: {
|
||||
type: String,
|
||||
default: '默认标题'
|
||||
},
|
||||
subtitle: {
|
||||
type: String,
|
||||
default: '默认副标题'
|
||||
}
|
||||
})
|
||||
</script>
|
||||
12
app/layouts/default.vue
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
<template>
|
||||
<div>
|
||||
<AppHeader/>
|
||||
<slot/>
|
||||
<AppFooter/>
|
||||
<ContactFloatingButton/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
// 自動導入 AppHeader 組件
|
||||
</script>
|
||||
6
eslint.config.mjs
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
// @ts-check
|
||||
import withNuxt from './.nuxt/eslint.config.mjs'
|
||||
|
||||
export default withNuxt(
|
||||
// Your custom configs here
|
||||
)
|
||||
13
nuxt.config.ts
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
// https://nuxt.com/docs/api/configuration/nuxt-config
|
||||
export default defineNuxtConfig({
|
||||
compatibilityDate: '2025-07-15',
|
||||
devtools: { enabled: true },
|
||||
modules: ['@nuxt/eslint', '@nuxt/ui', '@nuxt/image'],
|
||||
css: ['~/assets/css/main.css'],
|
||||
fonts: {
|
||||
providers: {
|
||||
google: false, // 禁用 Google Fonts
|
||||
googleicons: false // 禁用 Google Icons
|
||||
}
|
||||
},
|
||||
})
|
||||
24
package.json
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
"name": "bike",
|
||||
"type": "module",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"build": "nuxt build",
|
||||
"dev": "nuxt dev",
|
||||
"generate": "nuxt generate",
|
||||
"preview": "nuxt preview",
|
||||
"postinstall": "nuxt prepare"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nuxt/eslint": "1.9.0",
|
||||
"@nuxt/image": "1.11.0",
|
||||
"@nuxt/ui": "4.1.0",
|
||||
"@tailwindcss/postcss": "^4.1.16",
|
||||
"eslint": "^9.38.0",
|
||||
"nuxt": "^4.2.0",
|
||||
"tailwindcss": "^4.1.16",
|
||||
"typescript": "^5.9.3",
|
||||
"vue": "^3.5.22",
|
||||
"vue-router": "^4.6.3"
|
||||
}
|
||||
}
|
||||
10057
pnpm-lock.yaml
Normal file
BIN
public/favicon.ico
Normal file
|
After Width: | Height: | Size: 4.2 KiB |
BIN
public/img/1.jpg
Normal file
|
After Width: | Height: | Size: 94 KiB |
BIN
public/img/1.png
Normal file
|
After Width: | Height: | Size: 98 KiB |
BIN
public/img/2.jpg
Normal file
|
After Width: | Height: | Size: 98 KiB |
BIN
public/img/3.jpg
Normal file
|
After Width: | Height: | Size: 150 KiB |
BIN
public/img/4.jpg
Normal file
|
After Width: | Height: | Size: 117 KiB |
BIN
public/img/5.jpg
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
public/img/6.jpg
Normal file
|
After Width: | Height: | Size: 220 KiB |
BIN
public/img/7.jpg
Normal file
|
After Width: | Height: | Size: 152 KiB |
BIN
public/img/8.jpg
Normal file
|
After Width: | Height: | Size: 212 KiB |
BIN
public/img/9.jpg
Normal file
|
After Width: | Height: | Size: 363 KiB |
BIN
public/img/QRCode.png
Normal file
|
After Width: | Height: | Size: 59 KiB |
BIN
public/img/banner.png
Normal file
|
After Width: | Height: | Size: 248 KiB |
2
public/robots.txt
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
User-Agent: *
|
||||
Disallow:
|
||||
18
tsconfig.json
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
// https://nuxt.com/docs/guide/concepts/typescript
|
||||
"files": [],
|
||||
"references": [
|
||||
{
|
||||
"path": "./.nuxt/tsconfig.app.json"
|
||||
},
|
||||
{
|
||||
"path": "./.nuxt/tsconfig.server.json"
|
||||
},
|
||||
{
|
||||
"path": "./.nuxt/tsconfig.shared.json"
|
||||
},
|
||||
{
|
||||
"path": "./.nuxt/tsconfig.node.json"
|
||||
}
|
||||
]
|
||||
}
|
||||