restful风格设计API的特点:

1)使用JSON来进行传递数据

2)使用不同的HTTP方法来进行描述不同的操作

3)使用HTTP状态码来进行表示返回结果是否正确

4)使用路径表示要进行操作的资源是什么

1)创建一个SpringBoot项目

2)编写对应的配置文件,数据库的配置文件

3)编写对应的SQL语句:

当时我们工大有一家店叫做吉祥馄沌,老板还是使用手工记账的方式来进行记账,我就和老板商量了一下要做一个点餐系统出来

drop database if exists OrderDish;
create database if not exists OrderDish;
use OrderDish;
drop table if exists User;
create table User(
userID int primary key auto_increment,
userName varchar(50),
passWord varchar(100),
isAdmin int default 0
);
drop table if exists Dish;
create table Dish(
dishID int primary key auto_increment,
dishName varchar(50),
dishMoney int
);
drop table if exists Order_User;
create table Order_User(
orderID int primary key auto_increment,
userID int,
isDown int,
orderTime timeStamp,
foreign key Order_User(userID) references User(userID)
);
drop table if exists Order_Dish;
create table order_Dish(
orderID int,
dishID int,
foreign key(orderID) references Order_User(orderID),
foreign key(dishID) references Dish(dishID)
);

4)创建对应的实体类

@Data
public class Dish {private int dishID;private String dishName;private String dishMoney;
}@Data
public class Order {private int orderID;private int userID;private List<Integer> dishList;private int isDown;private Timestamp timestamp;
}@Data
public class User {private int userID;private String userName;private String passWord;private int isAdmin;
}

约定前后端交互的接口:

1){}表示一个JSON对象,他是一个键值对结构,里面包含了若干个键值对,键值对之间使用,进行分割,键和值之间使用:来进行分割,这里面的键必须是字符串

2.[]用来表示一个数组,里面包含了若干个元素,每一个元素可以是整数,字符串,或者是JSON对象

我们在这里面要用到11个API,需要约定前后端的接口;

1)用户管理:注册,登录,检测登陆状态,注销

2)菜品管理:新增菜品,查看菜品,删除菜品

3)订单管理:新增订单(用户在这里面点菜),查看指定订单,查看所有订单,修改状态

1)实现注册功能:

约定前后端交互的接口:
POST /resigter HTTP/1.1
contentType:application/json;{"userName":"李佳伟","passWord":"778896","isAdmin":"0"
}注册成功的时候:
{"data": 1,"message": "注册成功"
}
注册失败的时候:
{"data": -1,"message": "当前前段传递的用户名重复"
}

2)后端代码:

@RestController
@RequestMapping("/Java100")
public class XMLController {@AutowiredXMLMapper mapper;Logger logger= LoggerFactory.getLogger(XMLController.class);@RequestMapping("/resigter")public HashMap<String,Object> AddUser(@RequestBody User RequestUser){
//1.进行前端校验参数String username=RequestUser.getUserName();System.out.println(username);String password=RequestUser.getPassWord();System.out.println(password);HashMap<String,Object> result=new HashMap<>();int data=0;String message="";if(username==null||username.equals("")||password==null||password.equals("")){data=0;message="当前前端传递的用户名和密码有一个为空";}else {
//2.进行判断用户名是否重复User user = mapper.selectUserByUserName(username);if (user!=null){data=-1;message="当前前段传递的用户名重复";}else {
//3.进行密码加密操作;String finalPassword = encrypt.AddPassword(password);
//4将加密之后的密码和用户名传入到数据库里面RequestUser.setPassWord(finalPassword);int len = mapper.addUser(RequestUser);if (len == 1) {message = "注册成功";data = 1;} else {message = "注册失败";data = -1;}}}result.put("data",data);result.put("message",message);return result;}
}

2)实现登陆功能:必须只有管理员才可以进行登录,这个是在后端根据用户名来进行查询的;

进行密码加密操作:

public class encrypt {public static String AddPassword(String password){//进行参数校验if(!StringUtils.hasLength(password)){return "";}//1.先得到盐值String salt= IdUtil.simpleUUID();//2.对密码进行加密String finalPassWord= SecureUtil.md5(salt+password);//3.进行最终密码拼装return salt+"@"+finalPassWord;}public static boolean SubPassword(String password,String finalPassword){String[] strings=finalPassword.split("@");System.out.println(finalPassword);String salt=strings[0];String extPassWord=strings[1];String linPassword=SecureUtil.md5(salt+password);System.out.println(linPassword);if(linPassword.equals(extPassWord)) return true;return false;}
}

进行登录操作:

  @RequestMapping("/login")public HashMap<String,Object> login(@RequestBody User user, HttpServletRequest req){//1.进行用户名和密码的校验String username=user.getUserName();String password=user.getPassWord();int data=-1;String message="";//2.进行密码解迷和判断当前是否是管理员User loginUser= mapper.selectUserByUserName(username);if(loginUser==null||loginUser.equals("")){data=-1;message="当前没有这个用户";}else{//判断当前是不是管理员if(loginUser.getIsAdmin()==0){data=-1;message="您不是管理员";}else{//进行密码解密操作boolean flag=encrypt.SubPassword(user.getPassWord(),loginUser.getPassWord());if(flag==true){data=1;message="登陆成功";HttpSession httpSession=req.getSession(true);httpSession.setAttribute("user",loginUser);}else{data=-1;message="登陆失败";}}}HashMap<String,Object> result=new HashMap<>();result.put("data",data);result.put("message",message);return result;}}

3)监测登录状态(通过拦截器已经进行实现)

4)实现注销功能:

@RequestMapping("/logout")public void logout(HttpServletRequest req){//1.进行注销HttpSession httpSession=req.getSession(false);//2.删除session对象httpSession.removeAttribute("user");}

5)新增菜品:只有管理员才可以进行新增菜品,普通用户不可以进行新增菜品

约定前后端交互的接口:

前端传递:
{"dishMoney":"90","dishName":"红烧茄子"
}
后端接收:
{"data": 1,"message": "新增菜品成功"
}

6)菜品管理:删除菜品:还是只有管理员才可以进行删除菜品,普通用户不可以进行删除菜品

前端:POST 127.0.0.1:8080/Java100/deleteDish?dishID=1 HTTP/1.1删除成功的时候:
{"data": 1,"message": "删除菜品成功"
}
删除失败的时候:
{"data": -1,"message": "删除菜品失败"
}
    @RequestMapping("/deleteDish")public HashMap<String,Object> deleteDish(Integer dishID,HttpServletRequest req){//1.进行前端参数校验int data=-1;String message="";if(dishID==null||dishID.equals("")){data=-1;message="当前前段传递的message为空";}else{//判断当前登录的人是否是管理员HttpSession httpSession=req.getSession(false);User user= (User) httpSession.getAttribute("user");if(user.getIsAdmin()==0){data=-1;message="您当前不是管理员,无法进行删除菜品操作";}else{int len= mapper.deleteDish(dishID);if(len==1){data=1;message="删除菜品成功";}else {data = -1;message = "删除菜品失败";}}}HashMap<String,Object> hashMap=new HashMap<>();hashMap.put("data",data);hashMap.put("message",message);return hashMap;}

7)查看菜品:普通用户和管理员都可以查看所有菜品

约定前后端交互的接口:

GET 127.0.0.1:8080/Java100/getAllDish HTTP/1.1
[{"dishID": 2,"dishName": "红烧茄子","dishMoney": "90"},{"dishID": 3,"dishName": "红烧里脊","dishMoney": "100"}
]
 @RequestMapping("/getAllDish")public List<Dish> GetAllDish(){return mapper.SelectAllDish();}

之前用户表和菜品表的所有XML:

  <!--下面是针对用户来进行操作的--><insert id="addUser">insert into User values(null,#{userName},#{passWord},#{isAdmin});</insert><select id="selectUserByUserName" resultType="com.example.demo.Model.User">select * from User where userName=#{userName};</select><select id="SelectByUserID" resultType="com.example.demo.Model.User">select * from User where userID=#{userID}</select>
<!--下面是根据菜品来进行操作的--><insert id="addDish">insert into Dish values(null,#{dishName},#{dishMoney});</insert><delete id="deleteDish">delete from Dish where dishID=#{dishID}</delete><select id="SelectAllDish" resultType="com.example.demo.Model.Dish">select * from Dish</select><select id="SelectOne" resultType="com.example.demo.Model.Dish">select * from Dish where dishID=#{dishID}</select><update id="UpdateDish">update set dishMoney=#{dishMoney} where dishID=#{dishID}</update>

8)新增订单:

约定前后端交互的接口:
前端用户是要进行点菜的,肯定要进行选中菜品,所以前端给后端传递过来的肯定是一大堆的菜品ID
我们的后端要根据这些菜品ID生成一个订单
前段传递的参数:
{"list":"2,3,4,5"
}{"data": 1,"message": "订单插入成功"
}

后端代码:

   @RequestMapping("/addOrder")@Transactionalpublic HashMap<String,Object> addOrder(@RequestBody HashMap<String,String> hashMap,HttpServletRequest req){
//将前端传递的字符串转化成JSON数组List<Integer> dishIDList=new ArrayList<>();String list=hashMap.get("list");System.out.println(list);String[] strings=list.split(",");for(String string:strings){dishIDList.add(Integer.parseInt(string));}//1.先进行插入订单用户表,拿到生成的订单IDHttpSession httpSession=req.getSession(false);User loginUser= (User) httpSession.getAttribute("user");Order order=new Order();order.setDishList(dishIDList);order.setIsDown(0);order.setTimeStamp(new Timestamp(System.currentTimeMillis()));order.setUserID(loginUser.getUserID());mapper.addOrderUser(order);//2.再继续进行插入订单-菜品表//我们在这里面要进行循环插入,因为有多个菜品mapper.addOrderDish(dishIDList,order.getOrderID());int data=1;String message="订单插入成功";HashMap<String,Object> result=new HashMap<>();result.put("data",data);result.put("message",message);return result;}

对应的XML的代码:

<!--下面是根据订单表来进行操作的--><!--1.下面这个是新增订单--><!--进行插入要有订单用户表,这里面可以返回主键--><insert id="addOrderUser" useGeneratedKeys="true" keyProperty="orderID" keyColumn="orderID">insert into order_user values(null,#{userID},#{timeStamp});</insert><!--下面是插入要有订单菜品表--><insert id="addOrderDish" >insert into order_dish<foreach collection="list" item="dishID" separator="," open="values" >(#{orderID},#{dishID})</foreach></insert>

9)查看订单(管理员可以查看所有订单,用户可以查看指定用户的订单),但是从这方面来说无论是管理员和用户,看到的都是多个订单)

我们在这里面查询订单,只是看一下订单的大致信息,比如说订单下单时间,订单的是否完成状态,订单的ID,订单的UserID

约定前后端交互的接口:

GET 127.0.0.1:8080/Java100/SelectAllOrder HTTP/1.1响应:
[{"orderID": 7,"userID": 1,"dishList": null,"isDown": 0,"timeStamp": null},{"orderID": 8,"userID": 1,"dishList": null,"isDown": 0,"timeStamp": null}
]
//1)如果是管理员,那么可以看到所有用户的订单
//2)如果是普通用户,那么只能看到自己的订单
//3)我们可以根据HttpSession中的User对象,也就是里面的isAdmin来进行判断@RequestMapping("/SelectAllOrder")public List<Order> SelectAllOrder(HttpServletRequest req){//1.进行判断当前用户是管理员,还是普通用户,因为最终返回的肯定是一个订单列表HttpSession httpSession=req.getSession(false);User user= (User) httpSession.getAttribute("user");List<Order> list=null;if(user.getIsAdmin()==0){list= mapper.SelectAllOrder();}else{list=mapper.SelectOneAllOrder(user.getUserID());}//2.返回数据return list;}

10)查看指定订单详情:我们之前给用户显示的是一个一个的订单列表,当我们想看某一个订单的时候,就会给后端传递一个订单ID

约定前后端交互的接口:
GET 127.0.0.1:8080/Java100/GetDetailOrder?orderID=7 HTTP/1.1返回响应:
{"data": 1,"returnResult": [{"dishID": 2,"dishName": "红烧茄子","dishMoney": "90"},{"dishID": 3,"dishName": "红烧里脊","dishMoney": "100"},{"dishID": 4,"dishName": "红烧牛肉","dishMoney": "700"},{"dishID": 5,"dishName": "牛肉干","dishMoney": "70"}],"message": "当前用户查询所有订单成功"
}
@RequestMapping("/GetDetailOrder")public HashMap<String,Object> GetDetailOrder(Integer orderID){//1.进行前端参数校验HashMap<String, Object> result = new HashMap<>();int data=-1;String message="";List<Integer> list=null;List<Dish> dishList=null;if(orderID==null||orderID.equals("")){data=-1;}else {//2.进行数据库查询//2.1先根据orderID来进行查询到所有的菜品信息list = mapper.SelectAllDishIDs(orderID);//2.2再根据里面所有的dishID查询所有的DishdishList = mapper.SelectAllDishByDishIDTwo(list);//3.统一返回数据封装结果data=1;message="当前用户查询所有订单成功";}result.put("data",data);result.put("message",message);result.put("returnResult",dishList);return result;}
}

11)修改订单状态:我们在这里面约定只有管理员才可以进行修改订单状态

约定前后端交互的接口:我们要给后端传递一个orderID和isDone,后端根据这个来进行修改

前端:GET /UpdateState?orderID=1?isDone=1
响应:
{"OK":1,"message":"修改订单状态成功"
}
  @RequestMapping("/UpdateState")public HashMap<String,Object> UpdateState(@RequestBody HashMap<String,Integer> hashMap,HttpServletRequest req){//1.先进行获取到前端的参数并进行校验int data=1;String message="";HashMap<String,Object> result=new HashMap<>();Integer isDone=hashMap.get("isDone");Integer orderID=hashMap.get("orderID");if(isDone==null||isDone.equals("")||orderID==null||orderID.equals("")){data=-1;message="前端传低参数有问题";}else {//2.判断当前登录的人是不是管理员HttpSession httpSession = req.getSession(false);User user = (User) httpSession.getAttribute("user");if (user.getIsAdmin() == 0) {data = -1;message = "您当前并不是管理员请进行登录";} else {int len = mapper.UpdateState(isDone, orderID);if (len == 1) {data = 1;message = "修改成功";} else {data = -1;message = "修改失败";}}}result.put("data",data);result.put("message",message);return result;}
}

顾客点餐系统-----后端代码编写(基于SSM)相关推荐

  1. 郭宏志的android无线点餐系统,Android无线点餐系统--含代码.doc

    Android无线点餐系统--含代码Android无线点餐系统--含代码 Android 无 线 点 餐 系 统 院系:计算机与信息工程学院 班级:**级软件技术一班 姓名: 学号: PAGE \* ...

  2. 顾客点餐系统(1)-------整体项目目标+用户数据表的操作

    项目初心:我们可以让用户更方便的进行使用手机进行在线点菜 一:针对用户自主点餐: 基本功能: 1)注册登录,退出登录 2)主页面中可以看到当前店家的菜品列表(菜名,价格,是否要进行选餐), 3)点击要 ...

  3. 计算机代码设计-基于ssm的员工工资管理系统-人事工资管理系统设计-企业工资管理系统代码

    计算机代码设计-基于ssm的员工工资管理系统-人事工资管理系统设计-企业工资管理系统代码 注意:该项目只展示部分功能,如需了解,评论区咨询即可. 1.开发环境 开发语言:Java 后台:SSM(Spr ...

  4. android移动点餐系统内容和要求,基于Android云计算的移动点餐系统

    摘 要:系统发挥Android 富有创造力和想象力的云应用开发,实现一套Android 客户端软件和完善的后台服务功能来完成点餐功能.该系统主要包括后台数据库服务器.WEB 服务器.无线网络.Andr ...

  5. 监考安排系统java代码_基于jsp的监考安排与查询-JavaEE实现监考安排与查询 - java项目源码...

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的监考安排与查询, 该项目可用各类java课程设计大作业中, 监考安排与查询的系统架构分为前后台两部分, 最终实现在 ...

  6. java医院挂号代码_基于SSM开发的Java医院预约挂号系统 源码下载

    这是一个基于SSM开发的Java医院预约挂号系统,源码中附带主工程以及数据库文件. 目前已知Bug:因为时间预约信息是假数据,控制预约日历显示的代码在data/index.js,因为js写的有点bug ...

  7. python车牌识别系统开源代码_HyperLPR 基于keras-tensorflow的车牌识别

    HyperLPR 高性能开源中文车牌识别框架 一键安装 python -m pip install hyperlpr 支持python3,支持Windows Mac Linux 树莓派等. 720p ...

  8. 微信点餐系统html,SpringBoot实战——微信点餐系统(示例代码)

    1.初始化项目 引入模块 org.springframework.boot spring-boot-starter-data-jpa org.springframework.boot spring-b ...

  9. java个人博客系统源码_Java基于SSM的个人博客系统(源码 包含前后台)

    @ 系统简介 技术点:Java.JSP.SSM框架,实现了个人博客系统 用户角色分为:普通用户.管理员.系统管理员 功能:发博客.博客分类.博客删除.评论.博客管理.日志等 看完本博客,你可以得到: ...

最新文章

  1. 手游研发CJ抱大腿指南
  2. c#与mysql数据库连接以及.net framework版本修改问题
  3. apache camel_Apache Camel –从头开始开发应用程序(第1部分/第2部分)
  4. Vue之$nextTick属性
  5. springcloud使用zipkin和rabbitmq进行服务链路追踪
  6. 鲍岳桥:52 岁还在熬夜写代码! | 人物志
  7. Java 8 中的这个接口真好用!炸了!
  8. 组态王中时间存access怎么存_组态王如何实现实时显示数据并且记录到Access数据库中?...
  9. Modelsim仿真教程
  10. Veritas Backup Exec 21配置存储
  11. 国家软考--高级系统分析师证书
  12. Bootstrap INSPINIA 2.9.3 – 响应式管理模板
  13. chrome浏览器视频加速插件安装教程
  14. mac os sierra卸载java_如何删除Install macOS High Sierra.app
  15. 1月15日科技资讯|微信可直接转账到 QQ;小米联合中国联通推出当前最便宜 5G 套餐;Git 2.25.0 发布
  16. 高等数学(三) 极限
  17. 【FreeRTOS】11 软件定时器
  18. PTA 7-6 鸡群的怜悯 (C语言)
  19. css -- 为什么:last-child 无效?
  20. 水下机器人二维变速圆周运动的SBL定位EKF滤波仿真分析

热门文章

  1. C#语言操作Win7系统任务栏(TaskBar)中程序图标的背景进度条
  2. jquery表情 juqery qq表情适用jQuery QQ表情插件jquery.qqFace
  3. 申宝投资-市场行情整体比较差
  4. 阿里云如何安装部署Oracle11g 图文?
  5. 机器学习实战_朴素贝叶斯分类器_预测疾病
  6. SAP中物料报废无法确定账户问题处理实例
  7. 【网络】 输入www.baidu.com后的过程详解
  8. 2个JS版的MD5加密脚本
  9. Python随堂检测2
  10. 《Java语言程序设计》 课程分析与总结(上)---我为什么这样设计考试试卷?