Skip to content

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

Приложение учёта доходов и расходов Elbrus Money Keeper

Описание проекта

Добро пожаловать в наш проект!

Мы будем разрабатывать приложение для учёта доходов и расходов. Твоя задача в первую очередь увидеть работу веб-разработчика изнутри, понять как формируется приложение и попрактиковаться в разработке на JavaScript. Возможно ты вообще никогда не имел(-ла) опыта в написании кода, но тебе очень хотелось попробовать, этот проект как раз для этого.

Итогом станет проект который будет работать на сервисе GitHub Pages, в дальнейшем ты сможешь его улучшать и расширять по своему желанию.

Необходимое ПО для реализации приложения:

  • VS Code (популярный редактор кода с удобным функционалом)
  • Google Chrome (браузер для просмотра и разработки любых веб-приложений)
  • Git (программа для управления версиями твоего кода)

Релиз 0: Определение структуры и декомпозиция задач

Декомпозиция — разбиение сложной задачи на более мелкие и управляемые подзадачи. Важно определить основные этапы выполнения задачи и разбить их на более простые шаги. Таким образом, проще контролировать процесс выполнения и обеспечить успешное завершение проекта.

Соответственно сейчас у тебя есть:

  • папка css с файлом bootstrap.min.css c минимизированным css-кодом из фреймворка Bootstrap, который используется для основной стилизации приложения. Для собственной реализации стилей используй файл style.css.
  • папка img с заготовленными файлами изображений: .png для favicon (значок веб-сайта или веб-страницы)
  • папка js с заготовленными файлами скриптов: auth.js, dashboard.js, expenses.js, income.js, profile.js, где будет написана вся логика твоего приложения на языке JavaScript. Минифицированный файл bootstrap.bundle.min.js отвечает за логику Bootstrap.
  • папка assets с примерами интерфейса приложения Elbrus Money Keeper
  • заготовленные файлы: index.html, dashboard.html, expenses.html, income.html, profile.html для использования в приложении, также ты можешь использовать свои .html файлы

Важно учесть, что приложение нужно "развернуть" на сервисе GitHub Pages для этого нужно сделать ряд первичных действий:

  • проверить что установлен сам Git с помощью команды в терминале: git --version, если после выполнения появится версия то Git установлен
  • создать аккаунт в сервисе GitHub

Любая разработка использует подход в виде релизов, каждый из которых выполняет поставленную задачу. Это был вводный релиз.

Релиз 1: Базовая аутентификация

Следующей задачей будет реализовать твою первую аутентификацию в приложение. Кто-то уже знает что означает это слово, а кому-то нужно пояснить подробнее, что это процесс проверки пользователя для дальнейшего использовании в приложении. В нашем приложении за это будут отвечать файлы: index.html и auth.js.

Из основных данных которые мы будем использовать в приложении это: электронная почта/email и пароль/password, для реализации сохранения введённых данных рекомендуем изучить свойство localStorage. С помощью него можно сохранить ранее ведённые данные для дальнейшего сравнения при последующих попытках входа. Более подробнее можно узнать здесь.

Лучшим решением будет использование объекта с ключами описывающие данные, пример:

const userData = {            
    email: '',
    password: '',
    balance: null,
    income: [],
    expenses: []
}

Для установки значений в localStorage используй следующий пример:

// где 'userData' название ключа в localStorage
// JSON.stringify(userData) форматирование данных в строку и ассоциация их с ключом 'userData'
localStorage.setItem('userData', JSON.stringify(userData));

В дальнейшем все данные будут использовать этот объект.

В файле index.html есть пример кода для реализации формы которая будет обрабатывать введённые данные:

<form class="mt-3" id="authForm" method="GET" action="/dashboard.html">
    <div class="form-floating mb-3">
        <input required name="email" type="email" class="form-control" placeholder>
        <label>Ваша электронная почта</label>
    </div>
    <div class="form-floating mb-3">
        <input required name="password" type="password" class="form-control" placeholder>
        <label>Ваш пароль</label>
    </div>
    <button type="submit" class="btn btn-primary">Далее</button>          
</form>

Не забудь подключить скрипт auth.js в файле index.html в теге <head> для применения JavaScript на странице.

Пример страницы index.html: auth

Релиз 2: Функционал панели управления

Теперь когда приложение работает с пользовательскими данными нужно чтобы клиент перешёл на Dashboard, за это отвечают файлы dashboard.html и dashboard.js.

В файле dashboard.html есть код описывающий панель навигации:

<section class="container-fluid mb-5">
    <nav class="navbar navbar-expand-lg bg-body-tertiary">
        <div class="container-fluid">
            <a class="navbar-brand" href="/dashboard.html">Elbrus Money Keeper</a>
            <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
            </button>
            <div class="collapse navbar-collapse" id="navbarSupportedContent">
            <ul class="navbar-nav me-auto mb-2 mb-lg-0">
                <li class="nav-item">
                <a class="nav-link active" aria-current="page" href="/dashboard.html">Главная</a>
                </li>
                <li class="nav-item dropdown">
                <a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
                    Статистика
                </a>
                <ul class="dropdown-menu">
                    <li><a class="dropdown-item" href="/income.html">Доходы</a></li>
                    <li><a class="dropdown-item" href="/expenses.html">Расходы</a></li>
                </ul>
                </li>
                <li class="nav-item dropdown">
                <a id="profileName" class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
                    Профиль ()
                </a>
                <ul class="dropdown-menu">
                    <li><a class="dropdown-item" href="/profile.html">Изменить</a></li>
                    <li><button id="logoutBtn" class="dropdown-item">Выйти</button></li>
                </ul>
                </li>
            </ul>
            <form class="d-flex" role="search">
                <input class="form-control me-2" type="search" placeholder="Введите данные" aria-label="Search">
                <button class="btn btn-outline-success" type="submit">Поиск</button>
            </form>
            </div>
        </div>
    </nav>
</section>

Пример страницы dashboard.html: dashboard

В этом же файле есть код описывающий поля ввода стартового баланса:

<section class="container">
    <div class="input-group input-group-lg mb-5">
        <input id="balance" type="number" class="form-control" placeholder="Стартовая сумма">
        <button id="btnSetBalance" class="btn btn-outline-secondary" type="button">Задать баланс</button>
    </div>
</section>

Задача сделать возможность установки стартового баланса, после установки возможность изменить стартовый баланс заблокирована. Используй идентификаторы html тегов чтобы обращаться к ним, для получения значений, пример:

const balance = document.querySelector('#balance');
const btnSetBalance = document.querySelector('#btnSetBalance');

if (btnSetBalance) {
    btnSetBalance.addEventListener('click', () => {
        const data = JSON.parse(userDataStorage);            
        data.income.push({type: 'income', description: 'Пополнение', sum: Number(balance.value)});
        data.balance = Number(balance.value);

        localStorage.setItem('userData', JSON.stringify(data))

        balance.setAttribute('disabled', true);
        btnSetBalance.setAttribute('disabled', true);
    })
}

Все данные хранятся в localStorage, пример получения данных:

const userDataStorage = localStorage.getItem('userData');
userDataStorage // объект в виде строки

const objUserDataStorage = JSON.parse(userDataStorage)
objUserDataStorage // полноценный объект

Пример страницы dashboard.html после установки баланса: dashboardSetBalance

Пример страницы dashboard.html выпадающее меню статистики: dashboardStatistic

Пример страницы dashboard.html выпадающее меню профиля: dashboardProfile

Не забудь подключить скрипт dashboard.js в файле dashboard.html в теге <head> для применения JavaScript на странице.

Релиз 3: Форма учёта доходов и расходов

В файле dashboard.html есть блок кода описывающий поля учёта операций доходов и расходов:

<div class="input-group input-group-lg">
    <select class="form-select" id="typeTransaction" >
        <option selected>Выбор действия</option>
        <option value="income">Доход</option>
        <option value="expenses">Расход</option>          
    </select>
    <input type="text" class="form-control" id="descTransaction" placeholder="Описание">
    <input type="number" class="form-control" id="sumTransaction" placeholder="Сумма">
    <button id="btnUpdateBalance" class="btn btn-outline-secondary" type="button">Учесть</button>
</div>

Используя идентификатор кнопки, нужно наполнить массив доходов/income или расходов/expenses в зависимости от выбранного варианта, пример:

const btnUpdateBalance = document.querySelector('#btnUpdateBalance');
const typeTransaction = document.querySelector('#typeTransaction');

btnUpdateBalance.addEventListener('click', () => {
    const transaction = {
        type: typeTransaction.value,
        description: descTransaction.value,
        sum: Number(sumTransaction.value)
    }

    if (typeTransaction.value === 'income' || typeTransaction.value === 'expenses') {
        const data = JSON.parse(userDataStorage);
        
        data[typeTransaction.value].push(transaction);            
        data.balance = data.income.reduce((total, income) => total + income.sum, 0) - data.expenses.reduce((total, expense) => total + expense.sum, 0);

        balance.value = data.balance;
        balance.setAttribute('disabled', true);
        btnSetBalance.setAttribute('disabled', true);

        localStorage.setItem('userData', JSON.stringify(data));
    }
})

Релиз 4: Разработка интерфейсов статистики

Когда localStorage пополняется нашими операциями с доходами и расходами массивы income и expenses можно использовать в других файлах для вывода статистики.

Пример формирования статистики для доходов (расходы делаются по аналогии):

const incomeTable = document.querySelector('#incomeTable');

if (incomeTable) {
    const incomeArr = JSON.parse(localStorage.getItem('userData')).income;

    incomeArr.forEach((el, index) => {
        const tr = document.createElement('tr');
        tr.classList.add("table-success")

        const thCount = document.createElement('th');
        thCount.insertAdjacentHTML('beforeend', index + 1);

        const tdType = document.createElement('td');
        tdType.insertAdjacentHTML('beforeend', 'Доходы');

        const tdDesc = document.createElement('td');
        tdDesc.insertAdjacentHTML('beforeend', el.description);

        const tdSum = document.createElement('td')
        tdSum.insertAdjacentHTML('beforeend', `+${el.sum}`);

        tr.appendChild(thCount)
        tr.appendChild(tdType)
        tr.appendChild(tdDesc)
        tr.appendChild(tdSum)

        incomeTable.appendChild(tr)
    })
}

Пример страницы статистики доходов income.html: income

Пример страницы статистики расходов expenses.html: expenses

Не забудь подключить скрипты в файлах income.html и expenses.html в теге <head> для применения JavaScript на странице.

Релиз 5: Работа с профилем

Файлы profile.html и profile.js отвечают за редактирование данных пользователя, пример html кода:

<section class="container">
    <form class="mt-3" id="changeForm" method="GET" action="/dashboard.html">
    <div class="form-floating mb-3">
        <input required name="email" type="email" class="form-control" placeholder>
        <label>Ваша электронная почта</label>
    </div>
    <div class="form-floating mb-3">
        <input required name="password" type="password" class="form-control" placeholder>
        <label>Ваш пароль</label>
    </div>
    <button type="submit" class="btn btn-primary">Изменить данные</button>          
    </form>
</section>

Пример JavaScript кода:

const changeForm = document.querySelector('#changeForm');

if (changeForm) {
    const userData = JSON.parse(localStorage.getItem('userData'))
    changeForm.email.value = userData.email;
    changeForm.password.value = userData.password;

    changeForm.addEventListener('submit', () => {
        localStorage.setItem('userData', JSON.stringify({...userData, email: changeForm.email.value, password: changeForm.password.value }));
        window.location.href = '/dashboard.html';
    })
}

Пример страницы профиля profile.html: income

Релиз 6: Первая реализация деплоя/развёртывания на GitHub Pages

Пришла пора самого интересного!

Когда основной функционал готов, его нужно ещё раз проверить и после задеплоить/развернуть в GitHub Pages.

Этапы:

  1. Создать публичный репозиторий в GitHub со специальным названием: xxx.github.io, где xxx ваше имя пользователя GitHub
  2. В папке приложения Elbrus Money Keeper выполните команду: git init для инициализации локального git проекта
  3. Выполнить команду: git add . для добавления всех файлов в будущий коммит
  4. Выполнить команду: git commit -m "Init commit" для фиксации текущей версии файлов в коммите с комментарием "Init commit"
  5. Выполнить команду: git branch -M main для назначение ветки main, как главной ветки проекта
  6. Выполнить команду: git remote add origin git@github.com:Xxx/xxx.github.io.git, где xxx ваше имя пользователя GitHub
  7. Выполнить команду: git push -u origin main для отправки изменений в GitHub, после 3-5 минут сайт должен появится по адресу xxx.github.io, где xxx ваше имя пользователя GitHub

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages