Разработка службы курьерской доставки в мобильном приложении
Разработка сценариев поведения приложений при выполнении курьерского заказа. Проектирование архитектуры серверной части системы и мобильных приложений. Программная реализация серверной части системы и мобильных приложений. Структура Android приложения.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 20.02.2018 |
Размер файла | 1,8 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
- changePass () - Сменить пароль курьера;
- addOrderSign () - Загрузить файл с росписью клиента на экране устройства курьера;
- setProfileData ($token="") - Записать лог местоположения курьера;
- bindCard ($token="") - Привязать карту курьера;
- getBindedCards ($token="") - Получить список привязанных пластиковых карт;
- unbindCard ($token="") - Удалить привязанную карту;
- setCardAlias ($token="") - Изменить пользовательское название карты;
- getEarning ($token="") - получить заработок курьера;
- getOrders ($token="") - получить список активных заказов курьера.
Для обращения ко всем методам необходимо использовать HTTP POST-запрос с как минимум одним параметром (токен пользователя). Все методы написаны на языке PHP.
Ниже, для наглядного примера реализации методов, приведен листинг метода получения данных о клиенте:
Рисунок 8 метод получения данных о клиенте PHP
Как видно из рисунка 8, для того чтобы получить данные о пользователе, необходимо в параметрах POST запроса указать токен пользователя.
Пример этого же метода, на языке Java, со стороны клиентского мобильного Android приложения приведен на рисунке 9:
Рисунок 9 метод получения данных о клиенте Java
4.3 Структура Android приложения
Для разработки мобильных приложений использован паттерн MVP.
4.3.1 Model
Рисунок 10 классы компонента паттерна MVP - Model
Классы компонента Model, в двух приложениях, представляют из себя «сущности», содержащие только их свойства (члены классов) и set/get методы.
НижеприведенлистингклассаPlace, используемый в клиентском приложении для реализации модели для «Избранных» мест пользователя.
public class Place extends RealmObject {
@PrimaryKey
private intid;
private String mPrimaryAddress, mSecondaryAddress;
public void setIncId(intid){
this.id = id;
}
public intgetId(){
return this.id;
}
//sets/gets
public void setPrimaryAddress(CharSequencepr_addrass){
this.mPrimaryAddress= pr_addrass.toString();
}
public String getPrimaryAddress(){
return this.mPrimaryAddress;
}
public void setSecondaryAddress(CharSequencesec_address){
this.mSecondaryAddress= sec_address.toString();
}
public String getSecondaryAddress(){
return this.mSecondaryAddress;
}
}
Можно заметить, что класс Placeнаследуется от RealmObject. Дело в том что в проект интегрирована база данных Realmдля локального хранения информации о сущностях.
Данная база данных позволяет, в прямом смысле, в одну строку реализовывать основные транзакции необходимые для работы и имеющиеся в SQLite.
4.3.2 View
Рисунок 11 классы компонента паттерна MVP -View
Весь графический интерфейс приложений реализован в Activityилив Fragment. Активности и фрагменты взаимодействуют с моделями через Presenter-ы. Для этого, в последних определяются интерфейсы для управления активностями, а в самих активностях реализуются методы этих интерфейсов.
На приведенном ниже листинге представлен пример реализации Активности для подтверждения пользователем заказа.
public class ConfirmOrderActivityextends AppCompatActivityimplements
SmsReceiver.OnSmsCodeReceiverListener,
View.OnClickListener,
ConfirmOrderPresenter.OnConfirmOrderDirection{
private Context mContext;
private ConfirmOrderPresentermConfirmOrderPresenter;
private FieldPresentermFieldPresenter;
private SmsReceivermSmsReceiver;
private TextViewtv_title;
private ImageViewiv_btn_close;
private TextViewtv_info;
private TextInputLayouttil_cvc_code, til_sms_code;
private EditTextet_cvc_code, et_sms_code;
private TextInputLayout[] fieldParents;
private EditText[] fields;
private Button btn_confirm;
@Override
protected void onCreate(@NullableBundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_confirm_order);
try {
initTools();
initViews();
setParams();
} catch (Exception mE) {
mE.printStackTrace();
}
}
private void initTools()throws Exception{
mContext= ConfirmOrderActivity.this;
mConfirmOrderPresenter= new ConfirmOrderPresenter(mContext);
mFieldPresenter= new FieldPresenter(mContext);
mSmsReceiver= new SmsReceiver(ConfirmOrderActivity.this);
}
private void initViews()throws Exception{
tv_title= (TextView)findViewById(R.id.tv_title);
iv_btn_close= (ImageView)findViewById(R.id.iv_btn_close);
tv_info= (TextView)findViewById(R.id.tv_info);
til_cvc_code= (TextInputLayout)findViewById(R.id.til_cvc_code);
til_sms_code= (TextInputLayout)findViewById(R.id.til_sms_code);
et_cvc_code= (EditText)findViewById(R.id.et_cvc_code);
et_sms_code= (EditText)findViewById(R.id.et_sms_code);
btn_confirm= (Button)findViewById(R.id.btn_confirm);
fieldParents= new TextInputLayout[]{til_cvc_code, til_sms_code};
fields = new EditText[]{et_cvc_code, et_sms_code};
}
private void setParams()throws Exception{
mFieldPresenter.setParamsFieldCvc(et_cvc_code);
mFieldPresenter.setParamsFieldSms(et_sms_code);
iv_btn_close.setOnClickListener(this);
btn_confirm.setOnClickListener(this);
mConfirmOrderPresenter.setOnConfirmOrderDirection(this);
mConfirmOrderPresenter.getTitle();
mConfirmOrderPresenter.getScreenParamByPayMethod();
mSmsReceiver.setOnSmsCodeReceiverListener(this);
mSmsReceiver.startReceiveSms();
}
@Override
public void onReceivedTitle(String title) {
tv_title.setText(title);
}
@Override
public void onReceivedScreenParamByPayMethod(intpayMethodId, String phone, String payDescription) {
switch (payMethodId){
case CASH:
til_sms_code.setVisibility(View.VISIBLE);
tv_info.setText(getString(R.string.text_sms_confirm)
.concat(phone));
break;
case BANK_CARD:
til_cvc_code.setVisibility(View.VISIBLE);
tv_info.setText(getString(R.string.text_card_confirm)
.concat(payDescription));
break;
}
}
@Override
public void onReceivedRequestParamByPayMethod(Map<String, String>http_params, intpay_method) {
new ConfirmOrderTask(mContext, http_params, pay_method).execute();
}
@Override
public void onClick(View v) {
intid = v.getId();
switch (id){
case R.id.iv_btn_close:
finish();
break;
case R.id.btn_confirm:
try {
booleanisFieldValid = mConfirmOrderPresenter.checkFieldValid(fieldParents, fields);
if(isFieldValid){
String pin = et_sms_code.getText().toString();
String cvc = et_cvc_code.getText().toString();
mConfirmOrderPresenter.getRequestParamByPayMethod(pin, cvc);
}
} catch (Exception mE) {
mE.printStackTrace();
}
break;
}
}
@Override
public void onSmsCodeReceived(String sms) {
et_sms_code.setText(sms);
et_sms_code.setSelection(et_sms_code.length());
}
@Override
protected void onPause() {
super.onPause();
try {
if(mSmsReceiver!=null)
mSmsReceiver.stopReceiveSms();
} catch (Exception mE) {
mE.printStackTrace();
}
}
@Override
protected void onResume() {
super.onResume();
}
}
Как видно из листинга, класс реализует сразу три интерфейса: для прослушивания входящих СМС, для обработчика нажатий и для интерфейса из, Presenter-а для этой активности.
4.3.3 Presenter
Рисунок 12 классы компонента паттерна MVP-Presenter
На следующем листинге представлен Presenterдля активности, описанной в предыдущем блоке (View):
public class ConfirmOrderPresenter {
private final static String TAG = ConfirmOrderPresenter.class.getSimpleName();
private Context mContext;
private OrderTempRepositorymOrderTempRepository;
private SettingRepositorymSettingRepository;
private FieldsValidationmValidation;
private StringProcessingmStringProcessing;
private OrderHistoryItemmOrderCurrent;
private OnConfirmOrderDirectionmOnConfirmOrderDirection;
private final static String TITLE = "Поддержка";
public ConfirmOrderPresenter(Context context){
this.mContext= context;
try {
init();
} catch (Exception mE) {
mE.printStackTrace();
}
}
public void setOnConfirmOrderDirection(OnConfirmOrderDirection direction){
mOnConfirmOrderDirection= direction;
}
private void init() throws Exception{
mOrderCurrent= getCurrentOrder();
mOrderTempRepository= new OrderTempRepository(mContext);
mSettingRepository= new SettingRepository();
mValidation= new FieldsValidation(mContext);
mStringProcessing= new StringProcessing();
}
public void getTitle(){
if(mOnConfirmOrderDirection!=null)mOnConfirmOrderDirection.onReceivedTitle(TITLE);
}
public void getScreenParamByPayMethod(){
intpayMethod = getPayMethod();
String phone = mOrderTempRepository.getOrderDataByKey(KEY_PHONE);
String pay_id = mOrderTempRepository.getOrderDataByKey(KEY_PAY_METHOD);
String pay_description = mSettingRepository.getData(pay_id);
Log.e(TAG, phone);
if(mOnConfirmOrderDirection!=null)mOnConfirmOrderDirection.onReceivedScreenParamByPayMethod(payMethod, phone, pay_description);
}
public void getRequestParamByPayMethod(String pin, String cvc) throws Exception{
/*set pay method*/
intpayMethod = getPayMethod();
/*set request parameters by pay method*/
String token = mSettingRepository.getData(USER_TOKEN);
String idtOrder = mOrderCurrent.getIdtOrder();
Map<String, String>confirmParam = new HashMap<String, String>();
switch (payMethod){
case CASH:
String phone = mStringProcessing.convertPhoneToString(mOrderTempRepository.getOrderDataByKey(KEY_PHONE));
confirmParam.put("phone", phone);
confirmParam.put("idt_order", idtOrder);
confirmParam.put("pin", pin);
confirmParam.put("token", token);
break;
case BANK_CARD:
String idtPayMethod = mOrderTempRepository.getOrderDataByKey(KEY_PAY_METHOD);
confirmParam.put("token", token);
confirmParam.put("idt_order", idtOrder);
confirmParam.put("idt_pay_method", idtPayMethod);
confirmParam.put("cvc", cvc);
break;
default:
break;
}
if(mOnConfirmOrderDirection!=null)mOnConfirmOrderDirection.onReceivedRequestParamByPayMethod(confirmParam, payMethod);
}
public booleancheckFieldValid(TextInputLayout[] fieldParents, EditText[] fields){
intpay_method = getPayMethod();
TextInputLayouttil_cvc_code = fieldParents[0];
TextInputLayouttil_sms_code = fieldParents[1];
EditTextet_cvc_code = fields[0];
EditTextet_sms_code = fields[1];
switch (pay_method){
case CASH:
return mValidation.isFieldEmpty(til_sms_code, et_sms_code);
case BANK_CARD:
return mValidation.isFieldEmpty(til_cvc_code, et_cvc_code) &&mValidation.isValidCvc(til_cvc_code, et_cvc_code);
default:
return false;
}
}
private OrderHistoryItemgetCurrentOrder() throws Exception{
intidt_order = new SettingRepository().getId(CURRENT_ORDER_ID);
return new RealmHelper<>(OrderHistoryItem.class).getById(idt_order);
}
private intgetPayMethod(){
intpayMethod = CASH;
if(mOrderTempRepository.isDataExist(KEY_PAY_METHOD)){
payMethod = BANK_CARD;
}
return payMethod;
}
public interface OnConfirmOrderDirection{
void onReceivedTitle(String title);
void onReceivedScreenParamByPayMethod(intpayMethodId, String phone, String payDescription);
void onReceivedRequestParamByPayMethod(Map<String, String>http_params, intpay_method);
}
}
4.3.4 Общая структура
«Страницы» в Android приложении называются активити (Activity). Активити, если она должна что-то показывать пользователю, состоит из разметки графического интерфейса, написанной в формате XML, и кода на языке Java, отвечающего за работу интерфейса. Активити могут содержать фрагменты - сущности, тоже имеющие свой жизненный цикл схожий с активити, однако фрагмент не может существовать вне активити.
Рисунок 13 жизненный цикл активности (экрана в android приложении)
Можно использовать для одного и того же активити разные фрагменты, что придает гибкость и вариативность в процессе разработки.
На рисунке 14 показан простой пример в виде XML кода для WebActivity используемый в приложениях проекта, а также код Java для этого XML файла.
Рисунок 14 XML разметка классаWebActivity
Рисунок 15 java код для XML разметки WebActivity
Этот примитивный пример показывает структуру Android приложения в целом. В XML файле мы определили заголовок активности Toolbar и WebView для отображения веб страниц внутри приложения. Далее, в java файле мы описываем логику для этих View. По такому принципу строится весь графический интерфейс приложения.
5. Проверка выполнения разработанных сценариев для реализованной системы
Разработанная система предназначена для удобного взаимодействия клиентов службы курьерской доставки с курьерами.
Таким образом, разработанная система предоставляет следующие возможности:
Для клиента:
- возможность редактировать профиль (ФИО, номер телефона, адрес электронной почты, способ оплаты по умолчанию), все данные используются для автоматической подстановки при заполнении формы заказа;
- управление заказами. В приложении предусмотрена возможность управлять несколькими заказами одновременно;
- добавлять избранные (любимые адреса);
- обратная связь с технической поддержкой.
Для курьера:
- просматривать данные профиля (изменять данные профиля можно, но изменения вступают в силу только после модерации;
- управление своим статусом для поиска заказов (работаю/отдыхаю);
- просматривать историю выполненных заказов с подробной детализацией;
- управление заработком (курьер может привязать банковскую карту, на которую будут выведены денежные средства);
- обратная связь с технической поддержкой.
Рисунок 16 меню с функциями управления для клиентского и курьерского приложения
Рисунок 17 управление аккаунтами для клиентского и курьерского приложения
Далее следует сценарий выполнения заказа. Все начинается со стороны клиентского приложения, заполнения данных об отправителе и получателе. Если пользователь пожелает заполнить профиль пользователя, то эти данные будут автоматически подставляться в поля с информацией об отправителе. Есть возможность выбора номера телефона и имени из записной книжки. Адрес отправления, по умолчанию, текущие координаты пользователя.
Рисунок 18 экраны для заполнения информации об отправителе и получателе
Предусмотрен экран для заполнения подробной информации о предстоящем заказе. Какой груз, его вес и габариты, описание, фотография и т.д. Однако, все поля на этом экране являются не обязательными и заполняются по желанию.
Рисунок 19 экраны для заполнения более подробной информации о заказе
Далее по сценарию клиент подтверждает сформированный заказ. Либо по смс, в случае если выбрана оплата курьеру наличными, либо по CVC привязанной банковской карты, в случае безналичной оплаты.
После чего в клиентском приложении начинается поиск курьера. На этом этапе клиент может отменить заказ, продолжать наблюдать за поиском курьера или перейти к заполнению новой формы.
Курьерское приложение свободного курьера в этот момент находится в режиме поиска заказа.
Рисунок 20 экраны ожидания заказа в клиентском и курьерском приложениях
Следующий этап сценария - “Курьер выехал в точку А”, начинается после того как курьер принял заказ. Клиенту приходит соответствующее Push уведомление.
По прибытию на место, курьер должен взять у отправителя электронную подпись, а также сфотографировать груз. До того, как курьер не выполнит эти действия, он не сможет изменить статус выполнения заказа.
Рисунок 21 курьер едет в точку “А” в клиентском и курьерском приложениях
Рисунок 22 встроенный в приложение планшет для получения подписи отправителя (получателя)
На этапе сценария - “Курьер получил посылку и выехал в точку Б”, на экране у курьера акцентируется внимание на кнопках “Перейти в навигатор” и “Позвонить получателю”. На всех этапах выполнения заказа курьер может связаться с отправителем и получателем, перейти в навигатор, а также написать в поддержку и посмотреть подробную информацию о заказе. На экране клиентского приложения статус поменяется на “Курьер получил посылку”, а также он сможет увидеть его текущее местоположение.
Рисунок 23 курьерское приложение в развернутом режиме во время выполнения заказа
На этапе “Курьер едет в точку Б” алгоритм работы приложений тот же что и при работе с получением посылки у отправителя. Курьер должен взять подпись отправителя и сфотографировать груз. После чего он сможет сменить статус на “Отправление доставлено”.
На экранах приложений появиться экран с просьбой оценить друг друга. Это действие не является обязательным как для клиента,так и для курьера.
Рисунок 24 мобильные приложения в режиме выставления взаимных оценок клиентом и курьером
Заключение. Анализ результатов работы
Основной целью настоящего дипломного проекта было создание современной и высокотехнологичной службы курьерской доставки, интегрированной в мобильное приложение.
Для достижения указанной цели был произведен анализ существующих систем, выявлены их недостатки в контексте предъявленных требований. Было принято решение о необходимости разработки новой системы, решающей весь спектр поставленных задач.
В специальной части был произведен анализ использования системы: выделены основные роли пользователей, описаны сценарии их взаимодействия с системой. Были обозначены основные функции системы, намечены стратегии архитектурного решения и выбраны технологии, позволяющие реализовать требуемую функциональность. Для описания организации данных была разработана информационная модель, представляющая структуру организации данных на различных уровнях: концептуальном, логическом и физическом. Также была разработана архитектура системы, которая послужила основой для реализации алгоритмов, описывающих функциональность системы. С целью реализации взаимодействия с пользователя с системой был реализован удобный, понятный и дружественный интерфейс пользователя. Для проверки работоспособности отдельных составляющих системы проведено модульное тестирование.
Исходя из вышесказанного, можно сделать вывод о том, что поставленная цель достигнута. Программный комплекс является завершенным и работоспособным, однако в дальнейшей перспективе возможно внедрить мобильное приложение для iOS с использованием iOS SDK.
Список литературы
1. Харди, Б., Филлипс, Б. Программирование под Android. Для профессионалов. СПБ.: Питер, 2014. 592 с.
2. ISO/IEC/IEEE 42010:2011(E) Systems and software engineering - Architecture description. NY, 2011. 46 p.
3. Википедия. MVP архитектура. https://ru.wikipedia.org/wiki/Model-View-Presenter.
4. Википедия. MVC архитектура. https://ru.wikipedia.org/wiki/Model-View-Controller.
5. Назначение и особенности этапов проектирования базы данных (БД). http://e-educ.ru/bd10.html.
6. Fowler, M. Inversion of Control Containers and the Dependency Injection pattern / M. Fowler. http://martinfowler.com/articles/injection.html.
7. SQLitevsMySQLvsPostgreSQL: сравнение систем управления базами данных - http://devacademy.ru/posts/sqlite-vs-mysql-vs-postgresql/.
8. Случайный курьер: как заработать на краудсорсинговой- доставке http://www.rbc.ru/own_business/22/04/2015/5534d7029a7947fb9982491c.
9. Android Architecture Components - https://developer.android.com/develop/index.html?hl=ru.
10. MVP для Android. Перевод - https://tttzof351.blogspot.ru/2014/04/mvp-android.html.
Размещено на Allbest.ru
Подобные документы
Современное состояние рынка мобильных приложений. Основные подходы к разработке мобильных приложений. Обоснование выбора целевой группы потребителей приложения. Этапы проектирования и разработки мобильного приложения для операционной системы Android.
курсовая работа [987,1 K], добавлен 27.06.2019Анализ популярности мобильных операционных систем в мире и России. Разработка структурно-функциональной модели. Реализация серверной и клиентской частей программы. Алгоритм поиска события в мобильном приложении. Тестирование программного обеспечения.
дипломная работа [748,3 K], добавлен 10.07.2017Архитектура операционной системы Android, набор библиотек для обеспечения базового функционала приложений и виртуальная машина Dalvik. Объектно-ориентированный язык программирования Java как инструмент разработки мобильных приложений для ОС Android.
дипломная работа [1,6 M], добавлен 08.07.2015Обзор существующих приложений в сфере оказания автомобильной помощи. Рассмотрение алгоритмического конструирования комплекса мобильных приложений по оказанию автомобильной помощи на дорогах. Оценка тестирования авторизации в приложении для водителя.
дипломная работа [1,9 M], добавлен 12.02.2018Разработка клиент-серверного игрового приложения на примере игры в шашки для мобильных устройств на базе операционной системы Android. Обзор мобильных платформ. Экраны приложения и их взаимодействие. Графический интерфейс, руководство пользователя.
курсовая работа [2,6 M], добавлен 15.06.2013Проектирование и реализация 3 приложений, каждое из которых считает площадь фигуры методом "Монте-Карло". Программные средства разработки приложения. Диаграммы классов Triangle, Rectangle и IceCream. Логическое проектирование серверной части приложения.
курсовая работа [2,6 M], добавлен 06.02.2016Проектирование, кодирование и отладка службы Windows: "Контроль приложений", осуществляющей контроль набора приложений и управление ими; разработка приложения, управляющего этой службой. Взаимодействие службы и приложения; тестирование и сопровождение.
курсовая работа [1,1 M], добавлен 22.05.2013Первое устройство, работающее под управлением Android. Приложения под операционную систему Android. Формат установочных пакетов. Разработка приложений на языке Java. Шаблоны основных пакетов и компонентов Android. Сборка приложений, основанная на Gradle.
курсовая работа [492,0 K], добавлен 08.02.2016Анализ популярных игровых приложений. Жанр – аркады с геймплеем Runner. Получение продукта, ориентированного на людей, использующих мобильные устройства на базе Android, и предназначенный для развлечения пользователей. Визуальная составляющая приложения.
дипломная работа [742,7 K], добавлен 10.07.2017Анализ деятельности кадровой службы, обоснование выбора средств автоматизации ее работы, классификация используемых информационных методов. Разработка технических требований и архитектуры серверной части. Основные этапы реализации программных модулей.
дипломная работа [1,9 M], добавлен 19.01.2017