1.创建表添加注释
CREATE TABLE hotel_room (
-- 房间ID,作为主键 自增
room_id INT PRIMARY KEY AUTO_INCREMENT,
-- 房间号,用于标识房间的唯一编号
room_number VARCHAR(10),
-- 房间名称
room_name VARCHAR(100),
-- 所属楼层ID
floor_id INT,
-- 房间类型ID
room_type_id INT,
-- 房间价格,以元或万元表示
room_price DECIMAL(10,2),
-- 折后价,表示房间经过折扣后的价格
room_discount_price DECIMAL(10,2),
-- 床型,描述房间内的床的类型,如单人床、双人床等
bed_type VARCHAR(20),
-- 宽带,表示房间是否提供宽带服务,如ADSL、光纤等
internet VARCHAR(10),
-- 房间描述,对房间的详细描述,包括房间的大小、设施、装修风格等信息
room_description TEXT,
-- 图片封面,展示房间的图片,
image_url VARCHAR(200),
-- 创建时间,记录房间表创建的时间,通常默认设置为当前时间戳
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
创建完成后添加表注释,字段注释
2.搭建基础代码
导入数据
复制controller,mapper,domain等完成后到后台新建房间管理菜单。
运行后
3.新增模态框中的楼层和房间类型
在各自的api中写获取所有楼层和房间类型的方法
后端接口
在room的index中导入这两个api
修改模态框中样式
定义对应的参数
点击新增按钮时调用各自方法获取数据并赋值
书写对应的方法获取数据
取消操作或这关闭模态框
4.前端约束规则
房间号不能超过10位,非空
房间名称不能超过50位,非空
床型不能超过50位,非空
房间类型非空,后端验证
所属楼层非空,后端验证
房价价格非空只能是数字
折后价不能比原价低且只能是数字,非空
宽带情况不能超过500位
5.模态框中的图片
修改ui样式
导入token
定义 图片上传的参数
图片上传处理方法
添加删除酒店封面图片的方法
编写删除图片的请求
处理请求
在FileLoad类中编写处理删除图片的方法
把模态框中的图片封面代码删除
6.房间管理新增
后端验证
修改原来的testFloorNumber为testNumber,其他地方用到的也要改
/** * 新增房间 * * @param hotelRoom 房间 * @return 结果 */ @Override public int insertHotelRoom(HotelRoom hotelRoom) { // 防御性编程 /** * 验证房间号房间号不能超过50位,非空 * 验证房间名称不能超过50位,非空 * 房间类型和所属楼层不能超过50位,非空 * 床型不能超过50位,非空 * 房间价格只能是数字,非空 * 折扣价只能是数字,非空 */ Assert.notNull(hotelRoom,"参数异常"); Assert.notNull(hotelRoom.getRoomTypeId(),"房间类型不能为空"); Assert.notNull(hotelRoom.getFloorId(),"所属楼层不能为空"); Assert.notNull(hotelRoom.getRoomNumber(),"房间号不能为空"); Assert.notNull(hotelRoom.getRoomName(),"房间名称不能为空"); Assert.notNull(hotelRoom.getBedType(),"床型不能为空"); Assert.notNull(hotelRoom.getRoomPrice(),"房间价格不能为空"); Assert.notNull(hotelRoom.getRoomDiscountPrice(),"折后价不能为空"); Assert.state(RegexUtils.testStringNoWuShi(hotelRoom.getRoomNumber()),"房间号不能超过50位"); Assert.state(RegexUtils.testStringNoWuShi(hotelRoom.getRoomName()),"房间名称不能超过50位"); Assert.state(RegexUtils.testStringNoWuShi(hotelRoom.getRoomTypeId().toString()),"房间类型不能超过50位"); Assert.state(RegexUtils.testStringNoWuShi(hotelRoom.getFloorId().toString()),"所属楼层不能超过50位"); Assert.state(RegexUtils.testNumber(hotelRoom.getRoomTypeId().toString()),"房间类型参数异常,非数字"); Assert.state(RegexUtils.testNumber(hotelRoom.getFloorId().toString()),"所属楼层参数异常,非数字"); Assert.state(RegexUtils.testStringNoWuShi(hotelRoom.getBedType()),"床型不能超过50位"); Assert.state(RegexUtils.testNumber(hotelRoom.getRoomPrice().toString()),"房间价格只能是数字"); Assert.state(RegexUtils.testNumber(hotelRoom.getRoomDiscountPrice().toString()),"折后价只能是数字"); Assert.state(hotelRoom.getRoomPrice().compareTo(hotelRoom.getRoomDiscountPrice())>=0,"折扣价要小于原价"); hotelRoom.setCreateTime(DateUtils.getNowDate()); return hotelRoomMapper.insertHotelRoom(hotelRoom); }
7.修改
给图片放权,到若依SecurityConfig和ResourcesConfig中配置放权路径
当点击修改按钮时调用获取房间类型和所属楼层方法,根据id发送请求获取这条数据将它赋值给form
后端
/** * 修改房间 * * @param hotelRoom 房间 * @return 结果 */ @Override public int updateHotelRoom(HotelRoom hotelRoom) { // 防御性编程 /** * 验证房间号房间号不能超过50位,非空 * 验证房间名称不能超过50位,非空 * 房间类型和所属楼层不能超过50位,非空 * 床型不能超过50位,非空 * 房间价格只能是数字,非空 * 折扣价只能是数字,非空 */ Assert.notNull(hotelRoom,"参数异常"); Assert.notNull(hotelRoom.getRoomId(),"房间类型不能为空"); Assert.notNull(hotelRoom.getRoomTypeId(),"房间类型不能为空"); Assert.notNull(hotelRoom.getFloorId(),"所属楼层不能为空"); Assert.notNull(hotelRoom.getRoomNumber(),"房间号不能为空"); Assert.notNull(hotelRoom.getRoomName(),"房间名称不能为空"); Assert.notNull(hotelRoom.getBedType(),"床型不能为空"); Assert.notNull(hotelRoom.getRoomPrice(),"房间价格不能为空"); Assert.notNull(hotelRoom.getRoomDiscountPrice(),"折后价不能为空"); Assert.state(RegexUtils.testStringNoWuShi(hotelRoom.getRoomNumber()),"房间号不能超过50位"); Assert.state(RegexUtils.testStringNoWuShi(hotelRoom.getRoomName()),"房间名称不能超过50位"); Assert.state(RegexUtils.testStringNoWuShi(hotelRoom.getRoomTypeId().toString()),"房间类型不能超过50位"); Assert.state(RegexUtils.testStringNoWuShi(hotelRoom.getFloorId().toString()),"所属楼层不能超过50位"); Assert.state(RegexUtils.testNumber(hotelRoom.getRoomTypeId().toString()),"房间类型参数异常,非数字"); Assert.state(RegexUtils.testNumber(hotelRoom.getFloorId().toString()),"所属楼层参数异常,非数字"); Assert.state(RegexUtils.testStringNoWuShi(hotelRoom.getBedType()),"床型不能超过50位"); Assert.state(RegexUtils.testNumber(hotelRoom.getRoomPrice().toString()),"房间价格只能是数字"); Assert.state(RegexUtils.testNumber(hotelRoom.getRoomDiscountPrice().toString()),"折后价只能是数字"); Assert.state(hotelRoom.getRoomPrice().compareTo(hotelRoom.getRoomDiscountPrice())>=0,"折扣价要小于原价"); return hotelRoomMapper.updateHotelRoom(hotelRoom); }
8.删除
/** * 批量删除房间 * * @param roomIds 需要删除的房间主键 * @return 结果 */ @Override public int deleteHotelRoomByRoomIds(Long[] roomIds) { Assert.notNull(roomIds,"参数异常"); for (Long id:roomIds ) { HotelRoom hotelRoom = hotelRoomMapper.selectHotelRoomByRoomId(id); Assert.notNull(hotelRoom,"参数异常,不存在这个房间号"+hotelRoom.getRoomNumber()); } return hotelRoomMapper.deleteHotelRoomByRoomIds(roomIds); } /** * 删除房间信息 * * @param roomId 房间主键 * @return 结果 */ @Override public int deleteHotelRoomByRoomId(Long roomId) { Assert.notNull(roomId,"参数异常"); HotelRoom hotelRoom = hotelRoomMapper.selectHotelRoomByRoomId(roomId); Assert.notNull(hotelRoom,"该房间不存在"); return hotelRoomMapper.deleteHotelRoomByRoomId(roomId); }
9.表格正常回显酒店封面
对路径进行处理