Проектирование и разработка мобильного приложения для отдела тест-драйва автосалона

Заказать уникальную дипломную работу
Тип работы: Дипломная работа
Предмет: Программирование
  • 69 69 страниц
  • 22 + 22 источника
  • Добавлена 23.01.2024
2 500 руб.
  • Содержание
  • Часть работы
  • Список литературы
Оглавление

Введение 3
1 Анализ предметной области 5
1.1 Аналоги разрабатываемого приложения 6
1.2 Техническое задание 11
2 Описание разработки приложения 15
2.1 Обоснование средств разработки 20
2.2 Описание структуры приложения 24
2.3 Разработка интерфейса 28
2.4 Разработка логики работы приложения. Схема взаимодействия компонентов проекта
32
2.5 Назначение Activities 36
3 Тестирование мобильного приложения 38
4 Руководство пользователя 42
Заключение 52
Список использованных источников 54
Приложение. Исходный код 56
Фрагмент для ознакомления

Работа по разработке мобильного приложения имеет практическую значимость и потенциал для дальнейшего развития. Она открывает перспективы для создания современных и инновационных решений в сфере торговли машинами, а также способствует автоматизации и оптимизации бизнес-процессов.В ходе работы были решены поставленные задачи, достигнута цель и получены положительные результаты. Разработанное мобильное приложение представляет собой полноценный продукт, который может быть успешно внедрен в любой автосалон, повышая его эффективность и конкурентоспособность.Список использованных источниковПриложение Lada Connect https://play.google.com/store/apps/details?id=ru.ladaelement.app&hl=ru&gl=US2. Приложение My Cherry https://play.google.com/store/apps/details?id=ru.logicstar.CheryPersonal&hl=ru&gl=US" 3. Приложение Audi Service для iOS - Audi Service https://apps.apple.com/ru/app/audi-service/id6645805654. Приложение Audi Service дляAndroid – myAudihttps://play.google.com/store/apps/details?id=de.myaudi.mobile.assistant&hl=ru&gl=US5. Вигерс, Битти: Разработка требований к программному обеспечению, - Москва, Издательство: BHV, 2020 г., 736 стр.6. Гамма Э. Приемы объектно-ориентированного проектирования. Паттерны проектирования / Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж. - СПб.: Питер, 2019 г. – 368 с.7. Грекул В.И. Проектирование информационных систем / Грекул В.И., Денищенко Г.Н., Коровкина Н.Л. – М.: Интернет-университет информационных технологий, 2019 г. - 321 с.8. Дубейковский В.И. Эффективное моделирование с CA ErwinProcessModeler (BPwin; AllfusionProcessModeler)./В.И. Дубейковский. – М.: Диалог-МИФИ, 2020. – 384 с.9. Илюшечкин В.М. Основы использования и проектирования баз данных. Учебник / В.М. Илюшечкин. - М.: Юрайт, 2018 г. - 214 с.10. Кузин А. В., С. В. Левонисова, Базы данных, - Москва, Издательство: Академия, 2021 г., 320 стр.11. Кумскова И. А., Базы данных, - Москва, Издательство: КноРус, 2019 г., 488 стр.12. Учебник по Java -https://vertex-academy.com/tutorials/ru/samouchitel-po-java-s-nulya/13. Седжвик Р. Алгоритмы на Java / Р. Седжвик, К. Уэйн . – М.: ООО “И.Д. Вильямс”, 2019. – 848 с14. Программирования для Android - Дон Гриффитс, Дэвид Гриффитс - https://vk.com/doc26879026_470791860?hash=1AManwQRVU5YCcouXSCENSJyKMCu6bUpEOPQveZBlW815. Java 8. Руководство для начинающих, Герберт Шилдт - https://sd.blackball.lv/books/5271?mode=read16. Android. Сборник рецептов. Задачи и решения для разработчиков приложений. 2-е издание - https://vk.com/doc26879026_470723087?hash=LFfzdmrdlCGkDZgdwp9CZS1mU3uB3TtZhRMdEB2Dvzg17.Документация Firebase. -https://firebase.google.com/docs18. Документация разработчика Android- https://developer.android.com/19. Хранение данных в Android -https://startandroid.ru/ru/uroki/vse-uroki-spiskom/73-urok-33-hranenie-dannyh-preferences.html20. Установка приложения -https://support.google.com/googleplay/answer/113409?hl=ru21. П. Дейтел, Х. Дейтел, А. Уолд. - Android для разработчиков. 3-е издание - https://obuchalka.org/20210620133496/android-dlya-razrabotchikov-deitel-p-deitel-x-uold-a-2019.html22. Брайан Харди, Билл Филлипс,Крис Стюарт, Кристин Марсикано - Программирование под Android. 2-е издание - http://library.kre.dp.ua/Books/2-Android_/Android_Programmirovanie_dlya_professionalov_2-e_izdanie_2019.pdfПриложение. Исходный кодФайлAndroidManifest .idea/deploymentTargetDropDown.xml .idea/gradle.xml .idea/misc.xml /androidTest/java/com/example/carspot/ExampleInstrumentedTest.javapackagecom.example.carspot;importandroid.content.Context;importandroidx.test.platform.app.InstrumentationRegistry;import androidx.test.ext.junit.runners.AndroidJUnit4;importorg.junit.Test;importorg.junit.runner.RunWith;import static org.junit.Assert.*;/** * Instrumented test, which will execute on an Android device. * * @see Testing documentation */@RunWith(AndroidJUnit4.class)public class ExampleInstrumentedTest { @Testpublic void useAppContext() { // Context of the app under test. Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();assertEquals("com.example.carspot", appContext.getPackageName()); }}AddCarActivity.javapackagecom.example.carspot;importandroidx.activity.result.ActivityResult;importandroidx.activity.result.ActivityResultCallback;importandroidx.activity.result.ActivityResultLauncher;importandroidx.activity.result.contract.ActivityResultContracts;importandroidx.annotation.NonNull;importandroidx.annotation.Nullable;importandroidx.appcompat.app.AppCompatActivity;importandroid.app.ProgressDialog;importandroid.content.Intent;importandroid.net.Uri;importandroid.os.Bundle;importandroid.view.View;importandroid.view.Window;importandroid.widget.Toast;importcom.example.carspot.databinding.ActivityAddCarBinding;importcom.google.android.gms.tasks.OnFailureListener;importcom.google.android.gms.tasks.OnSuccessListener;importcom.google.firebase.database.DatabaseReference;importcom.google.firebase.database.FirebaseDatabase;importcom.google.firebase.storage.FirebaseStorage;importcom.google.firebase.storage.StorageReference;importcom.google.firebase.storage.UploadTask;public class AddCarActivity extends AppCompatActivity {privateActivityAddCarBinding binding;private Uri imageUri;privateStorageReferencestorageReference; //private String fileName;privateFirebaseDatabase database;privateDatabaseReferencedatabaseReference;privateProgressDialogprogressDialog; @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);binding = ActivityAddCarBinding.inflate(getLayoutInflater());setContentView(binding.getRoot()); Window w = getWindow();w.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION|View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);binding.imageViewSelectCar.setOnClickListener(new View.OnClickListener() { @Overridepublic void onClick(View v) {selectImage(); } });binding.pushCarBtn.setOnClickListener(new View.OnClickListener() { @Overridepublic void onClick(View v) {progressDialog = new ProgressDialog(AddCarActivity.this);progressDialog.setMessage("Загрузкаинформации...");progressDialog.setCancelable(false);progressDialog.show();uploadImage();pushData();finish(); } }); }private void uploadImage() {storageReference = FirebaseStorage.getInstance().getReference("images/" +binding.editTextCarName.getText().toString()+".jpeg");storageReference.putFile(imageUri) .addOnSuccessListener(new OnSuccessListener() { @Overridepublic void onSuccess(UploadTask.TaskSnapshottaskSnapshot) {Toast.makeText(AddCarActivity.this, "Uploaded succesfully", Toast.LENGTH_SHORT).show();if (progressDialog.isShowing())progressDialog.dismiss(); } }).addOnFailureListener(new OnFailureListener() { @Overridepublic void onFailure(@NonNull Exception e) {Toast.makeText(AddCarActivity.this, "Upload failed", Toast.LENGTH_SHORT).show();if (progressDialog.isShowing())progressDialog.dismiss(); } }); }private void selectImage() { Intent intent = new Intent();intent.setType("image/*");intent.setAction(Intent.ACTION_GET_CONTENT);startActivityForResult(intent, 100); }private void pushData(){database = FirebaseDatabase.getInstance();databaseReference = database.getReference("CAR"); Car car = new Car(binding.editTextCarName.getText().toString(), binding.editTextCarYear.getText().toString(),binding.editTextCarReach.getText().toString(), binding.editTextCarPower.getText().toString(),binding.editTextCarDescription.getText().toString());databaseReference.push().setValue(car); } @Overrideprotected void onActivityResult(intrequestCode, intresultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == 100 && data != null && data.getData() != null){imageUri = data.getData();binding.imageViewSelectCar.setImageURI(imageUri); } }}AuthScreenActivity.javapackagecom.example.carspot;importandroidx.annotation.NonNull;importandroidx.appcompat.app.AppCompatActivity;importandroid.content.Intent;importandroid.graphics.Color;importandroid.os.Bundle;importandroid.text.TextUtils;importandroid.view.View;importandroid.view.Window;importandroid.widget.Toast;importcom.example.carspot.databinding.AuthScreenBinding;importcom.google.android.gms.tasks.OnFailureListener;importcom.google.android.gms.tasks.OnSuccessListener;importcom.google.firebase.auth.AuthResult;importcom.google.firebase.auth.FirebaseAuth;importcom.google.firebase.database.DatabaseReference;importcom.google.firebase.database.FirebaseDatabase;public class AuthScreenActivity extends AppCompatActivity {privateFirebaseAuthmAuth;privateAuthScreenBinding binding;privateFirebaseDatabase database;privateDatabaseReference reference; @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);binding = AuthScreenBinding.inflate(getLayoutInflater());setContentView(binding.getRoot()); Window w = getWindow(); .getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION|View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);mAuth = FirebaseAuth.getInstance();database = FirebaseDatabase.getInstance();reference = database.getReference("USER"); }private void createUser() {if (!TextUtils.isEmpty(binding.editTextNameAuth.getText().toString()) && !TextUtils.isEmpty(binding.editTextNumberAuth.getText().toString()) &&!TextUtils.isEmpty(binding.editTextTextEmailAddress.getText().toString()) && !TextUtils.isEmpty(binding.editTextTextPassword.getText().toString())){mAuth.createUserWithEmailAndPassword(binding.editTextTextEmailAddress.getText().toString(),binding.editTextTextPassword.getText().toString()).addOnSuccessListener(new OnSuccessListener() { @Overridepublic void onSuccess(AuthResultauthResult) {Toast.makeText(AuthScreenActivity.this, "Регистрациязавершена!", Toast.LENGTH_SHORT).show();startActivity(new Intent(AuthScreenActivity.this, LogInActivity.class)); } }).addOnFailureListener(new OnFailureListener() { @Overridepublic void onFailure(@NonNull Exception e) {Toast.makeText(AuthScreenActivity.this, "Что-топошлонетак...", Toast.LENGTH_SHORT).show(); } }); } else {Toast.makeText(this, "Заполнитевсеполя", Toast.LENGTH_SHORT).show(); } }public void onClickAuth(View view){reference = database.getReference("USER"); User cUser = new User(binding.editTextNameAuth.getText().toString(),binding.editTextNumberAuth.getText().toString(),binding.editTextTextPassword.getText().toString(),binding.editTextTextEmailAddress.getText().toString());reference.push().setValue(cUser);createUser(); }public void onClickHaveAcc(View view){startActivity(new Intent(AuthScreenActivity.this, LogInActivity.class));finish(); }carspot/Car.javapackagecom.example.carspot;public class Car { String name, year, reach, power, description;public Car(String name, String year, String reach, String power, String description) { this.name = name;this.year = year;this.reach = reach;this.power = power;this.description = description; }public Car(){}public String getDescription() {return description; }public void setDescription(String description) {this.description = description; }public String getName() {return name; }public void setName(String name) { this.name = name; }public String getYear() {return year; }public void setYear(String year) {this.year = year; }public String getReach() {return reach; }public void setReach(String reach) {this.reach = reach; }public String getPower() {return power; }public void setPower(String power) {this.power = power; }}app/src/main/java/com/carspot/CarsActivity.javapackagecom.example.carspot;importandroidx.annotation.NonNull;importandroidx.appcompat.app.AppCompatActivity;importandroid.animation.ObjectAnimator;importandroid.content.Intent;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.AdapterView;importandroid.widget.ListView;importandroid.widget.TextView;importandroid.widget.Toast;importcom.google.android.material.button.MaterialButton;importcom.google.firebase.database.DataSnapshot;importcom.google.firebase.database.DatabaseError;importcom.google.firebase.database.DatabaseReference;importcom.google.firebase.database.FirebaseDatabase;importcom.google.firebase.database.ValueEventListener;importjava.util.ArrayList;public class CarsActivity extends AppCompatActivity {ListViewcar_list_view;DatabaseReferencemDataBase; String CAR_KEY = "CAR";ArrayList arrayCarList;ListAdapterlistAdapter; @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_cars);car_list_view = findViewById(R.id.car_listview);mDataBase = FirebaseDatabase.getInstance().getReference(CAR_KEY);arrayCarList = new ArrayList<>();listAdapter = new ListAdapter(this, R.layout.car_listview_item, arrayCarList);car_list_view.setAdapter(listAdapter);getDataFromDB();car_list_view.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Overridepublic void onItemClick(AdapterView parent, View view, int position, long id) {ObjectAnimator animation = ObjectAnimator.ofFloat(car_list_view.getChildAt(position), "translationX", 70f, 0f);animation.setDuration(200);animation.start(); String str = arrayCarList.get(position).getName(); String description = arrayCarList.get(position).getDescription(); Intent intent = new Intent(CarsActivity.this, CurrentCarActivity.class);intent.putExtra("car_name", str);intent.putExtra("description", description);startActivity(intent); } }); }private void getDataFromDB(){ValueEventListenervalueEventListener = new ValueEventListener() { @Overridepublic void onDataChange(@NonNullDataSnapshot snapshot) {if (arrayCarList.size()>0) arrayCarList.clear();for (DataSnapshot ds : snapshot.getChildren()){ Car car = ds.getValue(Car.class);assert car !=null;arrayCarList.add(car); }listAdapter.notifyDataSetChanged(); } @Overridepublic void onCancelled(@NonNullDatabaseError error) { } };mDataBase.addValueEventListener(valueEventListener); }app/src/main/java/com/example/carspot/TabsActivity.javapackagecom.example.carspot;importandroidx.annotation.NonNull;importandroidx.appcompat.app.AppCompatActivity;importandroid.animation.ObjectAnimator;importandroid.content.Intent;importandroid.graphics.Color;importandroid.os.Bundle;importandroid.view.View;importandroid.view.Window;importandroid.view.animation.AnimationUtils;importandroid.widget.ImageView;importandroid.widget.RelativeLayout;importandroid.widget.TextView;importcom.google.firebase.auth.FirebaseAuth;importcom.google.firebase.auth.FirebaseUser;importcom.google.firebase.database.DataSnapshot;importcom.google.firebase.database.DatabaseError;importcom.google.firebase.database.DatabaseReference;importcom.google.firebase.database.FirebaseDatabase;importcom.google.firebase.database.ValueEventListener;importjava.sql.Ref;public class TabsActivity extends AppCompatActivity {RelativeLayoutcars_layout;RelativeLayoutinformation_layout;RelativeLayoutsettings_layout;RelativeLayoutadd_car_layout;RelativeLayoutshow_offer_layout;ImageViewlog_out;boolean out;privateFirebaseAuthmAuth;privateFirebaseDatabase database = FirebaseDatabase.getInstance();privateDatabaseReferenceRefDes = database.getReference("DESICION"); @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_tabs); Window w = getWindow();w.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);mAuth = FirebaseAuth.getInstance();log_out = findViewById(R.id.imageViewLogOut);cars_layout = findViewById(R.id.car_card);information_layout = findViewById(R.id.information_card);settings_layout = findViewById(R.id.account_card);add_car_layout = findViewById(R.id.addCar_layout);show_offer_layout = findViewById(R.id.show_offers_layout);if (mAuth.getCurrentUser().getEmail().toString().equals("postikaartem4@gmail.com")) {information_layout.setVisibility(View.GONE);settings_layout.setVisibility(View.GONE);add_car_layout.setVisibility(View.VISIBLE);show_offer_layout.setVisibility(View.VISIBLE); } else {information_layout.setVisibility(View.VISIBLE);settings_layout.setVisibility(View.VISIBLE);add_car_layout.setVisibility(View.GONE);show_offer_layout.setVisibility(View.GONE); }cars_layout.setOnClickListener(new View.OnClickListener() { @Overridepublic void onClick(View v) {ObjectAnimator animation = ObjectAnimator.ofFloat(cars_layout, "translationX", 70f, 0f);animation.setDuration(250);animation.start();startActivity(new Intent(TabsActivity.this, CarsActivity.class)); } });information_layout.setOnClickListener(new View.OnClickListener() { @Overridepublic void onClick(View v) {ObjectAnimator animation = ObjectAnimator.ofFloat(information_layout, "translationX", 70f, 0f);animation.setDuration(200);animation.start();startActivity(new Intent(TabsActivity.this, InformationActivity.class)); } });settings_layout.setOnClickListener(new View.OnClickListener() { @Overridepublic void onClick(View v) {ObjectAnimator animation = ObjectAnimator.ofFloat(settings_layout, "translationX", 70f, 0f);animation.setDuration(200);animation.start();startActivity(new Intent(TabsActivity.this, SettingsActivity.class)); } });add_car_layout.setOnClickListener(new View.OnClickListener() { @Overridepublic void onClick(View v) {ObjectAnimator animation = ObjectAnimator.ofFloat(add_car_layout, "translationX", 70f, 0f);animation.setDuration(200);animation.start();startActivity(new Intent(TabsActivity.this, AddCarActivity.class)); } });show_offer_layout.setOnClickListener(new View.OnClickListener() { @Overridepublic void onClick(View v) {ObjectAnimator animation = ObjectAnimator.ofFloat(show_offer_layout, "translationX", 70f, 0f);animation.setDuration(200);animation.start();startActivity(new Intent(TabsActivity.this, OffersActivity.class)); } });log_out.setOnClickListener(new View.OnClickListener() { @Overridepublic void onClick(View v) {FirebaseAuth.getInstance().signOut();startActivity(new Intent(TabsActivity.this, LogInActivity.class));finish(); } }); }

Список использованных источников

1. Приложение Lada Connect https://play.google.com/store/apps/details?id=ru.ladaelement.app&hl=ru&gl=US
2. Приложение My Cherry https://play.google.com/store/apps/details?id=ru.logicstar.CheryPersonal&hl=ru&gl=US"
3. Приложение Audi Service для iOS - Audi Service https://apps.apple.com/ru/app/audi-service/id664580565
4. Приложение Audi Service для Android – myAudi
https://play.google.com/store/apps/details?id=de.myaudi.mobile.assistant&hl=ru&gl=US
5. Вигерс, Битти: Разработка требований к программному обеспечению, - Москва, Издательство: BHV, 2020 г., 736 стр.
6. Гамма Э. Приемы объектно-ориентированного проектирования. Паттерны проектирования / Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж. - СПб.: Питер, 2019 г. – 368 с.
7. Грекул В.И. Проектирование информационных систем / Грекул В.И., Денищенко Г.Н., Коровкина Н.Л. – М.: Интернет-университет информационных технологий, 2019 г. - 321 с.
8. Дубейковский В.И. Эффективное моделирование с CA ErwinProcessModeler (BPwin; AllfusionProcessModeler)./В.И. Дубейковский. – М.: Диалог-МИФИ, 2020. – 384 с.
9. Илюшечкин В.М. Основы использования и проектирования баз данных. Учебник / В.М. Илюшечкин. - М.: Юрайт, 2018 г. - 214 с.
10. Кузин А. В., С. В. Левонисова, Базы данных, - Москва, Издательство: Академия, 2021 г., 320 стр.
11. Кумскова И. А., Базы данных, - Москва, Издательство: КноРус, 2019 г., 488 стр.
12. Учебник по Java - https://vertex-academy.com/tutorials/ru/samouchitel-po-java-s-nulya/
13. Седжвик Р. Алгоритмы на Java / Р. Седжвик, К. Уэйн . – М.: ООО “И.Д. Вильямс”, 2019. – 848 с
14. Программирования для Android - Дон Гриффитс, Дэвид Гриффитс - https://vk.com/doc26879026_470791860?hash=1AManwQRVU5YCcouXSCENSJyKMCu6bUpEOPQveZBlW8
15. Java 8. Руководство для начинающих, Герберт Шилдт - https://sd.blackball.lv/books/5271?mode=read
16. Android. Сборник рецептов. Задачи и решения для разработчиков приложений. 2-е издание - https://vk.com/doc26879026_470723087?hash=LFfzdmrdlCGkDZgdwp9CZS1mU3uB3TtZhRMdEB2Dvzg
17. Документация Firebase. - https://firebase.google.com/docs
18. Документация разработчика Android - https://developer.android.com/
19. Хранение данных в Android - https://startandroid.ru/ru/uroki/vse-uroki-spiskom/73-urok-33-hranenie-dannyh-preferences.html
20. Установка приложения -https://support.google.com/googleplay/answer/113409?hl=ru
21. П. Дейтел, Х. Дейтел, А. Уолд. - Android для разработчиков. 3-е издание - https://obuchalka.org/20210620133496/android-dlya-razrabotchikov-deitel-p-deitel-x-uold-a-2019.html
22. Брайан Харди, Билл Филлипс, Крис Стюарт, Кристин Марсикано - Программирование под Android. 2-е издание - http://library.kre.dp.ua/Books/2-Android_/Android_Programmirovanie_dlya_professionalov_2-e_izdanie_2019.pdf