This commit is contained in:
parent
faf95ec89c
commit
3c4ec7aada
4
.env
4
.env
@ -1,2 +1,4 @@
|
|||||||
VITE_BASE_URL=http://localhost:3000
|
VITE_BASE_URL=http://localhost:3000
|
||||||
VITE_YANDEX_MAPS_KEY=13f4c06b-cb7e-4eeb-81f1-af52f12587b2
|
VITE_YANDEX_MAPS_KEY=13f4c06b-cb7e-4eeb-81f1-af52f12587b2
|
||||||
|
SMTP_USER=rentalservicekg@yandex.ru
|
||||||
|
SMTP_APP_PASSWORD=uljislsoihthciju
|
||||||
|
|||||||
@ -13,6 +13,9 @@ COPY --from=build /app/.output/ ./
|
|||||||
ENV PORT=80
|
ENV PORT=80
|
||||||
ENV VITE_BASE_URL=https://rental.koptilnya.xyz
|
ENV VITE_BASE_URL=https://rental.koptilnya.xyz
|
||||||
ENV VITE_YANDEX_MAPS_KEY=13f4c06b-cb7e-4eeb-81f1-af52f12587b2
|
ENV VITE_YANDEX_MAPS_KEY=13f4c06b-cb7e-4eeb-81f1-af52f12587b2
|
||||||
|
ENV SMTP_USER=rentalservicekg@yandex.ru
|
||||||
|
ENV SMTP_APP_PASSWORD=uljislsoihthciju
|
||||||
|
|
||||||
|
|
||||||
EXPOSE 80
|
EXPOSE 80
|
||||||
|
|
||||||
|
|||||||
@ -43,9 +43,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<UCard variant="subtle" class="w-full" :ui="{ root: 'max-w-[500px]' }">
|
<UCard variant="subtle" class="w-full" :ui="{ root: 'max-w-[500px]' }">
|
||||||
<form name="contacts" method="POST" netlify @submit.prevent="onSubmit">
|
<form name="contacts" method="POST" @submit.prevent="onSubmit">
|
||||||
<input type="hidden" name="form-name" value="contacts">
|
|
||||||
|
|
||||||
<div class="flex flex-col gap-4">
|
<div class="flex flex-col gap-4">
|
||||||
<div class="flex flex-col gap-2">
|
<div class="flex flex-col gap-2">
|
||||||
Как к вам обращаться
|
Как к вам обращаться
|
||||||
@ -125,13 +123,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
<form name="contacts" netlify hidden>
|
|
||||||
<input type="hidden" name="form-name" value="contacts">
|
|
||||||
<input type="text" name="name">
|
|
||||||
<input type="text" name="phone">
|
|
||||||
<input type="text" name="service">
|
|
||||||
<textarea name="comment" />
|
|
||||||
</form>
|
|
||||||
</UCard>
|
</UCard>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -207,28 +198,17 @@ const [phone, phoneAttrs] = defineField('phone')
|
|||||||
const [service, serviceAttrs] = defineField('service')
|
const [service, serviceAttrs] = defineField('service')
|
||||||
const [comment, commentAttrs] = defineField('comment')
|
const [comment, commentAttrs] = defineField('comment')
|
||||||
|
|
||||||
function encode(data: Record<string, string>) {
|
|
||||||
return Object.keys(data)
|
|
||||||
.map(key => `${encodeURIComponent(key)}=${encodeURIComponent(data[key])}`)
|
|
||||||
.join('&')
|
|
||||||
}
|
|
||||||
|
|
||||||
const onSubmit = handleSubmit(async (values) => {
|
const onSubmit = handleSubmit(async (values) => {
|
||||||
await fetch('/', {
|
const res = await $fetch('/api/send_mail', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
body: values,
|
||||||
body: encode({
|
|
||||||
'form-name': 'contacts',
|
|
||||||
'name': values.name,
|
|
||||||
'phone': values.phone,
|
|
||||||
'service': values.service,
|
|
||||||
'comment': values.comment,
|
|
||||||
}),
|
|
||||||
})
|
})
|
||||||
|
|
||||||
toast.add({
|
if (res.ok) {
|
||||||
title: 'Заявка успешно отправлена!',
|
toast.add({
|
||||||
})
|
title: 'Заявка успешно отправлена!',
|
||||||
|
})
|
||||||
|
}
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@ -1,29 +1,31 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="layout">
|
<div class="layout">
|
||||||
<UHeader
|
<ClientOnly>
|
||||||
title="Rental"
|
<UHeader
|
||||||
:toggle="false"
|
title="Rental"
|
||||||
:ui="{
|
:toggle="false"
|
||||||
root: 'fixed bg-transparent w-full',
|
:ui="{
|
||||||
left: 'relative flex items-center w-full',
|
root: 'fixed bg-transparent w-full',
|
||||||
container: 'gap-0',
|
left: 'relative flex items-center w-full',
|
||||||
right: 'hidden',
|
container: 'gap-0',
|
||||||
}"
|
right: 'hidden',
|
||||||
>
|
}"
|
||||||
<template #left>
|
>
|
||||||
<div class="text-lg">
|
<template #left>
|
||||||
Rental
|
<div class="text-lg">
|
||||||
</div>
|
Rental
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="absolute left-1/2 transform -translate-x-1/2">
|
<div class="absolute left-1/2 transform -translate-x-1/2">
|
||||||
<UTabs v-model="activeTab" :size="isMobile ? 'md' : 'xl'" :content="false" :items="tabs" />
|
<UTabs v-model="activeTab" :size="isMobile ? 'md' : 'xl'" :content="false" :items="tabs" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="ml-auto">
|
<div class="ml-auto">
|
||||||
<UButton href="#contacts" :size="isMobile ? 'md' : 'xl'" label="Связаться" />
|
<UButton href="#contacts" :size="isMobile ? 'md' : 'xl'" label="Связаться" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</UHeader>
|
</UHeader>
|
||||||
|
</ClientOnly>
|
||||||
|
|
||||||
<UMain>
|
<UMain>
|
||||||
<slot />
|
<slot />
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import { process } from 'std-env'
|
|||||||
const { resolve } = createResolver(import.meta.url)
|
const { resolve } = createResolver(import.meta.url)
|
||||||
|
|
||||||
export default defineNuxtConfig({
|
export default defineNuxtConfig({
|
||||||
ssr: false,
|
ssr: true,
|
||||||
compatibilityDate: '2025-05-15',
|
compatibilityDate: '2025-05-15',
|
||||||
devtools: { enabled: true },
|
devtools: { enabled: true },
|
||||||
modules: [
|
modules: [
|
||||||
@ -60,10 +60,4 @@ export default defineNuxtConfig({
|
|||||||
fonts: {
|
fonts: {
|
||||||
provider: 'google',
|
provider: 'google',
|
||||||
},
|
},
|
||||||
nitro: {
|
|
||||||
preset: 'static',
|
|
||||||
},
|
|
||||||
routeRules: {
|
|
||||||
'/**': { prerender: true },
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
|
|||||||
@ -14,7 +14,6 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@nuxt/content": "^3.7.1",
|
"@nuxt/content": "^3.7.1",
|
||||||
"gsap": "3.13",
|
|
||||||
"@nuxt/fonts": "0.11.4",
|
"@nuxt/fonts": "0.11.4",
|
||||||
"@nuxt/icon": "1.15.0",
|
"@nuxt/icon": "1.15.0",
|
||||||
"@nuxt/image": "1.10.0",
|
"@nuxt/image": "1.10.0",
|
||||||
@ -26,7 +25,9 @@
|
|||||||
"axios": "^1.12.2",
|
"axios": "^1.12.2",
|
||||||
"dayjs": "^1.11.13",
|
"dayjs": "^1.11.13",
|
||||||
"decimal.js": "^10.5.0",
|
"decimal.js": "^10.5.0",
|
||||||
|
"gsap": "3.13",
|
||||||
"maska": "^3.2.0",
|
"maska": "^3.2.0",
|
||||||
|
"nodemailer": "^7.0.11",
|
||||||
"nuxt": "^4.1.3",
|
"nuxt": "^4.1.3",
|
||||||
"swiper": "^12.0.2",
|
"swiper": "^12.0.2",
|
||||||
"typescript": "^5.6.3",
|
"typescript": "^5.6.3",
|
||||||
|
|||||||
@ -1,7 +0,0 @@
|
|||||||
<!-- Dummy form for Netlify recognition -->
|
|
||||||
<form name="contacts" netlify>
|
|
||||||
<input type="text" name="name" />
|
|
||||||
<input type="text" name="phone" />
|
|
||||||
<input type="text" name="service" />
|
|
||||||
<input type="text" name="comment" />
|
|
||||||
</form>
|
|
||||||
29
server/api/send_mail.post.ts
Normal file
29
server/api/send_mail.post.ts
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
import nodemailer from 'nodemailer'
|
||||||
|
|
||||||
|
export default defineEventHandler(async (event) => {
|
||||||
|
const body = await readBody(event)
|
||||||
|
|
||||||
|
const transporter = nodemailer.createTransport({
|
||||||
|
host: 'smtp.yandex.ru',
|
||||||
|
port: 465,
|
||||||
|
secure: true,
|
||||||
|
auth: {
|
||||||
|
user: process.env.SMTP_USER,
|
||||||
|
pass: process.env.SMTP_APP_PASSWORD,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
await transporter.sendMail({
|
||||||
|
from: `"Rental Concierge" <${process.env.SMTP_USER}>`,
|
||||||
|
to: 'info@rental-concierge.com',
|
||||||
|
subject: 'Новая заявка',
|
||||||
|
html: `
|
||||||
|
<b>Имя:</b> ${body.name}<br>
|
||||||
|
<b>Телефон:</b> ${body.phone}<br>
|
||||||
|
<b>Услуга:</b> ${body.service}<br>
|
||||||
|
<b>Комментарий:</b> ${body.comment}
|
||||||
|
`,
|
||||||
|
})
|
||||||
|
|
||||||
|
return { ok: true }
|
||||||
|
})
|
||||||
@ -7068,6 +7068,11 @@ node-releases@^2.0.27:
|
|||||||
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.27.tgz#eedca519205cf20f650f61d56b070db111231e4e"
|
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.27.tgz#eedca519205cf20f650f61d56b070db111231e4e"
|
||||||
integrity sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==
|
integrity sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==
|
||||||
|
|
||||||
|
nodemailer@^7.0.11:
|
||||||
|
version "7.0.11"
|
||||||
|
resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-7.0.11.tgz#5f7b06afaec20073cff36bea92d1c7395cc3e512"
|
||||||
|
integrity sha512-gnXhNRE0FNhD7wPSCGhdNh46Hs6nm+uTyg+Kq0cZukNQiYdnCsoQjodNP9BQVG9XrcK/v6/MgpAPBUFyzh9pvw==
|
||||||
|
|
||||||
nopt@^9.0.0:
|
nopt@^9.0.0:
|
||||||
version "9.0.0"
|
version "9.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/nopt/-/nopt-9.0.0.tgz#6bff0836b2964d24508b6b41b5a9a49c4f4a1f96"
|
resolved "https://registry.yarnpkg.com/nopt/-/nopt-9.0.0.tgz#6bff0836b2964d24508b6b41b5a9a49c4f4a1f96"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user