• SpringBoot+微信小程序实现的酒店预订小程序系统 附带详细运行指导视频


    一、项目演示

    项目演示地址:视频地址

    二、项目介绍

    项目描述:这是一个基于SpringBoot+微信小程序框架开发的酒店预订小程序系统。首先,这是一个前后端分离的项目,代码简洁规范,注释说明详细,易于理解和学习。其次,这项目功能丰富,具有一个酒店预订小程序系统该有的所有功能。

    项目功能:此项目分为两个角色:普通用户管理员普通用户有微信授权登录、浏览房间信息、提交房间预订订单、浏览酒店图集和配套设施信息、浏览公告信息、管理个人基本信息、查看个人订单信息、管理个人评价信息、发布评价信息等等功能。管理员有管理所有房间信息、管理所有订单信息、管理所有用户信息、管理所有评价信息、管理所有公告信息、管理所有图集信息、浏览收益图表数据等等功能。

    应用技术:SpringBoot + 微信小程序 + MySQL + MyBatis + Redis + ElementUI + Vue + Vant Weapp

    运行环境:IntelliJ IDEA2019.3.5 + 微信开发者工具(项目压缩包中自带)+ MySQL5.7(项目压缩包中自带) + Redis5.0.5(项目压缩包中自带) + JDK1.8 + Maven3.6.3(项目压缩包中自带)+ Node14.16.1(项目压缩包中自带)

    三、运行截图

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    四、主要代码

    1.提交预订房间订单代码:

    /**
     * 提交订单操作
     * @param orderDTO
     * @return
     */
    @Override
    public ResponseDTO<Boolean> submitOrder(OrderDTO orderDTO) {
        ResponseDTO<UserDTO> loginUserResponse = userService.getLoginUser(orderDTO.getToken());
        if(!CodeMsg.SUCCESS.getCode().equals(loginUserResponse.getCode())) {
            return ResponseDTO.errorByMsg(CodeMsg.USER_SESSION_EXPIRED);
        }
        UserDTO loginUserDTO = loginUserResponse.getData();
        // 进行统一表单验证
        CodeMsg validate = ValidateEntityUtil.validate(orderDTO);
        if(!validate.getCode().equals(CodeMsg.SUCCESS.getCode())){
            return ResponseDTO.errorByMsg(validate);
        }
        Room room = roomMapper.selectByPrimaryKey(orderDTO.getRoomId());
        if(room == null) {
            return ResponseDTO.errorByMsg(CodeMsg.ROOM_NOT_EXIST);
        }
        Order order = CopyUtil.copy(orderDTO, Order.class);
        if(order.getNum() > room.getNum()) {
            return ResponseDTO.errorByMsg(CodeMsg.ROOM_NOT_ENOUGH);
        }
        RoomExample roomExample = new RoomExample();
        // 乐观锁控制更新房间余量  防止超卖
        roomExample.createCriteria().andIdEqualTo(room.getId()).andVersionEqualTo(room.getVersion());
        // 版本号 + 1
        room.setVersion(room.getVersion() + 1);
        room.setNum(room.getNum() - order.getNum());
        if(roomMapper.updateByExampleSelective(room, roomExample) == 0) {
            return ResponseDTO.errorByMsg(CodeMsg.ORDER_BUSY);
        }
        order.setId(UuidUtil.getShortUuid());
        order.setCreateTime(new Date());
        order.setRoomType(room.getType());
        order.setRoomPhoto(room.getPhoto());
        order.setUserId(loginUserDTO.getId());
        order.setRoomPrice(room.getPrice());
        order.setTotalPrice(room.getPrice().multiply(new BigDecimal(order.getNum())));
        // 入队操作,队列已满则阻塞等待
        try {
            blockingQueue.put(order);
        } catch (InterruptedException e) {
            e.printStackTrace();
            return ResponseDTO.errorByMsg(CodeMsg.ORDER_BUSY);
        }
        return ResponseDTO.successByMsg(true, "预订成功!");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    2.小程序微信授权登录代码:

    	/**
         * 小程序授权登录验证
         * @param userDTO
         * @return
         */
        @Override
        public ResponseDTO<UserDTO> appWxLogin(UserDTO userDTO) {
            String url = LOGIN_URL + "?appid=" + APP_ID + "&secret="+ APP_SECRET + "&grant_type=authorization_code&js_code=" + userDTO.getCode();
            HttpClient client = HttpClients.createDefault(); // 创建默认http连接
            HttpGet getRequest = new HttpGet(url);// 创建一个post请求
            LoginDTO loginDTO = new LoginDTO();
            try {
                // 用http连接去执行get请求并且获得http响应
                HttpResponse response = client.execute(getRequest);
                // 从response中取到响实体
                HttpEntity entity = response.getEntity();
                // 把响应实体转成文本
                String html = EntityUtils.toString(entity);
                loginDTO = JSON.parseObject(html, LoginDTO.class);
                if(null == loginDTO.getErrcode()) {
                    userDTO.setWxId(loginDTO.getOpenid());
                } else {
                    return ResponseDTO.errorByMsg(CodeMsg.USER_WX_LOGIN_ERROR);
                }
            } catch (Exception e) {
                e.printStackTrace();
                return ResponseDTO.errorByMsg(CodeMsg.USER_WX_LOGIN_ERROR);
            }
            // 使用微信openId查询是否有此用户
            UserExample userExample = new UserExample();
            userExample.createCriteria().andWxIdEqualTo(userDTO.getWxId());
            List<User> userList = userMapper.selectByExample(userExample);
            if(null != userList && userList.size() > 0) {
                // 已经存在用户信息,读取数据库中用户信息
                User user = userList.get(0);
                userDTO = CopyUtil.copy(user, UserDTO.class);
            } else {
                // 数据库中不存在,注册用户信息
                User user = CopyUtil.copy(userDTO, User.class);
                user.setId(UuidUtil.getShortUuid());
                user.setUsername(user.getWxUsername());
                user.setHeadPic(user.getWxHeadPic());
                user.setRoleId(RoleEnum.USER.getCode());
                if(userMapper.insertSelective(user) == 0) {
                    return ResponseDTO.errorByMsg(CodeMsg.USER_REGISTER_ERROR);
                }
                userDTO = CopyUtil.copy(user, UserDTO.class);
            }
            userDTO.setToken(UuidUtil.getShortUuid());
            stringRedisTemplate.opsForValue().set("USER_" + userDTO.getToken(), JSON.toJSONString(userMapper.selectByPrimaryKey(userDTO.getId())), 3600, TimeUnit.SECONDS);
            return ResponseDTO.successByMsg(userDTO, "登录成功!");
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    3.提交评价信息代码:

    	 /**
         * 提交评价信息
         * @param commentDTO
         * @return
         */
        @Override
        public ResponseDTO<Boolean> submitComment(CommentDTO commentDTO) {
            ResponseDTO<UserDTO> loginUserResponse = userService.getLoginUser(commentDTO.getToken());
            if(!CodeMsg.SUCCESS.getCode().equals(loginUserResponse.getCode())) {
                return ResponseDTO.errorByMsg(CodeMsg.USER_SESSION_EXPIRED);
            }
            UserDTO loginUserDTO = loginUserResponse.getData();
            // 进行统一表单验证
            CodeMsg validate = ValidateEntityUtil.validate(commentDTO);
            if(!validate.getCode().equals(CodeMsg.SUCCESS.getCode())){
                return ResponseDTO.errorByMsg(validate);
            }
            Comment comment = CopyUtil.copy(commentDTO, Comment.class);
            comment.setId(UuidUtil.getShortUuid());
            comment.setCreateTime(new Date());
            comment.setUserId(loginUserDTO.getId());
            if(commentMapper.insertSelective(comment) == 0) {
                return ResponseDTO.errorByMsg(CodeMsg.COMMENT_ADD_ERROR);
            }
            return ResponseDTO.successByMsg(true, "评价成功!");
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
  • 相关阅读:
    怎么批量把图片转文字?教你几招轻松完成
    深入理解JavaScript中的事件冒泡与事件捕获
    ssh 免密码登录远程服务器最佳实践
    防御塔攻击小兵,C++观察者模式
    Docker基本操作五 (挂载数据卷)
    postman 密码rsa加密登录-2加密密码
    基于CRC64的通用哈希表(HashMap)的实现(使用golang)
    计算机毕业设计python基于django的少儿编程线上教育系统
    力扣 234. 回文链表
    Java项目:SSM共享汽车租赁平台
  • 原文地址:https://blog.csdn.net/dgfdhgghd/article/details/133965120