源码如下
第一次课设
package com.BigDate1421_Dduo.JavaBean;
import com.BigDate1421_Dduo.Takeout.Choose5_Order;
import java.util.stream.Collectors;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
//这个JavaBean类是食品
public class Food {
private String name;//名称
private int price; //价格
private String score;//评分
private String foodSpace;//产地
public Food() {
}
public Food(String name, int price, String score, String foodSpace) {
this.name = name;
this.price = price;
this.score = score;
this.foodSpace = foodSpace;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return price
*/
public int getPrice() {
return price;
}
/**
* 设置
* @param price
*/
public void setPrice(int price) {
this.price = price;
}
/**
* 获取
* @return score
*/
public String getScore() {
return score;
}
/**
* 设置
* @param score
*/
public void setScore(String score) {
this.score = score;
}
/**
* 获取
* @return foodSpace
*/
public String getFoodSpace() {
return foodSpace;
}
/**
* 设置
* @param foodSpace
*/
public void setFoodSpace(String foodSpace) {
this.foodSpace = foodSpace;
}
public String toString() {
return "食品名称 : " + name + ", 食品价格 : " + price +"元"+", 食品评分 : " + score + "分"+", 食品产地 : " + foodSpace ;
}
/*------------------------------------------------------*/
public static ArrayList<Food>foods=new ArrayList<>();
//创建单列集合存储食品信息
public static void addExampleFood(){
//添加食品样例
foods.add(new Food("炸鸡腿",10,"100","肯豆基"));
foods.add(new Food("汉堡",15,"90","华来市"));
foods.add(new Food("可乐",3,"85","北华超市"));
foods.add(new Food("雪碧",4,"85","北华超市"));
}
public static void traversal(){
//用迭代器,Lambda表达式遍历单列集合
Iterator<Food> iterator = foods.iterator();
iterator.forEachRemaining(element -> {
System.out.println(element);
});
}
public static List<Food> seek(String keyword){
//用stream流和终结方法collect过滤元素
List<Food>list=
foods
.stream()
.filter(s -> s.name.contains(keyword))
.collect(Collectors.toList());
//System.out.println(list);这里一开始出现了问题所以遍历了一下·
return list;
}
public static boolean check(String input){
//检查是否存在元素
//Lambda表达式会忽略结果,所以我选择用迭代器遍历
Iterator<Food> iterator = foods.iterator();
while (iterator.hasNext())
if (iterator.next().name.equals(input))
return true;
return false;
}
public static void add(Food food){
//添加到集合里面去
foods.add(food);
//添加到点餐集合里去
Choose5_Order.add(food.name,food.price);
}
public static void delete(String food){
//用迭代器遍历删除下一个元素
Iterator<Food> iterator = foods.iterator();
while (iterator.hasNext()) {
String item = iterator.next().name;
if (item.equals(food)) {
iterator.remove();
// 删除元素
}
}
//删除点餐集合里的数据
Choose5_Order.delete(food);
}
}
public class User {
private String userId;
private String userPassword;
public User() {
}
public User(String userId, String userPassword) {
this.userId = userId;
this.userPassword = userPassword;
}
/**
* 获取
* @return userId
*/
public String getUserId() {
return userId;
}
/**
* 设置
* @param userId
*/
public void setUserId(String userId) {
this.userId = userId;
}
/**
* 获取
* @return userPassword
*/
public String getUserPassword() {
return userPassword;
}
/**
* 设置
* @param userPassword
*/
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public String toString() {
return "User{userId = " + userId + ", userPassword = " + userPassword + "}";
}
}
import java.util.ArrayList;
import java.util.Scanner;
//外卖管理系统
public class Main {
//示例用户名 : Duo
//示例密码 :123
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//创建集合放用户信息并放入范例用户
ArrayList<User> users = new ArrayList<>();
users.add(new User("Duo", "123"));
//进入主页面
loop:
while (true) {
System.out.println("----------♡欢迎使用外卖系统♡----------");
System.out.println("1.登录");
System.out.println("2.注册");
System.out.println("3.忘记密码");
System.out.println("4.退出");
System.out.println("请输入您的选择");
String choose = sc.next();
switch (choose) {
//进入登录界面
case "1" -> {
System.out.println("---登录---");
log(users);
}
//进入注册界面
case "2" -> {
System.out.println("---注册---");
register(users);
}
case "3" -> {
System.out.println("---忘记密码---");
forget();
}
//停止虚拟机运行 即退出系统
case "4" -> {
System.out.println("♡谢谢使用♡");
System.exit(0);
}
default -> System.out.println("没有这个选项,请重新输入");
}
}
}
//登录(已完成)
public static void log(ArrayList<User> users) {
Scanner sc = new Scanner(System.in);
String judge;
while (true) {
//输入用户名
System.out.println("请输入用户名");
String UserId = sc.next();
//输入密码
System.out.println("请输入密码");
String UserPassword = sc.next();
//校验
for (User user : users) {
if (user.getUserId().equals(UserId) && user.getUserPassword().equals(UserPassword)) {
System.out.println("登录成功");
TakeawayManagementSystem();
}
//用户名输入正确,密码输入错误
if (user.getUserId().equals(UserId) && !user.getUserPassword().equals(UserPassword)) {
System.out.println("用户名输入正确,密码输入错误");
loop:
while (true) {
//页面
System.out.println("1.重试");
System.out.println("2.退出系统");
System.out.println("3.返回开始界面");
System.out.println("请输入您的选择");
judge = sc.next();
switch (judge) {
case "1":
//跳出判断if
break loop;
case "2":
//结束程序
{
System.out.println("♡谢谢使用♡");
System.exit(0);
}
case "3":
//退出方法
return;
default: {
//重新输入
System.out.println("没有这个选项,请重新输入");
}
}
}
}
//用户名输入错误且密码输入错误
if (!user.getUserId().equals(UserId) && !user.getUserPassword().equals(UserPassword)) {
System.out.println("用户名输入错误且密码输入错误");
loop:
while (true) {
//页面
System.out.println("1.重试");
System.out.println("2.退出系统");
System.out.println("3.返回开始界面");
System.out.println("请输入您的选择");
judge = sc.next();
switch (judge) {
case "1":
//跳出判断if
break loop;
case "2":
//结束程序
{
System.out.println("♡谢谢使用♡");
System.exit(0);
}
case "3":
//退出方法
return;
default: {
//重新输入
System.out.println("没有这个选项,请重新输入");
}
}
}
}
//用户名或密码输入错误
if ((user.getUserId().equals(UserId) && !user.getUserPassword().equals(UserPassword)) || !(user.getUserId().equals(UserId) && user.getUserPassword().equals(UserPassword))) {
System.out.println("用户名输入错误或密码输入错误");
loop:
while (true) {
System.out.println("1.重试");
System.out.println("2.退出系统");
System.out.println("3.返回开始界面");
System.out.println("请输入您的选择");
judge = sc.next();
switch (judge) {
case "1":
//跳出判断if
break loop;
case "2":
//结束程序
{
System.out.println("♡谢谢使用♡");
System.exit(0);
}
case "3":
//退出方法
return;
default: {
//重新输入
System.out.println("没有这个选项,请重新输入");
}
}
}
}
}
}
}
//注册(已完成)
public static void register(ArrayList<User> users) {
Scanner sc = new Scanner(System.in);
//注册页面
while (true) {
String newId = new String();
String newPassword1 = new String();
String newPassword2 = new String();
String judge = new String();
//注册用户名
while (true) {
System.out.println("请输入新用户的名称");
System.out.println("注意!!!用户名必须是3-15位字母和数字的混合组合且字母数字都必须大于3位");
//输入用户名
newId = sc.next();
//检查用户名是否符合规范
if (checkUserName(newId)) break;
else {
loop:
while (true) {
System.out.println("用户名不符合规范");
System.out.println("1.重新输入用户名");
System.out.println("2.返回开始界面");
System.out.println("请输入您的选择");
judge = sc.next();
switch (judge) {
//重新输入用户名
case "1":
break loop;
//返回开始界面
case "2":
return;
default: {
System.out.println("!没有这个选项请重新输入!");
}
}
}
}
}
//注册密码
while (true) {
System.out.println("请输入新用户的密码");
System.out.println("注意输入密码必须是3-8位任意组合且两次输入密码要相同");
//输入密码
newPassword1 = sc.next();
System.out.println("请再次输入密码");
//再次输入密码
newPassword2 = sc.next();
//检查密码是否符合规范
if (checkUserPassword(newPassword1, newPassword2)) break;
//如不规范再次进入循环
else {
while (true) {
System.out.println("密码不符合规范,请重新输入");
System.out.println("1.重新输入密码");
System.out.println("2.返回开始界面");
System.out.println("请输入您的选择");
judge = sc.next();
switch (judge) {
//重新输入密码
case "1":
continue;
case "2":
//返回开始界面
return;
default:
//重新选择
System.out.println("!没有这个选项请重新输入!");
}
}
}
}
//注册成功
System.out.println("恭喜注册成功");
//将用户名和密码存入User集合中
users.add(new User(newId, newPassword1));
//返回开始界面
return;
}
}
//忘记密码(已完成)
public static void forget() {
Scanner sc = new Scanner(System.in);
while (true) {
//界面
System.out.println("怎么忘记了密码了?");
System.out.println("快去注册一个新的吧!");
System.out.println("1.返回开始界面");
System.out.println("2.退出程序");
System.out.println("请输入您的选择");
String judge = sc.next();
switch (judge) {
case "1": {
//退出方法
return;
}
case "2": {
//退出程序
System.out.println("♡谢谢使用♡");
System.exit(0);
}
default: {
//重新输入
System.out.println("!没有这个选项,请重新输入!");
}
}
}
}
//注册时用户名规范性检查(已完成)
public static boolean checkUserName(String i) {
//1.检查用户名长度是否在3-15位
int length = i.length();
if (length < 3 || length > 15) return false;
//2.检查用户名是否为大写字母,小写字母,数字
for (int i1 = 0; i1 < i.length(); i1++) {
char type1 = i.charAt(i1);
if (!((type1 >= 'a' && type1 <= 'z') || (type1 >= 'A' && type1 <= 'Z') || (type1 >= '0' && type1 <= '9')))
return false;
}
//3.检查用户名是否为数字和字母混合的形式 并且 数字和字母都必须大于三位
int letter = 0;
int number = 0;
for (int i1 = 0; i1 < i.length(); i1++) {
char type2 = i.charAt(i1);
if ((type2 >= 'A' && type2 <= 'Z') || (type2 >= 'a' && type2 <= 'z')) letter++;
if (type2 >= '0' && type2 <= '9') number++;
}
if (!(number >= 3 && letter >= 3)) return false;
//三项检查全部通过即用户名符合规范
return true;
}
//注册时密码规范性检查(已完成)
public static boolean checkUserPassword(String x, String y) {
//1.检查两次输入密码是否相等
if (!(x.equals(y))) return false;
//2.检查密码是否为3-8位
int length = x.length();
if (!(length >= 3 && length <= 8)) return false;
//两项检查通过,即密码符合规范
return true;
}
//外卖信息管理系统(已完成)
public static void TakeawayManagementSystem() {
Scanner sc = new Scanner(System.in);
//创建集合放外卖并放入示例外卖
ArrayList<Food> foods = new ArrayList<>();
foods.add(new Food(1, "炸鸡腿", 10, "炸鸡店", 10));
while (true) {
while (true) {
//主页面
System.out.println("----------♡欢迎使用外卖管理系统♡----------");
System.out.println("1.查看所有外卖信息");
System.out.println("2.添加外卖信息");
System.out.println("3.删除外卖信息");
System.out.println("4.查找外卖信息");
System.out.println("5.制作者信息");
System.out.println("6.退出系统");
System.out.println("请输入您的选择");
String judge = sc.next();
switch (judge) {
case "1":
//遍历
FoodCheck(foods);
continue;
case "2":
//添加信息
FoodAdd(foods);
continue;
case "3":
//删除信息
FoodRemove(foods);
continue;
case "4":
//查找信息
FoodFind(foods);
continue;
case "5":
//打印制作着信息
message();
continue;
case "6":
//退出系统
System.out.println("♡谢谢使用♡");
System.exit(0);
//重新输入
default: {
System.out.println("!没有这个选项,请重新输入!");
}
}
}
}
}
//查看所有外卖的信息(已完成)
public static void FoodCheck(ArrayList<Food> foods) {
System.out.println("---------------------------------------------------------------------");
//眉头
System.out.println("商品ID\t\t\t商品名称\t\t\t商品价格\t\t\t商家\t\t\t商家库存");
Scanner sc = new Scanner(System.in);
//遍历输出打印
for (int i = 0; i < foods.size(); i++) {
Food x = foods.get(i);
System.out.println(x.getFoodId() + "\t\t\t\t" + x.getFoodName() + "\t\t\t" + x.getFoodPrice() + "元" + "\t\t\t" + x.getFoodSpace() + "\t\t" + x.getFoodNumber() + "件");
}
System.out.println("---------------------------------------------------------------------");
while (true) {
//结束
System.out.println("1.返回外卖系统界面");
System.out.println("2.结束运行");
System.out.println("请输入你的选择");
String judge = sc.next();
switch (judge) {
case "1": {
return;
}
case "2": {
System.exit(0);
}
default: {
System.out.println("!没有这个选项,请重新输入!");
}
}
}
}
//添加外卖信息(已完成)
public static void FoodAdd(ArrayList<Food> foods) {
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("当前集合中一共有" + foods.size() + "项数据");
System.out.println("请输入新的外卖ID");
int newId = sc.nextInt();
//添加判断条件
int tempJudge = 0;
//遍历ID,防止输入的ID重复
for (int i = 0; i < foods.size(); i++) {
int haveFood = foods.get(i).getFoodId();
if (haveFood == newId) {
System.out.println("当前ID重复,请重新输入");
tempJudge = 1;
break;
}
}
//ID重复,重新输入ID
if (tempJudge == 1) continue;
//ID未重复,继续输入其他信息
System.out.println("请输入外卖名称");
String newName = sc.next();
System.out.println("请输入外卖价格");
int newPrice = sc.nextInt();
System.out.println("请输入外卖商家");
String newSpace = sc.next();
System.out.println("请输入外卖库存");
int newNumber = sc.nextInt();
//将新的外卖信息添加到集合里去
Food newFood = new Food(newId, newName, newPrice, newSpace, newNumber);
foods.add(newFood);
System.out.println("添加成功!!!");
loop:
while (true) {
//界面
System.out.println("1.继续添加外卖信息");
System.out.println("2.返回外卖系统界面");
System.out.println("3.退出系统");
System.out.println("请输入你的选择");
String judge = sc.next();
switch (judge) {
case "1":
//继续添加信息
break loop;
case "2":
//退出方法
return;
case "3": {
//结束运行
System.exit(0);
}
default: {
System.out.println("!没有这个选项,请重新输入!");
}
}
}
}
}
//删除外卖信息(已完成)
public static void FoodRemove(ArrayList<Food> foods) {
Scanner sc = new Scanner(System.in);
//通过计数判断删除是否成功
int judge1 = 0;
while (true) {
System.out.println("请输入要删除的外卖的ID");
//首先进行判断,如果外卖集合内没有任何元素,则直接退出
if (foods.size() == 0) {
System.out.println("对不起,集合里无任何信息,已返回主页面");
return;
}
//输入要查找的Id
int removeId = sc.nextInt();
for (int i = 0; i < foods.size(); i++) {
//遍历集合中每个元素
Food x = foods.get(i);
if (x.getFoodId() == removeId) {
judge1++;
//根据找到的集合索引删除
foods.remove(i);
System.out.println("已成功删除ID为" + removeId + "的外卖");
loop:
while (true) {
//删除成功
System.out.println("1.继续删除");
System.out.println("2.返回外卖系统界面");
String judge = sc.next();
switch (judge) {
case "1": {
//再次删除
break loop;
}
case "2": {
//退出方法
return;
}
default: {
//重新输入
System.out.println("!没有这个选项,请重新输入!");
}
}
}
}
}
if (judge1 == 0) {
//删除失败,原因是遍历后为找到该ID
System.out.println("对不起,未找到当前ID");
loop2:
while (true) {
System.out.println("1.重新删除");
System.out.println("2.返回外卖系统界面");
String judge = sc.next();
switch (judge) {
case "1": {
//重新删除
break loop2;
}
case "2": {
//退出方法
return;
}
default: {
//重新输入
System.out.println("!没有当前选项,请重新输入!");
}
}
}
}
}
}
//查找外卖信息(已完成)
public static void FoodFind(ArrayList<Food> foods) {
Scanner sc = new Scanner(System.in);
while (true) {
//主页面
System.out.println("1.根据外卖名称查找");
System.out.println("2.返回外卖系统界面");
System.out.println("3.退出系统");
System.out.println("请输入您的选择");
String judge = sc.next();
loop:
while (true) {
switch (judge) {
case "1": {
System.out.println("请输入外卖名称");
//输入需要查找的外卖名称
String findName = sc.next();
for (int i = 0; i < foods.size(); i++) {
//遍历集合中的每一个元素
Food x = foods.get(i);
if (x.getFoodName().equals(findName)) {
//查找成功,打印输出
System.out.println("查找成功");
System.out.println("商品ID\t\t\t商品名称\t\t\t商品价格\t\t\t商家\t\t\t商家库存");
System.out.println(x.getFoodId() + "\t\t\t\t" + x.getFoodName() + "\t\t\t" + x.getFoodPrice() + "元" + "\t\t\t" + x.getFoodSpace() + "\t\t" + x.getFoodNumber() + "件");
break;
} else {
//查找失败
System.out.println("未找到此外卖");
}
}
//无论查找成功失败,都进入此页面
System.out.println("1.继续查找");
System.out.println("2.返回外卖系统开始界面");
System.out.println("请输入您的选择");
String judge1 = sc.next();
switch (judge1) {
case "":
//继续进行查找
break loop;
case "2":
//退出方法
return;
default: {
//重新输入
System.out.println("!没有这个选项,请重新输入!");
}
}
}
case "2":
//直接退出方法
return;
case "3":
//结束程序运行
System.exit(0);
}
}
}
}
//打印制作信息(已完成)
public static void message() {
//创建输入类对象
Scanner Sc = new Scanner(System.in);
System.out.println("-------------------------------------------");
//打印所有信息
System.out.println("制作者:多多");
System.out.println("班级:软件工程23.3");
System.out.println("制作日期:2023/11/18-2023/11/19");
System.out.println("耗时:18号晚上六点到19号下午五点约12个小时");
System.out.println("QQ:1732446549");
System.out.println("VX:zdyizdy");
System.out.println("TET:19850593532");
System.out.println("特别感谢:北华大学");
System.out.println("特别感谢:计算机科学与技术学院");
System.out.println("特别感谢:大数据应用与开发工作室");
System.out.println("-------------------------------------------");
while (true) {
System.out.println("1.返回外卖系统界面");
System.out.println("2.退出程序");
System.out.println("请输入您的选择");
String judge = Sc.next();
switch (judge) {
case "1":
//退出方法
return;
case "2":
//退出程序
System.exit(0);
default:
//重新输入
System.out.println("!没有这个选项,请重新输入!");
}
}
}
}
/*
目前已知的bug有
1.登录时输错账户和密码会连续进入两次选择界面(未解决)
*/
第二次课设
结构图
JavaBean类
package com.BigDate1421_Dduo.JavaBean;
import com.BigDate1421_Dduo.Takeout.Choose5_Order;
import java.util.stream.Collectors;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
//这个JavaBean类是食品
public class Food {
private String name;//名称
private int price; //价格
private String score;//评分
private String foodSpace;//产地
public Food() {
}
public Food(String name, int price, String score, String foodSpace) {
this.name = name;
this.price = price;
this.score = score;
this.foodSpace = foodSpace;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return price
*/
public int getPrice() {
return price;
}
/**
* 设置
* @param price
*/
public void setPrice(int price) {
this.price = price;
}
/**
* 获取
* @return score
*/
public String getScore() {
return score;
}
/**
* 设置
* @param score
*/
public void setScore(String score) {
this.score = score;
}
/**
* 获取
* @return foodSpace
*/
public String getFoodSpace() {
return foodSpace;
}
/**
* 设置
* @param foodSpace
*/
public void setFoodSpace(String foodSpace) {
this.foodSpace = foodSpace;
}
public String toString() {
return "Food{name = " + name + ", price = " + price + ", score = " + score + ", foodSpace = " + foodSpace + "}";
}
/*------------------------------------------------------*/
public static ArrayList<Food>foods=new ArrayList<>();
//创建单列集合存储食品信息
public static void addExampleFood(){
//添加食品样例
foods.add(new Food("炸鸡腿",10,"100","肯豆基"));
foods.add(new Food("汉堡",15,"90","华来市"));
foods.add(new Food("可乐",3,"85","北华超市"));
foods.add(new Food("雪碧",4,"85","北华超市"));
}
public static void traversal(){
//用迭代器,Lambda表达式遍历单列集合
Iterator<Food> iterator = foods.iterator();
iterator.forEachRemaining(element -> {
System.out.println(element);
});
}
public static List<Food> seek(String keyword){
//用stream流和终结方法collect过滤元素
List<Food>list=
foods
.stream()
.filter(s -> s.name.contains(keyword))
.collect(Collectors.toList());
//System.out.println(list);这里一开始出现了问题所以遍历了一下·
return list;
}
public static boolean check(String input){
//检查是否存在元素
//Lambda表达式会忽略结果,所以我选择用迭代器遍历
Iterator<Food> iterator = foods.iterator();
while (iterator.hasNext())
if (iterator.next().name.equals(input))
return true;
return false;
}
public static void add(Food food){
//添加元素
foods.add(food);
//添加到点餐集合里去
Choose5_Order.add(food.name,food.price);
}
public static void delete(String food){
//用迭代器遍历删除下一个元素
Iterator<Food> iterator = foods.iterator();
while (iterator.hasNext()) {
String item = iterator.next().name;
if (item.equals(food)) {
iterator.remove(); // 删除元素
}
}
//删除点餐集合里的数据
Choose5_Order.delete(food);
}
}
package com.BigDate1421_Dduo.JavaBean;
import com.BigDate1421_Dduo.Start.StartChoose;
import java.util.HashMap;
//这个JavaBean类是用户
public class User {
//键,值都为字符串类型
//用户名和密码
public static HashMap<String ,String>user=new HashMap<>();
//双列集合存储用户名和密码
//键,值都为字符串类型·
public static HashMap<String ,String>retrieve=new HashMap<>();
//双列集合存储用户名和验证码
//键,值都为字符串类型
public static void addExample() {
//添加用户样例
user.put("User","123");
retrieve.put("User","Duo");
}
public static boolean judgeInputUsername(String inputUsername) {
//判断账户内是否存在
return user.containsKey(inputUsername);
}
public static boolean judgeInputUserPasscode(String inputUsername, String inputUserPasscode) {
//判断用户和密码是否对应
//字符串直接比较的是地址值,调用equals方法比较具体值
//这里第一次写的时候就犯了这个错误,写成了"=="
return (inputUserPasscode.equals(user.get(inputUsername)));
}
public static void lockUser(String inputUsername){
//锁定账户
user.remove(inputUsername);
//这里实际上是移除哈希表内的键值对
StartChoose.choose();
//返回开始界面
}
public static void add(String newUsername,String inputUserPasscode){
//添加用户名和密码
user.put(newUsername,inputUserPasscode);
//直接往哈希表里添加键值对
}
public static void verCode(String newUsername,String code){
//添加用户的验证码
//每一个用户都有一个验证码,一个长度为5的字符串
retrieve.put(newUsername,code);
}
public static boolean judgeVercode(String Username,String Usercode){
//判断验证码是否符合
if(Usercode.equals(retrieve.get(Username)))
return true;
else return false;
}
public static String getPassage(String Username){
//通过用户名返回密码
return user.get(Username);
}
}
Start包下的(和开始界面有关的)
package com.BigDate1421_Dduo.Start;
import com.BigDate1421_Dduo.Tools.NowTime;
import java.util.Scanner;
//初始界面
public class StartChoose {
public static void choose() {
Scanner sc=new Scanner(System.in);
//把食品添加到这里
//是因为每次进入外卖界面都会往集合里添加数据,
//数据会重复,这样只会添加一次
System.out.println("----------♡欢迎使用多多外卖系统♡----------");
System.out.println("现在是北京时间"+NowTime.nowTime());
System.out.println("1.登录");
System.out.println("2.注册");
System.out.println("3.忘记密码");
System.out.println("4.制作信息");
System.out.println("5.退出");
//这里的警告是因为写了太多的打印输出代码
System.out.println("请输入您的选择");
int choose= sc.nextInt();
//如果选择是1,进入登录界面
if (choose == 1) Choose1_Enter.enter();
//如果选择是2,进入注册界面
else if (choose == 2) Choose2_Register.register();
//如果选择是3,进入密码重置界面
else if (choose == 3) Choose3_Forget.forget();
//如果选择是4,打开制作者信息
else if (choose == 4) Choose4_Message.message();
//如果选择是5,终止虚拟机运行,退出程序
else if (choose == 5) System.exit(0);
else {
System.out.println("没有此选择,请重新输入");
StartChoose.choose();
}
}
}
package com.BigDate1421_Dduo.Start;
import com.BigDate1421_Dduo.JavaBean.User;
import com.BigDate1421_Dduo.Takeout.TakeoutChoose;
import com.BigDate1421_Dduo.Tools.NowTime;
import java.util.Scanner;
//登录
public class Choose1_Enter {
public static void enter() {
Scanner sc=new Scanner(System.in);
System.out.println("----------♡登录♡----------");
System.out.println("现在是北京时间"+NowTime.nowTime());
//输入用户名
System.out.println("请输入你的用户名");
String inputUsername= sc.next();
//判断是否存在此用户
//将键传递给Map方法
if(!User.judgeInputUsername(inputUsername)){
System.out.println("不存在该用户名");
//进行下一步选择
System.out.println("请输入下一步选择");
System.out.println("1.重试");
System.out.println("2.返回开始菜单");
switch (sc.nextInt()){
//重新进入登录界面
case 1: Choose1_Enter.enter();
//进入初始界面
case 2: StartChoose.choose();
}
}
else {
//进入用户名与密码的匹配判断
System.out.println("用户名存在");
System.out.println("请注意一共有三次机会输入密码");
System.out.println("如输入次数过多将会抹除数据");
//通过循环判断输入密码次数
for(int i=3;i>=0;i--){
//输入密码
System.out.println("请输入密码");
String inputUserPasscode= sc.next();
if(!User.judgeInputUserPasscode(inputUsername,inputUserPasscode)){
//输入密码错误次数过多 锁定账户
if(i==1) {
System.out.println("对不起您的输入次数过多,账户已经锁定");
User.lockUser(inputUsername);
}
System.out.println("密码输入错误,您还有"+(i-1)+"次机会");
//进行下一步操作
System.out.println("请输入下一步选择");
System.out.println("1.重试密码");
System.out.println("2.重输用户名");
System.out.println("3.返回开始菜单");
switch (sc.nextInt()){
case 1 : continue;
case 2 : Choose1_Enter.enter();
case 3 : StartChoose.choose();
}
}
else {
//验证通过则进入外卖界面
System.out.println("密码输入成功");
TakeoutChoose.choose();
}
}
}
}
}
package com.BigDate1421_Dduo.Start;
import com.BigDate1421_Dduo.JavaBean.User;
import com.BigDate1421_Dduo.Tools.NowTime;
import com.BigDate1421_Dduo.Tools.RandomString;
import java.util.Scanner;
//注册
public class Choose2_Register {
public static void register() {
Scanner sc=new Scanner(System.in);
System.out.println("----------♡注册♡----------");
System.out.println("现在是北京时间"+NowTime.nowTime());
System.out.println("请输入用户名");
System.out.println("用户名必须是数字字母大小写混合,不包含字符空格,不小于2位,不大于6位");
String newUsername= sc.next();
//生成用户名的正则表达式
String usernamePattern = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{2,6}$";
//用正则表达式判断
if(!newUsername.matches(usernamePattern)){
//不符合规范
System.out.println("用户名不符合规范");
System.out.println("1.请重新输入");
System.out.println("2.返回开始界面");
switch (sc.nextInt()){
case 1:Choose2_Register.register();
case 2:StartChoose.choose();
}
}
else {
//用户名规范判断通过 即用户名和密码都符合规范
System.out.println("用户名符合规范");
System.out.println("请输入密码");
System.out.println("密码必须是数字,不包含字母字符空格,不小于3位,不大于5位");
String newPasscoder= sc.next();
//生成密码的正则表达式
String userPasscoderPattern = "^\\d{3,5}$";
//用正则表达式判断
if(!newPasscoder.matches(userPasscoderPattern)){
System.out.println("密码不符合规范");
System.out.println("1.重新输入账号");
System.out.println("2.返回开始界面");
switch (sc.nextInt()){
case 1:Choose2_Register.register();
case 2:StartChoose.choose();
}
}
else {
//进入验证码
System.out.println("用户名和密码都符合规范");
//生成随机的长度为5的字符串
//通过死循环来进行更新验证码
while (true) {
String Vercode = RandomString.gencode();
System.out.println("请输入验证码");
System.out.println("验证码: " + Vercode);
System.out.println("如果想更新验证码请输入again,进入下一步则输入其他");
if (sc.next().equals("again") ) ;
else {
System.out.println("请注意你只有一次输入机会,如输入正确则注册");
if (sc.next().equals(Vercode)) {
System.out.println("输入正确,已注册");
System.out.println("刚刚输入的验证码可以在忘记密码时使用");
//添加新账号
User.add(newUsername, newPasscoder);
//添加验证码
User.verCode(newUsername, Vercode);
System.out.println("您的账号是" + newUsername);
System.out.println("您的密码是" + newPasscoder);
System.out.println("您的验证码是" + Vercode);
//返回开始界面
StartChoose.choose();
} else {
System.out.println("输入错误");
//返回开始界面
StartChoose.choose();
}
}
}
}
}
}
}
package com.BigDate1421_Dduo.Start;
import com.BigDate1421_Dduo.JavaBean.User;
import com.BigDate1421_Dduo.Tools.NowTime;
import java.util.Scanner;
public class Choose3_Forget {
public static void forget() {
System.out.println("----------♡忘记密码♡----------");
System.out.println("现在是北京时间"+NowTime.nowTime());
Scanner sc=new Scanner(System.in);
//首先输入用户名判断其是否存在哈希表内
System.out.println("请输入用户名");
//与登录方法一致
String inputUsername= sc.next();
//判断是否存在此用户
//将键传递给Map方法
if(!User.judgeInputUsername(inputUsername)) {
System.out.println("不存在该用户名");
//返回开始界面
StartChoose.choose();
}
else {
//通过另一个哈希表,键是用户名,值是验证码验证
System.out.println("存在该用户");
System.out.println("请输入用户"+inputUsername+"的验证码");
if(User.judgeVercode(inputUsername, sc.next())){
System.out.println("验证码正确");
System.out.println("用户名"+inputUsername+"的密码是:"+User.getPassage(inputUsername));
}
else System.out.println("输入错误");
//返回开始界面
StartChoose.choose();
}
}
}
package com.BigDate1421_Dduo.Start;
import javax.swing.*;
import java.awt.*;
//感谢
public class Choose4_Message extends JFrame {
//这里使用了图形化组件Java Swing
public void UI() {
setTitle("感谢");
//更改默认状态,这样才可以添加文字
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel label1 = new JLabel("我叫朱道阳");
JLabel label2 = new JLabel("我来自北华大学大数据应用与开发工作室");
JLabel label3 = new JLabel("这是我耗时2天写完的课程设计");
JLabel label4 = new JLabel("现在是北京时间2024/2/22 19:12:43");
JLabel label5 = new JLabel("此处特别感谢学长的指导");
/*
设置字体大小
这里本来实现放大文本框的
可是尝试后发现文字无法正常显示
Font font = new Font("Arial", Font.PLAIN, 20);
新建一个字体
label1.setFont(font);
label2.setFont(font);
label3.setFont(font);
label4.setFont(font);
label5.setFont(font);
*/
//使用垂直盒子布局来排列多个JLabel组件
//因为居中显示的话无法换行只会使界面原来越宽
Box vbox = Box.createVerticalBox();
vbox.add(label1);
vbox.add(label2);
vbox.add(label3);
vbox.add(label4);
vbox.add(label5);
//通过Container获取当前JFrame内容面板
//调用方法来添加组件
Container contentPane = getContentPane();
contentPane.add(vbox);
//自动调整JFrame的大小
pack();
/*
居中显示但是会被现有的程序覆盖
//获得屏幕尺寸
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
// 计算窗口位置,使其显示在屏幕中心
int x = (screenSize.width - getWidth()) / 2;
int y = (screenSize.height - getHeight()) / 2;
//设置窗口位置
setLocation(x, y);
*/
//没有设置界面框的大小是因为字会莫名其妙消失,不设置是默认填充状态
//设置界面居中
this.setLocationRelativeTo(null);
//取消默认的居中放置
this.setLayout(null);
//显示窗口
setVisible(true);
/*
想改变窗口图标
但是
这里因为没有使用JFrame所以想不到方法来改变窗口图标
ImageIcon icon = new ImageIcon("icon.png");
frame.setIconImage(icon.getImage());
*/
}
public static void message(){
Choose4_Message choose4Message = new Choose4_Message();
choose4Message.UI();
}
}
Takeout包下的(和食品相关的)
package com.BigDate1421_Dduo.Takeout;
import com.BigDate1421_Dduo.Tools.NowTime;
import java.util.Scanner;
//查看食品界面
public class TakeoutChoose {
public static void choose() {
Scanner sc=new Scanner(System.in);
System.out.println("----------♡欢迎使用食品管理系统♡----------");
System.out.println("现在是北京时间"+ NowTime.nowTime());
System.out.println("1.查看目前所有食品信息");
System.out.println("2.添加食品信息");
System.out.println("3.删除食品信息");
System.out.println("4.查找食品信息");
System.out.println("5.模拟外卖点单");
System.out.println("6.退出系统");
System.out.println("请输入您的选择");
int choose= sc.nextInt();
//如果选择是1,查看所有信息
if(choose==1) Choose1_View.view();
//如果选择是2,增
else if (choose == 2) Choose2_Add.add();
//如果选择是3,删
else if (choose == 3) Choose3_Delete.delete();
//如果选择是4,查
else if (choose == 4) Choose4_Seek.seek();
//如果选择是5,模拟外卖点单
else if (choose == 5) Choose5_Order.order();
//如果选择是6,终止虚拟机运行,退出程序
else if (choose == 6) System.exit(0);
else {
System.out.println("没有此选择,请重新输入");
TakeoutChoose.choose();
}
}
}
package com.BigDate1421_Dduo.Takeout;
import com.BigDate1421_Dduo.JavaBean.Food;
import com.BigDate1421_Dduo.Tools.NowTime;
import java.util.Scanner;
public class Choose1_View {
//展示所有食品信息
public static void view(){
Scanner sc=new Scanner(System.in);
System.out.println("----------♡查看所有食品♡----------");
System.out.println("现在是北京时间"+ NowTime.nowTime());
System.out.println("下面是食品所有信息");
System.out.println("—————————————--------------------------------------------——————");
//遍历集合
Food.traversal();
System.out.println("——————————————-------------------------------------—------—————");
System.out.println("输入1返回外卖界面");
while(true){
if(sc.nextInt()==1)TakeoutChoose.choose();
System.out.println("未输入1,请重新输入");
}
}
}
package com.BigDate1421_Dduo.Takeout;
import com.BigDate1421_Dduo.JavaBean.Food;
import com.BigDate1421_Dduo.Tools.NowTime;
import java.util.Scanner;
public class Choose2_Add {
public static void add() {
Scanner sc=new Scanner(System.in);
System.out.println("----------♡添加食品♡----------");
System.out.println("现在是北京时间"+ NowTime.nowTime());
System.out.println("请输入要添加食品的名称");
String input= sc.next();
if(Food.check(input)){
System.out.println("商品重复");
TakeoutChoose.choose();
}
else{
System.out.println("没有重复名称的食品,请继续输入");
Food food=new Food();
//先把名称填好
food.setName(input);
//接着录入三项数据
System.out.println("请输入食品价格");
food.setPrice(sc.nextInt());
System.out.println("请输入食品评分");
food.setScore(sc.next());
System.out.println("请输入食品产地");
food.setFoodSpace(sc.next());
//添加到食品集合里
Food.add(food);
System.out.println("添加食品集合成功");
//返回食品界面
System.out.println("输入1返回外卖界面");
while(true){
if(sc.nextInt()==1)TakeoutChoose.choose();
System.out.println("未输入1,请重新输入");
}
}
}
}
package com.BigDate1421_Dduo.Takeout;
import com.BigDate1421_Dduo.JavaBean.Food;
import com.BigDate1421_Dduo.Tools.NowTime;
import com.BigDate1421_Dduo.Tools.RandomString;
import java.util.Scanner;
public class Choose3_Delete {
public static void delete() {
System.out.println("----------♡删除食品♡----------");
System.out.println("现在是北京时间"+ NowTime.nowTime());
Scanner sc = new Scanner(System.in);
//先判断集合内是否存在
System.out.println("请输入要删除食品的名称");
String input = sc.next();
if (!Food.check(input)) {
System.out.println("未找到与该食品");
TakeoutChoose.choose();
}
else {
System.out.println("已找到该食品");
System.out.println(Food.seek(input));
System.out.println("请输入验证码以删除");
//生成随机的长度为5的字符串
//通过死循环来进行更新验证码
while (true) {
String Vercode = RandomString.gencode();
System.out.println("验证码: " + Vercode);
System.out.println("如果想更新验证码请输入again,进入下一步则输入其他");
if (sc.next().equals("again") ) ;
else {
System.out.println("请注意你只有一次输入机会,如输入正确则删除");
if (sc.next().equals(Vercode)) {
System.out.println("输入正确,已删除");
Food.delete(input);
System.out.println("输入1返回外卖界面");
while(true){
if(sc.nextInt()==1)TakeoutChoose.choose();
System.out.println("未输入1,请重新输入");
}
}
else {
System.out.println("输入错误!");
TakeoutChoose.choose();
}
}
}
}
}
}
package com.BigDate1421_Dduo.Takeout;
import com.BigDate1421_Dduo.JavaBean.Food;
import com.BigDate1421_Dduo.Tools.NowTime;
import java.util.Scanner;
public class Choose4_Seek {
public static void seek() {
System.out.println("----------♡查找食品♡----------");
System.out.println("现在是北京时间"+ NowTime.nowTime());
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个关键字查找数据(名称)");
String keyword= sc.next();
if(Food.seek(keyword).isEmpty())
System.out.println("未找到信息");
else {
System.out.println("找到"+Food.seek(keyword).size()+"项数据");
//用增强for循环遍历集合
for(Food food:Food.seek(keyword))
System.out.println(food);
}
System.out.println("输入1重新查找");
System.out.println("输入2返回上一步");
while(true){
int judge= sc.nextInt();
if(judge==1) Choose4_Seek.seek();
if(judge==2)TakeoutChoose.choose();
System.out.println("输入错误请重新输入");
}
}
}
package com.BigDate1421_Dduo.Takeout;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.HashMap;
import java.util.Iterator;
public class Choose5_Order extends JFrame {
private JList<String> menuList;
private DefaultListModel<String> menuListModel;
private JTextArea orderTextArea;
private JButton orderButton;
public static HashMap<String,Integer>foods=new HashMap();
//这个哈希表创建是为了模拟点单时使用
//键是食品名称,值是食品价格
public static void addExampleOrder(){
//添加数据
foods.put("炸鸡腿",10);
foods.put("汉堡",15);
foods.put("可乐",3);
foods.put("雪碧",4);
}
public static void add(String name,int price) {
//将名称和价格放入哈希表
foods.put(name,price);
}
public static void delete(String name) {
//删除哈希表内的键值对
foods.remove(name);
}
public Choose5_Order() {
/*
这里是添加背景图片但是添加上去会遮挡文字
ImageIcon icon1=new ImageIcon();
//创建一个JLabel的对象(管理容器)
JLabel jLabel1=new JLabel(icon1);
//把管理容器添加到界面当中
this.add(jLabel1);
//用坐标指定图片的位置
jLabel1.setBounds(-15,0,600,550);
*/
//设置界面置顶 显示在主页上不会被覆盖
this.setAlwaysOnTop(true);
//设置界面的宽度和高度
this.setSize(300, 300);
//设置界面的标题
this.setTitle("多多模拟点餐");
//设置界面居中
this.setLocationRelativeTo(null);
//这样才能添加组件
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建主面板
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BorderLayout());
// 创建菜单列表
menuListModel = new DefaultListModel<>();
//遍历哈希表,把哈希表的键放进去
Iterator<String> iterator = foods.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next();
menuListModel.addElement(key);
}
//因为哈希表是一种无序的数据结构
//所以插入的时候顺序会乱
//有用LinkedHashMap改写的想法
menuList = new JList<>(menuListModel);
JScrollPane menuScrollPane = new JScrollPane(menuList);
mainPanel.add(menuScrollPane, BorderLayout.CENTER);
//创建订单区域
orderTextArea = new JTextArea();
JScrollPane orderScrollPane = new JScrollPane(orderTextArea);
mainPanel.add(orderScrollPane, BorderLayout.EAST);
//创建按钮面板
JPanel buttonPanel = new JPanel(new GridLayout(2, 1));
//创建添加按钮
JButton addButton = new JButton("添加购物车");
addButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String selectedItem = menuList.getSelectedValue();
if (selectedItem != null && !selectedItem.isEmpty()) {
orderTextArea.append(selectedItem + "\n");
}
}
});
buttonPanel.add(addButton);
//创建清空按钮
JButton clearButton = new JButton("清空购物车");
//匿名内部类来实现事件监听器
clearButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
orderTextArea.setText("");
}
});
buttonPanel.add(clearButton);
mainPanel.add(buttonPanel, BorderLayout.SOUTH);
//创建下单按钮
orderButton = new JButton("结账");
//这里我原本写的是匿名内部类,后来改成了Lambda表达式
orderButton.addActionListener(e -> {
String orderText = orderTextArea.getText();
if (!orderText.isEmpty()) {
double totalAmount = 0.0;
//将菜品价格累加
String[] orders = orderText.split("\n");
for (String order : orders) {
if (foods.containsKey(order)) {
totalAmount += foods.get(order);
}
}
//显示总金额
JOptionPane.showMessageDialog(Choose5_Order.this, "购物车:\n" + orderText + "\n总价格: $" + totalAmount, "结账",JOptionPane.WARNING_MESSAGE);
orderTextArea.setText("");
} else {
JOptionPane.showMessageDialog(Choose5_Order.this, "购物车内无商品", "出错了", JOptionPane.ERROR_MESSAGE);
}
});
//将主面板添加到窗口中
add(mainPanel, BorderLayout.CENTER);
add(orderButton, BorderLayout.SOUTH);
}
public static void order() {
//这里我原本写的是匿名内部类,后来改成了Lambda表达式
SwingUtilities.invokeLater(() -> {
//启动
Choose5_Order ui = new Choose5_Order();
//使页面显示
ui.setVisible(true);
});
}
}
工具类 (音乐,当前时间,验证码)
package com.BigDate1421_Dduo.Tools;
import javax.sound.midi.*;
public class Music {
public static void music()
{
//异常 处理
try {
//音乐接口
//用open方法打开对象
//准备接收音乐序列数据准备进行播放
Sequencer sequencer = MidiSystem.getSequencer();
sequencer.open();
//表示音乐序列中的时序信息
Sequence sequence = new Sequence(Sequence.PPQ, 4);
//表示不同乐器或声部的音轨
Track track = sequence.createTrack();
// 定义音符和节奏
int[] notes = {60, 62, 64,
60, 60, 62,
64, 60, 64,
65, 67, 64,
65, 67, 67,
69, 67, 65,
64, 60, 67,
69, 67, 65,
64, 60, 60,
67, 60, 60,
67, 60};
int[] durations = {
4, 4, 4,
4, 4, 4,
4, 4, 4,
4, 8, 4,
4, 8, 3,
1, 3, 1,
4, 4, 3,1, 3,1, 4, 4, 4, 4, 8, 4, 4, 8,
};
for (int i = 0; i < notes.length; i++) {
ShortMessage noteOn = new ShortMessage(ShortMessage.NOTE_ON, 0, notes[i], 127);
MidiEvent noteOnEvent = new MidiEvent(noteOn, i * 4);
track.add(noteOnEvent);
ShortMessage noteOff = new ShortMessage(ShortMessage.NOTE_OFF, 0, notes[i], 127);
MidiEvent noteOffEvent = new MidiEvent(noteOff, (i + 1) * 4);
track.add(noteOffEvent);
//添加节奏延迟
Thread.sleep(durations[i] * 1);
}
sequencer.setSequence(sequence);
//开始播放
sequencer.start();
//播放完成
//sequencer.close();
//退出程序
//System.exit(0);
}
//异常处理机制
//当try代码出现异常时,即音乐无法播放,打印异常信息
catch (Exception e) {
e.printStackTrace();
}
}
}
package com.BigDate1421_Dduo.Tools;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
//返回系统现在的时间
public class NowTime {
public static LocalDateTime nowTime() {
//Instant类是JDK8新增的时间类 名为时间戳
long timestamp = Instant.now().getEpochSecond();
//日历类Calendar 根据输入的时区参数返回年月日时秒分
LocalDateTime dateTime = LocalDateTime.ofInstant(Instant.ofEpochSecond(timestamp), ZoneId.of("Asia/Shanghai"));
//返回值为LocalDateTime类型
return dateTime;
}
}
package com.BigDate1421_Dduo.Tools;
import java.util.Random;
//获取随机验证码
public class RandomString {
//把能随机出现的字符填进去
private static final String Largestring
= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
public static String gencode() {
//将长度作为形参传入
String randomString = generateRandomString(5);
//返回随机数
return randomString;
}
public static String generateRandomString(int length) {
//播种
Random random = new Random();
//创建字符数组
char[] text = new char[length];
//随机截取字符串中的五个字符放入数组中
for (int i = 0; i < length; i++)
text[i] = Largestring.charAt(random.nextInt(Largestring.length()));
//将数组拼成字符串返回
return new String(text);
}
}