Если вы планируете использовать Monaca для разработки приложения, вам может быть сложно придумать идеи, когда придет время. Кроме того, если вы планируете создать сложное приложение с нуля, может быть сложно понять, с чего начать.

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

В этом уроке мы будем использовать NCMB (мобильный сервер NIFCLOUD) для разработки приложения купонов. В приложении вы сможете создавать купоны и управлять ими, а также показывать их пользователям. В первой части мы рассмотрим характеристики приложения и реализуем процесс аутентификации.

Используемые технологии и библиотеки

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

  • Фреймворк7
  • Мобильный сервер NIFCLOUD
  • День.js
  • JsBarcode
  • QR код

JsBarcode и qrcode — это библиотеки, которые отображают штрих-коды для купонов и QR-коды соответственно.

Для этого приложения мы будем использовать шаблон представления вкладок Framework7 в Monaca. В Monaca IDE выберите Framework Templates > JavaScript > Framework7 Tab View, чтобы выбрать его.

Технические характеристики

Экраны этого приложения следующие.

Цель

Приложение купонов отображает купоны для пользователей приложения. Количество купонов, которые можно использовать, не ограничено, и купоны можно использовать столько раз, сколько необходимо в течение периода доступности.

Экран входа в систему

Это приложение предоставляет функцию аутентификации с использованием идентификатора и пароля.

Экран списка купонов (для пользователей)

На экране «Список купонов» для пользователей перечислены купоны, созданные на экране «Администрирование». Отображаются только те купоны, которые доступны для использования.

Экран использования купона

Когда купон выбран, сведения о купоне появятся ниже на листе действий. При этом появится штрих-код и QR-код, которые можно будет использовать в магазинах.

Экран списка купонов (для администраторов)

Это экран списка купонов для администратора. Купоны перечислены в таблице.

Экран создания и редактирования купона

Этот экран позволяет вам создать новый купон или отредактировать существующий купон. Вы также можете удалить купоны отсюда.

Авторизация данных

Данные могут просматриваться кем угодно и обновляться только администратором.

Получить серверный ключ NIFCLOUD Mobile

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

  • Ключ приложения
  • Ключ клиента

Установка библиотеки

Добавьте ncmb в качестве внешней библиотеки. Это библиотека JavaScript, поэтому перейдите в «Настроить» -> «Добавить/удалить компоненты JS/CSS».

Не забудьте проверить ncmb.min.js как файл для загрузки.

<!-- Ncmb script -->
<script src="components/ncmb/ncmb.min.js"></script>

Установка других библиотек

Dayjs/JsBarcode/qrcode минимизируются, помещаются в папку js и загружаются по адресу www/index.html. Вы также можете включить их в проект с помощью CDN.

Минимизированная версия:

<script src="js/dayjs.min.js"></script>
<script src="js/JsBarcode.all.min.js"></script>
<script src="js/qrcode.min.js"></script>

Версия CDN:

<!-- Dayjs script -->
  <script src="https://cdn.jsdelivr.net/npm/dayjs@1/dayjs.min.js"></script>
  <script>dayjs().format()</script>
  <!-- Barcodejs script -->
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jsbarcode/3.11.5/JsBarcode.all.min.js" integrity="sha512-QEAheCz+x/VkKtxeGoDq6nsGyzTx/0LMINTgQjqZ0h3+NjP+bCsPYz3hn0HnBkGmkIFSr7QcEZT+KyEM7lbLPQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
  <!-- Qrcodejs script -->
  <script src="https://cdnjs.cloudflare.com/ajax/libs/qrcodejs/1.0.0/qrcode.min.js" integrity="sha512-CNgIRecGo7nphbeZ04Sc13ka07paqdeTu0WR1IM4kNcpmBAUSHSQX0FslNhTDadL4O5SAGapGt4FodqL8My0mA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

Время написания

Инициализация NCMB

Откройте www/js/app.js и добавьте процесс инициализации мобильного бэкэнда NIFCLOUD, как показано ниже. Примените ключ приложения и ключ клиента, представленные выше.

const applicationKey = '';
const clientKey = '';
const ncmb = new NCMB(applicationKey, clientKey);

Маршрутизация

Определите, какой экран будет отображаться при доступе к псевдо-URL в js/routes.js.

var routes = [
  {
    path: '/',
    url: './index.html',
  },
  {
    name: 'List',
    path: '/list/',
    componentUrl: './pages/list.html',
  },
  {
    name: 'Login',
    path: '/login/',
    componentUrl: './pages/login.html'
  },
  {
    name: 'AdminList',
    path: '/admin/list/',
    componentUrl: './pages/admin/list.html',
  },
  {
    name: 'AdminForm',
    path: '/admin/form/',
    componentUrl: './pages/admin/form.html',
  },
  // Default route (404 page). MUST BE THE LAST
  {
    path: '(.*)',
    url: './pages/404.html',
  },
];

Введение в index.html

www/index.html, который загружается первым в приложении Monaca, загружает страницы/list.html, экран списка купонов для пользователей.

<div id="app">
  <!-- Views container -->
  <div class="views safe-areas">
    <!-- Tabbar for switching views-tabs -->
    <div id="home" class="view view-main view-init" data-url="/list/"></div>
  </div>
</div>

Переход к экрану аутентификации

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

let coupons;
// Event executed during page initialization
$on('pageBeforeIn', async (e, page) => {
    // Authentication status check
    if (!(await checkAuth())) {
        // If false is returned, got to login screen
        $f7router.navigate({ name: 'Login' });
    }
}

// Function to check authentication status (in js/app.js)
// true if authentication is ok / false if not logged in or there is a session problem
const checkAuth = async () => {
  // Get the current logged in user
  if (ncmb == null)
    console.log("ncmb is null")
  const user = ncmb.User.getCurrentUser();
  // If no user is logged in, return false
  if (!user) return false;
  try {
    // Test the session validity
    await ncmb.DataStore('Test').fetch();
    // If valid return true
    return true;
  } catch (e) {
    // If there is a problem with the session return true
    return false;
  }
}

Процесс регистрации пользователя/входа

Процесс регистрации/входа пользователя выполняется с помощью SignInOrLogin, когда пользователь нажимает кнопку в Pages/login.html. Общий поток выглядит следующим образом.

// Event when you tap the login/signup button
const signInOrLogin = async () => {
    // Input values are converted to an object
    const params = serializeForm('form#login');
    // User registration process   
    try {
        await registerUser(params);
    } catch (e) {
        //Results to error if the user is already registered, ignore and proceed
    }
    try {
        // User login process
        await loginUser(params);
        // Navigate back to the main screen
        $f7router.back();
    } catch (e) {
        // If the was a problem alert the user
        console.log(e);
        $f7.dialog.alert('Login failed. Please check username and password.');
    }
}

Функция RegisterUser, которая регистрирует пользователя в NCMB, реализована следующим образом. Установите входное значение для объекта пользователя и выполните метод SignUpByAccount.

// User registration
const registerUser = async (params) => {
    try {
        const user = new ncmb.User;
        user
            .set('userName', params.userName)
            .set('password', params.password)
        await user.signUpByAccount();
        return user;
    } catch (e) {
        console.log(e);
    }
}

Процесс входа в систему выполняется функцией loginUser. Этот процесс просто выполняет процесс входа в систему NCMB ncmb.User.login.

const loginUser = async (params) => {
    // Login the user
    return ncmb.User.login(params.userName, params.password);
}

На этом процесс входа в систему завершен.

Административные функции

Пожаловаться на администратора

Изначально в NCMB администраторы добавляются в группу администраторов. Однако каждый раз проверять информацию о группе может быть затруднительно. Поэтому мы установим флаг в данных аутентификации для каждого пользователя. После процесса аутентификации пользователь должен быть создан на вкладке управления пользователями NCMB, как показано на рисунке ниже.

Добавьте администратора в качестве нового поля и добавьте true с логическим значением true. Это следует делать только для пользователей, которых вы хотите сделать администраторами.

Отдельный дисплей для администраторов

На экране списка купонов для пользователей на панели инструментов отображается значок администратора. Это будет отображаться только после аутентификации и если вошедший в систему пользователь помечен как администратор.

Измените страницы/list.html.

// Event executed during page initialization
$on('pageBeforeIn', async (e, page) => {
    // Authentication status check
    if (!(await checkAuth())) {
        // If false is returned, got to login screen
        $f7router.navigate({ name: 'Login' });
    }
    // Change the visibility of the admin settings
    changeVisible($f7.$el)
}

ChangeVisible реализован в js/app.js

// Function to separate display for user and admin
const changeVisible = (el) => {
  // Get current logged in user
  const user = ncmb.User.getCurrentUser();
  // Erase both admin and user info
  el.find('.admin,.no-admin').hide();
  // If it's an admin
  if (user && user.admin) {
    // Show the admin info
    el.find('.admin').show();
  } else {
    // Else show the user info
    el.find('.no-admin').show();
  }
}

Затем на стороне HTML установите класс .admin для информации, которую вы хотите предоставить администратору.

<div class="right">
  <a href="/admin/list/" class="link admin">
      <i class="f7-icons">gear</i>
  </a>
</div>

После этого процесса при входе в систему с правами администратора на панели инструментов появится значок шестеренки, и при нажатии на него отобразятся страницы/admin/list.html.

Сводка

Процессы аутентификации и регистрации/входа пользователя завершены. Framework 7 прост для понимания, каждый экран разделен на отдельные процессы, поэтому разрабатывать приложение должно быть легко. Пожалуйста, попробуйте!

В следующей статье мы будем создавать, обновлять и удалять купоны от имени администраторов, а также отображать купоны пользователям.

Найти проект можно здесь.