采用Spring Boot+Thymeleaf+Mybatis技术框架开发一个菜单信息管理模块,实现以下功能: (1)增删改查菜系信息,当菜系已有菜品时,不能删除菜系信息; (2)增删改查菜品信息,能够上传菜品照片; (3)按菜系名查询菜品信息,支持菜系名模糊查询; (4)按菜名查询菜系信息,支持菜系模糊查询;
时间: 2023-11-17 19:04:49 浏览: 144
好的,这是一个比较典型的CRUD应用,以下是我给出的一个简单实现方案。
一、技术选型
1. Spring Boot:快速搭建项目框架,方便集成各种组件。
2. Thymeleaf:模板引擎,用于前后端渲染。
3. Mybatis:持久层框架,用于操作数据库。
4. MySQL:关系型数据库。
二、数据库设计
针对题目要求,我们需要设计两张表:
1. 菜系表(menu_type)
| 字段名 | 类型 | 说明 |
| --- | --- | --- |
| id | int | 主键 |
| name | varchar(50) | 菜系名称 |
2. 菜品表(menu_item)
| 字段名 | 类型 | 说明 |
| --- | --- | --- |
| id | int | 主键 |
| name | varchar(50) | 菜品名称 |
| price | decimal(8,2) | 菜品价格 |
| pic | varchar(200) | 菜品图片链接 |
| type_id | int | 菜品所属菜系ID |
三、项目结构
```
├── src
│ ├── main
│ │ ├── java
│ │ │ ├── com.example.demo
│ │ │ │ ├── controller
│ │ │ │ │ ├── MenuItemController.java
│ │ │ │ │ └── MenuTypeController.java
│ │ │ │ ├── dao
│ │ │ │ │ ├── MenuItemMapper.java
│ │ │ │ │ └── MenuTypeMapper.java
│ │ │ │ ├── entity
│ │ │ │ │ ├── MenuItem.java
│ │ │ │ │ └── MenuType.java
│ │ │ │ └── service
│ │ │ │ ├── MenuItemService.java
│ │ │ │ └── MenuTypeService.java
│ │ │ ├── DemoApplication.java
│ │ │ ├── config
│ │ │ │ └── MybatisConfig.java
│ │ │ └── exception
│ │ │ └── BusinessException.java
│ │ └── resources
│ │ ├── templates
│ │ │ ├── menu_item.html
│ │ │ └── menu_type.html
│ │ ├── application.properties
│ │ ├── mapper
│ │ │ ├── MenuItemMapper.xml
│ │ │ └── MenuTypeMapper.xml
│ │ └── static
│ │ └── images
│ └── test
│ └── java
└── pom.xml
```
四、核心代码
1. Mybatis配置
```java
@Configuration
@MapperScan("com.example.demo.dao")
public class MybatisConfig {
@Bean
public ConfigurationCustomizer configurationCustomizer() {
return new ConfigurationCustomizer() {
@Override
public void customize(Configuration configuration) {
configuration.setUseGeneratedKeys(true);
}
};
}
}
```
2. 菜系Mapper
```java
@Mapper
public interface MenuTypeMapper {
List<MenuType> listMenuTypes(String name);
MenuType getMenuTypeById(Integer id);
void addMenuType(MenuType menuType);
void updateMenuType(MenuType menuType);
void deleteMenuType(Integer id);
int countMenuItems(Integer typeId);
}
```
3. 菜系Service
```java
@Service
public class MenuTypeService {
@Autowired
private MenuTypeMapper menuTypeMapper;
public List<MenuType> listMenuTypes(String name) {
return menuTypeMapper.listMenuTypes(name);
}
public MenuType getMenuTypeById(Integer id) {
return menuTypeMapper.getMenuTypeById(id);
}
public void addMenuType(MenuType menuType) {
menuTypeMapper.addMenuType(menuType);
}
public void updateMenuType(MenuType menuType) {
menuTypeMapper.updateMenuType(menuType);
}
public void deleteMenuType(Integer id) {
int count = menuTypeMapper.countMenuItems(id);
if (count > 0) {
throw new BusinessException("菜系下有菜品,不能删除");
}
menuTypeMapper.deleteMenuType(id);
}
}
```
4. 菜系Controller
```java
@Controller
@RequestMapping("/menuType")
public class MenuTypeController {
@Autowired
private MenuTypeService menuTypeService;
@GetMapping("/list")
public String listMenuTypes(Model model, String name) {
List<MenuType> list = menuTypeService.listMenuTypes(name);
model.addAttribute("list", list);
model.addAttribute("name", name);
return "menu_type";
}
@GetMapping("/add")
public String addMenuType() {
return "menu_type_edit";
}
@PostMapping("/add")
public String addMenuType(MenuType menuType) {
menuTypeService.addMenuType(menuType);
return "redirect:/menuType/list";
}
@GetMapping("/edit")
public String editMenuType(Model model, Integer id) {
MenuType menuType = menuTypeService.getMenuTypeById(id);
model.addAttribute("menuType", menuType);
return "menu_type_edit";
}
@PostMapping("/edit")
public String editMenuType(MenuType menuType) {
menuTypeService.updateMenuType(menuType);
return "redirect:/menuType/list";
}
@GetMapping("/delete")
public String deleteMenuType(Integer id) {
menuTypeService.deleteMenuType(id);
return "redirect:/menuType/list";
}
}
```
5. 菜品Mapper
```java
@Mapper
public interface MenuItemMapper {
List<MenuItem> listMenuItems(String name, Integer typeId);
MenuItem getMenuItemById(Integer id);
void addMenuItem(MenuItem menuItem);
void updateMenuItem(MenuItem menuItem);
void deleteMenuItem(Integer id);
}
```
6. 菜品Service
```java
@Service
public class MenuItemService {
@Autowired
private MenuItemMapper menuItemMapper;
public List<MenuItem> listMenuItems(String name, Integer typeId) {
return menuItemMapper.listMenuItems(name, typeId);
}
public MenuItem getMenuItemById(Integer id) {
return menuItemMapper.getMenuItemById(id);
}
public void addMenuItem(MenuItem menuItem) {
menuItemMapper.addMenuItem(menuItem);
}
public void updateMenuItem(MenuItem menuItem) {
menuItemMapper.updateMenuItem(menuItem);
}
public void deleteMenuItem(Integer id) {
menuItemMapper.deleteMenuItem(id);
}
}
```
7. 菜品Controller
```java
@Controller
@RequestMapping("/menuItem")
public class MenuItemController {
@Autowired
private MenuItemService menuItemService;
@Autowired
private MenuTypeService menuTypeService;
@GetMapping("/list")
public String listMenuItems(Model model, String name, Integer typeId) {
List<MenuItem> list = menuItemService.listMenuItems(name, typeId);
model.addAttribute("list", list);
model.addAttribute("name", name);
model.addAttribute("typeId", typeId);
List<MenuType> menuTypes = menuTypeService.listMenuTypes(null);
model.addAttribute("menuTypes", menuTypes);
return "menu_item";
}
@GetMapping("/add")
public String addMenuItem(Model model) {
List<MenuType> menuTypes = menuTypeService.listMenuTypes(null);
model.addAttribute("menuTypes", menuTypes);
return "menu_item_edit";
}
@PostMapping("/add")
public String addMenuItem(MenuItem menuItem, MultipartFile file, HttpServletRequest request) throws Exception {
if (!file.isEmpty()) {
String filename = UUID.randomUUID().toString() + "." + StringUtils.getFilenameExtension(file.getOriginalFilename());
String path = request.getServletContext().getRealPath("/") + "upload/";
File dest = new File(path + filename);
if (!dest.getParentFile().exists()) {
dest.getParentFile().mkdirs();
}
file.transferTo(dest);
menuItem.setPic("/upload/" + filename);
}
menuItemService.addMenuItem(menuItem);
return "redirect:/menuItem/list";
}
@GetMapping("/edit")
public String editMenuItem(Model model, Integer id) {
MenuItem menuItem = menuItemService.getMenuItemById(id);
model.addAttribute("menuItem", menuItem);
List<MenuType> menuTypes = menuTypeService.listMenuTypes(null);
model.addAttribute("menuTypes", menuTypes);
return "menu_item_edit";
}
@PostMapping("/edit")
public String editMenuItem(MenuItem menuItem, MultipartFile file, HttpServletRequest request) throws Exception {
if (!file.isEmpty()) {
String filename = UUID.randomUUID().toString() + "." + StringUtils.getFilenameExtension(file.getOriginalFilename());
String path = request.getServletContext().getRealPath("/") + "upload/";
File dest = new File(path + filename);
if (!dest.getParentFile().exists()) {
dest.getParentFile().mkdirs();
}
file.transferTo(dest);
menuItem.setPic("/upload/" + filename);
}
menuItemService.updateMenuItem(menuItem);
return "redirect:/menuItem/list";
}
@GetMapping("/delete")
public String deleteMenuItem(Integer id) {
menuItemService.deleteMenuItem(id);
return "redirect:/menuItem/list";
}
}
```
五、总结
以上就是一个简单的菜单信息管理模块的实现,当然还有很多细节需要注意,比如异常处理、图片上传、页面样式等等。希望能对你有所帮助。
阅读全文