当前位置: 首页 > news >正文

项目6——前后端互通的点餐项目

一、项目介绍

1、有哪些需求需要连接后台完成功能?

            前台传给后台        后台返回给前台
注册:    用户名 + 密码        操作是否成功
登录:    用户名 + 密码        操作是否成功
下单:    用户名 + 菜名        操作是否成功

Request : 前端发送给后台的所有数据的载体
Response : 后台返回给前台的所有数据的载体

2、各部件


角色:

1.大堂经理==迎宾接待    EtoakServer.java
    它的职责 只是接待客人进门
    不涉及点菜不涉及炒菜 不涉及采购菜品
    然后将客人转交给一个负责点菜的服务员
    告诉服务员开始干活 它继续站在门口 等下一个客人

2.服务员            EtoakThread.java
    它的职责
    a> 接过客人手里的"请求表Request==点菜的菜单"  接 : Request
    b> 将做菜的过程外包给 厨子部门              外包的化
    c> 将厨子部门做好装好盘的菜 给用户端上去         发 : Response

3.厨子总监        EtoakController.java
    它的职责
    根据用户在菜单上的选项 决定具体给提供什么样的餐品
    取前端放入的askNo 取做某件事对应的数据
    安排自己的小弟 去炒菜 但是由他装盘
    a> 从请求当中获取做这项业务需要的数据
    b> 安排小弟去干活(真正的业务!!!) 还得拿到小弟返回的结果
    c> 找个空盘子 把菜放进去 返回
4.厨子小弟        Etoakservice.java
    它的职责
    根据Controller传过来的参数
    传回一个int值代表正确与否

二、代码

1、EtoakServer.java

import java.net.*;
import java.util.concurrent.*;

public class EtoakServer{
	public static void main(String[] args)throws Exception{
		ExecutorService es = Executors.newFixedThreadPool(5);
		ServerSocket server = new ServerSocket(17888);
		boolean isRunning = true;
		while(isRunning){
			Socket skt = server.accept();
			EtoakThread et = new EtoakThread(skt);
			es.submit(et);
		}
		server.close();
		es.shutdown();
	}
}

2、EtoakController.java

import java.util.*;

public class EtoakController{
	static EtoakService service = new EtoakService();
	public Response work(Request req){
		int askNo = req.getAksNo();
		Response res = null ;
		if(askNo == 1001){
			res = register(req);
		}else if(askNo == 1002){
			res = login(req);
		}else if(askNo == 1003){
			res = order(req);
		}
		return res;
	}

	public Response register(Request req){
		String username = req.getParameter("username");
		String password = req.getParameter("password");

		Response res =  new Response();

		int rr = service.register(username,password);

		res.setResult(rr);
		return res;
	}
	public Response login(Request req){

		String username = req.getParameter("username");
		String password = req.getParameter("password");
		Response res =  new Response();
		EtoakFAO fao = new EtoakFAO();
		int rr = service.login(username,password);

		res.setResult(rr);
		return res;
	}
	public Response order(Request req){
		String username = req.getParameter("username");
		String foods = req.getParameter("foods");
		Response res =  new Response();


		int rr = service.order(username,foods);

		res.setResult(rr);
		return res;
	}
}

3、EtoakThread.java

import java.net.*;
import java.io.*;
public class EtoakThread implements Runnable{
	Socket skt;
	public EtoakThread(Socket skt){
		this.skt = skt;
	}
	@Override
	public void run(){
		try{
			 InputStream is = skt.getInputStream();
			 ObjectInputStream ois = new  ObjectInputStream(is);
			 Request req = (Request)ois.readObject();

			 EtoakController controller = new EtoakController();
			 Response res = controller.work(req);

			 OutputStream os = skt.getOutputStream();
			 ObjectOutputStream oos = new ObjectOutputStream(os);
			 oos.writeObject(res);

			 oos.close();
			 ois.close();
			 skt.close();


		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

4、Etoakservice.java

import java.util.*;
public class EtoakService{

	EtoakFAO fao = new EtoakFAO();

	public int register(String username,String password){
		Map<String,String> userMap = fao.load();
		if(userMap.containsKey(username))
			return 1;
		userMap.put(username,password);
		fao.save(userMap);
		return 0;
	}

	public int login(String username,String password){
		Map<String,String> userMap = fao.load();
		if(!userMap.containsKey(username))
			return 1;
		String realPassword = userMap.get(username);
		if(realPassword.equals(password)){
			return 0;
		}else{
			return 2;
		}
	}

	public int order(String username,String foods){
		if(username.contains("Jay")){
			return 1;//点餐失败 太胖了
		}
		if(foods.contains("野生")){
			return 2;//点餐失败 你很刑
		}
		String[] data = foods.split(",");
		if(data.length < 5){
			return 3;//数量不够
		}
		return 0;
	}

}

5、Test.java

import java.util.*;
import java.util.concurrent.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;
public class Test{
	public static void main(String[] args)throws Exception{
		Request req = new Request();
		req.setAskno(1003);
		req.setParameter("username","Jim");
		req.setParameter("password","123123");
		req.setParameter("foods","水煮鱼");
		//r.getAksNo();
		Socket skt = new Socket("192.168.17.185",17888);
		ObjectOutputStream oos = new ObjectOutputStream(skt.getOutputStream());
		oos.writeObject(req);
		ObjectInputStream ois = new ObjectInputStream(skt.getInputStream());
		Response res = (Response)ois.readObject();
		ois.close();
		oos.close();
		skt.close();
		int result = res.getResult();
		System.out.println(result);
	}

}

6、Request.java

import java.util.*;
import java.util.concurrent.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;

public class Request implements Serializable{
	private int askNo;
	public void setAskno(int askNo){
		this.askNo = askNo;
	}
	public int getAksNo(){
		return askNo;
	}
	private Map<String,String> params = new LinkedHashMap<>();
	public void setParameter(String key,String value){
		params.put(key,value);
	}
	public String getParameter(String key){
		return params.get(key);
	}

}

7、Response.java

public class Response implements java.io.Serializable{
	private int result = -1;
	public void setResult(int result){
		this.result = result;
	}
	public int getResult(){
		return result;
	}
}

8、EtoakFAO.java

import java.io.*;
import java.util.*;

public class EtoakFAO{
	public void main(String[] args){
			Map<String,String> map = new HashMap<>();
		map.put("Jim","123123");
		try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("users.data"))){
			oos.writeObject(map);
			oos.close();
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	public void save(Map<String,String> map){
		try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("users.data"))){
			oos.writeObject(map);
			oos.close();
		}catch(Exception e){
			e.printStackTrace();
		}

	}

	public Map<String,String> load(){
		Map<String,String> map = new HashMap<>();
		try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream("users.data"))){
			map = (Map<String,String>)ois.readObject();
			ois.close();
		}catch(Exception e){
			e.printStackTrace();
		}
		return map;
	}


}

三、小结

        这次是前后端一起进行的练习项目,这个结构是需要我多熟悉的,我在写第一遍的过程中直接忽略了service的作用根本没写这个部分,直接在Controller中实现了功能,这是不规范的,应当注意,先写框架,在进行功能编辑,不然容易在功能编辑的过程中忘记一些部分

四、赠品

        这个小项目是实现一个点餐的页面的部分,主要的知识是在于,如何给菜单项添加监听器,然后整合一些给其他按钮增加监听器的各种功能,然后集合而成的一个小型的项目。

        这里面需要一些基础的资源,代码只能参考,没有资源是无法正常的实现功能的。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.*;
public class OrderFrame{
	JFrame frame;
	JPanel east,south,center,cc,cs;
	JLabel title,total,pic;
	JButton enter,submit,reset;
	java.awt.List list;
	Map<String,Integer> nameAndPrice = new HashMap<>();
	String current = "海鲜煲";
	int sum;
	public OrderFrame(){
		frame = new JFrame("点餐窗体");
		createMenu();
		east = new JPanel(new BorderLayout());
		south = new JPanel(new FlowLayout());
		center = new JPanel(new BorderLayout());
		cc = new JPanel(new BorderLayout());
		cs = new JPanel(new FlowLayout());
		title = new JLabel("海鲜煲 : 560 元");
		total = new JLabel("当前总共 : 0 元");
		pic = new JLabel(new ImageIcon("img/海鲜煲.jpg"));
		enter = new JButton("我要点这道菜");
		enter.addActionListener((ae) -> {
			list.add(current);
			int price = nameAndPrice.get(current);
			sum += price;
			total.setText("当前总共 : "+sum+" 元");
		});
		submit = new JButton("提交菜单");
		submit.addActionListener((ae) -> {
			String[] data = list.getItems();//得到列表中的项目们
			if(data.length < 5){
				JOptionPane.showMessageDialog(frame,"太磕碜了吧?!");
				return;
			}
			if(sum < 500){
				JOptionPane.showMessageDialog(frame,"太寒碜了吧?!");
				return;
			}
			System.out.println("验证通过 准备连接服务器 但是 下午的活咯");
		});
		reset = new JButton("全部重置");
		reset.addActionListener((ae) -> {
			sum = 0;
			list.removeAll();
			total.setText("当前总共 : 0 元");
		});
		list = new java.awt.List();
		list.setFont(new Font("宋体",1,18));
		east.add(list);
		south.add(enter);
		south.add(submit);
		south.add(reset);
		south.add(total);
		cs.add(title);
		cc.add(pic);
		center.add(cs,"South");
		center.add(cc,"Center");

		frame.add(center,"Center");
		frame.add(east,"East");
		frame.add(south,"South");
		frame.setSize(800,400);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(3);
	}
	public void createMenu(){
		FoodListener fl = new FoodListener();
		JMenuBar bar = new JMenuBar();

		
		Properties menuPros = new Properties();
		try(InputStreamReader r = new InputStreamReader(new FileInputStream("cfg/config.properties"),"GBK")){
			menuPros.load(r);
		}catch(Exception e){
			e.printStackTrace();
		}
		Set<String> menuNames = menuPros.stringPropertyNames();
		for(String menuName : menuNames){
			JMenu menu = new JMenu(menuName);
			String fileName = menuPros.getProperty(menuName);

			Properties itemPros = new Properties();
			try(InputStreamReader r = new InputStreamReader(new FileInputStream("cfg/"+fileName),"GBK")){
				itemPros.load(r);
			}catch(Exception e){
				e.printStackTrace();
			}
			Set<String> itemNames = itemPros.stringPropertyNames();
			for(String itemName : itemNames){
				String str = itemPros.getProperty(itemName);
				int price = Integer.parseInt(str);
				nameAndPrice.put(itemName,price);//偷偷存 名字和价格
				JMenuItem mi = new JMenuItem(itemName);
				mi.addActionListener(fl);
				menu.add(mi);
			}

			bar.add(menu);
		}
		

		frame.setJMenuBar(bar);
	}
	public static void main(String[] args){
		new OrderFrame();
	}
	class FoodListener implements ActionListener{
		@Override
		public void actionPerformed(ActionEvent ae){
			String cmd = ae.getActionCommand();//菜名
			pic.setIcon(new ImageIcon("img/"+cmd+".jpg"));
			title.setText(cmd + " : "+nameAndPrice.get(cmd)+" 元");
			current = cmd;
		}
	}
}











相关文章:

  • 详解Maven的主要生命周期
  • 安装windows server 2016没有可选硬盘,设备安装过ubuntu系统
  • vue3使用v-md-editor完成Markdown内容展示
  • 正则表达式核心语法 + Python的 re 库中常用方法
  • 二分答案-P8647 [蓝桥杯 2017 省 AB] 分巧克力
  • iCare Format Recovery:轻量级数据恢复工具
  • 某地老旧房屋自动化监测项目
  • JVM 每个区域分别存储什么数据?
  • Apache SeaTunnel 2.3.10 正式发布 —— 全新功能与多项改进,助力数据集成再升级!
  • 量子计算与AI音乐——解锁无限可能的音色宇宙
  • 【C++ SIMD】第1篇:SIMD基础概念与开发环境配置
  • 离散数学问题集--问题4.40
  • Burp Suite如何配置证书
  • 增加等IO状态的唤醒堆栈打印及缺页异常导致iowait分析
  • 2个 C# 的文本解析工具开源项目
  • 【操作系统】查内存泄漏方法
  • ROS相关学习笔记
  • 第二十一章:Python-Plotly库实现数据动态可视化
  • 私有IP地址和公有IP地址的范围有哪些?你了解吗?
  • JAVA数据库增删改查
  • 营销型网站制作多少钱/百度网盘搜索引擎入口在哪里
  • 网站26个页面收费/四川餐饮培训学校排名
  • 简述电子商务网站开发的基本原则/电子商务网站有哪些?
  • 辽宁营商建设局网站/东莞商城网站建设
  • 东莞网站seo推广/集合竞价口诀背熟6句
  • 备案时网站关闭/有哪些可以推广的平台