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

news/2024/7/20 0:48:53 标签: 小程序, spring boot, 微信小程序

文章目录

  • 一、项目介绍
  • 二、项目介绍
  • 三、运行截图
  • 四、主要代码

一、项目介绍

项目演示地址:视频地址

二、项目介绍

项目描述:这是一个基于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, "预订成功!");
}

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, "登录成功!");
    }

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, "评价成功!");
    }

http://www.niftyadmin.cn/n/5110936.html

相关文章

docker安装es分词插件ik详情步骤

1.下载ik查询 根据es版本去下载对应的版本&#xff0c;游览器中输入下面下载链接 https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.7.1/elasticsearch-analysis-ik-8.7.1.zip 2.2.若有对应版本跳过&#xff0c;若没有对应版本&#xff08;比如我需…

Python学习第2天-安装pycharm

文章目录 前言一、下载二、安装1.选择安装目录2.安装配置 总结 前言 好用的工具可以极大地提高生产力&#xff0c;开发Python推荐使用jetbrains全家桶的pycharm。 一、下载 通过官网下载安装包。 二、安装 1.选择安装目录 2.安装配置 一路Next&#xff0c;安装完成 总结 …

【CHI】CHI协议,transaction事务汇总

前言 CHI协议最难的是什么&#xff0c;就是那一堆各种各样的事务&#xff0c;你不知道什么场景应该使用什么合适的事务&#xff0c;收到X事务又该回复什么事务。相当于CHI给你制定了很多种&#xff08;尽可能覆盖完全&#xff09;场景及事务&#xff0c;你需要去了解&#xff0…

数据结构---HashMap和HashSet

HashMap和HashSet都是存储在哈希桶之中&#xff0c;我们可以先了解一些哈希桶是什么。 像这样&#xff0c;一个数组数组的每个节点带着一个链表&#xff0c;数据就存放在链表结点当中。哈希桶插入/删除/查找节点的时间复杂度是O(1) map代表存入一个key值&#xff0c;一个val值…

单独使用logback作为日志

文章目录 引入logback的依赖logback.xml测试 具体配置&#xff0c;可参看&#xff1a;LogBack日志学习&#xff08;全面&#xff09; logback使用实战 log4j使用实战 log4j2使用实战 引入logback的依赖 <?xml version"1.0" encoding"UTF-8"?>…

sql注入的基本手法

目的 通过sqk注入获取数据内容 掌握sql注入基本手法 我们这里使用 1.联合注入 就是利用union select 语句 两条语句 同时执行 实现跨库跨表查询 条件 两条select语句查询结果具有相同列数 对应列数数据类型相同 简单的步骤 1.目标分析 &#xff1f;id…

SpringSecurity源码学习四:会话管理

目录 1. 什么是会话管理2. springSecurity中的session管理怎么做的3. springSecurity源码中的session管理4. 代码示例5. 源码5.1 不同策略的含义 6. 集群模式session管理7. 总结 1. 什么是会话管理 会话管理是指在Java应用程序中管理用户会话状态的过程。在Spring框架中&#…

Python--练习:使用while循环求1~100之间,所有偶数的和(涉及if判断是不是偶数)

案例&#xff1a;求1~100之间&#xff0c;所有偶数的和 思考&#xff1a; 先套用原有基础模式&#xff0c;之后再思考其他的。 其实就是在之前文章 Python--练习&#xff1a;使用while循环求1..100的和-CSDN博客 的基础上&#xff0c;再判断如果获取到里面的全部偶数&#…