|
|
@ -31,121 +31,158 @@ import java.util.Map;
|
|
|
|
* @Date 2019/1/2 17:32
|
|
|
|
* @Date 2019/1/2 17:32
|
|
|
|
* @CONTACT 317758022@qq.com
|
|
|
|
* @CONTACT 317758022@qq.com
|
|
|
|
* @DESC 后台商品服务
|
|
|
|
* @DESC 后台商品服务
|
|
|
|
|
|
|
|
* 该类是一个Spring框架下的RESTful风格的控制器类,用于处理后台管理系统中与商品相关的各种操作请求,
|
|
|
|
|
|
|
|
* 比如获取商品列表、搜索商品、上传商品图片、管理商品上下架状态以及保存或更新商品信息等功能,
|
|
|
|
|
|
|
|
* 通过调用相应的业务层服务(如 `IProductService`、`IFileService` 等)来完成具体的业务逻辑处理,
|
|
|
|
|
|
|
|
* 并将处理结果以合适的格式(通过 `ServerResponse` 包装)返回给客户端(通常是后台管理系统的前端页面),同时进行了必要的异常处理和日志记录,便于系统的维护和问题排查。
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
@RestController
|
|
|
|
@RestController
|
|
|
|
|
|
|
|
// 表明这个类是一个RESTful风格的控制器,结合了 `@Controller` 和 `@ResponseBody` 的功能,使得类中的方法返回值会直接作为HTTP响应的主体内容(一般是JSON格式等)返回给客户端,
|
|
|
|
|
|
|
|
// 适用于构建前后端分离的后台管理系统接口层,无需额外配置视图解析等操作。
|
|
|
|
|
|
|
|
|
|
|
|
@RequestMapping("/manage/product")
|
|
|
|
@RequestMapping("/manage/product")
|
|
|
|
|
|
|
|
// 定义该控制器类中所有方法的基础请求路径,表明这些接口是用于后台管理系统中商品相关操作的,将接口路径统一以 `/manage/product` 开头,便于管理和区分不同模块的接口。
|
|
|
|
|
|
|
|
|
|
|
|
@Slf4j
|
|
|
|
@Slf4j
|
|
|
|
|
|
|
|
// 使用Lombok的 `@Slf4j` 注解自动生成名为 `log` 的 `SLF4J` 日志记录器,用于在类中记录不同级别(如 `info`、`error` 等)的日志信息,方便后续查看接口请求处理过程、排查问题等操作。
|
|
|
|
|
|
|
|
|
|
|
|
public class ProductManageController {
|
|
|
|
public class ProductManageController {
|
|
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
@Autowired
|
|
|
|
private IProductService productService;
|
|
|
|
private IProductService productService;
|
|
|
|
@Autowired
|
|
|
|
@Autowired
|
|
|
|
private IFileService fileService;
|
|
|
|
private IFileService fileService;
|
|
|
|
@Autowired
|
|
|
|
@Autowired
|
|
|
|
private CommonCacheUtil commonCacheUtil;
|
|
|
|
private CommonCacheUtil commonCacheUtil;
|
|
|
|
|
|
|
|
// 通过Spring的依赖注入(`@Autowired` 注解),分别将实现了 `IProductService`(商品业务逻辑接口)、`IFileService`(文件相关业务逻辑接口)以及 `CommonCacheUtil`(缓存操作工具类)的具体实例注入到当前控制器中,
|
|
|
|
|
|
|
|
// 这样在各个接口方法中就可以方便地调用对应的业务方法和工具方法,实现了控制器层与业务层、工具类的解耦,便于代码的维护和扩展。
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 产品list
|
|
|
|
* 产品list
|
|
|
|
|
|
|
|
* 该方法用于处理获取商品列表的HTTP请求,接收页码和每页数量作为参数,默认页码为 `1`,每页数量为 `10`,
|
|
|
|
|
|
|
|
* 通过调用 `productService` 的 `list` 方法获取相应分页的商品列表信息,然后将结果(包装在 `ServerResponse` 中,包含商品列表及相关分页数据等)返回给客户端,
|
|
|
|
|
|
|
|
* 客户端(后台管理系统的商品列表页面)可以根据返回结果展示商品列表,并进行分页导航等操作。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param pageNum 要获取的商品列表的页码,是一个整数类型的参数,通过 `defaultValue = "1"` 指定了默认值为 `1`,表示如果客户端没有传入页码参数,则默认查询第一页的商品列表,
|
|
|
|
|
|
|
|
* 用于实现分页功能,方便客户端根据用户操作请求不同页码的商品信息,业务层会依据此页码以及每页数量等参数计算并返回对应页的商品数据。
|
|
|
|
|
|
|
|
* @param pageSize 每页显示的商品数量,是一个整数类型的参数,默认值为 `10`,用于控制每页展示的商品个数,与 `pageNum` 参数配合实现分页功能,
|
|
|
|
|
|
|
|
* 业务层会根据该参数从数据库等数据源中获取指定数量的商品作为一页的内容返回给客户端,便于展示和浏览商品列表。
|
|
|
|
|
|
|
|
* @return 返回一个 `ServerResponse` 对象,其内部包含了分页后的商品列表信息以及相关分页数据(如总页数、总记录数等,通常由 `PageInfo` 类型来承载这些信息),
|
|
|
|
|
|
|
|
* 这个响应结果会被自动转换为合适的格式(如JSON)返回给客户端,告知客户端商品列表获取操作的成功与否以及对应的商品列表和分页情况。
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
@RequestMapping("/list.do")
|
|
|
|
@RequestMapping("/list.do")
|
|
|
|
public ServerResponse list(@RequestParam(value = "pageNum",defaultValue = "1") int pageNum,
|
|
|
|
public ServerResponse list(@RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
|
|
|
|
@RequestParam(value = "pageSize",defaultValue = "10") int pageSize){
|
|
|
|
@RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
|
|
|
|
return productService.list(pageNum,pageSize);
|
|
|
|
return productService.list(pageNum, pageSize);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 产品搜索
|
|
|
|
* 产品搜索
|
|
|
|
|
|
|
|
* 此方法用于处理商品搜索的HTTP请求,接收商品名称、商品ID以及页码、每页数量作为参数,页码和每页数量有默认值,
|
|
|
|
|
|
|
|
* 通过调用 `productService` 的 `search` 方法按照传入的搜索条件(商品名称模糊搜索、根据商品ID精准搜索等)进行商品搜索操作,
|
|
|
|
|
|
|
|
* 并将搜索结果(包含符合条件的商品列表以及分页信息,包装在 `ServerResponse` 中,其泛型为 `PageInfo`)返回给客户端,
|
|
|
|
|
|
|
|
* 客户端(后台管理系统的搜索页面)可以根据返回结果展示搜索到的商品列表,方便管理员快速查找特定的商品。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param productName 商品名称,是一个字符串类型的参数,用于进行模糊搜索商品,业务层会根据这个名称在数据库等数据源中查找名称包含该字符串的商品信息,
|
|
|
|
|
|
|
|
* 若不传该参数,则表示不基于商品名称进行搜索,可通过其他条件(如商品ID等)或者返回全部商品(结合分页等情况)进行展示。
|
|
|
|
|
|
|
|
* @param productId 商品的唯一标识符,是一个整数类型的参数,用于精准查找特定的商品,如果传入商品ID,则业务层会优先查找该ID对应的商品信息,
|
|
|
|
|
|
|
|
* 不传该参数时,可结合商品名称等其他条件进行搜索或者返回符合其他条件的商品列表情况。
|
|
|
|
|
|
|
|
* @param pageNum 要获取的商品列表的页码,与 `list` 方法中的页码参数含义相同,默认值为 `1`,用于实现分页功能,方便根据不同页码获取搜索结果中的商品列表,
|
|
|
|
|
|
|
|
* 业务层会根据该页码以及每页数量等参数计算并返回对应页的商品数据。
|
|
|
|
|
|
|
|
* @param pageSize 每页显示的商品数量,与 `list` 方法中的每页数量参数含义相同,默认值为 `10`,用于控制每页展示的商品个数,与页码参数配合实现分页功能,
|
|
|
|
|
|
|
|
* 业务层会按照该参数从数据源中获取指定数量的商品作为一页的内容返回给客户端,便于展示搜索到的商品列表。
|
|
|
|
|
|
|
|
* @return 返回一个 `ServerResponse` 对象,其泛型参数为 `PageInfo`,包含了符合搜索条件的商品列表数据以及分页相关的信息(如总页数、总记录数等),
|
|
|
|
|
|
|
|
* 这个响应结果会被自动转换为合适的格式(如JSON)返回给客户端,告知客户端商品搜索操作的成功与否以及对应的商品列表和分页数据情况,方便客户端进行展示和进一步操作。
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
@RequestMapping("search.do")
|
|
|
|
@RequestMapping("search.do")
|
|
|
|
public ServerResponse<PageInfo> search(String productName,
|
|
|
|
public ServerResponse<PageInfo> search(String productName,
|
|
|
|
Integer productId,
|
|
|
|
Integer productId,
|
|
|
|
@RequestParam(value = "pageNum",defaultValue = "1") int pageNum,
|
|
|
|
@RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
|
|
|
|
@RequestParam(value = "pageSize",defaultValue = "10") int pageSize){
|
|
|
|
@RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
|
|
|
|
|
|
|
|
|
|
|
|
return productService.search(productName,productId,pageNum,pageSize);
|
|
|
|
return productService.search(productName, productId, pageNum, pageSize);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 图片上传
|
|
|
|
* 图片上传
|
|
|
|
|
|
|
|
* 该方法用于处理商品图片上传的HTTP请求,接收一个文件类型的参数(通过 `MultipartFile` 表示上传的文件)以及 `HttpServletRequest` 对象用于获取服务器相关路径信息,
|
|
|
|
|
|
|
|
* 通过调用 `fileService` 的 `upload` 方法将文件上传到服务器指定路径下,并构建上传后图片的访问路径,将包含图片相关信息(文件名、访问路径等)的 `Map` 数据封装在 `ServerResponse` 中返回给客户端,
|
|
|
|
|
|
|
|
* 客户端(后台管理系统的图片上传功能模块)可以根据返回结果获取图片上传情况以及后续使用图片的访问路径等信息,同时记录了图片上传路径的日志信息,便于后续查看和排查上传问题。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param file 要上传的文件,是一个 `MultipartFile` 类型的参数,代表从客户端(如浏览器)上传的文件对象,包含了文件的内容、文件名、文件类型等信息,
|
|
|
|
|
|
|
|
* 可以是商品图片文件,通过此参数将文件传递到服务器端进行上传操作,该参数可选(通过 `required = false` 指定),如果没有传入文件,则可能根据业务逻辑进行相应处理(如返回错误提示等)。
|
|
|
|
|
|
|
|
* @param request `HttpServletRequest` 对象,用于获取服务器端的相关信息,在这里主要用于获取当前会话的上下文路径,确定文件上传的目标路径,
|
|
|
|
|
|
|
|
* 通过它可以获取到服务器上用于存放上传文件的实际路径,保证文件能够正确上传到指定的位置,方便后续的访问和管理。
|
|
|
|
|
|
|
|
* @return 返回一个 `ServerResponse` 对象,其内部包含了一个 `Map` 类型的数据,这个 `Map` 中存放了上传图片的相关信息,比如文件名(`uri` 键对应的值)以及图片的完整访问路径(`url` 键对应的值),
|
|
|
|
|
|
|
|
* 响应结果会被自动转换为合适的格式(如JSON)返回给客户端,告知客户端图片上传操作的成功与否以及对应的图片相关信息,方便客户端在需要展示图片或者关联图片到商品等操作时使用这些信息。
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
@RequestMapping("upload.do")
|
|
|
|
@RequestMapping("upload.do")
|
|
|
|
public ServerResponse upload(@RequestParam(value = "upload_file",required = false) MultipartFile file, HttpServletRequest request){
|
|
|
|
public ServerResponse upload(@RequestParam(value = "upload_file", required = false) MultipartFile file, HttpServletRequest request) {
|
|
|
|
String path = request.getSession().getServletContext().getRealPath("upload");
|
|
|
|
String path = request.getSession().getServletContext().getRealPath("upload");
|
|
|
|
String targetFileName = fileService.upload(file,path);
|
|
|
|
// 通过 `HttpServletRequest` 获取当前会话的 `ServletContext`,再调用其 `getRealPath` 方法获取服务器上 `upload` 目录的实际物理路径,
|
|
|
|
String url = "http://img.oursnail.cn/"+targetFileName;
|
|
|
|
// 这个路径就是文件将要上传到的目标位置,确保文件能够被存储到服务器指定的目录下,便于后续的访问和管理,需要确保服务器上该目录具有相应的写入权限等条件。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
String targetFileName = fileService.upload(file, path);
|
|
|
|
|
|
|
|
// 调用 `fileService` 的 `upload` 方法,传入要上传的文件对象和目标路径,执行文件上传操作,该方法会返回上传后文件在服务器上的文件名(可能经过了重命名等处理),
|
|
|
|
|
|
|
|
// 后续可以根据这个文件名构建完整的图片访问路径等操作,具体的文件上传逻辑(如文件类型校验、保存方式等)由 `fileService` 的 `upload` 方法实现。
|
|
|
|
|
|
|
|
|
|
|
|
log.info("【上传的图片路径为:{}】",url);
|
|
|
|
String url = "http://img.oursnail.cn/" + targetFileName;
|
|
|
|
|
|
|
|
// 构建上传图片的完整访问路径,通常是将服务器的域名(这里假设为 `http://img.oursnail.cn/`)与上传后文件的文件名进行拼接,
|
|
|
|
|
|
|
|
// 得到一个可以通过网络访问该图片的URL地址,方便客户端后续通过这个地址来展示或使用该图片,例如在商品详情页面展示商品图片等场景。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
log.info("【上传的图片路径为:{}】", url);
|
|
|
|
|
|
|
|
// 使用日志记录器记录上传图片的路径信息,方便后续查看文件上传的结果以及排查可能出现的图片访问问题,比如图片无法显示时可以通过日志查看是否上传成功以及路径是否正确等情况。
|
|
|
|
|
|
|
|
|
|
|
|
Map fileMap = Maps.newHashMap();
|
|
|
|
Map fileMap = Maps.newHashMap();
|
|
|
|
fileMap.put("uri",targetFileName);
|
|
|
|
fileMap.put("uri", targetFileName);
|
|
|
|
fileMap.put("url",url);
|
|
|
|
fileMap.put("url", url);
|
|
|
|
log.info("【返回数据为:{}】",fileMap);
|
|
|
|
// 创建一个新的 `Map` 对象,用于存放图片相关的信息,将上传后文件的文件名以 `uri` 为键存入 `Map`,将构建好的图片完整访问路径以 `url` 为键也存入 `Map`,
|
|
|
|
|
|
|
|
// 这样可以方便地将这些信息作为一个整体返回给客户端,客户端可以根据 `Map` 中的键获取相应的值进行后续操作。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
log.info("【返回数据为:{}】", fileMap);
|
|
|
|
|
|
|
|
// 再次使用日志记录器记录将要返回给客户端的数据信息,便于在排查问题时了解接口返回的数据内容是否符合预期,确保数据的准确性和完整性。
|
|
|
|
|
|
|
|
|
|
|
|
return ServerResponse.createBySuccess(fileMap);
|
|
|
|
return ServerResponse.createBySuccess(fileMap);
|
|
|
|
|
|
|
|
// 通过 `ServerResponse` 的静态方法 `createBySuccess` 创建一个表示成功的响应对象,并将包含图片信息的 `Map` 作为参数传入,
|
|
|
|
|
|
|
|
// 这样就构建好了一个包含正确状态(成功)以及相关数据(图片信息)的响应结果,会被自动转换为合适的格式(如JSON)返回给客户端,告知客户端图片上传操作成功以及对应的图片相关信息。
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 产品详情
|
|
|
|
* 产品详情
|
|
|
|
|
|
|
|
* 该方法用于处理获取商品详情的HTTP请求,接收一个商品ID作为参数,通过调用 `productService` 的 `detail` 方法获取指定商品的详细信息,
|
|
|
|
|
|
|
|
* 并将结果(包含商品详情数据,包装在 `ServerResponse` 中,其泛型为 `ProductDetailVo`)返回给客户端,
|
|
|
|
|
|
|
|
* 客户端(后台管理系统的商品详情页面)可以根据返回结果展示商品的详细属性、关联信息等内容,方便管理员查看和管理商品的详细情况。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param productId 要获取详情的商品的唯一标识符,是一个整数类型的参数,通过这个参数可以在业务层从数据库等数据源中查找并获取对应的商品详细信息,
|
|
|
|
|
|
|
|
* 需要确保传入的商品ID是合法有效的,否则可能无法获取到正确的商品详情或者业务层会进行相应的错误处理(比如返回错误提示信息等)。
|
|
|
|
|
|
|
|
* @return 返回一个 `ServerResponse` 对象,其泛型参数为 `ProductDetailVo`,`ProductDetailVo` 通常是一个包含了商品详细属性、关联信息等经过处理后适合展示的数据结构,
|
|
|
|
|
|
|
|
* 这个响应结果会被自动转换为合适的格式(如JSON)返回给客户端,告知客户端商品详情获取操作的成功与否以及对应的商品详情数据情况,方便客户端进行展示和进一步操作。
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
@RequestMapping("detail.do")
|
|
|
|
@RequestMapping("detail.do")
|
|
|
|
public ServerResponse<ProductDetailVo> detail(Integer productId){
|
|
|
|
public ServerResponse<ProductDetailVo> detail(Integer productId) {
|
|
|
|
return productService.detail(productId);
|
|
|
|
return productService.detail(productId);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 产品上下架
|
|
|
|
* 产品上下架
|
|
|
|
|
|
|
|
* 该方法用于处理设置商品上下架状态的HTTP请求,接收商品ID和状态值作为参数,通过调用 `productService` 的 `set_sale_status` 方法来更新商品的销售状态,
|
|
|
|
|
|
|
|
* 并将结果(包含操作的成功与否以及相关提示信息,包装在 `ServerResponse` 中,其泛型为 `String`)返回给客户端,
|
|
|
|
|
|
|
|
* 客户端(后台管理系统的商品管理页面)可以根据返回结果判断操作是否成功,并相应地更新界面上商品的展示状态(上架或下架),方便管理员对商品的销售状态进行管控。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param productId 要设置销售状态的商品的唯一标识符,是一个整数类型的参数,通过这个参数可以在业务层准确找到对应的商品记录进行状态更新操作,
|
|
|
|
|
|
|
|
* 需要确保传入的商品ID是合法有效的,否则可能无法正确更新商品状态或者业务层会进行相应的错误处理(比如返回错误提示信息等)。
|
|
|
|
|
|
|
|
* @param status 商品的销售状态值,是一个整数类型的参数,具体的取值含义(如 `0` 表示下架,`1` 表示上架等)通常由业务层定义,
|
|
|
|
|
|
|
|
* 通过传入这个参数告知业务层要将商品设置为何种销售状态,业务层会根据该值更新数据库等数据源中商品对应的状态信息。
|
|
|
|
|
|
|
|
* @return 返回一个 `ServerResponse` 对象,其泛型参数为 `String`,返回的字符串内容可能包含操作的结果提示信息(如成功提示或失败原因等),
|
|
|
|
|
|
|
|
* 这个响应结果会被自动转换为合适的格式(如JSON)返回给客户端,告知客户端商品销售状态设置操作的成功与否以及相关提示内容,方便客户端进行相应的展示和处理。
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
@RequestMapping("set_sale_status.do")
|
|
|
|
@RequestMapping("set_sale_status.do")
|
|
|
|
public ServerResponse<String> set_sale_status(Integer productId,Integer status){
|
|
|
|
public ServerResponse<String> set_sale_status(Integer productId, Integer status) {
|
|
|
|
return productService.set_sale_status(productId,status);
|
|
|
|
return productService.set_sale_status(productId, status);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 新增OR更新产品
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@RequestMapping("save.do")
|
|
|
|
|
|
|
|
public ServerResponse<String> productSave(Product product){
|
|
|
|
|
|
|
|
return productService.saveOrUpdateProduct(product);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 富文本上传图片
|
|
|
|
|
|
|
|
* 由于这里如果没有管理员权限,需要回复特定形式的信息,所以校验单独放在这里,zuul过滤器对其直接放过
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@RequestMapping("richtext_img_upload.do")
|
|
|
|
|
|
|
|
public Map richtextImgUpload(@RequestParam(value = "upload_file",required = false) MultipartFile file, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
|
|
|
|
|
|
|
|
String loginToken = CookieUtil.readLoginToken(httpServletRequest);
|
|
|
|
|
|
|
|
if(StringUtils.isEmpty(loginToken)){
|
|
|
|
|
|
|
|
throw new SnailmallException("用户未登录,无法获取当前用户信息");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//2.从redis中获取用户信息
|
|
|
|
|
|
|
|
String userStr = commonCacheUtil.getCacheValue(loginToken);
|
|
|
|
|
|
|
|
if(userStr == null){
|
|
|
|
|
|
|
|
throw new SnailmallException("用户未登录,无法获取当前用户信息");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
User user = JsonUtil.Str2Obj(userStr,User.class);
|
|
|
|
|
|
|
|
Map resultMap = Maps.newHashMap();
|
|
|
|
|
|
|
|
if(user == null){
|
|
|
|
|
|
|
|
resultMap.put("success",false);
|
|
|
|
|
|
|
|
resultMap.put("msg","请登录管理员");
|
|
|
|
|
|
|
|
return resultMap;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
String path = httpServletRequest.getSession().getServletContext().getRealPath("upload");
|
|
|
|
|
|
|
|
String targetFileName = fileService.upload(file, path);
|
|
|
|
|
|
|
|
if (StringUtils.isBlank(targetFileName)) {
|
|
|
|
|
|
|
|
resultMap.put("success", false);
|
|
|
|
|
|
|
|
resultMap.put("msg", "上传失败");
|
|
|
|
|
|
|
|
return resultMap;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
String url = PropertiesUtil.getProperty("ftp.server.http.prefix","http://img.oursnail.cn/")+targetFileName;
|
|
|
|
|
|
|
|
resultMap.put("success", true);
|
|
|
|
|
|
|
|
resultMap.put("msg", "上传成功");
|
|
|
|
|
|
|
|
resultMap.put("file_path", url);
|
|
|
|
|
|
|
|
log.info("【返回数据为:{}】",resultMap);
|
|
|
|
|
|
|
|
httpServletResponse.addHeader("Access-Control-Allow-Headers", "X-File-Name");
|
|
|
|
|
|
|
|
return resultMap;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 新增OR更新产品
|
|
|
|
|
|
|
|
* 该方法用于处理新增或更新商品信息的HTTP请求,接收一个 `Product` 类型的对象作为参数,这个对象包含了商品的各种属性信息(如名称、价格、描述等),
|
|
|
|
|
|
|
|
* 通过调用 `productService` 的 `saveOrUpdate
|
|
|
|
|
|
|
|
*/
|