|
|
|
|
|
package com.controller;
|
|
|
|
|
|
import java.io.File;
|
|
|
import java.math.BigDecimal;
|
|
|
import java.net.URL;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import java.util.*;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
import org.springframework.web.context.ContextLoader;
|
|
|
import javax.servlet.ServletContext;
|
|
|
import com.service.TokenService;
|
|
|
import com.utils.*;
|
|
|
import java.lang.reflect.InvocationTargetException;
|
|
|
|
|
|
import com.service.DictionaryService;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import com.annotation.IgnoreAuth;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Controller;
|
|
|
import org.springframework.web.bind.annotation.*;
|
|
|
import com.baomidou.mybatisplus.mapper.EntityWrapper;
|
|
|
import com.baomidou.mybatisplus.mapper.Wrapper;
|
|
|
import com.entity.*;
|
|
|
import com.entity.view.*;
|
|
|
import com.service.*;
|
|
|
import com.utils.PageUtils;
|
|
|
import com.utils.R;
|
|
|
import com.alibaba.fastjson.*;
|
|
|
|
|
|
/**
|
|
|
* 房间信息
|
|
|
* 后端接口
|
|
|
* @author [作者姓名,此处未给出具体值]
|
|
|
* @email [作者邮箱,此处未给出具体值]
|
|
|
*/
|
|
|
@RestController // 表明这个类是一个基于RESTful风格的控制器,返回的数据会直接以JSON等格式响应给客户端,无需额外配置视图解析器等
|
|
|
@Controller // 标识这是一个Spring MVC的控制器类
|
|
|
@RequestMapping("/fangjian") // 定义该控制器类的基础请求路径,所有该类下的接口路径都以此为前缀
|
|
|
public class FangjianController {
|
|
|
|
|
|
// 创建一个日志记录器对象,用于记录该类中的相关操作日志,方便调试和问题排查
|
|
|
private static final Logger logger = LoggerFactory.getLogger(FangjianController.class);
|
|
|
|
|
|
// 自动注入FangjianService,用于处理与房间相关的业务逻辑,比如查询、保存、更新等操作
|
|
|
@Autowired
|
|
|
private FangjianService fangjianService;
|
|
|
|
|
|
// 自动注入TokenService,可能用于处理用户认证相关的令牌操作,具体功能需看该服务的实现
|
|
|
@Autowired
|
|
|
private TokenService tokenService;
|
|
|
|
|
|
// 自动注入DictionaryService,大概率用于对字典表数据进行转换等相关操作,比如将某些字段值转换为更友好的展示形式
|
|
|
@Autowired
|
|
|
private DictionaryService dictionaryService;
|
|
|
|
|
|
// 自动注入YonghuService,可能是与用户相关的服务,也许用于处理房间信息和用户信息之间的关联等级联操作(从名字推测,“Yonghu”可能表示“用户”)
|
|
|
@Autowired
|
|
|
private YonghuService yonghuService;
|
|
|
|
|
|
/**
|
|
|
* 后端列表
|
|
|
* 用于获取房间信息列表,支持分页、排序以及根据用户角色添加特定查询条件等功能
|
|
|
*
|
|
|
* @param params 包含查询参数的Map,例如分页参数、排序字段、筛选条件等
|
|
|
* @param request HttpServletRequest对象,用于获取会话中的用户相关信息等
|
|
|
* @return 返回一个R类型的对象,包含操作结果信息以及查询到的房间信息列表数据(封装在PageUtils中)
|
|
|
*/
|
|
|
@RequestMapping("/page")
|
|
|
public R page(@RequestParam Map<String, Object> params, HttpServletRequest request) {
|
|
|
// 记录page方法的调试日志,输出控制器类名和传入的查询参数信息(将参数转换为JSON字符串格式记录)
|
|
|
logger.debug("page方法:,,Controller:{},,params:{}", this.getClass().getName(), JSONObject.toJSONString(params));
|
|
|
// 从会话中获取用户角色信息,并转换为字符串类型
|
|
|
String role = String.valueOf(request.getSession().getAttribute("role"));
|
|
|
// 此处条件永远为假,应该是预留的一个逻辑分支,暂时不会进入该分支执行
|
|
|
if (false)
|
|
|
return R.error(511, "永不会进入");
|
|
|
// 如果用户角色是“用户”,则在查询参数中添加当前用户的ID,可能用于筛选该用户相关的房间信息
|
|
|
else if ("用户".equals(role))
|
|
|
params.put("yonghuId", request.getSession().getAttribute("userId"));
|
|
|
// 如果没有指定排序字段,则默认按照“id”字段进行排序
|
|
|
if (params.get("orderBy") == null || params.get("orderBy") == "") {
|
|
|
params.put("orderBy", "id");
|
|
|
}
|
|
|
// 调用FangjianService的queryPage方法,根据传入的参数查询房间信息列表,并返回分页结果(封装在PageUtils对象中)
|
|
|
PageUtils page = fangjianService.queryPage(params);
|
|
|
|
|
|
// 获取分页结果中的房间信息列表(转换为FangjianView类型的列表),准备进行字典表数据转换操作
|
|
|
List<FangjianView> list = (List<FangjianView>) page.getList();
|
|
|
// 遍历房间信息列表,对每个房间信息对象进行字典表数据转换操作
|
|
|
for (FangjianView c : list) {
|
|
|
// 调用DictionaryService的dictionaryConvert方法,根据请求信息对房间信息对象中的相关字段进行字典表数据转换
|
|
|
dictionaryService.dictionaryConvert(c, request);
|
|
|
}
|
|
|
// 返回操作成功的结果信息,并将包含转换后数据的分页结果放入返回数据中
|
|
|
return R.ok().put("data", page);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 后端详情
|
|
|
* 根据传入的房间ID获取具体的房间详细信息,包括将实体对象转换为视图对象以及字典表数据转换等操作
|
|
|
*
|
|
|
* @param id 要查询的房间ID
|
|
|
* @param request HttpServletRequest对象,用于获取会话信息等,可能在字典表数据转换中会用到
|
|
|
* @return 返回一个R类型的对象,包含操作结果信息以及查询到的房间详细信息(封装在FangjianView对象中)
|
|
|
*/
|
|
|
@RequestMapping("/info/{id}")
|
|
|
public R info(@PathVariable("id") Long id, HttpServletRequest request) {
|
|
|
// 记录info方法的调试日志,输出控制器类名和要查询的房间ID信息
|
|
|
logger.debug("info方法:,,Controller:{},,id:{}", this.getClass().getName(), id);
|
|
|
// 调用FangjianService的selectById方法,根据传入的ID查询房间实体信息
|
|
|
FangjianEntity fangjian = fangjianService.selectById(id);
|
|
|
// 如果查询到了房间实体信息
|
|
|
if (fangjian!= null) {
|
|
|
// 创建一个FangjianView对象,用于存放转换后的房间信息,以便返回给前端展示更合适的数据格式
|
|
|
FangjianView view = new FangjianView();
|
|
|
// 使用Spring的BeanUtils工具类,将房间实体对象中的属性值复制到视图对象中,实现对象属性的转换
|
|
|
BeanUtils.copyProperties(fangjian, view);
|
|
|
|
|
|
// 调用DictionaryService的dictionaryConvert方法,对视图对象中的相关字段进行字典表数据转换,使其展示更友好的格式
|
|
|
dictionaryService.dictionaryConvert(view, request);
|
|
|
// 返回操作成功的结果信息,并将包含转换后数据的视图对象放入返回数据中
|
|
|
return R.ok().put("data", view);
|
|
|
} else {
|
|
|
// 如果没有查询到对应的房间信息,则返回错误结果信息,提示“查不到数据”
|
|
|
return R.error(511, "查不到数据");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 后端保存
|
|
|
* 用于保存新的房间信息到数据库,在保存前会先检查是否已有相同数据存在
|
|
|
*
|
|
|
* @param fangjian 包含房间信息的FangjianEntity对象,通过请求体传入(@RequestBody注解表示接收JSON格式的请求体数据并转换为对应的Java对象)
|
|
|
* @param request HttpServletRequest对象,用于获取会话中的用户角色等信息,此处暂未看到具体使用场景,但可能后续会扩展相关逻辑
|
|
|
* @return 返回一个R类型的对象,保存成功返回操作成功信息,若已有相同数据则返回错误信息提示“表中有相同数据”
|
|
|
*/
|
|
|
@RequestMapping("/save")
|
|
|
public R save(@RequestBody FangjianEntity fangjian, HttpServletRequest request) {
|
|
|
// 记录save方法的调试日志,输出控制器类名和要保存的房间信息对象的字符串表示(调用toString方法)
|
|
|
logger.debug("save方法:,,Controller:{},,fangjian:{}", this.getClass().getName(), fangjian.toString());
|
|
|
|
|
|
// 从会话中获取用户角色信息,并转换为字符串类型
|
|
|
String role = String.valueOf(request.getSession().getAttribute("role"));
|
|
|
// 此处条件永远为假,应该是预留的一个逻辑分支,暂时不会进入该分支执行
|
|
|
if (false)
|
|
|
return R.error(511, "永远不会进入");
|
|
|
|
|
|
// 创建一个EntityWrapper对象,用于构建数据库查询条件,此处构建了一系列基于房间信息各个字段的相等条件,用于查询是否已存在相同数据的记录
|
|
|
Wrapper<FangjianEntity> queryWrapper = new EntityWrapper<FangjianEntity>()
|
|
|
.eq("fangjian_name", fangjian.getFangjianName())
|
|
|
.eq("fangjian_tese", fangjian.getFangjianTese())
|
|
|
.eq("fangjian_peizhi", fangjian.getFangjianPeizhi())
|
|
|
.eq("fangjian_shangpin", fangjian.getFangjianShangpin())
|
|
|
.eq("fangjian_fuwu", fangjian.getFangjianFuwu())
|
|
|
.eq("fangjian_types", fangjian.getFangjianTypes())
|
|
|
.eq("fangjian_number", fangjian.getFangjianNumber())
|
|
|
.eq("fangjian_clicknum", fangjian.getFangjianClicknum());
|
|
|
|
|
|
// 记录构建的查询条件对应的SQL语句片段,方便调试查看查询条件是否正确
|
|
|
logger.info("sql语句:" + queryWrapper.getSqlSegment());
|
|
|
// 调用FangjianService的selectOne方法,根据构建的查询条件查询是否已存在相同数据的房间记录
|
|
|
FangjianEntity fangjianEntity = fangjianService.selectOne(queryWrapper);
|
|
|
// 如果不存在相同数据的记录
|
|
|
if (fangjianEntity == null) {
|
|
|
// 设置房间的点击次数初始值为1
|
|
|
fangjian.setFangjianClicknum(1);
|
|
|
// 设置房间的创建时间为当前时间
|
|
|
fangjian.setCreateTime(new Date());
|
|
|
// 调用FangjianService的insert方法,将房间信息保存到数据库中
|
|
|
fangjianService.insert(fangjian);
|
|
|
// 返回操作成功的结果信息
|
|
|
return R.ok();
|
|
|
} else {
|
|
|
// 如果已存在相同数据的记录,则返回错误结果信息,提示“表中有相同数据”
|
|
|
return R.error(511, "表中有相同数据");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 后端修改
|
|
|
* 用于更新已存在的房间信息,更新前会检查是否存在除自身外相同数据的记录,并可处理房间图片相关字段为空的情况
|
|
|
*
|
|
|
* @param fangjian 包含更新后的房间信息的FangjianEntity对象,通过请求体传入
|
|
|
* @param request HttpServletRequest对象,用于获取会话信息等,此处暂未看到具体使用场景,但可能后续会扩展相关逻辑
|
|
|
* @return 返回一个R类型的对象,更新成功返回操作成功信息,若存在相同数据则返回错误信息提示“表中有相同数据”
|
|
|
*/
|
|
|
@RequestMapping("/update")
|
|
|
public R update(@RequestBody FangjianEntity fangjian, HttpServletRequest request) {
|
|
|
// 记录update方法的调试日志,输出控制器类名和要更新的房间信息对象的字符串表示
|
|
|
logger.debug("update方法:,,Controller:{},,fangjian:{}", this.getClass().getName(), fangjian.toString());
|
|
|
|
|
|
// 从会话中获取用户角色信息,并转换为字符串类型
|
|
|
String role = String.valueOf(request.getSession().getAttribute("role"));
|
|
|
//if (false)
|
|
|
//return R.error(511, "永远不会进入");
|
|
|
|
|
|
// 创建一个EntityWrapper对象,用于构建数据库查询条件,此处构建了一系列基于房间信息各个字段的相等条件,同时排除自身(通过notIn条件排除传入的房间ID),用于查询是否已存在相同数据的其他记录
|
|
|
Wrapper<FangjianEntity> queryWrapper = new EntityWrapper<FangjianEntity>()
|
|
|
.notIn("id", fangjian.getId())
|
|
|
.andNew()
|
|
|
.eq("fangjian_name", fangjian.getFangjianName())
|
|
|
.eq("fangjian_tese", fangjian.getFangjianTese())
|
|
|
.eq("fangjian_peizhi", fangjian.getFangjianPeizhi())
|
|
|
.eq("fangjian_shangpin", fangjian.getFangjianShangpin())
|
|
|
.eq("fangjian_fuwu", fangjian.getFangjianFuwu())
|
|
|
.eq("fangjian_types", fangjian.getFangjianTypes())
|
|
|
.eq("fangjian_number", fangjian.getFangjianNumber())
|
|
|
.eq("fangjian_clicknum", fangjian.getFangjianClicknum());
|
|
|
|
|
|
// 记录构建的查询条件对应的SQL语句片段,方便调试查看查询条件是否正确
|
|
|
logger.info("sql语句:" + queryWrapper.getSqlSegment());
|
|
|
// 调用FangjianService的selectOne方法,根据构建的查询条件查询是否已存在相同数据的其他房间记录
|
|
|
FangjianEntity fangjianEntity = fangjianService.selectOne(queryWrapper);
|
|
|
// 如果房间图片相关字段为空字符串或“null”字符串,则将房间图片字段设置为null,可能是为了在数据库中正确处理空值情况
|
|
|
if ("".equals(fangjian.getFangjianPhoto()) || "null".equals(fangjian.getFangjianPhoto())) {
|
|
|
fangjian.setFangjianPhoto(null);
|
|
|
}
|
|
|
// 如果不存在相同数据的其他记录
|
|
|
if (fangjianEntity == null) {
|
|
|
// 调用FangjianService的updateById方法,根据传入的房间信息对象的ID更新对应的房间信息到数据库中
|
|
|
fangjianService.updateById(fangjian);
|
|
|
// 返回操作成功的结果信息
|
|
|
return R.ok();
|
|
|
} else {
|
|
|
// 如果存在相同数据的其他记录,则返回错误结果信息,提示“表中有相同数据”
|
|
|
return R.error(511, "表中有相同数据");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 删除
|
|
|
* 根据传入的房间ID数组,批量删除对应的房间信息记录
|
|
|
*
|
|
|
* @param ids 包含要删除的房间ID的整数数组,通过请求体传入
|
|
|
* @return 返回一个R类型的对象,表示操作结果信息,删除成功返回操作成功信息
|
|
|
*/
|
|
|
@RequestMapping("/delete")
|
|
|
public R delete(@RequestBody Integer[] ids) {
|
|
|
// 记录delete方法的调试日志,输出控制器类名和要删除的房间ID数组的字符串表示
|
|
|
logger.debug("delete:,,Controller:{},,ids:{}", this.getClass().getName(), ids.toString());
|
|
|
// 调用FangjianService的deleteBatchIds方法,传入要删除的房间ID列表,批量删除对应的房间信息记录
|
|
|
fangjianService.deleteBatchIds(Arrays.asList(ids));
|
|
|
// 返回操作成功的结果信息
|
|
|
return R.ok();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 批量上传
|
|
|
* 用于从指定的Excel文件(仅支持后缀为.xls的文件)中读取房间信息数据,并批量插入到数据库中,同时会进行一些数据格式校验和异常处理
|
|
|
*
|
|
|
* @param fileName 要上传的文件名,从请求参数中获取
|
|
|
* @param request HttpServletRequest对象,用于获取当前用户的ID等信息,可能用于关联插入的房间信息与用户信息
|
|
|
* @return 返回一个R类型的对象,表示操作结果信息,成功返回操作成功信息,若出现异常则返回相应的错误提示信息
|
|
|
*/
|
|
|
@RequestMapping("/batchInsert")
|
|
|
public R save(String fileName, HttpServletRequest request) {
|
|
|
// 记录batchInsert方法的调试日志,输出控制器类名和要上传的文件名信息
|
|
|
logger.debug("batchInsert方法:,,Controller:{},,fileName:{}", this.getClass().getName(), fileName);
|
|
|
// 从会话中获取当前用户的ID,并转换为整数类型(先将获取到的属性值转换为字符串,再转换为整数)
|
|
|
Integer yonghuId = Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")));
|
|
|
// 创建一个SimpleDateFormat对象,用于格式化日期,此处指定日期格式为“yyyy-MM-dd HH:mm:ss”
|
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
try {
|
|
|
// 创建一个FangjianEntity类型的列表,用于存放从Excel文件中读取并解析后的房间信息对象,准备批量插入到数据库中
|
|
|
List<FangjianEntity> fangjianList = new ArrayList<>();
|
|
|
// 创建一个Map对象,用于存放要查询是否重复的字段信息(具体使用方式需看后续代码逻辑,此处从变量名推测是这个用途)
|
|
|
Map<String, List<String>> seachFields = new HashMap<>();
|
|
|
// 获取当前系统时间,可能用于设置房间信息的创建时间等字段(虽然当前代码中未看到完整使用场景)
|
|
|
Date date = new Date();
|
|
|
// 获取文件名中最后一个点(.)的索引位置,用于判断文件后缀
|
|
|
int lastIndexOf = fileName.lastIndexOf(".");
|
|
|
// 如果文件名中没有点,即没有后缀
|
|
|
if (lastIndexOf == -1) {
|
|
|
// 返回错误结果信息,提示“该文件没有后缀”
|
|
|
return R.error(511, "该文件没有后缀");
|
|
|
} else {
|
|
|
// 获取文件名的后缀部分(从最后一个点开始截取后面的字符串)
|
|
|
String suffix = fileName.substring(lastIndexOf);
|
|
|
// 如果后缀不是“.xls”,说明文件格式不符合要求
|
|
|
if (!".xls".equals(suffix)) {
|
|
|
// 返回错误结果信息,提示“只支持后缀为xls的excel文件”
|
|
|
return R.error(511, "只支持后缀为xls的excel文件");
|
|
|
} else {
|
|
|
// 通过类加载器获取指定文件名对应的文件资源路径,并转换为URL对象
|
|
|
URL resource = this.getClass().getClassLoader().getResource("static/upload/" + fileName);
|
|
|
// 创建一个File对象,参数是通过resource.getFile()获取的文件路径,这里可能是用于后续判断文件是否存在等操作
|
|
|
File file = new File(resource.getFile());
|
|
|
if (!file.exists()) {
|
|
|
// 如果文件不存在,返回一个错误信息给前端,错误码是511,提示找不到上传文件,并告知联系管理员
|
|
|
return R.error(511, "找不到上传文件,请联系管理员");
|
|
|
} else {
|
|
|
// 通过PoiUtil工具类的poiImport方法读取指定路径的xls文件,将读取到的数据存放在List<List<String>>类型的dataList中
|
|
|
List<List<String>> dataList = PoiUtil.poiImport(file.getPath());
|
|
|
// 删除dataList中的第一行数据,因为第一行可能是提示信息之类的,在后续处理中不需要
|
|
|
dataList.remove(0);
|
|
|
for (List<String> data : dataList) {
|
|
|
// 循环处理dataList中每一行的数据(每一行数据也是一个List<String>)
|
|
|
FangjianEntity fangjianEntity = new FangjianEntity();
|
|
|
// 以下这几行代码原本是用于设置FangjianEntity对象的各个属性值,但目前都是设置为固定值或者取了错误的数据索引(都取的data.get(0)),后续应该根据实际需求修改正确的获取数据的索引和赋值逻辑
|
|
|
// 设置房间名称,此处应该根据实际表格数据的对应列索引来获取正确的值,当前写法有误(都取的data.get(0)),要改的
|
|
|
fangjianEntity.setFangjianName(data.get(0));
|
|
|
// 设置房间图片,暂时设置为空字符串,可能后续需要完善获取图片的逻辑,比如从文件中读取或者根据路径获取等,详情和图片相关
|
|
|
fangjianEntity.setFangjianPhoto("");
|
|
|
// 设置房间特色,同样这里取值有误(取的data.get(0)),应该按实际情况修改获取对应列数据的索引,要改的
|
|
|
fangjianEntity.setFangjianTese(data.get(0));
|
|
|
// 设置房间配置,取值也存在问题(取的data.get(0)),需按正确的表格列索引来获取对应数据,要改的
|
|
|
fangjianEntity.setFangjianPeizhi(data.get(0));
|
|
|
// 设置提供的商品,此处也是错误的取值方式(取的data.get(0)),需要改成对应正确的数据获取逻辑,要改的
|
|
|
fangjianEntity.setFangjianShangpin(data.get(0));
|
|
|
// 设置提供的服务,同样是取值错误(取的data.get(0)),后续要根据实际情况修改,要改的
|
|
|
fangjianEntity.setFangjianFuwu(data.get(0));
|
|
|
// 设置价格(天),错误的取值(取的data.get(0)),要按照实际价格所在的表格列来获取数据,要改的
|
|
|
fangjianEntity.setFangjianMoney(data.get(0));
|
|
|
// 设置房间类型,将表格中对应列的数据转换为Integer类型并设置,但当前取值有误(取的data.get(0)),要修改为正确的索引获取数据,要改的
|
|
|
fangjianEntity.setFangjianTypes(Integer.valueOf(data.get(0)));
|
|
|
// 设置房间剩余数量,把表格对应列数据转成Integer后设置,不过当前取值不对(取的data.get(0)),需改成正确的索引获取,要改的
|
|
|
fangjianEntity.setFangjianNumber(Integer.valueOf(data.get(0)));
|
|
|
// 设置点击次数,将表格对应列数据转为Integer后设置,目前取值错误(取的data.get(0)),要按正确的方式获取数据,要改的
|
|
|
fangjianEntity.setFangjianClicknum(Integer.valueOf(data.get(0)));
|
|
|
// 设置房间详情,暂时设置为空字符串,详情和图片相关,可能后续要完善获取详情内容的逻辑
|
|
|
fangjianEntity.setFangjianContent("");
|
|
|
// 设置创建时间,这里假设date变量在外部已经正确初始化,用于记录该房间数据的创建时间
|
|
|
fangjianEntity.setCreateTime(date);
|
|
|
fangjianList.add(fangjianEntity);
|
|
|
|
|
|
// 把要查询是否重复的字段放入map中(代码中此处未看到具体放入map的实现逻辑,可能后续要补充完整)
|
|
|
|
|
|
}
|
|
|
|
|
|
// 调用fangjianService的insertBatch方法批量插入fangjianList中的房间数据到数据库中
|
|
|
fangjianService.insertBatch(fangjianList);
|
|
|
// 如果批量插入成功,返回成功的响应给前端
|
|
|
return R.ok();
|
|
|
}
|
|
|
} catch(Exception e){
|
|
|
// 如果在上述操作过程中出现异常,打印异常堆栈信息方便排查问题
|
|
|
e.printStackTrace();
|
|
|
// 返回一个错误信息给前端,错误码是511,提示批量插入数据异常,并告知联系管理员
|
|
|
return R.error(511, "批量插入数据异常,请联系管理员");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 前端列表
|
|
|
*/
|
|
|
// 前端列表相关的方法,被标注了 @IgnoreAuth 表示这个方法不需要进行权限认证,通过@RequestMapping("/list")指定了该方法处理的请求路径为 /list
|
|
|
@IgnoreAuth
|
|
|
@RequestMapping("/list")
|
|
|
public R list (@RequestParam Map < String, Object > params, HttpServletRequest request){
|
|
|
// 使用日志记录器记录debug级别的日志信息,记录当前执行的list方法所在的类名以及传入的参数信息(将参数转为JSON字符串格式记录)
|
|
|
logger.debug("list方法:,,Controller:{},,params:{}", this.getClass().getName(), JSONObject.toJSONString(params));
|
|
|
|
|
|
// 判断传入的参数中是否指定了排序字段,如果没有指定(即获取到的orderBy参数为空字符串)
|
|
|
if (StringUtil.isEmpty(String.valueOf(params.get("orderBy")))) {
|
|
|
// 就默认按照id字段倒序排序,将orderBy参数设置为id
|
|
|
params.put("orderBy", "id");
|
|
|
}
|
|
|
// 调用fangjianService的queryPage方法,根据传入的参数查询并获取分页数据,存放在PageUtils对象中
|
|
|
PageUtils page = fangjianService.queryPage(params);
|
|
|
|
|
|
// 获取分页数据中的数据列表,这里强制转换为List<FangjianView>类型,假设这个列表中的数据是需要展示在前端的房间相关视图数据
|
|
|
List<FangjianView> list = (List<FangjianView>) page.getList();
|
|
|
for (FangjianView c : list)
|
|
|
// 循环调用dictionaryService的dictionaryConvert方法,用于对每个FangjianView对象中的对应字典表字段进行转换(可能是将字典表中的编码转换为对应的文字描述等操作),传入当前的HttpServletRequest对象可能是用于获取一些上下文相关信息等
|
|
|
dictionaryService.dictionaryConvert(c, request);
|
|
|
// 返回成功的响应给前端,并将包含处理好的分页数据的PageUtils对象放入响应中,前端可以根据此数据进行展示等操作
|
|
|
return R.ok().put("data", page);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 前端详情
|
|
|
*/
|
|
|
// 前端详情相关的方法,通过@RequestMapping("/detail/{id}")指定了该方法处理的请求路径为 /detail/{id},其中{id}是一个路径变量,表示要查询详情的房间的唯一标识
|
|
|
@RequestMapping("/detail/{id}")
|
|
|
public R detail (@PathVariable("id") Long id, HttpServletRequest request){
|
|
|
// 使用日志记录器记录debug级别的日志信息,记录当前执行的detail方法所在的类名以及传入的房间id参数
|
|
|
logger.debug("detail方法:,,Controller:{},,id:{}", this.getClass().getName(), id);
|
|
|
// 调用fangjianService的selectById方法,根据传入的房间id从数据库中查询对应的FangjianEntity对象(代表房间实体数据)
|
|
|
FangjianEntity fangjian = fangjianService.selectById(id);
|
|
|
if (fangjian != null) {
|
|
|
// 如果查询到了对应的房间数据,将该房间的点击次数加1,用于记录该房间被查看的次数统计
|
|
|
fangjian.setFangjianClicknum(fangjian.getFangjianClicknum() + 1);
|
|
|
// 调用fangjianService的updateById方法,将更新后的房间数据(点击次数已加1)更新到数据库中
|
|
|
fangjianService.updateById(fangjian);
|
|
|
|
|
|
// 创建一个FangjianView对象,用于将从数据库查询到的FangjianEntity实体数据转换为适合前端展示的视图数据格式
|
|
|
FangjianView view = new FangjianView();
|
|
|
// 使用BeanUtils工具类的copyProperties方法,将fangjian对象的属性值复制到view对象中,实现实体数据到视图数据的转换(前提是FangjianEntity和FangjianView的属性有对应关系)
|
|
|
BeanUtils.copyProperties(fangjian, view);
|
|
|
|
|
|
// 调用dictionaryService的dictionaryConvert方法,对转换后的FangjianView对象中的对应字典表字段进行转换(类似前面list方法中的转换操作),传入当前的HttpServletRequest对象用于获取上下文相关信息等
|
|
|
dictionaryService.dictionaryConvert(view, request);
|
|
|
// 返回成功的响应给前端,并将包含处理好的房间详情视图数据的FangjianView对象放入响应中,前端可以据此展示房间详情信息
|
|
|
return R.ok().put("data", view);
|
|
|
} else {
|
|
|
// 如果根据传入的id没有查询到对应的房间数据,返回一个错误信息给前端,错误码是511,提示查不到数据
|
|
|
return R.error(511, "查不到数据");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 前端保存
|
|
|
*/
|
|
|
// 前端保存相关的方法,通过@RequestMapping("/add")指定了该方法处理的请求路径为 /add,并且使用@RequestBody注解表示接收前端传来的JSON格式的请求体数据,并将其转换为FangjianEntity对象
|
|
|
@RequestMapping("/add")
|
|
|
public R add (@RequestBody FangjianEntity fangjian, HttpServletRequest request){
|
|
|
// 使用日志记录器记录debug级别的日志信息,记录当前执行的add方法所在的类名以及传入的FangjianEntity对象信息(将对象转为字符串格式记录)
|
|
|
logger.debug("add方法:,,Controller:{},,fangjian:{}", this.getClass().getName(), fangjian.toString());
|
|
|
// 创建一个EntityWrapper对象,用于构建数据库查询的条件,这里根据FangjianEntity对象的多个属性(房间名称、特色、配置等)来构建相等条件的查询语句,用于查询数据库中是否已经存在相同数据的记录
|
|
|
Wrapper<FangjianEntity> queryWrapper = new EntityWrapper<FangjianEntity>()
|
|
|
.eq("fangjian_name", fangjian.getFangjianName())
|
|
|
.eq("fangjian_tese", fangjian.getFangjianTese())
|
|
|
.eq("fangjian_peizhi", fangjian.getFangjianPeizhi())
|
|
|
.eq("fangjian_shangpin", fangjian.getFangjianShangpin())
|
|
|
.eq("fangjian_fuwu", fangjian.getFangjianFuwu())
|
|
|
.eq("fangjian_types", fangjian.getFangjianTypes())
|
|
|
.eq("fangjian_number", fangjian.getFangjianNumber())
|
|
|
.eq("fangjian_clicknum", fangjian.getFangjianClicknum());
|
|
|
// 记录构建好的查询语句对应的SQL片段信息,方便调试查看具体的查询条件
|
|
|
logger.info("sql语句:" + queryWrapper.getSqlSegment());
|
|
|
// 调用fangjianService的selectOne方法,根据构建好的查询条件从数据库中查询是否存在满足条件的FangjianEntity对象(即是否存在相同数据的记录)
|
|
|
FangjianEntity fangjianEntity = fangjianService.selectOne(queryWrapper);
|
|
|
if (fangjianEntity == null) {
|
|
|
// 如果查询结果为null,表示数据库中不存在相同数据的记录,设置当前要保存的FangjianEntity对象的创建时间为当前系统时间(new Date()获取当前时间)
|
|
|
fangjian.setCreateTime(new Date());
|
|
|
// 调用fangjianService的insert方法,将当前的FangjianEntity对象插入到数据库中
|
|
|
fangjianService.insert(fangjian);
|
|
|
// 如果插入成功,返回成功的响应给前端
|
|
|
return R.ok();
|
|
|
} else {
|
|
|
// 如果查询到了相同数据的记录,返回一个错误信息给前端,错误码是511,提示表中有相同数据
|
|
|
return R.error(511, "表中有相同数据");
|
|
|
}
|
|
|
}
|
|
|
} |