12. 餐桌管理
创建数据库表 tables
CREATE TABLE `tables` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`no` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '餐桌号',
`unit` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '规格',
`free` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '是否空闲',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='餐桌信息';
完成后台的CRUD
TablesController
package com.example.controller;
import com.example.common.Result;
import com.example.entity.Tables;
import com.example.service.TablesService;
import com.github.pagehelper.PageInfo;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/tables")
public class TablesController {
@Resource
TablesService tablesService;
/**
* 新增
*/
@PostMapping("/add")
public Result add(@RequestBody Tables tables) {
tablesService.add(tables);
return Result.success();
}
/**
* 删除
*/
@DeleteMapping("/delete/{id}")
public Result delete(@PathVariable Integer id) {
tablesService.deleteById(id);
return Result.success();
}
/**
* 批量删除
*/
@DeleteMapping("/delete/batch")
public Result delete(@RequestBody List<Integer> ids) {
tablesService.deleteBatch(ids);
return Result.success();
}
/**
* 新增
*/
@PutMapping("/update")
public Result update(@RequestBody Tables tables) {
tablesService.updateById(tables);
return Result.success();
}
/**
* 查询单个
*/
@GetMapping("/selectById/{id}")
public Result selectById(@PathVariable Integer id) {
Tables tables = tablesService.selectById(id);
return Result.success(tables);
}
/**
* 查询所有
*/
@GetMapping("/selectAll")
public Result selectAll(String name) {
List<Tables> list = tablesService.selectAll(name);
return Result.success(list);
}
/**
* 查询所有
*/
@GetMapping("/selectPage")
public Result selectPage(
String name,
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
PageInfo<Tables> pageInfo = tablesService.selectPage(name, pageNum, pageSize);
return Result.success(pageInfo);
}
}
TablesMapper.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.example.mapper.TablesMapper">
<insert id="insert">
insert into tables (no, unit, free)
values (#{no}, #{unit}, #{free})
</insert>
<update id="updateById">
update tables
<set>
<if test="no != null">no = #{no},</if>
<if test="unit != null">unit = #{unit},</if>
<if test="free != null">free = #{free},</if>
</set>
where id = #{id}
</update>
<delete id="deleteById">
delete
from tables
where id = #{id}
</delete>
<select id="selectAll" resultType="com.example.entity.Tables">
select * from tables
<where>
<if test="no != null">
no like concat('%', #{no}, '%')
</if>
</where>
order by id desc
</select>
</mapper>
完成前台页面开发
<template>
<div>
<div class="card" style="margin-bottom: 10px;">
<el-input prefix-icon="Search" style="width: 300px; margin-right: 10px" placeholder="请输入餐桌号查询" v-model="data.no"></el-input>
<el-button type="primary" @click="load">查询</el-button>
<el-button type="info" style="margin: 0 10px" @click="reset">重置</el-button>
</div>
<div class="card" style="margin-bottom: 10px">
<div style="margin-bottom: 10px">
<el-button type="primary" @click="handleAdd">新增</el-button>
</div>
<el-table :data="data.tableData">
<el-table-column prop="id" label="序号" width="70"/>
<el-table-column prop="no" label="餐桌号"/>
<el-table-column prop="unit" label="规格"/>
<el-table-column prop="free" label="是否空闲"></el-table-column>
<el-table-column label="操作" width="180">
<template #default="scope">
<el-button type="primary" @click="handleEdit(scope.row)">编辑</el-button>
<el-button type="danger" @click="del(scope.row.id)">删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="card" v-if="data.total">
<el-pagination background layout="prev, pager, next" @current-change="load" :page-size="data.pageSize" v-model:current-page="data.pageNum" :total="data.total"/>
</div>
<el-dialog v-model="data.formVisible" title="信息" width="40%" destroy-on-close>
<el-form :model="data.form" label-width="100px" style="padding-right: 50px">
<el-form-item label="餐桌号">
<el-input v-model="data.form.no" autocomplete="off" />
</el-form-item>
<el-form-item label="规格">
<el-input v-model="data.form.unit" autocomplete="off" />
</el-form-item>
<el-form-item label="是否空闲">
<el-radio-group v-model="data.form.free">
<el-radio label="是"></el-radio>
<el-radio label="否"></el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="data.formVisible = false">取消</el-button>
<el-button type="primary" @click="save">保存</el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<script setup>
import {reactive} from "vue"
import request from "@/utils/request";
import {ElMessage, ElMessageBox} from "element-plus";
const data = reactive({
tableData: [],
total: 0,
pageNum: 1, // 当前的页码
pageSize: 5, // 每页的个数
formVisible: false,
form: {},
no: '',
})
const load = () => {
request.get('/tables/selectPage', {
params: {
pageNum: data.pageNum,
pageSize: data.pageSize,
no: data.no
}
}).then(res => {
data.tableData = res.data?.list || []
data.total = res.data.total
})
}
load()
const reset = () => {
data.no = null
load()
}
const handleAdd = () => {
data.form = {} // 初始化表单
data.formVisible = true // 打开弹窗
}
// 保存数据
const save = () => {
request.request({
method: data.form.id ? 'PUT' : 'POST',
url: data.form.id ? '/tables/update' : '/tables/add',
data: data.form
}).then(res => {
if (res.code === '200') { //成功
ElMessage.success('操作成功')
data.formVisible = false // 关闭弹窗
load() // 重新加载表格数据
} else {
ElMessage.error(res.msg)
}
})
}
const handleEdit = (row) => {
data.form = JSON.parse(JSON.stringify(row))
data.formVisible = true
}
const del = (id) => {
ElMessageBox.confirm('删除后数据无法恢复,您确认删除吗?', '确认删除', { type: 'warning' }).then(res => {
request.delete('/tables/delete/' + id).then(res => {
if (res.code === '200') { //成功
ElMessage.success('操作成功')
load() // 重新加载表格数据
} else {
ElMessage.error(res.msg)
}
})
}).catch(err => {
console.log(err)
})
}
</script>
完成首页餐桌管理

新增一个接口 用于点餐
@PutMapping("/addOrder")
public Result addOrder(@RequestBody Tables tables) {
tablesService.addOrder(tables);
return Result.success();
}
public void addOrder(Tables tables) {
// 先查询当前的用户有没有占用餐桌
Tables dbTables = tablesMapper.selectByUserId(tables.getUserId());
if (dbTables != null && !dbTables.getId().equals(tables.getId())) {
throw new CustomException("您已经预定了其他餐桌");
}
this.updateById(tables);
}
新增一个接口 根据当前的用户ID查询已经订餐的餐桌
@GetMapping("/selectByUserId/{userId}")
public Result selectByUserId(@PathVariable Integer userId) {
Tables tables = tablesService.selectByUserId(userId);
return Result.success(tables);
}
新增一个接口,退桌
@PutMapping("/removeOrder")
public Result removeOrder(@RequestBody Tables tables) {
tablesService.removeOrder(tables);
return Result.success();
}
public void removeOrder(Tables tables) {
tablesMapper.removeOrder(tables.getId());
}
@Update("update tables set user_id = null, free = '是' where id = #{id}")
void removeOrder(Integer id);
Order.vue
<template>
<div>
<div class="card">
<div v-if="data.table.no">
<div style="display: flex">
<div style="flex: 1">
餐桌号:{{ data.table.no }} 开始点餐
</div>
<el-button type="primary" @click="removeOrder">退桌</el-button>
</div>
<div>
<!-- 展示餐品-->
</div>
</div>
<div style="color:#666;" v-else>
您还未选餐桌,请先 <a href="/home">选择餐桌</a> 再点餐
</div>
</div>
</div>
</template>
<script setup>
import {reactive} from "vue";
import request from "@/utils/request";
import router from "@/router";
import {ElMessage} from "element-plus";
const data = reactive({
table: {},
user: JSON.parse(localStorage.getItem('canteen-user') || '{}')
})
const loadTable = () => {
request.get('/tables/selectByUserId/' + data.user.id).then(res => {
data.table = res.data || {}
})
}
loadTable()
const removeOrder = () => {
request.put('/tables/removeOrder', data.table).then(res => {
if (res.code === '200') {
ElMessage.success('退桌成功')
loadTable()
} else {
ElMessage.error(res.msg)
}
})
}
</script>
<style scoped>
</style>
管理员编辑餐桌的空闲状态
查询用户名称
<select id="selectAll" resultType="com.example.entity.Tables">
select tables.*, user.name as userName from tables
left join user
on tables.user_id = user.id
<where>
<if test="no != null">
tables.no like concat('%', #{no}, '%')
</if>
</where>
order by id desc
</select>
当管理员设置餐桌状态是空闲的时候,我们就设置user_id = null
public void updateById(Tables tables) {
if ("是".equals(tables.getFree())) {
tables.setUserId(null); // 清除占用的顾客信息
}
tablesMapper.updateById(tables);
}
