From 7b8d5b3f531e2e4919bc95d34f897d2f5f34c777 Mon Sep 17 00:00:00 2001 From: R <2131621843@qq.com> Date: Wed, 29 Oct 2025 16:58:21 +0800 Subject: [PATCH 1/2] =?UTF-8?q?Spring=20MVC=E9=85=8D=E7=BD=AE=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manage/config/CustomMVCConfiguration.java | 34 +++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/jiudian/manage/config/CustomMVCConfiguration.java b/src/main/java/com/jiudian/manage/config/CustomMVCConfiguration.java index 2eaf150..77d6f6b 100644 --- a/src/main/java/com/jiudian/manage/config/CustomMVCConfiguration.java +++ b/src/main/java/com/jiudian/manage/config/CustomMVCConfiguration.java @@ -1,31 +1,36 @@ package com.jiudian.manage.config; -//// 导入Spring相关注解和类 -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.converter.HttpMessageConverter; +//// 导入Spring相关注解和类,是核心组件 +import org.springframework.context.annotation.Bean;//spring对象 +import org.springframework.context.annotation.Configuration;//注释组件 +import org.springframework.http.converter.HttpMessageConverter;//负责 HTTP 请求 / 响应消息转换的组件 import org.springframework.http.converter.StringHttpMessageConverter; -import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;//配置内容协商(如根据请求头确定返回数据格式) +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;// Spring MVC 的配置适配器组件,用于定制 Web 层的行为(如消息转换、拦截器、视图解析等 -import java.nio.charset.Charset; -import java.util.List; +import java.nio.charset.Charset;//Java 标准库中处理字符集的类 +import java.util.List;//Java 集合框架中的列表接口,用于存储转换器集合。 // * 自定义MVC配置类 // * 用于配置HTTP消息转换和内容协商,解决中文乱码问题 // */ -@Configuration +//Spring 会执行这些方法,将返回的对象存入容器(即 “注册 Bean”),供其他组件依赖注入 + +@Configuration //标识当前类是配置类,Spring 会扫描并加载其中的配置。 public class CustomMVCConfiguration extends WebMvcConfigurerAdapter { //创建并配置String类型的HTTP消息转换器 @Bean // 声明这是一个Bean,会被Spring容器管理 - // 创建字符串消息转换器,设置字符集为UTF-8 - public HttpMessageConverter responseBodyConverter() { + // 创建字符串消息转换器,处理响应体中字符串转换,设置字符集为UTF-8 + public HttpMessageConverter responseBodyConverter(){ StringHttpMessageConverter converter = new StringHttpMessageConverter( Charset.forName("UTF-8")); - return converter; + return converter;//返回创建的转换器对象,交给 Spring 容器管理。 } - @Override + @Override//重写父类,自定义消息转换器配置 + //HttpMessageConverter:这是 Spring 框架中定义的HTTP 消息转换器接口 + // ,其中 是泛型通配符,表示该转换器可以处理任意类型的数据。 + //List> converters 表示:一个包含多种 HTTP 消息转换器的列表 public void configureMessageConverters( List> converters) { super.configureMessageConverters(converters); @@ -35,10 +40,11 @@ public class CustomMVCConfiguration extends WebMvcConfigurerAdapter { } @Override +//重写了父类WebMvcConfigurerAdapter中的同名方法,用于自定义 Spring MVC 的内容协商配置 public void configureContentNegotiation( ContentNegotiationConfigurer configurer) { configurer.favorPathExtension(false); } } -// 禁用基于URL路径扩展名的内容协商 +// 禁用基于URL路径扩展名,不能有后缀的内容协商 // 例如:/api/users.json 或 /api/users.xml 这样的URL将不再生效 \ No newline at end of file From 5d3425e0fb766e2534d4eecc6053bd37e82d1b49 Mon Sep 17 00:00:00 2001 From: R <2131621843@qq.com> Date: Wed, 29 Oct 2025 20:35:38 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=8E=A7=E5=88=B6=E5=B1=82=E4=B8=8E?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manage/controller/ConfigController.java | 32 +++++++++++----- .../manage/controller/FileController.java | 21 +++++++--- .../manage/controller/OrderController.java | 29 +++++++++----- .../manage/controller/RoomController.java | 6 +-- .../jiudian/manage/service/UserService.java | 2 +- .../manage/service/impl/UserServiceImpl.java | 38 +++++++++++++++---- 6 files changed, 92 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/jiudian/manage/controller/ConfigController.java b/src/main/java/com/jiudian/manage/controller/ConfigController.java index 31bdded..06a9985 100644 --- a/src/main/java/com/jiudian/manage/controller/ConfigController.java +++ b/src/main/java/com/jiudian/manage/controller/ConfigController.java @@ -1,5 +1,10 @@ package com.jiudian.manage.controller; - +//导入所需的类和注解: +//自定义类:Config(配置信息的实体类)、ConfigService(处理配置业务的服务类)、 +// State(状态常量类,如成功 / 错误码)、StateSignal(统一响应格式工具类)。 +//Spring 注解:@Autowired(依赖注入)、@RestController(标识 REST 控制器)、 +// @RequestMapping(映射 URL 路径)、@RequestParam(接收请求参数)。 +//Java 标准类:Map(用于返回键值对格式的响应数据)。 import com.jiudian.manage.model.Config; import com.jiudian.manage.service.ConfigService; import com.jiudian.manage.until.State; @@ -8,16 +13,21 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; - import java.util.Map; -///** + // * 配置管理控制器 // * 处理与系统配置相关的HTTP请求 -// */ +/*流程:1调用服务层获取配置数据。 + 2通过StateSignal统一封装响应格式(无论成功 / 失败,结构一致,方便前端解析)。 + 3. 返回封装后的 Map(自动转为 JSON 响应给前端)。*/ + @RestController //标记此类为REST控制器,所有方法返回JSON格式数据 -@RequestMapping(value = "/config") //定义基础URL路径 +//建立URL路径与java方法的映射关系,客户端发起HTTP请求,会自动调用该注释的方法 +@RequestMapping(value = "/config") //SpringMVC的注释语法,定义基础URL路径,所有方法的URL都以此为前缀 +//value 是注解的属性,用于指定映射的 URL 路径 +//创建类:配置管理控制器 public class ConfigController { - //自动注入ConfigService服务,依赖注入 + //自动注入ConfigService服务,依赖注入,用于后续调用configservice类中的方法 @Autowired ConfigService configService; @@ -35,13 +45,13 @@ public class ConfigController { // 配置存在,返回成功状态和配置数据 signal.put(State.SuccessCode); signal.put(State.SuccessMessage); - signal.put("config",config); + signal.put("config",config);// 键为"config",值为获取到的配置对象 }else { // 配置不存在,返回错误状态 signal.put(State.ErrorCode); signal.put(State.ErrorMessage); } - return signal.getResult(); + return signal.getResult();//自动转为 JSON 响应给前端 } /** @@ -56,9 +66,11 @@ public class ConfigController { * @param totalroom 总卖出房数 * @return */ - @RequestMapping(value = "/updateConfig.do")//// 定义具体的URL路径 + @RequestMapping(value = "/updateConfig.do")// 定义具体的URL路径 + // 接受HTTP请求,接收前端传递的配置参数,调用服务层执行更新操作 + //@RequestParam:用于绑定 HTTP 请求参数到方法参数 public Map updateConfig(@RequestParam double managesalary,@RequestParam double staffsalary,@RequestParam double cleanerssalary,@RequestParam double manage,@RequestParam double staff,@RequestParam double cleaner,@RequestParam(required = false,defaultValue = "-1") double totalmoney,@RequestParam(required = false,defaultValue = "-1") double totalroom){ - // 调用服务层执行更新操作 + boolean update = configService.update(managesalary, staffsalary, cleanerssalary, manage, staff, cleaner, totalmoney, totalroom); // 创建状态信号对象 StateSignal signal = new StateSignal(); diff --git a/src/main/java/com/jiudian/manage/controller/FileController.java b/src/main/java/com/jiudian/manage/controller/FileController.java index 0d2eca3..b996c8d 100644 --- a/src/main/java/com/jiudian/manage/controller/FileController.java +++ b/src/main/java/com/jiudian/manage/controller/FileController.java @@ -1,5 +1,10 @@ package com.jiudian.manage.controller; - +//导入三类核心资源: +//自定义业务类:UserService(用户相关业务服务)、FileUtil(文件上传工具类)、State(状态常量类)、StateSignal(统一响应格式工具类); +//Spring 注解 / 类:@Autowired(依赖注入)、@RestController(REST 控制器)、@RequestMapping(URL 映射)、@RequestParam(接收请求参数) +// 、MultipartFile(Spring 封装的上传文件对象,用于接收前端上传的文件); +//Java 标准类:File(文件操作)、FileOutputStream(文件输出流,虽未直接用但工具类可能依赖)、Map(响应数据格式)、UUID(生成唯一文件名)、 +// Random(随机数)。 import com.jiudian.manage.service.UserService; import com.jiudian.manage.until.FileUtil; import com.jiudian.manage.until.State; @@ -9,33 +14,39 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartFile;//Spring 封装的上传文件对象,用于接收前端上传的文件 import java.io.File; import java.io.FileOutputStream; import java.util.Map; import java.util.Random; -import java.util.UUID; +import java.util.UUID;//生成唯一文件名 /** * 文件上传控制器 * 主要处理用户头像上传功能 + * 流程:前端发起请求,把文件和用户 ID 传给FileController的upFilePhoto.do接口; + * FileController调用FileUtil保存文件到服务器,同时调用UserService的photo方法; + * UserServiceImpl的photo方法创建User实体,调用UserMapper的updateByPrimaryKeySelective更新数据库; + * 最后通过StateSignal封装响应,返回给前端 “成功 / 失败” 的结果。 */ @RestController //标记为REST控制器,返回JSON格式数据 -@RequestMapping(value = "/upFile") +@RequestMapping(value = "/upFile")//定义控制器基础URL路径/根路径,所有方法URL以此为前缀 public class FileController { // 自动注入UserService服务 @Autowired UserService userService; @RequestMapping("/upFilePhoto.do") + //返回Map类型(会自动转为 JSON),参数为 “上传文件” 和 “用户 ID”; public Map upFilePhoto(@RequestParam MultipartFile file,@RequestParam int userid){ - //接受上传文件和用户Id + //接受前端上传文件和用户Id参数 // 生成唯一的文件名,避免文件名冲突 // 使用UUID+原始文件名 String fileName = UUID.randomUUID().toString()+file.getOriginalFilename(); //定义文件保存路径 // 本地保存路径:项目资源目录下的static/File文件夹 String filePath = ".\\src\\main\\resources\\static\\File\\"; + // 数据库存储的“相对路径”:前端访问时用该路径 String RealfilePath = "File"+"/"+fileName; // 更新用户头像路径到数据库 boolean photo = userService.photo(userid, RealfilePath); diff --git a/src/main/java/com/jiudian/manage/controller/OrderController.java b/src/main/java/com/jiudian/manage/controller/OrderController.java index 0b73bfd..2ed5a36 100644 --- a/src/main/java/com/jiudian/manage/controller/OrderController.java +++ b/src/main/java/com/jiudian/manage/controller/OrderController.java @@ -1,24 +1,31 @@ package com.jiudian.manage.controller; - +//导入核心资源: +//实体类:Order(订单实体,封装订单信息如入住人、时间、房间 ID 等); +//服务层:OrderService(订单服务接口)、OrderServiceImpl(接口的实现类,包含订单业务逻辑); +//工具类:State(状态常量类,如成功 / 错误码)、StateSignal(统一响应格式工具类); +//Spring 注解:@Autowired(依赖注入)、@RestController(REST 控制器)、@RequestMapping(URL 映射)、@RequestParam(接收请求参数); +//Java 标准类:List(存储订单列表)、Map(接口返回的响应数据格式)。 import com.jiudian.manage.model.Order; import com.jiudian.manage.service.OrderService; import com.jiudian.manage.service.impl.OrderServiceImpl; import com.jiudian.manage.until.State; import com.jiudian.manage.until.StateSignal; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.RequestMapping;//URL映射 +import org.springframework.web.bind.annotation.RequestParam;//接受参数请求 +import org.springframework.web.bind.annotation.RestController;//REST控制器 import java.util.List; import java.util.Map; /** * 订单管理控制器 * 处理酒店预订系统中的订单相关操作 - * 这个控制器实现了酒店订单管理的核心功能,包括创建、删除、更新和查询订单 + * 这个控制器实现了酒店订单管理的核心功能,包括创建、删除、更新和分页查询订单 + * 每个接口通过@RequestMapping绑定特定 URL,接收前端参数后调用OrderServiceImpl处理业务; + * 统一使用StateSignal封装响应格式(包含状态码、消息、数据),确保前端能统一解析 */ @RestController -@RequestMapping(value = "/order") +@RequestMapping(value = "/order")//定义该订单控制器的基础路径 public class OrderController { @Autowired OrderServiceImpl orderService; @@ -38,15 +45,18 @@ public class OrderController { public Map addOrder(@RequestParam String householdname,@RequestParam String id,@RequestParam String starttime,@RequestParam String endtime,@RequestParam int roomid,@RequestParam int userid){ // 调用服务层添加订单 boolean b = orderService.addOrder(householdname, id, starttime, endtime, roomid, userid); + // 创建统一响应对象StateSignal,封装响应状态和数据 StateSignal signal = new StateSignal(); if(b){ //添加成功 signal.put(State.SuccessCode); signal.put(State.SuccessMessage); }else { + // 添加失败:存入错误状态码和消 signal.put(State.ErrorCode); signal.put(State.ErrorMessage); } + // 返回封装后的响应(Map类型,自动转为JSON给前端) return signal.getResult(); } @@ -57,6 +67,7 @@ public class OrderController { */ @RequestMapping("/delOrder.do") public Map delOrder(@RequestParam int orderid){ + // 调用服务层的delOrder方法执行删除操作,返回布尔值结果 boolean b = orderService.delOrder(orderid); StateSignal signal = new StateSignal(); if(b){ @@ -106,9 +117,9 @@ public class OrderController { if(allOrder!=null){ signal.put(State.SuccessCode); signal.put(State.SuccessMessage); - signal.put("List",allOrder); - signal.put("pageNum",pageNum); - signal.put("pageSize",pageSize); + signal.put("List",allOrder);//键"List"对应值为订单列表 + signal.put("pageNum",pageNum);//返回当前页码 + signal.put("pageSize",pageSize);//返回每页条数 }else { signal.put(State.ErrorCode); signal.put(State.ErrorMessage); diff --git a/src/main/java/com/jiudian/manage/controller/RoomController.java b/src/main/java/com/jiudian/manage/controller/RoomController.java index f98b248..d4e3017 100644 --- a/src/main/java/com/jiudian/manage/controller/RoomController.java +++ b/src/main/java/com/jiudian/manage/controller/RoomController.java @@ -12,11 +12,11 @@ import org.springframework.web.bind.annotation.RestController; import java.util.List; import java.util.Map; //这个控制器实现了酒店房间管理的完整功能,包括添加、删除、查询和更新房间信息。 -@RestController -@RequestMapping(value = "/room") +@RestController//标识是rest控制器,返回JSON数据 +@RequestMapping(value = "/room")//自定义控制器URL接口路径 public class RoomController { @Autowired - RoomService roomService; + RoomService roomService;//注入服务层依赖,调用方法 @RequestMapping("/addRoom.do") public Map addRoom(@RequestParam String local,@RequestParam double money,@RequestParam int state,@RequestParam int type){ boolean b = roomService.addRoom(local, money, state, type); diff --git a/src/main/java/com/jiudian/manage/service/UserService.java b/src/main/java/com/jiudian/manage/service/UserService.java index 67c96d3..2f174bf 100644 --- a/src/main/java/com/jiudian/manage/service/UserService.java +++ b/src/main/java/com/jiudian/manage/service/UserService.java @@ -47,7 +47,7 @@ public interface UserService { * @param money 增加的业绩额 * @return 是否成功 */ - public boolean addSlary(int userid,double money); + public boolean addSalary(int userid,double money); /** * 获得所有的用户 diff --git a/src/main/java/com/jiudian/manage/service/impl/UserServiceImpl.java b/src/main/java/com/jiudian/manage/service/impl/UserServiceImpl.java index 8ffa541..56988f5 100644 --- a/src/main/java/com/jiudian/manage/service/impl/UserServiceImpl.java +++ b/src/main/java/com/jiudian/manage/service/impl/UserServiceImpl.java @@ -1,10 +1,10 @@ package com.jiudian.manage.service.impl; -import com.github.pagehelper.PageHelper; -import com.jiudian.manage.mapper.UserMapper; -import com.jiudian.manage.model.User; -import com.jiudian.manage.service.UserService; -import com.jiudian.manage.until.UUIDUtil; +import com.github.pagehelper.PageHelper;//分页工具,实现分页查询 +import com.jiudian.manage.mapper.UserMapper;//用户数据库接口 +import com.jiudian.manage.model.User;//用户实现类 +import com.jiudian.manage.service.UserService;//用户服务接口 +import com.jiudian.manage.until.UUIDUtil;//生成用户唯一标识 import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -29,23 +29,28 @@ import java.util.List; //登录验证:验证用户名密码,返回用户 ID 和权限 //权限管理:基于 power 字段实现用户权限控制 @Service -//实现UserService接口的所有方法 +//实现UserService接口的所有抽象方法 public class UserServiceImpl implements UserService { + //服务层通过userMapper调用 Mapper 接口中定义的 SQL 操作,实现 “服务层 - 数据访问层” 的交互 @Autowired UserMapper userMapper; @Override + //查询用户 public User selectUser(int userid) { return userMapper.selectByPrimaryKey(userid); } public boolean addUser(String account, String password, int power){ + //1.创建用户,封装用户信息 User user = new User(); user.setUseraccount(account); user.setPassword(password); user.setPower(power); user.setIdnumber(UUIDUtil.generateShortUuid()); + // 2. 调用UserMapper的insertSelective方法:选择性插入用户(仅插入非null字段) int insert = userMapper.insertSelective(user); + // 3. 根据插入结果返回布尔值:受影响行数>0表示插入成功(返回true),否则失败(返回false) return insert>0?true:false; } @@ -56,9 +61,11 @@ public class UserServiceImpl implements UserService { } @Override + //重写修改用户方法 public boolean alterUser(int userid, String password, String username, int age, int power, String IDnumber,String phonenumber) { User user = new User(); user.setUserid(userid); + // 选择性设置字段:仅当参数不是默认值时,才设置(避免覆盖原有数据) if(!password.equals("null")){ user.setPassword(password); } @@ -77,28 +84,40 @@ public class UserServiceImpl implements UserService { if(!phonenumber.equals("null")){ user.setPhonenumber(phonenumber); } + //调用UserMapper的updateByPrimaryKeySelective方法:选择性更新(仅更新非null字段 int i = userMapper.updateByPrimaryKeySelective(user); return i>0?true:false; } @Override - public boolean addSlary(int userid, double money) { + //重写addsalary方法 + public boolean addSalary(int userid, double money) { + // . 先查询用户当前的薪水(money字段) User user = userMapper.selectByPrimaryKey(userid); + // 获取用户当前薪水 Double money1 = user.getMoney(); + //计算新薪水:原有薪水 + 提成(money) user.setMoney(money+money1); int i = userMapper.updateByPrimaryKey(user); + //根据更新结果返回布尔值 return i>0?true:false; } @Override + //重写查询所有用户方法 public List getAllUser(int pageNum,int pageSize) { PageHelper.startPage(pageNum,pageSize); + // 1. 调用PageHelper.startPage:开启分页功能,传入页码(pageNum)和每页条数(pageSize) return userMapper.getAllUser(); } @Override + //重写根据页面查询用户 public List getUserByPower(int power,int pageNum,int pageSize) { + //开启分页功能 PageHelper.startPage(pageNum,pageSize); + + // 调用UserMapper的selectByPower方法:按权限(power)查询用户(自动分页) return userMapper.selectByPower(power); } @@ -114,11 +133,14 @@ public class UserServiceImpl implements UserService { @Override public boolean photo(int userid, String url) { + //创建User实体类对象,用于封装更新数据 User user = new User(); user.setUserid(userid); user.setPhotourl(url); int i = userMapper.updateByPrimaryKeySelective(user); - return i>0?true:false; + //执行后返回一个 int 类型的结果 i,表示 “受影响的行数” + // (即数据库中实际被更新的记录数,成功时通常为 1,失败时为 0) + return i > 0 ? true : false; }