项目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;}@Overridepublic 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{@Overridepublic void actionPerformed(ActionEvent ae){String cmd = ae.getActionCommand();//菜名pic.setIcon(new ImageIcon("img/"+cmd+".jpg"));title.setText(cmd + " : "+nameAndPrice.get(cmd)+" 元");current = cmd;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/75310.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go和Golang语言简介

李升伟 整理 Go 和 Golang 实际上指的是同一种编程语言&#xff0c;只是名称不同。 Go 名称&#xff1a;Go 是该编程语言的正式名称。 起源&#xff1a;由 Google 的 Robert Griesemer、Rob Pike 和 Ken Thompson 于 2007 年开始设计&#xff0c;2009 年正式发布。 设计目…

GitHub二次验证登录2FA(Enable two-factor authentication )

不用下载app&#xff0c;点击二维码下面的setup key获取到secret并且保存好 接下来几行代码就可以解析了。 添加依赖 <dependency><groupId>com.amdelamar</groupId><artifactId>jotp</artifactId><version>1.3.0</version> </d…

RabbitMQ技术方案分析

方案分析 在上一篇文档中&#xff0c;详细讲述了如何通过CanalMQ实现对分库分表的数据库和数据表进行数据同步&#xff0c;而在这个方案中&#xff0c;还有一个关键点是需要注意的&#xff1a;首先&#xff0c;数据增删改的信息是保证写入binlog的&#xff0c;Canal解析出增删…

node.js版本管理

概述 遇到了版本升级后&#xff0c;以前项目不兼容的问题。 下载一个node.js的版本管理工具&#xff0c;官网下载地址&#xff0c;可以选择版本下载&#xff0c;我选择的1.11.1版本的。下载完成后点击安装&#xff0c;分别选择nvm安装目录和nodejs的安装目录&#xff0c;点击安…

leetcode-热题100(3)

leetcode-74-搜索二维矩阵 矩阵最后一列升序排序&#xff0c;在最后一列中查找第一个大于等于target的元素 然后在该元素所在行进行二分查找 bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target) {int n matrixSize;int m matrixColSize[0];in…

在HarmonyOS NEXT 开发中,如何指定一个号码,拉起系统拨号页面

大家好&#xff0c;我是 V 哥。 《鸿蒙 HarmonyOS 开发之路 卷1 ArkTS篇》已经出版上市了哈&#xff0c;有需要的朋友可以关注一下&#xff0c;卷2应用开发篇也马上要出版了&#xff0c;V 哥正在紧锣密鼓的写鸿蒙开发实战卷3的教材&#xff0c;卷3主要以项目实战为主&#xff0…

音视频入门基础:MPEG2-TS专题(26)——通过FFmpeg命令使用RTP发送TS流

音视频入门基础&#xff1a;MPEG2-TS专题系列文章&#xff1a; 音视频入门基础&#xff1a;MPEG2-TS专题&#xff08;1&#xff09;——MPEG2-TS官方文档下载 音视频入门基础&#xff1a;MPEG2-TS专题&#xff08;2&#xff09;——使用FFmpeg命令生成ts文件 音视频入门基础…

(六)窗口表面

这节主要三部分 一&#xff0c;窗口表面的创建和销毁 二&#xff0c;呈现队列 三&#xff0c;与以前实现的图形能力队列的兼容 一&#xff0c;窗口表面 1&#xff0c;创建 VkSurfaceKHR surface; //创建窗口表面 glfwCreateWindowSurface(instance, //vkInstance对象window, …

【零基础入门unity游戏开发——2D篇】SpriteEditor图片编辑器

考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的…

云巅之上:数字文明的重构与超越

序章&#xff1a;算力新纪元 2024年初春&#xff0c;当SpaceX的星舰将首批云计算节点送入近地轨道时&#xff0c;地球上的数字原住民们正通过云端AI助手规划着一天的行程。这场静默的革命已悄然进入新阶段——云计算不再只是工具&#xff0c;而是成为数字文明的"第六元素…

【面试篇】多线程

基础概念 线程的生命周期有哪些状态&#xff1f;它们是如何转换的&#xff1f; 答案&#xff1a;线程的生命周期有以下六种状态&#xff1a; 新建&#xff08;New&#xff09;&#xff1a;线程被创建但尚未启动&#xff0c;此时线程对象已被分配内存空间&#xff0c;相关属性已…

unity运行中场景指定模型回放功能(模型是地形并且可以加载预制体进行回放)

回放和加载脚本 using System.Collections.Generic; using UnityEngine;public class TerrainRecorder : MonoBehaviour {[Header("基本设置")]public Terrain targetTerrain;public bool isRecording false;public bool isPlayingBack false;[Range(0.02f, 1f)] …

基于SpringBoot的河道水情大数据可视化分析平台设计与实现(源码+论文+部署讲解等)

需要资料&#xff0c;请文末联系 一、平台介绍 水情监测数据大屏 - 平台首页 日均水位 日均水速 二、论文内容 摘要&#xff08;中文&#xff09; 本文针对河道水情监测领域的数据管理和可视化分析需求&#xff0c;设计并实现了一套河道水情大数据可视化分析平台。该平台基…

Knife4j文档请求异常 空指针

打开swagger文档报空指针异常 java.lang.NullPointerException: nullat springfox.documentation.oas.mappers.SchemaMapper.model(SchemaMapper.java:97)at springfox.documentation.oas.mappers.SchemaMapper.mapModel(SchemaMapper.java:85)at springfox.documentation.oas…

车辆选择解决方案

车辆选择解决方案 /* * Purpose: 添加车辆选择的功能 -> 用户在选择不同的车辆时&#xff0c;重新初始化系统状态&#xff0c;清除之前的定时器&#xff0c;并根据新选择的车辆设置新的定时器&#xff0c;以实现对新车辆状态的实时加载。 * File Name: 车辆选择解决方案 * …

魔塔社区使用llamafactory微调AI阅卷试题系统

启动 LLaMA-Factory 1. 安装 LLaMA-Factory 执行安装指令 git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory pip install -e ".[torch,metrics]"解决依赖冲突 如果遇到依赖冲突&#xff0c;可使用以下命令安装&#xff0c;不…

程序化广告行业(51/89):Cookie映射与移动设备ID映射解析

程序化广告行业&#xff08;51/89&#xff09;&#xff1a;Cookie映射与移动设备ID映射解析 在当今数字化营销的浪潮中&#xff0c;程序化广告已经成为企业精准触达目标客户的重要手段。作为一名对程序化广告充满兴趣的学习者&#xff0c;我希望通过这篇博客和大家一起深入探索…

内网服务器centos7安装jdk17

1. 下载 JDK 17 安装包&#xff08;在外网环境操作&#xff09; 在可联网的机器上下载 JDK 17 的压缩包&#xff08;推荐使用 OpenJDK&#xff09;&#xff1a; OpenJDK 官方源&#xff1a; Adoptium Eclipse Temurin Azul Zulu 直接下载命令示例&#xff08;在外网机器上执行…

【学Rust写CAD】21 2D 点(point.rs)

源码 //matrix/point.rs use std::ops::Mul; use super::algebraic_units::{Zero, One}; use super::generic::Matrix;/// 点坐标结构体 #[derive(Debug, Clone, Copy, PartialEq)] pub struct Point<X, Y>(Matrix<X, Y, One, Zero, Zero, One>);impl<X, Y>…

《AI大模型应知应会100篇》第7篇:Prompt Engineering基础:如何与大模型有效沟通

第7篇&#xff1a;Prompt Engineering基础&#xff1a;如何与大模型有效沟通 摘要 Prompt Engineering&#xff08;提示工程&#xff09;是与大模型高效沟通的关键技能。通过精心设计的Prompt&#xff0c;可以让模型生成更准确、更有用的结果。本文将从基础知识到高级策略&…