訂餐系統(餓了某)java程序實現

實驗項目名稱公司訂餐系統

使用了數據庫+JDBC+面向對象知識,主要分爲八個功能頁面,分別爲註冊、登陸、訂餐、查看餐袋、簽收訂單、刪除訂單、點贊、退出系統
實現這八個功能模塊共創建了八個類:
1.Test.java 程序的主類
2.Login.java 登陸
3.Register.java 註冊
4.Home.java 菜單類或窗口類
5.Dinner.java 功能實現類
6.ClearScreen.java 清屏類
7.Menu.java 定義屬性和方法
8.JDBCUtils.java JDBC工具類
在這裏插入圖片描述
運行後的信息:
在這裏插入圖片描述
數據庫建table表:

MySql創建表的操作
//創建訂餐信息表
CREATE TABLE menu(

Id INT PRIMARY KEY AUTO_INCREMENT,

customer VARCHAR(32),
message VARCHAR(32),
number INT,
TIME INT,
address VARCHAR(32),
amount DOUBLE(4,1),
state VARCHAR(32)
);

//創建菜品信息表
CREATE TABLE menumassage(

Id INT PRIMARY KEY AUTO_INCREMENT,

message VARCHAR(32),
price INT,
praise INT
);


//創建點贊排行榜表
CREATE TABLE top(
dish VARCHAR(32),
price INT,
praise INT,
dept_id INT
);
//連級操作刪除修改
ALTER TABLE top ADD UNIQUE (dish);
ALTER TABLE top ADD  CONSTRAINT top1 FOREIGN KEY (dept_id)  REFERENCES menumassage(Id);

Top表的更新操作
TRUNCATE TABLE top;

INSERT INTO `top`(`dish`,`price`,`praise`,`dept_id`)VALUES('紅燒帶魚','38','0','1');
INSERT INTO `top`(`dish`,`price`,`praise`,`dept_id`)VALUES('魚香肉絲','18','0','2');
 INSERT INTO `top`(`dish`,`price`,`praise`,`dept_id`)VALUES('時令鮮蔬','10','0','3');
SELECT *FROM top;


1.Test.java 程序的主類

package cn.itcast.datasource.Restaurant;

import cn.itcast.datasource.JDBCUtils.JDBCUtils;
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        /*獲取連接池方法*/
        JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
        Dinner dinner = new Dinner();
        Login l = new Login();
        Register r  = new Register();
        Boolean condition=false;//定義登陸初始狀態
         Home home = new Home();
        Scanner sc = new Scanner(System.in);
         while(condition==false){
             home.load();
             int num = sc.nextInt();
             if (num == 1) {
                 r.regist();//註冊
             } else if (num == 2) {
                 condition = l.login();//登錄
             } else if (num == 0) {
                 return ;
             }
        }
         while (condition==true){
             dinner.function();
         }
    }
}

2.Login.java 登陸

import cn.itcast.datasource.JDBCUtils.JDBCUtils;
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class Login {
    /*獲取連接池方法*/
    JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
    Scanner sc = new Scanner(System.in);
    String name = null;
    int id ;
    /*
     * 登錄檢測方法,參數無,return condition
     * */
    public boolean login() {

        for ( int count=3;count>0;count--) {
            System.out.println();
            System.out.println();
            System.out.println("~~~~~~~~~~~~~~~~歡迎使用餓了麼~~~~~~~~~~~~~~~~");
            System.out.println("請輸入賬號:");
            int  cardId = sc.nextInt();
            System.out.println("請輸入密碼:");
            int  passWord = sc.nextInt();

            //定義sql語句返回整個數據庫中所有數據對象的list集合
            String sql = "SELECT *FROM USER;";
            List<Map<String, Object>> list = template.queryForList(sql);
            for (Map<String, Object> user : list) {//鍵盤輸入和數據庫中用戶數據的比較
                if (cardId == (int) user.get("cardId") && passWord == (int) user.get("password")) {
                    name = (String) user.get("name");
                    id =(int) user.get("id");
                    System.out.println("歡迎第"+id+"位騎手"+name+"!");
                    System.out.println("登陸成功!");
                    return true;
                }
            }
            if(count==1){
                System.out.println("輸入錯誤,登陸失敗!");
                System.exit(0);
            }else{
                System.out.println("請重新驗證身份信息,驗證次數還有:" +(count-1)+"次!");
            }
        }
        return false;
    }

}

3.Register.java 註冊

import cn.itcast.datasource.JDBCUtils.JDBCUtils;
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.Scanner;

public class Register {
    /*獲取連接池方法*/
    JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
    Scanner sc = new Scanner(System.in);
    public void regist (){

        System.out.println("請輸入賬號:");
        int  cardId = sc.nextInt();
        System.out.println("請輸入密碼:");
        int  passWord = sc.nextInt();
        System.out.println("請輸入你的真實姓名:");
        String name = sc.next();
        //數據庫user表中插入數據
        String sql = "insert into USER(Id,cardId,PASSWORD,NAME) values(?,?,?,?)";
        template.update(sql,null,cardId,passWord,name);
    }
}

4.Home.java 菜單類或窗口類

public class Home {
    ClearScreen cs = new ClearScreen();
    public void load(){

        cs.clear();
        System.out.println("            歡迎使用餓了麼            ");
        System.out.println("                                     ");
        System.out.println("                1.註冊               ");
        System.out.println("                                     ");
        System.out.println("                2.登錄               ");
        System.out.println("                                     ");
        System.out.println("                0.退出               ");
        cs.clear();
        System.out.println("………測試用賬號:18480****  密碼:123456………");
        System.out.println("請輸入序號:");
    }

    public void functionview(){
        cs.clear();
        System.out.println("1、我要訂餐");
        System.out.println("2、查看餐袋");
        System.out.println("3、簽收訂單");
        System.out.println("4、刪除訂單");
        System.out.println("5、我要點贊");
        System.out.println("6、退出系統");
        cs.clear();
        System.out.print("請選擇:");
    }
    public void menu(){
        System.out.println("序號" + "\t" + "菜名"+"\t"+"單價"+"\t");
        System.out.println("1" + "\t" + "紅燒帶魚"+"\t"+"38.0元"+"\t");
        System.out.println("2" + "\t" + "魚香肉絲"+"\t"+"18.0元"+"\t");
        System.out.println("3" + "\t" + "時令鮮蔬"+"\t"+"10.0元"+"\t");
    }
}

5.Dinner.java 功能實現類


import cn.itcast.datasource.JDBCUtils.JDBCUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class Dinner {
    static int s;
    int j=0;
    /*獲取連接池方法*/
    JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
    Scanner sc = new Scanner(System.in);
    Home home = new Home();
    int num ;
    String state = "已預定";
    int sum = 1;
    int customer=3;
    Long tot;

    //查詢表中總記錄數
    public Long total(String str){
        String sql = "select count(?)from menu";
        Long tot = template.queryForObject(sql,Long.class,str);
        return tot;
    }
    //獲取menumassage表中信息商品單價和商品名稱
    public Map<String, Object> sqlSearch(int select){
        String sqlSearch = "select * from menumassage where Id = ? ";
        List<Map<String, Object>> list = template.queryForList(sqlSearch,select);
        Map<String, Object> map1 = list.get(0);
        return map1;
    }
    //獲取menu表中信息
    public Map<String, Object> sqlSearch1(int select){
        String sqlSearch = "select * from menu where Id = ? ";
        List<Map<String, Object>> list = template.queryForList(sqlSearch,select);
        Map<String, Object> map1 = list.get(0);
        return map1;
    }
    //獲取top表中信息
    public Map<String, Object> sqlSearch2(int select){
        String sqlSearch = "select * from top where dept_id = ? ";
        List<Map<String, Object>> list = template.queryForList(sqlSearch,select);
        Map<String, Object> map1 = list.get(0);
        return map1;
    }
    //更新表中的數據
    public  void replaceS(String str,int id){
        String sql1 = "update menu set message = ? where Id = ?";
        template.update(sql1, str, id);
    }
    public void  menu() {
        System.out.println("******************我要訂餐********************");
        for (j=s; j <=customer; j++) {
            ++s;
            if (s<= customer) {  //找到第一個空位置,可以添加訂單信息
        // 顯示供選擇的菜品信息及價格
                home.menu();
        //輸入所選餐品/份數
                //添加一條記錄,爲每一個訂餐用戶增加“已預定”屬性
                String sql = "insert into menu(state )values (?)";
                template.update(sql, "已預定");
                System.out.print("請選擇您要點的菜品編號:");
                int select = sc.nextInt();
                //sum = ++i;
                sum=s;
                Map<String, Object> map=sqlSearch(select);
                String  message = (String) map.get("message");
                int price = (int) map.get("price");
                //修改一條記錄update user set balance = ? where cardId = ?
                replaceS(message,sum);
                System.out.print("請選擇您需要的份數:");
                int number = sc.nextInt();
                String sql2 = "update menu set number = ? where Id = ?";
                template.update(sql2, number, sum);
        //計算總的餐費(實際價格+配送費)
                double Price = price * number;
                //餐費滿50元,免送餐費
                double fee = (Price >= 50) ? 0 : 5;
                double sumPrice = Price + fee;
                String sql3 = "update menu set amount = ? where Id = ?";
                template.update(sql3, sumPrice, sum);
                System.out.print("請輸入訂餐人姓名:");
                String name = sc.next();
                String sql4 = "update menu set customer = ? where Id = ?";
                template.update(sql4, name, sum);
                System.out.print("請輸入送餐時間(送餐時間是10點至20點間整點送餐):");
                int time = sc.nextInt();
        // 設置工作時間送餐
                while (time < 10 || time > 20) {
                    System.out.print("您的輸入有誤,請輸入10~20間的整數!");
                    time = sc.nextInt();
                }
                String sql5 = "update menu set time = ? where Id = ?";
                template.update(sql5, time, sum);
                System.out.print("請輸入送餐地址:");
                String address = sc.next();
                String sql6 = "update menu set address = ? where Id = ?";
                template.update(sql6,address,sum);
                //打印輸出部分
                System.out.println("訂餐成功!");
                System.out.println("您訂的是:" + message);
                System.out.println("訂了" + number + "份");
                System.out.println("訂餐人:" + name);
                System.out.println("送餐時間:" + time + "點");
                System.out.println("餐費:" + Price + "元,送餐費" + fee + "元");
                System.out.println("總金額:" + (sumPrice) + "元。");
                break;
            }else {
                System.out.println("對不起,您的餐袋已滿!");
                break;
            }
        }
    }
    public void  viewOrder(){
        System.out.println("****************查看實時訂單******************");
        tot=total("Id");
        if(tot==0){
            System.out.println("對不起,還未建立訂單,請耐心等待!!!");
            return;
        }
        String sql1 = "select * from menu";
        List<Menu> list = template.query(sql1,new BeanPropertyRowMapper<Menu>(Menu.class));
        for(Menu menu:list){
            System.out.println(menu);
        }
    }
    public void  signOrder() {//簽收訂單
        System.out.println("******************簽收定單********************");
        System.out.print("請選擇要簽收的訂單序號:");
        int sign = sc.nextInt();
        tot=total("Id");
        if(tot==0){
            System.out.println("對不起,還未建立訂單,請耐心等待!!!");
            return;
        }
        if (sign > 0 && sign <= customer) {
            //獲取訂單的簽收狀態
            Map<String, Object> map=sqlSearch1(sign);
            String state = (String) map.get("state");
            String str = "已簽收";
            if (!state.equals(str) ) {
                //修改簽收狀態爲已簽收
                String sql1 = "update menu set state = ? where Id = ?";
                template.update(sql1, "已簽收", sign);
                System.out.println("訂單簽收成功!");
            } else {
                System.out.println("您選擇的訂單已完成簽收,不能再次簽收!");
            }
        }
        //未找到的訂單序號時不能簽收
        if (sign > customer) {
            System.out.println("對不起,此訂單不存在!");
        }
    }
    public void deleteOrder(){//刪除定單
        System.out.println("******************刪除訂單********************");
        System.out.print("請選擇要刪除的訂單序號:");
        int delete = sc.nextInt();
        tot=total("Id");
        if(tot==0){
            System.out.println("對不起,還未建立訂單,請耐心等待!!!");
            return;
        }
        if (delete > 0 && delete <= customer) {
            //獲取訂單的簽收狀態
            Map<String, Object> map=sqlSearch1(delete);
            String state = (String) map.get("state");
            System.out.println("你看到的狀態:"+state);
            String str1 = "已簽收";
            if (state.equals(str1)==true) {
                String sql9 = "delete from menu where Id = ?";
                template.update(sql9,delete);
                System.out.println("訂單刪除成功!");
            } else {
                System.out.println("您選擇的訂單未完成簽收,不能完成刪除!");
            }
        }
        //未找到的訂單序號時不能簽收
        if (delete > customer) {
            System.out.println("對不起,此訂單不存在!");
        }
    }
    public  void  praise(){
        System.out.println("******************我要點贊********************");
        home.menu();
        System.out.println("請選擇您要點讚的菜品序號:");
        //查詢menumassage總記錄數
        String sql1= "select count(Id) from menumassage";
        Long total = template.queryForObject(sql1,Long.class);
        int select=sc.nextInt();
        //判斷輸入是否合理
        if(select>0&&select<=total){
            System.out.println("輸入正確!");
        }else {
            System.out.println("輸入錯誤,請按餐品編號輸入😄");
            //輸入錯誤,返回功能選擇頁面
            return;
        }
        //menumassage表與top表的餐品、價格同步
        Map<String, Object> map=sqlSearch(select);
        String  dish = (String) map.get("message");
        String sql2 = "update top set dish = ? where dept_id = ?";
        template.update(sql2,dish,select);
        int price = (int) map.get("price");
        String sql3 = "update top set praise = ? where dept_id = ?";
        template.update(sql3,price,select);

        int praise = (int) map.get("praise");
        praise++;
        System.out.println("點贊量:"+praise);
        //修改top表中的點贊量
        String sql4 = "update top set praise = ? where dept_id = ?";
        template.update(sql4,praise,select);
        System.out.println("點贊成功👍👍👍");
        //把top表中的數據更新到menumassage中
        Map<String, Object> map1 =sqlSearch2(select);
        int p1 = (int) map1.get("praise");
        //修改menumassage表中的點贊量
        String sql5 = "update menumassage set praise = ? where Id = ?";
        template.update(sql5,p1,select);

       /* -- 根據數據庫中一個字段中數據 把整個表 從大到小排列
        SELECT * FROM top ORDER BY praise DESC;*/
        String sql6 ="SELECT * FROM top ORDER BY praise DESC";
        List<Map<String,Object>> list = template.queryForList(sql6);
        for (Map<String,Object>stringObjectMap:list){
            System.out.println(stringObjectMap);
        }
    }

            public void function () {
                Scanner sc = new Scanner(System.in);
                do {
                    home.functionview();
                    int choose = sc.nextInt();
                    switch (choose) {
                        case 1:
                            menu();//我要訂餐
                            break;
                        case 2:
                             viewOrder();//查看餐袋
                            break;
                        case 3:
                            signOrder();//簽收訂單
                            break;
                        case 4:
                             deleteOrder();//刪除訂單
                            break;
                        case 5:
                            praise();//我要點贊
                            break;
                        case 6:{
                            //一旦退出系統自動清空所有的訂單信息
                            String sql = "TRUNCATE TABLE menu";
                            template.update(sql);
                            System.out.println("歡迎下次使用😀😀😀");
                            System.exit(0);//退出
                        }

                    }
                    //用戶返回
                    if (choose < 1 || choose > 5) {
                        break;
                    } else {
                        System.out.print("輸入0返回:");
                        num = sc.nextInt();
                    }
                } while (num == 0);
            }
        }

6.ClearScreen.java 清屏類

public class ClearScreen {
    public void clear(){
        System.out.println("**********************************************");
    }
}

7.Menu.java 定義屬性和方法

package cn.itcast.datasource.Restaurant;

public class Menu {
    private Integer id;
    private String customer;
    private String message;
    private Integer number;
    private Integer time;
    private String address;
    private Double amount;

    @Override
    public String toString() {
        return "Menu{" +
                "id=" + id +
                ", customer='" + customer + '\'' +
                ", message='" + message + '\'' +
                ", number=" + number +
                ", time=" + time +
                ", address='" + address + '\'' +
                ", amount=" + amount +
                ", state='" + state + '\'' +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getCustomer() {
        return customer;
    }

    public void setCustomer(String customer) {
        this.customer = customer;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Integer getNumber() {
        return number;
    }

    public void setNumber(Integer number) {
        this.number = number;
    }

    public Integer getTime() {
        return time;
    }

    public void setTime(Integer time) {
        this.time = time;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public Double getAmount() {
        return amount;
    }

    public void setAmount(Double amount) {
        this.amount = amount;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    private String state;
}

8.JDBCUtils.java JDBC工具類

package cn.itcast.datasource.Restaurant;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/*
* Druid的工具類
* */
public class JDBCUtils {
    //1.定義成員變量
    private static DataSource ds;
    static {
        //1.加載配置文件
        Properties pro = new Properties();
        try {
            //1.加載配置文件
            pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
            //2.獲取DataSource
            ds = DruidDataSourceFactory.createDataSource(pro);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /*獲取連接*/
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }
    /*釋放資源*/
    public static void close (Statement stmt,Connection conn){
      /*  if(stmt != null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }*/
      close(null,stmt,conn);
    }
    public static void close (ResultSet rs,Statement stmt, Connection conn){
        if(rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(stmt != null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    /*獲取連接池方法*/
    public static DataSource getDataSource(){
        return ds;
    }
}

如需源碼請訪問百度網盤鏈接:

https://pan.baidu.com/s/1c42PvpnzGV2U0DG561QrHw
提取碼:mwat

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章