Przeglądaj źródła

Добавлена возможность авторизации (проверка по номеру карты и пин-коду)

Alec 4 lat temu
rodzic
commit
2012798e27

+ 1 - 1
.idea/misc.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="false" project-jdk-name="11" project-jdk-type="JavaSDK">
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="false" project-jdk-name="13" project-jdk-type="JavaSDK">
     <output url="file://$PROJECT_DIR$/out" />
   </component>
 </project>

BIN
out/production/ExampleJavaList/com/company/Bank.class


BIN
out/production/ExampleJavaList/com/company/Bill.class


BIN
out/production/ExampleJavaList/com/company/Main.class


+ 26 - 1
src/com/company/Bank.java

@@ -46,6 +46,29 @@ public class Bank {
         Bank.name = name;
     }
 
+    /**
+     * Авторизация клиента в системе
+     *
+     * @param bill номер счёта
+     * @param pin  пин-код
+     * @return true, если данные верны
+     */
+    public static boolean authorization(String bill, String pin) {
+        Bill pointer = head;
+
+        while (pointer != null) {
+            if (pointer.getNumber().equals(bill)) {
+                if (pointer.checkPincode(pin)) {
+                    return true;
+                }
+            }
+
+            pointer = pointer.next;
+        }
+
+        return false;
+    }
+
     /**
      * Вставить новый элемент в конец списока (открытие нового счёта)
      *
@@ -54,7 +77,7 @@ public class Bank {
      * @param name     фамилия и имя клиента
      * @param balance  начальный баланс
      */
-    public static void insert(String passport, String phone, String name, double balance) {
+    public static SecretData insert(String passport, String phone, String name, double balance) {
         Bill newBill = new Bill(balance, passport, phone, name, count);
 
         if (head == null) {
@@ -70,6 +93,8 @@ public class Bank {
         }
 
         count++;
+
+        return newBill.getSecretData();
     }
 
     /**

+ 20 - 1
src/com/company/Bill.java

@@ -1,5 +1,9 @@
 package com.company;
 
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.Random;
+
 public class Bill {
     public Bill next;
 
@@ -8,6 +12,7 @@ public class Bill {
     private String phone;
     private String name;
     private String number;
+    private String pincode;
 
     /**
      * Конструктор счёта
@@ -23,9 +28,19 @@ public class Bill {
         this.passport = passport;
         this.phone = phone;
         this.name = name;
-        next = null;
 
+        // Генерация пин-кода
+        Random random = new Random(System.currentTimeMillis());
+        pincode = String.format("%04d", random.nextInt(10000));
+
+        // Генерация номера карты
         number = String.format("%04d %04d %04d %04d", 3202, 2200, 5420, num);
+
+        next = null;
+    }
+
+    public boolean checkPincode(String pin) {
+        return pincode.equals(pin);
     }
 
     public double getBalance() {
@@ -47,4 +62,8 @@ public class Bill {
     public String getNumber() {
         return number;
     }
+
+    public SecretData getSecretData() {
+        return new SecretData(number, pincode);
+    }
 }

+ 40 - 8
src/com/company/Client.java

@@ -7,39 +7,71 @@ public class Client extends Thread {
     private Socket socket;
     private InputStream is;
     private OutputStream os;
+    private boolean authorized;
 
     /**
-     *
      * @param socket сокет клиента
      */
     public Client(Socket socket) throws IOException {
         this.socket = socket;
         this.is = this.socket.getInputStream();
         this.os = this.socket.getOutputStream();
+        authorized = false;
     }
 
     @Override
     public void run() {
         while (!isInterrupted()) {
             try {
+                // Принимаем сообщение от клиента
+
                 ObjectInputStream objectInputStream = new ObjectInputStream(is);
+                ObjectOutputStream objectOutputStream = new ObjectOutputStream(os);
 
-                UserMessage userMessage = (UserMessage)objectInputStream.readObject();
+                UserMessage userMessage = (UserMessage) objectInputStream.readObject();
                 switch (userMessage.TYPE) {
+                    case AUTHORIZATION:
+                        authorized = Bank.authorization(userMessage.BILL_NUMBER, userMessage.PIN);
+                        break;
+                    case SIGN_CONTRACT:
+                        SecretData secretData = Bank.insert(userMessage.PASSPORT, userMessage.PHONE, userMessage.FULLNAME, userMessage.BALANCE);
+                        objectOutputStream.writeObject(secretData);
+                        objectOutputStream.flush();
+                        continue;
+                    case BREAK_CONTRACT:
+                        if (!authorized) {
+                            System.out.println("Для совершения операций со счётом необходимо авторизоваться");
+                            objectOutputStream.writeChars("Действие не выполнено! Необходимо авторизоваться.");
+                            objectOutputStream.flush();
+                            continue;
+                        }
+                        Bank.delete(userMessage.BILL_NUMBER);
+                        break;
                     case DEPOSIT:
+                        if (!authorized) {
+                            System.out.println("Для совершения операций со счётом необходимо авторизоваться");
+                            objectOutputStream.writeChars("Действие не выполнено! Необходимо авторизоваться.");
+                            objectOutputStream.flush();
+                            continue;
+                        }
                         Bank.deposit(userMessage.BALANCE, userMessage.BILL_NUMBER);
                         break;
                     case WITHDRAW:
+                        if (!authorized) {
+                            System.out.println("Для совершения операций со счётом необходимо авторизоваться");
+                            objectOutputStream.writeChars("Действие не выполнено! Необходимо авторизоваться.");
+                            objectOutputStream.flush();
+                            continue;
+                        }
                         Bank.withdraw(userMessage.BALANCE, userMessage.BILL_NUMBER);
                         break;
-                    case SIGN_CONTRACT:
-                        Bank.insert(userMessage.PASSPORT, userMessage.PHONE, userMessage.FULLNAME, userMessage.BALANCE);
-                        break;
-                    case BREAK_CONTRACT:
-                        Bank.delete(userMessage.BILL_NUMBER);
-                        break;
                 }
 
+                // Посылаем ответ с результатом работы для не обработанных действий
+
+                objectOutputStream.writeChars("Действие успешно выполнено");
+                objectOutputStream.flush();
+
             } catch (ClassNotFoundException | IOException exception) {
                 System.out.println(exception.getMessage());
                 interrupt();

+ 13 - 0
src/com/company/SecretData.java

@@ -0,0 +1,13 @@
+package com.company;
+
+import java.io.Serializable;
+
+public class SecretData implements Serializable {
+    public SecretData(String number, String pin) {
+        this.number = number;
+        this.pin = pin;
+    }
+
+    public String number;
+    public String pin;
+}

+ 1 - 0
src/com/company/UserMessage.java

@@ -5,6 +5,7 @@ import java.io.Serializable;
 public class UserMessage implements Serializable {
     public UserMessageType TYPE = UserMessageType.DEFAULT;
     public String BILL_NUMBER;
+    public String PIN;
     public String FULLNAME;
     public String PHONE;
     public String PASSPORT;

+ 4 - 0
src/com/company/UserMessageType.java

@@ -21,4 +21,8 @@ public enum UserMessageType {
      * Открыть новый счёт
      */
     SIGN_CONTRACT,
+    /**
+     * Авторизация в системе (ввод номера счёта и пин-кода)
+     */
+    AUTHORIZATION,
 }