18. Springboot3+Vue3实现预约审核业务功能

626 字约 2 分钟读完3332 次阅读更新于 2026/5/3

什么叫预约审核业务场景?

  1. 预约实验室、场地、教室:学生预约实验室,产生一个预约记录,管理员进行审核。
  2. 预订酒店、民宿、饭店:用户预订酒店,产生一条预订记录,管理员进行审核。
  3. 图书借阅:学生借阅图书,产生一条借阅记录,管理员审核。
  4. 宠物领养:用户领养宠物,产生一条领养记录,管理员审核。
  5. 课程选课:学生选择课程,产生一条选课记录,教师进行审核(可不要)。
  6. 房屋租赁:用户租赁房屋,产生一条租赁记录,房东进行审核。
  7. 评论审核:用户进行评论,产生一条评论记录,管理员对评论内容进行审核。
  8. 购物车:用户把商品加入到购物车,本质上:用户把商品加入购物车,产生一条购物车记录。
  9. 收藏:用户收藏某个商品(帖子……),产生一条收藏记录。
  10. 点赞:用户点赞某个帖子,产生一条点赞记录。
  11. 评论:用户对某个帖子进行评论,产生一条评论记录。

……

场景特征:首先得有一个模块,某个角色(比如用户)对该模块有一个行为,产生一条该行为对应的记录(新的表)****,然后另一个角色(比如管理员)对这条记录进行“审核”(当然也可以不要)。

预约者只能看到自己相关的数据(这不是必须的,根据业务来)

以图书借阅为例

CREATE TABLE `book` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `img` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '图书封面',
  `name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '图书名字',
  `price` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '图书价格',
  `author` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '图书作者',
  `num` int DEFAULT NULL COMMENT '剩余数量',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='图书信息表';
CREATE TABLE `record` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `user_id` int DEFAULT NULL COMMENT '用户ID',
  `book_id` int DEFAULT NULL COMMENT '图书ID',
  `time` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '借阅时间',
  `status` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '审核状态',
  `reason` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '审核说明',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='借阅记录表';

关键代码

<el-table-column label="操作" width="100">
  <template #default="scope" v-if="data.user.role === 'ADMIN'">
    <el-button type="primary" icon="Edit" circle @click="handleEdit(scope.row)"></el-button>
    <el-button type="danger" icon="Delete" circle @click="del(scope.row.id)"></el-button>
  </template>
  <template #default="scope" v-else>
    <el-button type="primary" @click="borrow(scope.row)">借阅</el-button>
  </template>
</el-table-column>
const borrow = (row) => {
  request.post('/record/add', {
    userId: data.user.id,
    bookId: row.id,
  }).then(res => {
    if (res.code === '200') {
      ElMessage.success('操作成功,等待管理员审核')
      load()
    } else {
      ElMessage.error(res.msg)
    }
  })
}
public void add(Record record) {
    record.setStatus("待审核");
    record.setTime(DateUtil.now());
    recordMapper.insert(record);
    // 图书数量减一
    Book book = bookMapper.selectById(record.getBookId());
    if (ObjectUtil.isNotEmpty(book)) {
        book.setNum(book.getNum() - 1);
        bookMapper.updateById(book);
    }
}

public void update(Record record) {
    recordMapper.updateById(record);
    Account currentUser = TokenUtils.getCurrentUser();
    if ("ADMIN".equals(currentUser.getRole()) && "审核拒绝".equals(record.getStatus())) {
        // 图书归还
        Book book = bookMapper.selectById(record.getBookId());
        if (ObjectUtil.isNotEmpty(book)) {
            book.setNum(book.getNum() + 1);
            bookMapper.updateById(book);
        }
    }
}
<select id="selectAll" resultType="com.example.entity.Record">
    select record.*, book.name as bookName, book.author as bookAuthor, book.img as bookImg, user.name as userName from `record`
    left join book on record.book_id = book.id
    left join user on record.user_id = user.id
    <where>
        <if test="userName != null and userName != ''">and user.name like concat('%', #{userName}, '%')</if>  <!-- 相当于 name like '%1%' -->
    </where>
    order by id desc
</select>