Database comprehensive experiment -- database programming of customer subscription registration database (JDBC)

	Undertake the last database design and come to the database programming module!

1, Description

  1. Technology stack: Java language programming, JDBC, Swing graphical user interface design, database design
  2. Related tools: IntelliJ IDEA, JDK-15, SSMS, SQL Server.

2, Code organization mode

Imitating MVC pattern design, the view layer is responsible for handling user interaction, the control layer is responsible for handling user requests, and the logic layer is responsible for handling specific operations and database interaction.
Main class diagram:

3, Project construction

3, Project construction

At the initial stage of the project, there were many ideas and multiple functions were designed. After the programming practice, some functions were deleted, and the core functions of the demand analysis stage were retained, that is, register customers - > purchase goods by customers - > issue orders - > issue invoices.
The following figure shows the project directory (some functions are deleted and some classes are not implemented)


SSMS table creation:

4, Class file description

All classes in the above figure that are not described below can be ignored!

Program entry:
Application_Entrance.java

Constant file:
Constant.java: save various constants, etc

View layer class:
Login_Frame.java: administrator login interface
Administrator_Frame.java: administrator function interface
CustomerManage_Frame.java: customer management interface
GoodsManage_Frame.java: commodity management interface
OrderManage_Frame.java: order management interface
InvoiceManage_Frame.java: Invoice Management Interface

Control layer class:
LoginController.java: administrator login control
QueryController.java: query control
UpdateContriller.java: update control
AddController.java: add control

Logical layer class:
AddCustomerAction.java: new customer processing
AddGoodsInfoInOrder.java: add commodity information processing in order
AddInvoiceAction.java: add invoice processing
AddOrderAction.java: add order processing

QueryAdministratorAction.java: query administrator
QueryCustomerAction.java: query customer
QueryGoodsAction.java: query goods
QueryGoodsInfoInOrderAction.java: query the product information in the order
QueryInvoiceAction.java: query invoice
QueryOrderAction.java: query order

UpdateGoodsAction.java: update product information

The documents mentioned above are valid.

5, Running example

Operation sequence of core business: administrator enters password to log in - > add customer - > go shopping - > customer purchases goods - > issue order - > Save order - > issue invoice - > select payment method - > go payment - > Save (print) invoice









The above is the core business! Of course, the author has also implemented some other functions, which can be known in the source code!

6, Complete source code

The following is part of the class source code. The author has uploaded all the code. All the uploaded files are free!!! Do not need any form of currency!!!

Complete source code direct, biubiubiu~~~

Constant.java:

/*
 *@author W-nut
 *
 */

package application_Constant;

import java.util.ArrayList;

public interface Constant
{
    //the link to database
    String DATABASE_URL="jdbc:sqlserver://W-NUT:1433;DatabaseName=CustomerPurchase";
    String USER_NAME="sa";
    String USER_PASSWORD="123456";

    //the name of actions
    String LOAD_DATABASE="application_Action.LoadDatabaseAction";

    //the query of SQL
    String QUERY_ADMINISTRATOR_NAME_PASSWORD="select ad_Name,ad_Password from CP_administrator";
    String QUERY_CUSTOMER="select* from CP_customer";
    String QUERY_CUSTOMER_NUM="select cus_Num from CP_customer";
    String QUERY_CUSTOMER_BY_NAME="select cus_Name from CP_customer where cus_Name=?";
    String QUERY_CUSTOMER_ALL_BY_NAME="select cus_Num,cus_Name,cus_Tel,cus_Address from CP_customer where cus_Name=?";
    String QUERY_CUSTOMER_NUM_BY_NAME="select cus_Num from CP_customer where cus_Name=?";
    String QUERY_CUSTOMER_NAME="select cus_Name from CP_customer";
    String QUERY_GOODS= "select* from CP_goods";
    String QUERY_GOODS_BY_NAME="select * from CP_goods where goods_Name=?";
    String QUERY_GOODS_STORE_NUM_BY_NAME="select goods_StoreNum from CP_goods where goods_Name=?";
    String QUERY_GOODS_STORE_NUM="select goods_StoreNum from CP_goods where goods_Name=?";
    String QUERY_GOODS_INFO_IN_ORDER_BY_ORDER_NUM= "select goods_Name,goods_ChooseNum from CP_goodsInfoInOrder where order_Num=?";
    String QUERY_GOODS_INFO_IN_ORDER_LAST_PK="select info_PK from CP_goodsInfoInOrder ";
    String QUERY_ORDER_NUM="select order_Num from CP_Order";
    String QUERY_INVOICE_NUM="select inv_Num from CP_invoice";

    String ADD_CUSTOMER="insert into CP_customer values(?,?,?,?) ";
    String ADD_ORDER="insert into CP_order(order_Num,order_CustomerNum,order_Date) values(?,?,?)";
    String ADD_GOODS_INFO_IN_ORDER="insert into CP_goodsInfoInOrder values(?,?,?,?,?)";
    String ADD_INVOICE="insert into CP_invoice values(?,?,?,?,?,?)";

    String UPDATE_GOODS_STORE_NUM="update CP_goods set goods_StoreNum=? where goods_Name=?";

    //the table info of customer
    ArrayList<String>CUSTOMER_INFO_HEADER=new ArrayList<>();            //Customer table header
    ArrayList<String>CUSTOMER_INFO_NUM=new ArrayList<>();               //Customer number
    ArrayList<String>CUSTOMER_INFO_NAME=new ArrayList<>();              //Customer name
    ArrayList<String>CUSTOMER_INFO_TEL=new ArrayList<>();               //Customer telephone
    ArrayList<String>CUSTOMER_INFO_ADDRESS=new ArrayList<>();           //Customer address
    ArrayList<String>CUSTOMER_INFO_ALL=new ArrayList<>();               //All customer information

    //the table info of goods
    ArrayList<String>GOODS_INFO_HEADER=new ArrayList<>();               //Item table header
    ArrayList<String>GOODS_INFO_SELECTED_HEADER=new ArrayList<>();      //Selected item table header
    ArrayList<String>GOODS_INFO_NUM=new ArrayList<>();                  //Commodity No
    ArrayList<String>GOODS_INFO_NAME=new ArrayList<>();                 //Trade name
    ArrayList<Float>GOODS_INFO_PRICE=new ArrayList<>();                 //item pricing 
    ArrayList<Integer>GOODS_INFO_STORE_NUM=new ArrayList<>();           //Commodity inventory

    ArrayList<String>GOODS_SELECTED_HEADER=new ArrayList<>();           //Selected item table header
    ArrayList<String>GOODS_SELECTED_NAME=new ArrayList<>();             //Selected product name
    ArrayList<String>GOODS_SELECTED_CHOOSE_NUM=new ArrayList<>();       //Number of selected products

    //the info of order table
    ArrayList<String>ORDER_INFO_NUM=new ArrayList<>();                  //Order No. queried
    ArrayList<String>INVOICE_INFO_NUM=new ArrayList<>();                //Invoice No. queried

    //some state flags
    int CUSTOMER_NAME_OVER_LENGTH=0;                                    //Incorrect length of customer name entered
    int CUSTOMER_NAME_OVERLOAD=1;                                       //Enter customer name duplicate name
    int CUSTOMER_NAME_NOT_OVERLOAD=2;                                   //Customer name is not the same
    int CUSTOMER_TEL_OVER_LENGTH=3;                                     //Wrong phone length for customer name input
    int CUSTOMER_ADDRESS_OVER_LENGTH=4;                                 //Input customer name address length error
    int ADD_CUSTOMER_ALLOWED=5;                                         //All customer information entered are legal
    int DATABASE_ERROR=6;                                               //Database error

    int GOODS_STORE_NUM_SHORT=7;                                        //Insufficient inventory of goods
    int GOODS_STORE_NUM_ENOUGH=8;                                       //Sufficient inventory of goods
    int INPUT_NOT_INTEGER=9;                                            //Input is not an integer
    int ERROR=10;                                                       //Operation successful
    int SUCCESS=11;                                                     //operation failed

    //the ways of paying
    String [] PAY_WAYS={"Alipay","WeChat","bank card","cash"};                   //Payment method
}

Application_Entrance.java:

/*
 * @author W-nut
 * Business process: register customer information - > purchase goods - > generate orders - > issue invoices
 * Framework mode: imitate MVC (model view controller)
 */


package application_Entrance;

import application_Frame.Login_Frame;

@SuppressWarnings("unused")

public class Application_Entrance
{
    public static void main(String[] args)
    {
        Login_Frame login_frame=new Login_Frame();
    }
}

Login_Frame.java:

/*
 * @author W-nut
 */
package application_Frame;

import application_Controller.LoginController;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Login_Frame extends JFrame
{
    // JFormDesigner - Variables declaration - DO NOT MODIFY  //GEN-BEGIN:variables
    private JButton button_Login;
    private JButton button_Esc;
    private JTextField textField_User_Name;
    private JLabel label_User_Name;
    private JLabel label_Password;
    private JPasswordField passwordField_Password;

    private Administrator_Frame administrator_frame;
    private LoginController loginController;
    // JFormDesigner - End of variables declaration  //GEN-END:variables

    public Login_Frame()
    {
        initComponents();
        Load_Login_Frame();
    }
    public String get_textField_User_Name()
    {
        return textField_User_Name.getText();
    }
    public String get_passwordField_Password()
    {
        return String.valueOf(passwordField_Password.getPassword());
    }

    private void Load_Login_Frame()
    {
        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        this.setSize(400,300);
        this.setVisible(true);
    }
    private void button_Login_MouseClicked(MouseEvent e)
    {
        boolean input_message= !get_textField_User_Name().equals("") && !get_passwordField_Password().equals("");
        if(input_message)
        {
            loginController=new LoginController(get_textField_User_Name(),get_passwordField_Password());
            boolean id_verifiedMessage = loginController.getVerifiedMessage();
            if(id_verifiedMessage)
            {
                administrator_frame = new Administrator_Frame();
                this.setVisible(false);
            }
            else
                JOptionPane.showMessageDialog(this,"Wrong user name or password!");
        }
        else
            JOptionPane.showMessageDialog(this,"User name and password cannot be empty!");
    }

    private void button_Esc_MouseClicked(MouseEvent e)
    {
        System.exit(0);
    }

    private void initComponents()
    {

        // Generated using JFormDesigner Evaluation license - nut
        button_Login = new JButton();
        button_Esc = new JButton();
        textField_User_Name = new JTextField();
        label_User_Name = new JLabel();
        label_Password = new JLabel();
        passwordField_Password = new JPasswordField();

        //======== this ========
        setTitle("W-nut Login");
        var contentPane = getContentPane();
        contentPane.setLayout(null);

        //---- button_Login ----
        button_Login.setText("Login");
        button_Login.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                button_Login_MouseClicked(e);
            }
        });
        contentPane.add(button_Login);
        button_Login.setBounds(new Rectangle(new Point(115, 215), button_Login.getPreferredSize()));

        //---- button_Esc ----
        button_Esc.setText("Esc");
        button_Esc.addMouseListener(new MouseAdapter()
        {
            @Override       //Override parent method declaration
            public void mouseClicked(MouseEvent e)
            {
                button_Esc_MouseClicked(e);
            }
        });
        contentPane.add(button_Esc);
        button_Esc.setBounds(new Rectangle(new Point(265, 215), button_Esc.getPreferredSize()));
        contentPane.add(textField_User_Name);
        textField_User_Name.setBounds(155, 65, 135, textField_User_Name.getPreferredSize().height);

        //---- label_User_Name ----
        label_User_Name.setText("User_Name");
        contentPane.add(label_User_Name);
        label_User_Name.setBounds(new Rectangle(new Point(70, 70), label_User_Name.getPreferredSize()));

        //---- label_Password ----
        label_Password.setText("Password");
        contentPane.add(label_Password);
        label_Password.setBounds(new Rectangle(new Point(70, 125), label_Password.getPreferredSize()));
        contentPane.add(passwordField_Password);
        passwordField_Password.setBounds(155, 115, 135, passwordField_Password.getPreferredSize().height);

        {
            // compute preferred size
            Dimension preferredSize = new Dimension();
            for(int i = 0; i < contentPane.getComponentCount(); i++)
            {
                Rectangle bounds = contentPane.getComponent(i).getBounds();
                preferredSize.width = Math.max(bounds.x + bounds.width, preferredSize.width);
                preferredSize.height = Math.max(bounds.y + bounds.height, preferredSize.height);
            }
            Insets insets = contentPane.getInsets();
            preferredSize.width += insets.right;
            preferredSize.height += insets.bottom;
            contentPane.setMinimumSize(preferredSize);
            contentPane.setPreferredSize(preferredSize);
        }
        pack();
        setLocationRelativeTo(getOwner());
        // JFormDesigner - End of component initialization  //GEN-END:initComponents

    }


}

Adminstrator_Frame.java:

/*
 * Created by JFormDesigner on Mon Nov 16 17:55:01 CST 2020
 * @author W-nut
 */

package application_Frame;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

import application_Frame_Administrator_ChildFrame.*;

@SuppressWarnings("unused")
public class Administrator_Frame extends JFrame
{

    public Administrator_Frame()
    {
        initComponents();
        Load_Administrator();
    }

    private void Load_Administrator()
    {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(400,300);
        this.setVisible(true);
    }


    private void menuItem_AddCustomer_ActionPerformed(ActionEvent e)
    {
        CustomerManage_Frame customerManage_frame=new CustomerManage_Frame(0);
        this.setVisible(false);
    }

    private void menuItem_QueryCustomer_ActionPerformed(ActionEvent e)
    {
        CustomerManage_Frame customerManage_frame=new CustomerManage_Frame(1);
        this.setVisible(false);
    }

    private void menuItem_DeleteCustomer_ActionPerformed(ActionEvent e)
    {
        CustomerManage_Frame customerManage_frame=new CustomerManage_Frame(2);
        this.setVisible(false);
    }

    private void menuItem_UpdateCustomer_ActionPerformed(ActionEvent e)
    {
        CustomerManage_Frame customerManage_frame=new CustomerManage_Frame(3);
        this.setVisible(false);
    }
    private void menuItem_QueryOrder_ActionPerformed(ActionEvent e)
    {
        OrderManage_Frame orderManage_frame=new OrderManage_Frame(0);
        this.setVisible(false);
    }
    private void menuItem_AddOrder_ActionPerformed(ActionEvent e)
    {
        OrderManage_Frame orderManage_frame=new OrderManage_Frame(1);
        orderManage_frame.checkCustomer();
        this.setVisible(false);
    }
    private void menuItem_AddInvoice_ActionPerformed(ActionEvent e)
    {
        InvoiceManage_Frame invoiceManage_frame=new InvoiceManage_Frame();
        invoiceManage_frame.checkCustomer();
        this.setVisible(false);
    }
    private void menuItem_SelectGoods_ActionPerformed(ActionEvent e) 
    {
       GoodsManage_Frame goodsManage_frame=new GoodsManage_Frame(0);
       goodsManage_frame.checkCustomer();
       this.setVisible(false);
    }

    private void menuItem_AddCustomer_MouseClicked(MouseEvent e)
    {
        // TODO add your code here
    }

    private void menuItem_QueryCustomer_MouseClicked(MouseEvent e)
    {
        // TODO add your code here
    }

    private void menuItem__DeleteCustomer_MouseClicked(MouseEvent e)
    {
        // TODO add your code here
    }

    private void menuItem_UpdateCustomer_MouseClicked(MouseEvent e)
    {
        // TODO add your code here
    }

    //Method function: initialize framework
    private void initComponents()
    {
        // JFormDesigner - Component initialization - DO NOT MODIFY  //GEN-BEGIN:initComponents
        // Generated using JFormDesigner Evaluation license - nut
        menuBar_1 = new JMenuBar();
        menu_CustomerManage = new JMenu();
        menuItem_AddCustomer = new JMenuItem();
        menuItem_QueryCustomer = new JMenuItem();
        menuItem_DeleteCustomer = new JMenuItem();
        menuItem_UpdateCustomer = new JMenuItem();
        menu_GoodsManage = new JMenu();
        menuItem_SelectGoods = new JMenuItem();
        menuItem_AddGoods = new JMenuItem();
        menuItem_DeleteGoods = new JMenuItem();
        menuItem_QueryGoods = new JMenuItem();
        menuItem_UpdateGoods = new JMenuItem();
        menu_OrderManage = new JMenu();
        menuItem_QueryOrder = new JMenuItem();
        menuItem_AddOrder = new JMenuItem();
        menu_InvoiceManage = new JMenu();
        menuItem_AddInvoice = new JMenuItem();
        menu_Own = new JMenu();
        menuItem_OwnInfo = new JMenuItem();

        //======== this ========
        setTitle("Nut Dynasty-Administrator");
        setIconImage(new ImageIcon("E:\\CodeFile\\DataBase-CustomerPurchaseManagementSystem\\Code\\src\\META-INF\\background.jpg").getImage());
        var contentPane = getContentPane();
        contentPane.setLayout(null);

        //======== menuBar_1 ========
        {

            //======== menu_CustomerManage ========
            {
                menu_CustomerManage.setText("\u5ba2\u6237\u7ba1\u7406");

                //---- menuItem_AddCustomer ----
                menuItem_AddCustomer.setText("\u65b0\u589e\u5ba2\u6237\u4fe1\u606f");
                menuItem_AddCustomer.addMouseListener(new MouseAdapter() {
                    @Override
                    public void mouseClicked(MouseEvent e) {
                        menuItem_AddCustomer_MouseClicked(e);
                    }
                });
                menuItem_AddCustomer.addActionListener(e -> menuItem_AddCustomer_ActionPerformed(e));
                menu_CustomerManage.add(menuItem_AddCustomer);

                //---- menuItem_QueryCustomer ----
                menuItem_QueryCustomer.setText("\u67e5\u8be2\u5ba2\u6237\u4fe1\u606f");
                menuItem_QueryCustomer.addMouseListener(new MouseAdapter() {
                    @Override
                    public void mouseClicked(MouseEvent e) {
                        menuItem_QueryCustomer_MouseClicked(e);
                    }
                });
                menuItem_QueryCustomer.addActionListener(e -> menuItem_QueryCustomer_ActionPerformed(e));
                menu_CustomerManage.add(menuItem_QueryCustomer);

                //---- menuItem_DeleteCustomer ----
                menuItem_DeleteCustomer.setText("\u5220\u9664\u5ba2\u6237\u4fe1\u606f");
                menuItem_DeleteCustomer.addMouseListener(new MouseAdapter() {
                    @Override
                    public void mouseClicked(MouseEvent e) {
                        menuItem__DeleteCustomer_MouseClicked(e);
                    }
                });
                menuItem_DeleteCustomer.addActionListener(e -> menuItem_DeleteCustomer_ActionPerformed(e));
                menu_CustomerManage.add(menuItem_DeleteCustomer);

                //---- menuItem_UpdateCustomer ----
                menuItem_UpdateCustomer.setText("\u4fee\u6539\u5ba2\u6237\u4fe1\u606f");
                menuItem_UpdateCustomer.addMouseListener(new MouseAdapter() {
                    @Override
                    public void mouseClicked(MouseEvent e) {
                        menuItem_UpdateCustomer_MouseClicked(e);
                    }
                });
                menuItem_UpdateCustomer.addActionListener(e -> menuItem_UpdateCustomer_ActionPerformed(e));
                menu_CustomerManage.add(menuItem_UpdateCustomer);
            }
            menuBar_1.add(menu_CustomerManage);

            //======== menu_GoodsManage ========
            {
                menu_GoodsManage.setText("\u5546\u54c1\u7ba1\u7406");

                //---- menuItem_SelectGoods ----
                menuItem_SelectGoods.setText("\u9009\u8d2d\u5546\u54c1");
                menuItem_SelectGoods.addActionListener(e -> menuItem_SelectGoods_ActionPerformed(e));
                menu_GoodsManage.add(menuItem_SelectGoods);

                //---- menuItem_AddGoods ----
                menuItem_AddGoods.setText("\u65b0\u589e\u5546\u54c1\u4fe1\u606f");
                menu_GoodsManage.add(menuItem_AddGoods);

                //---- menuItem_DeleteGoods ----
                menuItem_DeleteGoods.setText("\u5220\u9664\u5546\u54c1\u4fe1\u606f");
                menu_GoodsManage.add(menuItem_DeleteGoods);

                //---- menuItem_QueryGoods ----
                menuItem_QueryGoods.setText("\u67e5\u8be2\u5546\u54c1\u4fe1\u606f");
                menu_GoodsManage.add(menuItem_QueryGoods);

                //---- menuItem_UpdateGoods ----
                menuItem_UpdateGoods.setText("\u4fee\u6539\u5546\u54c1\u4fe1\u606f");
                menu_GoodsManage.add(menuItem_UpdateGoods);
            }
            menuBar_1.add(menu_GoodsManage);

            //======== menu_OrderManage ========
            {
                menu_OrderManage.setText("\u8ba2\u5355\u7ba1\u7406");

                //---- menuItem_QueryOrder ----
                menuItem_QueryOrder.setText("\u67e5\u8be2\u8ba2\u5355\u4fe1\u606f");
                menuItem_QueryOrder.addActionListener(e -> {
			menuItem_QueryOrder_ActionPerformed(e);
			menuItem_QueryOrder_ActionPerformed(e);
		});
                menu_OrderManage.add(menuItem_QueryOrder);

                //---- menuItem_AddOrder ----
                menuItem_AddOrder.setText("\u65b0\u589e\u8ba2\u5355\u4fe1\u606f");
                menu_OrderManage.add(menuItem_AddOrder);
            }
            menuBar_1.add(menu_OrderManage);

            //======== menu_InvoiceManage ========
            {
                menu_InvoiceManage.setText("\u53d1\u7968\u7ba1\u7406");

                //---- menuItem_AddInvoice ----
                menuItem_AddInvoice.setText("\u65b0\u589e\u53d1\u7968\u4fe1\u606f");
                menuItem_AddInvoice.addActionListener(e -> menuItem_AddInvoice_ActionPerformed(e));
                menu_InvoiceManage.add(menuItem_AddInvoice);
            }
            menuBar_1.add(menu_InvoiceManage);

            //======== menu_Own ========
            {
                menu_Own.setText("\u4e2a\u4eba\u4e2d\u5fc3");

                //---- menuItem_OwnInfo ----
                menuItem_OwnInfo.setText("\u4e2a\u4eba\u4fe1\u606f");
                menu_Own.add(menuItem_OwnInfo);
            }
            menuBar_1.add(menu_Own);
        }
        setJMenuBar(menuBar_1);

        {
            // compute preferred size
            Dimension preferredSize = new Dimension();
            for(int i = 0; i < contentPane.getComponentCount(); i++) {
                Rectangle bounds = contentPane.getComponent(i).getBounds();
                preferredSize.width = Math.max(bounds.x + bounds.width, preferredSize.width);
                preferredSize.height = Math.max(bounds.y + bounds.height, preferredSize.height);
            }
            Insets insets = contentPane.getInsets();
            preferredSize.width += insets.right;
            preferredSize.height += insets.bottom;
            contentPane.setMinimumSize(preferredSize);
            contentPane.setPreferredSize(preferredSize);
        }
        pack();
        setLocationRelativeTo(getOwner());
        // JFormDesigner - End of component initialization  //GEN-END:initComponents
    }


    // JFormDesigner - Variables declaration - DO NOT MODIFY  //GEN-BEGIN:variables
    // Generated using JFormDesigner Evaluation license - nut
    private JMenuBar menuBar_1;
    private JMenu menu_CustomerManage;
    private JMenuItem menuItem_AddCustomer;
    private JMenuItem menuItem_QueryCustomer;
    private JMenuItem menuItem_DeleteCustomer;
    private JMenuItem menuItem_UpdateCustomer;
    private JMenu menu_GoodsManage;
    private JMenuItem menuItem_SelectGoods;
    private JMenuItem menuItem_AddGoods;
    private JMenuItem menuItem_DeleteGoods;
    private JMenuItem menuItem_QueryGoods;
    private JMenuItem menuItem_UpdateGoods;
    private JMenu menu_OrderManage;
    private JMenuItem menuItem_QueryOrder;
    private JMenuItem menuItem_AddOrder;
    private JMenu menu_InvoiceManage;
    private JMenuItem menuItem_AddInvoice;
    private JMenu menu_Own;
    private JMenuItem menuItem_OwnInfo;
    // JFormDesigner - End of variables declaration  //GEN-END:variables
}

Tags: Database Java JDBC GUI

Posted by Jackanape on Fri, 03 Jun 2022 21:36:37 +0530