首页 > 编程语言 >28基于java的简单酒店数据管理

28基于java的简单酒店数据管理

时间:2023-05-06 16:56:44浏览次数:56  
标签:酒店 java err hotel 28 page 数据管理 message id

本文章介绍一个基于java的简单酒店数据管理系统

项目介绍

该项目适用于初学java后,需要一个小练手的java web项目,该项目是只有一个酒店数据表,然后实现对该酒店增加,修改,删除和分页查询的小案例,虽然项目不是很复杂,但麻雀虽小但五脏俱全,适合于个人学习适用。

项目使用的技术架构

后端:java+SpringBoot + MyBatis-Plus
数据库:MySQL
前端:Vue + Element-ui + Axios
开发工具:idea或eclipse
更多项目请查看:项目帮

项目实现

  • HotelController 定义了对酒店信息的CRUD的接口:
@RestController
@RequestMapping("hotel")
public class HotelController {

    @Autowired
    private IHotelService hotelService;

    /**
     * 通过id来查询酒店数据
     * @param id 酒店id号
     * @return
     */
    @GetMapping("/{id}")
    public Hotel queryById(@PathVariable("id") Long id){
        return hotelService.getById(id);
    }

    /**
     * 分页查询数据列表出来
     * @param page 页码
     * @param size 每页的大小
     * @return
     */
    @GetMapping("/list")
    public PageResult hotelList(
            @RequestParam(value = "page", defaultValue = "1") Integer page,
            @RequestParam(value = "size", defaultValue = "1") Integer size
    ){
        Page<Hotel> result = hotelService.page(new Page<>(page, size));
        return new PageResult(result.getTotal(), result.getRecords());
    }

    /**
     * 保存酒店信息
     * @param hotel 酒店信息实体类
     */
    @PostMapping
    public void saveHotel(@RequestBody Hotel hotel){
        hotelService.save(hotel);
    }

    /**
     * 更新酒店信息
     * @param hotel 酒店信息实体类
     */
    @PutMapping()
    public void updateById(@RequestBody Hotel hotel){
        if (hotel.getId() == null) {
            throw new InvalidParameterException("id不能为空");
        }
        hotelService.updateById(hotel);
    }

    /**
     * 通过酒店id删除酒店信息
     * @param id 酒店id号
     */
    @DeleteMapping("/{id}")
    public void deleteById(@PathVariable("id") Long id) {
        hotelService.removeById(id);
    }
}
  • 前端使用的vue
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>简单酒店管理</title>
  <link href="./css/main.css" rel="stylesheet">
</head>
<body>
<div id="app">
  <h1>简单酒店增删改查项目</h1>
  <div class="add-btn" >
    <el-button type="primary" size="small" @click="beginAdd">新增酒店</el-button>
  </div>
  <el-table :data="hotels" border height="500" style="width: 100%">
    <el-table-column align="center" fixed prop="id" label="酒店房间号" width="120"></el-table-column>
    <el-table-column align="center" prop="name" label="酒店名称" width="120"></el-table-column>
    <el-table-column align="center" prop="address" label="酒店地址" width="120"></el-table-column>
    <el-table-column align="center" prop="name" label="酒店名称" width="120"></el-table-column>
    <el-table-column align="center" label="酒店图片" width="200">
      <template slot-scope="scope">
        <img :src="scope.row.pic" height="200" width="200" />
      </template>
    </el-table-column>
    <el-table-column align="center" prop="price" label="酒店价格" width="100"></el-table-column>
    <el-table-column align="center" label="酒店评分" width="200">
      <template slot-scope="scope">
        <el-rate
          v-model="scope.row.score / 10" disabled show-score text-color="#ff9900" score-template="{value}">
        </el-rate>
      </template>
    </el-table-column>
    <el-table-column align="center" prop="brand" label="酒店品牌" width="120"></el-table-column>
    <el-table-column align="center" prop="city" label="所在城市" width="120"></el-table-column>
    <el-table-column align="center" prop="starName" label="酒店星级" width="60"></el-table-column>
    <el-table-column align="center" prop="business" label="所在商圈" width="120"></el-table-column>
    <el-table-column align="center" label="操作" fixed="right" :width="150">
      <template slot-scope="scope">
        <el-button type="primary" plain icon="el-icon-edit" circle
                   @click="handleEdit(scope.$index, scope.row)"></el-button>
        <el-button type="danger" plain icon="el-icon-delete" circle
                   @click="handleDelete(scope.$index, scope.row)"></el-button>
      </template>
    </el-table-column>
  </el-table>
  <el-pagination
      @current-change="query"
      style="margin-top: 5px"
      background
      :page-size="5"
      layout="prev, pager, next"
      :total="total">
  </el-pagination>
  <el-dialog title="酒店信息" :visible.sync="formVisible" width="50%" style="padding: 0 20px;">
    <el-form :model="hotel" size="small" label-position="left" :label-width="formLabelWidth">
      <el-form-item label="酒店名称" >
        <el-input v-model="hotel.name" autocomplete="off"></el-input>
      </el-form-item>
      <el-form-item label="酒店地址" >
        <el-input v-model="hotel.address" autocomplete="off"></el-input>
      </el-form-item>
      <el-form-item label="酒店价格" >
        <el-input v-model="hotel.price" autocomplete="off"></el-input>
      </el-form-item>
      <el-form-item label="酒店评分">
        <el-input v-model="hotel.score" autocomplete="off"></el-input>
      </el-form-item>
      <el-form-item label="酒店品牌">
        <el-input v-model="hotel.brand" autocomplete="off"></el-input>
      </el-form-item>
      <el-form-item label="所在城市">
        <el-input v-model="hotel.city" autocomplete="off"></el-input>
      </el-form-item>
      <el-form-item label="所在商圈">
        <el-input v-model="hotel.business" autocomplete="off"></el-input>
      </el-form-item>
      <el-form-item label="酒店图片" >
        <el-input v-model="hotel.pic" autocomplete="off"></el-input>
      </el-form-item>
      <el-form-item label="酒店纬度" >
        <el-input v-model="hotel.latitude" autocomplete="off"></el-input>
      </el-form-item>
      <el-form-item label="酒店经度" >
        <el-input v-model="hotel.longitude" autocomplete="off"></el-input>
      </el-form-item>
      <el-form-item label="星级" >
        <el-select style="width: 263px" v-model="hotel.starName" placeholder="请选择酒店星级">
          <el-option label="一星级" value="一星级"></el-option>
          <el-option label="二星级" value="二星级"></el-option>
          <el-option label="三星级" value="三星级"></el-option>
          <el-option label="四星级" value="四星级"></el-option>
          <el-option label="五星级" value="五星级"></el-option>
          <el-option label="一钻" value="一钻"></el-option>
          <el-option label="两钻" value="两钻"></el-option>
          <el-option label="三钻" value="三钻"></el-option>
          <el-option label="四钻" value="四钻"></el-option>
          <el-option label="五钻" value="五钻"></el-option>
        </el-select>
      </el-form-item>
    </el-form>
    <div slot="footer" class="dialog-footer">
      <el-button @click="formVisible = false">取 消</el-button>
      <el-button type="primary" @click="confirmEdit">确 定</el-button>
    </div>
  </el-dialog>
</div>
<script src="./js/vue.js"></script>
<script>
  // 设置后台服务地址
  axios.defaults.baseURL = "http://localhost:8099";
  axios.defaults.timeout = 3000;

  const app = new Vue({
    el: "#app",
    data: {
      hotels: [],
      total: 1000,
      formVisible: false, // 是否显示表单
      formLabelWidth: "100px", // 表单label宽度
      hotel: {}, // 表单中的酒店数据
      isEdit: false, // 是否是更新
      lastPage: 1,// 上一次查询的页码
    },
    created() {
      this.query(1);
    },
    methods: {
      beginAdd(){
        this.isEdit = false;
        this.hotel = {};
        this.formVisible = true;
      },
      query(page){
        this.lastPage = page;
        axios.get("/hotel/list", {
            params: {
              page: page, size: 5
            }
          })
          .then(resp => {
            this.hotels = resp.data.hotels;
            this.total = resp.data.total;
          })
          .catch(err => console.log(err));
      },
      handleEdit(v1, v2) {
        this.isEdit = true;
        this.hotel = JSON.parse(JSON.stringify(v2));
        this.formVisible = true;
      },
      handleDelete(v1, v2) {
        this.$confirm('此操作将永久删除酒店信息, 是否继续?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          this.deleteById(v2.id);
        }).catch(() => {
          this.$message({
            type: 'info',
            message: '已取消删除'
          });
        });
      },
      confirmEdit(){
        if(this.isEdit){
          axios.put("/hotel", this.hotel)
            .then(resp => {
              this.$message({
                message: '更新成功',
                type: 'success'
              });
              this.formVisible = false;
              this.reload();
            })
            .catch(err => {
              this.$message({
                message: '更新失败',
                type: 'error'
              });
              console.log(err);
            })
        }else{
          axios.post("/hotel", this.hotel)
            .then(resp => {
              this.$message({
                message: '新增成功',
                type: 'success'
              });
              this.formVisible = false;
              this.reload();
            })
            .catch(err => {
              this.$message({
                message: '新增失败',
                type: 'error'
              });
              console.log(err);
            })
        }

      },
      deleteById(id){
        axios.delete("/hotel/" + id)
        .then(() => {
          this.$message({
            type: 'success',
            message: '删除成功!'
          });
          this.reload();
        })
        .catch(err => {
          this.$message({
            type: 'error',
            message: '删除失败!'
          });
          console.log(err);
        })
      },
      reload(){
        this.query(this.lastPage);
      }
    }
  })
</script>
</body>
</html>

项目实现的效果

  • 首页
    在这里插入图片描述
  • 增加酒店信息页面
    在这里插入图片描述

标签:酒店,java,err,hotel,28,page,数据管理,message,id
From: https://www.cnblogs.com/projecthelp/p/17377906.html

相关文章

  • java filter过滤器 读取配置文件properties的值
    http://www.yayihouse.com/yayishuwu/chapter/29811.获取application.properties的值如userId=1 2.一般实体中采用@Value既可获取@Value("userIdl")privateStringuserId; 但是在filter中,需要用上下文对象来获取filter的生命周期如下:web应用程序启动时,web服务器将创......
  • Java之Object类
    1、Object类概述 Object类存储在java.lang包中,是所有java类(Object类除外)的终极父类(可以在代码中明确地写出声明要“继承Object类”,没有任何错误)。当然,数组也继承了Object类。但是,接口是不继承Object类的。接口只是是抽象类的延伸,可以将它看做是纯粹的抽象类,接口中的所有方法,......
  • Java文件流(IO流)
    在编程中,数据存储是重中之重,在之前的学习中所有程序中的数据都是临时存放在内存中的,不能做到有效存储和长久保存,而本次的文件流就暂时解决了数据不能长久存储的问题(虽然后面会学习数据库存储,但文件流存储也很常用)。须知无论是读取文件还是写入文件等操作,在计算机中都是以流的形式进......
  • javaScript 常用去除 ‘console
    javaScript常用去除‘console.log’办法手动注释掉console.log语句:可以手动在代码中注释掉所有console.log语句,但是这种方法比较繁琐,并且需要手动维护,不太适合大型项目。使用Babel插件去除console.log:Babel是一个JavaScript编译器,它可以将ES6+的代码转换成......
  • java类序列化和反序列化
    参考:https://zhuanlan.zhihu.com/p/144535172?utm_id=0https://blog.csdn.net/qq_42617455/article/details/1096223901、问题解答(1)序列化和反序列化都需要哪些操作对象要实现java.io.Serializable接口增加序列化ID(privatestaticfinallongserialVersionUID)转化成便于传......
  • java内存监控工具及命令
    关键字:内存监控工具及命令一篇非常好的内存监控知识,分享给爱学习的亲们.....jinfo:可以输出并修改运行时的java进程的opts。jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。jstat:一个极强的监视VM......
  • 在java 中, 如果三目运算符 是个函数,函数是一定会被执行吗
    在Java中,如果三目运算符中的取值是一个函数,函数不一定会被执行。这取决于三目运算符的条件表达式的结果。如果三目运算符的条件表达式的结果为true,那么执行函数并返回其结果;如果条件表达式的结果为false,那么不执行函数,直接返回另一个值。下面是一个示例代码:intx=5;int......
  • 27基于java的学生在线考试系统
    一、项目简介随着互联网迅速发展,人们的生活已经越来越离不开互联网,人们足不出户就可以工作、学习等。对于在校学生,通过网络教育不仅可以随时进行网络学习,也可以根据学习的情况自我检测,有利于学生高效、快捷地掌握所学的知识。本系统预设计的基于网络的学生自测系统将实现多种用......
  • GB/T28181-2022相对2016版“基于TCP协议的视音频媒体传输要求“规范解读和技术实现
    ​规范解读GB/T28181-2022和GB/T28181-2016规范,有这么一条“更改了附录D基于TCP协议的视音频媒体传输要求(见附录D,2016年版的附录L)。”。本文主要是针对GB/T28181-2022里面提到的“基于TCP协议的视音频媒体传输要求”做相应的接口适配,在此之前,我们先回顾下规范里面针对......
  • Java获取pdd详情api接口、商品详情、商品描述、宝贝链接获取展示示例
    ​拼多多商品详情就是对拼多多商城中的宝贝的描述了,消费者们在进入到宝贝的详情页面后,可以通过这些描述去了解该款宝贝。其实这样也可以大大的增加商品的转化率。那么它的作用有什么呢?1.突出商品卖点:把商品的特色和突出点写表现出来,很更好的吸引到顾客,让顾客有点击和购买的欲......