ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

SSM项目 蟹堡王餐厅管理系统(四)个人信息修改、点餐功能和购物车的实现

2021-09-05 22:07:06  阅读:180  来源: 互联网

标签:return String 蟹堡 resultMap 购物车 SSM int private public


一、个人信息修改

(一)个人信息修改界面的编写

当用户点击带界面时,系统会从session(user)中获取用户名、密码以及uid,并显示在页面上,其中uid设置为只读,用户不可更改。在该界面,用户可以修改自己的用户名、密码以及更换头像。在用户成功修改信息后,会强制登出,重新获取session显示数据。
在这里插入图片描述

UserInformation.jsp:

<%--
  Created by IntelliJ IDEA.
  User: RH
  Date: 2021/8/8
  Time: 16:09
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <link rel="stylesheet" href="layui/css/layui.css"  media="all">
    <style>
        *{margin:0px;padding:0px;}
        form{
            width:80%;
            margin:30px auto;
        }
    </style>
</head>
<body>
<script src="layui/layui.js" charset="utf-8"></script>




<form class="layui-form" action="updateUserPerson" method="post" enctype="multipart/form-data" >
    <div class="layui-form-item">
        <label class="layui-form-label">uid</label>
        <div class="layui-input-block">
            <input type="text" name="uid" required  lay-verify="required"  autocomplete="off" class="layui-input" value="${sessionScope.user.uid}" readonly="readonly">
        </div>
    </div>

    <div class="layui-form-item layui-form-text">
        <label class="layui-form-label">用户名</label>
        <div class="layui-input-block">
            <input type="text" name="userName" required  lay-verify="required"  autocomplete="off" class="layui-input" value="${sessionScope.user.userName}">
        </div>
    </div>

    <div class="layui-form-item">
        <label class="layui-form-label">密码</label>
        <div class="layui-input-block">
            <input type="text" name="userPsd" required  lay-verify="required"  autocomplete="off" class="layui-input" value="${sessionScope.user.userPsd}">
        </div>
    </div>

    <div class="layui-form-item">
        <label class="layui-form-label">用户头像</label>
        <div class="layui-input-block">
            <input type="file" name="ImgFile"class="layui-input">
        </div>
    </div>

    <div class="layui-form-item">
        <div class="layui-input-block">
            <input class="layui-btn" type="submit" value="确认修改" onclick="tologin()">
        </div>
    </div>
</form>


<script type="text/javascript">

    function tologin(){
        alert("修改成功,请重新登录!")

        window.top.location.href="login.jsp";//它表示,从最上层的窗口的地址栏发送请求


    }

    layui.use(['jquery','form'], function(){
        var $ = layui.jquery;
        var form = layui.form;

        form.render();
    });
</script>
</body>
</html>

(二)个人信息修改功能的实现

当用户单击确认修改按钮时,会向后台发出updateUserPerson请求,此时在UserController中新增updateUserPerson()方法。
在这里插入图片描述

UserController :

@Controller
public class UserController {

    @Autowired
    private UserServiceI userServiceI;
    @Autowired
    private ResultMap resultMap;

    @RequestMapping("/login")
    @ResponseBody
    public ResultMap login(String userName, String userPsd, String captcha , HttpSession session) {
        try {
            int authority=userServiceI.login(userName,userPsd,captcha,session);
            resultMap.setStatus(true);
            resultMap.setAuthority(authority);
        } catch (Exception e) {
            resultMap.setStatus(false);
            resultMap.setMessage(e.getMessage());
        }
        return resultMap;
    }


    @RequestMapping("/register")
    @ResponseBody
    public ResultMap insertUserregister(String userName,String userPsd,String sex){
        try{
            userServiceI.insertUserregister(userName,userPsd,sex);
            resultMap.setStatus(true);
        }catch (Exception e){
            resultMap.setStatus(false);
            resultMap.setMessage(e.getMessage());
        }
        return resultMap;
    }

    @RequestMapping("/updateUserPerson")
    public void updateUserPerson(String uid, String userName, String userPsd, MultipartFile ImgFile, HttpSession session, HttpServletRequest request){
        session.invalidate();
        try{
            if(ImgFile.getSize()==0){
                ImgFile=null;
            }
            userServiceI.updateUserPerson(uid,userName,userPsd,ImgFile,request);
        }catch (Exception e){
            resultMap.setStatus(false);
            resultMap.setMessage(e.getMessage());
        }

    }

}

在UserController中,将会调用userServiceI,此时向UserServiceI、UserServiceImpl新增updateUserPerson()方法
UserServiceI:

public interface UserServiceI {

    public int login(String userName, String userPsd, String captcha, HttpSession session);
    
    public int insertUserregister(String userName,String userPsd,String sex);

	public int updateUserPerson(String uid, String userName, String userPsd, MultipartFile ImgFile, HttpServletRequest request);
}

UserServiceImpl:
在这里插入图片描述

@Service
public class UserServiceImpl implements UserServiceI{

    @Autowired
    private UserDao userDao;

    @Override
    public int login(String userName, String userPsd, String captcha, HttpSession session) {
        if(userName.equals("")) {
            throw new RuntimeException("用户名不能为空!");
        }
        if(userPsd.equals("")) {
            throw new RuntimeException("密码不能为空!");
        }
        if(captcha.equals("")) {
            throw new RuntimeException("验证码不能为空!");
        }

        String cap= (String) session.getAttribute("captcha");

        if(!captcha.equalsIgnoreCase(cap)){
            throw new RuntimeException("验证码有误!");
        }

        User user = new User(userName,userPsd);
        user = userDao.login(user);
        if(user == null) {
            throw new RuntimeException("用户名或密码输入有误!");
        }else {
            session.setAttribute("user",user);
        }

        return user.getAuthorityType();
    }

    @Override
    public int insertUserregister(String userName, String userPsd, String sex) {
        if(userName.equals("")) {
            throw new RuntimeException("用户名不能为空!");
        }
        if(userPsd.equals("")) {
            throw new RuntimeException("密码不能为空!");
        }


        User user =new User();
        user.setUserName(userName);
        user.setUserPsd(userPsd);
        user.setSex(sex);
        user.setImgPath("images/defaultHeadimg.png");
        user.setHeadImg("defaultHeadimg.png");
        int num=userDao.insertUser(user);
        if(num==0){
            throw new RuntimeException("新增失败!");
        }

        User getLatestId=userDao.selectLatestId();

        User_Authority user_authority=new User_Authority();
        user_authority.setUid(getLatestId.getUid());
        user_authority.setAid(3);
        num=userDao.insertUserAuthority(user_authority);
        if(num==0){
            throw new RuntimeException("新增权限失败!");
        }
        return num;
    }


    @Override
   	 public int updateUserPerson(String uid, String userName, String userPsd, MultipartFile ImgFile, HttpServletRequest request) {
        User user =new User();
        int Intuid = Integer.parseInt(uid);
        user.setUid(Intuid);
        user.setUserName(userName);
        user.setUserPsd(userPsd);
        Map<String,String> map = getimg(ImgFile,request);
        return updateUserPerson(user,map);
    }

}

在updateUserPerson()方法中,我们需要调用getimg()方法和updateUserPerson()方法。
定义getimg()方法:

    private Map<String,String> getimg(MultipartFile ImgFile, HttpServletRequest request) {
        Map<String,String> map = new HashMap<String,String>();
        if(ImgFile!=null){
        //图片文件原名称
        String userImgName = ImgFile.getOriginalFilename();
        //得到图片的后缀名
        String imgFileExtension = userImgName.substring(userImgName.lastIndexOf("."));
        //生成新得图片名称: 因为上传的文件可能重名
        String newUserImgName = UUID.randomUUID().toString()+imgFileExtension;
        //获得图片要上传到服务器的路径
        String imgServerPath = request.getServletContext().getRealPath("/")+"images/"+newUserImgName;

        //创建图片目标目录
        File targetImgFile = new File(imgServerPath);
        //创建视频目标目录

        //向map中存值: 视频原名称、视频相对路径、图片相对路径
        try {
            ImgFile.transferTo(targetImgFile);//图片上传

            map.put("imgFileName", userImgName);

            //获得图片相对路径: 存入到数据库中
            String imgRelativePath = request.getServletContext().getContextPath()+"/images/"+newUserImgName;
            //获得视频相对路径: 存入到数据库中

            map.put("imgRelativePath", imgRelativePath);

        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        }else {
            map.put("imgFileName", null);
            map.put("imgRelativePath", null);
        }
        return map;
    }

定义updateUserPerson()方法:
在这里插入图片描述

    private int updateUserPerson(User user, Map<String,String> map) {
        user.setHeadImg(map.get("imgFileName"));
        user.setImgPath(map.get("imgRelativePath"));

        int num=userDao.updateUserPerson(user);

        if(num==0){
            throw new RuntimeException("新增失败!");
        }
        return num;
    }

当updateUserPerson()方法调用UserDao时,会调用updateUserPerson()方法,我们需要在UserDao中进行定义。
UserDao:

@Repository
public interface UserDao {

    public User login(User user);
    
    public int insertUser(User user) ;
    
    public User selectLatestId();
    
    public int insertUserAuthority(User_Authority user_authority) ;

    public int updateUserPerson(User user) ;
}

在usermapper.xml中编写sql语句
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.RH.db.dao.UserDao">

    <select id="login" parameterType="com.RH.db.pojo.User" resultType="com.RH.db.pojo.User">
        select u.* ,a.authorityType
        from `user` as u,user_authority as ua,authority as a
        where
        u.userName=#{userName} and u.userPsd=#{userPsd} and u.uid=ua.uid and ua.aid = a.aid
    </select>

    <insert id="insertUser" parameterType="com.RH.db.pojo.User">
        insert into `User` (userName,userPsd,sex,headImg,imgPath)values (#{userName},#{userPsd},#{sex},#{headImg},#{imgPath})
    </insert>
    
     <select id="selectLatestId" resultType="com.RH.db.pojo.User">
        select * from `user` order by uid desc limit 1;
    </select>

    <insert id="insertUserAuthority" parameterType="com.RH.db.pojo.User_Authority">
        insert into user_authority (uid,aid) values (#{uid},#{aid})
    </insert>
    
        <update id="updateUserPerson" parameterType="com.RH.db.pojo.User">
        update `User`
        <trim prefix="set" suffixOverrides=",">
            <if test="userName!=null and userName !='' ">userName=#{userName},</if>
            <if test="userPsd!=null and userPsd !='' ">userPsd=#{userPsd},</if>
            <if test="headImg!=null and headImg !='' ">headImg=#{headImg},</if>
            <if test="imgPath!=null and imgPath !='' ">imgPath=#{imgPath},</if>
        </trim>
       where uid=#{uid}
    </update>
</mapper>

至此,个人信息修改功能实现,后续员工界面和老板界面也是一样,不再重复说明。

二、点餐功能

(一)点餐功能界面的编写

当用户点击点单功能时,会向后端发送selectAllFoodByLimits请求,后端会返回菜品信息(菜品名称、菜品类别、菜品描述、菜品价格、菜品图片),显示在页面上。
在这里插入图片描述
当用户点击订购时,会跳出菜单,用户可在菜单选择订购数量,当用户单击提交时,会将订购菜品提交到购物车中。
在这里插入图片描述
cartTest.jsp:
在这里插入图片描述

<%--
  Created by IntelliJ IDEA.
  User: RH
  Date: 2021/8/9
  Time: 19:58
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>购物车测试</title>
    <link rel="stylesheet" href="layui/css/layui.css"  media="all">

    <style type="text/css">
        .layui-table-cell{
            height:auto!important;
            white-space:normal;
        }

    </style>
</head>
<body>
<script src="layui/layui.js" charset="utf-8"></script>
<!-- 注意:如果你直接复制所有代码到本地,上述 JS 路径需要改成你本地的 -->
<%--显示表格,表格id为data_table--%>
<table class="layui-hide" id="data_table" lay-filter="FoodFilter"></table>
<%--编辑菜单--%>
<script type="text/html" id="editBar">
    <a class="layui-btn layui-btn-xs" lay-event="order">订购</a>
</script>
<script type="text/javascript">
    layui.use(['table','layer','jquery','form'], function() {
        var table = layui.table;
        var layer = layui.layer;
        var $ = layui.jquery;
        var form = layui.form;
        table.render({
            elem: '#data_table'
            , url: 'selectAllFoodByLimits'
            , toolbar: "#addBar"
            , parseData: function (res) { //res 即为原始返回的数据
                return {
                    "code": res.code, //解析接口状态
                    "msg": res.message, //解析提示文本
                    "count": res.total, //解析数据长度
                    "data": res.list //解析数据列表
                };
            }
            , cols: [[
                {field: 'foodName', title: '菜品名称'},
                {field: 'foodType', title: '菜品类别'},
                {field: 'foodDescription', title: '菜品描述'},
                {field: 'foodPrice', title: '菜品价格'},
                {field:'foodImgPath', title:"菜品图片" ,templet: '<div><img src="{{ d.foodImgPath }}" style="width:50px; height:50px;"></div>'},
                {fixed: 'right', title: '操作', toolbar: '#editBar'}	//调用script定义得两个按钮
            ]]
            , page: true	//开启分页
            , limits: [5, 10, 15, 20, 25, 30]	//自定义每页显示多少条数据
        });

        table.on('tool(FoodFilter)', function(obj){//obj代表点击的这一行所有内容,包含两个按钮和数据
            var data = obj.data; //选中的哪一行数据
            var fid = data.fid;
            console.log(obj)
            if(obj.event === 'order'){//点击修改按钮

                layer.open({
                    type:1,
                    title:"请确认选择",
                    content: $("#editPanel").html(),//利用jquery选择器获取元素里面的html内容
                    area:['400px','600px'],
                    btn: ['提交', '重置', '取消'],
                    yes: function(index, layero){
                        var formObj = form.val("editFilter");	//这是js对象,无法发送给后台
                        var jsonStr = JSON.stringify(formObj);	//将js对象转换成json格式字符串

                        $.post('orderInCart',{jsonStr:jsonStr,fid:fid},function(res){

                        },"json");

                          layer.close(index);//关闭弹框
                    },btn2: function(index, layero){
                        form.val('editFilter',{//addFilter得值对应得是 form中带有class="layui-form"得元素上 lay-filter="addFilter"
                            foodName:data.foodName,
                            tid:data.tid,
                            foodDescription:data.foodDescription,
                            foodPrice:data.foodPrice,
                            orderNum:1
                        });
                        return false; //不关闭窗口
                    },btn3: function(index, layero){
                    },success: function(index, layero){
                        //打开修改按钮,显示的面板中应该有所有视频分类,并且默认选择当前视频的类别
                        //利用ajax请求数据,将数据动态写入到select标签中
                        $.ajaxSettings.async = false;//设置ajax为同步状态,只有ajax彻底执行结束,再加载其他内容
                        $.post('selectFoodType',{},function(result){
                            if(result.status){
                                var html = '';
                                var list = result.list;
                                for(var i = 0;i<list.length;i++){
                                    html+='<option value="'+list[i].tid+'">'+list[i].foodType+'</option>';
                                }
                                $("select").append(html);
                            }else{
                                layer.msg(result.message);
                            }
                        },"json");
                        form.val('editFilter',{//addFilter得值对应得是 form中带有class="layui-form"得元素上 lay-filter="addFilter"
                            foodName:data.foodName,
                            tid:data.tid,
                            foodDescription:data.foodDescription,
                            foodPrice:data.foodPrice
                        });
                        //当form表单中出现: 单选框、多选框、下拉菜单、文本域等组件时,是不会显示出来的
                        form.render();
                    }
                });


            }

        });


    });
</script>


<script type="text/html" id="editPanel">
    <form class="layui-form" lay-filter="editFilter">


        <div class="layui-form-item">
            <label class="layui-form-label">uid</label>
            <div class="layui-input-inline">
                <input type="text" name="uid"  class="layui-input" readonly="readonly" value="${sessionScope.user.uid}">
            </div>
        </div>

        <div class="layui-form-item">
            <label class="layui-form-label">用户名</label>
            <div class="layui-input-inline">
                <input type="text" name="userName"  class="layui-input" readonly="readonly" value="${sessionScope.user.userName}">
            </div>
        </div>

        <div class="layui-form-item">
            <label class="layui-form-label">菜品名称</label>
            <div class="layui-input-inline">
                <input type="text" name="foodName"  class="layui-input" readonly="readonly">
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">菜品类别</label>
            <div class="layui-input-inline">
                <select name="tid" lay-verify="required" readonly="readonly"></select>
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">菜品描述</label>
            <div class="layui-input-inline">
                <input type="text" name="foodDescription"  class="layui-input" readonly="readonly">
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">菜品价格</label>
            <div class="layui-input-inline">
                <input type="text" name="foodPrice"  class="layui-input" readonly="readonly">
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">菜品数量</label>
            <div class="layui-input-inline">
                <input type="text" name="orderNum"  class="layui-input" placeholder="请输入订购数量">
            </div>
        </div>
    </form>
</script>
</body>
</html>

(二)点餐功能的实现

(1)菜品显示
新建Food类:

public class Food {

    private int fid;
    private String foodName;
    private String foodDescription;
    private Double foodPrice;
    private String foodImg;
    private String foodImgPath;


    private int tid;
    private String foodType;

    private int ftid;


    public int getTid() {
        return tid;
    }

    public void setTid(int tid) {
        this.tid = tid;
    }

    public String getFoodType() {
        return foodType;
    }

    public void setFoodType(String foodType) {
        this.foodType = foodType;
    }

    public int getFtid() {
        return ftid;
    }

    public void setFtid(int ftid) {
        this.ftid = ftid;
    }

    public int getFid() {
        return fid;
    }

    public void setFid(int fid) {
        this.fid = fid;
    }

    public String getFoodName() {
        return foodName;
    }

    public void setFoodName(String foodName) {
        this.foodName = foodName;
    }

    public String getFoodDescription() {
        return foodDescription;
    }

    public void setFoodDescription(String foodDescription) {
        this.foodDescription = foodDescription;
    }

    public Double getFoodPrice() {
        return foodPrice;
    }

    public void setFoodPrice(Double foodPrice) {
        this.foodPrice = foodPrice;
    }

    public String getFoodImg() {
        return foodImg;
    }

    public void setFoodImg(String foodImg) {
        this.foodImg = foodImg;
    }

    public String getFoodImgPath() {
        return foodImgPath;
    }

    public void setFoodImgPath(String foodImgPath) {
        this.foodImgPath = foodImgPath;
    }
}

新建FoodController类,编写selectAllFoodByLimits()方法。
FoodController:
在这里插入图片描述

@Controller
public class FoodController {

    @Autowired
    private FoodServiceI foodServiceI;
    @Autowired
    private ResultMap resultMap;

    @RequestMapping("/selectAllFoodByLimits")
    @ResponseBody
    public ResultMap selectAllFoodByLimits(int page,int limit){
        try{
            PageHelper.startPage(page, limit);//开启分页
            List<Food> list=foodServiceI.selectAllFoodByLimits();
            PageInfo<Food> pageInfo=new PageInfo<Food>(list);
            long total=pageInfo.getTotal();
            resultMap.setCode(0);
            resultMap.setList(list);
            resultMap.setTotal(total);
        }catch (Exception e){
            resultMap.setCode(1);
            resultMap.setMessage(e.getMessage());
        }
        return resultMap;
    }
}

编写FoodServiceI、FoodServiceImpl。
FoodServiceI:

public interface FoodServiceI {

    public List<Food> selectAllFoodByLimits();

}

FoodServiceImpl:

@Service
public class FoodServiceImpl implements FoodServiceI{

    @Autowired
    private FoodDao foodDao;

    @Override
    public List<Food> selectAllFoodByLimits() {
        return foodDao.selectAllFoodByLimits();
    }

}

编写FoodDao。
FoodDao:

@Repository
public interface FoodDao {

    public List<Food> selectAllFoodByLimits();
    
}

编写foodmapper.xml:
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.RH.db.dao.FoodDao">
    <select id="selectAllFoodByLimits" resultType="com.RH.db.pojo.Food">
        select f.*,t.foodType,t.tid
        from Food as f, `type` as t, food_type as ft
        where f.fid=ft.fid and ft.tid=t.tid
    </select>
</mapper>

接下来需要单独获取菜品种类,在FoodController新增selectFoodType()方法,新建Food_Type类。
Food_Type类:

public class Food_Type {

    private String tid;
    private String foodType;

    public String getTid() {
        return tid;
    }

    public void setTid(String tid) {
        this.tid = tid;
    }

    public String getFoodType() {
        return foodType;
    }

    public void setFoodType(String foodType) {
        this.foodType = foodType;
    }
}

FoodController:

@Controller
public class FoodController {

    @Autowired
    private FoodServiceI foodServiceI;
    @Autowired
    private ResultMap resultMap;

    @RequestMapping("/selectAllFoodByLimits")
    @ResponseBody
    public ResultMap selectAllFoodByLimits(int page,int limit){
        try{
            PageHelper.startPage(page, limit);//开启分页
            List<Food> list=foodServiceI.selectAllFoodByLimits();
            PageInfo<Food> pageInfo=new PageInfo<Food>(list);
            long total=pageInfo.getTotal();
            resultMap.setCode(0);
            resultMap.setList(list);
            resultMap.setTotal(total);
        }catch (Exception e){
            resultMap.setCode(1);
            resultMap.setMessage(e.getMessage());
        }
        return resultMap;
    }

    @RequestMapping("/selectFoodType")
    @ResponseBody
    public ResultMap selectAllType() {
        try {
            List<Food_Type> list = foodServiceI.selectFoodTyprByLimits();
            resultMap.setStatus(true);
            resultMap.setList(list);
        } catch (Exception e) {
            resultMap.setStatus(false);
            resultMap.setMessage(e.getMessage());
        }
        return resultMap;
    }


}

之后在FoodServiceI、FoodServiceImpl新增selectFoodTyprByLimits()方法:
FoodServiceI:

public interface FoodServiceI {

    public List<Food> selectAllFoodByLimits();

	public List<Food_Type> selectFoodTyprByLimits();

}

FoodServiceImpl:

@Service
public class FoodServiceImpl implements FoodServiceI{

    @Autowired
    private FoodDao foodDao;

    @Override
    public List<Food> selectAllFoodByLimits() {
        return foodDao.selectAllFoodByLimits();
    }

    @Override
    public List<Food_Type> selectFoodTyprByLimits() {
        return foodDao.selectFoodTyprByLimits();
    }
}

FoodDao:

@Repository
public interface FoodDao {

    public List<Food> selectAllFoodByLimits();

    public List<Food_Type> selectFoodTyprByLimits();

}

foodmapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.RH.db.dao.FoodDao">
    <select id="selectAllFoodByLimits" resultType="com.RH.db.pojo.Food">
        select f.*,t.foodType,t.tid
        from Food as f, `type` as t, food_type as ft
        where f.fid=ft.fid and ft.tid=t.tid
    </select>

    <select id="selectFoodTyprByLimits" resultType="com.RH.db.pojo.Food_Type">
        select * from `type`
    </select>

</mapper>

此时即可将所有菜品显示在前端。
接下来需要实现将所点菜品提交到购物车中,新建OrderController类,编写addCartItem()方法。
OrderController:

@Controller
public class OrderController {

    @Autowired
    private OrderServiceI orderServiceI;
    @Autowired
    private ResultMap resultMap;


    @RequestMapping("/orderInCart")
    public ResultMap addCartItem(String jsonStr,String fid, HttpServletRequest request) {
        try{
            orderServiceI.addCartItem(jsonStr,fid,request);
            resultMap.setStatus(true);
        }catch (Exception e){
            resultMap.setStatus(false);
            resultMap.setMessage(e.getMessage());
        }

        return resultMap;
    }

}

新建OrderService、OrderServiceImpl。由于我们点单是将,所点菜品存到购物车中,再由购物车进行提交,所以先不用操作数据库,DAO层之后再建。
OrderService:

public interface OrderServiceI {

    void addCartItem(String jsonStr,String fid, HttpServletRequest request) ;
    
}

新建Order_Detils 类:

public class Order_Detils {

    private int odid;
    private int oid;
    private int fid;
    private int uid;
    private String foodName;
    private Double foodPrice;
    private int orderNum;

    private String userName;

    private Double totalMoney;

    public int getOdid() {
        return odid;
    }

    public void setOdid(int odid) {
        this.odid = odid;
    }

    public int getOid() {
        return oid;
    }

    public void setOid(int oid) {
        this.oid = oid;
    }

    public int getFid() {
        return fid;
    }

    public void setFid(int fid) {
        this.fid = fid;
    }

    public int getUid() {
        return uid;
    }

    public void setUid(int uid) {
        this.uid = uid;
    }

    public String getFoodName() {
        return foodName;
    }

    public void setFoodName(String foodName) {
        this.foodName = foodName;
    }

    public Double getFoodPrice() {
        return foodPrice;
    }

    public void setFoodPrice(Double foodPrice) {
        this.foodPrice = foodPrice;
    }

    public int getOrderNum() {
        return orderNum;
    }

    public void setOrderNum(int orderNum) {
        this.orderNum = orderNum;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Double getTotalMoney() {
        return totalMoney;
    }

    public void setTotalMoney(Double totalMoney) {
        this.totalMoney = totalMoney;
    }
}

OrderServiceImpl:
在这里插入图片描述

@Service
public class OrderServiceImpl implements OrderServiceI{

    @Override
    public void addCartItem(String jsonStr,String fid,HttpServletRequest request) {

        Order_Detils order_detils = JSON.parseObject(jsonStr, Order_Detils.class);

        int Intfid = Integer.parseInt(fid);
        order_detils.setFid(Intfid);

        Map<Order_Detils,Integer> map=(Map<Order_Detils,Integer>)request.getSession().getAttribute("orderlist");

        Integer count = null;
        if(map==null) {
            map=new HashMap<Order_Detils,Integer>();
            request.getSession().setAttribute("orderlist", map);
            int num = order_detils.getOrderNum();
            count=num;
        }else {
            //查看该菜品是否存在
            count=map.get(order_detils.getFid());
            //如果购物车没有该菜品
            if(count==null) {
                int num = order_detils.getOrderNum();
                count=num;
            }else {
                //如果有菜品数量++
                int num = order_detils.getOrderNum();
                count=count+num;
            }
        }

        map.put(order_detils,count);
        request.setAttribute("orderlist", map);//将map传到前台


        }

   
}

此时我们已经将点单信息存入购物车中,接下来要新建购物车,查看点单信息。

(三)购物车页面的编写

在这里插入图片描述

show.jsp:

<%@ page import="java.util.Map" %>
<%@ page import="com.RH.db.pojo.Order_Detils" %><%--
  Created by IntelliJ IDEA.
  User: RH
  Date: 2021/8/9
  Time: 21:19
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <link rel="stylesheet" href="layui/css/layui.css"  media="all">
    <script src="js/jquery.min.js"></script>

    <style type="text/css">
        .layui-table-cell{
            height:auto!important;
            white-space:normal;
        }

    </style>
</head>
<body>
<script src="layui/layui.js" charset="utf-8"></script>
<table align="center" class="layui-table" lay-even lay-skin="line" lay-size="lg">

    <colgroup>
        <col width="150">
        <col width="200">
        <col>
    </colgroup>
    <thead>
    <tr>
        <th>商品名称</th>
        <th>商品数量</th>
        <th>商品单价</th>
        <th>商品总价</th>
    </tr>
    </thead>
    <tbody>
    <%
        //获取购物车




        Map<Order_Detils,Integer> map= (Map<Order_Detils, Integer>) session.getAttribute("orderlist");
        //判断购物车是否为空
        if(map==null){

            out.print("<tr><td colspan='2'>未进行点单!</td></tr>");
        }else{
            //若不为空,遍历购物车

            double total=0;
            for(Order_Detils name :map.keySet()){
                total=total+name.getFoodPrice()*name.getOrderNum();
                out.print("<tr>");
                out.print("<td>");
                out.print(name.getFoodName());
                out.print("</td>");

                out.print("<td>");
                out.print(map.get(name));
                out.print("</td>");

                out.print("<td>");
                out.print(name.getFoodPrice());
                out.print("</td>");

                out.print("<td>");
                out.print(name.getFoodPrice()*name.getOrderNum());
                out.print("</td>");


            }
            out.print("</tr>");

            out.print("<tr>");

            out.print("<td>");
            out.print("</td>");

            out.print("<td>");
            out.print("</td>");

            out.print("<td>");
            out.print("</td>");

            out.print("<td>");
            out.print(total);
            out.print("</td>");

            out.print("</tr>");


        }

    %>
     </tbody>
</table>


<hr>
<center>
    <button onclick="sent()">提交订单 </button>
</center>

<script>
    function sent() {
            $.post('getorder',{},function(res){
            },"json");
        alert("提交成功!")
    }
</script>

</body>
</html>

(四)购物车功能的实现

当用户点击跳转至购物车界面,即可查看已点菜品信息,当用户单击提交时会向后台发送getorder请求。
在这里插入图片描述
在OrderController中新增getorder()方法
在这里插入图片描述
OrderController:

@Controller
public class OrderController {

    @Autowired
    private OrderServiceI orderServiceI;
    @Autowired
    private ResultMap resultMap;


    @RequestMapping("/orderInCart")
    public ResultMap addCartItem(String jsonStr,String fid, HttpServletRequest request) {
        try{
            orderServiceI.addCartItem(jsonStr,fid,request);
            resultMap.setStatus(true);
        }catch (Exception e){
            resultMap.setStatus(false);
            resultMap.setMessage(e.getMessage());
        }

        return resultMap;
    }

    @RequestMapping("/getorder")
    public ResultMap getorder(HttpSession session) {
        try{
            orderServiceI.getorder(session);
            resultMap.setStatus(true);
        }catch (Exception e){
            resultMap.setStatus(false);
            resultMap.setMessage(e.getMessage());
        }

        return resultMap;
    }

}

在orderServiceI、orderServiceImpl中新增getorder()方法。
orderServiceI:

public interface OrderServiceI {

    void addCartItem(String jsonStr,String fid, HttpServletRequest request) ;

	public void getorder(HttpSession session);
    
}

新建Order类:

public class Order {

    private int oid;
    private int uid;
    private String userName;
    private Double totalMoney;


    public int getOid() {
        return oid;
    }

    public void setOid(int oid) {
        this.oid = oid;
    }

    public int getUid() {
        return uid;
    }

    public void setUid(int uid) {
        this.uid = uid;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Double getTotalMoney() {
        return totalMoney;
    }

    public void setTotalMoney(Double totalMoney) {
        this.totalMoney = totalMoney;
    }
}

orderServiceImpl:
在这里插入图片描述

@Service
public class OrderServiceImpl implements OrderServiceI{


    @Autowired
    private OrderDao orderDao;

    @Override
    public void addCartItem(String jsonStr,String fid,HttpServletRequest request) {

        Order_Detils order_detils = JSON.parseObject(jsonStr, Order_Detils.class);

        int Intfid = Integer.parseInt(fid);
        order_detils.setFid(Intfid);

        Map<Order_Detils,Integer> map=(Map<Order_Detils,Integer>)request.getSession().getAttribute("orderlist");

        Integer count = null;
        if(map==null) {
            map=new HashMap<Order_Detils,Integer>();
            request.getSession().setAttribute("orderlist", map);
            int num = order_detils.getOrderNum();
            count=num;
        }else {
            //查看该菜品是否存在
            count=map.get(order_detils.getFid());
            //如果购物车没有该菜品
            if(count==null) {
                int num = order_detils.getOrderNum();
                count=num;
            }else {
                //如果有菜品数量++
                int num = order_detils.getOrderNum();
                count=count+num;
            }
        }

        map.put(order_detils,count);
        request.setAttribute("orderlist", map);//将map传到前台


        }

  
    @Override
    public void getorder(HttpSession session) {
        System.out.println("service");
        Map<Order_Detils,Integer> map= (Map<Order_Detils, Integer>) session.getAttribute("orderlist");

        double totalMoney=0;
        Order_Detils order_detils=new Order_Detils();
        Order order=new Order();

        int uid=0;
        String userName=null;
        for (Order_Detils data:map.keySet()) {
            uid=data.getUid();
            userName=data.getUserName();
        }


        order.setUid(uid);
        order.setUserName(userName);

        /*向数据库中插入order表,生成自增主键*/
        orderDao.insertOrder(order);

        int getoid=orderDao.selectLatestId().getOid();


        for (Order_Detils data:map.keySet()) {
            totalMoney=totalMoney+data.getFoodPrice()*data.getOrderNum();

            order_detils.setOid(getoid);
            order_detils.setFid(data.getFid());
            order_detils.setFoodName(data.getFoodName());
            order_detils.setFoodPrice(data.getFoodPrice());
            order_detils.setOrderNum(data.getOrderNum());

            /*获取订单id后,向数据库中添加订单详情*/
            int num=orderDao.insertOrderDetis(order_detils);
            if (num==0){
                throw new RuntimeException("新增订单详情失败!");
            }
        }

        order.setOid(getoid);
        order.setTotalMoney(totalMoney);

        int num=orderDao.updateOrder(order);

        ((Map<Order_Detils, Integer>) session.getAttribute("orderlist")).clear();

        if (num==0){
            throw new RuntimeException("更新订单金额失败!");
        }

    }
}

新建OrderDao,新建insertOrder()、selectLatestId()、insertOrderDetis()、updateOrder()方法

@Repository
public interface OrderDao {

    public int insertOrder(Order order);

    public Order selectLatestId();

    public int insertOrderDetis(Order_Detils order_detils);

    public int updateOrder(Order order);

}

新建ordermapper.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.RH.db.dao.OrderDao">

    <insert id="insertOrder" parameterType="com.RH.db.pojo.Order">
        insert into `order` (uid,userName) values (#{uid},#{userName});
    </insert>

    <select id="selectLatestId" resultType="com.RH.db.pojo.Order">
        select * from `order` order by oid desc limit 1;
    </select>

    <insert id="insertOrderDetis" parameterType="com.RH.db.pojo.Order_Detils">
        insert into order_detils (oid,fid,foodName,foodPrice,orderNum) values (#{oid},#{fid},#{foodName},#{foodPrice},#{orderNum});
    </insert>

    <update id="updateOrder" parameterType="com.RH.db.pojo.Order">
        update `order` set totalMoney=#{totalMoney} where oid = #{oid}
    </update>
</mapper>

至此为止个人信息修改、点餐功能和购物车已经完全实现。

标签:return,String,蟹堡,resultMap,购物车,SSM,int,private,public
来源: https://blog.csdn.net/RHchino/article/details/120105696

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有