Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОТЧЕТ ВЕБ 10.docx
Скачиваний:
1
Добавлен:
23.06.2025
Размер:
262.63 Кб
Скачать

МИНОБРНАУКИ РОССИИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ

УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«НИЖЕГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ

УНИВЕРСИТЕТ ИМ. Р.Е. АЛЕКСЕЕВА»

(НГТУ)

Практическое занятие №10 Разработка ис по принципу spa

Выполнил:

Студент гр. 23-ИСТ-1-1

Какушкина О.В

Проверил: Шутов А.А

Нижний Новгород

2025

Ход работы Цель работы:

Разработка ИС по принципу SPA

Задание 1. Добавьте роутинг.

1.1 Настройка роутера

Роутинг в Vue.js реализован с помощью официальной библиотеки vue-router. Вот как это настроено:

  1. Создаем файл router.js с конфигурацией маршрутов:

import { createRouter, createWebHistory } from 'vue-router'

import HomeView from '@/views/HomeView.vue'

import AboutView from '@/views/AboutView.vue'

import PortfolioView from '@/views/PortfolioView.vue'

const routes = [

{

path: '/',

name: 'home',

component: HomeView

},

{

path: '/about',

name: 'about',

component: AboutView

},

{

path: '/portfolio',

name: 'portfolio',

component: PortfolioView,

// Добавляем поддержку якорных ссылок

props: (route) => ({ hash: route.hash })

}

]

const BASE_URL = process.env.BASE_URL || '/'

const router = createRouter({

history: createWebHistory(BASE_URL),

routes,

// Плавная прокрутка к якорям

scrollBehavior(to) {

if (to.hash) {

return {

el: to.hash,

behavior: 'smooth'

}

}

return { top: 0 }

}

})

export default router

  1. Подключаем роутер в главном файле приложения (main.js):

import { createApp } from 'vue'

import App from './App.vue'

import router from './router'

// Импортируем шрифты

import '@/assets/fonts.css'

// Импортируем Font Awesome для иконок

import { library } from '@fortawesome/fontawesome-svg-core'

import { faPaperPlane, faSpinner, faCheckCircle, faChevronLeft, faChevronRight } from '@fortawesome/free-solid-svg-icons'

import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'

// Добавляем нужные иконки в библиотеку

library.add(faPaperPlane, faSpinner, faCheckCircle, faChevronLeft, faChevronRight)

const app = createApp(App)

app.use(router)

app.component('font-awesome-icon', FontAwesomeIcon)

app.mount('#app')

Использование роутера в компонентах

В компонентах навигации (Header и Footer) используются компоненты router-link:

<template>

<header class="header">

<div class="header-content">

<div class="logo">GRIN AIR</div>

<nav class="nav-menu">

<router-link to="/" class="nav-item">ГЛАВНАЯ</router-link>

<router-link to="/portfolio" class="nav-item">ПОРТФОЛИО</router-link>

<router-link to="/about" class="nav-item">О НАС</router-link>

</nav>

</div>

<div class="header-divider"></div>

</header>

</template>

Задание 2 Оформите в виде компонентов оставшиеся страницы ис.Создан новый проект с помощью Vue cli:

2.1 Главная страница (HomeView.vue)

Главная страница состоит из нескольких секций:

  1. Hero-секция с заголовком и кнопкой CTA

  2. Секция с особенностями (features)

  3. Секция с проектами

<template>

<main class="main">

<section class="hero">

<h1 class="hero__title">

ОЗЕЛЕНЕНИЕ БАЛКОНОВ.<br/> ТЕРРАС И КОММЕРЧЕСКИХ ПРОСТРАНСТВ

</h1>

<router-link to="/portfolio#contact-form" class="hero__cta">ОСТАВИТЬ ЗАЯВКУ</router-link>

<div class="hero__image"></div>

</section>

<section class="features">

<div class="features__grid">

<div class="features__image"></div>

<div class="features__content">

<ul class="features__list">

<li>наличие застекления и утепления</li>

<li>площадь балкона и террасы</li>

<li>интенсивность освещения</li>

<li>наличие свободного времени у хозяев на полив</li>

</ul>

<div class="features__small-image"></div>

</div>

</div>

</section>

<section class="projects">

<h2 class="projects__title">ГОТОВЫЕ ПРОЕКТЫ ОЗЕЛЕНЕНИЯ</h2>

<p class="projects__subtitle">Вы можете купить готовые проекты и мы доставим их в течении 48 часов</p>

<div class="project-card">

<div class="project-card__image"></div>

<div class="project-card__content">

<h3 class="project-card__title">ЗОНИРОВАНИЕ ПРОСТРАНСТВ</h3>

<p class="project-card__description">

Зонирование пространств с помощью растений...

</p>

</div>

</div>

</section>

</main>

</template>

Рисунок 1 Главная страница

Рисунок 2 Главная страница с подвалом сайта

2.2 Страница "Портфолио" (PortfolioView.vue)

Страница портфолио включает:

  1. Галерею проектов (компонент Gallery)

  2. Секцию с процессом работы

  3. Контактную форму (компонент ContactForm)

<template>

<div class="portfolio-container">

<h1 class="portfolio-title">ВЫПОЛНЕННЫЕ ПРОЕКТЫ</h1>

<Gallery />

<section class="work-process">

<h2 class="work-process-title">КАК СТРОИТСЯ РАБОТА</h2>

<div class="process-container">

<div class="process-block">

<div class="block-number">1</div>

<div class="block-content">

Вы можете позвонить нам, или оставить заявку...

</div>

</div>

<!-- Остальные блоки процесса -->

</div>

<div class="process-image"></div>

</section>

<ContactForm />

</div>

</template>

<script>

import Gallery from '@/components/Gallery.vue'

import ContactForm from '@/components/ContactForm.vue'

export default {

name: 'PortfolioView',

components: {

Gallery,

ContactForm

}

}

</script>

Рисунок 3 Страница с портфолио

Рисунок 4 Страница портфолио с формой

2.3 Страница "О нас" (AboutView.vue)

Страница "О нас" содержит:

  1. Информацию о команде

  2. Галлерею работ

  3. Описание компании

<template>

<main>

<h1 class="team-title">НАША КОМАНДА</h1>

<section class="flex-section">

<div class="section-text">

<p>Мы — команда профессионалов, вдохновляющая жизнь в городские пространства...</p>

</div>

<div class="section-image">

<div></div>

</div>

</section>

<section class="gallery-section">

<h2 class="gallery-title">НАШИ РАБОТЫ</h2>

<div class="gallery-grid">

<div class="gallery-column">

<div class="gallery-item">

<div class="gallery-image"></div>

<div class="gallery-caption">Озеленение офиса</div>

</div>

<!-- Остальные элементы галереи -->

</div>

</div>

</section>

</main>

</template>

Рисунок 5 Страница о нас

Рисунок 6 Страница о нас с подвалом

3. Реализованные компоненты

3.1 Компонент Gallery

Компонент для отображения галереи проектов с возможностью прокрутки:

<template>

<div class="projects-gallery">

<button class="gallery-arrow prev" @click="scrollGallery(-1)">

<svg class="arrow-icon" viewBox="0 0 24 24">

<path d="M15.41 16.59L10.83 12l4.58-4.59L14 6l-6 6 6 6 1.41-1.41z"/>

</svg>

</button>

<div class="gallery-container" ref="gallery">

<div

class="gallery-item"

v-for="(item, index) in galleryItems"

:key="index"

>

<div class="gallery-image"></div>

<div class="gallery-caption">{{ item.caption }}</div>

</div>

</div>

<button class="gallery-arrow next" @click="scrollGallery(1)">

<svg class="arrow-icon" viewBox="0 0 24 24">

<path d="M8.59 16.59L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.41z"/>

</svg>

</button>

</div>

</template>

<script>

export default {

name: 'AppGallery',

data() {

return {

galleryItems: [

{ caption: 'Озеленение офиса' },

{ caption: 'Вертикальный сад' },

{ caption: 'Зонирование пространства' },

{ caption: 'Озеленение ресторана' },

{ caption: 'Зимний сад' }

]

}

},

methods: {

scrollGallery(direction) {

const gallery = this.$refs.gallery

gallery.scrollBy({

left: direction * gallery.offsetWidth,

behavior: 'smooth'

})

}

}

}

</script>

3.2 Компонент ContactForm

Контактная форма с валидацией:

<template>

<section class="contact-section" id="contact-form">

<div class="contact-container">

<h2 class="contact-title">ОСТАВЬТЕ ЗАЯВКУ И С ВАМИ СВЯЖЕТСЯ МЕНЕДЖЕР</h2>

<form class="contact-form" @submit.prevent="submitForm">

<div class="form-group">

<label for="name" class="form-label">Ваше имя*</label>

<input

type="text"

id="name"

v-model.trim="form.name"

@blur="validateField('name')"

class="form-input"

:class="{ 'error': errors.name }"

placeholder="Иван Иванов"

>

<div class="error-message" v-if="errors.name">

<font-awesome-icon icon="exclamation-circle" />

{{ errors.name }}

</div>

</div>

<!-- Остальные поля формы -->

<button type="submit" class="submit-button" :disabled="isSubmitting">

<span v-if="!isSubmitting">

<font-awesome-icon icon="paper-plane" />

ОСТАВИТЬ ЗАЯВКУ

</span>

<span v-else>

<font-awesome-icon icon="spinner" spin />

ОТПРАВКА...

</span>

</button>

</form>

</div>

</section>

</template>

<script>

export default {

name: 'AppContactForm',

data() {

return {

form: {

name: '',

phone: '',

email: '',

message: ''

},

errors: {},

isSubmitting: false,

isSubmitted: false

}

},

methods: {

validateField(field) {

// Логика валидации

},

submitForm() {

// Логика отправки формы

}

}

}

</script>

Выводы

В ходе выполнения работы я успешно освоила ключевые аспекты разработки современных веб-приложений с использованием фреймворка Vue.js . Мной были реализованы все поставленные задачи, включая:

  • Создание компонентной архитектуры

  • Настройку клиентской маршрутизации

  • Реализацию интерактивных пользовательских интерфейсов

Особое внимание я уделила:

  • Организации структуры проекта по методологии Vue, обеспечив модульность и удобство поддержки кода.

  • Созданию переиспользуемых компонентов (ContactForm, Gallery), что позволило сократить дублирование кода и улучшить масштабируемость приложения.

  • Реализации сложной валидации форм с обработкой различных сценариев ввода, включая проверку email, телефона и обязательных полей.

  • Настройке плавных переходов между состояниями интерфейса, улучшив UX за счет анимаций и индикаторов загрузки.

  • Адаптивному дизайну с использованием современных CSS-технологий, таких как clamp(), flexbox, grid и медиазапросов, обеспечив корректное отображение на всех устройствах.

В процессе работы я освоила:

  • Методы создания реактивных форм с двусторонним связыванием данных (v-model), включая динамическую валидацию и обработку ошибок.

  • Принципы работы с vue-router для организации SPA, включая динамическую загрузку маршрутов и обработку параметров.

  • Техники адаптивной верстки (медиазапросы, относительные единицы измерения), обеспечив кросс-платформенную совместимость.

  • Интеграцию сторонних библиотек (Font Awesome) в Vue-компоненты, расширив функциональность интерфейса.

  • Оптимизацию производительности компонентов, минимизировав лишние перерисовки и улучшив скорость загрузки.

Соседние файлы в предмете Web технологии