顾客点餐系统-----后端代码编写(基于SSM)
生活随笔
收集整理的這篇文章主要介紹了
顾客点餐系统-----后端代码编写(基于SSM)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 真c++ 从二叉树到红黑树(6)之红黑树
- 下一篇: torch.distributions.