8.7 KiB
План приведения фронтенда к стандарту кода
Дата аудита: 2026-10-03
Репозиторий: evening_detective_frontend
Результат проверки
npm run type-check— успешно.npx eslint .— успешно.npx stylelint 'src/**/*.{css,scss,vue}'— успешно.- Проверки запускались без
--fix, исходный код аудитом не изменён. src/api/generated/**иdist/**в план исправлений не включены.
Автоматические проверки подтверждают синтаксическую и базовую lint-корректность,
но не проверяют все обязательные правила docs/FRONTEND_CODE_STANDARD.md.
Приоритетный план
1. Ошибки, загрузка и повторные действия — P0
Цель: ни один API-вызов не должен терять ошибку или оставлять UI в неясном состоянии.
- Обработать
getPermissions()вsrc/components/HeaderMenu.vue:24иsrc/components/OfficePage.vue:17: показать русское сообщение черезuseMessage()и добавить состояние загрузки/ошибки, если оно влияет на UI. - Обернуть начальные вызовы
getStory()иgetAnswers()вsrc/components/TeamStoryPage.vue:115в единый flow с отображением ошибки. - Проверить мутации
src/components/GamePage.vue:287-655иsrc/components/ScenariosEditorPage.vue:85-529: для каждого действия оставитьtry/catch/finally, пользовательское сообщение и блокировку повторной отправки. - Проверить
src/components/LoginPage.vue:40-76: во время всех операций формы кнопки должны быть недоступны, а ошибка должна обрабатываться в том же flow. - Для каждого экрана явно сохранить состояния loading, empty и error в template.
Готово, когда ручной API-ошибкой можно проверить, что пользователь получает
сообщение, кнопка разблокируется после finally, а частично изменённые данные не
перезаписываются фоновым обновлением.
2. Доступность интерактивных элементов и изображений — P0
- Заменить кликабельные
div/spanили дать им полноценную клавиатурную семантику вsrc/components/HeaderMenu.vue,GamePage.vue,PlaceBlock.vue,IntroBlock.vueиScenariosPage.vue. - Восстановить видимый focus: в частности, не оставлять
outline: noneвsrc/components/GameInputForm.vue:186-189без равноценной замены. - Добавить осмысленные
altк изображениям вsrc/components/PlaceBlock.vue(строки 268, 298, 345, 355, 368, 453, 504), а также проверить остальные<img>через поиск поsrc. - Для модальных окон в
OfficePage.vue:261иUsersPage.vue:114добавитьn-cardсrole="dialog"иaria-modal="true"либо эквивалентную доступную структуру; проверить остальные модальные окна на единообразие. - Добавить доступные названия/
titleтам, где действие выражено только иконкой или символомx.
Готово, когда все действия доступны Tab/Enter/Space, focus виден, изображения озвучиваются понятно, а модальные окна имеют корректную семантику.
3. Границы компонентов и типизация — P1
- Оставить
*View.vueмаршрутными прокси. Перенести содержимое и стилиsrc/views/HomeView.vueвsrc/components/HomePage.vue; стиль сделатьscoped. Вьюхи документов сDocsPageиHeaderMenuотдельно проверить на соответствие этому правилу. - Перевести runtime-описания props на typed
definePropsтам, где нет причины сохранятьPropType:HeaderMenu.vue,PlaceBlock.vue,GameInputForm.vue,IntroBlock.vue,QuestionBlock.vue. - В
PlaceBlock.vueиTeamStoryPage.vueпроверить типы режимов и callback-ов: заменить широкиеstring/необязательные утверждения на существующие типы, не дублируя generated API. - Не выделять новые composable или универсальные обёртки: выносить только реально повторяющийся flow после исправления конкретных callers.
Готово, когда маршрутные страницы не содержат экранной логики, props/emits
типизированы, а any и необоснованные as отсутствуют.
4. Формы и единообразие UI — P1
- Проверить обязательные поля и сообщения ошибок в формах
LoginPage.vue,GameInputForm.vue,TeamStoryPage.vueиScenariosEditorPage.vue. - Использовать Naive UI для обычных UI-контролов. Нативные контролы в
GameInputForm.vue:96-117иTeamStoryPage.vue:272,321оставлять только там, где они нужны бумажному визуальному стилю; в таком случае сохранить доступную семантику и focus. - Проверить, что кнопки с мутациями имеют
loading/disabled, а пустые и ошибочные ответы явно видны пользователю.
5. CSS-токены и локальность стилей — P2
- Сгруппировать повторяющиеся цвета из компонентов в уже существующую палитру
src/assets/base.css; новые токены добавлять только с семантическими именами. - Не расширять глобальные стили. После переноса
HomeView.vueпроверить, что одноразовые классы не попали вmain.css. - Сохранять алфавитный порядок CSS-свойств и существующие mobile-first брейкпоинты.
Порядок выполнения
-
Исправить ошибки/loading и доступность в общих и часто используемых компонентах (
HeaderMenu,PlaceBlock,GameInputForm). -
Исправить
GamePage,TeamStoryPage,ScenariosEditorPageпо месту, не расширяя diff несвязанным рефакторингом. -
Перенести
HomeViewв page-компонент и типизировать props. -
Выполнить точечную миграцию цветов и стилей только затронутых файлов.
-
Запустить обязательные проверки:
npm run type-check npm run lint npm run lint:css npm run build -
Выполнить ручной smoke-check: вход/регистрация, меню с клавиатуры, загрузка и ошибка API, создание/редактирование сценария, игровой ход, модальные окна, просмотр изображений и мобильная ширина.
Не входит в исправление
- Переписывание всего существующего кода только ради косметического соответствия.
- Изменение
src/api/generated/**, protobuf-контрактов и продуктового поведения. - Новые зависимости, новый state manager, общие абстракции «на будущее».
- Редизайн и массовая замена бумажного визуального языка.